ZGlmZiAtLWdpdCBhLy5naXRodWIvUFVMTF9SRVFVRVNUX1RFTVBMQVRFLm1kIGIvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlODBkOAotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvUFVMTF9SRVFVRVNUX1RFTVBMQVRFLm1kCkBAIC0wLDAgKzEsOSBAQAorIyMgQ1B5dGhvbiBNaXJyb3IKKworaHR0cHM6Ly9naXRodWIuY29tL3B5dGhvbi9jcHl0aG9uIGlzIGEgY3B5dGhvbiBtaXJyb3IgcmVwb3NpdG9yeS4gUHVsbCByZXF1ZXN0cworYXJlIG5vdCBhY2NlcHRlZCBvbiB0aGlzIHJlcG8gYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseSBjbG9zZWQuCisKKyMjIyBTdWJtaXQgcGF0Y2hlcyBhdCBodHRwczovL2J1Z3MucHl0aG9uLm9yZworCitGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBjb250cmlidXRpbmcgdG8gQ1B5dGhvbiwgc2VlIHRoZQorW2RldmVsb3BlcidzIGd1aWRlXShodHRwczovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS8jY29udHJpYnV0aW5nKS4KZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGQyNjdkMTUuLjY5ZjdhYzAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMjEsNyArMjEsNiBAQAogTGliL2Rpc3R1dGlscy9jb21tYW5kLyoucGRiCiBMaWIvbGliMnRvMy8qLnBpY2tsZQogTGliL3Rlc3QvZGF0YS8qCi1MaWIvX3N5c2NvbmZpZ2RhdGEucHkKIExpYi9wbGF0LW1hYy9lcnJvcnMucnNyYy5kZi5yc3JjCiBNYWtlZmlsZQogTWFrZWZpbGUucHJlCkBAIC03Myw2ICs3Miw3IEBACiBpcGNoLwogbGlicHl0aG9uKi5hCiBsaWJweXRob24qLnNvKgorbGlicHl0aG9uKi5keWxpYgogcGxhdGZvcm0KIHB5YnVpbGRkaXIudHh0CiBweWNvbmZpZy5oCmRpZmYgLS1naXQgYS8uaGdpZ25vcmUgYi8uaGdpZ25vcmUKaW5kZXggY2Y5NDUzYS4uYTNmZmNmNCAxMDA2NDQKLS0tIGEvLmhnaWdub3JlCisrKyBiLy5oZ2lnbm9yZQpAQCAtMiw2ICsyLDcgQEAKIC5wdXJpZnkKIC5zdm4vCiBeLmlkZWEvCiteLnZzY29kZS8KIC5EU19TdG9yZQogTWFrZWZpbGUkCiBNYWtlZmlsZS5wcmUkCkBAIC00Myw2ICs0NCw3IEBACiBzeW50YXg6IGdsb2IKIGxpYnB5dGhvbiouYQogbGlicHl0aG9uKi5zbyoKK2xpYnB5dGhvbiouZHlsaWIKICouc3dwCiAqLm8KICoucHljCmRpZmYgLS1naXQgYS8uaGd0YWdzIGIvLmhndGFncwppbmRleCBlZDRmYzkyLi4xNzY5MDJjIDEwMDY0NAotLS0gYS8uaGd0YWdzCisrKyBiLy5oZ3RhZ3MKQEAgLTE0OCw2ICsxNDgsNyBAQAogNzM3ZWZjYWRmNWE2NzhiMTg0ZTBmYTQzMWFhZTExMjc2YmYwNjY0OCB2My40LjQKIDM2MzFiYjRhMjQ5MDI5MmViZjgxZDNlOTQ3YWUzNmRhMTQ1ZGE1NjQgdjMuNC41cmMxCiA2MTliNjFlNTA1ZDBlMmNjYzg1MTZiMzY2ZTRkZGQxOTcxYjQ2YTZmIHYzLjQuNQorMzYzMWJiNGEyNDkwMjkyZWJmODFkM2U5NDdhZTM2ZGExNDVkYTU2NCB2My40LjVyYzEKIDVkNGI2YTU3ZDVmZDc1NjRiZjczZjNkYjBlNDZmZTVlZWIwMGJjZDggdjMuNS4wYTEKIDAzMzdiZDdlYmNiNjU1OWQ2OTY3OWJjNzAyNTA1OWFkMWNlNGY0MzIgdjMuNS4wYTIKIDgyNjU2ZTI4YjVlNWM0YWU0OGQ4ZGQ4YjVmMGQ3OTY4OTA4YTgyYjYgdjMuNS4wYTMKQEAgLTE2NSwzICsxNjYsNyBAQAogMzdhMDdjZWU1OTY5ZTZkMzY3MjU4MzE4N2E3M2NmNjM2ZmYyOGUxYiB2My41LjEKIDY4ZmVlYzY0ODhiMjYzMjdhODVhNjM0NjA1ZGQyOGVjYTRkYWE1ZjEgdjMuNS4ycmMxCiA0ZGVmMmEyOTAxYTU2MThlYTQ1YmNjOGYyYTE0MTFlZjMzYWYxOGFkIHYzLjUuMgorNTg5NmRhMzcyZmIwNDRlMzg1OTVmYjc0NDk1ZGUxZTFlN2M4ZmIzYyB2My42LjBhMQorMzc4ODkzNDIzNTUyMjNlMmZjMTQzOGRlM2RjN2ZmY2Q2MjVjNjBmNyB2My42LjBhMgorZjNlZGYxM2RjMzM5Yjg5NDJhZTZiMzA5NzcxYWIxOTdkZDhjZTZmYSB2My42LjBhMworMDE3Y2YyNjA5MzZiNDQ0Nzg4YzliNjcxZDE5NWI3YmZkODNkYmQyNSB2My42LjBhNApkaWZmIC0tZ2l0IGEvRG9jL01ha2VmaWxlIGIvRG9jL01ha2VmaWxlCmluZGV4IDg3ODY4NWQuLjIwMmU4ZTEgMTAwNjQ0Ci0tLSBhL0RvYy9NYWtlZmlsZQorKysgYi9Eb2MvTWFrZWZpbGUKQEAgLTE1Myw3ICsxNTMsNyBAQAogCWNwIC1wUFIgYnVpbGQvZXB1Yi9QeXRob24uZXB1YiBkaXN0L3B5dGhvbi0kKERJU1RWRVJTSU9OKS1kb2NzLmVwdWIKIAogY2hlY2s6Ci0JJChQWVRIT04pIHRvb2xzL3JzdGxpbnQucHkgLWkgdG9vbHMKKwkkKFBZVEhPTikgdG9vbHMvcnN0bGludC5weSAtaSB0b29scyAtaSB2ZW52CiAKIHNlcnZlOgogCS4uL1Rvb2xzL3NjcmlwdHMvc2VydmUucHkgYnVpbGQvaHRtbApkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2FyZy5yc3QgYi9Eb2MvYy1hcGkvYXJnLnJzdAppbmRleCBkNWU0NzAzLi41Njk5MDNmIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvYXJnLnJzdAorKysgYi9Eb2MvYy1hcGkvYXJnLnJzdApAQCAtMjIzLDggKzIyMyw3IEBACiAgICA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCB3aWxsIHVzZSB0aGlzIGxvY2F0aW9uIGFzIHRoZSBidWZmZXIgYW5kIGludGVycHJldCB0aGUKICAgIGluaXRpYWwgdmFsdWUgb2YgKlwqYnVmZmVyX2xlbmd0aCogYXMgdGhlIGJ1ZmZlciBzaXplLiAgSXQgd2lsbCB0aGVuIGNvcHkgdGhlCiAgICBlbmNvZGVkIGRhdGEgaW50byB0aGUgYnVmZmVyIGFuZCBOVUwtdGVybWluYXRlIGl0LiAgSWYgdGhlIGJ1ZmZlciBpcyBub3QgbGFyZ2UKLSAgIGVub3VnaCwgYSA6ZXhjOmBUeXBlRXJyb3JgIHdpbGwgYmUgc2V0LgotICAgTm90ZTogc3RhcnRpbmcgZnJvbSBQeXRob24gMy42IGEgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSBzZXQuCisgICBlbm91Z2gsIGEgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSBzZXQuCiAKICAgIEluIGJvdGggY2FzZXMsICpcKmJ1ZmZlcl9sZW5ndGgqIGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBlbmNvZGVkIGRhdGEKICAgIHdpdGhvdXQgdGhlIHRyYWlsaW5nIE5VTCBieXRlLgpAQCAtMjY2LDE1ICsyNjUsMTIgQEAKICAgIENvbnZlcnQgYSBQeXRob24gaW50ZWdlciB0byBhIEMgOmM6dHlwZTpgdW5zaWduZWQgbG9uZ2Agd2l0aG91dAogICAgb3ZlcmZsb3cgY2hlY2tpbmcuCiAKLWBgTGBgICg6Y2xhc3M6YGludGApIFtQWV9MT05HX0xPTkddCi0gICBDb252ZXJ0IGEgUHl0aG9uIGludGVnZXIgdG8gYSBDIDpjOnR5cGU6YGxvbmcgbG9uZ2AuICBUaGlzIGZvcm1hdCBpcyBvbmx5Ci0gICBhdmFpbGFibGUgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCA6Yzp0eXBlOmBsb25nIGxvbmdgIChvciA6Yzp0eXBlOmBfaW50NjRgIG9uCi0gICBXaW5kb3dzKS4KK2BgTGBgICg6Y2xhc3M6YGludGApIFtsb25nIGxvbmddCisgICBDb252ZXJ0IGEgUHl0aG9uIGludGVnZXIgdG8gYSBDIDpjOnR5cGU6YGxvbmcgbG9uZ2AuCiAKLWBgS2BgICg6Y2xhc3M6YGludGApIFt1bnNpZ25lZCBQWV9MT05HX0xPTkddCitgYEtgYCAoOmNsYXNzOmBpbnRgKSBbdW5zaWduZWQgbG9uZyBsb25nXQogICAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIHRvIGEgQyA6Yzp0eXBlOmB1bnNpZ25lZCBsb25nIGxvbmdgCi0gICB3aXRob3V0IG92ZXJmbG93IGNoZWNraW5nLiAgVGhpcyBmb3JtYXQgaXMgb25seSBhdmFpbGFibGUgb24gcGxhdGZvcm1zIHRoYXQKLSAgIHN1cHBvcnQgOmM6dHlwZTpgdW5zaWduZWQgbG9uZyBsb25nYCAob3IgOmM6dHlwZTpgdW5zaWduZWQgX2ludDY0YCBvbiBXaW5kb3dzKS4KKyAgIHdpdGhvdXQgb3ZlcmZsb3cgY2hlY2tpbmcuCiAKIGBgbmBgICg6Y2xhc3M6YGludGApIFtQeV9zc2l6ZV90XQogICAgQ29udmVydCBhIFB5dGhvbiBpbnRlZ2VyIHRvIGEgQyA6Yzp0eXBlOmBQeV9zc2l6ZV90YC4KQEAgLTQyNCw4ICs0MjAsMTUgQEAKIC4uIGM6ZnVuY3Rpb246OiBpbnQgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3csIGNvbnN0IGNoYXIgKmZvcm1hdCwgY2hhciAqa2V5d29yZHNbXSwgLi4uKQogCiAgICBQYXJzZSB0aGUgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYm90aCBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkCi0gICBwYXJhbWV0ZXJzIGludG8gbG9jYWwgdmFyaWFibGVzLiAgUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3M7IG9uIGZhaWx1cmUsIGl0Ci0gICByZXR1cm5zIGZhbHNlIGFuZCByYWlzZXMgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KKyAgIHBhcmFtZXRlcnMgaW50byBsb2NhbCB2YXJpYWJsZXMuICBUaGUgKmtleXdvcmRzKiBhcmd1bWVudCBpcyBhCisgICAqTlVMTCotdGVybWluYXRlZCBhcnJheSBvZiBrZXl3b3JkIHBhcmFtZXRlciBuYW1lcy4gIEVtcHR5IG5hbWVzIGRlbm90ZQorICAgOnJlZjpgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMgPHBvc2l0aW9uYWwtb25seV9wYXJhbWV0ZXI+YC4KKyAgIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzOyBvbiBmYWlsdXJlLCBpdCByZXR1cm5zIGZhbHNlIGFuZCByYWlzZXMgdGhlCisgICBhcHByb3ByaWF0ZSBleGNlcHRpb24uCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCBzdXBwb3J0IGZvciA6cmVmOmBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycworICAgICAgPHBvc2l0aW9uYWwtb25seV9wYXJhbWV0ZXI+YC4KIAogCiAuLiBjOmZ1bmN0aW9uOjogaW50IFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3csIGNvbnN0IGNoYXIgKmZvcm1hdCwgY2hhciAqa2V5d29yZHNbXSwgdmFfbGlzdCB2YXJncykKQEAgLTU4OCwxNSArNTkxLDExIEBACiAgICBgYGtgYCAoOmNsYXNzOmBpbnRgKSBbdW5zaWduZWQgbG9uZ10KICAgICAgIENvbnZlcnQgYSBDIDpjOnR5cGU6YHVuc2lnbmVkIGxvbmdgIHRvIGEgUHl0aG9uIGludGVnZXIgb2JqZWN0LgogCi0gICBgYExgYCAoOmNsYXNzOmBpbnRgKSBbUFlfTE9OR19MT05HXQotICAgICAgQ29udmVydCBhIEMgOmM6dHlwZTpgbG9uZyBsb25nYCB0byBhIFB5dGhvbiBpbnRlZ2VyIG9iamVjdC4gT25seSBhdmFpbGFibGUKLSAgICAgIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgOmM6dHlwZTpgbG9uZyBsb25nYCAob3IgOmM6dHlwZTpgX2ludDY0YCBvbgotICAgICAgV2luZG93cykuCisgICBgYExgYCAoOmNsYXNzOmBpbnRgKSBbbG9uZyBsb25nXQorICAgICAgQ29udmVydCBhIEMgOmM6dHlwZTpgbG9uZyBsb25nYCB0byBhIFB5dGhvbiBpbnRlZ2VyIG9iamVjdC4KIAotICAgYGBLYGAgKDpjbGFzczpgaW50YCkgW3Vuc2lnbmVkIFBZX0xPTkdfTE9OR10KLSAgICAgIENvbnZlcnQgYSBDIDpjOnR5cGU6YHVuc2lnbmVkIGxvbmcgbG9uZ2AgdG8gYSBQeXRob24gaW50ZWdlciBvYmplY3QuIE9ubHkKLSAgICAgIGF2YWlsYWJsZSBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IDpjOnR5cGU6YHVuc2lnbmVkIGxvbmcgbG9uZ2AgKG9yCi0gICAgICA6Yzp0eXBlOmB1bnNpZ25lZCBfaW50NjRgIG9uIFdpbmRvd3MpLgorICAgYGBLYGAgKDpjbGFzczpgaW50YCkgW3Vuc2lnbmVkIGxvbmcgbG9uZ10KKyAgICAgIENvbnZlcnQgYSBDIDpjOnR5cGU6YHVuc2lnbmVkIGxvbmcgbG9uZ2AgdG8gYSBQeXRob24gaW50ZWdlciBvYmplY3QuCiAKICAgIGBgbmBgICg6Y2xhc3M6YGludGApIFtQeV9zc2l6ZV90XQogICAgICAgQ29udmVydCBhIEMgOmM6dHlwZTpgUHlfc3NpemVfdGAgdG8gYSBQeXRob24gaW50ZWdlci4KZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9leGNlcHRpb25zLnJzdCBiL0RvYy9jLWFwaS9leGNlcHRpb25zLnJzdAppbmRleCAxOWNiYjNiLi4yNWZiMjljIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvZXhjZXB0aW9ucy5yc3QKKysrIGIvRG9jL2MtYXBpL2V4Y2VwdGlvbnMucnN0CkBAIC0zMDYsNiArMzA2LDEzIEBACiAgICA6bW9kOmB3YXJuaW5nc2AgbW9kdWxlIGFuZCB0aGUgOm9wdGlvbjpgLVdgIG9wdGlvbiBpbiB0aGUgY29tbWFuZCBsaW5lCiAgICBkb2N1bWVudGF0aW9uLiAgVGhlcmUgaXMgbm8gQyBBUEkgZm9yIHdhcm5pbmcgY29udHJvbC4KIAorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeUVycl9TZXRJbXBvcnRFcnJvclN1YmNsYXNzKFB5T2JqZWN0ICptc2csIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqcGF0aCkKKworICAgTXVjaCBsaWtlIDpjOmZ1bmM6YFB5RXJyX1NldEltcG9ydEVycm9yYCBidXQgdGhpcyBmdW5jdGlvbiBhbGxvd3MgZm9yCisgICBzcGVjaWZ5aW5nIGEgc3ViY2xhc3Mgb2YgOmV4YzpgSW1wb3J0RXJyb3JgIHRvIHJhaXNlLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKKwogCiAuLiBjOmZ1bmN0aW9uOjogaW50IFB5RXJyX1dhcm5FeHBsaWNpdE9iamVjdChQeU9iamVjdCAqY2F0ZWdvcnksIFB5T2JqZWN0ICptZXNzYWdlLCBQeU9iamVjdCAqZmlsZW5hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpyZWdpc3RyeSkKIApAQCAtMzM0LDYgKzM0MSwxNCBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCiAKIAorLi4gYzpmdW5jdGlvbjo6IGludCBQeUVycl9SZXNvdXJjZVdhcm5pbmcoUHlPYmplY3QgKnNvdXJjZSwgUHlfc3NpemVfdCBzdGFja19sZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisKKyAgIEZ1bmN0aW9uIHNpbWlsYXIgdG8gOmM6ZnVuYzpgUHlFcnJfV2FybkZvcm1hdGAsIGJ1dCAqY2F0ZWdvcnkqIGlzCisgICA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgIGFuZCBwYXNzICpzb3VyY2UqIHRvIDpmdW5jOmB3YXJuaW5ncy5XYXJuaW5nTWVzc2FnZWAuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKIFF1ZXJ5aW5nIHRoZSBlcnJvciBpbmRpY2F0b3IKID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtNzc0LDYgKzc4OSw4IEBACiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCiB8IDpjOmRhdGE6YFB5RXhjX0ltcG9ydEVycm9yYCAgICAgICAgICAgICB8IDpleGM6YEltcG9ydEVycm9yYCAgICAgICAgICAgICAgfCAgICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCit8IDpjOmRhdGE6YFB5RXhjX01vZHVsZU5vdEZvdW5kRXJyb3JgICAgICB8IDpleGM6YE1vZHVsZU5vdEZvdW5kRXJyb3JgICAgICAgfCAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCiB8IDpjOmRhdGE6YFB5RXhjX0luZGV4RXJyb3JgICAgICAgICAgICAgICB8IDpleGM6YEluZGV4RXJyb3JgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCiB8IDpjOmRhdGE6YFB5RXhjX0ludGVycnVwdGVkRXJyb3JgICAgICAgICB8IDpleGM6YEludGVycnVwdGVkRXJyb3JgICAgICAgICAgfCAgICAgICAgICB8CmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvaW5pdC5yc3QgYi9Eb2MvYy1hcGkvaW5pdC5yc3QKaW5kZXggZTc4ZGRhZS4uYzI3MmExYyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2luaXQucnN0CisrKyBiL0RvYy9jLWFwaS9pbml0LnJzdApAQCAtMjUsNyArMjUsNyBAQAogICAgICAgdHJpcGxlOiBtb2R1bGU7IHNlYXJjaDsgcGF0aAogICAgICAgc2luZ2xlOiBQeVN5c19TZXRBcmd2KCkKICAgICAgIHNpbmdsZTogUHlTeXNfU2V0QXJndkV4KCkKLSAgICAgIHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKIAogICAgSW5pdGlhbGl6ZSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgSW4gYW4gYXBwbGljYXRpb24gZW1iZWRkaW5nICBQeXRob24sIHRoaXMKICAgIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIGFueSBvdGhlciBQeXRob24vQyBBUEkgZnVuY3Rpb25zOyB3aXRoIHRoZQpAQCAtMzQsNyArMzQsNyBAQAogICAgbW9kdWxlcyA6bW9kOmBidWlsdGluc2AsIDptb2Q6YF9fbWFpbl9fYCBhbmQgOm1vZDpgc3lzYC4gIEl0IGFsc28gaW5pdGlhbGl6ZXMKICAgIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGggKGBgc3lzLnBhdGhgYCkuIEl0IGRvZXMgbm90IHNldCBgYHN5cy5hcmd2YGA7IHVzZQogICAgOmM6ZnVuYzpgUHlTeXNfU2V0QXJndkV4YCBmb3IgdGhhdC4gIFRoaXMgaXMgYSBuby1vcCB3aGVuIGNhbGxlZCBmb3IgYSBzZWNvbmQgdGltZQotICAgKHdpdGhvdXQgY2FsbGluZyA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgZmlyc3QpLiAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlOyBpdCBpcyBhCisgICAod2l0aG91dCBjYWxsaW5nIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGZpcnN0KS4gIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZTsgaXQgaXMgYQogICAgZmF0YWwgZXJyb3IgaWYgdGhlIGluaXRpYWxpemF0aW9uIGZhaWxzLgogCiAgICAuLiBub3RlOjoKQEAgLTUyLDE5ICs1MiwyMCBAQAogLi4gYzpmdW5jdGlvbjo6IGludCBQeV9Jc0luaXRpYWxpemVkKCkKIAogICAgUmV0dXJuIHRydWUgKG5vbnplcm8pIHdoZW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBoYXMgYmVlbiBpbml0aWFsaXplZCwgZmFsc2UKLSAgICh6ZXJvKSBpZiBub3QuICBBZnRlciA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgaXMgY2FsbGVkLCB0aGlzIHJldHVybnMgZmFsc2UgdW50aWwKKyAgICh6ZXJvKSBpZiBub3QuICBBZnRlciA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBpcyBjYWxsZWQsIHRoaXMgcmV0dXJucyBmYWxzZSB1bnRpbAogICAgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgaXMgY2FsbGVkIGFnYWluLgogCiAKLS4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5X0ZpbmFsaXplKCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfRmluYWxpemVFeCgpCiAKICAgIFVuZG8gYWxsIGluaXRpYWxpemF0aW9ucyBtYWRlIGJ5IDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGFuZCBzdWJzZXF1ZW50IHVzZSBvZgogICAgUHl0aG9uL0MgQVBJIGZ1bmN0aW9ucywgYW5kIGRlc3Ryb3kgYWxsIHN1Yi1pbnRlcnByZXRlcnMgKHNlZQogICAgOmM6ZnVuYzpgUHlfTmV3SW50ZXJwcmV0ZXJgIGJlbG93KSB0aGF0IHdlcmUgY3JlYXRlZCBhbmQgbm90IHlldCBkZXN0cm95ZWQgc2luY2UKICAgIHRoZSBsYXN0IGNhbGwgdG8gOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAuICBJZGVhbGx5LCB0aGlzIGZyZWVzIGFsbCBtZW1vcnkKICAgIGFsbG9jYXRlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgVGhpcyBpcyBhIG5vLW9wIHdoZW4gY2FsbGVkIGZvciBhIHNlY29uZAotICAgdGltZSAod2l0aG91dCBjYWxsaW5nIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGFnYWluIGZpcnN0KS4gIFRoZXJlIGlzIG5vIHJldHVybgotICAgdmFsdWU7IGVycm9ycyBkdXJpbmcgZmluYWxpemF0aW9uIGFyZSBpZ25vcmVkLgorICAgdGltZSAod2l0aG91dCBjYWxsaW5nIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGFnYWluIGZpcnN0KS4gIE5vcm1hbGx5IHRoZQorICAgcmV0dXJuIHZhbHVlIGlzIDAuICBJZiB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgZmluYWxpemF0aW9uCisgICAoZmx1c2hpbmcgYnVmZmVyZWQgZGF0YSksIC0xIGlzIHJldHVybmVkLgogCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBhIG51bWJlciBvZiByZWFzb25zLiAgQW4gZW1iZWRkaW5nIGFwcGxpY2F0aW9uCiAgICBtaWdodCB3YW50IHRvIHJlc3RhcnQgUHl0aG9uIHdpdGhvdXQgaGF2aW5nIHRvIHJlc3RhcnQgdGhlIGFwcGxpY2F0aW9uIGl0c2VsZi4KQEAgLTgzLDcgKzg0LDE1IEBACiAgICBmcmVlZC4gIFNvbWUgbWVtb3J5IGFsbG9jYXRlZCBieSBleHRlbnNpb24gbW9kdWxlcyBtYXkgbm90IGJlIGZyZWVkLiAgU29tZQogICAgZXh0ZW5zaW9ucyBtYXkgbm90IHdvcmsgcHJvcGVybHkgaWYgdGhlaXIgaW5pdGlhbGl6YXRpb24gcm91dGluZSBpcyBjYWxsZWQgbW9yZQogICAgdGhhbiBvbmNlOyB0aGlzIGNhbiBoYXBwZW4gaWYgYW4gYXBwbGljYXRpb24gY2FsbHMgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYW5kCi0gICA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgbW9yZSB0aGFuIG9uY2UuCisgICA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBtb3JlIHRoYW4gb25jZS4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfRmluYWxpemUoKQorCisgICBUaGlzIGlzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCB0aGF0CisgICBkaXNyZWdhcmRzIHRoZSByZXR1cm4gdmFsdWUuCiAKIAogUHJvY2Vzcy13aWRlIHBhcmFtZXRlcnMKQEAgLTExMSw3ICsxMjAsNyBAQAogICAgTm90ZSB0aGF0IDpkYXRhOmBzeXMuc3RkZXJyYCBhbHdheXMgdXNlcyB0aGUgImJhY2tzbGFzaHJlcGxhY2UiIGVycm9yCiAgICBoYW5kbGVyLCByZWdhcmRsZXNzIG9mIHRoaXMgKG9yIGFueSBvdGhlcikgc2V0dGluZy4KIAotICAgSWYgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGlzIGNhbGxlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIG5lZWQgdG8gYmUgY2FsbGVkCisgICBJZiA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBpcyBjYWxsZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIHRvIGJlIGNhbGxlZAogICAgYWdhaW4gaW4gb3JkZXIgdG8gYWZmZWN0IHN1YnNlcXVlbnQgY2FsbHMgdG8gOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAuCiAKICAgIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBhIG5vbnplcm8gdmFsdWUgb24gZXJyb3IgKGUuZy4gY2FsbGluZyBhZnRlciB0aGUKQEAgLTkyMiw3ICs5MzEsNyBAQAogICAgZW50cnkuKQogCiAgICAuLiBpbmRleDo6Ci0gICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKKyAgICAgIHNpbmdsZTogUHlfRmluYWxpemVFeCgpCiAgICAgICBzaW5nbGU6IFB5X0luaXRpYWxpemUoKQogCiAgICBFeHRlbnNpb24gbW9kdWxlcyBhcmUgc2hhcmVkIGJldHdlZW4gKHN1Yi0paW50ZXJwcmV0ZXJzIGFzIGZvbGxvd3M6IHRoZSBmaXJzdApAQCAtOTMyLDcgKzk0MSw3IEBACiAgICBhbmQgZmlsbGVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoaXMgY29weTsgdGhlIGV4dGVuc2lvbidzIGBgaW5pdGBgIGZ1bmN0aW9uIGlzCiAgICBub3QgY2FsbGVkLiAgTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gd2hhdCBoYXBwZW5zIHdoZW4gYW4gZXh0ZW5zaW9uIGlzCiAgICBpbXBvcnRlZCBhZnRlciB0aGUgaW50ZXJwcmV0ZXIgaGFzIGJlZW4gY29tcGxldGVseSByZS1pbml0aWFsaXplZCBieSBjYWxsaW5nCi0gICA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgYW5kIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgOyBpbiB0aGF0IGNhc2UsIHRoZSBleHRlbnNpb24ncworICAgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgYW5kIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgOyBpbiB0aGF0IGNhc2UsIHRoZSBleHRlbnNpb24ncwogICAgYGBpbml0bW9kdWxlYGAgZnVuY3Rpb24gKmlzKiBjYWxsZWQgYWdhaW4uCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBjbG9zZSgpIChpbiBtb2R1bGUgb3MpCkBAIC05NDAsMTQgKzk0OSwxNCBAQAogCiAuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9FbmRJbnRlcnByZXRlcihQeVRocmVhZFN0YXRlICp0c3RhdGUpCiAKLSAgIC4uIGluZGV4Ojogc2luZ2xlOiBQeV9GaW5hbGl6ZSgpCisgICAuLiBpbmRleDo6IHNpbmdsZTogUHlfRmluYWxpemVFeCgpCiAKICAgIERlc3Ryb3kgdGhlIChzdWItKWludGVycHJldGVyIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiB0aHJlYWQgc3RhdGUuIFRoZSBnaXZlbgogICAgdGhyZWFkIHN0YXRlIG11c3QgYmUgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRlLiAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHRocmVhZAogICAgc3RhdGVzIGJlbG93LiAgV2hlbiB0aGUgY2FsbCByZXR1cm5zLCB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUgaXMgKk5VTEwqLiAgQWxsCiAgICB0aHJlYWQgc3RhdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVycHJldGVyIGFyZSBkZXN0cm95ZWQuICAoVGhlIGdsb2JhbAogICAgaW50ZXJwcmV0ZXIgbG9jayBtdXN0IGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhbmQgaXMgc3RpbGwgaGVsZAotICAgd2hlbiBpdCByZXR1cm5zLikgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCB3aWxsIGRlc3Ryb3kgYWxsIHN1Yi1pbnRlcnByZXRlcnMgdGhhdAorICAgd2hlbiBpdCByZXR1cm5zLikgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIHdpbGwgZGVzdHJveSBhbGwgc3ViLWludGVycHJldGVycyB0aGF0CiAgICBoYXZlbid0IGJlZW4gZXhwbGljaXRseSBkZXN0cm95ZWQgYXQgdGhhdCBwb2ludC4KIAogCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvaW50cm8ucnN0IGIvRG9jL2MtYXBpL2ludHJvLnJzdAppbmRleCBiYzNhNzUyLi43NDY4MWQyIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvaW50cm8ucnN0CisrKyBiL0RvYy9jLWFwaS9pbnRyby5yc3QKQEAgLTY0LDkgKzY0LDEwIEBACiBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcmllcyA6ZmlsZTpge3ByZWZpeH0vaW5jbHVkZS9weXRob252ZXJzaW9uL2AgYW5kCiA6ZmlsZTpge2V4ZWNfcHJlZml4fS9pbmNsdWRlL3B5dGhvbnZlcnNpb24vYCwgd2hlcmUgOmVudnZhcjpgcHJlZml4YCBhbmQKIDplbnZ2YXI6YGV4ZWNfcHJlZml4YCBhcmUgZGVmaW5lZCBieSB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzIHRvIFB5dGhvbidzCi06cHJvZ3JhbTpgY29uZmlndXJlYCBzY3JpcHQgYW5kICp2ZXJzaW9uKiBpcyBgYHN5cy52ZXJzaW9uWzozXWBgLiAgT24gV2luZG93cywKLXRoZSBoZWFkZXJzIGFyZSBpbnN0YWxsZWQgaW4gOmZpbGU6YHtwcmVmaXh9L2luY2x1ZGVgLCB3aGVyZSA6ZW52dmFyOmBwcmVmaXhgIGlzCi10aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBzcGVjaWZpZWQgdG8gdGhlIGluc3RhbGxlci4KKzpwcm9ncmFtOmBjb25maWd1cmVgIHNjcmlwdCBhbmQgKnZlcnNpb24qIGlzCitgYCclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXWBgLiAgT24gV2luZG93cywgdGhlIGhlYWRlcnMgYXJlIGluc3RhbGxlZAoraW4gOmZpbGU6YHtwcmVmaXh9L2luY2x1ZGVgLCB3aGVyZSA6ZW52dmFyOmBwcmVmaXhgIGlzIHRoZSBpbnN0YWxsYXRpb24KK2RpcmVjdG9yeSBzcGVjaWZpZWQgdG8gdGhlIGluc3RhbGxlci4KIAogVG8gaW5jbHVkZSB0aGUgaGVhZGVycywgcGxhY2UgYm90aCBkaXJlY3RvcmllcyAoaWYgZGlmZmVyZW50KSBvbiB5b3VyIGNvbXBpbGVyJ3MKIHNlYXJjaCBwYXRoIGZvciBpbmNsdWRlcy4gIERvICpub3QqIHBsYWNlIHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMgb24gdGhlIHNlYXJjaApAQCAtNTc4LDkgKzU3OSw5IEBACiBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byBzdGFydCBvdmVyIChtYWtlIGFub3RoZXIgY2FsbCB0bwogOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWApIG9yIHRoZSBhcHBsaWNhdGlvbiBpcyBzaW1wbHkgZG9uZSB3aXRoIGl0cyAgdXNlIG9mCiBQeXRob24gYW5kIHdhbnRzIHRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBQeXRob24uICBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQKLWJ5IGNhbGxpbmcgOmM6ZnVuYzpgUHlfRmluYWxpemVgLiAgVGhlIGZ1bmN0aW9uIDpjOmZ1bmM6YFB5X0lzSW5pdGlhbGl6ZWRgIHJldHVybnMKK2J5IGNhbGxpbmcgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAuICBUaGUgZnVuY3Rpb24gOmM6ZnVuYzpgUHlfSXNJbml0aWFsaXplZGAgcmV0dXJucwogdHJ1ZSBpZiBQeXRob24gaXMgY3VycmVudGx5IGluIHRoZSBpbml0aWFsaXplZCBzdGF0ZS4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQKLXRoZXNlIGZ1bmN0aW9ucyBpcyBnaXZlbiBpbiBhIGxhdGVyIGNoYXB0ZXIuIE5vdGljZSB0aGF0IDpjOmZ1bmM6YFB5X0ZpbmFsaXplYAordGhlc2UgZnVuY3Rpb25zIGlzIGdpdmVuIGluIGEgbGF0ZXIgY2hhcHRlci4gTm90aWNlIHRoYXQgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAKIGRvZXMgKm5vdCogZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyLCBlLmcuIG1lbW9yeQogYWxsb2NhdGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzIGN1cnJlbnRseSBjYW5ub3QgYmUgcmVsZWFzZWQuCiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9sb25nLnJzdCBiL0RvYy9jLWFwaS9sb25nLnJzdAppbmRleCBiMzQ4MDE1Li5iYWU5NzAzIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvbG9uZy5yc3QKKysrIGIvRG9jL2MtYXBpL2xvbmcucnN0CkBAIC02MiwxMyArNjIsMTMgQEAKICAgICpOVUxMKiBvbiBmYWlsdXJlLgogCiAKLS4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MT05HX0xPTkcgdikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlMb25nX0Zyb21Mb25nTG9uZyhsb25nIGxvbmcgdikKIAogICAgUmV0dXJuIGEgbmV3IDpjOnR5cGU6YFB5TG9uZ09iamVjdGAgb2JqZWN0IGZyb20gYSBDIDpjOnR5cGU6YGxvbmcgbG9uZ2AsIG9yICpOVUxMKgogICAgb24gZmFpbHVyZS4KIAogCi0uLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh1bnNpZ25lZCBQWV9MT05HX0xPTkcgdikKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHVuc2lnbmVkIGxvbmcgbG9uZyB2KQogCiAgICBSZXR1cm4gYSBuZXcgOmM6dHlwZTpgUHlMb25nT2JqZWN0YCBvYmplY3QgZnJvbSBhIEMgOmM6dHlwZTpgdW5zaWduZWQgbG9uZyBsb25nYCwKICAgIG9yICpOVUxMKiBvbiBmYWlsdXJlLgpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICBvY2N1cnMgc2V0ICpcKm92ZXJmbG93KiB0byBgYDBgYCBhbmQgcmV0dXJuIGBgLTFgYCBhcyB1c3VhbC4KIAogCi0uLiBjOmZ1bmN0aW9uOjogUFlfTE9OR19MT05HIFB5TG9uZ19Bc0xvbmdMb25nKFB5T2JqZWN0ICpvYmopCisuLiBjOmZ1bmN0aW9uOjogbG9uZyBsb25nIFB5TG9uZ19Bc0xvbmdMb25nKFB5T2JqZWN0ICpvYmopCiAKICAgIC4uIGluZGV4OjoKICAgICAgIHNpbmdsZTogT3ZlcmZsb3dFcnJvciAoYnVpbHQtaW4gZXhjZXB0aW9uKQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICA6Yzp0eXBlOmBsb25nYC4KIAogCi0uLiBjOmZ1bmN0aW9uOjogUFlfTE9OR19MT05HIFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3coUHlPYmplY3QgKm9iaiwgaW50ICpvdmVyZmxvdykKKy4uIGM6ZnVuY3Rpb246OiBsb25nIGxvbmcgUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhQeU9iamVjdCAqb2JqLCBpbnQgKm92ZXJmbG93KQogCiAgICBSZXR1cm4gYSBDIDpjOnR5cGU6YGxvbmcgbG9uZ2AgcmVwcmVzZW50YXRpb24gb2YgKm9iaiouICBJZiAqb2JqKiBpcyBub3QgYW4KICAgIGluc3RhbmNlIG9mIDpjOnR5cGU6YFB5TG9uZ09iamVjdGAsIGZpcnN0IGNhbGwgaXRzIDptZXRoOmBfX2ludF9fYCBtZXRob2QKQEAgLTIxMCwxNiArMjEwLDE2IEBACiAgICA6Yzp0eXBlOmBzaXplX3RgLgogCiAKLS4uIGM6ZnVuY3Rpb246OiB1bnNpZ25lZCBQWV9MT05HX0xPTkcgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyhQeU9iamVjdCAqcHlsb25nKQorLi4gYzpmdW5jdGlvbjo6IHVuc2lnbmVkIGxvbmcgbG9uZyBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKFB5T2JqZWN0ICpweWxvbmcpCiAKICAgIC4uIGluZGV4OjoKICAgICAgIHNpbmdsZTogT3ZlcmZsb3dFcnJvciAoYnVpbHQtaW4gZXhjZXB0aW9uKQogCi0gICBSZXR1cm4gYSBDIDpjOnR5cGU6YHVuc2lnbmVkIFBZX0xPTkdfTE9OR2AgcmVwcmVzZW50YXRpb24gb2YgKnB5bG9uZyouCi0gICAqcHlsb25nKiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIDpjOnR5cGU6YFB5TG9uZ09iamVjdGAuCisgICBSZXR1cm4gYSBDIDpjOnR5cGU6YHVuc2lnbmVkIGxvbmcgbG9uZ2AgcmVwcmVzZW50YXRpb24gb2YgKnB5bG9uZyouICAqcHlsb25nKgorICAgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiA6Yzp0eXBlOmBQeUxvbmdPYmplY3RgLgogCiAgICBSYWlzZSA6ZXhjOmBPdmVyZmxvd0Vycm9yYCBpZiB0aGUgdmFsdWUgb2YgKnB5bG9uZyogaXMgb3V0IG9mIHJhbmdlIGZvciBhbgotICAgOmM6dHlwZTpgdW5zaWduZWQgUFlfTE9OR19MT05HYC4KKyAgIDpjOnR5cGU6YHVuc2lnbmVkIGxvbmcgbG9uZ2AuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4xCiAgICAgICBBIG5lZ2F0aXZlICpweWxvbmcqIG5vdyByYWlzZXMgOmV4YzpgT3ZlcmZsb3dFcnJvcmAsIG5vdCA6ZXhjOmBUeXBlRXJyb3JgLgpAQCAtMjM1LDcgKzIzNSw3IEBACiAgICByZXR1cm4gdGhlIHJlZHVjdGlvbiBvZiB0aGF0IHZhbHVlIG1vZHVsbyA6Y29uc3Q6YFVMT05HX01BWCArIDFgLgogCiAKLS4uIGM6ZnVuY3Rpb246OiB1bnNpZ25lZCBQWV9MT05HX0xPTkcgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soUHlPYmplY3QgKm9iaikKKy4uIGM6ZnVuY3Rpb246OiB1bnNpZ25lZCBsb25nIGxvbmcgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soUHlPYmplY3QgKm9iaikKIAogICAgUmV0dXJuIGEgQyA6Yzp0eXBlOmB1bnNpZ25lZCBsb25nIGxvbmdgIHJlcHJlc2VudGF0aW9uIG9mICpvYmoqLiAgSWYgKm9iaioKICAgIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiA6Yzp0eXBlOmBQeUxvbmdPYmplY3RgLCBmaXJzdCBjYWxsIGl0cyA6bWV0aDpgX19pbnRfX2AKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9tZW1vcnkucnN0IGIvRG9jL2MtYXBpL21lbW9yeS5yc3QKaW5kZXggMjkwZWYwOS4uM2ZmNTQ1MiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL21lbW9yeS5yc3QKKysrIGIvRG9jL2MtYXBpL21lbW9yeS5yc3QKQEAgLTg1LDkgKzg1LDEyIEBACiAKIC4uIHNlZWFsc286OgogCisgICBUaGUgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUKKyAgIHRoZSBtZW1vcnkgYWxsb2NhdG9ycyB1c2VkIGJ5IFB5dGhvbi4KKwogICAgVGhlIDplbnZ2YXI6YFBZVEhPTk1BTExPQ1NUQVRTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBwcmludAotICAgbWVtb3J5IGFsbG9jYXRpb24gc3RhdGlzdGljcyBldmVyeSB0aW1lIGEgbmV3IG9iamVjdCBhcmVuYSBpcyBjcmVhdGVkLCBhbmQKLSAgIG9uIHNodXRkb3duLgorICAgc3RhdGlzdGljcyBvZiB0aGUgOnJlZjpgcHltYWxsb2MgbWVtb3J5IGFsbG9jYXRvciA8cHltYWxsb2M+YCBldmVyeSB0aW1lIGEKKyAgIG5ldyBweW1hbGxvYyBvYmplY3QgYXJlbmEgaXMgY3JlYXRlZCwgYW5kIG9uIHNodXRkb3duLgogCiAKIFJhdyBNZW1vcnkgSW50ZXJmYWNlCkBAIC0xNjIsMTUgKzE2NSwxNyBAQAogYmVoYXZpb3Igd2hlbiByZXF1ZXN0aW5nIHplcm8gYnl0ZXMsIGFyZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpbmcgYW5kIHJlbGVhc2luZwogbWVtb3J5IGZyb20gdGhlIFB5dGhvbiBoZWFwLgogCi1UaGUgZGVmYXVsdCBtZW1vcnkgYmxvY2sgYWxsb2NhdG9yIHVzZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci06YzpmdW5jOmBtYWxsb2NgLCA6YzpmdW5jOmBjYWxsb2NgLCA6YzpmdW5jOmByZWFsbG9jYCBhbmQgOmM6ZnVuYzpgZnJlZWA7IGNhbGwKLWBgbWFsbG9jKDEpYGAgKG9yIGBgY2FsbG9jKDEsIDEpYGApIHdoZW4gcmVxdWVzdGluZyB6ZXJvIGJ5dGVzLgorQnkgZGVmYXVsdCwgdGhlc2UgZnVuY3Rpb25zIHVzZSA6cmVmOmBweW1hbGxvYyBtZW1vcnkgYWxsb2NhdG9yIDxweW1hbGxvYz5gLgogCiAuLiB3YXJuaW5nOjoKIAogICAgVGhlIDp0ZXJtOmBHSUwgPGdsb2JhbCBpbnRlcnByZXRlciBsb2NrPmAgbXVzdCBiZSBoZWxkIHdoZW4gdXNpbmcgdGhlc2UKICAgIGZ1bmN0aW9ucy4KIAorLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKworICAgVGhlIGRlZmF1bHQgYWxsb2NhdG9yIGlzIG5vdyBweW1hbGxvYyBpbnN0ZWFkIG9mIHN5c3RlbSA6YzpmdW5jOmBtYWxsb2NgLgorCiAuLiBjOmZ1bmN0aW9uOjogdm9pZCogUHlNZW1fTWFsbG9jKHNpemVfdCBuKQogCiAgICBBbGxvY2F0ZXMgKm4qIGJ5dGVzIGFuZCByZXR1cm5zIGEgcG9pbnRlciBvZiB0eXBlIDpjOnR5cGU6YHZvaWRcKmAgdG8gdGhlCkBAIC0yOTIsMTUgKzI5NywzMiBAQAogCiAgICBFbnVtIHVzZWQgdG8gaWRlbnRpZnkgYW4gYWxsb2NhdG9yIGRvbWFpbi4gRG9tYWluczoKIAotICAgKiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fUkFXYDogZnVuY3Rpb25zIDpjOmZ1bmM6YFB5TWVtX1Jhd01hbGxvY2AsCi0gICAgIDpjOmZ1bmM6YFB5TWVtX1Jhd1JlYWxsb2NgLCA6YzpmdW5jOmBQeU1lbV9SYXdDYWxsb2NgIGFuZAotICAgICA6YzpmdW5jOmBQeU1lbV9SYXdGcmVlYAotICAgKiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYDogZnVuY3Rpb25zIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AsCi0gICAgIDpjOmZ1bmM6YFB5TWVtX1JlYWxsb2NgLCA6YzpmdW5jOmBQeU1lbV9DYWxsb2NgIGFuZCA6YzpmdW5jOmBQeU1lbV9GcmVlYAotICAgKiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYDogZnVuY3Rpb25zIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2AsCi0gICAgIDpjOmZ1bmM6YFB5T2JqZWN0X1JlYWxsb2NgLCA6YzpmdW5jOmBQeU9iamVjdF9DYWxsb2NgIGFuZAotICAgICA6YzpmdW5jOmBQeU9iamVjdF9GcmVlYAorICAgLi4gYzp2YXI6OiBQWU1FTV9ET01BSU5fUkFXCiAKKyAgICAgIEZ1bmN0aW9uczoKKworICAgICAgKiA6YzpmdW5jOmBQeU1lbV9SYXdNYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5TWVtX1Jhd1JlYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5TWVtX1Jhd0NhbGxvY2AKKyAgICAgICogOmM6ZnVuYzpgUHlNZW1fUmF3RnJlZWAKKworICAgLi4gYzp2YXI6OiBQWU1FTV9ET01BSU5fTUVNCisKKyAgICAgIEZ1bmN0aW9uczoKKworICAgICAgKiA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgLAorICAgICAgKiA6YzpmdW5jOmBQeU1lbV9SZWFsbG9jYAorICAgICAgKiA6YzpmdW5jOmBQeU1lbV9DYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5TWVtX0ZyZWVgCisKKyAgIC4uIGM6dmFyOjogUFlNRU1fRE9NQUlOX09CSgorCisgICAgICBGdW5jdGlvbnM6CisKKyAgICAgICogOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYAorICAgICAgKiA6YzpmdW5jOmBQeU9iamVjdF9SZWFsbG9jYAorICAgICAgKiA6YzpmdW5jOmBQeU9iamVjdF9DYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5T2JqZWN0X0ZyZWVgCiAKIC4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5TWVtX0dldEFsbG9jYXRvcihQeU1lbUFsbG9jYXRvckRvbWFpbiBkb21haW4sIFB5TWVtQWxsb2NhdG9yRXggKmFsbG9jYXRvcikKIApAQCAtMzI1LDQzICszNDcsNjIgQEAKIAogLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKHZvaWQpCiAKLSAgIFNldHVwIGhvb2tzIHRvIGRldGVjdCBidWdzIGluIHRoZSBmb2xsb3dpbmcgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IKLSAgIGZ1bmN0aW9uczoKLQotICAgLSA6YzpmdW5jOmBQeU1lbV9SYXdNYWxsb2NgLCA6YzpmdW5jOmBQeU1lbV9SYXdSZWFsbG9jYCwKLSAgICAgOmM6ZnVuYzpgUHlNZW1fUmF3Q2FsbG9jYCwgOmM6ZnVuYzpgUHlNZW1fUmF3RnJlZWAKLSAgIC0gOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCwgOmM6ZnVuYzpgUHlNZW1fUmVhbGxvY2AsIDpjOmZ1bmM6YFB5TWVtX0NhbGxvY2AsCi0gICAgIDpjOmZ1bmM6YFB5TWVtX0ZyZWVgCi0gICAtIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2AsIDpjOmZ1bmM6YFB5T2JqZWN0X1JlYWxsb2NgLAotICAgICA6YzpmdW5jOmBQeU9iamVjdF9DYWxsb2NgLCA6YzpmdW5jOmBQeU9iamVjdF9GcmVlYAorICAgU2V0dXAgaG9va3MgdG8gZGV0ZWN0IGJ1Z3MgaW4gdGhlIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yIGZ1bmN0aW9ucy4KIAogICAgTmV3bHkgYWxsb2NhdGVkIG1lbW9yeSBpcyBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4Q0JgYCwgZnJlZWQgbWVtb3J5IGlzCi0gICBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4REJgYC4gQWRkaXRpb25hbCBjaGVja3M6CisgICBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4REJgYC4KIAotICAgLSBkZXRlY3QgQVBJIHZpb2xhdGlvbnMsIGV4OiA6YzpmdW5jOmBQeU9iamVjdF9GcmVlYCBjYWxsZWQgb24gYSBidWZmZXIKKyAgIFJ1bnRpbWUgY2hlY2tzOgorCisgICAtIERldGVjdCBBUEkgdmlvbGF0aW9ucywgZXg6IDpjOmZ1bmM6YFB5T2JqZWN0X0ZyZWVgIGNhbGxlZCBvbiBhIGJ1ZmZlcgogICAgICBhbGxvY2F0ZWQgYnkgOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYAotICAgLSBkZXRlY3Qgd3JpdGUgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIChidWZmZXIgdW5kZXJmbG93KQotICAgLSBkZXRlY3Qgd3JpdGUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIChidWZmZXIgb3ZlcmZsb3cpCisgICAtIERldGVjdCB3cml0ZSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKGJ1ZmZlciB1bmRlcmZsb3cpCisgICAtIERldGVjdCB3cml0ZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKGJ1ZmZlciBvdmVyZmxvdykKKyAgIC0gQ2hlY2sgdGhhdCB0aGUgOnRlcm06YEdJTCA8Z2xvYmFsIGludGVycHJldGVyIGxvY2s+YCBpcyBoZWxkIHdoZW4KKyAgICAgYWxsb2NhdG9yIGZ1bmN0aW9ucyBvZiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYCAoZXg6CisgICAgIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2ApIGFuZCA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCAoZXg6CisgICAgIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2ApIGRvbWFpbnMgYXJlIGNhbGxlZAogCi0gICBUaGUgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGlmIFB5dGhvbiBpcyBub3QgY29tcGlsZWQgaXMgZGVidWcgbW9kZS4KKyAgIE9uIGVycm9yLCB0aGUgZGVidWcgaG9va3MgdXNlIHRoZSA6bW9kOmB0cmFjZW1hbGxvY2AgbW9kdWxlIHRvIGdldCB0aGUKKyAgIHRyYWNlYmFjayB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMgYWxsb2NhdGVkLiBUaGUgdHJhY2ViYWNrIGlzIG9ubHkKKyAgIGRpc3BsYXllZCBpZiA6bW9kOmB0cmFjZW1hbGxvY2AgaXMgdHJhY2luZyBQeXRob24gbWVtb3J5IGFsbG9jYXRpb25zIGFuZCB0aGUKKyAgIG1lbW9yeSBibG9jayB3YXMgdHJhY2VkLgorCisgICBUaGVzZSBob29rcyBhcmUgaW5zdGFsbGVkIGJ5IGRlZmF1bHQgaWYgUHl0aG9uIGlzIGNvbXBpbGVkIGluIGRlYnVnCisgICBtb2RlLiBUaGUgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBpbnN0YWxsCisgICBkZWJ1ZyBob29rcyBvbiBhIFB5dGhvbiBjb21waWxlZCBpbiByZWxlYXNlIG1vZGUuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBUaGlzIGZ1bmN0aW9uIG5vdyBhbHNvIHdvcmtzIG9uIFB5dGhvbiBjb21waWxlZCBpbiByZWxlYXNlIG1vZGUuCisgICAgICBPbiBlcnJvciwgdGhlIGRlYnVnIGhvb2tzIG5vdyB1c2UgOm1vZDpgdHJhY2VtYWxsb2NgIHRvIGdldCB0aGUgdHJhY2ViYWNrCisgICAgICB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMgYWxsb2NhdGVkLiBUaGUgZGVidWcgaG9va3Mgbm93IGFsc28gY2hlY2sKKyAgICAgIGlmIHRoZSBHSUwgaXMgaGVsZCB3aGVuIGZ1bmN0aW9ucyBvZiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYCBhbmQKKyAgICAgIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9NRU1gIGRvbWFpbnMgYXJlIGNhbGxlZC4KIAogCi1DdXN0b21pemUgUHlPYmplY3QgQXJlbmEgQWxsb2NhdG9yCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisuLiBfcHltYWxsb2M6CiAKLVB5dGhvbiBoYXMgYSAqcHltYWxsb2MqIGFsbG9jYXRvciBmb3IgYWxsb2NhdGlvbnMgc21hbGxlciB0aGFuIDUxMiBieXRlcy4gVGhpcwotYWxsb2NhdG9yIGlzIG9wdGltaXplZCBmb3Igc21hbGwgb2JqZWN0cyB3aXRoIGEgc2hvcnQgbGlmZXRpbWUuIEl0IHVzZXMgbWVtb3J5Ci1tYXBwaW5ncyBjYWxsZWQgImFyZW5hcyIgd2l0aCBhIGZpeGVkIHNpemUgb2YgMjU2IEtCLiBJdCBmYWxscyBiYWNrIHRvCi06YzpmdW5jOmBQeU1lbV9SYXdNYWxsb2NgIGFuZCA6YzpmdW5jOmBQeU1lbV9SYXdSZWFsbG9jYCBmb3IgYWxsb2NhdGlvbnMgbGFyZ2VyCi10aGFuIDUxMiBieXRlcy4gICpweW1hbGxvYyogaXMgdGhlIGRlZmF1bHQgYWxsb2NhdG9yIHVzZWQgYnkKLTpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2AuCitUaGUgcHltYWxsb2MgYWxsb2NhdG9yCis9PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZSBkZWZhdWx0IGFyZW5hIGFsbG9jYXRvciB1c2VzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorUHl0aG9uIGhhcyBhICpweW1hbGxvYyogYWxsb2NhdG9yIG9wdGltaXplZCBmb3Igc21hbGwgb2JqZWN0cyAoc21hbGxlciBvciBlcXVhbAordG8gNTEyIGJ5dGVzKSB3aXRoIGEgc2hvcnQgbGlmZXRpbWUuIEl0IHVzZXMgbWVtb3J5IG1hcHBpbmdzIGNhbGxlZCAiYXJlbmFzIgord2l0aCBhIGZpeGVkIHNpemUgb2YgMjU2IEtCLiBJdCBmYWxscyBiYWNrIHRvIDpjOmZ1bmM6YFB5TWVtX1Jhd01hbGxvY2AgYW5kCis6YzpmdW5jOmBQeU1lbV9SYXdSZWFsbG9jYCBmb3IgYWxsb2NhdGlvbnMgbGFyZ2VyIHRoYW4gNTEyIGJ5dGVzLgorCisqcHltYWxsb2MqIGlzIHRoZSBkZWZhdWx0IGFsbG9jYXRvciBvZiB0aGUgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWAgKGV4OgorOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYCkgYW5kIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9PQkpgIChleDoKKzpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2ApIGRvbWFpbnMuCisKK1RoZSBhcmVuYSBhbGxvY2F0b3IgdXNlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKIAogKiA6YzpmdW5jOmBWaXJ0dWFsQWxsb2NgIGFuZCA6YzpmdW5jOmBWaXJ0dWFsRnJlZWAgb24gV2luZG93cywKICogOmM6ZnVuYzpgbW1hcGAgYW5kIDpjOmZ1bmM6YG11bm1hcGAgaWYgYXZhaWxhYmxlLAogKiA6YzpmdW5jOmBtYWxsb2NgIGFuZCA6YzpmdW5jOmBmcmVlYCBvdGhlcndpc2UuCiAKK0N1c3RvbWl6ZSBweW1hbGxvYyBBcmVuYSBBbGxvY2F0b3IKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKIC4uIGM6dHlwZTo6IFB5T2JqZWN0QXJlbmFBbGxvY2F0b3IKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9zdHJ1Y3R1cmVzLnJzdCBiL0RvYy9jLWFwaS9zdHJ1Y3R1cmVzLnJzdAppbmRleCBjYzg0MzE0Li5lOWU4YWRkIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvc3RydWN0dXJlcy5yc3QKKysrIGIvRG9jL2MtYXBpL3N0cnVjdHVyZXMucnN0CkBAIC0xNTAsOCArMTUwLDkgQEAKIFRoZSA6YXR0cjpgbWxfZmxhZ3NgIGZpZWxkIGlzIGEgYml0ZmllbGQgd2hpY2ggY2FuIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBmbGFncy4KIFRoZSBpbmRpdmlkdWFsIGZsYWdzIGluZGljYXRlIGVpdGhlciBhIGNhbGxpbmcgY29udmVudGlvbiBvciBhIGJpbmRpbmcKIGNvbnZlbnRpb24uICBPZiB0aGUgY2FsbGluZyBjb252ZW50aW9uIGZsYWdzLCBvbmx5IDpjb25zdDpgTUVUSF9WQVJBUkdTYCBhbmQKLTpjb25zdDpgTUVUSF9LRVlXT1JEU2AgY2FuIGJlIGNvbWJpbmVkLiBBbnkgb2YgdGhlIGNhbGxpbmcgY29udmVudGlvbiBmbGFncwotY2FuIGJlIGNvbWJpbmVkIHdpdGggYSBiaW5kaW5nIGZsYWcuCis6Y29uc3Q6YE1FVEhfS0VZV09SRFNgIGNhbiBiZSBjb21iaW5lZCAoYnV0IG5vdGUgdGhhdCA6Y29uc3Q6YE1FVEhfS0VZV09SRFNgCithbG9uZSBpcyBlcXVpdmFsZW50IHRvIGBgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEU2BgKS4gQW55IG9mIHRoZSBjYWxsaW5nCitjb252ZW50aW9uIGZsYWdzIGNhbiBiZSBjb21iaW5lZCB3aXRoIGEgYmluZGluZyBmbGFnLgogCiAKIC4uIGRhdGE6OiBNRVRIX1ZBUkFSR1MKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9zeXMucnN0IGIvRG9jL2MtYXBpL3N5cy5yc3QKaW5kZXggM2Q4M2IyNy4uMDM1Y2RjMSAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL3N5cy5yc3QKKysrIGIvRG9jL2MtYXBpL3N5cy5yc3QKQEAgLTUsNiArNSwxNyBAQAogT3BlcmF0aW5nIFN5c3RlbSBVdGlsaXRpZXMKID09PT09PT09PT09PT09PT09PT09PT09PT09CiAKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlPU19GU1BhdGgoUHlPYmplY3QgKnBhdGgpCisKKyAgIFJldHVybiB0aGUgZmlsZSBzeXN0ZW0gcmVwcmVzZW50YXRpb24gZm9yICpwYXRoKi4gSWYgdGhlIG9iamVjdCBpcyBhCisgICA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2Agb2JqZWN0LCB0aGVuIGl0cyByZWZlcmVuY2UgY291bnQgaXMKKyAgIGluY3JlbWVudGVkLiBJZiB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIGludGVyZmFjZSwKKyAgIHRoZW4gOm1ldGg6YH5vcy5QYXRoTGlrZS5fX2ZzcGF0aF9fYCBpcyByZXR1cm5lZCBhcyBsb25nIGFzIGl0IGlzIGEKKyAgIDpjbGFzczpgc3RyYCBvciA6Y2xhc3M6YGJ5dGVzYCBvYmplY3QuIE90aGVyd2lzZSA6ZXhjOmBUeXBlRXJyb3JgIGlzIHJhaXNlZAorICAgYW5kIGBgTlVMTGBgIGlzIHJldHVybmVkLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogCiAuLiBjOmZ1bmN0aW9uOjogaW50IFB5X0ZkSXNJbnRlcmFjdGl2ZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiAKQEAgLTIxMiwyMCArMjIzLDI0IEBACiAuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9FeGl0KGludCBzdGF0dXMpCiAKICAgIC4uIGluZGV4OjoKLSAgICAgIHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKICAgICAgIHNpbmdsZTogZXhpdCgpCiAKLSAgIEV4aXQgdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIFRoaXMgY2FsbHMgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGFuZCB0aGVuIGNhbGxzIHRoZQotICAgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9uIGBgZXhpdChzdGF0dXMpYGAuCisgICBFeGl0IHRoZSBjdXJyZW50IHByb2Nlc3MuICBUaGlzIGNhbGxzIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGFuZCB0aGVuIGNhbGxzIHRoZQorICAgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9uIGBgZXhpdChzdGF0dXMpYGAuICBJZiA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YAorICAgaW5kaWNhdGVzIGFuIGVycm9yLCB0aGUgZXhpdCBzdGF0dXMgaXMgc2V0IHRvIDEyMC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEVycm9ycyBmcm9tIGZpbmFsaXphdGlvbiBubyBsb25nZXIgaWdub3JlZC4KIAogCiAuLiBjOmZ1bmN0aW9uOjogaW50IFB5X0F0RXhpdCh2b2lkICgqZnVuYykgKCkpCiAKICAgIC4uIGluZGV4OjoKLSAgICAgIHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKICAgICAgIHNpbmdsZTogY2xlYW51cCBmdW5jdGlvbnMKIAotICAgUmVnaXN0ZXIgYSBjbGVhbnVwIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAuICBUaGUgY2xlYW51cAorICAgUmVnaXN0ZXIgYSBjbGVhbnVwIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YC4gIFRoZSBjbGVhbnVwCiAgICBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyBhbmQgc2hvdWxkIHJldHVybiBubyB2YWx1ZS4gIEF0IG1vc3QKICAgIDMyIGNsZWFudXAgZnVuY3Rpb25zIGNhbiBiZSByZWdpc3RlcmVkLiAgV2hlbiB0aGUgcmVnaXN0cmF0aW9uIGlzIHN1Y2Nlc3NmdWwsCiAgICA6YzpmdW5jOmBQeV9BdEV4aXRgIHJldHVybnMgYGAwYGA7IG9uIGZhaWx1cmUsIGl0IHJldHVybnMgYGAtMWBgLiAgVGhlIGNsZWFudXAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS91bmljb2RlLnJzdCBiL0RvYy9jLWFwaS91bmljb2RlLnJzdAppbmRleCBhMDY3MmNhLi4wODM1NDc3IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvdW5pY29kZS5yc3QKKysrIGIvRG9jL2MtYXBpL3VuaWNvZGUucnN0CkBAIC00NDAsNyArNDQwLDYgQEAKICAgIC4uICUgYmVjYXVzZSBub3QgYWxsIGNvbXBpbGVycyBzdXBwb3J0IHRoZSAleiB3aWR0aCBtb2RpZmllciAtLSB3ZSBmYWtlIGl0CiAgICAuLiAlIHdoZW4gbmVjZXNzYXJ5IHZpYSBpbnRlcnBvbGF0aW5nIFBZX0ZPUk1BVF9TSVpFX1QuCiAgICAuLiAlIFNpbWlsYXIgY29tbWVudHMgYXBwbHkgdG8gdGhlICVsbCB3aWR0aCBtb2RpZmllciBhbmQKLSAgIC4uICUgUFlfRk9STUFUX0xPTkdfTE9ORy4KIAogICAgLi4gdGFidWxhcmNvbHVtbnM6OiB8bHxsfEx8CiAKQEAgLTUyNSwxMSArNTI0LDYgQEAKICAgIGNvcGllZCBhcy1pcyB0byB0aGUgcmVzdWx0IHN0cmluZywgYW5kIGFueSBleHRyYSBhcmd1bWVudHMgZGlzY2FyZGVkLgogCiAgICAuLiBub3RlOjoKLQotICAgICAgVGhlIGAiJWxsZCJgIGFuZCBgIiVsbHUiYCBmb3JtYXQgc3BlY2lmaWVycyBhcmUgb25seSBhdmFpbGFibGUKLSAgICAgIHdoZW4gOmNvbnN0OmBIQVZFX0xPTkdfTE9OR2AgaXMgZGVmaW5lZC4KLQotICAgLi4gbm90ZTo6CiAgICAgICBUaGUgd2lkdGggZm9ybWF0dGVyIHVuaXQgaXMgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gYnl0ZXMuCiAgICAgICBUaGUgcHJlY2lzaW9uIGZvcm1hdHRlciB1bml0IGlzIG51bWJlciBvZiBieXRlcyBmb3IgYGAiJXMiYGAgYW5kCiAgICAgICBgYCIlViJgYCAoaWYgdGhlIGBgUHlPYmplY3QqYGAgYXJndW1lbnQgaXMgTlVMTCksIGFuZCBhIG51bWJlciBvZgpAQCAtODA4LDM4ICs4MDIsNDcgQEAKICIiIiIiIiIiIiIiIiIiIiIiIiIiCiAKIFRvIGVuY29kZSBhbmQgZGVjb2RlIGZpbGUgbmFtZXMgYW5kIG90aGVyIGVudmlyb25tZW50IHN0cmluZ3MsCi06YzpkYXRhOmBQeV9GaWxlU3lzdGVtRW5jb2RpbmdgIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBlbmNvZGluZywgYW5kCi1gYCJzdXJyb2dhdGVlc2NhcGUiYGAgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGVycm9yIGhhbmRsZXIgKDpwZXA6YDM4M2ApLiBUbwotZW5jb2RlIGZpbGUgbmFtZXMgZHVyaW5nIGFyZ3VtZW50IHBhcnNpbmcsIHRoZSBgYCJPJiJgYCBjb252ZXJ0ZXIgc2hvdWxkIGJlCi11c2VkLCBwYXNzaW5nIDpjOmZ1bmM6YFB5VW5pY29kZV9GU0NvbnZlcnRlcmAgYXMgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb246Cis6YzpkYXRhOmBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nYCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgZW5jb2RpbmcsIGFuZAorOmM6ZGF0YTpgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGVFcnJvcnNgIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBlcnJvciBoYW5kbGVyCisoOnBlcDpgMzgzYCBhbmQgOnBlcDpgNTI5YCkuIFRvIGVuY29kZSBmaWxlIG5hbWVzIHRvIDpjbGFzczpgYnl0ZXNgIGR1cmluZworYXJndW1lbnQgcGFyc2luZywgdGhlIGBgIk8mImBgIGNvbnZlcnRlciBzaG91bGQgYmUgdXNlZCwgcGFzc2luZworOmM6ZnVuYzpgUHlVbmljb2RlX0ZTQ29udmVydGVyYCBhcyB0aGUgY29udmVyc2lvbiBmdW5jdGlvbjoKIAogLi4gYzpmdW5jdGlvbjo6IGludCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIoUHlPYmplY3QqIG9iaiwgdm9pZCogcmVzdWx0KQogCi0gICBQYXJzZVR1cGxlIGNvbnZlcnRlcjogZW5jb2RlIDpjbGFzczpgc3RyYCBvYmplY3RzIHRvIDpjbGFzczpgYnl0ZXNgIHVzaW5nCisgICBQYXJzZVR1cGxlIGNvbnZlcnRlcjogZW5jb2RlIDpjbGFzczpgc3RyYCBvYmplY3RzIC0tIG9idGFpbmVkIGRpcmVjdGx5IG9yCisgICB0aHJvdWdoIHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYCBpbnRlcmZhY2UgLS0gdG8gOmNsYXNzOmBieXRlc2AgdXNpbmcKICAgIDpjOmZ1bmM6YFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHRgOyA6Y2xhc3M6YGJ5dGVzYCBvYmplY3RzIGFyZSBvdXRwdXQgYXMtaXMuCiAgICAqcmVzdWx0KiBtdXN0IGJlIGEgOmM6dHlwZTpgUHlCeXRlc09iamVjdCpgIHdoaWNoIG11c3QgYmUgcmVsZWFzZWQgd2hlbiBpdCBpcwogICAgbm8gbG9uZ2VyIHVzZWQuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMQogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KIAotVG8gZGVjb2RlIGZpbGUgbmFtZXMgZHVyaW5nIGFyZ3VtZW50IHBhcnNpbmcsIHRoZSBgYCJPJiJgYCBjb252ZXJ0ZXIgc2hvdWxkIGJlCi11c2VkLCBwYXNzaW5nIDpjOmZ1bmM6YFB5VW5pY29kZV9GU0RlY29kZXJgIGFzIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9uOgorVG8gZGVjb2RlIGZpbGUgbmFtZXMgdG8gOmNsYXNzOmBzdHJgIGR1cmluZyBhcmd1bWVudCBwYXJzaW5nLCB0aGUgYGAiTyYiYGAKK2NvbnZlcnRlciBzaG91bGQgYmUgdXNlZCwgcGFzc2luZyA6YzpmdW5jOmBQeVVuaWNvZGVfRlNEZWNvZGVyYCBhcyB0aGUKK2NvbnZlcnNpb24gZnVuY3Rpb246CiAKIC4uIGM6ZnVuY3Rpb246OiBpbnQgUHlVbmljb2RlX0ZTRGVjb2RlcihQeU9iamVjdCogb2JqLCB2b2lkKiByZXN1bHQpCiAKLSAgIFBhcnNlVHVwbGUgY29udmVydGVyOiBkZWNvZGUgOmNsYXNzOmBieXRlc2Agb2JqZWN0cyB0byA6Y2xhc3M6YHN0cmAgdXNpbmcKLSAgIDpjOmZ1bmM6YFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplYDsgOmNsYXNzOmBzdHJgIG9iamVjdHMgYXJlIG91dHB1dAotICAgYXMtaXMuICpyZXN1bHQqIG11c3QgYmUgYSA6Yzp0eXBlOmBQeVVuaWNvZGVPYmplY3QqYCB3aGljaCBtdXN0IGJlIHJlbGVhc2VkCi0gICB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VkLgorICAgUGFyc2VUdXBsZSBjb252ZXJ0ZXI6IGRlY29kZSA6Y2xhc3M6YGJ5dGVzYCBvYmplY3RzIC0tIG9idGFpbmVkIGVpdGhlcgorICAgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYCBpbnRlcmZhY2UgLS0gdG8KKyAgIDpjbGFzczpgc3RyYCB1c2luZyA6YzpmdW5jOmBQeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0QW5kU2l6ZWA7IDpjbGFzczpgc3RyYAorICAgb2JqZWN0cyBhcmUgb3V0cHV0IGFzLWlzLiAqcmVzdWx0KiBtdXN0IGJlIGEgOmM6dHlwZTpgUHlVbmljb2RlT2JqZWN0KmAgd2hpY2gKKyAgIG11c3QgYmUgcmVsZWFzZWQgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdEFuZFNpemUoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplKQogCiAgICBEZWNvZGUgYSBzdHJpbmcgdXNpbmcgOmM6ZGF0YTpgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZ2AgYW5kIHRoZQotICAgYGAic3Vycm9nYXRlZXNjYXBlImBgIGVycm9yIGhhbmRsZXIsIG9yIGBgInN0cmljdCJgYCBvbiBXaW5kb3dzLgorICAgOmM6ZGF0YTpgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGVFcnJvcnNgIGVycm9yIGhhbmRsZXIuCiAKICAgIElmIDpjOmRhdGE6YFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmdgIGlzIG5vdCBzZXQsIGZhbGwgYmFjayB0byB0aGUKICAgIGxvY2FsZSBlbmNvZGluZy4KQEAgLTg1MywyOCArODU2LDI4IEBACiAKICAgICAgIFRoZSA6YzpmdW5jOmBQeV9EZWNvZGVMb2NhbGVgIGZ1bmN0aW9uLgogCi0gICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMgotICAgICAgVXNlIGBgInN0cmljdCJgYCBlcnJvciBoYW5kbGVyIG9uIFdpbmRvd3MuCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgVXNlIDpjOmRhdGE6YFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RlRXJyb3JzYCBlcnJvciBoYW5kbGVyLgogCiAKIC4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdChjb25zdCBjaGFyICpzKQogCiAgICBEZWNvZGUgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHVzaW5nIDpjOmRhdGE6YFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmdgCi0gICBhbmQgdGhlIGBgInN1cnJvZ2F0ZWVzY2FwZSJgYCBlcnJvciBoYW5kbGVyLCBvciBgYCJzdHJpY3QiYGAgb24gV2luZG93cy4KKyAgIGFuZCB0aGUgOmM6ZGF0YTpgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGVFcnJvcnNgIGVycm9yIGhhbmRsZXIuCiAKICAgIElmIDpjOmRhdGE6YFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmdgIGlzIG5vdCBzZXQsIGZhbGwgYmFjayB0byB0aGUKICAgIGxvY2FsZSBlbmNvZGluZy4KIAogICAgVXNlIDpjOmZ1bmM6YFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplYCBpZiB5b3Uga25vdyB0aGUgc3RyaW5nIGxlbmd0aC4KIAotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjIKLSAgICAgIFVzZSBgYCJzdHJpY3QiYGAgZXJyb3IgaGFuZGxlciBvbiBXaW5kb3dzLgorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFVzZSA6YzpkYXRhOmBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kZUVycm9yc2AgZXJyb3IgaGFuZGxlci4KIAogCiAuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQoUHlPYmplY3QgKnVuaWNvZGUpCiAKICAgIEVuY29kZSBhIFVuaWNvZGUgb2JqZWN0IHRvIDpjOmRhdGE6YFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmdgIHdpdGggdGhlCi0gICBgYCJzdXJyb2dhdGVlc2NhcGUiYGAgZXJyb3IgaGFuZGxlciwgb3IgYGAic3RyaWN0ImBgIG9uIFdpbmRvd3MsIGFuZCByZXR1cm4KKyAgIDpjOmRhdGE6YFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RlRXJyb3JzYCBlcnJvciBoYW5kbGVyLCBhbmQgcmV0dXJuCiAgICA6Y2xhc3M6YGJ5dGVzYC4gTm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgOmNsYXNzOmBieXRlc2Agb2JqZWN0IG1heSBjb250YWluCiAgICBudWxsIGJ5dGVzLgogCkBAIC04OTEsNiArODk0LDggQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBVc2UgOmM6ZGF0YTpgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGVFcnJvcnNgIGVycm9yIGhhbmRsZXIuCiAKIHdjaGFyX3QgU3VwcG9ydAogIiIiIiIiIiIiIiIiIiIiCmRpZmYgLS1naXQgYS9Eb2MvZGF0YS9yZWZjb3VudHMuZGF0IGIvRG9jL2RhdGEvcmVmY291bnRzLmRhdAppbmRleCBlMzg4MTk1Li44YjQ2OWY0IDEwMDY0NAotLS0gYS9Eb2MvZGF0YS9yZWZjb3VudHMuZGF0CisrKyBiL0RvYy9kYXRhL3JlZmNvdW50cy5kYXQKQEAgLTkyMSw2ICs5MjEsOSBAQAogUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcjppbnQ6OjoKIFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3I6UHlPYmplY3QqOm86MDoKIAorUHlPU19GU1BhdGg6UHlPYmplY3QqOjorMToKK1B5T1NfRlNQYXRoOlB5T2JqZWN0KjpwYXRoOjA6CisKIFB5T2JqZWN0X0NhbGw6UHlPYmplY3QqOjorMToKIFB5T2JqZWN0X0NhbGw6UHlPYmplY3QqOmNhbGxhYmxlX29iamVjdDowOgogUHlPYmplY3RfQ2FsbDpQeU9iamVjdCo6YXJnczowOgpkaWZmIC0tZ2l0IGEvRG9jL2V4dGVuZGluZy9lbWJlZGRpbmcucnN0IGIvRG9jL2V4dGVuZGluZy9lbWJlZGRpbmcucnN0CmluZGV4IDY0MDMzZGMuLmFiMmY2MTYgMTAwNjQ0Ci0tLSBhL0RvYy9leHRlbmRpbmcvZW1iZWRkaW5nLnJzdAorKysgYi9Eb2MvZXh0ZW5kaW5nL2VtYmVkZGluZy5yc3QKQEAgLTY3LDcgKzY3LDkgQEAKICAgICAgICBQeV9Jbml0aWFsaXplKCk7CiAgICAgICAgUHlSdW5fU2ltcGxlU3RyaW5nKCJmcm9tIHRpbWUgaW1wb3J0IHRpbWUsY3RpbWVcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaW50KCdUb2RheSBpcycsIGN0aW1lKHRpbWUoKSkpXG4iKTsKLSAgICAgICBQeV9GaW5hbGl6ZSgpOworICAgICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgICAgIGV4aXQoMTIwKTsKKyAgICAgICB9CiAgICAgICAgUHlNZW1fUmF3RnJlZShwcm9ncmFtKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KQEAgLTc2LDcgKzc4LDcgQEAKIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIHRvIGluZm9ybSB0aGUgaW50ZXJwcmV0ZXIgYWJvdXQgcGF0aHMgdG8gUHl0aG9uIHJ1bi10aW1lCiBsaWJyYXJpZXMuICBOZXh0LCB0aGUgUHl0aG9uIGludGVycHJldGVyIGlzIGluaXRpYWxpemVkIHdpdGgKIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgLCBmb2xsb3dlZCBieSB0aGUgZXhlY3V0aW9uIG9mIGEgaGFyZC1jb2RlZCBQeXRob24gc2NyaXB0Ci10aGF0IHByaW50cyB0aGUgZGF0ZSBhbmQgdGltZS4gIEFmdGVyd2FyZHMsIHRoZSA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgY2FsbCBzaHV0cwordGhhdCBwcmludHMgdGhlIGRhdGUgYW5kIHRpbWUuICBBZnRlcndhcmRzLCB0aGUgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgY2FsbCBzaHV0cwogdGhlIGludGVycHJldGVyIGRvd24sIGZvbGxvd2VkIGJ5IHRoZSBlbmQgb2YgdGhlIHByb2dyYW0uICBJbiBhIHJlYWwgcHJvZ3JhbSwKIHlvdSBtYXkgd2FudCB0byBnZXQgdGhlIFB5dGhvbiBzY3JpcHQgZnJvbSBhbm90aGVyIHNvdXJjZSwgcGVyaGFwcyBhIHRleHQtZWRpdG9yCiByb3V0aW5lLCBhIGZpbGUsIG9yIGEgZGF0YWJhc2UuICBHZXR0aW5nIHRoZSBQeXRob24gY29kZSBmcm9tIGEgZmlsZSBjYW4gYmV0dGVyCmRpZmYgLS1naXQgYS9Eb2MvZmFxL3Byb2dyYW1taW5nLnJzdCBiL0RvYy9mYXEvcHJvZ3JhbW1pbmcucnN0CmluZGV4IDY5NDc1M2UuLjljNWUyMGQgMTAwNjQ0Ci0tLSBhL0RvYy9mYXEvcHJvZ3JhbW1pbmcucnN0CisrKyBiL0RvYy9mYXEvcHJvZ3JhbW1pbmcucnN0CkBAIC04MzgsNyArODM4LDggQEAKIFRvIGNvbnZlcnQsIGUuZy4sIHRoZSBudW1iZXIgMTQ0IHRvIHRoZSBzdHJpbmcgJzE0NCcsIHVzZSB0aGUgYnVpbHQtaW4gdHlwZQogY29uc3RydWN0b3IgOmZ1bmM6YHN0cmAuICBJZiB5b3Ugd2FudCBhIGhleGFkZWNpbWFsIG9yIG9jdGFsIHJlcHJlc2VudGF0aW9uLCB1c2UKIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgOmZ1bmM6YGhleGAgb3IgOmZ1bmM6YG9jdGAuICBGb3IgZmFuY3kgZm9ybWF0dGluZywgc2VlCi10aGUgOnJlZjpgZm9ybWF0c3RyaW5nc2Agc2VjdGlvbiwgZS5nLiBgYCJ7OjA0ZH0iLmZvcm1hdCgxNDQpYGAgeWllbGRzCit0aGUgOnJlZjpgZi1zdHJpbmdzYCBhbmQgOnJlZjpgZm9ybWF0c3RyaW5nc2Agc2VjdGlvbnMsCitlLmcuIGBgIns6MDRkfSIuZm9ybWF0KDE0NClgYCB5aWVsZHMKIGBgJzAxNDQnYGAgYW5kIGBgIns6LjNmfSIuZm9ybWF0KDEuMC8zLjApYGAgeWllbGRzIGBgJzAuMzMzJ2BgLgogCiAKZGlmZiAtLWdpdCBhL0RvYy9nbG9zc2FyeS5yc3QgYi9Eb2MvZ2xvc3NhcnkucnN0CmluZGV4IDQ1Yjc5NGYuLmY4MGI2ZGYgMTAwNjQ0Ci0tLSBhL0RvYy9nbG9zc2FyeS5yc3QKKysrIGIvRG9jL2dsb3NzYXJ5LnJzdApAQCAtNzE4LDYgKzcxOCw4IEBACiAKICAgICAgICAgICAgZGVmIGZ1bmMoZm9vLCBiYXI9Tm9uZSk6IC4uLgogCisgICAgICAuLiBfcG9zaXRpb25hbC1vbmx5X3BhcmFtZXRlcjoKKwogICAgICAgKiA6ZGZuOmBwb3NpdGlvbmFsLW9ubHlgOiBzcGVjaWZpZXMgYW4gYXJndW1lbnQgdGhhdCBjYW4gYmUgc3VwcGxpZWQgb25seQogICAgICAgICBieSBwb3NpdGlvbi4gIFB5dGhvbiBoYXMgbm8gc3ludGF4IGZvciBkZWZpbmluZyBwb3NpdGlvbmFsLW9ubHkKICAgICAgICAgcGFyYW1ldGVycy4gIEhvd2V2ZXIsIHNvbWUgYnVpbHQtaW4gZnVuY3Rpb25zIGhhdmUgcG9zaXRpb25hbC1vbmx5CkBAIC03NzYsNiArNzc4LDE2IEBACiAgICAgICBPbmUgb2YgdGhlIGRlZmF1bHQgOnRlcm06YG1ldGEgcGF0aCBmaW5kZXJzIDxtZXRhIHBhdGggZmluZGVyPmAgd2hpY2gKICAgICAgIHNlYXJjaGVzIGFuIDp0ZXJtOmBpbXBvcnQgcGF0aGAgZm9yIG1vZHVsZXMuCiAKKyAgIHBhdGgtbGlrZSBvYmplY3QKKyAgICAgIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIHN5c3RlbSBwYXRoLiBBIHBhdGgtbGlrZSBvYmplY3QgaXMgZWl0aGVyCisgICAgICBhIDpjbGFzczpgc3RyYCBvciA6Y2xhc3M6YGJ5dGVzYCBvYmplY3QgcmVwcmVzZW50aW5nIGEgcGF0aCwgb3IgYW4gb2JqZWN0CisgICAgICBpbXBsZW1lbnRpbmcgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIHByb3RvY29sLiBBbiBvYmplY3QgdGhhdCBzdXBwb3J0cworICAgICAgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIHByb3RvY29sIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSA6Y2xhc3M6YHN0cmAgb3IKKyAgICAgIDpjbGFzczpgYnl0ZXNgIGZpbGUgc3lzdGVtIHBhdGggYnkgY2FsbGluZyB0aGUgOmZ1bmM6YG9zLmZzcGF0aGAgZnVuY3Rpb247CisgICAgICA6ZnVuYzpgb3MuZnNkZWNvZGVgIGFuZCA6ZnVuYzpgb3MuZnNlbmNvZGVgIGNhbiBiZSB1c2VkIHRvIGd1YXJhbnRlZSBhCisgICAgICA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2AgcmVzdWx0IGluc3RlYWQsIHJlc3BlY3RpdmVseS4gSW50cm9kdWNlZAorICAgICAgYnkgOnBlcDpgNTE5YC4KKwogICAgcG9ydGlvbgogICAgICAgQSBzZXQgb2YgZmlsZXMgaW4gYSBzaW5nbGUgZGlyZWN0b3J5IChwb3NzaWJseSBzdG9yZWQgaW4gYSB6aXAgZmlsZSkKICAgICAgIHRoYXQgY29udHJpYnV0ZSB0byBhIG5hbWVzcGFjZSBwYWNrYWdlLCBhcyBkZWZpbmVkIGluIDpwZXA6YDQyMGAuCkBAIC05NTIsMTMgKzk2NCwyNSBAQAogICAgICAgYGAnXHInYGAuICBTZWUgOnBlcDpgMjc4YCBhbmQgOnBlcDpgMzExNmAsIGFzIHdlbGwgYXMKICAgICAgIDpmdW5jOmBieXRlcy5zcGxpdGxpbmVzYCBmb3IgYW4gYWRkaXRpb25hbCB1c2UuCiAKKyAgIHZhcmlhYmxlIGFubm90YXRpb24KKyAgICAgIEEgdHlwZSBtZXRhZGF0YSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBtb2R1bGUgZ2xvYmFsIHZhcmlhYmxlIG9yCisgICAgICBhIGNsYXNzIGF0dHJpYnV0ZS4gSXRzIHN5bnRheCBpcyBleHBsYWluZWQgaW4gc2VjdGlvbiA6cmVmOmBhbm5hc3NpZ25gLgorICAgICAgQW5ub3RhdGlvbnMgYXJlIHN0b3JlZCBpbiB0aGUgOmF0dHI6YF9fYW5ub3RhdGlvbnNfX2Agc3BlY2lhbAorICAgICAgYXR0cmlidXRlIG9mIGEgY2xhc3Mgb3IgbW9kdWxlIG9iamVjdCBhbmQgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nCisgICAgICA6ZnVuYzpgdHlwaW5nLmdldF90eXBlX2hpbnRzYC4KKworICAgICAgUHl0aG9uIGl0c2VsZiBkb2VzIG5vdCBhc3NpZ24gYW55IHBhcnRpY3VsYXIgbWVhbmluZyB0byB2YXJpYWJsZQorICAgICAgYW5ub3RhdGlvbnMuIFRoZXkgYXJlIGludGVuZGVkIHRvIGJlIGludGVycHJldGVkIGJ5IHRoaXJkLXBhcnR5IGxpYnJhcmllcworICAgICAgb3IgdHlwZSBjaGVja2luZyB0b29scy4gU2VlIDpwZXA6YDUyNmAsIDpwZXA6YDQ4NGAgd2hpY2ggZGVzY3JpYmUKKyAgICAgIHNvbWUgb2YgdGhlaXIgcG90ZW50aWFsIHVzZXMuCisKICAgIHZpcnR1YWwgZW52aXJvbm1lbnQKICAgICAgIEEgY29vcGVyYXRpdmVseSBpc29sYXRlZCBydW50aW1lIGVudmlyb25tZW50IHRoYXQgYWxsb3dzIFB5dGhvbiB1c2VycwogICAgICAgYW5kIGFwcGxpY2F0aW9ucyB0byBpbnN0YWxsIGFuZCB1cGdyYWRlIFB5dGhvbiBkaXN0cmlidXRpb24gcGFja2FnZXMKICAgICAgIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCB0aGUgYmVoYXZpb3VyIG9mIG90aGVyIFB5dGhvbiBhcHBsaWNhdGlvbnMKICAgICAgIHJ1bm5pbmcgb24gdGhlIHNhbWUgc3lzdGVtLgogCi0gICAgICBTZWUgYWxzbyA6cmVmOmBzY3JpcHRzLXB5dmVudmAuCisgICAgICBTZWUgYWxzbyA6bW9kOmB2ZW52YC4KIAogICAgdmlydHVhbCBtYWNoaW5lCiAgICAgICBBIGNvbXB1dGVyIGRlZmluZWQgZW50aXJlbHkgaW4gc29mdHdhcmUuICBQeXRob24ncyB2aXJ0dWFsIG1hY2hpbmUKZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9hcmdwYXJzZS5yc3QgYi9Eb2MvaG93dG8vYXJncGFyc2UucnN0CmluZGV4IGNmZTk4NjguLjdhNjAxNjUgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by9hcmdwYXJzZS5yc3QKKysrIGIvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdApAQCAtNTQ3LDcgKzU0Nyw4IEBACiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgIEZpbGUgInByb2cucHkiLCBsaW5lIDExLCBpbiA8bW9kdWxlPgogICAgICAgIGlmIGFyZ3MudmVyYm9zaXR5ID49IDI6Ci0gICBUeXBlRXJyb3I6IHVub3JkZXJhYmxlIHR5cGVzOiBOb25lVHlwZSgpID49IGludCgpCisgICBUeXBlRXJyb3I6ICc+PScgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnTm9uZVR5cGUnIGFuZCAnaW50JworCiAKICogRmlyc3Qgb3V0cHV0IHdlbnQgd2VsbCwgYW5kIGZpeGVzIHRoZSBidWcgd2UgaGFkIGJlZm9yZS4KICAgVGhhdCBpcywgd2Ugd2FudCBhbnkgdmFsdWUgPj0gMiB0byBiZSBhcyB2ZXJib3NlIGFzIHBvc3NpYmxlLgpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL2NsaW5pYy5yc3QgYi9Eb2MvaG93dG8vY2xpbmljLnJzdAppbmRleCBjYWE0OTc1Li5mNDM1ODg0IDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vY2xpbmljLnJzdAorKysgYi9Eb2MvaG93dG8vY2xpbmljLnJzdApAQCAtODI3LDkgKzgyNyw5IEBACiBgYCdpJ2BgICAgICBgYGludGBgCiBgYCdJJ2BgICAgICBgYHVuc2lnbmVkX2ludChiaXR3aXNlPVRydWUpYGAKIGBgJ2snYGAgICAgIGBgdW5zaWduZWRfbG9uZyhiaXR3aXNlPVRydWUpYGAKLWBgJ0snYGAgICAgIGBgdW5zaWduZWRfUFlfTE9OR19MT05HKGJpdHdpc2U9VHJ1ZSlgYAorYGAnSydgYCAgICAgYGB1bnNpZ25lZF9sb25nX2xvbmcoYml0d2lzZT1UcnVlKWBgCiBgYCdsJ2BgICAgICBgYGxvbmdgYAotYGAnTCdgYCAgICAgYGBQWV9MT05HX0xPTkdgYAorYGAnTCdgYCAgICAgYGBsb25nIGxvbmdgYAogYGAnbidgYCAgICAgYGBQeV9zc2l6ZV90YGAKIGBgJ08nYGAgICAgIGBgb2JqZWN0YGAKIGBgJ08hJ2BgICAgIGBgb2JqZWN0KHN1YmNsYXNzX29mPScmUHlTb21ldGhpbmdfVHlwZScpYGAKZGlmZiAtLWdpdCBhL0RvYy9pbmNsdWRlcy9lbWFpbC1hbHRlcm5hdGl2ZS1uZXctYXBpLnB5IGIvRG9jL2luY2x1ZGVzL2VtYWlsLWFsdGVybmF0aXZlLW5ldy1hcGkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMWY3MjcuLjAwMDAwMDAKLS0tIGEvRG9jL2luY2x1ZGVzL2VtYWlsLWFsdGVybmF0aXZlLW5ldy1hcGkucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0KLWltcG9ydCBzbXRwbGliCi0KLWZyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgRW1haWxNZXNzYWdlCi1mcm9tIGVtYWlsLmhlYWRlcnJlZ2lzdHJ5IGltcG9ydCBBZGRyZXNzCi1mcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBtYWtlX21zZ2lkCi0KLSMgQ3JlYXRlIHRoZSBiYXNlIHRleHQgbWVzc2FnZS4KLW1zZyA9IEVtYWlsTWVzc2FnZSgpCi1tc2dbJ1N1YmplY3QnXSA9ICJBeW9ucyBhc3BlcmdlcyBwb3VyIGxlIGTDqWpldW5lciIKLW1zZ1snRnJvbSddID0gQWRkcmVzcygiUGVww6kgTGUgUGV3IiwgInBlcGUiLCAiZXhhbXBsZS5jb20iKQotbXNnWydUbyddID0gKEFkZHJlc3MoIlBlbmVsb3BlIFB1c3N5Y2F0IiwgInBlbmVsb3BlIiwgImV4YW1wbGUuY29tIiksCi0gICAgICAgICAgICAgQWRkcmVzcygiRmFicmV0dGUgUHVzc3ljYXQiLCAiZmFicmV0dGUiLCAiZXhhbXBsZS5jb20iKSkKLW1zZy5zZXRfY29udGVudCgiIiJcCi1TYWx1dCEKLQotQ2VsYSByZXNzZW1ibGUgw6AgdW4gZXhjZWxsZW50IHJlY2lwaWVbMV0gZMOpamV1bmVyLgotCi1bMV0gaHR0cDovL3d3dy55dW1tbHkuY29tL3JlY2lwZS9Sb2FzdGVkLUFzcGFyYWd1cy1FcGljdXJpb3VzLTIwMzcxOAotCi0tLVBlcMOpCi0iIiIpCi0KLSMgQWRkIHRoZSBodG1sIHZlcnNpb24uICBUaGlzIGNvbnZlcnRzIHRoZSBtZXNzYWdlIGludG8gYSBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKLSMgY29udGFpbmVyLCB3aXRoIHRoZSBvcmlnaW5hbCB0ZXh0IG1lc3NhZ2UgYXMgdGhlIGZpcnN0IHBhcnQgYW5kIHRoZSBuZXcgaHRtbAotIyBtZXNzYWdlIGFzIHRoZSBzZWNvbmQgcGFydC4KLWFzcGFyYWd1c19jaWQgPSBtYWtlX21zZ2lkKCkKLW1zZy5hZGRfYWx0ZXJuYXRpdmUoIiIiXAotPGh0bWw+Ci0gIDxoZWFkPjwvaGVhZD4KLSAgPGJvZHk+Ci0gICAgPHA+U2FsdXQhPFxwPgotICAgIDxwPkNlbGEgcmVzc2VtYmxlIMOgIHVuIGV4Y2VsbGVudAotICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lnl1bW1seS5jb20vcmVjaXBlL1JvYXN0ZWQtQXNwYXJhZ3VzLUVwaWN1cmlvdXMtMjAzNzE4PgotICAgICAgICAgICAgcmVjaXBpZQotICAgICAgICA8L2E+IGTDqWpldW5lci4KLSAgICA8L3A+Ci0gICAgPGltZyBzcmM9ImNpZDp7YXNwYXJhZ3VzX2NpZH0iIFw+Ci0gIDwvYm9keT4KLTwvaHRtbD4KLSIiIi5mb3JtYXQoYXNwYXJhZ3VzX2NpZD1hc3BhcmFndXNfY2lkWzE6LTFdKSwgc3VidHlwZT0naHRtbCcpCi0jIG5vdGUgdGhhdCB3ZSBuZWVkZWQgdG8gcGVlbCB0aGUgPD4gb2ZmIHRoZSBtc2dpZCBmb3IgdXNlIGluIHRoZSBodG1sLgotCi0jIE5vdyBhZGQgdGhlIHJlbGF0ZWQgaW1hZ2UgdG8gdGhlIGh0bWwgcGFydC4KLXdpdGggb3Blbigicm9hc3RlZC1hc3BhcmFndXMuanBnIiwgJ3JiJykgYXMgaW1nOgotICAgIG1zZy5nZXRfcGF5bG9hZCgpWzFdLmFkZF9yZWxhdGVkKGltZy5yZWFkKCksICdpbWFnZScsICdqcGVnJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWQ9YXNwYXJhZ3VzX2NpZCkKLQotIyBNYWtlIGEgbG9jYWwgY29weSBvZiB3aGF0IHdlIGFyZSBnb2luZyB0byBzZW5kLgotd2l0aCBvcGVuKCdvdXRnb2luZy5tc2cnLCAnd2InKSBhcyBmOgotICAgIGYud3JpdGUoYnl0ZXMobXNnKSkKLQotIyBTZW5kIHRoZSBtZXNzYWdlIHZpYSBsb2NhbCBTTVRQIHNlcnZlci4KLXdpdGggc210cGxpYi5TTVRQKCdsb2NhbGhvc3QnKSBhcyBzOgotICAgIHMuc2VuZF9tZXNzYWdlKG1zZykKZGlmZiAtLWdpdCBhL0RvYy9pbmNsdWRlcy9lbWFpbC1hbHRlcm5hdGl2ZS5weSBiL0RvYy9pbmNsdWRlcy9lbWFpbC1hbHRlcm5hdGl2ZS5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDg1MDcwZjMuLjJlMTQyYjEKLS0tIGEvRG9jL2luY2x1ZGVzL2VtYWlsLWFsdGVybmF0aXZlLnB5CisrKyBiL0RvYy9pbmNsdWRlcy9lbWFpbC1hbHRlcm5hdGl2ZS5weQpAQCAtMiw0NyArMiw1NSBAQAogCiBpbXBvcnQgc210cGxpYgogCi1mcm9tIGVtYWlsLm1pbWUubXVsdGlwYXJ0IGltcG9ydCBNSU1FTXVsdGlwYXJ0Ci1mcm9tIGVtYWlsLm1pbWUudGV4dCBpbXBvcnQgTUlNRVRleHQKK2Zyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgRW1haWxNZXNzYWdlCitmcm9tIGVtYWlsLmhlYWRlcnJlZ2lzdHJ5IGltcG9ydCBBZGRyZXNzCitmcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBtYWtlX21zZ2lkCiAKLSMgbWUgPT0gbXkgZW1haWwgYWRkcmVzcwotIyB5b3UgPT0gcmVjaXBpZW50J3MgZW1haWwgYWRkcmVzcwotbWUgPSAibXlAZW1haWwuY29tIgoteW91ID0gInlvdXJAZW1haWwuY29tIgorIyBDcmVhdGUgdGhlIGJhc2UgdGV4dCBtZXNzYWdlLgorbXNnID0gRW1haWxNZXNzYWdlKCkKK21zZ1snU3ViamVjdCddID0gIkF5b25zIGFzcGVyZ2VzIHBvdXIgbGUgZMOpamV1bmVyIgorbXNnWydGcm9tJ10gPSBBZGRyZXNzKCJQZXDDqSBMZSBQZXciLCAicGVwZSIsICJleGFtcGxlLmNvbSIpCittc2dbJ1RvJ10gPSAoQWRkcmVzcygiUGVuZWxvcGUgUHVzc3ljYXQiLCAicGVuZWxvcGUiLCAiZXhhbXBsZS5jb20iKSwKKyAgICAgICAgICAgICBBZGRyZXNzKCJGYWJyZXR0ZSBQdXNzeWNhdCIsICJmYWJyZXR0ZSIsICJleGFtcGxlLmNvbSIpKQorbXNnLnNldF9jb250ZW50KCIiIlwKK1NhbHV0IQogCi0jIENyZWF0ZSBtZXNzYWdlIGNvbnRhaW5lciAtIHRoZSBjb3JyZWN0IE1JTUUgdHlwZSBpcyBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUuCi1tc2cgPSBNSU1FTXVsdGlwYXJ0KCdhbHRlcm5hdGl2ZScpCi1tc2dbJ1N1YmplY3QnXSA9ICJMaW5rIgotbXNnWydGcm9tJ10gPSBtZQotbXNnWydUbyddID0geW91CitDZWxhIHJlc3NlbWJsZSDDoCB1biBleGNlbGxlbnQgcmVjaXBpZVsxXSBkw6lqZXVuZXIuCiAKLSMgQ3JlYXRlIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIChhIHBsYWluLXRleHQgYW5kIGFuIEhUTUwgdmVyc2lvbikuCi10ZXh0ID0gIkhpIVxuSG93IGFyZSB5b3U/XG5IZXJlIGlzIHRoZSBsaW5rIHlvdSB3YW50ZWQ6XG5odHRwczovL3d3dy5weXRob24ub3JnIgotaHRtbCA9ICIiIlwKK1sxXSBodHRwOi8vd3d3Lnl1bW1seS5jb20vcmVjaXBlL1JvYXN0ZWQtQXNwYXJhZ3VzLUVwaWN1cmlvdXMtMjAzNzE4CisKKy0tUGVww6kKKyIiIikKKworIyBBZGQgdGhlIGh0bWwgdmVyc2lvbi4gIFRoaXMgY29udmVydHMgdGhlIG1lc3NhZ2UgaW50byBhIG11bHRpcGFydC9hbHRlcm5hdGl2ZQorIyBjb250YWluZXIsIHdpdGggdGhlIG9yaWdpbmFsIHRleHQgbWVzc2FnZSBhcyB0aGUgZmlyc3QgcGFydCBhbmQgdGhlIG5ldyBodG1sCisjIG1lc3NhZ2UgYXMgdGhlIHNlY29uZCBwYXJ0LgorYXNwYXJhZ3VzX2NpZCA9IG1ha2VfbXNnaWQoKQorbXNnLmFkZF9hbHRlcm5hdGl2ZSgiIiJcCiA8aHRtbD4KICAgPGhlYWQ+PC9oZWFkPgogICA8Ym9keT4KLSAgICA8cD5IaSE8YnI+Ci0gICAgICAgSG93IGFyZSB5b3U/PGJyPgotICAgICAgIEhlcmUgaXMgdGhlIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnB5dGhvbi5vcmciPmxpbms8L2E+IHlvdSB3YW50ZWQuCisgICAgPHA+U2FsdXQhPC9wPgorICAgIDxwPkNlbGEgcmVzc2VtYmxlIMOgIHVuIGV4Y2VsbGVudAorICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lnl1bW1seS5jb20vcmVjaXBlL1JvYXN0ZWQtQXNwYXJhZ3VzLUVwaWN1cmlvdXMtMjAzNzE4PgorICAgICAgICAgICAgcmVjaXBpZQorICAgICAgICA8L2E+IGTDqWpldW5lci4KICAgICA8L3A+CisgICAgPGltZyBzcmM9ImNpZDp7YXNwYXJhZ3VzX2NpZH0iIC8+CiAgIDwvYm9keT4KIDwvaHRtbD4KLSIiIgorIiIiLmZvcm1hdChhc3BhcmFndXNfY2lkPWFzcGFyYWd1c19jaWRbMTotMV0pLCBzdWJ0eXBlPSdodG1sJykKKyMgbm90ZSB0aGF0IHdlIG5lZWRlZCB0byBwZWVsIHRoZSA8PiBvZmYgdGhlIG1zZ2lkIGZvciB1c2UgaW4gdGhlIGh0bWwuCiAKLSMgUmVjb3JkIHRoZSBNSU1FIHR5cGVzIG9mIGJvdGggcGFydHMgLSB0ZXh0L3BsYWluIGFuZCB0ZXh0L2h0bWwuCi1wYXJ0MSA9IE1JTUVUZXh0KHRleHQsICdwbGFpbicpCi1wYXJ0MiA9IE1JTUVUZXh0KGh0bWwsICdodG1sJykKKyMgTm93IGFkZCB0aGUgcmVsYXRlZCBpbWFnZSB0byB0aGUgaHRtbCBwYXJ0Lgord2l0aCBvcGVuKCJyb2FzdGVkLWFzcGFyYWd1cy5qcGciLCAncmInKSBhcyBpbWc6CisgICAgbXNnLmdldF9wYXlsb2FkKClbMV0uYWRkX3JlbGF0ZWQoaW1nLnJlYWQoKSwgJ2ltYWdlJywgJ2pwZWcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZD1hc3BhcmFndXNfY2lkKQogCi0jIEF0dGFjaCBwYXJ0cyBpbnRvIG1lc3NhZ2UgY29udGFpbmVyLgotIyBBY2NvcmRpbmcgdG8gUkZDIDIwNDYsIHRoZSBsYXN0IHBhcnQgb2YgYSBtdWx0aXBhcnQgbWVzc2FnZSwgaW4gdGhpcyBjYXNlCi0jIHRoZSBIVE1MIG1lc3NhZ2UsIGlzIGJlc3QgYW5kIHByZWZlcnJlZC4KLW1zZy5hdHRhY2gocGFydDEpCi1tc2cuYXR0YWNoKHBhcnQyKQorIyBNYWtlIGEgbG9jYWwgY29weSBvZiB3aGF0IHdlIGFyZSBnb2luZyB0byBzZW5kLgord2l0aCBvcGVuKCdvdXRnb2luZy5tc2cnLCAnd2InKSBhcyBmOgorICAgIGYud3JpdGUoYnl0ZXMobXNnKSkKIAogIyBTZW5kIHRoZSBtZXNzYWdlIHZpYSBsb2NhbCBTTVRQIHNlcnZlci4KLXMgPSBzbXRwbGliLlNNVFAoJ2xvY2FsaG9zdCcpCi0jIHNlbmRtYWlsIGZ1bmN0aW9uIHRha2VzIDMgYXJndW1lbnRzOiBzZW5kZXIncyBhZGRyZXNzLCByZWNpcGllbnQncyBhZGRyZXNzCi0jIGFuZCBtZXNzYWdlIHRvIHNlbmQgLSBoZXJlIGl0IGlzIHNlbnQgYXMgb25lIHN0cmluZy4KLXMuc2VuZG1haWwobWUsIHlvdSwgbXNnLmFzX3N0cmluZygpKQotcy5xdWl0KCkKK3dpdGggc210cGxpYi5TTVRQKCdsb2NhbGhvc3QnKSBhcyBzOgorICAgIHMuc2VuZF9tZXNzYWdlKG1zZykKZGlmZiAtLWdpdCBhL0RvYy9pbmNsdWRlcy9lbWFpbC1kaXIucHkgYi9Eb2MvaW5jbHVkZXMvZW1haWwtZGlyLnB5CmluZGV4IDNjN2M3NzAuLjBkY2ZiZmIgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy9lbWFpbC1kaXIucHkKKysrIGIvRG9jL2luY2x1ZGVzL2VtYWlsLWRpci5weQpAQCAtMywyMiArMywxNCBAQAogIiIiU2VuZCB0aGUgY29udGVudHMgb2YgYSBkaXJlY3RvcnkgYXMgYSBNSU1FIG1lc3NhZ2UuIiIiCiAKIGltcG9ydCBvcwotaW1wb3J0IHN5cwogaW1wb3J0IHNtdHBsaWIKICMgRm9yIGd1ZXNzaW5nIE1JTUUgdHlwZSBiYXNlZCBvbiBmaWxlIG5hbWUgZXh0ZW5zaW9uCiBpbXBvcnQgbWltZXR5cGVzCiAKIGZyb20gYXJncGFyc2UgaW1wb3J0IEFyZ3VtZW50UGFyc2VyCiAKLWZyb20gZW1haWwgaW1wb3J0IGVuY29kZXJzCi1mcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKLWZyb20gZW1haWwubWltZS5hdWRpbyBpbXBvcnQgTUlNRUF1ZGlvCi1mcm9tIGVtYWlsLm1pbWUuYmFzZSBpbXBvcnQgTUlNRUJhc2UKLWZyb20gZW1haWwubWltZS5pbWFnZSBpbXBvcnQgTUlNRUltYWdlCi1mcm9tIGVtYWlsLm1pbWUubXVsdGlwYXJ0IGltcG9ydCBNSU1FTXVsdGlwYXJ0Ci1mcm9tIGVtYWlsLm1pbWUudGV4dCBpbXBvcnQgTUlNRVRleHQKLQotQ09NTUFTUEFDRSA9ICcsICcKK2Zyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgRW1haWxNZXNzYWdlCitmcm9tIGVtYWlsLnBvbGljeSBpbXBvcnQgU01UUAogCiAKIGRlZiBtYWluKCk6CkBAIC00NywxMiArMzksMTIgQEAKICAgICBkaXJlY3RvcnkgPSBhcmdzLmRpcmVjdG9yeQogICAgIGlmIG5vdCBkaXJlY3Rvcnk6CiAgICAgICAgIGRpcmVjdG9yeSA9ICcuJwotICAgICMgQ3JlYXRlIHRoZSBlbmNsb3NpbmcgKG91dGVyKSBtZXNzYWdlCi0gICAgb3V0ZXIgPSBNSU1FTXVsdGlwYXJ0KCkKLSAgICBvdXRlclsnU3ViamVjdCddID0gJ0NvbnRlbnRzIG9mIGRpcmVjdG9yeSAlcycgJSBvcy5wYXRoLmFic3BhdGgoZGlyZWN0b3J5KQotICAgIG91dGVyWydUbyddID0gQ09NTUFTUEFDRS5qb2luKGFyZ3MucmVjaXBpZW50cykKLSAgICBvdXRlclsnRnJvbSddID0gYXJncy5zZW5kZXIKLSAgICBvdXRlci5wcmVhbWJsZSA9ICdZb3Ugd2lsbCBub3Qgc2VlIHRoaXMgaW4gYSBNSU1FLWF3YXJlIG1haWwgcmVhZGVyLlxuJworICAgICMgQ3JlYXRlIHRoZSBtZXNzYWdlCisgICAgbXNnID0gRW1haWxNZXNzYWdlKCkKKyAgICBtc2dbJ1N1YmplY3QnXSA9ICdDb250ZW50cyBvZiBkaXJlY3RvcnkgJXMnICUgb3MucGF0aC5hYnNwYXRoKGRpcmVjdG9yeSkKKyAgICBtc2dbJ1RvJ10gPSAnLCAnLmpvaW4oYXJncy5yZWNpcGllbnRzKQorICAgIG1zZ1snRnJvbSddID0gYXJncy5zZW5kZXIKKyAgICBtc2cucHJlYW1ibGUgPSAnWW91IHdpbGwgbm90IHNlZSB0aGlzIGluIGEgTUlNRS1hd2FyZSBtYWlsIHJlYWRlci5cbicKIAogICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBmaWxlbmFtZSkKQEAgLTY3LDMzICs1OSwxOCBAQAogICAgICAgICAgICAgIyB1c2UgYSBnZW5lcmljIGJhZy1vZi1iaXRzIHR5cGUuCiAgICAgICAgICAgICBjdHlwZSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nCiAgICAgICAgIG1haW50eXBlLCBzdWJ0eXBlID0gY3R5cGUuc3BsaXQoJy8nLCAxKQotICAgICAgICBpZiBtYWludHlwZSA9PSAndGV4dCc6Ci0gICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCkgYXMgZnA6Ci0gICAgICAgICAgICAgICAgIyBOb3RlOiB3ZSBzaG91bGQgaGFuZGxlIGNhbGN1bGF0aW5nIHRoZSBjaGFyc2V0Ci0gICAgICAgICAgICAgICAgbXNnID0gTUlNRVRleHQoZnAucmVhZCgpLCBfc3VidHlwZT1zdWJ0eXBlKQotICAgICAgICBlbGlmIG1haW50eXBlID09ICdpbWFnZSc6Ci0gICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZnA6Ci0gICAgICAgICAgICAgICAgbXNnID0gTUlNRUltYWdlKGZwLnJlYWQoKSwgX3N1YnR5cGU9c3VidHlwZSkKLSAgICAgICAgZWxpZiBtYWludHlwZSA9PSAnYXVkaW8nOgotICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGZwOgotICAgICAgICAgICAgICAgIG1zZyA9IE1JTUVBdWRpbyhmcC5yZWFkKCksIF9zdWJ0eXBlPXN1YnR5cGUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZnA6Ci0gICAgICAgICAgICAgICAgbXNnID0gTUlNRUJhc2UobWFpbnR5cGUsIHN1YnR5cGUpCi0gICAgICAgICAgICAgICAgbXNnLnNldF9wYXlsb2FkKGZwLnJlYWQoKSkKLSAgICAgICAgICAgICMgRW5jb2RlIHRoZSBwYXlsb2FkIHVzaW5nIEJhc2U2NAotICAgICAgICAgICAgZW5jb2RlcnMuZW5jb2RlX2Jhc2U2NChtc2cpCi0gICAgICAgICMgU2V0IHRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIKLSAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsIGZpbGVuYW1lPWZpbGVuYW1lKQotICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZnA6CisgICAgICAgICAgICBtc2cuYWRkX2F0dGFjaG1lbnQoZnAucmVhZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW50eXBlPW1haW50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU9c3VidHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT1maWxlbmFtZSkKICAgICAjIE5vdyBzZW5kIG9yIHN0b3JlIHRoZSBtZXNzYWdlCi0gICAgY29tcG9zZWQgPSBvdXRlci5hc19zdHJpbmcoKQogICAgIGlmIGFyZ3Mub3V0cHV0OgotICAgICAgICB3aXRoIG9wZW4oYXJncy5vdXRwdXQsICd3JykgYXMgZnA6Ci0gICAgICAgICAgICBmcC53cml0ZShjb21wb3NlZCkKKyAgICAgICAgd2l0aCBvcGVuKGFyZ3Mub3V0cHV0LCAnd2InKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKG1zZy5hc19ieXRlcyhwb2xpY3k9U01UUCkpCiAgICAgZWxzZToKICAgICAgICAgd2l0aCBzbXRwbGliLlNNVFAoJ2xvY2FsaG9zdCcpIGFzIHM6Ci0gICAgICAgICAgICBzLnNlbmRtYWlsKGFyZ3Muc2VuZGVyLCBhcmdzLnJlY2lwaWVudHMsIGNvbXBvc2VkKQorICAgICAgICAgICAgcy5zZW5kX21lc3NhZ2UobXNnKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvZW1haWwtaGVhZGVycy5weSBiL0RvYy9pbmNsdWRlcy9lbWFpbC1oZWFkZXJzLnB5CmluZGV4IDg5YzhmM2EuLjJjNDIxNDUgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy9lbWFpbC1oZWFkZXJzLnB5CisrKyBiL0RvYy9pbmNsdWRlcy9lbWFpbC1oZWFkZXJzLnB5CkBAIC0xLDE4ICsxLDI0IEBACiAjIEltcG9ydCB0aGUgZW1haWwgbW9kdWxlcyB3ZSdsbCBuZWVkCi1mcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgUGFyc2VyCitmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgQnl0ZXNQYXJzZXIsIFBhcnNlcgorZnJvbSBlbWFpbC5wb2xpY3kgaW1wb3J0IGRlZmF1bHQKIAogIyBJZiB0aGUgZS1tYWlsIGhlYWRlcnMgYXJlIGluIGEgZmlsZSwgdW5jb21tZW50IHRoZXNlIHR3byBsaW5lczoKLSMgd2l0aCBvcGVuKG1lc3NhZ2VmaWxlKSBhcyBmcDoKLSMgICAgIGhlYWRlcnMgPSBQYXJzZXIoKS5wYXJzZShmcCkKKyMgd2l0aCBvcGVuKG1lc3NhZ2VmaWxlLCAncmInKSBhcyBmcDoKKyMgICAgIGhlYWRlcnMgPSBCeXRlc1BhcnNlcihwb2xpY3k9ZGVmYXVsdCkucGFyc2UoZnApCiAKLSMgIE9yIGZvciBwYXJzaW5nIGhlYWRlcnMgaW4gYSBzdHJpbmcsIHVzZToKLWhlYWRlcnMgPSBQYXJzZXIoKS5wYXJzZXN0cignRnJvbTogPHVzZXJAZXhhbXBsZS5jb20+XG4nCisjICBPciBmb3IgcGFyc2luZyBoZWFkZXJzIGluIGEgc3RyaW5nICh0aGlzIGlzIGFuIHVuY29tbW9uIG9wZXJhdGlvbiksIHVzZToKK2hlYWRlcnMgPSBQYXJzZXIocG9saWN5PWRlZmF1bHQpLnBhcnNlc3RyKAorICAgICAgICAnRnJvbTogRm9vIEJhciA8dXNlckBleGFtcGxlLmNvbT5cbicKICAgICAgICAgJ1RvOiA8c29tZW9uZV9lbHNlQGV4YW1wbGUuY29tPlxuJwogICAgICAgICAnU3ViamVjdDogVGVzdCBtZXNzYWdlXG4nCiAgICAgICAgICdcbicKICAgICAgICAgJ0JvZHkgd291bGQgZ28gaGVyZVxuJykKIAogIyAgTm93IHRoZSBoZWFkZXIgaXRlbXMgY2FuIGJlIGFjY2Vzc2VkIGFzIGEgZGljdGlvbmFyeToKLXByaW50KCdUbzogJXMnICUgaGVhZGVyc1sndG8nXSkKLXByaW50KCdGcm9tOiAlcycgJSBoZWFkZXJzWydmcm9tJ10pCi1wcmludCgnU3ViamVjdDogJXMnICUgaGVhZGVyc1snc3ViamVjdCddKQorcHJpbnQoJ1RvOiB7fScuZm9ybWF0KGhlYWRlcnNbJ3RvJ10pKQorcHJpbnQoJ0Zyb206IHt9Jy5mb3JtYXQoaGVhZGVyc1snZnJvbSddKSkKK3ByaW50KCdTdWJqZWN0OiB7fScuZm9ybWF0KGhlYWRlcnNbJ3N1YmplY3QnXSkpCisKKyMgWW91IGNhbiBhbHNvIGFjY2VzcyB0aGUgcGFydHMgb2YgdGhlIGFkZHJlc3NlczoKK3ByaW50KCdSZWNpcGllbnQgdXNlcm5hbWU6IHt9Jy5mb3JtYXQoaGVhZGVyc1sndG8nXS5hZGRyZXNzZXNbMF0udXNlcm5hbWUpKQorcHJpbnQoJ1NlbmRlciBuYW1lOiB7fScuZm9ybWF0KGhlYWRlcnNbJ2Zyb20nXS5hZGRyZXNzZXNbMF0uZGlzcGxheV9uYW1lKSkKZGlmZiAtLWdpdCBhL0RvYy9pbmNsdWRlcy9lbWFpbC1taW1lLnB5IGIvRG9jL2luY2x1ZGVzL2VtYWlsLW1pbWUucHkKaW5kZXggNjFkMDgzMC4uYzYxMDI0MiAxMDA2NDQKLS0tIGEvRG9jL2luY2x1ZGVzL2VtYWlsLW1pbWUucHkKKysrIGIvRG9jL2luY2x1ZGVzL2VtYWlsLW1pbWUucHkKQEAgLTEsMzAgKzEsMjkgQEAKICMgSW1wb3J0IHNtdHBsaWIgZm9yIHRoZSBhY3R1YWwgc2VuZGluZyBmdW5jdGlvbgogaW1wb3J0IHNtdHBsaWIKIAorIyBBbmQgaW1naGRyIHRvIGZpbmQgdGhlIHR5cGVzIG9mIG91ciBpbWFnZXMKK2ltcG9ydCBpbWdoZHIKKwogIyBIZXJlIGFyZSB0aGUgZW1haWwgcGFja2FnZSBtb2R1bGVzIHdlJ2xsIG5lZWQKLWZyb20gZW1haWwubWltZS5pbWFnZSBpbXBvcnQgTUlNRUltYWdlCi1mcm9tIGVtYWlsLm1pbWUubXVsdGlwYXJ0IGltcG9ydCBNSU1FTXVsdGlwYXJ0Citmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IEVtYWlsTWVzc2FnZQogCi1DT01NQVNQQUNFID0gJywgJwotCi0jIENyZWF0ZSB0aGUgY29udGFpbmVyIChvdXRlcikgZW1haWwgbWVzc2FnZS4KLW1zZyA9IE1JTUVNdWx0aXBhcnQoKQorIyBDcmVhdGUgdGhlIGNvbnRhaW5lciBlbWFpbCBtZXNzYWdlLgorbXNnID0gRW1haWxNZXNzYWdlKCkKIG1zZ1snU3ViamVjdCddID0gJ091ciBmYW1pbHkgcmV1bmlvbicKICMgbWUgPT0gdGhlIHNlbmRlcidzIGVtYWlsIGFkZHJlc3MKICMgZmFtaWx5ID0gdGhlIGxpc3Qgb2YgYWxsIHJlY2lwaWVudHMnIGVtYWlsIGFkZHJlc3NlcwogbXNnWydGcm9tJ10gPSBtZQotbXNnWydUbyddID0gQ09NTUFTUEFDRS5qb2luKGZhbWlseSkKK21zZ1snVG8nXSA9ICcsICcuam9pbihmYW1pbHkpCiBtc2cucHJlYW1ibGUgPSAnT3VyIGZhbWlseSByZXVuaW9uJwogCi0jIEFzc3VtZSB3ZSBrbm93IHRoYXQgdGhlIGltYWdlIGZpbGVzIGFyZSBhbGwgaW4gUE5HIGZvcm1hdAorIyBPcGVuIHRoZSBmaWxlcyBpbiBiaW5hcnkgbW9kZS4gIFVzZSBpbWdoZHIgdG8gZmlndXJlIG91dCB0aGUKKyMgTUlNRSBzdWJ0eXBlIGZvciBlYWNoIHNwZWNpZmljIGltYWdlLgogZm9yIGZpbGUgaW4gcG5nZmlsZXM6Ci0gICAgIyBPcGVuIHRoZSBmaWxlcyBpbiBiaW5hcnkgbW9kZS4gIExldCB0aGUgTUlNRUltYWdlIGNsYXNzIGF1dG9tYXRpY2FsbHkKLSAgICAjIGd1ZXNzIHRoZSBzcGVjaWZpYyBpbWFnZSB0eXBlLgogICAgIHdpdGggb3BlbihmaWxlLCAncmInKSBhcyBmcDoKLSAgICAgICAgaW1nID0gTUlNRUltYWdlKGZwLnJlYWQoKSkKLSAgICBtc2cuYXR0YWNoKGltZykKKyAgICAgICAgaW1nX2RhdGEgPSBmcC5yZWFkKCkKKyAgICBtc2cuYWRkX2F0dGFjaG1lbnQoaW1nX2RhdGEsIG1haW50eXBlPSdpbWFnZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlPWltZ2hkci53aGF0KE5vbmUsIGltZ19kYXRhKSkKIAogIyBTZW5kIHRoZSBlbWFpbCB2aWEgb3VyIG93biBTTVRQIHNlcnZlci4KLXMgPSBzbXRwbGliLlNNVFAoJ2xvY2FsaG9zdCcpCi1zLnNlbmRfbWVzc2FnZShtc2cpCi1zLnF1aXQoKQord2l0aCBzbXRwbGliLlNNVFAoJ2xvY2FsaG9zdCcpIGFzIHM6CisgICAgcy5zZW5kX21lc3NhZ2UobXNnKQpkaWZmIC0tZ2l0IGEvRG9jL2luY2x1ZGVzL2VtYWlsLXJlYWQtYWx0ZXJuYXRpdmUtbmV3LWFwaS5weSBiL0RvYy9pbmNsdWRlcy9lbWFpbC1yZWFkLWFsdGVybmF0aXZlLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2MvaW5jbHVkZXMvZW1haWwtcmVhZC1hbHRlcm5hdGl2ZS1uZXctYXBpLnB5CnJlbmFtZSB0byBEb2MvaW5jbHVkZXMvZW1haWwtcmVhZC1hbHRlcm5hdGl2ZS5weQpkaWZmIC0tZ2l0IGEvRG9jL2luY2x1ZGVzL2VtYWlsLXNpbXBsZS5weSBiL0RvYy9pbmNsdWRlcy9lbWFpbC1zaW1wbGUucHkKaW5kZXggYjliOGI0MS4uZjY5ZWY0MCAxMDA2NDQKLS0tIGEvRG9jL2luY2x1ZGVzL2VtYWlsLXNpbXBsZS5weQorKysgYi9Eb2MvaW5jbHVkZXMvZW1haWwtc2ltcGxlLnB5CkBAIC0yLDEzICsyLDEzIEBACiBpbXBvcnQgc210cGxpYgogCiAjIEltcG9ydCB0aGUgZW1haWwgbW9kdWxlcyB3ZSdsbCBuZWVkCi1mcm9tIGVtYWlsLm1pbWUudGV4dCBpbXBvcnQgTUlNRVRleHQKK2Zyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgRW1haWxNZXNzYWdlCiAKLSMgT3BlbiBhIHBsYWluIHRleHQgZmlsZSBmb3IgcmVhZGluZy4gIEZvciB0aGlzIGV4YW1wbGUsIGFzc3VtZSB0aGF0Ci0jIHRoZSB0ZXh0IGZpbGUgY29udGFpbnMgb25seSBBU0NJSSBjaGFyYWN0ZXJzLgorIyBPcGVuIHRoZSBwbGFpbiB0ZXh0IGZpbGUgd2hvc2UgbmFtZSBpcyBpbiB0ZXh0ZmlsZSBmb3IgcmVhZGluZy4KIHdpdGggb3Blbih0ZXh0ZmlsZSkgYXMgZnA6CiAgICAgIyBDcmVhdGUgYSB0ZXh0L3BsYWluIG1lc3NhZ2UKLSAgICBtc2cgPSBNSU1FVGV4dChmcC5yZWFkKCkpCisgICAgbXNnID0gRW1haWxNZXNzYWdlKCkKKyAgICBtc2cuc2V0X2NvbnRlbnQoZnAucmVhZCgpKQogCiAjIG1lID09IHRoZSBzZW5kZXIncyBlbWFpbCBhZGRyZXNzCiAjIHlvdSA9PSB0aGUgcmVjaXBpZW50J3MgZW1haWwgYWRkcmVzcwpkaWZmIC0tZ2l0IGEvRG9jL2luY2x1ZGVzL2VtYWlsLXVucGFjay5weSBiL0RvYy9pbmNsdWRlcy9lbWFpbC11bnBhY2sucHkKaW5kZXggNTc0YTBiNi4uZTBhN2YwMSAxMDA2NDQKLS0tIGEvRG9jL2luY2x1ZGVzL2VtYWlsLXVucGFjay5weQorKysgYi9Eb2MvaW5jbHVkZXMvZW1haWwtdW5wYWNrLnB5CkBAIC0zLDExICszLDExIEBACiAiIiJVbnBhY2sgYSBNSU1FIG1lc3NhZ2UgaW50byBhIGRpcmVjdG9yeSBvZiBmaWxlcy4iIiIKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgZW1haWwKLWltcG9ydCBlcnJubwogaW1wb3J0IG1pbWV0eXBlcwogCitmcm9tIGVtYWlsLnBvbGljeSBpbXBvcnQgZGVmYXVsdAorCiBmcm9tIGFyZ3BhcnNlIGltcG9ydCBBcmd1bWVudFBhcnNlcgogCiAKQEAgLTIyLDggKzIyLDggQEAKICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdtc2dmaWxlJykKICAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogCi0gICAgd2l0aCBvcGVuKGFyZ3MubXNnZmlsZSkgYXMgZnA6Ci0gICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgIHdpdGggb3BlbihhcmdzLm1zZ2ZpbGUsICdyYicpIGFzIGZwOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fYmluYXJ5X2ZpbGUoZnAsIHBvbGljeT1kZWZhdWx0KQogCiAgICAgdHJ5OgogICAgICAgICBvcy5ta2RpcihhcmdzLmRpcmVjdG9yeSkKZGlmZiAtLWdpdCBhL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jIGIvRG9jL2luY2x1ZGVzL3J1bi1mdW5jLmMKaW5kZXggOTg2ZDY3MC4uZWFkN2JkZCAxMDA2NDQKLS0tIGEvRG9jL2luY2x1ZGVzL3J1bi1mdW5jLmMKKysrIGIvRG9jL2luY2x1ZGVzL3J1bi1mdW5jLmMKQEAgLTYzLDYgKzYzLDggQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gbG9hZCBcIiVzXCJcbiIsIGFyZ3ZbMV0pOwogICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICByZXR1cm4gMTIwOworICAgIH0KICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL0RvYy9pbmNsdWRlcy90ZXN0LnB5IGIvRG9jL2luY2x1ZGVzL3Rlc3QucHkKaW5kZXggN2ViZjQ2YS4uOWU5ZDRhNiAxMDA2NDQKLS0tIGEvRG9jL2luY2x1ZGVzL3Rlc3QucHkKKysrIGIvRG9jL2luY2x1ZGVzL3Rlc3QucHkKQEAgLTIwNCw3ICsyMDQsNyBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KLVBMQVRfU1BFQyA9ICIlcy0lcyIgJSAoZ2V0X3BsYXRmb3JtKCksIHN5cy52ZXJzaW9uWzA6M10pCitQTEFUX1NQRUMgPSAiJXMtJWQuJWQiICUgKGdldF9wbGF0Zm9ybSgpLCAqc3lzLnZlcnNpb25faW5mb1s6Ml0pCiBzcmMgPSBvcy5wYXRoLmpvaW4oImJ1aWxkIiwgImxpYi4lcyIgJSBQTEFUX1NQRUMpCiBzeXMucGF0aC5hcHBlbmQoc3JjKQogCmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvdHppbmZvLWV4YW1wbGVzLnB5IGIvRG9jL2luY2x1ZGVzL3R6aW5mby1leGFtcGxlcy5weQppbmRleCAzYThjZjQ3Li5hZTVhNTA5IDEwMDY0NAotLS0gYS9Eb2MvaW5jbHVkZXMvdHppbmZvLWV4YW1wbGVzLnB5CisrKyBiL0RvYy9pbmNsdWRlcy90emluZm8tZXhhbXBsZXMucHkKQEAgLTEsNDYgKzEsMTMgQEAKLWZyb20gZGF0ZXRpbWUgaW1wb3J0IHR6aW5mbywgdGltZWRlbHRhLCBkYXRldGltZQorZnJvbSBkYXRldGltZSBpbXBvcnQgdHppbmZvLCB0aW1lZGVsdGEsIGRhdGV0aW1lLCB0aW1lem9uZQogCiBaRVJPID0gdGltZWRlbHRhKDApCiBIT1VSID0gdGltZWRlbHRhKGhvdXJzPTEpCi0KLSMgQSBVVEMgY2xhc3MuCi0KLWNsYXNzIFVUQyh0emluZm8pOgotICAgICIiIlVUQyIiIgotCi0gICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6Ci0gICAgICAgIHJldHVybiBaRVJPCi0KLSAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KToKLSAgICAgICAgcmV0dXJuICJVVEMiCi0KLSAgICBkZWYgZHN0KHNlbGYsIGR0KToKLSAgICAgICAgcmV0dXJuIFpFUk8KLQotdXRjID0gVVRDKCkKLQotIyBBIGNsYXNzIGJ1aWxkaW5nIHR6aW5mbyBvYmplY3RzIGZvciBmaXhlZC1vZmZzZXQgdGltZSB6b25lcy4KLSMgTm90ZSB0aGF0IEZpeGVkT2Zmc2V0KDAsICJVVEMiKSBpcyBhIGRpZmZlcmVudCB3YXkgdG8gYnVpbGQgYQotIyBVVEMgdHppbmZvIG9iamVjdC4KLQotY2xhc3MgRml4ZWRPZmZzZXQodHppbmZvKToKLSAgICAiIiJGaXhlZCBvZmZzZXQgaW4gbWludXRlcyBlYXN0IGZyb20gVVRDLiIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mZnNldCwgbmFtZSk6Ci0gICAgICAgIHNlbGYuX19vZmZzZXQgPSB0aW1lZGVsdGEobWludXRlcz1vZmZzZXQpCi0gICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQotCi0gICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9fb2Zmc2V0Ci0KLSAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KToKLSAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lCi0KLSAgICBkZWYgZHN0KHNlbGYsIGR0KToKLSAgICAgICAgcmV0dXJuIFpFUk8KK1NFQ09ORCA9IHRpbWVkZWx0YShzZWNvbmRzPTEpCiAKICMgQSBjbGFzcyBjYXB0dXJpbmcgdGhlIHBsYXRmb3JtJ3MgaWRlYSBvZiBsb2NhbCB0aW1lLgotCisjIChNYXkgcmVzdWx0IGluIHdyb25nIHZhbHVlcyBvbiBoaXN0b3JpY2FsIHRpbWVzIGluCisjICB0aW1lem9uZXMgd2hlcmUgVVRDIG9mZnNldCBhbmQvb3IgdGhlIERTVCBydWxlcyBoYWQKKyMgIGNoYW5nZWQgaW4gdGhlIHBhc3QuKQogaW1wb3J0IHRpbWUgYXMgX3RpbWUKIAogU1RET0ZGU0VUID0gdGltZWRlbHRhKHNlY29uZHMgPSAtX3RpbWUudGltZXpvbmUpCkBAIC01Myw2ICsyMCwxNiBAQAogCiBjbGFzcyBMb2NhbFRpbWV6b25lKHR6aW5mbyk6CiAKKyAgICBkZWYgZnJvbXV0YyhzZWxmLCBkdCk6CisgICAgICAgIGFzc2VydCBkdC50emluZm8gaXMgc2VsZgorICAgICAgICBzdGFtcCA9IChkdCAtIGRhdGV0aW1lKDE5NzAsIDEsIDEsIHR6aW5mbz1zZWxmKSkgLy8gU0VDT05ECisgICAgICAgIGFyZ3MgPSBfdGltZS5sb2NhbHRpbWUoc3RhbXApWzo2XQorICAgICAgICBkc3RfZGlmZiA9IERTVERJRkYgLy8gU0VDT05ECisgICAgICAgICMgRGV0ZWN0IGZvbGQKKyAgICAgICAgZm9sZCA9IChhcmdzID09IF90aW1lLmxvY2FsdGltZShzdGFtcCAtIGRzdF9kaWZmKSkKKyAgICAgICAgcmV0dXJuIGRhdGV0aW1lKCphcmdzLCBtaWNyb3NlY29uZD1kdC5taWNyb3NlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbz1zZWxmLCBmb2xkPWZvbGQpCisKICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKICAgICAgICAgaWYgc2VsZi5faXNkc3QoZHQpOgogICAgICAgICAgICAgcmV0dXJuIERTVE9GRlNFVApAQCAtOTksMjAgKzc2LDM3IEBACiAjIEluIHRoZSBVUywgc2luY2UgMjAwNywgRFNUIHN0YXJ0cyBhdCAyYW0gKHN0YW5kYXJkIHRpbWUpIG9uIHRoZSBzZWNvbmQKICMgU3VuZGF5IGluIE1hcmNoLCB3aGljaCBpcyB0aGUgZmlyc3QgU3VuZGF5IG9uIG9yIGFmdGVyIE1hciA4LgogRFNUU1RBUlRfMjAwNyA9IGRhdGV0aW1lKDEsIDMsIDgsIDIpCi0jIGFuZCBlbmRzIGF0IDJhbSAoRFNUIHRpbWU7IDFhbSBzdGFuZGFyZCB0aW1lKSBvbiB0aGUgZmlyc3QgU3VuZGF5IG9mIE5vdi4KLURTVEVORF8yMDA3ID0gZGF0ZXRpbWUoMSwgMTEsIDEsIDEpCisjIGFuZCBlbmRzIGF0IDJhbSAoRFNUIHRpbWUpIG9uIHRoZSBmaXJzdCBTdW5kYXkgb2YgTm92LgorRFNURU5EXzIwMDcgPSBkYXRldGltZSgxLCAxMSwgMSwgMikKICMgRnJvbSAxOTg3IHRvIDIwMDYsIERTVCB1c2VkIHRvIHN0YXJ0IGF0IDJhbSAoc3RhbmRhcmQgdGltZSkgb24gdGhlIGZpcnN0Ci0jIFN1bmRheSBpbiBBcHJpbCBhbmQgdG8gZW5kIGF0IDJhbSAoRFNUIHRpbWU7IDFhbSBzdGFuZGFyZCB0aW1lKSBvbiB0aGUgbGFzdAorIyBTdW5kYXkgaW4gQXByaWwgYW5kIHRvIGVuZCBhdCAyYW0gKERTVCB0aW1lKSBvbiB0aGUgbGFzdAogIyBTdW5kYXkgb2YgT2N0b2Jlciwgd2hpY2ggaXMgdGhlIGZpcnN0IFN1bmRheSBvbiBvciBhZnRlciBPY3QgMjUuCiBEU1RTVEFSVF8xOTg3XzIwMDYgPSBkYXRldGltZSgxLCA0LCAxLCAyKQotRFNURU5EXzE5ODdfMjAwNiA9IGRhdGV0aW1lKDEsIDEwLCAyNSwgMSkKK0RTVEVORF8xOTg3XzIwMDYgPSBkYXRldGltZSgxLCAxMCwgMjUsIDIpCiAjIEZyb20gMTk2NyB0byAxOTg2LCBEU1QgdXNlZCB0byBzdGFydCBhdCAyYW0gKHN0YW5kYXJkIHRpbWUpIG9uIHRoZSBsYXN0Ci0jIFN1bmRheSBpbiBBcHJpbCAodGhlIG9uZSBvbiBvciBhZnRlciBBcHJpbCAyNCkgYW5kIHRvIGVuZCBhdCAyYW0gKERTVCB0aW1lOwotIyAxYW0gc3RhbmRhcmQgdGltZSkgb24gdGhlIGxhc3QgU3VuZGF5IG9mIE9jdG9iZXIsIHdoaWNoIGlzIHRoZSBmaXJzdCBTdW5kYXkKKyMgU3VuZGF5IGluIEFwcmlsICh0aGUgb25lIG9uIG9yIGFmdGVyIEFwcmlsIDI0KSBhbmQgdG8gZW5kIGF0IDJhbSAoRFNUIHRpbWUpCisjIG9uIHRoZSBsYXN0IFN1bmRheSBvZiBPY3RvYmVyLCB3aGljaCBpcyB0aGUgZmlyc3QgU3VuZGF5CiAjIG9uIG9yIGFmdGVyIE9jdCAyNS4KIERTVFNUQVJUXzE5NjdfMTk4NiA9IGRhdGV0aW1lKDEsIDQsIDI0LCAyKQogRFNURU5EXzE5NjdfMTk4NiA9IERTVEVORF8xOTg3XzIwMDYKIAorZGVmIHVzX2RzdF9yYW5nZSh5ZWFyKToKKyAgICAjIEZpbmQgc3RhcnQgYW5kIGVuZCB0aW1lcyBmb3IgVVMgRFNULiBGb3IgeWVhcnMgYmVmb3JlIDE5NjcsIHJldHVybgorICAgICMgc3RhcnQgPSBlbmQgZm9yIG5vIERTVC4KKyAgICBpZiAyMDA2IDwgeWVhcjoKKyAgICAgICAgZHN0c3RhcnQsIGRzdGVuZCA9IERTVFNUQVJUXzIwMDcsIERTVEVORF8yMDA3CisgICAgZWxpZiAxOTg2IDwgeWVhciA8IDIwMDc6CisgICAgICAgIGRzdHN0YXJ0LCBkc3RlbmQgPSBEU1RTVEFSVF8xOTg3XzIwMDYsIERTVEVORF8xOTg3XzIwMDYKKyAgICBlbGlmIDE5NjYgPCB5ZWFyIDwgMTk4NzoKKyAgICAgICAgZHN0c3RhcnQsIGRzdGVuZCA9IERTVFNUQVJUXzE5NjdfMTk4NiwgRFNURU5EXzE5NjdfMTk4NgorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAoZGF0ZXRpbWUoeWVhciwgMSwgMSksICkgKiAyCisKKyAgICBzdGFydCA9IGZpcnN0X3N1bmRheV9vbl9vcl9hZnRlcihkc3RzdGFydC5yZXBsYWNlKHllYXI9eWVhcikpCisgICAgZW5kID0gZmlyc3Rfc3VuZGF5X29uX29yX2FmdGVyKGRzdGVuZC5yZXBsYWNlKHllYXI9eWVhcikpCisgICAgcmV0dXJuIHN0YXJ0LCBlbmQKKworCiBjbGFzcyBVU1RpbWVab25lKHR6aW5mbyk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgaG91cnMsIHJlcHJuYW1lLCBzdGRuYW1lLCBkc3RuYW1lKToKQEAgLTE0MSwyNyArMTM1LDM5IEBACiAgICAgICAgICAgICAjIGltcGxlbWVudGF0aW9uKSBwYXNzZXMgYSBkYXRldGltZSB3aXRoIGR0LnR6aW5mbyBpcyBzZWxmLgogICAgICAgICAgICAgcmV0dXJuIFpFUk8KICAgICAgICAgYXNzZXJ0IGR0LnR6aW5mbyBpcyBzZWxmCi0KLSAgICAgICAgIyBGaW5kIHN0YXJ0IGFuZCBlbmQgdGltZXMgZm9yIFVTIERTVC4gRm9yIHllYXJzIGJlZm9yZSAxOTY3LCByZXR1cm4KLSAgICAgICAgIyBaRVJPIGZvciBubyBEU1QuCi0gICAgICAgIGlmIDIwMDYgPCBkdC55ZWFyOgotICAgICAgICAgICAgZHN0c3RhcnQsIGRzdGVuZCA9IERTVFNUQVJUXzIwMDcsIERTVEVORF8yMDA3Ci0gICAgICAgIGVsaWYgMTk4NiA8IGR0LnllYXIgPCAyMDA3OgotICAgICAgICAgICAgZHN0c3RhcnQsIGRzdGVuZCA9IERTVFNUQVJUXzE5ODdfMjAwNiwgRFNURU5EXzE5ODdfMjAwNgotICAgICAgICBlbGlmIDE5NjYgPCBkdC55ZWFyIDwgMTk4NzoKLSAgICAgICAgICAgIGRzdHN0YXJ0LCBkc3RlbmQgPSBEU1RTVEFSVF8xOTY3XzE5ODYsIERTVEVORF8xOTY3XzE5ODYKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBaRVJPCi0KLSAgICAgICAgc3RhcnQgPSBmaXJzdF9zdW5kYXlfb25fb3JfYWZ0ZXIoZHN0c3RhcnQucmVwbGFjZSh5ZWFyPWR0LnllYXIpKQotICAgICAgICBlbmQgPSBmaXJzdF9zdW5kYXlfb25fb3JfYWZ0ZXIoZHN0ZW5kLnJlcGxhY2UoeWVhcj1kdC55ZWFyKSkKLQorICAgICAgICBzdGFydCwgZW5kID0gdXNfZHN0X3JhbmdlKGR0LnllYXIpCiAgICAgICAgICMgQ2FuJ3QgY29tcGFyZSBuYWl2ZSB0byBhd2FyZSBvYmplY3RzLCBzbyBzdHJpcCB0aGUgdGltZXpvbmUgZnJvbQogICAgICAgICAjIGR0IGZpcnN0LgotICAgICAgICBpZiBzdGFydCA8PSBkdC5yZXBsYWNlKHR6aW5mbz1Ob25lKSA8IGVuZDoKKyAgICAgICAgZHQgPSBkdC5yZXBsYWNlKHR6aW5mbz1Ob25lKQorICAgICAgICBpZiBzdGFydCArIEhPVVIgPD0gZHQgPCBlbmQgLSBIT1VSOgorICAgICAgICAgICAgIyBEU1QgaXMgaW4gZWZmZWN0LgogICAgICAgICAgICAgcmV0dXJuIEhPVVIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBaRVJPCisgICAgICAgIGlmIGVuZCAtIEhPVVIgPD0gZHQgPCBlbmQ6CisgICAgICAgICAgICAjIEZvbGQgKGFuIGFtYmlndW91cyBob3VyKTogdXNlIGR0LmZvbGQgdG8gZGlzYW1iaWd1YXRlLgorICAgICAgICAgICAgcmV0dXJuIFpFUk8gaWYgZHQuZm9sZCBlbHNlIEhPVVIKKyAgICAgICAgaWYgc3RhcnQgPD0gZHQgPCBzdGFydCArIEhPVVI6CisgICAgICAgICAgICAjIEdhcCAoYSBub24tZXhpc3RlbnQgaG91cik6IHJldmVyc2UgdGhlIGZvbGQgcnVsZS4KKyAgICAgICAgICAgIHJldHVybiBIT1VSIGlmIGR0LmZvbGQgZWxzZSBaRVJPCisgICAgICAgICMgRFNUIGlzIG9mZi4KKyAgICAgICAgcmV0dXJuIFpFUk8KKworICAgIGRlZiBmcm9tdXRjKHNlbGYsIGR0KToKKyAgICAgICAgYXNzZXJ0IGR0LnR6aW5mbyBpcyBzZWxmCisgICAgICAgIHN0YXJ0LCBlbmQgPSB1c19kc3RfcmFuZ2UoZHQueWVhcikKKyAgICAgICAgc3RhcnQgPSBzdGFydC5yZXBsYWNlKHR6aW5mbz1zZWxmKQorICAgICAgICBlbmQgPSBlbmQucmVwbGFjZSh0emluZm89c2VsZikKKyAgICAgICAgc3RkX3RpbWUgPSBkdCArIHNlbGYuc3Rkb2Zmc2V0CisgICAgICAgIGRzdF90aW1lID0gc3RkX3RpbWUgKyBIT1VSCisgICAgICAgIGlmIGVuZCA8PSBkc3RfdGltZSA8IGVuZCArIEhPVVI6CisgICAgICAgICAgICAjIFJlcGVhdGVkIGhvdXIKKyAgICAgICAgICAgIHJldHVybiBzdGRfdGltZS5yZXBsYWNlKGZvbGQ9MSkKKyAgICAgICAgaWYgc3RkX3RpbWUgPCBzdGFydCBvciBkc3RfdGltZSA+PSBlbmQ6CisgICAgICAgICAgICAjIFN0YW5kYXJkIHRpbWUKKyAgICAgICAgICAgIHJldHVybiBzdGRfdGltZQorICAgICAgICBpZiBzdGFydCA8PSBzdGRfdGltZSA8IGVuZCAtIEhPVVI6CisgICAgICAgICAgICAjIERheWxpZ2h0IHNhdmluZyB0aW1lCisgICAgICAgICAgICByZXR1cm4gZHN0X3RpbWUKKwogCiBFYXN0ZXJuICA9IFVTVGltZVpvbmUoLTUsICJFYXN0ZXJuIiwgICJFU1QiLCAiRURUIikKIENlbnRyYWwgID0gVVNUaW1lWm9uZSgtNiwgIkNlbnRyYWwiLCAgIkNTVCIsICJDRFQiKQpkaWZmIC0tZ2l0IGEvRG9jL2luc3RhbGxpbmcvaW5kZXgucnN0IGIvRG9jL2luc3RhbGxpbmcvaW5kZXgucnN0CmluZGV4IDFlZjMxNDkuLmIyMjQ2NWQgMTAwNjQ0Ci0tLSBhL0RvYy9pbnN0YWxsaW5nL2luZGV4LnJzdAorKysgYi9Eb2MvaW5zdGFsbGluZy9pbmRleC5yc3QKQEAgLTIsOSArMiw5IEBACiAKIC4uIF9pbnN0YWxsaW5nLWluZGV4OgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKgorSW5zdGFsbGluZyBQeXRob24gTW9kdWxlcworKioqKioqKioqKioqKioqKioqKioqKioqKgogCiA6RW1haWw6IGRpc3R1dGlscy1zaWdAcHl0aG9uLm9yZwogCkBAIC0zNCwyNCArMzQsMjQgQEAKIAogKiBgYHBpcGBgIGlzIHRoZSBwcmVmZXJyZWQgaW5zdGFsbGVyIHByb2dyYW0uIFN0YXJ0aW5nIHdpdGggUHl0aG9uIDMuNCwgaXQKICAgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCB3aXRoIHRoZSBQeXRob24gYmluYXJ5IGluc3RhbGxlcnMuCi0qIGEgdmlydHVhbCBlbnZpcm9ubWVudCBpcyBhIHNlbWktaXNvbGF0ZWQgUHl0aG9uIGVudmlyb25tZW50IHRoYXQgYWxsb3dzCisqIEEgKnZpcnR1YWwgZW52aXJvbm1lbnQqIGlzIGEgc2VtaS1pc29sYXRlZCBQeXRob24gZW52aXJvbm1lbnQgdGhhdCBhbGxvd3MKICAgcGFja2FnZXMgdG8gYmUgaW5zdGFsbGVkIGZvciB1c2UgYnkgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLCByYXRoZXIgdGhhbgotICBiZWluZyBpbnN0YWxsZWQgc3lzdGVtIHdpZGUKLSogYGBweXZlbnZgYCBpcyB0aGUgc3RhbmRhcmQgdG9vbCBmb3IgY3JlYXRpbmcgdmlydHVhbCBlbnZpcm9ubWVudHMsIGFuZCBoYXMKKyAgYmVpbmcgaW5zdGFsbGVkIHN5c3RlbSB3aWRlLgorKiBgYHZlbnZgYCBpcyB0aGUgc3RhbmRhcmQgdG9vbCBmb3IgY3JlYXRpbmcgdmlydHVhbCBlbnZpcm9ubWVudHMsIGFuZCBoYXMKICAgYmVlbiBwYXJ0IG9mIFB5dGhvbiBzaW5jZSBQeXRob24gMy4zLiBTdGFydGluZyB3aXRoIFB5dGhvbiAzLjQsIGl0Ci0gIGRlZmF1bHRzIHRvIGluc3RhbGxpbmcgYGBwaXBgYCBpbnRvIGFsbCBjcmVhdGVkIHZpcnR1YWwgZW52aXJvbm1lbnRzCisgIGRlZmF1bHRzIHRvIGluc3RhbGxpbmcgYGBwaXBgYCBpbnRvIGFsbCBjcmVhdGVkIHZpcnR1YWwgZW52aXJvbm1lbnRzLgogKiBgYHZpcnR1YWxlbnZgYCBpcyBhIHRoaXJkIHBhcnR5IGFsdGVybmF0aXZlIChhbmQgcHJlZGVjZXNzb3IpIHRvCi0gIGBgcHl2ZW52YGAuIEl0IGFsbG93cyB2aXJ0dWFsIGVudmlyb25tZW50cyB0byBiZSB1c2VkIG9uIHZlcnNpb25zIG9mCi0gIFB5dGhvbiBwcmlvciB0byAzLjQsIHdoaWNoIGVpdGhlciBkb24ndCBwcm92aWRlIGBgcHl2ZW52YGAgYXQgYWxsLCBvcgorICBgYHZlbnZgYC4gSXQgYWxsb3dzIHZpcnR1YWwgZW52aXJvbm1lbnRzIHRvIGJlIHVzZWQgb24gdmVyc2lvbnMgb2YKKyAgUHl0aG9uIHByaW9yIHRvIDMuNCwgd2hpY2ggZWl0aGVyIGRvbid0IHByb3ZpZGUgYGB2ZW52YGAgYXQgYWxsLCBvcgogICBhcmVuJ3QgYWJsZSB0byBhdXRvbWF0aWNhbGx5IGluc3RhbGwgYGBwaXBgYCBpbnRvIGNyZWF0ZWQgZW52aXJvbm1lbnRzLgotKiB0aGUgYFB5dGhvbiBQYWNrYWdpbmcgSW5kZXggPGh0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGk+YF9fIGlzIGEgcHVibGljCisqIFRoZSBgUHl0aG9uIFBhY2thZ2luZyBJbmRleCA8aHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaT5gX18gaXMgYSBwdWJsaWMKICAgcmVwb3NpdG9yeSBvZiBvcGVuIHNvdXJjZSBsaWNlbnNlZCBwYWNrYWdlcyBtYWRlIGF2YWlsYWJsZSBmb3IgdXNlIGJ5Ci0gIG90aGVyIFB5dGhvbiB1c2VycworICBvdGhlciBQeXRob24gdXNlcnMuCiAqIHRoZSBgUHl0aG9uIFBhY2thZ2luZyBBdXRob3JpdHkKICAgPGh0dHBzOi8vd3d3LnB5cGEuaW8vZW4vbGF0ZXN0Lz5gX18gYXJlIHRoZSBncm91cCBvZgogICBkZXZlbG9wZXJzIGFuZCBkb2N1bWVudGF0aW9uIGF1dGhvcnMgcmVzcG9uc2libGUgZm9yIHRoZSBtYWludGVuYW5jZSBhbmQKICAgZXZvbHV0aW9uIG9mIHRoZSBzdGFuZGFyZCBwYWNrYWdpbmcgdG9vbHMgYW5kIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIGFuZAotICBmaWxlIGZvcm1hdCBzdGFuZGFyZHMuIFRoZXkgbWFpbnRhaW4gYSB2YXJpZXR5IG9mIHRvb2xzLCBkb2N1bWVudGF0aW9uCisgIGZpbGUgZm9ybWF0IHN0YW5kYXJkcy4gVGhleSBtYWludGFpbiBhIHZhcmlldHkgb2YgdG9vbHMsIGRvY3VtZW50YXRpb24sCiAgIGFuZCBpc3N1ZSB0cmFja2VycyBvbiBib3RoIGBHaXRIdWIgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhPmBfXyBhbmQKICAgYEJpdEJ1Y2tldCA8aHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvPmBfXy4KICogYGBkaXN0dXRpbHNgYCBpcyB0aGUgb3JpZ2luYWwgYnVpbGQgYW5kIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gZmlyc3QgYWRkZWQgdG8KQEAgLTYyLDYgKzYyLDE5IEBACiAgIG9mIHRoZSBtYWlsaW5nIGxpc3QgdXNlZCB0byBjb29yZGluYXRlIFB5dGhvbiBwYWNrYWdpbmcgc3RhbmRhcmRzCiAgIGRldmVsb3BtZW50KS4KIAorLi4gZGVwcmVjYXRlZDo6IDMuNgorICAgYGBweXZlbnZgYCB3YXMgdGhlIHJlY29tbWVuZGVkIHRvb2wgZm9yIGNyZWF0aW5nIHZpcnR1YWwgZW52aXJvbm1lbnRzIGZvcgorICAgUHl0aG9uIDMuMyBhbmQgMy40LCBhbmQgaXMgYGRlcHJlY2F0ZWQgaW4gUHl0aG9uIDMuNgorICAgPGh0dHBzOi8vZG9jcy5weXRob24ub3JnL2Rldi93aGF0c25ldy8zLjYuaHRtbCNkZXByZWNhdGVkLWZlYXR1cmVzPmBfLgorCisuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQorICAgVGhlIHVzZSBvZiBgYHZlbnZgYCBpcyBub3cgcmVjb21tZW5kZWQgZm9yIGNyZWF0aW5nIHZpcnR1YWwgZW52aXJvbm1lbnRzLgorCisuLiBzZWVhbHNvOjoKKworICAgYFB5dGhvbiBQYWNrYWdpbmcgVXNlciBHdWlkZTogQ3JlYXRpbmcgYW5kIHVzaW5nIHZpcnR1YWwgZW52aXJvbm1lbnRzCisgICA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9pbnN0YWxsaW5nLyNjcmVhdGluZy12aXJ0dWFsLWVudmlyb25tZW50cz5gX18KKwogCiBCYXNpYyB1c2FnZQogPT09PT09PT09PT0KQEAgLTEwMCwxMyArMTEzLDE0IEBACiBNb3JlIGluZm9ybWF0aW9uIGFuZCByZXNvdXJjZXMgcmVnYXJkaW5nIGBgcGlwYGAgYW5kIGl0cyBjYXBhYmlsaXRpZXMgY2FuIGJlCiBmb3VuZCBpbiB0aGUgYFB5dGhvbiBQYWNrYWdpbmcgVXNlciBHdWlkZSA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZz5gX18uCiAKLWBgcHl2ZW52YGAgaGFzIGl0cyBvd24gZG9jdW1lbnRhdGlvbiBhdCA6cmVmOmBzY3JpcHRzLXB5dmVudmAuIEluc3RhbGxpbmcKLWludG8gYW4gYWN0aXZlIHZpcnR1YWwgZW52aXJvbm1lbnQgdXNlcyB0aGUgY29tbWFuZHMgc2hvd24gYWJvdmUuCitDcmVhdGlvbiBvZiB2aXJ0dWFsIGVudmlyb25tZW50cyBpcyBkb25lIHRocm91Z2ggdGhlIDptb2Q6YHZlbnZgIG1vZHVsZS4KK0luc3RhbGxpbmcgcGFja2FnZXMgaW50byBhbiBhY3RpdmUgdmlydHVhbCBlbnZpcm9ubWVudCB1c2VzIHRoZSBjb21tYW5kcyBzaG93bgorYWJvdmUuCiAKIC4uIHNlZWFsc286OgogCiAgICAgYFB5dGhvbiBQYWNrYWdpbmcgVXNlciBHdWlkZTogSW5zdGFsbGluZyBQeXRob24gRGlzdHJpYnV0aW9uIFBhY2thZ2VzCi0gICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L2luc3RhbGxpbmcvPmBfXworICAgIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2luc3RhbGxpbmcvPmBfXwogCiAKIEhvdyBkbyBJIC4uLj8KQEAgLTEyNCw3ICsxMzgsNyBAQAogLi4gc2VlYWxzbzo6CiAKICAgIGBQeXRob24gUGFja2FnaW5nIFVzZXIgR3VpZGU6IFJlcXVpcmVtZW50cyBmb3IgSW5zdGFsbGluZyBQYWNrYWdlcwotICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L2luc3RhbGxpbmcvI3JlcXVpcmVtZW50cy1mb3ItaW5zdGFsbGluZy1wYWNrYWdlcz5gX18KKyAgIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2luc3RhbGxpbmcvI3JlcXVpcmVtZW50cy1mb3ItaW5zdGFsbGluZy1wYWNrYWdlcz5gX18KIAogCiAuLiBpbnN0YWxsaW5nLXBlci11c2VyLWluc3RhbGxhdGlvbjoKQEAgLTE0MiwyMCArMTU2LDE5IEBACiBBIG51bWJlciBvZiBzY2llbnRpZmljIFB5dGhvbiBwYWNrYWdlcyBoYXZlIGNvbXBsZXggYmluYXJ5IGRlcGVuZGVuY2llcywgYW5kCiBhcmVuJ3QgY3VycmVudGx5IGVhc3kgdG8gaW5zdGFsbCB1c2luZyBgYHBpcGBgIGRpcmVjdGx5LiBBdCB0aGlzIHBvaW50IGluCiB0aW1lLCBpdCB3aWxsIG9mdGVuIGJlIGVhc2llciBmb3IgdXNlcnMgdG8gaW5zdGFsbCB0aGVzZSBwYWNrYWdlcyBieQotYG90aGVyIG1lYW5zCi08aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc2NpZW5jZS8+YF9fCitgb3RoZXIgbWVhbnMgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvc2NpZW5jZS8+YF9fCiByYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGluc3RhbGwgdGhlbSB3aXRoIGBgcGlwYGAuCiAKIC4uIHNlZWFsc286OgogCiAgICBgUHl0aG9uIFBhY2thZ2luZyBVc2VyIEd1aWRlOiBJbnN0YWxsaW5nIFNjaWVudGlmaWMgUGFja2FnZXMKLSAgIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zY2llbmNlLz5gX18KKyAgIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL3NjaWVuY2UvPmBfXwogCiAKIC4uLiB3b3JrIHdpdGggbXVsdGlwbGUgdmVyc2lvbnMgb2YgUHl0aG9uIGluc3RhbGxlZCBpbiBwYXJhbGxlbD8KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotT24gTGludXgsIE1hYyBPUyBYIGFuZCBvdGhlciBQT1NJWCBzeXN0ZW1zLCB1c2UgdGhlIHZlcnNpb25lZCBQeXRob24gY29tbWFuZHMKK09uIExpbnV4LCBNYWMgT1MgWCwgYW5kIG90aGVyIFBPU0lYIHN5c3RlbXMsIHVzZSB0aGUgdmVyc2lvbmVkIFB5dGhvbiBjb21tYW5kcwogaW4gY29tYmluYXRpb24gd2l0aCB0aGUgYGAtbWBgIHN3aXRjaCB0byBydW4gdGhlIGFwcHJvcHJpYXRlIGNvcHkgb2YKIGBgcGlwYGA6OgogCkBAIC0xNjQsNyArMTc3LDcgQEAKICAgIHB5dGhvbjMgICAtbSBwaXAgaW5zdGFsbCBTb21lUGFja2FnZSAgIyBkZWZhdWx0IFB5dGhvbiAzCiAgICBweXRob24zLjQgLW0gcGlwIGluc3RhbGwgU29tZVBhY2thZ2UgICMgc3BlY2lmaWNhbGx5IFB5dGhvbiAzLjQKIAotKGFwcHJvcHJpYXRlbHkgdmVyc2lvbmVkIGBgcGlwYGAgY29tbWFuZHMgbWF5IGFsc28gYmUgYXZhaWxhYmxlKQorQXBwcm9wcmlhdGVseSB2ZXJzaW9uZWQgYGBwaXBgYCBjb21tYW5kcyBtYXkgYWxzbyBiZSBhdmFpbGFibGUuCiAKIE9uIFdpbmRvd3MsIHVzZSB0aGUgYGBweWBgIFB5dGhvbiBsYXVuY2hlciBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBgYC1tYGAKIHN3aXRjaDo6CkBAIC0yMTIsMTEgKzIyNSwxMSBAQAogdGhhbiBuZWVkaW5nIHRvIGJ1aWxkIHRoZW0gdGhlbXNlbHZlcy4KIAogU29tZSBvZiB0aGUgc29sdXRpb25zIGZvciBpbnN0YWxsaW5nIGBzY2llbnRpZmljIHNvZnR3YXJlCi08aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc2NpZW5jZS8+YF9fCi10aGF0IGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGFzIHByZS1idWlsdCBgYHdoZWVsYGAgZmlsZXMgbWF5IGFsc28gaGVscCB3aXRoCis8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9zY2llbmNlLz5gX18KK3RoYXQgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlIGFzIHByZS1idWlsdCBgYHdoZWVsYGAgZmlsZXMgbWF5IGFsc28gaGVscCB3aXRoCiBvYnRhaW5pbmcgb3RoZXIgYmluYXJ5IGV4dGVuc2lvbnMgd2l0aG91dCBuZWVkaW5nIHRvIGJ1aWxkIHRoZW0gbG9jYWxseS4KIAogLi4gc2VlYWxzbzo6CiAKICAgIGBQeXRob24gUGFja2FnaW5nIFVzZXIgR3VpZGU6IEJpbmFyeSBFeHRlbnNpb25zCi0gICA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3QvZXh0ZW5zaW9ucy8+YF9fCisgICA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9leHRlbnNpb25zLz5gX18KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2FzeW5jaGF0LnJzdCBiL0RvYy9saWJyYXJ5L2FzeW5jaGF0LnJzdAppbmRleCBhZTcyZDI2Li5lMDIzNjBjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9hc3luY2hhdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYXN5bmNoYXQucnN0CkBAIC01OCwxMyArNTgsMTMgQEAKICAgICAgIFRoZSBhc3luY2hyb25vdXMgb3V0cHV0IGJ1ZmZlciBzaXplIChkZWZhdWx0IGBgNDA5NmBgKS4KIAogICAgVW5saWtlIDpjbGFzczpgYXN5bmNvcmUuZGlzcGF0Y2hlcmAsIDpjbGFzczpgYXN5bmNfY2hhdGAgYWxsb3dzIHlvdSB0bwotICAgZGVmaW5lIGEgZmlyc3QtaW4tZmlyc3Qtb3V0IHF1ZXVlIChmaWZvKSBvZiAqcHJvZHVjZXJzKi4gQSBwcm9kdWNlciBuZWVkCisgICBkZWZpbmUgYSA6YWJicjpgRklGTyAoZmlyc3QtaW4sIGZpcnN0LW91dClgIHF1ZXVlIG9mICpwcm9kdWNlcnMqLiBBIHByb2R1Y2VyIG5lZWQKICAgIGhhdmUgb25seSBvbmUgbWV0aG9kLCA6bWV0aDpgbW9yZWAsIHdoaWNoIHNob3VsZCByZXR1cm4gZGF0YSB0byBiZQogICAgdHJhbnNtaXR0ZWQgb24gdGhlIGNoYW5uZWwuCiAgICBUaGUgcHJvZHVjZXIgaW5kaWNhdGVzIGV4aGF1c3Rpb24gKCppLmUuKiB0aGF0IGl0IGNvbnRhaW5zIG5vIG1vcmUgZGF0YSkgYnkKICAgIGhhdmluZyBpdHMgOm1ldGg6YG1vcmVgIG1ldGhvZCByZXR1cm4gdGhlIGVtcHR5IGJ5dGVzIG9iamVjdC4gQXQgdGhpcyBwb2ludAotICAgdGhlIDpjbGFzczpgYXN5bmNfY2hhdGAgb2JqZWN0IHJlbW92ZXMgdGhlIHByb2R1Y2VyIGZyb20gdGhlIGZpZm8gYW5kIHN0YXJ0cwotICAgdXNpbmcgdGhlIG5leHQgcHJvZHVjZXIsIGlmIGFueS4gV2hlbiB0aGUgcHJvZHVjZXIgZmlmbyBpcyBlbXB0eSB0aGUKKyAgIHRoZSA6Y2xhc3M6YGFzeW5jX2NoYXRgIG9iamVjdCByZW1vdmVzIHRoZSBwcm9kdWNlciBmcm9tIHRoZSBxdWV1ZSBhbmQgc3RhcnRzCisgICB1c2luZyB0aGUgbmV4dCBwcm9kdWNlciwgaWYgYW55LiBXaGVuIHRoZSBwcm9kdWNlciBxdWV1ZSBpcyBlbXB0eSB0aGUKICAgIDptZXRoOmBoYW5kbGVfd3JpdGVgIG1ldGhvZCBkb2VzIG5vdGhpbmcuIFlvdSB1c2UgdGhlIGNoYW5uZWwgb2JqZWN0J3MKICAgIDptZXRoOmBzZXRfdGVybWluYXRvcmAgbWV0aG9kIHRvIGRlc2NyaWJlIGhvdyB0byByZWNvZ25pemUgdGhlIGVuZCBvZiwgb3IKICAgIGFuIGltcG9ydGFudCBicmVha3BvaW50IGluLCBhbiBpbmNvbWluZyB0cmFuc21pc3Npb24gZnJvbSB0aGUgcmVtb3RlCkBAIC03OCw4ICs3OCw4IEBACiAKIC4uIG1ldGhvZDo6IGFzeW5jX2NoYXQuY2xvc2Vfd2hlbl9kb25lKCkKIAotICAgUHVzaGVzIGEgYGBOb25lYGAgb24gdG8gdGhlIHByb2R1Y2VyIGZpZm8uIFdoZW4gdGhpcyBwcm9kdWNlciBpcyBwb3BwZWQgb2ZmCi0gICB0aGUgZmlmbyBpdCBjYXVzZXMgdGhlIGNoYW5uZWwgdG8gYmUgY2xvc2VkLgorICAgUHVzaGVzIGEgYGBOb25lYGAgb24gdG8gdGhlIHByb2R1Y2VyIHF1ZXVlLiBXaGVuIHRoaXMgcHJvZHVjZXIgaXMgcG9wcGVkIG9mZgorICAgdGhlIHF1ZXVlIGl0IGNhdXNlcyB0aGUgY2hhbm5lbCB0byBiZSBjbG9zZWQuCiAKIAogLi4gbWV0aG9kOjogYXN5bmNfY2hhdC5jb2xsZWN0X2luY29taW5nX2RhdGEoZGF0YSkKQEAgLTkyLDcgKzkyLDcgQEAKIC4uIG1ldGhvZDo6IGFzeW5jX2NoYXQuZGlzY2FyZF9idWZmZXJzKCkKIAogICAgSW4gZW1lcmdlbmNpZXMgdGhpcyBtZXRob2Qgd2lsbCBkaXNjYXJkIGFueSBkYXRhIGhlbGQgaW4gdGhlIGlucHV0IGFuZC9vcgotICAgb3V0cHV0IGJ1ZmZlcnMgYW5kIHRoZSBwcm9kdWNlciBmaWZvLgorICAgb3V0cHV0IGJ1ZmZlcnMgYW5kIHRoZSBwcm9kdWNlciBxdWV1ZS4KIAogCiAuLiBtZXRob2Q6OiBhc3luY19jaGF0LmZvdW5kX3Rlcm1pbmF0b3IoKQpAQCAtMTEwLDcgKzExMCw3IEBACiAKIC4uIG1ldGhvZDo6IGFzeW5jX2NoYXQucHVzaChkYXRhKQogCi0gICBQdXNoZXMgZGF0YSBvbiB0byB0aGUgY2hhbm5lbCdzIGZpZm8gdG8gZW5zdXJlIGl0cyB0cmFuc21pc3Npb24uCisgICBQdXNoZXMgZGF0YSBvbiB0byB0aGUgY2hhbm5lbCdzIHF1ZXVlIHRvIGVuc3VyZSBpdHMgdHJhbnNtaXNzaW9uLgogICAgVGhpcyBpcyBhbGwgeW91IG5lZWQgdG8gZG8gdG8gaGF2ZSB0aGUgY2hhbm5lbCB3cml0ZSB0aGUgZGF0YSBvdXQgdG8gdGhlCiAgICBuZXR3b3JrLCBhbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgeW91ciBvd24gcHJvZHVjZXJzIGluIG1vcmUgY29tcGxleAogICAgc2NoZW1lcyB0byBpbXBsZW1lbnQgZW5jcnlwdGlvbiBhbmQgY2h1bmtpbmcsIGZvciBleGFtcGxlLgpAQCAtMTE4LDcgKzExOCw3IEBACiAKIC4uIG1ldGhvZDo6IGFzeW5jX2NoYXQucHVzaF93aXRoX3Byb2R1Y2VyKHByb2R1Y2VyKQogCi0gICBUYWtlcyBhIHByb2R1Y2VyIG9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgcHJvZHVjZXIgZmlmbyBhc3NvY2lhdGVkIHdpdGgKKyAgIFRha2VzIGEgcHJvZHVjZXIgb2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBwcm9kdWNlciBxdWV1ZSBhc3NvY2lhdGVkIHdpdGgKICAgIHRoZSBjaGFubmVsLiAgV2hlbiBhbGwgY3VycmVudGx5LXB1c2hlZCBwcm9kdWNlcnMgaGF2ZSBiZWVuIGV4aGF1c3RlZCB0aGUKICAgIGNoYW5uZWwgd2lsbCBjb25zdW1lIHRoaXMgcHJvZHVjZXIncyBkYXRhIGJ5IGNhbGxpbmcgaXRzIDptZXRoOmBtb3JlYAogICAgbWV0aG9kIGFuZCBzZW5kIHRoZSBkYXRhIHRvIHRoZSByZW1vdGUgZW5kcG9pbnQuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9hc3luY2lvLWV2ZW50bG9vcC5yc3QgYi9Eb2MvbGlicmFyeS9hc3luY2lvLWV2ZW50bG9vcC5yc3QKaW5kZXggZWVkNGYwOC4uNjcwNjAwMSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYXN5bmNpby1ldmVudGxvb3AucnN0CisrKyBiL0RvYy9saWJyYXJ5L2FzeW5jaW8tZXZlbnRsb29wLnJzdApAQCAtMTEwLDggKzExMCw5IEBACiAgICBjYWxsZWQgYWZ0ZXIgOm1ldGg6YGNhbGxfc29vbmAgcmV0dXJucywgd2hlbiBjb250cm9sIHJldHVybnMgdG8gdGhlIGV2ZW50CiAgICBsb29wLgogCi0gICBUaGlzIG9wZXJhdGVzIGFzIGEgRklGTyBxdWV1ZSwgY2FsbGJhY2tzIGFyZSBjYWxsZWQgaW4gdGhlIG9yZGVyIGluCi0gICB3aGljaCB0aGV5IGFyZSByZWdpc3RlcmVkLiAgRWFjaCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuCisgICBUaGlzIG9wZXJhdGVzIGFzIGEgOmFiYnI6YEZJRk8gKGZpcnN0LWluLCBmaXJzdC1vdXQpYCBxdWV1ZSwgY2FsbGJhY2tzCisgICBhcmUgY2FsbGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSByZWdpc3RlcmVkLiAgRWFjaCBjYWxsYmFjaworICAgd2lsbCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLgogCiAgICBBbnkgcG9zaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIHRvIHRoZQogICAgY2FsbGJhY2sgd2hlbiBpdCBpcyBjYWxsZWQuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QgYi9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QKaW5kZXggODc4ZDhkYi4uNGY1ZjBmMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYmluYXNjaWkucnN0CisrKyBiL0RvYy9saWJyYXJ5L2JpbmFzY2lpLnJzdApAQCAtNTMsMTMgKzUzLDE0IEBACiAgICB0aGFuIG9uZSBsaW5lIG1heSBiZSBwYXNzZWQgYXQgYSB0aW1lLgogCiAKLS4uIGZ1bmN0aW9uOjogYjJhX2Jhc2U2NChkYXRhKQorLi4gZnVuY3Rpb246OiBiMmFfYmFzZTY0KGRhdGEsIFwqLCBuZXdsaW5lPVRydWUpCiAKICAgIENvbnZlcnQgYmluYXJ5IGRhdGEgdG8gYSBsaW5lIG9mIEFTQ0lJIGNoYXJhY3RlcnMgaW4gYmFzZTY0IGNvZGluZy4gVGhlIHJldHVybgotICAgdmFsdWUgaXMgdGhlIGNvbnZlcnRlZCBsaW5lLCBpbmNsdWRpbmcgYSBuZXdsaW5lIGNoYXIuICBUaGUgbmV3bGluZSBpcwotICAgYWRkZWQgYmVjYXVzZSB0aGUgb3JpZ2luYWwgdXNlIGNhc2UgZm9yIHRoaXMgZnVuY3Rpb24gd2FzIHRvIGZlZWQgaXQgYQotICAgc2VyaWVzIG9mIDU3IGJ5dGUgaW5wdXQgbGluZXMgdG8gZ2V0IG91dHB1dCBsaW5lcyB0aGF0IGNvbmZvcm0gdG8gdGhlCi0gICBNSU1FLWJhc2U2NCBzdGFuZGFyZC4gIE90aGVyd2lzZSB0aGUgb3V0cHV0IGNvbmZvcm1zIHRvIDpyZmM6YDM1NDhgLgorICAgdmFsdWUgaXMgdGhlIGNvbnZlcnRlZCBsaW5lLCBpbmNsdWRpbmcgYSBuZXdsaW5lIGNoYXIgaWYgKm5ld2xpbmUqIGlzCisgICB0cnVlLiAgVGhlIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uIGNvbmZvcm1zIHRvIDpyZmM6YDM1NDhgLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlICpuZXdsaW5lKiBwYXJhbWV0ZXIuCiAKIAogLi4gZnVuY3Rpb246OiBhMmJfcXAoZGF0YSwgaGVhZGVyPUZhbHNlKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY21hdGgucnN0IGIvRG9jL2xpYnJhcnkvY21hdGgucnN0CmluZGV4IDYyZGRiNmIuLmQ5MzVjNDEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NtYXRoLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jbWF0aC5yc3QKQEAgLTI1Myw2ICsyNTMsNDAgQEAKIAogICAgVGhlIG1hdGhlbWF0aWNhbCBjb25zdGFudCAqZSosIGFzIGEgZmxvYXQuCiAKKy4uIGRhdGE6OiB0YXUKKworICAgVGhlIG1hdGhlbWF0aWNhbCBjb25zdGFudCAqz4QqLCBhcyBhIGZsb2F0LgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworLi4gZGF0YTo6IGluZgorCisgICBGbG9hdGluZy1wb2ludCBwb3NpdGl2ZSBpbmZpbml0eS4gRXF1aXZhbGVudCB0byBgYGZsb2F0KCdpbmYnKWBgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworLi4gZGF0YTo6IGluZmoKKworICAgQ29tcGxleCBudW1iZXIgd2l0aCB6ZXJvIHJlYWwgcGFydCBhbmQgcG9zaXRpdmUgaW5maW5pdHkgaW1hZ2luYXJ5CisgICBwYXJ0LiBFcXVpdmFsZW50IHRvIGBgY29tcGxleCgwLjAsIGZsb2F0KCdpbmYnKSlgYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKy4uIGRhdGE6OiBuYW4KKworICAgQSBmbG9hdGluZy1wb2ludCAibm90IGEgbnVtYmVyIiAoTmFOKSB2YWx1ZS4gIEVxdWl2YWxlbnQgdG8KKyAgIGBgZmxvYXQoJ25hbicpYGAuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisuLiBkYXRhOjogbmFuagorCisgICBDb21wbGV4IG51bWJlciB3aXRoIHplcm8gcmVhbCBwYXJ0IGFuZCBOYU4gaW1hZ2luYXJ5IHBhcnQuIEVxdWl2YWxlbnQgdG8KKyAgIGBgY29tcGxleCgwLjAsIGZsb2F0KCduYW4nKSlgYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogLi4gaW5kZXg6OiBtb2R1bGU6IG1hdGgKIAogTm90ZSB0aGF0IHRoZSBzZWxlY3Rpb24gb2YgZnVuY3Rpb25zIGlzIHNpbWlsYXIsIGJ1dCBub3QgaWRlbnRpY2FsLCB0byB0aGF0IGluCkBAIC0yNzYsNSArMzEwLDMgQEAKICAgIEthaGFuLCBXOiAgQnJhbmNoIGN1dHMgZm9yIGNvbXBsZXggZWxlbWVudGFyeSBmdW5jdGlvbnM7IG9yLCBNdWNoIGFkbyBhYm91dAogICAgbm90aGluZydzIHNpZ24gYml0LiAgSW4gSXNlcmxlcywgQS4sIGFuZCBQb3dlbGwsIE0uIChlZHMuKSwgVGhlIHN0YXRlIG9mIHRoZSBhcnQKICAgIGluIG51bWVyaWNhbCBhbmFseXNpcy4gQ2xhcmVuZG9uIFByZXNzICgxOTg3KSBwcDE2NS0yMTEuCi0KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29kZS5yc3QgYi9Eb2MvbGlicmFyeS9jb2RlLnJzdAppbmRleCA0NDNhZjY5Li40Y2NlMWZhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb2RlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb2RlLnJzdApAQCAtMzAsMTUgKzMwLDE5IEBACiAgICBgYHN5cy5wczFgYCBhbmQgYGBzeXMucHMyYGAsIGFuZCBpbnB1dCBidWZmZXJpbmcuCiAKIAotLi4gZnVuY3Rpb246OiBpbnRlcmFjdChiYW5uZXI9Tm9uZSwgcmVhZGZ1bmM9Tm9uZSwgbG9jYWw9Tm9uZSkKKy4uIGZ1bmN0aW9uOjogaW50ZXJhY3QoYmFubmVyPU5vbmUsIHJlYWRmdW5jPU5vbmUsIGxvY2FsPU5vbmUsIGV4aXRtc2c9Tm9uZSkKIAogICAgQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gcnVuIGEgcmVhZC1ldmFsLXByaW50IGxvb3AuICBUaGlzIGNyZWF0ZXMgYSBuZXcKICAgIGluc3RhbmNlIG9mIDpjbGFzczpgSW50ZXJhY3RpdmVDb25zb2xlYCBhbmQgc2V0cyAqcmVhZGZ1bmMqIHRvIGJlIHVzZWQgYXMKICAgIHRoZSA6bWV0aDpgSW50ZXJhY3RpdmVDb25zb2xlLnJhd19pbnB1dGAgbWV0aG9kLCBpZiBwcm92aWRlZC4gIElmICpsb2NhbCogaXMKICAgIHByb3ZpZGVkLCBpdCBpcyBwYXNzZWQgdG8gdGhlIDpjbGFzczpgSW50ZXJhY3RpdmVDb25zb2xlYCBjb25zdHJ1Y3RvciBmb3IKICAgIHVzZSBhcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgZm9yIHRoZSBpbnRlcnByZXRlciBsb29wLiAgVGhlIDptZXRoOmBpbnRlcmFjdGAKLSAgIG1ldGhvZCBvZiB0aGUgaW5zdGFuY2UgaXMgdGhlbiBydW4gd2l0aCAqYmFubmVyKiBwYXNzZWQgYXMgdGhlIGJhbm5lciB0bwotICAgdXNlLCBpZiBwcm92aWRlZC4gIFRoZSBjb25zb2xlIG9iamVjdCBpcyBkaXNjYXJkZWQgYWZ0ZXIgdXNlLgorICAgbWV0aG9kIG9mIHRoZSBpbnN0YW5jZSBpcyB0aGVuIHJ1biB3aXRoICpiYW5uZXIqIGFuZCAqZXhpdG1zZyogcGFzc2VkIGFzIHRoZQorICAgYmFubmVyIGFuZCBleGl0IG1lc3NhZ2UgdG8gdXNlLCBpZiBwcm92aWRlZC4gIFRoZSBjb25zb2xlIG9iamVjdCBpcyBkaXNjYXJkZWQKKyAgIGFmdGVyIHVzZS4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkICpleGl0bXNnKiBwYXJhbWV0ZXIuCiAKIAogLi4gZnVuY3Rpb246OiBjb21waWxlX2NvbW1hbmQoc291cmNlLCBmaWxlbmFtZT0iPGlucHV0PiIsIHN5bWJvbD0ic2luZ2xlIikKQEAgLTEzNiw3ICsxNDAsNyBAQAogaW50ZXJwcmV0ZXIgb2JqZWN0cyBhcyB3ZWxsIGFzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zLgogCiAKLS4uIG1ldGhvZDo6IEludGVyYWN0aXZlQ29uc29sZS5pbnRlcmFjdChiYW5uZXI9Tm9uZSkKKy4uIG1ldGhvZDo6IEludGVyYWN0aXZlQ29uc29sZS5pbnRlcmFjdChiYW5uZXI9Tm9uZSwgZXhpdG1zZz1Ob25lKQogCiAgICBDbG9zZWx5IGVtdWxhdGUgdGhlIGludGVyYWN0aXZlIFB5dGhvbiBjb25zb2xlLiBUaGUgb3B0aW9uYWwgKmJhbm5lciogYXJndW1lbnQKICAgIHNwZWNpZnkgdGhlIGJhbm5lciB0byBwcmludCBiZWZvcmUgdGhlIGZpcnN0IGludGVyYWN0aW9uOyBieSBkZWZhdWx0IGl0IHByaW50cyBhCkBAIC0xNDQsOSArMTQ4LDE2IEBACiAgICBieSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgY29uc29sZSBvYmplY3QgaW4gcGFyZW50aGVzZXMgKHNvIGFzIG5vdCB0byBjb25mdXNlCiAgICB0aGlzIHdpdGggdGhlIHJlYWwgaW50ZXJwcmV0ZXIgLS0gc2luY2UgaXQncyBzbyBjbG9zZSEpLgogCisgICBUaGUgb3B0aW9uYWwgKmV4aXRtc2cqIGFyZ3VtZW50IHNwZWNpZmllcyBhbiBleGl0IG1lc3NhZ2UgcHJpbnRlZCB3aGVuIGV4aXRpbmcuCisgICBQYXNzIHRoZSBlbXB0eSBzdHJpbmcgdG8gc3VwcHJlc3MgdGhlIGV4aXQgbWVzc2FnZS4gSWYgKmV4aXRtc2cqIGlzIG5vdCBnaXZlbiBvcgorICAgTm9uZSwgYSBkZWZhdWx0IG1lc3NhZ2UgaXMgcHJpbnRlZC4KKwogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjQKICAgICAgIFRvIHN1cHByZXNzIHByaW50aW5nIGFueSBiYW5uZXIsIHBhc3MgYW4gZW1wdHkgc3RyaW5nLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgUHJpbnQgYW4gZXhpdCBtZXNzYWdlIHdoZW4gZXhpdGluZy4KKwogCiAuLiBtZXRob2Q6OiBJbnRlcmFjdGl2ZUNvbnNvbGUucHVzaChsaW5lKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb2RlY3MucnN0IGIvRG9jL2xpYnJhcnkvY29kZWNzLnJzdAppbmRleCAxYWRkMzAwLi5jNmI2YTU2IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb2RlY3MucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvZGVjcy5yc3QKQEAgLTEyNTQsMTAgKzEyNTQsMTYgQEAKIHwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8IE9ubHkgYGBlcnJvcnM9J3N0cmljdCdgYCAgfAogfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgaXMgc3VwcG9ydGVkLiAgICAgICAgICAgICB8CiArLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgbWJjcyAgICAgICAgICAgICAgIHwgZGJjcyAgICB8IFdpbmRvd3Mgb25seTogRW5jb2RlICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgb3BlcmFuZCBhY2NvcmRpbmcgdG8gdGhlICB8Cit8IG1iY3MgICAgICAgICAgICAgICB8IGFuc2ksICAgfCBXaW5kb3dzIG9ubHk6IEVuY29kZSAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgIHwgZGJjcyAgICB8IG9wZXJhbmQgYWNjb3JkaW5nIHRvIHRoZSAgfAogfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgQU5TSSBjb2RlcGFnZSAoQ1BfQUNQKSAgICB8CiArLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgb2VtICAgICAgICAgICAgICAgIHwgICAgICAgICB8IFdpbmRvd3Mgb25seTogRW5jb2RlICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgb3BlcmFuZCBhY2NvcmRpbmcgdG8gdGhlICB8Cit8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCBPRU0gY29kZXBhZ2UgKENQX09FTUNQKSAgIHwKK3wgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgLi4gdmVyc2lvbmFkZGVkOjogMy42ICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIHwgcGFsbW9zICAgICAgICAgICAgIHwgICAgICAgICB8IEVuY29kaW5nIG9mIFBhbG1PUyAzLjUgICAgfAogKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiB8IHB1bnljb2RlICAgICAgICAgICB8ICAgICAgICAgfCBJbXBsZW1lbnRzIDpyZmM6YDM0OTJgLiAgIHwKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLmFiYy5yc3QgYi9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5hYmMucnN0CmluZGV4IGFlYjZhNzMuLmU0Yjc1YTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLmFiYy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMuYWJjLnJzdApAQCAtNDEsMTMgKzQxLDE2IEBACiA6Y2xhc3M6YEhhc2hhYmxlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19oYXNoX19gYAogOmNsYXNzOmBJdGVyYWJsZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9faXRlcl9fYGAKIDpjbGFzczpgSXRlcmF0b3JgICAgICAgICAgIDpjbGFzczpgSXRlcmFibGVgICAgICAgYGBfX25leHRfX2BgICAgICAgICAgICAgYGBfX2l0ZXJfX2BgCis6Y2xhc3M6YFJldmVyc2libGVgICAgICAgICA6Y2xhc3M6YEl0ZXJhYmxlYCAgICAgIGBgX19yZXZlcnNlZF9fYGAKIDpjbGFzczpgR2VuZXJhdG9yYCAgICAgICAgIDpjbGFzczpgSXRlcmF0b3JgICAgICAgYGBzZW5kYGAsIGBgdGhyb3dgYCAgICAgYGBjbG9zZWBgLCBgYF9faXRlcl9fYGAsIGBgX19uZXh0X19gYAogOmNsYXNzOmBTaXplZGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fbGVuX19gYAogOmNsYXNzOmBDYWxsYWJsZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fY2FsbF9fYGAKKzpjbGFzczpgQ29sbGVjdGlvbmAgICAgICAgIDpjbGFzczpgU2l6ZWRgLCAgICAgICAgYGBfX2NvbnRhaW5zX19gYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzczpgSXRlcmFibGVgLCAgICAgYGBfX2l0ZXJfX2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBDb250YWluZXJgICAgICBgYF9fbGVuX19gYAogCi06Y2xhc3M6YFNlcXVlbmNlYCAgICAgICAgICA6Y2xhc3M6YFNpemVkYCwgICAgICAgIGBgX19nZXRpdGVtX19gYCwgICAgICAgIGBgX19jb250YWluc19fYGAsIGBgX19pdGVyX19gYCwgYGBfX3JldmVyc2VkX19gYCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzczpgSXRlcmFibGVgLCAgICAgYGBfX2xlbl9fYGAgICAgICAgICAgICAgYGBpbmRleGBgLCBhbmQgYGBjb3VudGBgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YENvbnRhaW5lcmAKKzpjbGFzczpgU2VxdWVuY2VgICAgICAgICAgIDpjbGFzczpgUmV2ZXJzaWJsZWAsICAgYGBfX2dldGl0ZW1fX2BgLCAgICAgICAgYGBfX2NvbnRhaW5zX19gYCwgYGBfX2l0ZXJfX2BgLCBgYF9fcmV2ZXJzZWRfX2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBDb2xsZWN0aW9uYCAgICBgYF9fbGVuX19gYCAgICAgICAgICAgICBgYGluZGV4YGAsIGFuZCBgYGNvdW50YGAKIAogOmNsYXNzOmBNdXRhYmxlU2VxdWVuY2VgICAgOmNsYXNzOmBTZXF1ZW5jZWAgICAgICBgYF9fZ2V0aXRlbV9fYGAsICAgICAgICBJbmhlcml0ZWQgOmNsYXNzOmBTZXF1ZW5jZWAgbWV0aG9kcyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX3NldGl0ZW1fX2BgLCAgICAgICAgYGBhcHBlbmRgYCwgYGByZXZlcnNlYGAsIGBgZXh0ZW5kYGAsIGBgcG9wYGAsCkBAIC01OCw5ICs2MSw5IEBACiA6Y2xhc3M6YEJ5dGVTdHJpbmdgICAgICAgICA6Y2xhc3M6YFNlcXVlbmNlYCAgICAgIGBgX19nZXRpdGVtX19gYCwgICAgICAgIEluaGVyaXRlZCA6Y2xhc3M6YFNlcXVlbmNlYCBtZXRob2RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19sZW5fX2BgCiAKLTpjbGFzczpgU2V0YCAgICAgICAgICAgICAgIDpjbGFzczpgU2l6ZWRgLCAgICAgICAgYGBfX2NvbnRhaW5zX19gYCwgICAgICAgYGBfX2xlX19gYCwgYGBfX2x0X19gYCwgYGBfX2VxX19gYCwgYGBfX25lX19gYCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzczpgSXRlcmFibGVgLCAgICAgYGBfX2l0ZXJfX2BgLCAgICAgICAgICAgYGBfX2d0X19gYCwgYGBfX2dlX19gYCwgYGBfX2FuZF9fYGAsIGBgX19vcl9fYGAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YENvbnRhaW5lcmAgICAgIGBgX19sZW5fX2BgICAgICAgICAgICAgIGBgX19zdWJfX2BgLCBgYF9feG9yX19gYCwgYW5kIGBgaXNkaXNqb2ludGBgCis6Y2xhc3M6YFNldGAgICAgICAgICAgICAgICA6Y2xhc3M6YENvbGxlY3Rpb25gICAgIGBgX19jb250YWluc19fYGAsICAgICAgIGBgX19sZV9fYGAsIGBgX19sdF9fYGAsIGBgX19lcV9fYGAsIGBgX19uZV9fYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19pdGVyX19gYCwgICAgICAgICAgIGBgX19ndF9fYGAsIGBgX19nZV9fYGAsIGBgX19hbmRfX2BgLCBgYF9fb3JfX2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fbGVuX19gYCAgICAgICAgICAgICBgYF9fc3ViX19gYCwgYGBfX3hvcl9fYGAsIGFuZCBgYGlzZGlzam9pbnRgYAogCiA6Y2xhc3M6YE11dGFibGVTZXRgICAgICAgICA6Y2xhc3M6YFNldGAgICAgICAgICAgIGBgX19jb250YWluc19fYGAsICAgICAgIEluaGVyaXRlZCA6Y2xhc3M6YFNldGAgbWV0aG9kcyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX2l0ZXJfX2BgLCAgICAgICAgICAgYGBjbGVhcmBgLCBgYHBvcGBgLCBgYHJlbW92ZWBgLCBgYF9faW9yX19gYCwKQEAgLTY4LDkgKzcxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBhZGRgYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBkaXNjYXJkYGAKIAotOmNsYXNzOmBNYXBwaW5nYCAgICAgICAgICAgOmNsYXNzOmBTaXplZGAsICAgICAgICBgYF9fZ2V0aXRlbV9fYGAsICAgICAgICBgYF9fY29udGFpbnNfX2BgLCBgYGtleXNgYCwgYGBpdGVtc2BgLCBgYHZhbHVlc2BgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBJdGVyYWJsZWAsICAgICBgYF9faXRlcl9fYGAsICAgICAgICAgICBgYGdldGBgLCBgYF9fZXFfX2BgLCBhbmQgYGBfX25lX19gYAotICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBDb250YWluZXJgICAgICBgYF9fbGVuX19gYAorOmNsYXNzOmBNYXBwaW5nYCAgICAgICAgICAgOmNsYXNzOmBDb2xsZWN0aW9uYCAgICBgYF9fZ2V0aXRlbV9fYGAsICAgICAgICBgYF9fY29udGFpbnNfX2BgLCBgYGtleXNgYCwgYGBpdGVtc2BgLCBgYHZhbHVlc2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9faXRlcl9fYGAsICAgICAgICAgICBgYGdldGBgLCBgYF9fZXFfX2BgLCBhbmQgYGBfX25lX19gYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fbGVuX19gYAogCiA6Y2xhc3M6YE11dGFibGVNYXBwaW5nYCAgICA6Y2xhc3M6YE1hcHBpbmdgICAgICAgIGBgX19nZXRpdGVtX19gYCwgICAgICAgIEluaGVyaXRlZCA6Y2xhc3M6YE1hcHBpbmdgIG1ldGhvZHMgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19zZXRpdGVtX19gYCwgICAgICAgIGBgcG9wYGAsIGBgcG9waXRlbWBgLCBgYGNsZWFyYGAsIGBgdXBkYXRlYGAsCkBAIC0xMDUsMTIgKzEwOCwyNSBAQAogICAgQUJDIGZvciBjbGFzc2VzIHRoYXQgcHJvdmlkZSB0aGUgOm1ldGg6YF9faXRlcl9fYCBtZXRob2QuCiAgICBTZWUgYWxzbyB0aGUgZGVmaW5pdGlvbiBvZiA6dGVybTpgaXRlcmFibGVgLgogCisuLiBjbGFzczo6IENvbGxlY3Rpb24KKworICAgQUJDIGZvciBzaXplZCBpdGVyYWJsZSBjb250YWluZXIgY2xhc3Nlcy4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIC4uIGNsYXNzOjogSXRlcmF0b3IKIAogICAgQUJDIGZvciBjbGFzc2VzIHRoYXQgcHJvdmlkZSB0aGUgOm1ldGg6YH5pdGVyYXRvci5fX2l0ZXJfX2AgYW5kCiAgICA6bWV0aDpgfml0ZXJhdG9yLl9fbmV4dF9fYCBtZXRob2RzLiAgU2VlIGFsc28gdGhlIGRlZmluaXRpb24gb2YKICAgIDp0ZXJtOmBpdGVyYXRvcmAuCiAKKy4uIGNsYXNzOjogUmV2ZXJzaWJsZQorCisgICBBQkMgZm9yIGl0ZXJhYmxlIGNsYXNzZXMgdGhhdCBhbHNvIHByb3ZpZGUgdGhlIDptZXRoOmBfX3JldmVyc2VkX19gCisgICBtZXRob2QuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAuLiBjbGFzczo6IEdlbmVyYXRvcgogCiAgICBBQkMgZm9yIGdlbmVyYXRvciBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoZSBwcm90b2NvbCBkZWZpbmVkIGluCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5yc3QgYi9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5yc3QKaW5kZXggYTE0NzI4Ny4uNmRhZWU2ZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLnJzdApAQCAtNzYzLDcgKzc2Myw3IEBACiBzZWxmLWRvY3VtZW50aW5nIGNvZGUuICBUaGV5IGNhbiBiZSB1c2VkIHdoZXJldmVyIHJlZ3VsYXIgdHVwbGVzIGFyZSB1c2VkLCBhbmQKIHRoZXkgYWRkIHRoZSBhYmlsaXR5IHRvIGFjY2VzcyBmaWVsZHMgYnkgbmFtZSBpbnN0ZWFkIG9mIHBvc2l0aW9uIGluZGV4LgogCi0uLiBmdW5jdGlvbjo6IG5hbWVkdHVwbGUodHlwZW5hbWUsIGZpZWxkX25hbWVzLCB2ZXJib3NlPUZhbHNlLCByZW5hbWU9RmFsc2UpCisuLiBmdW5jdGlvbjo6IG5hbWVkdHVwbGUodHlwZW5hbWUsIGZpZWxkX25hbWVzLCAqLCB2ZXJib3NlPUZhbHNlLCByZW5hbWU9RmFsc2UpCiAKICAgICBSZXR1cm5zIGEgbmV3IHR1cGxlIHN1YmNsYXNzIG5hbWVkICp0eXBlbmFtZSouICBUaGUgbmV3IHN1YmNsYXNzIGlzIHVzZWQgdG8KICAgICBjcmVhdGUgdHVwbGUtbGlrZSBvYmplY3RzIHRoYXQgaGF2ZSBmaWVsZHMgYWNjZXNzaWJsZSBieSBhdHRyaWJ1dGUgbG9va3VwIGFzCkBAIC03OTQsNyArNzk0LDExIEBACiAgICAgbGlnaHR3ZWlnaHQgYW5kIHJlcXVpcmUgbm8gbW9yZSBtZW1vcnkgdGhhbiByZWd1bGFyIHR1cGxlcy4KIAogICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4xCi0gICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yICpyZW5hbWUqLgorICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yICpyZW5hbWUqLgorCisgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICBUaGUgKnZlcmJvc2UqIGFuZCAqcmVuYW1lKiBwYXJhbWV0ZXJzIGJlY2FtZQorICAgICAgIDpyZWY6YGtleXdvcmQtb25seSBhcmd1bWVudHMgPGtleXdvcmQtb25seV9wYXJhbWV0ZXI+YC4KIAogCiAuLiBkb2N0ZXN0OjoKQEAgLTg0Niw3ICs4NTAsOSBAQAogLi4gbWV0aG9kOjogc29tZW5hbWVkdHVwbGUuX2FzZGljdCgpCiAKICAgICBSZXR1cm4gYSBuZXcgOmNsYXNzOmBPcmRlcmVkRGljdGAgd2hpY2ggbWFwcyBmaWVsZCBuYW1lcyB0byB0aGVpciBjb3JyZXNwb25kaW5nCi0gICAgdmFsdWVzOjoKKyAgICB2YWx1ZXM6CisKKyAgICAuLiBkb2N0ZXN0OjoKIAogICAgICAgICA+Pj4gcCA9IFBvaW50KHg9MTEsIHk9MjIpCiAgICAgICAgID4+PiBwLl9hc2RpY3QoKQpAQCAtOTA4LDcgKzkxNCw5IEBACiBmdW5jdGlvbmFsaXR5IHdpdGggYSBzdWJjbGFzcy4gIEhlcmUgaXMgaG93IHRvIGFkZCBhIGNhbGN1bGF0ZWQgZmllbGQgYW5kCiBhIGZpeGVkLXdpZHRoIHByaW50IGZvcm1hdDoKIAotICAgID4+PiBjbGFzcyBQb2ludChuYW1lZHR1cGxlKCdQb2ludCcsICd4IHknKSk6CisuLiBkb2N0ZXN0OjoKKworICAgID4+PiBjbGFzcyBQb2ludChuYW1lZHR1cGxlKCdQb2ludCcsIFsneCcsICd5J10pKToKICAgICAuLi4gICAgIF9fc2xvdHNfXyA9ICgpCiAgICAgLi4uICAgICBAcHJvcGVydHkKICAgICAuLi4gICAgIGRlZiBoeXBvdChzZWxmKToKQEAgLTk1OSw2ICs5NjcsMTEgQEAKICAgICAgIGNvbnN0cnVjdG9yIHRoYXQgaXMgY29udmVuaWVudCBmb3IgdXNlIGNhc2VzIHdoZXJlIG5hbWVkIHR1cGxlcyBhcmUgYmVpbmcKICAgICAgIHN1YmNsYXNzZWQuCiAKKyAgICAqIFNlZSA6bWV0aDpgdHlwZXMuU2ltcGxlTmFtZXNwYWNlYCBmb3IgYSBtdXRhYmxlIG5hbWVzcGFjZSBiYXNlZCBvbiBhbgorICAgICAgdW5kZXJseWluZyBkaWN0aW9uYXJ5IGluc3RlYWQgb2YgYSB0dXBsZS4KKworICAgICogU2VlIDptZXRoOmB0eXBpbmcuTmFtZWRUdXBsZWAgZm9yIGEgd2F5IHRvIGFkZCB0eXBlIGhpbnRzIGZvciBuYW1lZCB0dXBsZXMuCisKIAogOmNsYXNzOmBPcmRlcmVkRGljdGAgb2JqZWN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTgwLDggKzk5Myw5IEBACiAgICAgLi4gbWV0aG9kOjogcG9waXRlbShsYXN0PVRydWUpCiAKICAgICAgICAgVGhlIDptZXRoOmBwb3BpdGVtYCBtZXRob2QgZm9yIG9yZGVyZWQgZGljdGlvbmFyaWVzIHJldHVybnMgYW5kIHJlbW92ZXMgYQotICAgICAgICAoa2V5LCB2YWx1ZSkgcGFpci4gIFRoZSBwYWlycyBhcmUgcmV0dXJuZWQgaW4gTElGTyBvcmRlciBpZiAqbGFzdCogaXMgdHJ1ZQotICAgICAgICBvciBGSUZPIG9yZGVyIGlmIGZhbHNlLgorICAgICAgICAoa2V5LCB2YWx1ZSkgcGFpci4gIFRoZSBwYWlycyBhcmUgcmV0dXJuZWQgaW4KKyAgICAgICAgOmFiYnI6YExJRk8gKGxhc3QtaW4sIGZpcnN0LW91dClgIG9yZGVyIGlmICpsYXN0KiBpcyB0cnVlCisgICAgICAgIG9yIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAgb3JkZXIgaWYgZmFsc2UuCiAKICAgICAuLiBtZXRob2Q6OiBtb3ZlX3RvX2VuZChrZXksIGxhc3Q9VHJ1ZSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29tcGlsZWFsbC5yc3QgYi9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdAppbmRleCA1MTFjNTgxLi45MWJkZDE4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdApAQCAtMTAyLDcgKzEwMiw4IEBACiAuLiBmdW5jdGlvbjo6IGNvbXBpbGVfZGlyKGRpciwgbWF4bGV2ZWxzPTEwLCBkZGlyPU5vbmUsIGZvcmNlPUZhbHNlLCByeD1Ob25lLCBxdWlldD0wLCBsZWdhY3k9RmFsc2UsIG9wdGltaXplPS0xLCB3b3JrZXJzPTEpCiAKICAgIFJlY3Vyc2l2ZWx5IGRlc2NlbmQgdGhlIGRpcmVjdG9yeSB0cmVlIG5hbWVkIGJ5ICpkaXIqLCBjb21waWxpbmcgYWxsIDpmaWxlOmAucHlgCi0gICBmaWxlcyBhbG9uZyB0aGUgd2F5LgorICAgZmlsZXMgYWxvbmcgdGhlIHdheS4gUmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiBhbGwgdGhlIGZpbGVzIGNvbXBpbGVkIHN1Y2Nlc3NmdWxseSwKKyAgIGFuZCBhIGZhbHNlIHZhbHVlIG90aGVyd2lzZS4KIAogICAgVGhlICptYXhsZXZlbHMqIHBhcmFtZXRlciBpcyB1c2VkIHRvIGxpbWl0IHRoZSBkZXB0aCBvZiB0aGUgcmVjdXJzaW9uOyBpdAogICAgZGVmYXVsdHMgdG8gYGAxMGBgLgpAQCAtMTU0LDcgKzE1NSw4IEBACiAKIC4uIGZ1bmN0aW9uOjogY29tcGlsZV9maWxlKGZ1bGxuYW1lLCBkZGlyPU5vbmUsIGZvcmNlPUZhbHNlLCByeD1Ob25lLCBxdWlldD0wLCBsZWdhY3k9RmFsc2UsIG9wdGltaXplPS0xKQogCi0gICBDb21waWxlIHRoZSBmaWxlIHdpdGggcGF0aCAqZnVsbG5hbWUqLgorICAgQ29tcGlsZSB0aGUgZmlsZSB3aXRoIHBhdGggKmZ1bGxuYW1lKi4gUmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiB0aGUgZmlsZQorICAgY29tcGlsZWQgc3VjY2Vzc2Z1bGx5LCBhbmQgYSBmYWxzZSB2YWx1ZSBvdGhlcndpc2UuCiAKICAgIElmICpkZGlyKiBpcyBnaXZlbiwgaXQgaXMgcHJlcGVuZGVkIHRvIHRoZSBwYXRoIHRvIHRoZSBmaWxlIGJlaW5nIGNvbXBpbGVkCiAgICBmb3IgdXNlIGluIGNvbXBpbGF0aW9uIHRpbWUgdHJhY2ViYWNrcywgYW5kIGlzIGFsc28gY29tcGlsZWQgaW4gdG8gdGhlCkBAIC0xOTAsOCArMTkyLDEwIEBACiAKIC4uIGZ1bmN0aW9uOjogY29tcGlsZV9wYXRoKHNraXBfY3VyZGlyPVRydWUsIG1heGxldmVscz0wLCBmb3JjZT1GYWxzZSwgcXVpZXQ9MCwgbGVnYWN5PUZhbHNlLCBvcHRpbWl6ZT0tMSkKIAotICAgQnl0ZS1jb21waWxlIGFsbCB0aGUgOmZpbGU6YC5weWAgZmlsZXMgZm91bmQgYWxvbmcgYGBzeXMucGF0aGBgLiBJZgotICAgKnNraXBfY3VyZGlyKiBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBub3QgaW5jbHVkZWQKKyAgIEJ5dGUtY29tcGlsZSBhbGwgdGhlIDpmaWxlOmAucHlgIGZpbGVzIGZvdW5kIGFsb25nIGBgc3lzLnBhdGhgYC4gUmV0dXJuIGEKKyAgIHRydWUgdmFsdWUgaWYgYWxsIHRoZSBmaWxlcyBjb21waWxlZCBzdWNjZXNzZnVsbHksIGFuZCBhIGZhbHNlIHZhbHVlIG90aGVyd2lzZS4KKworICAgSWYgKnNraXBfY3VyZGlyKiBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBub3QgaW5jbHVkZWQKICAgIGluIHRoZSBzZWFyY2guICBBbGwgb3RoZXIgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZSA6ZnVuYzpgY29tcGlsZV9kaXJgCiAgICBmdW5jdGlvbi4gIE5vdGUgdGhhdCB1bmxpa2UgdGhlIG90aGVyIGNvbXBpbGUgZnVuY3Rpb25zLCBgYG1heGxldmVsc2BgCiAgICBkZWZhdWx0cyB0byBgYDBgYC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbmN1cnJlbnQuZnV0dXJlcy5yc3QgYi9Eb2MvbGlicmFyeS9jb25jdXJyZW50LmZ1dHVyZXMucnN0CmluZGV4IGFlMDNmNGIuLmQ4NTU3NmIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbmN1cnJlbnQuZnV0dXJlcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29uY3VycmVudC5mdXR1cmVzLnJzdApAQCAtMTI0LDcgKzEyNCw3IEBACiAgICBleGVjdXRvci5zdWJtaXQod2FpdF9vbl9mdXR1cmUpCiAKIAotLi4gY2xhc3M6OiBUaHJlYWRQb29sRXhlY3V0b3IobWF4X3dvcmtlcnM9Tm9uZSkKKy4uIGNsYXNzOjogVGhyZWFkUG9vbEV4ZWN1dG9yKG1heF93b3JrZXJzPU5vbmUsIHRocmVhZF9uYW1lX3ByZWZpeD0nJykKIAogICAgQW4gOmNsYXNzOmBFeGVjdXRvcmAgc3ViY2xhc3MgdGhhdCB1c2VzIGEgcG9vbCBvZiBhdCBtb3N0ICptYXhfd29ya2VycyoKICAgIHRocmVhZHMgdG8gZXhlY3V0ZSBjYWxscyBhc3luY2hyb25vdXNseS4KQEAgLTEzNyw2ICsxMzcsMTAgQEAKICAgICAgIHNob3VsZCBiZSBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHdvcmtlcnMKICAgICAgIGZvciA6Y2xhc3M6YFByb2Nlc3NQb29sRXhlY3V0b3JgLgogCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgIFRoZSAqdGhyZWFkX25hbWVfcHJlZml4KiBhcmd1bWVudCB3YXMgYWRkZWQgdG8gYWxsb3cgdXNlcnMgdG8KKyAgICAgIGNvbnRyb2wgdGhlIHRocmVhZGluZy5UaHJlYWQgbmFtZXMgZm9yIHdvcmtlciB0aHJlYWRzIGNyZWF0ZWQgYnkKKyAgICAgIHRoZSBwb29sIGZvciBlYXNpZXIgZGVidWdnaW5nLgogCiAuLiBfdGhyZWFkcG9vbGV4ZWN1dG9yLWV4YW1wbGU6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbnN0YW50cy5yc3QgYi9Eb2MvbGlicmFyeS9jb25zdGFudHMucnN0CmluZGV4IGQ1YTBmMDkuLmYwNzQyY2UgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbnN0YW50cy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29uc3RhbnRzLnJzdApAQCAtMzMsMTYgKzMzLDIyIEBACiAgICAoZS5nLiA6bWV0aDpgX19pbXVsX19gLCA6bWV0aDpgX19pYW5kX19gLCBldGMuKSBmb3IgdGhlIHNhbWUgcHVycG9zZS4KICAgIEl0cyB0cnV0aCB2YWx1ZSBpcyB0cnVlLgogCi0uLiBub3RlOjoKKyAgIC4uIG5vdGU6OgogCi0gICBXaGVuIGBgTm90SW1wbGVtZW50ZWRgYCBpcyByZXR1cm5lZCwgdGhlIGludGVycHJldGVyIHdpbGwgdGhlbiB0cnkgdGhlCi0gICByZWZsZWN0ZWQgb3BlcmF0aW9uIG9uIHRoZSBvdGhlciB0eXBlLCBvciBzb21lIG90aGVyIGZhbGxiYWNrLCBkZXBlbmRpbmcKLSAgIG9uIHRoZSBvcGVyYXRvci4gIElmIGFsbCBhdHRlbXB0ZWQgb3BlcmF0aW9ucyByZXR1cm4gYGBOb3RJbXBsZW1lbnRlZGBgLCB0aGUKLSAgIGludGVycHJldGVyIHdpbGwgcmFpc2UgYW4gYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgorICAgICAgV2hlbiBhIGJpbmFyeSAob3IgaW4tcGxhY2UpIG1ldGhvZCByZXR1cm5zIGBgTm90SW1wbGVtZW50ZWRgYCB0aGUKKyAgICAgIGludGVycHJldGVyIHdpbGwgdHJ5IHRoZSByZWZsZWN0ZWQgb3BlcmF0aW9uIG9uIHRoZSBvdGhlciB0eXBlIChvciBzb21lCisgICAgICBvdGhlciBmYWxsYmFjaywgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRvcikuICBJZiBhbGwgYXR0ZW1wdHMgcmV0dXJuCisgICAgICBgYE5vdEltcGxlbWVudGVkYGAsIHRoZSBpbnRlcnByZXRlciB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KKyAgICAgIEluY29ycmVjdGx5IHJldHVybmluZyBgYE5vdEltcGxlbWVudGVkYGAgd2lsbCByZXN1bHQgaW4gYSBtaXNsZWFkaW5nCisgICAgICBlcnJvciBtZXNzYWdlIG9yIHRoZSBgYE5vdEltcGxlbWVudGVkYGAgdmFsdWUgYmVpbmcgcmV0dXJuZWQgdG8gUHl0aG9uIGNvZGUuCiAKLSAgIFNlZQotICAgOnJlZjpgaW1wbGVtZW50aW5nLXRoZS1hcml0aG1ldGljLW9wZXJhdGlvbnNgCi0gICBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAgU2VlIDpyZWY6YGltcGxlbWVudGluZy10aGUtYXJpdGhtZXRpYy1vcGVyYXRpb25zYCBmb3IgZXhhbXBsZXMuCisKKyAgIC4uIG5vdGU6OgorCisgICAgICBgYE5vdEltcGxlbnRlZEVycm9yYGAgYW5kIGBgTm90SW1wbGVtZW50ZWRgYCBhcmUgbm90IGludGVyY2hhbmdlYWJsZSwKKyAgICAgIGV2ZW4gdGhvdWdoIHRoZXkgaGF2ZSBzaW1pbGFyIG5hbWVzIGFuZCBwdXJwb3Nlcy4KKyAgICAgIFNlZSA6ZXhjOmBOb3RJbXBsZW1lbnRlZEVycm9yYCBmb3IgZGV0YWlscyBvbiB3aGVuIHRvIHVzZSBpdC4KIAogCiAuLiBkYXRhOjogRWxsaXBzaXMKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbnRleHRsaWIucnN0IGIvRG9jL2xpYnJhcnkvY29udGV4dGxpYi5yc3QKaW5kZXggY2Y4NWZjZC4uZGQzNGM5NiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29udGV4dGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29udGV4dGxpYi5yc3QKQEAgLTE4LDYgKzE4LDE4IEBACiAKIEZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBwcm92aWRlZDoKIAorLi4gY2xhc3M6OiBBYnN0cmFjdENvbnRleHRNYW5hZ2VyCisKKyAgIEFuIDp0ZXJtOmBhYnN0cmFjdCBiYXNlIGNsYXNzYCBmb3IgY2xhc3NlcyB0aGF0IGltcGxlbWVudAorICAgOm1ldGg6YG9iamVjdC5fX2VudGVyX19gIGFuZCA6bWV0aDpgb2JqZWN0Ll9fZXhpdF9fYC4gQSBkZWZhdWx0CisgICBpbXBsZW1lbnRhdGlvbiBmb3IgOm1ldGg6YG9iamVjdC5fX2VudGVyX19gIGlzIHByb3ZpZGVkIHdoaWNoIHJldHVybnMKKyAgIGBgc2VsZmBgIHdoaWxlIDptZXRoOmBvYmplY3QuX19leGl0X19gIGlzIGFuIGFic3RyYWN0IG1ldGhvZCB3aGljaCBieSBkZWZhdWx0CisgICByZXR1cm5zIGBgTm9uZWBgLiBTZWUgYWxzbyB0aGUgZGVmaW5pdGlvbiBvZiA6cmVmOmB0eXBlY29udGV4dG1hbmFnZXJgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCisKIC4uIGRlY29yYXRvcjo6IGNvbnRleHRtYW5hZ2VyCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgYSA6dGVybTpgZGVjb3JhdG9yYCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhIGZhY3RvcnkKQEAgLTQ0Nyw5ICs0NTksOSBAQAogYWNxdWlzaXRpb24gYW5kIHJlbGVhc2UgZnVuY3Rpb25zLCBhbG9uZyB3aXRoIGFuIG9wdGlvbmFsIHZhbGlkYXRpb24gZnVuY3Rpb24sCiBhbmQgbWFwcyB0aGVtIHRvIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2w6OgogCi0gICBmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyLCBFeGl0U3RhY2sKKyAgIGZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIsIEFic3RyYWN0Q29udGV4dE1hbmFnZXIsIEV4aXRTdGFjawogCi0gICBjbGFzcyBSZXNvdXJjZU1hbmFnZXI6CisgICBjbGFzcyBSZXNvdXJjZU1hbmFnZXIoQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CiAKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYWNxdWlyZV9yZXNvdXJjZSwgcmVsZWFzZV9yZXNvdXJjZSwgY2hlY2tfcmVzb3VyY2Vfb2s9Tm9uZSk6CiAgICAgICAgICAgIHNlbGYuYWNxdWlyZV9yZXNvdXJjZSA9IGFjcXVpcmVfcmVzb3VyY2UKQEAgLTU3OCwxMCArNTkwLDEwIEBACiAgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAKICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKLSAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnRW50ZXJpbmc6IHt9Jy5mb3JtYXQoc2VsZi5uYW1lKSkKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnRW50ZXJpbmc6ICVzJywgc2VsZi5uYW1lKQogCiAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjLCBleGNfdGIpOgotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCdFeGl0aW5nOiB7fScuZm9ybWF0KHNlbGYubmFtZSkpCisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ0V4aXRpbmc6ICVzJywgc2VsZi5uYW1lKQogCiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBhcyBib3RoIGEgY29udGV4dCBtYW5hZ2VyOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY3J5cHQucnN0IGIvRG9jL2xpYnJhcnkvY3J5cHQucnN0CmluZGV4IGEyMWMxZTcuLmRiZDQyNzQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NyeXB0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9jcnlwdC5yc3QKQEAgLTY4LDcgKzY4LDcgQEAKIAogICAgQSBsaXN0IG9mIGF2YWlsYWJsZSBwYXNzd29yZCBoYXNoaW5nIGFsZ29yaXRobXMsIGFzCiAgICBgYGNyeXB0Lk1FVEhPRF8qYGAgb2JqZWN0cy4gIFRoaXMgbGlzdCBpcyBzb3J0ZWQgZnJvbSBzdHJvbmdlc3QgdG8KLSAgIHdlYWtlc3QsIGFuZCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYXQgbGVhc3QgYGBjcnlwdC5NRVRIT0RfQ1JZUFRgYC4KKyAgIHdlYWtlc3QuCiAKIAogTW9kdWxlIEZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY3J5cHRvLnJzdCBiL0RvYy9saWJyYXJ5L2NyeXB0by5yc3QKaW5kZXggMWVkZGZkYy4uOGViNGI4MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY3J5cHRvLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jcnlwdG8ucnN0CkBAIC0xNSw0ICsxNSw2IEBACiAuLiB0b2N0cmVlOjoKIAogICAgaGFzaGxpYi5yc3QKKyAgIGhhc2hsaWItYmxha2UyLnJzdAogICAgaG1hYy5yc3QKKyAgIHNlY3JldHMucnN0CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jc3YucnN0IGIvRG9jL2xpYnJhcnkvY3N2LnJzdAppbmRleCA3ZmI0ZmM4Li42MzQxYmMzIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jc3YucnN0CisrKyBiL0RvYy9saWJyYXJ5L2Nzdi5yc3QKQEAgLTE0OSwxOCArMTQ5LDI1IEBACiAuLiBjbGFzczo6IERpY3RSZWFkZXIoY3N2ZmlsZSwgZmllbGRuYW1lcz1Ob25lLCByZXN0a2V5PU5vbmUsIHJlc3R2YWw9Tm9uZSwgXAogICAgICAgICAgICAgICAgICAgICAgIGRpYWxlY3Q9J2V4Y2VsJywgKmFyZ3MsICoqa3dkcykKIAotICAgQ3JlYXRlIGFuIG9iamVjdCB3aGljaCBvcGVyYXRlcyBsaWtlIGEgcmVndWxhciByZWFkZXIgYnV0IG1hcHMgdGhlCi0gICBpbmZvcm1hdGlvbiByZWFkIGludG8gYSBkaWN0IHdob3NlIGtleXMgYXJlIGdpdmVuIGJ5IHRoZSBvcHRpb25hbAotICAgKmZpZWxkbmFtZXMqIHBhcmFtZXRlci4gIFRoZSAqZmllbGRuYW1lcyogcGFyYW1ldGVyIGlzIGEgOm1vZDpgc2VxdWVuY2UKLSAgIDxjb2xsZWN0aW9ucy5hYmM+YCB3aG9zZSBlbGVtZW50cyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWVsZHMgb2YgdGhlCi0gICBpbnB1dCBkYXRhIGluIG9yZGVyLiBUaGVzZSBlbGVtZW50cyBiZWNvbWUgdGhlIGtleXMgb2YgdGhlIHJlc3VsdGluZwotICAgZGljdGlvbmFyeS4gIElmIHRoZSAqZmllbGRuYW1lcyogcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSB2YWx1ZXMgaW4gdGhlCi0gICBmaXJzdCByb3cgb2YgdGhlICpjc3ZmaWxlKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGZpZWxkbmFtZXMuICBJZiB0aGUgcm93IHJlYWQKLSAgIGhhcyBtb3JlIGZpZWxkcyB0aGFuIHRoZSBmaWVsZG5hbWVzIHNlcXVlbmNlLCB0aGUgcmVtYWluaW5nIGRhdGEgaXMgYWRkZWQgYXMKLSAgIGEgc2VxdWVuY2Uga2V5ZWQgYnkgdGhlIHZhbHVlIG9mICpyZXN0a2V5Ki4gIElmIHRoZSByb3cgcmVhZCBoYXMgZmV3ZXIKLSAgIGZpZWxkcyB0aGFuIHRoZSBmaWVsZG5hbWVzIHNlcXVlbmNlLCB0aGUgcmVtYWluaW5nIGtleXMgdGFrZSB0aGUgdmFsdWUgb2YKLSAgIHRoZSBvcHRpb25hbCAqcmVzdHZhbCogcGFyYW1ldGVyLiAgQW55IG90aGVyIG9wdGlvbmFsIG9yIGtleXdvcmQgYXJndW1lbnRzCi0gICBhcmUgcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIDpjbGFzczpgcmVhZGVyYCBpbnN0YW5jZS4KKyAgIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBvcGVyYXRlcyBsaWtlIGEgcmVndWxhciByZWFkZXIgYnV0IG1hcHMgdGhlCisgICBpbmZvcm1hdGlvbiBpbiBlYWNoIHJvdyB0byBhbiA6bW9kOmBPcmRlcmVkRGljdCA8Y29sbGVjdGlvbnMuT3JkZXJlZERpY3Q+YAorICAgd2hvc2Uga2V5cyBhcmUgZ2l2ZW4gYnkgdGhlIG9wdGlvbmFsICpmaWVsZG5hbWVzKiBwYXJhbWV0ZXIuCisKKyAgIFRoZSAqZmllbGRuYW1lcyogcGFyYW1ldGVyIGlzIGEgOnRlcm06YHNlcXVlbmNlYC4gIElmICpmaWVsZG5hbWVzKiBpcworICAgb21pdHRlZCwgdGhlIHZhbHVlcyBpbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSAqY3N2ZmlsZSogd2lsbCBiZSB1c2VkIGFzIHRoZQorICAgZmllbGRuYW1lcy4gIFJlZ2FyZGxlc3Mgb2YgaG93IHRoZSBmaWVsZG5hbWVzIGFyZSBkZXRlcm1pbmVkLCB0aGUgb3JkZXJlZAorICAgZGljdGlvbmFyeSBwcmVzZXJ2ZXMgdGhlaXIgb3JpZ2luYWwgb3JkZXJpbmcuCisKKyAgIElmIGEgcm93IGhhcyBtb3JlIGZpZWxkcyB0aGFuIGZpZWxkbmFtZXMsIHRoZSByZW1haW5pbmcgZGF0YSBpcyBwdXQgaW4gYQorICAgbGlzdCBhbmQgc3RvcmVkIHdpdGggdGhlIGZpZWxkbmFtZSBzcGVjaWZpZWQgYnkgKnJlc3RrZXkqICh3aGljaCBkZWZhdWx0cworICAgdG8gYGBOb25lYGApLiAgSWYgYSBub24tYmxhbmsgcm93IGhhcyBmZXdlciBmaWVsZHMgdGhhbiBmaWVsZG5hbWVzLCB0aGUKKyAgIG1pc3NpbmcgdmFsdWVzIGFyZSBmaWxsZWQtaW4gd2l0aCBgYE5vbmVgYC4KKworICAgQWxsIG90aGVyIG9wdGlvbmFsIG9yIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIHVuZGVybHlpbmcKKyAgIDpjbGFzczpgcmVhZGVyYCBpbnN0YW5jZS4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFJldHVybmVkIHJvd3MgYXJlIG5vdyBvZiB0eXBlIDpjbGFzczpgT3JkZXJlZERpY3RgLgogCiAgICBBIHNob3J0IHVzYWdlIGV4YW1wbGU6OgogCkBAIC0xNzAsOSArMTc3LDExIEBACiAgICAgICAgLi4uICAgICBmb3Igcm93IGluIHJlYWRlcjoKICAgICAgICAuLi4gICAgICAgICBwcmludChyb3dbJ2ZpcnN0X25hbWUnXSwgcm93WydsYXN0X25hbWUnXSkKICAgICAgICAuLi4KLSAgICAgICBCYWtlZCBCZWFucwotICAgICAgIExvdmVseSBTcGFtCi0gICAgICAgV29uZGVyZnVsIFNwYW0KKyAgICAgICBFcmljIElkbGUKKyAgICAgICBKb2huIENsZWVzZQorCisgICAgICAgPj4+IHByaW50KHJvdykKKyAgICAgICBPcmRlcmVkRGljdChbKCdmaXJzdF9uYW1lJywgJ0pvaG4nKSwgKCdsYXN0X25hbWUnLCAnQ2xlZXNlJyldKQogCiAKIC4uIGNsYXNzOjogRGljdFdyaXRlcihjc3ZmaWxlLCBmaWVsZG5hbWVzLCByZXN0dmFsPScnLCBleHRyYXNhY3Rpb249J3JhaXNlJywgXApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY3R5cGVzLnJzdCBiL0RvYy9saWJyYXJ5L2N0eXBlcy5yc3QKaW5kZXggYTY3NTc5MC4uMjg3MDk0MCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY3R5cGVzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jdHlwZXMucnN0CkBAIC0xMjM5LDkgKzEyMzksMTAgQEAKIGNvbXBpbGluZy9saW5raW5nIGEgcHJvZ3JhbSwgYW5kIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLgogCiBUaGUgcHVycG9zZSBvZiB0aGUgOmZ1bmM6YGZpbmRfbGlicmFyeWAgZnVuY3Rpb24gaXMgdG8gbG9jYXRlIGEgbGlicmFyeSBpbiBhIHdheQotc2ltaWxhciB0byB3aGF0IHRoZSBjb21waWxlciBkb2VzIChvbiBwbGF0Zm9ybXMgd2l0aCBzZXZlcmFsIHZlcnNpb25zIG9mIGEKLXNoYXJlZCBsaWJyYXJ5IHRoZSBtb3N0IHJlY2VudCBzaG91bGQgYmUgbG9hZGVkKSwgd2hpbGUgdGhlIGN0eXBlcyBsaWJyYXJ5Ci1sb2FkZXJzIGFjdCBsaWtlIHdoZW4gYSBwcm9ncmFtIGlzIHJ1biwgYW5kIGNhbGwgdGhlIHJ1bnRpbWUgbG9hZGVyIGRpcmVjdGx5Lgorc2ltaWxhciB0byB3aGF0IHRoZSBjb21waWxlciBvciBydW50aW1lIGxvYWRlciBkb2VzIChvbiBwbGF0Zm9ybXMgd2l0aCBzZXZlcmFsCit2ZXJzaW9ucyBvZiBhIHNoYXJlZCBsaWJyYXJ5IHRoZSBtb3N0IHJlY2VudCBzaG91bGQgYmUgbG9hZGVkKSwgd2hpbGUgdGhlIGN0eXBlcworbGlicmFyeSBsb2FkZXJzIGFjdCBsaWtlIHdoZW4gYSBwcm9ncmFtIGlzIHJ1biwgYW5kIGNhbGwgdGhlIHJ1bnRpbWUgbG9hZGVyCitkaXJlY3RseS4KIAogVGhlIDptb2Q6YGN0eXBlcy51dGlsYCBtb2R1bGUgcHJvdmlkZXMgYSBmdW5jdGlvbiB3aGljaCBjYW4gaGVscCB0byBkZXRlcm1pbmUKIHRoZSBsaWJyYXJ5IHRvIGxvYWQuCkBAIC0xMjU5LDggKzEyNjAsMTQgQEAKIFRoZSBleGFjdCBmdW5jdGlvbmFsaXR5IGlzIHN5c3RlbSBkZXBlbmRlbnQuCiAKIE9uIExpbnV4LCA6ZnVuYzpgZmluZF9saWJyYXJ5YCB0cmllcyB0byBydW4gZXh0ZXJuYWwgcHJvZ3JhbXMKLShgYC9zYmluL2xkY29uZmlnYGAsIGBgZ2NjYGAsIGFuZCBgYG9iamR1bXBgYCkgdG8gZmluZCB0aGUgbGlicmFyeSBmaWxlLiAgSXQKLXJldHVybnMgdGhlIGZpbGVuYW1lIG9mIHRoZSBsaWJyYXJ5IGZpbGUuICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOjoKKyhgYC9zYmluL2xkY29uZmlnYGAsIGBgZ2NjYGAsIGBgb2JqZHVtcGBgIGFuZCBgYGxkYGApIHRvIGZpbmQgdGhlIGxpYnJhcnkgZmlsZS4KK0l0IHJldHVybnMgdGhlIGZpbGVuYW1lIG9mIHRoZSBsaWJyYXJ5IGZpbGUuCisKKy4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICBPbiBMaW51eCwgdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgYExEX0xJQlJBUllfUEFUSGBgIGlzIHVzZWQKKyAgIHdoZW4gc2VhcmNoaW5nIGZvciBsaWJyYXJpZXMsIGlmIGEgbGlicmFyeSBjYW5ub3QgYmUgZm91bmQgYnkgYW55IG90aGVyIG1lYW5zLgorCitIZXJlIGFyZSBzb21lIGV4YW1wbGVzOjoKIAogICAgPj4+IGZyb20gY3R5cGVzLnV0aWwgaW1wb3J0IGZpbmRfbGlicmFyeQogICAgPj4+IGZpbmRfbGlicmFyeSgibSIpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9kYXRldGltZS5yc3QgYi9Eb2MvbGlicmFyeS9kYXRldGltZS5yc3QKaW5kZXggOTI1NGFlOC4uZWNhYWQwNiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGF0ZXRpbWUucnN0CisrKyBiL0RvYy9saWJyYXJ5L2RhdGV0aW1lLnJzdApAQCAtNTIyLDcgKzUyMiw3IEBACiAKIEluc3RhbmNlIG1ldGhvZHM6CiAKLS4uIG1ldGhvZDo6IGRhdGUucmVwbGFjZSh5ZWFyLCBtb250aCwgZGF5KQorLi4gbWV0aG9kOjogZGF0ZS5yZXBsYWNlKHllYXI9c2VsZi55ZWFyLCBtb250aD1zZWxmLm1vbnRoLCBkYXk9c2VsZi5kYXkpCiAKICAgIFJldHVybiBhIGRhdGUgd2l0aCB0aGUgc2FtZSB2YWx1ZSwgZXhjZXB0IGZvciB0aG9zZSBwYXJhbWV0ZXJzIGdpdmVuIG5ldwogICAgdmFsdWVzIGJ5IHdoaWNoZXZlciBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsIGlmIGBgZCA9PQpAQCAtNjEwLDcgKzYxMCw4IEBACiAuLiBtZXRob2Q6OiBkYXRlLl9fZm9ybWF0X18oZm9ybWF0KQogCiAgICBTYW1lIGFzIDptZXRoOmAuZGF0ZS5zdHJmdGltZWAuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gc3BlY2lmeSBhIGZvcm1hdAotICAgc3RyaW5nIGZvciBhIDpjbGFzczpgLmRhdGVgIG9iamVjdCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gRm9yIGEKKyAgIHN0cmluZyBmb3IgYSA6Y2xhc3M6YC5kYXRlYCBvYmplY3QgaW4gOnJlZjpgZm9ybWF0dGVkIHN0cmluZworICAgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gIGFuZCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gRm9yIGEKICAgIGNvbXBsZXRlIGxpc3Qgb2YgZm9ybWF0dGluZyBkaXJlY3RpdmVzLCBzZWUKICAgIDpyZWY6YHN0cmZ0aW1lLXN0cnB0aW1lLWJlaGF2aW9yYC4KIApAQCAtNjgyLDIyICs2ODMsMjYgQEAKIAogQ29uc3RydWN0b3I6CiAKLS4uIGNsYXNzOjogZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheSwgaG91cj0wLCBtaW51dGU9MCwgc2Vjb25kPTAsIG1pY3Jvc2Vjb25kPTAsIHR6aW5mbz1Ob25lKQorLi4gY2xhc3M6OiBkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUsICosIGZvbGQ9MCkKIAogICAgVGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgYXJndW1lbnRzIGFyZSByZXF1aXJlZC4gICp0emluZm8qIG1heSBiZSBgYE5vbmVgYCwgb3IgYW4KICAgIGluc3RhbmNlIG9mIGEgOmNsYXNzOmB0emluZm9gIHN1YmNsYXNzLiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgbWF5IGJlIGludGVnZXJzLAogICAgaW4gdGhlIGZvbGxvd2luZyByYW5nZXM6CiAKLSAgICogYGBNSU5ZRUFSIDw9IHllYXIgPD0gTUFYWUVBUmBgCi0gICAqIGBgMSA8PSBtb250aCA8PSAxMmBgCi0gICAqIGBgMSA8PSBkYXkgPD0gbnVtYmVyIG9mIGRheXMgaW4gdGhlIGdpdmVuIG1vbnRoIGFuZCB5ZWFyYGAKLSAgICogYGAwIDw9IGhvdXIgPCAyNGBgCi0gICAqIGBgMCA8PSBtaW51dGUgPCA2MGBgCi0gICAqIGBgMCA8PSBzZWNvbmQgPCA2MGBgCi0gICAqIGBgMCA8PSBtaWNyb3NlY29uZCA8IDEwMDAwMDBgYAorICAgKiBgYE1JTllFQVIgPD0geWVhciA8PSBNQVhZRUFSYGAsCisgICAqIGBgMSA8PSBtb250aCA8PSAxMmBgLAorICAgKiBgYDEgPD0gZGF5IDw9IG51bWJlciBvZiBkYXlzIGluIHRoZSBnaXZlbiBtb250aCBhbmQgeWVhcmBgLAorICAgKiBgYDAgPD0gaG91ciA8IDI0YGAsCisgICAqIGBgMCA8PSBtaW51dGUgPCA2MGBgLAorICAgKiBgYDAgPD0gc2Vjb25kIDwgNjBgYCwKKyAgICogYGAwIDw9IG1pY3Jvc2Vjb25kIDwgMTAwMDAwMGBgLAorICAgKiBgYGZvbGQgaW4gWzAsIDFdYGAuCiAKICAgIElmIGFuIGFyZ3VtZW50IG91dHNpZGUgdGhvc2UgcmFuZ2VzIGlzIGdpdmVuLCA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQuCiAKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlIGBgZm9sZGBgIGFyZ3VtZW50LgorCiBPdGhlciBjb25zdHJ1Y3RvcnMsIGFsbCBjbGFzcyBtZXRob2RzOgogCiAuLiBjbGFzc21ldGhvZDo6IGRhdGV0aW1lLnRvZGF5KCkKQEAgLTc1Nyw2ICs3NjIsOCBAQAogICAgICAgaW5zdGVhZCBvZiA6ZXhjOmBWYWx1ZUVycm9yYCBvbiA6YzpmdW5jOmBsb2NhbHRpbWVgIG9yIDpjOmZ1bmM6YGdtdGltZWAKICAgICAgIGZhaWx1cmUuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICA6bWV0aDpgZnJvbXRpbWVzdGFtcGAgbWF5IHJldHVybiBpbnN0YW5jZXMgd2l0aCA6YXR0cjpgLmZvbGRgIHNldCB0byAxLgogCiAuLiBjbGFzc21ldGhvZDo6IGRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAodGltZXN0YW1wKQogCkBAIC03OTMsMTYgKzgwMCwyMyBAQAogICAgbWljcm9zZWNvbmQgb2YgdGhlIHJlc3VsdCBhcmUgYWxsIDAsIGFuZCA6YXR0cjpgLnR6aW5mb2AgaXMgYGBOb25lYGAuCiAKIAotLi4gY2xhc3NtZXRob2Q6OiBkYXRldGltZS5jb21iaW5lKGRhdGUsIHRpbWUpCisuLiBjbGFzc21ldGhvZDo6IGRhdGV0aW1lLmNvbWJpbmUoZGF0ZSwgdGltZSwgdHppbmZvPXNlbGYudHppbmZvKQogCiAgICBSZXR1cm4gYSBuZXcgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdCB3aG9zZSBkYXRlIGNvbXBvbmVudHMgYXJlIGVxdWFsIHRvIHRoZQotICAgZ2l2ZW4gOmNsYXNzOmBkYXRlYCBvYmplY3QncywgYW5kIHdob3NlIHRpbWUgY29tcG9uZW50cyBhbmQgOmF0dHI6YC50emluZm9gCi0gICBhdHRyaWJ1dGVzIGFyZSBlcXVhbCB0byB0aGUgZ2l2ZW4gOmNsYXNzOmAudGltZWAgb2JqZWN0J3MuIEZvciBhbnkKLSAgIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QgKmQqLAotICAgYGBkID09IGRhdGV0aW1lLmNvbWJpbmUoZC5kYXRlKCksIGQudGltZXR6KCkpYGAuICBJZiBkYXRlIGlzIGEKKyAgIGdpdmVuIDpjbGFzczpgZGF0ZWAgb2JqZWN0J3MsIGFuZCB3aG9zZSB0aW1lIGNvbXBvbmVudHMKKyAgIGFyZSBlcXVhbCB0byB0aGUgZ2l2ZW4gOmNsYXNzOmAudGltZWAgb2JqZWN0J3MuICBJZiB0aGUgKnR6aW5mbyoKKyAgIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBpdHMgdmFsdWUgaXMgdXNlZCB0byBzZXQgdGhlIDphdHRyOmAudHppbmZvYCBhdHRyaWJ1dGUKKyAgIG9mIHRoZSByZXN1bHQsIG90aGVyd2lzZSB0aGUgOmF0dHI6YH4udGltZS50emluZm9gIGF0dHJpYnV0ZSBvZiB0aGUgKnRpbWUqIGFyZ3VtZW50CisgICBpcyB1c2VkLgorCisgICBGb3IgYW55IDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QgKmQqLAorICAgYGBkID09IGRhdGV0aW1lLmNvbWJpbmUoZC5kYXRlKCksIGQudGltZSgpLCBkLnR6aW5mbylgYC4gIElmIGRhdGUgaXMgYQogICAgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdCwgaXRzIHRpbWUgY29tcG9uZW50cyBhbmQgOmF0dHI6YC50emluZm9gIGF0dHJpYnV0ZXMKICAgIGFyZSBpZ25vcmVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlICp0emluZm8qIGFyZ3VtZW50LgorCiAKIC4uIGNsYXNzbWV0aG9kOjogZGF0ZXRpbWUuc3RycHRpbWUoZGF0ZV9zdHJpbmcsIGZvcm1hdCkKIApAQCAtODc4LDYgKzg5MiwxNiBAQAogICAgb3IgYGBOb25lYGAgaWYgbm9uZSB3YXMgcGFzc2VkLgogCiAKKy4uIGF0dHJpYnV0ZTo6IGRhdGV0aW1lLmZvbGQKKworICAgSW4gYGBbMCwgMV1gYC4gIFVzZWQgdG8gZGlzYW1iaWd1YXRlIHdhbGwgdGltZXMgZHVyaW5nIGEgcmVwZWF0ZWQgaW50ZXJ2YWwuICAoQQorICAgcmVwZWF0ZWQgaW50ZXJ2YWwgb2NjdXJzIHdoZW4gY2xvY2tzIGFyZSByb2xsZWQgYmFjayBhdCB0aGUgZW5kIG9mIGRheWxpZ2h0IHNhdmluZworICAgdGltZSBvciB3aGVuIHRoZSBVVEMgb2Zmc2V0IGZvciB0aGUgY3VycmVudCB6b25lIGlzIGRlY3JlYXNlZCBmb3IgcG9saXRpY2FsIHJlYXNvbnMuKQorICAgVGhlIHZhbHVlIDAgKDEpIHJlcHJlc2VudHMgdGhlIGVhcmxpZXIgKGxhdGVyKSBvZiB0aGUgdHdvIG1vbWVudHMgd2l0aCB0aGUgc2FtZSB3YWxsCisgICB0aW1lIHJlcHJlc2VudGF0aW9uLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogU3VwcG9ydGVkIG9wZXJhdGlvbnM6CiAKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCkBAIC05NjYsMjMgKzk5MCwzNCBAQAogCiAuLiBtZXRob2Q6OiBkYXRldGltZS50aW1lKCkKIAotICAgUmV0dXJuIDpjbGFzczpgLnRpbWVgIG9iamVjdCB3aXRoIHNhbWUgaG91ciwgbWludXRlLCBzZWNvbmQgYW5kIG1pY3Jvc2Vjb25kLgorICAgUmV0dXJuIDpjbGFzczpgLnRpbWVgIG9iamVjdCB3aXRoIHNhbWUgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kIGFuZCBmb2xkLgogICAgOmF0dHI6YC50emluZm9gIGlzIGBgTm9uZWBgLiAgU2VlIGFsc28gbWV0aG9kIDptZXRoOmB0aW1ldHpgLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgVGhlIGZvbGQgdmFsdWUgaXMgY29waWVkIHRvIHRoZSByZXR1cm5lZCA6Y2xhc3M6YC50aW1lYCBvYmplY3QuCisKIAogLi4gbWV0aG9kOjogZGF0ZXRpbWUudGltZXR6KCkKIAotICAgUmV0dXJuIDpjbGFzczpgLnRpbWVgIG9iamVjdCB3aXRoIHNhbWUgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCBhbmQKKyAgIFJldHVybiA6Y2xhc3M6YC50aW1lYCBvYmplY3Qgd2l0aCBzYW1lIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZCwgYW5kCiAgICB0emluZm8gYXR0cmlidXRlcy4gIFNlZSBhbHNvIG1ldGhvZCA6bWV0aDpgdGltZWAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBUaGUgZm9sZCB2YWx1ZSBpcyBjb3BpZWQgdG8gdGhlIHJldHVybmVkIDpjbGFzczpgLnRpbWVgIG9iamVjdC4KIAotLi4gbWV0aG9kOjogZGF0ZXRpbWUucmVwbGFjZShbeWVhclssIG1vbnRoWywgZGF5WywgaG91clssIG1pbnV0ZVssIHNlY29uZFssIG1pY3Jvc2Vjb25kWywgdHppbmZvXV1dXV1dXV0pCisKKy4uIG1ldGhvZDo6IGRhdGV0aW1lLnJlcGxhY2UoeWVhcj1zZWxmLnllYXIsIG1vbnRoPXNlbGYubW9udGgsIGRheT1zZWxmLmRheSwgXAorICAgaG91cj1zZWxmLmhvdXIsIG1pbnV0ZT1zZWxmLm1pbnV0ZSwgc2Vjb25kPXNlbGYuc2Vjb25kLCBtaWNyb3NlY29uZD1zZWxmLm1pY3Jvc2Vjb25kLCBcCisgICB0emluZm89c2VsZi50emluZm8sICogZm9sZD0wKQogCiAgICBSZXR1cm4gYSBkYXRldGltZSB3aXRoIHRoZSBzYW1lIGF0dHJpYnV0ZXMsIGV4Y2VwdCBmb3IgdGhvc2UgYXR0cmlidXRlcyBnaXZlbgogICAgbmV3IHZhbHVlcyBieSB3aGljaGV2ZXIga2V5d29yZCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZC4gIE5vdGUgdGhhdAogICAgYGB0emluZm89Tm9uZWBgIGNhbiBiZSBzcGVjaWZpZWQgdG8gY3JlYXRlIGEgbmFpdmUgZGF0ZXRpbWUgZnJvbSBhbiBhd2FyZQogICAgZGF0ZXRpbWUgd2l0aCBubyBjb252ZXJzaW9uIG9mIGRhdGUgYW5kIHRpbWUgZGF0YS4KIAorICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICAgICBBZGRlZCB0aGUgYGBmb2xkYGAgYXJndW1lbnQuCisKIAogLi4gbWV0aG9kOjogZGF0ZXRpbWUuYXN0aW1lem9uZSh0ej1Ob25lKQogCkBAIC05OTEsMjMgKzEwMjYsMjAgQEAKICAgICpzZWxmKiwgYnV0IGluICp0eioncyBsb2NhbCB0aW1lLgogCiAgICBJZiBwcm92aWRlZCwgKnR6KiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgOmNsYXNzOmB0emluZm9gIHN1YmNsYXNzLCBhbmQgaXRzCi0gICA6bWV0aDpgdXRjb2Zmc2V0YCBhbmQgOm1ldGg6YGRzdGAgbWV0aG9kcyBtdXN0IG5vdCByZXR1cm4gYGBOb25lYGAuICAqc2VsZiogbXVzdAotICAgYmUgYXdhcmUgKGBgc2VsZi50emluZm9gYCBtdXN0IG5vdCBiZSBgYE5vbmVgYCwgYW5kIGBgc2VsZi51dGNvZmZzZXQoKWBgIG11c3QKLSAgIG5vdCByZXR1cm4gYGBOb25lYGApLgorICAgOm1ldGg6YHV0Y29mZnNldGAgYW5kIDptZXRoOmBkc3RgIG1ldGhvZHMgbXVzdCBub3QgcmV0dXJuIGBgTm9uZWBgLiAgSWYgKnNlbGYqCisgICBpcyBuYWl2ZSAoYGBzZWxmLnR6aW5mbyBpcyBOb25lYGApLCBpdCBpcyBwcmVzdW1lZCB0byByZXByZXNlbnQgdGltZSBpbiB0aGUKKyAgIHN5c3RlbSB0aW1lem9uZS4KIAogICAgSWYgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzIChvciB3aXRoIGBgdHo9Tm9uZWBgKSB0aGUgc3lzdGVtIGxvY2FsCi0gICB0aW1lem9uZSBpcyBhc3N1bWVkLiAgVGhlIGBgLnR6aW5mb2BgIGF0dHJpYnV0ZSBvZiB0aGUgY29udmVydGVkCisgICB0aW1lem9uZSBpcyBhc3N1bWVkIGZvciB0aGUgdGFyZ2V0IHRpbWV6b25lLiAgVGhlIGBgLnR6aW5mb2BgIGF0dHJpYnV0ZSBvZiB0aGUgY29udmVydGVkCiAgICBkYXRldGltZSBpbnN0YW5jZSB3aWxsIGJlIHNldCB0byBhbiBpbnN0YW5jZSBvZiA6Y2xhc3M6YHRpbWV6b25lYAogICAgd2l0aCB0aGUgem9uZSBuYW1lIGFuZCBvZmZzZXQgb2J0YWluZWQgZnJvbSB0aGUgT1MuCiAKICAgIElmIGBgc2VsZi50emluZm9gYCBpcyAqdHoqLCBgYHNlbGYuYXN0aW1lem9uZSh0eilgYCBpcyBlcXVhbCB0byAqc2VsZio6ICBubwogICAgYWRqdXN0bWVudCBvZiBkYXRlIG9yIHRpbWUgZGF0YSBpcyBwZXJmb3JtZWQuIEVsc2UgdGhlIHJlc3VsdCBpcyBsb2NhbAotICAgdGltZSBpbiB0aW1lIHpvbmUgKnR6KiwgcmVwcmVzZW50aW5nIHRoZSBzYW1lIFVUQyB0aW1lIGFzICpzZWxmKjogIGFmdGVyCi0gICBgYGFzdHogPSBkdC5hc3RpbWV6b25lKHR6KWBgLCBgYGFzdHogLSBhc3R6LnV0Y29mZnNldCgpYGAgd2lsbCB1c3VhbGx5IGhhdmUKLSAgIHRoZSBzYW1lIGRhdGUgYW5kIHRpbWUgZGF0YSBhcyBgYGR0IC0gZHQudXRjb2Zmc2V0KClgYC4gVGhlIGRpc2N1c3Npb24KLSAgIG9mIGNsYXNzIDpjbGFzczpgdHppbmZvYCBleHBsYWlucyB0aGUgY2FzZXMgYXQgRGF5bGlnaHQgU2F2aW5nIFRpbWUgdHJhbnNpdGlvbgotICAgYm91bmRhcmllcyB3aGVyZSB0aGlzIGNhbm5vdCBiZSBhY2hpZXZlZCAoYW4gaXNzdWUgb25seSBpZiAqdHoqIG1vZGVscyBib3RoCi0gICBzdGFuZGFyZCBhbmQgZGF5bGlnaHQgdGltZSkuCisgICB0aW1lIGluIHRoZSB0aW1lem9uZSAqdHoqLCByZXByZXNlbnRpbmcgdGhlIHNhbWUgVVRDIHRpbWUgYXMgKnNlbGYqOiAgYWZ0ZXIKKyAgIGBgYXN0eiA9IGR0LmFzdGltZXpvbmUodHopYGAsIGBgYXN0eiAtIGFzdHoudXRjb2Zmc2V0KClgYCB3aWxsIGhhdmUKKyAgIHRoZSBzYW1lIGRhdGUgYW5kIHRpbWUgZGF0YSBhcyBgYGR0IC0gZHQudXRjb2Zmc2V0KClgYC4KIAogICAgSWYgeW91IG1lcmVseSB3YW50IHRvIGF0dGFjaCBhIHRpbWUgem9uZSBvYmplY3QgKnR6KiB0byBhIGRhdGV0aW1lICpkdCogd2l0aG91dAogICAgYWRqdXN0bWVudCBvZiBkYXRlIGFuZCB0aW1lIGRhdGEsIHVzZSBgYGR0LnJlcGxhY2UodHppbmZvPXR6KWBgLiAgSWYgeW91CkBAIC0xMDI5LDYgKzEwNjEsMTAgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCiAgICAgICAqdHoqIG5vdyBjYW4gYmUgb21pdHRlZC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoZSA6bWV0aDpgYXN0aW1lem9uZWAgbWV0aG9kIGNhbiBub3cgYmUgY2FsbGVkIG9uIG5haXZlIGluc3RhbmNlcyB0aGF0CisgICAgICBhcmUgcHJlc3VtZWQgdG8gcmVwcmVzZW50IHN5c3RlbSBsb2NhbCB0aW1lLgorCiAKIC4uIG1ldGhvZDo6IGRhdGV0aW1lLnV0Y29mZnNldCgpCiAKQEAgLTExMDUsNiArMTE0MSwxMCBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoZSA6bWV0aDpgdGltZXN0YW1wYCBtZXRob2QgdXNlcyB0aGUgOmF0dHI6YC5mb2xkYCBhdHRyaWJ1dGUgdG8KKyAgICAgIGRpc2FtYmlndWF0ZSB0aGUgdGltZXMgZHVyaW5nIGEgcmVwZWF0ZWQgaW50ZXJ2YWwuCisKICAgIC4uIG5vdGU6OgogCiAgICAgICBUaGVyZSBpcyBubyBtZXRob2QgdG8gb2J0YWluIHRoZSBQT1NJWCB0aW1lc3RhbXAgZGlyZWN0bHkgZnJvbSBhCkBAIC0xMTM4LDcgKzExNzgsNyBAQAogICAgYGBzZWxmLmRhdGUoKS5pc29jYWxlbmRhcigpYGAuCiAKIAotLi4gbWV0aG9kOjogZGF0ZXRpbWUuaXNvZm9ybWF0KHNlcD0nVCcpCisuLiBtZXRob2Q6OiBkYXRldGltZS5pc29mb3JtYXQoc2VwPSdUJywgdGltZXNwZWM9J2F1dG8nKQogCiAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRlIGFuZCB0aW1lIGluIElTTyA4NjAxIGZvcm1hdCwKICAgIFlZWVktTU0tRERUSEg6TU06U1MubW1tbW1tIG9yLCBpZiA6YXR0cjpgbWljcm9zZWNvbmRgIGlzIDAsCkBAIC0xMTU5LDYgKzExOTksMzcgQEAKICAgICAgID4+PiBkYXRldGltZSgyMDAyLCAxMiwgMjUsIHR6aW5mbz1UWigpKS5pc29mb3JtYXQoJyAnKQogICAgICAgJzIwMDItMTItMjUgMDA6MDA6MDAtMDY6MzknCiAKKyAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqdGltZXNwZWMqIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAgIGNvbXBvbmVudHMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZSAodGhlIGRlZmF1bHQgaXMgYGAnYXV0bydgYCkuCisgICBJdCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgIC0gYGAnYXV0bydgYDogU2FtZSBhcyBgYCdzZWNvbmRzJ2BgIGlmIDphdHRyOmBtaWNyb3NlY29uZGAgaXMgMCwKKyAgICAgc2FtZSBhcyBgYCdtaWNyb3NlY29uZHMnYGAgb3RoZXJ3aXNlLgorICAgLSBgYCdob3VycydgYDogSW5jbHVkZSB0aGUgOmF0dHI6YGhvdXJgIGluIHRoZSB0d28tZGlnaXQgSEggZm9ybWF0LgorICAgLSBgYCdtaW51dGVzJ2BgOiBJbmNsdWRlIDphdHRyOmBob3VyYCBhbmQgOmF0dHI6YG1pbnV0ZWAgaW4gSEg6TU0gZm9ybWF0LgorICAgLSBgYCdzZWNvbmRzJ2BgOiBJbmNsdWRlIDphdHRyOmBob3VyYCwgOmF0dHI6YG1pbnV0ZWAsIGFuZCA6YXR0cjpgc2Vjb25kYAorICAgICBpbiBISDpNTTpTUyBmb3JtYXQuCisgICAtIGBgJ21pbGxpc2Vjb25kcydgYDogSW5jbHVkZSBmdWxsIHRpbWUsIGJ1dCB0cnVuY2F0ZSBmcmFjdGlvbmFsIHNlY29uZAorICAgICBwYXJ0IHRvIG1pbGxpc2Vjb25kcy4gSEg6TU06U1Muc3NzIGZvcm1hdC4KKyAgIC0gYGAnbWljcm9zZWNvbmRzJ2BgOiBJbmNsdWRlIGZ1bGwgdGltZSBpbiBISDpNTTpTUy5tbW1tbW0gZm9ybWF0LgorCisgICAuLiBub3RlOjoKKworICAgICAgRXhjbHVkZWQgdGltZSBjb21wb25lbnRzIGFyZSB0cnVuY2F0ZWQsIG5vdCByb3VuZGVkLgorCisgICA6ZXhjOmBWYWx1ZUVycm9yYCB3aWxsIGJlIHJhaXNlZCBvbiBhbiBpbnZhbGlkICp0aW1lc3BlYyogYXJndW1lbnQuCisKKworICAgICAgPj4+IGZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCisgICAgICA+Pj4gZGF0ZXRpbWUubm93KCkuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaW51dGVzJykKKyAgICAgICcyMDAyLTEyLTI1VDAwOjAwJworICAgICAgPj4+IGR0ID0gZGF0ZXRpbWUoMjAxNSwgMSwgMSwgMTIsIDMwLCA1OSwgMCkKKyAgICAgID4+PiBkdC5pc29mb3JtYXQodGltZXNwZWM9J21pY3Jvc2Vjb25kcycpCisgICAgICAnMjAxNS0wMS0wMVQxMjozMDo1OS4wMDAwMDAnCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlICp0aW1lc3BlYyogYXJndW1lbnQuCisKIAogLi4gbWV0aG9kOjogZGF0ZXRpbWUuX19zdHJfXygpCiAKQEAgLTExODUsNyArMTI1Niw4IEBACiAuLiBtZXRob2Q6OiBkYXRldGltZS5fX2Zvcm1hdF9fKGZvcm1hdCkKIAogICAgU2FtZSBhcyA6bWV0aDpgLmRhdGV0aW1lLnN0cmZ0aW1lYC4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gc3BlY2lmeSBhIGZvcm1hdAotICAgc3RyaW5nIGZvciBhIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3Qgd2hlbiB1c2luZyA6bWV0aDpgc3RyLmZvcm1hdGAuICBGb3IgYQorICAgc3RyaW5nIGZvciBhIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QgaW4gOnJlZjpgZm9ybWF0dGVkIHN0cmluZworICAgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gIGFuZCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gIEZvciBhCiAgICBjb21wbGV0ZSBsaXN0IG9mIGZvcm1hdHRpbmcgZGlyZWN0aXZlcywgc2VlCiAgICA6cmVmOmBzdHJmdGltZS1zdHJwdGltZS1iZWhhdmlvcmAuCiAKQEAgLTEzMDIsMTYgKzEzNzQsMTcgQEAKIEEgdGltZSBvYmplY3QgcmVwcmVzZW50cyBhIChsb2NhbCkgdGltZSBvZiBkYXksIGluZGVwZW5kZW50IG9mIGFueSBwYXJ0aWN1bGFyCiBkYXksIGFuZCBzdWJqZWN0IHRvIGFkanVzdG1lbnQgdmlhIGEgOmNsYXNzOmB0emluZm9gIG9iamVjdC4KIAotLi4gY2xhc3M6OiB0aW1lKGhvdXI9MCwgbWludXRlPTAsIHNlY29uZD0wLCBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSkKKy4uIGNsYXNzOjogdGltZShob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUsICosIGZvbGQ9MCkKIAogICAgQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuICAqdHppbmZvKiBtYXkgYmUgYGBOb25lYGAsIG9yIGFuIGluc3RhbmNlIG9mIGEKICAgIDpjbGFzczpgdHppbmZvYCBzdWJjbGFzcy4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIG1heSBiZSBpbnRlZ2VycywgaW4gdGhlCiAgICBmb2xsb3dpbmcgcmFuZ2VzOgogCi0gICAqIGBgMCA8PSBob3VyIDwgMjRgYAotICAgKiBgYDAgPD0gbWludXRlIDwgNjBgYAotICAgKiBgYDAgPD0gc2Vjb25kIDwgNjBgYAotICAgKiBgYDAgPD0gbWljcm9zZWNvbmQgPCAxMDAwMDAwYGAuCisgICAqIGBgMCA8PSBob3VyIDwgMjRgYCwKKyAgICogYGAwIDw9IG1pbnV0ZSA8IDYwYGAsCisgICAqIGBgMCA8PSBzZWNvbmQgPCA2MGBgLAorICAgKiBgYDAgPD0gbWljcm9zZWNvbmQgPCAxMDAwMDAwYGAsCisgICAqIGBgZm9sZCBpbiBbMCwgMV1gYC4KIAogICAgSWYgYW4gYXJndW1lbnQgb3V0c2lkZSB0aG9zZSByYW5nZXMgaXMgZ2l2ZW4sIDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZC4gIEFsbAogICAgZGVmYXVsdCB0byBgYDBgYCBleGNlcHQgKnR6aW5mbyosIHdoaWNoIGRlZmF1bHRzIHRvIDpjb25zdDpgTm9uZWAuCkBAIC0xMzY0LDYgKzE0MzcsMTcgQEAKICAgIGBgTm9uZWBgIGlmIG5vbmUgd2FzIHBhc3NlZC4KIAogCisuLiBhdHRyaWJ1dGU6OiB0aW1lLmZvbGQKKworICAgSW4gYGBbMCwgMV1gYC4gIFVzZWQgdG8gZGlzYW1iaWd1YXRlIHdhbGwgdGltZXMgZHVyaW5nIGEgcmVwZWF0ZWQgaW50ZXJ2YWwuICAoQQorICAgcmVwZWF0ZWQgaW50ZXJ2YWwgb2NjdXJzIHdoZW4gY2xvY2tzIGFyZSByb2xsZWQgYmFjayBhdCB0aGUgZW5kIG9mIGRheWxpZ2h0IHNhdmluZworICAgdGltZSBvciB3aGVuIHRoZSBVVEMgb2Zmc2V0IGZvciB0aGUgY3VycmVudCB6b25lIGlzIGRlY3JlYXNlZCBmb3IgcG9saXRpY2FsIHJlYXNvbnMuKQorICAgVGhlIHZhbHVlIDAgKDEpIHJlcHJlc2VudHMgdGhlIGVhcmxpZXIgKGxhdGVyKSBvZiB0aGUgdHdvIG1vbWVudHMgd2l0aCB0aGUgc2FtZSB3YWxsCisgICB0aW1lIHJlcHJlc2VudGF0aW9uLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiBTdXBwb3J0ZWQgb3BlcmF0aW9uczoKIAogKiBjb21wYXJpc29uIG9mIDpjbGFzczpgLnRpbWVgIHRvIDpjbGFzczpgLnRpbWVgLCB3aGVyZSAqYSogaXMgY29uc2lkZXJlZCBsZXNzCkBAIC0xMzk5LDIxICsxNDgzLDU4IEBACiAKIEluc3RhbmNlIG1ldGhvZHM6CiAKLS4uIG1ldGhvZDo6IHRpbWUucmVwbGFjZShbaG91clssIG1pbnV0ZVssIHNlY29uZFssIG1pY3Jvc2Vjb25kWywgdHppbmZvXV1dXV0pCisuLiBtZXRob2Q6OiB0aW1lLnJlcGxhY2UoaG91cj1zZWxmLmhvdXIsIG1pbnV0ZT1zZWxmLm1pbnV0ZSwgc2Vjb25kPXNlbGYuc2Vjb25kLCBcCisgICBtaWNyb3NlY29uZD1zZWxmLm1pY3Jvc2Vjb25kLCB0emluZm89c2VsZi50emluZm8sICogZm9sZD0wKQogCiAgICBSZXR1cm4gYSA6Y2xhc3M6YC50aW1lYCB3aXRoIHRoZSBzYW1lIHZhbHVlLCBleGNlcHQgZm9yIHRob3NlIGF0dHJpYnV0ZXMgZ2l2ZW4KICAgIG5ldyB2YWx1ZXMgYnkgd2hpY2hldmVyIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQuICBOb3RlIHRoYXQKICAgIGBgdHppbmZvPU5vbmVgYCBjYW4gYmUgc3BlY2lmaWVkIHRvIGNyZWF0ZSBhIG5haXZlIDpjbGFzczpgLnRpbWVgIGZyb20gYW4KICAgIGF3YXJlIDpjbGFzczpgLnRpbWVgLCB3aXRob3V0IGNvbnZlcnNpb24gb2YgdGhlIHRpbWUgZGF0YS4KIAorICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICAgICBBZGRlZCB0aGUgYGBmb2xkYGAgYXJndW1lbnQuCiAKLS4uIG1ldGhvZDo6IHRpbWUuaXNvZm9ybWF0KCkKKworLi4gbWV0aG9kOjogdGltZS5pc29mb3JtYXQodGltZXNwZWM9J2F1dG8nKQogCiAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0aW1lIGluIElTTyA4NjAxIGZvcm1hdCwgSEg6TU06U1MubW1tbW1tIG9yLCBpZgotICAgc2VsZi5taWNyb3NlY29uZCBpcyAwLCBISDpNTTpTUyBJZiA6bWV0aDpgdXRjb2Zmc2V0YCBkb2VzIG5vdCByZXR1cm4gYGBOb25lYGAsIGEKKyAgIDphdHRyOmBtaWNyb3NlY29uZGAgaXMgMCwgSEg6TU06U1MgSWYgOm1ldGg6YHV0Y29mZnNldGAgZG9lcyBub3QgcmV0dXJuIGBgTm9uZWBgLCBhCiAgICA2LWNoYXJhY3RlciBzdHJpbmcgaXMgYXBwZW5kZWQsIGdpdmluZyB0aGUgVVRDIG9mZnNldCBpbiAoc2lnbmVkKSBob3VycyBhbmQKICAgIG1pbnV0ZXM6IEhIOk1NOlNTLm1tbW1tbStISDpNTSBvciwgaWYgc2VsZi5taWNyb3NlY29uZCBpcyAwLCBISDpNTTpTUytISDpNTQogCisgICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKnRpbWVzcGVjKiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsCisgICBjb21wb25lbnRzIG9mIHRoZSB0aW1lIHRvIGluY2x1ZGUgKHRoZSBkZWZhdWx0IGlzIGBgJ2F1dG8nYGApLgorICAgSXQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAtIGBgJ2F1dG8nYGA6IFNhbWUgYXMgYGAnc2Vjb25kcydgYCBpZiA6YXR0cjpgbWljcm9zZWNvbmRgIGlzIDAsCisgICAgIHNhbWUgYXMgYGAnbWljcm9zZWNvbmRzJ2BgIG90aGVyd2lzZS4KKyAgIC0gYGAnaG91cnMnYGA6IEluY2x1ZGUgdGhlIDphdHRyOmBob3VyYCBpbiB0aGUgdHdvLWRpZ2l0IEhIIGZvcm1hdC4KKyAgIC0gYGAnbWludXRlcydgYDogSW5jbHVkZSA6YXR0cjpgaG91cmAgYW5kIDphdHRyOmBtaW51dGVgIGluIEhIOk1NIGZvcm1hdC4KKyAgIC0gYGAnc2Vjb25kcydgYDogSW5jbHVkZSA6YXR0cjpgaG91cmAsIDphdHRyOmBtaW51dGVgLCBhbmQgOmF0dHI6YHNlY29uZGAKKyAgICAgaW4gSEg6TU06U1MgZm9ybWF0LgorICAgLSBgYCdtaWxsaXNlY29uZHMnYGA6IEluY2x1ZGUgZnVsbCB0aW1lLCBidXQgdHJ1bmNhdGUgZnJhY3Rpb25hbCBzZWNvbmQKKyAgICAgcGFydCB0byBtaWxsaXNlY29uZHMuIEhIOk1NOlNTLnNzcyBmb3JtYXQuCisgICAtIGBgJ21pY3Jvc2Vjb25kcydgYDogSW5jbHVkZSBmdWxsIHRpbWUgaW4gSEg6TU06U1MubW1tbW1tIGZvcm1hdC4KKworICAgLi4gbm90ZTo6CisKKyAgICAgIEV4Y2x1ZGVkIHRpbWUgY29tcG9uZW50cyBhcmUgdHJ1bmNhdGVkLCBub3Qgcm91bmRlZC4KKworICAgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSByYWlzZWQgb24gYW4gaW52YWxpZCAqdGltZXNwZWMqIGFyZ3VtZW50LgorCisKKyAgICAgID4+PiBmcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lCisgICAgICA+Pj4gdGltZShob3VyPTEyLCBtaW51dGU9MzQsIHNlY29uZD01NiwgbWljcm9zZWNvbmQ9MTIzNDU2KS5pc29mb3JtYXQodGltZXNwZWM9J21pbnV0ZXMnKQorICAgICAgJzEyOjM0JworICAgICAgPj4+IGR0ID0gdGltZShob3VyPTEyLCBtaW51dGU9MzQsIHNlY29uZD01NiwgbWljcm9zZWNvbmQ9MCkKKyAgICAgID4+PiBkdC5pc29mb3JtYXQodGltZXNwZWM9J21pY3Jvc2Vjb25kcycpCisgICAgICAnMTI6MzQ6NTYuMDAwMDAwJworICAgICAgPj4+IGR0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nYXV0bycpCisgICAgICAnMTI6MzQ6NTYnCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlICp0aW1lc3BlYyogYXJndW1lbnQuCisKIAogLi4gbWV0aG9kOjogdGltZS5fX3N0cl9fKCkKIApAQCAtMTQzMCw3ICsxNTUxLDggQEAKIC4uIG1ldGhvZDo6IHRpbWUuX19mb3JtYXRfXyhmb3JtYXQpCiAKICAgIFNhbWUgYXMgOm1ldGg6YC50aW1lLnN0cmZ0aW1lYC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgZm9ybWF0IHN0cmluZwotICAgZm9yIGEgOmNsYXNzOmAudGltZWAgb2JqZWN0IHdoZW4gdXNpbmcgOm1ldGg6YHN0ci5mb3JtYXRgLiAgRm9yIGEKKyAgIGZvciBhIDpjbGFzczpgLnRpbWVgIG9iamVjdCBpbiA6cmVmOmBmb3JtYXR0ZWQgc3RyaW5nCisgICBsaXRlcmFscyA8Zi1zdHJpbmdzPmAgYW5kIHdoZW4gdXNpbmcgOm1ldGg6YHN0ci5mb3JtYXRgLiAgRm9yIGEKICAgIGNvbXBsZXRlIGxpc3Qgb2YgZm9ybWF0dGluZyBkaXJlY3RpdmVzLCBzZWUKICAgIDpyZWY6YHN0cmZ0aW1lLXN0cnB0aW1lLWJlaGF2aW9yYC4KIApAQCAtMTY4MCw5ICsxODAyLDE5IEBACiBXaGVuIERTVCBzdGFydHMgKHRoZSAic3RhcnQiIGxpbmUpLCB0aGUgbG9jYWwgd2FsbCBjbG9jayBsZWFwcyBmcm9tIDE6NTkgdG8KIDM6MDAuICBBIHdhbGwgdGltZSBvZiB0aGUgZm9ybSAyOk1NIGRvZXNuJ3QgcmVhbGx5IG1ha2Ugc2Vuc2Ugb24gdGhhdCBkYXksIHNvCiBgYGFzdGltZXpvbmUoRWFzdGVybilgYCB3b24ndCBkZWxpdmVyIGEgcmVzdWx0IHdpdGggYGBob3VyID09IDJgYCBvbiB0aGUgZGF5IERTVAotYmVnaW5zLiAgSW4gb3JkZXIgZm9yIDptZXRoOmBhc3RpbWV6b25lYCB0byBtYWtlIHRoaXMgZ3VhcmFudGVlLCB0aGUKLTptZXRoOmB0emluZm8uZHN0YCBtZXRob2QgbXVzdCBjb25zaWRlciB0aW1lcyBpbiB0aGUgIm1pc3NpbmcgaG91ciIgKDI6TU0gZm9yCi1FYXN0ZXJuKSB0byBiZSBpbiBkYXlsaWdodCB0aW1lLgorYmVnaW5zLiAgRm9yIGV4YW1wbGUsIGF0IHRoZSBTcHJpbmcgZm9yd2FyZCB0cmFuc2l0aW9uIG9mIDIwMTYsIHdlIGdldAorCisgICAgPj4+IHUwID0gZGF0ZXRpbWUoMjAxNiwgMywgMTMsIDUsIHR6aW5mbz10aW1lem9uZS51dGMpCisgICAgPj4+IGZvciBpIGluIHJhbmdlKDQpOgorICAgIC4uLiAgICAgdSA9IHUwICsgaSpIT1VSCisgICAgLi4uICAgICB0ID0gdS5hc3RpbWV6b25lKEVhc3Rlcm4pCisgICAgLi4uICAgICBwcmludCh1LnRpbWUoKSwgJ1VUQyA9JywgdC50aW1lKCksIHQudHpuYW1lKCkpCisgICAgLi4uCisgICAgMDU6MDA6MDAgVVRDID0gMDA6MDA6MDAgRVNUCisgICAgMDY6MDA6MDAgVVRDID0gMDE6MDA6MDAgRVNUCisgICAgMDc6MDA6MDAgVVRDID0gMDM6MDA6MDAgRURUCisgICAgMDg6MDA6MDAgVVRDID0gMDQ6MDA6MDAgRURUCisKIAogV2hlbiBEU1QgZW5kcyAodGhlICJlbmQiIGxpbmUpLCB0aGVyZSdzIGEgcG90ZW50aWFsbHkgd29yc2UgcHJvYmxlbTogdGhlcmUncyBhbgogaG91ciB0aGF0IGNhbid0IGJlIHNwZWxsZWQgdW5hbWJpZ3VvdXNseSBpbiBsb2NhbCB3YWxsIHRpbWU6IHRoZSBsYXN0IGhvdXIgb2YKQEAgLTE2OTEsMjggKzE4MjMsNDEgQEAKIHRvIDE6MDAgKHN0YW5kYXJkIHRpbWUpIGFnYWluLiBMb2NhbCB0aW1lcyBvZiB0aGUgZm9ybSAxOk1NIGFyZSBhbWJpZ3VvdXMuCiA6bWV0aDpgYXN0aW1lem9uZWAgbWltaWNzIHRoZSBsb2NhbCBjbG9jaydzIGJlaGF2aW9yIGJ5IG1hcHBpbmcgdHdvIGFkamFjZW50IFVUQwogaG91cnMgaW50byB0aGUgc2FtZSBsb2NhbCBob3VyIHRoZW4uICBJbiB0aGUgRWFzdGVybiBleGFtcGxlLCBVVEMgdGltZXMgb2YgdGhlCi1mb3JtIDU6TU0gYW5kIDY6TU0gYm90aCBtYXAgdG8gMTpNTSB3aGVuIGNvbnZlcnRlZCB0byBFYXN0ZXJuLiAgSW4gb3JkZXIgZm9yCi06bWV0aDpgYXN0aW1lem9uZWAgdG8gbWFrZSB0aGlzIGd1YXJhbnRlZSwgdGhlIDptZXRoOmB0emluZm8uZHN0YCBtZXRob2QgbXVzdAotY29uc2lkZXIgdGltZXMgaW4gdGhlICJyZXBlYXRlZCBob3VyIiB0byBiZSBpbiBzdGFuZGFyZCB0aW1lLiAgVGhpcyBpcyBlYXNpbHkKLWFycmFuZ2VkLCBhcyBpbiB0aGUgZXhhbXBsZSwgYnkgZXhwcmVzc2luZyBEU1Qgc3dpdGNoIHRpbWVzIGluIHRoZSB0aW1lIHpvbmUncwotc3RhbmRhcmQgbG9jYWwgdGltZS4KK2Zvcm0gNTpNTSBhbmQgNjpNTSBib3RoIG1hcCB0byAxOk1NIHdoZW4gY29udmVydGVkIHRvIEVhc3Rlcm4sIGJ1dCBlYXJsaWVyIHRpbWVzCitoYXZlIHRoZSA6YXR0cjpgfmRhdGV0aW1lLmZvbGRgIGF0dHJpYnV0ZSBzZXQgdG8gMCBhbmQgdGhlIGxhdGVyIHRpbWVzIGhhdmUgaXQgc2V0IHRvIDEuCitGb3IgZXhhbXBsZSwgYXQgdGhlIEZhbGwgYmFjayB0cmFuc2l0aW9uIG9mIDIwMTYsIHdlIGdldAogCi1BcHBsaWNhdGlvbnMgdGhhdCBjYW4ndCBiZWFyIHN1Y2ggYW1iaWd1aXRpZXMgc2hvdWxkIGF2b2lkIHVzaW5nIGh5YnJpZAorICAgID4+PiB1MCA9IGRhdGV0aW1lKDIwMTYsIDExLCA2LCA0LCB0emluZm89dGltZXpvbmUudXRjKQorICAgID4+PiBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAuLi4gICAgIHUgPSB1MCArIGkqSE9VUgorICAgIC4uLiAgICAgdCA9IHUuYXN0aW1lem9uZShFYXN0ZXJuKQorICAgIC4uLiAgICAgcHJpbnQodS50aW1lKCksICdVVEMgPScsIHQudGltZSgpLCB0LnR6bmFtZSgpLCB0LmZvbGQpCisgICAgLi4uCisgICAgMDQ6MDA6MDAgVVRDID0gMDA6MDA6MDAgRURUIDAKKyAgICAwNTowMDowMCBVVEMgPSAwMTowMDowMCBFRFQgMAorICAgIDA2OjAwOjAwIFVUQyA9IDAxOjAwOjAwIEVTVCAxCisgICAgMDc6MDA6MDAgVVRDID0gMDI6MDA6MDAgRVNUIDAKKworTm90ZSB0aGF0IHRoZSA6Y2xhc3M6YGRhdGV0aW1lYCBpbnN0YW5jZXMgdGhhdCBkaWZmZXIgb25seSBieSB0aGUgdmFsdWUgb2YgdGhlCis6YXR0cjpgfmRhdGV0aW1lLmZvbGRgIGF0dHJpYnV0ZSBhcmUgY29uc2lkZXJlZCBlcXVhbCBpbiBjb21wYXJpc29ucy4KKworQXBwbGljYXRpb25zIHRoYXQgY2FuJ3QgYmVhciB3YWxsLXRpbWUgYW1iaWd1aXRpZXMgc2hvdWxkIGV4cGxpY2l0bHkgY2hlY2sgdGhlCit2YWx1ZSBvZiB0aGUgOmF0dHI6YH5kYXRldGltZS5mb2xkYCBhdHRyaWJ1dGUgb3IgYXZvaWQgdXNpbmcgaHlicmlkCiA6Y2xhc3M6YHR6aW5mb2Agc3ViY2xhc3NlczsgdGhlcmUgYXJlIG5vIGFtYmlndWl0aWVzIHdoZW4gdXNpbmcgOmNsYXNzOmB0aW1lem9uZWAsCiBvciBhbnkgb3RoZXIgZml4ZWQtb2Zmc2V0IDpjbGFzczpgdHppbmZvYCBzdWJjbGFzcyAoc3VjaCBhcyBhIGNsYXNzIHJlcHJlc2VudGluZwogb25seSBFU1QgKGZpeGVkIG9mZnNldCAtNSBob3VycyksIG9yIG9ubHkgRURUIChmaXhlZCBvZmZzZXQgLTQgaG91cnMpKS4KIAogLi4gc2VlYWxzbzo6CiAKLSAgIGBweXR6IDxodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3B5dHovPmBfCisgICBgZGF0ZXR1aWwudHogPGh0dHBzOi8vZGF0ZXV0aWwucmVhZHRoZWRvY3MuaW8vZW4vc3RhYmxlL3R6Lmh0bWw+YF8KICAgICAgIFRoZSBzdGFuZGFyZCBsaWJyYXJ5IGhhcyA6Y2xhc3M6YHRpbWV6b25lYCBjbGFzcyBmb3IgaGFuZGxpbmcgYXJiaXRyYXJ5CiAgICAgICBmaXhlZCBvZmZzZXRzIGZyb20gVVRDIGFuZCA6YXR0cjpgdGltZXpvbmUudXRjYCBhcyBVVEMgdGltZXpvbmUgaW5zdGFuY2UuCiAKLSAgICAgICpweXR6KiBsaWJyYXJ5IGJyaW5ncyB0aGUgKklBTkEgdGltZXpvbmUgZGF0YWJhc2UqIChhbHNvIGtub3duIGFzIHRoZQorICAgICAgKmRhdGV0dWlsLnR6KiBsaWJyYXJ5IGJyaW5ncyB0aGUgKklBTkEgdGltZXpvbmUgZGF0YWJhc2UqIChhbHNvIGtub3duIGFzIHRoZQogICAgICAgT2xzb24gZGF0YWJhc2UpIHRvIFB5dGhvbiBhbmQgaXRzIHVzYWdlIGlzIHJlY29tbWVuZGVkLgogCiAgICBgSUFOQSB0aW1lem9uZSBkYXRhYmFzZSA8aHR0cHM6Ly93d3cuaWFuYS5vcmcvdGltZS16b25lcz5gXwotICAgICAgVGhlIFRpbWUgWm9uZSBEYXRhYmFzZSAob2Z0ZW4gY2FsbGVkIHR6IG9yIHpvbmVpbmZvKSBjb250YWlucyBjb2RlIGFuZAorICAgICAgVGhlIFRpbWUgWm9uZSBEYXRhYmFzZSAob2Z0ZW4gY2FsbGVkIHR6LCB0emRhdGEgb3Igem9uZWluZm8pIGNvbnRhaW5zIGNvZGUgYW5kCiAgICAgICBkYXRhIHRoYXQgcmVwcmVzZW50IHRoZSBoaXN0b3J5IG9mIGxvY2FsIHRpbWUgZm9yIG1hbnkgcmVwcmVzZW50YXRpdmUKICAgICAgIGxvY2F0aW9ucyBhcm91bmQgdGhlIGdsb2JlLiBJdCBpcyB1cGRhdGVkIHBlcmlvZGljYWxseSB0byByZWZsZWN0IGNoYW5nZXMKICAgICAgIG1hZGUgYnkgcG9saXRpY2FsIGJvZGllcyB0byB0aW1lIHpvbmUgYm91bmRhcmllcywgVVRDIG9mZnNldHMsIGFuZApAQCAtMTczMiw3ICsxODc3LDcgQEAKIG1hZGUgdG8gY2l2aWwgdGltZS4KIAogCi0uLiBjbGFzczo6IHRpbWV6b25lKG9mZnNldFssIG5hbWVdKQorLi4gY2xhc3M6OiB0aW1lem9uZShvZmZzZXQsIG5hbWU9Tm9uZSkKIAogICBUaGUgKm9mZnNldCogYXJndW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSA6Y2xhc3M6YHRpbWVkZWx0YWAKICAgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsb2NhbCB0aW1lIGFuZCBVVEMuICBJdCBtdXN0CkBAIC0xNzQxLDEwICsxODg2LDcgQEAKICAgb3RoZXJ3aXNlIDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZC4KIAogICBUaGUgKm5hbWUqIGFyZ3VtZW50IGlzIG9wdGlvbmFsLiAgSWYgc3BlY2lmaWVkIGl0IG11c3QgYmUgYSBzdHJpbmcgdGhhdAotICBpcyB1c2VkIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYGB0em5hbWUoZHQpYGAgbWV0aG9kLiAgT3RoZXJ3aXNlLAotICBgYHR6bmFtZShkdClgYCByZXR1cm5zIGEgc3RyaW5nICdVVENzSEg6TU0nLCB3aGVyZSBzIGlzIHRoZSBzaWduIG9mCi0gICpvZmZzZXQqLCBISCBhbmQgTU0gYXJlIHR3byBkaWdpdHMgb2YgYGBvZmZzZXQuaG91cnNgYCBhbmQKLSAgYGBvZmZzZXQubWludXRlc2BgIHJlc3BlY3RpdmVseS4KKyAgd2lsbCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgOm1ldGg6YGRhdGV0aW1lLnR6bmFtZWAgbWV0aG9kLgogCiAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCkBAIC0xNzU3LDExICsxODk5LDE5IEBACiAKIC4uIG1ldGhvZDo6IHRpbWV6b25lLnR6bmFtZShkdCkKIAotICBSZXR1cm4gdGhlIGZpeGVkIHZhbHVlIHNwZWNpZmllZCB3aGVuIHRoZSA6Y2xhc3M6YHRpbWV6b25lYCBpbnN0YW5jZSBpcwotICBjb25zdHJ1Y3RlZCBvciBhIHN0cmluZyAnVVRDc0hIOk1NJywgd2hlcmUgcyBpcyB0aGUgc2lnbiBvZgotICAqb2Zmc2V0KiwgSEggYW5kIE1NIGFyZSB0d28gZGlnaXRzIG9mIGBgb2Zmc2V0LmhvdXJzYGAgYW5kCisgIFJldHVybiB0aGUgZml4ZWQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIDpjbGFzczpgdGltZXpvbmVgIGluc3RhbmNlCisgIGlzIGNvbnN0cnVjdGVkLiAgSWYgKm5hbWUqIGlzIG5vdCBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IsIHRoZQorICBuYW1lIHJldHVybmVkIGJ5IGBgdHpuYW1lKGR0KWBgIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUKKyAgYGBvZmZzZXRgYCBhcyBmb2xsb3dzLiAgSWYgKm9mZnNldCogaXMgYGB0aW1lZGVsdGEoMClgYCwgdGhlIG5hbWUKKyAgaXMgIlVUQyIsIG90aGVyd2lzZSBpdCBpcyBhIHN0cmluZyAnVVRDwrFISDpNTScsIHdoZXJlIMKxIGlzIHRoZSBzaWduCisgIG9mIGBgb2Zmc2V0YGAsIEhIIGFuZCBNTSBhcmUgdHdvIGRpZ2l0cyBvZiBgYG9mZnNldC5ob3Vyc2BgIGFuZAogICBgYG9mZnNldC5taW51dGVzYGAgcmVzcGVjdGl2ZWx5LgogCisgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgIE5hbWUgZ2VuZXJhdGVkIGZyb20gYGBvZmZzZXQ9dGltZWRlbHRhKDApYGAgaXMgbm93IHBsYWluICdVVEMnLCBub3QKKyAgICAgJ1VUQyswMDowMCcuCisKKwogLi4gbWV0aG9kOjogdGltZXpvbmUuZHN0KGR0KQogCiAgIEFsd2F5cyByZXR1cm5zIGBgTm9uZWBgLgpAQCAtMTkxMSw2ICsyMDYxLDM0IEBACiB8IGBgJSVgYCAgICB8IEEgbGl0ZXJhbCBgYCclJ2BgIGNoYXJhY3Rlci4gICB8ICUgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8CiArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCiAKK1NldmVyYWwgYWRkaXRpb25hbCBkaXJlY3RpdmVzIG5vdCByZXF1aXJlZCBieSB0aGUgQzg5IHN0YW5kYXJkIGFyZSBpbmNsdWRlZCBmb3IKK2NvbnZlbmllbmNlLiBUaGVzZSBwYXJhbWV0ZXJzIGFsbCBjb3JyZXNwb25kIHRvIElTTyA4NjAxIGRhdGUgdmFsdWVzLiBUaGVzZQorbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3JtcyB3aGVuIHVzZWQgd2l0aCB0aGUgOm1ldGg6YHN0cmZ0aW1lYAorbWV0aG9kLiBUaGUgSVNPIDg2MDEgeWVhciBhbmQgSVNPIDg2MDEgd2VlayBkaXJlY3RpdmVzIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlCit3aXRoIHRoZSB5ZWFyIGFuZCB3ZWVrIG51bWJlciBkaXJlY3RpdmVzIGFib3ZlLiBDYWxsaW5nIDptZXRoOmBzdHJwdGltZWAgd2l0aAoraW5jb21wbGV0ZSBvciBhbWJpZ3VvdXMgSVNPIDg2MDEgZGlyZWN0aXZlcyB3aWxsIHJhaXNlIGEgOmV4YzpgVmFsdWVFcnJvcmAuCisKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgRGlyZWN0aXZlIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSAgICAgICAgICAgICAgICB8IE5vdGVzIHwKKys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PSsKK3wgYGAlR2BgICAgIHwgSVNPIDg2MDEgeWVhciB3aXRoIGNlbnR1cnkgICAgIHwgMDAwMSwgMDAwMiwgLi4uLCAyMDEzLCB8IFwoOCkgIHwKK3wgICAgICAgICAgIHwgcmVwcmVzZW50aW5nIHRoZSB5ZWFyIHRoYXQgICAgIHwgMjAxNCwgLi4uLCA5OTk4LCA5OTk5ICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgY29udGFpbnMgdGhlIGdyZWF0ZXIgcGFydCBvZiAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgdGhlIElTTyB3ZWVrIChgYCVWYGApLiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgYGAldWBgICAgIHwgSVNPIDg2MDEgd2Vla2RheSBhcyBhIGRlY2ltYWwgIHwgMSwgMiwgLi4uLCA3ICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgbnVtYmVyIHdoZXJlIDEgaXMgTW9uZGF5LiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgYGAlVmBgICAgIHwgSVNPIDg2MDEgd2VlayBhcyBhIGRlY2ltYWwgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICB8IFwoOCkgIHwKK3wgICAgICAgICAgIHwgbnVtYmVyIHdpdGggTW9uZGF5IGFzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay4gICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgV2VlayAwMSBpcyB0aGUgd2VlayBjb250YWluaW5nIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgSmFuIDQuICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKKworLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICBgYCVHYGAsIGBgJXVgYCBhbmQgYGAlVmBgIHdlcmUgYWRkZWQuCisKIE5vdGVzOgogCiAoMSkKQEAgLTE5NzUsNyArMjE1MywxNCBAQAogCiAoNykKICAgIFdoZW4gdXNlZCB3aXRoIHRoZSA6bWV0aDpgc3RycHRpbWVgIG1ldGhvZCwgYGAlVWBgIGFuZCBgYCVXYGAgYXJlIG9ubHkgdXNlZAotICAgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlIGRheSBvZiB0aGUgd2VlayBhbmQgdGhlIHllYXIgYXJlIHNwZWNpZmllZC4KKyAgIGluIGNhbGN1bGF0aW9ucyB3aGVuIHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSBjYWxlbmRhciB5ZWFyIChgYCVZYGApCisgICBhcmUgc3BlY2lmaWVkLgorCisoOCkKKyAgIFNpbWlsYXIgdG8gYGAlVWBgIGFuZCBgYCVXYGAsIGBgJVZgYCBpcyBvbmx5IHVzZWQgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlCisgICBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSBJU08geWVhciAoYGAlR2BgKSBhcmUgc3BlY2lmaWVkIGluIGEKKyAgIDptZXRoOmBzdHJwdGltZWAgZm9ybWF0IHN0cmluZy4gQWxzbyBub3RlIHRoYXQgYGAlR2BgIGFuZCBgYCVZYGAgYXJlIG5vdAorICAgaW50ZXJjaGFuZ2VhYmxlLgogCiAuLiBydWJyaWM6OiBGb290bm90ZXMKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZGJtLnJzdCBiL0RvYy9saWJyYXJ5L2RibS5yc3QKaW5kZXggMmExZGI5MS4uMzJlODBiMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGJtLnJzdAorKysgYi9Eb2MvbGlicmFyeS9kYm0ucnN0CkBAIC0zNTEsNiArMzUxLDEwIEBACiAgICAgICA6ZnVuYzpgLm9wZW5gIGFsd2F5cyBjcmVhdGVzIGEgbmV3IGRhdGFiYXNlIHdoZW4gdGhlIGZsYWcgaGFzIHRoZSB2YWx1ZQogICAgICAgYGAnbidgYC4KIAorICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy42IDMuOAorICAgICAgQ3JlYXRpbmcgZGF0YWJhc2UgaW4gYGAncidgYCBhbmQgYGAndydgYCBtb2Rlcy4gIE1vZGlmeWluZyBkYXRhYmFzZSBpbgorICAgICAgYGAncidgYCBtb2RlLgorCiAgICBJbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUKICAgIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLk11dGFibGVNYXBwaW5nYCBjbGFzcywgOmNsYXNzOmBkdW1iZGJtYCBvYmplY3RzCiAgICBwcm92aWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0IGIvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKaW5kZXggYjVjZTBiMS4uZWU3NDZlOSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKQEAgLTQ0Nyw2ICs0NDcsMTkgQEAKICAgICAgIGBgRGVjaW1hbCgnMzIxZSs1JykuYWRqdXN0ZWQoKWBgIHJldHVybnMgc2V2ZW4uICBVc2VkIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgIHBvc2l0aW9uIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0IHdpdGggcmVzcGVjdCB0byB0aGUgZGVjaW1hbCBwb2ludC4KIAorICAgLi4gbWV0aG9kOjogYXNfaW50ZWdlcl9yYXRpbygpCisKKyAgICAgIFJldHVybiBhIHBhaXIgYGAobiwgZClgYCBvZiBpbnRlZ2VycyB0aGF0IHJlcHJlc2VudCB0aGUgZ2l2ZW4KKyAgICAgIDpjbGFzczpgRGVjaW1hbGAgaW5zdGFuY2UgYXMgYSBmcmFjdGlvbiwgaW4gbG93ZXN0IHRlcm1zIGFuZAorICAgICAgd2l0aCBhIHBvc2l0aXZlIGRlbm9taW5hdG9yOjoKKworICAgICAgICAgID4+PiBEZWNpbWFsKCctMy4xNCcpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAgICgtMTU3LCA1MCkKKworICAgICAgVGhlIGNvbnZlcnNpb24gaXMgZXhhY3QuICBSYWlzZSBPdmVyZmxvd0Vycm9yIG9uIGluZmluaXRpZXMgYW5kIFZhbHVlRXJyb3IKKyAgICAgIG9uIE5hTnMuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgogCiAgICAuLiBtZXRob2Q6OiBhc190dXBsZSgpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2Rpcy5yc3QgYi9Eb2MvbGlicmFyeS9kaXMucnN0CmluZGV4IGQyZDhhYzcuLjBhNjRkNDYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2Rpcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGlzLnJzdApAQCAtMzEsOSArMzEsOSBAQAogCiAgICA+Pj4gZGlzLmRpcyhteWZ1bmMpCiAgICAgIDIgICAgICAgICAgIDAgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKGxlbikKLSAgICAgICAgICAgICAgICAgMyBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoYWxpc3QpCi0gICAgICAgICAgICAgICAgIDYgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEKLSAgICAgICAgICAgICAgICAgOSBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgICAgMiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoYWxpc3QpCisgICAgICAgICAgICAgICAgIDQgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICAgNiBSRVRVUk5fVkFMVUUKIAogKFRoZSAiMiIgaXMgYSBsaW5lIG51bWJlcikuCiAKQEAgLTYwNyw2ICs2MDcsMTIgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAKKy4uIG9wY29kZTo6IFNFVFVQX0FOTk9UQVRJT05TCisKKyAgIENoZWNrcyB3aGV0aGVyIGBgX19hbm5vdGF0aW9uc19fYGAgaXMgZGVmaW5lZCBpbiBgYGxvY2FscygpYGAsIGlmIG5vdCBpdCBpcworICAgc2V0IHVwIHRvIGFuIGVtcHR5IGBgZGljdGBgLiBUaGlzIG9wY29kZSBpcyBvbmx5IGVtbWl0dGVkIGlmIGEgY2xhc3MKKyAgIG9yIG1vZHVsZSBib2R5IGNvbnRhaW5zIDp0ZXJtOmB2YXJpYWJsZSBhbm5vdGF0aW9ucyA8dmFyaWFibGUgYW5ub3RhdGlvbj5gCisgICBzdGF0aWNhbGx5LgogCiAuLiBvcGNvZGU6OiBJTVBPUlRfU1RBUgogCkBAIC02ODIsOCArNjg4LDcgQEAKICAgIC4uIFhYWCBleHBsYWluIHRoZSBXSFkgc3R1ZmYhCiAKIAotQWxsIG9mIHRoZSBmb2xsb3dpbmcgb3Bjb2RlcyBleHBlY3QgYXJndW1lbnRzLiAgQW4gYXJndW1lbnQgaXMgdHdvIGJ5dGVzLCB3aXRoCi10aGUgbW9yZSBzaWduaWZpY2FudCBieXRlIGxhc3QuCitBbGwgb2YgdGhlIGZvbGxvd2luZyBvcGNvZGVzIHVzZSB0aGVpciBhcmd1bWVudHMuCiAKIC4uIG9wY29kZTo6IFNUT1JFX05BTUUgKG5hbWVpKQogCkBAIC03NjksNiArNzc0LDIzIEBACiAgICB0byBob2xkICpjb3VudCogZW50cmllcy4KIAogCisuLiBvcGNvZGU6OiBCVUlMRF9DT05TVF9LRVlfTUFQIChjb3VudCkKKworICAgVGhlIHZlcnNpb24gb2YgOm9wY29kZTpgQlVJTERfTUFQYCBzcGVjaWFsaXplZCBmb3IgY29uc3RhbnQga2V5cy4gICpjb3VudCoKKyAgIHZhbHVlcyBhcmUgY29uc3VtZWQgZnJvbSB0aGUgc3RhY2suICBUaGUgdG9wIGVsZW1lbnQgb24gdGhlIHN0YWNrIGNvbnRhaW5zCisgICBhIHR1cGxlIG9mIGtleXMuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKKy4uIG9wY29kZTo6IEJVSUxEX1NUUklORyAoY291bnQpCisKKyAgIENvbmNhdGVuYXRlcyAqY291bnQqIHN0cmluZ3MgZnJvbSB0aGUgc3RhY2sgYW5kIHB1c2hlcyB0aGUgcmVzdWx0aW5nIHN0cmluZworICAgb250byB0aGUgc3RhY2suCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKIC4uIG9wY29kZTo6IExPQURfQVRUUiAobmFtZWkpCiAKICAgIFJlcGxhY2VzIFRPUyB3aXRoIGBgZ2V0YXR0cihUT1MsIGNvX25hbWVzW25hbWVpXSlgYC4KQEAgLTg3NCw2ICs4OTYsMTEgQEAKICAgIERlbGV0ZXMgbG9jYWwgYGBjb192YXJuYW1lc1t2YXJfbnVtXWBgLgogCiAKKy4uIG9wY29kZTo6IFNUT1JFX0FOTk9UQVRJT04gKG5hbWVpKQorCisgICBTdG9yZXMgVE9TIGFzIGBgbG9jYWxzKClbJ19fYW5ub3RhdGlvbnNfXyddW2NvX25hbWVzW25hbWVpXV0gPSBUT1NgYC4KKworCiAuLiBvcGNvZGU6OiBMT0FEX0NMT1NVUkUgKGkpCiAKICAgIFB1c2hlcyBhIHJlZmVyZW5jZSB0byB0aGUgY2VsbCBjb250YWluZWQgaW4gc2xvdCAqaSogb2YgdGhlIGNlbGwgYW5kIGZyZWUKQEAgLTkyOSwyNyArOTU2LDE2IEBACiAuLiBvcGNvZGU6OiBNQUtFX0ZVTkNUSU9OIChhcmdjKQogCiAgICBQdXNoZXMgYSBuZXcgZnVuY3Rpb24gb2JqZWN0IG9uIHRoZSBzdGFjay4gIEZyb20gYm90dG9tIHRvIHRvcCwgdGhlIGNvbnN1bWVkCi0gICBzdGFjayBtdXN0IGNvbnNpc3Qgb2YKKyAgIHN0YWNrIG11c3QgY29uc2lzdCBvZiB2YWx1ZXMgaWYgdGhlIGFyZ3VtZW50IGNhcnJpZXMgYSBzcGVjaWZpZWQgZmxhZyB2YWx1ZQogCi0gICAqIGBgYXJnYyAmIDB4RkZgYCBkZWZhdWx0IGFyZ3VtZW50IG9iamVjdHMgaW4gcG9zaXRpb25hbCBvcmRlcgotICAgKiBgYChhcmdjID4+IDgpICYgMHhGRmBgIHBhaXJzIG9mIG5hbWUgYW5kIGRlZmF1bHQgYXJndW1lbnQsIHdpdGggdGhlIG5hbWUKLSAgICAganVzdCBiZWxvdyB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjaywgZm9yIGtleXdvcmQtb25seSBwYXJhbWV0ZXJzCi0gICAqIGBgKGFyZ2MgPj4gMTYpICYgMHg3RkZGYGAgcGFyYW1ldGVyIGFubm90YXRpb24gb2JqZWN0cwotICAgKiBhIHR1cGxlIGxpc3RpbmcgdGhlIHBhcmFtZXRlciBuYW1lcyBmb3IgdGhlIGFubm90YXRpb25zIChvbmx5IGlmIHRoZXJlIGFyZQotICAgICBvbnkgYW5ub3RhdGlvbiBvYmplY3RzKQorICAgKiBgYDB4MDFgYCBhIHR1cGxlIG9mIGRlZmF1bHQgYXJndW1lbnQgb2JqZWN0cyBpbiBwb3NpdGlvbmFsIG9yZGVyCisgICAqIGBgMHgwMmBgIGEgZGljdGlvbmFyeSBvZiBrZXl3b3JkLW9ubHkgcGFyYW1ldGVycycgZGVmYXVsdCB2YWx1ZXMKKyAgICogYGAweDA0YGAgYW4gYW5ub3RhdGlvbiBkaWN0aW9uYXJ5CisgICAqIGBgMHgwOGBgIGEgdHVwbGUgY29udGFpbmluZyBjZWxscyBmb3IgZnJlZSB2YXJpYWJsZXMsIG1ha2luZyBhIGNsb3N1cmUKICAgICogdGhlIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAoYXQgVE9TMSkKICAgICogdGhlIDp0ZXJtOmBxdWFsaWZpZWQgbmFtZWAgb2YgdGhlIGZ1bmN0aW9uIChhdCBUT1MpCiAKIAotLi4gb3Bjb2RlOjogTUFLRV9DTE9TVVJFIChhcmdjKQotCi0gICBDcmVhdGVzIGEgbmV3IGZ1bmN0aW9uIG9iamVjdCwgc2V0cyBpdHMgKl9fY2xvc3VyZV9fKiBzbG90LCBhbmQgcHVzaGVzIGl0IG9uCi0gICB0aGUgc3RhY2suICBUT1MgaXMgdGhlIDp0ZXJtOmBxdWFsaWZpZWQgbmFtZWAgb2YgdGhlIGZ1bmN0aW9uLCBUT1MxIGlzIHRoZQotICAgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uLCBhbmQgVE9TMiBpcyB0aGUgdHVwbGUgY29udGFpbmluZyBjZWxscyBmb3IKLSAgIHRoZSBjbG9zdXJlJ3MgZnJlZSB2YXJpYWJsZXMuICAqYXJnYyogaXMgaW50ZXJwcmV0ZWQgYXMgaW4gYGBNQUtFX0ZVTkNUSU9OYGA7Ci0gICB0aGUgYW5ub3RhdGlvbnMgYW5kIGRlZmF1bHRzIGFyZSBhbHNvIGluIHRoZSBzYW1lIG9yZGVyIGJlbG93IFRPUzIuCi0KLQogLi4gb3Bjb2RlOjogQlVJTERfU0xJQ0UgKGFyZ2MpCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogc2xpY2UKQEAgLTk4OSw2ICsxMDA1LDI4IEBACiAgICBhcmd1bWVudHMuCiAKIAorLi4gb3Bjb2RlOjogRk9STUFUX1ZBTFVFIChmbGFncykKKworICAgVXNlZCBmb3IgaW1wbGVtZW50aW5nIGZvcm1hdHRlZCBsaXRlcmFsIHN0cmluZ3MgKGYtc3RyaW5ncykuICBQb3BzCisgICBhbiBvcHRpb25hbCAqZm10X3NwZWMqIGZyb20gdGhlIHN0YWNrLCB0aGVuIGEgcmVxdWlyZWQgKnZhbHVlKi4KKyAgICpmbGFncyogaXMgaW50ZXJwcmV0ZWQgYXMgZm9sbG93czoKKworICAgKiBgYChmbGFncyAmIDB4MDMpID09IDB4MDBgYDogKnZhbHVlKiBpcyBmb3JtYXR0ZWQgYXMtaXMuCisgICAqIGBgKGZsYWdzICYgMHgwMykgPT0gMHgwMWBgOiBjYWxsIDpmdW5jOmBzdHJgIG9uICp2YWx1ZSogYmVmb3JlCisgICAgIGZvcm1hdHRpbmcgaXQuCisgICAqIGBgKGZsYWdzICYgMHgwMykgPT0gMHgwMmBgOiBjYWxsIDpmdW5jOmByZXByYCBvbiAqdmFsdWUqIGJlZm9yZQorICAgICBmb3JtYXR0aW5nIGl0LgorICAgKiBgYChmbGFncyAmIDB4MDMpID09IDB4MDNgYDogY2FsbCA6ZnVuYzpgYXNjaWlgIG9uICp2YWx1ZSogYmVmb3JlCisgICAgIGZvcm1hdHRpbmcgaXQuCisgICAqIGBgKGZsYWdzICYgMHgwNCkgPT0gMHgwNGBgOiBwb3AgKmZtdF9zcGVjKiBmcm9tIHRoZSBzdGFjayBhbmQgdXNlCisgICAgIGl0LCBlbHNlIHVzZSBhbiBlbXB0eSAqZm10X3NwZWMqLgorCisgICBGb3JtYXR0aW5nIGlzIHBlcmZvcm1lZCB1c2luZyA6YzpmdW5jOmBQeU9iamVjdF9Gb3JtYXRgLiAgVGhlCisgICByZXN1bHQgaXMgcHVzaGVkIG9uIHRoZSBzdGFjay4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogLi4gb3Bjb2RlOjogSEFWRV9BUkdVTUVOVAogCiAgICBUaGlzIGlzIG5vdCByZWFsbHkgYW4gb3Bjb2RlLiAgSXQgaWRlbnRpZmllcyB0aGUgZGl2aWRpbmcgbGluZSBiZXR3ZWVuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9lbWFpbC1leGFtcGxlcy5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC1leGFtcGxlcy5yc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTNiNWMuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwtZXhhbXBsZXMucnN0CisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLi4gX2VtYWlsLWV4YW1wbGVzOgotCi06bW9kOmBlbWFpbGA6IEV4YW1wbGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhlcmUgYXJlIGEgZmV3IGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgdGhlIDptb2Q6YGVtYWlsYCBwYWNrYWdlIHRvIHJlYWQsIHdyaXRlLAotYW5kIHNlbmQgc2ltcGxlIGVtYWlsIG1lc3NhZ2VzLCBhcyB3ZWxsIGFzIG1vcmUgY29tcGxleCBNSU1FIG1lc3NhZ2VzLgotCi1GaXJzdCwgbGV0J3Mgc2VlIGhvdyB0byBjcmVhdGUgYW5kIHNlbmQgYSBzaW1wbGUgdGV4dCBtZXNzYWdlOgotCi0uLiBsaXRlcmFsaW5jbHVkZTo6IC4uL2luY2x1ZGVzL2VtYWlsLXNpbXBsZS5weQotCi0KLUFuZCBwYXJzaW5nIFJGQzgyMiBoZWFkZXJzIGNhbiBlYXNpbHkgYmUgZG9uZSBieSB0aGUgcGFyc2UoZmlsZW5hbWUpIG9yCi1wYXJzZXN0cihtZXNzYWdlX2FzX3N0cmluZykgbWV0aG9kcyBvZiB0aGUgUGFyc2VyKCkgY2xhc3M6Ci0KLS4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvZW1haWwtaGVhZGVycy5weQotCi0KLUhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB0byBzZW5kIGEgTUlNRSBtZXNzYWdlIGNvbnRhaW5pbmcgYSBidW5jaCBvZiBmYW1pbHkKLXBpY3R1cmVzIHRoYXQgbWF5IGJlIHJlc2lkaW5nIGluIGEgZGlyZWN0b3J5OgotCi0uLiBsaXRlcmFsaW5jbHVkZTo6IC4uL2luY2x1ZGVzL2VtYWlsLW1pbWUucHkKLQotCi1IZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gc2VuZCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5IGFzIGFuIGVtYWlsCi1tZXNzYWdlOiBbMV1fCi0KLS4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvZW1haWwtZGlyLnB5Ci0KLQotSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVucGFjayBhIE1JTUUgbWVzc2FnZSBsaWtlIHRoZSBvbmUKLWFib3ZlLCBpbnRvIGEgZGlyZWN0b3J5IG9mIGZpbGVzOgotCi0uLiBsaXRlcmFsaW5jbHVkZTo6IC4uL2luY2x1ZGVzL2VtYWlsLXVucGFjay5weQotCi1IZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gY3JlYXRlIGFuIEhUTUwgbWVzc2FnZSB3aXRoIGFuIGFsdGVybmF0aXZlIHBsYWluCi10ZXh0IHZlcnNpb246IFsyXV8KLQotLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9lbWFpbC1hbHRlcm5hdGl2ZS5weQotCi0KLS4uIF9lbWFpbC1jb250ZW50bWFuYWdlci1hcGktZXhhbXBsZXM6Ci0KLUV4YW1wbGVzIHVzaW5nIHRoZSBQcm92aXNpb25hbCBBUEkKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLUhlcmUgaXMgYSByZXdvcmtpbmcgb2YgdGhlIGxhc3QgZXhhbXBsZSB1c2luZyB0aGUgcHJvdmlzaW9uYWwgQVBJLiAgVG8gbWFrZQotdGhpbmdzIGEgYml0IG1vcmUgaW50ZXJlc3RpbmcsIHdlIGluY2x1ZGUgYSByZWxhdGVkIGltYWdlIGluIHRoZSBodG1sIHBhcnQsIGFuZAotd2Ugc2F2ZSBhIGNvcHkgb2Ygd2hhdCB3ZSBhcmUgZ29pbmcgdG8gc2VuZCB0byBkaXNrLCBhcyB3ZWxsIGFzIHNlbmRpbmcgaXQuCi0KLVRoaXMgZXhhbXBsZSBhbHNvIHNob3dzIGhvdyBlYXN5IGl0IGlzIHRvIGluY2x1ZGUgbm9uLUFTQ0lJLCBhbmQgc2ltcGxpZmllcyB0aGUKLXNlbmRpbmcgb2YgdGhlIG1lc3NhZ2UgdXNpbmcgdGhlIDptZXRoOmAuc2VuZF9tZXNzYWdlYCBtZXRob2Qgb2YgdGhlCi06bW9kOmBzbXRwbGliYCBtb2R1bGUuCi0KLS4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvZW1haWwtYWx0ZXJuYXRpdmUtbmV3LWFwaS5weQotCi1JZiB3ZSB3ZXJlIGluc3RlYWQgc2VudCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBsYXN0IGV4YW1wbGUsIGhlcmUgaXMgb25lCi13YXkgd2UgY291bGQgcHJvY2VzcyBpdDoKLQotLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9lbWFpbC1yZWFkLWFsdGVybmF0aXZlLW5ldy1hcGkucHkKLQotVXAgdG8gdGhlIHByb21wdCwgdGhlIG91dHB1dCBmcm9tIHRoZSBhYm92ZSBpczoKLQotLi4gY29kZS1ibG9jazo6IG5vbmUKLQotICAgIFRvOiBQZW5lbG9wZSBQdXNzeWNhdCA8cGVuZWxvcGVAZXhhbXBsZS5jb20+LCBGYWJyZXR0ZSBQdXNzeWNhdCA8ZmFicmV0dGVAZXhhbXBsZS5jb20+Ci0gICAgRnJvbTogUGVww6kgTGUgUGV3IDxwZXBlQGV4YW1wbGUuY29tPgotICAgIFN1YmplY3Q6IEF5b25zIGFzcGVyZ2VzIHBvdXIgbGUgZMOpamV1bmVyCi0KLSAgICBTYWx1dCEKLQotICAgIENlbGEgcmVzc2VtYmxlIMOgIHVuIGV4Y2VsbGVudCByZWNpcGllWzFdIGTDqWpldW5lci4KLQotCi0uLiBydWJyaWM6OiBGb290bm90ZXMKLQotLi4gWzFdIFRoYW5rcyB0byBNYXR0aGV3IERpeG9uIENvd2xlcyBmb3IgdGhlIG9yaWdpbmFsIGluc3BpcmF0aW9uIGFuZCBleGFtcGxlcy4KLS4uIFsyXSBDb250cmlidXRlZCBieSBNYXJ0aW4gTWF0ZWplay4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2VtYWlsLmNoYXJzZXQucnN0IGIvRG9jL2xpYnJhcnkvZW1haWwuY2hhcnNldC5yc3QKaW5kZXggMTYxZDg2YS4uMDUzNDYzZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwuY2hhcnNldC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZW1haWwuY2hhcnNldC5yc3QKQEAgLTgsNiArOCwxMSBAQAogCiAtLS0tLS0tLS0tLS0tLQogCitUaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBsZWdhY3kgKGBgQ29tcGF0MzJgYCkgZW1haWwgQVBJLiAgSW4gdGhlIG5ldworQVBJIG9ubHkgdGhlIGFsaWFzZXMgdGFibGUgaXMgdXNlZC4KKworVGhlIHJlbWFpbmluZyB0ZXh0IGluIHRoaXMgc2VjdGlvbiBpcyB0aGUgb3JpZ2luYWwgZG9jdW1lbnRhdGlvbiBvZiB0aGUgbW9kdWxlLgorCiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGNsYXNzIDpjbGFzczpgQ2hhcnNldGAgZm9yIHJlcHJlc2VudGluZyBjaGFyYWN0ZXIgc2V0cwogYW5kIGNoYXJhY3RlciBzZXQgY29udmVyc2lvbnMgaW4gZW1haWwgbWVzc2FnZXMsIGFzIHdlbGwgYXMgYSBjaGFyYWN0ZXIgc2V0CiByZWdpc3RyeSBhbmQgc2V2ZXJhbCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBtYW5pcHVsYXRpbmcgdGhpcyByZWdpc3RyeS4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2VtYWlsLmNvbXBhdDMyLW1lc3NhZ2UucnN0IGIvRG9jL2xpYnJhcnkvZW1haWwuY29tcGF0MzItbWVzc2FnZS5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2NTA3OQotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWJyYXJ5L2VtYWlsLmNvbXBhdDMyLW1lc3NhZ2UucnN0CkBAIC0wLDAgKzEsNzU0IEBACisuLiBfY29tcGF0MzJfbWVzc2FnZToKKworOm1vZDpgZW1haWwubWVzc2FnZS5NZXNzYWdlYDogUmVwcmVzZW50aW5nIGFuIGVtYWlsIG1lc3NhZ2UgdXNpbmcgdGhlIDpkYXRhOmB+ZW1haWwucG9saWN5LmNvbXBhdDMyYCBBUEkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIG1vZHVsZTo6IGVtYWlsLm1lc3NhZ2UKKyAgIDpzeW5vcHNpczogVGhlIGJhc2UgY2xhc3MgcmVwcmVzZW50aW5nIGVtYWlsIG1lc3NhZ2VzIGluIGEgZmFzaGlvbgorICAgICAgICAgICAgICBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggcHl0aG9uMy4yCisKKworVGhlIDpjbGFzczpgTWVzc2FnZWAgY2xhc3MgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZQorOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgIGNsYXNzLCB3aXRob3V0IHRoZSBtZXRob2RzIGFkZGVkIGJ5IHRoYXQKK2NsYXNzLCBhbmQgd2l0aCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBjZXJ0YWluIG90aGVyIG1ldGhvZHMgYmVpbmcgc2xpZ2h0bHkKK2RpZmZlcmVudC4gIFdlIGFsc28gZG9jdW1lbnQgaGVyZSBzb21lIG1ldGhvZHMgdGhhdCwgd2hpbGUgc3VwcG9ydGVkIGJ5IHRoZQorOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgIGNsYXNzLCBhcmUgbm90IHJlY29tbWVuZGVkIHVubGVzcyB5b3UgYXJlCitkZWFsaW5nIHdpdGggbGVnYWN5IGNvZGUuCisKK1RoZSBwaGlsb3NvcGh5IGFuZCBzdHJ1Y3R1cmUgb2YgdGhlIHR3byBjbGFzc2VzIGlzIG90aGVyd2lzZSB0aGUgc2FtZS4KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGJlaGF2aW9yIHVuZGVyIHRoZSBkZWZhdWx0IChmb3IgOmNsYXNzOmBNZXNzYWdlYCkKK3BvbGljeSA6YXR0cjpgfmVtYWlsLnBvbGljeS5Db21wYXQzMmAuICBJZiB5b3UgYXJlIGdvaW5nIHRvIHVzZSBhbm90aGVyIHBvbGljeSwKK3lvdSBzaG91bGQgYmUgdXNpbmcgdGhlIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlYCBjbGFzcyBpbnN0ZWFkLgorCitBbiBlbWFpbCBtZXNzYWdlIGNvbnNpc3RzIG9mICpoZWFkZXJzKiBhbmQgYSAqcGF5bG9hZCouICBIZWFkZXJzIG11c3QgYmUKKzpyZmM6YDUyMzNgIHN0eWxlIG5hbWVzIGFuZCB2YWx1ZXMsIHdoZXJlIHRoZSBmaWVsZCBuYW1lIGFuZCB2YWx1ZSBhcmUKK3NlcGFyYXRlZCBieSBhIGNvbG9uLiAgVGhlIGNvbG9uIGlzIG5vdCBwYXJ0IG9mIGVpdGhlciB0aGUgZmllbGQgbmFtZSBvciB0aGUKK2ZpZWxkIHZhbHVlLiAgVGhlIHBheWxvYWQgbWF5IGJlIGEgc2ltcGxlIHRleHQgbWVzc2FnZSwgb3IgYSBiaW5hcnkgb2JqZWN0LCBvcgorYSBzdHJ1Y3R1cmVkIHNlcXVlbmNlIG9mIHN1Yi1tZXNzYWdlcyBlYWNoIHdpdGggdGhlaXIgb3duIHNldCBvZiBoZWFkZXJzIGFuZAordGhlaXIgb3duIHBheWxvYWQuICBUaGUgbGF0dGVyIHR5cGUgb2YgcGF5bG9hZCBpcyBpbmRpY2F0ZWQgYnkgdGhlIG1lc3NhZ2UKK2hhdmluZyBhIE1JTUUgdHlwZSBzdWNoIGFzIDptaW1ldHlwZTpgbXVsdGlwYXJ0L1wqYCBvcgorOm1pbWV0eXBlOmBtZXNzYWdlL3JmYzgyMmAuCisKK1RoZSBjb25jZXB0dWFsIG1vZGVsIHByb3ZpZGVkIGJ5IGEgOmNsYXNzOmBNZXNzYWdlYCBvYmplY3QgaXMgdGhhdCBvZiBhbgorb3JkZXJlZCBkaWN0aW9uYXJ5IG9mIGhlYWRlcnMgd2l0aCBhZGRpdGlvbmFsIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBib3RoCitzcGVjaWFsaXplZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBoZWFkZXJzLCBmb3IgYWNjZXNzaW5nIHRoZSBwYXlsb2FkLCBmb3IKK2dlbmVyYXRpbmcgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIG1zc2FnZSwgYW5kIGZvciByZWN1cnNpdmVseSB3YWxraW5nIG92ZXIKK3RoZSBvYmplY3QgdHJlZS4gIE5vdGUgdGhhdCBkdXBsaWNhdGUgaGVhZGVycyBhcmUgc3VwcG9ydGVkIGJ1dCBzcGVjaWFsIG1ldGhvZHMKK211c3QgYmUgdXNlZCB0byBhY2Nlc3MgdGhlbS4KKworVGhlIDpjbGFzczpgTWVzc2FnZWAgcHN1ZWRvLWRpY3Rpb25hcnkgaXMgaW5kZXhlZCBieSB0aGUgaGVhZGVyIG5hbWVzLCB3aGljaAorbXVzdCBiZSBBU0NJSSB2YWx1ZXMuICBUaGUgdmFsdWVzIG9mIHRoZSBkaWN0aW9uYXJ5IGFyZSBzdHJpbmdzIHRoYXQgYXJlCitzdXBwb3NlZCB0byBjb250YWluIG9ubHkgQVNDSUkgY2hhcmFjdGVyczsgdGhlcmUgaXMgc29tZSBzcGVjaWFsIGhhbmRsaW5nIGZvcgorbm9uLUFTQ0lJIGlucHV0LCBidXQgaXQgZG9lc24ndCBhbHdheXMgcHJvZHVjZSB0aGUgY29ycmVjdCByZXN1bHRzLiAgSGVhZGVycworYXJlIHN0b3JlZCBhbmQgcmV0dXJuZWQgaW4gY2FzZS1wcmVzZXJ2aW5nIGZvcm0sIGJ1dCBmaWVsZCBuYW1lcyBhcmUgbWF0Y2hlZAorY2FzZS1pbnNlbnNpdGl2ZWx5LiAgVGhlcmUgbWF5IGFsc28gYmUgYSBzaW5nbGUgZW52ZWxvcGUgaGVhZGVyLCBhbHNvIGtub3duIGFzCit0aGUgKlVuaXgtRnJvbSogaGVhZGVyIG9yIHRoZSBgYEZyb21fYGAgaGVhZGVyLiAgVGhlICpwYXlsb2FkKiBpcyBlaXRoZXIgYQorc3RyaW5nIG9yIGJ5dGVzLCBpbiB0aGUgY2FzZSBvZiBzaW1wbGUgbWVzc2FnZSBvYmplY3RzLCBvciBhIGxpc3Qgb2YKKzpjbGFzczpgTWVzc2FnZWAgb2JqZWN0cywgZm9yIE1JTUUgY29udGFpbmVyIGRvY3VtZW50cyAoZS5nLgorOm1pbWV0eXBlOmBtdWx0aXBhcnQvXCpgIGFuZCA6bWltZXR5cGU6YG1lc3NhZ2UvcmZjODIyYCkuCisKK0hlcmUgYXJlIHRoZSBtZXRob2RzIG9mIHRoZSA6Y2xhc3M6YE1lc3NhZ2VgIGNsYXNzOgorCisKKy4uIGNsYXNzOjogTWVzc2FnZShwb2xpY3k9Y29tcGF0MzIpCisKKyAgIElmICpwb2xpY3kqIGlzIHNwZWNpZmllZCAoaXQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhIDptb2Q6YH5lbWFpbC5wb2xpY3lgCisgICBjbGFzcykgdXNlIHRoZSBydWxlcyBpdCBzcGVjaWZpZXMgdG8gdXBkYXRlIGFuZCBzZXJpYWxpemUgdGhlIHJlcHJlc2VudGF0aW9uCisgICBvZiB0aGUgbWVzc2FnZS4gIElmICpwb2xpY3kqIGlzIG5vdCBzZXQsIHVzZSB0aGUgOmNsYXNzOmBjb21wYXQzMgorICAgPGVtYWlsLnBvbGljeS5Db21wYXQzMj5gIHBvbGljeSwgd2hpY2ggbWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAorICAgdGhlIFB5dGhvbiAzLjIgdmVyc2lvbiBvZiB0aGUgZW1haWwgcGFja2FnZS4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUKKyAgIDptb2Q6YH5lbWFpbC5wb2xpY3lgIGRvY3VtZW50YXRpb24uCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zIFRoZSAqcG9saWN5KiBrZXl3b3JkIGFyZ3VtZW50IHdhcyBhZGRlZC4KKworCisgICAuLiBtZXRob2Q6OiBhc19zdHJpbmcodW5peGZyb209RmFsc2UsIG1heGhlYWRlcmxlbj0wLCBwb2xpY3k9Tm9uZSkKKworICAgICAgUmV0dXJuIHRoZSBlbnRpcmUgbWVzc2FnZSBmbGF0dGVuZWQgYXMgYSBzdHJpbmcuICBXaGVuIG9wdGlvbmFsICp1bml4ZnJvbSoKKyAgICAgIGlzIHRydWUsIHRoZSBlbnZlbG9wZSBoZWFkZXIgaXMgaW5jbHVkZWQgaW4gdGhlIHJldHVybmVkIHN0cmluZy4KKyAgICAgICp1bml4ZnJvbSogZGVmYXVsdHMgdG8gYGBGYWxzZWBgLiAgRm9yIGJhY2t3YXJkIGNvbXBhYml0aWxpdHkgcmVhc29ucywKKyAgICAgICptYXhoZWFkZXJsZW4qIGRlZmF1bHRzIHRvIGBgMGBgLCBzbyBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCB2YWx1ZSB5b3UKKyAgICAgIG11c3Qgb3ZlcnJpZGUgaXQgZXhwbGljaXRseSAodGhlIHZhbHVlIHNwZWNpZmllZCBmb3IgKm1heF9saW5lX2xlbmd0aCogaW4KKyAgICAgIHRoZSBwb2xpY3kgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoaXMgbWV0aG9kKS4gIFRoZSAqcG9saWN5KiBhcmd1bWVudCBtYXkgYmUKKyAgICAgIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcG9saWN5IG9idGFpbmVkIGZyb20gdGhlIG1lc3NhZ2UgaW5zdGFuY2UuCisgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgc29tZSBvZiB0aGUgZm9ybWF0dGluZyBwcm9kdWNlZCBieSB0aGUKKyAgICAgIG1ldGhvZCwgc2luY2UgdGhlIHNwZWNpZmllZCAqcG9saWN5KiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgYGBHZW5lcmF0b3JgYC4KKworICAgICAgRmxhdHRlbmluZyB0aGUgbWVzc2FnZSBtYXkgdHJpZ2dlciBjaGFuZ2VzIHRvIHRoZSA6Y2xhc3M6YE1lc3NhZ2VgIGlmCisgICAgICBkZWZhdWx0cyBuZWVkIHRvIGJlIGZpbGxlZCBpbiB0byBjb21wbGV0ZSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYSBzdHJpbmcKKyAgICAgIChmb3IgZXhhbXBsZSwgTUlNRSBib3VuZGFyaWVzIG1heSBiZSBnZW5lcmF0ZWQgb3IgbW9kaWZpZWQpLgorCisgICAgICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSBhbmQgbWF5IG5vdCBhbHdheXMKKyAgICAgIGZvcm1hdCB0aGUgbWVzc2FnZSB0aGUgd2F5IHlvdSB3YW50LiAgRm9yIGV4YW1wbGUsIGJ5IGRlZmF1bHQgaXQgZG9lcworICAgICAgbm90IGRvIHRoZSBtYW5nbGluZyBvZiBsaW5lcyB0aGF0IGJlZ2luIHdpdGggYGBGcm9tYGAgdGhhdCBpcworICAgICAgcmVxdWlyZWQgYnkgdGhlIHVuaXggbWJveCBmb3JtYXQuICBGb3IgbW9yZSBmbGV4aWJpbGl0eSwgaW5zdGFudGlhdGUgYQorICAgICAgOmNsYXNzOmB+ZW1haWwuZ2VuZXJhdG9yLkdlbmVyYXRvcmAgaW5zdGFuY2UgYW5kIHVzZSBpdHMKKyAgICAgIDptZXRoOmB+ZW1haWwuZ2VuZXJhdG9yLkdlbmVyYXRvci5mbGF0dGVuYCBtZXRob2QgZGlyZWN0bHkuICBGb3IgZXhhbXBsZTo6CisKKyAgICAgICAgIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgICBmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgR2VuZXJhdG9yCisgICAgICAgICBmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgIGcgPSBHZW5lcmF0b3IoZnAsIG1hbmdsZV9mcm9tXz1UcnVlLCBtYXhoZWFkZXJsZW49NjApCisgICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICAgdGV4dCA9IGZwLmdldHZhbHVlKCkKKworICAgICAgSWYgdGhlIG1lc3NhZ2Ugb2JqZWN0IGNvbnRhaW5zIGJpbmFyeSBkYXRhIHRoYXQgaXMgbm90IGVuY29kZWQgYWNjb3JkaW5nCisgICAgICB0byBSRkMgc3RhbmRhcmRzLCB0aGUgbm9uLWNvbXBsaWFudCBkYXRhIHdpbGwgYmUgcmVwbGFjZWQgYnkgdW5pY29kZQorICAgICAgInVua25vd24gY2hhcmFjdGVyIiBjb2RlIHBvaW50cy4gIChTZWUgYWxzbyA6bWV0aDpgLmFzX2J5dGVzYCBhbmQKKyAgICAgIDpjbGFzczpgfmVtYWlsLmdlbmVyYXRvci5CeXRlc0dlbmVyYXRvcmAuKQorCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNCB0aGUgKnBvbGljeSoga2V5d29yZCBhcmd1bWVudCB3YXMgYWRkZWQuCisKKworICAgLi4gbWV0aG9kOjogX19zdHJfXygpCisKKyAgICAgIEVxdWl2YWxlbnQgdG8gOm1ldGg6YC5hc19zdHJpbmcoKWAuICBBbGxvd3MgYGBzdHIobXNnKWBgIHRvIHByb2R1Y2UgYQorICAgICAgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgorCisKKyAgIC4uIG1ldGhvZDo6IGFzX2J5dGVzKHVuaXhmcm9tPUZhbHNlLCBwb2xpY3k9Tm9uZSkKKworICAgICAgUmV0dXJuIHRoZSBlbnRpcmUgbWVzc2FnZSBmbGF0dGVuZWQgYXMgYSBieXRlcyBvYmplY3QuICBXaGVuIG9wdGlvbmFsCisgICAgICAqdW5peGZyb20qIGlzIHRydWUsIHRoZSBlbnZlbG9wZSBoZWFkZXIgaXMgaW5jbHVkZWQgaW4gdGhlIHJldHVybmVkCisgICAgICBzdHJpbmcuICAqdW5peGZyb20qIGRlZmF1bHRzIHRvIGBgRmFsc2VgYC4gIFRoZSAqcG9saWN5KiBhcmd1bWVudCBtYXkgYmUKKyAgICAgIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcG9saWN5IG9idGFpbmVkIGZyb20gdGhlIG1lc3NhZ2UgaW5zdGFuY2UuCisgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgc29tZSBvZiB0aGUgZm9ybWF0dGluZyBwcm9kdWNlZCBieSB0aGUKKyAgICAgIG1ldGhvZCwgc2luY2UgdGhlIHNwZWNpZmllZCAqcG9saWN5KiB3aWxsIGJlIHBhc3NlZCB0byB0aGUKKyAgICAgIGBgQnl0ZXNHZW5lcmF0b3JgYC4KKworICAgICAgRmxhdHRlbmluZyB0aGUgbWVzc2FnZSBtYXkgdHJpZ2dlciBjaGFuZ2VzIHRvIHRoZSA6Y2xhc3M6YE1lc3NhZ2VgIGlmCisgICAgICBkZWZhdWx0cyBuZWVkIHRvIGJlIGZpbGxlZCBpbiB0byBjb21wbGV0ZSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYSBzdHJpbmcKKyAgICAgIChmb3IgZXhhbXBsZSwgTUlNRSBib3VuZGFyaWVzIG1heSBiZSBnZW5lcmF0ZWQgb3IgbW9kaWZpZWQpLgorCisgICAgICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSBhbmQgbWF5IG5vdCBhbHdheXMKKyAgICAgIGZvcm1hdCB0aGUgbWVzc2FnZSB0aGUgd2F5IHlvdSB3YW50LiAgRm9yIGV4YW1wbGUsIGJ5IGRlZmF1bHQgaXQgZG9lcworICAgICAgbm90IGRvIHRoZSBtYW5nbGluZyBvZiBsaW5lcyB0aGF0IGJlZ2luIHdpdGggYGBGcm9tYGAgdGhhdCBpcworICAgICAgcmVxdWlyZWQgYnkgdGhlIHVuaXggbWJveCBmb3JtYXQuICBGb3IgbW9yZSBmbGV4aWJpbGl0eSwgaW5zdGFudGlhdGUgYQorICAgICAgOmNsYXNzOmB+ZW1haWwuZ2VuZXJhdG9yLkJ5dGVzR2VuZXJhdG9yYCBpbnN0YW5jZSBhbmQgdXNlIGl0cworICAgICAgOm1ldGg6YH5lbWFpbC5nZW5lcmF0b3IuQnl0ZXNHZW5lcmF0b3IuZmxhdHRlbmAgbWV0aG9kIGRpcmVjdGx5LgorICAgICAgRm9yIGV4YW1wbGU6OgorCisgICAgICAgICBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCisgICAgICAgICBmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgQnl0ZXNHZW5lcmF0b3IKKyAgICAgICAgIGZwID0gQnl0ZXNJTygpCisgICAgICAgICBnID0gQnl0ZXNHZW5lcmF0b3IoZnAsIG1hbmdsZV9mcm9tXz1UcnVlLCBtYXhoZWFkZXJsZW49NjApCisgICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICAgdGV4dCA9IGZwLmdldHZhbHVlKCkKKworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CisKKworICAgLi4gbWV0aG9kOjogX19ieXRlc19fKCkKKworICAgICAgRXF1aXZhbGVudCB0byA6bWV0aDpgLmFzX2J5dGVzKClgLiAgQWxsb3dzIGBgYnl0ZXMobXNnKWBgIHRvIHByb2R1Y2UgYQorICAgICAgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKKworCisgICAuLiBtZXRob2Q6OiBpc19tdWx0aXBhcnQoKQorCisgICAgICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlIG1lc3NhZ2UncyBwYXlsb2FkIGlzIGEgbGlzdCBvZiBzdWItXAorICAgICAgOmNsYXNzOmBNZXNzYWdlYCBvYmplY3RzLCBvdGhlcndpc2UgcmV0dXJuIGBgRmFsc2VgYC4gIFdoZW4KKyAgICAgIDptZXRoOmBpc19tdWx0aXBhcnRgIHJldHVybnMgYGBGYWxzZWBgLCB0aGUgcGF5bG9hZCBzaG91bGQgYmUgYSBzdHJpbmcKKyAgICAgIG9iamVjdCAod2hpY2ggbWlnaHQgYmUgYSBDVEUgZW5jb2RlZCBiaW5hcnkgcGF5bG9hZC4gIChOb3RlIHRoYXQKKyAgICAgIDptZXRoOmBpc19tdWx0aXBhcnRgIHJldHVybmluZyBgYFRydWVgYCBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoYXQKKyAgICAgICJtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSA9PSAnbXVsdGlwYXJ0JyIgd2lsbCByZXR1cm4gdGhlIGBgVHJ1ZWBgLgorICAgICAgRm9yIGV4YW1wbGUsIGBgaXNfbXVsdGlwYXJ0YGAgd2lsbCByZXR1cm4gYGBUcnVlYGAgd2hlbiB0aGUKKyAgICAgIDpjbGFzczpgTWVzc2FnZWAgaXMgb2YgdHlwZSBgYG1lc3NhZ2UvcmZjODIyYGAuKQorCisKKyAgIC4uIG1ldGhvZDo6IHNldF91bml4ZnJvbSh1bml4ZnJvbSkKKworICAgICAgU2V0IHRoZSBtZXNzYWdlJ3MgZW52ZWxvcGUgaGVhZGVyIHRvICp1bml4ZnJvbSosIHdoaWNoIHNob3VsZCBiZSBhIHN0cmluZy4KKworCisgICAuLiBtZXRob2Q6OiBnZXRfdW5peGZyb20oKQorCisgICAgICBSZXR1cm4gdGhlIG1lc3NhZ2UncyBlbnZlbG9wZSBoZWFkZXIuICBEZWZhdWx0cyB0byBgYE5vbmVgYCBpZiB0aGUKKyAgICAgIGVudmVsb3BlIGhlYWRlciB3YXMgbmV2ZXIgc2V0LgorCisKKyAgIC4uIG1ldGhvZDo6IGF0dGFjaChwYXlsb2FkKQorCisgICAgICBBZGQgdGhlIGdpdmVuICpwYXlsb2FkKiB0byB0aGUgY3VycmVudCBwYXlsb2FkLCB3aGljaCBtdXN0IGJlIGBgTm9uZWBgIG9yCisgICAgICBhIGxpc3Qgb2YgOmNsYXNzOmBNZXNzYWdlYCBvYmplY3RzIGJlZm9yZSB0aGUgY2FsbC4gQWZ0ZXIgdGhlIGNhbGwsIHRoZQorICAgICAgcGF5bG9hZCB3aWxsIGFsd2F5cyBiZSBhIGxpc3Qgb2YgOmNsYXNzOmBNZXNzYWdlYCBvYmplY3RzLiAgSWYgeW91IHdhbnQgdG8KKyAgICAgIHNldCB0aGUgcGF5bG9hZCB0byBhIHNjYWxhciBvYmplY3QgKGUuZy4gYSBzdHJpbmcpLCB1c2UKKyAgICAgIDptZXRoOmBzZXRfcGF5bG9hZGAgaW5zdGVhZC4KKworICAgICAgVGhpcyBpcyBhIGxlZ2FjeSBtZXRob2QuICBPbiB0aGUKKyAgICAgIDpjbGFzczpgfmVtYWlsLmVtYWlsbWVzc2FnZS5FbWFpbE1lc3NhZ2VgIGNsYXNzIGl0cyBmdW5jdGlvbmFsaXR5IGlzCisgICAgICByZXBsYWNlZCBieSA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLnNldF9jb250ZW50YCBhbmQgdGhlCisgICAgICByZWFsdGVkIGBgbWFrZWBgIGFuZCBgYGFkZGBgIG1ldGhvZHMuCisKKworICAgLi4gbWV0aG9kOjogZ2V0X3BheWxvYWQoaT1Ob25lLCBkZWNvZGU9RmFsc2UpCisKKyAgICAgIFJldHVybiB0aGUgY3VycmVudCBwYXlsb2FkLCB3aGljaCB3aWxsIGJlIGEgbGlzdCBvZgorICAgICAgOmNsYXNzOmBNZXNzYWdlYCBvYmplY3RzIHdoZW4gOm1ldGg6YGlzX211bHRpcGFydGAgaXMgYGBUcnVlYGAsIG9yIGEKKyAgICAgIHN0cmluZyB3aGVuIDptZXRoOmBpc19tdWx0aXBhcnRgIGlzIGBgRmFsc2VgYC4gIElmIHRoZSBwYXlsb2FkIGlzIGEgbGlzdAorICAgICAgYW5kIHlvdSBtdXRhdGUgdGhlIGxpc3Qgb2JqZWN0LCB5b3UgbW9kaWZ5IHRoZSBtZXNzYWdlJ3MgcGF5bG9hZCBpbiBwbGFjZS4KKworICAgICAgV2l0aCBvcHRpb25hbCBhcmd1bWVudCAqaSosIDptZXRoOmBnZXRfcGF5bG9hZGAgd2lsbCByZXR1cm4gdGhlICppKi10aAorICAgICAgZWxlbWVudCBvZiB0aGUgcGF5bG9hZCwgY291bnRpbmcgZnJvbSB6ZXJvLCBpZiA6bWV0aDpgaXNfbXVsdGlwYXJ0YCBpcworICAgICAgYGBUcnVlYGAuICBBbiA6ZXhjOmBJbmRleEVycm9yYCB3aWxsIGJlIHJhaXNlZCBpZiAqaSogaXMgbGVzcyB0aGFuIDAgb3IKKyAgICAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBwYXlsb2FkLiAgSWYgdGhlCisgICAgICBwYXlsb2FkIGlzIGEgc3RyaW5nIChpLmUuICA6bWV0aDpgaXNfbXVsdGlwYXJ0YCBpcyBgYEZhbHNlYGApIGFuZCAqaSogaXMKKyAgICAgIGdpdmVuLCBhIDpleGM6YFR5cGVFcnJvcmAgaXMgcmFpc2VkLgorCisgICAgICBPcHRpb25hbCAqZGVjb2RlKiBpcyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYXlsb2FkIHNob3VsZCBiZQorICAgICAgZGVjb2RlZCBvciBub3QsIGFjY29yZGluZyB0byB0aGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgCisgICAgICBoZWFkZXIuIFdoZW4gYGBUcnVlYGAgYW5kIHRoZSBtZXNzYWdlIGlzIG5vdCBhIG11bHRpcGFydCwgdGhlIHBheWxvYWQgd2lsbAorICAgICAgYmUgZGVjb2RlZCBpZiB0aGlzIGhlYWRlcidzIHZhbHVlIGlzIGBgcXVvdGVkLXByaW50YWJsZWBgIG9yIGBgYmFzZTY0YGAuCisgICAgICBJZiBzb21lIG90aGVyIGVuY29kaW5nIGlzIHVzZWQsIG9yIDptYWlsaGVhZGVyOmBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYAorICAgICAgaGVhZGVyIGlzIG1pc3NpbmcsIHRoZSBwYXlsb2FkIGlzCisgICAgICByZXR1cm5lZCBhcy1pcyAodW5kZWNvZGVkKS4gIEluIGFsbCBjYXNlcyB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYmluYXJ5CisgICAgICBkYXRhLiAgSWYgdGhlIG1lc3NhZ2UgaXMgYSBtdWx0aXBhcnQgYW5kIHRoZSAqZGVjb2RlKiBmbGFnIGlzIGBgVHJ1ZWBgLAorICAgICAgdGhlbiBgYE5vbmVgYCBpcyByZXR1cm5lZC4gIElmIHRoZSBwYXlsb2FkIGlzIGJhc2U2NCBhbmQgaXQgd2FzIG5vdAorICAgICAgcGVyZmVjdGx5IGZvcm1lZCAobWlzc2luZyBwYWRkaW5nLCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIGJhc2U2NAorICAgICAgYWxwaGFiZXQpLCB0aGVuIGFuIGFwcHJvcHJpYXRlIGRlZmVjdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlJ3MKKyAgICAgIGRlZmVjdCBwcm9wZXJ0eSAoOmNsYXNzOmB+ZW1haWwuZXJyb3JzLkludmFsaWRCYXNlNjRQYWRkaW5nRGVmZWN0YCBvcgorICAgICAgOmNsYXNzOmB+ZW1haWwuZXJyb3JzLkludmFsaWRCYXNlNjRDaGFyYWN0ZXJzRGVmZWN0YCwgcmVzcGVjdGl2ZWx5KS4KKworICAgICAgV2hlbiAqZGVjb2RlKiBpcyBgYEZhbHNlYGAgKHRoZSBkZWZhdWx0KSB0aGUgYm9keSBpcyByZXR1cm5lZCBhcyBhIHN0cmluZworICAgICAgd2l0aG91dCBkZWNvZGluZyB0aGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgLiAgSG93ZXZlciwKKyAgICAgIGZvciBhIDptYWlsaGVhZGVyOmBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYCBvZiA4Yml0LCBhbiBhdHRlbXB0IGlzIG1hZGUKKyAgICAgIHRvIGRlY29kZSB0aGUgb3JpZ2luYWwgYnl0ZXMgdXNpbmcgdGhlIGBgY2hhcnNldGBgIHNwZWNpZmllZCBieSB0aGUKKyAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciwgdXNpbmcgdGhlIGBgcmVwbGFjZWBgIGVycm9yIGhhbmRsZXIuCisgICAgICBJZiBubyBgYGNoYXJzZXRgYCBpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSBgYGNoYXJzZXRgYCBnaXZlbiBpcyBub3QKKyAgICAgIHJlY29nbml6ZWQgYnkgdGhlIGVtYWlsIHBhY2thZ2UsIHRoZSBib2R5IGlzIGRlY29kZWQgdXNpbmcgdGhlIGRlZmF1bHQKKyAgICAgIEFTQ0lJIGNoYXJzZXQuCisKKyAgICAgIFRoaXMgaXMgYSBsZWdhY3kgbWV0aG9kLiAgT24gdGhlCisgICAgICA6Y2xhc3M6YH5lbWFpbC5lbWFpbG1lc3NhZ2UuRW1haWxNZXNzYWdlYCBjbGFzcyBpdHMgZnVuY3Rpb25hbGl0eSBpcworICAgICAgcmVwbGFjZWQgYnkgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZS5nZXRfY29udGVudGAgYW5kCisgICAgICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLml0ZXJfcGFydHNgLgorCisKKyAgIC4uIG1ldGhvZDo6IHNldF9wYXlsb2FkKHBheWxvYWQsIGNoYXJzZXQ9Tm9uZSkKKworICAgICAgU2V0IHRoZSBlbnRpcmUgbWVzc2FnZSBvYmplY3QncyBwYXlsb2FkIHRvICpwYXlsb2FkKi4gIEl0IGlzIHRoZSBjbGllbnQncworICAgICAgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoZSBwYXlsb2FkIGludmFyaWFudHMuICBPcHRpb25hbCAqY2hhcnNldCogc2V0cworICAgICAgdGhlIG1lc3NhZ2UncyBkZWZhdWx0IGNoYXJhY3RlciBzZXQ7IHNlZSA6bWV0aDpgc2V0X2NoYXJzZXRgIGZvciBkZXRhaWxzLgorCisgICAgICBUaGlzIGlzIGEgbGVnYWN5IG1ldGhvZC4gIE9uIHRoZQorICAgICAgOmNsYXNzOmB+ZW1haWwuZW1haWxtZXNzYWdlLkVtYWlsTWVzc2FnZWAgY2xhc3MgaXRzIGZ1bmN0aW9uYWxpdHkgaXMKKyAgICAgIHJlcGxhY2VkIGJ5IDptZXRoOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2Uuc2V0X2NvbnRlbnRgLgorCisKKyAgIC4uIG1ldGhvZDo6IHNldF9jaGFyc2V0KGNoYXJzZXQpCisKKyAgICAgIFNldCB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGUgcGF5bG9hZCB0byAqY2hhcnNldCosIHdoaWNoIGNhbiBlaXRoZXIgYmUgYQorICAgICAgOmNsYXNzOmB+ZW1haWwuY2hhcnNldC5DaGFyc2V0YCBpbnN0YW5jZSAoc2VlIDptb2Q6YGVtYWlsLmNoYXJzZXRgKSwgYQorICAgICAgc3RyaW5nIG5hbWluZyBhIGNoYXJhY3RlciBzZXQsIG9yIGBgTm9uZWBgLiAgSWYgaXQgaXMgYSBzdHJpbmcsIGl0IHdpbGwKKyAgICAgIGJlIGNvbnZlcnRlZCB0byBhIDpjbGFzczpgfmVtYWlsLmNoYXJzZXQuQ2hhcnNldGAgaW5zdGFuY2UuICBJZiAqY2hhcnNldCoKKyAgICAgIGlzIGBgTm9uZWBgLCB0aGUgYGBjaGFyc2V0YGAgcGFyYW1ldGVyIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZQorICAgICAgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyICh0aGUgbWVzc2FnZSB3aWxsIG5vdCBiZSBvdGhlcndpc2UKKyAgICAgIG1vZGlmaWVkKS4gIEFueXRoaW5nIGVsc2Ugd2lsbCBnZW5lcmF0ZSBhIDpleGM6YFR5cGVFcnJvcmAuCisKKyAgICAgIElmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIDptYWlsaGVhZGVyOmBNSU1FLVZlcnNpb25gIGhlYWRlciBvbmUgd2lsbCBiZQorICAgICAgYWRkZWQuICBJZiB0aGVyZSBpcyBubyBleGlzdGluZyA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIsIG9uZQorICAgICAgd2lsbCBiZSBhZGRlZCB3aXRoIGEgdmFsdWUgb2YgOm1pbWV0eXBlOmB0ZXh0L3BsYWluYC4gIFdoZXRoZXIgdGhlCisgICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIgYWxyZWFkeSBleGlzdHMgb3Igbm90LCBpdHMgYGBjaGFyc2V0YGAKKyAgICAgIHBhcmFtZXRlciB3aWxsIGJlIHNldCB0byAqY2hhcnNldC5vdXRwdXRfY2hhcnNldCouICAgSWYKKyAgICAgICpjaGFyc2V0LmlucHV0X2NoYXJzZXQqIGFuZCAqY2hhcnNldC5vdXRwdXRfY2hhcnNldCogZGlmZmVyLCB0aGUgcGF5bG9hZAorICAgICAgd2lsbCBiZSByZS1lbmNvZGVkIHRvIHRoZSAqb3V0cHV0X2NoYXJzZXQqLiAgSWYgdGhlcmUgaXMgbm8gZXhpc3RpbmcKKyAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIsIHRoZW4gdGhlIHBheWxvYWQgd2lsbCBiZQorICAgICAgdHJhbnNmZXItZW5jb2RlZCwgaWYgbmVlZGVkLCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICA6Y2xhc3M6YH5lbWFpbC5jaGFyc2V0LkNoYXJzZXRgLCBhbmQgYSBoZWFkZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUKKyAgICAgIHdpbGwgYmUgYWRkZWQuICBJZiBhIDptYWlsaGVhZGVyOmBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIKKyAgICAgIGFscmVhZHkgZXhpc3RzLCB0aGUgcGF5bG9hZCBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUgY29ycmVjdGx5IGVuY29kZWQKKyAgICAgIHVzaW5nIHRoYXQgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgIGFuZCBpcyBub3QgbW9kaWZpZWQuCisKKyAgICAgIFRoaXMgaXMgYSBsZWdhY3kgbWV0aG9kLiAgT24gdGhlCisgICAgICA6Y2xhc3M6YH5lbWFpbC5lbWFpbG1lc3NhZ2UuRW1haWxNZXNzYWdlYCBjbGFzcyBpdHMgZnVuY3Rpb25hbGl0eSBpcworICAgICAgcmVwbGFjZWQgYnkgdGhlICpjaGFyc2V0KiBwYXJhbWV0ZXIgb2YgdGhlCisgICAgICA6bWV0aDpgZW1haWwuZW1haWxtZXNzYWdlLkVtYWlsTWVzc2FnZS5zZXRfY29udGVudGAgbWV0aG9kLgorCisKKyAgIC4uIG1ldGhvZDo6IGdldF9jaGFyc2V0KCkKKworICAgICAgUmV0dXJuIHRoZSA6Y2xhc3M6YH5lbWFpbC5jaGFyc2V0LkNoYXJzZXRgIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgIG1lc3NhZ2UncyBwYXlsb2FkLgorCisgICAgICBUaGlzIGlzIGEgbGVnYWN5IG1ldGhvZC4gIE9uIHRoZQorICAgICAgOmNsYXNzOmB+ZW1haWwuZW1haWxtZXNzYWdlLkVtYWlsTWVzc2FnZWAgY2xhc3MgaXQgYWx3YXlzIHJldHVybnMKKyAgICAgIGBgTm9uZWBgLgorCisKKyAgIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBpbXBsZW1lbnQgYSBtYXBwaW5nLWxpa2UgaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgdGhlCisgICBtZXNzYWdlJ3MgOnJmYzpgMjgyMmAgaGVhZGVycy4gIE5vdGUgdGhhdCB0aGVyZSBhcmUgc29tZSBzZW1hbnRpYyBkaWZmZXJlbmNlcworICAgYmV0d2VlbiB0aGVzZSBtZXRob2RzIGFuZCBhIG5vcm1hbCBtYXBwaW5nIChpLmUuIGRpY3Rpb25hcnkpIGludGVyZmFjZS4gIEZvcgorICAgZXhhbXBsZSwgaW4gYSBkaWN0aW9uYXJ5IHRoZXJlIGFyZSBubyBkdXBsaWNhdGUga2V5cywgYnV0IGhlcmUgdGhlcmUgbWF5IGJlCisgICBkdXBsaWNhdGUgbWVzc2FnZSBoZWFkZXJzLiAgQWxzbywgaW4gZGljdGlvbmFyaWVzIHRoZXJlIGlzIG5vIGd1YXJhbnRlZWQKKyAgIG9yZGVyIHRvIHRoZSBrZXlzIHJldHVybmVkIGJ5IDptZXRoOmBrZXlzYCwgYnV0IGluIGEgOmNsYXNzOmBNZXNzYWdlYCBvYmplY3QsCisgICBoZWFkZXJzIGFyZSBhbHdheXMgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsCisgICBtZXNzYWdlLCBvciB3ZXJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlIGxhdGVyLiAgQW55IGhlYWRlciBkZWxldGVkIGFuZCB0aGVuCisgICByZS1hZGRlZCBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGhlYWRlciBsaXN0LgorCisgICBUaGVzZSBzZW1hbnRpYyBkaWZmZXJlbmNlcyBhcmUgaW50ZW50aW9uYWwgYW5kIGFyZSBiaWFzZWQgdG93YXJkIG1heGltYWwKKyAgIGNvbnZlbmllbmNlLgorCisgICBOb3RlIHRoYXQgaW4gYWxsIGNhc2VzLCBhbnkgZW52ZWxvcGUgaGVhZGVyIHByZXNlbnQgaW4gdGhlIG1lc3NhZ2UgaXMgbm90CisgICBpbmNsdWRlZCBpbiB0aGUgbWFwcGluZyBpbnRlcmZhY2UuCisKKyAgIEluIGEgbW9kZWwgZ2VuZXJhdGVkIGZyb20gYnl0ZXMsIGFueSBoZWFkZXIgdmFsdWVzIHRoYXQgKGluIGNvbnRyYXZlbnRpb24gb2YKKyAgIHRoZSBSRkNzKSBjb250YWluIG5vbi1BU0NJSSBieXRlcyB3aWxsLCB3aGVuIHJldHJpZXZlZCB0aHJvdWdoIHRoaXMKKyAgIGludGVyZmFjZSwgYmUgcmVwcmVzZW50ZWQgYXMgOmNsYXNzOmB+ZW1haWwuaGVhZGVyLkhlYWRlcmAgb2JqZWN0cyB3aXRoCisgICBhIGNoYXJzZXQgb2YgYHVua25vd24tOGJpdGAuCisKKworICAgLi4gbWV0aG9kOjogX19sZW5fXygpCisKKyAgICAgIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGhlYWRlcnMsIGluY2x1ZGluZyBkdXBsaWNhdGVzLgorCisKKyAgIC4uIG1ldGhvZDo6IF9fY29udGFpbnNfXyhuYW1lKQorCisgICAgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBvYmplY3QgaGFzIGEgZmllbGQgbmFtZWQgKm5hbWUqLiBNYXRjaGluZyBpcworICAgICAgZG9uZSBjYXNlLWluc2Vuc2l0aXZlbHkgYW5kICpuYW1lKiBzaG91bGQgbm90IGluY2x1ZGUgdGhlIHRyYWlsaW5nIGNvbG9uLgorICAgICAgVXNlZCBmb3IgdGhlIGBgaW5gYCBvcGVyYXRvciwgZS5nLjo6CisKKyAgICAgICAgICAgaWYgJ21lc3NhZ2UtaWQnIGluIG15TWVzc2FnZToKKyAgICAgICAgICAgICAgcHJpbnQoJ01lc3NhZ2UtSUQ6JywgbXlNZXNzYWdlWydtZXNzYWdlLWlkJ10pCisKKworICAgLi4gbWV0aG9kOjogX19nZXRpdGVtX18obmFtZSkKKworICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgaGVhZGVyIGZpZWxkLiAgKm5hbWUqIHNob3VsZCBub3QgaW5jbHVkZSB0aGUKKyAgICAgIGNvbG9uIGZpZWxkIHNlcGFyYXRvci4gIElmIHRoZSBoZWFkZXIgaXMgbWlzc2luZywgYGBOb25lYGAgaXMgcmV0dXJuZWQ7IGEKKyAgICAgIDpleGM6YEtleUVycm9yYCBpcyBuZXZlciByYWlzZWQuCisKKyAgICAgIE5vdGUgdGhhdCBpZiB0aGUgbmFtZWQgZmllbGQgYXBwZWFycyBtb3JlIHRoYW4gb25jZSBpbiB0aGUgbWVzc2FnZSdzCisgICAgICBoZWFkZXJzLCBleGFjdGx5IHdoaWNoIG9mIHRob3NlIGZpZWxkIHZhbHVlcyB3aWxsIGJlIHJldHVybmVkIGlzCisgICAgICB1bmRlZmluZWQuICBVc2UgdGhlIDptZXRoOmBnZXRfYWxsYCBtZXRob2QgdG8gZ2V0IHRoZSB2YWx1ZXMgb2YgYWxsIHRoZQorICAgICAgZXh0YW50IG5hbWVkIGhlYWRlcnMuCisKKworICAgLi4gbWV0aG9kOjogX19zZXRpdGVtX18obmFtZSwgdmFsKQorCisgICAgICBBZGQgYSBoZWFkZXIgdG8gdGhlIG1lc3NhZ2Ugd2l0aCBmaWVsZCBuYW1lICpuYW1lKiBhbmQgdmFsdWUgKnZhbCouICBUaGUKKyAgICAgIGZpZWxkIGlzIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UncyBleGlzdGluZyBmaWVsZHMuCisKKyAgICAgIE5vdGUgdGhhdCB0aGlzIGRvZXMgKm5vdCogb3ZlcndyaXRlIG9yIGRlbGV0ZSBhbnkgZXhpc3RpbmcgaGVhZGVyIHdpdGggdGhlIHNhbWUKKyAgICAgIG5hbWUuICBJZiB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgbmV3IGhlYWRlciBpcyB0aGUgb25seSBvbmUgcHJlc2VudCBpbiB0aGUKKyAgICAgIG1lc3NhZ2Ugd2l0aCBmaWVsZCBuYW1lICpuYW1lKiwgZGVsZXRlIHRoZSBmaWVsZCBmaXJzdCwgZS5nLjo6CisKKyAgICAgICAgIGRlbCBtc2dbJ3N1YmplY3QnXQorICAgICAgICAgbXNnWydzdWJqZWN0J10gPSAnUHl0aG9uIHJvb2x6IScKKworCisgICAuLiBtZXRob2Q6OiBfX2RlbGl0ZW1fXyhuYW1lKQorCisgICAgICBEZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBmaWVsZCB3aXRoIG5hbWUgKm5hbWUqIGZyb20gdGhlIG1lc3NhZ2UncworICAgICAgaGVhZGVycy4gIE5vIGV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgdGhlIG5hbWVkIGZpZWxkIGlzbid0IHByZXNlbnQgaW4gdGhlCisgICAgICBoZWFkZXJzLgorCisKKyAgIC4uIG1ldGhvZDo6IGtleXMoKQorCisgICAgICBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbWVzc2FnZSdzIGhlYWRlciBmaWVsZCBuYW1lcy4KKworCisgICAuLiBtZXRob2Q6OiB2YWx1ZXMoKQorCisgICAgICBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbWVzc2FnZSdzIGZpZWxkIHZhbHVlcy4KKworCisgICAuLiBtZXRob2Q6OiBpdGVtcygpCisKKyAgICAgIFJldHVybiBhIGxpc3Qgb2YgMi10dXBsZXMgY29udGFpbmluZyBhbGwgdGhlIG1lc3NhZ2UncyBmaWVsZCBoZWFkZXJzIGFuZAorICAgICAgdmFsdWVzLgorCisKKyAgIC4uIG1ldGhvZDo6IGdldChuYW1lLCBmYWlsb2JqPU5vbmUpCisKKyAgICAgIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIGhlYWRlciBmaWVsZC4gIFRoaXMgaXMgaWRlbnRpY2FsIHRvCisgICAgICA6bWV0aDpgX19nZXRpdGVtX19gIGV4Y2VwdCB0aGF0IG9wdGlvbmFsICpmYWlsb2JqKiBpcyByZXR1cm5lZCBpZiB0aGUKKyAgICAgIG5hbWVkIGhlYWRlciBpcyBtaXNzaW5nIChkZWZhdWx0cyB0byBgYE5vbmVgYCkuCisKKyAgIEhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCB1c2VmdWwgbWV0aG9kczoKKworCisgICAuLiBtZXRob2Q6OiBnZXRfYWxsKG5hbWUsIGZhaWxvYmo9Tm9uZSkKKworICAgICAgUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIHZhbHVlcyBmb3IgdGhlIGZpZWxkIG5hbWVkICpuYW1lKi4gSWYgdGhlcmUgYXJlCisgICAgICBubyBzdWNoIG5hbWVkIGhlYWRlcnMgaW4gdGhlIG1lc3NhZ2UsICpmYWlsb2JqKiBpcyByZXR1cm5lZCAoZGVmYXVsdHMgdG8KKyAgICAgIGBgTm9uZWBgKS4KKworCisgICAuLiBtZXRob2Q6OiBhZGRfaGVhZGVyKF9uYW1lLCBfdmFsdWUsICoqX3BhcmFtcykKKworICAgICAgRXh0ZW5kZWQgaGVhZGVyIHNldHRpbmcuICBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIDptZXRoOmBfX3NldGl0ZW1fX2AKKyAgICAgIGV4Y2VwdCB0aGF0IGFkZGl0aW9uYWwgaGVhZGVyIHBhcmFtZXRlcnMgY2FuIGJlIHByb3ZpZGVkIGFzIGtleXdvcmQKKyAgICAgIGFyZ3VtZW50cy4gICpfbmFtZSogaXMgdGhlIGhlYWRlciBmaWVsZCB0byBhZGQgYW5kICpfdmFsdWUqIGlzIHRoZQorICAgICAgKnByaW1hcnkqIHZhbHVlIGZvciB0aGUgaGVhZGVyLgorCisgICAgICBGb3IgZWFjaCBpdGVtIGluIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGRpY3Rpb25hcnkgKl9wYXJhbXMqLCB0aGUga2V5IGlzCisgICAgICB0YWtlbiBhcyB0aGUgcGFyYW1ldGVyIG5hbWUsIHdpdGggdW5kZXJzY29yZXMgY29udmVydGVkIHRvIGRhc2hlcyAoc2luY2UKKyAgICAgIGRhc2hlcyBhcmUgaWxsZWdhbCBpbiBQeXRob24gaWRlbnRpZmllcnMpLiAgTm9ybWFsbHksIHRoZSBwYXJhbWV0ZXIgd2lsbAorICAgICAgYmUgYWRkZWQgYXMgYGBrZXk9InZhbHVlImBgIHVubGVzcyB0aGUgdmFsdWUgaXMgYGBOb25lYGAsIGluIHdoaWNoIGNhc2UKKyAgICAgIG9ubHkgdGhlIGtleSB3aWxsIGJlIGFkZGVkLiAgSWYgdGhlIHZhbHVlIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLAorICAgICAgaXQgY2FuIGJlIHNwZWNpZmllZCBhcyBhIHRocmVlIHR1cGxlIGluIHRoZSBmb3JtYXQKKyAgICAgIGBgKENIQVJTRVQsIExBTkdVQUdFLCBWQUxVRSlgYCwgd2hlcmUgYGBDSEFSU0VUYGAgaXMgYSBzdHJpbmcgbmFtaW5nIHRoZQorICAgICAgY2hhcnNldCB0byBiZSB1c2VkIHRvIGVuY29kZSB0aGUgdmFsdWUsIGBgTEFOR1VBR0VgYCBjYW4gdXN1YWxseSBiZSBzZXQKKyAgICAgIHRvIGBgTm9uZWBgIG9yIHRoZSBlbXB0eSBzdHJpbmcgKHNlZSA6cmZjOmAyMjMxYCBmb3Igb3RoZXIgcG9zc2liaWxpdGllcyksCisgICAgICBhbmQgYGBWQUxVRWBgIGlzIHRoZSBzdHJpbmcgdmFsdWUgY29udGFpbmluZyBub24tQVNDSUkgY29kZSBwb2ludHMuICBJZgorICAgICAgYSB0aHJlZSB0dXBsZSBpcyBub3QgcGFzc2VkIGFuZCB0aGUgdmFsdWUgY29udGFpbnMgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsCisgICAgICBpdCBpcyBhdXRvbWF0aWNhbGx5IGVuY29kZWQgaW4gOnJmYzpgMjIzMWAgZm9ybWF0IHVzaW5nIGEgYGBDSEFSU0VUYGAKKyAgICAgIG9mIGBgdXRmLThgYCBhbmQgYSBgYExBTkdVQUdFYGAgb2YgYGBOb25lYGAuCisKKyAgICAgIEhlcmUncyBhbiBleGFtcGxlOjoKKworICAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsIGZpbGVuYW1lPSdidWQuZ2lmJykKKworICAgICAgVGhpcyB3aWxsIGFkZCBhIGhlYWRlciB0aGF0IGxvb2tzIGxpa2UgOjoKKworICAgICAgICAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ImJ1ZC5naWYiCisKKyAgICAgIEFuIGV4YW1wbGUgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVyczo6CisKKyAgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9KCdpc28tODg1OS0xJywgJycsICdGdcOfYmFsbGVyLnBwdCcpKQorCisgICAgICBXaGljaCBwcm9kdWNlcyA6OgorCisgICAgICAgICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZSo9Imlzby04ODU5LTEnJ0Z1JURGYmFsbGVyLnBwdCIKKworCisgICAuLiBtZXRob2Q6OiByZXBsYWNlX2hlYWRlcihfbmFtZSwgX3ZhbHVlKQorCisgICAgICBSZXBsYWNlIGEgaGVhZGVyLiAgUmVwbGFjZSB0aGUgZmlyc3QgaGVhZGVyIGZvdW5kIGluIHRoZSBtZXNzYWdlIHRoYXQKKyAgICAgIG1hdGNoZXMgKl9uYW1lKiwgcmV0YWluaW5nIGhlYWRlciBvcmRlciBhbmQgZmllbGQgbmFtZSBjYXNlLiAgSWYgbm8KKyAgICAgIG1hdGNoaW5nIGhlYWRlciB3YXMgZm91bmQsIGEgOmV4YzpgS2V5RXJyb3JgIGlzIHJhaXNlZC4KKworCisgICAuLiBtZXRob2Q6OiBnZXRfY29udGVudF90eXBlKCkKKworICAgICAgUmV0dXJuIHRoZSBtZXNzYWdlJ3MgY29udGVudCB0eXBlLiAgVGhlIHJldHVybmVkIHN0cmluZyBpcyBjb2VyY2VkIHRvCisgICAgICBsb3dlciBjYXNlIG9mIHRoZSBmb3JtIDptaW1ldHlwZTpgbWFpbnR5cGUvc3VidHlwZWAuICBJZiB0aGVyZSB3YXMgbm8KKyAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciBpbiB0aGUgbWVzc2FnZSB0aGUgZGVmYXVsdCB0eXBlIGFzIGdpdmVuCisgICAgICBieSA6bWV0aDpgZ2V0X2RlZmF1bHRfdHlwZWAgd2lsbCBiZSByZXR1cm5lZC4gIFNpbmNlIGFjY29yZGluZyB0bworICAgICAgOnJmYzpgMjA0NWAsIG1lc3NhZ2VzIGFsd2F5cyBoYXZlIGEgZGVmYXVsdCB0eXBlLCA6bWV0aDpgZ2V0X2NvbnRlbnRfdHlwZWAKKyAgICAgIHdpbGwgYWx3YXlzIHJldHVybiBhIHZhbHVlLgorCisgICAgICA6cmZjOmAyMDQ1YCBkZWZpbmVzIGEgbWVzc2FnZSdzIGRlZmF1bHQgdHlwZSB0byBiZSA6bWltZXR5cGU6YHRleHQvcGxhaW5gCisgICAgICB1bmxlc3MgaXQgYXBwZWFycyBpbnNpZGUgYSA6bWltZXR5cGU6YG11bHRpcGFydC9kaWdlc3RgIGNvbnRhaW5lciwgaW4KKyAgICAgIHdoaWNoIGNhc2UgaXQgd291bGQgYmUgOm1pbWV0eXBlOmBtZXNzYWdlL3JmYzgyMmAuICBJZiB0aGUKKyAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciBoYXMgYW4gaW52YWxpZCB0eXBlIHNwZWNpZmljYXRpb24sCisgICAgICA6cmZjOmAyMDQ1YCBtYW5kYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHR5cGUgYmUgOm1pbWV0eXBlOmB0ZXh0L3BsYWluYC4KKworCisgICAuLiBtZXRob2Q6OiBnZXRfY29udGVudF9tYWludHlwZSgpCisKKyAgICAgIFJldHVybiB0aGUgbWVzc2FnZSdzIG1haW4gY29udGVudCB0eXBlLiAgVGhpcyBpcyB0aGUgOm1pbWV0eXBlOmBtYWludHlwZWAKKyAgICAgIHBhcnQgb2YgdGhlIHN0cmluZyByZXR1cm5lZCBieSA6bWV0aDpgZ2V0X2NvbnRlbnRfdHlwZWAuCisKKworICAgLi4gbWV0aG9kOjogZ2V0X2NvbnRlbnRfc3VidHlwZSgpCisKKyAgICAgIFJldHVybiB0aGUgbWVzc2FnZSdzIHN1Yi1jb250ZW50IHR5cGUuICBUaGlzIGlzIHRoZSA6bWltZXR5cGU6YHN1YnR5cGVgCisgICAgICBwYXJ0IG9mIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgOm1ldGg6YGdldF9jb250ZW50X3R5cGVgLgorCisKKyAgIC4uIG1ldGhvZDo6IGdldF9kZWZhdWx0X3R5cGUoKQorCisgICAgICBSZXR1cm4gdGhlIGRlZmF1bHQgY29udGVudCB0eXBlLiAgTW9zdCBtZXNzYWdlcyBoYXZlIGEgZGVmYXVsdCBjb250ZW50CisgICAgICB0eXBlIG9mIDptaW1ldHlwZTpgdGV4dC9wbGFpbmAsIGV4Y2VwdCBmb3IgbWVzc2FnZXMgdGhhdCBhcmUgc3VicGFydHMgb2YKKyAgICAgIDptaW1ldHlwZTpgbXVsdGlwYXJ0L2RpZ2VzdGAgY29udGFpbmVycy4gIFN1Y2ggc3VicGFydHMgaGF2ZSBhIGRlZmF1bHQKKyAgICAgIGNvbnRlbnQgdHlwZSBvZiA6bWltZXR5cGU6YG1lc3NhZ2UvcmZjODIyYC4KKworCisgICAuLiBtZXRob2Q6OiBzZXRfZGVmYXVsdF90eXBlKGN0eXBlKQorCisgICAgICBTZXQgdGhlIGRlZmF1bHQgY29udGVudCB0eXBlLiAgKmN0eXBlKiBzaG91bGQgZWl0aGVyIGJlCisgICAgICA6bWltZXR5cGU6YHRleHQvcGxhaW5gIG9yIDptaW1ldHlwZTpgbWVzc2FnZS9yZmM4MjJgLCBhbHRob3VnaCB0aGlzIGlzIG5vdAorICAgICAgZW5mb3JjZWQuICBUaGUgZGVmYXVsdCBjb250ZW50IHR5cGUgaXMgbm90IHN0b3JlZCBpbiB0aGUKKyAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlci4KKworCisgICAuLiBtZXRob2Q6OiBnZXRfcGFyYW1zKGZhaWxvYmo9Tm9uZSwgaGVhZGVyPSdjb250ZW50LXR5cGUnLCB1bnF1b3RlPVRydWUpCisKKyAgICAgIFJldHVybiB0aGUgbWVzc2FnZSdzIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIHBhcmFtZXRlcnMsIGFzIGEgbGlzdC4KKyAgICAgIFRoZSBlbGVtZW50cyBvZiB0aGUgcmV0dXJuZWQgbGlzdCBhcmUgMi10dXBsZXMgb2Yga2V5L3ZhbHVlIHBhaXJzLCBhcworICAgICAgc3BsaXQgb24gdGhlIGBgJz0nYGAgc2lnbi4gIFRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgYGAnPSdgYCBpcyB0aGUga2V5LAorICAgICAgd2hpbGUgdGhlIHJpZ2h0IGhhbmQgc2lkZSBpcyB0aGUgdmFsdWUuICBJZiB0aGVyZSBpcyBubyBgYCc9J2BgIHNpZ24gaW4KKyAgICAgIHRoZSBwYXJhbWV0ZXIgdGhlIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgYXMKKyAgICAgIGRlc2NyaWJlZCBpbiA6bWV0aDpgZ2V0X3BhcmFtYCBhbmQgaXMgdW5xdW90ZWQgaWYgb3B0aW9uYWwgKnVucXVvdGUqIGlzCisgICAgICBgYFRydWVgYCAodGhlIGRlZmF1bHQpLgorCisgICAgICBPcHRpb25hbCAqZmFpbG9iaiogaXMgdGhlIG9iamVjdCB0byByZXR1cm4gaWYgdGhlcmUgaXMgbm8KKyAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlci4gIE9wdGlvbmFsICpoZWFkZXIqIGlzIHRoZSBoZWFkZXIgdG8KKyAgICAgIHNlYXJjaCBpbnN0ZWFkIG9mIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgLgorCisgICAgICBUaGlzIGlzIGEgbGVnYWN5IG1ldGhvZC4gIE9uIHRoZQorICAgICAgOmNsYXNzOmB+ZW1haWwuZW1haWxtZXNzYWdlLkVtYWlsTWVzc2FnZWAgY2xhc3MgaXRzIGZ1bmN0aW9uYWxpdHkgaXMKKyAgICAgIHJlcGxhY2VkIGJ5IHRoZSAqcGFyYW1zKiBwcm9wZXJ0eSBvZiB0aGUgaW5kaXZpZHVhbCBoZWFkZXIgb2JqZWN0cworICAgICAgcmV0dXJuZWQgYnkgdGhlIGhlYWRlciBhY2Nlc3MgbWV0aG9kcy4KKworCisgICAuLiBtZXRob2Q6OiBnZXRfcGFyYW0ocGFyYW0sIGZhaWxvYmo9Tm9uZSwgaGVhZGVyPSdjb250ZW50LXR5cGUnLCB1bnF1b3RlPVRydWUpCisKKyAgICAgIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlcidzIHBhcmFtZXRlcgorICAgICAgKnBhcmFtKiBhcyBhIHN0cmluZy4gIElmIHRoZSBtZXNzYWdlIGhhcyBubyA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYAorICAgICAgaGVhZGVyIG9yIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcGFyYW1ldGVyLCB0aGVuICpmYWlsb2JqKiBpcyByZXR1cm5lZAorICAgICAgKGRlZmF1bHRzIHRvIGBgTm9uZWBgKS4KKworICAgICAgT3B0aW9uYWwgKmhlYWRlciogaWYgZ2l2ZW4sIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBoZWFkZXIgdG8gdXNlIGluc3RlYWQgb2YKKyAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgLgorCisgICAgICBQYXJhbWV0ZXIga2V5cyBhcmUgYWx3YXlzIGNvbXBhcmVkIGNhc2UgaW5zZW5zaXRpdmVseS4gIFRoZSByZXR1cm4gdmFsdWUKKyAgICAgIGNhbiBlaXRoZXIgYmUgYSBzdHJpbmcsIG9yIGEgMy10dXBsZSBpZiB0aGUgcGFyYW1ldGVyIHdhcyA6cmZjOmAyMjMxYAorICAgICAgZW5jb2RlZC4gIFdoZW4gaXQncyBhIDMtdHVwbGUsIHRoZSBlbGVtZW50cyBvZiB0aGUgdmFsdWUgYXJlIG9mIHRoZSBmb3JtCisgICAgICBgYChDSEFSU0VULCBMQU5HVUFHRSwgVkFMVUUpYGAuICBOb3RlIHRoYXQgYm90aCBgYENIQVJTRVRgYCBhbmQKKyAgICAgIGBgTEFOR1VBR0VgYCBjYW4gYmUgYGBOb25lYGAsIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBjb25zaWRlciBgYFZBTFVFYGAKKyAgICAgIHRvIGJlIGVuY29kZWQgaW4gdGhlIGBgdXMtYXNjaWlgYCBjaGFyc2V0LiAgWW91IGNhbiB1c3VhbGx5IGlnbm9yZQorICAgICAgYGBMQU5HVUFHRWBgLgorCisgICAgICBJZiB5b3VyIGFwcGxpY2F0aW9uIGRvZXNuJ3QgY2FyZSB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgd2FzIGVuY29kZWQgYXMgaW4KKyAgICAgIDpyZmM6YDIyMzFgLCB5b3UgY2FuIGNvbGxhcHNlIHRoZSBwYXJhbWV0ZXIgdmFsdWUgYnkgY2FsbGluZworICAgICAgOmZ1bmM6YGVtYWlsLnV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWVgLCBwYXNzaW5nIGluIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgIGZyb20gOm1ldGg6YGdldF9wYXJhbWAuICBUaGlzIHdpbGwgcmV0dXJuIGEgc3VpdGFibHkgZGVjb2RlZCBVbmljb2RlCisgICAgICBzdHJpbmcgd2hlbiB0aGUgdmFsdWUgaXMgYSB0dXBsZSwgb3IgdGhlIG9yaWdpbmFsIHN0cmluZyB1bnF1b3RlZCBpZiBpdAorICAgICAgaXNuJ3QuICBGb3IgZXhhbXBsZTo6CisKKyAgICAgICAgIHJhd3BhcmFtID0gbXNnLmdldF9wYXJhbSgnZm9vJykKKyAgICAgICAgIHBhcmFtID0gZW1haWwudXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZShyYXdwYXJhbSkKKworICAgICAgSW4gYW55IGNhc2UsIHRoZSBwYXJhbWV0ZXIgdmFsdWUgKGVpdGhlciB0aGUgcmV0dXJuZWQgc3RyaW5nLCBvciB0aGUKKyAgICAgIGBgVkFMVUVgYCBpdGVtIGluIHRoZSAzLXR1cGxlKSBpcyBhbHdheXMgdW5xdW90ZWQsIHVubGVzcyAqdW5xdW90ZSogaXMgc2V0CisgICAgICB0byBgYEZhbHNlYGAuCisKKyAgICAgIFRoaXMgaXMgYSBsZWdhY3kgbWV0aG9kLiAgT24gdGhlCisgICAgICA6Y2xhc3M6YH5lbWFpbC5lbWFpbG1lc3NhZ2UuRW1haWxNZXNzYWdlYCBjbGFzcyBpdHMgZnVuY3Rpb25hbGl0eSBpcworICAgICAgcmVwbGFjZWQgYnkgdGhlICpwYXJhbXMqIHByb3BlcnR5IG9mIHRoZSBpbmRpdmlkdWFsIGhlYWRlciBvYmplY3RzCisgICAgICByZXR1cm5lZCBieSB0aGUgaGVhZGVyIGFjY2VzcyBtZXRob2RzLgorCisKKyAgIC4uIG1ldGhvZDo6IHNldF9wYXJhbShwYXJhbSwgdmFsdWUsIGhlYWRlcj0nQ29udGVudC1UeXBlJywgcmVxdW90ZT1UcnVlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD1Ob25lLCBsYW5ndWFnZT0nJywgcmVwbGFjZT1GYWxzZSkKKworICAgICAgU2V0IGEgcGFyYW1ldGVyIGluIHRoZSA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIuICBJZiB0aGUKKyAgICAgIHBhcmFtZXRlciBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgaGVhZGVyLCBpdHMgdmFsdWUgd2lsbCBiZSByZXBsYWNlZCB3aXRoCisgICAgICAqdmFsdWUqLiAgSWYgdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciBhcyBub3QgeWV0IGJlZW4gZGVmaW5lZAorICAgICAgZm9yIHRoaXMgbWVzc2FnZSwgaXQgd2lsbCBiZSBzZXQgdG8gOm1pbWV0eXBlOmB0ZXh0L3BsYWluYCBhbmQgdGhlIG5ldworICAgICAgcGFyYW1ldGVyIHZhbHVlIHdpbGwgYmUgYXBwZW5kZWQgYXMgcGVyIDpyZmM6YDIwNDVgLgorCisgICAgICBPcHRpb25hbCAqaGVhZGVyKiBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgaGVhZGVyIHRvCisgICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCwgYW5kIGFsbCBwYXJhbWV0ZXJzIHdpbGwgYmUgcXVvdGVkIGFzIG5lY2Vzc2FyeQorICAgICAgdW5sZXNzIG9wdGlvbmFsICpyZXF1b3RlKiBpcyBgYEZhbHNlYGAgKHRoZSBkZWZhdWx0IGlzIGBgVHJ1ZWBgKS4KKworICAgICAgSWYgb3B0aW9uYWwgKmNoYXJzZXQqIGlzIHNwZWNpZmllZCwgdGhlIHBhcmFtZXRlciB3aWxsIGJlIGVuY29kZWQKKyAgICAgIGFjY29yZGluZyB0byA6cmZjOmAyMjMxYC4gT3B0aW9uYWwgKmxhbmd1YWdlKiBzcGVjaWZpZXMgdGhlIFJGQyAyMjMxCisgICAgICBsYW5ndWFnZSwgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgc3RyaW5nLiAgQm90aCAqY2hhcnNldCogYW5kICpsYW5ndWFnZSoKKyAgICAgIHNob3VsZCBiZSBzdHJpbmdzLgorCisgICAgICBJZiAqcmVwbGFjZSogaXMgYGBGYWxzZWBgICh0aGUgZGVmYXVsdCkgdGhlIGhlYWRlciBpcyBtb3ZlZCB0byB0aGUKKyAgICAgIGVuZCBvZiB0aGUgbGlzdCBvZiBoZWFkZXJzLiAgSWYgKnJlcGxhY2UqIGlzIGBgVHJ1ZWBgLCB0aGUgaGVhZGVyCisgICAgICB3aWxsIGJlIHVwZGF0ZWQgaW4gcGxhY2UuCisKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy40IGBgcmVwbGFjZWBgIGtleXdvcmQgd2FzIGFkZGVkLgorCisKKyAgIC4uIG1ldGhvZDo6IGRlbF9wYXJhbShwYXJhbSwgaGVhZGVyPSdjb250ZW50LXR5cGUnLCByZXF1b3RlPVRydWUpCisKKyAgICAgIFJlbW92ZSB0aGUgZ2l2ZW4gcGFyYW1ldGVyIGNvbXBsZXRlbHkgZnJvbSB0aGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAKKyAgICAgIGhlYWRlci4gIFRoZSBoZWFkZXIgd2lsbCBiZSByZS13cml0dGVuIGluIHBsYWNlIHdpdGhvdXQgdGhlIHBhcmFtZXRlciBvcgorICAgICAgaXRzIHZhbHVlLiAgQWxsIHZhbHVlcyB3aWxsIGJlIHF1b3RlZCBhcyBuZWNlc3NhcnkgdW5sZXNzICpyZXF1b3RlKiBpcworICAgICAgYGBGYWxzZWBgICh0aGUgZGVmYXVsdCBpcyBgYFRydWVgYCkuICBPcHRpb25hbCAqaGVhZGVyKiBzcGVjaWZpZXMgYW4KKyAgICAgIGFsdGVybmF0aXZlIHRvIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgLgorCisKKyAgIC4uIG1ldGhvZDo6IHNldF90eXBlKHR5cGUsIGhlYWRlcj0nQ29udGVudC1UeXBlJywgcmVxdW90ZT1UcnVlKQorCisgICAgICBTZXQgdGhlIG1haW4gdHlwZSBhbmQgc3VidHlwZSBmb3IgdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgCisgICAgICBoZWFkZXIuICp0eXBlKiBtdXN0IGJlIGEgc3RyaW5nIGluIHRoZSBmb3JtIDptaW1ldHlwZTpgbWFpbnR5cGUvc3VidHlwZWAsCisgICAgICBvdGhlcndpc2UgYSA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQuCisKKyAgICAgIFRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIsIGtlZXBpbmcgYWxsCisgICAgICB0aGUgcGFyYW1ldGVycyBpbiBwbGFjZS4gIElmICpyZXF1b3RlKiBpcyBgYEZhbHNlYGAsIHRoaXMgbGVhdmVzIHRoZQorICAgICAgZXhpc3RpbmcgaGVhZGVyJ3MgcXVvdGluZyBhcyBpcywgb3RoZXJ3aXNlIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcXVvdGVkCisgICAgICAodGhlIGRlZmF1bHQpLgorCisgICAgICBBbiBhbHRlcm5hdGl2ZSBoZWFkZXIgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgKmhlYWRlciogYXJndW1lbnQuIFdoZW4gdGhlCisgICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIgaXMgc2V0IGEgOm1haWxoZWFkZXI6YE1JTUUtVmVyc2lvbmAKKyAgICAgIGhlYWRlciBpcyBhbHNvIGFkZGVkLgorCisgICAgICBUaGlzIGlzIGEgbGVnYWN5IG1ldGhvZC4gIE9uIHRoZQorICAgICAgOmNsYXNzOmB+ZW1haWwuZW1haWxtZXNzYWdlLkVtYWlsTWVzc2FnZWAgY2xhc3MgaXRzIGZ1bmN0aW9uYWxpdHkgaXMKKyAgICAgIHJlcGxhY2VkIGJ5IHRoZSBgYG1ha2VfYGAgYW5kIGBgYWRkX2BgIG1ldGhvZHMuCisKKworICAgLi4gbWV0aG9kOjogZ2V0X2ZpbGVuYW1lKGZhaWxvYmo9Tm9uZSkKKworICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYGBmaWxlbmFtZWBgIHBhcmFtZXRlciBvZiB0aGUKKyAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LURpc3Bvc2l0aW9uYCBoZWFkZXIgb2YgdGhlIG1lc3NhZ2UuICBJZiB0aGUgaGVhZGVyCisgICAgICBkb2VzIG5vdCBoYXZlIGEgYGBmaWxlbmFtZWBgIHBhcmFtZXRlciwgdGhpcyBtZXRob2QgZmFsbHMgYmFjayB0byBsb29raW5nCisgICAgICBmb3IgdGhlIGBgbmFtZWBgIHBhcmFtZXRlciBvbiB0aGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyLiAgSWYKKyAgICAgIG5laXRoZXIgaXMgZm91bmQsIG9yIHRoZSBoZWFkZXIgaXMgbWlzc2luZywgdGhlbiAqZmFpbG9iaiogaXMgcmV0dXJuZWQuCisgICAgICBUaGUgcmV0dXJuZWQgc3RyaW5nIHdpbGwgYWx3YXlzIGJlIHVucXVvdGVkIGFzIHBlcgorICAgICAgOmZ1bmM6YGVtYWlsLnV0aWxzLnVucXVvdGVgLgorCisKKyAgIC4uIG1ldGhvZDo6IGdldF9ib3VuZGFyeShmYWlsb2JqPU5vbmUpCisKKyAgICAgIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGBgYm91bmRhcnlgYCBwYXJhbWV0ZXIgb2YgdGhlCisgICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIgb2YgdGhlIG1lc3NhZ2UsIG9yICpmYWlsb2JqKiBpZiBlaXRoZXIKKyAgICAgIHRoZSBoZWFkZXIgaXMgbWlzc2luZywgb3IgaGFzIG5vIGBgYm91bmRhcnlgYCBwYXJhbWV0ZXIuICBUaGUgcmV0dXJuZWQKKyAgICAgIHN0cmluZyB3aWxsIGFsd2F5cyBiZSB1bnF1b3RlZCBhcyBwZXIgOmZ1bmM6YGVtYWlsLnV0aWxzLnVucXVvdGVgLgorCisKKyAgIC4uIG1ldGhvZDo6IHNldF9ib3VuZGFyeShib3VuZGFyeSkKKworICAgICAgU2V0IHRoZSBgYGJvdW5kYXJ5YGAgcGFyYW1ldGVyIG9mIHRoZSA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIgdG8KKyAgICAgICpib3VuZGFyeSouICA6bWV0aDpgc2V0X2JvdW5kYXJ5YCB3aWxsIGFsd2F5cyBxdW90ZSAqYm91bmRhcnkqIGlmCisgICAgICBuZWNlc3NhcnkuICBBIDpleGM6YH5lbWFpbC5lcnJvcnMuSGVhZGVyUGFyc2VFcnJvcmAgaXMgcmFpc2VkIGlmIHRoZQorICAgICAgbWVzc2FnZSBvYmplY3QgaGFzIG5vIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlci4KKworICAgICAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgbWV0aG9kIGlzIHN1YnRseSBkaWZmZXJlbnQgdGhhbiBkZWxldGluZyB0aGUgb2xkCisgICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIgYW5kIGFkZGluZyBhIG5ldyBvbmUgd2l0aCB0aGUgbmV3CisgICAgICBib3VuZGFyeSB2aWEgOm1ldGg6YGFkZF9oZWFkZXJgLCBiZWNhdXNlIDptZXRoOmBzZXRfYm91bmRhcnlgIHByZXNlcnZlcworICAgICAgdGhlIG9yZGVyIG9mIHRoZSA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIgaW4gdGhlIGxpc3Qgb2YKKyAgICAgIGhlYWRlcnMuIEhvd2V2ZXIsIGl0IGRvZXMgKm5vdCogcHJlc2VydmUgYW55IGNvbnRpbnVhdGlvbiBsaW5lcyB3aGljaCBtYXkKKyAgICAgIGhhdmUgYmVlbiBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIuCisKKworICAgLi4gbWV0aG9kOjogZ2V0X2NvbnRlbnRfY2hhcnNldChmYWlsb2JqPU5vbmUpCisKKyAgICAgIFJldHVybiB0aGUgYGBjaGFyc2V0YGAgcGFyYW1ldGVyIG9mIHRoZSA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIsCisgICAgICBjb2VyY2VkIHRvIGxvd2VyIGNhc2UuICBJZiB0aGVyZSBpcyBubyA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIsIG9yIGlmCisgICAgICB0aGF0IGhlYWRlciBoYXMgbm8gYGBjaGFyc2V0YGAgcGFyYW1ldGVyLCAqZmFpbG9iaiogaXMgcmV0dXJuZWQuCisKKyAgICAgIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gOm1ldGg6YGdldF9jaGFyc2V0YCB3aGljaCByZXR1cm5zIHRoZQorICAgICAgOmNsYXNzOmB+ZW1haWwuY2hhcnNldC5DaGFyc2V0YCBpbnN0YW5jZSBmb3IgdGhlIGRlZmF1bHQgZW5jb2Rpbmcgb2YgdGhlIG1lc3NhZ2UgYm9keS4KKworCisgICAuLiBtZXRob2Q6OiBnZXRfY2hhcnNldHMoZmFpbG9iaj1Ob25lKQorCisgICAgICBSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlciBzZXQgbmFtZXMgaW4gdGhlIG1lc3NhZ2UuICBJZiB0aGUKKyAgICAgIG1lc3NhZ2UgaXMgYSA6bWltZXR5cGU6YG11bHRpcGFydGAsIHRoZW4gdGhlIGxpc3Qgd2lsbCBjb250YWluIG9uZSBlbGVtZW50CisgICAgICBmb3IgZWFjaCBzdWJwYXJ0IGluIHRoZSBwYXlsb2FkLCBvdGhlcndpc2UsIGl0IHdpbGwgYmUgYSBsaXN0IG9mIGxlbmd0aCAxLgorCisgICAgICBFYWNoIGl0ZW0gaW4gdGhlIGxpc3Qgd2lsbCBiZSBhIHN0cmluZyB3aGljaCBpcyB0aGUgdmFsdWUgb2YgdGhlCisgICAgICBgYGNoYXJzZXRgYCBwYXJhbWV0ZXIgaW4gdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciBmb3IgdGhlCisgICAgICByZXByZXNlbnRlZCBzdWJwYXJ0LiAgSG93ZXZlciwgaWYgdGhlIHN1YnBhcnQgaGFzIG5vCisgICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIsIG5vIGBgY2hhcnNldGBgIHBhcmFtZXRlciwgb3IgaXMgbm90IG9mCisgICAgICB0aGUgOm1pbWV0eXBlOmB0ZXh0YCBtYWluIE1JTUUgdHlwZSwgdGhlbiB0aGF0IGl0ZW0gaW4gdGhlIHJldHVybmVkIGxpc3QKKyAgICAgIHdpbGwgYmUgKmZhaWxvYmoqLgorCisKKyAgIC4uIG1ldGhvZDo6IGdldF9jb250ZW50X2Rpc3Bvc2l0aW9uKCkKKworICAgICAgUmV0dXJuIHRoZSBsb3dlcmNhc2VkIHZhbHVlICh3aXRob3V0IHBhcmFtZXRlcnMpIG9mIHRoZSBtZXNzYWdlJ3MKKyAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LURpc3Bvc2l0aW9uYCBoZWFkZXIgaWYgaXQgaGFzIG9uZSwgb3IgYGBOb25lYGAuICBUaGUKKyAgICAgIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBtZXRob2QgYXJlICppbmxpbmUqLCAqYXR0YWNobWVudCogb3IgYGBOb25lYGAKKyAgICAgIGlmIHRoZSBtZXNzYWdlIGZvbGxvd3MgOnJmYzpgMjE4M2AuCisKKyAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNQorCisgICAuLiBtZXRob2Q6OiB3YWxrKCkKKworICAgICAgVGhlIDptZXRoOmB3YWxrYCBtZXRob2QgaXMgYW4gYWxsLXB1cnBvc2UgZ2VuZXJhdG9yIHdoaWNoIGNhbiBiZSB1c2VkIHRvCisgICAgICBpdGVyYXRlIG92ZXIgYWxsIHRoZSBwYXJ0cyBhbmQgc3VicGFydHMgb2YgYSBtZXNzYWdlIG9iamVjdCB0cmVlLCBpbgorICAgICAgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIG9yZGVyLiAgWW91IHdpbGwgdHlwaWNhbGx5IHVzZSA6bWV0aDpgd2Fsa2AgYXMgdGhlCisgICAgICBpdGVyYXRvciBpbiBhIGBgZm9yYGAgbG9vcDsgZWFjaCBpdGVyYXRpb24gcmV0dXJucyB0aGUgbmV4dCBzdWJwYXJ0LgorCisgICAgICBIZXJlJ3MgYW4gZXhhbXBsZSB0aGF0IHByaW50cyB0aGUgTUlNRSB0eXBlIG9mIGV2ZXJ5IHBhcnQgb2YgYSBtdWx0aXBhcnQKKyAgICAgIG1lc3NhZ2Ugc3RydWN0dXJlOgorCisgICAgICAuLiB0ZXN0c2V0dXA6OgorCisgICAgICAgICA+Pj4gZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZV9mcm9tX2JpbmFyeV9maWxlCisgICAgICAgICA+Pj4gd2l0aCBvcGVuKCdMaWIvdGVzdC90ZXN0X2VtYWlsL2RhdGEvbXNnXzE2LnR4dCcsICdyYicpIGFzIGY6CisgICAgICAgICAuLi4gICAgIG1zZyA9IG1lc3NhZ2VfZnJvbV9iaW5hcnlfZmlsZShmKQorICAgICAgICAgPj4+IGZyb20gZW1haWwuaXRlcmF0b3JzIGltcG9ydCBfc3RydWN0dXJlCisKKyAgICAgIC4uIGRvY3Rlc3Q6OgorCisgICAgICAgICA+Pj4gZm9yIHBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgIC4uLiAgICAgcHJpbnQocGFydC5nZXRfY29udGVudF90eXBlKCkpCisgICAgICAgICBtdWx0aXBhcnQvcmVwb3J0CisgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgICBtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cworICAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgIHRleHQvcGxhaW4KKworICAgICAgYGB3YWxrYGAgaXRlcmF0ZXMgb3ZlciB0aGUgc3VicGFydHMgb2YgYW55IHBhcnQgd2hlcmUKKyAgICAgIDptZXRoOmBpc19tdWx0aXBhcnRgIHJldHVybnMgYGBUcnVlYGAsIGV2ZW4gdGhvdWdoCisgICAgICBgYG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpID09ICdtdWx0aXBhcnQnYGAgbWF5IHJldHVybiBgYEZhbHNlYGAuICBXZQorICAgICAgY2FuIHNlZSB0aGlzIGluIG91ciBleGFtcGxlIGJ5IG1ha2luZyB1c2Ugb2YgdGhlIGBgX3N0cnVjdHVyZWBgIGRlYnVnCisgICAgICBoZWxwZXIgZnVuY3Rpb246CisKKyAgICAgIC4uIGRvY3Rlc3Q6OgorCisgICAgICAgICA+Pj4gZm9yIHBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgIC4uLiAgICAgcHJpbnQocGFydC5nZXRfY29udGVudF9tYWludHlwZSgpID09ICdtdWx0aXBhcnQnKSwKKyAgICAgICAgIC4uLiAgICAgICAgICAgcGFydC5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgIFRydWUgVHJ1ZQorICAgICAgICAgRmFsc2UgRmFsc2UKKyAgICAgICAgIEZhbHNlIFRydWUKKyAgICAgICAgIEZhbHNlIEZhbHNlCisgICAgICAgICBGYWxzZSBGYWxzZQorICAgICAgICAgRmFsc2UgVHJ1ZQorICAgICAgICAgRmFsc2UgRmFsc2UKKyAgICAgICAgID4+PiBfc3RydWN0dXJlKG1zZykKKyAgICAgICAgIG11bHRpcGFydC9yZXBvcnQKKyAgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgICBtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cworICAgICAgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAgICAgIHRleHQvcGxhaW4KKworICAgICAgSGVyZSB0aGUgYGBtZXNzYWdlYGAgcGFydHMgYXJlIG5vdCBgYG11bHRpcGFydHNgYCwgYnV0IHRoZXkgZG8gY29udGFpbgorICAgICAgc3VicGFydHMuIGBgaXNfbXVsdGlwYXJ0KClgYCByZXR1cm5zIGBgVHJ1ZWBgIGFuZCBgYHdhbGtgYCBkZXNjZW5kcworICAgICAgaW50byB0aGUgc3VicGFydHMuCisKKworICAgOmNsYXNzOmBNZXNzYWdlYCBvYmplY3RzIGNhbiBhbHNvIG9wdGlvbmFsbHkgY29udGFpbiB0d28gaW5zdGFuY2UgYXR0cmlidXRlcywKKyAgIHdoaWNoIGNhbiBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgcGxhaW4gdGV4dCBvZiBhIE1JTUUgbWVzc2FnZS4KKworCisgICAuLiBhdHRyaWJ1dGU6OiBwcmVhbWJsZQorCisgICAgICBUaGUgZm9ybWF0IG9mIGEgTUlNRSBkb2N1bWVudCBhbGxvd3MgZm9yIHNvbWUgdGV4dCBiZXR3ZWVuIHRoZSBibGFuayBsaW5lCisgICAgICBmb2xsb3dpbmcgdGhlIGhlYWRlcnMsIGFuZCB0aGUgZmlyc3QgbXVsdGlwYXJ0IGJvdW5kYXJ5IHN0cmluZy4gTm9ybWFsbHksCisgICAgICB0aGlzIHRleHQgaXMgbmV2ZXIgdmlzaWJsZSBpbiBhIE1JTUUtYXdhcmUgbWFpbCByZWFkZXIgYmVjYXVzZSBpdCBmYWxscworICAgICAgb3V0c2lkZSB0aGUgc3RhbmRhcmQgTUlNRSBhcm1vci4gIEhvd2V2ZXIsIHdoZW4gdmlld2luZyB0aGUgcmF3IHRleHQgb2YKKyAgICAgIHRoZSBtZXNzYWdlLCBvciB3aGVuIHZpZXdpbmcgdGhlIG1lc3NhZ2UgaW4gYSBub24tTUlNRSBhd2FyZSByZWFkZXIsIHRoaXMKKyAgICAgIHRleHQgY2FuIGJlY29tZSB2aXNpYmxlLgorCisgICAgICBUaGUgKnByZWFtYmxlKiBhdHRyaWJ1dGUgY29udGFpbnMgdGhpcyBsZWFkaW5nIGV4dHJhLWFybW9yIHRleHQgZm9yIE1JTUUKKyAgICAgIGRvY3VtZW50cy4gIFdoZW4gdGhlIDpjbGFzczpgfmVtYWlsLnBhcnNlci5QYXJzZXJgIGRpc2NvdmVycyBzb21lIHRleHQKKyAgICAgIGFmdGVyIHRoZSBoZWFkZXJzIGJ1dCBiZWZvcmUgdGhlIGZpcnN0IGJvdW5kYXJ5IHN0cmluZywgaXQgYXNzaWducyB0aGlzCisgICAgICB0ZXh0IHRvIHRoZSBtZXNzYWdlJ3MgKnByZWFtYmxlKiBhdHRyaWJ1dGUuICBXaGVuIHRoZQorICAgICAgOmNsYXNzOmB+ZW1haWwuZ2VuZXJhdG9yLkdlbmVyYXRvcmAgaXMgd3JpdGluZyBvdXQgdGhlIHBsYWluIHRleHQKKyAgICAgIHJlcHJlc2VudGF0aW9uIG9mIGEgTUlNRSBtZXNzYWdlLCBhbmQgaXQgZmluZHMgdGhlCisgICAgICBtZXNzYWdlIGhhcyBhICpwcmVhbWJsZSogYXR0cmlidXRlLCBpdCB3aWxsIHdyaXRlIHRoaXMgdGV4dCBpbiB0aGUgYXJlYQorICAgICAgYmV0d2VlbiB0aGUgaGVhZGVycyBhbmQgdGhlIGZpcnN0IGJvdW5kYXJ5LiAgU2VlIDptb2Q6YGVtYWlsLnBhcnNlcmAgYW5kCisgICAgICA6bW9kOmBlbWFpbC5nZW5lcmF0b3JgIGZvciBkZXRhaWxzLgorCisgICAgICBOb3RlIHRoYXQgaWYgdGhlIG1lc3NhZ2Ugb2JqZWN0IGhhcyBubyBwcmVhbWJsZSwgdGhlICpwcmVhbWJsZSogYXR0cmlidXRlCisgICAgICB3aWxsIGJlIGBgTm9uZWBgLgorCisKKyAgIC4uIGF0dHJpYnV0ZTo6IGVwaWxvZ3VlCisKKyAgICAgIFRoZSAqZXBpbG9ndWUqIGF0dHJpYnV0ZSBhY3RzIHRoZSBzYW1lIHdheSBhcyB0aGUgKnByZWFtYmxlKiBhdHRyaWJ1dGUsCisgICAgICBleGNlcHQgdGhhdCBpdCBjb250YWlucyB0ZXh0IHRoYXQgYXBwZWFycyBiZXR3ZWVuIHRoZSBsYXN0IGJvdW5kYXJ5IGFuZAorICAgICAgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KKworICAgICAgWW91IGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgZXBpbG9ndWUgdG8gdGhlIGVtcHR5IHN0cmluZyBpbiBvcmRlciBmb3IgdGhlCisgICAgICA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuR2VuZXJhdG9yYCB0byBwcmludCBhIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgIGZpbGUuCisKKworICAgLi4gYXR0cmlidXRlOjogZGVmZWN0cworCisgICAgICBUaGUgKmRlZmVjdHMqIGF0dHJpYnV0ZSBjb250YWlucyBhIGxpc3Qgb2YgYWxsIHRoZSBwcm9ibGVtcyBmb3VuZCB3aGVuCisgICAgICBwYXJzaW5nIHRoaXMgbWVzc2FnZS4gIFNlZSA6bW9kOmBlbWFpbC5lcnJvcnNgIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uCisgICAgICBvZiB0aGUgcG9zc2libGUgcGFyc2luZyBkZWZlY3RzLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwuY29udGVudG1hbmFnZXIucnN0IGIvRG9jL2xpYnJhcnkvZW1haWwuY29udGVudG1hbmFnZXIucnN0CmluZGV4IGE5YzA3OGIuLjU3NzQzZDUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2VtYWlsLmNvbnRlbnRtYW5hZ2VyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC5jb250ZW50bWFuYWdlci5yc3QKQEAgLTcsMjUxICs3LDEyIEBACiAuLiBtb2R1bGVhdXRob3I6OiBSLiBEYXZpZCBNdXJyYXkgPHJkbXVycmF5QGJpdGRhbmNlLmNvbT4KIC4uIHNlY3Rpb25hdXRob3I6OiBSLiBEYXZpZCBNdXJyYXkgPHJkbXVycmF5QGJpdGRhbmNlLmNvbT4KIAotLi4gdmVyc2lvbmFkZGVkOjogMy40Ci0gICBhcyBhIDp0ZXJtOmBwcm92aXNpb25hbCBtb2R1bGUgPHByb3Zpc2lvbmFsIHBhY2thZ2U+YC4KLQogKipTb3VyY2UgY29kZToqKiA6c291cmNlOmBMaWIvZW1haWwvY29udGVudG1hbmFnZXIucHlgCiAKLS4uIG5vdGU6OgorLS0tLS0tLS0tLS0tCiAKLSAgIFRoZSBjb250ZW50bWFuYWdlciBtb2R1bGUgaGFzIGJlZW4gaW5jbHVkZWQgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkgb24gYQotICAgOnRlcm06YHByb3Zpc2lvbmFsIGJhc2lzIDxwcm92aXNpb25hbCBwYWNrYWdlPmAuIEJhY2t3YXJkcyBpbmNvbXBhdGlibGUKLSAgIGNoYW5nZXMgKHVwIHRvIGFuZCBpbmNsdWRpbmcgcmVtb3ZhbCBvZiB0aGUgbW9kdWxlKSBtYXkgb2NjdXIgaWYgZGVlbWVkCi0gICBuZWNlc3NhcnkgYnkgdGhlIGNvcmUgZGV2ZWxvcGVycy4KLQotLS0tLS0tLS0tLS0tLS0KLQotVGhlIDptb2Q6YH5lbWFpbC5tZXNzYWdlYCBtb2R1bGUgcHJvdmlkZXMgYSBjbGFzcyB0aGF0IGNhbiByZXByZXNlbnQgYW4KLWFyYml0cmFyeSBlbWFpbCBtZXNzYWdlLiAgVGhhdCBiYXNpYyBtZXNzYWdlIG1vZGVsIGhhcyBhIHVzZWZ1bCBhbmQgZmxleGlibGUKLUFQSSwgYnV0IGl0IHByb3ZpZGVzIG9ubHkgYSBsb3dlci1sZXZlbCBBUEkgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGdlbmVyaWMKLXBhcnRzIG9mIGEgbWVzc2FnZSAodGhlIGhlYWRlcnMsIGdlbmVyaWMgaGVhZGVyIHBhcmFtZXRlcnMsIGFuZCB0aGUgcGF5bG9hZCwKLXdoaWNoIG1heSBiZSBhIGxpc3Qgb2Ygc3ViLXBhcnRzKS4gIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGNsYXNzZXMgYW5kIHRvb2xzCi10aGF0IHByb3ZpZGUgYW4gZW5oYW5jZWQgYW5kIGV4dGVuc2libGUgQVBJIGZvciBkZWFsaW5nIHdpdGggdmFyaW91cyBzcGVjaWZpYwotdHlwZXMgb2YgY29udGVudCwgaW5jbHVkaW5nIHRoZSBhYmlsaXR5IHRvIHJldHJpZXZlIHRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlCi1hcyBhIHNwZWNpYWxpemVkIG9iamVjdCB0eXBlIHJhdGhlciB0aGFuIGFzIGEgc2ltcGxlIGJ5dGVzIG9iamVjdC4gIFRoZSBtb2R1bGUKLWF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBvZiB0aGUgUkZDLXNwZWNpZmllZCBNSU1FIGRldGFpbHMgKHJlcXVpcmVkIGhlYWRlcnMKLWFuZCBwYXJhbWV0ZXJzLCBldGMuKSBmb3IgdGhlIGNlcnRhaW4gY29tbW9uIGNvbnRlbnQgdHlwZXMgY29udGVudCBwcm9wZXJ0aWVzLAotYW5kIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgdHlwZXMgY2FuIGJlIGFkZGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHVzaW5nIHRoZQotZXh0ZW5zaW9uIG1lY2hhbmlzbXMuCi0KLVRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGVwb255bW91cyAiQ29udGVudCBNYW5hZ2VyIiBjbGFzc2VzLiAgVGhlIGJhc2UKLTpjbGFzczpgLkNvbnRlbnRNYW5hZ2VyYCBjbGFzcyBkZWZpbmVzIGFuIEFQSSBmb3IgcmVnaXN0ZXJpbmcgY29udGVudAotbWFuYWdlbWVudCBmdW5jdGlvbnMgd2hpY2ggZXh0cmFjdCBkYXRhIGZyb20gYGBNZXNzYWdlYGAgb2JqZWN0cyBvciBpbnNlcnQgZGF0YQotYW5kIGhlYWRlcnMgaW50byBgYE1lc3NhZ2VgYCBvYmplY3RzLCB0aHVzIHByb3ZpZGluZyBhIHdheSBvZiBjb252ZXJ0aW5nCi1iZXR3ZWVuIGBgTWVzc2FnZWBgIG9iamVjdHMgY29udGFpbmluZyBkYXRhIGFuZCBvdGhlciByZXByZXNlbnRhdGlvbnMgb2YgdGhhdAotZGF0YSAoUHl0aG9uIGRhdGEgdHlwZXMsIHNwZWNpYWxpemVkIFB5dGhvbiBvYmplY3RzLCBleHRlcm5hbCBmaWxlcywgZXRjKS4gIFRoZQotbW9kdWxlIGFsc28gZGVmaW5lcyBvbmUgY29uY3JldGUgY29udGVudCBtYW5hZ2VyOiA6ZGF0YTpgcmF3X2RhdGFfbWFuYWdlcmAKLWNvbnZlcnRzIGJldHdlZW4gTUlNRSBjb250ZW50IHR5cGVzIGFuZCBgYHN0cmBgIG9yIGBgYnl0ZXNgYCBkYXRhLiAgSXQgYWxzbwotcHJvdmlkZXMgYSBjb252ZW5pZW50IEFQSSBmb3IgbWFuYWdpbmcgdGhlIE1JTUUgcGFyYW1ldGVycyB3aGVuIGluc2VydGluZwotY29udGVudCBpbnRvIGBgTWVzc2FnZWBgXCBzLiAgSXQgYWxzbyBoYW5kbGVzIGluc2VydGluZyBhbmQgZXh0cmFjdGluZwotYGBNZXNzYWdlYGAgb2JqZWN0cyB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgYGBtZXNzYWdlL3JmYzgyMmBgIGNvbnRlbnQgdHlwZS4KLQotQW5vdGhlciBwYXJ0IG9mIHRoZSBlbmhhbmNlZCBpbnRlcmZhY2UgaXMgc3ViY2xhc3NlcyBvZgotOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCB0aGF0IHByb3ZpZGUgbmV3IGNvbnZlbmllbmNlIEFQSSBmdW5jdGlvbnMsCi1pbmNsdWRpbmcgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY2FsbGluZyB0aGUgQ29udGVudCBNYW5hZ2VycyBkZXJpdmVkIGZyb20KLXRoaXMgbW9kdWxlLgotCi0uLiBub3RlOjoKLQotICAgQWx0aG91Z2ggOmNsYXNzOmAuRW1haWxNZXNzYWdlYCBhbmQgOmNsYXNzOmAuTUlNRVBhcnRgIGFyZSBjdXJyZW50bHkKLSAgIGRvY3VtZW50ZWQgaW4gdGhpcyBtb2R1bGUgYmVjYXVzZSBvZiB0aGUgcHJvdmlzaW9uYWwgbmF0dXJlIG9mIHRoZSBjb2RlLCB0aGUKLSAgIGltcGxlbWVudGF0aW9uIGxpdmVzIGluIHRoZSA6bW9kOmBlbWFpbC5tZXNzYWdlYCBtb2R1bGUuCi0KLS4uIGN1cnJlbnRtb2R1bGU6OiBlbWFpbC5tZXNzYWdlCi0KLS4uIGNsYXNzOjogRW1haWxNZXNzYWdlKHBvbGljeT1kZWZhdWx0KQotCi0gICBJZiAqcG9saWN5KiBpcyBzcGVjaWZpZWQgKGl0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgYSA6bW9kOmB+ZW1haWwucG9saWN5YAotICAgY2xhc3MpIHVzZSB0aGUgcnVsZXMgaXQgc3BlY2lmaWVzIHRvIHVkcGF0ZSBhbmQgc2VyaWFsaXplIHRoZSByZXByZXNlbnRhdGlvbgotICAgb2YgdGhlIG1lc3NhZ2UuICBJZiAqcG9saWN5KiBpcyBub3Qgc2V0LCB1c2UgdGhlCi0gICA6Y2xhc3M6YH5lbWFpbC5wb2xpY3kuZGVmYXVsdGAgcG9saWN5LCB3aGljaCBmb2xsb3dzIHRoZSBydWxlcyBvZiB0aGUgZW1haWwKLSAgIFJGQ3MgZXhjZXB0IGZvciBsaW5lIGVuZGluZ3MgKGluc3RlYWQgb2YgdGhlIFJGQyBtYW5kYXRlZCBgYFxyXG5gYCwgaXQgdXNlcwotICAgdGhlIFB5dGhvbiBzdGFuZGFyZCBgYFxuYGAgbGluZSBlbmRpbmdzKS4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUKLSAgIDptb2Q6YH5lbWFpbC5wb2xpY3lgIGRvY3VtZW50YXRpb24uCi0KLSAgIFRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgLiAgSXQgYWRkcwotICAgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCi0KLSAgIC4uIG1ldGhvZDo6IGlzX2F0dGFjaG1lbnQKLQotICAgICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZXJlIGlzIGEgOm1haWxoZWFkZXI6YENvbnRlbnQtRGlzcG9zaXRpb25gIGhlYWRlcgotICAgICAgYW5kIGl0cyAoY2FzZSBpbnNlbnNpdGl2ZSkgdmFsdWUgaXMgYGBhdHRhY2htZW50YGAsIGBgRmFsc2VgYCBvdGhlcndpc2UuCi0KLSAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy40LjIKLSAgICAgICAgIGlzX2F0dGFjaG1lbnQgaXMgbm93IGEgbWV0aG9kIGluc3RlYWQgb2YgYSBwcm9wZXJ0eSwgZm9yIGNvbnNpc3RlbmN5Ci0gICAgICAgICB3aXRoIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmlzX211bHRpcGFydGAuCi0KLQotICAgLi4gbWV0aG9kOjogZ2V0X2JvZHkocHJlZmVyZW5jZWxpc3Q9KCdyZWxhdGVkJywgJ2h0bWwnLCAncGxhaW4nKSkKLQotICAgICAgUmV0dXJuIHRoZSBNSU1FIHBhcnQgdGhhdCBpcyB0aGUgYmVzdCBjYW5kaWRhdGUgdG8gYmUgdGhlICJib2R5IiBvZiB0aGUKLSAgICAgIG1lc3NhZ2UuCi0KLSAgICAgICpwcmVmZXJlbmNlbGlzdCogbXVzdCBiZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3MgZnJvbSB0aGUgc2V0IGBgcmVsYXRlZGBgLAotICAgICAgYGBodG1sYGAsIGFuZCBgYHBsYWluYGAsIGFuZCBpbmRpY2F0ZXMgdGhlIG9yZGVyIG9mIHByZWZlcmVuY2UgZm9yIHRoZQotICAgICAgY29udGVudCB0eXBlIG9mIHRoZSBwYXJ0IHJldHVybmVkLgotCi0gICAgICBTdGFydCBsb29raW5nIGZvciBjYW5kaWRhdGUgbWF0Y2hlcyB3aXRoIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlCi0gICAgICBgYGdldF9ib2R5YGAgbWV0aG9kIGlzIGNhbGxlZC4KLQotICAgICAgSWYgYGByZWxhdGVkYGAgaXMgbm90IGluY2x1ZGVkIGluICpwcmVmZXJlbmNlbGlzdCosIGNvbnNpZGVyIHRoZSByb290Ci0gICAgICBwYXJ0IChvciBzdWJwYXJ0IG9mIHRoZSByb290IHBhcnQpIG9mIGFueSByZWxhdGVkIGVuY291bnRlcmVkIGFzIGEKLSAgICAgIGNhbmRpZGF0ZSBpZiB0aGUgKHN1Yi0pcGFydCBtYXRjaGVzIGEgcHJlZmVyZW5jZS4KLQotICAgICAgV2hlbiBlbmNvdW50ZXJpbmcgYSBgYG11bHRpcGFydC9yZWxhdGVkYGAsIGNoZWNrIHRoZSBgYHN0YXJ0YGAgcGFyYW1ldGVyCi0gICAgICBhbmQgaWYgYSBwYXJ0IHdpdGggYSBtYXRjaGluZyA6bWFpbGhlYWRlcjpgQ29udGVudC1JRGAgaXMgZm91bmQsIGNvbnNpZGVyCi0gICAgICBvbmx5IGl0IHdoZW4gbG9va2luZyBmb3IgY2FuZGlkYXRlIG1hdGNoZXMuICBPdGhlcndpc2UgY29uc2lkZXIgb25seSB0aGUKLSAgICAgIGZpcnN0IChkZWZhdWx0IHJvb3QpIHBhcnQgb2YgdGhlIGBgbXVsdGlwYXJ0L3JlbGF0ZWRgYC4KLQotICAgICAgSWYgYSBwYXJ0IGhhcyBhIDptYWlsaGVhZGVyOmBDb250ZW50LURpc3Bvc2l0aW9uYCBoZWFkZXIsIG9ubHkgY29uc2lkZXIKLSAgICAgIHRoZSBwYXJ0IGEgY2FuZGlkYXRlIG1hdGNoIGlmIHRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyIGlzIGBgaW5saW5lYGAuCi0KLSAgICAgIElmIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgbWF0Y2hlcyBhbnkgb2YgdGhlIHByZWZlcmVuY2VzIGluCi0gICAgICAqcHJlZmVybmVjbGlzdCosIHJldHVybiBgYE5vbmVgYC4KLQotICAgICAgTm90ZXM6ICgxKSBGb3IgbW9zdCBhcHBsaWNhdGlvbnMgdGhlIG9ubHkgKnByZWZlcmVuY2VsaXN0KiBjb21iaW5hdGlvbnMKLSAgICAgIHRoYXQgcmVhbGx5IG1ha2Ugc2Vuc2UgYXJlIGBgKCdwbGFpbicsKWBgLCBgYCgnaHRtbCcsICdwbGFpbicpYGAsIGFuZCB0aGUKLSAgICAgIGRlZmF1bHQsIGBgKCdyZWxhdGVkJywgJ2h0bWwnLCAncGxhaW4nKWBgLiAgKDIpIEJlY2F1c2UgbWF0Y2hpbmcgc3RhcnRzCi0gICAgICB3aXRoIHRoZSBvYmplY3Qgb24gd2hpY2ggYGBnZXRfYm9keWBgIGlzIGNhbGxlZCwgY2FsbGluZyBgYGdldF9ib2R5YGAgb24KLSAgICAgIGEgYGBtdWx0aXBhcnQvcmVsYXRlZGBgIHdpbGwgcmV0dXJuIHRoZSBvYmplY3QgaXRzZWxmIHVubGVzcwotICAgICAgKnByZWZlcmVuY2VsaXN0KiBoYXMgYSBub24tZGVmYXVsdCB2YWx1ZS4gKDMpIE1lc3NhZ2VzIChvciBtZXNzYWdlIHBhcnRzKQotICAgICAgdGhhdCBkbyBub3Qgc3BlY2lmeSBhIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIG9yIHdob3NlCi0gICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIgaXMgaW52YWxpZCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgdGhleQotICAgICAgYXJlIG9mIHR5cGUgYGB0ZXh0L3BsYWluYGAsIHdoaWNoIG1heSBvY2Nhc2lvbmFsbHkgY2F1c2UgYGBnZXRfYm9keWBgIHRvCi0gICAgICByZXR1cm4gdW5leHBlY3RlZCByZXN1bHRzLgotCi0KLSAgIC4uIG1ldGhvZDo6IGl0ZXJfYXR0YWNobWVudHMoKQotCi0gICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBhbGwgb2YgdGhlIHBhcnRzIG9mIHRoZSBtZXNzYWdlIHRoYXQgYXJlIG5vdAotICAgICAgY2FuZGlkYXRlICJib2R5IiBwYXJ0cy4gIFRoYXQgaXMsIHNraXAgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBvZgotICAgICAgYGB0ZXh0L3BsYWluYGAsIGBgdGV4dC9odG1sYGAsIGBgbXVsdGlwYXJ0L3JlbGF0ZWRgYCwgb3IKLSAgICAgIGBgbXVsdGlwYXJ0L2FsdGVybmF0aXZlYGAgKHVubGVzcyB0aGV5IGFyZSBleHBsaWNpdGx5IG1hcmtlZCBhcwotICAgICAgYXR0YWNobWVudHMgdmlhIDptYWlsaGVhZGVyOmBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50YCksIGFuZAotICAgICAgcmV0dXJuIGFsbCByZW1haW5pbmcgcGFydHMuICBXaGVuIGFwcGxpZWQgZGlyZWN0bHkgdG8gYQotICAgICAgYGBtdWx0aXBhcnQvcmVsYXRlZGBgLCByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgYWxsIHRoZSByZWxhdGVkIHBhcnRzCi0gICAgICBleGNlcHQgdGhlIHJvb3QgcGFydCAoaWU6IHRoZSBwYXJ0IHBvaW50ZWQgdG8gYnkgdGhlIGBgc3RhcnRgYCBwYXJhbWV0ZXIsCi0gICAgICBvciB0aGUgZmlyc3QgcGFydCBpZiB0aGVyZSBpcyBubyBgYHN0YXJ0YGAgcGFyYW1ldGVyIG9yIHRoZSBgYHN0YXJ0YGAKLSAgICAgIHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRoZSA6bWFpbGhlYWRlcjpgQ29udGVudC1JRGAgb2YgYW55IG9mIHRoZQotICAgICAgcGFydHMpLiAgV2hlbiBhcHBsaWVkIGRpcmVjdGx5IHRvIGEgYGBtdWx0aXBhcnQvYWx0ZXJuYXRpdmVgYCBvciBhCi0gICAgICBub24tYGBtdWx0aXBhcnRgYCwgcmV0dXJuIGFuIGVtcHR5IGl0ZXJhdG9yLgotCi0KLSAgIC4uIG1ldGhvZDo6IGl0ZXJfcGFydHMoKQotCi0gICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBhbGwgb2YgdGhlIGltbWVkaWF0ZSBzdWItcGFydHMgb2YgdGhlIG1lc3NhZ2UsCi0gICAgICB3aGljaCB3aWxsIGJlIGVtcHR5IGZvciBhIG5vbi1gYG11bHRpcGFydGBgLiAgKFNlZSBhbHNvCi0gICAgICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2Uud2Fsa2AuKQotCi0KLSAgIC4uIG1ldGhvZDo6IGdldF9jb250ZW50KCphcmdzLCBjb250ZW50X21hbmFnZXI9Tm9uZSwgKiprdykKLQotICAgICAgQ2FsbCB0aGUgYGBnZXRfY29udGVudGBgIG1ldGhvZCBvZiB0aGUgKmNvbnRlbnRfbWFuYWdlciosIHBhc3Npbmcgc2VsZgotICAgICAgYXMgdGhlIG1lc3NhZ2Ugb2JqZWN0LCBhbmQgcGFzc2luZyBhbG9uZyBhbnkgb3RoZXIgYXJndW1lbnRzIG9yIGtleXdvcmRzCi0gICAgICBhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cy4gIElmICpjb250ZW50X21hbmFnZXIqIGlzIG5vdCBzcGVjaWZpZWQsIHVzZQotICAgICAgdGhlIGBgY29udGVudF9tYW5hZ2VyYGAgc3BlY2lmaWVkIGJ5IHRoZSBjdXJyZW50IDptb2Q6YH5lbWFpbC5wb2xpY3lgLgotCi0KLSAgIC4uIG1ldGhvZDo6IHNldF9jb250ZW50KCphcmdzLCBjb250ZW50X21hbmFnZXI9Tm9uZSwgKiprdykKLQotICAgICAgQ2FsbCB0aGUgYGBzZXRfY29udGVudGBgIG1ldGhvZCBvZiB0aGUgKmNvbnRlbnRfbWFuYWdlciosIHBhc3Npbmcgc2VsZgotICAgICAgYXMgdGhlIG1lc3NhZ2Ugb2JqZWN0LCBhbmQgcGFzc2luZyBhbG9uZyBhbnkgb3RoZXIgYXJndW1lbnRzIG9yIGtleXdvcmRzCi0gICAgICBhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cy4gIElmICpjb250ZW50X21hbmFnZXIqIGlzIG5vdCBzcGVjaWZpZWQsIHVzZQotICAgICAgdGhlIGBgY29udGVudF9tYW5hZ2VyYGAgc3BlY2lmaWVkIGJ5IHRoZSBjdXJyZW50IDptb2Q6YH5lbWFpbC5wb2xpY3lgLgotCi0KLSAgIC4uIG1ldGhvZDo6IG1ha2VfcmVsYXRlZChib3VuZGFyeT1Ob25lKQotCi0gICAgICBDb252ZXJ0IGEgbm9uLWBgbXVsdGlwYXJ0YGAgbWVzc2FnZSBpbnRvIGEgYGBtdWx0aXBhcnQvcmVsYXRlZGBgIG1lc3NhZ2UsCi0gICAgICBtb3ZpbmcgYW55IGV4aXN0aW5nIDptYWlsaGVhZGVyOmBDb250ZW50LWAgaGVhZGVycyBhbmQgcGF5bG9hZCBpbnRvIGEKLSAgICAgIChuZXcpIGZpcnN0IHBhcnQgb2YgdGhlIGBgbXVsdGlwYXJ0YGAuICBJZiAqYm91bmRhcnkqIGlzIHNwZWNpZmllZCwgdXNlCi0gICAgICBpdCBhcyB0aGUgYm91bmRhcnkgc3RyaW5nIGluIHRoZSBtdWx0aXBhcnQsIG90aGVyd2lzZSBsZWF2ZSB0aGUgYm91bmRhcnkKLSAgICAgIHRvIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aGVuIGl0IGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlCi0gICAgICBtZXNzYWdlIGlzIHNlcmlhbGl6ZWQpLgotCi0KLSAgIC4uIG1ldGhvZDo6IG1ha2VfYWx0ZXJuYXRpdmUoYm91bmRhcnk9Tm9uZSkKLQotICAgICAgQ29udmVydCBhIG5vbi1gYG11bHRpcGFydGBgIG9yIGEgYGBtdWx0aXBhcnQvcmVsYXRlZGBgIGludG8gYQotICAgICAgYGBtdWx0aXBhcnQvYWx0ZXJuYXRpdmVgYCwgbW92aW5nIGFueSBleGlzdGluZyA6bWFpbGhlYWRlcjpgQ29udGVudC1gCi0gICAgICBoZWFkZXJzIGFuZCBwYXlsb2FkIGludG8gYSAobmV3KSBmaXJzdCBwYXJ0IG9mIHRoZSBgYG11bHRpcGFydGBgLiAgSWYKLSAgICAgICpib3VuZGFyeSogaXMgc3BlY2lmaWVkLCB1c2UgaXQgYXMgdGhlIGJvdW5kYXJ5IHN0cmluZyBpbiB0aGUgbXVsdGlwYXJ0LAotICAgICAgb3RoZXJ3aXNlIGxlYXZlIHRoZSBib3VuZGFyeSB0byBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2hlbiBpdCBpcwotICAgICAgbmVlZGVkIChmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbWVzc2FnZSBpcyBzZXJpYWxpemVkKS4KLQotCi0gICAuLiBtZXRob2Q6OiBtYWtlX21peGVkKGJvdW5kYXJ5PU5vbmUpCi0KLSAgICAgIENvbnZlcnQgYSBub24tYGBtdWx0aXBhcnRgYCwgYSBgYG11bHRpcGFydC9yZWxhdGVkYGAsIG9yIGEKLSAgICAgIGBgbXVsdGlwYXJ0LWFsdGVybmF0aXZlYGAgaW50byBhIGBgbXVsdGlwYXJ0L21peGVkYGAsIG1vdmluZyBhbnkgZXhpc3RpbmcKLSAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LWAgaGVhZGVycyBhbmQgcGF5bG9hZCBpbnRvIGEgKG5ldykgZmlyc3QgcGFydCBvZiB0aGUKLSAgICAgIGBgbXVsdGlwYXJ0YGAuICBJZiAqYm91bmRhcnkqIGlzIHNwZWNpZmllZCwgdXNlIGl0IGFzIHRoZSBib3VuZGFyeSBzdHJpbmcKLSAgICAgIGluIHRoZSBtdWx0aXBhcnQsIG90aGVyd2lzZSBsZWF2ZSB0aGUgYm91bmRhcnkgdG8gYmUgYXV0b21hdGljYWxseQotICAgICAgY3JlYXRlZCB3aGVuIGl0IGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG1lc3NhZ2UgaXMgc2VyaWFsaXplZCkuCi0KLQotICAgLi4gbWV0aG9kOjogYWRkX3JlbGF0ZWQoKmFyZ3MsIGNvbnRlbnRfbWFuYWdlcj1Ob25lLCAqKmt3KQotCi0gICAgICBJZiB0aGUgbWVzc2FnZSBpcyBhIGBgbXVsdGlwYXJ0L3JlbGF0ZWRgYCwgY3JlYXRlIGEgbmV3IG1lc3NhZ2UKLSAgICAgIG9iamVjdCwgcGFzcyBhbGwgb2YgdGhlIGFyZ3VtZW50cyB0byBpdHMgOm1ldGg6YHNldF9jb250ZW50YCBtZXRob2QsCi0gICAgICBhbmQgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuYXR0YWNoYCBpdCB0byB0aGUgYGBtdWx0aXBhcnRgYC4gIElmCi0gICAgICB0aGUgbWVzc2FnZSBpcyBhIG5vbi1gYG11bHRpcGFydGBgLCBjYWxsIDptZXRoOmBtYWtlX3JlbGF0ZWRgIGFuZCB0aGVuCi0gICAgICBwcm9jZWVkIGFzIGFib3ZlLiAgSWYgdGhlIG1lc3NhZ2UgaXMgYW55IG90aGVyIHR5cGUgb2YgYGBtdWx0aXBhcnRgYCwKLSAgICAgIHJhaXNlIGEgOmV4YzpgVHlwZUVycm9yYC4gSWYgKmNvbnRlbnRfbWFuYWdlciogaXMgbm90IHNwZWNpZmllZCwgdXNlCi0gICAgICB0aGUgYGBjb250ZW50X21hbmFnZXJgYCBzcGVjaWZpZWQgYnkgdGhlIGN1cnJlbnQgOm1vZDpgfmVtYWlsLnBvbGljeWAuCi0gICAgICBJZiB0aGUgYWRkZWQgcGFydCBoYXMgbm8gOm1haWxoZWFkZXI6YENvbnRlbnQtRGlzcG9zaXRpb25gIGhlYWRlciwKLSAgICAgIGFkZCBvbmUgd2l0aCB0aGUgdmFsdWUgYGBpbmxpbmVgYC4KLQotCi0gICAuLiBtZXRob2Q6OiBhZGRfYWx0ZXJuYXRpdmUoKmFyZ3MsIGNvbnRlbnRfbWFuYWdlcj1Ob25lLCAqKmt3KQotCi0gICAgICBJZiB0aGUgbWVzc2FnZSBpcyBhIGBgbXVsdGlwYXJ0L2FsdGVybmF0aXZlYGAsIGNyZWF0ZSBhIG5ldyBtZXNzYWdlCi0gICAgICBvYmplY3QsIHBhc3MgYWxsIG9mIHRoZSBhcmd1bWVudHMgdG8gaXRzIDptZXRoOmBzZXRfY29udGVudGAgbWV0aG9kLCBhbmQKLSAgICAgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmF0dGFjaGAgaXQgdG8gdGhlIGBgbXVsdGlwYXJ0YGAuICBJZiB0aGUKLSAgICAgIG1lc3NhZ2UgaXMgYSBub24tYGBtdWx0aXBhcnRgYCBvciBgYG11bHRpcGFydC9yZWxhdGVkYGAsIGNhbGwKLSAgICAgIDptZXRoOmBtYWtlX2FsdGVybmF0aXZlYCBhbmQgdGhlbiBwcm9jZWVkIGFzIGFib3ZlLiAgSWYgdGhlIG1lc3NhZ2UgaXMKLSAgICAgIGFueSBvdGhlciB0eXBlIG9mIGBgbXVsdGlwYXJ0YGAsIHJhaXNlIGEgOmV4YzpgVHlwZUVycm9yYC4gSWYKLSAgICAgICpjb250ZW50X21hbmFnZXIqIGlzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgYGBjb250ZW50X21hbmFnZXJgYCBzcGVjaWZpZWQKLSAgICAgIGJ5IHRoZSBjdXJyZW50IDptb2Q6YH5lbWFpbC5wb2xpY3lgLgotCi0KLSAgIC4uIG1ldGhvZDo6IGFkZF9hdHRhY2htZW50KCphcmdzLCBjb250ZW50X21hbmFnZXI9Tm9uZSwgKiprdykKLQotICAgICAgSWYgdGhlIG1lc3NhZ2UgaXMgYSBgYG11bHRpcGFydC9taXhlZGBgLCBjcmVhdGUgYSBuZXcgbWVzc2FnZSBvYmplY3QsCi0gICAgICBwYXNzIGFsbCBvZiB0aGUgYXJndW1lbnRzIHRvIGl0cyA6bWV0aDpgc2V0X2NvbnRlbnRgIG1ldGhvZCwgYW5kCi0gICAgICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5hdHRhY2hgIGl0IHRvIHRoZSBgYG11bHRpcGFydGBgLiAgSWYgdGhlCi0gICAgICBtZXNzYWdlIGlzIGEgbm9uLWBgbXVsdGlwYXJ0YGAsIGBgbXVsdGlwYXJ0L3JlbGF0ZWRgYCwgb3IKLSAgICAgIGBgbXVsdGlwYXJ0L2FsdGVybmF0aXZlYGAsIGNhbGwgOm1ldGg6YG1ha2VfbWl4ZWRgIGFuZCB0aGVuIHByb2NlZWQgYXMKLSAgICAgIGFib3ZlLiBJZiAqY29udGVudF9tYW5hZ2VyKiBpcyBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGBgY29udGVudF9tYW5hZ2VyYGAKLSAgICAgIHNwZWNpZmllZCBieSB0aGUgY3VycmVudCA6bW9kOmB+ZW1haWwucG9saWN5YC4gIElmIHRoZSBhZGRlZCBwYXJ0Ci0gICAgICBoYXMgbm8gOm1haWxoZWFkZXI6YENvbnRlbnQtRGlzcG9zaXRpb25gIGhlYWRlciwgYWRkIG9uZSB3aXRoIHRoZSB2YWx1ZQotICAgICAgYGBhdHRhY2htZW50YGAuICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBib3RoIGZvciBleHBsaWNpdCBhdHRhY2htZW50cwotICAgICAgKDptYWlsaGVhZGVyOmBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50YCBhbmQgYGBpbmxpbmVgYCBhdHRhY2htZW50cwotICAgICAgKDptYWlsaGVhZGVyOmBDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmVgKSwgYnkgcGFzc2luZyBhcHByb3ByaWF0ZQotICAgICAgb3B0aW9ucyB0byB0aGUgYGBjb250ZW50X21hbmFnZXJgYC4KLQotCi0gICAuLiBtZXRob2Q6OiBjbGVhcigpCi0KLSAgICAgIFJlbW92ZSB0aGUgcGF5bG9hZCBhbmQgYWxsIG9mIHRoZSBoZWFkZXJzLgotCi0KLSAgIC4uIG1ldGhvZDo6IGNsZWFyX2NvbnRlbnQoKQotCi0gICAgICBSZW1vdmUgdGhlIHBheWxvYWQgYW5kIGFsbCBvZiB0aGUgOmV4YzpgQ29udGVudC1gIGhlYWRlcnMsIGxlYXZpbmcKLSAgICAgIGFsbCBvdGhlciBoZWFkZXJzIGludGFjdCBhbmQgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuCi0KLQotLi4gY2xhc3M6OiBNSU1FUGFydChwb2xpY3k9ZGVmYXVsdCkKLQotICAgIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHN1YnBhcnQgb2YgYSBNSU1FIG1lc3NhZ2UuICBJdCBpcyBpZGVudGljYWwgdG8KLSAgICA6Y2xhc3M6YEVtYWlsTWVzc2FnZWAsIGV4Y2VwdCB0aGF0IG5vIDptYWlsaGVhZGVyOmBNSU1FLVZlcnNpb25gIGhlYWRlcnMgYXJlCi0gICAgYWRkZWQgd2hlbiA6bWV0aDpgfkVtYWlsTWVzc2FnZS5zZXRfY29udGVudGAgaXMgY2FsbGVkLCBzaW5jZSBzdWItcGFydHMgZG8KLSAgICBub3QgbmVlZCB0aGVpciBvd24gOm1haWxoZWFkZXI6YE1JTUUtVmVyc2lvbmAgaGVhZGVycy4KLQorLi4gdmVyc2lvbmFkZGVkOjogMy42IFsxXV8KIAotLi4gY3VycmVudG1vZHVsZTo6IGVtYWlsLmNvbnRlbnRtYW5hZ2VyCiAKIC4uIGNsYXNzOjogQ29udGVudE1hbmFnZXIoKQogCkBAIC0zNjIsNyArMTIzLDcgQEAKICAgICAgICAgICAgICAgIHNldF9jb250ZW50KG1zZywgPCdieXRlcyc+LCBtYWludHlwZSwgc3VidHlwZSwgY3RlPSJiYXNlNjQiLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvbj1Ob25lLCBmaWxlbmFtZT1Ob25lLCBjaWQ9Tm9uZSwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zPU5vbmUsIGhlYWRlcnM9Tm9uZSkKLSAgICAgICAgICAgICAgIHNldF9jb250ZW50KG1zZywgPCdNZXNzYWdlJz4sIGN0ZT1Ob25lLCBcCisgICAgICAgICAgICAgICBzZXRfY29udGVudChtc2csIDwnRW1haWxNZXNzYWdlJz4sIGN0ZT1Ob25lLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvbj1Ob25lLCBmaWxlbmFtZT1Ob25lLCBjaWQ9Tm9uZSwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zPU5vbmUsIGhlYWRlcnM9Tm9uZSkKICAgICAgICAgICAgICAgIHNldF9jb250ZW50KG1zZywgPCdsaXN0Jz4sIHN1YnR5cGU9J21peGVkJywgXApAQCAtMzc4LDE0ICsxMzksMTQgQEAKICAgICAgICAgICAgICBzdWJ0eXBlIHRvICpzdWJ0eXBlKiBpZiBpdCBpcyBzcGVjaWZpZWQsIG9yIGBgcGxhaW5gYCBpZiBpdCBpcyBub3QuCiAgICAgICAgICAgICogRm9yIGBgYnl0ZXNgYCwgdXNlIHRoZSBzcGVjaWZpZWQgKm1haW50eXBlKiBhbmQgKnN1YnR5cGUqLCBvcgogICAgICAgICAgICAgIHJhaXNlIGEgOmV4YzpgVHlwZUVycm9yYCBpZiB0aGV5IGFyZSBub3Qgc3BlY2lmaWVkLgotICAgICAgICAgICAqIEZvciA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIG9iamVjdHMsIHNldCB0aGUgbWFpbnR5cGUgdG8KLSAgICAgICAgICAgICBgYG1lc3NhZ2VgYCwgYW5kIHNldCB0aGUgc3VidHlwZSB0byAqc3VidHlwZSogaWYgaXQgaXMgc3BlY2lmaWVkCi0gICAgICAgICAgICAgb3IgYGByZmM4MjJgYCBpZiBpdCBpcyBub3QuICBJZiAqc3VidHlwZSogaXMgYGBwYXJ0aWFsYGAsIHJhaXNlIGFuCi0gICAgICAgICAgICAgZXJyb3IgKGBgYnl0ZXNgYCBvYmplY3RzIG11c3QgYmUgdXNlZCB0byBjb25zdHJ1Y3QKLSAgICAgICAgICAgICBgYG1lc3NhZ2UvcGFydGlhbGBgIHBhcnRzKS4KKyAgICAgICAgICAgKiBGb3IgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgIG9iamVjdHMsIHNldCB0aGUgbWFpbnR5cGUKKyAgICAgICAgICAgICB0byBgYG1lc3NhZ2VgYCwgYW5kIHNldCB0aGUgc3VidHlwZSB0byAqc3VidHlwZSogaWYgaXQgaXMKKyAgICAgICAgICAgICBzcGVjaWZpZWQgb3IgYGByZmM4MjJgYCBpZiBpdCBpcyBub3QuICBJZiAqc3VidHlwZSogaXMKKyAgICAgICAgICAgICBgYHBhcnRpYWxgYCwgcmFpc2UgYW4gZXJyb3IgKGBgYnl0ZXNgYCBvYmplY3RzIG11c3QgYmUgdXNlZCB0bworICAgICAgICAgICAgIGNvbnN0cnVjdCBgYG1lc3NhZ2UvcGFydGlhbGBgIHBhcnRzKS4KICAgICAgICAgICAgKiBGb3IgKjwnbGlzdCc+Kiwgd2hpY2ggc2hvdWxkIGJlIGEgbGlzdCBvZgotICAgICAgICAgICAgIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgb2JqZWN0cywgc2V0IHRoZSBgYG1haW50eXBlYGAgdG8KLSAgICAgICAgICAgICBgYG11bHRpcGFydGBgLCBhbmQgdGhlIGBgc3VidHlwZWBgIHRvICpzdWJ0eXBlKiBpZiBpdCBpcworICAgICAgICAgICAgIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlYCBvYmplY3RzLCBzZXQgdGhlIGBgbWFpbnR5cGVgYAorICAgICAgICAgICAgIHRvIGBgbXVsdGlwYXJ0YGAsIGFuZCB0aGUgYGBzdWJ0eXBlYGAgdG8gKnN1YnR5cGUqIGlmIGl0IGlzCiAgICAgICAgICAgICAgc3BlY2lmaWVkLCBhbmQgYGBtaXhlZGBgIGlmIGl0IGlzIG5vdC4gIElmIHRoZSBtZXNzYWdlIHBhcnRzIGluCiAgICAgICAgICAgICAgdGhlICo8J2xpc3QnPiogaGF2ZSA6bWFpbGhlYWRlcjpgTUlNRS1WZXJzaW9uYCBoZWFkZXJzLCByZW1vdmUKICAgICAgICAgICAgICB0aGVtLgpAQCAtMzk3LDMyICsxNTgsMzUgQEAKIAogICAgICAgIElmICpjdGUqIGlzIHNldCwgZW5jb2RlIHRoZSBwYXlsb2FkIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29udGVudCB0cmFuc2ZlcgogICAgICAgIGVuY29kaW5nLCBhbmQgc2V0IHRoZSA6bWFpbGhlYWRlcjpgQ29udGVudC1UcmFuc2Zlci1FbmRjb2RpbmdgIGhlYWRlciB0bwotICAgICAgIHRoYXQgdmFsdWUuICBGb3IgYGBzdHJgYCBvYmplY3RzLCBpZiBpdCBpcyBub3Qgc2V0IHVzZSBoZXVyaXN0aWNzIHRvCi0gICAgICAgZGV0ZXJtaW5lIHRoZSBtb3N0IGNvbXBhY3QgZW5jb2RpbmcuICBQb3NzaWJsZSB2YWx1ZXMgZm9yICpjdGUqIGFyZQotICAgICAgIGBgcXVvdGVkLXByaW50YWJsZWBgLCBgYGJhc2U2NGBgLCBgYDdiaXRgYCwgYGA4Yml0YGAsIGFuZCBgYGJpbmFyeWBgLgotICAgICAgIElmIHRoZSBpbnB1dCBjYW5ub3QgYmUgZW5jb2RlZCBpbiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIChlZzogYGA3Yml0YGApLAotICAgICAgIHJhaXNlIGEgOmV4YzpgVmFsdWVFcnJvcmAuICBGb3IgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCwgcGVyCi0gICAgICAgOnJmYzpgMjA0NmAsIHJhaXNlIGFuIGVycm9yIGlmIGEgKmN0ZSogb2YgYGBxdW90ZWQtcHJpbnRhYmxlYGAgb3IKLSAgICAgICBgYGJhc2U2NGBgIGlzIHJlcXVlc3RlZCBmb3IgKnN1YnR5cGUqIGBgcmZjODIyYGAsIGFuZCBmb3IgYW55ICpjdGUqCi0gICAgICAgb3RoZXIgdGhhbiBgYDdiaXRgYCBmb3IgKnN1YnR5cGUqIGBgZXh0ZXJuYWwtYm9keWBgLiAgRm9yCi0gICAgICAgYGBtZXNzYWdlL3JmYzgyMmBgLCB1c2UgYGA4Yml0YGAgaWYgKmN0ZSogaXMgbm90IHNwZWNpZmllZC4gIEZvciBhbGwKLSAgICAgICBvdGhlciB2YWx1ZXMgb2YgKnN1YnR5cGUqLCB1c2UgYGA3Yml0YGAuCisgICAgICAgdGhhdCB2YWx1ZS4gIFBvc3NpYmxlIHZhbHVlcyBmb3IgKmN0ZSogYXJlIGBgcXVvdGVkLXByaW50YWJsZWBgLAorICAgICAgIGBgYmFzZTY0YGAsIGBgN2JpdGBgLCBgYDhiaXRgYCwgYW5kIGBgYmluYXJ5YGAuICBJZiB0aGUgaW5wdXQgY2Fubm90IGJlCisgICAgICAgZW5jb2RlZCBpbiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIChmb3IgZXhhbXBsZSwgc3BlY2lmeWluZyBhICpjdGUqIG9mCisgICAgICAgYGA3Yml0YGAgZm9yIGFuIGlucHV0IHRoYXQgY29udGFpbnMgbm9uLUFTQ0lJIHZhbHVlcyksIHJhaXNlIGEKKyAgICAgICA6ZXhjOmBWYWx1ZUVycm9yYC4KKworICAgICAgICAgICAgKiBGb3IgYGBzdHJgYCBvYmplY3RzLCBpZiAqY3RlKiBpcyBub3Qgc2V0IHVzZSBoZXVyaXN0aWNzIHRvCisgICAgICAgICAgICAgIGRldGVybWluZSB0aGUgbW9zdCBjb21wYWN0IGVuY29kaW5nLgorICAgICAgICAgICAgKiBGb3IgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgLCBwZXIgOnJmYzpgMjA0NmAsIHJhaXNlCisgICAgICAgICAgICAgIGFuIGVycm9yIGlmIGEgKmN0ZSogb2YgYGBxdW90ZWQtcHJpbnRhYmxlYGAgb3IgYGBiYXNlNjRgYCBpcworICAgICAgICAgICAgICByZXF1ZXN0ZWQgZm9yICpzdWJ0eXBlKiBgYHJmYzgyMmBgLCBhbmQgZm9yIGFueSAqY3RlKiBvdGhlciB0aGFuCisgICAgICAgICAgICAgIGBgN2JpdGBgIGZvciAqc3VidHlwZSogYGBleHRlcm5hbC1ib2R5YGAuICBGb3IKKyAgICAgICAgICAgICAgYGBtZXNzYWdlL3JmYzgyMmBgLCB1c2UgYGA4Yml0YGAgaWYgKmN0ZSogaXMgbm90IHNwZWNpZmllZC4gIEZvcgorICAgICAgICAgICAgICBhbGwgb3RoZXIgdmFsdWVzIG9mICpzdWJ0eXBlKiwgdXNlIGBgN2JpdGBgLgogCiAgICAgICAgLi4gbm90ZTo6IEEgKmN0ZSogb2YgYGBiaW5hcnlgYCBkb2VzIG5vdCBhY3R1YWxseSB3b3JrIGNvcnJlY3RseSB5ZXQuCi0gICAgICAgICAgVGhlIGBgTWVzc2FnZWBgIG9iamVjdCBhcyBtb2RpZmllZCBieSBgYHNldF9jb250ZW50YGAgaXMgY29ycmVjdCwgYnV0Ci0gICAgICAgICAgOmNsYXNzOmB+ZW1haWwuZ2VuZXJhdG9yLkJ5dGVzR2VuZXJhdG9yYCBkb2VzIG5vdCBzZXJpYWxpemUgaXQKLSAgICAgICAgICBjb3JyZWN0bHkuCisgICAgICAgICAgVGhlIGBgRW1haWxNZXNzYWdlYGAgb2JqZWN0IGFzIG1vZGlmaWVkIGJ5IGBgc2V0X2NvbnRlbnRgYCBpcworICAgICAgICAgIGNvcnJlY3QsIGJ1dCA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuQnl0ZXNHZW5lcmF0b3JgIGRvZXMgbm90CisgICAgICAgICAgc2VyaWFsaXplIGl0IGNvcnJlY3RseS4KIAogICAgICAgIElmICpkaXNwb3NpdGlvbiogaXMgc2V0LCB1c2UgaXQgYXMgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LURpc3Bvc2l0aW9uYCBoZWFkZXIuICBJZiBub3Qgc3BlY2lmaWVkLCBhbmQKICAgICAgICAqZmlsZW5hbWUqIGlzIHNwZWNpZmllZCwgYWRkIHRoZSBoZWFkZXIgd2l0aCB0aGUgdmFsdWUgYGBhdHRhY2htZW50YGAuCi0gICAgICAgSWYgaXQgaXMgbm90IHNwZWNpZmllZCBhbmQgKmZpbGVuYW1lKiBpcyBhbHNvIG5vdCBzcGVjaWZpZWQsIGRvIG5vdCBhZGQKLSAgICAgICB0aGUgaGVhZGVyLiAgVGhlIG9ubHkgdmFsaWQgdmFsdWVzIGZvciAqZGlzcG9zaXRpb24qIGFyZSBgYGF0dGFjaG1lbnRgYAotICAgICAgIGFuZCBgYGlubGluZWBgLgorICAgICAgIElmICpkaXNwb3NpdGlvbiogaXMgbm90IHNwZWNpZmllZCBhbmQgKmZpbGVuYW1lKiBpcyBhbHNvIG5vdCBzcGVjaWZpZWQsCisgICAgICAgZG8gbm90IGFkZCB0aGUgaGVhZGVyLiAgVGhlIG9ubHkgdmFsaWQgdmFsdWVzIGZvciAqZGlzcG9zaXRpb24qIGFyZQorICAgICAgIGBgYXR0YWNobWVudGBgIGFuZCBgYGlubGluZWBgLgogCiAgICAgICAgSWYgKmZpbGVuYW1lKiBpcyBzcGVjaWZpZWQsIHVzZSBpdCBhcyB0aGUgdmFsdWUgb2YgdGhlIGBgZmlsZW5hbWVgYAotICAgICAgIHBhcmFtZXRlciBvZiB0aGUgOm1haWxoZWFkZXI6YENvbnRlbnQtRGlzcG9zaXRpb25gIGhlYWRlci4gIFRoZXJlIGlzIG5vCi0gICAgICAgZGVmYXVsdC4KKyAgICAgICBwYXJhbWV0ZXIgb2YgdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LURpc3Bvc2l0aW9uYCBoZWFkZXIuCiAKICAgICAgICBJZiAqY2lkKiBpcyBzcGVjaWZpZWQsIGFkZCBhIDptYWlsaGVhZGVyOmBDb250ZW50LUlEYCBoZWFkZXIgd2l0aAogICAgICAgICpjaWQqIGFzIGl0cyB2YWx1ZS4KQEAgLTQzNSwzICsxOTksOSBAQAogICAgICAgIGBgaGVhZGVybmFtZTogaGVhZGVydmFsdWVgYCBvciBhIGxpc3Qgb2YgYGBoZWFkZXJgYCBvYmplY3RzCiAgICAgICAgKGRpc3Rpbmd1aXNoZWQgZnJvbSBzdHJpbmdzIGJ5IGhhdmluZyBhIGBgbmFtZWBgIGF0dHJpYnV0ZSksIGFkZCB0aGUKICAgICAgICBoZWFkZXJzIHRvICptc2cqLgorCisKKy4uIHJ1YnJpYzo6IEZvb3Rub3RlcworCisuLiBbMV0gT3JpbmdhbGx5IGFkZGVkIGluIDMuNCBhcyBhIDp0ZXJtOmBwcm92aXNpb25hbCBtb2R1bGUgPHByb3Zpc2lvbmFsCisgICAgICAgcGFja2FnZT5gCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9lbWFpbC5lbmNvZGVycy5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC5lbmNvZGVycy5yc3QKaW5kZXggOWQ3ZjliZi4uZTI0YWM3YiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwuZW5jb2RlcnMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2VtYWlsLmVuY29kZXJzLnJzdApAQCAtOCw2ICs4LDEyIEBACiAKIC0tLS0tLS0tLS0tLS0tCiAKK1RoaXMgbW9kdWxlIGlzIHBhcnQgb2YgdGhlIGxlZ2FjeSAoYGBDb21wYXQzMmBgKSBlbWFpbCBBUEkuICBJbiB0aGUKK25ldyBBUEkgdGhlIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgYnkgdGhlICpjdGUqIHBhcmFtZXRlciBvZgordGhlIDptZXRoOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2Uuc2V0X2NvbnRlbnRgIG1ldGhvZC4KKworVGhlIHJlbWFpbmluZyB0ZXh0IGluIHRoaXMgc2VjdGlvbiBpcyB0aGUgb3JpZ2luYWwgZG9jdW1lbnRhdGlvbiBvZiB0aGUgbW9kdWxlLgorCiBXaGVuIGNyZWF0aW5nIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgb2JqZWN0cyBmcm9tIHNjcmF0Y2gsIHlvdSBvZnRlbgogbmVlZCB0byBlbmNvZGUgdGhlIHBheWxvYWRzIGZvciB0cmFuc3BvcnQgdGhyb3VnaCBjb21wbGlhbnQgbWFpbCBzZXJ2ZXJzLiBUaGlzCiBpcyBlc3BlY2lhbGx5IHRydWUgZm9yIDptaW1ldHlwZTpgaW1hZ2UvXCpgIGFuZCA6bWltZXR5cGU6YHRleHQvXCpgIHR5cGUgbWVzc2FnZXMKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2VtYWlsLmVycm9ycy5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC5lcnJvcnMucnN0CmluZGV4IDg0NzA3ODMuLjJkMGQxOTIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2VtYWlsLmVycm9ycy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZW1haWwuZXJyb3JzLnJzdApAQCAtMjAsMzMgKzIwLDI3IEBACiAKIC4uIGV4Y2VwdGlvbjo6IE1lc3NhZ2VQYXJzZUVycm9yKCkKIAotICAgVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgZXhjZXB0aW9ucyByYWlzZWQgYnkgdGhlIDpjbGFzczpgfmVtYWlsLnBhcnNlci5QYXJzZXJgCi0gICBjbGFzcy4gIEl0IGlzIGRlcml2ZWQgZnJvbSA6ZXhjOmBNZXNzYWdlRXJyb3JgLgorICAgVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgZXhjZXB0aW9ucyByYWlzZWQgYnkgdGhlCisgICA6Y2xhc3M6YH5lbWFpbC5wYXJzZXIuUGFyc2VyYCBjbGFzcy4gIEl0IGlzIGRlcml2ZWQgZnJvbQorICAgOmV4YzpgTWVzc2FnZUVycm9yYC4gIFRoaXMgY2xhc3MgaXMgYWxzbyB1c2VkIGludGVybmFsbHkgYnkgdGhlIHBhcnNlciB1c2VkCisgICBieSA6bW9kOmB+ZW1haWwuaGVhZGVycmVnaXN0cnlgLgogCiAKIC4uIGV4Y2VwdGlvbjo6IEhlYWRlclBhcnNlRXJyb3IoKQogCi0gICBSYWlzZWQgdW5kZXIgc29tZSBlcnJvciBjb25kaXRpb25zIHdoZW4gcGFyc2luZyB0aGUgOnJmYzpgMjgyMmAgaGVhZGVycyBvZiBhCi0gICBtZXNzYWdlLCB0aGlzIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSA6ZXhjOmBNZXNzYWdlUGFyc2VFcnJvcmAuIEl0IGNhbiBiZSByYWlzZWQKLSAgIGZyb20gdGhlIDptZXRoOmBQYXJzZXIucGFyc2UgPGVtYWlsLnBhcnNlci5QYXJzZXIucGFyc2U+YCBvcgotICAgOm1ldGg6YFBhcnNlci5wYXJzZXN0ciA8ZW1haWwucGFyc2VyLlBhcnNlci5wYXJzZXN0cj5gIG1ldGhvZHMuCi0KLSAgIFNpdHVhdGlvbnMgd2hlcmUgaXQgY2FuIGJlIHJhaXNlZCBpbmNsdWRlIGZpbmRpbmcgYW4gZW52ZWxvcGUgaGVhZGVyIGFmdGVyIHRoZQotICAgZmlyc3QgOnJmYzpgMjgyMmAgaGVhZGVyIG9mIHRoZSBtZXNzYWdlLCBmaW5kaW5nIGEgY29udGludWF0aW9uIGxpbmUgYmVmb3JlIHRoZQotICAgZmlyc3QgOnJmYzpgMjgyMmAgaGVhZGVyIGlzIGZvdW5kLCBvciBmaW5kaW5nIGEgbGluZSBpbiB0aGUgaGVhZGVycyB3aGljaCBpcwotICAgbmVpdGhlciBhIGhlYWRlciBvciBhIGNvbnRpbnVhdGlvbiBsaW5lLgorICAgUmFpc2VkIHVuZGVyIHNvbWUgZXJyb3IgY29uZGl0aW9ucyB3aGVuIHBhcnNpbmcgdGhlIDpyZmM6YDUzMjJgIGhlYWRlcnMgb2YgYQorICAgbWVzc2FnZSwgdGhpcyBjbGFzcyBpcyBkZXJpdmVkIGZyb20gOmV4YzpgTWVzc2FnZVBhcnNlRXJyb3JgLiAgVGhlCisgICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLnNldF9ib3VuZGFyeWAgbWV0aG9kIHdpbGwgcmFpc2UgdGhpcworICAgZXJyb3IgaWYgdGhlIGNvbnRlbnQgdHlwZSBpcyB1bmtub3duIHdoZW4gdGhlIG1ldGhvZCBpcyBjYWxsZWQuCisgICA6Y2xhc3M6YH5lbWFpbC5oZWFkZXIuSGVhZGVyYCBtYXkgcmFpc2UgdGhpcyBlcnJvciBmb3IgY2VydGFpbiBiYXNlNjQKKyAgIGRlY29kaW5nIGVycm9ycywgYW5kIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGNyZWF0ZSBhIGhlYWRlciB0aGF0IGFwcGVhcnMKKyAgIHRvIGNvbnRhaW4gYW4gZW1iZWRkZWQgaGVhZGVyICh0aGF0IGlzLCB0aGVyZSBpcyB3aGF0IGlzIHN1cHBvc2VkIHRvIGJlIGEKKyAgIGNvbnRpbnVhdGlvbiBsaW5lIHRoYXQgaGFzIG5vIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgbG9va3MgbGlrZSBhIGhlYWRlcikuCiAKIAogLi4gZXhjZXB0aW9uOjogQm91bmRhcnlFcnJvcigpCiAKLSAgIFJhaXNlZCB1bmRlciBzb21lIGVycm9yIGNvbmRpdGlvbnMgd2hlbiBwYXJzaW5nIHRoZSA6cmZjOmAyODIyYCBoZWFkZXJzIG9mIGEKLSAgIG1lc3NhZ2UsIHRoaXMgY2xhc3MgaXMgZGVyaXZlZCBmcm9tIDpleGM6YE1lc3NhZ2VQYXJzZUVycm9yYC4gSXQgY2FuIGJlIHJhaXNlZAotICAgZnJvbSB0aGUgOm1ldGg6YFBhcnNlci5wYXJzZSA8ZW1haWwucGFyc2VyLlBhcnNlci5wYXJzZT5gIG9yCi0gICA6bWV0aDpgUGFyc2VyLnBhcnNlc3RyIDxlbWFpbC5wYXJzZXIuUGFyc2VyLnBhcnNlc3RyPmAgbWV0aG9kcy4KLQotICAgU2l0dWF0aW9ucyB3aGVyZSBpdCBjYW4gYmUgcmFpc2VkIGluY2x1ZGUgbm90IGJlaW5nIGFibGUgdG8gZmluZCB0aGUgc3RhcnRpbmcgb3IKLSAgIHRlcm1pbmF0aW5nIGJvdW5kYXJ5IGluIGEgOm1pbWV0eXBlOmBtdWx0aXBhcnQvXCpgIG1lc3NhZ2Ugd2hlbiBzdHJpY3QgcGFyc2luZwotICAgaXMgdXNlZC4KKyAgIERlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciB1c2VkLgogCiAKIC4uIGV4Y2VwdGlvbjo6IE11bHRpcGFydENvbnZlcnNpb25FcnJvcigpCkBAIC02NCwxNCArNTgsMTQgQEAKICAgIDpjbGFzczpgfmVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0Lk1JTUVOb25NdWx0aXBhcnRgIChlLmcuCiAgICA6Y2xhc3M6YH5lbWFpbC5taW1lLmltYWdlLk1JTUVJbWFnZWApLgogCi1IZXJlJ3MgdGhlIGxpc3Qgb2YgdGhlIGRlZmVjdHMgdGhhdCB0aGUgOmNsYXNzOmB+ZW1haWwucGFyc2VyLkZlZWRQYXJzZXJgCisKK0hlcmUgaXMgdGhlIGxpc3Qgb2YgdGhlIGRlZmVjdHMgdGhhdCB0aGUgOmNsYXNzOmB+ZW1haWwucGFyc2VyLkZlZWRQYXJzZXJgCiBjYW4gZmluZCB3aGlsZSBwYXJzaW5nIG1lc3NhZ2VzLiAgTm90ZSB0aGF0IHRoZSBkZWZlY3RzIGFyZSBhZGRlZCB0byB0aGUgbWVzc2FnZQogd2hlcmUgdGhlIHByb2JsZW0gd2FzIGZvdW5kLCBzbyBmb3IgZXhhbXBsZSwgaWYgYSBtZXNzYWdlIG5lc3RlZCBpbnNpZGUgYQogOm1pbWV0eXBlOmBtdWx0aXBhcnQvYWx0ZXJuYXRpdmVgIGhhZCBhIG1hbGZvcm1lZCBoZWFkZXIsIHRoYXQgbmVzdGVkIG1lc3NhZ2UKIG9iamVjdCB3b3VsZCBoYXZlIGEgZGVmZWN0LCBidXQgdGhlIGNvbnRhaW5pbmcgbWVzc2FnZXMgd291bGQgbm90LgogCi1BbGwgZGVmZWN0IGNsYXNzZXMgYXJlIHN1YmNsYXNzZWQgZnJvbSA6Y2xhc3M6YGVtYWlsLmVycm9ycy5NZXNzYWdlRGVmZWN0YCwgYnV0Ci10aGlzIGNsYXNzIGlzICpub3QqIGFuIGV4Y2VwdGlvbiEKK0FsbCBkZWZlY3QgY2xhc3NlcyBhcmUgc3ViY2xhc3NlZCBmcm9tIDpjbGFzczpgZW1haWwuZXJyb3JzLk1lc3NhZ2VEZWZlY3RgLgogCiAqIDpjbGFzczpgTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0YCAtLSBBIG1lc3NhZ2UgY2xhaW1lZCB0byBiZSBhIG11bHRpcGFydCwKICAgYnV0IGhhZCBubyA6bWltZXR5cGU6YGJvdW5kYXJ5YCBwYXJhbWV0ZXIuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9lbWFpbC5leGFtcGxlcy5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC5leGFtcGxlcy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlOWFlZQotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWJyYXJ5L2VtYWlsLmV4YW1wbGVzLnJzdApAQCAtMCwwICsxLDY3IEBACisuLiBfZW1haWwtZXhhbXBsZXM6CisKKzptb2Q6YGVtYWlsYDogRXhhbXBsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSGVyZSBhcmUgYSBmZXcgZXhhbXBsZXMgb2YgaG93IHRvIHVzZSB0aGUgOm1vZDpgZW1haWxgIHBhY2thZ2UgdG8gcmVhZCwgd3JpdGUsCithbmQgc2VuZCBzaW1wbGUgZW1haWwgbWVzc2FnZXMsIGFzIHdlbGwgYXMgbW9yZSBjb21wbGV4IE1JTUUgbWVzc2FnZXMuCisKK0ZpcnN0LCBsZXQncyBzZWUgaG93IHRvIGNyZWF0ZSBhbmQgc2VuZCBhIHNpbXBsZSB0ZXh0IG1lc3NhZ2UgKGJvdGggdGhlCit0ZXh0IGNvbnRlbnQgYW5kIHRoZSBhZGRyZXNzZXMgbWF5IGNvbnRhaW4gdW5pY29kZSBjaGFyYWN0ZXJzKToKKworLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9lbWFpbC1zaW1wbGUucHkKKworCitQYXJzaW5nIFJGQzgyMiBoZWFkZXJzIGNhbiBlYXNpbHkgYmUgZG9uZSBieSB0aGUgdXNpbmcgdGhlIGNsYXNzZXMKK2Zyb20gdGhlIDptb2Q6YH5lbWFpbC5wYXJzZXJgIG1vZHVsZToKKworLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9lbWFpbC1oZWFkZXJzLnB5CisKKworSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHNlbmQgYSBNSU1FIG1lc3NhZ2UgY29udGFpbmluZyBhIGJ1bmNoIG9mIGZhbWlseQorcGljdHVyZXMgdGhhdCBtYXkgYmUgcmVzaWRpbmcgaW4gYSBkaXJlY3Rvcnk6CisKKy4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvZW1haWwtbWltZS5weQorCisKK0hlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB0byBzZW5kIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYSBkaXJlY3RvcnkgYXMgYW4gZW1haWwKK21lc3NhZ2U6IFsxXV8KKworLi4gbGl0ZXJhbGluY2x1ZGU6OiAuLi9pbmNsdWRlcy9lbWFpbC1kaXIucHkKKworCitIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gdW5wYWNrIGEgTUlNRSBtZXNzYWdlIGxpa2UgdGhlIG9uZQorYWJvdmUsIGludG8gYSBkaXJlY3Rvcnkgb2YgZmlsZXM6CisKKy4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvZW1haWwtdW5wYWNrLnB5CisKKworSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBhbiBIVE1MIG1lc3NhZ2Ugd2l0aCBhbiBhbHRlcm5hdGl2ZSBwbGFpbgordGV4dCB2ZXJzaW9uLiAgVG8gbWFrZSB0aGluZ3MgYSBiaXQgbW9yZSBpbnRlcmVzdGluZywgd2UgaW5jbHVkZSBhIHJlbGF0ZWQKK2ltYWdlIGluIHRoZSBodG1sIHBhcnQsIGFuZCB3ZSBzYXZlIGEgY29weSBvZiB3aGF0IHdlIGFyZSBnb2luZyB0byBzZW5kIHRvCitkaXNrLCBhcyB3ZWxsIGFzIHNlbmRpbmcgaXQuCisKKy4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvZW1haWwtYWx0ZXJuYXRpdmUucHkKKworCitJZiB3ZSB3ZXJlIHNlbnQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgbGFzdCBleGFtcGxlLCBoZXJlIGlzIG9uZSB3YXkgd2UgY291bGQKK3Byb2Nlc3MgaXQ6CisKKy4uIGxpdGVyYWxpbmNsdWRlOjogLi4vaW5jbHVkZXMvZW1haWwtcmVhZC1hbHRlcm5hdGl2ZS5weQorCitVcCB0byB0aGUgcHJvbXB0LCB0aGUgb3V0cHV0IGZyb20gdGhlIGFib3ZlIGlzOgorCisuLiBjb2RlLWJsb2NrOjogbm9uZQorCisgICAgVG86IFBlbmVsb3BlIFB1c3N5Y2F0IDxwZW5lbG9wZUBleGFtcGxlLmNvbT4sIEZhYnJldHRlIFB1c3N5Y2F0IDxmYWJyZXR0ZUBleGFtcGxlLmNvbT4KKyAgICBGcm9tOiBQZXDDqSBMZSBQZXcgPHBlcGVAZXhhbXBsZS5jb20+CisgICAgU3ViamVjdDogQXlvbnMgYXNwZXJnZXMgcG91ciBsZSBkw6lqZXVuZXIKKworICAgIFNhbHV0IQorCisgICAgQ2VsYSByZXNzZW1ibGUgw6AgdW4gZXhjZWxsZW50IHJlY2lwaWVbMV0gZMOpamV1bmVyLgorCisKKy4uIHJ1YnJpYzo6IEZvb3Rub3RlcworCisuLiBbMV0gVGhhbmtzIHRvIE1hdHRoZXcgRGl4b24gQ293bGVzIGZvciB0aGUgb3JpZ2luYWwgaW5zcGlyYXRpb24gYW5kIGV4YW1wbGVzLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwuZ2VuZXJhdG9yLnJzdCBiL0RvYy9saWJyYXJ5L2VtYWlsLmdlbmVyYXRvci5yc3QKaW5kZXggZDU5NmVkOC4uYWIwZmJjMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwuZ2VuZXJhdG9yLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC5nZW5lcmF0b3IucnN0CkBAIC04LDIxMCArOCwyNDQgQEAKIAogLS0tLS0tLS0tLS0tLS0KIAotT25lIG9mIHRoZSBtb3N0IGNvbW1vbiB0YXNrcyBpcyB0byBnZW5lcmF0ZSB0aGUgZmxhdCB0ZXh0IG9mIHRoZSBlbWFpbCBtZXNzYWdlCi1yZXByZXNlbnRlZCBieSBhIG1lc3NhZ2Ugb2JqZWN0IHN0cnVjdHVyZS4gIFlvdSB3aWxsIG5lZWQgdG8gZG8gdGhpcyBpZiB5b3Ugd2FudAotdG8gc2VuZCB5b3VyIG1lc3NhZ2UgdmlhIHRoZSA6bW9kOmBzbXRwbGliYCBtb2R1bGUgb3IgdGhlIDptb2Q6YG5udHBsaWJgIG1vZHVsZSwKLW9yIHByaW50IHRoZSBtZXNzYWdlIG9uIHRoZSBjb25zb2xlLiAgVGFraW5nIGEgbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlIGFuZAotcHJvZHVjaW5nIGEgZmxhdCB0ZXh0IGRvY3VtZW50IGlzIHRoZSBqb2Igb2YgdGhlIDpjbGFzczpgR2VuZXJhdG9yYCBjbGFzcy4KK09uZSBvZiB0aGUgbW9zdCBjb21tb24gdGFza3MgaXMgdG8gZ2VuZXJhdGUgdGhlIGZsYXQgKHNlcmlhbGl6ZWQpIHZlcnNpb24gb2YKK3RoZSBlbWFpbCBtZXNzYWdlIHJlcHJlc2VudGVkIGJ5IGEgbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlLiAgWW91IHdpbGwgbmVlZCB0bworZG8gdGhpcyBpZiB5b3Ugd2FudCB0byBzZW5kIHlvdXIgbWVzc2FnZSB2aWEgOm1ldGg6YHNtdHBsaWIuU01UUC5zZW5kbWFpbGAgb3IKK3RoZSA6bW9kOmBubnRwbGliYCBtb2R1bGUsIG9yIHByaW50IHRoZSBtZXNzYWdlIG9uIHRoZSBjb25zb2xlLiAgVGFraW5nIGEKK21lc3NhZ2Ugb2JqZWN0IHN0cnVjdHVyZSBhbmQgcHJvZHVjaW5nIGEgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBpcyB0aGUgam9iCitvZiB0aGUgZ2VuZXJhdG9yIGNsYXNzZXMuCiAKLUFnYWluLCBhcyB3aXRoIHRoZSA6bW9kOmBlbWFpbC5wYXJzZXJgIG1vZHVsZSwgeW91IGFyZW4ndCBsaW1pdGVkIHRvIHRoZQotZnVuY3Rpb25hbGl0eSBvZiB0aGUgYnVuZGxlZCBnZW5lcmF0b3I7IHlvdSBjb3VsZCB3cml0ZSBvbmUgZnJvbSBzY3JhdGNoCi15b3Vyc2VsZi4gIEhvd2V2ZXIgdGhlIGJ1bmRsZWQgZ2VuZXJhdG9yIGtub3dzIGhvdyB0byBnZW5lcmF0ZSBtb3N0IGVtYWlsIGluIGEKLXN0YW5kYXJkcy1jb21wbGlhbnQgd2F5LCBzaG91bGQgaGFuZGxlIE1JTUUgYW5kIG5vbi1NSU1FIGVtYWlsIG1lc3NhZ2VzIGp1c3QKLWZpbmUsIGFuZCBpcyBkZXNpZ25lZCBzbyB0aGF0IHRoZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGZsYXQgdGV4dCwgdG8gYSBtZXNzYWdlCi1zdHJ1Y3R1cmUgdmlhIHRoZSA6Y2xhc3M6YH5lbWFpbC5wYXJzZXIuUGFyc2VyYCBjbGFzcywgYW5kIGJhY2sgdG8gZmxhdCB0ZXh0LAotaXMgaWRlbXBvdGVudCAodGhlIGlucHV0IGlzIGlkZW50aWNhbCB0byB0aGUgb3V0cHV0KSBbI11fLiAgT24gdGhlIG90aGVyIGhhbmQsCi11c2luZyB0aGUgR2VuZXJhdG9yIG9uIGEgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBjb25zdHJ1Y3RlZCBieSBwcm9ncmFtCi1tYXkgcmVzdWx0IGluIGNoYW5nZXMgdG8gdGhlIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgb2JqZWN0IGFzIGRlZmF1bHRzCi1hcmUgZmlsbGVkIGluLgorQXMgd2l0aCB0aGUgOm1vZDpgZW1haWwucGFyc2VyYCBtb2R1bGUsIHlvdSBhcmVuJ3QgbGltaXRlZCB0byB0aGUgZnVuY3Rpb25hbGl0eQorb2YgdGhlIGJ1bmRsZWQgZ2VuZXJhdG9yOyB5b3UgY291bGQgd3JpdGUgb25lIGZyb20gc2NyYXRjaCB5b3Vyc2VsZi4gIEhvd2V2ZXIKK3RoZSBidW5kbGVkIGdlbmVyYXRvciBrbm93cyBob3cgdG8gZ2VuZXJhdGUgbW9zdCBlbWFpbCBpbiBhIHN0YW5kYXJkcy1jb21wbGlhbnQKK3dheSwgc2hvdWxkIGhhbmRsZSBNSU1FIGFuZCBub24tTUlNRSBlbWFpbCBtZXNzYWdlcyBqdXN0IGZpbmUsIGFuZCBpcyBkZXNpZ25lZAorc28gdGhhdCB0aGUgYnl0ZXMtb3JpZW50ZWQgcGFyc2luZyBhbmQgZ2VuZXJhdGlvbiBvcGVyYXRpb25zIGFyZSBpbnZlcnNlcywKK2Fzc3VtaW5nIHRoZSBzYW1lIG5vbi10cmFuc2Zvcm1pbmcgOm1vZDpgfmVtYWlsLnBvbGljeWAgaXMgdXNlZCBmb3IgYm90aC4gIFRoYXQKK2lzLCBwYXJzaW5nIHRoZSBzZXJpYWxpemVkIGJ5dGUgc3RyZWFtIHZpYSB0aGUKKzpjbGFzczpgfmVtYWlsLnBhcnNlci5CeXRlc1BhcnNlcmAgY2xhc3MgYW5kIHRoZW4gcmVnZW5lcmF0aW5nIHRoZSBzZXJpYWxpemVkCitieXRlIHN0cmVhbSB1c2luZyA6Y2xhc3M6YEJ5dGVzR2VuZXJhdG9yYCBzaG91bGQgcHJvZHVjZSBvdXRwdXQgaWRlbnRpY2FsIHRvCit0aGUgaW5wdXQgWyNdXy4gIChPbiB0aGUgb3RoZXIgaGFuZCwgdXNpbmcgdGhlIGdlbmVyYXRvciBvbiBhbgorOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgIGNvbnN0cnVjdGVkIGJ5IHByb2dyYW0gbWF5IHJlc3VsdCBpbgorY2hhbmdlcyB0byB0aGUgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgIG9iamVjdCBhcyBkZWZhdWx0cyBhcmUKK2ZpbGxlZCBpbi4pCiAKLTpjbGFzczpgYnl0ZXNgIG91dHB1dCBjYW4gYmUgZ2VuZXJhdGVkIHVzaW5nIHRoZSA6Y2xhc3M6YEJ5dGVzR2VuZXJhdG9yYCBjbGFzcy4KLUlmIHRoZSBtZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmUgY29udGFpbnMgbm9uLUFTQ0lJIGJ5dGVzLCB0aGlzIGdlbmVyYXRvcidzCi06bWV0aDpgfkJ5dGVzR2VuZXJhdG9yLmZsYXR0ZW5gIG1ldGhvZCB3aWxsIGVtaXQgdGhlIG9yaWdpbmFsIGJ5dGVzLiAgUGFyc2luZyBhCi1iaW5hcnkgbWVzc2FnZSBhbmQgdGhlbiBmbGF0dGVuaW5nIGl0IHdpdGggOmNsYXNzOmBCeXRlc0dlbmVyYXRvcmAgc2hvdWxkIGJlCi1pZGVtcG90ZW50IGZvciBzdGFuZGFyZHMgY29tcGxpYW50IG1lc3NhZ2VzLgotCi1IZXJlIGFyZSB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIDpjbGFzczpgR2VuZXJhdG9yYCBjbGFzcywgaW1wb3J0ZWQgZnJvbSB0aGUKLTptb2Q6YGVtYWlsLmdlbmVyYXRvcmAgbW9kdWxlOgorVGhlIDpjbGFzczpgR2VuZXJhdG9yYCBjbGFzcyBjYW4gYmUgdXNlZCB0byBmbGF0dGVuIGEgbWVzc2FnZSBpbnRvIGEgdGV4dCAoYXMKK29wcG9zZWQgdG8gYmluYXJ5KSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uLCBidXQgc2luY2UgVW5pY29kZSBjYW5ub3QKK3JlcHJlc2VudCBiaW5hcnkgZGF0YSBkaXJlY3RseSwgdGhlIG1lc3NhZ2UgaXMgb2YgbmVjZXNzaXR5IHRyYW5zZm9ybWVkIGludG8KK3NvbWV0aGluZyB0aGF0IGNvbnRhaW5zIG9ubHkgQVNDSUkgY2hhcmFjdGVycywgdXNpbmcgdGhlIHN0YW5kYXJkIGVtYWlsIFJGQworQ29udGVudCBUcmFuc2ZlciBFbmNvZGluZyB0ZWNobmlxdWVzIGZvciBlbmNvZGluZyBlbWFpbCBtZXNzYWdlcyBmb3IgdHJhbnNwb3J0CitvdmVyIGNoYW5uZWxzIHRoYXQgYXJlIG5vdCAiOCBiaXQgY2xlYW4iLgogCiAKLS4uIGNsYXNzOjogR2VuZXJhdG9yKG91dGZwLCBtYW5nbGVfZnJvbV89VHJ1ZSwgbWF4aGVhZGVybGVuPTc4LCAqLCBwb2xpY3k9Tm9uZSkKLQotICAgVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgOmNsYXNzOmBHZW5lcmF0b3JgIGNsYXNzIHRha2VzIGEgOnRlcm06YGZpbGUtbGlrZSBvYmplY3RgCi0gICBjYWxsZWQgKm91dGZwKiBmb3IgYW4gYXJndW1lbnQuICAqb3V0ZnAqIG11c3Qgc3VwcG9ydCB0aGUgOm1ldGg6YHdyaXRlYCBtZXRob2QKLSAgIGFuZCBiZSB1c2FibGUgYXMgdGhlIG91dHB1dCBmaWxlIGZvciB0aGUgOmZ1bmM6YHByaW50YCBmdW5jdGlvbi4KLQotICAgT3B0aW9uYWwgKm1hbmdsZV9mcm9tXyogaXMgYSBmbGFnIHRoYXQsIHdoZW4gYGBUcnVlYGAsIHB1dHMgYSBgYD5gYCBjaGFyYWN0ZXIgaW4KLSAgIGZyb250IG9mIGFueSBsaW5lIGluIHRoZSBib2R5IHRoYXQgc3RhcnRzIGV4YWN0bHkgYXMgYGBGcm9tYGAsIGkuZS4gYGBGcm9tYGAKLSAgIGZvbGxvd2VkIGJ5IGEgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4gIFRoaXMgaXMgdGhlIG9ubHkgZ3VhcmFudGVlZAotICAgcG9ydGFibGUgd2F5IHRvIGF2b2lkIGhhdmluZyBzdWNoIGxpbmVzIGJlIG1pc3Rha2VuIGZvciBhIFVuaXggbWFpbGJveCBmb3JtYXQKLSAgIGVudmVsb3BlIGhlYWRlciBzZXBhcmF0b3IgKHNlZSBgV0hZIFRIRSBDT05URU5ULUxFTkdUSCBGT1JNQVQgSVMgQkFECi0gICA8aHR0cHM6Ly93d3cuand6Lm9yZy9kb2MvY29udGVudC1sZW5ndGguaHRtbD5gXyBmb3IgZGV0YWlscykuICAqbWFuZ2xlX2Zyb21fKgotICAgZGVmYXVsdHMgdG8gYGBUcnVlYGAsIGJ1dCB5b3UgbWlnaHQgd2FudCB0byBzZXQgdGhpcyB0byBgYEZhbHNlYGAgaWYgeW91IGFyZSBub3QKLSAgIHdyaXRpbmcgVW5peCBtYWlsYm94IGZvcm1hdCBmaWxlcy4KLQotICAgT3B0aW9uYWwgKm1heGhlYWRlcmxlbiogc3BlY2lmaWVzIHRoZSBsb25nZXN0IGxlbmd0aCBmb3IgYSBub24tY29udGludWVkIGhlYWRlci4KLSAgIFdoZW4gYSBoZWFkZXIgbGluZSBpcyBsb25nZXIgdGhhbiAqbWF4aGVhZGVybGVuKiAoaW4gY2hhcmFjdGVycywgd2l0aCB0YWJzCi0gICBleHBhbmRlZCB0byA4IHNwYWNlcyksIHRoZSBoZWFkZXIgd2lsbCBiZSBzcGxpdCBhcyBkZWZpbmVkIGluIHRoZQotICAgOmNsYXNzOmB+ZW1haWwuaGVhZGVyLkhlYWRlcmAgY2xhc3MuICBTZXQgdG8gemVybyB0byBkaXNhYmxlIGhlYWRlciB3cmFwcGluZy4KLSAgIFRoZSBkZWZhdWx0IGlzIDc4LCBhcyByZWNvbW1lbmRlZCAoYnV0IG5vdCByZXF1aXJlZCkgYnkgOnJmYzpgMjgyMmAuCi0KLSAgIFRoZSAqcG9saWN5KiBrZXl3b3JkIHNwZWNpZmllcyBhIDptb2Q6YH5lbWFpbC5wb2xpY3lgIG9iamVjdCB0aGF0IGNvbnRyb2xzIGEKLSAgIG51bWJlciBvZiBhc3BlY3RzIG9mIHRoZSBnZW5lcmF0b3IncyBvcGVyYXRpb24uICBJZiBubyAqcG9saWN5KiBpcyBzcGVjaWZpZWQsCi0gICB0aGVuIHRoZSAqcG9saWN5KiBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSBvYmplY3QgcGFzc2VkIHRvIDphdHRyOmBmbGF0dGVuYAotICAgaXMgdXNlZC4KLQotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMgQWRkZWQgdGhlICpwb2xpY3kqIGtleXdvcmQuCi0KLSAgIFRoZSBvdGhlciBwdWJsaWMgOmNsYXNzOmBHZW5lcmF0b3JgIG1ldGhvZHMgYXJlOgotCi0KLSAgIC4uIG1ldGhvZDo6IGZsYXR0ZW4obXNnLCB1bml4ZnJvbT1GYWxzZSwgbGluZXNlcD1Ob25lKQotCi0gICAgICBQcmludCB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlIHJvb3RlZCBhdAotICAgICAgKm1zZyogdG8gdGhlIG91dHB1dCBmaWxlIHNwZWNpZmllZCB3aGVuIHRoZSA6Y2xhc3M6YEdlbmVyYXRvcmAgaW5zdGFuY2UKLSAgICAgIHdhcyBjcmVhdGVkLiAgU3VicGFydHMgYXJlIHZpc2l0ZWQgZGVwdGgtZmlyc3QgYW5kIHRoZSByZXN1bHRpbmcgdGV4dCB3aWxsCi0gICAgICBiZSBwcm9wZXJseSBNSU1FIGVuY29kZWQuCi0KLSAgICAgIE9wdGlvbmFsICp1bml4ZnJvbSogaXMgYSBmbGFnIHRoYXQgZm9yY2VzIHRoZSBwcmludGluZyBvZiB0aGUgZW52ZWxvcGUKLSAgICAgIGhlYWRlciBkZWxpbWl0ZXIgYmVmb3JlIHRoZSBmaXJzdCA6cmZjOmAyODIyYCBoZWFkZXIgb2YgdGhlIHJvb3QgbWVzc2FnZQotICAgICAgb2JqZWN0LiAgSWYgdGhlIHJvb3Qgb2JqZWN0IGhhcyBubyBlbnZlbG9wZSBoZWFkZXIsIGEgc3RhbmRhcmQgb25lIGlzCi0gICAgICBjcmFmdGVkLiAgQnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gYGBGYWxzZWBgIHRvIGluaGliaXQgdGhlIHByaW50aW5nIG9mCi0gICAgICB0aGUgZW52ZWxvcGUgZGVsaW1pdGVyLgotCi0gICAgICBOb3RlIHRoYXQgZm9yIHN1YnBhcnRzLCBubyBlbnZlbG9wZSBoZWFkZXIgaXMgZXZlciBwcmludGVkLgotCi0gICAgICBPcHRpb25hbCAqbGluZXNlcCogc3BlY2lmaWVzIHRoZSBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXIgdXNlZCB0bwotICAgICAgdGVybWluYXRlIGxpbmVzIGluIHRoZSBvdXRwdXQuICBJZiBzcGVjaWZpZWQgaXQgb3ZlcnJpZGVzIHRoZSB2YWx1ZQotICAgICAgc3BlY2lmaWVkIGJ5IHRoZSAqbXNnKlwncyBvciBgYEdlbmVyYXRvcmBgXCdzIGBgcG9saWN5YGAuCi0KLSAgICAgIEJlY2F1c2Ugc3RyaW5ncyBjYW5ub3QgcmVwcmVzZW50IG5vbi1BU0NJSSBieXRlcywgaWYgdGhlIHBvbGljeSB0aGF0Ci0gICAgICBhcHBsaWVzIHdoZW4gYGBmbGF0dGVuYGAgaXMgcnVuIGhhcyA6YXR0cjpgfmVtYWlsLnBvbGljeS5Qb2xpY3kuY3RlX3R5cGVgCi0gICAgICBzZXQgdG8gYGA4Yml0YGAsIGBgR2VuZXJhdG9yYGAgd2lsbCBvcGVyYXRlIGFzIGlmIGl0IHdlcmUgc2V0IHRvCi0gICAgICBgYDdiaXRgYC4gIFRoaXMgbWVhbnMgdGhhdCBtZXNzYWdlcyBwYXJzZWQgd2l0aCBhIEJ5dGVzIHBhcnNlciB0aGF0IGhhdmUKLSAgICAgIGEgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgIG9mIGBgOGJpdGBgIHdpbGwgYmUgY29udmVydGVkCi0gICAgICB0byBhIHVzZSBhIGBgN2JpdGBgIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcuICBOb24tQVNDSUkgYnl0ZXMgaW4gdGhlCi0gICAgICBoZWFkZXJzIHdpbGwgYmUgOnJmYzpgMjA0N2AgZW5jb2RlZCB3aXRoIGEgY2hhcnNldCBvZiBgYHVua25vd24tOGJpdGBgLgotCi0gICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMgotICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgcmUtZW5jb2RpbmcgYGA4Yml0YGAgbWVzc2FnZSBib2RpZXMsIGFuZCB0aGUKLSAgICAgICAgICpsaW5lc2VwKiBhcmd1bWVudC4KLQotICAgLi4gbWV0aG9kOjogY2xvbmUoZnApCi0KLSAgICAgIFJldHVybiBhbiBpbmRlcGVuZGVudCBjbG9uZSBvZiB0aGlzIDpjbGFzczpgR2VuZXJhdG9yYCBpbnN0YW5jZSB3aXRoIHRoZQotICAgICAgZXhhY3Qgc2FtZSBvcHRpb25zLgotCi0gICAuLiBtZXRob2Q6OiB3cml0ZShzKQotCi0gICAgICBXcml0ZSB0aGUgc3RyaW5nICpzKiB0byB0aGUgdW5kZXJseWluZyBmaWxlIG9iamVjdCwgaS5lLiAqb3V0ZnAqIHBhc3NlZCB0bwotICAgICAgOmNsYXNzOmBHZW5lcmF0b3JgJ3MgY29uc3RydWN0b3IuICBUaGlzIHByb3ZpZGVzIGp1c3QgZW5vdWdoIGZpbGUtbGlrZSBBUEkKLSAgICAgIGZvciA6Y2xhc3M6YEdlbmVyYXRvcmAgaW5zdGFuY2VzIHRvIGJlIHVzZWQgaW4gdGhlIDpmdW5jOmBwcmludGAgZnVuY3Rpb24uCi0KLUFzIGEgY29udmVuaWVuY2UsIHNlZSB0aGUgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBtZXRob2RzCi06bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5hc19zdHJpbmdgIGFuZCBgYHN0cihhTWVzc2FnZSlgYCwgYS5rLmEuCi06bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5fX3N0cl9fYCwgd2hpY2ggc2ltcGxpZnkgdGhlIGdlbmVyYXRpb24gb2YgYQotZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1lc3NhZ2Ugb2JqZWN0LiAgRm9yIG1vcmUgZGV0YWlsLCBzZWUKLTptb2Q6YGVtYWlsLm1lc3NhZ2VgLgotCi0uLiBjbGFzczo6IEJ5dGVzR2VuZXJhdG9yKG91dGZwLCBtYW5nbGVfZnJvbV89VHJ1ZSwgbWF4aGVhZGVybGVuPTc4LCAqLCBcCisuLiBjbGFzczo6IEJ5dGVzR2VuZXJhdG9yKG91dGZwLCBtYW5nbGVfZnJvbV89Tm9uZSwgbWF4aGVhZGVybGVuPU5vbmUsICosIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5PU5vbmUpCiAKLSAgIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIDpjbGFzczpgQnl0ZXNHZW5lcmF0b3JgIGNsYXNzIHRha2VzIGEgYmluYXJ5Ci0gICA6dGVybTpgZmlsZS1saWtlIG9iamVjdGAgY2FsbGVkICpvdXRmcCogZm9yIGFuIGFyZ3VtZW50LiAgKm91dGZwKiBtdXN0Ci0gICBzdXBwb3J0IGEgOm1ldGg6YHdyaXRlYCBtZXRob2QgdGhhdCBhY2NlcHRzIGJpbmFyeSBkYXRhLgorICAgUmV0dXJuIGEgOmNsYXNzOmBCeXRlc0dlbmVyYXRvcmAgb2JqZWN0IHRoYXQgd2lsbCB3cml0ZSBhbnkgbWVzc2FnZSBwcm92aWRlZAorICAgdG8gdGhlIDptZXRoOmBmbGF0dGVuYCBtZXRob2QsIG9yIGFueSBzdXJyb2dhdGVlc2NhcGUgZW5jb2RlZCB0ZXh0IHByb3ZpZGVkCisgICB0byB0aGUgOm1ldGg6YHdyaXRlYCBtZXRob2QsIHRvIHRoZSA6dGVybTpgZmlsZS1saWtlIG9iamVjdGAgKm91dGZwKi4KKyAgICpvdXRmcCogbXVzdCBzdXBwb3J0IGEgYGB3cml0ZWBgIG1ldGhvZCB0aGF0IGFjY2VwdHMgYmluYXJ5IGRhdGEuCiAKLSAgIE9wdGlvbmFsICptYW5nbGVfZnJvbV8qIGlzIGEgZmxhZyB0aGF0LCB3aGVuIGBgVHJ1ZWBgLCBwdXRzIGEgYGA+YGAKLSAgIGNoYXJhY3RlciBpbiBmcm9udCBvZiBhbnkgbGluZSBpbiB0aGUgYm9keSB0aGF0IHN0YXJ0cyBleGFjdGx5IGFzIGBgRnJvbWBgLAotICAgaS5lLiBgYEZyb21gYCBmb2xsb3dlZCBieSBhIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuICBUaGlzIGlzIHRoZQotICAgb25seSBndWFyYW50ZWVkIHBvcnRhYmxlIHdheSB0byBhdm9pZCBoYXZpbmcgc3VjaCBsaW5lcyBiZSBtaXN0YWtlbiBmb3IgYQotICAgVW5peCBtYWlsYm94IGZvcm1hdCBlbnZlbG9wZSBoZWFkZXIgc2VwYXJhdG9yIChzZWUgYFdIWSBUSEUgQ09OVEVOVC1MRU5HVEgKLSAgIEZPUk1BVCBJUyBCQUQgPGh0dHBzOi8vd3d3Lmp3ei5vcmcvZG9jL2NvbnRlbnQtbGVuZ3RoLmh0bWw+YF8gZm9yIGRldGFpbHMpLgotICAgKm1hbmdsZV9mcm9tXyogZGVmYXVsdHMgdG8gYGBUcnVlYGAsIGJ1dCB5b3UgbWlnaHQgd2FudCB0byBzZXQgdGhpcyB0bwotICAgYGBGYWxzZWBgIGlmIHlvdSBhcmUgbm90IHdyaXRpbmcgVW5peCBtYWlsYm94IGZvcm1hdCBmaWxlcy4KKyAgIElmIG9wdGlvbmFsICptYW5nbGVfZnJvbV8qIGlzIGBgVHJ1ZWBgLCBwdXQgYSBgYD5gYCBjaGFyYWN0ZXIgaW4gZnJvbnQgb2YKKyAgIGFueSBsaW5lIGluIHRoZSBib2R5IHRoYXQgc3RhcnRzIHdpdGggdGhlIGV4YWN0IHN0cmluZyBgYCJGcm9tICJgYCwgdGhhdCBpcworICAgYGBGcm9tYGAgZm9sbG93ZWQgYnkgYSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICptYW5nbGVfZnJvbV8qCisgICBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgdGhlIDphdHRyOmB+ZW1haWwucG9saWN5LlBvbGljeS5tYW5nbGVfZnJvbV9gCisgICBzZXR0aW5nIG9mIHRoZSAqcG9saWN5KiAod2hpY2ggaXMgYGBUcnVlYGAgZm9yIHRoZQorICAgOmRhdGE6YH5lbWFpbC5wb2xpY3kuY29tcGF0MzJgIHBvbGljeSBhbmQgYGBGYWxzZWBgIGZvciBhbGwgb3RoZXJzKS4KKyAgICptYW5nbGVfZnJvbV8qIGlzIGludGVuZGVkIGZvciB1c2Ugd2hlbiBtZXNzYWdlcyBhcmUgc3RvcmVkIGluIHVuaXggbWJveAorICAgZm9ybWF0IChzZWUgOm1vZDpgbWFpbGJveGAgYW5kIGBXSFkgVEhFIENPTlRFTlQtTEVOR1RIIEZPUk1BVCBJUyBCQUQKKyAgIDxodHRwOi8vd3d3Lmp3ei5vcmcvZG9jL2NvbnRlbnQtbGVuZ3RoLmh0bWw+YF8pLgogCi0gICBPcHRpb25hbCAqbWF4aGVhZGVybGVuKiBzcGVjaWZpZXMgdGhlIGxvbmdlc3QgbGVuZ3RoIGZvciBhIG5vbi1jb250aW51ZWQKLSAgIGhlYWRlci4gIFdoZW4gYSBoZWFkZXIgbGluZSBpcyBsb25nZXIgdGhhbiAqbWF4aGVhZGVybGVuKiAoaW4gY2hhcmFjdGVycywKLSAgIHdpdGggdGFicyBleHBhbmRlZCB0byA4IHNwYWNlcyksIHRoZSBoZWFkZXIgd2lsbCBiZSBzcGxpdCBhcyBkZWZpbmVkIGluIHRoZQotICAgOmNsYXNzOmB+ZW1haWwuaGVhZGVyLkhlYWRlcmAgY2xhc3MuICBTZXQgdG8gemVybyB0byBkaXNhYmxlIGhlYWRlcgotICAgd3JhcHBpbmcuICBUaGUgZGVmYXVsdCBpcyA3OCwgYXMgcmVjb21tZW5kZWQgKGJ1dCBub3QgcmVxdWlyZWQpIGJ5Ci0gICA6cmZjOmAyODIyYC4KKyAgIElmICptYXhoZWFkZXJsZW4qIGlzIG5vdCBgYE5vbmVgYCwgcmVmb2xkIGFueSBoZWFkZXIgbGluZXMgdGhhdCBhcmUgbG9uZ2VyCisgICB0aGFuICptYXhoZWFkZXJsZW4qLCBvciBpZiBgYDBgYCwgZG8gbm90IHJld3JhcCBhbnkgaGVhZGVycy4gIElmCisgICAqbWFuaGVhZGVybGVuKiBpcyBgYE5vbmVgYCAodGhlIGRlZmF1bHQpLCB3cmFwIGhlYWRlcnMgYW5kIG90aGVyIG1lc3NhZ2UKKyAgIGxpbmVzIGFjY29yZGluZyB0byB0aGUgKnBvbGljeSogc2V0dGluZ3MuCiAKKyAgIElmICpwb2xpY3kqIGlzIHNwZWNpZmllZCwgdXNlIHRoYXQgcG9saWN5IHRvIGNvbnRyb2wgbWVzc2FnZSBnZW5lcmF0aW9uLiAgSWYKKyAgICpwb2xpY3kqIGlzIGBgTm9uZWBgICh0aGUgZGVmYXVsdCksIHVzZSB0aGUgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgb3IgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgCisgICBvYmplY3QgcGFzc2VkIHRvIGBgZmxhdHRlbmBgIHRvIGNvbnRyb2wgdGhlIG1lc3NhZ2UgZ2VuZXJhdGlvbi4gIFNlZQorICAgOm1vZDpgZW1haWwucG9saWN5YCBmb3IgZGV0YWlscyBvbiB3aGF0ICpwb2xpY3kqIGNvbnRyb2xzLgogCi0gICBUaGUgKnBvbGljeSoga2V5d29yZCBzcGVjaWZpZXMgYSA6bW9kOmB+ZW1haWwucG9saWN5YCBvYmplY3QgdGhhdCBjb250cm9scyBhCi0gICBudW1iZXIgb2YgYXNwZWN0cyBvZiB0aGUgZ2VuZXJhdG9yJ3Mgb3BlcmF0aW9uLiAgSWYgbm8gKnBvbGljeSogaXMgc3BlY2lmaWVkLAotICAgdGhlbiB0aGUgKnBvbGljeSogYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2Ugb2JqZWN0IHBhc3NlZCB0byA6YXR0cjpgZmxhdHRlbmAKLSAgIGlzIHVzZWQuCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMgQWRkZWQgdGhlICpwb2xpY3kqIGtleXdvcmQuCiAKLSAgIFRoZSBvdGhlciBwdWJsaWMgOmNsYXNzOmBCeXRlc0dlbmVyYXRvcmAgbWV0aG9kcyBhcmU6CisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgKm1hbmdsZV9mcm9tXyoKKyAgICAgIGFuZCAqbWF4aGVhZGVybGVuKiBwYXJhbWV0ZXJzIGlzIHRvIGZvbGxvdyB0aGUgcG9saWN5LgogCiAKICAgIC4uIG1ldGhvZDo6IGZsYXR0ZW4obXNnLCB1bml4ZnJvbT1GYWxzZSwgbGluZXNlcD1Ob25lKQogCiAgICAgICBQcmludCB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlIHJvb3RlZAogICAgICAgYXQgKm1zZyogdG8gdGhlIG91dHB1dCBmaWxlIHNwZWNpZmllZCB3aGVuIHRoZSA6Y2xhc3M6YEJ5dGVzR2VuZXJhdG9yYAotICAgICAgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQuICBTdWJwYXJ0cyBhcmUgdmlzaXRlZCBkZXB0aC1maXJzdCBhbmQgdGhlIHJlc3VsdGluZwotICAgICAgdGV4dCB3aWxsIGJlIHByb3Blcmx5IE1JTUUgZW5jb2RlZC4gIElmIHRoZSA6bW9kOmB+ZW1haWwucG9saWN5YCBvcHRpb24KLSAgICAgIDphdHRyOmB+ZW1haWwucG9saWN5LlBvbGljeS5jdGVfdHlwZWAgaXMgYGA4Yml0YGAgKHRoZSBkZWZhdWx0KSwKLSAgICAgIHRoZW4gYW55IGJ5dGVzIHdpdGggdGhlIGhpZ2ggYml0IHNldCBpbiB0aGUgb3JpZ2luYWwgcGFyc2VkIG1lc3NhZ2UgdGhhdAotICAgICAgaGF2ZSBub3QgYmVlbiBtb2RpZmllZCB3aWxsIGJlIGNvcGllZCBmYWl0aGZ1bGx5IHRvIHRoZSBvdXRwdXQuICBJZgotICAgICAgYGBjdGVfdHlwZWBgIGlzIGBgN2JpdGBgLCB0aGUgYnl0ZXMgd2lsbCBiZSBjb252ZXJ0ZWQgYXMgbmVlZGVkCi0gICAgICB1c2luZyBhbiBBU0NJSS1jb21wYXRpYmxlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcuICBJbiBwYXJ0aWN1bGFyLAotICAgICAgUkZDLWludmFsaWQgbm9uLUFTQ0lJIGJ5dGVzIGluIGhlYWRlcnMgd2lsbCBiZSBlbmNvZGVkIHVzaW5nIHRoZSBNSU1FCi0gICAgICBgYHVua25vd24tOGJpdGBgIGNoYXJhY3RlciBzZXQsIHRodXMgcmVuZGVyaW5nIHRoZW0gUkZDLWNvbXBsaWFudC4KKyAgICAgIGluc3RhbmNlIHdhcyBjcmVhdGVkLgogCi0gICAgICAuLiBYWFg6IFRoZXJlIHNob3VsZCBiZSBhIGNvbXBsZW1lbnRhcnkgb3B0aW9uIHRoYXQganVzdCBkb2VzIHRoZSBSRkMKLSAgICAgICAgIGNvbXBsaWFuY2UgdHJhbnNmb3JtYXRpb24gYnV0IGxlYXZlcyBDVEUgOGJpdCBwYXJ0cyBhbG9uZS4KKyAgICAgIElmIHRoZSA6bW9kOmB+ZW1haWwucG9saWN5YCBvcHRpb24gOmF0dHI6YH5lbWFpbC5wb2xpY3kuUG9saWN5LmN0ZV90eXBlYAorICAgICAgaXMgYGA4Yml0YGAgKHRoZSBkZWZhdWx0KSwgY29weSBhbnkgaGVhZGVycyBpbiB0aGUgb3JpZ2luYWwgcGFyc2VkCisgICAgICBtZXNzYWdlIHRoYXQgaGF2ZSBub3QgYmVlbiBtb2RpZmllZCB0byB0aGUgb3V0cHV0IHdpdGggYW55IGJ5dGVzIHdpdGggdGhlCisgICAgICBoaWdoIGJpdCBzZXQgcmVwcm9kdWNlZCBhcyBpbiB0aGUgb3JpZ2luYWwsIGFuZCBwcmVzZXJ2ZSB0aGUgbm9uLUFTQ0lJCisgICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZ2Agb2YgYW55IGJvZHkgcGFydHMgdGhhdCBoYXZlIHRoZW0uCisgICAgICBJZiBgYGN0ZV90eXBlYGAgaXMgYGA3Yml0YGAsIGNvbnZlcnQgdGhlIGJ5dGVzIHdpdGggdGhlIGhpZ2ggYml0IHNldCBhcworICAgICAgbmVlZGVkIHVzaW5nIGFuIEFTQ0lJLWNvbXBhdGlibGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgLgorICAgICAgVGhhdCBpcywgdHJhbnNmb3JtIHBhcnRzIHdpdGggbm9uLUFTQ0lJCisgICAgICA6bWFpbGhlYWRlcjpgQ290bmVudC1UcmFuc2Zlci1FbmNvZGluZ2AKKyAgICAgICg6bWFpbGhlYWRlcjpgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdGApIHRvIGFuIEFTQ0lJIGNvbXBhdGliaWxlCisgICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZ2AsIGFuZCBlbmNvZGUgUkZDLWludmFsaWQgbm9uLUFTQ0lJCisgICAgICBieXRlcyBpbiBoZWFkZXJzIHVzaW5nIHRoZSBNSU1FIGBgdW5rbm93bi04Yml0YGAgY2hhcmFjdGVyIHNldCwgdGh1cworICAgICAgcmVuZGVyaW5nIHRoZW0gUkZDLWNvbXBsaWFudC4KIAotICAgICAgTWVzc2FnZXMgcGFyc2VkIHdpdGggYSBCeXRlcyBwYXJzZXIgdGhhdCBoYXZlIGEKLSAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYCBvZiA4Yml0IHdpbGwgYmUgcmVjb25zdHJ1Y3RlZAotICAgICAgYXMgOGJpdCBpZiB0aGV5IGhhdmUgbm90IGJlZW4gbW9kaWZpZWQuCisgICAgICAuLiBYWFg6IFRoZXJlIHNob3VsZCBiZSBhbiBvcHRpb24gdGhhdCBqdXN0IGRvZXMgdGhlIFJGQworICAgICAgICAgY29tcGxpYW5jZSB0cmFuc2Zvcm1hdGlvbiBvbiBoZWFkZXJzIGJ1dCBsZWF2ZXMgQ1RFIDhiaXQgcGFydHMgYWxvbmUuCiAKLSAgICAgIE9wdGlvbmFsICp1bml4ZnJvbSogaXMgYSBmbGFnIHRoYXQgZm9yY2VzIHRoZSBwcmludGluZyBvZiB0aGUgZW52ZWxvcGUKLSAgICAgIGhlYWRlciBkZWxpbWl0ZXIgYmVmb3JlIHRoZSBmaXJzdCA6cmZjOmAyODIyYCBoZWFkZXIgb2YgdGhlIHJvb3QgbWVzc2FnZQotICAgICAgb2JqZWN0LiAgSWYgdGhlIHJvb3Qgb2JqZWN0IGhhcyBubyBlbnZlbG9wZSBoZWFkZXIsIGEgc3RhbmRhcmQgb25lIGlzCi0gICAgICBjcmFmdGVkLiAgQnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gYGBGYWxzZWBgIHRvIGluaGliaXQgdGhlIHByaW50aW5nIG9mCi0gICAgICB0aGUgZW52ZWxvcGUgZGVsaW1pdGVyLgotCisgICAgICBJZiAqdW5peGZyb20qIGlzIGBgVHJ1ZWBgLCBwcmludCB0aGUgZW52ZWxvcGUgaGVhZGVyIGRlbGltaXRlciB1c2VkIGJ5CisgICAgICB0aGUgVW5peCBtYWlsYm94IGZvcm1hdCAoc2VlIDptb2Q6YG1haWxib3hgKSBiZWZvcmUgdGhlIGZpcnN0IG9mIHRoZQorICAgICAgOnJmYzpgNTMyMmAgaGVhZGVycyBvZiB0aGUgcm9vdCBtZXNzYWdlIG9iamVjdC4gIElmIHRoZSByb290IG9iamVjdCBoYXMKKyAgICAgIG5vIGVudmVsb3BlIGhlYWRlciwgY3JhZnQgYSBzdGFuZGFyZCBvbmUuICBUaGUgZGVmYXVsdCBpcyBgYEZhbHNlYGAuCiAgICAgICBOb3RlIHRoYXQgZm9yIHN1YnBhcnRzLCBubyBlbnZlbG9wZSBoZWFkZXIgaXMgZXZlciBwcmludGVkLgogCi0gICAgICBPcHRpb25hbCAqbGluZXNlcCogc3BlY2lmaWVzIHRoZSBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXIgdXNlZCB0bwotICAgICAgdGVybWluYXRlIGxpbmVzIGluIHRoZSBvdXRwdXQuICBJZiBzcGVjaWZpZWQgaXQgb3ZlcnJpZGVzIHRoZSB2YWx1ZQotICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBgYEdlbmVyYXRvcmBgXCBvciAqbXNnKlwgJ3MgYGBwb2xpY3lgYC4KKyAgICAgIElmICpsaW5lc2VwKiBpcyBub3QgYGBOb25lYGAsIHVzZSBpdCBhcyB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlciBiZXR3ZWVuCisgICAgICBhbGwgdGhlIGxpbmVzIG9mIHRoZSBmbGF0dGVuZWQgbWVzc2FnZS4gIElmICpsaW5lc2VwKiBpcyBgYE5vbmVgYCAodGhlCisgICAgICBkZWZhdWx0KSwgdXNlIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlICpwb2xpY3kqLgorCisgICAgICAuLiBYWFg6IGZsYXR0ZW4gc2hvdWxkIHRha2UgYSAqcG9saWN5KiBrZXl3b3JkLgorCiAKICAgIC4uIG1ldGhvZDo6IGNsb25lKGZwKQogCiAgICAgICBSZXR1cm4gYW4gaW5kZXBlbmRlbnQgY2xvbmUgb2YgdGhpcyA6Y2xhc3M6YEJ5dGVzR2VuZXJhdG9yYCBpbnN0YW5jZSB3aXRoCi0gICAgICB0aGUgZXhhY3Qgc2FtZSBvcHRpb25zLgorICAgICAgdGhlIGV4YWN0IHNhbWUgb3B0aW9uIHNldHRpbmdzLCBhbmQgKmZwKiBhcyB0aGUgbmV3ICpvdXRmcCouCisKIAogICAgLi4gbWV0aG9kOjogd3JpdGUocykKIAotICAgICAgV3JpdGUgdGhlIHN0cmluZyAqcyogdG8gdGhlIHVuZGVybHlpbmcgZmlsZSBvYmplY3QuICAqcyogaXMgZW5jb2RlZCB1c2luZwotICAgICAgdGhlIGBgQVNDSUlgYCBjb2RlYyBhbmQgd3JpdHRlbiB0byB0aGUgKndyaXRlKiBtZXRob2Qgb2YgdGhlICAqb3V0ZnAqCi0gICAgICAqb3V0ZnAqIHBhc3NlZCB0byB0aGUgOmNsYXNzOmBCeXRlc0dlbmVyYXRvcmAncyBjb25zdHJ1Y3Rvci4gIFRoaXMKLSAgICAgIHByb3ZpZGVzIGp1c3QgZW5vdWdoIGZpbGUtbGlrZSBBUEkgZm9yIDpjbGFzczpgQnl0ZXNHZW5lcmF0b3JgIGluc3RhbmNlcwotICAgICAgdG8gYmUgdXNlZCBpbiB0aGUgOmZ1bmM6YHByaW50YCBmdW5jdGlvbi4KLQotICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCi0KLVRoZSA6bW9kOmBlbWFpbC5nZW5lcmF0b3JgIG1vZHVsZSBhbHNvIHByb3ZpZGVzIGEgZGVyaXZlZCBjbGFzcywgY2FsbGVkCi06Y2xhc3M6YERlY29kZWRHZW5lcmF0b3JgIHdoaWNoIGlzIGxpa2UgdGhlIDpjbGFzczpgR2VuZXJhdG9yYCBiYXNlIGNsYXNzLAotZXhjZXB0IHRoYXQgbm9uLVwgOm1pbWV0eXBlOmB0ZXh0YCBwYXJ0cyBhcmUgc3Vic3RpdHV0ZWQgd2l0aCBhIGZvcm1hdCBzdHJpbmcKLXJlcHJlc2VudGluZyB0aGUgcGFydC4KKyAgICAgIEVuY29kZSAqcyogdXNpbmcgdGhlIGBgQVNDSUlgYCBjb2RlYyBhbmQgdGhlIGBgc3Vycm9nYXRlZXNjYXBlYGAgZXJyb3IKKyAgICAgIGhhbmRsZXIsIGFuZCBwYXNzIGl0IHRvIHRoZSAqd3JpdGUqIG1ldGhvZCBvZiB0aGUgKm91dGZwKiBwYXNzZWQgdG8gdGhlCisgICAgICA6Y2xhc3M6YEJ5dGVzR2VuZXJhdG9yYCdzIGNvbnN0cnVjdG9yLgogCiAKLS4uIGNsYXNzOjogRGVjb2RlZEdlbmVyYXRvcihvdXRmcCwgbWFuZ2xlX2Zyb21fPVRydWUsIG1heGhlYWRlcmxlbj03OCwgZm10PU5vbmUpCitBcyBhIGNvbnZlbmllbmNlLCA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZWAgcHJvdmlkZXMgdGhlIG1ldGhvZHMKKzptZXRoOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2UuYXNfYnl0ZXNgIGFuZCBgYGJ5dGVzKGFNZXNzYWdlKWBgIChhLmsuYS4KKzptZXRoOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2UuX19ieXRlc19fYCksIHdoaWNoIHNpbXBsaWZ5IHRoZSBnZW5lcmF0aW9uIG9mCithIHNlcmlhbGl6ZWQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGEgbWVzc2FnZSBvYmplY3QuICBGb3IgbW9yZSBkZXRhaWwsIHNlZQorOm1vZDpgZW1haWwubWVzc2FnZWAuCiAKLSAgIFRoaXMgY2xhc3MsIGRlcml2ZWQgZnJvbSA6Y2xhc3M6YEdlbmVyYXRvcmAgd2Fsa3MgdGhyb3VnaCBhbGwgdGhlIHN1YnBhcnRzIG9mIGEKLSAgIG1lc3NhZ2UuICBJZiB0aGUgc3VicGFydCBpcyBvZiBtYWluIHR5cGUgOm1pbWV0eXBlOmB0ZXh0YCwgdGhlbiBpdCBwcmludHMgdGhlCi0gICBkZWNvZGVkIHBheWxvYWQgb2YgdGhlIHN1YnBhcnQuIE9wdGlvbmFsICpfbWFuZ2xlX2Zyb21fKiBhbmQgKm1heGhlYWRlcmxlbiogYXJlCi0gICBhcyB3aXRoIHRoZSA6Y2xhc3M6YEdlbmVyYXRvcmAgYmFzZSBjbGFzcy4KIAotICAgSWYgdGhlIHN1YnBhcnQgaXMgbm90IG9mIG1haW4gdHlwZSA6bWltZXR5cGU6YHRleHRgLCBvcHRpb25hbCAqZm10KiBpcyBhIGZvcm1hdAotICAgc3RyaW5nIHRoYXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBtZXNzYWdlIHBheWxvYWQuICpmbXQqIGlzIGV4cGFuZGVkIHdpdGggdGhlCi0gICBmb2xsb3dpbmcga2V5d29yZHMsIGBgJShrZXl3b3JkKXNgYCBmb3JtYXQ6CitCZWNhdXNlIHN0cmluZ3MgY2Fubm90IHJlcHJlc2VudCBiaW5hcnkgZGF0YSwgdGhlIDpjbGFzczpgR2VuZXJhdG9yYCBjbGFzcyBtdXN0Citjb252ZXJ0IGFueSBiaW5hcnkgZGF0YSBpbiBhbnkgbWVzc2FnZSBpdCBmbGF0dGVucyB0byBhbiBBU0NJSSBjb21wYXRpYmxlCitmb3JtYXQsIGJ5IGNvbnZlcnRpbmcgdGhlbSB0byBhbiBBU0NJSSBjb21wYXRpYmxlCis6bWFpbGhlYWRlcjpgQ29udGVudC1UcmFuc2Zlcl9FbmNvZGluZ2AuICBVc2luZyB0aGUgdGVybWlub2xvZ3kgb2YgdGhlIGVtYWlsCitSRkNzLCB5b3UgY2FuIHRoaW5rIG9mIHRoaXMgYXMgOmNsYXNzOmBHZW5lcmF0b3JgIHNlcmlhbGl6aW5nIHRvIGFuIEkvTyBzdHJlYW0KK3RoYXQgaXMgbm90ICI4IGJpdCBjbGVhbiIuICBJbiBvdGhlciB3b3JkcywgbW9zdCBhcHBsaWNhdGlvbnMgd2lsbCB3YW50Cit0byBiZSB1c2luZyA6Y2xhc3M6YEJ5dGVzR2VuZXJhdG9yYCwgYW5kIG5vdCA6Y2xhc3M6YEdlbmVyYXRvcmAuCisKKy4uIGNsYXNzOjogR2VuZXJhdG9yKG91dGZwLCBtYW5nbGVfZnJvbV89Tm9uZSwgbWF4aGVhZGVybGVuPU5vbmUsICosIFwKKyAgICAgICAgICAgICAgICAgICAgIHBvbGljeT1Ob25lKQorCisgICBSZXR1cm4gYSA6Y2xhc3M6YEdlbmVyYXRvcmAgb2JqZWN0IHRoYXQgd2lsbCB3cml0ZSBhbnkgbWVzc2FnZSBwcm92aWRlZAorICAgdG8gdGhlIDptZXRoOmBmbGF0dGVuYCBtZXRob2QsIG9yIGFueSB0ZXh0IHByb3ZpZGVkIHRvIHRoZSA6bWV0aDpgd3JpdGVgCisgICBtZXRob2QsIHRvIHRoZSA6dGVybTpgZmlsZS1saWtlIG9iamVjdGAgKm91dGZwKi4gICpvdXRmcCogbXVzdCBzdXBwb3J0IGEKKyAgIGBgd3JpdGVgYCBtZXRob2QgdGhhdCBhY2NlcHRzIHN0cmluZyBkYXRhLgorCisgICBJZiBvcHRpb25hbCAqbWFuZ2xlX2Zyb21fKiBpcyBgYFRydWVgYCwgcHV0IGEgYGA+YGAgY2hhcmFjdGVyIGluIGZyb250IG9mCisgICBhbnkgbGluZSBpbiB0aGUgYm9keSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBleGFjdCBzdHJpbmcgYGAiRnJvbSAiYGAsIHRoYXQgaXMKKyAgIGBgRnJvbWBgIGZvbGxvd2VkIGJ5IGEgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqbWFuZ2xlX2Zyb21fKgorICAgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSA6YXR0cjpgfmVtYWlsLnBvbGljeS5Qb2xpY3kubWFuZ2xlX2Zyb21fYAorICAgc2V0dGluZyBvZiB0aGUgKnBvbGljeSogKHdoaWNoIGlzIGBgVHJ1ZWBgIGZvciB0aGUKKyAgIDpkYXRhOmB+ZW1haWwucG9saWN5LmNvbXBhdDMyYCBwb2xpY3kgYW5kIGBgRmFsc2VgYCBmb3IgYWxsIG90aGVycykuCisgICAqbWFuZ2xlX2Zyb21fKiBpcyBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gbWVzc2FnZXMgYXJlIHN0b3JlZCBpbiB1bml4IG1ib3gKKyAgIGZvcm1hdCAoc2VlIDptb2Q6YG1haWxib3hgIGFuZCBgV0hZIFRIRSBDT05URU5ULUxFTkdUSCBGT1JNQVQgSVMgQkFECisgICA8aHR0cDovL3d3dy5qd3oub3JnL2RvYy9jb250ZW50LWxlbmd0aC5odG1sPmBfKS4KKworICAgSWYgKm1heGhlYWRlcmxlbiogaXMgbm90IGBgTm9uZWBgLCByZWZvbGQgYW55IGhlYWRlciBsaW5lcyB0aGF0IGFyZSBsb25nZXIKKyAgIHRoYW4gKm1heGhlYWRlcmxlbiosIG9yIGlmIGBgMGBgLCBkbyBub3QgcmV3cmFwIGFueSBoZWFkZXJzLiAgSWYKKyAgICptYW5oZWFkZXJsZW4qIGlzIGBgTm9uZWBgICh0aGUgZGVmYXVsdCksIHdyYXAgaGVhZGVycyBhbmQgb3RoZXIgbWVzc2FnZQorICAgbGluZXMgYWNjb3JkaW5nIHRvIHRoZSAqcG9saWN5KiBzZXR0aW5ncy4KKworICAgSWYgKnBvbGljeSogaXMgc3BlY2lmaWVkLCB1c2UgdGhhdCBwb2xpY3kgdG8gY29udHJvbCBtZXNzYWdlIGdlbmVyYXRpb24uICBJZgorICAgKnBvbGljeSogaXMgYGBOb25lYGAgKHRoZSBkZWZhdWx0KSwgdXNlIHRoZSBwb2xpY3kgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBvciA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZWAKKyAgIG9iamVjdCBwYXNzZWQgdG8gYGBmbGF0dGVuYGAgdG8gY29udHJvbCB0aGUgbWVzc2FnZSBnZW5lcmF0aW9uLiAgU2VlCisgICA6bW9kOmBlbWFpbC5wb2xpY3lgIGZvciBkZXRhaWxzIG9uIHdoYXQgKnBvbGljeSogY29udHJvbHMuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zIEFkZGVkIHRoZSAqcG9saWN5KiBrZXl3b3JkLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgKm1hbmdsZV9mcm9tXyoKKyAgICAgIGFuZCAqbWF4aGVhZGVybGVuKiBwYXJhbWV0ZXJzIGlzIHRvIGZvbGxvdyB0aGUgcG9saWN5LgorCisKKyAgIC4uIG1ldGhvZDo6IGZsYXR0ZW4obXNnLCB1bml4ZnJvbT1GYWxzZSwgbGluZXNlcD1Ob25lKQorCisgICAgICBQcmludCB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlIHJvb3RlZAorICAgICAgYXQgKm1zZyogdG8gdGhlIG91dHB1dCBmaWxlIHNwZWNpZmllZCB3aGVuIHRoZSA6Y2xhc3M6YEdlbmVyYXRvcmAKKyAgICAgIGluc3RhbmNlIHdhcyBjcmVhdGVkLgorCisgICAgICBJZiB0aGUgOm1vZDpgfmVtYWlsLnBvbGljeWAgb3B0aW9uIDphdHRyOmB+ZW1haWwucG9saWN5LlBvbGljeS5jdGVfdHlwZWAKKyAgICAgIGlzIGBgOGJpdGBgLCBnZW5lcmF0ZSB0aGUgbWVzc2FnZSBhcyBpZiB0aGUgb3B0aW9uIHdlcmUgc2V0IHRvIGBgN2JpdGBgLgorICAgICAgKFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBzdHJpbmdzIGNhbm5vdCByZXByZXNlbnQgbm9uLUFTQ0lJIGJ5dGVzLikKKyAgICAgIENvbnZlcnQgYW55IGJ5dGVzIHdpdGggdGhlIGhpZ2ggYml0IHNldCBhcyBuZWVkZWQgdXNpbmcgYW4KKyAgICAgIEFTQ0lJLWNvbXBhdGlibGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgLiAgVGhhdCBpcywKKyAgICAgIHRyYW5zZm9ybSBwYXJ0cyB3aXRoIG5vbi1BU0NJSSA6bWFpbGhlYWRlcjpgQ290bmVudC1UcmFuc2Zlci1FbmNvZGluZ2AKKyAgICAgICg6bWFpbGhlYWRlcjpgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdGApIHRvIGFuIEFTQ0lJIGNvbXBhdGliaWxlCisgICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZ2AsIGFuZCBlbmNvZGUgUkZDLWludmFsaWQgbm9uLUFTQ0lJCisgICAgICBieXRlcyBpbiBoZWFkZXJzIHVzaW5nIHRoZSBNSU1FIGBgdW5rbm93bi04Yml0YGAgY2hhcmFjdGVyIHNldCwgdGh1cworICAgICAgcmVuZGVyaW5nIHRoZW0gUkZDLWNvbXBsaWFudC4KKworICAgICAgSWYgKnVuaXhmcm9tKiBpcyBgYFRydWVgYCwgcHJpbnQgdGhlIGVudmVsb3BlIGhlYWRlciBkZWxpbWl0ZXIgdXNlZCBieQorICAgICAgdGhlIFVuaXggbWFpbGJveCBmb3JtYXQgKHNlZSA6bW9kOmBtYWlsYm94YCkgYmVmb3JlIHRoZSBmaXJzdCBvZiB0aGUKKyAgICAgIDpyZmM6YDUzMjJgIGhlYWRlcnMgb2YgdGhlIHJvb3QgbWVzc2FnZSBvYmplY3QuICBJZiB0aGUgcm9vdCBvYmplY3QgaGFzCisgICAgICBubyBlbnZlbG9wZSBoZWFkZXIsIGNyYWZ0IGEgc3RhbmRhcmQgb25lLiAgVGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgLgorICAgICAgTm90ZSB0aGF0IGZvciBzdWJwYXJ0cywgbm8gZW52ZWxvcGUgaGVhZGVyIGlzIGV2ZXIgcHJpbnRlZC4KKworICAgICAgSWYgKmxpbmVzZXAqIGlzIG5vdCBgYE5vbmVgYCwgdXNlIGl0IGFzIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIGJldHdlZW4KKyAgICAgIGFsbCB0aGUgbGluZXMgb2YgdGhlIGZsYXR0ZW5lZCBtZXNzYWdlLiAgSWYgKmxpbmVzZXAqIGlzIGBgTm9uZWBgICh0aGUKKyAgICAgIGRlZmF1bHQpLCB1c2UgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgKnBvbGljeSouCisKKyAgICAgIC4uIFhYWDogZmxhdHRlbiBzaG91bGQgdGFrZSBhICpwb2xpY3kqIGtleXdvcmQuCisKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4yCisgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciByZS1lbmNvZGluZyBgYDhiaXRgYCBtZXNzYWdlIGJvZGllcywgYW5kIHRoZQorICAgICAgICAgKmxpbmVzZXAqIGFyZ3VtZW50LgorCisKKyAgIC4uIG1ldGhvZDo6IGNsb25lKGZwKQorCisgICAgICBSZXR1cm4gYW4gaW5kZXBlbmRlbnQgY2xvbmUgb2YgdGhpcyA6Y2xhc3M6YEdlbmVyYXRvcmAgaW5zdGFuY2Ugd2l0aCB0aGUKKyAgICAgIGV4YWN0IHNhbWUgb3B0aW9ucywgYW5kICpmcCogYXMgdGhlIG5ldyAqb3V0ZnAqLgorCisKKyAgIC4uIG1ldGhvZDo6IHdyaXRlKHMpCisKKyAgICAgIFdyaXRlICpzKiB0byB0aGUgKndyaXRlKiBtZXRob2Qgb2YgdGhlICpvdXRmcCogcGFzc2VkIHRvIHRoZQorICAgICAgOmNsYXNzOmBHZW5lcmF0b3JgJ3MgY29uc3RydWN0b3IuICBUaGlzIHByb3ZpZGVzIGp1c3QgZW5vdWdoIGZpbGUtbGlrZQorICAgICAgQVBJIGZvciA6Y2xhc3M6YEdlbmVyYXRvcmAgaW5zdGFuY2VzIHRvIGJlIHVzZWQgaW4gdGhlIDpmdW5jOmBwcmludGAKKyAgICAgIGZ1bmN0aW9uLgorCisKK0FzIGEgY29udmVuaWVuY2UsIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlYCBwcm92aWRlcyB0aGUgbWV0aG9kcworOm1ldGg6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZS5hc19zdHJpbmdgIGFuZCBgYHN0cihhTWVzc2FnZSlgYCAoYS5rLmEuCis6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLl9fc3RyX19gKSwgd2hpY2ggc2ltcGxpZnkgdGhlIGdlbmVyYXRpb24gb2YKK2EgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1lc3NhZ2Ugb2JqZWN0LiAgRm9yIG1vcmUgZGV0YWlsLCBzZWUKKzptb2Q6YGVtYWlsLm1lc3NhZ2VgLgorCisKK1RoZSA6bW9kOmBlbWFpbC5nZW5lcmF0b3JgIG1vZHVsZSBhbHNvIHByb3ZpZGVzIGEgZGVyaXZlZCBjbGFzcywKKzpjbGFzczpgRGVjb2RlZEdlbmVyYXRvcmAsIHdoaWNoIGlzIGxpa2UgdGhlIDpjbGFzczpgR2VuZXJhdG9yYCBiYXNlIGNsYXNzLAorZXhjZXB0IHRoYXQgbm9uLVwgOm1pbWV0eXBlOmB0ZXh0YCBwYXJ0cyBhcmUgbm90IHNlcmlhbGl6ZWQsIGJ1dCBhcmUgaW5zdGVhZAorcmVwcmVzZW50ZWQgaW4gdGhlIG91dHB1dCBzdHJlYW0gYnkgYSBzdHJpbmcgZGVyaXZlZCBmcm9tIGEgdGVtcGxhdGUgZmlsbGVkCitpbiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJ0LgorCisuLiBjbGFzczo6IERlY29kZWRHZW5lcmF0b3Iob3V0ZnAsIG1hbmdsZV9mcm9tXz1Ob25lLCBtYXhoZWFkZXJsZW49Tm9uZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdD1Ob25lLCAqLCBwb2xpY3k9Tm9uZSkKKworICAgQWN0IGxpa2UgOmNsYXNzOmBHZW5lcmF0b3JgLCBleGNlcHQgdGhhdCBmb3IgYW55IHN1YnBhcnQgb2YgdGhlIG1lc3NhZ2UKKyAgIHBhc3NlZCB0byA6bWV0aDpgR2VuZXJhdG9yLmZsYXR0ZW5gLCBpZiB0aGUgc3VicGFydCBpcyBvZiBtYWluIHR5cGUKKyAgIDptaW1ldHlwZTpgdGV4dGAsIHByaW50IHRoZSBkZWNvZGVkIHBheWxvYWQgb2YgdGhlIHN1YnBhcnQsIGFuZCBpZiB0aGUgbWFpbgorICAgdHlwZSBpcyBub3QgOm1pbWV0eXBlOmB0ZXh0YCwgaW5zdGVhZCBvZiBwcmludGluZyBpdCBmaWxsIGluIHRoZSBzdHJpbmcKKyAgICpmbXQqIHVzaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIHBhcnQgYW5kIHByaW50IHRoZSByZXN1bHRpbmcKKyAgIGZpbGxlZC1pbiBzdHJpbmcuCisKKyAgIFRvIGZpbGwgaW4gKmZtdCosIGV4ZWN1dGUgYGBmbXQgJSBwYXJ0X2luZm9gYCwgd2hlcmUgYGBwYXJ0X2luZm9gYAorICAgaXMgYSBkaWN0aW9uYXJ5IGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcga2V5cyBhbmQgdmFsdWVzOgogCiAgICAqIGBgdHlwZWBgIC0tIEZ1bGwgTUlNRSB0eXBlIG9mIHRoZSBub24tXCA6bWltZXR5cGU6YHRleHRgIHBhcnQKIApAQCAtMjI1LDE1ICsyNTksMjEgQEAKIAogICAgKiBgYGVuY29kaW5nYGAgLS0gQ29udGVudCB0cmFuc2ZlciBlbmNvZGluZyBvZiB0aGUgbm9uLVwgOm1pbWV0eXBlOmB0ZXh0YCBwYXJ0CiAKLSAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciAqZm10KiBpcyBgYE5vbmVgYCwgbWVhbmluZyA6OgorICAgSWYgKmZtdCogaXMgYGBOb25lYGAsIHVzZSB0aGUgZm9sbG93aW5nIGRlZmF1bHQgKmZtdCo6CiAKLSAgICAgIFtOb24tdGV4dCAoJSh0eXBlKXMpIHBhcnQgb2YgbWVzc2FnZSBvbWl0dGVkLCBmaWxlbmFtZSAlKGZpbGVuYW1lKXNdCisgICAgICAiW05vbi10ZXh0ICglKHR5cGUpcykgcGFydCBvZiBtZXNzYWdlIG9taXR0ZWQsIGZpbGVuYW1lICUoZmlsZW5hbWUpc10iCisKKyAgIE9wdGlvbmFsICpfbWFuZ2xlX2Zyb21fKiBhbmQgKm1heGhlYWRlcmxlbiogYXJlIGFzIHdpdGggdGhlCisgICA6Y2xhc3M6YEdlbmVyYXRvcmAgYmFzZSBjbGFzcy4KIAogCiAuLiBydWJyaWM6OiBGb290bm90ZXMKIAotLi4gWyNdIFRoaXMgc3RhdGVtZW50IGFzc3VtZXMgdGhhdCB5b3UgdXNlIHRoZSBhcHByb3ByaWF0ZSBzZXR0aW5nIGZvciB0aGUKLSAgICAgICBgYHVuaXhmcm9tYGAgYXJndW1lbnQsIGFuZCB0aGF0IHlvdSBzZXQgbWF4aGVhZGVybGVuPTAgKHdoaWNoIHdpbGwKLSAgICAgICBwcmVzZXJ2ZSB3aGF0ZXZlciB0aGUgaW5wdXQgbGluZSBsZW5ndGhzIHdlcmUpLiAgSXQgaXMgYWxzbyBub3Qgc3RyaWN0bHkKLSAgICAgICB0cnVlLCBzaW5jZSBpbiBtYW55IGNhc2VzIHJ1bnMgb2Ygd2hpdGVzcGFjZSBpbiBoZWFkZXJzIGFyZSBjb2xsYXBzZWQKLSAgICAgICBpbnRvIHNpbmdsZSBibGFua3MuICBUaGUgbGF0dGVyIGlzIGEgYnVnIHRoYXQgd2lsbCBldmVudHVhbGx5IGJlIGZpeGVkLgorLi4gWyNdIFRoaXMgc3RhdGVtZW50IGFzc3VtZXMgdGhhdCB5b3UgdXNlIHRoZSBhcHByb3ByaWF0ZSBzZXR0aW5nIGZvcgorICAgICAgIGBgdW5peGZyb21gYCwgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIDptb2Q6YHBvbGljeWAgc2V0dGluZ3MgY2FsbGluZyBmb3IKKyAgICAgICBhdXRvbWF0aWMgYWRqdXN0bWVudHMgKGZvciBleGFtcGxlLAorICAgICAgIDphdHRyOmB+ZW1haWwucG9saWN5LlBvbGljeS5yZWZvbGRfc291cmNlYCBtdXN0IGJlIGBgbm9uZWBgLCB3aGljaCBpcworICAgICAgICpub3QqIHRoZSBkZWZhdWx0KS4gIEl0IGlzIGFsc28gbm90IDEwMCUgdHJ1ZSwgc2luY2UgaWYgdGhlIG1lc3NhZ2UKKyAgICAgICBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBSRkMgc3RhbmRhcmRzIG9jY2FzaW9uYWxseSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgICBleGFjdCBvcmlnaW5hbCB0ZXh0IGlzIGxvc3QgZHVyaW5nIHBhcnNpbmcgZXJyb3IgcmVjb3ZlcnkuICBJdCBpcyBhIGdvYWwKKyAgICAgICB0byBmaXggdGhlc2UgbGF0dGVyIGVkZ2UgY2FzZXMgd2hlbiBwb3NzaWJsZS4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2VtYWlsLmhlYWRlci5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC5oZWFkZXIucnN0CmluZGV4IGU5NDgzN2MuLjA3MTUyYzIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2VtYWlsLmhlYWRlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZW1haWwuaGVhZGVyLnJzdApAQCAtOCw2ICs4LDE0IEBACiAKIC0tLS0tLS0tLS0tLS0tCiAKK1RoaXMgbW9kdWxlIGlzIHBhcnQgb2YgdGhlIGxlZ2FjeSAoYGBDb21wYXQzMmBgKSBlbWFpbCBBUEkuICBJbiB0aGUgY3VycmVudCBBUEkKK2VuY29kaW5nIGFuZCBkZWNvZGluZyBvZiBoZWFkZXJzIGlzIGhhbmRsZWQgdHJhbnNwYXJlbnRseSBieSB0aGUKK2RpY3Rpb25hcnktbGlrZSBBUEkgb2YgdGhlIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlYCBjbGFzcy4gIEluCithZGRpdGlvbiB0byB1c2VzIGluIGxlZ2FjeSBjb2RlLCB0aGlzIG1vZHVsZSBjYW4gYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB0aGF0CituZWVkIHRvIGNvbXBsZXRlbHkgY29udHJvbCB0aGUgY2hhcmFjdGVyIHNldHMgdXNlZCB3aGVuIGVuY29kaW5nIGhlYWRlcnMuCisKK1RoZSByZW1haW5pbmcgdGV4dCBpbiB0aGlzIHNlY3Rpb24gaXMgdGhlIG9yaWdpbmFsIGRvY3VtZW50YXRpb24gb2YgdGhlIG1vZHVsZS4KKwogOnJmYzpgMjgyMmAgaXMgdGhlIGJhc2Ugc3RhbmRhcmQgdGhhdCBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiBlbWFpbCBtZXNzYWdlcy4KIEl0IGRlcml2ZXMgZnJvbSB0aGUgb2xkZXIgOnJmYzpgODIyYCBzdGFuZGFyZCB3aGljaCBjYW1lIGludG8gd2lkZXNwcmVhZCB1c2UgYXQKIGEgdGltZSB3aGVuIG1vc3QgZW1haWwgd2FzIGNvbXBvc2VkIG9mIEFTQ0lJIGNoYXJhY3RlcnMgb25seS4gIDpyZmM6YDI4MjJgIGlzIGEKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2VtYWlsLmhlYWRlcnJlZ2lzdHJ5LnJzdCBiL0RvYy9saWJyYXJ5L2VtYWlsLmhlYWRlcnJlZ2lzdHJ5LnJzdAppbmRleCAwNzA3YmQ4Li4yYzgzMGNmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9lbWFpbC5oZWFkZXJyZWdpc3RyeS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZW1haWwuaGVhZGVycmVnaXN0cnkucnN0CkBAIC03LDIwICs3LDEyIEBACiAuLiBtb2R1bGVhdXRob3I6OiBSLiBEYXZpZCBNdXJyYXkgPHJkbXVycmF5QGJpdGRhbmNlLmNvbT4KIC4uIHNlY3Rpb25hdXRob3I6OiBSLiBEYXZpZCBNdXJyYXkgPHJkbXVycmF5QGJpdGRhbmNlLmNvbT4KIAotLi4gdmVyc2lvbmFkZGVkOjogMy4zCi0gICBhcyBhIDp0ZXJtOmBwcm92aXNpb25hbCBtb2R1bGUgPHByb3Zpc2lvbmFsIHBhY2thZ2U+YC4KLQogKipTb3VyY2UgY29kZToqKiA6c291cmNlOmBMaWIvZW1haWwvaGVhZGVycmVnaXN0cnkucHlgCiAKLS4uIG5vdGU6OgotCi0gICBUaGUgaGVhZGVycmVnaXN0cnkgbW9kdWxlIGhhcyBiZWVuIGluY2x1ZGVkIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IG9uIGEKLSAgIDp0ZXJtOmBwcm92aXNpb25hbCBiYXNpcyA8cHJvdmlzaW9uYWwgcGFja2FnZT5gLiBCYWNrd2FyZHMgaW5jb21wYXRpYmxlCi0gICBjaGFuZ2VzICh1cCB0byBhbmQgaW5jbHVkaW5nIHJlbW92YWwgb2YgdGhlIG1vZHVsZSkgbWF5IG9jY3VyIGlmIGRlZW1lZAotICAgbmVjZXNzYXJ5IGJ5IHRoZSBjb3JlIGRldmVsb3BlcnMuCi0KIC0tLS0tLS0tLS0tLS0tCiAKKy4uIHZlcnNpb25hZGRlZDo6IDMuNiBbMV1fCisKIEhlYWRlcnMgYXJlIHJlcHJlc2VudGVkIGJ5IGN1c3RvbWl6ZWQgc3ViY2xhc3NlcyBvZiA6Y2xhc3M6YHN0cmAuICBUaGUKIHBhcnRpY3VsYXIgY2xhc3MgdXNlZCB0byByZXByZXNlbnQgYSBnaXZlbiBoZWFkZXIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKIDphdHRyOmB+ZW1haWwucG9saWN5LkVtYWlsUG9saWN5LmhlYWRlcl9mYWN0b3J5YCBvZiB0aGUgOm1vZDpgfmVtYWlsLnBvbGljeWAgaW4KQEAgLTg2LDEwICs3OCwxMSBAQAogICAgLi4gbWV0aG9kOjogZm9sZCgqLCBwb2xpY3kpCiAKICAgICAgIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIDphdHRyOmB+ZW1haWwucG9saWN5LlBvbGljeS5saW5lc2VwYAotICAgICAgY2hhcmFjdGVycyBhcyByZXF1aXJlZCB0byBjb3JyZWN0bHkgZm9sZCB0aGUgaGVhZGVyIGFjY29yZGluZwotICAgICAgdG8gKnBvbGljeSouICBBIDphdHRyOmB+ZW1haWwucG9saWN5LlBvbGljeS5jdGVfdHlwZWAgb2YKLSAgICAgIGBgOGJpdGBgIHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBpdCB3ZXJlIGBgN2JpdGBgLCBzaW5jZSBzdHJpbmdzCi0gICAgICBtYXkgbm90IGNvbnRhaW4gYmluYXJ5IGRhdGEuCisgICAgICBjaGFyYWN0ZXJzIGFzIHJlcXVpcmVkIHRvIGNvcnJlY3RseSBmb2xkIHRoZSBoZWFkZXIgYWNjb3JkaW5nIHRvCisgICAgICAqcG9saWN5Ki4gIEEgOmF0dHI6YH5lbWFpbC5wb2xpY3kuUG9saWN5LmN0ZV90eXBlYCBvZiBgYDhiaXRgYCB3aWxsIGJlCisgICAgICB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgYGA3Yml0YGAsIHNpbmNlIGhlYWRlcnMgbWF5IG5vdCBjb250YWluIGFyYml0cmFyeQorICAgICAgYmluYXJ5IGRhdGEuICBJZiA6YXR0cjpgfmVtYWlsLnBvbGljeS5FbWFpbFBvbGljeS51dGY4YCBpcyBgYEZhbHNlYGAsCisgICAgICBub24tQVNDSUkgZGF0YSB3aWxsIGJlIDpyZmM6YDIwNDdgIGVuY29kZWQuCiAKIAogICAgYGBCYXNlSGVhZGVyYGAgYnkgaXRzZWxmIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGhlYWRlciBvYmplY3QuICBJdApAQCAtMTA2LDcgKzk5LDcgQEAKICAgIHZhbHVlcyBmb3IgYXQgbGVhc3QgdGhlIGtleXMgYGBkZWNvZGVkYGAgYW5kIGBgZGVmZWN0c2BgLiAgYGBkZWNvZGVkYGAKICAgIHNob3VsZCBiZSB0aGUgc3RyaW5nIHZhbHVlIGZvciB0aGUgaGVhZGVyICh0aGF0IGlzLCB0aGUgaGVhZGVyIHZhbHVlIGZ1bGx5CiAgICBkZWNvZGVkIHRvIHVuaWNvZGUpLiAgVGhlIHBhcnNlIG1ldGhvZCBzaG91bGQgYXNzdW1lIHRoYXQgKnN0cmluZyogbWF5Ci0gICBjb250YWluIHRyYW5zcG9ydCBlbmNvZGVkIHBhcnRzLCBidXQgc2hvdWxkIGNvcnJlY3RseSBoYW5kbGUgYWxsIHZhbGlkCisgICBjb250YWluIGNvbnRlbnQtdHJhbnNmZXItZW5jb2RlZCBwYXJ0cywgYnV0IHNob3VsZCBjb3JyZWN0bHkgaGFuZGxlIGFsbCB2YWxpZAogICAgdW5pY29kZSBjaGFyYWN0ZXJzIGFzIHdlbGwgc28gdGhhdCBpdCBjYW4gcGFyc2UgdW4tZW5jb2RlZCBoZWFkZXIgdmFsdWVzLgogCiAgICBgYEJhc2VIZWFkZXJgYCdzIGBgX19uZXdfX2BgIHRoZW4gY3JlYXRlcyB0aGUgaGVhZGVyIGluc3RhbmNlLCBhbmQgY2FsbHMgaXRzCkBAIC0xMzUsMTEgKzEyOCwxMCBAQAogICAgbWVjaGFuaXNtIGZvciBlbmNvZGluZyBub24tQVNDSUkgdGV4dCBhcyBBU0NJSSBjaGFyYWN0ZXJzIHdpdGhpbiBhIGhlYWRlcgogICAgdmFsdWUuICBXaGVuIGEgKnZhbHVlKiBjb250YWluaW5nIGVuY29kZWQgd29yZHMgaXMgcGFzc2VkIHRvIHRoZQogICAgY29uc3RydWN0b3IsIHRoZSBgYFVuc3RydWN0dXJlZEhlYWRlcmBgIHBhcnNlciBjb252ZXJ0cyBzdWNoIGVuY29kZWQgd29yZHMKLSAgIGJhY2sgaW4gdG8gdGhlIG9yaWdpbmFsIHVuaWNvZGUsIGZvbGxvd2luZyB0aGUgOnJmYzpgMjA0N2AgcnVsZXMgZm9yCi0gICB1bnN0cnVjdHVyZWQgdGV4dC4gIFRoZSBwYXJzZXIgdXNlcyBoZXVyaXN0aWNzIHRvIGF0dGVtcHQgdG8gZGVjb2RlIGNlcnRhaW4KLSAgIG5vbi1jb21wbGlhbnQgZW5jb2RlZCB3b3Jkcy4gIERlZmVjdHMgYXJlIHJlZ2lzdGVyZWQgaW4gc3VjaCBjYXNlcywgYXMgd2VsbAotICAgYXMgZGVmZWN0cyBmb3IgaXNzdWVzIHN1Y2ggYXMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgZW5jb2RlZCB3b3JkcyBvcgotICAgdGhlIG5vbi1lbmNvZGVkIHRleHQuCisgICBpbnRvIHVuaWNvZGUsIGZvbGxvd2luZyB0aGUgOnJmYzpgMjA0N2AgcnVsZXMgZm9yIHVuc3RydWN0dXJlZCB0ZXh0LiAgVGhlCisgICBwYXJzZXIgdXNlcyBoZXVyaXN0aWNzIHRvIGF0dGVtcHQgdG8gZGVjb2RlIGNlcnRhaW4gbm9uLWNvbXBsaWFudCBlbmNvZGVkCisgICB3b3Jkcy4gIERlZmVjdHMgYXJlIHJlZ2lzdGVyZWQgaW4gc3VjaCBjYXNlcywgYXMgd2VsbCBhcyBkZWZlY3RzIGZvciBpc3N1ZXMKKyAgIHN1Y2ggYXMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgZW5jb2RlZCB3b3JkcyBvciB0aGUgbm9uLWVuY29kZWQgdGV4dC4KIAogICAgVGhpcyBoZWFkZXIgdHlwZSBwcm92aWRlcyBubyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMuCiAKQEAgLTIxMywxNSArMjA1LDE2IEBACiAgICAgICB0aGUgbGlzdCBvZiBhZGRyZXNzZXMgaXMgImZsYXR0ZW5lZCIgaW50byBhIG9uZSBkaW1lbnNpb25hbCBsaXN0KS4KIAogICAgVGhlIGBgZGVjb2RlZGBgIHZhbHVlIG9mIHRoZSBoZWFkZXIgd2lsbCBoYXZlIGFsbCBlbmNvZGVkIHdvcmRzIGRlY29kZWQgdG8KLSAgIHVuaWNvZGUuICA6Y2xhc3M6YH5lbmNvZGluZ3MuaWRuYWAgZW5jb2RlZCBkb21haW4gbmFtZXMgYXJlIGFsc28gZGVjb2RlZCB0byB1bmljb2RlLiAgVGhlCi0gICBgYGRlY29kZWRgYCB2YWx1ZSBpcyBzZXQgYnkgOmF0dHI6YH5zdHIuam9pbmBcIGluZyB0aGUgOmNsYXNzOmBzdHJgIHZhbHVlIG9mCi0gICB0aGUgZWxlbWVudHMgb2YgdGhlIGBgZ3JvdXBzYGAgYXR0cmlidXRlIHdpdGggYGAnLCAnYGAuCisgICB1bmljb2RlLiAgOmNsYXNzOmB+ZW5jb2RpbmdzLmlkbmFgIGVuY29kZWQgZG9tYWluIG5hbWVzIGFyZSBhbHNvIGRlY29kZWQgdG8KKyAgIHVuaWNvZGUuICBUaGUgYGBkZWNvZGVkYGAgdmFsdWUgaXMgc2V0IGJ5IDphdHRyOmB+c3RyLmpvaW5gXCBpbmcgdGhlCisgICA6Y2xhc3M6YHN0cmAgdmFsdWUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBgYGdyb3Vwc2BgIGF0dHJpYnV0ZSB3aXRoIGBgJywKKyAgICdgYC4KIAogICAgQSBsaXN0IG9mIDpjbGFzczpgLkFkZHJlc3NgIGFuZCA6Y2xhc3M6YC5Hcm91cGAgb2JqZWN0cyBpbiBhbnkgY29tYmluYXRpb24KICAgIG1heSBiZSB1c2VkIHRvIHNldCB0aGUgdmFsdWUgb2YgYW4gYWRkcmVzcyBoZWFkZXIuICBgYEdyb3VwYGAgb2JqZWN0cyB3aG9zZQogICAgYGBkaXNwbGF5X25hbWVgYCBpcyBgYE5vbmVgYCB3aWxsIGJlIGludGVycHJldGVkIGFzIHNpbmdsZSBhZGRyZXNzZXMsIHdoaWNoCiAgICBhbGxvd3MgYW4gYWRkcmVzcyBsaXN0IHRvIGJlIGNvcGllZCB3aXRoIGdyb3VwcyBpbnRhY3QgYnkgdXNpbmcgdGhlIGxpc3QKLSAgIG9idGFpbmVkIGBgZ3JvdXBzYGAgYXR0cmlidXRlIG9mIHRoZSBzb3VyY2UgaGVhZGVyLgorICAgb2J0YWluZWQgZnJvbSB0aGUgYGBncm91cHNgYCBhdHRyaWJ1dGUgb2YgdGhlIHNvdXJjZSBoZWFkZXIuCiAKIAogLi4gY2xhc3M6OiBTaW5nbGVBZGRyZXNzSGVhZGVyCkBAIC0yNjcsNyArMjYwLDcgQEAKIAogLi4gY2xhc3M6OiBQYXJhbWV0ZXJpemVkTUlNRUhlYWRlcgogCi0gICAgTU9NRSBoZWFkZXJzIGFsbCBzdGFydCB3aXRoIHRoZSBwcmVmaXggJ0NvbnRlbnQtJy4gIEVhY2ggc3BlY2lmaWMgaGVhZGVyIGhhcworICAgIE1JTUUgaGVhZGVycyBhbGwgc3RhcnQgd2l0aCB0aGUgcHJlZml4ICdDb250ZW50LScuICBFYWNoIHNwZWNpZmljIGhlYWRlciBoYXMKICAgICBhIGNlcnRhaW4gdmFsdWUsIGRlc2NyaWJlZCB1bmRlciB0aGUgY2xhc3MgZm9yIHRoYXQgaGVhZGVyLiAgU29tZSBjYW4KICAgICBhbHNvIHRha2UgYSBsaXN0IG9mIHN1cHBsZW1lbnRhbCBwYXJhbWV0ZXJzLCB3aGljaCBoYXZlIGEgY29tbW9uIGZvcm1hdC4KICAgICBUaGlzIGNsYXNzIHNlcnZlcyBhcyBhIGJhc2UgZm9yIGFsbCB0aGUgTUlNRSBoZWFkZXJzIHRoYXQgdGFrZSBwYXJhbWV0ZXJzLgpAQCAtNDU0LDMgKzQ0Nyw5IEBACiAgICAgICBgYGRpc3BsYXlfbmFtZWBgIGlzIG5vbmUgYW5kIHRoZXJlIGlzIGEgc2luZ2xlIGBgQWRkcmVzc2BgIGluIHRoZQogICAgICAgYGBhZGRyZXNzZXNgYCBsaXN0LCB0aGUgYGBzdHJgYCB2YWx1ZSB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBgYHN0cmBgIG9mCiAgICAgICB0aGF0IHNpbmdsZSBgYEFkZHJlc3NgYC4KKworCisuLiBydWJyaWM6OiBGb290bm90ZXMKKworLi4gWzFdIE9yaW5nYWxseSBhZGRlZCBpbiAzLjMgYXMgYSA6dGVybTpgcHJvdmlzaW9uYWwgbW9kdWxlIDxwcm92aXNpb25hbAorICAgICAgIHBhY2thZ2U+YApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwubWVzc2FnZS5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC5tZXNzYWdlLnJzdAppbmRleCAyOTA3OTc1Li45NTEzNmQyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9lbWFpbC5tZXNzYWdlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC5tZXNzYWdlLnJzdApAQCAtMyw5MSArMywxMDIgQEAKIAogLi4gbW9kdWxlOjogZW1haWwubWVzc2FnZQogICAgOnN5bm9wc2lzOiBUaGUgYmFzZSBjbGFzcyByZXByZXNlbnRpbmcgZW1haWwgbWVzc2FnZXMuCisuLiBtb2R1bGVhdXRob3I6OiBSLiBEYXZpZCBNdXJyYXkgPHJkbXVycmF5QGJpdGRhbmNlLmNvbT4KKy4uIHNlY3Rpb25hdXRob3I6OiBSLiBEYXZpZCBNdXJyYXkgPHJkbXVycmF5QGJpdGRhbmNlLmNvbT4sCisgICAgICAgICAgICAgICAgICAgQmFycnkgQS4gV2Fyc2F3IDxiYXJyeUBweXRob24ub3JnPgogCiAqKlNvdXJjZSBjb2RlOioqIDpzb3VyY2U6YExpYi9lbWFpbC9tZXNzYWdlLnB5YAogCiAtLS0tLS0tLS0tLS0tLQogCi1UaGUgY2VudHJhbCBjbGFzcyBpbiB0aGUgOm1vZDpgZW1haWxgIHBhY2thZ2UgaXMgdGhlIDpjbGFzczpgTWVzc2FnZWAgY2xhc3MsCi1pbXBvcnRlZCBmcm9tIHRoZSA6bW9kOmBlbWFpbC5tZXNzYWdlYCBtb2R1bGUuICBJdCBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlCi06bW9kOmBlbWFpbGAgb2JqZWN0IG1vZGVsLiAgOmNsYXNzOmBNZXNzYWdlYCBwcm92aWRlcyB0aGUgY29yZSBmdW5jdGlvbmFsaXR5IGZvcgotc2V0dGluZyBhbmQgcXVlcnlpbmcgaGVhZGVyIGZpZWxkcywgYW5kIGZvciBhY2Nlc3NpbmcgbWVzc2FnZSBib2RpZXMuCisuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYgWzFdXwogCi1Db25jZXB0dWFsbHksIGEgOmNsYXNzOmBNZXNzYWdlYCBvYmplY3QgY29uc2lzdHMgb2YgKmhlYWRlcnMqIGFuZCAqcGF5bG9hZHMqLgotSGVhZGVycyBhcmUgOnJmYzpgMjgyMmAgc3R5bGUgZmllbGQgbmFtZXMgYW5kIHZhbHVlcyB3aGVyZSB0aGUgZmllbGQgbmFtZSBhbmQKLXZhbHVlIGFyZSBzZXBhcmF0ZWQgYnkgYSBjb2xvbi4gIFRoZSBjb2xvbiBpcyBub3QgcGFydCBvZiBlaXRoZXIgdGhlIGZpZWxkIG5hbWUKLW9yIHRoZSBmaWVsZCB2YWx1ZS4KK1RoZSBjZW50cmFsIGNsYXNzIGluIHRoZSA6bW9kOmBlbWFpbGAgcGFja2FnZSBpcyB0aGUgOmNsYXNzOmBFbWFpbE1lc3NhZ2VgCitjbGFzcywgaW1wb3J0ZWQgZnJvbSB0aGUgOm1vZDpgZW1haWwubWVzc2FnZWAgbW9kdWxlLiAgSXQgaXMgdGhlIGJhc2UgY2xhc3MgZm9yCit0aGUgOm1vZDpgZW1haWxgIG9iamVjdCBtb2RlbC4gIDpjbGFzczpgRW1haWxNZXNzYWdlYCBwcm92aWRlcyB0aGUgY29yZQorZnVuY3Rpb25hbGl0eSBmb3Igc2V0dGluZyBhbmQgcXVlcnlpbmcgaGVhZGVyIGZpZWxkcywgZm9yIGFjY2Vzc2luZyBtZXNzYWdlCitib2RpZXMsIGFuZCBmb3IgY3JlYXRpbmcgb3IgbW9kaWZ5aW5nIHN0cnVjdHVyZWQgbWVzc2FnZXMuCiAKLUhlYWRlcnMgYXJlIHN0b3JlZCBhbmQgcmV0dXJuZWQgaW4gY2FzZS1wcmVzZXJ2aW5nIGZvcm0gYnV0IGFyZSBtYXRjaGVkCi1jYXNlLWluc2Vuc2l0aXZlbHkuICBUaGVyZSBtYXkgYWxzbyBiZSBhIHNpbmdsZSBlbnZlbG9wZSBoZWFkZXIsIGFsc28ga25vd24gYXMKLXRoZSAqVW5peC1Gcm9tKiBoZWFkZXIgb3IgdGhlIGBgRnJvbV9gYCBoZWFkZXIuICBUaGUgcGF5bG9hZCBpcyBlaXRoZXIgYSBzdHJpbmcKLWluIHRoZSBjYXNlIG9mIHNpbXBsZSBtZXNzYWdlIG9iamVjdHMgb3IgYSBsaXN0IG9mIDpjbGFzczpgTWVzc2FnZWAgb2JqZWN0cyBmb3IKLU1JTUUgY29udGFpbmVyIGRvY3VtZW50cyAoZS5nLiA6bWltZXR5cGU6YG11bHRpcGFydC9cKmAgYW5kCi06bWltZXR5cGU6YG1lc3NhZ2UvcmZjODIyYCkuCitBbiBlbWFpbCBtZXNzYWdlIGNvbnNpc3RzIG9mICpoZWFkZXJzKiBhbmQgYSAqcGF5bG9hZCogKHdoaWNoIGlzIGFsc28gcmVmZXJyZWQKK3RvIGFzIHRoZSAqY29udGVudCopLiAgSGVhZGVycyBhcmUgOnJmYzpgNTMyMmAgb3IgOnJmYzpgNjUzMmAgc3R5bGUgZmllbGQgbmFtZXMKK2FuZCB2YWx1ZXMsIHdoZXJlIHRoZSBmaWVsZCBuYW1lIGFuZCB2YWx1ZSBhcmUgc2VwYXJhdGVkIGJ5IGEgY29sb24uICBUaGUgY29sb24KK2lzIG5vdCBwYXJ0IG9mIGVpdGhlciB0aGUgZmllbGQgbmFtZSBvciB0aGUgZmllbGQgdmFsdWUuICBUaGUgcGF5bG9hZCBtYXkgYmUgYQorc2ltcGxlIHRleHQgbWVzc2FnZSwgb3IgYSBiaW5hcnkgb2JqZWN0LCBvciBhIHN0cnVjdHVyZWQgc2VxdWVuY2Ugb2YKK3N1Yi1tZXNzYWdlcyBlYWNoIHdpdGggdGhlaXIgb3duIHNldCBvZiBoZWFkZXJzIGFuZCB0aGVpciBvd24gcGF5bG9hZC4gIFRoZQorbGF0dGVyIHR5cGUgb2YgcGF5bG9hZCBpcyBpbmRpY2F0ZWQgYnkgdGhlIG1lc3NhZ2UgaGF2aW5nIGEgTUlNRSB0eXBlIHN1Y2ggYXMKKzptaW1ldHlwZTpgbXVsdGlwYXJ0L1wqYCBvciA6bWltZXR5cGU6YG1lc3NhZ2UvcmZjODIyYC4KIAotOmNsYXNzOmBNZXNzYWdlYCBvYmplY3RzIHByb3ZpZGUgYSBtYXBwaW5nIHN0eWxlIGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIHRoZQotbWVzc2FnZSBoZWFkZXJzLCBhbmQgYW4gZXhwbGljaXQgaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgYm90aCB0aGUgaGVhZGVycyBhbmQKLXRoZSBwYXlsb2FkLiAgSXQgcHJvdmlkZXMgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZ2VuZXJhdGluZyBhIGZsYXQgdGV4dAotcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2Ugb2JqZWN0IHRyZWUsIGZvciBhY2Nlc3NpbmcgY29tbW9ubHkgdXNlZCBoZWFkZXIKLXBhcmFtZXRlcnMsIGFuZCBmb3IgcmVjdXJzaXZlbHkgd2Fsa2luZyBvdmVyIHRoZSBvYmplY3QgdHJlZS4KK1RoZSBjb25jZXB0dWFsIG1vZGVsIHByb3ZpZGVkIGJ5IGFuIDpjbGFzczpgRW1haWxNZXNzYWdlYCBvYmplY3QgaXMgdGhhdCBvZiBhbgorb3JkZXJlZCBkaWN0aW9uYXJ5IG9mIGhlYWRlcnMgY291cGxlZCB3aXRoIGEgKnBheWxvYWQqIHRoYXQgcmVwcmVzZW50cyB0aGUKKzpyZmM6YDUzMjJgIGJvZHkgb2YgdGhlIG1lc3NhZ2UsIHdoaWNoIG1pZ2h0IGJlIGEgbGlzdCBvZiBzdWItYGBFbWFpbE1lc3NhZ2VgYAorb2JqZWN0cy4gIEluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwgZGljdGlvbmFyeSBtZXRob2RzIGZvciBhY2Nlc3NpbmcgdGhlIGhlYWRlcgorbmFtZXMgYW5kIHZhbHVlcywgdGhlcmUgYXJlIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBzcGVjaWFsaXplZCBpbmZvcm1hdGlvbiBmcm9tCit0aGUgaGVhZGVycyAoZm9yIGV4YW1wbGUgdGhlIE1JTUUgY29udGVudCB0eXBlKSwgZm9yIG9wZXJhdGluZyBvbiB0aGUgcGF5bG9hZCwKK2ZvciBnZW5lcmF0aW5nIGEgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlLCBhbmQgZm9yIHJlY3Vyc2l2ZWx5IHdhbGtpbmcKK292ZXIgdGhlIG9iamVjdCB0cmVlLgogCi1IZXJlIGFyZSB0aGUgbWV0aG9kcyBvZiB0aGUgOmNsYXNzOmBNZXNzYWdlYCBjbGFzczoKK1RoZSA6Y2xhc3M6YEVtYWlsTWVzc2FnZWAgZGljdGlvbmFyeS1saWtlIGludGVyZmFjZSBpcyBpbmRleGVkIGJ5IHRoZSBoZWFkZXIKK25hbWVzLCB3aGljaCBtdXN0IGJlIEFTQ0lJIHZhbHVlcy4gIFRoZSB2YWx1ZXMgb2YgdGhlIGRpY3Rpb25hcnkgYXJlIHN0cmluZ3MKK3dpdGggc29tZSBleHRyYSBtZXRob2RzLiAgSGVhZGVycyBhcmUgc3RvcmVkIGFuZCByZXR1cm5lZCBpbiBjYXNlLXByZXNlcnZpbmcKK2Zvcm0sIGJ1dCBmaWVsZCBuYW1lcyBhcmUgbWF0Y2hlZCBjYXNlLWluc2Vuc2l0aXZlbHkuICBVbmxpa2UgYSByZWFsIGRpY3QsCit0aGVyZSBpcyBhbiBvcmRlcmluZyB0byB0aGUga2V5cywgYW5kIHRoZXJlIGNhbiBiZSBkdXBsaWNhdGUga2V5cy4gIEFkZGl0aW9uYWwKK21ldGhvZHMgYXJlIHByb3ZpZGVkIGZvciB3b3JraW5nIHdpdGggaGVhZGVycyB0aGF0IGhhdmUgZHVwbGljYXRlIGtleXMuCisKK1RoZSAqcGF5bG9hZCogaXMgZWl0aGVyIGEgc3RyaW5nIG9yIGJ5dGVzIG9iamVjdCwgaW4gdGhlIGNhc2Ugb2Ygc2ltcGxlIG1lc3NhZ2UKK29iamVjdHMsIG9yIGEgbGlzdCBvZiA6Y2xhc3M6YEVtYWlsTWVzc2FnZWAgb2JqZWN0cywgZm9yIE1JTUUgY29udGFpbmVyCitkb2N1bWVudHMgc3VjaCBhcyA6bWltZXR5cGU6YG11bHRpcGFydC9cKmAgYW5kIDptaW1ldHlwZTpgbWVzc2FnZS9yZmM4MjJgCittZXNzYWdlIG9iamVjdHMuCiAKIAotLi4gY2xhc3M6OiBNZXNzYWdlKHBvbGljeT1jb21wYXQzMikKKy4uIGNsYXNzOjogRW1haWxNZXNzYWdlKHBvbGljeT1kZWZhdWx0KQogCi0gICBJZiAqcG9saWN5KiBpcyBzcGVjaWZpZWQgKGl0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgYSA6bW9kOmB+ZW1haWwucG9saWN5YAotICAgY2xhc3MpIHVzZSB0aGUgcnVsZXMgaXQgc3BlY2lmaWVzIHRvIHVwZGF0ZSBhbmQgc2VyaWFsaXplIHRoZSByZXByZXNlbnRhdGlvbgotICAgb2YgdGhlIG1lc3NhZ2UuICBJZiAqcG9saWN5KiBpcyBub3Qgc2V0LCB1c2UgdGhlIDpjbGFzczpgY29tcGF0MzIKLSAgIDxlbWFpbC5wb2xpY3kuQ29tcGF0MzI+YCBwb2xpY3ksIHdoaWNoIG1haW50YWlucyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGgKLSAgIHRoZSBQeXRob24gMy4yIHZlcnNpb24gb2YgdGhlIGVtYWlsIHBhY2thZ2UuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlCisgICBJZiAqcG9saWN5KiBpcyBzcGVjaWZpZWQgdXNlIHRoZSBydWxlcyBpdCBzcGVjaWZpZXMgdG8gdWRwYXRlIGFuZCBzZXJpYWxpemUKKyAgIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZS4gIElmICpwb2xpY3kqIGlzIG5vdCBzZXQsIHVzZSB0aGUKKyAgIDpjbGFzczpgfmVtYWlsLnBvbGljeS5kZWZhdWx0YCBwb2xpY3ksIHdoaWNoIGZvbGxvd3MgdGhlIHJ1bGVzIG9mIHRoZSBlbWFpbAorICAgUkZDcyBleGNlcHQgZm9yIGxpbmUgZW5kaW5ncyAoaW5zdGVhZCBvZiB0aGUgUkZDIG1hbmRhdGVkIGBgXHJcbmBgLCBpdCB1c2VzCisgICB0aGUgUHl0aG9uIHN0YW5kYXJkIGBgXG5gYCBsaW5lIGVuZGluZ3MpLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZQogICAgOm1vZDpgfmVtYWlsLnBvbGljeWAgZG9jdW1lbnRhdGlvbi4KIAotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMgVGhlICpwb2xpY3kqIGtleXdvcmQgYXJndW1lbnQgd2FzIGFkZGVkLgorICAgLi4gbWV0aG9kOjogYXNfc3RyaW5nKHVuaXhmcm9tPUZhbHNlLCBtYXhoZWFkZXJsZW49Tm9uZSwgcG9saWN5PU5vbmUpCiAKKyAgICAgIFJldHVybiB0aGUgZW50aXJlIG1lc3NhZ2UgZmxhdHRlbmVkIGFzIGEgc3RyaW5nLiAgV2hlbiBvcHRpb25hbAorICAgICAgKnVuaXhmcm9tKiBpcyB0cnVlLCB0aGUgZW52ZWxvcGUgaGVhZGVyIGlzIGluY2x1ZGVkIGluIHRoZSByZXR1cm5lZAorICAgICAgc3RyaW5nLiAgKnVuaXhmcm9tKiBkZWZhdWx0cyB0byBgYEZhbHNlYGAuICBGb3IgYmFja3dhcmQgY29tcGFiaXRpbGl0eQorICAgICAgd2l0aCB0aGUgYmFzZSA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGNsYXNzICptYXhoZWFkZXJsZW4qIGlzCisgICAgICBhY2NlcHRlZCwgYnV0IGRlZmF1bHRzIHRvIGBgTm9uZWBgLCB3aGljaCBtZWFucyB0aGF0IGJ5IGRlZmF1bHQgdGhlIGxpbmUKKyAgICAgIGxlbmd0aCBpcyBjb250cm9sbGVkIGJ5IHRoZQorICAgICAgOmF0dHI6YH5lbWFpbC5wb2xpY3kuRW1haWxQb2xpY3kubWF4X2xpbmVfbGVuZ3RoYCBvZiB0aGUgcG9saWN5LiAgVGhlCisgICAgICAqcG9saWN5KiBhcmd1bWVudCBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBwb2xpY3kgb2J0YWluZWQKKyAgICAgIGZyb20gdGhlIG1lc3NhZ2UgaW5zdGFuY2UuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgc29tZSBvZiB0aGUKKyAgICAgIGZvcm1hdHRpbmcgcHJvZHVjZWQgYnkgdGhlIG1ldGhvZCwgc2luY2UgdGhlIHNwZWNpZmllZCAqcG9saWN5KiB3aWxsIGJlCisgICAgICBwYXNzZWQgdG8gdGhlIDpjbGFzczpgfmVtYWlsLmdlbmVyYXRvci5HZW5lcmF0b3JgLgogCi0gICAuLiBtZXRob2Q6OiBhc19zdHJpbmcodW5peGZyb209RmFsc2UsIG1heGhlYWRlcmxlbj0wLCBwb2xpY3k9Tm9uZSkKKyAgICAgIEZsYXR0ZW5pbmcgdGhlIG1lc3NhZ2UgbWF5IHRyaWdnZXIgY2hhbmdlcyB0byB0aGUgOmNsYXNzOmBFbWFpbE1lc3NhZ2VgCisgICAgICBpZiBkZWZhdWx0cyBuZWVkIHRvIGJlIGZpbGxlZCBpbiB0byBjb21wbGV0ZSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYQorICAgICAgc3RyaW5nIChmb3IgZXhhbXBsZSwgTUlNRSBib3VuZGFyaWVzIG1heSBiZSBnZW5lcmF0ZWQgb3IgbW9kaWZpZWQpLgogCi0gICAgICBSZXR1cm4gdGhlIGVudGlyZSBtZXNzYWdlIGZsYXR0ZW5lZCBhcyBhIHN0cmluZy4gIFdoZW4gb3B0aW9uYWwgKnVuaXhmcm9tKgotICAgICAgaXMgdHJ1ZSwgdGhlIGVudmVsb3BlIGhlYWRlciBpcyBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nLgotICAgICAgKnVuaXhmcm9tKiBkZWZhdWx0cyB0byBgYEZhbHNlYGAuICBGb3IgYmFja3dhcmQgY29tcGFiaXRpbGl0eSByZWFzb25zLAotICAgICAgKm1heGhlYWRlcmxlbiogZGVmYXVsdHMgdG8gYGAwYGAsIHNvIGlmIHlvdSB3YW50IGEgZGlmZmVyZW50IHZhbHVlIHlvdQotICAgICAgbXVzdCBvdmVycmlkZSBpdCBleHBsaWNpdGx5ICh0aGUgdmFsdWUgc3BlY2lmaWVkIGZvciAqbWF4X2xpbmVfbGVuZ3RoKiBpbgotICAgICAgdGhlIHBvbGljeSB3aWxsIGJlIGlnbm9yZWQgYnkgdGhpcyBtZXRob2QpLiAgVGhlICpwb2xpY3kqIGFyZ3VtZW50IG1heSBiZQotICAgICAgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBwb2xpY3kgb2J0YWluZWQgZnJvbSB0aGUgbWVzc2FnZSBpbnN0YW5jZS4KLSAgICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCBzb21lIG9mIHRoZSBmb3JtYXR0aW5nIHByb2R1Y2VkIGJ5IHRoZQotICAgICAgbWV0aG9kLCBzaW5jZSB0aGUgc3BlY2lmaWVkICpwb2xpY3kqIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBgYEdlbmVyYXRvcmBgLgorICAgICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgYW5kIG1heSBub3QgYmUgdGhlCisgICAgICBtb3N0IHVzZWZ1bCB3YXkgdG8gc2VyaWFsaXplIG1lc3NhZ2VzIGluIHlvdXIgYXBwbGljYXRpb24sIGVzcGVjaWFsbHkgaWYKKyAgICAgIHlvdSBhcmUgZGVhbGluZyB3aXRoIG11bHRpcGxlIG1lc3NhZ2VzLiAgU2VlCisgICAgICA6Y2xhc3M6YGVtYWlsLmdlbmVyYXRvci5HZW5lcmF0b3JgIGZvciBhIG1vcmUgZmxleGlibGUgQVBJIGZvcgorICAgICAgc2VyaWFsaXppbmcgbWVzc2FnZXMuICBOb3RlIGFsc28gdGhhdCB0aGlzIG1ldGhvZCBpcyByZXN0cmljdGVkIHRvCisgICAgICBwcm9kdWNpbmcgbWVzc2FnZXMgc2VyaWFsaXplZCBhcyAiNyBiaXQgY2xlYW4iIHdoZW4KKyAgICAgIDphdHRyOmB+ZW1haWwucG9saWN5LkVtYWlsUG9saWN5LnV0ZjhgIGlzIGBgRmFsc2VgYCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCiAKLSAgICAgIEZsYXR0ZW5pbmcgdGhlIG1lc3NhZ2UgbWF5IHRyaWdnZXIgY2hhbmdlcyB0byB0aGUgOmNsYXNzOmBNZXNzYWdlYCBpZgotICAgICAgZGVmYXVsdHMgbmVlZCB0byBiZSBmaWxsZWQgaW4gdG8gY29tcGxldGUgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGEgc3RyaW5nCi0gICAgICAoZm9yIGV4YW1wbGUsIE1JTUUgYm91bmRhcmllcyBtYXkgYmUgZ2VuZXJhdGVkIG9yIG1vZGlmaWVkKS4KLQotICAgICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgYW5kIG1heSBub3QgYWx3YXlzCi0gICAgICBmb3JtYXQgdGhlIG1lc3NhZ2UgdGhlIHdheSB5b3Ugd2FudC4gIEZvciBleGFtcGxlLCBieSBkZWZhdWx0IGl0IGRvZXMKLSAgICAgIG5vdCBkbyB0aGUgbWFuZ2xpbmcgb2YgbGluZXMgdGhhdCBiZWdpbiB3aXRoIGBgRnJvbWBgIHRoYXQgaXMKLSAgICAgIHJlcXVpcmVkIGJ5IHRoZSB1bml4IG1ib3ggZm9ybWF0LiAgRm9yIG1vcmUgZmxleGliaWxpdHksIGluc3RhbnRpYXRlIGEKLSAgICAgIDpjbGFzczpgfmVtYWlsLmdlbmVyYXRvci5HZW5lcmF0b3JgIGluc3RhbmNlIGFuZCB1c2UgaXRzCi0gICAgICA6bWV0aDpgfmVtYWlsLmdlbmVyYXRvci5HZW5lcmF0b3IuZmxhdHRlbmAgbWV0aG9kIGRpcmVjdGx5LiAgRm9yIGV4YW1wbGU6OgotCi0gICAgICAgICBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwotICAgICAgICAgZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEdlbmVyYXRvcgotICAgICAgICAgZnAgPSBTdHJpbmdJTygpCi0gICAgICAgICBnID0gR2VuZXJhdG9yKGZwLCBtYW5nbGVfZnJvbV89VHJ1ZSwgbWF4aGVhZGVybGVuPTYwKQotICAgICAgICAgZy5mbGF0dGVuKG1zZykKLSAgICAgICAgIHRleHQgPSBmcC5nZXR2YWx1ZSgpCi0KLSAgICAgIElmIHRoZSBtZXNzYWdlIG9iamVjdCBjb250YWlucyBiaW5hcnkgZGF0YSB0aGF0IGlzIG5vdCBlbmNvZGVkIGFjY29yZGluZwotICAgICAgdG8gUkZDIHN0YW5kYXJkcywgdGhlIG5vbi1jb21wbGlhbnQgZGF0YSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHVuaWNvZGUKLSAgICAgICJ1bmtub3duIGNoYXJhY3RlciIgY29kZSBwb2ludHMuICAoU2VlIGFsc28gOm1ldGg6YC5hc19ieXRlc2AgYW5kCi0gICAgICA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuQnl0ZXNHZW5lcmF0b3JgLikKLQotICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjQgdGhlICpwb2xpY3kqIGtleXdvcmQgYXJndW1lbnQgd2FzIGFkZGVkLgorICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYgdGhlIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAqbWF4aGVhZGVybGVuKgorICAgICAgICAgaXMgbm90IHNwZWNpZmllZCB3YXMgY2hhbmdlZCBmcm9tIGRlZmF1bHRpbmcgdG8gMCB0byBkZWZhdWx0aW5nCisgICAgICAgICB0byB0aGUgdmFsdWUgb2YgKm1heF9saW5lX2xlbmd0aCogZnJvbSB0aGUgcG9saWN5LgogCiAKICAgIC4uIG1ldGhvZDo6IF9fc3RyX18oKQogCi0gICAgICBFcXVpdmFsZW50IHRvIDptZXRoOmAuYXNfc3RyaW5nKClgLiAgQWxsb3dzIGBgc3RyKG1zZylgYCB0byBwcm9kdWNlIGEKLSAgICAgIHN0cmluZyBjb250YWluaW5nIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KKyAgICAgIEVxdWl2YWxlbnQgdG8gYGFzX3N0cmluZyhwb2xpY3k9c2VsZi5wb2xpY3kuY2xvbmUodXRmOD1UcnVlKWAuICBBbGxvd3MKKyAgICAgIGBgc3RyKG1zZylgYCB0byBwcm9kdWNlIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNlcmlhbGl6ZWQgbWVzc2FnZSBpbiBhCisgICAgICByZWFkYWJsZSBmb3JtYXQuCisKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy40IHRoZSBtZXRob2Qgd2FzIGNoYW5nZWQgdG8gdXNlIGBgdXRmOD1UcnVlYGAsCisgICAgICAgICB0aHVzIHByb2R1Y2luZyBhbiA6cmZjOmA2NTMxYC1saWtlIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24sIGluc3RlYWQgb2YKKyAgICAgICAgIGJlaW5nIGEgZGlyZWN0IGFsaWFzIGZvciA6bWV0aDpgYXNfc3RyaW5nYC4KIAogCiAgICAuLiBtZXRob2Q6OiBhc19ieXRlcyh1bml4ZnJvbT1GYWxzZSwgcG9saWN5PU5vbmUpCkBAIC05OCw1MiArMTA5LDQyIEBACiAgICAgICB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHBvbGljeSBvYnRhaW5lZCBmcm9tIHRoZSBtZXNzYWdlIGluc3RhbmNlLgogICAgICAgVGhpcyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHNvbWUgb2YgdGhlIGZvcm1hdHRpbmcgcHJvZHVjZWQgYnkgdGhlCiAgICAgICBtZXRob2QsIHNpbmNlIHRoZSBzcGVjaWZpZWQgKnBvbGljeSogd2lsbCBiZSBwYXNzZWQgdG8gdGhlCi0gICAgICBgYEJ5dGVzR2VuZXJhdG9yYGAuCisgICAgICA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuQnl0ZXNHZW5lcmF0b3JgLgogCi0gICAgICBGbGF0dGVuaW5nIHRoZSBtZXNzYWdlIG1heSB0cmlnZ2VyIGNoYW5nZXMgdG8gdGhlIDpjbGFzczpgTWVzc2FnZWAgaWYKLSAgICAgIGRlZmF1bHRzIG5lZWQgdG8gYmUgZmlsbGVkIGluIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBhIHN0cmluZwotICAgICAgKGZvciBleGFtcGxlLCBNSU1FIGJvdW5kYXJpZXMgbWF5IGJlIGdlbmVyYXRlZCBvciBtb2RpZmllZCkuCisgICAgICBGbGF0dGVuaW5nIHRoZSBtZXNzYWdlIG1heSB0cmlnZ2VyIGNoYW5nZXMgdG8gdGhlIDpjbGFzczpgRW1haWxNZXNzYWdlYAorICAgICAgaWYgZGVmYXVsdHMgbmVlZCB0byBiZSBmaWxsZWQgaW4gdG8gY29tcGxldGUgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGEKKyAgICAgIHN0cmluZyAoZm9yIGV4YW1wbGUsIE1JTUUgYm91bmRhcmllcyBtYXkgYmUgZ2VuZXJhdGVkIG9yIG1vZGlmaWVkKS4KIAotICAgICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgYW5kIG1heSBub3QgYWx3YXlzCi0gICAgICBmb3JtYXQgdGhlIG1lc3NhZ2UgdGhlIHdheSB5b3Ugd2FudC4gIEZvciBleGFtcGxlLCBieSBkZWZhdWx0IGl0IGRvZXMKLSAgICAgIG5vdCBkbyB0aGUgbWFuZ2xpbmcgb2YgbGluZXMgdGhhdCBiZWdpbiB3aXRoIGBgRnJvbWBgIHRoYXQgaXMKLSAgICAgIHJlcXVpcmVkIGJ5IHRoZSB1bml4IG1ib3ggZm9ybWF0LiAgRm9yIG1vcmUgZmxleGliaWxpdHksIGluc3RhbnRpYXRlIGEKLSAgICAgIDpjbGFzczpgfmVtYWlsLmdlbmVyYXRvci5CeXRlc0dlbmVyYXRvcmAgaW5zdGFuY2UgYW5kIHVzZSBpdHMKLSAgICAgIDptZXRoOmB+ZW1haWwuZ2VuZXJhdG9yLkJ5dGVzR2VuZXJhdG9yLmZsYXR0ZW5gIG1ldGhvZCBkaXJlY3RseS4KLSAgICAgIEZvciBleGFtcGxlOjoKLQotICAgICAgICAgZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwotICAgICAgICAgZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEJ5dGVzR2VuZXJhdG9yCi0gICAgICAgICBmcCA9IEJ5dGVzSU8oKQotICAgICAgICAgZyA9IEJ5dGVzR2VuZXJhdG9yKGZwLCBtYW5nbGVfZnJvbV89VHJ1ZSwgbWF4aGVhZGVybGVuPTYwKQotICAgICAgICAgZy5mbGF0dGVuKG1zZykKLSAgICAgICAgIHRleHQgPSBmcC5nZXR2YWx1ZSgpCi0KLSAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAorICAgICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgYW5kIG1heSBub3QgYmUgdGhlCisgICAgICBtb3N0IHVzZWZ1bCB3YXkgdG8gc2VyaWFsaXplIG1lc3NhZ2VzIGluIHlvdXIgYXBwbGljYXRpb24sIGVzcGVjaWFsbHkgaWYKKyAgICAgIHlvdSBhcmUgZGVhbGluZyB3aXRoIG11bHRpcGxlIG1lc3NhZ2VzLiAgU2VlCisgICAgICA6Y2xhc3M6YGVtYWlsLmdlbmVyYXRvci5CeXRlc0dlbmVyYXRvcmAgZm9yIGEgbW9yZSBmbGV4aWJsZSBBUEkgZm9yCisgICAgICBzZXJpYWxpemluZyBtZXNzYWdlcy4KIAogCiAgICAuLiBtZXRob2Q6OiBfX2J5dGVzX18oKQogCiAgICAgICBFcXVpdmFsZW50IHRvIDptZXRoOmAuYXNfYnl0ZXMoKWAuICBBbGxvd3MgYGBieXRlcyhtc2cpYGAgdG8gcHJvZHVjZSBhCi0gICAgICBieXRlcyBvYmplY3QgY29udGFpbmluZyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0KLSAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAorICAgICAgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNlcmlhbGl6ZWQgbWVzc2FnZS4KIAogCiAgICAuLiBtZXRob2Q6OiBpc19tdWx0aXBhcnQoKQogCiAgICAgICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlIG1lc3NhZ2UncyBwYXlsb2FkIGlzIGEgbGlzdCBvZiBzdWItXAotICAgICAgOmNsYXNzOmBNZXNzYWdlYCBvYmplY3RzLCBvdGhlcndpc2UgcmV0dXJuIGBgRmFsc2VgYC4gIFdoZW4KKyAgICAgIDpjbGFzczpgRW1haWxNZXNzYWdlYCBvYmplY3RzLCBvdGhlcndpc2UgcmV0dXJuIGBgRmFsc2VgYC4gIFdoZW4KICAgICAgIDptZXRoOmBpc19tdWx0aXBhcnRgIHJldHVybnMgYGBGYWxzZWBgLCB0aGUgcGF5bG9hZCBzaG91bGQgYmUgYSBzdHJpbmcKLSAgICAgIG9iamVjdC4gIChOb3RlIHRoYXQgOm1ldGg6YGlzX211bHRpcGFydGAgcmV0dXJuaW5nIGBgVHJ1ZWBgIGRvZXMgbm90Ci0gICAgICBuZWNlc3NhcmlseSBtZWFuIHRoYXQgIm1zZy5nZXRfY29udGVudF9tYWludHlwZSgpID09ICdtdWx0aXBhcnQnIiB3aWxsCi0gICAgICByZXR1cm4gdGhlIGBgVHJ1ZWBgLiAgIEZvciBleGFtcGxlLCBgYGlzX211bHRpcGFydGBgIHdpbGwgcmV0dXJuIGBgVHJ1ZWBgCi0gICAgICB3aGVuIHRoZSA6Y2xhc3M6YE1lc3NhZ2VgIGlzIG9mIHR5cGUgYGBtZXNzYWdlL3JmYzgyMmBgLikKKyAgICAgIG9iamVjdCAod2hpY2ggbWlnaHQgYmUgYSBDVEUgZW5jb2RlZCBiaW5hcnkgcGF5bG9hZCkuICBOb3RlIHRoYXQKKyAgICAgIDptZXRoOmBpc19tdWx0aXBhcnRgIHJldHVybmluZyBgYFRydWVgYCBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoYXQKKyAgICAgICJtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSA9PSAnbXVsdGlwYXJ0JyIgd2lsbCByZXR1cm4gdGhlIGBgVHJ1ZWBgLgorICAgICAgRm9yIGV4YW1wbGUsIGBgaXNfbXVsdGlwYXJ0YGAgd2lsbCByZXR1cm4gYGBUcnVlYGAgd2hlbiB0aGUKKyAgICAgIDpjbGFzczpgRW1haWxNZXNzYWdlYCBpcyBvZiB0eXBlIGBgbWVzc2FnZS9yZmM4MjJgYC4KIAogCiAgICAuLiBtZXRob2Q6OiBzZXRfdW5peGZyb20odW5peGZyb20pCiAKLSAgICAgIFNldCB0aGUgbWVzc2FnZSdzIGVudmVsb3BlIGhlYWRlciB0byAqdW5peGZyb20qLCB3aGljaCBzaG91bGQgYmUgYSBzdHJpbmcuCisgICAgICBTZXQgdGhlIG1lc3NhZ2UncyBlbnZlbG9wZSBoZWFkZXIgdG8gKnVuaXhmcm9tKiwgd2hpY2ggc2hvdWxkIGJlIGEKKyAgICAgIHN0cmluZy4gIChTZWUgOmNsYXNzOmB+bWFpbGJveC5tYm94TWVzc2FnZWAgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YKKyAgICAgIHRoaXMgaGVhZGVyLikKIAogCiAgICAuLiBtZXRob2Q6OiBnZXRfdW5peGZyb20oKQpAQCAtMTUyLDEwOSArMTUzLDIzIEBACiAgICAgICBlbnZlbG9wZSBoZWFkZXIgd2FzIG5ldmVyIHNldC4KIAogCi0gICAuLiBtZXRob2Q6OiBhdHRhY2gocGF5bG9hZCkKLQotICAgICAgQWRkIHRoZSBnaXZlbiAqcGF5bG9hZCogdG8gdGhlIGN1cnJlbnQgcGF5bG9hZCwgd2hpY2ggbXVzdCBiZSBgYE5vbmVgYCBvcgotICAgICAgYSBsaXN0IG9mIDpjbGFzczpgTWVzc2FnZWAgb2JqZWN0cyBiZWZvcmUgdGhlIGNhbGwuIEFmdGVyIHRoZSBjYWxsLCB0aGUKLSAgICAgIHBheWxvYWQgd2lsbCBhbHdheXMgYmUgYSBsaXN0IG9mIDpjbGFzczpgTWVzc2FnZWAgb2JqZWN0cy4gIElmIHlvdSB3YW50IHRvCi0gICAgICBzZXQgdGhlIHBheWxvYWQgdG8gYSBzY2FsYXIgb2JqZWN0IChlLmcuIGEgc3RyaW5nKSwgdXNlCi0gICAgICA6bWV0aDpgc2V0X3BheWxvYWRgIGluc3RlYWQuCi0KLQotICAgLi4gbWV0aG9kOjogZ2V0X3BheWxvYWQoaT1Ob25lLCBkZWNvZGU9RmFsc2UpCi0KLSAgICAgIFJldHVybiB0aGUgY3VycmVudCBwYXlsb2FkLCB3aGljaCB3aWxsIGJlIGEgbGlzdCBvZgotICAgICAgOmNsYXNzOmBNZXNzYWdlYCBvYmplY3RzIHdoZW4gOm1ldGg6YGlzX211bHRpcGFydGAgaXMgYGBUcnVlYGAsIG9yIGEKLSAgICAgIHN0cmluZyB3aGVuIDptZXRoOmBpc19tdWx0aXBhcnRgIGlzIGBgRmFsc2VgYC4gIElmIHRoZSBwYXlsb2FkIGlzIGEgbGlzdAotICAgICAgYW5kIHlvdSBtdXRhdGUgdGhlIGxpc3Qgb2JqZWN0LCB5b3UgbW9kaWZ5IHRoZSBtZXNzYWdlJ3MgcGF5bG9hZCBpbiBwbGFjZS4KLQotICAgICAgV2l0aCBvcHRpb25hbCBhcmd1bWVudCAqaSosIDptZXRoOmBnZXRfcGF5bG9hZGAgd2lsbCByZXR1cm4gdGhlICppKi10aAotICAgICAgZWxlbWVudCBvZiB0aGUgcGF5bG9hZCwgY291bnRpbmcgZnJvbSB6ZXJvLCBpZiA6bWV0aDpgaXNfbXVsdGlwYXJ0YCBpcwotICAgICAgYGBUcnVlYGAuICBBbiA6ZXhjOmBJbmRleEVycm9yYCB3aWxsIGJlIHJhaXNlZCBpZiAqaSogaXMgbGVzcyB0aGFuIDAgb3IKLSAgICAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBwYXlsb2FkLiAgSWYgdGhlCi0gICAgICBwYXlsb2FkIGlzIGEgc3RyaW5nIChpLmUuICA6bWV0aDpgaXNfbXVsdGlwYXJ0YCBpcyBgYEZhbHNlYGApIGFuZCAqaSogaXMKLSAgICAgIGdpdmVuLCBhIDpleGM6YFR5cGVFcnJvcmAgaXMgcmFpc2VkLgotCi0gICAgICBPcHRpb25hbCAqZGVjb2RlKiBpcyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYXlsb2FkIHNob3VsZCBiZQotICAgICAgZGVjb2RlZCBvciBub3QsIGFjY29yZGluZyB0byB0aGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgCi0gICAgICBoZWFkZXIuIFdoZW4gYGBUcnVlYGAgYW5kIHRoZSBtZXNzYWdlIGlzIG5vdCBhIG11bHRpcGFydCwgdGhlIHBheWxvYWQgd2lsbAotICAgICAgYmUgZGVjb2RlZCBpZiB0aGlzIGhlYWRlcidzIHZhbHVlIGlzIGBgcXVvdGVkLXByaW50YWJsZWBgIG9yIGBgYmFzZTY0YGAuCi0gICAgICBJZiBzb21lIG90aGVyIGVuY29kaW5nIGlzIHVzZWQsIG9yIDptYWlsaGVhZGVyOmBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYAotICAgICAgaGVhZGVyIGlzIG1pc3NpbmcsIHRoZSBwYXlsb2FkIGlzCi0gICAgICByZXR1cm5lZCBhcy1pcyAodW5kZWNvZGVkKS4gIEluIGFsbCBjYXNlcyB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYmluYXJ5Ci0gICAgICBkYXRhLiAgSWYgdGhlIG1lc3NhZ2UgaXMgYSBtdWx0aXBhcnQgYW5kIHRoZSAqZGVjb2RlKiBmbGFnIGlzIGBgVHJ1ZWBgLAotICAgICAgdGhlbiBgYE5vbmVgYCBpcyByZXR1cm5lZC4gIElmIHRoZSBwYXlsb2FkIGlzIGJhc2U2NCBhbmQgaXQgd2FzIG5vdAotICAgICAgcGVyZmVjdGx5IGZvcm1lZCAobWlzc2luZyBwYWRkaW5nLCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIGJhc2U2NAotICAgICAgYWxwaGFiZXQpLCB0aGVuIGFuIGFwcHJvcHJpYXRlIGRlZmVjdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlJ3MKLSAgICAgIGRlZmVjdCBwcm9wZXJ0eSAoOmNsYXNzOmB+ZW1haWwuZXJyb3JzLkludmFsaWRCYXNlNjRQYWRkaW5nRGVmZWN0YCBvcgotICAgICAgOmNsYXNzOmB+ZW1haWwuZXJyb3JzLkludmFsaWRCYXNlNjRDaGFyYWN0ZXJzRGVmZWN0YCwgcmVzcGVjdGl2ZWx5KS4KLQotICAgICAgV2hlbiAqZGVjb2RlKiBpcyBgYEZhbHNlYGAgKHRoZSBkZWZhdWx0KSB0aGUgYm9keSBpcyByZXR1cm5lZCBhcyBhIHN0cmluZwotICAgICAgd2l0aG91dCBkZWNvZGluZyB0aGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgLiAgSG93ZXZlciwKLSAgICAgIGZvciBhIDptYWlsaGVhZGVyOmBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYCBvZiA4Yml0LCBhbiBhdHRlbXB0IGlzIG1hZGUKLSAgICAgIHRvIGRlY29kZSB0aGUgb3JpZ2luYWwgYnl0ZXMgdXNpbmcgdGhlIGBgY2hhcnNldGBgIHNwZWNpZmllZCBieSB0aGUKLSAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciwgdXNpbmcgdGhlIGBgcmVwbGFjZWBgIGVycm9yIGhhbmRsZXIuCi0gICAgICBJZiBubyBgYGNoYXJzZXRgYCBpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSBgYGNoYXJzZXRgYCBnaXZlbiBpcyBub3QKLSAgICAgIHJlY29nbml6ZWQgYnkgdGhlIGVtYWlsIHBhY2thZ2UsIHRoZSBib2R5IGlzIGRlY29kZWQgdXNpbmcgdGhlIGRlZmF1bHQKLSAgICAgIEFTQ0lJIGNoYXJzZXQuCi0KLQotICAgLi4gbWV0aG9kOjogc2V0X3BheWxvYWQocGF5bG9hZCwgY2hhcnNldD1Ob25lKQotCi0gICAgICBTZXQgdGhlIGVudGlyZSBtZXNzYWdlIG9iamVjdCdzIHBheWxvYWQgdG8gKnBheWxvYWQqLiAgSXQgaXMgdGhlIGNsaWVudCdzCi0gICAgICByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhlIHBheWxvYWQgaW52YXJpYW50cy4gIE9wdGlvbmFsICpjaGFyc2V0KiBzZXRzCi0gICAgICB0aGUgbWVzc2FnZSdzIGRlZmF1bHQgY2hhcmFjdGVyIHNldDsgc2VlIDptZXRoOmBzZXRfY2hhcnNldGAgZm9yIGRldGFpbHMuCi0KLSAgIC4uIG1ldGhvZDo6IHNldF9jaGFyc2V0KGNoYXJzZXQpCi0KLSAgICAgIFNldCB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGUgcGF5bG9hZCB0byAqY2hhcnNldCosIHdoaWNoIGNhbiBlaXRoZXIgYmUgYQotICAgICAgOmNsYXNzOmB+ZW1haWwuY2hhcnNldC5DaGFyc2V0YCBpbnN0YW5jZSAoc2VlIDptb2Q6YGVtYWlsLmNoYXJzZXRgKSwgYQotICAgICAgc3RyaW5nIG5hbWluZyBhIGNoYXJhY3RlciBzZXQsIG9yIGBgTm9uZWBgLiAgSWYgaXQgaXMgYSBzdHJpbmcsIGl0IHdpbGwKLSAgICAgIGJlIGNvbnZlcnRlZCB0byBhIDpjbGFzczpgfmVtYWlsLmNoYXJzZXQuQ2hhcnNldGAgaW5zdGFuY2UuICBJZiAqY2hhcnNldCoKLSAgICAgIGlzIGBgTm9uZWBgLCB0aGUgYGBjaGFyc2V0YGAgcGFyYW1ldGVyIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZQotICAgICAgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyICh0aGUgbWVzc2FnZSB3aWxsIG5vdCBiZSBvdGhlcndpc2UKLSAgICAgIG1vZGlmaWVkKS4gIEFueXRoaW5nIGVsc2Ugd2lsbCBnZW5lcmF0ZSBhIDpleGM6YFR5cGVFcnJvcmAuCi0KLSAgICAgIElmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIDptYWlsaGVhZGVyOmBNSU1FLVZlcnNpb25gIGhlYWRlciBvbmUgd2lsbCBiZQotICAgICAgYWRkZWQuICBJZiB0aGVyZSBpcyBubyBleGlzdGluZyA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIsIG9uZQotICAgICAgd2lsbCBiZSBhZGRlZCB3aXRoIGEgdmFsdWUgb2YgOm1pbWV0eXBlOmB0ZXh0L3BsYWluYC4gIFdoZXRoZXIgdGhlCi0gICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIgYWxyZWFkeSBleGlzdHMgb3Igbm90LCBpdHMgYGBjaGFyc2V0YGAKLSAgICAgIHBhcmFtZXRlciB3aWxsIGJlIHNldCB0byAqY2hhcnNldC5vdXRwdXRfY2hhcnNldCouICAgSWYKLSAgICAgICpjaGFyc2V0LmlucHV0X2NoYXJzZXQqIGFuZCAqY2hhcnNldC5vdXRwdXRfY2hhcnNldCogZGlmZmVyLCB0aGUgcGF5bG9hZAotICAgICAgd2lsbCBiZSByZS1lbmNvZGVkIHRvIHRoZSAqb3V0cHV0X2NoYXJzZXQqLiAgSWYgdGhlcmUgaXMgbm8gZXhpc3RpbmcKLSAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIsIHRoZW4gdGhlIHBheWxvYWQgd2lsbCBiZQotICAgICAgdHJhbnNmZXItZW5jb2RlZCwgaWYgbmVlZGVkLCB1c2luZyB0aGUgc3BlY2lmaWVkCi0gICAgICA6Y2xhc3M6YH5lbWFpbC5jaGFyc2V0LkNoYXJzZXRgLCBhbmQgYSBoZWFkZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUKLSAgICAgIHdpbGwgYmUgYWRkZWQuICBJZiBhIDptYWlsaGVhZGVyOmBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIKLSAgICAgIGFscmVhZHkgZXhpc3RzLCB0aGUgcGF5bG9hZCBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUgY29ycmVjdGx5IGVuY29kZWQKLSAgICAgIHVzaW5nIHRoYXQgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgIGFuZCBpcyBub3QgbW9kaWZpZWQuCi0KLSAgIC4uIG1ldGhvZDo6IGdldF9jaGFyc2V0KCkKLQotICAgICAgUmV0dXJuIHRoZSA6Y2xhc3M6YH5lbWFpbC5jaGFyc2V0LkNoYXJzZXRgIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgIG1lc3NhZ2UncyBwYXlsb2FkLgotCi0gICBUaGUgZm9sbG93aW5nIG1ldGhvZHMgaW1wbGVtZW50IGEgbWFwcGluZy1saWtlIGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIHRoZQotICAgbWVzc2FnZSdzIDpyZmM6YDI4MjJgIGhlYWRlcnMuICBOb3RlIHRoYXQgdGhlcmUgYXJlIHNvbWUgc2VtYW50aWMgZGlmZmVyZW5jZXMKKyAgIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBpbXBsZW1lbnQgdGhlIG1hcHBpbmctbGlrZSBpbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyB0aGUKKyAgIG1lc3NhZ2UncyBoZWFkZXJzLiAgTm90ZSB0aGF0IHRoZXJlIGFyZSBzb21lIHNlbWFudGljIGRpZmZlcmVuY2VzCiAgICBiZXR3ZWVuIHRoZXNlIG1ldGhvZHMgYW5kIGEgbm9ybWFsIG1hcHBpbmcgKGkuZS4gZGljdGlvbmFyeSkgaW50ZXJmYWNlLiAgRm9yCiAgICBleGFtcGxlLCBpbiBhIGRpY3Rpb25hcnkgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSBrZXlzLCBidXQgaGVyZSB0aGVyZSBtYXkgYmUKICAgIGR1cGxpY2F0ZSBtZXNzYWdlIGhlYWRlcnMuICBBbHNvLCBpbiBkaWN0aW9uYXJpZXMgdGhlcmUgaXMgbm8gZ3VhcmFudGVlZAotICAgb3JkZXIgdG8gdGhlIGtleXMgcmV0dXJuZWQgYnkgOm1ldGg6YGtleXNgLCBidXQgaW4gYSA6Y2xhc3M6YE1lc3NhZ2VgIG9iamVjdCwKLSAgIGhlYWRlcnMgYXJlIGFsd2F5cyByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwKLSAgIG1lc3NhZ2UsIG9yIHdlcmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2UgbGF0ZXIuICBBbnkgaGVhZGVyIGRlbGV0ZWQgYW5kIHRoZW4KLSAgIHJlLWFkZGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgaGVhZGVyIGxpc3QuCisgICBvcmRlciB0byB0aGUga2V5cyByZXR1cm5lZCBieSA6bWV0aDpga2V5c2AsIGJ1dCBpbiBhbiA6Y2xhc3M6YEVtYWlsTWVzc2FnZWAKKyAgIG9iamVjdCwgaGVhZGVycyBhcmUgYWx3YXlzIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcmVkIGluIHRoZQorICAgb3JpZ2luYWwgbWVzc2FnZSwgb3IgaW4gd2hpY2ggdGhleSB3ZXJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlIGxhdGVyLiAgQW55CisgICBoZWFkZXIgZGVsZXRlZCBhbmQgdGhlbiByZS1hZGRlZCBpcyBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUKKyAgIGhlYWRlciBsaXN0LgogCi0gICBUaGVzZSBzZW1hbnRpYyBkaWZmZXJlbmNlcyBhcmUgaW50ZW50aW9uYWwgYW5kIGFyZSBiaWFzZWQgdG93YXJkIG1heGltYWwKLSAgIGNvbnZlbmllbmNlLgorICAgVGhlc2Ugc2VtYW50aWMgZGlmZmVyZW5jZXMgYXJlIGludGVudGlvbmFsIGFuZCBhcmUgYmlhc2VkIHRvd2FyZAorICAgY29udmVuaWVuY2UgaW4gdGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlcy4KIAogICAgTm90ZSB0aGF0IGluIGFsbCBjYXNlcywgYW55IGVudmVsb3BlIGhlYWRlciBwcmVzZW50IGluIHRoZSBtZXNzYWdlIGlzIG5vdAogICAgaW5jbHVkZWQgaW4gdGhlIG1hcHBpbmcgaW50ZXJmYWNlLgogCi0gICBJbiBhIG1vZGVsIGdlbmVyYXRlZCBmcm9tIGJ5dGVzLCBhbnkgaGVhZGVyIHZhbHVlcyB0aGF0IChpbiBjb250cmF2ZW50aW9uIG9mCi0gICB0aGUgUkZDcykgY29udGFpbiBub24tQVNDSUkgYnl0ZXMgd2lsbCwgd2hlbiByZXRyaWV2ZWQgdGhyb3VnaCB0aGlzCi0gICBpbnRlcmZhY2UsIGJlIHJlcHJlc2VudGVkIGFzIDpjbGFzczpgfmVtYWlsLmhlYWRlci5IZWFkZXJgIG9iamVjdHMgd2l0aAotICAgYSBjaGFyc2V0IG9mIGB1bmtub3duLThiaXRgLgotCiAKICAgIC4uIG1ldGhvZDo6IF9fbGVuX18oKQogCkBAIC0yNjQsOCArMTc5LDggQEAKICAgIC4uIG1ldGhvZDo6IF9fY29udGFpbnNfXyhuYW1lKQogCiAgICAgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBvYmplY3QgaGFzIGEgZmllbGQgbmFtZWQgKm5hbWUqLiBNYXRjaGluZyBpcwotICAgICAgZG9uZSBjYXNlLWluc2Vuc2l0aXZlbHkgYW5kICpuYW1lKiBzaG91bGQgbm90IGluY2x1ZGUgdGhlIHRyYWlsaW5nIGNvbG9uLgotICAgICAgVXNlZCBmb3IgdGhlIGBgaW5gYCBvcGVyYXRvciwgZS5nLjo6CisgICAgICBkb25lIHdpdGhvdXQgcmVnYXJkIHRvIGNhc2UgYW5kICpuYW1lKiBkb2VzIG5vdCBpbmNsdWRlIHRoZSB0cmFpbGluZworICAgICAgY29sb24uICBVc2VkIGZvciB0aGUgYGBpbmBgIG9wZXJhdG9yLiAgRm9yIGV4YW1wbGU6OgogCiAgICAgICAgICAgIGlmICdtZXNzYWdlLWlkJyBpbiBteU1lc3NhZ2U6CiAgICAgICAgICAgICAgIHByaW50KCdNZXNzYWdlLUlEOicsIG15TWVzc2FnZVsnbWVzc2FnZS1pZCddKQpAQCAtMjczLDIwICsxODgsMjMgQEAKIAogICAgLi4gbWV0aG9kOjogX19nZXRpdGVtX18obmFtZSkKIAotICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgaGVhZGVyIGZpZWxkLiAgKm5hbWUqIHNob3VsZCBub3QgaW5jbHVkZSB0aGUKKyAgICAgIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIGhlYWRlciBmaWVsZC4gICpuYW1lKiBkb2VzIG5vdCBpbmNsdWRlIHRoZQogICAgICAgY29sb24gZmllbGQgc2VwYXJhdG9yLiAgSWYgdGhlIGhlYWRlciBpcyBtaXNzaW5nLCBgYE5vbmVgYCBpcyByZXR1cm5lZDsgYQogICAgICAgOmV4YzpgS2V5RXJyb3JgIGlzIG5ldmVyIHJhaXNlZC4KIAogICAgICAgTm90ZSB0aGF0IGlmIHRoZSBuYW1lZCBmaWVsZCBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBtZXNzYWdlJ3MKICAgICAgIGhlYWRlcnMsIGV4YWN0bHkgd2hpY2ggb2YgdGhvc2UgZmllbGQgdmFsdWVzIHdpbGwgYmUgcmV0dXJuZWQgaXMKICAgICAgIHVuZGVmaW5lZC4gIFVzZSB0aGUgOm1ldGg6YGdldF9hbGxgIG1ldGhvZCB0byBnZXQgdGhlIHZhbHVlcyBvZiBhbGwgdGhlCi0gICAgICBleHRhbnQgbmFtZWQgaGVhZGVycy4KKyAgICAgIGV4dGFudCBoZWFkZXJzIG5hbWVkICpuYW1lKi4KKworICAgICAgVXNpbmcgdGhlIHN0YW5kYXJkIChub24tYGBjb21wYXQzMmBgKSBwb2xpY2llcywgdGhlIHJldHVybmVkIHZhbHVlIGlzIGFuCisgICAgICBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIDpjbGFzczpgZW1haWwuaGVhZGVycmVnaXN0cnkuQmFzZUhlYWRlcmAuCiAKIAogICAgLi4gbWV0aG9kOjogX19zZXRpdGVtX18obmFtZSwgdmFsKQogCiAgICAgICBBZGQgYSBoZWFkZXIgdG8gdGhlIG1lc3NhZ2Ugd2l0aCBmaWVsZCBuYW1lICpuYW1lKiBhbmQgdmFsdWUgKnZhbCouICBUaGUKLSAgICAgIGZpZWxkIGlzIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UncyBleGlzdGluZyBmaWVsZHMuCisgICAgICBmaWVsZCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlJ3MgZXhpc3RpbmcgaGVhZGVycy4KIAogICAgICAgTm90ZSB0aGF0IHRoaXMgZG9lcyAqbm90KiBvdmVyd3JpdGUgb3IgZGVsZXRlIGFueSBleGlzdGluZyBoZWFkZXIgd2l0aCB0aGUgc2FtZQogICAgICAgbmFtZS4gIElmIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBuZXcgaGVhZGVyIGlzIHRoZSBvbmx5IG9uZSBwcmVzZW50IGluIHRoZQpAQCAtMjk1LDYgKzIxMywxMyBAQAogICAgICAgICAgZGVsIG1zZ1snc3ViamVjdCddCiAgICAgICAgICBtc2dbJ3N1YmplY3QnXSA9ICdQeXRob24gcm9vbHohJwogCisgICAgICBJZiB0aGUgOm1vZDpgcG9saWN5YCBkZWZpbmVzIGNlcnRhaW4gaGFkZXJzIHRvIGJlIHVuaXF1ZSAoYXMgdGhlIHN0YW5kYXJkCisgICAgICBwb2xpY2llcyBkbyksIHRoaXMgbWV0aG9kIG1heSByYWlzZSBhIDpleGM6YFZhbHVlRXJyb3JgIHdoZW4gYW4gYXR0ZW1wdAorICAgICAgaXMgbWFkZSB0byBhc3NpZ24gYSB2YWx1ZSB0byBzdWNoIGEgaGVhZGVyIHdoZW4gb25lIGFscmVhZHkgZXhpc3RzLiAgVGhpcworICAgICAgYmVoYXZpb3IgaXMgaW50ZW50aW9uYWwgZm9yIGNvbnNpc3RlbmN5J3Mgc2FrZSwgYnV0IGRvIG5vdCBkZXBlbmQgb24gaXQKKyAgICAgIGFzIHdlIG1heSBjaG9vc2UgdG8gbWFrZSBzdWNoIGFzc2lnbm1lbnRzIGRvIGFuIGF1dG9tYXRpYyBkZWxldGlvbiBvZiB0aGUKKyAgICAgIGV4aXN0aW5nIGhlYWRlciBpbiB0aGUgZnV0dXJlLgorCiAKICAgIC4uIG1ldGhvZDo6IF9fZGVsaXRlbV9fKG5hbWUpCiAKQEAgLTMyMyw5ICsyNDgsMTAgQEAKIAogICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgaGVhZGVyIGZpZWxkLiAgVGhpcyBpcyBpZGVudGljYWwgdG8KICAgICAgIDptZXRoOmBfX2dldGl0ZW1fX2AgZXhjZXB0IHRoYXQgb3B0aW9uYWwgKmZhaWxvYmoqIGlzIHJldHVybmVkIGlmIHRoZQotICAgICAgbmFtZWQgaGVhZGVyIGlzIG1pc3NpbmcgKGRlZmF1bHRzIHRvIGBgTm9uZWBgKS4KKyAgICAgIG5hbWVkIGhlYWRlciBpcyBtaXNzaW5nICgqZmFpbG9iaiogZGVmYXVsdHMgdG8gYGBOb25lYGApLgogCi0gICBIZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgdXNlZnVsIG1ldGhvZHM6CisKKyAgIEhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCB1c2VmdWwgaGVhZGVyIHJlbGF0ZWQgbWV0aG9kczoKIAogCiAgICAuLiBtZXRob2Q6OiBnZXRfYWxsKG5hbWUsIGZhaWxvYmo9Tm9uZSkKQEAgLTM0NiwxNyArMjcyLDE5IEBACiAgICAgICB0YWtlbiBhcyB0aGUgcGFyYW1ldGVyIG5hbWUsIHdpdGggdW5kZXJzY29yZXMgY29udmVydGVkIHRvIGRhc2hlcyAoc2luY2UKICAgICAgIGRhc2hlcyBhcmUgaWxsZWdhbCBpbiBQeXRob24gaWRlbnRpZmllcnMpLiAgTm9ybWFsbHksIHRoZSBwYXJhbWV0ZXIgd2lsbAogICAgICAgYmUgYWRkZWQgYXMgYGBrZXk9InZhbHVlImBgIHVubGVzcyB0aGUgdmFsdWUgaXMgYGBOb25lYGAsIGluIHdoaWNoIGNhc2UKLSAgICAgIG9ubHkgdGhlIGtleSB3aWxsIGJlIGFkZGVkLiAgSWYgdGhlIHZhbHVlIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLAotICAgICAgaXQgY2FuIGJlIHNwZWNpZmllZCBhcyBhIHRocmVlIHR1cGxlIGluIHRoZSBmb3JtYXQKLSAgICAgIGBgKENIQVJTRVQsIExBTkdVQUdFLCBWQUxVRSlgYCwgd2hlcmUgYGBDSEFSU0VUYGAgaXMgYSBzdHJpbmcgbmFtaW5nIHRoZQotICAgICAgY2hhcnNldCB0byBiZSB1c2VkIHRvIGVuY29kZSB0aGUgdmFsdWUsIGBgTEFOR1VBR0VgYCBjYW4gdXN1YWxseSBiZSBzZXQKLSAgICAgIHRvIGBgTm9uZWBgIG9yIHRoZSBlbXB0eSBzdHJpbmcgKHNlZSA6cmZjOmAyMjMxYCBmb3Igb3RoZXIgcG9zc2liaWxpdGllcyksCi0gICAgICBhbmQgYGBWQUxVRWBgIGlzIHRoZSBzdHJpbmcgdmFsdWUgY29udGFpbmluZyBub24tQVNDSUkgY29kZSBwb2ludHMuICBJZgotICAgICAgYSB0aHJlZSB0dXBsZSBpcyBub3QgcGFzc2VkIGFuZCB0aGUgdmFsdWUgY29udGFpbnMgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsCi0gICAgICBpdCBpcyBhdXRvbWF0aWNhbGx5IGVuY29kZWQgaW4gOnJmYzpgMjIzMWAgZm9ybWF0IHVzaW5nIGEgYGBDSEFSU0VUYGAKLSAgICAgIG9mIGBgdXRmLThgYCBhbmQgYSBgYExBTkdVQUdFYGAgb2YgYGBOb25lYGAuCisgICAgICBvbmx5IHRoZSBrZXkgd2lsbCBiZSBhZGRlZC4KIAotICAgICAgSGVyZSdzIGFuIGV4YW1wbGU6OgorICAgICAgSWYgdGhlIHZhbHVlIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCB0aGUgY2hhcnNldCBhbmQgbGFuZ3VhZ2UgbWF5CisgICAgICBiZSBleHBsaWNpdGx5IGNvbnRyb2xsZWQgYnkgc3BlY2lmaW5nIHRoZSB2YWx1ZSBhcyBhIHRocmVlIHR1cGxlIGluIHRoZQorICAgICAgZm9ybWF0IGBgKENIQVJTRVQsIExBTkdVQUdFLCBWQUxVRSlgYCwgd2hlcmUgYGBDSEFSU0VUYGAgaXMgYSBzdHJpbmcKKyAgICAgIG5hbWluZyB0aGUgY2hhcnNldCB0byBiZSB1c2VkIHRvIGVuY29kZSB0aGUgdmFsdWUsIGBgTEFOR1VBR0VgYCBjYW4KKyAgICAgIHVzdWFsbHkgYmUgc2V0IHRvIGBgTm9uZWBgIG9yIHRoZSBlbXB0eSBzdHJpbmcgKHNlZSA6cmZjOmAyMjMxYCBmb3Igb3RoZXIKKyAgICAgIHBvc3NpYmlsaXRpZXMpLCBhbmQgYGBWQUxVRWBgIGlzIHRoZSBzdHJpbmcgdmFsdWUgY29udGFpbmluZyBub24tQVNDSUkKKyAgICAgIGNvZGUgcG9pbnRzLiAgSWYgYSB0aHJlZSB0dXBsZSBpcyBub3QgcGFzc2VkIGFuZCB0aGUgdmFsdWUgY29udGFpbnMKKyAgICAgIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGVuY29kZWQgaW4gOnJmYzpgMjIzMWAgZm9ybWF0CisgICAgICB1c2luZyBhIGBgQ0hBUlNFVGBgIG9mIGBgdXRmLThgYCBhbmQgYSBgYExBTkdVQUdFYGAgb2YgYGBOb25lYGAuCisKKyAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZTo6CiAKICAgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLCBmaWxlbmFtZT0nYnVkLmdpZicpCiAKQEAgLTM2NCwzNyArMjkyLDM1IEBACiAKICAgICAgICAgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJidWQuZ2lmIgogCi0gICAgICBBbiBleGFtcGxlIHdpdGggbm9uLUFTQ0lJIGNoYXJhY3RlcnM6OgorICAgICAgQW4gZXhhbXBsZSBvZiB0aGUgZXh0ZW5kZWQgaW50ZXJmYWNlIHdpdGggbm9uLUFTQ0lJIGNoYXJhY3RlcnM6OgogCiAgICAgICAgICBtc2cuYWRkX2hlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSgnaXNvLTg4NTktMScsICcnLCAnRnXDn2JhbGxlci5wcHQnKSkKIAotICAgICAgV2hpY2ggcHJvZHVjZXMgOjoKLQotICAgICAgICAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWUqPSJpc28tODg1OS0xJydGdSVERmJhbGxlci5wcHQiCi0KIAogICAgLi4gbWV0aG9kOjogcmVwbGFjZV9oZWFkZXIoX25hbWUsIF92YWx1ZSkKIAogICAgICAgUmVwbGFjZSBhIGhlYWRlci4gIFJlcGxhY2UgdGhlIGZpcnN0IGhlYWRlciBmb3VuZCBpbiB0aGUgbWVzc2FnZSB0aGF0Ci0gICAgICBtYXRjaGVzICpfbmFtZSosIHJldGFpbmluZyBoZWFkZXIgb3JkZXIgYW5kIGZpZWxkIG5hbWUgY2FzZS4gIElmIG5vCi0gICAgICBtYXRjaGluZyBoZWFkZXIgd2FzIGZvdW5kLCBhIDpleGM6YEtleUVycm9yYCBpcyByYWlzZWQuCisgICAgICBtYXRjaGVzICpfbmFtZSosIHJldGFpbmluZyBoZWFkZXIgb3JkZXIgYW5kIGZpZWxkIG5hbWUgY2FzZSBvZiB0aGUKKyAgICAgIG9yaWdpbmFsIGhlYWRlci4gIElmIG5vIG1hdGNoaW5nIGhlYWRlciBpcyBmb3VuZCwgcmFpc2UgYQorICAgICAgOmV4YzpgS2V5RXJyb3JgLgogCiAKICAgIC4uIG1ldGhvZDo6IGdldF9jb250ZW50X3R5cGUoKQogCi0gICAgICBSZXR1cm4gdGhlIG1lc3NhZ2UncyBjb250ZW50IHR5cGUuICBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGNvZXJjZWQgdG8KLSAgICAgIGxvd2VyIGNhc2Ugb2YgdGhlIGZvcm0gOm1pbWV0eXBlOmBtYWludHlwZS9zdWJ0eXBlYC4gIElmIHRoZXJlIHdhcyBubwotICAgICAgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyIGluIHRoZSBtZXNzYWdlIHRoZSBkZWZhdWx0IHR5cGUgYXMgZ2l2ZW4KLSAgICAgIGJ5IDptZXRoOmBnZXRfZGVmYXVsdF90eXBlYCB3aWxsIGJlIHJldHVybmVkLiAgU2luY2UgYWNjb3JkaW5nIHRvCi0gICAgICA6cmZjOmAyMDQ1YCwgbWVzc2FnZXMgYWx3YXlzIGhhdmUgYSBkZWZhdWx0IHR5cGUsIDptZXRoOmBnZXRfY29udGVudF90eXBlYAotICAgICAgd2lsbCBhbHdheXMgcmV0dXJuIGEgdmFsdWUuCisgICAgICBSZXR1cm4gdGhlIG1lc3NhZ2UncyBjb250ZW50IHR5cGUsIGNvZXJjZWQgdG8gbG93ZXIgY2FzZSBvZiB0aGUgZm9ybQorICAgICAgOm1pbWV0eXBlOmBtYWludHlwZS9zdWJ0eXBlYC4gIElmIHRoZXJlIGlzIG5vIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgCisgICAgICBoZWFkZXIgaW4gdGhlIG1lc3NhZ2UgcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAgICAgOm1ldGg6YGdldF9kZWZhdWx0X3R5cGVgLiAgSWYgdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciBpcworICAgICAgaW52YWxpZCwgcmV0dXJuIGBgdGV4dC9wbGFpbmBgLgogCi0gICAgICA6cmZjOmAyMDQ1YCBkZWZpbmVzIGEgbWVzc2FnZSdzIGRlZmF1bHQgdHlwZSB0byBiZSA6bWltZXR5cGU6YHRleHQvcGxhaW5gCi0gICAgICB1bmxlc3MgaXQgYXBwZWFycyBpbnNpZGUgYSA6bWltZXR5cGU6YG11bHRpcGFydC9kaWdlc3RgIGNvbnRhaW5lciwgaW4KLSAgICAgIHdoaWNoIGNhc2UgaXQgd291bGQgYmUgOm1pbWV0eXBlOmBtZXNzYWdlL3JmYzgyMmAuICBJZiB0aGUKLSAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciBoYXMgYW4gaW52YWxpZCB0eXBlIHNwZWNpZmljYXRpb24sCi0gICAgICA6cmZjOmAyMDQ1YCBtYW5kYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHR5cGUgYmUgOm1pbWV0eXBlOmB0ZXh0L3BsYWluYC4KKyAgICAgIChBY2NvcmRpbmcgdG8gOnJmYzpgMjA0NWAsIG1lc3NhZ2VzIGFsd2F5cyBoYXZlIGEgZGVmYXVsdCB0eXBlLAorICAgICAgOm1ldGg6YGdldF9jb250ZW50X3R5cGVgIHdpbGwgYWx3YXlzIHJldHVybiBhIHZhbHVlLiAgOnJmYzpgMjA0NWAgZGVmaW5lcworICAgICAgYSBtZXNzYWdlJ3MgZGVmYXVsdCB0eXBlIHRvIGJlIDptaW1ldHlwZTpgdGV4dC9wbGFpbmAgdW5sZXNzIGl0IGFwcGVhcnMKKyAgICAgIGluc2lkZSBhIDptaW1ldHlwZTpgbXVsdGlwYXJ0L2RpZ2VzdGAgY29udGFpbmVyLCBpbiB3aGljaCBjYXNlIGl0IHdvdWxkCisgICAgICBiZSA6bWltZXR5cGU6YG1lc3NhZ2UvcmZjODIyYC4gIElmIHRoZSA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIKKyAgICAgIGhhcyBhbiBpbnZhbGlkIHR5cGUgc3BlY2lmaWNhdGlvbiwgOnJmYzpgMjA0NWAgbWFuZGF0ZXMgdGhhdCB0aGUgZGVmYXVsdAorICAgICAgdHlwZSBiZSA6bWltZXR5cGU6YHRleHQvcGxhaW5gLikKIAogCiAgICAuLiBtZXRob2Q6OiBnZXRfY29udGVudF9tYWludHlwZSgpCkBAIC00MjAsODEgKzM0Niw0MSBAQAogICAgLi4gbWV0aG9kOjogc2V0X2RlZmF1bHRfdHlwZShjdHlwZSkKIAogICAgICAgU2V0IHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZS4gICpjdHlwZSogc2hvdWxkIGVpdGhlciBiZQotICAgICAgOm1pbWV0eXBlOmB0ZXh0L3BsYWluYCBvciA6bWltZXR5cGU6YG1lc3NhZ2UvcmZjODIyYCwgYWx0aG91Z2ggdGhpcyBpcyBub3QKLSAgICAgIGVuZm9yY2VkLiAgVGhlIGRlZmF1bHQgY29udGVudCB0eXBlIGlzIG5vdCBzdG9yZWQgaW4gdGhlCi0gICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIuCi0KLQotICAgLi4gbWV0aG9kOjogZ2V0X3BhcmFtcyhmYWlsb2JqPU5vbmUsIGhlYWRlcj0nY29udGVudC10eXBlJywgdW5xdW90ZT1UcnVlKQotCi0gICAgICBSZXR1cm4gdGhlIG1lc3NhZ2UncyA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBwYXJhbWV0ZXJzLCBhcyBhIGxpc3QuCi0gICAgICBUaGUgZWxlbWVudHMgb2YgdGhlIHJldHVybmVkIGxpc3QgYXJlIDItdHVwbGVzIG9mIGtleS92YWx1ZSBwYWlycywgYXMKLSAgICAgIHNwbGl0IG9uIHRoZSBgYCc9J2BgIHNpZ24uICBUaGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGBgJz0nYGAgaXMgdGhlIGtleSwKLSAgICAgIHdoaWxlIHRoZSByaWdodCBoYW5kIHNpZGUgaXMgdGhlIHZhbHVlLiAgSWYgdGhlcmUgaXMgbm8gYGAnPSdgYCBzaWduIGluCi0gICAgICB0aGUgcGFyYW1ldGVyIHRoZSB2YWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIGFzCi0gICAgICBkZXNjcmliZWQgaW4gOm1ldGg6YGdldF9wYXJhbWAgYW5kIGlzIHVucXVvdGVkIGlmIG9wdGlvbmFsICp1bnF1b3RlKiBpcwotICAgICAgYGBUcnVlYGAgKHRoZSBkZWZhdWx0KS4KLQotICAgICAgT3B0aW9uYWwgKmZhaWxvYmoqIGlzIHRoZSBvYmplY3QgdG8gcmV0dXJuIGlmIHRoZXJlIGlzIG5vCi0gICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIuICBPcHRpb25hbCAqaGVhZGVyKiBpcyB0aGUgaGVhZGVyIHRvCi0gICAgICBzZWFyY2ggaW5zdGVhZCBvZiA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYC4KLQotCi0gICAuLiBtZXRob2Q6OiBnZXRfcGFyYW0ocGFyYW0sIGZhaWxvYmo9Tm9uZSwgaGVhZGVyPSdjb250ZW50LXR5cGUnLCB1bnF1b3RlPVRydWUpCi0KLSAgICAgIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlcidzIHBhcmFtZXRlcgotICAgICAgKnBhcmFtKiBhcyBhIHN0cmluZy4gIElmIHRoZSBtZXNzYWdlIGhhcyBubyA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYAotICAgICAgaGVhZGVyIG9yIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcGFyYW1ldGVyLCB0aGVuICpmYWlsb2JqKiBpcyByZXR1cm5lZAotICAgICAgKGRlZmF1bHRzIHRvIGBgTm9uZWBgKS4KLQotICAgICAgT3B0aW9uYWwgKmhlYWRlciogaWYgZ2l2ZW4sIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBoZWFkZXIgdG8gdXNlIGluc3RlYWQgb2YKLSAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgLgotCi0gICAgICBQYXJhbWV0ZXIga2V5cyBhcmUgYWx3YXlzIGNvbXBhcmVkIGNhc2UgaW5zZW5zaXRpdmVseS4gIFRoZSByZXR1cm4gdmFsdWUKLSAgICAgIGNhbiBlaXRoZXIgYmUgYSBzdHJpbmcsIG9yIGEgMy10dXBsZSBpZiB0aGUgcGFyYW1ldGVyIHdhcyA6cmZjOmAyMjMxYAotICAgICAgZW5jb2RlZC4gIFdoZW4gaXQncyBhIDMtdHVwbGUsIHRoZSBlbGVtZW50cyBvZiB0aGUgdmFsdWUgYXJlIG9mIHRoZSBmb3JtCi0gICAgICBgYChDSEFSU0VULCBMQU5HVUFHRSwgVkFMVUUpYGAuICBOb3RlIHRoYXQgYm90aCBgYENIQVJTRVRgYCBhbmQKLSAgICAgIGBgTEFOR1VBR0VgYCBjYW4gYmUgYGBOb25lYGAsIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBjb25zaWRlciBgYFZBTFVFYGAKLSAgICAgIHRvIGJlIGVuY29kZWQgaW4gdGhlIGBgdXMtYXNjaWlgYCBjaGFyc2V0LiAgWW91IGNhbiB1c3VhbGx5IGlnbm9yZQotICAgICAgYGBMQU5HVUFHRWBgLgotCi0gICAgICBJZiB5b3VyIGFwcGxpY2F0aW9uIGRvZXNuJ3QgY2FyZSB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgd2FzIGVuY29kZWQgYXMgaW4KLSAgICAgIDpyZmM6YDIyMzFgLCB5b3UgY2FuIGNvbGxhcHNlIHRoZSBwYXJhbWV0ZXIgdmFsdWUgYnkgY2FsbGluZwotICAgICAgOmZ1bmM6YGVtYWlsLnV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWVgLCBwYXNzaW5nIGluIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgIGZyb20gOm1ldGg6YGdldF9wYXJhbWAuICBUaGlzIHdpbGwgcmV0dXJuIGEgc3VpdGFibHkgZGVjb2RlZCBVbmljb2RlCi0gICAgICBzdHJpbmcgd2hlbiB0aGUgdmFsdWUgaXMgYSB0dXBsZSwgb3IgdGhlIG9yaWdpbmFsIHN0cmluZyB1bnF1b3RlZCBpZiBpdAotICAgICAgaXNuJ3QuICBGb3IgZXhhbXBsZTo6Ci0KLSAgICAgICAgIHJhd3BhcmFtID0gbXNnLmdldF9wYXJhbSgnZm9vJykKLSAgICAgICAgIHBhcmFtID0gZW1haWwudXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZShyYXdwYXJhbSkKLQotICAgICAgSW4gYW55IGNhc2UsIHRoZSBwYXJhbWV0ZXIgdmFsdWUgKGVpdGhlciB0aGUgcmV0dXJuZWQgc3RyaW5nLCBvciB0aGUKLSAgICAgIGBgVkFMVUVgYCBpdGVtIGluIHRoZSAzLXR1cGxlKSBpcyBhbHdheXMgdW5xdW90ZWQsIHVubGVzcyAqdW5xdW90ZSogaXMgc2V0Ci0gICAgICB0byBgYEZhbHNlYGAuCisgICAgICA6bWltZXR5cGU6YHRleHQvcGxhaW5gIG9yIDptaW1ldHlwZTpgbWVzc2FnZS9yZmM4MjJgLCBhbHRob3VnaCB0aGlzIGlzCisgICAgICBub3QgZW5mb3JjZWQuICBUaGUgZGVmYXVsdCBjb250ZW50IHR5cGUgaXMgbm90IHN0b3JlZCBpbiB0aGUKKyAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciwgc28gaXQgb25seSBhZmZlY3RzIHRoZSByZXR1cm4gdmFsdWUgb2YKKyAgICAgIHRoZSBgYGdldF9jb250ZW50X3R5cGVgYCBtZXRob2RzIHdoZW4gbm8gOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAKKyAgICAgIGhlYWRlciBpcyBwcmVzZW50IGluIHRoZSBtZXNzYWdlLgogCiAKICAgIC4uIG1ldGhvZDo6IHNldF9wYXJhbShwYXJhbSwgdmFsdWUsIGhlYWRlcj0nQ29udGVudC1UeXBlJywgcmVxdW90ZT1UcnVlLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD1Ob25lLCBsYW5ndWFnZT0nJywgcmVwbGFjZT1GYWxzZSkKIAogICAgICAgU2V0IGEgcGFyYW1ldGVyIGluIHRoZSA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIuICBJZiB0aGUKLSAgICAgIHBhcmFtZXRlciBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgaGVhZGVyLCBpdHMgdmFsdWUgd2lsbCBiZSByZXBsYWNlZCB3aXRoCi0gICAgICAqdmFsdWUqLiAgSWYgdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciBhcyBub3QgeWV0IGJlZW4gZGVmaW5lZAotICAgICAgZm9yIHRoaXMgbWVzc2FnZSwgaXQgd2lsbCBiZSBzZXQgdG8gOm1pbWV0eXBlOmB0ZXh0L3BsYWluYCBhbmQgdGhlIG5ldwotICAgICAgcGFyYW1ldGVyIHZhbHVlIHdpbGwgYmUgYXBwZW5kZWQgYXMgcGVyIDpyZmM6YDIwNDVgLgorICAgICAgcGFyYW1ldGVyIGFscmVhZHkgZXhpc3RzIGluIHRoZSBoZWFkZXIsIHJlcGxhY2UgaXRzIHZhbHVlIHdpdGggKnZhbHVlKi4KKyAgICAgIFdoZW4gKmhlYWRlciogaXMgYGBDb250ZW50LVR5cGVgYCAodGhlIGRlZmF1bHQpIGFuZCB0aGUgaGVhZGVyIGRvZXMgbm90CisgICAgICB5ZXQgZXhpc3QgaW4gdGhlIG1lc3NhZ2UsIGFkZCBpdCwgc2V0IGl0cyB2YWx1ZSB0bworICAgICAgOm1pbWV0eXBlOmB0ZXh0L3BsYWluYCwgYW5kIGFwcGVuZCB0aGUgbmV3IHBhcmFtZXRlciB2YWx1ZS4gIE9wdGlvbmFsCisgICAgICAqaGVhZGVyKiBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgaGVhZGVyIHRvIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgLgogCi0gICAgICBPcHRpb25hbCAqaGVhZGVyKiBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgaGVhZGVyIHRvCi0gICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCwgYW5kIGFsbCBwYXJhbWV0ZXJzIHdpbGwgYmUgcXVvdGVkIGFzIG5lY2Vzc2FyeQotICAgICAgdW5sZXNzIG9wdGlvbmFsICpyZXF1b3RlKiBpcyBgYEZhbHNlYGAgKHRoZSBkZWZhdWx0IGlzIGBgVHJ1ZWBgKS4KLQotICAgICAgSWYgb3B0aW9uYWwgKmNoYXJzZXQqIGlzIHNwZWNpZmllZCwgdGhlIHBhcmFtZXRlciB3aWxsIGJlIGVuY29kZWQKLSAgICAgIGFjY29yZGluZyB0byA6cmZjOmAyMjMxYC4gT3B0aW9uYWwgKmxhbmd1YWdlKiBzcGVjaWZpZXMgdGhlIFJGQyAyMjMxCi0gICAgICBsYW5ndWFnZSwgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgc3RyaW5nLiAgQm90aCAqY2hhcnNldCogYW5kICpsYW5ndWFnZSoKLSAgICAgIHNob3VsZCBiZSBzdHJpbmdzLgorICAgICAgSWYgdGhlIHZhbHVlIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCB0aGUgY2hhcnNldCBhbmQgbGFuZ3VhZ2UgbWF5CisgICAgICBiZSBleHBsaWNpdHkgc3BlY2lmaWVkIHVzaW5nIHRoZSBvcHRpb25hbCAqY2hhcnNldCogYW5kICpsYW5ndWFnZSoKKyAgICAgIHBhcmFtZXRlcnMuICBPcHRpb25hbCAqbGFuZ3VhZ2UqIHNwZWNpZmllcyB0aGUgOnJmYzpgMjIzMWAgbGFuZ3VhZ2UsCisgICAgICBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuICBCb3RoICpjaGFyc2V0KiBhbmQgKmxhbmd1YWdlKiBzaG91bGQgYmUKKyAgICAgIHN0cmluZ3MuICBUaGUgZGVmYXVsdCBpcyB0byB1c2UgdGhlIGBgdXRmOGBgICpjaGFyc2V0KiBhbmQgYGBOb25lYGAgZm9yCisgICAgICB0aGUgKmxhbmd1YWdlKi4KIAogICAgICAgSWYgKnJlcGxhY2UqIGlzIGBgRmFsc2VgYCAodGhlIGRlZmF1bHQpIHRoZSBoZWFkZXIgaXMgbW92ZWQgdG8gdGhlCiAgICAgICBlbmQgb2YgdGhlIGxpc3Qgb2YgaGVhZGVycy4gIElmICpyZXBsYWNlKiBpcyBgYFRydWVgYCwgdGhlIGhlYWRlcgogICAgICAgd2lsbCBiZSB1cGRhdGVkIGluIHBsYWNlLgogCisgICAgICBVc2Ugb2YgdGhlICpyZXF1b3RlKiBwYXJhbWV0ZXIgd2l0aCA6Y2xhc3M6YEVtYWlsTWVzc2FnZWAgb2JqZWN0cyBpcworICAgICAgZGVwcmVjYXRlZC4KKworICAgICAgTm90ZSB0aGF0IGV4aXN0aW5nIHBhcmFtZXRlciB2YWx1ZXMgb2YgaGVhZGVycyBtYXkgYmUgYWNjZXNzZWQgdGhyb3VnaAorICAgICAgdGhlIDphdHRyOmB+ZW1haWwuaGVhZGVycmVnaXN0cnkuQmFzZUhlYWRlci5wYXJhbXNgIGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAgIGhlYWRlciB2YWx1ZSAoZm9yIGV4YW1wbGUsIGBgbXNnWydDb250ZW50LVR5cGUnXS5wYXJhbXNbJ2NoYXJzZXQnXWBgLgorCiAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNCBgYHJlcGxhY2VgYCBrZXl3b3JkIHdhcyBhZGRlZC4KIAogCkBAIC01MDIsMjUgKzM4OCwxMSBAQAogCiAgICAgICBSZW1vdmUgdGhlIGdpdmVuIHBhcmFtZXRlciBjb21wbGV0ZWx5IGZyb20gdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgCiAgICAgICBoZWFkZXIuICBUaGUgaGVhZGVyIHdpbGwgYmUgcmUtd3JpdHRlbiBpbiBwbGFjZSB3aXRob3V0IHRoZSBwYXJhbWV0ZXIgb3IKLSAgICAgIGl0cyB2YWx1ZS4gIEFsbCB2YWx1ZXMgd2lsbCBiZSBxdW90ZWQgYXMgbmVjZXNzYXJ5IHVubGVzcyAqcmVxdW90ZSogaXMKLSAgICAgIGBgRmFsc2VgYCAodGhlIGRlZmF1bHQgaXMgYGBUcnVlYGApLiAgT3B0aW9uYWwgKmhlYWRlciogc3BlY2lmaWVzIGFuCi0gICAgICBhbHRlcm5hdGl2ZSB0byA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYC4KKyAgICAgIGl0cyB2YWx1ZS4gIE9wdGlvbmFsICpoZWFkZXIqIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSB0bworICAgICAgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAuCiAKLQotICAgLi4gbWV0aG9kOjogc2V0X3R5cGUodHlwZSwgaGVhZGVyPSdDb250ZW50LVR5cGUnLCByZXF1b3RlPVRydWUpCi0KLSAgICAgIFNldCB0aGUgbWFpbiB0eXBlIGFuZCBzdWJ0eXBlIGZvciB0aGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAKLSAgICAgIGhlYWRlci4gKnR5cGUqIG11c3QgYmUgYSBzdHJpbmcgaW4gdGhlIGZvcm0gOm1pbWV0eXBlOmBtYWludHlwZS9zdWJ0eXBlYCwKLSAgICAgIG90aGVyd2lzZSBhIDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZC4KLQotICAgICAgVGhpcyBtZXRob2QgcmVwbGFjZXMgdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciwga2VlcGluZyBhbGwKLSAgICAgIHRoZSBwYXJhbWV0ZXJzIGluIHBsYWNlLiAgSWYgKnJlcXVvdGUqIGlzIGBgRmFsc2VgYCwgdGhpcyBsZWF2ZXMgdGhlCi0gICAgICBleGlzdGluZyBoZWFkZXIncyBxdW90aW5nIGFzIGlzLCBvdGhlcndpc2UgdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBxdW90ZWQKLSAgICAgICh0aGUgZGVmYXVsdCkuCi0KLSAgICAgIEFuIGFsdGVybmF0aXZlIGhlYWRlciBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSAqaGVhZGVyKiBhcmd1bWVudC4gV2hlbiB0aGUKLSAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciBpcyBzZXQgYSA6bWFpbGhlYWRlcjpgTUlNRS1WZXJzaW9uYAotICAgICAgaGVhZGVyIGlzIGFsc28gYWRkZWQuCisgICAgICBVc2Ugb2YgdGhlICpyZXF1b3RlKiBwYXJhbWV0ZXIgd2l0aCA6Y2xhc3M6YEVtYWlsTWVzc2FnZWAgb2JqZWN0cyBpcworICAgICAgZGVwcmVjYXRlZC4KIAogCiAgICAuLiBtZXRob2Q6OiBnZXRfZmlsZW5hbWUoZmFpbG9iaj1Ob25lKQpAQCAtNTQ5LDEyICs0MjEsMTEgQEAKICAgICAgIG5lY2Vzc2FyeS4gIEEgOmV4YzpgfmVtYWlsLmVycm9ycy5IZWFkZXJQYXJzZUVycm9yYCBpcyByYWlzZWQgaWYgdGhlCiAgICAgICBtZXNzYWdlIG9iamVjdCBoYXMgbm8gOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyLgogCi0gICAgICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBtZXRob2QgaXMgc3VidGx5IGRpZmZlcmVudCB0aGFuIGRlbGV0aW5nIHRoZSBvbGQKKyAgICAgIE5vdGUgdGhhdCB1c2luZyB0aGlzIG1ldGhvZCBpcyBzdWJ0bHkgZGlmZmVyZW50IGZyb20gZGVsZXRpbmcgdGhlIG9sZAogICAgICAgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyIGFuZCBhZGRpbmcgYSBuZXcgb25lIHdpdGggdGhlIG5ldwogICAgICAgYm91bmRhcnkgdmlhIDptZXRoOmBhZGRfaGVhZGVyYCwgYmVjYXVzZSA6bWV0aDpgc2V0X2JvdW5kYXJ5YCBwcmVzZXJ2ZXMKICAgICAgIHRoZSBvcmRlciBvZiB0aGUgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyIGluIHRoZSBsaXN0IG9mCi0gICAgICBoZWFkZXJzLiBIb3dldmVyLCBpdCBkb2VzICpub3QqIHByZXNlcnZlIGFueSBjb250aW51YXRpb24gbGluZXMgd2hpY2ggbWF5Ci0gICAgICBoYXZlIGJlZW4gcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyLgorICAgICAgaGVhZGVycy4KIAogCiAgICAuLiBtZXRob2Q6OiBnZXRfY29udGVudF9jaGFyc2V0KGZhaWxvYmo9Tm9uZSkKQEAgLTU2Myw5ICs0MzQsNiBAQAogICAgICAgY29lcmNlZCB0byBsb3dlciBjYXNlLiAgSWYgdGhlcmUgaXMgbm8gOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyLCBvciBpZgogICAgICAgdGhhdCBoZWFkZXIgaGFzIG5vIGBgY2hhcnNldGBgIHBhcmFtZXRlciwgKmZhaWxvYmoqIGlzIHJldHVybmVkLgogCi0gICAgICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIDptZXRoOmBnZXRfY2hhcnNldGAgd2hpY2ggcmV0dXJucyB0aGUKLSAgICAgIDpjbGFzczpgfmVtYWlsLmNoYXJzZXQuQ2hhcnNldGAgaW5zdGFuY2UgZm9yIHRoZSBkZWZhdWx0IGVuY29kaW5nIG9mIHRoZSBtZXNzYWdlIGJvZHkuCi0KIAogICAgLi4gbWV0aG9kOjogZ2V0X2NoYXJzZXRzKGZhaWxvYmo9Tm9uZSkKIApAQCAtNTc1LDEwICs0NDMsMTkgQEAKIAogICAgICAgRWFjaCBpdGVtIGluIHRoZSBsaXN0IHdpbGwgYmUgYSBzdHJpbmcgd2hpY2ggaXMgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgYGBjaGFyc2V0YGAgcGFyYW1ldGVyIGluIHRoZSA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIgZm9yIHRoZQotICAgICAgcmVwcmVzZW50ZWQgc3VicGFydC4gIEhvd2V2ZXIsIGlmIHRoZSBzdWJwYXJ0IGhhcyBubwotICAgICAgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyLCBubyBgYGNoYXJzZXRgYCBwYXJhbWV0ZXIsIG9yIGlzIG5vdCBvZgotICAgICAgdGhlIDptaW1ldHlwZTpgdGV4dGAgbWFpbiBNSU1FIHR5cGUsIHRoZW4gdGhhdCBpdGVtIGluIHRoZSByZXR1cm5lZCBsaXN0Ci0gICAgICB3aWxsIGJlICpmYWlsb2JqKi4KKyAgICAgIHJlcHJlc2VudGVkIHN1YnBhcnQuICBJZiB0aGUgc3VicGFydCBoYXMgbm8gOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAKKyAgICAgIGhlYWRlciwgbm8gYGBjaGFyc2V0YGAgcGFyYW1ldGVyLCBvciBpcyBub3Qgb2YgdGhlIDptaW1ldHlwZTpgdGV4dGAgbWFpbgorICAgICAgTUlNRSB0eXBlLCB0aGVuIHRoYXQgaXRlbSBpbiB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlICpmYWlsb2JqKi4KKworCisgICAuLiBtZXRob2Q6OiBpc19hdHRhY2htZW50CisKKyAgICAgIFJldHVybiBgYFRydWVgYCBpZiB0aGVyZSBpcyBhIDptYWlsaGVhZGVyOmBDb250ZW50LURpc3Bvc2l0aW9uYCBoZWFkZXIKKyAgICAgIGFuZCBpdHMgKGNhc2UgaW5zZW5zaXRpdmUpIHZhbHVlIGlzIGBgYXR0YWNobWVudGBgLCBgYEZhbHNlYGAgb3RoZXJ3aXNlLgorCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNC4yCisgICAgICAgICBpc19hdHRhY2htZW50IGlzIG5vdyBhIG1ldGhvZCBpbnN0ZWFkIG9mIGEgcHJvcGVydHksIGZvciBjb25zaXN0ZW5jeQorICAgICAgICAgd2l0aCA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5pc19tdWx0aXBhcnRgLgogCiAKICAgIC4uIG1ldGhvZDo6IGdldF9jb250ZW50X2Rpc3Bvc2l0aW9uKCkKQEAgLTU5MCw2ICs0NjcsMTEgQEAKIAogICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKKworICAgVGhlIGZvbGxvd2luZyBtZXRob2RzIHJlbGF0ZSB0byBpbnRlcnJvZ2F0aW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlIGNvbnRlbnQKKyAgIChwYXlsb2FkKSBvZiB0aGUgbWVzc2FnZS4KKworCiAgICAuLiBtZXRob2Q6OiB3YWxrKCkKIAogICAgICAgVGhlIDptZXRoOmB3YWxrYCBtZXRob2QgaXMgYW4gYWxsLXB1cnBvc2UgZ2VuZXJhdG9yIHdoaWNoIGNhbiBiZSB1c2VkIHRvCkBAIC02NTEsOCArNTMzLDE2OSBAQAogICAgICAgaW50byB0aGUgc3VicGFydHMuCiAKIAotICAgOmNsYXNzOmBNZXNzYWdlYCBvYmplY3RzIGNhbiBhbHNvIG9wdGlvbmFsbHkgY29udGFpbiB0d28gaW5zdGFuY2UgYXR0cmlidXRlcywKLSAgIHdoaWNoIGNhbiBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgcGxhaW4gdGV4dCBvZiBhIE1JTUUgbWVzc2FnZS4KKyAgIC4uIG1ldGhvZDo6IGdldF9ib2R5KHByZWZlcmVuY2VsaXN0PSgncmVsYXRlZCcsICdodG1sJywgJ3BsYWluJykpCisKKyAgICAgIFJldHVybiB0aGUgTUlNRSBwYXJ0IHRoYXQgaXMgdGhlIGJlc3QgY2FuZGlkYXRlIHRvIGJlIHRoZSAiYm9keSIgb2YgdGhlCisgICAgICBtZXNzYWdlLgorCisgICAgICAqcHJlZmVyZW5jZWxpc3QqIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGZyb20gdGhlIHNldCBgYHJlbGF0ZWRgYCwKKyAgICAgIGBgaHRtbGBgLCBhbmQgYGBwbGFpbmBgLCBhbmQgaW5kaWNhdGVzIHRoZSBvcmRlciBvZiBwcmVmZXJlbmNlIGZvciB0aGUKKyAgICAgIGNvbnRlbnQgdHlwZSBvZiB0aGUgcGFydCByZXR1cm5lZC4KKworICAgICAgU3RhcnQgbG9va2luZyBmb3IgY2FuZGlkYXRlIG1hdGNoZXMgd2l0aCB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZQorICAgICAgYGBnZXRfYm9keWBgIG1ldGhvZCBpcyBjYWxsZWQuCisKKyAgICAgIElmIGBgcmVsYXRlZGBgIGlzIG5vdCBpbmNsdWRlZCBpbiAqcHJlZmVyZW5jZWxpc3QqLCBjb25zaWRlciB0aGUgcm9vdAorICAgICAgcGFydCAob3Igc3VicGFydCBvZiB0aGUgcm9vdCBwYXJ0KSBvZiBhbnkgcmVsYXRlZCBlbmNvdW50ZXJlZCBhcyBhCisgICAgICBjYW5kaWRhdGUgaWYgdGhlIChzdWItKXBhcnQgbWF0Y2hlcyBhIHByZWZlcmVuY2UuCisKKyAgICAgIFdoZW4gZW5jb3VudGVyaW5nIGEgYGBtdWx0aXBhcnQvcmVsYXRlZGBgLCBjaGVjayB0aGUgYGBzdGFydGBgIHBhcmFtZXRlcgorICAgICAgYW5kIGlmIGEgcGFydCB3aXRoIGEgbWF0Y2hpbmcgOm1haWxoZWFkZXI6YENvbnRlbnQtSURgIGlzIGZvdW5kLCBjb25zaWRlcgorICAgICAgb25seSBpdCB3aGVuIGxvb2tpbmcgZm9yIGNhbmRpZGF0ZSBtYXRjaGVzLiAgT3RoZXJ3aXNlIGNvbnNpZGVyIG9ubHkgdGhlCisgICAgICBmaXJzdCAoZGVmYXVsdCByb290KSBwYXJ0IG9mIHRoZSBgYG11bHRpcGFydC9yZWxhdGVkYGAuCisKKyAgICAgIElmIGEgcGFydCBoYXMgYSA6bWFpbGhlYWRlcjpgQ29udGVudC1EaXNwb3NpdGlvbmAgaGVhZGVyLCBvbmx5IGNvbnNpZGVyCisgICAgICB0aGUgcGFydCBhIGNhbmRpZGF0ZSBtYXRjaCBpZiB0aGUgdmFsdWUgb2YgdGhlIGhlYWRlciBpcyBgYGlubGluZWBgLgorCisgICAgICBJZiBub25lIG9mIHRoZSBjYW5kaWRhdGVzIG1hdGNoZXMgYW55IG9mIHRoZSBwcmVmZXJlbmNlcyBpbgorICAgICAgKnByZWZlcm5lY2xpc3QqLCByZXR1cm4gYGBOb25lYGAuCisKKyAgICAgIE5vdGVzOiAoMSkgRm9yIG1vc3QgYXBwbGljYXRpb25zIHRoZSBvbmx5ICpwcmVmZXJlbmNlbGlzdCogY29tYmluYXRpb25zCisgICAgICB0aGF0IHJlYWxseSBtYWtlIHNlbnNlIGFyZSBgYCgncGxhaW4nLClgYCwgYGAoJ2h0bWwnLCAncGxhaW4nKWBgLCBhbmQgdGhlCisgICAgICBkZWZhdWx0IGBgKCdyZWxhdGVkJywgJ2h0bWwnLCAncGxhaW4nKWBgLiAgKDIpIEJlY2F1c2UgbWF0Y2hpbmcgc3RhcnRzCisgICAgICB3aXRoIHRoZSBvYmplY3Qgb24gd2hpY2ggYGBnZXRfYm9keWBgIGlzIGNhbGxlZCwgY2FsbGluZyBgYGdldF9ib2R5YGAgb24KKyAgICAgIGEgYGBtdWx0aXBhcnQvcmVsYXRlZGBgIHdpbGwgcmV0dXJuIHRoZSBvYmplY3QgaXRzZWxmIHVubGVzcworICAgICAgKnByZWZlcmVuY2VsaXN0KiBoYXMgYSBub24tZGVmYXVsdCB2YWx1ZS4gKDMpIE1lc3NhZ2VzIChvciBtZXNzYWdlIHBhcnRzKQorICAgICAgdGhhdCBkbyBub3Qgc3BlY2lmeSBhIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIG9yIHdob3NlCisgICAgICA6bWFpbGhlYWRlcjpgQ29udGVudC1UeXBlYCBoZWFkZXIgaXMgaW52YWxpZCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgdGhleQorICAgICAgYXJlIG9mIHR5cGUgYGB0ZXh0L3BsYWluYGAsIHdoaWNoIG1heSBvY2Nhc2lvbmFsbHkgY2F1c2UgYGBnZXRfYm9keWBgIHRvCisgICAgICByZXR1cm4gdW5leHBlY3RlZCByZXN1bHRzLgorCisKKyAgIC4uIG1ldGhvZDo6IGl0ZXJfYXR0YWNobWVudHMoKQorCisgICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBhbGwgb2YgdGhlIGltbWVkaWF0ZSBzdWItcGFydHMgb2YgdGhlIG1lc3NhZ2UKKyAgICAgIHRoYXQgYXJlIG5vdCBjYW5kaWRhdGUgImJvZHkiIHBhcnRzLiAgVGhhdCBpcywgc2tpcCB0aGUgZmlyc3Qgb2NjdXJyZW5jZQorICAgICAgb2YgZWFjaCBvZiBgYHRleHQvcGxhaW5gYCwgYGB0ZXh0L2h0bWxgYCwgYGBtdWx0aXBhcnQvcmVsYXRlZGBgLCBvcgorICAgICAgYGBtdWx0aXBhcnQvYWx0ZXJuYXRpdmVgYCAodW5sZXNzIHRoZXkgYXJlIGV4cGxpY2l0bHkgbWFya2VkIGFzCisgICAgICBhdHRhY2htZW50cyB2aWEgOm1haWxoZWFkZXI6YENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnRgKSwgYW5kCisgICAgICByZXR1cm4gYWxsIHJlbWFpbmluZyBwYXJ0cy4gIFdoZW4gYXBwbGllZCBkaXJlY3RseSB0byBhCisgICAgICBgYG11bHRpcGFydC9yZWxhdGVkYGAsIHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBhbGwgdGhlIHJlbGF0ZWQgcGFydHMKKyAgICAgIGV4Y2VwdCB0aGUgcm9vdCBwYXJ0IChpZTogdGhlIHBhcnQgcG9pbnRlZCB0byBieSB0aGUgYGBzdGFydGBgIHBhcmFtZXRlciwKKyAgICAgIG9yIHRoZSBmaXJzdCBwYXJ0IGlmIHRoZXJlIGlzIG5vIGBgc3RhcnRgYCBwYXJhbWV0ZXIgb3IgdGhlIGBgc3RhcnRgYAorICAgICAgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LUlEYCBvZiBhbnkgb2YgdGhlCisgICAgICBwYXJ0cykuICBXaGVuIGFwcGxpZWQgZGlyZWN0bHkgdG8gYSBgYG11bHRpcGFydC9hbHRlcm5hdGl2ZWBgIG9yIGEKKyAgICAgIG5vbi1gYG11bHRpcGFydGBgLCByZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IuCisKKworICAgLi4gbWV0aG9kOjogaXRlcl9wYXJ0cygpCisKKyAgICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIGFsbCBvZiB0aGUgaW1tZWRpYXRlIHN1Yi1wYXJ0cyBvZiB0aGUgbWVzc2FnZSwKKyAgICAgIHdoaWNoIHdpbGwgYmUgZW1wdHkgZm9yIGEgbm9uLWBgbXVsdGlwYXJ0YGAuICAoU2VlIGFsc28KKyAgICAgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2Uud2Fsa2AuKQorCisKKyAgIC4uIG1ldGhvZDo6IGdldF9jb250ZW50KCphcmdzLCBjb250ZW50X21hbmFnZXI9Tm9uZSwgKiprdykKKworICAgICAgQ2FsbCB0aGUgOm1ldGg6YH5lbWFpbC5jb250ZW50bWFuYWdlci5Db250ZW50TWFuYWdlci5nZXRfY29udGVudGAgbWV0aG9kCisgICAgICBvZiB0aGUgKmNvbnRlbnRfbWFuYWdlciosIHBhc3Npbmcgc2VsZiBhcyB0aGUgbWVzc2FnZSBvYmplY3QsIGFuZCBwYXNzaW5nCisgICAgICBhbG9uZyBhbnkgb3RoZXIgYXJndW1lbnRzIG9yIGtleXdvcmRzIGFzIGFkZGl0aW9uYWwgYXJndW1lbnRzLiAgSWYKKyAgICAgICpjb250ZW50X21hbmFnZXIqIGlzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgYGBjb250ZW50X21hbmFnZXJgYCBzcGVjaWZpZWQKKyAgICAgIGJ5IHRoZSBjdXJyZW50IDptb2Q6YH5lbWFpbC5wb2xpY3lgLgorCisKKyAgIC4uIG1ldGhvZDo6IHNldF9jb250ZW50KCphcmdzLCBjb250ZW50X21hbmFnZXI9Tm9uZSwgKiprdykKKworICAgICAgQ2FsbCB0aGUgOm1ldGg6YH5lbWFpbC5jb250ZW50bWFuYWdlci5Db250ZW50TWFuYWdlci5zZXRfY29udGVudGAgbWV0aG9kCisgICAgICBvZiB0aGUgKmNvbnRlbnRfbWFuYWdlciosIHBhc3Npbmcgc2VsZiBhcyB0aGUgbWVzc2FnZSBvYmplY3QsIGFuZCBwYXNzaW5nCisgICAgICBhbG9uZyBhbnkgb3RoZXIgYXJndW1lbnRzIG9yIGtleXdvcmRzIGFzIGFkZGl0aW9uYWwgYXJndW1lbnRzLiAgSWYKKyAgICAgICpjb250ZW50X21hbmFnZXIqIGlzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgYGBjb250ZW50X21hbmFnZXJgYCBzcGVjaWZpZWQKKyAgICAgIGJ5IHRoZSBjdXJyZW50IDptb2Q6YH5lbWFpbC5wb2xpY3lgLgorCisKKyAgIC4uIG1ldGhvZDo6IG1ha2VfcmVsYXRlZChib3VuZGFyeT1Ob25lKQorCisgICAgICBDb252ZXJ0IGEgbm9uLWBgbXVsdGlwYXJ0YGAgbWVzc2FnZSBpbnRvIGEgYGBtdWx0aXBhcnQvcmVsYXRlZGBgIG1lc3NhZ2UsCisgICAgICBtb3ZpbmcgYW55IGV4aXN0aW5nIDptYWlsaGVhZGVyOmBDb250ZW50LWAgaGVhZGVycyBhbmQgcGF5bG9hZCBpbnRvIGEKKyAgICAgIChuZXcpIGZpcnN0IHBhcnQgb2YgdGhlIGBgbXVsdGlwYXJ0YGAuICBJZiAqYm91bmRhcnkqIGlzIHNwZWNpZmllZCwgdXNlCisgICAgICBpdCBhcyB0aGUgYm91bmRhcnkgc3RyaW5nIGluIHRoZSBtdWx0aXBhcnQsIG90aGVyd2lzZSBsZWF2ZSB0aGUgYm91bmRhcnkKKyAgICAgIHRvIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aGVuIGl0IGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlCisgICAgICBtZXNzYWdlIGlzIHNlcmlhbGl6ZWQpLgorCisKKyAgIC4uIG1ldGhvZDo6IG1ha2VfYWx0ZXJuYXRpdmUoYm91bmRhcnk9Tm9uZSkKKworICAgICAgQ29udmVydCBhIG5vbi1gYG11bHRpcGFydGBgIG9yIGEgYGBtdWx0aXBhcnQvcmVsYXRlZGBgIGludG8gYQorICAgICAgYGBtdWx0aXBhcnQvYWx0ZXJuYXRpdmVgYCwgbW92aW5nIGFueSBleGlzdGluZyA6bWFpbGhlYWRlcjpgQ29udGVudC1gCisgICAgICBoZWFkZXJzIGFuZCBwYXlsb2FkIGludG8gYSAobmV3KSBmaXJzdCBwYXJ0IG9mIHRoZSBgYG11bHRpcGFydGBgLiAgSWYKKyAgICAgICpib3VuZGFyeSogaXMgc3BlY2lmaWVkLCB1c2UgaXQgYXMgdGhlIGJvdW5kYXJ5IHN0cmluZyBpbiB0aGUgbXVsdGlwYXJ0LAorICAgICAgb3RoZXJ3aXNlIGxlYXZlIHRoZSBib3VuZGFyeSB0byBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2hlbiBpdCBpcworICAgICAgbmVlZGVkIChmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbWVzc2FnZSBpcyBzZXJpYWxpemVkKS4KKworCisgICAuLiBtZXRob2Q6OiBtYWtlX21peGVkKGJvdW5kYXJ5PU5vbmUpCisKKyAgICAgIENvbnZlcnQgYSBub24tYGBtdWx0aXBhcnRgYCwgYSBgYG11bHRpcGFydC9yZWxhdGVkYGAsIG9yIGEKKyAgICAgIGBgbXVsdGlwYXJ0LWFsdGVybmF0aXZlYGAgaW50byBhIGBgbXVsdGlwYXJ0L21peGVkYGAsIG1vdmluZyBhbnkgZXhpc3RpbmcKKyAgICAgIDptYWlsaGVhZGVyOmBDb250ZW50LWAgaGVhZGVycyBhbmQgcGF5bG9hZCBpbnRvIGEgKG5ldykgZmlyc3QgcGFydCBvZiB0aGUKKyAgICAgIGBgbXVsdGlwYXJ0YGAuICBJZiAqYm91bmRhcnkqIGlzIHNwZWNpZmllZCwgdXNlIGl0IGFzIHRoZSBib3VuZGFyeSBzdHJpbmcKKyAgICAgIGluIHRoZSBtdWx0aXBhcnQsIG90aGVyd2lzZSBsZWF2ZSB0aGUgYm91bmRhcnkgdG8gYmUgYXV0b21hdGljYWxseQorICAgICAgY3JlYXRlZCB3aGVuIGl0IGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG1lc3NhZ2UgaXMgc2VyaWFsaXplZCkuCisKKworICAgLi4gbWV0aG9kOjogYWRkX3JlbGF0ZWQoKmFyZ3MsIGNvbnRlbnRfbWFuYWdlcj1Ob25lLCAqKmt3KQorCisgICAgICBJZiB0aGUgbWVzc2FnZSBpcyBhIGBgbXVsdGlwYXJ0L3JlbGF0ZWRgYCwgY3JlYXRlIGEgbmV3IG1lc3NhZ2UKKyAgICAgIG9iamVjdCwgcGFzcyBhbGwgb2YgdGhlIGFyZ3VtZW50cyB0byBpdHMgOm1ldGg6YHNldF9jb250ZW50YCBtZXRob2QsCisgICAgICBhbmQgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuYXR0YWNoYCBpdCB0byB0aGUgYGBtdWx0aXBhcnRgYC4gIElmCisgICAgICB0aGUgbWVzc2FnZSBpcyBhIG5vbi1gYG11bHRpcGFydGBgLCBjYWxsIDptZXRoOmBtYWtlX3JlbGF0ZWRgIGFuZCB0aGVuCisgICAgICBwcm9jZWVkIGFzIGFib3ZlLiAgSWYgdGhlIG1lc3NhZ2UgaXMgYW55IG90aGVyIHR5cGUgb2YgYGBtdWx0aXBhcnRgYCwKKyAgICAgIHJhaXNlIGEgOmV4YzpgVHlwZUVycm9yYC4gSWYgKmNvbnRlbnRfbWFuYWdlciogaXMgbm90IHNwZWNpZmllZCwgdXNlCisgICAgICB0aGUgYGBjb250ZW50X21hbmFnZXJgYCBzcGVjaWZpZWQgYnkgdGhlIGN1cnJlbnQgOm1vZDpgfmVtYWlsLnBvbGljeWAuCisgICAgICBJZiB0aGUgYWRkZWQgcGFydCBoYXMgbm8gOm1haWxoZWFkZXI6YENvbnRlbnQtRGlzcG9zaXRpb25gIGhlYWRlciwKKyAgICAgIGFkZCBvbmUgd2l0aCB0aGUgdmFsdWUgYGBpbmxpbmVgYC4KKworCisgICAuLiBtZXRob2Q6OiBhZGRfYWx0ZXJuYXRpdmUoKmFyZ3MsIGNvbnRlbnRfbWFuYWdlcj1Ob25lLCAqKmt3KQorCisgICAgICBJZiB0aGUgbWVzc2FnZSBpcyBhIGBgbXVsdGlwYXJ0L2FsdGVybmF0aXZlYGAsIGNyZWF0ZSBhIG5ldyBtZXNzYWdlCisgICAgICBvYmplY3QsIHBhc3MgYWxsIG9mIHRoZSBhcmd1bWVudHMgdG8gaXRzIDptZXRoOmBzZXRfY29udGVudGAgbWV0aG9kLCBhbmQKKyAgICAgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmF0dGFjaGAgaXQgdG8gdGhlIGBgbXVsdGlwYXJ0YGAuICBJZiB0aGUKKyAgICAgIG1lc3NhZ2UgaXMgYSBub24tYGBtdWx0aXBhcnRgYCBvciBgYG11bHRpcGFydC9yZWxhdGVkYGAsIGNhbGwKKyAgICAgIDptZXRoOmBtYWtlX2FsdGVybmF0aXZlYCBhbmQgdGhlbiBwcm9jZWVkIGFzIGFib3ZlLiAgSWYgdGhlIG1lc3NhZ2UgaXMKKyAgICAgIGFueSBvdGhlciB0eXBlIG9mIGBgbXVsdGlwYXJ0YGAsIHJhaXNlIGEgOmV4YzpgVHlwZUVycm9yYC4gSWYKKyAgICAgICpjb250ZW50X21hbmFnZXIqIGlzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgYGBjb250ZW50X21hbmFnZXJgYCBzcGVjaWZpZWQKKyAgICAgIGJ5IHRoZSBjdXJyZW50IDptb2Q6YH5lbWFpbC5wb2xpY3lgLgorCisKKyAgIC4uIG1ldGhvZDo6IGFkZF9hdHRhY2htZW50KCphcmdzLCBjb250ZW50X21hbmFnZXI9Tm9uZSwgKiprdykKKworICAgICAgSWYgdGhlIG1lc3NhZ2UgaXMgYSBgYG11bHRpcGFydC9taXhlZGBgLCBjcmVhdGUgYSBuZXcgbWVzc2FnZSBvYmplY3QsCisgICAgICBwYXNzIGFsbCBvZiB0aGUgYXJndW1lbnRzIHRvIGl0cyA6bWV0aDpgc2V0X2NvbnRlbnRgIG1ldGhvZCwgYW5kCisgICAgICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5hdHRhY2hgIGl0IHRvIHRoZSBgYG11bHRpcGFydGBgLiAgSWYgdGhlCisgICAgICBtZXNzYWdlIGlzIGEgbm9uLWBgbXVsdGlwYXJ0YGAsIGBgbXVsdGlwYXJ0L3JlbGF0ZWRgYCwgb3IKKyAgICAgIGBgbXVsdGlwYXJ0L2FsdGVybmF0aXZlYGAsIGNhbGwgOm1ldGg6YG1ha2VfbWl4ZWRgIGFuZCB0aGVuIHByb2NlZWQgYXMKKyAgICAgIGFib3ZlLiBJZiAqY29udGVudF9tYW5hZ2VyKiBpcyBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGBgY29udGVudF9tYW5hZ2VyYGAKKyAgICAgIHNwZWNpZmllZCBieSB0aGUgY3VycmVudCA6bW9kOmB+ZW1haWwucG9saWN5YC4gIElmIHRoZSBhZGRlZCBwYXJ0CisgICAgICBoYXMgbm8gOm1haWxoZWFkZXI6YENvbnRlbnQtRGlzcG9zaXRpb25gIGhlYWRlciwgYWRkIG9uZSB3aXRoIHRoZSB2YWx1ZQorICAgICAgYGBhdHRhY2htZW50YGAuICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBib3RoIGZvciBleHBsaWNpdCBhdHRhY2htZW50cworICAgICAgKDptYWlsaGVhZGVyOmBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50YCBhbmQgYGBpbmxpbmVgYCBhdHRhY2htZW50cworICAgICAgKDptYWlsaGVhZGVyOmBDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmVgKSwgYnkgcGFzc2luZyBhcHByb3ByaWF0ZQorICAgICAgb3B0aW9ucyB0byB0aGUgYGBjb250ZW50X21hbmFnZXJgYC4KKworCisgICAuLiBtZXRob2Q6OiBjbGVhcigpCisKKyAgICAgIFJlbW92ZSB0aGUgcGF5bG9hZCBhbmQgYWxsIG9mIHRoZSBoZWFkZXJzLgorCisKKyAgIC4uIG1ldGhvZDo6IGNsZWFyX2NvbnRlbnQoKQorCisgICAgICBSZW1vdmUgdGhlIHBheWxvYWQgYW5kIGFsbCBvZiB0aGUgOmV4YzpgQ29udGVudC1gIGhlYWRlcnMsIGxlYXZpbmcKKyAgICAgIGFsbCBvdGhlciBoZWFkZXJzIGludGFjdCBhbmQgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuCisKKworICAgOmNsYXNzOmBFbWFpbE1lc3NhZ2VgIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIGluc3RhbmNlIGF0dHJpYnV0ZXM6CiAKIAogICAgLi4gYXR0cmlidXRlOjogcHJlYW1ibGUKQEAgLTY4MiwxMSArNzI1LDggQEAKIAogICAgICAgVGhlICplcGlsb2d1ZSogYXR0cmlidXRlIGFjdHMgdGhlIHNhbWUgd2F5IGFzIHRoZSAqcHJlYW1ibGUqIGF0dHJpYnV0ZSwKICAgICAgIGV4Y2VwdCB0aGF0IGl0IGNvbnRhaW5zIHRleHQgdGhhdCBhcHBlYXJzIGJldHdlZW4gdGhlIGxhc3QgYm91bmRhcnkgYW5kCi0gICAgICB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLgotCi0gICAgICBZb3UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBlcGlsb2d1ZSB0byB0aGUgZW1wdHkgc3RyaW5nIGluIG9yZGVyIGZvciB0aGUKLSAgICAgIDpjbGFzczpgfmVtYWlsLmdlbmVyYXRvci5HZW5lcmF0b3JgIHRvIHByaW50IGEgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZQotICAgICAgZmlsZS4KKyAgICAgIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UuICBBcyB3aXRoIHRoZSA6YXR0cjpgfkVtYWlsTWVzc2FnZS5wcmVhbWJsZWAsCisgICAgICBpZiB0aGVyZSBpcyBubyBlcGlsb2cgdGV4dCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIGBgTm9uZWBgLgogCiAKICAgIC4uIGF0dHJpYnV0ZTo6IGRlZmVjdHMKQEAgLTY5NCwzICs3MzQsMTggQEAKICAgICAgIFRoZSAqZGVmZWN0cyogYXR0cmlidXRlIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgdGhlIHByb2JsZW1zIGZvdW5kIHdoZW4KICAgICAgIHBhcnNpbmcgdGhpcyBtZXNzYWdlLiAgU2VlIDptb2Q6YGVtYWlsLmVycm9yc2AgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24KICAgICAgIG9mIHRoZSBwb3NzaWJsZSBwYXJzaW5nIGRlZmVjdHMuCisKKworLi4gY2xhc3M6OiBNSU1FUGFydChwb2xpY3k9ZGVmYXVsdCkKKworICAgIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHN1YnBhcnQgb2YgYSBNSU1FIG1lc3NhZ2UuICBJdCBpcyBpZGVudGljYWwgdG8KKyAgICA6Y2xhc3M6YEVtYWlsTWVzc2FnZWAsIGV4Y2VwdCB0aGF0IG5vIDptYWlsaGVhZGVyOmBNSU1FLVZlcnNpb25gIGhlYWRlcnMgYXJlCisgICAgYWRkZWQgd2hlbiA6bWV0aDpgfkVtYWlsTWVzc2FnZS5zZXRfY29udGVudGAgaXMgY2FsbGVkLCBzaW5jZSBzdWItcGFydHMgZG8KKyAgICBub3QgbmVlZCB0aGVpciBvd24gOm1haWxoZWFkZXI6YE1JTUUtVmVyc2lvbmAgaGVhZGVycy4KKworCisuLiBydWJyaWM6OiBGb290bm90ZXMKKworLi4gWzFdIE9yaW5nYWxseSBhZGRlZCBpbiAzLjQgYXMgYSA6dGVybTpgcHJvdmlzaW9uYWwgbW9kdWxlIDxwcm92aXNpb25hbAorICAgICAgIHBhY2thZ2U+YC4gIERvY3MgZm9yIGxlZ2FjeSBtZXNzYWdlIGNsYXNzIG1vdmVkIHRvCisgICAgICAgOnJlZjpgY29tcGF0MzJfbWVzc2FnZWAuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9lbWFpbC5taW1lLnJzdCBiL0RvYy9saWJyYXJ5L2VtYWlsLm1pbWUucnN0CmluZGV4IDgyOTdkZWEuLmQ5ZGFlOWYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2VtYWlsLm1pbWUucnN0CisrKyBiL0RvYy9saWJyYXJ5L2VtYWlsLm1pbWUucnN0CkBAIC04LDYgKzgsMTEgQEAKIAogLS0tLS0tLS0tLS0tLS0KIAorVGhpcyBtb2R1bGUgaXMgcGFydCBvZiB0aGUgbGVnYWN5IChgYENvbXBhdDMyYGApIGVtYWlsIEFQSS4gIEl0cyBmdW5jdGlvbmFsaXR5CitpcyBwYXJ0aWFsbHkgcmVwbGFjZWQgYnkgdGhlIDptb2Q6YH5lbWFpbC5jb250ZW50bWFuYWdlcmAgaW4gdGhlIG5ldyBBUEksIGJ1dAoraW4gY2VydGFpbiBhcHBsaWNhdGlvbnMgdGhlc2UgY2xhc3NlcyBtYXkgc3RpbGwgYmUgdXNlZnVsLCBldmVuIGluIG5vbi1sZWdhY3kKK2NvZGUuCisKIE9yZGluYXJpbHksIHlvdSBnZXQgYSBtZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmUgYnkgcGFzc2luZyBhIGZpbGUgb3Igc29tZSB0ZXh0IHRvCiBhIHBhcnNlciwgd2hpY2ggcGFyc2VzIHRoZSB0ZXh0IGFuZCByZXR1cm5zIHRoZSByb290IG1lc3NhZ2Ugb2JqZWN0LiAgSG93ZXZlcgogeW91IGNhbiBhbHNvIGJ1aWxkIGEgY29tcGxldGUgbWVzc2FnZSBzdHJ1Y3R1cmUgZnJvbSBzY3JhdGNoLCBvciBldmVuIGluZGl2aWR1YWwKQEAgLTI1LDcgKzMwLDcgQEAKIAogLi4gY3VycmVudG1vZHVsZTo6IGVtYWlsLm1pbWUuYmFzZQogCi0uLiBjbGFzczo6IE1JTUVCYXNlKF9tYWludHlwZSwgX3N1YnR5cGUsICoqX3BhcmFtcykKKy4uIGNsYXNzOjogTUlNRUJhc2UoX21haW50eXBlLCBfc3VidHlwZSwgKiwgcG9saWN5PWNvbXBhdDMyLCAqKl9wYXJhbXMpCiAKICAgIE1vZHVsZTogOm1vZDpgZW1haWwubWltZS5iYXNlYAogCkBAIC00MSwxMCArNDYsMTcgQEAKICAgIGtleS92YWx1ZSBkaWN0aW9uYXJ5IGFuZCBpcyBwYXNzZWQgZGlyZWN0bHkgdG8gOm1ldGg6YE1lc3NhZ2UuYWRkX2hlYWRlcgogICAgPGVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5hZGRfaGVhZGVyPmAuCiAKKyAgIElmICpwb2xpY3kqIGlzIHNwZWNpZmllZCwgKGRlZmF1bHRzIHRvIHRoZQorICAgOmNsYXNzOmBjb21wYXQzMiA8ZW1haWwucG9saWN5LkNvbXBhdDMyPmAgcG9saWN5KSBpdCB3aWxsIGJlIHBhc3NlZCB0bworICAgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYC4KKwogICAgVGhlIDpjbGFzczpgTUlNRUJhc2VgIGNsYXNzIGFsd2F5cyBhZGRzIGEgOm1haWxoZWFkZXI6YENvbnRlbnQtVHlwZWAgaGVhZGVyCiAgICAoYmFzZWQgb24gKl9tYWludHlwZSosICpfc3VidHlwZSosIGFuZCAqX3BhcmFtcyopLCBhbmQgYQogICAgOm1haWxoZWFkZXI6YE1JTUUtVmVyc2lvbmAgaGVhZGVyIChhbHdheXMgc2V0IHRvIGBgMS4wYGApLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgKnBvbGljeSoga2V5d29yZC1vbmx5IHBhcmFtZXRlci4KKwogCiAuLiBjdXJyZW50bW9kdWxlOjogZW1haWwubWltZS5ub25tdWx0aXBhcnQKIApAQCAtNjIsNyArNzQsOCBAQAogCiAuLiBjdXJyZW50bW9kdWxlOjogZW1haWwubWltZS5tdWx0aXBhcnQKIAotLi4gY2xhc3M6OiBNSU1FTXVsdGlwYXJ0KF9zdWJ0eXBlPSdtaXhlZCcsIGJvdW5kYXJ5PU5vbmUsIF9zdWJwYXJ0cz1Ob25lLCAqKl9wYXJhbXMpCisuLiBjbGFzczo6IE1JTUVNdWx0aXBhcnQoX3N1YnR5cGU9J21peGVkJywgYm91bmRhcnk9Tm9uZSwgX3N1YnBhcnRzPU5vbmUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLCBwb2xpY3k9Y29tcGF0MzIsICoqX3BhcmFtcykKIAogICAgTW9kdWxlOiA6bW9kOmBlbWFpbC5taW1lLm11bHRpcGFydGAKIApAQCAtODIsMTQgKzk1LDIwIEBACiAgICB0byB0aGUgbWVzc2FnZSBieSB1c2luZyB0aGUgOm1ldGg6YE1lc3NhZ2UuYXR0YWNoCiAgICA8ZW1haWwubWVzc2FnZS5NZXNzYWdlLmF0dGFjaD5gIG1ldGhvZC4KIAorICAgT3B0aW9uYWwgKnBvbGljeSogYXJndW1lbnQgZGVmYXVsdHMgdG8gOmNsYXNzOmBjb21wYXQzMiA8ZW1haWwucG9saWN5LkNvbXBhdDMyPmAuCisKICAgIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciBhcmUgdGFrZW4gZnJvbQogICAgdGhlIGtleXdvcmQgYXJndW1lbnRzLCBvciBwYXNzZWQgaW50byB0aGUgKl9wYXJhbXMqIGFyZ3VtZW50LCB3aGljaCBpcyBhIGtleXdvcmQKICAgIGRpY3Rpb25hcnkuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCAqcG9saWN5KiBrZXl3b3JkLW9ubHkgcGFyYW1ldGVyLgogCiAuLiBjdXJyZW50bW9kdWxlOjogZW1haWwubWltZS5hcHBsaWNhdGlvbgogCi0uLiBjbGFzczo6IE1JTUVBcHBsaWNhdGlvbihfZGF0YSwgX3N1YnR5cGU9J29jdGV0LXN0cmVhbScsIF9lbmNvZGVyPWVtYWlsLmVuY29kZXJzLmVuY29kZV9iYXNlNjQsICoqX3BhcmFtcykKKy4uIGNsYXNzOjogTUlNRUFwcGxpY2F0aW9uKF9kYXRhLCBfc3VidHlwZT0nb2N0ZXQtc3RyZWFtJywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VuY29kZXI9ZW1haWwuZW5jb2RlcnMuZW5jb2RlX2Jhc2U2NCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiwgcG9saWN5PWNvbXBhdDMyLCAqKl9wYXJhbXMpCiAKICAgIE1vZHVsZTogOm1vZDpgZW1haWwubWltZS5hcHBsaWNhdGlvbmAKIApAQCAtMTA5LDEyICsxMjgsMTggQEAKICAgIG9iamVjdCBhcyBuZWNlc3NhcnkuICBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBiYXNlNjQuICBTZWUgdGhlCiAgICA6bW9kOmBlbWFpbC5lbmNvZGVyc2AgbW9kdWxlIGZvciBhIGxpc3Qgb2YgdGhlIGJ1aWx0LWluIGVuY29kZXJzLgogCisgICBPcHRpb25hbCAqcG9saWN5KiBhcmd1bWVudCBkZWZhdWx0cyB0byA6Y2xhc3M6YGNvbXBhdDMyIDxlbWFpbC5wb2xpY3kuQ29tcGF0MzI+YC4KKwogICAgKl9wYXJhbXMqIGFyZSBwYXNzZWQgc3RyYWlnaHQgdGhyb3VnaCB0byB0aGUgYmFzZSBjbGFzcyBjb25zdHJ1Y3Rvci4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkICpwb2xpY3kqIGtleXdvcmQtb25seSBwYXJhbWV0ZXIuCiAKIC4uIGN1cnJlbnRtb2R1bGU6OiBlbWFpbC5taW1lLmF1ZGlvCiAKLS4uIGNsYXNzOjogTUlNRUF1ZGlvKF9hdWRpb2RhdGEsIF9zdWJ0eXBlPU5vbmUsIF9lbmNvZGVyPWVtYWlsLmVuY29kZXJzLmVuY29kZV9iYXNlNjQsICoqX3BhcmFtcykKKy4uIGNsYXNzOjogTUlNRUF1ZGlvKF9hdWRpb2RhdGEsIF9zdWJ0eXBlPU5vbmUsIFwKKyAgICAgICAgICAgICAgICAgICAgIF9lbmNvZGVyPWVtYWlsLmVuY29kZXJzLmVuY29kZV9iYXNlNjQsIFwKKyAgICAgICAgICAgICAgICAgICAgICosIHBvbGljeT1jb21wYXQzMiwgKipfcGFyYW1zKQogCiAgICBNb2R1bGU6IDptb2Q6YGVtYWlsLm1pbWUuYXVkaW9gCiAKQEAgLTEzNywxMiArMTYyLDE4IEBACiAgICBvYmplY3QgYXMgbmVjZXNzYXJ5LiAgVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgYmFzZTY0LiAgU2VlIHRoZQogICAgOm1vZDpgZW1haWwuZW5jb2RlcnNgIG1vZHVsZSBmb3IgYSBsaXN0IG9mIHRoZSBidWlsdC1pbiBlbmNvZGVycy4KIAorICAgT3B0aW9uYWwgKnBvbGljeSogYXJndW1lbnQgZGVmYXVsdHMgdG8gOmNsYXNzOmBjb21wYXQzMiA8ZW1haWwucG9saWN5LkNvbXBhdDMyPmAuCisKICAgICpfcGFyYW1zKiBhcmUgcGFzc2VkIHN0cmFpZ2h0IHRocm91Z2ggdG8gdGhlIGJhc2UgY2xhc3MgY29uc3RydWN0b3IuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCAqcG9saWN5KiBrZXl3b3JkLW9ubHkgcGFyYW1ldGVyLgogCiAuLiBjdXJyZW50bW9kdWxlOjogZW1haWwubWltZS5pbWFnZQogCi0uLiBjbGFzczo6IE1JTUVJbWFnZShfaW1hZ2VkYXRhLCBfc3VidHlwZT1Ob25lLCBfZW5jb2Rlcj1lbWFpbC5lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqKl9wYXJhbXMpCisuLiBjbGFzczo6IE1JTUVJbWFnZShfaW1hZ2VkYXRhLCBfc3VidHlwZT1Ob25lLCBcCisgICAgICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1lbWFpbC5lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCBcCisgICAgICAgICAgICAgICAgICAgICosIHBvbGljeT1jb21wYXQzMiwgKipfcGFyYW1zKQogCiAgICBNb2R1bGU6IDptb2Q6YGVtYWlsLm1pbWUuaW1hZ2VgCiAKQEAgLTE2NSwxMyArMTk2LDE3IEBACiAgICBvYmplY3QgYXMgbmVjZXNzYXJ5LiAgVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgYmFzZTY0LiAgU2VlIHRoZQogICAgOm1vZDpgZW1haWwuZW5jb2RlcnNgIG1vZHVsZSBmb3IgYSBsaXN0IG9mIHRoZSBidWlsdC1pbiBlbmNvZGVycy4KIAorICAgT3B0aW9uYWwgKnBvbGljeSogYXJndW1lbnQgZGVmYXVsdHMgdG8gOmNsYXNzOmBjb21wYXQzMiA8ZW1haWwucG9saWN5LkNvbXBhdDMyPmAuCisKICAgICpfcGFyYW1zKiBhcmUgcGFzc2VkIHN0cmFpZ2h0IHRocm91Z2ggdG8gdGhlIDpjbGFzczpgfmVtYWlsLm1pbWUuYmFzZS5NSU1FQmFzZWAKICAgIGNvbnN0cnVjdG9yLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgKnBvbGljeSoga2V5d29yZC1vbmx5IHBhcmFtZXRlci4KIAogLi4gY3VycmVudG1vZHVsZTo6IGVtYWlsLm1pbWUubWVzc2FnZQogCi0uLiBjbGFzczo6IE1JTUVNZXNzYWdlKF9tc2csIF9zdWJ0eXBlPSdyZmM4MjInKQorLi4gY2xhc3M6OiBNSU1FTWVzc2FnZShfbXNnLCBfc3VidHlwZT0ncmZjODIyJywgKiwgcG9saWN5PWNvbXBhdDMyKQogCiAgICBNb2R1bGU6IDptb2Q6YGVtYWlsLm1pbWUubWVzc2FnZWAKIApAQCAtMTg0LDEwICsyMTksMTQgQEAKICAgIE9wdGlvbmFsICpfc3VidHlwZSogc2V0cyB0aGUgc3VidHlwZSBvZiB0aGUgbWVzc2FnZTsgaXQgZGVmYXVsdHMgdG8KICAgIDptaW1ldHlwZTpgcmZjODIyYC4KIAorICAgT3B0aW9uYWwgKnBvbGljeSogYXJndW1lbnQgZGVmYXVsdHMgdG8gOmNsYXNzOmBjb21wYXQzMiA8ZW1haWwucG9saWN5LkNvbXBhdDMyPmAuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCAqcG9saWN5KiBrZXl3b3JkLW9ubHkgcGFyYW1ldGVyLgogCiAuLiBjdXJyZW50bW9kdWxlOjogZW1haWwubWltZS50ZXh0CiAKLS4uIGNsYXNzOjogTUlNRVRleHQoX3RleHQsIF9zdWJ0eXBlPSdwbGFpbicsIF9jaGFyc2V0PU5vbmUpCisuLiBjbGFzczo6IE1JTUVUZXh0KF90ZXh0LCBfc3VidHlwZT0ncGxhaW4nLCBfY2hhcnNldD1Ob25lLCAqLCBwb2xpY3k9Y29tcGF0MzIpCiAKICAgIE1vZHVsZTogOm1vZDpgZW1haWwubWltZS50ZXh0YAogCkBAIC0yMTEsNSArMjUwLDEwIEBACiAgICB3aWxsIGF1dG9tYXRpY2FsbHkgZW5jb2RlIHRoZSBuZXcgcGF5bG9hZCAoYW5kIGFkZCBhIG5ldwogICAgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlcikuCiAKKyAgIE9wdGlvbmFsICpwb2xpY3kqIGFyZ3VtZW50IGRlZmF1bHRzIHRvIDpjbGFzczpgY29tcGF0MzIgPGVtYWlsLnBvbGljeS5Db21wYXQzMj5gLgorCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQogICAgICAgKl9jaGFyc2V0KiBhbHNvIGFjY2VwdHMgOmNsYXNzOmB+ZW1haWwuY2hhcnNldC5DaGFyc2V0YCBpbnN0YW5jZXMuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCAqcG9saWN5KiBrZXl3b3JkLW9ubHkgcGFyYW1ldGVyLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwucGFyc2VyLnJzdCBiL0RvYy9saWJyYXJ5L2VtYWlsLnBhcnNlci5yc3QKaW5kZXggYjhlYjdjNS4uNGRiYWQ0OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwucGFyc2VyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC5wYXJzZXIucnN0CkBAIC04LDE5MCArOCwxNTUgQEAKIAogLS0tLS0tLS0tLS0tLS0KIAotTWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlcyBjYW4gYmUgY3JlYXRlZCBpbiBvbmUgb2YgdHdvIHdheXM6IHRoZXkgY2FuIGJlIGNyZWF0ZWQKLWZyb20gd2hvbGUgY2xvdGggYnkgaW5zdGFudGlhdGluZyA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIG9iamVjdHMgYW5kCi1zdHJpbmdpbmcgdGhlbSB0b2dldGhlciB2aWEgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuYXR0YWNoYCBhbmQKLTptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLnNldF9wYXlsb2FkYCBjYWxscywgb3IgdGhleQotY2FuIGJlIGNyZWF0ZWQgYnkgcGFyc2luZyBhIGZsYXQgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW1haWwgbWVzc2FnZS4KK01lc3NhZ2Ugb2JqZWN0IHN0cnVjdHVyZXMgY2FuIGJlIGNyZWF0ZWQgaW4gb25lIG9mIHR3byB3YXlzOiB0aGV5IGNhbiBiZQorY3JlYXRlZCBmcm9tIHdob2xlIGNsb3RoIGJ5IGNyZWF0aW5nIGFuIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlYAorb2JqZWN0LCBhZGRpbmcgaGVhZGVycyB1c2luZyB0aGUgZGljdGlvbmFyeSBpbnRlcmZhY2UsIGFuZCBhZGRpbmcgcGF5bG9hZChzKQordXNpbmcgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZS5zZXRfY29udGVudGAgYW5kIHJlbGF0ZWQgbWV0aG9kcywgb3IKK3RoZXkgY2FuIGJlIGNyZWF0ZWQgYnkgcGFyc2luZyBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVtYWlsCittZXNzYWdlLgogCiBUaGUgOm1vZDpgZW1haWxgIHBhY2thZ2UgcHJvdmlkZXMgYSBzdGFuZGFyZCBwYXJzZXIgdGhhdCB1bmRlcnN0YW5kcyBtb3N0IGVtYWlsCi1kb2N1bWVudCBzdHJ1Y3R1cmVzLCBpbmNsdWRpbmcgTUlNRSBkb2N1bWVudHMuICBZb3UgY2FuIHBhc3MgdGhlIHBhcnNlciBhIHN0cmluZwotb3IgYSBmaWxlIG9iamVjdCwgYW5kIHRoZSBwYXJzZXIgd2lsbCByZXR1cm4gdG8geW91IHRoZSByb290Ci06Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGluc3RhbmNlIG9mIHRoZSBvYmplY3Qgc3RydWN0dXJlLiAgRm9yIHNpbXBsZSwKLW5vbi1NSU1FIG1lc3NhZ2VzIHRoZSBwYXlsb2FkIG9mIHRoaXMgcm9vdCBvYmplY3Qgd2lsbCBsaWtlbHkgYmUgYSBzdHJpbmcKLWNvbnRhaW5pbmcgdGhlIHRleHQgb2YgdGhlIG1lc3NhZ2UuICBGb3IgTUlNRSBtZXNzYWdlcywgdGhlIHJvb3Qgb2JqZWN0IHdpbGwKLXJldHVybiBgYFRydWVgYCBmcm9tIGl0cyA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5pc19tdWx0aXBhcnRgIG1ldGhvZCwgYW5kCi10aGUgc3VicGFydHMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X3BheWxvYWRgCi1hbmQgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2Uud2Fsa2AgbWV0aG9kcy4KK2RvY3VtZW50IHN0cnVjdHVyZXMsIGluY2x1ZGluZyBNSU1FIGRvY3VtZW50cy4gIFlvdSBjYW4gcGFzcyB0aGUgcGFyc2VyIGEKK2J5dGVzLCBzdHJpbmcgb3IgZmlsZSBvYmplY3QsIGFuZCB0aGUgcGFyc2VyIHdpbGwgcmV0dXJuIHRvIHlvdSB0aGUgcm9vdAorOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgIGluc3RhbmNlIG9mIHRoZSBvYmplY3Qgc3RydWN0dXJlLiAgRm9yCitzaW1wbGUsIG5vbi1NSU1FIG1lc3NhZ2VzIHRoZSBwYXlsb2FkIG9mIHRoaXMgcm9vdCBvYmplY3Qgd2lsbCBsaWtlbHkgYmUgYQorc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRleHQgb2YgdGhlIG1lc3NhZ2UuICBGb3IgTUlNRSBtZXNzYWdlcywgdGhlIHJvb3Qgb2JqZWN0Cit3aWxsIHJldHVybiBgYFRydWVgYCBmcm9tIGl0cyA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLmlzX211bHRpcGFydGAKK21ldGhvZCwgYW5kIHRoZSBzdWJwYXJ0cyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBwYXlsb2FkIG1hbmlwdWxhdGlvbiBtZXRob2RzLAorc3VjaCBhcyA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLmdldF9ib2R5YCwKKzptZXRoOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2UuaXRlcl9wYXJ0c2AsIGFuZAorOm1ldGg6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZS53YWxrYC4KIAotVGhlcmUgYXJlIGFjdHVhbGx5IHR3byBwYXJzZXIgaW50ZXJmYWNlcyBhdmFpbGFibGUgZm9yIHVzZSwgdGhlIGNsYXNzaWMKLTpjbGFzczpgUGFyc2VyYCBBUEkgYW5kIHRoZSBpbmNyZW1lbnRhbCA6Y2xhc3M6YEZlZWRQYXJzZXJgIEFQSS4gIFRoZSBjbGFzc2ljCi06Y2xhc3M6YFBhcnNlcmAgQVBJIGlzIGZpbmUgaWYgeW91IGhhdmUgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBtZXNzYWdlIGluIG1lbW9yeQotYXMgYSBzdHJpbmcsIG9yIGlmIHRoZSBlbnRpcmUgbWVzc2FnZSBsaXZlcyBpbiBhIGZpbGUgb24gdGhlIGZpbGUgc3lzdGVtLgotOmNsYXNzOmBGZWVkUGFyc2VyYCBpcyBtb3JlIGFwcHJvcHJpYXRlIGZvciB3aGVuIHlvdSdyZSByZWFkaW5nIHRoZSBtZXNzYWdlIGZyb20KLWEgc3RyZWFtIHdoaWNoIG1pZ2h0IGJsb2NrIHdhaXRpbmcgZm9yIG1vcmUgaW5wdXQgKGUuZy4gcmVhZGluZyBhbiBlbWFpbCBtZXNzYWdlCi1mcm9tIGEgc29ja2V0KS4gIFRoZSA6Y2xhc3M6YEZlZWRQYXJzZXJgIGNhbiBjb25zdW1lIGFuZCBwYXJzZSB0aGUgbWVzc2FnZQotaW5jcmVtZW50YWxseSwgYW5kIG9ubHkgcmV0dXJucyB0aGUgcm9vdCBvYmplY3Qgd2hlbiB5b3UgY2xvc2UgdGhlIHBhcnNlciBbI11fLgorVGhlcmUgYXJlIGFjdHVhbGx5IHR3byBwYXJzZXIgaW50ZXJmYWNlcyBhdmFpbGFibGUgZm9yIHVzZSwgdGhlIDpjbGFzczpgUGFyc2VyYAorQVBJIGFuZCB0aGUgaW5jcmVtZW50YWwgOmNsYXNzOmBGZWVkUGFyc2VyYCBBUEkuICBUaGUgOmNsYXNzOmBQYXJzZXJgIEFQSSBpcworbW9zdCB1c2VmdWwgaWYgeW91IGhhdmUgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBtZXNzYWdlIGluIG1lbW9yeSwgb3IgaWYgdGhlCitlbnRpcmUgbWVzc2FnZSBsaXZlcyBpbiBhIGZpbGUgb24gdGhlIGZpbGUgc3lzdGVtLiAgOmNsYXNzOmBGZWVkUGFyc2VyYCBpcyBtb3JlCithcHByb3ByaWF0ZSB3aGVuIHlvdSBhcmUgcmVhZGluZyB0aGUgbWVzc2FnZSBmcm9tIGEgc3RyZWFtIHdoaWNoIG1pZ2h0IGJsb2NrCit3YWl0aW5nIGZvciBtb3JlIGlucHV0IChzdWNoIGFzIHJlYWRpbmcgYW4gZW1haWwgbWVzc2FnZSBmcm9tIGEgc29ja2V0KS4gIFRoZQorOmNsYXNzOmBGZWVkUGFyc2VyYCBjYW4gY29uc3VtZSBhbmQgcGFyc2UgdGhlIG1lc3NhZ2UgaW5jcmVtZW50YWxseSwgYW5kIG9ubHkKK3JldHVybnMgdGhlIHJvb3Qgb2JqZWN0IHdoZW4geW91IGNsb3NlIHRoZSBwYXJzZXIuCiAKIE5vdGUgdGhhdCB0aGUgcGFyc2VyIGNhbiBiZSBleHRlbmRlZCBpbiBsaW1pdGVkIHdheXMsIGFuZCBvZiBjb3Vyc2UgeW91IGNhbgotaW1wbGVtZW50IHlvdXIgb3duIHBhcnNlciBjb21wbGV0ZWx5IGZyb20gc2NyYXRjaC4gIFRoZXJlIGlzIG5vIG1hZ2ljYWwKLWNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgOm1vZDpgZW1haWxgIHBhY2thZ2UncyBidW5kbGVkIHBhcnNlciBhbmQgdGhlCi06Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGNsYXNzLCBzbyB5b3VyIGN1c3RvbSBwYXJzZXIgY2FuIGNyZWF0ZSBtZXNzYWdlCi1vYmplY3QgdHJlZXMgYW55IHdheSBpdCBmaW5kcyBuZWNlc3NhcnkuCitpbXBsZW1lbnQgeW91ciBvd24gcGFyc2VyIGNvbXBsZXRlbHkgZnJvbSBzY3JhdGNoLiAgQWxsIG9mIHRoZSBsb2dpYyB0aGF0Citjb25uZWN0cyB0aGUgOm1vZDpgZW1haWxgIHBhY2thZ2UncyBidW5kbGVkIHBhcnNlciBhbmQgdGhlCis6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZWAgY2xhc3MgaXMgZW1ib2RpZWQgaW4gdGhlIDptb2Q6YHBvbGljeWAKK2NsYXNzLCBzbyBhIGN1c3RvbSBwYXJzZXIgY2FuIGNyZWF0ZSBtZXNzYWdlIG9iamVjdCB0cmVlcyBhbnkgd2F5IGl0IGZpbmRzCituZWNlc3NhcnkgYnkgaW1wbGVtZW50aW5nIGN1c3RvbSB2ZXJzaW9ucyBvZiB0aGUgYXBwcm9wcmlhdGUgOm1vZDpgcG9saWN5YAorbWV0aG9kcy4KIAogCiBGZWVkUGFyc2VyIEFQSQogXl5eXl5eXl5eXl5eXl4KIAotVGhlIDpjbGFzczpgRmVlZFBhcnNlcmAsIGltcG9ydGVkIGZyb20gdGhlIDptb2Q6YGVtYWlsLmZlZWRwYXJzZXJgIG1vZHVsZSwKLXByb3ZpZGVzIGFuIEFQSSB0aGF0IGlzIGNvbmR1Y2l2ZSB0byBpbmNyZW1lbnRhbCBwYXJzaW5nIG9mIGVtYWlsIG1lc3NhZ2VzLCBzdWNoCi1hcyB3b3VsZCBiZSBuZWNlc3Nhcnkgd2hlbiByZWFkaW5nIHRoZSB0ZXh0IG9mIGFuIGVtYWlsIG1lc3NhZ2UgZnJvbSBhIHNvdXJjZQotdGhhdCBjYW4gYmxvY2sgKGUuZy4gYSBzb2NrZXQpLiAgVGhlIDpjbGFzczpgRmVlZFBhcnNlcmAgY2FuIG9mIGNvdXJzZSBiZSB1c2VkCi10byBwYXJzZSBhbiBlbWFpbCBtZXNzYWdlIGZ1bGx5IGNvbnRhaW5lZCBpbiBhIHN0cmluZyBvciBhIGZpbGUsIGJ1dCB0aGUgY2xhc3NpYwotOmNsYXNzOmBQYXJzZXJgIEFQSSBtYXkgYmUgbW9yZSBjb252ZW5pZW50IGZvciBzdWNoIHVzZSBjYXNlcy4gIFRoZSBzZW1hbnRpY3MKLWFuZCByZXN1bHRzIG9mIHRoZSB0d28gcGFyc2VyIEFQSXMgYXJlIGlkZW50aWNhbC4KK1RoZSA6Y2xhc3M6YEJ5dGVzRmVlZFBhcnNlcmAsIGltcG9ydGVkIGZyb20gdGhlIDptb2Q6YGVtYWlsLmZlZWRwYXJzZXJgIG1vZHVsZSwKK3Byb3ZpZGVzIGFuIEFQSSB0aGF0IGlzIGNvbmR1Y2l2ZSB0byBpbmNyZW1lbnRhbCBwYXJzaW5nIG9mIGVtYWlsIG1lc3NhZ2VzLAorc3VjaCBhcyB3b3VsZCBiZSBuZWNlc3Nhcnkgd2hlbiByZWFkaW5nIHRoZSB0ZXh0IG9mIGFuIGVtYWlsIG1lc3NhZ2UgZnJvbSBhCitzb3VyY2UgdGhhdCBjYW4gYmxvY2sgKHN1Y2ggYXMgYSBzb2NrZXQpLiAgVGhlIDpjbGFzczpgQnl0ZXNGZWVkUGFyc2VyYCBjYW4gb2YKK2NvdXJzZSBiZSB1c2VkIHRvIHBhcnNlIGFuIGVtYWlsIG1lc3NhZ2UgZnVsbHkgY29udGFpbmVkIGluIGEgOnRlcm06YGJ5dGVzLWxpa2UKK29iamVjdGAsIHN0cmluZywgb3IgZmlsZSwgYnV0IHRoZSA6Y2xhc3M6YEJ5dGVzUGFyc2VyYCBBUEkgbWF5IGJlIG1vcmUKK2NvbnZlbmllbnQgZm9yIHN1Y2ggdXNlIGNhc2VzLiAgVGhlIHNlbWFudGljcyBhbmQgcmVzdWx0cyBvZiB0aGUgdHdvIHBhcnNlcgorQVBJcyBhcmUgaWRlbnRpY2FsLgogCi1UaGUgOmNsYXNzOmBGZWVkUGFyc2VyYCdzIEFQSSBpcyBzaW1wbGU7IHlvdSBjcmVhdGUgYW4gaW5zdGFuY2UsIGZlZWQgaXQgYSBidW5jaAotb2YgdGV4dCB1bnRpbCB0aGVyZSdzIG5vIG1vcmUgdG8gZmVlZCBpdCwgdGhlbiBjbG9zZSB0aGUgcGFyc2VyIHRvIHJldHJpZXZlIHRoZQotcm9vdCBtZXNzYWdlIG9iamVjdC4gIFRoZSA6Y2xhc3M6YEZlZWRQYXJzZXJgIGlzIGV4dHJlbWVseSBhY2N1cmF0ZSB3aGVuIHBhcnNpbmcKLXN0YW5kYXJkcy1jb21wbGlhbnQgbWVzc2FnZXMsIGFuZCBpdCBkb2VzIGEgdmVyeSBnb29kIGpvYiBvZiBwYXJzaW5nCi1ub24tY29tcGxpYW50IG1lc3NhZ2VzLCBwcm92aWRpbmcgaW5mb3JtYXRpb24gYWJvdXQgaG93IGEgbWVzc2FnZSB3YXMgZGVlbWVkCi1icm9rZW4uICBJdCB3aWxsIHBvcHVsYXRlIGEgbWVzc2FnZSBvYmplY3QncyAqZGVmZWN0cyogYXR0cmlidXRlIHdpdGggYSBsaXN0IG9mCi1hbnkgcHJvYmxlbXMgaXQgZm91bmQgaW4gYSBtZXNzYWdlLiAgU2VlIHRoZSA6bW9kOmBlbWFpbC5lcnJvcnNgIG1vZHVsZSBmb3IgdGhlCitUaGUgOmNsYXNzOmBCeXRlc0ZlZWRQYXJzZXJgJ3MgQVBJIGlzIHNpbXBsZTsgeW91IGNyZWF0ZSBhbiBpbnN0YW5jZSwgZmVlZCBpdCBhCitidW5jaCBvZiBieXRlcyB1bnRpbCB0aGVyZSdzIG5vIG1vcmUgdG8gZmVlZCBpdCwgdGhlbiBjbG9zZSB0aGUgcGFyc2VyIHRvCityZXRyaWV2ZSB0aGUgcm9vdCBtZXNzYWdlIG9iamVjdC4gIFRoZSA6Y2xhc3M6YEJ5dGVzRmVlZFBhcnNlcmAgaXMgZXh0cmVtZWx5CithY2N1cmF0ZSB3aGVuIHBhcnNpbmcgc3RhbmRhcmRzLWNvbXBsaWFudCBtZXNzYWdlcywgYW5kIGl0IGRvZXMgYSB2ZXJ5IGdvb2Qgam9iCitvZiBwYXJzaW5nIG5vbi1jb21wbGlhbnQgbWVzc2FnZXMsIHByb3ZpZGluZyBpbmZvcm1hdGlvbiBhYm91dCBob3cgYSBtZXNzYWdlCit3YXMgZGVlbWVkIGJyb2tlbi4gIEl0IHdpbGwgcG9wdWxhdGUgYSBtZXNzYWdlIG9iamVjdCdzCis6YXR0cjpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLmRlZmVjdHNgIGF0dHJpYnV0ZSB3aXRoIGEgbGlzdCBvZiBhbnkKK3Byb2JsZW1zIGl0IGZvdW5kIGluIGEgbWVzc2FnZS4gIFNlZSB0aGUgOm1vZDpgZW1haWwuZXJyb3JzYCBtb2R1bGUgZm9yIHRoZQogbGlzdCBvZiBkZWZlY3RzIHRoYXQgaXQgY2FuIGZpbmQuCiAKLUhlcmUgaXMgdGhlIEFQSSBmb3IgdGhlIDpjbGFzczpgRmVlZFBhcnNlcmA6CitIZXJlIGlzIHRoZSBBUEkgZm9yIHRoZSA6Y2xhc3M6YEJ5dGVzRmVlZFBhcnNlcmA6CiAKIAotLi4gY2xhc3M6OiBGZWVkUGFyc2VyKF9mYWN0b3J5PWVtYWlsLm1lc3NhZ2UuTWVzc2FnZSwgKiwgcG9saWN5PXBvbGljeS5jb21wYXQzMikKKy4uIGNsYXNzOjogQnl0ZXNGZWVkUGFyc2VyKF9mYWN0b3J5PU5vbmUsICosIHBvbGljeT1wb2xpY3kuY29tcGF0MzIpCiAKLSAgIENyZWF0ZSBhIDpjbGFzczpgRmVlZFBhcnNlcmAgaW5zdGFuY2UuICBPcHRpb25hbCAqX2ZhY3RvcnkqIGlzIGEgbm8tYXJndW1lbnQKLSAgIGNhbGxhYmxlIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBuZXcgbWVzc2FnZSBvYmplY3QgaXMgbmVlZGVkLiAgSXQKLSAgIGRlZmF1bHRzIHRvIHRoZSA6Y2xhc3M6YGVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgY2xhc3MuCisgICBDcmVhdGUgYSA6Y2xhc3M6YEJ5dGVzRmVlZFBhcnNlcmAgaW5zdGFuY2UuICBPcHRpb25hbCAqX2ZhY3RvcnkqIGlzIGEKKyAgIG5vLWFyZ3VtZW50IGNhbGxhYmxlOyBpZiBub3Qgc3BlY2lmaWVkIGRldGVybWluZSB0aGUgZGVmYXVsdCBiYXNlZCBvbiB0aGUKKyAgICpwb2xpY3kqLiAgQ2FsbCAqX2ZhY3RvcnkqIHdoZW5ldmVyIGEgbmV3IG1lc3NhZ2Ugb2JqZWN0IGlzIG5lZWRlZC4KIAotICAgSWYgKnBvbGljeSogaXMgc3BlY2lmaWVkIChpdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgOm1vZDpgfmVtYWlsLnBvbGljeWAKLSAgIGNsYXNzKSB1c2UgdGhlIHJ1bGVzIGl0IHNwZWNpZmllcyB0byB1cGRhdGUgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgbWVzc2FnZS4gIElmICpwb2xpY3kqIGlzIG5vdCBzZXQsIHVzZSB0aGUgOmNsYXNzOmBjb21wYXQzMgotICAgPGVtYWlsLnBvbGljeS5Db21wYXQzMj5gIHBvbGljeSwgd2hpY2ggbWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAotICAgdGhlIFB5dGhvbiAzLjIgdmVyc2lvbiBvZiB0aGUgZW1haWwgcGFja2FnZS4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUKKyAgIElmICpwb2xpY3kqIGlzIHNwZWNpZmllZCB1c2UgdGhlIHJ1bGVzIGl0IHNwZWNpZmllcyB0byB1cGRhdGUgdGhlCisgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZS4gIElmICpwb2xpY3kqIGlzIG5vdCBzZXQsIHVzZSB0aGUKKyAgIDpjbGFzczpgY29tcGF0MzIgPGVtYWlsLnBvbGljeS5Db21wYXQzMj5gIHBvbGljeSwgd2hpY2ggbWFpbnRhaW5zIGJhY2t3YXJkCisgICBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFB5dGhvbiAzLjIgdmVyc2lvbiBvZiB0aGUgZW1haWwgcGFja2FnZSBhbmQgcHJvdmlkZXMKKyAgIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgYXMgdGhlIGRlZmF1bHQgZmFjdG9yeS4gIEFsbCBvdGhlciBwb2xpY2llcworICAgcHJvdmlkZSA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZWAgYXMgdGhlIGRlZmF1bHQgKl9mYWN0b3J5Ki4gRm9yCisgICBtb3JlIGluZm9ybWF0aW9uIG9uIHdoYXQgZWxzZSAqcG9saWN5KiBjb250cm9scywgc2VlIHRoZQogICAgOm1vZDpgfmVtYWlsLnBvbGljeWAgZG9jdW1lbnRhdGlvbi4KIAotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMgQWRkZWQgdGhlICpwb2xpY3kqIGtleXdvcmQuCi0KLSAgIC4uIG1ldGhvZDo6IGZlZWQoZGF0YSkKLQotICAgICAgRmVlZCB0aGUgOmNsYXNzOmBGZWVkUGFyc2VyYCBzb21lIG1vcmUgZGF0YS4gICpkYXRhKiBzaG91bGQgYmUgYSBzdHJpbmcKLSAgICAgIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgbGluZXMuICBUaGUgbGluZXMgY2FuIGJlIHBhcnRpYWwgYW5kIHRoZQotICAgICAgOmNsYXNzOmBGZWVkUGFyc2VyYCB3aWxsIHN0aXRjaCBzdWNoIHBhcnRpYWwgbGluZXMgdG9nZXRoZXIgcHJvcGVybHkuICBUaGUKLSAgICAgIGxpbmVzIGluIHRoZSBzdHJpbmcgY2FuIGhhdmUgYW55IG9mIHRoZSBjb21tb24gdGhyZWUgbGluZSBlbmRpbmdzLAotICAgICAgY2FycmlhZ2UgcmV0dXJuLCBuZXdsaW5lLCBvciBjYXJyaWFnZSByZXR1cm4gYW5kIG5ld2xpbmUgKHRoZXkgY2FuIGV2ZW4gYmUKLSAgICAgIG1peGVkKS4KLQotICAgLi4gbWV0aG9kOjogY2xvc2UoKQotCi0gICAgICBDbG9zaW5nIGEgOmNsYXNzOmBGZWVkUGFyc2VyYCBjb21wbGV0ZXMgdGhlIHBhcnNpbmcgb2YgYWxsIHByZXZpb3VzbHkgZmVkCi0gICAgICBkYXRhLCBhbmQgcmV0dXJucyB0aGUgcm9vdCBtZXNzYWdlIG9iamVjdC4gIEl0IGlzIHVuZGVmaW5lZCB3aGF0IGhhcHBlbnMKLSAgICAgIGlmIHlvdSBmZWVkIG1vcmUgZGF0YSB0byBhIGNsb3NlZCA6Y2xhc3M6YEZlZWRQYXJzZXJgLgotCi0KLS4uIGNsYXNzOjogQnl0ZXNGZWVkUGFyc2VyKF9mYWN0b3J5PWVtYWlsLm1lc3NhZ2UuTWVzc2FnZSkKLQotICAgV29ya3MgZXhhY3RseSBsaWtlIDpjbGFzczpgRmVlZFBhcnNlcmAgZXhjZXB0IHRoYXQgdGhlIGlucHV0IHRvIHRoZQotICAgOm1ldGg6YH5GZWVkUGFyc2VyLmZlZWRgIG1ldGhvZCBtdXN0IGJlIGJ5dGVzIGFuZCBub3Qgc3RyaW5nLgorICAgTm90ZTogKipUaGUgcG9saWN5IGtleXdvcmQgc2hvdWxkIGFsd2F5cyBiZSBzcGVjaWZpZWQqKjsgVGhlIGRlZmF1bHQgd2lsbAorICAgY2hhbmdlIHRvIDpkYXRhOmBlbWFpbC5wb2xpY3kuZGVmYXVsdGAgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBQeXRob24uCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMyBBZGRlZCB0aGUgKnBvbGljeSoga2V5d29yZC4KIAotUGFyc2VyIGNsYXNzIEFQSQotXl5eXl5eXl5eXl5eXl5eXgogCi1UaGUgOmNsYXNzOmBQYXJzZXJgIGNsYXNzLCBpbXBvcnRlZCBmcm9tIHRoZSA6bW9kOmBlbWFpbC5wYXJzZXJgIG1vZHVsZSwKKyAgIC4uIG1ldGhvZDo6IGZlZWQoZGF0YSkKKworICAgICAgRmVlZCB0aGUgcGFyc2VyIHNvbWUgbW9yZSBkYXRhLiAgKmRhdGEqIHNob3VsZCBiZSBhIDp0ZXJtOmBieXRlcy1saWtlCisgICAgICBvYmplY3RgIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgbGluZXMuICBUaGUgbGluZXMgY2FuIGJlIHBhcnRpYWwgYW5kIHRoZQorICAgICAgcGFyc2VyIHdpbGwgc3RpdGNoIHN1Y2ggcGFydGlhbCBsaW5lcyB0b2dldGhlciBwcm9wZXJseS4gIFRoZSBsaW5lcyBjYW4KKyAgICAgIGhhdmUgYW55IG9mIHRoZSB0aHJlZSBjb21tb24gbGluZSBlbmRpbmdzOiBjYXJyaWFnZSByZXR1cm4sIG5ld2xpbmUsIG9yCisgICAgICBjYXJyaWFnZSByZXR1cm4gYW5kIG5ld2xpbmUgKHRoZXkgY2FuIGV2ZW4gYmUgbWl4ZWQpLgorCisKKyAgIC4uIG1ldGhvZDo6IGNsb3NlKCkKKworICAgICAgQ29tcGxldGUgdGhlIHBhcnNpbmcgb2YgYWxsIHByZXZpb3VzbHkgZmVkIGRhdGEgYW5kIHJldHVybiB0aGUgcm9vdAorICAgICAgbWVzc2FnZSBvYmplY3QuICBJdCBpcyB1bmRlZmluZWQgd2hhdCBoYXBwZW5zIGlmIDptZXRoOmB+ZmVlZGAgaXMgY2FsbGVkCisgICAgICBhZnRlciB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCisKKworLi4gY2xhc3M6OiBGZWVkUGFyc2VyKF9mYWN0b3J5PU5vbmUsICosIHBvbGljeT1wb2xpY3kuY29tcGF0MzIpCisKKyAgIFdvcmtzIGxpa2UgOmNsYXNzOmBCeXRlc0ZlZWRQYXJzZXJgIGV4Y2VwdCB0aGF0IHRoZSBpbnB1dCB0byB0aGUKKyAgIDptZXRoOmB+Qnl0ZXNGZWVkUGFyc2VyLmZlZWRgIG1ldGhvZCBtdXN0IGJlIGEgc3RyaW5nLiAgVGhpcyBpcyBvZiBsaW1pdGVkCisgICB1dGlsaXR5LCBzaW5jZSB0aGUgb25seSB3YXkgZm9yIHN1Y2ggYSBtZXNzYWdlIHRvIGJlIHZhbGlkIGlzIGZvciBpdCB0bworICAgY29udGFpbiBvbmx5IEFTQ0lJIHRleHQgb3IsIGlmIDphdHRyOmB+ZW1haWwucG9saWN5LlBvbGljeS51dGY4YCBpcworICAgYGBUcnVlYGAsIG5vIGJpbmFyeSBhdHRhY2htZW50cy4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMgQWRkZWQgdGhlICpwb2xpY3kqIGtleXdvcmQuCisKKworUGFyc2VyIEFQSQorXl5eXl5eXl5eXgorCitUaGUgOmNsYXNzOmBCeXRlc1BhcnNlcmAgY2xhc3MsIGltcG9ydGVkIGZyb20gdGhlIDptb2Q6YGVtYWlsLnBhcnNlcmAgbW9kdWxlLAogcHJvdmlkZXMgYW4gQVBJIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFyc2UgYSBtZXNzYWdlIHdoZW4gdGhlIGNvbXBsZXRlIGNvbnRlbnRzCi1vZiB0aGUgbWVzc2FnZSBhcmUgYXZhaWxhYmxlIGluIGEgc3RyaW5nIG9yIGZpbGUuICBUaGUgOm1vZDpgZW1haWwucGFyc2VyYAotbW9kdWxlIGFsc28gcHJvdmlkZXMgaGVhZGVyLW9ubHkgcGFyc2VycywgY2FsbGVkIDpjbGFzczpgSGVhZGVyUGFyc2VyYCBhbmQKLTpjbGFzczpgQnl0ZXNIZWFkZXJQYXJzZXJgLCB3aGljaCBjYW4gYmUgdXNlZCBpZiB5b3UncmUgb25seSBpbnRlcmVzdGVkIGluIHRoZQotaGVhZGVycyBvZiB0aGUgbWVzc2FnZS4gIDpjbGFzczpgSGVhZGVyUGFyc2VyYCBhbmQgOmNsYXNzOmBCeXRlc0hlYWRlclBhcnNlcmAKK29mIHRoZSBtZXNzYWdlIGFyZSBhdmFpbGFibGUgaW4gYSA6dGVybTpgYnl0ZXMtbGlrZSBvYmplY3RgIG9yIGZpbGUuICBUaGUKKzptb2Q6YGVtYWlsLnBhcnNlcmAgbW9kdWxlIGFsc28gcHJvdmlkZXMgOmNsYXNzOmBQYXJzZXJgIGZvciBwYXJzaW5nIHN0cmluZ3MsCithbmQgaGVhZGVyLW9ubHkgcGFyc2VycywgOmNsYXNzOmBCeXRlc0hlYWRlclBhcnNlcmAgYW5kCis6Y2xhc3M6YEhlYWRlclBhcnNlcmAsIHdoaWNoIGNhbiBiZSB1c2VkIGlmIHlvdSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlCitoZWFkZXJzIG9mIHRoZSBtZXNzYWdlLiAgOmNsYXNzOmBCeXRlc0hlYWRlclBhcnNlcmAgYW5kIDpjbGFzczpgSGVhZGVyUGFyc2VyYAogY2FuIGJlIG11Y2ggZmFzdGVyIGluIHRoZXNlIHNpdHVhdGlvbnMsIHNpbmNlIHRoZXkgZG8gbm90IGF0dGVtcHQgdG8gcGFyc2UgdGhlCi1tZXNzYWdlIGJvZHksIGluc3RlYWQgc2V0dGluZyB0aGUgcGF5bG9hZCB0byB0aGUgcmF3IGJvZHkgYXMgYSBzdHJpbmcuICBUaGV5Ci1oYXZlIHRoZSBzYW1lIEFQSSBhcyB0aGUgOmNsYXNzOmBQYXJzZXJgIGFuZCA6Y2xhc3M6YEJ5dGVzUGFyc2VyYCBjbGFzc2VzLgotCi0uLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKLSAgIFRoZSBCeXRlc0hlYWRlclBhcnNlciBjbGFzcy4KK21lc3NhZ2UgYm9keSwgaW5zdGVhZCBzZXR0aW5nIHRoZSBwYXlsb2FkIHRvIHRoZSByYXcgYm9keS4KIAogCi0uLiBjbGFzczo6IFBhcnNlcihfY2xhc3M9ZW1haWwubWVzc2FnZS5NZXNzYWdlLCAqLCBwb2xpY3k9cG9saWN5LmNvbXBhdDMyKQorLi4gY2xhc3M6OiBCeXRlc1BhcnNlcihfY2xhc3M9Tm9uZSwgKiwgcG9saWN5PXBvbGljeS5jb21wYXQzMikKIAotICAgVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgOmNsYXNzOmBQYXJzZXJgIGNsYXNzIHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50Ci0gICAqX2NsYXNzKi4gIFRoaXMgbXVzdCBiZSBhIGNhbGxhYmxlIGZhY3RvcnkgKHN1Y2ggYXMgYSBmdW5jdGlvbiBvciBhIGNsYXNzKSwgYW5kCi0gICBpdCBpcyB1c2VkIHdoZW5ldmVyIGEgc3ViLW1lc3NhZ2Ugb2JqZWN0IG5lZWRzIHRvIGJlIGNyZWF0ZWQuICBJdCBkZWZhdWx0cyB0bwotICAgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCAoc2VlIDptb2Q6YGVtYWlsLm1lc3NhZ2VgKS4gIFRoZSBmYWN0b3J5IHdpbGwKLSAgIGJlIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cy4KKyAgIENyZWF0ZSBhIDpjbGFzczpgQnl0ZXNQYXJzZXJgIGluc3RhbmNlLiAgVGhlICpfY2xhc3MqIGFuZCAqcG9saWN5KgorICAgYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhbmQgc2VtYXRuaWNzIGFzIHRoZSAqX2ZhY3RvcnkqCisgICBhbmQgKnBvbGljeSogYXJndW1lbnRzIG9mIDpjbGFzczpgQnl0ZXNGZWVkUGFyc2VyYC4KIAotICAgSWYgKnBvbGljeSogaXMgc3BlY2lmaWVkIChpdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgOm1vZDpgfmVtYWlsLnBvbGljeWAKLSAgIGNsYXNzKSB1c2UgdGhlIHJ1bGVzIGl0IHNwZWNpZmllcyB0byB1cGRhdGUgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgbWVzc2FnZS4gIElmICpwb2xpY3kqIGlzIG5vdCBzZXQsIHVzZSB0aGUgOmNsYXNzOmBjb21wYXQzMgotICAgPGVtYWlsLnBvbGljeS5Db21wYXQzMj5gIHBvbGljeSwgd2hpY2ggbWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAotICAgdGhlIFB5dGhvbiAzLjIgdmVyc2lvbiBvZiB0aGUgZW1haWwgcGFja2FnZS4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUKLSAgIDptb2Q6YH5lbWFpbC5wb2xpY3lgIGRvY3VtZW50YXRpb24uCisgICBOb3RlOiAqKlRoZSBwb2xpY3kga2V5d29yZCBzaG91bGQgYWx3YXlzIGJlIHNwZWNpZmllZCoqOyBUaGUgZGVmYXVsdCB3aWxsCisgICBjaGFuZ2UgdG8gOmRhdGE6YGVtYWlsLnBvbGljeS5kZWZhdWx0YCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFB5dGhvbi4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMKICAgICAgIFJlbW92ZWQgdGhlICpzdHJpY3QqIGFyZ3VtZW50IHRoYXQgd2FzIGRlcHJlY2F0ZWQgaW4gMi40LiAgQWRkZWQgdGhlCiAgICAgICAqcG9saWN5KiBrZXl3b3JkLgogCi0gICBUaGUgb3RoZXIgcHVibGljIDpjbGFzczpgUGFyc2VyYCBtZXRob2RzIGFyZToKLQotCi0gICAuLiBtZXRob2Q6OiBwYXJzZShmcCwgaGVhZGVyc29ubHk9RmFsc2UpCi0KLSAgICAgIFJlYWQgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUtbGlrZSBvYmplY3QgKmZwKiwgcGFyc2UgdGhlIHJlc3VsdGluZwotICAgICAgdGV4dCwgYW5kIHJldHVybiB0aGUgcm9vdCBtZXNzYWdlIG9iamVjdC4gICpmcCogbXVzdCBzdXBwb3J0IGJvdGggdGhlCi0gICAgICA6bWV0aDpgfmlvLlRleHRJT0Jhc2UucmVhZGxpbmVgIGFuZCB0aGUgOm1ldGg6YH5pby5UZXh0SU9CYXNlLnJlYWRgCi0gICAgICBtZXRob2RzIG9uIGZpbGUtbGlrZSBvYmplY3RzLgotCi0gICAgICBUaGUgdGV4dCBjb250YWluZWQgaW4gKmZwKiBtdXN0IGJlIGZvcm1hdHRlZCBhcyBhIGJsb2NrIG9mIDpyZmM6YDI4MjJgCi0gICAgICBzdHlsZSBoZWFkZXJzIGFuZCBoZWFkZXIgY29udGludWF0aW9uIGxpbmVzLCBvcHRpb25hbGx5IHByZWNlZGVkIGJ5IGFuCi0gICAgICBlbnZlbG9wZSBoZWFkZXIuICBUaGUgaGVhZGVyIGJsb2NrIGlzIHRlcm1pbmF0ZWQgZWl0aGVyIGJ5IHRoZSBlbmQgb2YgdGhlCi0gICAgICBkYXRhIG9yIGJ5IGEgYmxhbmsgbGluZS4gIEZvbGxvd2luZyB0aGUgaGVhZGVyIGJsb2NrIGlzIHRoZSBib2R5IG9mIHRoZQotICAgICAgbWVzc2FnZSAod2hpY2ggbWF5IGNvbnRhaW4gTUlNRS1lbmNvZGVkIHN1YnBhcnRzKS4KLQotICAgICAgT3B0aW9uYWwgKmhlYWRlcnNvbmx5KiBpcyBhIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRvIHN0b3AgcGFyc2luZyBhZnRlcgotICAgICAgcmVhZGluZyB0aGUgaGVhZGVycyBvciBub3QuICBUaGUgZGVmYXVsdCBpcyBgYEZhbHNlYGAsIG1lYW5pbmcgaXQgcGFyc2VzCi0gICAgICB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLgotCi0gICAuLiBtZXRob2Q6OiBwYXJzZXN0cih0ZXh0LCBoZWFkZXJzb25seT1GYWxzZSkKLQotICAgICAgU2ltaWxhciB0byB0aGUgOm1ldGg6YHBhcnNlYCBtZXRob2QsIGV4Y2VwdCBpdCB0YWtlcyBhIHN0cmluZyBvYmplY3QKLSAgICAgIGluc3RlYWQgb2YgYSBmaWxlLWxpa2Ugb2JqZWN0LiAgQ2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhIHN0cmluZyBpcyBleGFjdGx5Ci0gICAgICBlcXVpdmFsZW50IHRvIHdyYXBwaW5nICp0ZXh0KiBpbiBhIDpjbGFzczpgfmlvLlN0cmluZ0lPYCBpbnN0YW5jZSBmaXJzdCBhbmQKLSAgICAgIGNhbGxpbmcgOm1ldGg6YHBhcnNlYC4KLQotICAgICAgT3B0aW9uYWwgKmhlYWRlcnNvbmx5KiBpcyBhcyB3aXRoIHRoZSA6bWV0aDpgcGFyc2VgIG1ldGhvZC4KLQotCi0uLiBjbGFzczo6IEJ5dGVzUGFyc2VyKF9jbGFzcz1lbWFpbC5tZXNzYWdlLk1lc3NhZ2UsICosIHBvbGljeT1wb2xpY3kuY29tcGF0MzIpCi0KLSAgIFRoaXMgY2xhc3MgaXMgZXhhY3RseSBwYXJhbGxlbCB0byA6Y2xhc3M6YFBhcnNlcmAsIGJ1dCBoYW5kbGVzIGJ5dGVzIGlucHV0LgotICAgVGhlICpfY2xhc3MqIGFuZCAqc3RyaWN0KiBhcmd1bWVudHMgYXJlIGludGVycHJldGVkIGluIHRoZSBzYW1lIHdheSBhcyBmb3IKLSAgIHRoZSA6Y2xhc3M6YFBhcnNlcmAgY29uc3RydWN0b3IuCi0KLSAgIElmICpwb2xpY3kqIGlzIHNwZWNpZmllZCAoaXQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhIDptb2Q6YH5lbWFpbC5wb2xpY3lgCi0gICBjbGFzcykgdXNlIHRoZSBydWxlcyBpdCBzcGVjaWZpZXMgdG8gdXBkYXRlIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgIG1lc3NhZ2UuICBJZiAqcG9saWN5KiBpcyBub3Qgc2V0LCB1c2UgdGhlIDpjbGFzczpgY29tcGF0MzIKLSAgIDxlbWFpbC5wb2xpY3kuQ29tcGF0MzI+YCBwb2xpY3ksIHdoaWNoIG1haW50YWlucyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGgKLSAgIHRoZSBQeXRob24gMy4yIHZlcnNpb24gb2YgdGhlIGVtYWlsIHBhY2thZ2UuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlCi0gICA6bW9kOmB+ZW1haWwucG9saWN5YCBkb2N1bWVudGF0aW9uLgotCi0gICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMwotICAgICAgUmVtb3ZlZCB0aGUgKnN0cmljdCogYXJndW1lbnQuICBBZGRlZCB0aGUgKnBvbGljeSoga2V5d29yZC4KIAogICAgLi4gbWV0aG9kOjogcGFyc2UoZnAsIGhlYWRlcnNvbmx5PUZhbHNlKQogCiAgICAgICBSZWFkIGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBiaW5hcnkgZmlsZS1saWtlIG9iamVjdCAqZnAqLCBwYXJzZSB0aGUKICAgICAgIHJlc3VsdGluZyBieXRlcywgYW5kIHJldHVybiB0aGUgbWVzc2FnZSBvYmplY3QuICAqZnAqIG11c3Qgc3VwcG9ydAogICAgICAgYm90aCB0aGUgOm1ldGg6YH5pby5JT0Jhc2UucmVhZGxpbmVgIGFuZCB0aGUgOm1ldGg6YH5pby5JT0Jhc2UucmVhZGAKLSAgICAgIG1ldGhvZHMgb24gZmlsZS1saWtlIG9iamVjdHMuCisgICAgICBtZXRob2RzLgogCi0gICAgICBUaGUgYnl0ZXMgY29udGFpbmVkIGluICpmcCogbXVzdCBiZSBmb3JtYXR0ZWQgYXMgYSBibG9jayBvZiA6cmZjOmAyODIyYAorICAgICAgVGhlIGJ5dGVzIGNvbnRhaW5lZCBpbiAqZnAqIG11c3QgYmUgZm9ybWF0dGVkIGFzIGEgYmxvY2sgb2YgOnJmYzpgNTMyMmAKKyAgICAgIChvciwgaWYgOmF0dHI6YH5lbWFpbC5wb2xpY3kuUG9saWN5LnV0ZjhgIGlzIGBgVHJ1ZWBgLCA6cmZjOmA2NTMyYCkKICAgICAgIHN0eWxlIGhlYWRlcnMgYW5kIGhlYWRlciBjb250aW51YXRpb24gbGluZXMsIG9wdGlvbmFsbHkgcHJlY2VkZWQgYnkgYW4KICAgICAgIGVudmVsb3BlIGhlYWRlci4gIFRoZSBoZWFkZXIgYmxvY2sgaXMgdGVybWluYXRlZCBlaXRoZXIgYnkgdGhlIGVuZCBvZiB0aGUKICAgICAgIGRhdGEgb3IgYnkgYSBibGFuayBsaW5lLiAgRm9sbG93aW5nIHRoZSBoZWFkZXIgYmxvY2sgaXMgdGhlIGJvZHkgb2YgdGhlCkBAIC0yMDIsNzMgKzE2NywxMjIgQEAKICAgICAgIHJlYWRpbmcgdGhlIGhlYWRlcnMgb3Igbm90LiAgVGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgLCBtZWFuaW5nIGl0IHBhcnNlcwogICAgICAgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZmlsZS4KIAotICAgLi4gbWV0aG9kOjogcGFyc2VieXRlcyh0ZXh0LCBoZWFkZXJzb25seT1GYWxzZSkKKworICAgLi4gbWV0aG9kOjogcGFyc2VieXRlcyhieXRlcywgaGVhZGVyc29ubHk9RmFsc2UpCiAKICAgICAgIFNpbWlsYXIgdG8gdGhlIDptZXRoOmBwYXJzZWAgbWV0aG9kLCBleGNlcHQgaXQgdGFrZXMgYSA6dGVybTpgYnl0ZXMtbGlrZQotICAgICAgb2JqZWN0YCBpbnN0ZWFkIG9mIGEgZmlsZS1saWtlIG9iamVjdC4gIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudAotICAgICAgdG8gd3JhcHBpbmcgKnRleHQqIGluIGEgOmNsYXNzOmB+aW8uQnl0ZXNJT2AgaW5zdGFuY2UgZmlyc3QgYW5kIGNhbGxpbmcKLSAgICAgIDptZXRoOmBwYXJzZWAuCisgICAgICBvYmplY3RgIGluc3RlYWQgb2YgYSBmaWxlLWxpa2Ugb2JqZWN0LiAgQ2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhCisgICAgICA6dGVybTpgYnl0ZXMtbGlrZSBvYmplY3RgIGlzIGVxdWl2YWxlbnQgdG8gd3JhcHBpbmcgKmJ5dGVzKiBpbiBhCisgICAgICA6Y2xhc3M6YH5pby5CeXRlc0lPYCBpbnN0YW5jZSBmaXJzdCBhbmQgY2FsbGluZyA6bWV0aDpgcGFyc2VgLgogCiAgICAgICBPcHRpb25hbCAqaGVhZGVyc29ubHkqIGlzIGFzIHdpdGggdGhlIDptZXRoOmBwYXJzZWAgbWV0aG9kLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKIAogCisuLiBjbGFzczo6IEJ5dGVzSGVhZGVyUGFyc2VyKF9jbGFzcz1Ob25lLCAqLCBwb2xpY3k9cG9saWN5LmNvbXBhdDMyKQorCisgICBFeGFjdGx5IGxpa2UgOmNsYXNzOmBCeXRlc1BhcnNlcmAsIGV4Y2VwdCB0aGF0ICpoZWFkZXJzb25seSoKKyAgIGRlZmF1bHRzIHRvIGBgVHJ1ZWBgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKKworCisuLiBjbGFzczo6IFBhcnNlcihfY2xhc3M9Tm9uZSwgKiwgcG9saWN5PXBvbGljeS5jb21wYXQzMikKKworICAgVGhpcyBjbGFzcyBpcyBwYXJhbGxlbCB0byA6Y2xhc3M6YEJ5dGVzUGFyc2VyYCwgYnV0IGhhbmRsZXMgc3RyaW5nIGlucHV0LgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMworICAgICAgUmVtb3ZlZCB0aGUgKnN0cmljdCogYXJndW1lbnQuICBBZGRlZCB0aGUgKnBvbGljeSoga2V5d29yZC4KKworCisgICAuLiBtZXRob2Q6OiBwYXJzZShmcCwgaGVhZGVyc29ubHk9RmFsc2UpCisKKyAgICAgIFJlYWQgYWxsIHRoZSBkYXRhIGZyb20gdGhlIHRleHQtbW9kZSBmaWxlLWxpa2Ugb2JqZWN0ICpmcCosIHBhcnNlIHRoZQorICAgICAgcmVzdWx0aW5nIHRleHQsIGFuZCByZXR1cm4gdGhlIHJvb3QgbWVzc2FnZSBvYmplY3QuICAqZnAqIG11c3Qgc3VwcG9ydAorICAgICAgYm90aCB0aGUgOm1ldGg6YH5pby5UZXh0SU9CYXNlLnJlYWRsaW5lYCBhbmQgdGhlCisgICAgICA6bWV0aDpgfmlvLlRleHRJT0Jhc2UucmVhZGAgbWV0aG9kcyBvbiBmaWxlLWxpa2Ugb2JqZWN0cy4KKworICAgICAgT3RoZXIgdGhhbiB0aGUgdGV4dCBtb2RlIHJlcXVpcmVtZW50LCB0aGlzIG1ldGhvZCBvcGVyYXRlcyBsaWtlCisgICAgICA6bWV0aDpgQnl0ZXNQYXJzZXIucGFyc2VgLgorCisKKyAgIC4uIG1ldGhvZDo6IHBhcnNlc3RyKHRleHQsIGhlYWRlcnNvbmx5PUZhbHNlKQorCisgICAgICBTaW1pbGFyIHRvIHRoZSA6bWV0aDpgcGFyc2VgIG1ldGhvZCwgZXhjZXB0IGl0IHRha2VzIGEgc3RyaW5nIG9iamVjdAorICAgICAgaW5zdGVhZCBvZiBhIGZpbGUtbGlrZSBvYmplY3QuICBDYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGEgc3RyaW5nIGlzCisgICAgICBlcXVpdmFsZW50IHRvIHdyYXBwaW5nICp0ZXh0KiBpbiBhIDpjbGFzczpgfmlvLlN0cmluZ0lPYCBpbnN0YW5jZSBmaXJzdAorICAgICAgYW5kIGNhbGxpbmcgOm1ldGg6YHBhcnNlYC4KKworICAgICAgT3B0aW9uYWwgKmhlYWRlcnNvbmx5KiBpcyBhcyB3aXRoIHRoZSA6bWV0aDpgcGFyc2VgIG1ldGhvZC4KKworCisuLiBjbGFzczo6IEhlYWRlclBhcnNlcihfY2xhc3M9Tm9uZSwgKiwgcG9saWN5PXBvbGljeS5jb21wYXQzMikKKworICAgRXhhY3RseSBsaWtlIDpjbGFzczpgUGFyc2VyYCwgZXhjZXB0IHRoYXQgKmhlYWRlcnNvbmx5KgorICAgZGVmYXVsdHMgdG8gYGBUcnVlYGAuCisKKwogU2luY2UgY3JlYXRpbmcgYSBtZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmUgZnJvbSBhIHN0cmluZyBvciBhIGZpbGUgb2JqZWN0IGlzIHN1Y2gKIGEgY29tbW9uIHRhc2ssIGZvdXIgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBhcyBhIGNvbnZlbmllbmNlLiAgVGhleSBhcmUgYXZhaWxhYmxlCiBpbiB0aGUgdG9wLWxldmVsIDptb2Q6YGVtYWlsYCBwYWNrYWdlIG5hbWVzcGFjZS4KIAogLi4gY3VycmVudG1vZHVsZTo6IGVtYWlsCiAKLS4uIGZ1bmN0aW9uOjogbWVzc2FnZV9mcm9tX3N0cmluZyhzLCBfY2xhc3M9ZW1haWwubWVzc2FnZS5NZXNzYWdlLCAqLCBcCisKKy4uIGZ1bmN0aW9uOjogbWVzc2FnZV9mcm9tX2J5dGVzKHMsIF9jbGFzcz1Ob25lLCAqLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3k9cG9saWN5LmNvbXBhdDMyKQorCisgICBSZXR1cm4gYSBtZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmUgZnJvbSBhIDp0ZXJtOmBieXRlcy1saWtlIG9iamVjdGAuICBUaGlzIGlzCisgICBlcXVpdmFsZW50IHRvIGBgQnl0ZXNQYXJzZXIoKS5wYXJzZWJ5dGVzKHMpYGAuICBPcHRpb25hbCAqX2NsYXNzKiBhbmQKKyAgICpzdHJpY3QqIGFyZSBpbnRlcnByZXRlZCBhcyB3aXRoIHRoZSA6Y2xhc3M6YH5lbWFpbC5wYXJzZXIuQnl0ZXNQYXJzZXJgIGNsYXNzCisgICBjb25zdHJ1Y3Rvci4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMworICAgICAgUmVtb3ZlZCB0aGUgKnN0cmljdCogYXJndW1lbnQuICBBZGRlZCB0aGUgKnBvbGljeSoga2V5d29yZC4KKworCisuLiBmdW5jdGlvbjo6IG1lc3NhZ2VfZnJvbV9iaW5hcnlfZmlsZShmcCwgX2NsYXNzPU5vbmUsICosIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeT1wb2xpY3kuY29tcGF0MzIpCisKKyAgIFJldHVybiBhIG1lc3NhZ2Ugb2JqZWN0IHN0cnVjdHVyZSB0cmVlIGZyb20gYW4gb3BlbiBiaW5hcnkgOnRlcm06YGZpbGUKKyAgIG9iamVjdGAuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYGBCeXRlc1BhcnNlcigpLnBhcnNlKGZwKWBgLiAgKl9jbGFzcyogYW5kCisgICAqcG9saWN5KiBhcmUgaW50ZXJwcmV0ZWQgYXMgd2l0aCB0aGUgOmNsYXNzOmB+ZW1haWwucGFyc2VyLkJ5dGVzUGFyc2VyYCBjbGFzcworICAgY29uc3RydWN0b3IuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMKKyAgICAgIFJlbW92ZWQgdGhlICpzdHJpY3QqIGFyZ3VtZW50LiAgQWRkZWQgdGhlICpwb2xpY3kqIGtleXdvcmQuCisKKworLi4gZnVuY3Rpb246OiBtZXNzYWdlX2Zyb21fc3RyaW5nKHMsIF9jbGFzcz1Ob25lLCAqLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5PXBvbGljeS5jb21wYXQzMikKIAotICAgUmV0dXJuIGEgbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlIGZyb20gYSBzdHJpbmcuICBUaGlzIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0bworICAgUmV0dXJuIGEgbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlIGZyb20gYSBzdHJpbmcuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KICAgIGBgUGFyc2VyKCkucGFyc2VzdHIocylgYC4gICpfY2xhc3MqIGFuZCAqcG9saWN5KiBhcmUgaW50ZXJwcmV0ZWQgYXMKICAgIHdpdGggdGhlIDpjbGFzczpgfmVtYWlsLnBhcnNlci5QYXJzZXJgIGNsYXNzIGNvbnN0cnVjdG9yLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMwogICAgICAgUmVtb3ZlZCB0aGUgKnN0cmljdCogYXJndW1lbnQuICBBZGRlZCB0aGUgKnBvbGljeSoga2V5d29yZC4KIAotLi4gZnVuY3Rpb246OiBtZXNzYWdlX2Zyb21fYnl0ZXMocywgX2NsYXNzPWVtYWlsLm1lc3NhZ2UuTWVzc2FnZSwgKiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5PXBvbGljeS5jb21wYXQzMikKIAotICAgUmV0dXJuIGEgbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlIGZyb20gYSA6dGVybTpgYnl0ZXMtbGlrZSBvYmplY3RgLiAgVGhpcyBpcyBleGFjdGx5Ci0gICBlcXVpdmFsZW50IHRvIGBgQnl0ZXNQYXJzZXIoKS5wYXJzZWJ5dGVzKHMpYGAuICBPcHRpb25hbCAqX2NsYXNzKiBhbmQKLSAgICpzdHJpY3QqIGFyZSBpbnRlcnByZXRlZCBhcyB3aXRoIHRoZSA6Y2xhc3M6YH5lbWFpbC5wYXJzZXIuUGFyc2VyYCBjbGFzcwotICAgY29uc3RydWN0b3IuCi0KLSAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMKLSAgICAgIFJlbW92ZWQgdGhlICpzdHJpY3QqIGFyZ3VtZW50LiAgQWRkZWQgdGhlICpwb2xpY3kqIGtleXdvcmQuCi0KLS4uIGZ1bmN0aW9uOjogbWVzc2FnZV9mcm9tX2ZpbGUoZnAsIF9jbGFzcz1lbWFpbC5tZXNzYWdlLk1lc3NhZ2UsICosIFwKKy4uIGZ1bmN0aW9uOjogbWVzc2FnZV9mcm9tX2ZpbGUoZnAsIF9jbGFzcz1Ob25lLCAqLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeT1wb2xpY3kuY29tcGF0MzIpCiAKICAgIFJldHVybiBhIG1lc3NhZ2Ugb2JqZWN0IHN0cnVjdHVyZSB0cmVlIGZyb20gYW4gb3BlbiA6dGVybTpgZmlsZSBvYmplY3RgLgotICAgVGhpcyBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gYGBQYXJzZXIoKS5wYXJzZShmcClgYC4gICpfY2xhc3MqCi0gICBhbmQgKnBvbGljeSogYXJlIGludGVycHJldGVkIGFzIHdpdGggdGhlIDpjbGFzczpgfmVtYWlsLnBhcnNlci5QYXJzZXJgIGNsYXNzCi0gICBjb25zdHJ1Y3Rvci4KKyAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYFBhcnNlcigpLnBhcnNlKGZwKWBgLiAgKl9jbGFzcyogYW5kICpwb2xpY3kqIGFyZQorICAgaW50ZXJwcmV0ZWQgYXMgd2l0aCB0aGUgOmNsYXNzOmB+ZW1haWwucGFyc2VyLlBhcnNlcmAgY2xhc3MgY29uc3RydWN0b3IuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCiAgICAgICBSZW1vdmVkIHRoZSAqc3RyaWN0KiBhcmd1bWVudC4gIEFkZGVkIHRoZSAqcG9saWN5KiBrZXl3b3JkLgogCi0uLiBmdW5jdGlvbjo6IG1lc3NhZ2VfZnJvbV9iaW5hcnlfZmlsZShmcCwgX2NsYXNzPWVtYWlsLm1lc3NhZ2UuTWVzc2FnZSwgKiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5PXBvbGljeS5jb21wYXQzMikKIAotICAgUmV0dXJuIGEgbWVzc2FnZSBvYmplY3Qgc3RydWN0dXJlIHRyZWUgZnJvbSBhbiBvcGVuIGJpbmFyeSA6dGVybTpgZmlsZQotICAgb2JqZWN0YC4gIFRoaXMgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvIGBgQnl0ZXNQYXJzZXIoKS5wYXJzZShmcClgYC4KLSAgICpfY2xhc3MqIGFuZCAqcG9saWN5KiBhcmUgaW50ZXJwcmV0ZWQgYXMgd2l0aCB0aGUKLSAgIDpjbGFzczpgfmVtYWlsLnBhcnNlci5QYXJzZXJgIGNsYXNzIGNvbnN0cnVjdG9yLgotCi0gICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKLSAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCi0gICAgICBSZW1vdmVkIHRoZSAqc3RyaWN0KiBhcmd1bWVudC4gIEFkZGVkIHRoZSAqcG9saWN5KiBrZXl3b3JkLgotCi1IZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgeW91IG1pZ2h0IHVzZSB0aGlzIGF0IGFuIGludGVyYWN0aXZlIFB5dGhvbiBwcm9tcHQ6OgorSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHlvdSBtaWdodCB1c2UgOmZ1bmM6YG1lc3NhZ2VfZnJvbV9ieXRlc2AgYXQgYW4KK2ludGVyYWN0aXZlIFB5dGhvbiBwcm9tcHQ6OgogCiAgICA+Pj4gaW1wb3J0IGVtYWlsCi0gICA+Pj4gbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhteVN0cmluZykgICMgZG9jdGVzdDogK1NLSVAKKyAgID4+PiBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fYnl0ZXMobXlCeXRlcykgICMgZG9jdGVzdDogK1NLSVAKIAogCiBBZGRpdGlvbmFsIG5vdGVzCkBAIC0yNzgsMzUgKzI5MiwyNyBAQAogCiAqIE1vc3Qgbm9uLVwgOm1pbWV0eXBlOmBtdWx0aXBhcnRgIHR5cGUgbWVzc2FnZXMgYXJlIHBhcnNlZCBhcyBhIHNpbmdsZSBtZXNzYWdlCiAgIG9iamVjdCB3aXRoIGEgc3RyaW5nIHBheWxvYWQuICBUaGVzZSBvYmplY3RzIHdpbGwgcmV0dXJuIGBgRmFsc2VgYCBmb3IKLSAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuaXNfbXVsdGlwYXJ0YC4gIFRoZWlyCi0gIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYCBtZXRob2Qgd2lsbCByZXR1cm4gYSBzdHJpbmcgb2JqZWN0LgorICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLmlzX211bHRpcGFydGAsIGFuZAorICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLml0ZXJfcGFydHNgIHdpbGwgeWllbGQgYW4gZW1wdHkgbGlzdC4KIAogKiBBbGwgOm1pbWV0eXBlOmBtdWx0aXBhcnRgIHR5cGUgbWVzc2FnZXMgd2lsbCBiZSBwYXJzZWQgYXMgYSBjb250YWluZXIgbWVzc2FnZQogICBvYmplY3Qgd2l0aCBhIGxpc3Qgb2Ygc3ViLW1lc3NhZ2Ugb2JqZWN0cyBmb3IgdGhlaXIgcGF5bG9hZC4gIFRoZSBvdXRlcgogICBjb250YWluZXIgbWVzc2FnZSB3aWxsIHJldHVybiBgYFRydWVgYCBmb3IKLSAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuaXNfbXVsdGlwYXJ0YCBhbmQgdGhlaXIKLSAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X3BheWxvYWRgIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbGlzdCBvZgotICA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIHN1YnBhcnRzLgorICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLmlzX211bHRpcGFydGAsIGFuZAorICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLml0ZXJfcGFydHNgIHdpbGwgeWllbGQgYSBsaXN0IG9mIHN1YnBhcnRzLgogCi0qIE1vc3QgbWVzc2FnZXMgd2l0aCBhIGNvbnRlbnQgdHlwZSBvZiA6bWltZXR5cGU6YG1lc3NhZ2UvXCpgIChlLmcuCi0gIDptaW1ldHlwZTpgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXNgIGFuZCA6bWltZXR5cGU6YG1lc3NhZ2UvcmZjODIyYCkgd2lsbCBhbHNvIGJlCi0gIHBhcnNlZCBhcyBjb250YWluZXIgb2JqZWN0IGNvbnRhaW5pbmcgYSBsaXN0IHBheWxvYWQgb2YgbGVuZ3RoIDEuICBUaGVpcgotICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5pc19tdWx0aXBhcnRgIG1ldGhvZCB3aWxsIHJldHVybiBgYFRydWVgYC4KLSAgVGhlIHNpbmdsZSBlbGVtZW50IGluIHRoZSBsaXN0IHBheWxvYWQgd2lsbCBiZSBhIHN1Yi1tZXNzYWdlIG9iamVjdC4KKyogTW9zdCBtZXNzYWdlcyB3aXRoIGEgY29udGVudCB0eXBlIG9mIDptaW1ldHlwZTpgbWVzc2FnZS9cKmAgKHN1Y2ggYXMKKyAgOm1pbWV0eXBlOmBtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1c2AgYW5kIDptaW1ldHlwZTpgbWVzc2FnZS9yZmM4MjJgKSB3aWxsIGFsc28KKyAgYmUgcGFyc2VkIGFzIGNvbnRhaW5lciBvYmplY3QgY29udGFpbmluZyBhIGxpc3QgcGF5bG9hZCBvZiBsZW5ndGggMS4gIFRoZWlyCisgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2UuaXNfbXVsdGlwYXJ0YCBtZXRob2Qgd2lsbCByZXR1cm4gYGBUcnVlYGAuCisgIFRoZSBzaW5nbGUgZWxlbWVudCB5aWVsZGVkIGJ5IDptZXRoOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2UuaXRlcl9wYXJ0c2AKKyAgd2lsbCBiZSBhIHN1Yi1tZXNzYWdlIG9iamVjdC4KIAotKiBTb21lIG5vbi1zdGFuZGFyZHMgY29tcGxpYW50IG1lc3NhZ2VzIG1heSBub3QgYmUgaW50ZXJuYWxseSBjb25zaXN0ZW50IGFib3V0CisqIFNvbWUgbm9uLXN0YW5kYXJkcy1jb21wbGlhbnQgbWVzc2FnZXMgbWF5IG5vdCBiZSBpbnRlcm5hbGx5IGNvbnNpc3RlbnQgYWJvdXQKICAgdGhlaXIgOm1pbWV0eXBlOmBtdWx0aXBhcnRgXCAtZWRuZXNzLiAgU3VjaCBtZXNzYWdlcyBtYXkgaGF2ZSBhCiAgIDptYWlsaGVhZGVyOmBDb250ZW50LVR5cGVgIGhlYWRlciBvZiB0eXBlIDptaW1ldHlwZTpgbXVsdGlwYXJ0YCwgYnV0IHRoZWlyCi0gIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmlzX211bHRpcGFydGAgbWV0aG9kIG1heSByZXR1cm4gYGBGYWxzZWBgLgorICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlLmlzX211bHRpcGFydGAgbWV0aG9kIG1heSByZXR1cm4gYGBGYWxzZWBgLgogICBJZiBzdWNoIG1lc3NhZ2VzIHdlcmUgcGFyc2VkIHdpdGggdGhlIDpjbGFzczpgfmVtYWlsLnBhcnNlci5GZWVkUGFyc2VyYCwKICAgdGhleSB3aWxsIGhhdmUgYW4gaW5zdGFuY2Ugb2YgdGhlCiAgIDpjbGFzczpgfmVtYWlsLmVycm9ycy5NdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3RgIGNsYXNzIGluIHRoZWlyCiAgICpkZWZlY3RzKiBhdHRyaWJ1dGUgbGlzdC4gIFNlZSA6bW9kOmBlbWFpbC5lcnJvcnNgIGZvciBkZXRhaWxzLgotCi0uLiBydWJyaWM6OiBGb290bm90ZXMKLQotLi4gWyNdIEFzIG9mIGVtYWlsIHBhY2thZ2UgdmVyc2lvbiAzLjAsIGludHJvZHVjZWQgaW4gUHl0aG9uIDIuNCwgdGhlIGNsYXNzaWMKLSAgIDpjbGFzczpgfmVtYWlsLnBhcnNlci5QYXJzZXJgIHdhcyByZS1pbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUKLSAgIDpjbGFzczpgfmVtYWlsLnBhcnNlci5GZWVkUGFyc2VyYCwgc28gdGhlIHNlbWFudGljcyBhbmQgcmVzdWx0cyBhcmUKLSAgIGlkZW50aWNhbCBiZXR3ZWVuIHRoZSB0d28gcGFyc2Vycy4KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwucG9saWN5LnJzdCBiL0RvYy9saWJyYXJ5L2VtYWlsLnBvbGljeS5yc3QKaW5kZXggMmE2MDQ3ZC4uYjQ5OWVkOCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwucG9saWN5LnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC5wb2xpY3kucnN0CkBAIC0xOCw5ICsxOCwxMiBAQAogZW1haWwgbWVzc2FnZXMgKGEgYmxvY2sgb2YgaGVhZGVyIGZpZWxkcyBlYWNoIGNvbnNpc3Rpbmcgb2YgYSBuYW1lIGZvbGxvd2VkIGJ5CiBhIGNvbG9uIGZvbGxvd2VkIGJ5IGEgdmFsdWUsIHRoZSB3aG9sZSBibG9jayBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUgYW5kIGFuCiBhcmJpdHJhcnkgJ2JvZHknKSwgaXMgYSBmb3JtYXQgdGhhdCBoYXMgZm91bmQgdXRpbGl0eSBvdXRzaWRlIG9mIHRoZSByZWFsbSBvZgotZW1haWwuICBTb21lIG9mIHRoZXNlIHVzZXMgY29uZm9ybSBmYWlybHkgY2xvc2VseSB0byB0aGUgbWFpbiBSRkNzLCBzb21lIGRvCi1ub3QuICBBbmQgZXZlbiB3aGVuIHdvcmtpbmcgd2l0aCBlbWFpbCwgdGhlcmUgYXJlIHRpbWVzIHdoZW4gaXQgaXMgZGVzaXJhYmxlIHRvCi1icmVhayBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHRoZSBSRkNzLgorZW1haWwuICBTb21lIG9mIHRoZXNlIHVzZXMgY29uZm9ybSBmYWlybHkgY2xvc2VseSB0byB0aGUgbWFpbiBlbWFpbCBSRkNzLCBzb21lCitkbyBub3QuICBFdmVuIHdoZW4gd29ya2luZyB3aXRoIGVtYWlsLCB0aGVyZSBhcmUgdGltZXMgd2hlbiBpdCBpcyBkZXNpcmFibGUgdG8KK2JyZWFrIHN0cmljdCBjb21wbGlhbmNlIHdpdGggdGhlIFJGQ3MsIHN1Y2ggYXMgZ2VuZXJhdGluZyBlbWFpbHMgdGhhdAoraW50ZXJvcGVyYXRlIHdpdGggZW1haWwgc2VydmVycyB0aGF0IGRvIG5vdCB0aGVtc2VsdmVzIGZvbGxvdyB0aGUgc3RhbmRhcmRzLCBvcgordGhhdCBpbXBsZW1lbnQgZXh0ZW5zaW9ucyB5b3Ugd2FudCB0byB1c2UgaW4gd2F5cyB0aGF0IHZpb2xhdGUgdGhlCitzdGFuZGFyZHMuCiAKIFBvbGljeSBvYmplY3RzIGdpdmUgdGhlIGVtYWlsIHBhY2thZ2UgdGhlIGZsZXhpYmlsaXR5IHRvIGhhbmRsZSBhbGwgdGhlc2UKIGRpc3BhcmF0ZSB1c2UgY2FzZXMuCkBAIC0zMSwyNyArMzQsNDAgQEAKIGVtYWlsIHBhY2thZ2UgdG8gYWx0ZXIgdGhlIGRlZmF1bHQgYmVoYXZpb3IuICBUaGUgc2V0dGFibGUgdmFsdWVzIGFuZCB0aGVpcgogZGVmYXVsdHMgYXJlIGRlc2NyaWJlZCBiZWxvdy4KIAotVGhlcmUgaXMgYSBkZWZhdWx0IHBvbGljeSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoZSBlbWFpbCBwYWNrYWdlLiAgVGhpcwotcG9saWN5IGlzIG5hbWVkIDpjbGFzczpgQ29tcGF0MzJgLCB3aXRoIGEgY29ycmVzcG9uZGluZyBwcmUtZGVmaW5lZCBpbnN0YW5jZQotbmFtZWQgOmNvbnN0OmBjb21wYXQzMmAuICBJdCBwcm92aWRlcyBmb3IgY29tcGxldGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAoaW4KLXNvbWUgY2FzZXMsIGluY2x1ZGluZyBidWcgY29tcGF0aWJpbGl0eSkgd2l0aCB0aGUgcHJlLVB5dGhvbjMuMyB2ZXJzaW9uIG9mIHRoZQotZW1haWwgcGFja2FnZS4KK1RoZXJlIGlzIGEgZGVmYXVsdCBwb2xpY3kgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGUgZW1haWwgcGFja2FnZS4gIEZvciBhbGwgb2YKK3RoZSA6bW9kOmB+ZW1haWwucGFyc2VyYCBjbGFzc2VzIGFuZCB0aGUgcmVsYXRlZCBjb252ZW5pZW5jZSBmdW5jdGlvbnMsIGFuZCBmb3IKK3RoZSA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGNsYXNzLCB0aGlzIGlzIHRoZSA6Y2xhc3M6YENvbXBhdDMyYAorcG9saWN5LCB2aWEgaXRzIGNvcnJlc3BvbmRpbmcgcHJlLWRlZmluZWQgaW5zdGFuY2UgOmNvbnN0OmBjb21wYXQzMmAuICBUaGlzCitwb2xpY3kgcHJvdmlkZXMgZm9yIGNvbXBsZXRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKGluIHNvbWUgY2FzZXMsIGluY2x1ZGluZworYnVnIGNvbXBhdGliaWxpdHkpIHdpdGggdGhlIHByZS1QeXRob24zLjMgdmVyc2lvbiBvZiB0aGUgZW1haWwgcGFja2FnZS4KKworVGhpcyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgKnBvbGljeSoga2V5d29yZCB0bworOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgIGlzIHRoZSA6Y2xhc3M6YEVtYWlsUG9saWN5YCBwb2xpY3ksIHZpYQoraXRzIHByZS1kZWZpbmVkIGluc3RhbmNlIDpkYXRhOmB+ZGVmYXVsdGAuCisKK1doZW4gYSA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIG9yIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlYAorb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGFjcXVpcmVzIGEgcG9saWN5LiAgSWYgdGhlIG1lc3NhZ2UgaXMgY3JlYXRlZCBieSBhCis6bW9kOmB+ZW1haWwucGFyc2VyYCwgYSBwb2xpY3kgcGFzc2VkIHRvIHRoZSBwYXJzZXIgd2lsbCBiZSB0aGUgcG9saWN5IHVzZWQgYnkKK3RoZSBtZXNzYWdlIGl0IGNyZWF0ZXMuICBJZiB0aGUgbWVzc2FnZSBpcyBjcmVhdGVkIGJ5IHRoZSBwcm9ncmFtLCB0aGVuIHRoZQorcG9saWN5IGNhbiBiZSBzcGVjaWZpZWQgd2hlbiBpdCBpcyBjcmVhdGVkLiAgV2hlbiBhIG1lc3NhZ2UgaXMgcGFzc2VkIHRvIGEKKzptb2Q6YH5lbWFpbC5nZW5lcmF0b3JgLCB0aGUgZ2VuZXJhdG9yIHVzZXMgdGhlIHBvbGljeSBmcm9tIHRoZSBtZXNzYWdlIGJ5CitkZWZhdWx0LCBidXQgeW91IGNhbiBhbHNvIHBhc3MgYSBzcGVjaWZpYyBwb2xpY3kgdG8gdGhlIGdlbmVyYXRvciB0aGF0IHdpbGwKK292ZXJyaWRlIHRoZSBvbmUgc3RvcmVkIG9uIHRoZSBtZXNzYWdlIG9iamVjdC4KKworVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSAqcG9saWN5KiBrZXl3b3JkIGZvciB0aGUgOm1vZDpgZW1haWwucGFyc2VyYCBjbGFzc2VzCithbmQgdGhlIHBhcnNlciBjb252ZW5pZW5jZSBmdW5jdGlvbnMgKip3aWxsIGJlIGNoYW5naW5nKiogaW4gYSBmdXR1cmUgdmVyc2lvbiBvZgorUHl0aG9uLiAgVGhlcmVmb3JlIHlvdSBzaG91bGQgKiphbHdheXMgc3BlY2lmeSBleHBsaWNpdGx5IHdoaWNoIHBvbGljeSB5b3Ugd2FudAordG8gdXNlKiogd2hlbiBjYWxsaW5nIGFueSBvZiB0aGUgY2xhc3NlcyBhbmQgZnVuY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGUKKzptb2Q6YH5lbWFpbC5wYXJzZXJgIG1vZHVsZS4KIAogVGhlIGZpcnN0IHBhcnQgb2YgdGhpcyBkb2N1bWVudGF0aW9uIGNvdmVycyB0aGUgZmVhdHVyZXMgb2YgOmNsYXNzOmBQb2xpY3lgLCBhbgotOnRlcm06YGFic3RyYWN0IGJhc2UgY2xhc3NgICB0aGF0IGRlZmluZXMgdGhlIGZlYXR1cmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwKKzp0ZXJtOmBhYnN0cmFjdCBiYXNlIGNsYXNzYCB0aGF0IGRlZmluZXMgdGhlIGZlYXR1cmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwKIHBvbGljeSBvYmplY3RzLCBpbmNsdWRpbmcgOmNvbnN0OmBjb21wYXQzMmAuICBUaGlzIGluY2x1ZGVzIGNlcnRhaW4gaG9vawogbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgaW50ZXJuYWxseSBieSB0aGUgZW1haWwgcGFja2FnZSwgd2hpY2ggYSBjdXN0b20gcG9saWN5Ci1jb3VsZCBvdmVycmlkZSB0byBvYnRhaW4gZGlmZmVyZW50IGJlaGF2aW9yLgotCi1XaGVuIGEgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBvYmplY3QgaXMgY3JlYXRlZCwgaXQgYWNxdWlyZXMgYSBwb2xpY3kuCi1CeSBkZWZhdWx0IHRoaXMgd2lsbCBiZSA6Y29uc3Q6YGNvbXBhdDMyYCwgYnV0IGEgZGlmZmVyZW50IHBvbGljeSBjYW4gYmUKLXNwZWNpZmllZC4gIElmIHRoZSBgYE1lc3NhZ2VgYCBpcyBjcmVhdGVkIGJ5IGEgOm1vZDpgfmVtYWlsLnBhcnNlcmAsIGEgcG9saWN5Ci1wYXNzZWQgdG8gdGhlIHBhcnNlciB3aWxsIGJlIHRoZSBwb2xpY3kgdXNlZCBieSB0aGUgYGBNZXNzYWdlYGAgaXQgY3JlYXRlcy4gIElmCi10aGUgYGBNZXNzYWdlYGAgaXMgY3JlYXRlZCBieSB0aGUgcHJvZ3JhbSwgdGhlbiB0aGUgcG9saWN5IGNhbiBiZSBzcGVjaWZpZWQKLXdoZW4gaXQgaXMgY3JlYXRlZC4gIFdoZW4gYSBgYE1lc3NhZ2VgYCBpcyBwYXNzZWQgdG8gYSA6bW9kOmB+ZW1haWwuZ2VuZXJhdG9yYCwKLXRoZSBnZW5lcmF0b3IgdXNlcyB0aGUgcG9saWN5IGZyb20gdGhlIGBgTWVzc2FnZWBgIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgY2FuIGFsc28KLXBhc3MgYSBzcGVjaWZpYyBwb2xpY3kgdG8gdGhlIGdlbmVyYXRvciB0aGF0IHdpbGwgb3ZlcnJpZGUgdGhlIG9uZSBzdG9yZWQgb24KLXRoZSBgYE1lc3NhZ2VgYCBvYmplY3QuCitjb3VsZCBvdmVycmlkZSB0byBvYnRhaW4gZGlmZmVyZW50IGJlaGF2aW9yLiAgVGhlIHNlY29uZCBwYXJ0IGRlc2NyaWJlcyB0aGUKK2NvbmNyZXRlIGNsYXNzZXMgOmNsYXNzOmBFbWFpbFBvbGljeWAgYW5kIDpjbGFzczpgQ29tcGF0MzJgLCB3aGljaCBpbXBsZW1lbnQKK3RoZSBob29rcyB0aGF0IHByb3ZpZGUgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIGFuZCB0aGUgYmFja3dhcmQgY29tcGF0aWJsZQorYmVoYXZpb3IgYW5kIGZlYXR1cmVzLCByZXNwZWN0aXZlbHkuCiAKIDpjbGFzczpgUG9saWN5YCBpbnN0YW5jZXMgYXJlIGltbXV0YWJsZSwgYnV0IHRoZXkgY2FuIGJlIGNsb25lZCwgYWNjZXB0aW5nIHRoZQogc2FtZSBrZXl3b3JkIGFyZ3VtZW50cyBhcyB0aGUgY2xhc3MgY29uc3RydWN0b3IgYW5kIHJldHVybmluZyBhIG5ldwpAQCAtMTQ3LDYgKzE2Myw3IEBACiAgICBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzLCBhbmQgdGh1cyB2YWx1ZXMgZm9yIHRoZQogICAgZm9sbG93aW5nIG1heSBiZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGFueSBwb2xpY3kgY2xhc3M6CiAKKwogICAgLi4gYXR0cmlidXRlOjogbWF4X2xpbmVfbGVuZ3RoCiAKICAgICAgIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbnkgbGluZSBpbiB0aGUgc2VyaWFsaXplZCBvdXRwdXQsIG5vdCBjb3VudGluZyB0aGUKQEAgLTE1NCwxMiArMTcxLDE0IEBACiAgICAgICBgYDBgYCBvciA6Y29uc3Q6YE5vbmVgIGluZGljYXRlcyB0aGF0IG5vIGxpbmUgd3JhcHBpbmcgc2hvdWxkIGJlCiAgICAgICBkb25lIGF0IGFsbC4KIAorCiAgICAuLiBhdHRyaWJ1dGU6OiBsaW5lc2VwCiAKICAgICAgIFRoZSBzdHJpbmcgdG8gYmUgdXNlZCB0byB0ZXJtaW5hdGUgbGluZXMgaW4gc2VyaWFsaXplZCBvdXRwdXQuICBUaGUKICAgICAgIGRlZmF1bHQgaXMgYGBcbmBgIGJlY2F1c2UgdGhhdCdzIHRoZSBpbnRlcm5hbCBlbmQtb2YtbGluZSBkaXNjaXBsaW5lIHVzZWQKICAgICAgIGJ5IFB5dGhvbiwgdGhvdWdoIGBgXHJcbmBgIGlzIHJlcXVpcmVkIGJ5IHRoZSBSRkNzLgogCisKICAgIC4uIGF0dHJpYnV0ZTo6IGN0ZV90eXBlCiAKICAgICAgIENvbnRyb2xzIHRoZSB0eXBlIG9mIENvbnRlbnQgVHJhbnNmZXIgRW5jb2RpbmdzIHRoYXQgbWF5IGJlIG9yIGFyZQpAQCAtMTc0LDggKzE5Myw4IEBACiAKICAgICAgIGBgOGJpdGBgICBkYXRhIGlzIG5vdCBjb25zdHJhaW5lZCB0byBiZSA3IGJpdCBjbGVhbi4gIERhdGEgaW4gaGVhZGVycyBpcwogICAgICAgICAgICAgICAgIHN0aWxsIHJlcXVpcmVkIHRvIGJlIEFTQ0lJLW9ubHkgYW5kIHNvIHdpbGwgYmUgZW5jb2RlZCAoc2VlCi0gICAgICAgICAgICAgICAgJ2JpbmFyeV9mb2xkJyBiZWxvdyBmb3IgYW4gZXhjZXB0aW9uKSwgYnV0IGJvZHkgcGFydHMgbWF5IHVzZQotICAgICAgICAgICAgICAgIHRoZSBgYDhiaXRgYCBDVEUuCisgICAgICAgICAgICAgICAgOm1ldGg6YGZvbGRfYmluYXJ5YCBhbmQgOmF0dHI6YH5FbWFpbFBvbGljeS51dGY4YCBiZWxvdyBmb3IKKyAgICAgICAgICAgICAgICBleGNlcHRpb25zKSwgYnV0IGJvZHkgcGFydHMgbWF5IHVzZSB0aGUgYGA4Yml0YGAgQ1RFLgogICAgICAgPT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAgICAgICBBIGBgY3RlX3R5cGVgYCB2YWx1ZSBvZiBgYDhiaXRgYCBvbmx5IHdvcmtzIHdpdGggYGBCeXRlc0dlbmVyYXRvcmBgLCBub3QKQEAgLTE4Myw2ICsyMDIsNyBAQAogICAgICAgYGBHZW5lcmF0b3JgYCBpcyBvcGVyYXRpbmcgdW5kZXIgYSBwb2xpY3kgdGhhdCBzcGVjaWZpZXMKICAgICAgIGBgY3RlX3R5cGU9OGJpdGBgLCBpdCB3aWxsIGFjdCBhcyBpZiBgYGN0ZV90eXBlYGAgaXMgYGA3Yml0YGAuCiAKKwogICAgLi4gYXR0cmlidXRlOjogcmFpc2Vfb25fZGVmZWN0CiAKICAgICAgIElmIDpjb25zdDpgVHJ1ZWAsIGFueSBkZWZlY3RzIGVuY291bnRlcmVkIHdpbGwgYmUgcmFpc2VkIGFzIGVycm9ycy4gIElmCkBAIC0xOTAsNyArMjEwLDYgQEAKICAgICAgIDptZXRoOmByZWdpc3Rlcl9kZWZlY3RgIG1ldGhvZC4KIAogCi0KICAgIC4uIGF0dHJpYnV0ZTo6IG1hbmdsZV9mcm9tXF8KIAogICAgICAgSWYgOmNvbnN0OmBUcnVlYCwgbGluZXMgc3RhcnRpbmcgd2l0aCAqIkZyb20gIiogaW4gdGhlIGJvZHkgYXJlCkBAIC0yMDEsMTkgKzIyMCwyMyBAQAogICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAgICAgICAgICBUaGUgKm1hbmdsZV9mcm9tXyogcGFyYW1ldGVyLgogCisKICAgIFRoZSBmb2xsb3dpbmcgOmNsYXNzOmBQb2xpY3lgIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgY29kZSB1c2luZwogICAgdGhlIGVtYWlsIGxpYnJhcnkgdG8gY3JlYXRlIHBvbGljeSBpbnN0YW5jZXMgd2l0aCBjdXN0b20gc2V0dGluZ3M6CiAKKwogICAgLi4gbWV0aG9kOjogY2xvbmUoKiprdykKIAogICAgICAgUmV0dXJuIGEgbmV3IDpjbGFzczpgUG9saWN5YCBpbnN0YW5jZSB3aG9zZSBhdHRyaWJ1dGVzIGhhdmUgdGhlIHNhbWUKICAgICAgIHZhbHVlcyBhcyB0aGUgY3VycmVudCBpbnN0YW5jZSwgZXhjZXB0IHdoZXJlIHRob3NlIGF0dHJpYnV0ZXMgYXJlCiAgICAgICBnaXZlbiBuZXcgdmFsdWVzIGJ5IHRoZSBrZXl3b3JkIGFyZ3VtZW50cy4KIAorCiAgICBUaGUgcmVtYWluaW5nIDpjbGFzczpgUG9saWN5YCBtZXRob2RzIGFyZSBjYWxsZWQgYnkgdGhlIGVtYWlsIHBhY2thZ2UgY29kZSwKICAgIGFuZCBhcmUgbm90IGludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB1c2luZyB0aGUgZW1haWwgcGFja2FnZS4KICAgIEEgY3VzdG9tIHBvbGljeSBtdXN0IGltcGxlbWVudCBhbGwgb2YgdGhlc2UgbWV0aG9kcy4KIAorCiAgICAuLiBtZXRob2Q6OiBoYW5kbGVfZGVmZWN0KG9iaiwgZGVmZWN0KQogCiAgICAgICBIYW5kbGUgYSAqZGVmZWN0KiBmb3VuZCBvbiAqb2JqKi4gIFdoZW4gdGhlIGVtYWlsIHBhY2thZ2UgY2FsbHMgdGhpcwpAQCAtMjI0LDYgKzI0Nyw3IEBACiAgICAgICBpdCBpcyBgYFRydWVgYCwgKmRlZmVjdCogaXMgcmFpc2VkIGFzIGFuIGV4Y2VwdGlvbi4gIElmIGl0IGlzIGBgRmFsc2VgYAogICAgICAgKHRoZSBkZWZhdWx0KSwgKm9iaiogYW5kICpkZWZlY3QqIGFyZSBwYXNzZWQgdG8gOm1ldGg6YHJlZ2lzdGVyX2RlZmVjdGAuCiAKKwogICAgLi4gbWV0aG9kOjogcmVnaXN0ZXJfZGVmZWN0KG9iaiwgZGVmZWN0KQogCiAgICAgICBSZWdpc3RlciBhICpkZWZlY3QqIG9uICpvYmoqLiAgSW4gdGhlIGVtYWlsIHBhY2thZ2UsICpkZWZlY3QqIHdpbGwgYWx3YXlzCkBAIC0yMzYsMTQgKzI2MCwxNiBAQAogICAgICAgY3VzdG9tIGBgTWVzc2FnZWBgIG9iamVjdHMpIHNob3VsZCBhbHNvIHByb3ZpZGUgc3VjaCBhbiBhdHRyaWJ1dGUsCiAgICAgICBvdGhlcndpc2UgZGVmZWN0cyBpbiBwYXJzZWQgbWVzc2FnZXMgd2lsbCByYWlzZSB1bmV4cGVjdGVkIGVycm9ycy4KIAorCiAgICAuLiBtZXRob2Q6OiBoZWFkZXJfbWF4X2NvdW50KG5hbWUpCiAKICAgICAgIFJldHVybiB0aGUgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBoZWFkZXJzIG5hbWVkICpuYW1lKi4KIAotICAgICAgQ2FsbGVkIHdoZW4gYSBoZWFkZXIgaXMgYWRkZWQgdG8gYSA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgCi0gICAgICBvYmplY3QuICBJZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgbm90IGBgMGBgIG9yIGBgTm9uZWBgLCBhbmQgdGhlcmUgYXJlCi0gICAgICBhbHJlYWR5IGEgbnVtYmVyIG9mIGhlYWRlcnMgd2l0aCB0aGUgbmFtZSAqbmFtZSogZXF1YWwgdG8gdGhlIHZhbHVlCi0gICAgICByZXR1cm5lZCwgYSA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQuCisgICAgICBDYWxsZWQgd2hlbiBhIGhlYWRlciBpcyBhZGRlZCB0byBhbiA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZWAKKyAgICAgIG9yIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgb2JqZWN0LiAgSWYgdGhlIHJldHVybmVkIHZhbHVlIGlzIG5vdAorICAgICAgYGAwYGAgb3IgYGBOb25lYGAsIGFuZCB0aGVyZSBhcmUgYWxyZWFkeSBhIG51bWJlciBvZiBoZWFkZXJzIHdpdGggdGhlCisgICAgICBuYW1lICpuYW1lKiBncmVhdGhlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB2YWx1ZSByZXR1cm5lZCwgYQorICAgICAgOmV4YzpgVmFsdWVFcnJvcmAgaXMgcmFpc2VkLgogCiAgICAgICBCZWNhdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGBgTWVzc2FnZS5fX3NldGl0ZW1fX2BgIGlzIHRvIGFwcGVuZCB0aGUKICAgICAgIHZhbHVlIHRvIHRoZSBsaXN0IG9mIGhlYWRlcnMsIGl0IGlzIGVhc3kgdG8gY3JlYXRlIGR1cGxpY2F0ZSBoZWFkZXJzCkBAIC0yNTUsNiArMjgxLDcgQEAKIAogICAgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBgYE5vbmVgYCBmb3IgYWxsIGhlYWRlciBuYW1lcy4KIAorCiAgICAuLiBtZXRob2Q6OiBoZWFkZXJfc291cmNlX3BhcnNlKHNvdXJjZWxpbmVzKQogCiAgICAgICBUaGUgZW1haWwgcGFja2FnZSBjYWxscyB0aGlzIG1ldGhvZCB3aXRoIGEgbGlzdCBvZiBzdHJpbmdzLCBlYWNoIHN0cmluZwpAQCAtMjc0LDYgKzMwMSw3IEBACiAKICAgICAgIFRoZXJlIGlzIG5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KIAorCiAgICAuLiBtZXRob2Q6OiBoZWFkZXJfc3RvcmVfcGFyc2UobmFtZSwgdmFsdWUpCiAKICAgICAgIFRoZSBlbWFpbCBwYWNrYWdlIGNhbGxzIHRoaXMgbWV0aG9kIHdpdGggdGhlIG5hbWUgYW5kIHZhbHVlIHByb3ZpZGVkIGJ5CkBAIC0yODksNiArMzE3LDcgQEAKIAogICAgICAgVGhlcmUgaXMgbm8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogCisKICAgIC4uIG1ldGhvZDo6IGhlYWRlcl9mZXRjaF9wYXJzZShuYW1lLCB2YWx1ZSkKIAogICAgICAgVGhlIGVtYWlsIHBhY2thZ2UgY2FsbHMgdGhpcyBtZXRob2Qgd2l0aCB0aGUgKm5hbWUqIGFuZCAqdmFsdWUqIGN1cnJlbnRseQpAQCAtMzA0LDYgKzMzMyw3IEBACiAKICAgICAgIFRoZXJlIGlzIG5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KIAorCiAgICAuLiBtZXRob2Q6OiBmb2xkKG5hbWUsIHZhbHVlKQogCiAgICAgICBUaGUgZW1haWwgcGFja2FnZSBjYWxscyB0aGlzIG1ldGhvZCB3aXRoIHRoZSAqbmFtZSogYW5kICp2YWx1ZSogY3VycmVudGx5CkBAIC0zMTYsNiArMzQ2LDcgQEAKICAgICAgICp2YWx1ZSogbWF5IGNvbnRhaW4gc3Vycm9nYXRlZXNjYXBlZCBiaW5hcnkgZGF0YS4gIFRoZXJlIHNob3VsZCBiZSBubwogICAgICAgc3Vycm9nYXRlZXNjYXBlZCBiaW5hcnkgZGF0YSBpbiB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBtZXRob2QuCiAKKwogICAgLi4gbWV0aG9kOjogZm9sZF9iaW5hcnkobmFtZSwgdmFsdWUpCiAKICAgICAgIFRoZSBzYW1lIGFzIDptZXRoOmBmb2xkYCwgZXhjZXB0IHRoYXQgdGhlIHJldHVybmVkIHZhbHVlIHNob3VsZCBiZSBhCkBAIC0zMjUsNzMgKzM1Niw2IEBACiAgICAgICBjb252ZXJ0ZWQgYmFjayBpbnRvIGJpbmFyeSBkYXRhIGluIHRoZSByZXR1cm5lZCBieXRlcyBvYmplY3QuCiAKIAotLi4gY2xhc3M6OiBDb21wYXQzMigqKmt3KQotCi0gICBUaGlzIGNvbmNyZXRlIDpjbGFzczpgUG9saWN5YCBpcyB0aGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBwb2xpY3kuICBJdAotICAgcmVwbGljYXRlcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGVtYWlsIHBhY2thZ2UgaW4gUHl0aG9uIDMuMi4gIFRoZQotICAgOm1vZDpgfmVtYWlsLnBvbGljeWAgbW9kdWxlIGFsc28gZGVmaW5lcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLAotICAgOmNvbnN0OmBjb21wYXQzMmAsIHRoYXQgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBwb2xpY3kuICBUaHVzIHRoZSBkZWZhdWx0Ci0gICBiZWhhdmlvciBvZiB0aGUgZW1haWwgcGFja2FnZSBpcyB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDMuMi4KLQotICAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGhhdmUgdmFsdWVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRoZQotICAgOmNsYXNzOmBQb2xpY3lgIGRlZmF1bHQ6Ci0KLSAgIC4uIGF0dHJpYnV0ZTo6IG1hbmdsZV9mcm9tXwotCi0gICAgICBUaGUgZGVmYXVsdCBpcyBgYFRydWVgYC4KLQotICAgVGhlIGNsYXNzIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZQotICAgYWJzdHJhY3QgbWV0aG9kcyBvZiA6Y2xhc3M6YFBvbGljeWA6Ci0KLSAgIC4uIG1ldGhvZDo6IGhlYWRlcl9zb3VyY2VfcGFyc2Uoc291cmNlbGluZXMpCi0KLSAgICAgIFRoZSBuYW1lIGlzIHBhcnNlZCBhcyBldmVyeXRoaW5nIHVwIHRvIHRoZSAnYGA6YGAnIGFuZCByZXR1cm5lZAotICAgICAgdW5tb2RpZmllZC4gIFRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHN0cmlwcGluZyBsZWFkaW5nIHdoaXRlc3BhY2Ugb2ZmCi0gICAgICB0aGUgcmVtYWluZGVyIG9mIHRoZSBmaXJzdCBsaW5lLCBqb2luaW5nIGFsbCBzdWJzZXF1ZW50IGxpbmVzIHRvZ2V0aGVyLAotICAgICAgYW5kIHN0cmlwcGluZyBhbnkgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIG9yIGxpbmVmZWVkIGNoYXJhY3RlcnMuCi0KLSAgIC4uIG1ldGhvZDo6IGhlYWRlcl9zdG9yZV9wYXJzZShuYW1lLCB2YWx1ZSkKLQotICAgICAgVGhlIG5hbWUgYW5kIHZhbHVlIGFyZSByZXR1cm5lZCB1bm1vZGlmaWVkLgotCi0gICAuLiBtZXRob2Q6OiBoZWFkZXJfZmV0Y2hfcGFyc2UobmFtZSwgdmFsdWUpCi0KLSAgICAgIElmIHRoZSB2YWx1ZSBjb250YWlucyBiaW5hcnkgZGF0YSwgaXQgaXMgY29udmVydGVkIGludG8gYQotICAgICAgOmNsYXNzOmB+ZW1haWwuaGVhZGVyLkhlYWRlcmAgb2JqZWN0IHVzaW5nIHRoZSBgYHVua25vd24tOGJpdGBgIGNoYXJzZXQuCi0gICAgICBPdGhlcndpc2UgaXQgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KLQotICAgLi4gbWV0aG9kOjogZm9sZChuYW1lLCB2YWx1ZSkKLQotICAgICAgSGVhZGVycyBhcmUgZm9sZGVkIHVzaW5nIHRoZSA6Y2xhc3M6YH5lbWFpbC5oZWFkZXIuSGVhZGVyYCBmb2xkaW5nCi0gICAgICBhbGdvcml0aG0sIHdoaWNoIHByZXNlcnZlcyBleGlzdGluZyBsaW5lIGJyZWFrcyBpbiB0aGUgdmFsdWUsIGFuZCB3cmFwcwotICAgICAgZWFjaCByZXN1bHRpbmcgbGluZSB0byB0aGUgYGBtYXhfbGluZV9sZW5ndGhgYC4gIE5vbi1BU0NJSSBiaW5hcnkgZGF0YSBhcmUKLSAgICAgIENURSBlbmNvZGVkIHVzaW5nIHRoZSBgYHVua25vd24tOGJpdGBgIGNoYXJzZXQuCi0KLSAgIC4uIG1ldGhvZDo6IGZvbGRfYmluYXJ5KG5hbWUsIHZhbHVlKQotCi0gICAgICBIZWFkZXJzIGFyZSBmb2xkZWQgdXNpbmcgdGhlIDpjbGFzczpgfmVtYWlsLmhlYWRlci5IZWFkZXJgIGZvbGRpbmcKLSAgICAgIGFsZ29yaXRobSwgd2hpY2ggcHJlc2VydmVzIGV4aXN0aW5nIGxpbmUgYnJlYWtzIGluIHRoZSB2YWx1ZSwgYW5kIHdyYXBzCi0gICAgICBlYWNoIHJlc3VsdGluZyBsaW5lIHRvIHRoZSBgYG1heF9saW5lX2xlbmd0aGBgLiAgSWYgYGBjdGVfdHlwZWBgIGlzCi0gICAgICBgYDdiaXRgYCwgbm9uLWFzY2lpIGJpbmFyeSBkYXRhIGlzIENURSBlbmNvZGVkIHVzaW5nIHRoZSBgYHVua25vd24tOGJpdGBgCi0gICAgICBjaGFyc2V0LiAgT3RoZXJ3aXNlIHRoZSBvcmlnaW5hbCBzb3VyY2UgaGVhZGVyIGlzIHVzZWQsIHdpdGggaXRzIGV4aXN0aW5nCi0gICAgICBsaW5lIGJyZWFrcyBhbmQgYW55IChSRkMgaW52YWxpZCkgYmluYXJ5IGRhdGEgaXQgbWF5IGNvbnRhaW4uCi0KLQotQW4gaW5zdGFuY2Ugb2YgOmNsYXNzOmBDb21wYXQzMmAgaXMgcHJvdmlkZWQgYXMgYSBtb2R1bGUgY29uc3RhbnQ6Ci0KLS4uIGRhdGE6OiBjb21wYXQzMgotCi0gICBBbiBpbnN0YW5jZSBvZiA6Y2xhc3M6YENvbXBhdDMyYCwgcHJvdmlkaW5nICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlCi0gICBiZWhhdmlvciBvZiB0aGUgZW1haWwgcGFja2FnZSBpbiBQeXRob24gMy4yLgotCi0KLS4uIG5vdGU6OgotCi0gICBUaGUgZG9jdW1lbnRhdGlvbiBiZWxvdyBkZXNjcmliZXMgbmV3IHBvbGljaWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZQotICAgc3RhbmRhcmQgbGlicmFyeSBvbiBhIDp0ZXJtOmBwcm92aXNpb25hbCBiYXNpcyA8cHJvdmlzaW9uYWwgcGFja2FnZT5gLgotICAgQmFja3dhcmRzIGluY29tcGF0aWJsZSBjaGFuZ2VzICh1cCB0byBhbmQgaW5jbHVkaW5nIHJlbW92YWwgb2YgdGhlIGZlYXR1cmUpCi0gICBtYXkgb2NjdXIgaWYgZGVlbWVkIG5lY2Vzc2FyeSBieSB0aGUgY29yZSBkZXZlbG9wZXJzLgotCiAKIC4uIGNsYXNzOjogRW1haWxQb2xpY3koKiprdykKIApAQCAtNDA3LDYgKzM3MSw5IEBACiAgICBJbiBhZGRpdGlvbiB0byB0aGUgc2V0dGFibGUgYXR0cmlidXRlcyBsaXN0ZWQgYWJvdmUgdGhhdCBhcHBseSB0byBhbGwKICAgIHBvbGljaWVzLCB0aGlzIHBvbGljeSBhZGRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhdHRyaWJ1dGVzOgogCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYgWzFdXworCisKICAgIC4uIGF0dHJpYnV0ZTo6IHV0ZjgKIAogICAgICAgSWYgYGBGYWxzZWBgLCBmb2xsb3cgOnJmYzpgNTMyMmAsIHN1cHBvcnRpbmcgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4KQEAgLTQxNSwxMyArMzgyLDE0IEBACiAgICAgICBmb3JtYXR0ZWQgaW4gdGhpcyB3YXkgbWF5IGJlIHBhc3NlZCB0byBTTVRQIHNlcnZlcnMgdGhhdCBzdXBwb3J0CiAgICAgICB0aGUgYGBTTVRQVVRGOGBgIGV4dGVuc2lvbiAoOnJmYzpgNjUzMWApLgogCisKICAgIC4uIGF0dHJpYnV0ZTo6IHJlZm9sZF9zb3VyY2UKIAogICAgICAgSWYgdGhlIHZhbHVlIGZvciBhIGhlYWRlciBpbiB0aGUgYGBNZXNzYWdlYGAgb2JqZWN0IG9yaWdpbmF0ZWQgZnJvbSBhCiAgICAgICA6bW9kOmB+ZW1haWwucGFyc2VyYCAoYXMgb3Bwb3NlZCB0byBiZWluZyBzZXQgYnkgYSBwcm9ncmFtKSwgdGhpcwogICAgICAgYXR0cmlidXRlIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhIGdlbmVyYXRvciBzaG91bGQgcmVmb2xkIHRoYXQgdmFsdWUKLSAgICAgIHdoZW4gdHJhbnNmb3JtaW5nIHRoZSBtZXNzYWdlIGJhY2sgaW50byBzdHJlYW0gZm9ybS4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMKLSAgICAgIGFyZToKKyAgICAgIHdoZW4gdHJhbnNmb3JtaW5nIHRoZSBtZXNzYWdlIGJhY2sgaW50byBzZXJpYWxpemVkIGZvcm0uICBUaGUgcG9zc2libGUKKyAgICAgIHZhbHVlcyBhcmU6CiAKICAgICAgID09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgIGBgbm9uZWBgICBhbGwgc291cmNlIHZhbHVlcyB1c2Ugb3JpZ2luYWwgZm9sZGluZwpAQCAtNDM0LDIzICs0MDIsMjQgQEAKIAogICAgICAgVGhlIGRlZmF1bHQgaXMgYGBsb25nYGAuCiAKKwogICAgLi4gYXR0cmlidXRlOjogaGVhZGVyX2ZhY3RvcnkKIAogICAgICAgQSBjYWxsYWJsZSB0aGF0IHRha2VzIHR3byBhcmd1bWVudHMsIGBgbmFtZWBgIGFuZCBgYHZhbHVlYGAsIHdoZXJlCiAgICAgICBgYG5hbWVgYCBpcyBhIGhlYWRlciBmaWVsZCBuYW1lIGFuZCBgYHZhbHVlYGAgaXMgYW4gdW5mb2xkZWQgaGVhZGVyIGZpZWxkCiAgICAgICB2YWx1ZSwgYW5kIHJldHVybnMgYSBzdHJpbmcgc3ViY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoYXQgaGVhZGVyLiAgQQogICAgICAgZGVmYXVsdCBgYGhlYWRlcl9mYWN0b3J5YGAgKHNlZSA6bW9kOmB+ZW1haWwuaGVhZGVycmVnaXN0cnlgKSBpcyBwcm92aWRlZAotICAgICAgdGhhdCB1bmRlcnN0YW5kcyBzb21lIG9mIHRoZSA6UkZDOmA1MzIyYCBoZWFkZXIgZmllbGQgdHlwZXMuICAoQ3VycmVudGx5Ci0gICAgICBhZGRyZXNzIGZpZWxkcyBhbmQgZGF0ZSBmaWVsZHMgaGF2ZSBzcGVjaWFsIHRyZWF0bWVudCwgd2hpbGUgYWxsIG90aGVyCi0gICAgICBmaWVsZHMgYXJlIHRyZWF0ZWQgYXMgdW5zdHJ1Y3R1cmVkLiAgVGhpcyBsaXN0IHdpbGwgYmUgY29tcGxldGVkIGJlZm9yZQotICAgICAgdGhlIGV4dGVuc2lvbiBpcyBtYXJrZWQgc3RhYmxlLikKKyAgICAgIHRoYXQgc3VwcG9ydHMgY3VzdG9tIHBhcnNpbmcgZm9yIHRoZSB2YXJpb3VzIGFkZHJlc3MgYW5kIGRhdGUgOlJGQzpgNTMyMmAKKyAgICAgIGhlYWRlciBmaWVsZCB0eXBlcywgYW5kIHRoZSBtYWpvciBNSU1FIGhlYWRlciBmaWVsZCBzdHlwZXMuICBTdXBwb3J0IGZvcgorICAgICAgYWRkaXRpb25hbCBjdXN0b20gcGFyc2luZyB3aWxsIGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuCisKIAogICAgLi4gYXR0cmlidXRlOjogY29udGVudF9tYW5hZ2VyCiAKICAgICAgIEFuIG9iamVjdCB3aXRoIGF0IGxlYXN0IHR3byBtZXRob2RzOiBnZXRfY29udGVudCBhbmQgc2V0X2NvbnRlbnQuICBXaGVuCi0gICAgICB0aGUgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X2NvbnRlbnRgIG9yCi0gICAgICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5zZXRfY29udGVudGAgbWV0aG9kIG9mIGEKLSAgICAgIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgb2JqZWN0IGlzIGNhbGxlZCwgaXQgY2FsbHMgdGhlCisgICAgICB0aGUgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZS5nZXRfY29udGVudGAgb3IKKyAgICAgIDptZXRoOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2Uuc2V0X2NvbnRlbnRgIG1ldGhvZCBvZiBhbgorICAgICAgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgIG9iamVjdCBpcyBjYWxsZWQsIGl0IGNhbGxzIHRoZQogICAgICAgY29ycmVzcG9uZGluZyBtZXRob2Qgb2YgdGhpcyBvYmplY3QsIHBhc3NpbmcgaXQgdGhlIG1lc3NhZ2Ugb2JqZWN0IGFzIGl0cwogICAgICAgZmlyc3QgYXJndW1lbnQsIGFuZCBhbnkgYXJndW1lbnRzIG9yIGtleXdvcmRzIHRoYXQgd2VyZSBwYXNzZWQgdG8gaXQgYXMKICAgICAgIGFkZGl0aW9uYWwgYXJndW1lbnRzLiAgQnkgZGVmYXVsdCBgYGNvbnRlbnRfbWFuYWdlcmBgIGlzIHNldCB0bwpAQCAtNDYyLDE2ICs0MzEsMjIgQEAKICAgIFRoZSBjbGFzcyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYWJzdHJhY3QKICAgIG1ldGhvZHMgb2YgOmNsYXNzOmBQb2xpY3lgOgogCisKICAgIC4uIG1ldGhvZDo6IGhlYWRlcl9tYXhfY291bnQobmFtZSkKIAogICAgICAgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlCiAgICAgICA6YXR0cjpgfmVtYWlsLmhlYWRlcnJlZ2lzdHJ5LkJhc2VIZWFkZXIubWF4X2NvdW50YCBhdHRyaWJ1dGUgb2YgdGhlCiAgICAgICBzcGVjaWFsaXplZCBjbGFzcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgaGVhZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAKKwogICAgLi4gbWV0aG9kOjogaGVhZGVyX3NvdXJjZV9wYXJzZShzb3VyY2VsaW5lcykKIAotICAgICAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIHRoZSBzYW1lIGFzIHRoYXQgZm9yIHRoZQotICAgICAgOmNsYXNzOmBDb21wYXQzMmAgcG9saWN5LgorCisgICAgICBUaGUgbmFtZSBpcyBwYXJzZWQgYXMgZXZlcnl0aGluZyB1cCB0byB0aGUgJ2BgOmBgJyBhbmQgcmV0dXJuZWQKKyAgICAgIHVubW9kaWZpZWQuICBUaGUgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSBzdHJpcHBpbmcgbGVhZGluZyB3aGl0ZXNwYWNlIG9mZgorICAgICAgdGhlIHJlbWFpbmRlciBvZiB0aGUgZmlyc3QgbGluZSwgam9pbmluZyBhbGwgc3Vic2VxdWVudCBsaW5lcyB0b2dldGhlciwKKyAgICAgIGFuZCBzdHJpcHBpbmcgYW55IHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiBvciBsaW5lZmVlZCBjaGFyYWN0ZXJzLgorCiAKICAgIC4uIG1ldGhvZDo6IGhlYWRlcl9zdG9yZV9wYXJzZShuYW1lLCB2YWx1ZSkKIApAQCAtNDgyLDYgKzQ1Nyw3IEBACiAgICAgICB0aGUgdmFsdWUuICBJbiB0aGlzIGNhc2UgYSBgYFZhbHVlRXJyb3JgYCBpcyByYWlzZWQgaWYgdGhlIGlucHV0IHZhbHVlCiAgICAgICBjb250YWlucyBDUiBvciBMRiBjaGFyYWN0ZXJzLgogCisKICAgIC4uIG1ldGhvZDo6IGhlYWRlcl9mZXRjaF9wYXJzZShuYW1lLCB2YWx1ZSkKIAogICAgICAgSWYgdGhlIHZhbHVlIGhhcyBhIGBgbmFtZWBgIGF0dHJpYnV0ZSwgaXQgaXMgcmV0dXJuZWQgdG8gdW5tb2RpZmllZC4KQEAgLTQ5MCw2ICs0NjYsNyBAQAogICAgICAgaGVhZGVyIG9iamVjdCBpcyByZXR1cm5lZC4gIEFueSBzdXJyb2dhdGVlc2NhcGVkIGJ5dGVzIGdldCB0dXJuZWQgaW50bwogICAgICAgdGhlIHVuaWNvZGUgdW5rbm93bi1jaGFyYWN0ZXIgZ2x5cGguCiAKKwogICAgLi4gbWV0aG9kOjogZm9sZChuYW1lLCB2YWx1ZSkKIAogICAgICAgSGVhZGVyIGZvbGRpbmcgaXMgY29udHJvbGxlZCBieSB0aGUgOmF0dHI6YHJlZm9sZF9zb3VyY2VgIHBvbGljeSBzZXR0aW5nLgpAQCAtNTA4LDYgKzQ4NSw3IEBACiAgICAgICByZWdhcmRsZXNzIG9mIHRoZSBgYHJlZm9sZF9zb3VyY2VgYCBzZXR0aW5nLCB3aGljaCBjYXVzZXMgdGhlIGJpbmFyeSBkYXRhCiAgICAgICB0byBiZSBDVEUgZW5jb2RlZCB1c2luZyB0aGUgYGB1bmtub3duLThiaXRgYCBjaGFyc2V0LgogCisKICAgIC4uIG1ldGhvZDo6IGZvbGRfYmluYXJ5KG5hbWUsIHZhbHVlKQogCiAgICAgICBUaGUgc2FtZSBhcyA6bWV0aDpgZm9sZGAgaWYgOmF0dHI6YH5Qb2xpY3kuY3RlX3R5cGVgIGlzIGBgN2JpdGBgLCBleGNlcHQKQEAgLTUxOSwyMyArNDk3LDI3IEBACiAgICAgICBgYHJlZm9sZF9oZWFkZXJgYCBzZXR0aW5nLCBzaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGV0aGVyIHRoZQogICAgICAgYmluYXJ5IGRhdGEgY29uc2lzdHMgb2Ygc2luZ2xlIGJ5dGUgY2hhcmFjdGVycyBvciBtdWx0aWJ5dGUgY2hhcmFjdGVycy4KIAorCiBUaGUgZm9sbG93aW5nIGluc3RhbmNlcyBvZiA6Y2xhc3M6YEVtYWlsUG9saWN5YCBwcm92aWRlIGRlZmF1bHRzIHN1aXRhYmxlIGZvcgogc3BlY2lmaWMgYXBwbGljYXRpb24gZG9tYWlucy4gIE5vdGUgdGhhdCBpbiB0aGUgZnV0dXJlIHRoZSBiZWhhdmlvciBvZiB0aGVzZQogaW5zdGFuY2VzIChpbiBwYXJ0aWN1bGFyIHRoZSBgYEhUVFBgYCBpbnN0YW5jZSkgbWF5IGJlIGFkanVzdGVkIHRvIGNvbmZvcm0gZXZlbgogbW9yZSBjbG9zZWx5IHRvIHRoZSBSRkNzIHJlbGV2YW50IHRvIHRoZWlyIGRvbWFpbnMuCiAKKwogLi4gZGF0YTo6IGRlZmF1bHQKIAogICAgQW4gaW5zdGFuY2Ugb2YgYGBFbWFpbFBvbGljeWBgIHdpdGggYWxsIGRlZmF1bHRzIHVuY2hhbmdlZC4gIFRoaXMgcG9saWN5CiAgICB1c2VzIHRoZSBzdGFuZGFyZCBQeXRob24gYGBcbmBgIGxpbmUgZW5kaW5ncyByYXRoZXIgdGhhbiB0aGUgUkZDLWNvcnJlY3QKICAgIGBgXHJcbmBgLgogCisKIC4uIGRhdGE6OiBTTVRQCiAKICAgIFN1aXRhYmxlIGZvciBzZXJpYWxpemluZyBtZXNzYWdlcyBpbiBjb25mb3JtYW5jZSB3aXRoIHRoZSBlbWFpbCBSRkNzLgogICAgTGlrZSBgYGRlZmF1bHRgYCwgYnV0IHdpdGggYGBsaW5lc2VwYGAgc2V0IHRvIGBgXHJcbmBgLCB3aGljaCBpcyBSRkMKICAgIGNvbXBsaWFudC4KIAorCiAuLiBkYXRhOjogU01UUFVURjgKIAogICAgVGhlIHNhbWUgYXMgYGBTTVRQYGAgZXhjZXB0IHRoYXQgOmF0dHI6YH5FbWFpbFBvbGljeS51dGY4YCBpcyBgYFRydWVgYC4KQEAgLTU0NCwxMSArNTI2LDEzIEBACiAgICBzZW5kZXIgb3IgcmVjaXBpZW50IGFkZHJlc3NlcyBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzICh0aGUKICAgIDptZXRoOmBzbXRwbGliLlNNVFAuc2VuZF9tZXNzYWdlYCBtZXRob2QgaGFuZGxlcyB0aGlzIGF1dG9tYXRpY2FsbHkpLgogCisKIC4uIGRhdGE6OiBIVFRQCiAKICAgIFN1aXRhYmxlIGZvciBzZXJpYWxpemluZyBoZWFkZXJzIHdpdGggZm9yIHVzZSBpbiBIVFRQIHRyYWZmaWMuICBMaWtlCiAgICBgYFNNVFBgYCBleGNlcHQgdGhhdCBgYG1heF9saW5lX2xlbmd0aGBgIGlzIHNldCB0byBgYE5vbmVgYCAodW5saW1pdGVkKS4KIAorCiAuLiBkYXRhOjogc3RyaWN0CiAKICAgIENvbnZlbmllbmNlIGluc3RhbmNlLiAgVGhlIHNhbWUgYXMgYGBkZWZhdWx0YGAgZXhjZXB0IHRoYXQKQEAgLTU1Nyw2ICs1NDEsNyBAQAogCiAgICAgICAgIHNvbWVwb2xpY3kgKyBwb2xpY3kuc3RyaWN0CiAKKwogV2l0aCBhbGwgb2YgdGhlc2UgOmNsYXNzOmBFbWFpbFBvbGljaWVzIDwuRW1haWxQb2xpY3k+YCwgdGhlIGVmZmVjdGl2ZSBBUEkgb2YKIHRoZSBlbWFpbCBwYWNrYWdlIGlzIGNoYW5nZWQgZnJvbSB0aGUgUHl0aG9uIDMuMiBBUEkgaW4gdGhlIGZvbGxvd2luZyB3YXlzOgogCkBAIC01NzMsNyArNTU4LDcgQEAKICAgICAgYW5kIGFsbG93ZWQuCiAKIEZyb20gdGhlIGFwcGxpY2F0aW9uIHZpZXcsIHRoaXMgbWVhbnMgdGhhdCBhbnkgaGVhZGVyIG9idGFpbmVkIHRocm91Z2ggdGhlCi06Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGlzIGEgaGVhZGVyIG9iamVjdCB3aXRoIGV4dHJhCis6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZWAgaXMgYSBoZWFkZXIgb2JqZWN0IHdpdGggZXh0cmEKIGF0dHJpYnV0ZXMsIHdob3NlIHN0cmluZyB2YWx1ZSBpcyB0aGUgZnVsbHkgZGVjb2RlZCB1bmljb2RlIHZhbHVlIG9mIHRoZQogaGVhZGVyLiAgTGlrZXdpc2UsIGEgaGVhZGVyIG1heSBiZSBhc3NpZ25lZCBhIG5ldyB2YWx1ZSwgb3IgYSBuZXcgaGVhZGVyCiBjcmVhdGVkLCB1c2luZyBhIHVuaWNvZGUgc3RyaW5nLCBhbmQgdGhlIHBvbGljeSB3aWxsIHRha2UgY2FyZSBvZiBjb252ZXJ0aW5nCkBAIC01ODEsMyArNTY2LDc1IEBACiAKIFRoZSBoZWFkZXIgb2JqZWN0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyBhcmUgZGVzY3JpYmVkIGluCiA6bW9kOmB+ZW1haWwuaGVhZGVycmVnaXN0cnlgLgorCisKKworLi4gY2xhc3M6OiBDb21wYXQzMigqKmt3KQorCisgICBUaGlzIGNvbmNyZXRlIDpjbGFzczpgUG9saWN5YCBpcyB0aGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBwb2xpY3kuICBJdAorICAgcmVwbGljYXRlcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGVtYWlsIHBhY2thZ2UgaW4gUHl0aG9uIDMuMi4gIFRoZQorICAgOm1vZDpgfmVtYWlsLnBvbGljeWAgbW9kdWxlIGFsc28gZGVmaW5lcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLAorICAgOmNvbnN0OmBjb21wYXQzMmAsIHRoYXQgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBwb2xpY3kuICBUaHVzIHRoZSBkZWZhdWx0CisgICBiZWhhdmlvciBvZiB0aGUgZW1haWwgcGFja2FnZSBpcyB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDMuMi4KKworICAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGhhdmUgdmFsdWVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRoZQorICAgOmNsYXNzOmBQb2xpY3lgIGRlZmF1bHQ6CisKKworICAgLi4gYXR0cmlidXRlOjogbWFuZ2xlX2Zyb21fCisKKyAgICAgIFRoZSBkZWZhdWx0IGlzIGBgVHJ1ZWBgLgorCisKKyAgIFRoZSBjbGFzcyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUKKyAgIGFic3RyYWN0IG1ldGhvZHMgb2YgOmNsYXNzOmBQb2xpY3lgOgorCisKKyAgIC4uIG1ldGhvZDo6IGhlYWRlcl9zb3VyY2VfcGFyc2Uoc291cmNlbGluZXMpCisKKyAgICAgIFRoZSBuYW1lIGlzIHBhcnNlZCBhcyBldmVyeXRoaW5nIHVwIHRvIHRoZSAnYGA6YGAnIGFuZCByZXR1cm5lZAorICAgICAgdW5tb2RpZmllZC4gIFRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHN0cmlwcGluZyBsZWFkaW5nIHdoaXRlc3BhY2Ugb2ZmCisgICAgICB0aGUgcmVtYWluZGVyIG9mIHRoZSBmaXJzdCBsaW5lLCBqb2luaW5nIGFsbCBzdWJzZXF1ZW50IGxpbmVzIHRvZ2V0aGVyLAorICAgICAgYW5kIHN0cmlwcGluZyBhbnkgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIG9yIGxpbmVmZWVkIGNoYXJhY3RlcnMuCisKKworICAgLi4gbWV0aG9kOjogaGVhZGVyX3N0b3JlX3BhcnNlKG5hbWUsIHZhbHVlKQorCisgICAgICBUaGUgbmFtZSBhbmQgdmFsdWUgYXJlIHJldHVybmVkIHVubW9kaWZpZWQuCisKKworICAgLi4gbWV0aG9kOjogaGVhZGVyX2ZldGNoX3BhcnNlKG5hbWUsIHZhbHVlKQorCisgICAgICBJZiB0aGUgdmFsdWUgY29udGFpbnMgYmluYXJ5IGRhdGEsIGl0IGlzIGNvbnZlcnRlZCBpbnRvIGEKKyAgICAgIDpjbGFzczpgfmVtYWlsLmhlYWRlci5IZWFkZXJgIG9iamVjdCB1c2luZyB0aGUgYGB1bmtub3duLThiaXRgYCBjaGFyc2V0LgorICAgICAgT3RoZXJ3aXNlIGl0IGlzIHJldHVybmVkIHVubW9kaWZpZWQuCisKKworICAgLi4gbWV0aG9kOjogZm9sZChuYW1lLCB2YWx1ZSkKKworICAgICAgSGVhZGVycyBhcmUgZm9sZGVkIHVzaW5nIHRoZSA6Y2xhc3M6YH5lbWFpbC5oZWFkZXIuSGVhZGVyYCBmb2xkaW5nCisgICAgICBhbGdvcml0aG0sIHdoaWNoIHByZXNlcnZlcyBleGlzdGluZyBsaW5lIGJyZWFrcyBpbiB0aGUgdmFsdWUsIGFuZCB3cmFwcworICAgICAgZWFjaCByZXN1bHRpbmcgbGluZSB0byB0aGUgYGBtYXhfbGluZV9sZW5ndGhgYC4gIE5vbi1BU0NJSSBiaW5hcnkgZGF0YSBhcmUKKyAgICAgIENURSBlbmNvZGVkIHVzaW5nIHRoZSBgYHVua25vd24tOGJpdGBgIGNoYXJzZXQuCisKKworICAgLi4gbWV0aG9kOjogZm9sZF9iaW5hcnkobmFtZSwgdmFsdWUpCisKKyAgICAgIEhlYWRlcnMgYXJlIGZvbGRlZCB1c2luZyB0aGUgOmNsYXNzOmB+ZW1haWwuaGVhZGVyLkhlYWRlcmAgZm9sZGluZworICAgICAgYWxnb3JpdGhtLCB3aGljaCBwcmVzZXJ2ZXMgZXhpc3RpbmcgbGluZSBicmVha3MgaW4gdGhlIHZhbHVlLCBhbmQgd3JhcHMKKyAgICAgIGVhY2ggcmVzdWx0aW5nIGxpbmUgdG8gdGhlIGBgbWF4X2xpbmVfbGVuZ3RoYGAuICBJZiBgYGN0ZV90eXBlYGAgaXMKKyAgICAgIGBgN2JpdGBgLCBub24tYXNjaWkgYmluYXJ5IGRhdGEgaXMgQ1RFIGVuY29kZWQgdXNpbmcgdGhlIGBgdW5rbm93bi04Yml0YGAKKyAgICAgIGNoYXJzZXQuICBPdGhlcndpc2UgdGhlIG9yaWdpbmFsIHNvdXJjZSBoZWFkZXIgaXMgdXNlZCwgd2l0aCBpdHMgZXhpc3RpbmcKKyAgICAgIGxpbmUgYnJlYWtzIGFuZCBhbnkgKFJGQyBpbnZhbGlkKSBiaW5hcnkgZGF0YSBpdCBtYXkgY29udGFpbi4KKworCisuLiBkYXRhOjogY29tcGF0MzIKKworICAgQW4gaW5zdGFuY2Ugb2YgOmNsYXNzOmBDb21wYXQzMmAsIHByb3ZpZGluZyAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZQorICAgYmVoYXZpb3Igb2YgdGhlIGVtYWlsIHBhY2thZ2UgaW4gUHl0aG9uIDMuMi4KKworCisuLiBydWJyaWM6OiBGb290bm90ZXMKKworLi4gWzFdIE9yaW5nYWxseSBhZGRlZCBpbiAzLjMgYXMgYSA6dGVybTpgcHJvdmlzaW9uYWwgZmVhdHVyZSA8cHJvdmlzaW9uYWwKKyAgICAgICBwYWNrYWdlPmAuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9lbWFpbC5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC5yc3QKaW5kZXggZThiYjAyYi4uYzQxODdkZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW1haWwucnN0CisrKyBiL0RvYy9saWJyYXJ5L2VtYWlsLnJzdApAQCAtMyw1MCArMywxMDQgQEAKIAogLi4gbW9kdWxlOjogZW1haWwKICAgIDpzeW5vcHNpczogUGFja2FnZSBzdXBwb3J0aW5nIHRoZSBwYXJzaW5nLCBtYW5pcHVsYXRpbmcsIGFuZCBnZW5lcmF0aW5nCi0gICAgICAgICAgICAgIGVtYWlsIG1lc3NhZ2VzLCBpbmNsdWRpbmcgTUlNRSBkb2N1bWVudHMuCi0KLS4uIG1vZHVsZWF1dGhvcjo6IEJhcnJ5IEEuIFdhcnNhdyA8YmFycnlAcHl0aG9uLm9yZz4KLS4uIHNlY3Rpb25hdXRob3I6OiBCYXJyeSBBLiBXYXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+Ci0uLiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorICAgICAgICAgICAgICBlbWFpbCBtZXNzYWdlcy4KKy4uIG1vZHVsZWF1dGhvcjo6IEJhcnJ5IEEuIFdhcnNhdyA8YmFycnlAcHl0aG9uLm9yZz4sCisgICAgICAgICAgICAgICAgICBSLiBEYXZpZCBNdXJyYXkgPHJkbXVycmF5QGJpdGRhbmNlLmNvbT4KKy4uIHNlY3Rpb25hdXRob3I6OiBSLiBEYXZpZCBNdXJyYXkgPHJkbXVycmF5QGJpdGRhbmNlLmNvbT4KIAogKipTb3VyY2UgY29kZToqKiA6c291cmNlOmBMaWIvZW1haWwvX19pbml0X18ucHlgCiAKIC0tLS0tLS0tLS0tLS0tCiAKLVRoZSA6bW9kOmBlbWFpbGAgcGFja2FnZSBpcyBhIGxpYnJhcnkgZm9yIG1hbmFnaW5nIGVtYWlsIG1lc3NhZ2VzLCBpbmNsdWRpbmcKLU1JTUUgYW5kIG90aGVyIDpyZmM6YDI4MjJgXCAtYmFzZWQgbWVzc2FnZSBkb2N1bWVudHMuICBJdCBpcyBzcGVjaWZpY2FsbHkgKm5vdCoKLWRlc2lnbmVkIHRvIGRvIGFueSBzZW5kaW5nIG9mIGVtYWlsIG1lc3NhZ2VzIHRvIFNNVFAgKDpyZmM6YDI4MjFgKSwgTk5UUCwgb3IKLW90aGVyIHNlcnZlcnM7IHRob3NlIGFyZSBmdW5jdGlvbnMgb2YgbW9kdWxlcyBzdWNoIGFzIDptb2Q6YHNtdHBsaWJgIGFuZAotOm1vZDpgbm50cGxpYmAuIFRoZSA6bW9kOmBlbWFpbGAgcGFja2FnZSBhdHRlbXB0cyB0byBiZSBhcyBSRkMtY29tcGxpYW50IGFzCi1wb3NzaWJsZSwgc3VwcG9ydGluZyBpbiBhZGRpdGlvbiB0byA6cmZjOmAyODIyYCwgc3VjaCBNSU1FLXJlbGF0ZWQgUkZDcyBhcwotOnJmYzpgMjA0NWAsIDpyZmM6YDIwNDZgLCA6cmZjOmAyMDQ3YCwgYW5kIDpyZmM6YDIyMzFgLgorVGhlIDptb2Q6YGVtYWlsYCBwYWNrYWdlIGlzIGEgbGlicmFyeSBmb3IgbWFuYWdpbmcgZW1haWwgbWVzc2FnZXMuICBJdCBpcworc3BlY2lmaWNhbGx5ICpub3QqIGRlc2lnbmVkIHRvIGRvIGFueSBzZW5kaW5nIG9mIGVtYWlsIG1lc3NhZ2VzIHRvIFNNVFAKKyg6cmZjOmAyODIxYCksIE5OVFAsIG9yIG90aGVyIHNlcnZlcnM7IHRob3NlIGFyZSBmdW5jdGlvbnMgb2YgbW9kdWxlcyBzdWNoIGFzCis6bW9kOmBzbXRwbGliYCBhbmQgOm1vZDpgbm50cGxpYmAuICBUaGUgOm1vZDpgZW1haWxgIHBhY2thZ2UgYXR0ZW1wdHMgdG8gYmUgYXMKK1JGQy1jb21wbGlhbnQgYXMgcG9zc2libGUsIHN1cHBvcnRpbmcgOnJmYzpgNTIzM2AgYW5kIDpyZmM6YDY1MzJgLCBhcyB3ZWxsIGFzCitzdWNoIE1JTUUtcmVsYXRlZCBSRkNzIGFzIDpyZmM6YDIwNDVgLCA6cmZjOmAyMDQ2YCwgOnJmYzpgMjA0N2AsIDpyZmM6YDIxODNgLAorYW5kIDpyZmM6YDIyMzFgLgogCi1UaGUgcHJpbWFyeSBkaXN0aW5ndWlzaGluZyBmZWF0dXJlIG9mIHRoZSA6bW9kOmBlbWFpbGAgcGFja2FnZSBpcyB0aGF0IGl0IHNwbGl0cwotdGhlIHBhcnNpbmcgYW5kIGdlbmVyYXRpbmcgb2YgZW1haWwgbWVzc2FnZXMgZnJvbSB0aGUgaW50ZXJuYWwgKm9iamVjdCBtb2RlbCoKLXJlcHJlc2VudGF0aW9uIG9mIGVtYWlsLiAgQXBwbGljYXRpb25zIHVzaW5nIHRoZSA6bW9kOmBlbWFpbGAgcGFja2FnZSBkZWFsCi1wcmltYXJpbHkgd2l0aCBvYmplY3RzOyB5b3UgY2FuIGFkZCBzdWItb2JqZWN0cyB0byBtZXNzYWdlcywgcmVtb3ZlIHN1Yi1vYmplY3RzCi1mcm9tIG1lc3NhZ2VzLCBjb21wbGV0ZWx5IHJlLWFycmFuZ2UgdGhlIGNvbnRlbnRzLCBldGMuICBUaGVyZSBpcyBhIHNlcGFyYXRlCi1wYXJzZXIgYW5kIGEgc2VwYXJhdGUgZ2VuZXJhdG9yIHdoaWNoIGhhbmRsZXMgdGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gZmxhdCB0ZXh0Ci10byB0aGUgb2JqZWN0IG1vZGVsLCBhbmQgdGhlbiBiYWNrIHRvIGZsYXQgdGV4dCBhZ2Fpbi4gIFRoZXJlIGFyZSBhbHNvIGhhbmR5Ci1zdWJjbGFzc2VzIGZvciBzb21lIGNvbW1vbiBNSU1FIG9iamVjdCB0eXBlcywgYW5kIGEgZmV3IG1pc2NlbGxhbmVvdXMgdXRpbGl0aWVzCi10aGF0IGhlbHAgd2l0aCBzdWNoIGNvbW1vbiB0YXNrcyBhcyBleHRyYWN0aW5nIGFuZCBwYXJzaW5nIG1lc3NhZ2UgZmllbGQgdmFsdWVzLAotY3JlYXRpbmcgUkZDLWNvbXBsaWFudCBkYXRlcywgZXRjLgorVGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIHRoZSBlbWFpbCBwYWNrYWdlIGNhbiBiZSBkaXZpZGVkIGludG8gdGhyZWUgbWFqb3IKK2NvbXBvbmVudHMsIHBsdXMgYSBmb3VydGggY29tcG9uZW50IHRoYXQgY29udHJvbHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBvdGhlcgorY29tcG9uZW50cy4KKworVGhlIGNlbnRyYWwgY29tcG9uZW50IG9mIHRoZSBwYWNrYWdlIGlzIGFuICJvYmplY3QgbW9kZWwiIHRoYXQgcmVwcmVzZW50cyBlbWFpbAorbWVzc2FnZXMuICBBbiBhcHBsaWNhdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgcGFja2FnZSBwcmltYXJpbHkgdGhyb3VnaCB0aGUKK29iamVjdCBtb2RlbCBpbnRlcmZhY2UgZGVmaW5lZCBpbiB0aGUgOm1vZDpgfmVtYWlsLm1lc3NhZ2VgIHN1Yi1tb2R1bGUuICBUaGUKK2FwcGxpY2F0aW9uIGNhbiB1c2UgdGhpcyBBUEkgdG8gYXNrIHF1ZXN0aW9ucyBhYm91dCBhbiBleGlzdGluZyBlbWFpbCwgdG8KK2NvbnN0cnVjdCBhIG5ldyBlbWFpbCwgb3IgdG8gYWRkIG9yIHJlbW92ZSBlbWFpbCBzdWJjb21wb25lbnRzIHRoYXQgdGhlbXNlbHZlcwordXNlIHRoZSBzYW1lIG9iamVjdCBtb2RlbCBpbnRlcmZhY2UuICBUaGF0IGlzLCBmb2xsb3dpbmcgdGhlIG5hdHVyZSBvZiBlbWFpbAorbWVzc2FnZXMgYW5kIHRoZWlyIE1JTUUgc3ViY29tcG9uZW50cywgdGhlIGVtYWlsIG9iamVjdCBtb2RlbCBpcyBhIHRyZWUKK3N0cnVjdHVyZSBvZiBvYmplY3RzIHRoYXQgYWxsIHByb3ZpZGUgdGhlIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlYAorQVBJLgorCitUaGUgb3RoZXIgdHdvIG1ham9yIGNvbXBvbmVudHMgb2YgdGhlIHBhY2thZ2UgYXJlIHRoZSA6bW9kOmB+ZW1haWwucGFyc2VyYCBhbmQKK3RoZSA6bW9kOmB+ZW1haWwuZ2VuZXJhdG9yYC4gIFRoZSBwYXJzZXIgdGFrZXMgdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiBhbgorZW1haWwgbWVzc2FnZSAoYSBzdHJlYW0gb2YgYnl0ZXMpIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgdHJlZSBvZgorOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgIG9iamVjdHMuICBUaGUgZ2VuZXJhdG9yIHRha2VzIGFuCis6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZWAgYW5kIHR1cm5zIGl0IGJhY2sgaW50byBhIHNlcmlhbGl6ZWQgYnl0ZQorc3RyZWFtLiAgKFRoZSBwYXJzZXIgYW5kIGdlbmVyYXRvciBhbHNvIGhhbmRsZSBzdHJlYW1zIG9mIHRleHQgY2hhcmFjdGVycywgYnV0Cit0aGlzIHVzYWdlIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IGlzIHRvbyBlYXN5IHRvIGVuZCB1cCB3aXRoIG1lc3NhZ2VzIHRoYXQgYXJlCitub3QgdmFsaWQgaW4gb25lIHdheSBvciBhbm90aGVyLikKKworVGhlIGNvbnRyb2wgY29tcG9uZW50IGlzIHRoZSA6bW9kOmB+ZW1haWwucG9saWN5YCBtb2R1bGUuICBFdmVyeQorOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5FbWFpbE1lc3NhZ2VgLCBldmVyeSA6bW9kOmB+ZW1haWwuZ2VuZXJhdG9yYCwgYW5kIGV2ZXJ5Cis6bW9kOmB+ZW1haWwucGFyc2VyYCBoYXMgYW4gYXNzb2NpYXRlZCA6bW9kOmB+ZW1haWwucG9saWN5YCBvYmplY3QgdGhhdAorY29udHJvbHMgaXRzIGJlaGF2aW9yLiAgVXN1YWxseSBhbiBhcHBsaWNhdGlvbiBvbmx5IG5lZWRzIHRvIHNwZWNpZnkgdGhlIHBvbGljeQord2hlbiBhbiA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLkVtYWlsTWVzc2FnZWAgaXMgY3JlYXRlZCwgZWl0aGVyIGJ5IGRpcmVjdGx5CitpbnN0YW50aWF0aW5nIGFuIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlYCAgdG8gY3JlYXRlIGEgbmV3IGVtYWlsLAorb3IgYnkgcGFyc2luZyBhbiBpbnB1dCBzdHJlYW0gdXNpbmcgYSA6bW9kOmB+ZW1haWwucGFyc2VyYC4gIEJ1dCB0aGUgcG9saWN5IGNhbgorYmUgY2hhbmdlZCB3aGVuIHRoZSBtZXNzYWdlIGlzIHNlcmlhbGl6ZWQgdXNpbmcgYSA6bW9kOmB+ZW1haWwuZ2VuZXJhdG9yYC4KK1RoaXMgYWxsb3dzLCBmb3IgZXhhbXBsZSwgYSBnZW5lcmljIGVtYWlsIG1lc3NhZ2UgdG8gYmUgcGFyc2VkIGZyb20gZGlzaywgYnV0Cit0byBzZXJpYWxpemUgaXQgdXNpbmcgc3RhbmRhcmQgU01UUCBzZXR0aW5ncyB3aGVuIHNlbmRpbmcgaXQgdG8gYW4gZW1haWwKK3NlcnZlci4KKworVGhlIGVtYWlsIHBhY2thZ2UgZG9lcyBpdHMgYmVzdCB0byBoaWRlIHRoZSBkZXRhaWxzIG9mIHRoZSB2YXJpb3VzIGdvdmVybmluZworUkZDcyBmcm9tIHRoZSBhcHBsaWNhdGlvbi4gIENvbmNlcHR1YWxseSB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGJlIGFibGUgdG8KK3RyZWF0IHRoZSBlbWFpbCBtZXNzYWdlIGFzIGEgc3RydWN0dXJlZCB0cmVlIG9mIHVuaWNvZGUgdGV4dCBhbmQgYmluYXJ5CithdHRhY2htZW50cywgd2l0aG91dCBoYXZpbmcgdG8gd29ycnkgYWJvdXQgaG93IHRoZXNlIGFyZSByZXByZXNlbnRlZCB3aGVuCitzZXJpYWxpemVkLiAgSW4gcHJhY3RpY2UsIGhvd2V2ZXIsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byBiZSBhd2FyZSBvZiBhdAorbGVhc3Qgc29tZSBvZiB0aGUgcnVsZXMgZ292ZXJuaW5nIE1JTUUgbWVzc2FnZXMgYW5kIHRoZWlyIHN0cnVjdHVyZSwKK3NwZWNpZmljYWxseSB0aGUgbmFtZXMgYW5kIG5hdHVyZSBvZiB0aGUgTUlNRSAiY29udGVudCB0eXBlcyIgYW5kIGhvdyB0aGV5CitpZGVudGlmeSBtdWx0aXBhcnQgZG9jdW1lbnRzLiAgRm9yIHRoZSBtb3N0IHBhcnQgdGhpcyBrbm93bGVkZ2Ugc2hvdWxkIG9ubHkgYmUKK3JlcXVpcmVkIGZvciBtb3JlIGNvbXBsZXggYXBwbGljYXRpb25zLCBhbmQgZXZlbiB0aGVuIGl0IHNob3VsZCBvbmx5IGJlIHRoZQoraGlnaCBsZXZlbCBzdHJ1Y3R1cmUgaW4gcXVlc3Rpb24sIGFuZCBub3QgdGhlIGRldGFpbHMgb2YgaG93IHRob3NlIHN0cnVjdHVyZXMKK2FyZSByZXByZXNlbnRlZC4gIFNpbmNlIE1JTUUgY29udGVudCB0eXBlcyBhcmUgdXNlZCB3aWRlbHkgaW4gbW9kZXJuIGludGVybmV0Citzb2Z0d2FyZSAobm90IGp1c3QgZW1haWwpLCB0aGlzIHdpbGwgYmUgYSBmYW1pbGlhciBjb25jZXB0IHRvIG1hbnkgcHJvZ3JhbW1lcnMuCiAKIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGVzY3JpYmUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIDptb2Q6YGVtYWlsYCBwYWNrYWdlLgotVGhlIG9yZGVyaW5nIGZvbGxvd3MgYSBwcm9ncmVzc2lvbiB0aGF0IHNob3VsZCBiZSBjb21tb24gaW4gYXBwbGljYXRpb25zOiBhbgotZW1haWwgbWVzc2FnZSBpcyByZWFkIGFzIGZsYXQgdGV4dCBmcm9tIGEgZmlsZSBvciBvdGhlciBzb3VyY2UsIHRoZSB0ZXh0IGlzCi1wYXJzZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0IHN0cnVjdHVyZSBvZiB0aGUgZW1haWwgbWVzc2FnZSwgdGhpcyBzdHJ1Y3R1cmUgaXMKLW1hbmlwdWxhdGVkLCBhbmQgZmluYWxseSwgdGhlIG9iamVjdCB0cmVlIGlzIHJlbmRlcmVkIGJhY2sgaW50byBmbGF0IHRleHQuCitXZSBzdGFydCB3aXRoIHRoZSA6bW9kOmB+ZW1haWwubWVzc2FnZWAgb2JqZWN0IG1vZGVsLCB3aGljaCBpcyB0aGUgcHJpbWFyeQoraW50ZXJmYWNlIGFuIGFwcGxpY2F0aW9uIHdpbGwgdXNlLCBhbmQgZm9sbG93IHRoYXQgd2l0aCB0aGUKKzptb2Q6YH5lbWFpbC5wYXJzZXJgIGFuZCA6bW9kOmB+ZW1haWwuZ2VuZXJhdG9yYCBjb21wb25lbnRzLiAgVGhlbiB3ZSBjb3ZlciB0aGUKKzptb2Q6YH5lbWFpbC5wb2xpY3lgIGNvbnRyb2xzLCB3aGljaCBjb21wbGV0ZXMgdGhlIHRyZWF0bWVudCBvZiB0aGUgbWFpbgorY29tcG9uZW50cyBvZiB0aGUgbGlicmFyeS4KIAotSXQgaXMgcGVyZmVjdGx5IGZlYXNpYmxlIHRvIGNyZWF0ZSB0aGUgb2JqZWN0IHN0cnVjdHVyZSBvdXQgb2Ygd2hvbGUgY2xvdGggLS0tCi1pLmUuIGNvbXBsZXRlbHkgZnJvbSBzY3JhdGNoLiAgRnJvbSB0aGVyZSwgYSBzaW1pbGFyIHByb2dyZXNzaW9uIGNhbiBiZSB0YWtlbiBhcwotYWJvdmUuCitUaGUgbmV4dCB0aHJlZSBzZWN0aW9ucyBjb3ZlciB0aGUgZXhjZXB0aW9ucyB0aGUgcGFja2FnZSBtYXkgcmFpc2UgYW5kIHRoZQorZGVmZWN0cyAobm9uLWNvbXBsaWFuY2Ugd2l0aCB0aGUgUkZDcykgdGhhdCB0aGUgOm1vZDpgfmVtYWlsLnBhcnNlcmAgbWF5CitkZXRlY3QuICBUaGVuIHdlIGNvdmVyIHRoZSA6bW9kOmB+ZW1haWwuaGVhZGVycmVnaXN0cnlgIGFuZCB0aGUKKzptb2Q6YH5lbWFpbC5jb250ZW50bWFuYWdlcmAgc3ViLWNvbXBvbmVudHMsIHdoaWNoIHByb3ZpZGUgdG9vbHMgZm9yIGRvaW5nIG1vcmUKK2RldGFpbGVkIG1hbmlwdWxhdGlvbiBvZiBoZWFkZXJzIGFuZCBwYXlsb2FkcywgcmVzcGVjdGl2ZWx5LiAgQm90aCBvZiB0aGVzZQorY29tcG9uZW50cyBjb250YWluIGZlYXR1cmVzIHJlbGV2YW50IHRvIGNvbnN1bWluZyBhbmQgcHJvZHVjaW5nIG5vbi10cml2aWFsCittZXNzYWdlcywgYnV0IGFsc28gZG9jdW1lbnQgdGhlaXIgZXh0ZW5zaWJpbGl0eSBBUElzLCB3aGljaCB3aWxsIGJlIG9mIGludGVyZXN0Cit0byBhZHZhbmNlZCBhcHBsaWNhdGlvbnMuCiAKLUFsc28gaW5jbHVkZWQgYXJlIGRldGFpbGVkIHNwZWNpZmljYXRpb25zIG9mIGFsbCB0aGUgY2xhc3NlcyBhbmQgbW9kdWxlcyB0aGF0Ci10aGUgOm1vZDpgZW1haWxgIHBhY2thZ2UgcHJvdmlkZXMsIHRoZSBleGNlcHRpb24gY2xhc3NlcyB5b3UgbWlnaHQgZW5jb3VudGVyCi13aGlsZSB1c2luZyB0aGUgOm1vZDpgZW1haWxgIHBhY2thZ2UsIHNvbWUgYXV4aWxpYXJ5IHV0aWxpdGllcywgYW5kIGEgZmV3Ci1leGFtcGxlcy4gIEZvciB1c2VycyBvZiB0aGUgb2xkZXIgOm1vZDpgbWltZWxpYmAgcGFja2FnZSwgb3IgcHJldmlvdXMgdmVyc2lvbnMKLW9mIHRoZSA6bW9kOmBlbWFpbGAgcGFja2FnZSwgYSBzZWN0aW9uIG9uIGRpZmZlcmVuY2VzIGFuZCBwb3J0aW5nIGlzIHByb3ZpZGVkLgorRm9sbG93aW5nIHRob3NlIGlzIGEgc2V0IG9mIGV4YW1wbGVzIG9mIHVzaW5nIHRoZSBmdW5kYW1lbnRhbCBwYXJ0cyBvZiB0aGUgQVBJcworY292ZXJlZCBpbiB0aGUgcHJlY2VkaW5nIHNlY3Rpb25zLgorCitUaGUgZm9yZ29pbmcgcmVwcmVzZW50IHRoZSBtb2Rlcm4gKHVuaWNvZGUgZnJpZW5kbHkpIEFQSSBvZiB0aGUgZW1haWwgcGFja2FnZS4KK1RoZSByZW1haW5pbmcgc2VjdGlvbnMsIHN0YXJ0aW5nIHdpdGggdGhlIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAKK2NsYXNzLCBjb3ZlciB0aGUgbGVnYWN5IDpkYXRhOmB+ZW1haWwucG9saWN5LmNvbXBhdDMyYCBBUEkgdGhhdCBkZWFscyBtdWNoIG1vcmUKK2RpcmVjdGx5IHdpdGggdGhlIGRldGFpbHMgb2YgaG93IGVtYWlsIG1lc3NhZ2VzIGFyZSByZXByZXNlbnRlZC4gIFRoZQorOmRhdGE6YH5lbWFpbC5wb2xpY3kuY29tcGF0MzJgIEFQSSBkb2VzICpub3QqIGhpZGUgdGhlIGRldGFpbHMgb2YgdGhlIFJGQ3MgZnJvbQordGhlIGFwcGxpY2F0aW9uLCBidXQgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gb3BlcmF0ZSBhdCB0aGF0IGxldmVsLCB0aGV5CitjYW4gYmUgdXNlZnVsIHRvb2xzLiAgVGhpcyBkb2N1bWVudGF0aW9uIGlzIGFsc28gcmVsZXZhbnQgZm9yIGFwcGxpY2F0aW9ucyB0aGF0CithcmUgc3RpbGwgdXNpbmcgdGhlIDptb2Q6YH5lbWFpbC5wb2xpY3kuY29tcGF0MzJgIEFQSSBmb3IgYmFja3dhcmQKK2NvbXBhdGliaWxpdHkgcmVhc29ucy4KKworLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgIERvY3MgcmVvcmdhbml6ZWQgYW5kIHJld3JpdHRlbiB0byBwcm9tb3RlIHRoZSBuZXcKKyAgIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuRW1haWxNZXNzYWdlYC86Y2xhc3M6YH5lbWFpbC5wb2xpY3kuRW1haWxQb2xpY3lgCisgICBBUEkuCiAKIENvbnRlbnRzIG9mIHRoZSA6bW9kOmBlbWFpbGAgcGFja2FnZSBkb2N1bWVudGF0aW9uOgogCkBAIC01NiwzMzUgKzExMCw0MyBAQAogICAgZW1haWwucGFyc2VyLnJzdAogICAgZW1haWwuZ2VuZXJhdG9yLnJzdAogICAgZW1haWwucG9saWN5LnJzdAorCisgICBlbWFpbC5lcnJvcnMucnN0CiAgICBlbWFpbC5oZWFkZXJyZWdpc3RyeS5yc3QKICAgIGVtYWlsLmNvbnRlbnRtYW5hZ2VyLnJzdAorCisgICBlbWFpbC5leGFtcGxlcy5yc3QKKworTGVnYWN5IEFQSToKKworLi4gdG9jdHJlZTo6CisKKyAgIGVtYWlsLmNvbXBhdDMyLW1lc3NhZ2UucnN0CiAgICBlbWFpbC5taW1lLnJzdAogICAgZW1haWwuaGVhZGVyLnJzdAogICAgZW1haWwuY2hhcnNldC5yc3QKICAgIGVtYWlsLmVuY29kZXJzLnJzdAotICAgZW1haWwuZXJyb3JzLnJzdAogICAgZW1haWwudXRpbC5yc3QKICAgIGVtYWlsLml0ZXJhdG9ycy5yc3QKLSAgIGVtYWlsLWV4YW1wbGVzLnJzdAogCiAKIC4uIHNlZWFsc286OgogCiAgICBNb2R1bGUgOm1vZDpgc210cGxpYmAKLSAgICAgIFNNVFAgcHJvdG9jb2wgY2xpZW50CisgICAgICBTTVRQIChTaW1wbGUgTWFpbCBUcmFuc3BvcnQgUHJvdGNvbCkgY2xpZW50CisKKyAgIE1vZHVsZSA6bW9kOmBwb3BsaWJgCisgICAgICBQT1AgKFBvc3QgT2ZmaWNlIFByb3RvY29sKSBjbGllbnQKKworICAgTW9kdWxlIDptb2Q6YGltYXBsaWJgCisgICAgICBJTUFQIChJbnRlcm5ldCBNZXNzYWdlIEFjY2VzcyBQcm90b2NvbCkgY2xpZW50CiAKICAgIE1vZHVsZSA6bW9kOmBubnRwbGliYAotICAgICAgTk5UUCBwcm90b2NvbCBjbGllbnQKKyAgICAgIE5OVFAgKE5ldCBOZXdzIFRyYW5zcG9ydCBQcm90b2NvbCkgY2xpZW50CiAKKyAgIE1vZHVsZSA6bW9kOmBtYWlsYm94YAorICAgICAgVG9vbHMgZm9yIGNyZWF0aW5nLCByZWFkaW5nLCBhbmQgbWFuYWdpbmcgY29sbGVjdGlvbnMgb2YgbWVzc2FnZXMgb24gZGlzaworICAgICAgdXNpbmcgYSB2YXJpZXR5IHN0YW5kYXJkIGZvcm1hdHMuCiAKLS4uIF9lbWFpbC1wa2ctaGlzdG9yeToKLQotUGFja2FnZSBIaXN0b3J5Ci0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIHJlbGVhc2UgaGlzdG9yeSBvZiB0aGUgZW1haWwgcGFja2FnZSwgY29ycmVzcG9uZGluZyB0bwotdGhlIHZlcnNpb24gb2YgUHl0aG9uIHRoYXQgdGhlIHBhY2thZ2Ugd2FzIHJlbGVhc2VkIHdpdGguICBGb3IgcHVycG9zZXMgb2YgdGhpcwotZG9jdW1lbnQsIHdoZW4geW91IHNlZSBhIG5vdGUgYWJvdXQgY2hhbmdlIG9yIGFkZGVkIHZlcnNpb25zLCB0aGVzZSByZWZlciB0byB0aGUKLVB5dGhvbiB2ZXJzaW9uIHRoZSBjaGFuZ2Ugd2FzIG1hZGUgaW4sICpub3QqIHRoZSBlbWFpbCBwYWNrYWdlIHZlcnNpb24uICBUaGlzCi10YWJsZSBhbHNvIGRlc2NyaWJlcyB0aGUgUHl0aG9uIGNvbXBhdGliaWxpdHkgb2YgZWFjaCB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLgotCi0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgZW1haWwgdmVyc2lvbiB8IGRpc3RyaWJ1dGVkIHdpdGggICAgICAgICAgICAgfCBjb21wYXRpYmxlIHdpdGggICAgICAgfAotKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rCi18IDpjb25zdDpgMS54YCAgfCBQeXRob24gMi4yLjAgdG8gUHl0aG9uIDIuMi4xIHwgKm5vIGxvbmdlciBzdXBwb3J0ZWQqIHwKLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCA6Y29uc3Q6YDIuNWAgIHwgUHl0aG9uIDIuMi4yKyBhbmQgUHl0aG9uIDIuMyB8IFB5dGhvbiAyLjEgdG8gMi41ICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgOmNvbnN0OmAzLjBgICB8IFB5dGhvbiAyLjQgYW5kIFB5dGhvbiAyLjUgICAgfCBQeXRob24gMi4zIHRvIDIuNiAgICAgfAotKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IDpjb25zdDpgNC4wYCAgfCBQeXRob24gMi41IHRvIFB5dGhvbiAyLjcgICAgIHwgUHl0aG9uIDIuMyB0byAyLjcgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCA6Y29uc3Q6YDUuMGAgIHwgUHl0aG9uIDMuMCBhbmQgUHl0aG9uIDMuMSAgICB8IFB5dGhvbiAzLjAgdG8gMy4yICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgOmNvbnN0OmA1LjFgICB8IFB5dGhvbiAzLjIgICAgICAgICAgICAgICAgICAgfCBQeXRob24gMy4yICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0KLUFmdGVyIFZlcnNpb24gNS4xIChQeXRob24gMy4yKSwgdGhlIGVtYWlsIHBhY2thZ2Ugbm8gbG9uZ2VyIGhhcyBhIHZlcnNpb24gdGhhdAotaXMgc2VwYXJhdGUgZnJvbSB0aGUgUHl0aG9uIHZlcnNpb24uICAoU2VlIHRoZSA6cmVmOmB3aGF0c25ldy1pbmRleGAgZG9jdW1lbnRzCi1mb3IgdGhlIHJlc3BlY3RpdmUgUHl0aG9uIHZlcnNpb25zIGZvciBkZXRhaWxzIG9uIGNoYW5nZXMuKQotCi1IZXJlIGFyZSB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiA6bW9kOmBlbWFpbGAgdmVyc2lvbiA1LjEgYW5kCi12ZXJzaW9uIDUuMDoKLQotKiBJdCBpcyBvbmNlIGFnYWluIHBvc3NpYmxlIHRvIHBhcnNlIG1lc3NhZ2VzIGNvbnRhaW5pbmcgbm9uLUFTQ0lJIGJ5dGVzLAotICBhbmQgdG8gcmVwcm9kdWNlIHN1Y2ggbWVzc2FnZXMgaWYgdGhlIGRhdGEgY29udGFpbmluZyB0aGUgbm9uLUFTQ0lJCi0gIGJ5dGVzIGlzIG5vdCBtb2RpZmllZC4KLQotKiBOZXcgZnVuY3Rpb25zIDpmdW5jOmBtZXNzYWdlX2Zyb21fYnl0ZXNgIGFuZCA6ZnVuYzpgbWVzc2FnZV9mcm9tX2JpbmFyeV9maWxlYCwKLSAgYW5kIG5ldyBjbGFzc2VzIDpjbGFzczpgfmVtYWlsLnBhcnNlci5CeXRlc0ZlZWRQYXJzZXJgIGFuZAotICA6Y2xhc3M6YH5lbWFpbC5wYXJzZXIuQnl0ZXNQYXJzZXJgIGFsbG93IGJpbmFyeSBtZXNzYWdlIGRhdGEgdG8gYmUgcGFyc2VkCi0gIGludG8gbW9kZWwgb2JqZWN0cy4KLQotKiBHaXZlbiBieXRlcyBpbnB1dCB0byB0aGUgbW9kZWwsIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYAotICB3aWxsIGJ5IGRlZmF1bHQgZGVjb2RlIGEgbWVzc2FnZSBib2R5IHRoYXQgaGFzIGEKLSAgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgIG9mIGBgOGJpdGBgIHVzaW5nIHRoZSBjaGFyc2V0Ci0gIHNwZWNpZmllZCBpbiB0aGUgTUlNRSBoZWFkZXJzIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0KLSogR2l2ZW4gYnl0ZXMgaW5wdXQgdG8gdGhlIG1vZGVsLCA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuR2VuZXJhdG9yYCB3aWxsCi0gIGNvbnZlcnQgbWVzc2FnZSBib2RpZXMgdGhhdCBoYXZlIGEgOm1haWxoZWFkZXI6YENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdgIG9mCi0gIDhiaXQgdG8gaW5zdGVhZCBoYXZlIGEgN2JpdCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nLgotCi0qIE5ldyBjbGFzcyA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuQnl0ZXNHZW5lcmF0b3JgIHByb2R1Y2VzIGJ5dGVzCi0gIGFzIG91dHB1dCwgcHJlc2VydmluZyBhbnkgdW5jaGFuZ2VkIG5vbi1BU0NJSSBkYXRhIHRoYXQgd2FzCi0gIHByZXNlbnQgaW4gdGhlIGlucHV0IHVzZWQgdG8gYnVpbGQgdGhlIG1vZGVsLCBpbmNsdWRpbmcgbWVzc2FnZSBib2RpZXMKLSAgd2l0aCBhIDptYWlsaGVhZGVyOmBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nYCBvZiA4Yml0LgotCi1IZXJlIGFyZSB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiA6bW9kOmBlbWFpbGAgdmVyc2lvbiA1LjAgYW5kIHZlcnNpb24gNDoKLQotKiBBbGwgb3BlcmF0aW9ucyBhcmUgb24gdW5pY29kZSBzdHJpbmdzLiAgVGV4dCBpbnB1dHMgbXVzdCBiZSBzdHJpbmdzLAotICB0ZXh0IG91dHB1dHMgYXJlIHN0cmluZ3MuICBPdXRwdXRzIGFyZSBsaW1pdGVkIHRvIHRoZSBBU0NJSSBjaGFyYWN0ZXIKLSAgc2V0IGFuZCBzbyBjYW4gYmUgZW5jb2RlZCB0byBBU0NJSSBmb3IgdHJhbnNtaXNzaW9uLiAgSW5wdXRzIGFyZSBhbHNvCi0gIGxpbWl0ZWQgdG8gQVNDSUk7IHRoaXMgaXMgYW4gYWNrbm93bGVkZ2VkIGxpbWl0YXRpb24gb2YgZW1haWwgNS4wIGFuZAotICBtZWFucyBpdCBjYW4gb25seSBiZSB1c2VkIHRvIHBhcnNlIGVtYWlsIHRoYXQgaXMgN2JpdCBjbGVhbi4KLQotSGVyZSBhcmUgdGhlIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gOm1vZDpgZW1haWxgIHZlcnNpb24gNCBhbmQgdmVyc2lvbiAzOgotCi0qIEFsbCBtb2R1bGVzIGhhdmUgYmVlbiByZW5hbWVkIGFjY29yZGluZyB0byA6cGVwOmA4YCBzdGFuZGFyZHMuICBGb3IgZXhhbXBsZSwKLSAgdGhlIHZlcnNpb24gMyBtb2R1bGUgOm1vZDpgZW1haWwuTWVzc2FnZWAgd2FzIHJlbmFtZWQgdG8gOm1vZDpgZW1haWwubWVzc2FnZWAgaW4KLSAgdmVyc2lvbiA0LgotCi0qIEEgbmV3IHN1YnBhY2thZ2UgOm1vZDpgZW1haWwubWltZWAgd2FzIGFkZGVkIGFuZCBhbGwgdGhlIHZlcnNpb24gMwotICA6bW9kOmBlbWFpbC5NSU1FXCpgIG1vZHVsZXMgd2VyZSByZW5hbWVkIGFuZCBzaXR1YXRlZCBpbnRvIHRoZSA6bW9kOmBlbWFpbC5taW1lYAotICBzdWJwYWNrYWdlLiAgRm9yIGV4YW1wbGUsIHRoZSB2ZXJzaW9uIDMgbW9kdWxlIDptb2Q6YGVtYWlsLk1JTUVUZXh0YCB3YXMgcmVuYW1lZAotICB0byA6bW9kOmBlbWFpbC5taW1lLnRleHRgLgotCi0gICpOb3RlIHRoYXQgdGhlIHZlcnNpb24gMyBuYW1lcyB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgdW50aWwgUHl0aG9uIDIuNiouCi0KLSogVGhlIDptb2Q6YGVtYWlsLm1pbWUuYXBwbGljYXRpb25gIG1vZHVsZSB3YXMgYWRkZWQsIHdoaWNoIGNvbnRhaW5zIHRoZQotICA6Y2xhc3M6YH5lbWFpbC5taW1lLmFwcGxpY2F0aW9uLk1JTUVBcHBsaWNhdGlvbmAgY2xhc3MuCi0KLSogTWV0aG9kcyB0aGF0IHdlcmUgZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDMgaGF2ZSBiZWVuIHJlbW92ZWQuICBUaGVzZSBpbmNsdWRlCi0gIDptZXRoOmBHZW5lcmF0b3IuX19jYWxsX19gLCA6bWV0aDpgTWVzc2FnZS5nZXRfdHlwZWAsCi0gIDptZXRoOmBNZXNzYWdlLmdldF9tYWluX3R5cGVgLCA6bWV0aDpgTWVzc2FnZS5nZXRfc3VidHlwZWAuCi0KLSogRml4ZXMgaGF2ZSBiZWVuIGFkZGVkIGZvciA6cmZjOmAyMjMxYCBzdXBwb3J0IHdoaWNoIGNhbiBjaGFuZ2Ugc29tZSBvZiB0aGUKLSAgcmV0dXJuIHR5cGVzIGZvciA6ZnVuYzpgTWVzc2FnZS5nZXRfcGFyYW0gPGVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfcGFyYW0+YAotICBhbmQgZnJpZW5kcy4gIFVuZGVyIHNvbWUKLSAgY2lyY3Vtc3RhbmNlcywgdmFsdWVzIHdoaWNoIHVzZWQgdG8gcmV0dXJuIGEgMy10dXBsZSBub3cgcmV0dXJuIHNpbXBsZSBzdHJpbmdzCi0gIChzcGVjaWZpY2FsbHksIGlmIGFsbCBleHRlbmRlZCBwYXJhbWV0ZXIgc2VnbWVudHMgd2VyZSB1bmVuY29kZWQsIHRoZXJlIGlzIG5vCi0gIGxhbmd1YWdlIGFuZCBjaGFyc2V0IGRlc2lnbmF0aW9uIGV4cGVjdGVkLCBzbyB0aGUgcmV0dXJuIHR5cGUgaXMgbm93IGEgc2ltcGxlCi0gIHN0cmluZykuICBBbHNvLCAlLWRlY29kaW5nIHVzZWQgdG8gYmUgZG9uZSBmb3IgYm90aCBlbmNvZGVkIGFuZCB1bmVuY29kZWQKLSAgc2VnbWVudHM7IHRoaXMgZGVjb2RpbmcgaXMgbm93IGRvbmUgb25seSBmb3IgZW5jb2RlZCBzZWdtZW50cy4KLQotSGVyZSBhcmUgdGhlIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gOm1vZDpgZW1haWxgIHZlcnNpb24gMyBhbmQgdmVyc2lvbiAyOgotCi0qIFRoZSA6Y2xhc3M6YH5lbWFpbC5wYXJzZXIuRmVlZFBhcnNlcmAgY2xhc3Mgd2FzIGludHJvZHVjZWQsIGFuZCB0aGUKLSAgOmNsYXNzOmB+ZW1haWwucGFyc2VyLlBhcnNlcmAgY2xhc3Mgd2FzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZQotICA6Y2xhc3M6YH5lbWFpbC5wYXJzZXIuRmVlZFBhcnNlcmAuICBBbGwgcGFyc2luZyB0aGVyZWZvcmUgaXMKLSAgbm9uLXN0cmljdCwgYW5kIHBhcnNpbmcgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgbmV2ZXIgdG8gcmFpc2UgYW4gZXhjZXB0aW9uLgotICBQcm9ibGVtcyBmb3VuZCB3aGlsZSBwYXJzaW5nIG1lc3NhZ2VzIGFyZSBzdG9yZWQgaW4gdGhlIG1lc3NhZ2UncyAqZGVmZWN0KgotICBhdHRyaWJ1dGUuCi0KLSogQWxsIGFzcGVjdHMgb2YgdGhlIEFQSSB3aGljaCByYWlzZWQgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYFwgcyBpbiB2ZXJzaW9uIDIKLSAgaGF2ZSBiZWVuIHJlbW92ZWQuICBUaGVzZSBpbmNsdWRlIHRoZSAqX2VuY29kZXIqIGFyZ3VtZW50IHRvIHRoZQotICA6Y2xhc3M6YH5lbWFpbC5taW1lLnRleHQuTUlNRVRleHRgIGNvbnN0cnVjdG9yLCB0aGUKLSAgOm1ldGg6YE1lc3NhZ2UuYWRkX3BheWxvYWRgIG1ldGhvZCwgdGhlIDpmdW5jOmBVdGlscy5kdW1wX2FkZHJlc3NfcGFpcmAKLSAgZnVuY3Rpb24sIGFuZCB0aGUgZnVuY3Rpb25zIDpmdW5jOmBVdGlscy5kZWNvZGVgIGFuZCA6ZnVuYzpgVXRpbHMuZW5jb2RlYC4KLQotKiBOZXcgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYFwgcyBoYXZlIGJlZW4gYWRkZWQgdG86Ci0gIDptZXRoOmBHZW5lcmF0b3IuX19jYWxsX19gLCA6bWV0aDpgTWVzc2FnZS5nZXRfdHlwZWAsCi0gIDptZXRoOmBNZXNzYWdlLmdldF9tYWluX3R5cGVgLCA6bWV0aDpgTWVzc2FnZS5nZXRfc3VidHlwZWAsIGFuZCB0aGUgKnN0cmljdCoKLSAgYXJndW1lbnQgdG8gdGhlIDpjbGFzczpgfmVtYWlsLnBhcnNlci5QYXJzZXJgIGNsYXNzLiAgVGhlc2UgYXJlIGV4cGVjdGVkIHRvCi0gIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLgotCi0qIFN1cHBvcnQgZm9yIFB5dGhvbnMgZWFybGllciB0aGFuIDIuMyBoYXMgYmVlbiByZW1vdmVkLgotCi1IZXJlIGFyZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiA6bW9kOmBlbWFpbGAgdmVyc2lvbiAyIGFuZCB2ZXJzaW9uIDE6Ci0KLSogVGhlIDptb2Q6YGVtYWlsLkhlYWRlcmAgYW5kIDptb2Q6YGVtYWlsLkNoYXJzZXRgIG1vZHVsZXMgaGF2ZSBiZWVuIGFkZGVkLgotCi0qIFRoZSBwaWNrbGUgZm9ybWF0IGZvciA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGluc3RhbmNlcyBoYXMgY2hhbmdlZC4KLSAgU2luY2UgdGhpcyB3YXMgbmV2ZXIgKGFuZCBzdGlsbCBpc24ndCkgZm9ybWFsbHkgZGVmaW5lZCwgdGhpcyBpc24ndAotICBjb25zaWRlcmVkIGEgYmFja3dhcmQgaW5jb21wYXRpYmlsaXR5LiAgSG93ZXZlciBpZiB5b3VyIGFwcGxpY2F0aW9uIHBpY2tsZXMKLSAgYW5kIHVucGlja2xlcyA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGluc3RhbmNlcywgYmUgYXdhcmUgdGhhdCBpbgotICA6bW9kOmBlbWFpbGAgdmVyc2lvbiAyLCA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGluc3RhbmNlcyBub3cgaGF2ZQotICBwcml2YXRlIHZhcmlhYmxlcyAqX2NoYXJzZXQqIGFuZCAqX2RlZmF1bHRfdHlwZSouCi0KLSogU2V2ZXJhbCBtZXRob2RzIGluIHRoZSA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGNsYXNzIGhhdmUgYmVlbgotICBkZXByZWNhdGVkLCBvciB0aGVpciBzaWduYXR1cmVzIGNoYW5nZWQuICBBbHNvLCBtYW55IG5ldyBtZXRob2RzIGhhdmUgYmVlbgotICBhZGRlZC4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgY2xhc3MKLSAgZm9yIGRldGFpbHMuICBUaGUgY2hhbmdlcyBzaG91bGQgYmUgY29tcGxldGVseSBiYWNrd2FyZCBjb21wYXRpYmxlLgotCi0qIFRoZSBvYmplY3Qgc3RydWN0dXJlIGhhcyBjaGFuZ2VkIGluIHRoZSBmYWNlIG9mIDptaW1ldHlwZTpgbWVzc2FnZS9yZmM4MjJgCi0gIGNvbnRlbnQgdHlwZXMuICBJbiA6bW9kOmBlbWFpbGAgdmVyc2lvbiAxLCBzdWNoIGEgdHlwZSB3b3VsZCBiZSByZXByZXNlbnRlZAotICBieSBhIHNjYWxhciBwYXlsb2FkLCBpLmUuIHRoZSBjb250YWluZXIgbWVzc2FnZSdzCi0gIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmlzX211bHRpcGFydGAgcmV0dXJuZWQgZmFsc2UsCi0gIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYCB3YXMgbm90IGEgbGlzdCBvYmplY3QsIGJ1dCBhCi0gIHNpbmdsZSA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGluc3RhbmNlLgotCi0gIFRoaXMgc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgcGFja2FnZSwgc28gdGhlIG9iamVjdAotICByZXByZXNlbnRhdGlvbiBmb3IgOm1pbWV0eXBlOmBtZXNzYWdlL3JmYzgyMmAgY29udGVudCB0eXBlcyB3YXMgY2hhbmdlZC4gIEluCi0gIDptb2Q6YGVtYWlsYCB2ZXJzaW9uIDIsIHRoZSBjb250YWluZXIgKmRvZXMqIHJldHVybiBgYFRydWVgYCBmcm9tCi0gIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmlzX211bHRpcGFydGAsIGFuZAotICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfcGF5bG9hZGAgcmV0dXJucyBhIGxpc3QgY29udGFpbmluZyBhIHNpbmdsZQotICA6Y2xhc3M6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2VgIGl0ZW0uCi0KLSAgTm90ZSB0aGF0IHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBjb3VsZCBub3QgYmUKLSAgY29tcGxldGVseSBtYWludGFpbmVkLiAgSG93ZXZlciwgaWYgeW91J3JlIGFscmVhZHkgdGVzdGluZyB0aGUgcmV0dXJuIHR5cGUgb2YKLSAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X3BheWxvYWRgLCB5b3Ugc2hvdWxkIGJlIGZpbmUuICBZb3UganVzdCBuZWVkCi0gIHRvIG1ha2Ugc3VyZSB5b3VyIGNvZGUgZG9lc24ndCBkbyBhIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLnNldF9wYXlsb2FkYAotICB3aXRoIGEgOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBpbnN0YW5jZSBvbiBhIGNvbnRhaW5lciB3aXRoIGEgY29udGVudAotICB0eXBlIG9mIDptaW1ldHlwZTpgbWVzc2FnZS9yZmM4MjJgLgotCi0qIFRoZSA6Y2xhc3M6YH5lbWFpbC5wYXJzZXIuUGFyc2VyYCBjb25zdHJ1Y3RvcidzICpzdHJpY3QqIGFyZ3VtZW50IHdhcyBhZGRlZCwKLSAgYW5kIGl0cyA6bWV0aDpgfmVtYWlsLnBhcnNlci5QYXJzZXIucGFyc2VgIGFuZAotICA6bWV0aDpgfmVtYWlsLnBhcnNlci5QYXJzZXIucGFyc2VzdHJgIG1ldGhvZHMgZ3JldyBhICpoZWFkZXJzb25seSogYXJndW1lbnQuCi0gIFRoZSAqc3RyaWN0KiBmbGFnIHdhcyBhbHNvIGFkZGVkIHRvIGZ1bmN0aW9ucyA6ZnVuYzpgZW1haWwubWVzc2FnZV9mcm9tX2ZpbGVgCi0gIGFuZCA6ZnVuYzpgZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZ2AuCi0KLSogOm1ldGg6YEdlbmVyYXRvci5fX2NhbGxfX2AgaXMgZGVwcmVjYXRlZDsgdXNlIDptZXRoOmBHZW5lcmF0b3IuZmxhdHRlbgotICA8ZW1haWwuZ2VuZXJhdG9yLkdlbmVyYXRvci5mbGF0dGVuPmAgaW5zdGVhZC4gIFRoZQotICA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuR2VuZXJhdG9yYCBjbGFzcyBoYXMgYWxzbyBncm93biB0aGUKLSAgOm1ldGg6YH5lbWFpbC5nZW5lcmF0b3IuR2VuZXJhdG9yLmNsb25lYCBtZXRob2QuCi0KLSogVGhlIDpjbGFzczpgfmVtYWlsLmdlbmVyYXRvci5EZWNvZGVkR2VuZXJhdG9yYCBjbGFzcyBpbiB0aGUKLSAgOm1vZDpgZW1haWwuZ2VuZXJhdG9yYCBtb2R1bGUgd2FzIGFkZGVkLgotCi0qIFRoZSBpbnRlcm1lZGlhdGUgYmFzZSBjbGFzc2VzCi0gIDpjbGFzczpgfmVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0Lk1JTUVOb25NdWx0aXBhcnRgIGFuZAotICA6Y2xhc3M6YH5lbWFpbC5taW1lLm11bHRpcGFydC5NSU1FTXVsdGlwYXJ0YCBoYXZlIGJlZW4gYWRkZWQsIGFuZCBpbnRlcnBvc2VkCi0gIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkgZm9yIG1vc3Qgb2YgdGhlIG90aGVyIE1JTUUtcmVsYXRlZCBkZXJpdmVkIGNsYXNzZXMuCi0KLSogVGhlICpfZW5jb2RlciogYXJndW1lbnQgdG8gdGhlIDpjbGFzczpgfmVtYWlsLm1pbWUudGV4dC5NSU1FVGV4dGAgY29uc3RydWN0b3IKLSAgaGFzIGJlZW4gZGVwcmVjYXRlZC4gIEVuY29kaW5nICBub3cgaGFwcGVucyBpbXBsaWNpdGx5IGJhc2VkIG9uIHRoZQotICAqX2NoYXJzZXQqIGFyZ3VtZW50LgotCi0qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGluIHRoZSA6bW9kOmBlbWFpbC5VdGlsc2AgbW9kdWxlIGhhdmUgYmVlbiBkZXByZWNhdGVkOgotICA6ZnVuYzpgZHVtcF9hZGRyZXNzX3BhaXJzYCwgOmZ1bmM6YGRlY29kZWAsIGFuZCA6ZnVuYzpgZW5jb2RlYC4gIFRoZSBmb2xsb3dpbmcKLSAgZnVuY3Rpb25zIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgbW9kdWxlOiA6ZnVuYzpgbWFrZV9tc2dpZGAsCi0gIDpmdW5jOmBkZWNvZGVfcmZjMjIzMWAsIDpmdW5jOmBlbmNvZGVfcmZjMjIzMWAsIGFuZCA6ZnVuYzpgZGVjb2RlX3BhcmFtc2AuCi0KLSogVGhlIG5vbi1wdWJsaWMgZnVuY3Rpb24gOmZ1bmM6YGVtYWlsLkl0ZXJhdG9ycy5fc3RydWN0dXJlYCB3YXMgYWRkZWQuCi0KLQotRGlmZmVyZW5jZXMgZnJvbSA6bW9kOmBtaW1lbGliYAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgOm1vZDpgZW1haWxgIHBhY2thZ2Ugd2FzIG9yaWdpbmFsbHkgcHJvdG90eXBlZCBhcyBhIHNlcGFyYXRlIGxpYnJhcnkgY2FsbGVkCi1gbWltZWxpYiA8aHR0cDovL21pbWVsaWIuc291cmNlZm9yZ2UubmV0Lz5gXy4gQ2hhbmdlcyBoYXZlIGJlZW4gbWFkZSBzbyB0aGF0IG1ldGhvZCBuYW1lcwotYXJlIG1vcmUgY29uc2lzdGVudCwgYW5kIHNvbWUgbWV0aG9kcyBvciBtb2R1bGVzIGhhdmUgZWl0aGVyIGJlZW4gYWRkZWQgb3IKLXJlbW92ZWQuICBUaGUgc2VtYW50aWNzIG9mIHNvbWUgb2YgdGhlIG1ldGhvZHMgaGF2ZSBhbHNvIGNoYW5nZWQuICBGb3IgdGhlIG1vc3QKLXBhcnQsIGFueSBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZSBpbiA6bW9kOmBtaW1lbGliYCBpcyBzdGlsbCBhdmFpbGFibGUgaW4gdGhlCi06bW9kOmBlbWFpbGAgcGFja2FnZSwgYWxiZWl0IG9mdGVuIGluIGEgZGlmZmVyZW50IHdheS4gIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLWJldHdlZW4gdGhlIDptb2Q6YG1pbWVsaWJgIHBhY2thZ2UgYW5kIHRoZSA6bW9kOmBlbWFpbGAgcGFja2FnZSB3YXMgbm90IGEKLXByaW9yaXR5LgotCi1IZXJlIGlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIDptb2Q6YG1pbWVsaWJgIGFuZAotdGhlIDptb2Q6YGVtYWlsYCBwYWNrYWdlcywgYWxvbmcgd2l0aCBoaW50cyBvbiBob3cgdG8gcG9ydCB5b3VyIGFwcGxpY2F0aW9ucy4KLQotT2YgY291cnNlLCB0aGUgbW9zdCB2aXNpYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHBhY2thZ2VzIGlzIHRoYXQgdGhlCi1wYWNrYWdlIG5hbWUgaGFzIGJlZW4gY2hhbmdlZCB0byA6bW9kOmBlbWFpbGAuICBJbiBhZGRpdGlvbiwgdGhlIHRvcC1sZXZlbAotcGFja2FnZSBoYXMgdGhlIGZvbGxvd2luZyBkaWZmZXJlbmNlczoKLQotKiA6ZnVuYzpgbWVzc2FnZUZyb21TdHJpbmdgIGhhcyBiZWVuIHJlbmFtZWQgdG8gOmZ1bmM6YG1lc3NhZ2VfZnJvbV9zdHJpbmdgLgotCi0qIDpmdW5jOmBtZXNzYWdlRnJvbUZpbGVgIGhhcyBiZWVuIHJlbmFtZWQgdG8gOmZ1bmM6YG1lc3NhZ2VfZnJvbV9maWxlYC4KLQotVGhlIDpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgY2xhc3MgaGFzIHRoZSBmb2xsb3dpbmcgZGlmZmVyZW5jZXM6Ci0KLSogVGhlIG1ldGhvZCA6bWV0aDpgYXNTdHJpbmdgIHdhcyByZW5hbWVkIHRvCi0gIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmFzX3N0cmluZ2AuCi0KLSogVGhlIG1ldGhvZCA6bWV0aDpgaXNtdWx0aXBhcnRgIHdhcyByZW5hbWVkIHRvCi0gIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmlzX211bHRpcGFydGAuCi0KLSogVGhlIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYCBtZXRob2QgaGFzIGdyb3duIGEgKmRlY29kZSoKLSAgb3B0aW9uYWwgYXJndW1lbnQuCi0KLSogVGhlIG1ldGhvZCA6bWV0aDpgZ2V0YWxsYCB3YXMgcmVuYW1lZCB0bwotICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfYWxsYC4KLQotKiBUaGUgbWV0aG9kIDptZXRoOmBhZGRoZWFkZXJgIHdhcyByZW5hbWVkIHRvCi0gIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmFkZF9oZWFkZXJgLgotCi0qIFRoZSBtZXRob2QgOm1ldGg6YGdldHR5cGVgIHdhcyByZW5hbWVkIHRvIDptZXRoOmBnZXRfdHlwZWAuCi0KLSogVGhlIG1ldGhvZCA6bWV0aDpgZ2V0bWFpbnR5cGVgIHdhcyByZW5hbWVkIHRvIDptZXRoOmBnZXRfbWFpbl90eXBlYC4KLQotKiBUaGUgbWV0aG9kIDptZXRoOmBnZXRzdWJ0eXBlYCB3YXMgcmVuYW1lZCB0byA6bWV0aDpgZ2V0X3N1YnR5cGVgLgotCi0qIFRoZSBtZXRob2QgOm1ldGg6YGdldHBhcmFtc2Agd2FzIHJlbmFtZWQgdG8KLSAgOm1ldGg6YH5lbWFpbC5tZXNzYWdlLk1lc3NhZ2UuZ2V0X3BhcmFtc2AuIEFsc28sIHdoZXJlYXMgOm1ldGg6YGdldHBhcmFtc2AKLSAgcmV0dXJuZWQgYSBsaXN0IG9mIHN0cmluZ3MsIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXJhbXNgIHJldHVybnMKLSAgYSBsaXN0IG9mIDItdHVwbGVzLCBlZmZlY3RpdmVseSB0aGUga2V5L3ZhbHVlIHBhaXJzIG9mIHRoZSBwYXJhbWV0ZXJzLCBzcGxpdAotICBvbiB0aGUgYGAnPSdgYCBzaWduLgotCi0qIFRoZSBtZXRob2QgOm1ldGg6YGdldHBhcmFtYCB3YXMgcmVuYW1lZCB0bwotICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfcGFyYW1gLgotCi0qIFRoZSBtZXRob2QgOm1ldGg6YGdldGNoYXJzZXRzYCB3YXMgcmVuYW1lZCB0bwotICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfY2hhcnNldHNgLgotCi0qIFRoZSBtZXRob2QgOm1ldGg6YGdldGZpbGVuYW1lYCB3YXMgcmVuYW1lZCB0bwotICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfZmlsZW5hbWVgLgotCi0qIFRoZSBtZXRob2QgOm1ldGg6YGdldGJvdW5kYXJ5YCB3YXMgcmVuYW1lZCB0bwotICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5nZXRfYm91bmRhcnlgLgotCi0qIFRoZSBtZXRob2QgOm1ldGg6YHNldGJvdW5kYXJ5YCB3YXMgcmVuYW1lZCB0bwotICA6bWV0aDpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5zZXRfYm91bmRhcnlgLgotCi0qIFRoZSBtZXRob2QgOm1ldGg6YGdldGRlY29kZWRwYXlsb2FkYCB3YXMgcmVtb3ZlZC4gIFRvIGdldCBzaW1pbGFyCi0gIGZ1bmN0aW9uYWxpdHksIHBhc3MgdGhlIHZhbHVlIDEgdG8gdGhlICpkZWNvZGUqIGZsYWcgb2YgdGhlCi0gIDptZXRoOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlLmdldF9wYXlsb2FkYCBtZXRob2QuCi0KLSogVGhlIG1ldGhvZCA6bWV0aDpgZ2V0cGF5bG9hZGFzdGV4dGAgd2FzIHJlbW92ZWQuICBTaW1pbGFyIGZ1bmN0aW9uYWxpdHkgaXMKLSAgc3VwcG9ydGVkIGJ5IHRoZSA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuRGVjb2RlZEdlbmVyYXRvcmAgY2xhc3MgaW4gdGhlCi0gIDptb2Q6YGVtYWlsLmdlbmVyYXRvcmAgbW9kdWxlLgotCi0qIFRoZSBtZXRob2QgOm1ldGg6YGdldGJvZHlhc3RleHRgIHdhcyByZW1vdmVkLiAgWW91IGNhbiBnZXQgc2ltaWxhcgotICBmdW5jdGlvbmFsaXR5IGJ5IGNyZWF0aW5nIGFuIGl0ZXJhdG9yIHdpdGgKLSAgOmZ1bmM6YH5lbWFpbC5pdGVyYXRvcnMudHlwZWRfc3VicGFydF9pdGVyYXRvcmAgaW4gdGhlIDptb2Q6YGVtYWlsLml0ZXJhdG9yc2AKLSAgbW9kdWxlLgotCi1UaGUgOmNsYXNzOmB+ZW1haWwucGFyc2VyLlBhcnNlcmAgY2xhc3MgaGFzIG5vIGRpZmZlcmVuY2VzIGluIGl0cyBwdWJsaWMKLWludGVyZmFjZS4gSXQgZG9lcyBoYXZlIHNvbWUgYWRkaXRpb25hbCBzbWFydHMgdG8gcmVjb2duaXplCi06bWltZXR5cGU6YG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzYCB0eXBlIG1lc3NhZ2VzLCB3aGljaCBpdCByZXByZXNlbnRzIGFzIGEKLTpjbGFzczpgfmVtYWlsLm1lc3NhZ2UuTWVzc2FnZWAgaW5zdGFuY2UgY29udGFpbmluZyBzZXBhcmF0ZQotOmNsYXNzOmB+ZW1haWwubWVzc2FnZS5NZXNzYWdlYCBzdWJwYXJ0cyBmb3IgZWFjaCBoZWFkZXIgYmxvY2sgaW4gdGhlIGRlbGl2ZXJ5Ci1zdGF0dXMgbm90aWZpY2F0aW9uIFsjXV8uCi0KLVRoZSA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuR2VuZXJhdG9yYCBjbGFzcyBoYXMgbm8gZGlmZmVyZW5jZXMgaW4gaXRzIHB1YmxpYwotaW50ZXJmYWNlLiAgVGhlcmUgaXMgYSBuZXcgY2xhc3MgaW4gdGhlIDptb2Q6YGVtYWlsLmdlbmVyYXRvcmAgbW9kdWxlIHRob3VnaCwKLWNhbGxlZCA6Y2xhc3M6YH5lbWFpbC5nZW5lcmF0b3IuRGVjb2RlZEdlbmVyYXRvcmAgd2hpY2ggcHJvdmlkZXMgbW9zdCBvZiB0aGUKLWZ1bmN0aW9uYWxpdHkgcHJldmlvdXNseSBhdmFpbGFibGUgaW4gdGhlIDptZXRoOmBNZXNzYWdlLmdldHBheWxvYWRhc3RleHRgCi1tZXRob2QuCi0KLVRoZSBmb2xsb3dpbmcgbW9kdWxlcyBhbmQgY2xhc3NlcyBoYXZlIGJlZW4gY2hhbmdlZDoKLQotKiBUaGUgOmNsYXNzOmB+ZW1haWwubWltZS5iYXNlLk1JTUVCYXNlYCBjbGFzcyBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKl9tYWpvcioKLSAgYW5kICpfbWlub3IqIGhhdmUgY2hhbmdlZCB0byAqX21haW50eXBlKiBhbmQgKl9zdWJ0eXBlKiByZXNwZWN0aXZlbHkuCi0KLSogVGhlIGBgSW1hZ2VgYCBjbGFzcy9tb2R1bGUgaGFzIGJlZW4gcmVuYW1lZCB0byBgYE1JTUVJbWFnZWBgLiAgVGhlICpfbWlub3IqCi0gIGFyZ3VtZW50IGhhcyBiZWVuIHJlbmFtZWQgdG8gKl9zdWJ0eXBlKi4KLQotKiBUaGUgYGBUZXh0YGAgY2xhc3MvbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gYGBNSU1FVGV4dGBgLiAgVGhlICpfbWlub3IqCi0gIGFyZ3VtZW50IGhhcyBiZWVuIHJlbmFtZWQgdG8gKl9zdWJ0eXBlKi4KLQotKiBUaGUgYGBNZXNzYWdlUkZDODIyYGAgY2xhc3MvbW9kdWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gYGBNSU1FTWVzc2FnZWBgLiAgTm90ZQotICB0aGF0IGFuIGVhcmxpZXIgdmVyc2lvbiBvZiA6bW9kOmBtaW1lbGliYCBjYWxsZWQgdGhpcyBjbGFzcy9tb2R1bGUgYGBSRkM4MjJgYCwKLSAgYnV0IHRoYXQgY2xhc2hlZCB3aXRoIHRoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeSBtb2R1bGUgOm1vZDpgcmZjODIyYCBvbiBzb21lCi0gIGNhc2UtaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW1zLgotCi0gIEFsc28sIHRoZSA6Y2xhc3M6YH5lbWFpbC5taW1lLm1lc3NhZ2UuTUlNRU1lc3NhZ2VgIGNsYXNzIG5vdyByZXByZXNlbnRzIGFueQotICBraW5kIG9mIE1JTUUgbWVzc2FnZQotICB3aXRoIG1haW4gdHlwZSA6bWltZXR5cGU6YG1lc3NhZ2VgLiAgSXQgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgKl9zdWJ0eXBlKgotICB3aGljaCBpcyB1c2VkIHRvIHNldCB0aGUgTUlNRSBzdWJ0eXBlLiAgKl9zdWJ0eXBlKiBkZWZhdWx0cyB0bwotICA6bWltZXR5cGU6YHJmYzgyMmAuCi0KLTptb2Q6YG1pbWVsaWJgIHByb3ZpZGVkIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgaW4gaXRzIDptb2Q6YGFkZHJlc3NgIGFuZAotOm1vZDpgZGF0ZWAgbW9kdWxlcy4gIEFsbCBvZiB0aGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vdmVkIHRvIHRoZQotOm1vZDpgZW1haWwudXRpbHNgIG1vZHVsZS4KLQotVGhlIGBgTXNnUmVhZGVyYGAgY2xhc3MvbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQuICBJdHMgZnVuY3Rpb25hbGl0eSBpcyBtb3N0Ci1jbG9zZWx5IHN1cHBvcnRlZCBpbiB0aGUgOmZ1bmM6YH5lbWFpbC5pdGVyYXRvcnMuYm9keV9saW5lX2l0ZXJhdG9yYCBmdW5jdGlvbgotaW4gdGhlIDptb2Q6YGVtYWlsLml0ZXJhdG9yc2AgbW9kdWxlLgotCi0uLiBydWJyaWM6OiBGb290bm90ZXMKLQotLi4gWyNdIERlbGl2ZXJ5IFN0YXR1cyBOb3RpZmljYXRpb25zIChEU04pIGFyZSBkZWZpbmVkIGluIDpyZmM6YDE4OTRgLgorICAgTW9kdWxlIDptb2Q6YHNtdHBkYAorICAgICAgU01UUCBzZXJ2ZXIgZnJhbWV3b3JrIChwcmltYXJpbHkgdXNlZnVsIGZvciB0ZXN0aW5nKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwudXRpbC5yc3QgYi9Eb2MvbGlicmFyeS9lbWFpbC51dGlsLnJzdAppbmRleCA1Y2ZmNzQ2Li42M2ZhZTJhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9lbWFpbC51dGlsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC51dGlsLnJzdApAQCAtOCw3ICs4LDQzIEBACiAKIC0tLS0tLS0tLS0tLS0tCiAKLVRoZXJlIGFyZSBzZXZlcmFsIHVzZWZ1bCB1dGlsaXRpZXMgcHJvdmlkZWQgaW4gdGhlIDptb2Q6YGVtYWlsLnV0aWxzYCBtb2R1bGU6CitUaGVyZSBhcmUgYSBjb3VwbGUgb2YgdXNlZnVsIHV0aWxpdGllcyBwcm92aWRlZCBpbiB0aGUgOm1vZDpgZW1haWwudXRpbHNgCittb2R1bGU6CisKKy4uIGZ1bmN0aW9uOjogbG9jYWx0aW1lKGR0PU5vbmUpCisKKyAgICBSZXR1cm4gbG9jYWwgdGltZSBhcyBhbiBhd2FyZSBkYXRldGltZSBvYmplY3QuICBJZiBjYWxsZWQgd2l0aG91dAorICAgIGFyZ3VtZW50cywgcmV0dXJuIGN1cnJlbnQgdGltZS4gIE90aGVyd2lzZSAqZHQqIGFyZ3VtZW50IHNob3VsZCBiZSBhCisgICAgOmNsYXNzOmB+ZGF0ZXRpbWUuZGF0ZXRpbWVgIGluc3RhbmNlLCBhbmQgaXQgaXMgY29udmVydGVkIHRvIHRoZSBsb2NhbCB0aW1lCisgICAgem9uZSBhY2NvcmRpbmcgdG8gdGhlIHN5c3RlbSB0aW1lIHpvbmUgZGF0YWJhc2UuICBJZiAqZHQqIGlzIG5haXZlICh0aGF0CisgICAgaXMsIGBgZHQudHppbmZvYGAgaXMgYGBOb25lYGApLCBpdCBpcyBhc3N1bWVkIHRvIGJlIGluIGxvY2FsIHRpbWUuICBJbiB0aGlzCisgICAgY2FzZSwgYSBwb3NpdGl2ZSBvciB6ZXJvIHZhbHVlIGZvciAqaXNkc3QqIGNhdXNlcyBgYGxvY2FsdGltZWBgIHRvIHByZXN1bWUKKyAgICBpbml0aWFsbHkgdGhhdCBzdW1tZXIgdGltZSAoZm9yIGV4YW1wbGUsIERheWxpZ2h0IFNhdmluZyBUaW1lKSBpcyBvciBpcyBub3QKKyAgICAocmVzcGVjdGl2ZWx5KSBpbiBlZmZlY3QgZm9yIHRoZSBzcGVjaWZpZWQgdGltZS4gIEEgbmVnYXRpdmUgdmFsdWUgZm9yCisgICAgKmlzZHN0KiBjYXVzZXMgdGhlIGBgbG9jYWx0aW1lYGAgdG8gYXR0ZW1wdCB0byBkaXZpbmUgd2hldGhlciBzdW1tZXIgdGltZQorICAgIGlzIGluIGVmZmVjdCBmb3IgdGhlIHNwZWNpZmllZCB0aW1lLgorCisgICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCisKKworLi4gZnVuY3Rpb246OiBtYWtlX21zZ2lkKGlkc3RyaW5nPU5vbmUsIGRvbWFpbj1Ob25lKQorCisgICBSZXR1cm5zIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBhbiA6cmZjOmAyODIyYFwgLWNvbXBsaWFudAorICAgOm1haWxoZWFkZXI6YE1lc3NhZ2UtSURgIGhlYWRlci4gIE9wdGlvbmFsICppZHN0cmluZyogaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nCisgICB1c2VkIHRvIHN0cmVuZ3RoZW4gdGhlIHVuaXF1ZW5lc3Mgb2YgdGhlIG1lc3NhZ2UgaWQuICBPcHRpb25hbCAqZG9tYWluKiBpZgorICAgZ2l2ZW4gcHJvdmlkZXMgdGhlIHBvcnRpb24gb2YgdGhlIG1zZ2lkIGFmdGVyIHRoZSAnQCcuICBUaGUgZGVmYXVsdCBpcyB0aGUKKyAgIGxvY2FsIGhvc3RuYW1lLiAgSXQgaXMgbm90IG5vcm1hbGx5IG5lY2Vzc2FyeSB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQsIGJ1dAorICAgbWF5IGJlIHVzZWZ1bCBjZXJ0YWluIGNhc2VzLCBzdWNoIGFzIGEgY29uc3RydWN0aW5nIGRpc3RyaWJ1dGVkIHN5c3RlbSB0aGF0CisgICB1c2VzIGEgY29uc2lzdGVudCBkb21haW4gbmFtZSBhY3Jvc3MgbXVsdGlwbGUgaG9zdHMuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4yCisgICAgICBBZGRlZCB0aGUgKmRvbWFpbioga2V5d29yZC4KKworCitUaGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBhcmUgcGFydCBvZiB0aGUgbGVnYWN5IChgYENvbXBhdDMyYGApIGVtYWlsIEFQSS4gIFRoZXJlCitpcyBubyBuZWVkIHRvIGRpcmVjdGx5IHVzZSB0aGVzZSB3aXRoIHRoZSBuZXcgQVBJLCBzaW5jZSB0aGUgcGFyc2luZyBhbmQKK2Zvcm1hdHRpbmcgdGhleSBwcm92aWRlIGlzIGRvbmUgYXV0b21hdGljYWxseSBieSB0aGUgaGVhZGVyIHBhcnNpbmcgbWFjaGluZXJ5CitvZiB0aGUgbmV3IEFQSS4KIAogCiAuLiBmdW5jdGlvbjo6IHF1b3RlKHN0cikKQEAgLTE0MSwzNiArMTc3LDYgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogCiAKLS4uIGZ1bmN0aW9uOjogbG9jYWx0aW1lKGR0PU5vbmUpCi0KLSAgICBSZXR1cm4gbG9jYWwgdGltZSBhcyBhbiBhd2FyZSBkYXRldGltZSBvYmplY3QuICBJZiBjYWxsZWQgd2l0aG91dAotICAgIGFyZ3VtZW50cywgcmV0dXJuIGN1cnJlbnQgdGltZS4gIE90aGVyd2lzZSAqZHQqIGFyZ3VtZW50IHNob3VsZCBiZSBhCi0gICAgOmNsYXNzOmB+ZGF0ZXRpbWUuZGF0ZXRpbWVgIGluc3RhbmNlLCBhbmQgaXQgaXMgY29udmVydGVkIHRvIHRoZSBsb2NhbCB0aW1lCi0gICAgem9uZSBhY2NvcmRpbmcgdG8gdGhlIHN5c3RlbSB0aW1lIHpvbmUgZGF0YWJhc2UuICBJZiAqZHQqIGlzIG5haXZlICh0aGF0Ci0gICAgaXMsIGBgZHQudHppbmZvYGAgaXMgYGBOb25lYGApLCBpdCBpcyBhc3N1bWVkIHRvIGJlIGluIGxvY2FsIHRpbWUuICBJbiB0aGlzCi0gICAgY2FzZSwgYSBwb3NpdGl2ZSBvciB6ZXJvIHZhbHVlIGZvciAqaXNkc3QqIGNhdXNlcyBgYGxvY2FsdGltZWBgIHRvIHByZXN1bWUKLSAgICBpbml0aWFsbHkgdGhhdCBzdW1tZXIgdGltZSAoZm9yIGV4YW1wbGUsIERheWxpZ2h0IFNhdmluZyBUaW1lKSBpcyBvciBpcyBub3QKLSAgICAocmVzcGVjdGl2ZWx5KSBpbiBlZmZlY3QgZm9yIHRoZSBzcGVjaWZpZWQgdGltZS4gIEEgbmVnYXRpdmUgdmFsdWUgZm9yCi0gICAgKmlzZHN0KiBjYXVzZXMgdGhlIGBgbG9jYWx0aW1lYGAgdG8gYXR0ZW1wdCB0byBkaXZpbmUgd2hldGhlciBzdW1tZXIgdGltZQotICAgIGlzIGluIGVmZmVjdCBmb3IgdGhlIHNwZWNpZmllZCB0aW1lLgotCi0gICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCi0KLQotLi4gZnVuY3Rpb246OiBtYWtlX21zZ2lkKGlkc3RyaW5nPU5vbmUsIGRvbWFpbj1Ob25lKQotCi0gICBSZXR1cm5zIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBhbiA6cmZjOmAyODIyYFwgLWNvbXBsaWFudAotICAgOm1haWxoZWFkZXI6YE1lc3NhZ2UtSURgIGhlYWRlci4gIE9wdGlvbmFsICppZHN0cmluZyogaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nCi0gICB1c2VkIHRvIHN0cmVuZ3RoZW4gdGhlIHVuaXF1ZW5lc3Mgb2YgdGhlIG1lc3NhZ2UgaWQuICBPcHRpb25hbCAqZG9tYWluKiBpZgotICAgZ2l2ZW4gcHJvdmlkZXMgdGhlIHBvcnRpb24gb2YgdGhlIG1zZ2lkIGFmdGVyIHRoZSAnQCcuICBUaGUgZGVmYXVsdCBpcyB0aGUKLSAgIGxvY2FsIGhvc3RuYW1lLiAgSXQgaXMgbm90IG5vcm1hbGx5IG5lY2Vzc2FyeSB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQsIGJ1dAotICAgbWF5IGJlIHVzZWZ1bCBjZXJ0YWluIGNhc2VzLCBzdWNoIGFzIGEgY29uc3RydWN0aW5nIGRpc3RyaWJ1dGVkIHN5c3RlbSB0aGF0Ci0gICB1c2VzIGEgY29uc2lzdGVudCBkb21haW4gbmFtZSBhY3Jvc3MgbXVsdGlwbGUgaG9zdHMuCi0KLSAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4yCi0gICAgICBBZGRlZCB0aGUgKmRvbWFpbioga2V5d29yZC4KLQotCiAuLiBmdW5jdGlvbjo6IGRlY29kZV9yZmMyMjMxKHMpCiAKICAgIERlY29kZSB0aGUgc3RyaW5nICpzKiBhY2NvcmRpbmcgdG8gOnJmYzpgMjIzMWAuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9lbnVtLnJzdCBiL0RvYy9saWJyYXJ5L2VudW0ucnN0CmluZGV4IGEzZDVhZmMuLjYxNjc5ZTEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2VudW0ucnN0CisrKyBiL0RvYy9saWJyYXJ5L2VudW0ucnN0CkBAIC0yMyw5ICsyMyw5IEBACiBNb2R1bGUgQ29udGVudHMKIC0tLS0tLS0tLS0tLS0tLQogCi1UaGlzIG1vZHVsZSBkZWZpbmVzIHR3byBlbnVtZXJhdGlvbiBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHVuaXF1ZQotc2V0cyBvZiBuYW1lcyBhbmQgdmFsdWVzOiA6Y2xhc3M6YEVudW1gIGFuZCA6Y2xhc3M6YEludEVudW1gLiAgSXQgYWxzbyBkZWZpbmVzCi1vbmUgZGVjb3JhdG9yLCA6ZnVuYzpgdW5pcXVlYC4KK1RoaXMgbW9kdWxlIGRlZmluZXMgZm91ciBlbnVtZXJhdGlvbiBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHVuaXF1ZQorc2V0cyBvZiBuYW1lcyBhbmQgdmFsdWVzOiA6Y2xhc3M6YEVudW1gLCA6Y2xhc3M6YEludEVudW1gLCBhbmQKKzpjbGFzczpgSW50RmxhZ3NgLiAgSXQgYWxzbyBkZWZpbmVzIG9uZSBkZWNvcmF0b3IsIDpmdW5jOmB1bmlxdWVgLgogCiAuLiBjbGFzczo6IEVudW0KIApAQCAtMzcsMTAgKzM3LDIzIEBACiAgICAgQmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgZW51bWVyYXRlZCBjb25zdGFudHMgdGhhdCBhcmUgYWxzbwogICAgIHN1YmNsYXNzZXMgb2YgOmNsYXNzOmBpbnRgLgogCisuLiBjbGFzczo6IEludEZsYWcKKworICAgIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIGVudW1lcmF0ZWQgY29uc3RhbnRzIHRoYXQgY2FuIGJlIGNvbWJpbmVkIHVzaW5nCisgICAgdGhlIGJpdHdpc2Ugb3BlcmF0b3JzIHdpdGhvdXQgbG9zaW5nIHRoZWlyIDpjbGFzczpgSW50RmxhZ2AgbWVtYmVyc2hpcC4KKyAgICA6Y2xhc3M6YEludEZsYWdgIG1lbWJlcnMgYXJlIGFsc28gc3ViY2xhc3NlcyBvZiA6Y2xhc3M6YGludGAuCisKKy4uIGNsYXNzOjogRmxhZworCisgICAgQmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgZW51bWVyYXRlZCBjb25zdGFudHMgdGhhdCBjYW4gYmUgY29tYmluZWQgdXNpbmcKKyAgICB0aGUgYml0d2lzZSBvcGVyYXRpb25zIHdpdGhvdXQgbG9zaW5nIHRoZWlyIDpjbGFzczpgRmxhZ2AgbWVtYmVyc2hpcC4KKwogLi4gZnVuY3Rpb246OiB1bmlxdWUKIAogICAgIEVudW0gY2xhc3MgZGVjb3JhdG9yIHRoYXQgZW5zdXJlcyBvbmx5IG9uZSBuYW1lIGlzIGJvdW5kIHRvIGFueSBvbmUgdmFsdWUuCiAKKy4uIHZlcnNpb25hZGRlZDo6IDMuNiAgYGBGbGFnYGAsIGBgSW50RmxhZ2BgCisKIAogQ3JlYXRpbmcgYW4gRW51bQogLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjU3LDcgKzI3MCw3IEBACiAgICAgPj4+IENvbG9yLnJlZCA8IENvbG9yLmJsdWUKICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgotICAgIFR5cGVFcnJvcjogdW5vcmRlcmFibGUgdHlwZXM6IENvbG9yKCkgPCBDb2xvcigpCisgICAgVHlwZUVycm9yOiAnPCcgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnQ29sb3InIGFuZCAnQ29sb3InCiAKIEVxdWFsaXR5IGNvbXBhcmlzb25zIGFyZSBkZWZpbmVkIHRob3VnaDo6CiAKQEAgLTQ3OCw3ICs0OTEsNyBAQAogSW50RW51bQogXl5eXl5eXgogCi1BIHZhcmlhdGlvbiBvZiA6Y2xhc3M6YEVudW1gIGlzIHByb3ZpZGVkIHdoaWNoIGlzIGFsc28gYSBzdWJjbGFzcyBvZgorVGhlIGZpcnN0IHZhcmlhdGlvbiBvZiA6Y2xhc3M6YEVudW1gIHRoYXQgaXMgcHJvdmlkZWQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mCiA6Y2xhc3M6YGludGAuICBNZW1iZXJzIG9mIGFuIDpjbGFzczpgSW50RW51bWAgY2FuIGJlIGNvbXBhcmVkIHRvIGludGVnZXJzOwogYnkgZXh0ZW5zaW9uLCBpbnRlZ2VyIGVudW1lcmF0aW9ucyBvZiBkaWZmZXJlbnQgdHlwZXMgY2FuIGFsc28gYmUgY29tcGFyZWQKIHRvIGVhY2ggb3RoZXI6OgpAQCAtNTIxLDEzICs1MzQsMTIxIEBACiAgICAgPj4+IFtpIGZvciBpIGluIHJhbmdlKFNoYXBlLnNxdWFyZSldCiAgICAgWzAsIDFdCiAKLUZvciB0aGUgdmFzdCBtYWpvcml0eSBvZiBjb2RlLCA6Y2xhc3M6YEVudW1gIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkLAotc2luY2UgOmNsYXNzOmBJbnRFbnVtYCBicmVha3Mgc29tZSBzZW1hbnRpYyBwcm9taXNlcyBvZiBhbiBlbnVtZXJhdGlvbiAoYnkKLWJlaW5nIGNvbXBhcmFibGUgdG8gaW50ZWdlcnMsIGFuZCB0aHVzIGJ5IHRyYW5zaXRpdml0eSB0byBvdGhlcgotdW5yZWxhdGVkIGVudW1lcmF0aW9ucykuICBJdCBzaG91bGQgYmUgdXNlZCBvbmx5IGluIHNwZWNpYWwgY2FzZXMgd2hlcmUKLXRoZXJlJ3Mgbm8gb3RoZXIgY2hvaWNlOyBmb3IgZXhhbXBsZSwgd2hlbiBpbnRlZ2VyIGNvbnN0YW50cyBhcmUKLXJlcGxhY2VkIHdpdGggZW51bWVyYXRpb25zIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyByZXF1aXJlZCB3aXRoIGNvZGUKLXRoYXQgc3RpbGwgZXhwZWN0cyBpbnRlZ2Vycy4KKworSW50RmxhZworXl5eXl5eXgorCitUaGUgbmV4dCB2YXJpYXRpb24gb2YgOmNsYXNzOmBFbnVtYCBwcm92aWRlZCwgOmNsYXNzOmBJbnRGbGFnYCwgaXMgYWxzbyBiYXNlZAorb24gOmNsYXNzOmBpbnRgLiAgVGhlIGRpZmZlcmVuY2UgYmVpbmcgOmNsYXNzOmBJbnRGbGFnYCBtZW1iZXJzIGNhbiBiZSBjb21iaW5lZAordXNpbmcgdGhlIGJpdHdpc2Ugb3BlcmF0b3JzICgmLCBcfCwgXiwgfikgYW5kIHRoZSByZXN1bHQgaXMgc3RpbGwgYW4KKzpjbGFzczpgSW50RmxhZ2AgbWVtYmVyLiAgSG93ZXZlciwgYXMgdGhlIG5hbWUgaW1wbGllcywgOmNsYXNzOmBJbnRGbGFnYAorbWVtYmVycyBhbHNvIHN1YmNsYXNzIDpjbGFzczpgaW50YCBhbmQgY2FuIGJlIHVzZWQgd2hlcmV2ZXIgYW4gOmNsYXNzOmBpbnRgIGlzCit1c2VkLiAgQW55IG9wZXJhdGlvbiBvbiBhbiA6Y2xhc3M6YEludEZsYWdgIG1lbWJlciBiZXNpZGVzIHRoZSBiaXQtd2lzZQorb3BlcmF0aW9ucyB3aWxsIGxvc2UgdGhlIDpjbGFzczpgSW50RmxhZ2AgbWVtYmVyc2hpcC4KKworLi4gdmVyc2lvbmFkZGVkOjogMy42CisKK1NhbXBsZSA6Y2xhc3M6YEludEZsYWdgIGNsYXNzOjoKKworICAgID4+PiBmcm9tIGVudW0gaW1wb3J0IEludEZsYWcKKyAgICA+Pj4gY2xhc3MgUGVybShJbnRGbGFnKToKKyAgICAuLi4gICAgIFIgPSA0CisgICAgLi4uICAgICBXID0gMgorICAgIC4uLiAgICAgWCA9IDEKKyAgICAuLi4KKyAgICA+Pj4gUGVybS5SIHwgUGVybS5XCisgICAgPFBlcm0uUnxXOiA2PgorICAgID4+PiBQZXJtLlIgKyBQZXJtLlcKKyAgICA2CisgICAgPj4+IFJXID0gUGVybS5SIHwgUGVybS5XCisgICAgPj4+IFBlcm0uUiBpbiBSVworICAgIFRydWUKKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBuYW1lIHRoZSBjb21iaW5hdGlvbnM6OgorCisgICAgPj4+IGNsYXNzIFBlcm0oSW50RmxhZyk6CisgICAgLi4uICAgICBSID0gNAorICAgIC4uLiAgICAgVyA9IDIKKyAgICAuLi4gICAgIFggPSAxCisgICAgLi4uICAgICBSV1ggPSA3CisgICAgPj4+IFBlcm0uUldYCisgICAgPFBlcm0uUldYOiA3PgorICAgID4+PiB+UGVybS5SV1gKKyAgICA8UGVybS4tODogLTg+CisKK0Fub3RoZXIgaW1wb3J0YW50IGRpZmZlcmVuY2UgYmV0d2VlbiA6Y2xhc3M6YEludEZsYWdgIGFuZCA6Y2xhc3M6YEVudW1gIGlzIHRoYXQKK2lmIG5vIGZsYWdzIGFyZSBzZXQgKHRoZSB2YWx1ZSBpcyAwKSwgaXRzIGJvb2xlYW4gZXZhbHVhdGlvbiBpcyA6ZGF0YTpgRmFsc2VgOjoKKworICAgID4+PiBQZXJtLlIgJiBQZXJtLlgKKyAgICA8UGVybS4wOiAwPgorICAgID4+PiBib29sKFBlcm0uUiAmIFBlcm0uWCkKKyAgICBGYWxzZQorCitCZWNhdXNlIDpjbGFzczpgSW50RmxhZ2AgbWVtYmVycyBhcmUgYWxzbyBzdWJjbGFzc2VzIG9mIDpjbGFzczpgaW50YCB0aGV5IGNhbgorYmUgY29tYmluZWQgd2l0aCB0aGVtOjoKKworICAgID4+PiBQZXJtLlggfCA4CisgICAgPFBlcm0uOHxYOiA5PgorCisKK0ZsYWcKK15eXl4KKworVGhlIGxhc3QgdmFyaWF0aW9uIGlzIDpjbGFzczpgRmxhZ2AuICBMaWtlIDpjbGFzczpgSW50RmxhZ2AsIDpjbGFzczpgRmxhZ2AKK21lbWJlcnMgY2FuIGJlIGNvbWJpbmVkIHVzaW5nIHRoZSBiaXR3aXNlIG9wZXJhdG9ycyAoJiwgXHwsIF4sIH4pLiAgVW5saWtlCis6Y2xhc3M6YEludEZsYWdgLCB0aGV5IGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoLCBub3IgY29tcGFyZWQgYWdhaW5zdCwgYW55CitvdGhlciA6Y2xhc3M6YEZsYWdgIGVudW1lcmF0aW9uLCBub3IgOmNsYXNzOmBpbnRgLgorCisuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworTGlrZSA6Y2xhc3M6YEludEZsYWdgLCBpZiBhIGNvbWJpbmF0aW9uIG9mIDpjbGFzczpgRmxhZ2AgbWVtYmVycyByZXN1bHRzIGluIG5vCitmbGFncyBiZWluZyBzZXQsIHRoZSBib29sZWFuIGV2YWx1YXRpb24gaXMgOmRhdGE6YEZhbHNlYDo6CisKKyAgICA+Pj4gZnJvbSBlbnVtIGltcG9ydCBGbGFnCisgICAgPj4+IGNsYXNzIENvbG9yKEZsYWcpOgorICAgIC4uLiAgICAgcmVkID0gMQorICAgIC4uLiAgICAgYmx1ZSA9IDIKKyAgICAuLi4gICAgIGdyZWVuID0gNAorICAgIC4uLgorICAgID4+PiBDb2xvci5yZWQgJiBDb2xvci5ncmVlbgorICAgIDxDb2xvci4wOiAwPgorICAgID4+PiBib29sKENvbG9yLnJlZCAmIENvbG9yLmdyZWVuKQorICAgIEZhbHNlCisKK0luZGl2aWR1YWwgZmxhZ3Mgc2hvdWxkIGhhdmUgdmFsdWVzIHRoYXQgYXJlIHBvd2VycyBvZiB0d28gKDEsIDIsIDQsIDgsIC4uLiksCit3aGlsZSBjb21iaW5hdGlvbnMgb2YgZmxhZ3Mgd29uJ3Q6OgorCisgICAgPj4+IGNsYXNzIENvbG9yKEZsYWcpOgorICAgIC4uLiAgICAgcmVkID0gMQorICAgIC4uLiAgICAgYmx1ZSA9IDIKKyAgICAuLi4gICAgIGdyZWVuID0gNAorICAgIC4uLiAgICAgd2hpdGUgPSA3CisgICAgLi4uICAgICAjIG9yCisgICAgLi4uICAgICAjIHdoaXRlID0gcmVkIHwgYmx1ZSB8IGdyZWVuCisKK0dpdmluZyBhIG5hbWUgdG8gdGhlICJubyBmbGFncyBzZXQiIGNvbmRpdGlvbiBkb2VzIG5vdCBjaGFuZ2UgaXRzIGJvb2xlYW4KK3ZhbHVlOjoKKworICAgID4+PiBjbGFzcyBDb2xvcihGbGFnKToKKyAgICAuLi4gICAgIGJsYWNrID0gMAorICAgIC4uLiAgICAgcmVkID0gMQorICAgIC4uLiAgICAgYmx1ZSA9IDIKKyAgICAuLi4gICAgIGdyZWVuID0gNAorICAgIC4uLgorICAgID4+PiBDb2xvci5ibGFjaworICAgIDxDb2xvci5ibGFjazogMD4KKyAgICA+Pj4gYm9vbChDb2xvci5ibGFjaykKKyAgICBGYWxzZQorCisuLiBub3RlOjoKKworICAgIEZvciB0aGUgbWFqb3JpdHkgb2YgbmV3IGNvZGUsIDpjbGFzczpgRW51bWAgYW5kIDpjbGFzczpgRmxhZ2AgYXJlIHN0cm9uZ2x5CisgICAgcmVjb21tZW5kZWQsIHNpbmNlIDpjbGFzczpgSW50RW51bWAgYW5kIDpjbGFzczpgSW50RmxhZ2AgYnJlYWsgc29tZQorICAgIHNlbWFudGljIHByb21pc2VzIG9mIGFuIGVudW1lcmF0aW9uIChieSBiZWluZyBjb21wYXJhYmxlIHRvIGludGVnZXJzLCBhbmQKKyAgICB0aHVzIGJ5IHRyYW5zaXRpdml0eSB0byBvdGhlciB1bnJlbGF0ZWQgZW51bWVyYXRpb25zKS4gIDpjbGFzczpgSW50RW51bWAKKyAgICBhbmQgOmNsYXNzOmBJbnRGbGFnYCBzaG91bGQgYmUgdXNlZCBvbmx5IGluIGNhc2VzIHdoZXJlIDpjbGFzczpgRW51bWAgYW5kCisgICAgOmNsYXNzOmBGbGFnYCB3aWxsIG5vdCBkbzsgZm9yIGV4YW1wbGUsIHdoZW4gaW50ZWdlciBjb25zdGFudHMgYXJlIHJlcGxhY2VkCisgICAgd2l0aCBlbnVtZXJhdGlvbnMsIG9yIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgc3lzdGVtcy4KIAogCiBPdGhlcnMKQEAgLTU1OCw3ICs2NzksOCBAQAogNC4gJS1zdHlsZSBmb3JtYXR0aW5nOiAgYCVzYCBhbmQgYCVyYCBjYWxsIHRoZSA6Y2xhc3M6YEVudW1gIGNsYXNzJ3MKICAgIDptZXRoOmBfX3N0cl9fYCBhbmQgOm1ldGg6YF9fcmVwcl9fYCByZXNwZWN0aXZlbHk7IG90aGVyIGNvZGVzIChzdWNoIGFzCiAgICBgJWlgIG9yIGAlaGAgZm9yIEludEVudW0pIHRyZWF0IHRoZSBlbnVtIG1lbWJlciBhcyBpdHMgbWl4ZWQtaW4gdHlwZS4KLTUuIDptZXRoOmBzdHIuZm9ybWF0YCAob3IgOmZ1bmM6YGZvcm1hdGApIHdpbGwgdXNlIHRoZSBtaXhlZC1pbgorNS4gOnJlZjpgRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyA8Zi1zdHJpbmdzPmAsIDptZXRoOmBzdHIuZm9ybWF0YCwKKyAgIGFuZCA6ZnVuYzpgZm9ybWF0YCB3aWxsIHVzZSB0aGUgbWl4ZWQtaW4KICAgIHR5cGUncyA6bWV0aDpgX19mb3JtYXRfX2AuICBJZiB0aGUgOmNsYXNzOmBFbnVtYCBjbGFzcydzIDpmdW5jOmBzdHJgIG9yCiAgICA6ZnVuYzpgcmVwcmAgaXMgZGVzaXJlZCwgdXNlIHRoZSBgIXNgIG9yIGAhcmAgZm9ybWF0IGNvZGVzLgogCkBAIC01NjYsMTggKzY4OCw3MiBAQAogSW50ZXJlc3RpbmcgZXhhbXBsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoaWxlIDpjbGFzczpgRW51bWAgYW5kIDpjbGFzczpgSW50RW51bWAgYXJlIGV4cGVjdGVkIHRvIGNvdmVyIHRoZSBtYWpvcml0eSBvZgotdXNlLWNhc2VzLCB0aGV5IGNhbm5vdCBjb3ZlciB0aGVtIGFsbC4gIEhlcmUgYXJlIHJlY2lwZXMgZm9yIHNvbWUgZGlmZmVyZW50Ci10eXBlcyBvZiBlbnVtZXJhdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBkaXJlY3RseSwgb3IgYXMgZXhhbXBsZXMgZm9yIGNyZWF0aW5nCi1vbmUncyBvd24uCitXaGlsZSA6Y2xhc3M6YEVudW1gLCA6Y2xhc3M6YEludEVudW1gLCA6Y2xhc3M6YEludEZsYWdgLCBhbmQgOmNsYXNzOmBGbGFnYCBhcmUKK2V4cGVjdGVkIHRvIGNvdmVyIHRoZSBtYWpvcml0eSBvZiB1c2UtY2FzZXMsIHRoZXkgY2Fubm90IGNvdmVyIHRoZW0gYWxsLiAgSGVyZQorYXJlIHJlY2lwZXMgZm9yIHNvbWUgZGlmZmVyZW50IHR5cGVzIG9mIGVudW1lcmF0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGRpcmVjdGx5LAorb3IgYXMgZXhhbXBsZXMgZm9yIGNyZWF0aW5nIG9uZSdzIG93bi4KIAogCi1BdXRvTnVtYmVyCi1eXl5eXl5eXl5eCitPbWl0dGluZyB2YWx1ZXMKK15eXl5eXl5eXl5eXl5eXgogCi1Bdm9pZHMgaGF2aW5nIHRvIHNwZWNpZnkgdGhlIHZhbHVlIGZvciBlYWNoIGVudW1lcmF0aW9uIG1lbWJlcjo6CitJbiBtYW55IHVzZS1jYXNlcyBvbmUgZG9lc24ndCBjYXJlIHdoYXQgdGhlIGFjdHVhbCB2YWx1ZSBvZiBhbiBlbnVtZXJhdGlvbgoraXMuIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gZGVmaW5lIHRoaXMgdHlwZSBvZiBzaW1wbGUgZW51bWVyYXRpb246CiAKLSAgICA+Pj4gY2xhc3MgQXV0b051bWJlcihFbnVtKToKKy0gdXNlIGluc3RhbmNlcyBvZiA6Y2xhc3M6YG9iamVjdGAgYXMgdGhlIHZhbHVlCistIHVzZSBhIGRlc2NyaXB0aXZlIHN0cmluZyBhcyB0aGUgdmFsdWUKKy0gdXNlIGEgdHVwbGUgYXMgdGhlIHZhbHVlIGFuZCBhIGN1c3RvbSA6bWV0aDpgX19uZXdfX2AgdG8gcmVwbGFjZSB0aGUKKyAgdHVwbGUgd2l0aCBhbiA6Y2xhc3M6YGludGAgdmFsdWUKKworVXNpbmcgYW55IG9mIHRoZXNlIG1ldGhvZHMgc2lnbmlmaWVzIHRvIHRoZSB1c2VyIHRoYXQgdGhlc2UgdmFsdWVzIGFyZSBub3QKK2ltcG9ydGFudCwgYW5kIGFsc28gZW5hYmxlcyBvbmUgdG8gYWRkLCByZW1vdmUsIG9yIHJlb3JkZXIgbWVtYmVycyB3aXRob3V0CitoYXZpbmcgdG8gcmVudW1iZXIgdGhlIHJlbWFpbmluZyBtZW1iZXJzLgorCitXaGljaGV2ZXIgbWV0aG9kIHlvdSBjaG9vc2UsIHlvdSBzaG91bGQgcHJvdmlkZSBhIDptZXRoOmByZXByYCB0aGF0IGFsc28gaGlkZXMKK3RoZSAodW5pbXBvcnRhbnQpIHZhbHVlOjoKKworICAgID4+PiBjbGFzcyBOb1ZhbHVlKEVudW0pOgorICAgIC4uLiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIC4uLiAgICAgICAgIHJldHVybiAnPCVzLiVzPicgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYubmFtZSkKKyAgICAuLi4KKworCitVc2luZyA6Y2xhc3M6YG9iamVjdGAKKyIiIiIiIiIiIiIiIiIiIiIiIiIiIgorCitVc2luZyA6Y2xhc3M6YG9iamVjdGAgd291bGQgbG9vayBsaWtlOjoKKworICAgID4+PiBjbGFzcyBDb2xvcihOb1ZhbHVlKToKKyAgICAuLi4gICAgIHJlZCA9IG9iamVjdCgpCisgICAgLi4uICAgICBncmVlbiA9IG9iamVjdCgpCisgICAgLi4uICAgICBibHVlID0gb2JqZWN0KCkKKyAgICAuLi4KKyAgICA+Pj4gQ29sb3IuZ3JlZW4KKyAgICA8Q29sb3IuZ3JlZW4+CisKKworVXNpbmcgYSBkZXNjcmlwdGl2ZSBzdHJpbmcKKyIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiCisKK1VzaW5nIGEgc3RyaW5nIGFzIHRoZSB2YWx1ZSB3b3VsZCBsb29rIGxpa2U6OgorCisgICAgPj4+IGNsYXNzIENvbG9yKE5vVmFsdWUpOgorICAgIC4uLiAgICAgcmVkID0gJ3N0b3AnCisgICAgLi4uICAgICBncmVlbiA9ICdnbycKKyAgICAuLi4gICAgIGJsdWUgPSAndG9vIGZhc3QhJworICAgIC4uLgorICAgID4+PiBDb2xvci5ncmVlbgorICAgIDxDb2xvci5ncmVlbj4KKyAgICA+Pj4gQ29sb3IuZ3JlZW4udmFsdWUKKyAgICAnZ28nCisKKworVXNpbmcgYSBjdXN0b20gOm1ldGg6YF9fbmV3X19gCisiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIKKworVXNpbmcgYW4gYXV0by1udW1iZXJpbmcgOm1ldGg6YF9fbmV3X19gIHdvdWxkIGxvb2sgbGlrZTo6CisKKyAgICA+Pj4gY2xhc3MgQXV0b051bWJlcihOb1ZhbHVlKToKICAgICAuLi4gICAgIGRlZiBfX25ld19fKGNscyk6CiAgICAgLi4uICAgICAgICAgdmFsdWUgPSBsZW4oY2xzLl9fbWVtYmVyc19fKSArIDEKICAgICAuLi4gICAgICAgICBvYmogPSBvYmplY3QuX19uZXdfXyhjbHMpCkBAIC01ODksOCArNzY1LDExIEBACiAgICAgLi4uICAgICBncmVlbiA9ICgpCiAgICAgLi4uICAgICBibHVlID0gKCkKICAgICAuLi4KLSAgICA+Pj4gQ29sb3IuZ3JlZW4udmFsdWUgPT0gMgotICAgIFRydWUKKyAgICA+Pj4gQ29sb3IuZ3JlZW4KKyAgICA8Q29sb3IuZ3JlZW4+CisgICAgPj4+IENvbG9yLmdyZWVuLnZhbHVlCisgICAgMgorCiAKIC4uIG5vdGU6OgogCkBAIC03MzAsMTAgKzkwOSw1NyBAQAogRmluZXIgUG9pbnRzCiBeXl5eXl5eXl5eXl4KIAotOmNsYXNzOmBFbnVtYCBtZW1iZXJzIGFyZSBpbnN0YW5jZXMgb2YgYW4gOmNsYXNzOmBFbnVtYCBjbGFzcywgYW5kIGV2ZW4KLXRob3VnaCB0aGV5IGFyZSBhY2Nlc3NpYmxlIGFzIGBFbnVtQ2xhc3MubWVtYmVyYCwgdGhleSBzaG91bGQgbm90IGJlIGFjY2Vzc2VkCi1kaXJlY3RseSBmcm9tIHRoZSBtZW1iZXIgYXMgdGhhdCBsb29rdXAgbWF5IGZhaWwgb3IsIHdvcnNlLCByZXR1cm4gc29tZXRoaW5nCi1iZXNpZGVzIHRoZSA6Y2xhc3M6YEVudW1gIG1lbWJlciB5b3UgbG9va2luZyBmb3I6OgorU3VwcG9ydGVkIGBgX19kdW5kZXJfX2BgIG5hbWVzCisiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIKKworOmF0dHI6YF9fbWVtYmVyc19fYCBpcyBhbiA6Y2xhc3M6YE9yZGVyZWREaWN0YCBvZiBgYG1lbWJlcl9uYW1lYGA6YGBtZW1iZXJgYAoraXRlbXMuICBJdCBpcyBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgY2xhc3MuCisKKzptZXRoOmBfX25ld19fYCwgaWYgc3BlY2lmaWVkLCBtdXN0IGNyZWF0ZSBhbmQgcmV0dXJuIHRoZSBlbnVtIG1lbWJlcnM7IGl0IGlzCithbHNvIGEgdmVyeSBnb29kIGlkZWEgdG8gc2V0IHRoZSBtZW1iZXIncyA6YXR0cjpgX3ZhbHVlX2AgYXBwcm9wcmlhdGVseS4gIE9uY2UKK2FsbCB0aGUgbWVtYmVycyBhcmUgY3JlYXRlZCBpdCBpcyBubyBsb25nZXIgdXNlZC4KKworCitTdXBwb3J0ZWQgYGBfc3VuZGVyX2BgIG5hbWVzCisiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiCisKKy0gYGBfbmFtZV9gYCAtLSBuYW1lIG9mIHRoZSBtZW1iZXIKKy0gYGBfdmFsdWVfYGAgLS0gdmFsdWUgb2YgdGhlIG1lbWJlcjsgY2FuIGJlIHNldCAvIG1vZGlmaWVkIGluIGBgX19uZXdfX2BgCisKKy0gYGBfbWlzc2luZ19gYCAtLSBhIGxvb2t1cCBmdW5jdGlvbiB1c2VkIHdoZW4gYSB2YWx1ZSBpcyBub3QgZm91bmQ7IG1heSBiZQorICBvdmVycmlkZGVuCistIGBgX29yZGVyX2BgIC0tIHVzZWQgaW4gUHl0aG9uIDIvMyBjb2RlIHRvIGVuc3VyZSBtZW1iZXIgb3JkZXIgaXMgY29uc2lzdGVudAorICAoY2xhc3MgYXR0cmlidXRlLCByZW1vdmVkIGR1cmluZyBjbGFzcyBjcmVhdGlvbikKKworLi4gdmVyc2lvbmFkZGVkOjogMy42IGBgX21pc3NpbmdfYGAsIGBgX29yZGVyX2BgCisKK1RvIGhlbHAga2VlcCBQeXRob24gMiAvIFB5dGhvbiAzIGNvZGUgaW4gc3luYyBhbiA6YXR0cjpgX29yZGVyX2AgYXR0cmlidXRlIGNhbgorYmUgcHJvdmlkZWQuICBJdCB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgYWN0dWFsIG9yZGVyIG9mIHRoZSBlbnVtZXJhdGlvbgorYW5kIHJhaXNlIGFuIGVycm9yIGlmIHRoZSB0d28gZG8gbm90IG1hdGNoOjoKKworICAgID4+PiBjbGFzcyBDb2xvcihFbnVtKToKKyAgICAuLi4gICAgIF9vcmRlcl8gPSAncmVkIGdyZWVuIGJsdWUnCisgICAgLi4uICAgICByZWQgPSAxCisgICAgLi4uICAgICBibHVlID0gMworICAgIC4uLiAgICAgZ3JlZW4gPSAyCisgICAgLi4uCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLgorICAgIFR5cGVFcnJvcjogbWVtYmVyIG9yZGVyIGRvZXMgbm90IG1hdGNoIF9vcmRlcl8KKworLi4gbm90ZTo6CisKKyAgICBJbiBQeXRob24gMiBjb2RlIHRoZSA6YXR0cjpgX29yZGVyX2AgYXR0cmlidXRlIGlzIG5lY2Vzc2FyeSBhcyBkZWZpbml0aW9uCisgICAgb3JkZXIgaXMgbG9zdCBiZWZvcmUgaXQgY2FuIGJlIHJlY29yZGVkLgorCitgYEVudW1gYCBtZW1iZXIgdHlwZQorIiIiIiIiIiIiIiIiIiIiIiIiIiIKKworOmNsYXNzOmBFbnVtYCBtZW1iZXJzIGFyZSBpbnN0YW5jZXMgb2YgdGhlaXIgOmNsYXNzOmBFbnVtYCBjbGFzcywgYW5kIGFyZQorbm9ybWFsbHkgYWNjZXNzZWQgYXMgYGBFbnVtQ2xhc3MubWVtYmVyYGAuICBVbmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgdGhleQorY2FuIGFsc28gYmUgYWNjZXNzZWQgYXMgYGBFbnVtQ2xhc3MubWVtYmVyLm1lbWJlcmBgLCBidXQgeW91IHNob3VsZCBuZXZlciBkbwordGhpcyBhcyB0aGF0IGxvb2t1cCBtYXkgZmFpbCBvciwgd29yc2UsIHJldHVybiBzb21ldGhpbmcgYmVzaWRlcyB0aGUKKzpjbGFzczpgRW51bWAgbWVtYmVyIHlvdSBhcmUgbG9va2luZyBmb3I6OgogCiAgICAgPj4+IGNsYXNzIEZpZWxkVHlwZXMoRW51bSk6CiAgICAgLi4uICAgICBuYW1lID0gMApAQCAtNzQ3LDcgKzk3MywyNCBAQAogCiAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQogCi1UaGUgOmF0dHI6YF9fbWVtYmVyc19fYCBhdHRyaWJ1dGUgaXMgb25seSBhdmFpbGFibGUgb24gdGhlIGNsYXNzLgorCitCb29sZWFuIHZhbHVlIG9mIGBgRW51bWBgIGNsYXNzZXMgYW5kIG1lbWJlcnMKKyIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIgorCis6Y2xhc3M6YEVudW1gIG1lbWJlcnMgdGhhdCBhcmUgbWl4ZWQgd2l0aCBub24tOmNsYXNzOmBFbnVtYCB0eXBlcyAoc3VjaCBhcworOmNsYXNzOmBpbnRgLCA6Y2xhc3M6YHN0cmAsIGV0Yy4pIGFyZSBldmFsdWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBtaXhlZC1pbgordHlwZSdzIHJ1bGVzOyBvdGhlcndpc2UsIGFsbCBtZW1iZXJzIGV2YWx1YXRlIGFzIDpkYXRhOmBUcnVlYC4gIFRvIG1ha2UgeW91cgorb3duIEVudW0ncyBib29sZWFuIGV2YWx1YXRpb24gZGVwZW5kIG9uIHRoZSBtZW1iZXIncyB2YWx1ZSBhZGQgdGhlIGZvbGxvd2luZyB0bworeW91ciBjbGFzczo6CisKKyAgICBkZWYgX19ib29sX18oc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYudmFsdWUpCisKKzpjbGFzczpgRW51bWAgY2xhc3NlcyBhbHdheXMgZXZhbHVhdGUgYXMgOmRhdGE6YFRydWVgLgorCisKK2BgRW51bWBgIGNsYXNzZXMgd2l0aCBtZXRob2RzCisiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIgogCiBJZiB5b3UgZ2l2ZSB5b3VyIDpjbGFzczpgRW51bWAgc3ViY2xhc3MgZXh0cmEgbWV0aG9kcywgbGlrZSB0aGUgYFBsYW5ldGBfCiBjbGFzcyBhYm92ZSwgdGhvc2UgbWV0aG9kcyB3aWxsIHNob3cgdXAgaW4gYSA6ZnVuYzpgZGlyYCBvZiB0aGUgbWVtYmVyLApAQCAtNzU4LDExICsxMDAxLDMgQEAKICAgICA+Pj4gZGlyKFBsYW5ldC5FQVJUSCkKICAgICBbJ19fY2xhc3NfXycsICdfX2RvY19fJywgJ19fbW9kdWxlX18nLCAnbmFtZScsICdzdXJmYWNlX2dyYXZpdHknLCAndmFsdWUnXQogCi1UaGUgOm1ldGg6YF9fbmV3X19gIG1ldGhvZCB3aWxsIG9ubHkgYmUgdXNlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZQotOmNsYXNzOmBFbnVtYCBtZW1iZXJzIC0tIGFmdGVyIHRoYXQgaXQgaXMgcmVwbGFjZWQuICBBbnkgY3VzdG9tIDptZXRoOmBfX25ld19fYAotbWV0aG9kIG11c3QgY3JlYXRlIHRoZSBvYmplY3QgYW5kIHNldCB0aGUgOmF0dHI6YF92YWx1ZV9gIGF0dHJpYnV0ZQotYXBwcm9wcmlhdGVseS4KLQotSWYgeW91IHdpc2ggdG8gY2hhbmdlIGhvdyA6Y2xhc3M6YEVudW1gIG1lbWJlcnMgYXJlIGxvb2tlZCB1cCB5b3Ugc2hvdWxkIGVpdGhlcgotd3JpdGUgYSBoZWxwZXIgZnVuY3Rpb24gb3IgYSA6ZnVuYzpgY2xhc3NtZXRob2RgIGZvciB0aGUgOmNsYXNzOmBFbnVtYAotc3ViY2xhc3MuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9leGNlcHRpb25zLnJzdCBiL0RvYy9saWJyYXJ5L2V4Y2VwdGlvbnMucnN0CmluZGV4IDVhNzE5MzMuLmE0MjhmNTEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2V4Y2VwdGlvbnMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2V4Y2VwdGlvbnMucnN0CkBAIC0xNzAsOCArMTcwLDkgQEAKIAogLi4gZXhjZXB0aW9uOjogSW1wb3J0RXJyb3IKIAotICAgUmFpc2VkIHdoZW4gYW4gOmtleXdvcmQ6YGltcG9ydGAgc3RhdGVtZW50IGZhaWxzIHRvIGZpbmQgdGhlIG1vZHVsZSBkZWZpbml0aW9uCi0gICBvciB3aGVuIGEgYGBmcm9tIC4uLiBpbXBvcnRgYCBmYWlscyB0byBmaW5kIGEgbmFtZSB0aGF0IGlzIHRvIGJlIGltcG9ydGVkLgorICAgUmFpc2VkIHdoZW4gdGhlIDprZXl3b3JkOmBpbXBvcnRgIHN0YXRlbWVudCBoYXMgdHJvdWJsZXMgdHJ5aW5nIHRvCisgICBsb2FkIGEgbW9kdWxlLiAgQWxzbyByYWlzZWQgd2hlbiB0aGUgImZyb20gbGlzdCIgaW4gYGBmcm9tIC4uLiBpbXBvcnRgYAorICAgaGFzIGEgbmFtZSB0aGF0IGNhbm5vdCBiZSBmb3VuZC4KIAogICAgVGhlIDphdHRyOmBuYW1lYCBhbmQgOmF0dHI6YHBhdGhgIGF0dHJpYnV0ZXMgY2FuIGJlIHNldCB1c2luZyBrZXl3b3JkLW9ubHkKICAgIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IuIFdoZW4gc2V0IHRoZXkgcmVwcmVzZW50IHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKQEAgLTE4MSw2ICsxODIsMTQgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCiAgICAgICBBZGRlZCB0aGUgOmF0dHI6YG5hbWVgIGFuZCA6YXR0cjpgcGF0aGAgYXR0cmlidXRlcy4KIAorLi4gZXhjZXB0aW9uOjogTW9kdWxlTm90Rm91bmRFcnJvcgorCisgICBBIHN1YmNsYXNzIG9mIDpleGM6YEltcG9ydEVycm9yYCB3aGljaCBpcyByYWlzZWQgYnkgOmtleXdvcmQ6YGltcG9ydGAKKyAgIHdoZW4gYSBtb2R1bGUgY291bGQgbm90IGJlIGxvY2F0ZWQuICBJdCBpcyBhbHNvIHJhaXNlZCB3aGVuIGBgTm9uZWBgCisgICBpcyBmb3VuZCBpbiA6ZGF0YTpgc3lzLm1vZHVsZXNgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogCiAuLiBleGNlcHRpb246OiBJbmRleEVycm9yCiAKQEAgLTIyOCw5ICsyMzcsMjEgQEAKIC4uIGV4Y2VwdGlvbjo6IE5vdEltcGxlbWVudGVkRXJyb3IKIAogICAgVGhpcyBleGNlcHRpb24gaXMgZGVyaXZlZCBmcm9tIDpleGM6YFJ1bnRpbWVFcnJvcmAuICBJbiB1c2VyIGRlZmluZWQgYmFzZQotICAgY2xhc3NlcywgYWJzdHJhY3QgbWV0aG9kcyBzaG91bGQgcmFpc2UgdGhpcyBleGNlcHRpb24gd2hlbiB0aGV5IHJlcXVpcmUgZGVyaXZlZAotICAgY2xhc3NlcyB0byBvdmVycmlkZSB0aGUgbWV0aG9kLgorICAgY2xhc3NlcywgYWJzdHJhY3QgbWV0aG9kcyBzaG91bGQgcmFpc2UgdGhpcyBleGNlcHRpb24gd2hlbiB0aGV5IHJlcXVpcmUKKyAgIGRlcml2ZWQgY2xhc3NlcyB0byBvdmVycmlkZSB0aGUgbWV0aG9kLCBvciB3aGlsZSB0aGUgY2xhc3MgaXMgYmVpbmcKKyAgIGRldmVsb3BlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZWFsIGltcGxlbWVudGF0aW9uIHN0aWxsIG5lZWRzIHRvIGJlIGFkZGVkLgogCisgICAuLiBub3RlOjoKKworICAgICAgSXQgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgYW4gb3BlcmF0ZXIgb3IgbWV0aG9kIGlzIG5vdAorICAgICAgbWVhbnQgdG8gYmUgc3VwcG9ydGVkIGF0IGFsbCAtLSBpbiB0aGF0IGNhc2UgZWl0aGVyIGxlYXZlIHRoZSBvcGVyYXRvciAvCisgICAgICBtZXRob2QgdW5kZWZpbmVkIG9yLCBpZiBhIHN1YmNsYXNzLCBzZXQgaXQgdG8gOmRhdGE6YE5vbmVgLgorCisgICAuLiBub3RlOjoKKworICAgICAgYGBOb3RJbXBsZW1lbnRlZEVycm9yYGAgYW5kIGBgTm90SW1wbGVtZW50ZWRgYCBhcmUgbm90IGludGVyY2hhbmdlYWJsZSwKKyAgICAgIGV2ZW4gdGhvdWdoIHRoZXkgaGF2ZSBzaW1pbGFyIG5hbWVzIGFuZCBwdXJwb3Nlcy4gIFNlZQorICAgICAgOmRhdGE6YE5vdEltcGxlbWVudGVkYCBmb3IgZGV0YWlscyBvbiB3aGVuIHRvIHVzZSBpdC4KIAogLi4gZXhjZXB0aW9uOjogT1NFcnJvcihbYXJnXSkKICAgICAgICAgICAgICAgIE9TRXJyb3IoZXJybm8sIHN0cmVycm9yWywgZmlsZW5hbWVbLCB3aW5lcnJvclssIGZpbGVuYW1lMl1dXSkKQEAgLTQzNiw2ICs0NTcsMTUgQEAKICAgIFJhaXNlZCB3aGVuIGFuIG9wZXJhdGlvbiBvciBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIGFuIG9iamVjdCBvZiBpbmFwcHJvcHJpYXRlCiAgICB0eXBlLiAgVGhlIGFzc29jaWF0ZWQgdmFsdWUgaXMgYSBzdHJpbmcgZ2l2aW5nIGRldGFpbHMgYWJvdXQgdGhlIHR5cGUgbWlzbWF0Y2guCiAKKyAgIFRoaXMgZXhjZXB0aW9uIG1heSBiZSByYWlzZWQgYnkgdXNlciBjb2RlIHRvIGluZGljYXRlIHRoYXQgYW4gYXR0ZW1wdGVkCisgICBvcGVyYXRpb24gb24gYW4gb2JqZWN0IGlzIG5vdCBzdXBwb3J0ZWQsIGFuZCBpcyBub3QgbWVhbnQgdG8gYmUuIElmIGFuIG9iamVjdAorICAgaXMgbWVhbnQgdG8gc3VwcG9ydCBhIGdpdmVuIG9wZXJhdGlvbiBidXQgaGFzIG5vdCB5ZXQgcHJvdmlkZWQgYW4KKyAgIGltcGxlbWVudGF0aW9uLCA6ZXhjOmBOb3RJbXBsZW1lbnRlZEVycm9yYCBpcyB0aGUgcHJvcGVyIGV4Y2VwdGlvbiB0byByYWlzZS4KKworICAgUGFzc2luZyBhcmd1bWVudHMgb2YgdGhlIHdyb25nIHR5cGUgKGUuZy4gcGFzc2luZyBhIDpjbGFzczpgbGlzdGAgd2hlbiBhbgorICAgOmNsYXNzOmBpbnRgIGlzIGV4cGVjdGVkKSBzaG91bGQgcmVzdWx0IGluIGEgOmV4YzpgVHlwZUVycm9yYCwgYnV0IHBhc3NpbmcKKyAgIGFyZ3VtZW50cyB3aXRoIHRoZSB3cm9uZyB2YWx1ZSAoZS5nLiBhIG51bWJlciBvdXRzaWRlIGV4cGVjdGVkIGJvdW5kYXJpZXMpCisgICBzaG91bGQgcmVzdWx0IGluIGEgOmV4YzpgVmFsdWVFcnJvcmAuCiAKIC4uIGV4Y2VwdGlvbjo6IFVuYm91bmRMb2NhbEVycm9yCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ZhdWx0aGFuZGxlci5yc3QgYi9Eb2MvbGlicmFyeS9mYXVsdGhhbmRsZXIucnN0CmluZGV4IGRlZWRlYTEuLmQwYzRjZDAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ZhdWx0aGFuZGxlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZmF1bHRoYW5kbGVyLnJzdApAQCAtNzAsNiArNzAsOSBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHBhc3NpbmcgZmlsZSBkZXNjcmlwdG9yIHRvIHRoaXMgZnVuY3Rpb24uCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBPbiBXaW5kb3dzLCBhIGhhbmRsZXIgZm9yIFdpbmRvd3MgZXhjZXB0aW9uIGlzIGFsc28gaW5zdGFsbGVkLgorCiAuLiBmdW5jdGlvbjo6IGRpc2FibGUoKQogCiAgICBEaXNhYmxlIHRoZSBmYXVsdCBoYW5kbGVyOiB1bmluc3RhbGwgdGhlIHNpZ25hbCBoYW5kbGVycyBpbnN0YWxsZWQgYnkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ZpbGVpbnB1dC5yc3QgYi9Eb2MvbGlicmFyeS9maWxlaW5wdXQucnN0CmluZGV4IGFhNGM1MjkuLjU4ODFmZWYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ZpbGVpbnB1dC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZmlsZWlucHV0LnJzdApAQCAtNzIsOSArNzIsOCBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjIKICAgICAgIENhbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyLgogCi0gICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNS4yCi0gICAgICBUaGUgKmJ1ZnNpemUqIHBhcmFtZXRlciBpcyBubyBsb25nZXIgdXNlZC4KLQorICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy42IDMuOAorICAgICAgVGhlICpidWZzaXplKiBwYXJhbWV0ZXIuCiAKIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHVzZSB0aGUgZ2xvYmFsIHN0YXRlIGNyZWF0ZWQgYnkgOmZ1bmM6YGZpbGVpbnB1dC5pbnB1dGA7CiBpZiB0aGVyZSBpcyBubyBhY3RpdmUgc3RhdGUsIDpleGM6YFJ1bnRpbWVFcnJvcmAgaXMgcmFpc2VkLgpAQCAtMTY3LDggKzE2Niw4IEBACiAgICAuLiBkZXByZWNhdGVkOjogMy40CiAgICAgICBUaGUgYGAnclUnYGAgYW5kIGBgJ1UnYGAgbW9kZXMuCiAKLSAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41LjIKLSAgICAgIFRoZSAqYnVmc2l6ZSogcGFyYW1ldGVyIGlzIG5vIGxvbmdlciB1c2VkLgorICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy42IDMuOAorICAgICAgVGhlICpidWZzaXplKiBwYXJhbWV0ZXIuCiAKIAogKipPcHRpb25hbCBpbi1wbGFjZSBmaWx0ZXJpbmc6KiogaWYgdGhlIGtleXdvcmQgYXJndW1lbnQgYGBpbnBsYWNlPVRydWVgYCBpcwpAQCAtMTk1LDEwICsxOTQsMTQgQEAKICAgIFVzYWdlIGV4YW1wbGU6ICBgYGZpID0gZmlsZWlucHV0LkZpbGVJbnB1dChvcGVuaG9vaz1maWxlaW5wdXQuaG9va19jb21wcmVzc2VkKWBgCiAKIAotLi4gZnVuY3Rpb246OiBob29rX2VuY29kZWQoZW5jb2RpbmcpCisuLiBmdW5jdGlvbjo6IGhvb2tfZW5jb2RlZChlbmNvZGluZywgZXJyb3JzPU5vbmUpCiAKICAgIFJldHVybnMgYSBob29rIHdoaWNoIG9wZW5zIGVhY2ggZmlsZSB3aXRoIDpmdW5jOmBvcGVuYCwgdXNpbmcgdGhlIGdpdmVuCi0gICAqZW5jb2RpbmcqIHRvIHJlYWQgdGhlIGZpbGUuCisgICAqZW5jb2RpbmcqIGFuZCAqZXJyb3JzKiB0byByZWFkIHRoZSBmaWxlLgogCiAgICBVc2FnZSBleGFtcGxlOiBgYGZpID0KLSAgIGZpbGVpbnB1dC5GaWxlSW5wdXQob3Blbmhvb2s9ZmlsZWlucHV0Lmhvb2tfZW5jb2RlZCgiaXNvLTg4NTktMSIpKWBgCisgICBmaWxlaW5wdXQuRmlsZUlucHV0KG9wZW5ob29rPWZpbGVpbnB1dC5ob29rX2VuY29kZWQoInV0Zi04IiwKKyAgICJzdXJyb2dhdGVlc2NhcGUiKSlgYAorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlIG9wdGlvbmFsICplcnJvcnMqIHBhcmFtZXRlci4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2Z1bmN0aW9ucy5yc3QgYi9Eb2MvbGlicmFyeS9mdW5jdGlvbnMucnN0CmluZGV4IDVhZjlmZTQuLmRiMDRiMTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2Z1bmN0aW9ucy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZnVuY3Rpb25zLnJzdApAQCAtODc4LDExICs4NzgsMTEgQEAKICAgIE9wZW4gKmZpbGUqIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nIDp0ZXJtOmBmaWxlIG9iamVjdGAuICBJZiB0aGUgZmlsZQogICAgY2Fubm90IGJlIG9wZW5lZCwgYW4gOmV4YzpgT1NFcnJvcmAgaXMgcmFpc2VkLgogCi0gICAqZmlsZSogaXMgZWl0aGVyIGEgc3RyaW5nIG9yIGJ5dGVzIG9iamVjdCBnaXZpbmcgdGhlIHBhdGhuYW1lIChhYnNvbHV0ZSBvcgotICAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkpIG9mIHRoZSBmaWxlIHRvIGJlIG9wZW5lZCBvcgotICAgYW4gaW50ZWdlciBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGZpbGUgdG8gYmUgd3JhcHBlZC4gIChJZiBhIGZpbGUgZGVzY3JpcHRvcgotICAgaXMgZ2l2ZW4sIGl0IGlzIGNsb3NlZCB3aGVuIHRoZSByZXR1cm5lZCBJL08gb2JqZWN0IGlzIGNsb3NlZCwgdW5sZXNzCi0gICAqY2xvc2VmZCogaXMgc2V0IHRvIGBgRmFsc2VgYC4pCisgICAqZmlsZSogaXMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAgZ2l2aW5nIHRoZSBwYXRobmFtZSAoYWJzb2x1dGUgb3IKKyAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5KSBvZiB0aGUgZmlsZSB0byBiZSBvcGVuZWQgb3IgYW4KKyAgIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWxlIHRvIGJlIHdyYXBwZWQuICAoSWYgYSBmaWxlIGRlc2NyaXB0b3IgaXMKKyAgIGdpdmVuLCBpdCBpcyBjbG9zZWQgd2hlbiB0aGUgcmV0dXJuZWQgSS9PIG9iamVjdCBpcyBjbG9zZWQsIHVubGVzcyAqY2xvc2VmZCoKKyAgIGlzIHNldCB0byBgYEZhbHNlYGAuKQogCiAgICAqbW9kZSogaXMgYW4gb3B0aW9uYWwgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBtb2RlIGluIHdoaWNoIHRoZSBmaWxlIGlzCiAgICBvcGVuZWQuICBJdCBkZWZhdWx0cyB0byBgYCdyJ2BgIHdoaWNoIG1lYW5zIG9wZW4gZm9yIHJlYWRpbmcgaW4gdGV4dCBtb2RlLgpAQCAtMTA1NSwyNyArMTA1NSwzOCBAQAogICAgKHdoZXJlIDpmdW5jOmBvcGVuYCBpcyBkZWNsYXJlZCksIDptb2Q6YG9zYCwgOm1vZDpgb3MucGF0aGAsIDptb2Q6YHRlbXBmaWxlYCwKICAgIGFuZCA6bW9kOmBzaHV0aWxgLgogCi0gICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMwotICAgICAgVGhlICpvcGVuZXIqIHBhcmFtZXRlciB3YXMgYWRkZWQuCi0gICAgICBUaGUgYGAneCdgYCBtb2RlIHdhcyBhZGRlZC4KLSAgICAgIDpleGM6YElPRXJyb3JgIHVzZWQgdG8gYmUgcmFpc2VkLCBpdCBpcyBub3cgYW4gYWxpYXMgb2YgOmV4YzpgT1NFcnJvcmAuCi0gICAgICA6ZXhjOmBGaWxlRXhpc3RzRXJyb3JgIGlzIG5vdyByYWlzZWQgaWYgdGhlIGZpbGUgb3BlbmVkIGluIGV4Y2x1c2l2ZQotICAgICAgY3JlYXRpb24gbW9kZSAoYGAneCdgYCkgYWxyZWFkeSBleGlzdHMuCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6CisgICAgICAzLjMKIAotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjQKLSAgICAgIFRoZSBmaWxlIGlzIG5vdyBub24taW5oZXJpdGFibGUuCisgICAgICAgICAqIFRoZSAqb3BlbmVyKiBwYXJhbWV0ZXIgd2FzIGFkZGVkLgorICAgICAgICAgKiBUaGUgYGAneCdgYCBtb2RlIHdhcyBhZGRlZC4KKyAgICAgICAgICogOmV4YzpgSU9FcnJvcmAgdXNlZCB0byBiZSByYWlzZWQsIGl0IGlzIG5vdyBhbiBhbGlhcyBvZiA6ZXhjOmBPU0Vycm9yYC4KKyAgICAgICAgICogOmV4YzpgRmlsZUV4aXN0c0Vycm9yYCBpcyBub3cgcmFpc2VkIGlmIHRoZSBmaWxlIG9wZW5lZCBpbiBleGNsdXNpdmUKKyAgICAgICAgICogY3JlYXRpb24gbW9kZSAoYGAneCdgYCkgYWxyZWFkeSBleGlzdHMuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjoKKyAgICAgIDMuNAorCisgICAgICAgICAqIFRoZSBmaWxlIGlzIG5vdyBub24taW5oZXJpdGFibGUuCiAKICAgIC4uIGRlcHJlY2F0ZWQtcmVtb3ZlZDo6IDMuNCA0LjAKIAogICAgICAgVGhlIGBgJ1UnYGAgbW9kZS4KIAotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKLSAgICAgIElmIHRoZSBzeXN0ZW0gY2FsbCBpcyBpbnRlcnJ1cHRlZCBhbmQgdGhlIHNpZ25hbCBoYW5kbGVyIGRvZXMgbm90IHJhaXNlIGFuCi0gICAgICBleGNlcHRpb24sIHRoZSBmdW5jdGlvbiBub3cgcmV0cmllcyB0aGUgc3lzdGVtIGNhbGwgaW5zdGVhZCBvZiByYWlzaW5nIGFuCi0gICAgICA6ZXhjOmBJbnRlcnJ1cHRlZEVycm9yYCBleGNlcHRpb24gKHNlZSA6cGVwOmA0NzVgIGZvciB0aGUgcmF0aW9uYWxlKS4KKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjoKKyAgICAgIDMuNQogCi0gICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQotICAgICAgVGhlIGBgJ25hbWVyZXBsYWNlJ2BgIGVycm9yIGhhbmRsZXIgd2FzIGFkZGVkLgorICAgICAgICAgKiBJZiB0aGUgc3lzdGVtIGNhbGwgaXMgaW50ZXJydXB0ZWQgYW5kIHRoZSBzaWduYWwgaGFuZGxlciBkb2VzIG5vdCByYWlzZSBhbgorICAgICAgICAgICBleGNlcHRpb24sIHRoZSBmdW5jdGlvbiBub3cgcmV0cmllcyB0aGUgc3lzdGVtIGNhbGwgaW5zdGVhZCBvZiByYWlzaW5nIGFuCisgICAgICAgICAgIDpleGM6YEludGVycnVwdGVkRXJyb3JgIGV4Y2VwdGlvbiAoc2VlIDpwZXA6YDQ3NWAgZm9yIHRoZSByYXRpb25hbGUpLgorICAgICAgICAgKiBUaGUgYGAnbmFtZXJlcGxhY2UnYGAgZXJyb3IgaGFuZGxlciB3YXMgYWRkZWQuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjoKKyAgICAgIDMuNgorCisgICAgICAgICAqIFN1cHBvcnQgYWRkZWQgdG8gYWNjZXB0IG9iamVjdHMgaW1wbGVtZW50aW5nIDpjbGFzczpgb3MuUGF0aExpa2VgLgorICAgICAgICAgKiBPbiBXaW5kb3dzLCBvcGVuaW5nIGEgY29uc29sZSBidWZmZXIgbWF5IHJldHVybiBhIHN1YmNsYXNzIG9mCisgICAgICAgICAgIDpjbGFzczpgaW8uUmF3SU9CYXNlYCBvdGhlciB0aGFuIDpjbGFzczpgaW8uRmlsZUlPYC4KIAogLi4gZnVuY3Rpb246OiBvcmQoYykKIApAQCAtMTQ2MCw2ICsxNDcxLDkgQEAKIAogICAgU2VlIGFsc28gOnJlZjpgYmx0aW4tdHlwZS1vYmplY3RzYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFN1YmNsYXNzZXMgb2YgOmNsYXNzOmB0eXBlYCB3aGljaCBkb24ndCBvdmVycmlkZSBgYHR5cGUuX19uZXdfX2BgIG1heSBubworICAgICAgbG9uZ2VyIHVzZSB0aGUgb25lLWFyZ3VtZW50IGZvcm0gdG8gZ2V0IHRoZSB0eXBlIG9mIGFuIG9iamVjdC4KIAogLi4gZnVuY3Rpb246OiB2YXJzKFtvYmplY3RdKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9nbG9iLnJzdCBiL0RvYy9saWJyYXJ5L2dsb2IucnN0CmluZGV4IDMyOGVlZjMuLmE4YTVhNTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2dsb2IucnN0CisrKyBiL0RvYy9saWJyYXJ5L2dsb2IucnN0CkBAIC0xNCw3ICsxNCw3IEBACiBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIHVzZWQgYnkgdGhlIFVuaXggc2hlbGwsIGFsdGhvdWdoIHJlc3VsdHMgYXJlIHJldHVybmVkIGluCiBhcmJpdHJhcnkgb3JkZXIuICBObyB0aWxkZSBleHBhbnNpb24gaXMgZG9uZSwgYnV0IGBgKmBgLCBgYD9gYCwgYW5kIGNoYXJhY3RlcgogcmFuZ2VzIGV4cHJlc3NlZCB3aXRoIGBgW11gYCB3aWxsIGJlIGNvcnJlY3RseSBtYXRjaGVkLiAgVGhpcyBpcyBkb25lIGJ5IHVzaW5nCi10aGUgOmZ1bmM6YG9zLmxpc3RkaXJgIGFuZCA6ZnVuYzpgZm5tYXRjaC5mbm1hdGNoYCBmdW5jdGlvbnMgaW4gY29uY2VydCwgYW5kCit0aGUgOmZ1bmM6YG9zLnNjYW5kaXJgIGFuZCA6ZnVuYzpgZm5tYXRjaC5mbm1hdGNoYCBmdW5jdGlvbnMgaW4gY29uY2VydCwgYW5kCiBub3QgYnkgYWN0dWFsbHkgaW52b2tpbmcgYSBzdWJzaGVsbC4gIE5vdGUgdGhhdCB1bmxpa2UgOmZ1bmM6YGZubWF0Y2guZm5tYXRjaGAsCiA6bW9kOmBnbG9iYCB0cmVhdHMgZmlsZW5hbWVzIGJlZ2lubmluZyB3aXRoIGEgZG90IChgYC5gYCkgYXMgc3BlY2lhbCBjYXNlcy4KIChGb3IgdGlsZGUgYW5kIHNoZWxsIHZhcmlhYmxlIGV4cGFuc2lvbiwgdXNlIDpmdW5jOmBvcy5wYXRoLmV4cGFuZHVzZXJgIGFuZApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZ3JwLnJzdCBiL0RvYy9saWJyYXJ5L2dycC5yc3QKaW5kZXggYTMwZTYyMi4uNzRkZTNmOSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZ3JwLnJzdAorKysgYi9Eb2MvbGlicmFyeS9ncnAucnN0CkBAIC00Myw2ICs0Myw5IEBACiAgICBSZXR1cm4gdGhlIGdyb3VwIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gbnVtZXJpYyBncm91cCBJRC4gOmV4YzpgS2V5RXJyb3JgCiAgICBpcyByYWlzZWQgaWYgdGhlIGVudHJ5IGFza2VkIGZvciBjYW5ub3QgYmUgZm91bmQuCiAKKyAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKKyAgICAgIFNpbmNlIFB5dGhvbiAzLjYgdGhlIHN1cHBvcnQgb2Ygbm9uLWludGVnZXIgYXJndW1lbnRzIGxpa2UgZmxvYXRzIG9yCisgICAgICBzdHJpbmdzIGluIDpmdW5jOmBnZXRncmdpZGAgaXMgZGVwcmVjYXRlZC4KIAogLi4gZnVuY3Rpb246OiBnZXRncm5hbShuYW1lKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9oYXNobGliLWJsYWtlMi10cmVlLnBuZyBiL0RvYy9saWJyYXJ5L2hhc2hsaWItYmxha2UyLXRyZWUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMGRjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGlicmFyeS9oYXNobGliLWJsYWtlMi10cmVlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9oYXNobGliLWJsYWtlMi5yc3QgYi9Eb2MvbGlicmFyeS9oYXNobGliLWJsYWtlMi5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI1ZTQ0MQotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWJyYXJ5L2hhc2hsaWItYmxha2UyLnJzdApAQCAtMCwwICsxLDQ0NCBAQAorLi4gX2hhc2hsaWItYmxha2UyOgorCis6bW9kOmBoYXNobGliYCAtLS0gQkxBS0UyIGhhc2ggZnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy4uIG1vZHVsZTo6IGhhc2hsaWIKKyAgIDpzeW5vcHNpczogQkxBS0UyIGhhc2ggZnVuY3Rpb24gZm9yIFB5dGhvbgorLi4gc2VjdGlvbmF1dGhvcjo6IERtaXRyeSBDaGVzdG55a2gKKworLi4gaW5kZXg6OgorICAgc2luZ2xlOiBibGFrZTJiLCBibGFrZTJzCisKK0JMQUtFMl8gaXMgYSBjcnlwdG9ncmFwaGljIGhhc2ggZnVuY3Rpb24gZGVmaW5lZCBpbiBSRkMtNzY5M18gdGhhdCBjb21lcyBpbiB0d28KK2ZsYXZvcnM6CisKKyogKipCTEFLRTJiKiosIG9wdGltaXplZCBmb3IgNjQtYml0IHBsYXRmb3JtcyBhbmQgcHJvZHVjZXMgZGlnZXN0cyBvZiBhbnkgc2l6ZQorICBiZXR3ZWVuIDEgYW5kIDY0IGJ5dGVzLAorCisqICoqQkxBS0UycyoqLCBvcHRpbWl6ZWQgZm9yIDgtIHRvIDMyLWJpdCBwbGF0Zm9ybXMgYW5kIHByb2R1Y2VzIGRpZ2VzdHMgb2YgYW55CisgIHNpemUgYmV0d2VlbiAxIGFuZCAzMiBieXRlcy4KKworQkxBS0UyIHN1cHBvcnRzICoqa2V5ZWQgbW9kZSoqIChhIGZhc3RlciBhbmQgc2ltcGxlciByZXBsYWNlbWVudCBmb3IgSE1BQ18pLAorKipzYWx0ZWQgaGFzaGluZyoqLCAqKnBlcnNvbmFsaXphdGlvbioqLCBhbmQgKip0cmVlIGhhc2hpbmcqKi4KKworSGFzaCBvYmplY3RzIGZyb20gdGhpcyBtb2R1bGUgZm9sbG93IHRoZSBBUEkgb2Ygc3RhbmRhcmQgbGlicmFyeSdzCis6bW9kOmBoYXNobGliYCBvYmplY3RzLgorCisKK01vZHVsZQorPT09PT09CisKK0NyZWF0aW5nIGhhc2ggb2JqZWN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05ldyBoYXNoIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgY2FsbGluZyBjb25zdHJ1Y3RvciBmdW5jdGlvbnM6CisKKworLi4gZnVuY3Rpb246OiBibGFrZTJiKGRhdGE9YicnLCBkaWdlc3Rfc2l6ZT02NCwga2V5PWInJywgc2FsdD1iJycsIFwKKyAgICAgICAgICAgICAgICBwZXJzb249YicnLCBmYW5vdXQ9MSwgZGVwdGg9MSwgbGVhZl9zaXplPTAsIG5vZGVfb2Zmc2V0PTAsICBcCisgICAgICAgICAgICAgICAgbm9kZV9kZXB0aD0wLCBpbm5lcl9zaXplPTAsIGxhc3Rfbm9kZT1GYWxzZSkKKworLi4gZnVuY3Rpb246OiBibGFrZTJzKGRhdGE9YicnLCBkaWdlc3Rfc2l6ZT0zMiwga2V5PWInJywgc2FsdD1iJycsIFwKKyAgICAgICAgICAgICAgICBwZXJzb249YicnLCBmYW5vdXQ9MSwgZGVwdGg9MSwgbGVhZl9zaXplPTAsIG5vZGVfb2Zmc2V0PTAsICBcCisgICAgICAgICAgICAgICAgbm9kZV9kZXB0aD0wLCBpbm5lcl9zaXplPTAsIGxhc3Rfbm9kZT1GYWxzZSkKKworCitUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGhhc2ggb2JqZWN0cyBmb3IgY2FsY3VsYXRpbmcKK0JMQUtFMmIgb3IgQkxBS0Uycy4gVGhleSBvcHRpb25hbGx5IHRha2UgdGhlc2UgZ2VuZXJhbCBwYXJhbWV0ZXJzOgorCisqICpkYXRhKjogaW5pdGlhbCBjaHVuayBvZiBkYXRhIHRvIGhhc2gsIHdoaWNoIG11c3QgYmUgaW50ZXJwcmV0YWJsZSBhcyBidWZmZXIKKyAgb2YgYnl0ZXMuCisKKyogKmRpZ2VzdF9zaXplKjogc2l6ZSBvZiBvdXRwdXQgZGlnZXN0IGluIGJ5dGVzLgorCisqICprZXkqOiBrZXkgZm9yIGtleWVkIGhhc2hpbmcgKHVwIHRvIDY0IGJ5dGVzIGZvciBCTEFLRTJiLCB1cCB0byAzMiBieXRlcyBmb3IKKyAgQkxBS0UycykuCisKKyogKnNhbHQqOiBzYWx0IGZvciByYW5kb21pemVkIGhhc2hpbmcgKHVwIHRvIDE2IGJ5dGVzIGZvciBCTEFLRTJiLCB1cCB0byA4CisgIGJ5dGVzIGZvciBCTEFLRTJzKS4KKworKiAqcGVyc29uKjogcGVyc29uYWxpemF0aW9uIHN0cmluZyAodXAgdG8gMTYgYnl0ZXMgZm9yIEJMQUtFMmIsIHVwIHRvIDggYnl0ZXMKKyAgZm9yIEJMQUtFMnMpLgorCitUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIGxpbWl0cyBmb3IgZ2VuZXJhbCBwYXJhbWV0ZXJzIChpbiBieXRlcyk6CisKKz09PT09PT0gPT09PT09PT09PT0gPT09PT09PT0gPT09PT09PT09ID09PT09PT09PT09CitIYXNoICAgIGRpZ2VzdF9zaXplIGxlbihrZXkpIGxlbihzYWx0KSBsZW4ocGVyc29uKQorPT09PT09PSA9PT09PT09PT09PSA9PT09PT09PSA9PT09PT09PT0gPT09PT09PT09PT0KK0JMQUtFMmIgICAgIDY0ICAgICAgICAgNjQgICAgICAgMTYgICAgICAgIDE2CitCTEFLRTJzICAgICAzMiAgICAgICAgIDMyICAgICAgIDggICAgICAgICA4Cis9PT09PT09ID09PT09PT09PT09ID09PT09PT09ID09PT09PT09PSA9PT09PT09PT09PQorCisuLiBub3RlOjoKKworICAgIEJMQUtFMiBzcGVjaWZpY2F0aW9uIGRlZmluZXMgY29uc3RhbnQgbGVuZ3RocyBmb3Igc2FsdCBhbmQgcGVyc29uYWxpemF0aW9uCisgICAgcGFyYW1ldGVycywgaG93ZXZlciwgZm9yIGNvbnZlbmllbmNlLCB0aGlzIGltcGxlbWVudGF0aW9uIGFjY2VwdHMgYnl0ZQorICAgIHN0cmluZ3Mgb2YgYW55IHNpemUgdXAgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguIElmIHRoZSBsZW5ndGggb2YgdGhlCisgICAgcGFyYW1ldGVyIGlzIGxlc3MgdGhhbiBzcGVjaWZpZWQsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zLCB0aHVzLCBmb3IKKyAgICBleGFtcGxlLCBgYGInc2FsdCdgYCBhbmQgYGBiJ3NhbHRceDAwJ2BgIGlzIHRoZSBzYW1lIHZhbHVlLiAoVGhpcyBpcyBub3QKKyAgICB0aGUgY2FzZSBmb3IgKmtleSouKQorCitUaGVzZSBzaXplcyBhcmUgYXZhaWxhYmxlIGFzIG1vZHVsZSBgY29uc3RhbnRzYF8gZGVzY3JpYmVkIGJlbG93LgorCitDb25zdHJ1Y3RvciBmdW5jdGlvbnMgYWxzbyBhY2NlcHQgdGhlIGZvbGxvd2luZyB0cmVlIGhhc2hpbmcgcGFyYW1ldGVyczoKKworKiAqZmFub3V0KjogZmFub3V0ICgwIHRvIDI1NSwgMCBpZiB1bmxpbWl0ZWQsIDEgaW4gc2VxdWVudGlhbCBtb2RlKS4KKworKiAqZGVwdGgqOiBtYXhpbWFsIGRlcHRoIG9mIHRyZWUgKDEgdG8gMjU1LCAyNTUgaWYgdW5saW1pdGVkLCAxIGluCisgIHNlcXVlbnRpYWwgbW9kZSkuCisKKyogKmxlYWZfc2l6ZSo6IG1heGltYWwgYnl0ZSBsZW5ndGggb2YgbGVhZiAoMCB0byAyKiozMi0xLCAwIGlmIHVubGltaXRlZCBvciBpbgorICBzZXF1ZW50aWFsIG1vZGUpLgorCisqICpub2RlX29mZnNldCo6IG5vZGUgb2Zmc2V0ICgwIHRvIDIqKjY0LTEgZm9yIEJMQUtFMmIsIDAgdG8gMioqNDgtMSBmb3IKKyAgQkxBS0UycywgMCBmb3IgdGhlIGZpcnN0LCBsZWZ0bW9zdCwgbGVhZiwgb3IgaW4gc2VxdWVudGlhbCBtb2RlKS4KKworKiAqbm9kZV9kZXB0aCo6IG5vZGUgZGVwdGggKDAgdG8gMjU1LCAwIGZvciBsZWF2ZXMsIG9yIGluIHNlcXVlbnRpYWwgbW9kZSkuCisKKyogKmlubmVyX3NpemUqOiBpbm5lciBkaWdlc3Qgc2l6ZSAoMCB0byA2NCBmb3IgQkxBS0UyYiwgMCB0byAzMiBmb3IKKyAgQkxBS0UycywgMCBpbiBzZXF1ZW50aWFsIG1vZGUpLgorCisqICpsYXN0X25vZGUqOiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcHJvY2Vzc2VkIG5vZGUgaXMgdGhlIGxhc3QKKyAgb25lIChgRmFsc2VgIGZvciBzZXF1ZW50aWFsIG1vZGUpLgorCisuLiBmaWd1cmU6OiBoYXNobGliLWJsYWtlMi10cmVlLnBuZworICAgOmFsdDogRXhwbGFuYXRpb24gb2YgdHJlZSBtb2RlIHBhcmFtZXRlcnMuCisKK1NlZSBzZWN0aW9uIDIuMTAgaW4gYEJMQUtFMiBzcGVjaWZpY2F0aW9uCis8aHR0cHM6Ly9ibGFrZTIubmV0L2JsYWtlMl8yMDEzMDEyOS5wZGY+YF8gZm9yIGNvbXByZWhlbnNpdmUgcmV2aWV3IG9mIHRyZWUKK2hhc2hpbmcuCisKKworQ29uc3RhbnRzCistLS0tLS0tLS0KKworLi4gZGF0YTo6IGJsYWtlMmIuU0FMVF9TSVpFCisuLiBkYXRhOjogYmxha2Uycy5TQUxUX1NJWkUKKworU2FsdCBsZW5ndGggKG1heGltdW0gbGVuZ3RoIGFjY2VwdGVkIGJ5IGNvbnN0cnVjdG9ycykuCisKKworLi4gZGF0YTo6IGJsYWtlMmIuUEVSU09OX1NJWkUKKy4uIGRhdGE6OiBibGFrZTJzLlBFUlNPTl9TSVpFCisKK1BlcnNvbmFsaXphdGlvbiBzdHJpbmcgbGVuZ3RoIChtYXhpbXVtIGxlbmd0aCBhY2NlcHRlZCBieSBjb25zdHJ1Y3RvcnMpLgorCisKKy4uIGRhdGE6OiBibGFrZTJiLk1BWF9LRVlfU0laRQorLi4gZGF0YTo6IGJsYWtlMnMuTUFYX0tFWV9TSVpFCisKK01heGltdW0ga2V5IHNpemUuCisKKworLi4gZGF0YTo6IGJsYWtlMmIuTUFYX0RJR0VTVF9TSVpFCisuLiBkYXRhOjogYmxha2Uycy5NQVhfRElHRVNUX1NJWkUKKworTWF4aW11bSBkaWdlc3Qgc2l6ZSB0aGF0IHRoZSBoYXNoIGZ1bmN0aW9uIGNhbiBvdXRwdXQuCisKKworRXhhbXBsZXMKKz09PT09PT09CisKK1NpbXBsZSBoYXNoaW5nCistLS0tLS0tLS0tLS0tLQorCitUbyBjYWxjdWxhdGUgaGFzaCBvZiBzb21lIGRhdGEsIHlvdSBzaG91bGQgZmlyc3QgY29uc3RydWN0IGEgaGFzaCBvYmplY3QgYnkKK2NhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uICg6ZnVuYzpgYmxha2UyYmAgb3IKKzpmdW5jOmBibGFrZTJzYCksIHRoZW4gdXBkYXRlIGl0IHdpdGggdGhlIGRhdGEgYnkgY2FsbGluZyA6bWV0aDpgdXBkYXRlYCBvbiB0aGUKK29iamVjdCwgYW5kLCBmaW5hbGx5LCBnZXQgdGhlIGRpZ2VzdCBvdXQgb2YgdGhlIG9iamVjdCBieSBjYWxsaW5nCis6bWV0aDpgZGlnZXN0YCAob3IgOm1ldGg6YGhleGRpZ2VzdGAgZm9yIGhleC1lbmNvZGVkIHN0cmluZykuCisKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJiCisgICAgPj4+IGggPSBibGFrZTJiKCkKKyAgICA+Pj4gaC51cGRhdGUoYidIZWxsbyB3b3JsZCcpCisgICAgPj4+IGguaGV4ZGlnZXN0KCkKKyAgICAnNmZmODQzYmE2ODU4NDJhYTgyMDMxZDNmNTNjNDhiNjYzMjZkZjc2MzlhNjNkMTI4OTc0YzVjMTRmMzFhMGYzMzM0M2E4YzY1NTUxMTM0ZWQxYWUwZjJiMGRkMmJiNDk1ZGM4MTAzOWUzZWViMGFhMWJiMDM4OGJiZWFjMjkxODMnCisKKworQXMgYSBzaG9ydGN1dCwgeW91IGNhbiBwYXNzIHRoZSBmaXJzdCBjaHVuayBvZiBkYXRhIHRvIHVwZGF0ZSBkaXJlY3RseSB0byB0aGUKK2NvbnN0cnVjdG9yIGFzIHRoZSBmaXJzdCBhcmd1bWVudCAob3IgYXMgKmRhdGEqIGtleXdvcmQgYXJndW1lbnQpOgorCisgICAgPj4+IGZyb20gaGFzaGxpYiBpbXBvcnQgYmxha2UyYgorICAgID4+PiBibGFrZTJiKGInSGVsbG8gd29ybGQnKS5oZXhkaWdlc3QoKQorICAgICc2ZmY4NDNiYTY4NTg0MmFhODIwMzFkM2Y1M2M0OGI2NjMyNmRmNzYzOWE2M2QxMjg5NzRjNWMxNGYzMWEwZjMzMzQzYThjNjU1NTExMzRlZDFhZTBmMmIwZGQyYmI0OTVkYzgxMDM5ZTNlZWIwYWExYmIwMzg4YmJlYWMyOTE4MycKKworWW91IGNhbiBjYWxsIDptZXRoOmBoYXNoLnVwZGF0ZWAgYXMgbWFueSB0aW1lcyBhcyB5b3UgbmVlZCB0byBpdGVyYXRpdmVseQordXBkYXRlIHRoZSBoYXNoOgorCisgICAgPj4+IGZyb20gaGFzaGxpYiBpbXBvcnQgYmxha2UyYgorICAgID4+PiBpdGVtcyA9IFtiJ0hlbGxvJywgYicgJywgYid3b3JsZCddCisgICAgPj4+IGggPSBibGFrZTJiKCkKKyAgICA+Pj4gZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgLi4uICAgICBoLnVwZGF0ZShpdGVtKQorICAgID4+PiBoLmhleGRpZ2VzdCgpCisgICAgJzZmZjg0M2JhNjg1ODQyYWE4MjAzMWQzZjUzYzQ4YjY2MzI2ZGY3NjM5YTYzZDEyODk3NGM1YzE0ZjMxYTBmMzMzNDNhOGM2NTU1MTEzNGVkMWFlMGYyYjBkZDJiYjQ5NWRjODEwMzllM2VlYjBhYTFiYjAzODhiYmVhYzI5MTgzJworCisKK1VzaW5nIGRpZmZlcmVudCBkaWdlc3Qgc2l6ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQkxBS0UyIGhhcyBjb25maWd1cmFibGUgc2l6ZSBvZiBkaWdlc3RzIHVwIHRvIDY0IGJ5dGVzIGZvciBCTEFLRTJiIGFuZCB1cCB0byAzMgorYnl0ZXMgZm9yIEJMQUtFMnMuIEZvciBleGFtcGxlLCB0byByZXBsYWNlIFNIQS0xIHdpdGggQkxBS0UyYiB3aXRob3V0IGNoYW5naW5nCit0aGUgc2l6ZSBvZiBvdXRwdXQsIHdlIGNhbiB0ZWxsIEJMQUtFMmIgdG8gcHJvZHVjZSAyMC1ieXRlIGRpZ2VzdHM6CisKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJiCisgICAgPj4+IGggPSBibGFrZTJiKGRpZ2VzdF9zaXplPTIwKQorICAgID4+PiBoLnVwZGF0ZShiJ1JlcGxhY2luZyBTSEExIHdpdGggdGhlIG1vcmUgc2VjdXJlIGZ1bmN0aW9uJykKKyAgICA+Pj4gaC5oZXhkaWdlc3QoKQorICAgICdkMjRmMjZjZjhkZTY2NDcyZDU4ZDRlMWIxNzc0YjRjOTE1OGIxZjRjJworICAgID4+PiBoLmRpZ2VzdF9zaXplCisgICAgMjAKKyAgICA+Pj4gbGVuKGguZGlnZXN0KCkpCisgICAgMjAKKworSGFzaCBvYmplY3RzIHdpdGggZGlmZmVyZW50IGRpZ2VzdCBzaXplcyBoYXZlIGNvbXBsZXRlbHkgZGlmZmVyZW50IG91dHB1dHMKKyhzaG9ydGVyIGhhc2hlcyBhcmUgKm5vdCogcHJlZml4ZXMgb2YgbG9uZ2VyIGhhc2hlcyk7IEJMQUtFMmIgYW5kIEJMQUtFMnMKK3Byb2R1Y2UgZGlmZmVyZW50IG91dHB1dHMgZXZlbiBpZiB0aGUgb3V0cHV0IGxlbmd0aCBpcyB0aGUgc2FtZToKKworICAgID4+PiBmcm9tIGhhc2hsaWIgaW1wb3J0IGJsYWtlMmIsIGJsYWtlMnMKKyAgICA+Pj4gYmxha2UyYihkaWdlc3Rfc2l6ZT0xMCkuaGV4ZGlnZXN0KCkKKyAgICAnNmZhMWQ4ZmNmZDcxOTA0NmQ3NjInCisgICAgPj4+IGJsYWtlMmIoZGlnZXN0X3NpemU9MTEpLmhleGRpZ2VzdCgpCisgICAgJ2ViNmVjMTVkYWY5NTQ2MjU0ZjA4MDknCisgICAgPj4+IGJsYWtlMnMoZGlnZXN0X3NpemU9MTApLmhleGRpZ2VzdCgpCisgICAgJzFiZjIxYTk4Yzc4YTFjMzc2YWU5JworICAgID4+PiBibGFrZTJzKGRpZ2VzdF9zaXplPTExKS5oZXhkaWdlc3QoKQorICAgICc1NjcwMDRiZjk2ZTRhMjU3NzNlYmY0JworCisKK0tleWVkIGhhc2hpbmcKKy0tLS0tLS0tLS0tLS0KKworS2V5ZWQgaGFzaGluZyBjYW4gYmUgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gYXMgYSBmYXN0ZXIgYW5kIHNpbXBsZXIKK3JlcGxhY2VtZW50IGZvciBgSGFzaC1iYXNlZCBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUKKzxodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhc2gtYmFzZWRfbWVzc2FnZV9hdXRoZW50aWNhdGlvbl9jb2RlPmBfIChITUFDKS4KK0JMQUtFMiBjYW4gYmUgc2VjdXJlbHkgdXNlZCBpbiBwcmVmaXgtTUFDIG1vZGUgdGhhbmtzIHRvIHRoZQoraW5kaWZmZXJlbnRpYWJpbGl0eSBwcm9wZXJ0eSBpbmhlcml0ZWQgZnJvbSBCTEFLRS4KKworVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBnZXQgYSAoaGV4LWVuY29kZWQpIDEyOC1iaXQgYXV0aGVudGljYXRpb24gY29kZSBmb3IKK21lc3NhZ2UgYGBiJ21lc3NhZ2UgZGF0YSdgYCB3aXRoIGtleSBgYGIncHNldWRvcmFuZG9tIGtleSdgYDo6CisKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJiCisgICAgPj4+IGggPSBibGFrZTJiKGtleT1iJ3BzZXVkb3JhbmRvbSBrZXknLCBkaWdlc3Rfc2l6ZT0xNikKKyAgICA+Pj4gaC51cGRhdGUoYidtZXNzYWdlIGRhdGEnKQorICAgID4+PiBoLmhleGRpZ2VzdCgpCisgICAgJzNkMzYzZmY3NDAxZTAyMDI2ZjRhNDY4N2Q0ODYzY2VkJworCisKK0FzIGEgcHJhY3RpY2FsIGV4YW1wbGUsIGEgd2ViIGFwcGxpY2F0aW9uIGNhbiBzeW1tZXRyaWNhbGx5IHNpZ24gY29va2llcyBzZW50Cit0byB1c2VycyBhbmQgbGF0ZXIgdmVyaWZ5IHRoZW0gdG8gbWFrZSBzdXJlIHRoZXkgd2VyZW4ndCB0YW1wZXJlZCB3aXRoOjoKKworICAgID4+PiBmcm9tIGhhc2hsaWIgaW1wb3J0IGJsYWtlMmIKKyAgICA+Pj4gZnJvbSBobWFjIGltcG9ydCBjb21wYXJlX2RpZ2VzdAorICAgID4+PgorICAgID4+PiBTRUNSRVRfS0VZID0gYidwc2V1ZG9yYW5kb21seSBnZW5lcmF0ZWQgc2VydmVyIHNlY3JldCBrZXknCisgICAgPj4+IEFVVEhfU0laRSA9IDE2CisgICAgPj4+CisgICAgPj4+IGRlZiBzaWduKGNvb2tpZSk6CisgICAgLi4uICAgICBoID0gYmxha2UyYihkYXRhPWNvb2tpZSwgZGlnZXN0X3NpemU9QVVUSF9TSVpFLCBrZXk9U0VDUkVUX0tFWSkKKyAgICAuLi4gICAgIHJldHVybiBoLmhleGRpZ2VzdCgpCisgICAgPj4+CisgICAgPj4+IGNvb2tpZSA9IGIndXNlcjp2YXRyb2dhc2FjJworICAgID4+PiBzaWcgPSBzaWduKGNvb2tpZSkKKyAgICA+Pj4gcHJpbnQoInswfSx7MX0iLmZvcm1hdChjb29raWUuZGVjb2RlKCd1dGYtOCcpLCBzaWcpKQorICAgIHVzZXI6dmF0cm9nYXNhYywzNDljZjkwNDUzMzc2N2VkMmQ3NTUyNzlhOGRmODRkMAorICAgID4+PiBjb21wYXJlX2RpZ2VzdChjb29raWUsIHNpZykKKyAgICBUcnVlCisgICAgPj4+IGNvbXBhcmVfZGlnZXN0KGIndXNlcjpwb2xpY2FqYWMnLCBzaWcpCisgICAgRmFsc2UKKyAgICA+Pj4gY29tcGFyZV9kaWdlc3R5KGNvb2tpZSwgJzAxMDIwMzA0MDUwNjA3MDgwOTBhMGIwYzBkMGUwZjAwJykKKyAgICBGYWxzZQorCitFdmVuIHRob3VnaCB0aGVyZSdzIGEgbmF0aXZlIGtleWVkIGhhc2hpbmcgbW9kZSwgQkxBS0UyIGNhbiwgb2YgY291cnNlLCBiZSB1c2VkCitpbiBITUFDIGNvbnN0cnVjdGlvbiB3aXRoIDptb2Q6YGhtYWNgIG1vZHVsZTo6CisKKyAgICA+Pj4gaW1wb3J0IGhtYWMsIGhhc2hsaWIKKyAgICA+Pj4gbSA9IGhtYWMubmV3KGInc2VjcmV0IGtleScsIGRpZ2VzdG1vZD1oYXNobGliLmJsYWtlMnMpCisgICAgPj4+IG0udXBkYXRlKGInbWVzc2FnZScpCisgICAgPj4+IG0uaGV4ZGlnZXN0KCkKKyAgICAnZTNjODEwMjg2OGQyOGI1ZmY4NWZjMzVkZGEwNzMyOTk3MGQxYTAxZTI3M2MzNzQ4MTMyNmZlMGM4NjFjODE0MicKKworCitSYW5kb21pemVkIGhhc2hpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitCeSBzZXR0aW5nICpzYWx0KiBwYXJhbWV0ZXIgdXNlcnMgY2FuIGludHJvZHVjZSByYW5kb21pemF0aW9uIHRvIHRoZSBoYXNoCitmdW5jdGlvbi4gUmFuZG9taXplZCBoYXNoaW5nIGlzIHVzZWZ1bCBmb3IgcHJvdGVjdGluZyBhZ2FpbnN0IGNvbGxpc2lvbiBhdHRhY2tzCitvbiB0aGUgaGFzaCBmdW5jdGlvbiB1c2VkIGluIGRpZ2l0YWwgc2lnbmF0dXJlcy4KKworICAgIFJhbmRvbWl6ZWQgaGFzaGluZyBpcyBkZXNpZ25lZCBmb3Igc2l0dWF0aW9ucyB3aGVyZSBvbmUgcGFydHksIHRoZSBtZXNzYWdlCisgICAgcHJlcGFyZXIsIGdlbmVyYXRlcyBhbGwgb3IgcGFydCBvZiBhIG1lc3NhZ2UgdG8gYmUgc2lnbmVkIGJ5IGEgc2Vjb25kCisgICAgcGFydHksIHRoZSBtZXNzYWdlIHNpZ25lci4gSWYgdGhlIG1lc3NhZ2UgcHJlcGFyZXIgaXMgYWJsZSB0byBmaW5kCisgICAgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uIGNvbGxpc2lvbnMgKGkuZS4sIHR3byBtZXNzYWdlcyBwcm9kdWNpbmcgdGhlCisgICAgc2FtZSBoYXNoIHZhbHVlKSwgdGhlbiBzaGUgbWlnaHQgcHJlcGFyZSBtZWFuaW5nZnVsIHZlcnNpb25zIG9mIHRoZSBtZXNzYWdlCisgICAgdGhhdCB3b3VsZCBwcm9kdWNlIHRoZSBzYW1lIGhhc2ggdmFsdWUgYW5kIGRpZ2l0YWwgc2lnbmF0dXJlLCBidXQgd2l0aAorICAgIGRpZmZlcmVudCByZXN1bHRzIChlLmcuLCB0cmFuc2ZlcnJpbmcgJDEsMDAwLDAwMCB0byBhbiBhY2NvdW50LCByYXRoZXIgdGhhbgorICAgICQxMCkuIENyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbnMgaGF2ZSBiZWVuIGRlc2lnbmVkIHdpdGggY29sbGlzaW9uCisgICAgcmVzaXN0YW5jZSBhcyBhIG1ham9yIGdvYWwsIGJ1dCB0aGUgY3VycmVudCBjb25jZW50cmF0aW9uIG9uIGF0dGFja2luZworICAgIGNyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbnMgbWF5IHJlc3VsdCBpbiBhIGdpdmVuIGNyeXB0b2dyYXBoaWMgaGFzaAorICAgIGZ1bmN0aW9uIHByb3ZpZGluZyBsZXNzIGNvbGxpc2lvbiByZXNpc3RhbmNlIHRoYW4gZXhwZWN0ZWQuIFJhbmRvbWl6ZWQKKyAgICBoYXNoaW5nIG9mZmVycyB0aGUgc2lnbmVyIGFkZGl0aW9uYWwgcHJvdGVjdGlvbiBieSByZWR1Y2luZyB0aGUgbGlrZWxpaG9vZAorICAgIHRoYXQgYSBwcmVwYXJlciBjYW4gZ2VuZXJhdGUgdHdvIG9yIG1vcmUgbWVzc2FnZXMgdGhhdCB1bHRpbWF0ZWx5IHlpZWxkIHRoZQorICAgIHNhbWUgaGFzaCB2YWx1ZSBkdXJpbmcgdGhlIGRpZ2l0YWwgc2lnbmF0dXJlIGdlbmVyYXRpb24gcHJvY2VzcyDigJMgZXZlbiBpZgorICAgIGl0IGlzIHByYWN0aWNhbCB0byBmaW5kIGNvbGxpc2lvbnMgZm9yIHRoZSBoYXNoIGZ1bmN0aW9uLiBIb3dldmVyLCB0aGUgdXNlCisgICAgb2YgcmFuZG9taXplZCBoYXNoaW5nIG1heSByZWR1Y2UgdGhlIGFtb3VudCBvZiBzZWN1cml0eSBwcm92aWRlZCBieSBhCisgICAgZGlnaXRhbCBzaWduYXR1cmUgd2hlbiBhbGwgcG9ydGlvbnMgb2YgdGhlIG1lc3NhZ2UgYXJlIHByZXBhcmVkCisgICAgYnkgdGhlIHNpZ25lci4KKworICAgIChgTklTVCBTUC04MDAtMTA2ICJSYW5kb21pemVkIEhhc2hpbmcgZm9yIERpZ2l0YWwgU2lnbmF0dXJlcyIKKyAgICA8aHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL25pc3RwdWJzLzgwMC0xMDYvTklTVC1TUC04MDAtMTA2LnBkZj5gXykKKworSW4gQkxBS0UyIHRoZSBzYWx0IGlzIHByb2Nlc3NlZCBhcyBhIG9uZS10aW1lIGlucHV0IHRvIHRoZSBoYXNoIGZ1bmN0aW9uIGR1cmluZworaW5pdGlhbGl6YXRpb24sIHJhdGhlciB0aGFuIGFzIGFuIGlucHV0IHRvIGVhY2ggY29tcHJlc3Npb24gZnVuY3Rpb24uCisKKy4uIHdhcm5pbmc6OgorCisgICAgKlNhbHRlZCBoYXNoaW5nKiAob3IganVzdCBoYXNoaW5nKSB3aXRoIEJMQUtFMiBvciBhbnkgb3RoZXIgZ2VuZXJhbC1wdXJwb3NlCisgICAgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLCBzdWNoIGFzIFNIQS0yNTYsIGlzIG5vdCBzdWl0YWJsZSBmb3IgaGFzaGluZworICAgIHBhc3N3b3Jkcy4gIFNlZSBgQkxBS0UyIEZBUSA8aHR0cHM6Ly9ibGFrZTIubmV0LyNxYT5gXyBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uLgorLi4KKworICAgID4+PiBpbXBvcnQgb3MKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJiCisgICAgPj4+IG1zZyA9IGInc29tZSBtZXNzYWdlJworICAgID4+PiAjIENhbGN1bGF0ZSB0aGUgZmlyc3QgaGFzaCB3aXRoIGEgcmFuZG9tIHNhbHQuCisgICAgPj4+IHNhbHQxID0gb3MudXJhbmRvbShibGFrZTJiLlNBTFRfU0laRSkKKyAgICA+Pj4gaDEgPSBibGFrZTJiKHNhbHQ9c2FsdDEpCisgICAgPj4+IGgxLnVwZGF0ZShtc2cpCisgICAgPj4+ICMgQ2FsY3VsYXRlIHRoZSBzZWNvbmQgaGFzaCB3aXRoIGEgZGlmZmVyZW50IHJhbmRvbSBzYWx0LgorICAgID4+PiBzYWx0MiA9IG9zLnVyYW5kb20oYmxha2UyYi5TQUxUX1NJWkUpCisgICAgPj4+IGgyID0gYmxha2UyYihzYWx0PXNhbHQyKQorICAgID4+PiBoMi51cGRhdGUobXNnKQorICAgID4+PiAjIFRoZSBkaWdlc3RzIGFyZSBkaWZmZXJlbnQuCisgICAgPj4+IGgxLmRpZ2VzdCgpICE9IGgyLmRpZ2VzdCgpCisgICAgVHJ1ZQorCisKK1BlcnNvbmFsaXphdGlvbgorLS0tLS0tLS0tLS0tLS0tCisKK1NvbWV0aW1lcyBpdCBpcyB1c2VmdWwgdG8gZm9yY2UgaGFzaCBmdW5jdGlvbiB0byBwcm9kdWNlIGRpZmZlcmVudCBkaWdlc3RzIGZvcgordGhlIHNhbWUgaW5wdXQgZm9yIGRpZmZlcmVudCBwdXJwb3Nlcy4gUXVvdGluZyB0aGUgYXV0aG9ycyBvZiB0aGUgU2tlaW4gaGFzaAorZnVuY3Rpb246CisKKyAgICBXZSByZWNvbW1lbmQgdGhhdCBhbGwgYXBwbGljYXRpb24gZGVzaWduZXJzIHNlcmlvdXNseSBjb25zaWRlciBkb2luZyB0aGlzOworICAgIHdlIGhhdmUgc2VlbiBtYW55IHByb3RvY29scyB3aGVyZSBhIGhhc2ggdGhhdCBpcyBjb21wdXRlZCBpbiBvbmUgcGFydCBvZgorICAgIHRoZSBwcm90b2NvbCBjYW4gYmUgdXNlZCBpbiBhbiBlbnRpcmVseSBkaWZmZXJlbnQgcGFydCBiZWNhdXNlIHR3byBoYXNoCisgICAgY29tcHV0YXRpb25zIHdlcmUgZG9uZSBvbiBzaW1pbGFyIG9yIHJlbGF0ZWQgZGF0YSwgYW5kIHRoZSBhdHRhY2tlciBjYW4KKyAgICBmb3JjZSB0aGUgYXBwbGljYXRpb24gdG8gbWFrZSB0aGUgaGFzaCBpbnB1dHMgdGhlIHNhbWUuIFBlcnNvbmFsaXppbmcgZWFjaAorICAgIGhhc2ggZnVuY3Rpb24gdXNlZCBpbiB0aGUgcHJvdG9jb2wgc3VtbWFyaWx5IHN0b3BzIHRoaXMgdHlwZSBvZiBhdHRhY2suCisKKyAgICAoYFRoZSBTa2VpbiBIYXNoIEZ1bmN0aW9uIEZhbWlseQorICAgIDxodHRwOi8vd3d3LnNrZWluLWhhc2guaW5mby9zaXRlcy9kZWZhdWx0L2ZpbGVzL3NrZWluMS4zLnBkZj5gXywKKyAgICBwLiAyMSkKKworQkxBS0UyIGNhbiBiZSBwZXJzb25hbGl6ZWQgYnkgcGFzc2luZyBieXRlcyB0byB0aGUgKnBlcnNvbiogYXJndW1lbnQ6OgorCisgICAgPj4+IGZyb20gaGFzaGxpYiBpbXBvcnQgYmxha2UyYgorICAgID4+PiBGSUxFU19IQVNIX1BFUlNPTiA9IGInTXlBcHAgRmlsZXMgSGFzaCcKKyAgICA+Pj4gQkxPQ0tfSEFTSF9QRVJTT04gPSBiJ015QXBwIEJsb2NrIEhhc2gnCisgICAgPj4+IGggPSBibGFrZTJiKGRpZ2VzdF9zaXplPTMyLCBwZXJzb249RklMRVNfSEFTSF9QRVJTT04pCisgICAgPj4+IGgudXBkYXRlKGIndGhlIHNhbWUgY29udGVudCcpCisgICAgPj4+IGguaGV4ZGlnZXN0KCkKKyAgICAnMjBkOWNkMDI0ZDRmYjA4NmFhZTgxOWExNDMyZGQyNDY2ZGUxMjk0NzgzMWI3NWM1YTMwY2YyNjc2MDk1ZDNiNCcKKyAgICA+Pj4gaCA9IGJsYWtlMmIoZGlnZXN0X3NpemU9MzIsIHBlcnNvbj1CTE9DS19IQVNIX1BFUlNPTikKKyAgICA+Pj4gaC51cGRhdGUoYid0aGUgc2FtZSBjb250ZW50JykKKyAgICA+Pj4gaC5oZXhkaWdlc3QoKQorICAgICdjZjY4ZmI1NzYxYjljNDRlNzg3OGJmYjJjNGM5YWVhNTIyNjRhODBiNzUwMDVlNjU2MTk3NzhkZTU5ZjM4M2EzJworCitQZXJzb25hbGl6YXRpb24gdG9nZXRoZXIgd2l0aCB0aGUga2V5ZWQgbW9kZSBjYW4gYWxzbyBiZSB1c2VkIHRvIGRlcml2ZSBkaWZmZXJlbnQKK2tleXMgZnJvbSBhIHNpbmdsZSBvbmUuCisKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJzCisgICAgPj4+IGZyb20gYmFzZTY0IGltcG9ydCBiNjRkZWNvZGUsIGI2NGVuY29kZQorICAgID4+PiBvcmlnX2tleSA9IGI2NGRlY29kZShiJ1JtNUVQSmFpNzJxY0szUkdCcFczdlBOZlp5NU9ab3RoWStrSFk2aDIxS009JykKKyAgICA+Pj4gZW5jX2tleSA9IGJsYWtlMnMoa2V5PW9yaWdfa2V5LCBwZXJzb249YidrRW5jcnlwdCcpLmRpZ2VzdCgpCisgICAgPj4+IG1hY19rZXkgPSBibGFrZTJzKGtleT1vcmlnX2tleSwgcGVyc29uPWIna01BQycpLmRpZ2VzdCgpCisgICAgPj4+IHByaW50KGI2NGVuY29kZShlbmNfa2V5KS5kZWNvZGUoJ3V0Zi04JykpCisgICAgcmJQYjE1Uy9aOXQrYWdmZm5vNXd1aEI3N1ZiUmk2RjlJdjJxSXhVN1dIdz0KKyAgICA+Pj4gcHJpbnQoYjY0ZW5jb2RlKG1hY19rZXkpLmRlY29kZSgndXRmLTgnKSkKKyAgICBHOUd0SEZFMVlsdVhZMXpXUGxZazFlL25XZnUwV1NFYjBLUmNqaERlUC9vPQorCitUcmVlIG1vZGUKKy0tLS0tLS0tLQorCitIZXJlJ3MgYW4gZXhhbXBsZSBvZiBoYXNoaW5nIGEgbWluaW1hbCB0cmVlIHdpdGggdHdvIGxlYWYgbm9kZXM6OgorCisgICAgICAgMTAKKyAgICAgIC8gIFwKKyAgICAgMDAgIDAxCisKK1RoaXMgZXhhbXBsZSB1c2VzIDY0LWJ5dGUgaW50ZXJuYWwgZGlnZXN0cywgYW5kIHJldHVybnMgdGhlIDMyLWJ5dGUgZmluYWwKK2RpZ2VzdDo6CisKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJiCisgICAgPj4+CisgICAgPj4+IEZBTk9VVCA9IDIKKyAgICA+Pj4gREVQVEggPSAyCisgICAgPj4+IExFQUZfU0laRSA9IDQwOTYKKyAgICA+Pj4gSU5ORVJfU0laRSA9IDY0CisgICAgPj4+CisgICAgPj4+IGJ1ZiA9IGJ5dGVhcnJheSg2MDAwKQorICAgID4+PgorICAgID4+PiAjIExlZnQgbGVhZgorICAgIC4uLiBoMDAgPSBibGFrZTJiKGJ1ZlswOkxFQUZfU0laRV0sIGZhbm91dD1GQU5PVVQsIGRlcHRoPURFUFRILAorICAgIC4uLiAgICAgICAgICAgICAgIGxlYWZfc2l6ZT1MRUFGX1NJWkUsIGlubmVyX3NpemU9SU5ORVJfU0laRSwKKyAgICAuLi4gICAgICAgICAgICAgICBub2RlX29mZnNldD0wLCBub2RlX2RlcHRoPTAsIGxhc3Rfbm9kZT1GYWxzZSkKKyAgICA+Pj4gIyBSaWdodCBsZWFmCisgICAgLi4uIGgwMSA9IGJsYWtlMmIoYnVmW0xFQUZfU0laRTpdLCBmYW5vdXQ9RkFOT1VULCBkZXB0aD1ERVBUSCwKKyAgICAuLi4gICAgICAgICAgICAgICBsZWFmX3NpemU9TEVBRl9TSVpFLCBpbm5lcl9zaXplPUlOTkVSX1NJWkUsCisgICAgLi4uICAgICAgICAgICAgICAgbm9kZV9vZmZzZXQ9MSwgbm9kZV9kZXB0aD0wLCBsYXN0X25vZGU9VHJ1ZSkKKyAgICA+Pj4gIyBSb290IG5vZGUKKyAgICAuLi4gaDEwID0gYmxha2UyYihkaWdlc3Rfc2l6ZT0zMiwgZmFub3V0PUZBTk9VVCwgZGVwdGg9REVQVEgsCisgICAgLi4uICAgICAgICAgICAgICAgbGVhZl9zaXplPUxFQUZfU0laRSwgaW5uZXJfc2l6ZT1JTk5FUl9TSVpFLAorICAgIC4uLiAgICAgICAgICAgICAgIG5vZGVfb2Zmc2V0PTAsIG5vZGVfZGVwdGg9MSwgbGFzdF9ub2RlPVRydWUpCisgICAgPj4+IGgxMC51cGRhdGUoaDAwLmRpZ2VzdCgpKQorICAgID4+PiBoMTAudXBkYXRlKGgwMS5kaWdlc3QoKSkKKyAgICA+Pj4gaDEwLmhleGRpZ2VzdCgpCisgICAgJzNhZDJhOWIzN2M2MDcwZTM3NGM3YThjNTA4ZmUyMGNhODZiNmVkNTRlMjg2ZTkzYTAzMThlOTVlODgxZGI1YWEnCisKK0NyZWRpdHMKKz09PT09PT0KKworQkxBS0UyXyB3YXMgZGVzaWduZWQgYnkgKkplYW4tUGhpbGlwcGUgQXVtYXNzb24qLCAqU2FtdWVsIE5ldmVzKiwgKlpvb2tvCitXaWxjb3gtTydIZWFybiosIGFuZCAqQ2hyaXN0aWFuIFdpbm5lcmxlaW4qIGJhc2VkIG9uIFNIQS0zXyBmaW5hbGlzdCBCTEFLRV8KK2NyZWF0ZWQgYnkgKkplYW4tUGhpbGlwcGUgQXVtYXNzb24qLCAqTHVjYSBIZW56ZW4qLCAqV2lsbGkgTWVpZXIqLCBhbmQKKypSYXBoYWVsIEMuLVcuIFBoYW4qLgorCitJdCB1c2VzIGNvcmUgYWxnb3JpdGhtIGZyb20gQ2hhQ2hhXyBjaXBoZXIgZGVzaWduZWQgYnkgKkRhbmllbCBKLiAgQmVybnN0ZWluKi4KKworVGhlIHN0ZGxpYiBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBweWJsYWtlMl8gbW9kdWxlLiBJdCB3YXMgd3JpdHRlbiBieQorKkRtaXRyeSBDaGVzdG55a2gqIGJhc2VkIG9uIEMgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBieSAqU2FtdWVsIE5ldmVzKi4gVGhlCitkb2N1bWVudGF0aW9uIHdhcyBjb3BpZWQgZnJvbSBweWJsYWtlMl8gYW5kIHdyaXR0ZW4gYnkgKkRtaXRyeSBDaGVzdG55a2gqLgorCitUaGUgQyBjb2RlIHdhcyBwYXJ0bHkgcmV3cml0dGVuIGZvciBQeXRob24gYnkgKkNocmlzdGlhbiBIZWltZXMqLgorCitUaGUgZm9sbG93aW5nIHB1YmxpYyBkb21haW4gZGVkaWNhdGlvbiBhcHBsaWVzIGZvciBib3RoIEMgaGFzaCBmdW5jdGlvbgoraW1wbGVtZW50YXRpb24sIGV4dGVuc2lvbiBjb2RlLCBhbmQgdGhpcyBkb2N1bWVudGF0aW9uOgorCisgICBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvcihzKSBoYXZlIGRlZGljYXRlZCBhbGwgY29weXJpZ2h0CisgICBhbmQgcmVsYXRlZCBhbmQgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgc29mdHdhcmUgdG8gdGhlIHB1YmxpYyBkb21haW4KKyAgIHdvcmxkd2lkZS4gVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQ0MwIFB1YmxpYyBEb21haW4gRGVkaWNhdGlvbiBhbG9uZworICAgd2l0aCB0aGlzIHNvZnR3YXJlLiBJZiBub3QsIHNlZQorICAgaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLy4KKworVGhlIGZvbGxvd2luZyBwZW9wbGUgaGF2ZSBoZWxwZWQgd2l0aCBkZXZlbG9wbWVudCBvciBjb250cmlidXRlZCB0aGVpciBjaGFuZ2VzCit0byB0aGUgcHJvamVjdCBhbmQgdGhlIHB1YmxpYyBkb21haW4gYWNjb3JkaW5nIHRvIHRoZSBDcmVhdGl2ZSBDb21tb25zIFB1YmxpYworRG9tYWluIERlZGljYXRpb24gMS4wIFVuaXZlcnNhbDoKKworKiAqQWxleGFuZHIgU29rb2xvdnNraXkqCisKKy4uIHNlZWFsc286OiBPZmZpY2lhbCBCTEFLRTIgd2Vic2l0ZTogaHR0cHM6Ly9ibGFrZTIubmV0CisKKy4uIF9SRkMtNzY5MzogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc2OTMKKy4uIF9CTEFLRTI6IGh0dHBzOi8vYmxha2UyLm5ldAorLi4gX0hNQUM6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhc2gtYmFzZWRfbWVzc2FnZV9hdXRoZW50aWNhdGlvbl9jb2RlCisuLiBfQkxBS0U6IGh0dHBzOi8vMTMxMDAyLm5ldC9ibGFrZS8KKy4uIF9TSEEtMzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTklTVF9oYXNoX2Z1bmN0aW9uX2NvbXBldGl0aW9uCisuLiBfQ2hhQ2hhOiBodHRwczovL2NyLnlwLnRvL2NoYWNoYS5odG1sCisuLiBfcHlibGFrZTI6IGh0dHBzOi8vcHl0aG9uaG9zdGVkLm9yZy9weWJsYWtlMi8KKwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaGFzaGxpYi5yc3QgYi9Eb2MvbGlicmFyeS9oYXNobGliLnJzdAppbmRleCBhMmU5NmNhLi4yY2IzYzc4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9oYXNobGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9oYXNobGliLnJzdApAQCAtNDQsOCArNDQsOCBAQAogLS0tLS0tLS0tLS0tLS0tCiAKIFRoZXJlIGlzIG9uZSBjb25zdHJ1Y3RvciBtZXRob2QgbmFtZWQgZm9yIGVhY2ggdHlwZSBvZiA6ZGZuOmBoYXNoYC4gIEFsbCByZXR1cm4KLWEgaGFzaCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaW1wbGUgaW50ZXJmYWNlLiBGb3IgZXhhbXBsZTogdXNlIDpmdW5jOmBzaGExYCB0bwotY3JlYXRlIGEgU0hBMSBoYXNoIG9iamVjdC4gWW91IGNhbiBub3cgZmVlZCB0aGlzIG9iamVjdCB3aXRoIDp0ZXJtOmBieXRlcy1saWtlCithIGhhc2ggb2JqZWN0IHdpdGggdGhlIHNhbWUgc2ltcGxlIGludGVyZmFjZS4gRm9yIGV4YW1wbGU6IHVzZSA6ZnVuYzpgc2hhMjU2YCB0bworY3JlYXRlIGEgU0hBLTI1NiBoYXNoIG9iamVjdC4gWW91IGNhbiBub3cgZmVlZCB0aGlzIG9iamVjdCB3aXRoIDp0ZXJtOmBieXRlcy1saWtlCiBvYmplY3RzIDxieXRlcy1saWtlIG9iamVjdD5gIChub3JtYWxseSA6Y2xhc3M6YGJ5dGVzYCkgdXNpbmcgdGhlIDptZXRoOmB1cGRhdGVgIG1ldGhvZC4KIEF0IGFueSBwb2ludCB5b3UgY2FuIGFzayBpdCBmb3IgdGhlIDpkZm46YGRpZ2VzdGAgb2YgdGhlCiBjb25jYXRlbmF0aW9uIG9mIHRoZSBkYXRhIGZlZCB0byBpdCBzbyBmYXIgdXNpbmcgdGhlIDptZXRoOmBkaWdlc3RgIG9yCkBAIC02NCwyMSArNjQsMzMgQEAKIC4uIGluZGV4Ojogc2luZ2xlOiBPcGVuU1NMOyAodXNlIGluIG1vZHVsZSBoYXNobGliKQogCiBDb25zdHJ1Y3RvcnMgZm9yIGhhc2ggYWxnb3JpdGhtcyB0aGF0IGFyZSBhbHdheXMgcHJlc2VudCBpbiB0aGlzIG1vZHVsZSBhcmUKLTpmdW5jOmBtZDVgLCA6ZnVuYzpgc2hhMWAsIDpmdW5jOmBzaGEyMjRgLCA6ZnVuYzpgc2hhMjU2YCwgOmZ1bmM6YHNoYTM4NGAsCi1hbmQgOmZ1bmM6YHNoYTUxMmAuIEFkZGl0aW9uYWwgYWxnb3JpdGhtcyBtYXkgYWxzbyBiZSBhdmFpbGFibGUgZGVwZW5kaW5nIHVwb24KLXRoZSBPcGVuU1NMIGxpYnJhcnkgdGhhdCBQeXRob24gdXNlcyBvbiB5b3VyIHBsYXRmb3JtLgorOmZ1bmM6YHNoYTFgLCA6ZnVuYzpgc2hhMjI0YCwgOmZ1bmM6YHNoYTI1NmAsIDpmdW5jOmBzaGEzODRgLAorOmZ1bmM6YHNoYTUxMmAsIDpmdW5jOmBibGFrZTJiYCwgYW5kIDpmdW5jOmBibGFrZTJzYC4KKzpmdW5jOmBtZDVgIGlzIG5vcm1hbGx5IGF2YWlsYWJsZSBhcyB3ZWxsLCB0aG91Z2ggaXQKK21heSBiZSBtaXNzaW5nIGlmIHlvdSBhcmUgdXNpbmcgYSByYXJlICJGSVBTIGNvbXBsaWFudCIgYnVpbGQgb2YgUHl0aG9uLgorQWRkaXRpb25hbCBhbGdvcml0aG1zIG1heSBhbHNvIGJlIGF2YWlsYWJsZSBkZXBlbmRpbmcgdXBvbiB0aGUgT3BlblNTTAorbGlicmFyeSB0aGF0IFB5dGhvbiB1c2VzIG9uIHlvdXIgcGxhdGZvcm0uIE9uIG1vc3QgcGxhdGZvcm1zIHRoZQorOmZ1bmM6YHNoYTNfMjI0YCwgOmZ1bmM6YHNoYTNfMjU2YCwgOmZ1bmM6YHNoYTNfMzg0YCwgOmZ1bmM6YHNoYTNfNTEyYCwKKzpmdW5jOmBzaGFrZV8xMjhgLCA6ZnVuYzpgc2hha2VfMjU2YCBhcmUgYWxzbyBhdmFpbGFibGUuCisKKy4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgU0hBMyAoS2VjY2FrKSBhbmQgU0hBS0UgY29uc3RydWN0b3JzIDpmdW5jOmBzaGEzXzIyNGAsIDpmdW5jOmBzaGEzXzI1NmAsCisgICA6ZnVuYzpgc2hhM18zODRgLCA6ZnVuYzpgc2hhM181MTJgLCA6ZnVuYzpgc2hha2VfMTI4YCwgOmZ1bmM6YHNoYWtlXzI1NmAuCisKKy4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgOmZ1bmM6YGJsYWtlMmJgIGFuZCA6ZnVuYzpgYmxha2Uyc2Agd2VyZSBhZGRlZC4KIAogRm9yIGV4YW1wbGUsIHRvIG9idGFpbiB0aGUgZGlnZXN0IG9mIHRoZSBieXRlIHN0cmluZyBgYGInTm9ib2R5IGluc3BlY3RzIHRoZQogc3BhbW1pc2ggcmVwZXRpdGlvbidgYDo6CiAKICAgID4+PiBpbXBvcnQgaGFzaGxpYgotICAgPj4+IG0gPSBoYXNobGliLm1kNSgpCisgICA+Pj4gbSA9IGhhc2hsaWIuc2hhMjU2KCkKICAgID4+PiBtLnVwZGF0ZShiIk5vYm9keSBpbnNwZWN0cyIpCiAgICA+Pj4gbS51cGRhdGUoYiIgdGhlIHNwYW1taXNoIHJlcGV0aXRpb24iKQogICAgPj4+IG0uZGlnZXN0KCkKLSAgIGInXHhiYmRceDljXHg4M1x4ZGRceDFlXHhhNVx4YzlceGQ5XHhkZVx4YzlceGExXHg4ZFx4ZjBceGZmXHhlOScKKyAgIGInXHgwM1x4MWVceGRkfUFlXHgxNVx4OTNceGM1XHhmZVxcXHgwMG9ceGE1dSs3XHhmZFx4ZGZceGY3XHhiY05ceDg0Olx4YTZceGFmXHgwY1x4OTVceDBmS1x4OTRceDA2JwogICAgPj4+IG0uZGlnZXN0X3NpemUKLSAgIDE2CisgICAzMgogICAgPj4+IG0uYmxvY2tfc2l6ZQogICAgNjQKIApAQCAtMTA3LDcgKzExOSw5IEBACiAuLiBkYXRhOjogYWxnb3JpdGhtc19ndWFyYW50ZWVkCiAKICAgIEEgc2V0IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBoYXNoIGFsZ29yaXRobXMgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQKLSAgIGJ5IHRoaXMgbW9kdWxlIG9uIGFsbCBwbGF0Zm9ybXMuCisgICBieSB0aGlzIG1vZHVsZSBvbiBhbGwgcGxhdGZvcm1zLiAgTm90ZSB0aGF0ICdtZDUnIGlzIGluIHRoaXMgbGlzdCBkZXNwaXRlCisgICBzb21lIHVwc3RyZWFtIHZlbmRvcnMgb2ZmZXJpbmcgYW4gb2RkICJGSVBTIGNvbXBsaWFudCIgUHl0aG9uIGJ1aWxkIHRoYXQKKyAgIGV4Y2x1ZGVzIGl0LgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKIApAQCAtMTgxLDYgKzE5NSwyOCBAQAogICAgY29tcHV0ZSB0aGUgZGlnZXN0cyBvZiBkYXRhIHNoYXJpbmcgYSBjb21tb24gaW5pdGlhbCBzdWJzdHJpbmcuCiAKIAorU0hBS0UgdmFyaWFibGUgbGVuZ3RoIGRpZ2VzdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSA6ZnVuYzpgc2hha2VfMTI4YCBhbmQgOmZ1bmM6YHNoYWtlXzI1NmAgYWxnb3JpdGhtcyBwcm92aWRlIHZhcmlhYmxlCitsZW5ndGggZGlnZXN0cyB3aXRoIGxlbmd0aF9pbl9iaXRzLy8yIHVwIHRvIDEyOCBvciAyNTYgYml0cyBvZiBzZWN1cml0eS4KK0FzIHN1Y2gsIHRoZWlyIGRpZ2VzdCBtZXRob2RzIHJlcXVpcmUgYSBsZW5ndGguIE1heGltdW0gbGVuZ3RoIGlzIG5vdCBsaW1pdGVkCitieSB0aGUgU0hBS0UgYWxnb3JpdGhtLgorCisuLiBtZXRob2Q6OiBzaGFrZS5kaWdlc3QobGVuZ3RoKQorCisgICBSZXR1cm4gdGhlIGRpZ2VzdCBvZiB0aGUgZGF0YSBwYXNzZWQgdG8gdGhlIDptZXRoOmB1cGRhdGVgIG1ldGhvZCBzbyBmYXIuCisgICBUaGlzIGlzIGEgYnl0ZXMgb2JqZWN0IG9mIHNpemUgYGBsZW5ndGhgYCB3aGljaCBtYXkgY29udGFpbiBieXRlcyBpbgorICAgdGhlIHdob2xlIHJhbmdlIGZyb20gMCB0byAyNTUuCisKKworLi4gbWV0aG9kOjogc2hha2UuaGV4ZGlnZXN0KGxlbmd0aCkKKworICAgTGlrZSA6bWV0aDpgZGlnZXN0YCBleGNlcHQgdGhlIGRpZ2VzdCBpcyByZXR1cm5lZCBhcyBhIHN0cmluZyBvYmplY3Qgb2YKKyAgIGRvdWJsZSBsZW5ndGgsIGNvbnRhaW5pbmcgb25seSBoZXhhZGVjaW1hbCBkaWdpdHMuICBUaGlzIG1heSBiZSB1c2VkIHRvCisgICBleGNoYW5nZSB0aGUgdmFsdWUgc2FmZWx5IGluIGVtYWlsIG9yIG90aGVyIG5vbi1iaW5hcnkgZW52aXJvbm1lbnRzLgorCisKIEtleSBkZXJpdmF0aW9uCiAtLS0tLS0tLS0tLS0tLQogCkBAIC0yMjEsNiArMjU3LDI5IEBACiAgICAgICBQeXRob24gaW1wbGVtZW50YXRpb24gdXNlcyBhbiBpbmxpbmUgdmVyc2lvbiBvZiA6bW9kOmBobWFjYC4gSXQgaXMgYWJvdXQKICAgICAgIHRocmVlIHRpbWVzIHNsb3dlciBhbmQgZG9lc24ndCByZWxlYXNlIHRoZSBHSUwuCiAKKy4uIGZ1bmN0aW9uOjogc2NyeXB0KHBhc3N3b3JkLCAqLCBzYWx0LCBuLCByLCBwLCBtYXhtZW09MCwgZGtsZW49NjQpCisKKyAgIFRoZSBmdW5jdGlvbiBwcm92aWRlcyBzY3J5cHQgcGFzc3dvcmQtYmFzZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gYXMKKyAgIGRlZmluZWQgaW4gOnJmYzpgNzkxNGAuCisKKyAgICpwYXNzd29yZCogYW5kICpzYWx0KiBtdXN0IGJlIGJ5dGVzLWxpa2Ugb2JqZWN0cy4gQXBwbGljYXRpb25zIGFuZAorICAgbGlicmFyaWVzIHNob3VsZCBsaW1pdCAqcGFzc3dvcmQqIHRvIGEgc2Vuc2libGUgbGVuZ3RoIChlLmcuIDEwMjQpLiAqc2FsdCoKKyAgIHNob3VsZCBiZSBhYm91dCAxNiBvciBtb3JlIGJ5dGVzIGZyb20gYSBwcm9wZXIgc291cmNlLCBlLmcuIDpmdW5jOmBvcy51cmFuZG9tYC4KKworICAgKm4qIGlzIHRoZSBDUFUvTWVtb3J5IGNvc3QgZmFjdG9yLCAqciogdGhlIGJsb2NrIHNpemUsICpwKiBwYXJhbGxlbGl6YXRpb24KKyAgIGZhY3RvciBhbmQgKm1heG1lbSogbGltaXRzIG1lbW9yeSAoT3BlblNTTCAxLjEuMCBkZWZhdWx0cyB0byAzMiBNQikuCisgICAqZGtsZW4qIGlzIHRoZSBsZW5ndGggb2YgdGhlIGRlcml2ZWQga2V5LgorCisgICBBdmFpbGFiaWxpdHk6IE9wZW5TU0wgMS4xKworCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCitCTEFLRTIKKy0tLS0tLQorCitCTEFLRTIgdGFrZXMgYWRkaXRpb25hbCBhcmd1bWVudHMsIHNlZSA6cmVmOmBoYXNobGliLWJsYWtlMmAuCisKIAogLi4gc2VlYWxzbzo6CiAKQEAgLTIzMCw2ICsyODksOCBAQAogICAgTW9kdWxlIDptb2Q6YGJhc2U2NGAKICAgICAgIEFub3RoZXIgd2F5IHRvIGVuY29kZSBiaW5hcnkgaGFzaGVzIGZvciBub24tYmluYXJ5IGVudmlyb25tZW50cy4KIAorICAgU2VlIDpyZWY6YGhhc2hsaWItYmxha2UyYC4KKwogICAgaHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL2ZpcHMvZmlwczE4MC0yL2ZpcHMxODAtMi5wZGYKICAgICAgIFRoZSBGSVBTIDE4MC0yIHB1YmxpY2F0aW9uIG9uIFNlY3VyZSBIYXNoIEFsZ29yaXRobXMuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2h0dHAuY2xpZW50LnJzdCBiL0RvYy9saWJyYXJ5L2h0dHAuY2xpZW50LnJzdAppbmRleCBkODYzZmU5Li45MGMwNDIxIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9odHRwLmNsaWVudC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaHR0cC5jbGllbnQucnN0CkBAIC0yMTcsMzkgKzIxNyw2MSBAQAogOmNsYXNzOmBIVFRQQ29ubmVjdGlvbmAgaW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgogCiAKLS4uIG1ldGhvZDo6IEhUVFBDb25uZWN0aW9uLnJlcXVlc3QobWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz17fSkKKy4uIG1ldGhvZDo6IEhUVFBDb25uZWN0aW9uLnJlcXVlc3QobWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz17fSwgKiwgXAorICAgICAgICAgICAgZW5jb2RlX2NodW5rZWQ9RmFsc2UpCiAKICAgIFRoaXMgd2lsbCBzZW5kIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBIVFRQIHJlcXVlc3QKICAgIG1ldGhvZCAqbWV0aG9kKiBhbmQgdGhlIHNlbGVjdG9yICp1cmwqLgogCiAgICBJZiAqYm9keSogaXMgc3BlY2lmaWVkLCB0aGUgc3BlY2lmaWVkIGRhdGEgaXMgc2VudCBhZnRlciB0aGUgaGVhZGVycyBhcmUKLSAgIGZpbmlzaGVkLiAgSXQgbWF5IGJlIGEgc3RyaW5nLCBhIDp0ZXJtOmBieXRlcy1saWtlIG9iamVjdGAsIGFuIG9wZW4KLSAgIDp0ZXJtOmBmaWxlIG9iamVjdGAsIG9yIGFuIGl0ZXJhYmxlIG9mIDp0ZXJtOmBieXRlcy1saWtlIG9iamVjdGBccy4gIElmCi0gICAqYm9keSogaXMgYSBzdHJpbmcsIGl0IGlzIGVuY29kZWQgYXMgSVNPLTg4NTktMSwgdGhlIGRlZmF1bHQgZm9yIEhUVFAuICBJZgotICAgaXQgaXMgYSBieXRlcy1saWtlIG9iamVjdCB0aGUgYnl0ZXMgYXJlIHNlbnQgYXMgaXMuICBJZiBpdCBpcyBhIDp0ZXJtOmBmaWxlCi0gICBvYmplY3RgLCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgaXMgc2VudDsgdGhpcyBmaWxlIG9iamVjdCBzaG91bGQgc3VwcG9ydAotICAgYXQgbGVhc3QgdGhlIGBgcmVhZCgpYGAgbWV0aG9kLiAgSWYgdGhlIGZpbGUgb2JqZWN0IGhhcyBhIGBgbW9kZWBgCi0gICBhdHRyaWJ1dGUsIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBgYHJlYWQoKWBgIG1ldGhvZCB3aWxsIGJlIGVuY29kZWQgYXMKLSAgIElTTy04ODU5LTEgdW5sZXNzIHRoZSBgYG1vZGVgYCBhdHRyaWJ1dGUgY29udGFpbnMgdGhlIHN1YnN0cmluZyBgYGJgYCwKLSAgIG90aGVyd2lzZSB0aGUgZGF0YSByZXR1cm5lZCBieSBgYHJlYWQoKWBgIGlzIHNlbnQgYXMgaXMuICBJZiAqYm9keSogaXMgYW4KLSAgIGl0ZXJhYmxlLCB0aGUgZWxlbWVudHMgb2YgdGhlIGl0ZXJhYmxlIGFyZSBzZW50IGFzIGlzIHVudGlsIHRoZSBpdGVyYWJsZSBpcwotICAgZXhoYXVzdGVkLgorICAgZmluaXNoZWQuICBJdCBtYXkgYmUgYSA6Y2xhc3M6YHN0cmAsIGEgOnRlcm06YGJ5dGVzLWxpa2Ugb2JqZWN0YCwgYW4KKyAgIG9wZW4gOnRlcm06YGZpbGUgb2JqZWN0YCwgb3IgYW4gaXRlcmFibGUgb2YgOmNsYXNzOmBieXRlc2AuICBJZiAqYm9keSoKKyAgIGlzIGEgc3RyaW5nLCBpdCBpcyBlbmNvZGVkIGFzIElTTy04ODU5LTEsIHRoZSBkZWZhdWx0IGZvciBIVFRQLiAgSWYgaXQKKyAgIGlzIGEgYnl0ZXMtbGlrZSBvYmplY3QsIHRoZSBieXRlcyBhcmUgc2VudCBhcyBpcy4gIElmIGl0IGlzIGEgOnRlcm06YGZpbGUKKyAgIG9iamVjdGAsIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBpcyBzZW50OyB0aGlzIGZpbGUgb2JqZWN0IHNob3VsZAorICAgc3VwcG9ydCBhdCBsZWFzdCB0aGUgYGByZWFkKClgYCBtZXRob2QuICBJZiB0aGUgZmlsZSBvYmplY3QgaXMgYW4KKyAgIGluc3RhbmNlIG9mIDpjbGFzczpgaW8uVGV4dElPQmFzZWAsIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBgYHJlYWQoKWBgCisgICBtZXRob2Qgd2lsbCBiZSBlbmNvZGVkIGFzIElTTy04ODU5LTEsIG90aGVyd2lzZSB0aGUgZGF0YSByZXR1cm5lZCBieQorICAgYGByZWFkKClgYCBpcyBzZW50IGFzIGlzLiAgSWYgKmJvZHkqIGlzIGFuIGl0ZXJhYmxlLCB0aGUgZWxlbWVudHMgb2YgdGhlCisgICBpdGVyYWJsZSBhcmUgc2VudCBhcyBpcyB1bnRpbCB0aGUgaXRlcmFibGUgaXMgZXhoYXVzdGVkLgogCi0gICBUaGUgKmhlYWRlcnMqIGFyZ3VtZW50IHNob3VsZCBiZSBhIG1hcHBpbmcgb2YgZXh0cmEgSFRUUAotICAgaGVhZGVycyB0byBzZW5kIHdpdGggdGhlIHJlcXVlc3QuCisgICBUaGUgKmhlYWRlcnMqIGFyZ3VtZW50IHNob3VsZCBiZSBhIG1hcHBpbmcgb2YgZXh0cmEgSFRUUCBoZWFkZXJzIHRvIHNlbmQKKyAgIHdpdGggdGhlIHJlcXVlc3QuCiAKLSAgIElmICpoZWFkZXJzKiBkb2VzIG5vdCBjb250YWluIGEgQ29udGVudC1MZW5ndGggaXRlbSwgb25lIGlzIGFkZGVkCi0gICBhdXRvbWF0aWNhbGx5IGlmIHBvc3NpYmxlLiAgSWYgKmJvZHkqIGlzIGBgTm9uZWBgLCB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyCi0gICBpcyBzZXQgdG8gYGAwYGAgZm9yIG1ldGhvZHMgdGhhdCBleHBlY3QgYSBib2R5IChgYFBVVGBgLCBgYFBPU1RgYCwgYW5kCi0gICBgYFBBVENIYGApLiAgSWYgKmJvZHkqIGlzIGEgc3RyaW5nIG9yIGJ5dGVzIG9iamVjdCwgdGhlIENvbnRlbnQtTGVuZ3RoCi0gICBoZWFkZXIgaXMgc2V0IHRvIGl0cyBsZW5ndGguICBJZiAqYm9keSogaXMgYSA6dGVybTpgZmlsZSBvYmplY3RgIGFuZCBpdAotICAgd29ya3MgdG8gY2FsbCA6ZnVuYzpgfm9zLmZzdGF0YCBvbiB0aGUgcmVzdWx0IG9mIGl0cyBgYGZpbGVubygpYGAgbWV0aG9kLAotICAgdGhlbiB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyIGlzIHNldCB0byB0aGUgYGBzdF9zaXplYGAgcmVwb3J0ZWQgYnkgdGhlCi0gICBgYGZzdGF0YGAgY2FsbC4gIE90aGVyd2lzZSBubyBDb250ZW50LUxlbmd0aCBoZWFkZXIgaXMgYWRkZWQuCisgICBJZiAqaGVhZGVycyogY29udGFpbnMgbmVpdGhlciBDb250ZW50LUxlbmd0aCBub3IgVHJhbnNmZXItRW5jb2RpbmcsCisgICBidXQgdGhlcmUgaXMgYSByZXF1ZXN0IGJvZHksIG9uZSBvZiB0aG9zZQorICAgaGVhZGVyIGZpZWxkcyB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuICBJZgorICAgKmJvZHkqIGlzIGBgTm9uZWBgLCB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyIGlzIHNldCB0byBgYDBgYCBmb3IKKyAgIG1ldGhvZHMgdGhhdCBleHBlY3QgYSBib2R5IChgYFBVVGBgLCBgYFBPU1RgYCwgYW5kIGBgUEFUQ0hgYCkuICBJZgorICAgKmJvZHkqIGlzIGEgc3RyaW5nIG9yIGEgYnl0ZXMtbGlrZSBvYmplY3QgdGhhdCBpcyBub3QgYWxzbyBhCisgICA6dGVybTpgZmlsZSA8ZmlsZSBvYmplY3Q+YCwgdGhlIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBpcworICAgc2V0IHRvIGl0cyBsZW5ndGguICBBbnkgb3RoZXIgdHlwZSBvZiAqYm9keSogKGZpbGVzCisgICBhbmQgaXRlcmFibGVzIGluIGdlbmVyYWwpIHdpbGwgYmUgY2h1bmstZW5jb2RlZCwgYW5kIHRoZQorICAgVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyIHdpbGwgYXV0b21hdGljYWxseSBiZSBzZXQgaW5zdGVhZCBvZgorICAgQ29udGVudC1MZW5ndGguCisKKyAgIFRoZSAqZW5jb2RlX2NodW5rZWQqIGFyZ3VtZW50IGlzIG9ubHkgcmVsZXZhbnQgaWYgVHJhbnNmZXItRW5jb2RpbmcgaXMKKyAgIHNwZWNpZmllZCBpbiAqaGVhZGVycyouICBJZiAqZW5jb2RlX2NodW5rZWQqIGlzIGBgRmFsc2VgYCwgdGhlCisgICBIVFRQQ29ubmVjdGlvbiBvYmplY3QgYXNzdW1lcyB0aGF0IGFsbCBlbmNvZGluZyBpcyBoYW5kbGVkIGJ5IHRoZQorICAgY2FsbGluZyBjb2RlLiAgSWYgaXQgaXMgYGBUcnVlYGAsIHRoZSBib2R5IHdpbGwgYmUgY2h1bmstZW5jb2RlZC4KKworICAgLi4gbm90ZTo6CisgICAgICBDaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBIVFRQIHByb3RvY29sCisgICAgICB2ZXJzaW9uIDEuMS4gIFVubGVzcyB0aGUgSFRUUCBzZXJ2ZXIgaXMga25vd24gdG8gaGFuZGxlIEhUVFAgMS4xLAorICAgICAgdGhlIGNhbGxlciBtdXN0IGVpdGhlciBzcGVjaWZ5IHRoZSBDb250ZW50LUxlbmd0aCwgb3IgbXVzdCBwYXNzIGEKKyAgICAgIDpjbGFzczpgc3RyYCBvciBieXRlcy1saWtlIG9iamVjdCB0aGF0IGlzIG5vdCBhbHNvIGEgZmlsZSBhcyB0aGUKKyAgICAgIGJvZHkgcmVwcmVzZW50YXRpb24uCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogICAgICAgKmJvZHkqIGNhbiBub3cgYmUgYW4gaXRlcmFibGUuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBJZiBuZWl0aGVyIENvbnRlbnQtTGVuZ3RoIG5vciBUcmFuc2Zlci1FbmNvZGluZyBhcmUgc2V0IGluCisgICAgICAqaGVhZGVycyosIGZpbGUgYW5kIGl0ZXJhYmxlICpib2R5KiBvYmplY3RzIGFyZSBub3cgY2h1bmstZW5jb2RlZC4KKyAgICAgIFRoZSAqZW5jb2RlX2NodW5rZWQqIGFyZ3VtZW50IHdhcyBhZGRlZC4KKyAgICAgIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtTGVuZ3RoIGZvciBmaWxlCisgICAgICBvYmplY3RzLgorCiAuLiBtZXRob2Q6OiBIVFRQQ29ubmVjdGlvbi5nZXRyZXNwb25zZSgpCiAKICAgIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYSByZXF1ZXN0IGlzIHNlbnQgdG8gZ2V0IHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuCkBAIC0zMzUsMTMgKzM1NywzMiBAQAogICAgYW4gYXJndW1lbnQuCiAKIAotLi4gbWV0aG9kOjogSFRUUENvbm5lY3Rpb24uZW5kaGVhZGVycyhtZXNzYWdlX2JvZHk9Tm9uZSkKKy4uIG1ldGhvZDo6IEhUVFBDb25uZWN0aW9uLmVuZGhlYWRlcnMobWVzc2FnZV9ib2R5PU5vbmUsICosIGVuY29kZV9jaHVua2VkPUZhbHNlKQogCiAgICBTZW5kIGEgYmxhbmsgbGluZSB0byB0aGUgc2VydmVyLCBzaWduYWxsaW5nIHRoZSBlbmQgb2YgdGhlIGhlYWRlcnMuIFRoZQogICAgb3B0aW9uYWwgKm1lc3NhZ2VfYm9keSogYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gcGFzcyBhIG1lc3NhZ2UgYm9keQotICAgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0LiAgVGhlIG1lc3NhZ2UgYm9keSB3aWxsIGJlIHNlbnQgaW4gdGhlIHNhbWUKLSAgIHBhY2tldCBhcyB0aGUgbWVzc2FnZSBoZWFkZXJzIGlmIGl0IGlzIHN0cmluZywgb3RoZXJ3aXNlIGl0IGlzIHNlbnQgaW4gYQotICAgc2VwYXJhdGUgcGFja2V0LgorICAgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0LgorCisgICBJZiAqZW5jb2RlX2NodW5rZWQqIGlzIGBgVHJ1ZWBgLCB0aGUgcmVzdWx0IG9mIGVhY2ggaXRlcmF0aW9uIG9mCisgICAqbWVzc2FnZV9ib2R5KiB3aWxsIGJlIGNodW5rLWVuY29kZWQgYXMgc3BlY2lmaWVkIGluIDpyZmM6YDcyMzBgLAorICAgU2VjdGlvbiAzLjMuMS4gIEhvdyB0aGUgZGF0YSBpcyBlbmNvZGVkIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSBvZgorICAgKm1lc3NhZ2VfYm9keSouICBJZiAqbWVzc2FnZV9ib2R5KiBpbXBsZW1lbnRzIHRoZSA6cmVmOmBidWZmZXIgaW50ZXJmYWNlCisgICA8YnVmZmVyb2JqZWN0cz5gIHRoZSBlbmNvZGluZyB3aWxsIHJlc3VsdCBpbiBhIHNpbmdsZSBjaHVuay4KKyAgIElmICptZXNzYWdlX2JvZHkqIGlzIGEgOmNsYXNzOmBjb2xsZWN0aW9ucy5JdGVyYWJsZWAsIGVhY2ggaXRlcmF0aW9uCisgICBvZiAqbWVzc2FnZV9ib2R5KiB3aWxsIHJlc3VsdCBpbiBhIGNodW5rLiAgSWYgKm1lc3NhZ2VfYm9keSogaXMgYQorICAgOnRlcm06YGZpbGUgb2JqZWN0YCwgZWFjaCBjYWxsIHRvIGBgLnJlYWQoKWBgIHdpbGwgcmVzdWx0IGluIGEgY2h1bmsuCisgICBUaGUgbWV0aG9kIGF1dG9tYXRpY2FsbHkgc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBjaHVuay1lbmNvZGVkIGRhdGEKKyAgIGltbWVkaWF0ZWx5IGFmdGVyICptZXNzYWdlX2JvZHkqLgorCisgICAuLiBub3RlOjogRHVlIHRvIHRoZSBjaHVua2VkIGVuY29kaW5nIHNwZWNpZmljYXRpb24sIGVtcHR5IGNodW5rcworICAgICAgeWllbGRlZCBieSBhbiBpdGVyYXRvciBib2R5IHdpbGwgYmUgaWdub3JlZCBieSB0aGUgY2h1bmstZW5jb2Rlci4KKyAgICAgIFRoaXMgaXMgdG8gYXZvaWQgcHJlbWF0dXJlIHRlcm1pbmF0aW9uIG9mIHRoZSByZWFkIG9mIHRoZSByZXF1ZXN0IGJ5CisgICAgICB0aGUgdGFyZ2V0IHNlcnZlciBkdWUgdG8gbWFsZm9ybWVkIGVuY29kaW5nLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgIENodW5rZWQgZW5jb2Rpbmcgc3VwcG9ydC4gIFRoZSAqZW5jb2RlX2NodW5rZWQqIHBhcmFtZXRlciB3YXMKKyAgICAgIGFkZGVkLgorCiAKIC4uIG1ldGhvZDo6IEhUVFBDb25uZWN0aW9uLnNlbmQoZGF0YSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaHR0cC5zZXJ2ZXIucnN0IGIvRG9jL2xpYnJhcnkvaHR0cC5zZXJ2ZXIucnN0CmluZGV4IDE2YzRmYWMuLmMxZWE4NzMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2h0dHAuc2VydmVyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9odHRwLnNlcnZlci5yc3QKQEAgLTk4LDggKzk4LDggQEAKIAogICAgLi4gYXR0cmlidXRlOjogcmZpbGUKIAotICAgICAgQ29udGFpbnMgYW4gaW5wdXQgc3RyZWFtLCBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgb3B0aW9uYWwgaW5wdXQKLSAgICAgIGRhdGEuCisgICAgICBBbiA6Y2xhc3M6YGlvLkJ1ZmZlcmVkSU9CYXNlYCBpbnB1dCBzdHJlYW0sIHJlYWR5IHRvIHJlYWQgZnJvbQorICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBvcHRpb25hbCBpbnB1dCBkYXRhLgogCiAgICAuLiBhdHRyaWJ1dGU6OiB3ZmlsZQogCkBAIC0xMDcsNiArMTA3LDkgQEAKICAgICAgIGNsaWVudC4gUHJvcGVyIGFkaGVyZW5jZSB0byB0aGUgSFRUUCBwcm90b2NvbCBtdXN0IGJlIHVzZWQgd2hlbiB3cml0aW5nIHRvCiAgICAgICB0aGlzIHN0cmVhbS4KIAorICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICAgIFRoaXMgaXMgYW4gOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgc3RyZWFtLgorCiAgICA6Y2xhc3M6YEJhc2VIVFRQUmVxdWVzdEhhbmRsZXJgIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CiAKICAgIC4uIGF0dHJpYnV0ZTo6IHNlcnZlcl92ZXJzaW9uCkBAIC0zNjksMTAgKzM3Miw5IEBACiAKICAgIEhhbmRsZXIgPSBodHRwLnNlcnZlci5TaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIKIAotICAgaHR0cGQgPSBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKCgiIiwgUE9SVCksIEhhbmRsZXIpCi0KLSAgIHByaW50KCJzZXJ2aW5nIGF0IHBvcnQiLCBQT1JUKQotICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICB3aXRoIHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKCIiLCBQT1JUKSwgSGFuZGxlcikgYXMgaHR0cGQ6CisgICAgICAgcHJpbnQoInNlcnZpbmcgYXQgcG9ydCIsIFBPUlQpCisgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCiAKIC4uIF9odHRwLXNlcnZlci1jbGk6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0IGIvRG9jL2xpYnJhcnkvaW1hcGxpYi5yc3QKaW5kZXggYzI1ZTdkOC4uYjliM2I5MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW1hcGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaW1hcGxpYi5yc3QKQEAgLTUwMCw2ICs1MDAsMTcgQEAKICAgICAgICAgIE0uc3RvcmUobnVtLCAnK0ZMQUdTJywgJ1xcRGVsZXRlZCcpCiAgICAgICBNLmV4cHVuZ2UoKQogCisgICAuLiBub3RlOjoKKworICAgICAgQ3JlYXRpbmcgZmxhZ3MgY29udGFpbmluZyAnXScgKGZvciBleGFtcGxlOiAiW3Rlc3RdIikgdmlvbGF0ZXMKKyAgICAgIDpyZmM6YDM1MDFgICh0aGUgSU1BUCBwcm90b2NvbCkuICBIb3dldmVyLCBpbWFwbGliIGhhcyBoaXN0b3JpY2FsbHkKKyAgICAgIGFsbG93ZWQgY3JlYXRpb24gb2Ygc3VjaCB0YWdzLCBhbmQgcG9wdWxhciBJTUFQIHNlcnZlcnMsIHN1Y2ggYXMgR21haWwsCisgICAgICBhY2NlcHQgYW5kIHByb2R1Y2Ugc3VjaCBmbGFncy4gIFRoZXJlIGFyZSBub24tUHl0aG9uIHByb2dyYW1zIHdoaWNoIGFsc28KKyAgICAgIGNyZWF0ZSBzdWNoIHRhZ3MuICBBbHRob3VnaCBpdCBpcyBhbiBSRkMgdmlvbGF0aW9uIGFuZCBJTUFQIGNsaWVudHMgYW5kCisgICAgICBzZXJ2ZXJzIGFyZSBzdXBwb3NlZCB0byBiZSBzdHJpY3QsIGltYXBsaWIgbm9uZXRoZWxlc3MgY29udGludWVzIHRvIGFsbG93CisgICAgICBzdWNoIHRhZ3MgdG8gYmUgY3JlYXRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb25zLCBhbmQgYXMgb2YKKyAgICAgIHB5dGhvbiAzLjYsIGhhbmRsZXMgdGhlbSBpZiB0aGV5IGFyZSBzZW50IGZyb20gdGhlIHNlcnZlciwgc2luY2UgdGhpcworICAgICAgaW1wcm92ZXMgcmVhbC13b3JsZCBjb21wYXRpYmlsaXR5LgogCiAuLiBtZXRob2Q6OiBJTUFQNC5zdWJzY3JpYmUobWFpbGJveCkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW1wLnJzdCBiL0RvYy9saWJyYXJ5L2ltcC5yc3QKaW5kZXggOTgyOGJhNi4uY2NmNWY5MiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW1wLnJzdAorKysgYi9Eb2MvbGlicmFyeS9pbXAucnN0CkBAIC04NSw3ICs4NSw5IEBACiAgICAuLiBkZXByZWNhdGVkOjogMy4zCiAgICAgICBVc2UgOmZ1bmM6YGltcG9ydGxpYi51dGlsLmZpbmRfc3BlY2AgaW5zdGVhZCB1bmxlc3MgUHl0aG9uIDMuMwogICAgICAgY29tcGF0aWJpbGl0eSBpcyByZXF1aXJlZCwgaW4gd2hpY2ggY2FzZSB1c2UKLSAgICAgIDpmdW5jOmBpbXBvcnRsaWIuZmluZF9sb2FkZXJgLgorICAgICAgOmZ1bmM6YGltcG9ydGxpYi5maW5kX2xvYWRlcmAuIEZvciBleGFtcGxlIHVzYWdlIG9mIHRoZSBmb3JtZXIgY2FzZSwKKyAgICAgIHNlZSB0aGUgOnJlZjpgaW1wb3J0bGliLWV4YW1wbGVzYCBzZWN0aW9uIG9mIHRoZSA6bW9kOmBpbXBvcnRsaWJgCisgICAgICBkb2N1bWVudGF0aW9uLgogCiAKIC4uIGZ1bmN0aW9uOjogbG9hZF9tb2R1bGUobmFtZSwgZmlsZSwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uKQpAQCAtMTEyLDkgKzExNCwxMiBAQAogICAgICAgSWYgcHJldmlvdXNseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggOmZ1bmM6YGltcC5maW5kX21vZHVsZWAgdGhlbgogICAgICAgY29uc2lkZXIgdXNpbmcgOmZ1bmM6YGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlYCwgb3RoZXJ3aXNlIHVzZSB0aGUgbG9hZGVyCiAgICAgICByZXR1cm5lZCBieSB0aGUgcmVwbGFjZW1lbnQgeW91IGNob3NlIGZvciA6ZnVuYzpgaW1wLmZpbmRfbW9kdWxlYC4gSWYgeW91Ci0gICAgICBjYWxsZWQgOmZ1bmM6YGltcC5sb2FkX21vZHVsZWAgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIGRpcmVjdGx5IHRoZW4gdXNlIHRoZQotICAgICAgY2xhc3NlcyBpbiA6bW9kOmBpbXBvcnRsaWIubWFjaGluZXJ5YCwgZS5nLgotICAgICAgYGBpbXBvcnRsaWIubWFjaGluZXJ5LlNvdXJjZUZpbGVMb2FkZXIobmFtZSwgcGF0aCkubG9hZF9tb2R1bGUoKWBgLgorICAgICAgY2FsbGVkIDpmdW5jOmBpbXAubG9hZF9tb2R1bGVgIGFuZCByZWxhdGVkIGZ1bmN0aW9ucyBkaXJlY3RseSB3aXRoIGZpbGUKKyAgICAgIHBhdGggYXJndW1lbnRzIHRoZW4gdXNlIGEgY29tYmluYXRpb24gb2YKKyAgICAgIDpmdW5jOmBpbXBvcnRsaWIudXRpbC5zcGVjX2Zyb21fZmlsZV9sb2NhdGlvbmAgYW5kCisgICAgICA6ZnVuYzpgaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlY2AuIFNlZSB0aGUgOnJlZjpgaW1wb3J0bGliLWV4YW1wbGVzYAorICAgICAgc2VjdGlvbiBvZiB0aGUgOm1vZDpgaW1wb3J0bGliYCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9mIHRoZSB2YXJpb3VzCisgICAgICBhcHByb2FjaGVzLgogCiAKIC4uIGZ1bmN0aW9uOjogbmV3X21vZHVsZShuYW1lKQpAQCAtMTIzLDcgKzEyOCw3IEBACiAgICBpbiBgYHN5cy5tb2R1bGVzYGAuCiAKICAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjQKLSAgICAgIFVzZSA6Y2xhc3M6YHR5cGVzLk1vZHVsZVR5cGVgIGluc3RlYWQuCisgICAgICBVc2UgOmZ1bmM6YGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWNgIGluc3RlYWQuCiAKIAogLi4gZnVuY3Rpb246OiByZWxvYWQobW9kdWxlKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW1wb3J0bGliLnJzdCBiL0RvYy9saWJyYXJ5L2ltcG9ydGxpYi5yc3QKaW5kZXggM2Q4MzUwOS4uMGQzMTRhNyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW1wb3J0bGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9pbXBvcnRsaWIucnN0CkBAIC0yNjcsNyArMjY3LDcgQEAKICAgICAgIG1vZHVsZSBhbmQgKnBhdGgqIHdpbGwgYmUgdGhlIHZhbHVlIG9mIDphdHRyOmBfX3BhdGhfX2AgZnJvbSB0aGUKICAgICAgIHBhcmVudCBwYWNrYWdlLiBJZiBhIHNwZWMgY2Fubm90IGJlIGZvdW5kLCBgYE5vbmVgYCBpcyByZXR1cm5lZC4KICAgICAgIFdoZW4gcGFzc2VkIGluLCBgYHRhcmdldGBgIGlzIGEgbW9kdWxlIG9iamVjdCB0aGF0IHRoZSBmaW5kZXIgbWF5Ci0gICAgICB1c2UgdG8gbWFrZSBhIG1vcmUgZWR1Y2F0ZWQgYWJvdXQgd2hhdCBzcGVjIHRvIHJldHVybi4KKyAgICAgIHVzZSB0byBtYWtlIGEgbW9yZSBlZHVjYXRlZCBndWVzcyBhYm91dCB3aGF0IHNwZWMgdG8gcmV0dXJuLgogCiAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIApAQCAtMzE3LDcgKzMxNyw3IEBACiAgICAgICB3aXRoaW4gdGhlIDp0ZXJtOmBwYXRoIGVudHJ5YCB0byB3aGljaCBpdCBpcyBhc3NpZ25lZC4gIElmIGEgc3BlYwogICAgICAgY2Fubm90IGJlIGZvdW5kLCBgYE5vbmVgYCBpcyByZXR1cm5lZC4gIFdoZW4gcGFzc2VkIGluLCBgYHRhcmdldGBgCiAgICAgICBpcyBhIG1vZHVsZSBvYmplY3QgdGhhdCB0aGUgZmluZGVyIG1heSB1c2UgdG8gbWFrZSBhIG1vcmUgZWR1Y2F0ZWQKLSAgICAgIGFib3V0IHdoYXQgc3BlYyB0byByZXR1cm4uCisgICAgICBndWVzcyBhYm91dCB3aGF0IHNwZWMgdG8gcmV0dXJuLgogCiAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIApAQCAtMzc5LDEwICszNzksMTQgQEAKIAogICAgICAgIEFuIGFic3RyYWN0IG1ldGhvZCB0aGF0IGV4ZWN1dGVzIHRoZSBtb2R1bGUgaW4gaXRzIG93biBuYW1lc3BhY2UKICAgICAgICB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGVkIG9yIHJlbG9hZGVkLiAgVGhlIG1vZHVsZSBzaG91bGQgYWxyZWFkeQotICAgICAgIGJlIGluaXRpYWxpemVkIHdoZW4gZXhlY19tb2R1bGUoKSBpcyBjYWxsZWQuCisgICAgICAgYmUgaW5pdGlhbGl6ZWQgd2hlbiBgYGV4ZWNfbW9kdWxlKClgYCBpcyBjYWxsZWQuIFdoZW4gdGhpcyBtZXRob2QgZXhpc3RzLAorICAgICAgIDptZXRoOmB+aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZWAgbXVzdCBiZSBkZWZpbmVkLgogCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKKyAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgIDptZXRoOmB+aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZWAgbXVzdCBhbHNvIGJlIGRlZmluZWQuCisKICAgICAuLiBtZXRob2Q6OiBsb2FkX21vZHVsZShmdWxsbmFtZSkKIAogICAgICAgICBBIGxlZ2FjeSBtZXRob2QgZm9yIGxvYWRpbmcgYSBtb2R1bGUuIElmIHRoZSBtb2R1bGUgY2Fubm90IGJlCkBAIC05MzYsNiArOTQwLDEwIEBACiAgICAgICBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIubG9hZF9tb2R1bGVgIHdoZXJlCiAgICAgICBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gbG9hZCBpcyBvcHRpb25hbC4KIAorICAgICAgLi4gZGVwcmVjYXRlZDo6IDMuNgorCisgICAgICAgICBVc2UgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmV4ZWNfbW9kdWxlYCBpbnN0ZWFkLgorCiAKIC4uIGNsYXNzOjogU291cmNlbGVzc0ZpbGVMb2FkZXIoZnVsbG5hbWUsIHBhdGgpCiAKQEAgLTk3NSw2ICs5ODMsMTAgQEAKICAgIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5sb2FkX21vZHVsZWAgd2hlcmUKICAgIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBsb2FkIGlzIG9wdGlvbmFsLgogCisgICAuLiBkZXByZWNhdGVkOjogMy42CisKKyAgICAgIFVzZSA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIuZXhlY19tb2R1bGVgIGluc3RlYWQuCisKIAogLi4gY2xhc3M6OiBFeHRlbnNpb25GaWxlTG9hZGVyKGZ1bGxuYW1lLCBwYXRoKQogCkBAIC0xMTM3LDYgKzExNDksOSBAQAogICAgICAgVGhlICpvcHRpbWl6YXRpb24qIHBhcmFtZXRlciB3YXMgYWRkZWQgYW5kIHRoZSAqZGVidWdfb3ZlcnJpZGUqIHBhcmFtZXRlcgogICAgICAgd2FzIGRlcHJlY2F0ZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogc291cmNlX2Zyb21fY2FjaGUocGF0aCkKIApAQCAtMTE1MCw2ICsxMTY1LDkgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAuLiBmdW5jdGlvbjo6IGRlY29kZV9zb3VyY2Uoc291cmNlX2J5dGVzKQogCiAgICBEZWNvZGUgdGhlIGdpdmVuIGJ5dGVzIHJlcHJlc2VudGluZyBzb3VyY2UgY29kZSBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nCkBAIC0xMTkyLDEyICsxMjEwLDEzIEBACiAKIC4uIGZ1bmN0aW9uOjogbW9kdWxlX2Zyb21fc3BlYyhzcGVjKQogCi0gICBDcmVhdGUgYSBuZXcgbW9kdWxlIGJhc2VkIG9uICoqc3BlYyoqIGFuZCBgYHNwZWMubG9hZGVyLmNyZWF0ZV9tb2R1bGUoKWBgLgorICAgQ3JlYXRlIGEgbmV3IG1vZHVsZSBiYXNlZCBvbiAqKnNwZWMqKiBhbmQKKyAgIDptZXRoOmBzcGVjLmxvYWRlci5jcmVhdGVfbW9kdWxlIDxpbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlPmAuCiAKLSAgIElmIGBgc3BlYy5sb2FkZXIuY3JlYXRlX21vZHVsZSgpYGAgZG9lcyBub3QgcmV0dXJuIGBgTm9uZWBgLCB0aGVuIGFueQotICAgcHJlLWV4aXN0aW5nIGF0dHJpYnV0ZXMgd2lsbCBub3QgYmUgcmVzZXQuIEFsc28sIG5vIDpleGM6YEF0dHJpYnV0ZUVycm9yYAotICAgd2lsbCBiZSByYWlzZWQgaWYgdHJpZ2dlcmVkIHdoaWxlIGFjY2Vzc2luZyAqKnNwZWMqKiBvciBzZXR0aW5nIGFuIGF0dHJpYnV0ZQotICAgb24gdGhlIG1vZHVsZS4KKyAgIElmIDptZXRoOmBzcGVjLmxvYWRlci5jcmVhdGVfbW9kdWxlIDxpbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlPmAKKyAgIGRvZXMgbm90IHJldHVybiBgYE5vbmVgYCwgdGhlbiBhbnkgcHJlLWV4aXN0aW5nIGF0dHJpYnV0ZXMgd2lsbCBub3QgYmUgcmVzZXQuCisgICBBbHNvLCBubyA6ZXhjOmBBdHRyaWJ1dGVFcnJvcmAgd2lsbCBiZSByYWlzZWQgaWYgdHJpZ2dlcmVkIHdoaWxlIGFjY2Vzc2luZworICAgKipzcGVjKiogb3Igc2V0dGluZyBhbiBhdHRyaWJ1dGUgb24gdGhlIG1vZHVsZS4KIAogICAgVGhpcyBmdW5jdGlvbiBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyA6Y2xhc3M6YHR5cGVzLk1vZHVsZVR5cGVgIHRvIGNyZWF0ZSBhCiAgICBuZXcgbW9kdWxlIGFzICoqc3BlYyoqIGlzIHVzZWQgdG8gc2V0IGFzIG1hbnkgaW1wb3J0LWNvbnRyb2xsZWQgYXR0cmlidXRlcyBvbgpAQCAtMTI1OSw3ICsxMjc4LDggQEAKIAogLi4gZGVjb3JhdG9yOjogc2V0X3BhY2thZ2UKIAotICAgQSA6dGVybTpgZGVjb3JhdG9yYCBmb3IgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlYCB0byBzZXQgdGhlIDphdHRyOmBfX3BhY2thZ2VfX2AgYXR0cmlidXRlIG9uIHRoZSByZXR1cm5lZCBtb2R1bGUuIElmIDphdHRyOmBfX3BhY2thZ2VfX2AKKyAgIEEgOnRlcm06YGRlY29yYXRvcmAgZm9yIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5sb2FkX21vZHVsZWAgdG8gc2V0IHRoZQorICAgOmF0dHI6YF9fcGFja2FnZV9fYCBhdHRyaWJ1dGUgb24gdGhlIHJldHVybmVkIG1vZHVsZS4gSWYgOmF0dHI6YF9fcGFja2FnZV9fYAogICAgaXMgc2V0IGFuZCBoYXMgYSB2YWx1ZSBvdGhlciB0aGFuIGBgTm9uZWBgIGl0IHdpbGwgbm90IGJlIGNoYW5nZWQuCiAKICAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjQKQEAgLTEyODQsNiArMTMwNCw5IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogLi4gY2xhc3M6OiBMYXp5TG9hZGVyKGxvYWRlcikKIAogICAgQSBjbGFzcyB3aGljaCBwb3N0cG9uZXMgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbG9hZGVyIG9mIGEgbW9kdWxlIHVudGlsIHRoZQpAQCAtMTI5MiwxMyArMTMxNSwxMiBAQAogICAgVGhpcyBjbGFzcyAqKm9ubHkqKiB3b3JrcyB3aXRoIGxvYWRlcnMgdGhhdCBkZWZpbmUKICAgIDptZXRoOmB+aW1wb3J0bGliLmFiYy5Mb2FkZXIuZXhlY19tb2R1bGVgIGFzIGNvbnRyb2wgb3ZlciB3aGF0IG1vZHVsZSB0eXBlCiAgICBpcyB1c2VkIGZvciB0aGUgbW9kdWxlIGlzIHJlcXVpcmVkLiBGb3IgdGhvc2Ugc2FtZSByZWFzb25zLCB0aGUgbG9hZGVyJ3MKLSAgIDptZXRoOmB+aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZWAgbWV0aG9kIHdpbGwgYmUgaWdub3JlZCAoaS5lLiwgdGhlCi0gICBsb2FkZXIncyBtZXRob2Qgc2hvdWxkIG9ubHkgcmV0dXJuIGBgTm9uZWBgOyB0aGlzIGV4Y2x1ZGVzCi0gICA6Y2xhc3M6YEJ1aWx0aW5JbXBvcnRlcmAgYW5kIDpjbGFzczpgRXh0ZW5zaW9uRmlsZUxvYWRlcmApLiBGaW5hbGx5LAotICAgbW9kdWxlcyB3aGljaCBzdWJzdGl0dXRlIHRoZSBvYmplY3QgcGxhY2VkIGludG8gOmF0dHI6YHN5cy5tb2R1bGVzYCB3aWxsCi0gICBub3Qgd29yayBhcyB0aGVyZSBpcyBubyB3YXkgdG8gcHJvcGVybHkgcmVwbGFjZSB0aGUgbW9kdWxlIHJlZmVyZW5jZXMKLSAgIHRocm91Z2hvdXQgdGhlIGludGVycHJldGVyIHNhZmVseTsgOmV4YzpgVmFsdWVFcnJvcmAgaXMgcmFpc2VkIGlmIHN1Y2ggYQotICAgc3Vic3RpdHV0aW9uIGlzIGRldGVjdGVkLgorICAgOm1ldGg6YH5pbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlYCBtZXRob2QgbXVzdCByZXR1cm4gYGBOb25lYGAgb3IgYQorICAgdHlwZSBmb3Igd2hpY2ggaXRzIGBgX19jbGFzc19fYGAgYXR0cmlidXRlIGNhbiBiZSBtdXRhdGVkIGFsb25nIHdpdGggbm90CisgICB1c2luZyA6dGVybTpgc2xvdHMgPF9fc2xvdHNfXz5gLiBGaW5hbGx5LCBtb2R1bGVzIHdoaWNoIHN1YnN0aXR1dGUgdGhlIG9iamVjdAorICAgcGxhY2VkIGludG8gOmF0dHI6YHN5cy5tb2R1bGVzYCB3aWxsIG5vdCB3b3JrIGFzIHRoZXJlIGlzIG5vIHdheSB0byBwcm9wZXJseQorICAgcmVwbGFjZSB0aGUgbW9kdWxlIHJlZmVyZW5jZXMgdGhyb3VnaG91dCB0aGUgaW50ZXJwcmV0ZXIgc2FmZWx5OworICAgOmV4YzpgVmFsdWVFcnJvcmAgaXMgcmFpc2VkIGlmIHN1Y2ggYSBzdWJzdGl0dXRpb24gaXMgZGV0ZWN0ZWQuCiAKICAgIC4uIG5vdGU6OgogICAgICAgRm9yIHByb2plY3RzIHdoZXJlIHN0YXJ0dXAgdGltZSBpcyBjcml0aWNhbCwgdGhpcyBjbGFzcyBhbGxvd3MgZm9yCkBAIC0xMzA5LDYgKzEzMzEsMTEgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBCZWdhbiBjYWxsaW5nIDptZXRoOmB+aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZWAsIHJlbW92aW5nIHRoZQorICAgICAgY29tcGF0aWJpbGl0eSB3YXJuaW5nIGZvciA6Y2xhc3M6YGltcG9ydGxpYi5tYWNoaW5lcnkuQnVpbHRpbkltcG9ydGVyYCBhbmQKKyAgICAgIDpjbGFzczpgaW1wb3J0bGliLm1hY2hpbmVyeS5FeHRlbnNpb25GaWxlTG9hZGVyYC4KKwogICAgLi4gY2xhc3NtZXRob2Q6OiBmYWN0b3J5KGxvYWRlcikKIAogICAgICAgQSBzdGF0aWMgbWV0aG9kIHdoaWNoIHJldHVybnMgYSBjYWxsYWJsZSB0aGF0IGNyZWF0ZXMgYSBsYXp5IGxvYWRlci4gVGhpcwpAQCAtMTMyMCwzICsxMzQ3LDEzOSBAQAogICAgICAgICBsb2FkZXIgPSBpbXBvcnRsaWIubWFjaGluZXJ5LlNvdXJjZUZpbGVMb2FkZXIKICAgICAgICAgbGF6eV9sb2FkZXIgPSBpbXBvcnRsaWIudXRpbC5MYXp5TG9hZGVyLmZhY3RvcnkobG9hZGVyKQogICAgICAgICBmaW5kZXIgPSBpbXBvcnRsaWIubWFjaGluZXJ5LkZpbGVGaW5kZXIocGF0aCwgKGxhenlfbG9hZGVyLCBzdWZmaXhlcykpCisKKy4uIF9pbXBvcnRsaWItZXhhbXBsZXM6CisKK0V4YW1wbGVzCistLS0tLS0tLQorCitJbXBvcnRpbmcgcHJvZ3JhbW1hdGljYWxseQorJycnJycnJycnJycnJycnJycnJycnJycnJycKKworVG8gcHJvZ3JhbW1hdGljYWxseSBpbXBvcnQgYSBtb2R1bGUsIHVzZSA6ZnVuYzpgaW1wb3J0bGliLmltcG9ydF9tb2R1bGVgLgorOjoKKworICBpbXBvcnQgaW1wb3J0bGliCisKKyAgaXRlcnRvb2xzID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoJ2l0ZXJ0b29scycpCisKKworQ2hlY2tpbmcgaWYgYSBtb2R1bGUgY2FuIGJlIGltcG9ydGVkCisnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycKKworSWYgeW91IG5lZWQgdG8gZmluZCBvdXQgaWYgYSBtb2R1bGUgY2FuIGJlIGltcG9ydGVkIHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgdGhlCitpbXBvcnQsIHRoZW4geW91IHNob3VsZCB1c2UgOmZ1bmM6YGltcG9ydGxpYi51dGlsLmZpbmRfc3BlY2AuCis6OgorCisgIGltcG9ydCBpbXBvcnRsaWIudXRpbAorICBpbXBvcnQgc3lzCisKKyAgIyBGb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzLgorICBuYW1lID0gJ2l0ZXJ0b29scycKKworICBzcGVjID0gaW1wb3J0bGliLnV0aWwuZmluZF9zcGVjKG5hbWUpCisgIGlmIHNwZWMgaXMgTm9uZToKKyAgICAgIHByaW50KCJjYW4ndCBmaW5kIHRoZSBpdGVydG9vbHMgbW9kdWxlIikKKyAgZWxzZToKKyAgICAgICMgSWYgeW91IGNob3NlIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBpbXBvcnQgLi4uCisgICAgICBtb2R1bGUgPSBpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjKHNwZWMpCisgICAgICBzcGVjLmxvYWRlci5leGVjX21vZHVsZShtb2R1bGUpCisgICAgICAjIEFkZGluZyB0aGUgbW9kdWxlIHRvIHN5cy5tb2R1bGVzIGlzIG9wdGlvbmFsLgorICAgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBtb2R1bGUKKworCitJbXBvcnRpbmcgYSBzb3VyY2UgZmlsZSBkaXJlY3RseQorJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycKKworVG8gaW1wb3J0IGEgUHl0aG9uIHNvdXJjZSBmaWxlIGRpcmVjdGx5LCB1c2UgdGhlIGZvbGxvd2luZyByZWNpcGUKKyhQeXRob24gMy40IGFuZCBuZXdlciBvbmx5KTo6CisKKyAgaW1wb3J0IGltcG9ydGxpYi51dGlsCisgIGltcG9ydCBzeXMKKworICAjIEZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMuCisgIGltcG9ydCB0b2tlbml6ZQorICBmaWxlX3BhdGggPSB0b2tlbml6ZS5fX2ZpbGVfXworICBtb2R1bGVfbmFtZSA9IHRva2VuaXplLl9fbmFtZV9fCisKKyAgc3BlYyA9IGltcG9ydGxpYi51dGlsLnNwZWNfZnJvbV9maWxlX2xvY2F0aW9uKG1vZHVsZV9uYW1lLCBmaWxlX3BhdGgpCisgIG1vZHVsZSA9IGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoc3BlYykKKyAgc3BlYy5sb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQorICAjIE9wdGlvbmFsOyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGltcG9ydCB0aGUgbW9kdWxlCisgICMgYnkgbmFtZSBsYXRlci4KKyAgc3lzLm1vZHVsZXNbbW9kdWxlX25hbWVdID0gbW9kdWxlCisKKworU2V0dGluZyB1cCBhbiBpbXBvcnRlcgorJycnJycnJycnJycnJycnJycnJycnJworCitGb3IgZGVlcCBjdXN0b21pemF0aW9ucyBvZiBpbXBvcnQsIHlvdSB0eXBpY2FsbHkgd2FudCB0byBpbXBsZW1lbnQgYW4KKzp0ZXJtOmBpbXBvcnRlcmAuIFRoaXMgbWVhbnMgbWFuYWdpbmcgYm90aCB0aGUgOnRlcm06YGZpbmRlcmAgYW5kIDp0ZXJtOmBsb2FkZXJgCitzaWRlIG9mIHRoaW5ncy4gRm9yIGZpbmRlcnMgdGhlcmUgYXJlIHR3byBmbGF2b3VycyB0byBjaG9vc2UgZnJvbSBkZXBlbmRpbmcgb24KK3lvdXIgbmVlZHM6IGEgOnRlcm06YG1ldGEgcGF0aCBmaW5kZXJgIG9yIGEgOnRlcm06YHBhdGggZW50cnkgZmluZGVyYC4gVGhlCitmb3JtZXIgaXMgd2hhdCB5b3Ugd291bGQgcHV0IG9uIDphdHRyOmBzeXMubWV0YV9wYXRoYCB3aGlsZSB0aGUgbGF0dGVyIGlzIHdoYXQKK3lvdSBjcmVhdGUgdXNpbmcgYSA6dGVybTpgcGF0aCBlbnRyeSBob29rYCBvbiA6YXR0cjpgc3lzLnBhdGhfaG9va3NgIHdoaWNoIHdvcmtzCit3aXRoIDphdHRyOmBzeXMucGF0aGAgZW50cmllcyB0byBwb3RlbnRpYWxseSBjcmVhdGUgYSBmaW5kZXIuIFRoaXMgZXhhbXBsZSB3aWxsCitzaG93IHlvdSBob3cgdG8gcmVnaXN0ZXIgeW91ciBvd24gaW1wb3J0ZXJzIHNvIHRoYXQgaW1wb3J0IHdpbGwgdXNlIHRoZW0gKGZvcgorY3JlYXRpbmcgYW4gaW1wb3J0ZXIgZm9yIHlvdXJzZWxmLCByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYXBwcm9wcmlhdGUKK2NsYXNzZXMgZGVmaW5lZCB3aXRoaW4gdGhpcyBwYWNrYWdlKTo6CisKKyAgaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkKKyAgaW1wb3J0IHN5cworCisgICMgRm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3NlcyBvbmx5LgorICBTcGFtTWV0YVBhdGhGaW5kZXIgPSBpbXBvcnRsaWIubWFjaGluZXJ5LlBhdGhGaW5kZXIKKyAgU3BhbVBhdGhFbnRyeUZpbmRlciA9IGltcG9ydGxpYi5tYWNoaW5lcnkuRmlsZUZpbmRlcgorICBsb2FkZXJfZGV0YWlscyA9IChpbXBvcnRsaWIubWFjaGluZXJ5LlNvdXJjZUZpbGVMb2FkZXIsCisgICAgICAgICAgICAgICAgICAgIGltcG9ydGxpYi5tYWNoaW5lcnkuU09VUkNFX1NVRkZJWEVTKQorCisgICMgU2V0dGluZyB1cCBhIG1ldGEgcGF0aCBmaW5kZXIuCisgICMgTWFrZSBzdXJlIHRvIHB1dCB0aGUgZmluZGVyIGluIHRoZSBwcm9wZXIgbG9jYXRpb24gaW4gdGhlIGxpc3QgaW4gdGVybXMgb2YKKyAgIyBwcmlvcml0eS4KKyAgc3lzLm1ldGFfcGF0aC5hcHBlbmQoU3BhbU1ldGFQYXRoRmluZGVyKQorCisgICMgU2V0dGluZyB1cCBhIHBhdGggZW50cnkgZmluZGVyLgorICAjIE1ha2Ugc3VyZSB0byBwdXQgdGhlIHBhdGggaG9vayBpbiB0aGUgcHJvcGVyIGxvY2F0aW9uIGluIHRoZSBsaXN0IGluIHRlcm1zCisgICMgb2YgcHJpb3JpdHkuCisgIHN5cy5wYXRoX2hvb2tzLmFwcGVuZChTcGFtUGF0aEVudHJ5RmluZGVyLnBhdGhfaG9vayhsb2FkZXJfZGV0YWlscykpCisKKworQXBwcm94aW1hdGluZyA6ZnVuYzpgaW1wb3J0bGliLmltcG9ydF9tb2R1bGVgCisnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycKKworSW1wb3J0IGl0c2VsZiBpcyBpbXBsZW1lbnRlZCBpbiBQeXRob24gY29kZSwgbWFraW5nIGl0IHBvc3NpYmxlIHRvCitleHBvc2UgbW9zdCBvZiB0aGUgaW1wb3J0IG1hY2hpbmVyeSB0aHJvdWdoIGltcG9ydGxpYi4gVGhlIGZvbGxvd2luZworaGVscHMgaWxsdXN0cmF0ZSB0aGUgdmFyaW91cyBBUElzIHRoYXQgaW1wb3J0bGliIGV4cG9zZXMgYnkgcHJvdmlkaW5nIGFuCithcHByb3hpbWF0ZSBpbXBsZW1lbnRhdGlvbiBvZgorOmZ1bmM6YGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlYCAoUHl0aG9uIDMuNCBhbmQgbmV3ZXIgZm9yIHRoZSBpbXBvcnRsaWIgdXNhZ2UsCitQeXRob24gMy42IGFuZCBuZXdlciBmb3Igb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUpLgorOjoKKworICBpbXBvcnQgaW1wb3J0bGliLnV0aWwKKyAgaW1wb3J0IHN5cworCisgIGRlZiBpbXBvcnRfbW9kdWxlKG5hbWUsIHBhY2thZ2U9Tm9uZSk6CisgICAgICAiIiJBbiBhcHByb3hpbWF0ZSBpbXBsZW1lbnRhdGlvbiBvZiBpbXBvcnQuIiIiCisgICAgICBhYnNvbHV0ZV9uYW1lID0gaW1wb3J0bGliLnV0aWwucmVzb2x2ZV9uYW1lKG5hbWUsIHBhY2thZ2UpCisgICAgICB0cnk6CisgICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW2Fic29sdXRlX25hbWVdCisgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgcGFzcworCisgICAgICBwYXRoID0gTm9uZQorICAgICAgaWYgJy4nIGluIGFic29sdXRlX25hbWU6CisgICAgICAgICAgcGFyZW50X25hbWUsIF8sIGNoaWxkX25hbWUgPSBhYnNvbHV0ZV9uYW1lLnJwYXJ0aXRpb24oJy4nKQorICAgICAgICAgIHBhcmVudF9tb2R1bGUgPSBpbXBvcnRfbW9kdWxlKHBhcmVudF9uYW1lKQorICAgICAgICAgIHBhdGggPSBwYXJlbnRfbW9kdWxlLnNwZWMuc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMKKyAgICAgIGZvciBmaW5kZXIgaW4gc3lzLm1ldGFfcGF0aDoKKyAgICAgICAgICBzcGVjID0gZmluZGVyLmZpbmRfc3BlYyhhYnNvbHV0ZV9uYW1lLCBwYXRoKQorICAgICAgICAgIGlmIHNwZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgIGJyZWFrCisgICAgICBlbHNlOgorICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKGYnTm8gbW9kdWxlIG5hbWVkIHthYnNvbHV0ZV9uYW1lIXJ9JykKKyAgICAgIG1vZHVsZSA9IGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoc3BlYykKKyAgICAgIHNwZWMubG9hZGVyLmV4ZWNfbW9kdWxlKG1vZHVsZSkKKyAgICAgIHN5cy5tb2R1bGVzW2Fic29sdXRlX25hbWVdID0gbW9kdWxlCisgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgIHNldGF0dHIocGFyZW50X21vZHVsZSwgY2hpbGRfbmFtZSwgbW9kdWxlKQorICAgICAgcmV0dXJuIG1vZHVsZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW5zcGVjdC5yc3QgYi9Eb2MvbGlicmFyeS9pbnNwZWN0LnJzdAppbmRleCA4ZTdlZDE5Li41Y2I3YzIyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9pbnNwZWN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9pbnNwZWN0LnJzdApAQCAtMjM1LDI0ICsyMzUsNiBAQAogICAgICAgbGlzdGVkIGluIHRoZSBtZXRhY2xhc3MnIGN1c3RvbSA6bWV0aDpgX19kaXJfX2AuCiAKIAotLi4gZnVuY3Rpb246OiBnZXRtb2R1bGVpbmZvKHBhdGgpCi0KLSAgIFJldHVybnMgYSA6dGVybTpgbmFtZWQgdHVwbGVgIGBgTW9kdWxlSW5mbyhuYW1lLCBzdWZmaXgsIG1vZGUsIG1vZHVsZV90eXBlKWBgCi0gICBvZiB2YWx1ZXMgdGhhdCBkZXNjcmliZSBob3cgUHl0aG9uIHdpbGwgaW50ZXJwcmV0IHRoZSBmaWxlIGlkZW50aWZpZWQgYnkKLSAgICpwYXRoKiBpZiBpdCBpcyBhIG1vZHVsZSwgb3IgYGBOb25lYGAgaWYgaXQgd291bGQgbm90IGJlIGlkZW50aWZpZWQgYXMgYQotICAgbW9kdWxlLiAgSW4gdGhhdCB0dXBsZSwgKm5hbWUqIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgd2l0aG91dCB0aGUgbmFtZSBvZgotICAgYW55IGVuY2xvc2luZyBwYWNrYWdlLCAqc3VmZml4KiBpcyB0aGUgdHJhaWxpbmcgcGFydCBvZiB0aGUgZmlsZSBuYW1lICh3aGljaAotICAgbWF5IG5vdCBiZSBhIGRvdC1kZWxpbWl0ZWQgZXh0ZW5zaW9uKSwgKm1vZGUqIGlzIHRoZSA6ZnVuYzpgb3BlbmAgbW9kZSB0aGF0Ci0gICB3b3VsZCBiZSB1c2VkIChgYCdyJ2BgIG9yIGBgJ3JiJ2BgKSwgYW5kICptb2R1bGVfdHlwZSogaXMgYW4gaW50ZWdlciBnaXZpbmcKLSAgIHRoZSB0eXBlIG9mIHRoZSBtb2R1bGUuICAqbW9kdWxlX3R5cGUqIHdpbGwgaGF2ZSBhIHZhbHVlIHdoaWNoIGNhbiBiZQotICAgY29tcGFyZWQgdG8gdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoZSA6bW9kOmBpbXBgIG1vZHVsZTsgc2VlIHRoZQotICAgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gbW9kdWxlIHR5cGVzLgotCi0gICAuLiBkZXByZWNhdGVkOjogMy4zCi0gICAgICBZb3UgbWF5IGNoZWNrIHRoZSBmaWxlIHBhdGgncyBzdWZmaXggYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHN1ZmZpeGVzCi0gICAgICBsaXN0ZWQgaW4gOm1vZDpgaW1wb3J0bGliLm1hY2hpbmVyeWAgdG8gaW5mZXIgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0KLQogLi4gZnVuY3Rpb246OiBnZXRtb2R1bGVuYW1lKHBhdGgpCiAKICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIG5hbWVkIGJ5IHRoZSBmaWxlICpwYXRoKiwgd2l0aG91dCBpbmNsdWRpbmcgdGhlCkBAIC0yNjYsOCArMjQ4LDcgQEAKICAgIHN0aWxsIHJldHVybiBgYE5vbmVgYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMKLSAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm93IGJhc2VkIGRpcmVjdGx5IG9uIDptb2Q6YGltcG9ydGxpYmAgcmF0aGVyIHRoYW4gdGhlCi0gICAgICBkZXByZWNhdGVkIDpmdW5jOmBnZXRtb2R1bGVpbmZvYC4KKyAgICAgIFRoZSBmdW5jdGlvbiBpcyBiYXNlZCBkaXJlY3RseSBvbiA6bW9kOmBpbXBvcnRsaWJgLgogCiAKIC4uIGZ1bmN0aW9uOjogaXNtb2R1bGUob2JqZWN0KQpAQCAtNjQ2LDYgKzYyNywxNiBAQAogICAgICAgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBhcyBhIHN0cmluZy4gIFRoZSBuYW1lIG11c3QgYmUgYSB2YWxpZAogICAgICAgUHl0aG9uIGlkZW50aWZpZXIuCiAKKyAgICAgIC4uIGltcGwtZGV0YWlsOjoKKworICAgICAgICAgQ1B5dGhvbiBnZW5lcmF0ZXMgaW1wbGljaXQgcGFyYW1ldGVyIG5hbWVzIG9mIHRoZSBmb3JtIGBgLjBgYCBvbiB0aGUKKyAgICAgICAgIGNvZGUgb2JqZWN0cyB1c2VkIHRvIGltcGxlbWVudCBjb21wcmVoZW5zaW9ucyBhbmQgZ2VuZXJhdG9yCisgICAgICAgICBleHByZXNzaW9ucy4KKworICAgICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICAgICAgIFRoZXNlIHBhcmFtZXRlciBuYW1lcyBhcmUgZXhwb3NlZCBieSB0aGlzIG1vZHVsZSBhcyBuYW1lcyBsaWtlCisgICAgICAgICAgICBgYGltcGxpY2l0MGBgLgorCiAgICAuLiBhdHRyaWJ1dGU6OiBQYXJhbWV0ZXIuZGVmYXVsdAogCiAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlci4gIElmIHRoZSBwYXJhbWV0ZXIgaGFzIG5vIGRlZmF1bHQKQEAgLTg1NCw4ICs4NDUsNiBAQAogICAgZnJvbSBrd29ubHlhcmdzIHRvIGRlZmF1bHRzLiAgKmFubm90YXRpb25zKiBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZyBhcmd1bWVudAogICAgbmFtZXMgdG8gYW5ub3RhdGlvbnMuCiAKLSAgIFRoZSBmaXJzdCBmb3VyIGl0ZW1zIGluIHRoZSB0dXBsZSBjb3JyZXNwb25kIHRvIDpmdW5jOmBnZXRhcmdzcGVjYC4KLQogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjQKICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm93IGJhc2VkIG9uIDpmdW5jOmBzaWduYXR1cmVgLCBidXQgc3RpbGwgaWdub3JlcwogICAgICAgYGBfX3dyYXBwZWRfX2BgIGF0dHJpYnV0ZXMgYW5kIGluY2x1ZGVzIHRoZSBhbHJlYWR5IGJvdW5kIGZpcnN0CkBAIC04ODQsNyArODczLDcgQEAKIC4uIGZ1bmN0aW9uOjogZm9ybWF0YXJnc3BlYyhhcmdzWywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzLCBrd29ubHlhcmdzLCBrd29ubHlkZWZhdWx0cywgYW5ub3RhdGlvbnNbLCBmb3JtYXRhcmcsIGZvcm1hdHZhcmFyZ3MsIGZvcm1hdHZhcmt3LCBmb3JtYXR2YWx1ZSwgZm9ybWF0cmV0dXJucywgZm9ybWF0YW5ub3RhdGlvbnNdXSkKIAogICAgRm9ybWF0IGEgcHJldHR5IGFyZ3VtZW50IHNwZWMgZnJvbSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5Ci0gICA6ZnVuYzpgZ2V0YXJnc3BlY2Agb3IgOmZ1bmM6YGdldGZ1bGxhcmdzcGVjYC4KKyAgIDpmdW5jOmBnZXRmdWxsYXJnc3BlY2AuCiAKICAgIFRoZSBmaXJzdCBzZXZlbiBhcmd1bWVudHMgYXJlIChgYGFyZ3NgYCwgYGB2YXJhcmdzYGAsIGBgdmFya3dgYCwKICAgIGBgZGVmYXVsdHNgYCwgYGBrd29ubHlhcmdzYGAsIGBga3dvbmx5ZGVmYXVsdHNgYCwgYGBhbm5vdGF0aW9uc2BgKS4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2l0ZXJ0b29scy5yc3QgYi9Eb2MvbGlicmFyeS9pdGVydG9vbHMucnN0CmluZGV4IGRmYzFkZGMuLmIwZDBhOGMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2l0ZXJ0b29scy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaXRlcnRvb2xzLnJzdApAQCAtNTkxLDcgKzU5MSwxMyBAQAogCiAuLiBmdW5jdGlvbjo6IHRlZShpdGVyYWJsZSwgbj0yKQogCi0gICBSZXR1cm4gKm4qIGluZGVwZW5kZW50IGl0ZXJhdG9ycyBmcm9tIGEgc2luZ2xlIGl0ZXJhYmxlLiAgUm91Z2hseSBlcXVpdmFsZW50IHRvOjoKKyAgIFJldHVybiAqbiogaW5kZXBlbmRlbnQgaXRlcmF0b3JzIGZyb20gYSBzaW5nbGUgaXRlcmFibGUuCisKKyAgIFRoZSBmb2xsb3dpbmcgUHl0aG9uIGNvZGUgaGVscHMgZXhwbGFpbiB3aGF0ICp0ZWUqIGRvZXMgKGFsdGhvdWdoIHRoZSBhY3R1YWwKKyAgIGltcGxlbWVudGF0aW9uIGlzIG1vcmUgY29tcGxleCBhbmQgdXNlcyBvbmx5IGEgc2luZ2xlIHVuZGVybHlpbmcKKyAgIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAgcXVldWUpLgorCisgICBSb3VnaGx5IGVxdWl2YWxlbnQgdG86OgogCiAgICAgICAgIGRlZiB0ZWUoaXRlcmFibGUsIG49Mik6CiAgICAgICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9qc29uLnJzdCBiL0RvYy9saWJyYXJ5L2pzb24ucnN0CmluZGV4IGVlNTgyNjYuLjczODI0ZjggMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2pzb24ucnN0CisrKyBiL0RvYy9saWJyYXJ5L2pzb24ucnN0CkBAIC0xMjYsNyArMTI2LDcgQEAKIEJhc2ljIFVzYWdlCiAtLS0tLS0tLS0tLQogCi0uLiBmdW5jdGlvbjo6IGR1bXAob2JqLCBmcCwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBcCisuLiBmdW5jdGlvbjo6IGR1bXAob2JqLCBmcCwgKiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBcCiAgICAgICAgICAgICAgICAgICAgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwgYWxsb3dfbmFuPVRydWUsIGNscz1Ob25lLCBcCiAgICAgICAgICAgICAgICAgICAgaW5kZW50PU5vbmUsIHNlcGFyYXRvcnM9Tm9uZSwgZGVmYXVsdD1Ob25lLCBcCiAgICAgICAgICAgICAgICAgICAgc29ydF9rZXlzPUZhbHNlLCAqKmt3KQpAQCAtMTg3LDggKzE4NywxMSBAQAogICAgOm1ldGg6YGRlZmF1bHRgIG1ldGhvZCB0byBzZXJpYWxpemUgYWRkaXRpb25hbCB0eXBlcyksIHNwZWNpZnkgaXQgd2l0aCB0aGUKICAgICpjbHMqIGt3YXJnOyBvdGhlcndpc2UgOmNsYXNzOmBKU09ORW5jb2RlcmAgaXMgdXNlZC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBub3cgOnJlZjpga2V5d29yZC1vbmx5IDxrZXl3b3JkLW9ubHlfcGFyYW1ldGVyPmAuCiAKLS4uIGZ1bmN0aW9uOjogZHVtcHMob2JqLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIFwKKworLi4gZnVuY3Rpb246OiBkdW1wcyhvYmosICosIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgXAogICAgICAgICAgICAgICAgICAgICBjaGVja19jaXJjdWxhcj1UcnVlLCBhbGxvd19uYW49VHJ1ZSwgY2xzPU5vbmUsIFwKICAgICAgICAgICAgICAgICAgICAgaW5kZW50PU5vbmUsIHNlcGFyYXRvcnM9Tm9uZSwgZGVmYXVsdD1Ob25lLCBcCiAgICAgICAgICAgICAgICAgICAgIHNvcnRfa2V5cz1GYWxzZSwgKiprdykKQEAgLTIxMiw3ICsyMTUsNyBAQAogICAgICAgdGhlIG9yaWdpbmFsIG9uZS4gVGhhdCBpcywgYGBsb2FkcyhkdW1wcyh4KSkgIT0geGBgIGlmIHggaGFzIG5vbi1zdHJpbmcKICAgICAgIGtleXMuCiAKLS4uIGZ1bmN0aW9uOjogbG9hZChmcCwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KQorLi4gZnVuY3Rpb246OiBsb2FkKGZwLCAqLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIG9iamVjdF9wYWlyc19ob29rPU5vbmUsICoqa3cpCiAKICAgIERlc2VyaWFsaXplICpmcCogKGEgYGAucmVhZCgpYGAtc3VwcG9ydGluZyA6dGVybTpgZmlsZS1saWtlIG9iamVjdGAKICAgIGNvbnRhaW5pbmcgYSBKU09OIGRvY3VtZW50KSB0byBhIFB5dGhvbiBvYmplY3QgdXNpbmcgdGhpcyA6cmVmOmBjb252ZXJzaW9uCkBAIC0yNjAsNyArMjYzLDEwIEBACiAgICBJZiB0aGUgZGF0YSBiZWluZyBkZXNlcmlhbGl6ZWQgaXMgbm90IGEgdmFsaWQgSlNPTiBkb2N1bWVudCwgYQogICAgOmV4YzpgSlNPTkRlY29kZUVycm9yYCB3aWxsIGJlIHJhaXNlZC4KIAotLi4gZnVuY3Rpb246OiBsb2FkcyhzLCBlbmNvZGluZz1Ob25lLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIG9iamVjdF9wYWlyc19ob29rPU5vbmUsICoqa3cpCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWxsIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXJlIG5vdyA6cmVmOmBrZXl3b3JkLW9ubHkgPGtleXdvcmQtb25seV9wYXJhbWV0ZXI+YC4KKworLi4gZnVuY3Rpb246OiBsb2FkcyhzLCAqLCBlbmNvZGluZz1Ob25lLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIG9iamVjdF9wYWlyc19ob29rPU5vbmUsICoqa3cpCiAKICAgIERlc2VyaWFsaXplICpzKiAoYSA6Y2xhc3M6YHN0cmAgaW5zdGFuY2UgY29udGFpbmluZyBhIEpTT04gZG9jdW1lbnQpIHRvIGEKICAgIFB5dGhvbiBvYmplY3QgdXNpbmcgdGhpcyA6cmVmOmBjb252ZXJzaW9uIHRhYmxlIDxqc29uLXRvLXB5LXRhYmxlPmAuCkBAIC0yNzQsNyArMjgwLDcgQEAKIEVuY29kZXJzIGFuZCBEZWNvZGVycwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS4uIGNsYXNzOjogSlNPTkRlY29kZXIob2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIHN0cmljdD1UcnVlLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lKQorLi4gY2xhc3M6OiBKU09ORGVjb2RlcigqLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLCBwYXJzZV9pbnQ9Tm9uZSwgcGFyc2VfY29uc3RhbnQ9Tm9uZSwgc3RyaWN0PVRydWUsIG9iamVjdF9wYWlyc19ob29rPU5vbmUpCiAKICAgIFNpbXBsZSBKU09OIGRlY29kZXIuCiAKQEAgLTM0NCw2ICszNTAsOSBAQAogICAgSWYgdGhlIGRhdGEgYmVpbmcgZGVzZXJpYWxpemVkIGlzIG5vdCBhIHZhbGlkIEpTT04gZG9jdW1lbnQsIGEKICAgIDpleGM6YEpTT05EZWNvZGVFcnJvcmAgd2lsbCBiZSByYWlzZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBbGwgcGFyYW1ldGVycyBhcmUgbm93IDpyZWY6YGtleXdvcmQtb25seSA8a2V5d29yZC1vbmx5X3BhcmFtZXRlcj5gLgorCiAgICAuLiBtZXRob2Q6OiBkZWNvZGUocykKIAogICAgICAgUmV0dXJuIHRoZSBQeXRob24gcmVwcmVzZW50YXRpb24gb2YgKnMqIChhIDpjbGFzczpgc3RyYCBpbnN0YW5jZQpAQCAtMzYyLDcgKzM3MSw3IEBACiAgICAgICBleHRyYW5lb3VzIGRhdGEgYXQgdGhlIGVuZC4KIAogCi0uLiBjbGFzczo6IEpTT05FbmNvZGVyKHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwgYWxsb3dfbmFuPVRydWUsIHNvcnRfa2V5cz1GYWxzZSwgaW5kZW50PU5vbmUsIHNlcGFyYXRvcnM9Tm9uZSwgZGVmYXVsdD1Ob25lKQorLi4gY2xhc3M6OiBKU09ORW5jb2RlcigqLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIGNoZWNrX2NpcmN1bGFyPVRydWUsIGFsbG93X25hbj1UcnVlLCBzb3J0X2tleXM9RmFsc2UsIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsIGRlZmF1bHQ9Tm9uZSkKIAogICAgRXh0ZW5zaWJsZSBKU09OIGVuY29kZXIgZm9yIFB5dGhvbiBkYXRhIHN0cnVjdHVyZXMuCiAKQEAgLTQ0Miw2ICs0NTEsOSBAQAogICAgdGhlIG9iamVjdCBvciByYWlzZSBhIDpleGM6YFR5cGVFcnJvcmAuICBJZiBub3Qgc3BlY2lmaWVkLCA6ZXhjOmBUeXBlRXJyb3JgCiAgICBpcyByYWlzZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBbGwgcGFyYW1ldGVycyBhcmUgbm93IDpyZWY6YGtleXdvcmQtb25seSA8a2V5d29yZC1vbmx5X3BhcmFtZXRlcj5gLgorCiAKICAgIC4uIG1ldGhvZDo6IGRlZmF1bHQobykKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbG9nZ2luZy5oYW5kbGVycy5yc3QgYi9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdAppbmRleCA5MTZiNzAyLi44ZTI3YWQwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdApAQCAtODQsNiArODQsOSBAQAogICAgd2l0aCB0aGF0IGVuY29kaW5nLiAgSWYgKmRlbGF5KiBpcyB0cnVlLCB0aGVuIGZpbGUgb3BlbmluZyBpcyBkZWZlcnJlZCB1bnRpbCB0aGUKICAgIGZpcnN0IGNhbGwgdG8gOm1ldGg6YGVtaXRgLiBCeSBkZWZhdWx0LCB0aGUgZmlsZSBncm93cyBpbmRlZmluaXRlbHkuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBcyB3ZWxsIGFzIHN0cmluZyB2YWx1ZXMsIDpjbGFzczpgfnBhdGhsaWIuUGF0aGAgb2JqZWN0cyBhcmUgYWxzbyBhY2NlcHRlZAorICAgICAgZm9yIHRoZSAqZmlsZW5hbWUqIGFyZ3VtZW50LgogCiAgICAuLiBtZXRob2Q6OiBjbG9zZSgpCiAKQEAgLTE2MCwxMiArMTYzLDIzIEBACiAgICB3aXRoIHRoYXQgZW5jb2RpbmcuICBJZiAqZGVsYXkqIGlzIHRydWUsIHRoZW4gZmlsZSBvcGVuaW5nIGlzIGRlZmVycmVkIHVudGlsIHRoZQogICAgZmlyc3QgY2FsbCB0byA6bWV0aDpgZW1pdGAuICBCeSBkZWZhdWx0LCB0aGUgZmlsZSBncm93cyBpbmRlZmluaXRlbHkuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBcyB3ZWxsIGFzIHN0cmluZyB2YWx1ZXMsIDpjbGFzczpgfnBhdGhsaWIuUGF0aGAgb2JqZWN0cyBhcmUgYWxzbyBhY2NlcHRlZAorICAgICAgZm9yIHRoZSAqZmlsZW5hbWUqIGFyZ3VtZW50LgorCisgICAuLiBtZXRob2Q6OiByZW9wZW5JZk5lZWRlZCgpCisKKyAgICAgIENoZWNrcyB0byBzZWUgaWYgdGhlIGZpbGUgaGFzIGNoYW5nZWQuICBJZiBpdCBoYXMsIHRoZSBleGlzdGluZyBzdHJlYW0gaXMKKyAgICAgIGZsdXNoZWQgYW5kIGNsb3NlZCBhbmQgdGhlIGZpbGUgb3BlbmVkIGFnYWluLCB0eXBpY2FsbHkgYXMgYSBwcmVjdXJzb3IgdG8KKyAgICAgIG91dHB1dHRpbmcgdGhlIHJlY29yZCB0byB0aGUgZmlsZS4KKworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIAogICAgLi4gbWV0aG9kOjogZW1pdChyZWNvcmQpCiAKLSAgICAgIE91dHB1dHMgdGhlIHJlY29yZCB0byB0aGUgZmlsZSwgYnV0IGZpcnN0IGNoZWNrcyB0byBzZWUgaWYgdGhlIGZpbGUgaGFzCi0gICAgICBjaGFuZ2VkLiAgSWYgaXQgaGFzLCB0aGUgZXhpc3Rpbmcgc3RyZWFtIGlzIGZsdXNoZWQgYW5kIGNsb3NlZCBhbmQgdGhlCi0gICAgICBmaWxlIG9wZW5lZCBhZ2FpbiwgYmVmb3JlIG91dHB1dHRpbmcgdGhlIHJlY29yZCB0byB0aGUgZmlsZS4KKyAgICAgIE91dHB1dHMgdGhlIHJlY29yZCB0byB0aGUgZmlsZSwgYnV0IGZpcnN0IGNhbGxzIDptZXRoOmByZW9wZW5JZk5lZWRlZGAgdG8KKyAgICAgIHJlb3BlbiB0aGUgZmlsZSBpZiBpdCBoYXMgY2hhbmdlZC4KIAogLi4gX2Jhc2Utcm90YXRpbmctaGFuZGxlcjoKIApAQCAtMjc5LDYgKzI5Myw5IEBACiAgICA6ZmlsZTpgYXBwLmxvZy4yYCwgZXRjLiAgZXhpc3QsIHRoZW4gdGhleSBhcmUgcmVuYW1lZCB0byA6ZmlsZTpgYXBwLmxvZy4yYCwKICAgIDpmaWxlOmBhcHAubG9nLjNgIGV0Yy4gIHJlc3BlY3RpdmVseS4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFzIHdlbGwgYXMgc3RyaW5nIHZhbHVlcywgOmNsYXNzOmB+cGF0aGxpYi5QYXRoYCBvYmplY3RzIGFyZSBhbHNvIGFjY2VwdGVkCisgICAgICBmb3IgdGhlICpmaWxlbmFtZSogYXJndW1lbnQuCiAKICAgIC4uIG1ldGhvZDo6IGRvUm9sbG92ZXIoKQogCkBAIC0zMTAsMjEgKzMyNywyNCBAQAogICAgWW91IGNhbiB1c2UgdGhlICp3aGVuKiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mICppbnRlcnZhbCouIFRoZSBsaXN0IG9mIHBvc3NpYmxlCiAgICB2YWx1ZXMgaXMgYmVsb3cuICBOb3RlIHRoYXQgdGhleSBhcmUgbm90IGNhc2Ugc2Vuc2l0aXZlLgogCi0gICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgIHwgVmFsdWUgICAgICAgICAgfCBUeXBlIG9mIGludGVydmFsICAgICAgfAotICAgKz09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rCi0gICB8IGBgJ1MnYGAgICAgICAgIHwgU2Vjb25kcyAgICAgICAgICAgICAgIHwKLSAgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCdNJ2BgICAgICAgICB8IE1pbnV0ZXMgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgIHwgYGAnSCdgYCAgICAgICAgfCBIb3VycyAgICAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IGBgJ0QnYGAgICAgICAgIHwgRGF5cyAgICAgICAgICAgICAgICAgIHwKLSAgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCdXMCctJ1c2J2BgICB8IFdlZWtkYXkgKDA9TW9uZGF5KSAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgIHwgYGAnbWlkbmlnaHQnYGAgfCBSb2xsIG92ZXIgYXQgbWlkbmlnaHQgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IFZhbHVlICAgICAgICAgIHwgVHlwZSBvZiBpbnRlcnZhbCAgICAgICAgICAgfCBJZi9ob3cgKmF0VGltZSogaXMgdXNlZCB8CisgICArPT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT0rCisgICB8IGBgJ1MnYGAgICAgICAgIHwgU2Vjb25kcyAgICAgICAgICAgICAgICAgICAgfCBJZ25vcmVkICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IGBgJ00nYGAgICAgICAgIHwgTWludXRlcyAgICAgICAgICAgICAgICAgICAgfCBJZ25vcmVkICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IGBgJ0gnYGAgICAgICAgIHwgSG91cnMgICAgICAgICAgICAgICAgICAgICAgfCBJZ25vcmVkICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IGBgJ0QnYGAgICAgICAgIHwgRGF5cyAgICAgICAgICAgICAgICAgICAgICAgfCBJZ25vcmVkICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IGBgJ1cwJy0nVzYnYGAgIHwgV2Vla2RheSAoMD1Nb25kYXkpICAgICAgICAgfCBVc2VkIHRvIGNvbXB1dGUgaW5pdGlhbCB8CisgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByb2xsb3ZlciB0aW1lICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IGBgJ21pZG5pZ2h0J2BgIHwgUm9sbCBvdmVyIGF0IG1pZG5pZ2h0LCBpZiAgfCBVc2VkIHRvIGNvbXB1dGUgaW5pdGlhbCB8CisgICB8ICAgICAgICAgICAgICAgIHwgKmF0VGltZSogbm90IHNwZWNpZmllZCwgICAgfCByb2xsb3ZlciB0aW1lICAgICAgICAgICB8CisgICB8ICAgICAgICAgICAgICAgIHwgZWxzZSBhdCB0aW1lICphdFRpbWUqICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKICAgIFdoZW4gdXNpbmcgd2Vla2RheS1iYXNlZCByb3RhdGlvbiwgc3BlY2lmeSAnVzAnIGZvciBNb25kYXksICdXMScgZm9yCiAgICBUdWVzZGF5LCBhbmQgc28gb24gdXAgdG8gJ1c2JyBmb3IgU3VuZGF5LiBJbiB0aGlzIGNhc2UsIHRoZSB2YWx1ZSBwYXNzZWQgZm9yCkBAIC0zNTIsMTYgKzM3MiwzNSBAQAogCiAgICBJZiAqYXRUaW1lKiBpcyBub3QgYGBOb25lYGAsIGl0IG11c3QgYmUgYSBgYGRhdGV0aW1lLnRpbWVgYCBpbnN0YW5jZSB3aGljaAogICAgc3BlY2lmaWVzIHRoZSB0aW1lIG9mIGRheSB3aGVuIHJvbGxvdmVyIG9jY3VycywgZm9yIHRoZSBjYXNlcyB3aGVyZSByb2xsb3ZlcgotICAgaXMgc2V0IHRvIGhhcHBlbiAiYXQgbWlkbmlnaHQiIG9yICJvbiBhIHBhcnRpY3VsYXIgd2Vla2RheSIuCisgICBpcyBzZXQgdG8gaGFwcGVuICJhdCBtaWRuaWdodCIgb3IgIm9uIGEgcGFydGljdWxhciB3ZWVrZGF5Ii4gTm90ZSB0aGF0IGluCisgICB0aGVzZSBjYXNlcywgdGhlICphdFRpbWUqIHZhbHVlIGlzIGVmZmVjdGl2ZWx5IHVzZWQgdG8gY29tcHV0ZSB0aGUgKmluaXRpYWwqCisgICByb2xsb3ZlciwgYW5kIHN1YnNlcXVlbnQgcm9sbG92ZXJzIHdvdWxkIGJlIGNhbGN1bGF0ZWQgdmlhIHRoZSBub3JtYWwKKyAgIGludGVydmFsIGNhbGN1bGF0aW9uLgorCisgICAuLiBub3RlOjogQ2FsY3VsYXRpb24gb2YgdGhlIGluaXRpYWwgcm9sbG92ZXIgdGltZSBpcyBkb25lIHdoZW4gdGhlIGhhbmRsZXIKKyAgICAgIGlzIGluaXRpYWxpc2VkLiBDYWxjdWxhdGlvbiBvZiBzdWJzZXF1ZW50IHJvbGxvdmVyIHRpbWVzIGlzIGRvbmUgb25seQorICAgICAgd2hlbiByb2xsb3ZlciBvY2N1cnMsIGFuZCByb2xsb3ZlciBvY2N1cnMgb25seSB3aGVuIGVtaXR0aW5nIG91dHB1dC4gSWYKKyAgICAgIHRoaXMgaXMgbm90IGtlcHQgaW4gbWluZCwgaXQgbWlnaHQgbGVhZCB0byBzb21lIGNvbmZ1c2lvbi4gRm9yIGV4YW1wbGUsCisgICAgICBpZiBhbiBpbnRlcnZhbCBvZiAiZXZlcnkgbWludXRlIiBpcyBzZXQsIHRoYXQgZG9lcyBub3QgbWVhbiB5b3Ugd2lsbAorICAgICAgYWx3YXlzIHNlZSBsb2cgZmlsZXMgd2l0aCB0aW1lcyAoaW4gdGhlIGZpbGVuYW1lKSBzZXBhcmF0ZWQgYnkgYSBtaW51dGU7CisgICAgICBpZiwgZHVyaW5nIGFwcGxpY2F0aW9uIGV4ZWN1dGlvbiwgbG9nZ2luZyBvdXRwdXQgaXMgZ2VuZXJhdGVkIG1vcmUKKyAgICAgIGZyZXF1ZW50bHkgdGhhbiBvbmNlIGEgbWludXRlLCAqdGhlbiogeW91IGNhbiBleHBlY3QgdG8gc2VlIGxvZyBmaWxlcworICAgICAgd2l0aCB0aW1lcyBzZXBhcmF0ZWQgYnkgYSBtaW51dGUuIElmLCBvbiB0aGUgb3RoZXIgaGFuZCwgbG9nZ2luZyBtZXNzYWdlcworICAgICAgYXJlIG9ubHkgb3V0cHV0IG9uY2UgZXZlcnkgZml2ZSBtaW51dGVzIChzYXkpLCB0aGVuIHRoZXJlIHdpbGwgYmUgZ2FwcyBpbgorICAgICAgdGhlIGZpbGUgdGltZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbWludXRlcyB3aGVyZSBubyBvdXRwdXQgKGFuZCBoZW5jZSBubworICAgICAgcm9sbG92ZXIpIG9jY3VycmVkLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNAogICAgICAgKmF0VGltZSogcGFyYW1ldGVyIHdhcyBhZGRlZC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFzIHdlbGwgYXMgc3RyaW5nIHZhbHVlcywgOmNsYXNzOmB+cGF0aGxpYi5QYXRoYCBvYmplY3RzIGFyZSBhbHNvIGFjY2VwdGVkCisgICAgICBmb3IgdGhlICpmaWxlbmFtZSogYXJndW1lbnQuCisKICAgIC4uIG1ldGhvZDo6IGRvUm9sbG92ZXIoKQogCiAgICAgICBEb2VzIGEgcm9sbG92ZXIsIGFzIGRlc2NyaWJlZCBhYm92ZS4KIAotCiAgICAuLiBtZXRob2Q6OiBlbWl0KHJlY29yZCkKIAogICAgICAgT3V0cHV0cyB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLCBjYXRlcmluZyBmb3Igcm9sbG92ZXIgYXMgZGVzY3JpYmVkIGFib3ZlLgpAQCAtNzk4LDEyICs4MzcsMTggQEAKICAgICAgIG92ZXJyaWRkZW4gdG8gaW1wbGVtZW50IGN1c3RvbSBmbHVzaGluZyBzdHJhdGVnaWVzLgogCiAKLS4uIGNsYXNzOjogTWVtb3J5SGFuZGxlcihjYXBhY2l0eSwgZmx1c2hMZXZlbD1FUlJPUiwgdGFyZ2V0PU5vbmUpCisuLiBjbGFzczo6IE1lbW9yeUhhbmRsZXIoY2FwYWNpdHksIGZsdXNoTGV2ZWw9RVJST1IsIHRhcmdldD1Ob25lLCBmbHVzaE9uQ2xvc2U9VHJ1ZSkKIAogICAgUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgOmNsYXNzOmBNZW1vcnlIYW5kbGVyYCBjbGFzcy4gVGhlIGluc3RhbmNlIGlzCiAgICBpbml0aWFsaXplZCB3aXRoIGEgYnVmZmVyIHNpemUgb2YgKmNhcGFjaXR5Ki4gSWYgKmZsdXNoTGV2ZWwqIGlzIG5vdCBzcGVjaWZpZWQsCiAgICA6Y29uc3Q6YEVSUk9SYCBpcyB1c2VkLiBJZiBubyAqdGFyZ2V0KiBpcyBzcGVjaWZpZWQsIHRoZSB0YXJnZXQgd2lsbCBuZWVkIHRvIGJlCi0gICBzZXQgdXNpbmcgOm1ldGg6YHNldFRhcmdldGAgYmVmb3JlIHRoaXMgaGFuZGxlciBkb2VzIGFueXRoaW5nIHVzZWZ1bC4KKyAgIHNldCB1c2luZyA6bWV0aDpgc2V0VGFyZ2V0YCBiZWZvcmUgdGhpcyBoYW5kbGVyIGRvZXMgYW55dGhpbmcgdXNlZnVsLiBJZgorICAgKmZsdXNoT25DbG9zZSogaXMgc3BlY2lmaWVkIGFzIGBgRmFsc2VgYCwgdGhlbiB0aGUgYnVmZmVyIGlzICpub3QqIGZsdXNoZWQgd2hlbgorICAgdGhlIGhhbmRsZXIgaXMgY2xvc2VkLiBJZiBub3Qgc3BlY2lmaWVkIG9yIHNwZWNpZmllZCBhcyBgYFRydWVgYCwgdGhlIHByZXZpb3VzCisgICBiZWhhdmlvdXIgb2YgZmx1c2hpbmcgdGhlIGJ1ZmZlciB3aWxsIG9jY3VyIHdoZW4gdGhlIGhhbmRsZXIgaXMgY2xvc2VkLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgVGhlICpmbHVzaE9uQ2xvc2UqIHBhcmFtZXRlciB3YXMgYWRkZWQuCiAKIAogICAgLi4gbWV0aG9kOjogY2xvc2UoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbWF0aC5yc3QgYi9Eb2MvbGlicmFyeS9tYXRoLnJzdAppbmRleCAzZmRlYTE4Li5kYTJiOGNjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9tYXRoLnJzdAorKysgYi9Eb2MvbGlicmFyeS9tYXRoLnJzdApAQCAtNDI2LDYgKzQyNiwxNSBAQAogCiAgICBUaGUgbWF0aGVtYXRpY2FsIGNvbnN0YW50IGUgPSAyLjcxODI4MS4uLiwgdG8gYXZhaWxhYmxlIHByZWNpc2lvbi4KIAorLi4gZGF0YTo6IHRhdQorCisgICBUaGUgbWF0aGVtYXRpY2FsIGNvbnN0YW50IM+EID0gNi4yODMxODUuLi4sIHRvIGF2YWlsYWJsZSBwcmVjaXNpb24uCisgICBUYXUgaXMgYSBjaXJjbGUgY29uc3RhbnQgZXF1YWwgdG8gMs+ALCB0aGUgcmF0aW8gb2YgYSBjaXJjbGUncyBjaXJjdW1mZXJlbmNlIHRvCisgICBpdHMgcmFkaXVzLiBUbyBsZWFybiBtb3JlIGFib3V0IFRhdSwgY2hlY2sgb3V0IFZpIEhhcnQncyB2aWRlbyBgUGkgaXMgKHN0aWxsKQorICAgV3JvbmcgPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9akc3dmhNTVhhZ1E+YF8sIGFuZCBzdGFydCBjZWxlYnJhdGluZworICAgYFRhdSBkYXkgPGh0dHA6Ly90YXVkYXkuY29tLz5gXyBieSBlYXRpbmcgdHdpY2UgYXMgbXVjaCBwaWUhCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgogCiAuLiBkYXRhOjogaW5mCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L21tYXAucnN0IGIvRG9jL2xpYnJhcnkvbW1hcC5yc3QKaW5kZXggOGY1MzgzMy4uYzU0NGM4MCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbW1hcC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbW1hcC5yc3QKQEAgLTI2NCwxMyArMjY0LDE4IEBACiAgICAuLiBtZXRob2Q6OiB3cml0ZShieXRlcykKIAogICAgICAgV3JpdGUgdGhlIGJ5dGVzIGluICpieXRlcyogaW50byBtZW1vcnkgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlCi0gICAgICBmaWxlIHBvaW50ZXI7IHRoZSBmaWxlIHBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gcG9pbnQgYWZ0ZXIgdGhlIGJ5dGVzIHRoYXQKLSAgICAgIHdlcmUgd3JpdHRlbi4gSWYgdGhlIG1tYXAgd2FzIGNyZWF0ZWQgd2l0aCA6Y29uc3Q6YEFDQ0VTU19SRUFEYCwgdGhlbgorICAgICAgZmlsZSBwb2ludGVyIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIChuZXZlciBsZXNzIHRoYW4KKyAgICAgIGBgbGVuKGJ5dGVzKWBgLCBzaW5jZSBpZiB0aGUgd3JpdGUgZmFpbHMsIGEgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZQorICAgICAgcmFpc2VkKS4gIFRoZSBmaWxlIHBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gcG9pbnQgYWZ0ZXIgdGhlIGJ5dGVzIHRoYXQKKyAgICAgIHdlcmUgd3JpdHRlbi4gIElmIHRoZSBtbWFwIHdhcyBjcmVhdGVkIHdpdGggOmNvbnN0OmBBQ0NFU1NfUkVBRGAsIHRoZW4KICAgICAgIHdyaXRpbmcgdG8gaXQgd2lsbCByYWlzZSBhIDpleGM6YFR5cGVFcnJvcmAgZXhjZXB0aW9uLgogCiAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQogICAgICAgICAgV3JpdGFibGUgOnRlcm06YGJ5dGVzLWxpa2Ugb2JqZWN0YCBpcyBub3cgYWNjZXB0ZWQuCiAKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaXMgbm93IHJldHVybmVkLgorCiAKICAgIC4uIG1ldGhvZDo6IHdyaXRlX2J5dGUoYnl0ZSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLnJzdCBiL0RvYy9saWJyYXJ5L211bHRpcHJvY2Vzc2luZy5yc3QKaW5kZXggZDIwMDk4Zi4uMTgxM2VlYiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLnJzdAorKysgYi9Eb2MvbGlicmFyeS9tdWx0aXByb2Nlc3NpbmcucnN0CkBAIC02NDcsOCArNjQ3LDkgQEAKIEZvciBwYXNzaW5nIG1lc3NhZ2VzIG9uZSBjYW4gdXNlIDpmdW5jOmBQaXBlYCAoZm9yIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHR3bwogcHJvY2Vzc2VzKSBvciBhIHF1ZXVlICh3aGljaCBhbGxvd3MgbXVsdGlwbGUgcHJvZHVjZXJzIGFuZCBjb25zdW1lcnMpLgogCi1UaGUgOmNsYXNzOmBRdWV1ZWAsIDpjbGFzczpgU2ltcGxlUXVldWVgIGFuZCA6Y2xhc3M6YEpvaW5hYmxlUXVldWVgIHR5cGVzIGFyZSBtdWx0aS1wcm9kdWNlciwKLW11bHRpLWNvbnN1bWVyIEZJRk8gcXVldWVzIG1vZGVsbGVkIG9uIHRoZSA6Y2xhc3M6YHF1ZXVlLlF1ZXVlYCBjbGFzcyBpbiB0aGUKK1RoZSA6Y2xhc3M6YFF1ZXVlYCwgOmNsYXNzOmBTaW1wbGVRdWV1ZWAgYW5kIDpjbGFzczpgSm9pbmFibGVRdWV1ZWAgdHlwZXMKK2FyZSBtdWx0aS1wcm9kdWNlciwgbXVsdGktY29uc3VtZXIgOmFiYnI6YEZJRk8gKGZpcnN0LWluLCBmaXJzdC1vdXQpYAorcXVldWVzIG1vZGVsbGVkIG9uIHRoZSA6Y2xhc3M6YHF1ZXVlLlF1ZXVlYCBjbGFzcyBpbiB0aGUKIHN0YW5kYXJkIGxpYnJhcnkuICBUaGV5IGRpZmZlciBpbiB0aGF0IDpjbGFzczpgUXVldWVgIGxhY2tzIHRoZQogOm1ldGg6YH5xdWV1ZS5RdWV1ZS50YXNrX2RvbmVgIGFuZCA6bWV0aDpgfnF1ZXVlLlF1ZXVlLmpvaW5gIG1ldGhvZHMgaW50cm9kdWNlZAogaW50byBQeXRob24gMi41J3MgOmNsYXNzOmBxdWV1ZS5RdWV1ZWAgY2xhc3MuCkBAIC04ODYsOCArODg3LDEzIEBACiAKIC4uIGZ1bmN0aW9uOjogY3B1X2NvdW50KCkKIAotICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtLiAgTWF5IHJhaXNlCi0gICA6ZXhjOmBOb3RJbXBsZW1lbnRlZEVycm9yYC4KKyAgIFJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbS4KKworICAgVGhpcyBudW1iZXIgaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIG51bWJlciBvZiBDUFVzIHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuCisgICB1c2UuICBUaGUgbnVtYmVyIG9mIHVzYWJsZSBDUFVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCisgICBgYGxlbihvcy5zY2hlZF9nZXRhZmZpbml0eSgwKSlgYAorCisgICBNYXkgcmFpc2UgOmV4YzpgTm90SW1wbGVtZW50ZWRFcnJvcmAuCiAKICAgIC4uIHNlZWFsc286OgogICAgICAgOmZ1bmM6YG9zLmNwdV9jb3VudGAKQEAgLTE2NzYsNyArMTY4Miw5IEBACiAgICBvZiBwcm9jZXNzZXMuICBPYmplY3RzIG9mIHRoaXMgdHlwZSBhcmUgcmV0dXJuZWQgYnkKICAgIDpmdW5jOmBtdWx0aXByb2Nlc3NpbmcuTWFuYWdlcmAuCiAKLSAgIEl0IGFsc28gc3VwcG9ydHMgY3JlYXRpb24gb2Ygc2hhcmVkIGxpc3RzIGFuZCBkaWN0aW9uYXJpZXMuCisgICBJdHMgbWV0aG9kcyBjcmVhdGUgYW5kIHJldHVybiA6cmVmOmBtdWx0aXByb2Nlc3NpbmctcHJveHlfb2JqZWN0c2AgZm9yIGEKKyAgIG51bWJlciBvZiBjb21tb25seSB1c2VkIGRhdGEgdHlwZXMgdG8gYmUgc3luY2hyb25pemVkIGFjcm9zcyBwcm9jZXNzZXMuCisgICBUaGlzIG5vdGFibHkgaW5jbHVkZXMgc2hhcmVkIGxpc3RzIGFuZCBkaWN0aW9uYXJpZXMuCiAKICAgIC4uIG1ldGhvZDo6IEJhcnJpZXIocGFydGllc1ssIGFjdGlvblssIHRpbWVvdXRdXSkKIApAQCAtMTczOSwzMSArMTc0NywxNyBAQAogICAgICAgICAgICAgICAgZGljdChtYXBwaW5nKQogICAgICAgICAgICAgICAgZGljdChzZXF1ZW5jZSkKIAotICAgICAgQ3JlYXRlIGEgc2hhcmVkIGBgZGljdGBgIG9iamVjdCBhbmQgcmV0dXJuIGEgcHJveHkgZm9yIGl0LgorICAgICAgQ3JlYXRlIGEgc2hhcmVkIDpjbGFzczpgZGljdGAgb2JqZWN0IGFuZCByZXR1cm4gYSBwcm94eSBmb3IgaXQuCiAKICAgIC4uIG1ldGhvZDo6IGxpc3QoKQogICAgICAgICAgICAgICAgbGlzdChzZXF1ZW5jZSkKIAotICAgICAgQ3JlYXRlIGEgc2hhcmVkIGBgbGlzdGBgIG9iamVjdCBhbmQgcmV0dXJuIGEgcHJveHkgZm9yIGl0LgorICAgICAgQ3JlYXRlIGEgc2hhcmVkIDpjbGFzczpgbGlzdGAgb2JqZWN0IGFuZCByZXR1cm4gYSBwcm94eSBmb3IgaXQuCiAKLSAgIC4uIG5vdGU6OgotCi0gICAgICBNb2RpZmljYXRpb25zIHRvIG11dGFibGUgdmFsdWVzIG9yIGl0ZW1zIGluIGRpY3QgYW5kIGxpc3QgcHJveGllcyB3aWxsIG5vdAotICAgICAgYmUgcHJvcGFnYXRlZCB0aHJvdWdoIHRoZSBtYW5hZ2VyLCBiZWNhdXNlIHRoZSBwcm94eSBoYXMgbm8gd2F5IG9mIGtub3dpbmcKLSAgICAgIHdoZW4gaXRzIHZhbHVlcyBvciBpdGVtcyBhcmUgbW9kaWZpZWQuICBUbyBtb2RpZnkgc3VjaCBhbiBpdGVtLCB5b3UgY2FuCi0gICAgICByZS1hc3NpZ24gdGhlIG1vZGlmaWVkIG9iamVjdCB0byB0aGUgY29udGFpbmVyIHByb3h5OjoKLQotICAgICAgICAgIyBjcmVhdGUgYSBsaXN0IHByb3h5IGFuZCBhcHBlbmQgYSBtdXRhYmxlIG9iamVjdCAoYSBkaWN0aW9uYXJ5KQotICAgICAgICAgbHByb3h5ID0gbWFuYWdlci5saXN0KCkKLSAgICAgICAgIGxwcm94eS5hcHBlbmQoe30pCi0gICAgICAgICAjIG5vdyBtdXRhdGUgdGhlIGRpY3Rpb25hcnkKLSAgICAgICAgIGQgPSBscHJveHlbMF0KLSAgICAgICAgIGRbJ2EnXSA9IDEKLSAgICAgICAgIGRbJ2InXSA9IDIKLSAgICAgICAgICMgYXQgdGhpcyBwb2ludCwgdGhlIGNoYW5nZXMgdG8gZCBhcmUgbm90IHlldCBzeW5jZWQsIGJ1dCBieQotICAgICAgICAgIyByZWFzc2lnbmluZyB0aGUgZGljdGlvbmFyeSwgdGhlIHByb3h5IGlzIG5vdGlmaWVkIG9mIHRoZSBjaGFuZ2UKLSAgICAgICAgIGxwcm94eVswXSA9IGQKLQorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFNoYXJlZCBvYmplY3RzIGFyZSBjYXBhYmxlIG9mIGJlaW5nIG5lc3RlZC4gIEZvciBleGFtcGxlLCBhIHNoYXJlZAorICAgICAgY29udGFpbmVyIG9iamVjdCBzdWNoIGFzIGEgc2hhcmVkIGxpc3QgY2FuIGNvbnRhaW4gb3RoZXIgc2hhcmVkIG9iamVjdHMKKyAgICAgIHdoaWNoIHdpbGwgYWxsIGJlIG1hbmFnZWQgYW5kIHN5bmNocm9uaXplZCBieSB0aGUgOmNsYXNzOmBTeW5jTWFuYWdlcmAuCiAKIC4uIGNsYXNzOjogTmFtZXNwYWNlCiAKQEAgLTE4NzUsNiArMTg2OSw4IEBACiAgICAgPj4+IHMgPSBtLmdldF9zZXJ2ZXIoKQogICAgID4+PiBzLnNlcnZlX2ZvcmV2ZXIoKQogCisuLiBfbXVsdGlwcm9jZXNzaW5nLXByb3h5X29iamVjdHM6CisKIFByb3h5IE9iamVjdHMKIH5+fn5+fn5+fn5+fn4KIApAQCAtMTg4NCw4ICsxODgwLDcgQEAKIAogQSBwcm94eSBvYmplY3QgaGFzIG1ldGhvZHMgd2hpY2ggaW52b2tlIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBvZiBpdHMgcmVmZXJlbnQKIChhbHRob3VnaCBub3QgZXZlcnkgbWV0aG9kIG9mIHRoZSByZWZlcmVudCB3aWxsIG5lY2Vzc2FyaWx5IGJlIGF2YWlsYWJsZSB0aHJvdWdoCi10aGUgcHJveHkpLiAgQSBwcm94eSBjYW4gdXN1YWxseSBiZSB1c2VkIGluIG1vc3Qgb2YgdGhlIHNhbWUgd2F5cyB0aGF0IGl0cwotcmVmZXJlbnQgY2FuOgordGhlIHByb3h5KS4gIEluIHRoaXMgd2F5LCBhIHByb3h5IGNhbiBiZSB1c2VkIGp1c3QgbGlrZSBpdHMgcmVmZXJlbnQgY2FuOgogCiAuLiBkb2N0ZXN0OjoKIApAQCAtMTkwNiw5ICsxOTAxLDkgQEAKIHRoZSBwcm94eS4KIAogQW4gaW1wb3J0YW50IGZlYXR1cmUgb2YgcHJveHkgb2JqZWN0cyBpcyB0aGF0IHRoZXkgYXJlIHBpY2tsYWJsZSBzbyB0aGV5IGNhbiBiZQotcGFzc2VkIGJldHdlZW4gcHJvY2Vzc2VzLiAgTm90ZSwgaG93ZXZlciwgdGhhdCBpZiBhIHByb3h5IGlzIHNlbnQgdG8gdGhlCi1jb3JyZXNwb25kaW5nIG1hbmFnZXIncyBwcm9jZXNzIHRoZW4gdW5waWNrbGluZyBpdCB3aWxsIHByb2R1Y2UgdGhlIHJlZmVyZW50Ci1pdHNlbGYuICBUaGlzIG1lYW5zLCBmb3IgZXhhbXBsZSwgdGhhdCBvbmUgc2hhcmVkIG9iamVjdCBjYW4gY29udGFpbiBhIHNlY29uZDoKK3Bhc3NlZCBiZXR3ZWVuIHByb2Nlc3Nlcy4gIEFzIHN1Y2gsIGEgcmVmZXJlbnQgY2FuIGNvbnRhaW4KKzpyZWY6YG11bHRpcHJvY2Vzc2luZy1wcm94eV9vYmplY3RzYC4gIFRoaXMgcGVybWl0cyBuZXN0aW5nIG9mIHRoZXNlIG1hbmFnZWQKK2xpc3RzLCBkaWN0cywgYW5kIG90aGVyIDpyZWY6YG11bHRpcHJvY2Vzc2luZy1wcm94eV9vYmplY3RzYDoKIAogLi4gZG9jdGVzdDo6CiAKQEAgLTE5MTYsMTAgKzE5MTEsNDYgQEAKICAgID4+PiBiID0gbWFuYWdlci5saXN0KCkKICAgID4+PiBhLmFwcGVuZChiKSAgICAgICAgICMgcmVmZXJlbnQgb2YgYSBub3cgY29udGFpbnMgcmVmZXJlbnQgb2YgYgogICAgPj4+IHByaW50KGEsIGIpCi0gICBbW11dIFtdCisgICBbPExpc3RQcm94eSBvYmplY3QsIHR5cGVpZCAnbGlzdCcgYXQgLi4uPl0gW10KICAgID4+PiBiLmFwcGVuZCgnaGVsbG8nKQotICAgPj4+IHByaW50KGEsIGIpCi0gICBbWydoZWxsbyddXSBbJ2hlbGxvJ10KKyAgID4+PiBwcmludChhWzBdLCBiKQorICAgWydoZWxsbyddIFsnaGVsbG8nXQorCitTaW1pbGFybHksIGRpY3QgYW5kIGxpc3QgcHJveGllcyBtYXkgYmUgbmVzdGVkIGluc2lkZSBvbmUgYW5vdGhlcjo6CisKKyAgID4+PiBsX291dGVyID0gbWFuYWdlci5saXN0KFsgbWFuYWdlci5kaWN0KCkgZm9yIGkgaW4gcmFuZ2UoMikgXSkKKyAgID4+PiBkX2ZpcnN0X2lubmVyID0gbF9vdXRlclswXQorICAgPj4+IGRfZmlyc3RfaW5uZXJbJ2EnXSA9IDEKKyAgID4+PiBkX2ZpcnN0X2lubmVyWydiJ10gPSAyCisgICA+Pj4gbF9vdXRlclsxXVsnYyddID0gMworICAgPj4+IGxfb3V0ZXJbMV1bJ3onXSA9IDI2CisgICA+Pj4gcHJpbnQobF9vdXRlclswXSkKKyAgIHsnYSc6IDEsICdiJzogMn0KKyAgID4+PiBwcmludChsX291dGVyWzFdKQorICAgeydjJzogMywgJ3onOiAyNn0KKworSWYgc3RhbmRhcmQgKG5vbi1wcm94eSkgOmNsYXNzOmBsaXN0YCBvciA6Y2xhc3M6YGRpY3RgIG9iamVjdHMgYXJlIGNvbnRhaW5lZAoraW4gYSByZWZlcmVudCwgbW9kaWZpY2F0aW9ucyB0byB0aG9zZSBtdXRhYmxlIHZhbHVlcyB3aWxsIG5vdCBiZSBwcm9wYWdhdGVkCit0aHJvdWdoIHRoZSBtYW5hZ2VyIGJlY2F1c2UgdGhlIHByb3h5IGhhcyBubyB3YXkgb2Yga25vd2luZyB3aGVuIHRoZSB2YWx1ZXMKK2NvbnRhaW5lZCB3aXRoaW4gYXJlIG1vZGlmaWVkLiAgSG93ZXZlciwgc3RvcmluZyBhIHZhbHVlIGluIGEgY29udGFpbmVyIHByb3h5Cisod2hpY2ggdHJpZ2dlcnMgYSBgYF9fc2V0aXRlbV9fYGAgb24gdGhlIHByb3h5IG9iamVjdCkgZG9lcyBwcm9wYWdhdGUgdGhyb3VnaAordGhlIG1hbmFnZXIgYW5kIHNvIHRvIGVmZmVjdGl2ZWx5IG1vZGlmeSBzdWNoIGFuIGl0ZW0sIG9uZSBjb3VsZCByZS1hc3NpZ24gdGhlCittb2RpZmllZCB2YWx1ZSB0byB0aGUgY29udGFpbmVyIHByb3h5OjoKKworICAgIyBjcmVhdGUgYSBsaXN0IHByb3h5IGFuZCBhcHBlbmQgYSBtdXRhYmxlIG9iamVjdCAoYSBkaWN0aW9uYXJ5KQorICAgbHByb3h5ID0gbWFuYWdlci5saXN0KCkKKyAgIGxwcm94eS5hcHBlbmQoe30pCisgICAjIG5vdyBtdXRhdGUgdGhlIGRpY3Rpb25hcnkKKyAgIGQgPSBscHJveHlbMF0KKyAgIGRbJ2EnXSA9IDEKKyAgIGRbJ2InXSA9IDIKKyAgICMgYXQgdGhpcyBwb2ludCwgdGhlIGNoYW5nZXMgdG8gZCBhcmUgbm90IHlldCBzeW5jZWQsIGJ1dCBieQorICAgIyB1cGRhdGluZyB0aGUgZGljdGlvbmFyeSwgdGhlIHByb3h5IGlzIG5vdGlmaWVkIG9mIHRoZSBjaGFuZ2UKKyAgIGxwcm94eVswXSA9IGQKKworVGhpcyBhcHByb2FjaCBpcyBwZXJoYXBzIGxlc3MgY29udmVuaWVudCB0aGFuIGVtcGxveWluZyBuZXN0ZWQKKzpyZWY6YG11bHRpcHJvY2Vzc2luZy1wcm94eV9vYmplY3RzYCBmb3IgbW9zdCB1c2UgY2FzZXMgYnV0IGFsc28KK2RlbW9uc3RyYXRlcyBhIGxldmVsIG9mIGNvbnRyb2wgb3ZlciB0aGUgc3luY2hyb25pemF0aW9uLgogCiAuLiBub3RlOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvb3MucGF0aC5yc3QgYi9Eb2MvbGlicmFyeS9vcy5wYXRoLnJzdAppbmRleCBiZjBkZmFjLi40MDYwNTRlIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9vcy5wYXRoLnJzdAorKysgYi9Eb2MvbGlicmFyeS9vcy5wYXRoLnJzdApAQCAtNjEsNiArNjEsOSBAQAogICAgcGxhdGZvcm1zLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24gOmZ1bmM6YG5vcm1wYXRoYCBhcwogICAgZm9sbG93czogYGBub3JtcGF0aChqb2luKG9zLmdldGN3ZCgpLCBwYXRoKSlgYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBiYXNlbmFtZShwYXRoKQogCkBAIC03MSw2ICs3NCw5IEBACiAgICBgYCcvZm9vL2Jhci8nYGAgcmV0dXJucyBgYCdiYXInYGAsIHRoZSA6ZnVuYzpgYmFzZW5hbWVgIGZ1bmN0aW9uIHJldHVybnMgYW4KICAgIGVtcHR5IHN0cmluZyAoYGAnJ2BgKS4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBjb21tb25wYXRoKHBhdGhzKQogCkBAIC04Myw2ICs4OSw5IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNQogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIHNlcXVlbmNlIG9mIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0cyA8cGF0aC1saWtlIG9iamVjdD5gLgorCiAKIC4uIGZ1bmN0aW9uOjogY29tbW9ucHJlZml4KGxpc3QpCiAKQEAgLTEwNCwxMiArMTEzLDE4IEBACiAgICAgICAgID4+PiBvcy5wYXRoLmNvbW1vbnBhdGgoWycvdXNyL2xpYicsICcvdXNyL2xvY2FsL2xpYiddKQogICAgICAgICAnL3VzcicKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBkaXJuYW1lKHBhdGgpCiAKICAgIFJldHVybiB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgcGF0aG5hbWUgKnBhdGgqLiAgVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZgogICAgdGhlIHBhaXIgcmV0dXJuZWQgYnkgcGFzc2luZyAqcGF0aCogdG8gdGhlIGZ1bmN0aW9uIDpmdW5jOmBzcGxpdGAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogZXhpc3RzKHBhdGgpCiAKQEAgLTEyMyw2ICsxMzgsOSBAQAogICAgICAgKnBhdGgqIGNhbiBub3cgYmUgYW4gaW50ZWdlcjogYGBUcnVlYGAgaXMgcmV0dXJuZWQgaWYgaXQgaXMgYW4KICAgICAgICBvcGVuIGZpbGUgZGVzY3JpcHRvciwgYGBGYWxzZWBgIG90aGVyd2lzZS4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBsZXhpc3RzKHBhdGgpCiAKQEAgLTEzMCw2ICsxNDgsOSBAQAogICAgYnJva2VuIHN5bWJvbGljIGxpbmtzLiAgIEVxdWl2YWxlbnQgdG8gOmZ1bmM6YGV4aXN0c2Agb24gcGxhdGZvcm1zIGxhY2tpbmcKICAgIDpmdW5jOmBvcy5sc3RhdGAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogZXhwYW5kdXNlcihwYXRoKQogCkBAIC0xNTEsNiArMTcyLDkgQEAKICAgIElmIHRoZSBleHBhbnNpb24gZmFpbHMgb3IgaWYgdGhlIHBhdGggZG9lcyBub3QgYmVnaW4gd2l0aCBhIHRpbGRlLCB0aGUgcGF0aCBpcwogICAgcmV0dXJuZWQgdW5jaGFuZ2VkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGV4cGFuZHZhcnMocGF0aCkKIApAQCAtMTYyLDYgKzE4Niw5IEBACiAgICBPbiBXaW5kb3dzLCBgYCVuYW1lJWBgIGV4cGFuc2lvbnMgYXJlIHN1cHBvcnRlZCBpbiBhZGRpdGlvbiB0byBgYCRuYW1lYGAgYW5kCiAgICBgYCR7bmFtZX1gYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBnZXRhdGltZShwYXRoKQogCkBAIC0xODIsNiArMjA5LDkgQEAKICAgIElmIDpmdW5jOmBvcy5zdGF0X2Zsb2F0X3RpbWVzYCByZXR1cm5zIGBgVHJ1ZWBgLCB0aGUgcmVzdWx0IGlzIGEgZmxvYXRpbmcgcG9pbnQKICAgIG51bWJlci4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBnZXRjdGltZShwYXRoKQogCkBAIC0xOTEsMTIgKzIyMSwxOCBAQAogICAgdGhlICA6bW9kOmB0aW1lYCBtb2R1bGUpLiAgUmFpc2UgOmV4YzpgT1NFcnJvcmAgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IKICAgIGlzIGluYWNjZXNzaWJsZS4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBnZXRzaXplKHBhdGgpCiAKICAgIFJldHVybiB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mICpwYXRoKi4gIFJhaXNlIDpleGM6YE9TRXJyb3JgIGlmIHRoZSBmaWxlIGRvZXMKICAgIG5vdCBleGlzdCBvciBpcyBpbmFjY2Vzc2libGUuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogaXNhYnMocGF0aCkKIApAQCAtMjA0LDI0ICsyNDAsMzYgQEAKICAgIGJlZ2lucyB3aXRoIGEgc2xhc2gsIG9uIFdpbmRvd3MgdGhhdCBpdCBiZWdpbnMgd2l0aCBhIChiYWNrKXNsYXNoIGFmdGVyIGNob3BwaW5nCiAgICBvZmYgYSBwb3RlbnRpYWwgZHJpdmUgbGV0dGVyLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGlzZmlsZShwYXRoKQogCiAgICBSZXR1cm4gYGBUcnVlYGAgaWYgKnBhdGgqIGlzIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZmlsZS4gIFRoaXMgZm9sbG93cyBzeW1ib2xpYwogICAgbGlua3MsIHNvIGJvdGggOmZ1bmM6YGlzbGlua2AgYW5kIDpmdW5jOmBpc2ZpbGVgIGNhbiBiZSB0cnVlIGZvciB0aGUgc2FtZSBwYXRoLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGlzZGlyKHBhdGgpCiAKICAgIFJldHVybiBgYFRydWVgYCBpZiAqcGF0aCogaXMgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiAgVGhpcyBmb2xsb3dzIHN5bWJvbGljCiAgICBsaW5rcywgc28gYm90aCA6ZnVuYzpgaXNsaW5rYCBhbmQgOmZ1bmM6YGlzZGlyYCBjYW4gYmUgdHJ1ZSBmb3IgdGhlIHNhbWUgcGF0aC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBpc2xpbmsocGF0aCkKIAogICAgUmV0dXJuIGBgVHJ1ZWBgIGlmICpwYXRoKiByZWZlcnMgdG8gYSBkaXJlY3RvcnkgZW50cnkgdGhhdCBpcyBhIHN5bWJvbGljIGxpbmsuCiAgICBBbHdheXMgYGBGYWxzZWBgIGlmIHN5bWJvbGljIGxpbmtzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBQeXRob24gcnVudGltZS4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBpc21vdW50KHBhdGgpCiAKQEAgLTIzNyw2ICsyODUsOSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAgICAgICBTdXBwb3J0IGZvciBkZXRlY3Rpbmcgbm9uLXJvb3QgbW91bnQgcG9pbnRzIG9uIFdpbmRvd3MuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogam9pbihwYXRoLCAqcGF0aHMpCiAKQEAgLTI1NSwxMyArMzA2LDIwIEBACiAgICBgYG9zLnBhdGguam9pbigiYzoiLCAiZm9vIilgYCByZXByZXNlbnRzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgY3VycmVudAogICAgZGlyZWN0b3J5IG9uIGRyaXZlIDpmaWxlOmBDOmAgKDpmaWxlOmBjOmZvb2ApLCBub3QgOmZpbGU6YGM6XFxmb29gLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YCBmb3IgKnBhdGgqIGFuZCAqcGF0aHMqLgorCiAKIC4uIGZ1bmN0aW9uOjogbm9ybWNhc2UocGF0aCkKIAogICAgTm9ybWFsaXplIHRoZSBjYXNlIG9mIGEgcGF0aG5hbWUuICBPbiBVbml4IGFuZCBNYWMgT1MgWCwgdGhpcyByZXR1cm5zIHRoZQogICAgcGF0aCB1bmNoYW5nZWQ7IG9uIGNhc2UtaW5zZW5zaXRpdmUgZmlsZXN5c3RlbXMsIGl0IGNvbnZlcnRzIHRoZSBwYXRoIHRvCiAgICBsb3dlcmNhc2UuICBPbiBXaW5kb3dzLCBpdCBhbHNvIGNvbnZlcnRzIGZvcndhcmQgc2xhc2hlcyB0byBiYWNrd2FyZCBzbGFzaGVzLgotICAgUmFpc2UgYSBUeXBlRXJyb3IgaWYgdGhlIHR5cGUgb2YgKnBhdGgqIGlzIG5vdCBgYHN0cmBgIG9yIGBgYnl0ZXNgYC4KKyAgIFJhaXNlIGEgVHlwZUVycm9yIGlmIHRoZSB0eXBlIG9mICpwYXRoKiBpcyBub3QgYGBzdHJgYCBvciBgYGJ5dGVzYGAgKGRpcmVjdGx5CisgICBvciBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIGludGVyZmFjZSkuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgogCiAKIC4uIGZ1bmN0aW9uOjogbm9ybXBhdGgocGF0aCkKQEAgLTI3MiwxMiArMzMwLDE4IEBACiAgICB0aGF0IGNvbnRhaW5zIHN5bWJvbGljIGxpbmtzLiAgT24gV2luZG93cywgaXQgY29udmVydHMgZm9yd2FyZCBzbGFzaGVzIHRvCiAgICBiYWNrd2FyZCBzbGFzaGVzLiBUbyBub3JtYWxpemUgY2FzZSwgdXNlIDpmdW5jOmBub3JtY2FzZWAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogcmVhbHBhdGgocGF0aCkKIAogICAgUmV0dXJuIHRoZSBjYW5vbmljYWwgcGF0aCBvZiB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lLCBlbGltaW5hdGluZyBhbnkgc3ltYm9saWMKICAgIGxpbmtzIGVuY291bnRlcmVkIGluIHRoZSBwYXRoIChpZiB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0pLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHJlbHBhdGgocGF0aCwgc3RhcnQ9b3MuY3VyZGlyKQogCkBAIC0yOTAsNiArMzU0LDkgQEAKIAogICAgQXZhaWxhYmlsaXR5OiBVbml4LCBXaW5kb3dzLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHNhbWVmaWxlKHBhdGgxLCBwYXRoMikKIApAQCAtMzA1LDYgKzM3Miw5IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNAogICAgICAgV2luZG93cyBub3cgdXNlcyB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBhcyBhbGwgb3RoZXIgcGxhdGZvcm1zLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHNhbWVvcGVuZmlsZShmcDEsIGZwMikKIApAQCAtMzE1LDYgKzM4NSw5IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMgogICAgICAgQWRkZWQgV2luZG93cyBzdXBwb3J0LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHNhbWVzdGF0KHN0YXQxLCBzdGF0MikKIApAQCAtMzI4LDYgKzQwMSw5IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNAogICAgICAgQWRkZWQgV2luZG93cyBzdXBwb3J0LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHNwbGl0KHBhdGgpCiAKQEAgLTM0MSw2ICs0MTcsOSBAQAogICAgKGJ1dCB0aGUgc3RyaW5ncyBtYXkgZGlmZmVyKS4gIEFsc28gc2VlIHRoZSBmdW5jdGlvbnMgOmZ1bmM6YGRpcm5hbWVgIGFuZAogICAgOmZ1bmM6YGJhc2VuYW1lYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBzcGxpdGRyaXZlKHBhdGgpCiAKQEAgLTM1OSw2ICs0MzgsOSBAQAogICAgYW5kIHNoYXJlLCB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgZm91cnRoIHNlcGFyYXRvci4KICAgIGUuZy4gYGBzcGxpdGRyaXZlKCIvL2hvc3QvY29tcHV0ZXIvZGlyIilgYCByZXR1cm5zIGBgKCIvL2hvc3QvY29tcHV0ZXIiLCAiL2RpciIpYGAKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBzcGxpdGV4dChwYXRoKQogCkBAIC0zNjcsNiArNDQ5LDkgQEAKICAgIHBlcmlvZC4gTGVhZGluZyBwZXJpb2RzIG9uIHRoZSBiYXNlbmFtZSBhcmUgIGlnbm9yZWQ7IGBgc3BsaXRleHQoJy5jc2hyYycpYGAKICAgIHJldHVybnMgIGBgKCcuY3NocmMnLCAnJylgYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBzcGxpdHVuYyhwYXRoKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9vcy5yc3QgYi9Eb2MvbGlicmFyeS9vcy5yc3QKaW5kZXggNDI2NWJjMi4uZTJiNmU2NCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvb3MucnN0CisrKyBiL0RvYy9saWJyYXJ5L29zLnJzdApAQCAtNTcsNyArNTcsNyBAQAogCiAgICBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgbW9kdWxlIGltcG9ydGVkLiAgVGhlIGZvbGxvd2luZwogICAgbmFtZXMgaGF2ZSBjdXJyZW50bHkgYmVlbiByZWdpc3RlcmVkOiBgYCdwb3NpeCdgYCwgYGAnbnQnYGAsCi0gICBgYCdjZSdgYCwgYGAnamF2YSdgYC4KKyAgIGBgJ2phdmEnYGAuCiAKICAgIC4uIHNlZWFsc286OgogICAgICAgOmF0dHI6YHN5cy5wbGF0Zm9ybWAgaGFzIGEgZmluZXIgZ3JhbnVsYXJpdHkuICA6ZnVuYzpgb3MudW5hbWVgIGdpdmVzCkBAIC0xNzEsMjMgKzE3MSw2MCBAQAogCiAuLiBmdW5jdGlvbjo6IGZzZW5jb2RlKGZpbGVuYW1lKQogCi0gICBFbmNvZGUgKmZpbGVuYW1lKiB0byB0aGUgZmlsZXN5c3RlbSBlbmNvZGluZyB3aXRoIGBgJ3N1cnJvZ2F0ZWVzY2FwZSdgYAotICAgZXJyb3IgaGFuZGxlciwgb3IgYGAnc3RyaWN0J2BgIG9uIFdpbmRvd3M7IHJldHVybiA6Y2xhc3M6YGJ5dGVzYCB1bmNoYW5nZWQuCisgICBFbmNvZGUgOnRlcm06YHBhdGgtbGlrZSA8cGF0aC1saWtlIG9iamVjdD5gICpmaWxlbmFtZSogdG8gdGhlIGZpbGVzeXN0ZW0KKyAgIGVuY29kaW5nIHdpdGggYGAnc3Vycm9nYXRlZXNjYXBlJ2BgIGVycm9yIGhhbmRsZXIsIG9yIGBgJ3N0cmljdCdgYCBvbgorICAgV2luZG93czsgcmV0dXJuIDpjbGFzczpgYnl0ZXNgIHVuY2hhbmdlZC4KIAogICAgOmZ1bmM6YGZzZGVjb2RlYCBpcyB0aGUgcmV2ZXJzZSBmdW5jdGlvbi4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBTdXBwb3J0IGFkZGVkIHRvIGFjY2VwdCBvYmplY3RzIGltcGxlbWVudGluZyB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAKKyAgICAgIGludGVyZmFjZS4KKwogCiAuLiBmdW5jdGlvbjo6IGZzZGVjb2RlKGZpbGVuYW1lKQogCi0gICBEZWNvZGUgKmZpbGVuYW1lKiBmcm9tIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nIHdpdGggYGAnc3Vycm9nYXRlZXNjYXBlJ2BgCi0gICBlcnJvciBoYW5kbGVyLCBvciBgYCdzdHJpY3QnYGAgb24gV2luZG93czsgcmV0dXJuIDpjbGFzczpgc3RyYCB1bmNoYW5nZWQuCisgICBEZWNvZGUgdGhlIDp0ZXJtOmBwYXRoLWxpa2UgPHBhdGgtbGlrZSBvYmplY3Q+YCAqZmlsZW5hbWUqIGZyb20gdGhlCisgICBmaWxlc3lzdGVtIGVuY29kaW5nIHdpdGggYGAnc3Vycm9nYXRlZXNjYXBlJ2BgIGVycm9yIGhhbmRsZXIsIG9yIGBgJ3N0cmljdCdgYAorICAgb24gV2luZG93czsgcmV0dXJuIDpjbGFzczpgc3RyYCB1bmNoYW5nZWQuCiAKICAgIDpmdW5jOmBmc2VuY29kZWAgaXMgdGhlIHJldmVyc2UgZnVuY3Rpb24uCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgU3VwcG9ydCBhZGRlZCB0byBhY2NlcHQgb2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgCisgICAgICBpbnRlcmZhY2UuCisKKworLi4gZnVuY3Rpb246OiBmc3BhdGgocGF0aCkKKworICAgUmV0dXJuIHRoZSBmaWxlIHN5c3RlbSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGF0aC4KKworICAgSWYgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgYnl0ZXNgIGlzIHBhc3NlZCBpbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgorICAgT3RoZXJ3aXNlIDptZXRoOmB+b3MuUGF0aExpa2UuX19mc3BhdGhfX2AgaXMgY2FsbGVkIGFuZCBpdHMgdmFsdWUgaXMKKyAgIHJldHVybmVkIGFzIGxvbmcgYXMgaXQgaXMgYSA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2Agb2JqZWN0LgorICAgSW4gYWxsIG90aGVyIGNhc2VzLCA6ZXhjOmBUeXBlRXJyb3JgIGlzIHJhaXNlZC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworLi4gY2xhc3M6OiBQYXRoTGlrZQorCisgICBBbiA6dGVybTpgYWJzdHJhY3QgYmFzZSBjbGFzc2AgZm9yIG9iamVjdHMgcmVwcmVzZW50aW5nIGEgZmlsZSBzeXN0ZW0gcGF0aCwKKyAgIGUuZy4gOmNsYXNzOmBwYXRobGliLlB1cmVQYXRoYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKyAgIC4uIGFic3RyYWN0bWV0aG9kOjogX19mc3BhdGhfXygpCisKKyAgICAgIFJldHVybiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgorCisgICAgICBUaGUgbWV0aG9kIHNob3VsZCBvbmx5IHJldHVybiBhIDpjbGFzczpgc3RyYCBvciA6Y2xhc3M6YGJ5dGVzYCBvYmplY3QsCisgICAgICB3aXRoIHRoZSBwcmVmZXJlbmNlIGJlaW5nIGZvciA6Y2xhc3M6YHN0cmAuCisKIAogLi4gZnVuY3Rpb246OiBnZXRlbnYoa2V5LCBkZWZhdWx0PU5vbmUpCiAKQEAgLTg5Myw2ICs5MzAsOSBAQAogICAgICAgZXhjZXB0aW9uLCB0aGUgZnVuY3Rpb24gbm93IHJldHJpZXMgdGhlIHN5c3RlbSBjYWxsIGluc3RlYWQgb2YgcmFpc2luZyBhbgogICAgICAgOmV4YzpgSW50ZXJydXB0ZWRFcnJvcmAgZXhjZXB0aW9uIChzZWUgOnBlcDpgNDc1YCBmb3IgdGhlIHJhdGlvbmFsZSkuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgb3B0aW9ucyBmb3IgdGhlICpmbGFncyogcGFyYW1ldGVyIHRvIHRoZQogOmZ1bmM6YH5vcy5vcGVuYCBmdW5jdGlvbi4gIFRoZXkgY2FuIGJlIGNvbWJpbmVkIHVzaW5nIHRoZSBiaXR3aXNlIE9SIG9wZXJhdG9yCiBgYHxgYC4gIFNvbWUgb2YgdGhlbSBhcmUgbm90IGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zLiAgRm9yIGRlc2NyaXB0aW9ucyBvZgpAQCAtMTM4OSw2ICsxNDI5LDkgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCiAgICAgICBBZGRlZCB0aGUgKmRpcl9mZCosICplZmZlY3RpdmVfaWRzKiwgYW5kICpmb2xsb3dfc3ltbGlua3MqIHBhcmFtZXRlcnMuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGRhdGE6OiBGX09LCiAgICAgICAgICAgUl9PSwpAQCAtMTQxMyw2ICsxNDU2LDkgQEAKICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgKnBhdGgqIGFzIGEgZmlsZSBkZXNjcmlwdG9yCiAgICAgICBvbiBzb21lIHBsYXRmb3Jtcy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBjaGZsYWdzKHBhdGgsIGZsYWdzLCAqLCBmb2xsb3dfc3ltbGlua3M9VHJ1ZSkKIApAQCAtMTQzOSw2ICsxNDg1LDkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogICAgICAgVGhlICpmb2xsb3dfc3ltbGlua3MqIGFyZ3VtZW50LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGNobW9kKHBhdGgsIG1vZGUsICosIGRpcl9mZD1Ob25lLCBmb2xsb3dfc3ltbGlua3M9VHJ1ZSkKIApAQCAtMTQ4MCw2ICsxNTI5LDkgQEAKICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgKnBhdGgqIGFzIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yLAogICAgICAgYW5kIHRoZSAqZGlyX2ZkKiBhbmQgKmZvbGxvd19zeW1saW5rcyogYXJndW1lbnRzLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGNob3duKHBhdGgsIHVpZCwgZ2lkLCAqLCBkaXJfZmQ9Tm9uZSwgZm9sbG93X3N5bWxpbmtzPVRydWUpCiAKQEAgLTE0OTksNiArMTU1MSw5IEBACiAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIGZvciAqcGF0aCosCiAgICAgICBhbmQgdGhlICpkaXJfZmQqIGFuZCAqZm9sbG93X3N5bWxpbmtzKiBhcmd1bWVudHMuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBTdXBwb3J0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGNocm9vdChwYXRoKQogCkBAIC0xNTA2LDYgKzE1NjEsOSBAQAogCiAgICBBdmFpbGFiaWxpdHk6IFVuaXguCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogZmNoZGlyKGZkKQogCkBAIC0xNTM0LDYgKzE1OTIsOSBAQAogCiAgICBBdmFpbGFiaWxpdHk6IFVuaXguCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogbGNobW9kKHBhdGgsIG1vZGUpCiAKQEAgLTE1NDQsNiArMTYwNSw4IEBACiAKICAgIEF2YWlsYWJpbGl0eTogVW5peC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCiAKIC4uIGZ1bmN0aW9uOjogbGNob3duKHBhdGgsIHVpZCwgZ2lkKQogCkBAIC0xNTUzLDYgKzE2MTYsOSBAQAogCiAgICBBdmFpbGFiaWxpdHk6IFVuaXguCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogbGluayhzcmMsIGRzdCwgKiwgc3JjX2Rpcl9mZD1Ob25lLCBkc3RfZGlyX2ZkPU5vbmUsIGZvbGxvd19zeW1saW5rcz1UcnVlKQogCkBAIC0xNTcwLDYgKzE2MzYsOSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAgICAgICBBZGRlZCB0aGUgKnNyY19kaXJfZmQqLCAqZHN0X2Rpcl9mZCosIGFuZCAqZm9sbG93X3N5bWxpbmtzKiBhcmd1bWVudHMuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgIGZvciAqc3JjKiBhbmQgKmRzdCouCisKIAogLi4gZnVuY3Rpb246OiBsaXN0ZGlyKHBhdGg9Jy4nKQogCkBAIC0xNTc3LDggKzE2NDYsOSBAQAogICAgKnBhdGgqLiAgVGhlIGxpc3QgaXMgaW4gYXJiaXRyYXJ5IG9yZGVyLCBhbmQgZG9lcyBub3QgaW5jbHVkZSB0aGUgc3BlY2lhbAogICAgZW50cmllcyBgYCcuJ2BgIGFuZCBgYCcuLidgYCBldmVuIGlmIHRoZXkgYXJlIHByZXNlbnQgaW4gdGhlIGRpcmVjdG9yeS4KIAotICAgKnBhdGgqIG1heSBiZSBlaXRoZXIgb2YgdHlwZSBgYHN0cmBgIG9yIG9mIHR5cGUgYGBieXRlc2BgLiAgSWYgKnBhdGgqCi0gICBpcyBvZiB0eXBlIGBgYnl0ZXNgYCwgdGhlIGZpbGVuYW1lcyByZXR1cm5lZCB3aWxsIGFsc28gYmUgb2YgdHlwZSBgYGJ5dGVzYGA7CisgICAqcGF0aCogbWF5IGJlIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLiAgSWYgKnBhdGgqIGlzIG9mIHR5cGUgYGBieXRlc2BgCisgICAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHRoZSA6Y2xhc3M6YFBhdGhMaWtlYCBpbnRlcmZhY2UpLAorICAgdGhlIGZpbGVuYW1lcyByZXR1cm5lZCB3aWxsIGFsc28gYmUgb2YgdHlwZSBgYGJ5dGVzYGA7CiAgICBpbiBhbGwgb3RoZXIgY2lyY3Vtc3RhbmNlcywgdGhleSB3aWxsIGJlIG9mIHR5cGUgYGBzdHJgYC4KIAogICAgVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBzdXBwb3J0IDpyZWY6YHNwZWNpZnlpbmcgYSBmaWxlIGRlc2NyaXB0b3IKQEAgLTE1OTksNiArMTY2OSw5IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgZm9yICpwYXRoKi4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBsc3RhdChwYXRoLCBcKiwgZGlyX2ZkPU5vbmUpCiAKQEAgLTE2MjUsNiArMTY5OCw5IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMwogICAgICAgQWRkZWQgdGhlICpkaXJfZmQqIHBhcmFtZXRlci4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAgZm9yICpzcmMqIGFuZCAqZHN0Ki4KKwogCiAuLiBmdW5jdGlvbjo6IG1rZGlyKHBhdGgsIG1vZGU9MG83NzcsICosIGRpcl9mZD1Ob25lKQogCkBAIC0xNjQ5LDYgKzE3MjUsOSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAgICAgICBUaGUgKmRpcl9mZCogYXJndW1lbnQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogbWFrZWRpcnMobmFtZSwgbW9kZT0wbzc3NywgZXhpc3Rfb2s9RmFsc2UpCiAKQEAgLTE2ODIsNiArMTc2MSw5IEBACiAgICAgICBtb2RlIG9mIHRoZSBleGlzdGluZyBkaXJlY3RvcnkuIFNpbmNlIHRoaXMgYmVoYXZpb3Igd2FzIGltcG9zc2libGUgdG8KICAgICAgIGltcGxlbWVudCBzYWZlbHksIGl0IHdhcyByZW1vdmVkIGluIFB5dGhvbiAzLjQuMS4gU2VlIDppc3N1ZTpgMjEwODJgLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IG1rZmlmbyhwYXRoLCBtb2RlPTBvNjY2LCAqLCBkaXJfZmQ9Tm9uZSkKIApAQCAtMTcwMiw2ICsxNzg0LDkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogICAgICAgVGhlICpkaXJfZmQqIGFyZ3VtZW50LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IG1rbm9kKHBhdGgsIG1vZGU9MG82MDAsIGRldmljZT0wLCAqLCBkaXJfZmQ9Tm9uZSkKIApAQCAtMTcxOSw2ICsxODA0LDkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogICAgICAgVGhlICpkaXJfZmQqIGFyZ3VtZW50LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IG1ham9yKGRldmljZSkKIApAQCAtMTc1Nyw2ICsxODQ1LDkgQEAKIAogICAgQXZhaWxhYmlsaXR5OiBVbml4LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBkYXRhOjogcGF0aGNvbmZfbmFtZXMKIApAQCAtMTc3NCw5ICsxODY1LDEwIEBACiAgICBtYXkgYmUgY29udmVydGVkIHRvIGFuIGFic29sdXRlIHBhdGhuYW1lIHVzaW5nCiAgICBgYG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUocGF0aCksIHJlc3VsdClgYC4KIAotICAgSWYgdGhlICpwYXRoKiBpcyBhIHN0cmluZyBvYmplY3QsIHRoZSByZXN1bHQgd2lsbCBhbHNvIGJlIGEgc3RyaW5nIG9iamVjdCwKKyAgIElmIHRoZSAqcGF0aCogaXMgYSBzdHJpbmcgb2JqZWN0IChkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggYQorICAgOmNsYXNzOmBQYXRoTGlrZWAgaW50ZXJmYWNlKSwgdGhlIHJlc3VsdCB3aWxsIGFsc28gYmUgYSBzdHJpbmcgb2JqZWN0LAogICAgYW5kIHRoZSBjYWxsIG1heSByYWlzZSBhIFVuaWNvZGVEZWNvZGVFcnJvci4gSWYgdGhlICpwYXRoKiBpcyBhIGJ5dGVzCi0gICBvYmplY3QsIHRoZSByZXN1bHQgd2lsbCBiZSBhIGJ5dGVzIG9iamVjdC4KKyAgIG9iamVjdCAoZGlyZWN0IG9yIGluZGlyZWN0bHkpLCB0aGUgcmVzdWx0IHdpbGwgYmUgYSBieXRlcyBvYmplY3QuCiAKICAgIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gc3VwcG9ydCA6cmVmOmBwYXRocyByZWxhdGl2ZSB0byBkaXJlY3RvcnkgZGVzY3JpcHRvcnMKICAgIDxkaXJfZmQ+YC4KQEAgLTE3ODksNiArMTg4MSw5IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKICAgICAgIFRoZSAqZGlyX2ZkKiBhcmd1bWVudC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiByZW1vdmUocGF0aCwgKiwgZGlyX2ZkPU5vbmUpCiAKQEAgLTE4MDcsNiArMTkwMiw5IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKICAgICAgIFRoZSAqZGlyX2ZkKiBhcmd1bWVudC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiByZW1vdmVkaXJzKG5hbWUpCiAKQEAgLTE4MjEsNiArMTkxOSw5IEBACiAgICB0aGV5IGFyZSBlbXB0eS4gUmFpc2VzIDpleGM6YE9TRXJyb3JgIGlmIHRoZSBsZWFmIGRpcmVjdG9yeSBjb3VsZCBub3QgYmUKICAgIHN1Y2Nlc3NmdWxseSByZW1vdmVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHJlbmFtZShzcmMsIGRzdCwgKiwgc3JjX2Rpcl9mZD1Ob25lLCBkc3RfZGlyX2ZkPU5vbmUpCiAKQEAgLTE4NDAsNiArMTk0MSw5IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKICAgICAgIFRoZSAqc3JjX2Rpcl9mZCogYW5kICpkc3RfZGlyX2ZkKiBhcmd1bWVudHMuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgIGZvciAqc3JjKiBhbmQgKmRzdCouCisKIAogLi4gZnVuY3Rpb246OiByZW5hbWVzKG9sZCwgbmV3KQogCkBAIC0xODUzLDYgKzE5NTcsOSBAQAogICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gZmFpbCB3aXRoIHRoZSBuZXcgZGlyZWN0b3J5IHN0cnVjdHVyZSBtYWRlIGlmIHlvdSBsYWNrCiAgICAgICBwZXJtaXNzaW9ucyBuZWVkZWQgdG8gcmVtb3ZlIHRoZSBsZWFmIGRpcmVjdG9yeSBvciBmaWxlLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YCBmb3IgKm9sZCogYW5kICpuZXcqLgorCiAKIC4uIGZ1bmN0aW9uOjogcmVwbGFjZShzcmMsIGRzdCwgKiwgc3JjX2Rpcl9mZD1Ob25lLCBkc3RfZGlyX2ZkPU5vbmUpCiAKQEAgLTE4NjcsNiArMTk3NCw5IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YCBmb3IgKnNyYyogYW5kICpkc3QqLgorCiAKIC4uIGZ1bmN0aW9uOjogcm1kaXIocGF0aCwgKiwgZGlyX2ZkPU5vbmUpCiAKQEAgLTE4ODAsMzggKzE5OTAsNTggQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogICAgICAgVGhlICpkaXJfZmQqIHBhcmFtZXRlci4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBzY2FuZGlyKHBhdGg9Jy4nKQogCi0gICBSZXR1cm4gYW4gaXRlcmF0b3Igb2YgOmNsYXNzOmBEaXJFbnRyeWAgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbnRyaWVzCi0gICBpbiB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5ICpwYXRoKi4gVGhlIGVudHJpZXMgYXJlIHlpZWxkZWQgaW4gYXJiaXRyYXJ5Ci0gICBvcmRlciwgYW5kIHRoZSBzcGVjaWFsIGVudHJpZXMgYGAnLidgYCBhbmQgYGAnLi4nYGAgYXJlIG5vdCBpbmNsdWRlZC4KKyAgIFJldHVybiBhbiBpdGVyYXRvciBvZiA6Y2xhc3M6YG9zLkRpckVudHJ5YCBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICBlbnRyaWVzIGluIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkgKnBhdGgqLiBUaGUgZW50cmllcyBhcmUgeWllbGRlZCBpbgorICAgYXJiaXRyYXJ5IG9yZGVyLCBhbmQgdGhlIHNwZWNpYWwgZW50cmllcyBgYCcuJ2BgIGFuZCBgYCcuLidgYCBhcmUgbm90CisgICBpbmNsdWRlZC4KIAogICAgVXNpbmcgOmZ1bmM6YHNjYW5kaXJgIGluc3RlYWQgb2YgOmZ1bmM6YGxpc3RkaXJgIGNhbiBzaWduaWZpY2FudGx5CiAgICBpbmNyZWFzZSB0aGUgcGVyZm9ybWFuY2Ugb2YgY29kZSB0aGF0IGFsc28gbmVlZHMgZmlsZSB0eXBlIG9yIGZpbGUKLSAgIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiwgYmVjYXVzZSA6Y2xhc3M6YERpckVudHJ5YCBvYmplY3RzIGV4cG9zZSB0aGlzCisgICBhdHRyaWJ1dGUgaW5mb3JtYXRpb24sIGJlY2F1c2UgOmNsYXNzOmBvcy5EaXJFbnRyeWAgb2JqZWN0cyBleHBvc2UgdGhpcwogICAgaW5mb3JtYXRpb24gaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcHJvdmlkZXMgaXQgd2hlbiBzY2FubmluZyBhIGRpcmVjdG9yeS4KLSAgIEFsbCA6Y2xhc3M6YERpckVudHJ5YCBtZXRob2RzIG1heSBwZXJmb3JtIGEgc3lzdGVtIGNhbGwsIGJ1dAotICAgOmZ1bmM6YH5EaXJFbnRyeS5pc19kaXJgIGFuZCA6ZnVuYzpgfkRpckVudHJ5LmlzX2ZpbGVgIHVzdWFsbHkgb25seQotICAgcmVxdWlyZSBhIHN5c3RlbSBjYWxsIGZvciBzeW1ib2xpYyBsaW5rczsgOmZ1bmM6YERpckVudHJ5LnN0YXRgCisgICBBbGwgOmNsYXNzOmBvcy5EaXJFbnRyeWAgbWV0aG9kcyBtYXkgcGVyZm9ybSBhIHN5c3RlbSBjYWxsLCBidXQKKyAgIDpmdW5jOmB+b3MuRGlyRW50cnkuaXNfZGlyYCBhbmQgOmZ1bmM6YH5vcy5EaXJFbnRyeS5pc19maWxlYCB1c3VhbGx5IG9ubHkKKyAgIHJlcXVpcmUgYSBzeXN0ZW0gY2FsbCBmb3Igc3ltYm9saWMgbGlua3M7IDpmdW5jOmBvcy5EaXJFbnRyeS5zdGF0YAogICAgYWx3YXlzIHJlcXVpcmVzIGEgc3lzdGVtIGNhbGwgb24gVW5peCBidXQgb25seSByZXF1aXJlcyBvbmUgZm9yCiAgICBzeW1ib2xpYyBsaW5rcyBvbiBXaW5kb3dzLgogCi0gICBPbiBVbml4LCAqcGF0aCogY2FuIGJlIG9mIHR5cGUgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgYnl0ZXNgICh1c2UKKyAgIE9uIFVuaXgsICpwYXRoKiBjYW4gYmUgb2YgdHlwZSA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2AgKGVpdGhlcgorICAgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHRoZSA6Y2xhc3M6YFBhdGhMaWtlYCBpbnRlcmZhY2U7IHVzZQogICAgOmZ1bmM6YH5vcy5mc2VuY29kZWAgYW5kIDpmdW5jOmB+b3MuZnNkZWNvZGVgIHRvIGVuY29kZSBhbmQgZGVjb2RlCiAgICA6Y2xhc3M6YGJ5dGVzYCBwYXRocykuIE9uIFdpbmRvd3MsICpwYXRoKiBtdXN0IGJlIG9mIHR5cGUgOmNsYXNzOmBzdHJgLgotICAgT24gYm90aCBzeXN0ZW1zLCB0aGUgdHlwZSBvZiB0aGUgOmF0dHI6YH5EaXJFbnRyeS5uYW1lYCBhbmQKLSAgIDphdHRyOmB+RGlyRW50cnkucGF0aGAgYXR0cmlidXRlcyBvZiBlYWNoIDpjbGFzczpgRGlyRW50cnlgIHdpbGwgYmUgb2YKKyAgIE9uIGJvdGggc3lzdGVtcywgdGhlIHR5cGUgb2YgdGhlIDphdHRyOmB+b3MuRGlyRW50cnkubmFtZWAgYW5kCisgICA6YXR0cjpgfm9zLkRpckVudHJ5LnBhdGhgIGF0dHJpYnV0ZXMgb2YgZWFjaCA6Y2xhc3M6YG9zLkRpckVudHJ5YCB3aWxsIGJlIG9mCiAgICB0aGUgc2FtZSB0eXBlIGFzICpwYXRoKi4KIAorICAgVGhlIDpmdW5jOmBzY2FuZGlyYCBpdGVyYXRvciBzdXBwb3J0cyB0aGUgOnRlcm06YGNvbnRleHQgbWFuYWdlcmAgcHJvdG9jb2wKKyAgIGFuZCBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2Q6CisKKyAgIC4uIG1ldGhvZDo6IHNjYW5kaXIuY2xvc2UoKQorCisgICAgICBDbG9zZSB0aGUgaXRlcmF0b3IgYW5kIGZyZWUgYWNxdWlyZWQgcmVzb3VyY2VzLgorCisgICAgICBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCBvciBnYXJiYWdlCisgICAgICBjb2xsZWN0ZWQsIG9yIHdoZW4gYW4gZXJyb3IgaGFwcGVucyBkdXJpbmcgaXRlcmF0aW5nLiAgSG93ZXZlciBpdAorICAgICAgaXMgYWR2aXNhYmxlIHRvIGNhbGwgaXQgZXhwbGljaXRseSBvciB1c2UgdGhlIDprZXl3b3JkOmB3aXRoYAorICAgICAgc3RhdGVtZW50LgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgc2ltcGxlIHVzZSBvZiA6ZnVuYzpgc2NhbmRpcmAgdG8gZGlzcGxheSBhbGwKICAgIHRoZSBmaWxlcyAoZXhjbHVkaW5nIGRpcmVjdG9yaWVzKSBpbiB0aGUgZ2l2ZW4gKnBhdGgqIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aAogICAgYGAnLidgYC4gVGhlIGBgZW50cnkuaXNfZmlsZSgpYGAgY2FsbCB3aWxsIGdlbmVyYWxseSBub3QgbWFrZSBhbiBhZGRpdGlvbmFsCiAgICBzeXN0ZW0gY2FsbDo6CiAKLSAgICAgIGZvciBlbnRyeSBpbiBvcy5zY2FuZGlyKHBhdGgpOgotICAgICAgICAgaWYgbm90IGVudHJ5Lm5hbWUuc3RhcnRzd2l0aCgnLicpIGFuZCBlbnRyeS5pc19maWxlKCk6Ci0gICAgICAgICAgICAgcHJpbnQoZW50cnkubmFtZSkKKyAgICAgIHdpdGggb3Muc2NhbmRpcihwYXRoKSBhcyBpdDoKKyAgICAgICAgICBmb3IgZW50cnkgaW4gaXQ6CisgICAgICAgICAgICAgIGlmIG5vdCBlbnRyeS5uYW1lLnN0YXJ0c3dpdGgoJy4nKSBhbmQgZW50cnkuaXNfZmlsZSgpOgorICAgICAgICAgICAgICAgICAgcHJpbnQoZW50cnkubmFtZSkKIAogICAgLi4gbm90ZTo6CiAKQEAgLTE5MjcsNiArMjA1NywxNCBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKIAorICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgOnRlcm06YGNvbnRleHQgbWFuYWdlcmAgcHJvdG9jb2wgYW5kIHRoZQorICAgICAgOmZ1bmM6YH5zY2FuZGlyLmNsb3NlKClgIG1ldGhvZC4gIElmIGEgOmZ1bmM6YHNjYW5kaXJgIGl0ZXJhdG9yIGlzIG5laXRoZXIKKyAgICAgIGV4aGF1c3RlZCBub3IgZXhwbGljaXRseSBjbG9zZWQgYSA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgIHdpbGwgYmUgZW1pdHRlZAorICAgICAgaW4gaXRzIGRlc3RydWN0b3IuCisKKyAgICAgIFRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGNsYXNzOjogRGlyRW50cnkKIApAQCAtMTkzNSwxOSArMjA3MywyMiBAQAogCiAgICA6ZnVuYzpgc2NhbmRpcmAgd2lsbCBwcm92aWRlIGFzIG11Y2ggb2YgdGhpcyBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSB3aXRob3V0CiAgICBtYWtpbmcgYWRkaXRpb25hbCBzeXN0ZW0gY2FsbHMuIFdoZW4gYSBgYHN0YXQoKWBgIG9yIGBgbHN0YXQoKWBgIHN5c3RlbSBjYWxsCi0gICBpcyBtYWRlLCB0aGUgYGBEaXJFbnRyeWBgIG9iamVjdCB3aWxsIGNhY2hlIHRoZSByZXN1bHQuCisgICBpcyBtYWRlLCB0aGUgYGBvcy5EaXJFbnRyeWBgIG9iamVjdCB3aWxsIGNhY2hlIHRoZSByZXN1bHQuCiAKLSAgIGBgRGlyRW50cnlgYCBpbnN0YW5jZXMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzdG9yZWQgaW4gbG9uZy1saXZlZCBkYXRhCisgICBgYG9zLkRpckVudHJ5YGAgaW5zdGFuY2VzIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgc3RvcmVkIGluIGxvbmctbGl2ZWQgZGF0YQogICAgc3RydWN0dXJlczsgaWYgeW91IGtub3cgdGhlIGZpbGUgbWV0YWRhdGEgaGFzIGNoYW5nZWQgb3IgaWYgYSBsb25nIHRpbWUgaGFzCiAgICBlbGFwc2VkIHNpbmNlIGNhbGxpbmcgOmZ1bmM6YHNjYW5kaXJgLCBjYWxsIGBgb3Muc3RhdChlbnRyeS5wYXRoKWBgIHRvIGZldGNoCiAgICB1cC10by1kYXRlIGluZm9ybWF0aW9uLgogCi0gICBCZWNhdXNlIHRoZSBgYERpckVudHJ5YGAgbWV0aG9kcyBjYW4gbWFrZSBvcGVyYXRpbmcgc3lzdGVtIGNhbGxzLCB0aGV5IG1heQorICAgQmVjYXVzZSB0aGUgYGBvcy5EaXJFbnRyeWBgIG1ldGhvZHMgY2FuIG1ha2Ugb3BlcmF0aW5nIHN5c3RlbSBjYWxscywgdGhleSBtYXkKICAgIGFsc28gcmFpc2UgOmV4YzpgT1NFcnJvcmAuIElmIHlvdSBuZWVkIHZlcnkgZmluZS1ncmFpbmVkCiAgICBjb250cm9sIG92ZXIgZXJyb3JzLCB5b3UgY2FuIGNhdGNoIDpleGM6YE9TRXJyb3JgIHdoZW4gY2FsbGluZyBvbmUgb2YgdGhlCi0gICBgYERpckVudHJ5YGAgbWV0aG9kcyBhbmQgaGFuZGxlIGFzIGFwcHJvcHJpYXRlLgorICAgYGBvcy5EaXJFbnRyeWBgIG1ldGhvZHMgYW5kIGhhbmRsZSBhcyBhcHByb3ByaWF0ZS4KIAotICAgQXR0cmlidXRlcyBhbmQgbWV0aG9kcyBvbiBhIGBgRGlyRW50cnlgYCBpbnN0YW5jZSBhcmUgYXMgZm9sbG93czoKKyAgIFRvIGJlIGRpcmVjdGx5IHVzYWJsZSBhcyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YCwgYGBvcy5EaXJFbnRyeWBgCisgICBpbXBsZW1lbnRzIHRoZSA6Y2xhc3M6YFBhdGhMaWtlYCBpbnRlcmZhY2UuCisKKyAgIEF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgb24gYSBgYG9zLkRpckVudHJ5YGAgaW5zdGFuY2UgYXJlIGFzIGZvbGxvd3M6CiAKICAgIC4uIGF0dHJpYnV0ZTo6IG5hbWUKIApAQCAtMTk3Myw4ICsyMTE0LDkgQEAKIAogICAgICAgUmV0dXJuIHRoZSBpbm9kZSBudW1iZXIgb2YgdGhlIGVudHJ5LgogCi0gICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBEaXJFbnRyeWBgIG9iamVjdC4gVXNlIGBgb3Muc3RhdChlbnRyeS5wYXRoLAotICAgICAgZm9sbG93X3N5bWxpbmtzPUZhbHNlKS5zdF9pbm9gYCB0byBmZXRjaCB1cC10by1kYXRlIGluZm9ybWF0aW9uLgorICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgb3MuRGlyRW50cnlgYCBvYmplY3QuIFVzZQorICAgICAgYGBvcy5zdGF0KGVudHJ5LnBhdGgsIGZvbGxvd19zeW1saW5rcz1GYWxzZSkuc3RfaW5vYGAgdG8gZmV0Y2ggdXAtdG8tZGF0ZQorICAgICAgaW5mb3JtYXRpb24uCiAKICAgICAgIE9uIHRoZSBmaXJzdCwgdW5jYWNoZWQgY2FsbCwgYSBzeXN0ZW0gY2FsbCBpcyByZXF1aXJlZCBvbiBXaW5kb3dzIGJ1dAogICAgICAgbm90IG9uIFVuaXguCkBAIC0xOTg5LDcgKzIxMzEsNyBAQAogICAgICAgaXMgYSBkaXJlY3RvcnkgKHdpdGhvdXQgZm9sbG93aW5nIHN5bWxpbmtzKTsgcmV0dXJuIGBgRmFsc2VgYCBpZiB0aGUKICAgICAgIGVudHJ5IGlzIGFueSBvdGhlciBraW5kIG9mIGZpbGUgb3IgaWYgaXQgZG9lc24ndCBleGlzdCBhbnltb3JlLgogCi0gICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBEaXJFbnRyeWBgIG9iamVjdCwgd2l0aCBhIHNlcGFyYXRlIGNhY2hlCisgICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBvcy5EaXJFbnRyeWBgIG9iamVjdCwgd2l0aCBhIHNlcGFyYXRlIGNhY2hlCiAgICAgICBmb3IgKmZvbGxvd19zeW1saW5rcyogYGBUcnVlYGAgYW5kIGBgRmFsc2VgYC4gQ2FsbCA6ZnVuYzpgb3Muc3RhdGAgYWxvbmcKICAgICAgIHdpdGggOmZ1bmM6YHN0YXQuU19JU0RJUmAgdG8gZmV0Y2ggdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbi4KIApAQCAtMjAxMyw4ICsyMTU1LDggQEAKICAgICAgIGlzIGEgZmlsZSAod2l0aG91dCBmb2xsb3dpbmcgc3ltbGlua3MpOyByZXR1cm4gYGBGYWxzZWBgIGlmIHRoZSBlbnRyeSBpcwogICAgICAgYSBkaXJlY3Rvcnkgb3Igb3RoZXIgbm9uLWZpbGUgZW50cnksIG9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW55bW9yZS4KIAotICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgRGlyRW50cnlgYCBvYmplY3QuIENhY2hpbmcsIHN5c3RlbSBjYWxscwotICAgICAgbWFkZSwgYW5kIGV4Y2VwdGlvbnMgcmFpc2VkIGFyZSBhcyBwZXIgOmZ1bmM6YH5EaXJFbnRyeS5pc19kaXJgLgorICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgb3MuRGlyRW50cnlgYCBvYmplY3QuIENhY2hpbmcsIHN5c3RlbSBjYWxscworICAgICAgbWFkZSwgYW5kIGV4Y2VwdGlvbnMgcmFpc2VkIGFyZSBhcyBwZXIgOmZ1bmM6YH5vcy5EaXJFbnRyeS5pc19kaXJgLgogCiAgICAuLiBtZXRob2Q6OiBpc19zeW1saW5rKCkKIApAQCAtMjAyMiw3ICsyMTY0LDcgQEAKICAgICAgIHJldHVybiBgYEZhbHNlYGAgaWYgdGhlIGVudHJ5IHBvaW50cyB0byBhIGRpcmVjdG9yeSBvciBhbnkga2luZCBvZiBmaWxlLAogICAgICAgb3IgaWYgaXQgZG9lc24ndCBleGlzdCBhbnltb3JlLgogCi0gICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBEaXJFbnRyeWBgIG9iamVjdC4gQ2FsbAorICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgb3MuRGlyRW50cnlgYCBvYmplY3QuIENhbGwKICAgICAgIDpmdW5jOmBvcy5wYXRoLmlzbGlua2AgdG8gZmV0Y2ggdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbi4KIAogICAgICAgT24gdGhlIGZpcnN0LCB1bmNhY2hlZCBjYWxsLCBubyBzeXN0ZW0gY2FsbCBpcyByZXF1aXJlZCBpbiBtb3N0IGNhc2VzLgpAQCAtMjA0NywyMyArMjE4OSwyOCBAQAogICAgICAgOmNsYXNzOmBzdGF0X3Jlc3VsdGAgYXJlIGFsd2F5cyBzZXQgdG8gemVyby4gQ2FsbCA6ZnVuYzpgb3Muc3RhdGAgdG8KICAgICAgIGdldCB0aGVzZSBhdHRyaWJ1dGVzLgogCi0gICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBEaXJFbnRyeWBgIG9iamVjdCwgd2l0aCBhIHNlcGFyYXRlIGNhY2hlCisgICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBvcy5EaXJFbnRyeWBgIG9iamVjdCwgd2l0aCBhIHNlcGFyYXRlIGNhY2hlCiAgICAgICBmb3IgKmZvbGxvd19zeW1saW5rcyogYGBUcnVlYGAgYW5kIGBgRmFsc2VgYC4gQ2FsbCA6ZnVuYzpgb3Muc3RhdGAgdG8KICAgICAgIGZldGNoIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24uCiAKICAgIE5vdGUgdGhhdCB0aGVyZSBpcyBhIG5pY2UgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBzZXZlcmFsIGF0dHJpYnV0ZXMKLSAgIGFuZCBtZXRob2RzIG9mIGBgRGlyRW50cnlgYCBhbmQgb2YgOmNsYXNzOmBwYXRobGliLlBhdGhgLiAgSW4KLSAgIHBhcnRpY3VsYXIsIHRoZSBgYG5hbWVgYCBhdHRyaWJ1dGUgaGFzIHRoZSBzYW1lIG1lYW5pbmcsIGFzIGRvIHRoZQotICAgYGBpc19kaXIoKWBgLCBgYGlzX2ZpbGUoKWBgLCBgYGlzX3N5bWxpbmsoKWBgIGFuZCBgYHN0YXQoKWBgIG1ldGhvZHMuCisgICBhbmQgbWV0aG9kcyBvZiBgYG9zLkRpckVudHJ5YGAgYW5kIG9mIDpjbGFzczpgcGF0aGxpYi5QYXRoYC4gIEluCisgICBwYXJ0aWN1bGFyLCB0aGUgYGBuYW1lYGAgYXR0cmlidXRlIGhhcyB0aGUgc2FtZQorICAgbWVhbmluZywgYXMgZG8gdGhlIGBgaXNfZGlyKClgYCwgYGBpc19maWxlKClgYCwgYGBpc19zeW1saW5rKClgYAorICAgYW5kIGBgc3RhdCgpYGAgbWV0aG9kcy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgOmNsYXNzOmB+b3MuUGF0aExpa2VgIGludGVyZmFjZS4KKwogCiAuLiBmdW5jdGlvbjo6IHN0YXQocGF0aCwgXCosIGRpcl9mZD1Ob25lLCBmb2xsb3dfc3ltbGlua3M9VHJ1ZSkKIAogICAgR2V0IHRoZSBzdGF0dXMgb2YgYSBmaWxlIG9yIGEgZmlsZSBkZXNjcmlwdG9yLiBQZXJmb3JtIHRoZSBlcXVpdmFsZW50IG9mIGEKICAgIDpjOmZ1bmM6YHN0YXRgIHN5c3RlbSBjYWxsIG9uIHRoZSBnaXZlbiBwYXRoLiAqcGF0aCogbWF5IGJlIHNwZWNpZmllZCBhcwotICAgZWl0aGVyIGEgc3RyaW5nIG9yIGFzIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yLiBSZXR1cm4gYSA6Y2xhc3M6YHN0YXRfcmVzdWx0YAorICAgZWl0aGVyIGEgc3RyaW5nIC0tIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB0aGUgOmNsYXNzOmBQYXRoTGlrZWAKKyAgIGludGVyZmFjZSAtLSBvciBhcyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvci4gUmV0dXJuIGEgOmNsYXNzOmBzdGF0X3Jlc3VsdGAKICAgIG9iamVjdC4KIAogICAgVGhpcyBmdW5jdGlvbiBub3JtYWxseSBmb2xsb3dzIHN5bWxpbmtzOyB0byBzdGF0IGEgc3ltbGluayBhZGQgdGhlIGFyZ3VtZW50CkBAIC0yMDkzLDYgKzIyNDAsOSBAQAogICAgICAgQWRkZWQgdGhlICpkaXJfZmQqIGFuZCAqZm9sbG93X3N5bWxpbmtzKiBhcmd1bWVudHMsIHNwZWNpZnlpbmcgYSBmaWxlCiAgICAgICBkZXNjcmlwdG9yIGluc3RlYWQgb2YgYSBwYXRoLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBjbGFzczo6IHN0YXRfcmVzdWx0CiAKQEAgLTIzMTQsMTkgKzI0NjQsMjIgQEAKIAogICAgVGhpcyBmdW5jdGlvbiBjYW4gc3VwcG9ydCA6cmVmOmBzcGVjaWZ5aW5nIGEgZmlsZSBkZXNjcmlwdG9yIDxwYXRoX2ZkPmAuCiAKKyAgIEF2YWlsYWJpbGl0eTogVW5peC4KKwogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjIKICAgICAgIFRoZSA6Y29uc3Q6YFNUX1JET05MWWAgYW5kIDpjb25zdDpgU1RfTk9TVUlEYCBjb25zdGFudHMgd2VyZSBhZGRlZC4KIAorICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCisgICAgICBBZGRlZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIGZvciAqcGF0aCouCisKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy40CiAgICAgICBUaGUgOmNvbnN0OmBTVF9OT0RFVmAsIDpjb25zdDpgU1RfTk9FWEVDYCwgOmNvbnN0OmBTVF9TWU5DSFJPTk9VU2AsCiAgICAgICA6Y29uc3Q6YFNUX01BTkRMT0NLYCwgOmNvbnN0OmBTVF9XUklURWAsIDpjb25zdDpgU1RfQVBQRU5EYCwKICAgICAgIDpjb25zdDpgU1RfSU1NVVRBQkxFYCwgOmNvbnN0OmBTVF9OT0FUSU1FYCwgOmNvbnN0OmBTVF9OT0RJUkFUSU1FYCwKICAgICAgIGFuZCA6Y29uc3Q6YFNUX1JFTEFUSU1FYCBjb25zdGFudHMgd2VyZSBhZGRlZC4KIAotICAgQXZhaWxhYmlsaXR5OiBVbml4LgotCi0gICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKLSAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgZm9yICpwYXRoKi4KKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgogCiAKIC4uIGRhdGE6OiBzdXBwb3J0c19kaXJfZmQKQEAgLTI0NDcsNiArMjYwMCw5IEBACiAgICAgICBBZGRlZCB0aGUgKmRpcl9mZCogYXJndW1lbnQsIGFuZCBub3cgYWxsb3cgKnRhcmdldF9pc19kaXJlY3RvcnkqCiAgICAgICBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgIGZvciAqc3JjKiBhbmQgKmRzdCouCisKIAogLi4gZnVuY3Rpb246OiBzeW5jKCkKIApAQCAtMjQ3MSw2ICsyNjI3LDEwIEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQogICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgV2luZG93cwogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKworCiAuLiBmdW5jdGlvbjo6IHVubGluayhwYXRoLCAqLCBkaXJfZmQ9Tm9uZSkKIAogICAgUmVtb3ZlIChkZWxldGUpIHRoZSBmaWxlICpwYXRoKi4gIFRoaXMgZnVuY3Rpb24gaXMgc2VtYW50aWNhbGx5CkBAIC0yNDgxLDYgKzI2NDEsOSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAgICAgICBUaGUgKmRpcl9mZCogcGFyYW1ldGVyLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHV0aW1lKHBhdGgsIHRpbWVzPU5vbmUsICpbLCBuc10sIGRpcl9mZD1Ob25lLCBmb2xsb3dfc3ltbGlua3M9VHJ1ZSkKIApAQCAtMjUxOCw2ICsyNjgxLDkgQEAKICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgZm9yICpwYXRoKiwKICAgICAgIGFuZCB0aGUgKmRpcl9mZCosICpmb2xsb3dfc3ltbGlua3MqLCBhbmQgKm5zKiBwYXJhbWV0ZXJzLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHdhbGsodG9wLCB0b3Bkb3duPVRydWUsIG9uZXJyb3I9Tm9uZSwgZm9sbG93bGlua3M9RmFsc2UpCiAKQEAgLTI2MDgsNiArMjc3NCw5IEBACiAgICAgICBUaGlzIGZ1bmN0aW9uIG5vdyBjYWxscyA6ZnVuYzpgb3Muc2NhbmRpcmAgaW5zdGVhZCBvZiA6ZnVuYzpgb3MubGlzdGRpcmAsCiAgICAgICBtYWtpbmcgaXQgZmFzdGVyIGJ5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gOmZ1bmM6YG9zLnN0YXRgLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGZ3YWxrKHRvcD0nLicsIHRvcGRvd249VHJ1ZSwgb25lcnJvcj1Ob25lLCAqLCBmb2xsb3dfc3ltbGlua3M9RmFsc2UsIGRpcl9mZD1Ob25lKQogCkBAIC0yNjY0LDYgKzI4MzMsOSBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogTGludXggZXh0ZW5kZWQgYXR0cmlidXRlcwogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpAQCAtMjY3NSwxMiArMjg0NywxNiBAQAogLi4gZnVuY3Rpb246OiBnZXR4YXR0cihwYXRoLCBhdHRyaWJ1dGUsICosIGZvbGxvd19zeW1saW5rcz1UcnVlKQogCiAgICBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBmaWxlc3lzdGVtIGF0dHJpYnV0ZSAqYXR0cmlidXRlKiBmb3IKLSAgICpwYXRoKi4gKmF0dHJpYnV0ZSogY2FuIGJlIGJ5dGVzIG9yIHN0ci4gSWYgaXQgaXMgc3RyLCBpdCBpcyBlbmNvZGVkCi0gICB3aXRoIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nLgorICAgKnBhdGgqLiAqYXR0cmlidXRlKiBjYW4gYmUgYnl0ZXMgb3Igc3RyIChkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggdGhlCisgICA6Y2xhc3M6YFBhdGhMaWtlYCBpbnRlcmZhY2UpLiBJZiBpdCBpcyBzdHIsIGl0IGlzIGVuY29kZWQgd2l0aCB0aGUgZmlsZXN5c3RlbQorICAgZW5jb2RpbmcuCiAKICAgIFRoaXMgZnVuY3Rpb24gY2FuIHN1cHBvcnQgOnJlZjpgc3BlY2lmeWluZyBhIGZpbGUgZGVzY3JpcHRvciA8cGF0aF9mZD5gIGFuZAogICAgOnJlZjpgbm90IGZvbGxvd2luZyBzeW1saW5rcyA8Zm9sbG93X3N5bWxpbmtzPmAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgIGZwciAqcGF0aCogYW5kICphdHRyaWJ1dGUqLgorCiAKIC4uIGZ1bmN0aW9uOjogbGlzdHhhdHRyKHBhdGg9Tm9uZSwgKiwgZm9sbG93X3N5bWxpbmtzPVRydWUpCiAKQEAgLTI2OTIsMjEgKzI4NjgsMjkgQEAKICAgIFRoaXMgZnVuY3Rpb24gY2FuIHN1cHBvcnQgOnJlZjpgc3BlY2lmeWluZyBhIGZpbGUgZGVzY3JpcHRvciA8cGF0aF9mZD5gIGFuZAogICAgOnJlZjpgbm90IGZvbGxvd2luZyBzeW1saW5rcyA8Zm9sbG93X3N5bWxpbmtzPmAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogcmVtb3ZleGF0dHIocGF0aCwgYXR0cmlidXRlLCAqLCBmb2xsb3dfc3ltbGlua3M9VHJ1ZSkKIAogICAgUmVtb3ZlcyB0aGUgZXh0ZW5kZWQgZmlsZXN5c3RlbSBhdHRyaWJ1dGUgKmF0dHJpYnV0ZSogZnJvbSAqcGF0aCouCi0gICAqYXR0cmlidXRlKiBzaG91bGQgYmUgYnl0ZXMgb3Igc3RyLiBJZiBpdCBpcyBhIHN0cmluZywgaXQgaXMgZW5jb2RlZAorICAgKmF0dHJpYnV0ZSogc2hvdWxkIGJlIGJ5dGVzIG9yIHN0ciAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHRoZQorICAgOmNsYXNzOmBQYXRoTGlrZWAgaW50ZXJmYWNlKS4gSWYgaXQgaXMgYSBzdHJpbmcsIGl0IGlzIGVuY29kZWQKICAgIHdpdGggdGhlIGZpbGVzeXN0ZW0gZW5jb2RpbmcuCiAKICAgIFRoaXMgZnVuY3Rpb24gY2FuIHN1cHBvcnQgOnJlZjpgc3BlY2lmeWluZyBhIGZpbGUgZGVzY3JpcHRvciA8cGF0aF9mZD5gIGFuZAogICAgOnJlZjpgbm90IGZvbGxvd2luZyBzeW1saW5rcyA8Zm9sbG93X3N5bWxpbmtzPmAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgIGZvciAqcGF0aCogYW5kICphdHRyaWJ1dGUqLgorCiAKIC4uIGZ1bmN0aW9uOjogc2V0eGF0dHIocGF0aCwgYXR0cmlidXRlLCB2YWx1ZSwgZmxhZ3M9MCwgKiwgZm9sbG93X3N5bWxpbmtzPVRydWUpCiAKICAgIFNldCB0aGUgZXh0ZW5kZWQgZmlsZXN5c3RlbSBhdHRyaWJ1dGUgKmF0dHJpYnV0ZSogb24gKnBhdGgqIHRvICp2YWx1ZSouCi0gICAqYXR0cmlidXRlKiBtdXN0IGJlIGEgYnl0ZXMgb3Igc3RyIHdpdGggbm8gZW1iZWRkZWQgTlVMcy4gSWYgaXQgaXMgYSBzdHIsCisgICAqYXR0cmlidXRlKiBtdXN0IGJlIGEgYnl0ZXMgb3Igc3RyIHdpdGggbm8gZW1iZWRkZWQgTlVMcyAoZGlyZWN0bHkgb3IKKyAgIGluZGlyZWN0bHkgdGhyb3VnaCB0aGUgOmNsYXNzOmBQYXRoTGlrZWAgaW50ZXJmYWNlKS4gSWYgaXQgaXMgYSBzdHIsCiAgICBpdCBpcyBlbmNvZGVkIHdpdGggdGhlIGZpbGVzeXN0ZW0gZW5jb2RpbmcuICAqZmxhZ3MqIG1heSBiZQogICAgOmRhdGE6YFhBVFRSX1JFUExBQ0VgIG9yIDpkYXRhOmBYQVRUUl9DUkVBVEVgLiBJZiA6ZGF0YTpgWEFUVFJfUkVQTEFDRWAgaXMKICAgIGdpdmVuIGFuZCB0aGUgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0LCBgYEVFWElTVFNgYCB3aWxsIGJlIHJhaXNlZC4KQEAgLTI3MjEsNiArMjkwNSw5IEBACiAgICAgICBBIGJ1ZyBpbiBMaW51eCBrZXJuZWwgdmVyc2lvbnMgbGVzcyB0aGFuIDIuNi4zOSBjYXVzZWQgdGhlIGZsYWdzIGFyZ3VtZW50CiAgICAgICB0byBiZSBpZ25vcmVkIG9uIHNvbWUgZmlsZXN5c3RlbXMuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgIGZvciAqcGF0aCogYW5kICphdHRyaWJ1dGUqLgorCiAKIC4uIGRhdGE6OiBYQVRUUl9TSVpFX01BWAogCkBAIC0yODIyLDYgKzMwMDksOSBAQAogICAgICAgQWRkZWQgc3VwcG9ydCBmb3Igc3BlY2lmeWluZyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBmb3IgKnBhdGgqCiAgICAgICBmb3IgOmZ1bmM6YGV4ZWN2ZWAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAuLiBmdW5jdGlvbjo6IF9leGl0KG4pCiAKICAgIEV4aXQgdGhlIHByb2Nlc3Mgd2l0aCBzdGF0dXMgKm4qLCB3aXRob3V0IGNhbGxpbmcgY2xlYW51cCBoYW5kbGVycywgZmx1c2hpbmcKQEAgLTMxMzIsNiArMzMyMiw5IEBACiAgICA6ZnVuYzpgc3Bhd252ZWAgYXJlIG5vdCB0aHJlYWQtc2FmZSBvbiBXaW5kb3dzOyB3ZSBhZHZpc2UgeW91IHRvIHVzZSB0aGUKICAgIDptb2Q6YHN1YnByb2Nlc3NgIG1vZHVsZSBpbnN0ZWFkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBkYXRhOjogUF9OT1dBSVQKICAgICAgICAgICBQX05PV0FJVE8KQEAgLTM2MTgsNiArMzgxMSwxMSBAQAogCiAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW0uIFJldHVybnMgTm9uZSBpZiB1bmRldGVybWluZWQuCiAKKyAgIFRoaXMgbnVtYmVyIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBudW1iZXIgb2YgQ1BVcyB0aGUgY3VycmVudCBwcm9jZXNzIGNhbgorICAgdXNlLiAgVGhlIG51bWJlciBvZiB1c2FibGUgQ1BVcyBjYW4gYmUgb2J0YWluZWQgd2l0aAorICAgYGBsZW4ob3Muc2NoZWRfZ2V0YWZmaW5pdHkoMCkpYGAKKworCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIAogCkBAIC0zNzMzLDM1ICszOTMxLDg5IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogCi0uLiBfb3MtbWlzY2Z1bmM6CiAKLU1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmFuZG9tIG51bWJlcnMKKy0tLS0tLS0tLS0tLS0tCiAKIAotLi4gZnVuY3Rpb246OiB1cmFuZG9tKG4pCisuLiBmdW5jdGlvbjo6IGdldHJhbmRvbShzaXplLCBmbGFncz0wKQogCi0gICBSZXR1cm4gYSBzdHJpbmcgb2YgKm4qIHJhbmRvbSBieXRlcyBzdWl0YWJsZSBmb3IgY3J5cHRvZ3JhcGhpYyB1c2UuCisgICBHZXQgdXAgdG8gKnNpemUqIHJhbmRvbSBieXRlcy4gVGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gbGVzcyBieXRlcyB0aGFuCisgICByZXF1ZXN0ZWQuCisKKyAgIFRoZXNlIGJ5dGVzIGNhbiBiZSB1c2VkIHRvIHNlZWQgdXNlci1zcGFjZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgb3IgZm9yCisgICBjcnlwdG9ncmFwaGljIHB1cnBvc2VzLgorCisgICBgYGdldHJhbmRvbSgpYGAgcmVsaWVzIG9uIGVudHJvcHkgZ2F0aGVyZWQgZnJvbSBkZXZpY2UgZHJpdmVycyBhbmQgb3RoZXIKKyAgIHNvdXJjZXMgb2YgZW52aXJvbm1lbnRhbCBub2lzZS4gVW5uZWNlc3NhcmlseSByZWFkaW5nIGxhcmdlIHF1YW50aXRpZXMgb2YKKyAgIGRhdGEgd2lsbCBoYXZlIGEgbmVnYXRpdmUgaW1wYWN0IG9uICBvdGhlciB1c2VycyAgb2YgdGhlIGBgL2Rldi9yYW5kb21gYCBhbmQKKyAgIGBgL2Rldi91cmFuZG9tYGAgZGV2aWNlcy4KKworICAgVGhlIGZsYWdzIGFyZ3VtZW50IGlzIGEgYml0IG1hc2sgdGhhdCBjYW4gY29udGFpbiB6ZXJvIG9yIG1vcmUgb2YgdGhlCisgICBmb2xsb3dpbmcgdmFsdWVzIE9SZWQgdG9nZXRoZXI6IDpweTpkYXRhOmBvcy5HUk5EX1JBTkRPTWAgYW5kCisgICA6cHk6ZGF0YTpgR1JORF9OT05CTE9DS2AuCisKKyAgIFNlZSBhbHNvIHRoZSBgTGludXggZ2V0cmFuZG9tKCkgbWFudWFsIHBhZ2UKKyAgIDxodHRwOi8vbWFuNy5vcmcvbGludXgvbWFuLXBhZ2VzL21hbjIvZ2V0cmFuZG9tLjIuaHRtbD5gXy4KKworICAgQXZhaWxhYmlsaXR5OiBMaW51eCAzLjE3IGFuZCBuZXdlci4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKy4uIGZ1bmN0aW9uOjogdXJhbmRvbShzaXplKQorCisgICBSZXR1cm4gYSBzdHJpbmcgb2YgKnNpemUqIHJhbmRvbSBieXRlcyBzdWl0YWJsZSBmb3IgY3J5cHRvZ3JhcGhpYyB1c2UuCiAKICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByYW5kb20gYnl0ZXMgZnJvbSBhbiBPUy1zcGVjaWZpYyByYW5kb21uZXNzIHNvdXJjZS4gIFRoZQogICAgcmV0dXJuZWQgZGF0YSBzaG91bGQgYmUgdW5wcmVkaWN0YWJsZSBlbm91Z2ggZm9yIGNyeXB0b2dyYXBoaWMgYXBwbGljYXRpb25zLAogICAgdGhvdWdoIGl0cyBleGFjdCBxdWFsaXR5IGRlcGVuZHMgb24gdGhlIE9TIGltcGxlbWVudGF0aW9uLgogCi0gICBPbiBMaW51eCwgYGBnZXRyYW5kb20oKWBgIHN5c2NhbGwgaXMgdXNlZCBpZiBhdmFpbGFibGUgYW5kIHRoZSB1cmFuZG9tCi0gICBlbnRyb3B5IHBvb2wgaXMgaW5pdGlhbGl6ZWQgKGBgZ2V0cmFuZG9tKClgYCBkb2VzIG5vdCBibG9jaykuCi0gICBPbiBhIFVuaXgtbGlrZSBzeXN0ZW0gdGhpcyB3aWxsIHF1ZXJ5IGBgL2Rldi91cmFuZG9tYGAuIE9uIFdpbmRvd3MsIGl0Ci0gICB3aWxsIHVzZSBgYENyeXB0R2VuUmFuZG9tKClgYC4gIElmIGEgcmFuZG9tbmVzcyBzb3VyY2UgaXMgbm90IGZvdW5kLAotICAgOmV4YzpgTm90SW1wbGVtZW50ZWRFcnJvcmAgd2lsbCBiZSByYWlzZWQuCisgICBPbiBMaW51eCwgaWYgdGhlIGBgZ2V0cmFuZG9tKClgYCBzeXNjYWxsIGlzIGF2YWlsYWJsZSwgaXQgaXMgdXNlZCBpbgorICAgYmxvY2tpbmcgbW9kZTogYmxvY2sgdW50aWwgdGhlIHN5c3RlbSB1cmFuZG9tIGVudHJvcHkgcG9vbCBpcyBpbml0aWFsaXplZAorICAgKDEyOCBiaXRzIG9mIGVudHJvcHkgYXJlIGNvbGxlY3RlZCBieSB0aGUga2VybmVsKS4gU2VlIHRoZSA6cGVwOmA1MjRgIGZvcgorICAgdGhlIHJhdGlvbmFsZS4gT24gTGludXgsIHRoZSA6ZnVuYzpgZ2V0cmFuZG9tYCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBnZXQKKyAgIHJhbmRvbSBieXRlcyBpbiBub24tYmxvY2tpbmcgbW9kZSAodXNpbmcgdGhlIDpkYXRhOmBHUk5EX05PTkJMT0NLYCBmbGFnKSBvcgorICAgdG8gcG9sbCB1bnRpbCB0aGUgc3lzdGVtIHVyYW5kb20gZW50cm9weSBwb29sIGlzIGluaXRpYWxpemVkLgogCi0gICBGb3IgYW4gZWFzeS10by11c2UgaW50ZXJmYWNlIHRvIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgotICAgcHJvdmlkZWQgYnkgeW91ciBwbGF0Zm9ybSwgcGxlYXNlIHNlZSA6Y2xhc3M6YHJhbmRvbS5TeXN0ZW1SYW5kb21gLgorICAgT24gYSBVbml4LWxpa2Ugc3lzdGVtLCByYW5kb20gYnl0ZXMgYXJlIHJlYWQgZnJvbSB0aGUgYGAvZGV2L3VyYW5kb21gYAorICAgZGV2aWNlLiBJZiB0aGUgYGAvZGV2L3VyYW5kb21gYCBkZXZpY2UgaXMgbm90IGF2YWlsYWJsZSBvciBub3QgcmVhZGFibGUsIHRoZQorICAgOmV4YzpgTm90SW1wbGVtZW50ZWRFcnJvcmAgZXhjZXB0aW9uIGlzIHJhaXNlZC4KKworICAgT24gV2luZG93cywgaXQgd2lsbCB1c2UgYGBDcnlwdEdlblJhbmRvbSgpYGAuCisKKyAgIC4uIHNlZWFsc286OgorICAgICAgVGhlIDptb2Q6YHNlY3JldHNgIG1vZHVsZSBwcm92aWRlcyBoaWdoZXIgbGV2ZWwgZnVuY3Rpb25zLiBGb3IgYW4KKyAgICAgIGVhc3ktdG8tdXNlIGludGVyZmFjZSB0byB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgcHJvdmlkZWQgYnkgeW91cgorICAgICAgcGxhdGZvcm0sIHBsZWFzZSBzZWUgOmNsYXNzOmByYW5kb20uU3lzdGVtUmFuZG9tYC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYuMAorICAgICAgT24gTGludXgsIGBgZ2V0cmFuZG9tKClgYCBpcyBub3cgdXNlZCBpbiBibG9ja2luZyBtb2RlIHRvIGluY3JlYXNlIHRoZQorICAgICAgc2VjdXJpdHkuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41LjIKLSAgICAgIE9uIExpbnV4LCBpZiBgYGdldHJhbmRvbSgpYGAgYmxvY2tzICh0aGUgdXJhbmRvbSBlbnRyb3B5IHBvb2wgaXMgbm90Ci0gICAgICBpbml0aWFsaXplZCB5ZXQpLCBmYWxsIGJhY2sgb24gcmVhZGluZyBgYC9kZXYvdXJhbmRvbWBgLgorICAgICAgT24gTGludXgsIGlmIHRoZSBgYGdldHJhbmRvbSgpYGAgc3lzY2FsbCBibG9ja3MgKHRoZSB1cmFuZG9tIGVudHJvcHkgcG9vbAorICAgICAgaXMgbm90IGluaXRpYWxpemVkIHlldCksIGZhbGwgYmFjayBvbiByZWFkaW5nIGBgL2Rldi91cmFuZG9tYGAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAgICAgICBPbiBMaW51eCAzLjE3IGFuZCBuZXdlciwgdGhlIGBgZ2V0cmFuZG9tKClgYCBzeXNjYWxsIGlzIG5vdyB1c2VkCiAgICAgICB3aGVuIGF2YWlsYWJsZS4gIE9uIE9wZW5CU0QgNS42IGFuZCBuZXdlciwgdGhlIEMgYGBnZXRlbnRyb3B5KClgYAogICAgICAgZnVuY3Rpb24gaXMgbm93IHVzZWQuIFRoZXNlIGZ1bmN0aW9ucyBhdm9pZCB0aGUgdXNhZ2Ugb2YgYW4gaW50ZXJuYWwgZmlsZQogICAgICAgZGVzY3JpcHRvci4KKworLi4gZGF0YTo6IEdSTkRfTk9OQkxPQ0sKKworICAgQnkgIGRlZmF1bHQsIHdoZW4gcmVhZGluZyBmcm9tIGBgL2Rldi9yYW5kb21gYCwgOmZ1bmM6YGdldHJhbmRvbWAgYmxvY2tzIGlmCisgICBubyByYW5kb20gYnl0ZXMgYXJlIGF2YWlsYWJsZSwgYW5kIHdoZW4gcmVhZGluZyBmcm9tIGBgL2Rldi91cmFuZG9tYGAsIGl0IGJsb2NrcworICAgaWYgdGhlIGVudHJvcHkgcG9vbCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgorCisgICBJZiB0aGUgOnB5OmRhdGE6YEdSTkRfTk9OQkxPQ0tgIGZsYWcgaXMgc2V0LCB0aGVuIDpmdW5jOmBnZXRyYW5kb21gIGRvZXMgbm90CisgICBibG9jayBpbiB0aGVzZSBjYXNlcywgYnV0IGluc3RlYWQgaW1tZWRpYXRlbHkgcmFpc2VzIDpleGM6YEJsb2NraW5nSU9FcnJvcmAuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisuLiBkYXRhOjogR1JORF9SQU5ET00KKworICAgSWYgIHRoaXMgIGJpdCAgaXMgIHNldCwgIHRoZW4gIHJhbmRvbSBieXRlcyBhcmUgZHJhd24gZnJvbSB0aGUKKyAgIGBgL2Rldi9yYW5kb21gYCBwb29sIGluc3RlYWQgb2YgdGhlIGBgL2Rldi91cmFuZG9tYGAgcG9vbC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9wYXRobGliLnJzdCBiL0RvYy9saWJyYXJ5L3BhdGhsaWIucnN0CmluZGV4IDM4NDYxMWMuLjkyNTdkMmQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3BhdGhsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3BhdGhsaWIucnN0CkBAIC0zNSwxMiArMzUsNiBAQAogICAgYWNjZXNzaW5nIHRoZSBPUy4gSW4gdGhpcyBjYXNlLCBpbnN0YW50aWF0aW5nIG9uZSBvZiB0aGUgcHVyZSBjbGFzc2VzIG1heSBiZQogICAgdXNlZnVsIHNpbmNlIHRob3NlIHNpbXBseSBkb24ndCBoYXZlIGFueSBPUy1hY2Nlc3Npbmcgb3BlcmF0aW9ucy4KIAotLi4gbm90ZTo6Ci0gICBUaGlzIG1vZHVsZSBoYXMgYmVlbiBpbmNsdWRlZCBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSBvbiBhCi0gICA6dGVybTpgcHJvdmlzaW9uYWwgYmFzaXMgPHByb3Zpc2lvbmFsIHBhY2thZ2U+YC4gQmFja3dhcmRzIGluY29tcGF0aWJsZQotICAgY2hhbmdlcyAodXAgdG8gYW5kIGluY2x1ZGluZyByZW1vdmFsIG9mIHRoZSBwYWNrYWdlKSBtYXkgb2NjdXIgaWYgZGVlbWVkCi0gICBuZWNlc3NhcnkgYnkgdGhlIGNvcmUgZGV2ZWxvcGVycy4KLQogLi4gc2VlYWxzbzo6CiAgICA6cGVwOmA0MjhgOiBUaGUgcGF0aGxpYiBtb2R1bGUgLS0gb2JqZWN0LW9yaWVudGVkIGZpbGVzeXN0ZW0gcGF0aHMuCiAKQEAgLTExMSw3ICsxMDUsOCBAQAogICAgICAgUHVyZVBvc2l4UGF0aCgnc2V0dXAucHknKQogCiAgICBFYWNoIGVsZW1lbnQgb2YgKnBhdGhzZWdtZW50cyogY2FuIGJlIGVpdGhlciBhIHN0cmluZyByZXByZXNlbnRpbmcgYQotICAgcGF0aCBzZWdtZW50LCBvciBhbm90aGVyIHBhdGggb2JqZWN0OjoKKyAgIHBhdGggc2VnbWVudCwgYW4gb2JqZWN0IGltcGxlbWVudGluZyB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAgaW50ZXJmYWNlCisgICB3aGljaCByZXR1cm5zIGEgc3RyaW5nLCBvciBhbm90aGVyIHBhdGggb2JqZWN0OjoKIAogICAgICAgPj4+IFB1cmVQYXRoKCdmb28nLCAnc29tZS9wYXRoJywgJ2JhcicpCiAgICAgICBQdXJlUG9zaXhQYXRoKCdmb28vc29tZS9wYXRoL2JhcicpCkBAIC0xNTIsNiArMTQ3LDEyIEBACiAgICB0byBgYFB1cmVQb3NpeFBhdGgoJ2JhcicpYGAsIHdoaWNoIGlzIHdyb25nIGlmIGBgZm9vYGAgaXMgYSBzeW1ib2xpYyBsaW5rCiAgICB0byBhbm90aGVyIGRpcmVjdG9yeSkKIAorICAgUHVyZSBwYXRoIG9iamVjdHMgaW1wbGVtZW50IHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYCBpbnRlcmZhY2UsIGFsbG93aW5nIHRoZW0KKyAgIHRvIGJlIHVzZWQgYW55d2hlcmUgdGhlIGludGVyZmFjZSBpcyBhY2NlcHRlZC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYCBpbnRlcmZhY2UuCisKIC4uIGNsYXNzOjogUHVyZVBvc2l4UGF0aCgqcGF0aHNlZ21lbnRzKQogCiAgICBBIHN1YmNsYXNzIG9mIDpjbGFzczpgUHVyZVBhdGhgLCB0aGlzIHBhdGggZmxhdm91ciByZXByZXNlbnRzIG5vbi1XaW5kb3dzCkBAIC0xOTksNyArMjAwLDcgQEAKICAgID4+PiBQdXJlV2luZG93c1BhdGgoJ2ZvbycpIDwgUHVyZVBvc2l4UGF0aCgnZm9vJykKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KLSAgIFR5cGVFcnJvcjogdW5vcmRlcmFibGUgdHlwZXM6IFB1cmVXaW5kb3dzUGF0aCgpIDwgUHVyZVBvc2l4UGF0aCgpCisgICBUeXBlRXJyb3I6ICc8JyBub3Qgc3VwcG9ydGVkIGJldHdlZW4gaW5zdGFuY2VzIG9mICdQdXJlV2luZG93c1BhdGgnIGFuZCAnUHVyZVBvc2l4UGF0aCcKIAogCiBPcGVyYXRvcnMKQEAgLTIxNiw2ICsyMTcsMTQgQEAKICAgID4+PiAnL3VzcicgLyBxCiAgICBQdXJlUG9zaXhQYXRoKCcvdXNyL2JpbicpCiAKK0EgcGF0aCBvYmplY3QgY2FuIGJlIHVzZWQgYW55d2hlcmUgYW4gb2JqZWN0IGltcGxlbWVudGluZyA6Y2xhc3M6YG9zLlBhdGhMaWtlYAoraXMgYWNjZXB0ZWQ6OgorCisgICA+Pj4gaW1wb3J0IG9zCisgICA+Pj4gcCA9IFB1cmVQYXRoKCcvZXRjJykKKyAgID4+PiBvcy5mc3BhdGgocCkKKyAgICcvZXRjJworCiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgcGF0aCBpcyB0aGUgcmF3IGZpbGVzeXN0ZW0gcGF0aCBpdHNlbGYKIChpbiBuYXRpdmUgZm9ybSwgZS5nLiB3aXRoIGJhY2tzbGFzaGVzIHVuZGVyIFdpbmRvd3MpLCB3aGljaCB5b3UgY2FuCiBwYXNzIHRvIGFueSBmdW5jdGlvbiB0YWtpbmcgYSBmaWxlIHBhdGggYXMgYSBzdHJpbmc6OgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcGlja2xlLnJzdCBiL0RvYy9saWJyYXJ5L3BpY2tsZS5yc3QKaW5kZXggMGQ2NDE5MS4uNmU4NDMwZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcGlja2xlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9waWNrbGUucnN0CkBAIC00OTIsNyArNDkyLDcgQEAKIAogLi4gbWV0aG9kOjogb2JqZWN0Ll9fZ2V0bmV3YXJnc19leF9fKCkKIAotICAgSW4gcHJvdG9jb2xzIDQgYW5kIG5ld2VyLCBjbGFzc2VzIHRoYXQgaW1wbGVtZW50cyB0aGUKKyAgIEluIHByb3RvY29scyAyIGFuZCBuZXdlciwgY2xhc3NlcyB0aGF0IGltcGxlbWVudHMgdGhlCiAgICA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIG1ldGhvZCBjYW4gZGljdGF0ZSB0aGUgdmFsdWVzIHBhc3NlZCB0byB0aGUKICAgIDptZXRoOmBfX25ld19fYCBtZXRob2QgdXBvbiB1bnBpY2tsaW5nLiAgVGhlIG1ldGhvZCBtdXN0IHJldHVybiBhIHBhaXIKICAgIGBgKGFyZ3MsIGt3YXJncylgYCB3aGVyZSAqYXJncyogaXMgYSB0dXBsZSBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cwpAQCAtNTA0LDE1ICs1MDQsMjIgQEAKICAgIGNsYXNzIHJlcXVpcmVzIGtleXdvcmQtb25seSBhcmd1bWVudHMuICBPdGhlcndpc2UsIGl0IGlzIHJlY29tbWVuZGVkIGZvcgogICAgY29tcGF0aWJpbGl0eSB0byBpbXBsZW1lbnQgOm1ldGg6YF9fZ2V0bmV3YXJnc19fYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgaXMgbm93IHVzZWQgaW4gcHJvdG9jb2xzIDIgYW5kIDMuCisKIAogLi4gbWV0aG9kOjogb2JqZWN0Ll9fZ2V0bmV3YXJnc19fKCkKIAotICAgVGhpcyBtZXRob2Qgc2VydmUgYSBzaW1pbGFyIHB1cnBvc2UgYXMgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBidXQKLSAgIGZvciBwcm90b2NvbHMgMiBhbmQgbmV3ZXIuICBJdCBtdXN0IHJldHVybiBhIHR1cGxlIG9mIGFyZ3VtZW50cyBgYGFyZ3NgYAotICAgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIDptZXRoOmBfX25ld19fYCBtZXRob2QgdXBvbiB1bnBpY2tsaW5nLgorICAgVGhpcyBtZXRob2Qgc2VydmUgYSBzaW1pbGFyIHB1cnBvc2UgYXMgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCwgYnV0CisgICBzdXBwb3J0cyBvbmx5IHBvc2l0aW9uYWwgYXJndW1lbnRzLiAgSXQgbXVzdCByZXR1cm4gYSB0dXBsZSBvZiBhcmd1bWVudHMKKyAgIGBgYXJnc2BgIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSA6bWV0aDpgX19uZXdfX2AgbWV0aG9kIHVwb24gdW5waWNrbGluZy4KIAotICAgSW4gcHJvdG9jb2xzIDQgYW5kIG5ld2VyLCA6bWV0aDpgX19nZXRuZXdhcmdzX19gIHdpbGwgbm90IGJlIGNhbGxlZCBpZgotICAgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBpcyBkZWZpbmVkLgorICAgOm1ldGg6YF9fZ2V0bmV3YXJnc19fYCB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBpcworICAgZGVmaW5lZC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEJlZm9yZSBQeXRob24gMy42LCA6bWV0aDpgX19nZXRuZXdhcmdzX19gIHdhcyBjYWxsZWQgaW5zdGVhZCBvZgorICAgICAgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBpbiBwcm90b2NvbHMgMiBhbmQgMy4KIAogCiAuLiBtZXRob2Q6OiBvYmplY3QuX19nZXRzdGF0ZV9fKCkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3BrZ3V0aWwucnN0IGIvRG9jL2xpYnJhcnkvcGtndXRpbC5yc3QKaW5kZXggYzViYThkOC4uM2I2YzkyNSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcGtndXRpbC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcGtndXRpbC5yc3QKQEAgLTExLDYgKzExLDExIEBACiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIHRoZSBpbXBvcnQgc3lzdGVtLCBpbiBwYXJ0aWN1bGFyIHBhY2thZ2UKIHN1cHBvcnQuCiAKKy4uIGNsYXNzOjogTW9kdWxlSW5mbyhtb2R1bGVfZmluZGVyLCBuYW1lLCBpc3BrZykKKworICAgIEEgbmFtZWR0dXBsZSB0aGF0IGhvbGRzIGEgYnJpZWYgc3VtbWFyeSBvZiBhIG1vZHVsZSdzIGluZm8uCisKKyAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKIAogLi4gZnVuY3Rpb246OiBleHRlbmRfcGF0aChwYXRoLCBuYW1lKQogCkBAIC0xMzksNyArMTQ0LDcgQEAKIAogLi4gZnVuY3Rpb246OiBpdGVyX21vZHVsZXMocGF0aD1Ob25lLCBwcmVmaXg9JycpCiAKLSAgIFlpZWxkcyBgYChtb2R1bGVfZmluZGVyLCBuYW1lLCBpc3BrZylgYCBmb3IgYWxsIHN1Ym1vZHVsZXMgb24gKnBhdGgqLCBvciwgaWYKKyAgIFlpZWxkcyA6Y2xhc3M6YE1vZHVsZUluZm9gIGZvciBhbGwgc3VibW9kdWxlcyBvbiAqcGF0aCosIG9yLCBpZgogICAgKnBhdGgqIGlzIGBgTm9uZWBgLCBhbGwgdG9wLWxldmVsIG1vZHVsZXMgb24gYGBzeXMucGF0aGBgLgogCiAgICAqcGF0aCogc2hvdWxkIGJlIGVpdGhlciBgYE5vbmVgYCBvciBhIGxpc3Qgb2YgcGF0aHMgdG8gbG9vayBmb3IgbW9kdWxlcyBpbi4KQEAgLTE2MCw3ICsxNjUsNyBAQAogCiAuLiBmdW5jdGlvbjo6IHdhbGtfcGFja2FnZXMocGF0aD1Ob25lLCBwcmVmaXg9JycsIG9uZXJyb3I9Tm9uZSkKIAotICAgWWllbGRzIGBgKG1vZHVsZV9maW5kZXIsIG5hbWUsIGlzcGtnKWBgIGZvciBhbGwgbW9kdWxlcyByZWN1cnNpdmVseSBvbgorICAgWWllbGRzIDpjbGFzczpgTW9kdWxlSW5mb2AgZm9yIGFsbCBtb2R1bGVzIHJlY3Vyc2l2ZWx5IG9uCiAgICAqcGF0aCosIG9yLCBpZiAqcGF0aCogaXMgYGBOb25lYGAsIGFsbCBhY2Nlc3NpYmxlIG1vZHVsZXMuCiAKICAgICpwYXRoKiBzaG91bGQgYmUgZWl0aGVyIGBgTm9uZWBgIG9yIGEgbGlzdCBvZiBwYXRocyB0byBsb29rIGZvciBtb2R1bGVzIGluLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcXVldWUucnN0IGIvRG9jL2xpYnJhcnkvcXVldWUucnN0CmluZGV4IGY4MDM4NTIuLmM3ZGZjMzUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3F1ZXVlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9xdWV1ZS5yc3QKQEAgLTE2LDggKzE2LDkgQEAKIG1vZHVsZS4KIAogVGhlIG1vZHVsZSBpbXBsZW1lbnRzIHRocmVlIHR5cGVzIG9mIHF1ZXVlLCB3aGljaCBkaWZmZXIgb25seSBpbiB0aGUgb3JkZXIgaW4KLXdoaWNoIHRoZSBlbnRyaWVzIGFyZSByZXRyaWV2ZWQuICBJbiBhIEZJRk8gcXVldWUsIHRoZSBmaXJzdCB0YXNrcyBhZGRlZCBhcmUKLXRoZSBmaXJzdCByZXRyaWV2ZWQuIEluIGEgTElGTyBxdWV1ZSwgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgZW50cnkgaXMKK3doaWNoIHRoZSBlbnRyaWVzIGFyZSByZXRyaWV2ZWQuICBJbiBhIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAKK3F1ZXVlLCB0aGUgZmlyc3QgdGFza3MgYWRkZWQgYXJlIHRoZSBmaXJzdCByZXRyaWV2ZWQuIEluIGEKKzphYmJyOmBMSUZPIChsYXN0LWluLCBmaXJzdC1vdXQpYCBxdWV1ZSwgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgZW50cnkgaXMKIHRoZSBmaXJzdCByZXRyaWV2ZWQgKG9wZXJhdGluZyBsaWtlIGEgc3RhY2spLiAgV2l0aCBhIHByaW9yaXR5IHF1ZXVlLAogdGhlIGVudHJpZXMgYXJlIGtlcHQgc29ydGVkICh1c2luZyB0aGUgOm1vZDpgaGVhcHFgIG1vZHVsZSkgYW5kIHRoZQogbG93ZXN0IHZhbHVlZCBlbnRyeSBpcyByZXRyaWV2ZWQgZmlyc3QuCkBAIC0yNywxNCArMjgsMTYgQEAKIAogLi4gY2xhc3M6OiBRdWV1ZShtYXhzaXplPTApCiAKLSAgIENvbnN0cnVjdG9yIGZvciBhIEZJRk8gcXVldWUuICAqbWF4c2l6ZSogaXMgYW4gaW50ZWdlciB0aGF0IHNldHMgdGhlIHVwcGVyYm91bmQKKyAgIENvbnN0cnVjdG9yIGZvciBhIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAgcXVldWUuICAqbWF4c2l6ZSogaXMKKyAgIGFuIGludGVnZXIgdGhhdCBzZXRzIHRoZSB1cHBlcmJvdW5kCiAgICBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHBsYWNlZCBpbiB0aGUgcXVldWUuICBJbnNlcnRpb24gd2lsbAogICAgYmxvY2sgb25jZSB0aGlzIHNpemUgaGFzIGJlZW4gcmVhY2hlZCwgdW50aWwgcXVldWUgaXRlbXMgYXJlIGNvbnN1bWVkLiAgSWYKICAgICptYXhzaXplKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybywgdGhlIHF1ZXVlIHNpemUgaXMgaW5maW5pdGUuCiAKIC4uIGNsYXNzOjogTGlmb1F1ZXVlKG1heHNpemU9MCkKIAotICAgQ29uc3RydWN0b3IgZm9yIGEgTElGTyBxdWV1ZS4gICptYXhzaXplKiBpcyBhbiBpbnRlZ2VyIHRoYXQgc2V0cyB0aGUgdXBwZXJib3VuZAorICAgQ29uc3RydWN0b3IgZm9yIGEgOmFiYnI6YExJRk8gKGxhc3QtaW4sIGZpcnN0LW91dClgIHF1ZXVlLiAgKm1heHNpemUqIGlzCisgICBhbiBpbnRlZ2VyIHRoYXQgc2V0cyB0aGUgdXBwZXJib3VuZAogICAgbGltaXQgb24gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBwbGFjZWQgaW4gdGhlIHF1ZXVlLiAgSW5zZXJ0aW9uIHdpbGwKICAgIGJsb2NrIG9uY2UgdGhpcyBzaXplIGhhcyBiZWVuIHJlYWNoZWQsIHVudGlsIHF1ZXVlIGl0ZW1zIGFyZSBjb25zdW1lZC4gIElmCiAgICAqbWF4c2l6ZSogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIHRoZSBxdWV1ZSBzaXplIGlzIGluZmluaXRlLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcmFuZG9tLnJzdCBiL0RvYy9saWJyYXJ5L3JhbmRvbS5yc3QKaW5kZXggMjJmMThhMC4uNWViNDRkYSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcmFuZG9tLnJzdAorKysgYi9Eb2MvbGlicmFyeS9yYW5kb20ucnN0CkBAIC00Niw3ICs0Niw4IEBACiAuLiB3YXJuaW5nOjoKIAogICAgVGhlIHBzZXVkby1yYW5kb20gZ2VuZXJhdG9ycyBvZiB0aGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yCi0gICBzZWN1cml0eSBwdXJwb3Nlcy4KKyAgIHNlY3VyaXR5IHB1cnBvc2VzLiAgRm9yIHNlY3VyaXR5IG9yIGNyeXB0b2dyYXBoaWMgdXNlcywgc2VlIHRoZQorICAgOm1vZDpgc2VjcmV0c2AgbW9kdWxlLgogCiAKIEJvb2trZWVwaW5nIGZ1bmN0aW9uczoKQEAgLTEyMyw2ICsxMjQsMjcgQEAKICAgIFJldHVybiBhIHJhbmRvbSBlbGVtZW50IGZyb20gdGhlIG5vbi1lbXB0eSBzZXF1ZW5jZSAqc2VxKi4gSWYgKnNlcSogaXMgZW1wdHksCiAgICByYWlzZXMgOmV4YzpgSW5kZXhFcnJvcmAuCiAKKy4uIGZ1bmN0aW9uOjogY2hvaWNlcyhrLCBwb3B1bGF0aW9uLCB3ZWlnaHRzPU5vbmUsICosIGN1bV93ZWlnaHRzPU5vbmUpCisKKyAgIFJldHVybiBhICprKiBzaXplZCBsaXN0IG9mIGVsZW1lbnRzIGNob3NlbiBmcm9tIHRoZSAqcG9wdWxhdGlvbiogd2l0aCByZXBsYWNlbWVudC4KKyAgIElmIHRoZSAqcG9wdWxhdGlvbiogaXMgZW1wdHksIHJhaXNlcyA6ZXhjOmBJbmRleEVycm9yYC4KKworICAgSWYgYSAqd2VpZ2h0cyogc2VxdWVuY2UgaXMgc3BlY2lmaWVkLCBzZWxlY3Rpb25zIGFyZSBtYWRlIGFjY29yZGluZyB0byB0aGUKKyAgIHJlbGF0aXZlIHdlaWdodHMuICBBbHRlcm5hdGl2ZWx5LCBpZiBhICpjdW1fd2VpZ2h0cyogc2VxdWVuY2UgaXMgZ2l2ZW4sIHRoZQorICAgc2VsZWN0aW9ucyBhcmUgbWFkZSBhY2NvcmRpbmcgdG8gdGhlIGN1bXVsYXRpdmUgd2VpZ2h0cy4gIEZvciBleGFtcGxlLCB0aGUKKyAgIHJlbGF0aXZlIHdlaWdodHMgYGBbMTAsIDUsIDMwLCA1XWBgIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBjdW11bGF0aXZlCisgICB3ZWlnaHRzIGBgWzEwLCAxNSwgNDUsIDUwXWBgLiAgSW50ZXJuYWxseSwgdGhlIHJlbGF0aXZlIHdlaWdodHMgYXJlCisgICBjb252ZXJ0ZWQgdG8gY3VtdWxhdGl2ZSB3ZWlnaHRzIGJlZm9yZSBtYWtpbmcgc2VsZWN0aW9ucywgc28gc3VwcGx5aW5nIHRoZQorICAgY3VtdWxhdGl2ZSB3ZWlnaHRzIHNhdmVzIHdvcmsuCisKKyAgIElmIG5laXRoZXIgKndlaWdodHMqIG5vciAqY3VtX3dlaWdodHMqIGFyZSBzcGVjaWZpZWQsIHNlbGVjdGlvbnMgYXJlIG1hZGUKKyAgIHdpdGggZXF1YWwgcHJvYmFiaWxpdHkuICBJZiBhIHdlaWdodHMgc2VxdWVuY2UgaXMgc3VwcGxpZWQsIGl0IG11c3QgYmUKKyAgIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgKnBvcHVsYXRpb24qIHNlcXVlbmNlLiAgSXQgaXMgYSA6ZXhjOmBUeXBlRXJyb3JgCisgICB0byBzcGVjaWZ5IGJvdGggKndlaWdodHMqIGFuZCAqY3VtX3dlaWdodHMqLgorCisgICBUaGUgKndlaWdodHMqIG9yICpjdW1fd2VpZ2h0cyogY2FuIHVzZSBhbnkgbnVtZXJpYyB0eXBlIHRoYXQgaW50ZXJvcGVyYXRlcworICAgd2l0aCB0aGUgOmNsYXNzOmBmbG9hdGAgdmFsdWVzIHJldHVybmVkIGJ5IDpmdW5jOmByYW5kb21gICh0aGF0IGluY2x1ZGVzCisgICBpbnRlZ2VycywgZmxvYXRzLCBhbmQgZnJhY3Rpb25zIGJ1dCBleGNsdWRlcyBkZWNpbWFscykuCiAKIC4uIGZ1bmN0aW9uOjogc2h1ZmZsZSh4WywgcmFuZG9tXSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcmUucnN0IGIvRG9jL2xpYnJhcnkvcmUucnN0CmluZGV4IDU2OWI1MjIuLmRmYmVkZDQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3JlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9yZS5yc3QKQEAgLTMyMSw4ICszMjEsOSBAQAogCiAKIFRoZSBzcGVjaWFsIHNlcXVlbmNlcyBjb25zaXN0IG9mIGBgJ1wnYGAgYW5kIGEgY2hhcmFjdGVyIGZyb20gdGhlIGxpc3QgYmVsb3cuCi1JZiB0aGUgb3JkaW5hcnkgY2hhcmFjdGVyIGlzIG5vdCBvbiB0aGUgbGlzdCwgdGhlbiB0aGUgcmVzdWx0aW5nIFJFIHdpbGwgbWF0Y2gKLXRoZSBzZWNvbmQgY2hhcmFjdGVyLiAgRm9yIGV4YW1wbGUsIGBgXCRgYCBtYXRjaGVzIHRoZSBjaGFyYWN0ZXIgYGAnJCdgYC4KK0lmIHRoZSBvcmRpbmFyeSBjaGFyYWN0ZXIgaXMgbm90IGFuIEFTQ0lJIGRpZ2l0IG9yIGFuIEFTQ0lJIGxldHRlciwgdGhlbiB0aGUKK3Jlc3VsdGluZyBSRSB3aWxsIG1hdGNoIHRoZSBzZWNvbmQgY2hhcmFjdGVyLiAgRm9yIGV4YW1wbGUsIGBgXCRgYCBtYXRjaGVzIHRoZQorY2hhcmFjdGVyIGBgJyQnYGAuCiAKIGBgXG51bWJlcmBgCiAgICBNYXRjaGVzIHRoZSBjb250ZW50cyBvZiB0aGUgZ3JvdXAgb2YgdGhlIHNhbWUgbnVtYmVyLiAgR3JvdXBzIGFyZSBudW1iZXJlZApAQCAtNDQyLDkgKzQ0Myw4IEBACiAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMwogICAgVGhlIGBgJ1x1J2BgIGFuZCBgYCdcVSdgYCBlc2NhcGUgc2VxdWVuY2VzIGhhdmUgYmVlbiBhZGRlZC4KIAotLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy41IDMuNgotICAgVW5rbm93biBlc2NhcGVzIGNvbnNpc3Rpbmcgb2YgYGAnXCdgYCBhbmQgQVNDSUkgbGV0dGVyIG5vdyByYWlzZSBhCi0gICBkZXByZWNhdGlvbiB3YXJuaW5nIGFuZCB3aWxsIGJlIGZvcmJpZGRlbiBpbiBQeXRob24gMy42LgorLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgIFVua25vd24gZXNjYXBlcyBjb25zaXN0aW5nIG9mIGBgJ1wnYGAgYW5kIGFuIEFTQ0lJIGxldHRlciBub3cgYXJlIGVycm9ycy4KIAogCiAuLiBzZWVhbHNvOjoKQEAgLTUzMiwxMSArNTMyLDExIEBACiAgICBjdXJyZW50IGxvY2FsZS4gVGhlIHVzZSBvZiB0aGlzIGZsYWcgaXMgZGlzY291cmFnZWQgYXMgdGhlIGxvY2FsZSBtZWNoYW5pc20KICAgIGlzIHZlcnkgdW5yZWxpYWJsZSwgYW5kIGl0IG9ubHkgaGFuZGxlcyBvbmUgImN1bHR1cmUiIGF0IGEgdGltZSBhbnl3YXk7CiAgICB5b3Ugc2hvdWxkIHVzZSBVbmljb2RlIG1hdGNoaW5nIGluc3RlYWQsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGluIFB5dGhvbiAzCi0gICBmb3IgVW5pY29kZSAoc3RyKSBwYXR0ZXJucy4gVGhpcyBmbGFnIG1ha2VzIHNlbnNlIG9ubHkgd2l0aCBieXRlcyBwYXR0ZXJucy4KKyAgIGZvciBVbmljb2RlIChzdHIpIHBhdHRlcm5zLiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgb25seSB3aXRoIGJ5dGVzIHBhdHRlcm5zLgogCi0gICAuLiBkZXByZWNhdGVkLXJlbW92ZWQ6OiAzLjUgMy42Ci0gICAgICBEZXByZWNhdGVkIHRoZSB1c2Ugb2YgIDpjb25zdDpgcmUuTE9DQUxFYCB3aXRoIHN0cmluZyBwYXR0ZXJucyBvcgotICAgICAgOmNvbnN0OmByZS5BU0NJSWAuCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgOmNvbnN0OmByZS5MT0NBTEVgIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBieXRlcyBwYXR0ZXJucyBhbmQgaXMKKyAgICAgIG5vdCBjb21wYXRpYmxlIHdpdGggOmNvbnN0OmByZS5BU0NJSWAuCiAKIAogLi4gZGF0YTo6IE0KQEAgLTc0Miw5ICs3NDIsOCBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKICAgICAgIFVubWF0Y2hlZCBncm91cHMgYXJlIHJlcGxhY2VkIHdpdGggYW4gZW1wdHkgc3RyaW5nLgogCi0gICAuLiBkZXByZWNhdGVkLXJlbW92ZWQ6OiAzLjUgMy42Ci0gICAgICBVbmtub3duIGVzY2FwZXMgY29uc2lzdCBvZiBgYCdcJ2BgIGFuZCBBU0NJSSBsZXR0ZXIgbm93IHJhaXNlIGEKLSAgICAgIGRlcHJlY2F0aW9uIHdhcm5pbmcgYW5kIHdpbGwgYmUgZm9yYmlkZGVuIGluIFB5dGhvbiAzLjYuCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgVW5rbm93biBlc2NhcGVzIGNvbnNpc3Rpbmcgb2YgYGAnXCdgYCBhbmQgYW4gQVNDSUkgbGV0dGVyIG5vdyBhcmUgZXJyb3JzLgogCiAKIC4uIGZ1bmN0aW9uOjogc3VibihwYXR0ZXJuLCByZXBsLCBzdHJpbmcsIGNvdW50PTAsIGZsYWdzPTApCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9yZWFkbGluZS5yc3QgYi9Eb2MvbGlicmFyeS9yZWFkbGluZS5yc3QKaW5kZXggNGQzYzA5OS4uMzdlNDAwZSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcmVhZGxpbmUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3JlYWRsaW5lLnJzdApAQCAtMTY3LDYgKzE2NywyMCBAQAogICAgVGhpcyBjYWxscyA6YzpmdW5jOmBhZGRfaGlzdG9yeWAgaW4gdGhlIHVuZGVybHlpbmcgbGlicmFyeS4KIAogCisuLiBmdW5jdGlvbjo6IHNldF9hdXRvX2hpc3RvcnkoZW5hYmxlZCkKKworICAgRW5hYmxlIG9yIGRpc2FibGUgYXV0b21hdGljIGNhbGxzIHRvIDpjOmZ1bmM6YGFkZF9oaXN0b3J5YCB3aGVuIHJlYWRpbmcKKyAgIGlucHV0IHZpYSByZWFkbGluZS4gIFRoZSAqZW5hYmxlZCogYXJndW1lbnQgc2hvdWxkIGJlIGEgQm9vbGVhbiB2YWx1ZQorICAgdGhhdCB3aGVuIHRydWUsIGVuYWJsZXMgYXV0byBoaXN0b3J5LCBhbmQgdGhhdCB3aGVuIEZhbHNlLCBkaXNhYmxlcworICAgYXV0byBoaXN0b3J5LgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworICAgLi4gaW1wbC1kZXRhaWw6OgorICAgICAgQXV0byBoaXN0b3J5IGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgYW5kIGNoYW5nZXMgdG8gdGhpcyBkbyBub3QgcGVyc2lzdAorICAgICAgYWNyb3NzIG11bHRpcGxlIHNlc3Npb25zLgorCisKIFN0YXJ0dXAgaG9va3MKIC0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc2VjcmV0cy5yc3QgYi9Eb2MvbGlicmFyeS9zZWNyZXRzLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmY4NDhmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYnJhcnkvc2VjcmV0cy5yc3QKQEAgLTAsMCArMSwxOTggQEAKKzptb2Q6YHNlY3JldHNgIC0tLSBHZW5lcmF0ZSBzZWN1cmUgcmFuZG9tIG51bWJlcnMgZm9yIG1hbmFnaW5nIHNlY3JldHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLi4gbW9kdWxlOjogc2VjcmV0cworICAgOnN5bm9wc2lzOiBHZW5lcmF0ZSBzZWN1cmUgcmFuZG9tIG51bWJlcnMgZm9yIG1hbmFnaW5nIHNlY3JldHMuCisKKy4uIG1vZHVsZWF1dGhvcjo6IFN0ZXZlbiBEJ0FwcmFubyA8c3RldmUrcHl0aG9uQHBlYXJ3b29kLmluZm8+CisuLiBzZWN0aW9uYXV0aG9yOjogU3RldmVuIEQnQXByYW5vIDxzdGV2ZStweXRob25AcGVhcndvb2QuaW5mbz4KKy4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisuLiB0ZXN0c2V0dXA6OgorCisgICBmcm9tIHNlY3JldHMgaW1wb3J0ICoKKyAgIF9fbmFtZV9fID0gJzxkb2N0ZXN0PicKKworKipTb3VyY2UgY29kZToqKiA6c291cmNlOmBMaWIvc2VjcmV0cy5weWAKKworLS0tLS0tLS0tLS0tLQorCitUaGUgOm1vZDpgc2VjcmV0c2AgbW9kdWxlIGlzIHVzZWQgZm9yIGdlbmVyYXRpbmcgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nCityYW5kb20gbnVtYmVycyBzdWl0YWJsZSBmb3IgbWFuYWdpbmcgZGF0YSBzdWNoIGFzIHBhc3N3b3JkcywgYWNjb3VudAorYXV0aGVudGljYXRpb24sIHNlY3VyaXR5IHRva2VucywgYW5kIHJlbGF0ZWQgc2VjcmV0cy4KKworSW4gcGFydGljdWxhcmx5LCA6bW9kOmBzZWNyZXRzYCBzaG91bGQgYmUgdXNlZCBpbiBwcmVmZXJlbmNlIHRvIHRoZQorZGVmYXVsdCBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaW4gdGhlIDptb2Q6YHJhbmRvbWAgbW9kdWxlLCB3aGljaAoraXMgZGVzaWduZWQgZm9yIG1vZGVsbGluZyBhbmQgc2ltdWxhdGlvbiwgbm90IHNlY3VyaXR5IG9yIGNyeXB0b2dyYXBoeS4KKworLi4gc2VlYWxzbzo6CisKKyAgIDpwZXA6YDUwNmAKKworCitSYW5kb20gbnVtYmVycworLS0tLS0tLS0tLS0tLS0KKworVGhlIDptb2Q6YHNlY3JldHNgIG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIG1vc3Qgc2VjdXJlIHNvdXJjZSBvZgorcmFuZG9tbmVzcyB0aGF0IHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBwcm92aWRlcy4KKworLi4gY2xhc3M6OiBTeXN0ZW1SYW5kb20KKworICAgQSBjbGFzcyBmb3IgZ2VuZXJhdGluZyByYW5kb20gbnVtYmVycyB1c2luZyB0aGUgaGlnaGVzdC1xdWFsaXR5CisgICBzb3VyY2VzIHByb3ZpZGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU2VlCisgICA6Y2xhc3M6YHJhbmRvbS5TeXN0ZW1SYW5kb21gIGZvciBhZGRpdGlvbmFsIGRldGFpbHMuCisKKy4uIGZ1bmN0aW9uOjogY2hvaWNlKHNlcXVlbmNlKQorCisgICBSZXR1cm4gYSByYW5kb21seS1jaG9zZW4gZWxlbWVudCBmcm9tIGEgbm9uLWVtcHR5IHNlcXVlbmNlLgorCisuLiBmdW5jdGlvbjo6IHJhbmRiZWxvdyhuKQorCisgICBSZXR1cm4gYSByYW5kb20gaW50IGluIHRoZSByYW5nZSBbMCwgKm4qKS4KKworLi4gZnVuY3Rpb246OiByYW5kYml0cyhrKQorCisgICBSZXR1cm4gYW4gaW50IHdpdGggKmsqIHJhbmRvbSBiaXRzLgorCisKK0dlbmVyYXRpbmcgdG9rZW5zCistLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgOm1vZDpgc2VjcmV0c2AgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyBzZWN1cmUKK3Rva2Vucywgc3VpdGFibGUgZm9yIGFwcGxpY2F0aW9ucyBzdWNoIGFzIHBhc3N3b3JkIHJlc2V0cywKK2hhcmQtdG8tZ3Vlc3MgVVJMcywgYW5kIHNpbWlsYXIuCisKKy4uIGZ1bmN0aW9uOjogdG9rZW5fYnl0ZXMoW25ieXRlcz1Ob25lXSkKKworICAgUmV0dXJuIGEgcmFuZG9tIGJ5dGUgc3RyaW5nIGNvbnRhaW5pbmcgKm5ieXRlcyogbnVtYmVyIG9mIGJ5dGVzLgorICAgSWYgKm5ieXRlcyogaXMgYGBOb25lYGAgb3Igbm90IHN1cHBsaWVkLCBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcworICAgdXNlZC4KKworICAgLi4gZG9jdGVzdDo6CisKKyAgICAgID4+PiB0b2tlbl9ieXRlcygxNikgICNkb2N0ZXN0OitTS0lQCisgICAgICBiJ1x4ZWJyXHgxN0QqdFx4YWVceGQ0XHhlM1NceGI2XHhlMlx4ZWJQMVx4OGInCisKKworLi4gZnVuY3Rpb246OiB0b2tlbl9oZXgoW25ieXRlcz1Ob25lXSkKKworICAgUmV0dXJuIGEgcmFuZG9tIHRleHQgc3RyaW5nLCBpbiBoZXhhZGVjaW1hbC4gIFRoZSBzdHJpbmcgaGFzICpuYnl0ZXMqCisgICByYW5kb20gYnl0ZXMsIGVhY2ggYnl0ZSBjb252ZXJ0ZWQgdG8gdHdvIGhleCBkaWdpdHMuICBJZiAqbmJ5dGVzKiBpcworICAgYGBOb25lYGAgb3Igbm90IHN1cHBsaWVkLCBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcyB1c2VkLgorCisgICAuLiBkb2N0ZXN0OjoKKworICAgICAgPj4+IHRva2VuX2hleCgxNikgICNkb2N0ZXN0OitTS0lQCisgICAgICAnZjliZjc4YjlhMThjZTZkNDZhMGNkMmIwYjg2ZGY5ZGEnCisKKy4uIGZ1bmN0aW9uOjogdG9rZW5fdXJsc2FmZShbbmJ5dGVzPU5vbmVdKQorCisgICBSZXR1cm4gYSByYW5kb20gVVJMLXNhZmUgdGV4dCBzdHJpbmcsIGNvbnRhaW5pbmcgKm5ieXRlcyogcmFuZG9tCisgICBieXRlcy4gIFRoZSB0ZXh0IGlzIEJhc2U2NCBlbmNvZGVkLCBzbyBvbiBhdmVyYWdlIGVhY2ggYnl0ZSByZXN1bHRzCisgICBpbiBhcHByb3hpbWF0ZWx5IDEuMyBjaGFyYWN0ZXJzLiAgSWYgKm5ieXRlcyogaXMgYGBOb25lYGAgb3Igbm90CisgICBzdXBwbGllZCwgYSByZWFzb25hYmxlIGRlZmF1bHQgaXMgdXNlZC4KKworICAgLi4gZG9jdGVzdDo6CisKKyAgICAgID4+PiB0b2tlbl91cmxzYWZlKDE2KSAgI2RvY3Rlc3Q6K1NLSVAKKyAgICAgICdEcm1oemU2RVBjdjBmTl84MUJqLW5BJworCisKK0hvdyBtYW55IGJ5dGVzIHNob3VsZCB0b2tlbnMgdXNlPworXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK1RvIGJlIHNlY3VyZSBhZ2FpbnN0CitgYnJ1dGUtZm9yY2UgYXR0YWNrcyA8aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnJ1dGUtZm9yY2VfYXR0YWNrPmBfLAordG9rZW5zIG5lZWQgdG8gaGF2ZSBzdWZmaWNpZW50IHJhbmRvbW5lc3MuICBVbmZvcnR1bmF0ZWx5LCB3aGF0IGlzCitjb25zaWRlcmVkIHN1ZmZpY2llbnQgd2lsbCBuZWNlc3NhcmlseSBpbmNyZWFzZSBhcyBjb21wdXRlcnMgZ2V0IG1vcmUKK3Bvd2VyZnVsIGFuZCBhYmxlIHRvIG1ha2UgbW9yZSBndWVzc2VzIGluIGEgc2hvcnRlciBwZXJpb2QuICBBcyBvZiAyMDE1LAoraXQgaXMgYmVsaWV2ZWQgdGhhdCAzMiBieXRlcyAoMjU2IGJpdHMpIG9mIHJhbmRvbW5lc3MgaXMgc3VmZmljaWVudCBmb3IKK3RoZSB0eXBpY2FsIHVzZS1jYXNlIGV4cGVjdGVkIGZvciB0aGUgOm1vZDpgc2VjcmV0c2AgbW9kdWxlLgorCitGb3IgdGhvc2Ugd2hvIHdhbnQgdG8gbWFuYWdlIHRoZWlyIG93biB0b2tlbiBsZW5ndGgsIHlvdSBjYW4gZXhwbGljaXRseQorc3BlY2lmeSBob3cgbXVjaCByYW5kb21uZXNzIGlzIHVzZWQgZm9yIHRva2VucyBieSBnaXZpbmcgYW4gOmNsYXNzOmBpbnRgCithcmd1bWVudCB0byB0aGUgdmFyaW91cyBgYHRva2VuXypgYCBmdW5jdGlvbnMuICBUaGF0IGFyZ3VtZW50IGlzIHRha2VuCithcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHJhbmRvbW5lc3MgdG8gdXNlLgorCitPdGhlcndpc2UsIGlmIG5vIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBvciBpZiB0aGUgYXJndW1lbnQgaXMgYGBOb25lYGAsCit0aGUgYGB0b2tlbl8qYGAgZnVuY3Rpb25zIHdpbGwgdXNlIGEgcmVhc29uYWJsZSBkZWZhdWx0IGluc3RlYWQuCisKKy4uIG5vdGU6OgorCisgICBUaGF0IGRlZmF1bHQgaXMgc3ViamVjdCB0byBjaGFuZ2UgYXQgYW55IHRpbWUsIGluY2x1ZGluZyBkdXJpbmcKKyAgIG1haW50ZW5hbmNlIHJlbGVhc2VzLgorCisKK090aGVyIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tCisKKy4uIGZ1bmN0aW9uOjogY29tcGFyZV9kaWdlc3QoYSwgYikKKworICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHN0cmluZ3MgKmEqIGFuZCAqYiogYXJlIGVxdWFsLCBvdGhlcndpc2UgYGBGYWxzZWBgLAorICAgaW4gc3VjaCBhIHdheSBhcyB0byByZWR1Y2UgdGhlIHJpc2sgb2YKKyAgIGB0aW1pbmcgYXR0YWNrcyA8aHR0cDovL2NvZGFoYWxlLmNvbS9hLWxlc3Nvbi1pbi10aW1pbmctYXR0YWNrcy8+YF8uCisgICBTZWUgOmZ1bmM6YGhtYWMuY29tcGFyZV9kaWdlc3RgIGZvciBhZGRpdGlvbmFsIGRldGFpbHMuCisKKworUmVjaXBlcyBhbmQgYmVzdCBwcmFjdGljZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgc2VjdGlvbiBzaG93cyByZWNpcGVzIGFuZCBiZXN0IHByYWN0aWNlcyBmb3IgdXNpbmcgOm1vZDpgc2VjcmV0c2AKK3RvIG1hbmFnZSBhIGJhc2ljIGxldmVsIG9mIHNlY3VyaXR5LgorCitHZW5lcmF0ZSBhbiBlaWdodC1jaGFyYWN0ZXIgYWxwaGFudW1lcmljIHBhc3N3b3JkOgorCisuLiB0ZXN0Y29kZTo6CisKKyAgIGltcG9ydCBzdHJpbmcKKyAgIGFscGhhYmV0ID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzCisgICBwYXNzd29yZCA9ICcnLmpvaW4oY2hvaWNlKGFscGhhYmV0KSBmb3IgaSBpbiByYW5nZSg4KSkKKworCisuLiBub3RlOjoKKworICAgQXBwbGljYXRpb25zIHNob3VsZCBub3QKKyAgIGBzdG9yZSBwYXNzd29yZHMgaW4gYSByZWNvdmVyYWJsZSBmb3JtYXQgPGh0dHA6Ly9jd2UubWl0cmUub3JnL2RhdGEvZGVmaW5pdGlvbnMvMjU3Lmh0bWw+YF8sCisgICB3aGV0aGVyIHBsYWluIHRleHQgb3IgZW5jcnlwdGVkLiAgVGhleSBzaG91bGQgYmUgc2FsdGVkIGFuZCBoYXNoZWQKKyAgIHVzaW5nIGEgY3J5cHRvZ3JhcGhpY2FsbHktc3Ryb25nIG9uZS13YXkgKGlycmV2ZXJzaWJsZSkgaGFzaCBmdW5jdGlvbi4KKworCitHZW5lcmF0ZSBhIHRlbi1jaGFyYWN0ZXIgYWxwaGFudW1lcmljIHBhc3N3b3JkIHdpdGggYXQgbGVhc3Qgb25lCitsb3dlcmNhc2UgY2hhcmFjdGVyLCBhdCBsZWFzdCBvbmUgdXBwZXJjYXNlIGNoYXJhY3RlciwgYW5kIGF0IGxlYXN0Cit0aHJlZSBkaWdpdHM6CisKKy4uIHRlc3Rjb2RlOjoKKworICAgaW1wb3J0IHN0cmluZworICAgYWxwaGFiZXQgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMKKyAgIHdoaWxlIFRydWU6CisgICAgICAgcGFzc3dvcmQgPSAnJy5qb2luKGNob2ljZShhbHBoYWJldCkgZm9yIGkgaW4gcmFuZ2UoMTApKQorICAgICAgIGlmIChhbnkoYy5pc2xvd2VyKCkgZm9yIGMgaW4gcGFzc3dvcmQpCisgICAgICAgICAgICAgICBhbmQgYW55KGMuaXN1cHBlcigpIGZvciBjIGluIHBhc3N3b3JkKQorICAgICAgICAgICAgICAgYW5kIHN1bShjLmlzZGlnaXQoKSBmb3IgYyBpbiBwYXNzd29yZCkgPj0gMyk6CisgICAgICAgICAgIGJyZWFrCisKKworR2VuZXJhdGUgYW4gYFhLQ0Qtc3R5bGUgcGFzc3BocmFzZSA8aHR0cDovL3hrY2QuY29tLzkzNi8+YF86CisKKy4uIHRlc3Rjb2RlOjoKKworICAgIyBPbiBzdGFuZGFyZCBMaW51eCBzeXN0ZW1zLCB1c2UgYSBjb252ZW5pZW50IGRpY3Rpb25hcnkgZmlsZS4KKyAgICMgT3RoZXIgcGxhdGZvcm1zIG1heSBuZWVkIHRvIHByb3ZpZGUgdGhlaXIgb3duIHdvcmQtbGlzdC4KKyAgIHdpdGggb3BlbignL3Vzci9zaGFyZS9kaWN0L3dvcmRzJykgYXMgZjoKKyAgICAgICB3b3JkcyA9IFt3b3JkLnN0cmlwKCkgZm9yIHdvcmQgaW4gZl0KKyAgICAgICBwYXNzd29yZCA9ICcgJy5qb2luKGNob2ljZSh3b3JkcykgZm9yIGkgaW4gcmFuZ2UoNCkpCisKKworR2VuZXJhdGUgYSBoYXJkLXRvLWd1ZXNzIHRlbXBvcmFyeSBVUkwgY29udGFpbmluZyBhIHNlY3VyaXR5IHRva2VuCitzdWl0YWJsZSBmb3IgcGFzc3dvcmQgcmVjb3ZlcnkgYXBwbGljYXRpb25zOgorCisuLiB0ZXN0Y29kZTo6CisKKyAgIHVybCA9ICdodHRwczovL215ZG9tYWluLmNvbS9yZXNldD0nICsgdG9rZW5fdXJsc2FmZSgpCisKKworCisuLgorICAgIyBUaGlzIG1vZGVsaW5lIG11c3QgYXBwZWFyIHdpdGhpbiB0aGUgbGFzdCB0ZW4gbGluZXMgb2YgdGhlIGZpbGUuCisgICBrYXRlOiBpbmRlbnQtd2lkdGggMzsgcmVtb3ZlLXRyYWlsaW5nLXNwYWNlIG9uOyByZXBsYWNlLXRhYnMgb247IGVuY29kaW5nIHV0Zi04OwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc2VsZWN0LnJzdCBiL0RvYy9saWJyYXJ5L3NlbGVjdC5yc3QKaW5kZXggNmNlYzlmNy4uNTQ5NGVlZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc2VsZWN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9zZWxlY3QucnN0CkBAIC0yNjYsMzUgKzI2Niw0MyBAQAogCiAgICAqZXZlbnRtYXNrKgogCi0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IENvbnN0YW50ICAgICAgICAgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICArPT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCi0gICB8IDpjb25zdDpgRVBPTExJTmAgICAgICB8IEF2YWlsYWJsZSBmb3IgcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IDpjb25zdDpgRVBPTExPVVRgICAgICB8IEF2YWlsYWJsZSBmb3Igd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IDpjb25zdDpgRVBPTExQUklgICAgICB8IFVyZ2VudCBkYXRhIGZvciByZWFkICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IDpjb25zdDpgRVBPTExFUlJgICAgICB8IEVycm9yIGNvbmRpdGlvbiBoYXBwZW5lZCBvbiB0aGUgYXNzb2MuIGZkICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IDpjb25zdDpgRVBPTExIVVBgICAgICB8IEhhbmcgdXAgaGFwcGVuZWQgb24gdGhlIGFzc29jLiBmZCAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IDpjb25zdDpgRVBPTExFVGAgICAgICB8IFNldCBFZGdlIFRyaWdnZXIgYmVoYXZpb3IsIHRoZSBkZWZhdWx0IGlzICAgICB8Ci0gICB8ICAgICAgICAgICAgICAgICAgICAgICB8IExldmVsIFRyaWdnZXIgYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IDpjb25zdDpgRVBPTExPTkVTSE9UYCB8IFNldCBvbmUtc2hvdCBiZWhhdmlvci4gQWZ0ZXIgb25lIGV2ZW50IGlzICAgICB8Ci0gICB8ICAgICAgICAgICAgICAgICAgICAgICB8IHB1bGxlZCBvdXQsIHRoZSBmZCBpcyBpbnRlcm5hbGx5IGRpc2FibGVkICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IDpjb25zdDpgRVBPTExSRE5PUk1gICB8IEVxdWl2YWxlbnQgdG8gOmNvbnN0OmBFUE9MTElOYCAgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IDpjb25zdDpgRVBPTExSREJBTkRgICB8IFByaW9yaXR5IGRhdGEgYmFuZCBjYW4gYmUgcmVhZC4gICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IDpjb25zdDpgRVBPTExXUk5PUk1gICB8IEVxdWl2YWxlbnQgdG8gOmNvbnN0OmBFUE9MTE9VVGAgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IDpjb25zdDpgRVBPTExXUkJBTkRgICB8IFByaW9yaXR5IGRhdGEgbWF5IGJlIHdyaXR0ZW4uICAgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IDpjb25zdDpgRVBPTExNU0dgICAgICB8IElnbm9yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgQ29uc3RhbnQgICAgICAgICAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKz09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCisgICB8IDpjb25zdDpgRVBPTExJTmAgICAgICAgIHwgQXZhaWxhYmxlIGZvciByZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCA6Y29uc3Q6YEVQT0xMT1VUYCAgICAgICB8IEF2YWlsYWJsZSBmb3Igd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgOmNvbnN0OmBFUE9MTFBSSWAgICAgICAgfCBVcmdlbnQgZGF0YSBmb3IgcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IDpjb25zdDpgRVBPTExFUlJgICAgICAgIHwgRXJyb3IgY29uZGl0aW9uIGhhcHBlbmVkIG9uIHRoZSBhc3NvYy4gZmQgICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCA6Y29uc3Q6YEVQT0xMSFVQYCAgICAgICB8IEhhbmcgdXAgaGFwcGVuZWQgb24gdGhlIGFzc29jLiBmZCAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgOmNvbnN0OmBFUE9MTEVUYCAgICAgICAgfCBTZXQgRWRnZSBUcmlnZ2VyIGJlaGF2aW9yLCB0aGUgZGVmYXVsdCBpcyAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IExldmVsIFRyaWdnZXIgYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgOmNvbnN0OmBFUE9MTE9ORVNIT1RgICAgfCBTZXQgb25lLXNob3QgYmVoYXZpb3IuIEFmdGVyIG9uZSBldmVudCBpcyAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IHB1bGxlZCBvdXQsIHRoZSBmZCBpcyBpbnRlcm5hbGx5IGRpc2FibGVkICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgOmNvbnN0OmBFUE9MTEVYQ0xVU0lWRWAgfCBXYWtlIG9ubHkgb25lIGVwb2xsIG9iamVjdCB3aGVuIHRoZSAgICAgICAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzc29jaWF0ZWQgZmQgaGFzIGFuIGV2ZW50LiBUaGUgZGVmYXVsdCAoaWYgICB8CisgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhpcyBmbGFnIGlzIG5vdCBzZXQpIGlzIHRvIHdha2UgYWxsIGVwb2xsICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3RzIHBvbGxpbmcgb24gb24gYSBmZC4gICAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IDpjb25zdDpgRVBPTExSREhVUGAgICAgIHwgU3RyZWFtIHNvY2tldCBwZWVyIGNsb3NlZCBjb25uZWN0aW9uIG9yIHNodXQgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBkb3duIHdyaXRpbmcgaGFsZiBvZiBjb25uZWN0aW9uLiAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IDpjb25zdDpgRVBPTExSRE5PUk1gICAgIHwgRXF1aXZhbGVudCB0byA6Y29uc3Q6YEVQT0xMSU5gICAgICAgICAgICAgICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCA6Y29uc3Q6YEVQT0xMUkRCQU5EYCAgICB8IFByaW9yaXR5IGRhdGEgYmFuZCBjYW4gYmUgcmVhZC4gICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgOmNvbnN0OmBFUE9MTFdSTk9STWAgICAgfCBFcXVpdmFsZW50IHRvIDpjb25zdDpgRVBPTExPVVRgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IDpjb25zdDpgRVBPTExXUkJBTkRgICAgIHwgUHJpb3JpdHkgZGF0YSBtYXkgYmUgd3JpdHRlbi4gICAgICAgICAgICAgICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCA6Y29uc3Q6YEVQT0xMTVNHYCAgICAgICB8IElnbm9yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAogCiAuLiBtZXRob2Q6OiBlcG9sbC5jbG9zZSgpCkBAIC0zODMsNiArMzkxLDkgQEAKICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgIHwgOmNvbnN0OmBQT0xMSFVQYCAgfCBIdW5nIHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgOmNvbnN0OmBQT0xMUkRIVVBgfCBTdHJlYW0gc29ja2V0IHBlZXIgY2xvc2VkIGNvbm5lY3Rpb24sIG9yIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgfCBzaHV0IGRvd24gd3JpdGluZyBoYWxmIG9mIGNvbm5lY3Rpb24gICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgIHwgOmNvbnN0OmBQT0xMTlZBTGAgfCBJbnZhbGlkIHJlcXVlc3Q6IGRlc2NyaXB0b3Igbm90IG9wZW4gICAgIHwKICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc2hsZXgucnN0IGIvRG9jL2xpYnJhcnkvc2hsZXgucnN0CmluZGV4IGU4MWY5ODIuLjFhODliZjYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NobGV4LnJzdAorKysgYi9Eb2MvbGlicmFyeS9zaGxleC5yc3QKQEAgLTczLDExICs3MywxMSBAQAogVGhlIDptb2Q6YHNobGV4YCBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzOgogCiAKLS4uIGNsYXNzOjogc2hsZXgoaW5zdHJlYW09Tm9uZSwgaW5maWxlPU5vbmUsIHBvc2l4PUZhbHNlKQorLi4gY2xhc3M6OiBzaGxleChpbnN0cmVhbT1Ob25lLCBpbmZpbGU9Tm9uZSwgcG9zaXg9RmFsc2UsIHB1bmN0dWF0aW9uX2NoYXJzPUZhbHNlKQogCiAgICBBIDpjbGFzczpgfnNobGV4LnNobGV4YCBpbnN0YW5jZSBvciBzdWJjbGFzcyBpbnN0YW5jZSBpcyBhIGxleGljYWwgYW5hbHl6ZXIKICAgIG9iamVjdC4gIFRoZSBpbml0aWFsaXphdGlvbiBhcmd1bWVudCwgaWYgcHJlc2VudCwgc3BlY2lmaWVzIHdoZXJlIHRvIHJlYWQKLSAgIGNoYXJhY3RlcnMgZnJvbS4gSXQgbXVzdCBiZSBhIGZpbGUtL3N0cmVhbS1saWtlIG9iamVjdCB3aXRoCisgICBjaGFyYWN0ZXJzIGZyb20uICBJdCBtdXN0IGJlIGEgZmlsZS0vc3RyZWFtLWxpa2Ugb2JqZWN0IHdpdGgKICAgIDptZXRoOmB+aW8uVGV4dElPQmFzZS5yZWFkYCBhbmQgOm1ldGg6YH5pby5UZXh0SU9CYXNlLnJlYWRsaW5lYCBtZXRob2RzLCBvcgogICAgYSBzdHJpbmcuICBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgaW5wdXQgd2lsbCBiZSB0YWtlbiBmcm9tIGBgc3lzLnN0ZGluYGAuCiAgICBUaGUgc2Vjb25kIG9wdGlvbmFsIGFyZ3VtZW50IGlzIGEgZmlsZW5hbWUgc3RyaW5nLCB3aGljaCBzZXRzIHRoZSBpbml0aWFsCkBAIC04Nyw4ICs4NywxOSBAQAogICAgd2hlbiAqcG9zaXgqIGlzIG5vdCB0cnVlIChkZWZhdWx0KSwgdGhlIDpjbGFzczpgfnNobGV4LnNobGV4YCBpbnN0YW5jZSB3aWxsCiAgICBvcGVyYXRlIGluIGNvbXBhdGliaWxpdHkgbW9kZS4gIFdoZW4gb3BlcmF0aW5nIGluIFBPU0lYIG1vZGUsCiAgICA6Y2xhc3M6YH5zaGxleC5zaGxleGAgd2lsbCB0cnkgdG8gYmUgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIFBPU0lYIHNoZWxsCi0gICBwYXJzaW5nIHJ1bGVzLgorICAgcGFyc2luZyBydWxlcy4gIFRoZSAqcHVuY3R1YXRpb25fY2hhcnMqIGFyZ3VtZW50IHByb3ZpZGVzIGEgd2F5IHRvIG1ha2UgdGhlCisgICBiZWhhdmlvdXIgZXZlbiBjbG9zZXIgdG8gaG93IHJlYWwgc2hlbGxzIHBhcnNlLiAgVGhpcyBjYW4gdGFrZSBhIG51bWJlciBvZgorICAgdmFsdWVzOiB0aGUgZGVmYXVsdCB2YWx1ZSwgYGBGYWxzZWBgLCBwcmVzZXJ2ZXMgdGhlIGJlaGF2aW91ciBzZWVuIHVuZGVyCisgICBQeXRob24gMy41IGFuZCBlYXJsaWVyLiAgSWYgc2V0IHRvIGBgVHJ1ZWBgLCB0aGVuIHBhcnNpbmcgb2YgdGhlIGNoYXJhY3RlcnMKKyAgIGBgKCk7PD58JmBgIGlzIGNoYW5nZWQ6IGFueSBydW4gb2YgdGhlc2UgY2hhcmFjdGVycyAoY29uc2lkZXJlZCBwdW5jdHVhdGlvbgorICAgY2hhcmFjdGVycykgaXMgcmV0dXJuZWQgYXMgYSBzaW5nbGUgdG9rZW4uICBJZiBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIG9mCisgICBjaGFyYWN0ZXJzLCB0aG9zZSBjaGFyYWN0ZXJzIHdpbGwgYmUgdXNlZCBhcyB0aGUgcHVuY3R1YXRpb24gY2hhcmFjdGVycy4gIEFueQorICAgY2hhcmFjdGVycyBpbiB0aGUgOmF0dHI6YHdvcmRjaGFyc2AgYXR0cmlidXRlIHRoYXQgYXBwZWFyIGluCisgICAqcHVuY3R1YXRpb25fY2hhcnMqIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIDphdHRyOmB3b3JkY2hhcnNgLiAgU2VlCisgICA6cmVmOmBpbXByb3ZlZC1zaGVsbC1jb21wYXRpYmlsaXR5YCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoZSAqcHVuY3R1YXRpb25fY2hhcnMqIHBhcmFtZXRlciB3YXMgYWRkZWQuCiAKIC4uIHNlZWFsc286OgogCkBAIC0xOTEsNyArMjAyLDEzIEBACiAuLiBhdHRyaWJ1dGU6OiBzaGxleC53b3JkY2hhcnMKIAogICAgVGhlIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBhY2N1bXVsYXRlIGludG8gbXVsdGktY2hhcmFjdGVyIHRva2Vucy4gIEJ5Ci0gICBkZWZhdWx0LCBpbmNsdWRlcyBhbGwgQVNDSUkgYWxwaGFudW1lcmljcyBhbmQgdW5kZXJzY29yZS4KKyAgIGRlZmF1bHQsIGluY2x1ZGVzIGFsbCBBU0NJSSBhbHBoYW51bWVyaWNzIGFuZCB1bmRlcnNjb3JlLiAgSW4gUE9TSVggbW9kZSwgdGhlCisgICBhY2NlbnRlZCBjaGFyYWN0ZXJzIGluIHRoZSBMYXRpbi0xIHNldCBhcmUgYWxzbyBpbmNsdWRlZC4gIElmCisgICA6YXR0cjpgcHVuY3R1YXRpb25fY2hhcnNgIGlzIG5vdCBlbXB0eSwgdGhlIGNoYXJhY3RlcnMgYGB+LS4vKj89YGAsIHdoaWNoIGNhbgorICAgYXBwZWFyIGluIGZpbGVuYW1lIHNwZWNpZmljYXRpb25zIGFuZCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycywgd2lsbCBhbHNvIGJlCisgICBpbmNsdWRlZCBpbiB0aGlzIGF0dHJpYnV0ZSwgYW5kIGFueSBjaGFyYWN0ZXJzIHdoaWNoIGFwcGVhciBpbgorICAgYGBwdW5jdHVhdGlvbl9jaGFyc2BgIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGBgd29yZGNoYXJzYGAgaWYgdGhleSBhcmUgcHJlc2VudAorICAgdGhlcmUuCiAKIAogLi4gYXR0cmlidXRlOjogc2hsZXgud2hpdGVzcGFjZQpAQCAtMjIyLDkgKzIzOSwxMyBAQAogCiAuLiBhdHRyaWJ1dGU6OiBzaGxleC53aGl0ZXNwYWNlX3NwbGl0CiAKLSAgIElmIGBgVHJ1ZWBgLCB0b2tlbnMgd2lsbCBvbmx5IGJlIHNwbGl0IGluIHdoaXRlc3BhY2VzLiBUaGlzIGlzIHVzZWZ1bCwgZm9yCisgICBJZiBgYFRydWVgYCwgdG9rZW5zIHdpbGwgb25seSBiZSBzcGxpdCBpbiB3aGl0ZXNwYWNlcy4gIFRoaXMgaXMgdXNlZnVsLCBmb3IKICAgIGV4YW1wbGUsIGZvciBwYXJzaW5nIGNvbW1hbmQgbGluZXMgd2l0aCA6Y2xhc3M6YH5zaGxleC5zaGxleGAsIGdldHRpbmcKLSAgIHRva2VucyBpbiBhIHNpbWlsYXIgd2F5IHRvIHNoZWxsIGFyZ3VtZW50cy4KKyAgIHRva2VucyBpbiBhIHNpbWlsYXIgd2F5IHRvIHNoZWxsIGFyZ3VtZW50cy4gIElmIHRoaXMgYXR0cmlidXRlIGlzIGBgVHJ1ZWBgLAorICAgOmF0dHI6YHB1bmN0dWF0aW9uX2NoYXJzYCB3aWxsIGhhdmUgbm8gZWZmZWN0LCBhbmQgc3BsaXR0aW5nIHdpbGwgaGFwcGVuCisgICBvbmx5IG9uIHdoaXRlc3BhY2VzLiAgV2hlbiB1c2luZyA6YXR0cjpgcHVuY3R1YXRpb25fY2hhcnNgLCB3aGljaCBpcworICAgaW50ZW5kZWQgdG8gcHJvdmlkZSBwYXJzaW5nIGNsb3NlciB0byB0aGF0IGltcGxlbWVudGVkIGJ5IHNoZWxscywgaXQgaXMKKyAgIGFkdmlzYWJsZSB0byBsZWF2ZSBgYHdoaXRlc3BhY2Vfc3BsaXRgYCBhcyBgYEZhbHNlYGAgKHRoZSBkZWZhdWx0IHZhbHVlKS4KIAogCiAuLiBhdHRyaWJ1dGU6OiBzaGxleC5pbmZpbGUKQEAgLTI0NSwxMCArMjY2LDkgQEAKICAgIFRoaXMgYXR0cmlidXRlIGlzIGBgTm9uZWBgIGJ5IGRlZmF1bHQuICBJZiB5b3UgYXNzaWduIGEgc3RyaW5nIHRvIGl0LCB0aGF0CiAgICBzdHJpbmcgd2lsbCBiZSByZWNvZ25pemVkIGFzIGEgbGV4aWNhbC1sZXZlbCBpbmNsdXNpb24gcmVxdWVzdCBzaW1pbGFyIHRvIHRoZQogICAgYGBzb3VyY2VgYCBrZXl3b3JkIGluIHZhcmlvdXMgc2hlbGxzLiAgVGhhdCBpcywgdGhlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0b2tlbgotICAgd2lsbCBiZSBvcGVuZWQgYXMgYSBmaWxlbmFtZSBhbmQgaW5wdXQgd2lsbAotICAgYmUgdGFrZW4gZnJvbSB0aGF0IHN0cmVhbSB1bnRpbCBFT0YsIGF0IHdoaWNoCi0gICBwb2ludCB0aGUgOm1ldGg6YH5pby5JT0Jhc2UuY2xvc2VgIG1ldGhvZCBvZiB0aGF0IHN0cmVhbSB3aWxsIGJlIGNhbGxlZCBhbmQKLSAgIHRoZSBpbnB1dCBzb3VyY2Ugd2lsbCBhZ2FpbiBiZWNvbWUgdGhlIG9yaWdpbmFsIGlucHV0IHN0cmVhbS4gIFNvdXJjZQorICAgd2lsbCBiZSBvcGVuZWQgYXMgYSBmaWxlbmFtZSBhbmQgaW5wdXQgd2lsbCBiZSB0YWtlbiBmcm9tIHRoYXQgc3RyZWFtIHVudGlsCisgICBFT0YsIGF0IHdoaWNoIHBvaW50IHRoZSA6bWV0aDpgfmlvLklPQmFzZS5jbG9zZWAgbWV0aG9kIG9mIHRoYXQgc3RyZWFtIHdpbGwgYmUKKyAgIGNhbGxlZCBhbmQgdGhlIGlucHV0IHNvdXJjZSB3aWxsIGFnYWluIGJlY29tZSB0aGUgb3JpZ2luYWwgaW5wdXQgc3RyZWFtLiAgU291cmNlCiAgICByZXF1ZXN0cyBtYXkgYmUgc3RhY2tlZCBhbnkgbnVtYmVyIG9mIGxldmVscyBkZWVwLgogCiAKQEAgLTI3NSw2ICsyOTUsMTYgQEAKICAgIChgYCcnYGApLCBpbiBub24tUE9TSVggbW9kZSwgYW5kIHRvIGBgTm9uZWBgIGluIFBPU0lYIG1vZGUuCiAKIAorLi4gYXR0cmlidXRlOjogc2hsZXgucHVuY3R1YXRpb25fY2hhcnMKKworICAgQ2hhcmFjdGVycyB0aGF0IHdpbGwgYmUgY29uc2lkZXJlZCBwdW5jdHVhdGlvbi4gUnVucyBvZiBwdW5jdHVhdGlvbgorICAgY2hhcmFjdGVycyB3aWxsIGJlIHJldHVybmVkIGFzIGEgc2luZ2xlIHRva2VuLiBIb3dldmVyLCBub3RlIHRoYXQgbm8KKyAgIHNlbWFudGljIHZhbGlkaXR5IGNoZWNraW5nIHdpbGwgYmUgcGVyZm9ybWVkOiBmb3IgZXhhbXBsZSwgJz4+PicgY291bGQgYmUKKyAgIHJldHVybmVkIGFzIGEgdG9rZW4sIGV2ZW4gdGhvdWdoIGl0IG1heSBub3QgYmUgcmVjb2duaXNlZCBhcyBzdWNoIGJ5IHNoZWxscy4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogLi4gX3NobGV4LXBhcnNpbmctcnVsZXM6CiAKIFBhcnNpbmcgUnVsZXMKQEAgLTMyNywzICszNTcsNjIgQEAKICogRU9GIGlzIHNpZ25hbGVkIHdpdGggYSA6Y29uc3Q6YE5vbmVgIHZhbHVlOwogCiAqIFF1b3RlZCBlbXB0eSBzdHJpbmdzIChgYCcnYGApIGFyZSBhbGxvd2VkLgorCisuLiBfaW1wcm92ZWQtc2hlbGwtY29tcGF0aWJpbGl0eToKKworSW1wcm92ZWQgQ29tcGF0aWJpbGl0eSB3aXRoIFNoZWxscworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworVGhlIDpjbGFzczpgc2hsZXhgIGNsYXNzIHByb3ZpZGVzIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgcGFyc2luZyBwZXJmb3JtZWQgYnkKK2NvbW1vbiBVbml4IHNoZWxscyBsaWtlIGBgYmFzaGBgLCBgYGRhc2hgYCwgYW5kIGBgc2hgYC4gIFRvIHRha2UgYWR2YW50YWdlIG9mCit0aGlzIGNvbXBhdGliaWxpdHksIHNwZWNpZnkgdGhlIGBgcHVuY3R1YXRpb25fY2hhcnNgYCBhcmd1bWVudCBpbiB0aGUKK2NvbnN0cnVjdG9yLiAgVGhpcyBkZWZhdWx0cyB0byBgYEZhbHNlYGAsIHdoaWNoIHByZXNlcnZlcyBwcmUtMy42IGJlaGF2aW91ci4KK0hvd2V2ZXIsIGlmIGl0IGlzIHNldCB0byBgYFRydWVgYCwgdGhlbiBwYXJzaW5nIG9mIHRoZSBjaGFyYWN0ZXJzIGBgKCk7PD58JmBgCitpcyBjaGFuZ2VkOiBhbnkgcnVuIG9mIHRoZXNlIGNoYXJhY3RlcnMgaXMgcmV0dXJuZWQgYXMgYSBzaW5nbGUgdG9rZW4uICBXaGlsZQordGhpcyBpcyBzaG9ydCBvZiBhIGZ1bGwgcGFyc2VyIGZvciBzaGVsbHMgKHdoaWNoIHdvdWxkIGJlIG91dCBvZiBzY29wZSBmb3IgdGhlCitzdGFuZGFyZCBsaWJyYXJ5LCBnaXZlbiB0aGUgbXVsdGlwbGljaXR5IG9mIHNoZWxscyBvdXQgdGhlcmUpLCBpdCBkb2VzIGFsbG93Cit5b3UgdG8gcGVyZm9ybSBwcm9jZXNzaW5nIG9mIGNvbW1hbmQgbGluZXMgbW9yZSBlYXNpbHkgdGhhbiB5b3UgY291bGQKK290aGVyd2lzZS4gIFRvIGlsbHVzdHJhdGUsIHlvdSBjYW4gc2VlIHRoZSBkaWZmZXJlbmNlIGluIHRoZSBmb2xsb3dpbmcgc25pcHBldDo6CisKKyAgICBpbXBvcnQgc2hsZXgKKworICAgIGZvciBwdW5jdCBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICBpZiBwdW5jdDoKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAnT2xkJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWVzc2FnZSA9ICdOZXcnCisgICAgICAgIHRleHQgPSAiYSAmJiBiOyBjICYmIGQgfHwgZTsgZiA+J2FiYyc7IChkZWYgXCJnaGlcIikiCisgICAgICAgIHMgPSBzaGxleC5zaGxleCh0ZXh0LCBwdW5jdHVhdGlvbl9jaGFycz1wdW5jdCkKKyAgICAgICAgcHJpbnQoJyVzOiAlcycgJSAobWVzc2FnZSwgbGlzdChzKSkpCisKK3doaWNoIHByaW50cyBvdXQ6OgorCisgICAgT2xkOiBbJ2EnLCAnJicsICcmJywgJ2InLCAnOycsICdjJywgJyYnLCAnJicsICdkJywgJ3wnLCAnfCcsICdlJywgJzsnLCAnZicsICc+JywgIidhYmMnIiwgJzsnLCAnKCcsICdkZWYnLCAnImdoaSInLCAnKSddCisgICAgTmV3OiBbJ2EnLCAnJiYnLCAnYicsICc7JywgJ2MnLCAnJiYnLCAnZCcsICd8fCcsICdlJywgJzsnLCAnZicsICc+JywgIidhYmMnIiwgJzsnLCAnKCcsICdkZWYnLCAnImdoaSInLCAnKSddCisKK09mIGNvdXJzZSwgdG9rZW5zIHdpbGwgYmUgcmV0dXJuZWQgd2hpY2ggYXJlIG5vdCB2YWxpZCBmb3Igc2hlbGxzLCBhbmQgeW91J2xsCituZWVkIHRvIGltcGxlbWVudCB5b3VyIG93biBlcnJvciBjaGVja3Mgb24gdGhlIHJldHVybmVkIHRva2Vucy4KKworSW5zdGVhZCBvZiBwYXNzaW5nIGBgVHJ1ZWBgIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIHB1bmN0dWF0aW9uX2NoYXJzIHBhcmFtZXRlciwKK3lvdSBjYW4gcGFzcyBhIHN0cmluZyB3aXRoIHNwZWNpZmljIGNoYXJhY3RlcnMsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUKK3doaWNoIGNoYXJhY3RlcnMgY29uc3RpdHV0ZSBwdW5jdHVhdGlvbi4gRm9yIGV4YW1wbGU6OgorCisgICAgPj4+IGltcG9ydCBzaGxleAorICAgID4+PiBzID0gc2hsZXguc2hsZXgoImEgJiYgYiB8fCBjIiwgcHVuY3R1YXRpb25fY2hhcnM9InwiKQorICAgID4+PiBsaXN0KHMpCisgICAgWydhJywgJyYnLCAnJicsICdiJywgJ3x8JywgJ2MnXQorCisuLiBub3RlOjogV2hlbiBgYHB1bmN0dWF0aW9uX2NoYXJzYGAgaXMgc3BlY2lmaWVkLCB0aGUgOmF0dHI6YH5zaGxleC53b3JkY2hhcnNgCisgICBhdHRyaWJ1dGUgaXMgYXVnbWVudGVkIHdpdGggdGhlIGNoYXJhY3RlcnMgYGB+LS4vKj89YGAuICBUaGF0IGlzIGJlY2F1c2UgdGhlc2UKKyAgIGNoYXJhY3RlcnMgY2FuIGFwcGVhciBpbiBmaWxlIG5hbWVzIChpbmNsdWRpbmcgd2lsZGNhcmRzKSBhbmQgY29tbWFuZC1saW5lCisgICBhcmd1bWVudHMgKGUuZy4gYGAtLWNvbG9yPWF1dG9gYCkuIEhlbmNlOjoKKworICAgICAgPj4+IGltcG9ydCBzaGxleAorICAgICAgPj4+IHMgPSBzaGxleC5zaGxleCgnfi9hICYmIGItYyAtLWNvbG9yPWF1dG8gfHwgZCAqLnB5PycsCisgICAgICAuLi4gICAgICAgICAgICAgICAgIHB1bmN0dWF0aW9uX2NoYXJzPVRydWUpCisgICAgICA+Pj4gbGlzdChzKQorICAgICAgWyd+L2EnLCAnJiYnLCAnYi1jJywgJy0tY29sb3I9YXV0bycsICd8fCcsICdkJywgJyoucHk/J10KKworCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zaHV0aWwucnN0IGIvRG9jL2xpYnJhcnkvc2h1dGlsLnJzdAppbmRleCBhMWNmMjQxLi5mZWZkNmFiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zaHV0aWwucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NodXRpbC5yc3QKQEAgLTQyNSw3ICs0MjUsNyBAQAogICAgaW1wb3J0IGxvZ2dpbmcKIAogICAgZGVmIF9sb2dwYXRoKHBhdGgsIG5hbWVzKToKLSAgICAgICBsb2dnaW5nLmluZm8oJ1dvcmtpbmcgaW4gJXMnICUgcGF0aCkKKyAgICAgICBsb2dnaW5nLmluZm8oJ1dvcmtpbmcgaW4gJXMnLCBwYXRoKQogICAgICAgIHJldHVybiBbXSAgICMgbm90aGluZyB3aWxsIGJlIGlnbm9yZWQKIAogICAgY29weXRyZWUoc291cmNlLCBkZXN0aW5hdGlvbiwgaWdub3JlPV9sb2dwYXRoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc2l0ZS5yc3QgYi9Eb2MvbGlicmFyeS9zaXRlLnJzdAppbmRleCAwYTczZjVhLi40M2RhZjc5IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zaXRlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zaXRlLnJzdApAQCAtNTIsNyArNTIsOCBAQAogQSBwYXRoIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBhIGZpbGUgd2hvc2UgbmFtZSBoYXMgdGhlIGZvcm0gOmZpbGU6YHtuYW1lfS5wdGhgCiBhbmQgZXhpc3RzIGluIG9uZSBvZiB0aGUgZm91ciBkaXJlY3RvcmllcyBtZW50aW9uZWQgYWJvdmU7IGl0cyBjb250ZW50cyBhcmUKIGFkZGl0aW9uYWwgaXRlbXMgKG9uZSBwZXIgbGluZSkgdG8gYmUgYWRkZWQgdG8gYGBzeXMucGF0aGBgLiAgTm9uLWV4aXN0aW5nIGl0ZW1zCi1hcmUgbmV2ZXIgYWRkZWQgdG8gYGBzeXMucGF0aGBgLiAgTm8gaXRlbSBpcyBhZGRlZCB0byBgYHN5cy5wYXRoYGAgbW9yZSB0aGFuCithcmUgbmV2ZXIgYWRkZWQgdG8gYGBzeXMucGF0aGBgLCBhbmQgbm8gY2hlY2sgaXMgbWFkZSB0aGF0IHRoZSBpdGVtIHJlZmVycyB0byBhCitkaXJlY3RvcnkgcmF0aGVyIHRoYW4gYSBmaWxlLiAgTm8gaXRlbSBpcyBhZGRlZCB0byBgYHN5cy5wYXRoYGAgbW9yZSB0aGFuCiBvbmNlLiAgQmxhbmsgbGluZXMgYW5kIGxpbmVzIGJlZ2lubmluZyB3aXRoIGBgI2BgIGFyZSBza2lwcGVkLiAgTGluZXMgc3RhcnRpbmcKIHdpdGggYGBpbXBvcnRgYCAoZm9sbG93ZWQgYnkgc3BhY2Ugb3IgdGFiKSBhcmUgZXhlY3V0ZWQuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NtdHBkLnJzdCBiL0RvYy9saWJyYXJ5L3NtdHBkLnJzdAppbmRleCBhMDk2ZGUwLi5lMzgzMjAxIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zbXRwZC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc210cGQucnN0CkBAIC0yOSw3ICsyOSw3IEBACiAKIAogLi4gY2xhc3M6OiBTTVRQU2VydmVyKGxvY2FsYWRkciwgcmVtb3RlYWRkciwgZGF0YV9zaXplX2xpbWl0PTMzNTU0NDMyLFwKLSAgICAgICAgICAgICAgICAgICAgICBtYXA9Tm9uZSwgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1UcnVlKQorICAgICAgICAgICAgICAgICAgICAgIG1hcD1Ob25lLCBlbmFibGVfU01UUFVURjg9RmFsc2UsIGRlY29kZV9kYXRhPUZhbHNlKQogCiAgICBDcmVhdGUgYSBuZXcgOmNsYXNzOmBTTVRQU2VydmVyYCBvYmplY3QsIHdoaWNoIGJpbmRzIHRvIGxvY2FsIGFkZHJlc3MKICAgICpsb2NhbGFkZHIqLiAgSXQgd2lsbCB0cmVhdCAqcmVtb3RlYWRkciogYXMgYW4gdXBzdHJlYW0gU01UUCByZWxheWVyLiAgQm90aApAQCAtNDYsMjAgKzQ2LDE5IEBACiAgICBnbG9iYWwgc29ja2V0IG1hcCBpcyB1c2VkLgogCiAgICAqZW5hYmxlX1NNVFBVVEY4KiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGBgU01UUFVURjhgYCBleHRlbnNpb24gKGFzIGRlZmluZWQKLSAgIGluIDpSRkM6YDY1MzFgKSBzaG91bGQgYmUgZW5hYmxlZC4gIFRoZSBkZWZhdWx0IGlzIGBgRmFsc2VgYC4gIElmIHNldCB0bwotICAgYGBUcnVlYGAsICpkZWNvZGVfZGF0YSogbXVzdCBiZSBgYEZhbHNlYGAgKG90aGVyd2lzZSBhbiBlcnJvciBpcyByYWlzZWQpLgorICAgaW4gOlJGQzpgNjUzMWApIHNob3VsZCBiZSBlbmFibGVkLiAgVGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgLgogICAgV2hlbiBgYFRydWVgYCwgYGBTTVRQVVRGOGBgIGlzIGFjY2VwdGVkIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBgYE1BSUxgYAogICAgY29tbWFuZCBhbmQgd2hlbiBwcmVzZW50IGlzIHBhc3NlZCB0byA6bWV0aDpgcHJvY2Vzc19tZXNzYWdlYCBpbiB0aGUKLSAgIGBga3dhcmdzWydtYWlsX29wdGlvbnMnXWBgIGxpc3QuCisgICBgYGt3YXJnc1snbWFpbF9vcHRpb25zJ11gYCBsaXN0LiAgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCoKKyAgIGNhbm5vdCBiZSBzZXQgdG8gYGBUcnVlYGAgYXQgdGhlIHNhbWUgdGltZS4KIAogICAgKmRlY29kZV9kYXRhKiBzcGVjaWZpZXMgd2hldGhlciB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBTTVRQIHRyYW5zYWN0aW9uCi0gICBzaG91bGQgYmUgZGVjb2RlZCB1c2luZyBVVEYtOC4gIFRoZSBkZWZhdWx0IGlzIGBgVHJ1ZWBgIGZvciBiYWNrd2FyZAotICAgY29tcGF0aWJpbGl0eSByZWFzb25zLCBidXQgd2lsbCBjaGFuZ2UgdG8gYGBGYWxzZWBgIGluIFB5dGhvbiAzLjY7IHNwZWNpZnkKLSAgIHRoZSBrZXl3b3JkIHZhbHVlIGV4cGxpY2l0bHkgdG8gYXZvaWQgdGhlIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2AuICBXaGVuCi0gICAqZGVjb2RlX2RhdGEqIGlzIHNldCB0byBgYEZhbHNlYGAgdGhlIHNlcnZlciBhZHZlcnRpc2VzIHRoZSBgYDhCSVRNSU1FYGAKKyAgIHNob3VsZCBiZSBkZWNvZGVkIHVzaW5nIFVURi04LiAgV2hlbiAqZGVjb2RlX2RhdGEqIGlzIGBgRmFsc2VgYCAodGhlCisgICBkZWZhdWx0KSwgdGhlIHNlcnZlciBhZHZlcnRpc2VzIHRoZSBgYDhCSVRNSU1FYGAKICAgIGV4dGVuc2lvbiAoOnJmYzpgNjE1MmApLCBhY2NlcHRzIHRoZSBgYEJPRFk9OEJJVE1JTUVgYCBwYXJhbWV0ZXIgdG8KICAgIHRoZSBgYE1BSUxgYCBjb21tYW5kLCBhbmQgd2hlbiBwcmVzZW50IHBhc3NlcyBpdCB0byA6bWV0aDpgcHJvY2Vzc19tZXNzYWdlYAotICAgaW4gdGhlIGBga3dhcmdzWydtYWlsX29wdGlvbnMnXWBgIGxpc3QuCisgICBpbiB0aGUgYGBrd2FyZ3NbJ21haWxfb3B0aW9ucyddYGAgbGlzdC4gKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCoKKyAgIGNhbm5vdCBiZSBzZXQgdG8gYGBUcnVlYGAgYXQgdGhlIHNhbWUgdGltZS4KIAogICAgLi4gbWV0aG9kOjogcHJvY2Vzc19tZXNzYWdlKHBlZXIsIG1haWxmcm9tLCByY3B0dG9zLCBkYXRhLCAqKmt3YXJncykKIApAQCAtNzYsOSArNzUsOCBAQAogICAgICAgd2lsbCBiZSBhIGJ5dGVzIG9iamVjdC4KIAogICAgICAgKmt3YXJncyogaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gSXQgaXMgZW1wdHkKLSAgICAgIHVubGVzcyBhdCBsZWFzdCBvbmUgb2YgYGBkZWNvZGVfZGF0YT1GYWxzZWBgIG9yIGBgZW5hYmxlX1NNVFBVVEY4PVRydWVgYAotICAgICAgd2FzIGdpdmVuIGFzIGFuIGluaXQgcGFyYW1ldGVyLCBpbiB3aGljaCBjYXNlIGl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLSAgICAgIGtleXM6CisgICAgICBpZiBgYGRlY29kZV9kYXRhPVRydWVgYCB3YXMgZ2l2ZW4gYXMgYW4gaW5pdCBhcmd1bWVudCwgb3RoZXJ3aXNlCisgICAgICBpdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGtleXM6CiAKICAgICAgICAgICAqbWFpbF9vcHRpb25zKjoKICAgICAgICAgICAgICBhIGxpc3Qgb2YgYWxsIHJlY2VpdmVkIHBhcmFtZXRlcnMgdG8gdGhlIGBgTUFJTGBgCkBAIC0xMDksOSArMTA3LDEyIEBACiAgICAgICAqbG9jYWxhZGRyKiBhbmQgKnJlbW90ZWFkZHIqIG1heSBub3cgY29udGFpbiBJUHY2IGFkZHJlc3Nlcy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy41Ci0gICAgICB0aGUgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogY29uc3RydWN0b3IgYXJndW1lbnRzLCBhbmQgdGhlCi0gICAgICAqa3dhcmdzKiBhcmd1bWVudCB0byA6bWV0aDpgcHJvY2Vzc19tZXNzYWdlYCB3aGVuIG9uZSBvciBtb3JlIG9mIHRoZXNlIGlzCi0gICAgICBzcGVjaWZpZWQuCisgICAgICBUaGUgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogY29uc3RydWN0b3IgcGFyYW1ldGVycywgYW5kIHRoZQorICAgICAgKmt3YXJncyogcGFyYW1ldGVyIHRvIDptZXRoOmBwcm9jZXNzX21lc3NhZ2VgIHdoZW4gKmRlY29kZV9kYXRhKiBpcworICAgICAgYGBGYWxzZWBgLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgKmRlY29kZV9kYXRhKiBpcyBub3cgYGBGYWxzZWBgIGJ5IGRlZmF1bHQuCiAKIAogRGVidWdnaW5nU2VydmVyIE9iamVjdHMKQEAgLTE1MSw3ICsxNTIsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAuLiBjbGFzczo6IFNNVFBDaGFubmVsKHNlcnZlciwgY29ubiwgYWRkciwgZGF0YV9zaXplX2xpbWl0PTMzNTU0NDMyLFwKLSAgICAgICAgICAgICAgICAgICAgICAgbWFwPU5vbmUsIGVuYWJsZV9TTVRQVVRGOD1GYWxzZSwgZGVjb2RlX2RhdGE9VHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgbWFwPU5vbmUsIGVuYWJsZV9TTVRQVVRGOD1GYWxzZSwgZGVjb2RlX2RhdGE9RmFsc2UpCiAKICAgIENyZWF0ZSBhIG5ldyA6Y2xhc3M6YFNNVFBDaGFubmVsYCBvYmplY3Qgd2hpY2ggbWFuYWdlcyB0aGUgY29tbXVuaWNhdGlvbgogICAgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCBhIHNpbmdsZSBTTVRQIGNsaWVudC4KQEAgLTE2MywyMiArMTY0LDI1IEBACiAgICBsaW1pdC4KIAogICAgKmVuYWJsZV9TTVRQVVRGOCogZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBgYFNNVFBVVEY4YGAgZXh0ZW5zaW9uIChhcyBkZWZpbmVkCi0gICBpbiA6UkZDOmA2NTMxYCkgc2hvdWxkIGJlIGVuYWJsZWQuICBUaGUgZGVmYXVsdCBpcyBgYEZhbHNlYGAuICBBCi0gICA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQgaWYgYm90aCAqZW5hYmxlX1NNVFBVVEY4KiBhbmQgKmRlY29kZV9kYXRhKiBhcmUKLSAgIHNldCB0byBgYFRydWVgYCBhdCB0aGUgc2FtZSB0aW1lLgorICAgaW4gOlJGQzpgNjUzMWApIHNob3VsZCBiZSBlbmFibGVkLiAgVGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgLgorICAgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogY2Fubm90IGJlIHNldCB0byBgYFRydWVgYCBhdCB0aGUgc2FtZQorICAgdGltZS4KIAogICAgQSBkaWN0aW9uYXJ5IGNhbiBiZSBzcGVjaWZpZWQgaW4gKm1hcCogdG8gYXZvaWQgdXNpbmcgYSBnbG9iYWwgc29ja2V0IG1hcC4KIAogICAgKmRlY29kZV9kYXRhKiBzcGVjaWZpZXMgd2hldGhlciB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBTTVRQIHRyYW5zYWN0aW9uCi0gICBzaG91bGQgYmUgZGVjb2RlZCB1c2luZyBVVEYtOC4gIFRoZSBkZWZhdWx0IGlzIGBgVHJ1ZWBgIGZvciBiYWNrd2FyZAotICAgY29tcGF0aWJpbGl0eSByZWFzb25zLCBidXQgd2lsbCBjaGFuZ2UgdG8gYGBGYWxzZWBgIGluIFB5dGhvbiAzLjYuICBTcGVjaWZ5Ci0gICB0aGUga2V5d29yZCB2YWx1ZSBleHBsaWNpdGx5IHRvIGF2b2lkIHRoZSA6ZXhjOmBEZXByZWNhdGlvbldhcm5pbmdgLgorICAgc2hvdWxkIGJlIGRlY29kZWQgdXNpbmcgVVRGLTguICBUaGUgZGVmYXVsdCBpcyBgYEZhbHNlYGAuCisgICAqZGVjb2RlX2RhdGEqIGFuZCAqZW5hYmxlX1NNVFBVVEY4KiBjYW5ub3QgYmUgc2V0IHRvIGBgVHJ1ZWBgIGF0IHRoZSBzYW1lCisgICB0aW1lLgogCiAgICBUbyB1c2UgYSBjdXN0b20gU01UUENoYW5uZWwgaW1wbGVtZW50YXRpb24geW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhlCiAgICA6YXR0cjpgU01UUFNlcnZlci5jaGFubmVsX2NsYXNzYCBvZiB5b3VyIDpjbGFzczpgU01UUFNlcnZlcmAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41Ci0gICAgICB0aGUgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogYXJndW1lbnRzIHdlcmUgYWRkZWQuCisgICAgICBUaGUgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogcGFyYW1ldGVycyB3ZXJlIGFkZGVkLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgKmRlY29kZV9kYXRhKiBpcyBub3cgYGBGYWxzZWBgIGJ5IGRlZmF1bHQuCiAKICAgIFRoZSA6Y2xhc3M6YFNNVFBDaGFubmVsYCBoYXMgdGhlIGZvbGxvd2luZyBpbnN0YW5jZSB2YXJpYWJsZXM6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NvY2tldC5yc3QgYi9Eb2MvbGlicmFyeS9zb2NrZXQucnN0CmluZGV4IDc5Yzc2MDkuLjY5MDlhNjQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NvY2tldC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc29ja2V0LnJzdApAQCAtMTMzLDYgKzEzMywyMiBAQAogICAgIHN0cmluZyBmb3JtYXQuIChleC4gYGBiJzEyOjIzOjM0OjQ1OjU2OjY3J2BgKSBUaGlzIHByb3RvY29sIGlzIG5vdAogICAgIHN1cHBvcnRlZCB1bmRlciBGcmVlQlNELgogCistIDpjb25zdDpgQUZfQUxHYCBpcyBhIExpbnV4LW9ubHkgc29ja2V0IGJhc2VkIGludGVyZmFjZSB0byBLZXJuZWwKKyAgY3J5cHRvZ3JhcGh5LiBBbiBhbGdvcml0aG0gc29ja2V0IGlzIGNvbmZpZ3VyZWQgd2l0aCBhIHR1cGxlIG9mIHR3byB0byBmb3VyCisgIGVsZW1lbnRzIGBgKHR5cGUsIG5hbWUgWywgZmVhdCBbLCBtYXNrXV0pYGAsIHdoZXJlOgorCisgIC0gKnR5cGUqIGlzIHRoZSBhbGdvcml0aG0gdHlwZSBhcyBzdHJpbmcsIGUuZy4gYGBhZWFkYGAsIGBgaGFzaGBgLAorICAgIGBgc2tjaXBoZXJgYCBvciBgYHJuZ2BgLgorCisgIC0gKm5hbWUqIGlzIHRoZSBhbGdvcml0aG0gbmFtZSBhbmQgb3BlcmF0aW9uIG1vZGUgYXMgc3RyaW5nLCBlLmcuCisgICAgYGBzaGEyNTZgYCwgYGBobWFjKHNoYTI1NilgYCwgYGBjYmMoYWVzKWBgIG9yIGBgZHJiZ19ub3ByX2N0cl9hZXMyNTZgYC4KKworICAtICpmZWF0KiBhbmQgKm1hc2sqIGFyZSB1bnNpZ25lZCAzMmJpdCBpbnRlZ2Vycy4KKworICBBdmFpbGFiaWxpdHkgTGludXggMi42LjM4LCBzb21lIGFsZ29yaXRobSB0eXBlcyByZXF1aXJlIG1vcmUgcmVjZW50IEtlcm5lbHMuCisKKyAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIC0gQ2VydGFpbiBvdGhlciBhZGRyZXNzIGZhbWlsaWVzICg6Y29uc3Q6YEFGX1BBQ0tFVGAsIDpjb25zdDpgQUZfQ0FOYCkKICAgc3VwcG9ydCBzcGVjaWZpYyByZXByZXNlbnRhdGlvbnMuCiAKQEAgLTI4Myw2ICsyOTksMTAgQEAKICAgIGluIHRoZSBVbml4IGhlYWRlciBmaWxlcyBhcmUgZGVmaW5lZDsgZm9yIGEgZmV3IHN5bWJvbHMsIGRlZmF1bHQgdmFsdWVzIGFyZQogICAgcHJvdmlkZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBgYFNPX0RPTUFJTmBgLCBgYFNPX1BST1RPQ09MYGAsIGBgU09fUEVFUlNFQ2BgLCBgYFNPX1BBU1NTRUNgYAorICAgICAgd2VyZSBhZGRlZC4KKwogLi4gZGF0YTo6IEFGX0NBTgogICAgICAgICAgIFBGX0NBTgogICAgICAgICAgIFNPTF9DQU5fKgpAQCAtMzMxLDE4ICszNTEsMzMgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogCiAKLS4uIGRhdGE6OiBTSU9fKgorLi4gZGF0YTo6IFNJT19SQ1ZBTEwKKyAgICAgICAgICBTSU9fS0VFUEFMSVZFX1ZBTFMKKyAgICAgICAgICBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRICiAgICAgICAgICAgUkNWQUxMXyoKIAogICAgQ29uc3RhbnRzIGZvciBXaW5kb3dzJyBXU0FJb2N0bCgpLiBUaGUgY29uc3RhbnRzIGFyZSB1c2VkIGFzIGFyZ3VtZW50cyB0byB0aGUKICAgIDptZXRoOmB+c29ja2V0LnNvY2tldC5pb2N0bGAgbWV0aG9kIG9mIHNvY2tldCBvYmplY3RzLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgYGBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIYGAgd2FzIGFkZGVkLgorCiAKIC4uIGRhdGE6OiBUSVBDXyoKIAogICAgVElQQyByZWxhdGVkIGNvbnN0YW50cywgbWF0Y2hpbmcgdGhlIG9uZXMgZXhwb3J0ZWQgYnkgdGhlIEMgc29ja2V0IEFQSS4gU2VlCiAgICB0aGUgVElQQyBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCisuLiBkYXRhOjogQUZfQUxHCisgICAgICAgICAgU09MX0FMRworICAgICAgICAgIEFMR18qCisKKyAgIENvbnN0YW50cyBmb3IgTGludXggS2VybmVsIGNyeXB0b2dyYXBoeS4KKworICAgQXZhaWxhYmlsaXR5OiBMaW51eCA+PSAyLjYuMzguCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAuLiBkYXRhOjogQUZfTElOSwogCiAgIEF2YWlsYWJpbGl0eTogQlNELCBPU1guCkBAIC04NzQsNiArOTA5LDEwIEBACiAgICBpdCBpcyByZWNvbW1lbmRlZCB0byA6bWV0aDpgY2xvc2VgIHRoZW0gZXhwbGljaXRseSwgb3IgdG8gdXNlIGEKICAgIDprZXl3b3JkOmB3aXRoYCBzdGF0ZW1lbnQgYXJvdW5kIHRoZW0uCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICA6ZXhjOmBPU0Vycm9yYCBpcyBub3cgcmFpc2VkIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIHRoZSB1bmRlcmx5aW5nCisgICAgICA6YzpmdW5jOmBjbG9zZWAgY2FsbCBpcyBtYWRlLgorCiAgICAuLiBub3RlOjoKIAogICAgICAgOm1ldGg6YGNsb3NlKClgIHJlbGVhc2VzIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSBjb25uZWN0aW9uIGJ1dApAQCAtOTk0LDYgKzEwMzMsMTIgQEAKICAgIE9uIG90aGVyIHBsYXRmb3JtcywgdGhlIGdlbmVyaWMgOmZ1bmM6YGZjbnRsLmZjbnRsYCBhbmQgOmZ1bmM6YGZjbnRsLmlvY3RsYAogICAgZnVuY3Rpb25zIG1heSBiZSB1c2VkOyB0aGV5IGFjY2VwdCBhIHNvY2tldCBvYmplY3QgYXMgdGhlaXIgZmlyc3QgYXJndW1lbnQuCiAKKyAgIEN1cnJlbnRseSBvbmx5IHRoZSBmb2xsb3dpbmcgY29udHJvbCBjb2RlcyBhcmUgc3VwcG9ydGVkOgorICAgYGBTSU9fUkNWQUxMYGAsIGBgU0lPX0tFRVBBTElWRV9WQUxTYGAsIGFuZCBgYFNJT19MT09QQkFDS19GQVNUX1BBVEhgYC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIGBgU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSGBgIHdhcyBhZGRlZC4KKwogLi4gbWV0aG9kOjogc29ja2V0Lmxpc3RlbihbYmFja2xvZ10pCiAKICAgIEVuYWJsZSBhIHNlcnZlciB0byBhY2NlcHQgY29ubmVjdGlvbnMuICBJZiAqYmFja2xvZyogaXMgc3BlY2lmaWVkLCBpdCBtdXN0CkBAIC0xMjc3LDYgKzEzMjIsMTUgQEAKICAgICAgIGFuIGV4Y2VwdGlvbiwgdGhlIG1ldGhvZCBub3cgcmV0cmllcyB0aGUgc3lzdGVtIGNhbGwgaW5zdGVhZCBvZiByYWlzaW5nCiAgICAgICBhbiA6ZXhjOmBJbnRlcnJ1cHRlZEVycm9yYCBleGNlcHRpb24gKHNlZSA6cGVwOmA0NzVgIGZvciB0aGUgcmF0aW9uYWxlKS4KIAorLi4gbWV0aG9kOjogc29ja2V0LnNlbmRtc2dfYWZhbGcoW21zZ10sICosIG9wWywgaXZbLCBhc3NvY2xlblssIGZsYWdzXV1dKQorCisgICBTcGVjaWFsaXplZCB2ZXJzaW9uIG9mIDptZXRoOmB+c29ja2V0LnNlbmRtc2dgIGZvciA6Y29uc3Q6YEFGX0FMR2Agc29ja2V0LgorICAgU2V0IG1vZGUsIElWLCBBRUFEIGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggYW5kIGZsYWdzIGZvciA6Y29uc3Q6YEFGX0FMR2Agc29ja2V0LgorCisgICBBdmFpbGFiaWxpdHk6IExpbnV4ID49IDIuNi4zOAorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogLi4gbWV0aG9kOjogc29ja2V0LnNlbmRmaWxlKGZpbGUsIG9mZnNldD0wLCBjb3VudD1Ob25lKQogCiAgICBTZW5kIGEgZmlsZSB1bnRpbCBFT0YgaXMgcmVhY2hlZCBieSB1c2luZyBoaWdoLXBlcmZvcm1hbmNlCkBAIC0xMzI1LDIxICsxMzc5LDI5IEBACiAgICBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgdGhlIDpyZWY6YG5vdGVzIG9uIHNvY2tldCB0aW1lb3V0cyA8c29ja2V0LXRpbWVvdXRzPmAuCiAKIAotLi4gbWV0aG9kOjogc29ja2V0LnNldHNvY2tvcHQobGV2ZWwsIG9wdG5hbWUsIHZhbHVlKQorLi4gbWV0aG9kOjogc29ja2V0LnNldHNvY2tvcHQobGV2ZWwsIG9wdG5hbWUsIHZhbHVlOiBpbnQpCisuLiBtZXRob2Q6OiBzb2NrZXQuc2V0c29ja29wdChsZXZlbCwgb3B0bmFtZSwgdmFsdWU6IGJ1ZmZlcikKKy4uIG1ldGhvZDo6IHNvY2tldC5zZXRzb2Nrb3B0KGxldmVsLCBvcHRuYW1lLCBOb25lLCBvcHRsZW46IGludCkKIAogICAgLi4gaW5kZXg6OiBtb2R1bGU6IHN0cnVjdAogCiAgICBTZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBzb2NrZXQgb3B0aW9uIChzZWUgdGhlIFVuaXggbWFudWFsIHBhZ2UKICAgIDptYW5wYWdlOmBzZXRzb2Nrb3B0KDIpYCkuICBUaGUgbmVlZGVkIHN5bWJvbGljIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB0aGUKLSAgIDptb2Q6YHNvY2tldGAgbW9kdWxlICg6Y29uc3Q6YFNPX1wqYCBldGMuKS4gIFRoZSB2YWx1ZSBjYW4gYmUgYW4gaW50ZWdlciBvcgotICAgYSA6dGVybTpgYnl0ZXMtbGlrZSBvYmplY3RgIHJlcHJlc2VudGluZyBhIGJ1ZmZlci4gIEluIHRoZSBsYXR0ZXIgY2FzZSBpdCBpcwotICAgdXAgdG8gdGhlIGNhbGxlciB0bwotICAgZW5zdXJlIHRoYXQgdGhlIGJ5dGVzdHJpbmcgY29udGFpbnMgdGhlIHByb3BlciBiaXRzIChzZWUgdGhlIG9wdGlvbmFsIGJ1aWx0LWluCi0gICBtb2R1bGUgOm1vZDpgc3RydWN0YCBmb3IgYSB3YXkgdG8gZW5jb2RlIEMgc3RydWN0dXJlcyBhcyBieXRlc3RyaW5ncykuCisgICA6bW9kOmBzb2NrZXRgIG1vZHVsZSAoOmNvbnN0OmBTT19cKmAgZXRjLikuICBUaGUgdmFsdWUgY2FuIGJlIGFuIGludGVnZXIsCisgICBOb25lIG9yIGEgOnRlcm06YGJ5dGVzLWxpa2Ugb2JqZWN0YCByZXByZXNlbnRpbmcgYSBidWZmZXIuIEluIHRoZSBsYXRlcgorICAgY2FzZSBpdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBieXRlc3RyaW5nIGNvbnRhaW5zIHRoZQorICAgcHJvcGVyIGJpdHMgKHNlZSB0aGUgb3B0aW9uYWwgYnVpbHQtaW4gbW9kdWxlIDptb2Q6YHN0cnVjdGAgZm9yIGEgd2F5IHRvCisgICBlbmNvZGUgQyBzdHJ1Y3R1cmVzIGFzIGJ5dGVzdHJpbmdzKS4gV2hlbiB2YWx1ZSBpcyBzZXQgdG8gTm9uZSwKKyAgIG9wdGxlbiBhcmd1bWVudCBpcyByZXF1aXJlZC4gSXQncyBlcXVpdmFsZW50IHRvIGNhbGwgc2V0c29ja29wdCBDCisgICBmdW5jdGlvbiB3aXRoIG9wdHZhbD1OVUxMIGFuZCBvcHRsZW49b3B0bGVuLgorCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAgICAgICBXcml0YWJsZSA6dGVybTpgYnl0ZXMtbGlrZSBvYmplY3RgIGlzIG5vdyBhY2NlcHRlZC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIHNldHNvY2tvcHQobGV2ZWwsIG9wdG5hbWUsIE5vbmUsIG9wdGxlbjogaW50KSBmb3JtIGFkZGVkLgorCiAKIC4uIG1ldGhvZDo6IHNvY2tldC5zaHV0ZG93bihob3cpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NvY2tldHNlcnZlci5yc3QgYi9Eb2MvbGlicmFyeS9zb2NrZXRzZXJ2ZXIucnN0CmluZGV4IDA4N2Y0ZTAuLjIxOGEzMWMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NvY2tldHNlcnZlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc29ja2V0c2VydmVyLnJzdApAQCAtNTIsMTEgKzUyLDEyIEBACiBvdmVycmlkaW5nIGl0cyA6bWV0aDpgfkJhc2VSZXF1ZXN0SGFuZGxlci5oYW5kbGVgIG1ldGhvZDsKIHRoaXMgbWV0aG9kIHdpbGwgcHJvY2VzcyBpbmNvbWluZwogcmVxdWVzdHMuICBTZWNvbmQsIHlvdSBtdXN0IGluc3RhbnRpYXRlIG9uZSBvZiB0aGUgc2VydmVyIGNsYXNzZXMsIHBhc3NpbmcgaXQKLXRoZSBzZXJ2ZXIncyBhZGRyZXNzIGFuZCB0aGUgcmVxdWVzdCBoYW5kbGVyIGNsYXNzLiAgVGhlbiBjYWxsIHRoZQordGhlIHNlcnZlcidzIGFkZHJlc3MgYW5kIHRoZSByZXF1ZXN0IGhhbmRsZXIgY2xhc3MuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQordGhlIHNlcnZlciBpbiBhIDprZXl3b3JkOmB3aXRoYCBzdGF0ZW1lbnQuIFRoZW4gY2FsbCB0aGUKIDptZXRoOmB+QmFzZVNlcnZlci5oYW5kbGVfcmVxdWVzdGAgb3IKIDptZXRoOmB+QmFzZVNlcnZlci5zZXJ2ZV9mb3JldmVyYCBtZXRob2Qgb2YgdGhlIHNlcnZlciBvYmplY3QgdG8KIHByb2Nlc3Mgb25lIG9yIG1hbnkgcmVxdWVzdHMuICBGaW5hbGx5LCBjYWxsIDptZXRoOmB+QmFzZVNlcnZlci5zZXJ2ZXJfY2xvc2VgCi10byBjbG9zZSB0aGUgc29ja2V0LgordG8gY2xvc2UgdGhlIHNvY2tldCAodW5sZXNzIHlvdSB1c2VkIGEgOmtleXdvcmQ6YHdpdGhgIHN0YXRlbWVudCkuCiAKIFdoZW4gaW5oZXJpdGluZyBmcm9tIDpjbGFzczpgVGhyZWFkaW5nTWl4SW5gIGZvciB0aHJlYWRlZCBjb25uZWN0aW9uIGJlaGF2aW9yLAogeW91IHNob3VsZCBleHBsaWNpdGx5IGRlY2xhcmUgaG93IHlvdSB3YW50IHlvdXIgdGhyZWFkcyB0byBiZWhhdmUgb24gYW4gYWJydXB0CkBAIC0xMTEsNiArMTEyLDggQEAKICAgIDpjbGFzczpgVURQU2VydmVyYC4gIFNldHRpbmcgdGhlIHZhcmlvdXMgYXR0cmlidXRlcyBhbHNvIGNoYW5nZXMgdGhlCiAgICBiZWhhdmlvciBvZiB0aGUgdW5kZXJseWluZyBzZXJ2ZXIgbWVjaGFuaXNtLgogCisgICA6Y2xhc3M6YEZvcmtpbmdNaXhJbmAgYW5kIHRoZSBGb3JraW5nIGNsYXNzZXMgbWVudGlvbmVkIGJlbG93IGFyZQorICAgb25seSBhdmFpbGFibGUgb24gUE9TSVggcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCA6ZnVuYzpgfm9zLmZvcmtgLgogCiAuLiBjbGFzczo6IEZvcmtpbmdUQ1BTZXJ2ZXIKICAgICAgICAgICAgRm9ya2luZ1VEUFNlcnZlcgpAQCAtMzA0LDcgKzMwNywxMSBAQAogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaWYgdGhlIDptZXRoOmB+QmFzZVJlcXVlc3RIYW5kbGVyLmhhbmRsZWAKICAgICAgIG1ldGhvZCBvZiBhIDphdHRyOmBSZXF1ZXN0SGFuZGxlckNsYXNzYCBpbnN0YW5jZSByYWlzZXMKICAgICAgIGFuIGV4Y2VwdGlvbi4gIFRoZSBkZWZhdWx0IGFjdGlvbiBpcyB0byBwcmludCB0aGUgdHJhY2ViYWNrIHRvCi0gICAgICBzdGFuZGFyZCBvdXRwdXQgYW5kIGNvbnRpbnVlIGhhbmRsaW5nIGZ1cnRoZXIgcmVxdWVzdHMuCisgICAgICBzdGFuZGFyZCBlcnJvciBhbmQgY29udGludWUgaGFuZGxpbmcgZnVydGhlciByZXF1ZXN0cy4KKworICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICAgIE5vdyBvbmx5IGNhbGxlZCBmb3IgZXhjZXB0aW9ucyBkZXJpdmVkIGZyb20gdGhlIDpleGM6YEV4Y2VwdGlvbmAKKyAgICAgICAgIGNsYXNzLgogCiAKICAgIC4uIG1ldGhvZDo6IGhhbmRsZV90aW1lb3V0KCkKQEAgLTM0OSw2ICszNTYsMTEgQEAKICAgICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgOmNvbnN0OmBUcnVlYC4KIAogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgU3VwcG9ydCBmb3IgdGhlIDp0ZXJtOmBjb250ZXh0IG1hbmFnZXJgIHByb3RvY29sIHdhcyBhZGRlZC4gIEV4aXRpbmcgdGhlCisgICAgICBjb250ZXh0IG1hbmFnZXIgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIDptZXRoOmBzZXJ2ZXJfY2xvc2VgLgorCisKIFJlcXVlc3QgSGFuZGxlciBPYmplY3RzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zOTcsNiArNDA5LDE1IEBACiAgICByZWFkIG9yIHdyaXR0ZW4sIHJlc3BlY3RpdmVseSwgdG8gZ2V0IHRoZSByZXF1ZXN0IGRhdGEgb3IgcmV0dXJuIGRhdGEKICAgIHRvIHRoZSBjbGllbnQuCiAKKyAgIFRoZSA6YXR0cjpgcmZpbGVgIGF0dHJpYnV0ZXMgb2YgYm90aCBjbGFzc2VzIHN1cHBvcnQgdGhlCisgICA6Y2xhc3M6YGlvLkJ1ZmZlcmVkSU9CYXNlYCByZWFkYWJsZSBpbnRlcmZhY2UsIGFuZAorICAgOmF0dHI6YERhdGFncmFtUmVxdWVzdEhhbmRsZXIud2ZpbGVgIHN1cHBvcnRzIHRoZQorICAgOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgd3JpdGFibGUgaW50ZXJmYWNlLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgOmF0dHI6YFN0cmVhbVJlcXVlc3RIYW5kbGVyLndmaWxlYCBhbHNvIHN1cHBvcnRzIHRoZQorICAgICAgOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgd3JpdGFibGUgaW50ZXJmYWNlLgorCiAKIEV4YW1wbGVzCiAtLS0tLS0tLQpAQCAtNDI5LDExICs0NTAsMTAgQEAKICAgICAgICBIT1NULCBQT1JUID0gImxvY2FsaG9zdCIsIDk5OTkKIAogICAgICAgICMgQ3JlYXRlIHRoZSBzZXJ2ZXIsIGJpbmRpbmcgdG8gbG9jYWxob3N0IG9uIHBvcnQgOTk5OQotICAgICAgIHNlcnZlciA9IHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKEhPU1QsIFBPUlQpLCBNeVRDUEhhbmRsZXIpCi0KLSAgICAgICAjIEFjdGl2YXRlIHRoZSBzZXJ2ZXI7IHRoaXMgd2lsbCBrZWVwIHJ1bm5pbmcgdW50aWwgeW91Ci0gICAgICAgIyBpbnRlcnJ1cHQgdGhlIHByb2dyYW0gd2l0aCBDdHJsLUMKLSAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisgICAgICAgd2l0aCBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKChIT1NULCBQT1JUKSwgTXlUQ1BIYW5kbGVyKSBhcyBzZXJ2ZXI6CisgICAgICAgICAgICMgQWN0aXZhdGUgdGhlIHNlcnZlcjsgdGhpcyB3aWxsIGtlZXAgcnVubmluZyB1bnRpbCB5b3UKKyAgICAgICAgICAgIyBpbnRlcnJ1cHQgdGhlIHByb2dyYW0gd2l0aCBDdHJsLUMKKyAgICAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQogCiBBbiBhbHRlcm5hdGl2ZSByZXF1ZXN0IGhhbmRsZXIgY2xhc3MgdGhhdCBtYWtlcyB1c2Ugb2Ygc3RyZWFtcyAoZmlsZS1saWtlCiBvYmplY3RzIHRoYXQgc2ltcGxpZnkgY29tbXVuaWNhdGlvbiBieSBwcm92aWRpbmcgdGhlIHN0YW5kYXJkIGZpbGUgaW50ZXJmYWNlKTo6CkBAIC01MjUsOCArNTQ1LDggQEAKIAogICAgaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICAgICBIT1NULCBQT1JUID0gImxvY2FsaG9zdCIsIDk5OTkKLSAgICAgICBzZXJ2ZXIgPSBzb2NrZXRzZXJ2ZXIuVURQU2VydmVyKChIT1NULCBQT1JUKSwgTXlVRFBIYW5kbGVyKQotICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICB3aXRoIHNvY2tldHNlcnZlci5VRFBTZXJ2ZXIoKEhPU1QsIFBPUlQpLCBNeVVEUEhhbmRsZXIpIGFzIHNlcnZlcjoKKyAgICAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQogCiBUaGlzIGlzIHRoZSBjbGllbnQgc2lkZTo6CiAKQEAgLTU4NSwyMiArNjA1LDIyIEBACiAgICAgICAgSE9TVCwgUE9SVCA9ICJsb2NhbGhvc3QiLCAwCiAKICAgICAgICBzZXJ2ZXIgPSBUaHJlYWRlZFRDUFNlcnZlcigoSE9TVCwgUE9SVCksIFRocmVhZGVkVENQUmVxdWVzdEhhbmRsZXIpCi0gICAgICAgaXAsIHBvcnQgPSBzZXJ2ZXIuc2VydmVyX2FkZHJlc3MKKyAgICAgICB3aXRoIHNlcnZlcjoKKyAgICAgICAgICAgaXAsIHBvcnQgPSBzZXJ2ZXIuc2VydmVyX2FkZHJlc3MKIAotICAgICAgICMgU3RhcnQgYSB0aHJlYWQgd2l0aCB0aGUgc2VydmVyIC0tIHRoYXQgdGhyZWFkIHdpbGwgdGhlbiBzdGFydCBvbmUKLSAgICAgICAjIG1vcmUgdGhyZWFkIGZvciBlYWNoIHJlcXVlc3QKLSAgICAgICBzZXJ2ZXJfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLnNlcnZlX2ZvcmV2ZXIpCi0gICAgICAgIyBFeGl0IHRoZSBzZXJ2ZXIgdGhyZWFkIHdoZW4gdGhlIG1haW4gdGhyZWFkIHRlcm1pbmF0ZXMKLSAgICAgICBzZXJ2ZXJfdGhyZWFkLmRhZW1vbiA9IFRydWUKLSAgICAgICBzZXJ2ZXJfdGhyZWFkLnN0YXJ0KCkKLSAgICAgICBwcmludCgiU2VydmVyIGxvb3AgcnVubmluZyBpbiB0aHJlYWQ6Iiwgc2VydmVyX3RocmVhZC5uYW1lKQorICAgICAgICAgICAjIFN0YXJ0IGEgdGhyZWFkIHdpdGggdGhlIHNlcnZlciAtLSB0aGF0IHRocmVhZCB3aWxsIHRoZW4gc3RhcnQgb25lCisgICAgICAgICAgICMgbW9yZSB0aHJlYWQgZm9yIGVhY2ggcmVxdWVzdAorICAgICAgICAgICBzZXJ2ZXJfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLnNlcnZlX2ZvcmV2ZXIpCisgICAgICAgICAgICMgRXhpdCB0aGUgc2VydmVyIHRocmVhZCB3aGVuIHRoZSBtYWluIHRocmVhZCB0ZXJtaW5hdGVzCisgICAgICAgICAgIHNlcnZlcl90aHJlYWQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICBzZXJ2ZXJfdGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgICAgcHJpbnQoIlNlcnZlciBsb29wIHJ1bm5pbmcgaW4gdGhyZWFkOiIsIHNlcnZlcl90aHJlYWQubmFtZSkKIAotICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDEiKQotICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDIiKQotICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDMiKQorICAgICAgICAgICBjbGllbnQoaXAsIHBvcnQsICJIZWxsbyBXb3JsZCAxIikKKyAgICAgICAgICAgY2xpZW50KGlwLCBwb3J0LCAiSGVsbG8gV29ybGQgMiIpCisgICAgICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDMiKQogCi0gICAgICAgc2VydmVyLnNodXRkb3duKCkKLSAgICAgICBzZXJ2ZXIuc2VydmVyX2Nsb3NlKCkKKyAgICAgICAgICAgc2VydmVyLnNodXRkb3duKCkKIAogCiBUaGUgb3V0cHV0IG9mIHRoZSBleGFtcGxlIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6CkBAIC02MTYsMyArNjM2LDUgQEAKIAogVGhlIDpjbGFzczpgRm9ya2luZ01peEluYCBjbGFzcyBpcyB1c2VkIGluIHRoZSBzYW1lIHdheSwgZXhjZXB0IHRoYXQgdGhlIHNlcnZlcgogd2lsbCBzcGF3biBhIG5ldyBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QuCitBdmFpbGFibGUgb25seSBvbiBQT1NJWCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IDpmdW5jOmB+b3MuZm9ya2AuCisKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3Nwd2QucnN0IGIvRG9jL2xpYnJhcnkvc3B3ZC5yc3QKaW5kZXggZmQzYzlhZC4uYzZjYWQyYSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3B3ZC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3B3ZC5yc3QKQEAgLTU1LDYgKzU1LDkgQEAKIAogICAgUmV0dXJuIHRoZSBzaGFkb3cgcGFzc3dvcmQgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBnaXZlbiB1c2VyIG5hbWUuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBSYWlzZXMgYSA6ZXhjOmBQZXJtaXNzaW9uRXJyb3JgIGluc3RlYWQgb2YgOmV4YzpgS2V5RXJyb3JgIGlmIHRoZSB1c2VyCisgICAgICBkb2Vzbid0IGhhdmUgcHJpdmlsZWdlcy4KIAogLi4gZnVuY3Rpb246OiBnZXRzcGFsbCgpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0IGIvRG9jL2xpYnJhcnkvc3FsaXRlMy5yc3QKaW5kZXggZDEwMDViNS4uZDVkNmU2YiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3FsaXRlMy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3FsaXRlMy5yc3QKQEAgLTYyOSw5ICs2MjksMTYgQEAKICAgIC4uIGF0dHJpYnV0ZTo6IGxhc3Ryb3dpZAogCiAgICAgICBUaGlzIHJlYWQtb25seSBhdHRyaWJ1dGUgcHJvdmlkZXMgdGhlIHJvd2lkIG9mIHRoZSBsYXN0IG1vZGlmaWVkIHJvdy4gSXQgaXMKLSAgICAgIG9ubHkgc2V0IGlmIHlvdSBpc3N1ZWQgYW4gYGBJTlNFUlRgYCBzdGF0ZW1lbnQgdXNpbmcgdGhlIDptZXRoOmBleGVjdXRlYAotICAgICAgbWV0aG9kLiBGb3Igb3BlcmF0aW9ucyBvdGhlciB0aGFuIGBgSU5TRVJUYGAgb3Igd2hlbiA6bWV0aDpgZXhlY3V0ZW1hbnlgIGlzCi0gICAgICBjYWxsZWQsIDphdHRyOmBsYXN0cm93aWRgIGlzIHNldCB0byA6Y29uc3Q6YE5vbmVgLgorICAgICAgb25seSBzZXQgaWYgeW91IGlzc3VlZCBhbiBgYElOU0VSVGBgIG9yIGEgYGBSRVBMQUNFYGAgc3RhdGVtZW50IHVzaW5nIHRoZQorICAgICAgOm1ldGg6YGV4ZWN1dGVgIG1ldGhvZC4gIEZvciBvcGVyYXRpb25zIG90aGVyIHRoYW4gYGBJTlNFUlRgYCBvcgorICAgICAgYGBSRVBMQUNFYGAgb3Igd2hlbiA6bWV0aDpgZXhlY3V0ZW1hbnlgIGlzIGNhbGxlZCwgOmF0dHI6YGxhc3Ryb3dpZGAgaXMKKyAgICAgIHNldCB0byA6Y29uc3Q6YE5vbmVgLgorCisgICAgICBJZiB0aGUgYGBJTlNFUlRgYCBvciBgYFJFUExBQ0VgYCBzdGF0ZW1lbnQgZmFpbGVkIHRvIGluc2VydCB0aGUgcHJldmlvdXMKKyAgICAgIHN1Y2Nlc3NmdWwgcm93aWQgaXMgcmV0dXJuZWQuCisKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgYGBSRVBMQUNFYGAgc3RhdGVtZW50LgogCiAgICAuLiBhdHRyaWJ1dGU6OiBkZXNjcmlwdGlvbgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zc2wucnN0IGIvRG9jL2xpYnJhcnkvc3NsLnJzdAppbmRleCAwMWQ4NmM4Li4zNzA2YTZlIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zc2wucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NzbC5yc3QKQEAgLTQ5LDYgKzQ5LDEyIEBACiBoZWxwcyBtYW5hZ2Ugc2V0dGluZ3MgYW5kIGNlcnRpZmljYXRlcywgd2hpY2ggY2FuIHRoZW4gYmUgaW5oZXJpdGVkCiBieSBTU0wgc29ja2V0cyBjcmVhdGVkIHRocm91Z2ggdGhlIDptZXRoOmBTU0xDb250ZXh0LndyYXBfc29ja2V0YCBtZXRob2QuCiAKKy4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisKKyAgIE9wZW5TU0wgMC45LjgsIDEuMC4wIGFuZCAxLjAuMSBhcmUgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KKyAgIEluIHRoZSBmdXR1cmUgdGhlIHNzbCBtb2R1bGUgd2lsbCByZXF1aXJlIGF0IGxlYXN0IE9wZW5TU0wgMS4wLjIgb3IKKyAgIDEuMS4wLgorCiAKIEZ1bmN0aW9ucywgQ29uc3RhbnRzLCBhbmQgRXhjZXB0aW9ucwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNzksNyArMjg1LDcgQEAKIAogICAgICBSQzQgd2FzIGRyb3BwZWQgZnJvbSB0aGUgZGVmYXVsdCBjaXBoZXIgc3RyaW5nLgogCi0gICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNS4zCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgogCiAgICAgIENoYUNoYTIwL1BvbHkxMzA1IHdhcyBhZGRlZCB0byB0aGUgZGVmYXVsdCBjaXBoZXIgc3RyaW5nLgogCkBAIC0zMjIsNyArMzI4LDcgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAKLSAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjUuMworICAgLi4gZGVwcmVjYXRlZDo6IDMuNgogCiAgICAgICBPcGVuU1NMIGhhcyBkZXByZWNhdGVkIDpmdW5jOmBzc2wuUkFORF9wc2V1ZG9fYnl0ZXNgLCB1c2UKICAgICAgIDpmdW5jOmBzc2wuUkFORF9ieXRlc2AgaW5zdGVhZC4KQEAgLTU4NywxMyArNTkzLDEzIEBACiAgICBTZWxlY3RzIHRoZSBoaWdoZXN0IHByb3RvY29sIHZlcnNpb24gdGhhdCBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlciBzdXBwb3J0LgogICAgRGVzcGl0ZSB0aGUgbmFtZSwgdGhpcyBvcHRpb24gY2FuIHNlbGVjdCAiVExTIiBwcm90b2NvbHMgYXMgd2VsbCBhcyAiU1NMIi4KIAotICAgLi4gdmVyc2lvbmFkZGVkOjogMy41LjMKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgogCiAuLiBkYXRhOjogUFJPVE9DT0xfU1NMdjIzCiAKICAgIEFsaWFzIGZvciBkYXRhOmBQUk9UT0NPTF9UTFNgLgogCi0gICAuLiBkZXByZWNhdGVkOjogMy41LjMKKyAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKIAogICAgICAgVXNlIGRhdGE6YFBST1RPQ09MX1RMU2AgaW5zdGVhZC4KIApAQCAtNjA4LDcgKzYxNCw3IEBACiAKICAgICAgIFNTTCB2ZXJzaW9uIDIgaXMgaW5zZWN1cmUuICBJdHMgdXNlIGlzIGhpZ2hseSBkaXNjb3VyYWdlZC4KIAotICAgLi4gZGVwcmVjYXRlZDo6IDMuNS4zCisgICAuLiBkZXByZWNhdGVkOjogMy42CiAKICAgICAgIE9wZW5TU0wgaGFzIHJlbW92ZWQgc3VwcG9ydCBmb3IgU1NMdjIuCiAKQEAgLTYyMyw3ICs2MjksNyBAQAogCiAgICAgICBTU0wgdmVyc2lvbiAzIGlzIGluc2VjdXJlLiAgSXRzIHVzZSBpcyBoaWdobHkgZGlzY291cmFnZWQuCiAKLSAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjUuMworICAgLi4gZGVwcmVjYXRlZDo6IDMuNgogCiAgICAgICBPcGVuU1NMIGhhcyBkZXByZWNhdGVkIGFsbCB2ZXJzaW9uIHNwZWNpZmljIHByb3RvY29scy4gVXNlIHRoZSBkZWZhdWx0CiAgICAgICBwcm90b2NvbCBkYXRhOmBQUk9UT0NPTF9UTFNgIHdpdGggZmxhZ3MgbGlrZSBkYXRhOmBPUF9OT19TU0x2M2AgaW5zdGVhZC4KQEAgLTYzMiw3ICs2MzgsNyBAQAogCiAgICBTZWxlY3RzIFRMUyB2ZXJzaW9uIDEuMCBhcyB0aGUgY2hhbm5lbCBlbmNyeXB0aW9uIHByb3RvY29sLgogCi0gICAuLiBkZXByZWNhdGVkOjogMy41LjMKKyAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKIAogICAgICAgT3BlblNTTCBoYXMgZGVwcmVjYXRlZCBhbGwgdmVyc2lvbiBzcGVjaWZpYyBwcm90b2NvbHMuIFVzZSB0aGUgZGVmYXVsdAogICAgICAgcHJvdG9jb2wgZGF0YTpgUFJPVE9DT0xfVExTYCB3aXRoIGZsYWdzIGxpa2UgZGF0YTpgT1BfTk9fU1NMdjNgIGluc3RlYWQuCkBAIC02NDQsNyArNjUwLDcgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKLSAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjUuMworICAgLi4gZGVwcmVjYXRlZDo6IDMuNgogCiAgICAgICBPcGVuU1NMIGhhcyBkZXByZWNhdGVkIGFsbCB2ZXJzaW9uIHNwZWNpZmljIHByb3RvY29scy4gVXNlIHRoZSBkZWZhdWx0CiAgICAgICBwcm90b2NvbCBkYXRhOmBQUk9UT0NPTF9UTFNgIHdpdGggZmxhZ3MgbGlrZSBkYXRhOmBPUF9OT19TU0x2M2AgaW5zdGVhZC4KQEAgLTY1Nyw3ICs2NjMsNyBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIAotICAgLi4gZGVwcmVjYXRlZDo6IDMuNS4zCisgICAuLiBkZXByZWNhdGVkOjogMy42CiAKICAgICAgIE9wZW5TU0wgaGFzIGRlcHJlY2F0ZWQgYWxsIHZlcnNpb24gc3BlY2lmaWMgcHJvdG9jb2xzLiBVc2UgdGhlIGRlZmF1bHQKICAgICAgIHByb3RvY29sIGRhdGE6YFBST1RPQ09MX1RMU2Agd2l0aCBmbGFncyBsaWtlIGRhdGE6YE9QX05PX1NTTHYzYCBpbnN0ZWFkLgpAQCAtNjc4LDcgKzY4NCw3IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCi0gICAuLiBkZXByZWNhdGVkOjogMy41LjMKKyAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKIAogICAgICAgU1NMdjIgaXMgZGVwcmVjYXRlZAogCkBAIC02OTEsNyArNjk3LDcgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCiAKLSAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjUuMworICAgLi4gZGVwcmVjYXRlZDo6IDMuNgogCiAgICAgICBTU0x2MyBpcyBkZXByZWNhdGVkCiAKQEAgLTExNDksNyArMTE1NSw3IEBACiAgICAgICA6ZnVuYzpgY3JlYXRlX2RlZmF1bHRfY29udGV4dGAgbGV0cyB0aGUgOm1vZDpgc3NsYCBtb2R1bGUgY2hvb3NlCiAgICAgICBzZWN1cml0eSBzZXR0aW5ncyBmb3IgYSBnaXZlbiBwdXJwb3NlLgogCi0gICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNS4zCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgogCiAgICAgICA6ZGF0YTpgUFJPVE9DT0xfVExTYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KIApAQCAtMTI1OSw2ICsxMjY1LDYyIEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCisuLiBtZXRob2Q6OiBTU0xDb250ZXh0LmdldF9jaXBoZXJzKCkKKworICAgR2V0IGEgbGlzdCBvZiBlbmFibGVkIGNpcGhlcnMuIFRoZSBsaXN0IGlzIGluIG9yZGVyIG9mIGNpcGhlciBwcmlvcml0eS4KKyAgIFNlZSA6bWV0aDpgU1NMQ29udGV4dC5zZXRfY2lwaGVyc2AuCisKKyAgIEV4YW1wbGU6OgorCisgICAgICAgPj4+IGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgPj4+IGN0eC5zZXRfY2lwaGVycygnRUNESEUrQUVTR0NNOiFFQ0RTQScpCisgICAgICAgPj4+IGN0eC5nZXRfY2lwaGVycygpICAjIE9wZW5TU0wgMS4wLngKKyAgICAgICBbeydhbGdfYml0cyc6IDI1NiwKKyAgICAgICAgICdkZXNjcmlwdGlvbic6ICdFQ0RIRS1SU0EtQUVTMjU2LUdDTS1TSEEzODQgVExTdjEuMiBLeD1FQ0RIICAgICBBdT1SU0EgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICdFbmM9QUVTR0NNKDI1NikgTWFjPUFFQUQnLAorICAgICAgICAgJ2lkJzogNTAzODA4NDgsCisgICAgICAgICAnbmFtZSc6ICdFQ0RIRS1SU0EtQUVTMjU2LUdDTS1TSEEzODQnLAorICAgICAgICAgJ3Byb3RvY29sJzogJ1RMU3YxL1NTTHYzJywKKyAgICAgICAgICdzdHJlbmd0aF9iaXRzJzogMjU2fSwKKyAgICAgICAgeydhbGdfYml0cyc6IDEyOCwKKyAgICAgICAgICdkZXNjcmlwdGlvbic6ICdFQ0RIRS1SU0EtQUVTMTI4LUdDTS1TSEEyNTYgVExTdjEuMiBLeD1FQ0RIICAgICBBdT1SU0EgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICdFbmM9QUVTR0NNKDEyOCkgTWFjPUFFQUQnLAorICAgICAgICAgJ2lkJzogNTAzODA4NDcsCisgICAgICAgICAnbmFtZSc6ICdFQ0RIRS1SU0EtQUVTMTI4LUdDTS1TSEEyNTYnLAorICAgICAgICAgJ3Byb3RvY29sJzogJ1RMU3YxL1NTTHYzJywKKyAgICAgICAgICdzdHJlbmd0aF9iaXRzJzogMTI4fV0KKworICAgT24gT3BlblNTTCAxLjEgYW5kIG5ld2VyIHRoZSBjaXBoZXIgZGljdCBjb250YWlucyBhZGRpdGlvbmFsIGZpZWxkczo6CisgICAgICAgPj4+IGN0eC5nZXRfY2lwaGVycygpICAjIE9wZW5TU0wgMS4xKworICAgICAgIFt7J2FlYWQnOiBUcnVlLAorICAgICAgICAgJ2FsZ19iaXRzJzogMjU2LAorICAgICAgICAgJ2F1dGgnOiAnYXV0aC1yc2EnLAorICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogJ0VDREhFLVJTQS1BRVMyNTYtR0NNLVNIQTM4NCBUTFN2MS4yIEt4PUVDREggICAgIEF1PVJTQSAgJworICAgICAgICAgICAgICAgICAgICAgICAgJ0VuYz1BRVNHQ00oMjU2KSBNYWM9QUVBRCcsCisgICAgICAgICAnZGlnZXN0JzogTm9uZSwKKyAgICAgICAgICdpZCc6IDUwMzgwODQ4LAorICAgICAgICAgJ2tlYSc6ICdreC1lY2RoZScsCisgICAgICAgICAnbmFtZSc6ICdFQ0RIRS1SU0EtQUVTMjU2LUdDTS1TSEEzODQnLAorICAgICAgICAgJ3Byb3RvY29sJzogJ1RMU3YxLjInLAorICAgICAgICAgJ3N0cmVuZ3RoX2JpdHMnOiAyNTYsCisgICAgICAgICAnc3ltbWV0cmljJzogJ2Flcy0yNTYtZ2NtJ30sCisgICAgICAgIHsnYWVhZCc6IFRydWUsCisgICAgICAgICAnYWxnX2JpdHMnOiAxMjgsCisgICAgICAgICAnYXV0aCc6ICdhdXRoLXJzYScsCisgICAgICAgICAnZGVzY3JpcHRpb24nOiAnRUNESEUtUlNBLUFFUzEyOC1HQ00tU0hBMjU2IFRMU3YxLjIgS3g9RUNESCAgICAgQXU9UlNBICAnCisgICAgICAgICAgICAgICAgICAgICAgICAnRW5jPUFFU0dDTSgxMjgpIE1hYz1BRUFEJywKKyAgICAgICAgICdkaWdlc3QnOiBOb25lLAorICAgICAgICAgJ2lkJzogNTAzODA4NDcsCisgICAgICAgICAna2VhJzogJ2t4LWVjZGhlJywKKyAgICAgICAgICduYW1lJzogJ0VDREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicsCisgICAgICAgICAncHJvdG9jb2wnOiAnVExTdjEuMicsCisgICAgICAgICAnc3RyZW5ndGhfYml0cyc6IDEyOCwKKyAgICAgICAgICdzeW1tZXRyaWMnOiAnYWVzLTEyOC1nY20nfV0KKworICAgQXZhaWxhYmlsaXR5OiBPcGVuU1NMIDEuMC4yKworCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogLi4gbWV0aG9kOjogU1NMQ29udGV4dC5zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoKQogCiAgICBMb2FkIGEgc2V0IG9mIGRlZmF1bHQgImNlcnRpZmljYXRpb24gYXV0aG9yaXR5IiAoQ0EpIGNlcnRpZmljYXRlcyBmcm9tCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zdGF0aXN0aWNzLnJzdCBiL0RvYy9saWJyYXJ5L3N0YXRpc3RpY3MucnN0CmluZGV4IGVhM2Q3ZGEuLjIzMmZiNzUyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zdGF0aXN0aWNzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zdGF0aXN0aWNzLnJzdApAQCAtMzksNiArMzksOCBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiA6ZnVuYzpgbWVhbmAgICAgICAgICAgICAgQXJpdGhtZXRpYyBtZWFuICgiYXZlcmFnZSIpIG9mIGRhdGEuCis6ZnVuYzpgZ2VvbWV0cmljX21lYW5gICAgR2VvbWV0cmljIG1lYW4gb2YgZGF0YS4KKzpmdW5jOmBoYXJtb25pY19tZWFuYCAgICBIYXJtb25pYyBtZWFuIG9mIGRhdGEuCiA6ZnVuYzpgbWVkaWFuYCAgICAgICAgICAgTWVkaWFuIChtaWRkbGUgdmFsdWUpIG9mIGRhdGEuCiA6ZnVuYzpgbWVkaWFuX2xvd2AgICAgICAgTG93IG1lZGlhbiBvZiBkYXRhLgogOmZ1bmM6YG1lZGlhbl9oaWdoYCAgICAgIEhpZ2ggbWVkaWFuIG9mIGRhdGEuCkBAIC0xMTEsNiArMTEzLDY2IEBACiAgICAgICBgYG1lYW4oZGF0YSlgYCBpcyBlcXVpdmFsZW50IHRvIGNhbGN1bGF0aW5nIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbiDOvC4KIAogCisuLiBmdW5jdGlvbjo6IGdlb21ldHJpY19tZWFuKGRhdGEpCisKKyAgIFJldHVybiB0aGUgZ2VvbWV0cmljIG1lYW4gb2YgKmRhdGEqLCBhIHNlcXVlbmNlIG9yIGl0ZXJhdG9yIG9mCisgICByZWFsLXZhbHVlZCBudW1iZXJzLgorCisgICBUaGUgZ2VvbWV0cmljIG1lYW4gaXMgdGhlICpuKi10aCByb290IG9mIHRoZSBwcm9kdWN0IG9mICpuKiBkYXRhIHBvaW50cy4KKyAgIEl0IGlzIGEgdHlwZSBvZiBhdmVyYWdlLCBhIG1lYXN1cmUgb2YgdGhlIGNlbnRyYWwgbG9jYXRpb24gb2YgdGhlIGRhdGEuCisKKyAgIFRoZSBnZW9tZXRyaWMgbWVhbiBpcyBhcHByb3ByaWF0ZSB3aGVuIGF2ZXJhZ2luZyBxdWFudGl0aWVzIHdoaWNoCisgICBhcmUgbXVsdGlwbGllZCB0b2dldGhlciByYXRoZXIgdGhhbiBhZGRlZCwgZm9yIGV4YW1wbGUgZ3Jvd3RoIHJhdGVzLgorICAgU3VwcG9zZSBhbiBpbnZlc3RtZW50IGdyb3dzIGJ5IDEwJSBpbiB0aGUgZmlyc3QgeWVhciwgZmFsbHMgYnkgNSUgaW4KKyAgIHRoZSBzZWNvbmQsIHRoZW4gZ3Jvd3MgYnkgMTIlIGluIHRoZSB0aGlyZCwgd2hhdCBpcyB0aGUgYXZlcmFnZSByYXRlCisgICBvZiBncm93dGggb3ZlciB0aGUgdGhyZWUgeWVhcnM/CisKKyAgIC4uIGRvY3Rlc3Q6OgorCisgICAgICA+Pj4gZ2VvbWV0cmljX21lYW4oWzEuMTAsIDAuOTUsIDEuMTJdKQorICAgICAgMS4wNTM4NDgzMTIzMzgyMTcyCisKKyAgIGdpdmluZyBhbiBhdmVyYWdlIGdyb3d0aCBvZiA1LjM4NSUuIFVzaW5nIHRoZSBhcml0aG1ldGljIG1lYW4gd2lsbAorICAgZ2l2ZSBhcHByb3hpbWF0ZWx5IDUuNjY3JSwgd2hpY2ggaXMgdG9vIGhpZ2guCisKKyAgIDpleGM6YFN0YXRpc3RpY3NFcnJvcmAgaXMgcmFpc2VkIGlmICpkYXRhKiBpcyBlbXB0eSwgb3IgYW55CisgICBlbGVtZW50IGlzIGxlc3MgdGhhbiB6ZXJvLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCisuLiBmdW5jdGlvbjo6IGhhcm1vbmljX21lYW4oZGF0YSkKKworICAgUmV0dXJuIHRoZSBoYXJtb25pYyBtZWFuIG9mICpkYXRhKiwgYSBzZXF1ZW5jZSBvciBpdGVyYXRvciBvZgorICAgcmVhbC12YWx1ZWQgbnVtYmVycy4KKworICAgVGhlIGhhcm1vbmljIG1lYW4sIHNvbWV0aW1lcyBjYWxsZWQgdGhlIHN1YmNvbnRyYXJ5IG1lYW4sIGlzIHRoZQorICAgcmVjaXByb2NhbCBvZiB0aGUgYXJpdGhtZXRpYyA6ZnVuYzpgbWVhbmAgb2YgdGhlIHJlY2lwcm9jYWxzIG9mIHRoZQorICAgZGF0YS4gRm9yIGV4YW1wbGUsIHRoZSBoYXJtb25pYyBtZWFuIG9mIHRocmVlIHZhbHVlcyAqYSosICpiKiBhbmQgKmMqCisgICB3aWxsIGJlIGVxdWl2YWxlbnQgdG8gYGAzLygxL2EgKyAxL2IgKyAxL2MpYGAuCisKKyAgIFRoZSBoYXJtb25pYyBtZWFuIGlzIGEgdHlwZSBvZiBhdmVyYWdlLCBhIG1lYXN1cmUgb2YgdGhlIGNlbnRyYWwKKyAgIGxvY2F0aW9uIG9mIHRoZSBkYXRhLiAgSXQgaXMgb2Z0ZW4gYXBwcm9wcmlhdGUgd2hlbiBhdmVyYWdpbmcgcXVhbnRpdGllcworICAgd2hpY2ggYXJlIHJhdGVzIG9yIHJhdGlvcywgZm9yIGV4YW1wbGUgc3BlZWRzLiBGb3IgZXhhbXBsZToKKworICAgU3VwcG9zZSBhbiBpbnZlc3RvciBwdXJjaGFzZXMgYW4gZXF1YWwgdmFsdWUgb2Ygc2hhcmVzIGluIGVhY2ggb2YKKyAgIHRocmVlIGNvbXBhbmllcywgd2l0aCBQL0UgKHByaWNlL2Vhcm5pbmcpIHJhdGlvcyBvZiAyLjUsIDMgYW5kIDEwLgorICAgV2hhdCBpcyB0aGUgYXZlcmFnZSBQL0UgcmF0aW8gZm9yIHRoZSBpbnZlc3RvcidzIHBvcnRmb2xpbz8KKworICAgLi4gZG9jdGVzdDo6CisKKyAgICAgID4+PiBoYXJtb25pY19tZWFuKFsyLjUsIDMsIDEwXSkgICMgRm9yIGFuIGVxdWFsIGludmVzdG1lbnQgcG9ydGZvbGlvLgorICAgICAgMy42CisKKyAgIFVzaW5nIHRoZSBhcml0aG1ldGljIG1lYW4gd291bGQgZ2l2ZSBhbiBhdmVyYWdlIG9mIGFib3V0IDUuMTY3LCB3aGljaAorICAgaXMgdG9vIGhpZ2guCisKKyAgIDpleGM6YFN0YXRpc3RpY3NFcnJvcmAgaXMgcmFpc2VkIGlmICpkYXRhKiBpcyBlbXB0eSwgb3IgYW55IGVsZW1lbnQKKyAgIGlzIGxlc3MgdGhhbiB6ZXJvLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiAuLiBmdW5jdGlvbjo6IG1lZGlhbihkYXRhKQogCiAgICBSZXR1cm4gdGhlIG1lZGlhbiAobWlkZGxlIHZhbHVlKSBvZiBudW1lcmljIGRhdGEsIHVzaW5nIHRoZSBjb21tb24gIm1lYW4gb2YKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N0ZHR5cGVzLnJzdCBiL0RvYy9saWJyYXJ5L3N0ZHR5cGVzLnJzdAppbmRleCAyOTk2ZWVmLi4yMTQ0MjJkIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zdGR0eXBlcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3RkdHlwZXMucnN0CkBAIC0xMzYzLDYgKzEzNjMsMTEgQEAKICAgIFRoZSA6YXR0cjpgfnJhbmdlLnN0YXJ0YCwgOmF0dHI6YH5yYW5nZS5zdG9wYCBhbmQgOmF0dHI6YH5yYW5nZS5zdGVwYAogICAgYXR0cmlidXRlcy4KIAorLi4gc2VlYWxzbzo6CisKKyAgICogVGhlIGBsaW5zcGFjZSByZWNpcGUgPGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzU3OTAwMC8+YF8KKyAgICAgc2hvd3MgaG93IHRvIGltcGxlbWVudCBhIGxhenkgdmVyc2lvbiBvZiByYW5nZSB0aGF0IHN1aXRhYmxlIGZvciBmbG9hdGluZworICAgICBwb2ludCBhcHBsaWNhdGlvbnMuCiAKIC4uIGluZGV4OjoKICAgIHNpbmdsZTogc3RyaW5nOyB0ZXh0IHNlcXVlbmNlIHR5cGUKQEAgLTE0NTMsOCArMTQ1OCw4IEBACiAKICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBgYHN0cmBgIGNsYXNzIGFuZCBpdHMgbWV0aG9kcywgc2VlCiAgICA6cmVmOmB0ZXh0c2VxYCBhbmQgdGhlIDpyZWY6YHN0cmluZy1tZXRob2RzYCBzZWN0aW9uIGJlbG93LiAgVG8gb3V0cHV0Ci0gICBmb3JtYXR0ZWQgc3RyaW5ncywgc2VlIHRoZSA6cmVmOmBmb3JtYXRzdHJpbmdzYCBzZWN0aW9uLiAgSW4gYWRkaXRpb24sCi0gICBzZWUgdGhlIDpyZWY6YHN0cmluZ3NlcnZpY2VzYCBzZWN0aW9uLgorICAgZm9ybWF0dGVkIHN0cmluZ3MsIHNlZSB0aGUgOnJlZjpgZi1zdHJpbmdzYCBhbmQgOnJlZjpgZm9ybWF0c3RyaW5nc2AKKyAgIHNlY3Rpb25zLiAgSW4gYWRkaXRpb24sIHNlZSB0aGUgOnJlZjpgc3RyaW5nc2VydmljZXNgIHNlY3Rpb24uCiAKIAogLi4gaW5kZXg6OgpAQCAtMjA1Niw4ICsyMDYxLDggQEAKIC4uIGluZGV4OjoKICAgIHNpbmdsZTogZm9ybWF0dGluZywgc3RyaW5nICglKQogICAgc2luZ2xlOiBpbnRlcnBvbGF0aW9uLCBzdHJpbmcgKCUpCi0gICBzaW5nbGU6IHN0cmluZzsgZm9ybWF0dGluZwotICAgc2luZ2xlOiBzdHJpbmc7IGludGVycG9sYXRpb24KKyAgIHNpbmdsZTogc3RyaW5nOyBmb3JtYXR0aW5nLCBwcmludGYKKyAgIHNpbmdsZTogc3RyaW5nOyBpbnRlcnBvbGF0aW9uLCBwcmludGYKICAgIHNpbmdsZTogcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcKICAgIHNpbmdsZTogc3ByaW50Zi1zdHlsZSBmb3JtYXR0aW5nCiAgICBzaW5nbGU6ICUgZm9ybWF0dGluZwpAQCAtMjA2Nyw5ICsyMDcyLDEwIEBACiAKICAgIFRoZSBmb3JtYXR0aW5nIG9wZXJhdGlvbnMgZGVzY3JpYmVkIGhlcmUgZXhoaWJpdCBhIHZhcmlldHkgb2YgcXVpcmtzIHRoYXQKICAgIGxlYWQgdG8gYSBudW1iZXIgb2YgY29tbW9uIGVycm9ycyAoc3VjaCBhcyBmYWlsaW5nIHRvIGRpc3BsYXkgdHVwbGVzIGFuZAotICAgZGljdGlvbmFyaWVzIGNvcnJlY3RseSkuICBVc2luZyB0aGUgbmV3ZXIgOm1ldGg6YHN0ci5mb3JtYXRgIGludGVyZmFjZQotICAgaGVscHMgYXZvaWQgdGhlc2UgZXJyb3JzLCBhbmQgYWxzbyBwcm92aWRlcyBhIGdlbmVyYWxseSBtb3JlIHBvd2VyZnVsLAotICAgZmxleGlibGUgYW5kIGV4dGVuc2libGUgYXBwcm9hY2ggdG8gZm9ybWF0dGluZyB0ZXh0LgorICAgZGljdGlvbmFyaWVzIGNvcnJlY3RseSkuICBVc2luZyB0aGUgbmV3ZXIgOnJlZjpgZm9ybWF0dGVkCisgICBzdHJpbmcgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gIG9yIHRoZSA6bWV0aDpgc3RyLmZvcm1hdGAgaW50ZXJmYWNlCisgICBoZWxwcyBhdm9pZCB0aGVzZSBlcnJvcnMuICBUaGVzZSBhbHRlcm5hdGl2ZXMgYWxzbyBwcm92aWRlIG1vcmUgcG93ZXJmdWwsCisgICBmbGV4aWJsZSBhbmQgZXh0ZW5zaWJsZSBhcHByb2FjaGVzIHRvIGZvcm1hdHRpbmcgdGV4dC4KIAogU3RyaW5nIG9iamVjdHMgaGF2ZSBvbmUgdW5pcXVlIGJ1aWx0LWluIG9wZXJhdGlvbjogdGhlIGBgJWBgIG9wZXJhdG9yIChtb2R1bG8pLgogVGhpcyBpcyBhbHNvIGtub3duIGFzIHRoZSBzdHJpbmcgKmZvcm1hdHRpbmcqIG9yICppbnRlcnBvbGF0aW9uKiBvcGVyYXRvci4KQEAgLTI2MzAsOCArMjYzNiw4IEBACiAgICBUaGUgcHJlZml4KGVzKSB0byBzZWFyY2ggZm9yIG1heSBiZSBhbnkgOnRlcm06YGJ5dGVzLWxpa2Ugb2JqZWN0YC4KIAogCi0uLiBtZXRob2Q6OiBieXRlcy50cmFuc2xhdGUodGFibGVbLCBkZWxldGVdKQotICAgICAgICAgICAgYnl0ZWFycmF5LnRyYW5zbGF0ZSh0YWJsZVssIGRlbGV0ZV0pCisuLiBtZXRob2Q6OiBieXRlcy50cmFuc2xhdGUodGFibGUsIGRlbGV0ZT1iJycpCisgICAgICAgICAgICBieXRlYXJyYXkudHJhbnNsYXRlKHRhYmxlLCBkZWxldGU9YicnKQogCiAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBieXRlcyBvciBieXRlYXJyYXkgb2JqZWN0IHdoZXJlIGFsbCBieXRlcyBvY2N1cnJpbmcgaW4KICAgIHRoZSBvcHRpb25hbCBhcmd1bWVudCAqZGVsZXRlKiBhcmUgcmVtb3ZlZCwgYW5kIHRoZSByZW1haW5pbmcgYnl0ZXMgaGF2ZQpAQCAtMjY0Nyw2ICsyNjUzLDkgQEAKICAgICAgID4+PiBiJ3JlYWQgdGhpcyBzaG9ydCB0ZXh0Jy50cmFuc2xhdGUoTm9uZSwgYidhZWlvdScpCiAgICAgICBiJ3JkIHRocyBzaHJ0IHR4dCcKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICpkZWxldGUqIGlzIG5vdyBzdXBwb3J0ZWQgYXMgYSBrZXl3b3JkIGFyZ3VtZW50LgorCiAKIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbiBieXRlcyBhbmQgYnl0ZWFycmF5IG9iamVjdHMgaGF2ZSBkZWZhdWx0IGJlaGF2aW91cnMKIHRoYXQgYXNzdW1lIHRoZSB1c2Ugb2YgQVNDSUkgY29tcGF0aWJsZSBiaW5hcnkgZm9ybWF0cywgYnV0IGNhbiBzdGlsbCBiZSB1c2VkCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zdHJpbmcucnN0IGIvRG9jL2xpYnJhcnkvc3RyaW5nLnJzdAppbmRleCBkNWQyNDMwLi5jNDIxYzcyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zdHJpbmcucnN0CisrKyBiL0RvYy9saWJyYXJ5L3N0cmluZy5yc3QKQEAgLTE4OCw3ICsxODgsOSBAQAogCiBUaGUgOm1ldGg6YHN0ci5mb3JtYXRgIG1ldGhvZCBhbmQgdGhlIDpjbGFzczpgRm9ybWF0dGVyYCBjbGFzcyBzaGFyZSB0aGUgc2FtZQogc3ludGF4IGZvciBmb3JtYXQgc3RyaW5ncyAoYWx0aG91Z2ggaW4gdGhlIGNhc2Ugb2YgOmNsYXNzOmBGb3JtYXR0ZXJgLAotc3ViY2xhc3NlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXQgc3RyaW5nIHN5bnRheCkuCitzdWJjbGFzc2VzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGZvcm1hdCBzdHJpbmcgc3ludGF4KS4gIFRoZSBzeW50YXggaXMKK3JlbGF0ZWQgdG8gdGhhdCBvZiA6cmVmOmBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIDxmLXN0cmluZ3M+YCwgYnV0Cit0aGVyZSBhcmUgZGlmZmVyZW5jZXMuCiAKIEZvcm1hdCBzdHJpbmdzIGNvbnRhaW4gInJlcGxhY2VtZW50IGZpZWxkcyIgc3Vycm91bmRlZCBieSBjdXJseSBicmFjZXMgYGB7fWBgLgogQW55dGhpbmcgdGhhdCBpcyBub3QgY29udGFpbmVkIGluIGJyYWNlcyBpcyBjb25zaWRlcmVkIGxpdGVyYWwgdGV4dCwgd2hpY2ggaXMKQEAgLTI4Myw3ICsyODUsOCBAQAogCiAiRm9ybWF0IHNwZWNpZmljYXRpb25zIiBhcmUgdXNlZCB3aXRoaW4gcmVwbGFjZW1lbnQgZmllbGRzIGNvbnRhaW5lZCB3aXRoaW4gYQogZm9ybWF0IHN0cmluZyB0byBkZWZpbmUgaG93IGluZGl2aWR1YWwgdmFsdWVzIGFyZSBwcmVzZW50ZWQgKHNlZQotOnJlZjpgZm9ybWF0c3RyaW5nc2ApLiAgVGhleSBjYW4gYWxzbyBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGJ1aWx0LWluCis6cmVmOmBmb3JtYXRzdHJpbmdzYCBhbmQgOnJlZjpgZi1zdHJpbmdzYCkuCitUaGV5IGNhbiBhbHNvIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgYnVpbHQtaW4KIDpmdW5jOmBmb3JtYXRgIGZ1bmN0aW9uLiAgRWFjaCBmb3JtYXR0YWJsZSB0eXBlIG1heSBkZWZpbmUgaG93IHRoZSBmb3JtYXQKIHNwZWNpZmljYXRpb24gaXMgdG8gYmUgaW50ZXJwcmV0ZWQuCiAKQEAgLTMwOCw3ICszMTEsOCBAQAogSWYgYSB2YWxpZCAqYWxpZ24qIHZhbHVlIGlzIHNwZWNpZmllZCwgaXQgY2FuIGJlIHByZWNlZGVkIGJ5IGEgKmZpbGwqCiBjaGFyYWN0ZXIgdGhhdCBjYW4gYmUgYW55IGNoYXJhY3RlciBhbmQgZGVmYXVsdHMgdG8gYSBzcGFjZSBpZiBvbWl0dGVkLgogSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBhIGxpdGVyYWwgY3VybHkgYnJhY2UgKCJgYHtgYCIgb3IgImBgfWBgIikgYXMKLXRoZSAqZmlsbCogY2hhcmFjdGVyIHdoZW4gdXNpbmcgdGhlIDptZXRoOmBzdHIuZm9ybWF0YAordGhlICpmaWxsKiBjaGFyYWN0ZXIgaW4gYSA6cmVmOmBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWwKKzxmLXN0cmluZ3M+YCBvciB3aGVuIHVzaW5nIHRoZSA6bWV0aDpgc3RyLmZvcm1hdGAKIG1ldGhvZC4gIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRvIGluc2VydCBhIGN1cmx5IGJyYWNlCiB3aXRoIGEgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkLiAgVGhpcyBsaW1pdGF0aW9uIGRvZXNuJ3QKIGFmZmVjdCB0aGUgOmZ1bmM6YGZvcm1hdGAgZnVuY3Rpb24uCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zdHJ1Y3QucnN0IGIvRG9jL2xpYnJhcnkvc3RydWN0LnJzdAppbmRleCBhZTJlMzhmLi43ZTg2MWZkIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zdHJ1Y3QucnN0CisrKyBiL0RvYy9saWJyYXJ5L3N0cnVjdC5yc3QKQEAgLTIxNiw2ICsyMTYsOCBAQAogKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwogfCBgYE5gYCAgfCA6Yzp0eXBlOmBzaXplX3RgICAgICAgICAgfCBpbnRlZ2VyICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8IFwoNCkgICAgICAgfAogKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKworfCBgYGVgYCAgfCBcKDcpICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdCAgICAgICAgICAgICAgfCAyICAgICAgICAgICAgICB8IFwoNSkgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwogfCBgYGZgYCAgfCA6Yzp0eXBlOmBmbG9hdGAgICAgICAgICAgfCBmbG9hdCAgICAgICAgICAgICAgfCA0ICAgICAgICAgICAgICB8IFwoNSkgICAgICAgfAogKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwogfCBgYGRgYCAgfCA6Yzp0eXBlOmBkb3VibGVgICAgICAgICAgfCBmbG9hdCAgICAgICAgICAgICAgfCA4ICAgICAgICAgICAgICB8IFwoNSkgICAgICAgfApAQCAtMjU3LDkgKzI1OSwxMCBAQAogICAgZml0cyB5b3VyIGFwcGxpY2F0aW9uLgogCiAoNSkKLSAgIEZvciB0aGUgYGAnZidgYCBhbmQgYGAnZCdgYCBjb252ZXJzaW9uIGNvZGVzLCB0aGUgcGFja2VkIHJlcHJlc2VudGF0aW9uIHVzZXMKLSAgIHRoZSBJRUVFIDc1NCBiaW5hcnkzMiAoZm9yIGBgJ2YnYGApIG9yIGJpbmFyeTY0IChmb3IgYGAnZCdgYCkgZm9ybWF0LAotICAgcmVnYXJkbGVzcyBvZiB0aGUgZmxvYXRpbmctcG9pbnQgZm9ybWF0IHVzZWQgYnkgdGhlIHBsYXRmb3JtLgorICAgRm9yIHRoZSBgYCdmJ2BgLCBgYCdkJ2BgIGFuZCBgYCdlJ2BgIGNvbnZlcnNpb24gY29kZXMsIHRoZSBwYWNrZWQKKyAgIHJlcHJlc2VudGF0aW9uIHVzZXMgdGhlIElFRUUgNzU0IGJpbmFyeTMyLCBiaW5hcnk2NCBvciBiaW5hcnkxNiBmb3JtYXQgKGZvcgorICAgYGAnZidgYCwgYGAnZCdgYCBvciBgYCdlJ2BgIHJlc3BlY3RpdmVseSksIHJlZ2FyZGxlc3Mgb2YgdGhlIGZsb2F0aW5nLXBvaW50CisgICBmb3JtYXQgdXNlZCBieSB0aGUgcGxhdGZvcm0uCiAKICg2KQogICAgVGhlIGBgJ1AnYGAgZm9ybWF0IGNoYXJhY3RlciBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgdGhlIG5hdGl2ZSBieXRlIG9yZGVyaW5nCkBAIC0yNjgsNiArMjcxLDE2IEBACiAgICBvbiB0aGUgaG9zdCBzeXN0ZW0uIFRoZSBzdHJ1Y3QgbW9kdWxlIGRvZXMgbm90IGludGVycHJldCB0aGlzIGFzIG5hdGl2ZQogICAgb3JkZXJpbmcsIHNvIHRoZSBgYCdQJ2BgIGZvcm1hdCBpcyBub3QgYXZhaWxhYmxlLgogCisoNykKKyAgIFRoZSBJRUVFIDc1NCBiaW5hcnkxNiAiaGFsZiBwcmVjaXNpb24iIHR5cGUgd2FzIGludHJvZHVjZWQgaW4gdGhlIDIwMDgKKyAgIHJldmlzaW9uIG9mIHRoZSBgSUVFRSA3NTQgc3RhbmRhcmQgPGllZWUgNzU0IHN0YW5kYXJkXz5gXy4gSXQgaGFzIGEgc2lnbgorICAgYml0LCBhIDUtYml0IGV4cG9uZW50IGFuZCAxMS1iaXQgcHJlY2lzaW9uICh3aXRoIDEwIGJpdHMgZXhwbGljaXRseSBzdG9yZWQpLAorICAgYW5kIGNhbiByZXByZXNlbnQgbnVtYmVycyBiZXR3ZWVuIGFwcHJveGltYXRlbHkgYGA2LjFlLTA1YGAgYW5kIGBgNi41ZSswNGBgCisgICBhdCBmdWxsIHByZWNpc2lvbi4gVGhpcyB0eXBlIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIGJ5IEMgY29tcGlsZXJzOiBvbiBhCisgICB0eXBpY2FsIG1hY2hpbmUsIGFuIHVuc2lnbmVkIHNob3J0IGNhbiBiZSB1c2VkIGZvciBzdG9yYWdlLCBidXQgbm90IGZvciBtYXRoCisgICBvcGVyYXRpb25zLiBTZWUgdGhlIFdpa2lwZWRpYSBwYWdlIG9uIHRoZSBgaGFsZi1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKKyAgIGZvcm1hdCA8aGFsZiBwcmVjaXNpb24gZm9ybWF0Xz5gXyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKwogCiBBIGZvcm1hdCBjaGFyYWN0ZXIgbWF5IGJlIHByZWNlZGVkIGJ5IGFuIGludGVncmFsIHJlcGVhdCBjb3VudC4gIEZvciBleGFtcGxlLAogdGhlIGZvcm1hdCBzdHJpbmcgYGAnNGgnYGAgbWVhbnMgZXhhY3RseSB0aGUgc2FtZSBhcyBgYCdoaGhoJ2BgLgpAQCAtNDMwLDMgKzQ0Myw3IEBACiAgICAgICBUaGUgY2FsY3VsYXRlZCBzaXplIG9mIHRoZSBzdHJ1Y3QgKGFuZCBoZW5jZSBvZiB0aGUgYnl0ZXMgb2JqZWN0IHByb2R1Y2VkCiAgICAgICBieSB0aGUgOm1ldGg6YHBhY2tgIG1ldGhvZCkgY29ycmVzcG9uZGluZyB0byA6YXR0cjpgZm9ybWF0YC4KIAorCisuLiBfaGFsZiBwcmVjaXNpb24gZm9ybWF0OiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYWxmLXByZWNpc2lvbl9mbG9hdGluZy1wb2ludF9mb3JtYXQKKworLi4gX2llZWUgNzU0IHN0YW5kYXJkOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JRUVFX2Zsb2F0aW5nX3BvaW50I0lFRUVfNzU0LTIwMDgKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N1YnByb2Nlc3MucnN0IGIvRG9jL2xpYnJhcnkvc3VicHJvY2Vzcy5yc3QKaW5kZXggMzU2NjA1Zi4uMDY1NWRjNCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3VicHJvY2Vzcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3VicHJvY2Vzcy5yc3QKQEAgLTM4LDcgKzM4LDggQEAKIAogCiAuLiBmdW5jdGlvbjo6IHJ1bihhcmdzLCAqLCBzdGRpbj1Ob25lLCBpbnB1dD1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsXAotICAgICAgICAgICAgICAgICAgc2hlbGw9RmFsc2UsIHRpbWVvdXQ9Tm9uZSwgY2hlY2s9RmFsc2UpCisgICAgICAgICAgICAgICAgICBzaGVsbD1GYWxzZSwgdGltZW91dD1Ob25lLCBjaGVjaz1GYWxzZSwgXAorICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9Tm9uZSwgZXJyb3JzPU5vbmUpCiAKICAgIFJ1biB0aGUgY29tbWFuZCBkZXNjcmliZWQgYnkgKmFyZ3MqLiAgV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSwgdGhlbgogICAgcmV0dXJuIGEgOmNsYXNzOmBDb21wbGV0ZWRQcm9jZXNzYCBpbnN0YW5jZS4KQEAgLTYwLDE1ICs2MSwyMCBAQAogCiAgICBUaGUgKmlucHV0KiBhcmd1bWVudCBpcyBwYXNzZWQgdG8gOm1ldGg6YFBvcGVuLmNvbW11bmljYXRlYCBhbmQgdGh1cyB0byB0aGUKICAgIHN1YnByb2Nlc3MncyBzdGRpbi4gIElmIHVzZWQgaXQgbXVzdCBiZSBhIGJ5dGUgc2VxdWVuY2UsIG9yIGEgc3RyaW5nIGlmCi0gICBgYHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlYGAuICBXaGVuIHVzZWQsIHRoZSBpbnRlcm5hbCA6Y2xhc3M6YFBvcGVuYCBvYmplY3QKLSAgIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aXRoIGBgc3RkaW49UElQRWBgLCBhbmQgdGhlICpzdGRpbiogYXJndW1lbnQgbWF5Ci0gICBub3QgYmUgdXNlZCBhcyB3ZWxsLgorICAgKmVuY29kaW5nKiBvciAqZXJyb3JzKiBpcyBzcGVjaWZpZWQgb3IgKnVuaXZlcnNhbF9uZXdsaW5lcyogaXMgVHJ1ZS4gIFdoZW4KKyAgIHVzZWQsIHRoZSBpbnRlcm5hbCA6Y2xhc3M6YFBvcGVuYCBvYmplY3QgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHdpdGgKKyAgIGBgc3RkaW49UElQRWBgLCBhbmQgdGhlICpzdGRpbiogYXJndW1lbnQgbWF5IG5vdCBiZSB1c2VkIGFzIHdlbGwuCiAKICAgIElmICpjaGVjayogaXMgVHJ1ZSwgYW5kIHRoZSBwcm9jZXNzIGV4aXRzIHdpdGggYSBub24temVybyBleGl0IGNvZGUsIGEKICAgIDpleGM6YENhbGxlZFByb2Nlc3NFcnJvcmAgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLiBBdHRyaWJ1dGVzIG9mIHRoYXQKICAgIGV4Y2VwdGlvbiBob2xkIHRoZSBhcmd1bWVudHMsIHRoZSBleGl0IGNvZGUsIGFuZCBzdGRvdXQgYW5kIHN0ZGVyciBpZiB0aGV5CiAgICB3ZXJlIGNhcHR1cmVkLgogCisgICBJZiAqZW5jb2RpbmcqIG9yICplcnJvcnMqIGFyZSBzcGVjaWZpZWQsIG9yICp1bml2ZXJzYWxfbmV3bGluZXMqIGlzIFRydWUsCisgICBmaWxlIG9iamVjdHMgZm9yIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgb3BlbmVkIGluIHRleHQgbW9kZSB1c2luZyB0aGUKKyAgIHNwZWNpZmllZCAqZW5jb2RpbmcqIGFuZCAqZXJyb3JzKiBvciB0aGUgOmNsYXNzOmBpby5UZXh0SU9XcmFwcGVyYCBkZWZhdWx0LgorICAgT3RoZXJ3aXNlLCBmaWxlIG9iamVjdHMgYXJlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZS4KKwogICAgRXhhbXBsZXM6OgogCiAgICAgICA+Pj4gc3VicHJvY2Vzcy5ydW4oWyJscyIsICItbCJdKSAgIyBkb2Vzbid0IGNhcHR1cmUgb3V0cHV0CkBAIC04NSw2ICs5MSwxMCBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKworICAgICAgQWRkZWQgKmVuY29kaW5nKiBhbmQgKmVycm9ycyogcGFyYW1ldGVycworCiAuLiBjbGFzczo6IENvbXBsZXRlZFByb2Nlc3MKIAogICAgVGhlIHJldHVybiB2YWx1ZSBmcm9tIDpmdW5jOmBydW5gLCByZXByZXNlbnRpbmcgYSBwcm9jZXNzIHRoYXQgaGFzIGZpbmlzaGVkLgpAQCAtMTA0LDggKzExNCw4IEBACiAgICAuLiBhdHRyaWJ1dGU6OiBzdGRvdXQKIAogICAgICAgQ2FwdHVyZWQgc3Rkb3V0IGZyb20gdGhlIGNoaWxkIHByb2Nlc3MuIEEgYnl0ZXMgc2VxdWVuY2UsIG9yIGEgc3RyaW5nIGlmCi0gICAgICA6ZnVuYzpgcnVuYCB3YXMgY2FsbGVkIHdpdGggYGB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZWBgLiBOb25lIGlmIHN0ZG91dAotICAgICAgd2FzIG5vdCBjYXB0dXJlZC4KKyAgICAgIDpmdW5jOmBydW5gIHdhcyBjYWxsZWQgd2l0aCBhbiBlbmNvZGluZyBvciBlcnJvcnMuIE5vbmUgaWYgc3Rkb3V0IHdhcyBub3QKKyAgICAgIGNhcHR1cmVkLgogCiAgICAgICBJZiB5b3UgcmFuIHRoZSBwcm9jZXNzIHdpdGggYGBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVRgYCwgc3Rkb3V0IGFuZAogICAgICAgc3RkZXJyIHdpbGwgYmUgY29tYmluZWQgaW4gdGhpcyBhdHRyaWJ1dGUsIGFuZCA6YXR0cjpgc3RkZXJyYCB3aWxsIGJlCkBAIC0xMTQsOCArMTI0LDggQEAKICAgIC4uIGF0dHJpYnV0ZTo6IHN0ZGVycgogCiAgICAgICBDYXB0dXJlZCBzdGRlcnIgZnJvbSB0aGUgY2hpbGQgcHJvY2Vzcy4gQSBieXRlcyBzZXF1ZW5jZSwgb3IgYSBzdHJpbmcgaWYKLSAgICAgIDpmdW5jOmBydW5gIHdhcyBjYWxsZWQgd2l0aCBgYHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlYGAuIE5vbmUgaWYgc3RkZXJyCi0gICAgICB3YXMgbm90IGNhcHR1cmVkLgorICAgICAgOmZ1bmM6YHJ1bmAgd2FzIGNhbGxlZCB3aXRoIGFuIGVuY29kaW5nIG9yIGVycm9ycy4gTm9uZSBpZiBzdGRlcnIgd2FzIG5vdAorICAgICAgY2FwdHVyZWQuCiAKICAgIC4uIG1ldGhvZDo6IGNoZWNrX3JldHVybmNvZGUoKQogCkBAIC0yNDksMTkgKzI1OSwyMiBAQAogICAgLi4gaW5kZXg6OgogICAgICAgc2luZ2xlOiB1bml2ZXJzYWwgbmV3bGluZXM7IHN1YnByb2Nlc3MgbW9kdWxlCiAKLSAgIElmICp1bml2ZXJzYWxfbmV3bGluZXMqIGlzIGBgRmFsc2VgYCB0aGUgZmlsZSBvYmplY3RzICpzdGRpbiosICpzdGRvdXQqIGFuZAotICAgKnN0ZGVyciogd2lsbCBiZSBvcGVuZWQgYXMgYmluYXJ5IHN0cmVhbXMsIGFuZCBubyBsaW5lIGVuZGluZyBjb252ZXJzaW9uIGlzCi0gICBkb25lLgorICAgSWYgKmVuY29kaW5nKiBvciAqZXJyb3JzKiBhcmUgc3BlY2lmaWVkLCBvciAqdW5pdmVyc2FsX25ld2xpbmVzKiBpcyBUcnVlLAorICAgdGhlIGZpbGUgb2JqZWN0cyAqc3RkaW4qLCAqc3Rkb3V0KiBhbmQgKnN0ZGVyciogd2lsbCBiZSBvcGVuZWQgaW4gdGV4dAorICAgbW9kZSB1c2luZyB0aGUgKmVuY29kaW5nKiBhbmQgKmVycm9ycyogc3BlY2lmaWVkIGluIHRoZSBjYWxsIG9yIHRoZQorICAgZGVmYXVsdHMgZm9yIDpjbGFzczpgaW8uVGV4dElPV3JhcHBlcmAuCiAKLSAgIElmICp1bml2ZXJzYWxfbmV3bGluZXMqIGlzIGBgVHJ1ZWBgLCB0aGVzZSBmaWxlIG9iamVjdHMKLSAgIHdpbGwgYmUgb3BlbmVkIGFzIHRleHQgc3RyZWFtcyBpbiA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBtb2RlCi0gICB1c2luZyB0aGUgZW5jb2RpbmcgcmV0dXJuZWQgYnkgOmZ1bmM6YGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZyhGYWxzZSkKLSAgIDxsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2Rpbmc+YC4gIEZvciAqc3RkaW4qLCBsaW5lIGVuZGluZyBjaGFyYWN0ZXJzCi0gICBgYCdcbidgYCBpbiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGRlZmF1bHQgbGluZSBzZXBhcmF0b3IKLSAgIDpkYXRhOmBvcy5saW5lc2VwYC4gIEZvciAqc3Rkb3V0KiBhbmQgKnN0ZGVyciosIGFsbCBsaW5lIGVuZGluZ3MgaW4gdGhlCi0gICBvdXRwdXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYGAnXG4nYGAuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlCi0gICBkb2N1bWVudGF0aW9uIG9mIHRoZSA6Y2xhc3M6YGlvLlRleHRJT1dyYXBwZXJgIGNsYXNzIHdoZW4gdGhlICpuZXdsaW5lKgotICAgYXJndW1lbnQgdG8gaXRzIGNvbnN0cnVjdG9yIGlzIGBgTm9uZWBgLgorICAgRm9yICpzdGRpbiosIGxpbmUgZW5kaW5nIGNoYXJhY3RlcnMgYGAnXG4nYGAgaW4gdGhlIGlucHV0IHdpbGwgYmUgY29udmVydGVkCisgICB0byB0aGUgZGVmYXVsdCBsaW5lIHNlcGFyYXRvciA6ZGF0YTpgb3MubGluZXNlcGAuIEZvciAqc3Rkb3V0KiBhbmQgKnN0ZGVyciosCisgICBhbGwgbGluZSBlbmRpbmdzIGluIHRoZSBvdXRwdXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYGAnXG4nYGAuICBGb3IgbW9yZQorICAgaW5mb3JtYXRpb24gc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSA6Y2xhc3M6YGlvLlRleHRJT1dyYXBwZXJgIGNsYXNzCisgICB3aGVuIHRoZSAqbmV3bGluZSogYXJndW1lbnQgdG8gaXRzIGNvbnN0cnVjdG9yIGlzIGBgTm9uZWBgLgorCisgICBJZiB0ZXh0IG1vZGUgaXMgbm90IHVzZWQsICpzdGRpbiosICpzdGRvdXQqIGFuZCAqc3RkZXJyKiB3aWxsIGJlIG9wZW5lZCBhcworICAgYmluYXJ5IHN0cmVhbXMuIE5vIGVuY29kaW5nIG9yIGxpbmUgZW5kaW5nIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgIEFkZGVkICplbmNvZGluZyogYW5kICplcnJvcnMqIHBhcmFtZXRlcnMuCiAKICAgIC4uIG5vdGU6OgogCkBAIC0zMDYsNyArMzE5LDggQEAKICAgICAgICAgICAgICAgICAgc3RkZXJyPU5vbmUsIHByZWV4ZWNfZm49Tm9uZSwgY2xvc2VfZmRzPVRydWUsIHNoZWxsPUZhbHNlLCBcCiAgICAgICAgICAgICAgICAgIGN3ZD1Ob25lLCBlbnY9Tm9uZSwgdW5pdmVyc2FsX25ld2xpbmVzPUZhbHNlLCBcCiAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvPU5vbmUsIGNyZWF0aW9uZmxhZ3M9MCwgcmVzdG9yZV9zaWduYWxzPVRydWUsIFwKLSAgICAgICAgICAgICAgICAgc3RhcnRfbmV3X3Nlc3Npb249RmFsc2UsIHBhc3NfZmRzPSgpKQorICAgICAgICAgICAgICAgICBzdGFydF9uZXdfc2Vzc2lvbj1GYWxzZSwgcGFzc19mZHM9KCksICosIFwKKyAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9Tm9uZSwgZXJyb3JzPU5vbmUpCiAKICAgIEV4ZWN1dGUgYSBjaGlsZCBwcm9ncmFtIGluIGEgbmV3IHByb2Nlc3MuICBPbiBQT1NJWCwgdGhlIGNsYXNzIHVzZXMKICAgIDptZXRoOmBvcy5leGVjdnBgLWxpa2UgYmVoYXZpb3IgdG8gZXhlY3V0ZSB0aGUgY2hpbGQgcHJvZ3JhbS4gIE9uIFdpbmRvd3MsCkBAIC00ODIsMTAgKzQ5NiwxNCBAQAogCiAgICAuLiBfc2lkZS1ieS1zaWRlIGFzc2VtYmx5OiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaWRlLWJ5LVNpZGVfQXNzZW1ibHkKIAotICAgSWYgKnVuaXZlcnNhbF9uZXdsaW5lcyogaXMgYGBUcnVlYGAsIHRoZSBmaWxlIG9iamVjdHMgKnN0ZGluKiwgKnN0ZG91dCoKLSAgIGFuZCAqc3RkZXJyKiBhcmUgb3BlbmVkIGFzIHRleHQgc3RyZWFtcyBpbiB1bml2ZXJzYWwgbmV3bGluZXMgbW9kZSwgYXMKLSAgIGRlc2NyaWJlZCBhYm92ZSBpbiA6cmVmOmBmcmVxdWVudGx5LXVzZWQtYXJndW1lbnRzYCwgb3RoZXJ3aXNlIHRoZXkgYXJlCi0gICBvcGVuZWQgYXMgYmluYXJ5IHN0cmVhbXMuCisgICBJZiAqZW5jb2RpbmcqIG9yICplcnJvcnMqIGFyZSBzcGVjaWZpZWQsIHRoZSBmaWxlIG9iamVjdHMgKnN0ZGluKiwgKnN0ZG91dCoKKyAgIGFuZCAqc3RkZXJyKiBhcmUgb3BlbmVkIGluIHRleHQgbW9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgYW5kCisgICAqZXJyb3JzKiwgYXMgZGVzY3JpYmVkIGFib3ZlIGluIDpyZWY6YGZyZXF1ZW50bHktdXNlZC1hcmd1bWVudHNgLiBJZgorICAgKnVuaXZlcnNhbF9uZXdsaW5lcyogaXMgYGBUcnVlYGAsIHRoZXkgYXJlIG9wZW5lZCBpbiB0ZXh0IG1vZGUgd2l0aCBkZWZhdWx0CisgICBlbmNvZGluZy4gT3RoZXJ3aXNlLCB0aGV5IGFyZSBvcGVuZWQgYXMgYmluYXJ5IHN0cmVhbXMuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgKmVuY29kaW5nKiBhbmQgKmVycm9ycyogd2VyZSBhZGRlZC4KIAogICAgSWYgZ2l2ZW4sICpzdGFydHVwaW5mbyogd2lsbCBiZSBhIDpjbGFzczpgU1RBUlRVUElORk9gIG9iamVjdCwgd2hpY2ggaXMKICAgIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBgYENyZWF0ZVByb2Nlc3NgYCBmdW5jdGlvbi4KQEAgLTUwMiw2ICs1MjAsMTAgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4yCiAgICAgICBBZGRlZCBjb250ZXh0IG1hbmFnZXIgc3VwcG9ydC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFBvcGVuIGRlc3RydWN0b3Igbm93IGVtaXRzIGEgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYCB3YXJuaW5nIGlmIHRoZSBjaGlsZAorICAgICAgcHJvY2VzcyBpcyBzdGlsbCBydW5uaW5nLgorCiAKIEV4Y2VwdGlvbnMKIF5eXl5eXl5eXl4KQEAgLTU5NywxMSArNjE5LDEyIEBACiAgICBJbnRlcmFjdCB3aXRoIHByb2Nlc3M6IFNlbmQgZGF0YSB0byBzdGRpbi4gIFJlYWQgZGF0YSBmcm9tIHN0ZG91dCBhbmQgc3RkZXJyLAogICAgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4gIFdhaXQgZm9yIHByb2Nlc3MgdG8gdGVybWluYXRlLiAgVGhlIG9wdGlvbmFsCiAgICAqaW5wdXQqIGFyZ3VtZW50IHNob3VsZCBiZSBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlIGNoaWxkIHByb2Nlc3MsIG9yCi0gICBgYE5vbmVgYCwgaWYgbm8gZGF0YSBzaG91bGQgYmUgc2VudCB0byB0aGUgY2hpbGQuICBUaGUgdHlwZSBvZiAqaW5wdXQqCi0gICBtdXN0IGJlIGJ5dGVzIG9yLCBpZiAqdW5pdmVyc2FsX25ld2xpbmVzKiB3YXMgYGBUcnVlYGAsIGEgc3RyaW5nLgorICAgYGBOb25lYGAsIGlmIG5vIGRhdGEgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIGNoaWxkLiAgSWYgc3RyZWFtcyB3ZXJlIG9wZW5lZCBpbgorICAgdGV4dCBtb2RlLCAqaW5wdXQqIG11c3QgYmUgYSBzdHJpbmcuICBPdGhlcndpc2UsIGl0IG11c3QgYmUgYnl0ZXMuCiAKICAgIDptZXRoOmBjb21tdW5pY2F0ZWAgcmV0dXJucyBhIHR1cGxlIGBgKHN0ZG91dF9kYXRhLCBzdGRlcnJfZGF0YSlgYC4KLSAgIFRoZSBkYXRhIHdpbGwgYmUgYnl0ZXMgb3IsIGlmICp1bml2ZXJzYWxfbmV3bGluZXMqIHdhcyBgYFRydWVgYCwgc3RyaW5ncy4KKyAgIFRoZSBkYXRhIHdpbGwgYmUgc3RyaW5ncyBpZiBzdHJlYW1zIHdlcmUgb3BlbmVkIGluIHRleHQgbW9kZTsgb3RoZXJ3aXNlLAorICAgYnl0ZXMuCiAKICAgIE5vdGUgdGhhdCBpZiB5b3Ugd2FudCB0byBzZW5kIGRhdGEgdG8gdGhlIHByb2Nlc3MncyBzdGRpbiwgeW91IG5lZWQgdG8gY3JlYXRlCiAgICB0aGUgUG9wZW4gb2JqZWN0IHdpdGggYGBzdGRpbj1QSVBFYGAuICBTaW1pbGFybHksIHRvIGdldCBhbnl0aGluZyBvdGhlciB0aGFuCkBAIC02NjgsMjggKzY5MSwzMCBAQAogLi4gYXR0cmlidXRlOjogUG9wZW4uc3RkaW4KIAogICAgSWYgdGhlICpzdGRpbiogYXJndW1lbnQgd2FzIDpkYXRhOmBQSVBFYCwgdGhpcyBhdHRyaWJ1dGUgaXMgYSB3cml0ZWFibGUKLSAgIHN0cmVhbSBvYmplY3QgYXMgcmV0dXJuZWQgYnkgOmZ1bmM6YG9wZW5gLiBJZiB0aGUgKnVuaXZlcnNhbF9uZXdsaW5lcyoKLSAgIGFyZ3VtZW50IHdhcyBgYFRydWVgYCwgdGhlIHN0cmVhbSBpcyBhIHRleHQgc3RyZWFtLCBvdGhlcndpc2UgaXQgaXMgYSBieXRlCi0gICBzdHJlYW0uIElmIHRoZSAqc3RkaW4qIGFyZ3VtZW50IHdhcyBub3QgOmRhdGE6YFBJUEVgLCB0aGlzIGF0dHJpYnV0ZSBpcwotICAgYGBOb25lYGAuCisgICBzdHJlYW0gb2JqZWN0IGFzIHJldHVybmVkIGJ5IDpmdW5jOmBvcGVuYC4gSWYgdGhlICplbmNvZGluZyogb3IgKmVycm9ycyoKKyAgIGFyZ3VtZW50cyB3ZXJlIHNwZWNpZmllZCBvciB0aGUgKnVuaXZlcnNhbF9uZXdsaW5lcyogYXJndW1lbnQgd2FzIGBgVHJ1ZWBgLAorICAgdGhlIHN0cmVhbSBpcyBhIHRleHQgc3RyZWFtLCBvdGhlcndpc2UgaXQgaXMgYSBieXRlIHN0cmVhbS4gSWYgdGhlICpzdGRpbioKKyAgIGFyZ3VtZW50IHdhcyBub3QgOmRhdGE6YFBJUEVgLCB0aGlzIGF0dHJpYnV0ZSBpcyBgYE5vbmVgYC4KIAogCiAuLiBhdHRyaWJ1dGU6OiBQb3Blbi5zdGRvdXQKIAogICAgSWYgdGhlICpzdGRvdXQqIGFyZ3VtZW50IHdhcyA6ZGF0YTpgUElQRWAsIHRoaXMgYXR0cmlidXRlIGlzIGEgcmVhZGFibGUKICAgIHN0cmVhbSBvYmplY3QgYXMgcmV0dXJuZWQgYnkgOmZ1bmM6YG9wZW5gLiBSZWFkaW5nIGZyb20gdGhlIHN0cmVhbSBwcm92aWRlcwotICAgb3V0cHV0IGZyb20gdGhlIGNoaWxkIHByb2Nlc3MuIElmIHRoZSAqdW5pdmVyc2FsX25ld2xpbmVzKiBhcmd1bWVudCB3YXMKLSAgIGBgVHJ1ZWBgLCB0aGUgc3RyZWFtIGlzIGEgdGV4dCBzdHJlYW0sIG90aGVyd2lzZSBpdCBpcyBhIGJ5dGUgc3RyZWFtLiBJZiB0aGUKLSAgICpzdGRvdXQqIGFyZ3VtZW50IHdhcyBub3QgOmRhdGE6YFBJUEVgLCB0aGlzIGF0dHJpYnV0ZSBpcyBgYE5vbmVgYC4KKyAgIG91dHB1dCBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzLiBJZiB0aGUgKmVuY29kaW5nKiBvciAqZXJyb3JzKiBhcmd1bWVudHMgd2VyZQorICAgc3BlY2lmaWVkIG9yIHRoZSAqdW5pdmVyc2FsX25ld2xpbmVzKiBhcmd1bWVudCB3YXMgYGBUcnVlYGAsIHRoZSBzdHJlYW0gaXMgYQorICAgdGV4dCBzdHJlYW0sIG90aGVyd2lzZSBpdCBpcyBhIGJ5dGUgc3RyZWFtLiBJZiB0aGUgKnN0ZG91dCogYXJndW1lbnQgd2FzIG5vdAorICAgOmRhdGE6YFBJUEVgLCB0aGlzIGF0dHJpYnV0ZSBpcyBgYE5vbmVgYC4KIAogCiAuLiBhdHRyaWJ1dGU6OiBQb3Blbi5zdGRlcnIKIAogICAgSWYgdGhlICpzdGRlcnIqIGFyZ3VtZW50IHdhcyA6ZGF0YTpgUElQRWAsIHRoaXMgYXR0cmlidXRlIGlzIGEgcmVhZGFibGUKICAgIHN0cmVhbSBvYmplY3QgYXMgcmV0dXJuZWQgYnkgOmZ1bmM6YG9wZW5gLiBSZWFkaW5nIGZyb20gdGhlIHN0cmVhbSBwcm92aWRlcwotICAgZXJyb3Igb3V0cHV0IGZyb20gdGhlIGNoaWxkIHByb2Nlc3MuIElmIHRoZSAqdW5pdmVyc2FsX25ld2xpbmVzKiBhcmd1bWVudCB3YXMKLSAgIGBgVHJ1ZWBgLCB0aGUgc3RyZWFtIGlzIGEgdGV4dCBzdHJlYW0sIG90aGVyd2lzZSBpdCBpcyBhIGJ5dGUgc3RyZWFtLiBJZiB0aGUKLSAgICpzdGRlcnIqIGFyZ3VtZW50IHdhcyBub3QgOmRhdGE6YFBJUEVgLCB0aGlzIGF0dHJpYnV0ZSBpcyBgYE5vbmVgYC4KKyAgIGVycm9yIG91dHB1dCBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzLiBJZiB0aGUgKmVuY29kaW5nKiBvciAqZXJyb3JzKiBhcmd1bWVudHMKKyAgIHdlcmUgc3BlY2lmaWVkIG9yIHRoZSAqdW5pdmVyc2FsX25ld2xpbmVzKiBhcmd1bWVudCB3YXMgYGBUcnVlYGAsIHRoZSBzdHJlYW0KKyAgIGlzIGEgdGV4dCBzdHJlYW0sIG90aGVyd2lzZSBpdCBpcyBhIGJ5dGUgc3RyZWFtLiBJZiB0aGUgKnN0ZGVyciogYXJndW1lbnQgd2FzCisgICBub3QgOmRhdGE6YFBJUEVgLCB0aGlzIGF0dHJpYnV0ZSBpcyBgYE5vbmVgYC4KIAogLi4gd2FybmluZzo6CiAKQEAgLTg4Miw3ICs5MDcsOSBAQAogICAgICAgKnRpbWVvdXQqIHdhcyBhZGRlZC4KIAogCi0uLiBmdW5jdGlvbjo6IGNoZWNrX291dHB1dChhcmdzLCAqLCBzdGRpbj1Ob25lLCBzdGRlcnI9Tm9uZSwgc2hlbGw9RmFsc2UsIHVuaXZlcnNhbF9uZXdsaW5lcz1GYWxzZSwgdGltZW91dD1Ob25lKQorLi4gZnVuY3Rpb246OiBjaGVja19vdXRwdXQoYXJncywgKiwgc3RkaW49Tm9uZSwgc3RkZXJyPU5vbmUsIHNoZWxsPUZhbHNlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz1Ob25lLCBlcnJvcnM9Tm9uZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPUZhbHNlLCB0aW1lb3V0PU5vbmUpCiAKICAgIFJ1biBjb21tYW5kIHdpdGggYXJndW1lbnRzIGFuZCByZXR1cm4gaXRzIG91dHB1dC4KIApAQCAtMTEzOCw3ICsxMTY1LDcgQEAKICAgIFJldHVybiBgYChzdGF0dXMsIG91dHB1dClgYCBvZiBleGVjdXRpbmcgKmNtZCogaW4gYSBzaGVsbC4KIAogICAgRXhlY3V0ZSB0aGUgc3RyaW5nICpjbWQqIGluIGEgc2hlbGwgd2l0aCA6bWV0aDpgUG9wZW4uY2hlY2tfb3V0cHV0YCBhbmQKLSAgIHJldHVybiBhIDItdHVwbGUgYGAoc3RhdHVzLCBvdXRwdXQpYGAuIFVuaXZlcnNhbCBuZXdsaW5lcyBtb2RlIGlzIHVzZWQ7CisgICByZXR1cm4gYSAyLXR1cGxlIGBgKHN0YXR1cywgb3V0cHV0KWBgLiBUaGUgbG9jYWxlIGVuY29kaW5nIGlzIHVzZWQ7CiAgICBzZWUgdGhlIG5vdGVzIG9uIDpyZWY6YGZyZXF1ZW50bHktdXNlZC1hcmd1bWVudHNgIGZvciBtb3JlIGRldGFpbHMuCiAKICAgIEEgdHJhaWxpbmcgbmV3bGluZSBpcyBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zeXMucnN0IGIvRG9jL2xpYnJhcnkvc3lzLnJzdAppbmRleCBlZDVkYjA1Li45NDYwYjg0IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zeXMucnN0CisrKyBiL0RvYy9saWJyYXJ5L3N5cy5yc3QKQEAgLTI1Niw3ICsyNTYsNyBAQAogICAgKGRlZmF1bHRpbmcgdG8gemVybyksIG9yIGFub3RoZXIgdHlwZSBvZiBvYmplY3QuICBJZiBpdCBpcyBhbiBpbnRlZ2VyLCB6ZXJvCiAgICBpcyBjb25zaWRlcmVkICJzdWNjZXNzZnVsIHRlcm1pbmF0aW9uIiBhbmQgYW55IG5vbnplcm8gdmFsdWUgaXMgY29uc2lkZXJlZAogICAgImFibm9ybWFsIHRlcm1pbmF0aW9uIiBieSBzaGVsbHMgYW5kIHRoZSBsaWtlLiAgTW9zdCBzeXN0ZW1zIHJlcXVpcmUgaXQgdG8gYmUKLSAgIGluIHRoZSByYW5nZSAwLTEyNywgYW5kIHByb2R1Y2UgdW5kZWZpbmVkIHJlc3VsdHMgb3RoZXJ3aXNlLiAgU29tZSBzeXN0ZW1zCisgICBpbiB0aGUgcmFuZ2UgMC0tMTI3LCBhbmQgcHJvZHVjZSB1bmRlZmluZWQgcmVzdWx0cyBvdGhlcndpc2UuICBTb21lIHN5c3RlbXMKICAgIGhhdmUgYSBjb252ZW50aW9uIGZvciBhc3NpZ25pbmcgc3BlY2lmaWMgbWVhbmluZ3MgdG8gc3BlY2lmaWMgZXhpdCBjb2RlcywgYnV0CiAgICB0aGVzZSBhcmUgZ2VuZXJhbGx5IHVuZGVyZGV2ZWxvcGVkOyBVbml4IHByb2dyYW1zIGdlbmVyYWxseSB1c2UgMiBmb3IgY29tbWFuZAogICAgbGluZSBzeW50YXggZXJyb3JzIGFuZCAxIGZvciBhbGwgb3RoZXIga2luZCBvZiBlcnJvcnMuICBJZiBhbm90aGVyIHR5cGUgb2YKQEAgLTI2OSw2ICsyNjksMTEgQEAKICAgIHRoZSBwcm9jZXNzIHdoZW4gY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLCBhbmQgdGhlIGV4Y2VwdGlvbiBpcyBub3QKICAgIGludGVyY2VwdGVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoZSBjbGVhbnVwIGFmdGVyIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKKyAgICAgIGhhcyBjYXVnaHQgOmV4YzpgU3lzdGVtRXhpdGAgKHN1Y2ggYXMgYW4gZXJyb3IgZmx1c2hpbmcgYnVmZmVyZWQgZGF0YQorICAgICAgaW4gdGhlIHN0YW5kYXJkIHN0cmVhbXMpLCB0aGUgZXhpdCBzdGF0dXMgaXMgY2hhbmdlZCB0byAxMjAuCisKIAogLi4gZGF0YTo6IGZsYWdzCiAKQEAgLTQyMywyNSArNDI4LDQyIEBACiAKIC4uIGZ1bmN0aW9uOjogZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKIAotICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB1c2VkIHRvIGNvbnZlcnQgVW5pY29kZSBmaWxlbmFtZXMgaW50bwotICAgc3lzdGVtIGZpbGUgbmFtZXMuIFRoZSByZXN1bHQgdmFsdWUgZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW5nIHN5c3RlbToKKyAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZW5jb2RpbmcgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4gVW5pY29kZQorICAgZmlsZW5hbWVzIGFuZCBieXRlcyBmaWxlbmFtZXMuIEZvciBiZXN0IGNvbXBhdGliaWxpdHksIHN0ciBzaG91bGQgYmUKKyAgIHVzZWQgZm9yIGZpbGVuYW1lcyBpbiBhbGwgY2FzZXMsIGFsdGhvdWdoIHJlcHJlc2VudGluZyBmaWxlbmFtZXMgYXMgYnl0ZXMKKyAgIGlzIGFsc28gc3VwcG9ydGVkLiBGdW5jdGlvbnMgYWNjZXB0aW5nIG9yIHJldHVybmluZyBmaWxlbmFtZXMgc2hvdWxkIHN1cHBvcnQKKyAgIGVpdGhlciBzdHIgb3IgYnl0ZXMgYW5kIGludGVybmFsbHkgY29udmVydCB0byB0aGUgc3lzdGVtJ3MgcHJlZmVycmVkCisgICByZXByZXNlbnRhdGlvbi4KKworICAgVGhpcyBlbmNvZGluZyBpcyBhbHdheXMgQVNDSUktY29tcGF0aWJsZS4KKworICAgOmZ1bmM6YG9zLmZzZW5jb2RlYCBhbmQgOmZ1bmM6YG9zLmZzZGVjb2RlYCBzaG91bGQgYmUgdXNlZCB0byBlbnN1cmUgdGhhdAorICAgdGhlIGNvcnJlY3QgZW5jb2RpbmcgYW5kIGVycm9ycyBtb2RlIGFyZSB1c2VkLgogCiAgICAqIE9uIE1hYyBPUyBYLCB0aGUgZW5jb2RpbmcgaXMgYGAndXRmLTgnYGAuCiAKLSAgICogT24gVW5peCwgdGhlIGVuY29kaW5nIGlzIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZSBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdCBvZgotICAgICBubF9sYW5naW5mbyhDT0RFU0VUKS4KKyAgICogT24gVW5peCwgdGhlIGVuY29kaW5nIGlzIHRoZSBsb2NhbGUgZW5jb2RpbmcuCiAKLSAgICogT24gV2luZG93cyBOVCssIGZpbGUgbmFtZXMgYXJlIFVuaWNvZGUgbmF0aXZlbHksIHNvIG5vIGNvbnZlcnNpb24gaXMKLSAgICAgcGVyZm9ybWVkLiA6ZnVuYzpgZ2V0ZmlsZXN5c3RlbWVuY29kaW5nYCBzdGlsbCByZXR1cm5zIGBgJ21iY3MnYGAsIGFzCi0gICAgIHRoaXMgaXMgdGhlIGVuY29kaW5nIHRoYXQgYXBwbGljYXRpb25zIHNob3VsZCB1c2Ugd2hlbiB0aGV5IGV4cGxpY2l0bHkKLSAgICAgd2FudCB0byBjb252ZXJ0IFVuaWNvZGUgc3RyaW5ncyB0byBieXRlIHN0cmluZ3MgdGhhdCBhcmUgZXF1aXZhbGVudCB3aGVuCi0gICAgIHVzZWQgYXMgZmlsZSBuYW1lcy4KLQotICAgKiBPbiBXaW5kb3dzIDl4LCB0aGUgZW5jb2RpbmcgaXMgYGAnbWJjcydgYC4KKyAgICogT24gV2luZG93cywgdGhlIGVuY29kaW5nIG1heSBiZSBgYCd1dGYtOCdgYCBvciBgYCdtYmNzJ2BgLCBkZXBlbmRpbmcKKyAgICAgb24gdXNlciBjb25maWd1cmF0aW9uLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMgogICAgICAgOmZ1bmM6YGdldGZpbGVzeXN0ZW1lbmNvZGluZ2AgcmVzdWx0IGNhbm5vdCBiZSBgYE5vbmVgYCBhbnltb3JlLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgV2luZG93cyBpcyBubyBsb25nZXIgZ3VhcmFudGVlZCB0byByZXR1cm4gYGAnbWJjcydgYC4gU2VlIDpwZXA6YDUyOWAKKyAgICAgIGFuZCA6ZnVuYzpgX2VuYWJsZWxlZ2FjeXdpbmRvd3Nmc2VuY29kaW5nYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworLi4gZnVuY3Rpb246OiBnZXRmaWxlc3lzdGVtZW5jb2RlZXJyb3JzKCkKKworICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlcnJvciBtb2RlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuIFVuaWNvZGUgZmlsZW5hbWVzCisgICBhbmQgYnl0ZXMgZmlsZW5hbWVzLiBUaGUgZW5jb2RpbmcgbmFtZSBpcyByZXR1cm5lZCBmcm9tCisgICA6ZnVuYzpgZ2V0ZmlsZXN5c3RlbWVuY29kaW5nYC4KKworICAgOmZ1bmM6YG9zLmZzZW5jb2RlYCBhbmQgOmZ1bmM6YG9zLmZzZGVjb2RlYCBzaG91bGQgYmUgdXNlZCB0byBlbnN1cmUgdGhhdAorICAgdGhlIGNvcnJlY3QgZW5jb2RpbmcgYW5kIGVycm9ycyBtb2RlIGFyZSB1c2VkLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKIAogLi4gZnVuY3Rpb246OiBnZXRyZWZjb3VudChvYmplY3QpCiAKQEAgLTExMzMsNiArMTE1NSwxOCBAQAogICAgICAgVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBhZGRlZCBvbiBhIHByb3Zpc2lvbmFsIGJhc2lzIChzZWUgOnBlcDpgNDExYAogICAgICAgZm9yIGRldGFpbHMuKSAgVXNlIGl0IG9ubHkgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KIAorLi4gZnVuY3Rpb246OiBfZW5hYmxlbGVnYWN5d2luZG93c2ZzZW5jb2RpbmcoKQorCisgICBDaGFuZ2VzIHRoZSBkZWZhdWx0IGZpbGVzeXN0ZW0gZW5jb2RpbmcgYW5kIGVycm9ycyBtb2RlIHRvICdtYmNzJyBhbmQKKyAgICdyZXBsYWNlJyByZXNwZWN0aXZlbHksIGZvciBjb25zaXN0ZW5jeSB3aXRoIHZlcnNpb25zIG9mIFB5dGhvbiBwcmlvciB0byAzLjYuCisKKyAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBkZWZpbmluZyB0aGUgOmVudnZhcjpgUFlUSE9OTEVHQUNZV0lORE9XU0ZTRU5DT0RJTkdgCisgICBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgbGF1bmNoaW5nIFB5dGhvbi4KKworICAgQXZhaWxhYmlsaXR5OiBXaW5kb3dzCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgU2VlIDpwZXA6YDUyOWAgZm9yIG1vcmUgZGV0YWlscy4KIAogLi4gZGF0YTo6IHN0ZGluCiAgICAgICAgICAgc3Rkb3V0CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zeXNjb25maWcucnN0IGIvRG9jL2xpYnJhcnkvc3lzY29uZmlnLnJzdAppbmRleCA2YmEwOTRkLi4yOTE3N2EzIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zeXNjb25maWcucnN0CisrKyBiL0RvYy9saWJyYXJ5L3N5c2NvbmZpZy5yc3QKQEAgLTE2NCw3ICsxNjQsNyBAQAogLi4gZnVuY3Rpb246OiBnZXRfcHl0aG9uX3ZlcnNpb24oKQogCiAgICBSZXR1cm4gdGhlIGBgTUFKT1IuTUlOT1JgYCBQeXRob24gdmVyc2lvbiBudW1iZXIgYXMgYSBzdHJpbmcuICBTaW1pbGFyIHRvCi0gICBgYHN5cy52ZXJzaW9uWzozXWBgLgorICAgYGAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml1gYC4KIAogCiAuLiBmdW5jdGlvbjo6IGdldF9wbGF0Zm9ybSgpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90ZWxuZXRsaWIucnN0IGIvRG9jL2xpYnJhcnkvdGVsbmV0bGliLnJzdAppbmRleCBiOTUwZTQxLi5mOWM1MTUzIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90ZWxuZXRsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RlbG5ldGxpYi5yc3QKQEAgLTQzLDYgKzQzLDE3IEBACiAgICA6ZXhjOmBFT0ZFcnJvcmAgd2hlbiB0aGUgZW5kIG9mIHRoZSBjb25uZWN0aW9uIGlzIHJlYWQsIGJlY2F1c2UgdGhleSBjYW4gcmV0dXJuCiAgICBhbiBlbXB0eSBzdHJpbmcgZm9yIG90aGVyIHJlYXNvbnMuICBTZWUgdGhlIGluZGl2aWR1YWwgZGVzY3JpcHRpb25zIGJlbG93LgogCisgICBBIDpjbGFzczpgVGVsbmV0YCBvYmplY3QgaXMgYSBjb250ZXh0IG1hbmFnZXIgYW5kIGNhbiBiZSB1c2VkIGluIGEKKyAgIDprZXl3b3JkOmB3aXRoYCBzdGF0ZW1lbnQuICBXaGVuIHRoZSA6a2V5d29yZDpgd2l0aGAgYmxvY2sgZW5kcywgdGhlCisgICA6bWV0aDpgY2xvc2VgIG1ldGhvZCBpcyBjYWxsZWQ6OgorCisgICAgICAgPj4+IGZyb20gdGVsbmV0bGliIGltcG9ydCBUZWxuZXQKKyAgICAgICA+Pj4gd2l0aCBUZWxuZXQoJ2xvY2FsaG9zdCcsIDIzKSBhcyB0bjoKKyAgICAgICAuLi4gICAgIHRuLmludGVyYWN0KCkKKyAgICAgICAuLi4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYgQ29udGV4dCBtYW5hZ2VyIHN1cHBvcnQgYWRkZWQKKwogCiAuLiBzZWVhbHNvOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGVzdC5yc3QgYi9Eb2MvbGlicmFyeS90ZXN0LnJzdAppbmRleCAyZWE5YzI3Li43MTE0Y2RmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90ZXN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS90ZXN0LnJzdApAQCAtNTgyLDYgKzU4Miw0OCBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKIAorLi4gZnVuY3Rpb246OiBjaGVja19fYWxsX18odGVzdF9jYXNlLCBtb2R1bGUsIG5hbWVfb2ZfbW9kdWxlPU5vbmUsIGV4dHJhPSgpLCBibGFja2xpc3Q9KCkpCisKKyAgIEFzc2VydCB0aGF0IHRoZSBgYF9fYWxsX19gYCB2YXJpYWJsZSBvZiAqbW9kdWxlKiBjb250YWlucyBhbGwgcHVibGljIG5hbWVzLgorCisgICBUaGUgbW9kdWxlJ3MgcHVibGljIG5hbWVzIChpdHMgQVBJKSBhcmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseQorICAgYmFzZWQgb24gd2hldGhlciB0aGV5IG1hdGNoIHRoZSBwdWJsaWMgbmFtZSBjb252ZW50aW9uIGFuZCB3ZXJlIGRlZmluZWQgaW4KKyAgICptb2R1bGUqLgorCisgICBUaGUgKm5hbWVfb2ZfbW9kdWxlKiBhcmd1bWVudCBjYW4gc3BlY2lmeSAoYXMgYSBzdHJpbmcgb3IgdHVwbGUgdGhlcmVvZikgd2hhdAorICAgbW9kdWxlKHMpIGFuIEFQSSBjb3VsZCBiZSBkZWZpbmVkIGluIGluIG9yZGVyIHRvIGJlIGRldGVjdGVkIGFzIGEgcHVibGljCisgICBBUEkuIE9uZSBjYXNlIGZvciB0aGlzIGlzIHdoZW4gKm1vZHVsZSogaW1wb3J0cyBwYXJ0IG9mIGl0cyBwdWJsaWMgQVBJIGZyb20KKyAgIG90aGVyIG1vZHVsZXMsIHBvc3NpYmx5IGEgQyBiYWNrZW5kIChsaWtlIGBgY3N2YGAgYW5kIGl0cyBgYF9jc3ZgYCkuCisKKyAgIFRoZSAqZXh0cmEqIGFyZ3VtZW50IGNhbiBiZSBhIHNldCBvZiBuYW1lcyB0aGF0IHdvdWxkbid0IG90aGVyd2lzZSBiZSBhdXRvbWF0aWNhbGx5CisgICBkZXRlY3RlZCBhcyAicHVibGljIiwgbGlrZSBvYmplY3RzIHdpdGhvdXQgYSBwcm9wZXIgYGBfX21vZHVsZV9fYGAKKyAgIGF0dHJpYnV0ZS4gSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgb25lcy4KKworICAgVGhlICpibGFja2xpc3QqIGFyZ3VtZW50IGNhbiBiZSBhIHNldCBvZiBuYW1lcyB0aGF0IG11c3Qgbm90IGJlIHRyZWF0ZWQgYXMgcGFydCBvZgorICAgdGhlIHB1YmxpYyBBUEkgZXZlbiB0aG91Z2ggdGhlaXIgbmFtZXMgaW5kaWNhdGUgb3RoZXJ3aXNlLgorCisgICBFeGFtcGxlIHVzZTo6CisKKyAgICAgIGltcG9ydCBiYXIKKyAgICAgIGltcG9ydCBmb28KKyAgICAgIGltcG9ydCB1bml0dGVzdAorICAgICAgZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CisKKyAgICAgIGNsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBmb28pCisKKyAgICAgIGNsYXNzIE90aGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgZXh0cmEgPSB7J0JBUl9DT05TVCcsICdGT09fQ09OU1QnfQorICAgICAgICAgICAgICBibGFja2xpc3QgPSB7J2Jheid9ICAjIFVuZG9jdW1lbnRlZCBuYW1lLgorICAgICAgICAgICAgICAjIGJhciBpbXBvcnRzIHBhcnQgb2YgaXRzIEFQSSBmcm9tIF9iYXIuCisgICAgICAgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGJhciwgKCdiYXInLCAnX2JhcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogVGhlIDptb2Q6YHRlc3Quc3VwcG9ydGAgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOgogCiAuLiBjbGFzczo6IFRyYW5zaWVudFJlc291cmNlKGV4YywgKiprd2FyZ3MpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90aW1lLnJzdCBiL0RvYy9saWJyYXJ5L3RpbWUucnN0CmluZGV4IGU2NjI2ZjIuLjdjODFjZTcgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3RpbWUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RpbWUucnN0CkBAIC02MzcsMTEgKzYzNywxMSBAQAogICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gcmVmZXIgdG8gRmVicnVhcnkgMjkuCiAKICAgICAgIDpzYW1wOmBNe219LntufS57ZH1gCi0gICAgICAgICBUaGUgKmQqJ3RoIGRheSAoMCA8PSAqZCogPD0gNikgb3Igd2VlayAqbiogb2YgbW9udGggKm0qIG9mIHRoZSB5ZWFyICgxCisgICAgICAgICBUaGUgKmQqJ3RoIGRheSAoMCA8PSAqZCogPD0gNikgb2Ygd2VlayAqbiogb2YgbW9udGggKm0qIG9mIHRoZSB5ZWFyICgxCiAgICAgICAgICA8PSAqbiogPD0gNSwgMSA8PSAqbSogPD0gMTIsIHdoZXJlIHdlZWsgNSBtZWFucyAidGhlIGxhc3QgKmQqIGRheSBpbgogICAgICAgICAgbW9udGggKm0qIiB3aGljaCBtYXkgb2NjdXIgaW4gZWl0aGVyIHRoZSBmb3VydGggb3IgdGhlIGZpZnRoCiAgICAgICAgICB3ZWVrKS4gV2VlayAxIGlzIHRoZSBmaXJzdCB3ZWVrIGluIHdoaWNoIHRoZSAqZCondGggZGF5IG9jY3Vycy4gRGF5Ci0gICAgICAgICB6ZXJvIGlzIFN1bmRheS4KKyAgICAgICAgIHplcm8gaXMgYSBTdW5kYXkuCiAKICAgICAgIGBgdGltZWBgIGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgYGBvZmZzZXRgYCBleGNlcHQgdGhhdCBubyBsZWFkaW5nIHNpZ24KICAgICAgICgnLScgb3IgJysnKSBpcyBhbGxvd2VkLiBUaGUgZGVmYXVsdCwgaWYgdGltZSBpcyBub3QgZ2l2ZW4sIGlzIDAyOjAwOjAwLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGltZWl0LnJzdCBiL0RvYy9saWJyYXJ5L3RpbWVpdC5yc3QKaW5kZXggNTdhNDgzNC4uNWJhZTMzYiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGltZWl0LnJzdAorKysgYi9Eb2MvbGlicmFyeS90aW1laXQucnN0CkBAIC0xMDAsOCArMTAwLDggQEAKICAgIGNhbiBiZSBjb250cm9sbGVkIGJ5IHBhc3NpbmcgYSBuYW1lc3BhY2UgdG8gKmdsb2JhbHMqLgogCiAgICBUbyBtZWFzdXJlIHRoZSBleGVjdXRpb24gdGltZSBvZiB0aGUgZmlyc3Qgc3RhdGVtZW50LCB1c2UgdGhlIDptZXRoOmAudGltZWl0YAotICAgbWV0aG9kLiAgVGhlIDptZXRoOmAucmVwZWF0YCBtZXRob2QgaXMgYSBjb252ZW5pZW5jZSB0byBjYWxsIDptZXRoOmAudGltZWl0YAotICAgbXVsdGlwbGUgdGltZXMgYW5kIHJldHVybiBhIGxpc3Qgb2YgcmVzdWx0cy4KKyAgIG1ldGhvZC4gIFRoZSA6bWV0aDpgLnJlcGVhdGAgYW5kIDptZXRoOmAuYXV0b3JhbmdlYCBtZXRob2RzIGFyZSBjb252ZW5pZW5jZQorICAgbWV0aG9kcyB0byBjYWxsIDptZXRoOmAudGltZWl0YCBtdWx0aXBsZSB0aW1lcy4KIAogICAgVGhlIGV4ZWN1dGlvbiB0aW1lIG9mICpzZXR1cCogaXMgZXhjbHVkZWQgZnJvbSB0aGUgb3ZlcmFsbCB0aW1lZCBleGVjdXRpb24gcnVuLgogCkBAIC0xMzQsNiArMTM0LDIzIEBACiAgICAgICAgICAgICB0aW1laXQuVGltZXIoJ2ZvciBpIGluIHJhbmdlKDEwKTogb2N0KGkpJywgJ2djLmVuYWJsZSgpJykudGltZWl0KCkKIAogCisgICAgLi4gbWV0aG9kOjogVGltZXIuYXV0b3JhbmdlKGNhbGxiYWNrPU5vbmUpCisKKyAgICAgICBBdXRvbWF0aWNhbGx5IGRldGVybWluZSBob3cgbWFueSB0aW1lcyB0byBjYWxsIDptZXRoOmAudGltZWl0YC4KKworICAgICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGNhbGxzIDptZXRoOmAudGltZWl0YCByZXBlYXRlZGx5CisgICAgICAgc28gdGhhdCB0aGUgdG90YWwgdGltZSA+PSAwLjIgc2Vjb25kLCByZXR1cm5pbmcgdGhlIGV2ZW50dWFsCisgICAgICAgKG51bWJlciBvZiBsb29wcywgdGltZSB0YWtlbiBmb3IgdGhhdCBudW1iZXIgb2YgbG9vcHMpLiBJdCBjYWxscworICAgICAgIDptZXRoOmAudGltZWl0YCB3aXRoICpudW1iZXIqIHNldCB0byBzdWNjZXNzaXZlIHBvd2VycyBvZiB0ZW4gKDEwLAorICAgICAgIDEwMCwgMTAwMCwgLi4uKSB1cCB0byBhIG1heGltdW0gb2Ygb25lIGJpbGxpb24sIHVudGlsIHRoZSB0aW1lIHRha2VuCisgICAgICAgaXMgYXQgbGVhc3QgMC4yIHNlY29uZCwgb3IgdGhlIG1heGltdW0gaXMgcmVhY2hlZC4KKworICAgICAgICBJZiAqY2FsbGJhY2sqIGlzIGdpdmVuIGFuZCBpcyBub3QgKk5vbmUqLCBpdCB3aWxsIGJlIGNhbGxlZCBhZnRlcgorICAgICAgICBlYWNoIHRyaWFsIHdpdGggdHdvIGFyZ3VtZW50czogYGBjYWxsYmFjayhudW1iZXIsIHRpbWVfdGFrZW4pYGAuCisKKyAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogICAgLi4gbWV0aG9kOjogVGltZXIucmVwZWF0KHJlcGVhdD0zLCBudW1iZXI9MTAwMDAwMCkKIAogICAgICAgQ2FsbCA6bWV0aDpgLnRpbWVpdGAgYSBmZXcgdGltZXMuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90a2ludGVyLnRpeC5yc3QgYi9Eb2MvbGlicmFyeS90a2ludGVyLnRpeC5yc3QKaW5kZXggNDFmMjBkZC4uMTFlZDc1NSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGtpbnRlci50aXgucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RraW50ZXIudGl4LnJzdApAQCAtMTAsNiArMTAsMTAgQEAKIAogLi4gaW5kZXg6OiBzaW5nbGU6IFRpeAogCisuLiBkZXByZWNhdGVkOjogMy42CisgICBUaGlzIFRrIGV4dGVuc2lvbiBpcyB1bm1haW50YWluZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBpbiBuZXcgY29kZS4gIFVzZQorICAgOm1vZDpgdGtpbnRlci50dGtgIGluc3RlYWQuCisKIC0tLS0tLS0tLS0tLS0tCiAKIFRoZSA6bW9kOmB0a2ludGVyLnRpeGAgKFRrIEludGVyZmFjZSBFeHRlbnNpb24pIG1vZHVsZSBwcm92aWRlcyBhbiBhZGRpdGlvbmFsCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90cmFjZWJhY2sucnN0IGIvRG9jL2xpYnJhcnkvdHJhY2ViYWNrLnJzdAppbmRleCAzYzFkOWJiLi4wNjZlZTk2IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90cmFjZWJhY2sucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RyYWNlYmFjay5yc3QKQEAgLTI5MSw2ICsyOTEsMjAgQEAKICAgICAgIG9mIHR1cGxlcy4gRWFjaCB0dXBsZSBzaG91bGQgYmUgYSA0LXR1cGxlIHdpdGggZmlsZW5hbWUsIGxpbmVubywgbmFtZSwKICAgICAgIGxpbmUgYXMgdGhlIGVsZW1lbnRzLgogCisgICAuLiBtZXRob2Q6OiBmb3JtYXQoKQorCisgICAgICBSZXR1cm5zIGEgbGlzdCBvZiBzdHJpbmdzIHJlYWR5IGZvciBwcmludGluZy4gIEVhY2ggc3RyaW5nIGluIHRoZQorICAgICAgcmVzdWx0aW5nIGxpc3QgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgZnJhbWUgZnJvbSB0aGUgc3RhY2suCisgICAgICBFYWNoIHN0cmluZyBlbmRzIGluIGEgbmV3bGluZTsgdGhlIHN0cmluZ3MgbWF5IGNvbnRhaW4gaW50ZXJuYWwKKyAgICAgIG5ld2xpbmVzIGFzIHdlbGwsIGZvciB0aG9zZSBpdGVtcyB3aXRoIHNvdXJjZSB0ZXh0IGxpbmVzLgorCisgICAgICBGb3IgbG9uZyBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgZnJhbWUgYW5kIGxpbmUsIHRoZSBmaXJzdCBmZXcKKyAgICAgIHJlcGV0aXRpb25zIGFyZSBzaG93biwgZm9sbG93ZWQgYnkgYSBzdW1tYXJ5IGxpbmUgc3RhdGluZyB0aGUgZXhhY3QKKyAgICAgIG51bWJlciBvZiBmdXJ0aGVyIHJlcGV0aXRpb25zLgorCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgTG9uZyBzZXF1ZW5jZXMgb2YgcmVwZWF0ZWQgZnJhbWVzIGFyZSBub3cgYWJicmV2aWF0ZWQuCisKIAogOmNsYXNzOmBGcmFtZVN1bW1hcnlgIE9iamVjdHMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90cmFjZW1hbGxvYy5yc3QgYi9Eb2MvbGlicmFyeS90cmFjZW1hbGxvYy5yc3QKaW5kZXggM2EwYjFlMC4uZjU2ZjI3YiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdHJhY2VtYWxsb2MucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RyYWNlbWFsbG9jLnJzdApAQCAtMzU5LDEwICszNTksMzIgQEAKICAgIFNlZSBhbHNvIHRoZSA6ZnVuYzpgZ2V0X29iamVjdF90cmFjZWJhY2tgIGZ1bmN0aW9uLgogCiAKK0RvbWFpbkZpbHRlcgorXl5eXl5eXl5eXl5eCisKKy4uIGNsYXNzOjogRG9tYWluRmlsdGVyKGluY2x1c2l2ZTogYm9vbCwgZG9tYWluOiBpbnQpCisKKyAgIEZpbHRlciB0cmFjZXMgb2YgbWVtb3J5IGJsb2NrcyBieSB0aGVpciBhZGRyZXNzIHNwYWNlIChkb21haW4pLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworICAgLi4gYXR0cmlidXRlOjogaW5jbHVzaXZlCisKKyAgICAgIElmICppbmNsdXNpdmUqIGlzIGBgVHJ1ZWBgIChpbmNsdWRlKSwgbWF0Y2ggbWVtb3J5IGJsb2NrcyBhbGxvY2F0ZWQKKyAgICAgIGluIHRoZSBhZGRyZXNzIHNwYWNlIDphdHRyOmBkb21haW5gLgorCisgICAgICBJZiAqaW5jbHVzaXZlKiBpcyBgYEZhbHNlYGAgKGV4Y2x1ZGUpLCBtYXRjaCBtZW1vcnkgYmxvY2tzIG5vdCBhbGxvY2F0ZWQKKyAgICAgIGluIHRoZSBhZGRyZXNzIHNwYWNlIDphdHRyOmBkb21haW5gLgorCisgICAuLiBhdHRyaWJ1dGU6OiBkb21haW4KKworICAgICAgQWRkcmVzcyBzcGFjZSBvZiBhIG1lbW9yeSBibG9jayAoYGBpbnRgYCkuIFJlYWQtb25seSBwcm9wZXJ0eS4KKworCiBGaWx0ZXIKIF5eXl5eXgogCi0uLiBjbGFzczo6IEZpbHRlcihpbmNsdXNpdmU6IGJvb2wsIGZpbGVuYW1lX3BhdHRlcm46IHN0ciwgbGluZW5vOiBpbnQ9Tm9uZSwgYWxsX2ZyYW1lczogYm9vbD1GYWxzZSkKKy4uIGNsYXNzOjogRmlsdGVyKGluY2x1c2l2ZTogYm9vbCwgZmlsZW5hbWVfcGF0dGVybjogc3RyLCBsaW5lbm86IGludD1Ob25lLCBhbGxfZnJhbWVzOiBib29sPUZhbHNlLCBkb21haW46IGludD1Ob25lKQogCiAgICBGaWx0ZXIgb24gdHJhY2VzIG9mIG1lbW9yeSBibG9ja3MuCiAKQEAgLTM4Miw5ICs0MDQsMTcgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAgICAgICBUaGUgYGAnLnB5bydgYCBmaWxlIGV4dGVuc2lvbiBpcyBubyBsb25nZXIgcmVwbGFjZWQgd2l0aCBgYCcucHknYGAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCB0aGUgOmF0dHI6YGRvbWFpbmAgYXR0cmlidXRlLgorCisKKyAgIC4uIGF0dHJpYnV0ZTo6IGRvbWFpbgorCisgICAgICBBZGRyZXNzIHNwYWNlIG9mIGEgbWVtb3J5IGJsb2NrIChgYGludGBgIG9yIGBgTm9uZWBgKS4KKwogICAgLi4gYXR0cmlidXRlOjogaW5jbHVzaXZlCiAKLSAgICAgIElmICppbmNsdXNpdmUqIGlzIGBgVHJ1ZWBgIChpbmNsdWRlKSwgb25seSB0cmFjZSBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZAorICAgICAgSWYgKmluY2x1c2l2ZSogaXMgYGBUcnVlYGAgKGluY2x1ZGUpLCBvbmx5IG1hdGNoIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkCiAgICAgICBpbiBhIGZpbGUgd2l0aCBhIG5hbWUgbWF0Y2hpbmcgOmF0dHI6YGZpbGVuYW1lX3BhdHRlcm5gIGF0IGxpbmUgbnVtYmVyCiAgICAgICA6YXR0cjpgbGluZW5vYC4KIApAQCAtMzk5LDcgKzQyOSw3IEBACiAKICAgIC4uIGF0dHJpYnV0ZTo6IGZpbGVuYW1lX3BhdHRlcm4KIAotICAgICAgRmlsZW5hbWUgcGF0dGVybiBvZiB0aGUgZmlsdGVyIChgYHN0cmBgKS4KKyAgICAgIEZpbGVuYW1lIHBhdHRlcm4gb2YgdGhlIGZpbHRlciAoYGBzdHJgYCkuIFJlYWQtb25seSBwcm9wZXJ0eS4KIAogICAgLi4gYXR0cmlidXRlOjogYWxsX2ZyYW1lcwogCkBAIC00NjIsMTQgKzQ5MiwxNyBAQAogICAgLi4gbWV0aG9kOjogZmlsdGVyX3RyYWNlcyhmaWx0ZXJzKQogCiAgICAgICBDcmVhdGUgYSBuZXcgOmNsYXNzOmBTbmFwc2hvdGAgaW5zdGFuY2Ugd2l0aCBhIGZpbHRlcmVkIDphdHRyOmB0cmFjZXNgCi0gICAgICBzZXF1ZW5jZSwgKmZpbHRlcnMqIGlzIGEgbGlzdCBvZiA6Y2xhc3M6YEZpbHRlcmAgaW5zdGFuY2VzLiAgSWYgKmZpbHRlcnMqCi0gICAgICBpcyBhbiBlbXB0eSBsaXN0LCByZXR1cm4gYSBuZXcgOmNsYXNzOmBTbmFwc2hvdGAgaW5zdGFuY2Ugd2l0aCBhIGNvcHkgb2YKLSAgICAgIHRoZSB0cmFjZXMuCisgICAgICBzZXF1ZW5jZSwgKmZpbHRlcnMqIGlzIGEgbGlzdCBvZiA6Y2xhc3M6YERvbWFpbkZpbHRlcmAgYW5kCisgICAgICA6Y2xhc3M6YEZpbHRlcmAgaW5zdGFuY2VzLiAgSWYgKmZpbHRlcnMqIGlzIGFuIGVtcHR5IGxpc3QsIHJldHVybiBhIG5ldworICAgICAgOmNsYXNzOmBTbmFwc2hvdGAgaW5zdGFuY2Ugd2l0aCBhIGNvcHkgb2YgdGhlIHRyYWNlcy4KIAogICAgICAgQWxsIGluY2x1c2l2ZSBmaWx0ZXJzIGFyZSBhcHBsaWVkIGF0IG9uY2UsIGEgdHJhY2UgaXMgaWdub3JlZCBpZiBubwogICAgICAgaW5jbHVzaXZlIGZpbHRlcnMgbWF0Y2ggaXQuIEEgdHJhY2UgaXMgaWdub3JlZCBpZiBhdCBsZWFzdCBvbmUgZXhjbHVzaXZlCiAgICAgICBmaWx0ZXIgbWF0Y2hlcyBpdC4KIAorICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICAgIDpjbGFzczpgRG9tYWluRmlsdGVyYCBpbnN0YW5jZXMgYXJlIG5vdyBhbHNvIGFjY2VwdGVkIGluICpmaWx0ZXJzKi4KKwogCiAgICAuLiBjbGFzc21ldGhvZDo6IGxvYWQoZmlsZW5hbWUpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3R5cGVzLnJzdCBiL0RvYy9saWJyYXJ5L3R5cGVzLnJzdAppbmRleCAxMThiYzRjLi44OThiOTVhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90eXBlcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdHlwZXMucnN0CkBAIC01NSw2ICs1NSwxMiBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKworICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBgYG5hbWVzcGFjZWBgIGVsZW1lbnQgb2YgdGhlIHJldHVybmVkCisgICAgICB0dXBsZSBoYXMgY2hhbmdlZC4gIE5vdyBhbiBpbnNlcnRpb24tb3JkZXItcHJlc2VydmluZyBtYXBwaW5nIGlzCisgICAgICB1c2VkIHdoZW4gdGhlIG1ldGFjbGFzcyBkb2VzIG5vdCBoYXZlIGEgYGBfX3ByZXBhcmVfX2BgIG1ldGhvZCwKKwogLi4gc2VlYWxzbzo6CiAKICAgIDpyZWY6YG1ldGFjbGFzc2VzYApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdHlwaW5nLnJzdCBiL0RvYy9saWJyYXJ5L3R5cGluZy5yc3QKaW5kZXggODNhOGRjZi4uMjNiY2M4YyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdHlwaW5nLnJzdAorKysgYi9Eb2MvbGlicmFyeS90eXBpbmcucnN0CkBAIC0yMDQsNyArMjA0LDcgQEAKICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKIAogICAgICAgIGRlZiBsb2coc2VsZiwgbWVzc2FnZTogc3RyKSAtPiBOb25lOgotICAgICAgICAgICBzZWxmLmxvZ2dlci5pbmZvKCd7fToge30nLmZvcm1hdChzZWxmLm5hbWUsIG1lc3NhZ2UpKQorICAgICAgICAgICBzZWxmLmxvZ2dlci5pbmZvKCclczogJXMnLCBzZWxmLm5hbWUsIG1lc3NhZ2UpCiAKIGBgR2VuZXJpY1tUXWBgIGFzIGEgYmFzZSBjbGFzcyBkZWZpbmVzIHRoYXQgdGhlIGNsYXNzIGBgTG9nZ2VkVmFyYGAgdGFrZXMgYQogc2luZ2xlIHR5cGUgcGFyYW1ldGVyIGBgVGBgIC4gVGhpcyBhbHNvIG1ha2VzIGBgVGBgIHZhbGlkIGFzIGEgdHlwZSB3aXRoaW4gdGhlCkBAIC01NDMsMTEgKzU0MywxNSBAQAogCiAuLiBjbGFzczo6IEl0ZXJhYmxlKEdlbmVyaWNbVF9jb10pCiAKLSAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGVgLgorICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlYC4KIAogLi4gY2xhc3M6OiBJdGVyYXRvcihJdGVyYWJsZVtUX2NvXSkKIAotICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5JdGVyYXRvcmAuCisgICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuSXRlcmF0b3JgLgorCisuLiBjbGFzczo6IFJldmVyc2libGUoSXRlcmFibGVbVF9jb10pCisKKyAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5SZXZlcnNpYmxlYC4KIAogLi4gY2xhc3M6OiBTdXBwb3J0c0ludAogCkBAIC01NjcsMTEgKzU3MSw2IEBACiAgICAgQW4gQUJDIHdpdGggb25lIGFic3RyYWN0IG1ldGhvZCBgYF9fcm91bmRfX2BgCiAgICAgdGhhdCBpcyBjb3ZhcmlhbnQgaW4gaXRzIHJldHVybiB0eXBlLgogCi0uLiBjbGFzczo6IFJldmVyc2libGUKLQotICAgIEFuIEFCQyB3aXRoIG9uZSBhYnN0cmFjdCBtZXRob2QgYGBfX3JldmVyc2VkX19gYCByZXR1cm5pbmcKLSAgICBhbiBgYEl0ZXJhdG9yW1RfY29dYGAuCi0KIC4uIGNsYXNzOjogQ29udGFpbmVyKEdlbmVyaWNbVF9jb10pCiAKICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5Db250YWluZXJgLgpAQCAtNTkyLDcgKzU5MSw3IEBACiAKICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlTWFwcGluZ2AuCiAKLS4uIGNsYXNzOjogU2VxdWVuY2UoU2l6ZWQsIEl0ZXJhYmxlW1RfY29dLCBDb250YWluZXJbVF9jb10pCisuLiBjbGFzczo6IFNlcXVlbmNlKFNpemVkLCBSZXZlcnNpYmxlW1RfY29dLCBDb250YWluZXJbVF9jb10pCiAKICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZWAuCiAKQEAgLTY0Nyw2ICs2NDYsMjQgQEAKIAogICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuVmFsdWVzVmlld2AuCiAKKy4uIGNsYXNzOjogQXdhaXRhYmxlKEdlbmVyaWNbVF9jb10pCisKKyAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLkF3YWl0YWJsZWAuCisKKy4uIGNsYXNzOjogQXN5bmNJdGVyYWJsZShHZW5lcmljW1RfY29dKQorCisgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5Bc3luY0l0ZXJhYmxlYC4KKworLi4gY2xhc3M6OiBBc3luY0l0ZXJhdG9yKEFzeW5jSXRlcmFibGVbVF9jb10pCisKKyAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuQXN5bmNJdGVyYXRvcmAuCisKKy4uIGNsYXNzOjogQ29udGV4dE1hbmFnZXIoR2VuZXJpY1tUX2NvXSkKKworICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXJgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogLi4gY2xhc3M6OiBEaWN0KGRpY3QsIE11dGFibGVNYXBwaW5nW0tULCBWVF0pCiAKICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgZGljdGAuCkBAIC02NzksNyArNjk2LDcgQEAKICAgICAgICAgICAgICAgc3RhcnQgKz0gMQogCiAgICBBbHRlcm5hdGl2ZWx5LCBhbm5vdGF0ZSB5b3VyIGdlbmVyYXRvciBhcyBoYXZpbmcgYSByZXR1cm4gdHlwZSBvZgotICAgYGBJdGVyYXRvcltZaWVsZFR5cGVdYGA6OgorICAgZWl0aGVyIGBgSXRlcmFibGVbWWllbGRUeXBlXWBgIG9yIGBgSXRlcmF0b3JbWWllbGRUeXBlXWBgOjoKIAogICAgICAgZGVmIGluZmluaXRlX3N0cmVhbShzdGFydDogaW50KSAtPiBJdGVyYXRvcltpbnRdOgogICAgICAgICAgIHdoaWxlIFRydWU6CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91bmRvYy5yc3QgYi9Eb2MvbGlicmFyeS91bmRvYy5yc3QKaW5kZXggMjA4MzBlMi4uMjQ0NDA4MCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdW5kb2MucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VuZG9jLnJzdApAQCAtMjAsNyArMjAsNyBAQAogZG9jdW1lbnRlZCBiZXlvbmQgdGhpcyBtZW50aW9uLiAgVGhlcmUncyBsaXR0bGUgbmVlZCB0byBkb2N1bWVudCB0aGVzZS4KIAogOm1vZDpgbnRwYXRoYAotICAgLS0tIEltcGxlbWVudGF0aW9uIG9mIDptb2Q6YG9zLnBhdGhgIG9uIFdpbjMyLCBXaW42NCwgYW5kIFdpbkNFIHBsYXRmb3Jtcy4KKyAgIC0tLSBJbXBsZW1lbnRhdGlvbiBvZiA6bW9kOmBvcy5wYXRoYCBvbiBXaW4zMiBhbmQgV2luNjQgcGxhdGZvcm1zLgogCiA6bW9kOmBwb3NpeHBhdGhgCiAgICAtLS0gSW1wbGVtZW50YXRpb24gb2YgOm1vZDpgb3MucGF0aGAgb24gUE9TSVguCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91bml0dGVzdC5tb2NrLnJzdCBiL0RvYy9saWJyYXJ5L3VuaXR0ZXN0Lm1vY2sucnN0CmluZGV4IGMxM2YwOTUuLjFiYzFlZGIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VuaXR0ZXN0Lm1vY2sucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VuaXR0ZXN0Lm1vY2sucnN0CkBAIC0yNjIsNiArMjYyLDM0IEBACiAgICAgdXNlZCB0byBzZXQgYXR0cmlidXRlcyBvbiB0aGUgbW9jayBhZnRlciBpdCBpcyBjcmVhdGVkLiBTZWUgdGhlCiAgICAgOm1ldGg6YGNvbmZpZ3VyZV9tb2NrYCBtZXRob2QgZm9yIGRldGFpbHMuCiAKKyAgICAuLiBtZXRob2Q6OiBhc3NlcnRfY2FsbGVkKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICBBc3NlcnQgdGhhdCB0aGUgbW9jayB3YXMgY2FsbGVkIGF0IGxlYXN0IG9uY2UuCisKKyAgICAgICAgICAgID4+PiBtb2NrID0gTW9jaygpCisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QoKQorICAgICAgICAgICAgPE1vY2sgbmFtZT0nbW9jay5tZXRob2QoKScgaWQ9Jy4uLic+CisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QuYXNzZXJ0X2NhbGxlZCgpCisKKyAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKyAgICAuLiBtZXRob2Q6OiBhc3NlcnRfY2FsbGVkX29uY2UoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIEFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgZXhhY3RseSBvbmNlLgorCisgICAgICAgICAgICA+Pj4gbW9jayA9IE1vY2soKQorICAgICAgICAgICAgPj4+IG1vY2subWV0aG9kKCkKKyAgICAgICAgICAgIDxNb2NrIG5hbWU9J21vY2subWV0aG9kKCknIGlkPScuLi4nPgorICAgICAgICAgICAgPj4+IG1vY2subWV0aG9kLmFzc2VydF9jYWxsZWRfb25jZSgpCisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QoKQorICAgICAgICAgICAgPE1vY2sgbmFtZT0nbW9jay5tZXRob2QoKScgaWQ9Jy4uLic+CisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKyAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgQXNzZXJ0aW9uRXJyb3I6IEV4cGVjdGVkICdtZXRob2QnIHRvIGhhdmUgYmVlbiBjYWxsZWQgb25jZS4gQ2FsbGVkIDIgdGltZXMuCisKKyAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIAogICAgIC4uIG1ldGhvZDo6IGFzc2VydF9jYWxsZWRfd2l0aCgqYXJncywgKiprd2FyZ3MpCiAKQEAgLTMzOSw3ICszNjcsNyBAQAogICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKIAogCi0gICAgLi4gbWV0aG9kOjogcmVzZXRfbW9jaygpCisgICAgLi4gbWV0aG9kOjogcmVzZXRfbW9jaygqLCByZXR1cm5fdmFsdWU9RmFsc2UsIHNpZGVfZWZmZWN0PUZhbHNlKQogCiAgICAgICAgIFRoZSByZXNldF9tb2NrIG1ldGhvZCByZXNldHMgYWxsIHRoZSBjYWxsIGF0dHJpYnV0ZXMgb24gYSBtb2NrIG9iamVjdDoKIApAQCAtMzUxLDEyICszNzksMjAgQEAKICAgICAgICAgICAgID4+PiBtb2NrLmNhbGxlZAogICAgICAgICAgICAgRmFsc2UKIAorICAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgICBBZGRlZCB0d28ga2V5d29yZCBvbmx5IGFyZ3VtZW50IHRvIHRoZSByZXNldF9tb2NrIGZ1bmN0aW9uLgorCiAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVyZSB5b3Ugd2FudCB0byBtYWtlIGEgc2VyaWVzIG9mIGFzc2VydGlvbnMgdGhhdAogICAgICAgICByZXVzZSB0aGUgc2FtZSBvYmplY3QuIE5vdGUgdGhhdCA6bWV0aDpgcmVzZXRfbW9ja2AgKmRvZXNuJ3QqIGNsZWFyIHRoZQogICAgICAgICByZXR1cm4gdmFsdWUsIDphdHRyOmBzaWRlX2VmZmVjdGAgb3IgYW55IGNoaWxkIGF0dHJpYnV0ZXMgeW91IGhhdmUKLSAgICAgICAgc2V0IHVzaW5nIG5vcm1hbCBhc3NpZ25tZW50LiBDaGlsZCBtb2NrcyBhbmQgdGhlIHJldHVybiB2YWx1ZSBtb2NrCisgICAgICAgIHNldCB1c2luZyBub3JtYWwgYXNzaWdubWVudCBieSBkZWZhdWx0LiBJbiBjYXNlIHlvdSB3YW50IHRvIHJlc2V0CisgICAgICAgICpyZXR1cm5fdmFsdWUqIG9yIDphdHRyOmBzaWRlX2VmZmVjdGAsIHRoZW4gcGFzcyB0aGUgY29ycmVzcG9uZGluZworICAgICAgICBwYXJhbWV0ZXIgYXMgYGBUcnVlYGAuIENoaWxkIG1vY2tzIGFuZCB0aGUgcmV0dXJuIHZhbHVlIG1vY2sKICAgICAgICAgKGlmIGFueSkgYXJlIHJlc2V0IGFzIHdlbGwuCiAKKyAgICAgICAgLi4gbm90ZTo6ICpyZXR1cm5fdmFsdWUqLCBhbmQgOmF0dHI6YHNpZGVfZWZmZWN0YCBhcmUga2V5d29yZCBvbmx5CisgICAgICAgICAgICAgICAgICBhcmd1bWVudC4KKwogCiAgICAgLi4gbWV0aG9kOjogbW9ja19hZGRfc3BlYyhzcGVjLCBzcGVjX3NldD1GYWxzZSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdW5pdHRlc3QucnN0IGIvRG9jL2xpYnJhcnkvdW5pdHRlc3QucnN0CmluZGV4IDljY2E4ODEuLmRkMTg4YjAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VuaXR0ZXN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS91bml0dGVzdC5yc3QKQEAgLTEzOTMsOSArMTM5Myw5IEBACiAKICAgICAgIEFkZCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciA6bWV0aDpgdGVhckRvd25gIHRvIGNsZWFudXAgcmVzb3VyY2VzCiAgICAgICB1c2VkIGR1cmluZyB0aGUgdGVzdC4gRnVuY3Rpb25zIHdpbGwgYmUgY2FsbGVkIGluIHJldmVyc2Ugb3JkZXIgdG8gdGhlCi0gICAgICBvcmRlciB0aGV5IGFyZSBhZGRlZCAoTElGTykuIFRoZXkgYXJlIGNhbGxlZCB3aXRoIGFueSBhcmd1bWVudHMgYW5kCi0gICAgICBrZXl3b3JkIGFyZ3VtZW50cyBwYXNzZWQgaW50byA6bWV0aDpgYWRkQ2xlYW51cGAgd2hlbiB0aGV5IGFyZQotICAgICAgYWRkZWQuCisgICAgICBvcmRlciB0aGV5IGFyZSBhZGRlZCAoOmFiYnI6YExJRk8gKGxhc3QtaW4sIGZpcnN0LW91dClgKS4gIFRoZXkKKyAgICAgIGFyZSBjYWxsZWQgd2l0aCBhbnkgYXJndW1lbnRzIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyBwYXNzZWQgaW50bworICAgICAgOm1ldGg6YGFkZENsZWFudXBgIHdoZW4gdGhleSBhcmUgYWRkZWQuCiAKICAgICAgIElmIDptZXRoOmBzZXRVcGAgZmFpbHMsIG1lYW5pbmcgdGhhdCA6bWV0aDpgdGVhckRvd25gIGlzIG5vdCBjYWxsZWQsCiAgICAgICB0aGVuIGFueSBjbGVhbnVwIGZ1bmN0aW9ucyBhZGRlZCB3aWxsIHN0aWxsIGJlIGNhbGxlZC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3VybGxpYi5wYXJzZS5yc3QgYi9Eb2MvbGlicmFyeS91cmxsaWIucGFyc2UucnN0CmluZGV4IGM2ZGUyMzAuLmQ3OWQ4ZjAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VybGxpYi5wYXJzZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdXJsbGliLnBhcnNlLnJzdApAQCAtMTE0LDggKzExNCw5IEBACiAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICB8IGlmIHByZXNlbnQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHwKICAgICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCi0gICBTZWUgc2VjdGlvbiA6cmVmOmB1cmxwYXJzZS1yZXN1bHQtb2JqZWN0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0Ci0gICBvYmplY3QuCisgICBSZWFkaW5nIHRoZSA6YXR0cjpgcG9ydGAgYXR0cmlidXRlIHdpbGwgcmFpc2UgYSA6ZXhjOmBWYWx1ZUVycm9yYCBpZgorICAgYW4gaW52YWxpZCBwb3J0IGlzIHNwZWNpZmllZCBpbiB0aGUgVVJMLiAgU2VlIHNlY3Rpb24KKyAgIDpyZWY6YHVybHBhcnNlLXJlc3VsdC1vYmplY3RgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXN1bHQgb2JqZWN0LgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMgogICAgICAgQWRkZWQgSVB2NiBVUkwgcGFyc2luZyBjYXBhYmlsaXRpZXMuCkBAIC0xMjUsNiArMTI2LDEwIEBACiAgICAgICBmYWxzZSksIGluIGFjY29yZGFuY2Ugd2l0aCA6cmZjOmAzOTg2YC4gIFByZXZpb3VzbHksIGEgd2hpdGVsaXN0IG9mCiAgICAgICBzY2hlbWVzIHRoYXQgc3VwcG9ydCBmcmFnbWVudHMgZXhpc3RlZC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIE91dC1vZi1yYW5nZSBwb3J0IG51bWJlcnMgbm93IHJhaXNlIDpleGM6YFZhbHVlRXJyb3JgLCBpbnN0ZWFkIG9mCisgICAgICByZXR1cm5pbmcgOmNvbnN0OmBOb25lYC4KKwogCiAuLiBmdW5jdGlvbjo6IHBhcnNlX3FzKHFzLCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSwgc3RyaWN0X3BhcnNpbmc9RmFsc2UsIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0ncmVwbGFjZScpCiAKQEAgLTIyNyw4ICsyMzIsMTMgQEAKICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgIHwgaWYgcHJlc2VudCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCi0gICBTZWUgc2VjdGlvbiA6cmVmOmB1cmxwYXJzZS1yZXN1bHQtb2JqZWN0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0Ci0gICBvYmplY3QuCisgICBSZWFkaW5nIHRoZSA6YXR0cjpgcG9ydGAgYXR0cmlidXRlIHdpbGwgcmFpc2UgYSA6ZXhjOmBWYWx1ZUVycm9yYCBpZgorICAgYW4gaW52YWxpZCBwb3J0IGlzIHNwZWNpZmllZCBpbiB0aGUgVVJMLiAgU2VlIHNlY3Rpb24KKyAgIDpyZWY6YHVybHBhcnNlLXJlc3VsdC1vYmplY3RgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXN1bHQgb2JqZWN0LgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgT3V0LW9mLXJhbmdlIHBvcnQgbnVtYmVycyBub3cgcmFpc2UgOmV4YzpgVmFsdWVFcnJvcmAsIGluc3RlYWQgb2YKKyAgICAgIHJldHVybmluZyA6Y29uc3Q6YE5vbmVgLgogCiAKIC4uIGZ1bmN0aW9uOjogdXJsdW5zcGxpdChwYXJ0cykKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3VybGxpYi5yZXF1ZXN0LnJzdCBiL0RvYy9saWJyYXJ5L3VybGxpYi5yZXF1ZXN0LnJzdAppbmRleCAxMjkxYWViLi5kMjg4MTY1IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS91cmxsaWIucmVxdWVzdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdXJsbGliLnJlcXVlc3QucnN0CkBAIC0zMCwxOCArMzAsOSBAQAogICAgT3BlbiB0aGUgVVJMICp1cmwqLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEKICAgIDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogCi0gICAqZGF0YSogbXVzdCBiZSBhIGJ5dGVzIG9iamVjdCBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgZGF0YSB0byBiZSBzZW50IHRvIHRoZQotICAgc2VydmVyLCBvciBgYE5vbmVgYCBpZiBubyBzdWNoIGRhdGEgaXMgbmVlZGVkLiAqZGF0YSogbWF5IGFsc28gYmUgYW4KLSAgIGl0ZXJhYmxlIG9iamVjdCBhbmQgaW4gdGhhdCBjYXNlIENvbnRlbnQtTGVuZ3RoIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkIGluCi0gICB0aGUgaGVhZGVycy4gQ3VycmVudGx5IEhUVFAgcmVxdWVzdHMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCB1c2UgKmRhdGEqOyB0aGUKLSAgIEhUVFAgcmVxdWVzdCB3aWxsIGJlIGEgUE9TVCBpbnN0ZWFkIG9mIGEgR0VUIHdoZW4gdGhlICpkYXRhKiBwYXJhbWV0ZXIgaXMKLSAgIHByb3ZpZGVkLgotCi0gICAqZGF0YSogc2hvdWxkIGJlIGEgYnVmZmVyIGluIHRoZSBzdGFuZGFyZAotICAgOm1pbWV0eXBlOmBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgIGZvcm1hdC4gIFRoZQotICAgOmZ1bmM6YHVybGxpYi5wYXJzZS51cmxlbmNvZGVgIGZ1bmN0aW9uIHRha2VzIGEgbWFwcGluZyBvciBzZXF1ZW5jZSBvZgotICAgMi10dXBsZXMgYW5kIHJldHVybnMgYW4gQVNDSUkgdGV4dCBzdHJpbmcgaW4gdGhpcyBmb3JtYXQuIEl0IHNob3VsZAotICAgYmUgZW5jb2RlZCB0byBieXRlcyBiZWZvcmUgYmVpbmcgdXNlZCBhcyB0aGUgKmRhdGEqIHBhcmFtZXRlci4KKyAgICpkYXRhKiBtdXN0IGJlIGFuIG9iamVjdCBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgZGF0YSB0byBiZSBzZW50IHRvIHRoZQorICAgc2VydmVyLCBvciBgYE5vbmVgYCBpZiBubyBzdWNoIGRhdGEgaXMgbmVlZGVkLiAgU2VlIDpjbGFzczpgUmVxdWVzdGAKKyAgIGZvciBkZXRhaWxzLgogCiAgICB1cmxsaWIucmVxdWVzdCBtb2R1bGUgdXNlcyBIVFRQLzEuMSBhbmQgaW5jbHVkZXMgYGBDb25uZWN0aW9uOmNsb3NlYGAgaGVhZGVyCiAgICBpbiBpdHMgSFRUUCByZXF1ZXN0cy4KQEAgLTE5MiwxNCArMTgzLDIxIEBACiAKICAgICp1cmwqIHNob3VsZCBiZSBhIHN0cmluZyBjb250YWluaW5nIGEgdmFsaWQgVVJMLgogCi0gICAqZGF0YSogbXVzdCBiZSBhIGJ5dGVzIG9iamVjdCBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgZGF0YSB0byBzZW5kIHRvIHRoZQotICAgc2VydmVyLCBvciBgYE5vbmVgYCBpZiBubyBzdWNoIGRhdGEgaXMgbmVlZGVkLiAgQ3VycmVudGx5IEhUVFAgcmVxdWVzdHMgYXJlCi0gICB0aGUgb25seSBvbmVzIHRoYXQgdXNlICpkYXRhKjsgdGhlIEhUVFAgcmVxdWVzdCB3aWxsIGJlIGEgUE9TVCBpbnN0ZWFkIG9mIGEKLSAgIEdFVCB3aGVuIHRoZSAqZGF0YSogcGFyYW1ldGVyIGlzIHByb3ZpZGVkLiAgKmRhdGEqIHNob3VsZCBiZSBhIGJ1ZmZlciBpbiB0aGUKLSAgIHN0YW5kYXJkIDptaW1ldHlwZTpgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCBmb3JtYXQuCi0gICBUaGUgOmZ1bmM6YHVybGxpYi5wYXJzZS51cmxlbmNvZGVgIGZ1bmN0aW9uIHRha2VzIGEgbWFwcGluZyBvciBzZXF1ZW5jZSBvZgotICAgMi10dXBsZXMgYW5kIHJldHVybnMgYW4gQVNDSUkgc3RyaW5nIGluIHRoaXMgZm9ybWF0LiBJdCBzaG91bGQgYmUKLSAgIGVuY29kZWQgdG8gYnl0ZXMgYmVmb3JlIGJlaW5nIHVzZWQgYXMgdGhlICpkYXRhKiBwYXJhbWV0ZXIuCisgICAqZGF0YSogbXVzdCBiZSBhbiBvYmplY3Qgc3BlY2lmeWluZyBhZGRpdGlvbmFsIGRhdGEgdG8gc2VuZCB0byB0aGUKKyAgIHNlcnZlciwgb3IgYGBOb25lYGAgaWYgbm8gc3VjaCBkYXRhIGlzIG5lZWRlZC4gIEN1cnJlbnRseSBIVFRQCisgICByZXF1ZXN0cyBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IHVzZSAqZGF0YSouICBUaGUgc3VwcG9ydGVkIG9iamVjdAorICAgdHlwZXMgaW5jbHVkZSBieXRlcywgZmlsZS1saWtlIG9iamVjdHMsIGFuZCBpdGVyYWJsZXMuICBJZiBubworICAgYGBDb250ZW50LUxlbmd0aGBgIG5vciBgYFRyYW5zZmVyLUVuY29kaW5nYGAgaGVhZGVyIGZpZWxkCisgICBoYXMgYmVlbiBwcm92aWRlZCwgOmNsYXNzOmBIVFRQSGFuZGxlcmAgd2lsbCBzZXQgdGhlc2UgaGVhZGVycyBhY2NvcmRpbmcKKyAgIHRvIHRoZSB0eXBlIG9mICpkYXRhKi4gIGBgQ29udGVudC1MZW5ndGhgYCB3aWxsIGJlIHVzZWQgdG8gc2VuZAorICAgYnl0ZXMgb2JqZWN0cywgd2hpbGUgYGBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZGBgIGFzIHNwZWNpZmllZCBpbgorICAgOnJmYzpgNzIzMGAsIFNlY3Rpb24gMy4zLjEgd2lsbCBiZSB1c2VkIHRvIHNlbmQgZmlsZXMgYW5kIG90aGVyIGl0ZXJhYmxlcy4KKworICAgRm9yIGFuIEhUVFAgUE9TVCByZXF1ZXN0IG1ldGhvZCwgKmRhdGEqIHNob3VsZCBiZSBhIGJ1ZmZlciBpbiB0aGUKKyAgIHN0YW5kYXJkIDptaW1ldHlwZTpgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCBmb3JtYXQuICBUaGUKKyAgIDpmdW5jOmB1cmxsaWIucGFyc2UudXJsZW5jb2RlYCBmdW5jdGlvbiB0YWtlcyBhIG1hcHBpbmcgb3Igc2VxdWVuY2UKKyAgIG9mIDItdHVwbGVzIGFuZCByZXR1cm5zIGFuIEFTQ0lJIHN0cmluZyBpbiB0aGlzIGZvcm1hdC4gSXQgc2hvdWxkCisgICBiZSBlbmNvZGVkIHRvIGJ5dGVzIGJlZm9yZSBiZWluZyB1c2VkIGFzIHRoZSAqZGF0YSogcGFyYW1ldGVyLgogCiAgICAqaGVhZGVycyogc2hvdWxkIGJlIGEgZGljdGlvbmFyeSwgYW5kIHdpbGwgYmUgdHJlYXRlZCBhcyBpZgogICAgOm1ldGg6YGFkZF9oZWFkZXJgIHdhcyBjYWxsZWQgd2l0aCBlYWNoIGtleSBhbmQgdmFsdWUgYXMgYXJndW1lbnRzLgpAQCAtMjExLDggKzIwOSwxMCBAQAogICAgOm1vZDpgdXJsbGliYCdzIGRlZmF1bHQgdXNlciBhZ2VudCBzdHJpbmcgaXMKICAgIGBgIlB5dGhvbi11cmxsaWIvMi42ImBgIChvbiBQeXRob24gMi42KS4KIAotICAgQW4gZXhhbXBsZSBvZiB1c2luZyBgYENvbnRlbnQtVHlwZWBgIGhlYWRlciB3aXRoICpkYXRhKiBhcmd1bWVudCB3b3VsZCBiZQotICAgc2VuZGluZyBhIGRpY3Rpb25hcnkgbGlrZSBgYHsiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9YGAuCisgICBBbiBhcHByb3ByaWF0ZSBgYENvbnRlbnQtVHlwZWBgIGhlYWRlciBzaG91bGQgYmUgaW5jbHVkZWQgaWYgdGhlICpkYXRhKgorICAgYXJndW1lbnQgaXMgcHJlc2VudC4gIElmIHRoaXMgaGVhZGVyIGhhcyBub3QgYmVlbiBwcm92aWRlZCBhbmQgKmRhdGEqCisgICBpcyBub3QgTm9uZSwgYGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGBgIHdpbGwKKyAgIGJlIGFkZGVkIGFzIGEgZGVmYXVsdC4KIAogICAgVGhlIGZpbmFsIHR3byBhcmd1bWVudHMgYXJlIG9ubHkgb2YgaW50ZXJlc3QgZm9yIGNvcnJlY3QgaGFuZGxpbmcKICAgIG9mIHRoaXJkLXBhcnR5IEhUVFAgY29va2llczoKQEAgLTIzNSwxNSArMjM1LDI4IEBACiAgICAqbWV0aG9kKiBzaG91bGQgYmUgYSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMgdGhlIEhUVFAgcmVxdWVzdCBtZXRob2QgdGhhdAogICAgd2lsbCBiZSB1c2VkIChlLmcuIGBgJ0hFQUQnYGApLiAgSWYgcHJvdmlkZWQsIGl0cyB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlCiAgICA6YXR0cjpgflJlcXVlc3QubWV0aG9kYCBhdHRyaWJ1dGUgYW5kIGlzIHVzZWQgYnkgOm1ldGg6YGdldF9tZXRob2QoKWAuCi0gICBTdWJjbGFzc2VzIG1heSBpbmRpY2F0ZSBhIGRlZmF1bHQgbWV0aG9kIGJ5IHNldHRpbmcgdGhlCisgICBUaGUgZGVmYXVsdCBpcyBgYCdHRVQnYGAgaWYgKmRhdGEqIGlzIGBgTm9uZWBgIG9yIGBgJ1BPU1QnYGAgb3RoZXJ3aXNlLgorICAgU3ViY2xhc3NlcyBtYXkgaW5kaWNhdGUgYSBkaWZmZXJlbnQgZGVmYXVsdCBtZXRob2QgYnkgc2V0dGluZyB0aGUKICAgIDphdHRyOmB+UmVxdWVzdC5tZXRob2RgIGF0dHJpYnV0ZSBpbiB0aGUgY2xhc3MgaXRzZWxmLgogCisgICAuLiBub3RlOjoKKyAgICAgIFRoZSByZXF1ZXN0IHdpbGwgbm90IHdvcmsgYXMgZXhwZWN0ZWQgaWYgdGhlIGRhdGEgb2JqZWN0IGlzIHVuYWJsZQorICAgICAgdG8gZGVsaXZlciBpdHMgY29udGVudCBtb3JlIHRoYW4gb25jZSAoZS5nLiBhIGZpbGUgb3IgYW4gaXRlcmFibGUKKyAgICAgIHRoYXQgY2FuIHByb2R1Y2UgdGhlIGNvbnRlbnQgb25seSBvbmNlKSBhbmQgdGhlIHJlcXVlc3QgaXMgcmV0cmllZAorICAgICAgZm9yIEhUVFAgcmVkaXJlY3RzIG9yIGF1dGhlbnRpY2F0aW9uLiAgVGhlICpkYXRhKiBpcyBzZW50IHRvIHRoZQorICAgICAgSFRUUCBzZXJ2ZXIgcmlnaHQgYXdheSBhZnRlciB0aGUgaGVhZGVycy4gIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yCisgICAgICBhIDEwMC1jb250aW51ZSBleHBlY3RhdGlvbiBpbiB0aGUgbGlicmFyeS4KKwogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMKICAgICAgIDphdHRyOmBSZXF1ZXN0Lm1ldGhvZGAgYXJndW1lbnQgaXMgYWRkZWQgdG8gdGhlIFJlcXVlc3QgY2xhc3MuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy40CiAgICAgICBEZWZhdWx0IDphdHRyOmBSZXF1ZXN0Lm1ldGhvZGAgbWF5IGJlIGluZGljYXRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBEbyBub3QgcmFpc2UgYW4gZXJyb3IgaWYgdGhlIGBgQ29udGVudC1MZW5ndGhgYCBoYXMgbm90IGJlZW4KKyAgICAgIHByb3ZpZGVkIGFuZCAqZGF0YSogaXMgbmVpdGhlciBgYE5vbmVgYCBub3IgYSBieXRlcyBvYmplY3QuCisgICAgICBGYWxsIGJhY2sgdG8gdXNlIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcgaW5zdGVhZC4KIAogLi4gY2xhc3M6OiBPcGVuZXJEaXJlY3RvcigpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3VybGxpYi5yb2JvdHBhcnNlci5yc3QgYi9Eb2MvbGlicmFyeS91cmxsaWIucm9ib3RwYXJzZXIucnN0CmluZGV4IGJhNzAxYzMuLjdkMzE5MzIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VybGxpYi5yb2JvdHBhcnNlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdXJsbGliLnJvYm90cGFyc2VyLnJzdApAQCAtNTcsMTUgKzU3LDQxIEBACiAgICAgICBTZXRzIHRoZSB0aW1lIHRoZSBgYHJvYm90cy50eHRgYCBmaWxlIHdhcyBsYXN0IGZldGNoZWQgdG8gdGhlIGN1cnJlbnQKICAgICAgIHRpbWUuCiAKKyAgIC4uIG1ldGhvZDo6IGNyYXdsX2RlbGF5KHVzZXJhZ2VudCkKIAotVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBiYXNpYyB1c2Ugb2YgdGhlIFJvYm90RmlsZVBhcnNlciBjbGFzcy4KKyAgICAgIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBgYENyYXdsLWRlbGF5YGAgcGFyYW1ldGVyIGZyb20gYGByb2JvdHMudHh0YGAKKyAgICAgIGZvciB0aGUgKnVzZXJhZ2VudCogaW4gcXVlc3Rpb24uICBJZiB0aGVyZSBpcyBubyBzdWNoIHBhcmFtZXRlciBvciBpdAorICAgICAgZG9lc24ndCBhcHBseSB0byB0aGUgKnVzZXJhZ2VudCogc3BlY2lmaWVkIG9yIHRoZSBgYHJvYm90cy50eHRgYCBlbnRyeQorICAgICAgZm9yIHRoaXMgcGFyYW1ldGVyIGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIGBgTm9uZWBgLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworICAgLi4gbWV0aG9kOjogcmVxdWVzdF9yYXRlKHVzZXJhZ2VudCkKKworICAgICAgUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIGBgUmVxdWVzdC1yYXRlYGAgcGFyYW1ldGVyIGZyb20KKyAgICAgIGBgcm9ib3RzLnR4dGBgIGluIHRoZSBmb3JtIG9mIGEgOmZ1bmM6YH5jb2xsZWN0aW9ucy5uYW1lZHR1cGxlYAorICAgICAgYGAocmVxdWVzdHMsIHNlY29uZHMpYGAuICBJZiB0aGVyZSBpcyBubyBzdWNoIHBhcmFtZXRlciBvciBpdCBkb2Vzbid0CisgICAgICBhcHBseSB0byB0aGUgKnVzZXJhZ2VudCogc3BlY2lmaWVkIG9yIHRoZSBgYHJvYm90cy50eHRgYCBlbnRyeSBmb3IgdGhpcworICAgICAgcGFyYW1ldGVyIGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIGBgTm9uZWBgLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGJhc2ljIHVzZSBvZiB0aGUgOmNsYXNzOmBSb2JvdEZpbGVQYXJzZXJgCitjbGFzczo6CiAKICAgID4+PiBpbXBvcnQgdXJsbGliLnJvYm90cGFyc2VyCiAgICA+Pj4gcnAgPSB1cmxsaWIucm9ib3RwYXJzZXIuUm9ib3RGaWxlUGFyc2VyKCkKICAgID4+PiBycC5zZXRfdXJsKCJodHRwOi8vd3d3Lm11c2ktY2FsLmNvbS9yb2JvdHMudHh0IikKICAgID4+PiBycC5yZWFkKCkKKyAgID4+PiBycmF0ZSA9IHJwLnJlcXVlc3RfcmF0ZSgiKiIpCisgICA+Pj4gcnJhdGUucmVxdWVzdHMKKyAgIDMKKyAgID4+PiBycmF0ZS5zZWNvbmRzCisgICAyMAorICAgPj4+IHJwLmNyYXdsX2RlbGF5KCIqIikKKyAgIDYKICAgID4+PiBycC5jYW5fZmV0Y2goIioiLCAiaHR0cDovL3d3dy5tdXNpLWNhbC5jb20vY2dpLWJpbi9zZWFyY2g/Y2l0eT1TYW4rRnJhbmNpc2NvIikKICAgIEZhbHNlCiAgICA+Pj4gcnAuY2FuX2ZldGNoKCIqIiwgImh0dHA6Ly93d3cubXVzaS1jYWwuY29tLyIpCiAgICBUcnVlCi0KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3ZlbnYucnN0IGIvRG9jL2xpYnJhcnkvdmVudi5yc3QKaW5kZXggYWY0YTZkMS4uNmJmMjZmZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdmVudi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdmVudi5yc3QKQEAgLTMxLDQ0ICszMSw1MCBAQAogCiAuLiBfdmVudi1kZWY6CiAKLS4uIG5vdGU6OiBBIHZpcnR1YWwgZW52aXJvbm1lbnQgKGFsc28gY2FsbGVkIGEgYGB2ZW52YGApIGlzIGEgUHl0aG9uCi0gICBlbnZpcm9ubWVudCBzdWNoIHRoYXQgdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgbGlicmFyaWVzIGFuZCBzY3JpcHRzCi0gICBpbnN0YWxsZWQgaW50byBpdCBhcmUgaXNvbGF0ZWQgZnJvbSB0aG9zZSBpbnN0YWxsZWQgaW4gb3RoZXIgdmlydHVhbAotICAgZW52aXJvbm1lbnRzLCBhbmQgKGJ5IGRlZmF1bHQpIGFueSBsaWJyYXJpZXMgaW5zdGFsbGVkIGluIGEgInN5c3RlbSIgUHl0aG9uLAotICAgaS5lLiBvbmUgd2hpY2ggaXMgaW5zdGFsbGVkIGFzIHBhcnQgb2YgeW91ciBvcGVyYXRpbmcgc3lzdGVtLgorLi4gbm90ZTo6IEEgdmlydHVhbCBlbnZpcm9ubWVudCBpcyBhIFB5dGhvbiBlbnZpcm9ubWVudCBzdWNoIHRoYXQgdGhlIFB5dGhvbgorICAgaW50ZXJwcmV0ZXIsIGxpYnJhcmllcyBhbmQgc2NyaXB0cyBpbnN0YWxsZWQgaW50byBpdCBhcmUgaXNvbGF0ZWQgZnJvbSB0aG9zZQorICAgaW5zdGFsbGVkIGluIG90aGVyIHZpcnR1YWwgZW52aXJvbm1lbnRzLCBhbmQgKGJ5IGRlZmF1bHQpIGFueSBsaWJyYXJpZXMKKyAgIGluc3RhbGxlZCBpbiBhICJzeXN0ZW0iIFB5dGhvbiwgaS5lLiwgb25lIHdoaWNoIGlzIGluc3RhbGxlZCBhcyBwYXJ0IG9mIHlvdXIKKyAgIG9wZXJhdGluZyBzeXN0ZW0uCiAKLSAgIEEgdmVudiBpcyBhIGRpcmVjdG9yeSB0cmVlIHdoaWNoIGNvbnRhaW5zIFB5dGhvbiBleGVjdXRhYmxlIGZpbGVzIGFuZAotICAgb3RoZXIgZmlsZXMgd2hpY2ggaW5kaWNhdGUgdGhhdCBpdCBpcyBhIHZlbnYuCisgICBBIHZpcnR1YWwgZW52aXJvbm1lbnQgaXMgYSBkaXJlY3RvcnkgdHJlZSB3aGljaCBjb250YWlucyBQeXRob24gZXhlY3V0YWJsZQorICAgZmlsZXMgYW5kIG90aGVyIGZpbGVzIHdoaWNoIGluZGljYXRlIHRoYXQgaXQgaXMgYSB2aXJ0dWFsIGVudmlyb25tZW50LgogCiAgICBDb21tb24gaW5zdGFsbGF0aW9uIHRvb2xzIHN1Y2ggYXMgYGBTZXR1cHRvb2xzYGAgYW5kIGBgcGlwYGAgd29yayBhcwotICAgZXhwZWN0ZWQgd2l0aCB2ZW52cyAtIGkuZS4gd2hlbiBhIHZlbnYgaXMgYWN0aXZlLCB0aGV5IGluc3RhbGwgUHl0aG9uCi0gICBwYWNrYWdlcyBpbnRvIHRoZSB2ZW52IHdpdGhvdXQgbmVlZGluZyB0byBiZSB0b2xkIHRvIGRvIHNvIGV4cGxpY2l0bHkuCisgICBleHBlY3RlZCB3aXRoIHZpcnR1YWwgZW52aXJvbm1lbnRzLiBJbiBvdGhlciB3b3Jkcywgd2hlbiBhIHZpcnR1YWwKKyAgIGVudmlyb25tZW50IGlzIGFjdGl2ZSwgdGhleSBpbnN0YWxsIFB5dGhvbiBwYWNrYWdlcyBpbnRvIHRoZSB2aXJ0dWFsCisgICBlbnZpcm9ubWVudCB3aXRob3V0IG5lZWRpbmcgdG8gYmUgdG9sZCB0byBkbyBzbyBleHBsaWNpdGx5LgogCi0gICBXaGVuIGEgdmVudiBpcyBhY3RpdmUgKGkuZS4gdGhlIHZlbnYncyBQeXRob24gaW50ZXJwcmV0ZXIgaXMgcnVubmluZyksIHRoZQotICAgYXR0cmlidXRlcyA6YXR0cjpgc3lzLnByZWZpeGAgYW5kIDphdHRyOmBzeXMuZXhlY19wcmVmaXhgIHBvaW50IHRvIHRoZSBiYXNlCi0gICBkaXJlY3Rvcnkgb2YgdGhlIHZlbnYsIHdoZXJlYXMgOmF0dHI6YHN5cy5iYXNlX3ByZWZpeGAgYW5kCi0gICA6YXR0cjpgc3lzLmJhc2VfZXhlY19wcmVmaXhgIHBvaW50IHRvIHRoZSBub24tdmVudiBQeXRob24gaW5zdGFsbGF0aW9uCi0gICB3aGljaCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHZlbnYuIElmIGEgdmVudiBpcyBub3QgYWN0aXZlLCB0aGVuCi0gICA6YXR0cjpgc3lzLnByZWZpeGAgaXMgdGhlIHNhbWUgYXMgOmF0dHI6YHN5cy5iYXNlX3ByZWZpeGAgYW5kCi0gICA6YXR0cjpgc3lzLmV4ZWNfcHJlZml4YCBpcyB0aGUgc2FtZSBhcyA6YXR0cjpgc3lzLmJhc2VfZXhlY19wcmVmaXhgICh0aGV5Ci0gICBhbGwgcG9pbnQgdG8gYSBub24tdmVudiBQeXRob24gaW5zdGFsbGF0aW9uKS4KKyAgIFdoZW4gYSB2aXJ0dWFsIGVudmlyb25tZW50IGlzIGFjdGl2ZSAoaS5lLiwgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQncyBQeXRob24KKyAgIGludGVycHJldGVyIGlzIHJ1bm5pbmcpLCB0aGUgYXR0cmlidXRlcyA6YXR0cjpgc3lzLnByZWZpeGAgYW5kCisgICA6YXR0cjpgc3lzLmV4ZWNfcHJlZml4YCBwb2ludCB0byB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIHZpcnR1YWwKKyAgIGVudmlyb25tZW50LCB3aGVyZWFzIDphdHRyOmBzeXMuYmFzZV9wcmVmaXhgIGFuZAorICAgOmF0dHI6YHN5cy5iYXNlX2V4ZWNfcHJlZml4YCBwb2ludCB0byB0aGUgbm9uLXZpcnR1YWwgZW52aXJvbm1lbnQgUHl0aG9uCisgICBpbnN0YWxsYXRpb24gd2hpY2ggd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50LiBJZiBhIHZpcnR1YWwKKyAgIGVudmlyb25tZW50IGlzIG5vdCBhY3RpdmUsIHRoZW4gOmF0dHI6YHN5cy5wcmVmaXhgIGlzIHRoZSBzYW1lIGFzCisgICA6YXR0cjpgc3lzLmJhc2VfcHJlZml4YCBhbmQgOmF0dHI6YHN5cy5leGVjX3ByZWZpeGAgaXMgdGhlIHNhbWUgYXMKKyAgIDphdHRyOmBzeXMuYmFzZV9leGVjX3ByZWZpeGAgKHRoZXkgYWxsIHBvaW50IHRvIGEgbm9uLXZpcnR1YWwgZW52aXJvbm1lbnQKKyAgIFB5dGhvbiBpbnN0YWxsYXRpb24pLgogCi0gICBXaGVuIGEgdmVudiBpcyBhY3RpdmUsIGFueSBvcHRpb25zIHRoYXQgY2hhbmdlIHRoZSBpbnN0YWxsYXRpb24gcGF0aCB3aWxsIGJlCi0gICBpZ25vcmVkIGZyb20gYWxsIGRpc3R1dGlscyBjb25maWd1cmF0aW9uIGZpbGVzIHRvIHByZXZlbnQgcHJvamVjdHMgYmVpbmcKLSAgIGluYWR2ZXJ0ZW50bHkgaW5zdGFsbGVkIG91dHNpZGUgb2YgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQuCisgICBXaGVuIGEgdmlydHVhbCBlbnZpcm9ubWVudCBpcyBhY3RpdmUsIGFueSBvcHRpb25zIHRoYXQgY2hhbmdlIHRoZQorICAgaW5zdGFsbGF0aW9uIHBhdGggd2lsbCBiZSBpZ25vcmVkIGZyb20gYWxsIGRpc3R1dGlscyBjb25maWd1cmF0aW9uIGZpbGVzIHRvCisgICBwcmV2ZW50IHByb2plY3RzIGJlaW5nIGluYWR2ZXJ0ZW50bHkgaW5zdGFsbGVkIG91dHNpZGUgb2YgdGhlIHZpcnR1YWwKKyAgIGVudmlyb25tZW50LgogCi0gICBXaGVuIHdvcmtpbmcgaW4gYSBjb21tYW5kIHNoZWxsLCB1c2VycyBjYW4gbWFrZSBhIHZlbnYgYWN0aXZlIGJ5IHJ1bm5pbmcgYW4KLSAgIGBgYWN0aXZhdGVgYCBzY3JpcHQgaW4gdGhlIHZlbnYncyBleGVjdXRhYmxlcyBkaXJlY3RvcnkgKHRoZSBwcmVjaXNlIGZpbGVuYW1lCi0gICBpcyBzaGVsbC1kZXBlbmRlbnQpLCB3aGljaCBwcmVwZW5kcyB0aGUgdmVudidzIGRpcmVjdG9yeSBmb3IgZXhlY3V0YWJsZXMgdG8KLSAgIHRoZSBgYFBBVEhgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgdGhlIHJ1bm5pbmcgc2hlbGwuIFRoZXJlIHNob3VsZCBiZSBubwotICAgbmVlZCBpbiBvdGhlciBjaXJjdW1zdGFuY2VzIHRvIGFjdGl2YXRlIGEgdmVudiAtLSBzY3JpcHRzIGluc3RhbGxlZCBpbnRvCi0gICB2ZW52cyBoYXZlIGEgc2hlYmFuZyBsaW5lIHdoaWNoIHBvaW50cyB0byB0aGUgdmVudidzIFB5dGhvbiBpbnRlcnByZXRlci4gVGhpcwotICAgbWVhbnMgdGhhdCB0aGUgc2NyaXB0IHdpbGwgcnVuIHdpdGggdGhhdCBpbnRlcnByZXRlciByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZQotICAgb2YgYGBQQVRIYGAuIE9uIFdpbmRvd3MsIHNoZWJhbmcgbGluZSBwcm9jZXNzaW5nIGlzIHN1cHBvcnRlZCBpZiB5b3UgaGF2ZSB0aGUKLSAgIFB5dGhvbiBMYXVuY2hlciBmb3IgV2luZG93cyBpbnN0YWxsZWQgKHRoaXMgd2FzIGFkZGVkIHRvIFB5dGhvbiBpbiAzLjMgLSBzZWUKLSAgIDpwZXA6YDM5N2AgZm9yIG1vcmUgZGV0YWlscykuIFRodXMsIGRvdWJsZS1jbGlja2luZyBhbiBpbnN0YWxsZWQgc2NyaXB0IGluCi0gICBhIFdpbmRvd3MgRXhwbG9yZXIgd2luZG93IHNob3VsZCBydW4gdGhlIHNjcmlwdCB3aXRoIHRoZSBjb3JyZWN0IGludGVycHJldGVyCi0gICB3aXRob3V0IHRoZXJlIG5lZWRpbmcgdG8gYmUgYW55IHJlZmVyZW5jZSB0byBpdHMgdmVudiBpbiBgYFBBVEhgYC4KKyAgIFdoZW4gd29ya2luZyBpbiBhIGNvbW1hbmQgc2hlbGwsIHVzZXJzIGNhbiBtYWtlIGEgdmlydHVhbCBlbnZpcm9ubWVudCBhY3RpdmUKKyAgIGJ5IHJ1bm5pbmcgYW4gYGBhY3RpdmF0ZWBgIHNjcmlwdCBpbiB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCdzIGV4ZWN1dGFibGVzCisgICBkaXJlY3RvcnkgKHRoZSBwcmVjaXNlIGZpbGVuYW1lIGlzIHNoZWxsLWRlcGVuZGVudCksIHdoaWNoIHByZXBlbmRzIHRoZQorICAgdmlydHVhbCBlbnZpcm9ubWVudCdzIGRpcmVjdG9yeSBmb3IgZXhlY3V0YWJsZXMgdG8gdGhlIGBgUEFUSGBgIGVudmlyb25tZW50CisgICB2YXJpYWJsZSBmb3IgdGhlIHJ1bm5pbmcgc2hlbGwuIFRoZXJlIHNob3VsZCBiZSBubyBuZWVkIGluIG90aGVyCisgICBjaXJjdW1zdGFuY2VzIHRvIGFjdGl2YXRlIGEgdmlydHVhbCBlbnZpcm9ubWVudOKAlHNjcmlwdHMgaW5zdGFsbGVkIGludG8KKyAgIHZpcnR1YWwgZW52aXJvbm1lbnRzIGhhdmUgYSAic2hlYmFuZyIgbGluZSB3aGljaCBwb2ludHMgdG8gdGhlIHZpcnR1YWwKKyAgIGVudmlyb25tZW50J3MgUHl0aG9uIGludGVycHJldGVyLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHNjcmlwdCB3aWxsIHJ1biB3aXRoCisgICB0aGF0IGludGVycHJldGVyIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIGBgUEFUSGBgLiBPbiBXaW5kb3dzLCAic2hlYmFuZyIKKyAgIGxpbmUgcHJvY2Vzc2luZyBpcyBzdXBwb3J0ZWQgaWYgeW91IGhhdmUgdGhlIFB5dGhvbiBMYXVuY2hlciBmb3IgV2luZG93cworICAgaW5zdGFsbGVkICh0aGlzIHdhcyBhZGRlZCB0byBQeXRob24gaW4gMy4zIC0gc2VlIDpwZXA6YDM5N2AgZm9yIG1vcmUKKyAgIGRldGFpbHMpLiBUaHVzLCBkb3VibGUtY2xpY2tpbmcgYW4gaW5zdGFsbGVkIHNjcmlwdCBpbiBhIFdpbmRvd3MgRXhwbG9yZXIKKyAgIHdpbmRvdyBzaG91bGQgcnVuIHRoZSBzY3JpcHQgd2l0aCB0aGUgY29ycmVjdCBpbnRlcnByZXRlciB3aXRob3V0IHRoZXJlCisgICBuZWVkaW5nIHRvIGJlIGFueSByZWZlcmVuY2UgdG8gaXRzIHZpcnR1YWwgZW52aXJvbm1lbnQgaW4gYGBQQVRIYGAuCiAKIAogLi4gX3ZlbnYtYXBpOgpAQCAtODMsNyArODksOCBAQAogY3JlYXRpb24gYWNjb3JkaW5nIHRvIHRoZWlyIG5lZWRzLCB0aGUgOmNsYXNzOmBFbnZCdWlsZGVyYCBjbGFzcy4KIAogLi4gY2xhc3M6OiBFbnZCdWlsZGVyKHN5c3RlbV9zaXRlX3BhY2thZ2VzPUZhbHNlLCBjbGVhcj1GYWxzZSwgXAotICAgICAgICAgICAgICAgICAgICAgIHN5bWxpbmtzPUZhbHNlLCB1cGdyYWRlPUZhbHNlLCB3aXRoX3BpcD1GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICBzeW1saW5rcz1GYWxzZSwgdXBncmFkZT1GYWxzZSwgd2l0aF9waXA9RmFsc2UsIFwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQ9Tm9uZSkKIAogICAgIFRoZSA6Y2xhc3M6YEVudkJ1aWxkZXJgIGNsYXNzIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBrZXl3b3JkIGFyZ3VtZW50cyBvbgogICAgIGluc3RhbnRpYXRpb246CkBAIC0xMDcsOSArMTE0LDE2IEBACiAgICAgICBpbnN0YWxsZWQgaW4gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQuIFRoaXMgdXNlcyA6bW9kOmBlbnN1cmVwaXBgIHdpdGgKICAgICAgIHRoZSBgYC0tZGVmYXVsdC1waXBgYCBvcHRpb24uCiAKKyAgICAqIGBgcHJvbXB0YGAgLS0gYSBTdHJpbmcgdG8gYmUgdXNlZCBhZnRlciB2aXJ0dWFsIGVudmlyb25tZW50IGlzIGFjdGl2YXRlZAorICAgICAgKGRlZmF1bHRzIHRvIGBgTm9uZWBgIHdoaWNoIG1lYW5zIGRpcmVjdG9yeSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB3b3VsZAorICAgICAgYmUgdXNlZCkuCisKICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNAogICAgICAgIEFkZGVkIHRoZSBgYHdpdGhfcGlwYGAgcGFyYW1ldGVyCiAKKyAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgICBBZGRlZCB0aGUgYGBwcm9tcHRgYCBwYXJhbWV0ZXIKKwogCiAgICAgQ3JlYXRvcnMgb2YgdGhpcmQtcGFydHkgdmlydHVhbCBlbnZpcm9ubWVudCB0b29scyB3aWxsIGJlIGZyZWUgdG8gdXNlIHRoZQogICAgIHByb3ZpZGVkIGBgRW52QnVpbGRlcmBgIGNsYXNzIGFzIGEgYmFzZSBjbGFzcy4KQEAgLTIxOSw3ICsyMzMsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIGZvbGxvd2luZyBzY3JpcHQgc2hvd3MgaG93IHRvIGV4dGVuZCA6Y2xhc3M6YEVudkJ1aWxkZXJgIGJ5IGltcGxlbWVudGluZyBhCi1zdWJjbGFzcyB3aGljaCBpbnN0YWxscyBzZXR1cHRvb2xzIGFuZCBwaXAgaW50byBhIGNyZWF0ZWQgdmVudjo6CitzdWJjbGFzcyB3aGljaCBpbnN0YWxscyBzZXR1cHRvb2xzIGFuZCBwaXAgaW50byBhIGNyZWF0ZWQgdmlydHVhbCBlbnZpcm9ubWVudDo6CiAKICAgICBpbXBvcnQgb3MKICAgICBpbXBvcnQgb3MucGF0aApAQCAtMjMzLDEyICsyNDcsMTIgQEAKICAgICBjbGFzcyBFeHRlbmRlZEVudkJ1aWxkZXIodmVudi5FbnZCdWlsZGVyKToKICAgICAgICAgIiIiCiAgICAgICAgIFRoaXMgYnVpbGRlciBpbnN0YWxscyBzZXR1cHRvb2xzIGFuZCBwaXAgc28gdGhhdCB5b3UgY2FuIHBpcCBvcgotICAgICAgICBlYXN5X2luc3RhbGwgb3RoZXIgcGFja2FnZXMgaW50byB0aGUgY3JlYXRlZCBlbnZpcm9ubWVudC4KKyAgICAgICAgZWFzeV9pbnN0YWxsIG90aGVyIHBhY2thZ2VzIGludG8gdGhlIGNyZWF0ZWQgdmlydHVhbCBlbnZpcm9ubWVudC4KIAogICAgICAgICA6cGFyYW0gbm9kaXN0OiBJZiBUcnVlLCBzZXR1cHRvb2xzIGFuZCBwaXAgYXJlIG5vdCBpbnN0YWxsZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCB2aXJ0dWFsIGVudmlyb25tZW50LgogICAgICAgICA6cGFyYW0gbm9waXA6IElmIFRydWUsIHBpcCBpcyBub3QgaW5zdGFsbGVkIGludG8gdGhlIGNyZWF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGVudmlyb25tZW50LgogICAgICAgICA6cGFyYW0gcHJvZ3Jlc3M6IElmIHNldHVwdG9vbHMgb3IgcGlwIGFyZSBpbnN0YWxsZWQsIHRoZSBwcm9ncmVzcyBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb24gY2FuIGJlIG1vbml0b3JlZCBieSBwYXNzaW5nIGEgcHJvZ3Jlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZS4gSWYgc3BlY2lmaWVkLCBpdCBpcyBjYWxsZWQgd2l0aCB0d28KQEAgLTI2NCwxMCArMjc4LDEwIEBACiAgICAgICAgIGRlZiBwb3N0X3NldHVwKHNlbGYsIGNvbnRleHQpOgogICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICBTZXQgdXAgYW55IHBhY2thZ2VzIHdoaWNoIG5lZWQgdG8gYmUgcHJlLWluc3RhbGxlZCBpbnRvIHRoZQotICAgICAgICAgICAgZW52aXJvbm1lbnQgYmVpbmcgY3JlYXRlZC4KKyAgICAgICAgICAgIHZpcnR1YWwgZW52aXJvbm1lbnQgYmVpbmcgY3JlYXRlZC4KIAotICAgICAgICAgICAgOnBhcmFtIGNvbnRleHQ6IFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGVudmlyb25tZW50IGNyZWF0aW9uIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWluZyBwcm9jZXNzZWQuCisgICAgICAgICAgICA6cGFyYW0gY29udGV4dDogVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgdmlydHVhbCBlbnZpcm9ubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkLgogICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICBvcy5lbnZpcm9uWydWSVJUVUFMX0VOViddID0gY29udGV4dC5lbnZfZGlyCiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5ub2Rpc3Q6CkBAIC0zMDEsNyArMzE1LDcgQEAKICAgICAgICAgICAgIGZuID0gb3MucGF0aC5zcGxpdChwYXRoKVstMV0KICAgICAgICAgICAgIGJpbnBhdGggPSBjb250ZXh0LmJpbl9wYXRoCiAgICAgICAgICAgICBkaXN0cGF0aCA9IG9zLnBhdGguam9pbihiaW5wYXRoLCBmbikKLSAgICAgICAgICAgICMgRG93bmxvYWQgc2NyaXB0IGludG8gdGhlIGVudidzIGJpbmFyaWVzIGZvbGRlcgorICAgICAgICAgICAgIyBEb3dubG9hZCBzY3JpcHQgaW50byB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCdzIGJpbmFyaWVzIGZvbGRlcgogICAgICAgICAgICAgdXJscmV0cmlldmUodXJsLCBkaXN0cGF0aCkKICAgICAgICAgICAgIHByb2dyZXNzID0gc2VsZi5wcm9ncmVzcwogICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOgpAQCAtMzEzLDcgKzMyNyw3IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ0luc3RhbGxpbmcgJXMgLi4uJXMnICUgKG5hbWUsIHRlcm0pKQogICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICAgICAgIyBJbnN0YWxsIGluIHRoZSBlbnYKKyAgICAgICAgICAgICMgSW5zdGFsbCBpbiB0aGUgdmlydHVhbCBlbnZpcm9ubWVudAogICAgICAgICAgICAgYXJncyA9IFtjb250ZXh0LmVudl9leGUsIGZuXQogICAgICAgICAgICAgcCA9IFBvcGVuKGFyZ3MsIHN0ZG91dD1QSVBFLCBzdGRlcnI9UElQRSwgY3dkPWJpbnBhdGgpCiAgICAgICAgICAgICB0MSA9IFRocmVhZCh0YXJnZXQ9c2VsZi5yZWFkZXIsIGFyZ3M9KHAuc3Rkb3V0LCAnc3Rkb3V0JykpCkBAIC0zMzIsMTAgKzM0NiwxMCBAQAogCiAgICAgICAgIGRlZiBpbnN0YWxsX3NldHVwdG9vbHMoc2VsZiwgY29udGV4dCk6CiAgICAgICAgICAgICAiIiIKLSAgICAgICAgICAgIEluc3RhbGwgc2V0dXB0b29scyBpbiB0aGUgZW52aXJvbm1lbnQuCisgICAgICAgICAgICBJbnN0YWxsIHNldHVwdG9vbHMgaW4gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQuCiAKLSAgICAgICAgICAgIDpwYXJhbSBjb250ZXh0OiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnZpcm9ubWVudCBjcmVhdGlvbiByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAgICAgICAgOnBhcmFtIGNvbnRleHQ6IFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbiByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZC4KICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgdXJsID0gJ2h0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL3NldHVwdG9vbHMvZG93bmxvYWRzL2V6X3NldHVwLnB5JwogICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdChjb250ZXh0LCAnc2V0dXB0b29scycsIHVybCkKQEAgLTM0OCwxMCArMzYyLDEwIEBACiAKICAgICAgICAgZGVmIGluc3RhbGxfcGlwKHNlbGYsIGNvbnRleHQpOgogICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICBJbnN0YWxsIHBpcCBpbiB0aGUgZW52aXJvbm1lbnQuCisgICAgICAgICAgICBJbnN0YWxsIHBpcCBpbiB0aGUgdmlydHVhbCBlbnZpcm9ubWVudC4KIAotICAgICAgICAgICAgOnBhcmFtIGNvbnRleHQ6IFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGVudmlyb25tZW50IGNyZWF0aW9uIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWluZyBwcm9jZXNzZWQuCisgICAgICAgICAgICA6cGFyYW0gY29udGV4dDogVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgdmlydHVhbCBlbnZpcm9ubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkLgogICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICB1cmwgPSAnaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9weXBhL3BpcC9tYXN0ZXIvY29udHJpYi9nZXQtcGlwLnB5JwogICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdChjb250ZXh0LCAncGlwJywgdXJsKQpAQCAtMzc0LDcgKzM4OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9yZSB0YXJnZXQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpcmVjdG9yaWVzLicpCiAgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdkaXJzJywgbWV0YXZhcj0nRU5WX0RJUicsIG5hcmdzPScrJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nQSBkaXJlY3RvcnkgdG8gY3JlYXRlIHRoZSBlbnZpcm9ubWVudCBpbi4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdBIGRpcmVjdG9yeSBpbiB3aGljaCB0byBjcmVhdGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpcnR1YWwgZW52aXJvbm1lbnQuJykKICAgICAgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tbm8tc2V0dXB0b29scycsIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J25vZGlzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRvbid0IGluc3RhbGwgc2V0dXB0b29scyBvciBwaXAgaW4gdGhlICIKQEAgLTM5OCwxNCArNDEzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoZSBwbGF0Zm9ybS4nKQogICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jbGVhcicsIGRlZmF1bHQ9RmFsc2UsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J2NsZWFyJywgaGVscD0nRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vudmlyb25tZW50IGRpcmVjdG9yeSBpZiBpdCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWxyZWFkeSBleGlzdHMsIGJlZm9yZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlydHVhbCBlbnZpcm9ubWVudCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlyZWN0b3J5IGlmIGl0IGFscmVhZHkgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4aXN0cywgYmVmb3JlIHZpcnR1YWwgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vudmlyb25tZW50IGNyZWF0aW9uLicpCiAgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXVwZ3JhZGUnLCBkZWZhdWx0PUZhbHNlLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd1cGdyYWRlJywgaGVscD0nVXBncmFkZSB0aGUgZW52aXJvbm1lbnQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpcmVjdG9yeSB0byB1c2UgdGhpcyB2ZXJzaW9uICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZiBQeXRob24sIGFzc3VtaW5nIFB5dGhvbiAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzIGJlZW4gdXBncmFkZWQgaW4tcGxhY2UuJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0ndXBncmFkZScsIGhlbHA9J1VwZ3JhZGUgdGhlIHZpcnR1YWwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW52aXJvbm1lbnQgZGlyZWN0b3J5IHRvICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSB0aGlzIHZlcnNpb24gb2YgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uLCBhc3N1bWluZyBQeXRob24gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzIGJlZW4gdXBncmFkZWQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW4tcGxhY2UuJykKICAgICAgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsIGRlZmF1bHQ9RmFsc2UsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3ZlcmJvc2UnLCBoZWxwPSdEaXNwbGF5IHRoZSBvdXRwdXQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gdGhlIHNjcmlwdHMgd2hpY2ggJwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvd2FybmluZ3MucnN0IGIvRG9jL2xpYnJhcnkvd2FybmluZ3MucnN0CmluZGV4IDM3ZjY4NzQuLjVhNDJjYzYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3dhcm5pbmdzLnJzdAorKysgYi9Eb2MvbGlicmFyeS93YXJuaW5ncy5yc3QKQEAgLTMwMSw3ICszMDEsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAKLS4uIGZ1bmN0aW9uOjogd2FybihtZXNzYWdlLCBjYXRlZ29yeT1Ob25lLCBzdGFja2xldmVsPTEpCisuLiBmdW5jdGlvbjo6IHdhcm4obWVzc2FnZSwgY2F0ZWdvcnk9Tm9uZSwgc3RhY2tsZXZlbD0xLCBzb3VyY2U9Tm9uZSkKIAogICAgSXNzdWUgYSB3YXJuaW5nLCBvciBtYXliZSBpZ25vcmUgaXQgb3IgcmFpc2UgYW4gZXhjZXB0aW9uLiAgVGhlICpjYXRlZ29yeSoKICAgIGFyZ3VtZW50LCBpZiBnaXZlbiwgbXVzdCBiZSBhIHdhcm5pbmcgY2F0ZWdvcnkgY2xhc3MgKHNlZSBhYm92ZSk7IGl0IGRlZmF1bHRzIHRvCkBAIC0zMTksOCArMzE5LDE0IEBACiAgICBzb3VyY2Ugb2YgOmZ1bmM6YGRlcHJlY2F0aW9uYCBpdHNlbGYgKHNpbmNlIHRoZSBsYXR0ZXIgd291bGQgZGVmZWF0IHRoZSBwdXJwb3NlCiAgICBvZiB0aGUgd2FybmluZyBtZXNzYWdlKS4KIAorICAgKnNvdXJjZSosIGlmIHN1cHBsaWVkLCBpcyB0aGUgZGVzdHJveWVkIG9iamVjdCB3aGljaCBlbWl0dGVkIGEKKyAgIDpleGM6YFJlc291cmNlV2FybmluZ2AuCiAKLS4uIGZ1bmN0aW9uOjogd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlPU5vbmUsIHJlZ2lzdHJ5PU5vbmUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgKnNvdXJjZSogcGFyYW1ldGVyLgorCisKKy4uIGZ1bmN0aW9uOjogd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlPU5vbmUsIHJlZ2lzdHJ5PU5vbmUsIG1vZHVsZV9nbG9iYWxzPU5vbmUsIHNvdXJjZT1Ob25lKQogCiAgICBUaGlzIGlzIGEgbG93LWxldmVsIGludGVyZmFjZSB0byB0aGUgZnVuY3Rpb25hbGl0eSBvZiA6ZnVuYzpgd2FybmAsIHBhc3NpbmcgaW4KICAgIGV4cGxpY2l0bHkgdGhlIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIsIGFuZCBvcHRpb25hbGx5IHRoZQpAQCAtMzM2LDYgKzM0MiwxMiBAQAogICAgc291cmNlIGZvciBtb2R1bGVzIGZvdW5kIGluIHppcGZpbGVzIG9yIG90aGVyIG5vbi1maWxlc3lzdGVtIGltcG9ydAogICAgc291cmNlcykuCiAKKyAgICpzb3VyY2UqLCBpZiBzdXBwbGllZCwgaXMgdGhlIGRlc3Ryb3llZCBvYmplY3Qgd2hpY2ggZW1pdHRlZCBhCisgICA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkIHRoZSAqc291cmNlKiBwYXJhbWV0ZXIuCisKIAogLi4gZnVuY3Rpb246OiBzaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3dpbnJlZy5yc3QgYi9Eb2MvbGlicmFyeS93aW5yZWcucnN0CmluZGV4IDUyZDU5MWEuLjQ4YmRmMTQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3dpbnJlZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvd2lucmVnLnJzdApAQCAtNjM1LDcgKzYzNSw3IEBACiAKIC4uIGRhdGE6OiBSRUdfRFdPUkRfTElUVExFX0VORElBTgogCi0gICBBIDMyLWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisgICBBIDMyLWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuIEVxdWl2YWxlbnQgdG8gOmNvbnN0OmBSRUdfRFdPUkRgLgogCiAuLiBkYXRhOjogUkVHX0RXT1JEX0JJR19FTkRJQU4KIApAQCAtNjU5LDYgKzY1OSwxOCBAQAogCiAgICBObyBkZWZpbmVkIHZhbHVlIHR5cGUuCiAKKy4uIGRhdGE6OiBSRUdfUVdPUkQKKworICAgQSA2NC1iaXQgbnVtYmVyLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworLi4gZGF0YTo6IFJFR19RV09SRF9MSVRUTEVfRU5ESUFOCisKKyAgIEEgNjQtYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gRXF1aXZhbGVudCB0byA6Y29uc3Q6YFJFR19RV09SRGAuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAuLiBkYXRhOjogUkVHX1JFU09VUkNFX0xJU1QKIAogICAgQSBkZXZpY2UtZHJpdmVyIHJlc291cmNlIGxpc3QuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS93aW5zb3VuZC5yc3QgYi9Eb2MvbGlicmFyeS93aW5zb3VuZC5yc3QKaW5kZXggZDJjNDIxMC4uMzcyZjc5MiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvd2luc291bmQucnN0CisrKyBiL0RvYy9saWJyYXJ5L3dpbnNvdW5kLnJzdApAQCAtMjUsNyArMjUsOCBAQAogLi4gZnVuY3Rpb246OiBQbGF5U291bmQoc291bmQsIGZsYWdzKQogCiAgICBDYWxsIHRoZSB1bmRlcmx5aW5nIDpjOmZ1bmM6YFBsYXlTb3VuZGAgZnVuY3Rpb24gZnJvbSB0aGUgUGxhdGZvcm0gQVBJLiAgVGhlCi0gICAqc291bmQqIHBhcmFtZXRlciBtYXkgYmUgYSBmaWxlbmFtZSwgYXVkaW8gZGF0YSBhcyBhIHN0cmluZywgb3IgYGBOb25lYGAuICBJdHMKKyAgICpzb3VuZCogcGFyYW1ldGVyIG1heSBiZSBhIGZpbGVuYW1lLCBhIHN5c3RlbSBzb3VuZCBhbGlhcywgYXVkaW8gZGF0YSBhcyBhCisgICA6dGVybTpgYnl0ZXMtbGlrZSBvYmplY3RgLCBvciBgYE5vbmVgYC4gIEl0cwogICAgaW50ZXJwcmV0YXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgKmZsYWdzKiwgd2hpY2ggY2FuIGJlIGEgYml0d2lzZSBPUmVkCiAgICBjb21iaW5hdGlvbiBvZiB0aGUgY29uc3RhbnRzIGRlc2NyaWJlZCBiZWxvdy4gSWYgdGhlICpzb3VuZCogcGFyYW1ldGVyIGlzCiAgICBgYE5vbmVgYCwgYW55IGN1cnJlbnRseSBwbGF5aW5nIHdhdmVmb3JtIHNvdW5kIGlzIHN0b3BwZWQuIElmIHRoZSBzeXN0ZW0KQEAgLTM5LDcgKzQwLDggQEAKICAgIHNvdW5kIHRvIHBsYXk7IHBvc3NpYmxlIHZhbHVlcyBhcmUgYGAtMWBgLCBgYE1CX0lDT05BU1RFUklTS2BgLAogICAgYGBNQl9JQ09ORVhDTEFNQVRJT05gYCwgYGBNQl9JQ09OSEFORGBgLCBgYE1CX0lDT05RVUVTVElPTmBgLCBhbmQgYGBNQl9PS2BgLCBhbGwKICAgIGRlc2NyaWJlZCBiZWxvdy4gIFRoZSB2YWx1ZSBgYC0xYGAgcHJvZHVjZXMgYSAic2ltcGxlIGJlZXAiOyB0aGlzIGlzIHRoZSBmaW5hbAotICAgZmFsbGJhY2sgaWYgYSBzb3VuZCBjYW5ub3QgYmUgcGxheWVkIG90aGVyd2lzZS4KKyAgIGZhbGxiYWNrIGlmIGEgc291bmQgY2Fubm90IGJlIHBsYXllZCBvdGhlcndpc2UuICBJZiB0aGUgc3lzdGVtIGluZGljYXRlcyBhbgorICAgZXJyb3IsIDpleGM6YFJ1bnRpbWVFcnJvcmAgaXMgcmFpc2VkLgogCiAKIC4uIGRhdGE6OiBTTkRfRklMRU5BTUUKQEAgLTkyLDcgKzk0LDcgQEAKIC4uIGRhdGE6OiBTTkRfTUVNT1JZCiAKICAgIFRoZSAqc291bmQqIHBhcmFtZXRlciB0byA6ZnVuYzpgUGxheVNvdW5kYCBpcyBhIG1lbW9yeSBpbWFnZSBvZiBhIFdBViBmaWxlLCBhcyBhCi0gICBzdHJpbmcuCisgICA6dGVybTpgYnl0ZXMtbGlrZSBvYmplY3RgLgogCiAgICAuLiBub3RlOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvd3NnaXJlZi5yc3QgYi9Eb2MvbGlicmFyeS93c2dpcmVmLnJzdAppbmRleCBhYWQyN2E4Li5hMWQ0NDY5IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS93c2dpcmVmLnJzdAorKysgYi9Eb2MvbGlicmFyeS93c2dpcmVmLnJzdApAQCAtMTMzLDkgKzEzMyw5IEBACiAgICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGVudmlyb24uaXRlbXMoKV0KICAgICAgICAgICByZXR1cm4gcmV0CiAKLSAgICAgIGh0dHBkID0gbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIHNpbXBsZV9hcHApCi0gICAgICBwcmludCgiU2VydmluZyBvbiBwb3J0IDgwMDAuLi4iKQotICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICAgICB3aXRoIG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBzaW1wbGVfYXBwKSBhcyBodHRwZDoKKyAgICAgICAgICBwcmludCgiU2VydmluZyBvbiBwb3J0IDgwMDAuLi4iKQorICAgICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQogCiAKIEluIGFkZGl0aW9uIHRvIHRoZSBlbnZpcm9ubWVudCBmdW5jdGlvbnMgYWJvdmUsIHRoZSA6bW9kOmB3c2dpcmVmLnV0aWxgIG1vZHVsZQpAQCAtMjg1LDE0ICsyODUsMTQgQEAKIAogICAgICAgZnJvbSB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXIgaW1wb3J0IG1ha2Vfc2VydmVyLCBkZW1vX2FwcAogCi0gICAgICBodHRwZCA9IG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBkZW1vX2FwcCkKLSAgICAgIHByaW50KCJTZXJ2aW5nIEhUVFAgb24gcG9ydCA4MDAwLi4uIikKKyAgICAgIHdpdGggbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIGRlbW9fYXBwKSBhcyBodHRwZDoKKyAgICAgICAgICBwcmludCgiU2VydmluZyBIVFRQIG9uIHBvcnQgODAwMC4uLiIpCiAKLSAgICAgICMgUmVzcG9uZCB0byByZXF1ZXN0cyB1bnRpbCBwcm9jZXNzIGlzIGtpbGxlZAotICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICAgICAgICAgIyBSZXNwb25kIHRvIHJlcXVlc3RzIHVudGlsIHByb2Nlc3MgaXMga2lsbGVkCisgICAgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCiAKLSAgICAgICMgQWx0ZXJuYXRpdmU6IHNlcnZlIG9uZSByZXF1ZXN0LCB0aGVuIGV4aXQKLSAgICAgIGh0dHBkLmhhbmRsZV9yZXF1ZXN0KCkKKyAgICAgICAgICAjIEFsdGVybmF0aXZlOiBzZXJ2ZSBvbmUgcmVxdWVzdCwgdGhlbiBleGl0CisgICAgICAgICAgaHR0cGQuaGFuZGxlX3JlcXVlc3QoKQogCiAKIC4uIGZ1bmN0aW9uOjogZGVtb19hcHAoZW52aXJvbiwgc3RhcnRfcmVzcG9uc2UpCkBAIC00MzIsOSArNDMyLDkgQEAKICAgICAgICMgVGhpcyBpcyB0aGUgYXBwbGljYXRpb24gd3JhcHBlZCBpbiBhIHZhbGlkYXRvcgogICAgICAgdmFsaWRhdG9yX2FwcCA9IHZhbGlkYXRvcihzaW1wbGVfYXBwKQogCi0gICAgICBodHRwZCA9IG1ha2Vfc2VydmVyKCcnLCA4MDAwLCB2YWxpZGF0b3JfYXBwKQotICAgICAgcHJpbnQoIkxpc3RlbmluZyBvbiBwb3J0IDgwMDAuLi4uIikKLSAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgd2l0aCBtYWtlX3NlcnZlcignJywgODAwMCwgdmFsaWRhdG9yX2FwcCkgYXMgaHR0cGQ6CisgICAgICAgICAgcHJpbnQoIkxpc3RlbmluZyBvbiBwb3J0IDgwMDAuLi4uIikKKyAgICAgICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKIAogCiA6bW9kOmB3c2dpcmVmLmhhbmRsZXJzYCAtLSBzZXJ2ZXIvZ2F0ZXdheSBiYXNlIGNsYXNzZXMKQEAgLTc3NCw4ICs3NzQsOCBAQAogICAgICAgICMgVGhlIHJldHVybmVkIG9iamVjdCBpcyBnb2luZyB0byBiZSBwcmludGVkCiAgICAgICAgcmV0dXJuIFtiIkhlbGxvIFdvcmxkIl0KIAotICAgaHR0cGQgPSBtYWtlX3NlcnZlcignJywgODAwMCwgaGVsbG9fd29ybGRfYXBwKQotICAgcHJpbnQoIlNlcnZpbmcgb24gcG9ydCA4MDAwLi4uIikKKyAgIHdpdGggbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIGhlbGxvX3dvcmxkX2FwcCkgYXMgaHR0cGQ6CisgICAgICAgcHJpbnQoIlNlcnZpbmcgb24gcG9ydCA4MDAwLi4uIikKIAotICAgIyBTZXJ2ZSB1bnRpbCBwcm9jZXNzIGlzIGtpbGxlZAotICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICAgICAgIyBTZXJ2ZSB1bnRpbCBwcm9jZXNzIGlzIGtpbGxlZAorICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkveG1scnBjLnNlcnZlci5yc3QgYi9Eb2MvbGlicmFyeS94bWxycGMuc2VydmVyLnJzdAppbmRleCAxYzc3ZTg0Li4wNTExZGRmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS94bWxycGMuc2VydmVyLnJzdAorKysgYi9Eb2MvbGlicmFyeS94bWxycGMuc2VydmVyLnJzdApAQCAtMTQ4LDI5ICsxNDgsMjkgQEAKICAgICAgICBycGNfcGF0aHMgPSAoJy9SUEMyJywpCiAKICAgICMgQ3JlYXRlIHNlcnZlcgotICAgc2VydmVyID0gU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXI9UmVxdWVzdEhhbmRsZXIpCi0gICBzZXJ2ZXIucmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9mdW5jdGlvbnMoKQorICAgd2l0aCBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyPVJlcXVlc3RIYW5kbGVyKSBhcyBzZXJ2ZXI6CisgICAgICAgc2VydmVyLnJlZ2lzdGVyX2ludHJvc3BlY3Rpb25fZnVuY3Rpb25zKCkKIAotICAgIyBSZWdpc3RlciBwb3coKSBmdW5jdGlvbjsgdGhpcyB3aWxsIHVzZSB0aGUgdmFsdWUgb2YKLSAgICMgcG93Ll9fbmFtZV9fIGFzIHRoZSBuYW1lLCB3aGljaCBpcyBqdXN0ICdwb3cnLgotICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKKyAgICAgICAjIFJlZ2lzdGVyIHBvdygpIGZ1bmN0aW9uOyB0aGlzIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZgorICAgICAgICMgcG93Ll9fbmFtZV9fIGFzIHRoZSBuYW1lLCB3aGljaCBpcyBqdXN0ICdwb3cnLgorICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCiAKLSAgICMgUmVnaXN0ZXIgYSBmdW5jdGlvbiB1bmRlciBhIGRpZmZlcmVudCBuYW1lCi0gICBkZWYgYWRkZXJfZnVuY3Rpb24oeCx5KToKLSAgICAgICByZXR1cm4geCArIHkKLSAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihhZGRlcl9mdW5jdGlvbiwgJ2FkZCcpCisgICAgICAgIyBSZWdpc3RlciBhIGZ1bmN0aW9uIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUKKyAgICAgICBkZWYgYWRkZXJfZnVuY3Rpb24oeCx5KToKKyAgICAgICAgICAgcmV0dXJuIHggKyB5CisgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGFkZGVyX2Z1bmN0aW9uLCAnYWRkJykKIAotICAgIyBSZWdpc3RlciBhbiBpbnN0YW5jZTsgYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBpbnN0YW5jZSBhcmUKLSAgICMgcHVibGlzaGVkIGFzIFhNTC1SUEMgbWV0aG9kcyAoaW4gdGhpcyBjYXNlLCBqdXN0ICdtdWwnKS4KLSAgIGNsYXNzIE15RnVuY3M6Ci0gICAgICAgZGVmIG11bChzZWxmLCB4LCB5KToKLSAgICAgICAgICAgcmV0dXJuIHggKiB5CisgICAgICAgIyBSZWdpc3RlciBhbiBpbnN0YW5jZTsgYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBpbnN0YW5jZSBhcmUKKyAgICAgICAjIHB1Ymxpc2hlZCBhcyBYTUwtUlBDIG1ldGhvZHMgKGluIHRoaXMgY2FzZSwganVzdCAnbXVsJykuCisgICAgICAgY2xhc3MgTXlGdW5jczoKKyAgICAgICAgICAgZGVmIG11bChzZWxmLCB4LCB5KToKKyAgICAgICAgICAgICAgIHJldHVybiB4ICogeQogCi0gICBzZXJ2ZXIucmVnaXN0ZXJfaW5zdGFuY2UoTXlGdW5jcygpKQorICAgICAgIHNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShNeUZ1bmNzKCkpCiAKLSAgICMgUnVuIHRoZSBzZXJ2ZXIncyBtYWluIGxvb3AKLSAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICAjIFJ1biB0aGUgc2VydmVyJ3MgbWFpbiBsb29wCisgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQogCiBUaGUgZm9sbG93aW5nIGNsaWVudCBjb2RlIHdpbGwgY2FsbCB0aGUgbWV0aG9kcyBtYWRlIGF2YWlsYWJsZSBieSB0aGUgcHJlY2VkaW5nCiBzZXJ2ZXI6OgpAQCAtMjA3LDE4ICsyMDcsMTcgQEAKICAgICAgICAgICAgIGRlZiBnZXRDdXJyZW50VGltZSgpOgogICAgICAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5kYXRldGltZS5ub3coKQogCi0gICAgc2VydmVyID0gU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCkpCi0gICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24obGFtYmRhIHgseTogeCt5LCAnYWRkJykKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfaW5zdGFuY2UoRXhhbXBsZVNlcnZpY2UoKSwgYWxsb3dfZG90dGVkX25hbWVzPVRydWUpCi0gICAgc2VydmVyLnJlZ2lzdGVyX211bHRpY2FsbF9mdW5jdGlvbnMoKQotICAgIHByaW50KCdTZXJ2aW5nIFhNTC1SUEMgb24gbG9jYWxob3N0IHBvcnQgODAwMCcpCi0gICAgdHJ5OgotICAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCi0gICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICBwcmludCgiXG5LZXlib2FyZCBpbnRlcnJ1cHQgcmVjZWl2ZWQsIGV4aXRpbmcuIikKLSAgICAgICAgc2VydmVyLnNlcnZlcl9jbG9zZSgpCi0gICAgICAgIHN5cy5leGl0KDApCisgICAgd2l0aCBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSkgYXMgc2VydmVyOgorICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQorICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24obGFtYmRhIHgseTogeCt5LCAnYWRkJykKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX2luc3RhbmNlKEV4YW1wbGVTZXJ2aWNlKCksIGFsbG93X2RvdHRlZF9uYW1lcz1UcnVlKQorICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfbXVsdGljYWxsX2Z1bmN0aW9ucygpCisgICAgICAgIHByaW50KCdTZXJ2aW5nIFhNTC1SUEMgb24gbG9jYWxob3N0IHBvcnQgODAwMCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgaW50ZXJydXB0IHJlY2VpdmVkLCBleGl0aW5nLiIpCisgICAgICAgICAgICBzeXMuZXhpdCgwKQogCiBUaGlzIEV4YW1wbGVTZXJ2aWNlIGRlbW8gY2FuIGJlIGludm9rZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvemlwZmlsZS5yc3QgYi9Eb2MvbGlicmFyeS96aXBmaWxlLnJzdAppbmRleCBhYmUzOGM0Li42YzlkMjA3IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS96aXBmaWxlLnJzdAorKysgYi9Eb2MvbGlicmFyeS96aXBmaWxlLnJzdApAQCAtMjA1LDE4ICsyMDUsMTMgQEAKICAgIFJldHVybiBhIGxpc3Qgb2YgYXJjaGl2ZSBtZW1iZXJzIGJ5IG5hbWUuCiAKIAotLi4gaW5kZXg6OgotICAgc2luZ2xlOiB1bml2ZXJzYWwgbmV3bGluZXM7IHppcGZpbGUuWmlwRmlsZS5vcGVuIG1ldGhvZAorLi4gbWV0aG9kOjogWmlwRmlsZS5vcGVuKG5hbWUsIG1vZGU9J3InLCBwd2Q9Tm9uZSwgKiwgZm9yY2VfemlwNjQ9RmFsc2UpCiAKLS4uIG1ldGhvZDo6IFppcEZpbGUub3BlbihuYW1lLCBtb2RlPSdyJywgcHdkPU5vbmUpCi0KLSAgIEV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSBhcyBhIGZpbGUtbGlrZSBvYmplY3QgKFppcEV4dEZpbGUpLiAqbmFtZSoKLSAgIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHRoZSBhcmNoaXZlLCBvciBhIDpjbGFzczpgWmlwSW5mb2Agb2JqZWN0LiBUaGUKLSAgICptb2RlKiBwYXJhbWV0ZXIsIGlmIGluY2x1ZGVkLCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBgYCdyJ2BgICh0aGUKLSAgIGRlZmF1bHQpLCBgYCdVJ2BgLCBvciBgYCdyVSdgYC4gQ2hvb3NpbmcgYGAnVSdgYCBvciAgYGAnclUnYGAgd2lsbCBlbmFibGUKLSAgIDp0ZXJtOmB1bml2ZXJzYWwgbmV3bGluZXNgIHN1cHBvcnQgaW4gdGhlIHJlYWQtb25seSBvYmplY3QuICAqcHdkKiBpcyB0aGUKLSAgIHBhc3N3b3JkIHVzZWQgZm9yIGVuY3J5cHRlZCBmaWxlcy4gIENhbGxpbmcgIDptZXRoOmAub3BlbmAgb24gYSBjbG9zZWQKLSAgIFppcEZpbGUgd2lsbCByYWlzZSBhICA6ZXhjOmBSdW50aW1lRXJyb3JgLgorICAgQWNjZXNzIGEgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGFzIGEgYmluYXJ5IGZpbGUtbGlrZSBvYmplY3QuICAqbmFtZSoKKyAgIGNhbiBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgYSBmaWxlIHdpdGhpbiB0aGUgYXJjaGl2ZSBvciBhIDpjbGFzczpgWmlwSW5mb2AKKyAgIG9iamVjdC4gIFRoZSAqbW9kZSogcGFyYW1ldGVyLCBpZiBpbmNsdWRlZCwgbXVzdCBiZSBgYCdyJ2BgICh0aGUgZGVmYXVsdCkKKyAgIG9yIGBgJ3cnYGAuICAqcHdkKiBpcyB0aGUgcGFzc3dvcmQgdXNlZCB0byBkZWNyeXB0IGVuY3J5cHRlZCBaSVAgZmlsZXMuCisgICBDYWxsaW5nIDptZXRoOmAub3BlbmAgb24gYSBjbG9zZWQgWmlwRmlsZSB3aWxsIHJhaXNlIGEgOmV4YzpgUnVudGltZUVycm9yYC4KIAogICAgOm1ldGg6YH5aaXBGaWxlLm9wZW5gIGlzIGFsc28gYSBjb250ZXh0IG1hbmFnZXIgYW5kIHRoZXJlZm9yZSBzdXBwb3J0cyB0aGUKICAgIDprZXl3b3JkOmB3aXRoYCBzdGF0ZW1lbnQ6OgpAQCAtMjI1LDE3ICsyMjAsMjMgQEAKICAgICAgICAgICB3aXRoIG15emlwLm9wZW4oJ2VnZ3MudHh0JykgYXMgbXlmaWxlOgogICAgICAgICAgICAgICBwcmludChteWZpbGUucmVhZCgpKQogCi0gICAuLiBub3RlOjoKKyAgIFdpdGggKm1vZGUqIGBgJ3InYGAgdGhlIGZpbGUtbGlrZSBvYmplY3QKKyAgIChgYFppcEV4dEZpbGVgYCkgaXMgcmVhZC1vbmx5IGFuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisgICA6bWV0aDpgfmlvLkJ1ZmZlcmVkSU9CYXNlLnJlYWRgLCA6bWV0aDpgfmlvLklPQmFzZS5yZWFkbGluZWAsCisgICA6bWV0aDpgfmlvLklPQmFzZS5yZWFkbGluZXNgLCA6bWV0aDpgX19pdGVyX19gLAorICAgOm1ldGg6YH5pdGVyYXRvci5fX25leHRfX2AuICBUaGVzZSBvYmplY3RzIGNhbiBvcGVyYXRlIGluZGVwZW5kZW50bHkgb2YKKyAgIHRoZSBaaXBGaWxlLgogCi0gICAgICBUaGUgZmlsZS1saWtlIG9iamVjdCBpcyByZWFkLW9ubHkgYW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAgICAgIDptZXRoOmB+aW8uQnVmZmVyZWRJT0Jhc2UucmVhZGAsIDptZXRoOmB+aW8uSU9CYXNlLnJlYWRsaW5lYCwKLSAgICAgIDptZXRoOmB+aW8uSU9CYXNlLnJlYWRsaW5lc2AsIDptZXRoOmBfX2l0ZXJfX2AsCi0gICAgICA6bWV0aDpgfml0ZXJhdG9yLl9fbmV4dF9fYC4KKyAgIFdpdGggYGBtb2RlPSd3J2BgLCBhIHdyaXRhYmxlIGZpbGUgaGFuZGxlIGlzIHJldHVybmVkLCB3aGljaCBzdXBwb3J0cyB0aGUKKyAgIDptZXRoOmB+aW8uQnVmZmVyZWRJT0Jhc2Uud3JpdGVgIG1ldGhvZC4gIFdoaWxlIGEgd3JpdGFibGUgZmlsZSBoYW5kbGUgaXMgb3BlbiwKKyAgIGF0dGVtcHRpbmcgdG8gcmVhZCBvciB3cml0ZSBvdGhlciBmaWxlcyBpbiB0aGUgWklQIGZpbGUgd2lsbCByYWlzZSBhCisgICA6ZXhjOmBSdW50aW1lRXJyb3JgLgogCi0gICAuLiBub3RlOjoKLQotICAgICAgT2JqZWN0cyByZXR1cm5lZCBieSA6bWV0aDpgLm9wZW5gIGNhbiBvcGVyYXRlIGluZGVwZW5kZW50bHkgb2YgdGhlCi0gICAgICBaaXBGaWxlLgorICAgV2hlbiB3cml0aW5nIGEgZmlsZSwgaWYgdGhlIGZpbGUgc2l6ZSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSBidXQgbWF5IGV4Y2VlZAorICAgMiBHaUIsIHBhc3MgYGBmb3JjZV96aXA2ND1UcnVlYGAgdG8gZW5zdXJlIHRoYXQgdGhlIGhlYWRlciBmb3JtYXQgaXMKKyAgIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBsYXJnZSBmaWxlcy4gIElmIHRoZSBmaWxlIHNpemUgaXMga25vd24gaW4gYWR2YW5jZSwKKyAgIGNvbnN0cnVjdCBhIDpjbGFzczpgWmlwSW5mb2Agb2JqZWN0IHdpdGggOmF0dHI6YH5aaXBJbmZvLmZpbGVfc2l6ZWAgc2V0LCBhbmQKKyAgIHVzZSB0aGF0IGFzIHRoZSAqbmFtZSogcGFyYW1ldGVyLgogCiAgICAuLiBub3RlOjoKIApAQCAtMjQzLDEwICsyNDQsMTQgQEAKICAgICAgIG9yIGEgOmNsYXNzOmBaaXBJbmZvYCBvYmplY3QuICBZb3Ugd2lsbCBhcHByZWNpYXRlIHRoaXMgd2hlbiB0cnlpbmcgdG8gcmVhZCBhCiAgICAgICBaSVAgZmlsZSB0aGF0IGNvbnRhaW5zIG1lbWJlcnMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuCiAKLSAgIC4uIGRlcHJlY2F0ZWQtcmVtb3ZlZDo6IDMuNCAzLjYKLSAgICAgIFRoZSBgYCdVJ2BgIG9yICBgYCdyVSdgYCBtb2RlLiAgVXNlIDpjbGFzczpgaW8uVGV4dElPV3JhcHBlcmAgZm9yIHJlYWRpbmcKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBSZW1vdmVkIHN1cHBvcnQgb2YgYGBtb2RlPSdVJ2BgLiAgVXNlIDpjbGFzczpgaW8uVGV4dElPV3JhcHBlcmAgZm9yIHJlYWRpbmcKICAgICAgIGNvbXByZXNzZWQgdGV4dCBmaWxlcyBpbiA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBtb2RlLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgOm1ldGg6YG9wZW5gIGNhbiBub3cgYmUgdXNlZCB0byB3cml0ZSBmaWxlcyBpbnRvIHRoZSBhcmNoaXZlIHdpdGggdGhlCisgICAgICBgYG1vZGU9J3cnYGAgb3B0aW9uLgorCiAuLiBtZXRob2Q6OiBaaXBGaWxlLmV4dHJhY3QobWVtYmVyLCBwYXRoPU5vbmUsIHB3ZD1Ob25lKQogCiAgICBFeHRyYWN0IGEgbWVtYmVyIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk7ICptZW1iZXIqCkBAIC00NjUsNyArNDcwLDMxIEBACiA6bWV0aDpgLmluZm9saXN0YCBtZXRob2RzIG9mIDpjbGFzczpgWmlwRmlsZWAgb2JqZWN0cy4gIEVhY2ggb2JqZWN0IHN0b3JlcwogaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgbWVtYmVyIG9mIHRoZSBaSVAgYXJjaGl2ZS4KIAotSW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorVGhlcmUgaXMgb25lIGNsYXNzbWV0aG9kIHRvIG1ha2UgYSA6Y2xhc3M6YFppcEluZm9gIGluc3RhbmNlIGZvciBhIGZpbGVzeXN0ZW0KK2ZpbGU6CisKKy4uIGNsYXNzbWV0aG9kOjogWmlwSW5mby5mcm9tX2ZpbGUoZmlsZW5hbWUsIGFyY25hbWU9Tm9uZSkKKworICAgQ29uc3RydWN0IGEgOmNsYXNzOmBaaXBJbmZvYCBpbnN0YW5jZSBmb3IgYSBmaWxlIG9uIHRoZSBmaWxlc3lzdGVtLCBpbgorICAgcHJlcGFyYXRpb24gZm9yIGFkZGluZyBpdCB0byBhIHppcCBmaWxlLgorCisgICAqZmlsZW5hbWUqIHNob3VsZCBiZSB0aGUgcGF0aCB0byBhIGZpbGUgb3IgZGlyZWN0b3J5IG9uIHRoZSBmaWxlc3lzdGVtLgorCisgICBJZiAqYXJjbmFtZSogaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzIHRoZSBuYW1lIHdpdGhpbiB0aGUgYXJjaGl2ZS4KKyAgIElmICphcmNuYW1lKiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSB3aWxsIGJlIHRoZSBzYW1lIGFzICpmaWxlbmFtZSosIGJ1dAorICAgd2l0aCBhbnkgZHJpdmUgbGV0dGVyIGFuZCBsZWFkaW5nIHBhdGggc2VwYXJhdG9ycyByZW1vdmVkLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworSW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzOgorCisuLiBtZXRob2Q6OiBaaXBJbmZvLmlzX2RpcigpCisKKyAgIFJldHVybiBUcnVlIGlmIHRoaXMgYXJjaGl2ZSBtZW1iZXIgaXMgYSBkaXJlY3RvcnkuCisKKyAgIFRoaXMgdXNlcyB0aGUgZW50cnkncyBuYW1lOiBkaXJlY3RvcmllcyBzaG91bGQgYWx3YXlzIGVuZCB3aXRoIGBgL2BgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKIAogCiAuLiBhdHRyaWJ1dGU6OiBaaXBJbmZvLmZpbGVuYW1lCkBAIC01NzQsNCArNjAzLDUgQEAKIAogICAgU2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGZpbGUuCiAKKwogLi4gX1BLWklQIEFwcGxpY2F0aW9uIE5vdGU6IGh0dHBzOi8vcGt3YXJlLmNhY2hlZmx5Lm5ldC93ZWJkb2NzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS96bGliLnJzdCBiL0RvYy9saWJyYXJ5L3psaWIucnN0CmluZGV4IDFkZTdiYWUuLjNkNzQyYWIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3psaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3psaWIucnN0CkBAIC00NywxNCArNDcsMTkgQEAKICAgICAgIHBsYXRmb3JtcywgdXNlIGBgYWRsZXIzMihkYXRhKSAmIDB4ZmZmZmZmZmZgYC4KIAogCi0uLiBmdW5jdGlvbjo6IGNvbXByZXNzKGRhdGFbLCBsZXZlbF0pCisuLiBmdW5jdGlvbjo6IGNvbXByZXNzKGRhdGEsIGxldmVsPS0xKQogCiAgICBDb21wcmVzc2VzIHRoZSBieXRlcyBpbiAqZGF0YSosIHJldHVybmluZyBhIGJ5dGVzIG9iamVjdCBjb250YWluaW5nIGNvbXByZXNzZWQgZGF0YS4KLSAgICpsZXZlbCogaXMgYW4gaW50ZWdlciBmcm9tIGBgMGBgIHRvIGBgOWBgIGNvbnRyb2xsaW5nIHRoZSBsZXZlbCBvZiBjb21wcmVzc2lvbjsKKyAgICpsZXZlbCogaXMgYW4gaW50ZWdlciBmcm9tIGBgMGBgIHRvIGBgOWBgIG9yIGBgLTFgYCBjb250cm9sbGluZyB0aGUgbGV2ZWwgb2YgY29tcHJlc3Npb247CiAgICBgYDFgYCBpcyBmYXN0ZXN0IGFuZCBwcm9kdWNlcyB0aGUgbGVhc3QgY29tcHJlc3Npb24sIGBgOWBgIGlzIHNsb3dlc3QgYW5kCi0gICBwcm9kdWNlcyB0aGUgbW9zdC4gIGBgMGBgIGlzIG5vIGNvbXByZXNzaW9uLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGA2YGAuCisgICBwcm9kdWNlcyB0aGUgbW9zdC4gIGBgMGBgIGlzIG5vIGNvbXByZXNzaW9uLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGAtMWBgCisgICAoWl9ERUZBVUxUX0NPTVBSRVNTSU9OKS4gIFpfREVGQVVMVF9DT01QUkVTU0lPTiByZXByZXNlbnRzIGEgZGVmYXVsdAorICAgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGFuZCBjb21wcmVzc2lvbiAoY3VycmVudGx5IGVxdWl2YWxlbnQgdG8gbGV2ZWwgNikuCiAgICBSYWlzZXMgdGhlIDpleGM6YGVycm9yYCBleGNlcHRpb24gaWYgYW55IGVycm9yIG9jY3Vycy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICpsZXZlbCogY2FuIG5vdyBiZSB1c2VkIGFzIGEga2V5d29yZCBwYXJhbWV0ZXIuCisKIAogLi4gZnVuY3Rpb246OiBjb21wcmVzc29iaihsZXZlbD0tMSwgbWV0aG9kPURFRkxBVEVELCB3Yml0cz0xNSwgbWVtTGV2ZWw9OCwgc3RyYXRlZ3k9Wl9ERUZBVUxUX1NUUkFURUdZWywgemRpY3RdKQogCkBAIC0xMjQsNyArMTI5LDcgQEAKICAgICAgIHBsYXRmb3JtcywgdXNlIGBgY3JjMzIoZGF0YSkgJiAweGZmZmZmZmZmYGAuCiAKIAotLi4gZnVuY3Rpb246OiBkZWNvbXByZXNzKGRhdGFbLCB3Yml0c1ssIGJ1ZnNpemVdXSkKKy4uIGZ1bmN0aW9uOjogZGVjb21wcmVzcyhkYXRhLCB3Yml0cz1NQVhfV0JJVFMsIGJ1ZnNpemU9REVGX0JVRl9TSVpFKQogCiAgICBEZWNvbXByZXNzZXMgdGhlIGJ5dGVzIGluICpkYXRhKiwgcmV0dXJuaW5nIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlCiAgICB1bmNvbXByZXNzZWQgZGF0YS4gIFRoZSAqd2JpdHMqIHBhcmFtZXRlciBkZXBlbmRzIG9uCkBAIC0xNTksMTQgKzE2NCwxNiBAQAogICAgV2hlbiBkZWNvbXByZXNzaW5nIGEgc3RyZWFtLCB0aGUgd2luZG93IHNpemUgbXVzdCBub3QgYmUgc21hbGxlcgogICAgdGhhbiB0aGUgc2l6ZSBvcmlnaW5hbGx5IHVzZWQgdG8gY29tcHJlc3MgdGhlIHN0cmVhbTsgdXNpbmcgYSB0b28tc21hbGwKICAgIHZhbHVlIG1heSByZXN1bHQgaW4gYW4gOmV4YzpgZXJyb3JgIGV4Y2VwdGlvbi4gVGhlIGRlZmF1bHQgKndiaXRzKiB2YWx1ZQotICAgaXMgMTUsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBsYXJnZXN0IHdpbmRvdyBzaXplIGFuZCByZXF1aXJlcyBhIHpsaWIKLSAgIGhlYWRlciBhbmQgdHJhaWxlciB0byBiZSBpbmNsdWRlZC4KKyAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsYXJnZXN0IHdpbmRvdyBzaXplIGFuZCByZXF1aXJlcyBhIHpsaWIgaGVhZGVyIGFuZAorICAgdHJhaWxlciB0byBiZSBpbmNsdWRlZC4KIAogICAgKmJ1ZnNpemUqIGlzIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGJ1ZmZlciB1c2VkIHRvIGhvbGQgZGVjb21wcmVzc2VkIGRhdGEuICBJZgogICAgbW9yZSBzcGFjZSBpcyByZXF1aXJlZCwgdGhlIGJ1ZmZlciBzaXplIHdpbGwgYmUgaW5jcmVhc2VkIGFzIG5lZWRlZCwgc28geW91CiAgICBkb24ndCBoYXZlIHRvIGdldCB0aGlzIHZhbHVlIGV4YWN0bHkgcmlnaHQ7IHR1bmluZyBpdCB3aWxsIG9ubHkgc2F2ZSBhIGZldyBjYWxscwotICAgdG8gOmM6ZnVuYzpgbWFsbG9jYC4gIFRoZSBkZWZhdWx0IHNpemUgaXMgMTYzODQuCisgICB0byA6YzpmdW5jOmBtYWxsb2NgLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgKndiaXRzKiBhbmQgKmJ1ZnNpemUqIGNhbiBiZSB1c2VkIGFzIGtleXdvcmQgYXJndW1lbnRzLgogCiAuLiBmdW5jdGlvbjo6IGRlY29tcHJlc3NvYmood2JpdHM9MTVbLCB6ZGljdF0pCiAKQEAgLTI1Miw3ICsyNTksNyBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAKIAotLi4gbWV0aG9kOjogRGVjb21wcmVzcy5kZWNvbXByZXNzKGRhdGFbLCBtYXhfbGVuZ3RoXSkKKy4uIG1ldGhvZDo6IERlY29tcHJlc3MuZGVjb21wcmVzcyhkYXRhLCBtYXhfbGVuZ3RoPTApCiAKICAgIERlY29tcHJlc3MgKmRhdGEqLCByZXR1cm5pbmcgYSBieXRlcyBvYmplY3QgY29udGFpbmluZyB0aGUgdW5jb21wcmVzc2VkIGRhdGEKICAgIGNvcnJlc3BvbmRpbmcgdG8gYXQgbGVhc3QgcGFydCBvZiB0aGUgZGF0YSBpbiAqc3RyaW5nKi4gIFRoaXMgZGF0YSBzaG91bGQgYmUKQEAgLTI2NCw5ICsyNzEsMTEgQEAKICAgIG5vIGxvbmdlciB0aGFuICptYXhfbGVuZ3RoKi4gVGhpcyBtYXkgbWVhbiB0aGF0IG5vdCBhbGwgb2YgdGhlIGNvbXByZXNzZWQgaW5wdXQKICAgIGNhbiBiZSBwcm9jZXNzZWQ7IGFuZCB1bmNvbnN1bWVkIGRhdGEgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGF0dHJpYnV0ZQogICAgOmF0dHI6YHVuY29uc3VtZWRfdGFpbGAuIFRoaXMgYnl0ZXN0cmluZyBtdXN0IGJlIHBhc3NlZCB0byBhIHN1YnNlcXVlbnQgY2FsbCB0bwotICAgOm1ldGg6YGRlY29tcHJlc3NgIGlmIGRlY29tcHJlc3Npb24gaXMgdG8gY29udGludWUuICBJZiAqbWF4X2xlbmd0aCogaXMgbm90Ci0gICBzdXBwbGllZCB0aGVuIHRoZSB3aG9sZSBpbnB1dCBpcyBkZWNvbXByZXNzZWQsIGFuZCA6YXR0cjpgdW5jb25zdW1lZF90YWlsYCBpcwotICAgZW1wdHkuCisgICA6bWV0aDpgZGVjb21wcmVzc2AgaWYgZGVjb21wcmVzc2lvbiBpcyB0byBjb250aW51ZS4gIElmICptYXhfbGVuZ3RoKiBpcyB6ZXJvCisgICB0aGVuIHRoZSB3aG9sZSBpbnB1dCBpcyBkZWNvbXByZXNzZWQsIGFuZCA6YXR0cjpgdW5jb25zdW1lZF90YWlsYCBpcyBlbXB0eS4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICptYXhfbGVuZ3RoKiBjYW4gYmUgdXNlZCBhcyBhIGtleXdvcmQgYXJndW1lbnQuCiAKIAogLi4gbWV0aG9kOjogRGVjb21wcmVzcy5mbHVzaChbbGVuZ3RoXSkKZGlmZiAtLWdpdCBhL0RvYy9tYWtlLmJhdCBiL0RvYy9tYWtlLmJhdAppbmRleCA1YWI4MDg1Li5kYTFmODc2IDEwMDY0NAotLS0gYS9Eb2MvbWFrZS5iYXQKKysrIGIvRG9jL21ha2UuYmF0CkBAIC00MCw3ICs0MCw3IEBACiAgICAgZ290byBlbmQNCiApDQogDQotJVNQSElOWEJVSUxEJSAyPiBudWwNCislU1BISU5YQlVJTEQlID5udWwgMj4gbnVsDQogaWYgZXJyb3JsZXZlbCA5MDA5ICgNCiAgICAgZWNoby4NCiAgICAgZWNoby5UaGUgJ3NwaGlueC1idWlsZCcgY29tbWFuZCB3YXMgbm90IGZvdW5kLiBNYWtlIHN1cmUgeW91IGhhdmUgU3BoaW54DQpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9jb21wb3VuZF9zdG10cy5yc3QgYi9Eb2MvcmVmZXJlbmNlL2NvbXBvdW5kX3N0bXRzLnJzdAppbmRleCA4OGI5NGVhLi40ZmM2YWYwIDEwMDY0NAotLS0gYS9Eb2MvcmVmZXJlbmNlL2NvbXBvdW5kX3N0bXRzLnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL2NvbXBvdW5kX3N0bXRzLnJzdApAQCAtNDcxLDEwICs0NzEsMTAgQEAKICAgIGRlY29yYXRvcnM6IGBkZWNvcmF0b3JgKwogICAgZGVjb3JhdG9yOiAiQCIgYGRvdHRlZF9uYW1lYCBbIigiIFtgYXJndW1lbnRfbGlzdGAgWyIsIl1dICIpIl0gTkVXTElORQogICAgZG90dGVkX25hbWU6IGBpZGVudGlmaWVyYCAoIi4iIGBpZGVudGlmaWVyYCkqCi0gICBwYXJhbWV0ZXJfbGlzdDogKGBkZWZwYXJhbWV0ZXJgICIsIikqCi0gICAgICAgICAgICAgICAgIDogfCAiKiIgW2BwYXJhbWV0ZXJgXSAoIiwiIGBkZWZwYXJhbWV0ZXJgKSogWyIsIiAiKioiIGBwYXJhbWV0ZXJgXQotICAgICAgICAgICAgICAgICA6IHwgIioqIiBgcGFyYW1ldGVyYAotICAgICAgICAgICAgICAgICA6IHwgYGRlZnBhcmFtZXRlcmAgWyIsIl0gKQorICAgcGFyYW1ldGVyX2xpc3Q6IGBkZWZwYXJhbWV0ZXJgICgiLCIgYGRlZnBhcmFtZXRlcmApKiBbIiwiIFtgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NgXV0KKyAgICAgICAgICAgICAgICAgOiB8IGBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnc2AKKyAgIHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzOiAiKiIgW2BwYXJhbWV0ZXJgXSAoIiwiIGBkZWZwYXJhbWV0ZXJgKSogWyIsIiBbIioqIiBgcGFyYW1ldGVyYCBbIiwiXV1dCisgICAgICAgICAgICAgICAgICAgICAgICAgOiB8ICIqKiIgYHBhcmFtZXRlcmAgWyIsIl0KICAgIHBhcmFtZXRlcjogYGlkZW50aWZpZXJgIFsiOiIgYGV4cHJlc3Npb25gXQogICAgZGVmcGFyYW1ldGVyOiBgcGFyYW1ldGVyYCBbIj0iIGBleHByZXNzaW9uYF0KICAgIGZ1bmNuYW1lOiBgaWRlbnRpZmllcmAKQEAgLTU0NiwxMSArNTQ2LDEyIEBACiBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVycyBtZW50aW9uZWQgaW4gdGhlIHBhcmFtZXRlcgogbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tIGtleXdvcmQgYXJndW1lbnRzLCBvciBmcm9tIGRlZmF1bHQKIHZhbHVlcy4gIElmIHRoZSBmb3JtICJgYCppZGVudGlmaWVyYGAiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgdHVwbGUKLXJlY2VpdmluZyBhbnkgZXhjZXNzIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuICBJZgotdGhlIGZvcm0gImBgKippZGVudGlmaWVyYGAiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3IGRpY3Rpb25hcnkKLXJlY2VpdmluZyBhbnkgZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLCBkZWZhdWx0aW5nIHRvIGEgbmV3IGVtcHR5IGRpY3Rpb25hcnkuCi1QYXJhbWV0ZXJzIGFmdGVyICJgYCpgYCIgb3IgImBgKmlkZW50aWZpZXJgYCIgYXJlIGtleXdvcmQtb25seSBwYXJhbWV0ZXJzIGFuZAotbWF5IG9ubHkgYmUgcGFzc2VkIHVzZWQga2V5d29yZCBhcmd1bWVudHMuCityZWNlaXZpbmcgYW55IGV4Y2VzcyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLgorSWYgdGhlIGZvcm0gImBgKippZGVudGlmaWVyYGAiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3CitvcmRlcmVkIG1hcHBpbmcgcmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYQorbmV3IGVtcHR5IG1hcHBpbmcgb2YgdGhlIHNhbWUgdHlwZS4gIFBhcmFtZXRlcnMgYWZ0ZXIgImBgKmBgIiBvcgorImBgKmlkZW50aWZpZXJgYCIgYXJlIGtleXdvcmQtb25seSBwYXJhbWV0ZXJzIGFuZCBtYXkgb25seSBiZSBwYXNzZWQKK3VzZWQga2V5d29yZCBhcmd1bWVudHMuCiAKIC4uIGluZGV4OjogcGFpcjogZnVuY3Rpb247IGFubm90YXRpb25zCiAKQEAgLTYzMiw2ICs2MzMsMTEgQEAKIGRpY3Rpb25hcnkuICBUaGUgY2xhc3MgbmFtZSBpcyBib3VuZCB0byB0aGlzIGNsYXNzIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbG9jYWwKIG5hbWVzcGFjZS4KIAorVGhlIG9yZGVyIGluIHdoaWNoIGF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgaW4gdGhlIGNsYXNzIGJvZHkgaXMgcHJlc2VydmVkCitpbiB0aGUgbmV3IGNsYXNzJ3MgYGBfX2RpY3RfX2BgLiAgTm90ZSB0aGF0IHRoaXMgaXMgcmVsaWFibGUgb25seSByaWdodAorYWZ0ZXIgdGhlIGNsYXNzIGlzIGNyZWF0ZWQgYW5kIG9ubHkgZm9yIGNsYXNzZXMgdGhhdCB3ZXJlIGRlZmluZWQgdXNpbmcKK3RoZSBkZWZpbml0aW9uIHN5bnRheC4KKwogQ2xhc3MgY3JlYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgaGVhdmlseSB1c2luZyA6cmVmOmBtZXRhY2xhc3NlcyA8bWV0YWNsYXNzZXM+YC4KIAogQ2xhc3NlcyBjYW4gYWxzbyBiZSBkZWNvcmF0ZWQ6IGp1c3QgbGlrZSB3aGVuIGRlY29yYXRpbmcgZnVuY3Rpb25zLCA6OgpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9kYXRhbW9kZWwucnN0IGIvRG9jL3JlZmVyZW5jZS9kYXRhbW9kZWwucnN0CmluZGV4IDY4OTRjN2MuLjI0NmUyZTMgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvZGF0YW1vZGVsLnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL2RhdGFtb2RlbC5yc3QKQEAgLTY4NiwxMCArNjg2LDI4IEBACiAgICBBdHRyaWJ1dGUgYXNzaWdubWVudCB1cGRhdGVzIHRoZSBtb2R1bGUncyBuYW1lc3BhY2UgZGljdGlvbmFyeSwgZS5nLiwKICAgIGBgbS54ID0gMWBgIGlzIGVxdWl2YWxlbnQgdG8gYGBtLl9fZGljdF9fWyJ4Il0gPSAxYGAuCiAKKyAgIC4uIGluZGV4OjoKKyAgICAgIHNpbmdsZTogX19uYW1lX18gKG1vZHVsZSBhdHRyaWJ1dGUpCisgICAgICBzaW5nbGU6IF9fZG9jX18gKG1vZHVsZSBhdHRyaWJ1dGUpCisgICAgICBzaW5nbGU6IF9fZmlsZV9fIChtb2R1bGUgYXR0cmlidXRlKQorICAgICAgc2luZ2xlOiBfX2Fubm90YXRpb25zX18gKG1vZHVsZSBhdHRyaWJ1dGUpCisgICAgICBwYWlyOiBtb2R1bGU7IG5hbWVzcGFjZQorCisgICBQcmVkZWZpbmVkICh3cml0YWJsZSkgYXR0cmlidXRlczogOmF0dHI6YF9fbmFtZV9fYCBpcyB0aGUgbW9kdWxlJ3MgbmFtZTsKKyAgIDphdHRyOmBfX2RvY19fYCBpcyB0aGUgbW9kdWxlJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIGBgTm9uZWBgIGlmCisgICB1bmF2YWlsYWJsZTsgOmF0dHI6YF9fYW5ub3RhdGlvbnNfX2AgKG9wdGlvbmFsKSBpcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZworICAgOnRlcm06YHZhcmlhYmxlIGFubm90YXRpb25zIDx2YXJpYWJsZSBhbm5vdGF0aW9uPmAgY29sbGVjdGVkIGR1cmluZyBtb2R1bGUKKyAgIGJvZHkgZXhlY3V0aW9uOyA6YXR0cjpgX19maWxlX19gIGlzIHRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZQorICAgbW9kdWxlIHdhcyBsb2FkZWQsIGlmIGl0IHdhcyBsb2FkZWQgZnJvbSBhIGZpbGUuIFRoZSA6YXR0cjpgX19maWxlX19gCisgICBhdHRyaWJ1dGUgbWF5IGJlIG1pc3NpbmcgZm9yIGNlcnRhaW4gdHlwZXMgb2YgbW9kdWxlcywgc3VjaCBhcyBDIG1vZHVsZXMKKyAgIHRoYXQgYXJlIHN0YXRpY2FsbHkgbGlua2VkIGludG8gdGhlIGludGVycHJldGVyOyBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMKKyAgIGxvYWRlZCBkeW5hbWljYWxseSBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIGl0IGlzIHRoZSBwYXRobmFtZSBvZiB0aGUgc2hhcmVkCisgICBsaWJyYXJ5IGZpbGUuCisKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBfX2RpY3RfXyAobW9kdWxlIGF0dHJpYnV0ZSkKIAotICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlOiA6YXR0cjpgfm9iamVjdC5fX2RpY3RfX2AgaXMgdGhlIG1vZHVsZSdzIG5hbWVzcGFjZSBhcyBhCi0gICBkaWN0aW9uYXJ5IG9iamVjdC4KKyAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZTogOmF0dHI6YH5vYmplY3QuX19kaWN0X19gIGlzIHRoZSBtb2R1bGUncworICAgbmFtZXNwYWNlIGFzIGEgZGljdGlvbmFyeSBvYmplY3QuCiAKICAgIC4uIGltcGwtZGV0YWlsOjoKIApAQCAtNjk4LDIxICs3MTYsNiBAQAogICAgICAgZGljdGlvbmFyeSBzdGlsbCBoYXMgbGl2ZSByZWZlcmVuY2VzLiAgVG8gYXZvaWQgdGhpcywgY29weSB0aGUgZGljdGlvbmFyeQogICAgICAgb3Iga2VlcCB0aGUgbW9kdWxlIGFyb3VuZCB3aGlsZSB1c2luZyBpdHMgZGljdGlvbmFyeSBkaXJlY3RseS4KIAotICAgLi4gaW5kZXg6OgotICAgICAgc2luZ2xlOiBfX25hbWVfXyAobW9kdWxlIGF0dHJpYnV0ZSkKLSAgICAgIHNpbmdsZTogX19kb2NfXyAobW9kdWxlIGF0dHJpYnV0ZSkKLSAgICAgIHNpbmdsZTogX19maWxlX18gKG1vZHVsZSBhdHRyaWJ1dGUpCi0gICAgICBwYWlyOiBtb2R1bGU7IG5hbWVzcGFjZQotCi0gICBQcmVkZWZpbmVkICh3cml0YWJsZSkgYXR0cmlidXRlczogOmF0dHI6YF9fbmFtZV9fYCBpcyB0aGUgbW9kdWxlJ3MgbmFtZTsKLSAgIDphdHRyOmBfX2RvY19fYCBpcyB0aGUgbW9kdWxlJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIGBgTm9uZWBgIGlmCi0gICB1bmF2YWlsYWJsZTsgOmF0dHI6YF9fZmlsZV9fYCBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUKLSAgIG1vZHVsZSB3YXMgbG9hZGVkLCBpZiBpdCB3YXMgbG9hZGVkIGZyb20gYSBmaWxlLiBUaGUgOmF0dHI6YF9fZmlsZV9fYAotICAgYXR0cmlidXRlIG1heSBiZSBtaXNzaW5nIGZvciBjZXJ0YWluIHR5cGVzIG9mIG1vZHVsZXMsIHN1Y2ggYXMgQyBtb2R1bGVzCi0gICB0aGF0IGFyZSBzdGF0aWNhbGx5IGxpbmtlZCBpbnRvIHRoZSBpbnRlcnByZXRlcjsgZm9yIGV4dGVuc2lvbiBtb2R1bGVzCi0gICBsb2FkZWQgZHluYW1pY2FsbHkgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBpdCBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlIHNoYXJlZAotICAgbGlicmFyeSBmaWxlLgotCiBDdXN0b20gY2xhc3NlcwogICAgQ3VzdG9tIGNsYXNzIHR5cGVzIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBjbGFzcyBkZWZpbml0aW9ucyAoc2VlIHNlY3Rpb24KICAgIDpyZWY6YGNsYXNzYCkuICBBIGNsYXNzIGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBieSBhIGRpY3Rpb25hcnkgb2JqZWN0LgpAQCAtNzYxLDEzICs3NjQsMTcgQEAKICAgICAgIHNpbmdsZTogX19kaWN0X18gKGNsYXNzIGF0dHJpYnV0ZSkKICAgICAgIHNpbmdsZTogX19iYXNlc19fIChjbGFzcyBhdHRyaWJ1dGUpCiAgICAgICBzaW5nbGU6IF9fZG9jX18gKGNsYXNzIGF0dHJpYnV0ZSkKKyAgICAgIHNpbmdsZTogX19hbm5vdGF0aW9uc19fIChjbGFzcyBhdHRyaWJ1dGUpCiAKICAgIFNwZWNpYWwgYXR0cmlidXRlczogOmF0dHI6YH5kZWZpbml0aW9uLl9fbmFtZV9fYCBpcyB0aGUgY2xhc3MgbmFtZTsgOmF0dHI6YF9fbW9kdWxlX19gIGlzCiAgICB0aGUgbW9kdWxlIG5hbWUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkOyA6YXR0cjpgfm9iamVjdC5fX2RpY3RfX2AgaXMgdGhlCiAgICBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGNsYXNzJ3MgbmFtZXNwYWNlOyA6YXR0cjpgfmNsYXNzLl9fYmFzZXNfX2AgaXMgYQogICAgdHVwbGUgKHBvc3NpYmx5IGVtcHR5IG9yIGEgc2luZ2xldG9uKSBjb250YWluaW5nIHRoZSBiYXNlIGNsYXNzZXMsIGluIHRoZQogICAgb3JkZXIgb2YgdGhlaXIgb2NjdXJyZW5jZSBpbiB0aGUgYmFzZSBjbGFzcyBsaXN0OyA6YXR0cjpgX19kb2NfX2AgaXMgdGhlCi0gICBjbGFzcydzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciBOb25lIGlmIHVuZGVmaW5lZC4KKyAgIGNsYXNzJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIE5vbmUgaWYgdW5kZWZpbmVkOworICAgOmF0dHI6YF9fYW5ub3RhdGlvbnNfX2AgKG9wdGlvbmFsKSBpcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZworICAgOnRlcm06YHZhcmlhYmxlIGFubm90YXRpb25zIDx2YXJpYWJsZSBhbm5vdGF0aW9uPmAgY29sbGVjdGVkIGR1cmluZworICAgY2xhc3MgYm9keSBleGVjdXRpb24uCiAKIENsYXNzIGluc3RhbmNlcwogICAgLi4gaW5kZXg6OgpAQCAtMTA2Myw2ICsxMDcwLDEyIEBACiBvcGVyYXRpb24gcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gbm8gYXBwcm9wcmlhdGUgbWV0aG9kIGlzIGRlZmluZWQgKHR5cGljYWxseQogOmV4YzpgQXR0cmlidXRlRXJyb3JgIG9yIDpleGM6YFR5cGVFcnJvcmApLgogCitTZXR0aW5nIGEgc3BlY2lhbCBtZXRob2QgdG8gYGBOb25lYGAgaW5kaWNhdGVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcKK29wZXJhdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsIGlmIGEgY2xhc3Mgc2V0cworOm1ldGg6YF9faXRlcl9fYCB0byBgYE5vbmVgYCwgdGhlIGNsYXNzIGlzIG5vdCBpdGVyYWJsZSwgc28gY2FsbGluZworOmZ1bmM6YGl0ZXJgIG9uIGl0cyBpbnN0YW5jZXMgd2lsbCByYWlzZSBhIDpleGM6YFR5cGVFcnJvcmAgKHdpdGhvdXQKK2ZhbGxpbmcgYmFjayB0byA6bWV0aDpgX19nZXRpdGVtX19gKS4gWyNdXworCiBXaGVuIGltcGxlbWVudGluZyBhIGNsYXNzIHRoYXQgZW11bGF0ZXMgYW55IGJ1aWx0LWluIHR5cGUsIGl0IGlzIGltcG9ydGFudCB0aGF0CiB0aGUgZW11bGF0aW9uIG9ubHkgYmUgaW1wbGVtZW50ZWQgdG8gdGhlIGRlZ3JlZSB0aGF0IGl0IG1ha2VzIHNlbnNlIGZvciB0aGUKIG9iamVjdCBiZWluZyBtb2RlbGxlZC4gIEZvciBleGFtcGxlLCBzb21lIHNlcXVlbmNlcyBtYXkgd29yayB3ZWxsIHdpdGggcmV0cmlldmFsCkBAIC0xMjMzLDggKzEyNDYsOSBAQAogCiAuLiBtZXRob2Q6OiBvYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYykKIAotICAgQ2FsbGVkIGJ5IHRoZSA6ZnVuYzpgZm9ybWF0YCBidWlsdC1pbiBmdW5jdGlvbiAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlCi0gICA6bWV0aDpgc3RyLmZvcm1hdGAgbWV0aG9kIG9mIGNsYXNzIDpjbGFzczpgc3RyYCkgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiCisgICBDYWxsZWQgYnkgdGhlIDpmdW5jOmBmb3JtYXRgIGJ1aWx0LWluIGZ1bmN0aW9uLAorICAgYW5kIGJ5IGV4dGVuc2lvbiwgZXZhbHVhdGlvbiBvZiA6cmVmOmBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzCisgICA8Zi1zdHJpbmdzPmAgYW5kIHRoZSA6bWV0aDpgc3RyLmZvcm1hdGAgbWV0aG9kLCB0byBwcm9kdWNlIGEgImZvcm1hdHRlZCIKICAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuIFRoZSBgYGZvcm1hdF9zcGVjYGAgYXJndW1lbnQgaXMKICAgIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGRlc2lyZWQuCiAgICBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGBgZm9ybWF0X3NwZWNgYCBhcmd1bWVudCBpcyB1cCB0byB0aGUgdHlwZQpAQCAtMTQ5MSw2ICsxNTA1LDE0IEBACiAgICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUgb3duZXIgY2xhc3MuCiAKIAorLi4gbWV0aG9kOjogb2JqZWN0Ll9fc2V0X25hbWVfXyhzZWxmLCBvd25lciwgbmFtZSkKKworICAgQ2FsbGVkIGF0IHRoZSB0aW1lIHRoZSBvd25pbmcgY2xhc3MgKm93bmVyKiBpcyBjcmVhdGVkLiBUaGUKKyAgIGRlc2NyaXB0b3IgaGFzIGJlZW4gYXNzaWduZWQgdG8gKm5hbWUqLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiBUaGUgYXR0cmlidXRlIDphdHRyOmBfX29iamNsYXNzX19gIGlzIGludGVycHJldGVkIGJ5IHRoZSA6bW9kOmBpbnNwZWN0YCBtb2R1bGUKIGFzIHNwZWNpZnlpbmcgdGhlIGNsYXNzIHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBkZWZpbmVkIChzZXR0aW5nIHRoaXMKIGFwcHJvcHJpYXRlbHkgY2FuIGFzc2lzdCBpbiBydW50aW1lIGludHJvc3BlY3Rpb24gb2YgZHluYW1pYyBjbGFzcyBhdHRyaWJ1dGVzKS4KQEAgLTE2MjgsMTEgKzE2NTAsNTYgQEAKICogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSBzYW1lICpfX3Nsb3RzX18qLgogCiAKLS4uIF9tZXRhY2xhc3NlczoKKy4uIF9jbGFzcy1jdXN0b21pemF0aW9uOgogCiBDdXN0b21pemluZyBjbGFzcyBjcmVhdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorV2hlbmV2ZXIgYSBjbGFzcyBpbmhlcml0cyBmcm9tIGFub3RoZXIgY2xhc3MsICpfX2luaXRfc3ViY2xhc3NfXyogaXMKK2NhbGxlZCBvbiB0aGF0IGNsYXNzLiBUaGlzIHdheSwgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgY2xhc3NlcyB3aGljaAorY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBzdWJjbGFzc2VzLiBUaGlzIGlzIGNsb3NlbHkgcmVsYXRlZCB0byBjbGFzcworZGVjb3JhdG9ycywgYnV0IHdoZXJlIGNsYXNzIGRlY29yYXRvcnMgb25seSBhZmZlY3QgdGhlIHNwZWNpZmljIGNsYXNzIHRoZXkncmUKK2FwcGxpZWQgdG8sIGBgX19pbml0X3N1YmNsYXNzX19gYCBzb2xlbHkgYXBwbGllcyB0byBmdXR1cmUgc3ViY2xhc3NlcyBvZiB0aGUKK2NsYXNzIGRlZmluaW5nIHRoZSBtZXRob2QuCisKKy4uIGNsYXNzbWV0aG9kOjogb2JqZWN0Ll9faW5pdF9zdWJjbGFzc19fKGNscykKKworICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb250YWluaW5nIGNsYXNzIGlzIHN1YmNsYXNzZWQuCisgICAqY2xzKiBpcyB0aGVuIHRoZSBuZXcgc3ViY2xhc3MuIElmIGRlZmluZWQgYXMgYSBub3JtYWwgaW5zdGFuY2UgbWV0aG9kLAorICAgdGhpcyBtZXRob2QgaXMgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYSBjbGFzcyBtZXRob2QuCisKKyAgIEtleXdvcmQgYXJndW1lbnRzIHdoaWNoIGFyZSBnaXZlbiB0byBhIG5ldyBjbGFzcyBhcmUgcGFzc2VkIHRvCisgICB0aGUgcGFyZW50J3MgY2xhc3MgYGBfX2luaXRfc3ViY2xhc3NfX2BgLiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoCisgICBvdGhlciBjbGFzc2VzIHVzaW5nIGBgX19pbml0X3N1YmNsYXNzX19gYCwgb25lIHNob3VsZCB0YWtlIG91dCB0aGUKKyAgIG5lZWRlZCBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgcGFzcyB0aGUgb3RoZXJzIG92ZXIgdG8gdGhlIGJhc2UKKyAgIGNsYXNzLCBhcyBpbjo6CisKKyAgICAgICBjbGFzcyBQaGlsb3NvcGhlcjoKKyAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscywgZGVmYXVsdF9uYW1lLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICBzdXBlcigpLl9faW5pdF9zdWJjbGFzc19fKCoqa3dhcmdzKQorICAgICAgICAgICAgICAgY2xzLmRlZmF1bHRfbmFtZSA9IGRlZmF1bHRfbmFtZQorCisgICAgICAgY2xhc3MgQXVzdHJhbGlhblBoaWxvc29waGVyKFBoaWxvc29waGVyLCBkZWZhdWx0X25hbWU9IkJydWNlIik6CisgICAgICAgICAgIHBhc3MKKworICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYGBvYmplY3QuX19pbml0X3N1YmNsYXNzX19gYCBkb2VzCisgICBub3RoaW5nLCBidXQgcmFpc2VzIGFuIGVycm9yIGlmIGl0IGlzIGNhbGxlZCB3aXRoIGFueSBhcmd1bWVudHMuCisKKyAgIC4uIG5vdGU6OgorCisgICAgICBUaGUgbWV0YWNsYXNzIGhpbnQgYGBtZXRhY2xhc3NgYCBpcyBjb25zdW1lZCBieSB0aGUgcmVzdCBvZiB0aGUgdHlwZQorICAgICAgbWFjaGluZXJ5LCBhbmQgaXMgbmV2ZXIgcGFzc2VkIHRvIGBgX19pbml0X3N1YmNsYXNzX19gYCBpbXBsZW1lbnRhdGlvbnMuCisgICAgICBUaGUgYWN0dWFsIG1ldGFjbGFzcyAocmF0aGVyIHRoYW4gdGhlIGV4cGxpY2l0IGhpbnQpIGNhbiBiZSBhY2Nlc3NlZCBhcworICAgICAgYGB0eXBlKGNscylgYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworLi4gX21ldGFjbGFzc2VzOgorCitNZXRhY2xhc3NlcworXl5eXl5eXl5eXl4KKwogQnkgZGVmYXVsdCwgY2xhc3NlcyBhcmUgY29uc3RydWN0ZWQgdXNpbmcgOmZ1bmM6YHR5cGVgLiBUaGUgY2xhc3MgYm9keSBpcwogZXhlY3V0ZWQgaW4gYSBuZXcgbmFtZXNwYWNlIGFuZCB0aGUgY2xhc3MgbmFtZSBpcyBib3VuZCBsb2NhbGx5IHRvIHRoZQogcmVzdWx0IG9mIGBgdHlwZShuYW1lLCBiYXNlcywgbmFtZXNwYWNlKWBgLgpAQCAtMTY5MCw3ICsxNzU3LDcgQEAKIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMsIGlmIGFueSwgY29tZSBmcm9tIHRoZSBjbGFzcyBkZWZpbml0aW9uKS4KIAogSWYgdGhlIG1ldGFjbGFzcyBoYXMgbm8gYGBfX3ByZXBhcmVfX2BgIGF0dHJpYnV0ZSwgdGhlbiB0aGUgY2xhc3MgbmFtZXNwYWNlCi1pcyBpbml0aWFsaXNlZCBhcyBhbiBlbXB0eSA6ZnVuYzpgZGljdGAgaW5zdGFuY2UuCitpcyBpbml0aWFsaXNlZCBhcyBhbiBlbXB0eSBvcmRlcmVkIG1hcHBpbmcuCiAKIC4uIHNlZWFsc286OgogCkBAIC0xNzM0LDkgKzE4MDEsOSBAQAogaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBhcyB0aGUgZGVmaW5lZCBjbGFzcy4KIAogV2hlbiBhIG5ldyBjbGFzcyBpcyBjcmVhdGVkIGJ5IGBgdHlwZS5fX25ld19fYGAsIHRoZSBvYmplY3QgcHJvdmlkZWQgYXMgdGhlCi1uYW1lc3BhY2UgcGFyYW1ldGVyIGlzIGNvcGllZCB0byBhIHN0YW5kYXJkIFB5dGhvbiBkaWN0aW9uYXJ5IGFuZCB0aGUgb3JpZ2luYWwKLW9iamVjdCBpcyBkaXNjYXJkZWQuIFRoZSBuZXcgY29weSBiZWNvbWVzIHRoZSA6YXR0cjpgfm9iamVjdC5fX2RpY3RfX2AgYXR0cmlidXRlCi1vZiB0aGUgY2xhc3Mgb2JqZWN0LgorbmFtZXNwYWNlIHBhcmFtZXRlciBpcyBjb3BpZWQgdG8gYSBuZXcgb3JkZXJlZCBtYXBwaW5nIGFuZCB0aGUgb3JpZ2luYWwKK29iamVjdCBpcyBkaXNjYXJkZWQuIFRoZSBuZXcgY29weSBpcyB3cmFwcGVkIGluIGEgcmVhZC1vbmx5IHByb3h5LCB3aGljaAorYmVjb21lcyB0aGUgOmF0dHI6YH5vYmplY3QuX19kaWN0X19gIGF0dHJpYnV0ZSBvZiB0aGUgY2xhc3Mgb2JqZWN0LgogCiAuLiBzZWVhbHNvOjoKIApAQCAtMjA1OSw3ICsyMTI2LDcgQEAKICAgIChgYCtgYCwgYGAtYGAsIGBgKmBgLCBgYEBgYCwgYGAvYGAsIGBgLy9gYCwgYGAlYGAsIDpmdW5jOmBkaXZtb2RgLAogICAgOmZ1bmM6YHBvd2AsIGBgKipgYCwgYGA8PGBgLCBgYD4+YGAsIGBgJmBgLCBgYF5gYCwgYGB8YGApIHdpdGggcmVmbGVjdGVkCiAgICAoc3dhcHBlZCkgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBsZWZ0IG9wZXJhbmQgZG9lcwotICAgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZCB0aGUgb3BlcmFuZHMgYXJlIG9mIGRpZmZlcmVudAorICAgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIFsjXV8gYW5kIHRoZSBvcGVyYW5kcyBhcmUgb2YgZGlmZmVyZW50CiAgICB0eXBlcy4gWyNdXyBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGBgeCAtIHlgYCwgd2hlcmUgKnkqIGlzCiAgICBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuIDptZXRoOmBfX3JzdWJfX2AgbWV0aG9kLCBgYHkuX19yc3ViX18oeClgYAogICAgaXMgY2FsbGVkIGlmIGBgeC5fX3N1Yl9fKHkpYGAgcmV0dXJucyAqTm90SW1wbGVtZW50ZWQqLgpAQCAtMjQ3NSw2ICsyNTQyLDE3IEBACiAgICBjb250cm9sbGVkIGNvbmRpdGlvbnMuIEl0IGdlbmVyYWxseSBpc24ndCBhIGdvb2QgaWRlYSB0aG91Z2gsIHNpbmNlIGl0IGNhbgogICAgbGVhZCB0byBzb21lIHZlcnkgc3RyYW5nZSBiZWhhdmlvdXIgaWYgaXQgaXMgaGFuZGxlZCBpbmNvcnJlY3RseS4KIAorLi4gWyNdIFRoZSA6bWV0aDpgX19oYXNoX19gLCA6bWV0aDpgX19pdGVyX19gLCA6bWV0aDpgX19yZXZlcnNlZF9fYCwgYW5kCisgICA6bWV0aDpgX19jb250YWluc19fYCBtZXRob2RzIGhhdmUgc3BlY2lhbCBoYW5kbGluZyBmb3IgdGhpczsgb3RoZXJzCisgICB3aWxsIHN0aWxsIHJhaXNlIGEgOmV4YzpgVHlwZUVycm9yYCwgYnV0IG1heSBkbyBzbyBieSByZWx5aW5nIG9uCisgICB0aGUgYmVoYXZpb3IgdGhhdCBgYE5vbmVgYCBpcyBub3QgY2FsbGFibGUuCisKKy4uIFsjXSAiRG9lcyBub3Qgc3VwcG9ydCIgaGVyZSBtZWFucyB0aGF0IHRoZSBjbGFzcyBoYXMgbm8gc3VjaCBtZXRob2QsIG9yCisgICB0aGUgbWV0aG9kIHJldHVybnMgYGBOb3RJbXBsZW1lbnRlZGBgLiAgRG8gbm90IHNldCB0aGUgbWV0aG9kIHRvCisgICBgYE5vbmVgYCBpZiB5b3Ugd2FudCB0byBmb3JjZSBmYWxsYmFjayB0byB0aGUgcmlnaHQgb3BlcmFuZCdzIHJlZmxlY3RlZAorICAgbWV0aG9kLS10aGF0IHdpbGwgaW5zdGVhZCBoYXZlIHRoZSBvcHBvc2l0ZSBlZmZlY3Qgb2YgZXhwbGljaXRseQorICAgKmJsb2NraW5nKiBzdWNoIGZhbGxiYWNrLgorCiAuLiBbI10gRm9yIG9wZXJhbmRzIG9mIHRoZSBzYW1lIHR5cGUsIGl0IGlzIGFzc3VtZWQgdGhhdCBpZiB0aGUgbm9uLXJlZmxlY3RlZCBtZXRob2QKICAgIChzdWNoIGFzIDptZXRoOmBfX2FkZF9fYCkgZmFpbHMgdGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCB3aGljaCBpcyB3aHkgdGhlCiAgICByZWZsZWN0ZWQgbWV0aG9kIGlzIG5vdCBjYWxsZWQuCmRpZmYgLS1naXQgYS9Eb2MvcmVmZXJlbmNlL2ltcG9ydC5yc3QgYi9Eb2MvcmVmZXJlbmNlL2ltcG9ydC5yc3QKaW5kZXggNjQzMDJiOC4uNWUyYzFjOCAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9pbXBvcnQucnN0CisrKyBiL0RvYy9yZWZlcmVuY2UvaW1wb3J0LnJzdApAQCAtMzYsNyArMzYsNyBAQAogCiBXaGVuIGEgbW9kdWxlIGlzIGZpcnN0IGltcG9ydGVkLCBQeXRob24gc2VhcmNoZXMgZm9yIHRoZSBtb2R1bGUgYW5kIGlmIGZvdW5kLAogaXQgY3JlYXRlcyBhIG1vZHVsZSBvYmplY3QgWyNmbm1vXV8sIGluaXRpYWxpemluZyBpdC4gIElmIHRoZSBuYW1lZCBtb2R1bGUKLWNhbm5vdCBiZSBmb3VuZCwgYW4gOmV4YzpgSW1wb3J0RXJyb3JgIGlzIHJhaXNlZC4gIFB5dGhvbiBpbXBsZW1lbnRzIHZhcmlvdXMKK2Nhbm5vdCBiZSBmb3VuZCwgYW4gOmV4YzpgTW9kdWxlTm90Rm91bmRFcnJvcmAgaXMgcmFpc2VkLiAgUHl0aG9uIGltcGxlbWVudHMgdmFyaW91cwogc3RyYXRlZ2llcyB0byBzZWFyY2ggZm9yIHRoZSBuYW1lZCBtb2R1bGUgd2hlbiB0aGUgaW1wb3J0IG1hY2hpbmVyeSBpcwogaW52b2tlZC4gIFRoZXNlIHN0cmF0ZWdpZXMgY2FuIGJlIG1vZGlmaWVkIGFuZCBleHRlbmRlZCBieSB1c2luZyB2YXJpb3VzIGhvb2tzCiBkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb25zIGJlbG93LgpAQCAtMTY3LDcgKzE2Nyw3IEBACiBUaGlzIG5hbWUgd2lsbCBiZSB1c2VkIGluIHZhcmlvdXMgcGhhc2VzIG9mIHRoZSBpbXBvcnQgc2VhcmNoLCBhbmQgaXQgbWF5IGJlCiB0aGUgZG90dGVkIHBhdGggdG8gYSBzdWJtb2R1bGUsIGUuZy4gYGBmb28uYmFyLmJhemBgLiAgSW4gdGhpcyBjYXNlLCBQeXRob24KIGZpcnN0IHRyaWVzIHRvIGltcG9ydCBgYGZvb2BgLCB0aGVuIGBgZm9vLmJhcmBgLCBhbmQgZmluYWxseSBgYGZvby5iYXIuYmF6YGAuCi1JZiBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSBpbXBvcnRzIGZhaWwsIGFuIDpleGM6YEltcG9ydEVycm9yYCBpcyByYWlzZWQuCitJZiBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSBpbXBvcnRzIGZhaWwsIGFuIDpleGM6YE1vZHVsZU5vdEZvdW5kRXJyb3JgIGlzIHJhaXNlZC4KIAogCiBUaGUgbW9kdWxlIGNhY2hlCkBAIC0xODYsNyArMTg2LDcgQEAKIER1cmluZyBpbXBvcnQsIHRoZSBtb2R1bGUgbmFtZSBpcyBsb29rZWQgdXAgaW4gOmRhdGE6YHN5cy5tb2R1bGVzYCBhbmQgaWYKIHByZXNlbnQsIHRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRoZSBtb2R1bGUgc2F0aXNmeWluZyB0aGUgaW1wb3J0LCBhbmQgdGhlCiBwcm9jZXNzIGNvbXBsZXRlcy4gIEhvd2V2ZXIsIGlmIHRoZSB2YWx1ZSBpcyBgYE5vbmVgYCwgdGhlbiBhbgotOmV4YzpgSW1wb3J0RXJyb3JgIGlzIHJhaXNlZC4gIElmIHRoZSBtb2R1bGUgbmFtZSBpcyBtaXNzaW5nLCBQeXRob24gd2lsbAorOmV4YzpgTW9kdWxlTm90Rm91bmRFcnJvcmAgaXMgcmFpc2VkLiAgSWYgdGhlIG1vZHVsZSBuYW1lIGlzIG1pc3NpbmcsIFB5dGhvbiB3aWxsCiBjb250aW51ZSBzZWFyY2hpbmcgZm9yIHRoZSBtb2R1bGUuCiAKIDpkYXRhOmBzeXMubW9kdWxlc2AgaXMgd3JpdGFibGUuICBEZWxldGluZyBhIGtleSBtYXkgbm90IGRlc3Ryb3kgdGhlCkBAIC0xOTQsNyArMTk0LDcgQEAKIGJ1dCBpdCB3aWxsIGludmFsaWRhdGUgdGhlIGNhY2hlIGVudHJ5IGZvciB0aGUgbmFtZWQgbW9kdWxlLCBjYXVzaW5nCiBQeXRob24gdG8gc2VhcmNoIGFuZXcgZm9yIHRoZSBuYW1lZCBtb2R1bGUgdXBvbiBpdHMgbmV4dAogaW1wb3J0LiBUaGUga2V5IGNhbiBhbHNvIGJlIGFzc2lnbmVkIHRvIGBgTm9uZWBgLCBmb3JjaW5nIHRoZSBuZXh0IGltcG9ydAotb2YgdGhlIG1vZHVsZSB0byByZXN1bHQgaW4gYW4gOmV4YzpgSW1wb3J0RXJyb3JgLgorb2YgdGhlIG1vZHVsZSB0byByZXN1bHQgaW4gYW4gOmV4YzpgTW9kdWxlTm90Rm91bmRFcnJvcmAuCiAKIEJld2FyZSB0aG91Z2gsIGFzIGlmIHlvdSBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBtb2R1bGUgb2JqZWN0LAogaW52YWxpZGF0ZSBpdHMgY2FjaGUgZW50cnkgaW4gOmRhdGE6YHN5cy5tb2R1bGVzYCwgYW5kIHRoZW4gcmUtaW1wb3J0IHRoZQpAQCAtMjg4LDggKzI4OCw4IEBACiBJZiB0aGUgbWV0YSBwYXRoIGZpbmRlciBrbm93cyBob3cgdG8gaGFuZGxlIHRoZSBuYW1lZCBtb2R1bGUsIGl0IHJldHVybnMgYQogc3BlYyBvYmplY3QuICBJZiBpdCBjYW5ub3QgaGFuZGxlIHRoZSBuYW1lZCBtb2R1bGUsIGl0IHJldHVybnMgYGBOb25lYGAuICBJZgogOmRhdGE6YHN5cy5tZXRhX3BhdGhgIHByb2Nlc3NpbmcgcmVhY2hlcyB0aGUgZW5kIG9mIGl0cyBsaXN0IHdpdGhvdXQgcmV0dXJuaW5nCi1hIHNwZWMsIHRoZW4gYW4gOmV4YzpgSW1wb3J0RXJyb3JgIGlzIHJhaXNlZC4gIEFueSBvdGhlciBleGNlcHRpb25zIHJhaXNlZAotYXJlIHNpbXBseSBwcm9wYWdhdGVkIHVwLCBhYm9ydGluZyB0aGUgaW1wb3J0IHByb2Nlc3MuCithIHNwZWMsIHRoZW4gYSA6ZXhjOmBNb2R1bGVOb3RGb3VuZEVycm9yYCBpcyByYWlzZWQuICBBbnkgb3RoZXIgZXhjZXB0aW9ucworcmFpc2VkIGFyZSBzaW1wbHkgcHJvcGFnYXRlZCB1cCwgYWJvcnRpbmcgdGhlIGltcG9ydCBwcm9jZXNzLgogCiBUaGUgOm1ldGg6YH5pbXBvcnRsaWIuYWJjLk1ldGFQYXRoRmluZGVyLmZpbmRfc3BlYygpYCBtZXRob2Qgb2YgbWV0YSBwYXRoCiBmaW5kZXJzIGlzIGNhbGxlZCB3aXRoIHR3byBvciB0aHJlZSBhcmd1bWVudHMuICBUaGUgZmlyc3QgaXMgdGhlIGZ1bGx5CkBAIC0yOTgsOSArMjk4LDkgQEAKIHRvcC1sZXZlbCBtb2R1bGVzLCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGBgTm9uZWBgLCBidXQgZm9yIHN1Ym1vZHVsZXMgb3IKIHN1YnBhY2thZ2VzLCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IHBhY2thZ2UncwogYGBfX3BhdGhfX2BgIGF0dHJpYnV0ZS4gSWYgdGhlIGFwcHJvcHJpYXRlIGBgX19wYXRoX19gYCBhdHRyaWJ1dGUgY2Fubm90Ci1iZSBhY2Nlc3NlZCwgYW4gOmV4YzpgSW1wb3J0RXJyb3JgIGlzIHJhaXNlZC4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyBhbgotZXhpc3RpbmcgbW9kdWxlIG9iamVjdCB0aGF0IHdpbGwgYmUgdGhlIHRhcmdldCBvZiBsb2FkaW5nIGxhdGVyLiAgVGhlCi1pbXBvcnQgc3lzdGVtIHBhc3NlcyBpbiBhIHRhcmdldCBtb2R1bGUgb25seSBkdXJpbmcgcmVsb2FkLgorYmUgYWNjZXNzZWQsIGFuIDpleGM6YE1vZHVsZU5vdEZvdW5kRXJyb3JgIGlzIHJhaXNlZC4gIFRoZSB0aGlyZCBhcmd1bWVudAoraXMgYW4gZXhpc3RpbmcgbW9kdWxlIG9iamVjdCB0aGF0IHdpbGwgYmUgdGhlIHRhcmdldCBvZiBsb2FkaW5nIGxhdGVyLgorVGhlIGltcG9ydCBzeXN0ZW0gcGFzc2VzIGluIGEgdGFyZ2V0IG1vZHVsZSBvbmx5IGR1cmluZyByZWxvYWQuCiAKIFRoZSBtZXRhIHBhdGggbWF5IGJlIHRyYXZlcnNlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBzaW5nbGUgaW1wb3J0IHJlcXVlc3QuCiBGb3IgZXhhbXBsZSwgYXNzdW1pbmcgbm9uZSBvZiB0aGUgbW9kdWxlcyBpbnZvbHZlZCBoYXMgYWxyZWFkeSBiZWVuIGNhY2hlZCwKQEAgLTU1NCwxOSArNTU0LDMwIEBACiAgICBkZXRhaWxzLgogCiAgICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQgb2YgYGBfX25hbWVfX2BgIHRvIGNhbGN1bGF0ZSBleHBsaWNpdAotICAgcmVsYXRpdmUgaW1wb3J0cyBmb3IgbWFpbiBtb2R1bGVzLCBhcyBkZWZpbmVkIGluIDpwZXA6YDM2NmAuCisgICByZWxhdGl2ZSBpbXBvcnRzIGZvciBtYWluIG1vZHVsZXMsIGFzIGRlZmluZWQgaW4gOnBlcDpgMzY2YC4gSXQgaXMKKyAgIGV4cGVjdGVkIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYGBfX3NwZWNfXy5wYXJlbnRgYC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoZSB2YWx1ZSBvZiBgYF9fcGFja2FnZV9fYGAgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlIHNhbWUgYXMKKyAgICAgIGBgX19zcGVjX18ucGFyZW50YGAuCiAKIC4uIGF0dHJpYnV0ZTo6IF9fc3BlY19fCiAKICAgIFRoZSBgYF9fc3BlY19fYGAgYXR0cmlidXRlIG11c3QgYmUgc2V0IHRvIHRoZSBtb2R1bGUgc3BlYyB0aGF0IHdhcwotICAgdXNlZCB3aGVuIGltcG9ydGluZyB0aGUgbW9kdWxlLiAgVGhpcyBpcyB1c2VkIHByaW1hcmlseSBmb3IKLSAgIGludHJvc3BlY3Rpb24gYW5kIGR1cmluZyByZWxvYWRpbmcuICBTZXR0aW5nIGBgX19zcGVjX19gYAorICAgdXNlZCB3aGVuIGltcG9ydGluZyB0aGUgbW9kdWxlLiBTZXR0aW5nIGBgX19zcGVjX19gYAogICAgYXBwcm9wcmlhdGVseSBhcHBsaWVzIGVxdWFsbHkgdG8gOnJlZjpgbW9kdWxlcyBpbml0aWFsaXplZCBkdXJpbmcKICAgIGludGVycHJldGVyIHN0YXJ0dXAgPHByb2dyYW1zPmAuICBUaGUgb25lIGV4Y2VwdGlvbiBpcyBgYF9fbWFpbl9fYGAsCiAgICB3aGVyZSBgYF9fc3BlY19fYGAgaXMgOnJlZjpgc2V0IHRvIE5vbmUgaW4gc29tZSBjYXNlcyA8bWFpbl9zcGVjPmAuCiAKKyAgIFdoZW4gYGBfX3BhY2thZ2VfX2BgIGlzIG5vdCBkZWZpbmVkLCBgYF9fc3BlY19fLnBhcmVudGBgIGlzIHVzZWQgYXMKKyAgIGEgZmFsbGJhY2suCisKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgYGBfX3NwZWNfXy5wYXJlbnRgYCBpcyB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBgYF9fcGFja2FnZV9fYGAgaXMKKyAgICAgIG5vdCBkZWZpbmVkLgorCiAuLiBhdHRyaWJ1dGU6OiBfX3BhdGhfXwogCiAgICBJZiB0aGUgbW9kdWxlIGlzIGEgcGFja2FnZSAoZWl0aGVyIHJlZ3VsYXIgb3IgbmFtZXNwYWNlKSwgdGhlIG1vZHVsZQpAQCAtODc2LDcgKzg4Nyw3IEBACiAKIFRvIHNlbGVjdGl2ZWx5IHByZXZlbnQgaW1wb3J0IG9mIHNvbWUgbW9kdWxlcyBmcm9tIGEgaG9vayBlYXJseSBvbiB0aGUKIG1ldGEgcGF0aCAocmF0aGVyIHRoYW4gZGlzYWJsaW5nIHRoZSBzdGFuZGFyZCBpbXBvcnQgc3lzdGVtIGVudGlyZWx5KSwKLWl0IGlzIHN1ZmZpY2llbnQgdG8gcmFpc2UgOmV4YzpgSW1wb3J0RXJyb3JgIGRpcmVjdGx5IGZyb20KK2l0IGlzIHN1ZmZpY2llbnQgdG8gcmFpc2UgOmV4YzpgTW9kdWxlTm9Gb3VuZEVycm9yYCBkaXJlY3RseSBmcm9tCiA6bWV0aDpgfmltcG9ydGxpYi5hYmMuTWV0YVBhdGhGaW5kZXIuZmluZF9zcGVjYCBpbnN0ZWFkIG9mIHJldHVybmluZwogYGBOb25lYGAuIFRoZSBsYXR0ZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG1ldGEgcGF0aCBzZWFyY2ggc2hvdWxkIGNvbnRpbnVlLAogd2hpbGUgcmFpc2luZyBhbiBleGNlcHRpb24gdGVybWluYXRlcyBpdCBpbW1lZGlhdGVseS4KZGlmZiAtLWdpdCBhL0RvYy9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5yc3QgYi9Eb2MvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMucnN0CmluZGV4IDM3ZjI1ZjEuLjQ4ZjIwNDMgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5yc3QKKysrIGIvRG9jL3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLnJzdApAQCAtNDA1LDcgKzQwNSw4IEBACiAKIC4uIHByb2R1Y3Rpb25saXN0OjoKICAgIHN0cmluZ2xpdGVyYWw6IFtgc3RyaW5ncHJlZml4YF0oYHNob3J0c3RyaW5nYCB8IGBsb25nc3RyaW5nYCkKLSAgIHN0cmluZ3ByZWZpeDogInIiIHwgInUiIHwgIlIiIHwgIlUiCisgICBzdHJpbmdwcmVmaXg6ICJyIiB8ICJ1IiB8ICJSIiB8ICJVIiB8ICJmIiB8ICJGIgorICAgICAgICAgICAgICAgOiB8ICJmciIgfCAiRnIiIHwgImZSIiB8ICJGUiIgfCAicmYiIHwgInJGIiB8ICJSZiIgfCAiUkYiCiAgICBzaG9ydHN0cmluZzogIiciIGBzaG9ydHN0cmluZ2l0ZW1gKiAiJyIgfCAnIicgYHNob3J0c3RyaW5naXRlbWAqICciJwogICAgbG9uZ3N0cmluZzogIicnJyIgYGxvbmdzdHJpbmdpdGVtYCogIicnJyIgfCAnIiIiJyBgbG9uZ3N0cmluZ2l0ZW1gKiAnIiIiJwogICAgc2hvcnRzdHJpbmdpdGVtOiBgc2hvcnRzdHJpbmdjaGFyYCB8IGBzdHJpbmdlc2NhcGVzZXFgCkBAIC00NjQsNiArNDY1LDExIEBACiAgICB0byBzaW1wbGlmeSB0aGUgbWFpbnRlbmFuY2Ugb2YgZHVhbCBQeXRob24gMi54IGFuZCAzLnggY29kZWJhc2VzLgogICAgU2VlIDpwZXA6YDQxNGAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKK0Egc3RyaW5nIGxpdGVyYWwgd2l0aCBgYCdmJ2BgIG9yIGBgJ0YnYGAgaW4gaXRzIHByZWZpeCBpcyBhCis6ZGZuOmBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxgOyBzZWUgOnJlZjpgZi1zdHJpbmdzYC4gIFRoZSBgYCdmJ2BgIG1heSBiZQorY29tYmluZWQgd2l0aCBgYCdyJ2BgLCBidXQgbm90IHdpdGggYGAnYidgYCBvciBgYCd1J2BgLCB0aGVyZWZvcmUgcmF3Citmb3JtYXR0ZWQgc3RyaW5ncyBhcmUgcG9zc2libGUsIGJ1dCBmb3JtYXR0ZWQgYnl0ZXMgbGl0ZXJhbHMgYXJlIG5vdC4KKwogSW4gdHJpcGxlLXF1b3RlZCBsaXRlcmFscywgdW5lc2NhcGVkIG5ld2xpbmVzIGFuZCBxdW90ZXMgYXJlIGFsbG93ZWQgKGFuZCBhcmUKIHJldGFpbmVkKSwgZXhjZXB0IHRoYXQgdGhyZWUgdW5lc2NhcGVkIHF1b3RlcyBpbiBhIHJvdyB0ZXJtaW5hdGUgdGhlIGxpdGVyYWwuICAoQQogInF1b3RlIiBpcyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gb3BlbiB0aGUgbGl0ZXJhbCwgaS5lLiBlaXRoZXIgYGAnYGAgb3IgYGAiYGAuKQpAQCAtNTU0LDYgKzU2MCwxMCBAQAogZXNjYXBlIHNlcXVlbmNlcyBvbmx5IHJlY29nbml6ZWQgaW4gc3RyaW5nIGxpdGVyYWxzIGZhbGwgaW50byB0aGUgY2F0ZWdvcnkgb2YKIHVucmVjb2duaXplZCBlc2NhcGVzIGZvciBieXRlcyBsaXRlcmFscy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIHByb2R1Y2UgYSBEZXByZWNhdGlvbldhcm5pbmcuICBJbgorICAgICAgc29tZSBmdXR1cmUgdmVyc2lvbiBvZiBQeXRob24gdGhleSB3aWxsIGJlIGEgU3ludGF4RXJyb3IuCisKIEV2ZW4gaW4gYSByYXcgbGl0ZXJhbCwgcXVvdGVzIGNhbiBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2gsIGJ1dCB0aGUKIGJhY2tzbGFzaCByZW1haW5zIGluIHRoZSByZXN1bHQ7IGZvciBleGFtcGxlLCBgYHIiXCIiYGAgaXMgYSB2YWxpZCBzdHJpbmcKIGxpdGVyYWwgY29uc2lzdGluZyBvZiB0d28gY2hhcmFjdGVyczogYSBiYWNrc2xhc2ggYW5kIGEgZG91YmxlIHF1b3RlOyBgYHIiXCJgYApAQCAtNTgzLDcgKzU5MywxMDYgQEAKIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgZGVmaW5lZCBhdCB0aGUgc3ludGFjdGljYWwgbGV2ZWwsIGJ1dCBpbXBsZW1lbnRlZCBhdAogY29tcGlsZSB0aW1lLiAgVGhlICcrJyBvcGVyYXRvciBtdXN0IGJlIHVzZWQgdG8gY29uY2F0ZW5hdGUgc3RyaW5nIGV4cHJlc3Npb25zCiBhdCBydW4gdGltZS4gIEFsc28gbm90ZSB0aGF0IGxpdGVyYWwgY29uY2F0ZW5hdGlvbiBjYW4gdXNlIGRpZmZlcmVudCBxdW90aW5nCi1zdHlsZXMgZm9yIGVhY2ggY29tcG9uZW50IChldmVuIG1peGluZyByYXcgc3RyaW5ncyBhbmQgdHJpcGxlIHF1b3RlZCBzdHJpbmdzKS4KK3N0eWxlcyBmb3IgZWFjaCBjb21wb25lbnQgKGV2ZW4gbWl4aW5nIHJhdyBzdHJpbmdzIGFuZCB0cmlwbGUgcXVvdGVkIHN0cmluZ3MpLAorYW5kIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgbWF5IGJlIGNvbmNhdGVuYXRlZCB3aXRoIHBsYWluIHN0cmluZyBsaXRlcmFscy4KKworCisuLiBpbmRleDo6CisgICBzaW5nbGU6IGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbAorICAgc2luZ2xlOiBpbnRlcnBvbGF0ZWQgc3RyaW5nIGxpdGVyYWwKKyAgIHNpbmdsZTogc3RyaW5nOyBmb3JtYXR0ZWQgbGl0ZXJhbAorICAgc2luZ2xlOiBzdHJpbmc7IGludGVycG9sYXRlZCBsaXRlcmFsCisgICBzaW5nbGU6IGYtc3RyaW5nCisuLiBfZi1zdHJpbmdzOgorCitGb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIHZlcnNpb25hZGRlZDo6IDMuNgorCitBIDpkZm46YGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbGAgb3IgOmRmbjpgZi1zdHJpbmdgIGlzIGEgc3RyaW5nIGxpdGVyYWwKK3RoYXQgaXMgcHJlZml4ZWQgd2l0aCBgYCdmJ2BgIG9yIGBgJ0YnYGAuICBUaGVzZSBzdHJpbmdzIG1heSBjb250YWluCityZXBsYWNlbWVudCBmaWVsZHMsIHdoaWNoIGFyZSBleHByZXNzaW9ucyBkZWxpbWl0ZWQgYnkgY3VybHkgYnJhY2VzIGBge31gYC4KK1doaWxlIG90aGVyIHN0cmluZyBsaXRlcmFscyBhbHdheXMgaGF2ZSBhIGNvbnN0YW50IHZhbHVlLCBmb3JtYXR0ZWQgc3RyaW5ncworYXJlIHJlYWxseSBleHByZXNzaW9ucyBldmFsdWF0ZWQgYXQgcnVuIHRpbWUuCisKK0VzY2FwZSBzZXF1ZW5jZXMgYXJlIGRlY29kZWQgbGlrZSBpbiBvcmRpbmFyeSBzdHJpbmcgbGl0ZXJhbHMgKGV4Y2VwdCB3aGVuCithIGxpdGVyYWwgaXMgYWxzbyBtYXJrZWQgYXMgYSByYXcgc3RyaW5nKS4gIEFmdGVyIGRlY29kaW5nLCB0aGUgZ3JhbW1hcgorZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGlzOgorCisuLiBwcm9kdWN0aW9ubGlzdDo6CisgICBmX3N0cmluZzogKGBsaXRlcmFsX2NoYXJgIHwgInt7IiB8ICJ9fSIgfCBgcmVwbGFjZW1lbnRfZmllbGRgKSoKKyAgIHJlcGxhY2VtZW50X2ZpZWxkOiAieyIgYGZfZXhwcmVzc2lvbmAgWyIhIiBgY29udmVyc2lvbmBdIFsiOiIgYGZvcm1hdF9zcGVjYF0gIn0iCisgICBmX2V4cHJlc3Npb246IChgY29uZGl0aW9uYWxfZXhwcmVzc2lvbmAgfCAiKiIgYG9yX2V4cHJgKQorICAgICAgICAgICAgICAgOiAgICgiLCIgYGNvbmRpdGlvbmFsX2V4cHJlc3Npb25gIHwgIiwiICIqIiBgb3JfZXhwcmApKiBbIiwiXQorICAgICAgICAgICAgICAgOiB8IGB5aWVsZF9leHByZXNzaW9uYAorICAgY29udmVyc2lvbjogInMiIHwgInIiIHwgImEiCisgICBmb3JtYXRfc3BlYzogKGBsaXRlcmFsX2NoYXJgIHwgTlVMTCB8IGByZXBsYWNlbWVudF9maWVsZGApKgorICAgbGl0ZXJhbF9jaGFyOiA8YW55IGNvZGUgcG9pbnQgZXhjZXB0ICJ7IiwgIn0iIG9yIE5VTEw+CisKK1RoZSBwYXJ0cyBvZiB0aGUgc3RyaW5nIG91dHNpZGUgY3VybHkgYnJhY2VzIGFyZSB0cmVhdGVkIGxpdGVyYWxseSwKK2V4Y2VwdCB0aGF0IGFueSBkb3VibGVkIGN1cmx5IGJyYWNlcyBgYCd7eydgYCBvciBgYCd9fSdgYCBhcmUgcmVwbGFjZWQKK3dpdGggdGhlIGNvcnJlc3BvbmRpbmcgc2luZ2xlIGN1cmx5IGJyYWNlLiAgQSBzaW5nbGUgb3BlbmluZyBjdXJseQorYnJhY2tldCBgYCd7J2BgIG1hcmtzIGEgcmVwbGFjZW1lbnQgZmllbGQsIHdoaWNoIHN0YXJ0cyB3aXRoIGEKK1B5dGhvbiBleHByZXNzaW9uLiAgQWZ0ZXIgdGhlIGV4cHJlc3Npb24sIHRoZXJlIG1heSBiZSBhIGNvbnZlcnNpb24gZmllbGQsCitpbnRyb2R1Y2VkIGJ5IGFuIGV4Y2xhbWF0aW9uIHBvaW50IGBgJyEnYGAuICBBIGZvcm1hdCBzcGVjaWZpZXIgbWF5IGFsc28KK2JlIGFwcGVuZGVkLCBpbnRyb2R1Y2VkIGJ5IGEgY29sb24gYGAnOidgYC4gIEEgcmVwbGFjZW1lbnQgZmllbGQgZW5kcword2l0aCBhIGNsb3NpbmcgY3VybHkgYnJhY2tldCBgYCd9J2BgLgorCitFeHByZXNzaW9ucyBpbiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIGFyZSB0cmVhdGVkIGxpa2UgcmVndWxhcgorUHl0aG9uIGV4cHJlc3Npb25zIHN1cnJvdW5kZWQgYnkgcGFyZW50aGVzZXMsIHdpdGggYSBmZXcgZXhjZXB0aW9ucy4KK0FuIGVtcHR5IGV4cHJlc3Npb24gaXMgbm90IGFsbG93ZWQsIGFuZCBhIDprZXl3b3JkOmBsYW1iZGFgIGV4cHJlc3Npb24KK211c3QgYmUgc3Vycm91bmRlZCBieSBleHBsaWNpdCBwYXJlbnRoZXNlcy4gIFJlcGxhY2VtZW50IGV4cHJlc3Npb25zCitjYW4gY29udGFpbiBsaW5lIGJyZWFrcyAoZS5nLiBpbiB0cmlwbGUtcXVvdGVkIHN0cmluZ3MpLCBidXQgdGhleQorY2Fubm90IGNvbnRhaW4gY29tbWVudHMuICBFYWNoIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGluIHRoZSBjb250ZXh0Cit3aGVyZSB0aGUgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsIGFwcGVhcnMsIGluIG9yZGVyIGZyb20gbGVmdCB0byByaWdodC4KKworSWYgYSBjb252ZXJzaW9uIGlzIHNwZWNpZmllZCwgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uCitpcyBjb252ZXJ0ZWQgYmVmb3JlIGZvcm1hdHRpbmcuICBDb252ZXJzaW9uIGBgJyFzJ2BgIGNhbGxzIDpmdW5jOmBzdHJgIG9uCit0aGUgcmVzdWx0LCBgYCchcidgYCBjYWxscyA6ZnVuYzpgcmVwcmAsIGFuZCBgYCchYSdgYCBjYWxscyA6ZnVuYzpgYXNjaWlgLgorCitUaGUgcmVzdWx0IGlzIHRoZW4gZm9ybWF0dGVkIHVzaW5nIHRoZSA6ZnVuYzpgZm9ybWF0YCBwcm90b2NvbC4gIFRoZQorZm9ybWF0IHNwZWNpZmllciBpcyBwYXNzZWQgdG8gdGhlIDptZXRoOmBfX2Zvcm1hdF9fYCBtZXRob2Qgb2YgdGhlCitleHByZXNzaW9uIG9yIGNvbnZlcnNpb24gcmVzdWx0LiAgQW4gZW1wdHkgc3RyaW5nIGlzIHBhc3NlZCB3aGVuIHRoZQorZm9ybWF0IHNwZWNpZmllciBpcyBvbWl0dGVkLiAgVGhlIGZvcm1hdHRlZCByZXN1bHQgaXMgdGhlbiBpbmNsdWRlZCBpbgordGhlIGZpbmFsIHZhbHVlIG9mIHRoZSB3aG9sZSBzdHJpbmcuCisKK1RvcC1sZXZlbCBmb3JtYXQgc3BlY2lmaWVycyBtYXkgaW5jbHVkZSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzLgorVGhlc2UgbmVzdGVkIGZpZWxkcyBtYXkgaW5jbHVkZSB0aGVpciBvd24gY29udmVyc2lvbiBmaWVsZHMgYW5kCitmb3JtYXQgc3BlY2lmaWVycywgYnV0IG1heSBub3QgaW5jbHVkZSBtb3JlIGRlZXBseS1uZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzLgorCitGb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIG1heSBiZSBjb25jYXRlbmF0ZWQsIGJ1dCByZXBsYWNlbWVudCBmaWVsZHMKK2Nhbm5vdCBiZSBzcGxpdCBhY3Jvc3MgbGl0ZXJhbHMuCisKK1NvbWUgZXhhbXBsZXMgb2YgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsczo6CisKKyAgID4+PiBuYW1lID0gIkZyZWQiCisgICA+Pj4gZiJIZSBzYWlkIGhpcyBuYW1lIGlzIHtuYW1lIXJ9LiIKKyAgICJIZSBzYWlkIGhpcyBuYW1lIGlzICdGcmVkJy4iCisgICA+Pj4gZiJIZSBzYWlkIGhpcyBuYW1lIGlzIHtyZXByKG5hbWUpfS4iICAjIHJlcHIoKSBpcyBlcXVpdmFsZW50IHRvICFyCisgICAiSGUgc2FpZCBoaXMgbmFtZSBpcyAnRnJlZCcuIgorICAgPj4+IHdpZHRoID0gMTAKKyAgID4+PiBwcmVjaXNpb24gPSA0CisgICA+Pj4gdmFsdWUgPSBkZWNpbWFsLkRlY2ltYWwoIjEyLjM0NTY3IikKKyAgID4+PiBmInJlc3VsdDoge3ZhbHVlOnt3aWR0aH0ue3ByZWNpc2lvbn19IiAgIyBuZXN0ZWQgZmllbGRzCisgICAncmVzdWx0OiAgICAgIDEyLjM1JworCitBIGNvbnNlcXVlbmNlIG9mIHNoYXJpbmcgdGhlIHNhbWUgc3ludGF4IGFzIHJlZ3VsYXIgc3RyaW5nIGxpdGVyYWxzIGlzCit0aGF0IGNoYXJhY3RlcnMgaW4gdGhlIHJlcGxhY2VtZW50IGZpZWxkcyBtdXN0IG5vdCBjb25mbGljdCB3aXRoIHRoZQorcXVvdGluZyB1c2VkIGluIHRoZSBvdXRlciBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWwuICBBbHNvLCBlc2NhcGUKK3NlcXVlbmNlcyBub3JtYWxseSBhcHBseSB0byB0aGUgb3V0ZXIgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsLAorcmF0aGVyIHRoYW4gaW5uZXIgc3RyaW5nIGxpdGVyYWxzOjoKKworICAgZiJhYmMge2FbIngiXX0gZGVmIiAgICAjIGVycm9yOiBvdXRlciBzdHJpbmcgbGl0ZXJhbCBlbmRlZCBwcmVtYXR1cmVseQorICAgZiJhYmMge2FbXCJ4XCJdfSBkZWYiICAjIHdvcmthcm91bmQ6IGVzY2FwZSB0aGUgaW5uZXIgcXVvdGVzCisgICBmImFiYyB7YVsneCddfSBkZWYiICAgICMgd29ya2Fyb3VuZDogdXNlIGRpZmZlcmVudCBxdW90aW5nCisKKyAgIGYibmV3bGluZToge29yZCgnXG4nKX0iICAgIyBlcnJvcjogbGl0ZXJhbCBsaW5lIGJyZWFrIGluIGlubmVyIHN0cmluZworICAgZiJuZXdsaW5lOiB7b3JkKCdcXG4nKX0iICAjIHdvcmthcm91bmQ6IGRvdWJsZSBlc2NhcGluZworICAgZnIibmV3bGluZToge29yZCgnXG4nKX0iICAjIHdvcmthcm91bmQ6IHJhdyBvdXRlciBzdHJpbmcKKworU2VlIGFsc28gOnBlcDpgNDk4YCBmb3IgdGhlIHByb3Bvc2FsIHRoYXQgYWRkZWQgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscywKK2FuZCA6bWV0aDpgc3RyLmZvcm1hdGAsIHdoaWNoIHVzZXMgYSByZWxhdGVkIGZvcm1hdCBzdHJpbmcgbWVjaGFuaXNtLgogCiAKIC4uIF9udW1iZXJzOgpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9zaW1wbGVfc3RtdHMucnN0IGIvRG9jL3JlZmVyZW5jZS9zaW1wbGVfc3RtdHMucnN0CmluZGV4IGQ0MDNjNGQuLjZhYWZhNzIgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2Uvc2ltcGxlX3N0bXRzLnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL3NpbXBsZV9zdG10cy5yc3QKQEAgLTE2LDYgKzE2LDcgQEAKICAgICAgICAgICAgICAgOiB8IGBhc3NlcnRfc3RtdGAKICAgICAgICAgICAgICAgOiB8IGBhc3NpZ25tZW50X3N0bXRgCiAgICAgICAgICAgICAgIDogfCBgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdGAKKyAgICAgICAgICAgICAgOiB8IGBhbm5vdGF0ZWRfYXNzaWdubWVudF9zdG10YAogICAgICAgICAgICAgICA6IHwgYHBhc3Nfc3RtdGAKICAgICAgICAgICAgICAgOiB8IGBkZWxfc3RtdGAKICAgICAgICAgICAgICAgOiB8IGByZXR1cm5fc3RtdGAKQEAgLTg0LDcgKzg1LDcgQEAKICAgIGFzc2lnbm1lbnRfc3RtdDogKGB0YXJnZXRfbGlzdGAgIj0iKSsgKGBzdGFycmVkX2V4cHJlc3Npb25gIHwgYHlpZWxkX2V4cHJlc3Npb25gKQogICAgdGFyZ2V0X2xpc3Q6IGB0YXJnZXRgICgiLCIgYHRhcmdldGApKiBbIiwiXQogICAgdGFyZ2V0OiBgaWRlbnRpZmllcmAKLSAgICAgICAgIDogfCAiKCIgYHRhcmdldF9saXN0YCAiKSIKKyAgICAgICAgIDogfCAiKCIgW2B0YXJnZXRfbGlzdGBdICIpIgogICAgICAgICAgOiB8ICJbIiBbYHRhcmdldF9saXN0YF0gIl0iCiAgICAgICAgICA6IHwgYGF0dHJpYnV0ZXJlZmAKICAgICAgICAgIDogfCBgc3Vic2NyaXB0aW9uYApAQCAtMzEyLDYgKzMxMyw0OSBAQAogYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMgPGF0dHItdGFyZ2V0LW5vdGU+YCBhcHBsaWVzIGFzIGZvciByZWd1bGFyIGFzc2lnbm1lbnRzLgogCiAKKy4uIF9hbm5hc3NpZ246CisKK0Fubm90YXRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4gaW5kZXg6OgorICAgcGFpcjogYW5ub3RhdGVkOyBhc3NpZ25tZW50CisgICBzaW5nbGU6IHN0YXRlbWVudDsgYXNzaWdubWVudCwgYW5ub3RhdGVkCisKK0Fubm90YXRpb24gYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlIHN0YXRlbWVudCwKK29mIGEgdmFyaWFibGUgb3IgYXR0cmlidXRlIGFubm90YXRpb24gYW5kIGFuIG9wdGlvbmFsIGFzc2lnbm1lbnQgc3RhdGVtZW50OgorCisuLiBwcm9kdWN0aW9ubGlzdDo6CisgICBhbm5vdGF0ZWRfYXNzaWdubWVudF9zdG10OiBgYXVndGFyZ2V0YCAiOiIgYGV4cHJlc3Npb25gIFsiPSIgYGV4cHJlc3Npb25gXQorCitUaGUgZGlmZmVyZW5jZSBmcm9tIG5vcm1hbCA6cmVmOmBhc3NpZ25tZW50YCBpcyB0aGF0IG9ubHkgc2luZ2xlIHRhcmdldCBhbmQKK29ubHkgc2luZ2xlIHJpZ2h0IGhhbmQgc2lkZSB2YWx1ZSBpcyBhbGxvd2VkLgorCitGb3Igc2ltcGxlIG5hbWVzIGFzIGFzc2lnbm1lbnQgdGFyZ2V0cywgaWYgaW4gY2xhc3Mgb3IgbW9kdWxlIHNjb3BlLAordGhlIGFubm90YXRpb25zIGFyZSBldmFsdWF0ZWQgYW5kIHN0b3JlZCBpbiBhIHNwZWNpYWwgY2xhc3Mgb3IgbW9kdWxlCithdHRyaWJ1dGUgOmF0dHI6YF9fYW5ub3RhdGlvbnNfX2AKK3RoYXQgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgZnJvbSB2YXJpYWJsZSBuYW1lcyB0byBldmFsdWF0ZWQgYW5ub3RhdGlvbnMuCitUaGlzIGF0dHJpYnV0ZSBpcyB3cml0YWJsZSBhbmQgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGF0IHRoZSBzdGFydAorb2YgY2xhc3Mgb3IgbW9kdWxlIGJvZHkgZXhlY3V0aW9uLCBpZiBhbm5vdGF0aW9ucyBhcmUgZm91bmQgc3RhdGljYWxseS4KKworRm9yIGV4cHJlc3Npb25zIGFzIGFzc2lnbm1lbnQgdGFyZ2V0cywgdGhlIGFubm90YXRpb25zIGFyZSBldmFsdWF0ZWQgaWYKK2luIGNsYXNzIG9yIG1vZHVsZSBzY29wZSwgYnV0IG5vdCBzdG9yZWQuCisKK0lmIGEgbmFtZSBpcyBhbm5vdGF0ZWQgaW4gYSBmdW5jdGlvbiBzY29wZSwgdGhlbiB0aGlzIG5hbWUgaXMgbG9jYWwgZm9yCit0aGF0IHNjb3BlLiBBbm5vdGF0aW9ucyBhcmUgbmV2ZXIgZXZhbHVhdGVkIGFuZCBzdG9yZWQgaW4gZnVuY3Rpb24gc2NvcGVzLgorCitJZiB0aGUgcmlnaHQgaGFuZCBzaWRlIGlzIHByZXNlbnQsIGFuIGFubm90YXRlZAorYXNzaWdubWVudCBwZXJmb3JtcyB0aGUgYWN0dWFsIGFzc2lnbm1lbnQgYmVmb3JlIGV2YWx1YXRpbmcgYW5ub3RhdGlvbnMKKyh3aGVyZSBhcHBsaWNhYmxlKS4gSWYgdGhlIHJpZ2h0IGhhbmQgc2lkZSBpcyBub3QgcHJlc2VudCBmb3IgYW4gZXhwcmVzc2lvbgordGFyZ2V0LCB0aGVuIHRoZSBpbnRlcnByZXRlciBldmFsdWF0ZXMgdGhlIHRhcmdldCBleGNlcHQgZm9yIHRoZSBsYXN0Cis6bWV0aDpgX19zZXRpdGVtX19gIG9yIDptZXRoOmBfX3NldGF0dHJfX2AgY2FsbC4KKworLi4gc2VlYWxzbzo6CisKKyAgIDpwZXA6YDUyNmAgLSBWYXJpYWJsZSBhbmQgYXR0cmlidXRlIGFubm90YXRpb24gc3ludGF4CisgICA6cGVwOmA0ODRgIC0gVHlwZSBoaW50cworCisKIC4uIF9hc3NlcnQ6CiAKIFRoZSA6a2V5d29yZDpgYXNzZXJ0YCBzdGF0ZW1lbnQKQEAgLTg1OSwxMSArOTAzLDEyIEBACiAKIE5hbWVzIGxpc3RlZCBpbiBhIDprZXl3b3JkOmBnbG9iYWxgIHN0YXRlbWVudCBtdXN0IG5vdCBiZSBkZWZpbmVkIGFzIGZvcm1hbAogcGFyYW1ldGVycyBvciBpbiBhIDprZXl3b3JkOmBmb3JgIGxvb3AgY29udHJvbCB0YXJnZXQsIDprZXl3b3JkOmBjbGFzc2AKLWRlZmluaXRpb24sIGZ1bmN0aW9uIGRlZmluaXRpb24sIG9yIDprZXl3b3JkOmBpbXBvcnRgIHN0YXRlbWVudC4KK2RlZmluaXRpb24sIGZ1bmN0aW9uIGRlZmluaXRpb24sIDprZXl3b3JkOmBpbXBvcnRgIHN0YXRlbWVudCwgb3IgdmFyaWFibGUKK2Fubm90YXRpb24uCiAKIC4uIGltcGwtZGV0YWlsOjoKIAotICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgZW5mb3JjZSB0aGUgdHdvIHJlc3RyaWN0aW9ucywgYnV0CisgICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBlbmZvcmNlIHNvbWUgb2YgdGhlc2UgcmVzdHJpY3Rpb24sIGJ1dAogICAgcHJvZ3JhbXMgc2hvdWxkIG5vdCBhYnVzZSB0aGlzIGZyZWVkb20sIGFzIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGVuZm9yY2UKICAgIHRoZW0gb3Igc2lsZW50bHkgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtLgogCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvZXh0ZW5zaW9ucy9weXNwZWNpZmljLnB5IGIvRG9jL3Rvb2xzL2V4dGVuc2lvbnMvcHlzcGVjaWZpYy5weQppbmRleCA2MzExMjgzLi43OTg2MDE3IDEwMDY0NAotLS0gYS9Eb2MvdG9vbHMvZXh0ZW5zaW9ucy9weXNwZWNpZmljLnB5CisrKyBiL0RvYy90b29scy9leHRlbnNpb25zL3B5c3BlY2lmaWMucHkKQEAgLTM0LDcgKzM0LDcgQEAKIAogCiBJU1NVRV9VUkkgPSAnaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUlcycKLVNPVVJDRV9VUkkgPSAnaHR0cHM6Ly9oZy5weXRob24ub3JnL2NweXRob24vZmlsZS8zLjUvJXMnCitTT1VSQ0VfVVJJID0gJ2h0dHBzOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL2ZpbGUvZGVmYXVsdC8lcycKIAogIyBtb25rZXktcGF0Y2ggcmVTVCBwYXJzZXIgdG8gZGlzYWJsZSBhbHBoYWJldGljIGFuZCByb21hbiBlbnVtZXJhdGVkIGxpc3RzCiBmcm9tIGRvY3V0aWxzLnBhcnNlcnMucnN0LnN0YXRlcyBpbXBvcnQgQm9keQpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3JzdGxpbnQucHkgYi9Eb2MvdG9vbHMvcnN0bGludC5weQppbmRleCBkZTc4MDQxLi4yYzE4MTZlIDEwMDc1NQotLS0gYS9Eb2MvdG9vbHMvcnN0bGludC5weQorKysgYi9Eb2MvdG9vbHMvcnN0bGludC5weQpAQCAtOSw4ICs5LDYgQEAKICMgVE9ETzogLSB3cm9uZyB2ZXJzaW9ucyBpbiB2ZXJzaW9uYWRkZWQvY2hhbmdlZAogIyAgICAgICAtIHdyb25nIG1hcmt1cCBhZnRlciB2ZXJzaW9uY2hhbmdlZCBkaXJlY3RpdmUKIAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAotCiBpbXBvcnQgb3MKIGltcG9ydCByZQogaW1wb3J0IHN5cwpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3N1c3AtaWdub3JlZC5jc3YgYi9Eb2MvdG9vbHMvc3VzcC1pZ25vcmVkLmNzdgppbmRleCBkYmE5M2JmLi45NGZjNzFiIDEwMDY0NAotLS0gYS9Eb2MvdG9vbHMvc3VzcC1pZ25vcmVkLmNzdgorKysgYi9Eb2MvdG9vbHMvc3VzcC1pZ25vcmVkLmNzdgpAQCAtMTA2LDYgKzEwNiwxMCBAQAogbGlicmFyeS9mdW5jdGlvbnMsLDpzdGVwLGFbc3RhcnQ6c3RvcDpzdGVwXQogbGlicmFyeS9mdW5jdGlvbnMsLDpzdG9wLCJhW3N0YXJ0OnN0b3AsIGldIgogbGlicmFyeS9mdW5jdGlvbnMsLDpzdG9wLGFbc3RhcnQ6c3RvcDpzdGVwXQorbGlicmFyeS9oYXNobGliLWJsYWtlMiwsOnZhdHJvZ2FzYWMsPj4+IGNvb2tpZSA9IGIndXNlcjp2YXRyb2dhc2FjJworbGlicmFyeS9oYXNobGliLWJsYWtlMiwsOnZhdHJvZ2FzYWMsInVzZXI6dmF0cm9nYXNhYywzNDljZjkwNDUzMzc2N2VkMmQ3NTUyNzlhOGRmODRkMCIKK2xpYnJhcnkvaGFzaGxpYi1ibGFrZTIsLDpwb2xpY2FqYWMsIj4+PiBjb21wYXJlX2RpZ2VzdChiJ3VzZXI6cG9saWNhamFjJywgc2lnKSIKK2xpYnJhcnkvaGFzaGxpYi1ibGFrZTIsLDpMRUFGLCJoMDAgPSBibGFrZTJiKGJ1ZlswOkxFQUZfU0laRV0sIGZhbm91dD1GQU5PVVQsIGRlcHRoPURFUFRILCIKIGxpYnJhcnkvaHR0cC5jbGllbnQsLDpwb3J0LGhvc3Q6cG9ydAogbGlicmFyeS9odHRwLmNvb2tpZXMsLGAsISMkJSYnKistLl5fYHx+OgogbGlicmFyeS9pbWFwbGliLCw6TU0sIiIiREQtTW1tLVlZWVkgSEg6TU06U1MiCkBAIC0yMDUsNyArMjA5LDcgQEAKIGxpYnJhcnkvdmVudiwsOnBhcmFtLCI6cGFyYW0gbm9kaXN0OiBJZiBUcnVlLCBzZXR1cHRvb2xzIGFuZCBwaXAgYXJlIG5vdCBpbnN0YWxsZWQgaW50byB0aGUiCiBsaWJyYXJ5L3ZlbnYsLDpwYXJhbSwiOnBhcmFtIHByb2dyZXNzOiBJZiBzZXR1cHRvb2xzIG9yIHBpcCBhcmUgaW5zdGFsbGVkLCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIgogbGlicmFyeS92ZW52LCw6cGFyYW0sIjpwYXJhbSBub3BpcDogSWYgVHJ1ZSwgcGlwIGlzIG5vdCBpbnN0YWxsZWQgaW50byB0aGUgY3JlYXRlZCIKLWxpYnJhcnkvdmVudiwsOnBhcmFtLDpwYXJhbSBjb250ZXh0OiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnZpcm9ubWVudCBjcmVhdGlvbiByZXF1ZXN0CitsaWJyYXJ5L3ZlbnYsLDpwYXJhbSw6cGFyYW0gY29udGV4dDogVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgdmlydHVhbCBlbnZpcm9ubWVudAogbGlicmFyeS94bWxycGMuY2xpZW50LCw6cGFzcyxodHRwOi8vdXNlcjpwYXNzQGhvc3Q6cG9ydC9wYXRoCiBsaWJyYXJ5L3htbHJwYy5jbGllbnQsLDpwYXNzLHVzZXI6cGFzcwogbGlicmFyeS94bWxycGMuY2xpZW50LCw6cG9ydCxodHRwOi8vdXNlcjpwYXNzQGhvc3Q6cG9ydC9wYXRoCkBAIC0yNzIsNiArMjc2LDcgQEAKIHdoYXRzbmV3LzMuMiwsOmd6LCI+Pj4gd2l0aCB0YXJmaWxlLm9wZW4obmFtZT0nbXlhcmNoaXZlLnRhci5neicsIG1vZGU9J3c6Z3onKSBhcyB0ZjoiCiB3aGF0c25ldy8zLjIsLDpsb2NhdGlvbix6b3BlOS1sb2NhdGlvbiA9ICR7em9wZTk6bG9jYXRpb259CiB3aGF0c25ldy8zLjIsLDpwcmVmaXgsem9wZS1jb25mID0gJHtjdXN0b206cHJlZml4fS9ldGMvem9wZS5jb25mCit3aGF0c25ldy9jaGFuZ2Vsb2csLDp2ZXJzaW9uLGltcG9ydCBzeXM7IEkgPSB2ZXJzaW9uWzp2ZXJzaW9uLmluZGV4KCcgJyldCiB3aGF0c25ldy9jaGFuZ2Vsb2csLDpneiwiOiBUYXJGaWxlIG9wZW5lZCB3aXRoIGV4dGVybmFsIGZpbGVvYmogYW5kICIidzpneiIiIG1vZGUgZGlkbid0Igogd2hhdHNuZXcvY2hhbmdlbG9nLCw6OiwiOiBVc2UgIiIxMjcuMC4wLjEiIiBvciAiIjo6MSIiIGluc3RlYWQgb2YgIiJsb2NhbGhvc3QiIiBhcyBtdWNoIGFzIgogbGlicmFyeS90YXJmaWxlLDE0OSw6eHosJ3g6eHonCkBAIC0yOTAsNyArMjk1LDYgQEAKIGxpYnJhcnkvemlwYXBwLDE1NSw6Y2FsbGFibGUsIiIicGtnLm1vZHVsZTpjYWxsYWJsZSIiIGFuZCB0aGUgYXJjaGl2ZSB3aWxsIGJlIHJ1biBieSBpbXBvcnRpbmciCiBsaWJyYXJ5L3N0ZHR5cGVzLCw6Oiw+Pj4gbVs6OjJdLnRvbGlzdCgpCiBsaWJyYXJ5L3N5cywsYCwjIGBgd3JhcHBlcmBgIGNyZWF0ZXMgYSBgYHdyYXAoY29ybylgYCBjb3JvdXRpbmU6Ci10dXRvcmlhbC92ZW52LDc3LDpjN2I5NjQ1YTZmMzUsIlB5dGhvbiAzLjQuMysgKDMuNDpjN2I5NjQ1YTZmMzUrLCBNYXkgMjIgMjAxNSwgMDk6MzE6MjUpIgogd2hhdHNuZXcvMy41LCw6cm9vdCwnV0FSTklORzpyb290Ondhcm5pbmdcbicKIHdoYXRzbmV3LzMuNSwsOndhcm5pbmcsJ1dBUk5JTkc6cm9vdDp3YXJuaW5nXG4nCiB3aGF0c25ldy8zLjUsLDo6LD4+PiBhZGRyNiA9IGlwYWRkcmVzcy5JUHY2QWRkcmVzcygnOjoxJykKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC9jb250cm9sZmxvdy5yc3QgYi9Eb2MvdHV0b3JpYWwvY29udHJvbGZsb3cucnN0CmluZGV4IDEyOTg5YjIuLmQ0MzQ2MTggMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9jb250cm9sZmxvdy5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL2NvbnRyb2xmbG93LnJzdApAQCAtNzgsNiArNzgsOSBAQAogICAgPj4+IHdvcmRzCiAgICBbJ2RlZmVuZXN0cmF0ZScsICdjYXQnLCAnd2luZG93JywgJ2RlZmVuZXN0cmF0ZSddCiAKK1dpdGggYGBmb3IgdyBpbiB3b3JkczpgYCwgdGhlIGV4YW1wbGUgd291bGQgYXR0ZW1wdCB0byBjcmVhdGUgYW4gaW5maW5pdGUgbGlzdCwKK2luc2VydGluZyBgYGRlZmVuZXN0cmF0ZWBgIG92ZXIgYW5kIG92ZXIgYWdhaW4uCisKIAogLi4gX3R1dC1yYW5nZToKIApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2lucHV0b3V0cHV0LnJzdCBiL0RvYy90dXRvcmlhbC9pbnB1dG91dHB1dC5yc3QKaW5kZXggZGQ5YzdjZC4uYmVlYWFjMyAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL2lucHV0b3V0cHV0LnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvaW5wdXRvdXRwdXQucnN0CkBAIC0yNSw3ICsyNSw4IEBACiBjb25jYXRlbmF0aW9uIG9wZXJhdGlvbnMgeW91IGNhbiBjcmVhdGUgYW55IGxheW91dCB5b3UgY2FuIGltYWdpbmUuICBUaGUKIHN0cmluZyB0eXBlIGhhcyBzb21lIG1ldGhvZHMgdGhhdCBwZXJmb3JtIHVzZWZ1bCBvcGVyYXRpb25zIGZvciBwYWRkaW5nCiBzdHJpbmdzIHRvIGEgZ2l2ZW4gY29sdW1uIHdpZHRoOyB0aGVzZSB3aWxsIGJlIGRpc2N1c3NlZCBzaG9ydGx5LiAgVGhlIHNlY29uZAotd2F5IGlzIHRvIHVzZSB0aGUgOm1ldGg6YHN0ci5mb3JtYXRgIG1ldGhvZC4KK3dheSBpcyB0byB1c2UgOnJlZjpgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyA8Zi1zdHJpbmdzPmAsIG9yIHRoZQorOm1ldGg6YHN0ci5mb3JtYXRgIG1ldGhvZC4KIAogVGhlIDptb2Q6YHN0cmluZ2AgbW9kdWxlIGNvbnRhaW5zIGEgOmNsYXNzOmB+c3RyaW5nLlRlbXBsYXRlYCBjbGFzcyB3aGljaCBvZmZlcnMKIHlldCBhbm90aGVyIHdheSB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbnRvIHN0cmluZ3MuCmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvaW50ZXJwcmV0ZXIucnN0IGIvRG9jL3R1dG9yaWFsL2ludGVycHJldGVyLnJzdAppbmRleCBlOGQ4ZTJiLi5mYWY1N2EzIDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvaW50ZXJwcmV0ZXIucnN0CisrKyBiL0RvYy90dXRvcmlhbC9pbnRlcnByZXRlci5yc3QKQEAgLTEwLDEzICsxMCwxMyBAQAogSW52b2tpbmcgdGhlIEludGVycHJldGVyCiA9PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyB1c3VhbGx5IGluc3RhbGxlZCBhcyA6ZmlsZTpgL3Vzci9sb2NhbC9iaW4vcHl0aG9uMy41YAorVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyB1c3VhbGx5IGluc3RhbGxlZCBhcyA6ZmlsZTpgL3Vzci9sb2NhbC9iaW4vcHl0aG9uMy42YAogb24gdGhvc2UgbWFjaGluZXMgd2hlcmUgaXQgaXMgYXZhaWxhYmxlOyBwdXR0aW5nIDpmaWxlOmAvdXNyL2xvY2FsL2JpbmAgaW4geW91cgogVW5peCBzaGVsbCdzIHNlYXJjaCBwYXRoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN0YXJ0IGl0IGJ5IHR5cGluZyB0aGUgY29tbWFuZDoKIAogLi4gY29kZS1ibG9jazo6IHRleHQKIAotICAgcHl0aG9uMy41CisgICBweXRob24zLjYKIAogdG8gdGhlIHNoZWxsLiBbI11fIFNpbmNlIHRoZSBjaG9pY2Ugb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaW50ZXJwcmV0ZXIgbGl2ZXMKIGlzIGFuIGluc3RhbGxhdGlvbiBvcHRpb24sIG90aGVyIHBsYWNlcyBhcmUgcG9zc2libGU7IGNoZWNrIHdpdGggeW91ciBsb2NhbApAQCAtMjQsMTEgKzI0LDExIEBACiBwb3B1bGFyIGFsdGVybmF0aXZlIGxvY2F0aW9uLikKIAogT24gV2luZG93cyBtYWNoaW5lcywgdGhlIFB5dGhvbiBpbnN0YWxsYXRpb24gaXMgdXN1YWxseSBwbGFjZWQgaW4KLTpmaWxlOmBDOlxcUHl0aG9uMzVgLCB0aG91Z2ggeW91IGNhbiBjaGFuZ2UgdGhpcyB3aGVuIHlvdSdyZSBydW5uaW5nIHRoZQorOmZpbGU6YEM6XFxQeXRob24zNmAsIHRob3VnaCB5b3UgY2FuIGNoYW5nZSB0aGlzIHdoZW4geW91J3JlIHJ1bm5pbmcgdGhlCiBpbnN0YWxsZXIuICBUbyBhZGQgdGhpcyBkaXJlY3RvcnkgdG8geW91ciBwYXRoLCAgeW91IGNhbiB0eXBlIHRoZSBmb2xsb3dpbmcKIGNvbW1hbmQgaW50byB0aGUgY29tbWFuZCBwcm9tcHQgaW4gYSBET1MgYm94OjoKIAotICAgc2V0IHBhdGg9JXBhdGglO0M6XHB5dGhvbjM1CisgICBzZXQgcGF0aD0lcGF0aCU7QzpccHl0aG9uMzYKIAogVHlwaW5nIGFuIGVuZC1vZi1maWxlIGNoYXJhY3RlciAoOmtiZDpgQ29udHJvbC1EYCBvbiBVbml4LCA6a2JkOmBDb250cm9sLVpgIG9uCiBXaW5kb3dzKSBhdCB0aGUgcHJpbWFyeSBwcm9tcHQgY2F1c2VzIHRoZSBpbnRlcnByZXRlciB0byBleGl0IHdpdGggYSB6ZXJvIGV4aXQKQEAgLTk4LDggKzk4LDggQEAKIAogLi4gY29kZS1ibG9jazo6IHNoZWxsLXNlc3Npb24KIAotICAgJCBweXRob24zLjUKLSAgIFB5dGhvbiAzLjUgKGRlZmF1bHQsIFNlcCAxNiAyMDE1LCAwOToyNTowNCkKKyAgICQgcHl0aG9uMy42CisgICBQeXRob24gMy42IChkZWZhdWx0LCBTZXAgMTYgMjAxNSwgMDk6MjU6MDQpCiAgICBbR0NDIDQuOC4yXSBvbiBsaW51eAogICAgVHlwZSAiaGVscCIsICJjb3B5cmlnaHQiLCAiY3JlZGl0cyIgb3IgImxpY2Vuc2UiIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgPj4+CmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvaW50cm9kdWN0aW9uLnJzdCBiL0RvYy90dXRvcmlhbC9pbnRyb2R1Y3Rpb24ucnN0CmluZGV4IDIxNDAzMjkuLjdlOGVlM2UgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9pbnRyb2R1Y3Rpb24ucnN0CisrKyBiL0RvYy90dXRvcmlhbC9pbnRyb2R1Y3Rpb24ucnN0CkBAIC0zNTIsNiArMzUyLDkgQEAKICAgICAgIFN0cmluZ3Mgc3VwcG9ydCBhIGxhcmdlIG51bWJlciBvZiBtZXRob2RzIGZvcgogICAgICAgYmFzaWMgdHJhbnNmb3JtYXRpb25zIGFuZCBzZWFyY2hpbmcuCiAKKyAgIDpyZWY6YGYtc3RyaW5nc2AKKyAgICAgIFN0cmluZyBsaXRlcmFscyB0aGF0IGhhdmUgZW1iZWRkZWQgZXhwcmVzc2lvbnMuCisKICAgIDpyZWY6YGZvcm1hdHN0cmluZ3NgCiAgICAgICBJbmZvcm1hdGlvbiBhYm91dCBzdHJpbmcgZm9ybWF0dGluZyB3aXRoIDptZXRoOmBzdHIuZm9ybWF0YC4KIApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL3N0ZGxpYi5yc3QgYi9Eb2MvdHV0b3JpYWwvc3RkbGliLnJzdAppbmRleCA1MmZmZGJlLi4xZGQwNmMyIDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvc3RkbGliLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvc3RkbGliLnJzdApAQCAtMTUsNyArMTUsNyBAQAogCiAgICA+Pj4gaW1wb3J0IG9zCiAgICA+Pj4gb3MuZ2V0Y3dkKCkgICAgICAjIFJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQotICAgJ0M6XFxQeXRob24zNScKKyAgICdDOlxcUHl0aG9uMzYnCiAgICA+Pj4gb3MuY2hkaXIoJy9zZXJ2ZXIvYWNjZXNzbG9ncycpICAgIyBDaGFuZ2UgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQogICAgPj4+IG9zLnN5c3RlbSgnbWtkaXIgdG9kYXknKSAgICMgUnVuIHRoZSBjb21tYW5kIG1rZGlyIGluIHRoZSBzeXN0ZW0gc2hlbGwKICAgIDAKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC9zdGRsaWIyLnJzdCBiL0RvYy90dXRvcmlhbC9zdGRsaWIyLnJzdAppbmRleCAzNzE0Mzg0Li5iZjRjZjg3IDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvc3RkbGliMi5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL3N0ZGxpYjIucnN0CkBAIC0yNzgsNyArMjc4LDcgQEAKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KICAgICAgICBkWydwcmltYXJ5J10gICAgICAgICAgICAgICAgIyBlbnRyeSB3YXMgYXV0b21hdGljYWxseSByZW1vdmVkCi0gICAgIEZpbGUgIkM6L3B5dGhvbjM1L2xpYi93ZWFrcmVmLnB5IiwgbGluZSA0NiwgaW4gX19nZXRpdGVtX18KKyAgICAgRmlsZSAiQzovcHl0aG9uMzYvbGliL3dlYWtyZWYucHkiLCBsaW5lIDQ2LCBpbiBfX2dldGl0ZW1fXwogICAgICAgIG8gPSBzZWxmLmRhdGFba2V5XSgpCiAgICBLZXlFcnJvcjogJ3ByaW1hcnknCiAKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC92ZW52LnJzdCBiL0RvYy90dXRvcmlhbC92ZW52LnJzdAppbmRleCAzYjJlZTJlLi5lMmRkNTdkIDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvdmVudi5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL3ZlbnYucnN0CkBAIC0yMCwxNSArMjAsMTQgQEAKIHRoZSByZXF1aXJlbWVudHMgYXJlIGluIGNvbmZsaWN0IGFuZCBpbnN0YWxsaW5nIGVpdGhlciB2ZXJzaW9uIDEuMCBvciAyLjAKIHdpbGwgbGVhdmUgb25lIGFwcGxpY2F0aW9uIHVuYWJsZSB0byBydW4uCiAKLVRoZSBzb2x1dGlvbiBmb3IgdGhpcyBwcm9ibGVtIGlzIHRvIGNyZWF0ZSBhIDp0ZXJtOmB2aXJ0dWFsCi1lbnZpcm9ubWVudGAgKG9mdGVuIHNob3J0ZW5lZCB0byAidmlydHVhbGVudiIpLCBhIHNlbGYtY29udGFpbmVkCi1kaXJlY3RvcnkgdHJlZSB0aGF0IGNvbnRhaW5zIGEgUHl0aG9uIGluc3RhbGxhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyCi12ZXJzaW9uIG9mIFB5dGhvbiwgcGx1cyBhIG51bWJlciBvZiBhZGRpdGlvbmFsIHBhY2thZ2VzLgorVGhlIHNvbHV0aW9uIGZvciB0aGlzIHByb2JsZW0gaXMgdG8gY3JlYXRlIGEgOnRlcm06YHZpcnR1YWwgZW52aXJvbm1lbnRgLCBhCitzZWxmLWNvbnRhaW5lZCBkaXJlY3RvcnkgdHJlZSB0aGF0IGNvbnRhaW5zIGEgUHl0aG9uIGluc3RhbGxhdGlvbiBmb3IgYQorcGFydGljdWxhciB2ZXJzaW9uIG9mIFB5dGhvbiwgcGx1cyBhIG51bWJlciBvZiBhZGRpdGlvbmFsIHBhY2thZ2VzLgogCiBEaWZmZXJlbnQgYXBwbGljYXRpb25zIGNhbiB0aGVuIHVzZSBkaWZmZXJlbnQgdmlydHVhbCBlbnZpcm9ubWVudHMuCiBUbyByZXNvbHZlIHRoZSBlYXJsaWVyIGV4YW1wbGUgb2YgY29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzLAogYXBwbGljYXRpb24gQSBjYW4gaGF2ZSBpdHMgb3duIHZpcnR1YWwgZW52aXJvbm1lbnQgd2l0aCB2ZXJzaW9uIDEuMAotaW5zdGFsbGVkIHdoaWxlIGFwcGxpY2F0aW9uIEIgaGFzIGFub3RoZXIgdmlydHVhbGVudiB3aXRoIHZlcnNpb24gMi4wLgoraW5zdGFsbGVkIHdoaWxlIGFwcGxpY2F0aW9uIEIgaGFzIGFub3RoZXIgdmlydHVhbCBlbnZpcm9ubWVudCB3aXRoIHZlcnNpb24gMi4wLgogSWYgYXBwbGljYXRpb24gQiByZXF1aXJlcyBhIGxpYnJhcnkgYmUgdXBncmFkZWQgdG8gdmVyc2lvbiAzLjAsIHRoaXMgd2lsbAogbm90IGFmZmVjdCBhcHBsaWNhdGlvbiBBJ3MgZW52aXJvbm1lbnQuCiAKQEAgLTM2LDI5ICszNSwyNiBAQAogQ3JlYXRpbmcgVmlydHVhbCBFbnZpcm9ubWVudHMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZSBzY3JpcHQgdXNlZCB0byBjcmVhdGUgYW5kIG1hbmFnZSB2aXJ0dWFsIGVudmlyb25tZW50cyBpcyBjYWxsZWQKLTpwcm9ncmFtOmBweXZlbnZgLiAgOnByb2dyYW06YHB5dmVudmAgd2lsbCB1c3VhbGx5IGluc3RhbGwgdGhlIG1vc3QKLXJlY2VudCB2ZXJzaW9uIG9mIFB5dGhvbiB0aGF0IHlvdSBoYXZlIGF2YWlsYWJsZTsgdGhlIHNjcmlwdCBpcyBhbHNvCi1pbnN0YWxsZWQgd2l0aCBhIHZlcnNpb24gbnVtYmVyLCBzbyBpZiB5b3UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZgotUHl0aG9uIG9uIHlvdXIgc3lzdGVtIHlvdSBjYW4gc2VsZWN0IGEgc3BlY2lmaWMgUHl0aG9uIHZlcnNpb24gYnkKLXJ1bm5pbmcgYGBweXZlbnYtMy40YGAgb3Igd2hpY2hldmVyIHZlcnNpb24geW91IHdhbnQuCitUaGUgbW9kdWxlIHVzZWQgdG8gY3JlYXRlIGFuZCBtYW5hZ2UgdmlydHVhbCBlbnZpcm9ubWVudHMgaXMgY2FsbGVkCis6bW9kOmB2ZW52YC4gIDptb2Q6YHZlbnZgIHdpbGwgdXN1YWxseSBpbnN0YWxsIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mCitQeXRob24gdGhhdCB5b3UgaGF2ZSBhdmFpbGFibGUuIElmIHlvdSBoYXZlIG11bHRpcGxlIHZlcnNpb25zIG9mIFB5dGhvbiBvbiB5b3VyCitzeXN0ZW0sIHlvdSBjYW4gc2VsZWN0IGEgc3BlY2lmaWMgUHl0aG9uIHZlcnNpb24gYnkgcnVubmluZyBgYHB5dGhvbjNgYCBvcgord2hpY2hldmVyIHZlcnNpb24geW91IHdhbnQuCiAKLVRvIGNyZWF0ZSBhIHZpcnR1YWxlbnYsIGRlY2lkZSB1cG9uIGEgZGlyZWN0b3J5Ci13aGVyZSB5b3Ugd2FudCB0byBwbGFjZSBpdCBhbmQgcnVuIDpwcm9ncmFtOmBweXZlbnZgIHdpdGggdGhlCi1kaXJlY3RvcnkgcGF0aDo6CitUbyBjcmVhdGUgYSB2aXJ0dWFsIGVudmlyb25tZW50LCBkZWNpZGUgdXBvbiBhIGRpcmVjdG9yeSB3aGVyZSB5b3Ugd2FudCB0bworcGxhY2UgaXQsIGFuZCBydW4gdGhlIDptb2Q6YHZlbnZgIG1vZHVsZSBhcyBhIHNjcmlwdCB3aXRoIHRoZSBkaXJlY3RvcnkgcGF0aDo6CiAKLSAgIHB5dmVudiB0dXRvcmlhbC1lbnYKKyAgIHB5dGhvbjMgLW0gdmVudiB0dXRvcmlhbC1lbnYKIAogVGhpcyB3aWxsIGNyZWF0ZSB0aGUgYGB0dXRvcmlhbC1lbnZgYCBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdCwKIGFuZCBhbHNvIGNyZWF0ZSBkaXJlY3RvcmllcyBpbnNpZGUgaXQgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIFB5dGhvbgogaW50ZXJwcmV0ZXIsIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LCBhbmQgdmFyaW91cyBzdXBwb3J0aW5nIGZpbGVzLgogCi1PbmNlIHlvdSd2ZSBjcmVhdGVkIGEgdmlydHVhbCBlbnZpcm9ubWVudCwgeW91IG5lZWQgdG8KLWFjdGl2YXRlIGl0LgorT25jZSB5b3UndmUgY3JlYXRlZCBhIHZpcnR1YWwgZW52aXJvbm1lbnQsIHlvdSBtYXkgYWN0aXZhdGUgaXQuCiAKIE9uIFdpbmRvd3MsIHJ1bjo6CiAKLSAgdHV0b3JpYWwtZW52L1NjcmlwdHMvYWN0aXZhdGUKKyAgdHV0b3JpYWwtZW52XFNjcmlwdHNcYWN0aXZhdGUuYmF0CiAKIE9uIFVuaXggb3IgTWFjT1MsIHJ1bjo6CiAKQEAgLTY5LDMzICs2NSwzNiBAQAogYGBhY3RpdmF0ZS5jc2hgYCBhbmQgYGBhY3RpdmF0ZS5maXNoYGAgc2NyaXB0cyB5b3Ugc2hvdWxkIHVzZQogaW5zdGVhZC4pCiAKLUFjdGl2YXRpbmcgdGhlIHZpcnR1YWxlbnYgd2lsbCBjaGFuZ2UgeW91ciBzaGVsbCdzIHByb21wdCB0byBzaG93IHdoYXQKLXZpcnR1YWxlbnYgeW91J3JlIHVzaW5nLCBhbmQgbW9kaWZ5IHRoZSBlbnZpcm9ubWVudCBzbyB0aGF0IHJ1bm5pbmcKLWBgcHl0aG9uYGAgd2lsbCBnZXQgeW91IHRoYXQgcGFydGljdWxhciB2ZXJzaW9uIGFuZCBpbnN0YWxsYXRpb24gb2YKLVB5dGhvbi4gIEZvciBleGFtcGxlOjoKK0FjdGl2YXRpbmcgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQgd2lsbCBjaGFuZ2UgeW91ciBzaGVsbCdzIHByb21wdCB0byBzaG93IHdoYXQKK3ZpcnR1YWwgZW52aXJvbm1lbnQgeW91J3JlIHVzaW5nLCBhbmQgbW9kaWZ5IHRoZSBlbnZpcm9ubWVudCBzbyB0aGF0IHJ1bm5pbmcKK2BgcHl0aG9uYGAgd2lsbCBnZXQgeW91IHRoYXQgcGFydGljdWxhciB2ZXJzaW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgUHl0aG9uLgorRm9yIGV4YW1wbGU6CiAKLSAgLT4gc291cmNlIH4vZW52cy90dXRvcmlhbC1lbnYvYmluL2FjdGl2YXRlCi0gICh0dXRvcmlhbC1lbnYpIC0+IHB5dGhvbgotICBQeXRob24gMy40LjMrICgzLjQ6YzdiOTY0NWE2ZjM1KywgTWF5IDIyIDIwMTUsIDA5OjMxOjI1KQorLi4gY29kZS1ibG9jazo6IGJhc2gKKworICAkIHNvdXJjZSB+L2VudnMvdHV0b3JpYWwtZW52L2Jpbi9hY3RpdmF0ZQorICAodHV0b3JpYWwtZW52KSAkIHB5dGhvbgorICBQeXRob24gMy41LjEgKGRlZmF1bHQsIE1heSAgNiAyMDE2LCAxMDo1OTozNikKICAgICAuLi4KICAgPj4+IGltcG9ydCBzeXMKICAgPj4+IHN5cy5wYXRoCi0gIFsnJywgJy91c3IvbG9jYWwvbGliL3B5dGhvbjM0LnppcCcsIC4uLiwKLSAgJ34vZW52cy90dXRvcmlhbC1lbnYvbGliL3B5dGhvbjMuNC9zaXRlLXBhY2thZ2VzJ10KKyAgWycnLCAnL3Vzci9sb2NhbC9saWIvcHl0aG9uMzUuemlwJywgLi4uLAorICAnfi9lbnZzL3R1dG9yaWFsLWVudi9saWIvcHl0aG9uMy41L3NpdGUtcGFja2FnZXMnXQogICA+Pj4KIAogCiBNYW5hZ2luZyBQYWNrYWdlcyB3aXRoIHBpcAogPT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotT25jZSB5b3UndmUgYWN0aXZhdGVkIGEgdmlydHVhbCBlbnZpcm9ubWVudCwgeW91IGNhbiBpbnN0YWxsLCB1cGdyYWRlLAotYW5kIHJlbW92ZSBwYWNrYWdlcyB1c2luZyBhIHByb2dyYW0gY2FsbGVkIDpwcm9ncmFtOmBwaXBgLiAgQnkgZGVmYXVsdAotYGBwaXBgYCB3aWxsIGluc3RhbGwgcGFja2FnZXMgZnJvbSB0aGUgUHl0aG9uIFBhY2thZ2UgSW5kZXgsCi08aHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaT4uICBZb3UgY2FuIGJyb3dzZSB0aGUgUHl0aG9uIFBhY2thZ2UgSW5kZXgKLWJ5IGdvaW5nIHRvIGl0IGluIHlvdXIgd2ViIGJyb3dzZXIsIG9yIHlvdSBjYW4gdXNlIGBgcGlwYGAncwotbGltaXRlZCBzZWFyY2ggZmVhdHVyZTo6CitZb3UgY2FuIGluc3RhbGwsIHVwZ3JhZGUsIGFuZCByZW1vdmUgcGFja2FnZXMgdXNpbmcgYSBwcm9ncmFtIGNhbGxlZAorOnByb2dyYW06YHBpcGAuICBCeSBkZWZhdWx0IGBgcGlwYGAgd2lsbCBpbnN0YWxsIHBhY2thZ2VzIGZyb20gdGhlIFB5dGhvbgorUGFja2FnZSBJbmRleCwgPGh0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGk+LiAgWW91IGNhbiBicm93c2UgdGhlIFB5dGhvbgorUGFja2FnZSBJbmRleCBieSBnb2luZyB0byBpdCBpbiB5b3VyIHdlYiBicm93c2VyLCBvciB5b3UgY2FuIHVzZSBgYHBpcGBgJ3MKK2xpbWl0ZWQgc2VhcmNoIGZlYXR1cmU6CiAKLSAgKHR1dG9yaWFsLWVudikgLT4gcGlwIHNlYXJjaCBhc3Ryb25vbXkKKy4uIGNvZGUtYmxvY2s6OiBiYXNoCisKKyAgKHR1dG9yaWFsLWVudikgJCBwaXAgc2VhcmNoIGFzdHJvbm9teQogICBza3lmaWVsZCAgICAgICAgICAgICAgIC0gRWxlZ2FudCBhc3Ryb25vbXkgZm9yIFB5dGhvbgogICBnYXJ5ICAgICAgICAgICAgICAgICAgIC0gR2FsYWN0aWMgYXN0cm9ub215IGFuZCBncmF2aXRhdGlvbmFsIGR5bmFtaWNzLgogICBub3ZhcyAgICAgICAgICAgICAgICAgIC0gVGhlIFVuaXRlZCBTdGF0ZXMgTmF2YWwgT2JzZXJ2YXRvcnkgTk9WQVMgYXN0cm9ub215IGxpYnJhcnkKQEAgLTEwNyw5ICsxMDYsMTEgQEAKICJmcmVlemUiLCBldGMuICAoQ29uc3VsdCB0aGUgOnJlZjpgaW5zdGFsbGluZy1pbmRleGAgZ3VpZGUgZm9yCiBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIGZvciBgYHBpcGBgLikKIAotWW91IGNhbiBpbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBhIHBhY2thZ2UgYnkgc3BlY2lmeWluZyBhIHBhY2thZ2UncyBuYW1lOjoKK1lvdSBjYW4gaW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYSBwYWNrYWdlIGJ5IHNwZWNpZnlpbmcgYSBwYWNrYWdlJ3MgbmFtZToKIAotICAtPiBwaXAgaW5zdGFsbCBub3ZhcworLi4gY29kZS1ibG9jazo6IGJhc2gKKworICAodHV0b3JpYWwtZW52KSAkIHBpcCBpbnN0YWxsIG5vdmFzCiAgIENvbGxlY3Rpbmcgbm92YXMKICAgICBEb3dubG9hZGluZyBub3Zhcy0zLjEuMS4zLnRhci5neiAoMTM2a0IpCiAgIEluc3RhbGxpbmcgY29sbGVjdGVkIHBhY2thZ2VzOiBub3ZhcwpAQCAtMTE3LDkgKzExOCwxMSBAQAogICBTdWNjZXNzZnVsbHkgaW5zdGFsbGVkIG5vdmFzLTMuMS4xLjMKIAogWW91IGNhbiBhbHNvIGluc3RhbGwgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIGEgcGFja2FnZSBieSBnaXZpbmcgdGhlCi1wYWNrYWdlIG5hbWUgIGZvbGxvd2VkIGJ5IGBgPT1gYCBhbmQgdGhlIHZlcnNpb24gbnVtYmVyOjoKK3BhY2thZ2UgbmFtZSAgZm9sbG93ZWQgYnkgYGA9PWBgIGFuZCB0aGUgdmVyc2lvbiBudW1iZXI6CiAKLSAgLT4gcGlwIGluc3RhbGwgcmVxdWVzdHM9PTIuNi4wCisuLiBjb2RlLWJsb2NrOjogYmFzaAorCisgICh0dXRvcmlhbC1lbnYpICQgcGlwIGluc3RhbGwgcmVxdWVzdHM9PTIuNi4wCiAgIENvbGxlY3RpbmcgcmVxdWVzdHM9PTIuNi4wCiAgICAgVXNpbmcgY2FjaGVkIHJlcXVlc3RzLTIuNi4wLXB5Mi5weTMtbm9uZS1hbnkud2hsCiAgIEluc3RhbGxpbmcgY29sbGVjdGVkIHBhY2thZ2VzOiByZXF1ZXN0cwpAQCAtMTI4LDkgKzEzMSwxMSBAQAogSWYgeW91IHJlLXJ1biB0aGlzIGNvbW1hbmQsIGBgcGlwYGAgd2lsbCBub3RpY2UgdGhhdCB0aGUgcmVxdWVzdGVkCiB2ZXJzaW9uIGlzIGFscmVhZHkgaW5zdGFsbGVkIGFuZCBkbyBub3RoaW5nLiAgWW91IGNhbiBzdXBwbHkgYQogZGlmZmVyZW50IHZlcnNpb24gbnVtYmVyIHRvIGdldCB0aGF0IHZlcnNpb24sIG9yIHlvdSBjYW4gcnVuIGBgcGlwCi1pbnN0YWxsIC0tdXBncmFkZWBgIHRvIHVwZ3JhZGUgdGhlIHBhY2thZ2UgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uOjoKK2luc3RhbGwgLS11cGdyYWRlYGAgdG8gdXBncmFkZSB0aGUgcGFja2FnZSB0byB0aGUgbGF0ZXN0IHZlcnNpb246CiAKLSAgLT4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHJlcXVlc3RzCisuLiBjb2RlLWJsb2NrOjogYmFzaAorCisgICh0dXRvcmlhbC1lbnYpICQgcGlwIGluc3RhbGwgLS11cGdyYWRlIHJlcXVlc3RzCiAgIENvbGxlY3RpbmcgcmVxdWVzdHMKICAgSW5zdGFsbGluZyBjb2xsZWN0ZWQgcGFja2FnZXM6IHJlcXVlc3RzCiAgICAgRm91bmQgZXhpc3RpbmcgaW5zdGFsbGF0aW9uOiByZXF1ZXN0cyAyLjYuMApAQCAtMTQxLDkgKzE0NiwxMSBAQAogYGBwaXAgdW5pbnN0YWxsYGAgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFja2FnZSBuYW1lcyB3aWxsIHJlbW92ZSB0aGUKIHBhY2thZ2VzIGZyb20gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQuCiAKLWBgcGlwIHNob3dgYCB3aWxsIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIHBhY2thZ2U6OgorYGBwaXAgc2hvd2BgIHdpbGwgZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgcGFja2FnZToKIAotICAodHV0b3JpYWwtZW52KSAtPiBwaXAgc2hvdyByZXF1ZXN0cworLi4gY29kZS1ibG9jazo6IGJhc2gKKworICAodHV0b3JpYWwtZW52KSAkIHBpcCBzaG93IHJlcXVlc3RzCiAgIC0tLQogICBNZXRhZGF0YS1WZXJzaW9uOiAyLjAKICAgTmFtZTogcmVxdWVzdHMKQEAgLTE1Nyw5ICsxNjQsMTEgQEAKICAgUmVxdWlyZXM6CiAKIGBgcGlwIGxpc3RgYCB3aWxsIGRpc3BsYXkgYWxsIG9mIHRoZSBwYWNrYWdlcyBpbnN0YWxsZWQgaW4gdGhlIHZpcnR1YWwKLWVudmlyb25tZW50OjoKK2Vudmlyb25tZW50OgogCi0gICh0dXRvcmlhbC1lbnYpIC0+IHBpcCBsaXN0CisuLiBjb2RlLWJsb2NrOjogYmFzaAorCisgICh0dXRvcmlhbC1lbnYpICQgcGlwIGxpc3QKICAgbm92YXMgKDMuMS4xLjMpCiAgIG51bXB5ICgxLjkuMikKICAgcGlwICg3LjAuMykKQEAgLTE2OCwxOSArMTc3LDIzIEBACiAKIGBgcGlwIGZyZWV6ZWBgIHdpbGwgcHJvZHVjZSBhIHNpbWlsYXIgbGlzdCBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2VzLAogYnV0IHRoZSBvdXRwdXQgdXNlcyB0aGUgZm9ybWF0IHRoYXQgYGBwaXAgaW5zdGFsbGBgIGV4cGVjdHMuCi1BIGNvbW1vbiBjb252ZW50aW9uIGlzIHRvIHB1dCB0aGlzIGxpc3QgaW4gYSBgYHJlcXVpcmVtZW50cy50eHRgYCBmaWxlOjoKK0EgY29tbW9uIGNvbnZlbnRpb24gaXMgdG8gcHV0IHRoaXMgbGlzdCBpbiBhIGBgcmVxdWlyZW1lbnRzLnR4dGBgIGZpbGU6CiAKLSAgKHR1dG9yaWFsLWVudikgLT4gcGlwIGZyZWV6ZSA+IHJlcXVpcmVtZW50cy50eHQKLSAgKHR1dG9yaWFsLWVudikgLT4gY2F0IHJlcXVpcmVtZW50cy50eHQKKy4uIGNvZGUtYmxvY2s6OiBiYXNoCisKKyAgKHR1dG9yaWFsLWVudikgJCBwaXAgZnJlZXplID4gcmVxdWlyZW1lbnRzLnR4dAorICAodHV0b3JpYWwtZW52KSAkIGNhdCByZXF1aXJlbWVudHMudHh0CiAgIG5vdmFzPT0zLjEuMS4zCiAgIG51bXB5PT0xLjkuMgogICByZXF1ZXN0cz09Mi43LjAKIAogVGhlIGBgcmVxdWlyZW1lbnRzLnR4dGBgIGNhbiB0aGVuIGJlIGNvbW1pdHRlZCB0byB2ZXJzaW9uIGNvbnRyb2wgYW5kCiBzaGlwcGVkIGFzIHBhcnQgb2YgYW4gYXBwbGljYXRpb24uICBVc2VycyBjYW4gdGhlbiBpbnN0YWxsIGFsbCB0aGUKLW5lY2Vzc2FyeSBwYWNrYWdlcyB3aXRoIGBgaW5zdGFsbCAtcmBgOjoKK25lY2Vzc2FyeSBwYWNrYWdlcyB3aXRoIGBgaW5zdGFsbCAtcmBgOgogCi0gIC0+IHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQKKy4uIGNvZGUtYmxvY2s6OiBiYXNoCisKKyAgKHR1dG9yaWFsLWVudikgJCBwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0CiAgIENvbGxlY3Rpbmcgbm92YXM9PTMuMS4xLjMgKGZyb20gLXIgcmVxdWlyZW1lbnRzLnR4dCAobGluZSAxKSkKICAgICAuLi4KICAgQ29sbGVjdGluZyBudW1weT09MS45LjIgKGZyb20gLXIgcmVxdWlyZW1lbnRzLnR4dCAobGluZSAyKSkKZGlmZiAtLWdpdCBhL0RvYy91c2luZy9jbWRsaW5lLnJzdCBiL0RvYy91c2luZy9jbWRsaW5lLnJzdAppbmRleCA1N2ZhZjg5Li43NWNiOGVhIDEwMDY0NAotLS0gYS9Eb2MvdXNpbmcvY21kbGluZS5yc3QKKysrIGIvRG9jL3VzaW5nL2NtZGxpbmUucnN0CkBAIC0zOTUsNiArMzk1LDggQEAKICAgICAgc3RvcmVkIGluIGEgdHJhY2ViYWNrIG9mIGEgdHJhY2UuIFVzZSBgYC1YIHRyYWNlbWFsbG9jPU5GUkFNRWBgIHRvIHN0YXJ0CiAgICAgIHRyYWNpbmcgd2l0aCBhIHRyYWNlYmFjayBsaW1pdCBvZiAqTkZSQU1FKiBmcmFtZXMuIFNlZSB0aGUKICAgICAgOmZ1bmM6YHRyYWNlbWFsbG9jLnN0YXJ0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICogYGAtWCBzaG93YWxsb2Njb3VudGBgIHRvIGVuYWJsZSB0aGUgb3V0cHV0IG9mIHRoZSB0b3RhbCBjb3VudCBvZiBhbGxvY2F0ZWQKKyAgICAgb2JqZWN0cyBmb3IgZWFjaCB0eXBlIChvbmx5IHdvcmtzIHdoZW4gYnVpbHQgd2l0aCBgYENPVU5UX0FMTE9DU2BgIGRlZmluZWQpOwogCiAgICBJdCBhbHNvIGFsbG93cyBwYXNzaW5nIGFyYml0cmFyeSB2YWx1ZXMgYW5kIHJldHJpZXZpbmcgdGhlbSB0aHJvdWdoIHRoZQogICAgOmRhdGE6YHN5cy5feG9wdGlvbnNgIGRpY3Rpb25hcnkuCkBAIC00MDgsNiArNDEwLDkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogICAgICAgVGhlIGBgLVggc2hvd3JlZmNvdW50YGAgYW5kIGBgLVggdHJhY2VtYWxsb2NgYCBvcHRpb25zLgogCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgIFRoZSBgYC1YIHNob3dhbGxvY2NvdW50YGAgb3B0aW9uLgorCiAKIE9wdGlvbnMgeW91IHNob3VsZG4ndCB1c2UKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KQEAgLTU1NCw2ICs1NTksMTAgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy40CiAgICAgICBUaGUgYGBlbmNvZGluZ25hbWVgYCBwYXJ0IGlzIG5vdyBvcHRpb25hbC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIE9uIFdpbmRvd3MsIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgYnkgdGhpcyB2YXJpYWJsZSBpcyBpZ25vcmVkIGZvciBpbnRlcmFjdGl2ZQorICAgICAgY29uc29sZSBidWZmZXJzIHVubGVzcyA6ZW52dmFyOmBQWVRIT05MRUdBQ1lXSU5ET1dTSU9FTkNPRElOR2AgaXMgYWxzbyBzcGVjaWZpZWQuCisgICAgICBGaWxlcyBhbmQgcGlwZXMgcmVkaXJlY3RlZCB0aHJvdWdoIHRoZSBzdGFuZGFyZCBzdHJlYW1zIGFyZSBub3QgYWZmZWN0ZWQuCiAKIC4uIGVudnZhcjo6IFBZVEhPTk5PVVNFUlNJVEUKIApAQCAtNjE5LDYgKzYyOCw4MSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKIAorLi4gZW52dmFyOjogUFlUSE9OTUFMTE9DCisKKyAgIFNldCB0aGUgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzIGFuZC9vciBpbnN0YWxsIGRlYnVnIGhvb2tzLgorCisgICBTZXQgdGhlIGZhbWlseSBvZiBtZW1vcnkgYWxsb2NhdG9ycyB1c2VkIGJ5IFB5dGhvbjoKKworICAgKiBgYG1hbGxvY2BgOiB1c2UgdGhlIDpjOmZ1bmM6YG1hbGxvY2AgZnVuY3Rpb24gb2YgdGhlIEMgbGlicmFyeQorICAgICBmb3IgYWxsIGRvbWFpbnMgKDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9SQVdgLCA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCwKKyAgICAgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmApLgorICAgKiBgYHB5bWFsbG9jYGA6IHVzZSB0aGUgOnJlZjpgcHltYWxsb2MgYWxsb2NhdG9yIDxweW1hbGxvYz5gIGZvcgorICAgICA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCBhbmQgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmAgZG9tYWlucyBhbmQgdXNlCisgICAgIHRoZSA6YzpmdW5jOmBtYWxsb2NgIGZ1bmN0aW9uIGZvciB0aGUgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX1JBV2AgZG9tYWluLgorCisgICBJbnN0YWxsIGRlYnVnIGhvb2tzOgorCisgICAqIGBgZGVidWdgYDogaW5zdGFsbCBkZWJ1ZyBob29rcyBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRvcgorICAgKiBgYG1hbGxvY19kZWJ1Z2BgOiBzYW1lIGFzIGBgbWFsbG9jYGAgYnV0IGFsc28gaW5zdGFsbCBkZWJ1ZyBob29rcworICAgKiBgYHB5bWFsbG9jX2RlYnVnYGA6IHNhbWUgYXMgYGBweW1hbGxvY2BgIGJ1dCBhbHNvIGluc3RhbGwgZGVidWcgaG9va3MKKworICAgV2hlbiBQeXRob24gaXMgY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLCB0aGUgZGVmYXVsdCBpcyBgYHB5bWFsbG9jYGAuIFdoZW4KKyAgIGNvbXBpbGVkIGluIGRlYnVnIG1vZGUsIHRoZSBkZWZhdWx0IGlzIGBgcHltYWxsb2NfZGVidWdgYCBhbmQgdGhlIGRlYnVnIGhvb2tzCisgICBhcmUgdXNlZCBhdXRvbWF0aWNhbGx5LgorCisgICBJZiBQeXRob24gaXMgY29uZmlndXJlZCB3aXRob3V0IGBgcHltYWxsb2NgYCBzdXBwb3J0LCBgYHB5bWFsbG9jYGAgYW5kCisgICBgYHB5bWFsbG9jX2RlYnVnYGAgYXJlIG5vdCBhdmFpbGFibGUsIHRoZSBkZWZhdWx0IGlzIGBgbWFsbG9jYGAgaW4gcmVsZWFzZQorICAgbW9kZSBhbmQgYGBtYWxsb2NfZGVidWdgYCBpbiBkZWJ1ZyBtb2RlLgorCisgICBTZWUgdGhlIDpjOmZ1bmM6YFB5TWVtX1NldHVwRGVidWdIb29rc2AgZnVuY3Rpb24gZm9yIGRlYnVnIGhvb2tzIG9uIFB5dGhvbgorICAgbWVtb3J5IGFsbG9jYXRvcnMuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKKy4uIGVudnZhcjo6IFBZVEhPTk1BTExPQ1NUQVRTCisKKyAgIElmIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcsIFB5dGhvbiB3aWxsIHByaW50IHN0YXRpc3RpY3Mgb2YgdGhlCisgICA6cmVmOmBweW1hbGxvYyBtZW1vcnkgYWxsb2NhdG9yIDxweW1hbGxvYz5gIGV2ZXJ5IHRpbWUgYSBuZXcgcHltYWxsb2Mgb2JqZWN0CisgICBhcmVuYSBpcyBjcmVhdGVkLCBhbmQgb24gc2h1dGRvd24uCisKKyAgIFRoaXMgdmFyaWFibGUgaXMgaWdub3JlZCBpZiB0aGUgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgaXMgdXNlZCB0byBmb3JjZSB0aGUgOmM6ZnVuYzpgbWFsbG9jYCBhbGxvY2F0b3Igb2YgdGhlIEMgbGlicmFyeSwgb3IgaWYKKyAgIFB5dGhvbiBpcyBjb25maWd1cmVkIHdpdGhvdXQgYGBweW1hbGxvY2BgIHN1cHBvcnQuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBUaGlzIHZhcmlhYmxlIGNhbiBub3cgYWxzbyBiZSB1c2VkIG9uIFB5dGhvbiBjb21waWxlZCBpbiByZWxlYXNlIG1vZGUuCisgICAgICBJdCBub3cgaGFzIG5vIGVmZmVjdCBpZiBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLgorCisKKy4uIGVudnZhcjo6IFBZVEhPTkxFR0FDWVdJTkRPV1NGU0VOQ09ESU5HCisKKyAgIElmIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcsIHRoZSBkZWZhdWx0IGZpbGVzeXN0ZW0gZW5jb2RpbmcgYW5kIGVycm9ycyBtb2RlCisgICB3aWxsIHJldmVydCB0byB0aGVpciBwcmUtMy42IHZhbHVlcyBvZiAnbWJjcycgYW5kICdyZXBsYWNlJywgcmVzcGVjdGl2ZWx5LgorICAgT3RoZXJ3aXNlLCB0aGUgbmV3IGRlZmF1bHRzICd1dGYtOCcgYW5kICdzdXJyb2dhdGVwYXNzJyBhcmUgdXNlZC4KKworICAgVGhpcyBtYXkgYWxzbyBiZSBlbmFibGVkIGF0IHJ1bnRpbWUgd2l0aAorICAgOmZ1bmM6YHN5cy5fZW5hYmxlbGVnYWN5d2luZG93c2ZzZW5jb2RpbmcoKWAuCisKKyAgIEF2YWlsYWJpbGl0eTogV2luZG93cworCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgIFNlZSA6cGVwOmA1MjlgIGZvciBtb3JlIGRldGFpbHMuCisKKy4uIGVudnZhcjo6IFBZVEhPTkxFR0FDWVdJTkRPV1NJT0VOQ09ESU5HCisKKyAgIElmIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcsIGRvZXMgbm90IHVzZSB0aGUgbmV3IGNvbnNvbGUgcmVhZGVyIGFuZAorICAgd3JpdGVyLiBUaGlzIG1lYW5zIHRoYXQgVW5pY29kZSBjaGFyYWN0ZXJzIHdpbGwgYmUgZW5jb2RlZCBhY2NvcmRpbmcgdG8KKyAgIHRoZSBhY3RpdmUgY29uc29sZSBjb2RlIHBhZ2UsIHJhdGhlciB0aGFuIHVzaW5nIHV0Zi04LgorCisgICBUaGlzIHZhcmlhYmxlIGlzIGlnbm9yZWQgaWYgdGhlIHN0YW5kYXJkIHN0cmVhbXMgYXJlIHJlZGlyZWN0ZWQgKHRvIGZpbGVzCisgICBvciBwaXBlcykgcmF0aGVyIHRoYW4gcmVmZXJyaW5nIHRvIGNvbnNvbGUgYnVmZmVycy4KKworICAgQXZhaWxhYmlsaXR5OiBXaW5kb3dzCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiBEZWJ1Zy1tb2RlIHZhcmlhYmxlcwogfn5+fn5+fn5+fn5+fn5+fn5+fn4KIApAQCAtNjM0LDkgKzcxOCwzIEBACiAKICAgIElmIHNldCwgUHl0aG9uIHdpbGwgZHVtcCBvYmplY3RzIGFuZCByZWZlcmVuY2UgY291bnRzIHN0aWxsIGFsaXZlIGFmdGVyCiAgICBzaHV0dGluZyBkb3duIHRoZSBpbnRlcnByZXRlci4KLQotCi0uLiBlbnZ2YXI6OiBQWVRIT05NQUxMT0NTVEFUUwotCi0gICBJZiBzZXQsIFB5dGhvbiB3aWxsIHByaW50IG1lbW9yeSBhbGxvY2F0aW9uIHN0YXRpc3RpY3MgZXZlcnkgdGltZSBhIG5ldwotICAgb2JqZWN0IGFyZW5hIGlzIGNyZWF0ZWQsIGFuZCBvbiBzaHV0ZG93bi4KZGlmZiAtLWdpdCBhL0RvYy91c2luZy9pbmRleC5yc3QgYi9Eb2MvdXNpbmcvaW5kZXgucnN0CmluZGV4IDUwMmFmYTkuLmE1ZGY3MTMgMTAwNjQ0Ci0tLSBhL0RvYy91c2luZy9pbmRleC5yc3QKKysrIGIvRG9jL3VzaW5nL2luZGV4LnJzdApAQCAtMTcsNCArMTcsMyBAQAogICAgdW5peC5yc3QKICAgIHdpbmRvd3MucnN0CiAgICBtYWMucnN0Ci0gICBzY3JpcHRzLnJzdApkaWZmIC0tZ2l0IGEvRG9jL3VzaW5nL21hYy5yc3QgYi9Eb2MvdXNpbmcvbWFjLnJzdAppbmRleCAwNWM5MWJiLi44ZjFhYzNmIDEwMDY0NAotLS0gYS9Eb2MvdXNpbmcvbWFjLnJzdAorKysgYi9Eb2MvdXNpbmcvbWFjLnJzdApAQCAtMjUsNyArMjUsNyBAQAogCiBXaGF0IHlvdSBnZXQgYWZ0ZXIgaW5zdGFsbGluZyBpcyBhIG51bWJlciBvZiB0aGluZ3M6CiAKLSogQSA6ZmlsZTpgTWFjUHl0aG9uIDMuNWAgZm9sZGVyIGluIHlvdXIgOmZpbGU6YEFwcGxpY2F0aW9uc2AgZm9sZGVyLiBJbiBoZXJlCisqIEEgOmZpbGU6YE1hY1B5dGhvbiAzLjZgIGZvbGRlciBpbiB5b3VyIDpmaWxlOmBBcHBsaWNhdGlvbnNgIGZvbGRlci4gSW4gaGVyZQogICB5b3UgZmluZCBJRExFLCB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGhhdCBpcyBhIHN0YW5kYXJkIHBhcnQgb2Ygb2ZmaWNpYWwKICAgUHl0aG9uIGRpc3RyaWJ1dGlvbnM7IFB5dGhvbkxhdW5jaGVyLCB3aGljaCBoYW5kbGVzIGRvdWJsZS1jbGlja2luZyBQeXRob24KICAgc2NyaXB0cyBmcm9tIHRoZSBGaW5kZXI7IGFuZCB0aGUgIkJ1aWxkIEFwcGxldCIgdG9vbCwgd2hpY2ggYWxsb3dzIHlvdSB0bwpAQCAtOTMsNyArOTMsNyBAQAogYW55dGhpbmcgdGhhdCBoYXMgYSBHVUkpIG5lZWQgdG8gYmUgcnVuIGluIGEgc3BlY2lhbCB3YXkuIFVzZSA6cHJvZ3JhbTpgcHl0aG9ud2AKIGluc3RlYWQgb2YgOnByb2dyYW06YHB5dGhvbmAgdG8gc3RhcnQgc3VjaCBzY3JpcHRzLgogCi1XaXRoIFB5dGhvbiAzLjUsIHlvdSBjYW4gdXNlIGVpdGhlciA6cHJvZ3JhbTpgcHl0aG9uYCBvciA6cHJvZ3JhbTpgcHl0aG9ud2AuCitXaXRoIFB5dGhvbiAzLjYsIHlvdSBjYW4gdXNlIGVpdGhlciA6cHJvZ3JhbTpgcHl0aG9uYCBvciA6cHJvZ3JhbTpgcHl0aG9ud2AuCiAKIAogQ29uZmlndXJhdGlvbgpAQCAtMTU5LDcgKzE1OSw3IEBACiBEaXN0cmlidXRpbmcgUHl0aG9uIEFwcGxpY2F0aW9ucyBvbiB0aGUgTWFjCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZSAiQnVpbGQgQXBwbGV0IiB0b29sIHRoYXQgaXMgcGxhY2VkIGluIHRoZSBNYWNQeXRob24gMy41IGZvbGRlciBpcyBmaW5lIGZvcgorVGhlICJCdWlsZCBBcHBsZXQiIHRvb2wgdGhhdCBpcyBwbGFjZWQgaW4gdGhlIE1hY1B5dGhvbiAzLjYgZm9sZGVyIGlzIGZpbmUgZm9yCiBwYWNrYWdpbmcgc21hbGwgUHl0aG9uIHNjcmlwdHMgb24geW91ciBvd24gbWFjaGluZSB0byBydW4gYXMgYSBzdGFuZGFyZCBNYWMKIGFwcGxpY2F0aW9uLiBUaGlzIHRvb2wsIGhvd2V2ZXIsIGlzIG5vdCByb2J1c3QgZW5vdWdoIHRvIGRpc3RyaWJ1dGUgUHl0aG9uCiBhcHBsaWNhdGlvbnMgdG8gb3RoZXIgdXNlcnMuCmRpZmYgLS1naXQgYS9Eb2MvdXNpbmcvc2NyaXB0cy5yc3QgYi9Eb2MvdXNpbmcvc2NyaXB0cy5yc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjODc0MTYuLjAwMDAwMDAKLS0tIGEvRG9jL3VzaW5nL3NjcmlwdHMucnN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLi4gX3Rvb2xzLWFuZC1zY3JpcHRzOgotCi1BZGRpdGlvbmFsIFRvb2xzIGFuZCBTY3JpcHRzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS4uIF9zY3JpcHRzLXB5dmVudjoKLQotcHl2ZW52IC0gQ3JlYXRpbmcgdmlydHVhbCBlbnZpcm9ubWVudHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS4uIGluY2x1ZGU6OiB2ZW52LWNyZWF0ZS5pbmMKLQpkaWZmIC0tZ2l0IGEvRG9jL3VzaW5nL3ZlbnYtY3JlYXRlLmluYyBiL0RvYy91c2luZy92ZW52LWNyZWF0ZS5pbmMKaW5kZXggN2FkMzAwOC4uNTNmNDMxYiAxMDA2NDQKLS0tIGEvRG9jL3VzaW5nL3ZlbnYtY3JlYXRlLmluYworKysgYi9Eb2MvdXNpbmcvdmVudi1jcmVhdGUuaW5jCkBAIC0xLDMxICsxLDM5IEBACiBDcmVhdGlvbiBvZiA6cmVmOmB2aXJ0dWFsIGVudmlyb25tZW50cyA8dmVudi1kZWY+YCBpcyBkb25lIGJ5IGV4ZWN1dGluZyB0aGUKLWBgcHl2ZW52YGAgc2NyaXB0OjoKK2NvbW1hbmQgYGB2ZW52YGA6OgogCi0gICAgcHl2ZW52IC9wYXRoL3RvL25ldy92aXJ0dWFsL2Vudmlyb25tZW50CisgICAgcHl0aG9uMyAtbSB2ZW52IC9wYXRoL3RvL25ldy92aXJ0dWFsL2Vudmlyb25tZW50CiAKIFJ1bm5pbmcgdGhpcyBjb21tYW5kIGNyZWF0ZXMgdGhlIHRhcmdldCBkaXJlY3RvcnkgKGNyZWF0aW5nIGFueSBwYXJlbnQKIGRpcmVjdG9yaWVzIHRoYXQgZG9uJ3QgZXhpc3QgYWxyZWFkeSkgYW5kIHBsYWNlcyBhIGBgcHl2ZW52LmNmZ2BgIGZpbGUgaW4gaXQKLXdpdGggYSBgYGhvbWVgYCBrZXkgcG9pbnRpbmcgdG8gdGhlIFB5dGhvbiBpbnN0YWxsYXRpb24gdGhlIGNvbW1hbmQgd2FzIHJ1bgotZnJvbS4gIEl0IGFsc28gY3JlYXRlcyBhIGBgYmluYGAgKG9yIGBgU2NyaXB0c2BgIG9uIFdpbmRvd3MpIHN1YmRpcmVjdG9yeQord2l0aCBhIGBgaG9tZWBgIGtleSBwb2ludGluZyB0byB0aGUgUHl0aG9uIGluc3RhbGxhdGlvbiBmcm9tIHdoaWNoIHRoZSBjb21tYW5kCit3YXMgcnVuLiAgSXQgYWxzbyBjcmVhdGVzIGEgYGBiaW5gYCAob3IgYGBTY3JpcHRzYGAgb24gV2luZG93cykgc3ViZGlyZWN0b3J5CiBjb250YWluaW5nIGEgY29weSBvZiB0aGUgYGBweXRob25gYCBiaW5hcnkgKG9yIGJpbmFyaWVzLCBpbiB0aGUgY2FzZSBvZgogV2luZG93cykuICBJdCBhbHNvIGNyZWF0ZXMgYW4gKGluaXRpYWxseSBlbXB0eSkgYGBsaWIvcHl0aG9uWC5ZL3NpdGUtcGFja2FnZXNgYAogc3ViZGlyZWN0b3J5IChvbiBXaW5kb3dzLCB0aGlzIGlzIGBgTGliXHNpdGUtcGFja2FnZXNgYCkuCiAKKy4uIGRlcHJlY2F0ZWQ6OiAzLjYKKyAgIGBgcHl2ZW52YGAgd2FzIHRoZSByZWNvbW1lbmRlZCB0b29sIGZvciBjcmVhdGluZyB2aXJ0dWFsIGVudmlyb25tZW50cyBmb3IKKyAgIFB5dGhvbiAzLjMgYW5kIDMuNCwgYW5kIGlzIGBkZXByZWNhdGVkIGluIFB5dGhvbiAzLjYKKyAgIDxodHRwczovL2RvY3MucHl0aG9uLm9yZy9kZXYvd2hhdHNuZXcvMy42Lmh0bWwjZGVwcmVjYXRlZC1mZWF0dXJlcz5gXy4KKworLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKKyAgIFRoZSB1c2Ugb2YgYGB2ZW52YGAgaXMgbm93IHJlY29tbWVuZGVkIGZvciBjcmVhdGluZyB2aXJ0dWFsIGVudmlyb25tZW50cy4KKwogLi4gc2VlYWxzbzo6CiAKICAgIGBQeXRob24gUGFja2FnaW5nIFVzZXIgR3VpZGU6IENyZWF0aW5nIGFuZCB1c2luZyB2aXJ0dWFsIGVudmlyb25tZW50cwotICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L2luc3RhbGxpbmcvI2NyZWF0aW5nLXZpcnR1YWwtZW52aXJvbm1lbnRzPmBfXworICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvaW5zdGFsbGluZy8jY3JlYXRpbmctdmlydHVhbC1lbnZpcm9ubWVudHM+YF9fCiAKIC4uIGhpZ2hsaWdodDo6IG5vbmUKIAotT24gV2luZG93cywgeW91IG1heSBoYXZlIHRvIGludm9rZSB0aGUgYGBweXZlbnZgYCBzY3JpcHQgYXMgZm9sbG93cywgaWYgeW91Ci1kb24ndCBoYXZlIHRoZSByZWxldmFudCBQQVRIIGFuZCBQQVRIRVhUIHNldHRpbmdzOjoKK09uIFdpbmRvd3MsIGludm9rZSB0aGUgYGB2ZW52YGAgY29tbWFuZCBhcyBmb2xsb3dzOjoKIAotICAgIGM6XFRlbXA+YzpcUHl0aG9uMzVccHl0aG9uIGM6XFB5dGhvbjM1XFRvb2xzXFNjcmlwdHNccHl2ZW52LnB5IG15ZW52CisgICAgYzpcPmM6XFB5dGhvbjM1XHB5dGhvbiAtbSB2ZW52IGM6XHBhdGhcdG9cbXllbnYKIAotb3IgZXF1aXZhbGVudGx5OjoKK0FsdGVybmF0aXZlbHksIGlmIHlvdSBjb25maWd1cmVkIHRoZSBgYFBBVEhgYCBhbmQgYGBQQVRIRVhUYGAgdmFyaWFibGVzIGZvcgoreW91ciA6cmVmOmBQeXRob24gaW5zdGFsbGF0aW9uIDx1c2luZy1vbi13aW5kb3dzPmA6OgogCi0gICAgYzpcVGVtcD5jOlxQeXRob24zNVxweXRob24gLW0gdmVudiBteWVudgorICAgIGM6XD5weXRob24gLW0gdmVudiBteWVudiBjOlxwYXRoXHRvXG15ZW52CiAKIFRoZSBjb21tYW5kLCBpZiBydW4gd2l0aCBgYC1oYGAsIHdpbGwgc2hvdyB0aGUgYXZhaWxhYmxlIG9wdGlvbnM6OgogCkBAIC0zNiwyNSArNDQsMjYgQEAKICAgICBDcmVhdGVzIHZpcnR1YWwgUHl0aG9uIGVudmlyb25tZW50cyBpbiBvbmUgb3IgbW9yZSB0YXJnZXQgZGlyZWN0b3JpZXMuCiAKICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKLSAgICAgIEVOVl9ESVIgICAgICAgICAgICAgQSBkaXJlY3RvcnkgdG8gY3JlYXRlIHRoZSBlbnZpcm9ubWVudCBpbi4KKyAgICAgIEVOVl9ESVIgICAgICAgICAgICAgICBBIGRpcmVjdG9yeSB0byBjcmVhdGUgdGhlIGVudmlyb25tZW50IGluLgogCiAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgotICAgICAgLWgsIC0taGVscCAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0Ci0gICAgICAtLXN5c3RlbS1zaXRlLXBhY2thZ2VzIEdpdmUgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQgYWNjZXNzIHRvIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZS1wYWNrYWdlcyBkaXIuCi0gICAgICAtLXN5bWxpbmtzICAgICAgICAgICAgIFRyeSB0byB1c2Ugc3ltbGlua3MgcmF0aGVyIHRoYW4gY29waWVzLCB3aGVuIHN5bWxpbmtzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBub3QgdGhlIGRlZmF1bHQgZm9yIHRoZSBwbGF0Zm9ybS4KLSAgICAgIC0tY29waWVzICAgICAgICAgICAgICAgVHJ5IHRvIHVzZSBjb3BpZXMgcmF0aGVyIHRoYW4gc3ltbGlua3MsIGV2ZW4gd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1saW5rcyBhcmUgdGhlIGRlZmF1bHQgZm9yIHRoZSBwbGF0Zm9ybS4KLSAgICAgIC0tY2xlYXIgICAgICAgICAgICAgICAgRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgZGlyZWN0b3J5IGlmIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3RzLCBiZWZvcmUgZW52aXJvbm1lbnQgY3JlYXRpb24uCi0gICAgICAtLXVwZ3JhZGUgICAgICAgICAgICAgIFVwZ3JhZGUgdGhlIGVudmlyb25tZW50IGRpcmVjdG9yeSB0byB1c2UgdGhpcyB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFB5dGhvbiwgYXNzdW1pbmcgUHl0aG9uIGhhcyBiZWVuIHVwZ3JhZGVkIGluLXBsYWNlLgotICAgICAgLS13aXRob3V0LXBpcCAgICAgICAgICBTa2lwcyBpbnN0YWxsaW5nIG9yIHVwZ3JhZGluZyBwaXAgaW4gdGhlIHZpcnR1YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgKHBpcCBpcyBib290c3RyYXBwZWQgYnkgZGVmYXVsdCkKKyAgICAgIC1oLCAtLWhlbHAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAtLXN5c3RlbS1zaXRlLXBhY2thZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2l2ZSB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCBhY2Nlc3MgdG8gdGhlIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGUtcGFja2FnZXMgZGlyLgorICAgICAgLS1zeW1saW5rcyAgICAgICAgICAgIFRyeSB0byB1c2Ugc3ltbGlua3MgcmF0aGVyIHRoYW4gY29waWVzLCB3aGVuIHN5bWxpbmtzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG5vdCB0aGUgZGVmYXVsdCBmb3IgdGhlIHBsYXRmb3JtLgorICAgICAgLS1jb3BpZXMgICAgICAgICAgICAgIFRyeSB0byB1c2UgY29waWVzIHJhdGhlciB0aGFuIHN5bWxpbmtzLCBldmVuIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1saW5rcyBhcmUgdGhlIGRlZmF1bHQgZm9yIHRoZSBwbGF0Zm9ybS4KKyAgICAgIC0tY2xlYXIgICAgICAgICAgICAgICBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCBkaXJlY3RvcnkgaWYgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGV4aXN0cywgYmVmb3JlIGVudmlyb25tZW50IGNyZWF0aW9uLgorICAgICAgLS11cGdyYWRlICAgICAgICAgICAgIFVwZ3JhZGUgdGhlIGVudmlyb25tZW50IGRpcmVjdG9yeSB0byB1c2UgdGhpcyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgUHl0aG9uLCBhc3N1bWluZyBQeXRob24gaGFzIGJlZW4gdXBncmFkZWQgaW4tcGxhY2UuCisgICAgICAtLXdpdGhvdXQtcGlwICAgICAgICAgU2tpcHMgaW5zdGFsbGluZyBvciB1cGdyYWRpbmcgcGlwIGluIHRoZSB2aXJ0dWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgKHBpcCBpcyBib290c3RyYXBwZWQgYnkgZGVmYXVsdCkKIAotRGVwZW5kaW5nIG9uIGhvdyB0aGUgYGB2ZW52YGAgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBpbnZva2VkLCB0aGUgdXNhZ2UgbWVzc2FnZQotbWF5IHZhcnkgc2xpZ2h0bHksIGUuZy4gcmVmZXJlbmNpbmcgYGBweXZlbnZgYCByYXRoZXIgdGhhbiBgYHZlbnZgYC4KKyAgICBPbmNlIGFuIGVudmlyb25tZW50IGhhcyBiZWVuIGNyZWF0ZWQsIHlvdSBtYXkgd2lzaCB0byBhY3RpdmF0ZSBpdCwgZS5nLiBieQorICAgIHNvdXJjaW5nIGFuIGFjdGl2YXRlIHNjcmlwdCBpbiBpdHMgYmluIGRpcmVjdG9yeS4KIAogLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjQKICAgIEluc3RhbGxzIHBpcCBieSBkZWZhdWx0LCBhZGRlZCB0aGUgYGAtLXdpdGhvdXQtcGlwYGAgIGFuZCBgYC0tY29waWVzYGAKQEAgLTczLDEyICs4MiwxMyBAQAogVW5sZXNzIHRoZSBgYC0td2l0aG91dC1waXBgYCBvcHRpb24gaXMgZ2l2ZW4sIDptb2Q6YGVuc3VyZXBpcGAgd2lsbCBiZQogaW52b2tlZCB0byBib290c3RyYXAgYGBwaXBgYCBpbnRvIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50LgogCi1NdWx0aXBsZSBwYXRocyBjYW4gYmUgZ2l2ZW4gdG8gYGBweXZlbnZgYCwgaW4gd2hpY2ggY2FzZSBhbiBpZGVudGljYWwKLXZpcnR1YWxlbnYgd2lsbCBiZSBjcmVhdGVkLCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIG9wdGlvbnMsIGF0IGVhY2gKLXByb3ZpZGVkIHBhdGguCitNdWx0aXBsZSBwYXRocyBjYW4gYmUgZ2l2ZW4gdG8gYGB2ZW52YGAsIGluIHdoaWNoIGNhc2UgYW4gaWRlbnRpY2FsIHZpcnR1YWwKK2Vudmlyb25tZW50IHdpbGwgYmUgY3JlYXRlZCwgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBvcHRpb25zLCBhdCBlYWNoIHByb3ZpZGVkCitwYXRoLgogCi1PbmNlIGEgdmVudiBoYXMgYmVlbiBjcmVhdGVkLCBpdCBjYW4gYmUgImFjdGl2YXRlZCIgdXNpbmcgYSBzY3JpcHQgaW4gdGhlCi12ZW52J3MgYmluYXJ5IGRpcmVjdG9yeS4gVGhlIGludm9jYXRpb24gb2YgdGhlIHNjcmlwdCBpcyBwbGF0Zm9ybS1zcGVjaWZpYzoKK09uY2UgYSB2aXJ0dWFsIGVudmlyb25tZW50IGhhcyBiZWVuIGNyZWF0ZWQsIGl0IGNhbiBiZSAiYWN0aXZhdGVkIiB1c2luZyBhCitzY3JpcHQgaW4gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQncyBiaW5hcnkgZGlyZWN0b3J5LiBUaGUgaW52b2NhdGlvbiBvZiB0aGUKK3NjcmlwdCBpcyBwbGF0Zm9ybS1zcGVjaWZpYzoKIAogKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiB8IFBsYXRmb3JtICAgIHwgU2hlbGwgICAgICAgICAgIHwgQ29tbWFuZCB0byBhY3RpdmF0ZSB2aXJ0dWFsIGVudmlyb25tZW50IHwKQEAgLTk1LDE2ICsxMDUsMTcgQEAKICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCiBZb3UgZG9uJ3Qgc3BlY2lmaWNhbGx5ICpuZWVkKiB0byBhY3RpdmF0ZSBhbiBlbnZpcm9ubWVudDsgYWN0aXZhdGlvbiBqdXN0Ci1wcmVwZW5kcyB0aGUgdmVudidzIGJpbmFyeSBkaXJlY3RvcnkgdG8geW91ciBwYXRoLCBzbyB0aGF0ICJweXRob24iIGludm9rZXMgdGhlCi12ZW52J3MgUHl0aG9uIGludGVycHJldGVyIGFuZCB5b3UgY2FuIHJ1biBpbnN0YWxsZWQgc2NyaXB0cyB3aXRob3V0IGhhdmluZyB0bwotdXNlIHRoZWlyIGZ1bGwgcGF0aC4gSG93ZXZlciwgYWxsIHNjcmlwdHMgaW5zdGFsbGVkIGluIGEgdmVudiBzaG91bGQgYmUKLXJ1bm5hYmxlIHdpdGhvdXQgYWN0aXZhdGluZyBpdCwgYW5kIHJ1biB3aXRoIHRoZSB2ZW52J3MgUHl0aG9uIGF1dG9tYXRpY2FsbHkuCitwcmVwZW5kcyB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCdzIGJpbmFyeSBkaXJlY3RvcnkgdG8geW91ciBwYXRoLCBzbyB0aGF0CisicHl0aG9uIiBpbnZva2VzIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50J3MgUHl0aG9uIGludGVycHJldGVyIGFuZCB5b3UgY2FuIHJ1bgoraW5zdGFsbGVkIHNjcmlwdHMgd2l0aG91dCBoYXZpbmcgdG8gdXNlIHRoZWlyIGZ1bGwgcGF0aC4gSG93ZXZlciwgYWxsIHNjcmlwdHMKK2luc3RhbGxlZCBpbiBhIHZpcnR1YWwgZW52aXJvbm1lbnQgc2hvdWxkIGJlIHJ1bm5hYmxlIHdpdGhvdXQgYWN0aXZhdGluZyBpdCwKK2FuZCBydW4gd2l0aCB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCdzIFB5dGhvbiBhdXRvbWF0aWNhbGx5LgogCi1Zb3UgY2FuIGRlYWN0aXZhdGUgYSB2ZW52IGJ5IHR5cGluZyAiZGVhY3RpdmF0ZSIgaW4geW91ciBzaGVsbC4gVGhlIGV4YWN0Ci1tZWNoYW5pc20gaXMgcGxhdGZvcm0tc3BlY2lmaWM6IGZvciBleGFtcGxlLCB0aGUgQmFzaCBhY3RpdmF0aW9uIHNjcmlwdCBkZWZpbmVzCi1hICJkZWFjdGl2YXRlIiBmdW5jdGlvbiwgd2hlcmVhcyBvbiBXaW5kb3dzIHRoZXJlIGFyZSBzZXBhcmF0ZSBzY3JpcHRzIGNhbGxlZAotYGBkZWFjdGl2YXRlLmJhdGBgIGFuZCBgYERlYWN0aXZhdGUucHMxYGAgd2hpY2ggYXJlIGluc3RhbGxlZCB3aGVuIHRoZSB2ZW52IGlzCi1jcmVhdGVkLgorWW91IGNhbiBkZWFjdGl2YXRlIGEgdmlydHVhbCBlbnZpcm9ubWVudCBieSB0eXBpbmcgImRlYWN0aXZhdGUiIGluIHlvdXIgc2hlbGwuCitUaGUgZXhhY3QgbWVjaGFuaXNtIGlzIHBsYXRmb3JtLXNwZWNpZmljOiBmb3IgZXhhbXBsZSwgdGhlIEJhc2ggYWN0aXZhdGlvbgorc2NyaXB0IGRlZmluZXMgYSAiZGVhY3RpdmF0ZSIgZnVuY3Rpb24sIHdoZXJlYXMgb24gV2luZG93cyB0aGVyZSBhcmUgc2VwYXJhdGUKK3NjcmlwdHMgY2FsbGVkIGBgZGVhY3RpdmF0ZS5iYXRgYCBhbmQgYGBEZWFjdGl2YXRlLnBzMWBgIHdoaWNoIGFyZSBpbnN0YWxsZWQKK3doZW4gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQgaXMgY3JlYXRlZC4KIAogLi4gdmVyc2lvbmFkZGVkOjogMy40CiAgICBgYGZpc2hgYCBhbmQgYGBjc2hgYCBhY3RpdmF0aW9uIHNjcmlwdHMuCmRpZmYgLS1naXQgYS9Eb2MvdXNpbmcvd2luZG93cy5yc3QgYi9Eb2MvdXNpbmcvd2luZG93cy5yc3QKaW5kZXggYTRhNmEzMC4uNjVjNGI5NSAxMDA2NDQKLS0tIGEvRG9jL3VzaW5nL3dpbmRvd3MucnN0CisrKyBiL0RvYy91c2luZy93aW5kb3dzLnJzdApAQCAtMjksMTUgKzI5LDE1IEBACiAKIEFzIHNwZWNpZmllZCBpbiA6cGVwOmAxMWAsIGEgUHl0aG9uIHJlbGVhc2Ugb25seSBzdXBwb3J0cyBhIFdpbmRvd3MgcGxhdGZvcm0KIHdoaWxlIE1pY3Jvc29mdCBjb25zaWRlcnMgdGhlIHBsYXRmb3JtIHVuZGVyIGV4dGVuZGVkIHN1cHBvcnQuIFRoaXMgbWVhbnMgdGhhdAotUHl0aG9uIDMuNSBzdXBwb3J0cyBXaW5kb3dzIFZpc3RhIGFuZCBuZXdlci4gSWYgeW91IHJlcXVpcmUgV2luZG93cyBYUCBzdXBwb3J0Ci10aGVuIHBsZWFzZSBpbnN0YWxsIFB5dGhvbiAzLjQuCitQeXRob24gfHZlcnNpb258IHN1cHBvcnRzIFdpbmRvd3MgVmlzdGEgYW5kIG5ld2VyLiBJZiB5b3UgcmVxdWlyZSBXaW5kb3dzIFhQCitzdXBwb3J0IHRoZW4gcGxlYXNlIGluc3RhbGwgUHl0aG9uIDMuNC4KIAogSW5zdGFsbGF0aW9uIFN0ZXBzCiAtLS0tLS0tLS0tLS0tLS0tLS0KIAotRm91ciBQeXRob24gMy41IGluc3RhbGxlcnMgYXJlIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgLSB0d28gZWFjaCBmb3IgdGhlIDMyLWJpdAotYW5kIDY0LWJpdCB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJwcmV0ZXIuIFRoZSAqd2ViIGluc3RhbGxlciogaXMgYSBzbWFsbCBpbml0aWFsCi1kb3dubG9hZCwgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBkb3dubG9hZCB0aGUgcmVxdWlyZWQgY29tcG9uZW50cyBhcworRm91ciBQeXRob24gfHZlcnNpb258IGluc3RhbGxlcnMgYXJlIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgLSB0d28gZWFjaCBmb3IgdGhlCiszMi1iaXQgYW5kIDY0LWJpdCB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJwcmV0ZXIuIFRoZSAqd2ViIGluc3RhbGxlciogaXMgYSBzbWFsbAoraW5pdGlhbCBkb3dubG9hZCwgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBkb3dubG9hZCB0aGUgcmVxdWlyZWQgY29tcG9uZW50cyBhcwogbmVjZXNzYXJ5LiBUaGUgKm9mZmxpbmUgaW5zdGFsbGVyKiBpbmNsdWRlcyB0aGUgY29tcG9uZW50cyBuZWNlc3NhcnkgZm9yIGEKIGRlZmF1bHQgaW5zdGFsbGF0aW9uIGFuZCBvbmx5IHJlcXVpcmVzIGFuIGludGVybmV0IGNvbm5lY3Rpb24gZm9yIG9wdGlvbmFsCiBmZWF0dXJlcy4gU2VlIDpyZWY6YGluc3RhbGwtbGF5b3V0LW9wdGlvbmAgZm9yIG90aGVyIHdheXMgdG8gYXZvaWQgZG93bmxvYWRpbmcKQEAgLTc0LDYgKzc0LDMxIEBACiAqIElmIHNlbGVjdGVkLCB0aGUgaW5zdGFsbCBkaXJlY3Rvcnkgd2lsbCBiZSBhZGRlZCB0byB0aGUgc3lzdGVtIDplbnZ2YXI6YFBBVEhgCiAqIFNob3J0Y3V0cyBhcmUgYXZhaWxhYmxlIGZvciBhbGwgdXNlcnMKIAorLi4gX21heC1wYXRoOgorCitSZW1vdmluZyB0aGUgTUFYX1BBVEggTGltaXRhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2luZG93cyBoaXN0b3JpY2FsbHkgaGFzIGxpbWl0ZWQgcGF0aCBsZW5ndGhzIHRvIDI2MCBjaGFyYWN0ZXJzLiBUaGlzIG1lYW50IHRoYXQKK3BhdGhzIGxvbmdlciB0aGFuIHRoaXMgd291bGQgbm90IHJlc29sdmUgYW5kIGVycm9ycyB3b3VsZCByZXN1bHQuCisKK0luIHRoZSBsYXRlc3QgdmVyc2lvbnMgb2YgV2luZG93cywgdGhpcyBsaW1pdGF0aW9uIGNhbiBiZSBleHBhbmRlZCB0bworYXBwcm94aW1hdGVseSAzMiwwMDAgY2hhcmFjdGVycy4gWW91ciBhZG1pbmlzdHJhdG9yIHdpbGwgbmVlZCB0byBhY3RpdmF0ZSB0aGUKKyJFbmFibGUgV2luMzIgbG9uZyBwYXRocyIgZ3JvdXAgcG9saWN5LCBvciBzZXQgdGhlIHJlZ2lzdHJ5IHZhbHVlCitgYEhLRVlfTE9DQUxfTUFDSElORVxTWVNURU1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxGaWxlU3lzdGVtQExvbmdQYXRoc0VuYWJsZWRgYAordG8gYGAxYGAuCisKK1RoaXMgYWxsb3dzIHRoZSA6ZnVuYzpgb3BlbmAgZnVuY3Rpb24sIHRoZSA6bW9kOmBvc2AgbW9kdWxlIGFuZCBtb3N0IG90aGVyCitwYXRoIGZ1bmN0aW9uYWxpdHkgdG8gYWNjZXB0IGFuZCByZXR1cm4gcGF0aHMgbG9uZ2VyIHRoYW4gMjYwIGNoYXJhY3RlcnMgd2hlbgordXNpbmcgc3RyaW5ncy4gKFVzZSBvZiBieXRlcyBhcyBwYXRocyBpcyBkZXByZWNhdGVkIG9uIFdpbmRvd3MsIGFuZCB0aGlzIGZlYXR1cmUKK2lzIG5vdCBhdmFpbGFibGUgd2hlbiB1c2luZyBieXRlcy4pCisKK0FmdGVyIGNoYW5naW5nIHRoZSBhYm92ZSBvcHRpb24sIG5vIGZ1cnRoZXIgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZC4KKworLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKworICAgU3VwcG9ydCBmb3IgbG9uZyBwYXRocyB3YXMgZW5hYmxlZCBpbiBQeXRob24uCisKIC4uIF9pbnN0YWxsLXF1aWV0LW9wdGlvbjoKIAogSW5zdGFsbGluZyBXaXRob3V0IFVJCkBAIC0xNjgsMTMgKzE5MywxMyBAQAogRm9yIGV4YW1wbGUsIHRvIHNpbGVudGx5IGluc3RhbGwgYSBkZWZhdWx0LCBzeXN0ZW0td2lkZSBQeXRob24gaW5zdGFsbGF0aW9uLAogeW91IGNvdWxkIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgKGZyb20gYW4gZWxldmF0ZWQgY29tbWFuZCBwcm9tcHQpOjoKIAotICAgIHB5dGhvbi0zLjUuMC5leGUgL3F1aWV0IEluc3RhbGxBbGxVc2Vycz0xIFByZXBlbmRQYXRoPTEgSW5jbHVkZV90ZXN0PTAKKyAgICBweXRob24tMy42LjAuZXhlIC9xdWlldCBJbnN0YWxsQWxsVXNlcnM9MSBQcmVwZW5kUGF0aD0xIEluY2x1ZGVfdGVzdD0wCiAKIFRvIGFsbG93IHVzZXJzIHRvIGVhc2lseSBpbnN0YWxsIGEgcGVyc29uYWwgY29weSBvZiBQeXRob24gd2l0aG91dCB0aGUgdGVzdAogc3VpdGUsIHlvdSBjb3VsZCBwcm92aWRlIGEgc2hvcnRjdXQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQuIFRoaXMgd2lsbAogZGlzcGxheSBhIHNpbXBsaWZpZWQgaW5pdGlhbCBwYWdlIGFuZCBkaXNhbGxvdyBjdXN0b21pemF0aW9uOjoKIAotICAgIHB5dGhvbi0zLjUuMC5leGUgSW5zdGFsbEFsbFVzZXJzPTAgSW5jbHVkZV9sYXVuY2hlcj0wIEluY2x1ZGVfdGVzdD0wCisgICAgcHl0aG9uLTMuNi4wLmV4ZSBJbnN0YWxsQWxsVXNlcnM9MCBJbmNsdWRlX2xhdW5jaGVyPTAgSW5jbHVkZV90ZXN0PTAKICAgICAgICAgU2ltcGxlSW5zdGFsbD0xIFNpbXBsZUluc3RhbGxEZXNjcmlwdGlvbj0iSnVzdCBmb3IgbWUsIG5vIHRlc3Qgc3VpdGUuIgogCiAoTm90ZSB0aGF0IG9taXR0aW5nIHRoZSBsYXVuY2hlciBhbHNvIG9taXRzIGZpbGUgYXNzb2NpYXRpb25zLCBhbmQgaXMgb25seQpAQCAtMjA5LDEzICsyMzQsMTMgQEAKIHVzZWZ1bCB0byBoYXZlIGEgbG9jYWxseSBjYWNoZWQgY29weS4KIAogRXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgZnJvbSBDb21tYW5kIFByb21wdCB0byBkb3dubG9hZCBhbGwgcG9zc2libGUKLXJlcXVpcmVkIGZpbGVzLiAgUmVtZW1iZXIgdG8gc3Vic3RpdHV0ZSBgYHB5dGhvbi0zLjUuMC5leGVgYCBmb3IgdGhlIGFjdHVhbAorcmVxdWlyZWQgZmlsZXMuICBSZW1lbWJlciB0byBzdWJzdGl0dXRlIGBgcHl0aG9uLTMuNi4wLmV4ZWBgIGZvciB0aGUgYWN0dWFsCiBuYW1lIG9mIHlvdXIgaW5zdGFsbGVyLCBhbmQgdG8gY3JlYXRlIGxheW91dHMgaW4gdGhlaXIgb3duIGRpcmVjdG9yaWVzIHRvCiBhdm9pZCBjb2xsaXNpb25zIGJldHdlZW4gZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lLgogCiA6OgogCi0gICAgcHl0aG9uLTMuNS4wLmV4ZSAvbGF5b3V0IFtvcHRpb25hbCB0YXJnZXQgZGlyZWN0b3J5XQorICAgIHB5dGhvbi0zLjYuMC5leGUgL2xheW91dCBbb3B0aW9uYWwgdGFyZ2V0IGRpcmVjdG9yeV0KIAogWW91IG1heSBhbHNvIHNwZWNpZnkgdGhlIGBgL3F1aWV0YGAgb3B0aW9uIHRvIGhpZGUgdGhlIHByb2dyZXNzIGRpc3BsYXkuCiAKQEAgLTMyMCw3ICszNDUsNyBAQAogVG8gdGVtcG9yYXJpbHkgc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcywgb3BlbiBDb21tYW5kIFByb21wdCBhbmQgdXNlIHRoZQogOmNvbW1hbmQ6YHNldGAgY29tbWFuZDo6CiAKLSAgICBDOlw+c2V0IFBBVEg9QzpcUHJvZ3JhbSBGaWxlc1xQeXRob24gMy41OyVQQVRIJQorICAgIEM6XD5zZXQgUEFUSD1DOlxQcm9ncmFtIEZpbGVzXFB5dGhvbiAzLjY7JVBBVEglCiAgICAgQzpcPnNldCBQWVRIT05QQVRIPSVQWVRIT05QQVRIJTtDOlxNeV9weXRob25fbGliCiAgICAgQzpcPnB5dGhvbgogCkBAIC0zNzYsMTAgKzQwMSwxMCBAQAogCiBCZXNpZGVzIHVzaW5nIHRoZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgc3RhcnQgbWVudSBlbnRyeSBmb3IgdGhlIFB5dGhvbgogaW50ZXJwcmV0ZXIsIHlvdSBtaWdodCB3YW50IHRvIHN0YXJ0IFB5dGhvbiBpbiB0aGUgY29tbWFuZCBwcm9tcHQuIFRoZQotaW5zdGFsbGVyIGZvciBQeXRob24gMy41IGFuZCBsYXRlciBoYXMgYW4gb3B0aW9uIHRvIHNldCB0aGF0IHVwIGZvciB5b3UuCitpbnN0YWxsZXIgaGFzIGFuIG9wdGlvbiB0byBzZXQgdGhhdCB1cCBmb3IgeW91LgogCi1PbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgaW5zdGFsbGVyLCBhbiBvcHRpb24gbGFiZWxsZWQgIkFkZCBQeXRob24gMy41IHRvCi1QQVRIIiBjYW4gYmUgc2VsZWN0ZWQgdG8gaGF2ZSB0aGUgaW5zdGFsbGVyIGFkZCB0aGUgaW5zdGFsbCBsb2NhdGlvbiBpbnRvIHRoZQorT24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGluc3RhbGxlciwgYW4gb3B0aW9uIGxhYmVsbGVkICJBZGQgUHl0aG9uIHRvIFBBVEgiCittYXkgYmUgc2VsZWN0ZWQgdG8gaGF2ZSB0aGUgaW5zdGFsbGVyIGFkZCB0aGUgaW5zdGFsbCBsb2NhdGlvbiBpbnRvIHRoZQogOmVudnZhcjpgUEFUSGAuICBUaGUgbG9jYXRpb24gb2YgdGhlIDpmaWxlOmBTY3JpcHRzXFxgIGZvbGRlciBpcyBhbHNvIGFkZGVkLgogVGhpcyBhbGxvd3MgeW91IHRvIHR5cGUgOmNvbW1hbmQ6YHB5dGhvbmAgdG8gcnVuIHRoZSBpbnRlcnByZXRlciwgYW5kCiA6Y29tbWFuZDpgcGlwYCBmb3IgdGhlIHBhY2thZ2UgaW5zdGFsbGVyLiBUaHVzLCB5b3UgY2FuIGFsc28gZXhlY3V0ZSB5b3VyCkBAIC0zOTMsNyArNDE4LDcgQEAKIGV4YW1wbGUgdmFyaWFibGUgY291bGQgbG9vayBsaWtlIHRoaXMgKGFzc3VtaW5nIHRoZSBmaXJzdCB0d28gZW50cmllcyBhbHJlYWR5CiBleGlzdGVkKTo6CiAKLSAgICBDOlxXSU5ET1dTXHN5c3RlbTMyO0M6XFdJTkRPV1M7QzpcUHJvZ3JhbSBGaWxlc1xQeXRob24gMy41CisgICAgQzpcV0lORE9XU1xzeXN0ZW0zMjtDOlxXSU5ET1dTO0M6XFByb2dyYW0gRmlsZXNcUHl0aG9uIDMuNgogCiAuLiBfbGF1bmNoZXI6CiAKQEAgLTQxOCw2ICs0NDMsOCBAQAogRnJvbSB0aGUgY29tbWFuZC1saW5lCiBeXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAorLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKwogU3lzdGVtLXdpZGUgaW5zdGFsbGF0aW9ucyBvZiBQeXRob24gMy4zIGFuZCBsYXRlciB3aWxsIHB1dCB0aGUgbGF1bmNoZXIgb24geW91cgogOmVudnZhcjpgUEFUSGAuIFRoZSBsYXVuY2hlciBpcyBjb21wYXRpYmxlIHdpdGggYWxsIGF2YWlsYWJsZSB2ZXJzaW9ucyBvZgogUHl0aG9uLCBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hpY2ggdmVyc2lvbiBpcyBpbnN0YWxsZWQuIFRvIGNoZWNrIHRoYXQgdGhlCkBAIC00MjcsMjUgKzQ1NCwyNiBAQAogCiAgIHB5CiAKLVlvdSBzaG91bGQgZmluZCB0aGF0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBQeXRob24gMi54IHlvdSBoYXZlIGluc3RhbGxlZCBpcworWW91IHNob3VsZCBmaW5kIHRoYXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFB5dGhvbiB5b3UgaGF2ZSBpbnN0YWxsZWQgaXMKIHN0YXJ0ZWQgLSBpdCBjYW4gYmUgZXhpdGVkIGFzIG5vcm1hbCwgYW5kIGFueSBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZQogYXJndW1lbnRzIHNwZWNpZmllZCB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gUHl0aG9uLgogCi1JZiB5b3UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBQeXRob24gMi54IGluc3RhbGxlZCAoZS5nLiwgMi42IGFuZCAyLjcpIHlvdQotd2lsbCBoYXZlIG5vdGljZWQgdGhhdCBQeXRob24gMi43IHdhcyBzdGFydGVkIC0gdG8gbGF1bmNoIFB5dGhvbiAyLjYsIHRyeSB0aGUKK0lmIHlvdSBoYXZlIG11bHRpcGxlIHZlcnNpb25zIG9mIFB5dGhvbiBpbnN0YWxsZWQgKGUuZy4sIDIuNyBhbmQgfHZlcnNpb258KSB5b3UKK3dpbGwgaGF2ZSBub3RpY2VkIHRoYXQgUHl0aG9uIHx2ZXJzaW9ufCB3YXMgc3RhcnRlZCAtIHRvIGxhdW5jaCBQeXRob24gMi43LCB0cnkKK3RoZSBjb21tYW5kOgorCis6OgorCisgIHB5IC0yLjcKKworSWYgeW91IHdhbnQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFB5dGhvbiAyLnggeW91IGhhdmUgaW5zdGFsbGVkLCB0cnkgdGhlCiBjb21tYW5kOgogCiA6OgogCi0gIHB5IC0yLjYKKyAgcHkgLTIKIAotSWYgeW91IGhhdmUgYSBQeXRob24gMy54IGluc3RhbGxlZCwgdHJ5IHRoZSBjb21tYW5kOgotCi06OgotCi0gIHB5IC0zCi0KLVlvdSBzaG91bGQgZmluZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgUHl0aG9uIDMueCBzdGFydHMuCitZb3Ugc2hvdWxkIGZpbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFB5dGhvbiAyLnggc3RhcnRzLgogCiBJZiB5b3Ugc2VlIHRoZSBmb2xsb3dpbmcgZXJyb3IsIHlvdSBkbyBub3QgaGF2ZSB0aGUgbGF1bmNoZXIgaW5zdGFsbGVkOgogCkBAIC01MDAsNiArNTI4LDExIEBACiBmaXJzdCBsaW5lIHRvIGBgIyEgcHl0aG9uMi42YGAgYW5kIHlvdSBzaG91bGQgZmluZCB0aGUgMi42IHZlcnNpb24KIGluZm9ybWF0aW9uIHByaW50ZWQuCiAKK05vdGUgdGhhdCB1bmxpa2UgaW50ZXJhY3RpdmUgdXNlLCBhIGJhcmUgInB5dGhvbiIgd2lsbCB1c2UgdGhlIGxhdGVzdAordmVyc2lvbiBvZiBQeXRob24gMi54IHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkLiAgVGhpcyBpcyBmb3IgYmFja3dhcmQKK2NvbXBhdGliaWxpdHkgYW5kIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVW5peCwgd2hlcmUgdGhlIGNvbW1hbmQgYGBweXRob25gYAordHlwaWNhbGx5IHJlZmVycyB0byBQeXRob24gMi4KKwogRnJvbSBmaWxlIGFzc29jaWF0aW9ucwogXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCkBAIC02ODcsNyArNzIwLDE1IEBACiA6ZmlsZTpgQzpcXFB5dGhvblxcTGliXFxgIGFuZCB0aGlyZC1wYXJ0eSBtb2R1bGVzIHNob3VsZCBiZSBzdG9yZWQgaW4KIDpmaWxlOmBDOlxcUHl0aG9uXFxMaWJcXHNpdGUtcGFja2FnZXNcXGAuCiAKLVRoaXMgaXMgaG93IDpkYXRhOmBzeXMucGF0aGAgaXMgcG9wdWxhdGVkIG9uIFdpbmRvd3M6CitUbyBjb21wbGV0ZWx5IG92ZXJyaWRlIDpkYXRhOmBzeXMucGF0aGAsIGNyZWF0ZSBhIHRleHQgZmlsZSBuYW1lZCBgYCdzeXMucGF0aCdgYAorY29udGFpbmluZyBhIGxpc3Qgb2YgcGF0aHMgYWxvbmdzaWRlIHRoZSBQeXRob24gZXhlY3V0YWJsZS4gVGhpcyB3aWxsIGlnbm9yZSBhbGwKK3JlZ2lzdHJ5IHNldHRpbmdzIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGVuYWJsZSBpc29sYXRlZCBtb2RlLCBkaXNhYmxlCitpbXBvcnRpbmcgOm1vZDpgc2l0ZWAsIGFuZCBmaWxsIDpkYXRhOmBzeXMucGF0aGAgd2l0aCBleGFjdGx5IHRoZSBwYXRocyBsaXN0ZWQKK2luIHRoZSBmaWxlLiBQYXRocyBtYXkgYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQorZmlsZS4KKworV2hlbiB0aGUgYGAnc3lzLnBhdGgnYGAgZmlsZSBpcyBtaXNzaW5nLCB0aGlzIGlzIGhvdyA6ZGF0YTpgc3lzLnBhdGhgIGlzCitwb3B1bGF0ZWQgb24gV2luZG93czoKIAogKiBBbiBlbXB0eSBlbnRyeSBpcyBhZGRlZCBhdCB0aGUgc3RhcnQsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50CiAgIGRpcmVjdG9yeS4KQEAgLTcyMiwxMCArNzYzLDYgQEAKICAgcGF0aCBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIHBhdGggdG8gdGhlIG1haW4gZXhlY3V0YWJsZSB3aGVuIGRlZHVjaW5nIHRoZQogICBob21lIGxvY2F0aW9uLgogCi0qIElmIGBgYXBwbG9jYWxgYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGBgaG9tZWBgIHByb3BlcnR5IG9yIHRoZSBtYWluIGV4ZWN1dGFibGUKLSAgaXMgYWx3YXlzIHVzZWQgYXMgdGhlIGhvbWUgcGF0aCwgYW5kIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgcmVnaXN0cnkKLSAgdmFsdWVzIGFmZmVjdGluZyB0aGUgcGF0aCBhcmUgaWdub3JlZC4gVGhlIGxhbmRtYXJrIGZpbGUgaXMgbm90IGNoZWNrZWQuCi0KIFRoZSBlbmQgcmVzdWx0IG9mIGFsbCB0aGlzIGlzOgogCiAqIFdoZW4gcnVubmluZyA6ZmlsZTpgcHl0aG9uLmV4ZWAsIG9yIGFueSBvdGhlciAuZXhlIGluIHRoZSBtYWluIFB5dGhvbgpAQCAtNzQ0LDEzICs3ODEsMTEgQEAKIEZvciB0aG9zZSB3aG8gd2FudCB0byBidW5kbGUgUHl0aG9uIGludG8gdGhlaXIgYXBwbGljYXRpb24gb3IgZGlzdHJpYnV0aW9uLCB0aGUKIGZvbGxvd2luZyBhZHZpY2Ugd2lsbCBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG90aGVyIGluc3RhbGxhdGlvbnM6CiAKLSogSW5jbHVkZSBhIGBgcHl2ZW52LmNmZ2BgIGZpbGUgYWxvbmdzaWRlIHlvdXIgZXhlY3V0YWJsZSBjb250YWluaW5nCi0gIGBgYXBwbG9jYWwgPSB0cnVlYGAuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB5b3VyIG93biBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkIHRvCi0gIHJlc29sdmUgcGF0aHMgZXZlbiBpZiB5b3UgaGF2ZSBpbmNsdWRlZCB0aGUgc3RhbmRhcmQgbGlicmFyeSBpbiBhIFpJUCBmaWxlLgotICBJdCB3aWxsIGFsc28gaWdub3JlIHVzZXIgc2l0ZS1wYWNrYWdlcyBhbmQgb3RoZXIgcGF0aHMgbGlzdGVkIGluIHRoZQotICByZWdpc3RyeS4KKyogSW5jbHVkZSBhIGBgc3lzLnBhdGhgYCBmaWxlIGFsb25nc2lkZSB5b3VyIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUKKyAgZGlyZWN0b3JpZXMgdG8gaW5jbHVkZS4gVGhpcyB3aWxsIGlnbm9yZSB1c2VyIHNpdGUtcGFja2FnZXMgYW5kIG90aGVyIHBhdGhzCisgIGxpc3RlZCBpbiB0aGUgcmVnaXN0cnkgb3IgaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLgogCi0qIElmIHlvdSBhcmUgbG9hZGluZyA6ZmlsZTpgcHl0aG9uMy5kbGxgIG9yIDpmaWxlOmBweXRob24zNS5kbGxgIGluIHlvdXIgb3duCisqIElmIHlvdSBhcmUgbG9hZGluZyA6ZmlsZTpgcHl0aG9uMy5kbGxgIG9yIDpmaWxlOmBweXRob24zNi5kbGxgIGluIHlvdXIgb3duCiAgIGV4ZWN1dGFibGUsIGV4cGxpY2l0bHkgY2FsbCA6YzpmdW5jOmBQeV9TZXRQYXRoYCBvciAoYXQgbGVhc3QpCiAgIDpjOmZ1bmM6YFB5X1NldFByb2dyYW1OYW1lYCBiZWZvcmUgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAuCiAKQEAgLTc2OCw2ICs4MDMsMTEgQEAKIHRoZSBmaXJzdCBzdWdnZXN0aW9uIGlzIHRoZSBiZXN0LCBhcyB0aGUgb3RoZXIgbWF5IHN0aWxsIGJlIHN1c2NlcHRpYmxlIHRvCiBub24tc3RhbmRhcmQgcGF0aHMgaW4gdGhlIHJlZ2lzdHJ5IGFuZCB1c2VyIHNpdGUtcGFja2FnZXMuCiAKKy4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisKKyAgIEFkZHMgYGBzeXMucGF0aGBgIGZpbGUgc3VwcG9ydCBhbmQgcmVtb3ZlcyBgYGFwcGxvY2FsYGAgb3B0aW9uIGZyb20KKyAgIGBgcHl2ZW52LmNmZ2BgLgorCiBBZGRpdGlvbmFsIG1vZHVsZXMKID09PT09PT09PT09PT09PT09PQogCkBAIC04NjcsNyArOTA3LDcgQEAKIFdoZW4gZXh0cmFjdGVkLCB0aGUgZW1iZWRkZWQgZGlzdHJpYnV0aW9uIGlzIChhbG1vc3QpIGZ1bGx5IGlzb2xhdGVkIGZyb20gdGhlCiB1c2VyJ3Mgc3lzdGVtLCBpbmNsdWRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBzeXN0ZW0gcmVnaXN0cnkgc2V0dGluZ3MsIGFuZAogaW5zdGFsbGVkIHBhY2thZ2VzLiBUaGUgc3RhbmRhcmQgbGlicmFyeSBpcyBpbmNsdWRlZCBhcyBwcmUtY29tcGlsZWQgYW5kCi1vcHRpbWl6ZWQgYGAucHljYGAgZmlsZXMgaW4gYSBaSVAsIGFuZCBgYHB5dGhvbjMuZGxsYGAsIGBgcHl0aG9uMzUuZGxsYGAsCitvcHRpbWl6ZWQgYGAucHljYGAgZmlsZXMgaW4gYSBaSVAsIGFuZCBgYHB5dGhvbjMuZGxsYGAsIGBgcHl0aG9uMzYuZGxsYGAsCiBgYHB5dGhvbi5leGVgYCBhbmQgYGBweXRob253LmV4ZWBgIGFyZSBhbGwgcHJvdmlkZWQuIFRjbC90ayAoaW5jbHVkaW5nIGFsbAogZGVwZW5kYW50cywgc3VjaCBhcyBJZGxlKSwgcGlwIGFuZCB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gYXJlIG5vdCBpbmNsdWRlZC4KIApkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzIuMS5yc3QgYi9Eb2Mvd2hhdHNuZXcvMi4xLnJzdAppbmRleCAwNjM2NmI4Li42YWFlNzI2IDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvMi4xLnJzdAorKysgYi9Eb2Mvd2hhdHNuZXcvMi4xLnJzdApAQCAtMzY3LDcgKzM2Nyw3IEBACiAKIFRoaXMgdmVyc2lvbiB3b3JrcyBmb3Igc2ltcGxlIHRoaW5ncyBzdWNoIGFzIGludGVnZXJzLCBidXQgaXQgaGFzIGEgc2lkZSBlZmZlY3Q7CiB0aGUgYGBfY2FjaGVgYCBkaWN0aW9uYXJ5IGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm4gdmFsdWVzLCBzbyB0aGV5J2xsCi1uZXZlciBiZSBkZWFsbG9jYXRlZCB1bnRpbCB0aGUgUHl0aG9uIHByb2Nlc3MgZXhpdHMgYW5kIGNsZWFucyB1cCBUaGlzIGlzbid0CituZXZlciBiZSBkZWFsbG9jYXRlZCB1bnRpbCB0aGUgUHl0aG9uIHByb2Nlc3MgZXhpdHMgYW5kIGNsZWFucyB1cC4gVGhpcyBpc24ndAogdmVyeSBub3RpY2VhYmxlIGZvciBpbnRlZ2VycywgYnV0IGlmIDpmdW5jOmBmYCByZXR1cm5zIGFuIG9iamVjdCwgb3IgYSBkYXRhCiBzdHJ1Y3R1cmUgdGhhdCB0YWtlcyB1cCBhIGxvdCBvZiBtZW1vcnksIHRoaXMgY2FuIGJlIGEgcHJvYmxlbS4KIApkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzMuMi5yc3QgYi9Eb2Mvd2hhdHNuZXcvMy4yLnJzdAppbmRleCA5ZjM1ODRkLi4zZDIzN2VhIDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvMy4yLnJzdAorKysgYi9Eb2Mvd2hhdHNuZXcvMy4yLnJzdApAQCAtMTI1Myw5ICsxMjUzLDkgQEAKIAogICAgIEBjb250ZXh0bWFuYWdlcgogICAgIGRlZiB0cmFja19lbnRyeV9hbmRfZXhpdChuYW1lKToKLSAgICAgICAgbG9nZ2luZy5pbmZvKCdFbnRlcmluZzoge30nLmZvcm1hdChuYW1lKSkKKyAgICAgICAgbG9nZ2luZy5pbmZvKCdFbnRlcmluZzogJXMnLCBuYW1lKQogICAgICAgICB5aWVsZAotICAgICAgICBsb2dnaW5nLmluZm8oJ0V4aXRpbmc6IHt9Jy5mb3JtYXQobmFtZSkpCisgICAgICAgIGxvZ2dpbmcuaW5mbygnRXhpdGluZzogJXMnLCBuYW1lKQogCiBGb3JtZXJseSwgdGhpcyB3b3VsZCBoYXZlIG9ubHkgYmVlbiB1c2FibGUgYXMgYSBjb250ZXh0IG1hbmFnZXI6OgogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvMy4zLnJzdCBiL0RvYy93aGF0c25ldy8zLjMucnN0CmluZGV4IDFjZmE5MjYuLjQ4YjhhM2IgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy8zLjMucnN0CisrKyBiL0RvYy93aGF0c25ldy8zLjMucnN0CkBAIC0xMDgsNyArMTA4LDcgQEAKIHdpdGggdGhlIGludGVycHJldGVyIGNvcmUuCiAKIFRoaXMgUEVQIGFkZHMgdGhlIDptb2Q6YHZlbnZgIG1vZHVsZSBmb3IgcHJvZ3JhbW1hdGljIGFjY2VzcywgYW5kIHRoZQotOnJlZjpgcHl2ZW52IDxzY3JpcHRzLXB5dmVudj5gIHNjcmlwdCBmb3IgY29tbWFuZC1saW5lIGFjY2VzcyBhbmQKK2BgcHl2ZW52YGAgc2NyaXB0IGZvciBjb21tYW5kLWxpbmUgYWNjZXNzIGFuZAogYWRtaW5pc3RyYXRpb24uICBUaGUgUHl0aG9uIGludGVycHJldGVyIGNoZWNrcyBmb3IgYSBgYHB5dmVudi5jZmdgYCwKIGZpbGUgd2hvc2UgZXhpc3RlbmNlIHNpZ25hbHMgdGhlIGJhc2Ugb2YgYSB2aXJ0dWFsIGVudmlyb25tZW50J3MgZGlyZWN0b3J5CiB0cmVlLgpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzMuNC5yc3QgYi9Eb2Mvd2hhdHNuZXcvMy40LnJzdAppbmRleCAxZTVjOWQxLi43MjM5OGY5IDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvMy40LnJzdAorKysgYi9Eb2Mvd2hhdHNuZXcvMy40LnJzdApAQCAtMTk3LDcgKzE5Nyw3IEBACiBgYHBpcGBgIGNvbW1hbmQgdHlwaWNhbGx5IHJlZmVycyB0byB0aGUgc2VwYXJhdGVseSBpbnN0YWxsZWQgUHl0aG9uIDIKIHZlcnNpb24uCiAKLVRoZSA6cmVmOmBweXZlbnYgPHNjcmlwdHMtcHl2ZW52PmAgY29tbWFuZCBsaW5lIHV0aWxpdHkgYW5kIHRoZSA6bW9kOmB2ZW52YAorVGhlIGBgcHl2ZW52YGAgY29tbWFuZCBsaW5lIHV0aWxpdHkgYW5kIHRoZSA6bW9kOmB2ZW52YAogbW9kdWxlIG1ha2UgdXNlIG9mIHRoZSA6bW9kOmBlbnN1cmVwaXBgIG1vZHVsZSB0byBtYWtlIGBgcGlwYGAgcmVhZGlseQogYXZhaWxhYmxlIGluIHZpcnR1YWwgZW52aXJvbm1lbnRzLiBXaGVuIHVzaW5nIHRoZSBjb21tYW5kIGxpbmUgdXRpbGl0eSwKIGBgcGlwYGAgaXMgaW5zdGFsbGVkIGJ5IGRlZmF1bHQsIHdoaWxlIHdoZW4gdXNpbmcgdGhlIDptb2Q6YHZlbnZgIG1vZHVsZQpAQCAtODI0LDcgKzgyNCw3IEBACiA6dGVybTpgcHJvdmlzaW9uYWwgQVBJYC4gIFRoZXNlIGNsYXNzZXMgcHJvdmlkZSBhIG51bWJlciBvZiBuZXcgbWV0aG9kcyB0aGF0CiBtYWtlIGV4dHJhY3RpbmcgY29udGVudCBmcm9tIGFuZCBpbnNlcnRpbmcgY29udGVudCBpbnRvIGVtYWlsIG1lc3NhZ2VzIG11Y2gKIGVhc2llci4gIEZvciBkZXRhaWxzLCBzZWUgdGhlIDptb2Q6YH5lbWFpbC5jb250ZW50bWFuYWdlcmAgZG9jdW1lbnRhdGlvbiBhbmQKLXRoZSA6cmVmOmBlbWFpbC1jb250ZW50bWFuYWdlci1hcGktZXhhbXBsZXNgLiAgVGhlc2UgQVBJIGFkZGl0aW9ucyBjb21wbGV0ZSB0aGUKK3RoZSA6cmVmOmBlbWFpbC1leGFtcGxlc2AuICBUaGVzZSBBUEkgYWRkaXRpb25zIGNvbXBsZXRlIHRoZQogYnVsayBvZiB0aGUgd29yayB0aGF0IHdhcyBwbGFubmVkIGFzIHBhcnQgb2YgdGhlIGVtYWlsNiBwcm9qZWN0LiAgVGhlIGN1cnJlbnRseQogcHJvdmlzaW9uYWwgQVBJIGlzIHNjaGVkdWxlZCB0byBiZWNvbWUgZmluYWwgaW4gUHl0aG9uIDMuNSAocG9zc2libHkgd2l0aCBhIGZldwogbWlub3IgYWRkaXRpb25zIGluIHRoZSBhcmVhIG9mIGVycm9yIGhhbmRsaW5nKS4gIChDb250cmlidXRlZCBieSBSLiBEYXZpZApAQCAtMTk4OSwxMSArMTk4OSwxMSBAQAogICBTdGlubmVyIHVzaW5nIGhpcyA6cGVwOmA0NDVgLWJhc2VkIGBgcHlmYWlsbWFsbG9jYGAgdG9vbCAoOmlzc3VlOmAxODQwOGAsCiAgIDppc3N1ZTpgMTg1MjBgKS4KIAotKiBUaGUgOnJlZjpgcHl2ZW52IDxzY3JpcHRzLXB5dmVudj5gIGNvbW1hbmQgbm93IGFjY2VwdHMgYSBgYC0tY29waWVzYGAgb3B0aW9uCisqIFRoZSBgYHB5dmVudmBgIGNvbW1hbmQgbm93IGFjY2VwdHMgYSBgYC0tY29waWVzYGAgb3B0aW9uCiAgIHRvIHVzZSBjb3BpZXMgcmF0aGVyIHRoYW4gc3ltbGlua3MgZXZlbiBvbiBzeXN0ZW1zIHdoZXJlIHN5bWxpbmtzIGFyZSB0aGUKICAgZGVmYXVsdC4gIChDb250cmlidXRlZCBieSBWaW5heSBTYWppcCBpbiA6aXNzdWU6YDE4ODA3YC4pCiAKLSogVGhlIDpyZWY6YHB5dmVudiA8c2NyaXB0cy1weXZlbnY+YCBjb21tYW5kIGFsc28gYWNjZXB0cyBhIGBgLS13aXRob3V0LXBpcGBgCisqIFRoZSBgYHB5dmVudmBgIGNvbW1hbmQgYWxzbyBhY2NlcHRzIGEgYGAtLXdpdGhvdXQtcGlwYGAKICAgb3B0aW9uIHRvIHN1cHByZXNzIHRoZSBvdGhlcndpc2UtYXV0b21hdGljIGJvb3RzdHJhcHBpbmcgb2YgcGlwIGludG8KICAgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQuICAoQ29udHJpYnV0ZWQgYnkgTmljayBDb2dobGFuIGluIDppc3N1ZTpgMTk1NTJgCiAgIGFzIHBhcnQgb2YgdGhlIDpwZXA6YDQ1M2AgaW1wbGVtZW50YXRpb24uKQpAQCAtMjQ1OSw3ICsyNDU5LDcgQEAKICAgc3RyZWFtIGluIDptb2Q6YH5pby5UZXh0SU9XcmFwcGVyYCB0byB1c2UgaXRzICpuZXdsaW5lKiBhcmd1bWVudAogICAoOmlzc3VlOmAxNTIwNGApLgogCi0qIElmIHlvdSB1c2UgOnJlZjpgcHl2ZW52IDxzY3JpcHRzLXB5dmVudj5gIGluIGEgc2NyaXB0IGFuZCBkZXNpcmUgdGhhdCBwaXAKKyogSWYgeW91IHVzZSBgYHB5dmVudmBgIGluIGEgc2NyaXB0IGFuZCBkZXNpcmUgdGhhdCBwaXAKICAgKm5vdCogYmUgaW5zdGFsbGVkLCB5b3UgbXVzdCBhZGQgYGAtLXdpdGhvdXQtcGlwYGAgdG8geW91ciBjb21tYW5kCiAgIGludm9jYXRpb24uCiAKZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy8zLjYucnN0IGIvRG9jL3doYXRzbmV3LzMuNi5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwNDU5YQotLS0gL2Rldi9udWxsCisrKyBiL0RvYy93aGF0c25ldy8zLjYucnN0CkBAIC0wLDAgKzEsMTIwOSBAQAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBXaGF0J3MgTmV3IEluIFB5dGhvbiAzLjYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworOlJlbGVhc2U6IHxyZWxlYXNlfAorOkRhdGU6IHx0b2RheXwKKworLi4gUnVsZXMgZm9yIG1haW50ZW5hbmNlOgorCisgICAqIEFueW9uZSBjYW4gYWRkIHRleHQgdG8gdGhpcyBkb2N1bWVudC4gIERvIG5vdCBzcGVuZCB2ZXJ5IG11Y2ggdGltZQorICAgb24gdGhlIHdvcmRpbmcgb2YgeW91ciBjaGFuZ2VzLCBiZWNhdXNlIHlvdXIgdGV4dCB3aWxsIHByb2JhYmx5CisgICBnZXQgcmV3cml0dGVuIHRvIHNvbWUgZGVncmVlLgorCisgICAqIFRoZSBtYWludGFpbmVyIHdpbGwgZ28gdGhyb3VnaCBNaXNjL05FV1MgcGVyaW9kaWNhbGx5IGFuZCBhZGQKKyAgIGNoYW5nZXM7IGl0J3MgdGhlcmVmb3JlIG1vcmUgaW1wb3J0YW50IHRvIGFkZCB5b3VyIGNoYW5nZXMgdG8KKyAgIE1pc2MvTkVXUyB0aGFuIHRvIHRoaXMgZmlsZS4KKworICAgKiBUaGlzIGlzIG5vdCBhIGNvbXBsZXRlIGxpc3Qgb2YgZXZlcnkgc2luZ2xlIGNoYW5nZTsgY29tcGxldGVuZXNzCisgICBpcyB0aGUgcHVycG9zZSBvZiBNaXNjL05FV1MuICBTb21lIGNoYW5nZXMgSSBjb25zaWRlciB0b28gc21hbGwKKyAgIG9yIGVzb3RlcmljIHRvIGluY2x1ZGUuICBJZiBzdWNoIGEgY2hhbmdlIGlzIGFkZGVkIHRvIHRoZSB0ZXh0LAorICAgSSdsbCBqdXN0IHJlbW92ZSBpdC4gIChUaGlzIGlzIGFub3RoZXIgcmVhc29uIHlvdSBzaG91bGRuJ3Qgc3BlbmQKKyAgIHRvbyBtdWNoIHRpbWUgb24gd3JpdGluZyB5b3VyIGFkZGl0aW9uLikKKworICAgKiBJZiB5b3Ugd2FudCB0byBkcmF3IHlvdXIgbmV3IHRleHQgdG8gdGhlIGF0dGVudGlvbiBvZiB0aGUKKyAgIG1haW50YWluZXIsIGFkZCAnWFhYJyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJhZ3JhcGggb3IKKyAgIHNlY3Rpb24uCisKKyAgICogSXQncyBPSyB0byBqdXN0IGFkZCBhIGZyYWdtZW50YXJ5IG5vdGUgYWJvdXQgYSBjaGFuZ2UuICBGb3IKKyAgIGV4YW1wbGU6ICJYWFggRGVzY3JpYmUgdGhlIHRyYW5zbW9ncmlmeSgpIGZ1bmN0aW9uIGFkZGVkIHRvIHRoZQorICAgc29ja2V0IG1vZHVsZS4iICBUaGUgbWFpbnRhaW5lciB3aWxsIHJlc2VhcmNoIHRoZSBjaGFuZ2UgYW5kCisgICB3cml0ZSB0aGUgbmVjZXNzYXJ5IHRleHQuCisKKyAgICogWW91IGNhbiBjb21tZW50IG91dCB5b3VyIGFkZGl0aW9ucyBpZiB5b3UgbGlrZSwgYnV0IGl0J3Mgbm90CisgICBuZWNlc3NhcnkgKGVzcGVjaWFsbHkgd2hlbiBhIGZpbmFsIHJlbGVhc2UgaXMgc29tZSBtb250aHMgYXdheSkuCisKKyAgICogQ3JlZGl0IHRoZSBhdXRob3Igb2YgYSBwYXRjaCBvciBidWdmaXguICAgSnVzdCB0aGUgbmFtZSBpcworICAgc3VmZmljaWVudDsgdGhlIGUtbWFpbCBhZGRyZXNzIGlzbid0IG5lY2Vzc2FyeS4KKworICAgKiBJdCdzIGhlbHBmdWwgdG8gYWRkIHRoZSBidWcvcGF0Y2ggbnVtYmVyIGFzIGEgY29tbWVudDoKKworICAgWFhYIERlc2NyaWJlIHRoZSB0cmFuc21vZ3JpZnkoKSBmdW5jdGlvbiBhZGRlZCB0byB0aGUgc29ja2V0CisgICBtb2R1bGUuCisgICAoQ29udHJpYnV0ZWQgYnkgUC5ZLiBEZXZlbG9wZXIgaW4gOmlzc3VlOmAxMjM0NWAuKQorCisgICBUaGlzIHNhdmVzIHRoZSBtYWludGFpbmVyIHRoZSBlZmZvcnQgb2YgZ29pbmcgdGhyb3VnaCB0aGUgTWVyY3VyaWFsIGxvZworICAgd2hlbiByZXNlYXJjaGluZyBhIGNoYW5nZS4KKworVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHRoZSBuZXcgZmVhdHVyZXMgaW4gUHl0aG9uIDMuNiwgY29tcGFyZWQgdG8gMy41LgorCitGb3IgZnVsbCBkZXRhaWxzLCBzZWUgdGhlIDpzb3VyY2U6YE1pc2MvTkVXU2AgZmlsZS4KKworLi4gbm90ZTo6CisKKyAgIFByZXJlbGVhc2UgdXNlcnMgc2hvdWxkIGJlIGF3YXJlIHRoYXQgdGhpcyBkb2N1bWVudCBpcyBjdXJyZW50bHkgaW4gZHJhZnQKKyAgIGZvcm0uIEl0IHdpbGwgYmUgdXBkYXRlZCBzdWJzdGFudGlhbGx5IGFzIFB5dGhvbiAzLjYgbW92ZXMgdG93YXJkcyByZWxlYXNlLAorICAgc28gaXQncyB3b3J0aCBjaGVja2luZyBiYWNrIGV2ZW4gYWZ0ZXIgcmVhZGluZyBlYXJsaWVyIHZlcnNpb25zLgorCisKK1N1bW1hcnkgLS0gUmVsZWFzZSBoaWdobGlnaHRzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisuLiBUaGlzIHNlY3Rpb24gc2luZ2xlcyBvdXQgdGhlIG1vc3QgaW1wb3J0YW50IGNoYW5nZXMgaW4gUHl0aG9uIDMuNi4KKyAgIEJyZXZpdHkgaXMga2V5LgorCitOZXcgc3ludGF4IGZlYXR1cmVzOgorCisqIEEgYGBnbG9iYWxgYCBvciBgYG5vbmxvY2FsYGAgc3RhdGVtZW50IG11c3Qgbm93IHRleHR1YWxseSBhcHBlYXIKKyAgYmVmb3JlIHRoZSBmaXJzdCB1c2Ugb2YgdGhlIGFmZmVjdGVkIG5hbWUgaW4gdGhlIHNhbWUgc2NvcGUuCisgIFByZXZpb3VzbHkgdGhpcyB3YXMgYSBTeW50YXhXYXJuaW5nLgorCisqIFBFUCA0OTg6IDpyZWY6YEZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgPHdoYXRzbmV3LWZzdHJpbmdzPmAKKworKiBQRVAgNTE1OiBVbmRlcnNjb3JlcyBpbiBOdW1lcmljIExpdGVyYWxzCisKKyogUEVQIDUyNjogU3ludGF4IGZvciBWYXJpYWJsZSBBbm5vdGF0aW9ucworCisqIFBFUCA1MjU6IEFzeW5jaHJvbm91cyBHZW5lcmF0b3JzCisKKyogUEVQIDUzMDogQXN5bmNocm9ub3VzIENvbXByZWhlbnNpb25zCisKK1N0YW5kYXJkIGxpYnJhcnkgaW1wcm92ZW1lbnRzOgorCitTZWN1cml0eSBpbXByb3ZlbWVudHM6CisKKyogT24gTGludXgsIDpmdW5jOmBvcy51cmFuZG9tYCBub3cgYmxvY2tzIHVudGlsIHRoZSBzeXN0ZW0gdXJhbmRvbSBlbnRyb3B5IHBvb2wKKyAgaXMgaW5pdGlhbGl6ZWQgdG8gaW5jcmVhc2UgdGhlIHNlY3VyaXR5LiBTZWUgdGhlIDpwZXA6YDUyNGAgZm9yIHRoZQorICByYXRpb25hbGUuCisKK1dpbmRvd3MgaW1wcm92ZW1lbnRzOgorCisqIFBFUCA1Mjk6IDpyZWY6YENoYW5nZSBXaW5kb3dzIGZpbGVzeXN0ZW0gZW5jb2RpbmcgdG8gVVRGLTggPHBlcC01Mjk+YAorCisqIFBFUCA1Mjg6IDpyZWY6YENoYW5nZSBXaW5kb3dzIGNvbnNvbGUgZW5jb2RpbmcgdG8gVVRGLTggPHBlcC01Mjg+YAorCisqIFRoZSBgYHB5LmV4ZWBgIGxhdW5jaGVyLCB3aGVuIHVzZWQgaW50ZXJhY3RpdmVseSwgbm8gbG9uZ2VyIHByZWZlcnMKKyAgUHl0aG9uIDIgb3ZlciBQeXRob24gMyB3aGVuIHRoZSB1c2VyIGRvZXNuJ3Qgc3BlY2lmeSBhIHZlcnNpb24gKHZpYQorICBjb21tYW5kIGxpbmUgYXJndW1lbnRzIG9yIGEgY29uZmlnIGZpbGUpLiAgSGFuZGxpbmcgb2Ygc2hlYmFuZyBsaW5lcworICByZW1haW5zIHVuY2hhbmdlZCAtICJweXRob24iIHJlZmVycyB0byBQeXRob24gMiBpbiB0aGF0IGNhc2UuCisKKyogYGBweXRob24uZXhlYGAgYW5kIGBgcHl0aG9udy5leGVgYCBoYXZlIGJlZW4gbWFya2VkIGFzIGxvbmctcGF0aCBhd2FyZSwKKyAgd2hpY2ggbWVhbnMgdGhhdCB3aGVuIHRoZSAyNjAgY2hhcmFjdGVyIHBhdGggbGltaXQgbWF5IG5vIGxvbmdlciBhcHBseS4KKyAgU2VlIDpyZWY6YHJlbW92aW5nIHRoZSBNQVhfUEFUSCBsaW1pdGF0aW9uIDxtYXgtcGF0aD5gIGZvciBkZXRhaWxzLgorCisuLiBQRVAtc2l6ZWQgaXRlbXMgbmV4dC4KKworLi4gX3BlcC00WFg6CisKKy4uIFBFUCA0WFg6IFZpcnR1YWwgRW52aXJvbm1lbnRzCisuLiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy4uIChJbXBsZW1lbnRlZCBieSBGb28gQmFyLikKKworLi4gLi4gc2VlYWxzbzo6CisKKyAgICA6cGVwOmA0WFhgIC0gUHl0aG9uIFZpcnR1YWwgRW52aXJvbm1lbnRzCisgICAgICAgUEVQIHdyaXR0ZW4gYnkgQ2FybCBNZXllcgorCisqIFBFUCA1MjA6IDpyZWY6YFByZXNlcnZpbmcgQ2xhc3MgQXR0cmlidXRlIERlZmluaXRpb24gT3JkZXI8d2hhdHNuZXctZGVmb3JkZXI+YAorCisqIFBFUCA0Njg6IDpyZWY6YFByZXNlcnZpbmcgS2V5d29yZCBBcmd1bWVudCBPcmRlcjx3aGF0c25ldy1rd2FyZ3M+YAorCisKK05ldyBGZWF0dXJlcworPT09PT09PT09PT09CisKKy4uIF9wZXAtNTIzOgorCitQRVAgNTIzOiBBZGRpbmcgYSBmcmFtZSBldmFsdWF0aW9uIEFQSSB0byBDUHl0aG9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1doaWxlIFB5dGhvbiBwcm92aWRlcyBleHRlbnNpdmUgc3VwcG9ydCB0byBjdXN0b21pemUgaG93IGNvZGUKK2V4ZWN1dGVzLCBvbmUgcGxhY2UgaXQgaGFzIG5vdCBkb25lIHNvIGlzIGluIHRoZSBldmFsdWF0aW9uIG9mIGZyYW1lCitvYmplY3RzLiBJZiB5b3Ugd2FudGVkIHNvbWUgd2F5IHRvIGludGVyY2VwdCBmcmFtZSBldmFsdWF0aW9uIGluCitQeXRob24gdGhlcmUgcmVhbGx5IHdhc24ndCBhbnkgd2F5IHdpdGhvdXQgZGlyZWN0bHkgbWFuaXB1bGF0aW5nCitmdW5jdGlvbiBwb2ludGVycyBmb3IgZGVmaW5lZCBmdW5jdGlvbnMuCisKKzpwZXA6YDUyM2AgY2hhbmdlcyB0aGlzIGJ5IHByb3ZpZGluZyBhbiBBUEkgdG8gbWFrZSBmcmFtZQorZXZhbHVhdGlvbiBwbHVnZ2FibGUgYXQgdGhlIEMgbGV2ZWwuIFRoaXMgd2lsbCBhbGxvdyBmb3IgdG9vbHMgc3VjaAorYXMgZGVidWdnZXJzIGFuZCBKSVRzIHRvIGludGVyY2VwdCBmcmFtZSBldmFsdWF0aW9uIGJlZm9yZSB0aGUKK2V4ZWN1dGlvbiBvZiBQeXRob24gY29kZSBiZWdpbnMuIFRoaXMgZW5hYmxlcyB0aGUgdXNlIG9mIGFsdGVybmF0aXZlCitldmFsdWF0aW9uIGltcGxlbWVudGF0aW9ucyBmb3IgUHl0aG9uIGNvZGUsIHRyYWNraW5nIGZyYW1lCitldmFsdWF0aW9uLCBldGMuCisKK1RoaXMgQVBJIGlzIG5vdCBwYXJ0IG9mIHRoZSBsaW1pdGVkIEMgQVBJIGFuZCBpcyBtYXJrZWQgYXMgcHJpdmF0ZSB0bworc2lnbmFsIHRoYXQgdXNhZ2Ugb2YgdGhpcyBBUEkgaXMgZXhwZWN0ZWQgdG8gYmUgbGltaXRlZCBhbmQgb25seQorYXBwbGljYWJsZSB0byB2ZXJ5IHNlbGVjdCwgbG93LWxldmVsIHVzZS1jYXNlcy4gU2VtYW50aWNzIG9mIHRoZQorQVBJIHdpbGwgY2hhbmdlIHdpdGggUHl0aG9uIGFzIG5lY2Vzc2FyeS4KKworLi4gc2VlYWxzbzo6CisKKyAgICA6cGVwOmA1MjNgIC0gQWRkaW5nIGEgZnJhbWUgZXZhbHVhdGlvbiBBUEkgdG8gQ1B5dGhvbgorICAgICAgIFBFUCB3cml0dGVuIGJ5IEJyZXR0IENhbm5vbiBhbmQgRGlubyBWaWVobGFuZC4KKworCisuLiBfcGVwLTUxOToKKworUEVQIDUxOTogQWRkaW5nIGEgZmlsZSBzeXN0ZW0gcGF0aCBwcm90b2NvbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaWxlIHN5c3RlbSBwYXRocyBoYXZlIGhpc3RvcmljYWxseSBiZWVuIHJlcHJlc2VudGVkIGFzIDpjbGFzczpgc3RyYAorb3IgOmNsYXNzOmBieXRlc2Agb2JqZWN0cy4gVGhpcyBoYXMgbGVkIHRvIHBlb3BsZSB3aG8gd3JpdGUgY29kZSB3aGljaAorb3BlcmF0ZSBvbiBmaWxlIHN5c3RlbSBwYXRocyB0byBhc3N1bWUgdGhhdCBzdWNoIG9iamVjdHMgYXJlIG9ubHkgb25lCitvZiB0aG9zZSB0d28gdHlwZXMgKGFuIDpjbGFzczpgaW50YCByZXByZXNlbnRpbmcgYSBmaWxlIGRlc2NyaXB0b3IKK2RvZXMgbm90IGNvdW50IGFzIHRoYXQgaXMgbm90IGEgZmlsZSBwYXRoKS4gVW5mb3J0dW5hdGVseSB0aGF0Cithc3N1bXB0aW9uIHByZXZlbnRzIGFsdGVybmF0aXZlIG9iamVjdCByZXByZXNlbnRhdGlvbnMgb2YgZmlsZSBzeXN0ZW0KK3BhdGhzIGxpa2UgOm1vZDpgcGF0aGxpYmAgZnJvbSB3b3JraW5nIHdpdGggcHJlLWV4aXN0aW5nIGNvZGUsCitpbmNsdWRpbmcgUHl0aG9uJ3Mgc3RhbmRhcmQgbGlicmFyeS4KKworVG8gZml4IHRoaXMgc2l0dWF0aW9uLCBhIG5ldyBpbnRlcmZhY2UgcmVwcmVzZW50ZWQgYnkKKzpjbGFzczpgb3MuUGF0aExpa2VgIGhhcyBiZWVuIGRlZmluZWQuIEJ5IGltcGxlbWVudGluZyB0aGUKKzptZXRoOmB+b3MuUGF0aExpa2UuX19mc3BhdGhfX2AgbWV0aG9kLCBhbiBvYmplY3Qgc2lnbmFscyB0aGF0IGl0CityZXByZXNlbnRzIGEgcGF0aC4gQW4gb2JqZWN0IGNhbiB0aGVuIHByb3ZpZGUgYSBsb3ctbGV2ZWwKK3JlcHJlc2VudGF0aW9uIG9mIGEgZmlsZSBzeXN0ZW0gcGF0aCBhcyBhIDpjbGFzczpgc3RyYCBvcgorOmNsYXNzOmBieXRlc2Agb2JqZWN0LiBUaGlzIG1lYW5zIGFuIG9iamVjdCBpcyBjb25zaWRlcmVkCis6dGVybTpgcGF0aC1saWtlIDxwYXRoLWxpa2Ugb2JqZWN0PmAgaWYgaXQgaW1wbGVtZW50cworOmNsYXNzOmBvcy5QYXRoTGlrZWAgb3IgaXMgYSA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2Agb2JqZWN0Cit3aGljaCByZXByZXNlbnRzIGEgZmlsZSBzeXN0ZW0gcGF0aC4gQ29kZSBjYW4gdXNlIDpmdW5jOmBvcy5mc3BhdGhgLAorOmZ1bmM6YG9zLmZzZGVjb2RlYCwgb3IgOmZ1bmM6YG9zLmZzZW5jb2RlYCB0byBleHBsaWNpdGx5IGdldCBhCis6Y2xhc3M6YHN0cmAgYW5kL29yIDpjbGFzczpgYnl0ZXNgIHJlcHJlc2VudGF0aW9uIG9mIGEgcGF0aC1saWtlCitvYmplY3QuCisKK1RoZSBidWlsdC1pbiA6ZnVuYzpgb3BlbmAgZnVuY3Rpb24gaGFzIGJlZW4gdXBkYXRlZCB0byBhY2NlcHQKKzpjbGFzczpgb3MuUGF0aExpa2VgIG9iamVjdHMgYXMgaGF2ZSBhbGwgcmVsZXZhbnQgZnVuY3Rpb25zIGluIHRoZQorOm1vZDpgb3NgIGFuZCA6bW9kOmBvcy5wYXRoYCBtb2R1bGVzLiA6YzpmdW5jOmBQeVVuaWNvZGVfRlNDb252ZXJ0ZXJgCithbmQgOmM6ZnVuYzpgUHlVbmljb2RlX0ZTQ29udmVydGVyYCBoYXZlIGJlZW4gY2hhbmdlZCB0byBhY2NlcHQKK3BhdGgtbGlrZSBvYmplY3RzLiBUaGUgOmNsYXNzOmBvcy5EaXJFbnRyeWAgY2xhc3MKK2FuZCByZWxldmFudCBjbGFzc2VzIGluIDptb2Q6YHBhdGhsaWJgIGhhdmUgYWxzbyBiZWVuIHVwZGF0ZWQgdG8KK2ltcGxlbWVudCA6Y2xhc3M6YG9zLlBhdGhMaWtlYC4KKworVGhlIGhvcGUgaW4gaXMgdGhhdCB1cGRhdGluZyB0aGUgZnVuZGFtZW50YWwgZnVuY3Rpb25zIGZvciBvcGVyYXRpbmcKK29uIGZpbGUgc3lzdGVtIHBhdGhzIHdpbGwgbGVhZCB0byB0aGlyZC1wYXJ0eSBjb2RlIHRvIGltcGxpY2l0bHkKK3N1cHBvcnQgYWxsIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0cyA8cGF0aC1saWtlIG9iamVjdD5gIHdpdGhvdXQgYW55Citjb2RlIGNoYW5nZXMgb3IgYXQgbGVhc3QgdmVyeSBtaW5pbWFsIG9uZXMgKGUuZy4gY2FsbGluZworOmZ1bmM6YG9zLmZzcGF0aGAgYXQgdGhlIGJlZ2lubmluZyBvZiBjb2RlIGJlZm9yZSBvcGVyYXRpbmcgb24gYQorcGF0aC1saWtlIG9iamVjdCkuCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgaG93IHRoZSBuZXcgaW50ZXJmYWNlIGFsbG93cyBmb3IKKzpjbGFzczpgcGF0aGxpYi5QYXRoYCB0byBiZSB1c2VkIG1vcmUgZWFzaWx5IGFuZCB0cmFuc3BhcmVudGx5IHdpdGgKK3ByZS1leGlzdGluZyBjb2RlOjoKKworICA+Pj4gaW1wb3J0IHBhdGhsaWIKKyAgPj4+IHdpdGggb3BlbihwYXRobGliLlBhdGgoIlJFQURNRSIpKSBhcyBmOgorICAuLi4gICAgIGNvbnRlbnRzID0gZi5yZWFkKCkKKyAgLi4uCisgID4+PiBpbXBvcnQgb3MucGF0aAorICA+Pj4gb3MucGF0aC5zcGxpdGV4dChwYXRobGliLlBhdGgoInNvbWVfZmlsZS50eHQiKSkKKyAgKCdzb21lX2ZpbGUnLCAnLnR4dCcpCisgID4+PiBvcy5wYXRoLmpvaW4oIi9hL2IiLCBwYXRobGliLlBhdGgoImMiKSkKKyAgJy9hL2IvYycKKyAgPj4+IGltcG9ydCBvcworICA+Pj4gb3MuZnNwYXRoKHBhdGhsaWIuUGF0aCgic29tZV9maWxlLnR4dCIpKQorICAnc29tZV9maWxlLnR4dCcKKworKEltcGxlbWVudGVkIGJ5IEJyZXR0IENhbm5vbiwgRXRoYW4gRnVybWFuLCBEdXN0eSBQaGlsbGlwcywgYW5kIEplbGxlIFppamxzdHJhLikKKworLi4gc2VlYWxzbzo6CisKKyAgICA6cGVwOmA1MTlgIC0gQWRkaW5nIGEgZmlsZSBzeXN0ZW0gcGF0aCBwcm90b2NvbAorICAgICAgIFBFUCB3cml0dGVuIGJ5IEJyZXR0IENhbm5vbiBhbmQgS29vcyBaZXZlbmhvdmVuLgorCisKKy4uIF93aGF0c25ldy1mc3RyaW5nczoKKworUEVQIDQ5ODogRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIGFyZSBhIG5ldyBraW5kIG9mIHN0cmluZyBsaXRlcmFsLCBwcmVmaXhlZAord2l0aCBgYCdmJ2BgLiAgVGhleSBhcmUgc2ltaWxhciB0byB0aGUgZm9ybWF0IHN0cmluZ3MgYWNjZXB0ZWQgYnkKKzptZXRoOmBzdHIuZm9ybWF0YC4gIFRoZXkgY29udGFpbiByZXBsYWNlbWVudCBmaWVsZHMgc3Vycm91bmRlZCBieQorY3VybHkgYnJhY2VzLiAgVGhlIHJlcGxhY2VtZW50IGZpZWxkcyBhcmUgZXhwcmVzc2lvbnMsIHdoaWNoIGFyZQorZXZhbHVhdGVkIGF0IHJ1biB0aW1lLCBhbmQgdGhlbiBmb3JtYXR0ZWQgdXNpbmcgdGhlIDpmdW5jOmBmb3JtYXRgIHByb3RvY29sLgorCisgICAgPj4+IG5hbWUgPSAiRnJlZCIKKyAgICA+Pj4gZiJIZSBzYWlkIGhpcyBuYW1lIGlzIHtuYW1lfS4iCisgICAgJ0hlIHNhaWQgaGlzIG5hbWUgaXMgRnJlZC4nCisKK1NlZSA6cGVwOmA0OThgIGFuZCB0aGUgbWFpbiBkb2N1bWVudGF0aW9uIGF0IDpyZWY6YGYtc3RyaW5nc2AuCisKKy4uIF9wZXAtNTI5OgorCitQRVAgNTI5OiBDaGFuZ2UgV2luZG93cyBmaWxlc3lzdGVtIGVuY29kaW5nIHRvIFVURi04Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcHJlc2VudGluZyBmaWxlc3lzdGVtIHBhdGhzIGlzIGJlc3QgcGVyZm9ybWVkIHdpdGggc3RyIChVbmljb2RlKSByYXRoZXIgdGhhbgorYnl0ZXMuIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIHNpdHVhdGlvbnMgd2hlcmUgdXNpbmcgYnl0ZXMgaXMgc3VmZmljaWVudCBhbmQKK2NvcnJlY3QuCisKK1ByaW9yIHRvIFB5dGhvbiAzLjYsIGRhdGEgbG9zcyBjb3VsZCByZXN1bHQgd2hlbiB1c2luZyBieXRlcyBwYXRocyBvbiBXaW5kb3dzLgorV2l0aCB0aGlzIGNoYW5nZSwgdXNpbmcgYnl0ZXMgdG8gcmVwcmVzZW50IHBhdGhzIGlzIG5vdyBzdXBwb3J0ZWQgb24gV2luZG93cywKK3Byb3ZpZGVkIHRob3NlIGJ5dGVzIGFyZSBlbmNvZGVkIHdpdGggdGhlIGVuY29kaW5nIHJldHVybmVkIGJ5Cis6ZnVuYzpgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpYCwgd2hpY2ggbm93IGRlZmF1bHRzIHRvIGBgJ3V0Zi04J2BgLgorCitBcHBsaWNhdGlvbnMgdGhhdCBkbyBub3QgdXNlIHN0ciB0byByZXByZXNlbnQgcGF0aHMgc2hvdWxkIHVzZQorOmZ1bmM6YG9zLmZzZW5jb2RlKClgIGFuZCA6ZnVuYzpgb3MuZnNkZWNvZGUoKWAgdG8gZW5zdXJlIHRoZWlyIGJ5dGVzIGFyZQorY29ycmVjdGx5IGVuY29kZWQuIFRvIHJldmVydCB0byB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLCBzZXQKKzplbnZ2YXI6YFBZVEhPTkxFR0FDWVdJTkRPV1NGU0VOQ09ESU5HYCBvciBjYWxsCis6ZnVuYzpgc3lzLl9lbmFibGVsZWdhY3l3aW5kb3dzZnNlbmNvZGluZ2AuCisKK1NlZSA6cGVwOmA1MjlgIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBkaXNjdXNzaW9uIG9mIGNvZGUgbW9kaWZpY2F0aW9ucyB0aGF0CittYXkgYmUgcmVxdWlyZWQuCisKKy4uIG5vdGU6OgorCisgICBUaGlzIGNoYW5nZSBpcyBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCBmb3IgMy42LjAgYmV0YSByZWxlYXNlcy4gVGhlIGRlZmF1bHQKKyAgIGVuY29kaW5nIG1heSBjaGFuZ2UgYmVmb3JlIHRoZSBmaW5hbCByZWxlYXNlLgorCitQRVAgNDg3OiBTaW1wbGVyIGN1c3RvbWl6YXRpb24gb2YgY2xhc3MgY3JlYXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitVcG9uIHN1YmNsYXNzaW5nIGEgY2xhc3MsIHRoZSBgYF9faW5pdF9zdWJjbGFzc19fYGAgY2xhc3NtZXRob2QgKGlmIGRlZmluZWQpIGlzCitjYWxsZWQgb24gdGhlIGJhc2UgY2xhc3MuIFRoaXMgbWFrZXMgaXQgc3RyYWlnaHRmb3J3YXJkIHRvIHdyaXRlIGNsYXNzZXMgdGhhdAorY3VzdG9taXplIGluaXRpYWxpemF0aW9uIG9mIGZ1dHVyZSBzdWJjbGFzc2VzIHdpdGhvdXQgaW50cm9kdWNpbmcgdGhlCitjb21wbGV4aXR5IG9mIGEgZnVsbCBjdXN0b20gbWV0YWNsYXNzLgorCitUaGUgZGVzY3JpcHRvciBwcm90b2NvbCBoYXMgYWxzbyBiZWVuIGV4cGFuZGVkIHRvIGluY2x1ZGUgYSBuZXcgb3B0aW9uYWwgbWV0aG9kLAorYGBfX3NldF9uYW1lX19gYC4gV2hlbmV2ZXIgYSBuZXcgY2xhc3MgaXMgZGVmaW5lZCwgdGhlIG5ldyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKK29uIGFsbCBkZXNjcmlwdG9ycyBpbmNsdWRlZCBpbiB0aGUgZGVmaW5pdGlvbiwgcHJvdmlkaW5nIHRoZW0gd2l0aCBhIHJlZmVyZW5jZQordG8gdGhlIGNsYXNzIGJlaW5nIGRlZmluZWQgYW5kIHRoZSBuYW1lIGdpdmVuIHRvIHRoZSBkZXNjcmlwdG9yIHdpdGhpbiB0aGUKK2NsYXNzIG5hbWVzcGFjZS4KKworQWxzbyBzZWUgOnBlcDpgNDg3YCBhbmQgdGhlIHVwZGF0ZWQgY2xhc3MgY3VzdG9taXphdGlvbiBkb2N1bWVudGF0aW9uIGF0Cis6cmVmOmBjbGFzcy1jdXN0b21pemF0aW9uYCBhbmQgOnJlZjpgZGVzY3JpcHRvcnNgLgorCisoQ29udHJpYnV0ZWQgYnkgTWFydGluIFRlaWNobWFubiBpbiA6aXNzdWU6YDI3MzY2YCkKKworLi4gX3BlcC01Mjg6CisKK1BFUCA1Mjg6IENoYW5nZSBXaW5kb3dzIGNvbnNvbGUgZW5jb2RpbmcgdG8gVVRGLTgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGRlZmF1bHQgY29uc29sZSBvbiBXaW5kb3dzIHdpbGwgbm93IGFjY2VwdCBhbGwgVW5pY29kZSBjaGFyYWN0ZXJzIGFuZAorcHJvdmlkZSBjb3JyZWN0bHkgcmVhZCBzdHIgb2JqZWN0cyB0byBQeXRob24gY29kZS4gYGBzeXMuc3RkaW5gYCwKK2Bgc3lzLnN0ZG91dGBgIGFuZCBgYHN5cy5zdGRlcnJgYCBub3cgZGVmYXVsdCB0byB1dGYtOCBlbmNvZGluZy4KKworVGhpcyBjaGFuZ2Ugb25seSBhcHBsaWVzIHdoZW4gdXNpbmcgYW4gaW50ZXJhY3RpdmUgY29uc29sZSwgYW5kIG5vdCB3aGVuCityZWRpcmVjdGluZyBmaWxlcyBvciBwaXBlcy4gVG8gcmV2ZXJ0IHRvIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIgZm9yIGludGVyYWN0aXZlCitjb25zb2xlIHVzZSwgc2V0IDplbnZ2YXI6YFBZVEhPTkxFR0FDWVdJTkRPV1NJT0VOQ09ESU5HYC4KKworLi4gc2VlYWxzbzo6CisKKyAgIDpwZXA6YDUyOGAgLS0gQ2hhbmdlIFdpbmRvd3MgY29uc29sZSBlbmNvZGluZyB0byBVVEYtOAorICAgICAgUEVQIHdyaXR0ZW4gYW5kIGltcGxlbWVudGVkIGJ5IFN0ZXZlIERvd2VyLgorCitQWVRIT05NQUxMT0MgZW52aXJvbm1lbnQgdmFyaWFibGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgbmV3IDplbnZ2YXI6YFBZVEhPTk1BTExPQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUgYWxsb3dzIHNldHRpbmcgdGhlIFB5dGhvbgorbWVtb3J5IGFsbG9jYXRvcnMgYW5kL29yIGluc3RhbGwgZGVidWcgaG9va3MuCisKK0l0IGlzIG5vdyBwb3NzaWJsZSB0byBpbnN0YWxsIGRlYnVnIGhvb2tzIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9ycyBvbiBQeXRob24KK2NvbXBpbGVkIGluIHJlbGVhc2UgbW9kZSB1c2luZyBgYFBZVEhPTk1BTExPQz1kZWJ1Z2BgLiBFZmZlY3RzIG9mIGRlYnVnIGhvb2tzOgorCisqIE5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgaXMgZmlsbGVkIHdpdGggdGhlIGJ5dGUgYGAweENCYGAKKyogRnJlZWQgbWVtb3J5IGlzIGZpbGxlZCB3aXRoIHRoZSBieXRlIGBgMHhEQmBgCisqIERldGVjdCB2aW9sYXRpb25zIG9mIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yIEFQSS4gRm9yIGV4YW1wbGUsCisgIDpjOmZ1bmM6YFB5T2JqZWN0X0ZyZWVgIGNhbGxlZCBvbiBhIG1lbW9yeSBibG9jayBhbGxvY2F0ZWQgYnkKKyAgOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYC4KKyogRGV0ZWN0IHdyaXRlIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciAoYnVmZmVyIHVuZGVyZmxvdykKKyogRGV0ZWN0IHdyaXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAoYnVmZmVyIG92ZXJmbG93KQorKiBDaGVjayB0aGF0IHRoZSA6dGVybTpgR0lMIDxnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jaz5gIGlzIGhlbGQgd2hlbiBhbGxvY2F0b3IKKyAgZnVuY3Rpb25zIG9mIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9PQkpgIChleDogOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYCkgYW5kCisgIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9NRU1gIChleDogOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCkgZG9tYWlucyBhcmUgY2FsbGVkLgorCitDaGVja2luZyBpZiB0aGUgR0lMIGlzIGhlbGQgaXMgYWxzbyBhIG5ldyBmZWF0dXJlIG9mIFB5dGhvbiAzLjYuCisKK1NlZSB0aGUgOmM6ZnVuYzpgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzYCBmdW5jdGlvbiBmb3IgZGVidWcgaG9va3Mgb24gUHl0aG9uCittZW1vcnkgYWxsb2NhdG9ycy4KKworSXQgaXMgbm93IGFsc28gcG9zc2libGUgdG8gZm9yY2UgdGhlIHVzYWdlIG9mIHRoZSA6YzpmdW5jOmBtYWxsb2NgIGFsbG9jYXRvciBvZgordGhlIEMgbGlicmFyeSBmb3IgYWxsIFB5dGhvbiBtZW1vcnkgYWxsb2NhdGlvbnMgdXNpbmcgYGBQWVRIT05NQUxMT0M9bWFsbG9jYGAuCitJdCBoZWxwcyB0byB1c2UgZXh0ZXJuYWwgbWVtb3J5IGRlYnVnZ2VycyBsaWtlIFZhbGdyaW5kIG9uIGEgUHl0aG9uIGNvbXBpbGVkIGluCityZWxlYXNlIG1vZGUuCisKK09uIGVycm9yLCB0aGUgZGVidWcgaG9va3Mgb24gUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzIG5vdyB1c2UgdGhlCis6bW9kOmB0cmFjZW1hbGxvY2AgbW9kdWxlIHRvIGdldCB0aGUgdHJhY2ViYWNrIHdoZXJlIGEgbWVtb3J5IGJsb2NrIHdhcworYWxsb2NhdGVkLgorCitFeGFtcGxlIG9mIGZhdGFsIGVycm9yIG9uIGJ1ZmZlciBvdmVyZmxvdyB1c2luZworYGBweXRob24zLjYgLVggdHJhY2VtYWxsb2M9NWBgIChzdG9yZSA1IGZyYW1lcyBpbiB0cmFjZXMpOjoKKworICAgIERlYnVnIG1lbW9yeSBibG9jayBhdCBhZGRyZXNzIHA9MHg3ZmJjZDQxNjY2Zjg6IEFQSSAnbycKKyAgICAgICAgNCBieXRlcyBvcmlnaW5hbGx5IHJlcXVlc3RlZAorICAgICAgICBUaGUgNyBwYWQgYnl0ZXMgYXQgcC03IGFyZSBGT1JCSURERU5CWVRFLCBhcyBleHBlY3RlZC4KKyAgICAgICAgVGhlIDggcGFkIGJ5dGVzIGF0IHRhaWw9MHg3ZmJjZDQxNjY2ZmMgYXJlIG5vdCBhbGwgRk9SQklEREVOQllURSAoMHhmYik6CisgICAgICAgICAgICBhdCB0YWlsKzA6IDB4MDIgKioqIE9VQ0gKKyAgICAgICAgICAgIGF0IHRhaWwrMTogMHhmYgorICAgICAgICAgICAgYXQgdGFpbCsyOiAweGZiCisgICAgICAgICAgICBhdCB0YWlsKzM6IDB4ZmIKKyAgICAgICAgICAgIGF0IHRhaWwrNDogMHhmYgorICAgICAgICAgICAgYXQgdGFpbCs1OiAweGZiCisgICAgICAgICAgICBhdCB0YWlsKzY6IDB4ZmIKKyAgICAgICAgICAgIGF0IHRhaWwrNzogMHhmYgorICAgICAgICBUaGUgYmxvY2sgd2FzIG1hZGUgYnkgY2FsbCAjMTIzMzMyOSB0byBkZWJ1ZyBtYWxsb2MvcmVhbGxvYy4KKyAgICAgICAgRGF0YSBhdCBwOiAxYSAyYiAzMCAwMAorCisgICAgTWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBhdCAobW9zdCByZWNlbnQgY2FsbCBmaXJzdCk6CisgICAgICBGaWxlICJ0ZXN0L3Rlc3RfYnl0ZXMucHkiLCBsaW5lIDMyMworICAgICAgRmlsZSAidW5pdHRlc3QvY2FzZS5weSIsIGxpbmUgNjAwCisgICAgICBGaWxlICJ1bml0dGVzdC9jYXNlLnB5IiwgbGluZSA2NDgKKyAgICAgIEZpbGUgInVuaXR0ZXN0L3N1aXRlLnB5IiwgbGluZSAxMjIKKyAgICAgIEZpbGUgInVuaXR0ZXN0L3N1aXRlLnB5IiwgbGluZSA4NAorCisgICAgRmF0YWwgUHl0aG9uIGVycm9yOiBiYWQgdHJhaWxpbmcgcGFkIGJ5dGUKKworICAgIEN1cnJlbnQgdGhyZWFkIDB4MDAwMDdmYmNkYmQzMjcwMCAobW9zdCByZWNlbnQgY2FsbCBmaXJzdCk6CisgICAgICBGaWxlICJ0ZXN0L3Rlc3RfYnl0ZXMucHkiLCBsaW5lIDMyMyBpbiB0ZXN0X2hleAorICAgICAgRmlsZSAidW5pdHRlc3QvY2FzZS5weSIsIGxpbmUgNjAwIGluIHJ1bgorICAgICAgRmlsZSAidW5pdHRlc3QvY2FzZS5weSIsIGxpbmUgNjQ4IGluIF9fY2FsbF9fCisgICAgICBGaWxlICJ1bml0dGVzdC9zdWl0ZS5weSIsIGxpbmUgMTIyIGluIHJ1bgorICAgICAgRmlsZSAidW5pdHRlc3Qvc3VpdGUucHkiLCBsaW5lIDg0IGluIF9fY2FsbF9fCisgICAgICBGaWxlICJ1bml0dGVzdC9zdWl0ZS5weSIsIGxpbmUgMTIyIGluIHJ1bgorICAgICAgRmlsZSAidW5pdHRlc3Qvc3VpdGUucHkiLCBsaW5lIDg0IGluIF9fY2FsbF9fCisgICAgICAuLi4KKworKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjY1MTZgIGFuZCA6aXNzdWU6YDI2NTY0YC4pCisKKworLi4gX3doYXRzbmV3LWRlZm9yZGVyOgorCitQRVAgNTIwOiBQcmVzZXJ2aW5nIENsYXNzIEF0dHJpYnV0ZSBEZWZpbml0aW9uIE9yZGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0F0dHJpYnV0ZXMgaW4gYSBjbGFzcyBkZWZpbml0aW9uIGJvZHkgaGF2ZSBhIG5hdHVyYWwgb3JkZXJpbmc6IHRoZSBzYW1lCitvcmRlciBpbiB3aGljaCB0aGUgbmFtZXMgYXBwZWFyIGluIHRoZSBzb3VyY2UuICBUaGlzIG9yZGVyIGlzIG5vdworcHJlc2VydmVkIGluIHRoZSBuZXcgY2xhc3MncyBgYF9fZGljdF9fYGAgYXR0cmlidXRlLgorCitBbHNvLCB0aGUgZWZmZWN0aXZlIGRlZmF1bHQgY2xhc3MgKmV4ZWN1dGlvbiogbmFtZXNwYWNlIChyZXR1cm5lZCBmcm9tCitgYHR5cGUuX19wcmVwYXJlX18oKWBgKSBpcyBub3cgYW4gaW5zZXJ0aW9uLW9yZGVyLXByZXNlcnZpbmcgbWFwcGluZy4KKworLi4gc2VlYWxzbzo6CisKKyAgIDpwZXA6YDUyMGAgLSBQcmVzZXJ2aW5nIENsYXNzIEF0dHJpYnV0ZSBEZWZpbml0aW9uIE9yZGVyCisgICAgICBQRVAgd3JpdHRlbiBhbmQgaW1wbGVtZW50ZWQgYnkgRXJpYyBTbm93LgorCisKKy4uIF93aGF0c25ldy1rd2FyZ3M6CisKK1BFUCA0Njg6IFByZXNlcnZpbmcgS2V5d29yZCBBcmd1bWVudCBPcmRlcgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2BgKiprd2FyZ3NgYCBpbiBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBpcyBub3cgZ3VhcmFudGVlZCB0byBiZSBhbgoraW5zZXJ0aW9uLW9yZGVyLXByZXNlcnZpbmcgbWFwcGluZy4KKworLi4gc2VlYWxzbzo6CisKKyAgIDpwZXA6YDQ2OGAgLSBQcmVzZXJ2aW5nIEtleXdvcmQgQXJndW1lbnQgT3JkZXIKKyAgICAgIFBFUCB3cml0dGVuIGFuZCBpbXBsZW1lbnRlZCBieSBFcmljIFNub3cuCisKKworUEVQIDUwOTogQWRkIGEgcHJpdmF0ZSB2ZXJzaW9uIHRvIGRpY3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FkZCBhIG5ldyBwcml2YXRlIHZlcnNpb24gdG8gdGhlIGJ1aWx0aW4gYGBkaWN0YGAgdHlwZSwgaW5jcmVtZW50ZWQgYXQKK2VhY2ggZGljdGlvbmFyeSBjcmVhdGlvbiBhbmQgYXQgZWFjaCBkaWN0aW9uYXJ5IGNoYW5nZSwgdG8gaW1wbGVtZW50CitmYXN0IGd1YXJkcyBvbiBuYW1lc3BhY2VzLgorCisoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNjA1OGAuKQorCisKK090aGVyIExhbmd1YWdlIENoYW5nZXMKKz09PT09PT09PT09PT09PT09PT09PT0KKworU29tZSBzbWFsbGVyIGNoYW5nZXMgbWFkZSB0byB0aGUgY29yZSBQeXRob24gbGFuZ3VhZ2UgYXJlOgorCisqIDpmdW5jOmBkaWN0YCBub3cgdXNlcyBhICJjb21wYWN0IiByZXByZXNlbnRhdGlvbiBgcGlvbmVlcmVkIGJ5IFB5UHkKKyAgPGh0dHBzOi8vbW9yZXB5cHkuYmxvZ3Nwb3QuY29tLzIwMTUvMDEvZmFzdGVyLW1vcmUtbWVtb3J5LWVmZmljaWVudC1hbmQtbW9yZS5odG1sPmBfLgorICA6cGVwOmA0NjhgIChQcmVzZXJ2aW5nIHRoZSBvcmRlciBvZiBgYCoqa3dhcmdzYGAgaW4gYSBmdW5jdGlvbi4pIGlzCisgIGltcGxlbWVudGVkIGJ5IHRoaXMuIFRoZSBvcmRlci1wcmVzZXJ2aW5nIGFzcGVjdCBvZiB0aGlzIG5ldworICBpbXBsZW1lbnRhdGlvbiBpcyBjb25zaWRlcmVkIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBhbmQgc2hvdWxkCisgIG5vdCBiZSByZWxpZWQgdXBvbiAodGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUsIGJ1dCBpdCBpcyBkZXNpcmVkCisgIHRvIGhhdmUgdGhpcyBuZXcgZGljdCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgbGFuZ3VhZ2UgZm9yIGEgZmV3CisgIHJlbGVhc2VzIGJlZm9yZSBjaGFuZ2luZyB0aGUgbGFuZ3VhZ2Ugc3BlYyB0byBtYW5kYXRlCisgIG9yZGVyLXByZXNlcnZpbmcgc2VtYW50aWNzIGZvciBhbGwgY3VycmVudCBhbmQgZnV0dXJlIFB5dGhvbgorICBpbXBsZW1lbnRhdGlvbnM7IHRoaXMgYWxzbyBoZWxwcyBwcmVzZXJ2ZSBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eQorICB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBsYW5ndWFnZSB3aGVyZSByYW5kb20gaXRlcmF0aW9uIG9yZGVyIGlzCisgIHN0aWxsIGluIGVmZmVjdCwgZS5nLiBQeXRob24gMy41KS4KKyAgKENvbnRyaWJ1dGVkIGJ5IElOQURBIE5hb2tpIGluIDppc3N1ZTpgMjczNTBgLiBJZGVhCisgIGBvcmlnaW5hbGx5IHN1Z2dlc3RlZCBieSBSYXltb25kIEhldHRpbmdlcgorICA8aHR0cHM6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAxMi1EZWNlbWJlci8xMjMwMjguaHRtbD5gXy4pCisKKyogTG9uZyBzZXF1ZW5jZXMgb2YgcmVwZWF0ZWQgdHJhY2ViYWNrIGxpbmVzIGFyZSBub3cgYWJicmV2aWF0ZWQgYXMKKyAgYGAiW1ByZXZpb3VzIGxpbmUgcmVwZWF0ZWQge2NvdW50fSBtb3JlIHRpbWVzXSJgYCAoc2VlCisgIDpyZWY6YHB5MzYtdHJhY2ViYWNrYCBmb3IgYW4gZXhhbXBsZSkuCisgIChDb250cmlidXRlZCBieSBFbWFudWVsIEJhcnJ5IGluIDppc3N1ZTpgMjY4MjNgLikKKworKiBJbXBvcnQgbm93IHJhaXNlcyB0aGUgbmV3IGV4Y2VwdGlvbiA6ZXhjOmBNb2R1bGVOb3RGb3VuZEVycm9yYAorICAoc3ViY2xhc3Mgb2YgOmV4YzpgSW1wb3J0RXJyb3JgKSB3aGVuIGl0IGNhbm5vdCBmaW5kIGEgbW9kdWxlLiAgQ29kZQorICB0aGF0IGN1cnJlbnQgY2hlY2tzIGZvciBJbXBvcnRFcnJvciAoaW4gdHJ5LWV4Y2VwdCkgd2lsbCBzdGlsbCB3b3JrLgorCisKK05ldyBNb2R1bGVzCis9PT09PT09PT09PQorCisqIE5vbmUgeWV0LgorCisKK0ltcHJvdmVkIE1vZHVsZXMKKz09PT09PT09PT09PT09PT0KKworT24gTGludXgsIDpmdW5jOmBvcy51cmFuZG9tYCBub3cgYmxvY2tzIHVudGlsIHRoZSBzeXN0ZW0gdXJhbmRvbSBlbnRyb3B5IHBvb2wKK2lzIGluaXRpYWxpemVkIHRvIGluY3JlYXNlIHRoZSBzZWN1cml0eS4gU2VlIHRoZSA6cGVwOmA1MjRgIGZvciB0aGUgcmF0aW9uYWxlLgorCisKK2FzeW5jaW8KKy0tLS0tLS0KKworU2luY2UgdGhlIDptb2Q6YGFzeW5jaW9gIG1vZHVsZSBpcyA6dGVybTpgcHJvdmlzaW9uYWwgPHByb3Zpc2lvbmFsIGFwaT5gLAorYWxsIGNoYW5nZXMgaW50cm9kdWNlZCBpbiBQeXRob24gMy42IGhhdmUgYWxzbyBiZWVuIGJhY2twb3J0ZWQgdG8gUHl0aG9uCiszLjUueC4KKworTm90YWJsZSBjaGFuZ2VzIGluIHRoZSA6bW9kOmBhc3luY2lvYCBtb2R1bGUgc2luY2UgUHl0aG9uIDMuNS4wOgorCisqIFRoZSA6ZnVuYzpgfmFzeW5jaW8uZW5zdXJlX2Z1dHVyZWAgZnVuY3Rpb24gYW5kIGFsbCBmdW5jdGlvbnMgdGhhdAorICB1c2UgaXQsIHN1Y2ggYXMgOm1ldGg6YGxvb3AucnVuX3VudGlsX2NvbXBsZXRlKCkgPGFzeW5jaW8uQmFzZUV2ZW50TG9vcC5ydW5fdW50aWxfY29tcGxldGU+YCwKKyAgbm93IGFjY2VwdCBhbGwga2luZHMgb2YgOnRlcm06YGF3YWl0YWJsZSBvYmplY3RzIDxhd2FpdGFibGU+YC4KKyAgKENvbnRyaWJ1dGVkIGJ5IFl1cnkgU2VsaXZhbm92LikKKworKiBOZXcgOmZ1bmM6YH5hc3luY2lvLnJ1bl9jb3JvdXRpbmVfdGhyZWFkc2FmZWAgZnVuY3Rpb24gdG8gc3VibWl0CisgIGNvcm91dGluZXMgdG8gZXZlbnQgbG9vcHMgZnJvbSBvdGhlciB0aHJlYWRzLgorICAoQ29udHJpYnV0ZWQgYnkgVmluY2VudCBNaWNoZWwuKQorCisqIE5ldyA6bWV0aDpgVHJhbnNwb3J0LmlzX2Nsb3NpbmcoKSA8YXN5bmNpby5CYXNlVHJhbnNwb3J0LmlzX2Nsb3Npbmc+YAorICBtZXRob2QgdG8gY2hlY2sgaWYgdGhlIHRyYW5zcG9ydCBpcyBjbG9zaW5nIG9yIGNsb3NlZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IFl1cnkgU2VsaXZhbm92LikKKworKiBUaGUgOm1ldGg6YGxvb3AuY3JlYXRlX3NlcnZlcigpIDxhc3luY2lvLkJhc2VFdmVudExvb3AuY3JlYXRlX3NlcnZlcj5gCisgIG1ldGhvZCBjYW4gbm93IGFjY2VwdCBhIGxpc3Qgb2YgaG9zdHMuCisgIChDb250cmlidXRlZCBieSBZYW5uIFNpb25uZWF1LikKKworKiBOZXcgOm1ldGg6YGxvb3AuY3JlYXRlX2Z1dHVyZSgpIDxhc3luY2lvLkJhc2VFdmVudExvb3AuY3JlYXRlX2Z1dHVyZT5gCisgIG1ldGhvZCB0byBjcmVhdGUgRnV0dXJlIG9iamVjdHMuICBUaGlzIGFsbG93cyBhbHRlcm5hdGl2ZSBldmVudAorICBsb29wIGltcGxlbWVudGF0aW9ucywgc3VjaCBhcworICBgdXZsb29wIDxodHRwczovL2dpdGh1Yi5jb20vTWFnaWNTdGFjay91dmxvb3A+YF8sIHRvIHByb3ZpZGUgYSBmYXN0ZXIKKyAgOmNsYXNzOmBhc3luY2lvLkZ1dHVyZWAgaW1wbGVtZW50YXRpb24uCisgIChDb250cmlidXRlZCBieSBZdXJ5IFNlbGl2YW5vdi4pCisKKyogTmV3IDptZXRoOmBsb29wLmdldF9leGNlcHRpb25faGFuZGxlcigpIDxhc3luY2lvLkJhc2VFdmVudExvb3AuZ2V0X2V4Y2VwdGlvbl9oYW5kbGVyPmAKKyAgbWV0aG9kIHRvIGdldCB0aGUgY3VycmVudCBleGNlcHRpb24gaGFuZGxlci4KKyAgKENvbnRyaWJ1dGVkIGJ5IFl1cnkgU2VsaXZhbm92LikKKworKiBOZXcgOmZ1bmM6YH5hc3luY2lvLnRpbWVvdXRgIGNvbnRleHQgbWFuYWdlciB0byBzaW1wbGlmeSB0aW1lb3V0cworICBoYW5kbGluZyBjb2RlLgorICAoQ29udHJpYnV0ZWQgYnkgQW5kcmV3IFN2ZXRsb3YuKQorCisqIE5ldyA6bWV0aDpgU3RyZWFtUmVhZGVyLnJlYWR1bnRpbCgpIDxhc3luY2lvLlN0cmVhbVJlYWRlci5yZWFkdW50aWw+YAorICBtZXRob2QgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbSB1bnRpbCBhIHNlcGFyYXRvciBieXRlcworICBzZXF1ZW5jZSBhcHBlYXJzLgorICAoQ29udHJpYnV0ZWQgYnkgTWFyayBLb3JlbmJlcmcuKQorCisqIFRoZSA6bWV0aDpgbG9vcC5nZXRhZGRyaW5mbygpIDxhc3luY2lvLkJhc2VFdmVudExvb3AuZ2V0YWRkcmluZm8+YAorICBtZXRob2QgaXMgb3B0aW1pemVkIHRvIGF2b2lkIGNhbGxpbmcgdGhlIHN5c3RlbSBgYGdldGFkZHJpbmZvYGAKKyAgZnVuY3Rpb24gaWYgdGhlIGFkZHJlc3MgaXMgYWxyZWFkeSByZXNvbHZlZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IEEuIEplc3NlIEppcnl1IERhdmlzLikKKworCitjb250ZXh0bGliCistLS0tLS0tLS0tCisKK1RoZSA6Y2xhc3M6YGNvbnRleHRsaWIuQWJzdHJhY3RDb250ZXh0TWFuYWdlcmAgY2xhc3MgaGFzIGJlZW4gYWRkZWQgdG8KK3Byb3ZpZGUgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29udGV4dCBtYW5hZ2Vycy4gSXQgcHJvdmlkZXMgYQorc2Vuc2libGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYF9fZW50ZXJfXygpYCB3aGljaCByZXR1cm5zCitgYHNlbGZgYCBhbmQgbGVhdmVzIGBfX2V4aXRfXygpYCBhbiBhYnN0cmFjdCBtZXRob2QuIEEgbWF0Y2hpbmcKK2NsYXNzIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSA6bW9kOmB0eXBpbmdgIG1vZHVsZSBhcworOmNsYXNzOmB0eXBpbmcuQ29udGV4dE1hbmFnZXJgLgorKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDI1NjA5YC4pCisKKwordmVudgorLS0tLQorCis6bW9kOmB2ZW52YCBhY2NlcHRzIGEgbmV3IHBhcmFtZXRlciBgYC0tcHJvbXB0YGAuIFRoaXMgcGFyYW1ldGVyIHByb3ZpZGVzIGFuCithbHRlcm5hdGl2ZSBwcmVmaXggZm9yIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50LiAoUHJvcG9zZWQgYnkgxYF1a2Fzei5CYWxjZXJ6YWsKK2FuZCBwb3J0ZWQgdG8gMy42IGJ5IFN0w6lwaGFuZSBXaXJ0ZWwgaW4gOmlzc3VlOmAyMjgyOWAuKQorCisKK2RhdGV0aW1lCistLS0tLS0tLQorCitUaGUgOm1ldGg6YGRhdGV0aW1lLnN0cmZ0aW1lKCkgPGRhdGV0aW1lLmRhdGV0aW1lLnN0cmZ0aW1lPmAgYW5kCis6bWV0aDpgZGF0ZS5zdHJmdGltZSgpIDxkYXRldGltZS5kYXRlLnN0cmZ0aW1lPmAgbWV0aG9kcyBub3cgc3VwcG9ydCBJU08gODYwMSBkYXRlCitkaXJlY3RpdmVzIGBgJUdgYCwgYGAldWBgIGFuZCBgYCVWYGAuCisoQ29udHJpYnV0ZWQgYnkgQXNobGV5IEFuZGVyc29uIGluIDppc3N1ZTpgMTIwMDZgLikKKworCitkaXN0dXRpbHMuY29tbWFuZC5zZGlzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGBgZGVmYXVsdF9mb3JtYXRgYCBhdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tCis6Y2xhc3M6YGRpc3R1dGlscy5jb21tYW5kLnNkaXN0LnNkaXN0YCBhbmQgdGhlIGBgZm9ybWF0c2BgCithdHRyaWJ1dGUgZGVmYXVsdHMgdG8gYGBbJ2d6dGFyJ11gYC4gQWx0aG91Z2ggbm90IGFudGljaXBhdGVkLAorQW55IGNvZGUgcmVseWluZyBvbiB0aGUgcHJlc2VuY2Ugb2YgYGBkZWZhdWx0X2Zvcm1hdGBgIG1heQorbmVlZCB0byBiZSBhZGFwdGVkLiBTZWUgOmlzc3VlOmAyNzgxOWAgZm9yIG1vcmUgZGV0YWlscy4KKworCitlbWFpbAorLS0tLS0KKworVGhlIG5ldyBlbWFpbCBBUEksIGVuYWJsZWQgdmlhIHRoZSAqcG9saWN5KiBrZXl3b3JkIHRvIHZhcmlvdXMgY29uc3RydWN0b3JzLCBpcworbm8gbG9uZ2VyIHByb3Zpc2lvbmFsLiAgVGhlIDptb2Q6YGVtYWlsYCBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHJlb3JnYW5pemVkIGFuZAorcmV3cml0dGVuIHRvIGZvY3VzIG9uIHRoZSBuZXcgQVBJLCB3aGlsZSByZXRhaW5pbmcgdGhlIG9sZCBkb2N1bWVudGF0aW9uIGZvcgordGhlIGxlZ2FjeSBBUEkuICAoQ29udHJpYnV0ZWQgYnkgUi4gRGF2aWQgTXVycmF5IGluIDppc3N1ZTpgMjQyNzdgLikKKworVGhlIDptb2Q6YGVtYWlsLm1pbWVgIGNsYXNzZXMgbm93IGFsbCBhY2NlcHQgYW4gb3B0aW9uYWwgKnBvbGljeSoga2V5d29yZC4KKyhDb250cmlidXRlZCBieSBCZXJrZXIgUGVrc2FnIGluIDppc3N1ZTpgMjczMzFgLikKKworVGhlIDpjbGFzczpgfmVtYWlsLmdlbmVyYXRvci5EZWNvZGVkR2VuZXJhdG9yYCBub3cgc3VwcG9ydHMgdGhlICpwb2xpY3kqCitrZXl3b3JkLgorCisKK2VuY29kaW5ncworLS0tLS0tLS0tCisKK09uIFdpbmRvd3MsIGFkZGVkIHRoZSBgYCdvZW0nYGAgZW5jb2RpbmcgdG8gdXNlIGBgQ1BfT0VNQ1BgYCBhbmQgdGhlIGBgJ2Fuc2knYGAKK2FsaWFzIGZvciB0aGUgZXhpc3RpbmcgYGAnbWJjcydgYCBlbmNvZGluZywgd2hpY2ggdXNlcyB0aGUgYGBDUF9BQ1BgYCBjb2RlIHBhZ2UuCisKKworZmF1bHRoYW5kbGVyCistLS0tLS0tLS0tLS0KKworT24gV2luZG93cywgdGhlIDptb2Q6YGZhdWx0aGFuZGxlcmAgbW9kdWxlIG5vdyBpbnN0YWxscyBhIGhhbmRsZXIgZm9yIFdpbmRvd3MKK2V4Y2VwdGlvbnM6IHNlZSA6ZnVuYzpgZmF1bHRoYW5kbGVyLmVuYWJsZWAuIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorOmlzc3VlOmAyMzg0OGAuKQorCisKK2h0dHAuY2xpZW50CistLS0tLS0tLS0tLQorCis6bWV0aDpgSFRUUENvbm5lY3Rpb24ucmVxdWVzdCgpIDxodHRwLmNsaWVudC5IVFRQQ29ubmVjdGlvbi5yZXF1ZXN0PmAgYW5kCis6bWV0aDpgfmh0dHAuY2xpZW50LkhUVFBDb25uZWN0aW9uLmVuZGhlYWRlcnNgIGJvdGggbm93IHN1cHBvcnQKK2NodW5rZWQgZW5jb2RpbmcgcmVxdWVzdCBib2RpZXMuCisoQ29udHJpYnV0ZWQgYnkgRGVtaWFuIEJyZWNodCBhbmQgUm9sZiBLcmFobCBpbiA6aXNzdWU6YDEyMzE5YC4pCisKKworaWRsZWxpYiBhbmQgSURMRQorLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgaWRsZWxpYiBwYWNrYWdlIGlzIGJlaW5nIG1vZGVybml6ZWQgYW5kIHJlZmFjdG9yZWQgdG8gbWFrZSBJRExFIGxvb2sgYW5kIHdvcmsgYmV0dGVyIGFuZCB0byBtYWtlIHRoZSBjb2RlIGVhc2llciB0byB1bmRlcnN0YW5kLCB0ZXN0LCBhbmQgaW1wcm92ZS4gUGFydCBvZiBtYWtpbmcgSURMRSBsb29rIGJldHRlciwgZXNwZWNpYWxseSBvbiBMaW51eCBhbmQgTWFjLCBpcyB1c2luZyB0dGsgd2lkZ2V0cywgbW9zdGx5IGluIHRoZSBkaWFsb2dzLiAgQXMgYSByZXN1bHQsIElETEUgbm8gbG9uZ2VyIHJ1bnMgd2l0aCB0Y2wvdGsgOC40LiAgSXQgbm93IHJlcXVpcmVzIHRjbC90ayA4LjUgb3IgOC42LiAgV2UgcmVjb21tZW5kIHJ1bm5pbmcgdGhlIGxhdGVzdCByZWxlYXNlIG9mIGVpdGhlci4KKworJ01vZGVybml6aW5nJyBpbmNsdWRlcyByZW5hbWluZyBhbmQgY29uc29saWRhdGlvbiBvZiBpZGxlbGliIG1vZHVsZXMuIFRoZSByZW5hbWluZyBvZiBmaWxlcyB3aXRoIHBhcnRpYWwgdXBwZXJjYXNlIG5hbWVzIGlzIHNpbWlsYXIgdG8gdGhlIHJlbmFtaW5nIG9mLCBmb3IgaW5zdGFuY2UsIFRraW50ZXIgYW5kIFRrRm9udCB0byB0a2ludGVyIGFuZCB0a2ludGVyLmZvbnQgaW4gMy4wLiAgQXMgYSByZXN1bHQsIGltcG9ydHMgb2YgaWRsZWxpYiBmaWxlcyB0aGF0IHdvcmtlZCBpbiAzLjUgd2lsbCB1c3VhbGx5IG5vdCB3b3JrIGluIDMuNi4gIEF0IGxlYXN0IGEgbW9kdWxlIG5hbWUgY2hhbmdlIHdpbGwgYmUgbmVlZGVkIChzZWUgaWRsZWxpYi9SRUFETUUudHh0KSwgc29tZXRpbWVzIG1vcmUuICAoTmFtZSBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IEFsIFN3aWVnYXJ0IGFuZCBUZXJyeSBSZWVkeSBpbiA6aXNzdWU6YDI0MjI1YC4gIE1vc3QgaWRsZWxpYiBwYXRjaGVzIHNpbmNlIGhhdmUgYmVlbiBhbmQgd2lsbCBiZSBwYXJ0IG9mIHRoZSBwcm9jZXNzLikKKworSW4gY29tcGVuc2F0aW9uLCB0aGUgZXZlbnR1YWwgcmVzdWx0IHdpdGggYmUgdGhhdCBzb21lIGlkbGVsaWIgY2xhc3NlcyB3aWxsIGJlIGVhc2llciB0byB1c2UsIHdpdGggYmV0dGVyIEFQSXMgYW5kIGRvY3N0cmluZ3MgZXhwbGFpbmluZyB0aGVtLiAgQWRkaXRpb25hbCB1c2VmdWwgaW5mb3JtYXRpb24gd2lsbCBiZSBhZGRlZCB0byBpZGxlbGliIHdoZW4gYXZhaWxhYmxlLgorCisKK2ltcG9ydGxpYgorLS0tLS0tLS0tCisKKzpjbGFzczpgaW1wb3J0bGliLnV0aWwuTGF6eUxvYWRlcmAgbm93IGNhbGxzCis6bWV0aDpgfmltcG9ydGxpYi5hYmMuTG9hZGVyLmNyZWF0ZV9tb2R1bGVgIG9uIHRoZSB3cmFwcGVkIGxvYWRlciwgcmVtb3ZpbmcgdGhlCityZXN0cmljdGlvbiB0aGF0IDpjbGFzczpgaW1wb3J0bGliLm1hY2hpbmVyeS5CdWlsdGluSW1wb3J0ZXJgIGFuZAorOmNsYXNzOmBpbXBvcnRsaWIubWFjaGluZXJ5LkV4dGVuc2lvbkZpbGVMb2FkZXJgIGNvdWxkbid0IGJlIHVzZWQgd2l0aAorOmNsYXNzOmBpbXBvcnRsaWIudXRpbC5MYXp5TG9hZGVyYC4KKworOmZ1bmM6YGltcG9ydGxpYi51dGlsLmNhY2hlX2Zyb21fc291cmNlYCwKKzpmdW5jOmBpbXBvcnRsaWIudXRpbC5zb3VyY2VfZnJvbV9jYWNoZWAsIGFuZAorOmZ1bmM6YGltcG9ydGxpYi51dGlsLnNwZWNfZnJvbV9maWxlX2xvY2F0aW9uYCBub3cgYWNjZXB0IGEKKzp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKworCitvcworLS0KKworQSBuZXcgOm1ldGg6YH5vcy5zY2FuZGlyLmNsb3NlYCBtZXRob2QgYWxsb3dzIGV4cGxpY2l0bHkgY2xvc2luZyBhCis6ZnVuYzpgfm9zLnNjYW5kaXJgIGl0ZXJhdG9yLiAgVGhlIDpmdW5jOmB+b3Muc2NhbmRpcmAgaXRlcmF0b3Igbm93CitzdXBwb3J0cyB0aGUgOnRlcm06YGNvbnRleHQgbWFuYWdlcmAgcHJvdG9jb2wuICBJZiBhIDpmdW5jOmBzY2FuZGlyYAoraXRlcmF0b3IgaXMgbmVpdGhlciBleGhhdXN0ZWQgbm9yIGV4cGxpY2l0bHkgY2xvc2VkIGEgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYAord2lsbCBiZSBlbWl0dGVkIGluIGl0cyBkZXN0cnVjdG9yLgorKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAyNTk5NGAuKQorCitUaGUgTGludXggYGBnZXRyYW5kb20oKWBgIHN5c2NhbGwgKGdldCByYW5kb20gYnl0ZXMpIGlzIG5vdyBleHBvc2VkIGFzIHRoZSBuZXcKKzpmdW5jOmBvcy5nZXRyYW5kb21gIGZ1bmN0aW9uLgorKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyLCBwYXJ0IG9mIHRoZSA6cGVwOmA1MjRgKQorCitTZWUgdGhlIHN1bW1hcnkgZm9yIDpyZWY6YFBFUCA1MTkgPHBlcC01MTk+YCBmb3IgZGV0YWlscyBvbiBob3cgdGhlCis6bW9kOmBvc2AgYW5kIDptb2Q6YG9zLnBhdGhgIG1vZHVsZXMgbm93IHN1cHBvcnQKKzp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0cyA8cGF0aC1saWtlIG9iamVjdD5gLgorCisKK3BpY2tsZQorLS0tLS0tCisKK09iamVjdHMgdGhhdCBuZWVkIGNhbGxpbmcgYGBfX25ld19fYGAgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cyBjYW4gbm93IGJlIHBpY2tsZWQKK3VzaW5nIDpyZWY6YHBpY2tsZSBwcm90b2NvbHMgPHBpY2tsZS1wcm90b2NvbHM+YCBvbGRlciB0aGFuIHByb3RvY29sIHZlcnNpb24gNC4KK1Byb3RvY29sIHZlcnNpb24gNCBhbHJlYWR5IHN1cHBvcnRzIHRoaXMgY2FzZS4gIChDb250cmlidXRlZCBieSBTZXJoaXkKK1N0b3JjaGFrYSBpbiA6aXNzdWU6YDI0MTY0YC4pCisKKworcmVhZGxpbmUKKy0tLS0tLS0tCisKK0FkZGVkIDpmdW5jOmB+cmVhZGxpbmUuc2V0X2F1dG9faGlzdG9yeWAgdG8gZW5hYmxlIG9yIGRpc2FibGUKK2F1dG9tYXRpYyBhZGRpdGlvbiBvZiBpbnB1dCB0byB0aGUgaGlzdG9yeSBsaXN0LiAgKENvbnRyaWJ1dGVkIGJ5CitUeWxlciBDcm9tcHRvbiBpbiA6aXNzdWU6YDI2ODcwYC4pCisKKworcmxjb21wbGV0ZXIKKy0tLS0tLS0tLS0tCisKK1ByaXZhdGUgYW5kIHNwZWNpYWwgYXR0cmlidXRlIG5hbWVzIG5vdyBhcmUgb21pdHRlZCB1bmxlc3MgdGhlIHByZWZpeCBzdGFydHMKK3dpdGggdW5kZXJzY29yZXMuICBBIHNwYWNlIG9yIGEgY29sb24gaXMgYWRkZWQgYWZ0ZXIgc29tZSBjb21wbGV0ZWQga2V5d29yZHMuCisoQ29udHJpYnV0ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBpbiA6aXNzdWU6YDI1MDExYCBhbmQgOmlzc3VlOmAyNTIwOWAuKQorCitOYW1lcyBvZiBtb3N0IGF0dHJpYnV0ZXMgbGlzdGVkIGJ5IDpmdW5jOmBkaXJgIGFyZSBub3cgY29tcGxldGVkLgorUHJldmlvdXNseSwgbmFtZXMgb2YgcHJvcGVydGllcyBhbmQgc2xvdHMgd2hpY2ggd2VyZSBub3QgeWV0IGNyZWF0ZWQgb24KK2FuIGluc3RhbmNlIHdlcmUgZXhjbHVkZWQuICAoQ29udHJpYnV0ZWQgYnkgTWFydGluIFBhbnRlciBpbiA6aXNzdWU6YDI1NTkwYC4pCisKKworc2l0ZQorLS0tLQorCitXaGVuIHNwZWNpZnlpbmcgcGF0aHMgdG8gYWRkIHRvIDphdHRyOmBzeXMucGF0aGAgaW4gYSBgLnB0aGAgZmlsZSwKK3lvdSBtYXkgbm93IHNwZWNpZnkgZmlsZSBwYXRocyBvbiB0b3Agb2YgZGlyZWN0b3JpZXMgKGUuZy4gemlwIGZpbGVzKS4KKyhDb250cmlidXRlZCBieSBXb2xmZ2FuZyBMYW5nbmVyIGluIDppc3N1ZTpgMjY1ODdgKS4KKworCitzcWxpdGUzCistLS0tLS0tCisKKzphdHRyOmBzcWxpdGUzLkN1cnNvci5sYXN0cm93aWRgIG5vdyBzdXBwb3J0cyB0aGUgYGBSRVBMQUNFYGAgc3RhdGVtZW50LgorKENvbnRyaWJ1dGVkIGJ5IEFsZXggTG9yZFRob3JzZW4gaW4gOmlzc3VlOmAxNjg2NGAuKQorCisKK3NvY2tldAorLS0tLS0tCisKK1RoZSA6ZnVuYzpgfnNvY2tldC5zb2NrZXQuaW9jdGxgIGZ1bmN0aW9uIG5vdyBzdXBwb3J0cyB0aGUgOmRhdGE6YH5zb2NrZXQuU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSGAKK2NvbnRyb2wgY29kZS4KKyhDb250cmlidXRlZCBieSBEYW5pZWwgU3Rva2VzIGluIDppc3N1ZTpgMjY1MzZgLikKKworVGhlIDptZXRoOmB+c29ja2V0LnNvY2tldC5nZXRzb2Nrb3B0YCBjb25zdGFudHMgYGBTT19ET01BSU5gYCwKK2BgU09fUFJPVE9DT0xgYCwgYGBTT19QRUVSU0VDYGAsIGFuZCBgYFNPX1BBU1NTRUNgYCBhcmUgbm93IHN1cHBvcnRlZC4KKyhDb250cmlidXRlZCBieSBDaHJpc3RpYW4gSGVpbWVzIGluIDppc3N1ZTpgMjY5MDdgLikKKworCitzb2NrZXRzZXJ2ZXIKKy0tLS0tLS0tLS0tLQorCitTZXJ2ZXJzIGJhc2VkIG9uIHRoZSA6bW9kOmBzb2NrZXRzZXJ2ZXJgIG1vZHVsZSwgaW5jbHVkaW5nIHRob3NlCitkZWZpbmVkIGluIDptb2Q6YGh0dHAuc2VydmVyYCwgOm1vZDpgeG1scnBjLnNlcnZlcmAgYW5kCis6bW9kOmB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJgLCBub3cgc3VwcG9ydCB0aGUgOnRlcm06YGNvbnRleHQgbWFuYWdlcmAKK3Byb3RvY29sLgorKENvbnRyaWJ1dGVkIGJ5IEF2aXYgUGFsaXZvZGEgaW4gOmlzc3VlOmAyNjQwNGAuKQorCitUaGUgOmF0dHI6YH5zb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIud2ZpbGVgIGF0dHJpYnV0ZSBvZgorOmNsYXNzOmB+c29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyYCBjbGFzc2VzIG5vdyBpbXBsZW1lbnRzCit0aGUgOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgd3JpdGFibGUgaW50ZXJmYWNlLiAgSW4gcGFydGljdWxhciwKK2NhbGxpbmcgOm1ldGg6YH5pby5CdWZmZXJlZElPQmFzZS53cml0ZWAgaXMgbm93IGd1YXJhbnRlZWQgdG8gc2VuZCB0aGUKK2RhdGEgaW4gZnVsbC4gIChDb250cmlidXRlZCBieSBNYXJ0aW4gUGFudGVyIGluIDppc3N1ZTpgMjY3MjFgLikKKworCitzdWJwcm9jZXNzCistLS0tLS0tLS0tCisKKzpjbGFzczpgc3VicHJvY2Vzcy5Qb3BlbmAgZGVzdHJ1Y3RvciBub3cgZW1pdHMgYSA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgIHdhcm5pbmcKK2lmIHRoZSBjaGlsZCBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcuIFVzZSB0aGUgY29udGV4dCBtYW5hZ2VyIHByb3RvY29sIChgYHdpdGgKK3Byb2M6IC4uLmBgKSBvciBjYWxsIGV4cGxpY2l0bHkgdGhlIDptZXRoOmB+c3VicHJvY2Vzcy5Qb3Blbi53YWl0YCBtZXRob2QgdG8KK3JlYWQgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorOmlzc3VlOmAyNjc0MWApLgorCitUaGUgOmNsYXNzOmBzdWJwcm9jZXNzLlBvcGVuYCBjb25zdHJ1Y3RvciBhbmQgYWxsIGZ1bmN0aW9ucyB0aGF0IHBhc3MgYXJndW1lbnRzCit0aHJvdWdoIHRvIGl0IG5vdyBhY2NlcHQgKmVuY29kaW5nKiBhbmQgKmVycm9ycyogYXJndW1lbnRzLiBTcGVjaWZ5aW5nIGVpdGhlcgorb2YgdGhlc2Ugd2lsbCBlbmFibGUgdGV4dCBtb2RlIGZvciB0aGUgKnN0ZGluKiwgKnN0ZG91dCogYW5kICpzdGRlcnIqIHN0cmVhbXMuCisKK3RlbG5ldGxpYgorLS0tLS0tLS0tCisKKzpjbGFzczpgfnRlbG5ldGxpYi5UZWxuZXRgIGlzIG5vdyBhIGNvbnRleHQgbWFuYWdlciAoY29udHJpYnV0ZWQgYnkKK1N0w6lwaGFuZSBXaXJ0ZWwgaW4gOmlzc3VlOmAyNTQ4NWApLgorCisKK3RraW50ZXIKKy0tLS0tLS0KKworQWRkZWQgbWV0aG9kcyA6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VfYWRkYCwKKzptZXRoOmB+dGtpbnRlci5WYXJpYWJsZS50cmFjZV9yZW1vdmVgIGFuZCA6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VfaW5mb2AKK2luIHRoZSA6Y2xhc3M6YHRraW50ZXIuVmFyaWFibGVgIGNsYXNzLiAgVGhleSByZXBsYWNlIG9sZCBtZXRob2RzCis6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VfdmFyaWFibGVgLCA6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VgLAorOm1ldGg6YH50a2ludGVyLlZhcmlhYmxlLnRyYWNlX3ZkZWxldGVgIGFuZAorOm1ldGg6YH50a2ludGVyLlZhcmlhYmxlLnRyYWNlX3ZpbmZvYCB0aGF0IHVzZSBvYnNvbGV0ZSBUY2wgY29tbWFuZHMgYW5kIG1pZ2h0Citub3Qgd29yayBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgVGNsLgorKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAyMjExNWApLgorCisKKy4uIF9weTM2LXRyYWNlYmFjazoKKwordHJhY2ViYWNrCistLS0tLS0tLS0KKworQm90aCB0aGUgdHJhY2ViYWNrIG1vZHVsZSBhbmQgdGhlIGludGVycHJldGVyJ3MgYnVpbHRpbiBleGNlcHRpb24gZGlzcGxheSBub3cKK2FiYnJldmlhdGUgbG9uZyBzZXF1ZW5jZXMgb2YgcmVwZWF0ZWQgbGluZXMgaW4gdHJhY2ViYWNrcyBhcyBzaG93biBpbiB0aGUKK2ZvbGxvd2luZyBleGFtcGxlOjoKKworICAgID4+PiBkZWYgZigpOiBmKCkKKyAgICAuLi4KKyAgICA+Pj4gZigpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIGYKKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIGYKKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIGYKKyAgICAgIFtQcmV2aW91cyBsaW5lIHJlcGVhdGVkIDk5NSBtb3JlIHRpbWVzXQorICAgIFJlY3Vyc2lvbkVycm9yOiBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCBleGNlZWRlZAorCisoQ29udHJpYnV0ZWQgYnkgRW1hbnVlbCBCYXJyeSBpbiA6aXNzdWU6YDI2ODIzYC4pCisKKwordHlwaW5nCistLS0tLS0KKworVGhlIDpjbGFzczpgdHlwaW5nLkNvbnRleHRNYW5hZ2VyYCBjbGFzcyBoYXMgYmVlbiBhZGRlZCBmb3IKK3JlcHJlc2VudGluZyA6Y2xhc3M6YGNvbnRleHRsaWIuQWJzdHJhY3RDb250ZXh0TWFuYWdlcmAuCisoQ29udHJpYnV0ZWQgYnkgQnJldHQgQ2Fubm9uIGluIDppc3N1ZTpgMjU2MDlgLikKKworCit1bml0dGVzdC5tb2NrCistLS0tLS0tLS0tLS0tCisKK1RoZSA6Y2xhc3M6YH51bml0dGVzdC5tb2NrLk1vY2tgIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIGltcHJvdmVtZW50czoKKworKiBUd28gbmV3IG1ldGhvZHMsIDptZXRoOmBNb2NrLmFzc2VydF9jYWxsZWQoKQorICA8dW5pdHRlc3QubW9jay5Nb2NrLmFzc2VydF9jYWxsZWQ+YCBhbmQgOm1ldGg6YE1vY2suYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKyAgPHVuaXR0ZXN0Lm1vY2suTW9jay5hc3NlcnRfY2FsbGVkX29uY2U+YCB0byBjaGVjayBpZiB0aGUgbW9jayBvYmplY3QKKyAgd2FzIGNhbGxlZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IEFtaXQgU2FoYSBpbiA6aXNzdWU6YDI2MzIzYC4pCisKKwordXJsbGliLnJlcXVlc3QKKy0tLS0tLS0tLS0tLS0tCisKK0lmIGEgSFRUUCByZXF1ZXN0IGhhcyBhIGZpbGUgb3IgaXRlcmFibGUgYm9keSAob3RoZXIgdGhhbiBhCitieXRlcyBvYmplY3QpIGJ1dCBubyBDb250ZW50LUxlbmd0aCBoZWFkZXIsIHJhdGhlciB0aGFuCit0aHJvd2luZyBhbiBlcnJvciwgOmNsYXNzOmB+dXJsbGliLnJlcXVlc3QuQWJzdHJhY3RIVFRQSGFuZGxlcmAgbm93CitmYWxscyBiYWNrIHRvIHVzZSBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLgorKENvbnRyaWJ1dGVkIGJ5IERlbWlhbiBCcmVjaHQgYW5kIFJvbGYgS3JhaGwgaW4gOmlzc3VlOmAxMjMxOWAuKQorCisKK3VybGxpYi5yb2JvdHBhcnNlcgorLS0tLS0tLS0tLS0tLS0tLS0tCisKKzpjbGFzczpgfnVybGxpYi5yb2JvdHBhcnNlci5Sb2JvdEZpbGVQYXJzZXJgIG5vdyBzdXBwb3J0cyB0aGUgYGBDcmF3bC1kZWxheWBgIGFuZAorYGBSZXF1ZXN0LXJhdGVgYCBleHRlbnNpb25zLgorKENvbnRyaWJ1dGVkIGJ5IE5pa29sYXkgQm9nb3ljaGV2IGluIDppc3N1ZTpgMTYwOTlgLikKKworCit3YXJuaW5ncworLS0tLS0tLS0KKworQSBuZXcgb3B0aW9uYWwgKnNvdXJjZSogcGFyYW1ldGVyIGhhcyBiZWVuIGFkZGVkIHRvIHRoZQorOmZ1bmM6YHdhcm5pbmdzLndhcm5fZXhwbGljaXRgIGZ1bmN0aW9uOiB0aGUgZGVzdHJveWVkIG9iamVjdCB3aGljaCBlbWl0dGVkIGEKKzpleGM6YFJlc291cmNlV2FybmluZ2AuIEEgKnNvdXJjZSogYXR0cmlidXRlIGhhcyBhbHNvIGJlZW4gYWRkZWQgdG8KKzpjbGFzczpgd2FybmluZ3MuV2FybmluZ01lc3NhZ2VgIChjb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorOmlzc3VlOmAyNjU2OGAgYW5kIDppc3N1ZTpgMjY1NjdgKS4KKworV2hlbiBhIDpleGM6YFJlc291cmNlV2FybmluZ2Agd2FybmluZyBpcyBsb2dnZWQsIHRoZSA6bW9kOmB0cmFjZW1hbGxvY2AgaXMgbm93Cit1c2VkIHRvIHRyeSB0byByZXRyaWV2ZSB0aGUgdHJhY2ViYWNrIHdoZXJlIHRoZSBkZXRyb3llZCBvYmplY3Qgd2FzIGFsbG9jYXRlZC4KKworRXhhbXBsZSB3aXRoIHRoZSBzY3JpcHQgYGBleGFtcGxlLnB5YGA6OgorCisgICAgaW1wb3J0IHdhcm5pbmdzCisKKyAgICBkZWYgZnVuYygpOgorICAgICAgICByZXR1cm4gb3BlbihfX2ZpbGVfXykKKworICAgIGYgPSBmdW5jKCkKKyAgICBmID0gTm9uZQorCitPdXRwdXQgb2YgdGhlIGNvbW1hbmQgYGBweXRob24zLjYgLVdkIC1YIHRyYWNlbWFsbG9jPTUgZXhhbXBsZS5weWBgOjoKKworICAgIGV4YW1wbGUucHk6NzogUmVzb3VyY2VXYXJuaW5nOiB1bmNsb3NlZCBmaWxlIDxfaW8uVGV4dElPV3JhcHBlciBuYW1lPSdleGFtcGxlLnB5JyBtb2RlPSdyJyBlbmNvZGluZz0nVVRGLTgnPgorICAgICAgZiA9IE5vbmUKKyAgICBPYmplY3QgYWxsb2NhdGVkIGF0IChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyAgICAgIEZpbGUgImV4YW1wbGUucHkiLCBsaW5lbm8gNAorICAgICAgICByZXR1cm4gb3BlbihfX2ZpbGVfXykKKyAgICAgIEZpbGUgImV4YW1wbGUucHkiLCBsaW5lbm8gNgorICAgICAgICBmID0gZnVuYygpCisKK1RoZSAiT2JqZWN0IGFsbG9jYXRlZCBhdCIgdHJhY2ViYWNrIGlzIG5ldyBhbmQgb25seSBkaXNwbGF5ZWQgaWYKKzptb2Q6YHRyYWNlbWFsbG9jYCBpcyB0cmFjaW5nIFB5dGhvbiBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIGlmIHRoZQorOm1vZDpgd2FybmluZ3NgIHdhcyBhbHJlYWR5IGltcG9ydGVkLgorCisKK3dpbnJlZworLS0tLS0tCisKK0FkZGVkIHRoZSA2NC1iaXQgaW50ZWdlciB0eXBlIDpkYXRhOmBSRUdfUVdPUkQgPHdpbnJlZy5SRUdfUVdPUkQ+YC4KKyhDb250cmlidXRlZCBieSBDbGVtZW50IFJvdWF1bHQgaW4gOmlzc3VlOmAyMzAyNmAuKQorCisKK3dpbnNvdW5kCistLS0tLS0tLQorCitBbGxvd2VkIGtleXdvcmQgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byA6ZnVuYzpgQmVlcCA8d2luc291bmQuQmVlcD5gLAorOmZ1bmM6YE1lc3NhZ2VCZWVwIDx3aW5zb3VuZC5NZXNzYWdlQmVlcD5gLCBhbmQgOmZ1bmM6YFBsYXlTb3VuZAorPHdpbnNvdW5kLlBsYXlTb3VuZD5gICg6aXNzdWU6YDI3OTgyYCkuCisKKworemlwZmlsZQorLS0tLS0tLQorCitBIG5ldyA6bWV0aDpgWmlwSW5mby5mcm9tX2ZpbGUoKSA8emlwZmlsZS5aaXBJbmZvLmZyb21fZmlsZT5gIGNsYXNzIG1ldGhvZAorYWxsb3dzIG1ha2luZyBhIDpjbGFzczpgfnppcGZpbGUuWmlwSW5mb2AgaW5zdGFuY2UgZnJvbSBhIGZpbGVzeXN0ZW0gZmlsZS4KK0EgbmV3IDptZXRoOmBaaXBJbmZvLmlzX2RpcigpIDx6aXBmaWxlLlppcEluZm8uaXNfZGlyPmAgbWV0aG9kIGNhbiBiZSB1c2VkCit0byBjaGVjayBpZiB0aGUgOmNsYXNzOmB+emlwZmlsZS5aaXBJbmZvYCBpbnN0YW5jZSByZXByZXNlbnRzIGEgZGlyZWN0b3J5LgorKENvbnRyaWJ1dGVkIGJ5IFRob21hcyBLbHV5dmVyIGluIDppc3N1ZTpgMjYwMzlgLikKKworVGhlIDptZXRoOmBaaXBGaWxlLm9wZW4oKSA8emlwZmlsZS5aaXBGaWxlLm9wZW4+YCBtZXRob2QgY2FuIG5vdyBiZSB1c2VkIHRvCit3cml0ZSBkYXRhIGludG8gYSBaSVAgZmlsZSwgYXMgd2VsbCBhcyBmb3IgZXh0cmFjdGluZyBkYXRhLgorKENvbnRyaWJ1dGVkIGJ5IFRob21hcyBLbHV5dmVyIGluIDppc3N1ZTpgMjYwMzlgLikKKworCit6bGliCistLS0tCisKK1RoZSA6ZnVuYzpgfnpsaWIuY29tcHJlc3NgIGZ1bmN0aW9uIG5vdyBhY2NlcHRzIGtleXdvcmQgYXJndW1lbnRzLgorKENvbnRyaWJ1dGVkIGJ5IEF2aXYgUGFsaXZvZGEgaW4gOmlzc3VlOmAyNjI0M2AuKQorCisKK2ZpbGVpbnB1dAorLS0tLS0tLS0tCisKKzpmdW5jOmB+ZmlsZWlucHV0Lmhvb2tfZW5jb2RlZGAgbm93IHN1cHBvcnRzIHRoZSAqZXJyb3JzKiBhcmd1bWVudC4KKyhDb250cmlidXRlZCBieSBKb3NlcGggSGFja21hbiBpbiA6aXNzdWU6YDI1Nzg4YC4pCisKKworT3B0aW1pemF0aW9ucworPT09PT09PT09PT09PQorCisqIFRoZSBBU0NJSSBkZWNvZGVyIGlzIG5vdyB1cCB0byA2MCB0aW1lcyBhcyBmYXN0IGZvciBlcnJvciBoYW5kbGVycworICBgYHN1cnJvZ2F0ZWVzY2FwZWBgLCBgYGlnbm9yZWBgIGFuZCBgYHJlcGxhY2VgYCAoQ29udHJpYnV0ZWQKKyAgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNDg3MGApLgorCisqIFRoZSBBU0NJSSBhbmQgdGhlIExhdGluMSBlbmNvZGVycyBhcmUgbm93IHVwIHRvIDMgdGltZXMgYXMgZmFzdCBmb3IgdGhlCisgIGVycm9yIGhhbmRsZXIgYGBzdXJyb2dhdGVlc2NhcGVgYCAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTIyN2ApLgorCisqIFRoZSBVVEYtOCBlbmNvZGVyIGlzIG5vdyB1cCB0byA3NSB0aW1lcyBhcyBmYXN0IGZvciBlcnJvciBoYW5kbGVycworICBgYGlnbm9yZWBgLCBgYHJlcGxhY2VgYCwgYGBzdXJyb2dhdGVlc2NhcGVgYCwgYGBzdXJyb2dhdGVwYXNzYGAgKENvbnRyaWJ1dGVkCisgIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjUyNjdgKS4KKworKiBUaGUgVVRGLTggZGVjb2RlciBpcyBub3cgdXAgdG8gMTUgdGltZXMgYXMgZmFzdCBmb3IgZXJyb3IgaGFuZGxlcnMKKyAgYGBpZ25vcmVgYCwgYGByZXBsYWNlYGAgYW5kIGBgc3Vycm9nYXRlZXNjYXBlYGAgKENvbnRyaWJ1dGVkCisgIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjUzMDFgKS4KKworKiBgYGJ5dGVzICUgYXJnc2BgIGlzIG5vdyB1cCB0byAyIHRpbWVzIGZhc3Rlci4gKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyCisgIGluIDppc3N1ZTpgMjUzNDlgKS4KKworKiBgYGJ5dGVhcnJheSAlIGFyZ3NgYCBpcyBub3cgYmV0d2VlbiAyLjUgYW5kIDUgdGltZXMgZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkKKyAgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTM5OWApLgorCisqIE9wdGltaXplIDptZXRoOmBieXRlcy5mcm9taGV4YCBhbmQgOm1ldGg6YGJ5dGVhcnJheS5mcm9taGV4YDogdGhleSBhcmUgbm93CisgIGJldHdlZW4gMnggYW5kIDMuNXggZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTQwMWApLgorCisqIE9wdGltaXplIGBgYnl0ZXMucmVwbGFjZShiJycsIGInLicpYGAgYW5kIGBgYnl0ZWFycmF5LnJlcGxhY2UoYicnLCBiJy4nKWBgOgorICB1cCB0byA4MCUgZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkgSm9zaCBTbmlkZXIgaW4gOmlzc3VlOmAyNjU3NGApLgorCisqIEFsbG9jYXRvciBmdW5jdGlvbnMgb2YgdGhlIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AgZG9tYWluCisgICg6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCkgbm93IHVzZSB0aGUgOnJlZjpgcHltYWxsb2MgbWVtb3J5IGFsbG9jYXRvcgorICA8cHltYWxsb2M+YCBpbnN0ZWFkIG9mIDpjOmZ1bmM6YG1hbGxvY2AgZnVuY3Rpb24gb2YgdGhlIEMgbGlicmFyeS4gVGhlCisgIHB5bWFsbG9jIGFsbG9jYXRvciBpcyBvcHRpbWl6ZWQgZm9yIG9iamVjdHMgc21hbGxlciBvciBlcXVhbCB0byA1MTIgYnl0ZXMKKyAgd2l0aCBhIHNob3J0IGxpZmV0aW1lLCBhbmQgdXNlIDpjOmZ1bmM6YG1hbGxvY2AgZm9yIGxhcmdlciBtZW1vcnkgYmxvY2tzLgorICAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNjI0OWApLgorCisqIDpmdW5jOmBwaWNrbGUubG9hZGAgYW5kIDpmdW5jOmBwaWNrbGUubG9hZHNgIGFyZSBub3cgdXAgdG8gMTAlIGZhc3RlciB3aGVuCisgIGRlc2VyaWFsaXppbmcgbWFueSBzbWFsbCBvYmplY3RzIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorICA6aXNzdWU6YDI3MDU2YCkuCisKKy0gUGFzc2luZyA6dGVybTpga2V5d29yZCBhcmd1bWVudHMgPGtleXdvcmQgYXJndW1lbnQ+YCB0byBhIGZ1bmN0aW9uIGhhcyBhbgorICBvdmVyaGVhZCBpbiBjb21wYXJpc29uIHdpdGggcGFzc2luZyA6dGVybTpgcG9zaXRpb25hbCBhcmd1bWVudHMKKyAgPHBvc2l0aW9uYWwgYXJndW1lbnQ+YC4gIE5vdyBpbiBleHRlbnNpb24gZnVuY3Rpb25zIGltcGxlbWVudGVkIHdpdGggdXNpbmcKKyAgQXJndW1lbnQgQ2xpbmljIHRoaXMgb3ZlcmhlYWQgaXMgc2lnbmlmaWNhbnRseSBkZWNyZWFzZWQuCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjc1NzRgKS4KKworKiBPcHRpbWl6ZWQgOmZ1bmM6YH5nbG9iLmdsb2JgIGFuZCA6ZnVuYzpgfmdsb2IuaWdsb2JgIGZ1bmN0aW9ucyBpbiB0aGUKKyAgOm1vZDpgZ2xvYmAgbW9kdWxlOyB0aGV5IGFyZSBub3cgYWJvdXQgMy0tNiB0aW1lcyBmYXN0ZXIuCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjU1OTZgKS4KKworKiBPcHRpbWl6ZWQgZ2xvYmJpbmcgaW4gOm1vZDpgcGF0aGxpYmAgYnkgdXNpbmcgOmZ1bmM6YG9zLnNjYW5kaXJgOworICBpdCBpcyBub3cgYWJvdXQgMS41LS00IHRpbWVzIGZhc3Rlci4KKyAgKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAyNjAzMmApLgorCitCdWlsZCBhbmQgQyBBUEkgQ2hhbmdlcworPT09PT09PT09PT09PT09PT09PT09PT0KKworKiBQeXRob24gbm93IHJlcXVpcmVzIHNvbWUgQzk5IHN1cHBvcnQgaW4gdGhlIHRvb2xjaGFpbiB0byBidWlsZC4gRm9yIG1vcmUKKyAgaW5mb3JtYXRpb24sIHNlZSA6cGVwOmA3YC4KKworKiBUaGUgYGAtLXdpdGgtb3B0aW1pemF0aW9uc2BgIGNvbmZpZ3VyZSBmbGFnIGhhcyBiZWVuIGFkZGVkLiBUdXJuaW5nIGl0IG9uCisgIHdpbGwgYWN0aXZhdGUgTFRPIGFuZCBQR08gYnVpbGQgc3VwcG9ydCAod2hlbiBhdmFpbGFibGUpLgorICAoT3JpZ2luYWwgcGF0Y2ggYnkgQWxlY3NhbmRydSBQYXRyYXNjdSBvZiBJbnRlbCBpbiA6aXNzdWU6YDI2NTM5YC4pCisKKyogTmV3IDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIEFQSSB3aGljaCBpbmRpY2F0ZXMgaWYgZmx1c2hpbmcgYnVmZmVyZWQgZGF0YQorICBmYWlsZWQgKDppc3N1ZTpgNTMxOWApLgorCisqIDpjOmZ1bmM6YFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc2Agbm93IHN1cHBvcnRzIDpyZWY6YHBvc2l0aW9uYWwtb25seQorICBwYXJhbWV0ZXJzIDxwb3NpdGlvbmFsLW9ubHlfcGFyYW1ldGVyPmAuICBQb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycyBhcmUKKyAgZGVmaW5lZCBieSBlbXB0eSBuYW1lcy4KKyAgKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAyNjI4MmApLgorCisqIGBgUHlUcmFjZWJhY2tfUHJpbnRgYCBtZXRob2Qgbm93IGFiYnJldmlhdGVzIGxvbmcgc2VxdWVuY2VzIG9mIHJlcGVhdGVkIGxpbmVzCisgIGFzIGBgIltQcmV2aW91cyBsaW5lIHJlcGVhdGVkIHtjb3VudH0gbW9yZSB0aW1lc10iYGAuCisgIChDb250cmlidXRlZCBieSBFbWFudWVsIEJhcnJ5IGluIDppc3N1ZTpgMjY4MjNgLikKKworCitEZXByZWNhdGVkCis9PT09PT09PT09CisKK05ldyBLZXl3b3JkcworLS0tLS0tLS0tLS0tCisKK2BgYXN5bmNgYCBhbmQgYGBhd2FpdGBgIGFyZSBub3QgcmVjb21tZW5kZWQgdG8gYmUgdXNlZCBhcyB2YXJpYWJsZSwgY2xhc3MsCitmdW5jdGlvbiBvciBtb2R1bGUgbmFtZXMuICBJbnRyb2R1Y2VkIGJ5IDpwZXA6YDQ5MmAgaW4gUHl0aG9uIDMuNSwgdGhleSB3aWxsCitiZWNvbWUgcHJvcGVyIGtleXdvcmRzIGluIFB5dGhvbiAzLjcuCisKKworRGVwcmVjYXRlZCBQeXRob24gbW9kdWxlcywgZnVuY3Rpb25zIGFuZCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiA6bWV0aDpgaW1wb3J0bGliLm1hY2hpbmVyeS5Tb3VyY2VGaWxlTG9hZGVyLmxvYWRfbW9kdWxlYCBhbmQKKyAgOm1ldGg6YGltcG9ydGxpYi5tYWNoaW5lcnkuU291cmNlbGVzc0ZpbGVMb2FkZXIubG9hZF9tb2R1bGVgIGFyZSBub3cKKyAgZGVwcmVjYXRlZC4gVGhleSB3ZXJlIHRoZSBvbmx5IHJlbWFpbmluZyBpbXBsZW1lbnRhdGlvbnMgb2YKKyAgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlYCBpbiA6bW9kOmBpbXBvcnRsaWJgIHRoYXQgaGFkIG5vdAorICBiZWVuIGRlcHJlY2F0ZWQgaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uIGluIGZhdm91ciBvZgorICA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIuZXhlY19tb2R1bGVgLgorCisKK0RlcHJlY2F0ZWQgZnVuY3Rpb25zIGFuZCB0eXBlcyBvZiB0aGUgQyBBUEkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBOb25lIHlldC4KKworCitEZXByZWNhdGVkIGZlYXR1cmVzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogVGhlIGBgcHl2ZW52YGAgc2NyaXB0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGBgcHl0aG9uMyAtbSB2ZW52YGAuCisgIFRoaXMgcHJldmVudHMgY29uZnVzaW9uIGFzIHRvIHdoYXQgUHl0aG9uIGludGVycHJldGVyIGBgcHl2ZW52YGAgaXMKKyAgY29ubmVjdGVkIHRvIGFuZCB0aHVzIHdoYXQgUHl0aG9uIGludGVycHJldGVyIHdpbGwgYmUgdXNlZCBieSB0aGUgdmlydHVhbAorICBlbnZpcm9ubWVudC4gKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDI1MTU0YC4pCisKKyogV2hlbiBwZXJmb3JtaW5nIGEgcmVsYXRpdmUgaW1wb3J0LCBmYWxsaW5nIGJhY2sgb24gYGBfX25hbWVfX2BgIGFuZAorICBgYF9fcGF0aF9fYGAgZnJvbSB0aGUgY2FsbGluZyBtb2R1bGUgd2hlbiBgYF9fc3BlY19fYGAgb3IKKyAgYGBfX3BhY2thZ2VfX2BgIGFyZSBub3QgZGVmaW5lZCBub3cgcmFpc2VzIGFuIDpleGM6YEltcG9ydFdhcm5pbmdgLgorICAoQ29udHJpYnV0ZWQgYnkgUm9zZSBBbWVzIGluIDppc3N1ZTpgMjU3OTFgLikKKworKiBVbmxpa2UgdG8gb3RoZXIgOm1vZDpgZGJtYCBpbXBsZW1lbnRhdGlvbnMsIHRoZSA6bW9kOmBkYm0uZHVtYmAgbW9kdWxlCisgIGNyZWF0ZXMgZGF0YWJhc2UgaW4gYGAncidgYCBhbmQgYGAndydgYCBtb2RlcyBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZAorICBhbGxvd3MgbW9kaWZ5aW5nIGRhdGFiYXNlIGluIGBgJ3InYGAgbW9kZS4gIFRoaXMgYmVoYXZpb3IgaXMgbm93IGRlcHJlY2F0ZWQKKyAgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjguCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjE3MDhgLikKKworKiBVbmRvY3VtZW50ZWQgc3VwcG9ydCBvZiBnZW5lcmFsIDp0ZXJtOmBieXRlcy1saWtlIG9iamVjdHMgPGJ5dGVzLWxpa2Ugb2JqZWN0PmAKKyAgYXMgcGF0aHMgaW4gOm1vZDpgb3NgIGZ1bmN0aW9ucywgOmZ1bmM6YGNvbXBpbGVgIGFuZCBzaW1pbGFyIGZ1bmN0aW9ucyBpcworICBub3cgZGVwcmVjYXRlZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAyNTc5MWAgYW5kIDppc3N1ZTpgMjY3NTRgLikKKworKiBUaGUgdW5kb2N1bWVudGVkIGBgZXh0cmFfcGF0aGBgIGFyZ3VtZW50IHRvIGEgZGlzdHV0aWxzIERpc3RyaWJ1dGlvbgorICBpcyBub3cgY29uc2lkZXJlZAorICBkZXByZWNhdGVkLCB3aWxsIHJhaXNlIGEgd2FybmluZyBkdXJpbmcgaW5zdGFsbCBpZiBzZXQuIFN1cHBvcnQgZm9yIHRoaXMKKyAgcGFyYW1ldGVyIHdpbGwgYmUgZHJvcHBlZCBpbiBhIGZ1dHVyZSBQeXRob24gcmVsZWFzZSBhbmQgbGlrZWx5IGVhcmxpZXIKKyAgdGhyb3VnaCB0aGlyZCBwYXJ0eSB0b29scy4gU2VlIDppc3N1ZTpgMjc5MTlgIGZvciBkZXRhaWxzLgorCisqIEEgYmFja3NsYXNoLWNoYXJhY3RlciBwYWlyIHRoYXQgaXMgbm90IGEgdmFsaWQgZXNjYXBlIHNlcXVlbmNlIG5vdyBnZW5lcmF0ZXMKKyAgYSBEZXByZWNhdGlvbldhcm5pbmcuICBBbHRob3VnaCB0aGlzIHdpbGwgZXZlbnR1YWxseSBiZWNvbWUgYSBTeW50YXhFcnJvciwKKyAgdGhhdCB3aWxsIG5vdCBiZSBmb3Igc2V2ZXJhbCBQeXRob24gcmVsZWFzZXMuICAoQ29udHJpYnV0ZWQgYnkgRW1hbnVlbCBCYXJyeQorICBpbiA6aXNzdWU6YDI3MzY0YC4pCisKKworRGVwcmVjYXRlZCBQeXRob24gYmVoYXZpb3IKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogUmFpc2luZyB0aGUgOmV4YzpgU3RvcEl0ZXJhdGlvbmAgZXhjZXB0aW9uIGluc2lkZSBhIGdlbmVyYXRvciB3aWxsIG5vdyBnZW5lcmF0ZSBhCisgIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2AsIGFuZCB3aWxsIHRyaWdnZXIgYSA6ZXhjOmBSdW50aW1lRXJyb3JgIGluIFB5dGhvbiAzLjcuCisgIFNlZSA6cmVmOmB3aGF0c25ldy1wZXAtNDc5YCBmb3IgZGV0YWlscy4KKworCitSZW1vdmVkCis9PT09PT09CisKK0FQSSBhbmQgRmVhdHVyZSBSZW1vdmFscworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogYGBpbnNwZWN0LmdldG1vZHVsZWluZm8oKWBgIHdhcyByZW1vdmVkICh3YXMgZGVwcmVjYXRlZCBzaW5jZSBDUHl0aG9uIDMuMykuCisgIDpmdW5jOmBpbnNwZWN0LmdldG1vZHVsZW5hbWVgIHNob3VsZCBiZSB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIG1vZHVsZQorICBuYW1lIGZvciBhIGdpdmVuIHBhdGguCisKKyogYGB0cmFjZWJhY2suSWdub3JlYGAgY2xhc3MgYW5kIGBgdHJhY2ViYWNrLnVzYWdlYGAsIGBgdHJhY2ViYWNrLm1vZG5hbWVgYCwKKyAgYGB0cmFjZWJhY2suZnVsbG1vZG5hbWVgYCwgYGB0cmFjZWJhY2suZmluZF9saW5lc19mcm9tX2NvZGVgYCwKKyAgYGB0cmFjZWJhY2suZmluZF9saW5lc2BgLCBgYHRyYWNlYmFjay5maW5kX3N0cmluZ3NgYCwKKyAgYGB0cmFjZWJhY2suZmluZF9leGVjdXRhYmxlX2xpbmVzYGAgbWV0aG9kcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUKKyAgOm1vZDpgdHJhY2ViYWNrYCBtb2R1bGUuIFRoZXkgd2VyZSB1bmRvY3VtZW50ZWQgbWV0aG9kcyBkZXByZWNhdGVkIHNpbmNlCisgIFB5dGhvbiAzLjIgYW5kIGVxdWl2YWxlbnQgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgZnJvbSBwcml2YXRlIG1ldGhvZHMuCisKKyogVGhlIGBgdGtfbWVudUJhcigpYGAgYW5kIGBgdGtfYmluZEZvclRyYXZlcnNhbCgpYGAgZHVtbXkgbWV0aG9kcyBpbgorICA6bW9kOmB0a2ludGVyYCB3aWRnZXQgY2xhc3NlcyB3ZXJlIHJlbW92ZWQgKGNvcnJlc3BvbmRpbmcgVGsgY29tbWFuZHMKKyAgd2VyZSBvYnNvbGV0ZSBzaW5jZSBUayA0LjApLgorCisqIFRoZSA6bWV0aDpgfnppcGZpbGUuWmlwRmlsZS5vcGVuYCBtZXRob2Qgb2YgdGhlIDpjbGFzczpgemlwZmlsZS5aaXBGaWxlYAorICBjbGFzcyBubyBsb25nZXIgc3VwcG9ydHMgdGhlIGBgJ1UnYGAgbW9kZSAod2FzIGRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDMuNCkuCisgIFVzZSA6Y2xhc3M6YGlvLlRleHRJT1dyYXBwZXJgIGZvciByZWFkaW5nIGNvbXByZXNzZWQgdGV4dCBmaWxlcyBpbgorICA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBtb2RlLgorCisqIFRoZSB1bmRvY3VtZW50ZWQgYGBJTmBgLCBgYENEUk9NYGAsIGBgRExGQ05gYCwgYGBUWVBFU2BgLCBgYENESU9gYCwgYW5kCisgIGBgU1RST1BUU2BgIG1vZHVsZXMgaGF2ZSBiZWVuIHJlbW92ZWQuICBUaGV5IGhhZCBiZWVuIGF2YWlsYWJsZSBpbiB0aGUKKyAgcGxhdGZvcm0gc3BlY2lmaWMgYGBMaWIvcGxhdC0qL2BgIGRpcmVjdG9yaWVzLCBidXQgd2VyZSBjaHJvbmljYWxseSBvdXQgb2YKKyAgZGF0ZSwgaW5jb25zaXN0ZW50bHkgYXZhaWxhYmxlIGFjcm9zcyBwbGF0Zm9ybXMsIGFuZCB1bm1haW50YWluZWQuICBUaGUKKyAgc2NyaXB0IHRoYXQgY3JlYXRlZCB0aGVzZSBtb2R1bGVzIGlzIHN0aWxsIGF2YWlsYWJsZSBpbiB0aGUgc291cmNlCisgIGRpc3RyaWJ1dGlvbiBhdCA6c291cmNlOmBUb29scy9zY3JpcHRzL2gycHkucHlgLgorCisKK1BvcnRpbmcgdG8gUHl0aG9uIDMuNgorPT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc2VjdGlvbiBsaXN0cyBwcmV2aW91c2x5IGRlc2NyaWJlZCBjaGFuZ2VzIGFuZCBvdGhlciBidWdmaXhlcwordGhhdCBtYXkgcmVxdWlyZSBjaGFuZ2VzIHRvIHlvdXIgY29kZS4KKworQ2hhbmdlcyBpbiAncHl0aG9uJyBDb21tYW5kIEJlaGF2aW9yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBUaGUgb3V0cHV0IG9mIGEgc3BlY2lhbCBQeXRob24gYnVpbGQgd2l0aCBkZWZpbmVkIGBgQ09VTlRfQUxMT0NTYGAsCisgIGBgU0hPV19BTExPQ19DT1VOVGBgIG9yIGBgU0hPV19UUkFDS19DT1VOVGBgIG1hY3JvcyBpcyBub3cgb2ZmIGJ5CisgIGRlZmF1bHQuICBJdCBjYW4gYmUgcmUtZW5hYmxlZCB1c2luZyB0aGUgYGAtWCBzaG93YWxsb2Njb3VudGBgIG9wdGlvbi4KKyAgSXQgbm93IG91dHB1dHMgdG8gYGBzdGRlcnJgYCBpbnN0ZWFkIG9mIGBgc3Rkb3V0YGAuCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjMwMzRgLikKKworCitDaGFuZ2VzIGluIHRoZSBQeXRob24gQVBJCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogT24gTGludXgsIDpmdW5jOmBvcy51cmFuZG9tYCBub3cgYmxvY2tzIHVudGlsIHRoZSBzeXN0ZW0gdXJhbmRvbSBlbnRyb3B5IHBvb2wKKyAgaXMgaW5pdGlhbGl6ZWQgdG8gaW5jcmVhc2UgdGhlIHNlY3VyaXR5LgorCisqIFdoZW4gOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmV4ZWNfbW9kdWxlYCBpcyBkZWZpbmVkLAorICA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZWAgbXVzdCBhbHNvIGJlIGRlZmluZWQuCisKKyogOmM6ZnVuYzpgUHlFcnJfU2V0SW1wb3J0RXJyb3JgIG5vdyBzZXRzIDpleGM6YFR5cGVFcnJvcmAgd2hlbiBpdHMgKiptc2cqKgorICBhcmd1bWVudCBpcyBub3Qgc2V0LiBQcmV2aW91c2x5IG9ubHkgYGBOVUxMYGAgd2FzIHJldHVybmVkLgorCisqIFRoZSBmb3JtYXQgb2YgdGhlIGBgY29fbG5vdGFiYGAgYXR0cmlidXRlIG9mIGNvZGUgb2JqZWN0cyBjaGFuZ2VkIHRvIHN1cHBvcnQKKyAgbmVnYXRpdmUgbGluZSBudW1iZXIgZGVsdGEuIEJ5IGRlZmF1bHQsIFB5dGhvbiBkb2VzIG5vdCBlbWl0IGJ5dGVjb2RlIHdpdGgKKyAgbmVnYXRpdmUgbGluZSBudW1iZXIgZGVsdGEuIEZ1bmN0aW9ucyB1c2luZyBgYGZyYW1lLmZfbGluZW5vYGAsCisgIGBgUHlGcmFtZV9HZXRMaW5lTnVtYmVyKClgYCBvciBgYFB5Q29kZV9BZGRyMkxpbmUoKWBgIGFyZSBub3QgYWZmZWN0ZWQuCisgIEZ1bmN0aW9ucyBkZWNvZGluZyBkaXJlY3RseSBgYGNvX2xub3RhYmBgIHNob3VsZCBiZSB1cGRhdGVkIHRvIHVzZSBhIHNpZ25lZAorICA4LWJpdCBpbnRlZ2VyIHR5cGUgZm9yIHRoZSBsaW5lIG51bWJlciBkZWx0YSwgYnV0IGl0J3Mgb25seSByZXF1aXJlZCB0bworICBzdXBwb3J0IGFwcGxpY2F0aW9ucyB1c2luZyBuZWdhdGl2ZSBsaW5lIG51bWJlciBkZWx0YS4gU2VlCisgIGBgT2JqZWN0cy9sbm90YWJfbm90ZXMudHh0YGAgZm9yIHRoZSBgYGNvX2xub3RhYmBgIGZvcm1hdCBhbmQgaG93IHRvIGRlY29kZQorICBpdCwgYW5kIHNlZSB0aGUgOnBlcDpgNTExYCBmb3IgdGhlIHJhdGlvbmFsZS4KKworKiBUaGUgZnVuY3Rpb25zIGluIHRoZSA6bW9kOmBjb21waWxlYWxsYCBtb2R1bGUgbm93IHJldHVybiBib29sZWFucyBpbnN0ZWFkCisgIG9mIGBgMWBgIG9yIGBgMGBgIHRvIHJlcHJlc2VudCBzdWNjZXNzIG9yIGZhaWx1cmUsIHJlc3BlY3RpdmVseS4gVGhhbmtzIHRvCisgIGJvb2xlYW5zIGJlaW5nIGEgc3ViY2xhc3Mgb2YgaW50ZWdlcnMsIHRoaXMgc2hvdWxkIG9ubHkgYmUgYW4gaXNzdWUgaWYgeW91CisgIHdlcmUgZG9pbmcgaWRlbnRpdHkgY2hlY2tzIGZvciBgYDFgYCBvciBgYDBgYC4gU2VlIDppc3N1ZTpgMjU3NjhgLgorCisqIFJlYWRpbmcgdGhlIDphdHRyOmB+dXJsbGliLnBhcnNlLlNwbGl0UmVzdWx0LnBvcnRgIGF0dHJpYnV0ZSBvZgorICA6ZnVuYzpgdXJsbGliLnBhcnNlLnVybHNwbGl0YCBhbmQgOmZ1bmM6YH51cmxsaWIucGFyc2UudXJscGFyc2VgIHJlc3VsdHMKKyAgbm93IHJhaXNlcyA6ZXhjOmBWYWx1ZUVycm9yYCBmb3Igb3V0LW9mLXJhbmdlIHZhbHVlcywgcmF0aGVyIHRoYW4KKyAgcmV0dXJuaW5nIDpjb25zdDpgTm9uZWAuICBTZWUgOmlzc3VlOmAyMDA1OWAuCisKKyogVGhlIDptb2Q6YGltcGAgbW9kdWxlIG5vdyByYWlzZXMgYSA6ZXhjOmBEZXByZWNhdGlvbldhcm5pbmdgIGluc3RlYWQgb2YKKyAgOmV4YzpgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZ2AuCisKKyogVGhlIGZvbGxvd2luZyBtb2R1bGVzIGhhdmUgaGFkIG1pc3NpbmcgQVBJcyBhZGRlZCB0byB0aGVpciA6YXR0cjpgX19hbGxfX2AKKyAgYXR0cmlidXRlcyB0byBtYXRjaCB0aGUgZG9jdW1lbnRlZCBBUElzOgorICA6bW9kOmBjYWxlbmRhcmAsIDptb2Q6YGNnaWAsIDptb2Q6YGNzdmAsCisgIDptb2Q6YH54bWwuZXRyZWUuRWxlbWVudFRyZWVgLCA6bW9kOmBlbnVtYCwKKyAgOm1vZDpgZmlsZWlucHV0YCwgOm1vZDpgZnRwbGliYCwgOm1vZDpgbG9nZ2luZ2AsIDptb2Q6YG1haWxib3hgLAorICA6bW9kOmBtaW1ldHlwZXNgLCA6bW9kOmBvcHRwYXJzZWAsIDptb2Q6YHBsaXN0bGliYCwgOm1vZDpgc210cGRgLAorICA6bW9kOmBzdWJwcm9jZXNzYCwgOm1vZDpgdGFyZmlsZWAsIDptb2Q6YHRocmVhZGluZ2AgYW5kCisgIDptb2Q6YHdhdmVgLiAgVGhpcyBtZWFucyB0aGV5IHdpbGwgZXhwb3J0IG5ldyBzeW1ib2xzIHdoZW4gYGBpbXBvcnQgKmBgCisgIGlzIHVzZWQuICBTZWUgOmlzc3VlOmAyMzg4M2AuCisKKyogV2hlbiBwZXJmb3JtaW5nIGEgcmVsYXRpdmUgaW1wb3J0LCBpZiBgYF9fcGFja2FnZV9fYGAgZG9lcyBub3QgY29tcGFyZSBlcXVhbAorICB0byBgYF9fc3BlY19fLnBhcmVudGBgIHRoZW4gOmV4YzpgSW1wb3J0V2FybmluZ2AgaXMgcmFpc2VkLgorICAoQ29udHJpYnV0ZWQgYnkgQnJldHQgQ2Fubm9uIGluIDppc3N1ZTpgMjU3OTFgLikKKworKiBXaGVuIGEgcmVsYXRpdmUgaW1wb3J0IGlzIHBlcmZvcm1lZCBhbmQgbm8gcGFyZW50IHBhY2thZ2UgaXMga25vd24sIHRoZW4KKyAgOmV4YzpgSW1wb3J0RXJyb3JgIHdpbGwgYmUgcmFpc2VkLiBQcmV2aW91c2x5LCA6ZXhjOmBTeXN0ZW1FcnJvcmAgY291bGQgYmUKKyAgcmFpc2VkLiAoQ29udHJpYnV0ZWQgYnkgQnJldHQgQ2Fubm9uIGluIDppc3N1ZTpgMTgwMThgLikKKworKiBTZXJ2ZXJzIGJhc2VkIG9uIHRoZSA6bW9kOmBzb2NrZXRzZXJ2ZXJgIG1vZHVsZSwgaW5jbHVkaW5nIHRob3NlCisgIGRlZmluZWQgaW4gOm1vZDpgaHR0cC5zZXJ2ZXJgLCA6bW9kOmB4bWxycGMuc2VydmVyYCBhbmQKKyAgOm1vZDpgd3NnaXJlZi5zaW1wbGVfc2VydmVyYCwgbm93IG9ubHkgY2F0Y2ggZXhjZXB0aW9ucyBkZXJpdmVkCisgIGZyb20gOmV4YzpgRXhjZXB0aW9uYC4gVGhlcmVmb3JlIGlmIGEgcmVxdWVzdCBoYW5kbGVyIHJhaXNlcworICBhbiBleGNlcHRpb24gbGlrZSA6ZXhjOmBTeXN0ZW1FeGl0YCBvciA6ZXhjOmBLZXlib2FyZEludGVycnVwdGAsCisgIDptZXRoOmB+c29ja2V0c2VydmVyLkJhc2VTZXJ2ZXIuaGFuZGxlX2Vycm9yYCBpcyBubyBsb25nZXIgY2FsbGVkLCBhbmQKKyAgdGhlIGV4Y2VwdGlvbiB3aWxsIHN0b3AgYSBzaW5nbGUtdGhyZWFkZWQgc2VydmVyLiAoQ29udHJpYnV0ZWQgYnkKKyAgTWFydGluIFBhbnRlciBpbiA6aXNzdWU6YDIzNDMwYC4pCisKKyogOmZ1bmM6YHNwd2QuZ2V0c3BuYW1gIG5vdyByYWlzZXMgYSA6ZXhjOmBQZXJtaXNzaW9uRXJyb3JgIGluc3RlYWQgb2YKKyAgOmV4YzpgS2V5RXJyb3JgIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSBwcml2aWxlZ2VzLgorCisqIFRoZSA6bWV0aDpgc29ja2V0LnNvY2tldC5jbG9zZWAgbWV0aG9kIG5vdyByYWlzZXMgYW4gZXhjZXB0aW9uIGlmCisgIGFuIGVycm9yIChlLmcuIEVCQURGKSB3YXMgcmVwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcgc3lzdGVtIGNhbGwuCisgIFNlZSA6aXNzdWU6YDI2Njg1YC4KKworKiBUaGUgKmRlY29kZV9kYXRhKiBhcmd1bWVudCBmb3IgOmNsYXNzOmBzbXRwZC5TTVRQQ2hhbm5lbGAgYW5kCisgIDpjbGFzczpgc210cGQuU01UUFNlcnZlcmAgY29uc3RydWN0b3JzIGlzIG5vdyBgYEZhbHNlYGAgYnkgZGVmYXVsdC4KKyAgVGhpcyBtZWFucyB0aGF0IHRoZSBhcmd1bWVudCBwYXNzZWQgdG8KKyAgOm1ldGg6YH5zbXRwZC5TTVRQU2VydmVyLnByb2Nlc3NfbWVzc2FnZWAgaXMgbm93IGEgYnl0ZXMgb2JqZWN0IGJ5CisgIGRlZmF1bHQsIGFuZCBgYHByb2Nlc3NfbWVzc2FnZSgpYGAgd2lsbCBiZSBwYXNzZWQga2V5d29yZCBhcmd1bWVudHMuCisgIENvZGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBkZXByZWNhdGlvbgorICB3YXJuaW5nIGdlbmVyYXRlZCBieSAzLjUgd2lsbCBub3QgYmUgYWZmZWN0ZWQuCisKKyogQWxsIG9wdGlvbmFsIHBhcmFtZXRlcnMgb2YgdGhlIDpmdW5jOmB+anNvbi5kdW1wYCwgOmZ1bmM6YH5qc29uLmR1bXBzYCwKKyAgOmZ1bmM6YH5qc29uLmxvYWRgIGFuZCA6ZnVuYzpgfmpzb24ubG9hZHNgIGZ1bmN0aW9ucyBhbmQKKyAgOmNsYXNzOmB+anNvbi5KU09ORW5jb2RlcmAgYW5kIDpjbGFzczpgfmpzb24uSlNPTkRlY29kZXJgIGNsYXNzCisgIGNvbnN0cnVjdG9ycyBpbiB0aGUgOm1vZDpganNvbmAgbW9kdWxlIGFyZSBub3cgOnJlZjpga2V5d29yZC1vbmx5CisgIDxrZXl3b3JkLW9ubHlfcGFyYW1ldGVyPmAuCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMTg3MjZgLikKKworKiBBcyBwYXJ0IG9mIDpwZXA6YDQ4N2AsIHRoZSBoYW5kbGluZyBvZiBrZXl3b3JkIGFyZ3VtZW50cyBwYXNzZWQgdG8KKyAgOmNsYXNzOmB0eXBlYCAob3RoZXIgdGhhbiB0aGUgbWV0YWNsYXNzIGhpbnQsIGBgbWV0YWNsYXNzYGApIGlzIG5vdworICBjb25zaXN0ZW50bHkgZGVsZWdhdGVkIHRvIDptZXRoOmBvYmplY3QuX19pbml0X3N1YmNsYXNzX19gLiBUaGlzIG1lYW5zIHRoYXQKKyAgOm1ldGg6YHR5cGUuX19uZXdfX2AgYW5kIDptZXRoOmB0eXBlLl9faW5pdF9fYCBib3RoIG5vdyBhY2NlcHQgYXJiaXRyYXJ5CisgIGtleXdvcmQgYXJndW1lbnRzLCBidXQgOm1ldGg6YG9iamVjdC5fX2luaXRfc3ViY2xhc3NfX2AgKHdoaWNoIGlzIGNhbGxlZCBmcm9tCisgIDptZXRoOmB0eXBlLl9fbmV3X19gKSB3aWxsIHJlamVjdCB0aGVtIGJ5IGRlZmF1bHQuIEN1c3RvbSBtZXRhY2xhc3NlcworICBhY2NlcHRpbmcgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyB3aWxsIG5lZWQgdG8gYWRqdXN0IHRoZWlyIGNhbGxzIHRvCisgIDptZXRoOmB0eXBlLl9fbmV3X19gICh3aGV0aGVyIGRpcmVjdCBvciB2aWEgOmNsYXNzOmBzdXBlcmApIGFjY29yZGluZ2x5LgorCisqIEluIDpjbGFzczpgZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3Quc2Rpc3RgLCB0aGUgYGBkZWZhdWx0X2Zvcm1hdGBgCisgIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkIGFuZCBpcyBubyBsb25nZXIgaG9ub3JlZC4gSW5zdGVhZCwgdGhlCisgIGd6aXBwZWQgdGFyZmlsZSBmb3JtYXQgaXMgdGhlIGRlZmF1bHQgb24gYWxsIHBsYXRmb3JtcyBhbmQgbm8KKyAgcGxhdGZvcm0tc3BlY2lmaWMgc2VsZWN0aW9uIGlzIG1hZGUuCisgIEluIGVudmlyb25tZW50cyB3aGVyZSBkaXN0cmlidXRpb25zIGFyZQorICBidWlsdCBvbiBXaW5kb3dzIGFuZCB6aXAgZGlzdHJpYnV0aW9ucyBhcmUgcmVxdWlyZWQsIGNvbmZpZ3VyZQorICB0aGUgcHJvamVjdCB3aXRoIGEgYGBzZXR1cC5jZmdgYCBmaWxlIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZzo6CisKKyAgICBbc2Rpc3RdCisgICAgZm9ybWF0cz16aXAKKworICBUaGlzIGJlaGF2aW9yIGhhcyBhbHNvIGJlZW4gYmFja3BvcnRlZCB0byBlYXJsaWVyIFB5dGhvbiB2ZXJzaW9ucworICBieSBTZXR1cHRvb2xzIDI2LjAuMC4KKworKiBJbiB0aGUgOm1vZDpgdXJsbGliLnJlcXVlc3RgIG1vZHVsZSBhbmQgdGhlCisgIDptZXRoOmBodHRwLmNsaWVudC5IVFRQQ29ubmVjdGlvbi5yZXF1ZXN0YCBtZXRob2QsIGlmIG5vIENvbnRlbnQtTGVuZ3RoCisgIGhlYWRlciBmaWVsZCBoYXMgYmVlbiBzcGVjaWZpZWQgYW5kIHRoZSByZXF1ZXN0IGJvZHkgaXMgYSBmaWxlIG9iamVjdCwKKyAgaXQgaXMgbm93IHNlbnQgd2l0aCBIVFRQIDEuMSBjaHVua2VkIGVuY29kaW5nLiBJZiBhIGZpbGUgb2JqZWN0IGhhcyB0bworICBiZSBzZW50IHRvIGEgSFRUUCAxLjAgc2VydmVyLCB0aGUgQ29udGVudC1MZW5ndGggdmFsdWUgbm93IGhhcyB0byBiZQorICBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlci4gU2VlIDppc3N1ZTpgMTIzMTlgLgorCitDaGFuZ2VzIGluIHRoZSBDIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgIGFsbG9jYXRvciBmYW1pbHkgbm93IHVzZXMgdGhlIDpyZWY6YHB5bWFsbG9jIGFsbG9jYXRvcgorICA8cHltYWxsb2M+YCByYXRoZXIgdGhhbiBzeXN0ZW0gOmM6ZnVuYzpgbWFsbG9jYC4gQXBwbGljYXRpb25zIGNhbGxpbmcKKyAgOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTCBjYW4gbm93IGNyYXNoLiBTZXQgdGhlCisgIDplbnZ2YXI6YFBZVEhPTk1BTExPQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYGBkZWJ1Z2BgIHRvIHZhbGlkYXRlIHRoZQorICB1c2FnZSBvZiBtZW1vcnkgYWxsb2NhdG9ycyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBTZWUgOmlzc3VlOmAyNjI0OWAuCisKKyogOmM6ZnVuYzpgUHlfRXhpdGAgKGFuZCB0aGUgbWFpbiBpbnRlcnByZXRlcikgbm93IG92ZXJyaWRlIHRoZSBleGl0IHN0YXR1cworICB3aXRoIDEyMCBpZiBmbHVzaGluZyBidWZmZXJlZCBkYXRhIGZhaWxlZC4gIFNlZSA6aXNzdWU6YDUzMTlgLgpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L2luZGV4LnJzdCBiL0RvYy93aGF0c25ldy9pbmRleC5yc3QKaW5kZXggZWRiNTUwMi4uN2M5MjUyNCAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3L2luZGV4LnJzdAorKysgYi9Eb2Mvd2hhdHNuZXcvaW5kZXgucnN0CkBAIC0xMSw2ICsxMSw3IEBACiAuLiB0b2N0cmVlOjoKICAgIDptYXhkZXB0aDogMgogCisgICAzLjYucnN0CiAgICAzLjUucnN0CiAgICAzLjQucnN0CiAgICAzLjMucnN0CmRpZmYgLS1naXQgYS9HcmFtbWFyL0dyYW1tYXIgYi9HcmFtbWFyL0dyYW1tYXIKaW5kZXggNDMwNzUyMy4uYjEzOWU5ZiAxMDA2NDQKLS0tIGEvR3JhbW1hci9HcmFtbWFyCisrKyBiL0dyYW1tYXIvR3JhbW1hcgpAQCAtMjcsMjUgKzI3LDMxIEBACiBmdW5jZGVmOiAnZGVmJyBOQU1FIHBhcmFtZXRlcnMgWyctPicgdGVzdF0gJzonIHN1aXRlCiAKIHBhcmFtZXRlcnM6ICcoJyBbdHlwZWRhcmdzbGlzdF0gJyknCi10eXBlZGFyZ3NsaXN0OiAodGZwZGVmIFsnPScgdGVzdF0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcKLSAgICAgICBbJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnICcqKicgdGZwZGVmXSB8ICcqKicgdGZwZGVmXV0KLSAgICAgfCAgJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnICcqKicgdGZwZGVmXSB8ICcqKicgdGZwZGVmKQordHlwZWRhcmdzbGlzdDogKHRmcGRlZiBbJz0nIHRlc3RdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsKKyAgICAgICAgJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHRmcGRlZiBbJywnXV1dCisgICAgICB8ICcqKicgdGZwZGVmIFsnLCddXV0KKyAgfCAnKicgW3RmcGRlZl0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdGZwZGVmIFsnLCddXV0KKyAgfCAnKionIHRmcGRlZiBbJywnXSkKIHRmcGRlZjogTkFNRSBbJzonIHRlc3RdCi12YXJhcmdzbGlzdDogKHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnCi0gICAgICAgWycqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHZmcGRlZl0gfCAnKionIHZmcGRlZl1dCi0gICAgIHwgICcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHZmcGRlZl0gfCAnKionIHZmcGRlZikKK3ZhcmFyZ3NsaXN0OiAodmZwZGVmIFsnPScgdGVzdF0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWworICAgICAgICAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdmZwZGVmIFsnLCddXV0KKyAgICAgIHwgJyoqJyB2ZnBkZWYgWycsJ11dXQorICB8ICcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB2ZnBkZWYgWycsJ11dXQorICB8ICcqKicgdmZwZGVmIFsnLCddCispCiB2ZnBkZWY6IE5BTUUKIAogc3RtdDogc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10CiBzaW1wbGVfc3RtdDogc21hbGxfc3RtdCAoJzsnIHNtYWxsX3N0bXQpKiBbJzsnXSBORVdMSU5FCiBzbWFsbF9zdG10OiAoZXhwcl9zdG10IHwgZGVsX3N0bXQgfCBwYXNzX3N0bXQgfCBmbG93X3N0bXQgfAogICAgICAgICAgICAgIGltcG9ydF9zdG10IHwgZ2xvYmFsX3N0bXQgfCBub25sb2NhbF9zdG10IHwgYXNzZXJ0X3N0bXQpCi1leHByX3N0bXQ6IHRlc3RsaXN0X3N0YXJfZXhwciAoYXVnYXNzaWduICh5aWVsZF9leHByfHRlc3RsaXN0KSB8CitleHByX3N0bXQ6IHRlc3RsaXN0X3N0YXJfZXhwciAoYW5uYXNzaWduIHwgYXVnYXNzaWduICh5aWVsZF9leHByfHRlc3RsaXN0KSB8CiAgICAgICAgICAgICAgICAgICAgICAoJz0nICh5aWVsZF9leHByfHRlc3RsaXN0X3N0YXJfZXhwcikpKikKK2FubmFzc2lnbjogJzonIHRlc3QgWyc9JyB0ZXN0XQogdGVzdGxpc3Rfc3Rhcl9leHByOiAodGVzdHxzdGFyX2V4cHIpICgnLCcgKHRlc3R8c3Rhcl9leHByKSkqIFsnLCddCiBhdWdhc3NpZ246ICgnKz0nIHwgJy09JyB8ICcqPScgfCAnQD0nIHwgJy89JyB8ICclPScgfCAnJj0nIHwgJ3w9JyB8ICdePScgfAogICAgICAgICAgICAgJzw8PScgfCAnPj49JyB8ICcqKj0nIHwgJy8vPScpCi0jIEZvciBub3JtYWwgYXNzaWdubWVudHMsIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIGVuZm9yY2VkIGJ5IHRoZSBpbnRlcnByZXRlcgorIyBGb3Igbm9ybWFsIGFuZCBhbm5vdGF0ZWQgYXNzaWdubWVudHMsIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIGVuZm9yY2VkIGJ5IHRoZSBpbnRlcnByZXRlcgogZGVsX3N0bXQ6ICdkZWwnIGV4cHJsaXN0CiBwYXNzX3N0bXQ6ICdwYXNzJwogZmxvd19zdG10OiBicmVha19zdG10IHwgY29udGludWVfc3RtdCB8IHJldHVybl9zdG10IHwgcmFpc2Vfc3RtdCB8IHlpZWxkX3N0bXQKQEAgLTE0MCw3ICsxNDYsNyBAQAogICAgICAgICAgICAgJyonIHRlc3QgKQogCiBjb21wX2l0ZXI6IGNvbXBfZm9yIHwgY29tcF9pZgotY29tcF9mb3I6ICdmb3InIGV4cHJsaXN0ICdpbicgb3JfdGVzdCBbY29tcF9pdGVyXQorY29tcF9mb3I6IFtBU1lOQ10gJ2ZvcicgZXhwcmxpc3QgJ2luJyBvcl90ZXN0IFtjb21wX2l0ZXJdCiBjb21wX2lmOiAnaWYnIHRlc3Rfbm9jb25kIFtjb21wX2l0ZXJdCiAKICMgbm90IHVzZWQgaW4gZ3JhbW1hciwgYnV0IG1heSBhcHBlYXIgaW4gIm5vZGUiIHBhc3NlZCBmcm9tIFBhcnNlciB0byBDb21waWxlcgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9QeXRob24tYXN0LmggYi9JbmNsdWRlL1B5dGhvbi1hc3QuaAppbmRleCAyZDNlYWNiLi43MDQ5NGI3IDEwMDY0NAotLS0gYS9JbmNsdWRlL1B5dGhvbi1hc3QuaAorKysgYi9JbmNsdWRlL1B5dGhvbi1hc3QuaApAQCAtNjUsMTEgKzY1LDEyIEBACiAKIGVudW0gX3N0bXRfa2luZCB7RnVuY3Rpb25EZWZfa2luZD0xLCBBc3luY0Z1bmN0aW9uRGVmX2tpbmQ9MiwgQ2xhc3NEZWZfa2luZD0zLAogICAgICAgICAgICAgICAgICAgUmV0dXJuX2tpbmQ9NCwgRGVsZXRlX2tpbmQ9NSwgQXNzaWduX2tpbmQ9NiwKLSAgICAgICAgICAgICAgICAgIEF1Z0Fzc2lnbl9raW5kPTcsIEZvcl9raW5kPTgsIEFzeW5jRm9yX2tpbmQ9OSwgV2hpbGVfa2luZD0xMCwKLSAgICAgICAgICAgICAgICAgIElmX2tpbmQ9MTEsIFdpdGhfa2luZD0xMiwgQXN5bmNXaXRoX2tpbmQ9MTMsIFJhaXNlX2tpbmQ9MTQsCi0gICAgICAgICAgICAgICAgICBUcnlfa2luZD0xNSwgQXNzZXJ0X2tpbmQ9MTYsIEltcG9ydF9raW5kPTE3LAotICAgICAgICAgICAgICAgICAgSW1wb3J0RnJvbV9raW5kPTE4LCBHbG9iYWxfa2luZD0xOSwgTm9ubG9jYWxfa2luZD0yMCwKLSAgICAgICAgICAgICAgICAgIEV4cHJfa2luZD0yMSwgUGFzc19raW5kPTIyLCBCcmVha19raW5kPTIzLCBDb250aW51ZV9raW5kPTI0fTsKKyAgICAgICAgICAgICAgICAgIEF1Z0Fzc2lnbl9raW5kPTcsIEFubkFzc2lnbl9raW5kPTgsIEZvcl9raW5kPTksCisgICAgICAgICAgICAgICAgICBBc3luY0Zvcl9raW5kPTEwLCBXaGlsZV9raW5kPTExLCBJZl9raW5kPTEyLCBXaXRoX2tpbmQ9MTMsCisgICAgICAgICAgICAgICAgICBBc3luY1dpdGhfa2luZD0xNCwgUmFpc2Vfa2luZD0xNSwgVHJ5X2tpbmQ9MTYsCisgICAgICAgICAgICAgICAgICBBc3NlcnRfa2luZD0xNywgSW1wb3J0X2tpbmQ9MTgsIEltcG9ydEZyb21fa2luZD0xOSwKKyAgICAgICAgICAgICAgICAgIEdsb2JhbF9raW5kPTIwLCBOb25sb2NhbF9raW5kPTIxLCBFeHByX2tpbmQ9MjIsIFBhc3Nfa2luZD0yMywKKyAgICAgICAgICAgICAgICAgIEJyZWFrX2tpbmQ9MjQsIENvbnRpbnVlX2tpbmQ9MjV9Owogc3RydWN0IF9zdG10IHsKICAgICBlbnVtIF9zdG10X2tpbmQga2luZDsKICAgICB1bmlvbiB7CkBAIC0xMTgsNiArMTE5LDEzIEBACiAgICAgICAgIAogICAgICAgICBzdHJ1Y3QgewogICAgICAgICAgICAgZXhwcl90eSB0YXJnZXQ7CisgICAgICAgICAgICBleHByX3R5IGFubm90YXRpb247CisgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgaW50IHNpbXBsZTsKKyAgICAgICAgfSBBbm5Bc3NpZ247CisgICAgICAgIAorICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgZXhwcl90eSB0YXJnZXQ7CiAgICAgICAgICAgICBleHByX3R5IGl0ZXI7CiAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKICAgICAgICAgICAgIGFzZGxfc2VxICpvcmVsc2U7CkBAIC0yMDEsOSArMjA5LDEwIEBACiAgICAgICAgICAgICAgICAgICBTZXRDb21wX2tpbmQ9OSwgRGljdENvbXBfa2luZD0xMCwgR2VuZXJhdG9yRXhwX2tpbmQ9MTEsCiAgICAgICAgICAgICAgICAgICBBd2FpdF9raW5kPTEyLCBZaWVsZF9raW5kPTEzLCBZaWVsZEZyb21fa2luZD0xNCwKICAgICAgICAgICAgICAgICAgIENvbXBhcmVfa2luZD0xNSwgQ2FsbF9raW5kPTE2LCBOdW1fa2luZD0xNywgU3RyX2tpbmQ9MTgsCi0gICAgICAgICAgICAgICAgICBCeXRlc19raW5kPTE5LCBOYW1lQ29uc3RhbnRfa2luZD0yMCwgRWxsaXBzaXNfa2luZD0yMSwKLSAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZV9raW5kPTIyLCBTdWJzY3JpcHRfa2luZD0yMywgU3RhcnJlZF9raW5kPTI0LAotICAgICAgICAgICAgICAgICAgTmFtZV9raW5kPTI1LCBMaXN0X2tpbmQ9MjYsIFR1cGxlX2tpbmQ9Mjd9OworICAgICAgICAgICAgICAgICAgRm9ybWF0dGVkVmFsdWVfa2luZD0xOSwgSm9pbmVkU3RyX2tpbmQ9MjAsIEJ5dGVzX2tpbmQ9MjEsCisgICAgICAgICAgICAgICAgICBOYW1lQ29uc3RhbnRfa2luZD0yMiwgRWxsaXBzaXNfa2luZD0yMywgQ29uc3RhbnRfa2luZD0yNCwKKyAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZV9raW5kPTI1LCBTdWJzY3JpcHRfa2luZD0yNiwgU3RhcnJlZF9raW5kPTI3LAorICAgICAgICAgICAgICAgICAgTmFtZV9raW5kPTI4LCBMaXN0X2tpbmQ9MjksIFR1cGxlX2tpbmQ9MzB9Owogc3RydWN0IF9leHByIHsKICAgICBlbnVtIF9leHByX2tpbmQga2luZDsKICAgICB1bmlvbiB7CkBAIC0yOTcsNiArMzA2LDE2IEBACiAgICAgICAgIH0gU3RyOwogICAgICAgICAKICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICBpbnQgY29udmVyc2lvbjsKKyAgICAgICAgICAgIGV4cHJfdHkgZm9ybWF0X3NwZWM7CisgICAgICAgIH0gRm9ybWF0dGVkVmFsdWU7CisgICAgICAgIAorICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgYXNkbF9zZXEgKnZhbHVlczsKKyAgICAgICAgfSBKb2luZWRTdHI7CisgICAgICAgIAorICAgICAgICBzdHJ1Y3QgewogICAgICAgICAgICAgYnl0ZXMgczsKICAgICAgICAgfSBCeXRlczsKICAgICAgICAgCkBAIC0zMDUsNiArMzI0LDEwIEBACiAgICAgICAgIH0gTmFtZUNvbnN0YW50OwogICAgICAgICAKICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGNvbnN0YW50IHZhbHVlOworICAgICAgICB9IENvbnN0YW50OworICAgICAgICAKKyAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CiAgICAgICAgICAgICBpZGVudGlmaWVyIGF0dHI7CiAgICAgICAgICAgICBleHByX2NvbnRleHRfdHkgY3R4OwpAQCAtMzY2LDYgKzM4OSw3IEBACiAgICAgZXhwcl90eSB0YXJnZXQ7CiAgICAgZXhwcl90eSBpdGVyOwogICAgIGFzZGxfc2VxICppZnM7CisgICAgaW50IGlzX2FzeW5jOwogfTsKIAogZW51bSBfZXhjZXB0aGFuZGxlcl9raW5kIHtFeGNlcHRIYW5kbGVyX2tpbmQ9MX07CkBAIC00NDYsNiArNDcwLDkgQEAKICNkZWZpbmUgQXVnQXNzaWduKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9BdWdBc3NpZ24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKIHN0bXRfdHkgX1B5X0F1Z0Fzc2lnbihleHByX3R5IHRhcmdldCwgb3BlcmF0b3JfdHkgb3AsIGV4cHJfdHkgdmFsdWUsIGludAogICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgQW5uQXNzaWduKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSBfUHlfQW5uQXNzaWduKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KQorc3RtdF90eSBfUHlfQW5uQXNzaWduKGV4cHJfdHkgdGFyZ2V0LCBleHByX3R5IGFubm90YXRpb24sIGV4cHJfdHkgdmFsdWUsIGludAorICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKICNkZWZpbmUgRm9yKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSBfUHlfRm9yKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KQogc3RtdF90eSBfUHlfRm9yKGV4cHJfdHkgdGFyZ2V0LCBleHByX3R5IGl0ZXIsIGFzZGxfc2VxICogYm9keSwgYXNkbF9zZXEgKgogICAgICAgICAgICAgICAgIG9yZWxzZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKQEAgLTU0Myw2ICs1NzAsMTIgQEAKIGV4cHJfdHkgX1B5X051bShvYmplY3QgbiwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKICNkZWZpbmUgU3RyKGEwLCBhMSwgYTIsIGEzKSBfUHlfU3RyKGEwLCBhMSwgYTIsIGEzKQogZXhwcl90eSBfUHlfU3RyKHN0cmluZyBzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBGb3JtYXR0ZWRWYWx1ZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfRm9ybWF0dGVkVmFsdWUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK2V4cHJfdHkgX1B5X0Zvcm1hdHRlZFZhbHVlKGV4cHJfdHkgdmFsdWUsIGludCBjb252ZXJzaW9uLCBleHByX3R5IGZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgSm9pbmVkU3RyKGEwLCBhMSwgYTIsIGEzKSBfUHlfSm9pbmVkU3RyKGEwLCBhMSwgYTIsIGEzKQorZXhwcl90eSBfUHlfSm9pbmVkU3RyKGFzZGxfc2VxICogdmFsdWVzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYQorICAgICAgICAgICAgICAgICAgICAgICphcmVuYSk7CiAjZGVmaW5lIEJ5dGVzKGEwLCBhMSwgYTIsIGEzKSBfUHlfQnl0ZXMoYTAsIGExLCBhMiwgYTMpCiBleHByX3R5IF9QeV9CeXRlcyhieXRlcyBzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOwogI2RlZmluZSBOYW1lQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpIF9QeV9OYW1lQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpCkBAIC01NTAsNiArNTgzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAqYXJlbmEpOwogI2RlZmluZSBFbGxpcHNpcyhhMCwgYTEsIGEyKSBfUHlfRWxsaXBzaXMoYTAsIGExLCBhMikKIGV4cHJfdHkgX1B5X0VsbGlwc2lzKGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIENvbnN0YW50KGEwLCBhMSwgYTIsIGEzKSBfUHlfQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpCitleHByX3R5IF9QeV9Db25zdGFudChjb25zdGFudCB2YWx1ZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEKKyAgICAgICAgICAgICAgICAgICAgICphcmVuYSk7CiAjZGVmaW5lIEF0dHJpYnV0ZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfQXR0cmlidXRlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCiBleHByX3R5IF9QeV9BdHRyaWJ1dGUoZXhwcl90eSB2YWx1ZSwgaWRlbnRpZmllciBhdHRyLCBleHByX2NvbnRleHRfdHkgY3R4LCBpbnQKICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CkBAIC01NzQsOSArNjEwLDkgQEAKIHNsaWNlX3R5IF9QeV9FeHRTbGljZShhc2RsX3NlcSAqIGRpbXMsIFB5QXJlbmEgKmFyZW5hKTsKICNkZWZpbmUgSW5kZXgoYTAsIGExKSBfUHlfSW5kZXgoYTAsIGExKQogc2xpY2VfdHkgX1B5X0luZGV4KGV4cHJfdHkgdmFsdWUsIFB5QXJlbmEgKmFyZW5hKTsKLSNkZWZpbmUgY29tcHJlaGVuc2lvbihhMCwgYTEsIGEyLCBhMykgX1B5X2NvbXByZWhlbnNpb24oYTAsIGExLCBhMiwgYTMpCisjZGVmaW5lIGNvbXByZWhlbnNpb24oYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfY29tcHJlaGVuc2lvbihhMCwgYTEsIGEyLCBhMywgYTQpCiBjb21wcmVoZW5zaW9uX3R5IF9QeV9jb21wcmVoZW5zaW9uKGV4cHJfdHkgdGFyZ2V0LCBleHByX3R5IGl0ZXIsIGFzZGxfc2VxICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZzLCBQeUFyZW5hICphcmVuYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcywgaW50IGlzX2FzeW5jLCBQeUFyZW5hICphcmVuYSk7CiAjZGVmaW5lIEV4Y2VwdEhhbmRsZXIoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X0V4Y2VwdEhhbmRsZXIoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKIGV4Y2VwdGhhbmRsZXJfdHkgX1B5X0V4Y2VwdEhhbmRsZXIoZXhwcl90eSB0eXBlLCBpZGVudGlmaWVyIG5hbWUsIGFzZGxfc2VxICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEKZGlmZiAtLWdpdCBhL0luY2x1ZGUvUHl0aG9uLmggYi9JbmNsdWRlL1B5dGhvbi5oCmluZGV4IDg1OGRiZDEuLjRjN2M5YTQgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvUHl0aG9uLmgKKysrIGIvSW5jbHVkZS9QeXRob24uaApAQCAtMTE2LDYgKzExNiw3IEBACiAjaW5jbHVkZSAicHlsaWZlY3ljbGUuaCIKICNpbmNsdWRlICJjZXZhbC5oIgogI2luY2x1ZGUgInN5c21vZHVsZS5oIgorI2luY2x1ZGUgIm9zbW9kdWxlLmgiCiAjaW5jbHVkZSAiaW50cmNoZWNrLmgiCiAjaW5jbHVkZSAiaW1wb3J0LmgiCiAKZGlmZiAtLWdpdCBhL0luY2x1ZGUvYWJzdHJhY3QuaCBiL0luY2x1ZGUvYWJzdHJhY3QuaAppbmRleCA0Mzg2MTBiLi5mNzA5NDM0IDEwMDY0NAotLS0gYS9JbmNsdWRlL2Fic3RyYWN0LmgKKysrIGIvSW5jbHVkZS9hYnN0cmFjdC5oCkBAIC0yNjQsMTggKzI2NCw2NSBAQAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9DYWxsKFB5T2JqZWN0ICpjYWxsYWJsZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKTsKIAogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBfUHlTdGFja19Bc1R1cGxlKFB5T2JqZWN0ICoqc3RhY2ssCisgICAgICAgIFB5X3NzaXplX3QgbmFyZ3MpOworCisgICAgIC8qIENhbGwgdGhlIGNhbGxhYmxlIG9iamVjdCBmdW5jIHdpdGggdGhlICJmYXN0IGNhbGwiIGNhbGxpbmcgY29udmVudGlvbjoKKyAgICAgICAgYXJncyBpcyBhIEMgYXJyYXkgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnRzIChuYXJncyBpcyB0aGUgbnVtYmVyIG9mCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzKSwga3dhcmdzIGlzIGEgZGljdGlvbmFyeSBmb3Iga2V5d29yZCBhcmd1bWVudHMuCisKKyAgICAgICAgSWYgbmFyZ3MgaXMgZXF1YWwgdG8gemVybywgYXJncyBjYW4gYmUgTlVMTC4ga3dhcmdzIGNhbiBiZSBOVUxMLgorICAgICAgICBuYXJncyBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gemVyby4KKworICAgICAgICBSZXR1cm4gdGhlIHJlc3VsdCBvbiBzdWNjZXNzLiBSYWlzZSBhbiBleGNlcHRpb24gb24gcmV0dXJuIE5VTEwgb24KKyAgICAgICAgZXJyb3IuICovCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X0Zhc3RDYWxsRGljdChQeU9iamVjdCAqZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqYXJncywgUHlfc3NpemVfdCBuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2FyZ3MpOworCisgICAgIC8qIENhbGwgdGhlIGNhbGxhYmxlIG9iamVjdCBmdW5jIHdpdGggdGhlICJmYXN0IGNhbGwiIGNhbGxpbmcgY29udmVudGlvbjoKKyAgICAgICAgYXJncyBpcyBhIEMgYXJyYXkgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnRzIGZvbGxvd2VkIGJ5IHZhbHVlcyBvZgorICAgICAgICBrZXl3b3JkIGFyZ3VtZW50cy4gS2V5cyBvZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc3RvcmVkIGFzIGEgdHVwbGUKKyAgICAgICAgb2Ygc3RyaW5ncyBpbiBrd25hbWVzLiBuYXJncyBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBhdAorICAgICAgICB0aGUgYmVnaW5uaW5nIG9mIHN0YWNrLiBUaGUgc2l6ZSBvZiBrd25hbWVzIGdpdmVzIHRoZSBudW1iZXIgb2Yga2V5d29yZAorICAgICAgICB2YWx1ZXMgaW4gdGhlIHN0YWNrIGFmdGVyIHBvc2l0aW9uYWwgYXJndW1lbnRzLgorCisgICAgICAgIElmIG5hcmdzIGlzIGVxdWFsIHRvIHplcm8gYW5kIHRoZXJlIGlzIG5vIGtleXdvcmQgYXJndW1lbnQgKGt3bmFtZXMgaXMKKyAgICAgICAgTlVMTCBvciBpdHMgc2l6ZSBpcyB6ZXJvKSwgYXJncyBjYW4gYmUgTlVMTC4KKworICAgICAgICBSZXR1cm4gdGhlIHJlc3VsdCBvbiBzdWNjZXNzLiBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uCisgICAgICAgIGVycm9yLiAqLworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9GYXN0Q2FsbEtleXdvcmRzCisgICAgICAgIChQeU9iamVjdCAqZnVuYywKKyAgICAgICAgIFB5T2JqZWN0ICoqYXJncywKKyAgICAgICAgIFB5X3NzaXplX3QgbmFyZ3MsCisgICAgICAgICBQeU9iamVjdCAqa3duYW1lcyk7CisKKyNkZWZpbmUgX1B5T2JqZWN0X0Zhc3RDYWxsKGZ1bmMsIGFyZ3MsIG5hcmdzKSBcCisgICAgX1B5T2JqZWN0X0Zhc3RDYWxsRGljdCgoZnVuYyksIChhcmdzKSwgKG5hcmdzKSwgTlVMTCkKKworI2RlZmluZSBfUHlPYmplY3RfQ2FsbE5vQXJnKGZ1bmMpIFwKKyAgICBfUHlPYmplY3RfRmFzdENhbGwoKGZ1bmMpLCBOVUxMLCAwKQorCisjZGVmaW5lIF9QeU9iamVjdF9DYWxsQXJnMShmdW5jLCBhcmcpIFwKKyAgICBfUHlPYmplY3RfRmFzdENhbGwoKGZ1bmMpLCAmKGFyZyksIDEpCisKKyAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9DYWxsX1ByZXBlbmQoUHlPYmplY3QgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa3dhcmdzKTsKKwogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KFB5T2JqZWN0ICpmdW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd2hlcmUpOwotI2VuZGlmCisjZW5kaWYgICAvKiBQeV9MSU1JVEVEX0FQSSAqLwogCiAgICAgICAgLyoKICAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aAogICAgICBhcmd1bWVudHMgYW5kIGtleXdvcmRzIGFyZ3VtZW50cy4gIFRoZSAnYXJncycgYXJndW1lbnQgY2FuIG5vdCBiZQotICAgICBOVUxMLCBidXQgdGhlICdrdycgYXJndW1lbnQgY2FuIGJlIE5VTEwuCisgICAgIE5VTEwuCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGxPYmplY3QoUHlPYmplY3QgKmNhbGxhYmxlX29iamVjdCwKZGlmZiAtLWdpdCBhL0luY2x1ZGUvYXNkbC5oIGIvSW5jbHVkZS9hc2RsLmgKaW5kZXggNDk1MTUzYy4uMzVlOWZhMSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9hc2RsLmgKKysrIGIvSW5jbHVkZS9hc2RsLmgKQEAgLTYsNiArNiw3IEBACiB0eXBlZGVmIFB5T2JqZWN0ICogYnl0ZXM7CiB0eXBlZGVmIFB5T2JqZWN0ICogb2JqZWN0OwogdHlwZWRlZiBQeU9iamVjdCAqIHNpbmdsZXRvbjsKK3R5cGVkZWYgUHlPYmplY3QgKiBjb25zdGFudDsKIAogLyogSXQgd291bGQgYmUgbmljZSBpZiB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgYXNkbF9jLnB5IHdhcyBjb21wbGV0ZWx5CiAgICBpbmRlcGVuZGVudCBvZiBQeXRob24sIGJ1dCBpdCBpcyBhIGdvYWwgdGhlIHJlcXVpcmVzIHRvbyBtdWNoIHdvcmsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oIGIvSW5jbHVkZS9ieXRlc19tZXRob2RzLmgKaW5kZXggMTFkNWY0Mi4uN2ZhNzU0MCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9ieXRlc19tZXRob2RzLmgKKysrIGIvSW5jbHVkZS9ieXRlc19tZXRob2RzLmgKQEAgLTE3LDkgKzE3LDE4IEBACiAvKiBUaGVzZSBzdG9yZSB0aGVpciBsZW4gc2l6ZWQgYW5zd2VyIGluIHRoZSBnaXZlbiBwcmVhbGxvY2F0ZWQgKnJlc3VsdCBhcmcuICovCiBleHRlcm4gdm9pZCBfUHlfYnl0ZXNfbG93ZXIoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpjcHRyLCBQeV9zc2l6ZV90IGxlbik7CiBleHRlcm4gdm9pZCBfUHlfYnl0ZXNfdXBwZXIoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpjcHRyLCBQeV9zc2l6ZV90IGxlbik7Ci1leHRlcm4gdm9pZCBfUHlfYnl0ZXNfdGl0bGUoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7Ci1leHRlcm4gdm9pZCBfUHlfYnl0ZXNfY2FwaXRhbGl6ZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKLWV4dGVybiB2b2lkIF9QeV9ieXRlc19zd2FwY2FzZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIF9QeV9ieXRlc190aXRsZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIF9QeV9ieXRlc19jYXBpdGFsaXplKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3N3YXBjYXNlKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOworCitleHRlcm4gUHlPYmplY3QgKl9QeV9ieXRlc19maW5kKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKTsKK2V4dGVybiBQeU9iamVjdCAqX1B5X2J5dGVzX2luZGV4KGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKTsKK2V4dGVybiBQeU9iamVjdCAqX1B5X2J5dGVzX3JmaW5kKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKTsKK2V4dGVybiBQeU9iamVjdCAqX1B5X2J5dGVzX3JpbmRleChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncyk7CitleHRlcm4gUHlPYmplY3QgKl9QeV9ieXRlc19jb3VudChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncyk7CitleHRlcm4gaW50IF9QeV9ieXRlc19jb250YWlucyhjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJnKTsKK2V4dGVybiBQeU9iamVjdCAqX1B5X2J5dGVzX3N0YXJ0c3dpdGgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpOworZXh0ZXJuIFB5T2JqZWN0ICpfUHlfYnl0ZXNfZW5kc3dpdGgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpOwogCiAvKiBUaGUgbWFrZXRyYW5zKCkgc3RhdGljIG1ldGhvZC4gKi8KIGV4dGVybiBQeU9iamVjdCogX1B5X2J5dGVzX21ha2V0cmFucyhQeV9idWZmZXIgKmZybSwgUHlfYnVmZmVyICp0byk7CkBAIC0zNyw3ICs0NiwxOSBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X3RpdGxlX19kb2NfX1tdOwogZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2NhcGl0YWxpemVfX2RvY19fW107CiBleHRlcm4gY29uc3QgY2hhciBfUHlfc3dhcGNhc2VfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfY291bnRfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfZmluZF9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9pbmRleF9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9yZmluZF9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9yaW5kZXhfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfc3RhcnRzd2l0aF9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9lbmRzd2l0aF9fZG9jX19bXTsKIGV4dGVybiBjb25zdCBjaGFyIF9QeV9tYWtldHJhbnNfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfZXhwYW5kdGFic19fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9sanVzdF9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9yanVzdF9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9jZW50ZXJfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfemZpbGxfX2RvY19fW107CiAKIC8qIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZSBkb2NzIGFyZSBzaGFyZWQgZnJvbSB0aGUgLm8sIG5vdCBzdGF0aWMgKi8KICNkZWZpbmUgUHlEb2NfU1RSVkFSX3NoYXJlZChuYW1lLHN0cikgY29uc3QgY2hhciBuYW1lW10gPSBQeURvY19TVFIoc3RyKQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9ieXRlc29iamVjdC5oIGIvSW5jbHVkZS9ieXRlc29iamVjdC5oCmluZGV4IDZjMWUwYzMuLjExZDgyMTggMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvYnl0ZXNvYmplY3QuaAorKysgYi9JbmNsdWRlL2J5dGVzb2JqZWN0LmgKQEAgLTYyLDcgKzYyLDE0IEBACiBQeUFQSV9GVU5DKHZvaWQpIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsKFB5T2JqZWN0ICoqLCBQeU9iamVjdCAqKTsKICNpZm5kZWYgUHlfTElNSVRFRF9BUEkKIFB5QVBJX0ZVTkMoaW50KSBfUHlCeXRlc19SZXNpemUoUHlPYmplY3QgKiosIFB5X3NzaXplX3QpOwotUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlCeXRlc19Gb3JtYXQoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0KikgX1B5Qnl0ZXNfRm9ybWF0RXgoCisgICAgY29uc3QgY2hhciAqZm9ybWF0LAorICAgIFB5X3NzaXplX3QgZm9ybWF0X2xlbiwKKyAgICBQeU9iamVjdCAqYXJncywKKyAgICBpbnQgdXNlX2J5dGVhcnJheSk7CitQeUFQSV9GVU5DKFB5T2JqZWN0KikgX1B5Qnl0ZXNfRnJvbUhleCgKKyAgICBQeU9iamVjdCAqc3RyaW5nLAorICAgIGludCB1c2VfYnl0ZWFycmF5KTsKICNlbmRpZgogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUJ5dGVzX0RlY29kZUVzY2FwZShjb25zdCBjaGFyICosIFB5X3NzaXplX3QsCiAJCQkJCQkgICBjb25zdCBjaGFyICosIFB5X3NzaXplX3QsCkBAIC0xMjMsNiArMTMwLDg3IEBACiAjZGVmaW5lIEZfQUxUCSgxPDwzKQogI2RlZmluZSBGX1pFUk8JKDE8PDQpCiAKKyNpZm5kZWYgUHlfTElNSVRFRF9BUEkKKy8qIFRoZSBfUHlCeXRlc1dyaXRlciBzdHJ1Y3R1cmUgaXMgYmlnOiBpdCBjb250YWlucyBhbiBlbWJlZGRlZCAic3RhY2sgYnVmZmVyIi4KKyAgIEEgX1B5Qnl0ZXNXcml0ZXIgdmFyaWFibGUgbXVzdCBiZSBkZWNsYXJlZCBhdCB0aGUgZW5kIG9mIHZhcmlhYmxlcyBpbiBhCisgICBmdW5jdGlvbiB0byBvcHRpbWl6ZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gb24gdGhlIHN0YWNrLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIGJ5dGVzLCBieXRlYXJyYXkgb3IgTlVMTCAod2hlbiB0aGUgc21hbGwgYnVmZmVyIGlzIHVzZWQpICovCisgICAgUHlPYmplY3QgKmJ1ZmZlcjsKKworICAgIC8qIE51bWJlciBvZiBhbGxvY2F0ZWQgc2l6ZS4gKi8KKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsKKworICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIGFsbG9jYXRlZCBieXRlcywKKyAgICAgICBpbmNyZW1lbnRlZCBieSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCkgKi8KKyAgICBQeV9zc2l6ZV90IG1pbl9zaXplOworCisgICAgLyogSWYgbm9uLXplcm8sIHVzZSBhIGJ5dGVhcnJheSBpbnN0ZWFkIG9mIGEgYnl0ZXMgb2JqZWN0IGZvciBidWZmZXIuICovCisgICAgaW50IHVzZV9ieXRlYXJyYXk7CisKKyAgICAvKiBJZiBub24temVybywgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgKGRlZmF1bHQ6IDApLgorICAgICAgIFRoaXMgZmxhZyBtdXN0IGJlIHplcm8gaWYgdXNlX2J5dGVhcnJheSBpcyBub24temVyby4gKi8KKyAgICBpbnQgb3ZlcmFsbG9jYXRlOworCisgICAgLyogU3RhY2sgYnVmZmVyICovCisgICAgaW50IHVzZV9zbWFsbF9idWZmZXI7CisgICAgY2hhciBzbWFsbF9idWZmZXJbNTEyXTsKK30gX1B5Qnl0ZXNXcml0ZXI7CisKKy8qIEluaXRpYWxpemUgYSBieXRlcyB3cml0ZXIKKworICAgQnkgZGVmYXVsdCwgdGhlIG92ZXJhbGxvY2F0aW9uIGlzIGRpc2FibGVkLiBTZXQgdGhlIG92ZXJhbGxvY2F0ZSBhdHRyaWJ1dGUKKyAgIHRvIGNvbnRyb2wgdGhlIGFsbG9jYXRpb24gb2YgdGhlIGJ1ZmZlci4gKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5Qnl0ZXNXcml0ZXJfSW5pdChfUHlCeXRlc1dyaXRlciAqd3JpdGVyKTsKKworLyogR2V0IHRoZSBidWZmZXIgY29udGVudCBhbmQgcmVzZXQgdGhlIHdyaXRlci4KKyAgIFJldHVybiBhIGJ5dGVzIG9iamVjdCwgb3IgYSBieXRlYXJyYXkgb2JqZWN0IGlmIHVzZV9ieXRlYXJyYXkgaXMgbm9uLXplcm8uCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlCeXRlc1dyaXRlcl9GaW5pc2goX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICB2b2lkICpzdHIpOworCisvKiBEZWFsbG9jYXRlIG1lbW9yeSBvZiBhIHdyaXRlciAoY2xlYXIgaXRzIGludGVybmFsIGJ1ZmZlcikuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlcik7CisKKy8qIEFsbG9jYXRlIHRoZSBidWZmZXIgdG8gd3JpdGUgc2l6ZSBieXRlcy4KKyAgIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGJ1ZmZlciBkYXRhLgorICAgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCBvbiBlcnJvci4gKi8KK1B5QVBJX0ZVTkModm9pZCopIF9QeUJ5dGVzV3JpdGVyX0FsbG9jKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgUHlfc3NpemVfdCBzaXplKTsKKworLyogRW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gd3JpdGUgKnNpemUqIGJ5dGVzLgorICAgQWRkIHNpemUgdG8gdGhlIHdyaXRlciBtaW5pbXVtIHNpemUgKG1pbl9zaXplIGF0dHJpYnV0ZSkuCisKKyAgIHN0ciBpcyB0aGUgY3VycmVudCBwb2ludGVyIGluc2lkZSB0aGUgYnVmZmVyLgorICAgUmV0dXJuIHRoZSB1cGRhdGVkIGN1cnJlbnQgcG9pbnRlciBpbnNpZGUgdGhlIGJ1ZmZlci4KKyAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgb24gZXJyb3IuICovCitQeUFQSV9GVU5DKHZvaWQqKSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgdm9pZCAqc3RyLAorICAgIFB5X3NzaXplX3Qgc2l6ZSk7CisKKy8qIFJlc2l6ZSB0aGUgYnVmZmVyIHRvIG1ha2UgaXQgbGFyZ2VyLgorICAgVGhlIG5ldyBidWZmZXIgbWF5IGJlIGxhcmdlciB0aGFuIHNpemUgYnl0ZXMgYmVjYXVzZSBvZiBvdmVyYWxsb2NhdGlvbi4KKyAgIFJldHVybiB0aGUgdXBkYXRlZCBjdXJyZW50IHBvaW50ZXIgaW5zaWRlIHRoZSBidWZmZXIuCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLgorCisgICBOb3RlOiBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIGJ5dGVzIGluIHRoZSB3cml0ZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCB1c2UgdGhlIHdyaXRlciBtaW5pbXVtIHNpemUgKG1pbl9zaXplIGF0dHJpYnV0ZSkuCisKKyAgIFNlZSBhbHNvIF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoKS4KKyAgICovCitQeUFQSV9GVU5DKHZvaWQqKSBfUHlCeXRlc1dyaXRlcl9SZXNpemUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICB2b2lkICpzdHIsCisgICAgUHlfc3NpemVfdCBzaXplKTsKKworLyogV3JpdGUgYnl0ZXMuCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyh2b2lkKikgX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyLAorICAgIHZvaWQgKnN0ciwKKyAgICBjb25zdCB2b2lkICpieXRlcywKKyAgICBQeV9zc2l6ZV90IHNpemUpOworI2VuZGlmICAgLyogUHlfTElNSVRFRF9BUEkgKi8KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL0luY2x1ZGUvY2V2YWwuaCBiL0luY2x1ZGUvY2V2YWwuaAppbmRleCBiNTM3M2E5Li5jNjgyMDYzIDEwMDY0NAotLS0gYS9JbmNsdWRlL2NldmFsLmgKKysrIGIvSW5jbHVkZS9jZXZhbC5oCkBAIC04LDcgKzgsNyBAQAogLyogSW50ZXJmYWNlIHRvIHJhbmRvbSBwYXJ0cyBpbiBjZXZhbC5jICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoCi0gICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisgICAgUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKTsKIAogLyogSW5saW5lIHRoaXMgKi8KICNkZWZpbmUgUHlFdmFsX0NhbGxPYmplY3QoZnVuYyxhcmcpIFwKQEAgLTI1LDYgKzI1LDEwIEBACiBQeUFQSV9GVU5DKHZvaWQpIFB5RXZhbF9TZXRUcmFjZShQeV90cmFjZWZ1bmMsIFB5T2JqZWN0ICopOwogUHlBUElfRlVOQyh2b2lkKSBfUHlFdmFsX1NldENvcm91dGluZVdyYXBwZXIoUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUV2YWxfR2V0Q29yb3V0aW5lV3JhcHBlcih2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5RXZhbF9TZXRBc3luY0dlbkZpcnN0aXRlcihQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5RXZhbF9HZXRBc3luY0dlbkZpcnN0aXRlcih2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5RXZhbF9TZXRBc3luY0dlbkZpbmFsaXplcihQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5RXZhbF9HZXRBc3luY0dlbkZpbmFsaXplcih2b2lkKTsKICNlbmRpZgogCiBzdHJ1Y3QgX2ZyYW1lOyAvKiBBdm9pZCBpbmNsdWRpbmcgZnJhbWVvYmplY3QuaCAqLwpAQCAtMTE5LDYgKzEyMyw5IEBACiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9HZXRDYWxsU3RhdHMoUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9FdmFsRnJhbWUoc3RydWN0IF9mcmFtZSAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFdmFsX0V2YWxGcmFtZUV4KHN0cnVjdCBfZnJhbWUgKmYsIGludCBleGMpOworI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlFdmFsX0V2YWxGcmFtZURlZmF1bHQoc3RydWN0IF9mcmFtZSAqZiwgaW50IGV4Yyk7CisjZW5kaWYKIAogLyogSW50ZXJmYWNlIGZvciB0aHJlYWRzLgogCkBAIC0xODQsNiArMTkxLDEwIEBACiBQeUFQSV9GVU5DKHVuc2lnbmVkIGxvbmcpIF9QeUV2YWxfR2V0U3dpdGNoSW50ZXJ2YWwodm9pZCk7CiAjZW5kaWYKIAorI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBfUHlFdmFsX1JlcXVlc3RDb2RlRXh0cmFJbmRleChmcmVlZnVuYyk7CisjZW5kaWYKKwogI2RlZmluZSBQeV9CRUdJTl9BTExPV19USFJFQURTIHsgXAogICAgICAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqX3NhdmU7IFwKICAgICAgICAgICAgICAgICAgICAgICAgIF9zYXZlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKQEAgLTIwNiw2ICsyMTcsMTQgQEAKIFB5QVBJX0ZVTkModm9pZCkgX1B5RXZhbF9TaWduYWxBc3luY0V4Yyh2b2lkKTsKICNlbmRpZgogCisvKiBNYXNrcyBhbmQgdmFsdWVzIHVzZWQgYnkgRk9STUFUX1ZBTFVFIG9wY29kZS4gKi8KKyNkZWZpbmUgRlZDX01BU0sgICAgICAweDMKKyNkZWZpbmUgRlZDX05PTkUgICAgICAweDAKKyNkZWZpbmUgRlZDX1NUUiAgICAgICAweDEKKyNkZWZpbmUgRlZDX1JFUFIgICAgICAweDIKKyNkZWZpbmUgRlZDX0FTQ0lJICAgICAweDMKKyNkZWZpbmUgRlZTX01BU0sgICAgICAweDQKKyNkZWZpbmUgRlZTX0hBVkVfU1BFQyAweDQKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL2NvZGUuaCBiL0luY2x1ZGUvY29kZS5oCmluZGV4IDhlY2YzOGEuLjk4MjNmMTAgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvY29kZS5oCisrKyBiL0luY2x1ZGUvY29kZS5oCkBAIC0xNSw2ICsxNSw3IEBACiAgICAgaW50IGNvX25sb2NhbHM7CQkvKiAjbG9jYWwgdmFyaWFibGVzICovCiAgICAgaW50IGNvX3N0YWNrc2l6ZTsJCS8qICNlbnRyaWVzIG5lZWRlZCBmb3IgZXZhbHVhdGlvbiBzdGFjayAqLwogICAgIGludCBjb19mbGFnczsJCS8qIENPXy4uLiwgc2VlIGJlbG93ICovCisgICAgaW50IGNvX2ZpcnN0bGluZW5vOyAgIC8qIGZpcnN0IHNvdXJjZSBsaW5lIG51bWJlciAqLwogICAgIFB5T2JqZWN0ICpjb19jb2RlOwkJLyogaW5zdHJ1Y3Rpb24gb3Bjb2RlcyAqLwogICAgIFB5T2JqZWN0ICpjb19jb25zdHM7CS8qIGxpc3QgKGNvbnN0YW50cyB1c2VkKSAqLwogICAgIFB5T2JqZWN0ICpjb19uYW1lczsJCS8qIGxpc3Qgb2Ygc3RyaW5ncyAobmFtZXMgdXNlZCkgKi8KQEAgLTMwLDExICszMSwxNCBAQAogICAgIHVuc2lnbmVkIGNoYXIgKmNvX2NlbGwyYXJnOyAvKiBNYXBzIGNlbGwgdmFycyB3aGljaCBhcmUgYXJndW1lbnRzLiAqLwogICAgIFB5T2JqZWN0ICpjb19maWxlbmFtZTsJLyogdW5pY29kZSAod2hlcmUgaXQgd2FzIGxvYWRlZCBmcm9tKSAqLwogICAgIFB5T2JqZWN0ICpjb19uYW1lOwkJLyogdW5pY29kZSAobmFtZSwgZm9yIHJlZmVyZW5jZSkgKi8KLSAgICBpbnQgY29fZmlyc3RsaW5lbm87CQkvKiBmaXJzdCBzb3VyY2UgbGluZSBudW1iZXIgKi8KICAgICBQeU9iamVjdCAqY29fbG5vdGFiOwkvKiBzdHJpbmcgKGVuY29kaW5nIGFkZHI8LT5saW5lbm8gbWFwcGluZykgU2VlCiAJCQkJICAgT2JqZWN0cy9sbm90YWJfbm90ZXMudHh0IGZvciBkZXRhaWxzLiAqLwogICAgIHZvaWQgKmNvX3pvbWJpZWZyYW1lOyAgICAgLyogZm9yIG9wdGltaXphdGlvbiBvbmx5IChzZWUgZnJhbWVvYmplY3QuYykgKi8KICAgICBQeU9iamVjdCAqY29fd2Vha3JlZmxpc3Q7ICAgLyogdG8gc3VwcG9ydCB3ZWFrcmVmcyB0byBjb2RlIG9iamVjdHMgKi8KKyAgICAvKiBTY3JhdGNoIHNwYWNlIGZvciBleHRyYSBkYXRhIHJlbGF0aW5nIHRvIHRoZSBjb2RlIG9iamVjdC5fX2ljY19uYW4KKyAgICAgICBUeXBlIGlzIGEgdm9pZCogdG8ga2VlcCB0aGUgZm9ybWF0IHByaXZhdGUgaW4gY29kZW9iamVjdC5jIHRvIGZvcmNlCisgICAgICAgcGVvcGxlIHRvIGdvIHRocm91Z2ggdGhlIHByb3BlciBBUElzLiAqLworICAgIHZvaWQgKmNvX2V4dHJhOwogfSBQeUNvZGVPYmplY3Q7CiAKIC8qIE1hc2tzIGZvciBjb19mbGFncyBhYm92ZSAqLwpAQCAtNTUsNiArNTksNyBAQAogICAgYGBhc3luYyBkZWZgYCBrZXl3b3JkcykgKi8KICNkZWZpbmUgQ09fQ09ST1VUSU5FICAgICAgICAgICAgMHgwMDgwCiAjZGVmaW5lIENPX0lURVJBQkxFX0NPUk9VVElORSAgIDB4MDEwMAorI2RlZmluZSBDT19BU1lOQ19HRU5FUkFUT1IgICAgICAweDAyMDAKIAogLyogVGhlc2UgYXJlIG5vIGxvbmdlciB1c2VkLiAqLwogI2lmIDAKQEAgLTEyNiw3ICsxMzEsMTUgQEAKICNlbmRpZgogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlDb2RlX09wdGltaXplKFB5T2JqZWN0ICpjb2RlLCBQeU9iamVjdCogY29uc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZXMsIFB5T2JqZWN0ICpsaW5lbm9fb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5hbWVzLCBQeU9iamVjdCAqbG5vdGFiKTsKKworCisjaWZuZGVmIFB5X0xJTUlURURfQVBJCitQeUFQSV9GVU5DKGludCkgX1B5Q29kZV9HZXRFeHRyYShQeU9iamVjdCAqY29kZSwgUHlfc3NpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipleHRyYSk7CitQeUFQSV9GVU5DKGludCkgX1B5Q29kZV9TZXRFeHRyYShQeU9iamVjdCAqY29kZSwgUHlfc3NpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmV4dHJhKTsKKyNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvZGF0ZXRpbWUuaCBiL0luY2x1ZGUvZGF0ZXRpbWUuaAppbmRleCAwNmNiYzRhLi4zYmYzNWNiIDEwMDY0NAotLS0gYS9JbmNsdWRlL2RhdGV0aW1lLmgKKysrIGIvSW5jbHVkZS9kYXRldGltZS5oCkBAIC04MSw2ICs4MSw3IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIF9QeURhdGVUaW1lX1RJTUVIRUFECisgICAgdW5zaWduZWQgY2hhciBmb2xkOwogICAgIFB5T2JqZWN0ICp0emluZm87CiB9IFB5RGF0ZVRpbWVfVGltZTsgICAgICAgICAgICAgIC8qIGhhc3R6aW5mbyB0cnVlICovCiAKQEAgLTEwOCw2ICsxMDksNyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBfUHlEYXRlVGltZV9EQVRFVElNRUhFQUQKKyAgICB1bnNpZ25lZCBjaGFyIGZvbGQ7CiAgICAgUHlPYmplY3QgKnR6aW5mbzsKIH0gUHlEYXRlVGltZV9EYXRlVGltZTsgICAgICAgICAgLyogaGFzdHppbmZvIHRydWUgKi8KIApAQCAtMTI1LDYgKzEyNyw3IEBACiAgICAgKCgoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzddIDw8IDE2KSB8ICAgICAgIFwKICAgICAgKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbOF0gPDwgOCkgIHwgICAgICAgXAogICAgICAgKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs5XSkKKyNkZWZpbmUgUHlEYXRlVGltZV9EQVRFX0dFVF9GT0xEKG8pICAgICAgICAoKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+Zm9sZCkKIAogLyogQXBwbHkgZm9yIHRpbWUgaW5zdGFuY2VzLiAqLwogI2RlZmluZSBQeURhdGVUaW1lX1RJTUVfR0VUX0hPVVIobykgICAgICAgICgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbMF0pCkBAIC0xMzQsNiArMTM3LDcgQEAKICAgICAoKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVszXSA8PCAxNikgfCAgICAgICAgICAgXAogICAgICAoKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzRdIDw8IDgpICB8ICAgICAgICAgICBcCiAgICAgICAoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbNV0pCisjZGVmaW5lIFB5RGF0ZVRpbWVfVElNRV9HRVRfRk9MRChvKSAgICAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+Zm9sZCkKIAogLyogQXBwbHkgZm9yIHRpbWUgZGVsdGEgaW5zdGFuY2VzICovCiAjZGVmaW5lIFB5RGF0ZVRpbWVfREVMVEFfR0VUX0RBWVMobykgICAgICAgICAoKChQeURhdGVUaW1lX0RlbHRhKilvKS0+ZGF5cykKQEAgLTE2Miw2ICsxNjYsMTEgQEAKICAgICBQeU9iamVjdCAqKCpEYXRlVGltZV9Gcm9tVGltZXN0YW1wKShQeU9iamVjdCosIFB5T2JqZWN0KiwgUHlPYmplY3QqKTsKICAgICBQeU9iamVjdCAqKCpEYXRlX0Zyb21UaW1lc3RhbXApKFB5T2JqZWN0KiwgUHlPYmplY3QqKTsKIAorICAgIC8qIFBFUCA0OTUgY29uc3RydWN0b3JzICovCisgICAgUHlPYmplY3QgKigqRGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lQW5kRm9sZCkoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LAorICAgICAgICBQeU9iamVjdCosIGludCwgUHlUeXBlT2JqZWN0Kik7CisgICAgUHlPYmplY3QgKigqVGltZV9Gcm9tVGltZUFuZEZvbGQpKGludCwgaW50LCBpbnQsIGludCwgUHlPYmplY3QqLCBpbnQsIFB5VHlwZU9iamVjdCopOworCiB9IFB5RGF0ZVRpbWVfQ0FQSTsKIAogI2RlZmluZSBQeURhdGVUaW1lX0NBUFNVTEVfTkFNRSAiZGF0ZXRpbWUuZGF0ZXRpbWVfQ0FQSSIKQEAgLTIxNywxMCArMjI2LDE4IEBACiAgICAgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIFwKICAgICAgICAgbWluLCBzZWMsIHVzZWMsIFB5X05vbmUsIFB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lVHlwZSkKIAorI2RlZmluZSBQeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZUFuZEZvbGQoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMsIHVzZWMsIGZvbGQpIFwKKyAgICBQeURhdGVUaW1lQVBJLT5EYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWVBbmRGb2xkKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIFwKKyAgICAgICAgbWluLCBzZWMsIHVzZWMsIFB5X05vbmUsIGZvbGQsIFB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lVHlwZSkKKwogI2RlZmluZSBQeVRpbWVfRnJvbVRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQpIFwKICAgICBQeURhdGVUaW1lQVBJLT5UaW1lX0Zyb21UaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCBcCiAgICAgICAgIFB5X05vbmUsIFB5RGF0ZVRpbWVBUEktPlRpbWVUeXBlKQogCisjZGVmaW5lIFB5VGltZV9Gcm9tVGltZUFuZEZvbGQoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsIGZvbGQpIFwKKyAgICBQeURhdGVUaW1lQVBJLT5UaW1lX0Zyb21UaW1lQW5kRm9sZChob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCwgXAorICAgICAgICBQeV9Ob25lLCBmb2xkLCBQeURhdGVUaW1lQVBJLT5UaW1lVHlwZSkKKwogI2RlZmluZSBQeURlbHRhX0Zyb21EU1UoZGF5cywgc2Vjb25kcywgdXNlY29uZHMpIFwKICAgICBQeURhdGVUaW1lQVBJLT5EZWx0YV9Gcm9tRGVsdGEoZGF5cywgc2Vjb25kcywgdXNlY29uZHMsIDEsIFwKICAgICAgICAgUHlEYXRlVGltZUFQSS0+RGVsdGFUeXBlKQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9kaWN0b2JqZWN0LmggYi9JbmNsdWRlL2RpY3RvYmplY3QuaAppbmRleCBiYTkwYWFmLi4xOTE5NGVkIDEwMDY0NAotLS0gYS9JbmNsdWRlL2RpY3RvYmplY3QuaAorKysgYi9JbmNsdWRlL2RpY3RvYmplY3QuaApAQCAtMjIsOCArMjIsMjEgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKKworICAgIC8qIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGljdGlvbmFyeSAqLwogICAgIFB5X3NzaXplX3QgbWFfdXNlZDsKKworICAgIC8qIERpY3Rpb25hcnkgdmVyc2lvbjogZ2xvYmFsbHkgdW5pcXVlLCB2YWx1ZSBjaGFuZ2UgZWFjaCB0aW1lCisgICAgICAgdGhlIGRpY3Rpb25hcnkgaXMgbW9kaWZpZWQgKi8KKyAgICB1aW50NjRfdCBtYV92ZXJzaW9uX3RhZzsKKwogICAgIFB5RGljdEtleXNPYmplY3QgKm1hX2tleXM7CisKKyAgICAvKiBJZiBtYV92YWx1ZXMgaXMgTlVMTCwgdGhlIHRhYmxlIGlzICJjb21iaW5lZCI6IGtleXMgYW5kIHZhbHVlcworICAgICAgIGFyZSBzdG9yZWQgaW4gbWFfa2V5cyAoYW5kIG1hX2tleXMtPmRrX3JlZmNudCA9PSAxKS4KKworICAgICAgIElmIG1hX3ZhbHVlcyBpcyBub3QgTlVMTCwgdGhlIHRhYmxlIGlzIHNwbGl0dGVkOgorICAgICAgIGtleXMgYXJlIHN0b3JlZCBpbiBtYV9rZXlzIGFuZCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBtYV92YWx1ZXMgKi8KICAgICBQeU9iamVjdCAqKm1hX3ZhbHVlczsKIH0gUHlEaWN0T2JqZWN0OwogCmRpZmYgLS1naXQgYS9JbmNsdWRlL2ZpbGVvYmplY3QuaCBiL0luY2x1ZGUvZmlsZW9iamVjdC5oCmluZGV4IDAzMTU1ZDMuLjAzOTg0YmEgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZmlsZW9iamVjdC5oCisrKyBiL0luY2x1ZGUvZmlsZW9iamVjdC5oCkBAIC0yMyw2ICsyMyw3IEBACiAgICBJZiBub24tTlVMTCwgdGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3Igc3RyaW5ncwogKi8KIFB5QVBJX0RBVEEoY29uc3QgY2hhciAqKSBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nOworUHlBUElfREFUQShjb25zdCBjaGFyICopIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RlRXJyb3JzOwogUHlBUElfREFUQShpbnQpIFB5X0hhc0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2Rpbmc7CiAKIC8qIEludGVybmFsIEFQSQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9maWxldXRpbHMuaCBiL0luY2x1ZGUvZmlsZXV0aWxzLmgKaW5kZXggYjRhNjgzYy4uNjNmZjgwZSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9maWxldXRpbHMuaAorKysgYi9JbmNsdWRlL2ZpbGV1dGlscy5oCkBAIC0xMjEsMTggKzEyMSw2IEBACiBQeUFQSV9GVU5DKGludCkgX1B5X3NldF9ibG9ja2luZyhpbnQgZmQsIGludCBibG9ja2luZyk7CiAjZW5kaWYgICAvKiAhTVNfV0lORE9XUyAqLwogCi0jaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNDAwICYmIF9NU0NfVkVSIDwgMTkwMAotLyogQSByb3V0aW5lIHRvIGNoZWNrIGlmIGEgZmlsZSBkZXNjcmlwdG9yIGlzIHZhbGlkIG9uIFdpbmRvd3MuICBSZXR1cm5zIDAKLSAqIGFuZCBzZXRzIGVycm5vIHRvIEVCQURGIGlmIGl0IGlzbid0LiAgVGhpcyBpcyB0byBhdm9pZCBBc3NlcnRpb25zCi0gKiBmcm9tIHZhcmlvdXMgZnVuY3Rpb25zIGluIHRoZSBXaW5kb3dzIENSVCBiZWdpbm5pbmcgd2l0aAotICogVmlzdWFsIFN0dWRpbyAyMDA1Ci0gKi8KLWludCBfUHlWZXJpZnlfZmQoaW50IGZkKTsKLQotI2Vsc2UKLSNkZWZpbmUgX1B5VmVyaWZ5X2ZkKEEpICgxKSAvKiBkdW1teSAqLwotI2VuZGlmCi0KICNlbmRpZiAgIC8qIFB5X0xJTUlURURfQVBJICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9mbG9hdG9iamVjdC5oIGIvSW5jbHVkZS9mbG9hdG9iamVjdC5oCmluZGV4IGUyNDBmZGIuLmYxMDQ0ZDYgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZmxvYXRvYmplY3QuaAorKysgYi9JbmNsdWRlL2Zsb2F0b2JqZWN0LmgKQEAgLTc0LDkgKzc0LDkgQEAKICAqIGhhcHBlbnMgaW4gc3VjaCBjYXNlcyBpcyBwYXJ0bHkgYWNjaWRlbnRhbCAoYWxhcykuCiAgKi8KIAotLyogVGhlIHBhY2sgcm91dGluZXMgd3JpdGUgNCBvciA4IGJ5dGVzLCBzdGFydGluZyBhdCBwLiAgbGUgaXMgYSBib29sCisvKiBUaGUgcGFjayByb3V0aW5lcyB3cml0ZSAyLCA0IG9yIDggYnl0ZXMsIHN0YXJ0aW5nIGF0IHAuICBsZSBpcyBhIGJvb2wKICAqIGFyZ3VtZW50LCB0cnVlIGlmIHlvdSB3YW50IHRoZSBzdHJpbmcgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQgKGV4cG9uZW50Ci0gKiBsYXN0LCBhdCBwKzMgb3IgcCs3KSwgZmFsc2UgaWYgeW91IHdhbnQgYmlnLWVuZGlhbiBmb3JtYXQgKGV4cG9uZW50CisgKiBsYXN0LCBhdCBwKzEsIHArMyBvciBwKzcpLCBmYWxzZSBpZiB5b3Ugd2FudCBiaWctZW5kaWFuIGZvcm1hdCAoZXhwb25lbnQKICAqIGZpcnN0LCBhdCBwKS4KICAqIFJldHVybiB2YWx1ZTogIDAgaWYgYWxsIGlzIE9LLCAtMSBpZiBlcnJvciAoYW5kIGFuIGV4Y2VwdGlvbiBpcwogICogc2V0LCBtb3N0IGxpa2VseSBPdmVyZmxvd0Vycm9yKS4KQEAgLTg0LDYgKzg0LDcgQEAKICAqIDEpOiAgV2hhdCB0aGlzIGRvZXMgaXMgdW5kZWZpbmVkIGlmIHggaXMgYSBOYU4gb3IgaW5maW5pdHkuCiAgKiAyKTogIC0wLjAgYW5kICswLjAgcHJvZHVjZSB0aGUgc2FtZSBzdHJpbmcuCiAgKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlGbG9hdF9QYWNrMihkb3VibGUgeCwgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKTsKIFB5QVBJX0ZVTkMoaW50KSBfUHlGbG9hdF9QYWNrNChkb3VibGUgeCwgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKTsKIFB5QVBJX0ZVTkMoaW50KSBfUHlGbG9hdF9QYWNrOChkb3VibGUgeCwgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKTsKIApAQCAtOTYsMTQgKzk3LDE1IEBACiBQeUFQSV9GVU5DKGludCkgX1B5RmxvYXRfRGlnaXRzKGNoYXIgKmJ1ZiwgZG91YmxlIHYsIGludCAqc2lnbnVtKTsKIFB5QVBJX0ZVTkModm9pZCkgX1B5RmxvYXRfRGlnaXRzSW5pdCh2b2lkKTsKIAotLyogVGhlIHVucGFjayByb3V0aW5lcyByZWFkIDQgb3IgOCBieXRlcywgc3RhcnRpbmcgYXQgcC4gIGxlIGlzIGEgYm9vbAorLyogVGhlIHVucGFjayByb3V0aW5lcyByZWFkIDIsIDQgb3IgOCBieXRlcywgc3RhcnRpbmcgYXQgcC4gIGxlIGlzIGEgYm9vbAogICogYXJndW1lbnQsIHRydWUgaWYgdGhlIHN0cmluZyBpcyBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdCAoZXhwb25lbnQKLSAqIGxhc3QsIGF0IHArMyBvciBwKzcpLCBmYWxzZSBpZiBiaWctZW5kaWFuIChleHBvbmVudCBmaXJzdCwgYXQgcCkuCisgKiBsYXN0LCBhdCBwKzEsIHArMyBvciBwKzcpLCBmYWxzZSBpZiBiaWctZW5kaWFuIChleHBvbmVudCBmaXJzdCwgYXQgcCkuCiAgKiBSZXR1cm4gdmFsdWU6ICBUaGUgdW5wYWNrZWQgZG91YmxlLiAgT24gZXJyb3IsIHRoaXMgaXMgLTEuMCBhbmQKICAqIFB5RXJyX09jY3VycmVkKCkgaXMgdHJ1ZSAoYW5kIGFuIGV4Y2VwdGlvbiBpcyBzZXQsIG1vc3QgbGlrZWx5CiAgKiBPdmVyZmxvd0Vycm9yKS4gIE5vdGUgdGhhdCBvbiBhIG5vbi1JRUVFIHBsYXRmb3JtIHRoaXMgd2lsbCByZWZ1c2UKICAqIHRvIHVucGFjayBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSBOYU4gb3IgaW5maW5pdHkuCiAgKi8KK1B5QVBJX0ZVTkMoZG91YmxlKSBfUHlGbG9hdF9VbnBhY2syKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSk7CiBQeUFQSV9GVU5DKGRvdWJsZSkgX1B5RmxvYXRfVW5wYWNrNChjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpOwogUHlBUElfRlVOQyhkb3VibGUpIF9QeUZsb2F0X1VucGFjazgoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKTsKIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9mdW5jb2JqZWN0LmggYi9JbmNsdWRlL2Z1bmNvYmplY3QuaAppbmRleCBjYzE0MjZjLi43N2JiOGMzIDEwMDY0NAotLS0gYS9JbmNsdWRlL2Z1bmNvYmplY3QuaAorKysgYi9JbmNsdWRlL2Z1bmNvYmplY3QuaApAQCAtNTgsNiArNTgsMjAgQEAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGdW5jdGlvbl9HZXRBbm5vdGF0aW9ucyhQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeUZ1bmN0aW9uX1NldEFubm90YXRpb25zKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogCisjaWZuZGVmIFB5X0xJTUlURURfQVBJCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUZ1bmN0aW9uX0Zhc3RDYWxsRGljdCgKKyAgICBQeU9iamVjdCAqZnVuYywKKyAgICBQeU9iamVjdCAqKmFyZ3MsCisgICAgUHlfc3NpemVfdCBuYXJncywKKyAgICBQeU9iamVjdCAqa3dhcmdzKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlGdW5jdGlvbl9GYXN0Q2FsbEtleXdvcmRzKAorICAgIFB5T2JqZWN0ICpmdW5jLAorICAgIFB5T2JqZWN0ICoqc3RhY2ssCisgICAgUHlfc3NpemVfdCBuYXJncywKKyAgICBQeU9iamVjdCAqa3duYW1lcyk7CisjZW5kaWYKKwogLyogTWFjcm9zIGZvciBkaXJlY3QgYWNjZXNzIHRvIHRoZXNlIHZhbHVlcy4gVHlwZSBjaGVja3MgYXJlICpub3QqCiAgICBkb25lLCBzbyB1c2Ugd2l0aCBjYXJlLiAqLwogI2RlZmluZSBQeUZ1bmN0aW9uX0dFVF9DT0RFKGZ1bmMpIFwKZGlmZiAtLWdpdCBhL0luY2x1ZGUvZ2Vub2JqZWN0LmggYi9JbmNsdWRlL2dlbm9iamVjdC5oCmluZGV4IDFmZjMyYTguLjk3M2JkZDUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZ2Vub2JqZWN0LmgKKysrIGIvSW5jbHVkZS9nZW5vYmplY3QuaApAQCAtNjEsNiArNjEsMzcgQEAKIFB5T2JqZWN0ICpfUHlDb3JvX0dldEF3YWl0YWJsZUl0ZXIoUHlPYmplY3QgKm8pOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNvcm9fTmV3KHN0cnVjdCBfZnJhbWUgKiwKICAgICBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnF1YWxuYW1lKTsKKworLyogQXN5bmNocm9ub3VzIEdlbmVyYXRvcnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIF9QeUdlbk9iamVjdF9IRUFEKGFnKQorICAgIFB5T2JqZWN0ICphZ19maW5hbGl6ZXI7CisKKyAgICAvKiBGbGFnIGlzIHNldCB0byAxIHdoZW4gaG9va3Mgc2V0IHVwIGJ5IHN5cy5zZXRfYXN5bmNnZW5faG9va3MKKyAgICAgICB3ZXJlIGNhbGxlZCBvbiB0aGUgZ2VuZXJhdG9yLCB0byBhdm9pZCBjYWxsaW5nIHRoZW0gbW9yZQorICAgICAgIHRoYW4gb25jZS4gKi8KKyAgICBpbnQgYWdfaG9va3NfaW5pdGVkOworCisgICAgLyogRmxhZyBpcyBzZXQgdG8gMSB3aGVuIGFjbG9zZSgpIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIG9yCisgICAgICAgd2hlbiBhIFN0b3BBc3luY0l0ZXJhdGlvbiBleGNlcHRpb24gaXMgcmFpc2VkLiAqLworICAgIGludCBhZ19jbG9zZWQ7Cit9IFB5QXN5bmNHZW5PYmplY3Q7CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUFzeW5jR2VuX1R5cGU7CitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgX1B5QXN5bmNHZW5BU2VuZF9UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIF9QeUFzeW5jR2VuV3JhcHBlZFZhbHVlX1R5cGU7CitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgX1B5QXN5bmNHZW5BVGhyb3dfVHlwZTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUFzeW5jR2VuX05ldyhzdHJ1Y3QgX2ZyYW1lICosCisgICAgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICpxdWFsbmFtZSk7CisKKyNkZWZpbmUgUHlBc3luY0dlbl9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5QXN5bmNHZW5fVHlwZSkKKworUHlPYmplY3QgKl9QeUFzeW5jR2VuVmFsdWVXcmFwcGVyTmV3KFB5T2JqZWN0ICopOworCitpbnQgUHlBc3luY0dlbl9DbGVhckZyZWVMaXN0cyh2b2lkKTsKKwogI2VuZGlmCiAKICN1bmRlZiBfUHlHZW5PYmplY3RfSEVBRApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9ncmFtaW5pdC5oIGIvSW5jbHVkZS9ncmFtaW5pdC5oCmluZGV4IGQwMzBiYzMuLmU5YjRhOTMgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZ3JhbWluaXQuaAorKysgYi9JbmNsdWRlL2dyYW1pbml0LmgKQEAgLTE3LDcxICsxNyw3MiBAQAogI2RlZmluZSBzaW1wbGVfc3RtdCAyNzAKICNkZWZpbmUgc21hbGxfc3RtdCAyNzEKICNkZWZpbmUgZXhwcl9zdG10IDI3MgotI2RlZmluZSB0ZXN0bGlzdF9zdGFyX2V4cHIgMjczCi0jZGVmaW5lIGF1Z2Fzc2lnbiAyNzQKLSNkZWZpbmUgZGVsX3N0bXQgMjc1Ci0jZGVmaW5lIHBhc3Nfc3RtdCAyNzYKLSNkZWZpbmUgZmxvd19zdG10IDI3NwotI2RlZmluZSBicmVha19zdG10IDI3OAotI2RlZmluZSBjb250aW51ZV9zdG10IDI3OQotI2RlZmluZSByZXR1cm5fc3RtdCAyODAKLSNkZWZpbmUgeWllbGRfc3RtdCAyODEKLSNkZWZpbmUgcmFpc2Vfc3RtdCAyODIKLSNkZWZpbmUgaW1wb3J0X3N0bXQgMjgzCi0jZGVmaW5lIGltcG9ydF9uYW1lIDI4NAotI2RlZmluZSBpbXBvcnRfZnJvbSAyODUKLSNkZWZpbmUgaW1wb3J0X2FzX25hbWUgMjg2Ci0jZGVmaW5lIGRvdHRlZF9hc19uYW1lIDI4NwotI2RlZmluZSBpbXBvcnRfYXNfbmFtZXMgMjg4Ci0jZGVmaW5lIGRvdHRlZF9hc19uYW1lcyAyODkKLSNkZWZpbmUgZG90dGVkX25hbWUgMjkwCi0jZGVmaW5lIGdsb2JhbF9zdG10IDI5MQotI2RlZmluZSBub25sb2NhbF9zdG10IDI5MgotI2RlZmluZSBhc3NlcnRfc3RtdCAyOTMKLSNkZWZpbmUgY29tcG91bmRfc3RtdCAyOTQKLSNkZWZpbmUgYXN5bmNfc3RtdCAyOTUKLSNkZWZpbmUgaWZfc3RtdCAyOTYKLSNkZWZpbmUgd2hpbGVfc3RtdCAyOTcKLSNkZWZpbmUgZm9yX3N0bXQgMjk4Ci0jZGVmaW5lIHRyeV9zdG10IDI5OQotI2RlZmluZSB3aXRoX3N0bXQgMzAwCi0jZGVmaW5lIHdpdGhfaXRlbSAzMDEKLSNkZWZpbmUgZXhjZXB0X2NsYXVzZSAzMDIKLSNkZWZpbmUgc3VpdGUgMzAzCi0jZGVmaW5lIHRlc3QgMzA0Ci0jZGVmaW5lIHRlc3Rfbm9jb25kIDMwNQotI2RlZmluZSBsYW1iZGVmIDMwNgotI2RlZmluZSBsYW1iZGVmX25vY29uZCAzMDcKLSNkZWZpbmUgb3JfdGVzdCAzMDgKLSNkZWZpbmUgYW5kX3Rlc3QgMzA5Ci0jZGVmaW5lIG5vdF90ZXN0IDMxMAotI2RlZmluZSBjb21wYXJpc29uIDMxMQotI2RlZmluZSBjb21wX29wIDMxMgotI2RlZmluZSBzdGFyX2V4cHIgMzEzCi0jZGVmaW5lIGV4cHIgMzE0Ci0jZGVmaW5lIHhvcl9leHByIDMxNQotI2RlZmluZSBhbmRfZXhwciAzMTYKLSNkZWZpbmUgc2hpZnRfZXhwciAzMTcKLSNkZWZpbmUgYXJpdGhfZXhwciAzMTgKLSNkZWZpbmUgdGVybSAzMTkKLSNkZWZpbmUgZmFjdG9yIDMyMAotI2RlZmluZSBwb3dlciAzMjEKLSNkZWZpbmUgYXRvbV9leHByIDMyMgotI2RlZmluZSBhdG9tIDMyMwotI2RlZmluZSB0ZXN0bGlzdF9jb21wIDMyNAotI2RlZmluZSB0cmFpbGVyIDMyNQotI2RlZmluZSBzdWJzY3JpcHRsaXN0IDMyNgotI2RlZmluZSBzdWJzY3JpcHQgMzI3Ci0jZGVmaW5lIHNsaWNlb3AgMzI4Ci0jZGVmaW5lIGV4cHJsaXN0IDMyOQotI2RlZmluZSB0ZXN0bGlzdCAzMzAKLSNkZWZpbmUgZGljdG9yc2V0bWFrZXIgMzMxCi0jZGVmaW5lIGNsYXNzZGVmIDMzMgotI2RlZmluZSBhcmdsaXN0IDMzMwotI2RlZmluZSBhcmd1bWVudCAzMzQKLSNkZWZpbmUgY29tcF9pdGVyIDMzNQotI2RlZmluZSBjb21wX2ZvciAzMzYKLSNkZWZpbmUgY29tcF9pZiAzMzcKLSNkZWZpbmUgZW5jb2RpbmdfZGVjbCAzMzgKLSNkZWZpbmUgeWllbGRfZXhwciAzMzkKLSNkZWZpbmUgeWllbGRfYXJnIDM0MAorI2RlZmluZSBhbm5hc3NpZ24gMjczCisjZGVmaW5lIHRlc3RsaXN0X3N0YXJfZXhwciAyNzQKKyNkZWZpbmUgYXVnYXNzaWduIDI3NQorI2RlZmluZSBkZWxfc3RtdCAyNzYKKyNkZWZpbmUgcGFzc19zdG10IDI3NworI2RlZmluZSBmbG93X3N0bXQgMjc4CisjZGVmaW5lIGJyZWFrX3N0bXQgMjc5CisjZGVmaW5lIGNvbnRpbnVlX3N0bXQgMjgwCisjZGVmaW5lIHJldHVybl9zdG10IDI4MQorI2RlZmluZSB5aWVsZF9zdG10IDI4MgorI2RlZmluZSByYWlzZV9zdG10IDI4MworI2RlZmluZSBpbXBvcnRfc3RtdCAyODQKKyNkZWZpbmUgaW1wb3J0X25hbWUgMjg1CisjZGVmaW5lIGltcG9ydF9mcm9tIDI4NgorI2RlZmluZSBpbXBvcnRfYXNfbmFtZSAyODcKKyNkZWZpbmUgZG90dGVkX2FzX25hbWUgMjg4CisjZGVmaW5lIGltcG9ydF9hc19uYW1lcyAyODkKKyNkZWZpbmUgZG90dGVkX2FzX25hbWVzIDI5MAorI2RlZmluZSBkb3R0ZWRfbmFtZSAyOTEKKyNkZWZpbmUgZ2xvYmFsX3N0bXQgMjkyCisjZGVmaW5lIG5vbmxvY2FsX3N0bXQgMjkzCisjZGVmaW5lIGFzc2VydF9zdG10IDI5NAorI2RlZmluZSBjb21wb3VuZF9zdG10IDI5NQorI2RlZmluZSBhc3luY19zdG10IDI5NgorI2RlZmluZSBpZl9zdG10IDI5NworI2RlZmluZSB3aGlsZV9zdG10IDI5OAorI2RlZmluZSBmb3Jfc3RtdCAyOTkKKyNkZWZpbmUgdHJ5X3N0bXQgMzAwCisjZGVmaW5lIHdpdGhfc3RtdCAzMDEKKyNkZWZpbmUgd2l0aF9pdGVtIDMwMgorI2RlZmluZSBleGNlcHRfY2xhdXNlIDMwMworI2RlZmluZSBzdWl0ZSAzMDQKKyNkZWZpbmUgdGVzdCAzMDUKKyNkZWZpbmUgdGVzdF9ub2NvbmQgMzA2CisjZGVmaW5lIGxhbWJkZWYgMzA3CisjZGVmaW5lIGxhbWJkZWZfbm9jb25kIDMwOAorI2RlZmluZSBvcl90ZXN0IDMwOQorI2RlZmluZSBhbmRfdGVzdCAzMTAKKyNkZWZpbmUgbm90X3Rlc3QgMzExCisjZGVmaW5lIGNvbXBhcmlzb24gMzEyCisjZGVmaW5lIGNvbXBfb3AgMzEzCisjZGVmaW5lIHN0YXJfZXhwciAzMTQKKyNkZWZpbmUgZXhwciAzMTUKKyNkZWZpbmUgeG9yX2V4cHIgMzE2CisjZGVmaW5lIGFuZF9leHByIDMxNworI2RlZmluZSBzaGlmdF9leHByIDMxOAorI2RlZmluZSBhcml0aF9leHByIDMxOQorI2RlZmluZSB0ZXJtIDMyMAorI2RlZmluZSBmYWN0b3IgMzIxCisjZGVmaW5lIHBvd2VyIDMyMgorI2RlZmluZSBhdG9tX2V4cHIgMzIzCisjZGVmaW5lIGF0b20gMzI0CisjZGVmaW5lIHRlc3RsaXN0X2NvbXAgMzI1CisjZGVmaW5lIHRyYWlsZXIgMzI2CisjZGVmaW5lIHN1YnNjcmlwdGxpc3QgMzI3CisjZGVmaW5lIHN1YnNjcmlwdCAzMjgKKyNkZWZpbmUgc2xpY2VvcCAzMjkKKyNkZWZpbmUgZXhwcmxpc3QgMzMwCisjZGVmaW5lIHRlc3RsaXN0IDMzMQorI2RlZmluZSBkaWN0b3JzZXRtYWtlciAzMzIKKyNkZWZpbmUgY2xhc3NkZWYgMzMzCisjZGVmaW5lIGFyZ2xpc3QgMzM0CisjZGVmaW5lIGFyZ3VtZW50IDMzNQorI2RlZmluZSBjb21wX2l0ZXIgMzM2CisjZGVmaW5lIGNvbXBfZm9yIDMzNworI2RlZmluZSBjb21wX2lmIDMzOAorI2RlZmluZSBlbmNvZGluZ19kZWNsIDMzOQorI2RlZmluZSB5aWVsZF9leHByIDM0MAorI2RlZmluZSB5aWVsZF9hcmcgMzQxCmRpZmYgLS1naXQgYS9JbmNsdWRlL2xvbmdpbnRyZXByLmggYi9JbmNsdWRlL2xvbmdpbnRyZXByLmgKaW5kZXggYmJiYTRkOC4uYTNiNzRiNCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9sb25naW50cmVwci5oCisrKyBiL0luY2x1ZGUvbG9uZ2ludHJlcHIuaApAQCAtNDIsMTQgKzQyLDEwIEBACiAqLwogCiAjaWYgUFlMT05HX0JJVFNfSU5fRElHSVQgPT0gMzAKLSNpZiAhKGRlZmluZWQgSEFWRV9VSU5UNjRfVCAmJiBkZWZpbmVkIEhBVkVfVUlOVDMyX1QgJiYgICAgICAgICAgXAotICAgICAgZGVmaW5lZCBIQVZFX0lOVDY0X1QgJiYgZGVmaW5lZCBIQVZFX0lOVDMyX1QpCi0jZXJyb3IgIjMwLWJpdCBsb25nIGRpZ2l0cyByZXF1ZXN0ZWQsIGJ1dCB0aGUgbmVjZXNzYXJ5IHR5cGVzIGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0iCi0jZW5kaWYKLXR5cGVkZWYgUFlfVUlOVDMyX1QgZGlnaXQ7Ci10eXBlZGVmIFBZX0lOVDMyX1Qgc2RpZ2l0OyAvKiBzaWduZWQgdmFyaWFudCBvZiBkaWdpdCAqLwotdHlwZWRlZiBQWV9VSU5UNjRfVCB0d29kaWdpdHM7Ci10eXBlZGVmIFBZX0lOVDY0X1Qgc3R3b2RpZ2l0czsgLyogc2lnbmVkIHZhcmlhbnQgb2YgdHdvZGlnaXRzICovCit0eXBlZGVmIHVpbnQzMl90IGRpZ2l0OwordHlwZWRlZiBpbnQzMl90IHNkaWdpdDsgLyogc2lnbmVkIHZhcmlhbnQgb2YgZGlnaXQgKi8KK3R5cGVkZWYgdWludDY0X3QgdHdvZGlnaXRzOwordHlwZWRlZiBpbnQ2NF90IHN0d29kaWdpdHM7IC8qIHNpZ25lZCB2YXJpYW50IG9mIHR3b2RpZ2l0cyAqLwogI2RlZmluZSBQeUxvbmdfU0hJRlQJMzAKICNkZWZpbmUgX1B5TG9uZ19ERUNJTUFMX1NISUZUCTkgLyogbWF4KGUgc3VjaCB0aGF0IDEwKiplIGZpdHMgaW4gYSBkaWdpdCkgKi8KICNkZWZpbmUgX1B5TG9uZ19ERUNJTUFMX0JBU0UJKChkaWdpdCkxMDAwMDAwMDAwKSAvKiAxMCAqKiBERUNJTUFMX1NISUZUICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL2xvbmdvYmplY3QuaCBiL0luY2x1ZGUvbG9uZ29iamVjdC5oCmluZGV4IDJhMmVlY2YuLjI5NTdmMTYgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvbG9uZ29iamVjdC5oCisrKyBiL0luY2x1ZGUvbG9uZ29iamVjdC5oCkBAIC02NSw3ICs2NSw4IEBACiAjICBlcnJvciAidm9pZCogZGlmZmVyZW50IGluIHNpemUgZnJvbSBpbnQsIGxvbmcgYW5kIGxvbmcgbG9uZyIKICNlbmRpZiAvKiBTSVpFT0ZfVk9JRF9QICovCiAKLS8qIFVzZWQgYnkgUHl0aG9uL215c3RydG91bC5jLiAqLworLyogVXNlZCBieSBQeXRob24vbXlzdHJ0b3VsLmMsIF9QeUJ5dGVzX0Zyb21IZXgoKSwKKyAgIF9QeUJ5dGVzX0RlY29kZUVzY2FwZVJlY29kZSgpLCBldGMuICovCiAjaWZuZGVmIFB5X0xJTUlURURfQVBJCiBQeUFQSV9EQVRBKHVuc2lnbmVkIGNoYXIpIF9QeUxvbmdfRGlnaXRWYWx1ZVsyNTZdOwogI2VuZGlmCkBAIC04NCwxNCArODUsMTIgQEAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21Wb2lkUHRyKHZvaWQgKik7CiBQeUFQSV9GVU5DKHZvaWQgKikgUHlMb25nX0FzVm9pZFB0cihQeU9iamVjdCAqKTsKIAotI2lmZGVmIEhBVkVfTE9OR19MT05HCi1QeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTE9OR19MT05HKTsKLVB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyk7Ci1QeUFQSV9GVU5DKFBZX0xPTkdfTE9ORykgUHlMb25nX0FzTG9uZ0xvbmcoUHlPYmplY3QgKik7Ci1QeUFQSV9GVU5DKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyhQeU9iamVjdCAqKTsKLVB5QVBJX0ZVTkModW5zaWduZWQgUFlfTE9OR19MT05HKSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzayhQeU9iamVjdCAqKTsKLVB5QVBJX0ZVTkMoUFlfTE9OR19MT05HKSBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93KFB5T2JqZWN0ICosIGludCAqKTsKLSNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmdMb25nKGxvbmcgbG9uZyk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh1bnNpZ25lZCBsb25nIGxvbmcpOworUHlBUElfRlVOQyhsb25nIGxvbmcpIFB5TG9uZ19Bc0xvbmdMb25nKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh1bnNpZ25lZCBsb25nIGxvbmcpIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHVuc2lnbmVkIGxvbmcgbG9uZykgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGxvbmcgbG9uZykgUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhQeU9iamVjdCAqLCBpbnQgKik7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21TdHJpbmcoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQpAQCAtMTgyLDYgKzE4MSwxMyBAQAogICAgIGludCBiYXNlLAogICAgIGludCBhbHRlcm5hdGUpOwogCitQeUFQSV9GVU5DKGNoYXIqKSBfUHlMb25nX0Zvcm1hdEJ5dGVzV3JpdGVyKAorICAgIF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgY2hhciAqc3RyLAorICAgIFB5T2JqZWN0ICpvYmosCisgICAgaW50IGJhc2UsCisgICAgaW50IGFsdGVybmF0ZSk7CisKIC8qIEZvcm1hdCB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBmb3JtYXRfc3BlYywgYXMgZGVmaW5lZCBpbiBQRVAgMzEwMQogICAgKEFkdmFuY2VkIFN0cmluZyBGb3JtYXR0aW5nKS4gKi8KIFB5QVBJX0ZVTkMoaW50KSBfUHlMb25nX0Zvcm1hdEFkdmFuY2VkV3JpdGVyKApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9tZXRob2RvYmplY3QuaCBiL0luY2x1ZGUvbWV0aG9kb2JqZWN0LmgKaW5kZXggZTJhZDgwNC4uODRhMTQ5NyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9tZXRob2RvYmplY3QuaAorKysgYi9JbmNsdWRlL21ldGhvZG9iamVjdC5oCkBAIC0zNyw2ICszNywxMyBAQAogI2VuZGlmCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q0Z1bmN0aW9uX0NhbGwoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKKyNpZm5kZWYgUHlfTElNSVRFRF9BUEkKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5Q0Z1bmN0aW9uX0Zhc3RDYWxsRGljdChQeU9iamVjdCAqZnVuYywKKyAgICBQeU9iamVjdCAqKmFyZ3MsCisgICAgUHlfc3NpemVfdCBuYXJncywKKyAgICBQeU9iamVjdCAqa3dhcmdzKTsKKyNlbmRpZgorCiBzdHJ1Y3QgUHlNZXRob2REZWYgewogICAgIGNvbnN0IGNoYXIgICptbF9uYW1lOyAgIC8qIFRoZSBuYW1lIG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbi9tZXRob2QgKi8KICAgICBQeUNGdW5jdGlvbiBtbF9tZXRoOyAgICAvKiBUaGUgQyBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgaXQgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvbW9kc3VwcG9ydC5oIGIvSW5jbHVkZS9tb2RzdXBwb3J0LmgKaW5kZXggODI5YWFmOC4uNmIwYWNiOCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9tb2RzdXBwb3J0LmgKKysrIGIvSW5jbHVkZS9tb2RzdXBwb3J0LmgKQEAgLTQ0LDYgKzQ0LDI5IEBACiAjZW5kaWYKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlfVmFCdWlsZFZhbHVlKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CiAKKyNpZm5kZWYgUHlfTElNSVRFRF9BUEkKK3R5cGVkZWYgc3RydWN0IF9QeUFyZ19QYXJzZXIgeworICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKmtleXdvcmRzOworICAgIGNvbnN0IGNoYXIgKmZuYW1lOworICAgIGNvbnN0IGNoYXIgKmN1c3RvbV9tc2c7CisgICAgaW50IHBvczsgICAgICAgICAgICAvKiBudW1iZXIgb2YgcG9zaXRpb25hbC1vbmx5IGFyZ3VtZW50cyAqLworICAgIGludCBtaW47ICAgICAgICAgICAgLyogbWluaW1hbCBudW1iZXIgb2YgYXJndW1lbnRzICovCisgICAgaW50IG1heDsgICAgICAgICAgICAvKiBtYXhpbWFsIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyAqLworICAgIFB5T2JqZWN0ICprd3R1cGxlOyAgLyogdHVwbGUgb2Yga2V5d29yZCBwYXJhbWV0ZXIgbmFtZXMgKi8KKyAgICBzdHJ1Y3QgX1B5QXJnX1BhcnNlciAqbmV4dDsKK30gX1B5QXJnX1BhcnNlcjsKKyNpZmRlZiBQWV9TU0laRV9UX0NMRUFOCisjZGVmaW5lIF9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0ICBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdF9TaXplVAorI2RlZmluZSBfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0ICBfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0X1NpemVUCisjZW5kaWYKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICosIC4uLik7CitQeUFQSV9GVU5DKGludCkgX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9QeUFyZ19QYXJzZXIgKiwgdmFfbGlzdCk7Cit2b2lkIF9QeUFyZ19GaW5pKHZvaWQpOworI2VuZGlmCisKIFB5QVBJX0ZVTkMoaW50KSBQeU1vZHVsZV9BZGRPYmplY3QoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIGxvbmcpOwogUHlBUElfRlVOQyhpbnQpIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvb2JqZWN0LmggYi9JbmNsdWRlL29iamVjdC5oCmluZGV4IDUwZDk3NDcuLjViNGVmOTggMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9vYmplY3QuaApAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgUHlPYmplY3QgKm9iamVjdDsKIH0gX1B5X0lkZW50aWZpZXI7CiAKLSNkZWZpbmUgX1B5X3N0YXRpY19zdHJpbmdfaW5pdCh2YWx1ZSkgeyAwLCB2YWx1ZSwgMCB9CisjZGVmaW5lIF9QeV9zdGF0aWNfc3RyaW5nX2luaXQodmFsdWUpIHsgLm5leHQgPSBOVUxMLCAuc3RyaW5nID0gdmFsdWUsIC5vYmplY3QgPSBOVUxMIH0KICNkZWZpbmUgX1B5X3N0YXRpY19zdHJpbmcodmFybmFtZSwgdmFsdWUpICBzdGF0aWMgX1B5X0lkZW50aWZpZXIgdmFybmFtZSA9IF9QeV9zdGF0aWNfc3RyaW5nX2luaXQodmFsdWUpCiAjZGVmaW5lIF9QeV9JREVOVElGSUVSKHZhcm5hbWUpIF9QeV9zdGF0aWNfc3RyaW5nKFB5SWRfIyN2YXJuYW1lLCAjdmFybmFtZSkKIApAQCAtNzA4LDcgKzcwOCw2IEBACiBQeUFQSV9EQVRBKFB5X3NzaXplX3QpIF9QeV9SZWZUb3RhbDsKIFB5QVBJX0ZVTkModm9pZCkgX1B5X05lZ2F0aXZlUmVmY291bnQoY29uc3QgY2hhciAqZm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lbm8sIFB5T2JqZWN0ICpvcCk7Ci1QeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeURpY3RfRHVtbXkodm9pZCk7CiBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIF9QeV9HZXRSZWZUb3RhbCh2b2lkKTsKICNkZWZpbmUgX1B5X0lOQ19SRUZUT1RBTCAgICAgICAgX1B5X1JlZlRvdGFsKysKICNkZWZpbmUgX1B5X0RFQ19SRUZUT1RBTCAgICAgICAgX1B5X1JlZlRvdGFsLS0KQEAgLTc4NSw3ICs3ODQsNyBAQAogICAgICAgICAtLShfcHlfZGVjcmVmX3RtcCktPm9iX3JlZmNudCAhPSAwKSAgICAgICAgICAgICBcCiAgICAgICAgICAgICBfUHlfQ0hFQ0tfUkVGQ05UKF9weV9kZWNyZWZfdG1wKSAgICAgICAgICAgIFwKICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfUHlfRGVhbGxvYyhfcHlfZGVjcmVmX3RtcCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfUHlfRGVhbGxvYyhfcHlfZGVjcmVmX3RtcCk7ICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlICgwKQogCiAvKiBTYWZlbHkgZGVjcmVmIGBvcGAgYW5kIHNldCBgb3BgIHRvIE5VTEwsIGVzcGVjaWFsbHkgdXNlZnVsIGluIHRwX2NsZWFyCmRpZmYgLS1naXQgYS9JbmNsdWRlL29wY29kZS5oIGIvSW5jbHVkZS9vcGNvZGUuaAppbmRleCAzZjkxN2ZiLi4wOTAzODI0IDEwMDY0NAotLS0gYS9JbmNsdWRlL29wY29kZS5oCisrKyBiL0luY2x1ZGUvb3Bjb2RlLmgKQEAgLTYwLDYgKzYwLDcgQEAKICNkZWZpbmUgV0lUSF9DTEVBTlVQX0ZJTklTSCAgICAgIDgyCiAjZGVmaW5lIFJFVFVSTl9WQUxVRSAgICAgICAgICAgICA4MwogI2RlZmluZSBJTVBPUlRfU1RBUiAgICAgICAgICAgICAgODQKKyNkZWZpbmUgU0VUVVBfQU5OT1RBVElPTlMgICAgICAgIDg1CiAjZGVmaW5lIFlJRUxEX1ZBTFVFICAgICAgICAgICAgICA4NgogI2RlZmluZSBQT1BfQkxPQ0sgICAgICAgICAgICAgICAgODcKICNkZWZpbmUgRU5EX0ZJTkFMTFkgICAgICAgICAgICAgIDg4CkBAIC05OCwxOCArOTksMTcgQEAKICNkZWZpbmUgTE9BRF9GQVNUICAgICAgICAgICAgICAgMTI0CiAjZGVmaW5lIFNUT1JFX0ZBU1QgICAgICAgICAgICAgIDEyNQogI2RlZmluZSBERUxFVEVfRkFTVCAgICAgICAgICAgICAxMjYKKyNkZWZpbmUgU1RPUkVfQU5OT1RBVElPTiAgICAgICAgMTI3CiAjZGVmaW5lIFJBSVNFX1ZBUkFSR1MgICAgICAgICAgIDEzMAogI2RlZmluZSBDQUxMX0ZVTkNUSU9OICAgICAgICAgICAxMzEKICNkZWZpbmUgTUFLRV9GVU5DVElPTiAgICAgICAgICAgMTMyCiAjZGVmaW5lIEJVSUxEX1NMSUNFICAgICAgICAgICAgIDEzMwotI2RlZmluZSBNQUtFX0NMT1NVUkUgICAgICAgICAgICAxMzQKICNkZWZpbmUgTE9BRF9DTE9TVVJFICAgICAgICAgICAgMTM1CiAjZGVmaW5lIExPQURfREVSRUYgICAgICAgICAgICAgIDEzNgogI2RlZmluZSBTVE9SRV9ERVJFRiAgICAgICAgICAgICAxMzcKICNkZWZpbmUgREVMRVRFX0RFUkVGICAgICAgICAgICAgMTM4Ci0jZGVmaW5lIENBTExfRlVOQ1RJT05fVkFSICAgICAgIDE0MAogI2RlZmluZSBDQUxMX0ZVTkNUSU9OX0tXICAgICAgICAxNDEKLSNkZWZpbmUgQ0FMTF9GVU5DVElPTl9WQVJfS1cgICAgMTQyCisjZGVmaW5lIENBTExfRlVOQ1RJT05fRVggICAgICAgIDE0MgogI2RlZmluZSBTRVRVUF9XSVRIICAgICAgICAgICAgICAxNDMKICNkZWZpbmUgRVhURU5ERURfQVJHICAgICAgICAgICAgMTQ0CiAjZGVmaW5lIExJU1RfQVBQRU5EICAgICAgICAgICAgIDE0NQpAQCAtMTIyLDYgKzEyMiw5IEBACiAjZGVmaW5lIEJVSUxEX1RVUExFX1VOUEFDSyAgICAgIDE1MgogI2RlZmluZSBCVUlMRF9TRVRfVU5QQUNLICAgICAgICAxNTMKICNkZWZpbmUgU0VUVVBfQVNZTkNfV0lUSCAgICAgICAgMTU0CisjZGVmaW5lIEZPUk1BVF9WQUxVRSAgICAgICAgICAgIDE1NQorI2RlZmluZSBCVUlMRF9DT05TVF9LRVlfTUFQICAgICAxNTYKKyNkZWZpbmUgQlVJTERfU1RSSU5HICAgICAgICAgICAgMTU3CiAKIC8qIEVYQ0VQVF9IQU5ETEVSIGlzIGEgc3BlY2lhbCwgaW1wbGljaXQgYmxvY2sgdHlwZSB3aGljaCBpcyBjcmVhdGVkIHdoZW4KICAgIGVudGVyaW5nIGFuIGV4Y2VwdCBoYW5kbGVyLiBJdCBpcyBub3QgYW4gb3Bjb2RlIGJ1dCB3ZSBkZWZpbmUgaXQgaGVyZQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vc21vZHVsZS5oIGIvSW5jbHVkZS9vc21vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNDY3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9JbmNsdWRlL29zbW9kdWxlLmgKQEAgLTAsMCArMSwxNSBAQAorCisvKiBvcyBtb2R1bGUgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfT1NNT0RVTEVfSAorI2RlZmluZSBQeV9PU01PRFVMRV9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPU19GU1BhdGgoUHlPYmplY3QgKnBhdGgpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9PU01PRFVMRV9IICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3BhdGNobGV2ZWwuaCBiL0luY2x1ZGUvcGF0Y2hsZXZlbC5oCmluZGV4IDQ1ZTU3MzYuLmQyMjYzZDggMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcGF0Y2hsZXZlbC5oCisrKyBiL0luY2x1ZGUvcGF0Y2hsZXZlbC5oCkBAIC0xNywxMyArMTcsMTMgQEAKIC8qIFZlcnNpb24gcGFyc2VkIG91dCBpbnRvIG51bWVyaWMgdmFsdWVzICovCiAvKi0tc3RhcnQgY29uc3RhbnRzLS0qLwogI2RlZmluZSBQWV9NQUpPUl9WRVJTSU9OCTMKLSNkZWZpbmUgUFlfTUlOT1JfVkVSU0lPTgk1Ci0jZGVmaW5lIFBZX01JQ1JPX1ZFUlNJT04JMgotI2RlZmluZSBQWV9SRUxFQVNFX0xFVkVMCVBZX1JFTEVBU0VfTEVWRUxfRklOQUwKLSNkZWZpbmUgUFlfUkVMRUFTRV9TRVJJQUwJMAorI2RlZmluZSBQWV9NSU5PUl9WRVJTSU9OCTYKKyNkZWZpbmUgUFlfTUlDUk9fVkVSU0lPTgkwCisjZGVmaW5lIFBZX1JFTEVBU0VfTEVWRUwJUFlfUkVMRUFTRV9MRVZFTF9BTFBIQQorI2RlZmluZSBQWV9SRUxFQVNFX1NFUklBTAk0CiAKIC8qIFZlcnNpb24gYXMgYSBzdHJpbmcgKi8KLSNkZWZpbmUgUFlfVkVSU0lPTiAgICAgIAkiMy41LjIrIgorI2RlZmluZSBQWV9WRVJTSU9OICAgICAgCSIzLjYuMGE0KyIKIC8qLS1lbmQgY29uc3RhbnRzLS0qLwogCiAvKiBWZXJzaW9uIGFzIGEgc2luZ2xlIDQtYnl0ZSBoZXggbnVtYmVyLCBlLmcuIDB4MDEwNTAyQjIgPT0gMS41LjJiMi4KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHlfY3Vyc2VzLmggYi9JbmNsdWRlL3B5X2N1cnNlcy5oCmluZGV4IGYyYzA4ZjYuLjNjMjE2OTcgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlfY3Vyc2VzLmgKKysrIGIvSW5jbHVkZS9weV9jdXJzZXMuaApAQCAtMTAzLDggKzEwMyw4IEBACiAjZW5kaWYKIAogLyogZ2VuZXJhbCBlcnJvciBtZXNzYWdlcyAqLwotc3RhdGljIGNoYXIgKmNhdGNoYWxsX0VSUiAgPSAiY3Vyc2VzIGZ1bmN0aW9uIHJldHVybmVkIEVSUiI7Ci1zdGF0aWMgY2hhciAqY2F0Y2hhbGxfTlVMTCA9ICJjdXJzZXMgZnVuY3Rpb24gcmV0dXJuZWQgTlVMTCI7CitzdGF0aWMgY29uc3QgY2hhciBjYXRjaGFsbF9FUlJbXSAgPSAiY3Vyc2VzIGZ1bmN0aW9uIHJldHVybmVkIEVSUiI7CitzdGF0aWMgY29uc3QgY2hhciBjYXRjaGFsbF9OVUxMW10gPSAiY3Vyc2VzIGZ1bmN0aW9uIHJldHVybmVkIE5VTEwiOwogCiAvKiBGdW5jdGlvbiBQcm90b3R5cGUgTWFjcm9zIC0gVGhleSBhcmUgdWdseSBidXQgdmVyeSwgdmVyeSB1c2VmdWwuIDstKQogCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5YXRvbWljLmggYi9JbmNsdWRlL3B5YXRvbWljLmgKaW5kZXggODkwMjhlZi4uODkzZDMwZCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weWF0b21pYy5oCisrKyBiL0luY2x1ZGUvcHlhdG9taWMuaApAQCAtNjEsNyArNjEsNyBAQAogfSBfUHlfbWVtb3J5X29yZGVyOwogCiB0eXBlZGVmIHN0cnVjdCBfUHlfYXRvbWljX2FkZHJlc3MgewotICAgIFB5X3VpbnRwdHJfdCBfdmFsdWU7CisgICAgdWludHB0cl90IF92YWx1ZTsKIH0gX1B5X2F0b21pY19hZGRyZXNzOwogCiB0eXBlZGVmIHN0cnVjdCBfUHlfYXRvbWljX2ludCB7CkBAIC05OCw3ICs5OCw3IEBACiB9IF9QeV9tZW1vcnlfb3JkZXI7CiAKIHR5cGVkZWYgc3RydWN0IF9QeV9hdG9taWNfYWRkcmVzcyB7Ci0gICAgUHlfdWludHB0cl90IF92YWx1ZTsKKyAgICB1aW50cHRyX3QgX3ZhbHVlOwogfSBfUHlfYXRvbWljX2FkZHJlc3M7CiAKIHR5cGVkZWYgc3RydWN0IF9QeV9hdG9taWNfaW50IHsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHlkZWJ1Zy5oIGIvSW5jbHVkZS9weWRlYnVnLmgKaW5kZXggMTliZWMyYi4uNmUyM2E4OSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weWRlYnVnLmgKKysrIGIvSW5jbHVkZS9weWRlYnVnLmgKQEAgLTI0LDYgKzI0LDEwIEBACiBQeUFQSV9EQVRBKGludCkgUHlfSGFzaFJhbmRvbWl6YXRpb25GbGFnOwogUHlBUElfREFUQShpbnQpIFB5X0lzb2xhdGVkRmxhZzsKIAorI2lmZGVmIE1TX1dJTkRPV1MKK1B5QVBJX0RBVEEoaW50KSBQeV9MZWdhY3lXaW5kb3dzU3RkaW9GbGFnOworI2VuZGlmCisKIC8qIHRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBnZXRlbnYoKSB0aGF0IHBheXMgYXR0ZW50aW9uIHRvCiAgICBQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWcuICBJdCBzaG91bGQgYmUgdXNlZCBmb3IgZ2V0dGluZyB2YXJpYWJsZXMgbGlrZQogICAgUFlUSE9OUEFUSCBhbmQgUFlUSE9OSE9NRSBmcm9tIHRoZSBlbnZpcm9ubWVudCAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weWVycm9ycy5oIGIvSW5jbHVkZS9weWVycm9ycy5oCmluZGV4IDM1YWVkYjcuLjAzY2VlM2QgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHllcnJvcnMuaAorKysgYi9JbmNsdWRlL3B5ZXJyb3JzLmgKQEAgLTE2MCw2ICsxNjAsNyBAQAogUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19GbG9hdGluZ1BvaW50RXJyb3I7CiBQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX09TRXJyb3I7CiBQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0ltcG9ydEVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19Nb2R1bGVOb3RGb3VuZEVycm9yOwogUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19JbmRleEVycm9yOwogUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19LZXlFcnJvcjsKIFB5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQ7CkBAIC0yODMsNiArMjg0LDkgQEAKIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRFeGNXaXRoQXJnc0t3YXJncyhQeU9iamVjdCAqLCBQeU9iamVjdCAqLAogICAgIFB5T2JqZWN0ICopOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEltcG9ydEVycm9yU3ViY2xhc3MoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKKyAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0SW1wb3J0RXJyb3IoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKICAgICBQeU9iamVjdCAqKTsKIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weWhhc2guaCBiL0luY2x1ZGUvcHloYXNoLmgKaW5kZXggYTdjYTkzNy4uYTgxNGFmNiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weWhhc2guaAorKysgYi9JbmNsdWRlL3B5aGFzaC5oCkBAIC0zNiwxNCArMzYsMTQgQEAKICAqIG1lbW9yeSBsYXlvdXQgb24gNjQgYml0IHN5c3RlbXMKICAqICAgY2NjY2NjY2MgY2NjY2NjY2MgY2NjY2NjY2MgIHVjIC0tIHVuc2lnbmVkIGNoYXJbMjRdCiAgKiAgIHBwcHBwcHBwIHNzc3Nzc3NzIC4uLi4uLi4uICBmbnYgLS0gdHdvIFB5X2hhc2hfdAotICogICBrMGswazBrMCBrMWsxazFrMSAuLi4uLi4uLiAgc2lwaGFzaCAtLSB0d28gUFlfVUlOVDY0X1QKKyAqICAgazBrMGswazAgazFrMWsxazEgLi4uLi4uLi4gIHNpcGhhc2ggLS0gdHdvIHVpbnQ2NF90CiAgKiAgIC4uLi4uLi4uIC4uLi4uLi4uIHNzc3Nzc3NzICBkamJ4MzNhIC0tIDE2IGJ5dGVzIHBhZGRpbmcgKyBvbmUgUHlfaGFzaF90CiAgKiAgIC4uLi4uLi4uIC4uLi4uLi4uIGVlZWVlZWVlICBweWV4cGF0IFhNTCBoYXNoIHNhbHQKICAqCiAgKiBtZW1vcnkgbGF5b3V0IG9uIDMyIGJpdCBzeXN0ZW1zCiAgKiAgIGNjY2NjY2NjIGNjY2NjY2NjIGNjY2NjY2NjICB1YwogICogICBwcHBwc3NzcyAuLi4uLi4uLiAuLi4uLi4uLiAgZm52IC0tIHR3byBQeV9oYXNoX3QKLSAqICAgazBrMGswazAgazFrMWsxazEgLi4uLi4uLi4gIHNpcGhhc2ggLS0gdHdvIFBZX1VJTlQ2NF9UICgqKQorICogICBrMGswazBrMCBrMWsxazFrMSAuLi4uLi4uLiAgc2lwaGFzaCAtLSB0d28gdWludDY0X3QgKCopCiAgKiAgIC4uLi4uLi4uIC4uLi4uLi4uIHNzc3MuLi4uICBkamJ4MzNhIC0tIDE2IGJ5dGVzIHBhZGRpbmcgKyBvbmUgUHlfaGFzaF90CiAgKiAgIC4uLi4uLi4uIC4uLi4uLi4uIGVlZWUuLi4uICBweWV4cGF0IFhNTCBoYXNoIHNhbHQKICAqCkBAIC01OSwxMyArNTksMTEgQEAKICAgICAgICAgUHlfaGFzaF90IHByZWZpeDsKICAgICAgICAgUHlfaGFzaF90IHN1ZmZpeDsKICAgICB9IGZudjsKLSNpZmRlZiBQWV9VSU5UNjRfVAogICAgIC8qIHR3byB1aW50NjQgZm9yIFNpcEhhc2gyNCAqLwogICAgIHN0cnVjdCB7Ci0gICAgICAgIFBZX1VJTlQ2NF9UIGswOwotICAgICAgICBQWV9VSU5UNjRfVCBrMTsKKyAgICAgICAgdWludDY0X3QgazA7CisgICAgICAgIHVpbnQ2NF90IGsxOwogICAgIH0gc2lwaGFzaDsKLSNlbmRpZgogICAgIC8qIGEgZGlmZmVyZW50ICghKSBQeV9oYXNoX3QgZm9yIHNtYWxsIHN0cmluZyBvcHRpbWl6YXRpb24gKi8KICAgICBzdHJ1Y3QgewogICAgICAgICB1bnNpZ25lZCBjaGFyIHBhZGRpbmdbMTZdOwpAQCAtMTIxLDggKzExOSw3IEBACiAgKiBjb25maWd1cmUgc2NyaXB0LgogICoKICAqIC0gRk5WIGlzIGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zIGFuZCBhcmNoaXRlY3R1cmVzLgotICogLSBTSVBIQVNIMjQgb25seSB3b3JrcyBvbiBwbGFmb3JtcyB0aGF0IHByb3ZpZGUgUFlfVUlOVDY0X1QgYW5kIGRvZXNuJ3QKLSAqICAgcmVxdWlyZSBhbGlnbmVkIG1lbW9yeSBmb3IgaW50ZWdlcnMuCisgKiAtIFNJUEhBU0gyNCBvbmx5IHdvcmtzIG9uIHBsYWZvcm1zIHRoYXQgZG9uJ3QgcmVxdWlyZSBhbGlnbmVkIG1lbW9yeSBmb3IgaW50ZWdlcnMuCiAgKiAtIFdpdGggRVhURVJOQUwgZW1iZWRkZXJzIGNhbiBwcm92aWRlIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIHdpdGg6OgogICoKICAqICAgICBQeUhhc2hfRnVuY0RlZiBQeUhhc2hfRnVuYyA9IHsuLi59OwpAQCAtMTM0LDggKzEzMSw3IEBACiAjZGVmaW5lIFB5X0hBU0hfRk5WIDIKIAogI2lmbmRlZiBQeV9IQVNIX0FMR09SSVRITQotIyAgaWYgKGRlZmluZWQoUFlfVUlOVDY0X1QpICYmIGRlZmluZWQoUFlfVUlOVDMyX1QpIFwKLSAgICAgICAmJiAhZGVmaW5lZChIQVZFX0FMSUdORURfUkVRVUlSRUQpKQorIyAgaWZuZGVmIEhBVkVfQUxJR05FRF9SRVFVSVJFRAogIyAgICBkZWZpbmUgUHlfSEFTSF9BTEdPUklUSE0gUHlfSEFTSF9TSVBIQVNIMjQKICMgIGVsc2UKICMgICAgZGVmaW5lIFB5X0hBU0hfQUxHT1JJVEhNIFB5X0hBU0hfRk5WCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5bGlmZWN5Y2xlLmggYi9JbmNsdWRlL3B5bGlmZWN5Y2xlLmgKaW5kZXggY2NkZWJlMi4uODM5MDQ2NyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weWxpZmVjeWNsZS5oCisrKyBiL0luY2x1ZGUvcHlsaWZlY3ljbGUuaApAQCAtMjcsNiArMjcsNyBAQAogUHlBUElfRlVOQyh2b2lkKSBfUHlfSW5pdGlhbGl6ZUV4X1ByaXZhdGUoaW50LCBpbnQpOwogI2VuZGlmCiBQeUFQSV9GVU5DKHZvaWQpIFB5X0ZpbmFsaXplKHZvaWQpOworUHlBUElfRlVOQyhpbnQpIFB5X0ZpbmFsaXplRXgodm9pZCk7CiBQeUFQSV9GVU5DKGludCkgUHlfSXNJbml0aWFsaXplZCh2b2lkKTsKIFB5QVBJX0ZVTkMoUHlUaHJlYWRTdGF0ZSAqKSBQeV9OZXdJbnRlcnByZXRlcih2b2lkKTsKIFB5QVBJX0ZVTkModm9pZCkgUHlfRW5kSW50ZXJwcmV0ZXIoUHlUaHJlYWRTdGF0ZSAqKTsKQEAgLTEwNiw2ICsxMDcsNyBAQAogUHlBUElfRlVOQyh2b2lkKSBQeVNsaWNlX0Zpbmkodm9pZCk7CiBQeUFQSV9GVU5DKHZvaWQpIF9QeVR5cGVfRmluaSh2b2lkKTsKIFB5QVBJX0ZVTkModm9pZCkgX1B5UmFuZG9tX0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5QXN5bmNHZW5fRmluaSh2b2lkKTsKIAogUHlBUElfREFUQShQeVRocmVhZFN0YXRlICopIF9QeV9GaW5hbGl6aW5nOwogI2VuZGlmCkBAIC0xMTYsNyArMTE4LDggQEAKIFB5QVBJX0ZVTkMoUHlPU19zaWdoYW5kbGVyX3QpIFB5T1Nfc2V0c2lnKGludCwgUHlPU19zaWdoYW5kbGVyX3QpOwogCiAvKiBSYW5kb20gKi8KLVB5QVBJX0ZVTkMoaW50KSBfUHlPU19VUmFuZG9tICh2b2lkICpidWZmZXIsIFB5X3NzaXplX3Qgc2l6ZSk7CitQeUFQSV9GVU5DKGludCkgX1B5T1NfVVJhbmRvbSh2b2lkICpidWZmZXIsIFB5X3NzaXplX3Qgc2l6ZSk7CitQeUFQSV9GVU5DKGludCkgX1B5T1NfVVJhbmRvbU5vbmJsb2NrKHZvaWQgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5bWFjcm8uaCBiL0luY2x1ZGUvcHltYWNyby5oCmluZGV4IDNmNmY1ZGMuLjJhODM5YWIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHltYWNyby5oCisrKyBiL0luY2x1ZGUvcHltYWNyby5oCkBAIC0xOCw2ICsxOCw5IEBACiAgICBieSAiX19MSU5FX18iLiAqLwogI2RlZmluZSBQeV9TVFJJTkdJRlkoeCkgX1B5X1hTVFJJTkdJRlkoeCkKIAorLyogR2V0IHRoZSBzaXplIG9mIGEgc3RydWN0dXJlIG1lbWJlciBpbiBieXRlcyAqLworI2RlZmluZSBQeV9NRU1CRVJfU0laRSh0eXBlLCBtZW1iZXIpIHNpemVvZigoKHR5cGUgKikwKS0+bWVtYmVyKQorCiAvKiBBcmd1bWVudCBtdXN0IGJlIGEgY2hhciBvciBhbiBpbnQgaW4gWy0xMjgsIDEyN10gb3IgWzAsIDI1NV0uICovCiAjZGVmaW5lIFB5X0NIQVJNQVNLKGMpICgodW5zaWduZWQgY2hhcikoKGMpICYgMHhmZikpCiAKQEAgLTM2LDYgKzM5LDEwIEBACiAjZGVmaW5lIFB5X0JVSUxEX0FTU0VSVF9FWFBSKGNvbmQpIFwKICAgICAoc2l6ZW9mKGNoYXIgWzEgLSAyKiEoY29uZCldKSAtIDEpCiAKKyNkZWZpbmUgUHlfQlVJTERfQVNTRVJUKGNvbmQpICBkbyB7ICAgICAgICAgXAorICAgICAgICAodm9pZClQeV9CVUlMRF9BU1NFUlRfRVhQUihjb25kKTsgICBcCisgICAgfSB3aGlsZSgwKQorCiAvKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHZpc2libGUgYXJyYXkKIAogICAgVGhpcyBkb2VzIG5vdCB3b3JrIG9uIHBvaW50ZXJzLCBvciBhcnJheXMgZGVjbGFyZWQgYXMgW10sIG9yIGZ1bmN0aW9uCkBAIC03NSwxMiArODIsMTIgQEAKICNkZWZpbmUgX1B5X1NJWkVfUk9VTkRfVVAobiwgYSkgKCgoc2l6ZV90KShuKSArIFwKICAgICAgICAgKHNpemVfdCkoKGEpIC0gMSkpICYgfihzaXplX3QpKChhKSAtIDEpKQogLyogUm91bmQgcG9pbnRlciAicCIgZG93biB0byB0aGUgY2xvc2VzdCAiYSItYWxpZ25lZCBhZGRyZXNzIDw9ICJwIi4gKi8KLSNkZWZpbmUgX1B5X0FMSUdOX0RPV04ocCwgYSkgKCh2b2lkICopKChQeV91aW50cHRyX3QpKHApICYgfihQeV91aW50cHRyX3QpKChhKSAtIDEpKSkKKyNkZWZpbmUgX1B5X0FMSUdOX0RPV04ocCwgYSkgKCh2b2lkICopKCh1aW50cHRyX3QpKHApICYgfih1aW50cHRyX3QpKChhKSAtIDEpKSkKIC8qIFJvdW5kIHBvaW50ZXIgInAiIHVwIHRvIHRoZSBjbG9zZXN0ICJhIi1hbGlnbmVkIGFkZHJlc3MgPj0gInAiLiAqLwotI2RlZmluZSBfUHlfQUxJR05fVVAocCwgYSkgKCh2b2lkICopKCgoUHlfdWludHB0cl90KShwKSArIFwKLSAgICAgICAgKFB5X3VpbnRwdHJfdCkoKGEpIC0gMSkpICYgfihQeV91aW50cHRyX3QpKChhKSAtIDEpKSkKKyNkZWZpbmUgX1B5X0FMSUdOX1VQKHAsIGEpICgodm9pZCAqKSgoKHVpbnRwdHJfdCkocCkgKyBcCisgICAgICAgICh1aW50cHRyX3QpKChhKSAtIDEpKSAmIH4odWludHB0cl90KSgoYSkgLSAxKSkpCiAvKiBDaGVjayBpZiBwb2ludGVyICJwIiBpcyBhbGlnbmVkIHRvICJhIi1ieXRlcyBib3VuZGFyeS4gKi8KLSNkZWZpbmUgX1B5X0lTX0FMSUdORUQocCwgYSkgKCEoKFB5X3VpbnRwdHJfdCkocCkgJiAoUHlfdWludHB0cl90KSgoYSkgLSAxKSkpCisjZGVmaW5lIF9QeV9JU19BTElHTkVEKHAsIGEpICghKCh1aW50cHRyX3QpKHApICYgKHVpbnRwdHJfdCkoKGEpIC0gMSkpKQogCiAjaWZkZWYgX19HTlVDX18KICNkZWZpbmUgUHlfVU5VU0VEKG5hbWUpIF91bnVzZWRfICMjIG5hbWUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHltYXRoLmggYi9JbmNsdWRlL3B5bWF0aC5oCmluZGV4IDFjOGQ3MTguLjcyMTZhMDkgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHltYXRoLmgKKysrIGIvSW5jbHVkZS9weW1hdGguaApAQCAtNTUsNiArNTUsMTIgQEAKICNkZWZpbmUgUHlfTUFUSF9FIDIuNzE4MjgxODI4NDU5MDQ1MjM1NAogI2VuZGlmCiAKKy8qIFRhdSAoMnBpKSB0byA0MCBkaWdpdHMsIHRha2VuIGZyb20gdGF1ZGF5LmNvbS90YXUtZGlnaXRzLiAqLworI2lmbmRlZiBQeV9NQVRIX1RBVQorI2RlZmluZSBQeV9NQVRIX1RBVSA2LjI4MzE4NTMwNzE3OTU4NjQ3NjkyNTI4Njc2NjU1OTAwNTc2ODM5NDNMCisjZW5kaWYKKworCiAvKiBPbiB4ODYsIFB5X0ZPUkNFX0RPVUJMRSBmb3JjZXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgb3V0IG9mIGFuIHg4NyBGUFUKICAgIHJlZ2lzdGVyIGFuZCBpbnRvIGEgNjQtYml0IG1lbW9yeSBsb2NhdGlvbiwgcm91bmRpbmcgZnJvbSBleHRlbmRlZAogICAgcHJlY2lzaW9uIHRvIGRvdWJsZSBwcmVjaXNpb24gaW4gdGhlIHByb2Nlc3MuICBPbiBvdGhlciBwbGF0Zm9ybXMgaXQgZG9lcwpAQCAtMTY5LDcgKzE3NSw3IEBACiAgICAgICAgICNwcmFnbWEgZmxvYXRfY29udHJvbCAocG9wKQogICAgICAgICAjZGVmaW5lIFB5X05BTiBfX2ljY19uYW4oKQogICAgICNlbHNlIC8qIElDQ19OQU5fUkVMQVhFRCBhcyBkZWZhdWx0IGZvciBJbnRlbCBDb21waWxlciAqLwotICAgICAgICBzdGF0aWMgdW5pb24geyB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsgZG91YmxlIF9faWNjX25hbjsgfSBfX25hbl9zdG9yZSA9IHswLDAsMCwwLDAsMCwweGY4LDB4N2Z9OworICAgICAgICBzdGF0aWMgY29uc3QgdW5pb24geyB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsgZG91YmxlIF9faWNjX25hbjsgfSBfX25hbl9zdG9yZSA9IHswLDAsMCwwLDAsMCwweGY4LDB4N2Z9OwogICAgICAgICAjZGVmaW5lIFB5X05BTiAoX19uYW5fc3RvcmUuX19pY2NfbmFuKQogICAgICNlbmRpZiAvKiBJQ0NfTkFOX1NUUklDVCAqLwogI2VuZGlmIC8qIF9fSU5URUxfQ09NUElMRVIgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHltZW0uaCBiL0luY2x1ZGUvcHltZW0uaAppbmRleCAwNDNkYjY0Li5jZTYzYmY4IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5bWVtLmgKKysrIGIvSW5jbHVkZS9weW1lbS5oCkBAIC0xNiw4ICsxNiw1MSBAQAogUHlBUElfRlVOQyh2b2lkICopIFB5TWVtX1Jhd0NhbGxvYyhzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpOwogUHlBUElfRlVOQyh2b2lkICopIFB5TWVtX1Jhd1JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3QgbmV3X3NpemUpOwogUHlBUElfRlVOQyh2b2lkKSBQeU1lbV9SYXdGcmVlKHZvaWQgKnB0cik7CisKKy8qIENvbmZpZ3VyZSB0aGUgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzLiBQYXNzIE5VTEwgdG8gdXNlIGRlZmF1bHQKKyAgIGFsbG9jYXRvcnMuICovCitQeUFQSV9GVU5DKGludCkgX1B5TWVtX1NldHVwQWxsb2NhdG9ycyhjb25zdCBjaGFyICpvcHQpOworCisjaWZkZWYgV0lUSF9QWU1BTExPQworUHlBUElfRlVOQyhpbnQpIF9QeU1lbV9QeW1hbGxvY0VuYWJsZWQodm9pZCk7CiAjZW5kaWYKIAorLyogSWRlbnRpZmllciBvZiBhbiBhZGRyZXNzIHNwYWNlIChkb21haW4pIGluIHRyYWNlbWFsbG9jICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBfUHlUcmFjZU1hbGxvY19kb21haW5fdDsKKworLyogVHJhY2sgYW4gYWxsb2NhdGVkIG1lbW9yeSBibG9jayBpbiB0aGUgdHJhY2VtYWxsb2MgbW9kdWxlLgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgcmV0dXJuIC0xIG9uIGVycm9yIChmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHN0b3JlCisgICB0aGUgdHJhY2UpLgorCisgICBSZXR1cm4gLTIgaWYgdHJhY2VtYWxsb2MgaXMgZGlzYWJsZWQuCisKKyAgIElmIG1lbW9yeSBibG9jayBpcyBhbHJlYWR5IHRyYWNrZWQsIHVwZGF0ZSB0aGUgZXhpc3RpbmcgdHJhY2UuICovCitQeUFQSV9GVU5DKGludCkgX1B5VHJhY2VNYWxsb2NfVHJhY2soCisgICAgX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLAorICAgIHVpbnRwdHJfdCBwdHIsCisgICAgc2l6ZV90IHNpemUpOworCisvKiBVbnRyYWNrIGFuIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgaW4gdGhlIHRyYWNlbWFsbG9jIG1vZHVsZS4KKyAgIERvIG5vdGhpbmcgaWYgdGhlIGJsb2NrIHdhcyBub3QgdHJhY2tlZC4KKworICAgUmV0dXJuIC0yIGlmIHRyYWNlbWFsbG9jIGlzIGRpc2FibGVkLCBvdGhlcndpc2UgcmV0dXJuIDAuICovCitQeUFQSV9GVU5DKGludCkgX1B5VHJhY2VNYWxsb2NfVW50cmFjaygKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sCisgICAgdWludHB0cl90IHB0cik7CisKKy8qIEdldCB0aGUgdHJhY2ViYWNrIHdoZXJlIGEgbWVtb3J5IGJsb2NrIHdhcyBhbGxvY2F0ZWQuCisKKyAgIFJldHVybiBhIHR1cGxlIG9mIChmaWxlbmFtZTogc3RyLCBsaW5lbm86IGludCkgdHVwbGVzLgorCisgICBSZXR1cm4gTm9uZSBpZiB0aGUgdHJhY2VtYWxsb2MgbW9kdWxlIGlzIGRpc2FibGVkIG9yIGlmIHRoZSBtZW1vcnkgYmxvY2sKKyAgIGlzIG5vdCB0cmFja2VkIGJ5IHRyYWNlbWFsbG9jLgorCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeVRyYWNlTWFsbG9jX0dldFRyYWNlYmFjaygKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sCisgICAgdWludHB0cl90IHB0cik7CisjZW5kaWYgICAvKiAhUHlfTElNSVRFRF9BUEkgKi8KKwogCiAvKiBCRVdBUkU6CiAKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHlwb3J0LmggYi9JbmNsdWRlL3B5cG9ydC5oCmluZGV4IGJhNDkyMjEuLmI2MzFjZjMgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlwb3J0LmgKKysrIGIvSW5jbHVkZS9weXBvcnQuaApAQCAtMywxNSArMyw3IEBACiAKICNpbmNsdWRlICJweWNvbmZpZy5oIiAvKiBpbmNsdWRlIGZvciBkZWZpbmVzICovCiAKLS8qIFNvbWUgdmVyc2lvbnMgb2YgSFAtVVggJiBTb2xhcmlzIG5lZWQgaW50dHlwZXMuaCBmb3IgaW50MzJfdCwKLSAgIElOVDMyX01BWCwgZXRjLiAqLwotI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAogI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RESU5UX0gKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFN5bWJvbHMgYW5kIG1hY3JvcyB0byBzdXBwbHkgcGxhdGZvcm0taW5kZXBlbmRlbnQgaW50ZXJmYWNlcyB0byBiYXNpYwpAQCAtMzEsMTQgKzIzLDYgQEAKIE1lYW5pbmc6ICBFeHRyYSBjaGVja3MgY29tcGlsZWQgaW4gZm9yIGRlYnVnIG1vZGUuCiBVc2VkIGluOiAgUHlfU0FGRV9ET1dOQ0FTVAogCi1IQVZFX1VJTlRQVFJfVAotTWVhbmluZzogIFRoZSBDOVggdHlwZSB1aW50cHRyX3QgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjb21waWxlcgotVXNlZCBpbjogIFB5X3VpbnRwdHJfdAotCi1IQVZFX0xPTkdfTE9ORwotTWVhbmluZzogIFRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgQyB0eXBlICJsb25nIGxvbmciCi1Vc2VkIGluOiAgUFlfTE9OR19MT05HCi0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiB0eXBlZGVmcyBmb3Igc29tZSBDOVgtZGVmaW5lZCBzeW5vbnltcyBmb3IgaW50ZWdyYWwgdHlwZXMuCkBAIC01Myw5MSArMzcsMjcgQEAKICAqIGludGVncmFsIHN5bm9ueW1zLiAgT25seSBkZWZpbmUgdGhlIG9uZXMgd2UgYWN0dWFsbHkgbmVlZC4KICAqLwogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKICNpZm5kZWYgUFlfTE9OR19MT05HCiAjZGVmaW5lIFBZX0xPTkdfTE9ORyBsb25nIGxvbmcKLSNpZiBkZWZpbmVkKExMT05HX01BWCkKIC8qIElmIExMT05HX01BWCBpcyBkZWZpbmVkIGluIGxpbWl0cy5oLCB1c2UgdGhhdC4gKi8KICNkZWZpbmUgUFlfTExPTkdfTUlOIExMT05HX01JTgogI2RlZmluZSBQWV9MTE9OR19NQVggTExPTkdfTUFYCiAjZGVmaW5lIFBZX1VMTE9OR19NQVggVUxMT05HX01BWAotI2VsaWYgZGVmaW5lZChfX0xPTkdfTE9OR19NQVhfXykKLS8qIE90aGVyd2lzZSwgaWYgR0NDIGhhcyBhIGJ1aWx0aW4gZGVmaW5lLCB1c2UgdGhhdC4gIChEZWZpbml0aW9uIG9mCi0gKiBQWV9MTE9OR19NSU4gYXNzdW1lcyB0d28ncyBjb21wbGVtZW50IHdpdGggbm8gdHJhcCByZXByZXNlbnRhdGlvbi4pICovCi0jZGVmaW5lIFBZX0xMT05HX01BWCBfX0xPTkdfTE9OR19NQVhfXwotI2RlZmluZSBQWV9MTE9OR19NSU4gKC1QWV9MTE9OR19NQVggLSAxKQotI2RlZmluZSBQWV9VTExPTkdfTUFYIChQWV9MTE9OR19NQVggKiBQeV9VTEwoMikgKyAxKQotI2VsaWYgZGVmaW5lZChTSVpFT0ZfTE9OR19MT05HKQotLyogT3RoZXJ3aXNlIGNvbXB1dGUgZnJvbSBTSVpFT0ZfTE9OR19MT05HLCBhc3N1bWluZyB0d28ncyBjb21wbGVtZW50LCBubwotICAgcGFkZGluZyBiaXRzLCBhbmQgbm8gdHJhcCByZXByZXNlbnRhdGlvbi4gIE5vdGU6IFBZX1VMTE9OR19NQVggd2FzCi0gICBwcmV2aW91c2x5ICNkZWZpbmVkIGFzICh+MFVMTCkgaGVyZTsgYnV0IHRoYXQnbGwgZ2l2ZSB0aGUgd3JvbmcgdmFsdWUgaW4gYQotICAgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb24gb24gc3lzdGVtcyB3aGVyZSBsb25nIGxvbmcgIT0gaW50bWF4X3QuICovCi0jZGVmaW5lIFBZX0xMT05HX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKDEgKyAyICogKChQeV9MTCgxKSA8PCAoQ0hBUl9CSVQgKiBTSVpFT0ZfTE9OR19MT05HIC0gMikpIC0gMSkpCi0jZGVmaW5lIFBZX0xMT05HX01JTiAoLVBZX0xMT05HX01BWCAtIDEpCi0jZGVmaW5lIFBZX1VMTE9OR19NQVggKFBZX0xMT05HX01BWCAqIFB5X1VMTCgyKSArIDEpCi0jZW5kaWYgLyogTExPTkdfTUFYICovCi0jZW5kaWYKLSNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLwotCi0vKiBhIGJ1aWxkIHdpdGggMzAtYml0IGRpZ2l0cyBmb3IgUHl0aG9uIGludGVnZXJzIG5lZWRzIGFuIGV4YWN0LXdpZHRoCi0gKiAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlIHRvIHN0b3JlIHRob3NlIGRpZ2l0cy4gIChXZSBjb3VsZCBqdXN0IHVzZQotICogdHlwZSAndW5zaWduZWQgbG9uZycsIGJ1dCB0aGF0IHdvdWxkIGJlIHdhc3RlZnVsIG9uIGEgc3lzdGVtIHdoZXJlIGxvbmdzCi0gKiBhcmUgNjQtYml0cy4pICBPbiBVbml4IHN5c3RlbXMsIHRoZSBhdXRvY29uZiBtYWNybyBBQ19UWVBFX1VJTlQzMl9UIGRlZmluZXMKLSAqIHVpbnQzMl90IHRvIGJlIHN1Y2ggYSB0eXBlIHVubGVzcyBzdGRpbnQuaCBvciBpbnR0eXBlcy5oIGRlZmluZXMgdWludDMyX3QuCi0gKiBIb3dldmVyLCBpdCBkb2Vzbid0IHNldCBIQVZFX1VJTlQzMl9ULCBzbyB3ZSBkbyB0aGF0IGhlcmUuCi0gKi8KLSNpZmRlZiB1aW50MzJfdAotI2RlZmluZSBIQVZFX1VJTlQzMl9UIDEKICNlbmRpZgogCi0jaWZkZWYgSEFWRV9VSU5UMzJfVAotI2lmbmRlZiBQWV9VSU5UMzJfVAogI2RlZmluZSBQWV9VSU5UMzJfVCB1aW50MzJfdAotI2VuZGlmCi0jZW5kaWYKLQotLyogTWFjcm9zIGZvciBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGU7IHVzZWQgZm9yIHR5cGUgJ3R3b2RpZ2l0cycgaW4gdGhlCi0gKiBpbnRlZ2VyIGltcGxlbWVudGF0aW9uLCB3aGVuIDMwLWJpdCBkaWdpdHMgYXJlIGVuYWJsZWQuCi0gKi8KLSNpZmRlZiB1aW50NjRfdAotI2RlZmluZSBIQVZFX1VJTlQ2NF9UIDEKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VSU5UNjRfVAotI2lmbmRlZiBQWV9VSU5UNjRfVAogI2RlZmluZSBQWV9VSU5UNjRfVCB1aW50NjRfdAotI2VuZGlmCi0jZW5kaWYKIAogLyogU2lnbmVkIHZhcmlhbnRzIG9mIHRoZSBhYm92ZSAqLwotI2lmZGVmIGludDMyX3QKLSNkZWZpbmUgSEFWRV9JTlQzMl9UIDEKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9JTlQzMl9UCi0jaWZuZGVmIFBZX0lOVDMyX1QKICNkZWZpbmUgUFlfSU5UMzJfVCBpbnQzMl90Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgaW50NjRfdAotI2RlZmluZSBIQVZFX0lOVDY0X1QgMQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0lOVDY0X1QKLSNpZm5kZWYgUFlfSU5UNjRfVAogI2RlZmluZSBQWV9JTlQ2NF9UIGludDY0X3QKLSNlbmRpZgotI2VuZGlmCiAKIC8qIElmIFBZTE9OR19CSVRTX0lOX0RJR0lUIGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UnbGwgdXNlIDMwLWJpdCBkaWdpdHMgaWYgYWxsCiAgICB0aGUgbmVjZXNzYXJ5IGludGVnZXIgdHlwZXMgYXJlIGF2YWlsYWJsZSwgYW5kIHdlJ3JlIG9uIGEgNjQtYml0IHBsYXRmb3JtCiAgICAoYXMgZGV0ZXJtaW5lZCBieSBTSVpFT0ZfVk9JRF9QKTsgb3RoZXJ3aXNlIHdlIHVzZSAxNS1iaXQgZGlnaXRzLiAqLwogCiAjaWZuZGVmIFBZTE9OR19CSVRTX0lOX0RJR0lUCi0jaWYgKGRlZmluZWQgSEFWRV9VSU5UNjRfVCAmJiBkZWZpbmVkIEhBVkVfSU5UNjRfVCAmJiBcCi0gICAgIGRlZmluZWQgSEFWRV9VSU5UMzJfVCAmJiBkZWZpbmVkIEhBVkVfSU5UMzJfVCAmJiBTSVpFT0ZfVk9JRF9QID49IDgpCisjaWYgU0laRU9GX1ZPSURfUCA+PSA4CiAjZGVmaW5lIFBZTE9OR19CSVRTX0lOX0RJR0lUIDMwCiAjZWxzZQogI2RlZmluZSBQWUxPTkdfQklUU19JTl9ESUdJVCAxNQpAQCAtMTQ5LDI2ICs2OSw5IEBACiAgKiB3aXRob3V0IGxvc3Mgb2YgaW5mb3JtYXRpb24uICBTaW1pbGFybHkgZm9yIGludHB0cl90LCB3cnQgYSBzaWduZWQKICAqIGludGVncmFsIHR5cGUuCiAgKi8KLSNpZmRlZiBIQVZFX1VJTlRQVFJfVAogdHlwZWRlZiB1aW50cHRyX3QgICAgICAgUHlfdWludHB0cl90OwogdHlwZWRlZiBpbnRwdHJfdCAgICAgICAgUHlfaW50cHRyX3Q7CiAKLSNlbGlmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0lOVAotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgUHlfdWludHB0cl90OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgUHlfaW50cHRyX3Q7Ci0KLSNlbGlmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIFB5X3VpbnRwdHJfdDsKLXR5cGVkZWYgbG9uZyAgICAgICAgICAgIFB5X2ludHB0cl90OwotCi0jZWxpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKSAmJiAoU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9OR19MT05HKQotdHlwZWRlZiB1bnNpZ25lZCBQWV9MT05HX0xPTkcgICBQeV91aW50cHRyX3Q7Ci10eXBlZGVmIFBZX0xPTkdfTE9ORyAgICAgICAgICAgIFB5X2ludHB0cl90OwotCi0jZWxzZQotIyAgIGVycm9yICJQeXRob24gbmVlZHMgYSB0eXBlZGVmIGZvciBQeV91aW50cHRyX3QgaW4gcHlwb3J0LmguIgotI2VuZGlmIC8qIEhBVkVfVUlOVFBUUl9UICovCi0KIC8qIFB5X3NzaXplX3QgaXMgYSBzaWduZWQgaW50ZWdyYWwgdHlwZSBzdWNoIHRoYXQgc2l6ZW9mKFB5X3NzaXplX3QpID09CiAgKiBzaXplb2Yoc2l6ZV90KS4gIEM5OSBkb2Vzbid0IGRlZmluZSBzdWNoIGEgdGhpbmcgZGlyZWN0bHkgKHNpemVfdCBpcyBhbgogICogdW5zaWduZWQgaW50ZWdyYWwgdHlwZSkuICBTZWUgUEVQIDM1MyBmb3IgZGV0YWlscy4KQEAgLTE5NSwxNiArOTgsOCBAQAogdHlwZWRlZiBpbnQgUHlfc3NpemVfY2xlYW5fdDsKICNlbmRpZgogCi0vKiBMYXJnZXN0IHBvc3NpYmxlIHZhbHVlIG9mIHNpemVfdC4KLSAgIFNJWkVfTUFYIGlzIHBhcnQgb2YgQzk5LCBzbyBpdCBtaWdodCBiZSBkZWZpbmVkIG9uIHNvbWUKLSAgIHBsYXRmb3Jtcy4gSWYgaXQgaXMgbm90IGRlZmluZWQsIChzaXplX3QpLTEgaXMgYSBwb3J0YWJsZQotICAgZGVmaW5pdGlvbiBmb3IgQzg5LCBkdWUgdG8gdGhlIHdheSBzaWduZWQtPnVuc2lnbmVkCi0gICBjb252ZXJzaW9uIGlzIGRlZmluZWQuICovCi0jaWZkZWYgU0laRV9NQVgKKy8qIExhcmdlc3QgcG9zc2libGUgdmFsdWUgb2Ygc2l6ZV90LiAqLwogI2RlZmluZSBQWV9TSVpFX01BWCBTSVpFX01BWAotI2Vsc2UKLSNkZWZpbmUgUFlfU0laRV9NQVggKChzaXplX3QpLTEpCi0jZW5kaWYKIAogLyogTGFyZ2VzdCBwb3NpdGl2ZSB2YWx1ZSBvZiB0eXBlIFB5X3NzaXplX3QuICovCiAjZGVmaW5lIFBZX1NTSVpFX1RfTUFYICgoUHlfc3NpemVfdCkoKChzaXplX3QpLTEpPj4xKSkKQEAgLTI0NywyMiArMTQyLDYgQEAKICMgICBlbmRpZgogI2VuZGlmCiAKLS8qIFBZX0ZPUk1BVF9MT05HX0xPTkcgaXMgYW5hbG9nb3VzIHRvIFBZX0ZPUk1BVF9TSVpFX1QgYWJvdmUsIGJ1dCBmb3IKLSAqIHRoZSBsb25nIGxvbmcgdHlwZSBpbnN0ZWFkIG9mIHRoZSBzaXplX3QgdHlwZS4gIEl0J3Mgb25seSBhdmFpbGFibGUKLSAqIHdoZW4gSEFWRV9MT05HX0xPTkcgaXMgZGVmaW5lZC4gVGhlICJoaWdoIGxldmVsIiBQeXRob24gZm9ybWF0Ci0gKiBmdW5jdGlvbnMgbGlzdGVkIGFib3ZlIHdpbGwgaW50ZXJwcmV0ICJsbGQiIG9yICJsbHUiIGNvcnJlY3RseSBvbgotICogYWxsIHBsYXRmb3Jtcy4KLSAqLwotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0jICAgaWZuZGVmIFBZX0ZPUk1BVF9MT05HX0xPTkcKLSMgICAgICAgaWZkZWYgTVNfV0lORE9XUwotIyAgICAgICAgICAgZGVmaW5lIFBZX0ZPUk1BVF9MT05HX0xPTkcgIkk2NCIKLSMgICAgICAgZWxzZQotIyAgICAgICAgICAgZXJyb3IgIlRoaXMgcGxhdGZvcm0ncyBweWNvbmZpZy5oIG5lZWRzIHRvIGRlZmluZSBQWV9GT1JNQVRfTE9OR19MT05HIgotIyAgICAgICBlbmRpZgotIyAgIGVuZGlmCi0jZW5kaWYKLQogLyogUHlfTE9DQUwgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBzdGF0aWMgdG8gZ2V0IHRoZSBmYXN0ZXN0IHBvc3NpYmxlIGNhbGxpbmcKICAqIGNvbnZlbnRpb24gZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSBsb2NhbCB0byBhIGdpdmVuIG1vZHVsZS4KICAqCkBAIC05MDYsNCArNzg1LDggQEAKICNlbmRpZiAvKiBfTVNDX1ZFUiA+PSAxOTAwICovCiAjZW5kaWYgLyogUHlfQlVJTERfQ09SRSAqLwogCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorI2VuZGlmCisKICNlbmRpZiAvKiBQeV9QWVBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXN0YXRlLmggYi9JbmNsdWRlL3B5c3RhdGUuaAppbmRleCAwNDk5YTc0Li5mMWM5NDI3IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5c3RhdGUuaAorKysgYi9JbmNsdWRlL3B5c3RhdGUuaApAQCAtOCwxNCArOCwyMSBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAorLyogVGhpcyBsaW1pdGF0aW9uIGlzIGZvciBwZXJmb3JtYW5jZSBhbmQgc2ltcGxpY2l0eS4gSWYgbmVlZGVkIGl0IGNhbiBiZQorcmVtb3ZlZCAod2l0aCBlZmZvcnQpLiAqLworI2RlZmluZSBNQVhfQ09fRVhUUkFfVVNFUlMgMjU1CisKIC8qIFN0YXRlIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMgKi8KIAogc3RydWN0IF90czsgLyogRm9yd2FyZCAqLwogc3RydWN0IF9pczsgLyogRm9yd2FyZCAqLworc3RydWN0IF9mcmFtZTsgLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgUHlGcmFtZU9iamVjdC4gKi8KIAogI2lmZGVmIFB5X0xJTUlURURfQVBJCiB0eXBlZGVmIHN0cnVjdCBfaXMgUHlJbnRlcnByZXRlclN0YXRlOwogI2Vsc2UKK3R5cGVkZWYgUHlPYmplY3QqICgqX1B5RnJhbWVFdmFsRnVuY3Rpb24pKHN0cnVjdCBfZnJhbWUgKiwgaW50KTsKKwogdHlwZWRlZiBzdHJ1Y3QgX2lzIHsKIAogICAgIHN0cnVjdCBfaXMgKm5leHQ7CkBAIC00MSwxNCArNDgsMTUgQEAKICNlbmRpZgogCiAgICAgUHlPYmplY3QgKmJ1aWx0aW5zX2NvcHk7CisgICAgUHlPYmplY3QgKmltcG9ydF9mdW5jOworICAgIC8qIEluaXRpYWxpemVkIHRvIFB5RXZhbF9FdmFsRnJhbWVEZWZhdWx0KCkuICovCisgICAgX1B5RnJhbWVFdmFsRnVuY3Rpb24gZXZhbF9mcmFtZTsKIH0gUHlJbnRlcnByZXRlclN0YXRlOwogI2VuZGlmCiAKIAogLyogU3RhdGUgdW5pcXVlIHBlciB0aHJlYWQgKi8KIAotc3RydWN0IF9mcmFtZTsgLyogQXZvaWQgaW5jbHVkaW5nIGZyYW1lb2JqZWN0LmggKi8KLQogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQogLyogUHlfdHJhY2VmdW5jIHJldHVybiAtMSB3aGVuIHJhaXNpbmcgYW4gZXhjZXB0aW9uLCBvciAwIGZvciBzdWNjZXNzLiAqLwogdHlwZWRlZiBpbnQgKCpQeV90cmFjZWZ1bmMpKFB5T2JqZWN0ICosIHN0cnVjdCBfZnJhbWUgKiwgaW50LCBQeU9iamVjdCAqKTsKQEAgLTEzNyw2ICsxNDUsMTIgQEAKICAgICBQeU9iamVjdCAqY29yb3V0aW5lX3dyYXBwZXI7CiAgICAgaW50IGluX2Nvcm91dGluZV93cmFwcGVyOwogCisgICAgUHlfc3NpemVfdCBjb19leHRyYV91c2VyX2NvdW50OworICAgIGZyZWVmdW5jIGNvX2V4dHJhX2ZyZWVmdW5jc1tNQVhfQ09fRVhUUkFfVVNFUlNdOworCisgICAgUHlPYmplY3QgKmFzeW5jX2dlbl9maXJzdGl0ZXI7CisgICAgUHlPYmplY3QgKmFzeW5jX2dlbl9maW5hbGl6ZXI7CisKICAgICAvKiBYWFggc2lnbmFsIGhhbmRsZXJzIHNob3VsZCBhbHNvIGJlIGhlcmUgKi8KIAogfSBQeVRocmVhZFN0YXRlOwpAQCAtMjQxLDExICsyNTUsMjMgQEAKICovCiBQeUFQSV9GVU5DKFB5VGhyZWFkU3RhdGUgKikgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUodm9pZCk7CiAKLS8qIEhlbHBlci9kaWFnbm9zdGljIGZ1bmN0aW9uIC0gcmV0dXJuIDEgaWYgdGhlIGN1cnJlbnQgdGhyZWFkCi0gKiBjdXJyZW50bHkgaG9sZHMgdGhlIEdJTCwgMCBvdGhlcndpc2UKLSAqLwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorLyogSXNzdWUgIzI2NTU4OiBGbGFnIHRvIGRpc2FibGUgUHlHSUxTdGF0ZV9DaGVjaygpLgorICAgSWYgc2V0IHRvIG5vbi16ZXJvLCBQeUdJTFN0YXRlX0NoZWNrKCkgYWx3YXlzIHJldHVybiAxLiAqLworUHlBUElfREFUQShpbnQpIF9QeUdJTFN0YXRlX2NoZWNrX2VuYWJsZWQ7CisKKy8qIEhlbHBlci9kaWFnbm9zdGljIGZ1bmN0aW9uIC0gcmV0dXJuIDEgaWYgdGhlIGN1cnJlbnQgdGhyZWFkCisgICBjdXJyZW50bHkgaG9sZHMgdGhlIEdJTCwgMCBvdGhlcndpc2UuCisKKyAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIDEgaWYgX1B5R0lMU3RhdGVfY2hlY2tfZW5hYmxlZCBpcyBub24temVyby4gKi8KIFB5QVBJX0ZVTkMoaW50KSBQeUdJTFN0YXRlX0NoZWNrKHZvaWQpOworCisvKiBVbnNhZmUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzaW5nbGUgUHlJbnRlcnByZXRlclN0YXRlIHVzZWQgYnkgdGhpcyBwcm9jZXNzJworICAgR0lMU3RhdGUgaW1wbGVtZW50YXRpb24uCisKKyAgIFJldHVybiBOVUxMIGJlZm9yZSBfUHlHSUxTdGF0ZV9Jbml0KCkgaXMgY2FsbGVkIGFuZCBhZnRlciBfUHlHSUxTdGF0ZV9GaW5pKCkKKyAgIGlzIGNhbGxlZC4gKi8KK1B5QVBJX0ZVTkMoUHlJbnRlcnByZXRlclN0YXRlICopIF9QeUdJTFN0YXRlX0dldEludGVycHJldGVyU3RhdGVVbnNhZmUodm9pZCk7CiAjZW5kaWYKIAogI2VuZGlmICAgLyogI2lmZGVmIFdJVEhfVEhSRUFEICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5dGhvbnJ1bi5oIGIvSW5jbHVkZS9weXRob25ydW4uaAppbmRleCA5YzJlODEzLi5jZmEwYTlmIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5dGhvbnJ1bi5oCisrKyBiL0luY2x1ZGUvcHl0aG9ucnVuLmgKQEAgLTY2LDggKzY2LDggQEAKICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgICAgICAgLyogZGVjb2RlZCBmcm9tIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nICovCiAgICAgY29uc3QgY2hhciogZW5jLAogICAgIGludCBzdGFydCwKLSAgICBjaGFyICpwczEsCi0gICAgY2hhciAqcHMyLAorICAgIGNvbnN0IGNoYXIgKnBzMSwKKyAgICBjb25zdCBjaGFyICpwczIsCiAgICAgUHlDb21waWxlckZsYWdzICpmbGFncywKICAgICBpbnQgKmVycmNvZGUsCiAgICAgUHlBcmVuYSAqYXJlbmEpOwpAQCAtNzYsOCArNzYsOCBAQAogICAgIFB5T2JqZWN0ICpmaWxlbmFtZSwKICAgICBjb25zdCBjaGFyKiBlbmMsCiAgICAgaW50IHN0YXJ0LAotICAgIGNoYXIgKnBzMSwKLSAgICBjaGFyICpwczIsCisgICAgY29uc3QgY2hhciAqcHMxLAorICAgIGNvbnN0IGNoYXIgKnBzMiwKICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLAogICAgIGludCAqZXJyY29kZSwKICAgICBQeUFyZW5hICphcmVuYSk7CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5dGhyZWFkLmggYi9JbmNsdWRlL3B5dGhyZWFkLmgKaW5kZXggNmU5ZjMwMy4uNDU5YTVkNSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXRocmVhZC5oCisrKyBiL0luY2x1ZGUvcHl0aHJlYWQuaApAQCAtMzcsMTMgKzM3LDggQEAKICAgIG1vZHVsZSBleHBvc2VzIGEgaGlnaGVyLWxldmVsIEFQSSwgd2l0aCB0aW1lb3V0cyBleHByZXNzZWQgaW4gc2Vjb25kcwogICAgYW5kIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYWxsb3dlZC4KICovCi0jaWYgZGVmaW5lZChIQVZFX0xPTkdfTE9ORykKLSNkZWZpbmUgUFlfVElNRU9VVF9UIFBZX0xPTkdfTE9ORworI2RlZmluZSBQWV9USU1FT1VUX1QgbG9uZyBsb25nCiAjZGVmaW5lIFBZX1RJTUVPVVRfTUFYIFBZX0xMT05HX01BWAotI2Vsc2UKLSNkZWZpbmUgUFlfVElNRU9VVF9UIGxvbmcKLSNkZWZpbmUgUFlfVElNRU9VVF9NQVggTE9OR19NQVgKLSNlbmRpZgogCiAvKiBJbiB0aGUgTlQgQVBJLCB0aGUgdGltZW91dCBpcyBhIERXT1JEIGFuZCBpcyBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzICovCiAjaWYgZGVmaW5lZCAoTlRfVEhSRUFEUykKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHl0aW1lLmggYi9JbmNsdWRlL3B5dGltZS5oCmluZGV4IDQ5NDMyMmMuLjU5NWZhZmMgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHl0aW1lLmgKKysrIGIvSW5jbHVkZS9weXRpbWUuaApAQCAtMTMsMTYgKzEzLDEyIEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0jaWZkZWYgUFlfSU5UNjRfVAogLyogX1B5VGltZV90OiBQeXRob24gdGltZXN0YW1wIHdpdGggc3Vic2Vjb25kIHByZWNpc2lvbi4gSXQgY2FuIGJlIHVzZWQgdG8KICAgIHN0b3JlIGEgZHVyYXRpb24sIGFuZCBzbyBpbmRpcmVjdGx5IGEgZGF0ZSAocmVsYXRlZCB0byBhbm90aGVyIGRhdGUsIGxpa2UKICAgIFVOSVggZXBvY2gpLiAqLwotdHlwZWRlZiBQWV9JTlQ2NF9UIF9QeVRpbWVfdDsKK3R5cGVkZWYgaW50NjRfdCBfUHlUaW1lX3Q7CiAjZGVmaW5lIF9QeVRpbWVfTUlOIFBZX0xMT05HX01JTgogI2RlZmluZSBfUHlUaW1lX01BWCBQWV9MTE9OR19NQVgKLSNlbHNlCi0jICBlcnJvciAiX1B5VGltZV90IG5lZWQgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHR5cGUiCi0jZW5kaWYKIAogdHlwZWRlZiBlbnVtIHsKICAgICAvKiBSb3VuZCB0b3dhcmRzIG1pbnVzIGluZmluaXR5ICgtaW5mKS4KQEAgLTMwLDcgKzI2LDEwIEBACiAgICAgX1B5VGltZV9ST1VORF9GTE9PUj0wLAogICAgIC8qIFJvdW5kIHRvd2FyZHMgaW5maW5pdHkgKCtpbmYpLgogICAgICAgIEZvciBleGFtcGxlLCB1c2VkIGZvciB0aW1lb3V0IHRvIHdhaXQgImF0IGxlYXN0IiBOIHNlY29uZHMuICovCi0gICAgX1B5VGltZV9ST1VORF9DRUlMSU5HCisgICAgX1B5VGltZV9ST1VORF9DRUlMSU5HPTEsCisgICAgLyogUm91bmQgdG8gbmVhcmVzdCB3aXRoIHRpZXMgZ29pbmcgdG8gbmVhcmVzdCBldmVuIGludGVnZXIuCisgICAgICAgRm9yIGV4YW1wbGUsIHVzZWQgdG8gcm91bmQgZnJvbSBhIFB5dGhvbiBmbG9hdC4gKi8KKyAgICBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTgogfSBfUHlUaW1lX3JvdW5kX3Q7CiAKIC8qIENvbnZlcnQgYSB0aW1lX3QgdG8gYSBQeUxvbmcuICovCkBAIC03NSw3ICs3NCw3IEBACiAgICAgICAgICAgICAoKF9QeVRpbWVfdCkoc2Vjb25kcykgKiAoMTAwMCAqIDEwMDAgKiAxMDAwKSkKIAogLyogQ3JlYXRlIGEgdGltZXN0YW1wIGZyb20gYSBudW1iZXIgb2YgbmFub3NlY29uZHMuICovCi1QeUFQSV9GVU5DKF9QeVRpbWVfdCkgX1B5VGltZV9Gcm9tTmFub3NlY29uZHMoUFlfTE9OR19MT05HIG5zKTsKK1B5QVBJX0ZVTkMoX1B5VGltZV90KSBfUHlUaW1lX0Zyb21OYW5vc2Vjb25kcyhsb25nIGxvbmcgbnMpOwogCiAvKiBDb252ZXJ0IGEgbnVtYmVyIG9mIHNlY29uZHMgKFB5dGhvbiBmbG9hdCBvciBpbnQpIHRvIGEgdGltZXRhbXAuCiAgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiAtMSBvbiBlcnJvciwgcmV0dXJuIDAgb24gc3VjY2Vzcy4gKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvc2V0b2JqZWN0LmggYi9JbmNsdWRlL3NldG9iamVjdC5oCmluZGV4IGYxN2JjMWIuLjg3ZWMxYzggMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvc2V0b2JqZWN0LmgKKysrIGIvSW5jbHVkZS9zZXRvYmplY3QuaApAQCAtMTAsMTIgKzEwLDEzIEBACiAKIC8qIFRoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiBlbnRyaWVzIGluIHRoZSB0YWJsZToKIAotMS4gVW51c2VkOiAga2V5ID09IE5VTEwKLTIuIEFjdGl2ZTogIGtleSAhPSBOVUxMIGFuZCBrZXkgIT0gZHVtbXkKLTMuIER1bW15OiAgIGtleSA9PSBkdW1teQorMS4gVW51c2VkOiAga2V5ID09IE5VTEwgYW5kIGhhc2ggPT0gMAorMi4gRHVtbXk6ICAga2V5ID09IGR1bW15IGFuZCBoYXNoID09IC0xCiszLiBBY3RpdmU6ICBrZXkgIT0gTlVMTCBhbmQga2V5ICE9IGR1bW15IGFuZCBoYXNoICE9IC0xCiAKLVRoZSBoYXNoIGZpZWxkIG9mIFVudXNlZCBzbG90cyBoYXZlIG5vIG1lYW5pbmcuCi1UaGUgaGFzaCBmaWVsZCBvZiBEdW1tbnkgc2xvdHMgYXJlIHNldCB0byAtMQorVGhlIGhhc2ggZmllbGQgb2YgVW51c2VkIHNsb3RzIGlzIGFsd2F5cyB6ZXJvLgorCitUaGUgaGFzaCBmaWVsZCBvZiBEdW1teSBzbG90cyBhcmUgc2V0IHRvIC0xCiBtZWFuaW5nIHRoYXQgZHVtbXkgZW50cmllcyBjYW4gYmUgZGV0ZWN0ZWQgYnkKIGVpdGhlciBlbnRyeS0+a2V5PT1kdW1teSBvciBieSBlbnRyeS0+aGFzaD09LTEuCiAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9zdHJ1Y3RtZW1iZXIuaCBiL0luY2x1ZGUvc3RydWN0bWVtYmVyLmgKaW5kZXggOTQ4ZjY5MC4uNWRhOGE0NiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zdHJ1Y3RtZW1iZXIuaAorKysgYi9JbmNsdWRlL3N0cnVjdG1lbWJlci5oCkBAIC00OSwxMCArNDksOCBAQAogI2RlZmluZSBUX09CSkVDVF9FWCAxNiAgLyogTGlrZSBUX09CSkVDVCwgYnV0IHJhaXNlcyBBdHRyaWJ1dGVFcnJvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgdmFsdWUgaXMgTlVMTCwgaW5zdGVhZCBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGluZyB0byBOb25lLiAqLwotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAjZGVmaW5lIFRfTE9OR0xPTkcgICAgICAxNwogI2RlZmluZSBUX1VMT05HTE9ORyAgICAgMTgKLSNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLwogCiAjZGVmaW5lIFRfUFlTU0laRVQgICAgICAxOSAgICAgIC8qIFB5X3NzaXplX3QgKi8KICNkZWZpbmUgVF9OT05FICAgICAgICAgIDIwICAgICAgLyogVmFsdWUgaXMgYWx3YXlzIE5vbmUgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvc3ltdGFibGUuaCBiL0luY2x1ZGUvc3ltdGFibGUuaAppbmRleCAxNDA5Y2Q5Li44NmFlM2MyIDEwMDY0NAotLS0gYS9JbmNsdWRlL3N5bXRhYmxlLmgKKysrIGIvSW5jbHVkZS9zeW10YWJsZS5oCkBAIC00OCw2ICs0OCw3IEBACiAgICAgdW5zaWduZWQgc3RlX2NoaWxkX2ZyZWUgOiAxOyAgLyogdHJ1ZSBpZiBhIGNoaWxkIGJsb2NrIGhhcyBmcmVlIHZhcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIGZyZWUgcmVmcyB0byBnbG9iYWxzICovCiAgICAgdW5zaWduZWQgc3RlX2dlbmVyYXRvciA6IDE7ICAgLyogdHJ1ZSBpZiBuYW1lc3BhY2UgaXMgYSBnZW5lcmF0b3IgKi8KKyAgICB1bnNpZ25lZCBzdGVfY29yb3V0aW5lIDogMTsgICAvKiB0cnVlIGlmIG5hbWVzcGFjZSBpcyBhIGNvcm91dGluZSAqLwogICAgIHVuc2lnbmVkIHN0ZV92YXJhcmdzIDogMTsgICAgIC8qIHRydWUgaWYgYmxvY2sgaGFzIHZhcmFyZ3MgKi8KICAgICB1bnNpZ25lZCBzdGVfdmFya2V5d29yZHMgOiAxOyAvKiB0cnVlIGlmIGJsb2NrIGhhcyB2YXJrZXl3b3JkcyAqLwogICAgIHVuc2lnbmVkIHN0ZV9yZXR1cm5zX3ZhbHVlIDogMTsgIC8qIHRydWUgaWYgbmFtZXNwYWNlIHVzZXMgcmV0dXJuIHdpdGgKQEAgLTkxLDYgKzkyLDcgQEAKICNkZWZpbmUgREVGX0ZSRUUgMjw8NCAgICAgICAgICAvKiBuYW1lIHVzZWQgYnV0IG5vdCBkZWZpbmVkIGluIG5lc3RlZCBibG9jayAqLwogI2RlZmluZSBERUZfRlJFRV9DTEFTUyAyPDw1ICAgIC8qIGZyZWUgdmFyaWFibGUgZnJvbSBjbGFzcydzIG1ldGhvZCAqLwogI2RlZmluZSBERUZfSU1QT1JUIDI8PDYgICAgICAgIC8qIGFzc2lnbm1lbnQgb2NjdXJyZWQgdmlhIGltcG9ydCAqLworI2RlZmluZSBERUZfQU5OT1QgMjw8NyAgICAgICAgIC8qIHRoaXMgbmFtZSBpcyBhbm5vdGF0ZWQgKi8KIAogI2RlZmluZSBERUZfQk9VTkQgKERFRl9MT0NBTCB8IERFRl9QQVJBTSB8IERFRl9JTVBPUlQpCiAKZGlmZiAtLWdpdCBhL0luY2x1ZGUvdHJhY2ViYWNrLmggYi9JbmNsdWRlL3RyYWNlYmFjay5oCmluZGV4IGMzZWNiZTIuLmRiYzc2OWIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvdHJhY2ViYWNrLmgKKysrIGIvSW5jbHVkZS90cmFjZWJhY2suaApAQCAtNTMsMTkgKzUzLDYzIEBACiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKTsKIAogLyogV3JpdGUgdGhlIHRyYWNlYmFjayBvZiBhbGwgdGhyZWFkcyBpbnRvIHRoZSBmaWxlICdmZCcuIGN1cnJlbnRfdGhyZWFkIGNhbiBiZQotICAgTlVMTC4gUmV0dXJuIE5VTEwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3IgbWVzc2FnZSBvbiBlcnJvci4KKyAgIE5VTEwuCisKKyAgIFJldHVybiBOVUxMIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIG1lc3NhZ2Ugb24gZXJyb3IuCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgd3JpdHRlbiBmb3IgZGVidWcgcHVycG9zZSBvbmx5LiBJdCBjYWxscwogICAgX1B5X0R1bXBUcmFjZWJhY2soKSBmb3IgZWFjaCB0aHJlYWQsIGFuZCBzbyBoYXMgdGhlIHNhbWUgbGltaXRhdGlvbnMuIEl0CiAgICBvbmx5IHdyaXRlIHRoZSB0cmFjZWJhY2sgb2YgdGhlIGZpcnN0IDEwMCB0aHJlYWRzOiB3cml0ZSAiLi4uIiBpZiB0aGVyZSBhcmUKICAgIG1vcmUgdGhyZWFkcy4KIAorICAgSWYgY3VycmVudF90c3RhdGUgaXMgTlVMTCwgdGhlIGZ1bmN0aW9uIHRyaWVzIHRvIGdldCB0aGUgUHl0aG9uIHRocmVhZCBzdGF0ZQorICAgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLiBJdCBpcyBub3QgYW4gZXJyb3IgaWYgdGhlIGZ1bmN0aW9uIGlzIHVuYWJsZSB0byBnZXQKKyAgIHRoZSBjdXJyZW50IFB5dGhvbiB0aHJlYWQgc3RhdGUuCisKKyAgIElmIGludGVycCBpcyBOVUxMLCB0aGUgZnVuY3Rpb24gdHJpZXMgdG8gZ2V0IHRoZSBpbnRlcnByZXRlciBzdGF0ZSBmcm9tCisgICB0aGUgY3VycmVudCBQeXRob24gdGhyZWFkIHN0YXRlLCBvciBmcm9tCisgICBfUHlHSUxTdGF0ZV9HZXRJbnRlcnByZXRlclN0YXRlVW5zYWZlKCkgaW4gbGFzdCByZXNvcnQuCisKKyAgIEl0IGlzIGJldHRlciB0byBwYXNzIE5VTEwgdG8gaW50ZXJwIGFuZCBjdXJyZW50X3RzdGF0ZSwgdGhlIGZ1bmN0aW9uIHRyaWVzCisgICBkaWZmZXJlbnQgb3B0aW9ucyB0byByZXRyaWV2ZSB0aGVzZSBpbmZvcm1hdGlvbnMuCisKICAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCiAKIFB5QVBJX0ZVTkMoY29uc3QgY2hhciopIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcygKLSAgICBpbnQgZmQsIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwLAotICAgIFB5VGhyZWFkU3RhdGUgKmN1cnJlbnRfdGhyZWFkKTsKKyAgICBpbnQgZmQsCisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAsCisgICAgUHlUaHJlYWRTdGF0ZSAqY3VycmVudF90c3RhdGUpOwogCisjaWZuZGVmIFB5X0xJTUlURURfQVBJCisKKy8qIFdyaXRlIGEgVW5pY29kZSBvYmplY3QgaW50byB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiBFbmNvZGUgdGhlIHN0cmluZyB0bworICAgQVNDSUkgdXNpbmcgdGhlIGJhY2tzbGFzaHJlcGxhY2UgZXJyb3IgaGFuZGxlci4KKworICAgRG8gbm90aGluZyBpZiB0ZXh0IGlzIG5vdCBhIFVuaWNvZGUgb2JqZWN0LiBUaGUgZnVuY3Rpb24gYWNjZXB0cyBVbmljb2RlCisgICBzdHJpbmcgd2hpY2ggaXMgbm90IHJlYWR5IChQeVVuaWNvZGVfV0NIQVJfS0lORCkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeV9EdW1wQVNDSUkoaW50IGZkLCBQeU9iamVjdCAqdGV4dCk7CisKKy8qIEZvcm1hdCBhbiBpbnRlZ2VyIGFzIGRlY2ltYWwgaW50byB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25hbCBzYWZlLiAqLworUHlBUElfRlVOQyh2b2lkKSBfUHlfRHVtcERlY2ltYWwoCisgICAgaW50IGZkLAorICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCisvKiBGb3JtYXQgYW4gaW50ZWdlciBhcyBoZXhhZGVjaW1hbCBpbnRvIHRoZSBmaWxlIGRlc2NyaXB0b3IgZmQgd2l0aCBhdCBsZWFzdAorICAgd2lkdGggZGlnaXRzLgorCisgICBUaGUgbWF4aW11bSB3aWR0aCBpcyBzaXplb2YodW5zaWduZWQgbG9uZykqMiBkaWdpdHMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeV9EdW1wSGV4YWRlY2ltYWwoCisgICAgaW50IGZkLAorICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsCisgICAgUHlfc3NpemVfdCB3aWR0aCk7CisKKyNlbmRpZiAgIC8qICFQeV9MSU1JVEVEX0FQSSAqLwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oIGIvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKaW5kZXggMDEyOGQ3Zi4uYmNkMWFhZCAxMDA2NDQKLS0tIGEvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKKysrIGIvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKQEAgLTEwMywxMCArMTAzLDYgQEAKICMgZW5kaWYKICNlbmRpZgogCi0jaWYgZGVmaW5lZChNU19XSU5ET1dTKQotIyAgZGVmaW5lIEhBVkVfTUJDUwotI2VuZGlmCi0KICNpZmRlZiBIQVZFX1dDSEFSX0gKIC8qIFdvcmsgYXJvdW5kIGEgY29zbWV0aWMgYnVnIGluIEJTREkgNC54IHdjaGFyLmg7IHRoYW5rcyB0byBUaG9tYXMgV291dGVycyAqLwogIyBpZmRlZiBfSEFWRV9CU0RJCkBAIC0xMTcsMjEgKzExMyw5IEBACiAKIC8qIFB5X1VDUzQgYW5kIFB5X1VDUzIgYXJlIHR5cGVkZWZzIGZvciB0aGUgcmVzcGVjdGl2ZQogICAgdW5pY29kZSByZXByZXNlbnRhdGlvbnMuICovCi0jaWYgU0laRU9GX0lOVCA9PSA0Ci10eXBlZGVmIHVuc2lnbmVkIGludCBQeV9VQ1M0OwotI2VsaWYgU0laRU9GX0xPTkcgPT0gNAotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFB5X1VDUzQ7Ci0jZWxzZQotI2Vycm9yICJDb3VsZCBub3QgZmluZCBhIHByb3BlciB0eXBlZGVmIGZvciBQeV9VQ1M0IgotI2VuZGlmCi0KLSNpZiBTSVpFT0ZfU0hPUlQgPT0gMgotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBQeV9VQ1MyOwotI2Vsc2UKLSNlcnJvciAiQ291bGQgbm90IGZpbmQgYSBwcm9wZXIgdHlwZWRlZiBmb3IgUHlfVUNTMiIKLSNlbmRpZgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgUHlfVUNTMTsKK3R5cGVkZWYgdWludDMyX3QgUHlfVUNTNDsKK3R5cGVkZWYgdWludDE2X3QgUHlfVUNTMjsKK3R5cGVkZWYgdWludDhfdCBQeV9VQ1MxOwogCiAvKiAtLS0gSW50ZXJuYWwgVW5pY29kZSBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtOTAwLDcgKzg4NCw3IEBACiAgICAgLyogbWluaW11bSBjaGFyYWN0ZXIgKGRlZmF1bHQ6IDEyNywgQVNDSUkpICovCiAgICAgUHlfVUNTNCBtaW5fY2hhcjsKIAotICAgIC8qIElmIG5vbi16ZXJvLCBvdmVyYWxsb2NhdGUgdGhlIGJ1ZmZlciBieSAyNSUgKGRlZmF1bHQ6IDApLiAqLworICAgIC8qIElmIG5vbi16ZXJvLCBvdmVyYWxsb2NhdGUgdGhlIGJ1ZmZlciAoZGVmYXVsdDogMCkuICovCiAgICAgdW5zaWduZWQgY2hhciBvdmVyYWxsb2NhdGU7CiAKICAgICAvKiBJZiByZWFkb25seSBpcyAxLCBidWZmZXIgaXMgYSBzaGFyZWQgc3RyaW5nIChjYW5ub3QgYmUgbW9kaWZpZWQpCkBAIC05MzQsNiArOTE4LDIzIEBACiBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVJbnRlcm5hbChfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbmd0aCwgUHlfVUNTNCBtYXhjaGFyKTsKIAorLyogUHJlcGFyZSB0aGUgYnVmZmVyIHRvIGhhdmUgYXQgbGVhc3QgdGhlIGtpbmQgS0lORC4KKyAgIEZvciBleGFtcGxlLCBraW5kPVB5VW5pY29kZV8yQllURV9LSU5EIGVuc3VyZXMgdGhhdCB0aGUgd3JpdGVyIHdpbGwKKyAgIHN1cHBvcnQgY2hhcmFjdGVycyBpbiByYW5nZSBVKzAwMC1VK0ZGRkYuCisKKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIHJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIC0xIG9uIGVycm9yLiAqLworI2RlZmluZSBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kKFdSSVRFUiwgS0lORCkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYXNzZXJ0KChLSU5EKSAhPSBQeVVuaWNvZGVfV0NIQVJfS0lORCksICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIChLSU5EKSA8PSAoV1JJVEVSKS0+a2luZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICA/IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgOiBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kSW50ZXJuYWwoKFdSSVRFUiksIChLSU5EKSkpCisKKy8qIERvbid0IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSwgdXNlIHRoZSBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kKCkKKyAgIG1hY3JvIGluc3RlYWQuICovCitQeUFQSV9GVU5DKGludCkKK19QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmRJbnRlcm5hbChfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kKTsKKwogLyogQXBwZW5kIGEgVW5pY29kZSBjaGFyYWN0ZXIuCiAgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCByYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiAtMSBvbiBlcnJvci4gKi8KIFB5QVBJX0ZVTkMoaW50KQpAQCAtMTY0MCwxMyArMTY0MSwxMyBAQAogICAgICk7CiAjZW5kaWYKIAotI2lmZGVmIEhBVkVfTUJDUworI2lmZGVmIE1TX1dJTkRPV1MKIAogLyogLS0tIE1CQ1MgY29kZWNzIGZvciBXaW5kb3dzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlTUJDUygKICAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogTUJDUyBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KICAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCkBAIC0xNjgzLDcgKzE2ODQsNyBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKLSNlbmRpZiAvKiBIQVZFX01CQ1MgKi8KKyNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKIC8qIC0tLSBEZWNpbWFsIEVuY29kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0xOTM4LDYgKzE5MzksMTQgQEAKICAgICBQeU9iamVjdCAqc2VxICAgICAgICAgICAgICAgLyogU2VxdWVuY2Ugb2JqZWN0ICovCiAgICAgKTsKIAorI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlVbmljb2RlX0pvaW5BcnJheSgKKyAgICBQeU9iamVjdCAqc2VwYXJhdG9yLAorICAgIFB5T2JqZWN0ICoqaXRlbXMsCisgICAgUHlfc3NpemVfdCBzZXFsZW4KKyAgICApOworI2VuZGlmIC8qIFB5X0xJTUlURURfQVBJICovCisKIC8qIFJldHVybiAxIGlmIHN1YnN0ciBtYXRjaGVzIHN0cltzdGFydDplbmRdIGF0IHRoZSBnaXZlbiB0YWlsIGVuZCwgMAogICAgb3RoZXJ3aXNlLiAqLwogCkBAIC0yMjUzLDYgKzIyNjIsMTAgQEAKIC8qIENsZWFyIGFsbCBzdGF0aWMgc3RyaW5ncy4gKi8KIFB5QVBJX0ZVTkModm9pZCkgX1B5VW5pY29kZV9DbGVhclN0YXRpY1N0cmluZ3Modm9pZCk7CiAKKy8qIEZhc3QgZXF1YWxpdHkgY2hlY2sgd2hlbiB0aGUgaW5wdXRzIGFyZSBrbm93biB0byBiZSBleGFjdCB1bmljb2RlIHR5cGVzCisgICBhbmQgd2hlcmUgdGhlIGhhc2ggdmFsdWVzIGFyZSBlcXVhbCAoaS5lLiBhIHZlcnkgcHJvYmFibGUgbWF0Y2gpICovCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9FUShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL0luY2x1ZGUvd2FybmluZ3MuaCBiL0luY2x1ZGUvd2FybmluZ3MuaAppbmRleCBlZmZiOWZhZC4uYzFjNjk5MiAxMDA2NDQKLS0tIGEvSW5jbHVkZS93YXJuaW5ncy5oCisrKyBiL0luY2x1ZGUvd2FybmluZ3MuaApAQCAtMTcsNiArMTcsMTMgQEAKICAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAogICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgICAgICAgICAvKiBBU0NJSS1lbmNvZGVkIHN0cmluZyAgKi8KICAgICAuLi4pOworCisvKiBFbWl0IGEgUmVzb3VyY2VXYXJuaW5nIHdhcm5pbmcgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeUVycl9SZXNvdXJjZVdhcm5pbmcoCisgICAgUHlPYmplY3QgKnNvdXJjZSwKKyAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAorICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgICAgICAgICAvKiBBU0NJSS1lbmNvZGVkIHN0cmluZyAgKi8KKyAgICAuLi4pOwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQogUHlBUElfRlVOQyhpbnQpIFB5RXJyX1dhcm5FeHBsaWNpdE9iamVjdCgKICAgICBQeU9iamVjdCAqY2F0ZWdvcnksCmRpZmYgLS1naXQgYS9MaWIvX2NvbGxlY3Rpb25zX2FiYy5weSBiL0xpYi9fY29sbGVjdGlvbnNfYWJjLnB5CmluZGV4IGZjOWM5ZjEuLmYwMzU5NzAgMTAwNjQ0Ci0tLSBhL0xpYi9fY29sbGVjdGlvbnNfYWJjLnB5CisrKyBiL0xpYi9fY29sbGVjdGlvbnNfYWJjLnB5CkBAIC0xMCw4ICsxMCw4IEBACiBpbXBvcnQgc3lzCiAKIF9fYWxsX18gPSBbIkF3YWl0YWJsZSIsICJDb3JvdXRpbmUiLCAiQXN5bmNJdGVyYWJsZSIsICJBc3luY0l0ZXJhdG9yIiwKLSAgICAgICAgICAgIkhhc2hhYmxlIiwgIkl0ZXJhYmxlIiwgIkl0ZXJhdG9yIiwgIkdlbmVyYXRvciIsCi0gICAgICAgICAgICJTaXplZCIsICJDb250YWluZXIiLCAiQ2FsbGFibGUiLAorICAgICAgICAgICAiSGFzaGFibGUiLCAiSXRlcmFibGUiLCAiSXRlcmF0b3IiLCAiR2VuZXJhdG9yIiwgIlJldmVyc2libGUiLAorICAgICAgICAgICAiU2l6ZWQiLCAiQ29udGFpbmVyIiwgIkNhbGxhYmxlIiwgIkNvbGxlY3Rpb24iLAogICAgICAgICAgICAiU2V0IiwgIk11dGFibGVTZXQiLAogICAgICAgICAgICAiTWFwcGluZyIsICJNdXRhYmxlTWFwcGluZyIsCiAgICAgICAgICAgICJNYXBwaW5nVmlldyIsICJLZXlzVmlldyIsICJJdGVtc1ZpZXciLCAiVmFsdWVzVmlldyIsCkBAIC02Miw2ICs2MiwxOCBAQAogCiAjIyMgT05FLVRSSUNLIFBPTklFUyAjIyMKIAorZGVmIF9jaGVja19tZXRob2RzKEMsICptZXRob2RzKToKKyAgICBtcm8gPSBDLl9fbXJvX18KKyAgICBmb3IgbWV0aG9kIGluIG1ldGhvZHM6CisgICAgICAgIGZvciBCIGluIG1ybzoKKyAgICAgICAgICAgIGlmIG1ldGhvZCBpbiBCLl9fZGljdF9fOgorICAgICAgICAgICAgICAgIGlmIEIuX19kaWN0X19bbWV0aG9kXSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgcmV0dXJuIFRydWUKKwogY2xhc3MgSGFzaGFibGUobWV0YWNsYXNzPUFCQ01ldGEpOgogCiAgICAgX19zbG90c19fID0gKCkKQEAgLTczLDExICs4NSw3IEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBDKToKICAgICAgICAgaWYgY2xzIGlzIEhhc2hhYmxlOgotICAgICAgICAgICAgZm9yIEIgaW4gQy5fX21yb19fOgotICAgICAgICAgICAgICAgIGlmICJfX2hhc2hfXyIgaW4gQi5fX2RpY3RfXzoKLSAgICAgICAgICAgICAgICAgICAgaWYgQi5fX2RpY3RfX1siX19oYXNoX18iXToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXR1cm4gX2NoZWNrX21ldGhvZHMoQywgIl9faGFzaF9fIikKICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAKIApAQCAtOTIsMTEgKzEwMCw3IEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBDKToKICAgICAgICAgaWYgY2xzIGlzIEF3YWl0YWJsZToKLSAgICAgICAgICAgIGZvciBCIGluIEMuX19tcm9fXzoKLSAgICAgICAgICAgICAgICBpZiAiX19hd2FpdF9fIiBpbiBCLl9fZGljdF9fOgotICAgICAgICAgICAgICAgICAgICBpZiBCLl9fZGljdF9fWyJfX2F3YWl0X18iXToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXR1cm4gX2NoZWNrX21ldGhvZHMoQywgIl9fYXdhaXRfXyIpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiAKQEAgLTEzNywxNCArMTQxLDcgQEAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgogICAgICAgICBpZiBjbHMgaXMgQ29yb3V0aW5lOgotICAgICAgICAgICAgbXJvID0gQy5fX21yb19fCi0gICAgICAgICAgICBmb3IgbWV0aG9kIGluICgnX19hd2FpdF9fJywgJ3NlbmQnLCAndGhyb3cnLCAnY2xvc2UnKToKLSAgICAgICAgICAgICAgICBmb3IgYmFzZSBpbiBtcm86Ci0gICAgICAgICAgICAgICAgICAgIGlmIG1ldGhvZCBpbiBiYXNlLl9fZGljdF9fOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKLSAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gX2NoZWNrX21ldGhvZHMoQywgJ19fYXdhaXRfXycsICdzZW5kJywgJ3Rocm93JywgJ2Nsb3NlJykKICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAKIApAQCAtMTYyLDggKzE1OSw3IEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBDKToKICAgICAgICAgaWYgY2xzIGlzIEFzeW5jSXRlcmFibGU6Ci0gICAgICAgICAgICBpZiBhbnkoIl9fYWl0ZXJfXyIgaW4gQi5fX2RpY3RfXyBmb3IgQiBpbiBDLl9fbXJvX18pOgotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gX2NoZWNrX21ldGhvZHMoQywgIl9fYWl0ZXJfXyIpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiAKQEAgLTE4Miw5ICsxNzgsNyBAQAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CiAgICAgICAgIGlmIGNscyBpcyBBc3luY0l0ZXJhdG9yOgotICAgICAgICAgICAgaWYgKGFueSgiX19hbmV4dF9fIiBpbiBCLl9fZGljdF9fIGZvciBCIGluIEMuX19tcm9fXykgYW5kCi0gICAgICAgICAgICAgICAgYW55KCJfX2FpdGVyX18iIGluIEIuX19kaWN0X18gZm9yIEIgaW4gQy5fX21yb19fKSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBfY2hlY2tfbWV0aG9kcyhDLCAiX19hbmV4dF9fIiwgIl9fYWl0ZXJfXyIpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiAKQEAgLTIwMCw4ICsxOTQsNyBAQAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CiAgICAgICAgIGlmIGNscyBpcyBJdGVyYWJsZToKLSAgICAgICAgICAgIGlmIGFueSgiX19pdGVyX18iIGluIEIuX19kaWN0X18gZm9yIEIgaW4gQy5fX21yb19fKToKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIF9jaGVja19tZXRob2RzKEMsICJfX2l0ZXJfXyIpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiAKQEAgLTIyMCw5ICsyMTMsNyBAQAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CiAgICAgICAgIGlmIGNscyBpcyBJdGVyYXRvcjoKLSAgICAgICAgICAgIGlmIChhbnkoIl9fbmV4dF9fIiBpbiBCLl9fZGljdF9fIGZvciBCIGluIEMuX19tcm9fXykgYW5kCi0gICAgICAgICAgICAgICAgYW55KCJfX2l0ZXJfXyIgaW4gQi5fX2RpY3RfXyBmb3IgQiBpbiBDLl9fbXJvX18pKToKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIF9jaGVja19tZXRob2RzKEMsICdfX2l0ZXJfXycsICdfX25leHRfXycpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiBJdGVyYXRvci5yZWdpc3RlcihieXRlc19pdGVyYXRvcikKQEAgLTI0MCw2ICsyMzEsMjIgQEAKIEl0ZXJhdG9yLnJlZ2lzdGVyKHppcF9pdGVyYXRvcikKIAogCitjbGFzcyBSZXZlcnNpYmxlKEl0ZXJhYmxlKToKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgorICAgICAgICB3aGlsZSBGYWxzZToKKyAgICAgICAgICAgIHlpZWxkIE5vbmUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CisgICAgICAgIGlmIGNscyBpcyBSZXZlcnNpYmxlOgorICAgICAgICAgICAgcmV0dXJuIF9jaGVja19tZXRob2RzKEMsICJfX3JldmVyc2VkX18iLCAiX19pdGVyX18iKQorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworCiBjbGFzcyBHZW5lcmF0b3IoSXRlcmF0b3IpOgogCiAgICAgX19zbG90c19fID0gKCkKQEAgLTI4MywxNyArMjkwLDEwIEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBDKToKICAgICAgICAgaWYgY2xzIGlzIEdlbmVyYXRvcjoKLSAgICAgICAgICAgIG1ybyA9IEMuX19tcm9fXwotICAgICAgICAgICAgZm9yIG1ldGhvZCBpbiAoJ19faXRlcl9fJywgJ19fbmV4dF9fJywgJ3NlbmQnLCAndGhyb3cnLCAnY2xvc2UnKToKLSAgICAgICAgICAgICAgICBmb3IgYmFzZSBpbiBtcm86Ci0gICAgICAgICAgICAgICAgICAgIGlmIG1ldGhvZCBpbiBiYXNlLl9fZGljdF9fOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKLSAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gX2NoZWNrX21ldGhvZHMoQywgJ19faXRlcl9fJywgJ19fbmV4dF9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZCcsICd0aHJvdycsICdjbG9zZScpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCi0KIEdlbmVyYXRvci5yZWdpc3RlcihnZW5lcmF0b3IpCiAKIApAQCAtMzA4LDggKzMwOCw3IEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBDKToKICAgICAgICAgaWYgY2xzIGlzIFNpemVkOgotICAgICAgICAgICAgaWYgYW55KCJfX2xlbl9fIiBpbiBCLl9fZGljdF9fIGZvciBCIGluIEMuX19tcm9fXyk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBfY2hlY2tfbWV0aG9kcyhDLCAiX19sZW5fXyIpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiAKQEAgLTMyNCwxMCArMzIzLDE4IEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBDKToKICAgICAgICAgaWYgY2xzIGlzIENvbnRhaW5lcjoKLSAgICAgICAgICAgIGlmIGFueSgiX19jb250YWluc19fIiBpbiBCLl9fZGljdF9fIGZvciBCIGluIEMuX19tcm9fXyk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBfY2hlY2tfbWV0aG9kcyhDLCAiX19jb250YWluc19fIikKICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAKK2NsYXNzIENvbGxlY3Rpb24oU2l6ZWQsIEl0ZXJhYmxlLCBDb250YWluZXIpOgorCisgICAgX19zbG90c19fID0gKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CisgICAgICAgIGlmIGNscyBpcyBDb2xsZWN0aW9uOgorICAgICAgICAgICAgcmV0dXJuIF9jaGVja19tZXRob2RzKEMsICAiX19sZW5fXyIsICJfX2l0ZXJfXyIsICJfX2NvbnRhaW5zX18iKQorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIAogY2xhc3MgQ2FsbGFibGUobWV0YWNsYXNzPUFCQ01ldGEpOgogCkBAIC0zNDAsMTUgKzM0NywxNCBAQAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CiAgICAgICAgIGlmIGNscyBpcyBDYWxsYWJsZToKLSAgICAgICAgICAgIGlmIGFueSgiX19jYWxsX18iIGluIEIuX19kaWN0X18gZm9yIEIgaW4gQy5fX21yb19fKToKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIF9jaGVja19tZXRob2RzKEMsICJfX2NhbGxfXyIpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiAKICMjIyBTRVRTICMjIwogCiAKLWNsYXNzIFNldChTaXplZCwgSXRlcmFibGUsIENvbnRhaW5lcik6CitjbGFzcyBTZXQoQ29sbGVjdGlvbik6CiAKICAgICAiIiJBIHNldCBpcyBhIGZpbml0ZSwgaXRlcmFibGUgY29udGFpbmVyLgogCkBAIC01NzMsNyArNTc5LDcgQEAKICMjIyBNQVBQSU5HUyAjIyMKIAogCi1jbGFzcyBNYXBwaW5nKFNpemVkLCBJdGVyYWJsZSwgQ29udGFpbmVyKToKK2NsYXNzIE1hcHBpbmcoQ29sbGVjdGlvbik6CiAKICAgICBfX3Nsb3RzX18gPSAoKQogCkBAIC02MjEsNiArNjI3LDggQEAKICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgICByZXR1cm4gZGljdChzZWxmLml0ZW1zKCkpID09IGRpY3Qob3RoZXIuaXRlbXMoKSkKIAorICAgIF9fcmV2ZXJzZWRfXyA9IE5vbmUKKwogTWFwcGluZy5yZWdpc3RlcihtYXBwaW5ncHJveHkpCiAKIApAQCAtNjcwLDcgKzY3OCw3IEBACiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHYgPT0gdmFsdWUKKyAgICAgICAgICAgIHJldHVybiB2IGlzIHZhbHVlIG9yIHYgPT0gdmFsdWUKIAogICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9tYXBwaW5nOgpAQCAtNjg1LDcgKzY5Myw4IEBACiAKICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHZhbHVlKToKICAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9tYXBwaW5nOgotICAgICAgICAgICAgaWYgdmFsdWUgPT0gc2VsZi5fbWFwcGluZ1trZXldOgorICAgICAgICAgICAgdiA9IHNlbGYuX21hcHBpbmdba2V5XQorICAgICAgICAgICAgaWYgdiBpcyB2YWx1ZSBvciB2ID09IHZhbHVlOgogICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgIHJldHVybiBGYWxzZQogCkBAIC03OTQsNyArODAzLDcgQEAKICMjIyBTRVFVRU5DRVMgIyMjCiAKIAotY2xhc3MgU2VxdWVuY2UoU2l6ZWQsIEl0ZXJhYmxlLCBDb250YWluZXIpOgorY2xhc3MgU2VxdWVuY2UoUmV2ZXJzaWJsZSwgQ29sbGVjdGlvbik6CiAKICAgICAiIiJBbGwgdGhlIG9wZXJhdGlvbnMgb24gYSByZWFkLW9ubHkgc2VxdWVuY2UuCiAKQEAgLTgyMCw3ICs4MjksNyBAQAogCiAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIGZvciB2IGluIHNlbGY6Ci0gICAgICAgICAgICBpZiB2ID09IHZhbHVlOgorICAgICAgICAgICAgaWYgdiBpcyB2YWx1ZSBvciB2ID09IHZhbHVlOgogICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgIHJldHVybiBGYWxzZQogCmRpZmYgLS1naXQgYS9MaWIvX2NvbXBhdF9waWNrbGUucHkgYi9MaWIvX2NvbXBhdF9waWNrbGUucHkKaW5kZXggYzBlMDQ0My4uZjY4NDk2YSAxMDA2NDQKLS0tIGEvTGliL19jb21wYXRfcGlja2xlLnB5CisrKyBiL0xpYi9fY29tcGF0X3BpY2tsZS5weQpAQCAtMjQyLDMgKzI0MiwxMCBAQAogCiBmb3IgZXhjbmFtZSBpbiBQWVRIT04zX09TRVJST1JfRVhDRVBUSU9OUzoKICAgICBSRVZFUlNFX05BTUVfTUFQUElOR1soJ2J1aWx0aW5zJywgZXhjbmFtZSldID0gKCdleGNlcHRpb25zJywgJ09TRXJyb3InKQorCitQWVRIT04zX0lNUE9SVEVSUk9SX0VYQ0VQVElPTlMgPSAoCisgICAgJ01vZHVsZU5vdEZvdW5kRXJyb3InLAorKQorCitmb3IgZXhjbmFtZSBpbiBQWVRIT04zX0lNUE9SVEVSUk9SX0VYQ0VQVElPTlM6CisgICAgUkVWRVJTRV9OQU1FX01BUFBJTkdbKCdidWlsdGlucycsIGV4Y25hbWUpXSA9ICgnZXhjZXB0aW9ucycsICdJbXBvcnRFcnJvcicpCmRpZmYgLS1naXQgYS9MaWIvX29zeF9zdXBwb3J0LnB5IGIvTGliL19vc3hfc3VwcG9ydC5weQppbmRleCAxM2ZjZDhiLi5lYWRmMDZmIDEwMDY0NAotLS0gYS9MaWIvX29zeF9zdXBwb3J0LnB5CisrKyBiL0xpYi9fb3N4X3N1cHBvcnQucHkKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgICAgICAjIERvIG5vdCBhbHRlciBhIGNvbmZpZyB2YXIgZXhwbGljaXRseSBvdmVycmlkZGVuIGJ5IGVudiB2YXIKICAgICAgICAgaWYgY3YgaW4gX2NvbmZpZ192YXJzIGFuZCBjdiBub3QgaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgIGZsYWdzID0gX2NvbmZpZ192YXJzW2N2XQotICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrXHcrXHMnLCAnICcsIGZsYWdzLCByZS5BU0NJSSkKKyAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKHInLWFyY2hccytcdytccycsICcgJywgZmxhZ3MsIHJlLkFTQ0lJKQogICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdCBbXiBcdF0qJywgJyAnLCBmbGFncykKICAgICAgICAgICAgIF9zYXZlX21vZGlmaWVkX3ZhbHVlKF9jb25maWdfdmFycywgY3YsIGZsYWdzKQogCkBAIC0yMzIsNyArMjMyLDcgQEAKICAgICBpZiAnQ0MnIGluIG9zLmVudmlyb246CiAgICAgICAgIHJldHVybiBfY29uZmlnX3ZhcnMKIAotICAgIGlmIHJlLnNlYXJjaCgnLWFyY2hccytwcGMnLCBfY29uZmlnX3ZhcnNbJ0NGTEFHUyddKSBpcyBub3QgTm9uZToKKyAgICBpZiByZS5zZWFyY2gocictYXJjaFxzK3BwYycsIF9jb25maWdfdmFyc1snQ0ZMQUdTJ10pIGlzIG5vdCBOb25lOgogICAgICAgICAjIE5PVEU6IENhbm5vdCB1c2Ugc3VicHJvY2VzcyBoZXJlIGJlY2F1c2Ugb2YgYm9vdHN0cmFwCiAgICAgICAgICMgaXNzdWVzIHdoZW4gYnVpbGRpbmcgUHl0aG9uIGl0c2VsZgogICAgICAgICBzdGF0dXMgPSBvcy5zeXN0ZW0oCkBAIC0yNTEsNyArMjUxLDcgQEAKICAgICAgICAgICAgIGZvciBjdiBpbiBfVU5JVkVSU0FMX0NPTkZJR19WQVJTOgogICAgICAgICAgICAgICAgIGlmIGN2IGluIF9jb25maWdfdmFycyBhbmQgY3Ygbm90IGluIG9zLmVudmlyb246CiAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX2NvbmZpZ192YXJzW2N2XQotICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWFyY2hccytwcGNcdypccycsICcgJywgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKHInLWFyY2hccytwcGNcdypccycsICcgJywgZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgIF9zYXZlX21vZGlmaWVkX3ZhbHVlKF9jb25maWdfdmFycywgY3YsIGZsYWdzKQogCiAgICAgcmV0dXJuIF9jb25maWdfdmFycwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgICAgIGZvciBjdiBpbiBfVU5JVkVSU0FMX0NPTkZJR19WQVJTOgogICAgICAgICAgICAgaWYgY3YgaW4gX2NvbmZpZ192YXJzIGFuZCAnLWFyY2gnIGluIF9jb25maWdfdmFyc1tjdl06CiAgICAgICAgICAgICAgICAgZmxhZ3MgPSBfY29uZmlnX3ZhcnNbY3ZdCi0gICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrXHcrXHMnLCAnICcsIGZsYWdzKQorICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKHInLWFyY2hccytcdytccycsICcgJywgZmxhZ3MpCiAgICAgICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyArICcgJyArIGFyY2gKICAgICAgICAgICAgICAgICBfc2F2ZV9tb2RpZmllZF92YWx1ZShfY29uZmlnX3ZhcnMsIGN2LCBmbGFncykKIApAQCAtNDY1LDcgKzQ2NSw3IEBACiAKICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0JwogCi0gICAgICAgICAgICBhcmNocyA9IHJlLmZpbmRhbGwoJy1hcmNoXHMrKFxTKyknLCBjZmxhZ3MpCisgICAgICAgICAgICBhcmNocyA9IHJlLmZpbmRhbGwocictYXJjaFxzKyhcUyspJywgY2ZsYWdzKQogICAgICAgICAgICAgYXJjaHMgPSB0dXBsZShzb3J0ZWQoc2V0KGFyY2hzKSkpCiAKICAgICAgICAgICAgIGlmIGxlbihhcmNocykgPT0gMToKZGlmZiAtLWdpdCBhL0xpYi9fcHlkZWNpbWFsLnB5IGIvTGliL19weWRlY2ltYWwucHkKaW5kZXggOTAwYTFhNy4uMjFlODc1YyAxMDA2NDQKLS0tIGEvTGliL19weWRlY2ltYWwucHkKKysrIGIvTGliL19weWRlY2ltYWwucHkKQEAgLTE0OCw3ICsxNDgsNyBAQAogX19uYW1lX18gPSAnZGVjaW1hbCcgICAgIyBGb3IgcGlja2xpbmcKIF9fdmVyc2lvbl9fID0gJzEuNzAnICAgICMgSGlnaGVzdCB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoaXMgY29tcGxpZXMgd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgIyBTZWUgaHR0cDovL3NwZWxlb3Ryb3ZlLmNvbS9kZWNpbWFsLwotX19saWJtcGRlY192ZXJzaW9uX18gPSAiMi40LjEiICMgY29tcGF0aWJsZSBsaWJtcGRlYyB2ZXJzaW9uCitfX2xpYm1wZGVjX3ZlcnNpb25fXyA9ICIyLjQuMiIgIyBjb21wYXRpYmxlIGxpYm1wZGVjIHZlcnNpb24KIAogaW1wb3J0IG1hdGggYXMgX21hdGgKIGltcG9ydCBudW1iZXJzIGFzIF9udW1iZXJzCkBAIC0xMDEwLDYgKzEwMTAsNTYgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiBEZWNpbWFsVHVwbGUoc2VsZi5fc2lnbiwgdHVwbGUobWFwKGludCwgc2VsZi5faW50KSksIHNlbGYuX2V4cCkKIAorICAgIGRlZiBhc19pbnRlZ2VyX3JhdGlvKHNlbGYpOgorICAgICAgICAiIiJFeHByZXNzIGEgZmluaXRlIERlY2ltYWwgaW5zdGFuY2UgaW4gdGhlIGZvcm0gbiAvIGQuCisKKyAgICAgICAgUmV0dXJucyBhIHBhaXIgKG4sIGQpIG9mIGludGVnZXJzLiAgV2hlbiBjYWxsZWQgb24gYW4gaW5maW5pdHkKKyAgICAgICAgb3IgTmFOLCByYWlzZXMgT3ZlcmZsb3dFcnJvciBvciBWYWx1ZUVycm9yIHJlc3BlY3RpdmVseS4KKworICAgICAgICA+Pj4gRGVjaW1hbCgnMy4xNCcpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAoMTU3LCA1MCkKKyAgICAgICAgPj4+IERlY2ltYWwoJy0xMjNlNScpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAoLTEyMzAwMDAwLCAxKQorICAgICAgICA+Pj4gRGVjaW1hbCgnMC4wMCcpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAoMCwgMSkKKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGlmIHNlbGYuaXNfbmFuKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKCJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIikKKworICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiAwLCAxCisKKyAgICAgICAgIyBGaW5kIG4sIGQgaW4gbG93ZXN0IHRlcm1zIHN1Y2ggdGhhdCBhYnMoc2VsZikgPT0gbiAvIGQ7CisgICAgICAgICMgd2UnbGwgZGVhbCB3aXRoIHRoZSBzaWduIGxhdGVyLgorICAgICAgICBuID0gaW50KHNlbGYuX2ludCkKKyAgICAgICAgaWYgc2VsZi5fZXhwID49IDA6CisgICAgICAgICAgICAjIHNlbGYgaXMgYW4gaW50ZWdlci4KKyAgICAgICAgICAgIG4sIGQgPSBuICogMTAqKnNlbGYuX2V4cCwgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBGaW5kIGQyLCBkNSBzdWNoIHRoYXQgYWJzKHNlbGYpID0gbiAvICgyKipkMiAqIDUqKmQ1KS4KKyAgICAgICAgICAgIGQ1ID0gLXNlbGYuX2V4cAorICAgICAgICAgICAgd2hpbGUgZDUgPiAwIGFuZCBuICUgNSA9PSAwOgorICAgICAgICAgICAgICAgIG4gLy89IDUKKyAgICAgICAgICAgICAgICBkNSAtPSAxCisKKyAgICAgICAgICAgICMgKG4gJiAtbikuYml0X2xlbmd0aCgpIC0gMSBjb3VudHMgdHJhaWxpbmcgemVyb3MgaW4gYmluYXJ5CisgICAgICAgICAgICAjIHJlcHJlc2VudGF0aW9uIG9mIG4gKHByb3ZpZGVkIG4gaXMgbm9uemVybykuCisgICAgICAgICAgICBkMiA9IC1zZWxmLl9leHAKKyAgICAgICAgICAgIHNoaWZ0MiA9IG1pbigobiAmIC1uKS5iaXRfbGVuZ3RoKCkgLSAxLCBkMikKKyAgICAgICAgICAgIGlmIHNoaWZ0MjoKKyAgICAgICAgICAgICAgICBuID4+PSBzaGlmdDIKKyAgICAgICAgICAgICAgICBkMiAtPSBzaGlmdDIKKworICAgICAgICAgICAgZCA9IDUqKmQ1IDw8IGQyCisKKyAgICAgICAgaWYgc2VsZi5fc2lnbjoKKyAgICAgICAgICAgIG4gPSAtbgorICAgICAgICByZXR1cm4gbiwgZAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICAiIiJSZXByZXNlbnRzIHRoZSBudW1iZXIgYXMgYW4gaW5zdGFuY2Ugb2YgRGVjaW1hbC4iIiIKICAgICAgICAgIyBJbnZhcmlhbnQ6ICBldmFsKHJlcHIoZCkpID09IGQKZGlmZiAtLWdpdCBhL0xpYi9fcHlpby5weSBiL0xpYi9fcHlpby5weQppbmRleCAwZDk4Yjc0Li5kMDk0N2YwIDEwMDY0NAotLS0gYS9MaWIvX3B5aW8ucHkKKysrIGIvTGliL19weWlvLnB5CkBAIC02LDcgKzYsNiBAQAogaW1wb3J0IGFiYwogaW1wb3J0IGNvZGVjcwogaW1wb3J0IGVycm5vCi1pbXBvcnQgYXJyYXkKIGltcG9ydCBzdGF0CiBpbXBvcnQgc3lzCiAjIEltcG9ydCBfdGhyZWFkIGluc3RlYWQgb2YgdGhyZWFkaW5nIHRvIHJlZHVjZSBzdGFydHVwIGNvc3QKQEAgLTE2MSw2ICsxNjAsOCBAQAogICAgIG9wZW5lZCBpbiBhIHRleHQgbW9kZSwgYW5kIGZvciBieXRlcyBhIEJ5dGVzSU8gY2FuIGJlIHVzZWQgbGlrZSBhIGZpbGUKICAgICBvcGVuZWQgaW4gYSBiaW5hcnkgbW9kZS4KICAgICAiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShmaWxlLCBpbnQpOgorICAgICAgICBmaWxlID0gb3MuZnNwYXRoKGZpbGUpCiAgICAgaWYgbm90IGlzaW5zdGFuY2UoZmlsZSwgKHN0ciwgYnl0ZXMsIGludCkpOgogICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQgZmlsZTogJXIiICUgZmlsZSkKICAgICBpZiBub3QgaXNpbnN0YW5jZShtb2RlLCBzdHIpOgpAQCAtMTgyLDggKzE4Myw4IEBACiAgICAgdGV4dCA9ICJ0IiBpbiBtb2RlcwogICAgIGJpbmFyeSA9ICJiIiBpbiBtb2RlcwogICAgIGlmICJVIiBpbiBtb2RlczoKLSAgICAgICAgaWYgY3JlYXRpbmcgb3Igd3JpdGluZyBvciBhcHBlbmRpbmc6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW4ndCB1c2UgVSBhbmQgd3JpdGluZyBtb2RlIGF0IG9uY2UiKQorICAgICAgICBpZiBjcmVhdGluZyBvciB3cml0aW5nIG9yIGFwcGVuZGluZyBvciB1cGRhdGluZzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgVSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAneCcsICd3JywgJ2EnLCBvciAnKyciKQogICAgICAgICBpbXBvcnQgd2FybmluZ3MKICAgICAgICAgd2FybmluZ3Mud2FybigiJ1UnIG1vZGUgaXMgZGVwcmVjYXRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQpAQCAtMTUxNiw3ICsxNTE3LDcgQEAKICAgICAgICAgaWYgc2VsZi5fZmQgPj0gMCBhbmQgc2VsZi5fY2xvc2VmZCBhbmQgbm90IHNlbGYuY2xvc2VkOgogICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCiAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCd1bmNsb3NlZCBmaWxlICVyJyAlIChzZWxmLCksIFJlc291cmNlV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIsIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL19zdHJwdGltZS5weSBiL0xpYi9fc3RycHRpbWUucHkKaW5kZXggZjg0MjI3Yi4uZmU5NDM2MSAxMDA2NDQKLS0tIGEvTGliL19zdHJwdGltZS5weQorKysgYi9MaWIvX3N0cnB0aW1lLnB5CkBAIC0xOTksMTIgKzE5OSwxNSBAQAogICAgICAgICAgICAgJ2YnOiByIig/UDxmPlswLTldezEsNn0pIiwKICAgICAgICAgICAgICdIJzogciIoP1A8SD4yWzAtM118WzAtMV1cZHxcZCkiLAogICAgICAgICAgICAgJ0knOiByIig/UDxJPjFbMC0yXXwwWzEtOV18WzEtOV0pIiwKKyAgICAgICAgICAgICdHJzogciIoP1A8Rz5cZFxkXGRcZCkiLAogICAgICAgICAgICAgJ2onOiByIig/UDxqPjM2WzAtNl18M1swLTVdXGR8WzEtMl1cZFxkfDBbMS05XVxkfDAwWzEtOV18WzEtOV1cZHwwWzEtOV18WzEtOV0pIiwKICAgICAgICAgICAgICdtJzogciIoP1A8bT4xWzAtMl18MFsxLTldfFsxLTldKSIsCiAgICAgICAgICAgICAnTSc6IHIiKD9QPE0+WzAtNV1cZHxcZCkiLAogICAgICAgICAgICAgJ1MnOiByIig/UDxTPjZbMC0xXXxbMC01XVxkfFxkKSIsCiAgICAgICAgICAgICAnVSc6IHIiKD9QPFU+NVswLTNdfFswLTRdXGR8XGQpIiwKICAgICAgICAgICAgICd3JzogciIoP1A8dz5bMC02XSkiLAorICAgICAgICAgICAgJ3UnOiByIig/UDx1PlsxLTddKSIsCisgICAgICAgICAgICAnVic6IHIiKD9QPFY+NVswLTNdfDBbMS05XXxbMS00XVxkfFxkKSIsCiAgICAgICAgICAgICAjIFcgaXMgc2V0IGJlbG93IGJ5IHVzaW5nICdVJwogICAgICAgICAgICAgJ3knOiByIig/UDx5PlxkXGQpIiwKICAgICAgICAgICAgICNYWFg6IERvZXMgJ1knIG5lZWQgdG8gd29ycnkgYWJvdXQgaGF2aW5nIGxlc3Mgb3IgbW9yZSB0aGFuCkBAIC0yOTksNiArMzAyLDIyIEBACiAgICAgICAgIHJldHVybiAxICsgZGF5c190b193ZWVrICsgZGF5X29mX3dlZWsKIAogCitkZWYgX2NhbGNfanVsaWFuX2Zyb21fVihpc29feWVhciwgaXNvX3dlZWssIGlzb193ZWVrZGF5KToKKyAgICAiIiJDYWxjdWxhdGUgdGhlIEp1bGlhbiBkYXkgYmFzZWQgb24gdGhlIElTTyA4NjAxIHllYXIsIHdlZWssIGFuZCB3ZWVrZGF5LgorICAgIElTTyB3ZWVrcyBzdGFydCBvbiBNb25kYXlzLCB3aXRoIHdlZWsgMDEgYmVpbmcgdGhlIHdlZWsgY29udGFpbmluZyA0IEphbi4KKyAgICBJU08gd2VlayBkYXlzIHJhbmdlIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLgorICAgICIiIgorICAgIGNvcnJlY3Rpb24gPSBkYXRldGltZV9kYXRlKGlzb195ZWFyLCAxLCA0KS5pc293ZWVrZGF5KCkgKyAzCisgICAgb3JkaW5hbCA9IChpc29fd2VlayAqIDcpICsgaXNvX3dlZWtkYXkgLSBjb3JyZWN0aW9uCisgICAgIyBvcmRpbmFsIG1heSBiZSBuZWdhdGl2ZSBvciAwIG5vdywgd2hpY2ggbWVhbnMgdGhlIGRhdGUgaXMgaW4gdGhlIHByZXZpb3VzCisgICAgIyBjYWxlbmRhciB5ZWFyCisgICAgaWYgb3JkaW5hbCA8IDE6CisgICAgICAgIG9yZGluYWwgKz0gZGF0ZXRpbWVfZGF0ZShpc29feWVhciwgMSwgMSkudG9vcmRpbmFsKCkKKyAgICAgICAgaXNvX3llYXIgLT0gMQorICAgICAgICBvcmRpbmFsIC09IGRhdGV0aW1lX2RhdGUoaXNvX3llYXIsIDEsIDEpLnRvb3JkaW5hbCgpCisgICAgcmV0dXJuIGlzb195ZWFyLCBvcmRpbmFsCisKKwogZGVmIF9zdHJwdGltZShkYXRhX3N0cmluZywgZm9ybWF0PSIlYSAlYiAlZCAlSDolTTolUyAlWSIpOgogICAgICIiIlJldHVybiBhIDItdHVwbGUgY29uc2lzdGluZyBvZiBhIHRpbWUgc3RydWN0IGFuZCBhbiBpbnQgY29udGFpbmluZwogICAgIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIGJhc2VkIG9uIHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZQpAQCAtMzQ1LDE1ICszNjQsMTUgQEAKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5jb252ZXJ0ZWQgZGF0YSByZW1haW5zOiAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3N0cmluZ1tmb3VuZC5lbmQoKTpdKQogCi0gICAgeWVhciA9IE5vbmUKKyAgICBpc29feWVhciA9IHllYXIgPSBOb25lCiAgICAgbW9udGggPSBkYXkgPSAxCiAgICAgaG91ciA9IG1pbnV0ZSA9IHNlY29uZCA9IGZyYWN0aW9uID0gMAogICAgIHR6ID0gLTEKICAgICB0em9mZnNldCA9IE5vbmUKICAgICAjIERlZmF1bHQgdG8gLTEgdG8gc2lnbmlmeSB0aGF0IHZhbHVlcyBub3Qga25vd247IG5vdCBjcml0aWNhbCB0byBoYXZlLAogICAgICMgdGhvdWdoCi0gICAgd2Vla19vZl95ZWFyID0gLTEKLSAgICB3ZWVrX29mX3llYXJfc3RhcnQgPSAtMQorICAgIGlzb193ZWVrID0gd2Vla19vZl95ZWFyID0gTm9uZQorICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IE5vbmUKICAgICAjIHdlZWtkYXkgYW5kIGp1bGlhbiBkZWZhdWx0ZWQgdG8gTm9uZSBzbyBhcyB0byBzaWduYWwgbmVlZCB0byBjYWxjdWxhdGUKICAgICAjIHZhbHVlcwogICAgIHdlZWtkYXkgPSBqdWxpYW4gPSBOb25lCkBAIC0zNzUsNiArMzk0LDggQEAKICAgICAgICAgICAgICAgICB5ZWFyICs9IDE5MDAKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ1knOgogICAgICAgICAgICAgeWVhciA9IGludChmb3VuZF9kaWN0WydZJ10pCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdHJzoKKyAgICAgICAgICAgIGlzb195ZWFyID0gaW50KGZvdW5kX2RpY3RbJ0cnXSkKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ20nOgogICAgICAgICAgICAgbW9udGggPSBpbnQoZm91bmRfZGljdFsnbSddKQogICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnQic6CkBAIC00MjAsNiArNDQxLDkgQEAKICAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gNgogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB3ZWVrZGF5IC09IDEKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ3UnOgorICAgICAgICAgICAgd2Vla2RheSA9IGludChmb3VuZF9kaWN0Wyd1J10pCisgICAgICAgICAgICB3ZWVrZGF5IC09IDEKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ2onOgogICAgICAgICAgICAganVsaWFuID0gaW50KGZvdW5kX2RpY3RbJ2onXSkKICAgICAgICAgZWxpZiBncm91cF9rZXkgaW4gKCdVJywgJ1cnKToKQEAgLTQzMCw2ICs0NTQsOCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAjIFcgc3RhcnRzIHdlZWsgb24gTW9uZGF5LgogICAgICAgICAgICAgICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IDAKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ1YnOgorICAgICAgICAgICAgaXNvX3dlZWsgPSBpbnQoZm91bmRfZGljdFsnViddKQogICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAneic6CiAgICAgICAgICAgICB6ID0gZm91bmRfZGljdFsneiddCiAgICAgICAgICAgICB0em9mZnNldCA9IGludCh6WzE6M10pICogNjAgKyBpbnQoelszOjVdKQpAQCAtNDUwLDMyICs0NzYsNjEgQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIHR6ID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgIyBEZWFsIHdpdGggdGhlIGNhc2VzIHdoZXJlIGFtYmlndWl0aWVzIGFyaXplCisgICAgIyBkb24ndCBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMgZm9yIElTTyB3ZWVrL3llYXIKKyAgICBpZiB5ZWFyIGlzIE5vbmUgYW5kIGlzb195ZWFyIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBpc29fd2VlayBpcyBOb25lIG9yIHdlZWtkYXkgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIklTTyB5ZWFyIGRpcmVjdGl2ZSAnJUcnIG11c3QgYmUgdXNlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBJU08gd2VlayBkaXJlY3RpdmUgJyVWJyBhbmQgYSB3ZWVrZGF5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdGl2ZSAoJyVBJywgJyVhJywgJyV3Jywgb3IgJyV1JykuIikKKyAgICAgICAgaWYganVsaWFuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRGF5IG9mIHRoZSB5ZWFyIGRpcmVjdGl2ZSAnJWonIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wYXRpYmxlIHdpdGggSVNPIHllYXIgZGlyZWN0aXZlICclRycuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSAnJVknIGluc3RlYWQuIikKKyAgICBlbGlmIHdlZWtfb2ZfeWVhciBpcyBOb25lIGFuZCBpc29fd2VlayBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgd2Vla2RheSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSVNPIHdlZWsgZGlyZWN0aXZlICclVicgbXVzdCBiZSB1c2VkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIElTTyB5ZWFyIGRpcmVjdGl2ZSAnJUcnIGFuZCBhIHdlZWtkYXkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlICgnJUEnLCAnJWEnLCAnJXcnLCBvciAnJXUnKS4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSVNPIHdlZWsgZGlyZWN0aXZlICclVicgaXMgaW5jb21wYXRpYmxlIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHllYXIgZGlyZWN0aXZlICclWScuIFVzZSB0aGUgSVNPIHllYXIgJyVHJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0ZWFkLiIpCisKICAgICBsZWFwX3llYXJfZml4ID0gRmFsc2UKICAgICBpZiB5ZWFyIGlzIE5vbmUgYW5kIG1vbnRoID09IDIgYW5kIGRheSA9PSAyOToKICAgICAgICAgeWVhciA9IDE5MDQgICMgMTkwNCBpcyBmaXJzdCBsZWFwIHllYXIgb2YgMjB0aCBjZW50dXJ5CiAgICAgICAgIGxlYXBfeWVhcl9maXggPSBUcnVlCiAgICAgZWxpZiB5ZWFyIGlzIE5vbmU6CiAgICAgICAgIHllYXIgPSAxOTAwCisKKwogICAgICMgSWYgd2Uga25vdyB0aGUgd2VlayBvZiB0aGUgeWVhciBhbmQgd2hhdCBkYXkgb2YgdGhhdCB3ZWVrLCB3ZSBjYW4gZmlndXJlCiAgICAgIyBvdXQgdGhlIEp1bGlhbiBkYXkgb2YgdGhlIHllYXIuCi0gICAgaWYganVsaWFuIGlzIE5vbmUgYW5kIHdlZWtfb2ZfeWVhciAhPSAtMSBhbmQgd2Vla2RheSBpcyBub3QgTm9uZToKLSAgICAgICAgd2Vla19zdGFydHNfTW9uID0gVHJ1ZSBpZiB3ZWVrX29mX3llYXJfc3RhcnQgPT0gMCBlbHNlIEZhbHNlCi0gICAgICAgIGp1bGlhbiA9IF9jYWxjX2p1bGlhbl9mcm9tX1Vfb3JfVyh5ZWFyLCB3ZWVrX29mX3llYXIsIHdlZWtkYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbikKLSAgICAgICAgaWYganVsaWFuIDw9IDA6CisgICAgaWYganVsaWFuIGlzIE5vbmUgYW5kIHdlZWtkYXkgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIHdlZWtfb2ZfeWVhciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbiA9IFRydWUgaWYgd2Vla19vZl95ZWFyX3N0YXJ0ID09IDAgZWxzZSBGYWxzZQorICAgICAgICAgICAganVsaWFuID0gX2NhbGNfanVsaWFuX2Zyb21fVV9vcl9XKHllYXIsIHdlZWtfb2ZfeWVhciwgd2Vla2RheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbikKKyAgICAgICAgZWxpZiBpc29feWVhciBpcyBub3QgTm9uZSBhbmQgaXNvX3dlZWsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB5ZWFyLCBqdWxpYW4gPSBfY2FsY19qdWxpYW5fZnJvbV9WKGlzb195ZWFyLCBpc29fd2Vlaywgd2Vla2RheSArIDEpCisgICAgICAgIGlmIGp1bGlhbiBpcyBub3QgTm9uZSBhbmQganVsaWFuIDw9IDA6CiAgICAgICAgICAgICB5ZWFyIC09IDEKICAgICAgICAgICAgIHlkYXkgPSAzNjYgaWYgY2FsZW5kYXIuaXNsZWFwKHllYXIpIGVsc2UgMzY1CiAgICAgICAgICAgICBqdWxpYW4gKz0geWRheQotICAgICMgQ2Fubm90IHByZS1jYWxjdWxhdGUgZGF0ZXRpbWVfZGF0ZSgpIHNpbmNlIGNhbiBjaGFuZ2UgaW4gSnVsaWFuCi0gICAgIyBjYWxjdWxhdGlvbiBhbmQgdGh1cyBjb3VsZCBoYXZlIGRpZmZlcmVudCB2YWx1ZSBmb3IgdGhlIGRheSBvZiB0aGUgd2VlawotICAgICMgY2FsY3VsYXRpb24uCisKICAgICBpZiBqdWxpYW4gaXMgTm9uZToKKyAgICAgICAgIyBDYW5ub3QgcHJlLWNhbGN1bGF0ZSBkYXRldGltZV9kYXRlKCkgc2luY2UgY2FuIGNoYW5nZSBpbiBKdWxpYW4KKyAgICAgICAgIyBjYWxjdWxhdGlvbiBhbmQgdGh1cyBjb3VsZCBoYXZlIGRpZmZlcmVudCB2YWx1ZSBmb3IgdGhlIGRheSBvZgorICAgICAgICAjIHRoZSB3ZWVrIGNhbGN1bGF0aW9uLgogICAgICAgICAjIE5lZWQgdG8gYWRkIDEgdG8gcmVzdWx0IHNpbmNlIGZpcnN0IGRheSBvZiB0aGUgeWVhciBpcyAxLCBub3QgMC4KICAgICAgICAganVsaWFuID0gZGF0ZXRpbWVfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KS50b29yZGluYWwoKSAtIFwKICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkgKyAxCi0gICAgZWxzZTogICMgQXNzdW1lIHRoYXQgaWYgdGhleSBib3RoZXJlZCB0byBpbmNsdWRlIEp1bGlhbiBkYXkgaXQgd2lsbAotICAgICAgICAgICAjIGJlIGFjY3VyYXRlLgotICAgICAgICBkYXRldGltZV9yZXN1bHQgPSBkYXRldGltZV9kYXRlLmZyb21vcmRpbmFsKChqdWxpYW4gLSAxKSArIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkpCisgICAgZWxzZTogICMgQXNzdW1lIHRoYXQgaWYgdGhleSBib3RoZXJlZCB0byBpbmNsdWRlIEp1bGlhbiBkYXkgKG9yIGlmIGl0IHdhcworICAgICAgICAgICAjIGNhbGN1bGF0ZWQgYWJvdmUgd2l0aCB5ZWFyL3dlZWsvd2Vla2RheSkgaXQgd2lsbCBiZSBhY2N1cmF0ZS4KKyAgICAgICAgZGF0ZXRpbWVfcmVzdWx0ID0gZGF0ZXRpbWVfZGF0ZS5mcm9tb3JkaW5hbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoanVsaWFuIC0gMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkpCiAgICAgICAgIHllYXIgPSBkYXRldGltZV9yZXN1bHQueWVhcgogICAgICAgICBtb250aCA9IGRhdGV0aW1lX3Jlc3VsdC5tb250aAogICAgICAgICBkYXkgPSBkYXRldGltZV9yZXN1bHQuZGF5CmRpZmYgLS1naXQgYS9MaWIvYWlmYy5weSBiL0xpYi9haWZjLnB5CmluZGV4IDdlYmRiZWIuLjY5MmQwYmYgMTAwNjQ0Ci0tLSBhL0xpYi9haWZjLnB5CisrKyBiL0xpYi9haWZjLnB5CkBAIC0yNTcsNiArMjU3LDE1IEBACiBfYWlmY19wYXJhbXMgPSBuYW1lZHR1cGxlKCdfYWlmY19wYXJhbXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnbmNoYW5uZWxzIHNhbXB3aWR0aCBmcmFtZXJhdGUgbmZyYW1lcyBjb21wdHlwZSBjb21wbmFtZScpCiAKK19haWZjX3BhcmFtcy5uY2hhbm5lbHMuX19kb2NfXyA9ICdOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgKDEgZm9yIG1vbm8sIDIgZm9yIHN0ZXJlbyknCitfYWlmY19wYXJhbXMuc2FtcHdpZHRoLl9fZG9jX18gPSAnU2FtcGxlIHdpZHRoIGluIGJ5dGVzJworX2FpZmNfcGFyYW1zLmZyYW1lcmF0ZS5fX2RvY19fID0gJ1NhbXBsaW5nIGZyZXF1ZW5jeScKK19haWZjX3BhcmFtcy5uZnJhbWVzLl9fZG9jX18gPSAnTnVtYmVyIG9mIGF1ZGlvIGZyYW1lcycKK19haWZjX3BhcmFtcy5jb21wdHlwZS5fX2RvY19fID0gJ0NvbXByZXNzaW9uIHR5cGUgKCJOT05FIiBmb3IgQUlGRiBmaWxlcyknCitfYWlmY19wYXJhbXMuY29tcG5hbWUuX19kb2NfXyA9ICgiIiJcCitBIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGNvbXByZXNzaW9uIHR5cGUKKygnbm90IGNvbXByZXNzZWQnIGZvciBBSUZGIGZpbGVzKSIiIikKKwogCiBjbGFzcyBBaWZjX3JlYWQ6CiAgICAgIyBWYXJpYWJsZXMgdXNlZCBpbiB0aGlzIGNsYXNzOgpkaWZmIC0tZ2l0IGEvTGliL2FyZ3BhcnNlLnB5IGIvTGliL2FyZ3BhcnNlLnB5CmluZGV4IDlhMDY3MTkuLjIwOWI0ZTkgMTAwNjQ0Ci0tLSBhL0xpYi9hcmdwYXJzZS5weQorKysgYi9MaWIvYXJncGFyc2UucHkKQEAgLTExOCwxMCArMTE4LDE2IEBACiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICB0eXBlX25hbWUgPSB0eXBlKHNlbGYpLl9fbmFtZV9fCiAgICAgICAgIGFyZ19zdHJpbmdzID0gW10KKyAgICAgICAgc3Rhcl9hcmdzID0ge30KICAgICAgICAgZm9yIGFyZyBpbiBzZWxmLl9nZXRfYXJncygpOgogICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKHJlcHIoYXJnKSkKICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNlbGYuX2dldF9rd2FyZ3MoKToKLSAgICAgICAgICAgIGFyZ19zdHJpbmdzLmFwcGVuZCgnJXM9JXInICUgKG5hbWUsIHZhbHVlKSkKKyAgICAgICAgICAgIGlmIG5hbWUuaXNpZGVudGlmaWVyKCk6CisgICAgICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKCclcz0lcicgJSAobmFtZSwgdmFsdWUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFyX2FyZ3NbbmFtZV0gPSB2YWx1ZQorICAgICAgICBpZiBzdGFyX2FyZ3M6CisgICAgICAgICAgICBhcmdfc3RyaW5ncy5hcHBlbmQoJyoqJXMnICUgcmVwcihzdGFyX2FyZ3MpKQogICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAodHlwZV9uYW1lLCAnLCAnLmpvaW4oYXJnX3N0cmluZ3MpKQogCiAgICAgZGVmIF9nZXRfa3dhcmdzKHNlbGYpOgpAQCAtMjA0LDggKzIxMCw2IEBACiAgICAgICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5faW5kZW50KCkKICAgICAgICAgICAgIGpvaW4gPSBzZWxmLmZvcm1hdHRlci5fam9pbl9wYXJ0cwotICAgICAgICAgICAgZm9yIGZ1bmMsIGFyZ3MgaW4gc2VsZi5pdGVtczoKLSAgICAgICAgICAgICAgICBmdW5jKCphcmdzKQogICAgICAgICAgICAgaXRlbV9oZWxwID0gam9pbihbZnVuYygqYXJncykgZm9yIGZ1bmMsIGFyZ3MgaW4gc2VsZi5pdGVtc10pCiAgICAgICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5fZGVkZW50KCkKZGlmZiAtLWdpdCBhL0xpYi9hc3QucHkgYi9MaWIvYXN0LnB5CmluZGV4IDAxNzA0NzIuLjE1NmExZjIgMTAwNjQ0Ci0tLSBhL0xpYi9hc3QucHkKKysrIGIvTGliL2FzdC5weQpAQCAtMzUsNiArMzUsOCBAQAogICAgIHJldHVybiBjb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsIG1vZGUsIFB5Q0ZfT05MWV9BU1QpCiAKIAorX05VTV9UWVBFUyA9IChpbnQsIGZsb2F0LCBjb21wbGV4KQorCiBkZWYgbGl0ZXJhbF9ldmFsKG5vZGVfb3Jfc3RyaW5nKToKICAgICAiIiIKICAgICBTYWZlbHkgZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiBub2RlIG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBQeXRob24KQEAgLTQ3LDcgKzQ5LDkgQEAKICAgICBpZiBpc2luc3RhbmNlKG5vZGVfb3Jfc3RyaW5nLCBFeHByZXNzaW9uKToKICAgICAgICAgbm9kZV9vcl9zdHJpbmcgPSBub2RlX29yX3N0cmluZy5ib2R5CiAgICAgZGVmIF9jb252ZXJ0KG5vZGUpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIChTdHIsIEJ5dGVzKSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgQ29uc3RhbnQpOgorICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIChTdHIsIEJ5dGVzKSk6CiAgICAgICAgICAgICByZXR1cm4gbm9kZS5zCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBOdW0pOgogICAgICAgICAgICAgcmV0dXJuIG5vZGUubgpAQCAtNjIsMjQgKzY2LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbiB6aXAobm9kZS5rZXlzLCBub2RlLnZhbHVlcykpCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBOYW1lQ29uc3RhbnQpOgogICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFVuYXJ5T3ApIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLm9wLCAoVUFkZCwgVVN1YikpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLm9wZXJhbmQsIChOdW0sIFVuYXJ5T3AsIEJpbk9wKSk6CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBVbmFyeU9wKSBhbmQgaXNpbnN0YW5jZShub2RlLm9wLCAoVUFkZCwgVVN1YikpOgogICAgICAgICAgICAgb3BlcmFuZCA9IF9jb252ZXJ0KG5vZGUub3BlcmFuZCkKLSAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5vcCwgVUFkZCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICsgb3BlcmFuZAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gLSBvcGVyYW5kCi0gICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBCaW5PcCkgYW5kIFwKLSAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUub3AsIChBZGQsIFN1YikpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLnJpZ2h0LCAoTnVtLCBVbmFyeU9wLCBCaW5PcCkpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLmxlZnQsIChOdW0sIFVuYXJ5T3AsIEJpbk9wKSk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9wZXJhbmQsIF9OVU1fVFlQRVMpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5vcCwgVUFkZCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiArIG9wZXJhbmQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLSBvcGVyYW5kCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBCaW5PcCkgYW5kIGlzaW5zdGFuY2Uobm9kZS5vcCwgKEFkZCwgU3ViKSk6CiAgICAgICAgICAgICBsZWZ0ID0gX2NvbnZlcnQobm9kZS5sZWZ0KQogICAgICAgICAgICAgcmlnaHQgPSBfY29udmVydChub2RlLnJpZ2h0KQotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm9wLCBBZGQpOgotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgcmlnaHQKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodAorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsZWZ0LCBfTlVNX1RZUEVTKSBhbmQgaXNpbnN0YW5jZShyaWdodCwgX05VTV9UWVBFUyk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm9wLCBBZGQpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIHJpZ2h0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtYWxmb3JtZWQgbm9kZSBvciBzdHJpbmc6ICcgKyByZXByKG5vZGUpKQogICAgIHJldHVybiBfY29udmVydChub2RlX29yX3N0cmluZykKIApAQCAtMTk2LDEyICsxOTcsMTkgQEAKICAgICAiIiIKICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCAoQXN5bmNGdW5jdGlvbkRlZiwgRnVuY3Rpb25EZWYsIENsYXNzRGVmLCBNb2R1bGUpKToKICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlciBjYW4ndCBoYXZlIGRvY3N0cmluZ3MiICUgbm9kZS5fX2NsYXNzX18uX19uYW1lX18pCi0gICAgaWYgbm9kZS5ib2R5IGFuZCBpc2luc3RhbmNlKG5vZGUuYm9keVswXSwgRXhwcikgYW5kIFwKLSAgICAgICBpc2luc3RhbmNlKG5vZGUuYm9keVswXS52YWx1ZSwgU3RyKToKLSAgICAgICAgaWYgY2xlYW46Ci0gICAgICAgICAgICBpbXBvcnQgaW5zcGVjdAotICAgICAgICAgICAgcmV0dXJuIGluc3BlY3QuY2xlYW5kb2Mobm9kZS5ib2R5WzBdLnZhbHVlLnMpCi0gICAgICAgIHJldHVybiBub2RlLmJvZHlbMF0udmFsdWUucworICAgIGlmIG5vdChub2RlLmJvZHkgYW5kIGlzaW5zdGFuY2Uobm9kZS5ib2R5WzBdLCBFeHByKSk6CisgICAgICAgIHJldHVybgorICAgIG5vZGUgPSBub2RlLmJvZHlbMF0udmFsdWUKKyAgICBpZiBpc2luc3RhbmNlKG5vZGUsIFN0cik6CisgICAgICAgIHRleHQgPSBub2RlLnMKKyAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgQ29uc3RhbnQpIGFuZCBpc2luc3RhbmNlKG5vZGUudmFsdWUsIHN0cik6CisgICAgICAgIHRleHQgPSBub2RlLnZhbHVlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuCisgICAgaWYgY2xlYW46CisgICAgICAgIGltcG9ydCBpbnNwZWN0CisgICAgICAgIHRleHQgPSBpbnNwZWN0LmNsZWFuZG9jKHRleHQpCisgICAgcmV0dXJuIHRleHQKIAogCiBkZWYgd2Fsayhub2RlKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2hhdC5weSBiL0xpYi9hc3luY2hhdC5weQppbmRleCBmNzI4ZDFiLi5mYzExNDZhIDEwMDY0NAotLS0gYS9MaWIvYXN5bmNoYXQucHkKKysrIGIvTGliL2FzeW5jaGF0LnB5CkBAIC0yODUsMzUgKzI4NSw2IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAKIAotY2xhc3MgZmlmbzoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbGlzdD1Ob25lKToKLSAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgIHdhcm5pbmdzLndhcm4oJ2ZpZm8gY2xhc3Mgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjYnLAotICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotICAgICAgICBpZiBub3QgbGlzdDoKLSAgICAgICAgICAgIHNlbGYubGlzdCA9IGRlcXVlKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubGlzdCA9IGRlcXVlKGxpc3QpCi0KLSAgICBkZWYgX19sZW5fXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGxlbihzZWxmLmxpc3QpCi0KLSAgICBkZWYgaXNfZW1wdHkoc2VsZik6Ci0gICAgICAgIHJldHVybiBub3Qgc2VsZi5saXN0Ci0KLSAgICBkZWYgZmlyc3Qoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmxpc3RbMF0KLQotICAgIGRlZiBwdXNoKHNlbGYsIGRhdGEpOgotICAgICAgICBzZWxmLmxpc3QuYXBwZW5kKGRhdGEpCi0KLSAgICBkZWYgcG9wKHNlbGYpOgotICAgICAgICBpZiBzZWxmLmxpc3Q6Ci0gICAgICAgICAgICByZXR1cm4gKDEsIHNlbGYubGlzdC5wb3BsZWZ0KCkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gKDAsIE5vbmUpCi0KLQogIyBHaXZlbiAnaGF5c3RhY2snLCBzZWUgaWYgYW55IHByZWZpeCBvZiAnbmVlZGxlJyBpcyBhdCBpdHMgZW5kLiAgVGhpcwogIyBhc3N1bWVzIGFuIGV4YWN0IG1hdGNoIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZC4gIFJldHVybiB0aGUgbnVtYmVyIG9mCiAjIGNoYXJhY3RlcnMgbWF0Y2hlZC4KZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL2Jhc2VfZXZlbnRzLnB5IGIvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKaW5kZXggMDE3NDM3NS4uYjQyMDU4NiAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKKysrIGIvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKQEAgLTEzLDcgKzEzLDYgQEAKIHRvIG1vZGlmeSB0aGUgbWVhbmluZyBvZiB0aGUgQVBJIGNhbGwgaXRzZWxmLgogIiIiCiAKLQogaW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgY29uY3VycmVudC5mdXR1cmVzCiBpbXBvcnQgaGVhcHEKQEAgLTI4LDYgKzI3LDcgQEAKIGltcG9ydCB0cmFjZWJhY2sKIGltcG9ydCBzeXMKIGltcG9ydCB3YXJuaW5ncworaW1wb3J0IHdlYWtyZWYKIAogZnJvbSAuIGltcG9ydCBjb21wYXQKIGZyb20gLiBpbXBvcnQgY29yb3V0aW5lcwpAQCAtMjQyLDYgKzI0MiwxMyBAQAogICAgICAgICBzZWxmLl90YXNrX2ZhY3RvcnkgPSBOb25lCiAgICAgICAgIHNlbGYuX2Nvcm91dGluZV93cmFwcGVyX3NldCA9IEZhbHNlCiAKKyAgICAgICAgIyBBIHdlYWsgc2V0IG9mIGFsbCBhc3luY2hyb25vdXMgZ2VuZXJhdG9ycyB0aGF0IGFyZSBiZWluZyBpdGVyYXRlZAorICAgICAgICAjIGJ5IHRoZSBsb29wLgorICAgICAgICBzZWxmLl9hc3luY2dlbnMgPSB3ZWFrcmVmLldlYWtTZXQoKQorCisgICAgICAgICMgU2V0IHRvIFRydWUgd2hlbiBgbG9vcC5zaHV0ZG93bl9hc3luY2dlbnNgIGlzIGNhbGxlZC4KKyAgICAgICAgc2VsZi5fYXN5bmNnZW5zX3NodXRkb3duX2NhbGxlZCA9IEZhbHNlCisKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAoJzwlcyBydW5uaW5nPSVzIGNsb3NlZD0lcyBkZWJ1Zz0lcz4nCiAgICAgICAgICAgICAgICAgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuaXNfcnVubmluZygpLApAQCAtMzMzLDYgKzM0MCw0NiBAQAogICAgICAgICBpZiBzZWxmLl9jbG9zZWQ6CiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0V2ZW50IGxvb3AgaXMgY2xvc2VkJykKIAorICAgIGRlZiBfYXN5bmNnZW5fZmluYWxpemVyX2hvb2soc2VsZiwgYWdlbik6CisgICAgICAgIHNlbGYuX2FzeW5jZ2Vucy5kaXNjYXJkKGFnZW4pCisgICAgICAgIGlmIG5vdCBzZWxmLmlzX2Nsb3NlZCgpOgorICAgICAgICAgICAgc2VsZi5jcmVhdGVfdGFzayhhZ2VuLmFjbG9zZSgpKQorCisgICAgZGVmIF9hc3luY2dlbl9maXJzdGl0ZXJfaG9vayhzZWxmLCBhZ2VuKToKKyAgICAgICAgaWYgc2VsZi5fYXN5bmNnZW5zX3NodXRkb3duX2NhbGxlZDoKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgImFzeW5jaHJvbm91cyBnZW5lcmF0b3IgeyFyfSB3YXMgc2NoZWR1bGVkIGFmdGVyICIKKyAgICAgICAgICAgICAgICAibG9vcC5zaHV0ZG93bl9hc3luY2dlbnMoKSBjYWxsIi5mb3JtYXQoYWdlbiksCisgICAgICAgICAgICAgICAgUmVzb3VyY2VXYXJuaW5nLCBzb3VyY2U9c2VsZikKKworICAgICAgICBzZWxmLl9hc3luY2dlbnMuYWRkKGFnZW4pCisKKyAgICBAY29yb3V0aW5lCisgICAgZGVmIHNodXRkb3duX2FzeW5jZ2VucyhzZWxmKToKKyAgICAgICAgIiIiU2h1dGRvd24gYWxsIGFjdGl2ZSBhc3luY2hyb25vdXMgZ2VuZXJhdG9ycy4iIiIKKyAgICAgICAgc2VsZi5fYXN5bmNnZW5zX3NodXRkb3duX2NhbGxlZCA9IFRydWUKKworICAgICAgICBpZiBub3QgbGVuKHNlbGYuX2FzeW5jZ2Vucyk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBjbG9zaW5nX2FnZW5zID0gbGlzdChzZWxmLl9hc3luY2dlbnMpCisgICAgICAgIHNlbGYuX2FzeW5jZ2Vucy5jbGVhcigpCisKKyAgICAgICAgc2h1dGRvd25fY29ybyA9IHRhc2tzLmdhdGhlcigKKyAgICAgICAgICAgICpbYWcuYWNsb3NlKCkgZm9yIGFnIGluIGNsb3NpbmdfYWdlbnNdLAorICAgICAgICAgICAgcmV0dXJuX2V4Y2VwdGlvbnM9VHJ1ZSwKKyAgICAgICAgICAgIGxvb3A9c2VsZikKKworICAgICAgICByZXN1bHRzID0geWllbGQgZnJvbSBzaHV0ZG93bl9jb3JvCisgICAgICAgIGZvciByZXN1bHQsIGFnZW4gaW4gemlwKHJlc3VsdHMsIGNsb3NpbmdfYWdlbnMpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXN1bHQsIEV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgc2VsZi5jYWxsX2V4Y2VwdGlvbl9oYW5kbGVyKHsKKyAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiAnYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNsb3Npbmcgb2YgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc3luY2hyb25vdXMgZ2VuZXJhdG9yIHshcn0nLmZvcm1hdChhZ2VuKSwKKyAgICAgICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbic6IHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgJ2FzeW5jZ2VuJzogYWdlbgorICAgICAgICAgICAgICAgIH0pCisKICAgICBkZWYgcnVuX2ZvcmV2ZXIoc2VsZik6CiAgICAgICAgICIiIlJ1biB1bnRpbCBzdG9wKCkgaXMgY2FsbGVkLiIiIgogICAgICAgICBzZWxmLl9jaGVja19jbG9zZWQoKQpAQCAtMzQwLDYgKzM4Nyw5IEBACiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0V2ZW50IGxvb3AgaXMgcnVubmluZy4nKQogICAgICAgICBzZWxmLl9zZXRfY29yb3V0aW5lX3dyYXBwZXIoc2VsZi5fZGVidWcpCiAgICAgICAgIHNlbGYuX3RocmVhZF9pZCA9IHRocmVhZGluZy5nZXRfaWRlbnQoKQorICAgICAgICBvbGRfYWdlbl9ob29rcyA9IHN5cy5nZXRfYXN5bmNnZW5faG9va3MoKQorICAgICAgICBzeXMuc2V0X2FzeW5jZ2VuX2hvb2tzKGZpcnN0aXRlcj1zZWxmLl9hc3luY2dlbl9maXJzdGl0ZXJfaG9vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZXI9c2VsZi5fYXN5bmNnZW5fZmluYWxpemVyX2hvb2spCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgc2VsZi5fcnVuX29uY2UoKQpAQCAtMzQ5LDYgKzM5OSw3IEBACiAgICAgICAgICAgICBzZWxmLl9zdG9wcGluZyA9IEZhbHNlCiAgICAgICAgICAgICBzZWxmLl90aHJlYWRfaWQgPSBOb25lCiAgICAgICAgICAgICBzZWxmLl9zZXRfY29yb3V0aW5lX3dyYXBwZXIoRmFsc2UpCisgICAgICAgICAgICBzeXMuc2V0X2FzeW5jZ2VuX2hvb2tzKCpvbGRfYWdlbl9ob29rcykKIAogICAgIGRlZiBydW5fdW50aWxfY29tcGxldGUoc2VsZiwgZnV0dXJlKToKICAgICAgICAgIiIiUnVuIHVudGlsIHRoZSBGdXR1cmUgaXMgZG9uZS4KQEAgLTQyNiw3ICs0NzcsOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlzX2Nsb3NlZCgpOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGV2ZW50IGxvb3AgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGV2ZW50IGxvb3AgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfcnVubmluZygpOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIApAQCAtMTA2OCw3ICsxMTIwLDcgQEAKICAgICAgICAgdHJhbnNwb3J0ID0geWllbGQgZnJvbSBzZWxmLl9tYWtlX3N1YnByb2Nlc3NfdHJhbnNwb3J0KAogICAgICAgICAgICAgcHJvdG9jb2wsIGNtZCwgVHJ1ZSwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBidWZzaXplLCAqKmt3YXJncykKICAgICAgICAgaWYgc2VsZi5fZGVidWc6Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygnJXM6ICVyJyAlIChkZWJ1Z19sb2csIHRyYW5zcG9ydCkpCisgICAgICAgICAgICBsb2dnZXIuaW5mbygnJXM6ICVyJywgZGVidWdfbG9nLCB0cmFuc3BvcnQpCiAgICAgICAgIHJldHVybiB0cmFuc3BvcnQsIHByb3RvY29sCiAKICAgICBAY29yb3V0aW5lCkBAIC0xMDk4LDcgKzExNTAsNyBAQAogICAgICAgICAgICAgcHJvdG9jb2wsIHBvcGVuX2FyZ3MsIEZhbHNlLCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsCiAgICAgICAgICAgICBidWZzaXplLCAqKmt3YXJncykKICAgICAgICAgaWYgc2VsZi5fZGVidWc6Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygnJXM6ICVyJyAlIChkZWJ1Z19sb2csIHRyYW5zcG9ydCkpCisgICAgICAgICAgICBsb2dnZXIuaW5mbygnJXM6ICVyJywgZGVidWdfbG9nLCB0cmFuc3BvcnQpCiAgICAgICAgIHJldHVybiB0cmFuc3BvcnQsIHByb3RvY29sCiAKICAgICBkZWYgZ2V0X2V4Y2VwdGlvbl9oYW5kbGVyKHNlbGYpOgpAQCAtMTE3OCw3ICsxMjMwLDkgQEAKICAgICAgICAgLSAnaGFuZGxlJyAob3B0aW9uYWwpOiBIYW5kbGUgaW5zdGFuY2U7CiAgICAgICAgIC0gJ3Byb3RvY29sJyAob3B0aW9uYWwpOiBQcm90b2NvbCBpbnN0YW5jZTsKICAgICAgICAgLSAndHJhbnNwb3J0JyAob3B0aW9uYWwpOiBUcmFuc3BvcnQgaW5zdGFuY2U7Ci0gICAgICAgIC0gJ3NvY2tldCcgKG9wdGlvbmFsKTogU29ja2V0IGluc3RhbmNlLgorICAgICAgICAtICdzb2NrZXQnIChvcHRpb25hbCk6IFNvY2tldCBpbnN0YW5jZTsKKyAgICAgICAgLSAnYXN5bmNnZW4nIChvcHRpb25hbCk6IEFzeW5jaHJvbm91cyBnZW5lcmF0b3IgdGhhdCBjYXVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBleGNlcHRpb24uCiAKICAgICAgICAgTmV3IGtleXMgbWF5YmUgaW50cm9kdWNlZCBpbiB0aGUgZnV0dXJlLgogCmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby9iYXNlX3N1YnByb2Nlc3MucHkgYi9MaWIvYXN5bmNpby9iYXNlX3N1YnByb2Nlc3MucHkKaW5kZXggOGZjMjUzYy4uZmI4YzJiYSAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vYmFzZV9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi9hc3luY2lvL2Jhc2Vfc3VicHJvY2Vzcy5weQpAQCAtMTIyLDcgKzEyMiw4IEBACiAgICAgaWYgY29tcGF0LlBZMzQ6CiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgbm90IHNlbGYuX2Nsb3NlZDoKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c2VsZikKICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgIGRlZiBnZXRfcGlkKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vY29yb3V0aW5lcy5weSBiL0xpYi9hc3luY2lvL2Nvcm91dGluZXMucHkKaW5kZXggNzFiYzZmYi4uOWMzMzhiMCAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vY29yb3V0aW5lcy5weQorKysgYi9MaWIvYXN5bmNpby9jb3JvdXRpbmVzLnB5CkBAIC0yNzYsNyArMjc2LDEwIEBACiAgICAgdHJ5OgogICAgICAgICBjb3JvX2NvZGUgPSBjb3JvLmdpX2NvZGUKICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgIGNvcm9fY29kZSA9IGNvcm8uY3JfY29kZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb3JvX2NvZGUgPSBjb3JvLmNyX2NvZGUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIHJlcHIoY29ybykKIAogICAgIHRyeToKICAgICAgICAgY29yb19mcmFtZSA9IGNvcm8uZ2lfZnJhbWUKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL2V2ZW50cy5weSBiL0xpYi9hc3luY2lvL2V2ZW50cy5weQppbmRleCBjNDhjNWJlLi5jYzlhOTg2IDEwMDY0NAotLS0gYS9MaWIvYXN5bmNpby9ldmVudHMucHkKKysrIGIvTGliL2FzeW5jaW8vZXZlbnRzLnB5CkBAIC0yNDgsNiArMjQ4LDEwIEBACiAgICAgICAgICIiIgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAKKyAgICBkZWYgc2h1dGRvd25fYXN5bmNnZW5zKHNlbGYpOgorICAgICAgICAiIiJTaHV0ZG93biBhbGwgYWN0aXZlIGFzeW5jaHJvbm91cyBnZW5lcmF0b3JzLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKICAgICAjIE1ldGhvZHMgc2NoZWR1bGluZyBjYWxsYmFja3MuICBBbGwgdGhlc2UgcmV0dXJuIEhhbmRsZXMuCiAKICAgICBkZWYgX3RpbWVyX2hhbmRsZV9jYW5jZWxsZWQoc2VsZiwgaGFuZGxlKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL3Byb2FjdG9yX2V2ZW50cy5weSBiL0xpYi9hc3luY2lvL3Byb2FjdG9yX2V2ZW50cy5weQppbmRleCAzYWMzMTRjLi40YjYwNjdhIDEwMDY0NAotLS0gYS9MaWIvYXN5bmNpby9wcm9hY3Rvcl9ldmVudHMucHkKKysrIGIvTGliL2FzeW5jaW8vcHJvYWN0b3JfZXZlbnRzLnB5CkBAIC04Niw3ICs4Niw4IEBACiAgICAgaWYgY29tcGF0LlBZMzQ6CiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgc2VsZi5fc29jayBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c2VsZikKICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgIGRlZiBfZmF0YWxfZXJyb3Ioc2VsZiwgZXhjLCBtZXNzYWdlPSdGYXRhbCBlcnJvciBvbiBwaXBlIHRyYW5zcG9ydCcpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vc2VsZWN0b3JfZXZlbnRzLnB5IGIvTGliL2FzeW5jaW8vc2VsZWN0b3JfZXZlbnRzLnB5CmluZGV4IGVkMmI0ZDcuLjM0Y2NlNmIgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3NlbGVjdG9yX2V2ZW50cy5weQorKysgYi9MaWIvYXN5bmNpby9zZWxlY3Rvcl9ldmVudHMucHkKQEAgLTU3OSw3ICs1NzksOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIHNlbGYuX3NvY2sgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZykKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgc2VsZi5fc29jay5jbG9zZSgpCiAKICAgICBkZWYgX2ZhdGFsX2Vycm9yKHNlbGYsIGV4YywgbWVzc2FnZT0nRmF0YWwgZXJyb3Igb24gdHJhbnNwb3J0Jyk6CmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby9zc2xwcm90by5weSBiL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CmluZGV4IDMzZDVkZTIuLmYwZjY0MmUgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CisrKyBiL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CkBAIC0zMjUsNyArMzI1LDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fY2xvc2VkOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogCiAgICAgZGVmIHBhdXNlX3JlYWRpbmcoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby91bml4X2V2ZW50cy5weSBiL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CmluZGV4IDE4NTE5ZmMuLmQxODNmNjAgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CisrKyBiL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CkBAIC0zODcsNyArMzg3LDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBzZWxmLl9waXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuX3BpcGUuY2xvc2UoKQogCiAgICAgZGVmIF9mYXRhbF9lcnJvcihzZWxmLCBleGMsIG1lc3NhZ2U9J0ZhdGFsIGVycm9yIG9uIHBpcGUgdHJhbnNwb3J0Jyk6CkBAIC01ODQsNyArNTg1LDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBzZWxmLl9waXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuX3BpcGUuY2xvc2UoKQogCiAgICAgZGVmIGFib3J0KHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vd2luZG93c191dGlscy5weSBiL0xpYi9hc3luY2lvL3dpbmRvd3NfdXRpbHMucHkKaW5kZXggODcwY2QxMy4uN2M2M2ZiOSAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vd2luZG93c191dGlscy5weQorKysgYi9MaWIvYXN5bmNpby93aW5kb3dzX3V0aWxzLnB5CkBAIC0xNTksNyArMTU5LDggQEAKIAogICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICBpZiBzZWxmLl9oYW5kbGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jb3JlLnB5IGIvTGliL2FzeW5jb3JlLnB5CmluZGV4IDNiNTFmMGYuLjcwNWU0MDYgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY29yZS5weQorKysgYi9MaWIvYXN5bmNvcmUucHkKQEAgLTMzMyw3ICszMzMsNyBAQAogICAgICAgICBzZWxmLmNvbm5lY3RpbmcgPSBUcnVlCiAgICAgICAgIGVyciA9IHNlbGYuc29ja2V0LmNvbm5lY3RfZXgoYWRkcmVzcykKICAgICAgICAgaWYgZXJyIGluIChFSU5QUk9HUkVTUywgRUFMUkVBRFksIEVXT1VMREJMT0NLKSBcCi0gICAgICAgIG9yIGVyciA9PSBFSU5WQUwgYW5kIG9zLm5hbWUgaW4gKCdudCcsICdjZScpOgorICAgICAgICBvciBlcnIgPT0gRUlOVkFMIGFuZCBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICBzZWxmLmFkZHIgPSBhZGRyZXNzCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgaWYgZXJyIGluICgwLCBFSVNDT05OKToKQEAgLTU5NSw3ICs1OTUsOCBAQAogCiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgc2VsZi5mZCA+PSAwOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGZpbGUgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGZpbGUgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgICAgICBkZWYgcmVjdihzZWxmLCAqYXJncyk6CmRpZmYgLS1naXQgYS9MaWIvYmFzZTY0LnB5IGIvTGliL2Jhc2U2NC5weQppbmRleCBhZGFlYzFkLi42N2U1NGYwIDEwMDc1NQotLS0gYS9MaWIvYmFzZTY0LnB5CisrKyBiL0xpYi9iYXNlNjQucHkKQEAgLTU1LDggKzU1LDcgQEAKICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldCBmb3IgdGhlICcrJyBhbmQgJy8nIGNoYXJhY3RlcnMuICBUaGlzIGFsbG93cyBhbgogICAgIGFwcGxpY2F0aW9uIHRvIGUuZy4gZ2VuZXJhdGUgdXJsIG9yIGZpbGVzeXN0ZW0gc2FmZSBCYXNlNjQgc3RyaW5ncy4KICAgICAiIiIKLSAgICAjIFN0cmlwIG9mZiB0aGUgdHJhaWxpbmcgbmV3bGluZQotICAgIGVuY29kZWQgPSBiaW5hc2NpaS5iMmFfYmFzZTY0KHMpWzotMV0KKyAgICBlbmNvZGVkID0gYmluYXNjaWkuYjJhX2Jhc2U2NChzLCBuZXdsaW5lPUZhbHNlKQogICAgIGlmIGFsdGNoYXJzIGlzIG5vdCBOb25lOgogICAgICAgICBhc3NlcnQgbGVuKGFsdGNoYXJzKSA9PSAyLCByZXByKGFsdGNoYXJzKQogICAgICAgICByZXR1cm4gZW5jb2RlZC50cmFuc2xhdGUoYnl0ZXMubWFrZXRyYW5zKGInKy8nLCBhbHRjaGFycykpCmRpZmYgLS1naXQgYS9MaWIvY2FsZW5kYXIucHkgYi9MaWIvY2FsZW5kYXIucHkKaW5kZXggNTI0NGI4ZC4uODViYWYyZSAxMDA2NDQKLS0tIGEvTGliL2NhbGVuZGFyLnB5CisrKyBiL0xpYi9jYWxlbmRhci5weQpAQCAtMTIsNyArMTIsOSBAQAogX19hbGxfXyA9IFsiSWxsZWdhbE1vbnRoRXJyb3IiLCAiSWxsZWdhbFdlZWtkYXlFcnJvciIsICJzZXRmaXJzdHdlZWtkYXkiLAogICAgICAgICAgICAiZmlyc3R3ZWVrZGF5IiwgImlzbGVhcCIsICJsZWFwZGF5cyIsICJ3ZWVrZGF5IiwgIm1vbnRocmFuZ2UiLAogICAgICAgICAgICAibW9udGhjYWxlbmRhciIsICJwcm1vbnRoIiwgIm1vbnRoIiwgInByY2FsIiwgImNhbGVuZGFyIiwKLSAgICAgICAgICAgInRpbWVnbSIsICJtb250aF9uYW1lIiwgIm1vbnRoX2FiYnIiLCAiZGF5X25hbWUiLCAiZGF5X2FiYnIiXQorICAgICAgICAgICAidGltZWdtIiwgIm1vbnRoX25hbWUiLCAibW9udGhfYWJiciIsICJkYXlfbmFtZSIsICJkYXlfYWJiciIsCisgICAgICAgICAgICJDYWxlbmRhciIsICJUZXh0Q2FsZW5kYXIiLCAiSFRNTENhbGVuZGFyIiwgIkxvY2FsZVRleHRDYWxlbmRhciIsCisgICAgICAgICAgICJMb2NhbGVIVE1MQ2FsZW5kYXIiLCAid2Vla2hlYWRlciJdCiAKICMgRXhjZXB0aW9uIHJhaXNlZCBmb3IgYmFkIGlucHV0ICh3aXRoIHN0cmluZyBwYXJhbWV0ZXIgZm9yIGRldGFpbHMpCiBlcnJvciA9IFZhbHVlRXJyb3IKQEAgLTYwNSw1MSArNjA3LDYzIEBACiAKIAogZGVmIG1haW4oYXJncyk6Ci0gICAgaW1wb3J0IG9wdHBhcnNlCi0gICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSJ1c2FnZTogJXByb2cgW29wdGlvbnNdIFt5ZWFyIFttb250aF1dIikKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBpbXBvcnQgYXJncGFyc2UKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgdGV4dGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgndGV4dCBvbmx5IGFyZ3VtZW50cycpCisgICAgaHRtbGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnaHRtbCBvbmx5IGFyZ3VtZW50cycpCisgICAgdGV4dGdyb3VwLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi13IiwgIi0td2lkdGgiLAotICAgICAgICBkZXN0PSJ3aWR0aCIsIHR5cGU9ImludCIsIGRlZmF1bHQ9MiwKLSAgICAgICAgaGVscD0id2lkdGggb2YgZGF0ZSBjb2x1bW4gKGRlZmF1bHQgMiwgdGV4dCBvbmx5KSIKKyAgICAgICAgdHlwZT1pbnQsIGRlZmF1bHQ9MiwKKyAgICAgICAgaGVscD0id2lkdGggb2YgZGF0ZSBjb2x1bW4gKGRlZmF1bHQgMikiCiAgICAgKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgIHRleHRncm91cC5hZGRfYXJndW1lbnQoCiAgICAgICAgICItbCIsICItLWxpbmVzIiwKLSAgICAgICAgZGVzdD0ibGluZXMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTEsCi0gICAgICAgIGhlbHA9Im51bWJlciBvZiBsaW5lcyBmb3IgZWFjaCB3ZWVrIChkZWZhdWx0IDEsIHRleHQgb25seSkiCisgICAgICAgIHR5cGU9aW50LCBkZWZhdWx0PTEsCisgICAgICAgIGhlbHA9Im51bWJlciBvZiBsaW5lcyBmb3IgZWFjaCB3ZWVrIChkZWZhdWx0IDEpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICB0ZXh0Z3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLXMiLCAiLS1zcGFjaW5nIiwKLSAgICAgICAgZGVzdD0ic3BhY2luZyIsIHR5cGU9ImludCIsIGRlZmF1bHQ9NiwKLSAgICAgICAgaGVscD0ic3BhY2luZyBiZXR3ZWVuIG1vbnRocyAoZGVmYXVsdCA2LCB0ZXh0IG9ubHkpIgorICAgICAgICB0eXBlPWludCwgZGVmYXVsdD02LAorICAgICAgICBoZWxwPSJzcGFjaW5nIGJldHdlZW4gbW9udGhzIChkZWZhdWx0IDYpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICB0ZXh0Z3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLW0iLCAiLS1tb250aHMiLAotICAgICAgICBkZXN0PSJtb250aHMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTMsCi0gICAgICAgIGhlbHA9Im1vbnRocyBwZXIgcm93IChkZWZhdWx0IDMsIHRleHQgb25seSkiCisgICAgICAgIHR5cGU9aW50LCBkZWZhdWx0PTMsCisgICAgICAgIGhlbHA9Im1vbnRocyBwZXIgcm93IChkZWZhdWx0IDMpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBodG1sZ3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLWMiLCAiLS1jc3MiLAotICAgICAgICBkZXN0PSJjc3MiLCBkZWZhdWx0PSJjYWxlbmRhci5jc3MiLAotICAgICAgICBoZWxwPSJDU1MgdG8gdXNlIGZvciBwYWdlIChodG1sIG9ubHkpIgorICAgICAgICBkZWZhdWx0PSJjYWxlbmRhci5jc3MiLAorICAgICAgICBoZWxwPSJDU1MgdG8gdXNlIGZvciBwYWdlIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLUwiLCAiLS1sb2NhbGUiLAotICAgICAgICBkZXN0PSJsb2NhbGUiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgaGVscD0ibG9jYWxlIHRvIGJlIHVzZWQgZnJvbSBtb250aCBhbmQgd2Vla2RheSBuYW1lcyIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1lIiwgIi0tZW5jb2RpbmciLAotICAgICAgICBkZXN0PSJlbmNvZGluZyIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgaGVscD0iRW5jb2RpbmcgdG8gdXNlIGZvciBvdXRwdXQuIgorICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgIGhlbHA9ImVuY29kaW5nIHRvIHVzZSBmb3Igb3V0cHV0IgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLXQiLCAiLS10eXBlIiwKLSAgICAgICAgZGVzdD0idHlwZSIsIGRlZmF1bHQ9InRleHQiLAorICAgICAgICBkZWZhdWx0PSJ0ZXh0IiwKICAgICAgICAgY2hvaWNlcz0oInRleHQiLCAiaHRtbCIpLAogICAgICAgICBoZWxwPSJvdXRwdXQgdHlwZSAodGV4dCBvciBodG1sKSIKICAgICApCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgInllYXIiLAorICAgICAgICBuYXJncz0nPycsIHR5cGU9aW50LAorICAgICAgICBoZWxwPSJ5ZWFyIG51bWJlciAoMS05OTk5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgIm1vbnRoIiwKKyAgICAgICAgbmFyZ3M9Jz8nLCB0eXBlPWludCwKKyAgICAgICAgaGVscD0ibW9udGggbnVtYmVyICgxLTEyLCB0ZXh0IG9ubHkpIgorICAgICkKIAotICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisgICAgb3B0aW9ucyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3NbMTpdKQogCiAgICAgaWYgb3B0aW9ucy5sb2NhbGUgYW5kIG5vdCBvcHRpb25zLmVuY29kaW5nOgogICAgICAgICBwYXJzZXIuZXJyb3IoImlmIC0tbG9jYWxlIGlzIHNwZWNpZmllZCAtLWVuY29kaW5nIGlzIHJlcXVpcmVkIikKQEAgLTY2NywxMCArNjgxLDEwIEBACiAgICAgICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQogICAgICAgICBvcHRkaWN0ID0gZGljdChlbmNvZGluZz1lbmNvZGluZywgY3NzPW9wdGlvbnMuY3NzKQogICAgICAgICB3cml0ZSA9IHN5cy5zdGRvdXQuYnVmZmVyLndyaXRlCi0gICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICBpZiBvcHRpb25zLnllYXIgaXMgTm9uZToKICAgICAgICAgICAgIHdyaXRlKGNhbC5mb3JtYXR5ZWFycGFnZShkYXRldGltZS5kYXRlLnRvZGF5KCkueWVhciwgKipvcHRkaWN0KSkKLSAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKLSAgICAgICAgICAgIHdyaXRlKGNhbC5mb3JtYXR5ZWFycGFnZShpbnQoYXJnc1sxXSksICoqb3B0ZGljdCkpCisgICAgICAgIGVsaWYgb3B0aW9ucy5tb250aCBpcyBOb25lOgorICAgICAgICAgICAgd3JpdGUoY2FsLmZvcm1hdHllYXJwYWdlKG9wdGlvbnMueWVhciwgKipvcHRkaWN0KSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHBhcnNlci5lcnJvcigiaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMiKQogICAgICAgICAgICAgc3lzLmV4aXQoMSkKQEAgLTY4MCwxOCArNjk0LDE1IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBjYWwgPSBUZXh0Q2FsZW5kYXIoKQogICAgICAgICBvcHRkaWN0ID0gZGljdCh3PW9wdGlvbnMud2lkdGgsIGw9b3B0aW9ucy5saW5lcykKLSAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDM6CisgICAgICAgIGlmIG9wdGlvbnMubW9udGggaXMgTm9uZToKICAgICAgICAgICAgIG9wdGRpY3RbImMiXSA9IG9wdGlvbnMuc3BhY2luZwogICAgICAgICAgICAgb3B0ZGljdFsibSJdID0gb3B0aW9ucy5tb250aHMKLSAgICAgICAgaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgIGlmIG9wdGlvbnMueWVhciBpcyBOb25lOgogICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIoZGF0ZXRpbWUuZGF0ZS50b2RheSgpLnllYXIsICoqb3B0ZGljdCkKLSAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKLSAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXR5ZWFyKGludChhcmdzWzFdKSwgKipvcHRkaWN0KQotICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAzOgotICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdG1vbnRoKGludChhcmdzWzFdKSwgaW50KGFyZ3NbMl0pLCAqKm9wdGRpY3QpCisgICAgICAgIGVsaWYgb3B0aW9ucy5tb250aCBpcyBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIob3B0aW9ucy55ZWFyLCAqKm9wdGRpY3QpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXJzZXIuZXJyb3IoImluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIikKLSAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgICAgICByZXN1bHQgPSBjYWwuZm9ybWF0bW9udGgob3B0aW9ucy55ZWFyLCBvcHRpb25zLm1vbnRoLCAqKm9wdGRpY3QpCiAgICAgICAgIHdyaXRlID0gc3lzLnN0ZG91dC53cml0ZQogICAgICAgICBpZiBvcHRpb25zLmVuY29kaW5nOgogICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmVuY29kZShvcHRpb25zLmVuY29kaW5nKQpkaWZmIC0tZ2l0IGEvTGliL2NnaS5weSBiL0xpYi9jZ2kucHkKaW5kZXggMTg5YzZkNS4uMjMzYTQ5NiAxMDA3NTUKLS0tIGEvTGliL2NnaS5weQorKysgYi9MaWIvY2dpLnB5CkBAIC00NSw3ICs0NSw3IEBACiAKIF9fYWxsX18gPSBbIk1pbmlGaWVsZFN0b3JhZ2UiLCAiRmllbGRTdG9yYWdlIiwKICAgICAgICAgICAgInBhcnNlIiwgInBhcnNlX3FzIiwgInBhcnNlX3FzbCIsICJwYXJzZV9tdWx0aXBhcnQiLAotICAgICAgICAgICAicGFyc2VfaGVhZGVyIiwgInByaW50X2V4Y2VwdGlvbiIsICJwcmludF9lbnZpcm9uIiwKKyAgICAgICAgICAgInBhcnNlX2hlYWRlciIsICJ0ZXN0IiwgInByaW50X2V4Y2VwdGlvbiIsICJwcmludF9lbnZpcm9uIiwKICAgICAgICAgICAgInByaW50X2Zvcm0iLCAicHJpbnRfZGlyZWN0b3J5IiwgInByaW50X2FyZ3VtZW50cyIsCiAgICAgICAgICAgICJwcmludF9lbnZpcm9uX3VzYWdlIiwgImVzY2FwZSJdCiAKZGlmZiAtLWdpdCBhL0xpYi9jb2RlLnB5IGIvTGliL2NvZGUucHkKaW5kZXggNTMyNDRlMy4uMjMyOTVmNCAxMDA2NDQKLS0tIGEvTGliL2NvZGUucHkKKysrIGIvTGliL2NvZGUucHkKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgICAgICAiIiJSZXNldCB0aGUgaW5wdXQgYnVmZmVyLiIiIgogICAgICAgICBzZWxmLmJ1ZmZlciA9IFtdCiAKLSAgICBkZWYgaW50ZXJhY3Qoc2VsZiwgYmFubmVyPU5vbmUpOgorICAgIGRlZiBpbnRlcmFjdChzZWxmLCBiYW5uZXI9Tm9uZSwgZXhpdG1zZz1Ob25lKToKICAgICAgICAgIiIiQ2xvc2VseSBlbXVsYXRlIHRoZSBpbnRlcmFjdGl2ZSBQeXRob24gY29uc29sZS4KIAogICAgICAgICBUaGUgb3B0aW9uYWwgYmFubmVyIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgYmFubmVyIHRvIHByaW50CkBAIC0xOTYsNiArMTk2LDExIEBACiAgICAgICAgIHRvIGNvbmZ1c2UgdGhpcyB3aXRoIHRoZSByZWFsIGludGVycHJldGVyIC0tIHNpbmNlIGl0J3Mgc28KICAgICAgICAgY2xvc2UhKS4KIAorICAgICAgICBUaGUgb3B0aW9uYWwgZXhpdG1zZyBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGV4aXQgbWVzc2FnZQorICAgICAgICBwcmludGVkIHdoZW4gZXhpdGluZy4gUGFzcyB0aGUgZW1wdHkgc3RyaW5nIHRvIHN1cHByZXNzCisgICAgICAgIHByaW50aW5nIGFuIGV4aXQgbWVzc2FnZS4gSWYgZXhpdG1zZyBpcyBub3QgZ2l2ZW4gb3IgTm9uZSwKKyAgICAgICAgYSBkZWZhdWx0IG1lc3NhZ2UgaXMgcHJpbnRlZC4KKwogICAgICAgICAiIiIKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc3lzLnBzMQpAQCAtMjMwLDYgKzIzNSwxMCBAQAogICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIlxuS2V5Ym9hcmRJbnRlcnJ1cHRcbiIpCiAgICAgICAgICAgICAgICAgc2VsZi5yZXNldGJ1ZmZlcigpCiAgICAgICAgICAgICAgICAgbW9yZSA9IDAKKyAgICAgICAgaWYgZXhpdG1zZyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi53cml0ZSgnbm93IGV4aXRpbmcgJXMuLi5cbicgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKKyAgICAgICAgZWxpZiBleGl0bXNnICE9ICcnOgorICAgICAgICAgICAgc2VsZi53cml0ZSgnJXNcbicgJSBleGl0bXNnKQogCiAgICAgZGVmIHB1c2goc2VsZiwgbGluZSk6CiAgICAgICAgICIiIlB1c2ggYSBsaW5lIHRvIHRoZSBpbnRlcnByZXRlci4KQEAgLTI2Nyw3ICsyNzYsNyBAQAogCiAKIAotZGVmIGludGVyYWN0KGJhbm5lcj1Ob25lLCByZWFkZnVuYz1Ob25lLCBsb2NhbD1Ob25lKToKK2RlZiBpbnRlcmFjdChiYW5uZXI9Tm9uZSwgcmVhZGZ1bmM9Tm9uZSwgbG9jYWw9Tm9uZSwgZXhpdG1zZz1Ob25lKToKICAgICAiIiJDbG9zZWx5IGVtdWxhdGUgdGhlIGludGVyYWN0aXZlIFB5dGhvbiBpbnRlcnByZXRlci4KIAogICAgIFRoaXMgaXMgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSBpbnRlcmZhY2UgdG8gdGhlIEludGVyYWN0aXZlQ29uc29sZQpAQCAtMjc5LDYgKzI4OCw3IEBACiAgICAgYmFubmVyIC0tIHBhc3NlZCB0byBJbnRlcmFjdGl2ZUNvbnNvbGUuaW50ZXJhY3QoKQogICAgIHJlYWRmdW5jIC0tIGlmIG5vdCBOb25lLCByZXBsYWNlcyBJbnRlcmFjdGl2ZUNvbnNvbGUucmF3X2lucHV0KCkKICAgICBsb2NhbCAtLSBwYXNzZWQgdG8gSW50ZXJhY3RpdmVJbnRlcnByZXRlci5fX2luaXRfXygpCisgICAgZXhpdG1zZyAtLSBwYXNzZWQgdG8gSW50ZXJhY3RpdmVDb25zb2xlLmludGVyYWN0KCkKIAogICAgICIiIgogICAgIGNvbnNvbGUgPSBJbnRlcmFjdGl2ZUNvbnNvbGUobG9jYWwpCkBAIC0yODksNyArMjk5LDcgQEAKICAgICAgICAgICAgIGltcG9ydCByZWFkbGluZQogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICBwYXNzCi0gICAgY29uc29sZS5pbnRlcmFjdChiYW5uZXIpCisgICAgY29uc29sZS5pbnRlcmFjdChiYW5uZXIsIGV4aXRtc2cpCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi9jb2xsZWN0aW9ucy9fX2luaXRfXy5weSBiL0xpYi9jb2xsZWN0aW9ucy9fX2luaXRfXy5weQppbmRleCBlYmU4ZWU3Li4wM2VjZWEyIDEwMDY0NAotLS0gYS9MaWIvY29sbGVjdGlvbnMvX19pbml0X18ucHkKKysrIGIvTGliL2NvbGxlY3Rpb25zL19faW5pdF9fLnB5CkBAIC0zNTMsNyArMzUzLDcgQEAKICAgICB7bmFtZX0gPSBfcHJvcGVydHkoX2l0ZW1nZXR0ZXIoe2luZGV4OmR9KSwgZG9jPSdBbGlhcyBmb3IgZmllbGQgbnVtYmVyIHtpbmRleDpkfScpCiAnJycKIAotZGVmIG5hbWVkdHVwbGUodHlwZW5hbWUsIGZpZWxkX25hbWVzLCB2ZXJib3NlPUZhbHNlLCByZW5hbWU9RmFsc2UpOgorZGVmIG5hbWVkdHVwbGUodHlwZW5hbWUsIGZpZWxkX25hbWVzLCAqLCB2ZXJib3NlPUZhbHNlLCByZW5hbWU9RmFsc2UpOgogICAgICIiIlJldHVybnMgYSBuZXcgc3ViY2xhc3Mgb2YgdHVwbGUgd2l0aCBuYW1lZCBmaWVsZHMuCiAKICAgICA+Pj4gUG9pbnQgPSBuYW1lZHR1cGxlKCdQb2ludCcsIFsneCcsICd5J10pCkBAIC0zOTMsNyArMzkzLDcgQEAKICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lc1tpbmRleF0gPSAnXyVkJyAlIGluZGV4CiAgICAgICAgICAgICBzZWVuLmFkZChuYW1lKQogICAgIGZvciBuYW1lIGluIFt0eXBlbmFtZV0gKyBmaWVsZF9uYW1lczoKLSAgICAgICAgaWYgdHlwZShuYW1lKSAhPSBzdHI6CisgICAgICAgIGlmIHR5cGUobmFtZSkgaXMgbm90IHN0cjoKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSBzdHJpbmdzJykKICAgICAgICAgaWYgbm90IG5hbWUuaXNpZGVudGlmaWVyKCk6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBtdXN0IGJlIHZhbGlkICcKQEAgLTg0Miw3ICs4NDIsNyBAQAogCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjICBDaGFpbk1hcCAoaGVscGVyIGZvciBjb25maWdwYXJzZXIgYW5kIHN0cmluZy5UZW1wbGF0ZSkKKyMjIyAgQ2hhaW5NYXAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBjbGFzcyBDaGFpbk1hcChNdXRhYmxlTWFwcGluZyk6CkBAIC05NjksNyArOTY5LDcgQEAKICAgICAgICAgICAgIGRpY3QgPSBrd2FyZ3MucG9wKCdkaWN0JykKICAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncwogICAgICAgICAgICAgd2FybmluZ3Mud2FybigiUGFzc2luZyAnZGljdCcgYXMga2V5d29yZCBhcmd1bWVudCBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGRpY3QgPSBOb25lCiAgICAgICAgIHNlbGYuZGF0YSA9IHt9CmRpZmYgLS1naXQgYS9MaWIvY29sbGVjdGlvbnMvX19tYWluX18ucHkgYi9MaWIvY29sbGVjdGlvbnMvX19tYWluX18ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2M2UzOGUuLjAwMDAwMDAKLS0tIGEvTGliL2NvbGxlY3Rpb25zL19fbWFpbl9fLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyBTaW1wbGUgdGVzdHMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgdmVyaWZ5IHRoYXQgaW5zdGFuY2VzIGNhbiBiZSBwaWNrbGVkCi1mcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCi1mcm9tIHBpY2tsZSBpbXBvcnQgbG9hZHMsIGR1bXBzCi1Qb2ludCA9IG5hbWVkdHVwbGUoJ1BvaW50JywgJ3gsIHknLCBUcnVlKQotcCA9IFBvaW50KHg9MTAsIHk9MjApCi1hc3NlcnQgcCA9PSBsb2FkcyhkdW1wcyhwKSkKLQotIyB0ZXN0IGFuZCBkZW1vbnN0cmF0ZSBhYmlsaXR5IHRvIG92ZXJyaWRlIG1ldGhvZHMKLWNsYXNzIFBvaW50KG5hbWVkdHVwbGUoJ1BvaW50JywgJ3ggeScpKToKLSAgICBfX3Nsb3RzX18gPSAoKQotICAgIEBwcm9wZXJ0eQotICAgIGRlZiBoeXBvdChzZWxmKToKLSAgICAgICAgcmV0dXJuIChzZWxmLnggKiogMiArIHNlbGYueSAqKiAyKSAqKiAwLjUKLSAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICdQb2ludDogeD0lNi4zZiAgeT0lNi4zZiAgaHlwb3Q9JTYuM2YnICUgKHNlbGYueCwgc2VsZi55LCBzZWxmLmh5cG90KQotCi1mb3IgcCBpbiBQb2ludCgzLCA0KSwgUG9pbnQoMTQsIDUvNy4pOgotICAgIHByaW50IChwKQotCi1jbGFzcyBQb2ludChuYW1lZHR1cGxlKCdQb2ludCcsICd4IHknKSk6Ci0gICAgJ1BvaW50IGNsYXNzIHdpdGggb3B0aW1pemVkIF9tYWtlKCkgYW5kIF9yZXBsYWNlKCkgd2l0aG91dCBlcnJvci1jaGVja2luZycKLSAgICBfX3Nsb3RzX18gPSAoKQotICAgIF9tYWtlID0gY2xhc3NtZXRob2QodHVwbGUuX19uZXdfXykKLSAgICBkZWYgX3JlcGxhY2Uoc2VsZiwgX21hcD1tYXAsICoqa3dkcyk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9tYWtlKF9tYXAoa3dkcy5nZXQsICgneCcsICd5JyksIHNlbGYpKQotCi1wcmludChQb2ludCgxMSwgMjIpLl9yZXBsYWNlKHg9MTAwKSkKLQotUG9pbnQzRCA9IG5hbWVkdHVwbGUoJ1BvaW50M0QnLCBQb2ludC5fZmllbGRzICsgKCd6JywpKQotcHJpbnQoUG9pbnQzRC5fX2RvY19fKQotCi1pbXBvcnQgZG9jdGVzdCwgY29sbGVjdGlvbnMKLVRlc3RSZXN1bHRzID0gbmFtZWR0dXBsZSgnVGVzdFJlc3VsdHMnLCAnZmFpbGVkIGF0dGVtcHRlZCcpCi1wcmludChUZXN0UmVzdWx0cygqZG9jdGVzdC50ZXN0bW9kKGNvbGxlY3Rpb25zKSkpCmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZWFsbC5weSBiL0xpYi9jb21waWxlYWxsLnB5CmluZGV4IDBjYzBjMWQuLjY3YzVmNWEgMTAwNjQ0Ci0tLSBhL0xpYi9jb21waWxlYWxsLnB5CisrKyBiL0xpYi9jb21waWxlYWxsLnB5CkBAIC02OCw3ICs2OCw3IEBACiAgICAgIiIiCiAgICAgZmlsZXMgPSBfd2Fsa19kaXIoZGlyLCBxdWlldD1xdWlldCwgbWF4bGV2ZWxzPW1heGxldmVscywKICAgICAgICAgICAgICAgICAgICAgICBkZGlyPWRkaXIpCi0gICAgc3VjY2VzcyA9IDEKKyAgICBzdWNjZXNzID0gVHJ1ZQogICAgIGlmIHdvcmtlcnMgaXMgbm90IE5vbmUgYW5kIHdvcmtlcnMgIT0gMSBhbmQgUHJvY2Vzc1Bvb2xFeGVjdXRvciBpcyBub3QgTm9uZToKICAgICAgICAgaWYgd29ya2VycyA8IDA6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd3b3JrZXJzIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAwJykKQEAgLTgxLDEyICs4MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeT1sZWdhY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemU9b3B0aW1pemUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcykKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSBtaW4ocmVzdWx0cywgZGVmYXVsdD0xKQorICAgICAgICAgICAgc3VjY2VzcyA9IG1pbihyZXN1bHRzLCBkZWZhdWx0PVRydWUpCiAgICAgZWxzZToKICAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CiAgICAgICAgICAgICBpZiBub3QgY29tcGlsZV9maWxlKGZpbGUsIGRkaXIsIGZvcmNlLCByeCwgcXVpZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeSwgb3B0aW1pemUpOgotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCiAgICAgcmV0dXJuIHN1Y2Nlc3MKIAogZGVmIGNvbXBpbGVfZmlsZShmdWxsbmFtZSwgZGRpcj1Ob25lLCBmb3JjZT1GYWxzZSwgcng9Tm9uZSwgcXVpZXQ9MCwKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgIGxlZ2FjeTogICAgaWYgVHJ1ZSwgcHJvZHVjZSBsZWdhY3kgcHljIHBhdGhzIGluc3RlYWQgb2YgUEVQIDMxNDcgcGF0aHMKICAgICBvcHRpbWl6ZTogIG9wdGltaXphdGlvbiBsZXZlbCBvciAtMSBmb3IgbGV2ZWwgb2YgdGhlIGludGVycHJldGVyCiAgICAgIiIiCi0gICAgc3VjY2VzcyA9IDEKKyAgICBzdWNjZXNzID0gVHJ1ZQogICAgIG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZ1bGxuYW1lKQogICAgIGlmIGRkaXIgaXMgbm90IE5vbmU6CiAgICAgICAgIGRmaWxlID0gb3MucGF0aC5qb2luKGRkaXIsIG5hbWUpCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICAgICAgICAgICAgICBvayA9IHB5X2NvbXBpbGUuY29tcGlsZShmdWxsbmFtZSwgY2ZpbGUsIGRmaWxlLCBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPW9wdGltaXplKQogICAgICAgICAgICAgZXhjZXB0IHB5X2NvbXBpbGUuUHlDb21waWxlRXJyb3IgYXMgZXJyOgotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCiAgICAgICAgICAgICAgICAgaWYgcXVpZXQgPj0gMjoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3MKICAgICAgICAgICAgICAgICBlbGlmIHF1aWV0OgpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICAgICAgICAgICAgbXNnID0gbXNnLmRlY29kZShzeXMuc3Rkb3V0LmVuY29kaW5nKQogICAgICAgICAgICAgICAgIHByaW50KG1zZykKICAgICAgICAgICAgIGV4Y2VwdCAoU3ludGF4RXJyb3IsIFVuaWNvZGVFcnJvciwgT1NFcnJvcikgYXMgZToKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQogICAgICAgICAgICAgICAgIGlmIHF1aWV0ID49IDI6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZXNzCiAgICAgICAgICAgICAgICAgZWxpZiBxdWlldDoKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIHByaW50KGUuX19jbGFzc19fLl9fbmFtZV9fICsgJzonLCBlKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBpZiBvayA9PSAwOgotICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICByZXR1cm4gc3VjY2VzcwogCiBkZWYgY29tcGlsZV9wYXRoKHNraXBfY3VyZGlyPTEsIG1heGxldmVscz0wLCBmb3JjZT1GYWxzZSwgcXVpZXQ9MCwKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgIGxlZ2FjeTogYXMgZm9yIGNvbXBpbGVfZGlyKCkgKGRlZmF1bHQgRmFsc2UpCiAgICAgb3B0aW1pemU6IGFzIGZvciBjb21waWxlX2RpcigpIChkZWZhdWx0IC0xKQogICAgICIiIgotICAgIHN1Y2Nlc3MgPSAxCisgICAgc3VjY2VzcyA9IFRydWUKICAgICBmb3IgZGlyIGluIHN5cy5wYXRoOgogICAgICAgICBpZiAobm90IGRpciBvciBkaXIgPT0gb3MuY3VyZGlyKSBhbmQgc2tpcF9jdXJkaXI6CiAgICAgICAgICAgICBpZiBxdWlldCA8IDI6CmRpZmYgLS1naXQgYS9MaWIvY29uY3VycmVudC9mdXR1cmVzL3RocmVhZC5weSBiL0xpYi9jb25jdXJyZW50L2Z1dHVyZXMvdGhyZWFkLnB5CmluZGV4IDljM2FlYzkuLjAzZDI3NmIgMTAwNjQ0Ci0tLSBhL0xpYi9jb25jdXJyZW50L2Z1dHVyZXMvdGhyZWFkLnB5CisrKyBiL0xpYi9jb25jdXJyZW50L2Z1dHVyZXMvdGhyZWFkLnB5CkBAIC04MSwxMiArODEsMTMgQEAKICAgICAgICAgX2Jhc2UuTE9HR0VSLmNyaXRpY2FsKCdFeGNlcHRpb24gaW4gd29ya2VyJywgZXhjX2luZm89VHJ1ZSkKIAogY2xhc3MgVGhyZWFkUG9vbEV4ZWN1dG9yKF9iYXNlLkV4ZWN1dG9yKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4X3dvcmtlcnM9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heF93b3JrZXJzPU5vbmUsIHRocmVhZF9uYW1lX3ByZWZpeD0nJyk6CiAgICAgICAgICIiIkluaXRpYWxpemVzIGEgbmV3IFRocmVhZFBvb2xFeGVjdXRvciBpbnN0YW5jZS4KIAogICAgICAgICBBcmdzOgogICAgICAgICAgICAgbWF4X3dvcmtlcnM6IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgICAgICAgICBleGVjdXRlIHRoZSBnaXZlbiBjYWxscy4KKyAgICAgICAgICAgIHRocmVhZF9uYW1lX3ByZWZpeDogQW4gb3B0aW9uYWwgbmFtZSBwcmVmaXggdG8gZ2l2ZSBvdXIgdGhyZWFkcy4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG1heF93b3JrZXJzIGlzIE5vbmU6CiAgICAgICAgICAgICAjIFVzZSB0aGlzIG51bWJlciBiZWNhdXNlIFRocmVhZFBvb2xFeGVjdXRvciBpcyBvZnRlbgpAQCAtMTAwLDYgKzEwMSw3IEBACiAgICAgICAgIHNlbGYuX3RocmVhZHMgPSBzZXQoKQogICAgICAgICBzZWxmLl9zaHV0ZG93biA9IEZhbHNlCiAgICAgICAgIHNlbGYuX3NodXRkb3duX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYuX3RocmVhZF9uYW1lX3ByZWZpeCA9IHRocmVhZF9uYW1lX3ByZWZpeAogCiAgICAgZGVmIHN1Ym1pdChzZWxmLCBmbiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgd2l0aCBzZWxmLl9zaHV0ZG93bl9sb2NrOgpAQCAtMTIxLDggKzEyMywxMSBAQAogICAgICAgICAgICAgcS5wdXQoTm9uZSkKICAgICAgICAgIyBUT0RPKGJxdWlubGFuKTogU2hvdWxkIGF2b2lkIGNyZWF0aW5nIG5ldyB0aHJlYWRzIGlmIHRoZXJlIGFyZSBtb3JlCiAgICAgICAgICMgaWRsZSB0aHJlYWRzIHRoYW4gaXRlbXMgaW4gdGhlIHdvcmsgcXVldWUuCi0gICAgICAgIGlmIGxlbihzZWxmLl90aHJlYWRzKSA8IHNlbGYuX21heF93b3JrZXJzOgotICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PV93b3JrZXIsCisgICAgICAgIG51bV90aHJlYWRzID0gbGVuKHNlbGYuX3RocmVhZHMpCisgICAgICAgIGlmIG51bV90aHJlYWRzIDwgc2VsZi5fbWF4X3dvcmtlcnM6CisgICAgICAgICAgICB0aHJlYWRfbmFtZSA9ICclc18lZCcgJSAoc2VsZi5fdGhyZWFkX25hbWVfcHJlZml4IG9yIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3RocmVhZHMpCisgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZChuYW1lPXRocmVhZF9uYW1lLCB0YXJnZXQ9X3dvcmtlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHdlYWtyZWYucmVmKHNlbGYsIHdlYWtyZWZfY2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd29ya19xdWV1ZSkpCiAgICAgICAgICAgICB0LmRhZW1vbiA9IFRydWUKZGlmZiAtLWdpdCBhL0xpYi9jb250ZXh0bGliLnB5IGIvTGliL2NvbnRleHRsaWIucHkKaW5kZXggZDQ0ZWRkNi4uN2Q5NGE1NyAxMDA2NDQKLS0tIGEvTGliL2NvbnRleHRsaWIucHkKKysrIGIvTGliL2NvbnRleHRsaWIucHkKQEAgLTEsMTEgKzEsMzQgQEAKICIiIlV0aWxpdGllcyBmb3Igd2l0aC1zdGF0ZW1lbnQgY29udGV4dHMuICBTZWUgUEVQIDM0My4iIiIKLQoraW1wb3J0IGFiYwogaW1wb3J0IHN5cwogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKIGZyb20gZnVuY3Rvb2xzIGltcG9ydCB3cmFwcwogCi1fX2FsbF9fID0gWyJjb250ZXh0bWFuYWdlciIsICJjbG9zaW5nIiwgIkNvbnRleHREZWNvcmF0b3IiLCAiRXhpdFN0YWNrIiwKLSAgICAgICAgICAgInJlZGlyZWN0X3N0ZG91dCIsICJyZWRpcmVjdF9zdGRlcnIiLCAic3VwcHJlc3MiXQorX19hbGxfXyA9IFsiY29udGV4dG1hbmFnZXIiLCAiY2xvc2luZyIsICJBYnN0cmFjdENvbnRleHRNYW5hZ2VyIiwKKyAgICAgICAgICAgIkNvbnRleHREZWNvcmF0b3IiLCAiRXhpdFN0YWNrIiwgInJlZGlyZWN0X3N0ZG91dCIsCisgICAgICAgICAgICJyZWRpcmVjdF9zdGRlcnIiLCAic3VwcHJlc3MiXQorCisKK2NsYXNzIEFic3RyYWN0Q29udGV4dE1hbmFnZXIoYWJjLkFCQyk6CisKKyAgICAiIiJBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb250ZXh0IG1hbmFnZXJzLiIiIgorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGBzZWxmYCB1cG9uIGVudGVyaW5nIHRoZSBydW50aW1lIGNvbnRleHQuIiIiCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgICIiIlJhaXNlIGFueSBleGNlcHRpb24gdHJpZ2dlcmVkIHdpdGhpbiB0aGUgcnVudGltZSBjb250ZXh0LiIiIgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBDKToKKyAgICAgICAgaWYgY2xzIGlzIEFic3RyYWN0Q29udGV4dE1hbmFnZXI6CisgICAgICAgICAgICBpZiAoYW55KCJfX2VudGVyX18iIGluIEIuX19kaWN0X18gZm9yIEIgaW4gQy5fX21yb19fKSBhbmQKKyAgICAgICAgICAgICAgICBhbnkoIl9fZXhpdF9fIiBpbiBCLl9fZGljdF9fIGZvciBCIGluIEMuX19tcm9fXykpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiAKIGNsYXNzIENvbnRleHREZWNvcmF0b3Iob2JqZWN0KToKQEAgLTMxLDcgKzU0LDcgQEAKICAgICAgICAgcmV0dXJuIGlubmVyCiAKIAotY2xhc3MgX0dlbmVyYXRvckNvbnRleHRNYW5hZ2VyKENvbnRleHREZWNvcmF0b3IpOgorY2xhc3MgX0dlbmVyYXRvckNvbnRleHRNYW5hZ2VyKENvbnRleHREZWNvcmF0b3IsIEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgogICAgICIiIkhlbHBlciBmb3IgQGNvbnRleHRtYW5hZ2VyIGRlY29yYXRvci4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jLCBhcmdzLCBrd2RzKToKQEAgLTEzNyw3ICsxNjAsNyBAQAogICAgIHJldHVybiBoZWxwZXIKIAogCi1jbGFzcyBjbG9zaW5nKG9iamVjdCk6CitjbGFzcyBjbG9zaW5nKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgogICAgICIiIkNvbnRleHQgdG8gYXV0b21hdGljYWxseSBjbG9zZSBzb21ldGhpbmcgYXQgdGhlIGVuZCBvZiBhIGJsb2NrLgogCiAgICAgQ29kZSBsaWtlIHRoaXM6CkBAIC0xNjIsNyArMTg1LDcgQEAKICAgICAgICAgc2VsZi50aGluZy5jbG9zZSgpCiAKIAotY2xhc3MgX1JlZGlyZWN0U3RyZWFtOgorY2xhc3MgX1JlZGlyZWN0U3RyZWFtKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgogCiAgICAgX3N0cmVhbSA9IE5vbmUKIApAQCAtMjAyLDcgKzIyNSw3IEBACiAgICAgX3N0cmVhbSA9ICJzdGRlcnIiCiAKIAotY2xhc3Mgc3VwcHJlc3M6CitjbGFzcyBzdXBwcmVzcyhBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKICAgICAiIiJDb250ZXh0IG1hbmFnZXIgdG8gc3VwcHJlc3Mgc3BlY2lmaWVkIGV4Y2VwdGlvbnMKIAogICAgIEFmdGVyIHRoZSBleGNlcHRpb24gaXMgc3VwcHJlc3NlZCwgZXhlY3V0aW9uIHByb2NlZWRzIHdpdGggdGhlIG5leHQKQEAgLTIzMyw3ICsyNTYsNyBAQAogCiAKICMgSW5zcGlyZWQgYnkgZGlzY3Vzc2lvbnMgb24gaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEzNTg1Ci1jbGFzcyBFeGl0U3RhY2sob2JqZWN0KToKK2NsYXNzIEV4aXRTdGFjayhBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKICAgICAiIiJDb250ZXh0IG1hbmFnZXIgZm9yIGR5bmFtaWMgbWFuYWdlbWVudCBvZiBhIHN0YWNrIG9mIGV4aXQgY2FsbGJhY2tzCiAKICAgICBGb3IgZXhhbXBsZToKQEAgLTMxMiw5ICszMzUsNiBAQAogICAgICAgICAiIiJJbW1lZGlhdGVseSB1bndpbmQgdGhlIGNvbnRleHQgc3RhY2siIiIKICAgICAgICAgc2VsZi5fX2V4aXRfXyhOb25lLCBOb25lLCBOb25lKQogCi0gICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQogICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2RldGFpbHMpOgogICAgICAgICByZWNlaXZlZF9leGMgPSBleGNfZGV0YWlsc1swXSBpcyBub3QgTm9uZQogCmRpZmYgLS1naXQgYS9MaWIvY29weS5weSBiL0xpYi9jb3B5LnB5CmluZGV4IDk3MmI5NGEuLmY4NjA0MGEgMTAwNjQ0Ci0tLSBhL0xpYi9jb3B5LnB5CisrKyBiL0xpYi9jb3B5LnB5CkBAIC01MSw3ICs1MSw2IEBACiBpbXBvcnQgdHlwZXMKIGltcG9ydCB3ZWFrcmVmCiBmcm9tIGNvcHlyZWcgaW1wb3J0IGRpc3BhdGNoX3RhYmxlCi1pbXBvcnQgYnVpbHRpbnMKIAogY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKICAgICBwYXNzCkBAIC0xMDIsMzcgKzEwMSwzMyBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICByYWlzZSBFcnJvcigidW4oc2hhbGxvdyljb3B5YWJsZSBvYmplY3Qgb2YgdHlwZSAlcyIgJSBjbHMpCiAKLSAgICByZXR1cm4gX3JlY29uc3RydWN0KHgsIHJ2LCAwKQorICAgIGlmIGlzaW5zdGFuY2UocnYsIHN0cik6CisgICAgICAgIHJldHVybiB4CisgICAgcmV0dXJuIF9yZWNvbnN0cnVjdCh4LCBOb25lLCAqcnYpCiAKIAogX2NvcHlfZGlzcGF0Y2ggPSBkID0ge30KIAogZGVmIF9jb3B5X2ltbXV0YWJsZSh4KToKICAgICByZXR1cm4geAotZm9yIHQgaW4gKHR5cGUoTm9uZSksIGludCwgZmxvYXQsIGJvb2wsIHN0ciwgdHVwbGUsCi0gICAgICAgICAgYnl0ZXMsIGZyb3plbnNldCwgdHlwZSwgcmFuZ2UsCi0gICAgICAgICAgdHlwZXMuQnVpbHRpbkZ1bmN0aW9uVHlwZSwgdHlwZShFbGxpcHNpcyksCitmb3IgdCBpbiAodHlwZShOb25lKSwgaW50LCBmbG9hdCwgYm9vbCwgY29tcGxleCwgc3RyLCB0dXBsZSwKKyAgICAgICAgICBieXRlcywgZnJvemVuc2V0LCB0eXBlLCByYW5nZSwgc2xpY2UsCisgICAgICAgICAgdHlwZXMuQnVpbHRpbkZ1bmN0aW9uVHlwZSwgdHlwZShFbGxpcHNpcyksIHR5cGUoTm90SW1wbGVtZW50ZWQpLAogICAgICAgICAgIHR5cGVzLkZ1bmN0aW9uVHlwZSwgd2Vha3JlZi5yZWYpOgogICAgIGRbdF0gPSBfY29weV9pbW11dGFibGUKIHQgPSBnZXRhdHRyKHR5cGVzLCAiQ29kZVR5cGUiLCBOb25lKQogaWYgdCBpcyBub3QgTm9uZToKICAgICBkW3RdID0gX2NvcHlfaW1tdXRhYmxlCi1mb3IgbmFtZSBpbiAoImNvbXBsZXgiLCAidW5pY29kZSIpOgotICAgIHQgPSBnZXRhdHRyKGJ1aWx0aW5zLCBuYW1lLCBOb25lKQotICAgIGlmIHQgaXMgbm90IE5vbmU6Ci0gICAgICAgIGRbdF0gPSBfY29weV9pbW11dGFibGUKIAotZGVmIF9jb3B5X3dpdGhfY29uc3RydWN0b3IoeCk6Ci0gICAgcmV0dXJuIHR5cGUoeCkoeCkKLWZvciB0IGluIChsaXN0LCBkaWN0LCBzZXQpOgotICAgIGRbdF0gPSBfY29weV93aXRoX2NvbnN0cnVjdG9yCitkW2xpc3RdID0gbGlzdC5jb3B5CitkW2RpY3RdID0gZGljdC5jb3B5CitkW3NldF0gPSBzZXQuY29weQorZFtieXRlYXJyYXldID0gYnl0ZWFycmF5LmNvcHkKIAotZGVmIF9jb3B5X3dpdGhfY29weV9tZXRob2QoeCk6Ci0gICAgcmV0dXJuIHguY29weSgpCiBpZiBQeVN0cmluZ01hcCBpcyBub3QgTm9uZToKLSAgICBkW1B5U3RyaW5nTWFwXSA9IF9jb3B5X3dpdGhfY29weV9tZXRob2QKKyAgICBkW1B5U3RyaW5nTWFwXSA9IFB5U3RyaW5nTWFwLmNvcHkKIAotZGVsIGQKK2RlbCBkLCB0CiAKIGRlZiBkZWVwY29weSh4LCBtZW1vPU5vbmUsIF9uaWw9W10pOgogICAgICIiIkRlZXAgY29weSBvcGVyYXRpb24gb24gYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLgpAQCAtMTc5LDcgKzE3NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuKGRlZXApY29weWFibGUgb2JqZWN0IG9mIHR5cGUgJXMiICUgY2xzKQotICAgICAgICAgICAgICAgIHkgPSBfcmVjb25zdHJ1Y3QoeCwgcnYsIDEsIG1lbW8pCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShydiwgc3RyKToKKyAgICAgICAgICAgICAgICAgICAgeSA9IHgKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB5ID0gX3JlY29uc3RydWN0KHgsIG1lbW8sICpydikKIAogICAgICMgSWYgaXMgaXRzIG93biBjb3B5LCBkb24ndCBtZW1vaXplLgogICAgIGlmIHkgaXMgbm90IHg6CkBAIC0xOTMsMTMgKzE5MSwxMSBAQAogICAgIHJldHVybiB4CiBkW3R5cGUoTm9uZSldID0gX2RlZXBjb3B5X2F0b21pYwogZFt0eXBlKEVsbGlwc2lzKV0gPSBfZGVlcGNvcHlfYXRvbWljCitkW3R5cGUoTm90SW1wbGVtZW50ZWQpXSA9IF9kZWVwY29weV9hdG9taWMKIGRbaW50XSA9IF9kZWVwY29weV9hdG9taWMKIGRbZmxvYXRdID0gX2RlZXBjb3B5X2F0b21pYwogZFtib29sXSA9IF9kZWVwY29weV9hdG9taWMKLXRyeToKLSAgICBkW2NvbXBsZXhdID0gX2RlZXBjb3B5X2F0b21pYwotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBwYXNzCitkW2NvbXBsZXhdID0gX2RlZXBjb3B5X2F0b21pYwogZFtieXRlc10gPSBfZGVlcGNvcHlfYXRvbWljCiBkW3N0cl0gPSBfZGVlcGNvcHlfYXRvbWljCiB0cnk6CkBAIC0yMTEsMTUgKzIwNywxNiBAQAogZFt0eXBlcy5GdW5jdGlvblR5cGVdID0gX2RlZXBjb3B5X2F0b21pYwogZFt3ZWFrcmVmLnJlZl0gPSBfZGVlcGNvcHlfYXRvbWljCiAKLWRlZiBfZGVlcGNvcHlfbGlzdCh4LCBtZW1vKToKK2RlZiBfZGVlcGNvcHlfbGlzdCh4LCBtZW1vLCBkZWVwY29weT1kZWVwY29weSk6CiAgICAgeSA9IFtdCiAgICAgbWVtb1tpZCh4KV0gPSB5CisgICAgYXBwZW5kID0geS5hcHBlbmQKICAgICBmb3IgYSBpbiB4OgotICAgICAgICB5LmFwcGVuZChkZWVwY29weShhLCBtZW1vKSkKKyAgICAgICAgYXBwZW5kKGRlZXBjb3B5KGEsIG1lbW8pKQogICAgIHJldHVybiB5CiBkW2xpc3RdID0gX2RlZXBjb3B5X2xpc3QKIAotZGVmIF9kZWVwY29weV90dXBsZSh4LCBtZW1vKToKK2RlZiBfZGVlcGNvcHlfdHVwbGUoeCwgbWVtbywgZGVlcGNvcHk9ZGVlcGNvcHkpOgogICAgIHkgPSBbZGVlcGNvcHkoYSwgbWVtbykgZm9yIGEgaW4geF0KICAgICAjIFdlJ3JlIG5vdCBnb2luZyB0byBwdXQgdGhlIHR1cGxlIGluIHRoZSBtZW1vLCBidXQgaXQncyBzdGlsbCBpbXBvcnRhbnQgd2UKICAgICAjIGNoZWNrIGZvciBpdCwgaW4gY2FzZSB0aGUgdHVwbGUgY29udGFpbnMgcmVjdXJzaXZlIG11dGFibGUgc3RydWN0dXJlcy4KQEAgLTIzNiw3ICsyMzMsNyBAQAogICAgIHJldHVybiB5CiBkW3R1cGxlXSA9IF9kZWVwY29weV90dXBsZQogCi1kZWYgX2RlZXBjb3B5X2RpY3QoeCwgbWVtbyk6CitkZWYgX2RlZXBjb3B5X2RpY3QoeCwgbWVtbywgZGVlcGNvcHk9ZGVlcGNvcHkpOgogICAgIHkgPSB7fQogICAgIG1lbW9baWQoeCldID0geQogICAgIGZvciBrZXksIHZhbHVlIGluIHguaXRlbXMoKToKQEAgLTI0OCw3ICsyNDUsOSBAQAogCiBkZWYgX2RlZXBjb3B5X21ldGhvZCh4LCBtZW1vKTogIyBDb3B5IGluc3RhbmNlIG1ldGhvZHMKICAgICByZXR1cm4gdHlwZSh4KSh4Ll9fZnVuY19fLCBkZWVwY29weSh4Ll9fc2VsZl9fLCBtZW1vKSkKLV9kZWVwY29weV9kaXNwYXRjaFt0eXBlcy5NZXRob2RUeXBlXSA9IF9kZWVwY29weV9tZXRob2QKK2RbdHlwZXMuTWV0aG9kVHlwZV0gPSBfZGVlcGNvcHlfbWV0aG9kCisKK2RlbCBkCiAKIGRlZiBfa2VlcF9hbGl2ZSh4LCBtZW1vKToKICAgICAiIiJLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHggaW4gdGhlIG1lbW8uCkBAIC0yNjYsMzEgKzI2NSwxNSBAQAogICAgICAgICAjIGFoYSwgdGhpcyBpcyB0aGUgZmlyc3Qgb25lIDotKQogICAgICAgICBtZW1vW2lkKG1lbW8pXT1beF0KIAotZGVmIF9yZWNvbnN0cnVjdCh4LCBpbmZvLCBkZWVwLCBtZW1vPU5vbmUpOgotICAgIGlmIGlzaW5zdGFuY2UoaW5mbywgc3RyKToKLSAgICAgICAgcmV0dXJuIHgKLSAgICBhc3NlcnQgaXNpbnN0YW5jZShpbmZvLCB0dXBsZSkKLSAgICBpZiBtZW1vIGlzIE5vbmU6Ci0gICAgICAgIG1lbW8gPSB7fQotICAgIG4gPSBsZW4oaW5mbykKLSAgICBhc3NlcnQgbiBpbiAoMiwgMywgNCwgNSkKLSAgICBjYWxsYWJsZSwgYXJncyA9IGluZm9bOjJdCi0gICAgaWYgbiA+IDI6Ci0gICAgICAgIHN0YXRlID0gaW5mb1syXQotICAgIGVsc2U6Ci0gICAgICAgIHN0YXRlID0gTm9uZQotICAgIGlmIG4gPiAzOgotICAgICAgICBsaXN0aXRlciA9IGluZm9bM10KLSAgICBlbHNlOgotICAgICAgICBsaXN0aXRlciA9IE5vbmUKLSAgICBpZiBuID4gNDoKLSAgICAgICAgZGljdGl0ZXIgPSBpbmZvWzRdCi0gICAgZWxzZToKLSAgICAgICAgZGljdGl0ZXIgPSBOb25lCitkZWYgX3JlY29uc3RydWN0KHgsIG1lbW8sIGZ1bmMsIGFyZ3MsCisgICAgICAgICAgICAgICAgIHN0YXRlPU5vbmUsIGxpc3RpdGVyPU5vbmUsIGRpY3RpdGVyPU5vbmUsCisgICAgICAgICAgICAgICAgIGRlZXBjb3B5PWRlZXBjb3B5KToKKyAgICBkZWVwID0gbWVtbyBpcyBub3QgTm9uZQorICAgIGlmIGRlZXAgYW5kIGFyZ3M6CisgICAgICAgIGFyZ3MgPSAoZGVlcGNvcHkoYXJnLCBtZW1vKSBmb3IgYXJnIGluIGFyZ3MpCisgICAgeSA9IGZ1bmMoKmFyZ3MpCiAgICAgaWYgZGVlcDoKLSAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pCi0gICAgeSA9IGNhbGxhYmxlKCphcmdzKQotICAgIG1lbW9baWQoeCldID0geQorICAgICAgICBtZW1vW2lkKHgpXSA9IHkKIAogICAgIGlmIHN0YXRlIGlzIG5vdCBOb25lOgogICAgICAgICBpZiBkZWVwOgpAQCAtMzA5LDIyICsyOTIsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cih5LCBrZXksIHZhbHVlKQogCiAgICAgaWYgbGlzdGl0ZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgIGZvciBpdGVtIGluIGxpc3RpdGVyOgotICAgICAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGxpc3RpdGVyOgogICAgICAgICAgICAgICAgIGl0ZW0gPSBkZWVwY29weShpdGVtLCBtZW1vKQotICAgICAgICAgICAgeS5hcHBlbmQoaXRlbSkKKyAgICAgICAgICAgICAgICB5LmFwcGVuZChpdGVtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6CisgICAgICAgICAgICAgICAgeS5hcHBlbmQoaXRlbSkKICAgICBpZiBkaWN0aXRlciBpcyBub3QgTm9uZToKLSAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGljdGl0ZXI6Ci0gICAgICAgICAgICBpZiBkZWVwOgorICAgICAgICBpZiBkZWVwOgorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGljdGl0ZXI6CiAgICAgICAgICAgICAgICAga2V5ID0gZGVlcGNvcHkoa2V5LCBtZW1vKQogICAgICAgICAgICAgICAgIHZhbHVlID0gZGVlcGNvcHkodmFsdWUsIG1lbW8pCi0gICAgICAgICAgICB5W2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgICAgIHlba2V5XSA9IHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aXRlcjoKKyAgICAgICAgICAgICAgICB5W2tleV0gPSB2YWx1ZQogICAgIHJldHVybiB5CiAKLWRlbCBkCi0KLWRlbCB0eXBlcwotCi0jIEhlbHBlciBmb3IgaW5zdGFuY2UgY3JlYXRpb24gd2l0aG91dCBjYWxsaW5nIF9faW5pdF9fCi1jbGFzcyBfRW1wdHlDbGFzczoKLSAgICBwYXNzCitkZWwgdHlwZXMsIHdlYWtyZWYsIFB5U3RyaW5nTWFwCmRpZmYgLS1naXQgYS9MaWIvY3J5cHQucHkgYi9MaWIvY3J5cHQucHkKaW5kZXggNDlhYjk2ZS4uZmJjNWY0YyAxMDA2NDQKLS0tIGEvTGliL2NyeXB0LnB5CisrKyBiL0xpYi9jcnlwdC5weQpAQCAtNTQsOSArNTQsOCBAQAogTUVUSE9EX1NIQTUxMiA9IF9NZXRob2QoJ1NIQTUxMicsICc2JywgMTYsIDEwNikKIAogbWV0aG9kcyA9IFtdCi1mb3IgX21ldGhvZCBpbiAoTUVUSE9EX1NIQTUxMiwgTUVUSE9EX1NIQTI1NiwgTUVUSE9EX01ENSk6Citmb3IgX21ldGhvZCBpbiAoTUVUSE9EX1NIQTUxMiwgTUVUSE9EX1NIQTI1NiwgTUVUSE9EX01ENSwgTUVUSE9EX0NSWVBUKToKICAgICBfcmVzdWx0ID0gY3J5cHQoJycsIF9tZXRob2QpCiAgICAgaWYgX3Jlc3VsdCBhbmQgbGVuKF9yZXN1bHQpID09IF9tZXRob2QudG90YWxfc2l6ZToKICAgICAgICAgbWV0aG9kcy5hcHBlbmQoX21ldGhvZCkKLW1ldGhvZHMuYXBwZW5kKE1FVEhPRF9DUllQVCkKIGRlbCBfcmVzdWx0LCBfbWV0aG9kCmRpZmYgLS1naXQgYS9MaWIvY3N2LnB5IGIvTGliL2Nzdi5weQppbmRleCBjYTQwZTVlLi4wNDgxZWE1IDEwMDY0NAotLS0gYS9MaWIvY3N2LnB5CisrKyBiL0xpYi9jc3YucHkKQEAgLTExLDEzICsxMSwxNSBAQAogICAgICAgICAgICAgICAgICBfX2RvY19fCiBmcm9tIF9jc3YgaW1wb3J0IERpYWxlY3QgYXMgX0RpYWxlY3QKIAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCiAKLV9fYWxsX18gPSBbICJRVU9URV9NSU5JTUFMIiwgIlFVT1RFX0FMTCIsICJRVU9URV9OT05OVU1FUklDIiwgIlFVT1RFX05PTkUiLAotICAgICAgICAgICAgIkVycm9yIiwgIkRpYWxlY3QiLCAiX19kb2NfXyIsICJleGNlbCIsICJleGNlbF90YWIiLAotICAgICAgICAgICAgImZpZWxkX3NpemVfbGltaXQiLCAicmVhZGVyIiwgIndyaXRlciIsCi0gICAgICAgICAgICAicmVnaXN0ZXJfZGlhbGVjdCIsICJnZXRfZGlhbGVjdCIsICJsaXN0X2RpYWxlY3RzIiwgIlNuaWZmZXIiLAotICAgICAgICAgICAgInVucmVnaXN0ZXJfZGlhbGVjdCIsICJfX3ZlcnNpb25fXyIsICJEaWN0UmVhZGVyIiwgIkRpY3RXcml0ZXIiIF0KK19fYWxsX18gPSBbIlFVT1RFX01JTklNQUwiLCAiUVVPVEVfQUxMIiwgIlFVT1RFX05PTk5VTUVSSUMiLCAiUVVPVEVfTk9ORSIsCisgICAgICAgICAgICJFcnJvciIsICJEaWFsZWN0IiwgIl9fZG9jX18iLCAiZXhjZWwiLCAiZXhjZWxfdGFiIiwKKyAgICAgICAgICAgImZpZWxkX3NpemVfbGltaXQiLCAicmVhZGVyIiwgIndyaXRlciIsCisgICAgICAgICAgICJyZWdpc3Rlcl9kaWFsZWN0IiwgImdldF9kaWFsZWN0IiwgImxpc3RfZGlhbGVjdHMiLCAiU25pZmZlciIsCisgICAgICAgICAgICJ1bnJlZ2lzdGVyX2RpYWxlY3QiLCAiX192ZXJzaW9uX18iLCAiRGljdFJlYWRlciIsICJEaWN0V3JpdGVyIiwKKyAgICAgICAgICAgInVuaXhfZGlhbGVjdCJdCiAKIGNsYXNzIERpYWxlY3Q6CiAgICAgIiIiRGVzY3JpYmUgYSBDU1YgZGlhbGVjdC4KQEAgLTExNSw3ICsxMTcsNyBAQAogICAgICAgICAjIHZhbHVlcwogICAgICAgICB3aGlsZSByb3cgPT0gW106CiAgICAgICAgICAgICByb3cgPSBuZXh0KHNlbGYucmVhZGVyKQotICAgICAgICBkID0gZGljdCh6aXAoc2VsZi5maWVsZG5hbWVzLCByb3cpKQorICAgICAgICBkID0gT3JkZXJlZERpY3QoemlwKHNlbGYuZmllbGRuYW1lcywgcm93KSkKICAgICAgICAgbGYgPSBsZW4oc2VsZi5maWVsZG5hbWVzKQogICAgICAgICBsciA9IGxlbihyb3cpCiAgICAgICAgIGlmIGxmIDwgbHI6CkBAIC0yMTMsMTAgKzIxNSwxMCBAQAogICAgICAgICAiIiIKIAogICAgICAgICBtYXRjaGVzID0gW10KLSAgICAgICAgZm9yIHJlc3RyIGluICgnKD9QPGRlbGltPlteXHdcbiJcJ10pKD9QPHNwYWNlPiA/KSg/UDxxdW90ZT5bIlwnXSkuKj8oP1A9cXVvdGUpKD9QPWRlbGltKScsICMgLCIuKj8iLAotICAgICAgICAgICAgICAgICAgICAgICcoPzpefFxuKSg/UDxxdW90ZT5bIlwnXSkuKj8oP1A9cXVvdGUpKD9QPGRlbGltPlteXHdcbiJcJ10pKD9QPHNwYWNlPiA/KScsICAgIyAgIi4qPyIsCi0gICAgICAgICAgICAgICAgICAgICAgJyg/UDxkZWxpbT4+W15cd1xuIlwnXSkoP1A8c3BhY2U+ID8pKD9QPHF1b3RlPlsiXCddKS4qPyg/UD1xdW90ZSkoPzokfFxuKScsICAjICwiLio/IgotICAgICAgICAgICAgICAgICAgICAgICcoPzpefFxuKSg/UDxxdW90ZT5bIlwnXSkuKj8oP1A9cXVvdGUpKD86JHxcbiknKTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIi4qPyIgKG5vIGRlbGltLCBubyBzcGFjZSkKKyAgICAgICAgZm9yIHJlc3RyIGluIChyJyg/UDxkZWxpbT5bXlx3XG4iXCddKSg/UDxzcGFjZT4gPykoP1A8cXVvdGU+WyJcJ10pLio/KD9QPXF1b3RlKSg/UD1kZWxpbSknLCAjICwiLio/IiwKKyAgICAgICAgICAgICAgICAgICAgICByJyg/Ol58XG4pKD9QPHF1b3RlPlsiXCddKS4qPyg/UD1xdW90ZSkoP1A8ZGVsaW0+W15cd1xuIlwnXSkoP1A8c3BhY2U+ID8pJywgICAjICAiLio/IiwKKyAgICAgICAgICAgICAgICAgICAgICByJyg/UDxkZWxpbT4+W15cd1xuIlwnXSkoP1A8c3BhY2U+ID8pKD9QPHF1b3RlPlsiXCddKS4qPyg/UD1xdW90ZSkoPzokfFxuKScsICAjICwiLio/IgorICAgICAgICAgICAgICAgICAgICAgIHInKD86XnxcbikoP1A8cXVvdGU+WyJcJ10pLio/KD9QPXF1b3RlKSg/OiR8XG4pJyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICIuKj8iIChubyBkZWxpbSwgbm8gc3BhY2UpCiAgICAgICAgICAgICByZWdleHAgPSByZS5jb21waWxlKHJlc3RyLCByZS5ET1RBTEwgfCByZS5NVUxUSUxJTkUpCiAgICAgICAgICAgICBtYXRjaGVzID0gcmVnZXhwLmZpbmRhbGwoZGF0YSkKICAgICAgICAgICAgIGlmIG1hdGNoZXM6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5IGIvTGliL2N0eXBlcy9fX2luaXRfXy5weQppbmRleCAwZDg2MDc4Li4xYzlkM2E1IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5CisrKyBiL0xpYi9jdHlwZXMvX19pbml0X18ucHkKQEAgLTE2LDcgKzE2LDcgQEAKIGlmIF9fdmVyc2lvbl9fICE9IF9jdHlwZXNfdmVyc2lvbjoKICAgICByYWlzZSBFeGNlcHRpb24oIlZlcnNpb24gbnVtYmVyIG1pc21hdGNoIiwgX192ZXJzaW9uX18sIF9jdHlwZXNfdmVyc2lvbikKIAotaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgoraWYgX29zLm5hbWUgPT0gIm50IjoKICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IEZvcm1hdEVycm9yCiAKIERFRkFVTFRfTU9ERSA9IFJUTERfTE9DQUwKQEAgLTEwMywxMiArMTAzLDkgQEAKICAgICAgICAgX2NfZnVuY3R5cGVfY2FjaGVbKHJlc3R5cGUsIGFyZ3R5cGVzLCBmbGFncyldID0gQ0Z1bmN0aW9uVHlwZQogICAgICAgICByZXR1cm4gQ0Z1bmN0aW9uVHlwZQogCi1pZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CitpZiBfb3MubmFtZSA9PSAibnQiOgogICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgTG9hZExpYnJhcnkgYXMgX2Rsb3BlbgogICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgRlVOQ0ZMQUdfU1REQ0FMTCBhcyBfRlVOQ0ZMQUdfU1REQ0FMTAotICAgIGlmIF9vcy5uYW1lID09ICJjZSI6Ci0gICAgICAgICMgJ2NlJyBkb2Vzbid0IGhhdmUgdGhlIHN0ZGNhbGwgY2FsbGluZyBjb252ZW50aW9uCi0gICAgICAgIF9GVU5DRkxBR19TVERDQUxMID0gX0ZVTkNGTEFHX0NERUNMCiAKICAgICBfd2luX2Z1bmN0eXBlX2NhY2hlID0ge30KICAgICBkZWYgV0lORlVOQ1RZUEUocmVzdHlwZSwgKmFyZ3R5cGVzLCAqKmt3KToKQEAgLTI2Miw3ICsyNTksNyBAQAogZGVmIF9yZXNldF9jYWNoZSgpOgogICAgIF9wb2ludGVyX3R5cGVfY2FjaGUuY2xlYXIoKQogICAgIF9jX2Z1bmN0eXBlX2NhY2hlLmNsZWFyKCkKLSAgICBpZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgaWYgX29zLm5hbWUgPT0gIm50IjoKICAgICAgICAgX3dpbl9mdW5jdHlwZV9jYWNoZS5jbGVhcigpCiAgICAgIyBfU2ltcGxlQ0RhdGEuY193Y2hhcl9wX2Zyb21fcGFyYW0KICAgICBQT0lOVEVSKGNfd2NoYXIpLmZyb21fcGFyYW0gPSBjX3djaGFyX3AuZnJvbV9wYXJhbQpAQCAtMzc0LDcgKzM3MSw3IEBACiAgICAgIiIiCiAgICAgX2Z1bmNfZmxhZ3NfID0gX0ZVTkNGTEFHX0NERUNMIHwgX0ZVTkNGTEFHX1BZVEhPTkFQSQogCi1pZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CitpZiBfb3MubmFtZSA9PSAibnQiOgogCiAgICAgY2xhc3MgV2luRExMKENETEwpOgogICAgICAgICAiIiJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBkbGwgZXhwb3J0aW5nIGZ1bmN0aW9ucyB1c2luZyB0aGUKQEAgLTQyNyw3ICs0MjQsNyBAQAogY2RsbCA9IExpYnJhcnlMb2FkZXIoQ0RMTCkKIHB5ZGxsID0gTGlicmFyeUxvYWRlcihQeURMTCkKIAotaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgoraWYgX29zLm5hbWUgPT0gIm50IjoKICAgICBweXRob25hcGkgPSBQeURMTCgicHl0aG9uIGRsbCIsIE5vbmUsIF9zeXMuZGxsaGFuZGxlKQogZWxpZiBfc3lzLnBsYXRmb3JtID09ICJjeWd3aW4iOgogICAgIHB5dGhvbmFwaSA9IFB5RExMKCJsaWJweXRob24lZC4lZC5kbGwiICUgX3N5cy52ZXJzaW9uX2luZm9bOjJdKQpAQCAtNDM1LDcgKzQzMiw3IEBACiAgICAgcHl0aG9uYXBpID0gUHlETEwoTm9uZSkKIAogCi1pZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CitpZiBfb3MubmFtZSA9PSAibnQiOgogICAgIHdpbmRsbCA9IExpYnJhcnlMb2FkZXIoV2luRExMKQogICAgIG9sZWRsbCA9IExpYnJhcnlMb2FkZXIoT2xlRExMKQogCkBAIC01MDMsNyArNTAwLDcgQEAKICAgICAgICAgcmV0dXJuIF93c3RyaW5nX2F0KHB0ciwgc2l6ZSkKIAogCi1pZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6ICMgQ09NIHN0dWZmCitpZiBfb3MubmFtZSA9PSAibnQiOiAjIENPTSBzdHVmZgogICAgIGRlZiBEbGxHZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGNjb20gPSBfX2ltcG9ydF9fKCJjb210eXBlcy5zZXJ2ZXIuaW5wcm9jc2VydmVyIiwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWycqJ10pCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKaW5kZXggYjM5ZDgyYy4uYzcxZDcxZCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weQpAQCAtMyw3ICszLDYgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zCiAKLWltcG9ydCBjdHlwZXMKIGltcG9ydCBfY3R5cGVzX3Rlc3QKIAogY2xhc3MgQklUUyhTdHJ1Y3R1cmUpOgpAQCAtMTk3LDcgKzE5Niw3IEBACiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSwgNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCwgNCldCi0gICAgICAgIGlmIG9zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSoyKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkpCkBAIC0yMjUsNyArMjI0LDcgQEAKICAgICAgICAgIyBNU1ZDIGRvZXMgTk9UIGNvbWJpbmUgY19zaG9ydCBhbmQgY19pbnQgaW50byBvbmUgZmllbGQsIEdDQwogICAgICAgICAjIGRvZXMgKHVubGVzcyBHQ0MgaXMgcnVuIHdpdGggJy1tbXMtYml0ZmllbGRzJyB3aGljaAogICAgICAgICAjIHByb2R1Y2VzIGNvZGUgY29tcGF0aWJsZSB3aXRoIE1TVkMpLgotICAgICAgICBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiA0KQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiAyKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2ZpbmQucHkKaW5kZXggMjBjNTMzNy4uYzcyMDVmNSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5CkBAIC02OSw2ICs2OSw0OSBAQAogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGgubGV4aXN0cyh0ZXN0LnN1cHBvcnQuVEVTVEZOKSkKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmVzdWx0KQogCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51eCcpLAorICAgICAgICAgICAgICAgICAgICAgJ1Rlc3Qgb25seSB2YWxpZCBmb3IgTGludXgnKQorY2xhc3MgTGliUGF0aEZpbmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9maW5kX29uX2xpYnBhdGgoc2VsZik6CisgICAgICAgIGltcG9ydCBzdWJwcm9jZXNzCisgICAgICAgIGltcG9ydCB0ZW1wZmlsZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsnZ2NjJywgJy0tdmVyc2lvbiddLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTCkKKyAgICAgICAgICAgIG91dCwgXyA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdnY2MsIG5lZWRlZCBmb3IgdGVzdCwgbm90IGF2YWlsYWJsZScpCisgICAgICAgIHdpdGggdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5KCkgYXMgZDoKKyAgICAgICAgICAgICMgY3JlYXRlIGFuIGVtcHR5IHRlbXBvcmFyeSBmaWxlCisgICAgICAgICAgICBzcmNuYW1lID0gb3MucGF0aC5qb2luKGQsICdkdW1teS5jJykKKyAgICAgICAgICAgIGxpYm5hbWUgPSAncHlfY3R5cGVzX3Rlc3RfZHVtbXknCisgICAgICAgICAgICBkc3RuYW1lID0gb3MucGF0aC5qb2luKGQsICdsaWIlcy5zbycgJSBsaWJuYW1lKQorICAgICAgICAgICAgd2l0aCBvcGVuKHNyY25hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc3JjbmFtZSkpCisgICAgICAgICAgICAjIGNvbXBpbGUgdGhlIGZpbGUgdG8gYSBzaGFyZWQgbGlicmFyeQorICAgICAgICAgICAgY21kID0gWydnY2MnLCAnLW8nLCBkc3RuYW1lLCAnLS1zaGFyZWQnLAorICAgICAgICAgICAgICAgICAgICctV2wsLXNvbmFtZSxsaWIlcy5zbycgJSBsaWJuYW1lLCBzcmNuYW1lXQorICAgICAgICAgICAgb3V0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoY21kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGRzdG5hbWUpKQorICAgICAgICAgICAgIyBub3cgY2hlY2sgdGhhdCB0aGUgLnNvIGNhbid0IGJlIGZvdW5kIChzaW5jZSBub3QgaW4KKyAgICAgICAgICAgICMgTERfTElCUkFSWV9QQVRIKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoZmluZF9saWJyYXJ5KGxpYm5hbWUpKQorICAgICAgICAgICAgIyBub3cgYWRkIHRoZSBsb2NhdGlvbiB0byBMRF9MSUJSQVJZX1BBVEgKKyAgICAgICAgICAgIHdpdGggdGVzdC5zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CisgICAgICAgICAgICAgICAgS0VZID0gJ0xEX0xJQlJBUllfUEFUSCcKKyAgICAgICAgICAgICAgICBpZiBLRVkgbm90IGluIGVudjoKKyAgICAgICAgICAgICAgICAgICAgdiA9IGQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB2ID0gJyVzOiVzJyAlIChlbnZbS0VZXSwgZCkKKyAgICAgICAgICAgICAgICBlbnYuc2V0KEtFWSwgdikKKyAgICAgICAgICAgICAgICAjIG5vdyBjaGVjayB0aGF0IHRoZSAuc28gY2FuIGJlIGZvdW5kIChzaW5jZSBpbgorICAgICAgICAgICAgICAgICMgTERfTElCUkFSWV9QQVRIKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmluZF9saWJyYXJ5KGxpYm5hbWUpLCAnbGliJXMuc28nICUgbGlibmFtZSkKKworCiAjIE9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBzdWZmaXggaXMgJy5zbycsCiAjIGF0IGxlYXN0IHNvbWUgbGlicmFyaWVzIGNhbiBiZSBsb2FkZWQgYXMgYXR0cmlidXRlcyBvZiB0aGUgY2RsbAogIyBvYmplY3QsIHNpbmNlIGN0eXBlcyBub3cgdHJpZXMgbG9hZGluZyB0aGUgbGliIGFnYWluCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5weQppbmRleCBmZjI1YzhmLi5mMzQ3MzRiIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHkKQEAgLTEsNCArMSw0IEBACi1pbXBvcnQgb3MsIHVuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKIGZyb20gY3R5cGVzIGltcG9ydCAqCiAKIHRyeToKQEAgLTM5LDcgKzM5LDcgQEAKICAgICAgICAgIyBwb3NzaWJsZSwgYXMgaW4gQywgdG8gY2FsbCBjZGVjbCBmdW5jdGlvbnMgd2l0aCBtb3JlIHBhcmFtZXRlcnMuCiAgICAgICAgICNzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMsIDEsIDIsIDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYygxLCAyLCAzLCA0LCA1LCA2KSwgMykKLSAgICAgICAgaWYgbm90IFdJTkZVTkNUWVBFIGlzIENGVU5DVFlQRSBhbmQgb3MubmFtZSAhPSAiY2UiOgorICAgICAgICBpZiBub3QgV0lORlVOQ1RZUEUgaXMgQ0ZVTkNUWVBFOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzLCAxLCAyLCAzKQogCiAgICAgZGVmIHRlc3Rfc3RydWN0dXJlcyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CmluZGV4IDI4NDY4YzEuLjQ1NTcxZjMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQpAQCAtMTEsOCArMTEsNiBAQAogICAgIGdsb2JhbCBsaWJjX25hbWUKICAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgIGxpYmNfbmFtZSA9IGZpbmRfbGlicmFyeSgiYyIpCi0gICAgZWxpZiBvcy5uYW1lID09ICJjZSI6Ci0gICAgICAgIGxpYmNfbmFtZSA9ICJjb3JlZGxsIgogICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJjeWd3aW4iOgogICAgICAgICBsaWJjX25hbWUgPSAiY3lnd2luMS5kbGwiCiAgICAgZWxzZToKQEAgLTQ5LDggKzQ3LDggQEAKICAgICAgICAgICAgICAgICBjZGxsLkxvYWRMaWJyYXJ5KGxpYikKICAgICAgICAgICAgICAgICBDRExMKGxpYikKIAotICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgaW4gKCJudCIsICJjZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IHNwZWNpZmljIHRvIFdpbmRvd3MgKE5UL0NFKScpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSA9PSAibnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IHNwZWNpZmljIHRvIFdpbmRvd3MnKQogICAgIGRlZiB0ZXN0X2xvYWRfbGlicmFyeShzZWxmKToKICAgICAgICAgIyBDUlQgaXMgbm8gbG9uZ2VyIGRpcmVjdGx5IGxvYWRhYmxlLiBTZWUgaXNzdWUyMzYwNiBmb3IgdGhlCiAgICAgICAgICMgZGlzY3Vzc2lvbiBhYm91dCBhbHRlcm5hdGl2ZSBhcHByb2FjaGVzLgpAQCAtNjQsMTQgKzYyLDkgQEAKICAgICAgICAgICAgIHdpbmRsbFsia2VybmVsMzIiXS5HZXRNb2R1bGVIYW5kbGVXCiAgICAgICAgICAgICB3aW5kbGwuTG9hZExpYnJhcnkoImtlcm5lbDMyIikuR2V0TW9kdWxlSGFuZGxlVwogICAgICAgICAgICAgV2luRExMKCJrZXJuZWwzMiIpLkdldE1vZHVsZUhhbmRsZVcKLSAgICAgICAgZWxpZiBvcy5uYW1lID09ICJjZSI6Ci0gICAgICAgICAgICB3aW5kbGwuY29yZWRsbC5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICB3aW5kbGxbImNvcmVkbGwiXS5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICB3aW5kbGwuTG9hZExpYnJhcnkoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICBXaW5ETEwoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCiAKLSAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lIGluICgibnQiLCAiY2UiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdCBzcGVjaWZpYyB0byBXaW5kb3dzIChOVC9DRSknKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gIm50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdCBzcGVjaWZpYyB0byBXaW5kb3dzJykKICAgICBkZWYgdGVzdF9sb2FkX29yZGluYWxfZnVuY3Rpb25zKHNlbGYpOgogICAgICAgICBpbXBvcnQgX2N0eXBlc190ZXN0CiAgICAgICAgIGRsbCA9IFdpbkRMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weQppbmRleCBlZjdiMjBiLi4xOWUzZGMxIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHkKQEAgLTU0LDcgKzU0LDcgQEAKIAogJycnCiAKLWltcG9ydCB1bml0dGVzdCwgZG9jdGVzdCwgc3lzCitpbXBvcnQgdW5pdHRlc3QsIGRvY3Rlc3QKIAogaW1wb3J0IGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cwogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQppbmRleCBlNTZiY2NmLi4zNjNmNTg2IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKQEAgLTEsNCArMSw0IEBACi1pbXBvcnQgdW5pdHRlc3QsIHN5cworaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBuZWVkX3N5bWJvbAogCiBjbGFzcyBTaW1wbGVUeXBlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogICAgICMgWFhYIFJlcGxhY2UgYnkgY19jaGFyX3AgdGVzdHMKICAgICBkZWYgdGVzdF9jc3RyaW5ncyhzZWxmKToKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfY2hhcl9wLCBieXJlZgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19jaGFyX3AKIAogICAgICAgICAjIGNfY2hhcl9wLmZyb21fcGFyYW0gb24gYSBQeXRob24gU3RyaW5nIHBhY2tzIHRoZSBzdHJpbmcKICAgICAgICAgIyBpbnRvIGEgY3BhcmFtIG9iamVjdApAQCAtNjgsNyArNjgsNyBAQAogCiAgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyX3AnKQogICAgIGRlZiB0ZXN0X2N3X3N0cmluZ3Moc2VsZik6Ci0gICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBieXJlZiwgY193Y2hhcl9wCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3djaGFyX3AKIAogICAgICAgICBjX3djaGFyX3AuZnJvbV9wYXJhbSgiMTIzIikKIApAQCAtOTgsNyArOTgsNyBAQAogICAgIGRlZiB0ZXN0X2J5cmVmX3BvaW50ZXIoc2VsZik6CiAgICAgICAgICMgVGhlIGZyb21fcGFyYW0gY2xhc3MgbWV0aG9kIG9mIFBPSU5URVIodHlwKSBjbGFzc2VzIGFjY2VwdHMgd2hhdCBpcwogICAgICAgICAjIHJldHVybmVkIGJ5IGJ5cmVmKG9iaiksIGl0IHR5cGUob2JqKSA9PSB0eXAKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgcG9pbnRlciwgUE9JTlRFUiwgYnlyZWYKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgUE9JTlRFUiwgYnlyZWYKICAgICAgICAgTFBJTlQgPSBQT0lOVEVSKGNfaW50KQogCiAgICAgICAgIExQSU5ULmZyb21fcGFyYW0oYnlyZWYoY19pbnQoNDIpKSkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wZXAzMTE4LnB5CmluZGV4IDMyZjgwMmMuLmQ2ODM5N2UgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weQpAQCAtMSw2ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKLWltcG9ydCByZSwgc3RydWN0LCBzeXMKK2ltcG9ydCByZSwgc3lzCiAKIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CiAgICAgVEhJU19FTkRJQU4gPSAiPCIKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKaW5kZXggOTNlYmE2Yi4uMTk3NGY0MCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKQEAgLTEsNiArMSw1IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gY3R5cGVzIGltcG9ydCAqCi1pbXBvcnQgb3MKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CmluZGV4IGY5YjVlOTcuLjRjZWFjYmMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CkBAIC0yLDcgKzIsNiBAQAogCiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIAogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQppbmRleCBjNGE2NTFjLi44ZjZmZTVmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKQEAgLTMyNiwxMSArMzI2LDggQEAKIAogICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChQZXJzb24sIGIiU29tZW9uZSIsIChiImEiLCBiImIiLCBiImMiKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbHMsIFJ1bnRpbWVFcnJvcikKLSAgICAgICAgaWYgaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUGhvbmUpIDxjbGFzcyAnVHlwZUVycm9yJz46IHRvbyBtYW55IGluaXRpYWxpemVycyIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgIihQaG9uZSkgVHlwZUVycm9yOiB0b28gbWFueSBpbml0aWFsaXplcnMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgPGNsYXNzICdUeXBlRXJyb3InPjogdG9vIG1hbnkgaW5pdGlhbGl6ZXJzIikKIAogICAgIGRlZiB0ZXN0X2h1Z2VfZmllbGRfbmFtZShzZWxmKToKICAgICAgICAgIyBpc3N1ZTEyODgxOiBzZWdmYXVsdCB3aXRoIGxhcmdlIHN0cnVjdHVyZSBmaWVsZCBuYW1lcwpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5CmluZGV4IDVhM2E0N2YuLmU3MWI0ODAgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHkKQEAgLTc5LDkgKzc5LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChlbnRyeS5uYW1lLmRlY29kZSgiYXNjaWkiKSwgZW50cnkuc2l6ZSkpCiAKLSAgICAgICAgZXhwZWN0ZWQgPSBbKCJfX2hlbGxvX18iLCAxNjEpLAotICAgICAgICAgICAgICAgICAgICAoIl9fcGhlbGxvX18iLCAtMTYxKSwKLSAgICAgICAgICAgICAgICAgICAgKCJfX3BoZWxsb19fLnNwYW0iLCAxNjEpLAorICAgICAgICBleHBlY3RlZCA9IFsoIl9faGVsbG9fXyIsIDEzOSksCisgICAgICAgICAgICAgICAgICAgICgiX19waGVsbG9fXyIsIC0xMzkpLAorICAgICAgICAgICAgICAgICAgICAoIl9fcGhlbGxvX18uc3BhbSIsIDEzOSksCiAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtcywgZXhwZWN0ZWQsICJQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzIGV4YW1wbGUgIgogICAgICAgICAgICAgImluIERvYy9saWJyYXJ5L2N0eXBlcy5yc3QgbWF5IGJlIG91dCBvZiBkYXRlIikKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdXRpbC5weSBiL0xpYi9jdHlwZXMvdXRpbC5weQppbmRleCA3Njg0ZWFiLi4zMzlhZThhIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3V0aWwucHkKKysrIGIvTGliL2N0eXBlcy91dGlsLnB5CkBAIC02NywxNiArNjcsNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBmbmFtZQogICAgICAgICByZXR1cm4gTm9uZQogCi1pZiBvcy5uYW1lID09ICJjZSI6Ci0gICAgIyBzZWFyY2ggcGF0aCBhY2NvcmRpbmcgdG8gTVNETjoKLSAgICAjIC0gYWJzb2x1dGUgcGF0aCBzcGVjaWZpZWQgYnkgZmlsZW5hbWUKLSAgICAjIC0gVGhlIC5leGUgbGF1bmNoIGRpcmVjdG9yeQotICAgICMgLSB0aGUgV2luZG93cyBkaXJlY3RvcnkKLSAgICAjIC0gUk9NIGRsbCBmaWxlcyAod2hlcmUgYXJlIHRoZXk/KQotICAgICMgLSBPRU0gc3BlY2lmaWVkIHNlYXJjaCBwYXRoOiBIS0xNXExvYWRlclxTeXN0ZW1QYXRoCi0gICAgZGVmIGZpbmRfbGlicmFyeShuYW1lKToKLSAgICAgICAgcmV0dXJuIG5hbWUKLQogaWYgb3MubmFtZSA9PSAicG9zaXgiIGFuZCBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgZnJvbSBjdHlwZXMubWFjaG9saWIuZHlsZCBpbXBvcnQgZHlsZF9maW5kIGFzIF9keWxkX2ZpbmQKICAgICBkZWYgZmluZF9saWJyYXJ5KG5hbWUpOgpAQCAtMjcxLDggKzI2MSw4IEBACiAgICAgICAgICAgICBhYmlfdHlwZSA9IG1hY2hfbWFwLmdldChtYWNoaW5lLCAnbGliYzYnKQogCiAgICAgICAgICAgICAjIFhYWCBhc3N1bWluZyBHTElCQydzIGxkY29uZmlnICh3aXRoIG9wdGlvbiAtcCkKLSAgICAgICAgICAgIHJlZ2V4ID0gb3MuZnNlbmNvZGUoCi0gICAgICAgICAgICAgICAgJ1xzKyhsaWIlc1wuW15cc10rKVxzK1woJXMnICUgKHJlLmVzY2FwZShuYW1lKSwgYWJpX3R5cGUpKQorICAgICAgICAgICAgcmVnZXggPSByJ1xzKyhsaWIlc1wuW15cc10rKVxzK1woJXMnCisgICAgICAgICAgICByZWdleCA9IG9zLmZzZW5jb2RlKHJlZ2V4ICUgKHJlLmVzY2FwZShuYW1lKSwgYWJpX3R5cGUpKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHdpdGggc3VicHJvY2Vzcy5Qb3BlbihbJy9zYmluL2xkY29uZmlnJywgJy1wJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuREVWTlVMTCwKQEAgLTI4NSw4ICsyNzUsMzIgQEAKICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgIHBhc3MKIAorICAgICAgICBkZWYgX2ZpbmRMaWJfbGQobmFtZSk6CisgICAgICAgICAgICAjIFNlZSBpc3N1ZSAjOTk5OCBmb3Igd2h5IHRoaXMgaXMgbmVlZGVkCisgICAgICAgICAgICBleHByID0gcidbXlwoXClcc10qbGliJXNcLlteXChcKVxzXSonICUgcmUuZXNjYXBlKG5hbWUpCisgICAgICAgICAgICBjbWQgPSBbJ2xkJywgJy10J10KKyAgICAgICAgICAgIGxpYnBhdGggPSBvcy5lbnZpcm9uLmdldCgnTERfTElCUkFSWV9QQVRIJykKKyAgICAgICAgICAgIGlmIGxpYnBhdGg6CisgICAgICAgICAgICAgICAgZm9yIGQgaW4gbGlicGF0aC5zcGxpdCgnOicpOgorICAgICAgICAgICAgICAgICAgICBjbWQuZXh0ZW5kKFsnLUwnLCBkXSkKKyAgICAgICAgICAgIGNtZC5leHRlbmQoWyctbycsIG9zLmRldm51bGwsICctbCVzJyAlIG5hbWVdKQorICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQorICAgICAgICAgICAgICAgIG91dCwgXyA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICAgICAgICAgIHJlcyA9IHJlLnNlYXJjaChleHByLCBvcy5mc2RlY29kZShvdXQpKQorICAgICAgICAgICAgICAgIGlmIHJlczoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzLmdyb3VwKDApCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgcGFzcyAgIyByZXN1bHQgd2lsbCBiZSBOb25lCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKICAgICAgICAgZGVmIGZpbmRfbGlicmFyeShuYW1lKToKLSAgICAgICAgICAgIHJldHVybiBfZmluZFNvbmFtZV9sZGNvbmZpZyhuYW1lKSBvciBfZ2V0X3NvbmFtZShfZmluZExpYl9nY2MobmFtZSkpCisgICAgICAgICAgICAjIFNlZSBpc3N1ZSAjOTk5OAorICAgICAgICAgICAgcmV0dXJuIF9maW5kU29uYW1lX2xkY29uZmlnKG5hbWUpIG9yIFwKKyAgICAgICAgICAgICAgICAgICBfZ2V0X3NvbmFtZShfZmluZExpYl9nY2MobmFtZSkgb3IgX2ZpbmRMaWJfbGQobmFtZSkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgdGVzdCBjb2RlCmRpZmYgLS1naXQgYS9MaWIvZGF0ZXRpbWUucHkgYi9MaWIvZGF0ZXRpbWUucHkKaW5kZXggYTIxNzhjNy4uMzYzNzRhYSAxMDA2NDQKLS0tIGEvTGliL2RhdGV0aW1lLnB5CisrKyBiL0xpYi9kYXRldGltZS5weQpAQCAtMTUyLDEyICsxNTIsMjYgQEAKICAgICBkbnVtID0gX2RheXNfYmVmb3JlX21vbnRoKHksIG0pICsgZAogICAgIHJldHVybiBfdGltZS5zdHJ1Y3RfdGltZSgoeSwgbSwgZCwgaGgsIG1tLCBzcywgd2RheSwgZG51bSwgZHN0ZmxhZykpCiAKLWRlZiBfZm9ybWF0X3RpbWUoaGgsIG1tLCBzcywgdXMpOgotICAgICMgU2tpcCB0cmFpbGluZyBtaWNyb3NlY29uZHMgd2hlbiB1cz09MC4KLSAgICByZXN1bHQgPSAiJTAyZDolMDJkOiUwMmQiICUgKGhoLCBtbSwgc3MpCi0gICAgaWYgdXM6Ci0gICAgICAgIHJlc3VsdCArPSAiLiUwNmQiICUgdXMKLSAgICByZXR1cm4gcmVzdWx0CitkZWYgX2Zvcm1hdF90aW1lKGhoLCBtbSwgc3MsIHVzLCB0aW1lc3BlYz0nYXV0bycpOgorICAgIHNwZWNzID0geworICAgICAgICAnaG91cnMnOiAnezowMmR9JywKKyAgICAgICAgJ21pbnV0ZXMnOiAnezowMmR9Ons6MDJkfScsCisgICAgICAgICdzZWNvbmRzJzogJ3s6MDJkfTp7OjAyZH06ezowMmR9JywKKyAgICAgICAgJ21pbGxpc2Vjb25kcyc6ICd7OjAyZH06ezowMmR9Ons6MDJkfS57OjAzZH0nLAorICAgICAgICAnbWljcm9zZWNvbmRzJzogJ3s6MDJkfTp7OjAyZH06ezowMmR9Lns6MDZkfScKKyAgICB9CisKKyAgICBpZiB0aW1lc3BlYyA9PSAnYXV0byc6CisgICAgICAgICMgU2tpcCB0cmFpbGluZyBtaWNyb3NlY29uZHMgd2hlbiB1cz09MC4KKyAgICAgICAgdGltZXNwZWMgPSAnbWljcm9zZWNvbmRzJyBpZiB1cyBlbHNlICdzZWNvbmRzJworICAgIGVsaWYgdGltZXNwZWMgPT0gJ21pbGxpc2Vjb25kcyc6CisgICAgICAgIHVzIC8vPSAxMDAwCisgICAgdHJ5OgorICAgICAgICBmbXQgPSBzcGVjc1t0aW1lc3BlY10KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd24gdGltZXNwZWMgdmFsdWUnKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBmbXQuZm9ybWF0KGhoLCBtbSwgc3MsIHVzKQogCiAjIENvcnJlY3RseSBzdWJzdGl0dXRlIGZvciAleiBhbmQgJVogZXNjYXBlcyBpbiBzdHJmdGltZSBmb3JtYXRzLgogZGVmIF93cmFwX3N0cmZ0aW1lKG9iamVjdCwgZm9ybWF0LCB0aW1ldHVwbGUpOgpAQCAtMjM2LDExICsyNTAsMTEgQEAKICAgICBpZiBub3QgaXNpbnN0YW5jZShvZmZzZXQsIHRpbWVkZWx0YSk6CiAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidHppbmZvLiVzKCkgbXVzdCByZXR1cm4gTm9uZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAib3IgdGltZWRlbHRhLCBub3QgJyVzJyIgJSAobmFtZSwgdHlwZShvZmZzZXQpKSkKLSAgICBpZiBvZmZzZXQgJSB0aW1lZGVsdGEobWludXRlcz0xKSBvciBvZmZzZXQubWljcm9zZWNvbmRzOgorICAgIGlmIG9mZnNldC5taWNyb3NlY29uZHM6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInR6aW5mby4lcygpIG11c3QgcmV0dXJuIGEgd2hvbGUgbnVtYmVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAib2YgbWludXRlcywgZ290ICVzIiAlIChuYW1lLCBvZmZzZXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICJvZiBzZWNvbmRzLCBnb3QgJXMiICUgKG5hbWUsIG9mZnNldCkpCiAgICAgaWYgbm90IC10aW1lZGVsdGEoMSkgPCBvZmZzZXQgPCB0aW1lZGVsdGEoMSk6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIiVzKCk9JXMsIG11c3QgYmUgbXVzdCBiZSBzdHJpY3RseSBiZXR3ZWVuICIKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJXMoKT0lcywgbXVzdCBiZSBzdHJpY3RseSBiZXR3ZWVuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiLXRpbWVkZWx0YShob3Vycz0yNCkgYW5kIHRpbWVkZWx0YShob3Vycz0yNCkiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgb2Zmc2V0KSkKIApAQCAtMjc0LDcgKzI4OCw3IEBACiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2RheSBtdXN0IGJlIGluIDEuLiVkJyAlIGRpbSwgZGF5KQogICAgIHJldHVybiB5ZWFyLCBtb250aCwgZGF5CiAKLWRlZiBfY2hlY2tfdGltZV9maWVsZHMoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kKToKK2RlZiBfY2hlY2tfdGltZV9maWVsZHMoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCBmb2xkKToKICAgICBob3VyID0gX2NoZWNrX2ludF9maWVsZChob3VyKQogICAgIG1pbnV0ZSA9IF9jaGVja19pbnRfZmllbGQobWludXRlKQogICAgIHNlY29uZCA9IF9jaGVja19pbnRfZmllbGQoc2Vjb25kKQpAQCAtMjg3LDcgKzMwMSw5IEBACiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3NlY29uZCBtdXN0IGJlIGluIDAuLjU5Jywgc2Vjb25kKQogICAgIGlmIG5vdCAwIDw9IG1pY3Jvc2Vjb25kIDw9IDk5OTk5OToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbWljcm9zZWNvbmQgbXVzdCBiZSBpbiAwLi45OTk5OTknLCBtaWNyb3NlY29uZCkKLSAgICByZXR1cm4gaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kCisgICAgaWYgZm9sZCBub3QgaW4gKDAsIDEpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmb2xkIG11c3QgYmUgZWl0aGVyIDAgb3IgMScsIGZvbGQpCisgICAgcmV0dXJuIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZAogCiBkZWYgX2NoZWNrX3R6aW5mb19hcmcodHopOgogICAgIGlmIHR6IGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZSh0eiwgdHppbmZvKToKQEAgLTMxNiw2ICszMzIsNyBAQAogCiAgICAgcmV0dXJuIHEKIAorCiBjbGFzcyB0aW1lZGVsdGE6CiAgICAgIiIiUmVwcmVzZW50IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGRhdGV0aW1lIG9iamVjdHMuCiAKQEAgLTkxNSw3ICs5MzIsNyBAQAogCiAgICAgIyBQaWNrbGUgc3VwcG9ydC4KIAotICAgIGRlZiBfZ2V0c3RhdGUoc2VsZik6CisgICAgZGVmIF9nZXRzdGF0ZShzZWxmLCBwcm90b2NvbD0zKToKICAgICAgICAgeWhpLCB5bG8gPSBkaXZtb2Qoc2VsZi5feWVhciwgMjU2KQogICAgICAgICByZXR1cm4gYnl0ZXMoW3loaSwgeWxvLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5XSksCiAKQEAgLTkyMyw4ICs5NDAsOCBAQAogICAgICAgICB5aGksIHlsbywgc2VsZi5fbW9udGgsIHNlbGYuX2RheSA9IHN0cmluZwogICAgICAgICBzZWxmLl95ZWFyID0geWhpICogMjU2ICsgeWxvCiAKLSAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIChzZWxmLl9fY2xhc3NfXywgc2VsZi5fZ2V0c3RhdGUoKSkKKyAgICBkZWYgX19yZWR1Y2VfZXhfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIHNlbGYuX2dldHN0YXRlKHByb3RvY29sKSkKIAogX2RhdGVfY2xhc3MgPSBkYXRlICAjIHNvIGZ1bmN0aW9ucyB3LyBhcmdzIG5hbWVkICJkYXRlIiBjYW4gZ2V0IGF0IHRoZSBjbGFzcwogCkBAIC05MzIsNiArOTQ5LDcgQEAKIGRhdGUubWF4ID0gZGF0ZSg5OTk5LCAxMiwgMzEpCiBkYXRlLnJlc29sdXRpb24gPSB0aW1lZGVsdGEoZGF5cz0xKQogCisKIGNsYXNzIHR6aW5mbzoKICAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aW1lIHpvbmUgaW5mbyBjbGFzc2VzLgogCkBAIC0xMDIzLDExICsxMDQxLDExIEBACiAgICAgZHN0KCkKIAogICAgIFByb3BlcnRpZXMgKHJlYWRvbmx5KToKLSAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsIHR6aW5mbworICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgdHppbmZvLCBmb2xkCiAgICAgIiIiCi0gICAgX19zbG90c19fID0gJ19ob3VyJywgJ19taW51dGUnLCAnX3NlY29uZCcsICdfbWljcm9zZWNvbmQnLCAnX3R6aW5mbycsICdfaGFzaGNvZGUnCisgICAgX19zbG90c19fID0gJ19ob3VyJywgJ19taW51dGUnLCAnX3NlY29uZCcsICdfbWljcm9zZWNvbmQnLCAnX3R6aW5mbycsICdfaGFzaGNvZGUnLCAnX2ZvbGQnCiAKLSAgICBkZWYgX19uZXdfXyhjbHMsIGhvdXI9MCwgbWludXRlPTAsIHNlY29uZD0wLCBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSk6CisgICAgZGVmIF9fbmV3X18oY2xzLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUsICosIGZvbGQ9MCk6CiAgICAgICAgICIiIkNvbnN0cnVjdG9yLgogCiAgICAgICAgIEFyZ3VtZW50czoKQEAgLTEwMzUsMTUgKzEwNTMsMTYgQEAKICAgICAgICAgaG91ciwgbWludXRlIChyZXF1aXJlZCkKICAgICAgICAgc2Vjb25kLCBtaWNyb3NlY29uZCAoZGVmYXVsdCB0byB6ZXJvKQogICAgICAgICB0emluZm8gKGRlZmF1bHQgdG8gTm9uZSkKKyAgICAgICAgZm9sZCAoa2V5d29yZCBvbmx5LCBkZWZhdWx0IHRvIFRydWUpCiAgICAgICAgICIiIgotICAgICAgICBpZiBpc2luc3RhbmNlKGhvdXIsIGJ5dGVzKSBhbmQgbGVuKGhvdXIpID09IDYgYW5kIGhvdXJbMF0gPCAyNDoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShob3VyLCBieXRlcykgYW5kIGxlbihob3VyKSA9PSA2IGFuZCBob3VyWzBdJjB4N0YgPCAyNDoKICAgICAgICAgICAgICMgUGlja2xlIHN1cHBvcnQKICAgICAgICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpCiAgICAgICAgICAgICBzZWxmLl9fc2V0c3RhdGUoaG91ciwgbWludXRlIG9yIE5vbmUpCiAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IC0xCiAgICAgICAgICAgICByZXR1cm4gc2VsZgotICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQgPSBfY2hlY2tfdGltZV9maWVsZHMoCi0gICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQpCisgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZCA9IF9jaGVja190aW1lX2ZpZWxkcygKKyAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZCkKICAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHppbmZvKQogICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKQogICAgICAgICBzZWxmLl9ob3VyID0gaG91cgpAQCAtMTA1Miw2ICsxMDcxLDcgQEAKICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgPSBtaWNyb3NlY29uZAogICAgICAgICBzZWxmLl90emluZm8gPSB0emluZm8KICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMQorICAgICAgICBzZWxmLl9mb2xkID0gZm9sZAogICAgICAgICByZXR1cm4gc2VsZgogCiAgICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzCkBAIC0xMDgwLDYgKzExMDAsMTAgQEAKICAgICAgICAgIiIidGltZXpvbmUgaW5mbyBvYmplY3QiIiIKICAgICAgICAgcmV0dXJuIHNlbGYuX3R6aW5mbwogCisgICAgQHByb3BlcnR5CisgICAgZGVmIGZvbGQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9mb2xkCisKICAgICAjIFN0YW5kYXJkIGNvbnZlcnNpb25zLCBfX2hhc2hfXyAoYW5kIGhlbHBlcnMpCiAKICAgICAjIENvbXBhcmlzb25zIG9mIHRpbWUgb2JqZWN0cyB3aXRoIG90aGVyLgpAQCAtMTE0NSw5ICsxMTY5LDEzIEBACiAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICAiIiJIYXNoLiIiIgogICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMToKLSAgICAgICAgICAgIHR6b2ZmID0gc2VsZi51dGNvZmZzZXQoKQorICAgICAgICAgICAgaWYgc2VsZi5mb2xkOgorICAgICAgICAgICAgICAgIHQgPSBzZWxmLnJlcGxhY2UoZm9sZD0wKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0ID0gc2VsZgorICAgICAgICAgICAgdHpvZmYgPSB0LnV0Y29mZnNldCgpCiAgICAgICAgICAgICBpZiBub3QgdHpvZmY6ICAjIHplcm8gb3IgTm9uZQotICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaCh0Ll9nZXRzdGF0ZSgpWzBdKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBoLCBtID0gZGl2bW9kKHRpbWVkZWx0YShob3Vycz1zZWxmLmhvdXIsIG1pbnV0ZXM9c2VsZi5taW51dGUpIC0gdHpvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lZGVsdGEoaG91cnM9MSkpCkBAIC0xMTcxLDEwICsxMTk5LDExIEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNpZ24gPSAiKyIKICAgICAgICAgICAgIGhoLCBtbSA9IGRpdm1vZChvZmYsIHRpbWVkZWx0YShob3Vycz0xKSkKLSAgICAgICAgICAgIGFzc2VydCBub3QgbW0gJSB0aW1lZGVsdGEobWludXRlcz0xKSwgIndob2xlIG1pbnV0ZSIKLSAgICAgICAgICAgIG1tIC8vPSB0aW1lZGVsdGEobWludXRlcz0xKQorICAgICAgICAgICAgbW0sIHNzID0gZGl2bW9kKG1tLCB0aW1lZGVsdGEobWludXRlcz0xKSkKICAgICAgICAgICAgIGFzc2VydCAwIDw9IGhoIDwgMjQKICAgICAgICAgICAgIG9mZiA9ICIlcyUwMmQlcyUwMmQiICUgKHNpZ24sIGhoLCBzZXAsIG1tKQorICAgICAgICAgICAgaWYgc3M6CisgICAgICAgICAgICAgICAgb2ZmICs9ICc6JTAyZCcgJSBzcy5zZWNvbmRzCiAgICAgICAgIHJldHVybiBvZmYKIAogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKQEAgLTExOTEsMTYgKzEyMjAsMjIgQEAKICAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgYXNzZXJ0IHNbLTE6XSA9PSAiKSIKICAgICAgICAgICAgIHMgPSBzWzotMV0gKyAiLCB0emluZm89JXIiICUgc2VsZi5fdHppbmZvICsgIikiCisgICAgICAgIGlmIHNlbGYuX2ZvbGQ6CisgICAgICAgICAgICBhc3NlcnQgc1stMTpdID09ICIpIgorICAgICAgICAgICAgcyA9IHNbOi0xXSArICIsIGZvbGQ9MSkiCiAgICAgICAgIHJldHVybiBzCiAKLSAgICBkZWYgaXNvZm9ybWF0KHNlbGYpOgorICAgIGRlZiBpc29mb3JtYXQoc2VsZiwgdGltZXNwZWM9J2F1dG8nKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSB0aW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSVNPLgogCi0gICAgICAgIFRoaXMgaXMgJ0hIOk1NOlNTLm1tbW1tbSt6ejp6eicsIG9yICdISDpNTTpTUyt6ejp6eicgaWYKLSAgICAgICAgc2VsZi5taWNyb3NlY29uZCA9PSAwLgorICAgICAgICBUaGUgZnVsbCBmb3JtYXQgaXMgJ0hIOk1NOlNTLm1tbW1tbSt6ejp6eicuIEJ5IGRlZmF1bHQsIHRoZSBmcmFjdGlvbmFsCisgICAgICAgIHBhcnQgaXMgb21pdHRlZCBpZiBzZWxmLm1pY3Jvc2Vjb25kID09IDAuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IHRpbWVzcGVjIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAgICAgICAgdGVybXMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZS4KICAgICAgICAgIiIiCiAgICAgICAgIHMgPSBfZm9ybWF0X3RpbWUoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kLCB0aW1lc3BlYykKICAgICAgICAgdHogPSBzZWxmLl90enN0cigpCiAgICAgICAgIGlmIHR6OgogICAgICAgICAgICAgcyArPSB0egpAQCAtMTI2Niw3ICsxMzAxLDcgQEAKICAgICAgICAgcmV0dXJuIG9mZnNldAogCiAgICAgZGVmIHJlcGxhY2Uoc2VsZiwgaG91cj1Ob25lLCBtaW51dGU9Tm9uZSwgc2Vjb25kPU5vbmUsIG1pY3Jvc2Vjb25kPU5vbmUsCi0gICAgICAgICAgICAgICAgdHppbmZvPVRydWUpOgorICAgICAgICAgICAgICAgIHR6aW5mbz1UcnVlLCAqLCBmb2xkPU5vbmUpOgogICAgICAgICAiIiJSZXR1cm4gYSBuZXcgdGltZSB3aXRoIG5ldyB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGRzLiIiIgogICAgICAgICBpZiBob3VyIGlzIE5vbmU6CiAgICAgICAgICAgICBob3VyID0gc2VsZi5ob3VyCkBAIC0xMjc4LDE0ICsxMzEzLDE5IEBACiAgICAgICAgICAgICBtaWNyb3NlY29uZCA9IHNlbGYubWljcm9zZWNvbmQKICAgICAgICAgaWYgdHppbmZvIGlzIFRydWU6CiAgICAgICAgICAgICB0emluZm8gPSBzZWxmLnR6aW5mbwotICAgICAgICByZXR1cm4gdGltZShob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsIHR6aW5mbykKKyAgICAgICAgaWYgZm9sZCBpcyBOb25lOgorICAgICAgICAgICAgZm9sZCA9IHNlbGYuX2ZvbGQKKyAgICAgICAgcmV0dXJuIHRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCB0emluZm8sIGZvbGQ9Zm9sZCkKIAogICAgICMgUGlja2xlIHN1cHBvcnQuCiAKLSAgICBkZWYgX2dldHN0YXRlKHNlbGYpOgorICAgIGRlZiBfZ2V0c3RhdGUoc2VsZiwgcHJvdG9jb2w9Myk6CiAgICAgICAgIHVzMiwgdXMzID0gZGl2bW9kKHNlbGYuX21pY3Jvc2Vjb25kLCAyNTYpCiAgICAgICAgIHVzMSwgdXMyID0gZGl2bW9kKHVzMiwgMjU2KQotICAgICAgICBiYXNlc3RhdGUgPSBieXRlcyhbc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsCisgICAgICAgIGggPSBzZWxmLl9ob3VyCisgICAgICAgIGlmIHNlbGYuX2ZvbGQgYW5kIHByb3RvY29sID4gMzoKKyAgICAgICAgICAgIGggKz0gMTI4CisgICAgICAgIGJhc2VzdGF0ZSA9IGJ5dGVzKFtoLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzMSwgdXMyLCB1czNdKQogICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybiAoYmFzZXN0YXRlLCkKQEAgLTEyOTUsMTIgKzEzMzUsMTggQEAKICAgICBkZWYgX19zZXRzdGF0ZShzZWxmLCBzdHJpbmcsIHR6aW5mbyk6CiAgICAgICAgIGlmIHR6aW5mbyBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UodHppbmZvLCBfdHppbmZvX2NsYXNzKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYmFkIHR6aW5mbyBzdGF0ZSBhcmciKQotICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwgdXMxLCB1czIsIHVzMyA9IHN0cmluZworICAgICAgICBoLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwgdXMxLCB1czIsIHVzMyA9IHN0cmluZworICAgICAgICBpZiBoID4gMTI3OgorICAgICAgICAgICAgc2VsZi5fZm9sZCA9IDEKKyAgICAgICAgICAgIHNlbGYuX2hvdXIgPSBoIC0gMTI4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9mb2xkID0gMAorICAgICAgICAgICAgc2VsZi5faG91ciA9IGgKICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgPSAoKCh1czEgPDwgOCkgfCB1czIpIDw8IDgpIHwgdXMzCiAgICAgICAgIHNlbGYuX3R6aW5mbyA9IHR6aW5mbwogCi0gICAgZGVmIF9fcmVkdWNlX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAodGltZSwgc2VsZi5fZ2V0c3RhdGUoKSkKKyAgICBkZWYgX19yZWR1Y2VfZXhfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHJldHVybiAodGltZSwgc2VsZi5fZ2V0c3RhdGUocHJvdG9jb2wpKQogCiBfdGltZV9jbGFzcyA9IHRpbWUgICMgc28gZnVuY3Rpb25zIHcvIGFyZ3MgbmFtZWQgInRpbWUiIGNhbiBnZXQgYXQgdGhlIGNsYXNzCiAKQEAgLTEzMTcsMTYgKzEzNjMsMTYgQEAKICAgICBfX3Nsb3RzX18gPSBkYXRlLl9fc2xvdHNfXyArIHRpbWUuX19zbG90c19fCiAKICAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwKLSAgICAgICAgICAgICAgICBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UoeWVhciwgYnl0ZXMpIGFuZCBsZW4oeWVhcikgPT0gMTAgYW5kIDEgPD0geWVhclsyXSA8PSAxMjoKKyAgICAgICAgICAgICAgICBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSwgKiwgZm9sZD0wKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh5ZWFyLCBieXRlcykgYW5kIGxlbih5ZWFyKSA9PSAxMCBhbmQgMSA8PSB5ZWFyWzJdJjB4N0YgPD0gMTI6CiAgICAgICAgICAgICAjIFBpY2tsZSBzdXBwb3J0CiAgICAgICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKQogICAgICAgICAgICAgc2VsZi5fX3NldHN0YXRlKHllYXIsIG1vbnRoKQogICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMQogICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KQotICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQgPSBfY2hlY2tfdGltZV9maWVsZHMoCi0gICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQpCisgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZCA9IF9jaGVja190aW1lX2ZpZWxkcygKKyAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZCkKICAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHppbmZvKQogICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKQogICAgICAgICBzZWxmLl95ZWFyID0geWVhcgpAQCAtMTMzOCw2ICsxMzg0LDcgQEAKICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgPSBtaWNyb3NlY29uZAogICAgICAgICBzZWxmLl90emluZm8gPSB0emluZm8KICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMQorICAgICAgICBzZWxmLl9mb2xkID0gZm9sZAogICAgICAgICByZXR1cm4gc2VsZgogCiAgICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzCkBAIC0xMzY2LDYgKzE0MTMsMTAgQEAKICAgICAgICAgIiIidGltZXpvbmUgaW5mbyBvYmplY3QiIiIKICAgICAgICAgcmV0dXJuIHNlbGYuX3R6aW5mbwogCisgICAgQHByb3BlcnR5CisgICAgZGVmIGZvbGQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9mb2xkCisKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgX2Zyb210aW1lc3RhbXAoY2xzLCB0LCB1dGMsIHR6KToKICAgICAgICAgIiIiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAobGlrZSB0aW1lLnRpbWUoKSkuCkBAIC0xMzg0LDcgKzE0MzUsMjMgQEAKICAgICAgICAgY29udmVydGVyID0gX3RpbWUuZ210aW1lIGlmIHV0YyBlbHNlIF90aW1lLmxvY2FsdGltZQogICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZWVrZGF5LCBqZGF5LCBkc3QgPSBjb252ZXJ0ZXIodCkKICAgICAgICAgc3MgPSBtaW4oc3MsIDU5KSAgICAjIGNsYW1wIG91dCBsZWFwIHNlY29uZHMgaWYgdGhlIHBsYXRmb3JtIGhhcyB0aGVtCi0gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6KQorICAgICAgICByZXN1bHQgPSBjbHMoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6KQorICAgICAgICBpZiB0eiBpcyBOb25lOgorICAgICAgICAgICAgIyBBcyBvZiB2ZXJzaW9uIDIwMTVmIG1heCBmb2xkIGluIElBTkEgZGF0YWJhc2UgaXMKKyAgICAgICAgICAgICMgMjMgaG91cnMgYXQgMTk2OS0wOS0zMCAxMzowMDowMCBpbiBLd2FqYWxlaW4uCisgICAgICAgICAgICAjIExldCdzIHByb2JlIDI0IGhvdXJzIGluIHRoZSBwYXN0IHRvIGRldGVjdCBhIHRyYW5zaXRpb246CisgICAgICAgICAgICBtYXhfZm9sZF9zZWNvbmRzID0gMjQgKiAzNjAwCisgICAgICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzID0gY29udmVydGVyKHQgLSBtYXhfZm9sZF9zZWNvbmRzKVs6Nl0KKyAgICAgICAgICAgIHByb2JlMSA9IGNscyh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHopCisgICAgICAgICAgICB0cmFucyA9IHJlc3VsdCAtIHByb2JlMSAtIHRpbWVkZWx0YSgwLCBtYXhfZm9sZF9zZWNvbmRzKQorICAgICAgICAgICAgaWYgdHJhbnMuZGF5cyA8IDA6CisgICAgICAgICAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcyA9IGNvbnZlcnRlcih0ICsgdHJhbnMgLy8gdGltZWRlbHRhKDAsIDEpKVs6Nl0KKyAgICAgICAgICAgICAgICBwcm9iZTIgPSBjbHMoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6KQorICAgICAgICAgICAgICAgIGlmIHByb2JlMiA9PSByZXN1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5fZm9sZCA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHR6LmZyb211dGMocmVzdWx0KQorICAgICAgICByZXR1cm4gcmVzdWx0CiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgZnJvbXRpbWVzdGFtcChjbHMsIHQsIHR6PU5vbmUpOgpAQCAtMTM5NCwxMCArMTQ2MSw3IEBACiAgICAgICAgICIiIgogICAgICAgICBfY2hlY2tfdHppbmZvX2FyZyh0eikKIAotICAgICAgICByZXN1bHQgPSBjbHMuX2Zyb210aW1lc3RhbXAodCwgdHogaXMgbm90IE5vbmUsIHR6KQotICAgICAgICBpZiB0eiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJlc3VsdCA9IHR6LmZyb211dGMocmVzdWx0KQotICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHJldHVybiBjbHMuX2Zyb210aW1lc3RhbXAodCwgdHogaXMgbm90IE5vbmUsIHR6KQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHV0Y2Zyb210aW1lc3RhbXAoY2xzLCB0KToKQEAgLTE0MTcsMTUgKzE0ODEsMTcgQEAKICAgICAgICAgcmV0dXJuIGNscy51dGNmcm9tdGltZXN0YW1wKHQpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgY29tYmluZShjbHMsIGRhdGUsIHRpbWUpOgorICAgIGRlZiBjb21iaW5lKGNscywgZGF0ZSwgdGltZSwgdHppbmZvPVRydWUpOgogICAgICAgICAiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSBhIGdpdmVuIGRhdGUgYW5kIGEgZ2l2ZW4gdGltZS4iCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGUsIF9kYXRlX2NsYXNzKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZGF0ZSBhcmd1bWVudCBtdXN0IGJlIGEgZGF0ZSBpbnN0YW5jZSIpCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRpbWUsIF90aW1lX2NsYXNzKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidGltZSBhcmd1bWVudCBtdXN0IGJlIGEgdGltZSBpbnN0YW5jZSIpCisgICAgICAgIGlmIHR6aW5mbyBpcyBUcnVlOgorICAgICAgICAgICAgdHppbmZvID0gdGltZS50emluZm8KICAgICAgICAgcmV0dXJuIGNscyhkYXRlLnllYXIsIGRhdGUubW9udGgsIGRhdGUuZGF5LAogICAgICAgICAgICAgICAgICAgIHRpbWUuaG91ciwgdGltZS5taW51dGUsIHRpbWUuc2Vjb25kLCB0aW1lLm1pY3Jvc2Vjb25kLAotICAgICAgICAgICAgICAgICAgIHRpbWUudHppbmZvKQorICAgICAgICAgICAgICAgICAgIHR6aW5mbywgZm9sZD10aW1lLmZvbGQpCiAKICAgICBkZWYgdGltZXR1cGxlKHNlbGYpOgogICAgICAgICAiUmV0dXJuIGxvY2FsIHRpbWUgdHVwbGUgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuIgpAQCAtMTQ0MCwxMiArMTUwNiw0NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCkKIAorICAgIGRlZiBfbWt0aW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gaW50ZWdlciBQT1NJWCB0aW1lc3RhbXAuIiIiCisgICAgICAgIGVwb2NoID0gZGF0ZXRpbWUoMTk3MCwgMSwgMSkKKyAgICAgICAgbWF4X2ZvbGRfc2Vjb25kcyA9IDI0ICogMzYwMAorICAgICAgICB0ID0gKHNlbGYgLSBlcG9jaCkgLy8gdGltZWRlbHRhKDAsIDEpCisgICAgICAgIGRlZiBsb2NhbCh1KToKKyAgICAgICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MgPSBfdGltZS5sb2NhbHRpbWUodSlbOjZdCisgICAgICAgICAgICByZXR1cm4gKGRhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MpIC0gZXBvY2gpIC8vIHRpbWVkZWx0YSgwLCAxKQorCisgICAgICAgICMgT3VyIGdvYWwgaXMgdG8gc29sdmUgdCA9IGxvY2FsKHUpIGZvciB1LgorICAgICAgICBhID0gbG9jYWwodCkgLSB0CisgICAgICAgIHUxID0gdCAtIGEKKyAgICAgICAgdDEgPSBsb2NhbCh1MSkKKyAgICAgICAgaWYgdDEgPT0gdDoKKyAgICAgICAgICAgICMgV2UgZm91bmQgb25lIHNvbHV0aW9uLCBidXQgaXQgbWF5IG5vdCBiZSB0aGUgb25lIHdlIG5lZWQuCisgICAgICAgICAgICAjIExvb2sgZm9yIGFuIGVhcmxpZXIgc29sdXRpb24gKGlmIGBmb2xkYCBpcyAwKSwgb3IgYQorICAgICAgICAgICAgIyBsYXRlciBvbmUgKGlmIGBmb2xkYCBpcyAxKS4KKyAgICAgICAgICAgIHUyID0gdTEgKyAoLW1heF9mb2xkX3NlY29uZHMsIG1heF9mb2xkX3NlY29uZHMpW3NlbGYuZm9sZF0KKyAgICAgICAgICAgIGIgPSBsb2NhbCh1MikgLSB1MgorICAgICAgICAgICAgaWYgYSA9PSBiOgorICAgICAgICAgICAgICAgIHJldHVybiB1MQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYiA9IHQxIC0gdTEKKyAgICAgICAgICAgIGFzc2VydCBhICE9IGIKKyAgICAgICAgdTIgPSB0IC0gYgorICAgICAgICB0MiA9IGxvY2FsKHUyKQorICAgICAgICBpZiB0MiA9PSB0OgorICAgICAgICAgICAgcmV0dXJuIHUyCisgICAgICAgIGlmIHQxID09IHQ6CisgICAgICAgICAgICByZXR1cm4gdTEKKyAgICAgICAgIyBXZSBoYXZlIGZvdW5kIGJvdGggb2Zmc2V0cyBhIGFuZCBiLCBidXQgbmVpdGhlciB0IC0gYSBub3IgdCAtIGIgaXMKKyAgICAgICAgIyBhIHNvbHV0aW9uLiAgVGhpcyBtZWFucyB0IGlzIGluIHRoZSBnYXAuCisgICAgICAgIHJldHVybiAobWF4LCBtaW4pW3NlbGYuZm9sZF0odTEsIHUyKQorCisKICAgICBkZWYgdGltZXN0YW1wKHNlbGYpOgogICAgICAgICAiUmV0dXJuIFBPU0lYIHRpbWVzdGFtcCBhcyBmbG9hdCIKICAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gX3RpbWUubWt0aW1lKChzZWxmLnllYXIsIHNlbGYubW9udGgsIHNlbGYuZGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ob3VyLCBzZWxmLm1pbnV0ZSwgc2VsZi5zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xKSkgKyBzZWxmLm1pY3Jvc2Vjb25kIC8gMWU2CisgICAgICAgICAgICBzID0gc2VsZi5fbWt0aW1lKCkKKyAgICAgICAgICAgIHJldHVybiBzICsgc2VsZi5taWNyb3NlY29uZCAvIDFlNgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIChzZWxmIC0gX0VQT0NIKS50b3RhbF9zZWNvbmRzKCkKIApAQCAtMTQ2NCwxNSArMTU2NCwxNiBAQAogCiAgICAgZGVmIHRpbWUoc2VsZik6CiAgICAgICAgICJSZXR1cm4gdGhlIHRpbWUgcGFydCwgd2l0aCB0emluZm8gTm9uZS4iCi0gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKQorICAgICAgICByZXR1cm4gdGltZShzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZCwgZm9sZD1zZWxmLmZvbGQpCiAKICAgICBkZWYgdGltZXR6KHNlbGYpOgogICAgICAgICAiUmV0dXJuIHRoZSB0aW1lIHBhcnQsIHdpdGggc2FtZSB0emluZm8uIgogICAgICAgICByZXR1cm4gdGltZShzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHppbmZvKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl90emluZm8sIGZvbGQ9c2VsZi5mb2xkKQogCiAgICAgZGVmIHJlcGxhY2Uoc2VsZiwgeWVhcj1Ob25lLCBtb250aD1Ob25lLCBkYXk9Tm9uZSwgaG91cj1Ob25lLAotICAgICAgICAgICAgICAgIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSwgdHppbmZvPVRydWUpOgorICAgICAgICAgICAgICAgIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSwgdHppbmZvPVRydWUsCisgICAgICAgICAgICAgICAgKiwgZm9sZD1Ob25lKToKICAgICAgICAgIiIiUmV0dXJuIGEgbmV3IGRhdGV0aW1lIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuIiIiCiAgICAgICAgIGlmIHllYXIgaXMgTm9uZToKICAgICAgICAgICAgIHllYXIgPSBzZWxmLnllYXIKQEAgLTE0OTAsNDYgKzE1OTEsNDUgQEAKICAgICAgICAgICAgIG1pY3Jvc2Vjb25kID0gc2VsZi5taWNyb3NlY29uZAogICAgICAgICBpZiB0emluZm8gaXMgVHJ1ZToKICAgICAgICAgICAgIHR6aW5mbyA9IHNlbGYudHppbmZvCi0gICAgICAgIHJldHVybiBkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pCisgICAgICAgIGlmIGZvbGQgaXMgTm9uZToKKyAgICAgICAgICAgIGZvbGQgPSBzZWxmLmZvbGQKKyAgICAgICAgcmV0dXJuIGRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb3NlY29uZCwgdHppbmZvLCBmb2xkPWZvbGQpCisKKyAgICBkZWYgX2xvY2FsX3RpbWV6b25lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnR6aW5mbyBpcyBOb25lOgorICAgICAgICAgICAgdHMgPSBzZWxmLl9ta3RpbWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHMgPSAoc2VsZiAtIF9FUE9DSCkgLy8gdGltZWRlbHRhKHNlY29uZHM9MSkKKyAgICAgICAgbG9jYWx0bSA9IF90aW1lLmxvY2FsdGltZSh0cykKKyAgICAgICAgbG9jYWwgPSBkYXRldGltZSgqbG9jYWx0bVs6Nl0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgRXh0cmFjdCBUWiBkYXRhIGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgZ210b2ZmID0gbG9jYWx0bS50bV9nbXRvZmYKKyAgICAgICAgICAgIHpvbmUgPSBsb2NhbHRtLnRtX3pvbmUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgZGVsdGEgPSBsb2NhbCAtIGRhdGV0aW1lKCpfdGltZS5nbXRpbWUodHMpWzo2XSkKKyAgICAgICAgICAgIHpvbmUgPSBfdGltZS5zdHJmdGltZSgnJVonLCBsb2NhbHRtKQorICAgICAgICAgICAgdHogPSB0aW1lem9uZShkZWx0YSwgem9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR6ID0gdGltZXpvbmUodGltZWRlbHRhKHNlY29uZHM9Z210b2ZmKSwgem9uZSkKKyAgICAgICAgcmV0dXJuIHR6CiAKICAgICBkZWYgYXN0aW1lem9uZShzZWxmLCB0ej1Ob25lKToKICAgICAgICAgaWYgdHogaXMgTm9uZToKLSAgICAgICAgICAgIGlmIHNlbGYudHppbmZvIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYXN0aW1lem9uZSgpIHJlcXVpcmVzIGFuIGF3YXJlIGRhdGV0aW1lIikKLSAgICAgICAgICAgIHRzID0gKHNlbGYgLSBfRVBPQ0gpIC8vIHRpbWVkZWx0YShzZWNvbmRzPTEpCi0gICAgICAgICAgICBsb2NhbHRtID0gX3RpbWUubG9jYWx0aW1lKHRzKQotICAgICAgICAgICAgbG9jYWwgPSBkYXRldGltZSgqbG9jYWx0bVs6Nl0pCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgIyBFeHRyYWN0IFRaIGRhdGEgaWYgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgZ210b2ZmID0gbG9jYWx0bS50bV9nbXRvZmYKLSAgICAgICAgICAgICAgICB6b25lID0gbG9jYWx0bS50bV96b25lCi0gICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyBDb21wdXRlIFVUQyBvZmZzZXQgYW5kIGNvbXBhcmUgd2l0aCB0aGUgdmFsdWUgaW1wbGllZAotICAgICAgICAgICAgICAgICMgYnkgdG1faXNkc3QuICBJZiB0aGUgdmFsdWVzIG1hdGNoLCB1c2UgdGhlIHpvbmUgbmFtZQotICAgICAgICAgICAgICAgICMgaW1wbGllZCBieSB0bV9pc2RzdC4KLSAgICAgICAgICAgICAgICBkZWx0YSA9IGxvY2FsIC0gZGF0ZXRpbWUoKl90aW1lLmdtdGltZSh0cylbOjZdKQotICAgICAgICAgICAgICAgIGRzdCA9IF90aW1lLmRheWxpZ2h0IGFuZCBsb2NhbHRtLnRtX2lzZHN0ID4gMAotICAgICAgICAgICAgICAgIGdtdG9mZiA9IC0oX3RpbWUuYWx0em9uZSBpZiBkc3QgZWxzZSBfdGltZS50aW1lem9uZSkKLSAgICAgICAgICAgICAgICBpZiBkZWx0YSA9PSB0aW1lZGVsdGEoc2Vjb25kcz1nbXRvZmYpOgotICAgICAgICAgICAgICAgICAgICB0eiA9IHRpbWV6b25lKGRlbHRhLCBfdGltZS50em5hbWVbZHN0XSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICB0eiA9IHRpbWV6b25lKGRlbHRhKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB0eiA9IHRpbWV6b25lKHRpbWVkZWx0YShzZWNvbmRzPWdtdG9mZiksIHpvbmUpCi0KKyAgICAgICAgICAgIHR6ID0gc2VsZi5fbG9jYWxfdGltZXpvbmUoKQogICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHR6LCB0emluZm8pOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ0eiBhcmd1bWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHR6aW5mbyIpCiAKICAgICAgICAgbXl0eiA9IHNlbGYudHppbmZvCiAgICAgICAgIGlmIG15dHogaXMgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZSIpCisgICAgICAgICAgICBteXR6ID0gc2VsZi5fbG9jYWxfdGltZXpvbmUoKQogCiAgICAgICAgIGlmIHR6IGlzIG15dHo6CiAgICAgICAgICAgICByZXR1cm4gc2VsZgogCiAgICAgICAgICMgQ29udmVydCBzZWxmIHRvIFVUQywgYW5kIGF0dGFjaCB0aGUgbmV3IHRpbWUgem9uZSBvYmplY3QuCi0gICAgICAgIG15b2Zmc2V0ID0gc2VsZi51dGNvZmZzZXQoKQorICAgICAgICBteW9mZnNldCA9IG15dHoudXRjb2Zmc2V0KHNlbGYpCiAgICAgICAgIGlmIG15b2Zmc2V0IGlzIE5vbmU6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJhc3RpbWV6b25lKCkgcmVxdWlyZXMgYW4gYXdhcmUgZGF0ZXRpbWUiKQogICAgICAgICB1dGMgPSAoc2VsZiAtIG15b2Zmc2V0KS5yZXBsYWNlKHR6aW5mbz10eikKQEAgLTE1NDksMjEgKzE2NDksMjUgQEAKICAgICAgICAgICAgIHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLAogICAgICAgICAgICAgc2VsZi5feWVhcikKIAotICAgIGRlZiBpc29mb3JtYXQoc2VsZiwgc2VwPSdUJyk6CisgICAgZGVmIGlzb2Zvcm1hdChzZWxmLCBzZXA9J1QnLCB0aW1lc3BlYz0nYXV0bycpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uCiAKLSAgICAgICAgVGhpcyBpcyAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0nLCBvciAnWVlZWS1NTS1ERCBISDpNTTpTUycgaWYKLSAgICAgICAgc2VsZi5taWNyb3NlY29uZCA9PSAwLgorICAgICAgICBUaGUgZnVsbCBmb3JtYXQgbG9va3MgbGlrZSAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0nLgorICAgICAgICBCeSBkZWZhdWx0LCB0aGUgZnJhY3Rpb25hbCBwYXJ0IGlzIG9taXR0ZWQgaWYgc2VsZi5taWNyb3NlY29uZCA9PSAwLgogCiAgICAgICAgIElmIHNlbGYudHppbmZvIGlzIG5vdCBOb25lLCB0aGUgVVRDIG9mZnNldCBpcyBhbHNvIGF0dGFjaGVkLCBnaXZpbmcKLSAgICAgICAgJ1lZWVktTU0tREQgSEg6TU06U1MubW1tbW1tK0hIOk1NJyBvciAnWVlZWS1NTS1ERCBISDpNTTpTUytISDpNTScuCisgICAgICAgIGdpdmluZyBhIGZ1bGwgZm9ybWF0IG9mICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbStISDpNTScuCiAKICAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQgc2VwIHNwZWNpZmllcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gZGF0ZSBhbmQKICAgICAgICAgdGltZSwgZGVmYXVsdCAnVCcuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IHRpbWVzcGVjIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAgICAgICAgdGVybXMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZS4KICAgICAgICAgIiIiCiAgICAgICAgIHMgPSAoIiUwNGQtJTAyZC0lMDJkJWMiICUgKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXksIHNlcCkgKwogICAgICAgICAgICAgIF9mb3JtYXRfdGltZShzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCwgdGltZXNwZWMpKQorCiAgICAgICAgIG9mZiA9IHNlbGYudXRjb2Zmc2V0KCkKICAgICAgICAgaWYgb2ZmIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgaWYgb2ZmLmRheXMgPCAwOgpAQCAtMTU3Miw5ICsxNjc2LDExIEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNpZ24gPSAiKyIKICAgICAgICAgICAgIGhoLCBtbSA9IGRpdm1vZChvZmYsIHRpbWVkZWx0YShob3Vycz0xKSkKLSAgICAgICAgICAgIGFzc2VydCBub3QgbW0gJSB0aW1lZGVsdGEobWludXRlcz0xKSwgIndob2xlIG1pbnV0ZSIKLSAgICAgICAgICAgIG1tIC8vPSB0aW1lZGVsdGEobWludXRlcz0xKQorICAgICAgICAgICAgbW0sIHNzID0gZGl2bW9kKG1tLCB0aW1lZGVsdGEobWludXRlcz0xKSkKICAgICAgICAgICAgIHMgKz0gIiVzJTAyZDolMDJkIiAlIChzaWduLCBoaCwgbW0pCisgICAgICAgICAgICBpZiBzczoKKyAgICAgICAgICAgICAgICBhc3NlcnQgbm90IHNzLm1pY3Jvc2Vjb25kcworICAgICAgICAgICAgICAgIHMgKz0gIjolMDJkIiAlIHNzLnNlY29uZHMKICAgICAgICAgcmV0dXJuIHMKIAogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKQEAgLTE1OTEsNiArMTY5Nyw5IEBACiAgICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gIikiCiAgICAgICAgICAgICBzID0gc1s6LTFdICsgIiwgdHppbmZvPSVyIiAlIHNlbGYuX3R6aW5mbyArICIpIgorICAgICAgICBpZiBzZWxmLl9mb2xkOgorICAgICAgICAgICAgYXNzZXJ0IHNbLTE6XSA9PSAiKSIKKyAgICAgICAgICAgIHMgPSBzWzotMV0gKyAiLCBmb2xkPTEpIgogICAgICAgICByZXR1cm4gcwogCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CkBAIC0xNjkzLDYgKzE4MDIsMTIgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG15b2ZmID0gc2VsZi51dGNvZmZzZXQoKQogICAgICAgICAgICAgb3RvZmYgPSBvdGhlci51dGNvZmZzZXQoKQorICAgICAgICAgICAgIyBBc3N1bWUgdGhhdCBhbGxvd19taXhlZCBtZWFucyB0aGF0IHdlIGFyZSBjYWxsZWQgZnJvbSBfX2VxX18KKyAgICAgICAgICAgIGlmIGFsbG93X21peGVkOgorICAgICAgICAgICAgICAgIGlmIG15b2ZmICE9IHNlbGYucmVwbGFjZShmb2xkPW5vdCBzZWxmLmZvbGQpLnV0Y29mZnNldCgpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICAgICAgICAgIGlmIG90b2ZmICE9IG90aGVyLnJlcGxhY2UoZm9sZD1ub3Qgb3RoZXIuZm9sZCkudXRjb2Zmc2V0KCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAyCiAgICAgICAgICAgICBiYXNlX2NvbXBhcmUgPSBteW9mZiA9PSBvdG9mZgogCiAgICAgICAgIGlmIGJhc2VfY29tcGFyZToKQEAgLTE3NjAsOSArMTg3NSwxMyBAQAogCiAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMToKLSAgICAgICAgICAgIHR6b2ZmID0gc2VsZi51dGNvZmZzZXQoKQorICAgICAgICAgICAgaWYgc2VsZi5mb2xkOgorICAgICAgICAgICAgICAgIHQgPSBzZWxmLnJlcGxhY2UoZm9sZD0wKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0ID0gc2VsZgorICAgICAgICAgICAgdHpvZmYgPSB0LnV0Y29mZnNldCgpCiAgICAgICAgICAgICBpZiB0em9mZiBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaCh0Ll9nZXRzdGF0ZSgpWzBdKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBkYXlzID0gX3ltZDJvcmQoc2VsZi55ZWFyLCBzZWxmLm1vbnRoLCBzZWxmLmRheSkKICAgICAgICAgICAgICAgICBzZWNvbmRzID0gc2VsZi5ob3VyICogMzYwMCArIHNlbGYubWludXRlICogNjAgKyBzZWxmLnNlY29uZApAQCAtMTc3MSwxMSArMTg5MCwxNCBAQAogCiAgICAgIyBQaWNrbGUgc3VwcG9ydC4KIAotICAgIGRlZiBfZ2V0c3RhdGUoc2VsZik6CisgICAgZGVmIF9nZXRzdGF0ZShzZWxmLCBwcm90b2NvbD0zKToKICAgICAgICAgeWhpLCB5bG8gPSBkaXZtb2Qoc2VsZi5feWVhciwgMjU2KQogICAgICAgICB1czIsIHVzMyA9IGRpdm1vZChzZWxmLl9taWNyb3NlY29uZCwgMjU2KQogICAgICAgICB1czEsIHVzMiA9IGRpdm1vZCh1czIsIDI1NikKLSAgICAgICAgYmFzZXN0YXRlID0gYnl0ZXMoW3loaSwgeWxvLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LAorICAgICAgICBtID0gc2VsZi5fbW9udGgKKyAgICAgICAgaWYgc2VsZi5fZm9sZCBhbmQgcHJvdG9jb2wgPiAzOgorICAgICAgICAgICAgbSArPSAxMjgKKyAgICAgICAgYmFzZXN0YXRlID0gYnl0ZXMoW3loaSwgeWxvLCBtLCBzZWxmLl9kYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzMSwgdXMyLCB1czNdKQogICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZToKQEAgLTE3ODYsMTQgKzE5MDgsMjAgQEAKICAgICBkZWYgX19zZXRzdGF0ZShzZWxmLCBzdHJpbmcsIHR6aW5mbyk6CiAgICAgICAgIGlmIHR6aW5mbyBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UodHppbmZvLCBfdHppbmZvX2NsYXNzKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYmFkIHR6aW5mbyBzdGF0ZSBhcmciKQotICAgICAgICAoeWhpLCB5bG8sIHNlbGYuX21vbnRoLCBzZWxmLl9kYXksIHNlbGYuX2hvdXIsCisgICAgICAgICh5aGksIHlsbywgbSwgc2VsZi5fZGF5LCBzZWxmLl9ob3VyLAogICAgICAgICAgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsIHVzMSwgdXMyLCB1czMpID0gc3RyaW5nCisgICAgICAgIGlmIG0gPiAxMjc6CisgICAgICAgICAgICBzZWxmLl9mb2xkID0gMQorICAgICAgICAgICAgc2VsZi5fbW9udGggPSBtIC0gMTI4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9mb2xkID0gMAorICAgICAgICAgICAgc2VsZi5fbW9udGggPSBtCiAgICAgICAgIHNlbGYuX3llYXIgPSB5aGkgKiAyNTYgKyB5bG8KICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgPSAoKCh1czEgPDwgOCkgfCB1czIpIDw8IDgpIHwgdXMzCiAgICAgICAgIHNlbGYuX3R6aW5mbyA9IHR6aW5mbwogCi0gICAgZGVmIF9fcmVkdWNlX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIHNlbGYuX2dldHN0YXRlKCkpCisgICAgZGVmIF9fcmVkdWNlX2V4X18oc2VsZiwgcHJvdG9jb2wpOgorICAgICAgICByZXR1cm4gKHNlbGYuX19jbGFzc19fLCBzZWxmLl9nZXRzdGF0ZShwcm90b2NvbCkpCiAKIAogZGF0ZXRpbWUubWluID0gZGF0ZXRpbWUoMSwgMSwgMSkKQEAgLTE5MTMsNiArMjA0MSw4IEBACiAKICAgICBAc3RhdGljbWV0aG9kCiAgICAgZGVmIF9uYW1lX2Zyb21fb2Zmc2V0KGRlbHRhKToKKyAgICAgICAgaWYgbm90IGRlbHRhOgorICAgICAgICAgICAgcmV0dXJuICdVVEMnCiAgICAgICAgIGlmIGRlbHRhIDwgdGltZWRlbHRhKDApOgogICAgICAgICAgICAgc2lnbiA9ICctJwogICAgICAgICAgICAgZGVsdGEgPSAtZGVsdGEKZGlmZiAtLWdpdCBhL0xpYi9kYm0vZHVtYi5weSBiL0xpYi9kYm0vZHVtYi5weQppbmRleCA3Nzc3YTdjLi5lN2M2NDQwIDEwMDY0NAotLS0gYS9MaWIvZGJtL2R1bWIucHkKKysrIGIvTGliL2RibS9kdW1iLnB5CkBAIC00Nyw2ICs0Nyw3IEBACiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZWJhc2VuYW1lLCBtb2RlLCBmbGFnPSdjJyk6CiAgICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCisgICAgICAgIHNlbGYuX3JlYWRvbmx5ID0gKGZsYWcgPT0gJ3InKQogCiAgICAgICAgICMgVGhlIGRpcmVjdG9yeSBmaWxlIGlzIGEgdGV4dCBmaWxlLiAgRWFjaCBsaW5lIGxvb2tzIGxpa2UKICAgICAgICAgIyAgICAiJXIsICglZCwgJWQpXG4iICUgKGtleSwgcG9zLCBzaXopCkBAIC04MCw2ICs4MSwxMSBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmID0gX2lvLm9wZW4oc2VsZi5fZGF0ZmlsZSwgJ3InLCBlbmNvZGluZz0iTGF0aW4tMSIpCiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgaWYgZmxhZyBub3QgaW4gKCdjJywgJ24nKToKKyAgICAgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJUaGUgZGF0YWJhc2UgZmlsZSBpcyBtaXNzaW5nLCB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbWFudGljcyBvZiB0aGUgJ2MnIGZsYWcgd2lsbCBiZSB1c2VkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9NCkKICAgICAgICAgICAgIHdpdGggX2lvLm9wZW4oc2VsZi5fZGF0ZmlsZSwgJ3cnLCBlbmNvZGluZz0iTGF0aW4tMSIpIGFzIGY6CiAgICAgICAgICAgICAgICAgc2VsZi5fY2htb2Qoc2VsZi5fZGF0ZmlsZSkKICAgICAgICAgZWxzZToKQEAgLTE3OCw2ICsxODQsMTAgQEAKICAgICAgICAgICAgIGYud3JpdGUoIiVyLCAlclxuIiAlIChrZXkuZGVjb2RlKCJMYXRpbi0xIiksIHBvc19hbmRfc2l6X3BhaXIpKQogCiAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsKToKKyAgICAgICAgaWYgc2VsZi5fcmVhZG9ubHk6CisgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ1RoZSBkYXRhYmFzZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcgb25seScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKToKICAgICAgICAgICAgIGtleSA9IGtleS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShrZXksIChieXRlcywgYnl0ZWFycmF5KSk6CkBAIC0yMTIsNiArMjIyLDEwIEBACiAgICAgICAgICAgICAjIChzbyB0aGF0IF9jb21taXQoKSBuZXZlciBnZXRzIGNhbGxlZCkuCiAKICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgaWYgc2VsZi5fcmVhZG9ubHk6CisgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ1RoZSBkYXRhYmFzZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcgb25seScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKToKICAgICAgICAgICAgIGtleSA9IGtleS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgc2VsZi5fdmVyaWZ5X29wZW4oKQpAQCAtMzAwLDQgKzMxNCw4IEBACiAgICAgZWxzZToKICAgICAgICAgIyBUdXJuIG9mZiBhbnkgYml0cyB0aGF0IGFyZSBzZXQgaW4gdGhlIHVtYXNrCiAgICAgICAgIG1vZGUgPSBtb2RlICYgKH51bSkKKyAgICBpZiBmbGFnIG5vdCBpbiAoJ3InLCAndycsICdjJywgJ24nKToKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHdhcm5pbmdzLndhcm4oIkZsYWcgbXVzdCBiZSBvbmUgb2YgJ3InLCAndycsICdjJywgb3IgJ24nIiwKKyAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICByZXR1cm4gX0RhdGFiYXNlKGZpbGUsIG1vZGUsIGZsYWc9ZmxhZykKZGlmZiAtLWdpdCBhL0xpYi9kaWZmbGliLnB5IGIvTGliL2RpZmZsaWIucHkKaW5kZXggMDc2YmJhYy4uMjA5NWE1ZSAxMDA2NDQKLS0tIGEvTGliL2RpZmZsaWIucHkKKysrIGIvTGliL2RpZmZsaWIucHkKQEAgLTE0MTUsNyArMTQxNSw3IEBACiAgICAgaW1wb3J0IHJlCiAKICAgICAjIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgZmluZGluZyBpbnRyYWxpbmUgY2hhbmdlIGluZGljZXMKLSAgICBjaGFuZ2VfcmUgPSByZS5jb21waWxlKCcoXCsrfFwtK3xcXispJykKKyAgICBjaGFuZ2VfcmUgPSByZS5jb21waWxlKHInKFwrK3xcLSt8XF4rKScpCiAKICAgICAjIGNyZWF0ZSB0aGUgZGlmZmVyZW5jZSBpdGVyYXRvciB0byBnZW5lcmF0ZSB0aGUgZGlmZmVyZW5jZXMKICAgICBkaWZmX2xpbmVzX2l0ZXJhdG9yID0gbmRpZmYoZnJvbWxpbmVzLHRvbGluZXMsbGluZWp1bmssY2hhcmp1bmspCmRpZmYgLS1naXQgYS9MaWIvZGlzLnB5IGIvTGliL2Rpcy5weQppbmRleCBmN2UzYzdmLi5lOTU4YzhhIDEwMDY0NAotLS0gYS9MaWIvZGlzLnB5CisrKyBiL0xpYi9kaXMucHkKQEAgLTg3LDYgKzg3LDcgQEAKICAgICA2NDogIk5PRlJFRSIsCiAgICAxMjg6ICJDT1JPVVRJTkUiLAogICAgMjU2OiAiSVRFUkFCTEVfQ09ST1VUSU5FIiwKKyAgIDUxMjogIkFTWU5DX0dFTkVSQVRPUiIsCiB9CiAKIGRlZiBwcmV0dHlfZmxhZ3MoZmxhZ3MpOgpAQCAtMTYzLDYgKzE2NCwxNSBAQAogX0luc3RydWN0aW9uID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgiX0luc3RydWN0aW9uIiwKICAgICAgIm9wbmFtZSBvcGNvZGUgYXJnIGFyZ3ZhbCBhcmdyZXByIG9mZnNldCBzdGFydHNfbGluZSBpc19qdW1wX3RhcmdldCIpCiAKK19JbnN0cnVjdGlvbi5vcG5hbWUuX19kb2NfXyA9ICJIdW1hbiByZWFkYWJsZSBuYW1lIGZvciBvcGVyYXRpb24iCitfSW5zdHJ1Y3Rpb24ub3Bjb2RlLl9fZG9jX18gPSAiTnVtZXJpYyBjb2RlIGZvciBvcGVyYXRpb24iCitfSW5zdHJ1Y3Rpb24uYXJnLl9fZG9jX18gPSAiTnVtZXJpYyBhcmd1bWVudCB0byBvcGVyYXRpb24gKGlmIGFueSksIG90aGVyd2lzZSBOb25lIgorX0luc3RydWN0aW9uLmFyZ3ZhbC5fX2RvY19fID0gIlJlc29sdmVkIGFyZyB2YWx1ZSAoaWYga25vd24pLCBvdGhlcndpc2Ugc2FtZSBhcyBhcmciCitfSW5zdHJ1Y3Rpb24uYXJncmVwci5fX2RvY19fID0gIkh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIG9wZXJhdGlvbiBhcmd1bWVudCIKK19JbnN0cnVjdGlvbi5vZmZzZXQuX19kb2NfXyA9ICJTdGFydCBpbmRleCBvZiBvcGVyYXRpb24gd2l0aGluIGJ5dGVjb2RlIHNlcXVlbmNlIgorX0luc3RydWN0aW9uLnN0YXJ0c19saW5lLl9fZG9jX18gPSAiTGluZSBzdGFydGVkIGJ5IHRoaXMgb3Bjb2RlIChpZiBhbnkpLCBvdGhlcndpc2UgTm9uZSIKK19JbnN0cnVjdGlvbi5pc19qdW1wX3RhcmdldC5fX2RvY19fID0gIlRydWUgaWYgb3RoZXIgY29kZSBqdW1wcyB0byBoZXJlLCBvdGhlcndpc2UgRmFsc2UiCisKIGNsYXNzIEluc3RydWN0aW9uKF9JbnN0cnVjdGlvbik6CiAgICAgIiIiRGV0YWlscyBmb3IgYSBieXRlY29kZSBvcGVyYXRpb24KIApAQCAtMjc2LDcgKzI4Niw2IEBACiAgICAgIiIiCiAgICAgbGFiZWxzID0gZmluZGxhYmVscyhjb2RlKQogICAgIHN0YXJ0c19saW5lID0gTm9uZQotICAgIGZyZWUgPSBOb25lCiAgICAgZm9yIG9mZnNldCwgb3AsIGFyZyBpbiBfdW5wYWNrX29wYXJncyhjb2RlKToKICAgICAgICAgaWYgbGluZXN0YXJ0cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHN0YXJ0c19saW5lID0gbGluZXN0YXJ0cy5nZXQob2Zmc2V0LCBOb25lKQpAQCAtMjk2LDcgKzMwNSw3IEBACiAgICAgICAgICAgICBlbGlmIG9wIGluIGhhc25hbWU6CiAgICAgICAgICAgICAgICAgYXJndmFsLCBhcmdyZXByID0gX2dldF9uYW1lX2luZm8oYXJnLCBuYW1lcykKICAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzanJlbDoKLSAgICAgICAgICAgICAgICBhcmd2YWwgPSBvZmZzZXQgKyAzICsgYXJnCisgICAgICAgICAgICAgICAgYXJndmFsID0gb2Zmc2V0ICsgMiArIGFyZwogICAgICAgICAgICAgICAgIGFyZ3JlcHIgPSAidG8gIiArIHJlcHIoYXJndmFsKQogICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNsb2NhbDoKICAgICAgICAgICAgICAgICBhcmd2YWwsIGFyZ3JlcHIgPSBfZ2V0X25hbWVfaW5mbyhhcmcsIHZhcm5hbWVzKQpAQCAtMzA1LDcgKzMxNCw3IEBACiAgICAgICAgICAgICAgICAgYXJncmVwciA9IGFyZ3ZhbAogICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNmcmVlOgogICAgICAgICAgICAgICAgIGFyZ3ZhbCwgYXJncmVwciA9IF9nZXRfbmFtZV9pbmZvKGFyZywgY2VsbHMpCi0gICAgICAgICAgICBlbGlmIG9wIGluIGhhc25hcmdzOgorICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNuYXJnczogIyB1bnVzZWQKICAgICAgICAgICAgICAgICBhcmdyZXByID0gIiVkIHBvc2l0aW9uYWwsICVkIGtleXdvcmQgcGFpciIgJSAoYXJnJTI1NiwgYXJnLy8yNTYpCiAgICAgICAgIHlpZWxkIEluc3RydWN0aW9uKG9wbmFtZVtvcF0sIG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIGFyZ3ZhbCwgYXJncmVwciwKQEAgLTM0MywyMyArMzUyLDE1IEBACiBkaXNjbyA9IGRpc2Fzc2VtYmxlICAgICAgICAgICAgICAgICAgICAgIyBYWFggRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAKIGRlZiBfdW5wYWNrX29wYXJncyhjb2RlKToKLSAgICAjIGVudW1lcmF0ZSgpIGlzIG5vdCBhbiBvcHRpb24sIHNpbmNlIHdlIHNvbWV0aW1lcyBwcm9jZXNzCi0gICAgIyBtdWx0aXBsZSBlbGVtZW50cyBvbiBhIHNpbmdsZSBwYXNzIHRocm91Z2ggdGhlIGxvb3AKICAgICBleHRlbmRlZF9hcmcgPSAwCi0gICAgbiA9IGxlbihjb2RlKQotICAgIGkgPSAwCi0gICAgd2hpbGUgaSA8IG46CisgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGNvZGUpLCAyKToKICAgICAgICAgb3AgPSBjb2RlW2ldCi0gICAgICAgIG9mZnNldCA9IGkKLSAgICAgICAgaSA9IGkrMQotICAgICAgICBhcmcgPSBOb25lCiAgICAgICAgIGlmIG9wID49IEhBVkVfQVJHVU1FTlQ6Ci0gICAgICAgICAgICBhcmcgPSBjb2RlW2ldICsgY29kZVtpKzFdKjI1NiArIGV4dGVuZGVkX2FyZwotICAgICAgICAgICAgZXh0ZW5kZWRfYXJnID0gMAotICAgICAgICAgICAgaSA9IGkrMgotICAgICAgICAgICAgaWYgb3AgPT0gRVhURU5ERURfQVJHOgotICAgICAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IGFyZyo2NTUzNgotICAgICAgICB5aWVsZCAob2Zmc2V0LCBvcCwgYXJnKQorICAgICAgICAgICAgYXJnID0gY29kZVtpKzFdIHwgZXh0ZW5kZWRfYXJnCisgICAgICAgICAgICBleHRlbmRlZF9hcmcgPSAoYXJnIDw8IDgpIGlmIG9wID09IEVYVEVOREVEX0FSRyBlbHNlIDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZyA9IE5vbmUKKyAgICAgICAgeWllbGQgKGksIG9wLCBhcmcpCiAKIGRlZiBmaW5kbGFiZWxzKGNvZGUpOgogICAgICIiIkRldGVjdCBhbGwgb2Zmc2V0cyBpbiBhIGJ5dGUgY29kZSB3aGljaCBhcmUganVtcCB0YXJnZXRzLgpAQCAtMzcwLDE0ICszNzEsMTQgQEAKICAgICBsYWJlbHMgPSBbXQogICAgIGZvciBvZmZzZXQsIG9wLCBhcmcgaW4gX3VucGFja19vcGFyZ3MoY29kZSk6CiAgICAgICAgIGlmIGFyZyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGxhYmVsID0gLTEKICAgICAgICAgICAgIGlmIG9wIGluIGhhc2pyZWw6Ci0gICAgICAgICAgICAgICAgbGFiZWwgPSBvZmZzZXQgKyAzICsgYXJnCisgICAgICAgICAgICAgICAgbGFiZWwgPSBvZmZzZXQgKyAyICsgYXJnCiAgICAgICAgICAgICBlbGlmIG9wIGluIGhhc2phYnM6CiAgICAgICAgICAgICAgICAgbGFiZWwgPSBhcmcKLSAgICAgICAgICAgIGlmIGxhYmVsID49IDA6Ci0gICAgICAgICAgICAgICAgaWYgbGFiZWwgbm90IGluIGxhYmVsczoKLSAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmFwcGVuZChsYWJlbCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGxhYmVsIG5vdCBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbGFiZWxzLmFwcGVuZChsYWJlbCkKICAgICByZXR1cm4gbGFiZWxzCiAKIGRlZiBmaW5kbGluZXN0YXJ0cyhjb2RlKToKQEAgLTM4Niw4ICszODcsOCBAQAogICAgIEdlbmVyYXRlIHBhaXJzIChvZmZzZXQsIGxpbmVubykgYXMgZGVzY3JpYmVkIGluIFB5dGhvbi9jb21waWxlLmMuCiAKICAgICAiIiIKLSAgICBieXRlX2luY3JlbWVudHMgPSBsaXN0KGNvZGUuY29fbG5vdGFiWzA6OjJdKQotICAgIGxpbmVfaW5jcmVtZW50cyA9IGxpc3QoY29kZS5jb19sbm90YWJbMTo6Ml0pCisgICAgYnl0ZV9pbmNyZW1lbnRzID0gY29kZS5jb19sbm90YWJbMDo6Ml0KKyAgICBsaW5lX2luY3JlbWVudHMgPSBjb2RlLmNvX2xub3RhYlsxOjoyXQogCiAgICAgbGFzdGxpbmVubyA9IE5vbmUKICAgICBsaW5lbm8gPSBjb2RlLmNvX2ZpcnN0bGluZW5vCkBAIC0zOTgsNiArMzk5LDkgQEAKICAgICAgICAgICAgICAgICB5aWVsZCAoYWRkciwgbGluZW5vKQogICAgICAgICAgICAgICAgIGxhc3RsaW5lbm8gPSBsaW5lbm8KICAgICAgICAgICAgIGFkZHIgKz0gYnl0ZV9pbmNyCisgICAgICAgIGlmIGxpbmVfaW5jciA+PSAweDgwOgorICAgICAgICAgICAgIyBsaW5lX2luY3JlbWVudHMgaXMgYW4gYXJyYXkgb2YgOC1iaXQgc2lnbmVkIGludGVnZXJzCisgICAgICAgICAgICBsaW5lX2luY3IgLT0gMHgxMDAKICAgICAgICAgbGluZW5vICs9IGxpbmVfaW5jcgogICAgIGlmIGxpbmVubyAhPSBsYXN0bGluZW5vOgogICAgICAgICB5aWVsZCAoYWRkciwgbGluZW5vKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9hcmNoaXZlX3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weQppbmRleCBiZWQxMzg0Li43OGFlNTc1IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weQpAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkaXJwYXRoLCBuYW1lKSkKICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgICB6aXAud3JpdGUocGF0aCwgcGF0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJhZGRpbmcgJyVzJyIgJSBwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oImFkZGluZyAnJXMnIiwgcGF0aCkKICAgICAgICAgICAgIHppcC5jbG9zZSgpCiAKICAgICByZXR1cm4gemlwX2ZpbGVuYW1lCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NtZC5weSBiL0xpYi9kaXN0dXRpbHMvY21kLnB5CmluZGV4IGM4OWQ1ZWYuLjkzOWY3OTUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY21kLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY21kLnB5CkBAIC0yMjEsNyArMjIxLDcgQEAKICAgICAgICAgc2VsZi5fZW5zdXJlX3N0cmluZ2xpa2Uob3B0aW9uLCAic3RyaW5nIiwgZGVmYXVsdCkKIAogICAgIGRlZiBlbnN1cmVfc3RyaW5nX2xpc3Qoc2VsZiwgb3B0aW9uKToKLSAgICAgICAgIiIiRW5zdXJlIHRoYXQgJ29wdGlvbicgaXMgYSBsaXN0IG9mIHN0cmluZ3MuICBJZiAnb3B0aW9uJyBpcworICAgICAgICByIiIiRW5zdXJlIHRoYXQgJ29wdGlvbicgaXMgYSBsaXN0IG9mIHN0cmluZ3MuICBJZiAnb3B0aW9uJyBpcwogICAgICAgICBjdXJyZW50bHkgYSBzdHJpbmcsIHdlIHNwbGl0IGl0IGVpdGhlciBvbiAvLFxzKi8gb3IgL1xzKy8sIHNvCiAgICAgICAgICJmb28gYmFyIGJheiIsICJmb28sYmFyLGJheiIsIGFuZCAiZm9vLCAgIGJhciBiYXoiIGFsbCBiZWNvbWUKICAgICAgICAgWyJmb28iLCAiYmFyIiwgImJheiJdLgpAQCAtMzI5LDggKzMyOSw3IEBACiAgICAgIyAtLSBFeHRlcm5hbCB3b3JsZCBtYW5pcHVsYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIGRlZiB3YXJuKHNlbGYsIG1zZyk6Ci0gICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiAlczogJXNcbiIgJQotICAgICAgICAgICAgICAgIChzZWxmLmdldF9jb21tYW5kX25hbWUoKSwgbXNnKSkKKyAgICAgICAgbG9nLndhcm4oIndhcm5pbmc6ICVzOiAlc1xuIiwgc2VsZi5nZXRfY29tbWFuZF9uYW1lKCksIG1zZykKIAogICAgIGRlZiBleGVjdXRlKHNlbGYsIGZ1bmMsIGFyZ3MsIG1zZz1Ob25lLCBsZXZlbD0xKToKICAgICAgICAgdXRpbC5leGVjdXRlKGZ1bmMsIGFyZ3MsIG1zZywgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfZHVtYi5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9kdW1iLnB5CmluZGV4IGYxYmZiMjQuLmU5Mjc0ZDkgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9kdW1iLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9kdW1iLnB5CkBAIC04NSw3ICs4NSw3IEBACiAgICAgICAgIGluc3RhbGwuc2tpcF9idWlsZCA9IHNlbGYuc2tpcF9idWlsZAogICAgICAgICBpbnN0YWxsLndhcm5fZGlyID0gMAogCi0gICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHRvICVzIiAlIHNlbGYuYmRpc3RfZGlyKQorICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyB0byAlcyIsIHNlbGYuYmRpc3RfZGlyKQogICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdpbnN0YWxsJykKIAogICAgICAgICAjIEFuZCBtYWtlIGFuIGFyY2hpdmUgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weQppbmRleCBiM2NmZTljLi5hNGJkNWE1IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHkKQEAgLTE5OSw3ICsxOTksNyBAQAogICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSBzZWxmLnRhcmdldF92ZXJzaW9uCiAgICAgICAgICAgICBpZiBub3QgdGFyZ2V0X3ZlcnNpb246CiAgICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc2tpcF9idWlsZCwgIlNob3VsZCBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGlzIgotICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gc3lzLnZlcnNpb25bMDozXQorICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiAgICAgICAgICAgICBwbGF0X3NwZWNpZmllciA9ICIuJXMtJXMiICUgKHNlbGYucGxhdF9uYW1lLCB0YXJnZXRfdmVyc2lvbikKICAgICAgICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKICAgICAgICAgICAgIGJ1aWxkLmJ1aWxkX2xpYiA9IG9zLnBhdGguam9pbihidWlsZC5idWlsZF9iYXNlLApAQCAtNjIzLDcgKzYyMyw3IEBACiAgICAgICAgIGNvc3QgPSBQeURpYWxvZyhkYiwgIkRpc2tDb3N0RGxnIiwgeCwgeSwgdywgaCwgbW9kYWwsIHRpdGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIk9LIiwgIk9LIiwgIk9LIiwgYml0bWFwPUZhbHNlKQogICAgICAgICBjb3N0LnRleHQoIlRpdGxlIiwgMTUsIDYsIDIwMCwgMTUsIDB4MzAwMDMsCi0gICAgICAgICAgICAgICAgICAie1xEbGdGb250Qm9sZDh9RGlzayBTcGFjZSBSZXF1aXJlbWVudHMiKQorICAgICAgICAgICAgICAgICByIntcRGxnRm9udEJvbGQ4fURpc2sgU3BhY2UgUmVxdWlyZW1lbnRzIikKICAgICAgICAgY29zdC50ZXh0KCJEZXNjcmlwdGlvbiIsIDIwLCAyMCwgMjgwLCAyMCwgMHgzMDAwMywKICAgICAgICAgICAgICAgICAgICJUaGUgZGlzayBzcGFjZSByZXF1aXJlZCBmb3IgdGhlIGluc3RhbGxhdGlvbiBvZiB0aGUgc2VsZWN0ZWQgZmVhdHVyZXMuIikKICAgICAgICAgY29zdC50ZXh0KCJUZXh0IiwgMjAsIDUzLCAzMzAsIDYwLCAzLApAQCAtNjcwLDcgKzY3MCw3IEBACiAgICAgICAgIHByb2dyZXNzID0gUHlEaWFsb2coZGIsICJQcm9ncmVzc0RsZyIsIHgsIHksIHcsIGgsIG1vZGVsZXNzLCB0aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuY2VsIiwgIkNhbmNlbCIsICJDYW5jZWwiLCBiaXRtYXA9RmFsc2UpCiAgICAgICAgIHByb2dyZXNzLnRleHQoIlRpdGxlIiwgMjAsIDE1LCAyMDAsIDE1LCAweDMwMDAzLAotICAgICAgICAgICAgICAgICAgICAgICJ7XERsZ0ZvbnRCb2xkOH1bUHJvZ3Jlc3MxXSBbUHJvZHVjdE5hbWVdIikKKyAgICAgICAgICAgICAgICAgICAgIHIie1xEbGdGb250Qm9sZDh9W1Byb2dyZXNzMV0gW1Byb2R1Y3ROYW1lXSIpCiAgICAgICAgIHByb2dyZXNzLnRleHQoIlRleHQiLCAzNSwgNjUsIDMwMCwgMzAsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSB3YWl0IHdoaWxlIHRoZSBJbnN0YWxsZXIgW1Byb2dyZXNzMl0gW1Byb2R1Y3ROYW1lXS4gIgogICAgICAgICAgICAgICAgICAgICAgICJUaGlzIG1heSB0YWtlIHNldmVyYWwgbWludXRlcy4iKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weQppbmRleCAwYzBlMmMxLi5kM2UxZDNhIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weQpAQCAtMTQxLDcgKzE0MSw3IEBACiAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9IHNlbGYudGFyZ2V0X3ZlcnNpb24KICAgICAgICAgICAgIGlmIG5vdCB0YXJnZXRfdmVyc2lvbjoKICAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5za2lwX2J1aWxkLCAiU2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoaXMiCi0gICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSBzeXMudmVyc2lvblswOjNdCisgICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgICAgICAgICAgIHBsYXRfc3BlY2lmaWVyID0gIi4lcy0lcyIgJSAoc2VsZi5wbGF0X25hbWUsIHRhcmdldF92ZXJzaW9uKQogICAgICAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQogICAgICAgICAgICAgYnVpbGQuYnVpbGRfbGliID0gb3MucGF0aC5qb2luKGJ1aWxkLmJ1aWxkX2Jhc2UsCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHkKaW5kZXggMzM3ZGQwYi4uYzZmNTJlNiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZC5weQpAQCAtODEsNyArODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLXBsYXQtbmFtZSBvbmx5IHN1cHBvcnRlZCBvbiBXaW5kb3dzICh0cnkgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyAnLi9jb25maWd1cmUgLS1oZWxwJyBvbiB5b3VyIHBsYXRmb3JtKSIpCiAKLSAgICAgICAgcGxhdF9zcGVjaWZpZXIgPSAiLiVzLSVzIiAlIChzZWxmLnBsYXRfbmFtZSwgc3lzLnZlcnNpb25bMDozXSkKKyAgICAgICAgcGxhdF9zcGVjaWZpZXIgPSAiLiVzLSVkLiVkIiAlIChzZWxmLnBsYXRfbmFtZSwgKnN5cy52ZXJzaW9uX2luZm9bOjJdKQogCiAgICAgICAgICMgTWFrZSBpdCBzbyBQeXRob24gMi54IGFuZCBQeXRob24gMi54IHdpdGggLS13aXRoLXB5ZGVidWcgZG9uJ3QKICAgICAgICAgIyBzaGFyZSB0aGUgc2FtZSBidWlsZCBkaXJlY3Rvcmllcy4gRG9pbmcgc28gY29uZnVzZXMgdGhlIGJ1aWxkCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVtcCcgKyBwbGF0X3NwZWNpZmllcikKICAgICAgICAgaWYgc2VsZi5idWlsZF9zY3JpcHRzIGlzIE5vbmU6CiAgICAgICAgICAgICBzZWxmLmJ1aWxkX3NjcmlwdHMgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRzLScgKyBzeXMudmVyc2lvblswOjNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRzLSVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKQogCiAgICAgICAgIGlmIHNlbGYuZXhlY3V0YWJsZSBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5leGVjdXRhYmxlID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY3V0YWJsZSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5CmluZGV4IGYwM2E0ZTMuLjVlNTFhZTQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weQpAQCAtMzYzLDkgKzM2Myw5IEBACiAKICAgICAgICAgICAgIGV4dF9uYW1lLCBidWlsZF9pbmZvID0gZXh0CiAKLSAgICAgICAgICAgIGxvZy53YXJuKCgib2xkLXN0eWxlIChleHRfbmFtZSwgYnVpbGRfaW5mbykgdHVwbGUgZm91bmQgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICJleHRfbW9kdWxlcyBmb3IgZXh0ZW5zaW9uICclcyciCi0gICAgICAgICAgICAgICAgICAgICAgIi0tIHBsZWFzZSBjb252ZXJ0IHRvIEV4dGVuc2lvbiBpbnN0YW5jZSIgJSBleHRfbmFtZSkpCisgICAgICAgICAgICBsb2cud2Fybigib2xkLXN0eWxlIChleHRfbmFtZSwgYnVpbGRfaW5mbykgdHVwbGUgZm91bmQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgImV4dF9tb2R1bGVzIGZvciBleHRlbnNpb24gJyVzJyIKKyAgICAgICAgICAgICAgICAgICAgICItLSBwbGVhc2UgY29udmVydCB0byBFeHRlbnNpb24gaW5zdGFuY2UiLCBleHRfbmFtZSkKIAogICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKGV4dF9uYW1lLCBzdHIpIGFuZAogICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fbmFtZV9yZS5tYXRjaChleHRfbmFtZSkpOgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3NjcmlwdHMucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfc2NyaXB0cy5weQppbmRleCA5MGE4MzgwLi5jY2M3MGU2IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfc2NyaXB0cy5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfc2NyaXB0cy5weQpAQCAtNTEsNyArNTEsNyBAQAogCiAKICAgICBkZWYgY29weV9zY3JpcHRzKHNlbGYpOgotICAgICAgICAiIiJDb3B5IGVhY2ggc2NyaXB0IGxpc3RlZCBpbiAnc2VsZi5zY3JpcHRzJzsgaWYgaXQncyBtYXJrZWQgYXMgYQorICAgICAgICByIiIiQ29weSBlYWNoIHNjcmlwdCBsaXN0ZWQgaW4gJ3NlbGYuc2NyaXB0cyc7IGlmIGl0J3MgbWFya2VkIGFzIGEKICAgICAgICAgUHl0aG9uIHNjcmlwdCBpbiB0aGUgVW5peCB3YXkgKGZpcnN0IGxpbmUgbWF0Y2hlcyAnZmlyc3RfbGluZV9yZScsCiAgICAgICAgIGllLiBzdGFydHMgd2l0aCAiXCMhIiBhbmQgY29udGFpbnMgInB5dGhvbiIpLCB0aGVuIGFkanVzdCB0aGUgZmlyc3QKICAgICAgICAgbGluZSB0byByZWZlciB0byB0aGUgY3VycmVudCBQeXRob24gaW50ZXJwcmV0ZXIgYXMgd2UgY29weS4KZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9jb25maWcucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5CmluZGV4IDg0N2U4NTguLjRhZTE1M2QgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9jb25maWcucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weQpAQCAtOSw3ICs5LDcgQEAKIHRoaXMgaGVhZGVyIGZpbGUgbGl2ZXMiLgogIiIiCiAKLWltcG9ydCBzeXMsIG9zLCByZQoraW1wb3J0IG9zLCByZQogCiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCiBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgpAQCAtMzM3LDcgKzMzNyw3IEBACiAgICAgSWYgaGVhZCBpcyBub3QgTm9uZSwgd2lsbCBiZSBkdW1wZWQgYmVmb3JlIHRoZSBmaWxlIGNvbnRlbnQuCiAgICAgIiIiCiAgICAgaWYgaGVhZCBpcyBOb25lOgotICAgICAgICBsb2cuaW5mbygnJXMnICUgZmlsZW5hbWUpCisgICAgICAgIGxvZy5pbmZvKCclcycsIGZpbGVuYW1lKQogICAgIGVsc2U6CiAgICAgICAgIGxvZy5pbmZvKGhlYWQpCiAgICAgZmlsZSA9IG9wZW4oZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CmluZGV4IDY3ZGIwMDcuLjAyNThkM2RlIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQpAQCAtMTc1LDYgKzE3NSw3IEBACiAgICAgICAgIHNlbGYuY29tcGlsZSA9IE5vbmUKICAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IE5vbmUKIAorICAgICAgICAjIERlcHJlY2F0ZWQKICAgICAgICAgIyBUaGVzZSB0d28gYXJlIGZvciBwdXR0aW5nIG5vbi1wYWNrYWdpemVkIGRpc3RyaWJ1dGlvbnMgaW50byB0aGVpcgogICAgICAgICAjIG93biBkaXJlY3RvcnkgYW5kIGNyZWF0aW5nIGEgLnB0aCBmaWxlIGlmIGl0IG1ha2VzIHNlbnNlLgogICAgICAgICAjICdleHRyYV9wYXRoJyBjb21lcyBmcm9tIHRoZSBzZXR1cCBmaWxlOyAnaW5zdGFsbF9wYXRoX2ZpbGUnIGNhbgpAQCAtMjkwLDggKzI5MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3RfdmVyc2lvbic6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3RfZnVsbG5hbWUnOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbic6IHB5X3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X3ZlcnNpb25fc2hvcnQnOiBweV92ZXJzaW9uWzA6M10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X3ZlcnNpb25fbm9kb3QnOiBweV92ZXJzaW9uWzBdICsgcHlfdmVyc2lvblsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbl9zaG9ydCc6ICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbl9ub2RvdCc6ICclZCVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXNfcHJlZml4JzogcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmVmaXgnOiBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5c19leGVjX3ByZWZpeCc6IGV4ZWNfcHJlZml4LApAQCAtMzQ0LDYgKzM0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0cycsICdkYXRhJywgJ2hlYWRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJiYXNlJywgJ3VzZXJzaXRlJykKIAorICAgICAgICAjIERlcHJlY2F0ZWQKICAgICAgICAgIyBXZWxsLCB3ZSdyZSBub3QgYWN0dWFsbHkgZnVsbHkgY29tcGxldGVseSBmaW5hbGl6ZWQgeWV0OiB3ZSBzdGlsbAogICAgICAgICAjIGhhdmUgdG8gZGVhbCB3aXRoICdleHRyYV9wYXRoJywgd2hpY2ggaXMgdGhlIGhhY2sgZm9yIGFsbG93aW5nCiAgICAgICAgICMgbm9uLXBhY2thZ2l6ZWQgbW9kdWxlIGRpc3RyaWJ1dGlvbnMgKGhlbGxvLCBOdW1lcmljYWwgUHl0aG9uISkgdG8KQEAgLTM4NSw3ICszODcsNyBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBvcHRfbmFtZSA9IG9wdF9uYW1lLnRyYW5zbGF0ZShsb25nb3B0X3hsYXRlKQogICAgICAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgb3B0X25hbWUpCi0gICAgICAgICAgICBsb2cuZGVidWcoIiAgJXM6ICVzIiAlIChvcHRfbmFtZSwgdmFsKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAlczogJXMiLCBvcHRfbmFtZSwgdmFsKQogCiAgICAgZGVmIGZpbmFsaXplX3VuaXgoc2VsZik6CiAgICAgICAgICIiIkZpbmFsaXplcyBvcHRpb25zIGZvciBwb3NpeCBwbGF0Zm9ybXMuIiIiCkBAIC00OTAsNiArNDkyLDEwIEBACiAgICAgICAgICAgICBzZWxmLmV4dHJhX3BhdGggPSBzZWxmLmRpc3RyaWJ1dGlvbi5leHRyYV9wYXRoCiAKICAgICAgICAgaWYgc2VsZi5leHRyYV9wYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbG9nLndhcm4oCisgICAgICAgICAgICAgICAgIkRpc3RyaWJ1dGlvbiBvcHRpb24gZXh0cmFfcGF0aCBpcyBkZXByZWNhdGVkLiAiCisgICAgICAgICAgICAgICAgIlNlZSBpc3N1ZTI3OTE5IGZvciBkZXRhaWxzLiIKKyAgICAgICAgICAgICkKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5leHRyYV9wYXRoLCBzdHIpOgogICAgICAgICAgICAgICAgIHNlbGYuZXh0cmFfcGF0aCA9IHNlbGYuZXh0cmFfcGF0aC5zcGxpdCgnLCcpCiAKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKaW5kZXggYzJhN2Q2NC4uMGRkYzczNiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKQEAgLTIxLDEwICsyMSwxMCBAQAogCiAgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsKCdpbnN0YWxsX2RpcicsJ2luc3RhbGxfZGlyJykpCi0gICAgICAgIGJhc2VuYW1lID0gIiVzLSVzLXB5JXMuZWdnLWluZm8iICUgKAorICAgICAgICBiYXNlbmFtZSA9ICIlcy0lcy1weSVkLiVkLmVnZy1pbmZvIiAlICgKICAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNhZmVfbmFtZShzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKSksCiAgICAgICAgICAgICB0b19maWxlbmFtZShzYWZlX3ZlcnNpb24oc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKSkpLAotICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdCisgICAgICAgICAgICAqc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgICAgICAgKQogICAgICAgICBzZWxmLnRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBiYXNlbmFtZSkKICAgICAgICAgc2VsZi5vdXRwdXRzID0gW3NlbGYudGFyZ2V0XQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5CmluZGV4IDg2MzQzYzguLjBmYWM5NGUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHkKQEAgLTUsNyArNSw3IEBACiAKICMgY3JlYXRlZCAyMDAyLzEwLzIxLCBSaWNoYXJkIEpvbmVzCiAKLWltcG9ydCBvcywgc3RyaW5nLCBnZXRwYXNzCitpbXBvcnQgZ2V0cGFzcwogaW1wb3J0IGlvCiBpbXBvcnQgdXJsbGliLnBhcnNlLCB1cmxsaWIucmVxdWVzdAogZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybgpAQCAtOTQsNyArOTQsNyBAQAogICAgICAgICAnJycKICAgICAgICAgIyBzZW5kIHRoZSBpbmZvIHRvIHRoZSBzZXJ2ZXIgYW5kIHJlcG9ydCB0aGUgcmVzdWx0CiAgICAgICAgIChjb2RlLCByZXN1bHQpID0gc2VsZi5wb3N0X3RvX3NlcnZlcihzZWxmLmJ1aWxkX3Bvc3RfZGF0YSgndmVyaWZ5JykpCi0gICAgICAgIGxvZy5pbmZvKCdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnICUgKGNvZGUsIHJlc3VsdCkpCisgICAgICAgIGxvZy5pbmZvKCdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnLCBjb2RlLCByZXN1bHQpCiAKICAgICBkZWYgc2VuZF9tZXRhZGF0YShzZWxmKToKICAgICAgICAgJycnIFNlbmQgdGhlIG1ldGFkYXRhIHRvIHRoZSBwYWNrYWdlIGluZGV4IHNlcnZlci4KQEAgLTIwNSw3ICsyMDUsNyBAQAogICAgICAgICAgICAgICAgIGRhdGFbJ2VtYWlsJ10gPSBpbnB1dCgnICAgRU1haWw6ICcpCiAgICAgICAgICAgICBjb2RlLCByZXN1bHQgPSBzZWxmLnBvc3RfdG9fc2VydmVyKGRhdGEpCiAgICAgICAgICAgICBpZiBjb2RlICE9IDIwMDoKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChjb2RlLCByZXN1bHQpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnLCBjb2RlLCByZXN1bHQpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGxvZy5pbmZvKCdZb3Ugd2lsbCByZWNlaXZlIGFuIGVtYWlsIHNob3J0bHkuJykKICAgICAgICAgICAgICAgICBsb2cuaW5mbygoJ0ZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIGl0IHRvICcKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgICAgICAgICAgd2hpbGUgbm90IGRhdGFbJ2VtYWlsJ106CiAgICAgICAgICAgICAgICAgZGF0YVsnZW1haWwnXSA9IGlucHV0KCdZb3VyIGVtYWlsIGFkZHJlc3M6ICcpCiAgICAgICAgICAgICBjb2RlLCByZXN1bHQgPSBzZWxmLnBvc3RfdG9fc2VydmVyKGRhdGEpCi0gICAgICAgICAgICBsb2cuaW5mbygnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChjb2RlLCByZXN1bHQpKQorICAgICAgICAgICAgbG9nLmluZm8oJ1NlcnZlciByZXNwb25zZSAoJXMpOiAlcycsIGNvZGUsIHJlc3VsdCkKIAogICAgIGRlZiBidWlsZF9wb3N0X2RhdGEoc2VsZiwgYWN0aW9uKToKICAgICAgICAgIyBmaWd1cmUgdGhlIGRhdGEgdG8gc2VuZCAtIHRoZSBtZXRhZGF0YSBwbHVzIHNvbWUgYWRkaXRpb25hbApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5CmluZGV4IDdlYTNkNWYuLjRmZDFkNDcgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvc2Rpc3QucHkKQEAgLTMsNyArMyw2IEBACiBJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ3NkaXN0JyBjb21tYW5kIChjcmVhdGUgYSBzb3VyY2UgZGlzdHJpYnV0aW9uKS4iIiIKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3RyaW5nCiBpbXBvcnQgc3lzCiBmcm9tIHR5cGVzIGltcG9ydCAqCiBmcm9tIGdsb2IgaW1wb3J0IGdsb2IKQEAgLTkyLDkgKzkxLDYgQEAKICAgICBuZWdhdGl2ZV9vcHQgPSB7J25vLWRlZmF1bHRzJzogJ3VzZS1kZWZhdWx0cycsCiAgICAgICAgICAgICAgICAgICAgICduby1wcnVuZSc6ICdwcnVuZScgfQogCi0gICAgZGVmYXVsdF9mb3JtYXQgPSB7J3Bvc2l4JzogJ2d6dGFyJywKLSAgICAgICAgICAgICAgICAgICAgICAnbnQnOiAnemlwJyB9Ci0KICAgICBzdWJfY29tbWFuZHMgPSBbKCdjaGVjaycsIGNoZWNraW5nX21ldGFkYXRhKV0KIAogICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CkBAIC0xMTEsNyArMTA3LDcgQEAKICAgICAgICAgc2VsZi5tYW5pZmVzdF9vbmx5ID0gMAogICAgICAgICBzZWxmLmZvcmNlX21hbmlmZXN0ID0gMAogCi0gICAgICAgIHNlbGYuZm9ybWF0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5mb3JtYXRzID0gWydnenRhciddCiAgICAgICAgIHNlbGYua2VlcF90ZW1wID0gMAogICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQogCkBAIC0xMjcsMTMgKzEyMyw2IEBACiAgICAgICAgICAgICBzZWxmLnRlbXBsYXRlID0gIk1BTklGRVNULmluIgogCiAgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZ19saXN0KCdmb3JtYXRzJykKLSAgICAgICAgaWYgc2VsZi5mb3JtYXRzIGlzIE5vbmU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5mb3JtYXRzID0gW3NlbGYuZGVmYXVsdF9mb3JtYXRbb3MubmFtZV1dCi0gICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAiZG9uJ3Qga25vdyBob3cgdG8gY3JlYXRlIHNvdXJjZSBkaXN0cmlidXRpb25zICIKLSAgICAgICAgICAgICAgICAgICAgICAib24gcGxhdGZvcm0gJXMiICUgb3MubmFtZSkKIAogICAgICAgICBiYWRfZm9ybWF0ID0gYXJjaGl2ZV91dGlsLmNoZWNrX2FyY2hpdmVfZm9ybWF0cyhzZWxmLmZvcm1hdHMpCiAgICAgICAgIGlmIGJhZF9mb3JtYXQ6CkBAIC00MjMsNyArNDEyLDcgQEAKICAgICAgICAgICAgIGxvZy5pbmZvKG1zZykKICAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CiAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZSk6Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oIiclcycgbm90IGEgcmVndWxhciBmaWxlIC0tIHNraXBwaW5nIiAlIGZpbGUpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oIiclcycgbm90IGEgcmVndWxhciBmaWxlIC0tIHNraXBwaW5nIiwgZmlsZSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihiYXNlX2RpciwgZmlsZSkKICAgICAgICAgICAgICAgICBzZWxmLmNvcHlfZmlsZShmaWxlLCBkZXN0LCBsaW5rPWxpbmspCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvcmUucHkgYi9MaWIvZGlzdHV0aWxzL2NvcmUucHkKaW5kZXggZjA1YjM0Yi4uZDYwM2Q0YSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb3JlLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29yZS5weQpAQCAtMjA0LDE2ICsyMDQsMTUgQEAKICAgICBnbG9iYWwgX3NldHVwX3N0b3BfYWZ0ZXIsIF9zZXR1cF9kaXN0cmlidXRpb24KICAgICBfc2V0dXBfc3RvcF9hZnRlciA9IHN0b3BfYWZ0ZXIKIAotICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2CisgICAgc2F2ZV9hcmd2ID0gc3lzLmFyZ3YuY29weSgpCiAgICAgZyA9IHsnX19maWxlX18nOiBzY3JpcHRfbmFtZX0KLSAgICBsID0ge30KICAgICB0cnk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gc2NyaXB0X25hbWUKICAgICAgICAgICAgIGlmIHNjcmlwdF9hcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHN5cy5hcmd2WzE6XSA9IHNjcmlwdF9hcmdzCiAgICAgICAgICAgICB3aXRoIG9wZW4oc2NyaXB0X25hbWUsICdyYicpIGFzIGY6Ci0gICAgICAgICAgICAgICAgZXhlYyhmLnJlYWQoKSwgZywgbCkKKyAgICAgICAgICAgICAgICBleGVjKGYucmVhZCgpLCBnKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc3lzLmFyZ3YgPSBzYXZlX2FyZ3YKICAgICAgICAgICAgIF9zZXR1cF9zdG9wX2FmdGVyID0gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHkgYi9MaWIvZGlzdHV0aWxzL2N5Z3dpbmNjb21waWxlci5weQppbmRleCBjODc5NjQ2Li4xYzM2OTkwIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2N5Z3dpbmNjb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL2N5Z3dpbmNjb21waWxlci5weQpAQCAtMzY4LDcgKzM2OCw3IEBACiAgICAgICAgIHJldHVybiAoQ09ORklHX0hfVU5DRVJUQUlOLAogICAgICAgICAgICAgICAgICJjb3VsZG4ndCByZWFkICclcyc6ICVzIiAlIChmbiwgZXhjLnN0cmVycm9yKSkKIAotUkVfVkVSU0lPTiA9IHJlLmNvbXBpbGUoYicoXGQrXC5cZCsoXC5cZCspKiknKQorUkVfVkVSU0lPTiA9IHJlLmNvbXBpbGUoYnInKFxkK1wuXGQrKFwuXGQrKSopJykKIAogZGVmIF9maW5kX2V4ZV92ZXJzaW9uKGNtZCk6CiAgICAgIiIiRmluZCB0aGUgdmVyc2lvbiBvZiBhbiBleGVjdXRhYmxlIGJ5IHJ1bm5pbmcgYGNtZGAgaW4gdGhlIHNoZWxsLgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9kaXN0LnB5IGIvTGliL2Rpc3R1dGlscy9kaXN0LnB5CmluZGV4IGZmYjMzZmY2Li42MmEyNDUxIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2Rpc3QucHkKKysrIGIvTGliL2Rpc3R1dGlscy9kaXN0LnB5CkBAIC0xMDE4LDggKzEwMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICJtYWludGFpbmVyIiwgIm1haW50YWluZXJfZW1haWwiLCAidXJsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAibGljZW5zZSIsICJkZXNjcmlwdGlvbiIsICJsb25nX2Rlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZHMiLCAicGxhdGZvcm1zIiwgImZ1bGxuYW1lIiwgImNvbnRhY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICJjb250YWN0X2VtYWlsIiwgImxpY2Vuc2UiLCAiY2xhc3NpZmllcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICJkb3dubG9hZF91cmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjb250YWN0X2VtYWlsIiwgImNsYXNzaWZpZXJzIiwgImRvd25sb2FkX3VybCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQRVAgMzE0CiAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3ZpZGVzIiwgInJlcXVpcmVzIiwgIm9ic29sZXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9leHRlbnNpb24ucHkgYi9MaWIvZGlzdHV0aWxzL2V4dGVuc2lvbi5weQppbmRleCA3ZWZiYjc0Li5jNTA3ZGEzIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2V4dGVuc2lvbi5weQorKysgYi9MaWIvZGlzdHV0aWxzL2V4dGVuc2lvbi5weQpAQCAtNCw3ICs0LDYgQEAKIG1vZHVsZXMgaW4gc2V0dXAgc2NyaXB0cy4iIiIKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgd2FybmluZ3MKIAogIyBUaGlzIGNsYXNzIGlzIHJlYWxseSBvbmx5IHVzZWQgYnkgdGhlICJidWlsZF9leHQiIGNvbW1hbmQsIHNvIGl0IG1pZ2h0CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL21zdmM5Y29tcGlsZXIucHkgYi9MaWIvZGlzdHV0aWxzL21zdmM5Y29tcGlsZXIucHkKaW5kZXggMGIxZmQxOS4uMjExOTEyNyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9tc3ZjOWNvbXBpbGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvbXN2Yzljb21waWxlci5weQpAQCAtNzE2LDcgKzcxNiw3IEBACiAgICAgICAgICAgICAgICAgciIiIlZDXGR7Mn1cLkNSVCgifCcpLio/KC8+fDwvYXNzZW1ibHlJZGVudGl0eT4pIiIiLAogICAgICAgICAgICAgICAgIHJlLkRPVEFMTCkKICAgICAgICAgICAgIG1hbmlmZXN0X2J1ZiA9IHJlLnN1YihwYXR0ZXJuLCAiIiwgbWFuaWZlc3RfYnVmKQotICAgICAgICAgICAgcGF0dGVybiA9ICI8ZGVwZW5kZW50QXNzZW1ibHk+XHMqPC9kZXBlbmRlbnRBc3NlbWJseT4iCisgICAgICAgICAgICBwYXR0ZXJuID0gciI8ZGVwZW5kZW50QXNzZW1ibHk+XHMqPC9kZXBlbmRlbnRBc3NlbWJseT4iCiAgICAgICAgICAgICBtYW5pZmVzdF9idWYgPSByZS5zdWIocGF0dGVybiwgIiIsIG1hbmlmZXN0X2J1ZikKICAgICAgICAgICAgICMgTm93IHNlZSBpZiBhbnkgb3RoZXIgYXNzZW1ibGllcyBhcmUgcmVmZXJlbmNlZCAtIGlmIG5vdCwgd2UKICAgICAgICAgICAgICMgZG9uJ3Qgd2FudCBhIG1hbmlmZXN0IGVtYmVkZGVkLgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkgYi9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weQppbmRleCA1NzM3MjRkLi42ODEzNTk4IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weQorKysgYi9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weQpAQCAtNzAsNyArNzAsNyBAQAogICAgIGxlYXZpbmcgb2ZmIHRoZSBwYXRjaGxldmVsLiAgU2FtcGxlIHJldHVybiB2YWx1ZXMgY291bGQgYmUgJzEuNScKICAgICBvciAnMi4yJy4KICAgICAiIiIKLSAgICByZXR1cm4gc3lzLnZlcnNpb25bOjNdCisgICAgcmV0dXJuICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQogCiAKIGRlZiBnZXRfcHl0aG9uX2luYyhwbGF0X3NwZWNpZmljPTAsIHByZWZpeD1Ob25lKToKQEAgLTI0Miw2ICsyNDIsOCBAQAogICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKF9zeXNfaG9tZSBvciBwcm9qZWN0X2Jhc2UsICJNYWtlZmlsZSIpCiAgICAgbGliX2RpciA9IGdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWM9MCwgc3RhbmRhcmRfbGliPTEpCiAgICAgY29uZmlnX2ZpbGUgPSAnY29uZmlnLXt9e30nLmZvcm1hdChnZXRfcHl0aG9uX3ZlcnNpb24oKSwgYnVpbGRfZmxhZ3MpCisgICAgaWYgaGFzYXR0cihzeXMuaW1wbGVtZW50YXRpb24sICdfbXVsdGlhcmNoJyk6CisgICAgICAgIGNvbmZpZ19maWxlICs9ICctJXMnICUgc3lzLmltcGxlbWVudGF0aW9uLl9tdWx0aWFyY2gKICAgICByZXR1cm4gb3MucGF0aC5qb2luKGxpYl9kaXIsIGNvbmZpZ19maWxlLCAnTWFrZWZpbGUnKQogCiAKQEAgLTI3Niw3ICsyNzgsNyBAQAogCiAjIFJlZ2V4ZXMgbmVlZGVkIGZvciBwYXJzaW5nIE1ha2VmaWxlIChhbmQgc2ltaWxhciBzeW50YXhlcywKICMgbGlrZSBvbGQtc3R5bGUgU2V0dXAgZmlsZXMpLgotX3ZhcmlhYmxlX3J4ID0gcmUuY29tcGlsZSgiKFthLXpBLVpdW2EtekEtWjAtOV9dKylccyo9XHMqKC4qKSIpCitfdmFyaWFibGVfcnggPSByZS5jb21waWxlKHIiKFthLXpBLVpdW2EtekEtWjAtOV9dKylccyo9XHMqKC4qKSIpCiBfZmluZHZhcjFfcnggPSByZS5jb21waWxlKHIiXCRcKChbQS1aYS16XVtBLVphLXowLTlfXSopXCkiKQogX2ZpbmR2YXIyX3J4ID0gcmUuY29tcGlsZShyIlwkeyhbQS1aYS16XVtBLVphLXowLTlfXSopfSIpCiAKQEAgLTQxNSwzOCArNDE3LDEzIEBACiAKIGRlZiBfaW5pdF9wb3NpeCgpOgogICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgUE9TSVggc3lzdGVtcy4iIiIKLSAgICBnID0ge30KLSAgICAjIGxvYWQgdGhlIGluc3RhbGxlZCBNYWtlZmlsZToKLSAgICB0cnk6Ci0gICAgICAgIGZpbGVuYW1lID0gZ2V0X21ha2VmaWxlX2ZpbGVuYW1lKCkKLSAgICAgICAgcGFyc2VfbWFrZWZpbGUoZmlsZW5hbWUsIGcpCi0gICAgZXhjZXB0IE9TRXJyb3IgYXMgbXNnOgotICAgICAgICBteV9tc2cgPSAiaW52YWxpZCBQeXRob24gaW5zdGFsbGF0aW9uOiB1bmFibGUgdG8gb3BlbiAlcyIgJSBmaWxlbmFtZQotICAgICAgICBpZiBoYXNhdHRyKG1zZywgInN0cmVycm9yIik6Ci0gICAgICAgICAgICBteV9tc2cgPSBteV9tc2cgKyAiICglcykiICUgbXNnLnN0cmVycm9yCi0KLSAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihteV9tc2cpCi0KLSAgICAjIGxvYWQgdGhlIGluc3RhbGxlZCBweWNvbmZpZy5oOgotICAgIHRyeToKLSAgICAgICAgZmlsZW5hbWUgPSBnZXRfY29uZmlnX2hfZmlsZW5hbWUoKQotICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGZpbGU6Ci0gICAgICAgICAgICBwYXJzZV9jb25maWdfaChmaWxlLCBnKQotICAgIGV4Y2VwdCBPU0Vycm9yIGFzIG1zZzoKLSAgICAgICAgbXlfbXNnID0gImludmFsaWQgUHl0aG9uIGluc3RhbGxhdGlvbjogdW5hYmxlIHRvIG9wZW4gJXMiICUgZmlsZW5hbWUKLSAgICAgICAgaWYgaGFzYXR0cihtc2csICJzdHJlcnJvciIpOgotICAgICAgICAgICAgbXlfbXNnID0gbXlfbXNnICsgIiAoJXMpIiAlIG1zZy5zdHJlcnJvcgotCi0gICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXlfbXNnKQotCi0gICAgIyBPbiBBSVgsIHRoZXJlIGFyZSB3cm9uZyBwYXRocyB0byB0aGUgbGlua2VyIHNjcmlwdHMgaW4gdGhlIE1ha2VmaWxlCi0gICAgIyAtLSB0aGVzZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIFB5dGhvbiBzb3VyY2UsIGJ1dCB3aGVuIGluc3RhbGxlZAotICAgICMgdGhlIHNjcmlwdHMgYXJlIGluIGFub3RoZXIgZGlyZWN0b3J5LgotICAgIGlmIHB5dGhvbl9idWlsZDoKLSAgICAgICAgZ1snTERTSEFSRUQnXSA9IGdbJ0JMRFNIQVJFRCddCi0KKyAgICAjIF9zeXNjb25maWdkYXRhIGlzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLCBzZWUgdGhlIHN5c2NvbmZpZyBtb2R1bGUKKyAgICBuYW1lID0gJ19zeXNjb25maWdkYXRhXycgKyBzeXMuYWJpZmxhZ3MKKyAgICBfdGVtcCA9IF9faW1wb3J0X18obmFtZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWydidWlsZF90aW1lX3ZhcnMnXSwgMCkKKyAgICBidWlsZF90aW1lX3ZhcnMgPSBfdGVtcC5idWlsZF90aW1lX3ZhcnMKICAgICBnbG9iYWwgX2NvbmZpZ192YXJzCi0gICAgX2NvbmZpZ192YXJzID0gZworICAgIF9jb25maWdfdmFycyA9IHt9CisgICAgX2NvbmZpZ192YXJzLnVwZGF0ZShidWlsZF90aW1lX3ZhcnMpCiAKIAogZGVmIF9pbml0X250KCk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weQppbmRleCAyNWMxNGFiLi5jMWEyYTA0IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHkKQEAgLTMsMTYgKzMsMTIgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN5cwogaW1wb3J0IG9zCi1pbXBvcnQgdGVtcGZpbGUKLWltcG9ydCBzaHV0aWwKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKIAogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCiBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbSBpbXBvcnQgYmRpc3RfcnBtCiBmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAogZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZQotZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHNwYXduCi1mcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgogCiBTRVRVUF9QWSA9ICIiIlwKIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHkKaW5kZXggMzM5MWYzNi4uYjAyMGE1YiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weQpAQCAtMjcsNyArMjcsNyBAQAogICAgICAgICAjIGJ1aWxkX3BsYXRsaWIgaXMgJ2J1aWxkL2xpYi5wbGF0Zm9ybS14LnhbLXB5ZGVidWddJwogICAgICAgICAjIGV4YW1wbGVzOgogICAgICAgICAjICAgYnVpbGQvbGliLm1hY29zeC0xMC4zLWkzODYtMi43Ci0gICAgICAgIHBsYXRfc3BlYyA9ICcuJXMtJXMnICUgKGNtZC5wbGF0X25hbWUsIHN5cy52ZXJzaW9uWzA6M10pCisgICAgICAgIHBsYXRfc3BlYyA9ICcuJXMtJWQuJWQnICUgKGNtZC5wbGF0X25hbWUsICpzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICAgICAgaWYgaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50Jyk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLmJ1aWxkX3BsYXRsaWIuZW5kc3dpdGgoJy1weWRlYnVnJykpCiAgICAgICAgICAgICBwbGF0X3NwZWMgKz0gJy1weWRlYnVnJwpAQCAtNDIsNyArNDIsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF90ZW1wLCB3YW50ZWQpCiAKICAgICAgICAgIyBidWlsZF9zY3JpcHRzIGlzIGJ1aWxkL3NjcmlwdHMteC54Ci0gICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjbWQuYnVpbGRfYmFzZSwgJ3NjcmlwdHMtJyArICBzeXMudmVyc2lvblswOjNdKQorICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oY21kLmJ1aWxkX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0cy0lZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuYnVpbGRfc2NyaXB0cywgd2FudGVkKQogCiAgICAgICAgICMgZXhlY3V0YWJsZSBpcyBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjdXRhYmxlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9leHQucHkKaW5kZXggNGUzOTdlYS4uNDdiNTg2YyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5CkBAIC0xNjYsNyArMTY2LDYgQEAKICAgICAgICAgY21kID0gc2VsZi5idWlsZF9leHQoZGlzdCkKICAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQogCi0gICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKICAgICAgICAgcHlfaW5jbHVkZSA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2luYygpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocHlfaW5jbHVkZSwgY21kLmluY2x1ZGVfZGlycykKIApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5CmluZGV4IDE4MjgzZGMuLjA3MTJlOTIgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9weS5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHkKQEAgLTE2OCw3ICsxNjgsOCBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgPSBvbGRfZG9udF93cml0ZV9ieXRlY29kZQogCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2J5dGUtY29tcGlsaW5nIGlzIGRpc2FibGVkJywgc2VsZi5sb2dzWzBdWzFdKQorICAgICAgICBzZWxmLmFzc2VydEluKCdieXRlLWNvbXBpbGluZyBpcyBkaXNhYmxlZCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dzWzBdWzFdICUgc2VsZi5sb2dzWzBdWzJdKQogCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkKaW5kZXggYjY0ZjMwMC4uYzYwNWFmZCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weQpAQCAtMSw4ICsxLDYgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5jbGVhbi4iIiIKLWltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgZ2V0cGFzcwogCiBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmNsZWFuIGltcG9ydCBjbGVhbgogZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5CmluZGV4IGEzODQ0OTcuLjc3ZWY3ODggMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weQpAQCAtMSw4ICsxLDYgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMucHlwaXJjLnB5cGlyYy4iIiIKLWltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdGVtcGZpbGUKIAogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgUHlQSVJDQ29tbWFuZAogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5CmluZGV4IDY1NDIyN2MuLjI3Y2U3MzIgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5CkBAIC0yOSw2ICsyOSwyMSBAQAogc2V0dXAoKQogIiIiCiAKK3NldHVwX2RvZXNfbm90aGluZyA9ICIiIlwKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCitzZXR1cCgpCisiIiIKKworCitzZXR1cF9kZWZpbmVzX3N1YmNsYXNzID0gIiIiXAorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBpbXBvcnQgaW5zdGFsbCBhcyBfaW5zdGFsbAorCitjbGFzcyBpbnN0YWxsKF9pbnN0YWxsKToKKyAgICBzdWJfY29tbWFuZHMgPSBfaW5zdGFsbC5zdWJfY29tbWFuZHMgKyBbJ2NtZCddCisKK3NldHVwKGNtZGNsYXNzPXsnaW5zdGFsbCc6IGluc3RhbGx9KQorIiIiCiAKIGNsYXNzIENvcmVUZXN0Q2FzZShzdXBwb3J0LkVudmlyb25HdWFyZCwgdW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC02Nyw2ICs4MiwyMSBAQAogICAgICAgICBkaXN0dXRpbHMuY29yZS5ydW5fc2V0dXAoCiAgICAgICAgICAgICBzZWxmLndyaXRlX3NldHVwKHNldHVwX3VzaW5nX19fZmlsZV9fKSkKIAorICAgIGRlZiB0ZXN0X3J1bl9zZXR1cF9wcmVzZXJ2ZXNfc3lzX2FyZ3Yoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHJ1bl9zZXR1cCBkb2VzIG5vdCBjbG9iYmVyIHN5cy5hcmd2CisgICAgICAgIGFyZ3ZfY29weSA9IHN5cy5hcmd2LmNvcHkoKQorICAgICAgICBkaXN0dXRpbHMuY29yZS5ydW5fc2V0dXAoCisgICAgICAgICAgICBzZWxmLndyaXRlX3NldHVwKHNldHVwX2RvZXNfbm90aGluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmFyZ3YsIGFyZ3ZfY29weSkKKworICAgIGRlZiB0ZXN0X3J1bl9zZXR1cF9kZWZpbmVzX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc2NyaXB0IGNhbiB1c2UgX19maWxlX187IGlmIHRoYXQncyBtaXNzaW5nLCB0aGUgdGVzdAorICAgICAgICAjIHNldHVwLnB5IHNjcmlwdCB3aWxsIHJhaXNlIE5hbWVFcnJvci4KKyAgICAgICAgZGlzdCA9IGRpc3R1dGlscy5jb3JlLnJ1bl9zZXR1cCgKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc2V0dXAoc2V0dXBfZGVmaW5lc19zdWJjbGFzcykpCisgICAgICAgIGluc3RhbGwgPSBkaXN0LmdldF9jb21tYW5kX29iaignaW5zdGFsbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2NtZCcsIGluc3RhbGwuc3ViX2NvbW1hbmRzKQorCiAgICAgZGVmIHRlc3RfcnVuX3NldHVwX3VzZXNfY3VycmVudF9kaXIoc2VsZik6CiAgICAgICAgICMgVGhpcyB0ZXN0cyB0aGF0IHRoZSBzZXR1cCBzY3JpcHQgaXMgcnVuIHdpdGggdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiAgICAgICAgICMgYXMgaXRzIG93biBjdXJyZW50IGRpcmVjdG9yeTsgdGhpcyB3YXMgdGVtcG9yYXJpbHkgYnJva2VuIGJ5IGEKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jeWd3aW5jY29tcGlsZXIucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY3lnd2luY2NvbXBpbGVyLnB5CmluZGV4IDg1NjkyMTYuLjlkYzg2OWQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jeWd3aW5jY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2N5Z3dpbmNjb21waWxlci5weQpAQCAtMywxMSArMywxMCBAQAogaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCi1pbXBvcnQgc3VicHJvY2VzcwogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAogCiBmcm9tIGRpc3R1dGlscyBpbXBvcnQgY3lnd2luY2NvbXBpbGVyCi1mcm9tIGRpc3R1dGlscy5jeWd3aW5jY29tcGlsZXIgaW1wb3J0IChDeWd3aW5DQ29tcGlsZXIsIGNoZWNrX2NvbmZpZ19oLAorZnJvbSBkaXN0dXRpbHMuY3lnd2luY2NvbXBpbGVyIGltcG9ydCAoY2hlY2tfY29uZmlnX2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfSF9PSywgQ09ORklHX0hfTk9UT0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfSF9VTkNFUlRBSU4sIGdldF92ZXJzaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tc3ZjcikKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kZXBfdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kZXBfdXRpbC5weQppbmRleCAzZTFjMzY2Li5jNmZhZTM5IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2RlcF91dGlsLnB5CkBAIC0xLDcgKzEsNiBAQAogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5kZXBfdXRpbC4iIiIKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zCi1pbXBvcnQgdGltZQogCiBmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXIsIG5ld2VyX3BhaXJ3aXNlLCBuZXdlcl9ncm91cAogZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNGaWxlRXJyb3IKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlX3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5CmluZGV4IGE2ZDA0ZjAuLjAzMDQwYWYgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlX3V0aWwucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weQpAQCAtMSw3ICsxLDYgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMuZmlsZV91dGlsLiIiIgogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKLWltcG9ydCBzaHV0aWwKIGltcG9ydCBlcnJubwogZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBwYXRjaAogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weQppbmRleCA0ZDhjMDBhLi4zMmFiMjk2IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHkKQEAgLTEsOCArMSw2IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9kYXRhLiIiIgotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBnZXRwYXNzCiAKIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9kYXRhIGltcG9ydCBpbnN0YWxsX2RhdGEKIGZyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weQppbmRleCBkOTUzMTU3Li4yMjE3YjMyIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2hlYWRlcnMucHkKQEAgLTEsOCArMSw2IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9oZWFkZXJzLiIiIgotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBnZXRwYXNzCiAKIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9oZWFkZXJzIGltcG9ydCBpbnN0YWxsX2hlYWRlcnMKIGZyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHkKaW5kZXggNTM3OGFhOC4uZmRhNjMxNSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2xpYi5weQpAQCAtMTA0LDcgKzEwNCw4IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzeXMuZG9udF93cml0ZV9ieXRlY29kZSA9IG9sZF9kb250X3dyaXRlX2J5dGVjb2RlCiAKLSAgICAgICAgc2VsZi5hc3NlcnRJbignYnl0ZS1jb21waWxpbmcgaXMgZGlzYWJsZWQnLCBzZWxmLmxvZ3NbMF1bMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2J5dGUtY29tcGlsaW5nIGlzIGRpc2FibGVkJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ3NbMF1bMV0gJSBzZWxmLmxvZ3NbMF1bMl0pCiAKIAogZGVmIHRlc3Rfc3VpdGUoKToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weQppbmRleCA2YzdlYjIwLi41ZWRjMjRhIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3Bhd24ucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NwYXduLnB5CkBAIC0xLDExICsxLDExIEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnNwYXduLiIiIgogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCiBpbXBvcnQgb3MKLWltcG9ydCB0aW1lCi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0LCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIHVuaXhfc2hlbGwKIAogZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IF9udF9xdW90ZV9hcmdzCi1mcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24sIGZpbmRfZXhlY3V0YWJsZQorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCiBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgogZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKIApAQCAtMzAsOSArMzAsOSBAQAogCiAgICAgICAgICMgY3JlYXRpbmcgc29tZXRoaW5nIGV4ZWN1dGFibGUKICAgICAgICAgIyB0aHJvdWdoIHRoZSBzaGVsbCB0aGF0IHJldHVybnMgMQotICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnd2luMzInOgogICAgICAgICAgICAgZXhlID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2Zvby5zaCcpCi0gICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZXhlLCAnIyEvYmluL3NoXG5leGl0IDEnKQorICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKGV4ZSwgJyMhJXNcbmV4aXQgMScgJSB1bml4X3NoZWxsKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgZXhlID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2Zvby5iYXQnKQogICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKGV4ZSwgJ2V4aXQgMScpCkBAIC00MSw5ICs0MSw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc0V4ZWNFcnJvciwgc3Bhd24sIFtleGVdKQogCiAgICAgICAgICMgbm93IHNvbWV0aGluZyB0aGF0IHdvcmtzCi0gICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6CiAgICAgICAgICAgICBleGUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnZm9vLnNoJykKLSAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZShleGUsICcjIS9iaW4vc2hcbmV4aXQgMCcpCisgICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZXhlLCAnIyElc1xuZXhpdCAwJyAlIHVuaXhfc2hlbGwpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBleGUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnZm9vLmJhdCcpCiAgICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZXhlLCAnZXhpdCAwJykKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKaW5kZXggZTE3MWVlOS4uZWZiYTI3ZSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKQEAgLTEsNSArMSw0IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnVuaXhjY29tcGlsZXIuIiIiCi1pbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IEVudmlyb25tZW50VmFyR3VhcmQsIHJ1bl91bml0dGVzdApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXh0X2ZpbGUucHkgYi9MaWIvZGlzdHV0aWxzL3RleHRfZmlsZS5weQppbmRleCA0NzgzMzZmLi45M2FiYWQzIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3RleHRfZmlsZS5weQorKysgYi9MaWIvZGlzdHV0aWxzL3RleHRfZmlsZS5weQpAQCAtNCw3ICs0LDcgQEAKIHRoYXQgKG9wdGlvbmFsbHkpIHRha2VzIGNhcmUgb2Ygc3RyaXBwaW5nIGNvbW1lbnRzLCBpZ25vcmluZyBibGFuawogbGluZXMsIGFuZCBqb2luaW5nIGxpbmVzIHdpdGggYmFja3NsYXNoZXMuIiIiCiAKLWltcG9ydCBzeXMsIG9zLCBpbworaW1wb3J0IHN5cywgaW8KIAogCiBjbGFzcyBUZXh0RmlsZToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvdXRpbC5weQppbmRleCBlNDIzMzI1Li5mZGNmNmZhIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3V0aWwucHkKKysrIGIvTGliL2Rpc3R1dGlscy91dGlsLnB5CkBAIC03LDggKzcsOCBAQAogaW1wb3J0IG9zCiBpbXBvcnQgcmUKIGltcG9ydCBpbXBvcnRsaWIudXRpbAotaW1wb3J0IHN5cwogaW1wb3J0IHN0cmluZworaW1wb3J0IHN5cwogZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCiBmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXIKIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgpAQCAtMzUwLDYgKzM1MCwxMSBAQAogICAgIGdlbmVyYXRlZCBpbiBpbmRpcmVjdCBtb2RlOyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcsIGxlYXZlCiAgICAgaXQgc2V0IHRvIE5vbmUuCiAgICAgIiIiCisKKyAgICAjIExhdGUgaW1wb3J0IHRvIGZpeCBhIGJvb3RzdHJhcCBpc3N1ZTogX3Bvc2l4c3VicHJvY2VzcyBpcyBidWlsdCBieQorICAgICMgc2V0dXAucHksIGJ1dCBzZXR1cC5weSB1c2VzIGRpc3R1dGlscy4KKyAgICBpbXBvcnQgc3VicHJvY2VzcworCiAgICAgIyBub3RoaW5nIGlzIGRvbmUgaWYgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgaXMgVHJ1ZQogICAgIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgogICAgICAgICByYWlzZSBEaXN0dXRpbHNCeXRlQ29tcGlsZUVycm9yKCdieXRlLWNvbXBpbGluZyBpcyBkaXNhYmxlZC4nKQpAQCAtNDEyLDExICs0MTcsOSBAQAogCiAgICAgICAgICAgICBzY3JpcHQuY2xvc2UoKQogCi0gICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgc2NyaXB0X25hbWVdCi0gICAgICAgIGlmIG9wdGltaXplID09IDE6Ci0gICAgICAgICAgICBjbWQuaW5zZXJ0KDEsICItTyIpCi0gICAgICAgIGVsaWYgb3B0aW1pemUgPT0gMjoKLSAgICAgICAgICAgIGNtZC5pbnNlcnQoMSwgIi1PTyIpCisgICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZV0KKyAgICAgICAgY21kLmV4dGVuZChzdWJwcm9jZXNzLl9vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSkKKyAgICAgICAgY21kLmFwcGVuZChzY3JpcHRfbmFtZSkKICAgICAgICAgc3Bhd24oY21kLCBkcnlfcnVuPWRyeV9ydW4pCiAgICAgICAgIGV4ZWN1dGUob3MucmVtb3ZlLCAoc2NyaXB0X25hbWUsKSwgInJlbW92aW5nICVzIiAlIHNjcmlwdF9uYW1lLAogICAgICAgICAgICAgICAgIGRyeV9ydW49ZHJ5X3J1bikKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdmVyc2lvbnByZWRpY2F0ZS5weSBiL0xpYi9kaXN0dXRpbHMvdmVyc2lvbnByZWRpY2F0ZS5weQppbmRleCBiMGRkOWY0Li4wNjJjOThmIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3ZlcnNpb25wcmVkaWNhdGUucHkKKysrIGIvTGliL2Rpc3R1dGlscy92ZXJzaW9ucHJlZGljYXRlLnB5CkBAIC0xNTQsNyArMTU0LDcgQEAKICAgICBnbG9iYWwgX3Byb3Zpc2lvbl9yeAogICAgIGlmIF9wcm92aXNpb25fcnggaXMgTm9uZToKICAgICAgICAgX3Byb3Zpc2lvbl9yeCA9IHJlLmNvbXBpbGUoCi0gICAgICAgICAgICAiKFthLXpBLVpfXVx3Kig/OlwuW2EtekEtWl9dXHcqKSopKD86XHMqXChccyooW14pXHNdKylccypcKSk/JCIsCisgICAgICAgICAgICByIihbYS16QS1aX11cdyooPzpcLlthLXpBLVpfXVx3KikqKSg/OlxzKlwoXHMqKFteKVxzXSspXHMqXCkpPyQiLAogICAgICAgICAgICAgcmUuQVNDSUkpCiAgICAgdmFsdWUgPSB2YWx1ZS5zdHJpcCgpCiAgICAgbSA9IF9wcm92aXNpb25fcngubWF0Y2godmFsdWUpCmRpZmYgLS1naXQgYS9MaWIvZG9jdGVzdC5weSBiL0xpYi9kb2N0ZXN0LnB5CmluZGV4IDM4ZmRkODAuLjBiNzg1NDQgMTAwNjQ0Ci0tLSBhL0xpYi9kb2N0ZXN0LnB5CisrKyBiL0xpYi9kb2N0ZXN0LnB5CkBAIC0zODEsMTIgKzM4MSwxNSBAQAogICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CiAKICMgW1hYXSBOb3JtYWxpemUgd2l0aCByZXNwZWN0IHRvIG9zLnBhdGgucGFyZGlyPwotZGVmIF9tb2R1bGVfcmVsYXRpdmVfcGF0aChtb2R1bGUsIHBhdGgpOgorZGVmIF9tb2R1bGVfcmVsYXRpdmVfcGF0aChtb2R1bGUsIHRlc3RfcGF0aCk6CiAgICAgaWYgbm90IGluc3BlY3QuaXNtb2R1bGUobW9kdWxlKToKICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCBhIG1vZHVsZTogJXInICUgbW9kdWxlKQotICAgIGlmIHBhdGguc3RhcnRzd2l0aCgnLycpOgorICAgIGlmIHRlc3RfcGF0aC5zdGFydHN3aXRoKCcvJyk6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ01vZHVsZS1yZWxhdGl2ZSBmaWxlcyBtYXkgbm90IGhhdmUgYWJzb2x1dGUgcGF0aHMnKQogCisgICAgIyBOb3JtYWxpemUgdGhlIHBhdGguIE9uIFdpbmRvd3MsIHJlcGxhY2UgIi8iIHdpdGggIlwiLgorICAgIHRlc3RfcGF0aCA9IG9zLnBhdGguam9pbigqKHRlc3RfcGF0aC5zcGxpdCgnLycpKSkKKwogICAgICMgRmluZCB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBwYXRoLgogICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19maWxlX18nKToKICAgICAgICAgIyBBIG5vcm1hbCBtb2R1bGUvcGFja2FnZQpAQCAtMzk4LDEzICs0MDEsMTkgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGJhc2VkaXIgPSBvcy5jdXJkaXIKICAgICBlbHNlOgorICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CisgICAgICAgICAgICBmb3IgZGlyZWN0b3J5IGluIG1vZHVsZS5fX3BhdGhfXzoKKyAgICAgICAgICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihkaXJlY3RvcnksIHRlc3RfcGF0aCkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmdWxscGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxscGF0aAorCiAgICAgICAgICMgQSBtb2R1bGUgdy9vIF9fZmlsZV9fICh0aGlzIGluY2x1ZGVzIGJ1aWx0aW5zKQogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW4ndCByZXNvbHZlIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBtb2R1bGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICIlciAoaXQgaGFzIG5vIF9fZmlsZV9fKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAlIG1vZHVsZS5fX25hbWVfXykKIAotICAgICMgQ29tYmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIHRoZSBwYXRoLgotICAgIHJldHVybiBvcy5wYXRoLmpvaW4oYmFzZWRpciwgKihwYXRoLnNwbGl0KCcvJykpKQorICAgICMgQ29tYmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIHRoZSB0ZXN0IHBhdGguCisgICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlZGlyLCB0ZXN0X3BhdGgpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIDIuIEV4YW1wbGUgJiBEb2NUZXN0CkBAIC03NTYsNyArNzY1LDcgQEAKIAogICAgICMgVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gZmluZHMgdGhlIGluZGVudGF0aW9uIG9mIGV2ZXJ5IG5vbi1ibGFuawogICAgICMgbGluZSBpbiBhIHN0cmluZy4KLSAgICBfSU5ERU5UX1JFID0gcmUuY29tcGlsZSgnXihbIF0qKSg/PVxTKScsIHJlLk1VTFRJTElORSkKKyAgICBfSU5ERU5UX1JFID0gcmUuY29tcGlsZShyJ14oWyBdKikoPz1cUyknLCByZS5NVUxUSUxJTkUpCiAKICAgICBkZWYgX21pbl9pbmRlbnQoc2VsZiwgcyk6CiAgICAgICAgICJSZXR1cm4gdGhlIG1pbmltdW0gaW5kZW50YXRpb24gb2YgYW55IG5vbi1ibGFuayBsaW5lIGluIGBzYCIKQEAgLTEwOTcsNyArMTEwNiw3IEBACiAgICAgICAgIGlmIGxpbmVubyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGlmIHNvdXJjZV9saW5lcyBpcyBOb25lOgogICAgICAgICAgICAgICAgIHJldHVybiBsaW5lbm8rMQotICAgICAgICAgICAgcGF0ID0gcmUuY29tcGlsZSgnKF58Lio6KVxzKlx3KigifFwnKScpCisgICAgICAgICAgICBwYXQgPSByZS5jb21waWxlKHInKF58Lio6KVxzKlx3KigifFwnKScpCiAgICAgICAgICAgICBmb3IgbGluZW5vIGluIHJhbmdlKGxpbmVubywgbGVuKHNvdXJjZV9saW5lcykpOgogICAgICAgICAgICAgICAgIGlmIHBhdC5tYXRjaChzb3VyY2VfbGluZXNbbGluZW5vXSk6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lbm8KQEAgLTE1OTksMTEgKzE2MDgsMTEgQEAKICAgICAgICAgIyBibGFuayBsaW5lLCB1bmxlc3MgdGhlIERPTlRfQUNDRVBUX0JMQU5LTElORSBmbGFnIGlzIHVzZWQuCiAgICAgICAgIGlmIG5vdCAob3B0aW9uZmxhZ3MgJiBET05UX0FDQ0VQVF9CTEFOS0xJTkUpOgogICAgICAgICAgICAgIyBSZXBsYWNlIDxCTEFOS0xJTkU+IGluIHdhbnQgd2l0aCBhIGJsYW5rIGxpbmUuCi0gICAgICAgICAgICB3YW50ID0gcmUuc3ViKCcoP20pXiVzXHMqPyQnICUgcmUuZXNjYXBlKEJMQU5LTElORV9NQVJLRVIpLAorICAgICAgICAgICAgd2FudCA9IHJlLnN1YihyJyg/bSleJXNccyo/JCcgJSByZS5lc2NhcGUoQkxBTktMSU5FX01BUktFUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLCB3YW50KQogICAgICAgICAgICAgIyBJZiBhIGxpbmUgaW4gZ290IGNvbnRhaW5zIG9ubHkgc3BhY2VzLCB0aGVuIHJlbW92ZSB0aGUKICAgICAgICAgICAgICMgc3BhY2VzLgotICAgICAgICAgICAgZ290ID0gcmUuc3ViKCcoP20pXlxzKj8kJywgJycsIGdvdCkKKyAgICAgICAgICAgIGdvdCA9IHJlLnN1YihyJyg/bSleXHMqPyQnLCAnJywgZ290KQogICAgICAgICAgICAgaWYgZ290ID09IHdhbnQ6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKIApkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL19oZWFkZXJfdmFsdWVfcGFyc2VyLnB5IGIvTGliL2VtYWlsL19oZWFkZXJfdmFsdWVfcGFyc2VyLnB5CmluZGV4IDVkZjk1MTEuLjU3ZDAxZmIgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9faGVhZGVyX3ZhbHVlX3BhcnNlci5weQorKysgYi9MaWIvZW1haWwvX2hlYWRlcl92YWx1ZV9wYXJzZXIucHkKQEAgLTY1Miw4ICs2NTIsOCBAQAogICAgICAgICBpZiB2YWx1ZS50b2tlbl90eXBlID09ICdjb21tZW50JzoKICAgICAgICAgICAgIHJldHVybiBzdHIodmFsdWUpCiAgICAgICAgIHJldHVybiBzdHIodmFsdWUpLnJlcGxhY2UoJ1xcJywgJ1xcXFwnKS5yZXBsYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJywgJ1woJykucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKScsICdcKScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnLCByJ1woJykucmVwbGFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKScsIHInXCknKQogCiAgICAgQHByb3BlcnR5CiAgICAgZGVmIGNvbnRlbnQoc2VsZik6CkBAIC0xMzU2LDE1ICsxMzU2LDE1IEBACiAKIF93c3Bfc3BsaXR0ZXIgPSByZS5jb21waWxlKHInKFt7fV0rKScuZm9ybWF0KCcnLmpvaW4oV1NQKSkpLnNwbGl0CiBfbm9uX2F0b21fZW5kX21hdGNoZXIgPSByZS5jb21waWxlKHIiW157fV0rIi5mb3JtYXQoCi0gICAgJycuam9pbihBVE9NX0VORFMpLnJlcGxhY2UoJ1xcJywnXFxcXCcpLnJlcGxhY2UoJ10nLCdcXScpKSkubWF0Y2gKKyAgICAnJy5qb2luKEFUT01fRU5EUykucmVwbGFjZSgnXFwnLCdcXFxcJykucmVwbGFjZSgnXScscidcXScpKSkubWF0Y2gKIF9ub25fcHJpbnRhYmxlX2ZpbmRlciA9IHJlLmNvbXBpbGUociJbXHgwMC1ceDIwXHg3Rl0iKS5maW5kYWxsCiBfbm9uX3Rva2VuX2VuZF9tYXRjaGVyID0gcmUuY29tcGlsZShyIltee31dKyIuZm9ybWF0KAotICAgICcnLmpvaW4oVE9LRU5fRU5EUykucmVwbGFjZSgnXFwnLCdcXFxcJykucmVwbGFjZSgnXScsJ1xdJykpKS5tYXRjaAorICAgICcnLmpvaW4oVE9LRU5fRU5EUykucmVwbGFjZSgnXFwnLCdcXFxcJykucmVwbGFjZSgnXScscidcXScpKSkubWF0Y2gKIF9ub25fYXR0cmlidXRlX2VuZF9tYXRjaGVyID0gcmUuY29tcGlsZShyIltee31dKyIuZm9ybWF0KAotICAgICcnLmpvaW4oQVRUUklCVVRFX0VORFMpLnJlcGxhY2UoJ1xcJywnXFxcXCcpLnJlcGxhY2UoJ10nLCdcXScpKSkubWF0Y2gKKyAgICAnJy5qb2luKEFUVFJJQlVURV9FTkRTKS5yZXBsYWNlKCdcXCcsJ1xcXFwnKS5yZXBsYWNlKCddJyxyJ1xdJykpKS5tYXRjaAogX25vbl9leHRlbmRlZF9hdHRyaWJ1dGVfZW5kX21hdGNoZXIgPSByZS5jb21waWxlKHIiW157fV0rIi5mb3JtYXQoCiAgICAgJycuam9pbihFWFRFTkRFRF9BVFRSSUJVVEVfRU5EUykucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXCcsJ1xcXFwnKS5yZXBsYWNlKCddJywnXF0nKSkpLm1hdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnLCdcXFxcJykucmVwbGFjZSgnXScscidcXScpKSkubWF0Y2gKIAogZGVmIF92YWxpZGF0ZV94dGV4dCh4dGV4dCk6CiAgICAgIiIiSWYgaW5wdXQgdG9rZW4gY29udGFpbnMgQVNDSUkgbm9uLXByaW50YWJsZXMsIHJlZ2lzdGVyIGEgZGVmZWN0LiIiIgpAQCAtMTUxNyw3ICsxNTE3LDcgQEAKICAgICByZXR1cm4gdW5zdHJ1Y3R1cmVkCiAKIGRlZiBnZXRfcXBfY3RleHQodmFsdWUpOgotICAgICIiImN0ZXh0ID0gPHByaW50YWJsZSBhc2NpaSBleGNlcHQgXCAoICk+CisgICAgciIiImN0ZXh0ID0gPHByaW50YWJsZSBhc2NpaSBleGNlcHQgXCAoICk+CiAKICAgICBUaGlzIGlzIG5vdCB0aGUgUkZDIGN0ZXh0LCBzaW5jZSB3ZSBhcmUgaGFuZGxpbmcgbmVzdGVkIGNvbW1lbnRzIGluIGNvbW1lbnQKICAgICBhbmQgdW5xdW90aW5nIHF1b3RlZC1wYWlycyBoZXJlLiAgV2UgYWxsb3cgYW55dGhpbmcgZXhjZXB0IHRoZSAnKCknCkBAIC0xODc4LDcgKzE4NzgsNyBAQAogICAgIHJldHVybiBvYnNfbG9jYWxfcGFydCwgdmFsdWUKIAogZGVmIGdldF9kdGV4dCh2YWx1ZSk6Ci0gICAgIiIiIGR0ZXh0ID0gPHByaW50YWJsZSBhc2NpaSBleGNlcHQgXCBbIF0+IC8gb2JzLWR0ZXh0CisgICAgciIiIiBkdGV4dCA9IDxwcmludGFibGUgYXNjaWkgZXhjZXB0IFwgWyBdPiAvIG9icy1kdGV4dAogICAgICAgICBvYnMtZHRleHQgPSBvYnMtTk8tV1MtQ1RMIC8gcXVvdGVkLXBhaXIKIAogICAgIFdlIGFsbG93IGFueXRoaW5nIGV4Y2VwdCB0aGUgZXhjbHVkZWQgY2hhcmFjdGVycywgYnV0IGlmIHdlIGZpbmQgYW55CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvY29udGVudG1hbmFnZXIucHkgYi9MaWIvZW1haWwvY29udGVudG1hbmFnZXIucHkKaW5kZXggYjk4Y2UyNy4uYjkwNGRlZCAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL2NvbnRlbnRtYW5hZ2VyLnB5CisrKyBiL0xpYi9lbWFpbC9jb250ZW50bWFuYWdlci5weQpAQCAtMTQyLDcgKzE0Miw3IEBACiBkZWYgX2VuY29kZV90ZXh0KHN0cmluZywgY2hhcnNldCwgY3RlLCBwb2xpY3kpOgogICAgIGxpbmVzID0gc3RyaW5nLmVuY29kZShjaGFyc2V0KS5zcGxpdGxpbmVzKCkKICAgICBsaW5lc2VwID0gcG9saWN5LmxpbmVzZXAuZW5jb2RlKCdhc2NpaScpCi0gICAgZGVmIGVtYmVkZWRfYm9keShsaW5lcyk6IHJldHVybiBsaW5lc2VwLmpvaW4obGluZXMpICsgbGluZXNlcAorICAgIGRlZiBlbWJlZGRlZF9ib2R5KGxpbmVzKTogcmV0dXJuIGxpbmVzZXAuam9pbihsaW5lcykgKyBsaW5lc2VwCiAgICAgZGVmIG5vcm1hbF9ib2R5KGxpbmVzKTogcmV0dXJuIGInXG4nLmpvaW4obGluZXMpICsgYidcbicKICAgICBpZiBjdGU9PU5vbmU6CiAgICAgICAgICMgVXNlIGhldXJpc3RpY3MgdG8gZGVjaWRlIG9uIHRoZSAiYmVzdCIgZW5jb2RpbmcuCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAgICAgaWYgKHBvbGljeS5jdGVfdHlwZSA9PSAnOGJpdCcgYW5kCiAgICAgICAgICAgICAgICAgbWF4KGxlbih4KSBmb3IgeCBpbiBsaW5lcykgPD0gcG9saWN5Lm1heF9saW5lX2xlbmd0aCk6CiAgICAgICAgICAgICByZXR1cm4gJzhiaXQnLCBub3JtYWxfYm9keShsaW5lcykuZGVjb2RlKCdhc2NpaScsICdzdXJyb2dhdGVlc2NhcGUnKQotICAgICAgICBzbmlmZiA9IGVtYmVkZWRfYm9keShsaW5lc1s6MTBdKQorICAgICAgICBzbmlmZiA9IGVtYmVkZGVkX2JvZHkobGluZXNbOjEwXSkKICAgICAgICAgc25pZmZfcXAgPSBxdW9wcmltaW1lLmJvZHlfZW5jb2RlKHNuaWZmLmRlY29kZSgnbGF0aW4tMScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5Lm1heF9saW5lX2xlbmd0aCkKICAgICAgICAgc25pZmZfYmFzZTY0ID0gYmluYXNjaWkuYjJhX2Jhc2U2NChzbmlmZikKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgICAgICBkYXRhID0gcXVvcHJpbWltZS5ib2R5X2VuY29kZShub3JtYWxfYm9keShsaW5lcykuZGVjb2RlKCdsYXRpbi0xJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeS5tYXhfbGluZV9sZW5ndGgpCiAgICAgZWxpZiBjdGUgPT0gJ2Jhc2U2NCc6Ci0gICAgICAgIGRhdGEgPSBfZW5jb2RlX2Jhc2U2NChlbWJlZGVkX2JvZHkobGluZXMpLCBwb2xpY3kubWF4X2xpbmVfbGVuZ3RoKQorICAgICAgICBkYXRhID0gX2VuY29kZV9iYXNlNjQoZW1iZWRkZWRfYm9keShsaW5lcyksIHBvbGljeS5tYXhfbGluZV9sZW5ndGgpCiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5rbm93biBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIHt9Ii5mb3JtYXQoY3RlKSkKICAgICByZXR1cm4gY3RlLCBkYXRhCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvZmVlZHBhcnNlci5weSBiL0xpYi9lbWFpbC9mZWVkcGFyc2VyLnB5CmluZGV4IDBiMzEyZTUuLjJmYTc3ZDcgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9mZWVkcGFyc2VyLnB5CisrKyBiL0xpYi9lbWFpbC9mZWVkcGFyc2VyLnB5CkBAIC0yOSwxMCArMjksMTAgQEAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCiBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwogCi1OTENSRSA9IHJlLmNvbXBpbGUoJ1xyXG58XHJ8XG4nKQotTkxDUkVfYm9sID0gcmUuY29tcGlsZSgnKFxyXG58XHJ8XG4pJykKLU5MQ1JFX2VvbCA9IHJlLmNvbXBpbGUoJyhcclxufFxyfFxuKVxaJykKLU5MQ1JFX2NyYWNrID0gcmUuY29tcGlsZSgnKFxyXG58XHJ8XG4pJykKK05MQ1JFID0gcmUuY29tcGlsZShyJ1xyXG58XHJ8XG4nKQorTkxDUkVfYm9sID0gcmUuY29tcGlsZShyJyhcclxufFxyfFxuKScpCitOTENSRV9lb2wgPSByZS5jb21waWxlKHInKFxyXG58XHJ8XG4pXFonKQorTkxDUkVfY3JhY2sgPSByZS5jb21waWxlKHInKFxyXG58XHJ8XG4pJykKICMgUkZDIDI4MjIgJDMuNi44IE9wdGlvbmFsIGZpZWxkcy4gIGZ0ZXh0IGlzICVkMzMtNTcgLyAlZDU5LTEyNiwgQW55IGNoYXJhY3RlcgogIyBleGNlcHQgY29udHJvbHMsIFNQLCBhbmQgIjoiLgogaGVhZGVyUkUgPSByZS5jb21waWxlKHInXihGcm9tIHxbXDA0MS1cMDcxXDA3My1cMTc2XSo6fFtcdCBdKScpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvZ2VuZXJhdG9yLnB5IGIvTGliL2VtYWlsL2dlbmVyYXRvci5weQppbmRleCA2ZDI4M2U5Li41MTEwOWY5IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvZ2VuZXJhdG9yLnB5CisrKyBiL0xpYi9lbWFpbC9nZW5lcmF0b3IucHkKQEAgLTQ0NCw3ICs0NDQsOCBAQAogICAgIExpa2UgdGhlIEdlbmVyYXRvciBiYXNlIGNsYXNzLCBleGNlcHQgdGhhdCBub24tdGV4dCBwYXJ0cyBhcmUgc3Vic3RpdHV0ZWQKICAgICB3aXRoIGEgZm9ybWF0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhcnQuCiAgICAgIiIiCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG91dGZwLCBtYW5nbGVfZnJvbV89Tm9uZSwgbWF4aGVhZGVybGVuPTc4LCBmbXQ9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG91dGZwLCBtYW5nbGVfZnJvbV89Tm9uZSwgbWF4aGVhZGVybGVuPU5vbmUsIGZtdD1Ob25lLCAqLAorICAgICAgICAgICAgICAgICBwb2xpY3k9Tm9uZSk6CiAgICAgICAgICIiIkxpa2UgR2VuZXJhdG9yLl9faW5pdF9fKCkgZXhjZXB0IHRoYXQgYW4gYWRkaXRpb25hbCBvcHRpb25hbAogICAgICAgICBhcmd1bWVudCBpcyBhbGxvd2VkLgogCkBAIC00NjYsNyArNDY3LDggQEAKIAogICAgICAgICBbTm9uLXRleHQgKCUodHlwZSlzKSBwYXJ0IG9mIG1lc3NhZ2Ugb21pdHRlZCwgZmlsZW5hbWUgJShmaWxlbmFtZSlzXQogICAgICAgICAiIiIKLSAgICAgICAgR2VuZXJhdG9yLl9faW5pdF9fKHNlbGYsIG91dGZwLCBtYW5nbGVfZnJvbV8sIG1heGhlYWRlcmxlbikKKyAgICAgICAgR2VuZXJhdG9yLl9faW5pdF9fKHNlbGYsIG91dGZwLCBtYW5nbGVfZnJvbV8sIG1heGhlYWRlcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeT1wb2xpY3kpCiAgICAgICAgIGlmIGZtdCBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5fZm10ID0gX0ZNVAogICAgICAgICBlbHNlOgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL2hlYWRlci5weSBiL0xpYi9lbWFpbC9oZWFkZXIucHkKaW5kZXggNjgyMGVhMS4uYzdiMmRkOSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL2hlYWRlci5weQorKysgYi9MaWIvZW1haWwvaGVhZGVyLnB5CkBAIC00OSw3ICs0OSw3IEBACiAKICMgRmluZCBhIGhlYWRlciBlbWJlZGRlZCBpbiBhIHB1dGF0aXZlIGhlYWRlciB2YWx1ZS4gIFVzZWQgdG8gY2hlY2sgZm9yCiAjIGhlYWRlciBpbmplY3Rpb24gYXR0YWNrLgotX2VtYmVkZWRfaGVhZGVyID0gcmUuY29tcGlsZShyJ1xuW14gXHRdKzonKQorX2VtYmVkZGVkX2hlYWRlciA9IHJlLmNvbXBpbGUocidcblteIFx0XSs6JykKIAogCiAMCkBAIC0zODUsNyArMzg1LDcgQEAKICAgICAgICAgaWYgc2VsZi5fY2h1bmtzOgogICAgICAgICAgICAgZm9ybWF0dGVyLmFkZF90cmFuc2l0aW9uKCkKICAgICAgICAgdmFsdWUgPSBmb3JtYXR0ZXIuX3N0cihsaW5lc2VwKQotICAgICAgICBpZiBfZW1iZWRlZF9oZWFkZXIuc2VhcmNoKHZhbHVlKToKKyAgICAgICAgaWYgX2VtYmVkZGVkX2hlYWRlci5zZWFyY2godmFsdWUpOgogICAgICAgICAgICAgcmFpc2UgSGVhZGVyUGFyc2VFcnJvcigiaGVhZGVyIHZhbHVlIGFwcGVhcnMgdG8gY29udGFpbiAiCiAgICAgICAgICAgICAgICAgImFuIGVtYmVkZGVkIGhlYWRlcjogeyFyfSIuZm9ybWF0KHZhbHVlKSkKICAgICAgICAgcmV0dXJuIHZhbHVlCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvbWVzc2FnZS5weSBiL0xpYi9lbWFpbC9tZXNzYWdlLnB5CmluZGV4IDRiMDQyODMuLmMwN2RhNDMgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9tZXNzYWdlLnB5CisrKyBiL0xpYi9lbWFpbC9tZXNzYWdlLnB5CkBAIC05NTEsNiArOTUxLDI2IEBACiAgICAgICAgICAgICBwb2xpY3kgPSBkZWZhdWx0CiAgICAgICAgIE1lc3NhZ2UuX19pbml0X18oc2VsZiwgcG9saWN5KQogCisKKyAgICBkZWYgYXNfc3RyaW5nKHNlbGYsIHVuaXhmcm9tPUZhbHNlLCBtYXhoZWFkZXJsZW49Tm9uZSwgcG9saWN5PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGVudGlyZSBmb3JtYXR0ZWQgbWVzc2FnZSBhcyBhIHN0cmluZy4KKworICAgICAgICBPcHRpb25hbCAndW5peGZyb20nLCB3aGVuIHRydWUsIG1lYW5zIGluY2x1ZGUgdGhlIFVuaXggRnJvbV8gZW52ZWxvcGUKKyAgICAgICAgaGVhZGVyLiAgbWF4aGVhZGVybGVuIGlzIHJldGFpbmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlCisgICAgICAgIGJhc2UgTWVzc2FnZSBjbGFzcywgYnV0IGRlZmF1bHRzIHRvIE5vbmUsIG1lYW5pbmcgdGhhdCB0aGUgcG9saWN5IHZhbHVlCisgICAgICAgIGZvciBtYXhfbGluZV9sZW5ndGggY29udHJvbHMgdGhlIGhlYWRlciBtYXhpbXVtIGxlbmd0aC4gICdwb2xpY3knIGlzCisgICAgICAgIHBhc3NlZCB0byB0aGUgR2VuZXJhdG9yIGluc3RhbmNlIHVzZWQgdG8gc2VyaWFsaXplIHRoZSBtZXNhc2dlOyBpZiBpdAorICAgICAgICBpcyBub3Qgc3BlY2lmaWVkIHRoZSBwb2xpY3kgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlIGluc3RhbmNlIGlzCisgICAgICAgIHVzZWQuCisgICAgICAgICIiIgorICAgICAgICBwb2xpY3kgPSBzZWxmLnBvbGljeSBpZiBwb2xpY3kgaXMgTm9uZSBlbHNlIHBvbGljeQorICAgICAgICBpZiBtYXhoZWFkZXJsZW4gaXMgTm9uZToKKyAgICAgICAgICAgIG1heGhlYWRlcmxlbiA9IHBvbGljeS5tYXhfbGluZV9sZW5ndGgKKyAgICAgICAgcmV0dXJuIHN1cGVyKCkuYXNfc3RyaW5nKG1heGhlYWRlcmxlbj1tYXhoZWFkZXJsZW4sIHBvbGljeT1wb2xpY3kpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXNfc3RyaW5nKHBvbGljeT1zZWxmLnBvbGljeS5jbG9uZSh1dGY4PVRydWUpKQorCiAgICAgZGVmIGlzX2F0dGFjaG1lbnQoc2VsZik6CiAgICAgICAgIGNfZCA9IHNlbGYuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJykKICAgICAgICAgcmV0dXJuIEZhbHNlIGlmIGNfZCBpcyBOb25lIGVsc2UgY19kLmNvbnRlbnRfZGlzcG9zaXRpb24gPT0gJ2F0dGFjaG1lbnQnCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weSBiL0xpYi9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5CmluZGV4IGY1YzU5MDUuLjY4NzdlNTUgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5CisrKyBiL0xpYi9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5CkBAIC0xNCw3ICsxNCw3IEBACiAgICAgIiIiQ2xhc3MgZm9yIGdlbmVyYXRpbmcgYXBwbGljYXRpb24vKiBNSU1FIGRvY3VtZW50cy4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfZGF0YSwgX3N1YnR5cGU9J29jdGV0LXN0cmVhbScsCi0gICAgICAgICAgICAgICAgIF9lbmNvZGVyPWVuY29kZXJzLmVuY29kZV9iYXNlNjQsICoqX3BhcmFtcyk6CisgICAgICAgICAgICAgICAgIF9lbmNvZGVyPWVuY29kZXJzLmVuY29kZV9iYXNlNjQsICosIHBvbGljeT1Ob25lLCAqKl9wYXJhbXMpOgogICAgICAgICAiIiJDcmVhdGUgYW4gYXBwbGljYXRpb24vKiB0eXBlIE1JTUUgZG9jdW1lbnQuCiAKICAgICAgICAgX2RhdGEgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmF3IGFwcGxpY2F0aW9uIGRhdGEuCkBAIC0zMSw2ICszMSw3IEBACiAgICAgICAgICIiIgogICAgICAgICBpZiBfc3VidHlwZSBpcyBOb25lOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdJbnZhbGlkIGFwcGxpY2F0aW9uIE1JTUUgc3VidHlwZScpCi0gICAgICAgIE1JTUVOb25NdWx0aXBhcnQuX19pbml0X18oc2VsZiwgJ2FwcGxpY2F0aW9uJywgX3N1YnR5cGUsICoqX3BhcmFtcykKKyAgICAgICAgTUlNRU5vbk11bHRpcGFydC5fX2luaXRfXyhzZWxmLCAnYXBwbGljYXRpb24nLCBfc3VidHlwZSwgcG9saWN5PXBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKl9wYXJhbXMpCiAgICAgICAgIHNlbGYuc2V0X3BheWxvYWQoX2RhdGEpCiAgICAgICAgIF9lbmNvZGVyKHNlbGYpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvbWltZS9hdWRpby5weSBiL0xpYi9lbWFpbC9taW1lL2F1ZGlvLnB5CmluZGV4IGZiYzExODkuLjRiY2Q3YjIgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9taW1lL2F1ZGlvLnB5CisrKyBiL0xpYi9lbWFpbC9taW1lL2F1ZGlvLnB5CkBAIC00Myw3ICs0Myw3IEBACiAgICAgIiIiQ2xhc3MgZm9yIGdlbmVyYXRpbmcgYXVkaW8vKiBNSU1FIGRvY3VtZW50cy4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfYXVkaW9kYXRhLCBfc3VidHlwZT1Ob25lLAotICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqKl9wYXJhbXMpOgorICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqLCBwb2xpY3k9Tm9uZSwgKipfcGFyYW1zKToKICAgICAgICAgIiIiQ3JlYXRlIGFuIGF1ZGlvLyogdHlwZSBNSU1FIGRvY3VtZW50LgogCiAgICAgICAgIF9hdWRpb2RhdGEgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmF3IGF1ZGlvIGRhdGEuICBJZiB0aGlzIGRhdGEKQEAgLTY4LDYgKzY4LDcgQEAKICAgICAgICAgICAgIF9zdWJ0eXBlID0gX3doYXRzbmQoX2F1ZGlvZGF0YSkKICAgICAgICAgaWYgX3N1YnR5cGUgaXMgTm9uZToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ291bGQgbm90IGZpbmQgYXVkaW8gTUlNRSBzdWJ0eXBlJykKLSAgICAgICAgTUlNRU5vbk11bHRpcGFydC5fX2luaXRfXyhzZWxmLCAnYXVkaW8nLCBfc3VidHlwZSwgKipfcGFyYW1zKQorICAgICAgICBNSU1FTm9uTXVsdGlwYXJ0Ll9faW5pdF9fKHNlbGYsICdhdWRpbycsIF9zdWJ0eXBlLCBwb2xpY3k9cG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqX3BhcmFtcykKICAgICAgICAgc2VsZi5zZXRfcGF5bG9hZChfYXVkaW9kYXRhKQogICAgICAgICBfZW5jb2RlcihzZWxmKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL21pbWUvYmFzZS5weSBiL0xpYi9lbWFpbC9taW1lL2Jhc2UucHkKaW5kZXggYWM5MTkyNS4uMWEzZjliNSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL21pbWUvYmFzZS5weQorKysgYi9MaWIvZW1haWwvbWltZS9iYXNlLnB5CkBAIC02LDYgKzYsOCBAQAogCiBfX2FsbF9fID0gWydNSU1FQmFzZSddCiAKK2ltcG9ydCBlbWFpbC5wb2xpY3kKKwogZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZQogCiAKQEAgLTEzLDE0ICsxNSwxNiBAQAogY2xhc3MgTUlNRUJhc2UobWVzc2FnZS5NZXNzYWdlKToKICAgICAiIiJCYXNlIGNsYXNzIGZvciBNSU1FIHNwZWNpYWxpemF0aW9ucy4iIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfbWFpbnR5cGUsIF9zdWJ0eXBlLCAqKl9wYXJhbXMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfbWFpbnR5cGUsIF9zdWJ0eXBlLCAqLCBwb2xpY3k9Tm9uZSwgKipfcGFyYW1zKToKICAgICAgICAgIiIiVGhpcyBjb25zdHJ1Y3RvciBhZGRzIGEgQ29udGVudC1UeXBlOiBhbmQgYSBNSU1FLVZlcnNpb246IGhlYWRlci4KIAogICAgICAgICBUaGUgQ29udGVudC1UeXBlOiBoZWFkZXIgaXMgdGFrZW4gZnJvbSB0aGUgX21haW50eXBlIGFuZCBfc3VidHlwZQogICAgICAgICBhcmd1bWVudHMuICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoaXMgaGVhZGVyIGFyZSB0YWtlbiBmcm9tIHRoZQogICAgICAgICBrZXl3b3JkIGFyZ3VtZW50cy4KICAgICAgICAgIiIiCi0gICAgICAgIG1lc3NhZ2UuTWVzc2FnZS5fX2luaXRfXyhzZWxmKQorICAgICAgICBpZiBwb2xpY3kgaXMgTm9uZToKKyAgICAgICAgICAgIHBvbGljeSA9IGVtYWlsLnBvbGljeS5jb21wYXQzMgorICAgICAgICBtZXNzYWdlLk1lc3NhZ2UuX19pbml0X18oc2VsZiwgcG9saWN5PXBvbGljeSkKICAgICAgICAgY3R5cGUgPSAnJXMvJXMnICUgKF9tYWludHlwZSwgX3N1YnR5cGUpCiAgICAgICAgIHNlbGYuYWRkX2hlYWRlcignQ29udGVudC1UeXBlJywgY3R5cGUsICoqX3BhcmFtcykKICAgICAgICAgc2VsZlsnTUlNRS1WZXJzaW9uJ10gPSAnMS4wJwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL21pbWUvaW1hZ2UucHkgYi9MaWIvZW1haWwvbWltZS9pbWFnZS5weQppbmRleCA1NTYzODIzLi45MjcyNDY0IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvbWltZS9pbWFnZS5weQorKysgYi9MaWIvZW1haWwvbWltZS9pbWFnZS5weQpAQCAtMTcsNyArMTcsNyBAQAogICAgICIiIkNsYXNzIGZvciBnZW5lcmF0aW5nIGltYWdlLyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfaW1hZ2VkYXRhLCBfc3VidHlwZT1Ob25lLAotICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqKl9wYXJhbXMpOgorICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqLCBwb2xpY3k9Tm9uZSwgKipfcGFyYW1zKToKICAgICAgICAgIiIiQ3JlYXRlIGFuIGltYWdlLyogdHlwZSBNSU1FIGRvY3VtZW50LgogCiAgICAgICAgIF9pbWFnZWRhdGEgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmF3IGltYWdlIGRhdGEuICBJZiB0aGlzIGRhdGEKQEAgLTQxLDYgKzQxLDcgQEAKICAgICAgICAgICAgIF9zdWJ0eXBlID0gaW1naGRyLndoYXQoTm9uZSwgX2ltYWdlZGF0YSkKICAgICAgICAgaWYgX3N1YnR5cGUgaXMgTm9uZToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ291bGQgbm90IGd1ZXNzIGltYWdlIE1JTUUgc3VidHlwZScpCi0gICAgICAgIE1JTUVOb25NdWx0aXBhcnQuX19pbml0X18oc2VsZiwgJ2ltYWdlJywgX3N1YnR5cGUsICoqX3BhcmFtcykKKyAgICAgICAgTUlNRU5vbk11bHRpcGFydC5fX2luaXRfXyhzZWxmLCAnaW1hZ2UnLCBfc3VidHlwZSwgcG9saWN5PXBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKl9wYXJhbXMpCiAgICAgICAgIHNlbGYuc2V0X3BheWxvYWQoX2ltYWdlZGF0YSkKICAgICAgICAgX2VuY29kZXIoc2VsZikKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9taW1lL21lc3NhZ2UucHkgYi9MaWIvZW1haWwvbWltZS9tZXNzYWdlLnB5CmluZGV4IDI3NWRiZmQuLjA3ZTRmMmQgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9taW1lL21lc3NhZ2UucHkKKysrIGIvTGliL2VtYWlsL21pbWUvbWVzc2FnZS5weQpAQCAtMTQsNyArMTQsNyBAQAogY2xhc3MgTUlNRU1lc3NhZ2UoTUlNRU5vbk11bHRpcGFydCk6CiAgICAgIiIiQ2xhc3MgcmVwcmVzZW50aW5nIG1lc3NhZ2UvKiBNSU1FIGRvY3VtZW50cy4iIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfbXNnLCBfc3VidHlwZT0ncmZjODIyJyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9tc2csIF9zdWJ0eXBlPSdyZmM4MjInLCAqLCBwb2xpY3k9Tm9uZSk6CiAgICAgICAgICIiIkNyZWF0ZSBhIG1lc3NhZ2UvKiB0eXBlIE1JTUUgZG9jdW1lbnQuCiAKICAgICAgICAgX21zZyBpcyBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIE1lc3NhZ2UsIG9yIGEKQEAgLTI0LDcgKzI0LDcgQEAKICAgICAgICAgZGVmYXVsdCBpcyAicmZjODIyIiAodGhpcyBpcyBkZWZpbmVkIGJ5IHRoZSBNSU1FIHN0YW5kYXJkLCBldmVuIHRob3VnaAogICAgICAgICB0aGUgdGVybSAicmZjODIyIiBpcyB0ZWNobmljYWxseSBvdXRkYXRlZCBieSBSRkMgMjgyMikuCiAgICAgICAgICIiIgotICAgICAgICBNSU1FTm9uTXVsdGlwYXJ0Ll9faW5pdF9fKHNlbGYsICdtZXNzYWdlJywgX3N1YnR5cGUpCisgICAgICAgIE1JTUVOb25NdWx0aXBhcnQuX19pbml0X18oc2VsZiwgJ21lc3NhZ2UnLCBfc3VidHlwZSwgcG9saWN5PXBvbGljeSkKICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoX21zZywgbWVzc2FnZS5NZXNzYWdlKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQXJndW1lbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIE1lc3NhZ2UnKQogICAgICAgICAjIEl0J3MgY29udmVuaWVudCB0byB1c2UgdGhpcyBiYXNlIGNsYXNzIG1ldGhvZC4gIFdlIG5lZWQgdG8gZG8gaXQKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9taW1lL211bHRpcGFydC5weSBiL0xpYi9lbWFpbC9taW1lL211bHRpcGFydC5weQppbmRleCA5NjYxODY1Li4yZDNmMjg4IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvbWltZS9tdWx0aXBhcnQucHkKKysrIGIvTGliL2VtYWlsL21pbWUvbXVsdGlwYXJ0LnB5CkBAIC0xNCw2ICsxNCw3IEBACiAgICAgIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSBtdWx0aXBhcnQvKiB0eXBlIG1lc3NhZ2VzLiIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9zdWJ0eXBlPSdtaXhlZCcsIGJvdW5kYXJ5PU5vbmUsIF9zdWJwYXJ0cz1Ob25lLAorICAgICAgICAgICAgICAgICAqLCBwb2xpY3k9Tm9uZSwKICAgICAgICAgICAgICAgICAgKipfcGFyYW1zKToKICAgICAgICAgIiIiQ3JlYXRlcyBhIG11bHRpcGFydC8qIHR5cGUgbWVzc2FnZS4KIApAQCAtMzMsNyArMzQsNyBAQAogICAgICAgICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGFyZSB0YWtlbiBmcm9tIHRoZQogICAgICAgICBrZXl3b3JkIGFyZ3VtZW50cyAob3IgcGFzc2VkIGludG8gdGhlIF9wYXJhbXMgYXJndW1lbnQpLgogICAgICAgICAiIiIKLSAgICAgICAgTUlNRUJhc2UuX19pbml0X18oc2VsZiwgJ211bHRpcGFydCcsIF9zdWJ0eXBlLCAqKl9wYXJhbXMpCisgICAgICAgIE1JTUVCYXNlLl9faW5pdF9fKHNlbGYsICdtdWx0aXBhcnQnLCBfc3VidHlwZSwgcG9saWN5PXBvbGljeSwgKipfcGFyYW1zKQogCiAgICAgICAgICMgSW5pdGlhbGlzZSBfcGF5bG9hZCB0byBhbiBlbXB0eSBsaXN0IGFzIHRoZSBNZXNzYWdlIHN1cGVyY2xhc3MncwogICAgICAgICAjIGltcGxlbWVudGF0aW9uIG9mIGlzX211bHRpcGFydCBhc3N1bWVzIHRoYXQgX3BheWxvYWQgaXMgYSBsaXN0IGZvcgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL21pbWUvdGV4dC5weSBiL0xpYi9lbWFpbC9taW1lL3RleHQucHkKaW5kZXggZGEwMzA4Ni4uMzViNDQyMyAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL21pbWUvdGV4dC5weQorKysgYi9MaWIvZW1haWwvbWltZS90ZXh0LnB5CkBAIC0xNCw3ICsxNCw3IEBACiBjbGFzcyBNSU1FVGV4dChNSU1FTm9uTXVsdGlwYXJ0KToKICAgICAiIiJDbGFzcyBmb3IgZ2VuZXJhdGluZyB0ZXh0LyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfdGV4dCwgX3N1YnR5cGU9J3BsYWluJywgX2NoYXJzZXQ9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF90ZXh0LCBfc3VidHlwZT0ncGxhaW4nLCBfY2hhcnNldD1Ob25lLCAqLCBwb2xpY3k9Tm9uZSk6CiAgICAgICAgICIiIkNyZWF0ZSBhIHRleHQvKiB0eXBlIE1JTUUgZG9jdW1lbnQuCiAKICAgICAgICAgX3RleHQgaXMgdGhlIHN0cmluZyBmb3IgdGhpcyBtZXNzYWdlIG9iamVjdC4KQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgICAgICAgX2NoYXJzZXQgPSAndXRmLTgnCiAKLSAgICAgICAgTUlNRU5vbk11bHRpcGFydC5fX2luaXRfXyhzZWxmLCAndGV4dCcsIF9zdWJ0eXBlLAorICAgICAgICBNSU1FTm9uTXVsdGlwYXJ0Ll9faW5pdF9fKHNlbGYsICd0ZXh0JywgX3N1YnR5cGUsIHBvbGljeT1wb2xpY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKip7J2NoYXJzZXQnOiBzdHIoX2NoYXJzZXQpfSkKIAogICAgICAgICBzZWxmLnNldF9wYXlsb2FkKF90ZXh0LCBfY2hhcnNldCkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvX19pbml0X18ucHkgYi9MaWIvZW5jb2RpbmdzL19faW5pdF9fLnB5CmluZGV4IDhkZDcxMzAuLmFhMmZiN2MgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvX19pbml0X18ucHkKKysrIGIvTGliL2VuY29kaW5ncy9fX2luaXRfXy5weQpAQCAtMjksNiArMjksNyBAQAogIiIiIyIKIAogaW1wb3J0IGNvZGVjcworaW1wb3J0IHN5cwogZnJvbSAuIGltcG9ydCBhbGlhc2VzCiAKIF9jYWNoZSA9IHt9CkBAIC01NCw2ICs1NSw3IEBACiAgICAgIiIiCiAgICAgaWYgaXNpbnN0YW5jZShlbmNvZGluZywgYnl0ZXMpOgogICAgICAgICBlbmNvZGluZyA9IHN0cihlbmNvZGluZywgImFzY2lpIikKKwogICAgIGNoYXJzID0gW10KICAgICBwdW5jdCA9IEZhbHNlCiAgICAgZm9yIGMgaW4gZW5jb2Rpbmc6CkBAIC05Nyw2ICs5OSw4IEBACiAgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKCdlbmNvZGluZ3MuJyArIG1vZG5hbWUsIGZyb21saXN0PV9pbXBvcnRfdGFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9MCkKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgIyBJbXBvcnRFcnJvciBtYXkgb2NjdXIgYmVjYXVzZSAnZW5jb2RpbmdzLihtb2RuYW1lKScgZG9lcyBub3QgZXhpc3QsCisgICAgICAgICAgICAjIG9yIGJlY2F1c2UgaXQgaW1wb3J0cyBhIG5hbWUgdGhhdCBkb2VzIG5vdCBleGlzdCAoc2VlIG1iY3MgYW5kIG9lbSkKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGJyZWFrCkBAIC0xNTAsMyArMTU0LDE2IEBACiAKICMgUmVnaXN0ZXIgdGhlIHNlYXJjaF9mdW5jdGlvbiBpbiB0aGUgUHl0aG9uIGNvZGVjIHJlZ2lzdHJ5CiBjb2RlY3MucmVnaXN0ZXIoc2VhcmNoX2Z1bmN0aW9uKQorCitpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICBkZWYgX2FsaWFzX21iY3MoZW5jb2RpbmcpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgX2Jvb3Rsb2NhbGUKKyAgICAgICAgICAgIGlmIGVuY29kaW5nID09IF9ib290bG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKEZhbHNlKToKKyAgICAgICAgICAgICAgICBpbXBvcnQgZW5jb2RpbmdzLm1iY3MKKyAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RpbmdzLm1iY3MuZ2V0cmVnZW50cnkoKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAjIEltcG9ydHMgbWF5IGZhaWwgd2hpbGUgd2UgYXJlIHNodXR0aW5nIGRvd24KKyAgICAgICAgICAgIHBhc3MKKworICAgIGNvZGVjcy5yZWdpc3RlcihfYWxpYXNfbWJjcykKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvYWxpYXNlcy5weSBiL0xpYi9lbmNvZGluZ3MvYWxpYXNlcy5weQppbmRleCA2N2M4MjhkLi4yZTYzYzJmIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2FsaWFzZXMucHkKKysrIGIvTGliL2VuY29kaW5ncy9hbGlhc2VzLnB5CkBAIC00NTgsNiArNDU4LDcgQEAKICAgICAnbWFjdHVya2lzaCcgICAgICAgICA6ICdtYWNfdHVya2lzaCcsCiAKICAgICAjIG1iY3MgY29kZWMKKyAgICAnYW5zaScgICAgICAgICAgICAgICA6ICdtYmNzJywKICAgICAnZGJjcycgICAgICAgICAgICAgICA6ICdtYmNzJywKIAogICAgICMgcHRjcDE1NCBjb2RlYwpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9vZW0ucHkgYi9MaWIvZW5jb2RpbmdzL29lbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzM0MjZiCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VuY29kaW5ncy9vZW0ucHkKQEAgLTAsMCArMSw0MSBAQAorIiIiIFB5dGhvbiAnb2VtJyBDb2RlYyBmb3IgV2luZG93cworCisiIiIKKyMgSW1wb3J0IHRoZW0gZXhwbGljaXRseSB0byBjYXVzZSBhbiBJbXBvcnRFcnJvcgorIyBvbiBub24tV2luZG93cyBzeXN0ZW1zCitmcm9tIGNvZGVjcyBpbXBvcnQgb2VtX2VuY29kZSwgb2VtX2RlY29kZQorIyBmb3IgSW5jcmVtZW50YWxEZWNvZGVyLCBJbmNyZW1lbnRhbEVuY29kZXIsIC4uLgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitlbmNvZGUgPSBvZW1fZW5jb2RlCisKK2RlZiBkZWNvZGUoaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgcmV0dXJuIG9lbV9kZWNvZGUoaW5wdXQsIGVycm9ycywgVHJ1ZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIG9lbV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBfYnVmZmVyX2RlY29kZSA9IG9lbV9kZWNvZGUKKworY2xhc3MgU3RyZWFtV3JpdGVyKGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGVuY29kZSA9IG9lbV9lbmNvZGUKKworY2xhc3MgU3RyZWFtUmVhZGVyKGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGRlY29kZSA9IG9lbV9kZWNvZGUKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdvZW0nLAorICAgICAgICBlbmNvZGU9ZW5jb2RlLAorICAgICAgICBkZWNvZGU9ZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbnVtLnB5IGIvTGliL2VudW0ucHkKaW5kZXggYjg3ODdkMS4uNmExODk5OSAxMDA2NDQKLS0tIGEvTGliL2VudW0ucHkKKysrIGIvTGliL2VudW0ucHkKQEAgLTEsOCArMSwxNiBAQAogaW1wb3J0IHN5cwotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKIGZyb20gdHlwZXMgaW1wb3J0IE1hcHBpbmdQcm94eVR5cGUsIER5bmFtaWNDbGFzc0F0dHJpYnV0ZQorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQorZnJvbSBvcGVyYXRvciBpbXBvcnQgb3JfIGFzIF9vcl8KIAotX19hbGxfXyA9IFsnRW51bScsICdJbnRFbnVtJywgJ3VuaXF1ZSddCisjIHRyeSBfY29sbGVjdGlvbnMgZmlyc3QgdG8gcmVkdWNlIHN0YXJ0dXAgY29zdAordHJ5OgorICAgIGZyb20gX2NvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CisKKworX19hbGxfXyA9IFsnRW51bU1ldGEnLCAnRW51bScsICdJbnRFbnVtJywgJ0ZsYWcnLCAnSW50RmxhZycsICd1bmlxdWUnXQogCiAKIGRlZiBfaXNfZGVzY3JpcHRvcihvYmopOgpAQCAtNTgsMTYgKzY2LDIxIEBACiAKICAgICAgICAgIiIiCiAgICAgICAgIGlmIF9pc19zdW5kZXIoa2V5KToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ19uYW1lc18gYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgRW51bSB1c2UnKQorICAgICAgICAgICAgaWYga2V5IG5vdCBpbiAoCisgICAgICAgICAgICAgICAgICAgICdfb3JkZXJfJywgJ19jcmVhdGVfcHNldWRvX21lbWJlcl8nLCAnX2RlY29tcG9zZV8nLAorICAgICAgICAgICAgICAgICAgICAnX2dlbmVyYXRlX25leHRfdmFsdWVfJywgJ19taXNzaW5nXycsCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignX25hbWVzXyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBFbnVtIHVzZScpCiAgICAgICAgIGVsaWYgX2lzX2R1bmRlcihrZXkpOgotICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYga2V5ID09ICdfX29yZGVyX18nOgorICAgICAgICAgICAgICAgIGtleSA9ICdfb3JkZXJfJwogICAgICAgICBlbGlmIGtleSBpbiBzZWxmLl9tZW1iZXJfbmFtZXM6CiAgICAgICAgICAgICAjIGRlc2NyaXB0b3Igb3ZlcndyaXRpbmcgYW4gZW51bT8KICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQXR0ZW1wdGVkIHRvIHJldXNlIGtleTogJXInICUga2V5KQogICAgICAgICBlbGlmIG5vdCBfaXNfZGVzY3JpcHRvcih2YWx1ZSk6CiAgICAgICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgICAgICAjIGVudW0gb3ZlcndyaXRpbmcgYSBkZXNjcmlwdG9yPwotICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignS2V5IGFscmVhZHkgZGVmaW5lZCBhczogJXInICUgc2VsZltrZXldKQorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXIgYWxyZWFkeSBkZWZpbmVkIGFzOiAlcicgJSAoa2V5LCBzZWxmW2tleV0pKQogICAgICAgICAgICAgc2VsZi5fbWVtYmVyX25hbWVzLmFwcGVuZChrZXkpCiAgICAgICAgIHN1cGVyKCkuX19zZXRpdGVtX18oa2V5LCB2YWx1ZSkKIApAQCAtODMsNyArOTYsMTMgQEAKICAgICAiIiJNZXRhY2xhc3MgZm9yIEVudW0iIiIKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgX19wcmVwYXJlX18obWV0YWNscywgY2xzLCBiYXNlcyk6Ci0gICAgICAgIHJldHVybiBfRW51bURpY3QoKQorICAgICAgICAjIGNyZWF0ZSB0aGUgbmFtZXNwYWNlIGRpY3QKKyAgICAgICAgZW51bV9kaWN0ID0gX0VudW1EaWN0KCkKKyAgICAgICAgIyBpbmhlcml0IHByZXZpb3VzIGZsYWdzIGFuZCBfZ2VuZXJhdGVfbmV4dF92YWx1ZV8gZnVuY3Rpb24KKyAgICAgICAgbWVtYmVyX3R5cGUsIGZpcnN0X2VudW0gPSBtZXRhY2xzLl9nZXRfbWl4aW5zXyhiYXNlcykKKyAgICAgICAgaWYgZmlyc3RfZW51bSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVudW1fZGljdFsnX2dlbmVyYXRlX25leHRfdmFsdWVfJ10gPSBnZXRhdHRyKGZpcnN0X2VudW0sICdfZ2VuZXJhdGVfbmV4dF92YWx1ZV8nLCBOb25lKQorICAgICAgICByZXR1cm4gZW51bV9kaWN0CiAKICAgICBkZWYgX19uZXdfXyhtZXRhY2xzLCBjbHMsIGJhc2VzLCBjbGFzc2RpY3QpOgogICAgICAgICAjIGFuIEVudW0gY2xhc3MgaXMgZmluYWwgb25jZSBlbnVtZXJhdGlvbiBpdGVtcyBoYXZlIGJlZW4gZGVmaW5lZDsgaXQKQEAgLTk2LDEyICsxMTUsMTUgQEAKIAogICAgICAgICAjIHNhdmUgZW51bSBpdGVtcyBpbnRvIHNlcGFyYXRlIG1hcHBpbmcgc28gdGhleSBkb24ndCBnZXQgYmFrZWQgaW50bwogICAgICAgICAjIHRoZSBuZXcgY2xhc3MKLSAgICAgICAgbWVtYmVycyA9IHtrOiBjbGFzc2RpY3Rba10gZm9yIGsgaW4gY2xhc3NkaWN0Ll9tZW1iZXJfbmFtZXN9CisgICAgICAgIGVudW1fbWVtYmVycyA9IHtrOiBjbGFzc2RpY3Rba10gZm9yIGsgaW4gY2xhc3NkaWN0Ll9tZW1iZXJfbmFtZXN9CiAgICAgICAgIGZvciBuYW1lIGluIGNsYXNzZGljdC5fbWVtYmVyX25hbWVzOgogICAgICAgICAgICAgZGVsIGNsYXNzZGljdFtuYW1lXQogCisgICAgICAgICMgYWRqdXN0IHRoZSBzdW5kZXJzCisgICAgICAgIF9vcmRlcl8gPSBjbGFzc2RpY3QucG9wKCdfb3JkZXJfJywgTm9uZSkKKwogICAgICAgICAjIGNoZWNrIGZvciBpbGxlZ2FsIGVudW0gbmFtZXMgKGFueSBvdGhlcnM/KQotICAgICAgICBpbnZhbGlkX25hbWVzID0gc2V0KG1lbWJlcnMpICYgeydtcm8nLCB9CisgICAgICAgIGludmFsaWRfbmFtZXMgPSBzZXQoZW51bV9tZW1iZXJzKSAmIHsnbXJvJywgfQogICAgICAgICBpZiBpbnZhbGlkX25hbWVzOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCBlbnVtIG1lbWJlciBuYW1lOiB7MH0nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAnLCcuam9pbihpbnZhbGlkX25hbWVzKSkpCkBAIC0xNDUsNyArMTY3LDcgQEAKICAgICAgICAgIyBhIGN1c3RvbSBfX25ld19fIGlzIGRvaW5nIHNvbWV0aGluZyBmdW5reSB3aXRoIHRoZSB2YWx1ZXMgLS0gc3VjaCBhcwogICAgICAgICAjIGF1dG8tbnVtYmVyaW5nIDspCiAgICAgICAgIGZvciBtZW1iZXJfbmFtZSBpbiBjbGFzc2RpY3QuX21lbWJlcl9uYW1lczoKLSAgICAgICAgICAgIHZhbHVlID0gbWVtYmVyc1ttZW1iZXJfbmFtZV0KKyAgICAgICAgICAgIHZhbHVlID0gZW51bV9tZW1iZXJzW21lbWJlcl9uYW1lXQogICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKICAgICAgICAgICAgICAgICBhcmdzID0gKHZhbHVlLCApCiAgICAgICAgICAgICBlbHNlOgpAQCAtMTU5LDcgKzE4MSwxMCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBlbnVtX21lbWJlciA9IF9fbmV3X18oZW51bV9jbGFzcywgKmFyZ3MpCiAgICAgICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoZW51bV9tZW1iZXIsICdfdmFsdWVfJyk6Ci0gICAgICAgICAgICAgICAgICAgIGVudW1fbWVtYmVyLl92YWx1ZV8gPSBtZW1iZXJfdHlwZSgqYXJncykKKyAgICAgICAgICAgICAgICAgICAgaWYgbWVtYmVyX3R5cGUgaXMgb2JqZWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgZW51bV9tZW1iZXIuX3ZhbHVlXyA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX21lbWJlci5fdmFsdWVfID0gbWVtYmVyX3R5cGUoKmFyZ3MpCiAgICAgICAgICAgICB2YWx1ZSA9IGVudW1fbWVtYmVyLl92YWx1ZV8KICAgICAgICAgICAgIGVudW1fbWVtYmVyLl9uYW1lXyA9IG1lbWJlcl9uYW1lCiAgICAgICAgICAgICBlbnVtX21lbWJlci5fX29iamNsYXNzX18gPSBlbnVtX2NsYXNzCkBAIC0yMDQsNiArMjI5LDE0IEBACiAgICAgICAgICAgICBpZiBzYXZlX25ldzoKICAgICAgICAgICAgICAgICBlbnVtX2NsYXNzLl9fbmV3X21lbWJlcl9fID0gX19uZXdfXwogICAgICAgICAgICAgZW51bV9jbGFzcy5fX25ld19fID0gRW51bS5fX25ld19fCisKKyAgICAgICAgIyBweTMgc3VwcG9ydCBmb3IgZGVmaW5pdGlvbiBvcmRlciAoaGVscHMga2VlcCBweTIvcHkzIGNvZGUgaW4gc3luYykKKyAgICAgICAgaWYgX29yZGVyXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoX29yZGVyXywgc3RyKToKKyAgICAgICAgICAgICAgICBfb3JkZXJfID0gX29yZGVyXy5yZXBsYWNlKCcsJywgJyAnKS5zcGxpdCgpCisgICAgICAgICAgICBpZiBfb3JkZXJfICE9IGVudW1fY2xhc3MuX21lbWJlcl9uYW1lc186CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtZW1iZXIgb3JkZXIgZG9lcyBub3QgbWF0Y2ggX29yZGVyXycpCisKICAgICAgICAgcmV0dXJuIGVudW1fY2xhc3MKIAogICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKQEAgLTMyNSwxMyArMzU4LDE4IEBACiAgICAgICAgICIiIgogICAgICAgICBtZXRhY2xzID0gY2xzLl9fY2xhc3NfXwogICAgICAgICBiYXNlcyA9IChjbHMsICkgaWYgdHlwZSBpcyBOb25lIGVsc2UgKHR5cGUsIGNscykKKyAgICAgICAgXywgZmlyc3RfZW51bSA9IGNscy5fZ2V0X21peGluc18oYmFzZXMpCiAgICAgICAgIGNsYXNzZGljdCA9IG1ldGFjbHMuX19wcmVwYXJlX18oY2xhc3NfbmFtZSwgYmFzZXMpCiAKICAgICAgICAgIyBzcGVjaWFsIHByb2Nlc3NpbmcgbmVlZGVkIGZvciBuYW1lcz8KICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lcywgc3RyKToKICAgICAgICAgICAgIG5hbWVzID0gbmFtZXMucmVwbGFjZSgnLCcsICcgJykuc3BsaXQoKQogICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWVzLCAodHVwbGUsIGxpc3QpKSBhbmQgaXNpbnN0YW5jZShuYW1lc1swXSwgc3RyKToKLSAgICAgICAgICAgIG5hbWVzID0gWyhlLCBpKSBmb3IgKGksIGUpIGluIGVudW1lcmF0ZShuYW1lcywgc3RhcnQpXQorICAgICAgICAgICAgb3JpZ2luYWxfbmFtZXMsIG5hbWVzID0gbmFtZXMsIFtdCisgICAgICAgICAgICBsYXN0X3ZhbHVlID0gTm9uZQorICAgICAgICAgICAgZm9yIGNvdW50LCBuYW1lIGluIGVudW1lcmF0ZShvcmlnaW5hbF9uYW1lcyk6CisgICAgICAgICAgICAgICAgbGFzdF92YWx1ZSA9IGZpcnN0X2VudW0uX2dlbmVyYXRlX25leHRfdmFsdWVfKG5hbWUsIHN0YXJ0LCBjb3VudCwgbGFzdF92YWx1ZSkKKyAgICAgICAgICAgICAgICBuYW1lcy5hcHBlbmQoKG5hbWUsIGxhc3RfdmFsdWUpKQogCiAgICAgICAgICMgSGVyZSwgbmFtZXMgaXMgZWl0aGVyIGFuIGl0ZXJhYmxlIG9mIChuYW1lLCB2YWx1ZSkgb3IgYSBtYXBwaW5nLgogICAgICAgICBmb3IgaXRlbSBpbiBuYW1lczoKQEAgLTQ3Myw2ICs1MTEsMTYgQEAKICAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gY2xzLl9tZW1iZXJfbWFwXy52YWx1ZXMoKToKICAgICAgICAgICAgICAgICBpZiBtZW1iZXIuX3ZhbHVlXyA9PSB2YWx1ZToKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlcgorICAgICAgICAjIHN0aWxsIG5vdCBmb3VuZCAtLSB0cnkgX21pc3NpbmdfIGhvb2sKKyAgICAgICAgcmV0dXJuIGNscy5fbWlzc2luZ18odmFsdWUpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9nZW5lcmF0ZV9uZXh0X3ZhbHVlXyhuYW1lLCBzdGFydCwgY291bnQsIGxhc3RfdmFsdWUpOgorICAgICAgICBpZiBub3QgY291bnQ6CisgICAgICAgICAgICByZXR1cm4gc3RhcnQKKyAgICAgICAgcmV0dXJuIGxhc3RfdmFsdWUgKyAxCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9taXNzaW5nXyhjbHMsIHZhbHVlKToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJXIgaXMgbm90IGEgdmFsaWQgJXMiICUgKHZhbHVlLCBjbHMuX19uYW1lX18pKQogCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgpAQCAtNTQ0LDggKzU5MiwxNCBAQAogICAgICAgICAgICAgc291cmNlID0gdmFycyhzb3VyY2UpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzb3VyY2UgPSBtb2R1bGVfZ2xvYmFscwotICAgICAgICBtZW1iZXJzID0ge25hbWU6IHZhbHVlIGZvciBuYW1lLCB2YWx1ZSBpbiBzb3VyY2UuaXRlbXMoKQotICAgICAgICAgICAgICAgIGlmIGZpbHRlcihuYW1lKX0KKyAgICAgICAgIyBXZSB1c2UgYW4gT3JkZXJlZERpY3Qgb2Ygc29ydGVkIHNvdXJjZSBrZXlzIHNvIHRoYXQgdGhlCisgICAgICAgICMgX3ZhbHVlMm1lbWJlcl9tYXAgaXMgcG9wdWxhdGVkIGluIHRoZSBzYW1lIG9yZGVyIGV2ZXJ5IHRpbWUKKyAgICAgICAgIyBmb3IgYSBjb25zaXN0ZW50IHJldmVyc2UgbWFwcGluZyBvZiBudW1iZXIgdG8gbmFtZSB3aGVuIHRoZXJlCisgICAgICAgICMgYXJlIG11bHRpcGxlIG5hbWVzIGZvciB0aGUgc2FtZSBudW1iZXIgcmF0aGVyIHRoYW4gdmFyeWluZworICAgICAgICAjIGJldHdlZW4gcnVucyBkdWUgdG8gaGFzaCByYW5kb21pemF0aW9uIG9mIHRoZSBtb2R1bGUgZGljdGlvbmFyeS4KKyAgICAgICAgbWVtYmVycyA9IE9yZGVyZWREaWN0KChuYW1lLCBzb3VyY2VbbmFtZV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBzb3J0ZWQoc291cmNlLmtleXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpbHRlcihuYW1lKSkKICAgICAgICAgY2xzID0gY2xzKG5hbWUsIG1lbWJlcnMsIG1vZHVsZT1tb2R1bGUpCiAgICAgICAgIGNscy5fX3JlZHVjZV9leF9fID0gX3JlZHVjZV9leF9ieV9uYW1lCiAgICAgICAgIG1vZHVsZV9nbG9iYWxzLnVwZGF0ZShjbHMuX19tZW1iZXJzX18pCkBAIC01NjAsNiArNjE0LDE3OSBAQAogZGVmIF9yZWR1Y2VfZXhfYnlfbmFtZShzZWxmLCBwcm90byk6CiAgICAgcmV0dXJuIHNlbGYubmFtZQogCitjbGFzcyBGbGFnKEVudW0pOgorICAgICIiIlN1cHBvcnQgZm9yIGZsYWdzIiIiCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfZ2VuZXJhdGVfbmV4dF92YWx1ZV8obmFtZSwgc3RhcnQsIGNvdW50LCBsYXN0X3ZhbHVlKToKKyAgICAgICAgIiIiCisgICAgICAgIEdlbmVyYXRlIHRoZSBuZXh0IHZhbHVlIHdoZW4gbm90IGdpdmVuLgorCisgICAgICAgIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIKKyAgICAgICAgc3RhcnQ6IHRoZSBpbml0aXRhbCBzdGFydCB2YWx1ZSBvciBOb25lCisgICAgICAgIGNvdW50OiB0aGUgbnVtYmVyIG9mIGV4aXN0aW5nIG1lbWJlcnMKKyAgICAgICAgbGFzdF92YWx1ZTogdGhlIGxhc3QgdmFsdWUgYXNzaWduZWQgb3IgTm9uZQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGNvdW50OgorICAgICAgICAgICAgcmV0dXJuIHN0YXJ0IGlmIHN0YXJ0IGlzIG5vdCBOb25lIGVsc2UgMQorICAgICAgICBoaWdoX2JpdCA9IF9oaWdoX2JpdChsYXN0X3ZhbHVlKQorICAgICAgICByZXR1cm4gMiAqKiAoaGlnaF9iaXQrMSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfbWlzc2luZ18oY2xzLCB2YWx1ZSk6CisgICAgICAgIG9yaWdpbmFsX3ZhbHVlID0gdmFsdWUKKyAgICAgICAgaWYgdmFsdWUgPCAwOgorICAgICAgICAgICAgdmFsdWUgPSB+dmFsdWUKKyAgICAgICAgcG9zc2libGVfbWVtYmVyID0gY2xzLl9jcmVhdGVfcHNldWRvX21lbWJlcl8odmFsdWUpCisgICAgICAgIGZvciBtZW1iZXIgaW4gcG9zc2libGVfbWVtYmVyLl9kZWNvbXBvc2VfKCk6CisgICAgICAgICAgICBpZiBtZW1iZXIuX25hbWVfIGlzIE5vbmUgYW5kIG1lbWJlci5fdmFsdWVfICE9IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXIgaXMgbm90IGEgdmFsaWQgJXMnICUgKG9yaWdpbmFsX3ZhbHVlLCBjbHMuX19uYW1lX18pKQorICAgICAgICBpZiBvcmlnaW5hbF92YWx1ZSA8IDA6CisgICAgICAgICAgICBwb3NzaWJsZV9tZW1iZXIgPSB+cG9zc2libGVfbWVtYmVyCisgICAgICAgIHJldHVybiBwb3NzaWJsZV9tZW1iZXIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfY3JlYXRlX3BzZXVkb19tZW1iZXJfKGNscywgdmFsdWUpOgorICAgICAgICBwc2V1ZG9fbWVtYmVyID0gY2xzLl92YWx1ZTJtZW1iZXJfbWFwXy5nZXQodmFsdWUsIE5vbmUpCisgICAgICAgIGlmIHBzZXVkb19tZW1iZXIgaXMgTm9uZToKKyAgICAgICAgICAgICMgY29uc3RydWN0IGEgbm9uLXNpbmdsZXRvbiBlbnVtIHBzZXVkby1tZW1iZXIKKyAgICAgICAgICAgIHBzZXVkb19tZW1iZXIgPSBvYmplY3QuX19uZXdfXyhjbHMpCisgICAgICAgICAgICBwc2V1ZG9fbWVtYmVyLl9uYW1lXyA9IE5vbmUKKyAgICAgICAgICAgIHBzZXVkb19tZW1iZXIuX3ZhbHVlXyA9IHZhbHVlCisgICAgICAgICAgICBjbHMuX3ZhbHVlMm1lbWJlcl9tYXBfW3ZhbHVlXSA9IHBzZXVkb19tZW1iZXIKKyAgICAgICAgcmV0dXJuIHBzZXVkb19tZW1iZXIKKworICAgIGRlZiBfZGVjb21wb3NlXyhzZWxmKToKKyAgICAgICAgIiIiRXh0cmFjdCBhbGwgbWVtYmVycyBmcm9tIHRoZSB2YWx1ZS4iIiIKKyAgICAgICAgdmFsdWUgPSBzZWxmLl92YWx1ZV8KKyAgICAgICAgbWVtYmVycyA9IFtdCisgICAgICAgIGNscyA9IHNlbGYuX19jbGFzc19fCisgICAgICAgIGZvciBtZW1iZXIgaW4gc29ydGVkKGNscywga2V5PWxhbWJkYSBtOiBtLl92YWx1ZV8sIHJldmVyc2U9VHJ1ZSk6CisgICAgICAgICAgICB3aGlsZSBfaGlnaF9iaXQodmFsdWUpID4gX2hpZ2hfYml0KG1lbWJlci5fdmFsdWVfKToKKyAgICAgICAgICAgICAgICB1bmtub3duID0gc2VsZi5fY3JlYXRlX3BzZXVkb19tZW1iZXJfKDIgKiogX2hpZ2hfYml0KHZhbHVlKSkKKyAgICAgICAgICAgICAgICBtZW1iZXJzLmFwcGVuZCh1bmtub3duKQorICAgICAgICAgICAgICAgIHZhbHVlICY9IH51bmtub3duLl92YWx1ZV8KKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgKHZhbHVlICYgbWVtYmVyLl92YWx1ZV8gPT0gbWVtYmVyLl92YWx1ZV8pCisgICAgICAgICAgICAgICAgICAgIGFuZCAobWVtYmVyLl92YWx1ZV8gb3Igbm90IG1lbWJlcnMpCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgdmFsdWUgJj0gfm1lbWJlci5fdmFsdWVfCisgICAgICAgICAgICAgICAgbWVtYmVycy5hcHBlbmQobWVtYmVyKQorICAgICAgICBpZiBub3QgbWVtYmVycyBvciB2YWx1ZToKKyAgICAgICAgICAgIG1lbWJlcnMuYXBwZW5kKHNlbGYuX2NyZWF0ZV9wc2V1ZG9fbWVtYmVyXyh2YWx1ZSkpCisgICAgICAgIG1lbWJlcnMgPSBsaXN0KG1lbWJlcnMpCisgICAgICAgIHJldHVybiBtZW1iZXJzCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gb3RoZXIuX3ZhbHVlXyAmIHNlbGYuX3ZhbHVlXyA9PSBvdGhlci5fdmFsdWVfCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYudmFsdWUgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBpdGVyKFtdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fZGVjb21wb3NlXygpKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBjbHMgPSBzZWxmLl9fY2xhc3NfXworICAgICAgICBpZiBzZWxmLl9uYW1lXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnPCVzLiVzOiAlcj4nICUgKGNscy5fX25hbWVfXywgc2VsZi5fbmFtZV8sIHNlbGYuX3ZhbHVlXykKKyAgICAgICAgbWVtYmVycyA9IHNlbGYuX2RlY29tcG9zZV8oKQorICAgICAgICByZXR1cm4gJzwlcy4lczogJXI+JyAlICgKKyAgICAgICAgICAgICAgICBjbHMuX19uYW1lX18sCisgICAgICAgICAgICAgICAgJ3wnLmpvaW4oW3N0cihtLl9uYW1lXyBvciBtLl92YWx1ZV8pIGZvciBtIGluIG1lbWJlcnNdKSwKKyAgICAgICAgICAgICAgICBzZWxmLl92YWx1ZV8sCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGNscyA9IHNlbGYuX19jbGFzc19fCisgICAgICAgIGlmIHNlbGYuX25hbWVfIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuICclcy4lcycgJSAoY2xzLl9fbmFtZV9fLCBzZWxmLl9uYW1lXykKKyAgICAgICAgbWVtYmVycyA9IHNlbGYuX2RlY29tcG9zZV8oKQorICAgICAgICBpZiBsZW4obWVtYmVycykgPT0gMSBhbmQgbWVtYmVyc1swXS5fbmFtZV8gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnJXMuJXInICUgKGNscy5fX25hbWVfXywgbWVtYmVyc1swXS5fdmFsdWVfKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICclcy4lcycgJSAoCisgICAgICAgICAgICAgICAgICAgIGNscy5fX25hbWVfXywKKyAgICAgICAgICAgICAgICAgICAgJ3wnLmpvaW4oW3N0cihtLl9uYW1lXyBvciBtLl92YWx1ZV8pIGZvciBtIGluIG1lbWJlcnNdKSwKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIF9fYm9vbF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92YWx1ZV8pCisKKyAgICBkZWYgX19vcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fdmFsdWVfIHwgb3RoZXIuX3ZhbHVlXykKKworICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fdmFsdWVfICYgb3RoZXIuX3ZhbHVlXykKKworICAgIGRlZiBfX3hvcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fdmFsdWVfIF4gb3RoZXIuX3ZhbHVlXykKKworICAgIGRlZiBfX2ludmVydF9fKHNlbGYpOgorICAgICAgICBtZW1iZXJzID0gc2VsZi5fZGVjb21wb3NlXygpCisgICAgICAgIGludmVydGVkX21lbWJlcnMgPSBbbSBmb3IgbSBpbiBzZWxmLl9fY2xhc3NfXyBpZiBtIG5vdCBpbiBtZW1iZXJzIGFuZCBub3QgbS5fdmFsdWVfICYgc2VsZi5fdmFsdWVfXQorICAgICAgICBpbnZlcnRlZCA9IHJlZHVjZShfb3JfLCBpbnZlcnRlZF9tZW1iZXJzLCBzZWxmLl9fY2xhc3NfXygwKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKGludmVydGVkKQorCisKK2NsYXNzIEludEZsYWcoaW50LCBGbGFnKToKKyAgICAiIiJTdXBwb3J0IGZvciBpbnRlZ2VyLWJhc2VkIEZsYWdzIiIiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2NyZWF0ZV9wc2V1ZG9fbWVtYmVyXyhjbHMsIHZhbHVlKToKKyAgICAgICAgcHNldWRvX21lbWJlciA9IGNscy5fdmFsdWUybWVtYmVyX21hcF8uZ2V0KHZhbHVlLCBOb25lKQorICAgICAgICBpZiBwc2V1ZG9fbWVtYmVyIGlzIE5vbmU6CisgICAgICAgICAgICAjIGNvbnN0cnVjdCBhIG5vbi1zaW5nbGV0b24gZW51bSBwc2V1ZG8tbWVtYmVyCisgICAgICAgICAgICBwc2V1ZG9fbWVtYmVyID0gaW50Ll9fbmV3X18oY2xzLCB2YWx1ZSkKKyAgICAgICAgICAgIHBzZXVkb19tZW1iZXIuX25hbWVfID0gTm9uZQorICAgICAgICAgICAgcHNldWRvX21lbWJlci5fdmFsdWVfID0gdmFsdWUKKyAgICAgICAgICAgIGNscy5fdmFsdWUybWVtYmVyX21hcF9bdmFsdWVdID0gcHNldWRvX21lbWJlcgorICAgICAgICByZXR1cm4gcHNldWRvX21lbWJlcgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9taXNzaW5nXyhjbHMsIHZhbHVlKToKKyAgICAgICAgcG9zc2libGVfbWVtYmVyID0gY2xzLl9jcmVhdGVfcHNldWRvX21lbWJlcl8odmFsdWUpCisgICAgICAgIHJldHVybiBwb3NzaWJsZV9tZW1iZXIKKworICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgKHNlbGYuX19jbGFzc19fLCBpbnQpKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fdmFsdWVfIHwgc2VsZi5fX2NsYXNzX18ob3RoZXIpLl92YWx1ZV8pCisKKyAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCAoc2VsZi5fX2NsYXNzX18sIGludCkpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLl92YWx1ZV8gJiBzZWxmLl9fY2xhc3NfXyhvdGhlcikuX3ZhbHVlXykKKworICAgIGRlZiBfX3hvcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIChzZWxmLl9fY2xhc3NfXywgaW50KSk6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuX3ZhbHVlXyBeIHNlbGYuX19jbGFzc19fKG90aGVyKS5fdmFsdWVfKQorCisgICAgX19yb3JfXyA9IF9fb3JfXworICAgIF9fcmFuZF9fID0gX19hbmRfXworICAgIF9fcnhvcl9fID0gX194b3JfXworCisgICAgZGVmIF9faW52ZXJ0X18oc2VsZik6CisgICAgICAgICMgbWVtYmVycyA9IHNlbGYuX2RlY29tcG9zZV8oKQorICAgICAgICAjIGludmVydGVkX21lbWJlcnMgPSBbbSBmb3IgbSBpbiBzZWxmLl9fY2xhc3NfXyBpZiBtIG5vdCBpbiBtZW1iZXJzIGFuZCBub3QgbS5fdmFsdWVfICYgc2VsZi5fdmFsdWVfXQorICAgICAgICAjIGludmVydGVkID0gcmVkdWNlKF9vcl8sIGludmVydGVkX21lbWJlcnMsIHNlbGYuX19jbGFzc19fKDApKQorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18ofnNlbGYuX3ZhbHVlXykKKworCisKKworZGVmIF9oaWdoX2JpdCh2YWx1ZSk6CisgICAgIiIicmV0dXJucyBpbmRleCBvZiBoaWdoZXN0IGJpdCwgb3IgLTEgaWYgdmFsdWUgaXMgemVybyBvciBuZWdhdGl2ZSIiIgorICAgIHJldHVybiB2YWx1ZS5iaXRfbGVuZ3RoKCkgLSAxIGlmIHZhbHVlID4gMCBlbHNlIC0xCisKIGRlZiB1bmlxdWUoZW51bWVyYXRpb24pOgogICAgICIiIkNsYXNzIGRlY29yYXRvciBmb3IgZW51bWVyYXRpb25zIGVuc3VyaW5nIHVuaXF1ZSBtZW1iZXIgdmFsdWVzLiIiIgogICAgIGR1cGxpY2F0ZXMgPSBbXQpkaWZmIC0tZ2l0IGEvTGliL2ZpbGVpbnB1dC5weSBiL0xpYi9maWxlaW5wdXQucHkKaW5kZXggZDJiNTIwNi4uNzIxZmU5YyAxMDA2NDQKLS0tIGEvTGliL2ZpbGVpbnB1dC5weQorKysgYi9MaWIvZmlsZWlucHV0LnB5CkBAIC03NSwxMyArNzUsMTEgQEAKIGltcG9ydCBzeXMsIG9zCiAKIF9fYWxsX18gPSBbImlucHV0IiwgImNsb3NlIiwgIm5leHRmaWxlIiwgImZpbGVuYW1lIiwgImxpbmVubyIsICJmaWxlbGluZW5vIiwKLSAgICAgICAgICAgImlzZmlyc3RsaW5lIiwgImlzc3RkaW4iLCAiRmlsZUlucHV0Il0KKyAgICAgICAgICAgImZpbGVubyIsICJpc2ZpcnN0bGluZSIsICJpc3N0ZGluIiwgIkZpbGVJbnB1dCIsICJob29rX2NvbXByZXNzZWQiLAorICAgICAgICAgICAiaG9va19lbmNvZGVkIl0KIAogX3N0YXRlID0gTm9uZQogCi0jIE5vIGxvbmdlciB1c2VkCi1ERUZBVUxUX0JVRlNJWkUgPSA4KjEwMjQKLQogZGVmIGlucHV0KGZpbGVzPU5vbmUsIGlucGxhY2U9RmFsc2UsIGJhY2t1cD0iIiwgYnVmc2l6ZT0wLAogICAgICAgICAgIG1vZGU9InIiLCBvcGVuaG9vaz1Ob25lKToKICAgICAiIiJSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIEZpbGVJbnB1dCBjbGFzcywgd2hpY2ggY2FuIGJlIGl0ZXJhdGVkLgpAQCAtMjAxLDYgKzE5OSwxMCBAQAogICAgICAgICBzZWxmLl9maWxlcyA9IGZpbGVzCiAgICAgICAgIHNlbGYuX2lucGxhY2UgPSBpbnBsYWNlCiAgICAgICAgIHNlbGYuX2JhY2t1cCA9IGJhY2t1cAorICAgICAgICBpZiBidWZzaXplOgorICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdidWZzaXplIGlzIGRlcHJlY2F0ZWQgYW5kIGlnbm9yZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgc2VsZi5fc2F2ZXN0ZG91dCA9IE5vbmUKICAgICAgICAgc2VsZi5fb3V0cHV0ID0gTm9uZQogICAgICAgICBzZWxmLl9maWxlbmFtZSA9IE5vbmUKQEAgLTM5OCw5ICs0MDAsOSBAQAogICAgICAgICByZXR1cm4gb3BlbihmaWxlbmFtZSwgbW9kZSkKIAogCi1kZWYgaG9va19lbmNvZGVkKGVuY29kaW5nKToKK2RlZiBob29rX2VuY29kZWQoZW5jb2RpbmcsIGVycm9ycz1Ob25lKToKICAgICBkZWYgb3Blbmhvb2soZmlsZW5hbWUsIG1vZGUpOgotICAgICAgICByZXR1cm4gb3BlbihmaWxlbmFtZSwgbW9kZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCisgICAgICAgIHJldHVybiBvcGVuKGZpbGVuYW1lLCBtb2RlLCBlbmNvZGluZz1lbmNvZGluZywgZXJyb3JzPWVycm9ycykKICAgICByZXR1cm4gb3Blbmhvb2sKIAogCmRpZmYgLS1naXQgYS9MaWIvZm5tYXRjaC5weSBiL0xpYi9mbm1hdGNoLnB5CmluZGV4IDYzMzBiMGMuLjA3YjEyMjkgMTAwNjQ0Ci0tLSBhL0xpYi9mbm1hdGNoLnB5CisrKyBiL0xpYi9mbm1hdGNoLnB5CkBAIC0xMDYsNCArMTA2LDQgQEAKICAgICAgICAgICAgICAgICByZXMgPSAnJXNbJXNdJyAlIChyZXMsIHN0dWZmKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmVzID0gcmVzICsgcmUuZXNjYXBlKGMpCi0gICAgcmV0dXJuIHJlcyArICdcWig/bXMpJworICAgIHJldHVybiByZXMgKyByJ1xaKD9tcyknCmRpZmYgLS1naXQgYS9MaWIvZnJhY3Rpb25zLnB5IGIvTGliL2ZyYWN0aW9ucy5weQppbmRleCA5YWFiYWIzLi44MzMwMjAyIDEwMDY0NAotLS0gYS9MaWIvZnJhY3Rpb25zLnB5CisrKyBiL0xpYi9mcmFjdGlvbnMucHkKQEAgLTgxLDcgKzgxLDcgQEAKICAgICBfX3Nsb3RzX18gPSAoJ19udW1lcmF0b3InLCAnX2Rlbm9taW5hdG9yJykKIAogICAgICMgV2UncmUgaW1tdXRhYmxlLCBzbyB1c2UgX19uZXdfXyBub3QgX19pbml0X18KLSAgICBkZWYgX19uZXdfXyhjbHMsIG51bWVyYXRvcj0wLCBkZW5vbWluYXRvcj1Ob25lLCBfbm9ybWFsaXplPVRydWUpOgorICAgIGRlZiBfX25ld19fKGNscywgbnVtZXJhdG9yPTAsIGRlbm9taW5hdG9yPU5vbmUsICosIF9ub3JtYWxpemU9VHJ1ZSk6CiAgICAgICAgICIiIkNvbnN0cnVjdHMgYSBSYXRpb25hbC4KIAogICAgICAgICBUYWtlcyBhIHN0cmluZyBsaWtlICczLzInIG9yICcxLjUnLCBhbm90aGVyIFJhdGlvbmFsIGluc3RhbmNlLCBhCkBAIC0xMjUsMTcgKzEyNSw5IEBACiAgICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSBudW1lcmF0b3IuZGVub21pbmF0b3IKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi0gICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UobnVtZXJhdG9yLCBmbG9hdCk6Ci0gICAgICAgICAgICAgICAgIyBFeGFjdCBjb252ZXJzaW9uIGZyb20gZmxvYXQKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IEZyYWN0aW9uLmZyb21fZmxvYXQobnVtZXJhdG9yKQotICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciA9IHZhbHVlLl9udW1lcmF0b3IKLSAgICAgICAgICAgICAgICBzZWxmLl9kZW5vbWluYXRvciA9IHZhbHVlLl9kZW5vbWluYXRvcgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCi0KLSAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIERlY2ltYWwpOgotICAgICAgICAgICAgICAgIHZhbHVlID0gRnJhY3Rpb24uZnJvbV9kZWNpbWFsKG51bWVyYXRvcikKLSAgICAgICAgICAgICAgICBzZWxmLl9udW1lcmF0b3IgPSB2YWx1ZS5fbnVtZXJhdG9yCi0gICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSB2YWx1ZS5fZGVub21pbmF0b3IKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIChmbG9hdCwgRGVjaW1hbCkpOgorICAgICAgICAgICAgICAgICMgRXhhY3QgY29udmVyc2lvbgorICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciwgc2VsZi5fZGVub21pbmF0b3IgPSBudW1lcmF0b3IuYXNfaW50ZWdlcl9yYXRpbygpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG51bWVyYXRvciwgc3RyKToKQEAgLTIxMCwxMCArMjAyLDYgQEAKICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShmLCBmbG9hdCk6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzLmZyb21fZmxvYXQoKSBvbmx5IHRha2VzIGZsb2F0cywgbm90ICVyICglcykiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xzLl9fbmFtZV9fLCBmLCB0eXBlKGYpLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgbWF0aC5pc25hbihmKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVyIHRvICVzLiIgJSAoZiwgY2xzLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgbWF0aC5pc2luZihmKToKLSAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVyIHRvICVzLiIgJSAoZiwgY2xzLl9fbmFtZV9fKSkKICAgICAgICAgcmV0dXJuIGNscygqZi5hc19pbnRlZ2VyX3JhdGlvKCkpCiAKICAgICBAY2xhc3NtZXRob2QKQEAgLTIyNiwxOSArMjE0LDcgQEAKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICAiJXMuZnJvbV9kZWNpbWFsKCkgb25seSB0YWtlcyBEZWNpbWFscywgbm90ICVyICglcykiICUKICAgICAgICAgICAgICAgICAoY2xzLl9fbmFtZV9fLCBkZWMsIHR5cGUoZGVjKS5fX25hbWVfXykpCi0gICAgICAgIGlmIGRlYy5pc19pbmZpbml0ZSgpOgotICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcigKLSAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbnZlcnQgJXMgdG8gJXMuIiAlIChkZWMsIGNscy5fX25hbWVfXykpCi0gICAgICAgIGlmIGRlYy5pc19uYW4oKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVzIHRvICVzLiIgJSAoZGVjLCBjbHMuX19uYW1lX18pKQotICAgICAgICBzaWduLCBkaWdpdHMsIGV4cCA9IGRlYy5hc190dXBsZSgpCi0gICAgICAgIGRpZ2l0cyA9IGludCgnJy5qb2luKG1hcChzdHIsIGRpZ2l0cykpKQotICAgICAgICBpZiBzaWduOgotICAgICAgICAgICAgZGlnaXRzID0gLWRpZ2l0cwotICAgICAgICBpZiBleHAgPj0gMDoKLSAgICAgICAgICAgIHJldHVybiBjbHMoZGlnaXRzICogMTAgKiogZXhwKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGNscyhkaWdpdHMsIDEwICoqIC1leHApCisgICAgICAgIHJldHVybiBjbHMoKmRlYy5hc19pbnRlZ2VyX3JhdGlvKCkpCiAKICAgICBkZWYgbGltaXRfZGVub21pbmF0b3Ioc2VsZiwgbWF4X2Rlbm9taW5hdG9yPTEwMDAwMDApOgogICAgICAgICAiIiJDbG9zZXN0IEZyYWN0aW9uIHRvIHNlbGYgd2l0aCBkZW5vbWluYXRvciBhdCBtb3N0IG1heF9kZW5vbWluYXRvci4KZGlmZiAtLWdpdCBhL0xpYi9mdHBsaWIucHkgYi9MaWIvZnRwbGliLnB5CmluZGV4IGM0MTZkODUuLmVlMmExMzcgMTAwNjQ0Ci0tLSBhL0xpYi9mdHBsaWIucHkKKysrIGIvTGliL2Z0cGxpYi5weQpAQCAtMzYsMTMgKzM2LDEyIEBACiAjIE1vZGlmaWVkIGJ5IEdpYW1wYW9sbyBSb2RvbGEnIHRvIGFkZCBUTFMgc3VwcG9ydC4KICMKIAotaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgc29ja2V0Ci1pbXBvcnQgd2FybmluZ3MKIGZyb20gc29ja2V0IGltcG9ydCBfR0xPQkFMX0RFRkFVTFRfVElNRU9VVAogCi1fX2FsbF9fID0gWyJGVFAiXQorX19hbGxfXyA9IFsiRlRQIiwgImVycm9yX3JlcGx5IiwgImVycm9yX3RlbXAiLCAiZXJyb3JfcGVybSIsICJlcnJvcl9wcm90byIsCisgICAgICAgICAgICJhbGxfZXJyb3JzIl0KIAogIyBNYWdpYyBudW1iZXIgZnJvbSA8c29ja2V0Lmg+CiBNU0dfT09CID0gMHgxICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQcm9jZXNzIGRhdGEgb3V0IG9mIGJhbmQKQEAgLTgyMiw3ICs4MjEsNyBAQAogICAgIGlmIF8xNTBfcmUgaXMgTm9uZToKICAgICAgICAgaW1wb3J0IHJlCiAgICAgICAgIF8xNTBfcmUgPSByZS5jb21waWxlKAotICAgICAgICAgICAgIjE1MCAuKiBcKChcZCspIGJ5dGVzXCkiLCByZS5JR05PUkVDQVNFIHwgcmUuQVNDSUkpCisgICAgICAgICAgICByIjE1MCAuKiBcKChcZCspIGJ5dGVzXCkiLCByZS5JR05PUkVDQVNFIHwgcmUuQVNDSUkpCiAgICAgbSA9IF8xNTBfcmUubWF0Y2gocmVzcCkKICAgICBpZiBub3QgbToKICAgICAgICAgcmV0dXJuIE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9nZW5lcmljcGF0aC5weSBiL0xpYi9nZW5lcmljcGF0aC5weQppbmRleCA2NzE0MDYxLi4zMDNiM2IzIDEwMDY0NAotLS0gYS9MaWIvZ2VuZXJpY3BhdGgucHkKKysrIGIvTGliL2dlbmVyaWNwYXRoLnB5CkBAIC02OSw2ICs2OSwxMiBAQAogZGVmIGNvbW1vbnByZWZpeChtKToKICAgICAiR2l2ZW4gYSBsaXN0IG9mIHBhdGhuYW1lcywgcmV0dXJucyB0aGUgbG9uZ2VzdCBjb21tb24gbGVhZGluZyBjb21wb25lbnQiCiAgICAgaWYgbm90IG06IHJldHVybiAnJworICAgICMgU29tZSBwZW9wbGUgcGFzcyBpbiBhIGxpc3Qgb2YgcGF0aG5hbWUgcGFydHMgdG8gb3BlcmF0ZSBpbiBhbiBPUy1hZ25vc3RpYworICAgICMgZmFzaGlvbjsgZG9uJ3QgdHJ5IHRvIHRyYW5zbGF0ZSBpbiB0aGF0IGNhc2UgYXMgdGhhdCdzIGFuIGFidXNlIG9mIHRoZQorICAgICMgQVBJIGFuZCB0aGV5IGFyZSBhbHJlYWR5IGRvaW5nIHdoYXQgdGhleSBuZWVkIHRvIGJlIE9TLWFnbm9zdGljIGFuZCBzbworICAgICMgdGhleSBtb3N0IGxpa2VseSB3b24ndCBiZSB1c2luZyBhbiBvcy5QYXRoTGlrZSBvYmplY3QgaW4gdGhlIHN1Ymxpc3RzLgorICAgIGlmIG5vdCBpc2luc3RhbmNlKG1bMF0sIChsaXN0LCB0dXBsZSkpOgorICAgICAgICBtID0gdHVwbGUobWFwKG9zLmZzcGF0aCwgbSkpCiAgICAgczEgPSBtaW4obSkKICAgICBzMiA9IG1heChtKQogICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShzMSk6CmRpZmYgLS1naXQgYS9MaWIvZ2xvYi5weSBiL0xpYi9nbG9iLnB5CmluZGV4IDE2MzMwZDguLjdjM2NjY2IgMTAwNjQ0Ci0tLSBhL0xpYi9nbG9iLnB5CisrKyBiL0xpYi9nbG9iLnB5CkBAIC0zMCwxNSArMzAsMTYgQEAKICAgICBJZiByZWN1cnNpdmUgaXMgdHJ1ZSwgdGhlIHBhdHRlcm4gJyoqJyB3aWxsIG1hdGNoIGFueSBmaWxlcyBhbmQKICAgICB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzLgogICAgICIiIgotICAgIGl0ID0gX2lnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmUpCisgICAgaXQgPSBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSwgRmFsc2UpCiAgICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUocGF0aG5hbWUpOgogICAgICAgICBzID0gbmV4dChpdCkgICMgc2tpcCBlbXB0eSBzdHJpbmcKICAgICAgICAgYXNzZXJ0IG5vdCBzCiAgICAgcmV0dXJuIGl0CiAKLWRlZiBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSk6CitkZWYgX2lnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmUsIGRpcm9ubHkpOgogICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gb3MucGF0aC5zcGxpdChwYXRobmFtZSkKICAgICBpZiBub3QgaGFzX21hZ2ljKHBhdGhuYW1lKToKKyAgICAgICAgYXNzZXJ0IG5vdCBkaXJvbmx5CiAgICAgICAgIGlmIGJhc2VuYW1lOgogICAgICAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKHBhdGhuYW1lKToKICAgICAgICAgICAgICAgICB5aWVsZCBwYXRobmFtZQpAQCAtNDksNDcgKzUwLDM5IEBACiAgICAgICAgIHJldHVybgogICAgIGlmIG5vdCBkaXJuYW1lOgogICAgICAgICBpZiByZWN1cnNpdmUgYW5kIF9pc3JlY3Vyc2l2ZShiYXNlbmFtZSk6Ci0gICAgICAgICAgICB5aWVsZCBmcm9tIGdsb2IyKGRpcm5hbWUsIGJhc2VuYW1lKQorICAgICAgICAgICAgeWllbGQgZnJvbSBfZ2xvYjIoZGlybmFtZSwgYmFzZW5hbWUsIGRpcm9ubHkpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB5aWVsZCBmcm9tIGdsb2IxKGRpcm5hbWUsIGJhc2VuYW1lKQorICAgICAgICAgICAgeWllbGQgZnJvbSBfZ2xvYjEoZGlybmFtZSwgYmFzZW5hbWUsIGRpcm9ubHkpCiAgICAgICAgIHJldHVybgogICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyB0aGUgYXJndW1lbnQgaXRzZWxmIGFzIGEgZGlybmFtZSBpZiBpdCBpcyBhCiAgICAgIyBkcml2ZSBvciBVTkMgcGF0aC4gIFByZXZlbnQgYW4gaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgZHJpdmUgb3IgVU5DIHBhdGgKICAgICAjIGNvbnRhaW5zIG1hZ2ljIGNoYXJhY3RlcnMgKGkuZS4gcidcXD9cQzonKS4KICAgICBpZiBkaXJuYW1lICE9IHBhdGhuYW1lIGFuZCBoYXNfbWFnaWMoZGlybmFtZSk6Ci0gICAgICAgIGRpcnMgPSBfaWdsb2IoZGlybmFtZSwgcmVjdXJzaXZlKQorICAgICAgICBkaXJzID0gX2lnbG9iKGRpcm5hbWUsIHJlY3Vyc2l2ZSwgVHJ1ZSkKICAgICBlbHNlOgogICAgICAgICBkaXJzID0gW2Rpcm5hbWVdCiAgICAgaWYgaGFzX21hZ2ljKGJhc2VuYW1lKToKICAgICAgICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUoYmFzZW5hbWUpOgotICAgICAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMgorICAgICAgICAgICAgZ2xvYl9pbl9kaXIgPSBfZ2xvYjIKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjEKKyAgICAgICAgICAgIGdsb2JfaW5fZGlyID0gX2dsb2IxCiAgICAgZWxzZToKLSAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMAorICAgICAgICBnbG9iX2luX2RpciA9IF9nbG9iMAogICAgIGZvciBkaXJuYW1lIGluIGRpcnM6Ci0gICAgICAgIGZvciBuYW1lIGluIGdsb2JfaW5fZGlyKGRpcm5hbWUsIGJhc2VuYW1lKToKKyAgICAgICAgZm9yIG5hbWUgaW4gZ2xvYl9pbl9kaXIoZGlybmFtZSwgYmFzZW5hbWUsIGRpcm9ubHkpOgogICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpCiAKICMgVGhlc2UgMiBoZWxwZXIgZnVuY3Rpb25zIG5vbi1yZWN1cnNpdmVseSBnbG9iIGluc2lkZSBhIGxpdGVyYWwgZGlyZWN0b3J5LgotIyBUaGV5IHJldHVybiBhIGxpc3Qgb2YgYmFzZW5hbWVzLiBgZ2xvYjFgIGFjY2VwdHMgYSBwYXR0ZXJuIHdoaWxlIGBnbG9iMGAKKyMgVGhleSByZXR1cm4gYSBsaXN0IG9mIGJhc2VuYW1lcy4gIF9nbG9iMSBhY2NlcHRzIGEgcGF0dGVybiB3aGlsZSBfZ2xvYjAKICMgdGFrZXMgYSBsaXRlcmFsIGJhc2VuYW1lIChzbyBpdCBvbmx5IGhhcyB0byBjaGVjayBmb3IgaXRzIGV4aXN0ZW5jZSkuCiAKLWRlZiBnbG9iMShkaXJuYW1lLCBwYXR0ZXJuKToKLSAgICBpZiBub3QgZGlybmFtZToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBieXRlcyk6Ci0gICAgICAgICAgICBkaXJuYW1lID0gYnl0ZXMob3MuY3VyZGlyLCAnQVNDSUknKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpcgotICAgIHRyeToKLSAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCi0gICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgIHJldHVybiBbXQorZGVmIF9nbG9iMShkaXJuYW1lLCBwYXR0ZXJuLCBkaXJvbmx5KToKKyAgICBuYW1lcyA9IGxpc3QoX2l0ZXJkaXIoZGlybmFtZSwgZGlyb25seSkpCiAgICAgaWYgbm90IF9pc2hpZGRlbihwYXR0ZXJuKToKLSAgICAgICAgbmFtZXMgPSBbeCBmb3IgeCBpbiBuYW1lcyBpZiBub3QgX2lzaGlkZGVuKHgpXQorICAgICAgICBuYW1lcyA9ICh4IGZvciB4IGluIG5hbWVzIGlmIG5vdCBfaXNoaWRkZW4oeCkpCiAgICAgcmV0dXJuIGZubWF0Y2guZmlsdGVyKG5hbWVzLCBwYXR0ZXJuKQogCi1kZWYgZ2xvYjAoZGlybmFtZSwgYmFzZW5hbWUpOgorZGVmIF9nbG9iMChkaXJuYW1lLCBiYXNlbmFtZSwgZGlyb25seSk6CiAgICAgaWYgbm90IGJhc2VuYW1lOgogICAgICAgICAjIGBvcy5wYXRoLnNwbGl0KClgIHJldHVybnMgYW4gZW1wdHkgYmFzZW5hbWUgZm9yIHBhdGhzIGVuZGluZyB3aXRoIGEKICAgICAgICAgIyBkaXJlY3Rvcnkgc2VwYXJhdG9yLiAgJ3EqeC8nIHNob3VsZCBtYXRjaCBvbmx5IGRpcmVjdG9yaWVzLgpAQCAtMTAwLDMwICs5Myw1OCBAQAogICAgICAgICAgICAgcmV0dXJuIFtiYXNlbmFtZV0KICAgICByZXR1cm4gW10KIAorIyBGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBub3QgcHVibGljIGJ1dCBjYW4gYmUgdXNlZCBieSB0aGlyZC1wYXJ0eSBjb2RlLgorCitkZWYgZ2xvYjAoZGlybmFtZSwgcGF0dGVybik6CisgICAgcmV0dXJuIF9nbG9iMChkaXJuYW1lLCBwYXR0ZXJuLCBGYWxzZSkKKworZGVmIGdsb2IxKGRpcm5hbWUsIHBhdHRlcm4pOgorICAgIHJldHVybiBfZ2xvYjEoZGlybmFtZSwgcGF0dGVybiwgRmFsc2UpCisKICMgVGhpcyBoZWxwZXIgZnVuY3Rpb24gcmVjdXJzaXZlbHkgeWllbGRzIHJlbGF0aXZlIHBhdGhuYW1lcyBpbnNpZGUgYSBsaXRlcmFsCiAjIGRpcmVjdG9yeS4KIAotZGVmIGdsb2IyKGRpcm5hbWUsIHBhdHRlcm4pOgorZGVmIF9nbG9iMihkaXJuYW1lLCBwYXR0ZXJuLCBkaXJvbmx5KToKICAgICBhc3NlcnQgX2lzcmVjdXJzaXZlKHBhdHRlcm4pCiAgICAgeWllbGQgcGF0dGVybls6MF0KLSAgICB5aWVsZCBmcm9tIF9ybGlzdGRpcihkaXJuYW1lKQorICAgIHlpZWxkIGZyb20gX3JsaXN0ZGlyKGRpcm5hbWUsIGRpcm9ubHkpCiAKLSMgUmVjdXJzaXZlbHkgeWllbGRzIHJlbGF0aXZlIHBhdGhuYW1lcyBpbnNpZGUgYSBsaXRlcmFsIGRpcmVjdG9yeS4KLWRlZiBfcmxpc3RkaXIoZGlybmFtZSk6CisjIElmIGRpcm9ubHkgaXMgZmFsc2UsIHlpZWxkcyBhbGwgZmlsZSBuYW1lcyBpbnNpZGUgYSBkaXJlY3RvcnkuCisjIElmIGRpcm9ubHkgaXMgdHJ1ZSwgeWllbGRzIG9ubHkgZGlyZWN0b3J5IG5hbWVzLgorZGVmIF9pdGVyZGlyKGRpcm5hbWUsIGRpcm9ubHkpOgogICAgIGlmIG5vdCBkaXJuYW1lOgogICAgICAgICBpZiBpc2luc3RhbmNlKGRpcm5hbWUsIGJ5dGVzKToKICAgICAgICAgICAgIGRpcm5hbWUgPSBieXRlcyhvcy5jdXJkaXIsICdBU0NJSScpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCiAgICAgdHJ5OgotICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKLSAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JyBhbmQgaXNpbnN0YW5jZShkaXJuYW1lLCBieXRlcyk6CisgICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKKyAgICAgICAgICAgIGlmIGRpcm9ubHk6CisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgZnJvbSBuYW1lcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2l0aCBvcy5zY2FuZGlyKGRpcm5hbWUpIGFzIGl0OgorICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiBpdDoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGRpcm9ubHkgb3IgZW50cnkuaXNfZGlyKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZW50cnkubmFtZQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgcmV0dXJuCisKKyMgUmVjdXJzaXZlbHkgeWllbGRzIHJlbGF0aXZlIHBhdGhuYW1lcyBpbnNpZGUgYSBsaXRlcmFsIGRpcmVjdG9yeS4KK2RlZiBfcmxpc3RkaXIoZGlybmFtZSwgZGlyb25seSk6CisgICAgbmFtZXMgPSBsaXN0KF9pdGVyZGlyKGRpcm5hbWUsIGRpcm9ubHkpKQogICAgIGZvciB4IGluIG5hbWVzOgogICAgICAgICBpZiBub3QgX2lzaGlkZGVuKHgpOgogICAgICAgICAgICAgeWllbGQgeAogICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCB4KSBpZiBkaXJuYW1lIGVsc2UgeAotICAgICAgICAgICAgZm9yIHkgaW4gX3JsaXN0ZGlyKHBhdGgpOgorICAgICAgICAgICAgZm9yIHkgaW4gX3JsaXN0ZGlyKHBhdGgsIGRpcm9ubHkpOgogICAgICAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbih4LCB5KQogCiAKZGlmZiAtLWdpdCBhL0xpYi9oYXNobGliLnB5IGIvTGliL2hhc2hsaWIucHkKaW5kZXggMzE2Y2VjZS4uMDUzYTdhZCAxMDA2NDQKLS0tIGEvTGliL2hhc2hsaWIucHkKKysrIGIvTGliL2hhc2hsaWIucHkKQEAgLTQsMTQgKzQsMTUgQEAKIAogX19kb2NfXyA9ICIiImhhc2hsaWIgbW9kdWxlIC0gQSBjb21tb24gaW50ZXJmYWNlIHRvIG1hbnkgaGFzaCBmdW5jdGlvbnMuCiAKLW5ldyhuYW1lLCBkYXRhPWInJykgLSByZXR1cm5zIGEgbmV3IGhhc2ggb2JqZWN0IGltcGxlbWVudGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBoYXNoIGZ1bmN0aW9uOyBpbml0aWFsaXppbmcgdGhlIGhhc2gKLSAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGUgZ2l2ZW4gYmluYXJ5IGRhdGEuCituZXcobmFtZSwgZGF0YT1iJycsICoqa3dhcmdzKSAtIHJldHVybnMgYSBuZXcgaGFzaCBvYmplY3QgaW1wbGVtZW50aW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBoYXNoIGZ1bmN0aW9uOyBpbml0aWFsaXppbmcgdGhlIGhhc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIGdpdmVuIGJpbmFyeSBkYXRhLgogCiBOYW1lZCBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgYXJlIGFsc28gYXZhaWxhYmxlLCB0aGVzZSBhcmUgZmFzdGVyCiB0aGFuIHVzaW5nIG5ldyhuYW1lKToKIAotbWQ1KCksIHNoYTEoKSwgc2hhMjI0KCksIHNoYTI1NigpLCBzaGEzODQoKSwgYW5kIHNoYTUxMigpCittZDUoKSwgc2hhMSgpLCBzaGEyMjQoKSwgc2hhMjU2KCksIHNoYTM4NCgpLCBzaGE1MTIoKSwgYmxha2UyYigpLCBibGFrZTJzKCksCitzaGEzXzIyNCwgc2hhM18yNTYsIHNoYTNfMzg0LCBzaGEzXzUxMiwgc2hha2VfMTI4LCBhbmQgc2hha2VfMjU2LgogCiBNb3JlIGFsZ29yaXRobXMgbWF5IGJlIGF2YWlsYWJsZSBvbiB5b3VyIHBsYXRmb3JtIGJ1dCB0aGUgYWJvdmUgYXJlIGd1YXJhbnRlZWQKIHRvIGV4aXN0LiAgU2VlIHRoZSBhbGdvcml0aG1zX2d1YXJhbnRlZWQgYW5kIGFsZ29yaXRobXNfYXZhaWxhYmxlIGF0dHJpYnV0ZXMKQEAgLTU0LDcgKzU1LDExIEBACiAKICMgVGhpcyB0dXBsZSBhbmQgX19nZXRfYnVpbHRpbl9jb25zdHJ1Y3RvcigpIG11c3QgYmUgbW9kaWZpZWQgaWYgYSBuZXcKICMgYWx3YXlzIGF2YWlsYWJsZSBhbGdvcml0aG0gaXMgYWRkZWQuCi1fX2Fsd2F5c19zdXBwb3J0ZWQgPSAoJ21kNScsICdzaGExJywgJ3NoYTIyNCcsICdzaGEyNTYnLCAnc2hhMzg0JywgJ3NoYTUxMicpCitfX2Fsd2F5c19zdXBwb3J0ZWQgPSAoJ21kNScsICdzaGExJywgJ3NoYTIyNCcsICdzaGEyNTYnLCAnc2hhMzg0JywgJ3NoYTUxMicsCisgICAgICAgICAgICAgICAgICAgICAgJ2JsYWtlMmInLCAnYmxha2UycycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NoYTNfMjI0JywgJ3NoYTNfMjU2JywgJ3NoYTNfMzg0JywgJ3NoYTNfNTEyJywKKyAgICAgICAgICAgICAgICAgICAgICAnc2hha2VfMTI4JywgJ3NoYWtlXzI1NicpCisKIAogYWxnb3JpdGhtc19ndWFyYW50ZWVkID0gc2V0KF9fYWx3YXlzX3N1cHBvcnRlZCkKIGFsZ29yaXRobXNfYXZhaWxhYmxlID0gc2V0KF9fYWx3YXlzX3N1cHBvcnRlZCkKQEAgLTg1LDYgKzkwLDE5IEBACiAgICAgICAgICAgICBpbXBvcnQgX3NoYTUxMgogICAgICAgICAgICAgY2FjaGVbJ1NIQTM4NCddID0gY2FjaGVbJ3NoYTM4NCddID0gX3NoYTUxMi5zaGEzODQKICAgICAgICAgICAgIGNhY2hlWydTSEE1MTInXSA9IGNhY2hlWydzaGE1MTInXSA9IF9zaGE1MTIuc2hhNTEyCisgICAgICAgIGVsaWYgbmFtZSBpbiAoJ2JsYWtlMmInLCAnYmxha2UycycpOgorICAgICAgICAgICAgaW1wb3J0IF9ibGFrZTIKKyAgICAgICAgICAgIGNhY2hlWydibGFrZTJiJ10gPSBfYmxha2UyLmJsYWtlMmIKKyAgICAgICAgICAgIGNhY2hlWydibGFrZTJzJ10gPSBfYmxha2UyLmJsYWtlMnMKKyAgICAgICAgZWxpZiBuYW1lIGluIHsnc2hhM18yMjQnLCAnc2hhM18yNTYnLCAnc2hhM18zODQnLCAnc2hhM181MTInLAorICAgICAgICAgICAgICAgICAgICAgICdzaGFrZV8xMjgnLCAnc2hha2VfMjU2J306CisgICAgICAgICAgICBpbXBvcnQgX3NoYTMKKyAgICAgICAgICAgIGNhY2hlWydzaGEzXzIyNCddID0gX3NoYTMuc2hhM18yMjQKKyAgICAgICAgICAgIGNhY2hlWydzaGEzXzI1NiddID0gX3NoYTMuc2hhM18yNTYKKyAgICAgICAgICAgIGNhY2hlWydzaGEzXzM4NCddID0gX3NoYTMuc2hhM18zODQKKyAgICAgICAgICAgIGNhY2hlWydzaGEzXzUxMiddID0gX3NoYTMuc2hhM181MTIKKyAgICAgICAgICAgIGNhY2hlWydzaGFrZV8xMjgnXSA9IF9zaGEzLnNoYWtlXzEyOAorICAgICAgICAgICAgY2FjaGVbJ3NoYWtlXzI1NiddID0gX3NoYTMuc2hha2VfMjU2CiAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICBwYXNzICAjIG5vIGV4dGVuc2lvbiBtb2R1bGUsIHRoaXMgaGFzaCBpcyB1bnN1cHBvcnRlZC4KIApAQCAtOTYsNiArMTE0LDkgQEAKIAogCiBkZWYgX19nZXRfb3BlbnNzbF9jb25zdHJ1Y3RvcihuYW1lKToKKyAgICBpZiBuYW1lIGluIHsnYmxha2UyYicsICdibGFrZTJzJ306CisgICAgICAgICMgUHJlZmVyIG91ciBibGFrZTIgaW1wbGVtZW50YXRpb24uCisgICAgICAgIHJldHVybiBfX2dldF9idWlsdGluX2NvbnN0cnVjdG9yKG5hbWUpCiAgICAgdHJ5OgogICAgICAgICBmID0gZ2V0YXR0cihfaGFzaGxpYiwgJ29wZW5zc2xfJyArIG5hbWUpCiAgICAgICAgICMgQWxsb3cgdGhlIEMgbW9kdWxlIHRvIHJhaXNlIFZhbHVlRXJyb3IuICBUaGUgZnVuY3Rpb24gd2lsbCBiZQpAQCAtMTA3LDE3ICsxMjgsMjMgQEAKICAgICAgICAgcmV0dXJuIF9fZ2V0X2J1aWx0aW5fY29uc3RydWN0b3IobmFtZSkKIAogCi1kZWYgX19weV9uZXcobmFtZSwgZGF0YT1iJycpOgorZGVmIF9fcHlfbmV3KG5hbWUsIGRhdGE9YicnLCAqKmt3YXJncyk6CisgICAgIiIibmV3KG5hbWUsIGRhdGE9YicnLCAqKmt3YXJncykgLSBSZXR1cm4gYSBuZXcgaGFzaGluZyBvYmplY3QgdXNpbmcgdGhlCisgICAgbmFtZWQgYWxnb3JpdGhtOyBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggZGF0YSAod2hpY2ggbXVzdCBiZSBieXRlcykuCisgICAgIiIiCisgICAgcmV0dXJuIF9fZ2V0X2J1aWx0aW5fY29uc3RydWN0b3IobmFtZSkoZGF0YSwgKiprd2FyZ3MpCisKKworZGVmIF9faGFzaF9uZXcobmFtZSwgZGF0YT1iJycsICoqa3dhcmdzKToKICAgICAiIiJuZXcobmFtZSwgZGF0YT1iJycpIC0gUmV0dXJuIGEgbmV3IGhhc2hpbmcgb2JqZWN0IHVzaW5nIHRoZSBuYW1lZCBhbGdvcml0aG07CiAgICAgb3B0aW9uYWxseSBpbml0aWFsaXplZCB3aXRoIGRhdGEgKHdoaWNoIG11c3QgYmUgYnl0ZXMpLgogICAgICIiIgotICAgIHJldHVybiBfX2dldF9idWlsdGluX2NvbnN0cnVjdG9yKG5hbWUpKGRhdGEpCi0KLQotZGVmIF9faGFzaF9uZXcobmFtZSwgZGF0YT1iJycpOgotICAgICIiIm5ldyhuYW1lLCBkYXRhPWInJykgLSBSZXR1cm4gYSBuZXcgaGFzaGluZyBvYmplY3QgdXNpbmcgdGhlIG5hbWVkIGFsZ29yaXRobTsKLSAgICBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggZGF0YSAod2hpY2ggbXVzdCBiZSBieXRlcykuCi0gICAgIiIiCisgICAgaWYgbmFtZSBpbiB7J2JsYWtlMmInLCAnYmxha2Uycyd9OgorICAgICAgICAjIFByZWZlciBvdXIgYmxha2UyIGltcGxlbWVudGF0aW9uLgorICAgICAgICAjIE9wZW5TU0wgMS4xLjAgY29tZXMgd2l0aCBhIGxpbWl0ZWQgaW1wbGVtZW50YXRpb24gb2YgYmxha2UyYi9zLgorICAgICAgICAjIEl0IGRvZXMgbmVpdGhlciBzdXBwb3J0IGtleWVkIGJsYWtlMiBub3IgYWR2YW5jZWQgZmVhdHVyZXMgbGlrZQorICAgICAgICAjIHNhbHQsIHBlcnNvbmFsLCB0cmVlIGhhc2hpbmcgb3IgU1NFLgorICAgICAgICByZXR1cm4gX19nZXRfYnVpbHRpbl9jb25zdHJ1Y3RvcihuYW1lKShkYXRhLCAqKmt3YXJncykKICAgICB0cnk6CiAgICAgICAgIHJldHVybiBfaGFzaGxpYi5uZXcobmFtZSwgZGF0YSkKICAgICBleGNlcHQgVmFsdWVFcnJvcjoKQEAgLTIwMiw2ICsyMjksMTIgQEAKIAogICAgICAgICByZXR1cm4gZGtleVs6ZGtsZW5dCiAKK3RyeToKKyAgICAjIE9wZW5TU0wncyBzY3J5cHQgcmVxdWlyZXMgT3BlblNTTCAxLjErCisgICAgZnJvbSBfaGFzaGxpYiBpbXBvcnQgc2NyeXB0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworCiAKIGZvciBfX2Z1bmNfbmFtZSBpbiBfX2Fsd2F5c19zdXBwb3J0ZWQ6CiAgICAgIyB0cnkgdGhlbSBhbGwsIHNvbWUgbWF5IG5vdCB3b3JrIGR1ZSB0byB0aGUgT3BlblNTTApAQCAtMjEyLDYgKzI0NSw3IEBACiAgICAgICAgIGltcG9ydCBsb2dnaW5nCiAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCdjb2RlIGZvciBoYXNoICVzIHdhcyBub3QgZm91bmQuJywgX19mdW5jX25hbWUpCiAKKwogIyBDbGVhbnVwIGxvY2FscygpCiBkZWwgX19hbHdheXNfc3VwcG9ydGVkLCBfX2Z1bmNfbmFtZSwgX19nZXRfaGFzaAogZGVsIF9fcHlfbmV3LCBfX2hhc2hfbmV3LCBfX2dldF9vcGVuc3NsX2NvbnN0cnVjdG9yCmRpZmYgLS1naXQgYS9MaWIvaHRtbC9wYXJzZXIucHkgYi9MaWIvaHRtbC9wYXJzZXIucHkKaW5kZXggYjc4MWM2My4uZWY4NjliYyAxMDA2NDQKLS0tIGEvTGliL2h0bWwvcGFyc2VyLnB5CisrKyBiL0xpYi9odG1sL3BhcnNlci5weQpAQCAtMzQsNyArMzQsNyBAQAogIyAgICAgZXhwbG9kZSwgc28gZG9uJ3QgZG8gaXQuCiAjIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS90b2tlbml6YXRpb24uaHRtbCN0YWctb3Blbi1zdGF0ZQogIyBhbmQgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvdG9rZW5pemF0aW9uLmh0bWwjdGFnLW5hbWUtc3RhdGUKLXRhZ2ZpbmRfdG9sZXJhbnQgPSByZS5jb21waWxlKCcoW2EtekEtWl1bXlx0XG5cclxmIC8+XHgwMF0qKSg/OlxzfC8oPyE+KSkqJykKK3RhZ2ZpbmRfdG9sZXJhbnQgPSByZS5jb21waWxlKHInKFthLXpBLVpdW15cdFxuXHJcZiAvPlx4MDBdKikoPzpcc3wvKD8hPikpKicpCiBhdHRyZmluZF90b2xlcmFudCA9IHJlLmNvbXBpbGUoCiAgICAgcicoKD88PVtcJyJccy9dKVteXHMvPl1bXlxzLz0+XSopKFxzKj0rXHMqJwogICAgIHInKFwnW15cJ10qXCd8IlteIl0qInwoPyFbXCciXSlbXj5cc10qKSk/KD86XHN8Lyg/IT4pKSonKQpAQCAtNTYsNyArNTYsNyBAQAogZW5kZW5kdGFnID0gcmUuY29tcGlsZSgnPicpCiAjIHRoZSBIVE1MIDUgc3BlYywgc2VjdGlvbiA4LjEuMi4yLCBkb2Vzbid0IGFsbG93IHNwYWNlcyBiZXR3ZWVuCiAjIDwvIGFuZCB0aGUgdGFnIG5hbWUsIHNvIG1heWJlIHRoaXMgc2hvdWxkIGJlIGZpeGVkCi1lbmR0YWdmaW5kID0gcmUuY29tcGlsZSgnPC9ccyooW2EtekEtWl1bLS5hLXpBLVowLTk6X10qKVxzKj4nKQorZW5kdGFnZmluZCA9IHJlLmNvbXBpbGUocic8L1xzKihbYS16QS1aXVstLmEtekEtWjAtOTpfXSopXHMqPicpCiAKIAogCmRpZmYgLS1naXQgYS9MaWIvaHR0cC9jbGllbnQucHkgYi9MaWIvaHR0cC9jbGllbnQucHkKaW5kZXggMzUyYzEwMS4uYWQ4ZjQxMCAxMDA2NDQKLS0tIGEvTGliL2h0dHAvY2xpZW50LnB5CisrKyBiL0xpYi9odHRwL2NsaWVudC5weQpAQCAtMSw0ICsxLDQgQEAKLSIiIkhUVFAvMS4xIGNsaWVudCBsaWJyYXJ5CityIiIiSFRUUC8xLjEgY2xpZW50IGxpYnJhcnkKIAogPGludHJvIHN0dWZmIGdvZXMgaGVyZT4KIDxvdGhlciBzdHVmZiwgdG9vPgpAQCAtNDIwLDYgKzQyMCw3IEBACiAgICAgICAgICAgICBzZWxmLmZwLmZsdXNoKCkKIAogICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgIiIiQWx3YXlzIHJldHVybnMgVHJ1ZSIiIgogICAgICAgICByZXR1cm4gVHJ1ZQogCiAgICAgIyBFbmQgb2YgInJhdyBzdHJlYW0iIG1ldGhvZHMKQEAgLTQ2Nyw2ICs0NjgsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBzCiAKICAgICBkZWYgcmVhZGludG8oc2VsZiwgYik6CisgICAgICAgICIiIlJlYWQgdXAgdG8gbGVuKGIpIGJ5dGVzIGludG8gYnl0ZWFycmF5IGIgYW5kIHJldHVybiB0aGUgbnVtYmVyCisgICAgICAgIG9mIGJ5dGVzIHJlYWQuCisgICAgICAgICIiIgorCiAgICAgICAgIGlmIHNlbGYuZnAgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybiAwCiAKQEAgLTcwNiw2ICs3MTEsMTcgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuZnAuZmlsZW5vKCkKIAogICAgIGRlZiBnZXRoZWFkZXIoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgJycnUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGhlYWRlciBtYXRjaGluZyAqbmFtZSouCisKKyAgICAgICAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1hdGNoaW5nIGhlYWRlcnMsIHRoZSB2YWx1ZXMgYXJlCisgICAgICAgIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIHNwYWNlcy4KKworICAgICAgICBJZiBubyBtYXRjaGluZyBoZWFkZXIgaXMgZm91bmQsIHJldHVybnMgKmRlZmF1bHQqIG9yIE5vbmUgaWYKKyAgICAgICAgdGhlICpkZWZhdWx0KiBpcyBub3Qgc3BlY2lmaWVkLgorCisgICAgICAgIElmIHRoZSBoZWFkZXJzIGFyZSB1bmtub3duLCByYWlzZXMgaHR0cC5jbGllbnQuUmVzcG9uc2VOb3RSZWFkeS4KKworICAgICAgICAnJycKICAgICAgICAgaWYgc2VsZi5oZWFkZXJzIGlzIE5vbmU6CiAgICAgICAgICAgICByYWlzZSBSZXNwb25zZU5vdFJlYWR5KCkKICAgICAgICAgaGVhZGVycyA9IHNlbGYuaGVhZGVycy5nZXRfYWxsKG5hbWUpIG9yIGRlZmF1bHQKQEAgLTcyOCwxMiArNzQ0LDQ1IEBACiAgICAgIyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZC1zdHlsZSB1cmxsaWIgcmVzcG9uc2VzLgogCiAgICAgZGVmIGluZm8oc2VsZik6CisgICAgICAgICcnJ1JldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG1pbWV0b29scy5NZXNzYWdlIGNvbnRhaW5pbmcKKyAgICAgICAgbWV0YS1pbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVSTC4KKworICAgICAgICBXaGVuIHRoZSBtZXRob2QgaXMgSFRUUCwgdGhlc2UgaGVhZGVycyBhcmUgdGhvc2UgcmV0dXJuZWQgYnkKKyAgICAgICAgdGhlIHNlcnZlciBhdCB0aGUgaGVhZCBvZiB0aGUgcmV0cmlldmVkIEhUTUwgcGFnZSAoaW5jbHVkaW5nCisgICAgICAgIENvbnRlbnQtTGVuZ3RoIGFuZCBDb250ZW50LVR5cGUpLgorCisgICAgICAgIFdoZW4gdGhlIG1ldGhvZCBpcyBGVFAsIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIHdpbGwgYmUKKyAgICAgICAgcHJlc2VudCBpZiAoYXMgaXMgbm93IHVzdWFsKSB0aGUgc2VydmVyIHBhc3NlZCBiYWNrIGEgZmlsZQorICAgICAgICBsZW5ndGggaW4gcmVzcG9uc2UgdG8gdGhlIEZUUCByZXRyaWV2YWwgcmVxdWVzdC4gQQorICAgICAgICBDb250ZW50LVR5cGUgaGVhZGVyIHdpbGwgYmUgcHJlc2VudCBpZiB0aGUgTUlNRSB0eXBlIGNhbiBiZQorICAgICAgICBndWVzc2VkLgorCisgICAgICAgIFdoZW4gdGhlIG1ldGhvZCBpcyBsb2NhbC1maWxlLCByZXR1cm5lZCBoZWFkZXJzIHdpbGwgaW5jbHVkZQorICAgICAgICBhIERhdGUgcmVwcmVzZW50aW5nIHRoZSBmaWxlJ3MgbGFzdC1tb2RpZmllZCB0aW1lLCBhCisgICAgICAgIENvbnRlbnQtTGVuZ3RoIGdpdmluZyBmaWxlIHNpemUsIGFuZCBhIENvbnRlbnQtVHlwZQorICAgICAgICBjb250YWluaW5nIGEgZ3Vlc3MgYXQgdGhlIGZpbGUncyB0eXBlLiBTZWUgYWxzbyB0aGUKKyAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIG1pbWV0b29scyBtb2R1bGUuCisKKyAgICAgICAgJycnCiAgICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMKIAogICAgIGRlZiBnZXR1cmwoc2VsZik6CisgICAgICAgICcnJ1JldHVybiB0aGUgcmVhbCBVUkwgb2YgdGhlIHBhZ2UuCisKKyAgICAgICAgSW4gc29tZSBjYXNlcywgdGhlIEhUVFAgc2VydmVyIHJlZGlyZWN0cyBhIGNsaWVudCB0byBhbm90aGVyCisgICAgICAgIFVSTC4gVGhlIHVybG9wZW4oKSBmdW5jdGlvbiBoYW5kbGVzIHRoaXMgdHJhbnNwYXJlbnRseSwgYnV0IGluCisgICAgICAgIHNvbWUgY2FzZXMgdGhlIGNhbGxlciBuZWVkcyB0byBrbm93IHdoaWNoIFVSTCB0aGUgY2xpZW50IHdhcworICAgICAgICByZWRpcmVjdGVkIHRvLiBUaGUgZ2V0dXJsKCkgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGdldCBhdCB0aGlzCisgICAgICAgIHJlZGlyZWN0ZWQgVVJMLgorCisgICAgICAgICcnJwogICAgICAgICByZXR1cm4gc2VsZi51cmwKIAogICAgIGRlZiBnZXRjb2RlKHNlbGYpOgorICAgICAgICAnJydSZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB3YXMgc2VudCB3aXRoIHRoZSByZXNwb25zZSwKKyAgICAgICAgb3IgTm9uZSBpZiB0aGUgVVJMIGlzIG5vdCBhbiBIVFRQIFVSTC4KKworICAgICAgICAnJycKICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdHVzCiAKIGNsYXNzIEhUVFBDb25uZWN0aW9uOgpAQCAtNzQ2LDYgKzc5NSw0NCBAQAogICAgIGF1dG9fb3BlbiA9IDEKICAgICBkZWJ1Z2xldmVsID0gMAogCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfdGV4dElPKHN0cmVhbSk6CisgICAgICAgICIiIlRlc3Qgd2hldGhlciBhIGZpbGUtbGlrZSBvYmplY3QgaXMgYSB0ZXh0IG9yIGEgYmluYXJ5IHN0cmVhbS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKHN0cmVhbSwgaW8uVGV4dElPQmFzZSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2dldF9jb250ZW50X2xlbmd0aChib2R5LCBtZXRob2QpOgorICAgICAgICAiIiJHZXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGJhc2VkIG9uIHRoZSBib2R5LgorCisgICAgICAgIElmIHRoZSBib2R5IGlzIE5vbmUsIHdlIHNldCBDb250ZW50LUxlbmd0aDogMCBmb3IgbWV0aG9kcyB0aGF0IGV4cGVjdAorICAgICAgICBhIGJvZHkgKFJGQyA3MjMwLCBTZWN0aW9uIDMuMy4yKS4gV2UgYWxzbyBzZXQgdGhlIENvbnRlbnQtTGVuZ3RoIGZvcgorICAgICAgICBhbnkgbWV0aG9kIGlmIHRoZSBib2R5IGlzIGEgc3RyIG9yIGJ5dGVzLWxpa2Ugb2JqZWN0IGFuZCBub3QgYSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgYm9keSBpcyBOb25lOgorICAgICAgICAgICAgIyBkbyBhbiBleHBsaWNpdCBjaGVjayBmb3Igbm90IE5vbmUgaGVyZSB0byBkaXN0aW5ndWlzaAorICAgICAgICAgICAgIyBiZXR3ZWVuIHVuc2V0IGFuZCBzZXQgYnV0IGVtcHR5CisgICAgICAgICAgICBpZiBtZXRob2QudXBwZXIoKSBpbiBfTUVUSE9EU19FWFBFQ1RJTkdfQk9EWToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGlmIGhhc2F0dHIoYm9keSwgJ3JlYWQnKToKKyAgICAgICAgICAgICMgZmlsZS1saWtlIG9iamVjdC4KKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBkb2VzIGl0IGltcGxlbWVudCB0aGUgYnVmZmVyIHByb3RvY29sIChieXRlcywgYnl0ZWFycmF5LCBhcnJheSk/CisgICAgICAgICAgICBtdiA9IG1lbW9yeXZpZXcoYm9keSkKKyAgICAgICAgICAgIHJldHVybiBtdi5uYnl0ZXMKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBpZiBpc2luc3RhbmNlKGJvZHksIHN0cik6CisgICAgICAgICAgICByZXR1cm4gbGVuKGJvZHkpCisKKyAgICAgICAgcmV0dXJuIE5vbmUKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PU5vbmUsIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VULAogICAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzcz1Ob25lKToKICAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dApAQCAtODg0LDE4ICs5NzEsOSBAQAogICAgICAgICBpZiBoYXNhdHRyKGRhdGEsICJyZWFkIikgOgogICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKICAgICAgICAgICAgICAgICBwcmludCgic2VuZEluZyBhIHJlYWQoKWFibGUiKQotICAgICAgICAgICAgZW5jb2RlID0gRmFsc2UKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBtb2RlID0gZGF0YS5tb2RlCi0gICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyBpby5CeXRlc0lPIGFuZCBvdGhlciBmaWxlLWxpa2Ugb2JqZWN0cyBkb24ndCBoYXZlIGEgYG1vZGVgCi0gICAgICAgICAgICAgICAgIyBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiAiYiIgbm90IGluIG1vZGU6Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZSA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJlbmNvZGluZyBmaWxlIHVzaW5nIGlzby04ODU5LTEiKQorICAgICAgICAgICAgZW5jb2RlID0gc2VsZi5faXNfdGV4dElPKGRhdGEpCisgICAgICAgICAgICBpZiBlbmNvZGUgYW5kIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICAgICAgcHJpbnQoImVuY29kaW5nIGZpbGUgdXNpbmcgaXNvLTg4NTktMSIpCiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIGRhdGFibG9jayA9IGRhdGEucmVhZChibG9ja3NpemUpCiAgICAgICAgICAgICAgICAgaWYgbm90IGRhdGFibG9jazoKQEAgLTkyMSw3ICs5OTksMjIgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuX2J1ZmZlci5hcHBlbmQocykKIAotICAgIGRlZiBfc2VuZF9vdXRwdXQoc2VsZiwgbWVzc2FnZV9ib2R5PU5vbmUpOgorICAgIGRlZiBfcmVhZF9yZWFkYWJsZShzZWxmLCByZWFkYWJsZSk6CisgICAgICAgIGJsb2Nrc2l6ZSA9IDgxOTIKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgIHByaW50KCJzZW5kSW5nIGEgcmVhZCgpYWJsZSIpCisgICAgICAgIGVuY29kZSA9IHNlbGYuX2lzX3RleHRJTyhyZWFkYWJsZSkKKyAgICAgICAgaWYgZW5jb2RlIGFuZCBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgcHJpbnQoImVuY29kaW5nIGZpbGUgdXNpbmcgaXNvLTg4NTktMSIpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBkYXRhYmxvY2sgPSByZWFkYWJsZS5yZWFkKGJsb2Nrc2l6ZSkKKyAgICAgICAgICAgIGlmIG5vdCBkYXRhYmxvY2s6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGVuY29kZToKKyAgICAgICAgICAgICAgICBkYXRhYmxvY2sgPSBkYXRhYmxvY2suZW5jb2RlKCJpc28tODg1OS0xIikKKyAgICAgICAgICAgIHlpZWxkIGRhdGFibG9jaworCisgICAgZGVmIF9zZW5kX291dHB1dChzZWxmLCBtZXNzYWdlX2JvZHk9Tm9uZSwgZW5jb2RlX2NodW5rZWQ9RmFsc2UpOgogICAgICAgICAiIiJTZW5kIHRoZSBjdXJyZW50bHkgYnVmZmVyZWQgcmVxdWVzdCBhbmQgY2xlYXIgdGhlIGJ1ZmZlci4KIAogICAgICAgICBBcHBlbmRzIGFuIGV4dHJhIFxcclxcbiB0byB0aGUgYnVmZmVyLgpAQCAtOTMwLDEwICsxMDIzLDUwIEBACiAgICAgICAgIHNlbGYuX2J1ZmZlci5leHRlbmQoKGIiIiwgYiIiKSkKICAgICAgICAgbXNnID0gYiJcclxuIi5qb2luKHNlbGYuX2J1ZmZlcikKICAgICAgICAgZGVsIHNlbGYuX2J1ZmZlcls6XQotCiAgICAgICAgIHNlbGYuc2VuZChtc2cpCisKICAgICAgICAgaWYgbWVzc2FnZV9ib2R5IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5zZW5kKG1lc3NhZ2VfYm9keSkKKworICAgICAgICAgICAgIyBjcmVhdGUgYSBjb25zaXN0ZW50IGludGVyZmFjZSB0byBtZXNzYWdlX2JvZHkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIobWVzc2FnZV9ib2R5LCAncmVhZCcpOgorICAgICAgICAgICAgICAgICMgTGV0IGZpbGUtbGlrZSB0YWtlIHByZWNlZGVuY2Ugb3ZlciBieXRlLWxpa2UuICBUaGlzCisgICAgICAgICAgICAgICAgIyBpcyBuZWVkZWQgdG8gYWxsb3cgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgbW1hcCdlZAorICAgICAgICAgICAgICAgICMgZmlsZXMgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50LgorICAgICAgICAgICAgICAgIGNodW5rcyA9IHNlbGYuX3JlYWRfcmVhZGFibGUobWVzc2FnZV9ib2R5KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgdGhpcyBpcyBzb2xlbHkgdG8gY2hlY2sgdG8gc2VlIGlmIG1lc3NhZ2VfYm9keQorICAgICAgICAgICAgICAgICAgICAjIGltcGxlbWVudHMgdGhlIGJ1ZmZlciBBUEkuICBpdCAvd291bGQvIGJlIGVhc2llcgorICAgICAgICAgICAgICAgICAgICAjIHRvIGNhcHR1cmUgaWYgUHlPYmplY3RfQ2hlY2tCdWZmZXIgd2FzIGV4cG9zZWQKKyAgICAgICAgICAgICAgICAgICAgIyB0byBQeXRob24uCisgICAgICAgICAgICAgICAgICAgIG1lbW9yeXZpZXcobWVzc2FnZV9ib2R5KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcyA9IGl0ZXIobWVzc2FnZV9ib2R5KQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJtZXNzYWdlX2JvZHkgc2hvdWxkIGJlIGEgYnl0ZXMtbGlrZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCBvciBhbiBpdGVyYWJsZSwgZ290ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdHlwZShtZXNzYWdlX2JvZHkpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgdGhlIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBidWZmZXIgaW50ZXJmYWNlIGFuZAorICAgICAgICAgICAgICAgICAgICAjIGNhbiBiZSBwYXNzZWQgZGlyZWN0bHkgaW50byBzb2NrZXQgbWV0aG9kcworICAgICAgICAgICAgICAgICAgICBjaHVua3MgPSAobWVzc2FnZV9ib2R5LCkKKworICAgICAgICAgICAgZm9yIGNodW5rIGluIGNodW5rczoKKyAgICAgICAgICAgICAgICBpZiBub3QgY2h1bms6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnWmVybyBsZW5ndGggY2h1bmsgaWdub3JlZCcpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBlbmNvZGVfY2h1bmtlZCBhbmQgc2VsZi5faHR0cF92c24gPT0gMTE6CisgICAgICAgICAgICAgICAgICAgICMgY2h1bmtlZCBlbmNvZGluZworICAgICAgICAgICAgICAgICAgICBjaHVuayA9IGYne2xlbihjaHVuayk6WH0nJ1xyXG4nLmVuY29kZSgnYXNjaWknKSArIGNodW5rIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYidcclxuJworICAgICAgICAgICAgICAgIHNlbGYuc2VuZChjaHVuaykKKworICAgICAgICAgICAgaWYgZW5jb2RlX2NodW5rZWQgYW5kIHNlbGYuX2h0dHBfdnNuID09IDExOgorICAgICAgICAgICAgICAgICMgZW5kIGNodW5rZWQgdHJhbnNmZXIKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmQoYicwXHJcblxyXG4nKQogCiAgICAgZGVmIHB1dHJlcXVlc3Qoc2VsZiwgbWV0aG9kLCB1cmwsIHNraXBfaG9zdD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICBza2lwX2FjY2VwdF9lbmNvZGluZz1GYWxzZSk6CkBAIC0xMDg3LDUyICsxMjIwLDI3IEBACiAgICAgICAgIGhlYWRlciA9IGhlYWRlciArIGInOiAnICsgdmFsdWUKICAgICAgICAgc2VsZi5fb3V0cHV0KGhlYWRlcikKIAotICAgIGRlZiBlbmRoZWFkZXJzKHNlbGYsIG1lc3NhZ2VfYm9keT1Ob25lKToKKyAgICBkZWYgZW5kaGVhZGVycyhzZWxmLCBtZXNzYWdlX2JvZHk9Tm9uZSwgKiwgZW5jb2RlX2NodW5rZWQ9RmFsc2UpOgogICAgICAgICAiIiJJbmRpY2F0ZSB0aGF0IHRoZSBsYXN0IGhlYWRlciBsaW5lIGhhcyBiZWVuIHNlbnQgdG8gdGhlIHNlcnZlci4KIAogICAgICAgICBUaGlzIG1ldGhvZCBzZW5kcyB0aGUgcmVxdWVzdCB0byB0aGUgc2VydmVyLiAgVGhlIG9wdGlvbmFsIG1lc3NhZ2VfYm9keQogICAgICAgICBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBwYXNzIGEgbWVzc2FnZSBib2R5IGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgICAgcmVxdWVzdC4gIFRoZSBtZXNzYWdlIGJvZHkgd2lsbCBiZSBzZW50IGluIHRoZSBzYW1lIHBhY2tldCBhcyB0aGUKLSAgICAgICAgbWVzc2FnZSBoZWFkZXJzIGlmIGl0IGlzIGEgc3RyaW5nLCBvdGhlcndpc2UgaXQgaXMgc2VudCBhcyBhIHNlcGFyYXRlCi0gICAgICAgIHBhY2tldC4KKyAgICAgICAgcmVxdWVzdC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuX19zdGF0ZSA9PSBfQ1NfUkVRX1NUQVJURUQ6CiAgICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSBfQ1NfUkVRX1NFTlQKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJhaXNlIENhbm5vdFNlbmRIZWFkZXIoKQotICAgICAgICBzZWxmLl9zZW5kX291dHB1dChtZXNzYWdlX2JvZHkpCisgICAgICAgIHNlbGYuX3NlbmRfb3V0cHV0KG1lc3NhZ2VfYm9keSwgZW5jb2RlX2NodW5rZWQ9ZW5jb2RlX2NodW5rZWQpCiAKLSAgICBkZWYgcmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPXt9KToKKyAgICBkZWYgcmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPXt9LCAqLAorICAgICAgICAgICAgICAgIGVuY29kZV9jaHVua2VkPUZhbHNlKToKICAgICAgICAgIiIiU2VuZCBhIGNvbXBsZXRlIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4iIiIKLSAgICAgICAgc2VsZi5fc2VuZF9yZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5LCBoZWFkZXJzKQorICAgICAgICBzZWxmLl9zZW5kX3JlcXVlc3QobWV0aG9kLCB1cmwsIGJvZHksIGhlYWRlcnMsIGVuY29kZV9jaHVua2VkKQogCi0gICAgZGVmIF9zZXRfY29udGVudF9sZW5ndGgoc2VsZiwgYm9keSwgbWV0aG9kKToKLSAgICAgICAgIyBTZXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGJhc2VkIG9uIHRoZSBib2R5LiBJZiB0aGUgYm9keSBpcyAiZW1wdHkiLCB3ZQotICAgICAgICAjIHNldCBDb250ZW50LUxlbmd0aDogMCBmb3IgbWV0aG9kcyB0aGF0IGV4cGVjdCBhIGJvZHkgKFJGQyA3MjMwLAotICAgICAgICAjIFNlY3Rpb24gMy4zLjIpLiBJZiB0aGUgYm9keSBpcyBzZXQgZm9yIG90aGVyIG1ldGhvZHMsIHdlIHNldCB0aGUKLSAgICAgICAgIyBoZWFkZXIgcHJvdmlkZWQgd2UgY2FuIGZpZ3VyZSBvdXQgd2hhdCB0aGUgbGVuZ3RoIGlzLgotICAgICAgICB0aGVsZW4gPSBOb25lCi0gICAgICAgIG1ldGhvZF9leHBlY3RzX2JvZHkgPSBtZXRob2QudXBwZXIoKSBpbiBfTUVUSE9EU19FWFBFQ1RJTkdfQk9EWQotICAgICAgICBpZiBib2R5IGlzIE5vbmUgYW5kIG1ldGhvZF9leHBlY3RzX2JvZHk6Ci0gICAgICAgICAgICB0aGVsZW4gPSAnMCcKLSAgICAgICAgZWxpZiBib2R5IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHRoZWxlbiA9IHN0cihsZW4oYm9keSkpCi0gICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICAgICAgICAgICMgSWYgdGhpcyBpcyBhIGZpbGUtbGlrZSBvYmplY3QsIHRyeSB0bwotICAgICAgICAgICAgICAgICMgZnN0YXQgaXRzIGZpbGUgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgdGhlbGVuID0gc3RyKG9zLmZzdGF0KGJvZHkuZmlsZW5vKCkpLnN0X3NpemUpCi0gICAgICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgT1NFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgICMgRG9uJ3Qgc2VuZCBhIGxlbmd0aCBpZiB0aGlzIGZhaWxlZAotICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOiBwcmludCgiQ2Fubm90IHN0YXQhISIpCi0KLSAgICAgICAgaWYgdGhlbGVuIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgdGhlbGVuKQotCi0gICAgZGVmIF9zZW5kX3JlcXVlc3Qoc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHksIGhlYWRlcnMpOgorICAgIGRlZiBfc2VuZF9yZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5LCBoZWFkZXJzLCBlbmNvZGVfY2h1bmtlZCk6CiAgICAgICAgICMgSG9ub3IgZXhwbGljaXRseSByZXF1ZXN0ZWQgSG9zdDogYW5kIEFjY2VwdC1FbmNvZGluZzogaGVhZGVycy4KLSAgICAgICAgaGVhZGVyX25hbWVzID0gZGljdC5mcm9ta2V5cyhbay5sb3dlcigpIGZvciBrIGluIGhlYWRlcnNdKQorICAgICAgICBoZWFkZXJfbmFtZXMgPSBmcm96ZW5zZXQoay5sb3dlcigpIGZvciBrIGluIGhlYWRlcnMpCiAgICAgICAgIHNraXBzID0ge30KICAgICAgICAgaWYgJ2hvc3QnIGluIGhlYWRlcl9uYW1lczoKICAgICAgICAgICAgIHNraXBzWydza2lwX2hvc3QnXSA9IDEKQEAgLTExNDEsMTUgKzEyNDksNDAgQEAKIAogICAgICAgICBzZWxmLnB1dHJlcXVlc3QobWV0aG9kLCB1cmwsICoqc2tpcHMpCiAKKyAgICAgICAgIyBjaHVua2VkIGVuY29kaW5nIHdpbGwgaGFwcGVuIGlmIEhUVFAvMS4xIGlzIHVzZWQgYW5kIGVpdGhlcgorICAgICAgICAjIHRoZSBjYWxsZXIgcGFzc2VzIGVuY29kZV9jaHVua2VkPVRydWUgb3IgdGhlIGZvbGxvd2luZworICAgICAgICAjIGNvbmRpdGlvbnMgaG9sZDoKKyAgICAgICAgIyAxLiBjb250ZW50LWxlbmd0aCBoYXMgbm90IGJlZW4gZXhwbGljaXRseSBzZXQKKyAgICAgICAgIyAyLiB0aGUgYm9keSBpcyBhIGZpbGUgb3IgaXRlcmFibGUsIGJ1dCBub3QgYSBzdHIgb3IgYnl0ZXMtbGlrZQorICAgICAgICAjIDMuIFRyYW5zZmVyLUVuY29kaW5nIGhhcyBOT1QgYmVlbiBleHBsaWNpdGx5IHNldCBieSB0aGUgY2FsbGVyCisKICAgICAgICAgaWYgJ2NvbnRlbnQtbGVuZ3RoJyBub3QgaW4gaGVhZGVyX25hbWVzOgotICAgICAgICAgICAgc2VsZi5fc2V0X2NvbnRlbnRfbGVuZ3RoKGJvZHksIG1ldGhvZCkKKyAgICAgICAgICAgICMgb25seSBjaHVuayBib2R5IGlmIG5vdCBleHBsaWNpdGx5IHNldCBmb3IgYmFja3dhcmRzCisgICAgICAgICAgICAjIGNvbXBhdGliaWxpdHksIGFzc3VtaW5nIHRoZSBjbGllbnQgY29kZSBpcyBhbHJlYWR5IGhhbmRsaW5nIHRoZQorICAgICAgICAgICAgIyBjaHVua2luZworICAgICAgICAgICAgaWYgJ3RyYW5zZmVyLWVuY29kaW5nJyBub3QgaW4gaGVhZGVyX25hbWVzOgorICAgICAgICAgICAgICAgICMgaWYgY29udGVudC1sZW5ndGggY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCwgZmFsbAorICAgICAgICAgICAgICAgICMgYmFjayB0byBjaHVua2VkIGVuY29kaW5nCisgICAgICAgICAgICAgICAgZW5jb2RlX2NodW5rZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoID0gc2VsZi5fZ2V0X2NvbnRlbnRfbGVuZ3RoKGJvZHksIG1ldGhvZCkKKyAgICAgICAgICAgICAgICBpZiBjb250ZW50X2xlbmd0aCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZiBib2R5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnVW5hYmxlIHRvIGRldGVybWluZSBzaXplIG9mICVyJyAlIGJvZHkpCisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfY2h1bmtlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKCdUcmFuc2Zlci1FbmNvZGluZycsICdjaHVua2VkJykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCBzdHIoY29udGVudF9sZW5ndGgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW5jb2RlX2NodW5rZWQgPSBGYWxzZQorCiAgICAgICAgIGZvciBoZHIsIHZhbHVlIGluIGhlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKGhkciwgdmFsdWUpCiAgICAgICAgIGlmIGlzaW5zdGFuY2UoYm9keSwgc3RyKToKICAgICAgICAgICAgICMgUkZDIDI2MTYgU2VjdGlvbiAzLjcuMSBzYXlzIHRoYXQgdGV4dCBkZWZhdWx0IGhhcyBhCiAgICAgICAgICAgICAjIGRlZmF1bHQgY2hhcnNldCBvZiBpc28tODg1OS0xLgogICAgICAgICAgICAgYm9keSA9IF9lbmNvZGUoYm9keSwgJ2JvZHknKQotICAgICAgICBzZWxmLmVuZGhlYWRlcnMoYm9keSkKKyAgICAgICAgc2VsZi5lbmRoZWFkZXJzKGJvZHksIGVuY29kZV9jaHVua2VkPWVuY29kZV9jaHVua2VkKQogCiAgICAgZGVmIGdldHJlc3BvbnNlKHNlbGYpOgogICAgICAgICAiIiJHZXQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4KZGlmZiAtLWdpdCBhL0xpYi9odHRwL2Nvb2tpZWphci5weSBiL0xpYi9odHRwL2Nvb2tpZWphci5weQppbmRleCA2ZDQ1NzJhLi5hZGY5NTZkIDEwMDY0NAotLS0gYS9MaWIvaHR0cC9jb29raWVqYXIucHkKKysrIGIvTGliL2h0dHAvY29va2llamFyLnB5CkBAIC0yMDAsNyArMjAwLDcgQEAKIAogU1RSSUNUX0RBVEVfUkUgPSByZS5jb21waWxlKAogICAgIHIiXltTTVRXRl1bYS16XVthLXpdLCAoXGRcZCkgKFtKRk1BU09ORF1bYS16XVthLXpdKSAiCi0gICAgIihcZFxkXGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJCIsIHJlLkFTQ0lJKQorICAgIHIiKFxkXGRcZFxkKSAoXGRcZCk6KFxkXGQpOihcZFxkKSBHTVQkIiwgcmUuQVNDSUkpCiBXRUVLREFZX1JFID0gcmUuY29tcGlsZSgKICAgICByIl4oPzpTdW58TW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXQpW2Etel0qLD9ccyoiLCByZS5JIHwgcmUuQVNDSUkpCiBMT09TRV9IVFRQX0RBVEVfUkUgPSByZS5jb21waWxlKApAQCAtMjc3LDcgKzI3Nyw3IEBACiAgICAgcmV0dXJuIF9zdHIydGltZShkYXksIG1vbiwgeXIsIGhyLCBtaW4sIHNlYywgdHopCiAKIElTT19EQVRFX1JFID0gcmUuY29tcGlsZSgKLSAgICAiIiJeCisgICAgciIiIl4KICAgICAoXGR7NH0pICAgICAgICAgICAgICAjIHllYXIKICAgICAgICBbLVwvXT8KICAgICAoXGRcZD8pICAgICAgICAgICAgICAjIG51bWVyaWNhbCBtb250aApAQCAtNDExLDcgKzQxMSw3IEBACiAgICAgICAgICAgICAgICAgcGFpcnMgPSBbXQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAjIHNraXAganVuawotICAgICAgICAgICAgICAgIG5vbl9qdW5rLCBucl9qdW5rX2NoYXJzID0gcmUuc3VibigiXls9XHM7XSoiLCAiIiwgdGV4dCkKKyAgICAgICAgICAgICAgICBub25fanVuaywgbnJfanVua19jaGFycyA9IHJlLnN1Ym4ociJeWz1ccztdKiIsICIiLCB0ZXh0KQogICAgICAgICAgICAgICAgIGFzc2VydCBucl9qdW5rX2NoYXJzID4gMCwgKAogICAgICAgICAgICAgICAgICAgICAic3BsaXRfaGVhZGVyX3dvcmRzIGJ1ZzogJyVzJywgJyVzJywgJXMiICUKICAgICAgICAgICAgICAgICAgICAgKG9yaWdfdGV4dCwgdGV4dCwgcGFpcnMpKQpkaWZmIC0tZ2l0IGEvTGliL2h0dHAvY29va2llcy5weSBiL0xpYi9odHRwL2Nvb2tpZXMucHkKaW5kZXggYTczZmUzOC4uZjA3OGRhNSAxMDA2NDQKLS0tIGEvTGliL2h0dHAvY29va2llcy5weQorKysgYi9MaWIvaHR0cC9jb29raWVzLnB5CkBAIC00NTYsNyArNDU2LDcgQEAKICMKIAogX0xlZ2FsS2V5Q2hhcnMgID0gciJcd1xkISMlJid+X2A+PEAsOi9cJFwqXCtcLVwuXF5cfFwpXChcP1x9XHtcPSIKLV9MZWdhbFZhbHVlQ2hhcnMgPSBfTGVnYWxLZXlDaGFycyArICdcW1xdJworX0xlZ2FsVmFsdWVDaGFycyA9IF9MZWdhbEtleUNoYXJzICsgcidcW1xdJwogX0Nvb2tpZVBhdHRlcm4gPSByZS5jb21waWxlKHIiIiIKICAgICAoP3gpICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgdmVyYm9zZSBwYXR0ZXJuCiAgICAgXHMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwgd2hpdGVzcGFjZSBhdCBzdGFydCBvZiBjb29raWUKZGlmZiAtLWdpdCBhL0xpYi9odHRwL3NlcnZlci5weSBiL0xpYi9odHRwL3NlcnZlci5weQppbmRleCAwMDYyMGQxLi5lMTJlNDViIDEwMDY0NAotLS0gYS9MaWIvaHR0cC9zZXJ2ZXIucHkKKysrIGIvTGliL2h0dHAvc2VydmVyLnB5CkBAIC04Nyw2ICs4Nyw3IEBACiAgICAgIlNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlciIsICJDR0lIVFRQUmVxdWVzdEhhbmRsZXIiLAogXQogCitpbXBvcnQgZW1haWwudXRpbHMKIGltcG9ydCBodG1sCiBpbXBvcnQgaHR0cC5jbGllbnQKIGltcG9ydCBpbwpAQCAtMTI2LDkgKzEyNyw2IEBACiAKIERFRkFVTFRfRVJST1JfQ09OVEVOVF9UWVBFID0gInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IgogCi1kZWYgX3F1b3RlX2h0bWwoaHRtbCk6Ci0gICAgcmV0dXJuIGh0bWwucmVwbGFjZSgiJiIsICImYW1wOyIpLnJlcGxhY2UoIjwiLCAiJmx0OyIpLnJlcGxhY2UoIj4iLCAiJmd0OyIpCi0KIGNsYXNzIEhUVFBTZXJ2ZXIoc29ja2V0c2VydmVyLlRDUFNlcnZlcik6CiAKICAgICBhbGxvd19yZXVzZV9hZGRyZXNzID0gMSAgICAjIFNlZW1zIHRvIG1ha2Ugc2Vuc2UgaW4gdGVzdGluZyBlbnZpcm9ubWVudApAQCAtMTM2LDcgKzEzNCw3IEBACiAgICAgZGVmIHNlcnZlcl9iaW5kKHNlbGYpOgogICAgICAgICAiIiJPdmVycmlkZSBzZXJ2ZXJfYmluZCB0byBzdG9yZSB0aGUgc2VydmVyIG5hbWUuIiIiCiAgICAgICAgIHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIuc2VydmVyX2JpbmQoc2VsZikKLSAgICAgICAgaG9zdCwgcG9ydCA9IHNlbGYuc29ja2V0LmdldHNvY2tuYW1lKClbOjJdCisgICAgICAgIGhvc3QsIHBvcnQgPSBzZWxmLnNlcnZlcl9hZGRyZXNzWzoyXQogICAgICAgICBzZWxmLnNlcnZlcl9uYW1lID0gc29ja2V0LmdldGZxZG4oaG9zdCkKICAgICAgICAgc2VsZi5zZXJ2ZXJfcG9ydCA9IHBvcnQKIApAQCAtMjgyLDEyICsyODAsOSBAQAogICAgICAgICB3b3JkcyA9IHJlcXVlc3RsaW5lLnNwbGl0KCkKICAgICAgICAgaWYgbGVuKHdvcmRzKSA9PSAzOgogICAgICAgICAgICAgY29tbWFuZCwgcGF0aCwgdmVyc2lvbiA9IHdvcmRzCi0gICAgICAgICAgICBpZiB2ZXJzaW9uWzo1XSAhPSAnSFRUUC8nOgotICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcigKLSAgICAgICAgICAgICAgICAgICAgSFRUUFN0YXR1cy5CQURfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgIkJhZCByZXF1ZXN0IHZlcnNpb24gKCVyKSIgJSB2ZXJzaW9uKQotICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHZlcnNpb25bOjVdICE9ICdIVFRQLyc6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKICAgICAgICAgICAgICAgICBiYXNlX3ZlcnNpb25fbnVtYmVyID0gdmVyc2lvbi5zcGxpdCgnLycsIDEpWzFdCiAgICAgICAgICAgICAgICAgdmVyc2lvbl9udW1iZXIgPSBiYXNlX3ZlcnNpb25fbnVtYmVyLnNwbGl0KCIuIikKICAgICAgICAgICAgICAgICAjIFJGQyAyMTQ1IHNlY3Rpb24gMy4xIHNheXMgdGhlcmUgY2FuIGJlIG9ubHkgb25lICIuIiBhbmQKQEAgLTMwOSw3ICszMDQsNyBAQAogICAgICAgICAgICAgaWYgdmVyc2lvbl9udW1iZXIgPj0gKDIsIDApOgogICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcigKICAgICAgICAgICAgICAgICAgICAgSFRUUFN0YXR1cy5IVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSFRUUCBWZXJzaW9uICglcykiICUgYmFzZV92ZXJzaW9uX251bWJlcikKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSFRUUCB2ZXJzaW9uICglcykiICUgYmFzZV92ZXJzaW9uX251bWJlcikKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgZWxpZiBsZW4od29yZHMpID09IDI6CiAgICAgICAgICAgICBjb21tYW5kLCBwYXRoID0gd29yZHMKQEAgLTMzMiwxMCArMzI3LDExIEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuaGVhZGVycyA9IGh0dHAuY2xpZW50LnBhcnNlX2hlYWRlcnMoc2VsZi5yZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NsYXNzPXNlbGYuTWVzc2FnZUNsYXNzKQotICAgICAgICBleGNlcHQgaHR0cC5jbGllbnQuTGluZVRvb0xvbmc6CisgICAgICAgIGV4Y2VwdCBodHRwLmNsaWVudC5MaW5lVG9vTG9uZyBhcyBlcnI6CiAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoCi0gICAgICAgICAgICAgICAgSFRUUFN0YXR1cy5CQURfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAiTGluZSB0b28gbG9uZyIpCisgICAgICAgICAgICAgICAgSFRUUFN0YXR1cy5SRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFLAorICAgICAgICAgICAgICAgICJMaW5lIHRvbyBsb25nIiwKKyAgICAgICAgICAgICAgICBzdHIoZXJyKSkKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBleGNlcHQgaHR0cC5jbGllbnQuSFRUUEV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoCkBAIC00NjUsOCArNDYxLDggQEAKICAgICAgICAgICAgICMgKHNlZSBidWcgIzExMDAyMDEpCiAgICAgICAgICAgICBjb250ZW50ID0gKHNlbGYuZXJyb3JfbWVzc2FnZV9mb3JtYXQgJSB7CiAgICAgICAgICAgICAgICAgJ2NvZGUnOiBjb2RlLAotICAgICAgICAgICAgICAgICdtZXNzYWdlJzogX3F1b3RlX2h0bWwobWVzc2FnZSksCi0gICAgICAgICAgICAgICAgJ2V4cGxhaW4nOiBfcXVvdGVfaHRtbChleHBsYWluKQorICAgICAgICAgICAgICAgICdtZXNzYWdlJzogaHRtbC5lc2NhcGUobWVzc2FnZSwgcXVvdGU9RmFsc2UpLAorICAgICAgICAgICAgICAgICdleHBsYWluJzogaHRtbC5lc2NhcGUoZXhwbGFpbiwgcXVvdGU9RmFsc2UpCiAgICAgICAgICAgICB9KQogICAgICAgICAgICAgYm9keSA9IGNvbnRlbnQuZW5jb2RlKCdVVEYtOCcsICdyZXBsYWNlJykKICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHNlbGYuZXJyb3JfY29udGVudF90eXBlKQpAQCAtNDkxLDEyICs0ODcsMTIgQEAKIAogICAgIGRlZiBzZW5kX3Jlc3BvbnNlX29ubHkoc2VsZiwgY29kZSwgbWVzc2FnZT1Ob25lKToKICAgICAgICAgIiIiU2VuZCB0aGUgcmVzcG9uc2UgaGVhZGVyIG9ubHkuIiIiCi0gICAgICAgIGlmIG1lc3NhZ2UgaXMgTm9uZToKLSAgICAgICAgICAgIGlmIGNvZGUgaW4gc2VsZi5yZXNwb25zZXM6Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IHNlbGYucmVzcG9uc2VzW2NvZGVdWzBdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnJwogICAgICAgICBpZiBzZWxmLnJlcXVlc3RfdmVyc2lvbiAhPSAnSFRUUC8wLjknOgorICAgICAgICAgICAgaWYgbWVzc2FnZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIGNvZGUgaW4gc2VsZi5yZXNwb25zZXM6CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBzZWxmLnJlc3BvbnNlc1tjb2RlXVswXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnJwogICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ19oZWFkZXJzX2J1ZmZlcicpOgogICAgICAgICAgICAgICAgIHNlbGYuX2hlYWRlcnNfYnVmZmVyID0gW10KICAgICAgICAgICAgIHNlbGYuX2hlYWRlcnNfYnVmZmVyLmFwcGVuZCgoIiVzICVkICVzXHJcbiIgJQpAQCAtNTgzLDEyICs1NzksNyBAQAogICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBmb3JtYXR0ZWQgZm9yIGEgbWVzc2FnZSBoZWFkZXIuIiIiCiAgICAgICAgIGlmIHRpbWVzdGFtcCBpcyBOb25lOgogICAgICAgICAgICAgdGltZXN0YW1wID0gdGltZS50aW1lKCkKLSAgICAgICAgeWVhciwgbW9udGgsIGRheSwgaGgsIG1tLCBzcywgd2QsIHksIHogPSB0aW1lLmdtdGltZSh0aW1lc3RhbXApCi0gICAgICAgIHMgPSAiJXMsICUwMmQgJTNzICU0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgKAotICAgICAgICAgICAgICAgIHNlbGYud2Vla2RheW5hbWVbd2RdLAotICAgICAgICAgICAgICAgIGRheSwgc2VsZi5tb250aG5hbWVbbW9udGhdLCB5ZWFyLAotICAgICAgICAgICAgICAgIGhoLCBtbSwgc3MpCi0gICAgICAgIHJldHVybiBzCisgICAgICAgIHJldHVybiBlbWFpbC51dGlscy5mb3JtYXRkYXRlKHRpbWVzdGFtcCwgdXNlZ210PVRydWUpCiAKICAgICBkZWYgbG9nX2RhdGVfdGltZV9zdHJpbmcoc2VsZik6CiAgICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCB0aW1lIGZvcm1hdHRlZCBmb3IgbG9nZ2luZy4iIiIKQEAgLTcyNiw3ICs3MTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM9J3N1cnJvZ2F0ZXBhc3MnKQogICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICAgZGlzcGxheXBhdGggPSB1cmxsaWIucGFyc2UudW5xdW90ZShwYXRoKQotICAgICAgICBkaXNwbGF5cGF0aCA9IGh0bWwuZXNjYXBlKGRpc3BsYXlwYXRoKQorICAgICAgICBkaXNwbGF5cGF0aCA9IGh0bWwuZXNjYXBlKGRpc3BsYXlwYXRoLCBxdW90ZT1GYWxzZSkKICAgICAgICAgZW5jID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCiAgICAgICAgIHRpdGxlID0gJ0RpcmVjdG9yeSBsaXN0aW5nIGZvciAlcycgJSBkaXNwbGF5cGF0aAogICAgICAgICByLmFwcGVuZCgnPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAnCkBAIC03NTAsNyArNzQxLDcgQEAKICAgICAgICAgICAgIHIuYXBwZW5kKCc8bGk+PGEgaHJlZj0iJXMiPiVzPC9hPjwvbGk+JwogICAgICAgICAgICAgICAgICAgICAlICh1cmxsaWIucGFyc2UucXVvdGUobGlua25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM9J3N1cnJvZ2F0ZXBhc3MnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5lc2NhcGUoZGlzcGxheW5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5lc2NhcGUoZGlzcGxheW5hbWUsIHF1b3RlPUZhbHNlKSkpCiAgICAgICAgIHIuYXBwZW5kKCc8L3VsPlxuPGhyPlxuPC9ib2R5PlxuPC9odG1sPlxuJykKICAgICAgICAgZW5jb2RlZCA9ICdcbicuam9pbihyKS5lbmNvZGUoZW5jLCAnc3Vycm9nYXRlZXNjYXBlJykKICAgICAgICAgZiA9IGlvLkJ5dGVzSU8oKQpAQCAtMTE5MSwxNiArMTE4MiwxNSBAQAogICAgIHNlcnZlcl9hZGRyZXNzID0gKGJpbmQsIHBvcnQpCiAKICAgICBIYW5kbGVyQ2xhc3MucHJvdG9jb2xfdmVyc2lvbiA9IHByb3RvY29sCi0gICAgaHR0cGQgPSBTZXJ2ZXJDbGFzcyhzZXJ2ZXJfYWRkcmVzcywgSGFuZGxlckNsYXNzKQotCi0gICAgc2EgPSBodHRwZC5zb2NrZXQuZ2V0c29ja25hbWUoKQotICAgIHByaW50KCJTZXJ2aW5nIEhUVFAgb24iLCBzYVswXSwgInBvcnQiLCBzYVsxXSwgIi4uLiIpCi0gICAgdHJ5OgotICAgICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKLSAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQotICAgICAgICBodHRwZC5zZXJ2ZXJfY2xvc2UoKQotICAgICAgICBzeXMuZXhpdCgwKQorICAgIHdpdGggU2VydmVyQ2xhc3Moc2VydmVyX2FkZHJlc3MsIEhhbmRsZXJDbGFzcykgYXMgaHR0cGQ6CisgICAgICAgIHNhID0gaHR0cGQuc29ja2V0LmdldHNvY2tuYW1lKCkKKyAgICAgICAgc2VydmVfbWVzc2FnZSA9ICJTZXJ2aW5nIEhUVFAgb24ge2hvc3R9IHBvcnQge3BvcnR9IChodHRwOi8ve2hvc3R9Ontwb3J0fS8pIC4uLiIKKyAgICAgICAgcHJpbnQoc2VydmVfbWVzc2FnZS5mb3JtYXQoaG9zdD1zYVswXSwgcG9ydD1zYVsxXSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwcmludCgiXG5LZXlib2FyZCBpbnRlcnJ1cHQgcmVjZWl2ZWQsIGV4aXRpbmcuIikKKyAgICAgICAgICAgIHN5cy5leGl0KDApCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHkgYi9MaWIvaWRsZWxpYi9NdWx0aVN0YXR1c0Jhci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyYmE5YS4uMDAwMDAwMAotLS0gYS9MaWIvaWRsZWxpYi9NdWx0aVN0YXR1c0Jhci5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLWZyb20gdGtpbnRlciBpbXBvcnQgKgotCi1jbGFzcyBNdWx0aVN0YXR1c0JhcihGcmFtZSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqa3cpOgotICAgICAgICBpZiBtYXN0ZXIgaXMgTm9uZToKLSAgICAgICAgICAgIG1hc3RlciA9IFRrKCkKLSAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyLCAqKmt3KQotICAgICAgICBzZWxmLmxhYmVscyA9IHt9Ci0KLSAgICBkZWYgc2V0X2xhYmVsKHNlbGYsIG5hbWUsIHRleHQ9JycsIHNpZGU9TEVGVCwgd2lkdGg9MCk6Ci0gICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYubGFiZWxzOgotICAgICAgICAgICAgbGFiZWwgPSBMYWJlbChzZWxmLCBib3JkZXJ3aWR0aD0wLCBhbmNob3I9VykKLSAgICAgICAgICAgIGxhYmVsLnBhY2soc2lkZT1zaWRlLCBwYWR5PTAsIHBhZHg9NCkKLSAgICAgICAgICAgIHNlbGYubGFiZWxzW25hbWVdID0gbGFiZWwKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxhYmVsID0gc2VsZi5sYWJlbHNbbmFtZV0KLSAgICAgICAgaWYgd2lkdGggIT0gMDoKLSAgICAgICAgICAgIGxhYmVsLmNvbmZpZyh3aWR0aD13aWR0aCkKLSAgICAgICAgbGFiZWwuY29uZmlnKHRleHQ9dGV4dCkKLQotZGVmIF9tdWx0aXN0YXR1c19iYXIocGFyZW50KToKLSAgICByb290ID0gVGsoKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiICUoeCwgeSArIDE1MCkpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBtdWx0aXN0YXR1cyBiYXIiKQotICAgIGZyYW1lID0gRnJhbWUocm9vdCkKLSAgICB0ZXh0ID0gVGV4dChmcmFtZSkKLSAgICB0ZXh0LnBhY2soKQotICAgIG1zYiA9IE11bHRpU3RhdHVzQmFyKGZyYW1lKQotICAgIG1zYi5zZXRfbGFiZWwoIm9uZSIsICJoZWxsbyIpCi0gICAgbXNiLnNldF9sYWJlbCgidHdvIiwgIndvcmxkIikKLSAgICBtc2IucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1YKQotCi0gICAgZGVmIGNoYW5nZSgpOgotICAgICAgICBtc2Iuc2V0X2xhYmVsKCJvbmUiLCAiZm9vIikKLSAgICAgICAgbXNiLnNldF9sYWJlbCgidHdvIiwgImJhciIpCi0KLSAgICBidXR0b24gPSBCdXR0b24ocm9vdCwgdGV4dD0iVXBkYXRlIHN0YXR1cyIsIGNvbW1hbmQ9Y2hhbmdlKQotICAgIGJ1dHRvbi5wYWNrKHNpZGU9Qk9UVE9NKQotICAgIGZyYW1lLnBhY2soKQotICAgIGZyYW1lLm1haW5sb29wKCkKLSAgICByb290Lm1haW5sb29wKCkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KLSAgICBydW4oX211bHRpc3RhdHVzX2JhcikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL05FV1MudHh0IGIvTGliL2lkbGVsaWIvTkVXUy50eHQKaW5kZXggYjdhYjk4Zi4uOWM3MzljNiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvTkVXUy50eHQKKysrIGIvTGliL2lkbGVsaWIvTkVXUy50eHQKQEAgLTEsMzUgKzEsODQgQEAKLVdoYXQncyBOZXcgaW4gSURMRSAzLjUuMz8KLT09PT09PT09PT09PT09PT09PT09PT09PT0KLSpSZWxlYXNlIGRhdGU6IDIwMTctMDEtMDE/KgorV2hhdCdzIE5ldyBpbiBJRExFIDMuNi4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisqUmVsZWFzZSBkYXRlOiAyMDE2LTA5LT8/KgogCiAtIElzc3VlICMyNzcxNDogdGV4dF90ZXh0dmlldyBhbmQgdGVzdF9hdXRvY29tcGxldGUgbm93IHBhc3Mgd2hlbiByZS1ydW4KICAgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gIFRoaXMgb2NjdXJzIHdoZW4gdGVzdF9pZGxlIGZhaWxzIHdoZW4gcnVuIHdpdGggdGhlCiAgIC13IG9wdGlvbiBidXQgd2l0aG91dCAtam4uICBGaXggd2FybmluZyBmcm9tIHRlc3RfY29uZmlnLgogCistIElzc3VlICMyNzYyMTogUHV0IHF1ZXJ5IHJlc3BvbnNlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgaW4gdGhlIHF1ZXJ5CisgIGJveCBpdHNlbGYgaW5zdGVhZCBvZiBpbiBhIHNlcGFyYXRlIG1hc3NhZ2Vib3guICBSZWRvIHRlc3RzIHRvIG1hdGNoLgorICBBZGQgTWFjIE9TWCByZWZpbmVtZW50cy4gIE9yaWdpbmFsIHBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjc2MjA6IEVzY2FwZSBrZXkgbm93IGNsb3NlcyBRdWVyeSBib3ggYXMgY2FuY2VsbGVkLgorCistIElzc3VlICMyNzYwOTogSURMRTogdGFiIGFmdGVyIGluaXRpYWwgd2hpdGVzcGFjZSBzaG91bGQgdGFiLCBub3QKKyAgYXV0b2NvbXBsZXRlLiBUaGlzIGZpeGVzIHByb2JsZW0gd2l0aCB3cml0aW5nIGRvY3N0cmluZ3MgYXQgbGVhc3QKKyAgdHdpY2UgaW5kZW50ZWQuCisKKy0gSXNzdWUgIzI3NjA5OiBFeHBsaWNpdGx5IHJldHVybiBOb25lIHdoZW4gdGhlcmUgYXJlIGFsc28gbm9uLU5vbmUKKyAgcmV0dXJucy4gSW4gYSBmZXcgY2FzZXMsIHJldmVyc2UgYSBjb25kaXRpb24gYW5kIGVsaW1pbmF0ZSBhIHJldHVybi4KKwogLSBJc3N1ZSAjMjU1MDc6IElETEUgbm8gbG9uZ2VyIHJ1bnMgYnVnZ3kgY29kZSBiZWNhdXNlIG9mIGl0cyB0a2ludGVyIGltcG9ydHMuCiAgIFVzZXJzIG11c3QgaW5jbHVkZSB0aGUgc2FtZSBpbXBvcnRzIHJlcXVpcmVkIHRvIHJ1biBkaXJlY3RseSBpbiBQeXRob24uCiAKKy0gSXNzdWUgIzI3MTczOiBBZGQgJ0lETEUgTW9kZXJuIFVuaXgnIHRvIHRoZSBidWlsdC1pbiBrZXkgc2V0cy4KKyAgTWFrZSB0aGUgZGVmYXVsdCBrZXkgc2V0IGRlcGVuZCBvbiB0aGUgcGxhdGZvcm0uCisgIEFkZCB0ZXN0cyBmb3IgdGhlIGNoYW5nZXMgdG8gdGhlIGNvbmZpZyBtb2R1bGUuCisKIC0gSXNzdWUgIzI3NDUyOiBhZGQgbGluZSBjb3VudGVyIGFuZCBjcmMgdG8gSURMRSBjb25maWdIYW5kbGVyIHRlc3QgZHVtcC4KIAorLSBJc3N1ZSAjMjc0Nzc6IElETEUgc2VhcmNoIGRpYWxvZ3Mgbm93IHVzZSB0dGsgd2lkZ2V0cy4KKworLSBJc3N1ZSAjMjcxNzM6IEFkZCAnSURMRSBNb2Rlcm4gVW5peCcgdG8gdGhlIGJ1aWx0LWluIGtleSBzZXRzLgorICBNYWtlIHRoZSBkZWZhdWx0IGtleSBzZXQgZGVwZW5kIG9uIHRoZSBwbGF0Zm9ybS4KKyAgQWRkIHRlc3RzIGZvciB0aGUgY2hhbmdlcyB0byB0aGUgY29uZmlnIG1vZHVsZS4KKworLSBJc3N1ZSAjMjc0NTI6IG1ha2UgY29tbWFuZCBsaW5lICJpZGxlLXRlc3Q+IHB5dGhvbiB0ZXN0X2hlbHAucHkiIHdvcmsuCisgIF9fZmlsZV9fIGlzIHJlbGF0aXZlIHdoZW4gcHl0aG9uIGlzIHN0YXJ0ZWQgaW4gdGhlIGZpbGUncyBkaXJlY3RvcnkuCisKKy0gSXNzdWUgIzI3NDUyOiBhZGQgbGluZSBjb3VudGVyIGFuZCBjcmMgdG8gSURMRSBjb25maWdIYW5kbGVyIHRlc3QgZHVtcC4KKworLSBJc3N1ZSAjMjczODA6IElETEU6IGFkZCBxdWVyeS5weSB3aXRoIGJhc2UgUXVlcnkgZGlhbG9nIGFuZCB0dGsgd2lkZ2V0cy4KKyAgTW9kdWxlIGhhZCBzdWJjbGFzc2VzIFNlY3Rpb25OYW1lLCBNb2R1bGVOYW1lLCBhbmQgSGVscFNvdXJjZSwgd2hpY2ggYXJlCisgIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gdXNlcnMgYnkgY29uZmlnZGlhbG9nIGFuZCBmaWxlID0+TG9hZCBNb2R1bGUuCisgIEVhY2ggc3ViY2xhc3MgaGFzIGl0dyBvd24gdmFsaWRpdHkgY2hlY2tzLiAgVXNpbmcgTW9kdWxlTmFtZSBhbGxvd3MgdXNlcnMKKyAgdG8gZWRpdCBiYWQgbW9kdWxlIG5hbWVzIGluc3RlYWQgb2Ygc3RhcnRpbmcgb3Zlci4KKyAgQWRkIHRlc3RzIGFuZCBkZWxldGUgdGhlIHR3byBmaWxlcyBjb21iaW5lZCBpbnRvIHRoZSBuZXcgb25lLgorCistIElzc3VlICMyNzM3MjogVGVzdF9pZGxlIG5vIGxvbmdlciBjaGFuZ2VzIHRoZSBsb2NhbGUuCisKIC0gSXNzdWUgIzI3MzY1OiBBbGxvdyBub24tYXNjaWkgY2hhcnMgaW4gSURMRSBORVdTLnR4dCwgZm9yIGNvbnRyaWJ1dG9yIG5hbWVzLgogCiAtIElzc3VlICMyNzI0NTogSURMRTogQ2xlYW5seSBkZWxldGUgY3VzdG9tIHRoZW1lcyBhbmQga2V5IGJpbmRpbmdzLgogICBQcmV2aW91c2x5LCB3aGVuIElETEUgd2FzIHN0YXJ0ZWQgZnJvbSBhIGNvbnNvbGUgb3IgYnkgaW1wb3J0LCBhIGNhc2NhZGUKICAgb2Ygd2FybmluZ3Mgd2FzIGVtaXR0ZWQuICBQYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgogCistIElzc3VlICMyNDEzNzogUnVuIElETEUsIHRlc3RfaWRsZSwgYW5kIGh0ZXN0IHdpdGggdGtpbnRlciBkZWZhdWx0IHJvb3QgZGlzYWJsZWQuCisgIEZpeCBjb2RlIGFuZCB0ZXN0cyB0aGF0IGZhaWwgd2l0aCB0aGlzIHJlc3RyaWN0aW9uLgorICBGaXggaHRlc3RzIHRvIG5vdCBjcmVhdGUgYSBzZWNvbmQgYW5kIHJlZHVuZGFudCByb290IGFuZCBtYWlubG9vcC4KIAotV2hhdCdzIE5ldyBpbiBJRExFIDMuNS4yPwotPT09PT09PT09PT09PT09PT09PT09PT09PQotKlJlbGVhc2UgZGF0ZTogMjAxNi0wNi0yNioKKy0gSXNzdWUgIzI3MzEwOiBGaXggSURMRS5hcHAgZmFpbHVyZSB0byBsYXVuY2ggb24gT1MgWCBkdWUgdG8gdmVzdGlnaWFsIGltcG9ydC4KIAogLSBJc3N1ZSAjNTEyNDogUGFzdGUgd2l0aCB0ZXh0IHNlbGVjdGVkIG5vdyByZXBsYWNlcyB0aGUgc2VsZWN0aW9uIG9uIFgxMS4KICAgVGhpcyBtYXRjaGVzIGhvdyBwYXN0ZSB3b3JrcyBvbiBXaW5kb3dzLCBNYWMsIG1vc3QgbW9kZXJuIExpbnV4IGFwcHMsCiAgIGFuZCB0dGsgd2lkZ2V0cy4gIE9yaWdpbmFsIHBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EuCiAKKy0gSXNzdWUgIzI0NzUwOiBTd2l0Y2ggYWxsIHNjcm9sbGJhcnMgaW4gSURMRSB0byB0dGsgdmVyc2lvbnMuCisgIFdoZXJlIG5lZWRlZCwgbWluaW1hbCB0ZXN0cyBhcmUgYWRkZWQgdG8gY292ZXIgY2hhbmdlcy4KKworLSBJc3N1ZSAjMjQ3NTk6IElETEUgcmVxdWlyZXMgdGsgOC41IGFuZCBhdmFpbGFiaWxpdHkgdHRrIHdpZGdldHMuCisgIERlbGV0ZSBub3cgdW5uZWVkZWQgdGsgdmVyc2lvbiB0ZXN0cyBhbmQgY29kZSBmb3Igb2xkZXIgdmVyc2lvbnMuCisgIEFkZCB0ZXN0IGZvciBJRExFIHN5bnRheCBjb2xvcml6ZXIuCisKKy0gSXNzdWUgIzI3MjM5OiBpZGxlbGliLm1hY29zeC5pc1h5elRrIGZ1bmN0aW9ucyBpbml0aWFsaXplIGFzIG5lZWRlZC4KKworLSBJc3N1ZSAjMjcyNjI6IG1vdmUgQXF1YSB1bmJpbmRpbmcgY29kZSwgd2hpY2ggZW5hYmxlIGNvbnRleHQgbWVudXMsIHRvIG1heG9zeC4KKwogLSBJc3N1ZSAjMjQ3NTk6IE1ha2UgY2xlYXIgaW4gaWRsZWxpYi5pZGxlX3Rlc3QuX19pbml0X18gdGhhdCB0aGUgZGlyZWN0b3J5CiAgIGlzIGEgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0ZXN0LnRlc3RfaWRsZSBhbmQgdG9vbCBmb3IgbWFpbnRhaW5lcnMuCiAKLS0gSXNzdWUgIzI3MTk2OiBTdG9wICdUaGVtZUNoYW5nZWYnIHdhcm5pbmdzIHdoZW4gcnVubmluZyBJRExFIHRlc3RzLgorLSBJc3N1ZSAjMjcxOTY6IFN0b3AgJ1RoZW1lQ2hhbmdlZCcgd2FybmluZ3Mgd2hlbiBydW5uaW5nIElETEUgdGVzdHMuCiAgIFRoZXNlIHBlcnNpc3RlZCBhZnRlciBvdGhlciB3YXJuaW5ncyB3ZXJlIHN1cHByZXNzZWQgaW4gIzIwNTY3LgogICBBcHBseSBTZXJoaXkgU3RvcmNoYWthJ3MgdXBkYXRlX2lkbGV0YXNrcyBzb2x1dGlvbiB0byBmb3VyIHRlc3QgZmlsZXMuCiAgIFJlY29yZCB0aGlzIGFkZGl0aW9uYWwgYWR2aWNlIGluIGlkbGVfdGVzdC9SRUFETUUudHh0CkBAIC0zNyw5ICs4NiwyNiBAQAogLSBJc3N1ZSAjMjA1Njc6IFJldmlzZSBpZGxlX3Rlc3QvUkVBRE1FLnR4dCB3aXRoIGFkdmljZSBhYm91dCBhdm9pZGluZwogICB0ayB3YXJuaW5nIG1lc3NhZ2VzIGZyb20gdGVzdHMuICBBcHBseSBhZHZpY2UgdG8gc2V2ZXJhbCBJRExFIHRlc3RzLgogCistIElzc3VlICMgMjQyMjU6IFVwZGF0ZSBpZGxlbGliL1JFQURNRS50eHQgd2l0aCBuZXcgZmlsZSBuYW1lcworICBhbmQgZXZlbnQgaGFuZGxlcnMuCisKKy0gSXNzdWUgIzI3MTU2OiBSZW1vdmUgb2Jzb2xldGUgY29kZSBub3QgdXNlZCBieSBJRExFLiAgUmVwbGFjZW1lbnRzOgorICAxLiBoZWxwLnR4dCwgcmVwbGFjZWQgYnkgaGVscC5odG1sLCBpcyBvdXQtb2YtZGF0ZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLgorICBJdHMgZGVkaWNhdGVkIHZpZXdlciBoYXMgYmUgcmVwbGFjZWQgYnkgdGhlIGh0bWwgdmlld2VyIGluIGhlbHAucHkuCisgIDIuICdpbXBvcnQgaWRsZXZlcjsgSSA9IGlkbGV2ZXIuSURMRV9WRVJTSU9OJyBpcyB0aGUgc2FtZSBhcworICAnaW1wb3J0IHN5czsgSSA9IHZlcnNpb25bOnZlcnNpb24uaW5kZXgoJyAnKV0nCisgIDMuIEFmdGVyICdvYiA9IHN0YWNrdmlld2VyLlZhcmlhYmxlc1RyZWVJdGVtKCphcmdzKScsCisgICdvYi5rZXlzKCknID09ICdsaXN0KG9iLm9iamVjdC5rZXlzKS4KKyAgNC4gSW4gbWFjb3NjLCBydW5uaW5nQXNPU1hBUFAgPT0gaXNBcXVhVGs7IGlkQ2FyYm9uQXF1YVRrID09IGlzQ2FyYm9uVGsKKwogLSBJc3N1ZSAjMjcxMTc6IE1ha2UgY29sb3JpemVyIGh0ZXN0IGFuZCB0dXJ0bGVkZW1vIHdvcmsgd2l0aCBkYXJrIHRoZW1lcy4KICAgTW92ZSBjb2RlIGZvciBjb25maWd1cmluZyB0ZXh0IHdpZGdldCBjb2xvcnMgdG8gYSBuZXcgZnVuY3Rpb24uCiAKKy0gSXNzdWUgIzI0MjI1OiBSZW5hbWUgbWFueSBpZGxlbGliLyoucHkgYW5kIGlkbGVfdGVzdC90ZXN0XyoucHkgZmlsZXMuCisgIEVkaXQgZmlsZXMgdG8gcmVwbGFjZSBvbGQgbmFtZXMgd2l0aCBuZXcgbmFtZXMgd2hlbiB0aGUgb2xkIG5hbWUKKyAgcmVmZXJyZWQgdG8gdGhlIG1vZHVsZSByYXRoZXIgdGhhbiB0aGUgY2xhc3MgaXQgY29udGFpbmVkLgorICBTZWUgdGhlIGlzc3VlIGFuZCBJRExFIHNlY3Rpb24gaW4gV2hhdCdzIE5ldyBpbiAzLjYgZm9yIG1vcmUuCisKIC0gSXNzdWUgIzI2NjczOiBXaGVuIHRrIHJlcG9ydHMgZm9udCBzaXplIGFzIDAsIGNoYW5nZSB0byBzaXplIDEwLgogICBTdWNoIGZvbnRzIG9uIExpbnV4IHByZXZlbnRlZCB0aGUgY29uZmlndXJhdGlvbiBkaWFsb2cgZnJvbSBvcGVuaW5nLgogCkBAIC01Miw4ICsxMTgsOCBAQAogLSBJc3N1ZSAjMTg0MTA6IEFkZCB0ZXN0IGZvciBJRExFJ3Mgc2VhcmNoIGRpYWxvZy4KICAgT3JpZ2luYWwgcGF0Y2ggYnkgV2VzdGxleSBNYXJ0w61uZXouCiAKLS0gSXNzdWUgIzIxNzAzOiBBZGQgdGVzdCBmb3IgdW5kbyBkZWxlZ2F0b3IuCi0gIE9yaWdpbmFsIHBhdGNoIGJ5IFNhaW1hZGhhdiBIZWJsaWthciAuCistIElzc3VlICMyMTcwMzogQWRkIHRlc3QgZm9yIHVuZG8gZGVsZWdhdG9yLiAgUGF0Y2ggbW9zdGx5IGJ5CisgIFNhaW1hZGhhdiBIZWJsaWthciAuCiAKIC0gSXNzdWUgIzI3MDQ0OiBBZGQgQ29uZmlnRGlhbG9nLnJlbW92ZV92YXJfY2FsbGJhY2tzIHRvIHN0b3AgbWVtb3J5IGxlYWtzLgogCkBAIC03MiwxMSArMTM4LDYgQEAKICAgTUFSSyBpbiBSRUFETUUudHh0IGFuZCBvcGVuIHRoaXMgYW5kIE5FV1MudHh0IHdpdGggJ2FzY2lpJy4KICAgUmUtZW5jb2RlIENSRURJVFMudHh0IHRvIHV0Zi04IGFuZCBvcGVuIGl0IHdpdGggJ3V0Zi04Jy4KIAotCi1XaGF0J3MgTmV3IGluIElETEUgMy41LjE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qUmVsZWFzZSBkYXRlOiAyMDE1LTEyLTA2KgotCiAtIElzc3VlIDE1MzQ4OiBTdG9wIHRoZSBkZWJ1Z2dlciBlbmdpbmUgKG5vcm1hbGx5IGluIGEgdXNlciBwcm9jZXNzKQogICBiZWZvcmUgY2xvc2luZyB0aGUgZGVidWdnZXIgd2luZG93IChydW5uaW5nIGluIHRoZSBJRExFIHByb2Nlc3MpLgogICBUaGlzIHByZXZlbnRzIHRoZSBSdW50aW1lRXJyb3JzIHRoYXQgd2VyZSBiZWluZyBjYXVnaHQgYW5kIGlnbm9yZWQuCkBAIC0zNTQsNiArNDE1LDExIEBACiAtIFVzZSBvZiAnZmlsdGVyJyBpbiBrZXliaW5kaW5nRGlhbG9nLnB5IHdhcyBjYXVzaW5nIGN1c3RvbSBrZXkgYXNzaWdubWVudCB0bwogICBmYWlsLiAgUGF0Y2ggNTcwNyBhbWF1cnkuZm9yZ2VvdGRhcmMuCiAKKworV2hhdCdzIE5ldyBpbiBJRExFIDMuMWExPworPT09PT09PT09PT09PT09PT09PT09PT09PQorKlJlbGVhc2UgZGF0ZTogMDctTWFyLTA5KgorCiAtIElzc3VlICM0ODE1OiBPZmZlciBjb252ZXJzaW9uIHRvIFVURi04IGlmIHNvdXJjZSBmaWxlcyBoYXZlCiAgIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uIGFuZCBhcmUgbm90IGVuY29kZWQgaW4gVVRGLTguCiAKQEAgLTM5Myw2ICs0NTksMTEgQEAKIAogLSBJc3N1ZSAjMzU0OTogT24gTWFjT1MgdGhlIHByZWZlcmVuY2VzIG1lbnUgd2FzIG5vdCBwcmVzZW50CiAKKworV2hhdCdzIE5ldyBpbiBJRExFIDMuMD8KKz09PT09PT09PT09PT09PT09PT09PT09CisqUmVsZWFzZSBkYXRlOiAwMy1EZWMtMjAwOCoKKwogLSBJRExFIHdvdWxkIHByaW50IGEgIlVuaGFuZGxlZCBzZXJ2ZXIgZXhjZXB0aW9uISIgbWVzc2FnZSB3aGVuIGludGVybmFsCiAgIGRlYnVnZ2luZyBpcyBlbmFibGVkLgogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9SRUFETUUudHh0IGIvTGliL2lkbGVsaWIvUkVBRE1FLnR4dAppbmRleCA3YmY3NGMwLi5hODc5YzE3IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9SRUFETUUudHh0CisrKyBiL0xpYi9pZGxlbGliL1JFQURNRS50eHQKQEAgLTI5LDYxICsyOSw2MSBAQAogCiBJbXBsZW1lbnRhdGlvbgogLS0tLS0tLS0tLS0tLS0KLUF1dG9Db21wbGV0ZS5weSAgICMgQ29tcGxldGUgYXR0cmlidXRlIG5hbWVzIG9yIGZpbGVuYW1lcy4KLUF1dG9Db21wbGV0ZVdpbmRvdy5weSAgIyBEaXNwbGF5IGNvbXBsZXRpb25zLgotQXV0b0V4cGFuZC5weSAgICAgIyBFeHBhbmQgd29yZCB3aXRoIHByZXZpb3VzIHdvcmQgaW4gZmlsZS4KLUJpbmRpbmdzLnB5ICAgICAgICMgRGVmaW5lIG1vc3Qgb2YgSURMRSBtZW51LgotQ2FsbFRpcFdpbmRvdy5weSAgIyBEaXNwbGF5IGNhbGx0aXAuCi1DYWxsVGlwcy5weSAgICAgICAjIENyZWF0ZSBjYWxsdGlwIHRleHQuCi1DbGFzc0Jyb3dzZXIucHkgICAjIENyZWF0ZSBtb2R1bGUgYnJvd3NlciB3aW5kb3cuCi1Db2RlQ29udGV4dC5weSAgICAjIFNob3cgY29tcG91bmQgc3RhdGVtZW50IGhlYWRlcnMgb3RoZXJ3aXNlIG5vdCB2aXNpYmxlLgotQ29sb3JEZWxlZ2F0b3IucHkgIyBDb2xvcml6ZSB0ZXh0IChuaW0pLgotRGVidWdnZXIucHkgICAgICAgIyBEZWJ1ZyBjb2RlIHJ1biBmcm9tIGVkaXRvcjsgc2hvdyB3aW5kb3cuCi1EZWxlZ2F0b3IucHkgICAgICAjIERlZmluZSBiYXNlIGNsYXNzIGZvciBkZWxlZ2F0b3JzIChuaW0pLgotRWRpdG9yV2luZG93LnB5ICAgIyBEZWZpbmUgbW9zdCBvZiBlZGl0b3IgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLgotRmlsZUxpc3QucHkgICAgICAgIyBPcGVuIGZpbGVzIGFuZCBtYW5hZ2UgbGlzdCBvZiBvcGVuIHdpbmRvd3MgKG5pbSkuCi1Gb3JtYXRQYXJhZ3JhcGgucHkjIFJlLXdyYXAgbXVsdGlsaW5lIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgotR3JlcERpYWxvZy5weSAgICAgIyBGaW5kIGFsbCBvY2N1cnJlbmNlcyBvZiBwYXR0ZXJuIGluIG11bHRpcGxlIGZpbGVzLgotSHlwZXJQYXJzZXIucHkgICAgIyBQYXJzZSBjb2RlIGFyb3VuZCBhIGdpdmVuIGluZGV4LgotSU9CaW5kaW5nLnB5ICAgICAgIyBPcGVuLCByZWFkLCBhbmQgd3JpdGUgZmlsZXMKLUlkbGVIaXN0b3J5LnB5ICAgICMgR2V0IHByZXZpb3VzIG9yIG5leHQgdXNlciBpbnB1dCBpbiBzaGVsbCAobmltKQotTXVsdGlDYWxsLnB5ICAgICAgIyBXcmFwIHRrIHdpZGdldCB0byBhbGxvdyBtdWx0aXBsZSBjYWxscyBwZXIgZXZlbnQgKG5pbSkuCi1NdWx0aVN0YXR1c0Jhci5weSAjIERlZmluZSBzdGF0dXMgYmFyIGZvciB3aW5kb3dzIChuaW0pLgotT2JqZWN0QnJvd3Nlci5weSAgIyBEZWZpbmUgY2xhc3MgdXNlZCBpbiBTdGFja1ZpZXdlciAobmltKS4KLU91dHB1dFdpbmRvdy5weSAgICMgQ3JlYXRlIHdpbmRvdyBmb3IgZ3JlcCBvdXRwdXQuCi1QYXJlbk1hdGNoLnB5ICAgICAjIE1hdGNoIGZlbmNlcG9zdHM6ICgpLCBbXSwgYW5kIHt9LgotUGF0aEJyb3dzZXIucHkgICAgIyBDcmVhdGUgcGF0aCBicm93c2VyIHdpbmRvdy4KLVBlcmNvbGF0b3IucHkgICAgICMgTWFuYWdlIGRlbGVnYXRvciBzdGFjayAobmltKS4KLVB5UGFyc2UucHkgICAgICAgICMgR2l2ZSBpbmZvcm1hdGlvbiBvbiBjb2RlIGluZGVudGF0aW9uCi1QeVNoZWxsLnB5ICAgICAgICAjIFN0YXJ0IElETEUsIG1hbmFnZSBzaGVsbCwgY29tcGxldGUgZWRpdG9yIHdpbmRvdwotUmVtb3RlRGVidWdnZXIucHkgIyBEZWJ1ZyBjb2RlIHJ1biBpbiByZW1vdGUgcHJvY2Vzcy4KLVJlbW90ZU9iamVjdEJyb3dzZXIucHkgIyBDb21tdW5pY2F0ZSBvYmplY3RzIGJldHdlZW4gcHJvY2Vzc2VzIHdpdGggcnBjIChuaW0pLgotUmVwbGFjZURpYWxvZy5weSAgIyBTZWFyY2ggYW5kIHJlcGxhY2UgcGF0dGVybiBpbiB0ZXh0LgotUnN0cmlwRXh0ZW5zaW9uLnB5IyBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlCi1TY3JpcHRCaW5kaW5nLnB5ICAjIENoZWNrIGFuZCBydW4gdXNlciBjb2RlLgotU2Nyb2xsZWRMaXN0LnB5ICAgIyBEZWZpbmUgU2Nyb2xsZWRMaXN0IHdpZGdldCBmb3IgSURMRSAobmltKS4KLVNlYXJjaERpYWxvZy5weSAgICMgU2VhcmNoIGZvciBwYXR0ZXJuIGluIHRleHQuCi1TZWFyY2hEaWFsb2dCYXNlLnB5ICAjIERlZmluZSBiYXNlIGZvciBzZWFyY2gsIHJlcGxhY2UsIGFuZCBncmVwIGRpYWxvZ3MuCi1TZWFyY2hFbmdpbmUucHkgICAjIERlZmluZSBlbmdpbmUgZm9yIGFsbCAzIHNlYXJjaCBkaWFsb2dzLgotU3RhY2tWaWV3ZXIucHkgICAgIyBWaWV3IHN0YWNrIGFmdGVyIGV4Y2VwdGlvbi4KLVRyZWVXaWRnZXQucHkgICAgICMgRGVmaW5lIHRyZWUgd2lkZ2VyLCB1c2VkIGluIGJyb3dzZXJzIChuaW0pLgotVW5kb0RlbGVnYXRvci5weSAgIyBNYW5hZ2UgdW5kbyBzdGFjay4KLVdpZGdldFJlZGlyZWN0b3IucHkgIyBJbnRlcmNlcHQgd2lkZ2V0IHN1YmNvbW1hbmRzIChmb3IgcGVyY29sYXRvcikgKG5pbSkuCi1XaW5kb3dMaXN0LnB5ICAgICAjIE1hbmFnZSB3aW5kb3cgbGlzdCBhbmQgZGVmaW5lIGxpc3RlZCB0b3AgbGV2ZWwuCi1ab29tSGVpZ2h0LnB5ICAgICAjIFpvb20gd2luZG93IHRvIGZ1bGwgaGVpZ2h0IG9mIHNjcmVlbi4KLWFib3V0RGlhbG9nLnB5ICAgICMgRGlzcGxheSBBYm91dCBJRExFIGRpYWxvZy4KLWNvbmZpZ0RpYWxvZy5weSAgICMgRGlzcGxheSB1c2VyIGNvbmZpZ3VyYXRpb24gZGlhbG9ncy4KLWNvbmZpZ0hhbmRsZXIucHkgICMgTG9hZCwgZmV0Y2gsIGFuZCBzYXZlIGNvbmZpZ3VyYXRpb24gKG5pbSkuCi1jb25maWdIZWxwU291cmNlRWRpdC5weSAgIyBTcGVjaWZ5IGhlbHAgc291cmNlLgotY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkgICMgU3BlZmlmeSB1c2VyIGNvbmZpZyBzZWN0aW9uIG5hbWUKLWR5bk9wdGlvbk1lbnVXaWRnZXQucHkgICMgZGVmaW5lIG11dGFibGUgT3B0aW9uTWVudSB3aWRnZXQgKG5pbSkuCithdXRvY29tcGxldGUucHkgICAjIENvbXBsZXRlIGF0dHJpYnV0ZSBuYW1lcyBvciBmaWxlbmFtZXMuCithdXRvY29tcGxldGVfdy5weSAjIERpc3BsYXkgY29tcGxldGlvbnMuCithdXRvZXhwYW5kLnB5ICAgICAjIEV4cGFuZCB3b3JkIHdpdGggcHJldmlvdXMgd29yZCBpbiBmaWxlLgorYnJvd3Nlci5weSAgICAgICAgIyBDcmVhdGUgbW9kdWxlIGJyb3dzZXIgd2luZG93LgorY2FsbHRpcF93LnB5ICAgICAgIyBEaXNwbGF5IGNhbGx0aXAuCitjYWxsdGlwcy5weSAgICAgICAjIENyZWF0ZSBjYWxsdGlwIHRleHQuCitjb2RlY29udGV4dC5weSAgICAjIFNob3cgY29tcG91bmQgc3RhdGVtZW50IGhlYWRlcnMgb3RoZXJ3aXNlIG5vdCB2aXNpYmxlLgorY29sb3JpemVyLnB5ICAgICAgIyBDb2xvcml6ZSB0ZXh0IChuaW0pCitjb25maWcucHkgICAgICAgICAjIExvYWQsIGZldGNoLCBhbmQgc2F2ZSBjb25maWd1cmF0aW9uIChuaW0pLgorY29uZmlnZGlhbG9nLnB5ICAgIyBEaXNwbGF5IHVzZXIgY29uZmlndXJhdGlvbiBkaWFsb2dzLgorY29uZmlnX2hlbHAucHkgICAgIyBTcGVjaWZ5IGhlbHAgc291cmNlIGluIGNvbmZpZ2RpYWxvZy4KK2NvbmZpZ19rZXkucHkgICAgICMgQ2hhbmdlIGtleWJpbmRpbmdzLgorZHlub3B0aW9uLnB5ICAgICAgIyBEZWZpbmUgbXV0YWJsZSBPcHRpb25NZW51IHdpZGdldCAobmltKS4KK2RlYnVnb2JqLnB5ICAgICAgICMgRGVmaW5lIGNsYXNzIHVzZWQgaW4gc3RhY2t2aWV3ZXIuCitkZWJ1Z29ial9yLnB5ICAgICAjIENvbW11bmljYXRlIG9iamVjdHMgYmV0d2VlbiBwcm9jZXNzZXMgd2l0aCBycGMgKG5pbSkuCitkZWJ1Z2dlci5weSAgICAgICAjIERlYnVnIGNvZGUgcnVuIGZyb20gc2hlbGwgb3IgZWRpdG9yOyBzaG93IHdpbmRvdy4KK2RlYnVnZ2VyX3IucHkgICAgICMgRGVidWcgY29kZSBydW4gaW4gcmVtb3RlIHByb2Nlc3MuCitkZWxlZ2F0b3IucHkgICAgICAjIERlZmluZSBiYXNlIGNsYXNzIGZvciBkZWxlZ2F0b3JzIChuaW0pLgorZWRpdG9yLnB5ICAgICAgICAgIyBEZWZpbmUgbW9zdCBvZiBlZGl0b3IgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLgorZmlsZWxpc3QucHkgICAgICAgIyBPcGVuIGZpbGVzIGFuZCBtYW5hZ2UgbGlzdCBvZiBvcGVuIHdpbmRvd3MgKG5pbSkuCitncmVwLnB5ICAgICAgICAgICAjIEZpbmQgYWxsIG9jY3VycmVuY2VzIG9mIHBhdHRlcm4gaW4gbXVsdGlwbGUgZmlsZXMuCiBoZWxwLnB5ICAgICAgICAgICAjIERpc3BsYXkgSURMRSdzIGh0bWwgZG9jLgota2V5YmluZGluZ0RpYWxvZy5weSAgIyBDaGFuZ2Uga2V5YmluZGluZ3MuCi1tYWNvc3hTdXBwb3J0LnB5ICAjIEhlbHAgSURMRSBydW4gb24gTWFjcyAobmltKS4KK2hlbHBfYWJvdXQucHkgICAgICMgRGlzcGxheSBBYm91dCBJRExFIGRpYWxvZy4KK2hpc3RvcnkucHkgICAgICAgICMgR2V0IHByZXZpb3VzIG9yIG5leHQgdXNlciBpbnB1dCBpbiBzaGVsbCAobmltKQoraHlwZXJwYXJzZXIucHkgICAgIyBQYXJzZSBjb2RlIGFyb3VuZCBhIGdpdmVuIGluZGV4LgoraW9tZW51LnB5ICAgICAgICAgIyBPcGVuLCByZWFkLCBhbmQgd3JpdGUgZmlsZXMKK21hY29zeC5weSAgICAgICAgICMgSGVscCBJRExFIHJ1biBvbiBNYWNzIChuaW0pLgorbWFpbm1lbnUucHkgICAgICAgIyBEZWZpbmUgbW9zdCBvZiBJRExFIG1lbnUuCittdWx0aWNhbGwucHkgICAgICAjIFdyYXAgdGsgd2lkZ2V0IHRvIGFsbG93IG11bHRpcGxlIGNhbGxzIHBlciBldmVudCAobmltKS4KK291dHdpbi5weSAgICAgICAgICMgQ3JlYXRlIHdpbmRvdyBmb3IgZ3JlcCBvdXRwdXQuCitwYXJhZ3JhcGgucHkgICAgICAjIFJlLXdyYXAgbXVsdGlsaW5lIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgorcGFyZW5tYXRjaC5weSAgICAgIyBNYXRjaCBmZW5jZXBvc3RzOiAoKSwgW10sIGFuZCB7fS4KK3BhdGhicm93c2VyLnB5ICAgICMgQ3JlYXRlIHBhdGggYnJvd3NlciB3aW5kb3cuCitwZXJjb2xhdG9yLnB5ICAgICAjIE1hbmFnZSBkZWxlZ2F0b3Igc3RhY2sgKG5pbSkuCitweXBhcnNlLnB5ICAgICAgICAjIEdpdmUgaW5mb3JtYXRpb24gb24gY29kZSBpbmRlbnRhdGlvbgorcHlzaGVsbC5weSAgICAgICAgIyBTdGFydCBJRExFLCBtYW5hZ2Ugc2hlbGwsIGNvbXBsZXRlIGVkaXRvciB3aW5kb3cKK3F1ZXJ5LnB5ICAgICAgICAgICMgUXVlcnkgdXNlciBmb3IgaW5mb3JtYXRpb24KK3JlZGlyZWN0b3IucHkgICAgICMgSW50ZXJjZXB0IHdpZGdldCBzdWJjb21tYW5kcyAoZm9yIHBlcmNvbGF0b3IpIChuaW0pLgorcmVwbGFjZS5weSAgICAgICAgIyBTZWFyY2ggYW5kIHJlcGxhY2UgcGF0dGVybiBpbiB0ZXh0LgogcnBjLnB5ICAgICAgICAgICAgIyBDb21tdWljYXRlIGJldHdlZW4gaWRsZSBhbmQgdXNlciBwcm9jZXNzZXMgKG5pbSkuCityc3RyaXAucHkgICAgICAgICAjIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiBydW4ucHkgICAgICAgICAgICAjIE1hbmFnZSB1c2VyIGNvZGUgZXhlY3V0aW9uIHN1YnByb2Nlc3MuCitydW5zY3JpcHQucHkgICAgICAjIENoZWNrIGFuZCBydW4gdXNlciBjb2RlLgorc2Nyb2xsZWRsaXN0LnB5ICAgIyBEZWZpbmUgc2Nyb2xsZWRsaXN0IHdpZGdldCBmb3IgSURMRSAobmltKS4KK3NlYXJjaC5weSAgICAgICAgICMgU2VhcmNoIGZvciBwYXR0ZXJuIGluIHRleHQuCitzZWFyY2hiYXNlLnB5ICAgICAjIERlZmluZSBiYXNlIGZvciBzZWFyY2gsIHJlcGxhY2UsIGFuZCBncmVwIGRpYWxvZ3MuCitzZWFyY2hlbmdpbmUucHkgICAjIERlZmluZSBlbmdpbmUgZm9yIGFsbCAzIHNlYXJjaCBkaWFsb2dzLgorc3RhY2t2aWV3ZXIucHkgICAgIyBWaWV3IHN0YWNrIGFmdGVyIGV4Y2VwdGlvbi4KK3N0YXR1c2Jhci5weSAgICAgICMgRGVmaW5lIHN0YXR1cyBiYXIgZm9yIHdpbmRvd3MgKG5pbSkuCiB0YWJiZWRwYWdlcy5weSAgICAjIERlZmluZSB0YWJiZWQgcGFnZXMgd2lkZ2V0IChuaW0pLgotdGV4dFZpZXcucHkgICAgICAgIyBEZWZpbmUgcmVhZC1vbmx5IHRleHQgd2lkZ2V0IChuaW0pLgordGV4dHZpZXcucHkgICAgICAgIyBEZWZpbmUgcmVhZC1vbmx5IHRleHQgd2lkZ2V0IChuaW0pLgordHJlZS5weSAgICAgICAgICAgIyBEZWZpbmUgdHJlZSB3aWRnZXIsIHVzZWQgaW4gYnJvd3NlcnMgKG5pbSkuCit1bmRvLnB5ICAgICAgICAgICAjIE1hbmFnZSB1bmRvIHN0YWNrLgord2luZG93cy5weSAgICAgICAgIyBNYW5hZ2Ugd2luZG93IGxpc3QgYW5kIGRlZmluZSBsaXN0ZWQgdG9wIGxldmVsLgorem9vbWhlaWdodC5weSAgICAgIyBab29tIHdpbmRvdyB0byBmdWxsIGhlaWdodCBvZiBzY3JlZW4uCiAKIENvbmZpZ3VyYXRpb24KIC0tLS0tLS0tLS0tLS0KQEAgLTEwNCwxMjYgKzEwNCwxNDcgQEAKIAogU3ViZGlyZWN0b3JpZXMKIC0tLS0tLS0tLS0tLS0tCi1JY29ucyAgIyBzbWFsbCBpbWFnZSBmaWxlcwotaWRsZV90ZXN0ICAjIGZpbGVzIGZvciBodW1hbiB0ZXN0IGFuZCBhdXRvbWF0ZWQgdW5pdCB0ZXN0cworSWNvbnMgICAgICAgICMgc21hbGwgaW1hZ2UgZmlsZXMKK2lkbGVfdGVzdCAgICAjIGZpbGVzIGZvciBodW1hbiB0ZXN0IGFuZCBhdXRvbWF0ZWQgdW5pdCB0ZXN0cwogCiBVbnVzZWQgYW5kIERlcHJlY2F0ZWQgZmlsZXMgYW5kIG9iamVjdHMgKG5pbSkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRWRpdG9yV2luZG93LnB5OiBIZWxwZGlhbG9nIGFuZCBoZWxwRGlhbG9nCi1Ub29sVGlwLnB5OiB1bnVzZWQuCi1oZWxwLnR4dAotaWRsZXZlci5weQordG9vbHRpcC5weSAjIHVudXNlZAorCiAKIAogSURMRSBNRU5VUwotVG9wIGxldmVsIGl0ZW1zIGFuZCBtb3N0IHN1Ym1lbnUgaXRlbXMgYXJlIGRlZmluZWQgaW4gQmluZGluZ3MuCitUb3AgbGV2ZWwgaXRlbXMgYW5kIG1vc3Qgc3VibWVudSBpdGVtcyBhcmUgZGVmaW5lZCBpbiBtYWlubWVudS4KIEV4dGVuc3Rpb25zIGFkZCBzdWJtZW51IGl0ZW1zIHdoZW4gYWN0aXZlLiAgVGhlIG5hbWVzIGdpdmVuIGFyZQogZm91bmQsIHF1b3RlZCwgaW4gb25lIG9mIHRoZXNlIG1vZHVsZXMsIHBhaXJlZCB3aXRoIGEgJzw8cHNldWRvZXZlbnQ+PicuCiBFYWNoIHBzZXVkb2V2ZW50IGlzIGJvdW5kIHRvIGFuIGV2ZW50IGhhbmRsZXIuICBTb21lIGV2ZW50IGhhbmRsZXJzCiBjYWxsIGFub3RoZXIgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgd29yay4gIFRoZSBhbm5vdGF0aW9ucyBiZWxvdwogYXJlIGludGVuZGVkIHRvIGF0IGxlYXN0IGdpdmUgdGhlIG1vZHVsZSB3aGVyZSB0aGUgYWN0dWFsIHdvcmsgaXMgZG9uZS4KKydlRVcnID0gZWRpdG9yLkVkaXRvcldpbmRvdwogCi1GaWxlICAjIElPQmluZGlnIGV4Y2VwdCBhcyBub3RlZAotICBOZXcgRmlsZQotICBPcGVuLi4uICAjIElPQmluZGluZy5vcGVuCi0gIE9wZW4gTW9kdWxlCitGaWxlCisgIE5ldyBGaWxlICAgICAgICAgIyBlRVcubmV3X2NhbGxiYWNrCisgIE9wZW4uLi4gICAgICAgICAgIyBpb21lbnUub3BlbgorICBPcGVuIE1vZHVsZSAgICAgICMgZUV3Lm9wZW5fbW9kdWxlCiAgIFJlY2VudCBGaWxlcwotICBDbGFzcyBCcm93c2VyICAjIENsYXNzIEJyb3dzZXIKLSAgUGF0aCBCcm93c2VyICAjIFBhdGggQnJvd3NlcgorICBDbGFzcyBCcm93c2VyICAgICMgZUVXLm9wZW5fY2xhc3NfYnJvd3NlciwgYnJvd3Nlci5DbGFzc0Jyb3dzZXIKKyAgUGF0aCBCcm93c2VyICAgICAjIGVFVy5vcGVuX3BhdGhfYnJvd3NlciwgcGF0aGJyb3dzZXIKICAgLS0tCi0gIFNhdmUgICMgSURCaW5kaW5nLnNhdmUKLSAgU2F2ZSBBcy4uLiAgIyBJT0JpbmRpbmcuc2F2ZV9hcwotICBTYXZlIENvcHkgQXMuLi4gICMgSU9CaW5kbGluZy5zYXZlX2FfY29weQorICBTYXZlICAgICAgICAgICAgICMgaW9tZW51LnNhdmUKKyAgU2F2ZSBBcy4uLiAgICAgICAjIGlvbWVudS5zYXZlX2FzCisgIFNhdmUgQ29weSBBcy4uLiAgIyBpb21lbnUuc2F2ZV9hX2NvcHkKICAgLS0tCi0gIFByaW50IFdpbmRvdyAgIyBJT0JpbmRpbmcucHJpbnRfd2luZG93CisgIFByaW50IFdpbmRvdyAgICAgIyBpb21lbnUucHJpbnRfd2luZG93CiAgIC0tLQotICBDbG9zZQotICBFeGl0CisgIENsb3NlICAgICAgICAgICAgIyBlRVcuY2xvc2VfZXZlbnQKKyAgRXhpdCAgICAgICAgICAgICAjIGZsaXN0LmNsb3NlX2FsbF9jYWxsYmFjayAoYm91bmQgaW4gZUVXKQogCiBFZGl0Ci0gIFVuZG8gICMgdW5kb0RlbGVnYXRvcgotICBSZWRvICAjIHVuZG9EZWxlZ2F0b3IKLSAgLS0tCi0gIEN1dAotICBDb3B5Ci0gIFBhc3RlCi0gIFNlbGVjdCBBbGwKLSAgLS0tICAjIE5leHQgNSBpdGVtcyB1c2UgU2VhcmNoRW5naW5lOyBkaWFsb2dzIHVzZSBTZWFyY2hEaWFsb2dCYXNlCi0gIEZpbmQgICMgU2VhcmNoIERpYWxvZwotICBGaW5kIEFnYWluCi0gIEZpbmQgU2VsZWN0aW9uCi0gIEZpbmQgaW4gRmlsZXMuLi4gICMgR3JlcERpYWxvZwotICBSZXBsYWNlLi4uICAjIFJlcGxhY2VEaWFsb2cKLSAgR28gdG8gTGluZQotICBTaG93IENvbXBsZXRpb25zICAjIEF1dG9Db21wbGV0ZSBleHRlbnNpb24gYW5kIEF1dG9Db21wbGV0ZVdpZG93ICgmSFApCi0gIEV4cGFuZCBXb3JkICAjIEF1dG9FeHBhbmQgZXh0ZW5zaW9uCi0gIFNob3cgY2FsbCB0aXAgICMgQ2FsbHRpcHMgZXh0ZW5zaW9uIGFuZCBDYWxsdGlwV2luZG93ICgmIEh5cGVycGFyc2VyKQotICBTaG93IHN1cnJvdW5kaW5nIHBhcmVucyAgIyBQYXJlbk1hdGNoICgmIEh5cGVycGFyc2VyKQorICBVbmRvICAgICAgICAgICAgICMgdW5kb2RlbGVnYXRvcgorICBSZWRvICAgICAgICAgICAgICMgdW5kb2RlbGVnYXRvcgorICAtLS0gICAgICAgICAgICAgICMgZUVXLnJpZ2h0X21lbnVfZXZlbnQKKyAgQ3V0ICAgICAgICAgICAgICAjIGVFVy5jdXQKKyAgQ29weSAgICAgICAgICAgICAjIGVFVy5jb3B5CisgIFBhc3RlICAgICAgICAgICAgIyBlRVcucGFzdAorICBTZWxlY3QgQWxsICAgICAgICMgZUVXLnNlbGVjdF9hbGwgKCsgc2VlIGVFVy5yZW1vdmVfc2VsZWN0aW9uKQorICAtLS0gICAgICAgICAgICAgICMgTmV4dCA1IGl0ZW1zIHVzZSBzZWFyY2hlbmdpbmU7IGRpYWxvZ3MgdXNlIHNlYXJjaGJhc2UKKyAgRmluZCAgICAgICAgICAgICAjIGVFVy5maW5kX2V2ZW50LCBzZWFyY2guU2VhcmNoRGlhbG9nLmZpbmQKKyAgRmluZCBBZ2FpbiAgICAgICAjIGVFVy5maW5kX2FnYWluX2V2ZW50LCBzU0QuZmluZF9hZ2FpbgorICBGaW5kIFNlbGVjdGlvbiAgICMgZUVXLmZpbmRfc2VsZWN0aW9uX2V2ZW50LCBzU0QuZmluZF9zZWxlY3Rpb24KKyAgRmluZCBpbiBGaWxlcy4uLiAjIGVFVy5maW5kX2luX2ZpbGVzX2V2ZW50LCBncmVwCisgIFJlcGxhY2UuLi4gICAgICAgIyBlRVcucmVwbGFjZV9ldmVudCwgcmVwbGFjZS5SZXBsYWNlRGlhbG9nLnJlcGxhY2UKKyAgR28gdG8gTGluZSAgICAgICAjIGVFVy5nb3RvX2xpbmVfZXZlbnQKKyAgU2hvdyBDb21wbGV0aW9ucyAjIGF1dG9jb21wbGV0ZSBleHRlbnNpb24gYW5kIGF1dG9jb21wbGV0ZVdpZG93ICgmSFApCisgIEV4cGFuZCBXb3JkICAgICAgIyBhdXRvZXhwYW5kIGV4dGVuc2lvbgorICBTaG93IGNhbGwgdGlwICAgICMgQ2FsbHRpcHMgZXh0ZW5zaW9uIGFuZCBDYWxsdGlwV2luZG93ICgmIEh5cGVycGFyc2VyKQorICBTaG93IHN1cnJvdW5kaW5nIHBhcmVucyAgIyBwYXJlbm1hdGNoICgmIEh5cGVycGFyc2VyKQogCi1TaGVsbCAgIyBQeVNoZWxsCi0gIFZpZXcgTGFzdCBSZXN0YXJ0ICAjIFB5U2hlbGwuPwotICBSZXN0YXJ0IFNoZWxsICAjIFB5U2hlbGwuPworU2hlbGwgICMgcHlzaGVsbAorICBWaWV3IExhc3QgUmVzdGFydCMgcHlzaGVsbC4/CisgIFJlc3RhcnQgU2hlbGwgICAgIyBweXNoZWxsLj8KIAogRGVidWcgKFNoZWxsIG9ubHkpCiAgIEdvIHRvIEZpbGUvTGluZQotICBEZWJ1Z2dlciAgIyBEZWJ1Z2dlciwgUmVtb3RlRGVidWdnZXIKLSAgU3RhY2sgVmlld2VyICAjIFN0YWNrVmlld2VyCi0gIEF1dG8tb3BlbiBTdGFjayBWaWV3ZXIgICMgU3RhY2tWaWV3ZXIKKyAgZGVidWdnZXIgICAgICAgICAjIGRlYnVnZ2VyLCBkZWJ1Z2dlcl9yCisgIFN0YWNrIFZpZXdlciAgICAgIyBzdGFja3ZpZXdlcgorICBBdXRvLW9wZW4gU3RhY2sgVmlld2VyICAjIHN0YWNrdmlld2VyCiAKIEZvcm1hdCAoRWRpdG9yIG9ubHkpCi0gIEluZGVudCBSZWdpb24KLSAgRGVkZW50IFJlZ2lvbgotICBDb21tZW50IE91dCBSZWdpb24KLSAgVW5jb21tZW50IFJlZ2lvbgotICBUYWJpZnkgUmVnaW9uCi0gIFVudGFiaWZ5IFJlZ2lvbgotICBUb2dnbGUgVGFicwotICBOZXcgSW5kZW50IFdpZHRoCi0gIEZvcm1hdCBQYXJhZ3JhcGggICMgRm9ybWF0UGFyYWdyYXBoIGV4dGVuc2lvbgorICBJbmRlbnQgUmVnaW9uICAgICMgZUVXLmluZGVudF9yZWdpb25fZXZlbnQKKyAgRGVkZW50IFJlZ2lvbiAgICAjIGVFVy5kZWRlbnRfcmVnaW9uX2V2ZW50CisgIENvbW1lbnQgT3V0IFJlZy4gIyBlRVcuY29tbWVudF9yZWdpb25fZXZlbnQKKyAgVW5jb21tZW50IFJlZ2lvbiAjIGVFVy51bmNvbW1lbnRfcmVnaW9uX2V2ZW50CisgIFRhYmlmeSBSZWdpb24gICAgIyBlRVcudGFiaWZ5X3JlZ2lvbl9ldmVudAorICBVbnRhYmlmeSBSZWdpb24gICMgZUVXLnVudGFiaWZ5X3JlZ2lvbl9ldmVudAorICBUb2dnbGUgVGFicyAgICAgICMgZUVXLnRvZ2dsZV90YWJzX2V2ZW50CisgIE5ldyBJbmRlbnQgV2lkdGggIyBlRVcuY2hhbmdlX2luZGVudHdpZHRoX2V2ZW50CisgIEZvcm1hdCBQYXJhZ3JhcGggIyBwYXJhZ3JhcGggZXh0ZW5zaW9uCiAgIC0tLQotICBTdHJpcCB0YWlsaW5nIHdoaXRlc3BhY2UgICMgUnN0cmlwRXh0ZW5zaW9uIGV4dGVuc2lvbgorICBTdHJpcCB0YWlsaW5nIHdoaXRlc3BhY2UgICMgcnN0cmlwIGV4dGVuc2lvbgogCiBSdW4gKEVkaXRvciBvbmx5KQotICBQeXRob24gU2hlbGwgICMgUHlTaGVsbAorICBQeXRob24gU2hlbGwgICAgICMgcHlzaGVsbAogICAtLS0KLSAgQ2hlY2sgTW9kdWxlICAjIFNjcmlwdEJpbmRpbmcKLSAgUnVuIE1vZHVsZSAgIyBTY3JpcHRCaW5kaW5nCisgIENoZWNrIE1vZHVsZSAgICAgIyBydW5zY3JpcHQKKyAgUnVuIE1vZHVsZSAgICAgICAjIHJ1bnNjcmlwdAogCiBPcHRpb25zCi0gIENvbmZpZ3VyZSBJRExFICAjIGNvbmZpZ0RpYWxvZworICBDb25maWd1cmUgSURMRSAgICMgZUVXLmNvbmZpZ19kaWFsb2csIGNvbmZpZ2RpYWxvZwogICAgICh0YWJzIGluIHRoZSBkaWFsb2cpCi0gICAgRm9udCB0YWIgICMgb25maWctbWFpbi5kZWYKLSAgICBIaWdobGlnaHQgdGFiICAjIGNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLCBjb25maWctaGlnaGxpZ2h0LmRlZgotICAgIEtleXMgdGFiICAjIGtleWJpbmRpbmdEaWFsb2csIGNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLCBvbmZpZy1rZXVzLmRlZgotICAgIEdlbmVyYWwgdGFiICAjIGNvbmZpZ0hlbHBTb3VyY2VFZGl0LCBjb25maWctbWFpbi5kZWYKLSAgQ29uZmlndXJlIEV4dGVuc2lvbnMgICMgY29uZmlnRGlhbG9nCi0gICAgWHl6IHRhYiAgIyB4eXoucHksIGNvbmZpZy1leHRlbnNpb25zLmRlZgorICAgIEZvbnQgdGFiICAgICAgICMgY29uZmlnLW1haW4uZGVmCisgICAgSGlnaGxpZ2h0IHRhYiAgIyBxdWVyeSwgY29uZmlnLWhpZ2hsaWdodC5kZWYKKyAgICBLZXlzIHRhYiAgICAgICAjIHF1ZXJ5LCBjb25maWdfa2V5LCBjb25maWdfa2V5cy5kZWYKKyAgICBHZW5lcmFsIHRhYiAgICAjIGNvbmZpZ19oZWxwLCBjb25maWctbWFpbi5kZWYKKyAgICBFeHRlbnNpb25zIHRhYiAjIGNvbmZpZy1leHRlbnNpb25zLmRlZiwgY29ycmVzcG9uZGluZyAucHkKICAgLS0tCi0gIENvZGUgQ29udGV4dCAoZWRpdG9yIG9ubHkpICAjIENvZGVDb250ZXh0IGV4dGVuc2lvbgorICBDb2RlIENvbnRleHQgKGVkKSMgY29kZWNvbnRleHQgZXh0ZW5zaW9uCiAKIFdpbmRvdwotICBab29taGVpZ2h0ICAjIFpvb21IZWlnaHQgZXh0ZW5zaW9uCisgIFpvb21oZWlnaHQgICAgICAgIyB6b29taGVpZ2h0IGV4dGVuc2lvbgogICAtLS0KLSAgPG9wZW4gd2luZG93cz4gICMgV2luZG93TGlzdAorICA8b3BlbiB3aW5kb3dzPiAgICMgd2luZG93cwogCiBIZWxwCi0gIEFib3V0IElETEUgICMgYWJvdXREaWFsb2cKKyAgQWJvdXQgSURMRSAgICAgICAjIGVFVy5hYm91dF9kaWFsb2csIGhlbHBfYWJvdXQuQWJvdXREaWFsb2cgCiAgIC0tLQotICBJRExFIEhlbHAgICMgaGVscAotICBQeXRob24gRG9jCi0gIFR1cnRsZSBEZW1vCisgIElETEUgSGVscCAgICAgICAgIyBlRVcuaGVscF9kaWFsb2csIGhlbHBzaG93X2lkbGVoZWxwCisgIFB5dGhvbiBEb2MgICAgICAgIyBlRVcucHl0aG9uX2RvY3MKKyAgVHVydGxlIERlbW8gICAgICAjIGVFVy5vcGVuX3R1cnRsZV9kZW1vCiAgIC0tLQogICA8b3RoZXIgaGVscCBzb3VyY2VzPgogCiA8Q29udGV4dCBNZW51PiAocmlnaHQgY2xpY2spCi1EZWZpbmVkIGluIEVkaXRvcldpbmRvdywgUHlTaGVsbCwgT3V0cHV0Ci0gICBDdXQKLSAgIENvcHkKLSAgIFBhc3RlCi0gICAtLS0KLSAgIEdvIHRvIGZpbGUvbGluZSAoc2hlbGwgYW5kIG91dHB1dCBvbmx5KQotICAgU2V0IEJyZWFrcG9pbnQgKGVkaXRvciBvbmx5KQotICAgQ2xlYXIgQnJlYWtwb2ludCAoZWRpdG9yIG9ubHkpCi0gRGVmaW5lZCBpbiBEZWJ1Z2dlcgotICAgR28gdG8gc291cmNlIGxpbmUKLSAgIFNob3cgc3RhY2sgZnJhbWUKKyAgRGVmaW5lZCBpbiBlZGl0b3IsIFB5U2hlbHB5c2hlbGx1dAorICAgIEN1dAorICAgIENvcHkKKyAgICBQYXN0ZQorICAgIC0tLQorICAgIEdvIHRvIGZpbGUvbGluZSAoc2hlbGwgYW5kIG91dHB1dCBvbmx5KQorICAgIFNldCBCcmVha3BvaW50IChlZGl0b3Igb25seSkKKyAgICBDbGVhciBCcmVha3BvaW50IChlZGl0b3Igb25seSkKKyAgRGVmaW5lZCBpbiBkZWJ1Z2dlcgorICAgIEdvIHRvIHNvdXJjZSBsaW5lCisgICAgU2hvdyBzdGFjayBmcmFtZQorCis8Tm8gbWVudT4KK0NlbnRlciBJbnNlcnQgICAgICAjIGVFVy5jZW50ZXJfaW5zZXJ0X2V2ZW50CisKKyAgCitDT0RFIFNUWUxFIC0tIEdlbmVyYWxseSBQRVAgOC4KKworaW1wb3J0CistLS0tLS0KK1B1dCBpbXBvcnQgYXQgdGhlIHRvcCwgdW5sZXNzIHRoZXJlIGlzIGEgZ29vZCByZWFzb24gb3RoZXJ3aXNlLgorUEVQIDggc2F5cyB0byBncm91cCBzdGRsaWIsIDNyZC1wYXJ0eSBkZXBlbmRlbmNpZXMsIGFuZCBwYWNrYWdlIGltcG9ydHMuCitGb3IgaWRsZWxpYiwgdGhlIGdyb3VwcyBhcmUgZ2VuZXJhbCBzdGRsaWIsIHRraW50ZXIsIGFuZCBpZGxlbGliLgorU29ydCBtb2R1bGVzIHdpdGhpbiBlYWNoIGdyb3VwLCBleGNlcHQgdGhhdCB0a2ludGVyLnR0ayBmb2xsb3dzIHRraW50ZXIuCitTb3J0ICdmcm9tIGlkbGVsaWIgaW1wb3J0IG1vZDEnIGFuZCAnZnJvbSBpZGxlbGliLm1vZDIgaW1wb3J0IG9iamVjdCcKK3RvZ2V0aGVyIGJ5IG1vZHVsZSwgaWdub3Jpbmcgd2l0aGluIG1vZHVsZSBvYmplY3RzLgorUHV0ICdpbXBvcnQgX19tYWluX18nIGFmdGVyIG90aGVyIGlkbGVsaWIgaW1wb3J0cy4KKworSW1wb3J0cyBvbmx5IG5lZWRlZCBmb3IgdGVzdGluZyBhcmUgcHV0IG5vdCBhdCB0aGUgdG9wIGJ1dCBpbiBhbgoraHRlc3QgZnVuY3Rpb24gZGVmIG9yICJpZiBfX25hbWVfXyA9PSAnX19tYWluX18nIiBjbGF1c2UuCisKK1dpdGhpbiBtb2R1bGUgaW1wb3J0cyBsaWtlICJmcm9tIGlkbGVsaWIubW9kIGltcG9ydCBjbGFzcyIgbWF5IGNhdXNlCitjaXJjdWxhciBpbXBvcnRzIHRvIGRlYWRsb2NrLiAgRXZlbiB3aXRob3V0IHRoaXMsIGNpcmN1bGFyIGltcG9ydHMgbWF5CityZXF1aXJlIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW1wb3J0cyB0byBiZSBkZWxheWVkIHVudGlsIGEgZnVuY3Rpb24gY2FsbC4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL19faW5pdF9fLnB5IGIvTGliL2lkbGVsaWIvX19pbml0X18ucHkKaW5kZXggNzExZjYxYi4uNzkxZGRlYSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvX19pbml0X18ucHkKKysrIGIvTGliL2lkbGVsaWIvX19pbml0X18ucHkKQEAgLTEsOCArMSwxMCBAQAogIiIiVGhlIGlkbGVsaWIgcGFja2FnZSBpbXBsZW1lbnRzIHRoZSBJZGxlIGFwcGxpY2F0aW9uLgogCiBJZGxlIGluY2x1ZGVzIGFuIGludGVyYWN0aXZlIHNoZWxsIGFuZCBlZGl0b3IuCitTdGFydGluZyB3aXRoIFB5dGhvbiAzLjYsIElETEUgcmVxdWlyZXMgdGNsL3RrIDguNSBvciBsYXRlci4KIFVzZSB0aGUgZmlsZXMgbmFtZWQgaWRsZS4qIHRvIHN0YXJ0IElkbGUuCiAKIFRoZSBvdGhlciBmaWxlcyBhcmUgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbnMuICBUaGVpciBkZXRhaWxzIGFyZSBzdWJqZWN0IHRvCiBjaGFuZ2UuICBTZWUgUEVQIDQzNCBmb3IgbW9yZS4gIEltcG9ydCB0aGVtIGF0IHlvdXIgb3duIHJpc2suCiAiIiIKK3Rlc3RpbmcgPSBGYWxzZSAgIyBTZXQgVHJ1ZSBieSB0ZXN0LnRlc3RfaWRsZS4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL19fbWFpbl9fLnB5IGIvTGliL2lkbGVsaWIvX19tYWluX18ucHkKaW5kZXggMmVkZjVmNy4uNjM0OWVjNyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvX19tYWluX18ucHkKKysrIGIvTGliL2lkbGVsaWIvX19tYWluX18ucHkKQEAgLTMsNiArMyw2IEBACiAKIFJ1biBJRExFIGFzIHB5dGhvbiAtbSBpZGxlbGliCiAiIiIKLWltcG9ydCBpZGxlbGliLlB5U2hlbGwKLWlkbGVsaWIuUHlTaGVsbC5tYWluKCkKK2ltcG9ydCBpZGxlbGliLnB5c2hlbGwKK2lkbGVsaWIucHlzaGVsbC5tYWluKCkKICMgVGhpcyBmaWxlIGRvZXMgbm90IHdvcmsgZm9yIDIuNzsgU2VlIGlzc3VlIDI0MjEyLgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQXV0b0NvbXBsZXRlLnB5IGIvTGliL2lkbGVsaWIvYXV0b2NvbXBsZXRlLnB5CnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0F1dG9Db21wbGV0ZS5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvYXV0b2NvbXBsZXRlLnB5CmluZGV4IGZmMDg1ZDUuLjFlNDRmYTUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0F1dG9Db21wbGV0ZS5weQorKysgYi9MaWIvaWRsZWxpYi9hdXRvY29tcGxldGUucHkKQEAgLTEsMjkgKzEsMzAgQEAKLSIiIkF1dG9Db21wbGV0ZS5weSAtIEFuIElETEUgZXh0ZW5zaW9uIGZvciBhdXRvbWF0aWNhbGx5IGNvbXBsZXRpbmcgbmFtZXMuCisiIiJhdXRvY29tcGxldGUucHkgLSBBbiBJRExFIGV4dGVuc2lvbiBmb3IgYXV0b21hdGljYWxseSBjb21wbGV0aW5nIG5hbWVzLgogCiBUaGlzIGV4dGVuc2lvbiBjYW4gY29tcGxldGUgZWl0aGVyIGF0dHJpYnV0ZSBuYW1lcyBvciBmaWxlIG5hbWVzLiBJdCBjYW4gcG9wCiBhIHdpbmRvdyB3aXRoIGFsbCBhdmFpbGFibGUgbmFtZXMsIGZvciB0aGUgdXNlciB0byBzZWxlY3QgZnJvbS4KICIiIgogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgc3RyaW5nCitpbXBvcnQgc3lzCiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotCi0jIFRoaXMgc3RyaW5nIGluY2x1ZGVzIGFsbCBjaGFycyB0aGF0IG1heSBiZSBpbiBhbiBpZGVudGlmaWVyCi1JRF9DSEFSUyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICJfIgotCi0jIFRoZXNlIGNvbnN0YW50cyByZXByZXNlbnQgdGhlIHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgY29tcGxldGlvbnMKKyMgVGhlc2UgY29uc3RhbnRzIHJlcHJlc2VudCB0aGUgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBjb21wbGV0aW9ucy4KKyMgVGhleSBtdXN0IGJlIGRlZmluZWQgaGVyZSBzbyBhdXRvY29tcGxlX3cgY2FuIGltcG9ydCB0aGVtLgogQ09NUExFVEVfQVRUUklCVVRFUywgQ09NUExFVEVfRklMRVMgPSByYW5nZSgxLCAyKzEpCiAKLWZyb20gaWRsZWxpYiBpbXBvcnQgQXV0b0NvbXBsZXRlV2luZG93Ci1mcm9tIGlkbGVsaWIuSHlwZXJQYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCi0KK2Zyb20gaWRsZWxpYiBpbXBvcnQgYXV0b2NvbXBsZXRlX3cKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuaHlwZXJwYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCiBpbXBvcnQgX19tYWluX18KIAorIyBUaGlzIHN0cmluZyBpbmNsdWRlcyBhbGwgY2hhcnMgdGhhdCBtYXkgYmUgaW4gYW4gaWRlbnRpZmllci4KKyMgVE9ETyBVcGRhdGUgdGhpcyBoZXJlIGFuZCBlbHNld2hlcmUuCitJRF9DSEFSUyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICJfIgorCiBTRVBTID0gb3Muc2VwCiBpZiBvcy5hbHRzZXA6ICAjIGUuZy4gJy8nIG9uIFdpbmRvd3MuLi4KICAgICBTRVBTICs9IG9zLmFsdHNlcAogCisKIGNsYXNzIEF1dG9Db21wbGV0ZToKIAogICAgIG1lbnVkZWZzID0gWwpAQCAtMzcsMTkgKzM4LDE3IEBACiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbj1Ob25lKToKICAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgotICAgICAgICBpZiBlZGl0d2luIGlzIE5vbmU6ICAjIHN1YnByb2Nlc3MgYW5kIHRlc3QKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnRleHQgPSBlZGl0d2luLnRleHQKLSAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cgPSBOb25lCi0KLSAgICAgICAgIyBpZCBvZiBkZWxheWVkIGNhbGwsIGFuZCB0aGUgaW5kZXggb2YgdGhlIHRleHQgaW5zZXJ0IHdoZW4gdGhlIGRlbGF5ZWQKLSAgICAgICAgIyBjYWxsIHdhcyBpc3N1ZWQuIElmIF9kZWxheWVkX2NvbXBsZXRpb25faWQgaXMgTm9uZSwgdGhlcmUgaXMgbm8KLSAgICAgICAgIyBkZWxheWVkIGNhbGwuCi0gICAgICAgIHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pZCA9IE5vbmUKLSAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2luZGV4ID0gTm9uZQorICAgICAgICBpZiBlZGl0d2luIGlzIG5vdCBOb25lOiAgIyBub3QgaW4gc3VicHJvY2VzcyBvciB0ZXN0CisgICAgICAgICAgICBzZWxmLnRleHQgPSBlZGl0d2luLnRleHQKKyAgICAgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRld2luZG93ID0gTm9uZQorICAgICAgICAgICAgIyBpZCBvZiBkZWxheWVkIGNhbGwsIGFuZCB0aGUgaW5kZXggb2YgdGhlIHRleHQgaW5zZXJ0IHdoZW4KKyAgICAgICAgICAgICMgdGhlIGRlbGF5ZWQgY2FsbCB3YXMgaXNzdWVkLiBJZiBfZGVsYXllZF9jb21wbGV0aW9uX2lkIGlzCisgICAgICAgICAgICAjIE5vbmUsIHRoZXJlIGlzIG5vIGRlbGF5ZWQgY2FsbC4KKyAgICAgICAgICAgIHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pZCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pbmRleCA9IE5vbmUKIAogICAgIGRlZiBfbWFrZV9hdXRvY29tcGxldGVfd2luZG93KHNlbGYpOgotICAgICAgICByZXR1cm4gQXV0b0NvbXBsZXRlV2luZG93LkF1dG9Db21wbGV0ZVdpbmRvdyhzZWxmLnRleHQpCisgICAgICAgIHJldHVybiBhdXRvY29tcGxldGVfdy5BdXRvQ29tcGxldGVXaW5kb3coc2VsZi50ZXh0KQogCiAgICAgZGVmIF9yZW1vdmVfYXV0b2NvbXBsZXRlX3dpbmRvdyhzZWxmLCBldmVudD1Ob25lKToKICAgICAgICAgaWYgc2VsZi5hdXRvY29tcGxldGV3aW5kb3c6CkBAIC04MCwxNiArNzksMTcgQEAKICAgICAgICAgb3BlbiBhIGNvbXBsZXRpb24gbGlzdCBhZnRlciB0aGF0IChpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCiAgICAgICAgIGNvbXBsZXRpb24pCiAgICAgICAgICIiIgotICAgICAgICBpZiBoYXNhdHRyKGV2ZW50LCAibWNfc3RhdGUiKSBhbmQgZXZlbnQubWNfc3RhdGU6Ci0gICAgICAgICAgICAjIEEgbW9kaWZpZXIgd2FzIHByZXNzZWQgYWxvbmcgd2l0aCB0aGUgdGFiLCBjb250aW51ZSBhcyB1c3VhbC4KLSAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBoYXNhdHRyKGV2ZW50LCAibWNfc3RhdGUiKSBhbmQgZXZlbnQubWNfc3RhdGUgb3JcCisgICAgICAgICAgICAgICAgbm90IHNlbGYudGV4dC5nZXQoImluc2VydCBsaW5lc3RhcnQiLCAiaW5zZXJ0Iikuc3RyaXAoKToKKyAgICAgICAgICAgICMgQSBtb2RpZmllciB3YXMgcHJlc3NlZCBhbG9uZyB3aXRoIHRoZSB0YWIgb3IKKyAgICAgICAgICAgICMgdGhlcmUgaXMgb25seSBwcmV2aW91cyB3aGl0ZXNwYWNlIG9uIHRoaXMgbGluZSwgc28gdGFiLgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgaWYgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cgYW5kIHNlbGYuYXV0b2NvbXBsZXRld2luZG93LmlzX2FjdGl2ZSgpOgogICAgICAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cuY29tcGxldGUoKQogICAgICAgICAgICAgcmV0dXJuICJicmVhayIKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG9wZW5lZCA9IHNlbGYub3Blbl9jb21wbGV0aW9ucyhGYWxzZSwgVHJ1ZSwgVHJ1ZSkKLSAgICAgICAgICAgIGlmIG9wZW5lZDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICAgICAgcmV0dXJuICJicmVhayIgaWYgb3BlbmVkIGVsc2UgTm9uZQogCiAgICAgZGVmIF9vcGVuX2NvbXBsZXRpb25zX2xhdGVyKHNlbGYsICphcmdzKToKICAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2luZGV4ID0gc2VsZi50ZXh0LmluZGV4KCJpbnNlcnQiKQpAQCAtMTAxLDkgKzEwMSw4IEBACiAKICAgICBkZWYgX2RlbGF5ZWRfb3Blbl9jb21wbGV0aW9ucyhzZWxmLCAqYXJncyk6CiAgICAgICAgIHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pZCA9IE5vbmUKLSAgICAgICAgaWYgc2VsZi50ZXh0LmluZGV4KCJpbnNlcnQiKSAhPSBzZWxmLl9kZWxheWVkX2NvbXBsZXRpb25faW5kZXg6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5vcGVuX2NvbXBsZXRpb25zKCphcmdzKQorICAgICAgICBpZiBzZWxmLnRleHQuaW5kZXgoImluc2VydCIpID09IHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pbmRleDoKKyAgICAgICAgICAgIHNlbGYub3Blbl9jb21wbGV0aW9ucygqYXJncykKIAogICAgIGRlZiBvcGVuX2NvbXBsZXRpb25zKHNlbGYsIGV2YWxmdW5jcywgY29tcGxldGUsIHVzZXJXYW50c1dpbiwgbW9kZT1Ob25lKToKICAgICAgICAgIiIiRmluZCB0aGUgY29tcGxldGlvbnMgYW5kIGNyZWF0ZSB0aGUgQXV0b0NvbXBsZXRlV2luZG93LgpAQCAtMTQ4LDE3ICsxNDcsMTcgQEAKICAgICAgICAgICAgICAgICBjb21wX3doYXQgPSBocC5nZXRfZXhwcmVzc2lvbigpCiAgICAgICAgICAgICAgICAgaWYgbm90IGNvbXBfd2hhdCBvciBcCiAgICAgICAgICAgICAgICAgICAgKG5vdCBldmFsZnVuY3MgYW5kIGNvbXBfd2hhdC5maW5kKCcoJykgIT0gLTEpOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgY29tcF93aGF0ID0gIiIKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAogICAgICAgICBpZiBjb21wbGV0ZSBhbmQgbm90IGNvbXBfd2hhdCBhbmQgbm90IGNvbXBfc3RhcnQ6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIGNvbXBfbGlzdHMgPSBzZWxmLmZldGNoX2NvbXBsZXRpb25zKGNvbXBfd2hhdCwgbW9kZSkKICAgICAgICAgaWYgbm90IGNvbXBfbGlzdHNbMF06Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRld2luZG93ID0gc2VsZi5fbWFrZV9hdXRvY29tcGxldGVfd2luZG93KCkKICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdy5zaG93X3dpbmRvdygKICAgICAgICAgICAgICAgICBjb21wX2xpc3RzLCAiaW5zZXJ0LSVkYyIgJSBsZW4oY29tcF9zdGFydCksCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHkgYi9MaWIvaWRsZWxpYi9hdXRvY29tcGxldGVfdy5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2F1dG9jb21wbGV0ZV93LnB5CmluZGV4IDJlZTY4NzguLjMzNzRjNmUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weQorKysgYi9MaWIvaWRsZWxpYi9hdXRvY29tcGxldGVfdy5weQpAQCAtMSw5ICsxLDExIEBACiAiIiIKLUFuIGF1dG8tY29tcGxldGlvbiB3aW5kb3cgZm9yIElETEUsIHVzZWQgYnkgdGhlIEF1dG9Db21wbGV0ZSBleHRlbnNpb24KK0FuIGF1dG8tY29tcGxldGlvbiB3aW5kb3cgZm9yIElETEUsIHVzZWQgYnkgdGhlIGF1dG9jb21wbGV0ZSBleHRlbnNpb24KICIiIgogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1mcm9tIGlkbGVsaWIuTXVsdGlDYWxsIGltcG9ydCBNQ19TSElGVAotZnJvbSBpZGxlbGliLkF1dG9Db21wbGV0ZSBpbXBvcnQgQ09NUExFVEVfRklMRVMsIENPTVBMRVRFX0FUVFJJQlVURVMKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IFNjcm9sbGJhcgorCitmcm9tIGlkbGVsaWIuYXV0b2NvbXBsZXRlIGltcG9ydCBDT01QTEVURV9GSUxFUywgQ09NUExFVEVfQVRUUklCVVRFUworZnJvbSBpZGxlbGliLm11bHRpY2FsbCBpbXBvcnQgTUNfU0hJRlQKIAogSElERV9WSVJUVUFMX0VWRU5UX05BTUUgPSAiPDxhdXRvY29tcGxldGV3aW5kb3ctaGlkZT4+IgogSElERV9TRVFVRU5DRVMgPSAoIjxGb2N1c091dD4iLCAiPEJ1dHRvblByZXNzPiIpCkBAIC0zNCw4ICszNiw4IEBACiAgICAgICAgIHNlbGYuY29tcGxldGlvbnMgPSBOb25lCiAgICAgICAgICMgQSBsaXN0IHdpdGggbW9yZSBjb21wbGV0aW9ucywgb3IgTm9uZQogICAgICAgICBzZWxmLm1vcmVjb21wbGV0aW9ucyA9IE5vbmUKLSAgICAgICAgIyBUaGUgY29tcGxldGlvbiBtb2RlLiBFaXRoZXIgQXV0b0NvbXBsZXRlLkNPTVBMRVRFX0FUVFJJQlVURVMgb3IKLSAgICAgICAgIyBBdXRvQ29tcGxldGUuQ09NUExFVEVfRklMRVMKKyAgICAgICAgIyBUaGUgY29tcGxldGlvbiBtb2RlLiBFaXRoZXIgYXV0b2NvbXBsZXRlLkNPTVBMRVRFX0FUVFJJQlVURVMgb3IKKyAgICAgICAgIyBhdXRvY29tcGxldGUuQ09NUExFVEVfRklMRVMKICAgICAgICAgc2VsZi5tb2RlID0gTm9uZQogICAgICAgICAjIFRoZSBjdXJyZW50IGNvbXBsZXRpb24gc3RhcnQsIG9uIHRoZSB0ZXh0IGJveCAoYSBzdHJpbmcpCiAgICAgICAgIHNlbGYuc3RhcnQgPSBOb25lCkBAIC0yMTUsNiArMjE3LDcgQEAKICAgICAgICAgc2VsZi53aW5jb25maWdpZCA9IGFjdy5iaW5kKFdJTkNPTkZJR19TRVFVRU5DRSwgc2VsZi53aW5jb25maWdfZXZlbnQpCiAgICAgICAgIHNlbGYuZG91YmxlY2xpY2tpZCA9IGxpc3Rib3guYmluZChET1VCTEVDTElDS19TRVFVRU5DRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZG91YmxlY2xpY2tfZXZlbnQpCisgICAgICAgIHJldHVybiBOb25lCiAKICAgICBkZWYgd2luY29uZmlnX2V2ZW50KHNlbGYsIGV2ZW50KToKICAgICAgICAgaWYgbm90IHNlbGYuaXNfYWN0aXZlKCk6CkBAIC0yMzgsMTYgKzI0MSwxNCBAQAogICAgICAgICBhY3cud21fZ2VvbWV0cnkoIislZCslZCIgJSAobmV3X3gsIG5ld195KSkKIAogICAgIGRlZiBoaWRlX2V2ZW50KHNlbGYsIGV2ZW50KToKLSAgICAgICAgaWYgbm90IHNlbGYuaXNfYWN0aXZlKCk6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5oaWRlX3dpbmRvdygpCisgICAgICAgIGlmIHNlbGYuaXNfYWN0aXZlKCk6CisgICAgICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKIAogICAgIGRlZiBsaXN0c2VsZWN0X2V2ZW50KHNlbGYsIGV2ZW50KToKLSAgICAgICAgaWYgbm90IHNlbGYuaXNfYWN0aXZlKCk6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi51c2Vyd2FudHN3aW5kb3cgPSBUcnVlCi0gICAgICAgIGN1cnNlbCA9IGludChzZWxmLmxpc3Rib3guY3Vyc2VsZWN0aW9uKClbMF0pCi0gICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLmNvbXBsZXRpb25zW2N1cnNlbF0pCisgICAgICAgIGlmIHNlbGYuaXNfYWN0aXZlKCk6CisgICAgICAgICAgICBzZWxmLnVzZXJ3YW50c3dpbmRvdyA9IFRydWUKKyAgICAgICAgICAgIGN1cnNlbCA9IGludChzZWxmLmxpc3Rib3guY3Vyc2VsZWN0aW9uKClbMF0pCisgICAgICAgICAgICBzZWxmLl9jaGFuZ2Vfc3RhcnQoc2VsZi5jb21wbGV0aW9uc1tjdXJzZWxdKQogCiAgICAgZGVmIGRvdWJsZWNsaWNrX2V2ZW50KHNlbGYsIGV2ZW50KToKICAgICAgICAgIyBQdXQgdGhlIHNlbGVjdGVkIGNvbXBsZXRpb24gaW4gdGhlIHRleHQsIGFuZCBjbG9zZSB0aGUgbGlzdApAQCAtMjU3LDcgKzI1OCw3IEBACiAKICAgICBkZWYga2V5cHJlc3NfZXZlbnQoc2VsZiwgZXZlbnQpOgogICAgICAgICBpZiBub3Qgc2VsZi5pc19hY3RpdmUoKToKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAga2V5c3ltID0gZXZlbnQua2V5c3ltCiAgICAgICAgIGlmIGhhc2F0dHIoZXZlbnQsICJtY19zdGF0ZSIpOgogICAgICAgICAgICAgc3RhdGUgPSBldmVudC5tY19zdGF0ZQpAQCAtMjgyLDcgKzI4Myw3IEBACiAgICAgICAgICAgICAgICAgIyBrZXlzeW0gPT0gIkJhY2tTcGFjZSIKICAgICAgICAgICAgICAgICBpZiBsZW4oc2VsZi5zdGFydCkgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5oaWRlX3dpbmRvdygpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLnN0YXJ0WzotMV0pCiAgICAgICAgICAgICBzZWxmLmxhc3R0eXBlZHN0YXJ0ID0gc2VsZi5zdGFydAogICAgICAgICAgICAgc2VsZi5saXN0Ym94LnNlbGVjdF9jbGVhcigwLCBpbnQoc2VsZi5saXN0Ym94LmN1cnNlbGVjdGlvbigpWzBdKSkKQEAgLTI5Miw3ICsyOTMsNyBAQAogCiAgICAgICAgIGVsaWYga2V5c3ltID09ICJSZXR1cm4iOgogICAgICAgICAgICAgc2VsZi5oaWRlX3dpbmRvdygpCi0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiBOb25lCiAKICAgICAgICAgZWxpZiAoc2VsZi5tb2RlID09IENPTVBMRVRFX0FUVFJJQlVURVMgYW5kIGtleXN5bSBpbgogICAgICAgICAgICAgICAoInBlcmlvZCIsICJzcGFjZSIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJicmFja2V0bGVmdCIsCkBAIC0zMDgsNyArMzA5LDcgQEAKICAgICAgICAgICAgICAgIGFuZCAoc2VsZi5tb2RlID09IENPTVBMRVRFX0FUVFJJQlVURVMgb3Igc2VsZi5zdGFydCk6CiAgICAgICAgICAgICAgICAgc2VsZi5fY2hhbmdlX3N0YXJ0KHNlbGYuY29tcGxldGlvbnNbY3Vyc2VsXSkKICAgICAgICAgICAgIHNlbGYuaGlkZV93aW5kb3coKQotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgICAgIGVsaWYga2V5c3ltIGluICgiSG9tZSIsICJFbmQiLCAiUHJpb3IiLCAiTmV4dCIsICJVcCIsICJEb3duIikgYW5kIFwKICAgICAgICAgICAgICBub3Qgc3RhdGU6CkBAIC0zNDksMTIgKzM1MCwxMiBAQAogICAgICAgICAgICAgICAgICMgZmlyc3QgdGFiOyBsZXQgQXV0b0NvbXBsZXRlIGhhbmRsZSB0aGUgY29tcGxldGlvbgogICAgICAgICAgICAgICAgIHNlbGYudXNlcndhbnRzd2luZG93ID0gVHJ1ZQogICAgICAgICAgICAgICAgIHNlbGYubGFzdGtleV93YXNfdGFiID0gVHJ1ZQotICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAKICAgICAgICAgZWxpZiBhbnkocyBpbiBrZXlzeW0gZm9yIHMgaW4gKCJTaGlmdCIsICJDb250cm9sIiwgIkFsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWV0YSIsICJDb21tYW5kIiwgIk9wdGlvbiIpKToKICAgICAgICAgICAgICMgQSBtb2RpZmllciBrZXksIHNvIGlnbm9yZQotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgICAgIGVsaWYgZXZlbnQuY2hhciBhbmQgZXZlbnQuY2hhciA+PSAnICc6CiAgICAgICAgICAgICAjIFJlZ3VsYXIgY2hhcmFjdGVyIHdpdGggYSBub24tbGVuZ3RoLTEga2V5Y29kZQpAQCAtMzY4LDcgKzM2OSw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAjIFVua25vd24gZXZlbnQsIGNsb3NlIHRoZSB3aW5kb3cgYW5kIGxldCBpdCB0aHJvdWdoLgogICAgICAgICAgICAgc2VsZi5oaWRlX3dpbmRvdygpCi0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiBOb25lCiAKICAgICBkZWYga2V5cmVsZWFzZV9ldmVudChzZWxmLCBldmVudCk6CiAgICAgICAgIGlmIG5vdCBzZWxmLmlzX2FjdGl2ZSgpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQXV0b0V4cGFuZC5weSBiL0xpYi9pZGxlbGliL2F1dG9leHBhbmQucHkKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQXV0b0V4cGFuZC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvYXV0b2V4cGFuZC5weQppbmRleCA3MDU5MDU0Li42YjQ2YmVlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9BdXRvRXhwYW5kLnB5CisrKyBiL0xpYi9pZGxlbGliL2F1dG9leHBhbmQucHkKQEAgLTEyLDggKzEyLDggQEAKIAogVGhpcyBpcyBhbiBleHRlbnNpb24gZmlsZSBhbmQgdGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgQXV0b0V4cGFuZC4KICcnJwotaW1wb3J0IHN0cmluZwogaW1wb3J0IHJlCitpbXBvcnQgc3RyaW5nCiAKICMjIyQgZXZlbnQgPDxleHBhbmQtd29yZD4+CiAjIyMkIHdpbiA8QWx0LXNsYXNoPgpAQCAtMzEsNiArMzEsNyBAQAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW4pOgogICAgICAgICBzZWxmLnRleHQgPSBlZGl0d2luLnRleHQKKyAgICAgICAgc2VsZi5iZWxsID0gc2VsZi50ZXh0LmJlbGwKICAgICAgICAgc2VsZi5zdGF0ZSA9IE5vbmUKIAogICAgIGRlZiBleHBhbmRfd29yZF9ldmVudChzZWxmLCBldmVudCk6CkBAIC00NiwxNCArNDcsMTQgQEAKICAgICAgICAgICAgICAgICB3b3JkcyA9IHNlbGYuZ2V0d29yZHMoKQogICAgICAgICAgICAgICAgIGluZGV4ID0gMAogICAgICAgICBpZiBub3Qgd29yZHM6Ci0gICAgICAgICAgICBzZWxmLnRleHQuYmVsbCgpCisgICAgICAgICAgICBzZWxmLmJlbGwoKQogICAgICAgICAgICAgcmV0dXJuICJicmVhayIKICAgICAgICAgd29yZCA9IHNlbGYuZ2V0cHJldndvcmQoKQogICAgICAgICBzZWxmLnRleHQuZGVsZXRlKCJpbnNlcnQgLSAlZCBjaGFycyIgJSBsZW4od29yZCksICJpbnNlcnQiKQogICAgICAgICBuZXd3b3JkID0gd29yZHNbaW5kZXhdCiAgICAgICAgIGluZGV4ID0gKGluZGV4ICsgMSkgJSBsZW4od29yZHMpCiAgICAgICAgIGlmIGluZGV4ID09IDA6Ci0gICAgICAgICAgICBzZWxmLnRleHQuYmVsbCgpICAgICAgICAgICAgIyBXYXJuIHdlIGN5Y2xlZCBhcm91bmQKKyAgICAgICAgICAgIHNlbGYuYmVsbCgpICAgICAgICAgICAgIyBXYXJuIHdlIGN5Y2xlZCBhcm91bmQKICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgiaW5zZXJ0IiwgbmV3d29yZCkKICAgICAgICAgY3VyaW5zZXJ0ID0gc2VsZi50ZXh0LmluZGV4KCJpbnNlcnQiKQogICAgICAgICBjdXJsaW5lID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQgbGluZWVuZCIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHkgYi9MaWIvaWRsZWxpYi9icm93c2VyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0NsYXNzQnJvd3Nlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvYnJvd3Nlci5weQppbmRleCBkMDljNTJmLi5lYTA1NjM4IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHkKKysrIGIvTGliL2lkbGVsaWIvYnJvd3Nlci5weQpAQCAtMTEsMTYgKzExLDE2IEBACiAiIiIKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgcHljbGJyCitpbXBvcnQgc3lzCiAKLWZyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbAotZnJvbSBpZGxlbGliLldpbmRvd0xpc3QgaW1wb3J0IExpc3RlZFRvcGxldmVsCi1mcm9tIGlkbGVsaWIuVHJlZVdpZGdldCBpbXBvcnQgVHJlZU5vZGUsIFRyZWVJdGVtLCBTY3JvbGxlZENhbnZhcwotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliIGltcG9ydCBweXNoZWxsCitmcm9tIGlkbGVsaWIudHJlZSBpbXBvcnQgVHJlZU5vZGUsIFRyZWVJdGVtLCBTY3JvbGxlZENhbnZhcworZnJvbSBpZGxlbGliLndpbmRvd3MgaW1wb3J0IExpc3RlZFRvcGxldmVsCiAKIGZpbGVfb3BlbiA9IE5vbmUgICMgTWV0aG9kLi4uSXRlbSBhbmQgQ2xhc3MuLi5JdGVtIHVzZSB0aGlzLgotIyBOb3JtYWxseSBQeVNoZWxsLmZsaXN0Lm9wZW4sIGJ1dCB0aGVyZSBpcyBubyBQeVNoZWxsLmZsaXN0IGZvciBodGVzdC4KKyMgTm9ybWFsbHkgcHlzaGVsbC5mbGlzdC5vcGVuLCBidXQgdGhlcmUgaXMgbm8gcHlzaGVsbC5mbGlzdCBmb3IgaHRlc3QuCiAKIGNsYXNzIENsYXNzQnJvd3NlcjoKIApAQCAtMzIsNyArMzIsNyBAQAogICAgICAgICAiIiIKICAgICAgICAgZ2xvYmFsIGZpbGVfb3BlbgogICAgICAgICBpZiBub3QgX2h0ZXN0OgotICAgICAgICAgICAgZmlsZV9vcGVuID0gUHlTaGVsbC5mbGlzdC5vcGVuCisgICAgICAgICAgICBmaWxlX29wZW4gPSBweXNoZWxsLmZsaXN0Lm9wZW4KICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgICBzZWxmLmZpbGUgPSBvcy5wYXRoLmpvaW4ocGF0aFswXSwgc2VsZi5uYW1lICsgIi5weSIpCiAgICAgICAgIHNlbGYuX2h0ZXN0ID0gX2h0ZXN0CkBAIC05NSw3ICs5NSw3IEBACiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuZmlsZSk6CiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgUHlTaGVsbC5mbGlzdC5vcGVuKHNlbGYuZmlsZSkKKyAgICAgICAgcHlzaGVsbC5mbGlzdC5vcGVuKHNlbGYuZmlsZSkKIAogICAgIGRlZiBJc0V4cGFuZGFibGUoc2VsZik6CiAgICAgICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKHNlbGYuZmlsZVstMzpdKSA9PSAiLnB5IgpAQCAtMjI2LDcgKzIyNiw3IEBACiAgICAgICAgICAgICBmaWxlID0gc3lzLmFyZ3ZbMF0KICAgICBkaXIsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KGZpbGUpCiAgICAgbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoZmlsZSlbMF0KLSAgICBmbGlzdCA9IFB5U2hlbGwuUHlTaGVsbEZpbGVMaXN0KHBhcmVudCkKKyAgICBmbGlzdCA9IHB5c2hlbGwuUHlTaGVsbEZpbGVMaXN0KHBhcmVudCkKICAgICBnbG9iYWwgZmlsZV9vcGVuCiAgICAgZmlsZV9vcGVuID0gZmxpc3Qub3BlbgogICAgIENsYXNzQnJvd3NlcihmbGlzdCwgbmFtZSwgW2Rpcl0sIF9odGVzdD1UcnVlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weSBiL0xpYi9pZGxlbGliL2NhbGx0aXBfdy5weQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9jYWxsdGlwX3cucHkKaW5kZXggOWVlYzE3NS4uYzczNjFkMSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weQorKysgYi9MaWIvaWRsZWxpYi9jYWxsdGlwX3cucHkKQEAgLTEsNyArMSw3IEBACiAiIiJBIENhbGxUaXAgd2luZG93IGNsYXNzIGZvciBUa2ludGVyL0lETEUuCiAKLUFmdGVyIFRvb2xUaXAucHksIHdoaWNoIHVzZXMgaWRlYXMgZ2xlYW5lZCBmcm9tIFB5U29sCi1Vc2VkIGJ5IHRoZSBDYWxsVGlwcyBJRExFIGV4dGVuc2lvbi4KK0FmdGVyIHRvb2x0aXAucHksIHdoaWNoIHVzZXMgaWRlYXMgZ2xlYW5lZCBmcm9tIFB5U29sCitVc2VkIGJ5IHRoZSBjYWxsdGlwcyBJRExFIGV4dGVuc2lvbi4KICIiIgogZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCwgTGFiZWwsIExFRlQsIFNPTElELCBUY2xFcnJvcgogCkBAIC0xMzgsOCArMTM4LDggQEAKIAogICAgIHRvcCA9IFRvcGxldmVsKHBhcmVudCkKICAgICB0b3AudGl0bGUoIlRlc3QgY2FsbHRpcHMiKQotICAgIHRvcC5nZW9tZXRyeSgiMjAweDEwMCslZCslZCIgJSAocGFyZW50LndpbmZvX3Jvb3R4KCkgKyAyMDAsCi0gICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArIDE1MCkpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiMjAweDEwMCslZCslZCIgJSAoeCArIDI1MCwgeSArIDE3NSkpCiAgICAgdGV4dCA9IFRleHQodG9wKQogICAgIHRleHQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCwgZXhwYW5kPTEpCiAgICAgdGV4dC5pbnNlcnQoImluc2VydCIsICJzdHJpbmcuc3BsaXQiKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ2FsbFRpcHMucHkgYi9MaWIvaWRsZWxpYi9jYWxsdGlwcy5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9DYWxsVGlwcy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvY2FsbHRpcHMucHkKaW5kZXggODFiZDVmMS4uNGM1YWVhMiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ2FsbFRpcHMucHkKKysrIGIvTGliL2lkbGVsaWIvY2FsbHRpcHMucHkKQEAgLTEsMTkgKzEsMTkgQEAKLSIiIkNhbGxUaXBzLnB5IC0gQW4gSURMRSBFeHRlbnNpb24gdG8gSm9nIFlvdXIgTWVtb3J5CisiIiJjYWxsdGlwcy5weSAtIEFuIElETEUgRXh0ZW5zaW9uIHRvIEpvZyBZb3VyIE1lbW9yeQogCiBDYWxsIFRpcHMgYXJlIGZsb2F0aW5nIHdpbmRvd3Mgd2hpY2ggZGlzcGxheSBmdW5jdGlvbiwgY2xhc3MsIGFuZCBtZXRob2QKIHBhcmFtZXRlciBhbmQgZG9jc3RyaW5nIGluZm9ybWF0aW9uIHdoZW4geW91IHR5cGUgYW4gb3BlbmluZyBwYXJlbnRoZXNpcywgYW5kCiB3aGljaCBkaXNhcHBlYXIgd2hlbiB5b3UgdHlwZSBhIGNsb3NpbmcgcGFyZW50aGVzaXMuCiAKICIiIgotaW1wb3J0IF9fbWFpbl9fCiBpbXBvcnQgaW5zcGVjdAogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCiBpbXBvcnQgdGV4dHdyYXAKIGltcG9ydCB0eXBlcwogCi1mcm9tIGlkbGVsaWIgaW1wb3J0IENhbGxUaXBXaW5kb3cKLWZyb20gaWRsZWxpYi5IeXBlclBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgY2FsbHRpcF93Citmcm9tIGlkbGVsaWIuaHlwZXJwYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCitpbXBvcnQgX19tYWluX18KIAogY2xhc3MgQ2FsbFRpcHM6CiAKQEAgLTM3LDcgKzM3LDcgQEAKIAogICAgIGRlZiBfbWFrZV90a19jYWxsdGlwX3dpbmRvdyhzZWxmKToKICAgICAgICAgIyBTZWUgX19pbml0X18gZm9yIHVzYWdlCi0gICAgICAgIHJldHVybiBDYWxsVGlwV2luZG93LkNhbGxUaXAoc2VsZi50ZXh0KQorICAgICAgICByZXR1cm4gY2FsbHRpcF93LkNhbGxUaXAoc2VsZi50ZXh0KQogCiAgICAgZGVmIF9yZW1vdmVfY2FsbHRpcF93aW5kb3coc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgIGlmIHNlbGYuYWN0aXZlX2NhbGx0aXA6CkBAIC0xMjAsNyArMTIwLDcgQEAKIF9NQVhfQ09MUyA9IDg1CiBfTUFYX0xJTkVTID0gNSAgIyBlbm91Z2ggZm9yIGJ5dGVzCiBfSU5ERU5UID0gJyAnKjQgICMgZm9yIHdyYXBwZWQgc2lnbmF0dXJlcwotX2ZpcnN0X3BhcmFtID0gcmUuY29tcGlsZSgnKD88PVwoKVx3KlwsP1xzKicpCitfZmlyc3RfcGFyYW0gPSByZS5jb21waWxlKHInKD88PVwoKVx3KlwsP1xzKicpCiBfZGVmYXVsdF9jYWxsYWJsZV9hcmdzcGVjID0gIlNlZSBzb3VyY2Ugb3IgZG9jIgogCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NvZGVDb250ZXh0LnB5IGIvTGliL2lkbGVsaWIvY29kZWNvbnRleHQucHkKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NvZGVjb250ZXh0LnB5CmluZGV4IDdkMjVhZGEuLmYyNWUxYjMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NvZGVDb250ZXh0LnB5CisrKyBiL0xpYi9pZGxlbGliL2NvZGVjb250ZXh0LnB5CkBAIC0xLDE5ICsxLDIxIEBACi0iIiJDb2RlQ29udGV4dCAtIEV4dGVuc2lvbiB0byBkaXNwbGF5IHRoZSBibG9jayBjb250ZXh0IGFib3ZlIHRoZSBlZGl0IHdpbmRvdworIiIiY29kZWNvbnRleHQgLSBFeHRlbnNpb24gdG8gZGlzcGxheSB0aGUgYmxvY2sgY29udGV4dCBhYm92ZSB0aGUgZWRpdCB3aW5kb3cKIAogT25jZSBjb2RlIGhhcyBzY3JvbGxlZCBvZmYgdGhlIHRvcCBvZiBhIHdpbmRvdywgaXQgY2FuIGJlIGRpZmZpY3VsdCB0bwogZGV0ZXJtaW5lIHdoaWNoIGJsb2NrIHlvdSBhcmUgaW4uICBUaGlzIGV4dGVuc2lvbiBpbXBsZW1lbnRzIGEgcGFuZSBhdCB0aGUgdG9wCiBvZiBlYWNoIElETEUgZWRpdCB3aW5kb3cgd2hpY2ggcHJvdmlkZXMgYmxvY2sgc3RydWN0dXJlIGhpbnRzLiAgVGhlc2UgaGludHMgYXJlCiB0aGUgbGluZXMgd2hpY2ggY29udGFpbiB0aGUgYmxvY2sgb3BlbmluZyBrZXl3b3JkcywgZS5nLiAnaWYnLCBmb3IgdGhlCiBlbmNsb3NpbmcgYmxvY2suICBUaGUgbnVtYmVyIG9mIGhpbnQgbGluZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbnVtbGluZXMKLXZhcmlhYmxlIGluIHRoZSBDb2RlQ29udGV4dCBzZWN0aW9uIG9mIGNvbmZpZy1leHRlbnNpb25zLmRlZi4gTGluZXMgd2hpY2ggZG8KK3ZhcmlhYmxlIGluIHRoZSBjb2RlY29udGV4dCBzZWN0aW9uIG9mIGNvbmZpZy1leHRlbnNpb25zLmRlZi4gTGluZXMgd2hpY2ggZG8KIG5vdCBvcGVuIGJsb2NrcyBhcmUgbm90IHNob3duIGluIHRoZSBjb250ZXh0IGhpbnRzIHBhbmUuCiAKICIiIgotaW1wb3J0IHRraW50ZXIKLWZyb20gdGtpbnRlci5jb25zdGFudHMgaW1wb3J0IFRPUCwgTEVGVCwgWCwgVywgU1VOS0VOCiBpbXBvcnQgcmUKIGZyb20gc3lzIGltcG9ydCBtYXhzaXplIGFzIElORklOSVRZCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKKworaW1wb3J0IHRraW50ZXIKK2Zyb20gdGtpbnRlci5jb25zdGFudHMgaW1wb3J0IFRPUCwgTEVGVCwgWCwgVywgU1VOS0VOCisKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCiAKIEJMT0NLT1BFTkVSUyA9IHsiY2xhc3MiLCAiZGVmIiwgImVsaWYiLCAiZWxzZSIsICJleGNlcHQiLCAiZmluYWxseSIsICJmb3IiLAogICAgICAgICAgICAgICAgICAgICAiaWYiLCAidHJ5IiwgIndoaWxlIiwgIndpdGgifQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHkgYi9MaWIvaWRsZWxpYi9jb2xvcml6ZXIucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NvbG9yaXplci5weQppbmRleCAwMmVhYzQ3Li43MzEwYmIyIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weQorKysgYi9MaWIvaWRsZWxpYi9jb2xvcml6ZXIucHkKQEAgLTEsMTAgKzEsMTAgQEAKLWltcG9ydCB0aW1lCi1pbXBvcnQgcmUKLWltcG9ydCBrZXl3b3JkCiBpbXBvcnQgYnVpbHRpbnMKLWZyb20gdGtpbnRlciBpbXBvcnQgVGtWZXJzaW9uCi1mcm9tIGlkbGVsaWIuRGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgoraW1wb3J0IGtleXdvcmQKK2ltcG9ydCByZQoraW1wb3J0IHRpbWUKKworZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5kZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgogCiBERUJVRyA9IEZhbHNlCiAKQEAgLTQ5LDExICs0OSw4IEBACiAgICAgICAgIGluc2VydGJhY2tncm91bmQ9Y3Vyc29yX2NvbG9yLAogICAgICAgICBzZWxlY3Rmb3JlZ3JvdW5kPXNlbGVjdF9jb2xvcnNbJ2ZvcmVncm91bmQnXSwKICAgICAgICAgc2VsZWN0YmFja2dyb3VuZD1zZWxlY3RfY29sb3JzWydiYWNrZ3JvdW5kJ10sCi0gICAgICAgICkKLSAgICBpZiBUa1ZlcnNpb24gPj0gOC41OgotICAgICAgICB0ZXh0LmNvbmZpZygKLSAgICAgICAgICAgIGluYWN0aXZlc2VsZWN0YmFja2dyb3VuZD1zZWxlY3RfY29sb3JzWydiYWNrZ3JvdW5kJ10pCi0KKyAgICAgICAgaW5hY3RpdmVzZWxlY3RiYWNrZ3JvdW5kPXNlbGVjdF9jb2xvcnNbJ2JhY2tncm91bmQnXSwgICMgbmV3IGluIDguNQorICAgICkKIAogY2xhc3MgQ29sb3JEZWxlZ2F0b3IoRGVsZWdhdG9yKToKIApAQCAtMjU5LDEyICsyNTYsMTIgQEAKIAogZGVmIF9jb2xvcl9kZWxlZ2F0b3IocGFyZW50KTogICMgaHRlc3QgIwogICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwsIFRleHQKLSAgICBmcm9tIGlkbGVsaWIuUGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgorICAgIGZyb20gaWRsZWxpYi5wZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCiAKICAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgdG9wLnRpdGxlKCJUZXN0IENvbG9yRGVsZWdhdG9yIikKLSAgICB0b3AuZ2VvbWV0cnkoIjIwMHgxMDArJWQrJWQiICUgKHBhcmVudC53aW5mb19yb290eCgpICsgMjAwLAotICAgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R5KCkgKyAxNTApKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIjIwMHgxMDArJWQrJWQiICUgKHggKyAyNTAsIHkgKyAxNzUpKQogICAgIHNvdXJjZSA9ICJpZiBzb21lbmFtZTogeCA9ICdhYmMnICMgY29tbWVudFxucHJpbnRcbiIKICAgICB0ZXh0ID0gVGV4dCh0b3AsIGJhY2tncm91bmQ9IndoaXRlIikKICAgICB0ZXh0LnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQpAQCAtMjc3LDUgKzI3NCw5IEBACiAgICAgcC5pbnNlcnRmaWx0ZXIoZCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2NvbG9yaXplcicsCisgICAgICAgICAgICAgICAgICB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfY29sb3JfZGVsZWdhdG9yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvY29uZmlnLWtleXMuZGVmIGIvTGliL2lkbGVsaWIvY29uZmlnLWtleXMuZGVmCmluZGV4IDNiZmNiNjkuLjY0Nzg4ZjkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZgorKysgYi9MaWIvaWRsZWxpYi9jb25maWcta2V5cy5kZWYKQEAgLTEwOSw2ICsxMDksNTcgQEAKIGRlbC13b3JkLWxlZnQ9PEFsdC1LZXktQmFja1NwYWNlPgogZGVsLXdvcmQtcmlnaHQ9PEFsdC1LZXktZD4KIAorW0lETEUgTW9kZXJuIFVuaXhdCitjb3B5ID0gPENvbnRyb2wtU2hpZnQtS2V5LUM+IDxDb250cm9sLUtleS1JbnNlcnQ+CitjdXQgPSA8Q29udHJvbC1LZXkteD4gPFNoaWZ0LUtleS1EZWxldGU+CitwYXN0ZSA9IDxDb250cm9sLUtleS12PiA8U2hpZnQtS2V5LUluc2VydD4KK2JlZ2lubmluZy1vZi1saW5lID0gPEtleS1Ib21lPgorY2VudGVyLWluc2VydCA9IDxDb250cm9sLUtleS1sPgorY2xvc2UtYWxsLXdpbmRvd3MgPSA8Q29udHJvbC1LZXktcT4KK2Nsb3NlLXdpbmRvdyA9IDxDb250cm9sLUtleS13PiA8Q29udHJvbC1TaGlmdC1LZXktVz4KK2RvLW5vdGhpbmcgPSA8Q29udHJvbC1LZXktRjEyPgorZW5kLW9mLWZpbGUgPSA8Q29udHJvbC1LZXktZD4KK2hpc3RvcnktbmV4dCA9IDxBbHQtS2V5LW4+IDxNZXRhLUtleS1uPgoraGlzdG9yeS1wcmV2aW91cyA9IDxBbHQtS2V5LXA+IDxNZXRhLUtleS1wPgoraW50ZXJydXB0LWV4ZWN1dGlvbiA9IDxDb250cm9sLUtleS1jPgordmlldy1yZXN0YXJ0ID0gPEtleS1GNj4KK3Jlc3RhcnQtc2hlbGwgPSA8Q29udHJvbC1LZXktRjY+CitvcGVuLWNsYXNzLWJyb3dzZXIgPSA8Q29udHJvbC1LZXktYj4KK29wZW4tbW9kdWxlID0gPENvbnRyb2wtS2V5LW0+CitvcGVuLW5ldy13aW5kb3cgPSA8Q29udHJvbC1LZXktbj4KK29wZW4td2luZG93LWZyb20tZmlsZSA9IDxDb250cm9sLUtleS1vPgorcGxhaW4tbmV3bGluZS1hbmQtaW5kZW50ID0gPENvbnRyb2wtS2V5LWo+CitwcmludC13aW5kb3cgPSA8Q29udHJvbC1LZXktcD4KK3B5dGhvbi1jb250ZXh0LWhlbHAgPSA8U2hpZnQtS2V5LUYxPgorcHl0aG9uLWRvY3MgPSA8S2V5LUYxPgorcmVkbyA9IDxDb250cm9sLVNoaWZ0LUtleS1aPgorcmVtb3ZlLXNlbGVjdGlvbiA9IDxLZXktRXNjYXBlPgorc2F2ZS1jb3B5LW9mLXdpbmRvdy1hcy1maWxlID0gPEFsdC1TaGlmdC1LZXktUz4KK3NhdmUtd2luZG93LWFzLWZpbGUgPSA8Q29udHJvbC1TaGlmdC1LZXktUz4KK3NhdmUtd2luZG93ID0gPENvbnRyb2wtS2V5LXM+CitzZWxlY3QtYWxsID0gPENvbnRyb2wtS2V5LWE+Cit0b2dnbGUtYXV0by1jb2xvcmluZyA9IDxDb250cm9sLUtleS1zbGFzaD4KK3VuZG8gPSA8Q29udHJvbC1LZXktej4KK2ZpbmQgPSA8Q29udHJvbC1LZXktZj4KK2ZpbmQtYWdhaW4gPSA8S2V5LUYzPgorZmluZC1pbi1maWxlcyA9IDxDb250cm9sLVNoaWZ0LUtleS1mPgorZmluZC1zZWxlY3Rpb24gPSA8Q29udHJvbC1LZXktaD4KK3JlcGxhY2UgPSA8Q29udHJvbC1LZXktcj4KK2dvdG8tbGluZSA9IDxDb250cm9sLUtleS1nPgorc21hcnQtYmFja3NwYWNlID0gPEtleS1CYWNrU3BhY2U+CituZXdsaW5lLWFuZC1pbmRlbnQgPSA8S2V5LVJldHVybj4gPEtleS1LUF9FbnRlcj4KK3NtYXJ0LWluZGVudCA9IDxLZXktVGFiPgoraW5kZW50LXJlZ2lvbiA9IDxDb250cm9sLUtleS1icmFja2V0cmlnaHQ+CitkZWRlbnQtcmVnaW9uID0gPENvbnRyb2wtS2V5LWJyYWNrZXRsZWZ0PgorY29tbWVudC1yZWdpb24gPSA8Q29udHJvbC1LZXktZD4KK3VuY29tbWVudC1yZWdpb24gPSA8Q29udHJvbC1TaGlmdC1LZXktRD4KK3RhYmlmeS1yZWdpb24gPSA8QWx0LUtleS01PgordW50YWJpZnktcmVnaW9uID0gPEFsdC1LZXktNj4KK3RvZ2dsZS10YWJzID0gPENvbnRyb2wtS2V5LVQ+CitjaGFuZ2UtaW5kZW50d2lkdGggPSA8QWx0LUtleS11PgorZGVsLXdvcmQtbGVmdCA9IDxDb250cm9sLUtleS1CYWNrU3BhY2U+CitkZWwtd29yZC1yaWdodCA9IDxDb250cm9sLUtleS1EZWxldGU+CisKIFtJRExFIENsYXNzaWMgTWFjXQogY29weT08Q29tbWFuZC1LZXktYz4KIGN1dD08Q29tbWFuZC1LZXkteD4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZy1tYWluLmRlZiBiL0xpYi9pZGxlbGliL2NvbmZpZy1tYWluLmRlZgppbmRleCA4ZWJiYzFiLi5hNjFiYmE3IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWctbWFpbi5kZWYKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnLW1haW4uZGVmCkBAIC03MCw3ICs3MCw5IEBACiAKIFtLZXlzXQogZGVmYXVsdD0gMQotbmFtZT0gSURMRSBDbGFzc2ljIFdpbmRvd3MKK25hbWU9CituYW1lMj0KKyMgbmFtZTIgc2V0IGluIHVzZXIgY29uZmlnLW1haW4uY2ZnIGZvciBrZXlzIGFkZGVkIGFmdGVyIDIwMTYgSnVseSAxCiAKIFtIaXN0b3J5XQogY3ljbGljPTEKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkgYi9MaWIvaWRsZWxpYi9jb25maWcucHkKc2ltaWxhcml0eSBpbmRleCA4NyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvY29uZmlnSGFuZGxlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvY29uZmlnLnB5CmluZGV4IDg5NTQ0ODguLjEwZmUzYmEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnLnB5CkBAIC03LDcgKzcsNyBAQAogYW5kIGlmIGEgZmlsZSBiZWNvbWVzIGVtcHR5LCBpdCB3aWxsIGJlIGRlbGV0ZWQuCiAKIFRoZSBjb250ZW50cyBvZiB0aGUgdXNlciBmaWxlcyBtYXkgYmUgYWx0ZXJlZCB1c2luZyB0aGUgT3B0aW9ucy9Db25maWd1cmUgSURMRQotbWVudSB0byBhY2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24gR1VJIChjb25maWdEaWFsb2cucHkpLCBvciBtYW51YWxseS4KK21lbnUgdG8gYWNjZXNzIHRoZSBjb25maWd1cmF0aW9uIEdVSSAoY29uZmlnZGlhbG9nLnB5KSwgb3IgbWFudWFsbHkuCiAKIFRocm91Z2hvdXQgdGhpcyBtb2R1bGUgdGhlcmUgaXMgYW4gZW1waGFzaXMgb24gcmV0dXJuaW5nIHVzZWFibGUgZGVmYXVsdHMKIHdoZW4gYSBwcm9ibGVtIG9jY3VycyBpbiByZXR1cm5pbmcgYSByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiB2YWx1ZSBiYWNrIHRvCkBAIC0xOCwxMSArMTgsMTAgQEAKICIiIgogIyBUT0RPcyBhZGRlZCBPY3QgMjAxNCwgdGpyCiAKK2Zyb20gY29uZmlncGFyc2VyIGltcG9ydCBDb25maWdQYXJzZXIKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogCi1mcm9tIGNvbmZpZ3BhcnNlciBpbXBvcnQgQ29uZmlnUGFyc2VyCi1mcm9tIHRraW50ZXIgaW1wb3J0IFRrVmVyc2lvbgogZnJvbSB0a2ludGVyLmZvbnQgaW1wb3J0IEZvbnQsIG5hbWV0b2ZvbnQKIAogY2xhc3MgSW52YWxpZENvbmZpZ1R5cGUoRXhjZXB0aW9uKTogcGFzcwpAQCAtMjMwLDE1ICsyMjksMTIgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdLkdldChzZWN0aW9uLCBvcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT10eXBlLCByYXc9cmF3KQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHdhcm5pbmcgPSAoJ1xuIFdhcm5pbmc6IGNvbmZpZ0hhbmRsZXIucHkgLSBJZGxlQ29uZi5HZXRPcHRpb24gLVxuJworICAgICAgICAgICAgd2FybmluZyA9ICgnXG4gV2FybmluZzogY29uZmlnLnB5IC0gSWRsZUNvbmYuR2V0T3B0aW9uIC1cbicKICAgICAgICAgICAgICAgICAgICAgICAgJyBpbnZhbGlkICVyIHZhbHVlIGZvciBjb25maWd1cmF0aW9uIG9wdGlvbiAlclxuJwogICAgICAgICAgICAgICAgICAgICAgICAnIGZyb20gc2VjdGlvbiAlcjogJXInICUKICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUsIG9wdGlvbiwgc2VjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdLkdldChzZWN0aW9uLCBvcHRpb24sIHJhdz1yYXcpKSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwcmludCh3YXJuaW5nLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBfd2Fybih3YXJuaW5nLCBjb25maWdUeXBlLCBzZWN0aW9uLCBvcHRpb24pCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdENmZ1tjb25maWdUeXBlXS5oYXNfb3B0aW9uKHNlY3Rpb24sb3B0aW9uKToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0Q2ZnW2NvbmZpZ1R5cGVdLkdldCgKQEAgLTI0NywxNSArMjQzLDEyIEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgICNyZXR1cm5pbmcgZGVmYXVsdCwgcHJpbnQgd2FybmluZwogICAgICAgICBpZiB3YXJuX29uX2RlZmF1bHQ6Ci0gICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLnB5IC0gSWRsZUNvbmYuR2V0T3B0aW9uIC1cbicKKyAgICAgICAgICAgIHdhcm5pbmcgPSAoJ1xuIFdhcm5pbmc6IGNvbmZpZy5weSAtIElkbGVDb25mLkdldE9wdGlvbiAtXG4nCiAgICAgICAgICAgICAgICAgICAgICAgICcgcHJvYmxlbSByZXRyaWV2aW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9uICVyXG4nCiAgICAgICAgICAgICAgICAgICAgICAgICcgZnJvbSBzZWN0aW9uICVyLlxuJwogICAgICAgICAgICAgICAgICAgICAgICAnIHJldHVybmluZyBkZWZhdWx0IHZhbHVlOiAlcicgJQogICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uLCBzZWN0aW9uLCBkZWZhdWx0KSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwcmludCh3YXJuaW5nLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBfd2Fybih3YXJuaW5nLCBjb25maWdUeXBlLCBzZWN0aW9uLCBvcHRpb24pCiAgICAgICAgIHJldHVybiBkZWZhdWx0CiAKICAgICBkZWYgU2V0T3B0aW9uKHNlbGYsIGNvbmZpZ1R5cGUsIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpOgpAQCAtMzU4LDUyICszNTEsNzMgQEAKICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdGhlbWU6CiAgICAgICAgICAgICBpZiBub3QgY2ZnUGFyc2VyLmhhc19vcHRpb24odGhlbWVOYW1lLCBlbGVtZW50KToKICAgICAgICAgICAgICAgICAjIFByaW50IHdhcm5pbmcgdGhhdCB3aWxsIHJldHVybiBhIGRlZmF1bHQgY29sb3IKLSAgICAgICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLklkbGVDb25mLkdldFRoZW1lRGljdCcKKyAgICAgICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWcuSWRsZUNvbmYuR2V0VGhlbWVEaWN0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAtXG4gcHJvYmxlbSByZXRyaWV2aW5nIHRoZW1lIGVsZW1lbnQgJXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4gZnJvbSB0aGVtZSAlci5cbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgcmV0dXJuaW5nIGRlZmF1bHQgY29sb3I6ICVyJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxlbWVudCwgdGhlbWVOYW1lLCB0aGVtZVtlbGVtZW50XSkpCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBwcmludCh3YXJuaW5nLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBfd2Fybih3YXJuaW5nLCAnaGlnaGxpZ2h0JywgdGhlbWVOYW1lLCBlbGVtZW50KQogICAgICAgICAgICAgdGhlbWVbZWxlbWVudF0gPSBjZmdQYXJzZXIuR2V0KAogICAgICAgICAgICAgICAgICAgICB0aGVtZU5hbWUsIGVsZW1lbnQsIGRlZmF1bHQ9dGhlbWVbZWxlbWVudF0pCiAgICAgICAgIHJldHVybiB0aGVtZQogCiAgICAgZGVmIEN1cnJlbnRUaGVtZShzZWxmKToKLSAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRleHQgY29sb3IgdGhlbWUuCisgICAgICAgICJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGV4dCBjb2xvciB0aGVtZS4iCisgICAgICAgIHJldHVybiBzZWxmLmN1cnJlbnRfY29sb3JzX2FuZF9rZXlzKCdUaGVtZScpCiAKLSAgICAgICAgaWRsZWxpYi5jb25maWctbWFpbi5kZWYgaW5jbHVkZXMgdGhpcyBzZWN0aW9uCisgICAgZGVmIEN1cnJlbnRLZXlzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUga2V5IHNldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuY3VycmVudF9jb2xvcnNfYW5kX2tleXMoJ0tleXMnKQorCisgICAgZGVmIGN1cnJlbnRfY29sb3JzX2FuZF9rZXlzKHNlbGYsIHNlY3Rpb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnRseSBhY3RpdmUgbmFtZSBmb3IgVGhlbWUgb3IgS2V5cyBzZWN0aW9uLgorCisgICAgICAgIGlkbGVsaWIuY29uZmlnLW1haW4uZGVmICgnZGVmYXVsdCcpIGluY2x1ZGVzIHRoZXNlIHNlY3Rpb25zCisKICAgICAgICAgW1RoZW1lXQogICAgICAgICBkZWZhdWx0PSAxCiAgICAgICAgIG5hbWU9IElETEUgQ2xhc3NpYwogICAgICAgICBuYW1lMj0KLSAgICAgICAgIyBuYW1lMiBzZXQgaW4gdXNlciBjb25maWctbWFpbi5jZmcgZm9yIHRoZW1lcyBhZGRlZCBhZnRlciAyMDE1IE9jdCAxCiAKLSAgICAgICAgSXRlbSBuYW1lMiBpcyBuZWVkZWQgYmVjYXVzZSBzZXR0aW5nIG5hbWUgdG8gYSBuZXcgYnVpbHRpbgotICAgICAgICBjYXVzZXMgb2xkZXIgSURMRXMgdG8gZGlzcGxheSBtdWx0aXBsZSBlcnJvciBtZXNzYWdlcyBvciBxdWl0LgorICAgICAgICBbS2V5c10KKyAgICAgICAgZGVmYXVsdD0gMQorICAgICAgICBuYW1lPQorICAgICAgICBuYW1lMj0KKworICAgICAgICBJdGVtICduYW1lMicsIGlzIHVzZWQgZm9yIGJ1aWx0LWluICgnZGVmYXVsdCcpIHRoZW1lcyBhbmQga2V5cworICAgICAgICBhZGRlZCBhZnRlciAyMDE1IE9jdCAxIGFuZCAyMDE2IEp1bHkgMS4gIFRoaXMga2x1ZGdlIGlzIG5lZWRlZAorICAgICAgICBiZWNhdXNlIHNldHRpbmcgJ25hbWUnIHRvIGEgYnVpbHRpbiBub3QgZGVmaW5lZCBpbiBvbGRlciBJRExFcworICAgICAgICB0byBkaXNwbGF5IG11bHRpcGxlIGVycm9yIG1lc3NhZ2VzIG9yIHF1aXQuCiAgICAgICAgIFNlZSBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI1MzEzLgotICAgICAgICBXaGVuIGRlZmF1bHQgPSBUcnVlLCBuYW1lMiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbmFtZSwKLSAgICAgICAgd2hpbGUgb2xkZXIgSURMRXMgd2lsbCBqdXN0IHVzZSBuYW1lLgorICAgICAgICBXaGVuIGRlZmF1bHQgPSBUcnVlLCAnbmFtZTInIHRha2VzIHByZWNlZGVuY2Ugb3ZlciAnbmFtZScsCisgICAgICAgIHdoaWxlIG9sZGVyIElETEVzIHdpbGwganVzdCB1c2UgbmFtZS4gIFdoZW4gZGVmYXVsdCA9IEZhbHNlLAorICAgICAgICAnbmFtZTInIG1heSBzdGlsbCBiZSBzZXQsIGJ1dCBpdCBpcyBpZ25vcmVkLgogICAgICAgICAiIiIKLSAgICAgICAgZGVmYXVsdCA9IHNlbGYuR2V0T3B0aW9uKCdtYWluJywgJ1RoZW1lJywgJ2RlZmF1bHQnLAorICAgICAgICBjZmduYW1lID0gJ2hpZ2hsaWdodCcgaWYgc2VjdGlvbiA9PSAnVGhlbWUnIGVsc2UgJ2tleXMnCisgICAgICAgIGRlZmF1bHQgPSBzZWxmLkdldE9wdGlvbignbWFpbicsIHNlY3Rpb24sICdkZWZhdWx0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2Jvb2wnLCBkZWZhdWx0PVRydWUpCisgICAgICAgIG5hbWUgPSAnJwogICAgICAgICBpZiBkZWZhdWx0OgotICAgICAgICAgICAgdGhlbWUgPSBzZWxmLkdldE9wdGlvbignbWFpbicsICdUaGVtZScsICduYW1lMicsIGRlZmF1bHQ9JycpCi0gICAgICAgIGlmIGRlZmF1bHQgYW5kIG5vdCB0aGVtZSBvciBub3QgZGVmYXVsdDoKLSAgICAgICAgICAgIHRoZW1lID0gc2VsZi5HZXRPcHRpb24oJ21haW4nLCAnVGhlbWUnLCAnbmFtZScsIGRlZmF1bHQ9JycpCi0gICAgICAgIHNvdXJjZSA9IHNlbGYuZGVmYXVsdENmZyBpZiBkZWZhdWx0IGVsc2Ugc2VsZi51c2VyQ2ZnCi0gICAgICAgIGlmIHNvdXJjZVsnaGlnaGxpZ2h0J10uaGFzX3NlY3Rpb24odGhlbWUpOgotICAgICAgICAgICAgcmV0dXJuIHRoZW1lCisgICAgICAgICAgICBuYW1lID0gc2VsZi5HZXRPcHRpb24oJ21haW4nLCBzZWN0aW9uLCAnbmFtZTInLCBkZWZhdWx0PScnKQorICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLkdldE9wdGlvbignbWFpbicsIHNlY3Rpb24sICduYW1lJywgZGVmYXVsdD0nJykKKyAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgIHNvdXJjZSA9IHNlbGYuZGVmYXVsdENmZyBpZiBkZWZhdWx0IGVsc2Ugc2VsZi51c2VyQ2ZnCisgICAgICAgICAgICBpZiBzb3VyY2VbY2ZnbmFtZV0uaGFzX3NlY3Rpb24obmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUKKyAgICAgICAgcmV0dXJuICJJRExFIENsYXNzaWMiIGlmIHNlY3Rpb24gPT0gJ1RoZW1lJyBlbHNlIHNlbGYuZGVmYXVsdF9rZXlzKCkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZGVmYXVsdF9rZXlzKCk6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6CisgICAgICAgICAgICByZXR1cm4gJ0lETEUgQ2xhc3NpYyBXaW5kb3dzJworICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIHJldHVybiAnSURMRSBDbGFzc2ljIE9TWCcKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiAiSURMRSBDbGFzc2ljIgorICAgICAgICAgICAgcmV0dXJuICdJRExFIE1vZGVybiBVbml4JwogCi0gICAgZGVmIEN1cnJlbnRLZXlzKHNlbGYpOgotICAgICAgICAiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGtleSBzZXQuIgotICAgICAgICByZXR1cm4gc2VsZi5HZXRPcHRpb24oJ21haW4nLCAnS2V5cycsICduYW1lJywgZGVmYXVsdD0nJykKLQotICAgIGRlZiBHZXRFeHRlbnNpb25zKHNlbGYsIGFjdGl2ZV9vbmx5PVRydWUsIGVkaXRvcl9vbmx5PUZhbHNlLCBzaGVsbF9vbmx5PUZhbHNlKToKKyAgICBkZWYgR2V0RXh0ZW5zaW9ucyhzZWxmLCBhY3RpdmVfb25seT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgIGVkaXRvcl9vbmx5PUZhbHNlLCBzaGVsbF9vbmx5PUZhbHNlKToKICAgICAgICAgIiIiUmV0dXJuIGV4dGVuc2lvbnMgaW4gZGVmYXVsdCBhbmQgdXNlciBjb25maWctZXh0ZW5zaW9ucyBmaWxlcy4KIAogICAgICAgICBJZiBhY3RpdmVfb25seSBUcnVlLCBvbmx5IHJldHVybiBhY3RpdmUgKGVuYWJsZWQpIGV4dGVuc2lvbnMKQEAgLTQyMyw3ICs0MzcsNyBAQAogICAgICAgICAgICAgICAgIGlmIHNlbGYuR2V0T3B0aW9uKCdleHRlbnNpb25zJywgZXh0biwgJ2VuYWJsZScsIGRlZmF1bHQ9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdib29sJyk6CiAgICAgICAgICAgICAgICAgICAgICN0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgaWYgZWRpdG9yX29ubHkgb3Igc2hlbGxfb25seTogICMgVE9ETyBpZiBib3RoLCBjb250cmFkaWN0b3J5CisgICAgICAgICAgICAgICAgICAgIGlmIGVkaXRvcl9vbmx5IG9yIHNoZWxsX29ubHk6ICAjIFRPRE8gYm90aCBUcnVlIGNvbnRyYWRpY3QKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVkaXRvcl9vbmx5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJlbmFibGVfZWRpdG9yIgogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKQEAgLTUyOCw3ICs1NDIsOCBAQAogICAgICAgICBldmVudFN0ciAtIHZpcnR1YWwgZXZlbnQsIGluY2x1ZGluZyBicmFja2V0cywgYXMgaW4gJzw8ZXZlbnQ+PicuCiAgICAgICAgICIiIgogICAgICAgICBldmVudE5hbWUgPSBldmVudFN0clsyOi0yXSAjdHJpbSBvZmYgdGhlIGFuZ2xlIGJyYWNrZXRzCi0gICAgICAgIGJpbmRpbmcgPSBzZWxmLkdldE9wdGlvbigna2V5cycsIGtleVNldE5hbWUsIGV2ZW50TmFtZSwgZGVmYXVsdD0nJykuc3BsaXQoKQorICAgICAgICBiaW5kaW5nID0gc2VsZi5HZXRPcHRpb24oJ2tleXMnLCBrZXlTZXROYW1lLCBldmVudE5hbWUsIGRlZmF1bHQ9JycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuX29uX2RlZmF1bHQ9RmFsc2UpLnNwbGl0KCkKICAgICAgICAgcmV0dXJuIGJpbmRpbmcKIAogICAgIGRlZiBHZXRDdXJyZW50S2V5U2V0KHNlbGYpOgpAQCAtNjM5LDIwICs2NTQsMjggQEAKICAgICAgICAgICAgICc8PGRlbC13b3JkLXJpZ2h0Pj4nOiBbJzxDb250cm9sLUtleS1EZWxldGU+J10KICAgICAgICAgICAgIH0KICAgICAgICAgaWYga2V5U2V0TmFtZToKLSAgICAgICAgICAgIGZvciBldmVudCBpbiBrZXlCaW5kaW5nczoKLSAgICAgICAgICAgICAgICBiaW5kaW5nID0gc2VsZi5HZXRLZXlCaW5kaW5nKGtleVNldE5hbWUsIGV2ZW50KQotICAgICAgICAgICAgICAgIGlmIGJpbmRpbmc6Ci0gICAgICAgICAgICAgICAgICAgIGtleUJpbmRpbmdzW2V2ZW50XSA9IGJpbmRpbmcKLSAgICAgICAgICAgICAgICBlbHNlOiAjd2UgYXJlIGdvaW5nIHRvIHJldHVybiBhIGRlZmF1bHQsIHByaW50IHdhcm5pbmcKLSAgICAgICAgICAgICAgICAgICAgd2FybmluZz0oJ1xuIFdhcm5pbmc6IGNvbmZpZ0hhbmRsZXIucHkgLSBJZGxlQ29uZi5HZXRDb3JlS2V5cycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIC1cbiBwcm9ibGVtIHJldHJpZXZpbmcga2V5IGJpbmRpbmcgZm9yIGV2ZW50ICVyJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbiBmcm9tIGtleSBzZXQgJXIuXG4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZTogJXInICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQsIGtleVNldE5hbWUsIGtleUJpbmRpbmdzW2V2ZW50XSkpCi0gICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KHdhcm5pbmcsIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBpZiBub3QgKHNlbGYudXNlckNmZ1sna2V5cyddLmhhc19zZWN0aW9uKGtleVNldE5hbWUpIG9yCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVmYXVsdENmZ1sna2V5cyddLmhhc19zZWN0aW9uKGtleVNldE5hbWUpKToKKyAgICAgICAgICAgICAgICB3YXJuaW5nID0gKAorICAgICAgICAgICAgICAgICAgICAnXG4gV2FybmluZzogY29uZmlnLnB5IC0gSWRsZUNvbmYuR2V0Q29yZUtleXMgLVxuJworICAgICAgICAgICAgICAgICAgICAnIGtleSBzZXQgJXIgaXMgbm90IGRlZmluZWQsIHVzaW5nIGRlZmF1bHQgYmluZGluZ3MuJyAlCisgICAgICAgICAgICAgICAgICAgIChrZXlTZXROYW1lLCkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgX3dhcm4od2FybmluZywgJ2tleXMnLCBrZXlTZXROYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgZXZlbnQgaW4ga2V5QmluZGluZ3M6CisgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcgPSBzZWxmLkdldEtleUJpbmRpbmcoa2V5U2V0TmFtZSwgZXZlbnQpCisgICAgICAgICAgICAgICAgICAgIGlmIGJpbmRpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlCaW5kaW5nc1tldmVudF0gPSBiaW5kaW5nCisgICAgICAgICAgICAgICAgICAgIGVsc2U6ICN3ZSBhcmUgZ29pbmcgdG8gcmV0dXJuIGEgZGVmYXVsdCwgcHJpbnQgd2FybmluZworICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4gV2FybmluZzogY29uZmlnLnB5IC0gSWRsZUNvbmYuR2V0Q29yZUtleXMgLVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgcHJvYmxlbSByZXRyaWV2aW5nIGtleSBiaW5kaW5nIGZvciBldmVudCAlclxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZnJvbSBrZXkgc2V0ICVyLlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWU6ICVyJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50LCBrZXlTZXROYW1lLCBrZXlCaW5kaW5nc1tldmVudF0pCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICBfd2Fybih3YXJuaW5nLCAna2V5cycsIGtleVNldE5hbWUsIGV2ZW50KQogICAgICAgICByZXR1cm4ga2V5QmluZGluZ3MKIAogICAgIGRlZiBHZXRFeHRyYUhlbHBTb3VyY2VMaXN0KHNlbGYsIGNvbmZpZ1NldCk6CkBAIC03MTMsMTYgKzczNiwxMyBAQAogICAgICAgICBib2xkID0gc2VsZi5HZXRPcHRpb24oY29uZmlnVHlwZSwgc2VjdGlvbiwgJ2ZvbnQtYm9sZCcsIGRlZmF1bHQ9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2Jvb2wnKQogICAgICAgICBpZiAoZmFtaWx5ID09ICdUa0ZpeGVkRm9udCcpOgotICAgICAgICAgICAgaWYgVGtWZXJzaW9uIDwgOC41OgotICAgICAgICAgICAgICAgIGZhbWlseSA9ICdDb3VyaWVyJwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBmID0gRm9udChuYW1lPSdUa0ZpeGVkRm9udCcsIGV4aXN0cz1UcnVlLCByb290PXJvb3QpCi0gICAgICAgICAgICAgICAgYWN0dWFsRm9udCA9IEZvbnQuYWN0dWFsKGYpCi0gICAgICAgICAgICAgICAgZmFtaWx5ID0gYWN0dWFsRm9udFsnZmFtaWx5J10KLSAgICAgICAgICAgICAgICBzaXplID0gYWN0dWFsRm9udFsnc2l6ZSddCi0gICAgICAgICAgICAgICAgaWYgc2l6ZSA8PSAwOgotICAgICAgICAgICAgICAgICAgICBzaXplID0gMTAgICMgaWYgZm9udCBpbiBwaXhlbHMsIGlnbm9yZSBhY3R1YWwgc2l6ZQotICAgICAgICAgICAgICAgIGJvbGQgPSBhY3R1YWxGb250Wyd3ZWlnaHQnXT09J2JvbGQnCisgICAgICAgICAgICBmID0gRm9udChuYW1lPSdUa0ZpeGVkRm9udCcsIGV4aXN0cz1UcnVlLCByb290PXJvb3QpCisgICAgICAgICAgICBhY3R1YWxGb250ID0gRm9udC5hY3R1YWwoZikKKyAgICAgICAgICAgIGZhbWlseSA9IGFjdHVhbEZvbnRbJ2ZhbWlseSddCisgICAgICAgICAgICBzaXplID0gYWN0dWFsRm9udFsnc2l6ZSddCisgICAgICAgICAgICBpZiBzaXplIDw9IDA6CisgICAgICAgICAgICAgICAgc2l6ZSA9IDEwICAjIGlmIGZvbnQgaW4gcGl4ZWxzLCBpZ25vcmUgYWN0dWFsIHNpemUKKyAgICAgICAgICAgIGJvbGQgPSBhY3R1YWxGb250Wyd3ZWlnaHQnXSA9PSAnYm9sZCcKICAgICAgICAgcmV0dXJuIChmYW1pbHksIHNpemUsICdib2xkJyBpZiBib2xkIGVsc2UgJ25vcm1hbCcpCiAKICAgICBkZWYgTG9hZENmZ0ZpbGVzKHNlbGYpOgpAQCAtNzM5LDYgKzc1OSwxOCBAQAogCiBpZGxlQ29uZiA9IElkbGVDb25mKCkKIAorCitfd2FybmVkID0gc2V0KCkKK2RlZiBfd2Fybihtc2csICprZXkpOgorICAgIGtleSA9IChtc2csKSArIGtleQorICAgIGlmIGtleSBub3QgaW4gX3dhcm5lZDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQobXNnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBfd2FybmVkLmFkZChrZXkpCisKKwogIyBUT0RPIFJldmlzZSB0ZXN0IG91dHB1dCwgd3JpdGUgZXhwYW5kZWQgdW5pdHRlc3QKICMKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU4MTE4Li4wMDAwMDAwCi0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSJEaWFsb2cgdG8gc3BlY2lmeSBvciBlZGl0IHRoZSBwYXJhbWV0ZXJzIGZvciBhIHVzZXIgY29uZmlndXJlZCBoZWxwIHNvdXJjZS4iCi0KLWltcG9ydCBvcwotaW1wb3J0IHN5cwotCi1mcm9tIHRraW50ZXIgaW1wb3J0ICoKLWltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Ci1pbXBvcnQgdGtpbnRlci5maWxlZGlhbG9nIGFzIHRrRmlsZURpYWxvZwotCi1jbGFzcyBHZXRIZWxwU291cmNlRGlhbG9nKFRvcGxldmVsKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgbWVudUl0ZW09JycsIGZpbGVQYXRoPScnLCBfaHRlc3Q9RmFsc2UpOgotICAgICAgICAiIiJHZXQgbWVudSBlbnRyeSBhbmQgdXJsLyBsb2NhbCBmaWxlIGxvY2F0aW9uIGZvciBBZGRpdGlvbmFsIEhlbHAKLQotICAgICAgICBVc2VyIHNlbGVjdHMgYSBuYW1lIGZvciB0aGUgSGVscCByZXNvdXJjZSBhbmQgcHJvdmlkZXMgYSB3ZWIgdXJsCi0gICAgICAgIG9yIGEgbG9jYWwgZmlsZSBhcyBpdHMgc291cmNlLiAgVGhlIHVzZXIgY2FuIGVudGVyIGEgdXJsIG9yIGJyb3dzZQotICAgICAgICBmb3IgdGhlIGZpbGUuCi0KLSAgICAgICAgX2h0ZXN0IC0gYm9vbCwgY2hhbmdlIGJveCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcgaHRlc3QKLSAgICAgICAgIiIiCi0gICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKLSAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKLSAgICAgICAgc2VsZi5yZXNpemFibGUoaGVpZ2h0PUZBTFNFLCB3aWR0aD1GQUxTRSkKLSAgICAgICAgc2VsZi50aXRsZSh0aXRsZSkKLSAgICAgICAgc2VsZi50cmFuc2llbnQocGFyZW50KQotICAgICAgICBzZWxmLmdyYWJfc2V0KCkKLSAgICAgICAgc2VsZi5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2FuY2VsKQotICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAotICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKLSAgICAgICAgc2VsZi5jcmVhdGVfd2lkZ2V0cygpCi0gICAgICAgIHNlbGYubWVudS5zZXQobWVudUl0ZW0pCi0gICAgICAgIHNlbGYucGF0aC5zZXQoZmlsZVBhdGgpCi0gICAgICAgIHNlbGYud2l0aGRyYXcoKSAjaGlkZSB3aGlsZSBzZXR0aW5nIGdlb21ldHJ5Ci0gICAgICAgICNuZWVkcyB0byBiZSBkb25lIGhlcmUgc28gdGhhdCB0aGUgd2luZm9fcmVxd2lkdGggaXMgdmFsaWQKLSAgICAgICAgc2VsZi51cGRhdGVfaWRsZXRhc2tzKCkKLSAgICAgICAgI2NlbnRyZSBkaWFsb2cgb3ZlciBwYXJlbnQuIGJlbG93IHBhcmVudCBpZiBydW5uaW5nIGh0ZXN0LgotICAgICAgICBzZWxmLmdlb21ldHJ5KAotICAgICAgICAgICAgICAgICIrJWQrJWQiICUgKAotICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHgoKSArCi0gICAgICAgICAgICAgICAgICAgIChwYXJlbnQud2luZm9fd2lkdGgoKS8yIC0gc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpLAotICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArCi0gICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIgLSBzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaHRlc3QgZWxzZSAxNTApKSkKLSAgICAgICAgc2VsZi5kZWljb25pZnkoKSAjZ2VvbWV0cnkgc2V0LCB1bmhpZGUKLSAgICAgICAgc2VsZi5iaW5kKCc8UmV0dXJuPicsIHNlbGYub2spCi0gICAgICAgIHNlbGYud2FpdF93aW5kb3coKQotCi0gICAgZGVmIGNyZWF0ZV93aWRnZXRzKHNlbGYpOgotICAgICAgICBzZWxmLm1lbnUgPSBTdHJpbmdWYXIoc2VsZikKLSAgICAgICAgc2VsZi5wYXRoID0gU3RyaW5nVmFyKHNlbGYpCi0gICAgICAgIHNlbGYuZm9udFNpemUgPSBTdHJpbmdWYXIoc2VsZikKLSAgICAgICAgc2VsZi5mcmFtZU1haW4gPSBGcmFtZShzZWxmLCBib3JkZXJ3aWR0aD0yLCByZWxpZWY9R1JPT1ZFKQotICAgICAgICBzZWxmLmZyYW1lTWFpbi5wYWNrKHNpZGU9VE9QLCBleHBhbmQ9VFJVRSwgZmlsbD1CT1RIKQotICAgICAgICBsYWJlbE1lbnUgPSBMYWJlbChzZWxmLmZyYW1lTWFpbiwgYW5jaG9yPVcsIGp1c3RpZnk9TEVGVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nTWVudSBJdGVtOicpCi0gICAgICAgIHNlbGYuZW50cnlNZW51ID0gRW50cnkoc2VsZi5mcmFtZU1haW4sIHRleHR2YXJpYWJsZT1zZWxmLm1lbnUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MzApCi0gICAgICAgIHNlbGYuZW50cnlNZW51LmZvY3VzX3NldCgpCi0gICAgICAgIGxhYmVsUGF0aCA9IExhYmVsKHNlbGYuZnJhbWVNYWluLCBhbmNob3I9VywganVzdGlmeT1MRUZULAotICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdIZWxwIEZpbGUgUGF0aDogRW50ZXIgVVJMIG9yIGJyb3dzZSBmb3IgZmlsZScpCi0gICAgICAgIHNlbGYuZW50cnlQYXRoID0gRW50cnkoc2VsZi5mcmFtZU1haW4sIHRleHR2YXJpYWJsZT1zZWxmLnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9NDApCi0gICAgICAgIHNlbGYuZW50cnlNZW51LmZvY3VzX3NldCgpCi0gICAgICAgIGxhYmVsTWVudS5wYWNrKGFuY2hvcj1XLCBwYWR4PTUsIHBhZHk9MykKLSAgICAgICAgc2VsZi5lbnRyeU1lbnUucGFjayhhbmNob3I9VywgcGFkeD01LCBwYWR5PTMpCi0gICAgICAgIGxhYmVsUGF0aC5wYWNrKGFuY2hvcj1XLCBwYWR4PTUsIHBhZHk9MykKLSAgICAgICAgc2VsZi5lbnRyeVBhdGgucGFjayhhbmNob3I9VywgcGFkeD01LCBwYWR5PTMpCi0gICAgICAgIGJyb3dzZUJ1dHRvbiA9IEJ1dHRvbihzZWxmLmZyYW1lTWFpbiwgdGV4dD0nQnJvd3NlJywgd2lkdGg9OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5icm93c2VfZmlsZSkKLSAgICAgICAgYnJvd3NlQnV0dG9uLnBhY2socGFkeT0zKQotICAgICAgICBmcmFtZUJ1dHRvbnMgPSBGcmFtZShzZWxmKQotICAgICAgICBmcmFtZUJ1dHRvbnMucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1YKQotICAgICAgICBzZWxmLmJ1dHRvbk9rID0gQnV0dG9uKGZyYW1lQnV0dG9ucywgdGV4dD0nT0snLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTgsIGRlZmF1bHQ9QUNUSVZFLCAgY29tbWFuZD1zZWxmLm9rKQotICAgICAgICBzZWxmLmJ1dHRvbk9rLmdyaWQocm93PTAsIGNvbHVtbj0wLCBwYWR4PTUscGFkeT01KQotICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbCA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsIHRleHQ9J0NhbmNlbCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTgsIGNvbW1hbmQ9c2VsZi5jYW5jZWwpCi0gICAgICAgIHNlbGYuYnV0dG9uQ2FuY2VsLmdyaWQocm93PTAsIGNvbHVtbj0xLCBwYWR4PTUsIHBhZHk9NSkKLQotICAgIGRlZiBicm93c2VfZmlsZShzZWxmKToKLSAgICAgICAgZmlsZXR5cGVzID0gWwotICAgICAgICAgICAgKCJIVE1MIEZpbGVzIiwgIiouaHRtICouaHRtbCIsICJURVhUIiksCi0gICAgICAgICAgICAoIlBERiBGaWxlcyIsICIqLnBkZiIsICJURVhUIiksCi0gICAgICAgICAgICAoIldpbmRvd3MgSGVscCBGaWxlcyIsICIqLmNobSIpLAotICAgICAgICAgICAgKCJUZXh0IEZpbGVzIiwgIioudHh0IiwgIlRFWFQiKSwKLSAgICAgICAgICAgICgiQWxsIEZpbGVzIiwgIioiKV0KLSAgICAgICAgcGF0aCA9IHNlbGYucGF0aC5nZXQoKQotICAgICAgICBpZiBwYXRoOgotICAgICAgICAgICAgZGlyLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYmFzZSA9IE5vbmUKLSAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6Ci0gICAgICAgICAgICAgICAgZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMuZXhlY3V0YWJsZSksICdEb2MnKQotICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcik6Ci0gICAgICAgICAgICAgICAgICAgIGRpciA9IG9zLmdldGN3ZCgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGRpciA9IG9zLmdldGN3ZCgpCi0gICAgICAgIG9wZW5kaWFsb2cgPSB0a0ZpbGVEaWFsb2cuT3BlbihwYXJlbnQ9c2VsZiwgZmlsZXR5cGVzPWZpbGV0eXBlcykKLSAgICAgICAgZmlsZSA9IG9wZW5kaWFsb2cuc2hvdyhpbml0aWFsZGlyPWRpciwgaW5pdGlhbGZpbGU9YmFzZSkKLSAgICAgICAgaWYgZmlsZToKLSAgICAgICAgICAgIHNlbGYucGF0aC5zZXQoZmlsZSkKLQotICAgIGRlZiBtZW51X29rKHNlbGYpOgotICAgICAgICAiU2ltcGxlIHZhbGlkaXR5IGNoZWNrIGZvciBhIHNlbnNpYmxlIG1lbnUgaXRlbSBuYW1lIgotICAgICAgICBtZW51X29rID0gVHJ1ZQotICAgICAgICBtZW51ID0gc2VsZi5tZW51LmdldCgpCi0gICAgICAgIG1lbnUuc3RyaXAoKQotICAgICAgICBpZiBub3QgbWVudToKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J01lbnUgSXRlbSBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05vIG1lbnUgaXRlbSBzcGVjaWZpZWQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZikKLSAgICAgICAgICAgIHNlbGYuZW50cnlNZW51LmZvY3VzX3NldCgpCi0gICAgICAgICAgICBtZW51X29rID0gRmFsc2UKLSAgICAgICAgZWxpZiBsZW4obWVudSkgPiAzMDoKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J01lbnUgSXRlbSBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J01lbnUgaXRlbSB0b28gbG9uZzonCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuTGltaXQgMzAgY2hhcmFjdGVycy4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZikKLSAgICAgICAgICAgIHNlbGYuZW50cnlNZW51LmZvY3VzX3NldCgpCi0gICAgICAgICAgICBtZW51X29rID0gRmFsc2UKLSAgICAgICAgcmV0dXJuIG1lbnVfb2sKLQotICAgIGRlZiBwYXRoX29rKHNlbGYpOgotICAgICAgICAiU2ltcGxlIHZhbGlkaXR5IGNoZWNrIGZvciBtZW51IGZpbGUgcGF0aCIKLSAgICAgICAgcGF0aF9vayA9IFRydWUKLSAgICAgICAgcGF0aCA9IHNlbGYucGF0aC5nZXQoKQotICAgICAgICBwYXRoLnN0cmlwKCkKLSAgICAgICAgaWYgbm90IHBhdGg6ICNubyBwYXRoIHNwZWNpZmllZAotICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nRmlsZSBQYXRoIEVycm9yJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gaGVscCBmaWxlIHBhdGggc3BlY2lmaWVkLicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQotICAgICAgICAgICAgc2VsZi5lbnRyeVBhdGguZm9jdXNfc2V0KCkKLSAgICAgICAgICAgIHBhdGhfb2sgPSBGYWxzZQotICAgICAgICBlbGlmIHBhdGguc3RhcnRzd2l0aCgoJ3d3dy4nLCAnaHR0cCcpKToKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGlmIHBhdGhbOjVdID09ICdmaWxlOic6Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbNTpdCi0gICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6Ci0gICAgICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nRmlsZSBQYXRoIEVycm9yJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0hlbHAgZmlsZSBwYXRoIGRvZXMgbm90IGV4aXN0LicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZikKLSAgICAgICAgICAgICAgICBzZWxmLmVudHJ5UGF0aC5mb2N1c19zZXQoKQotICAgICAgICAgICAgICAgIHBhdGhfb2sgPSBGYWxzZQotICAgICAgICByZXR1cm4gcGF0aF9vawotCi0gICAgZGVmIG9rKHNlbGYsIGV2ZW50PU5vbmUpOgotICAgICAgICBpZiBzZWxmLm1lbnVfb2soKSBhbmQgc2VsZi5wYXRoX29rKCk6Ci0gICAgICAgICAgICBzZWxmLnJlc3VsdCA9IChzZWxmLm1lbnUuZ2V0KCkuc3RyaXAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aC5nZXQoKS5zdHJpcCgpKQotICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgotICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnJlc3VsdFsxXQotICAgICAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgoJ3d3dycsICdmaWxlOicsICdodHRwOicsICdodHRwczonKSk6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAjIE1hYyBTYWZhcmkgaW5zaXN0cyBvbiB1c2luZyB0aGUgVVJJIGZvcm0gZm9yIGxvY2FsIGZpbGVzCi0gICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gbGlzdChzZWxmLnJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRbMV0gPSAiZmlsZTovLyIgKyBwYXRoCi0gICAgICAgICAgICBzZWxmLmRlc3Ryb3koKQotCi0gICAgZGVmIGNhbmNlbChzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgc2VsZi5yZXN1bHQgPSBOb25lCi0gICAgICAgIHNlbGYuZGVzdHJveSgpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgaW1wb3J0IHVuaXR0ZXN0Ci0gICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9jb25maWdfaGVscCcsCi0gICAgICAgICAgICAgICAgICAgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCi0KLSAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KLSAgICBydW4oR2V0SGVscFNvdXJjZURpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzc4MzYuLjAwMDAwMDAKLS0tIGEvTGliL2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0iIiIKLURpYWxvZyB0aGF0IGFsbG93cyB1c2VyIHRvIHNwZWNpZnkgYSBuZXcgY29uZmlnIGZpbGUgc2VjdGlvbiBuYW1lLgotVXNlZCB0byBnZXQgbmV3IGhpZ2hsaWdodCB0aGVtZSBhbmQga2V5YmluZGluZyBzZXQgbmFtZXMuCi1UaGUgJ3JldHVybiB2YWx1ZScgZm9yIHRoZSBkaWFsb2csIHVzZWQgdHdvIHBsYWNlZCBpbiBjb25maWdEaWFsb2cucHksCi1pcyB0aGUgLnJlc3VsdCBhdHRyaWJ1dGUgc2V0IGluIHRoZSBPayBhbmQgQ2FuY2VsIG1ldGhvZHMuCi0iIiIKLWZyb20gdGtpbnRlciBpbXBvcnQgKgotaW1wb3J0IHRraW50ZXIubWVzc2FnZWJveCBhcyB0a01lc3NhZ2VCb3gKLQotY2xhc3MgR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2coVG9wbGV2ZWwpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLCB1c2VkX25hbWVzLCBfaHRlc3Q9RmFsc2UpOgotICAgICAgICAiIiIKLSAgICAgICAgbWVzc2FnZSAtIHN0cmluZywgaW5mb3JtYXRpb25hbCBtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICAgICAgdXNlZF9uYW1lcyAtIHN0cmluZyBjb2xsZWN0aW9uLCBuYW1lcyBhbHJlYWR5IGluIHVzZSBmb3IgdmFsaWRpdHkgY2hlY2sKLSAgICAgICAgX2h0ZXN0IC0gYm9vbCwgY2hhbmdlIGJveCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcgaHRlc3QKLSAgICAgICAgIiIiCi0gICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKLSAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKLSAgICAgICAgc2VsZi5yZXNpemFibGUoaGVpZ2h0PUZBTFNFLCB3aWR0aD1GQUxTRSkKLSAgICAgICAgc2VsZi50aXRsZSh0aXRsZSkKLSAgICAgICAgc2VsZi50cmFuc2llbnQocGFyZW50KQotICAgICAgICBzZWxmLmdyYWJfc2V0KCkKLSAgICAgICAgc2VsZi5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuQ2FuY2VsKQotICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAotICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCi0gICAgICAgIHNlbGYudXNlZF9uYW1lcyA9IHVzZWRfbmFtZXMKLSAgICAgICAgc2VsZi5jcmVhdGVfd2lkZ2V0cygpCi0gICAgICAgIHNlbGYud2l0aGRyYXcoKSAgI2hpZGUgd2hpbGUgc2V0dGluZyBnZW9tZXRyeQotICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQotICAgICAgICAjbmVlZHMgdG8gYmUgZG9uZSBoZXJlIHNvIHRoYXQgdGhlIHdpbmZvX3JlcXdpZHRoIGlzIHZhbGlkCi0gICAgICAgIHNlbGYubWVzc2FnZUluZm8uY29uZmlnKHdpZHRoPXNlbGYuZnJhbWVNYWluLndpbmZvX3JlcXdpZHRoKCkpCi0gICAgICAgIHNlbGYuZ2VvbWV0cnkoCi0gICAgICAgICAgICAgICAgIislZCslZCIgJSAoCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eCgpICsKLSAgICAgICAgICAgICAgICAgICAgKHBhcmVudC53aW5mb193aWR0aCgpLzIgLSBzZWxmLndpbmZvX3JlcXdpZHRoKCkvMiksCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsKLSAgICAgICAgICAgICAgICAgICAgKChwYXJlbnQud2luZm9faGVpZ2h0KCkvMiAtIHNlbGYud2luZm9fcmVxaGVpZ2h0KCkvMikKLSAgICAgICAgICAgICAgICAgICAgaWYgbm90IF9odGVzdCBlbHNlIDEwMCkKLSAgICAgICAgICAgICAgICApICkgICNjZW50cmUgZGlhbG9nIG92ZXIgcGFyZW50IChvciBiZWxvdyBodGVzdCBib3gpCi0gICAgICAgIHNlbGYuZGVpY29uaWZ5KCkgICNnZW9tZXRyeSBzZXQsIHVuaGlkZQotICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKLQotICAgIGRlZiBjcmVhdGVfd2lkZ2V0cyhzZWxmKToKLSAgICAgICAgc2VsZi5uYW1lID0gU3RyaW5nVmFyKHNlbGYucGFyZW50KQotICAgICAgICBzZWxmLmZvbnRTaXplID0gU3RyaW5nVmFyKHNlbGYucGFyZW50KQotICAgICAgICBzZWxmLmZyYW1lTWFpbiA9IEZyYW1lKHNlbGYsIGJvcmRlcndpZHRoPTIsIHJlbGllZj1TVU5LRU4pCi0gICAgICAgIHNlbGYuZnJhbWVNYWluLnBhY2soc2lkZT1UT1AsIGV4cGFuZD1UUlVFLCBmaWxsPUJPVEgpCi0gICAgICAgIHNlbGYubWVzc2FnZUluZm8gPSBNZXNzYWdlKHNlbGYuZnJhbWVNYWluLCBhbmNob3I9VywganVzdGlmeT1MRUZULAotICAgICAgICAgICAgICAgICAgICBwYWR4PTUsIHBhZHk9NSwgdGV4dD1zZWxmLm1lc3NhZ2UpICMsYXNwZWN0PTIwMCkKLSAgICAgICAgZW50cnlOYW1lID0gRW50cnkoc2VsZi5mcmFtZU1haW4sIHRleHR2YXJpYWJsZT1zZWxmLm5hbWUsIHdpZHRoPTMwKQotICAgICAgICBlbnRyeU5hbWUuZm9jdXNfc2V0KCkKLSAgICAgICAgc2VsZi5tZXNzYWdlSW5mby5wYWNrKHBhZHg9NSwgcGFkeT01KSAjLCBleHBhbmQ9VFJVRSwgZmlsbD1CT1RIKQotICAgICAgICBlbnRyeU5hbWUucGFjayhwYWR4PTUsIHBhZHk9NSkKLQotICAgICAgICBmcmFtZUJ1dHRvbnMgPSBGcmFtZShzZWxmLCBwYWR5PTIpCi0gICAgICAgIGZyYW1lQnV0dG9ucy5wYWNrKHNpZGU9Qk9UVE9NKQotICAgICAgICBzZWxmLmJ1dHRvbk9rID0gQnV0dG9uKGZyYW1lQnV0dG9ucywgdGV4dD0nT2snLAotICAgICAgICAgICAgICAgIHdpZHRoPTgsIGNvbW1hbmQ9c2VsZi5PaykKLSAgICAgICAgc2VsZi5idXR0b25Pay5wYWNrKHNpZGU9TEVGVCwgcGFkeD01KQotICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbCA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsIHRleHQ9J0NhbmNlbCcsCi0gICAgICAgICAgICAgICAgd2lkdGg9OCwgY29tbWFuZD1zZWxmLkNhbmNlbCkKLSAgICAgICAgc2VsZi5idXR0b25DYW5jZWwucGFjayhzaWRlPVJJR0hULCBwYWR4PTUpCi0KLSAgICBkZWYgbmFtZV9vayhzZWxmKToKLSAgICAgICAgJycnIEFmdGVyIHN0cmlwcGluZyBlbnRlcmVkIG5hbWUsIGNoZWNrIHRoYXQgaXQgaXMgYSAgc2Vuc2libGUKLSAgICAgICAgQ29uZmlnUGFyc2VyIGZpbGUgc2VjdGlvbiBuYW1lLiBSZXR1cm4gaXQgaWYgaXQgaXMsICcnIGlmIG5vdC4KLSAgICAgICAgJycnCi0gICAgICAgIG5hbWUgPSBzZWxmLm5hbWUuZ2V0KCkuc3RyaXAoKQotICAgICAgICBpZiBub3QgbmFtZTogI25vIG5hbWUgc3BlY2lmaWVkCi0gICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdOYW1lIEVycm9yJywKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gbmFtZSBzcGVjaWZpZWQuJywgcGFyZW50PXNlbGYpCi0gICAgICAgIGVsaWYgbGVuKG5hbWUpPjMwOiAjbmFtZSB0b28gbG9uZwotICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nTmFtZSBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05hbWUgdG9vIGxvbmcuIEl0IHNob3VsZCBiZSBubyBtb3JlIHRoYW4gJysKLSAgICAgICAgICAgICAgICAgICAgJzMwIGNoYXJhY3RlcnMuJywgcGFyZW50PXNlbGYpCi0gICAgICAgICAgICBuYW1lID0gJycKLSAgICAgICAgZWxpZiBuYW1lIGluIHNlbGYudXNlZF9uYW1lczoKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J05hbWUgRXJyb3InLAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUaGlzIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuJywgcGFyZW50PXNlbGYpCi0gICAgICAgICAgICBuYW1lID0gJycKLSAgICAgICAgcmV0dXJuIG5hbWUKLQotICAgIGRlZiBPayhzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgbmFtZSA9IHNlbGYubmFtZV9vaygpCi0gICAgICAgIGlmIG5hbWU6Ci0gICAgICAgICAgICBzZWxmLnJlc3VsdCA9IG5hbWUKLSAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpCi0KLSAgICBkZWYgQ2FuY2VsKHNlbGYsIGV2ZW50PU5vbmUpOgotICAgICAgICBzZWxmLnJlc3VsdCA9ICcnCi0gICAgICAgIHNlbGYuZGVzdHJveSgpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgaW1wb3J0IHVuaXR0ZXN0Ci0gICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9jb25maWdfbmFtZScsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQotCi0gICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCi0gICAgcnVuKEdldENmZ1NlY3Rpb25OYW1lRGlhbG9nKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ19rZXkucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvY29uZmlnX2tleS5weQppbmRleCBlNjQzOGJmLi4yNjAyMjkzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2NvbmZpZ19rZXkucHkKQEAgLTIsMzEgKzIsMzUgQEAKIERpYWxvZyBmb3IgYnVpbGRpbmcgVGtpbnRlciBhY2NlbGVyYXRvciBrZXkgYmluZGluZ3MKICIiIgogZnJvbSB0a2ludGVyIGltcG9ydCAqCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKIGltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CiBpbXBvcnQgc3RyaW5nCiBpbXBvcnQgc3lzCiAKIGNsYXNzIEdldEtleXNEaWFsb2coVG9wbGV2ZWwpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLHBhcmVudCx0aXRsZSxhY3Rpb24sY3VycmVudEtleVNlcXVlbmNlcyxfaHRlc3Q9RmFsc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBhY3Rpb24sIGN1cnJlbnRLZXlTZXF1ZW5jZXMsCisgICAgICAgICAgICAgICAgIF9odGVzdD1GYWxzZSwgX3V0ZXN0PUZhbHNlKToKICAgICAgICAgIiIiCiAgICAgICAgIGFjdGlvbiAtIHN0cmluZywgdGhlIG5hbWUgb2YgdGhlIHZpcnR1YWwgZXZlbnQgdGhlc2Uga2V5cyB3aWxsIGJlCiAgICAgICAgICAgICAgICAgIG1hcHBlZCB0bwogICAgICAgICBjdXJyZW50S2V5cyAtIGxpc3QsIGEgbGlzdCBvZiBhbGwga2V5IHNlcXVlbmNlIGxpc3RzIGN1cnJlbnRseSBtYXBwZWQKICAgICAgICAgICAgICAgICAgdG8gdmlydHVhbCBldmVudHMsIGZvciBvdmVybGFwIGNoZWNraW5nCisgICAgICAgIF91dGVzdCAtIGJvb2wsIGRvIG5vdCB3YWl0IHdoZW4gcnVubmluZyB1bml0dGVzdAogICAgICAgICBfaHRlc3QgLSBib29sLCBjaGFuZ2UgYm94IGxvY2F0aW9uIHdoZW4gcnVubmluZyBodGVzdAogICAgICAgICAiIiIKICAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQorICAgICAgICBzZWxmLndpdGhkcmF3KCkgI2hpZGUgd2hpbGUgc2V0dGluZyBnZW9tZXRyeQogICAgICAgICBzZWxmLmNvbmZpZ3VyZShib3JkZXJ3aWR0aD01KQotICAgICAgICBzZWxmLnJlc2l6YWJsZShoZWlnaHQ9RkFMU0Usd2lkdGg9RkFMU0UpCisgICAgICAgIHNlbGYucmVzaXphYmxlKGhlaWdodD1GQUxTRSwgd2lkdGg9RkFMU0UpCiAgICAgICAgIHNlbGYudGl0bGUodGl0bGUpCiAgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKICAgICAgICAgc2VsZi5ncmFiX3NldCgpCiAgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLkNhbmNlbCkKICAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKICAgICAgICAgc2VsZi5hY3Rpb249YWN0aW9uCi0gICAgICAgIHNlbGYuY3VycmVudEtleVNlcXVlbmNlcz1jdXJyZW50S2V5U2VxdWVuY2VzCi0gICAgICAgIHNlbGYucmVzdWx0PScnCi0gICAgICAgIHNlbGYua2V5U3RyaW5nPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmN1cnJlbnRLZXlTZXF1ZW5jZXMgPSBjdXJyZW50S2V5U2VxdWVuY2VzCisgICAgICAgIHNlbGYucmVzdWx0ID0gJycKKyAgICAgICAgc2VsZi5rZXlTdHJpbmcgPSBTdHJpbmdWYXIoc2VsZikKICAgICAgICAgc2VsZi5rZXlTdHJpbmcuc2V0KCcnKQogICAgICAgICBzZWxmLlNldE1vZGlmaWVyc0ZvclBsYXRmb3JtKCkgIyBzZXQgc2VsZi5tb2RpZmllcnMsIHNlbGYubW9kaWZpZXJfbGFiZWwKICAgICAgICAgc2VsZi5tb2RpZmllcl92YXJzID0gW10KQEAgLTM3LDcgKzQxLDYgQEAKICAgICAgICAgc2VsZi5hZHZhbmNlZCA9IEZhbHNlCiAgICAgICAgIHNlbGYuQ3JlYXRlV2lkZ2V0cygpCiAgICAgICAgIHNlbGYuTG9hZEZpbmFsS2V5TGlzdCgpCi0gICAgICAgIHNlbGYud2l0aGRyYXcoKSAjaGlkZSB3aGlsZSBzZXR0aW5nIGdlb21ldHJ5CiAgICAgICAgIHNlbGYudXBkYXRlX2lkbGV0YXNrcygpCiAgICAgICAgIHNlbGYuZ2VvbWV0cnkoCiAgICAgICAgICAgICAgICAgIislZCslZCIgJSAoCkBAIC00Nyw4ICs1MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIgLSBzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpCiAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaHRlc3QgZWxzZSAxNTApCiAgICAgICAgICAgICAgICAgKSApICAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudCAob3IgYmVsb3cgaHRlc3QgYm94KQotICAgICAgICBzZWxmLmRlaWNvbmlmeSgpICNnZW9tZXRyeSBzZXQsIHVuaGlkZQotICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKKyAgICAgICAgaWYgbm90IF91dGVzdDoKKyAgICAgICAgICAgIHNlbGYuZGVpY29uaWZ5KCkgI2dlb21ldHJ5IHNldCwgdW5oaWRlCisgICAgICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKIAogICAgIGRlZiBDcmVhdGVXaWRnZXRzKHNlbGYpOgogICAgICAgICBmcmFtZU1haW4gPSBGcmFtZShzZWxmLGJvcmRlcndpZHRoPTIscmVsaWVmPVNVTktFTikKQEAgLTI2MSw2ICsyNjUsNyBAQAogICAgICAgICAgICAga2V5c09LID0gVHJ1ZQogICAgICAgICByZXR1cm4ga2V5c09LCiAKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oR2V0S2V5c0RpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ0RpYWxvZy5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ2RpYWxvZy5weQpzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9jb25maWdEaWFsb2cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NvbmZpZ2RpYWxvZy5weQppbmRleCA1ZjViZDM2Li5mYTQ3YWFhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWdEaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnZGlhbG9nLnB5CkBAIC0xMCwxOCArMTAsMTggQEAKIAogIiIiCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLWltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Citmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKIGltcG9ydCB0a2ludGVyLmNvbG9yY2hvb3NlciBhcyB0a0NvbG9yQ2hvb3NlcgogaW1wb3J0IHRraW50ZXIuZm9udCBhcyB0a0ZvbnQKK2ltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotZnJvbSBpZGxlbGliLmR5bk9wdGlvbk1lbnVXaWRnZXQgaW1wb3J0IER5bk9wdGlvbk1lbnUKLWZyb20gaWRsZWxpYi5rZXliaW5kaW5nRGlhbG9nIGltcG9ydCBHZXRLZXlzRGlhbG9nCi1mcm9tIGlkbGVsaWIuY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cgaW1wb3J0IEdldENmZ1NlY3Rpb25OYW1lRGlhbG9nCi1mcm9tIGlkbGVsaWIuY29uZmlnSGVscFNvdXJjZUVkaXQgaW1wb3J0IEdldEhlbHBTb3VyY2VEaWFsb2cKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuY29uZmlnX2tleSBpbXBvcnQgR2V0S2V5c0RpYWxvZworZnJvbSBpZGxlbGliLmR5bm9wdGlvbiBpbXBvcnQgRHluT3B0aW9uTWVudQorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKK2Zyb20gaWRsZWxpYi5xdWVyeSBpbXBvcnQgU2VjdGlvbk5hbWUsIEhlbHBTb3VyY2UKIGZyb20gaWRsZWxpYi50YWJiZWRwYWdlcyBpbXBvcnQgVGFiYmVkUGFnZVNldAotZnJvbSBpZGxlbGliLnRleHRWaWV3IGltcG9ydCB2aWV3X3RleHQKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSBpZGxlbGliLnRleHR2aWV3IGltcG9ydCB2aWV3X3RleHQKIAogY2xhc3MgQ29uZmlnRGlhbG9nKFRvcGxldmVsKToKIApAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICBzZWxmLmNyZWF0ZV9hY3Rpb25fYnV0dG9ucygpLnBhY2soc2lkZT1CT1RUT00pCiAKICAgICBkZWYgY3JlYXRlX2FjdGlvbl9idXR0b25zKHNlbGYpOgotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpOgogICAgICAgICAgICAgIyBDaGFuZ2luZyB0aGUgZGVmYXVsdCBwYWRkaW5nIG9uIE9TWCByZXN1bHRzIGluIHVucmVhZGFibGUKICAgICAgICAgICAgICMgdGV4dCBpbiB0aGUgYnV0dG9ucwogICAgICAgICAgICAgcGFkZGluZ0FyZ3MgPSB7fQpAQCAtMzQxLDYgKzM0MSw3IEBACiAgICAgICAgIGJ1dHRvblNhdmVDdXN0b21LZXlzID0gQnV0dG9uKAogICAgICAgICAgICAgICAgIGZyYW1lc1sxXSwgdGV4dD0nU2F2ZSBhcyBOZXcgQ3VzdG9tIEtleSBTZXQnLAogICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5TYXZlQXNOZXdLZXlTZXQpCisgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzID0gTGFiZWwoZnJhbWVzWzBdLCBiZD0yKQogCiAgICAgICAgICMjd2lkZ2V0IHBhY2tpbmcKICAgICAgICAgI2JvZHkKQEAgLTM2MSw2ICszNjIsNyBAQAogICAgICAgICBzZWxmLnJhZGlvS2V5c0N1c3RvbS5ncmlkKHJvdz0xLCBjb2x1bW49MCwgc3RpY2t5PVcrTlMpCiAgICAgICAgIHNlbGYub3B0TWVudUtleXNCdWlsdGluLmdyaWQocm93PTAsIGNvbHVtbj0xLCBzdGlja3k9TlNFVykKICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0N1c3RvbS5ncmlkKHJvdz0xLCBjb2x1bW49MSwgc3RpY2t5PU5TRVcpCisgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzLmdyaWQocm93PTAsIGNvbHVtbj0yLCBzdGlja3k9TlNFVywgcGFkeD01LCBwYWR5PTUpCiAgICAgICAgIHNlbGYuYnV0dG9uRGVsZXRlQ3VzdG9tS2V5cy5wYWNrKHNpZGU9TEVGVCwgZmlsbD1YLCBleHBhbmQ9VHJ1ZSwgcGFkeD0yKQogICAgICAgICBidXR0b25TYXZlQ3VzdG9tS2V5cy5wYWNrKHNpZGU9TEVGVCwgZmlsbD1YLCBleHBhbmQ9VHJ1ZSwgcGFkeD0yKQogICAgICAgICBmcmFtZXNbMF0ucGFjayhzaWRlPVRPUCwgZmlsbD1CT1RILCBleHBhbmQ9VHJ1ZSkKQEAgLTQ2NCwyNCArNDY2LDI0IEBACiAgICAgICAgIHJldHVybiBmcmFtZQogCiAgICAgZGVmIEF0dGFjaFZhckNhbGxiYWNrcyhzZWxmKToKLSAgICAgICAgc2VsZi5mb250U2l6ZS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9mb250KQotICAgICAgICBzZWxmLmZvbnROYW1lLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2ZvbnQpCi0gICAgICAgIHNlbGYuZm9udEJvbGQudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfZm9udCkKLSAgICAgICAgc2VsZi5zcGFjZU51bS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9zcGFjZU51bSkKLSAgICAgICAgc2VsZi5jb2xvdXIudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfY29sb3VyKQotICAgICAgICBzZWxmLmJ1aWx0aW5UaGVtZS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9idWlsdGluVGhlbWUpCi0gICAgICAgIHNlbGYuY3VzdG9tVGhlbWUudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tVGhlbWUpCi0gICAgICAgIHNlbGYudGhlbWVJc0J1aWx0aW4udHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfdGhlbWVJc0J1aWx0aW4pCi0gICAgICAgIHNlbGYuaGlnaGxpZ2h0VGFyZ2V0LnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2hpZ2hsaWdodFRhcmdldCkKLSAgICAgICAgc2VsZi5rZXlCaW5kaW5nLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2tleUJpbmRpbmcpCi0gICAgICAgIHNlbGYuYnVpbHRpbktleXMudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfYnVpbHRpbktleXMpCi0gICAgICAgIHNlbGYuY3VzdG9tS2V5cy50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9jdXN0b21LZXlzKQotICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2tleXNBcmVCdWlsdGluKQotICAgICAgICBzZWxmLndpbldpZHRoLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX3dpbldpZHRoKQotICAgICAgICBzZWxmLndpbkhlaWdodC50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF93aW5IZWlnaHQpCi0gICAgICAgIHNlbGYuc3RhcnR1cEVkaXQudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfc3RhcnR1cEVkaXQpCi0gICAgICAgIHNlbGYuYXV0b1NhdmUudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfYXV0b1NhdmUpCi0gICAgICAgIHNlbGYuZW5jb2RpbmcudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfZW5jb2RpbmcpCisgICAgICAgIHNlbGYuZm9udFNpemUudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9mb250KQorICAgICAgICBzZWxmLmZvbnROYW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfZm9udCkKKyAgICAgICAgc2VsZi5mb250Qm9sZC50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2ZvbnQpCisgICAgICAgIHNlbGYuc3BhY2VOdW0udHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9zcGFjZU51bSkKKyAgICAgICAgc2VsZi5jb2xvdXIudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9jb2xvdXIpCisgICAgICAgIHNlbGYuYnVpbHRpblRoZW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfYnVpbHRpblRoZW1lKQorICAgICAgICBzZWxmLmN1c3RvbVRoZW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tVGhlbWUpCisgICAgICAgIHNlbGYudGhlbWVJc0J1aWx0aW4udHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF90aGVtZUlzQnVpbHRpbikKKyAgICAgICAgc2VsZi5oaWdobGlnaHRUYXJnZXQudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9oaWdobGlnaHRUYXJnZXQpCisgICAgICAgIHNlbGYua2V5QmluZGluZy50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2tleUJpbmRpbmcpCisgICAgICAgIHNlbGYuYnVpbHRpbktleXMudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9idWlsdGluS2V5cykKKyAgICAgICAgc2VsZi5jdXN0b21LZXlzLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tS2V5cykKKyAgICAgICAgc2VsZi5rZXlzQXJlQnVpbHRpbi50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2tleXNBcmVCdWlsdGluKQorICAgICAgICBzZWxmLndpbldpZHRoLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfd2luV2lkdGgpCisgICAgICAgIHNlbGYud2luSGVpZ2h0LnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfd2luSGVpZ2h0KQorICAgICAgICBzZWxmLnN0YXJ0dXBFZGl0LnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfc3RhcnR1cEVkaXQpCisgICAgICAgIHNlbGYuYXV0b1NhdmUudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9hdXRvU2F2ZSkKKyAgICAgICAgc2VsZi5lbmNvZGluZy50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2VuY29kaW5nKQogCiAgICAgZGVmIHJlbW92ZV92YXJfY2FsbGJhY2tzKHNlbGYpOgogICAgICAgICAiUmVtb3ZlIGNhbGxiYWNrcyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4iCkBAIC00OTIsNyArNDk0LDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmtleUJpbmRpbmcsIHNlbGYuYnVpbHRpbktleXMsIHNlbGYuY3VzdG9tS2V5cywKICAgICAgICAgICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLCBzZWxmLndpbldpZHRoLCBzZWxmLndpbkhlaWdodCwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0dXBFZGl0LCBzZWxmLmF1dG9TYXZlLCBzZWxmLmVuY29kaW5nLCk6Ci0gICAgICAgICAgICB2YXIudHJhY2VfdmRlbGV0ZSgndycsIHZhci50cmFjZV92aW5mbygpWzBdWzFdKQorICAgICAgICAgICAgdmFyLnRyYWNlX3JlbW92ZSgnd3JpdGUnLCB2YXIudHJhY2VfaW5mbygpWzBdWzFdKQogCiAgICAgZGVmIFZhckNoYW5nZWRfZm9udChzZWxmLCAqcGFyYW1zKToKICAgICAgICAgJycnV2hlbiBvbmUgZm9udCBhdHRyaWJ1dGUgY2hhbmdlcywgc2F2ZSB0aGVtIGFsbCwgYXMgdGhleSBhcmUKQEAgLTUxNCwxMCArNTE2LDExIEBACiAgICAgICAgIHNlbGYuT25OZXdDb2xvdXJTZXQoKQogCiAgICAgZGVmIFZhckNoYW5nZWRfYnVpbHRpblRoZW1lKHNlbGYsICpwYXJhbXMpOgorICAgICAgICBvbGR0aGVtZXMgPSAoJ0lETEUgQ2xhc3NpYycsICdJRExFIE5ldycpCiAgICAgICAgIHZhbHVlID0gc2VsZi5idWlsdGluVGhlbWUuZ2V0KCkKLSAgICAgICAgaWYgdmFsdWUgPT0gJ0lETEUgRGFyayc6Ci0gICAgICAgICAgICBpZiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnVGhlbWUnLCAnbmFtZScpICE9ICdJRExFIE5ldyc6Ci0gICAgICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsICdUaGVtZScsICduYW1lJywgJ0lETEUgQ2xhc3NpYycpCisgICAgICAgIGlmIHZhbHVlIG5vdCBpbiBvbGR0aGVtZXM6CisgICAgICAgICAgICBpZiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnVGhlbWUnLCAnbmFtZScpIG5vdCBpbiBvbGR0aGVtZXM6CisgICAgICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsICdUaGVtZScsICduYW1lJywgb2xkdGhlbWVzWzBdKQogICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsICdUaGVtZScsICduYW1lMicsIHZhbHVlKQogICAgICAgICAgICAgc2VsZi5uZXdfY3VzdG9tX3RoZW1lLmNvbmZpZyh0ZXh0PSdOZXcgdGhlbWUsIHNlZSBIZWxwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmc9JyM1MDAwMDAnKQpAQCAtNTU3LDggKzU2MCwyMyBAQAogICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnZXh0ZW5zaW9ucycsIGV4dEtleWJpbmRTZWN0aW9uLCBldmVudCwgdmFsdWUpCiAKICAgICBkZWYgVmFyQ2hhbmdlZF9idWlsdGluS2V5cyhzZWxmLCAqcGFyYW1zKToKKyAgICAgICAgb2xka2V5cyA9ICgKKyAgICAgICAgICAgICdJRExFIENsYXNzaWMgV2luZG93cycsCisgICAgICAgICAgICAnSURMRSBDbGFzc2ljIFVuaXgnLAorICAgICAgICAgICAgJ0lETEUgQ2xhc3NpYyBNYWMnLAorICAgICAgICAgICAgJ0lETEUgQ2xhc3NpYyBPU1gnLAorICAgICAgICApCiAgICAgICAgIHZhbHVlID0gc2VsZi5idWlsdGluS2V5cy5nZXQoKQotICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZScsIHZhbHVlKQorICAgICAgICBpZiB2YWx1ZSBub3QgaW4gb2xka2V5czoKKyAgICAgICAgICAgIGlmIGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdLZXlzJywgJ25hbWUnKSBub3QgaW4gb2xka2V5czoKKyAgICAgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZScsIG9sZGtleXNbMF0pCisgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZTInLCB2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzLmNvbmZpZyh0ZXh0PSdOZXcga2V5IHNldCwgc2VlIEhlbHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnPScjNTAwMDAwJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCAnS2V5cycsICduYW1lJywgdmFsdWUpCisgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZTInLCAnJykKKyAgICAgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzLmNvbmZpZyh0ZXh0PScnLCBmZz0nYmxhY2snKQogICAgICAgICBzZWxmLkxvYWRLZXlzTGlzdCh2YWx1ZSkKIAogICAgIGRlZiBWYXJDaGFuZ2VkX2N1c3RvbUtleXMoc2VsZiwgKnBhcmFtcyk6CkBAIC02ODMsNyArNzAxLDcgQEAKICAgICBkZWYgR2V0TmV3S2V5c05hbWUoc2VsZiwgbWVzc2FnZSk6CiAgICAgICAgIHVzZWROYW1lcyA9IChpZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsICdrZXlzJykgKwogICAgICAgICAgICAgICAgIGlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCdkZWZhdWx0JywgJ2tleXMnKSkKLSAgICAgICAgbmV3S2V5U2V0ID0gR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2coCisgICAgICAgIG5ld0tleVNldCA9IFNlY3Rpb25OYW1lKAogICAgICAgICAgICAgICAgIHNlbGYsICdOZXcgQ3VzdG9tIEtleSBTZXQnLCBtZXNzYWdlLCB1c2VkTmFtZXMpLnJlc3VsdAogICAgICAgICByZXR1cm4gbmV3S2V5U2V0CiAKQEAgLTc2Nyw4ICs3ODUsMTAgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNDdXN0b20uU2V0TWVudShpdGVtTGlzdCwgaXRlbUxpc3RbMF0pCiAgICAgICAgICNyZXZlcnQgdG8gZGVmYXVsdCBrZXkgc2V0Ci0gICAgICAgIHNlbGYua2V5c0FyZUJ1aWx0aW4uc2V0KGlkbGVDb25mLmRlZmF1bHRDZmdbJ21haW4nXS5HZXQoJ0tleXMnLCAnZGVmYXVsdCcpKQotICAgICAgICBzZWxmLmJ1aWx0aW5LZXlzLnNldChpZGxlQ29uZi5kZWZhdWx0Q2ZnWydtYWluJ10uR2V0KCdLZXlzJywgJ25hbWUnKSkKKyAgICAgICAgc2VsZi5rZXlzQXJlQnVpbHRpbi5zZXQoaWRsZUNvbmYuZGVmYXVsdENmZ1snbWFpbiddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXQoJ0tleXMnLCAnZGVmYXVsdCcpKQorICAgICAgICBzZWxmLmJ1aWx0aW5LZXlzLnNldChpZGxlQ29uZi5kZWZhdWx0Q2ZnWydtYWluJ10uR2V0KCdLZXlzJywgJ25hbWUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZGxlQ29uZi5kZWZhdWx0X2tleXMoKSkKICAgICAgICAgI3VzZXIgY2FuJ3QgYmFjayBvdXQgb2YgdGhlc2UgY2hhbmdlcywgdGhleSBtdXN0IGJlIGFwcGxpZWQgbm93CiAgICAgICAgIHNlbGYuU2F2ZUFsbENoYW5nZWRDb25maWdzKCkKICAgICAgICAgc2VsZi5BY3RpdmF0ZUNvbmZpZ0NoYW5nZXMoKQpAQCAtODM2LDcgKzg1Niw3IEBACiAgICAgZGVmIEdldE5ld1RoZW1lTmFtZShzZWxmLCBtZXNzYWdlKToKICAgICAgICAgdXNlZE5hbWVzID0gKGlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCd1c2VyJywgJ2hpZ2hsaWdodCcpICsKICAgICAgICAgICAgICAgICBpZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsICdoaWdobGlnaHQnKSkKLSAgICAgICAgbmV3VGhlbWUgPSBHZXRDZmdTZWN0aW9uTmFtZURpYWxvZygKKyAgICAgICAgbmV3VGhlbWUgPSBTZWN0aW9uTmFtZSgKICAgICAgICAgICAgICAgICBzZWxmLCAnTmV3IEN1c3RvbSBUaGVtZScsIG1lc3NhZ2UsIHVzZWROYW1lcykucmVzdWx0CiAgICAgICAgIHJldHVybiBuZXdUaGVtZQogCkBAIC05MzksNyArOTU5LDggQEAKICAgICAgICAgICAgICAgICBzZWxmLmJ1dHRvbkhlbHBMaXN0UmVtb3ZlLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKIAogICAgIGRlZiBIZWxwTGlzdEl0ZW1BZGQoc2VsZik6Ci0gICAgICAgIGhlbHBTb3VyY2UgPSBHZXRIZWxwU291cmNlRGlhbG9nKHNlbGYsICdOZXcgSGVscCBTb3VyY2UnKS5yZXN1bHQKKyAgICAgICAgaGVscFNvdXJjZSA9IEhlbHBTb3VyY2Uoc2VsZiwgJ05ldyBIZWxwIFNvdXJjZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkucmVzdWx0CiAgICAgICAgIGlmIGhlbHBTb3VyY2U6CiAgICAgICAgICAgICBzZWxmLnVzZXJIZWxwTGlzdC5hcHBlbmQoKGhlbHBTb3VyY2VbMF0sIGhlbHBTb3VyY2VbMV0pKQogICAgICAgICAgICAgc2VsZi5saXN0SGVscC5pbnNlcnQoRU5ELCBoZWxwU291cmNlWzBdKQpAQCAtOTQ5LDE2ICs5NzAsMTcgQEAKICAgICBkZWYgSGVscExpc3RJdGVtRWRpdChzZWxmKToKICAgICAgICAgaXRlbUluZGV4ID0gc2VsZi5saXN0SGVscC5pbmRleChBTkNIT1IpCiAgICAgICAgIGhlbHBTb3VyY2UgPSBzZWxmLnVzZXJIZWxwTGlzdFtpdGVtSW5kZXhdCi0gICAgICAgIG5ld0hlbHBTb3VyY2UgPSBHZXRIZWxwU291cmNlRGlhbG9nKAotICAgICAgICAgICAgICAgIHNlbGYsICdFZGl0IEhlbHAgU291cmNlJywgbWVudUl0ZW09aGVscFNvdXJjZVswXSwKLSAgICAgICAgICAgICAgICBmaWxlUGF0aD1oZWxwU291cmNlWzFdKS5yZXN1bHQKLSAgICAgICAgaWYgKG5vdCBuZXdIZWxwU291cmNlKSBvciAobmV3SGVscFNvdXJjZSA9PSBoZWxwU291cmNlKToKLSAgICAgICAgICAgIHJldHVybiAjbm8gY2hhbmdlcwotICAgICAgICBzZWxmLnVzZXJIZWxwTGlzdFtpdGVtSW5kZXhdID0gbmV3SGVscFNvdXJjZQotICAgICAgICBzZWxmLmxpc3RIZWxwLmRlbGV0ZShpdGVtSW5kZXgpCi0gICAgICAgIHNlbGYubGlzdEhlbHAuaW5zZXJ0KGl0ZW1JbmRleCwgbmV3SGVscFNvdXJjZVswXSkKLSAgICAgICAgc2VsZi5VcGRhdGVVc2VySGVscENoYW5nZWRJdGVtcygpCi0gICAgICAgIHNlbGYuU2V0SGVscExpc3RCdXR0b25TdGF0ZXMoKQorICAgICAgICBuZXdIZWxwU291cmNlID0gSGVscFNvdXJjZSgKKyAgICAgICAgICAgICAgICBzZWxmLCAnRWRpdCBIZWxwIFNvdXJjZScsCisgICAgICAgICAgICAgICAgbWVudWl0ZW09aGVscFNvdXJjZVswXSwKKyAgICAgICAgICAgICAgICBmaWxlcGF0aD1oZWxwU291cmNlWzFdLAorICAgICAgICAgICAgICAgICkucmVzdWx0CisgICAgICAgIGlmIG5ld0hlbHBTb3VyY2UgYW5kIG5ld0hlbHBTb3VyY2UgIT0gaGVscFNvdXJjZToKKyAgICAgICAgICAgIHNlbGYudXNlckhlbHBMaXN0W2l0ZW1JbmRleF0gPSBuZXdIZWxwU291cmNlCisgICAgICAgICAgICBzZWxmLmxpc3RIZWxwLmRlbGV0ZShpdGVtSW5kZXgpCisgICAgICAgICAgICBzZWxmLmxpc3RIZWxwLmluc2VydChpdGVtSW5kZXgsIG5ld0hlbHBTb3VyY2VbMF0pCisgICAgICAgICAgICBzZWxmLlVwZGF0ZVVzZXJIZWxwQ2hhbmdlZEl0ZW1zKCkKKyAgICAgICAgICAgIHNlbGYuU2V0SGVscExpc3RCdXR0b25TdGF0ZXMoKQogCiAgICAgZGVmIEhlbHBMaXN0SXRlbVJlbW92ZShzZWxmKToKICAgICAgICAgaXRlbUluZGV4ID0gc2VsZi5saXN0SGVscC5pbmRleChBTkNIT1IpCkBAIC05OTYsNyArMTAxOCw4IEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgICMjZm9udCBzaXplIGRyb3Bkb3duCiAgICAgICAgIHNlbGYub3B0TWVudUZvbnRTaXplLlNldE1lbnUoKCc3JywgJzgnLCAnOScsICcxMCcsICcxMScsICcxMicsICcxMycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxNCcsICcxNicsICcxOCcsICcyMCcsICcyMicpLCBmb250U2l6ZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxNCcsICcxNicsICcxOCcsICcyMCcsICcyMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyNScsICcyOScsICczNCcsICc0MCcpLCBmb250U2l6ZSApCiAgICAgICAgICMjZm9udFdlaWdodAogICAgICAgICBzZWxmLmZvbnRCb2xkLnNldChmb250Qm9sZCkKICAgICAgICAgIyNmb250IHNhbXBsZQpAQCAtMTA2NSw3ICsxMDg4LDcgQEAKICAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNDdXN0b20uU2V0TWVudShpdGVtTGlzdCwgY3VycmVudE9wdGlvbikKICAgICAgICAgICAgIGl0ZW1MaXN0ID0gaWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ2RlZmF1bHQnLCAna2V5cycpCiAgICAgICAgICAgICBpdGVtTGlzdC5zb3J0KCkKLSAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNCdWlsdGluLlNldE1lbnUoaXRlbUxpc3QsIGl0ZW1MaXN0WzBdKQorICAgICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0J1aWx0aW4uU2V0TWVudShpdGVtTGlzdCwgaWRsZUNvbmYuZGVmYXVsdF9rZXlzKCkpCiAgICAgICAgIHNlbGYuU2V0S2V5c1R5cGUoKQogICAgICAgICAjI2xvYWQga2V5c2V0IGVsZW1lbnQgbGlzdAogICAgICAgICBrZXlTZXROYW1lID0gaWRsZUNvbmYuQ3VycmVudEtleXMoKQpAQCAtMTM2NywxMiArMTM5MCwxOCBAQAogW0NhbmNlbF0gb25seSBjYW5jZWxzIGNoYW5nZXMgbWFkZSBzaW5jZSB0aGUgbGFzdCBzYXZlLgogJycnCiBoZWxwX3BhZ2VzID0gewotICAgICdIaWdobGlnaHRpbmcnOicnJworICAgICdIaWdobGlnaHRpbmcnOiAnJycKIEhpZ2hsaWdodGluZzoKIFRoZSBJRExFIERhcmsgY29sb3IgdGhlbWUgaXMgbmV3IGluIE9jdG9iZXIgMjAxNS4gIEl0IGNhbiBvbmx5CiBiZSB1c2VkIHdpdGggb2xkZXIgSURMRSByZWxlYXNlcyBpZiBpdCBpcyBzYXZlZCBhcyBhIGN1c3RvbQogdGhlbWUsIHdpdGggYSBkaWZmZXJlbnQgbmFtZS4KLScnJworJycnLAorICAgICdLZXlzJzogJycnCitLZXlzOgorVGhlIElETEUgTW9kZXJuIFVuaXgga2V5IHNldCBpcyBuZXcgaW4gSnVuZSAyMDE2LiAgSXQgY2FuIG9ubHkKK2JlIHVzZWQgd2l0aCBvbGRlciBJRExFIHJlbGVhc2VzIGlmIGl0IGlzIHNhdmVkIGFzIGEgY3VzdG9tCitrZXkgc2V0LCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuCisnJycsCiB9CiAKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRGVidWdnZXIucHkgYi9MaWIvaWRsZWxpYi9kZWJ1Z2dlci5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9EZWJ1Z2dlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZGVidWdnZXIucHkKaW5kZXggZDVlMjE3ZC4uMTE0ZDBkMSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvRGVidWdnZXIucHkKKysrIGIvTGliL2lkbGVsaWIvZGVidWdnZXIucHkKQEAgLTEsOSArMSwxMiBAQAotaW1wb3J0IG9zCiBpbXBvcnQgYmRiCitpbXBvcnQgb3MKKwogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1mcm9tIGlkbGVsaWIuV2luZG93TGlzdCBpbXBvcnQgTGlzdGVkVG9wbGV2ZWwKLWZyb20gaWRsZWxpYi5TY3JvbGxlZExpc3QgaW1wb3J0IFNjcm9sbGVkTGlzdAotZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0Citmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKKworZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKK2Zyb20gaWRsZWxpYi5zY3JvbGxlZGxpc3QgaW1wb3J0IFNjcm9sbGVkTGlzdAorZnJvbSBpZGxlbGliLndpbmRvd3MgaW1wb3J0IExpc3RlZFRvcGxldmVsCiAKIAogY2xhc3MgSWRiKGJkYi5CZGIpOgpAQCAtMzQsOCArMzcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBwcmV2X2ZyYW1lID0gZnJhbWUuZl9iYWNrCi0gICAgICAgICAgICBpZiBwcmV2X2ZyYW1lLmZfY29kZS5jb19maWxlbmFtZS5jb3VudCgnRGVidWdnZXIucHknKToKLSAgICAgICAgICAgICAgICAjICh0aGF0IHRlc3Qgd2lsbCBjYXRjaCBib3RoIERlYnVnZ2VyLnB5IGFuZCBSZW1vdGVEZWJ1Z2dlci5weSkKKyAgICAgICAgICAgIHByZXZfbmFtZSA9IHByZXZfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgICAgICBpZiAnaWRsZWxpYicgaW4gcHJldl9uYW1lIGFuZCAnZGVidWdnZXInIGluIHByZXZfbmFtZToKKyAgICAgICAgICAgICAgICAjIGNhdGNoIGJvdGggaWRsZWxpYi9kZWJ1Z2dlci5weSBhbmQgaWRsZWxpYi9kZWJ1Z2dlcl9yLnB5CisgICAgICAgICAgICAgICAgIyBvbiBib3RoIHBvc2l4IGFuZCB3aW5kb3dzCiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbl9ycGNfY29kZShwcmV2X2ZyYW1lKQogCkBAIC0zNzAsNyArMzc1LDcgQEAKIGNsYXNzIFN0YWNrVmlld2VyKFNjcm9sbGVkTGlzdCk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBmbGlzdCwgZ3VpKToKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0FxdWFUaygpOgorICAgICAgICBpZiBtYWNvc3guaXNBcXVhVGsoKToKICAgICAgICAgICAgICMgQXQgbGVhc3Qgb24gd2l0aCB0aGUgc3RvY2sgQXF1YVRrIHZlcnNpb24gb24gT1NYIDEwLjQgeW91J2xsCiAgICAgICAgICAgICAjIGdldCBhIHNoYWtpbmcgR1VJIHRoYXQgZXZlbnR1YWxseSBraWxscyBJRExFIGlmIHRoZSB3aWR0aAogICAgICAgICAgICAgIyBhcmd1bWVudCBpcyBzcGVjaWZpZWQuCkBAIC01MDIsNyArNTA3LDcgQEAKICAgICAgICAgICAgICMKICAgICAgICAgICAgICMgVGhlcmUgaXMgYWxzbyBhbiBvYnNjdXJlIGJ1ZyBpbiBzb3J0ZWQoZGljdCkgd2hlcmUgdGhlCiAgICAgICAgICAgICAjIGludGVycHJldGVyIGdldHMgaW50byBhIGxvb3AgcmVxdWVzdGluZyBub24tZXhpc3RpbmcgZGljdFswXSwKLSAgICAgICAgICAgICMgZGljdFsxXSwgZGljdFsyXSwgZXRjIGZyb20gdGhlIFJlbW90ZURlYnVnZ2VyLkRpY3RQcm94eS4KKyAgICAgICAgICAgICMgZGljdFsxXSwgZGljdFsyXSwgZXRjIGZyb20gdGhlIGRlYnVnZ2VyX3IuRGljdFByb3h5LgogICAgICAgICAgICAgIyMjCiAgICAgICAgICAgICBrZXlzX2xpc3QgPSBkaWN0LmtleXMoKQogICAgICAgICAgICAgbmFtZXMgPSBzb3J0ZWQoa2V5c19saXN0KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUmVtb3RlRGVidWdnZXIucHkgYi9MaWIvaWRsZWxpYi9kZWJ1Z2dlcl9yLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9kZWJ1Z2dlcl9yLnB5CmluZGV4IGJlMjI2MmYuLmJjOTcxMjcgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL2RlYnVnZ2VyX3IucHkKQEAgLTIxLDcgKzIxLDcgQEAKICIiIgogCiBpbXBvcnQgdHlwZXMKLWZyb20gaWRsZWxpYiBpbXBvcnQgRGVidWdnZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZGVidWdnZXIKIAogZGVidWdnaW5nID0gMAogCkBAIC0xODcsNyArMTg3LDcgQEAKIAogICAgICIiIgogICAgIGd1aV9wcm94eSA9IEdVSVByb3h5KHJwY2hhbmRsZXIsIGd1aV9hZGFwX29pZCkKLSAgICBpZGIgPSBEZWJ1Z2dlci5JZGIoZ3VpX3Byb3h5KQorICAgIGlkYiA9IGRlYnVnZ2VyLklkYihndWlfcHJveHkpCiAgICAgaWRiX2FkYXAgPSBJZGJBZGFwdGVyKGlkYikKICAgICBycGNoYW5kbGVyLnJlZ2lzdGVyKGlkYl9hZGFwX29pZCwgaWRiX2FkYXApCiAgICAgcmV0dXJuIGlkYl9hZGFwX29pZApAQCAtMzYyLDcgKzM2Miw3IEBACiAgICAgaWRiX2FkYXBfb2lkID0gcnBjY2x0LnJlbW90ZWNhbGwoImV4ZWMiLCAic3RhcnRfdGhlX2RlYnVnZ2VyIixcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWlfYWRhcF9vaWQsKSwge30pCiAgICAgaWRiX3Byb3h5ID0gSWRiUHJveHkocnBjY2x0LCBweXNoZWxsLCBpZGJfYWRhcF9vaWQpCi0gICAgZ3VpID0gRGVidWdnZXIuRGVidWdnZXIocHlzaGVsbCwgaWRiX3Byb3h5KQorICAgIGd1aSA9IGRlYnVnZ2VyLkRlYnVnZ2VyKHB5c2hlbGwsIGlkYl9wcm94eSkKICAgICBndWlfYWRhcCA9IEdVSUFkYXB0ZXIocnBjY2x0LCBndWkpCiAgICAgcnBjY2x0LnJlZ2lzdGVyKGd1aV9hZGFwX29pZCwgZ3VpX2FkYXApCiAgICAgcmV0dXJuIGd1aQpAQCAtMzczLDcgKzM3Myw3IEBACiAgICAgUmVxdWVzdCB0aGF0IHRoZSBSUENTZXJ2ZXIgc2h1dCBkb3duIHRoZSBzdWJwcm9jZXNzIGRlYnVnZ2VyIGFuZCBsaW5rLgogICAgIFVucmVnaXN0ZXIgdGhlIEdVSUFkYXB0ZXIsIHdoaWNoIHdpbGwgY2F1c2UgYSBHQyBvbiB0aGUgSWRsZSBwcm9jZXNzCiAgICAgZGVidWdnZXIgYW5kIFJQQyBsaW5rIG9iamVjdHMuICAoVGhlIHNlY29uZCByZWZlcmVuY2UgdG8gdGhlIGRlYnVnZ2VyIEdVSQotICAgIGlzIGRlbGV0ZWQgaW4gUHlTaGVsbC5jbG9zZV9yZW1vdGVfZGVidWdnZXIoKS4pCisgICAgaXMgZGVsZXRlZCBpbiBweXNoZWxsLmNsb3NlX3JlbW90ZV9kZWJ1Z2dlcigpLikKIAogICAgICIiIgogICAgIGNsb3NlX3N1YnByb2Nlc3NfZGVidWdnZXIocnBjY2x0KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weSBiL0xpYi9pZGxlbGliL2RlYnVnb2JqLnB5CnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL09iamVjdEJyb3dzZXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2RlYnVnb2JqLnB5CmluZGV4IDdiNTdhYTQuLmI3MGIxM2MgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL09iamVjdEJyb3dzZXIucHkKKysrIGIvTGliL2lkbGVsaWIvZGVidWdvYmoucHkKQEAgLTgsMTMgKzgsMTAgQEAKIAogIyBYWFggVE8gRE86CiAjIC0gZm9yIGNsYXNzZXMvbW9kdWxlcywgYWRkICJvcGVuIHNvdXJjZSIgdG8gb2JqZWN0IGJyb3dzZXIKLQotaW1wb3J0IHJlCi0KLWZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlSXRlbSwgVHJlZU5vZGUsIFNjcm9sbGVkQ2FudmFzCi0KIGZyb20gcmVwcmxpYiBpbXBvcnQgUmVwcgogCitmcm9tIGlkbGVsaWIudHJlZSBpbXBvcnQgVHJlZUl0ZW0sIFRyZWVOb2RlLCBTY3JvbGxlZENhbnZhcworCiBteXJlcHIgPSBSZXByKCkKIG15cmVwci5tYXhzdHJpbmcgPSAxMDAKIG15cmVwci5tYXhvdGhlciA9IDEwMApAQCAtMTIyLDIxICsxMTksMjAgQEAKICAgICByZXR1cm4gYyhsYWJlbHRleHQsIG9iamVjdCwgc2V0ZnVuY3Rpb24pCiAKIAotZGVmIF9vYmplY3RfYnJvd3NlcihwYXJlbnQpOgorZGVmIF9vYmplY3RfYnJvd3NlcihwYXJlbnQpOiAgIyBodGVzdCAjCiAgICAgaW1wb3J0IHN5cwotICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVGsKLSAgICByb290ID0gVGsoKQotICAgIHJvb3QudGl0bGUoIlRlc3QgT2JqZWN0QnJvd3NlciIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQotICAgIHJvb3QuY29uZmlndXJlKGJkPTAsIGJnPSJ5ZWxsb3ciKQotICAgIHJvb3QuZm9jdXNfc2V0KCkKLSAgICBzYyA9IFNjcm9sbGVkQ2FudmFzKHJvb3QsIGJnPSJ3aGl0ZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCB0YWtlZm9jdXM9MSkKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsCisgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQorICAgIHRvcC50aXRsZSgiVGVzdCBkZWJ1ZyBvYmplY3QgYnJvd3NlciIpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4ICsgMTAwLCB5ICsgMTc1KSkKKyAgICB0b3AuY29uZmlndXJlKGJkPTAsIGJnPSJ5ZWxsb3ciKQorICAgIHRvcC5mb2N1c19zZXQoKQorICAgIHNjID0gU2Nyb2xsZWRDYW52YXModG9wLCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCiAgICAgc2MuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCiAgICAgaXRlbSA9IG1ha2Vfb2JqZWN0dHJlZWl0ZW0oInN5cyIsIHN5cykKICAgICBub2RlID0gVHJlZU5vZGUoc2MuY2FudmFzLCBOb25lLCBpdGVtKQogICAgIG5vZGUudXBkYXRlKCkKLSAgICByb290Lm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1JlbW90ZU9iamVjdEJyb3dzZXIucHkgYi9MaWIvaWRsZWxpYi9kZWJ1Z29ial9yLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9SZW1vdGVPYmplY3RCcm93c2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9kZWJ1Z29ial9yLnB5CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9EZWxlZ2F0b3IucHkgYi9MaWIvaWRsZWxpYi9kZWxlZ2F0b3IucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0RlbGVnYXRvci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZGVsZWdhdG9yLnB5CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9keW5PcHRpb25NZW51V2lkZ2V0LnB5IGIvTGliL2lkbGVsaWIvZHlub3B0aW9uLnB5CnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2R5bm9wdGlvbi5weQppbmRleCA1MTViNGJhLi45YzZmZmE0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9keW5PcHRpb25NZW51V2lkZ2V0LnB5CisrKyBiL0xpYi9pZGxlbGliL2R5bm9wdGlvbi5weQpAQCAtMyw2ICszLDcgQEAKIGFuZCBzZXR0aW5nIG9mIGhpZ2hsaWdodHRoaWNrbmVzcwogIiIiCiBpbXBvcnQgY29weQorCiBmcm9tIHRraW50ZXIgaW1wb3J0IE9wdGlvbk1lbnUsIF9zZXRpdCwgU3RyaW5nVmFyLCBCdXR0b24KIAogY2xhc3MgRHluT3B0aW9uTWVudShPcHRpb25NZW51KToKQEAgLTM0LDEyICszNSwxMiBAQAogICAgICAgICAgICAgc2VsZi52YXJpYWJsZS5zZXQodmFsdWUpCiAKIGRlZiBfZHluX29wdGlvbl9tZW51KHBhcmVudCk6ICAjIGh0ZXN0ICMKLSAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsCisgICAgZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCAjICsgU3RyaW5nVmFyLCBCdXR0b24KIAotICAgIHRvcCA9IFRvcGxldmVsKCkKKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgdG9wLnRpdGxlKCJUZXRzIGR5bmFtaWMgb3B0aW9uIG1lbnUiKQotICAgIHRvcC5nZW9tZXRyeSgiMjAweDEwMCslZCslZCIgJSAocGFyZW50LndpbmZvX3Jvb3R4KCkgKyAyMDAsCi0gICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArIDE1MCkpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiMjAweDEwMCslZCslZCIgJSAoeCArIDI1MCwgeSArIDE3NSkpCiAgICAgdG9wLmZvY3VzX3NldCgpCiAKICAgICB2YXIgPSBTdHJpbmdWYXIodG9wKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRWRpdG9yV2luZG93LnB5IGIvTGliL2lkbGVsaWIvZWRpdG9yLnB5CnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZWRpdG9yLnB5CmluZGV4IDk5NDRkYTMuLmFlNDc1Y2IgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weQorKysgYi9MaWIvaWRsZWxpYi9lZGl0b3IucHkKQEAgLTYsMjggKzYsMzQgQEAKIGltcG9ydCByZQogaW1wb3J0IHN0cmluZwogaW1wb3J0IHN5cwotZnJvbSB0a2ludGVyIGltcG9ydCAqCi1pbXBvcnQgdGtpbnRlci5zaW1wbGVkaWFsb2cgYXMgdGtTaW1wbGVEaWFsb2cKLWltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CitpbXBvcnQgdG9rZW5pemUKIGltcG9ydCB0cmFjZWJhY2sKIGltcG9ydCB3ZWJicm93c2VyCiAKLWZyb20gaWRsZWxpYi5NdWx0aUNhbGwgaW1wb3J0IE11bHRpQ2FsbENyZWF0b3IKLWZyb20gaWRsZWxpYiBpbXBvcnQgV2luZG93TGlzdAotZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hEaWFsb2cKLWZyb20gaWRsZWxpYiBpbXBvcnQgR3JlcERpYWxvZwotZnJvbSBpZGxlbGliIGltcG9ydCBSZXBsYWNlRGlhbG9nCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFB5UGFyc2UKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotZnJvbSBpZGxlbGliIGltcG9ydCBhYm91dERpYWxvZywgdGV4dFZpZXcsIGNvbmZpZ0RpYWxvZwotZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0Citmcm9tIHRraW50ZXIgaW1wb3J0ICoKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IFNjcm9sbGJhcgoraW1wb3J0IHRraW50ZXIuc2ltcGxlZGlhbG9nIGFzIHRrU2ltcGxlRGlhbG9nCitpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAorCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliIGltcG9ydCBjb25maWdkaWFsb2cKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZ3JlcAogZnJvbSBpZGxlbGliIGltcG9ydCBoZWxwCitmcm9tIGlkbGVsaWIgaW1wb3J0IGhlbHBfYWJvdXQKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4Citmcm9tIGlkbGVsaWIubXVsdGljYWxsIGltcG9ydCBNdWx0aUNhbGxDcmVhdG9yCitmcm9tIGlkbGVsaWIgaW1wb3J0IHB5cGFyc2UKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcXVlcnkKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcmVwbGFjZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2gKK2Zyb20gaWRsZWxpYiBpbXBvcnQgdGV4dHZpZXcKK2Zyb20gaWRsZWxpYiBpbXBvcnQgd2luZG93cwogCiAjIFRoZSBkZWZhdWx0IHRhYiBzZXR0aW5nIGZvciBhIFRleHQgd2lkZ2V0LCBpbiBhdmVyYWdlLXdpZHRoIGNoYXJhY3RlcnMuCiBUS19UQUJXSURUSF9ERUZBVUxUID0gOAotCiBfcHlfdmVyc2lvbiA9ICcgKCVzKScgJSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCiAKKwogZGVmIF9zcGhpbnhfdmVyc2lvbigpOgogICAgICJGb3JtYXQgc3lzLnZlcnNpb25faW5mbyB0byBwcm9kdWNlIHRoZSBTcGhpbnggdmVyc2lvbiBzdHJpbmcgdXNlZCB0byBpbnN0YWxsIHRoZSBjaG0gZG9jcyIKICAgICBtYWpvciwgbWlub3IsIG1pY3JvLCBsZXZlbCwgc2VyaWFsID0gc3lzLnZlcnNpb25faW5mbwpAQCAtNDAsNjMgKzQ2LDE2IEBACiAgICAgcmV0dXJuIHJlbGVhc2UKIAogCi1jbGFzcyBIZWxwRGlhbG9nKG9iamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYucGFyZW50ID0gTm9uZSAgICAgICMgcGFyZW50IG9mIGhlbHAgd2luZG93Ci0gICAgICAgIHNlbGYuZGxnID0gTm9uZSAgICAgICAgICMgdGhlIGhlbHAgd2luZG93IGl0ZXNlbGYKLQotICAgIGRlZiBkaXNwbGF5KHNlbGYsIHBhcmVudCwgbmVhcj1Ob25lKToKLSAgICAgICAgIiIiIERpc3BsYXkgdGhlIGhlbHAgZGlhbG9nLgotCi0gICAgICAgICAgICBwYXJlbnQgLSBwYXJlbnQgd2lkZ2V0IGZvciB0aGUgaGVscCB3aW5kb3cKLQotICAgICAgICAgICAgbmVhciAtIGEgVG9wbGV2ZWwgd2lkZ2V0IChlLmcuIEVkaXRvcldpbmRvdyBvciBQeVNoZWxsKQotICAgICAgICAgICAgICAgICAgIHRvIHVzZSBhcyBhIHJlZmVyZW5jZSBmb3IgcGxhY2luZyB0aGUgaGVscCB3aW5kb3cKLSAgICAgICAgIiIiCi0gICAgICAgIGltcG9ydCB3YXJuaW5ncyBhcyB3Ci0gICAgICAgIHcud2FybigiRWRpdG9yV2luZG93LkhlbHBEaWFsb2cgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgSWRsZS5cbiIKLSAgICAgICAgICAgICAgICJJdCB3aWxsIGJlIHJlbW92ZWQgaW4gMy42IG9yIGxhdGVyLlxuIgotICAgICAgICAgICAgICAgIkl0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHByaXZhdGUgaGVscC5IZWxwV2luZG93XG4iLAotICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgICAgIGlmIHNlbGYuZGxnIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnNob3dfZGlhbG9nKHBhcmVudCkKLSAgICAgICAgaWYgbmVhcjoKLSAgICAgICAgICAgIHNlbGYubmVhcndpbmRvdyhuZWFyKQotCi0gICAgZGVmIHNob3dfZGlhbG9nKHNlbGYsIHBhcmVudCk6Ci0gICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50Ci0gICAgICAgIGZuPW9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksJ2hlbHAudHh0JykKLSAgICAgICAgc2VsZi5kbGcgPSBkbGcgPSB0ZXh0Vmlldy52aWV3X2ZpbGUocGFyZW50LCdIZWxwJyxmbiwgbW9kYWw9RmFsc2UpCi0gICAgICAgIGRsZy5iaW5kKCc8RGVzdHJveT4nLCBzZWxmLmRlc3Ryb3ksICcrJykKLQotICAgIGRlZiBuZWFyd2luZG93KHNlbGYsIG5lYXIpOgotICAgICAgICAjIFBsYWNlIHRoZSBoZWxwIGRpYWxvZyBuZWFyIHRoZSB3aW5kb3cgc3BlY2lmaWVkIGJ5IHBhcmVudC4KLSAgICAgICAgIyBOb3RlIC0gdGhpcyBtYXkgbm90IHJlcG9zaXRpb24gdGhlIHdpbmRvdyBpbiBNZXRhY2l0eQotICAgICAgICAjICBpZiAiL2FwcHMvbWV0YWNpdHkvZ2VuZXJhbC9kaXNhYmxlX3dvcmthcm91bmRzIiBpcyBlbmFibGVkCi0gICAgICAgIGRsZyA9IHNlbGYuZGxnCi0gICAgICAgIGdlb20gPSAobmVhci53aW5mb19yb290eCgpICsgMTAsIG5lYXIud2luZm9fcm9vdHkoKSArIDEwKQotICAgICAgICBkbGcud2l0aGRyYXcoKQotICAgICAgICBkbGcuZ2VvbWV0cnkoIj0rJWQrJWQiICUgZ2VvbSkKLSAgICAgICAgZGxnLmRlaWNvbmlmeSgpCi0gICAgICAgIGRsZy5saWZ0KCkKLQotICAgIGRlZiBkZXN0cm95KHNlbGYsIGV2PU5vbmUpOgotICAgICAgICBzZWxmLmRsZyA9IE5vbmUKLSAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCi0KLWhlbHBEaWFsb2cgPSBIZWxwRGlhbG9nKCkgICMgc2luZ2xldG9uIGluc3RhbmNlLCBubyBsb25nZXIgdXNlZAotCi0KIGNsYXNzIEVkaXRvcldpbmRvdyhvYmplY3QpOgotICAgIGZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCi0gICAgZnJvbSBpZGxlbGliLkNvbG9yRGVsZWdhdG9yIGltcG9ydCBDb2xvckRlbGVnYXRvciwgY29sb3JfY29uZmlnCi0gICAgZnJvbSBpZGxlbGliLlVuZG9EZWxlZ2F0b3IgaW1wb3J0IFVuZG9EZWxlZ2F0b3IKLSAgICBmcm9tIGlkbGVsaWIuSU9CaW5kaW5nIGltcG9ydCBJT0JpbmRpbmcsIGZpbGVzeXN0ZW1lbmNvZGluZywgZW5jb2RpbmcKLSAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IEJpbmRpbmdzCisgICAgZnJvbSBpZGxlbGliLnBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKKyAgICBmcm9tIGlkbGVsaWIuY29sb3JpemVyIGltcG9ydCBDb2xvckRlbGVnYXRvciwgY29sb3JfY29uZmlnCisgICAgZnJvbSBpZGxlbGliLnVuZG8gaW1wb3J0IFVuZG9EZWxlZ2F0b3IKKyAgICBmcm9tIGlkbGVsaWIuaW9tZW51IGltcG9ydCBJT0JpbmRpbmcsIGVuY29kaW5nCisgICAgZnJvbSBpZGxlbGliIGltcG9ydCBtYWlubWVudQogICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwKLSAgICBmcm9tIGlkbGVsaWIuTXVsdGlTdGF0dXNCYXIgaW1wb3J0IE11bHRpU3RhdHVzQmFyCisgICAgZnJvbSBpZGxlbGliLnN0YXR1c2JhciBpbXBvcnQgTXVsdGlTdGF0dXNCYXIKIAorICAgIGZpbGVzeXN0ZW1lbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSAgIyBmb3IgZmlsZSBuYW1lcwogICAgIGhlbHBfdXJsID0gTm9uZQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0PU5vbmUsIGZpbGVuYW1lPU5vbmUsIGtleT1Ob25lLCByb290PU5vbmUpOgpAQCAtMTM2LDExICs5NSwxMSBAQAogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICBzeXMucHMxID0gJz4+PiAnCiAgICAgICAgIHNlbGYubWVudWJhciA9IE1lbnUocm9vdCkKLSAgICAgICAgc2VsZi50b3AgPSB0b3AgPSBXaW5kb3dMaXN0Lkxpc3RlZFRvcGxldmVsKHJvb3QsIG1lbnU9c2VsZi5tZW51YmFyKQorICAgICAgICBzZWxmLnRvcCA9IHRvcCA9IHdpbmRvd3MuTGlzdGVkVG9wbGV2ZWwocm9vdCwgbWVudT1zZWxmLm1lbnViYXIpCiAgICAgICAgIGlmIGZsaXN0OgogICAgICAgICAgICAgc2VsZi50a2ludGVyX3ZhcnMgPSBmbGlzdC52YXJzCiAgICAgICAgICAgICAjc2VsZi50b3AuaW5zdGFuY2VfZGljdCBtYWtlcyBmbGlzdC5pbnZlcnNlZGljdCBhdmFpbGFibGUgdG8KLSAgICAgICAgICAgICNjb25maWdEaWFsb2cucHkgc28gaXQgY2FuIGFjY2VzcyBhbGwgRWRpdG9yV2luZG93IGluc3RhbmNlcworICAgICAgICAgICAgI2NvbmZpZ2RpYWxvZy5weSBzbyBpdCBjYW4gYWNjZXNzIGFsbCBFZGl0b3JXaW5kb3cgaW5zdGFuY2VzCiAgICAgICAgICAgICBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0ID0gZmxpc3QuaW52ZXJzZWRpY3QKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYudGtpbnRlcl92YXJzID0ge30gICMga2V5czogVGtpbnRlciBldmVudCBuYW1lcwpAQCAtMTU4LDEzICsxMTcsMTAgQEAKICAgICAgICAgICAgICAgICAnd3JhcCc6ICdub25lJywKICAgICAgICAgICAgICAgICAnaGlnaGxpZ2h0dGhpY2tuZXNzJzogMCwKICAgICAgICAgICAgICAgICAnd2lkdGgnOiBzZWxmLndpZHRoLAotICAgICAgICAgICAgICAgICdoZWlnaHQnOiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnRWRpdG9yV2luZG93JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWlnaHQnLCB0eXBlPSdpbnQnKX0KLSAgICAgICAgaWYgVGtWZXJzaW9uID49IDguNToKLSAgICAgICAgICAgICMgU3RhcnRpbmcgd2l0aCB0ayA4LjUgd2UgaGF2ZSB0byBzZXQgdGhlIG5ldyB0YWJzdHlsZSBvcHRpb24KLSAgICAgICAgICAgICMgdG8gJ3dvcmRwcm9jZXNzb3InIHRvIGFjaGlldmUgdGhlIHNhbWUgZGlzcGxheSBvZiB0YWJzIGFzIGluCi0gICAgICAgICAgICAjIG9sZGVyIHRrIHZlcnNpb25zLgotICAgICAgICAgICAgdGV4dF9vcHRpb25zWyd0YWJzdHlsZSddID0gJ3dvcmRwcm9jZXNzb3InCisgICAgICAgICAgICAgICAgJ3RhYnN0eWxlJzogJ3dvcmRwcm9jZXNzb3InLCAgIyBuZXcgaW4gOC41CisgICAgICAgICAgICAgICAgJ2hlaWdodCc6IGlkbGVDb25mLkdldE9wdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICdtYWluJywgJ0VkaXRvcldpbmRvdycsICdoZWlnaHQnLCB0eXBlPSdpbnQnKSwKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgIHNlbGYudGV4dCA9IHRleHQgPSBNdWx0aUNhbGxDcmVhdG9yKFRleHQpKHRleHRfZnJhbWUsICoqdGV4dF9vcHRpb25zKQogICAgICAgICBzZWxmLnRvcC5mb2N1c2VkX3dpZGdldCA9IHNlbGYudGV4dAogCkBAIC0xNzMsNyArMTI5LDcgQEAKIAogICAgICAgICBzZWxmLnRvcC5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2xvc2UpCiAgICAgICAgIHNlbGYudG9wLmJpbmQoIjw8Y2xvc2Utd2luZG93Pj4iLCBzZWxmLmNsb3NlX2V2ZW50KQotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpOgogICAgICAgICAgICAgIyBDb21tYW5kLVcgb24gZWRpdG9yd2luZG93cyBkb2Vzbid0IHdvcmsgd2l0aG91dCB0aGlzLgogICAgICAgICAgICAgdGV4dC5iaW5kKCc8PGNsb3NlLXdpbmRvdz4+Jywgc2VsZi5jbG9zZV9ldmVudCkKICAgICAgICAgICAgICMgU29tZSBPUyBYIHN5c3RlbXMgaGF2ZSBvbmx5IG9uZSBtb3VzZSBidXR0b24sIHNvIHVzZQpAQCAtMzA5LDcgKzI2NSw3IEBACiAgICAgICAgICAgICAgICAgbWVudS5hZGRfc2VwYXJhdG9yKCkKICAgICAgICAgICAgICAgICBlbmQgPSBlbmQgKyAxCiAgICAgICAgICAgICBzZWxmLndtZW51X2VuZCA9IGVuZAotICAgICAgICAgICAgV2luZG93TGlzdC5yZWdpc3Rlcl9jYWxsYmFjayhzZWxmLnBvc3R3aW5kb3dzbWVudSkKKyAgICAgICAgICAgIHdpbmRvd3MucmVnaXN0ZXJfY2FsbGJhY2soc2VsZi5wb3N0d2luZG93c21lbnUpCiAKICAgICAgICAgIyBTb21lIGFic3RyYWN0aW9ucyBzbyBJRExFIGV4dGVuc2lvbnMgYXJlIGNyb3NzLUlERQogICAgICAgICBzZWxmLmFza3llc25vID0gdGtNZXNzYWdlQm94LmFza3llc25vCkBAIC00MTgsNyArMzc0LDcgQEAKICAgICAgICAgICAgIHVuZGVybGluZSwgbGFiZWwgPSBwcmVwc3RyKGxhYmVsKQogICAgICAgICAgICAgbWVudWRpY3RbbmFtZV0gPSBtZW51ID0gTWVudShtYmFyLCBuYW1lPW5hbWUsIHRlYXJvZmY9MCkKICAgICAgICAgICAgIG1iYXIuYWRkX2Nhc2NhZGUobGFiZWw9bGFiZWwsIG1lbnU9bWVudSwgdW5kZXJsaW5lPXVuZGVybGluZSkKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0NhcmJvblRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0NhcmJvblRrKCk6CiAgICAgICAgICAgICAjIEluc2VydCB0aGUgYXBwbGljYXRpb24gbWVudQogICAgICAgICAgICAgbWVudWRpY3RbJ2FwcGxpY2F0aW9uJ10gPSBtZW51ID0gTWVudShtYmFyLCBuYW1lPSdhcHBsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJvZmY9MCkKQEAgLTQzOSw3ICszOTUsNyBAQAogICAgICAgICAgICAgZW5kID0gLTEKICAgICAgICAgaWYgZW5kID4gc2VsZi53bWVudV9lbmQ6CiAgICAgICAgICAgICBtZW51LmRlbGV0ZShzZWxmLndtZW51X2VuZCsxLCBlbmQpCi0gICAgICAgIFdpbmRvd0xpc3QuYWRkX3dpbmRvd3NfdG9fbWVudShtZW51KQorICAgICAgICB3aW5kb3dzLmFkZF93aW5kb3dzX3RvX21lbnUobWVudSkKIAogICAgIHJtZW51ID0gTm9uZQogCkBAIC01MDcsMTcgKzQ2MywxNyBAQAogCiAgICAgZGVmIGFib3V0X2RpYWxvZyhzZWxmLCBldmVudD1Ob25lKToKICAgICAgICAgIkhhbmRsZSBIZWxwICdBYm91dCBJRExFJyBldmVudC4iCi0gICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3hTdXBwb3J0Lm92ZXJyaWRlUm9vdE1lbnUuYWJvdXRfZGlhbG9nLgotICAgICAgICBhYm91dERpYWxvZy5BYm91dERpYWxvZyhzZWxmLnRvcCwnQWJvdXQgSURMRScpCisgICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3gub3ZlcnJpZGVSb290TWVudS5hYm91dF9kaWFsb2cuCisgICAgICAgIGhlbHBfYWJvdXQuQWJvdXREaWFsb2coc2VsZi50b3AsJ0Fib3V0IElETEUnKQogCiAgICAgZGVmIGNvbmZpZ19kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgICJIYW5kbGUgT3B0aW9ucyAnQ29uZmlndXJlIElETEUnIGV2ZW50LiIKLSAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIG1hY29zeFN1cHBvcnQub3ZlcnJpZGVSb290TWVudS5jb25maWdfZGlhbG9nLgotICAgICAgICBjb25maWdEaWFsb2cuQ29uZmlnRGlhbG9nKHNlbGYudG9wLCdTZXR0aW5ncycpCisgICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3gub3ZlcnJpZGVSb290TWVudS5jb25maWdfZGlhbG9nLgorICAgICAgICBjb25maWdkaWFsb2cuQ29uZmlnRGlhbG9nKHNlbGYudG9wLCdTZXR0aW5ncycpCiAKICAgICBkZWYgaGVscF9kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgICJIYW5kbGUgSGVscCAnSURMRSBIZWxwJyBldmVudC4iCi0gICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3hTdXBwb3J0Lm92ZXJyaWRlUm9vdE1lbnUuaGVscF9kaWFsb2cuCisgICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3gub3ZlcnJpZGVSb290TWVudS5oZWxwX2RpYWxvZy4KICAgICAgICAgaWYgc2VsZi5yb290OgogICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5yb290CiAgICAgICAgIGVsc2U6CkBAIC01OTAsMjMgKzU0NiwyMyBAQAogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIGZpbmRfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBTZWFyY2hEaWFsb2cuZmluZChzZWxmLnRleHQpCisgICAgICAgIHNlYXJjaC5maW5kKHNlbGYudGV4dCkKICAgICAgICAgcmV0dXJuICJicmVhayIKIAogICAgIGRlZiBmaW5kX2FnYWluX2V2ZW50KHNlbGYsIGV2ZW50KToKLSAgICAgICAgU2VhcmNoRGlhbG9nLmZpbmRfYWdhaW4oc2VsZi50ZXh0KQorICAgICAgICBzZWFyY2guZmluZF9hZ2FpbihzZWxmLnRleHQpCiAgICAgICAgIHJldHVybiAiYnJlYWsiCiAKICAgICBkZWYgZmluZF9zZWxlY3Rpb25fZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBTZWFyY2hEaWFsb2cuZmluZF9zZWxlY3Rpb24oc2VsZi50ZXh0KQorICAgICAgICBzZWFyY2guZmluZF9zZWxlY3Rpb24oc2VsZi50ZXh0KQogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIGZpbmRfaW5fZmlsZXNfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBHcmVwRGlhbG9nLmdyZXAoc2VsZi50ZXh0LCBzZWxmLmlvLCBzZWxmLmZsaXN0KQorICAgICAgICBncmVwLmdyZXAoc2VsZi50ZXh0LCBzZWxmLmlvLCBzZWxmLmZsaXN0KQogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIHJlcGxhY2VfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBSZXBsYWNlRGlhbG9nLnJlcGxhY2Uoc2VsZi50ZXh0KQorICAgICAgICByZXBsYWNlLnJlcGxhY2Uoc2VsZi50ZXh0KQogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIGdvdG9fbGluZV9ldmVudChzZWxmLCBldmVudCk6CkBAIC02MjIsNDYgKzU3OCwyNyBAQAogICAgICAgICB0ZXh0LnNlZSgiaW5zZXJ0IikKIAogICAgIGRlZiBvcGVuX21vZHVsZShzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgIyBYWFggU2hvdWxkbid0IHRoaXMgYmUgaW4gSU9CaW5kaW5nPworICAgICAgICAiIiJHZXQgbW9kdWxlIG5hbWUgZnJvbSB1c2VyIGFuZCBvcGVuIGl0LgorCisgICAgICAgIFJldHVybiBtb2R1bGUgcGF0aCBvciBOb25lIGZvciBjYWxscyBieSBvcGVuX2NsYXNzX2Jyb3dzZXIKKyAgICAgICAgd2hlbiBsYXR0ZXIgaXMgbm90IGludm9rZWQgaW4gbmFtZWQgZWRpdG9yIHdpbmRvdy4KKyAgICAgICAgIiIiCisgICAgICAgICMgWFhYIFRoaXMsIG9wZW5fY2xhc3NfYnJvd3NlciwgYW5kIG9wZW5fcGF0aF9icm93c2VyCisgICAgICAgICMgd291bGQgZml0IGJldHRlciBpbiBpb21lbnUuSU9CaW5kaW5nLgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBuYW1lID0gc2VsZi50ZXh0LmdldCgic2VsLmZpcnN0IiwgInNlbC5sYXN0IikKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLnRleHQuZ2V0KCJzZWwuZmlyc3QiLCAic2VsLmxhc3QiKS5zdHJpcCgpCiAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKLSAgICAgICAgICAgIG5hbWUgPSAiIgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3RyaXAoKQotICAgICAgICBuYW1lID0gdGtTaW1wbGVEaWFsb2cuYXNrc3RyaW5nKCJNb2R1bGUiLAotICAgICAgICAgICAgICAgICAiRW50ZXIgdGhlIG5hbWUgb2YgYSBQeXRob24gbW9kdWxlXG4iCi0gICAgICAgICAgICAgICAgICJ0byBzZWFyY2ggb24gc3lzLnBhdGggYW5kIG9wZW46IiwKLSAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCwgaW5pdGlhbHZhbHVlPW5hbWUpCi0gICAgICAgIGlmIG5hbWU6Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS5zdHJpcCgpCi0gICAgICAgIGlmIG5vdCBuYW1lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICMgWFhYIE91Z2h0IHRvIGluc2VydCBjdXJyZW50IGZpbGUncyBkaXJlY3RvcnkgaW4gZnJvbnQgb2YgcGF0aAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzcGVjID0gaW1wb3J0bGliLnV0aWwuZmluZF9zcGVjKG5hbWUpCi0gICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgSW1wb3J0RXJyb3IpIGFzIG1zZzoKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIkltcG9ydCBlcnJvciIsIHN0cihtc2cpLCBwYXJlbnQ9c2VsZi50ZXh0KQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIHNwZWMgaXMgTm9uZToKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIkltcG9ydCBlcnJvciIsICJtb2R1bGUgbm90IGZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLmxvYWRlciwgaW1wb3J0bGliLmFiYy5Tb3VyY2VMb2FkZXIpOgotICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiSW1wb3J0IGVycm9yIiwgIm5vdCBhIHNvdXJjZS1iYXNlZCBtb2R1bGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0KQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZpbGVfcGF0aCA9IHNwZWMubG9hZGVyLmdldF9maWxlbmFtZShuYW1lKQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJJbXBvcnQgZXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyIGRvZXMgbm90IHN1cHBvcnQgZ2V0X2ZpbGVuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBzZWxmLmZsaXN0OgotICAgICAgICAgICAgc2VsZi5mbGlzdC5vcGVuKGZpbGVfcGF0aCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuaW8ubG9hZGZpbGUoZmlsZV9wYXRoKQorICAgICAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGZpbGVfcGF0aCA9IHF1ZXJ5Lk1vZHVsZU5hbWUoCisgICAgICAgICAgICAgICAgc2VsZi50ZXh0LCAiT3BlbiBNb2R1bGUiLAorICAgICAgICAgICAgICAgICJFbnRlciB0aGUgbmFtZSBvZiBhIFB5dGhvbiBtb2R1bGVcbiIKKyAgICAgICAgICAgICAgICAidG8gc2VhcmNoIG9uIHN5cy5wYXRoIGFuZCBvcGVuOiIsCisgICAgICAgICAgICAgICAgbmFtZSkucmVzdWx0CisgICAgICAgIGlmIGZpbGVfcGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZmxpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5mbGlzdC5vcGVuKGZpbGVfcGF0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5pby5sb2FkZmlsZShmaWxlX3BhdGgpCiAgICAgICAgIHJldHVybiBmaWxlX3BhdGgKIAogICAgIGRlZiBvcGVuX2NsYXNzX2Jyb3dzZXIoc2VsZiwgZXZlbnQ9Tm9uZSk6CkBAIC02NzMsMTIgKzYxMCwxMiBAQAogICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSkKICAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dCh0YWlsKQotICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IENsYXNzQnJvd3NlcgotICAgICAgICBDbGFzc0Jyb3dzZXIuQ2xhc3NCcm93c2VyKHNlbGYuZmxpc3QsIGJhc2UsIFtoZWFkXSkKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBicm93c2VyCisgICAgICAgIGJyb3dzZXIuQ2xhc3NCcm93c2VyKHNlbGYuZmxpc3QsIGJhc2UsIFtoZWFkXSkKIAogICAgIGRlZiBvcGVuX3BhdGhfYnJvd3NlcihzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBQYXRoQnJvd3NlcgotICAgICAgICBQYXRoQnJvd3Nlci5QYXRoQnJvd3NlcihzZWxmLmZsaXN0KQorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IHBhdGhicm93c2VyCisgICAgICAgIHBhdGhicm93c2VyLlBhdGhCcm93c2VyKHNlbGYuZmxpc3QpCiAKICAgICBkZWYgb3Blbl90dXJ0bGVfZGVtbyhzZWxmLCBldmVudCA9IE5vbmUpOgogICAgICAgICBpbXBvcnQgc3VicHJvY2VzcwpAQCAtNzM5LDcgKzY3Niw3IEBACiAKICAgICBkZWYgUmVzZXRDb2xvcml6ZXIoc2VsZik6CiAgICAgICAgICJVcGRhdGUgdGhlIGNvbG9yIHRoZW1lIgotICAgICAgICAjIENhbGxlZCBmcm9tIHNlbGYuZmlsZW5hbWVfY2hhbmdlX2hvb2sgYW5kIGZyb20gY29uZmlnRGlhbG9nLnB5CisgICAgICAgICMgQ2FsbGVkIGZyb20gc2VsZi5maWxlbmFtZV9jaGFuZ2VfaG9vayBhbmQgZnJvbSBjb25maWdkaWFsb2cucHkKICAgICAgICAgc2VsZi5fcm1jb2xvcml6ZXIoKQogICAgICAgICBzZWxmLl9hZGRjb2xvcml6ZXIoKQogICAgICAgICBFZGl0b3JXaW5kb3cuY29sb3JfY29uZmlnKHNlbGYudGV4dCkKQEAgLTc1OSwxNCArNjk2LDE0IEBACiAKICAgICBkZWYgUmVzZXRGb250KHNlbGYpOgogICAgICAgICAiVXBkYXRlIHRoZSB0ZXh0IHdpZGdldHMnIGZvbnQgaWYgaXQgaXMgY2hhbmdlZCIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKKyAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdkaWFsb2cucHkKIAogICAgICAgICBzZWxmLnRleHRbJ2ZvbnQnXSA9IGlkbGVDb25mLkdldEZvbnQoc2VsZi5yb290LCAnbWFpbicsJ0VkaXRvcldpbmRvdycpCiAKICAgICBkZWYgUmVtb3ZlS2V5YmluZGluZ3Moc2VsZik6CiAgICAgICAgICJSZW1vdmUgdGhlIGtleWJpbmRpbmdzIGJlZm9yZSB0aGV5IGFyZSBjaGFuZ2VkLiIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKLSAgICAgICAgc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMgPSBrZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCisgICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnZGlhbG9nLnB5CisgICAgICAgIHNlbGYubWFpbm1lbnUuZGVmYXVsdF9rZXlkZWZzID0ga2V5ZGVmcyA9IGlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQogICAgICAgICBmb3IgZXZlbnQsIGtleWxpc3QgaW4ga2V5ZGVmcy5pdGVtcygpOgogICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2RlbGV0ZShldmVudCwgKmtleWxpc3QpCiAgICAgICAgIGZvciBleHRlbnNpb25OYW1lIGluIHNlbGYuZ2V0X3N0YW5kYXJkX2V4dGVuc2lvbl9uYW1lcygpOgpAQCAtNzc3LDggKzcxNCw4IEBACiAKICAgICBkZWYgQXBwbHlLZXliaW5kaW5ncyhzZWxmKToKICAgICAgICAgIlVwZGF0ZSB0aGUga2V5YmluZGluZ3MgYWZ0ZXIgdGhleSBhcmUgY2hhbmdlZCIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKLSAgICAgICAgc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMgPSBrZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCisgICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnZGlhbG9nLnB5CisgICAgICAgIHNlbGYubWFpbm1lbnUuZGVmYXVsdF9rZXlkZWZzID0ga2V5ZGVmcyA9IGlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQogICAgICAgICBzZWxmLmFwcGx5X2JpbmRpbmdzKCkKICAgICAgICAgZm9yIGV4dGVuc2lvbk5hbWUgaW4gc2VsZi5nZXRfc3RhbmRhcmRfZXh0ZW5zaW9uX25hbWVzKCk6CiAgICAgICAgICAgICB4a2V5ZGVmcyA9IGlkbGVDb25mLkdldEV4dGVuc2lvbkJpbmRpbmdzKGV4dGVuc2lvbk5hbWUpCkBAIC03ODYsNyArNzIzLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5X2JpbmRpbmdzKHhrZXlkZWZzKQogICAgICAgICAjdXBkYXRlIG1lbnUgYWNjZWxlcmF0b3JzCiAgICAgICAgIG1lbnVFdmVudERpY3QgPSB7fQotICAgICAgICBmb3IgbWVudSBpbiBzZWxmLkJpbmRpbmdzLm1lbnVkZWZzOgorICAgICAgICBmb3IgbWVudSBpbiBzZWxmLm1haW5tZW51Lm1lbnVkZWZzOgogICAgICAgICAgICAgbWVudUV2ZW50RGljdFttZW51WzBdXSA9IHt9CiAgICAgICAgICAgICBmb3IgaXRlbSBpbiBtZW51WzFdOgogICAgICAgICAgICAgICAgIGlmIGl0ZW06CkBAIC04MTMsNyArNzUwLDcgQEAKIAogICAgIGRlZiBzZXRfbm90YWJzX2luZGVudHdpZHRoKHNlbGYpOgogICAgICAgICAiVXBkYXRlIHRoZSBpbmRlbnR3aWR0aCBpZiBjaGFuZ2VkIGFuZCBub3QgdXNpbmcgdGFicyBpbiB0aGlzIHdpbmRvdyIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKKyAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdkaWFsb2cucHkKICAgICAgICAgaWYgbm90IHNlbGYudXNldGFiczoKICAgICAgICAgICAgIHNlbGYuaW5kZW50d2lkdGggPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnSW5kZW50JywnbnVtLXNwYWNlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2ludCcpCkBAIC05OTMsNyArOTMwLDcgQEAKICAgICBkZWYgX2Nsb3NlKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmlvLmZpbGVuYW1lOgogICAgICAgICAgICAgc2VsZi51cGRhdGVfcmVjZW50X2ZpbGVzX2xpc3QobmV3X2ZpbGU9c2VsZi5pby5maWxlbmFtZSkKLSAgICAgICAgV2luZG93TGlzdC51bnJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYucG9zdHdpbmRvd3NtZW51KQorICAgICAgICB3aW5kb3dzLnVucmVnaXN0ZXJfY2FsbGJhY2soc2VsZi5wb3N0d2luZG93c21lbnUpCiAgICAgICAgIHNlbGYudW5sb2FkX2V4dGVuc2lvbnMoKQogICAgICAgICBzZWxmLmlvLmNsb3NlKCkKICAgICAgICAgc2VsZi5pbyA9IE5vbmUKQEAgLTEwMzEsMTIgKzk2OCwyNSBAQAogICAgIGRlZiBnZXRfc3RhbmRhcmRfZXh0ZW5zaW9uX25hbWVzKHNlbGYpOgogICAgICAgICByZXR1cm4gaWRsZUNvbmYuR2V0RXh0ZW5zaW9ucyhlZGl0b3Jfb25seT1UcnVlKQogCisgICAgZXh0ZmlsZXMgPSB7ICAjIG1hcCBjb25maWctZXh0ZW5zaW9uIHNlY3Rpb24gbmFtZXMgdG8gbmV3IGZpbGUgbmFtZXMKKyAgICAgICAgJ0F1dG9Db21wbGV0ZSc6ICdhdXRvY29tcGxldGUnLAorICAgICAgICAnQXV0b0V4cGFuZCc6ICdhdXRvZXhwYW5kJywKKyAgICAgICAgJ0NhbGxUaXBzJzogJ2NhbGx0aXBzJywKKyAgICAgICAgJ0NvZGVDb250ZXh0JzogJ2NvZGVjb250ZXh0JywKKyAgICAgICAgJ0Zvcm1hdFBhcmFncmFwaCc6ICdwYXJhZ3JhcGgnLAorICAgICAgICAnUGFyZW5NYXRjaCc6ICdwYXJlbm1hdGNoJywKKyAgICAgICAgJ1JzdHJpcEV4dGVuc2lvbic6ICdyc3RyaXAnLAorICAgICAgICAnU2NyaXB0QmluZGluZyc6ICdydW5zY3JpcHQnLAorICAgICAgICAnWm9vbUhlaWdodCc6ICd6b29taGVpZ2h0JywKKyAgICAgICAgfQorCiAgICAgZGVmIGxvYWRfZXh0ZW5zaW9uKHNlbGYsIG5hbWUpOgorICAgICAgICBmbmFtZSA9IHNlbGYuZXh0ZmlsZXMuZ2V0KG5hbWUsIG5hbWUpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgnLicgKyBuYW1lLCBwYWNrYWdlPV9fcGFja2FnZV9fKQorICAgICAgICAgICAgICAgIG1vZCA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCcuJyArIGZuYW1lLCBwYWNrYWdlPV9fcGFja2FnZV9fKQogICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgVHlwZUVycm9yKToKLSAgICAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShuYW1lKQorICAgICAgICAgICAgICAgIG1vZCA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKGZuYW1lKQogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICBwcmludCgiXG5GYWlsZWQgdG8gaW1wb3J0IGV4dGVuc2lvbjogIiwgbmFtZSkKICAgICAgICAgICAgIHJhaXNlCkBAIC0xMDYwLDcgKzEwMTAsNyBAQAogCiAgICAgZGVmIGFwcGx5X2JpbmRpbmdzKHNlbGYsIGtleWRlZnM9Tm9uZSk6CiAgICAgICAgIGlmIGtleWRlZnMgaXMgTm9uZToKLSAgICAgICAgICAgIGtleWRlZnMgPSBzZWxmLkJpbmRpbmdzLmRlZmF1bHRfa2V5ZGVmcworICAgICAgICAgICAga2V5ZGVmcyA9IHNlbGYubWFpbm1lbnUuZGVmYXVsdF9rZXlkZWZzCiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKICAgICAgICAgdGV4dC5rZXlkZWZzID0ga2V5ZGVmcwogICAgICAgICBmb3IgZXZlbnQsIGtleWxpc3QgaW4ga2V5ZGVmcy5pdGVtcygpOgpAQCAtMTA3Myw5ICsxMDIzLDkgQEAKICAgICAgICAgTWVudXMgdGhhdCBhcmUgYWJzZW50IG9yIE5vbmUgaW4gc2VsZi5tZW51ZGljdCBhcmUgaWdub3JlZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG1lbnVkZWZzIGlzIE5vbmU6Ci0gICAgICAgICAgICBtZW51ZGVmcyA9IHNlbGYuQmluZGluZ3MubWVudWRlZnMKKyAgICAgICAgICAgIG1lbnVkZWZzID0gc2VsZi5tYWlubWVudS5tZW51ZGVmcwogICAgICAgICBpZiBrZXlkZWZzIGlzIE5vbmU6Ci0gICAgICAgICAgICBrZXlkZWZzID0gc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMKKyAgICAgICAgICAgIGtleWRlZnMgPSBzZWxmLm1haW5tZW51LmRlZmF1bHRfa2V5ZGVmcwogICAgICAgICBtZW51ZGljdCA9IHNlbGYubWVudWRpY3QKICAgICAgICAgdGV4dCA9IHNlbGYudGV4dAogICAgICAgICBmb3IgbW5hbWUsIGVudHJ5bGlzdCBpbiBtZW51ZGVmczoKQEAgLTEzMDIsNyArMTI1Miw3IEBACiAgICAgICAgICAgICAjIGFkanVzdCBpbmRlbnRhdGlvbiBmb3IgY29udGludWF0aW9ucyBhbmQgYmxvY2sKICAgICAgICAgICAgICMgb3Blbi9jbG9zZSBmaXJzdCBuZWVkIHRvIGZpbmQgdGhlIGxhc3Qgc3RtdAogICAgICAgICAgICAgbG5vID0gaW5kZXgybGluZSh0ZXh0LmluZGV4KCdpbnNlcnQnKSkKLSAgICAgICAgICAgIHkgPSBQeVBhcnNlLlBhcnNlcihzZWxmLmluZGVudHdpZHRoLCBzZWxmLnRhYndpZHRoKQorICAgICAgICAgICAgeSA9IHB5cGFyc2UuUGFyc2VyKHNlbGYuaW5kZW50d2lkdGgsIHNlbGYudGFid2lkdGgpCiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jb250ZXh0X3VzZV9wczE6CiAgICAgICAgICAgICAgICAgZm9yIGNvbnRleHQgaW4gc2VsZi5udW1fY29udGV4dF9saW5lczoKICAgICAgICAgICAgICAgICAgICAgc3RhcnRhdCA9IG1heChsbm8gLSBjb250ZXh0LCAxKQpAQCAtMTMyNiwyMiArMTI3NiwyMiBAQAogICAgICAgICAgICAgICAgIHkuc2V0X2xvKDApCiAKICAgICAgICAgICAgIGMgPSB5LmdldF9jb250aW51YXRpb25fdHlwZSgpCi0gICAgICAgICAgICBpZiBjICE9IFB5UGFyc2UuQ19OT05FOgorICAgICAgICAgICAgaWYgYyAhPSBweXBhcnNlLkNfTk9ORToKICAgICAgICAgICAgICAgICAjIFRoZSBjdXJyZW50IHN0bXQgaGFzbid0IGVuZGVkIHlldC4KLSAgICAgICAgICAgICAgICBpZiBjID09IFB5UGFyc2UuQ19TVFJJTkdfRklSU1RfTElORToKKyAgICAgICAgICAgICAgICBpZiBjID09IHB5cGFyc2UuQ19TVFJJTkdfRklSU1RfTElORToKICAgICAgICAgICAgICAgICAgICAgIyBhZnRlciB0aGUgZmlyc3QgbGluZSBvZiBhIHN0cmluZzsgZG8gbm90IGluZGVudCBhdCBhbGwKICAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgICAgIGVsaWYgYyA9PSBQeVBhcnNlLkNfU1RSSU5HX05FWFRfTElORVM6CisgICAgICAgICAgICAgICAgZWxpZiBjID09IHB5cGFyc2UuQ19TVFJJTkdfTkVYVF9MSU5FUzoKICAgICAgICAgICAgICAgICAgICAgIyBpbnNpZGUgYSBzdHJpbmcgd2hpY2ggc3RhcnRlZCBiZWZvcmUgdGhpcyBsaW5lOwogICAgICAgICAgICAgICAgICAgICAjIGp1c3QgbWltaWMgdGhlIGN1cnJlbnQgaW5kZW50CiAgICAgICAgICAgICAgICAgICAgIHRleHQuaW5zZXJ0KCJpbnNlcnQiLCBpbmRlbnQpCi0gICAgICAgICAgICAgICAgZWxpZiBjID09IFB5UGFyc2UuQ19CUkFDS0VUOgorICAgICAgICAgICAgICAgIGVsaWYgYyA9PSBweXBhcnNlLkNfQlJBQ0tFVDoKICAgICAgICAgICAgICAgICAgICAgIyBsaW5lIHVwIHdpdGggdGhlIGZpcnN0IChpZiBhbnkpIGVsZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICMgbGFzdCBvcGVuIGJyYWNrZXQgc3RydWN0dXJlOyBlbHNlIGluZGVudCBvbmUKICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCBiZXlvbmQgdGhlIGluZGVudCBvZiB0aGUgbGluZSB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAjIGxhc3Qgb3BlbiBicmFja2V0CiAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVpbmRlbnRfdG8oeS5jb21wdXRlX2JyYWNrZXRfaW5kZW50KCkpCi0gICAgICAgICAgICAgICAgZWxpZiBjID09IFB5UGFyc2UuQ19CQUNLU0xBU0g6CisgICAgICAgICAgICAgICAgZWxpZiBjID09IHB5cGFyc2UuQ19CQUNLU0xBU0g6CiAgICAgICAgICAgICAgICAgICAgICMgaWYgbW9yZSB0aGFuIG9uZSBsaW5lIGluIHRoaXMgc3RtdCBhbHJlYWR5LCBqdXN0CiAgICAgICAgICAgICAgICAgICAgICMgbWltaWMgdGhlIGN1cnJlbnQgaW5kZW50OyBlbHNlIGlmIGluaXRpYWwgbGluZQogICAgICAgICAgICAgICAgICAgICAjIGhhcyBhIHN0YXJ0IG9uIGFuIGFzc2lnbm1lbnQgc3RtdCwgaW5kZW50IHRvCkBAIC0xNTY5LDkgKzE1MTksNiBAQAogICAgICAgICAgICAgYnJlYWsKICAgICByZXR1cm4gcmF3LCBlZmZlY3RpdmUKIAotaW1wb3J0IHRva2VuaXplCi1fdG9rZW5pemUgPSB0b2tlbml6ZQotZGVsIHRva2VuaXplCiAKIGNsYXNzIEluZGVudFNlYXJjaGVyKG9iamVjdCk6CiAKQEAgLTE1OTYsOCArMTU0Myw4IEBACiAgICAgICAgIHJldHVybiBzZWxmLnRleHQuZ2V0KG1hcmssIG1hcmsgKyAiIGxpbmVlbmQrMWMiKQogCiAgICAgZGVmIHRva2VuZWF0ZXIoc2VsZiwgdHlwZSwgdG9rZW4sIHN0YXJ0LCBlbmQsIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgSU5ERU5UPV90b2tlbml6ZS5JTkRFTlQsCi0gICAgICAgICAgICAgICAgICAgTkFNRT1fdG9rZW5pemUuTkFNRSwKKyAgICAgICAgICAgICAgICAgICBJTkRFTlQ9dG9rZW5pemUuSU5ERU5ULAorICAgICAgICAgICAgICAgICAgIE5BTUU9dG9rZW5pemUuTkFNRSwKICAgICAgICAgICAgICAgICAgICBPUEVORVJTPSgnY2xhc3MnLCAnZGVmJywgJ2ZvcicsICdpZicsICd0cnknLCAnd2hpbGUnKSk6CiAgICAgICAgIGlmIHNlbGYuZmluaXNoZWQ6CiAgICAgICAgICAgICBwYXNzCkBAIC0xNjA4LDE5ICsxNTU1LDE5IEBACiAgICAgICAgICAgICBzZWxmLmZpbmlzaGVkID0gMQogCiAgICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgc2F2ZV90YWJzaXplID0gX3Rva2VuaXplLnRhYnNpemUKLSAgICAgICAgX3Rva2VuaXplLnRhYnNpemUgPSBzZWxmLnRhYndpZHRoCisgICAgICAgIHNhdmVfdGFic2l6ZSA9IHRva2VuaXplLnRhYnNpemUKKyAgICAgICAgdG9rZW5pemUudGFic2l6ZSA9IHNlbGYudGFid2lkdGgKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHRva2VucyA9IF90b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoc2VsZi5yZWFkbGluZSkKKyAgICAgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoc2VsZi5yZWFkbGluZSkKICAgICAgICAgICAgICAgICBmb3IgdG9rZW4gaW4gdG9rZW5zOgogICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuZWF0ZXIoKnRva2VuKQotICAgICAgICAgICAgZXhjZXB0IChfdG9rZW5pemUuVG9rZW5FcnJvciwgU3ludGF4RXJyb3IpOgorICAgICAgICAgICAgZXhjZXB0ICh0b2tlbml6ZS5Ub2tlbkVycm9yLCBTeW50YXhFcnJvcik6CiAgICAgICAgICAgICAgICAgIyBzaW5jZSB3ZSBjdXQgb2ZmIHRoZSB0b2tlbml6ZXIgZWFybHksIHdlIGNhbiB0cmlnZ2VyCiAgICAgICAgICAgICAgICAgIyBzcHVyaW91cyBlcnJvcnMKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBfdG9rZW5pemUudGFic2l6ZSA9IHNhdmVfdGFic2l6ZQorICAgICAgICAgICAgdG9rZW5pemUudGFic2l6ZSA9IHNhdmVfdGFic2l6ZQogICAgICAgICByZXR1cm4gc2VsZi5ibGtvcGVubGluZSwgc2VsZi5pbmRlbnRlZGxpbmUKIAogIyMjIGVuZCBhdXRvaW5kZW50IGNvZGUgIyMjCkBAIC0xNjQ0LDcgKzE1OTEsNyBAQAogICAgIGtleWxpc3QgPSBrZXlkZWZzLmdldChldmVudG5hbWUpCiAgICAgIyBpc3N1ZTEwOTQwOiB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCB0byBwcmV2ZW50IGhhbmcgd2l0aCBPUyBYIENvY29hIFRrIDguNQogICAgICMgaWYgbm90IGtleWxpc3Q6Ci0gICAgaWYgKG5vdCBrZXlsaXN0KSBvciAobWFjb3N4U3VwcG9ydC5pc0NvY29hVGsoKSBhbmQgZXZlbnRuYW1lIGluIHsKKyAgICBpZiAobm90IGtleWxpc3QpIG9yIChtYWNvc3guaXNDb2NvYVRrKCkgYW5kIGV2ZW50bmFtZSBpbiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjw8b3Blbi1tb2R1bGU+PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjw8Z290by1saW5lPj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8PGNoYW5nZS1pbmRlbnR3aWR0aD4+In0pOgpAQCAtMTY3OSwxMiArMTYyNiwxNSBAQAogICAgICAgICBmaWxlbmFtZSA9IHN5cy5hcmd2WzFdCiAgICAgZWxzZToKICAgICAgICAgZmlsZW5hbWUgPSBOb25lCi0gICAgbWFjb3N4U3VwcG9ydC5zZXR1cEFwcChyb290LCBOb25lKQorICAgIG1hY29zeC5zZXR1cEFwcChyb290LCBOb25lKQogICAgIGVkaXQgPSBFZGl0b3JXaW5kb3cocm9vdD1yb290LCBmaWxlbmFtZT1maWxlbmFtZSkKICAgICBlZGl0LnRleHQuYmluZCgiPDxjbG9zZS1hbGwtd2luZG93cz4+IiwgZWRpdC5jbG9zZV9ldmVudCkKICAgICAjIERvZXMgbm90IHN0b3AgZXJyb3IsIG5laXRoZXIgZG9lcyBmb2xsb3dpbmcKICAgICAjIGVkaXQudGV4dC5iaW5kKCI8PGNsb3NlLXdpbmRvdz4+IiwgZWRpdC5jbG9zZV9ldmVudCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2VkaXRvcicsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorCiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCiAgICAgcnVuKF9lZGl0b3Jfd2luZG93KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRmlsZUxpc3QucHkgYi9MaWIvaWRsZWxpYi9maWxlbGlzdC5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9GaWxlTGlzdC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZmlsZWxpc3QucHkKaW5kZXggYTk5ODlhOC4uZjQ2YWQ3YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvRmlsZUxpc3QucHkKKysrIGIvTGliL2lkbGVsaWIvZmlsZWxpc3QucHkKQEAgLTEsNCArMSw1IEBACiBpbXBvcnQgb3MKKwogZnJvbSB0a2ludGVyIGltcG9ydCAqCiBpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAogCkBAIC02LDcgKzcsNyBAQAogY2xhc3MgRmlsZUxpc3Q6CiAKICAgICAjIE4uQi4gdGhpcyBpbXBvcnQgb3ZlcnJpZGRlbiBpbiBQeVNoZWxsRmlsZUxpc3QuCi0gICAgZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93CisgICAgZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCk6CiAgICAgICAgIHNlbGYucm9vdCA9IHJvb3QKQEAgLTExMSw3ICsxMTIsNyBAQAogCiAKIGRlZiBfdGVzdCgpOgotICAgIGZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IGZpeHdvcmRicmVha3MKKyAgICBmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBmaXh3b3JkYnJlYWtzCiAgICAgaW1wb3J0IHN5cwogICAgIHJvb3QgPSBUaygpCiAgICAgZml4d29yZGJyZWFrcyhyb290KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvR3JlcERpYWxvZy5weSBiL0xpYi9pZGxlbGliL2dyZXAucHkKc2ltaWxhcml0eSBpbmRleCA4MiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvR3JlcERpYWxvZy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZ3JlcC5weQppbmRleCA3MjFiMjMxLi42NGJhMjhkIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9HcmVwRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2dyZXAucHkKQEAgLTEsMTcgKzEsMTkgQEAKLWltcG9ydCBvcwogaW1wb3J0IGZubWF0Y2gKLWltcG9ydCByZSAgIyBmb3IgaHRlc3QKK2ltcG9ydCBvcwogaW1wb3J0IHN5cwotZnJvbSB0a2ludGVyIGltcG9ydCBTdHJpbmdWYXIsIEJvb2xlYW5WYXIsIENoZWNrYnV0dG9uICAjIGZvciBHcmVwRGlhbG9nCi1mcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0LCBCdXR0b24sIFNFTCwgRU5EICAjIGZvciBodGVzdAotZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hFbmdpbmUKLWZyb20gaWRsZWxpYi5TZWFyY2hEaWFsb2dCYXNlIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlCi0jIEltcG9ydGluZyBPdXRwdXRXaW5kb3cgZmFpbHMgZHVlIHRvIGltcG9ydCBsb29wCisKK2Zyb20gdGtpbnRlciBpbXBvcnQgU3RyaW5nVmFyLCBCb29sZWFuVmFyCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBDaGVja2J1dHRvbgorCitmcm9tIGlkbGVsaWIuc2VhcmNoYmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hlbmdpbmUKKworIyBJbXBvcnRpbmcgT3V0cHV0V2luZG93IGhlcmUgZmFpbHMgZHVlIHRvIGltcG9ydCBsb29wCiAjIEVkaXRvcldpbmRvdyAtPiBHcmVwRGlhbG9wIC0+IE91dHB1dFdpbmRvdyAtPiBFZGl0b3JXaW5kb3cKIAogZGVmIGdyZXAodGV4dCwgaW89Tm9uZSwgZmxpc3Q9Tm9uZSk6CiAgICAgcm9vdCA9IHRleHQuX3Jvb3QoKQotICAgIGVuZ2luZSA9IFNlYXJjaEVuZ2luZS5nZXQocm9vdCkKKyAgICBlbmdpbmUgPSBzZWFyY2hlbmdpbmUuZ2V0KHJvb3QpCiAgICAgaWYgbm90IGhhc2F0dHIoZW5naW5lLCAiX2dyZXBkaWFsb2ciKToKICAgICAgICAgZW5naW5lLl9ncmVwZGlhbG9nID0gR3JlcERpYWxvZyhyb290LCBlbmdpbmUsIGZsaXN0KQogICAgIGRpYWxvZyA9IGVuZ2luZS5fZ3JlcGRpYWxvZwpAQCAtNDcsMTMgKzQ5LDEwIEBACiAgICAgICAgIHNlbGYuZ2xvYmVudCA9IHNlbGYubWFrZV9lbnRyeSgiSW4gZmlsZXM6Iiwgc2VsZi5nbG9idmFyKVswXQogCiAgICAgZGVmIGNyZWF0ZV9vdGhlcl9idXR0b25zKHNlbGYpOgotICAgICAgICBmID0gc2VsZi5tYWtlX2ZyYW1lKClbMF0KLQotICAgICAgICBidG4gPSBDaGVja2J1dHRvbihmLCBhbmNob3I9InciLAotICAgICAgICAgICAgICAgIHZhcmlhYmxlPXNlbGYucmVjdmFyLAorICAgICAgICBidG4gPSBDaGVja2J1dHRvbigKKyAgICAgICAgICAgICAgICBzZWxmLm1ha2VfZnJhbWUoKVswXSwgdmFyaWFibGU9c2VsZi5yZWN2YXIsCiAgICAgICAgICAgICAgICAgdGV4dD0iUmVjdXJzZSBkb3duIHN1YmRpcmVjdG9yaWVzIikKICAgICAgICAgYnRuLnBhY2soc2lkZT0idG9wIiwgZmlsbD0iYm90aCIpCi0gICAgICAgIGJ0bi5zZWxlY3QoKQogCiAgICAgZGVmIGNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoc2VsZik6CiAgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuY3JlYXRlX2NvbW1hbmRfYnV0dG9ucyhzZWxmKQpAQCAtNjcsNyArNjYsNyBAQAogICAgICAgICBpZiBub3QgcGF0aDoKICAgICAgICAgICAgIHNlbGYudG9wLmJlbGwoKQogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGZyb20gaWRsZWxpYi5PdXRwdXRXaW5kb3cgaW1wb3J0IE91dHB1dFdpbmRvdyAgIyBsZWF2ZSBoZXJlIQorICAgICAgICBmcm9tIGlkbGVsaWIub3V0d2luIGltcG9ydCBPdXRwdXRXaW5kb3cgICMgbGVhdmUgaGVyZSEKICAgICAgICAgc2F2ZSA9IHN5cy5zdGRvdXQKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc3lzLnN0ZG91dCA9IE91dHB1dFdpbmRvdyhzZWxmLmZsaXN0KQpAQCAtMTMxLDE0ICsxMzAsMTYgQEAKIAogCiBkZWYgX2dyZXBfZGlhbG9nKHBhcmVudCk6ICAjIGh0ZXN0ICMKLSAgICBmcm9tIGlkbGVsaWIuUHlTaGVsbCBpbXBvcnQgUHlTaGVsbEZpbGVMaXN0Ci0gICAgcm9vdCA9IFRrKCkKLSAgICByb290LnRpdGxlKCJUZXN0IEdyZXBEaWFsb2ciKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBUZXh0LCBTRUwsIEVORAorICAgIGZyb20gdGtpbnRlci50dGsgaW1wb3J0IEJ1dHRvbgorICAgIGZyb20gaWRsZWxpYi5weXNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCisgICAgdG9wLnRpdGxlKCJUZXN0IEdyZXBEaWFsb2ciKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSArIDE3NSkpCiAKLSAgICBmbGlzdCA9IFB5U2hlbGxGaWxlTGlzdChyb290KQotICAgIHRleHQgPSBUZXh0KHJvb3QsIGhlaWdodD01KQorICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHRvcCkKKyAgICB0ZXh0ID0gVGV4dCh0b3AsIGhlaWdodD01KQogICAgIHRleHQucGFjaygpCiAKICAgICBkZWYgc2hvd19ncmVwX2RpYWxvZygpOgpAQCAtMTQ2LDkgKzE0Nyw4IEBACiAgICAgICAgIGdyZXAodGV4dCwgZmxpc3Q9Zmxpc3QpCiAgICAgICAgIHRleHQudGFnX3JlbW92ZShTRUwsICIxLjAiLCBFTkQpCiAKLSAgICBidXR0b24gPSBCdXR0b24ocm9vdCwgdGV4dD0iU2hvdyBHcmVwRGlhbG9nIiwgY29tbWFuZD1zaG93X2dyZXBfZGlhbG9nKQorICAgIGJ1dHRvbiA9IEJ1dHRvbih0b3AsIHRleHQ9IlNob3cgR3JlcERpYWxvZyIsIGNvbW1hbmQ9c2hvd19ncmVwX2RpYWxvZykKICAgICBidXR0b24ucGFjaygpCi0gICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHVuaXR0ZXN0CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9oZWxwLnB5IGIvTGliL2lkbGVsaWIvaGVscC5weQppbmRleCBhNzAwOGU5Li43N2UwMWEzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9oZWxwLnB5CisrKyBiL0xpYi9pZGxlbGliL2hlbHAucHkKQEAgLTQsNyArNCw3IEBACiAKIEhlbHAgPT4gQWJvdXQgSURMRTogZGlwbGF5IEFib3V0IElkbGUgZGlhbG9nCiAKLTx0byBiZSBtb3ZlZCBoZXJlIGZyb20gYWJvdXREaWFsb2cucHk+Cis8dG8gYmUgbW92ZWQgaGVyZSBmcm9tIGhlbHBfYWJvdXQucHk+CiAKIAogSGVscCA9PiBJRExFIEhlbHA6IERpc3BsYXkgaGVscC5odG1sIHdpdGggcHJvcGVyIGZvcm1hdHRpbmcuCkBAIC0yNSwxNSArMjUsMTQgQEAKIHNob3dfaWRsZWhlbHAgLSBDcmVhdGUgSGVscFdpbmRvdy4gIENhbGxlZCBpbiBFZGl0b3JXaW5kb3cuaGVscF9kaWFsb2cuCiAiIiIKIGZyb20gaHRtbC5wYXJzZXIgaW1wb3J0IEhUTUxQYXJzZXIKLWZyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aCwgZGlybmFtZSwgaXNkaXIsIGlzZmlsZSwgam9pbgorZnJvbSBvcy5wYXRoIGltcG9ydCBhYnNwYXRoLCBkaXJuYW1lLCBpc2ZpbGUsIGpvaW4KIGZyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl92ZXJzaW9uCi1mcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUb3BsZXZlbCwgRnJhbWUsIFRleHQsIFNjcm9sbGJhciwgTWVudSwgTWVudWJ1dHRvbgotZnJvbSB0a2ludGVyIGltcG9ydCBmb250IGFzIHRrZm9udAotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCiAKLXVzZV90dGsgPSBGYWxzZSAjIHVudGlsIGF2YWlsYWJsZSB0byBpbXBvcnQKLWlmIHVzZV90dGs6Ci0gICAgZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgTWVudWJ1dHRvbgorZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCwgRnJhbWUsIFRleHQsIE1lbnUKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IE1lbnVidXR0b24sIFNjcm9sbGJhcgorZnJvbSB0a2ludGVyIGltcG9ydCBmb250IGFzIHRrZm9udAorCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCiAjIyBBYm91dCBJRExFICMjCiAKQEAgLTE5NywxNSArMTk2LDE4IEBACiAgICAgIkRpc3BsYXkgaHRtbCB0ZXh0LCBzY3JvbGxiYXIsIGFuZCB0b2MuIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIGZpbGVuYW1lKToKICAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgcGFyZW50KQotICAgICAgICB0ZXh0ID0gSGVscFRleHQoc2VsZiwgZmlsZW5hbWUpCisgICAgICAgICMga2VlcCByZWZlcmVuY2VzIHRvIHdpZGdldHMgZm9yIHRlc3QgYWNjZXNzLgorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0ID0gSGVscFRleHQoc2VsZiwgZmlsZW5hbWUpCiAgICAgICAgIHNlbGZbJ2JhY2tncm91bmQnXSA9IHRleHRbJ2JhY2tncm91bmQnXQotICAgICAgICBzY3JvbGwgPSBTY3JvbGxiYXIoc2VsZiwgY29tbWFuZD10ZXh0Lnl2aWV3KQorICAgICAgICBzZWxmLnRvYyA9IHRvYyA9IHNlbGYudG9jX21lbnUodGV4dCkKKyAgICAgICAgc2VsZi5zY3JvbGwgPSBzY3JvbGwgPSBTY3JvbGxiYXIoc2VsZiwgY29tbWFuZD10ZXh0Lnl2aWV3KQogICAgICAgICB0ZXh0Wyd5c2Nyb2xsY29tbWFuZCddID0gc2Nyb2xsLnNldAorCiAgICAgICAgIHNlbGYucm93Y29uZmlndXJlKDAsIHdlaWdodD0xKQogICAgICAgICBzZWxmLmNvbHVtbmNvbmZpZ3VyZSgxLCB3ZWlnaHQ9MSkgICMgdGV4dAotICAgICAgICBzZWxmLnRvY19tZW51KHRleHQpLmdyaWQoY29sdW1uPTAsIHJvdz0wLCBzdGlja3k9J253JykKLSAgICAgICAgdGV4dC5ncmlkKGNvbHVtbj0xLCByb3c9MCwgc3RpY2t5PSduc2V3JykKLSAgICAgICAgc2Nyb2xsLmdyaWQoY29sdW1uPTIsIHJvdz0wLCBzdGlja3k9J25zJykKKyAgICAgICAgdG9jLmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9J253JykKKyAgICAgICAgdGV4dC5ncmlkKHJvdz0wLCBjb2x1bW49MSwgc3RpY2t5PSduc2V3JykKKyAgICAgICAgc2Nyb2xsLmdyaWQocm93PTAsIGNvbHVtbj0yLCBzdGlja3k9J25zJykKIAogICAgIGRlZiB0b2NfbWVudShzZWxmLCB0ZXh0KToKICAgICAgICAgIkNyZWF0ZSB0YWJsZSBvZiBjb250ZW50cyBhcyBkcm9wLWRvd24gbWVudS4iCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9oZWxwLnR4dCBiL0xpYi9pZGxlbGliL2hlbHAudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWZiZTBiLi4wMDAwMDAwCi0tLSBhL0xpYi9pZGxlbGliL2hlbHAudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLVRoaXMgZmlsZSwgaWRsZWxpYi9oZWxwLnR4dCBpcyBvdXQtb2YtZGF0ZSBhbmQgbm8gbG9uZ2VyIHVzZWQgYnkgSWRsZS4KLUl0IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBwb3NzaWJseSBpbiAzLjYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotW1NlZSB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgKiogVElQUyAqKiBvbiB1c2luZyBJRExFICEhXQotCi1JRExFIGlzIHRoZSBQeXRob24gSURFIGJ1aWx0IHdpdGggdGhlIHRraW50ZXIgR1VJIHRvb2xraXQuCi0KLUlETEUgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6Ci0tY29kZWQgaW4gMTAwJSBwdXJlIFB5dGhvbiwgdXNpbmcgdGhlIHRraW50ZXIgR1VJIHRvb2xraXQKLS1jcm9zcy1wbGF0Zm9ybTogd29ya3Mgb24gV2luZG93cywgVW5peCwgYW5kIE9TIFgKLS1tdWx0aS13aW5kb3cgdGV4dCBlZGl0b3Igd2l0aCBtdWx0aXBsZSB1bmRvLCBQeXRob24gY29sb3JpemluZywgc21hcnQgaW5kZW50LAotY2FsbCB0aXBzLCBhbmQgbWFueSBvdGhlciBmZWF0dXJlcwotLVB5dGhvbiBzaGVsbCB3aW5kb3cgKGEuay5hIGludGVyYWN0aXZlIGludGVycHJldGVyKQotLWRlYnVnZ2VyIChub3QgY29tcGxldGUsIGJ1dCB5b3UgY2FuIHNldCBicmVha3BvaW50cywgdmlldyBhbmQgc3RlcCkKLQotTWVudXM6Ci0KLUlETEUgaGFzIHR3byB3aW5kb3cgdHlwZXMgdGhlIFNoZWxsIHdpbmRvdyBhbmQgdGhlIEVkaXRvciB3aW5kb3cuIEl0IGlzCi1wb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGVkaXRvciB3aW5kb3dzIHNpbXVsdGFuZW91c2x5LiBJRExFJ3MKLW1lbnVzIGR5bmFtaWNhbGx5IGNoYW5nZSBiYXNlZCBvbiB3aGljaCB3aW5kb3cgaXMgY3VycmVudGx5IHNlbGVjdGVkLiBFYWNoIG1lbnUKLWRvY3VtZW50ZWQgYmVsb3cgaW5kaWNhdGVzIHdoaWNoIHdpbmRvdyB0eXBlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gCi0KLUZpbGUgTWVudSAoU2hlbGwgYW5kIEVkaXRvcik6Ci0KLSAgICAgICAgTmV3IEZpbGUgICAgICAgICAtLSBDcmVhdGUgYSBuZXcgZmlsZSBlZGl0aW5nIHdpbmRvdwotICAgICAgICBPcGVuLi4uICAgICAgICAgIC0tIE9wZW4gYW4gZXhpc3RpbmcgZmlsZQotICAgICAgICBPcGVuIE1vZHVsZS4uLiAgIC0tIE9wZW4gYW4gZXhpc3RpbmcgbW9kdWxlIChzZWFyY2hlcyBzeXMucGF0aCkKLSAgICAgICAgUmVjZW50IEZpbGVzLi4uICAtLSBPcGVuIGEgbGlzdCBvZiByZWNlbnQgZmlsZXMKLSAgICAgICAgQ2xhc3MgQnJvd3NlciAgICAtLSBTaG93IGNsYXNzZXMgYW5kIG1ldGhvZHMgaW4gY3VycmVudCBmaWxlCi0gICAgICAgIFBhdGggQnJvd3NlciAgICAgLS0gU2hvdyBzeXMucGF0aCBkaXJlY3RvcmllcywgbW9kdWxlcywgY2xhc3NlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbWV0aG9kcwotICAgICAgICAtLS0KLSAgICAgICAgU2F2ZSAgICAgICAgICAgICAtLSBTYXZlIGN1cnJlbnQgd2luZG93IHRvIHRoZSBhc3NvY2lhdGVkIGZpbGUgKHVuc2F2ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzIGhhdmUgYSAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHdpbmRvdyB0aXRsZSkKLQotICAgICAgICBTYXZlIEFzLi4uICAgICAgIC0tIFNhdmUgY3VycmVudCB3aW5kb3cgdG8gbmV3IGZpbGUsIHdoaWNoIGJlY29tZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBmaWxlCi0gICAgICAgIFNhdmUgQ29weSBBcy4uLiAgLS0gU2F2ZSBjdXJyZW50IHdpbmRvdyB0byBkaWZmZXJlbnQgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGFzc29jaWF0ZWQgZmlsZQotICAgICAgICAtLS0KLSAgICAgICAgUHJpbnQgV2luZG93ICAgICAtLSBQcmludCB0aGUgY3VycmVudCB3aW5kb3cKLSAgICAgICAgLS0tCi0gICAgICAgIENsb3NlICAgICAgICAgICAgLS0gQ2xvc2UgY3VycmVudCB3aW5kb3cgKGFza3MgdG8gc2F2ZSBpZiB1bnNhdmVkKQotICAgICAgICBFeGl0ICAgICAgICAgICAgIC0tIENsb3NlIGFsbCB3aW5kb3dzLCBxdWl0IChhc2tzIHRvIHNhdmUgaWYgdW5zYXZlZCkKLQotRWRpdCBNZW51IChTaGVsbCBhbmQgRWRpdG9yKToKLQotICAgICAgICBVbmRvICAgICAgICAgICAgIC0tIFVuZG8gbGFzdCBjaGFuZ2UgdG8gY3VycmVudCB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSBtYXhpbXVtIG9mIDEwMDAgY2hhbmdlcyBtYXkgYmUgdW5kb25lKQotICAgICAgICBSZWRvICAgICAgICAgICAgIC0tIFJlZG8gbGFzdCB1bmRvbmUgY2hhbmdlIHRvIGN1cnJlbnQgd2luZG93Ci0gICAgICAgIC0tLQotICAgICAgICBDdXQgICAgICAgICAgICAgIC0tIENvcHkgYSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbgotICAgICAgICBDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCi0gICAgICAgIFBhc3RlICAgICAgICAgICAgLS0gSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdwotICAgICAgICBTZWxlY3QgQWxsICAgICAgIC0tIFNlbGVjdCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBlZGl0IGJ1ZmZlcgotICAgICAgICAtLS0KLSAgICAgICAgRmluZC4uLiAgICAgICAgICAtLSBPcGVuIGEgc2VhcmNoIGRpYWxvZyBib3ggd2l0aCBtYW55IG9wdGlvbnMKLSAgICAgICAgRmluZCBBZ2FpbiAgICAgICAtLSBSZXBlYXQgbGFzdCBzZWFyY2gKLSAgICAgICAgRmluZCBTZWxlY3Rpb24gICAtLSBTZWFyY2ggZm9yIHRoZSBzdHJpbmcgaW4gdGhlIHNlbGVjdGlvbgotICAgICAgICBGaW5kIGluIEZpbGVzLi4uIC0tIE9wZW4gYSBzZWFyY2ggZGlhbG9nIGJveCBmb3Igc2VhcmNoaW5nIGZpbGVzCi0gICAgICAgIFJlcGxhY2UuLi4gICAgICAgLS0gT3BlbiBhIHNlYXJjaC1hbmQtcmVwbGFjZSBkaWFsb2cgYm94Ci0gICAgICAgIEdvIHRvIExpbmUgICAgICAgLS0gQXNrIGZvciBhIGxpbmUgbnVtYmVyIGFuZCBzaG93IHRoYXQgbGluZQotICAgICAgICBFeHBhbmQgV29yZCAgICAgIC0tIEV4cGFuZCB0aGUgd29yZCB5b3UgaGF2ZSB0eXBlZCB0byBtYXRjaCBhbm90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZCBpbiB0aGUgc2FtZSBidWZmZXI7IHJlcGVhdCB0byBnZXQgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBleHBhbnNpb24KLSAgICAgICAgU2hvdyBDYWxsdGlwICAgICAtLSBBZnRlciBhbiB1bmNsb3NlZCBwYXJlbnRoZXNpcyBmb3IgYSBmdW5jdGlvbiwgb3BlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc21hbGwgd2luZG93IHdpdGggZnVuY3Rpb24gcGFyYW1ldGVyIGhpbnRzCi0gICAgICAgIFNob3cgUGFyZW5zICAgICAgLS0gSGlnaGxpZ2h0IHRoZSBzdXJyb3VuZGluZyBwYXJlbnRoZXNpcwotICAgICAgICBTaG93IENvbXBsZXRpb25zIC0tIE9wZW4gYSBzY3JvbGwgd2luZG93IGFsbG93aW5nIHNlbGVjdGlvbiBrZXl3b3JkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhdHRyaWJ1dGVzLiAoc2VlICcqVElQUyonLCBiZWxvdykKLQotRm9ybWF0IE1lbnUgKEVkaXRvciB3aW5kb3cgb25seSk6Ci0KLSAgICAgICAgSW5kZW50IFJlZ2lvbiAgICAgICAtLSBTaGlmdCBzZWxlY3RlZCBsaW5lcyByaWdodCBieSB0aGUgaW5kZW50IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgNCBzcGFjZXMpCi0gICAgICAgIERlZGVudCBSZWdpb24gICAgICAgLS0gU2hpZnQgc2VsZWN0ZWQgbGluZXMgbGVmdCBieSB0aGUgaW5kZW50IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgNCBzcGFjZXMpCi0gICAgICAgIENvbW1lbnQgT3V0IFJlZ2lvbiAgLS0gSW5zZXJ0ICMjIGluIGZyb250IG9mIHNlbGVjdGVkIGxpbmVzCi0gICAgICAgIFVuY29tbWVudCBSZWdpb24gICAgLS0gUmVtb3ZlIGxlYWRpbmcgIyBvciAjIyBmcm9tIHNlbGVjdGVkIGxpbmVzCi0gICAgICAgIFRhYmlmeSBSZWdpb24gICAgICAgLS0gVHVybnMgKmxlYWRpbmcqIHN0cmV0Y2hlcyBvZiBzcGFjZXMgaW50byB0YWJzLgotICAgICAgICAgICAgICAgIChOb3RlOiBXZSByZWNvbW1lbmQgdXNpbmcgNCBzcGFjZSBibG9ja3MgdG8gaW5kZW50IFB5dGhvbiBjb2RlLikKLSAgICAgICAgVW50YWJpZnkgUmVnaW9uICAgICAtLSBUdXJuICphbGwqIHRhYnMgaW50byB0aGUgY29ycmVudCBudW1iZXIgb2Ygc3BhY2VzCi0gICAgICAgIFRvZ2dsZSB0YWJzICAgICAgICAgLS0gT3BlbiBhIGRpYWxvZyB0byBzd2l0Y2ggYmV0d2VlbiBpbmRlbnRpbmcgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyBhbmQgdGFicy4KLSAgICAgICAgTmV3IEluZGVudCBXaWR0aC4uLiAtLSBPcGVuIGEgZGlhbG9nIHRvIGNoYW5nZSBpbmRlbnQgd2lkdGguICBUaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZCBkZWZhdWx0IGJ5IHRoZSBQeXRob24gY29tbXVuaXR5IGlzIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMuCi0gICAgICAgIEZvcm1hdCBQYXJhZ3JhcGggICAgLS0gUmVmb3JtYXQgdGhlIGN1cnJlbnQgYmxhbmstbGluZS1zZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGguIEFsbCBsaW5lcyBpbiB0aGUgcGFyYWdyYXBoIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgdG8gbGVzcyB0aGFuIDgwIGNvbHVtbnMuCi0gICAgICAgIC0tLQotICAgICAgICBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIC0tIFJlbW92ZWQgYW55IHNwYWNlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBsYXN0IG5vbi1zcGFjZSBjaGFyYWN0ZXIKLQotUnVuIE1lbnUgKEVkaXRvciB3aW5kb3cgb25seSk6Ci0KLSAgICAgICAgUHl0aG9uIFNoZWxsIC0tIE9wZW4gb3Igd2FrZSB1cCB0aGUgUHl0aG9uIHNoZWxsIHdpbmRvdwotICAgICAgICAtLS0KLSAgICAgICAgQ2hlY2sgTW9kdWxlIC0tIENoZWNrIHRoZSBzeW50YXggb2YgdGhlIG1vZHVsZSBjdXJyZW50bHkgb3BlbiBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRvciB3aW5kb3cuICBJZiB0aGUgbW9kdWxlIGhhcyBub3QgYmVlbiBzYXZlZCBJRExFCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHByb21wdCB0aGUgdXNlciB0byBzYXZlIHRoZSBjb2RlLgotICAgICAgICBSdW4gTW9kdWxlICAgLS0gUmVzdGFydCB0aGUgc2hlbGwgdG8gY2xlYW4gdGhlIGVudmlyb25tZW50LCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlIHRoZSBjdXJyZW50bHkgb3BlbiBtb2R1bGUuIElmIHRoZSBtb2R1bGUgaGFzCi0gICAgICAgICAgICAgICAgICAgICAgICBub3QgYmVlbiBzYXZlZCBJRExFIHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIHNhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlLgotCi1TaGVsbCBNZW51IChTaGVsbCB3aW5kb3cgb25seSk6Ci0KLSAgICAgICAgVmlldyBMYXN0IFJlc3RhcnQgLS0gU2Nyb2xsIHRoZSBzaGVsbCB3aW5kb3cgdG8gdGhlIGxhc3QgU2hlbGwgcmVzdGFydAotICAgICAgICBSZXN0YXJ0IFNoZWxsICAgICAtLSBSZXN0YXJ0IHRoZSBzaGVsbCB0byBjbGVhbiB0aGUgZW52aXJvbm1lbnQKLQotRGVidWcgTWVudSAoU2hlbGwgd2luZG93IG9ubHkpOgotCi0gICAgICAgIEdvIHRvIEZpbGUvTGluZSAgIC0tIExvb2sgYXJvdW5kIHRoZSBpbnNlcnQgcG9pbnQgZm9yIGEgZmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxpbmUgbnVtYmVyLCBvcGVuIHRoZSBmaWxlLCBhbmQgc2hvdyB0aGUgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZnVsIHRvIHZpZXcgdGhlIHNvdXJjZSBsaW5lcyByZWZlcmVuY2VkIGluIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiB0cmFjZWJhY2suICBBdmFpbGFibGUgaW4gdGhlIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudSBvZiB0aGUgU2hlbGwgd2luZG93LgotICAgICAgICBEZWJ1Z2dlciAodG9nZ2xlKSAtLSBUaGlzIGZlYXR1cmUgaXMgbm90IGNvbXBsZXRlIGFuZCBjb25zaWRlcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbC4gUnVuIGNvbW1hbmRzIGluIHRoZSBzaGVsbCB1bmRlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdnZXIuCi0gICAgICAgIFN0YWNrIFZpZXdlciAgICAgIC0tIFNob3cgdGhlIHN0YWNrIHRyYWNlYmFjayBvZiB0aGUgbGFzdCBleGNlcHRpb24KLSAgICAgICAgQXV0by1vcGVuIFN0YWNrIFZpZXdlciAodG9nZ2xlKSAtLSBUb2dnbGUgYXV0b21hdGljYWxseSBvcGVuaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIHZpZXdlciBvbiB1bmhhbmRsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24KLQotT3B0aW9ucyBNZW51IChTaGVsbCBhbmQgRWRpdG9yKToKLQotICAgICAgICBDb25maWd1cmUgSURMRSAtLSBPcGVuIGEgY29uZmlndXJhdGlvbiBkaWFsb2cuICBGb250cywgaW5kZW50YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtleWJpbmRpbmdzLCBhbmQgY29sb3IgdGhlbWVzIG1heSBiZSBhbHRlcmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydHVwIFByZWZlcmVuY2VzIG1heSBiZSBzZXQsIGFuZCBhZGRpdGlvbmFsIEhlbHAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyBjYW4gYmUgc3BlY2lmaWVkLiAgT24gT1MgWCwgb3BlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBkaWFsb2cgYnkgc2VsZWN0aW5nIFByZWZlcmVuY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBhcHBsaWNhdGlvbiBtZW51LgotCi0gICAgICAgIC0tLQotICAgICAgICBDb2RlIENvbnRleHQgKHRvZ2dsZSkgLS0gT3BlbiBhIHBhbmUgYXQgdGhlIHRvcCBvZiB0aGUgZWRpdCB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHNob3dzIHRoZSBibG9jayBjb250ZXh0IG9mIHRoZSBzZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBjb2RlIHdoaWNoIGlzIHNjcm9sbGluZyBvZmYgdGhlIHRvcCBvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy4gVGhpcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgU2hlbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyBvbmx5IHRoZSBFZGl0b3Igd2luZG93LgotCi1XaW5kb3cgTWVudSAoU2hlbGwgYW5kIEVkaXRvcik6Ci0KLSAgICAgICAgWm9vbSBIZWlnaHQgLS0gVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbm9ybWFsIHNpemUgKDQweDgwIGluaXRpYWwKLSAgICAgICAgc2V0dGluZykgYW5kIG1heGltdW0gaGVpZ2h0LiAgVGhlIGluaXRpYWwgc2l6ZSBpcyBpbiB0aGUgQ29uZmlndXJlCi0gICAgICAgIElETEUgZGlhbG9nIHVuZGVyIHRoZSBnZW5lcmFsIHRhYi4KLSAgICAgICAgLS0tCi0gICAgICAgIFRoZSByZXN0IG9mIHRoaXMgbWVudSBsaXN0cyB0aGUgbmFtZXMgb2YgYWxsIG9wZW4gd2luZG93czsKLSAgICAgICAgc2VsZWN0IG9uZSB0byBicmluZyBpdCB0byB0aGUgZm9yZWdyb3VuZCAoZGVpY29uaWZ5aW5nIGl0IGlmCi0gICAgICAgIG5lY2Vzc2FyeSkuCi0KLUhlbHAgTWVudToKLQotICAgICAgICBBYm91dCBJRExFICAtLSBWZXJzaW9uLCBjb3B5cmlnaHQsIGxpY2Vuc2UsIGNyZWRpdHMKLSAgICAgICAgLS0tCi0gICAgICAgIElETEUgSGVscCAgIC0tIERpc3BsYXkgdGhpcyBmaWxlIHdoaWNoIGlzIGEgaGVscCBmaWxlIGZvciBJRExFCi0gICAgICAgICAgICAgICAgICAgICAgIGRldGFpbGluZyB0aGUgbWVudSBvcHRpb25zLCBiYXNpYyBlZGl0aW5nIGFuZCBuYXZpZ2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBhbmQgb3RoZXIgdGlwcy4KLSAgICAgICAgUHl0aG9uIERvY3MgLS0gQWNjZXNzIGxvY2FsIFB5dGhvbiBkb2N1bWVudGF0aW9uLCBpZgotICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQuICBPciB3aWxsIHN0YXJ0IGEgd2ViIGJyb3dzZXIgYW5kIG9wZW4KLSAgICAgICAgICAgICAgICAgICAgICAgZG9jcy5weXRob24ub3JnIHNob3dpbmcgdGhlIGxhdGVzdCBQeXRob24gZG9jdW1lbnRhdGlvbi4KLSAgICAgICAgLS0tCi0gICAgICAgIEFkZGl0aW9uYWwgaGVscCBzb3VyY2VzIG1heSBiZSBhZGRlZCBoZXJlIHdpdGggdGhlIENvbmZpZ3VyZSBJRExFCi0gICAgICAgIGRpYWxvZyB1bmRlciB0aGUgR2VuZXJhbCB0YWIuCi0KLUVkaXRvciBjb250ZXh0IG1lbnUgKFJpZ2h0LWNsaWNrIC8gQ29udHJvbC1jbGljayBvbiBPUyBYIGluIEVkaXQgd2luZG93KToKLQotICAgICAgICBDdXQgICAgICAgICAgICAgIC0tIENvcHkgYSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbgotICAgICAgICBDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCi0gICAgICAgIFBhc3RlICAgICAgICAgICAgLS0gSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdwotICAgICAgICBTZXQgQnJlYWtwb2ludCAgIC0tIFNldHMgYSBicmVha3BvaW50LiBCcmVha3BvaW50cyBhcmUgb25seSBlbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgZGVidWdnZXIgaXMgb3Blbi4KLSAgICAgICAgQ2xlYXIgQnJlYWtwb2ludCAtLSBDbGVhcnMgdGhlIGJyZWFrcG9pbnQgb24gdGhhdCBsaW5lCi0KLVNoZWxsIGNvbnRleHQgbWVudSAoUmlnaHQtY2xpY2sgLyBDb250cm9sLWNsaWNrIG9uIE9TIFggaW4gU2hlbGwgd2luZG93KToKLQotICAgICAgICBDdXQgICAgICAgICAgICAgIC0tIENvcHkgYSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbgotICAgICAgICBDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCi0gICAgICAgIFBhc3RlICAgICAgICAgICAgLS0gSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdwotICAgICAgICAtLS0KLSAgICAgICAgR28gdG8gZmlsZS9saW5lICAtLSBTYW1lIGFzIGluIERlYnVnIG1lbnUKLQotCi0qKiBUSVBTICoqCi09PT09PT09PT09Ci0KLUFkZGl0aW9uYWwgSGVscCBTb3VyY2VzOgotCi0gICAgICAgIFdpbmRvd3MgdXNlcnMgY2FuIEdvb2dsZSBvbiB6b3Blc2hlbGYuY2htIHRvIGFjY2VzcyBab3BlIGhlbHAgZmlsZXMgaW4KLSAgICAgICAgdGhlIFdpbmRvd3MgaGVscCBmb3JtYXQuICBUaGUgQWRkaXRpb25hbCBIZWxwIFNvdXJjZXMgZmVhdHVyZSBvZiB0aGUKLSAgICAgICAgY29uZmlndXJhdGlvbiBHVUkgc3VwcG9ydHMgLmNobSwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXR5cGVzCi0gICAgICAgIHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuICBTdXBwbHkgYSBNZW51IEl0ZW0gdGl0bGUsIGFuZCBlbnRlciB0aGUKLSAgICAgICAgbG9jYXRpb24gaW4gdGhlIEhlbHAgRmlsZSBQYXRoIHNsb3Qgb2YgdGhlIE5ldyBIZWxwIFNvdXJjZSBkaWFsb2cuICBVc2UKLSAgICAgICAgaHR0cDovLyBhbmQvb3Igd3d3LiB0byBpZGVudGlmeSBleHRlcm5hbCBVUkxzLCBvciBkb3dubG9hZCB0aGUgZmlsZSBhbmQKLSAgICAgICAgYnJvd3NlIGZvciBpdHMgcGF0aCBvbiB5b3VyIG1hY2hpbmUgdXNpbmcgdGhlIEJyb3dzZSBidXR0b24uCi0KLSAgICAgICAgQWxsIHVzZXJzIGNhbiBhY2Nlc3MgdGhlIGV4dGVuc2l2ZSBzb3VyY2VzIG9mIGhlbHAsIGluY2x1ZGluZwotICAgICAgICB0dXRvcmlhbHMsIGF2YWlsYWJsZSBhdCBkb2NzLnB5dGhvbi5vcmcuICBTZWxlY3RlZCBVUkxzIGNhbiBiZSBhZGRlZAotICAgICAgICBvciByZW1vdmVkIGZyb20gdGhlIEhlbHAgbWVudSBhdCBhbnkgdGltZSB1c2luZyBDb25maWd1cmUgSURMRS4KLQotQmFzaWMgZWRpdGluZyBhbmQgbmF2aWdhdGlvbjoKLQotICAgICAgICBCYWNrc3BhY2UgZGVsZXRlcyBjaGFyIHRvIHRoZSBsZWZ0OyBERUwgZGVsZXRlcyBjaGFyIHRvIHRoZSByaWdodC4KLSAgICAgICAgQ29udHJvbC1iYWNrc3BhY2UgZGVsZXRlcyB3b3JkIGxlZnQsIENvbnRyb2wtREVMIGRlbGV0ZXMgd29yZCByaWdodC4KLSAgICAgICAgQXJyb3cga2V5cyBhbmQgUGFnZSBVcC9Eb3duIG1vdmUgYXJvdW5kLgotICAgICAgICBDb250cm9sLWxlZnQvcmlnaHQgQXJyb3cgbW92ZXMgYnkgd29yZHMgaW4gYSBzdHJhbmdlIGJ1dCB1c2VmdWwgd2F5LgotICAgICAgICBIb21lL0VuZCBnbyB0byBiZWdpbi9lbmQgb2YgbGluZS4KLSAgICAgICAgQ29udHJvbC1Ib21lL0VuZCBnbyB0byBiZWdpbi9lbmQgb2YgZmlsZS4KLSAgICAgICAgU29tZSB1c2VmdWwgRW1hY3MgYmluZGluZ3MgYXJlIGluaGVyaXRlZCBmcm9tIFRjbC9UazoKLSAgICAgICAgICAgICAgICBDb250cm9sLWEgICAgIGJlZ2lubmluZyBvZiBsaW5lCi0gICAgICAgICAgICAgICAgQ29udHJvbC1lICAgICBlbmQgb2YgbGluZQotICAgICAgICAgICAgICAgIENvbnRyb2wtayAgICAga2lsbCBsaW5lIChidXQgZG9lc24ndCBwdXQgaXQgaW4gY2xpcGJvYXJkKQotICAgICAgICAgICAgICAgIENvbnRyb2wtbCAgICAgY2VudGVyIHdpbmRvdyBhcm91bmQgdGhlIGluc2VydGlvbiBwb2ludAotICAgICAgICBTdGFuZGFyZCBrZXliaW5kaW5ncyAobGlrZSBDb250cm9sLWMgdG8gY29weSBhbmQgQ29udHJvbC12IHRvCi0gICAgICAgIHBhc3RlKSBtYXkgd29yay4gIEtleWJpbmRpbmdzIGFyZSBzZWxlY3RlZCBpbiB0aGUgQ29uZmlndXJlIElETEUKLSAgICAgICAgZGlhbG9nLgotCi1BdXRvbWF0aWMgaW5kZW50YXRpb246Ci0KLSAgICAgICAgQWZ0ZXIgYSBibG9jay1vcGVuaW5nIHN0YXRlbWVudCwgdGhlIG5leHQgbGluZSBpcyBpbmRlbnRlZCBieSA0IHNwYWNlcwotICAgICAgICAoaW4gdGhlIFB5dGhvbiBTaGVsbCB3aW5kb3cgYnkgb25lIHRhYikuICBBZnRlciBjZXJ0YWluIGtleXdvcmRzCi0gICAgICAgIChicmVhaywgcmV0dXJuIGV0Yy4pIHRoZSBuZXh0IGxpbmUgaXMgZGVkZW50ZWQuICBJbiBsZWFkaW5nCi0gICAgICAgIGluZGVudGF0aW9uLCBCYWNrc3BhY2UgZGVsZXRlcyB1cCB0byA0IHNwYWNlcyBpZiB0aGV5IGFyZSB0aGVyZS4gIFRhYgotICAgICAgICBpbnNlcnRzIHNwYWNlcyAoaW4gdGhlIFB5dGhvbiBTaGVsbCB3aW5kb3cgb25lIHRhYiksIG51bWJlciBkZXBlbmRzIG9uCi0gICAgICAgIEluZGVudCBXaWR0aC4gQ3VycmVudGx5IHRhYnMgYXJlIHJlc3RyaWN0ZWQgdG8gZm91ciBzcGFjZXMgZHVlCi0gICAgICAgIHRvIFRjbC9UayBsaW1pdGF0aW9ucy4KLQotICAgICAgICBTZWUgYWxzbyB0aGUgaW5kZW50L2RlZGVudCByZWdpb24gY29tbWFuZHMgaW4gdGhlIGVkaXQgbWVudS4KLQotQ29tcGxldGlvbnM6Ci0KLSAgICAgICAgQ29tcGxldGlvbnMgYXJlIHN1cHBsaWVkIGZvciBmdW5jdGlvbnMsIGNsYXNzZXMsIGFuZCBhdHRyaWJ1dGVzIG9mCi0gICAgICAgIGNsYXNzZXMsIGJvdGggYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZC4gIENvbXBsZXRpb25zIGFyZSBhbHNvIHByb3ZpZGVkCi0gICAgICAgIGZvciBmaWxlbmFtZXMuCi0KLSAgICAgICAgVGhlIEF1dG9Db21wbGV0ZVdpbmRvdyAoQUNXKSB3aWxsIG9wZW4gYWZ0ZXIgYSBwcmVkZWZpbmVkIGRlbGF5Ci0gICAgICAgIChkZWZhdWx0IGlzIHR3byBzZWNvbmRzKSBhZnRlciBhICcuJyBvciAoaW4gYSBzdHJpbmcpIGFuIG9zLnNlcCBpcwotICAgICAgICB0eXBlZC4gIElmIGFmdGVyIG9uZSBvZiB0aG9zZSBjaGFyYWN0ZXJzIChwbHVzIHplcm8gb3IgbW9yZSBvdGhlcgotICAgICAgICBjaGFyYWN0ZXJzKSBhIHRhYiBpcyB0eXBlZCB0aGUgQUNXIHdpbGwgb3BlbiBpbW1lZGlhdGVseSBpZiBhIHBvc3NpYmxlCi0gICAgICAgIGNvbnRpbnVhdGlvbiBpcyBmb3VuZC4KLQotICAgICAgICBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwb3NzaWJsZSBjb21wbGV0aW9uIGZvciB0aGUgY2hhcmFjdGVycyBlbnRlcmVkLCBhCi0gICAgICAgIHRhYiB3aWxsIHN1cHBseSB0aGF0IGNvbXBsZXRpb24gd2l0aG91dCBvcGVuaW5nIHRoZSBBQ1cuCi0KLSAgICAgICAgJ1Nob3cgQ29tcGxldGlvbnMnIHdpbGwgZm9yY2Ugb3BlbiBhIGNvbXBsZXRpb25zIHdpbmRvdywgYnkgZGVmYXVsdCB0aGUKLSAgICAgICAgQ29udHJvbC1zcGFjZSBrZXlzIHdpbGwgb3BlbiBhIGNvbXBsZXRpb25zIHdpbmRvdy4gIEluIGFuIGVtcHR5Ci0gICAgICAgIHN0cmluZywgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIE9uIGEKLSAgICAgICAgYmxhbmsgbGluZSwgaXQgd2lsbCBjb250YWluIHRoZSBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhbmQKLSAgICAgICAgY2xhc3NlcyBpbiB0aGUgY3VycmVudCBuYW1lIHNwYWNlcywgcGx1cyBhbnkgbW9kdWxlcyBpbXBvcnRlZC4gIElmIHNvbWUKLSAgICAgICAgY2hhcmFjdGVycyBoYXZlIGJlZW4gZW50ZXJlZCwgdGhlIEFDVyB3aWxsIGF0dGVtcHQgdG8gYmUgbW9yZSBzcGVjaWZpYy4KLQotICAgICAgICBJZiBzdHJpbmcgb2YgY2hhcmFjdGVycyBpcyB0eXBlZCwgdGhlIEFDVyBzZWxlY3Rpb24gd2lsbCBqdW1wIHRvIHRoZQotICAgICAgICBlbnRyeSBtb3N0IGNsb3NlbHkgbWF0Y2hpbmcgdGhvc2UgY2hhcmFjdGVycy4gRW50ZXJpbmcgYSB0YWIgd2lsbCBjYXVzZQotICAgICAgICB0aGUgbG9uZ2VzdCBub24tYW1iaWd1b3VzIG1hdGNoIHRvIGJlIGVudGVyZWQgaW4gdGhlIEVkaXQgd2luZG93IG9yCi0gICAgICAgIFNoZWxsLiAgVHdvIHRhYnMgaW4gYSByb3cgd2lsbCBzdXBwbHkgdGhlIGN1cnJlbnQgQUNXIHNlbGVjdGlvbiwgYXMKLSAgICAgICAgd2lsbCByZXR1cm4gb3IgYSBkb3VibGUgY2xpY2suICBDdXJzb3Iga2V5cywgUGFnZSBVcC9Eb3duLCBtb3VzZQotICAgICAgICBzZWxlY3Rpb24sIGFuZCB0aGUgc2Nyb2xsIHdoZWVsIGFsbCBvcGVyYXRlIG9uIHRoZSBBQ1cuCi0KLSAgICAgICAgIkhpZGRlbiIgYXR0cmlidXRlcyBjYW4gYmUgYWNjZXNzZWQgYnkgdHlwaW5nIHRoZSBiZWdpbm5pbmcgb2YgaGlkZGVuCi0gICAgICAgIG5hbWUgYWZ0ZXIgYSAnLicsICBlLmcuICdfJy4gIFRoaXMgYWxsb3dzIGFjY2VzcyB0byBtb2R1bGVzIHdpdGgKLSAgICAgICAgJ19fYWxsX18nIHNldCwgb3IgdG8gY2xhc3MtcHJpdmF0ZSBhdHRyaWJ1dGVzLgotCi0gICAgICAgIENvbXBsZXRpb25zIGFuZCB0aGUgJ0V4cGFuZCBXb3JkJyBmYWNpbGl0eSBjYW4gc2F2ZSBhIGxvdCBvZiB0eXBpbmchCi0KLSAgICAgICAgQ29tcGxldGlvbnMgYXJlIGN1cnJlbnRseSBsaW1pdGVkIHRvIHRob3NlIGluIHRoZSBuYW1lc3BhY2VzLiAgTmFtZXMgaW4KLSAgICAgICAgYW4gRWRpdG9yIHdpbmRvdyB3aGljaCBhcmUgbm90IHZpYSBfX21haW5fXyBvciBzeXMubW9kdWxlcyB3aWxsIG5vdCBiZQotICAgICAgICBmb3VuZC4gIFJ1biB0aGUgbW9kdWxlIG9uY2Ugd2l0aCB5b3VyIGltcG9ydHMgdG8gY29ycmVjdCB0aGlzCi0gICAgICAgIHNpdHVhdGlvbi4gIE5vdGUgdGhhdCBJRExFIGl0c2VsZiBwbGFjZXMgcXVpdGUgYSBmZXcgbW9kdWxlcyBpbgotICAgICAgICBzeXMubW9kdWxlcywgc28gbXVjaCBjYW4gYmUgZm91bmQgYnkgZGVmYXVsdCwgZS5nLiB0aGUgcmUgbW9kdWxlLgotCi0gICAgICAgIElmIHlvdSBkb24ndCBsaWtlIHRoZSBBQ1cgcG9wcGluZyB1cCB1bmJpZGRlbiwgc2ltcGx5IG1ha2UgdGhlIGRlbGF5Ci0gICAgICAgIGxvbmdlciBvciBkaXNhYmxlIHRoZSBleHRlbnNpb24uICBPciBhbm90aGVyIG9wdGlvbiBpcyB0aGUgZGVsYXkgY291bGQKLSAgICAgICAgYmUgc2V0IHRvIHplcm8uIEFub3RoZXIgYWx0ZXJuYXRpdmUgdG8gcHJldmVudGluZyBBQ1cgcG9wdXBzIGlzIHRvCi0gICAgICAgIGRpc2FibGUgdGhlIGNhbGwgdGlwcyBleHRlbnNpb24uCi0KLVB5dGhvbiBTaGVsbCB3aW5kb3c6Ci0KLSAgICAgICAgQ29udHJvbC1jIGludGVycnVwdHMgZXhlY3V0aW5nIGNvbW1hbmQuCi0gICAgICAgIENvbnRyb2wtZCBzZW5kcyBlbmQtb2YtZmlsZTsgY2xvc2VzIHdpbmRvdyBpZiB0eXBlZCBhdCA+Pj4gcHJvbXB0LgotICAgICAgICBBbHQtLyBleHBhbmQgd29yZCBpcyBhbHNvIHVzZWZ1bCB0byByZWR1Y2UgdHlwaW5nLgotCi0gICAgQ29tbWFuZCBoaXN0b3J5OgotCi0gICAgICAgIEFsdC1wIHJldHJpZXZlcyBwcmV2aW91cyBjb21tYW5kIG1hdGNoaW5nIHdoYXQgeW91IGhhdmUgdHlwZWQuIE9uIE9TIFgKLSAgICAgICAgdXNlIENvbnRyb2wtcC4KLSAgICAgICAgQWx0LW4gcmV0cmlldmVzIG5leHQuIE9uIE9TIFggdXNlIENvbnRyb2wtbi4KLSAgICAgICAgUmV0dXJuIHdoaWxlIGN1cnNvciBpcyBvbiBhIHByZXZpb3VzIGNvbW1hbmQgcmV0cmlldmVzIHRoYXQgY29tbWFuZC4KLQotICAgIFN5bnRheCBjb2xvcnM6Ci0KLSAgICAgICAgVGhlIGNvbG9yaW5nIGlzIGFwcGxpZWQgaW4gYSBiYWNrZ3JvdW5kICJ0aHJlYWQiLCBzbyB5b3UgbWF5Ci0gICAgICAgIG9jY2FzaW9uYWxseSBzZWUgdW5jb2xvcml6ZWQgdGV4dC4gIFRvIGNoYW5nZSB0aGUgY29sb3IKLSAgICAgICAgc2NoZW1lLCB1c2UgdGhlIENvbmZpZ3VyZSBJRExFIC8gSGlnaGxpZ2h0aW5nIGRpYWxvZy4KLQotICAgIFB5dGhvbiBkZWZhdWx0IHN5bnRheCBjb2xvcnM6Ci0KLSAgICAgICAgS2V5d29yZHMgICAgICAgIG9yYW5nZQotICAgICAgICBCdWlsdGlucyAgICAgICAgcm95YWwgcHVycGxlCi0gICAgICAgIFN0cmluZ3MgICAgICAgICBncmVlbgotICAgICAgICBDb21tZW50cyAgICAgICAgcmVkCi0gICAgICAgIERlZmluaXRpb25zICAgICBibHVlCi0KLSAgICBTaGVsbCBkZWZhdWx0IGNvbG9yczoKLQotICAgICAgICBDb25zb2xlIG91dHB1dCAgYnJvd24KLSAgICAgICAgc3Rkb3V0ICAgICAgICAgIGJsdWUKLSAgICAgICAgc3RkZXJyICAgICAgICAgIHJlZAotICAgICAgICBzdGRpbiAgICAgICAgICAgYmxhY2sKLQotT3RoZXIgcHJlZmVyZW5jZXM6Ci0KLSAgICAgICAgVGhlIGZvbnQgcHJlZmVyZW5jZXMsIGhpZ2hsaWdodGluZywga2V5cywgYW5kIGdlbmVyYWwgcHJlZmVyZW5jZXMgY2FuCi0gICAgICAgIGJlIGNoYW5nZWQgdmlhIHRoZSBDb25maWd1cmUgSURMRSBtZW51IG9wdGlvbi4gIEJlIHN1cmUgdG8gbm90ZSB0aGF0Ci0gICAgICAgIGtleXMgY2FuIGJlIHVzZXIgZGVmaW5lZCwgSURMRSBzaGlwcyB3aXRoIGZvdXIgYnVpbHQgaW4ga2V5IHNldHMuIEluCi0gICAgICAgIGFkZGl0aW9uIGEgdXNlciBjYW4gY3JlYXRlIGEgY3VzdG9tIGtleSBzZXQgaW4gdGhlIENvbmZpZ3VyZSBJRExFCi0gICAgICAgIGRpYWxvZyB1bmRlciB0aGUga2V5cyB0YWIuCi0KLUNvbW1hbmQgbGluZSB1c2FnZToKLQotICAgICAgICBFbnRlciBpZGxlIC1oIGF0IHRoZSBjb21tYW5kIHByb21wdCB0byBnZXQgYSB1c2FnZSBtZXNzYWdlLgotCi0gICAgICAgIGlkbGUucHkgWy1jIGNvbW1hbmRdIFstZF0gWy1lXSBbLXNdIFstdCB0aXRsZV0gW2FyZ10gLi4uCi0KLSAgICAgICAgLWMgY29tbWFuZCAgcnVuIHRoaXMgY29tbWFuZAotICAgICAgICAtZCAgICAgICAgICBlbmFibGUgZGVidWdnZXIKLSAgICAgICAgLWUgICAgICAgICAgZWRpdCBtb2RlOyBhcmd1bWVudHMgYXJlIGZpbGVzIHRvIGJlIGVkaXRlZAotICAgICAgICAtcyAgICAgICAgICBydW4gJElETEVTVEFSVFVQIG9yICRQWVRIT05TVEFSVFVQIGZpcnN0Ci0gICAgICAgIC10IHRpdGxlICAgIHNldCB0aXRsZSBvZiBzaGVsbCB3aW5kb3cKLQotICAgICAgICBJZiB0aGVyZSBhcmUgYXJndW1lbnRzOgotICAgICAgICAxLiBJZiAtZSBpcyB1c2VkLCBhcmd1bWVudHMgYXJlIGZpbGVzIG9wZW5lZCBmb3IgZWRpdGluZyBhbmQgc3lzLmFyZ3YKLSAgICAgICAgICAgcmVmbGVjdHMgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gSURMRSBpdHNlbGYuCi0gICAgICAgIDIuIE90aGVyd2lzZSwgaWYgLWMgaXMgdXNlZCwgYWxsIGFyZ3VtZW50cyBhcmUgcGxhY2VkIGluCi0gICAgICAgICAgIHN5cy5hcmd2WzE6Li4uXSwgd2l0aCBzeXMuYXJndlswXSBzZXQgdG8gLWMuCi0gICAgICAgIDMuIE90aGVyd2lzZSwgaWYgbmVpdGhlciAtZSBub3IgLWMgaXMgdXNlZCwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEKLSAgICAgICAgICAgc2NyaXB0IHdoaWNoIGlzIGV4ZWN1dGVkIHdpdGggdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgaW4KLSAgICAgICAgICAgc3lzLmFyZ3ZbMTouLi5dICBhbmQgc3lzLmFyZ3ZbMF0gc2V0IHRvIHRoZSBzY3JpcHQgbmFtZS4gIElmIHRoZQotICAgICAgICAgICBzY3JpcHQgbmFtZSBpcyAtLCBubyBzY3JpcHQgaXMgZXhlY3V0ZWQgYnV0IGFuIGludGVyYWN0aXZlIFB5dGhvbgotICAgICAgICAgICBzZXNzaW9uIGlzIHN0YXJ0ZWQ7IHRoZSBhcmd1bWVudHMgYXJlIHN0aWxsIGF2YWlsYWJsZSBpbiBzeXMuYXJndi4KLQotUnVubmluZyB3aXRob3V0IGEgc3VicHJvY2VzczogKERFUFJFQ0FURUQgaW4gUHl0aG9uIDMuNCBzZWUgSXNzdWUgMTYxMjMpCi0KLSAgICAgICAgSWYgSURMRSBpcyBzdGFydGVkIHdpdGggdGhlIC1uIGNvbW1hbmQgbGluZSBzd2l0Y2ggaXQgd2lsbCBydW4gaW4gYQotICAgICAgICBzaW5nbGUgcHJvY2VzcyBhbmQgd2lsbCBub3QgY3JlYXRlIHRoZSBzdWJwcm9jZXNzIHdoaWNoIHJ1bnMgdGhlIFJQQwotICAgICAgICBQeXRob24gZXhlY3V0aW9uIHNlcnZlci4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiBQeXRob24gY2Fubm90IGNyZWF0ZQotICAgICAgICB0aGUgc3VicHJvY2VzcyBvciB0aGUgUlBDIHNvY2tldCBpbnRlcmZhY2Ugb24geW91ciBwbGF0Zm9ybS4gIEhvd2V2ZXIsCi0gICAgICAgIGluIHRoaXMgbW9kZSB1c2VyIGNvZGUgaXMgbm90IGlzb2xhdGVkIGZyb20gSURMRSBpdHNlbGYuICBBbHNvLCB0aGUKLSAgICAgICAgZW52aXJvbm1lbnQgaXMgbm90IHJlc3RhcnRlZCB3aGVuIFJ1bi9SdW4gTW9kdWxlIChGNSkgaXMgc2VsZWN0ZWQuICBJZgotICAgICAgICB5b3VyIGNvZGUgaGFzIGJlZW4gbW9kaWZpZWQsIHlvdSBtdXN0IHJlbG9hZCgpIHRoZSBhZmZlY3RlZCBtb2R1bGVzIGFuZAotICAgICAgICByZS1pbXBvcnQgYW55IHNwZWNpZmljIGl0ZW1zIChlLmcuIGZyb20gZm9vIGltcG9ydCBiYXopIGlmIHRoZSBjaGFuZ2VzCi0gICAgICAgIGFyZSB0byB0YWtlIGVmZmVjdC4gIEZvciB0aGVzZSByZWFzb25zLCBpdCBpcyBwcmVmZXJhYmxlIHRvIHJ1biBJRExFCi0gICAgICAgIHdpdGggdGhlIGRlZmF1bHQgc3VicHJvY2VzcyBpZiBhdCBhbGwgcG9zc2libGUuCi0KLUV4dGVuc2lvbnM6Ci0KLSAgICAgICAgSURMRSBjb250YWlucyBhbiBleHRlbnNpb24gZmFjaWxpdHkuICBTZWUgdGhlIGJlZ2lubmluZyBvZgotICAgICAgICBjb25maWctZXh0ZW5zaW9ucy5kZWYgaW4gdGhlIGlkbGVsaWIgZGlyZWN0b3J5IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgotICAgICAgICBUaGUgZGVmYXVsdCBleHRlbnNpb25zIGFyZSBjdXJyZW50bHk6Ci0KLSAgICAgICAgICAgICAgICBGb3JtYXRQYXJhZ3JhcGgKLSAgICAgICAgICAgICAgICBBdXRvRXhwYW5kCi0gICAgICAgICAgICAgICAgWm9vbUhlaWdodAotICAgICAgICAgICAgICAgIFNjcmlwdEJpbmRpbmcKLSAgICAgICAgICAgICAgICBDYWxsVGlwcwotICAgICAgICAgICAgICAgIFBhcmVuTWF0Y2gKLSAgICAgICAgICAgICAgICBBdXRvQ29tcGxldGUKLSAgICAgICAgICAgICAgICBDb2RlQ29udGV4dApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvYWJvdXREaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9oZWxwX2Fib3V0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2Fib3V0RGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9oZWxwX2Fib3V0LnB5CmluZGV4IGE4Zjc1ZDIuLjA3MWJkM2UgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2Fib3V0RGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2hlbHBfYWJvdXQucHkKQEAgLTEsMTEgKzEsMTMgQEAKICIiIkFib3V0IERpYWxvZyBmb3IgSURMRQogCiAiIiIKLQogaW1wb3J0IG9zCiBmcm9tIHN5cyBpbXBvcnQgdmVyc2lvbgorCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLWZyb20gaWRsZWxpYiBpbXBvcnQgdGV4dFZpZXcKKworZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0dmlldworCiAKIGNsYXNzIEFib3V0RGlhbG9nKFRvcGxldmVsKToKICAgICAiIiJNb2RhbCBhYm91dCBkaWFsb2cgZm9yIGlkbGUKQEAgLTEzNSwxNyArMTM3LDE4IEBACiAgICAgZGVmIGRpc3BsYXlfcHJpbnRlcl90ZXh0KHNlbGYsIHRpdGxlLCBwcmludGVyKToKICAgICAgICAgcHJpbnRlci5fUHJpbnRlcl9fc2V0dXAoKQogICAgICAgICB0ZXh0ID0gJ1xuJy5qb2luKHByaW50ZXIuX1ByaW50ZXJfX2xpbmVzKQotICAgICAgICB0ZXh0Vmlldy52aWV3X3RleHQoc2VsZiwgdGl0bGUsIHRleHQpCisgICAgICAgIHRleHR2aWV3LnZpZXdfdGV4dChzZWxmLCB0aXRsZSwgdGV4dCkKIAogICAgIGRlZiBkaXNwbGF5X2ZpbGVfdGV4dChzZWxmLCB0aXRsZSwgZmlsZW5hbWUsIGVuY29kaW5nPU5vbmUpOgogICAgICAgICBmbiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksIGZpbGVuYW1lKQotICAgICAgICB0ZXh0Vmlldy52aWV3X2ZpbGUoc2VsZiwgdGl0bGUsIGZuLCBlbmNvZGluZykKKyAgICAgICAgdGV4dHZpZXcudmlld19maWxlKHNlbGYsIHRpdGxlLCBmbiwgZW5jb2RpbmcpCiAKICAgICBkZWYgT2soc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgIHNlbGYuZGVzdHJveSgpCiAKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBpbXBvcnQgdW5pdHRlc3QKLSAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2hlbHBhYm91dCcsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfaGVscF9hYm91dCcsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihBYm91dERpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0lkbGVIaXN0b3J5LnB5IGIvTGliL2lkbGVsaWIvaGlzdG9yeS5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9JZGxlSGlzdG9yeS5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaGlzdG9yeS5weQppbmRleCAwNzhhZjI5Li41NmY1M2EwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9JZGxlSGlzdG9yeS5weQorKysgYi9MaWIvaWRsZWxpYi9oaXN0b3J5LnB5CkBAIC0xLDExICsxLDEyIEBACiAiSW1wbGVtZW50IElkbGUgU2hlbGwgaGlzdG9yeSBtZWNoYW5pc20gd2l0aCBIaXN0b3J5IGNsYXNzIgogCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCisKIAogY2xhc3MgSGlzdG9yeToKICAgICAnJycgSW1wbGVtZW50IElkbGUgU2hlbGwgaGlzdG9yeSBtZWNoYW5pc20uCiAKLSAgICBzdG9yZSAtIFN0b3JlIHNvdXJjZSBzdGF0ZW1lbnQgKGNhbGxlZCBmcm9tIFB5U2hlbGwucmVzZXRvdXRwdXQpLgorICAgIHN0b3JlIC0gU3RvcmUgc291cmNlIHN0YXRlbWVudCAoY2FsbGVkIGZyb20gcHlzaGVsbC5yZXNldG91dHB1dCkuCiAgICAgZmV0Y2ggLSBGZXRjaCBzdG9yZWQgc3RhdGVtZW50IG1hdGNoaW5nIHByZWZpeCBhbHJlYWR5IGVudGVyZWQuCiAgICAgaGlzdG9yeV9uZXh0IC0gQm91bmQgdG8gPDxoaXN0b3J5LW5leHQ+PiBldmVudCAoZGVmYXVsdCBBbHQtTikuCiAgICAgaGlzdG9yeV9wcmV2IC0gQm91bmQgdG8gPDxoaXN0b3J5LXByZXY+PiBldmVudCAoZGVmYXVsdCBBbHQtUCkuCkBAIC05OSw2ICsxMDAsNyBAQAogICAgICAgICBzZWxmLnBvaW50ZXIgPSBOb25lCiAgICAgICAgIHNlbGYucHJlZml4ID0gTm9uZQogCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgZnJvbSB1bml0dGVzdCBpbXBvcnQgbWFpbgotICAgIG1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfaWRsZWhpc3RvcnknLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKyAgICBtYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2hpc3RvcnknLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0h5cGVyUGFyc2VyLnB5IGIvTGliL2lkbGVsaWIvaHlwZXJwYXJzZXIucHkKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvSHlwZXJQYXJzZXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2h5cGVycGFyc2VyLnB5CmluZGV4IDc3Y2IwNTcuLjQ1MGE3MDkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0h5cGVyUGFyc2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL2h5cGVycGFyc2VyLnB5CkBAIC00LDExICs0LDEwIEBACiBwcm9wZXIgaW5kZW50YXRpb24gb2YgY29kZS4gIEh5cGVyUGFyc2VyIGdpdmVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24KIHRoZSBzdHJ1Y3R1cmUgb2YgY29kZS4KICIiIgotCi1pbXBvcnQgc3RyaW5nCiBmcm9tIGtleXdvcmQgaW1wb3J0IGlza2V5d29yZAotZnJvbSBpZGxlbGliIGltcG9ydCBQeVBhcnNlCitpbXBvcnQgc3RyaW5nCiAKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcHlwYXJzZQogCiAjIGFsbCBBU0NJSSBjaGFycyB0aGF0IG1heSBiZSBpbiBhbiBpZGVudGlmaWVyCiBfQVNDSUlfSURfQ0hBUlMgPSBmcm96ZW5zZXQoc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgIl8iKQpAQCAtMzAsNyArMjksNyBAQAogICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCiAgICAgICAgIHNlbGYudGV4dCA9IHRleHQgPSBlZGl0d2luLnRleHQKIAotICAgICAgICBwYXJzZXIgPSBQeVBhcnNlLlBhcnNlcihlZGl0d2luLmluZGVudHdpZHRoLCBlZGl0d2luLnRhYndpZHRoKQorICAgICAgICBwYXJzZXIgPSBweXBhcnNlLlBhcnNlcihlZGl0d2luLmluZGVudHdpZHRoLCBlZGl0d2luLnRhYndpZHRoKQogCiAgICAgICAgIGRlZiBpbmRleDJsaW5lKGluZGV4KToKICAgICAgICAgICAgIHJldHVybiBpbnQoZmxvYXQoaW5kZXgpKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZS5weSBiL0xpYi9pZGxlbGliL2lkbGUucHkKaW5kZXggYTI0OTU1Ny4uYzAxY2Y5OSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZS5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlLnB5CkBAIC03LDUgKzcsNSBAQAogaWRsZWxpYl9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpKQogc3lzLnBhdGguaW5zZXJ0KDAsIGlkbGVsaWJfZGlyKQogCi1pbXBvcnQgaWRsZWxpYi5QeVNoZWxsCi1pZGxlbGliLlB5U2hlbGwubWFpbigpCitpbXBvcnQgaWRsZWxpYi5weXNoZWxsCitpZGxlbGliLnB5c2hlbGwubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlLnB5dyBiL0xpYi9pZGxlbGliL2lkbGUucHl3CmluZGV4IDE0MmNiMzIuLmU3M2MwNDkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGUucHl3CisrKyBiL0xpYi9pZGxlbGliL2lkbGUucHl3CkBAIC0xLDEwICsxLDEwIEBACiB0cnk6Ci0gICAgaW1wb3J0IGlkbGVsaWIuUHlTaGVsbAorICAgIGltcG9ydCBpZGxlbGliLnB5c2hlbGwKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAjIElETEUgaXMgbm90IGluc3RhbGxlZCwgYnV0IG1heWJlIFB5U2hlbGwgaXMgb24gc3lzLnBhdGg6Ci0gICAgZnJvbSAuIGltcG9ydCBQeVNoZWxsCisgICAgIyBJRExFIGlzIG5vdCBpbnN0YWxsZWQsIGJ1dCBtYXliZSBweXNoZWxsIGlzIG9uIHN5cy5wYXRoOgorICAgIGZyb20gLiBpbXBvcnQgcHlzaGVsbAogICAgIGltcG9ydCBvcwotICAgIGlkbGVkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKFB5U2hlbGwuX19maWxlX18pKQorICAgIGlkbGVkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKHB5c2hlbGwuX19maWxlX18pKQogICAgIGlmIGlkbGVkaXIgIT0gb3MuZ2V0Y3dkKCk6CiAgICAgICAgICMgV2UncmUgbm90IGluIHRoZSBJRExFIGRpcmVjdG9yeSwgaGVscCB0aGUgc3VicHJvY2VzcyBmaW5kIHJ1bi5weQogICAgICAgICBweXBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKQpAQCAtMTIsNiArMTIsNiBAQAogICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gcHlwYXRoICsgJzonICsgaWRsZWRpcgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gaWRsZWRpcgotICAgIFB5U2hlbGwubWFpbigpCisgICAgcHlzaGVsbC5tYWluKCkKIGVsc2U6Ci0gICAgaWRsZWxpYi5QeVNoZWxsLm1haW4oKQorICAgIGlkbGVsaWIucHlzaGVsbC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9fX2luaXRfXy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9fX2luaXRfXy5weQppbmRleCA4NDVjOTJkLi5hZDA2N2I0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvX19pbml0X18ucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L19faW5pdF9fLnB5CkBAIC0xLDYgKzEsOCBAQAogJycnaWRsZWxpYi5pZGxlX3Rlc3QgaXMgYSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRlc3QudGVzdF9pZGxlLAogd2hpY2ggdGVzdHMgdGhlIElETEUgYXBwbGljYXRpb24gYXMgcGFydCBvZiB0aGUgc3RkbGliIHRlc3Qgc3VpdGUuCiBSdW4gSURMRSB0ZXN0cyBhbG9uZSB3aXRoICJweXRob24gLW0gdGVzdC50ZXN0X2lkbGUiLgorU3RhcnRpbmcgd2l0aCBQeXRob24gMy42LCBJRExFIHJlcXVpcmVzIHRjbC90ayA4LjUgb3IgbGF0ZXIuCisKIFRoaXMgcGFja2FnZSBhbmQgaXRzIGNvbnRhaW5lZCBtb2R1bGVzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBhbmQKIGFueSBkaXJlY3QgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCiAnJycKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9odGVzdC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9odGVzdC5weQppbmRleCA1OGU2MmNiLi42ZjY3NmFlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvaHRlc3QucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L2h0ZXN0LnB5CkBAIC01OSwxOSArNTksMjAgQEAKIAogCiBNb2R1bGVzIGFuZCBjbGFzc2VzIG5vdCBiZWluZyB0ZXN0ZWQgYXQgdGhlIG1vbWVudDoKLVB5U2hlbGwuUHlTaGVsbEVkaXRvcldpbmRvdwotRGVidWdnZXIuRGVidWdnZXIKLUF1dG9Db21wbGV0ZVdpbmRvdy5BdXRvQ29tcGxldGVXaW5kb3cKLU91dHB1dFdpbmRvdy5PdXRwdXRXaW5kb3cgKGluZGlyZWN0bHkgYmVpbmcgdGVzdGVkIHdpdGggZ3JlcCB0ZXN0KQorcHlzaGVsbC5QeVNoZWxsRWRpdG9yV2luZG93CitkZWJ1Z2dlci5EZWJ1Z2dlcgorYXV0b2NvbXBsZXRlX3cuQXV0b0NvbXBsZXRlV2luZG93CitvdXR3aW4uT3V0cHV0V2luZG93IChpbmRpcmVjdGx5IGJlaW5nIHRlc3RlZCB3aXRoIGdyZXAgdGVzdCkKICcnJwogCiBmcm9tIGltcG9ydGxpYiBpbXBvcnQgaW1wb3J0X21vZHVsZQotZnJvbSBpZGxlbGliLm1hY29zeFN1cHBvcnQgaW1wb3J0IF9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMKIGltcG9ydCB0a2ludGVyIGFzIHRrCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKK3RrLk5vRGVmYXVsdFJvb3QoKQogCiBBYm91dERpYWxvZ19zcGVjID0gewotICAgICdmaWxlJzogJ2Fib3V0RGlhbG9nJywKLSAgICAna3dkcyc6IHsndGl0bGUnOiAnYWJvdXREaWFsb2cgdGVzdCcsCisgICAgJ2ZpbGUnOiAnaGVscF9hYm91dCcsCisgICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ2hlbHBfYWJvdXQgdGVzdCcsCiAgICAgICAgICAgICAgJ19odGVzdCc6IFRydWUsCiAgICAgICAgICAgICAgfSwKICAgICAnbXNnJzogIlRlc3QgZXZlcnkgYnV0dG9uLiBFbnN1cmUgUHl0aG9uLCBUSyBhbmQgSURMRSB2ZXJzaW9ucyAiCkBAIC03OSwxNCArODAsMTQgQEAKICAgICB9CiAKIF9jYWxsdGlwX3dpbmRvd19zcGVjID0gewotICAgICdmaWxlJzogJ0NhbGxUaXBXaW5kb3cnLAorICAgICdmaWxlJzogJ2NhbGx0aXBfdycsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIlR5cGluZyAnKCcgc2hvdWxkIGRpc3BsYXkgYSBjYWxsdGlwLlxuIgogICAgICAgICAgICAiVHlwaW5nICcpIHNob3VsZCBoaWRlIHRoZSBjYWxsdGlwLlxuIgogICAgIH0KIAogX2NsYXNzX2Jyb3dzZXJfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdDbGFzc0Jyb3dzZXInLAorICAgICdmaWxlJzogJ2Jyb3dzZXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJJbnNwZWN0IG5hbWVzIG9mIG1vZHVsZSwgY2xhc3Mod2l0aCBzdXBlcmNsYXNzIGlmICIKICAgICAgICAgICAgImFwcGxpY2FibGUpLCBtZXRob2RzIGFuZCBmdW5jdGlvbnMuXG5Ub2dnbGUgbmVzdGVkIGl0ZW1zLlxuIgpAQCAtOTUsNyArOTYsNyBAQAogICAgIH0KIAogX2NvbG9yX2RlbGVnYXRvcl9zcGVjID0gewotICAgICdmaWxlJzogJ0NvbG9yRGVsZWdhdG9yJywKKyAgICAnZmlsZSc6ICdjb2xvcml6ZXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUaGUgdGV4dCBpcyBzYW1wbGUgUHl0aG9uIGNvZGUuXG4iCiAgICAgICAgICAgICJFbnN1cmUgY29tcG9uZW50cyBsaWtlIGNvbW1lbnRzLCBrZXl3b3JkcywgYnVpbHRpbnMsXG4iCkBAIC0xMDQsNyArMTA1LDcgQEAKICAgICB9CiAKIENvbmZpZ0RpYWxvZ19zcGVjID0gewotICAgICdmaWxlJzogJ2NvbmZpZ0RpYWxvZycsCisgICAgJ2ZpbGUnOiAnY29uZmlnZGlhbG9nJywKICAgICAna3dkcyc6IHsndGl0bGUnOiAnQ29uZmlnRGlhbG9nVGVzdCcsCiAgICAgICAgICAgICAgJ19odGVzdCc6IFRydWUsfSwKICAgICAnbXNnJzogIklETEUgcHJlZmVyZW5jZXMgZGlhbG9nLlxuIgpAQCAtMTIxLDcgKzEyMiw3IEBACiAKICMgVE9ETyBJbXByb3ZlIG1lc3NhZ2UKIF9keW5fb3B0aW9uX21lbnVfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdkeW5PcHRpb25NZW51V2lkZ2V0JywKKyAgICAnZmlsZSc6ICdkeW5vcHRpb24nLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJTZWxlY3Qgb25lIG9mIHRoZSBtYW55IG9wdGlvbnMgaW4gdGhlICdvbGQgb3B0aW9uIHNldCcuXG4iCiAgICAgICAgICAgICJDbGljayB0aGUgYnV0dG9uIHRvIGNoYW5nZSB0aGUgb3B0aW9uIHNldC5cbiIKQEAgLTEzMCwzOSArMTMxLDE1IEBACiAKICMgVE9ETyBlZGl0IHdyYXBwZXIKIF9lZGl0b3Jfd2luZG93X3NwZWMgPSB7Ci0gICAnZmlsZSc6ICdFZGl0b3JXaW5kb3cnLAorICAgJ2ZpbGUnOiAnZWRpdG9yJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiVGVzdCBlZGl0b3IgZnVuY3Rpb25zIG9mIGludGVyZXN0LlxuIgogICAgICAgICAgICAiQmVzdCB0byBjbG9zZSBlZGl0b3IgZmlyc3QuIgogICAgIH0KIAotR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdjb25maWdTZWN0aW9uTmFtZURpYWxvZycsCi0gICAgJ2t3ZHMnOiB7J3RpdGxlJzonR2V0IE5hbWUnLAotICAgICAgICAgICAgICdtZXNzYWdlJzonRW50ZXIgc29tZXRoaW5nJywKLSAgICAgICAgICAgICAndXNlZF9uYW1lcyc6IHsnYWJjJ30sCi0gICAgICAgICAgICAgJ19odGVzdCc6IFRydWV9LAotICAgICdtc2cnOiAiQWZ0ZXIgdGhlIHRleHQgZW50ZXJlZCB3aXRoIFtPa10gaXMgc3RyaXBwZWQsIDxub3RoaW5nPiwgIgotICAgICAgICAgICAiJ2FiYycsIG9yIG1vcmUgdGhhdCAzMCBjaGFycyBhcmUgZXJyb3JzLlxuIgotICAgICAgICAgICAiQ2xvc2UgJ0dldCBOYW1lJyB3aXRoIGEgdmFsaWQgZW50cnkgKHByaW50ZWQgdG8gU2hlbGwpLCAiCi0gICAgICAgICAgICJbQ2FuY2VsXSwgb3IgW1hdIiwKLSAgICB9Ci0KLUdldEhlbHBTb3VyY2VEaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdjb25maWdIZWxwU291cmNlRWRpdCcsCi0gICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ0dldCBoZWxwc291cmNlJywKLSAgICAgICAgICAgICAnX2h0ZXN0JzogVHJ1ZX0sCi0gICAgJ21zZyc6ICJFbnRlciBtZW51IGl0ZW0gbmFtZSBhbmQgaGVscCBmaWxlIHBhdGhcbiAiCi0gICAgICAgICAgICI8bm90aGluZz4gYW5kIG1vcmUgdGhhbiAzMCBjaGFycyBhcmUgaW52YWxpZCBtZW51IGl0ZW0gbmFtZXMuXG4iCi0gICAgICAgICAgICI8bm90aGluZz4sIGZpbGUgZG9lcyBub3QgZXhpc3QgYXJlIGludmFsaWQgcGF0aCBpdGVtcy5cbiIKLSAgICAgICAgICAgIlRlc3QgZm9yIGluY29tcGxldGUgd2ViIGFkZHJlc3MgZm9yIGhlbHAgZmlsZSBwYXRoLlxuIgotICAgICAgICAgICAiQSB2YWxpZCBlbnRyeSB3aWxsIGJlIHByaW50ZWQgdG8gc2hlbGwgd2l0aCBbMGtdLlxuIgotICAgICAgICAgICAiW0NhbmNlbF0gd2lsbCBwcmludCBOb25lIHRvIHNoZWxsIiwKLSAgICB9Ci0KICMgVXBkYXRlIG9uY2UgaXNzdWUyMTUxOSBpcyByZXNvbHZlZC4KIEdldEtleXNEaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdrZXliaW5kaW5nRGlhbG9nJywKKyAgICAnZmlsZSc6ICdjb25maWdfa2V5JywKICAgICAna3dkcyc6IHsndGl0bGUnOiAnVGVzdCBrZXliaW5kaW5ncycsCiAgICAgICAgICAgICAgJ2FjdGlvbic6ICdmaW5kLWFnYWluJywKICAgICAgICAgICAgICAnY3VycmVudEtleVNlcXVlbmNlcyc6IFsnJ10gLApAQCAtMTc3LDcgKzE1NCw3IEBACiAgICAgfQogCiBfZ3JlcF9kaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdHcmVwRGlhbG9nJywKKyAgICAnZmlsZSc6ICdncmVwJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiQ2xpY2sgdGhlICdTaG93IEdyZXBEaWFsb2cnIGJ1dHRvbi5cbiIKICAgICAgICAgICAgIlRlc3QgdGhlIHZhcmlvdXMgJ0ZpbmQtaW4tZmlsZXMnIGZ1bmN0aW9ucy5cbiIKQEAgLTE4Niw4ICsxNjMsMjQgQEAKICAgICAgICAgICAgInNob3VsZCBvcGVuIHRoYXQgZmlsZSBcbmluIGEgbmV3IEVkaXRvcldpbmRvdy4iCiAgICAgfQogCitIZWxwU291cmNlX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAncXVlcnknLAorICAgICdrd2RzJzogeyd0aXRsZSc6ICdIZWxwIG5hbWUgYW5kIHNvdXJjZScsCisgICAgICAgICAgICAgJ21lbnVpdGVtJzogJ3Rlc3QnLAorICAgICAgICAgICAgICdmaWxlcGF0aCc6IF9fZmlsZV9fLAorICAgICAgICAgICAgICd1c2VkX25hbWVzJzogeydhYmMnfSwKKyAgICAgICAgICAgICAnX2h0ZXN0JzogVHJ1ZX0sCisgICAgJ21zZyc6ICJFbnRlciBtZW51IGl0ZW0gbmFtZSBhbmQgaGVscCBmaWxlIHBhdGhcbiIKKyAgICAgICAgICAgIicnLCA+IHRoYW4gMzAgY2hhcnMsIGFuZCAnYWJjJyBhcmUgaW52YWxpZCBtZW51IGl0ZW0gbmFtZXMuXG4iCisgICAgICAgICAgICInJyBhbmQgZmlsZSBkb2VzIG5vdCBleGlzdCBhcmUgaW52YWxpZCBwYXRoIGl0ZW1zLlxuIgorICAgICAgICAgICAiQW55IHVybCAoJ3d3dy4uLicsICdodHRwLi4uJykgaXMgYWNjZXB0ZWQuXG4iCisgICAgICAgICAgICJUZXN0IEJyb3dzZSB3aXRoIGFuZCB3aXRob3V0IHBhdGgsIGFzIGNhbm5vdCB1bml0dGVzdC5cbiIKKyAgICAgICAgICAgIltPa10gb3IgPFJldHVybj4gcHJpbnRzIHZhbGlkIGVudHJ5IHRvIHNoZWxsXG4iCisgICAgICAgICAgICJbQ2FuY2VsXSBvciA8RXNjYXBlPiBwcmludHMgTm9uZSB0byBzaGVsbCIKKyAgICB9CisKIF9pb19iaW5kaW5nX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnSU9CaW5kaW5nJywKKyAgICAnZmlsZSc6ICdpb21lbnUnLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUZXN0IHRoZSBmb2xsb3dpbmcgYmluZGluZ3MuXG4iCiAgICAgICAgICAgICI8Q29udHJvbC1vPiB0byBvcGVuIGZpbGUgZnJvbSBkaWFsb2cuXG4iCkBAIC0yMDAsNyArMTkzLDcgQEAKICAgICB9CiAKIF9tdWx0aV9jYWxsX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnTXVsdGlDYWxsJywKKyAgICAnZmlsZSc6ICdtdWx0aWNhbGwnLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUaGUgZm9sbG93aW5nIGFjdGlvbnMgc2hvdWxkIHRyaWdnZXIgYSBwcmludCB0byBjb25zb2xlIG9yIElETEUiCiAgICAgICAgICAgICIgU2hlbGwuXG5FbnRlcmluZyBhbmQgbGVhdmluZyB0aGUgdGV4dCBhcmVhLCBrZXkgZW50cnksICIKQEAgLTIxMCwxNCArMjAzLDE0IEBACiAgICAgfQogCiBfbXVsdGlzdGF0dXNfYmFyX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnTXVsdGlTdGF0dXNCYXInLAorICAgICdmaWxlJzogJ3N0YXR1c2JhcicsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIkVuc3VyZSBwcmVzZW5jZSBvZiBtdWx0aS1zdGF0dXMgYmFyIGJlbG93IHRleHQgYXJlYS5cbiIKICAgICAgICAgICAgIkNsaWNrICdVcGRhdGUgU3RhdHVzJyB0byBjaGFuZ2UgdGhlIG11bHRpLXN0YXR1cyB0ZXh0IgogICAgIH0KIAogX29iamVjdF9icm93c2VyX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnT2JqZWN0QnJvd3NlcicsCisgICAgJ2ZpbGUnOiAnZGVidWdvYmonLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJEb3VibGUgY2xpY2sgb24gaXRlbXMgdXB0byB0aGUgbG93ZXN0IGxldmVsLlxuIgogICAgICAgICAgICAiQXR0cmlidXRlcyBvZiB0aGUgb2JqZWN0cyBhbmQgcmVsYXRlZCBpbmZvcm1hdGlvbiAiCkBAIC0yMjUsNyArMjE4LDcgQEAKICAgICB9CiAKIF9wYXRoX2Jyb3dzZXJfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdQYXRoQnJvd3NlcicsCisgICAgJ2ZpbGUnOiAncGF0aGJyb3dzZXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUZXN0IGZvciBjb3JyZWN0IGRpc3BsYXkgb2YgYWxsIHBhdGhzIGluIHN5cy5wYXRoLlxuIgogICAgICAgICAgICAiVG9nZ2xlIG5lc3RlZCBpdGVtcyB1cHRvIHRoZSBsb3dlc3QgbGV2ZWwuXG4iCkBAIC0yMzQsNyArMjI3LDcgQEAKICAgICB9CiAKIF9wZXJjb2xhdG9yX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnUGVyY29sYXRvcicsCisgICAgJ2ZpbGUnOiAncGVyY29sYXRvcicsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIlRoZXJlIGFyZSB0d28gdHJhY2VycyB3aGljaCBjYW4gYmUgdG9nZ2xlZCB1c2luZyBhIGNoZWNrYm94LlxuIgogICAgICAgICAgICAiVG9nZ2xpbmcgYSB0cmFjZXIgJ29uJyBieSBjaGVja2luZyBpdCBzaG91bGQgcHJpbnQgdHJhY2VyIgpAQCAtMjQ0LDggKzIzNywyMCBAQAogICAgICAgICAgICAiVGVzdCBmb3IgYWN0aW9ucyBsaWtlIHRleHQgZW50cnksIGFuZCByZW1vdmFsLiIKICAgICB9CiAKK1F1ZXJ5X3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAncXVlcnknLAorICAgICdrd2RzJzogeyd0aXRsZSc6ICdRdWVyeScsCisgICAgICAgICAgICAgJ21lc3NhZ2UnOiAnRW50ZXIgc29tZXRoaW5nJywKKyAgICAgICAgICAgICAndGV4dDAnOiAnR28nLAorICAgICAgICAgICAgICdfaHRlc3QnOiBUcnVlfSwKKyAgICAnbXNnJzogIkVudGVyIHdpdGggPFJldHVybj4gb3IgW09rXS4gIFByaW50IHZhbGlkIGVudHJ5IHRvIFNoZWxsXG4iCisgICAgICAgICAgICJCbGFuayBsaW5lLCBhZnRlciBzdHJpcHBpbmcsIGlzIGlnbm9yZWRcbiIKKyAgICAgICAgICAgIkNsb3NlIGRpYWxvZyB3aXRoIHZhbGlkIGVudHJ5LCA8RXNjYXBlPiwgW0NhbmNlbF0sIFtYXSIKKyAgICB9CisKKwogX3JlcGxhY2VfZGlhbG9nX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnUmVwbGFjZURpYWxvZycsCisgICAgJ2ZpbGUnOiAncmVwbGFjZScsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIkNsaWNrIHRoZSAnUmVwbGFjZScgYnV0dG9uLlxuIgogICAgICAgICAgICAiVGVzdCB2YXJpb3VzIHJlcGxhY2Ugb3B0aW9ucyBpbiB0aGUgJ1JlcGxhY2UgZGlhbG9nJy5cbiIKQEAgLTI1MywxNSArMjU4LDIyIEBACiAgICAgfQogCiBfc2VhcmNoX2RpYWxvZ19zcGVjID0gewotICAgICdmaWxlJzogJ1NlYXJjaERpYWxvZycsCisgICAgJ2ZpbGUnOiAnc2VhcmNoJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiQ2xpY2sgdGhlICdTZWFyY2gnIGJ1dHRvbi5cbiIKICAgICAgICAgICAgIlRlc3QgdmFyaW91cyBzZWFyY2ggb3B0aW9ucyBpbiB0aGUgJ1NlYXJjaCBkaWFsb2cnLlxuIgogICAgICAgICAgICAiQ2xpY2sgW0Nsb3NlXSBvciBbWF0gdG8gY2xvc2UgdGhlICdTZWFyY2ggRGlhbG9nJy4iCiAgICAgfQogCitfc2VhcmNoYmFzZV9zcGVjID0geworICAgICdmaWxlJzogJ3NlYXJjaGJhc2UnLAorICAgICdrd2RzJzoge30sCisgICAgJ21zZyc6ICJDaGVjayB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgYmFzZSBzZWFyY2ggZGlhbG9nXG4iCisgICAgICAgICAgICJJdHMgb25seSBhY3Rpb24gaXMgdG8gY2xvc2UuIgorICAgIH0KKwogX3Njcm9sbGVkX2xpc3Rfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdTY3JvbGxlZExpc3QnLAorICAgICdmaWxlJzogJ3Njcm9sbGVkbGlzdCcsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIllvdSBzaG91bGQgc2VlIGEgc2Nyb2xsYWJsZSBsaXN0IG9mIGl0ZW1zXG4iCiAgICAgICAgICAgICJTZWxlY3RpbmcgKGNsaWNraW5nKSBvciBkb3VibGUgY2xpY2tpbmcgYW4gaXRlbSAiCkBAIC0yNzcsNyArMjg5LDcgQEAKICAgICB9CiAKIF9zdGFja192aWV3ZXJfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdTdGFja1ZpZXdlcicsCisgICAgJ2ZpbGUnOiAnc3RhY2t2aWV3ZXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJBIHN0YWNrdHJhY2UgZm9yIGEgTmFtZUVycm9yIGV4Y2VwdGlvbi5cbiIKICAgICAgICAgICAgIkV4cGFuZCAnaWRsZWxpYiAuLi4nIGFuZCAnPGxvY2Fscz4nLlxuIgpAQCAtMjk1LDggKzMwNyw4IEBACiAgICAgfQogCiBUZXh0Vmlld2VyX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAndGV4dFZpZXcnLAotICAgICdrd2RzJzogeyd0aXRsZSc6ICdUZXN0IHRleHRWaWV3JywKKyAgICAnZmlsZSc6ICd0ZXh0dmlldycsCisgICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ1Rlc3QgdGV4dHZpZXcnLAogICAgICAgICAgICAgICd0ZXh0JzonVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy5cbicqMzUsCiAgICAgICAgICAgICAgJ19odGVzdCc6IFRydWV9LAogICAgICdtc2cnOiAiVGVzdCBmb3IgcmVhZC1vbmx5IHByb3BlcnR5IG9mIHRleHQuXG4iCkBAIC0zMDQsMjEgKzMxNiwyMSBAQAogICAgICB9CiAKIF90b29sdGlwX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnVG9vbFRpcCcsCisgICAgJ2ZpbGUnOiAndG9vbHRpcCcsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIlBsYWNlIG1vdXNlIGN1cnNvciBvdmVyIGJvdGggdGhlIGJ1dHRvbnNcbiIKICAgICAgICAgICAgIkEgdG9vbHRpcCBzaG91bGQgYXBwZWFyIHdpdGggc29tZSB0ZXh0LiIKICAgICB9CiAKIF90cmVlX3dpZGdldF9zcGVjID0gewotICAgICdmaWxlJzogJ1RyZWVXaWRnZXQnLAorICAgICdmaWxlJzogJ3RyZWUnLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUaGUgY2FudmFzIGlzIHNjcm9sbGFibGUuXG4iCiAgICAgICAgICAgICJDbGljayBvbiBmb2xkZXJzIHVwdG8gdG8gdGhlIGxvd2VzdCBsZXZlbC4iCiAgICAgfQogCiBfdW5kb19kZWxlZ2F0b3Jfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdVbmRvRGVsZWdhdG9yJywKKyAgICAnZmlsZSc6ICd1bmRvJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiQ2xpY2sgW1VuZG9dIHRvIHVuZG8gYW55IGFjdGlvbi5cbiIKICAgICAgICAgICAgIkNsaWNrIFtSZWRvXSB0byByZWRvIGFueSBhY3Rpb24uXG4iCkBAIC0zMjcsNyArMzM5LDcgQEAKICAgICB9CiAKIF93aWRnZXRfcmVkaXJlY3Rvcl9zcGVjID0gewotICAgICdmaWxlJzogJ1dpZGdldFJlZGlyZWN0b3InLAorICAgICdmaWxlJzogJ3JlZGlyZWN0b3InLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJFdmVyeSB0ZXh0IGluc2VydCBzaG91bGQgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZS4iCiAgICAgICAgICAgICJvciB0aGUgSURMRSBzaGVsbC4iCkBAIC0zMzcsMTQgKzM0OSwxMyBAQAogICAgIHJvb3QgPSB0ay5UaygpCiAgICAgcm9vdC50aXRsZSgnSURMRSBodGVzdCcpCiAgICAgcm9vdC5yZXNpemFibGUoMCwgMCkKLSAgICBfaW5pdGlhbGl6ZVRrVmFyaWFudFRlc3RzKHJvb3QpCiAKICAgICAjIGEgc2Nyb2xsYWJsZSBMYWJlbCBsaWtlIGNvbnN0YW50IHdpZHRoIHRleHQgd2lkZ2V0LgogICAgIGZyYW1lTGFiZWwgPSB0ay5GcmFtZShyb290LCBwYWR4PTEwKQogICAgIGZyYW1lTGFiZWwucGFjaygpCiAgICAgdGV4dCA9IHRrLlRleHQoZnJhbWVMYWJlbCwgd3JhcD0nd29yZCcpCiAgICAgdGV4dC5jb25maWd1cmUoYmc9cm9vdC5jZ2V0KCdiZycpLCByZWxpZWY9J2ZsYXQnLCBoZWlnaHQ9NCwgd2lkdGg9NzApCi0gICAgc2Nyb2xsYmFyID0gdGsuU2Nyb2xsYmFyKGZyYW1lTGFiZWwsIGNvbW1hbmQ9dGV4dC55dmlldykKKyAgICBzY3JvbGxiYXIgPSBTY3JvbGxiYXIoZnJhbWVMYWJlbCwgY29tbWFuZD10ZXh0Lnl2aWV3KQogICAgIHRleHQuY29uZmlnKHlzY3JvbGxjb21tYW5kPXNjcm9sbGJhci5zZXQpCiAgICAgc2Nyb2xsYmFyLnBhY2soc2lkZT0ncmlnaHQnLCBmaWxsPSd5JywgZXhwYW5kPUZhbHNlKQogICAgIHRleHQucGFjayhzaWRlPSdsZWZ0JywgZmlsbD0nYm90aCcsIGV4cGFuZD1UcnVlKQpAQCAtMzY1LDExICszNzYsMTEgQEAKICAgICAgICAgICAgICAgICB0ZXN0ID0gZ2V0YXR0cihtb2QsIHRlc3RfbmFtZSkKICAgICAgICAgICAgICAgICB0ZXN0X2xpc3QuYXBwZW5kKCh0ZXN0X3NwZWMsIHRlc3QpKQogCi0gICAgdGVzdF9uYW1lID0gdGsuU3RyaW5nVmFyKCcnKQorICAgIHRlc3RfbmFtZSA9IHRrLlN0cmluZ1Zhcihyb290KQogICAgIGNhbGxhYmxlX29iamVjdCA9IE5vbmUKICAgICB0ZXN0X2t3ZHMgPSBOb25lCiAKLSAgICBkZWYgbmV4dCgpOgorICAgIGRlZiBuZXh0X3Rlc3QoKToKIAogICAgICAgICBub25sb2NhbCB0ZXN0X25hbWUsIGNhbGxhYmxlX29iamVjdCwgdGVzdF9rd2RzCiAgICAgICAgIGlmIGxlbih0ZXN0X2xpc3QpID09IDE6CkBAIC0zODQsMjAgKzM5NSwyNiBAQAogICAgICAgICB0ZXh0Lmluc2VydCgiMS4wIix0ZXN0X3NwZWNbJ21zZyddKQogICAgICAgICB0ZXh0LmNvbmZpZ3VyZShzdGF0ZT0nZGlzYWJsZWQnKSAjIHByZXNlcnZlIHJlYWQtb25seSBwcm9wZXJ0eQogCi0gICAgZGVmIHJ1bl90ZXN0KCk6CisgICAgZGVmIHJ1bl90ZXN0KF89Tm9uZSk6CiAgICAgICAgIHdpZGdldCA9IGNhbGxhYmxlX29iamVjdCgqKnRlc3Rfa3dkcykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcHJpbnQod2lkZ2V0LnJlc3VsdCkKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgcGFzcwogCi0gICAgYnV0dG9uID0gdGsuQnV0dG9uKHJvb3QsIHRleHR2YXJpYWJsZT10ZXN0X25hbWUsIGNvbW1hbmQ9cnVuX3Rlc3QpCisgICAgZGVmIGNsb3NlKF89Tm9uZSk6CisgICAgICAgIHJvb3QuZGVzdHJveSgpCisKKyAgICBidXR0b24gPSB0ay5CdXR0b24ocm9vdCwgdGV4dHZhcmlhYmxlPXRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nYWN0aXZlJywgY29tbWFuZD1ydW5fdGVzdCkKKyAgICBuZXh0X2J1dHRvbiA9IHRrLkJ1dHRvbihyb290LCB0ZXh0PSJOZXh0IiwgY29tbWFuZD1uZXh0X3Rlc3QpCiAgICAgYnV0dG9uLnBhY2soKQotICAgIG5leHRfYnV0dG9uID0gdGsuQnV0dG9uKHJvb3QsIHRleHQ9Ik5leHQiLCBjb21tYW5kPW5leHQpCiAgICAgbmV4dF9idXR0b24ucGFjaygpCisgICAgbmV4dF9idXR0b24uZm9jdXNfc2V0KCkKKyAgICByb290LmJpbmQoJzxLZXktUmV0dXJuPicsIHJ1bl90ZXN0KQorICAgIHJvb3QuYmluZCgnPEtleS1Fc2NhcGU+JywgY2xvc2UpCiAKLSAgICBuZXh0KCkKLQorICAgIG5leHRfdGVzdCgpCiAgICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvbW9ja19pZGxlLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L21vY2tfaWRsZS5weQppbmRleCAxNjcyYTM0Li5jN2I0OWVmIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvbW9ja19pZGxlLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9tb2NrX2lkbGUucHkKQEAgLTMzLDcgKzMzLDcgQEAKIAogCiBjbGFzcyBFZGl0b3I6Ci0gICAgJycnTWluaW1hbGx5IGltaXRhdGUgRWRpdG9yV2luZG93LkVkaXRvcldpbmRvdyBjbGFzcy4KKyAgICAnJydNaW5pbWFsbHkgaW1pdGF0ZSBlZGl0b3IuRWRpdG9yV2luZG93IGNsYXNzLgogICAgICcnJwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdD1Ob25lLCBmaWxlbmFtZT1Ob25lLCBrZXk9Tm9uZSwgcm9vdD1Ob25lKToKICAgICAgICAgc2VsZi50ZXh0ID0gVGV4dCgpCkBAIC00Niw3ICs0Niw3IEBACiAKIAogY2xhc3MgVW5kb0RlbGVnYXRvcjoKLSAgICAnJydNaW5pbWFsbHkgaW1pdGF0ZSBVbmRvRGVsZWdhdG9yLFVuZG9EZWxlZ2F0b3IgY2xhc3MuCisgICAgJycnTWluaW1hbGx5IGltaXRhdGUgdW5kby5VbmRvRGVsZWdhdG9yIGNsYXNzLgogICAgICcnJwogICAgICMgQSByZWFsIHVuZG8gYmxvY2sgaXMgb25seSBuZWVkZWQgZm9yIHVzZXIgaW50ZXJhY3Rpb24uCiAgICAgZGVmIHVuZG9fYmxvY2tfc3RhcnQoKmFyZ3MpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2NvbXBsZXRlLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2NvbXBsZXRlLnB5CmluZGV4IDVmYzg5OWQuLmYzZjJkZWEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9jb21wbGV0ZS5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvY29tcGxldGUucHkKQEAgLTEsOSArMSwxMyBAQAorJycnIFRlc3QgYXV0b2NvbXBsZXRlIGFuZCBhdXRvY29tcGxlX3cKKworQ292ZXJhZ2Ugb2YgYXV0b2NvbXBsZTogNTYlCisnJycKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0CiAKLWltcG9ydCBpZGxlbGliLkF1dG9Db21wbGV0ZSBhcyBhYwotaW1wb3J0IGlkbGVsaWIuQXV0b0NvbXBsZXRlV2luZG93IGFzIGFjdworaW1wb3J0IGlkbGVsaWIuYXV0b2NvbXBsZXRlIGFzIGFjCitpbXBvcnQgaWRsZWxpYi5hdXRvY29tcGxldGVfdyBhcyBhY3cKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja19pZGxlIGltcG9ydCBGdW5jCiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IEV2ZW50CiAKQEAgLTkxLDYgKzk1LDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGF1dG9jb21wbGV0ZS5hdXRvY29tcGxldGVfZXZlbnQoZXYpKQogICAgICAgICBkZWwgZXYubWNfc3RhdGUKIAorICAgICAgICAjIFRlc3QgdGhhdCB0YWIgYWZ0ZXIgd2hpdGVzcGFjZSBpcyBpZ25vcmVkLgorICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCcxLjAnLCAnICAgICAgICAiIiJEb2NzdHJpbmcuXG4gICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0ZV9ldmVudChldikpCisgICAgICAgIHNlbGYudGV4dC5kZWxldGUoJzEuMCcsICdlbmQnKQorCiAgICAgICAgICMgSWYgYXV0b2NvbXBsZXRlIHdpbmRvdyBpcyBvcGVuLCBjb21wbGV0ZSgpIG1ldGhvZCBpcyBjYWxsZWQKICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnMS4wJywgJ3JlLicpCiAgICAgICAgICMgVGhpcyBtdXN0IGNhbGwgYXV0b2NvbXBsZXRlLl9tYWtlX2F1dG9jb21wbGV0ZV93aW5kb3coKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2V4cGFuZC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9leHBhbmQucHkKaW5kZXggZDJhMzE1Ni4uYWU4MTg2YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2V4cGFuZC5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvZXhwYW5kLnB5CkBAIC0xLDkgKzEsOSBAQAotIiIiVW5pdCB0ZXN0cyBmb3IgaWRsZWxpYi5BdXRvRXhwYW5kIiIiCisiIiJVbml0IHRlc3RzIGZvciBpZGxlbGliLmF1dG9leHBhbmQiIiIKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRleHQsIFRrCiAjZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBUZXh0Ci1mcm9tIGlkbGVsaWIuQXV0b0V4cGFuZCBpbXBvcnQgQXV0b0V4cGFuZAorZnJvbSBpZGxlbGliLmF1dG9leHBhbmQgaW1wb3J0IEF1dG9FeHBhbmQKIAogCiBjbGFzcyBEdW1teV9FZGl0d2luOgpAQCAtMjIsNiArMjIsNyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgY2xzLnRleHQgPSBUZXh0KCkKICAgICAgICAgY2xzLmF1dG9fZXhwYW5kID0gQXV0b0V4cGFuZChEdW1teV9FZGl0d2luKGNscy50ZXh0KSkKKyAgICAgICAgY2xzLmF1dG9fZXhwYW5kLmJlbGwgPSBsYW1iZGE6IE5vbmUKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CkBAIC0xMzcsNSArMTM4LDYgQEAKICAgICAgICAgbmV3X3N0YXRlID0gc2VsZi5hdXRvX2V4cGFuZC5zdGF0ZQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGluaXRpYWxfc3RhdGUsIG5ld19zdGF0ZSkKIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jYWxsdGlwcy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NhbGx0aXBzLnB5CmluZGV4IGIyYTczM2MuLjBiMTE2MDIgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NhbGx0aXBzLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NhbGx0aXBzLnB5CkBAIC0xLDUgKzEsNSBAQAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgaWRsZWxpYi5DYWxsVGlwcyBhcyBjdAoraW1wb3J0IGlkbGVsaWIuY2FsbHRpcHMgYXMgY3QKIGltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHR5cGVzCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbG9yaXplci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbG9yaXplci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhiYzNlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29sb3JpemVyLnB5CkBAIC0wLDAgKzEsNTYgQEAKKycnJ1Rlc3QgaWRsZWxpYi9jb2xvcml6ZXIucHkKKworUGVyZm9ybSBtaW5pbWFsIHNhbml0eSBjaGVja3MgdGhhdCBtb2R1bGUgaW1wb3J0cyBhbmQgc29tZSB0aGluZ3MgcnVuLgorCitDb3ZlcmFnZSAyMiUuCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgY29sb3JpemVyICAjIGFsd2F5cyB0ZXN0IGltcG9ydAorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCitmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0CitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBGdW5jdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYW55KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sb3JpemVyLmFueSgndGVzdCcsICgnYScsICdiJykpKQorCisgICAgZGVmIHRlc3RfbWFrZV9wYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2xvcml6ZXIubWFrZV9wYXQoKSkKKworCitjbGFzcyBDb2xvckNvbmZpZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy5yb290ID0gVGsoKQorICAgICAgICBjbHMudGV4dCA9IFRleHQoY2xzLnJvb3QpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBkZWwgY2xzLnRleHQKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIHRlc3RfY29sb3JpemVyKHNlbGYpOgorICAgICAgICBjb2xvcml6ZXIuY29sb3JfY29uZmlnKHNlbGYudGV4dCkKKworY2xhc3MgQ29sb3JEZWxlZ2F0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IFRrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworICAgIGRlZiB0ZXN0X2NvbG9yaXplcihzZWxmKToKKyAgICAgICAgY29sb3JpemVyLkNvbG9yRGVsZWdhdG9yKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWcucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmYTFhMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZy5weQpAQCAtMCwwICsxLDE2MCBAQAorJycnVGVzdCBpZGxlbGliLmNvbmZpZy4KKworTXVjaCBpcyB0ZXN0ZWQgYnkgb3BlbmluZyBjb25maWcgZGlhbG9nIGxpdmUgb3IgaW4gdGVzdF9jb25maWdkaWFsb2cuCitDb3ZlcmFnZTogMjclCisnJycKK2Zyb20gc3lzIGltcG9ydCBtb2R1bGVzCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3RkZXJyCitmcm9tIHRraW50ZXIgaW1wb3J0IFRrCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gaWRsZWxpYiBpbXBvcnQgY29uZmlnCisKKyMgVGVzdHMgc2hvdWxkIG5vdCBkZXBlbmQgb24gZm9ydHVpdG91cyB1c2VyIGNvbmZpZ3VyYXRpb25zLgorIyBUaGV5IG11c3Qgbm90IGFmZmVjdCBhY3R1YWwgdXNlciAuY2ZnIGZpbGVzLgorIyBSZXBsYWNlIHVzZXIgcGFyc2VycyB3aXRoIGVtcHR5IHBhcnNlcnMgdGhhdCBjYW5ub3QgYmUgc2F2ZWQuCisKK2lkbGVDb25mID0gY29uZmlnLmlkbGVDb25mCit1c2VyY2ZnID0gaWRsZUNvbmYudXNlckNmZwordGVzdGNmZyA9IHt9Cit1c2VybWFpbiA9IHRlc3RjZmdbJ21haW4nXSA9IGNvbmZpZy5JZGxlVXNlckNvbmZQYXJzZXIoJycpICAjIGZpbGVuYW1lCit1c2VyaGlnaCA9IHRlc3RjZmdbJ2hpZ2hsaWdodCddID0gY29uZmlnLklkbGVVc2VyQ29uZlBhcnNlcignJykKK3VzZXJrZXlzID0gdGVzdGNmZ1sna2V5cyddID0gY29uZmlnLklkbGVVc2VyQ29uZlBhcnNlcignJykKKworZGVmIHNldFVwTW9kdWxlKCk6CisgICAgaWRsZUNvbmYudXNlckNmZyA9IHRlc3RjZmcKKworZGVmIHRlYXJEb3duTW9kdWxlKCk6CisgICAgaWRsZUNvbmYudXNlckNmZyA9IHVzZXJjZmcKKworCitjbGFzcyBDdXJyZW50Q29sb3JLZXlzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiIFRlc3QgY29sb3JrZXlzIGZ1bmN0aW9uIHdpdGggdXNlciBjb25maWcgW1RoZW1lXSBhbmQgW0tleXNdIHBhdHRlcm5zLgorCisgICAgICAgIGNvbG9ya2V5cyA9IGNvbmZpZy5JZGxlQ29uZi5jdXJyZW50X2NvbG9yc19hbmRfa2V5cworICAgICAgICBUZXN0IGFsbCBwYXR0ZXJucyB3cml0dGVuIGJ5IElETEUgYW5kIHNvbWUgZXJyb3JzCisgICAgICAgIEl0ZW0gJ2RlZmF1bHQnIHNob3VsZCByZWFsbHkgYmUgJ2J1aWx0aW4nICh2ZXJzdXMgJ2N1c3RvbSkuCisgICAgIiIiCisgICAgY29sb3JrZXlzID0gaWRsZUNvbmYuY3VycmVudF9jb2xvcnNfYW5kX2tleXMKKyAgICBkZWZhdWx0X3RoZW1lID0gJ0lETEUgQ2xhc3NpYycKKyAgICBkZWZhdWx0X2tleXMgPSBpZGxlQ29uZi5kZWZhdWx0X2tleXMoKQorCisgICAgZGVmIHRlc3Rfb2xkX2J1aWx0aW5fdGhlbWUoc2VsZik6CisgICAgICAgICMgT24gaW5pdGlhbCBpbnN0YWxsYXRpb24sIHVzZXIgbWFpbiBpcyBibGFuay4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnVGhlbWUnKSwgc2VsZi5kZWZhdWx0X3RoZW1lKQorICAgICAgICAjIEZvciBvbGQgZGVmYXVsdCwgbmFtZTIgbXVzdCBiZSBibGFuay4KKyAgICAgICAgdXNlcm1haW4ucmVhZF9zdHJpbmcoJycnCisgICAgICAgICAgICBbVGhlbWVdCisgICAgICAgICAgICBkZWZhdWx0ID0gVHJ1ZQorICAgICAgICAgICAgJycnKQorICAgICAgICAjIElETEUgb21pdHMgJ25hbWUnIGZvciBkZWZhdWx0IG9sZCBidWlsdGluIHRoZW1lLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdUaGVtZScpLCBzZWxmLmRlZmF1bHRfdGhlbWUpCisgICAgICAgICMgSURMRSBhZGRzICduYW1lJyBmb3Igbm9uLWRlZmF1bHQgb2xkIGJ1aWx0aW4gdGhlbWUuCisgICAgICAgIHVzZXJtYWluWydUaGVtZSddWyduYW1lJ10gPSAnSURMRSBOZXcnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ1RoZW1lJyksICdJRExFIE5ldycpCisgICAgICAgICMgRXJyb25lb3VzIG5vbi1kZWZhdWx0IG9sZCBidWlsdGluIHJldmVydHMgdG8gZGVmYXVsdC4KKyAgICAgICAgdXNlcm1haW5bJ1RoZW1lJ11bJ25hbWUnXSA9ICdub24tZXhpc3RlbnQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ1RoZW1lJyksIHNlbGYuZGVmYXVsdF90aGVtZSkKKyAgICAgICAgdXNlcm1haW4ucmVtb3ZlX3NlY3Rpb24oJ1RoZW1lJykKKworICAgIGRlZiB0ZXN0X25ld19idWlsdGluX3RoZW1lKHNlbGYpOgorICAgICAgICAjIElETEUgd3JpdGVzIG5hbWUyIGZvciBuZXcgYnVpbHRpbnMuCisgICAgICAgIHVzZXJtYWluLnJlYWRfc3RyaW5nKCcnJworICAgICAgICAgICAgW1RoZW1lXQorICAgICAgICAgICAgZGVmYXVsdCA9IFRydWUKKyAgICAgICAgICAgIG5hbWUyID0gSURMRSBEYXJrCisgICAgICAgICAgICAnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ1RoZW1lJyksICdJRExFIERhcmsnKQorICAgICAgICAjIExlZnRvdmVyICduYW1lJywgbm90IHJlbW92ZWQsIGlzIGlnbm9yZWQuCisgICAgICAgIHVzZXJtYWluWydUaGVtZSddWyduYW1lJ10gPSAnSURMRSBOZXcnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ1RoZW1lJyksICdJRExFIERhcmsnKQorICAgICAgICAjIEVycm9uZW91cyBub24tZGVmYXVsdCBuZXcgYnVpbHRpbiByZXZlcnRzIHRvIGRlZmF1bHQuCisgICAgICAgIHVzZXJtYWluWydUaGVtZSddWyduYW1lMiddID0gJ25vbi1leGlzdGVudCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnVGhlbWUnKSwgc2VsZi5kZWZhdWx0X3RoZW1lKQorICAgICAgICB1c2VybWFpbi5yZW1vdmVfc2VjdGlvbignVGhlbWUnKQorCisgICAgZGVmIHRlc3RfdXNlcl9vdmVycmlkZV90aGVtZShzZWxmKToKKyAgICAgICAgIyBFcnJvbmVvdXMgY3VzdG9tIG5hbWUgKG5vIGRlZmluaXRpb24pIHJldmVydHMgdG8gZGVmYXVsdC4KKyAgICAgICAgdXNlcm1haW4ucmVhZF9zdHJpbmcoJycnCisgICAgICAgICAgICBbVGhlbWVdCisgICAgICAgICAgICBkZWZhdWx0ID0gRmFsc2UKKyAgICAgICAgICAgIG5hbWUgPSBDdXN0b20gRGFyaworICAgICAgICAgICAgJycnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdUaGVtZScpLCBzZWxmLmRlZmF1bHRfdGhlbWUpCisgICAgICAgICMgQ3VzdG9tIG5hbWUgaXMgdmFsaWQgd2l0aCBtYXRjaGluZyBTZWN0aW9uIG5hbWUuCisgICAgICAgIHVzZXJoaWdoLnJlYWRfc3RyaW5nKCdbQ3VzdG9tIERhcmtdXG5hPWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdUaGVtZScpLCAnQ3VzdG9tIERhcmsnKQorICAgICAgICAjIE5hbWUyIGlzIGlnbm9yZWQuCisgICAgICAgIHVzZXJtYWluWydUaGVtZSddWyduYW1lMiddID0gJ25vbi1leGlzdGVudCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnVGhlbWUnKSwgJ0N1c3RvbSBEYXJrJykKKyAgICAgICAgdXNlcm1haW4ucmVtb3ZlX3NlY3Rpb24oJ1RoZW1lJykKKyAgICAgICAgdXNlcmhpZ2gucmVtb3ZlX3NlY3Rpb24oJ0N1c3RvbSBEYXJrJykKKworICAgIGRlZiB0ZXN0X29sZF9idWlsdGluX2tleXMoc2VsZik6CisgICAgICAgICMgT24gaW5pdGlhbCBpbnN0YWxsYXRpb24sIHVzZXIgbWFpbiBpcyBibGFuay4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnS2V5cycpLCBzZWxmLmRlZmF1bHRfa2V5cykKKyAgICAgICAgIyBGb3Igb2xkIGRlZmF1bHQsIG5hbWUyIG11c3QgYmUgYmxhbmssIG5hbWUgaXMgYWx3YXlzIHVzZWQuCisgICAgICAgIHVzZXJtYWluLnJlYWRfc3RyaW5nKCcnJworICAgICAgICAgICAgW0tleXNdCisgICAgICAgICAgICBkZWZhdWx0ID0gVHJ1ZQorICAgICAgICAgICAgbmFtZSA9IElETEUgQ2xhc3NpYyBVbml4CisgICAgICAgICAgICAnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ0tleXMnKSwgJ0lETEUgQ2xhc3NpYyBVbml4JykKKyAgICAgICAgIyBFcnJvbmVvdXMgbm9uLWRlZmF1bHQgb2xkIGJ1aWx0aW4gcmV2ZXJ0cyB0byBkZWZhdWx0LgorICAgICAgICB1c2VybWFpblsnS2V5cyddWyduYW1lJ10gPSAnbm9uLWV4aXN0ZW50JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdLZXlzJyksIHNlbGYuZGVmYXVsdF9rZXlzKQorICAgICAgICB1c2VybWFpbi5yZW1vdmVfc2VjdGlvbignS2V5cycpCisKKyAgICBkZWYgdGVzdF9uZXdfYnVpbHRpbl9rZXlzKHNlbGYpOgorICAgICAgICAjIElETEUgd3JpdGVzIG5hbWUyIGZvciBuZXcgYnVpbHRpbnMuCisgICAgICAgIHVzZXJtYWluLnJlYWRfc3RyaW5nKCcnJworICAgICAgICAgICAgW0tleXNdCisgICAgICAgICAgICBkZWZhdWx0ID0gVHJ1ZQorICAgICAgICAgICAgbmFtZTIgPSBJRExFIE1vZGVybiBVbml4CisgICAgICAgICAgICAnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ0tleXMnKSwgJ0lETEUgTW9kZXJuIFVuaXgnKQorICAgICAgICAjIExlZnRvdmVyICduYW1lJywgbm90IHJlbW92ZWQsIGlzIGlnbm9yZWQuCisgICAgICAgIHVzZXJtYWluWydLZXlzJ11bJ25hbWUnXSA9ICdJRExFIENsYXNzaWMgVW5peCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnS2V5cycpLCAnSURMRSBNb2Rlcm4gVW5peCcpCisgICAgICAgICMgRXJyb25lb3VzIG5vbi1kZWZhdWx0IG5ldyBidWlsdGluIHJldmVydHMgdG8gZGVmYXVsdC4KKyAgICAgICAgdXNlcm1haW5bJ0tleXMnXVsnbmFtZTInXSA9ICdub24tZXhpc3RlbnQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ0tleXMnKSwgc2VsZi5kZWZhdWx0X2tleXMpCisgICAgICAgIHVzZXJtYWluLnJlbW92ZV9zZWN0aW9uKCdLZXlzJykKKworICAgIGRlZiB0ZXN0X3VzZXJfb3ZlcnJpZGVfa2V5cyhzZWxmKToKKyAgICAgICAgIyBFcnJvbmVvdXMgY3VzdG9tIG5hbWUgKG5vIGRlZmluaXRpb24pIHJldmVydHMgdG8gZGVmYXVsdC4KKyAgICAgICAgdXNlcm1haW4ucmVhZF9zdHJpbmcoJycnCisgICAgICAgICAgICBbS2V5c10KKyAgICAgICAgICAgIGRlZmF1bHQgPSBGYWxzZQorICAgICAgICAgICAgbmFtZSA9IEN1c3RvbSBLZXlzCisgICAgICAgICAgICAnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ0tleXMnKSwgc2VsZi5kZWZhdWx0X2tleXMpCisgICAgICAgICMgQ3VzdG9tIG5hbWUgaXMgdmFsaWQgd2l0aCBtYXRjaGluZyBTZWN0aW9uIG5hbWUuCisgICAgICAgIHVzZXJrZXlzLnJlYWRfc3RyaW5nKCdbQ3VzdG9tIEtleXNdXG5hPWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdLZXlzJyksICdDdXN0b20gS2V5cycpCisgICAgICAgICMgTmFtZTIgaXMgaWdub3JlZC4KKyAgICAgICAgdXNlcm1haW5bJ0tleXMnXVsnbmFtZTInXSA9ICdub24tZXhpc3RlbnQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ0tleXMnKSwgJ0N1c3RvbSBLZXlzJykKKyAgICAgICAgdXNlcm1haW4ucmVtb3ZlX3NlY3Rpb24oJ0tleXMnKQorICAgICAgICB1c2Vya2V5cy5yZW1vdmVfc2VjdGlvbignQ3VzdG9tIEtleXMnKQorCisKK2NsYXNzIFdhcm5pbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3dhcm4oc2VsZik6CisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBjb25maWcuX3dhcm5lZCA9IHNldCgpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3RkZXJyKCkgYXMgc3RkZXJyOgorICAgICAgICAgICAgY29uZmlnLl93YXJuKCd3YXJuaW5nJywgJ2tleScpCisgICAgICAgIEVxdWFsKGNvbmZpZy5fd2FybmVkLCB7KCd3YXJuaW5nJywna2V5Jyl9KQorICAgICAgICBFcXVhbChzdGRlcnIuZ2V0dmFsdWUoKSwgJ3dhcm5pbmcnKydcbicpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3RkZXJyKCkgYXMgc3RkZXJyOgorICAgICAgICAgICAgY29uZmlnLl93YXJuKCd3YXJuaW5nJywgJ2tleScpCisgICAgICAgIEVxdWFsKHN0ZGVyci5nZXR2YWx1ZSgpLCAnJykKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRlcnIoKSBhcyBzdGRlcnI6CisgICAgICAgICAgICBjb25maWcuX3dhcm4oJ3dhcm4yJywgJ3llaycpCisgICAgICAgIEVxdWFsKGNvbmZpZy5fd2FybmVkLCB7KCd3YXJuaW5nJywna2V5JyksICgnd2FybjInLCd5ZWsnKX0pCisgICAgICAgIEVxdWFsKHN0ZGVyci5nZXR2YWx1ZSgpLCAnd2FybjInKydcbicpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2hlbHAucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdfaGVscC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0ZjhlZC4uMDAwMDAwMAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdfaGVscC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0iIiJVbml0dGVzdHMgZm9yIGlkbGVsaWIuY29uZmlnSGVscFNvdXJjZUVkaXQiIiIKLWltcG9ydCB1bml0dGVzdAotZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBWYXIsIE1ib3gsIEVudHJ5Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ0hlbHBTb3VyY2VFZGl0IGFzIGhlbHBfZGlhbG9nX21vZHVsZQotCi1oZWxwX2RpYWxvZyA9IGhlbHBfZGlhbG9nX21vZHVsZS5HZXRIZWxwU291cmNlRGlhbG9nCi0KLQotY2xhc3MgRHVtbXlfaGVscF9kaWFsb2c6Ci0gICAgIyBNb2NrIGZvciB0ZXN0aW5nIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvZiBoZWxwX2RpYWxvZwotICAgIG1lbnVfb2sgPSBoZWxwX2RpYWxvZy5tZW51X29rCi0gICAgcGF0aF9vayA9IGhlbHBfZGlhbG9nLnBhdGhfb2sKLSAgICBvayA9IGhlbHBfZGlhbG9nLm9rCi0gICAgY2FuY2VsID0gaGVscF9kaWFsb2cuY2FuY2VsCi0gICAgIyBBdHRyaWJ1dGVzLCBjb25zdGFudCBvciB2YXJpYWJsZSwgbmVlZGVkIGZvciB0ZXN0cwotICAgIG1lbnUgPSBWYXIoKQotICAgIGVudHJ5TWVudSA9IEVudHJ5KCkKLSAgICBwYXRoID0gVmFyKCkKLSAgICBlbnRyeVBhdGggPSBFbnRyeSgpCi0gICAgcmVzdWx0ID0gTm9uZQotICAgIGRlc3Ryb3llZCA9IEZhbHNlCi0KLSAgICBkZWYgZGVzdHJveShzZWxmKToKLSAgICAgICAgc2VsZi5kZXN0cm95ZWQgPSBUcnVlCi0KLQotIyBtZW51X29rIGFuZCBwYXRoX29rIGNhbGwgTWJveC5zaG93ZXJyb3IgaWYgbWVudSBhbmQgcGF0aCBhcmUgbm90IG9rLgotb3JpZ19tYm94ID0gaGVscF9kaWFsb2dfbW9kdWxlLnRrTWVzc2FnZUJveAotc2hvd2Vycm9yID0gTWJveC5zaG93ZXJyb3IKLQotCi1jbGFzcyBDb25maWdIZWxwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGlhbG9nID0gRHVtbXlfaGVscF9kaWFsb2coKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKLSAgICAgICAgaGVscF9kaWFsb2dfbW9kdWxlLnRrTWVzc2FnZUJveCA9IE1ib3gKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6Ci0gICAgICAgIGhlbHBfZGlhbG9nX21vZHVsZS50a01lc3NhZ2VCb3ggPSBvcmlnX21ib3gKLQotICAgIGRlZiB0ZXN0X2JsYW5rX21lbnUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm1lbnUuc2V0KCcnKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGlhbG9nLm1lbnVfb2soKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdNZW51IEl0ZW0gRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdObycsIHNob3dlcnJvci5tZXNzYWdlKQotCi0gICAgZGVmIHRlc3RfbG9uZ19tZW51KHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5tZW51LnNldCgnaGVsbG8nICogMTApCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5kaWFsb2cubWVudV9vaygpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ01lbnUgSXRlbSBFcnJvcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2xvbmcnLCBzaG93ZXJyb3IubWVzc2FnZSkKLQotICAgIGRlZiB0ZXN0X2dvb2RfbWVudShzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cubWVudS5zZXQoJ2hlbHAnKQotICAgICAgICBzaG93ZXJyb3IudGl0bGUgPSAnTm8gRXJyb3InICAjIHNob3VsZCBub3QgYmUgY2FsbGVkCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmRpYWxvZy5tZW51X29rKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnTm8gRXJyb3InKQotCi0gICAgZGVmIHRlc3RfYmxhbmtfcGF0aChzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cucGF0aC5zZXQoJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5kaWFsb2cucGF0aF9vaygpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ0ZpbGUgUGF0aCBFcnJvcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ05vJywgc2hvd2Vycm9yLm1lc3NhZ2UpCi0KLSAgICBkZWYgdGVzdF9pbnZhbGlkX2ZpbGVfcGF0aChzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cucGF0aC5zZXQoJ2Zvb2JhcicgKiAxMDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5kaWFsb2cucGF0aF9vaygpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ0ZpbGUgUGF0aCBFcnJvcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ25vdCBleGlzdCcsIHNob3dlcnJvci5tZXNzYWdlKQotCi0gICAgZGVmIHRlc3RfaW52YWxpZF91cmxfcGF0aChzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cucGF0aC5zZXQoJ3d3LmZvb2Jhci5jb20nKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGlhbG9nLnBhdGhfb2soKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdGaWxlIFBhdGggRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdub3QgZXhpc3QnLCBzaG93ZXJyb3IubWVzc2FnZSkKLQotICAgICAgICBzZWxmLmRpYWxvZy5wYXRoLnNldCgnaHR0LmZvb2Jhci5jb20nKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGlhbG9nLnBhdGhfb2soKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdGaWxlIFBhdGggRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdub3QgZXhpc3QnLCBzaG93ZXJyb3IubWVzc2FnZSkKLQotICAgIGRlZiB0ZXN0X2dvb2RfcGF0aChzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cucGF0aC5zZXQoJ2h0dHBzOi8vZG9jcy5weXRob24ub3JnJykKLSAgICAgICAgc2hvd2Vycm9yLnRpdGxlID0gJ05vIEVycm9yJyAgIyBzaG91bGQgbm90IGJlIGNhbGxlZAotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cucGF0aF9vaygpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05vIEVycm9yJykKLQotICAgIGRlZiB0ZXN0X29rKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5kZXN0cm95ZWQgPSBGYWxzZQotICAgICAgICBzZWxmLmRpYWxvZy5tZW51LnNldCgnaGVscCcpCi0gICAgICAgIHNlbGYuZGlhbG9nLnBhdGguc2V0KCdodHRwczovL2RvY3MucHl0aG9uLm9yZycpCi0gICAgICAgIHNlbGYuZGlhbG9nLm9rKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5yZXN1bHQsICgnaGVscCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHBzOi8vZG9jcy5weXRob24ub3JnJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmRpYWxvZy5kZXN0cm95ZWQpCi0KLSAgICBkZWYgdGVzdF9jYW5jZWwoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLmRlc3Ryb3llZCA9IEZhbHNlCi0gICAgICAgIHNlbGYuZGlhbG9nLmNhbmNlbCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cucmVzdWx0LCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cuZGVzdHJveWVkKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdfa2V5LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2tleS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTNmMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2tleS5weQpAQCAtMCwwICsxLDMzIEBACisnJycgVGVzdCBpZGxlbGliLmNvbmZpZ19rZXkuCisKK0NvdmVyYWdlOiA1NiUgZnJvbSBjcmVhdGluZyBhbmQgY2xvc2luZyBkaWFsb2cuCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgY29uZmlnX2tleQorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCityZXF1aXJlcygnZ3VpJykKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dAorCisKK2NsYXNzIEdldEtleXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290ID0gVGsoKQorICAgICAgICBjbHMucm9vdC53aXRoZHJhdygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdC51cGRhdGUoKSAgIyBTdG9wICJjYW4ndCBydW4gZXZlbnQgY29tbWFuZCIgd2FybmluZy4KKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICBkaWEgPSBjb25maWdfa2V5LkdldEtleXNEaWFsb2coCisgICAgICAgICAgICBzZWxmLnJvb3QsICd0ZXN0JywgJzw8VGVzdD4+JywgWyc8S2V5LUYxMj4nXSwgX3V0ZXN0PVRydWUpCisgICAgICAgIGRpYS5DYW5jZWwoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ19uYW1lLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX25hbWUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTcyYjkuLjAwMDAwMDAKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX25hbWUucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0iIiJVbml0IHRlc3RzIGZvciBpZGxlbGliLmNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nIiIiCi1pbXBvcnQgdW5pdHRlc3QKLWZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyLCBNYm94Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nIGFzIG5hbWVfZGlhbG9nX21vZHVsZQotCi1uYW1lX2RpYWxvZyA9IG5hbWVfZGlhbG9nX21vZHVsZS5HZXRDZmdTZWN0aW9uTmFtZURpYWxvZwotCi1jbGFzcyBEdW1teV9uYW1lX2RpYWxvZzoKLSAgICAjIE1vY2sgZm9yIHRlc3RpbmcgdGhlIGZvbGxvd2luZyBtZXRob2RzIG9mIG5hbWVfZGlhbG9nCi0gICAgbmFtZV9vayA9IG5hbWVfZGlhbG9nLm5hbWVfb2sKLSAgICBPayA9IG5hbWVfZGlhbG9nLk9rCi0gICAgQ2FuY2VsID0gbmFtZV9kaWFsb2cuQ2FuY2VsCi0gICAgIyBBdHRyaWJ1dGVzLCBjb25zdGFudCBvciB2YXJpYWJsZSwgbmVlZGVkIGZvciB0ZXN0cwotICAgIHVzZWRfbmFtZXMgPSBbJ3VzZWQnXQotICAgIG5hbWUgPSBWYXIoKQotICAgIHJlc3VsdCA9IE5vbmUKLSAgICBkZXN0cm95ZWQgPSBGYWxzZQotICAgIGRlZiBkZXN0cm95KHNlbGYpOgotICAgICAgICBzZWxmLmRlc3Ryb3llZCA9IFRydWUKLQotIyBuYW1lX29rIGNhbGxzIE1ib3guc2hvd2Vycm9yIGlmIG5hbWUgaXMgbm90IG9rCi1vcmlnX21ib3ggPSBuYW1lX2RpYWxvZ19tb2R1bGUudGtNZXNzYWdlQm94Ci1zaG93ZXJyb3IgPSBNYm94LnNob3dlcnJvcgotCi1jbGFzcyBDb25maWdOYW1lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGlhbG9nID0gRHVtbXlfbmFtZV9kaWFsb2coKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKLSAgICAgICAgbmFtZV9kaWFsb2dfbW9kdWxlLnRrTWVzc2FnZUJveCA9IE1ib3gKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6Ci0gICAgICAgIG5hbWVfZGlhbG9nX21vZHVsZS50a01lc3NhZ2VCb3ggPSBvcmlnX21ib3gKLQotICAgIGRlZiB0ZXN0X2JsYW5rX25hbWUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCcgJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5uYW1lX29rKCksICcnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05hbWUgRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdObycsIHNob3dlcnJvci5tZXNzYWdlKQotCi0gICAgZGVmIHRlc3RfdXNlZF9uYW1lKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5uYW1lLnNldCgndXNlZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cubmFtZV9vaygpLCAnJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdOYW1lIEVycm9yJykKLSAgICAgICAgc2VsZi5hc3NlcnRJbigndXNlJywgc2hvd2Vycm9yLm1lc3NhZ2UpCi0KLSAgICBkZWYgdGVzdF9sb25nX25hbWUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCdnb29kJyo4KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlhbG9nLm5hbWVfb2soKSwgJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnTmFtZSBFcnJvcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3RvbyBsb25nJywgc2hvd2Vycm9yLm1lc3NhZ2UpCi0KLSAgICBkZWYgdGVzdF9nb29kX25hbWUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCcgIGdvb2QgJykKLSAgICAgICAgc2hvd2Vycm9yLnRpdGxlID0gJ05vIEVycm9yJyAgIyBzaG91bGQgbm90IGJlIGNhbGxlZAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlhbG9nLm5hbWVfb2soKSwgJ2dvb2QnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05vIEVycm9yJykKLQotICAgIGRlZiB0ZXN0X29rKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5kZXN0cm95ZWQgPSBGYWxzZQotICAgICAgICBzZWxmLmRpYWxvZy5uYW1lLnNldCgnZ29vZCcpCi0gICAgICAgIHNlbGYuZGlhbG9nLk9rKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5yZXN1bHQsICdnb29kJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZGlhbG9nLmRlc3Ryb3llZCkKLQotICAgIGRlZiB0ZXN0X2NhbmNlbChzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cuZGVzdHJveWVkID0gRmFsc2UKLSAgICAgICAgc2VsZi5kaWFsb2cuQ2FuY2VsKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5yZXN1bHQsICcnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cuZGVzdHJveWVkKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ2RpYWxvZy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ2RpYWxvZy5weQppbmRleCA1YzA5NzkwLi43MGJkMTRlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdkaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnZGlhbG9nLnB5CkBAIC0xLDE0ICsxLDEzIEBACi0nJydUZXN0IGlkbGVsaWIuY29uZmlnRGlhbG9nLgorJycnVGVzdCBpZGxlbGliLmNvbmZpZ2RpYWxvZy4KIAogQ292ZXJhZ2U6IDQ2JSBqdXN0IGJ5IGNyZWF0aW5nIGRpYWxvZy4KIFRoZSBvdGhlciBoYWxmIGlzIGNvZGUgZm9yIHdvcmtpbmcgd2l0aCB1c2VyIGN1c3RvbWl6YXRpb25zLgogJycnCi1mcm9tIGlkbGVsaWIuY29uZmlnRGlhbG9nIGltcG9ydCBDb25maWdEaWFsb2cgICMgYWx3YXlzIHRlc3QgaW1wb3J0Citmcm9tIGlkbGVsaWIuY29uZmlnZGlhbG9nIGltcG9ydCBDb25maWdEaWFsb2cgICMgYWx3YXlzIHRlc3QgaW1wb3J0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIHJlcXVpcmVzKCdndWknKQogZnJvbSB0a2ludGVyIGltcG9ydCBUawogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQgYXMgbWFjb3N4CiAKIGNsYXNzIENvbmZpZ0RpYWxvZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC0xNiw3ICsxNSw2IEBACiAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICAgY2xzLnJvb3QgPSBUaygpCiAgICAgICAgIGNscy5yb290LndpdGhkcmF3KCkKLSAgICAgICAgbWFjb3N4Ll9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMoY2xzLnJvb3QpCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgpAQCAtMjQsNyArMjIsNyBAQAogICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKICAgICAgICAgZGVsIGNscy5yb290CiAKLSAgICBkZWYgdGVzdF9kaWFsb2coc2VsZik6CisgICAgZGVmIHRlc3RfY29uZmlnZGlhbG9nKHNlbGYpOgogICAgICAgICBkID0gQ29uZmlnRGlhbG9nKHNlbGYucm9vdCwgJ1Rlc3QnLCBfdXRlc3Q9VHJ1ZSkKICAgICAgICAgZC5yZW1vdmVfdmFyX2NhbGxiYWNrcygpCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlYnVnZ2VyLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZGVidWdnZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiYTlhNAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlYnVnZ2VyLnB5CkBAIC0wLDAgKzEsMjkgQEAKKycnJyBUZXN0IGlkbGVsaWIuZGVidWdnZXIuCisKK0NvdmVyYWdlOiAxOSUKKycnJworZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z2dlcgorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCityZXF1aXJlcygnZ3VpJykKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0a2ludGVyIGltcG9ydCBUaworCisKK2NsYXNzIE5hbWVTcGFjZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QgPSBUaygpCisgICAgICAgIGNscy5yb290LndpdGhkcmF3KCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgIGRlYnVnZ2VyLk5hbWVzcGFjZVZpZXdlcihzZWxmLnJvb3QsICdUZXN0JykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9kZWxlZ2F0b3IucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9kZWxlZ2F0b3IucHkKaW5kZXggMWYwYmFhOS4uODU2MjRmYiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZGVsZWdhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlbGVnYXRvci5weQpAQCAtMSw1ICsxLDUgQEAKIGltcG9ydCB1bml0dGVzdAotZnJvbSBpZGxlbGliLkRlbGVnYXRvciBpbXBvcnQgRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIuZGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKIAogY2xhc3MgRGVsZWdhdG9yVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRtZW51LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG1lbnUucHkKaW5kZXggYTI1OGUyOS4uMTdlYjI1YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG1lbnUucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG1lbnUucHkKQEAgLTUsOCArNSw5IEBACiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIHJlcXVpcmVzKCdndWknKQogaW1wb3J0IHRraW50ZXIgYXMgdGsKK2Zyb20gdGtpbnRlciBpbXBvcnQgdHRrCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbAorZnJvbSBpZGxlbGliIGltcG9ydCBweXNoZWxsCiAKIGNsYXNzIFBhc3RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgJycnVGVzdCBwYXN0aW5nIGludG8gd2lkZ2V0cyB0aGF0IGFsbG93IHBhc3RpbmcuCkBAIC0xNiwxNyArMTcsMTggQEAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgogICAgICAgICBjbHMucm9vdCA9IHJvb3QgPSB0ay5UaygpCi0gICAgICAgIHJvb3Qud2l0aGRyYXcoKQotICAgICAgICBQeVNoZWxsLmZpeF94MTFfcGFzdGUocm9vdCkKKyAgICAgICAgY2xzLnJvb3Qud2l0aGRyYXcoKQorICAgICAgICBweXNoZWxsLmZpeF94MTFfcGFzdGUocm9vdCkKICAgICAgICAgY2xzLnRleHQgPSB0ay5UZXh0KHJvb3QpCiAgICAgICAgIGNscy5lbnRyeSA9IHRrLkVudHJ5KHJvb3QpCisgICAgICAgIGNscy50ZW50cnkgPSB0dGsuRW50cnkocm9vdCkKICAgICAgICAgY2xzLnNwaW4gPSB0ay5TcGluYm94KHJvb3QpCiAgICAgICAgIHJvb3QuY2xpcGJvYXJkX2NsZWFyKCkKICAgICAgICAgcm9vdC5jbGlwYm9hcmRfYXBwZW5kKCd0d28nKQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKLSAgICAgICAgZGVsIGNscy50ZXh0LCBjbHMuZW50cnksIGNscy5zcGluCisgICAgICAgIGRlbCBjbHMudGV4dCwgY2xzLmVudHJ5LCBjbHMudGVudHJ5CiAgICAgICAgIGNscy5yb290LmNsaXBib2FyZF9jbGVhcigpCiAgICAgICAgIGNscy5yb290LnVwZGF0ZV9pZGxldGFza3MoKQogICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKQEAgLTQ0LDE2ICs0NiwxNiBAQAogCiAgICAgZGVmIHRlc3RfcGFzdGVfZW50cnkoc2VsZik6CiAgICAgICAgICJUZXN0IHBhc3RpbmcgaW50byBhbiBlbnRyeSB3aXRoIGFuZCB3aXRob3V0IGEgc2VsZWN0aW9uLiIKLSAgICAgICAgIyBPbiAzLjYsIGdlbmVyYXRlZCA8PFBhc3RlPj4gZmFpbHMgd2l0aG91dCBlbXB0eSBzZWxlY3QgcmFuZ2UKLSAgICAgICAgIyBmb3IgJ25vIHNlbGVjdGlvbicuICBMaXZlIHdpZGdldCB3b3JrcyBmaW5lLgotICAgICAgICBlbnRyeSA9IHNlbGYuZW50cnkKLSAgICAgICAgZm9yIGVuZCwgYW5zIGluICgwLCAnb25ldHdvJyksICgnZW5kJywgJ3R3bycpOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZW50cnk9ZW50cnksIGVuZD1lbmQsIGFucz1hbnMpOgotICAgICAgICAgICAgICAgIGVudHJ5LmRlbGV0ZSgwLCAnZW5kJykKLSAgICAgICAgICAgICAgICBlbnRyeS5pbnNlcnQoMCwgJ29uZScpCi0gICAgICAgICAgICAgICAgZW50cnkuc2VsZWN0X3JhbmdlKDAsIGVuZCkgICMgc2VlIG5vdGUKLSAgICAgICAgICAgICAgICBlbnRyeS5ldmVudF9nZW5lcmF0ZSgnPDxQYXN0ZT4+JykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LmdldCgpLCBhbnMpCisgICAgICAgICMgR2VuZXJhdGVkIDw8UGFzdGU+PiBmYWlscyBmb3IgdGsgZW50cnkgd2l0aG91dCBlbXB0eSBzZWxlY3QKKyAgICAgICAgIyByYW5nZSBmb3IgJ25vIHNlbGVjdGlvbicuICBMaXZlIHdpZGdldCB3b3JrcyBmaW5lLgorICAgICAgICBmb3IgZW50cnkgaW4gc2VsZi5lbnRyeSwgc2VsZi50ZW50cnk6CisgICAgICAgICAgICBmb3IgZW5kLCBhbnMgaW4gKDAsICdvbmV0d28nKSwgKCdlbmQnLCAndHdvJyk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZW50cnk9ZW50cnksIGVuZD1lbmQsIGFucz1hbnMpOgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kZWxldGUoMCwgJ2VuZCcpCisgICAgICAgICAgICAgICAgICAgIGVudHJ5Lmluc2VydCgwLCAnb25lJykKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuc2VsZWN0X3JhbmdlKDAsIGVuZCkKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZXZlbnRfZ2VuZXJhdGUoJzw8UGFzdGU+PicpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cnkuZ2V0KCksIGFucykKIAogICAgIGRlZiB0ZXN0X3Bhc3RlX3NwaW4oc2VsZik6CiAgICAgICAgICJUZXN0IHBhc3RpbmcgaW50byBhIHNwaW5ib3ggd2l0aCBhbmQgd2l0aG91dCBhIHNlbGVjdGlvbi4iCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9lZGl0b3IucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9lZGl0b3IucHkKaW5kZXggYTMxZDI2ZC4uZTlkMjlkNCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRvci5weQpAQCAtMSw2ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dAotZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93Citmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBFZGl0b3JXaW5kb3cKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogCiBjbGFzcyBFZGl0b3JfZnVuY190ZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2dyZXAucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9ncmVwLnB5CmluZGV4IDBkOGZmMGQuLjZiNTRjMTMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2dyZXAucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZ3JlcC5weQpAQCAtMSw1ICsxLDUgQEAKICIiIiAhQ2hhbmdpbmcgdGhpcyBsaW5lIHdpbGwgYnJlYWsgVGVzdF9maW5kZmlsZS50ZXN0X2ZvdW5kIQotTm9uLWd1aSB1bml0IHRlc3RzIGZvciBpZGxlbGliLkdyZXBEaWFsb2cgbWV0aG9kcy4KK05vbi1ndWkgdW5pdCB0ZXN0cyBmb3IgZ3JlcC5HcmVwRGlhbG9nIG1ldGhvZHMuCiBkdW1teV9jb21tYW5kIGNhbGxzIGdyZXBfaXQgY2FsbHMgZmluZGZpbGVzLgogQW4gZXhjZXB0aW9uIHJhaXNlZCBpbiBvbmUgbWV0aG9kIHdpbGwgZmFpbCBjYWxsZXJzLgogT3RoZXJ3aXNlLCB0ZXN0cyBhcmUgbW9zdGx5IGluZGVwZW5kZW50LgpAQCAtOCw3ICs4LDcgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGNhcHR1cmVkX3N0ZG91dAogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBWYXIKLWZyb20gaWRsZWxpYi5HcmVwRGlhbG9nIGltcG9ydCBHcmVwRGlhbG9nCitmcm9tIGlkbGVsaWIuZ3JlcCBpbXBvcnQgR3JlcERpYWxvZwogaW1wb3J0IHJlCiAKIGNsYXNzIER1bW15X3NlYXJjaGVuZ2luZToKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzWzRdLnN0YXJ0c3dpdGgoJyhIaW50OicpKQogCiBjbGFzcyBEZWZhdWx0X2NvbW1hbmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAjIFRvIHdyaXRlIHRoaXMsIG1vZGUgT3V0cHV0V2luZG93IGltcG9ydCB0byB0b3Agb2YgR3JlcERpYWxvZworICAgICMgVG8gd3JpdGUgdGhpcywgbW92ZSBvdXR3aW4gaW1wb3J0IHRvIHRvcCBvZiBHcmVwRGlhbG9nCiAgICAgIyBzbyBpdCBjYW4gYmUgcmVwbGFjZWQgYnkgY2FwdHVyZWRfc3Rkb3V0IGluIGNsYXNzIHNldHVwL3RlYXJkb3duLgogICAgIHBhc3MKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGVscC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2OGUyMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHAucHkKQEAgLTAsMCArMSwzNCBAQAorJycnVGVzdCBpZGxlbGliLmhlbHAuCisKK0NvdmVyYWdlOiA4NyUKKycnJworZnJvbSBpZGxlbGliIGltcG9ydCBoZWxwCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKK3JlcXVpcmVzKCdndWknKQorZnJvbSBvcy5wYXRoIGltcG9ydCBhYnNwYXRoLCBkaXJuYW1lLCBqb2luCitmcm9tIHRraW50ZXIgaW1wb3J0IFRrCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgSGVscEZyYW1lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICAiQnkgaXRzZWxmLCB0aGlzIHRlc3RzIHRoYXQgZmlsZSBwYXJzZWQgd2l0aG91dCBleGNlcHRpb24uIgorICAgICAgICBjbHMucm9vdCA9IHJvb3QgPSBUaygpCisgICAgICAgIHJvb3Qud2l0aGRyYXcoKQorICAgICAgICBoZWxwZmlsZSA9IGpvaW4oZGlybmFtZShkaXJuYW1lKGFic3BhdGgoX19maWxlX18pKSksICdoZWxwLmh0bWwnKQorICAgICAgICBjbHMuZnJhbWUgPSBoZWxwLkhlbHBGcmFtZShyb290LCBoZWxwZmlsZSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGRlbCBjbHMuZnJhbWUKKyAgICAgICAgY2xzLnJvb3QudXBkYXRlX2lkbGV0YXNrcygpCisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworICAgIGRlZiB0ZXN0X2xpbmUxKHNlbGYpOgorICAgICAgICB0ZXh0ID0gc2VsZi5mcmFtZS50ZXh0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5nZXQoJzEuMCcsICcxLmVuZCcpLCAnIElETEUgJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGVscF9hYm91dC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHBfYWJvdXQucHkKaW5kZXggZDBhMDEyNy4uODQzZWZiOSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGVscF9hYm91dC5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oZWxwX2Fib3V0LnB5CkBAIC0yLDEwICsyLDEwIEBACiAKIENvdmVyYWdlOgogJycnCi1mcm9tIGlkbGVsaWIgaW1wb3J0IGFib3V0RGlhbG9nIGFzIGhlbHBfYWJvdXQKLWZyb20gaWRsZWxpYiBpbXBvcnQgdGV4dFZpZXcgYXMgdGV4dHZpZXcKK2Zyb20gaWRsZWxpYiBpbXBvcnQgaGVscF9hYm91dAorZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0dmlldwogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKLWZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgTWJveAorZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBNYm94X2Z1bmMKIGltcG9ydCB1bml0dGVzdAogCiBBYm91dCA9IGhlbHBfYWJvdXQuQWJvdXREaWFsb2cKQEAgLTE5LDMzICsxOSwzMyBAQAogCiAKIGNsYXNzIERpc3BsYXlGaWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIlRlc3QgdGhhdCAudHh0IGZpbGVzIGFyZSBmb3VuZCBhbmQgcHJvcGVybHkgZGVjb2RlZC4iCiAgICAgZGlhbG9nID0gRHVtbXlfYWJvdXRfZGlhbG9nKCkKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBzZXRVcENsYXNzKGNscyk6Ci0gICAgICAgIGNscy5vcmlnX21ib3ggPSB0ZXh0dmlldy50a01lc3NhZ2VCb3gKKyAgICAgICAgY2xzLm9yaWdfZXJyb3IgPSB0ZXh0dmlldy5zaG93ZXJyb3IKICAgICAgICAgY2xzLm9yaWdfdmlldyA9IHRleHR2aWV3LnZpZXdfdGV4dAotICAgICAgICBjbHMubWJveCA9IE1ib3goKQorICAgICAgICBjbHMuZXJyb3IgPSBNYm94X2Z1bmMoKQogICAgICAgICBjbHMudmlldyA9IEZ1bmMoKQotICAgICAgICB0ZXh0dmlldy50a01lc3NhZ2VCb3ggPSBjbHMubWJveAorICAgICAgICB0ZXh0dmlldy5zaG93ZXJyb3IgPSBjbHMuZXJyb3IKICAgICAgICAgdGV4dHZpZXcudmlld190ZXh0ID0gY2xzLnZpZXcKICAgICAgICAgY2xzLkFib3V0ID0gRHVtbXlfYWJvdXRfZGlhbG9nKCkKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6Ci0gICAgICAgIHRleHR2aWV3LnRrTWVzc2FnZUJveCA9IGNscy5vcmlnX21ib3gKKyAgICAgICAgdGV4dHZpZXcuc2hvd2Vycm9yID0gY2xzLm9yaWdfZXJyb3IKICAgICAgICAgdGV4dHZpZXcudmlld190ZXh0ID0gY2xzLm9yaWdfdmlldwogCiAgICAgZGVmIHRlc3RfZmlsZV9pc3BsYXkoc2VsZik6CiAgICAgICAgIGZvciBoYW5kbGVyIGluIChzZWxmLmRpYWxvZy5pZGxlX2NyZWRpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpYWxvZy5pZGxlX3JlYWRtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlhbG9nLmlkbGVfbmV3cyk6Ci0gICAgICAgICAgICBzZWxmLm1ib3guc2hvd2Vycm9yLm1lc3NhZ2UgPSAnJworICAgICAgICAgICAgc2VsZi5lcnJvci5tZXNzYWdlID0gJycKICAgICAgICAgICAgIHNlbGYudmlldy5jYWxsZWQgPSBGYWxzZQotICAgICAgICAgICAgaGFuZGxlcigpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubWJveC5zaG93ZXJyb3IubWVzc2FnZSwgJycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudmlldy5jYWxsZWQsIFRydWUpCisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChoYW5kbGVyPWhhbmRsZXIpOgorICAgICAgICAgICAgICAgIGhhbmRsZXIoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lcnJvci5tZXNzYWdlLCAnJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudmlldy5jYWxsZWQsIFRydWUpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lkbGVoaXN0b3J5LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGlzdG9yeS5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pZGxlaGlzdG9yeS5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGlzdG9yeS5weQppbmRleCA2ZTdjNmMzLi5iMjc4MDEwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pZGxlaGlzdG9yeS5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oaXN0b3J5LnB5CkBAIC00LDggKzQsOCBAQAogaW1wb3J0IHRraW50ZXIgYXMgdGsKIGZyb20gdGtpbnRlciBpbXBvcnQgVGV4dCBhcyB0a1RleHQKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVGV4dCBhcyBta1RleHQKLWZyb20gaWRsZWxpYi5JZGxlSGlzdG9yeSBpbXBvcnQgSGlzdG9yeQotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuaGlzdG9yeSBpbXBvcnQgSGlzdG9yeQorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAogbGluZTEgPSAnYSA9IDcnCiBsaW5lMiA9ICdiID0gYScKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2h5cGVycGFyc2VyLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaHlwZXJwYXJzZXIucHkKaW5kZXggOWNlM2YyYy4uNzNjODI4MSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaHlwZXJwYXJzZXIucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaHlwZXJwYXJzZXIucHkKQEAgLTEsOSArMSw5IEBACi0iIiJVbml0dGVzdCBmb3IgaWRsZWxpYi5IeXBlclBhcnNlciIiIgorIiIiVW5pdHRlc3QgZm9yIGlkbGVsaWIuaHlwZXJwYXJzZXIucHkuIiIiCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dAotZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93Ci1mcm9tIGlkbGVsaWIuSHlwZXJQYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCitmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBFZGl0b3JXaW5kb3cKK2Zyb20gaWRsZWxpYi5oeXBlcnBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKIAogY2xhc3MgRHVtbXlFZGl0d2luOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0KToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lvLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaW9tZW51LnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lvLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pb21lbnUucHkKaW5kZXggZTBlM2I5OC4uNjViZjU5MyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaW8ucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaW9tZW51LnB5CkBAIC0xLDYgKzEsNyBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgaW8KLWZyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBQc2V1ZG9JbnB1dEZpbGUsIFBzZXVkb091dHB1dEZpbGUKKworZnJvbSBpZGxlbGliLnJ1biBpbXBvcnQgUHNldWRvSW5wdXRGaWxlLCBQc2V1ZG9PdXRwdXRGaWxlCiAKIAogY2xhc3MgUyhzdHIpOgpAQCAtMjMwLDQgKzIzMSw0IEBACiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB1bml0dGVzdC5tYWluKCkKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfbWFjb3N4LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfbWFjb3N4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTc1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9tYWNvc3gucHkKQEAgLTAsMCArMSwxMDMgQEAKKycnJ1Rlc3QgaWRsZWxpYi5tYWNvc3gucHkuCisKK0NvdmVyYWdlOiA3MSUgb24gV2luZG93cy4KKycnJworZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcworaW1wb3J0IHN5cworaW1wb3J0IHRraW50ZXIgYXMgdGsKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0Lm1vY2sgYXMgbW9jaworZnJvbSBpZGxlbGliLmZpbGVsaXN0IGltcG9ydCBGaWxlTGlzdAorCittYWN0eXBlcyA9IHsnY2FyYm9uJywgJ2NvY29hJywgJ3hxdWFydHonfQorbm9udHlwZXMgPSB7J290aGVyJ30KK2FsbHR5cGVzID0gbWFjdHlwZXMgfCBub250eXBlcworCisKK2NsYXNzIEluaXRUa3R5cGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBfaW5pdF90a190eXBlLiIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IHRrLlRrKCkKKyAgICAgICAgY2xzLnJvb3Qud2l0aGRyYXcoKQorICAgICAgICBjbHMub3JpZ19wbGF0Zm9ybSA9IG1hY29zeC5wbGF0Zm9ybQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QudXBkYXRlX2lkbGV0YXNrcygpCisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKyAgICAgICAgbWFjb3N4LnBsYXRmb3JtID0gY2xzLm9yaWdfcGxhdGZvcm0KKworICAgIGRlZiB0ZXN0X2luaXRfc2V0c190a3R5cGUoc2VsZik6CisgICAgICAgICJUZXN0IHRoYXQgX2luaXRfdGtfdHlwZSBzZXRzIF90a190eXBlIGFjY29yZGluZyB0byBwbGF0Zm9ybS4iCisgICAgICAgIGZvciBwbGF0Zm9ybSwgdHlwZXMgaW4gKCdkYXJ3aW4nLCBhbGx0eXBlcyksICgnb3RoZXInLCBub250eXBlcyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChwbGF0Zm9ybT1wbGF0Zm9ybSk6CisgICAgICAgICAgICAgICAgbWFjb3N4LnBsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAgICAgICAgICAgICBtYWNvc3guX3RrX3R5cGUgPT0gTm9uZQorICAgICAgICAgICAgICAgIG1hY29zeC5faW5pdF90a190eXBlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKG1hY29zeC5fdGtfdHlwZSwgdHlwZXMpCisKKworY2xhc3MgSXNUeXBlVGtUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBlYWNoIG9mIHRoZSBmb3VyIGlzVHlwZVRrIHByZWRlY2F0ZXMuIgorICAgIGlzZnVuY3MgPSAoKG1hY29zeC5pc0FxdWFUaywgKCdjYXJib24nLCAnY29jb2EnKSksCisgICAgICAgICAgICAgICAobWFjb3N4LmlzQ2FyYm9uVGssICgnY2FyYm9uJykpLAorICAgICAgICAgICAgICAgKG1hY29zeC5pc0NvY29hVGssICgnY29jb2EnKSksCisgICAgICAgICAgICAgICAobWFjb3N4LmlzWFF1YXJ0eiwgKCd4cXVhcnR6JykpLAorICAgICAgICAgICAgICAgKQorCisgICAgQG1vY2sucGF0Y2goJ2lkbGVsaWIubWFjb3N4Ll9pbml0X3RrX3R5cGUnKQorICAgIGRlZiB0ZXN0X2lzX2NhbGxzX2luaXQoc2VsZiwgbW9ja2luaXQpOgorICAgICAgICAiVGVzdCB0aGF0IGVhY2ggaXNUeXBlVGsgY2FsbHMgX2luaXRfdGtfdHlwZSB3aGVuIF90a190eXBlIGlzIE5vbmUuIgorICAgICAgICBtYWNvc3guX3RrX3R5cGUgPSBOb25lCisgICAgICAgIGZvciBmdW5jLCB3aGVudHJ1ZSBpbiBzZWxmLmlzZnVuY3M6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChmdW5jPWZ1bmMpOgorICAgICAgICAgICAgICAgIGZ1bmMoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NraW5pdC5jYWxsZWQpCisgICAgICAgICAgICAgICAgbW9ja2luaXQucmVzZXRfbW9jaygpCisKKyAgICBkZWYgdGVzdF9pc2Z1bmNzKHNlbGYpOgorICAgICAgICAiVGVzdCB0aGF0IGVhY2ggaXNUeXBlVGsgcmV0dXJuIGNvcnJlY3QgYm9vbC4iCisgICAgICAgIGZvciBmdW5jLCB3aGVudHJ1ZSBpbiBzZWxmLmlzZnVuY3M6CisgICAgICAgICAgICBmb3IgdGt0eXBlIGluIGFsbHR5cGVzOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGZ1bmM9ZnVuYywgd2hlbnRydWU9d2hlbnRydWUsIHRrdHlwZT10a3R5cGUpOgorICAgICAgICAgICAgICAgICAgICBtYWNvc3guX3RrX3R5cGUgPSB0a3R5cGUKKyAgICAgICAgICAgICAgICAgICAgKHNlbGYuYXNzZXJ0VHJ1ZSBpZiB0a3R5cGUgaW4gd2hlbnRydWUgZWxzZSBzZWxmLmFzc2VydEZhbHNlKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuYygpKQorCisKK2NsYXNzIFNldHVwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIlRlc3Qgc2V0dXBBcHAuIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy5yb290ID0gdGsuVGsoKQorICAgICAgICBjbHMucm9vdC53aXRoZHJhdygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdC51cGRhdGVfaWRsZXRhc2tzKCkKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgQG1vY2sucGF0Y2goJ2lkbGVsaWIubWFjb3N4Lm92ZXJyaWRlUm9vdE1lbnUnKSAgIzI3MzEyCisgICAgZGVmIHRlc3Rfc2V0dXBhcHAoc2VsZiwgb3ZlcnJpZGVSb290TWVudSk6CisgICAgICAgICJDYWxsIHNldHVwQXBwIHdpdGggZWFjaCBwb3NzaWJsZSBncmFwaGljcyB0eXBlLiIKKyAgICAgICAgcm9vdCA9IHNlbGYucm9vdAorICAgICAgICBmbGlzdCA9IEZpbGVMaXN0KHJvb3QpCisgICAgICAgIGZvciB0a3R5cGUgaW4gYWxsdHlwZXM6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh0a3R5cGU9dGt0eXBlKToKKyAgICAgICAgICAgICAgICBtYWNvc3guX3RrX3R5cGUgPSB0a3R5cGUKKyAgICAgICAgICAgICAgICBtYWNvc3guc2V0dXBBcHAocm9vdCwgZmxpc3QpCisgICAgICAgICAgICAgICAgaWYgdGt0eXBlIGluICgnY2FyYm9uJywgJ2NvY29hJyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdmVycmlkZVJvb3RNZW51LmNhbGxlZCkKKyAgICAgICAgICAgICAgICBvdmVycmlkZVJvb3RNZW51LnJlc2V0X21vY2soKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2Zvcm1hdHBhcmFncmFwaC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhcmFncmFwaC5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9mb3JtYXRwYXJhZ3JhcGgucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhcmFncmFwaC5weQppbmRleCBiNmViMmYzLi5iYTM1MGM5IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9mb3JtYXRwYXJhZ3JhcGgucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyYWdyYXBoLnB5CkBAIC0xLDcgKzEsNyBAQAotIyBUZXN0IHRoZSBmdW5jdGlvbnMgYW5kIG1haW4gY2xhc3MgbWV0aG9kIG9mIEZvcm1hdFBhcmFncmFwaC5weQorIyBUZXN0IHRoZSBmdW5jdGlvbnMgYW5kIG1haW4gY2xhc3MgbWV0aG9kIG9mIHBhcmFncmFwaC5weQogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IEZvcm1hdFBhcmFncmFwaCBhcyBmcAotZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93Citmcm9tIGlkbGVsaWIgaW1wb3J0IHBhcmFncmFwaCBhcyBmcAorZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93CiBmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIApAQCAtMzgsNyArMzgsNyBAQAogCiAKIGNsYXNzIEZpbmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAiIiJUZXN0IHRoZSBmaW5kX3BhcmFncmFwaCBmdW5jdGlvbiBpbiBGb3JtYXRQYXJhZ3JhcGguCisgICAgIiIiVGVzdCB0aGUgZmluZF9wYXJhZ3JhcGggZnVuY3Rpb24gaW4gcGFyYWdyYXBoIG1vZHVsZS4KIAogICAgIFVzaW5nIHRoZSBydW5jYXNlKCkgZnVuY3Rpb24sIGZpbmRfcGFyYWdyYXBoKCkgaXMgY2FsbGVkIHdpdGggJ21hcmsnIHNldCBhdAogICAgIG11bHRpcGxlIGluZGV4ZXMgYmVmb3JlIGFuZCBpbnNpZGUgdGhlIHRlc3QgcGFyYWdyYXBoLgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyZW5tYXRjaC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhcmVubWF0Y2gucHkKaW5kZXggOTVjYzIyYy4uMDUxZjdlYSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyZW5tYXRjaC5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXJlbm1hdGNoLnB5CkBAIC0xLDQgKzEsNCBAQAotJycnVGVzdCBpZGxlbGliLlBhcmVuTWF0Y2guCisnJydUZXN0IGlkbGVsaWIucGFyZW5tYXRjaC4KIAogVGhpcyBtdXN0IGN1cnJlbnRseSBiZSBhIGd1aSB0ZXN0IGJlY2F1c2UgUGFyZW5NYXRjaCBtZXRob2RzIHVzZQogc2V2ZXJhbCB0ZXh0IG1ldGhvZHMgbm90IGRlZmluZWQgb24gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ay5UZXh0LgpAQCAtOSw3ICs5LDcgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBNb2NrCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0Ci1mcm9tIGlkbGVsaWIuUGFyZW5NYXRjaCBpbXBvcnQgUGFyZW5NYXRjaAorZnJvbSBpZGxlbGliLnBhcmVubWF0Y2ggaW1wb3J0IFBhcmVuTWF0Y2gKIAogY2xhc3MgRHVtbXlFZGl0d2luOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0KToKQEAgLTM4LDEyICszOCwxNyBAQAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi50ZXh0LmRlbGV0ZSgnMS4wJywgJ2VuZCcpCiAKKyAgICBkZWYgZ2V0X3BhcmVubWF0Y2goc2VsZik6CisgICAgICAgIHBtID0gUGFyZW5NYXRjaChzZWxmLmVkaXR3aW4pCisgICAgICAgIHBtLmJlbGwgPSBsYW1iZGE6IE5vbmUKKyAgICAgICAgcmV0dXJuIHBtCisKICAgICBkZWYgdGVzdF9wYXJlbl9leHByZXNzaW9uKHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgVGVzdCBQYXJlbk1hdGNoIHdpdGggJ2V4cHJlc3Npb24nIHN0eWxlLgogICAgICAgICAiIiIKICAgICAgICAgdGV4dCA9IHNlbGYudGV4dAotICAgICAgICBwbSA9IFBhcmVuTWF0Y2goc2VsZi5lZGl0d2luKQorICAgICAgICBwbSA9IHNlbGYuZ2V0X3BhcmVubWF0Y2goKQogICAgICAgICBwbS5zZXRfc3R5bGUoJ2V4cHJlc3Npb24nKQogCiAgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnZGVmIGZvb2JhcihhLCBiJykKQEAgLTY2LDcgKzcxLDcgQEAKICAgICAgICAgVGVzdCBQYXJlbk1hdGNoIHdpdGggJ2RlZmF1bHQnIHN0eWxlLgogICAgICAgICAiIiIKICAgICAgICAgdGV4dCA9IHNlbGYudGV4dAotICAgICAgICBwbSA9IFBhcmVuTWF0Y2goc2VsZi5lZGl0d2luKQorICAgICAgICBwbSA9IHNlbGYuZ2V0X3BhcmVubWF0Y2goKQogICAgICAgICBwbS5zZXRfc3R5bGUoJ2RlZmF1bHQnKQogCiAgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnZGVmIGZvb2JhcihhLCBiJykKQEAgLTg2LDcgKzkxLDcgQEAKICAgICAgICAgVGhlc2UgY2FzZXMgZm9yY2UgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBhbmQgYWx0ZXJuYXRlIHBhdGhzLgogICAgICAgICAiIiIKICAgICAgICAgdGV4dCA9IHNlbGYudGV4dAotICAgICAgICBwbSA9IFBhcmVuTWF0Y2goc2VsZi5lZGl0d2luKQorICAgICAgICBwbSA9IHNlbGYuZ2V0X3BhcmVubWF0Y2goKQogCiAgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnIyB0aGlzIGlzIGEgY29tbWVuKScpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHBtLnBhcmVuX2Nsb3NlZF9ldmVudCgnZXZlbnQnKSkKQEAgLTk5LDcgKzEwNCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHBtLnBhcmVuX2Nsb3NlZF9ldmVudCgnZXZlbnQnKSkKIAogICAgIGRlZiB0ZXN0X2hhbmRsZV9yZXN0b3JlX3RpbWVyKHNlbGYpOgotICAgICAgICBwbSA9IFBhcmVuTWF0Y2goc2VsZi5lZGl0d2luKQorICAgICAgICBwbSA9IHNlbGYuZ2V0X3BhcmVubWF0Y2goKQogICAgICAgICBwbS5yZXN0b3JlX2V2ZW50ID0gTW9jaygpCiAgICAgICAgIHBtLmhhbmRsZV9yZXN0b3JlX3RpbWVyKDApCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwbS5yZXN0b3JlX2V2ZW50LmNhbGxlZCkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhdGhicm93c2VyLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGF0aGJyb3dzZXIucHkKaW5kZXggYWZiODg2Zi4uODEzY2JjYyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGF0aGJyb3dzZXIucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGF0aGJyb3dzZXIucHkKQEAgLTIsMTMgKzIsMTMgQEAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogaW1wb3J0IGlkbGVsaWIKLWZyb20gaWRsZWxpYiBpbXBvcnQgUGF0aEJyb3dzZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcGF0aGJyb3dzZXIKIAogY2xhc3MgUGF0aEJyb3dzZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X0RpckJyb3dzZXJUcmVlSXRlbShzZWxmKToKICAgICAgICAgIyBJc3N1ZTE2MjI2IC0gbWFrZSBzdXJlIHRoYXQgZ2V0dGluZyBhIHN1Ymxpc3Qgd29ya3MKLSAgICAgICAgZCA9IFBhdGhCcm93c2VyLkRpckJyb3dzZXJUcmVlSXRlbSgnJykKKyAgICAgICAgZCA9IHBhdGhicm93c2VyLkRpckJyb3dzZXJUcmVlSXRlbSgnJykKICAgICAgICAgZC5HZXRTdWJMaXN0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgZC5HZXRUZXh0KCkpCiAKQEAgLTE3LDExICsxNywxMSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaXNwYWNrYWdlZGlyKGRpciArICcvSWNvbnMnKSwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9QYXRoQnJvd3NlclRyZWVJdGVtKHNlbGYpOgotICAgICAgICBwID0gUGF0aEJyb3dzZXIuUGF0aEJyb3dzZXJUcmVlSXRlbSgpCisgICAgICAgIHAgPSBwYXRoYnJvd3Nlci5QYXRoQnJvd3NlclRyZWVJdGVtKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLkdldFRleHQoKSwgJ3N5cy5wYXRoJykKICAgICAgICAgc3ViID0gcC5HZXRTdWJMaXN0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3ViKSwgbGVuKHN5cy5wYXRoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHN1YlswXSksIFBhdGhCcm93c2VyLkRpckJyb3dzZXJUcmVlSXRlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHN1YlswXSksIHBhdGhicm93c2VyLkRpckJyb3dzZXJUcmVlSXRlbSkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGVyY29sYXRvci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BlcmNvbGF0b3IucHkKaW5kZXggNGMwYTdhZC4uNTczYjlhMSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGVyY29sYXRvci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wZXJjb2xhdG9yLnB5CkBAIC0xLDEwICsxLDEwIEBACi0nJydUZXN0IFBlcmNvbGF0b3InJycKKycnJ1Rlc3QgcGVyY29sYXRvci5weS4nJycKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogcmVxdWlyZXMoJ2d1aScpCiAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0a2ludGVyIGltcG9ydCBUZXh0LCBUaywgRU5ECi1mcm9tIGlkbGVsaWIuUGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvciwgRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIucGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvciwgRGVsZWdhdG9yCiAKIAogY2xhc3MgTXlGaWx0ZXIoRGVsZWdhdG9yKToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3F1ZXJ5LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcXVlcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhZjhlYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3F1ZXJ5LnB5CkBAIC0wLDAgKzEsMzUzIEBACisiIiJUZXN0IGlkbGVsaWIucXVlcnkuCisKK05vbi1ndWkgdGVzdHMgZm9yIFF1ZXJ5LCBTZWN0aW9uTmFtZSwgTW9kdWxlTmFtZSwgYW5kIEhlbHBTb3VyY2UgdXNlCitkdW1teSB2ZXJzaW9ucyB0aGF0IGV4dHJhY3QgdGhlIG5vbi1ndWkgbWV0aG9kcyBhbmQgYWRkIG90aGVyIG5lZWRlZAorYXR0cmlidXRlcy4gIEdVSSB0ZXN0cyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgZWFjaCBjbGFzcyBhbmQgc2ltdWxhdGUKK2VudHJpZXMgYW5kIGJ1dHRvbiBjbGlja3MuICBTdWJjbGFzcyB0ZXN0cyBvbmx5IHRhcmdldCB0aGUgbmV3IGNvZGUgaW4KK3RoZSBzdWJjbGFzcyBkZWZpbml0aW9uLgorCitUaGUgYXBwZWFyYW5jZSBvZiB0aGUgd2lkZ2V0cyBpcyBjaGVja2VkIGJ5IHRoZSBRdWVyeSBhbmQKK0hlbHBTb3VyY2UgaHRlc3RzLiAgVGhlc2UgYXJlIHJ1biBieSBydW5uaW5nIHF1ZXJ5LnB5LgorCitDb3ZlcmFnZTogOTQlICgxMDAlIGZvciBRdWVyeSBhbmQgU2VjdGlvbk5hbWUpLgorNiBvZiA4IG1pc3NpbmcgYXJlIE1vZHVsZU5hbWUgZXhjZXB0aW9ucyBJIGRvbid0IGtub3cgaG93IHRvIHRyaWdnZXIuCisiIiIKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcworaW1wb3J0IHN5cworZnJvbSB0a2ludGVyIGltcG9ydCBUaworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCitmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFZhcgorZnJvbSBpZGxlbGliIGltcG9ydCBxdWVyeQorCisKKyMgTk9OLUdVSSBURVNUUworCitjbGFzcyBRdWVyeVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICJUZXN0IFF1ZXJ5IGJhc2UgY2xhc3MuIgorCisgICAgY2xhc3MgRHVtbXlfUXVlcnk6CisgICAgICAgICMgVGVzdCB0aGUgZm9sbG93aW5nIFF1ZXJ5IG1ldGhvZHMuCisgICAgICAgIGVudHJ5X29rID0gcXVlcnkuUXVlcnkuZW50cnlfb2sKKyAgICAgICAgb2sgPSBxdWVyeS5RdWVyeS5vaworICAgICAgICBjYW5jZWwgPSBxdWVyeS5RdWVyeS5jYW5jZWwKKyAgICAgICAgIyBBZGQgYXR0cmlidXRlcyBhbmQgaW5pdGlhbGl6YXRpb24gbmVlZGVkIGZvciB0ZXN0cy4KKyAgICAgICAgZW50cnkgPSBWYXIoKQorICAgICAgICBlbnRyeV9lcnJvciA9IHt9CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkdW1teV9lbnRyeSk6CisgICAgICAgICAgICBzZWxmLmVudHJ5LnNldChkdW1teV9lbnRyeSkKKyAgICAgICAgICAgIHNlbGYuZW50cnlfZXJyb3JbJ3RleHQnXSA9ICcnCisgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuZGVzdHJveWVkID0gRmFsc2UKKyAgICAgICAgZGVmIHNob3dlcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuZW50cnlfZXJyb3JbJ3RleHQnXSA9IG1lc3NhZ2UKKyAgICAgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgICAgICBzZWxmLmRlc3Ryb3llZCA9IFRydWUKKworICAgIGRlZiB0ZXN0X2VudHJ5X29rX2JsYW5rKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X1F1ZXJ5KCcgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cuZW50cnlfb2soKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoZGlhbG9nLnJlc3VsdCwgZGlhbG9nLmRlc3Ryb3llZCksIChOb25lLCBGYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2JsYW5rIGxpbmUnLCBkaWFsb2cuZW50cnlfZXJyb3JbJ3RleHQnXSkKKworICAgIGRlZiB0ZXN0X2VudHJ5X29rX2dvb2Qoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuRHVtbXlfUXVlcnkoJyAgZ29vZCAnKQorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgRXF1YWwoZGlhbG9nLmVudHJ5X29rKCksICdnb29kJykKKyAgICAgICAgRXF1YWwoKGRpYWxvZy5yZXN1bHQsIGRpYWxvZy5kZXN0cm95ZWQpLCAoTm9uZSwgRmFsc2UpKQorICAgICAgICBFcXVhbChkaWFsb2cuZW50cnlfZXJyb3JbJ3RleHQnXSwgJycpCisKKyAgICBkZWYgdGVzdF9va19ibGFuayhzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9RdWVyeSgnJykKKyAgICAgICAgZGlhbG9nLmVudHJ5LmZvY3VzX3NldCA9IG1vY2suTW9jaygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLm9rKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWFsb2cuZW50cnkuZm9jdXNfc2V0LmNhbGxlZCkKKyAgICAgICAgZGVsIGRpYWxvZy5lbnRyeS5mb2N1c19zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoZGlhbG9nLnJlc3VsdCwgZGlhbG9nLmRlc3Ryb3llZCksIChOb25lLCBGYWxzZSkpCisKKyAgICBkZWYgdGVzdF9va19nb29kKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X1F1ZXJ5KCdnb29kJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cub2soKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoZGlhbG9nLnJlc3VsdCwgZGlhbG9nLmRlc3Ryb3llZCksICgnZ29vZCcsIFRydWUpKQorCisgICAgZGVmIHRlc3RfY2FuY2VsKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X1F1ZXJ5KCdkb2VzIG5vdCBtYXR0ZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5jYW5jZWwoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoZGlhbG9nLnJlc3VsdCwgZGlhbG9nLmRlc3Ryb3llZCksIChOb25lLCBUcnVlKSkKKworCitjbGFzcyBTZWN0aW9uTmFtZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICJUZXN0IFNlY3Rpb25OYW1lIHN1YmNsYXNzIG9mIFF1ZXJ5LiIKKworICAgIGNsYXNzIER1bW15X1NlY3Rpb25OYW1lOgorICAgICAgICBlbnRyeV9vayA9IHF1ZXJ5LlNlY3Rpb25OYW1lLmVudHJ5X29rICAjIEZ1bmN0aW9uIGJlaW5nIHRlc3RlZC4KKyAgICAgICAgdXNlZF9uYW1lcyA9IFsndXNlZCddCisgICAgICAgIGVudHJ5ID0gVmFyKCkKKyAgICAgICAgZW50cnlfZXJyb3IgPSB7fQorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZHVtbXlfZW50cnkpOgorICAgICAgICAgICAgc2VsZi5lbnRyeS5zZXQoZHVtbXlfZW50cnkpCisgICAgICAgICAgICBzZWxmLmVudHJ5X2Vycm9yWyd0ZXh0J10gPSAnJworICAgICAgICBkZWYgc2hvd2Vycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5lbnRyeV9lcnJvclsndGV4dCddID0gbWVzc2FnZQorCisgICAgZGVmIHRlc3RfYmxhbmtfc2VjdGlvbl9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X1NlY3Rpb25OYW1lKCcgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cuZW50cnlfb2soKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignbm8gbmFtZScsIGRpYWxvZy5lbnRyeV9lcnJvclsndGV4dCddKQorCisgICAgZGVmIHRlc3RfdXNlZF9zZWN0aW9uX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuRHVtbXlfU2VjdGlvbk5hbWUoJ3VzZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEluKCd1c2UnLCBkaWFsb2cuZW50cnlfZXJyb3JbJ3RleHQnXSkKKworICAgIGRlZiB0ZXN0X2xvbmdfc2VjdGlvbl9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X1NlY3Rpb25OYW1lKCdnb29kJyo4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEluKCdsb25nZXIgdGhhbiAzMCcsIGRpYWxvZy5lbnRyeV9lcnJvclsndGV4dCddKQorCisgICAgZGVmIHRlc3RfZ29vZF9zZWN0aW9uX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuRHVtbXlfU2VjdGlvbk5hbWUoJyAgZ29vZCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5lbnRyeV9vaygpLCAnZ29vZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLmVudHJ5X2Vycm9yWyd0ZXh0J10sICcnKQorCisKK2NsYXNzIE1vZHVsZU5hbWVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBNb2R1bGVOYW1lIHN1YmNsYXNzIG9mIFF1ZXJ5LiIKKworICAgIGNsYXNzIER1bW15X01vZHVsZU5hbWU6CisgICAgICAgIGVudHJ5X29rID0gcXVlcnkuTW9kdWxlTmFtZS5lbnRyeV9vayAgIyBGdW5jdGlvbiBiZWluZyB0ZXN0ZWQuCisgICAgICAgIHRleHQwID0gJycKKyAgICAgICAgZW50cnkgPSBWYXIoKQorICAgICAgICBlbnRyeV9lcnJvciA9IHt9CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkdW1teV9lbnRyeSk6CisgICAgICAgICAgICBzZWxmLmVudHJ5LnNldChkdW1teV9lbnRyeSkKKyAgICAgICAgICAgIHNlbGYuZW50cnlfZXJyb3JbJ3RleHQnXSA9ICcnCisgICAgICAgIGRlZiBzaG93ZXJyb3Ioc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmVudHJ5X2Vycm9yWyd0ZXh0J10gPSBtZXNzYWdlCisKKyAgICBkZWYgdGVzdF9ibGFua19tb2R1bGVfbmFtZShzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9Nb2R1bGVOYW1lKCcgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cuZW50cnlfb2soKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignbm8gbmFtZScsIGRpYWxvZy5lbnRyeV9lcnJvclsndGV4dCddKQorCisgICAgZGVmIHRlc3RfYm9ndXNfbW9kdWxlX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuRHVtbXlfTW9kdWxlTmFtZSgnX19uYW1lX3h5ejEyM19zaG91bGRfbm90X2V4aXN0X18nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEluKCdub3QgZm91bmQnLCBkaWFsb2cuZW50cnlfZXJyb3JbJ3RleHQnXSkKKworICAgIGRlZiB0ZXN0X2Nfc291cmNlX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuRHVtbXlfTW9kdWxlTmFtZSgnaXRlcnRvb2xzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cuZW50cnlfb2soKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignc291cmNlLWJhc2VkJywgZGlhbG9nLmVudHJ5X2Vycm9yWyd0ZXh0J10pCisKKyAgICBkZWYgdGVzdF9nb29kX21vZHVsZV9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X01vZHVsZU5hbWUoJ2lkbGVsaWInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlhbG9nLmVudHJ5X29rKCkuZW5kc3dpdGgoJ19faW5pdF9fLnB5JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLmVudHJ5X2Vycm9yWyd0ZXh0J10sICcnKQorCisKKyMgMyBIZWxwU291cmNlIHRlc3QgY2xhc3NlcyBlYWNoIHRlc3Qgb25lIGZ1bmN0aW9uLgorCitvcmlnX3BsYXRmb3JtID0gcXVlcnkucGxhdGZvcm0KKworY2xhc3MgSGVscHNvdXJjZUJyb3dzZWZpbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBicm93c2VfZmlsZSBtZXRob2Qgb2YgTW9kdWxlTmFtZSBzdWJjbGFzcyBvZiBRdWVyeS4iCisKKyAgICBjbGFzcyBEdW1teV9IZWxwU291cmNlOgorICAgICAgICBicm93c2VfZmlsZSA9IHF1ZXJ5LkhlbHBTb3VyY2UuYnJvd3NlX2ZpbGUKKyAgICAgICAgcGF0aHZhciA9IFZhcigpCisKKyAgICBkZWYgdGVzdF9maWxlX3JlcGxhY2VzX3BhdGgoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuRHVtbXlfSGVscFNvdXJjZSgpCisgICAgICAgICMgUGF0aCBpcyB3aWRnZXQgZW50cnksIGVpdGhlciAnJyBvciBzb21ldGhpbmcuCisgICAgICAgICMgRnVuYyByZXR1cm4gaXMgZmlsZSBkaWFsb2cgcmV0dXJuLCBlaXRoZXIgJycgb3Igc29tZXRoaW5nLgorICAgICAgICAjIEZ1bmMgcmV0dXJuIHNob3VsZCBvdmVycmlkZSB3aWRnZXQgZW50cnkuCisgICAgICAgICMgV2UgbmVlZCBhbGwgNCBjb21iaW5hdGlvbiB0byB0ZXN0IGFsbCAobW9zdCkgY29kZSBwYXRocy4KKyAgICAgICAgZm9yIHBhdGgsIGZ1bmMsIHJlc3VsdCBpbiAoCisgICAgICAgICAgICAgICAgKCcnLCBsYW1iZGEgYSxiLGM6JycsICcnKSwKKyAgICAgICAgICAgICAgICAoJycsIGxhbWJkYSBhLGIsYzogX19maWxlX18sIF9fZmlsZV9fKSwKKyAgICAgICAgICAgICAgICAoJ2h0ZXN0JywgbGFtYmRhIGEsYixjOicnLCAnaHRlc3QnKSwKKyAgICAgICAgICAgICAgICAoJ2h0ZXN0JywgbGFtYmRhIGEsYixjOiBfX2ZpbGVfXywgX19maWxlX18pKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KCk6CisgICAgICAgICAgICAgICAgZGlhbG9nLnBhdGh2YXIuc2V0KHBhdGgpCisgICAgICAgICAgICAgICAgZGlhbG9nLmFza2ZpbGVuYW1lID0gZnVuYworICAgICAgICAgICAgICAgIGRpYWxvZy5icm93c2VfZmlsZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cucGF0aHZhci5nZXQoKSwgcmVzdWx0KQorCisKK2NsYXNzIEhlbHBzb3VyY2VQYXRob2tUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBwYXRoX29rIG1ldGhvZCBvZiBIZWxwU291cmNlIHN1YmNsYXNzIG9mIFF1ZXJ5LiIKKworICAgIGNsYXNzIER1bW15X0hlbHBTb3VyY2U6CisgICAgICAgIHBhdGhfb2sgPSBxdWVyeS5IZWxwU291cmNlLnBhdGhfb2sKKyAgICAgICAgcGF0aCA9IFZhcigpCisgICAgICAgIHBhdGhfZXJyb3IgPSB7fQorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZHVtbXlfcGF0aCk6CisgICAgICAgICAgICBzZWxmLnBhdGguc2V0KGR1bW15X3BhdGgpCisgICAgICAgICAgICBzZWxmLnBhdGhfZXJyb3JbJ3RleHQnXSA9ICcnCisgICAgICAgIGRlZiBzaG93ZXJyb3Ioc2VsZiwgbWVzc2FnZSwgd2lkZ2V0PU5vbmUpOgorICAgICAgICAgICAgc2VsZi5wYXRoX2Vycm9yWyd0ZXh0J10gPSBtZXNzYWdlCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBxdWVyeS5wbGF0Zm9ybSA9IG9yaWdfcGxhdGZvcm0KKworICAgIGRlZiB0ZXN0X3BhdGhfb2tfYmxhbmsoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuRHVtbXlfSGVscFNvdXJjZSgnICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnBhdGhfb2soKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignbm8gaGVscCBmaWxlJywgZGlhbG9nLnBhdGhfZXJyb3JbJ3RleHQnXSkKKworICAgIGRlZiB0ZXN0X3BhdGhfb2tfYmFkKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X0hlbHBTb3VyY2UoX19maWxlX18gKyAnYmFkLWJhZC1iYWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5wYXRoX29rKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ25vdCBleGlzdCcsIGRpYWxvZy5wYXRoX2Vycm9yWyd0ZXh0J10pCisKKyAgICBkZWYgdGVzdF9wYXRoX29rX3dlYihzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9IZWxwU291cmNlKCcnKQorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZm9yIHVybCBpbiAnd3d3LnB5Lm9yZycsICdodHRwOi8vcHkub3JnJzoKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KCk6CisgICAgICAgICAgICAgICAgZGlhbG9nLnBhdGguc2V0KHVybCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5wYXRoX29rKCksIHVybCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5wYXRoX2Vycm9yWyd0ZXh0J10sICcnKQorCisgICAgZGVmIHRlc3RfcGF0aF9va19maWxlKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X0hlbHBTb3VyY2UoJycpCisgICAgICAgIGZvciBwbGF0Zm9ybSwgcHJlZml4IGluICgnZGFyd2luJywgJ2ZpbGU6Ly8nKSwgKCdvdGhlcicsICcnKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KCk6CisgICAgICAgICAgICAgICAgcXVlcnkucGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAgICAgICAgICAgIGRpYWxvZy5wYXRoLnNldChfX2ZpbGVfXykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5wYXRoX29rKCksIHByZWZpeCArIF9fZmlsZV9fKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnBhdGhfZXJyb3JbJ3RleHQnXSwgJycpCisKKworY2xhc3MgSGVscHNvdXJjZUVudHJ5b2tUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBlbnRyeV9vayBtZXRob2Qgb2YgSGVscFNvdXJjZSBzdWJjbGFzcyBvZiBRdWVyeS4iCisKKyAgICBjbGFzcyBEdW1teV9IZWxwU291cmNlOgorICAgICAgICBlbnRyeV9vayA9IHF1ZXJ5LkhlbHBTb3VyY2UuZW50cnlfb2sKKyAgICAgICAgZW50cnlfZXJyb3IgPSB7fQorICAgICAgICBwYXRoX2Vycm9yID0ge30KKyAgICAgICAgZGVmIGl0ZW1fb2soc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCisgICAgICAgIGRlZiBwYXRoX29rKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGF0aAorCisgICAgZGVmIHRlc3RfZW50cnlfb2tfaGVscHNvdXJjZShzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9IZWxwU291cmNlKCkKKyAgICAgICAgZm9yIG5hbWUsIHBhdGgsIHJlc3VsdCBpbiAoKE5vbmUsIE5vbmUsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgJ2RvYy50eHQnLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdkb2MnLCBOb25lLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdkb2MnLCAnZG9jLnR4dCcsICgnZG9jJywgJ2RvYy50eHQnKSkpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoKToKKyAgICAgICAgICAgICAgICBkaWFsb2cubmFtZSwgZGlhbG9nLnBhdGggPSBuYW1lLCBwYXRoCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cuZW50cnlfb2soKSwgcmVzdWx0KQorCisKKyMgR1VJIFRFU1RTCisKK2NsYXNzIFF1ZXJ5R3VpVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICByZXF1aXJlcygnZ3VpJykKKyAgICAgICAgY2xzLnJvb3QgPSByb290ID0gVGsoKQorICAgICAgICBjbHMucm9vdC53aXRoZHJhdygpCisgICAgICAgIGNscy5kaWFsb2cgPSBxdWVyeS5RdWVyeShyb290LCAnVEVTVCcsICd0ZXN0JywgX3V0ZXN0PVRydWUpCisgICAgICAgIGNscy5kaWFsb2cuZGVzdHJveSA9IG1vY2suTW9jaygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBkZWwgY2xzLmRpYWxvZworICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLmVudHJ5LmRlbGV0ZSgwLCAnZW5kJykKKyAgICAgICAgc2VsZi5kaWFsb2cucmVzdWx0ID0gTm9uZQorICAgICAgICBzZWxmLmRpYWxvZy5kZXN0cm95LnJlc2V0X21vY2soKQorCisgICAgZGVmIHRlc3RfY2xpY2tfb2soc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIGRpYWxvZy5lbnRyeS5pbnNlcnQoMCwgJ2FiYycpCisgICAgICAgIGRpYWxvZy5idXR0b25fb2suaW52b2tlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cucmVzdWx0LCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5kZXN0cm95LmNhbGxlZCkKKworICAgIGRlZiB0ZXN0X2NsaWNrX2JsYW5rKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBkaWFsb2cuYnV0dG9uX29rLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnJlc3VsdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkaWFsb2cuZGVzdHJveS5jYWxsZWQpCisKKyAgICBkZWYgdGVzdF9jbGlja19jYW5jZWwoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIGRpYWxvZy5lbnRyeS5pbnNlcnQoMCwgJ2FiYycpCisgICAgICAgIGRpYWxvZy5idXR0b25fY2FuY2VsLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnJlc3VsdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5kZXN0cm95LmNhbGxlZCkKKworCitjbGFzcyBTZWN0aW9ubmFtZUd1aVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisKKyAgICBkZWYgdGVzdF9jbGlja19zZWN0aW9uX25hbWUoc2VsZik6CisgICAgICAgIHJvb3QgPSBUaygpCisgICAgICAgIHJvb3Qud2l0aGRyYXcoKQorICAgICAgICBkaWFsb2cgPSAgcXVlcnkuU2VjdGlvbk5hbWUocm9vdCwgJ1QnLCAndCcsIHsnYWJjJ30sIF91dGVzdD1UcnVlKQorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cudXNlZF9uYW1lcywgeydhYmMnfSkKKyAgICAgICAgZGlhbG9nLmVudHJ5Lmluc2VydCgwLCAnb2theScpCisgICAgICAgIGRpYWxvZy5idXR0b25fb2suaW52b2tlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cucmVzdWx0LCAnb2theScpCisgICAgICAgIGRlbCBkaWFsb2cKKyAgICAgICAgcm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIHJvb3QKKworCitjbGFzcyBNb2R1bGVuYW1lR3VpVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICByZXF1aXJlcygnZ3VpJykKKworICAgIGRlZiB0ZXN0X2NsaWNrX21vZHVsZV9uYW1lKHNlbGYpOgorICAgICAgICByb290ID0gVGsoKQorICAgICAgICByb290LndpdGhkcmF3KCkKKyAgICAgICAgZGlhbG9nID0gIHF1ZXJ5Lk1vZHVsZU5hbWUocm9vdCwgJ1QnLCAndCcsICdpZGxlbGliJywgX3V0ZXN0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnRleHQwLCAnaWRsZWxpYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLmVudHJ5LmdldCgpLCAnaWRsZWxpYicpCisgICAgICAgIGRpYWxvZy5idXR0b25fb2suaW52b2tlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5yZXN1bHQuZW5kc3dpdGgoJ19faW5pdF9fLnB5JykpCisgICAgICAgIGRlbCBkaWFsb2cKKyAgICAgICAgcm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIHJvb3QKKworCitjbGFzcyBIZWxwc291cmNlR3VpVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICByZXF1aXJlcygnZ3VpJykKKworICAgIGRlZiB0ZXN0X2NsaWNrX2hlbHBfc291cmNlKHNlbGYpOgorICAgICAgICByb290ID0gVGsoKQorICAgICAgICByb290LndpdGhkcmF3KCkKKyAgICAgICAgZGlhbG9nID0gIHF1ZXJ5LkhlbHBTb3VyY2Uocm9vdCwgJ1QnLCBtZW51aXRlbT0nX190ZXN0X18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcGF0aD1fX2ZpbGVfXywgX3V0ZXN0PVRydWUpCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBFcXVhbChkaWFsb2cuZW50cnkuZ2V0KCksICdfX3Rlc3RfXycpCisgICAgICAgIEVxdWFsKGRpYWxvZy5wYXRoLmdldCgpLCBfX2ZpbGVfXykKKyAgICAgICAgZGlhbG9nLmJ1dHRvbl9vay5pbnZva2UoKQorICAgICAgICBwcmVmaXggPSAiZmlsZTovLyIgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGVsc2UgJycKKyAgICAgICAgRXF1YWwoZGlhbG9nLnJlc3VsdCwgKCdfX3Rlc3RfXycsIHByZWZpeCArIF9fZmlsZV9fKSkKKyAgICAgICAgZGVsIGRpYWxvZworICAgICAgICByb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgcm9vdAorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3dpZGdldHJlZGlyLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVkaXJlY3Rvci5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93aWRnZXRyZWRpci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVkaXJlY3Rvci5weQppbmRleCBiYWE5NzVkLi5iMDM4NWZhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93aWRnZXRyZWRpci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZWRpcmVjdG9yLnB5CkBAIC0xLDQgKzEsNCBAQAotJycnVGVzdCBpZGxlbGliLldpZGdldFJlZGlyZWN0b3IuCisnJydUZXN0IGlkbGVsaWIucmVkaXJlY3Rvci4KIAogMTAwJSBjb3ZlcmFnZQogJycnCkBAIC02LDcgKzYsNyBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfaWRsZSBpbXBvcnQgRnVuYwogZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dCwgVGNsRXJyb3IKLWZyb20gaWRsZWxpYi5XaWRnZXRSZWRpcmVjdG9yIGltcG9ydCBXaWRnZXRSZWRpcmVjdG9yCitmcm9tIGlkbGVsaWIucmVkaXJlY3RvciBpbXBvcnQgV2lkZ2V0UmVkaXJlY3RvcgogCiAKIGNsYXNzIEluaXRDbG9zZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMTIwLDYgKzEyMCw1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yb290LmNhbGwoc2VsZi50ZXh0Ll93LCAnaW5zZXJ0JywgJ2JvbycpLCAnJykKIAogCi0KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlcGxhY2VkaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZXBsYWNlLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlcGxhY2VkaWFsb2cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlcGxhY2UucHkKaW5kZXggZmY0NDgyMC4uOTkxM2VkMiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVwbGFjZWRpYWxvZy5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZXBsYWNlLnB5CkBAIC0xLDQgKzEsNCBAQAotIiIiVW5pdHRlc3QgZm9yIGlkbGVsaWIuUmVwbGFjZURpYWxvZyIiIgorIiIiVW5pdHRlc3QgZm9yIGlkbGVsaWIucmVwbGFjZS5weSIiIgogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiByZXF1aXJlcygnZ3VpJykKIApAQCAtNiw4ICs2LDggQEAKIGZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgTW9jawogZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dAogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBNYm94Ci1pbXBvcnQgaWRsZWxpYi5TZWFyY2hFbmdpbmUgYXMgc2UKLWltcG9ydCBpZGxlbGliLlJlcGxhY2VEaWFsb2cgYXMgcmQKK2ltcG9ydCBpZGxlbGliLnNlYXJjaGVuZ2luZSBhcyBzZQorZnJvbSBpZGxlbGliLnJlcGxhY2UgaW1wb3J0IFJlcGxhY2VEaWFsb2cKIAogb3JpZ19tYm94ID0gc2UudGtNZXNzYWdlQm94CiBzaG93ZXJyb3IgPSBNYm94LnNob3dlcnJvcgpAQCAtMjEsNyArMjEsOCBAQAogICAgICAgICBjbHMucm9vdC53aXRoZHJhdygpCiAgICAgICAgIHNlLnRrTWVzc2FnZUJveCA9IE1ib3gKICAgICAgICAgY2xzLmVuZ2luZSA9IHNlLlNlYXJjaEVuZ2luZShjbHMucm9vdCkKLSAgICAgICAgY2xzLmRpYWxvZyA9IHJkLlJlcGxhY2VEaWFsb2coY2xzLnJvb3QsIGNscy5lbmdpbmUpCisgICAgICAgIGNscy5kaWFsb2cgPSBSZXBsYWNlRGlhbG9nKGNscy5yb290LCBjbHMuZW5naW5lKQorICAgICAgICBjbHMuZGlhbG9nLmJlbGwgPSBsYW1iZGE6IE5vbmUKICAgICAgICAgY2xzLmRpYWxvZy5vayA9IE1vY2soKQogICAgICAgICBjbHMudGV4dCA9IFRleHQoY2xzLnJvb3QpCiAgICAgICAgIGNscy50ZXh0LnVuZG9fYmxvY2tfc3RhcnQgPSBNb2NrKCkKQEAgLTcwLDcgKzcxLDYgQEAKICAgICAgICAgIyB0ZXh0IGZvdW5kIGFuZCByZXBsYWNlZAogICAgICAgICBwdi5zZXQoJ2EnKQogICAgICAgICBydi5zZXQoJ2FzZGYnKQotICAgICAgICBzZWxmLmRpYWxvZy5vcGVuKHNlbGYudGV4dCkKICAgICAgICAgcmVwbGFjZSgpCiAgICAgICAgIGVxdWFsKHRleHQuZ2V0KCcxLjgnLCAnMS4xMicpLCAnYXNkZicpCiAKQEAgLTkxLDcgKzkxLDcgQEAKICAgICAgICAgdGV4dC5tYXJrX3NldCgnaW5zZXJ0JywgJ2VuZCcpCiAgICAgICAgIHRleHQuaW5zZXJ0KCdpbnNlcnQnLCAnXG5saW5lNDI6JykKICAgICAgICAgYmVmb3JlX3RleHQgPSB0ZXh0LmdldCgnMS4wJywgJ2VuZCcpCi0gICAgICAgIHB2LnNldCgnW2Etel1bXGRdKycpCisgICAgICAgIHB2LnNldChyJ1thLXpdW1xkXSsnKQogICAgICAgICByZXBsYWNlKCkKICAgICAgICAgYWZ0ZXJfdGV4dCA9IHRleHQuZ2V0KCcxLjAnLCAnZW5kJykKICAgICAgICAgZXF1YWwoYmVmb3JlX3RleHQsIGFmdGVyX3RleHQpCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAgICAgc2VsZi5lbmdpbmUucmV2YXIuc2V0KFRydWUpCiAKICAgICAgICAgYmVmb3JlX3RleHQgPSB0ZXh0LmdldCgnMS4wJywgJ2VuZCcpCi0gICAgICAgIHB2LnNldCgnW2Etel1bXGRdKycpCisgICAgICAgIHB2LnNldChyJ1thLXpdW1xkXSsnKQogICAgICAgICBydi5zZXQoJ2hlbGxvJykKICAgICAgICAgcmVwbGFjZSgpCiAgICAgICAgIGFmdGVyX3RleHQgPSB0ZXh0LmdldCgnMS4wJywgJ2VuZCcpCkBAIC0yMDcsNyArMjA3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRJbignZXJyb3InLCBzaG93ZXJyb3IudGl0bGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0VtcHR5Jywgc2hvd2Vycm9yLm1lc3NhZ2UpCiAKLSAgICAgICAgcHYuc2V0KCdbXGQnKQorICAgICAgICBwdi5zZXQocidbXGQnKQogICAgICAgICByZXBsYWNlKCkKICAgICAgICAgc2VsZi5hc3NlcnRJbignZXJyb3InLCBzaG93ZXJyb3IudGl0bGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1BhdHRlcm4nLCBzaG93ZXJyb3IubWVzc2FnZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JzdHJpcC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JzdHJpcC5weQppbmRleCAxYzkwYjkzLi4xMzBlNmJlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yc3RyaXAucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcnN0cmlwLnB5CkBAIC0xLDUgKzEsNSBAQAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgaWRsZWxpYi5Sc3RyaXBFeHRlbnNpb24gYXMgcnMKK2ltcG9ydCBpZGxlbGliLnJzdHJpcCBhcyBycwogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEVkaXRvcgogCiBjbGFzcyByc3RyaXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTIxLDcgKzIxLDcgQEAKICAgICBkZWYgdGVzdF9yc3RyaXBfbXVsdGlwbGUoc2VsZik6CiAgICAgICAgIGVkaXRvciA9IEVkaXRvcigpCiAgICAgICAgICMgIFVuY29tbWVudCBmb2xsb3dpbmcgdG8gdmVyaWZ5IHRoYXQgdGVzdCBwYXNzZXMgd2l0aCByZWFsIHdpZGdldHMuCi0jIyAgICAgICAgZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93IGFzIEVkaXRvcgorIyMgICAgICAgIGZyb20gaWRsZWxpYi5lZGl0b3IgaW1wb3J0IEVkaXRvcldpbmRvdyBhcyBFZGl0b3IKICMjICAgICAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRrCiAjIyAgICAgICAgZWRpdG9yID0gRWRpdG9yKHJvb3Q9VGsoKSkKICAgICAgICAgdGV4dCA9IGVkaXRvci50ZXh0CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zY3JvbGxlZGxpc3QucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zY3JvbGxlZGxpc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhYWJmZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3Njcm9sbGVkbGlzdC5weQpAQCAtMCwwICsxLDI5IEBACisnJycgVGVzdCBpZGxlbGliLnNjcm9sbGVkbGlzdC4KKworQ292ZXJhZ2U6IDM5JQorJycnCitmcm9tIGlkbGVsaWIgaW1wb3J0IHNjcm9sbGVkbGlzdAorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCityZXF1aXJlcygnZ3VpJykKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0a2ludGVyIGltcG9ydCBUaworCisKK2NsYXNzIFNjcm9sbGVkTGlzdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QgPSBUaygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgIHNjcm9sbGVkbGlzdC5TY3JvbGxlZExpc3Qoc2VsZi5yb290KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGRpYWxvZy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaC5weQpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hkaWFsb2cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaC5weQppbmRleCAxOTBjODY2Li44MGZhOTNhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hkaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoLnB5CkBAIC0xLDQgKzEsNCBAQAotIiIiVGVzdCBTZWFyY2hEaWFsb2cgY2xhc3MgaW4gU2VhcmNoRGlhbG9ndWUucHkiIiIKKyIiIlRlc3QgU2VhcmNoRGlhbG9nIGNsYXNzIGluIGlkbGVsaWIuc2VhcmNoLnB5IiIiCiAKICMgRG9lcyBub3QgY3VycmVudGx5IHRlc3QgdGhlIGV2ZW50IGhhbmRsZXIgd3JhcHBlcnMuCiAjIEEgdXNhZ2UgdGVzdCBzaG91bGQgc2ltdWxhdGUgY2xpY2tzIGFuZCBjaGVjayBoaWxpZ2h0aW5nLgpAQCAtMTEsOCArMTEsOCBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdGtpbnRlciBhcyB0awogZnJvbSB0a2ludGVyIGltcG9ydCBCb29sZWFuVmFyCi1pbXBvcnQgaWRsZWxpYi5TZWFyY2hFbmdpbmUgYXMgc2UKLWltcG9ydCBpZGxlbGliLlNlYXJjaERpYWxvZyBhcyBzZAoraW1wb3J0IGlkbGVsaWIuc2VhcmNoZW5naW5lIGFzIHNlCitpbXBvcnQgaWRsZWxpYi5zZWFyY2ggYXMgc2QKIAogCiBjbGFzcyBTZWFyY2hEaWFsb2dUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTI5LDYgKzI5LDcgQEAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuZW5naW5lID0gc2UuU2VhcmNoRW5naW5lKHNlbGYucm9vdCkKICAgICAgICAgc2VsZi5kaWFsb2cgPSBzZC5TZWFyY2hEaWFsb2coc2VsZi5yb290LCBzZWxmLmVuZ2luZSkKKyAgICAgICAgc2VsZi5kaWFsb2cuYmVsbCA9IGxhbWJkYTogTm9uZQogICAgICAgICBzZWxmLnRleHQgPSB0ay5UZXh0KHNlbGYucm9vdCkKICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnMS4wJywgJ0hlbGxvIFdvcmxkIScpCiAKQEAgLTM4LDYgKzM5LDcgQEAKIAogICAgICAgICBzZWxmLmVuZ2luZS5zZXRwYXQoJycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5kaWFsb2cuZmluZF9hZ2Fpbih0ZXh0KSkKKyAgICAgICAgc2VsZi5kaWFsb2cuYmVsbCA9IGxhbWJkYTogTm9uZQogCiAgICAgICAgIHNlbGYuZW5naW5lLnNldHBhdCgnSGVsbG8nKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cuZmluZF9hZ2Fpbih0ZXh0KSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGRpYWxvZ2Jhc2UucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hiYXNlLnB5CnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGRpYWxvZ2Jhc2UucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGJhc2UucHkKaW5kZXggODAzNmI5MS4uZDc2OWZhMiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZGlhbG9nYmFzZS5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hiYXNlLnB5CkBAIC0xLDE0ICsxLDEzIEBACi0nJydVbml0dGVzdHMgZm9yIGlkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weQorJycndGVzdHMgaWRsZWxpYi5zZWFyY2hiYXNlLgogCiBDb3ZlcmFnZTogOTklLiBUaGUgb25seSB0aGluZyBub3QgY292ZXJlZCBpcyBpbmNvbnNlcXVlbnRpYWwgLS0KIHRlc3Rpbmcgc2tpcHBpbmcgb2Ygc3VpdGUgd2hlbiBzZWxmLm5lZWR3cmFwYnV0dG9uIGlzIGZhbHNlLgotCiAnJycKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUb3BsZXZlbCwgRnJhbWUgIyMsIEJvb2xlYW5WYXIsIFN0cmluZ1ZhcgotZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hFbmdpbmUgYXMgc2UKLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZSBhcyBzZGIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgc2VhcmNoZW5naW5lIGFzIHNlCitmcm9tIGlkbGVsaWIgaW1wb3J0IHNlYXJjaGJhc2UgYXMgc2RiCiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfaWRsZSBpbXBvcnQgRnVuYwogIyMgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBWYXIKIApAQCAtNzQsNyArNzMsNyBAQAogICAgIGRlZiB0ZXN0X21ha2VfZW50cnkoc2VsZik6CiAgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICBzZWxmLmRpYWxvZy5yb3cgPSAwCi0gICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IFRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gc2VsZi5yb290CiAgICAgICAgIGVudHJ5LCBsYWJlbCA9IHNlbGYuZGlhbG9nLm1ha2VfZW50cnkoIlRlc3Q6IiwgJ2hlbGxvJykKICAgICAgICAgZXF1YWwobGFiZWxbJ3RleHQnXSwgJ1Rlc3Q6JykKIApAQCAtODcsNiArODYsNyBAQAogICAgICAgICBlcXVhbChzZWxmLmRpYWxvZy5yb3csIDEpCiAKICAgICBkZWYgdGVzdF9jcmVhdGVfZW50cmllcyhzZWxmKToKKyAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gc2VsZi5yb290CiAgICAgICAgIHNlbGYuZGlhbG9nLnJvdyA9IDAKICAgICAgICAgc2VsZi5lbmdpbmUuc2V0cGF0KCdoZWxsbycpCiAgICAgICAgIHNlbGYuZGlhbG9nLmNyZWF0ZV9lbnRyaWVzKCkKQEAgLTk0LDcgKzk0LDcgQEAKIAogICAgIGRlZiB0ZXN0X21ha2VfZnJhbWUoc2VsZik6CiAgICAgICAgIHNlbGYuZGlhbG9nLnJvdyA9IDAKLSAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gVG9wbGV2ZWwoc2VsZi5yb290KQorICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBzZWxmLnJvb3QKICAgICAgICAgZnJhbWUsIGxhYmVsID0gc2VsZi5kaWFsb2cubWFrZV9mcmFtZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGFiZWwsICcnKQogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZnJhbWUsIEZyYW1lKQpAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmcmFtZSwgRnJhbWUpCiAKICAgICBkZWYgYnRuX3Rlc3Rfc2V0dXAoc2VsZiwgbWV0aCk6Ci0gICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IFRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gc2VsZi5yb290CiAgICAgICAgIHNlbGYuZGlhbG9nLnJvdyA9IDAKICAgICAgICAgcmV0dXJuIG1ldGgoKQogCkBAIC0xMTksMTEgKzExOSw2IEBACiAgICAgICAgICAgICAgICAgdmFyLCBsYWJlbCA9IHNwZWMKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1dHRvblsndGV4dCddLCBsYWJlbCkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhci5nZXQoKSwgc3RhdGUpCi0gICAgICAgICAgICAgICAgaWYgc3RhdGUgPT0gMToKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRlc2VsZWN0KCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBidXR0b24uc2VsZWN0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhci5nZXQoKSwgMSAtIHN0YXRlKQogCiAgICAgZGVmIHRlc3RfY3JlYXRlX290aGVyX2J1dHRvbnMoc2VsZik6CiAgICAgICAgIGZvciBzdGF0ZSBpbiAoRmFsc2UsIFRydWUpOgpAQCAtMTM5LDE4ICsxMzQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgIyBoaXQgb3RoZXIgYnV0dG9uLCB0aGVuIHRoaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICMgaW5kZXhlcyBkZXBlbmQgb24gYnV0dG9uIG9yZGVyCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFyLmdldCgpLCBzdGF0ZSkKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uc1t2YWxdLnNlbGVjdCgpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFyLmdldCgpLCAxIC0gc3RhdGUpCi0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbnNbMS12YWxdLnNlbGVjdCgpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFyLmdldCgpLCBzdGF0ZSkKIAogICAgIGRlZiB0ZXN0X21ha2VfYnV0dG9uKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBUb3BsZXZlbChzZWxmLnJvb3QpCisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IHNlbGYucm9vdAogICAgICAgICBzZWxmLmRpYWxvZy5idXR0b25mcmFtZSA9IEZyYW1lKHNlbGYuZGlhbG9nLnRvcCkKICAgICAgICAgYnRuID0gc2VsZi5kaWFsb2cubWFrZV9idXR0b24oJ1Rlc3QnLCBzZWxmLmRpYWxvZy5jbG9zZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidG5bJ3RleHQnXSwgJ1Rlc3QnKQogCiAgICAgZGVmIHRlc3RfY3JlYXRlX2NvbW1hbmRfYnV0dG9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gc2VsZi5yb290CiAgICAgICAgIHNlbGYuZGlhbG9nLmNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoKQogICAgICAgICAjIExvb2sgZm9yIGNsb3NlIGJ1dHRvbiBjb21tYW5kIGluIGJ1dHRvbmZyYW1lCiAgICAgICAgIGNsb3NlYnV0dG9uY29tbWFuZCA9ICcnCkBAIC0xNjAsNiArMTUyLDUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRJbignY2xvc2UnLCBjbG9zZWJ1dHRvbmNvbW1hbmQpCiAKIAotCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGVuZ2luZS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGVuZ2luZS5weQppbmRleCBlZGJkNTU4Li5iM2FhOGViIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hlbmdpbmUucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZW5naW5lLnB5CkBAIC0xLDQgKzEsNCBAQAotJycnVGVzdCBmdW5jdGlvbnMgYW5kIFNlYXJjaEVuZ2luZSBjbGFzcyBpbiBTZWFyY2hFbmdpbmUucHkuJycnCisnJydUZXN0IGZ1bmN0aW9ucyBhbmQgU2VhcmNoRW5naW5lIGNsYXNzIGluIGlkbGVsaWIuc2VhcmNoZW5naW5lLnB5LicnJwogCiAjIFdpdGggbW9jayByZXBsYWNlbWVudHMsIHRoZSBtb2R1bGUgZG9lcyBub3QgdXNlIGFueSBndWkgd2lkZ2V0cy4KICMgVGhlIHVzZSBvZiB0ay5UZXh0IGlzIGF2b2lkZWQgKGZvciBub3csIHVudGlsIG1vY2sgVGV4dCBpcyBpbXByb3ZlZCkKQEAgLTEwLDcgKzEwLDcgQEAKICMgZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiBmcm9tIHRraW50ZXIgaW1wb3J0ICBCb29sZWFuVmFyLCBTdHJpbmdWYXIsIFRjbEVycm9yICAjICxUaywgVGV4dAogaW1wb3J0IHRraW50ZXIubWVzc2FnZWJveCBhcyB0a01lc3NhZ2VCb3gKLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lIGFzIHNlCitmcm9tIGlkbGVsaWIgaW1wb3J0IHNlYXJjaGVuZ2luZSBhcyBzZQogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBWYXIsIE1ib3gKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVGV4dCBhcyBtb2NrVGV4dAogCkBAIC0xMzksMTAgKzEzOSwxMCBAQAogCiAgICAgZGVmIHRlc3Rfc2V0Y29va2VkcGF0KHNlbGYpOgogICAgICAgICBlbmdpbmUgPSBzZWxmLmVuZ2luZQotICAgICAgICBlbmdpbmUuc2V0Y29va2VkcGF0KCdccycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5naW5lLmdldHBhdCgpLCAnXHMnKQorICAgICAgICBlbmdpbmUuc2V0Y29va2VkcGF0KHInXHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuZ2luZS5nZXRwYXQoKSwgcidccycpCiAgICAgICAgIGVuZ2luZS5yZXZhci5zZXQoMSkKLSAgICAgICAgZW5naW5lLnNldGNvb2tlZHBhdCgnXHMnKQorICAgICAgICBlbmdpbmUuc2V0Y29va2VkcGF0KHInXHMnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuZ2luZS5nZXRwYXQoKSwgcidcXHMnKQogCiAgICAgZGVmIHRlc3RfZ2V0Y29va2VkcGF0KHNlbGYpOgpAQCAtMTU2LDEwICsxNTYsMTAgQEAKICAgICAgICAgRXF1YWwoZW5naW5lLmdldGNvb2tlZHBhdCgpLCByJ1xiaGVsbG9cYicpCiAgICAgICAgIGVuZ2luZS53b3JkdmFyLnNldChGYWxzZSkKIAotICAgICAgICBlbmdpbmUuc2V0cGF0KCdccycpCisgICAgICAgIGVuZ2luZS5zZXRwYXQocidccycpCiAgICAgICAgIEVxdWFsKGVuZ2luZS5nZXRjb29rZWRwYXQoKSwgcidcXHMnKQogICAgICAgICBlbmdpbmUucmV2YXIuc2V0KFRydWUpCi0gICAgICAgIEVxdWFsKGVuZ2luZS5nZXRjb29rZWRwYXQoKSwgJ1xzJykKKyAgICAgICAgRXF1YWwoZW5naW5lLmdldGNvb2tlZHBhdCgpLCByJ1xzJykKIAogICAgIGRlZiB0ZXN0X2dldHByb2coc2VsZik6CiAgICAgICAgIGVuZ2luZSA9IHNlbGYuZW5naW5lCkBAIC0yODIsNyArMjgyLDcgQEAKICAgICAgICAgY2xzLnBhdCA9IHJlLmNvbXBpbGUoJ3RhcmdldCcpCiAgICAgICAgIGNscy5yZXMgPSAoMiwgKDEwLCAxNikpICAjIGxpbmUsIHNsaWNlIGluZGV4ZXMgb2YgJ3RhcmdldCcKICAgICAgICAgY2xzLmZhaWxwYXQgPSByZS5jb21waWxlKCd4eXonKSAgIyBub3QgaW4gdGV4dAotICAgICAgICBjbHMuZW1wdHlwYXQgPSByZS5jb21waWxlKCdcdyonKSAgIyBlbXB0eSBtYXRjaCBwb3NzaWJsZQorICAgICAgICBjbHMuZW1wdHlwYXQgPSByZS5jb21waWxlKHInXHcqJykgICMgZW1wdHkgbWF0Y2ggcG9zc2libGUKIAogICAgIGRlZiBtYWtlX3NlYXJjaChzZWxmLCBmdW5jKToKICAgICAgICAgZGVmIHNlYXJjaChwYXQsIGxpbmUsIGNvbCwgd3JhcCwgb2s9MCk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90ZXh0LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dC5weQppbmRleCA3ZTgyM2RmLi5hNWJhN2JiIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90ZXh0LnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHQucHkKQEAgLTEsMTcgKzEsMTkgQEAKLSMgVGVzdCBtb2NrX3RrLlRleHQgY2xhc3MgYWdhaW5zdCB0a2ludGVyLlRleHQgY2xhc3MgYnkgcnVubmluZyBzYW1lIHRlc3RzIHdpdGggYm90aC4KKycnJyBUZXN0IG1vY2tfdGsuVGV4dCBjbGFzcyBhZ2FpbnN0IHRraW50ZXIuVGV4dCBjbGFzcworCitSdW4gc2FtZSB0ZXN0cyB3aXRoIGJvdGggYnkgY3JlYXRpbmcgYSBtaXhpbiBjbGFzcy4KKycnJwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKLQogZnJvbSBfdGtpbnRlciBpbXBvcnQgVGNsRXJyb3IKIAogY2xhc3MgVGV4dFRlc3Qob2JqZWN0KToKKyAgICAiRGVmaW5lIGl0ZW1zIGNvbW1vbiB0byBib3RoIHNldHMgb2YgdGVzdHMuIgogCi0gICAgaHcgPSAnaGVsbG9cbndvcmxkJyAgIyB1c3VhbCBpbml0aWFsIGluc2VydCBhZnRlciBpbml0aWFsaXphdGlvbgorICAgIGh3ID0gJ2hlbGxvXG53b3JsZCcgICMgU2V2ZXJhbCB0ZXN0cyBpbnNlcnQgdGhpcyBhZnRlciBhZnRlciBpbml0aWFsaXphdGlvbi4KICAgICBod24gPSBodysnXG4nICAjIFxuIHByZXNlbnQgYXQgaW5pdGlhbGl6YXRpb24sIGJlZm9yZSBpbnNlcnQKIAotICAgIFRleHQgPSBOb25lCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnRleHQgPSBzZWxmLlRleHQoKQorICAgICMgc2V0VXBDbGFzcyBkZWZpbmVzIGNscy5UZXh0IGFuZCBtYXliZSBjbHMucm9vdC4KKyAgICAjIHNldFVwIGRlZmluZXMgc2VsZi50ZXh0IGZyb20gVGV4dCBhbmQgbWF5YmUgcm9vdC4KIAogICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXh0LmdldCgnMS4wJyksICdcbicpCkBAIC0xOTYsNiArMTk4LDEwIEBACiAgICAgICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVGV4dAogICAgICAgICBjbHMuVGV4dCA9IFRleHQKIAorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZXh0ID0gc2VsZi5UZXh0KCkKKworCiAgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgogICAgICAgICAjIHRlc3QgZW5kZmxhZ3MgKC0xLCAwKSBub3QgdGVzdGVkIGJ5IHRlc3RfaW5kZXggKHdoaWNoIHVzZXMgKzEpCiAgICAgICAgIGRlY29kZSA9IHNlbGYudGV4dC5fZGVjb2RlCkBAIC0yMjIsNiArMjI4LDkgQEAKICAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCiAgICAgICAgIGRlbCBjbHMucm9vdAogCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRleHQgPSBzZWxmLlRleHQoc2VsZi5yb290KQorCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHR2aWV3LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dHZpZXcucHkKaW5kZXggNWQyZTYwMC4uZjAxOGY1ZSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dHZpZXcucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dHZpZXcucHkKQEAgLTEsMjEgKzEsMjEgQEAKLScnJ1Rlc3QgaWRsZWxpYi50ZXh0Vmlldy4KKycnJ1Rlc3QgaWRsZWxpYi50ZXh0dmlldy4KIAogU2luY2UgYWxsIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBjcmVhdGUgKG9yIGRlc3Ryb3kpIGEgVGV4dFZpZXdlciwgd2hpY2gKIGlzIGEgd2lkZ2V0IGNvbnRhaW5pbmcgbXVsdGlwbGUgd2lkZ2V0cywgYWxsIHRlc3RzIG11c3QgYmUgZ3VpIHRlc3RzLgogVXNpbmcgbW9jayBUZXh0IHdvdWxkIG5vdCBjaGFuZ2UgdGhpcy4gIE90aGVyIG1vY2tzIGFyZSB1c2VkIHRvIHJldHJpZXZlCiBpbmZvcm1hdGlvbiBhYm91dCBjYWxscy4KIAotVGhlIGNvdmVyYWdlIGlzIGVzc2VudGlhbGx5IDEwMCUuCitDb3ZlcmFnZTogOTQlLgogJycnCitmcm9tIGlkbGVsaWIgaW1wb3J0IHRleHR2aWV3IGFzIHR2CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIHJlcXVpcmVzKCdndWknKQogCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcwogZnJvbSB0a2ludGVyIGltcG9ydCBUawotZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0VmlldyBhcyB0dgogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKLWZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgTWJveAorZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBNYm94X2Z1bmMKIAogZGVmIHNldFVwTW9kdWxlKCk6CiAgICAgZ2xvYmFsIHJvb3QKQEAgLTY0LDE3ICs2NCwxNyBAQAogICAgICAgICB2aWV3LmRlc3Ryb3koKQogCiAKLWNsYXNzIHRleHR2aWV3VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CitjbGFzcyBWaWV3RnVuY3Rpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBzZXRVcENsYXNzKGNscyk6Ci0gICAgICAgIGNscy5vcmlnX21ib3ggPSB0di50a01lc3NhZ2VCb3gKLSAgICAgICAgdHYudGtNZXNzYWdlQm94ID0gTWJveAorICAgICAgICBjbHMub3JpZ19lcnJvciA9IHR2LnNob3dlcnJvcgorICAgICAgICB0di5zaG93ZXJyb3IgPSBNYm94X2Z1bmMoKQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKLSAgICAgICAgdHYudGtNZXNzYWdlQm94ID0gY2xzLm9yaWdfbWJveAotICAgICAgICBkZWwgY2xzLm9yaWdfbWJveAorICAgICAgICB0di5zaG93ZXJyb3IgPSBjbHMub3JpZ19lcnJvcgorICAgICAgICBkZWwgY2xzLm9yaWdfZXJyb3IKIAogICAgIGRlZiB0ZXN0X3ZpZXdfdGV4dChzZWxmKToKICAgICAgICAgIyBJZiBtb2RhbCBUcnVlLCBnZXQgdGsgZXJyb3IgJ2Nhbid0IGludm9rZSAiZXZlbnQiIGNvbW1hbmQnLgpAQCAtOTAsNyArOTAsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEluKCdUZXN0Jywgdmlldy50ZXh0Vmlldy5nZXQoJzEuMCcsICcxLmVuZCcpKQogICAgICAgICB2aWV3Lk9rKCkKIAotICAgICAgICAjIE1vY2sgbWVzc2FnZWJveCB3aWxsIGJlIHVzZWQgYW5kIHZpZXdfZmlsZSB3aWxsIG5vdCByZXR1cm4gYW55dGhpbmcKKyAgICAgICAgIyBNb2NrIHNob3dlcnJvciB3aWxsIGJlIHVzZWQ7IHZpZXdfZmlsZSB3aWxsIHJldHVybiBOb25lLgogICAgICAgICB0ZXN0ZmlsZSA9IG9zLnBhdGguam9pbih0ZXN0X2RpciwgJy4uL25vdHRoZXJlLnB5JykKICAgICAgICAgdmlldyA9IHR2LnZpZXdfZmlsZShyb290LCAnVGl0bGUnLCB0ZXN0ZmlsZSwgbW9kYWw9RmFsc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHZpZXcpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90cmVlLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdHJlZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWJhOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdHJlZS5weQpAQCAtMCwwICsxLDM2IEBACisnJycgVGVzdCBpZGxlbGliLnRyZWUuCisKK0NvdmVyYWdlOiA1NiUKKycnJworZnJvbSBpZGxlbGliIGltcG9ydCB0cmVlCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKK3JlcXVpcmVzKCdndWknKQoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGtpbnRlciBpbXBvcnQgVGsKKworCitjbGFzcyBUcmVlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdCA9IFRrKCkKKyAgICAgICAgY2xzLnJvb3Qud2l0aGRyYXcoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgIyBTdGFydCB3aXRoIGNvZGUgc2xpZ2h0bHkgYWRhcHRlZCBmcm9tIGh0ZXN0LgorICAgICAgICBzYyA9IHRyZWUuU2Nyb2xsZWRDYW52YXMoCisgICAgICAgICAgICBzZWxmLnJvb3QsIGJnPSJ3aGl0ZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCB0YWtlZm9jdXM9MSkKKyAgICAgICAgc2MuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIsIHNpZGU9J2xlZnQnKQorICAgICAgICBpdGVtID0gdHJlZS5GaWxlVHJlZUl0ZW0odHJlZS5JQ09ORElSKQorICAgICAgICBub2RlID0gdHJlZS5UcmVlTm9kZShzYy5jYW52YXMsIE5vbmUsIGl0ZW0pCisgICAgICAgIG5vZGUuZXhwYW5kKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF91bmRvZGVsZWdhdG9yLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdW5kby5weQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF91bmRvZGVsZWdhdG9yLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF91bmRvLnB5CmluZGV4IDJiODNjOTkuLmU4NzI5MjcgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3VuZG9kZWxlZ2F0b3IucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdW5kby5weQpAQCAtMSw0ICsxLDQgQEAKLSIiIlVuaXR0ZXN0IGZvciBVbmRvRGVsZWdhdG9yIGluIGlkbGVsaWIuVW5kb0RlbGVnYXRvci4KKyIiIlVuaXR0ZXN0IGZvciBVbmRvRGVsZWdhdG9yIGluIGlkbGVsaWIudW5kby5weS4KIAogQ292ZXJhZ2UgYWJvdXQgODAlIChyZXRlc3QpLgogIiIiCkBAIC04LDggKzgsOCBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gdGtpbnRlciBpbXBvcnQgVGV4dCwgVGsKLWZyb20gaWRsZWxpYi5VbmRvRGVsZWdhdG9yIGltcG9ydCBVbmRvRGVsZWdhdG9yCi1mcm9tIGlkbGVsaWIuUGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgorZnJvbSBpZGxlbGliLnVuZG8gaW1wb3J0IFVuZG9EZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5wZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCiAKIAogY2xhc3MgVW5kb0RlbGVnYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMjksOCArMjksOCBAQAogCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmRlbGVnYXRvciA9IFVuZG9EZWxlZ2F0b3IoKQorICAgICAgICBzZWxmLmRlbGVnYXRvci5iZWxsID0gTW9jaygpCiAgICAgICAgIHNlbGYucGVyY29sYXRvci5pbnNlcnRmaWx0ZXIoc2VsZi5kZWxlZ2F0b3IpCi0gICAgICAgIHNlbGYuZGVsZWdhdG9yLmJlbGwgPSBNb2NrKHdyYXBzPXNlbGYuZGVsZWdhdG9yLmJlbGwpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYucGVyY29sYXRvci5yZW1vdmVmaWx0ZXIoc2VsZi5kZWxlZ2F0b3IpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93YXJuaW5nLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2FybmluZy5weQppbmRleCAxODYyN2RkLi5mMzI2OWYxIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93YXJuaW5nLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3dhcm5pbmcucHkKQEAgLTEsNCArMSw0IEBACi0nJydUZXN0IHdhcm5pbmdzIHJlcGxhY2VtZW50IGluIFB5U2hlbGwucHkgYW5kIHJ1bi5weS4KKycnJ1Rlc3Qgd2FybmluZ3MgcmVwbGFjZW1lbnQgaW4gcHlzaGVsbC5weSBhbmQgcnVuLnB5LgogCiBUaGlzIGZpbGUgY291bGQgYmUgZXhwYW5kZWQgdG8gaW5jbHVkZSB0cmFjZWJhY2sgb3ZlcnJpZGVzCiAoaW4gc2FtZSB0d28gbW9kdWxlcykuIElmIHNvLCBjaGFuZ2UgbmFtZS4KQEAgLTE3LDkgKzE3LDkgQEAKIHJ1bm5pbmdfaW5faWRsZSA9ICdpZGxlJyBpbiBzaG93d2FybmluZy5fX25hbWVfXwogCiBmcm9tIGlkbGVsaWIgaW1wb3J0IHJ1bgotZnJvbSBpZGxlbGliIGltcG9ydCBQeVNoZWxsIGFzIHNoZWxsCitmcm9tIGlkbGVsaWIgaW1wb3J0IHB5c2hlbGwgYXMgc2hlbGwKIAotIyBUaGUgZm9sbG93aW5nIHdhcyBnZW5lcmF0ZWQgZnJvbSBQeVNoZWxsLmlkbGVfZm9ybWF0d2FybmluZworIyBUaGUgZm9sbG93aW5nIHdhcyBnZW5lcmF0ZWQgZnJvbSBweXNoZWxsLmlkbGVfZm9ybWF0d2FybmluZwogIyBhbmQgY2hlY2tlZCBhcyBtYXRjaGluZyBleHBlY3RhdGlvbi4KIGlkbGVtc2cgPSAnJycKIFdhcm5pbmcgKGZyb20gd2FybmluZ3MgbW9kdWxlKToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkgYi9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTlmNjlhLi4wMDAwMDAwCi0tLSBhL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0iIiIKLVRoZSBzZXBhcmF0ZSBJZGxlIHZlcnNpb24gd2FzIGVsaW1pbmF0ZWQgeWVhcnMgYWdvOwotaWRsZWxpYi5pZGxldmVyIGlzIG5vIGxvbmdlciB1c2VkIGJ5IElkbGUKLWFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMy42IG9yIGxhdGVyLiAgVXNlCi0gICAgZnJvbSBzeXMgaW1wb3J0IHZlcnNpb24KLSAgICBJRExFX1ZFUlNJT04gPSB2ZXJzaW9uWzp2ZXJzaW9uLmluZGV4KCcgJyldCi0iIiIKLSMgS2VwdCBmb3Igbm93IG9ubHkgZm9yIHBvc3NpYmxlIGV4aXN0aW5nIGV4dGVuc2lvbiB1c2UKLWltcG9ydCB3YXJuaW5ncyBhcyB3Ci13Lndhcm4oX19kb2NfXywgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi1mcm9tIHN5cyBpbXBvcnQgdmVyc2lvbgotSURMRV9WRVJTSU9OID0gdmVyc2lvbls6dmVyc2lvbi5pbmRleCgnICcpXQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvSU9CaW5kaW5nLnB5IGIvTGliL2lkbGVsaWIvaW9tZW51LnB5CnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0lPQmluZGluZy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaW9tZW51LnB5CmluZGV4IDg0ZjM5YTIuLjM0MTRjN2IgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0lPQmluZGluZy5weQorKysgYi9MaWIvaWRsZWxpYi9pb21lbnUucHkKQEAgLTEwLDU3ICsxMCw2MCBAQAogaW1wb3J0IHRraW50ZXIubWVzc2FnZWJveCBhcyB0a01lc3NhZ2VCb3gKIGZyb20gdGtpbnRlci5zaW1wbGVkaWFsb2cgaW1wb3J0IGFza3N0cmluZwogCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2ltcG9ydCBpZGxlbGliCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCi0KLSMgVHJ5IHNldHRpbmcgdGhlIGxvY2FsZSwgc28gdGhhdCB3ZSBjYW4gZmluZCBvdXQKLSMgd2hhdCBlbmNvZGluZyB0byB1c2UKLXRyeToKLSAgICBpbXBvcnQgbG9jYWxlCi0gICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUsICIiKQotZXhjZXB0IChJbXBvcnRFcnJvciwgbG9jYWxlLkVycm9yKToKLSAgICBwYXNzCi0KLSMgRW5jb2RpbmcgZm9yIGZpbGUgbmFtZXMKLWZpbGVzeXN0ZW1lbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSAgIyMjIGN1cnJlbnRseSB1bnVzZWQKLQotbG9jYWxlX2VuY29kaW5nID0gJ2FzY2lpJwotaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6Ci0gICAgIyBPbiBXaW5kb3dzLCB3ZSBjb3VsZCB1c2UgIm1iY3MiLiBIb3dldmVyLCB0byBnaXZlIHRoZSB1c2VyCi0gICAgIyBhIHBvcnRhYmxlIGVuY29kaW5nIG5hbWUsIHdlIG5lZWQgdG8gZmluZCB0aGUgY29kZSBwYWdlCi0gICAgdHJ5OgotICAgICAgICBsb2NhbGVfZW5jb2RpbmcgPSBsb2NhbGUuZ2V0ZGVmYXVsdGxvY2FsZSgpWzFdCi0gICAgICAgIGNvZGVjcy5sb29rdXAobG9jYWxlX2VuY29kaW5nKQotICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKLSAgICAgICAgcGFzcworaWYgaWRsZWxpYi50ZXN0aW5nOiAgIyBTZXQgVHJ1ZSBieSB0ZXN0LnRlc3RfaWRsZSB0byBhdm9pZCBzZXRsb2NhbGUuCisgICAgZW5jb2RpbmcgPSAndXRmLTgnCiBlbHNlOgorICAgICMgVHJ5IHNldHRpbmcgdGhlIGxvY2FsZSwgc28gdGhhdCB3ZSBjYW4gZmluZCBvdXQKKyAgICAjIHdoYXQgZW5jb2RpbmcgdG8gdXNlCiAgICAgdHJ5OgotICAgICAgICAjIERpZmZlcmVudCB0aGluZ3MgY2FuIGZhaWwgaGVyZTogdGhlIGxvY2FsZSBtb2R1bGUgbWF5IG5vdCBiZQotICAgICAgICAjIGxvYWRlZCwgaXQgbWF5IG5vdCBvZmZlciBubF9sYW5naW5mbywgb3IgQ09ERVNFVCwgb3IgdGhlCi0gICAgICAgICMgcmVzdWx0aW5nIGNvZGVzZXQgbWF5IGJlIHVua25vd24gdG8gUHl0aG9uLiBXZSBpZ25vcmUgYWxsCi0gICAgICAgICMgdGhlc2UgcHJvYmxlbXMsIGZhbGxpbmcgYmFjayB0byBBU0NJSQotICAgICAgICBsb2NhbGVfZW5jb2RpbmcgPSBsb2NhbGUubmxfbGFuZ2luZm8obG9jYWxlLkNPREVTRVQpCi0gICAgICAgIGlmIGxvY2FsZV9lbmNvZGluZyBpcyBOb25lIG9yIGxvY2FsZV9lbmNvZGluZyBpcyAnJzoKLSAgICAgICAgICAgICMgc2l0dWF0aW9uIG9jY3VycyBvbiBNYWMgT1MgWAotICAgICAgICAgICAgbG9jYWxlX2VuY29kaW5nID0gJ2FzY2lpJwotICAgICAgICBjb2RlY3MubG9va3VwKGxvY2FsZV9lbmNvZGluZykKLSAgICBleGNlcHQgKE5hbWVFcnJvciwgQXR0cmlidXRlRXJyb3IsIExvb2t1cEVycm9yKToKLSAgICAgICAgIyBUcnkgZ2V0ZGVmYXVsdGxvY2FsZTogaXQgcGFyc2VzIGVudmlyb25tZW50IHZhcmlhYmxlcywKLSAgICAgICAgIyB3aGljaCBtYXkgZ2l2ZSBhIGNsdWUuIFVuZm9ydHVuYXRlbHksIGdldGRlZmF1bHRsb2NhbGUgaGFzCi0gICAgICAgICMgYnVncyB0aGF0IGNhbiBjYXVzZSBWYWx1ZUVycm9yLgorICAgICAgICBpbXBvcnQgbG9jYWxlCisgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NUWVBFLCAiIikKKyAgICBleGNlcHQgKEltcG9ydEVycm9yLCBsb2NhbGUuRXJyb3IpOgorICAgICAgICBwYXNzCisKKyAgICBsb2NhbGVfZGVjb2RlID0gJ2FzY2lpJworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAjIE9uIFdpbmRvd3MsIHdlIGNvdWxkIHVzZSAibWJjcyIuIEhvd2V2ZXIsIHRvIGdpdmUgdGhlIHVzZXIKKyAgICAgICAgIyBhIHBvcnRhYmxlIGVuY29kaW5nIG5hbWUsIHdlIG5lZWQgdG8gZmluZCB0aGUgY29kZSBwYWdlCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGxvY2FsZV9lbmNvZGluZyA9IGxvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKClbMV0KKyAgICAgICAgICAgIGNvZGVjcy5sb29rdXAobG9jYWxlX2VuY29kaW5nKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBEaWZmZXJlbnQgdGhpbmdzIGNhbiBmYWlsIGhlcmU6IHRoZSBsb2NhbGUgbW9kdWxlIG1heSBub3QgYmUKKyAgICAgICAgICAgICMgbG9hZGVkLCBpdCBtYXkgbm90IG9mZmVyIG5sX2xhbmdpbmZvLCBvciBDT0RFU0VULCBvciB0aGUKKyAgICAgICAgICAgICMgcmVzdWx0aW5nIGNvZGVzZXQgbWF5IGJlIHVua25vd24gdG8gUHl0aG9uLiBXZSBpZ25vcmUgYWxsCisgICAgICAgICAgICAjIHRoZXNlIHByb2JsZW1zLCBmYWxsaW5nIGJhY2sgdG8gQVNDSUkKKyAgICAgICAgICAgIGxvY2FsZV9lbmNvZGluZyA9IGxvY2FsZS5ubF9sYW5naW5mbyhsb2NhbGUuQ09ERVNFVCkKICAgICAgICAgICAgIGlmIGxvY2FsZV9lbmNvZGluZyBpcyBOb25lIG9yIGxvY2FsZV9lbmNvZGluZyBpcyAnJzoKICAgICAgICAgICAgICAgICAjIHNpdHVhdGlvbiBvY2N1cnMgb24gTWFjIE9TIFgKICAgICAgICAgICAgICAgICBsb2NhbGVfZW5jb2RpbmcgPSAnYXNjaWknCiAgICAgICAgICAgICBjb2RlY3MubG9va3VwKGxvY2FsZV9lbmNvZGluZykKLSAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBMb29rdXBFcnJvcik6Ci0gICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCAoTmFtZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgTG9va3VwRXJyb3IpOgorICAgICAgICAgICAgIyBUcnkgZ2V0ZGVmYXVsdGxvY2FsZTogaXQgcGFyc2VzIGVudmlyb25tZW50IHZhcmlhYmxlcywKKyAgICAgICAgICAgICMgd2hpY2ggbWF5IGdpdmUgYSBjbHVlLiBVbmZvcnR1bmF0ZWx5LCBnZXRkZWZhdWx0bG9jYWxlIGhhcworICAgICAgICAgICAgIyBidWdzIHRoYXQgY2FuIGNhdXNlIFZhbHVlRXJyb3IuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbG9jYWxlX2VuY29kaW5nID0gbG9jYWxlLmdldGRlZmF1bHRsb2NhbGUoKVsxXQorICAgICAgICAgICAgICAgIGlmIGxvY2FsZV9lbmNvZGluZyBpcyBOb25lIG9yIGxvY2FsZV9lbmNvZGluZyBpcyAnJzoKKyAgICAgICAgICAgICAgICAgICAgIyBzaXR1YXRpb24gb2NjdXJzIG9uIE1hYyBPUyBYCisgICAgICAgICAgICAgICAgICAgIGxvY2FsZV9lbmNvZGluZyA9ICdhc2NpaScKKyAgICAgICAgICAgICAgICBjb2RlY3MubG9va3VwKGxvY2FsZV9lbmNvZGluZykKKyAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgTG9va3VwRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKIAotbG9jYWxlX2VuY29kaW5nID0gbG9jYWxlX2VuY29kaW5nLmxvd2VyKCkKKyAgICBsb2NhbGVfZW5jb2RpbmcgPSBsb2NhbGVfZW5jb2RpbmcubG93ZXIoKQogCi1lbmNvZGluZyA9IGxvY2FsZV9lbmNvZGluZyAgIyMjIEtCSyAwN1NlcDA3ICBUaGlzIGlzIHVzZWQgYWxsIG92ZXIgSURMRSwgY2hlY2shCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjICdlbmNvZGluZycgaXMgdXNlZCBiZWxvdyBpbiBlbmNvZGUoKSwgY2hlY2shCisgICAgZW5jb2RpbmcgPSBsb2NhbGVfZW5jb2RpbmcKKyAgICAjIEVuY29kaW5nIGlzIHVzZWQgaW4gbXVsdGlwbGUgZmlsZXM7IGxvY2FsZV9lbmNvZGluZyBub3doZXJlLgorICAgICMgVGhlIG9ubHkgdXNlIG9mICdlbmNvZGluZycgYmVsb3cgaXMgaW4gX2RlY29kZSBhcyBpbml0aWFsIHZhbHVlCisgICAgIyBvZiBkZXByZWNhdGVkIGJsb2NrIGFza2luZyB1c2VyIGZvciBlbmNvZGluZy4KKyAgICAjIFBlcmhhcHMgdXNlIGVsc2V3aGVyZSBzaG91bGQgYmUgcmV2aWV3ZWQuCiAKIGNvZGluZ19yZSA9IHJlLmNvbXBpbGUocideWyBcdFxmXSojLio/Y29kaW5nWzo9XVsgXHRdKihbLVx3Ll0rKScsIHJlLkFTQ0lJKQogYmxhbmtfcmUgPSByZS5jb21waWxlKHInXlsgXHRcZl0qKD86WyNcclxuXXwkKScsIHJlLkFTQ0lJKQpAQCAtMTA3LDYgKzExMCw5IEBACiAKIAogY2xhc3MgSU9CaW5kaW5nOgorIyBPbmUgaW5zdGFuY2UgcGVyIGVkaXRvciBXaW5kb3cgc28gbWV0aG9kcyBrbm93IHdoaWNoIHRvIHNhdmUsIGNsb3NlLgorIyBPcGVuIHJldHVybnMgZm9jdXMgdG8gc2VsZi5lZGl0d2luIGlmIGFib3J0ZWQuCisjIEVkaXRvcldpbmRvdy5vcGVuX21vZHVsZSwgb3RoZXJzLCBiZWxvbmcgaGVyZS4KIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luKToKICAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgpAQCAtMzAxLDcgKzMwNyw3IEBACiAgICAgICAgICAgICAgICAgIlRoZSBmaWxlJ3MgZW5jb2RpbmcgaXMgaW52YWxpZCBmb3IgUHl0aG9uIDMueC5cbiIKICAgICAgICAgICAgICAgICAiSURMRSB3aWxsIGNvbnZlcnQgaXQgdG8gVVRGLTguXG4iCiAgICAgICAgICAgICAgICAgIldoYXQgaXMgdGhlIGN1cnJlbnQgZW5jb2Rpbmcgb2YgdGhlIGZpbGU/IiwKLSAgICAgICAgICAgICAgICBpbml0aWFsdmFsdWUgPSBsb2NhbGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgaW5pdGlhbHZhbHVlID0gZW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5lZGl0d2luLnRleHQpCiAKICAgICAgICAgICAgIGlmIGVuYzoKQEAgLTUyOSw4ICs1MzUsOCBAQAogCiAgICAgcm9vdCA9IFRvcGxldmVsKHBhcmVudCkKICAgICByb290LnRpdGxlKCJUZXN0IElPQmluZGluZyIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiICUgKHgsIHkgKyAxNzUpKQogICAgIGNsYXNzIE15RWRpdFdpbjoKICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQpOgogICAgICAgICAgICAgc2VsZi50ZXh0ID0gdGV4dApAQCAtNTYxLDUgKzU2Nyw4IEBACiAgICAgSU9CaW5kaW5nKGVkaXR3aW4pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9pb21lbnUnLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfaW9fYmluZGluZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL21hY29zeFN1cHBvcnQucHkgYi9MaWIvaWRsZWxpYi9tYWNvc3gucHkKc2ltaWxhcml0eSBpbmRleCA3OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvbWFjb3N4LnB5CmluZGV4IGI5NmJhZTEuLmMyMjVkZDkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL21hY29zeFN1cHBvcnQucHkKKysrIGIvTGliL2lkbGVsaWIvbWFjb3N4LnB5CkBAIC0xLDMwICsxLDI1IEBACiAiIiIKIEEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0aGF0IGVuaGFuY2UgSURMRSBvbiBNYWMgT1NYLgogIiIiCi1pbXBvcnQgc3lzCi1pbXBvcnQgdGtpbnRlcgotZnJvbSBvcyBpbXBvcnQgcGF0aAorZnJvbSBzeXMgaW1wb3J0IHBsYXRmb3JtICAjIFVzZWQgaW4gX2luaXRfdGtfdHlwZSwgY2hhbmdlZCBieSB0ZXN0LgogaW1wb3J0IHdhcm5pbmdzCiAKLWRlZiBydW5uaW5nQXNPU1hBcHAoKToKLSAgICB3YXJuaW5ncy53YXJuKCJydW5uaW5nQXNPU1hBcHAoKSBpcyBkZXByZWNhdGVkLCB1c2UgaXNBcXVhVGsoKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLSAgICByZXR1cm4gaXNBcXVhVGsoKQoraW1wb3J0IHRraW50ZXIKIAotZGVmIGlzQ2FyYm9uQXF1YVRrKHJvb3QpOgotICAgIHdhcm5pbmdzLndhcm4oImlzQ2FyYm9uQXF1YVRrKHJvb3QpIGlzIGRlcHJlY2F0ZWQsIHVzZSBpc0NhcmJvblRrKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgcmV0dXJuIGlzQ2FyYm9uVGsoKQorCisjIyBEZWZpbmUgZnVuY3Rpb25zIHRoYXQgcXVlcnkgdGhlIE1hYyBncmFwaGljcyB0eXBlLgorIyMgX3RrX3R5cGUgYW5kIGl0cyBpbml0aWFsaXplciBhcmUgcHJpdmF0ZSB0byB0aGlzIHNlY3Rpb24uCiAKIF90a190eXBlID0gTm9uZQogCi1kZWYgX2luaXRpYWxpemVUa1ZhcmlhbnRUZXN0cyhyb290KToKK2RlZiBfaW5pdF90a190eXBlKCk6CiAgICAgIiIiCiAgICAgSW5pdGlhbGl6ZXMgT1MgWCBUayB2YXJpYW50IHZhbHVlcyBmb3IKICAgICBpc0FxdWFUaygpLCBpc0NhcmJvblRrKCksIGlzQ29jb2FUaygpLCBhbmQgaXNYUXVhcnR6KCkuCiAgICAgIiIiCiAgICAgZ2xvYmFsIF90a190eXBlCi0gICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgIGlmIHBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICByb290ID0gdGtpbnRlci5UaygpCiAgICAgICAgIHdzID0gcm9vdC50ay5jYWxsKCd0aycsICd3aW5kb3dpbmdzeXN0ZW0nKQogICAgICAgICBpZiAneDExJyBpbiB3czoKICAgICAgICAgICAgIF90a190eXBlID0gInhxdWFydHoiCkBAIC0zNCw2ICsyOSw3IEBACiAgICAgICAgICAgICBfdGtfdHlwZSA9ICJjb2NvYSIKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIF90a190eXBlID0gImNhcmJvbiIKKyAgICAgICAgcm9vdC5kZXN0cm95KCkKICAgICBlbHNlOgogICAgICAgICBfdGtfdHlwZSA9ICJvdGhlciIKIApAQCAtNDEsNyArMzcsOCBAQAogICAgICIiIgogICAgIFJldHVybnMgVHJ1ZSBpZiBJRExFIGlzIHVzaW5nIGEgbmF0aXZlIE9TIFggVGsgKENvY29hIG9yIENhcmJvbikuCiAgICAgIiIiCi0gICAgYXNzZXJ0IF90a190eXBlIGlzIG5vdCBOb25lCisgICAgaWYgbm90IF90a190eXBlOgorICAgICAgICBfaW5pdF90a190eXBlKCkKICAgICByZXR1cm4gX3RrX3R5cGUgPT0gImNvY29hIiBvciBfdGtfdHlwZSA9PSAiY2FyYm9uIgogCiBkZWYgaXNDYXJib25UaygpOgpAQCAtNDksMjMgKzQ2LDI3IEBACiAgICAgUmV0dXJucyBUcnVlIGlmIElETEUgaXMgdXNpbmcgYSBDYXJib24gQXF1YSBUayAoaW5zdGVhZCBvZiB0aGUKICAgICBuZXdlciBDb2NvYSBBcXVhIFRrKS4KICAgICAiIiIKLSAgICBhc3NlcnQgX3RrX3R5cGUgaXMgbm90IE5vbmUKKyAgICBpZiBub3QgX3RrX3R5cGU6CisgICAgICAgIF9pbml0X3RrX3R5cGUoKQogICAgIHJldHVybiBfdGtfdHlwZSA9PSAiY2FyYm9uIgogCiBkZWYgaXNDb2NvYVRrKCk6CiAgICAgIiIiCiAgICAgUmV0dXJucyBUcnVlIGlmIElETEUgaXMgdXNpbmcgYSBDb2NvYSBBcXVhIFRrLgogICAgICIiIgotICAgIGFzc2VydCBfdGtfdHlwZSBpcyBub3QgTm9uZQorICAgIGlmIG5vdCBfdGtfdHlwZToKKyAgICAgICAgX2luaXRfdGtfdHlwZSgpCiAgICAgcmV0dXJuIF90a190eXBlID09ICJjb2NvYSIKIAogZGVmIGlzWFF1YXJ0eigpOgogICAgICIiIgogICAgIFJldHVybnMgVHJ1ZSBpZiBJRExFIGlzIHVzaW5nIGFuIE9TIFggWDExIFRrLgogICAgICIiIgotICAgIGFzc2VydCBfdGtfdHlwZSBpcyBub3QgTm9uZQorICAgIGlmIG5vdCBfdGtfdHlwZToKKyAgICAgICAgX2luaXRfdGtfdHlwZSgpCiAgICAgcmV0dXJuIF90a190eXBlID09ICJ4cXVhcnR6IgogCisKIGRlZiB0a1ZlcnNpb25XYXJuaW5nKHJvb3QpOgogICAgICIiIgogICAgIFJldHVybnMgYSBzdHJpbmcgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBUayB2ZXJzaW9uIGluIHVzZSBhcHBlYXJzIHRvCkBAIC04Niw2ICs4Nyw5IEBACiAgICAgZWxzZToKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKKworIyMgRml4IHRoZSBtZW51IGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKwogZGVmIGFkZE9wZW5FdmVudFN1cHBvcnQocm9vdCwgZmxpc3QpOgogICAgICIiIgogICAgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlc3BvbmQgdG8gb3BlbiBBcHBsZUV2ZW50cywgd2hpY2gKQEAgLTEyNCwyMyArMTI4LDIzIEBACiAgICAgIyBEdWUgdG8gYSAobWlzLSlmZWF0dXJlIG9mIFRrQXF1YSB0aGUgdXNlciB3aWxsIGFsc28gc2VlIGFuIGVtcHR5IEhlbHAKICAgICAjIG1lbnUuCiAgICAgZnJvbSB0a2ludGVyIGltcG9ydCBNZW51Ci0gICAgZnJvbSBpZGxlbGliIGltcG9ydCBCaW5kaW5ncwotICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgV2luZG93TGlzdAorICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgbWFpbm1lbnUKKyAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IHdpbmRvd3MKIAotICAgIGNsb3NlSXRlbSA9IEJpbmRpbmdzLm1lbnVkZWZzWzBdWzFdWy0yXQorICAgIGNsb3NlSXRlbSA9IG1haW5tZW51Lm1lbnVkZWZzWzBdWzFdWy0yXQogCiAgICAgIyBSZW1vdmUgdGhlIGxhc3QgMyBpdGVtcyBvZiB0aGUgZmlsZSBtZW51OiBhIHNlcGFyYXRvciwgY2xvc2Ugd2luZG93IGFuZAogICAgICMgcXVpdC4gQ2xvc2Ugd2luZG93IHdpbGwgYmUgcmVpbnNlcnRlZCBqdXN0IGFib3ZlIHRoZSBzYXZlIGl0ZW0sIHdoZXJlCiAgICAgIyBpdCBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBISUcuIFF1aXQgaXMgaW4gdGhlIGFwcGxpY2F0aW9uIG1lbnUuCi0gICAgZGVsIEJpbmRpbmdzLm1lbnVkZWZzWzBdWzFdWy0zOl0KLSAgICBCaW5kaW5ncy5tZW51ZGVmc1swXVsxXS5pbnNlcnQoNiwgY2xvc2VJdGVtKQorICAgIGRlbCBtYWlubWVudS5tZW51ZGVmc1swXVsxXVstMzpdCisgICAgbWFpbm1lbnUubWVudWRlZnNbMF1bMV0uaW5zZXJ0KDYsIGNsb3NlSXRlbSkKIAogICAgICMgUmVtb3ZlIHRoZSAnQWJvdXQnIGVudHJ5IGZyb20gdGhlIGhlbHAgbWVudSwgaXQgaXMgaW4gdGhlIGFwcGxpY2F0aW9uCiAgICAgIyBtZW51Ci0gICAgZGVsIEJpbmRpbmdzLm1lbnVkZWZzWy0xXVsxXVswOjJdCisgICAgZGVsIG1haW5tZW51Lm1lbnVkZWZzWy0xXVsxXVswOjJdCiAgICAgIyBSZW1vdmUgdGhlICdDb25maWd1cmUgSWRsZScgZW50cnkgZnJvbSB0aGUgb3B0aW9ucyBtZW51LCBpdCBpcyBpbiB0aGUKICAgICAjIGFwcGxpY2F0aW9uIG1lbnUgYXMgJ1ByZWZlcmVuY2VzJwotICAgIGRlbCBCaW5kaW5ncy5tZW51ZGVmc1stMl1bMV1bMF0KKyAgICBkZWwgbWFpbm1lbnUubWVudWRlZnNbLTJdWzFdWzBdCiAgICAgbWVudWJhciA9IE1lbnUocm9vdCkKICAgICByb290LmNvbmZpZ3VyZShtZW51PW1lbnViYXIpCiAgICAgbWVudWRpY3QgPSB7fQpAQCAtMTU1LDMwICsxNTksMzAgQEAKIAogICAgICAgICBpZiBlbmQgPiAwOgogICAgICAgICAgICAgbWVudS5kZWxldGUoMCwgZW5kKQotICAgICAgICBXaW5kb3dMaXN0LmFkZF93aW5kb3dzX3RvX21lbnUobWVudSkKLSAgICBXaW5kb3dMaXN0LnJlZ2lzdGVyX2NhbGxiYWNrKHBvc3R3aW5kb3dzbWVudSkKKyAgICAgICAgd2luZG93cy5hZGRfd2luZG93c190b19tZW51KG1lbnUpCisgICAgd2luZG93cy5yZWdpc3Rlcl9jYWxsYmFjayhwb3N0d2luZG93c21lbnUpCiAKICAgICBkZWYgYWJvdXRfZGlhbG9nKGV2ZW50PU5vbmUpOgogICAgICAgICAiSGFuZGxlIEhlbHAgJ0Fib3V0IElETEUnIGV2ZW50LiIKLSAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIEVkaXRvcldpbmRvdy5FZGl0b3JXaW5kb3cuYWJvdXRfZGlhbG9nLgotICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGFib3V0RGlhbG9nCi0gICAgICAgIGFib3V0RGlhbG9nLkFib3V0RGlhbG9nKHJvb3QsICdBYm91dCBJRExFJykKKyAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIGVkaXRvci5FZGl0b3JXaW5kb3cuYWJvdXRfZGlhbG9nLgorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGhlbHBfYWJvdXQKKyAgICAgICAgaGVscF9hYm91dC5BYm91dERpYWxvZyhyb290LCAnQWJvdXQgSURMRScpCiAKICAgICBkZWYgY29uZmlnX2RpYWxvZyhldmVudD1Ob25lKToKICAgICAgICAgIkhhbmRsZSBPcHRpb25zICdDb25maWd1cmUgSURMRScgZXZlbnQuIgotICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggRWRpdG9yV2luZG93LkVkaXRvcldpbmRvdy5jb25maWdfZGlhbG9nLgotICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ0RpYWxvZworICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggZWRpdG9yLkVkaXRvcldpbmRvdy5jb25maWdfZGlhbG9nLgorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ2RpYWxvZwogCiAgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIHJvb3Qgb2JqZWN0IGhhcyBhbiBpbnN0YW5jZV9kaWN0IGF0dHJpYnV0ZSwKICAgICAgICAgIyBtaXJyb3JzIGNvZGUgaW4gRWRpdG9yV2luZG93IChhbHRob3VnaCB0aGF0IHNldHMgdGhlIGF0dHJpYnV0ZQogICAgICAgICAjIG9uIGFuIEVkaXRvcldpbmRvdyBpbnN0YW5jZSB0aGF0IGlzIHRoZW4gcGFzc2VkIGFzIHRoZSBmaXJzdAogICAgICAgICAjIGFyZ3VtZW50IHRvIENvbmZpZ0RpYWxvZykKICAgICAgICAgcm9vdC5pbnN0YW5jZV9kaWN0ID0gZmxpc3QuaW52ZXJzZWRpY3QKLSAgICAgICAgY29uZmlnRGlhbG9nLkNvbmZpZ0RpYWxvZyhyb290LCAnU2V0dGluZ3MnKQorICAgICAgICBjb25maWdkaWFsb2cuQ29uZmlnRGlhbG9nKHJvb3QsICdTZXR0aW5ncycpCiAKICAgICBkZWYgaGVscF9kaWFsb2coZXZlbnQ9Tm9uZSk6CiAgICAgICAgICJIYW5kbGUgSGVscCAnSURMRSBIZWxwJyBldmVudC4iCi0gICAgICAgICMgU3luY2hyb25pemUgd2l0aCBFZGl0b3JXaW5kb3cuRWRpdG9yV2luZG93LmhlbHBfZGlhbG9nLgorICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggZWRpdG9yLkVkaXRvcldpbmRvdy5oZWxwX2RpYWxvZy4KICAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBoZWxwCiAgICAgICAgIGhlbHAuc2hvd19pZGxlaGVscChyb290KQogCkBAIC0xOTgsMjkgKzIwMiwzMyBAQAogICAgICAgICBtZW51ZGljdFsnYXBwbGljYXRpb24nXSA9IG1lbnUgPSBNZW51KG1lbnViYXIsIG5hbWU9J2FwcGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFyb2ZmPTApCiAgICAgICAgIG1lbnViYXIuYWRkX2Nhc2NhZGUobGFiZWw9J0lETEUnLCBtZW51PW1lbnUpCi0gICAgICAgIEJpbmRpbmdzLm1lbnVkZWZzLmluc2VydCgwLAorICAgICAgICBtYWlubWVudS5tZW51ZGVmcy5pbnNlcnQoMCwKICAgICAgICAgICAgICgnYXBwbGljYXRpb24nLCBbCiAgICAgICAgICAgICAgICAgKCdBYm91dCBJRExFJywgJzw8YWJvdXQtaWRsZT4+JyksCiAgICAgICAgICAgICAgICAgICAgIE5vbmUsCiAgICAgICAgICAgICAgICAgXSkpCi0gICAgICAgIHRrdmVyc2lvbiA9IHJvb3QudGsuZXZhbCgnaW5mbyBwYXRjaGxldmVsJykKLSAgICAgICAgaWYgdHVwbGUobWFwKGludCwgdGt2ZXJzaW9uLnNwbGl0KCcuJykpKSA8ICg4LCA0LCAxNCk6Ci0gICAgICAgICAgICAjIGZvciBlYXJsaWVyIEFxdWFUayB2ZXJzaW9ucywgc3VwcGx5IGEgUHJlZmVyZW5jZXMgbWVudSBpdGVtCi0gICAgICAgICAgICBCaW5kaW5ncy5tZW51ZGVmc1swXVsxXS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgICgnX1ByZWZlcmVuY2VzLi4uLicsICc8PG9wZW4tY29uZmlnLWRpYWxvZz4+JyksCi0gICAgICAgICAgICAgICAgKQogICAgIGlmIGlzQ29jb2FUaygpOgogICAgICAgICAjIHJlcGxhY2UgZGVmYXVsdCBBYm91dCBkaWFsb2cgd2l0aCBBYm91dCBJRExFIG9uZQogICAgICAgICByb290LmNyZWF0ZWNvbW1hbmQoJ3RrQWJvdXREaWFsb2cnLCBhYm91dF9kaWFsb2cpCiAgICAgICAgICMgcmVwbGFjZSBkZWZhdWx0ICJIZWxwIiBpdGVtIGluIEhlbHAgbWVudQogICAgICAgICByb290LmNyZWF0ZWNvbW1hbmQoJzo6dGs6Om1hYzo6U2hvd0hlbHAnLCBoZWxwX2RpYWxvZykKICAgICAgICAgIyByZW1vdmUgcmVkdW5kYW50ICJJRExFIEhlbHAiIGZyb20gbWVudQotICAgICAgICBkZWwgQmluZGluZ3MubWVudWRlZnNbLTFdWzFdWzBdCisgICAgICAgIGRlbCBtYWlubWVudS5tZW51ZGVmc1stMV1bMV1bMF0KKworZGVmIGZpeGIyY29udGV4dChyb290KToKKyAgICAnJydSZW1vdmVkIGJhZCBBcXVhVGsgQnV0dG9uLTIgKHJpZ2h0KSBhbmQgUGFzdGUgYmluZGluZ3MuCisKKyAgICBUaGV5IHByZXZlbnQgY29udGV4dCBtZW51IGFjY2VzcyBhbmQgc2VlbSB0byBiZSBnb25lIGluIEFxdWFUazguNi4KKyAgICBTZWUgaXNzdWUgIzI0ODAxLgorICAgICcnJworICAgIHJvb3QudW5iaW5kX2NsYXNzKCdUZXh0JywgJzxCMj4nKQorICAgIHJvb3QudW5iaW5kX2NsYXNzKCdUZXh0JywgJzxCMi1Nb3Rpb24+JykKKyAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8PFBhc3RlU2VsZWN0aW9uPj4nKQogCiBkZWYgc2V0dXBBcHAocm9vdCwgZmxpc3QpOgogICAgICIiIgogICAgIFBlcmZvcm0gaW5pdGlhbCBPUyBYIGN1c3RvbWl6YXRpb25zIGlmIG5lZWRlZC4KLSAgICBDYWxsZWQgZnJvbSBQeVNoZWxsLm1haW4oKSBhZnRlciBpbml0aWFsIGNhbGxzIHRvIFRrKCkKKyAgICBDYWxsZWQgZnJvbSBweXNoZWxsLm1haW4oKSBhZnRlciBpbml0aWFsIGNhbGxzIHRvIFRrKCkKIAogICAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgbWFqb3IgdmVyc2lvbnMgb2YgVGsgaW4gdXNlIG9uIE9TIFg6CiAgICAgICAgIDEuIEFxdWEgQ29jb2EgVGsgKG5hdGl2ZSBkZWZhdWx0IHNpbmNlIE9TIFggMTAuNikKQEAgLTIzMyw4ICsyNDEsMTMgQEAKICAgICBpc0FxdWFUaygpLCBpc0NhcmJvblRrKCksIGlzQ29jb2FUaygpLCBpc1hRdWFydHooKSBmdW5jdGlvbnMgd2hpY2gKICAgICBhcmUgaW5pdGlhbGl6ZWQgaGVyZSBhcyB3ZWxsLgogICAgICIiIgotICAgIF9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMocm9vdCkKICAgICBpZiBpc0FxdWFUaygpOgogICAgICAgICBoaWRlVGtDb25zb2xlKHJvb3QpCiAgICAgICAgIG92ZXJyaWRlUm9vdE1lbnUocm9vdCwgZmxpc3QpCiAgICAgICAgIGFkZE9wZW5FdmVudFN1cHBvcnQocm9vdCwgZmxpc3QpCisgICAgICAgIGZpeGIyY29udGV4dChyb290KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgZnJvbSB1bml0dGVzdCBpbXBvcnQgbWFpbgorICAgIG1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfbWFjb3N4JywgdmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weSBiL0xpYi9pZGxlbGliL21haW5tZW51LnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0JpbmRpbmdzLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9tYWlubWVudS5weQppbmRleCBhYjI1ZmYxLi45NjVhZGEzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weQorKysgYi9MaWIvaWRsZWxpYi9tYWlubWVudS5weQpAQCAtMTAsOSArMTAsOSBAQAogIiIiCiBmcm9tIGltcG9ydGxpYi51dGlsIGltcG9ydCBmaW5kX3NwZWMKIAotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCi0jICAgV2FybmluZzogbWVudWRlZnMgaXMgYWx0ZXJlZCBpbiBtYWNvc3hTdXBwb3J0Lm92ZXJyaWRlUm9vdE1lbnUoKQorIyAgIFdhcm5pbmc6IG1lbnVkZWZzIGlzIGFsdGVyZWQgaW4gbWFjb3N4Lm92ZXJyaWRlUm9vdE1lbnUoKQogIyAgIGFmdGVyIGl0IGlzIGRldGVybWluZWQgdGhhdCBhbiBPUyBYIEFxdWEgVGsgaXMgaW4gdXNlLAogIyAgIHdoaWNoIGNhbm5vdCBiZSBkb25lIHVudGlsIGFmdGVyIFRrKCkgaXMgZmlyc3QgY2FsbGVkLgogIyAgIERvIG5vdCBhbHRlciB0aGUgJ2ZpbGUnLCAnb3B0aW9ucycsIG9yICdoZWxwJyBjYXNjYWRlcyBoZXJlCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9NdWx0aUNhbGwucHkgYi9MaWIvaWRsZWxpYi9tdWx0aWNhbGwucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvTXVsdGlDYWxsLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9tdWx0aWNhbGwucHkKaW5kZXggODQ2Mjg1NC4uYjc0ZmVkNCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvTXVsdGlDYWxsLnB5CisrKyBiL0xpYi9pZGxlbGliL211bHRpY2FsbC5weQpAQCAtMjgsOSArMjgsOSBAQAogICAgdW5sZXNzIHRoaXMgY29uZmxpY3RzIHdpdGggdGhlIGZpcnN0IHJ1bGUuCiBFYWNoIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBmb3IgZWFjaCBldmVudC4KICIiIgotCi1pbXBvcnQgc3lzCiBpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKwogaW1wb3J0IHRraW50ZXIKIAogIyB0aGUgZXZlbnQgdHlwZSBjb25zdGFudHMsIHdoaWNoIGRlZmluZSB0aGUgbWVhbmluZyBvZiBtY190eXBlCkBAIC00MTQsMTIgKzQxNCwxMiBAQAogICAgIHJldHVybiBNdWx0aUNhbGwKIAogCi1kZWYgX211bHRpX2NhbGwocGFyZW50KToKLSAgICByb290ID0gdGtpbnRlci5UaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBNdWx0aUNhbGwiKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKLSAgICB0ZXh0ID0gTXVsdGlDYWxsQ3JlYXRvcih0a2ludGVyLlRleHQpKHJvb3QpCitkZWYgX211bHRpX2NhbGwocGFyZW50KTogICMgaHRlc3QgIworICAgIHRvcCA9IHRraW50ZXIuVG9wbGV2ZWwocGFyZW50KQorICAgIHRvcC50aXRsZSgiVGVzdCBNdWx0aUNhbGwiKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSArIDE3NSkpCisgICAgdGV4dCA9IE11bHRpQ2FsbENyZWF0b3IodGtpbnRlci5UZXh0KSh0b3ApCiAgICAgdGV4dC5wYWNrKCkKICAgICBkZWYgYmluZHNlcShzZXEsIG49WzBdKToKICAgICAgICAgZGVmIGhhbmRsZXIoZXZlbnQpOgpAQCAtNDM5LDcgKzQzOSw2IEBACiAgICAgYmluZHNlcSgiPEZvY3VzT3V0PiIpCiAgICAgYmluZHNlcSgiPEVudGVyPiIpCiAgICAgYmluZHNlcSgiPExlYXZlPiIpCi0gICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9PdXRwdXRXaW5kb3cucHkgYi9MaWIvaWRsZWxpYi9vdXR3aW4ucHkKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvT3V0cHV0V2luZG93LnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9vdXR3aW4ucHkKaW5kZXggZTYxNGY5Yi4uZjZkMjkxNSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvT3V0cHV0V2luZG93LnB5CisrKyBiL0xpYi9pZGxlbGliL291dHdpbi5weQpAQCAtMSw4ICsxLDExIEBACi1mcm9tIHRraW50ZXIgaW1wb3J0ICoKLWZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdwogaW1wb3J0IHJlCisKK2Zyb20gdGtpbnRlciBpbXBvcnQgKgogaW1wb3J0IHRraW50ZXIubWVzc2FnZWJveCBhcyB0a01lc3NhZ2VCb3gKLWZyb20gaWRsZWxpYiBpbXBvcnQgSU9CaW5kaW5nCisKK2Zyb20gaWRsZWxpYi5lZGl0b3IgaW1wb3J0IEVkaXRvcldpbmRvdworZnJvbSBpZGxlbGliIGltcG9ydCBpb21lbnUKKwogCiBjbGFzcyBPdXRwdXRXaW5kb3coRWRpdG9yV2luZG93KToKIApAQCAtMzYsNyArMzksNyBAQAogCiAgICAgZGVmIHdyaXRlKHNlbGYsIHMsIHRhZ3M9KCksIG1hcms9Imluc2VydCIpOgogICAgICAgICBpZiBpc2luc3RhbmNlKHMsIChieXRlcywgYnl0ZXMpKToKLSAgICAgICAgICAgIHMgPSBzLmRlY29kZShJT0JpbmRpbmcuZW5jb2RpbmcsICJyZXBsYWNlIikKKyAgICAgICAgICAgIHMgPSBzLmRlY29kZShpb21lbnUuZW5jb2RpbmcsICJyZXBsYWNlIikKICAgICAgICAgc2VsZi50ZXh0Lmluc2VydChtYXJrLCBzLCB0YWdzKQogICAgICAgICBzZWxmLnRleHQuc2VlKG1hcmspCiAgICAgICAgIHNlbGYudGV4dC51cGRhdGUoKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRm9ybWF0UGFyYWdyYXBoLnB5IGIvTGliL2lkbGVsaWIvcGFyYWdyYXBoLnB5CnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcGFyYWdyYXBoLnB5CmluZGV4IDdhOWQxODUuLmYxMWJkYWUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weQorKysgYi9MaWIvaWRsZWxpYi9wYXJhZ3JhcGgucHkKQEAgLTE0LDkgKzE0LDEwIEBACiAgIHNwYWNlcywgdGhleSB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHNhbWUgYmxvY2suCiAqIEZhbmN5IGNvbW1lbnRzLCBsaWtlIHRoaXMgYnVsbGV0ZWQgbGlzdCwgYXJlbid0IGhhbmRsZWQgOi0pCiAiIiIKLQogaW1wb3J0IHJlCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKKworZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKKwogCiBjbGFzcyBGb3JtYXRQYXJhZ3JhcGg6CiAKQEAgLTEyOSw3ICsxMzAsNyBAQAogICAgIHBhcnRpYWwgPSBpbmRlbnQxCiAgICAgd2hpbGUgaSA8IG4gYW5kIG5vdCBpc19hbGxfd2hpdGUobGluZXNbaV0pOgogICAgICAgICAjIFhYWCBTaG91bGQgdGFrZSBkb3VibGUgc3BhY2UgYWZ0ZXIgcGVyaW9kIChldGMuKSBpbnRvIGFjY291bnQKLSAgICAgICAgd29yZHMgPSByZS5zcGxpdCgiKFxzKykiLCBsaW5lc1tpXSkKKyAgICAgICAgd29yZHMgPSByZS5zcGxpdChyIihccyspIiwgbGluZXNbaV0pCiAgICAgICAgIGZvciBqIGluIHJhbmdlKDAsIGxlbih3b3JkcyksIDIpOgogICAgICAgICAgICAgd29yZCA9IHdvcmRzW2pdCiAgICAgICAgICAgICBpZiBub3Qgd29yZDoKQEAgLTE4OSw3ICsxOTAsOCBAQAogICAgIGlmIG0gaXMgTm9uZTogcmV0dXJuICIiCiAgICAgcmV0dXJuIG0uZ3JvdXAoMSkKIAorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfZm9ybWF0cGFyYWdyYXBoJywKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3BhcmFncmFwaCcsCiAgICAgICAgICAgICB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1BhcmVuTWF0Y2gucHkgYi9MaWIvaWRsZWxpYi9wYXJlbm1hdGNoLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1BhcmVuTWF0Y2gucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3BhcmVubWF0Y2gucHkKaW5kZXggNDdlMTBmMy4uY2NlYzcwOCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUGFyZW5NYXRjaC5weQorKysgYi9MaWIvaWRsZWxpYi9wYXJlbm1hdGNoLnB5CkBAIC00LDkgKzQsOCBAQAogcGFyZW4uICBQYXJlbiBoZXJlIGlzIHVzZWQgZ2VuZXJpY2FsbHk7IHRoZSBtYXRjaGluZyBhcHBsaWVzIHRvCiBwYXJlbnRoZXNlcywgc3F1YXJlIGJyYWNrZXRzLCBhbmQgY3VybHkgYnJhY2VzLgogIiIiCi0KLWZyb20gaWRsZWxpYi5IeXBlclBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliLmh5cGVycGFyc2VyIGltcG9ydCBIeXBlclBhcnNlcgorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAogX29wZW5lcnMgPSB7JyknOicoJywnXSc6J1snLCd9Jzoneyd9CiBDSEVDS19ERUxBWSA9IDEwMCAjIG1pbGxpc2Vjb25kcwpAQCAtNjQsNiArNjMsNyBAQAogICAgICAgICAjIGFuZCBkZWFjdGl2YXRlX3Jlc3RvcmUgKHdoaWNoIGNhbGxzIGV2ZW50X2RlbGV0ZSkuCiAgICAgICAgIGVkaXR3aW4udGV4dC5iaW5kKHNlbGYuUkVTVE9SRV9WSVJUVUFMX0VWRU5UX05BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdG9yZV9ldmVudCkKKyAgICAgICAgc2VsZi5iZWxsID0gc2VsZi50ZXh0LmJlbGwgaWYgc2VsZi5CRUxMIGVsc2UgbGFtYmRhOiBOb25lCiAgICAgICAgIHNlbGYuY291bnRlciA9IDAKICAgICAgICAgc2VsZi5pc19yZXN0b3JlX2FjdGl2ZSA9IDAKICAgICAgICAgc2VsZi5zZXRfc3R5bGUoc2VsZi5TVFlMRSkKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAgICAgaW5kaWNlcyA9IChIeXBlclBhcnNlcihzZWxmLmVkaXR3aW4sICJpbnNlcnQiKQogICAgICAgICAgICAgICAgICAgIC5nZXRfc3Vycm91bmRpbmdfYnJhY2tldHMoKSkKICAgICAgICAgaWYgaW5kaWNlcyBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi53YXJuX21pc21hdGNoZWQoKQorICAgICAgICAgICAgc2VsZi5iZWxsKCkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBzZWxmLmFjdGl2YXRlX3Jlc3RvcmUoKQogICAgICAgICBzZWxmLmNyZWF0ZV90YWcoaW5kaWNlcykKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGluZGljZXMgPSBocC5nZXRfc3Vycm91bmRpbmdfYnJhY2tldHMoX29wZW5lcnNbY2xvc2VyXSwgVHJ1ZSkKICAgICAgICAgaWYgaW5kaWNlcyBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi53YXJuX21pc21hdGNoZWQoKQorICAgICAgICAgICAgc2VsZi5iZWxsKCkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBzZWxmLmFjdGl2YXRlX3Jlc3RvcmUoKQogICAgICAgICBzZWxmLmNyZWF0ZV90YWcoaW5kaWNlcykKQEAgLTEyNCwxMCArMTI0LDYgQEAKICAgICAgICAgaWYgdGltZXJfY291bnQgPT0gc2VsZi5jb3VudGVyOgogICAgICAgICAgICAgc2VsZi5yZXN0b3JlX2V2ZW50KCkKIAotICAgIGRlZiB3YXJuX21pc21hdGNoZWQoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuQkVMTDoKLSAgICAgICAgICAgIHNlbGYudGV4dC5iZWxsKCkKLQogICAgICMgYW55IG9uZSBvZiB0aGUgY3JlYXRlX3RhZ19YWFggbWV0aG9kcyBjYW4gYmUgdXNlZCBkZXBlbmRpbmcgb24KICAgICAjIHRoZSBzdHlsZQogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9QYXRoQnJvd3Nlci5weSBiL0xpYi9pZGxlbGliL3BhdGhicm93c2VyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1BhdGhCcm93c2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9wYXRoYnJvd3Nlci5weQppbmRleCA5YWI3NjMyLi42YzE5NTA4IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9QYXRoQnJvd3Nlci5weQorKysgYi9MaWIvaWRsZWxpYi9wYXRoYnJvd3Nlci5weQpAQCAtMSwxMCArMSwxMCBAQAoraW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkKIGltcG9ydCBvcwogaW1wb3J0IHN5cwotaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkKIAotZnJvbSBpZGxlbGliLlRyZWVXaWRnZXQgaW1wb3J0IFRyZWVJdGVtCi1mcm9tIGlkbGVsaWIuQ2xhc3NCcm93c2VyIGltcG9ydCBDbGFzc0Jyb3dzZXIsIE1vZHVsZUJyb3dzZXJUcmVlSXRlbQotZnJvbSBpZGxlbGliLlB5U2hlbGwgaW1wb3J0IFB5U2hlbGxGaWxlTGlzdAorZnJvbSBpZGxlbGliLmJyb3dzZXIgaW1wb3J0IENsYXNzQnJvd3NlciwgTW9kdWxlQnJvd3NlclRyZWVJdGVtCitmcm9tIGlkbGVsaWIucHlzaGVsbCBpbXBvcnQgUHlTaGVsbEZpbGVMaXN0Citmcm9tIGlkbGVsaWIudHJlZSBpbXBvcnQgVHJlZUl0ZW0KIAogCiBjbGFzcyBQYXRoQnJvd3NlcihDbGFzc0Jyb3dzZXIpOgpAQCAtMjQsNiArMjQsNyBAQAogICAgIGRlZiByb290bm9kZShzZWxmKToKICAgICAgICAgcmV0dXJuIFBhdGhCcm93c2VyVHJlZUl0ZW0oKQogCisKIGNsYXNzIFBhdGhCcm93c2VyVHJlZUl0ZW0oVHJlZUl0ZW0pOgogCiAgICAgZGVmIEdldFRleHQoc2VsZik6CkBAIC0zNiw2ICszNyw3IEBACiAgICAgICAgICAgICBzdWJsaXN0LmFwcGVuZChpdGVtKQogICAgICAgICByZXR1cm4gc3VibGlzdAogCisKIGNsYXNzIERpckJyb3dzZXJUcmVlSXRlbShUcmVlSXRlbSk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyLCBwYWNrYWdlcz1bXSk6CkBAIC05NSw2ICs5Nyw3IEBACiAgICAgICAgIHNvcnRlZC5zb3J0KCkKICAgICAgICAgcmV0dXJuIHNvcnRlZAogCisKIGRlZiBfcGF0aF9icm93c2VyKHBhcmVudCk6ICAjIGh0ZXN0ICMKICAgICBmbGlzdCA9IFB5U2hlbGxGaWxlTGlzdChwYXJlbnQpCiAgICAgUGF0aEJyb3dzZXIoZmxpc3QsIF9odGVzdD1UcnVlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUGVyY29sYXRvci5weSBiL0xpYi9pZGxlbGliL3BlcmNvbGF0b3IucHkKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvUGVyY29sYXRvci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcGVyY29sYXRvci5weQppbmRleCBiOGJlMmFhLi5kMThkYWYwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9QZXJjb2xhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL3BlcmNvbGF0b3IucHkKQEAgLTEsNSArMSw1IEBACi1mcm9tIGlkbGVsaWIuV2lkZ2V0UmVkaXJlY3RvciBpbXBvcnQgV2lkZ2V0UmVkaXJlY3RvcgotZnJvbSBpZGxlbGliLkRlbGVnYXRvciBpbXBvcnQgRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIuZGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5yZWRpcmVjdG9yIGltcG9ydCBXaWRnZXRSZWRpcmVjdG9yCiAKIAogY2xhc3MgUGVyY29sYXRvcjoKQEAgLTU3LDcgKzU3LDYgQEAKIAogZGVmIF9wZXJjb2xhdG9yKHBhcmVudCk6ICAjIGh0ZXN0ICMKICAgICBpbXBvcnQgdGtpbnRlciBhcyB0awotICAgIGltcG9ydCByZQogCiAgICAgY2xhc3MgVHJhY2VyKERlbGVnYXRvcik6CiAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKQEAgLTc0LDggKzczLDggQEAKIAogICAgIGJveCA9IHRrLlRvcGxldmVsKHBhcmVudCkKICAgICBib3gudGl0bGUoIlRlc3QgUGVyY29sYXRvciIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIGJveC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTUwKSkKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgYm94Lmdlb21ldHJ5KCIrJWQrJWQiICUgKHgsIHkgKyAxNzUpKQogICAgIHRleHQgPSB0ay5UZXh0KGJveCkKICAgICBwID0gUGVyY29sYXRvcih0ZXh0KQogICAgIHBpbiA9IHAuaW5zZXJ0ZmlsdGVyCkBAIC04OSwxMCArODgsMTAgQEAKICAgICAgICAgKHBpbiBpZiB2YXIyLmdldCgpIGVsc2UgcG91dCkodDIpCiAKICAgICB0ZXh0LnBhY2soKQotICAgIHZhcjEgPSB0ay5JbnRWYXIoKQorICAgIHZhcjEgPSB0ay5JbnRWYXIocGFyZW50KQogICAgIGNiMSA9IHRrLkNoZWNrYnV0dG9uKGJveCwgdGV4dD0iVHJhY2VyMSIsIGNvbW1hbmQ9dG9nZ2xlMSwgdmFyaWFibGU9dmFyMSkKICAgICBjYjEucGFjaygpCi0gICAgdmFyMiA9IHRrLkludFZhcigpCisgICAgdmFyMiA9IHRrLkludFZhcihwYXJlbnQpCiAgICAgY2IyID0gdGsuQ2hlY2tidXR0b24oYm94LCB0ZXh0PSJUcmFjZXIyIiwgY29tbWFuZD10b2dnbGUyLCB2YXJpYWJsZT12YXIyKQogICAgIGNiMi5wYWNrKCkKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUHlQYXJzZS5weSBiL0xpYi9pZGxlbGliL3B5cGFyc2UucHkKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvUHlQYXJzZS5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcHlwYXJzZS5weQppbmRleCA5Y2NiYjI1Li42NzM5ZGZkIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9QeVBhcnNlLnB5CisrKyBiL0xpYi9pZGxlbGliL3B5cGFyc2UucHkKQEAgLTEsNiArMSw2IEBACitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNYXBwaW5nCiBpbXBvcnQgcmUKIGltcG9ydCBzeXMKLWZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE1hcHBpbmcKIAogIyBSZWFzb24gbGFzdCBzdG10IGlzIGNvbnRpbnVlZCAob3IgQ19OT05FIGlmIGl0J3Mgbm90KS4KIChDX05PTkUsIENfQkFDS1NMQVNILCBDX1NUUklOR19GSVJTVF9MSU5FLApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUHlTaGVsbC5weSBiL0xpYi9pZGxlbGliL3B5c2hlbGwucHkKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvUHlTaGVsbC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcHlzaGVsbC5weQppbmRleCA1ZGVjNjhlLi5lMWVhZGUxIDEwMDc1NQotLS0gYS9MaWIvaWRsZWxpYi9QeVNoZWxsLnB5CisrKyBiL0xpYi9pZGxlbGliL3B5c2hlbGwucHkKQEAgLTEsMjEgKzEsNSBAQAogIyEgL3Vzci9iaW4vZW52IHB5dGhvbjMKIAotaW1wb3J0IGdldG9wdAotaW1wb3J0IG9zCi1pbXBvcnQgb3MucGF0aAotaW1wb3J0IHJlCi1pbXBvcnQgc29ja2V0Ci1pbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHN5cwotaW1wb3J0IHRocmVhZGluZwotaW1wb3J0IHRpbWUKLWltcG9ydCB0b2tlbml6ZQotaW1wb3J0IGlvCi0KLWltcG9ydCBsaW5lY2FjaGUKLWZyb20gY29kZSBpbXBvcnQgSW50ZXJhY3RpdmVJbnRlcnByZXRlcgotZnJvbSBwbGF0Zm9ybSBpbXBvcnQgcHl0aG9uX3ZlcnNpb24sIHN5c3RlbQotCiB0cnk6CiAgICAgZnJvbSB0a2ludGVyIGltcG9ydCAqCiBleGNlcHQgSW1wb3J0RXJyb3I6CkBAIC0yMywxNyArNyw0MiBAQAogICAgICAgICAgICJZb3VyIFB5dGhvbiBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yIFRrLiAqKiIsIGZpbGU9c3lzLl9fc3RkZXJyX18pCiAgICAgc3lzLmV4aXQoMSkKIGltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CitpZiBUa1ZlcnNpb24gPCA4LjU6CisgICAgcm9vdCA9IFRrKCkgICMgb3RoZXJ3aXNlIGNyZWF0ZSByb290IGluIG1haW4KKyAgICByb290LndpdGhkcmF3KCkKKyAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJJZGxlIENhbm5vdCBTdGFydCIsCisgICAgICAgICAgICAiSWRsZSByZXF1aXJlcyB0Y2wvdGsgOC41Kywgbm90ICRzLiIgJSBUa1ZlcnNpb24sCisgICAgICAgICAgICBwYXJlbnQ9cm9vdCkKKyAgICBzeXMuZXhpdCgxKQogCi1mcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBFZGl0b3JXaW5kb3csIGZpeHdvcmRicmVha3MKLWZyb20gaWRsZWxpYi5GaWxlTGlzdCBpbXBvcnQgRmlsZUxpc3QKLWZyb20gaWRsZWxpYi5Db2xvckRlbGVnYXRvciBpbXBvcnQgQ29sb3JEZWxlZ2F0b3IKLWZyb20gaWRsZWxpYi5VbmRvRGVsZWdhdG9yIGltcG9ydCBVbmRvRGVsZWdhdG9yCi1mcm9tIGlkbGVsaWIuT3V0cHV0V2luZG93IGltcG9ydCBPdXRwdXRXaW5kb3cKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBjb2RlIGltcG9ydCBJbnRlcmFjdGl2ZUludGVycHJldGVyCitpbXBvcnQgZ2V0b3B0CitpbXBvcnQgaW8KK2ltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2Zyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl92ZXJzaW9uLCBzeXN0ZW0KK2ltcG9ydCByZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB0aW1lCitpbXBvcnQgdG9rZW5pemUKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIGlkbGVsaWIgaW1wb3J0IHRlc3RpbmcgICMgYm9vbCB2YWx1ZQorZnJvbSBpZGxlbGliLmNvbG9yaXplciBpbXBvcnQgQ29sb3JEZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIgaW1wb3J0IGRlYnVnZ2VyCitmcm9tIGlkbGVsaWIgaW1wb3J0IGRlYnVnZ2VyX3IKK2Zyb20gaWRsZWxpYi5lZGl0b3IgaW1wb3J0IEVkaXRvcldpbmRvdywgZml4d29yZGJyZWFrcworZnJvbSBpZGxlbGliLmZpbGVsaXN0IGltcG9ydCBGaWxlTGlzdAorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKK2Zyb20gaWRsZWxpYi5vdXR3aW4gaW1wb3J0IE91dHB1dFdpbmRvdwogZnJvbSBpZGxlbGliIGltcG9ydCBycGMKLWZyb20gaWRsZWxpYiBpbXBvcnQgRGVidWdnZXIKLWZyb20gaWRsZWxpYiBpbXBvcnQgUmVtb3RlRGVidWdnZXIKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSBpZGxlbGliLnJ1biBpbXBvcnQgaWRsZV9mb3JtYXR3YXJuaW5nLCBQc2V1ZG9JbnB1dEZpbGUsIFBzZXVkb091dHB1dEZpbGUKK2Zyb20gaWRsZWxpYi51bmRvIGltcG9ydCBVbmRvRGVsZWdhdG9yCiAKIEhPU1QgPSAnMTI3LjAuMC4xJyAjIHB5dGhvbiBleGVjdXRpb24gc2VydmVyIG9uIGxvY2FsaG9zdCBsb29wYmFjawogUE9SVCA9IDAgICMgc29tZWRheSBwYXNzIGluIGhvc3QsIHBvcnQgZm9yIHJlbW90ZSBkZWJ1ZyBjYXBhYmlsaXR5CkBAIC00MywyMCArNTIsNiBAQAogIyB0ZW1wb3JhcmlseSByZWRpcmVjdCB0aGUgc3RyZWFtIHRvIHRoZSBzaGVsbCB3aW5kb3cgdG8gZGlzcGxheSB3YXJuaW5ncyB3aGVuCiAjIGNoZWNraW5nIHVzZXIncyBjb2RlLgogd2FybmluZ19zdHJlYW0gPSBzeXMuX19zdGRlcnJfXyAgIyBOb25lLCBhdCBsZWFzdCBvbiBXaW5kb3dzLCBpZiBubyBjb25zb2xlLgotaW1wb3J0IHdhcm5pbmdzCi0KLWRlZiBpZGxlX2Zvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmU9Tm9uZSk6Ci0gICAgIiIiRm9ybWF0IHdhcm5pbmdzIHRoZSBJRExFIHdheS4iIiIKLQotICAgIHMgPSAiXG5XYXJuaW5nIChmcm9tIHdhcm5pbmdzIG1vZHVsZSk6XG4iCi0gICAgcyArPSAnICBGaWxlIFwiJXNcIiwgbGluZSAlc1xuJyAlIChmaWxlbmFtZSwgbGluZW5vKQotICAgIGlmIGxpbmUgaXMgTm9uZToKLSAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCi0gICAgbGluZSA9IGxpbmUuc3RyaXAoKQotICAgIGlmIGxpbmU6Ci0gICAgICAgIHMgKz0gIiAgICAlc1xuIiAlIGxpbmUKLSAgICBzICs9ICIlczogJXNcbiIgJSAoY2F0ZWdvcnkuX19uYW1lX18sIG1lc3NhZ2UpCi0gICAgcmV0dXJuIHMKIAogZGVmIGlkbGVfc2hvd3dhcm5pbmcoCiAgICAgICAgIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlPU5vbmUsIGxpbmU9Tm9uZSk6CkBAIC00MTAsNyArNDA1LDcgQEAKICAgICAgICAgIyBydW4gZnJvbSB0aGUgSURMRSBzb3VyY2UgZGlyZWN0b3J5LgogICAgICAgICBkZWxfZXhpdGYgPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnR2VuZXJhbCcsICdkZWxldGUtZXhpdGZ1bmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwgdHlwZT0nYm9vbCcpCi0gICAgICAgIGlmIF9fbmFtZV9fID09ICdpZGxlbGliLlB5U2hlbGwnOgorICAgICAgICBpZiBfX25hbWVfXyA9PSAnaWRsZWxpYi5weXNoZWxsJzoKICAgICAgICAgICAgIGNvbW1hbmQgPSAiX19pbXBvcnRfXygnaWRsZWxpYi5ydW4nKS5ydW4ubWFpbiglcikiICUgKGRlbF9leGl0ZiwpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBjb21tYW5kID0gIl9faW1wb3J0X18oJ3J1bicpLm1haW4oJXIpIiAlIChkZWxfZXhpdGYsKQpAQCAtNDY4LDcgKzQ2Myw3IEBACiAgICAgICAgIGlmIGRlYnVnOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICMgT25seSBjbG9zZSBzdWJwcm9jZXNzIGRlYnVnZ2VyLCBkb24ndCB1bnJlZ2lzdGVyIGd1aV9hZGFwIQotICAgICAgICAgICAgICAgIFJlbW90ZURlYnVnZ2VyLmNsb3NlX3N1YnByb2Nlc3NfZGVidWdnZXIoc2VsZi5ycGNjbHQpCisgICAgICAgICAgICAgICAgZGVidWdnZXJfci5jbG9zZV9zdWJwcm9jZXNzX2RlYnVnZ2VyKHNlbGYucnBjY2x0KQogICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgIyBLaWxsIHN1YnByb2Nlc3MsIHNwYXduIGEgbmV3IG9uZSwgYWNjZXB0IGNvbm5lY3Rpb24uCkBAIC00OTcsNyArNDkyLDcgQEAKICAgICAgICAgIyByZXN0YXJ0IHN1YnByb2Nlc3MgZGVidWdnZXIKICAgICAgICAgaWYgZGVidWc6CiAgICAgICAgICAgICAjIFJlc3RhcnRlZCBkZWJ1Z2dlciBjb25uZWN0cyB0byBjdXJyZW50IGluc3RhbmNlIG9mIGRlYnVnIEdVSQotICAgICAgICAgICAgUmVtb3RlRGVidWdnZXIucmVzdGFydF9zdWJwcm9jZXNzX2RlYnVnZ2VyKHNlbGYucnBjY2x0KQorICAgICAgICAgICAgZGVidWdnZXJfci5yZXN0YXJ0X3N1YnByb2Nlc3NfZGVidWdnZXIoc2VsZi5ycGNjbHQpCiAgICAgICAgICAgICAjIHJlbG9hZCByZW1vdGUgZGVidWdnZXIgYnJlYWtwb2ludHMgZm9yIGFsbCBQeVNoZWxsRWRpdFdpbmRvd3MKICAgICAgICAgICAgIGRlYnVnLmxvYWRfYnJlYWtwb2ludHMoKQogICAgICAgICBzZWxmLmNvbXBpbGUuY29tcGlsZXIuZmxhZ3MgPSBzZWxmLm9yaWdpbmFsX2NvbXBpbGVyX2ZsYWdzCkBAIC01NzgsNyArNTczLDcgQEAKICAgICAgICAgICAgICAgICBpZiBzZWxmLnRrY29uc29sZS5nZXR2YXIoIjw8dG9nZ2xlLWppdC1zdGFjay12aWV3ZXI+PiIpOgogICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW90ZV9zdGFja192aWV3ZXIoKQogICAgICAgICAgICAgZWxpZiBob3cgPT0gIkVSUk9SIjoKLSAgICAgICAgICAgICAgICBlcnJtc2cgPSAiUHlTaGVsbC5Nb2RpZmllZEludGVycHJldGVyOiBTdWJwcm9jZXNzIEVSUk9SOlxuIgorICAgICAgICAgICAgICAgIGVycm1zZyA9ICJweXNoZWxsLk1vZGlmaWVkSW50ZXJwcmV0ZXI6IFN1YnByb2Nlc3MgRVJST1I6XG4iCiAgICAgICAgICAgICAgICAgcHJpbnQoZXJybXNnLCB3aGF0LCBmaWxlPXN5cy5fX3N0ZGVycl9fKQogICAgICAgICAgICAgICAgIHByaW50KGVycm1zZywgd2hhdCwgZmlsZT1jb25zb2xlKQogICAgICAgICAgICAgIyB3ZSByZWNlaXZlZCBhIHJlc3BvbnNlIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIHNlcSBudW1iZXI6CkBAIC02MTMsMTMgKzYwOCwxMyBAQAogICAgICAgICByZXR1cm4KIAogICAgIGRlZiByZW1vdGVfc3RhY2tfdmlld2VyKHNlbGYpOgotICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IFJlbW90ZU9iamVjdEJyb3dzZXIKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z29ial9yCiAgICAgICAgIG9pZCA9IHNlbGYucnBjY2x0LnJlbW90ZXF1ZXVlKCJleGVjIiwgInN0YWNrdmlld2VyIiwgKCJmbGlzdCIsKSwge30pCiAgICAgICAgIGlmIG9pZCBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi50a2NvbnNvbGUucm9vdC5iZWxsKCkKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBpdGVtID0gUmVtb3RlT2JqZWN0QnJvd3Nlci5TdHViT2JqZWN0VHJlZUl0ZW0oc2VsZi5ycGNjbHQsIG9pZCkKLSAgICAgICAgZnJvbSBpZGxlbGliLlRyZWVXaWRnZXQgaW1wb3J0IFNjcm9sbGVkQ2FudmFzLCBUcmVlTm9kZQorICAgICAgICBpdGVtID0gZGVidWdvYmpfci5TdHViT2JqZWN0VHJlZUl0ZW0oc2VsZi5ycGNjbHQsIG9pZCkKKyAgICAgICAgZnJvbSBpZGxlbGliLnRyZWUgaW1wb3J0IFNjcm9sbGVkQ2FudmFzLCBUcmVlTm9kZQogICAgICAgICB0b3AgPSBUb3BsZXZlbChzZWxmLnRrY29uc29sZS5yb290KQogICAgICAgICB0aGVtZSA9IGlkbGVDb25mLkN1cnJlbnRUaGVtZSgpCiAgICAgICAgIGJhY2tncm91bmQgPSBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICdub3JtYWwnKVsnYmFja2dyb3VuZCddCkBAIC02NjIsOSArNjU3LDkgQEAKICAgICAgICAgIyBhdCB0aGUgbW9tZW50LCBJbnRlcmFjdGl2ZUludGVycHJldGVyIGV4cGVjdHMgc3RyCiAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHNvdXJjZSwgc3RyKQogICAgICAgICAjaWYgaXNpbnN0YW5jZShzb3VyY2UsIHN0cik6Ci0gICAgICAgICMgICAgZnJvbSBpZGxlbGliIGltcG9ydCBJT0JpbmRpbmcKKyAgICAgICAgIyAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGlvbWVudQogICAgICAgICAjICAgIHRyeToKLSAgICAgICAgIyAgICAgICAgc291cmNlID0gc291cmNlLmVuY29kZShJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgICMgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5lbmNvZGUoaW9tZW51LmVuY29kaW5nKQogICAgICAgICAjICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICMgICAgICAgIHNlbGYudGtjb25zb2xlLnJlc2V0b3V0cHV0KCkKICAgICAgICAgIyAgICAgICAgc2VsZi53cml0ZSgiVW5zdXBwb3J0ZWQgY2hhcmFjdGVycyBpbiBpbnB1dFxuIikKQEAgLTg1MCw3ICs4NDUsNyBAQAogCiAKICAgICAjIE5ldyBjbGFzc2VzCi0gICAgZnJvbSBpZGxlbGliLklkbGVIaXN0b3J5IGltcG9ydCBIaXN0b3J5CisgICAgZnJvbSBpZGxlbGliLmhpc3RvcnkgaW1wb3J0IEhpc3RvcnkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdD1Ob25lKToKICAgICAgICAgaWYgdXNlX3N1YnByb2Nlc3M6CkBAIC04ODgsMTEgKzg4MywxMSBAQAogICAgICAgICBzZWxmLnNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAogICAgICAgICBzZWxmLnNhdmVfc3RkZXJyID0gc3lzLnN0ZGVycgogICAgICAgICBzZWxmLnNhdmVfc3RkaW4gPSBzeXMuc3RkaW4KLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBJT0JpbmRpbmcKLSAgICAgICAgc2VsZi5zdGRpbiA9IFBzZXVkb0lucHV0RmlsZShzZWxmLCAic3RkaW4iLCBJT0JpbmRpbmcuZW5jb2RpbmcpCi0gICAgICAgIHNlbGYuc3Rkb3V0ID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLCAic3Rkb3V0IiwgSU9CaW5kaW5nLmVuY29kaW5nKQotICAgICAgICBzZWxmLnN0ZGVyciA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgInN0ZGVyciIsIElPQmluZGluZy5lbmNvZGluZykKLSAgICAgICAgc2VsZi5jb25zb2xlID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLCAiY29uc29sZSIsIElPQmluZGluZy5lbmNvZGluZykKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBpb21lbnUKKyAgICAgICAgc2VsZi5zdGRpbiA9IFBzZXVkb0lucHV0RmlsZShzZWxmLCAic3RkaW4iLCBpb21lbnUuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuc3Rkb3V0ID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLCAic3Rkb3V0IiwgaW9tZW51LmVuY29kaW5nKQorICAgICAgICBzZWxmLnN0ZGVyciA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgInN0ZGVyciIsIGlvbWVudS5lbmNvZGluZykKKyAgICAgICAgc2VsZi5jb25zb2xlID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLCAiY29uc29sZSIsIGlvbWVudS5lbmNvZGluZykKICAgICAgICAgaWYgbm90IHVzZV9zdWJwcm9jZXNzOgogICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuc3Rkb3V0CiAgICAgICAgICAgICBzeXMuc3RkZXJyID0gc2VsZi5zdGRlcnIKQEAgLTkwMCw3ICs4OTUsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICAjIHBhZ2UgaGVscCgpIHRleHQgdG8gc2hlbGwuCiAgICAgICAgICAgICBpbXBvcnQgcHlkb2MgIyBpbXBvcnQgbXVzdCBiZSBkb25lIGhlcmUgdG8gY2FwdHVyZSBpL28gcmViaW5kaW5nLgotICAgICAgICAgICAgIyBYWFggS0JLIDI3RGVjMDcgdXNlIGEgdGV4dFZpZXcgc29tZWRheSwgYnV0IG11c3Qgd29yayB3L28gc3VicHJvYworICAgICAgICAgICAgIyBYWFggS0JLIDI3RGVjMDcgdXNlIFRleHRWaWV3ZXIgc29tZWRheSwgYnV0IG11c3Qgd29yayB3L28gc3VicHJvYwogICAgICAgICAgICAgcHlkb2MucGFnZXIgPSBweWRvYy5wbGFpbnBhZ2VyCiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzeXMuX19zdGRlcnJfXwpAQCAtOTU0LDcgKzk0OSw3IEBACiAgICAgICAgICAgICBzZWxmLmludGVycC5zZXRkZWJ1Z2dlcihOb25lKQogICAgICAgICAgICAgZGIuY2xvc2UoKQogICAgICAgICAgICAgaWYgc2VsZi5pbnRlcnAucnBjY2x0OgotICAgICAgICAgICAgICAgIFJlbW90ZURlYnVnZ2VyLmNsb3NlX3JlbW90ZV9kZWJ1Z2dlcihzZWxmLmludGVycC5ycGNjbHQpCisgICAgICAgICAgICAgICAgZGVidWdnZXJfci5jbG9zZV9yZW1vdGVfZGVidWdnZXIoc2VsZi5pbnRlcnAucnBjY2x0KQogICAgICAgICAgICAgc2VsZi5yZXNldG91dHB1dCgpCiAgICAgICAgICAgICBzZWxmLmNvbnNvbGUud3JpdGUoIltERUJVRyBPRkZdXG4iKQogICAgICAgICAgICAgc3lzLnBzMSA9ICI+Pj4gIgpAQCAtOTYzLDEwICs5NTgsMTAgQEAKIAogICAgIGRlZiBvcGVuX2RlYnVnZ2VyKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmludGVycC5ycGNjbHQ6Ci0gICAgICAgICAgICBkYmdfZ3VpID0gUmVtb3RlRGVidWdnZXIuc3RhcnRfcmVtb3RlX2RlYnVnZ2VyKHNlbGYuaW50ZXJwLnJwY2NsdCwKKyAgICAgICAgICAgIGRiZ19ndWkgPSBkZWJ1Z2dlcl9yLnN0YXJ0X3JlbW90ZV9kZWJ1Z2dlcihzZWxmLmludGVycC5ycGNjbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBkYmdfZ3VpID0gRGVidWdnZXIuRGVidWdnZXIoc2VsZikKKyAgICAgICAgICAgIGRiZ19ndWkgPSBkZWJ1Z2dlci5EZWJ1Z2dlcihzZWxmKQogICAgICAgICBzZWxmLmludGVycC5zZXRkZWJ1Z2dlcihkYmdfZ3VpKQogICAgICAgICBkYmdfZ3VpLmxvYWRfYnJlYWtwb2ludHMoKQogICAgICAgICBzeXMucHMxID0gIltERUJVRyBPTl1cbj4+PiAiCkBAIC0xMjQxLDcgKzEyMzYsNyBAQAogICAgICAgICAgICAgICAgICIoc3lzLmxhc3RfdHJhY2ViYWNrIGlzIG5vdCBkZWZpbmVkKSIsCiAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCkKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBmcm9tIGlkbGVsaWIuU3RhY2tWaWV3ZXIgaW1wb3J0IFN0YWNrQnJvd3NlcgorICAgICAgICBmcm9tIGlkbGVsaWIuc3RhY2t2aWV3ZXIgaW1wb3J0IFN0YWNrQnJvd3NlcgogICAgICAgICBTdGFja0Jyb3dzZXIoc2VsZi5yb290LCBzZWxmLmZsaXN0KQogCiAgICAgZGVmIHZpZXdfcmVzdGFydF9tYXJrKHNlbGYsIGV2ZW50PU5vbmUpOgpAQCAtMTMwOSw5MiArMTMwNCw2IEBACiAgICAgICAgICAgICByZXR1cm4gJ2Rpc2FibGVkJwogICAgICAgICByZXR1cm4gc3VwZXIoKS5ybWVudV9jaGVja19wYXN0ZSgpCiAKLWNsYXNzIFBzZXVkb0ZpbGUoaW8uVGV4dElPQmFzZSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nPU5vbmUpOgotICAgICAgICBzZWxmLnNoZWxsID0gc2hlbGwKLSAgICAgICAgc2VsZi50YWdzID0gdGFncwotICAgICAgICBzZWxmLl9lbmNvZGluZyA9IGVuY29kaW5nCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgZW5jb2Rpbmcoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9lbmNvZGluZwotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIG5hbWUoc2VsZik6Ci0gICAgICAgIHJldHVybiAnPCVzPicgJSBzZWxmLnRhZ3MKLQotICAgIGRlZiBpc2F0dHkoc2VsZik6Ci0gICAgICAgIHJldHVybiBUcnVlCi0KLQotY2xhc3MgUHNldWRvT3V0cHV0RmlsZShQc2V1ZG9GaWxlKToKLQotICAgIGRlZiB3cml0YWJsZShzZWxmKToKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiB3cml0ZShzZWxmLCBzKToKLSAgICAgICAgaWYgc2VsZi5jbG9zZWQ6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ3cml0ZSB0byBjbG9zZWQgZmlsZSIpCi0gICAgICAgIGlmIHR5cGUocykgaXMgbm90IHN0cjoKLSAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cik6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIHN0ciwgbm90ICcgKyB0eXBlKHMpLl9fbmFtZV9fKQotICAgICAgICAgICAgIyBTZWUgaXNzdWUgIzE5NDgxCi0gICAgICAgICAgICBzID0gc3RyLl9fc3RyX18ocykKLSAgICAgICAgcmV0dXJuIHNlbGYuc2hlbGwud3JpdGUocywgc2VsZi50YWdzKQotCi0KLWNsYXNzIFBzZXVkb0lucHV0RmlsZShQc2V1ZG9GaWxlKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaGVsbCwgdGFncywgZW5jb2Rpbmc9Tm9uZSk6Ci0gICAgICAgIFBzZXVkb0ZpbGUuX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nKQotICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9ICcnCi0KLSAgICBkZWYgcmVhZGFibGUoc2VsZik6Ci0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICBkZWYgcmVhZChzZWxmLCBzaXplPS0xKToKLSAgICAgICAgaWYgc2VsZi5jbG9zZWQ6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWFkIGZyb20gY2xvc2VkIGZpbGUiKQotICAgICAgICBpZiBzaXplIGlzIE5vbmU6Ci0gICAgICAgICAgICBzaXplID0gLTEKLSAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzaXplLCBpbnQpOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIGludCwgbm90ICcgKyB0eXBlKHNpemUpLl9fbmFtZV9fKQotICAgICAgICByZXN1bHQgPSBzZWxmLl9saW5lX2J1ZmZlcgotICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9ICcnCi0gICAgICAgIGlmIHNpemUgPCAwOgotICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zaGVsbC5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHdoaWxlIGxlbihyZXN1bHQpIDwgc2l6ZToKLSAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zaGVsbC5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUKLSAgICAgICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyID0gcmVzdWx0W3NpemU6XQotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WzpzaXplXQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLSAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT0tMSk6Ci0gICAgICAgIGlmIHNlbGYuY2xvc2VkOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVhZCBmcm9tIGNsb3NlZCBmaWxlIikKLSAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgotICAgICAgICAgICAgc2l6ZSA9IC0xCi0gICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2l6ZSwgaW50KToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbXVzdCBiZSBpbnQsIG5vdCAnICsgdHlwZShzaXplKS5fX25hbWVfXykKLSAgICAgICAgbGluZSA9IHNlbGYuX2xpbmVfYnVmZmVyIG9yIHNlbGYuc2hlbGwucmVhZGxpbmUoKQotICAgICAgICBpZiBzaXplIDwgMDoKLSAgICAgICAgICAgIHNpemUgPSBsZW4obGluZSkKLSAgICAgICAgZW9sID0gbGluZS5maW5kKCdcbicsIDAsIHNpemUpCi0gICAgICAgIGlmIGVvbCA+PSAwOgotICAgICAgICAgICAgc2l6ZSA9IGVvbCArIDEKLSAgICAgICAgc2VsZi5fbGluZV9idWZmZXIgPSBsaW5lW3NpemU6XQotICAgICAgICByZXR1cm4gbGluZVs6c2l6ZV0KLQotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgc2VsZi5zaGVsbC5jbG9zZSgpCi0KIAogZGVmIGZpeF94MTFfcGFzdGUocm9vdCk6CiAgICAgIk1ha2UgcGFzdGUgcmVwbGFjZSBzZWxlY3Rpb24gb24geDExLiAgU2VlIGlzc3VlICM1MTI0LiIKQEAgLTE1NDAsNyArMTQ0OSwxMCBAQAogICAgIGVuYWJsZV9lZGl0ID0gZW5hYmxlX2VkaXQgb3IgZWRpdF9zdGFydAogICAgIGVuYWJsZV9zaGVsbCA9IGVuYWJsZV9zaGVsbCBvciBub3QgZW5hYmxlX2VkaXQKIAotICAgICMgc3RhcnQgZWRpdG9yIGFuZC9vciBzaGVsbCB3aW5kb3dzOgorICAgICMgU2V0dXAgcm9vdC4gIERvbid0IGJyZWFrIHVzZXIgY29kZSBydW4gaW4gSURMRSBwcm9jZXNzLgorICAgICMgRG9uJ3QgY2hhbmdlIGVudmlyb25tZW50IHdoZW4gdGVzdGluZy4KKyAgICBpZiB1c2Vfc3VicHJvY2VzcyBhbmQgbm90IHRlc3Rpbmc6CisgICAgICAgIE5vRGVmYXVsdFJvb3QoKQogICAgIHJvb3QgPSBUayhjbGFzc05hbWU9IklkbGUiKQogICAgIHJvb3Qud2l0aGRyYXcoKQogCkBAIC0xNTQ5LDI1ICsxNDYxLDE5IEBACiAgICAgaWYgc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgogICAgICAgICBpY29uZmlsZSA9IG9zLnBhdGguam9pbihpY29uZGlyLCAnaWRsZS5pY28nKQogICAgICAgICByb290LndtX2ljb25iaXRtYXAoZGVmYXVsdD1pY29uZmlsZSkKLSAgICBlbGlmIFRrVmVyc2lvbiA+PSA4LjU6CisgICAgZWxzZToKICAgICAgICAgZXh0ID0gJy5wbmcnIGlmIFRrVmVyc2lvbiA+PSA4LjYgZWxzZSAnLmdpZicKICAgICAgICAgaWNvbmZpbGVzID0gW29zLnBhdGguam9pbihpY29uZGlyLCAnaWRsZV8lZCVzJyAlIChzaXplLCBleHQpKQogICAgICAgICAgICAgICAgICAgICAgZm9yIHNpemUgaW4gKDE2LCAzMiwgNDgpXQotICAgICAgICBpY29ucyA9IFtQaG90b0ltYWdlKGZpbGU9aWNvbmZpbGUpIGZvciBpY29uZmlsZSBpbiBpY29uZmlsZXNdCisgICAgICAgIGljb25zID0gW1Bob3RvSW1hZ2UobWFzdGVyPXJvb3QsIGZpbGU9aWNvbmZpbGUpCisgICAgICAgICAgICAgICAgIGZvciBpY29uZmlsZSBpbiBpY29uZmlsZXNdCiAgICAgICAgIHJvb3Qud21faWNvbnBob3RvKFRydWUsICppY29ucykKIAorICAgICMgc3RhcnQgZWRpdG9yIGFuZC9vciBzaGVsbCB3aW5kb3dzOgogICAgIGZpeHdvcmRicmVha3Mocm9vdCkKICAgICBmaXhfeDExX3Bhc3RlKHJvb3QpCiAgICAgZmxpc3QgPSBQeVNoZWxsRmlsZUxpc3Qocm9vdCkKLSAgICBtYWNvc3hTdXBwb3J0LnNldHVwQXBwKHJvb3QsIGZsaXN0KQotCi0gICAgaWYgbWFjb3N4U3VwcG9ydC5pc0FxdWFUaygpOgotICAgICAgICAjIFRoZXJlIGFyZSBzb21lIHNjcmV3ZWQgdXAgPDI+IGNsYXNzIGJpbmRpbmdzIGZvciB0ZXh0Ci0gICAgICAgICMgd2lkZ2V0cyBkZWZpbmVkIGluIFRrIHdoaWNoIHdlIG5lZWQgdG8gZG8gYXdheSB3aXRoLgotICAgICAgICAjIFNlZSBpc3N1ZSAjMjQ4MDEuCi0gICAgICAgIHJvb3QudW5iaW5kX2NsYXNzKCdUZXh0JywgJzxCMj4nKQotICAgICAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8QjItTW90aW9uPicpCi0gICAgICAgIHJvb3QudW5iaW5kX2NsYXNzKCdUZXh0JywgJzw8UGFzdGVTZWxlY3Rpb24+PicpCisgICAgbWFjb3N4LnNldHVwQXBwKHJvb3QsIGZsaXN0KQogCiAgICAgaWYgZW5hYmxlX2VkaXQ6CiAgICAgICAgIGlmIG5vdCAoY21kIG9yIHNjcmlwdCk6CkBAIC0xNTgyLDcgKzE0ODgsNyBAQAogICAgICAgICBzaGVsbCA9IGZsaXN0Lm9wZW5fc2hlbGwoKQogICAgICAgICBpZiBub3Qgc2hlbGw6CiAgICAgICAgICAgICByZXR1cm4gIyBjb3VsZG4ndCBvcGVuIHNoZWxsCi0gICAgICAgIGlmIG1hY29zeFN1cHBvcnQuaXNBcXVhVGsoKSBhbmQgZmxpc3QuZGljdDoKKyAgICAgICAgaWYgbWFjb3N4LmlzQXF1YVRrKCkgYW5kIGZsaXN0LmRpY3Q6CiAgICAgICAgICAgICAjIE9uIE9TWDogd2hlbiB0aGUgdXNlciBoYXMgZG91YmxlLWNsaWNrZWQgb24gYSBmaWxlIHRoYXQgY2F1c2VzCiAgICAgICAgICAgICAjIElETEUgdG8gYmUgbGF1bmNoZWQgdGhlIHNoZWxsIHdpbmRvdyB3aWxsIG9wZW4ganVzdCBpbiBmcm9udCBvZgogICAgICAgICAgICAgIyB0aGUgZmlsZSBzaGUgd2FudHMgdG8gc2VlLiBMb3dlciB0aGUgaW50ZXJwcmV0ZXIgd2luZG93IHdoZW4KQEAgLTE2MTYsNyArMTUyMiw3IEBACiAgICAgICAgICMgY2hlY2sgZm9yIHByb2JsZW1hdGljIE9TIFggVGsgdmVyc2lvbnMgYW5kIHByaW50IGEgd2FybmluZwogICAgICAgICAjIG1lc3NhZ2UgaW4gdGhlIElETEUgc2hlbGwgd2luZG93OyB0aGlzIGlzIGxlc3MgaW50cnVzaXZlCiAgICAgICAgICMgdGhhbiBhbHdheXMgb3BlbmluZyBhIHNlcGFyYXRlIHdpbmRvdy4KLSAgICAgICAgdGt2ZXJzaW9ud2FybmluZyA9IG1hY29zeFN1cHBvcnQudGtWZXJzaW9uV2FybmluZyhyb290KQorICAgICAgICB0a3ZlcnNpb253YXJuaW5nID0gbWFjb3N4LnRrVmVyc2lvbldhcm5pbmcocm9vdCkKICAgICAgICAgaWYgdGt2ZXJzaW9ud2FybmluZzoKICAgICAgICAgICAgIHNoZWxsLmludGVycC5ydW5jb21tYW5kKCJwcmludCgnJXMnKSIgJSB0a3ZlcnNpb253YXJuaW5nKQogCkBAIC0xNjI2LDcgKzE1MzIsNyBAQAogICAgIGNhcHR1cmVfd2FybmluZ3MoRmFsc2UpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgc3lzLm1vZHVsZXNbJ1B5U2hlbGwnXSA9IHN5cy5tb2R1bGVzWydfX21haW5fXyddCisgICAgc3lzLm1vZHVsZXNbJ3B5c2hlbGwnXSA9IHN5cy5tb2R1bGVzWydfX21haW5fXyddCiAgICAgbWFpbigpCiAKIGNhcHR1cmVfd2FybmluZ3MoRmFsc2UpICAjIE1ha2Ugc3VyZSB0dXJuZWQgb2ZmOyBzZWUgaXNzdWUgMTgwODEKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL3F1ZXJ5LnB5IGIvTGliL2lkbGVsaWIvcXVlcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxZjFlMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL3F1ZXJ5LnB5CkBAIC0wLDAgKzEsMzA4IEBACisiIiIKK0RpYWxvZ3MgdGhhdCBxdWVyeSB1c2VycyBhbmQgdmVyaWZ5IHRoZSBhbnN3ZXIgYmVmb3JlIGFjY2VwdGluZy4KK1VzZSB0dGsgd2lkZ2V0cywgbGltaXRpbmcgdXNlIHRvIHRjbC90ayA4LjUrLCBhcyBpbiBJRExFIDMuNisuCisKK1F1ZXJ5IGlzIHRoZSBnZW5lcmljIGJhc2UgY2xhc3MgZm9yIGEgcG9wdXAgZGlhbG9nLgorVGhlIHVzZXIgbXVzdCBlaXRoZXIgZW50ZXIgYSB2YWxpZCBhbnN3ZXIgb3IgY2xvc2UgdGhlIGRpYWxvZy4KK0VudHJpZXMgYXJlIHZhbGlkYXRlZCB3aGVuIDxSZXR1cm4+IGlzIGVudGVyZWQgb3IgW09rXSBpcyBjbGlja2VkLgorRW50cmllcyBhcmUgaWdub3JlZCB3aGVuIFtDYW5jZWxdIG9yIFtYXSBhcmUgY2xpY2tlZC4KK1RoZSAncmV0dXJuIHZhbHVlJyBpcyAucmVzdWx0IHNldCB0byBlaXRoZXIgYSB2YWxpZCBhbnN3ZXIgb3IgTm9uZS4KKworU3ViY2xhc3MgU2VjdGlvbk5hbWUgZ2V0cyBhIG5hbWUgZm9yIGEgbmV3IGNvbmZpZyBmaWxlIHNlY3Rpb24uCitDb25maWdkaWFsb2cgdXNlcyBpdCBmb3IgbmV3IGhpZ2hsaWdodCB0aGVtZSBhbmQga2V5YmluZGluZyBzZXQgbmFtZXMuCitTdWJjbGFzcyBNb2R1bGVOYW1lIGdldHMgYSBuYW1lIGZvciBGaWxlID0+IE9wZW4gTW9kdWxlLgorU3ViY2xhc3MgSGVscFNvdXJjZSBnZXRzIG1lbnUgaXRlbSBhbmQgcGF0aCBmb3IgYWRkaXRpb25zIHRvIEhlbHAgbWVudS4KKyIiIgorIyBRdWVyeSBhbmQgU2VjdGlvbiBuYW1lIHJlc3VsdCBmcm9tIHNwbGl0dGluZyBHZXRDZmdTZWN0aW9uTmFtZURpYWxvZworIyBvZiBjb25maWdTZWN0aW9uTmFtZURpYWxvZy5weSAodGVtcG9yYXJpbHkgY29uZmlnX3NlYy5weSkgaW50bworIyBnZW5lcmljIGFuZCBzcGVjaWZpYyBwYXJ0cy4gIDMuNiBvbmx5LCBKdWx5IDIwMTYuCisjIE1vZHVsZU5hbWUuZW50cnlfb2sgY2FtZSBmcm9tIGVkaXRvci5FZGl0b3JXaW5kb3cubG9hZF9tb2R1bGUuCisjIEhlbHBTb3VyY2Ugd2FzIGV4dHJhY3RlZCBmcm9tIGNvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5ICh0ZW1wb3JhcmlseQorIyBjb25maWdfaGVscC5weSksIHdpdGggZGFyd2luIGNvZGUgbW92ZWQgZnJvbSBvayB0byBwYXRoX29rLgorCitpbXBvcnQgaW1wb3J0bGliCitpbXBvcnQgb3MKK2Zyb20gc3lzIGltcG9ydCBleGVjdXRhYmxlLCBwbGF0Zm9ybSAgIyBQbGF0Zm9ybSBpcyBzZXQgZm9yIG9uZSB0ZXN0LgorCitmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBTdHJpbmdWYXIsIFcsIEUsIE4sIFMKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IEZyYW1lLCBCdXR0b24sIEVudHJ5LCBMYWJlbAorZnJvbSB0a2ludGVyIGltcG9ydCBmaWxlZGlhbG9nCitmcm9tIHRraW50ZXIuZm9udCBpbXBvcnQgRm9udAorCitjbGFzcyBRdWVyeShUb3BsZXZlbCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgZ2V0dGluZyB2ZXJpZmllZCBhbnN3ZXIgZnJvbSBhIHVzZXIuCisKKyAgICBGb3IgdGhpcyBiYXNlIGNsYXNzLCBhY2NlcHQgYW55IG5vbi1ibGFuayBzdHJpbmcuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsICosIHRleHQwPScnLCB1c2VkX25hbWVzPXt9LAorICAgICAgICAgICAgICAgICBfaHRlc3Q9RmFsc2UsIF91dGVzdD1GYWxzZSk6CisgICAgICAgICIiIkNyZWF0ZSBwb3B1cCwgZG8gbm90IHJldHVybiB1bnRpbCB0ayB3aWRnZXQgZGVzdHJveWVkLgorCisgICAgICAgIEFkZGl0aW9uYWwgc3ViY2xhc3MgaW5pdCBtdXN0IGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgdGhpcworICAgICAgICB1bmxlc3MgIF91dGVzdD1UcnVlIGlzIHBhc3NlZCB0byBzdXBwcmVzcyB3YWl0X3dpbmRvdygpLgorCisgICAgICAgIHRpdGxlIC0gc3RyaW5nLCB0aXRsZSBvZiBwb3B1cCBkaWFsb2cKKyAgICAgICAgbWVzc2FnZSAtIHN0cmluZywgaW5mb3JtYXRpb25hbCBtZXNzYWdlIHRvIGRpc3BsYXkKKyAgICAgICAgdGV4dDAgLSBpbml0aWFsIHZhbHVlIGZvciBlbnRyeQorICAgICAgICB1c2VkX25hbWVzIC0gbmFtZXMgYWxyZWFkeSBpbiB1c2UKKyAgICAgICAgX2h0ZXN0IC0gYm9vbCwgY2hhbmdlIGJveCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcgaHRlc3QKKyAgICAgICAgX3V0ZXN0IC0gYm9vbCwgbGVhdmUgd2luZG93IGhpZGRlbiBhbmQgbm90IG1vZGFsCisgICAgICAgICIiIgorICAgICAgICBUb3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCisgICAgICAgIHNlbGYud2l0aGRyYXcoKSAgIyBIaWRlIHdoaWxlIGNvbmZpZ3VyaW5nLCBlc3BlY2lhbGx5IGdlb21ldHJ5LgorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorICAgICAgICBzZWxmLnRpdGxlKHRpdGxlKQorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgICAgIHNlbGYudGV4dDAgPSB0ZXh0MAorICAgICAgICBzZWxmLnVzZWRfbmFtZXMgPSB1c2VkX25hbWVzCisgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKKyAgICAgICAgc2VsZi5ncmFiX3NldCgpCisgICAgICAgIHdpbmRvd2luZ3N5c3RlbSA9IHNlbGYudGsuY2FsbCgndGsnLCAnd2luZG93aW5nc3lzdGVtJykKKyAgICAgICAgaWYgd2luZG93aW5nc3lzdGVtID09ICdhcXVhJzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJzo6dGs6OnVuc3VwcG9ydGVkOjpNYWNXaW5kb3dTdHlsZScsICdzdHlsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3csICdtb3ZlYWJsZU1vZGFsJywgJycpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2VsZi5iaW5kKCI8Q29tbWFuZC0uPiIsIHNlbGYuY2FuY2VsKQorICAgICAgICBzZWxmLmJpbmQoJzxLZXktRXNjYXBlPicsIHNlbGYuY2FuY2VsKQorICAgICAgICBzZWxmLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5jYW5jZWwpCisgICAgICAgIHNlbGYuYmluZCgnPEtleS1SZXR1cm4+Jywgc2VsZi5vaykKKyAgICAgICAgc2VsZi5iaW5kKCI8S1BfRW50ZXI+Iiwgc2VsZi5vaykKKyAgICAgICAgc2VsZi5yZXNpemFibGUoaGVpZ2h0PUZhbHNlLCB3aWR0aD1GYWxzZSkKKyAgICAgICAgc2VsZi5jcmVhdGVfd2lkZ2V0cygpCisgICAgICAgIHNlbGYudXBkYXRlX2lkbGV0YXNrcygpICAjIE5lZWRlZCBoZXJlIGZvciB3aW5mb19yZXF3aWR0aCBiZWxvdy4KKyAgICAgICAgc2VsZi5nZW9tZXRyeSggICMgQ2VudGVyIGRpYWxvZyBvdmVyIHBhcmVudCAob3IgYmVsb3cgaHRlc3QgYm94KS4KKyAgICAgICAgICAgICAgICAiKyVkKyVkIiAlICgKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R4KCkgKworICAgICAgICAgICAgICAgICAgICAocGFyZW50LndpbmZvX3dpZHRoKCkvMiAtIHNlbGYud2luZm9fcmVxd2lkdGgoKS8yKSwKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R5KCkgKworICAgICAgICAgICAgICAgICAgICAoKHBhcmVudC53aW5mb19oZWlnaHQoKS8yIC0gc2VsZi53aW5mb19yZXFoZWlnaHQoKS8yKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgX2h0ZXN0IGVsc2UgMTUwKQorICAgICAgICAgICAgICAgICkgKQorICAgICAgICBpZiBub3QgX3V0ZXN0OgorICAgICAgICAgICAgc2VsZi5kZWljb25pZnkoKSAgIyBVbmhpZGUgbm93IHRoYXQgZ2VvbWV0cnkgc2V0LgorICAgICAgICAgICAgc2VsZi53YWl0X3dpbmRvdygpCisKKyAgICBkZWYgY3JlYXRlX3dpZGdldHMoc2VsZik6ICAjIENhbGwgZnJvbSBvdmVycmlkZSwgaWYgYW55LgorICAgICAgICAjIEJpbmQgdG8gc2VsZiB3aWRnZXRzIG5lZWRlZCBmb3IgZW50cnlfb2sgb3IgdW5pdHRlc3QuCisgICAgICAgIHNlbGYuZnJhbWUgPSBmcmFtZSA9IEZyYW1lKHNlbGYsIHBhZGRpbmc9MTApCisgICAgICAgIGZyYW1lLmdyaWQoY29sdW1uPTAsIHJvdz0wLCBzdGlja3k9J25ld3MnKQorICAgICAgICBmcmFtZS5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgwLCB3ZWlnaHQ9MSkKKworICAgICAgICBlbnRyeWxhYmVsID0gTGFiZWwoZnJhbWUsIGFuY2hvcj0ndycsIGp1c3RpZnk9J2xlZnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1zZWxmLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuZW50cnl2YXIgPSBTdHJpbmdWYXIoc2VsZiwgc2VsZi50ZXh0MCkKKyAgICAgICAgc2VsZi5lbnRyeSA9IEVudHJ5KGZyYW1lLCB3aWR0aD0zMCwgdGV4dHZhcmlhYmxlPXNlbGYuZW50cnl2YXIpCisgICAgICAgIHNlbGYuZW50cnkuZm9jdXNfc2V0KCkKKyAgICAgICAgc2VsZi5lcnJvcl9mb250ID0gRm9udChuYW1lPSdUa0NhcHRpb25Gb250JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHM9VHJ1ZSwgcm9vdD1zZWxmLnBhcmVudCkKKyAgICAgICAgc2VsZi5lbnRyeV9lcnJvciA9IExhYmVsKGZyYW1lLCB0ZXh0PScgJywgZm9yZWdyb3VuZD0ncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ9c2VsZi5lcnJvcl9mb250KQorICAgICAgICBzZWxmLmJ1dHRvbl9vayA9IEJ1dHRvbigKKyAgICAgICAgICAgICAgICBmcmFtZSwgdGV4dD0nT0snLCBkZWZhdWx0PSdhY3RpdmUnLCBjb21tYW5kPXNlbGYub2spCisgICAgICAgIHNlbGYuYnV0dG9uX2NhbmNlbCA9IEJ1dHRvbigKKyAgICAgICAgICAgICAgICBmcmFtZSwgdGV4dD0nQ2FuY2VsJywgY29tbWFuZD1zZWxmLmNhbmNlbCkKKworICAgICAgICBlbnRyeWxhYmVsLmdyaWQoY29sdW1uPTAsIHJvdz0wLCBjb2x1bW5zcGFuPTMsIHBhZHg9NSwgc3RpY2t5PVcpCisgICAgICAgIHNlbGYuZW50cnkuZ3JpZChjb2x1bW49MCwgcm93PTEsIGNvbHVtbnNwYW49MywgcGFkeD01LCBzdGlja3k9VytFLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFkeT1bMTAsMF0pCisgICAgICAgIHNlbGYuZW50cnlfZXJyb3IuZ3JpZChjb2x1bW49MCwgcm93PTIsIGNvbHVtbnNwYW49MywgcGFkeD01LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5PVcrRSkKKyAgICAgICAgc2VsZi5idXR0b25fb2suZ3JpZChjb2x1bW49MSwgcm93PTk5LCBwYWR4PTUpCisgICAgICAgIHNlbGYuYnV0dG9uX2NhbmNlbC5ncmlkKGNvbHVtbj0yLCByb3c9OTksIHBhZHg9NSkKKworICAgIGRlZiBzaG93ZXJyb3Ioc2VsZiwgbWVzc2FnZSwgd2lkZ2V0PU5vbmUpOgorICAgICAgICAjc2VsZi5iZWxsKGRpc3BsYXlvZj1zZWxmKQorICAgICAgICAod2lkZ2V0IG9yIHNlbGYuZW50cnlfZXJyb3IpWyd0ZXh0J10gPSAnRVJST1I6ICcgKyBtZXNzYWdlCisKKyAgICBkZWYgZW50cnlfb2soc2VsZik6ICAjIEV4YW1wbGU6IHVzdWFsbHkgcmVwbGFjZS4KKyAgICAgICAgIlJldHVybiBub24tYmxhbmsgZW50cnkgb3IgTm9uZS4iCisgICAgICAgIHNlbGYuZW50cnlfZXJyb3JbJ3RleHQnXSA9ICcnCisgICAgICAgIGVudHJ5ID0gc2VsZi5lbnRyeS5nZXQoKS5zdHJpcCgpCisgICAgICAgIGlmIG5vdCBlbnRyeToKKyAgICAgICAgICAgIHNlbGYuc2hvd2Vycm9yKCdibGFuayBsaW5lLicpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gZW50cnkKKworICAgIGRlZiBvayhzZWxmLCBldmVudD1Ob25lKTogICMgRG8gbm90IHJlcGxhY2UuCisgICAgICAgICcnJ0lmIGVudHJ5IGlzIHZhbGlkLCBiaW5kIGl0IHRvICdyZXN1bHQnIGFuZCBkZXN0cm95IHRrIHdpZGdldC4KKworICAgICAgICBPdGhlcndpc2UgbGVhdmUgZGlhbG9nIG9wZW4gZm9yIHVzZXIgdG8gY29ycmVjdCBlbnRyeSBvciBjYW5jZWwuCisgICAgICAgICcnJworICAgICAgICBlbnRyeSA9IHNlbGYuZW50cnlfb2soKQorICAgICAgICBpZiBlbnRyeSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gZW50cnkKKyAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFtPa10gbW92ZXMgZm9jdXMuICAoPFJldHVybj4gZG9lcyBub3QuKSAgTW92ZSBpdCBiYWNrLgorICAgICAgICAgICAgc2VsZi5lbnRyeS5mb2N1c19zZXQoKQorCisgICAgZGVmIGNhbmNlbChzZWxmLCBldmVudD1Ob25lKTogICMgRG8gbm90IHJlcGxhY2UuCisgICAgICAgICJTZXQgZGlhbG9nIHJlc3VsdCB0byBOb25lIGFuZCBkZXN0cm95IHRrIHdpZGdldC4iCisgICAgICAgIHNlbGYucmVzdWx0ID0gTm9uZQorICAgICAgICBzZWxmLmRlc3Ryb3koKQorCisKK2NsYXNzIFNlY3Rpb25OYW1lKFF1ZXJ5KToKKyAgICAiR2V0IGEgbmFtZSBmb3IgYSBjb25maWcgZmlsZSBzZWN0aW9uIG5hbWUuIgorICAgICMgVXNlZCBpbiBDb25maWdEaWFsb2cuR2V0TmV3S2V5c05hbWUsIC5HZXROZXdUaGVtZU5hbWUgKDgzNykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLCB1c2VkX25hbWVzLAorICAgICAgICAgICAgICAgICAqLCBfaHRlc3Q9RmFsc2UsIF91dGVzdD1GYWxzZSk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18ocGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgdXNlZF9uYW1lcz11c2VkX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9odGVzdD1faHRlc3QsIF91dGVzdD1fdXRlc3QpCisKKyAgICBkZWYgZW50cnlfb2soc2VsZik6CisgICAgICAgICJSZXR1cm4gc2Vuc2libGUgQ29uZmlnUGFyc2VyIHNlY3Rpb24gbmFtZSBvciBOb25lLiIKKyAgICAgICAgc2VsZi5lbnRyeV9lcnJvclsndGV4dCddID0gJycKKyAgICAgICAgbmFtZSA9IHNlbGYuZW50cnkuZ2V0KCkuc3RyaXAoKQorICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgIHNlbGYuc2hvd2Vycm9yKCdubyBuYW1lIHNwZWNpZmllZC4nKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxpZiBsZW4obmFtZSk+MzA6CisgICAgICAgICAgICBzZWxmLnNob3dlcnJvcignbmFtZSBpcyBsb25nZXIgdGhhbiAzMCBjaGFyYWN0ZXJzLicpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbGlmIG5hbWUgaW4gc2VsZi51c2VkX25hbWVzOgorICAgICAgICAgICAgc2VsZi5zaG93ZXJyb3IoJ25hbWUgaXMgYWxyZWFkeSBpbiB1c2UuJykKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBuYW1lCisKKworY2xhc3MgTW9kdWxlTmFtZShRdWVyeSk6CisgICAgIkdldCBhIG1vZHVsZSBuYW1lIGZvciBPcGVuIE1vZHVsZSBtZW51IGVudHJ5LiIKKyAgICAjIFVzZWQgaW4gb3Blbl9tb2R1bGUgKGVkaXRvci5FZGl0b3JXaW5kb3cgdW50aWwgbW92ZSB0byBpb2JpbmRpbmcpLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsIHRleHQwLAorICAgICAgICAgICAgICAgICAqLCBfaHRlc3Q9RmFsc2UsIF91dGVzdD1GYWxzZSk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18ocGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgdGV4dDA9dGV4dDAsCisgICAgICAgICAgICAgICAgICAgICAgIF9odGVzdD1faHRlc3QsIF91dGVzdD1fdXRlc3QpCisKKyAgICBkZWYgZW50cnlfb2soc2VsZik6CisgICAgICAgICJSZXR1cm4gZW50ZXJlZCBtb2R1bGUgbmFtZSBhcyBmaWxlIHBhdGggb3IgTm9uZS4iCisgICAgICAgIHNlbGYuZW50cnlfZXJyb3JbJ3RleHQnXSA9ICcnCisgICAgICAgIG5hbWUgPSBzZWxmLmVudHJ5LmdldCgpLnN0cmlwKCkKKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICBzZWxmLnNob3dlcnJvcignbm8gbmFtZSBzcGVjaWZpZWQuJykKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICMgWFhYIE91Z2h0IHRvIGluc2VydCBjdXJyZW50IGZpbGUncyBkaXJlY3RvcnkgaW4gZnJvbnQgb2YgcGF0aC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLmZpbmRfc3BlYyhuYW1lKQorICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIEltcG9ydEVycm9yKSBhcyBtc2c6CisgICAgICAgICAgICBzZWxmLnNob3dlcnJvcihzdHIobXNnKSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIHNwZWMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2hvd2Vycm9yKCJtb2R1bGUgbm90IGZvdW5kIikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNwZWMubG9hZGVyLCBpbXBvcnRsaWIuYWJjLlNvdXJjZUxvYWRlcik6CisgICAgICAgICAgICBzZWxmLnNob3dlcnJvcigibm90IGEgc291cmNlLWJhc2VkIG1vZHVsZSIpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlX3BhdGggPSBzcGVjLmxvYWRlci5nZXRfZmlsZW5hbWUobmFtZSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5zaG93ZXJyb3IoImxvYWRlciBkb2VzIG5vdCBzdXBwb3J0IGdldF9maWxlbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gZmlsZV9wYXRoCisKKworY2xhc3MgSGVscFNvdXJjZShRdWVyeSk6CisgICAgIkdldCBtZW51IG5hbWUgYW5kIGhlbHAgc291cmNlIGZvciBIZWxwIG1lbnUuIgorICAgICMgVXNlZCBpbiBDb25maWdEaWFsb2cuSGVscExpc3RJdGVtQWRkL0VkaXQsICg5NDEvOSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCAqLCBtZW51aXRlbT0nJywgZmlsZXBhdGg9JycsCisgICAgICAgICAgICAgICAgIHVzZWRfbmFtZXM9e30sIF9odGVzdD1GYWxzZSwgX3V0ZXN0PUZhbHNlKToKKyAgICAgICAgIiIiR2V0IG1lbnUgZW50cnkgYW5kIHVybC9sb2NhbCBmaWxlIGZvciBBZGRpdGlvbmFsIEhlbHAuCisKKyAgICAgICAgVXNlciBlbnRlcnMgYSBuYW1lIGZvciB0aGUgSGVscCByZXNvdXJjZSBhbmQgYSB3ZWIgdXJsIG9yIGZpbGUKKyAgICAgICAgbmFtZS4gVGhlIHVzZXIgY2FuIGJyb3dzZSBmb3IgdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmZpbGVwYXRoID0gZmlsZXBhdGgKKyAgICAgICAgbWVzc2FnZSA9ICdOYW1lIGZvciBpdGVtIG9uIEhlbHAgbWVudTonCisgICAgICAgIHN1cGVyKCkuX19pbml0X18oCisgICAgICAgICAgICAgICAgcGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgdGV4dDA9bWVudWl0ZW0sCisgICAgICAgICAgICAgICAgdXNlZF9uYW1lcz11c2VkX25hbWVzLCBfaHRlc3Q9X2h0ZXN0LCBfdXRlc3Q9X3V0ZXN0KQorCisgICAgZGVmIGNyZWF0ZV93aWRnZXRzKHNlbGYpOgorICAgICAgICBzdXBlcigpLmNyZWF0ZV93aWRnZXRzKCkKKyAgICAgICAgZnJhbWUgPSBzZWxmLmZyYW1lCisgICAgICAgIHBhdGhsYWJlbCA9IExhYmVsKGZyYW1lLCBhbmNob3I9J3cnLCBqdXN0aWZ5PSdsZWZ0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nSGVscCBGaWxlIFBhdGg6IEVudGVyIFVSTCBvciBicm93c2UgZm9yIGZpbGUnKQorICAgICAgICBzZWxmLnBhdGh2YXIgPSBTdHJpbmdWYXIoc2VsZiwgc2VsZi5maWxlcGF0aCkKKyAgICAgICAgc2VsZi5wYXRoID0gRW50cnkoZnJhbWUsIHRleHR2YXJpYWJsZT1zZWxmLnBhdGh2YXIsIHdpZHRoPTQwKQorICAgICAgICBicm93c2UgPSBCdXR0b24oZnJhbWUsIHRleHQ9J0Jyb3dzZScsIHdpZHRoPTgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuYnJvd3NlX2ZpbGUpCisgICAgICAgIHNlbGYucGF0aF9lcnJvciA9IExhYmVsKGZyYW1lLCB0ZXh0PScgJywgZm9yZWdyb3VuZD0ncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udD1zZWxmLmVycm9yX2ZvbnQpCisKKyAgICAgICAgcGF0aGxhYmVsLmdyaWQoY29sdW1uPTAsIHJvdz0xMCwgY29sdW1uc3Bhbj0zLCBwYWR4PTUsIHBhZHk9WzEwLDBdLAorICAgICAgICAgICAgICAgICAgICAgICBzdGlja3k9VykKKyAgICAgICAgc2VsZi5wYXRoLmdyaWQoY29sdW1uPTAsIHJvdz0xMSwgY29sdW1uc3Bhbj0yLCBwYWR4PTUsIHN0aWNreT1XK0UsCisgICAgICAgICAgICAgICAgICAgICAgIHBhZHk9WzEwLDBdKQorICAgICAgICBicm93c2UuZ3JpZChjb2x1bW49Miwgcm93PTExLCBwYWR4PTUsIHN0aWNreT1XK1MpCisgICAgICAgIHNlbGYucGF0aF9lcnJvci5ncmlkKGNvbHVtbj0wLCByb3c9MTIsIGNvbHVtbnNwYW49MywgcGFkeD01LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3k9VytFKQorCisgICAgZGVmIGFza2ZpbGVuYW1lKHNlbGYsIGZpbGV0eXBlcywgaW5pdGRpciwgaW5pdGZpbGUpOiAgIyBodGVzdCAjCisgICAgICAgICMgRXh0cmFjdGVkIGZyb20gYnJvd3NlX2ZpbGUgc28gY2FuIG1vY2sgZm9yIHVuaXR0ZXN0cy4KKyAgICAgICAgIyBDYW5ub3QgdW5pdHRlc3QgYXMgY2Fubm90IHNpbXVsYXRlIGJ1dHRvbiBjbGlja3MuCisgICAgICAgICMgVGVzdCBieSBydW5uaW5nIGh0ZXN0LCBzdWNoIGFzIGJ5IHJ1bm5pbmcgdGhpcyBmaWxlLgorICAgICAgICByZXR1cm4gZmlsZWRpYWxvZy5PcGVuKHBhcmVudD1zZWxmLCBmaWxldHlwZXM9ZmlsZXR5cGVzKVwKKyAgICAgICAgICAgICAgIC5zaG93KGluaXRpYWxkaXI9aW5pdGRpciwgaW5pdGlhbGZpbGU9aW5pdGZpbGUpCisKKyAgICBkZWYgYnJvd3NlX2ZpbGUoc2VsZik6CisgICAgICAgIGZpbGV0eXBlcyA9IFsKKyAgICAgICAgICAgICgiSFRNTCBGaWxlcyIsICIqLmh0bSAqLmh0bWwiLCAiVEVYVCIpLAorICAgICAgICAgICAgKCJQREYgRmlsZXMiLCAiKi5wZGYiLCAiVEVYVCIpLAorICAgICAgICAgICAgKCJXaW5kb3dzIEhlbHAgRmlsZXMiLCAiKi5jaG0iKSwKKyAgICAgICAgICAgICgiVGV4dCBGaWxlcyIsICIqLnR4dCIsICJURVhUIiksCisgICAgICAgICAgICAoIkFsbCBGaWxlcyIsICIqIildCisgICAgICAgIHBhdGggPSBzZWxmLnBhdGh2YXIuZ2V0KCkKKyAgICAgICAgaWYgcGF0aDoKKyAgICAgICAgICAgIGRpciwgYmFzZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhc2UgPSBOb25lCisgICAgICAgICAgICBpZiBwbGF0Zm9ybVs6M10gPT0gJ3dpbic6CisgICAgICAgICAgICAgICAgZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShleGVjdXRhYmxlKSwgJ0RvYycpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGlyKToKKyAgICAgICAgICAgICAgICAgICAgZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgZmlsZSA9IHNlbGYuYXNrZmlsZW5hbWUoZmlsZXR5cGVzLCBkaXIsIGJhc2UpCisgICAgICAgIGlmIGZpbGU6CisgICAgICAgICAgICBzZWxmLnBhdGh2YXIuc2V0KGZpbGUpCisKKyAgICBpdGVtX29rID0gU2VjdGlvbk5hbWUuZW50cnlfb2sgICMgbG9jYWxpemUgZm9yIHRlc3Qgb3ZlcnJpZGUKKworICAgIGRlZiBwYXRoX29rKHNlbGYpOgorICAgICAgICAiU2ltcGxlIHZhbGlkaXR5IGNoZWNrIGZvciBtZW51IGZpbGUgcGF0aCIKKyAgICAgICAgcGF0aCA9IHNlbGYucGF0aC5nZXQoKS5zdHJpcCgpCisgICAgICAgIGlmIG5vdCBwYXRoOiAjbm8gcGF0aCBzcGVjaWZpZWQKKyAgICAgICAgICAgIHNlbGYuc2hvd2Vycm9yKCdubyBoZWxwIGZpbGUgcGF0aCBzcGVjaWZpZWQuJywgc2VsZi5wYXRoX2Vycm9yKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxpZiBub3QgcGF0aC5zdGFydHN3aXRoKCgnd3d3LicsICdodHRwJykpOgorICAgICAgICAgICAgaWYgcGF0aFs6NV0gPT0gJ2ZpbGU6JzoKKyAgICAgICAgICAgICAgICBwYXRoID0gcGF0aFs1Ol0KKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICBzZWxmLnNob3dlcnJvcignaGVscCBmaWxlIHBhdGggZG9lcyBub3QgZXhpc3QuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGhfZXJyb3IpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGlmIHBsYXRmb3JtID09ICdkYXJ3aW4nOiAgIyBmb3IgTWFjIFNhZmFyaQorICAgICAgICAgICAgICAgIHBhdGggPSAgImZpbGU6Ly8iICsgcGF0aAorICAgICAgICByZXR1cm4gcGF0aAorCisgICAgZGVmIGVudHJ5X29rKHNlbGYpOgorICAgICAgICAiUmV0dXJuIGFwcGFyZW50bHkgdmFsaWQgKG5hbWUsIHBhdGgpIG9yIE5vbmUiCisgICAgICAgIHNlbGYuZW50cnlfZXJyb3JbJ3RleHQnXSA9ICcnCisgICAgICAgIHNlbGYucGF0aF9lcnJvclsndGV4dCddID0gJycKKyAgICAgICAgbmFtZSA9IHNlbGYuaXRlbV9vaygpCisgICAgICAgIHBhdGggPSBzZWxmLnBhdGhfb2soKQorICAgICAgICByZXR1cm4gTm9uZSBpZiBuYW1lIGlzIE5vbmUgb3IgcGF0aCBpcyBOb25lIGVsc2UgKG5hbWUsIHBhdGgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3F1ZXJ5JywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oUXVlcnksIEhlbHBTb3VyY2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9XaWRnZXRSZWRpcmVjdG9yLnB5IGIvTGliL2lkbGVsaWIvcmVkaXJlY3Rvci5weQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9XaWRnZXRSZWRpcmVjdG9yLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9yZWRpcmVjdG9yLnB5CmluZGV4IGI2NmJlOWUuLmVjNjgxZGUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHkKKysrIGIvTGliL2lkbGVsaWIvcmVkaXJlY3Rvci5weQpAQCAtMTA0LDcgKzEwNCw3IEBACiAKICAgICAgICAgTm90ZSB0aGF0IGlmIGEgcmVnaXN0ZXJlZCBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBvcGVyYXRpb24gaXMgbm90CiAgICAgICAgIHBhc3NlZCB0aHJvdWdoIHRvIFRrLiAgQXBwbHkgdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IHNlbGYucmVnaXN0ZXIoKQotICAgICAgICB0byAqYXJncyB0byBhY2NvbXBsaXNoIHRoYXQuICBGb3IgYW4gZXhhbXBsZSwgc2VlIENvbG9yRGVsZWdhdG9yLnB5LgorICAgICAgICB0byAqYXJncyB0byBhY2NvbXBsaXNoIHRoYXQuICBGb3IgYW4gZXhhbXBsZSwgc2VlIGNvbG9yaXplci5weS4KIAogICAgICAgICAnJycKICAgICAgICAgbSA9IHNlbGYuX29wZXJhdGlvbnMuZ2V0KG9wZXJhdGlvbikKQEAgLTE1MSwxNCArMTUxLDEzIEBACiAKIAogZGVmIF93aWRnZXRfcmVkaXJlY3RvcihwYXJlbnQpOiAgIyBodGVzdCAjCi0gICAgZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dAotICAgIGltcG9ydCByZQorICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwsIFRleHQKIAotICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBXaWRnZXRSZWRpcmVjdG9yIikKLSAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCi0gICAgdGV4dCA9IFRleHQocm9vdCkKKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCisgICAgdG9wLnRpdGxlKCJUZXN0IFdpZGdldFJlZGlyZWN0b3IiKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSArIDE3NSkpCisgICAgdGV4dCA9IFRleHQodG9wKQogICAgIHRleHQucGFjaygpCiAgICAgdGV4dC5mb2N1c19zZXQoKQogICAgIHJlZGlyID0gV2lkZ2V0UmVkaXJlY3Rvcih0ZXh0KQpAQCAtMTY2LDExICsxNjUsMTEgQEAKICAgICAgICAgcHJpbnQoImluc2VydCIsIGFyZ3MpCiAgICAgICAgIG9yaWdpbmFsX2luc2VydCgqYXJncykKICAgICBvcmlnaW5hbF9pbnNlcnQgPSByZWRpci5yZWdpc3RlcigiaW5zZXJ0IiwgbXlfaW5zZXJ0KQotICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3Rfd2lkZ2V0cmVkaXInLAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfcmVkaXJlY3RvcicsCiAgICAgICAgICAgICAgICAgICB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfd2lkZ2V0X3JlZGlyZWN0b3IpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9SZXBsYWNlRGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvcmVwbGFjZS5weQpzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9SZXBsYWNlRGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9yZXBsYWNlLnB5CmluZGV4IGYyZWEyMmUuLmFiZDllNTkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvcmVwbGFjZS5weQpAQCAtMywxOCArMywxOCBAQAogRGVmaW5lcyB2YXJpb3VzIHJlcGxhY2UgcmVsYXRlZCBmdW5jdGlvbnMgbGlrZSByZXBsYWNlLCByZXBsYWNlIGFsbCwKIHJlcGxhY2UrZmluZC4KICIiIgotZnJvbSB0a2ludGVyIGltcG9ydCAqCi0KLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lCi1mcm9tIGlkbGVsaWIuU2VhcmNoRGlhbG9nQmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQogaW1wb3J0IHJlCiAKK2Zyb20gdGtpbnRlciBpbXBvcnQgU3RyaW5nVmFyLCBUY2xFcnJvcgorCitmcm9tIGlkbGVsaWIuc2VhcmNoYmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hlbmdpbmUKIAogZGVmIHJlcGxhY2UodGV4dCk6CiAgICAgIiIiUmV0dXJucyBhIHNpbmdsZXRvbiBSZXBsYWNlRGlhbG9nIGluc3RhbmNlLlRoZSBzaW5nbGUgZGlhbG9nCiAgICAgIHNhdmVzIHVzZXIgZW50cmllcyBhbmQgcHJlZmVyZW5jZXMgYWNyb3NzIGluc3RhbmNlcy4iIiIKICAgICByb290ID0gdGV4dC5fcm9vdCgpCi0gICAgZW5naW5lID0gU2VhcmNoRW5naW5lLmdldChyb290KQorICAgIGVuZ2luZSA9IHNlYXJjaGVuZ2luZS5nZXQocm9vdCkKICAgICBpZiBub3QgaGFzYXR0cihlbmdpbmUsICJfcmVwbGFjZWRpYWxvZyIpOgogICAgICAgICBlbmdpbmUuX3JlcGxhY2VkaWFsb2cgPSBSZXBsYWNlRGlhbG9nKHJvb3QsIGVuZ2luZSkKICAgICBkaWFsb2cgPSBlbmdpbmUuX3JlcGxhY2VkaWFsb2cKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgdGV4dCA9IHNlbGYudGV4dAogICAgICAgICByZXMgPSBzZWxmLmVuZ2luZS5zZWFyY2hfdGV4dCh0ZXh0LCBwcm9nKQogICAgICAgICBpZiBub3QgcmVzOgotICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgIHNlbGYuYmVsbCgpCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgdGV4dC50YWdfcmVtb3ZlKCJzZWwiLCAiMS4wIiwgImVuZCIpCiAgICAgICAgIHRleHQudGFnX3JlbW92ZSgiaGl0IiwgIjEuMCIsICJlbmQiKQpAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKICAgICAgICAgcmVzID0gc2VsZi5lbmdpbmUuc2VhcmNoX3RleHQodGV4dCwgTm9uZSwgb2spCiAgICAgICAgIGlmIG5vdCByZXM6Ci0gICAgICAgICAgICB0ZXh0LmJlbGwoKQorICAgICAgICAgICAgc2VsZi5iZWxsKCkKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBsaW5lLCBtID0gcmVzCiAgICAgICAgIGksIGogPSBtLnNwYW4oKQpAQCAtMTY0LDcgKzE2NCw3IEBACiAgICAgICAgICAgICBwb3MgPSBOb25lCiAgICAgICAgIGlmIG5vdCBwb3M6CiAgICAgICAgICAgICBmaXJzdCA9IGxhc3QgPSBwb3MgPSB0ZXh0LmluZGV4KCJpbnNlcnQiKQotICAgICAgICBsaW5lLCBjb2wgPSBTZWFyY2hFbmdpbmUuZ2V0X2xpbmVfY29sKHBvcykKKyAgICAgICAgbGluZSwgY29sID0gc2VhcmNoZW5naW5lLmdldF9saW5lX2NvbChwb3MpCiAgICAgICAgIGNoYXJzID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZSwgIiVkLjAiICUgKGxpbmUrMSkpCiAgICAgICAgIG0gPSBwcm9nLm1hdGNoKGNoYXJzLCBjb2wpCiAgICAgICAgIGlmIG5vdCBwcm9nOgpAQCAtMjA0LDExICsyMDQsMTMgQEAKIAogCiBkZWYgX3JlcGxhY2VfZGlhbG9nKHBhcmVudCk6ICAjIGh0ZXN0ICMKLSAgICAiIiJodGVzdCB3cmFwcGVyIGZ1bmN0aW9uIiIiCisgICAgZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCwgVGV4dCwgRU5ELCBTRUwKKyAgICBmcm9tIHRraW50ZXIudHRrIGltcG9ydCBCdXR0b24KKwogICAgIGJveCA9IFRvcGxldmVsKHBhcmVudCkKICAgICBib3gudGl0bGUoIlRlc3QgUmVwbGFjZURpYWxvZyIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIGJveC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIGJveC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKIAogICAgICMgbW9jayB1bmRvIGRlbGVnYXRvciBtZXRob2RzCiAgICAgZGVmIHVuZG9fYmxvY2tfc3RhcnQoKToKQEAgLTIzNCw3ICsyMzYsNyBAQAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfcmVwbGFjZWRpYWxvZycsCisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9yZXBsYWNlJywKICAgICAgICAgICAgICAgICB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKIAogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvcnBjLnB5IGIvTGliL2lkbGVsaWIvcnBjLnB5CmluZGV4IDQ4MTA1ZjIuLjhmNTdlZGI4IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ycGMucHkKKysrIGIvTGliL2lkbGVsaWIvcnBjLnB5CkBAIC0yNiwyMyArMjYsMjEgQEAKIGFjY29tcGxpc2hlZCBpbiBJZGxlLgogCiAiIiIKLQotaW1wb3J0IHN5cwotaW1wb3J0IG9zCitpbXBvcnQgYnVpbHRpbnMKK2ltcG9ydCBjb3B5cmVnCiBpbXBvcnQgaW8KLWltcG9ydCBzb2NrZXQKK2ltcG9ydCBtYXJzaGFsCitpbXBvcnQgb3MKK2ltcG9ydCBwaWNrbGUKK2ltcG9ydCBxdWV1ZQogaW1wb3J0IHNlbGVjdAoraW1wb3J0IHNvY2tldAogaW1wb3J0IHNvY2tldHNlcnZlcgogaW1wb3J0IHN0cnVjdAotaW1wb3J0IHBpY2tsZQoraW1wb3J0IHN5cwogaW1wb3J0IHRocmVhZGluZwotaW1wb3J0IHF1ZXVlCiBpbXBvcnQgdHJhY2ViYWNrCi1pbXBvcnQgY29weXJlZwogaW1wb3J0IHR5cGVzCi1pbXBvcnQgbWFyc2hhbAotaW1wb3J0IGJ1aWx0aW5zCi0KIAogZGVmIHVucGlja2xlX2NvZGUobXMpOgogICAgIGNvID0gbWFyc2hhbC5sb2FkcyhtcykKQEAgLTYwLDEwICs1OCwxMiBAQAogICAgIHAuZHVtcChvYmopCiAgICAgcmV0dXJuIGYuZ2V0dmFsdWUoKQogCisKIGNsYXNzIENvZGVQaWNrbGVyKHBpY2tsZS5QaWNrbGVyKToKICAgICBkaXNwYXRjaF90YWJsZSA9IHt0eXBlcy5Db2RlVHlwZTogcGlja2xlX2NvZGV9CiAgICAgZGlzcGF0Y2hfdGFibGUudXBkYXRlKGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUpCiAKKwogQlVGU0laRSA9IDgqMTAyNAogTE9DQUxIT1NUID0gJzEyNy4wLjAuMScKIApAQCAtNDg3LDE2ICs0ODcsMTkgQEAKICAgICAjIFRva2VuIG1peC1pbiBjbGFzcwogICAgIHBhc3MKIAorCiBkZWYgcmVtb3RlcmVmKG9iaik6CiAgICAgb2lkID0gaWQob2JqKQogICAgIG9iamVjdHRhYmxlW29pZF0gPSBvYmoKICAgICByZXR1cm4gUmVtb3RlUHJveHkob2lkKQogCisKIGNsYXNzIFJlbW90ZVByb3h5KG9iamVjdCk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgb2lkKToKICAgICAgICAgc2VsZi5vaWQgPSBvaWQKIAorCiBjbGFzcyBSUENIYW5kbGVyKHNvY2tldHNlcnZlci5CYXNlUmVxdWVzdEhhbmRsZXIsIFNvY2tldElPKToKIAogICAgIGRlYnVnZ2luZyA9IEZhbHNlCkBAIC01MTQsNiArNTE3LDcgQEAKICAgICBkZWYgZ2V0X3JlbW90ZV9wcm94eShzZWxmLCBvaWQpOgogICAgICAgICByZXR1cm4gUlBDUHJveHkoc2VsZiwgb2lkKQogCisKIGNsYXNzIFJQQ0NsaWVudChTb2NrZXRJTyk6CiAKICAgICBkZWJ1Z2dpbmcgPSBGYWxzZQpAQCAtNTM5LDYgKzU0Myw3IEBACiAgICAgZGVmIGdldF9yZW1vdGVfcHJveHkoc2VsZiwgb2lkKToKICAgICAgICAgcmV0dXJuIFJQQ1Byb3h5KHNlbGYsIG9pZCkKIAorCiBjbGFzcyBSUENQcm94eShvYmplY3QpOgogCiAgICAgX19tZXRob2RzID0gTm9uZQpAQCAtNTg3LDYgKzU5Miw3IEBACiAgICAgICAgIGlmIG5vdCBjYWxsYWJsZShhdHRyKToKICAgICAgICAgICAgIGF0dHJpYnV0ZXNbbmFtZV0gPSAxCiAKKwogY2xhc3MgTWV0aG9kUHJveHkob2JqZWN0KToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NraW8sIG9pZCwgbmFtZSk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9Sc3RyaXBFeHRlbnNpb24ucHkgYi9MaWIvaWRsZWxpYi9yc3RyaXAucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcnN0cmlwLnB5CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9ydW4ucHkgYi9MaWIvaWRsZWxpYi9ydW4ucHkKaW5kZXggMjhjZTQyMC4uYWZhOTc0NCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvcnVuLnB5CisrKyBiL0xpYi9pZGxlbGliL3J1bi5weQpAQCAtMSwzMyArMSw0NSBAQAotaW1wb3J0IHN5cworaW1wb3J0IGlvCiBpbXBvcnQgbGluZWNhY2hlCitpbXBvcnQgcXVldWUKK2ltcG9ydCBzeXMKIGltcG9ydCB0aW1lCiBpbXBvcnQgdHJhY2ViYWNrCiBpbXBvcnQgX3RocmVhZCBhcyB0aHJlYWQKIGltcG9ydCB0aHJlYWRpbmcKLWltcG9ydCBxdWV1ZQotaW1wb3J0IHRraW50ZXIKK2ltcG9ydCB3YXJuaW5ncwogCi1mcm9tIGlkbGVsaWIgaW1wb3J0IENhbGxUaXBzCi1mcm9tIGlkbGVsaWIgaW1wb3J0IEF1dG9Db21wbGV0ZQoraW1wb3J0IHRraW50ZXIgICMgVGNsLCBkZWxldGlvbnMsIG1lc3NhZ2Vib3ggaWYgc3RhcnR1cCBmYWlscwogCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFJlbW90ZURlYnVnZ2VyCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFJlbW90ZU9iamVjdEJyb3dzZXIKLWZyb20gaWRsZWxpYiBpbXBvcnQgU3RhY2tWaWV3ZXIKLWZyb20gaWRsZWxpYiBpbXBvcnQgcnBjCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFB5U2hlbGwKLWZyb20gaWRsZWxpYiBpbXBvcnQgSU9CaW5kaW5nCi0KK2Zyb20gaWRsZWxpYiBpbXBvcnQgYXV0b2NvbXBsZXRlICAjIEF1dG9Db21wbGV0ZSwgZmV0Y2hfZW5jb2RpbmdzCitmcm9tIGlkbGVsaWIgaW1wb3J0IGNhbGx0aXBzICAjIENhbGxUaXBzCitmcm9tIGlkbGVsaWIgaW1wb3J0IGRlYnVnZ2VyX3IgICMgc3RhcnRfZGVidWdnZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZGVidWdvYmpfciAgIyByZW1vdGVfb2JqZWN0X3RyZWVfaXRlbQorZnJvbSBpZGxlbGliIGltcG9ydCBpb21lbnUgICMgZW5jb2RpbmcKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcnBjICAjIG11bHRpcGxlIG9iamVjdHMKK2Zyb20gaWRsZWxpYiBpbXBvcnQgc3RhY2t2aWV3ZXIgICMgU3RhY2tUcmVlSXRlbQogaW1wb3J0IF9fbWFpbl9fCiAKIGZvciBtb2QgaW4gKCdzaW1wbGVkaWFsb2cnLCAnbWVzc2FnZWJveCcsICdmb250JywKICAgICAgICAgICAgICdkaWFsb2cnLCAnZmlsZWRpYWxvZycsICdjb21tb25kaWFsb2cnLAotICAgICAgICAgICAgJ2NvbG9yY2hvb3NlcicpOgorICAgICAgICAgICAgJ3R0aycpOgogICAgIGRlbGF0dHIodGtpbnRlciwgbW9kKQogICAgIGRlbCBzeXMubW9kdWxlc1sndGtpbnRlci4nICsgbW9kXQogCiBMT0NBTEhPU1QgPSAnMTI3LjAuMC4xJwogCi1pbXBvcnQgd2FybmluZ3MKKworZGVmIGlkbGVfZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZT1Ob25lKToKKyAgICAiIiJGb3JtYXQgd2FybmluZ3MgdGhlIElETEUgd2F5LiIiIgorCisgICAgcyA9ICJcbldhcm5pbmcgKGZyb20gd2FybmluZ3MgbW9kdWxlKTpcbiIKKyAgICBzICs9ICcgIEZpbGUgXCIlc1wiLCBsaW5lICVzXG4nICUgKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgaWYgbGluZSBpcyBOb25lOgorICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKKyAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgaWYgbGluZToKKyAgICAgICAgcyArPSAiICAgICVzXG4iICUgbGluZQorICAgIHMgKz0gIiVzOiAlc1xuIiAlIChjYXRlZ29yeS5fX25hbWVfXywgbWVzc2FnZSkKKyAgICByZXR1cm4gcwogCiBkZWYgaWRsZV9zaG93d2FybmluZ19zdWJwcm9jKAogICAgICAgICBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgpAQCAtMzgsNyArNTAsNyBAQAogICAgIGlmIGZpbGUgaXMgTm9uZToKICAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKICAgICB0cnk6Ci0gICAgICAgIGZpbGUud3JpdGUoUHlTaGVsbC5pZGxlX2Zvcm1hdHdhcm5pbmcoCisgICAgICAgIGZpbGUud3JpdGUoaWRsZV9mb3JtYXR3YXJuaW5nKAogICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lKSkKICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgcGFzcyAjIHRoZSBmaWxlIChwcm9iYWJseSBzdGRlcnIpIGlzIGludmFsaWQgLSB0aGlzIHdhcm5pbmcgZ2V0cyBsb3N0LgpAQCAtODgsNyArMTAwLDcgQEAKICAgICBNeUhhbmRsZXIgb2JqZWN0LiAgVGhhdCByZWZlcmVuY2UgaXMgc2F2ZWQgYXMgYXR0cmlidXRlIHJwY2hhbmRsZXIgb2YgdGhlCiAgICAgRXhlY3V0aXZlIGluc3RhbmNlLiAgVGhlIEV4ZWN1dGl2ZSBtZXRob2RzIGhhdmUgYWNjZXNzIHRvIHRoZSByZWZlcmVuY2UgYW5kCiAgICAgY2FuIHBhc3MgaXQgb24gdG8gZW50aXRpZXMgdGhhdCB0aGV5IGNvbW1hbmQKLSAgICAoZS5nLiBSZW1vdGVEZWJ1Z2dlci5EZWJ1Z2dlci5zdGFydF9kZWJ1Z2dlcigpKS4gIFRoZSBsYXR0ZXIsIGluIHR1cm4sIGNhbgorICAgIChlLmcuIGRlYnVnZ2VyX3IuRGVidWdnZXIuc3RhcnRfZGVidWdnZXIoKSkuICBUaGUgbGF0dGVyLCBpbiB0dXJuLCBjYW4KICAgICBjYWxsIE15SGFuZGxlcihTb2NrZXRJTykgcmVnaXN0ZXIvdW5yZWdpc3RlciBtZXRob2RzIHZpYSB0aGUgcmVmZXJlbmNlIHRvCiAgICAgcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgdGhlbXNlbHZlcy4KIApAQCAtMjEwLDcgKzIyMiw3IEBACiAgICAgICAgICAgICB0YmUgPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YikKICAgICAgICAgICAgIHByaW50KCdUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6JywgZmlsZT1lZmlsZSkKICAgICAgICAgICAgIGV4Y2x1ZGUgPSAoInJ1bi5weSIsICJycGMucHkiLCAidGhyZWFkaW5nLnB5IiwgInF1ZXVlLnB5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIlJlbW90ZURlYnVnZ2VyLnB5IiwgImJkYi5weSIpCisgICAgICAgICAgICAgICAgICAgICAgICJkZWJ1Z2dlcl9yLnB5IiwgImJkYi5weSIpCiAgICAgICAgICAgICBjbGVhbnVwX3RyYWNlYmFjayh0YmUsIGV4Y2x1ZGUpCiAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfbGlzdCh0YmUsIGZpbGU9ZWZpbGUpCiAgICAgICAgIGxpbmVzID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seSh0eXAsIGV4YykKQEAgLTI2Nyw2ICsyNzksNyBAQAogICAgIGNhcHR1cmVfd2FybmluZ3MoRmFsc2UpCiAgICAgc3lzLmV4aXQoMCkKIAorCiBjbGFzcyBNeVJQQ1NlcnZlcihycGMuUlBDU2VydmVyKToKIAogICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgpAQCAtMjk3LDYgKzMxMCw5NiBAQAogICAgICAgICAgICAgcXVpdHRpbmcgPSBUcnVlCiAgICAgICAgICAgICB0aHJlYWQuaW50ZXJydXB0X21haW4oKQogCisKKyMgUHNldWRvZmlsZXMgZm9yIHNoZWxsLXJlbW90ZSBjb21tdW5pY2F0aW9uIChhbHNvIHVzZWQgaW4gcHlzaGVsbCkKKworY2xhc3MgUHNldWRvRmlsZShpby5UZXh0SU9CYXNlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaGVsbCwgdGFncywgZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgIHNlbGYuc2hlbGwgPSBzaGVsbAorICAgICAgICBzZWxmLnRhZ3MgPSB0YWdzCisgICAgICAgIHNlbGYuX2VuY29kaW5nID0gZW5jb2RpbmcKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBlbmNvZGluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VuY29kaW5nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICc8JXM+JyAlIHNlbGYudGFncworCisgICAgZGVmIGlzYXR0eShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitjbGFzcyBQc2V1ZG9PdXRwdXRGaWxlKFBzZXVkb0ZpbGUpOgorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIndyaXRlIHRvIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgdHlwZShzKSBpcyBub3Qgc3RyOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uocywgc3RyKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ211c3QgYmUgc3RyLCBub3QgJyArIHR5cGUocykuX19uYW1lX18pCisgICAgICAgICAgICAjIFNlZSBpc3N1ZSAjMTk0ODEKKyAgICAgICAgICAgIHMgPSBzdHIuX19zdHJfXyhzKQorICAgICAgICByZXR1cm4gc2VsZi5zaGVsbC53cml0ZShzLCBzZWxmLnRhZ3MpCisKKworY2xhc3MgUHNldWRvSW5wdXRGaWxlKFBzZXVkb0ZpbGUpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNoZWxsLCB0YWdzLCBlbmNvZGluZz1Ob25lKToKKyAgICAgICAgUHNldWRvRmlsZS5fX2luaXRfXyhzZWxmLCBzaGVsbCwgdGFncywgZW5jb2RpbmcpCisgICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyID0gJycKKworICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemU9LTEpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJlYWQgZnJvbSBjbG9zZWQgZmlsZSIpCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHNpemUgPSAtMQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNpemUsIGludCk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ211c3QgYmUgaW50LCBub3QgJyArIHR5cGUoc2l6ZSkuX19uYW1lX18pCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX2xpbmVfYnVmZmVyCisgICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyID0gJycKKyAgICAgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLnNoZWxsLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2hpbGUgbGVuKHJlc3VsdCkgPCBzaXplOgorICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLnNoZWxsLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZQorICAgICAgICAgICAgc2VsZi5fbGluZV9idWZmZXIgPSByZXN1bHRbc2l6ZTpdCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHRbOnNpemVdCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPS0xKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWFkIGZyb20gY2xvc2VkIGZpbGUiKQorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBzaXplID0gLTEKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzaXplLCBpbnQpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIGludCwgbm90ICcgKyB0eXBlKHNpemUpLl9fbmFtZV9fKQorICAgICAgICBsaW5lID0gc2VsZi5fbGluZV9idWZmZXIgb3Igc2VsZi5zaGVsbC5yZWFkbGluZSgpCisgICAgICAgIGlmIHNpemUgPCAwOgorICAgICAgICAgICAgc2l6ZSA9IGxlbihsaW5lKQorICAgICAgICBlb2wgPSBsaW5lLmZpbmQoJ1xuJywgMCwgc2l6ZSkKKyAgICAgICAgaWYgZW9sID49IDA6CisgICAgICAgICAgICBzaXplID0gZW9sICsgMQorICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9IGxpbmVbc2l6ZTpdCisgICAgICAgIHJldHVybiBsaW5lWzpzaXplXQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnNoZWxsLmNsb3NlKCkKKworCiBjbGFzcyBNeUhhbmRsZXIocnBjLlJQQ0hhbmRsZXIpOgogCiAgICAgZGVmIGhhbmRsZShzZWxmKToKQEAgLTMwNCwxMiArNDA3LDEyIEBACiAgICAgICAgIGV4ZWN1dGl2ZSA9IEV4ZWN1dGl2ZShzZWxmKQogICAgICAgICBzZWxmLnJlZ2lzdGVyKCJleGVjIiwgZXhlY3V0aXZlKQogICAgICAgICBzZWxmLmNvbnNvbGUgPSBzZWxmLmdldF9yZW1vdGVfcHJveHkoImNvbnNvbGUiKQotICAgICAgICBzeXMuc3RkaW4gPSBQeVNoZWxsLlBzZXVkb0lucHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRpbiIsCi0gICAgICAgICAgICAgICAgSU9CaW5kaW5nLmVuY29kaW5nKQotICAgICAgICBzeXMuc3Rkb3V0ID0gUHlTaGVsbC5Qc2V1ZG9PdXRwdXRGaWxlKHNlbGYuY29uc29sZSwgInN0ZG91dCIsCi0gICAgICAgICAgICAgICAgSU9CaW5kaW5nLmVuY29kaW5nKQotICAgICAgICBzeXMuc3RkZXJyID0gUHlTaGVsbC5Qc2V1ZG9PdXRwdXRGaWxlKHNlbGYuY29uc29sZSwgInN0ZGVyciIsCi0gICAgICAgICAgICAgICAgSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICBzeXMuc3RkaW4gPSBQc2V1ZG9JbnB1dEZpbGUoc2VsZi5jb25zb2xlLCAic3RkaW4iLAorICAgICAgICAgICAgICAgIGlvbWVudS5lbmNvZGluZykKKyAgICAgICAgc3lzLnN0ZG91dCA9IFBzZXVkb091dHB1dEZpbGUoc2VsZi5jb25zb2xlLCAic3Rkb3V0IiwKKyAgICAgICAgICAgICAgICBpb21lbnUuZW5jb2RpbmcpCisgICAgICAgIHN5cy5zdGRlcnIgPSBQc2V1ZG9PdXRwdXRGaWxlKHNlbGYuY29uc29sZSwgInN0ZGVyciIsCisgICAgICAgICAgICAgICAgaW9tZW51LmVuY29kaW5nKQogCiAgICAgICAgIHN5cy5kaXNwbGF5aG9vayA9IHJwYy5kaXNwbGF5aG9vawogICAgICAgICAjIHBhZ2UgaGVscCgpIHRleHQgdG8gc2hlbGwuCkBAIC0zNDUsOCArNDQ4LDggQEAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcnBjaGFuZGxlcik6CiAgICAgICAgIHNlbGYucnBjaGFuZGxlciA9IHJwY2hhbmRsZXIKICAgICAgICAgc2VsZi5sb2NhbHMgPSBfX21haW5fXy5fX2RpY3RfXwotICAgICAgICBzZWxmLmNhbGx0aXAgPSBDYWxsVGlwcy5DYWxsVGlwcygpCi0gICAgICAgIHNlbGYuYXV0b2NvbXBsZXRlID0gQXV0b0NvbXBsZXRlLkF1dG9Db21wbGV0ZSgpCisgICAgICAgIHNlbGYuY2FsbHRpcCA9IGNhbGx0aXBzLkNhbGxUaXBzKCkKKyAgICAgICAgc2VsZi5hdXRvY29tcGxldGUgPSBhdXRvY29tcGxldGUuQXV0b0NvbXBsZXRlKCkKIAogICAgIGRlZiBydW5jb2RlKHNlbGYsIGNvZGUpOgogICAgICAgICBnbG9iYWwgaW50ZXJydXB0YWJsZQpAQCAtMzc4LDcgKzQ4MSw3IEBACiAgICAgICAgICAgICB0aHJlYWQuaW50ZXJydXB0X21haW4oKQogCiAgICAgZGVmIHN0YXJ0X3RoZV9kZWJ1Z2dlcihzZWxmLCBndWlfYWRhcF9vaWQpOgotICAgICAgICByZXR1cm4gUmVtb3RlRGVidWdnZXIuc3RhcnRfZGVidWdnZXIoc2VsZi5ycGNoYW5kbGVyLCBndWlfYWRhcF9vaWQpCisgICAgICAgIHJldHVybiBkZWJ1Z2dlcl9yLnN0YXJ0X2RlYnVnZ2VyKHNlbGYucnBjaGFuZGxlciwgZ3VpX2FkYXBfb2lkKQogCiAgICAgZGVmIHN0b3BfdGhlX2RlYnVnZ2VyKHNlbGYsIGlkYl9hZGFwX29pZCk6CiAgICAgICAgICJVbnJlZ2lzdGVyIHRoZSBJZGIgQWRhcHRlci4gIExpbmsgb2JqZWN0cyBhbmQgSWRiIHRoZW4gc3ViamVjdCB0byBHQyIKQEAgLTQwMiw3ICs1MDUsNyBAQAogICAgICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CiAgICAgICAgIHN5cy5sYXN0X3R5cGUgPSB0eXAKICAgICAgICAgc3lzLmxhc3RfdmFsdWUgPSB2YWwKLSAgICAgICAgaXRlbSA9IFN0YWNrVmlld2VyLlN0YWNrVHJlZUl0ZW0oZmxpc3QsIHRiKQotICAgICAgICByZXR1cm4gUmVtb3RlT2JqZWN0QnJvd3Nlci5yZW1vdGVfb2JqZWN0X3RyZWVfaXRlbShpdGVtKQorICAgICAgICBpdGVtID0gc3RhY2t2aWV3ZXIuU3RhY2tUcmVlSXRlbShmbGlzdCwgdGIpCisgICAgICAgIHJldHVybiBkZWJ1Z29ial9yLnJlbW90ZV9vYmplY3RfdHJlZV9pdGVtKGl0ZW0pCiAKIGNhcHR1cmVfd2FybmluZ3MoRmFsc2UpICAjIE1ha2Ugc3VyZSB0dXJuZWQgb2ZmOyBzZWUgaXNzdWUgMTgwODEKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkgYi9MaWIvaWRsZWxpYi9ydW5zY3JpcHQucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvU2NyaXB0QmluZGluZy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcnVuc2NyaXB0LnB5CmluZGV4IDVjYjgxOGQuLjc5ZDg2YWQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkKKysrIGIvTGliL2lkbGVsaWIvcnVuc2NyaXB0LnB5CkBAIC0yMCwxMSArMjAsMTIgQEAKIGltcG9ydCBvcwogaW1wb3J0IHRhYm5hbm55CiBpbXBvcnQgdG9rZW5pemUKLWltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IFB5U2hlbGwKIAotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCi1mcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKK2ltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CisKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeAorZnJvbSBpZGxlbGliIGltcG9ydCBweXNoZWxsCiAKIGluZGVudF9tZXNzYWdlID0gIiIiRXJyb3I6IEluY29uc2lzdGVudCBpbmRlbnRhdGlvbiBkZXRlY3RlZCEKIApAQCAtNDYsMTIgKzQ3LDEyIEBACiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbik6CiAgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KLSAgICAgICAgIyBQcm92aWRlIGluc3RhbmNlIHZhcmlhYmxlcyByZWZlcmVuY2VkIGJ5IERlYnVnZ2VyCisgICAgICAgICMgUHJvdmlkZSBpbnN0YW5jZSB2YXJpYWJsZXMgcmVmZXJlbmNlZCBieSBkZWJ1Z2dlcgogICAgICAgICAjIFhYWCBUaGlzIHNob3VsZCBiZSBkb25lIGRpZmZlcmVudGx5CiAgICAgICAgIHNlbGYuZmxpc3QgPSBzZWxmLmVkaXR3aW4uZmxpc3QKICAgICAgICAgc2VsZi5yb290ID0gc2VsZi5lZGl0d2luLnJvb3QKIAotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQ29jb2FUaygpOgorICAgICAgICBpZiBtYWNvc3guaXNDb2NvYVRrKCk6CiAgICAgICAgICAgICBzZWxmLmVkaXR3aW4udGV4dF9mcmFtZS5iaW5kKCc8PHJ1bi1tb2R1bGUtZXZlbnQtMj4+Jywgc2VsZi5fcnVuX21vZHVsZV9ldmVudCkKIAogICAgIGRlZiBjaGVja19tb2R1bGVfZXZlbnQoc2VsZiwgZXZlbnQpOgpAQCAtMTEyLDcgKzExMyw3IEBACiAgICAgICAgICAgICBzaGVsbC5zZXRfd2FybmluZ19zdHJlYW0oc2F2ZWRfc3RyZWFtKQogCiAgICAgZGVmIHJ1bl9tb2R1bGVfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQ29jb2FUaygpOgorICAgICAgICBpZiBtYWNvc3guaXNDb2NvYVRrKCk6CiAgICAgICAgICAgICAjIFRrLUNvY29hIGluIE1hY09TWCBpcyBicm9rZW4gdW50aWwgYXQgbGVhc3QKICAgICAgICAgICAgICMgVGsgOC41LjksIGFuZCB3aXRob3V0IHRoaXMgcmF0aGVyCiAgICAgICAgICAgICAjIGNydWRlIHdvcmthcm91bmQgSURMRSB3b3VsZCBoYW5nIHdoZW4gYSB1c2VyCkBAIC0xNDIsNyArMTQzLDcgQEAKICAgICAgICAgaWYgbm90IHNlbGYudGFibmFubnkoZmlsZW5hbWUpOgogICAgICAgICAgICAgcmV0dXJuICdicmVhaycKICAgICAgICAgaW50ZXJwID0gc2VsZi5zaGVsbC5pbnRlcnAKLSAgICAgICAgaWYgUHlTaGVsbC51c2Vfc3VicHJvY2VzczoKKyAgICAgICAgaWYgcHlzaGVsbC51c2Vfc3VicHJvY2VzczoKICAgICAgICAgICAgIGludGVycC5yZXN0YXJ0X3N1YnByb2Nlc3Mod2l0aF9jd2Q9RmFsc2UsIGZpbGVuYW1lPQogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0d2luLl9maWxlbmFtZV90b191bmljb2RlKGZpbGVuYW1lKSkKICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSkKQEAgLTE2MSw3ICsxNjIsNyBAQAogICAgICAgICBpbnRlcnAucHJlcGVuZF9zeXNwYXRoKGZpbGVuYW1lKQogICAgICAgICAjIFhYWCBLQksgMDNKdWwwNCBXaGVuIHJ1biB3L28gc3VicHJvY2VzcywgcnVudGltZSB3YXJuaW5ncyBzdGlsbAogICAgICAgICAjICAgICAgICAgZ28gdG8gX19zdGRlcnJfXy4gIFdpdGggc3VicHJvY2VzcywgdGhleSBnbyB0byB0aGUgc2hlbGwuCi0gICAgICAgICMgICAgICAgICBOZWVkIHRvIGNoYW5nZSBzdHJlYW1zIGluIFB5U2hlbGwuTW9kaWZpZWRJbnRlcnByZXRlci4KKyAgICAgICAgIyAgICAgICAgIE5lZWQgdG8gY2hhbmdlIHN0cmVhbXMgaW4gcHlzaGVsbC5Nb2RpZmllZEludGVycHJldGVyLgogICAgICAgICBpbnRlcnAucnVuY29kZShjb2RlKQogICAgICAgICByZXR1cm4gJ2JyZWFrJwogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TY3JvbGxlZExpc3QucHkgYi9MaWIvaWRsZWxpYi9zY3JvbGxlZGxpc3QucHkKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9zY3JvbGxlZGxpc3QucHkKaW5kZXggNTM1NzZiNS4uY2MwOGMyNiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5CisrKyBiL0xpYi9pZGxlbGliL3Njcm9sbGVkbGlzdC5weQpAQCAtMSw1ICsxLDggQEAKIGZyb20gdGtpbnRlciBpbXBvcnQgKgotZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0Citmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKKworZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKKwogCiBjbGFzcyBTY3JvbGxlZExpc3Q6CiAKQEAgLTIzLDcgKzI2LDcgQEAKICAgICAgICAgIyBCaW5kIGV2ZW50cyB0byB0aGUgbGlzdCBib3gKICAgICAgICAgbGlzdGJveC5iaW5kKCI8QnV0dG9uUmVsZWFzZS0xPiIsIHNlbGYuY2xpY2tfZXZlbnQpCiAgICAgICAgIGxpc3Rib3guYmluZCgiPERvdWJsZS1CdXR0b25SZWxlYXNlLTE+Iiwgc2VsZi5kb3VibGVfY2xpY2tfZXZlbnQpCi0gICAgICAgIGlmIG1hY29zeFN1cHBvcnQuaXNBcXVhVGsoKToKKyAgICAgICAgaWYgbWFjb3N4LmlzQXF1YVRrKCk6CiAgICAgICAgICAgICBsaXN0Ym94LmJpbmQoIjxCdXR0b25QcmVzcy0yPiIsIHNlbGYucG9wdXBfZXZlbnQpCiAgICAgICAgICAgICBsaXN0Ym94LmJpbmQoIjxDb250cm9sLUJ1dHRvbi0xPiIsIHNlbGYucG9wdXBfZXZlbnQpCiAgICAgICAgIGVsc2U6CkBAIC0xMjQsMjIgKzEyNywyMCBAQAogICAgICAgICBwYXNzCiAKIAotZGVmIF9zY3JvbGxlZF9saXN0KHBhcmVudCk6Ci0gICAgcm9vdCA9IFRrKCkKLSAgICByb290LnRpdGxlKCJUZXN0IFNjcm9sbGVkTGlzdCIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorZGVmIF9zY3JvbGxlZF9saXN0KHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4KzIwMCwgeSArIDE3NSkpCiAgICAgY2xhc3MgTXlTY3JvbGxlZExpc3QoU2Nyb2xsZWRMaXN0KToKICAgICAgICAgZGVmIGZpbGxfbWVudShzZWxmKTogc2VsZi5tZW51LmFkZF9jb21tYW5kKGxhYmVsPSJyaWdodCBjbGljayIpCiAgICAgICAgIGRlZiBvbl9zZWxlY3Qoc2VsZiwgaW5kZXgpOiBwcmludCgic2VsZWN0Iiwgc2VsZi5nZXQoaW5kZXgpKQogICAgICAgICBkZWYgb25fZG91YmxlKHNlbGYsIGluZGV4KTogcHJpbnQoImRvdWJsZSIsIHNlbGYuZ2V0KGluZGV4KSkKIAotICAgIHNjcm9sbGVkX2xpc3QgPSBNeVNjcm9sbGVkTGlzdChyb290KQorICAgIHNjcm9sbGVkX2xpc3QgPSBNeVNjcm9sbGVkTGlzdCh0b3ApCiAgICAgZm9yIGkgaW4gcmFuZ2UoMzApOgogICAgICAgICBzY3JvbGxlZF9saXN0LmFwcGVuZCgiSXRlbSAlMDJkIiAlIGkpCiAKLSAgICByb290Lm1haW5sb29wKCkKLQogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAjIEF0IHRoZSBtb21lbnQsIHRlc3Rfc2Nyb2xsZWRsaXN0IG1lcmVseSBjcmVhdGVzIGluc3RhbmNlLCBsaWtlIGh0ZXN0LgogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfc2Nyb2xsZWRfbGlzdCkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1NlYXJjaERpYWxvZy5weSBiL0xpYi9pZGxlbGliL3NlYXJjaC5weQpzaW1pbGFyaXR5IGluZGV4IDgyJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3NlYXJjaC5weQppbmRleCA3NjVkNTNmLi40YjkwNjU5IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvc2VhcmNoLnB5CkBAIC0xLDEyICsxLDEyIEBACi1mcm9tIHRraW50ZXIgaW1wb3J0ICoKK2Zyb20gdGtpbnRlciBpbXBvcnQgVGNsRXJyb3IKIAotZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hFbmdpbmUKLWZyb20gaWRsZWxpYi5TZWFyY2hEaWFsb2dCYXNlIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlCitmcm9tIGlkbGVsaWIgaW1wb3J0IHNlYXJjaGVuZ2luZQorZnJvbSBpZGxlbGliLnNlYXJjaGJhc2UgaW1wb3J0IFNlYXJjaERpYWxvZ0Jhc2UKIAogZGVmIF9zZXR1cCh0ZXh0KToKICAgICAiQ3JlYXRlIG9yIGZpbmQgdGhlIHNpbmdsZXRvbiBTZWFyY2hEaWFsb2cgaW5zdGFuY2UuIgogICAgIHJvb3QgPSB0ZXh0Ll9yb290KCkKLSAgICBlbmdpbmUgPSBTZWFyY2hFbmdpbmUuZ2V0KHJvb3QpCisgICAgZW5naW5lID0gc2VhcmNoZW5naW5lLmdldChyb290KQogICAgIGlmIG5vdCBoYXNhdHRyKGVuZ2luZSwgIl9zZWFyY2hkaWFsb2ciKToKICAgICAgICAgZW5naW5lLl9zZWFyY2hkaWFsb2cgPSBTZWFyY2hEaWFsb2cocm9vdCwgZW5naW5lKQogICAgIHJldHVybiBlbmdpbmUuX3NlYXJjaGRpYWxvZwpAQCAtMjQsNiArMjQsNyBAQAogICAgICJIYW5kbGUgdGhlIGVkaXRvciBlZGl0IG1lbnUgaXRlbSBhbmQgY29ycmVzcG9uZGluZyBldmVudC4iCiAgICAgcmV0dXJuIF9zZXR1cCh0ZXh0KS5maW5kX3NlbGVjdGlvbih0ZXh0KQogCisKIGNsYXNzIFNlYXJjaERpYWxvZyhTZWFyY2hEaWFsb2dCYXNlKToKIAogICAgIGRlZiBjcmVhdGVfd2lkZ2V0cyhzZWxmKToKQEAgLTUxLDcgKzUyLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmaXJzdCA9IHRleHQuaW5kZXgoInNlbC5maXJzdCIpCiAgICAgICAgICAgICAgICAgc2VsbGFzdCA9IHRleHQuaW5kZXgoInNlbC5sYXN0IikKICAgICAgICAgICAgICAgICBpZiBzZWxmaXJzdCA9PSBmaXJzdCBhbmQgc2VsbGFzdCA9PSBsYXN0OgotICAgICAgICAgICAgICAgICAgICB0ZXh0LmJlbGwoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmJlbGwoKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCkBAIC02MSw3ICs2Miw3IEBACiAgICAgICAgICAgICB0ZXh0LnNlZSgiaW5zZXJ0IikKICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0ZXh0LmJlbGwoKQorICAgICAgICAgICAgc2VsZi5iZWxsKCkKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogCiAgICAgZGVmIGZpbmRfc2VsZWN0aW9uKHNlbGYsIHRleHQpOgpAQCAtNzIsMjYgKzczLDMwIEBACiAKIAogZGVmIF9zZWFyY2hfZGlhbG9nKHBhcmVudCk6ICAjIGh0ZXN0ICMKLSAgICAnJydEaXNwbGF5IHNlYXJjaCB0ZXN0IGJveC4nJycKKyAgICAiRGlzcGxheSBzZWFyY2ggdGVzdCBib3guIgorICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwsIFRleHQKKyAgICBmcm9tIHRraW50ZXIudHRrIGltcG9ydCBCdXR0b24KKwogICAgIGJveCA9IFRvcGxldmVsKHBhcmVudCkKICAgICBib3gudGl0bGUoIlRlc3QgU2VhcmNoRGlhbG9nIikKLSAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgYm94Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgYm94Lmdlb21ldHJ5KCIrJWQrJWQiICUgKHgsIHkgKyAxNzUpKQogICAgIHRleHQgPSBUZXh0KGJveCwgaW5hY3RpdmVzZWxlY3RiYWNrZ3JvdW5kPSdncmF5JykKICAgICB0ZXh0LnBhY2soKQogICAgIHRleHQuaW5zZXJ0KCJpbnNlcnQiLCJUaGlzIGlzIGEgc2FtcGxlIHN0cmluZy5cbiIqNSkKIAogICAgIGRlZiBzaG93X2ZpbmQoKToKLSAgICAgICAgdGV4dC50YWdfYWRkKFNFTCwgIjEuMCIsIEVORCkKKyAgICAgICAgdGV4dC50YWdfYWRkKCdzZWwnLCAnMS4wJywgJ2VuZCcpCiAgICAgICAgIF9zZXR1cCh0ZXh0KS5vcGVuKHRleHQpCi0gICAgICAgIHRleHQudGFnX3JlbW92ZShTRUwsICIxLjAiLCBFTkQpCisgICAgICAgIHRleHQudGFnX3JlbW92ZSgnc2VsJywgJzEuMCcsICdlbmQnKQogCiAgICAgYnV0dG9uID0gQnV0dG9uKGJveCwgdGV4dD0iU2VhcmNoIChzZWxlY3Rpb24gaWdub3JlZCkiLCBjb21tYW5kPXNob3dfZmluZCkKICAgICBidXR0b24ucGFjaygpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgaW1wb3J0IHVuaXR0ZXN0Ci0gICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9zZWFyY2hkaWFsb2cnLAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3Rfc2VhcmNoJywKICAgICAgICAgICAgICAgICAgIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorCiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCiAgICAgcnVuKF9zZWFyY2hfZGlhbG9nKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weSBiL0xpYi9pZGxlbGliL3NlYXJjaGJhc2UucHkKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvc2VhcmNoYmFzZS5weQppbmRleCA1ZmE4NGUyLi41ZjgxNzg1IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5CisrKyBiL0xpYi9pZGxlbGliL3NlYXJjaGJhc2UucHkKQEAgLTEsNyArMSw4IEBACiAnJydEZWZpbmUgU2VhcmNoRGlhbG9nQmFzZSB1c2VkIGJ5IFNlYXJjaCwgUmVwbGFjZSwgYW5kIEdyZXAgZGlhbG9ncy4nJycKIAotZnJvbSB0a2ludGVyIGltcG9ydCAoVG9wbGV2ZWwsIEZyYW1lLCBFbnRyeSwgTGFiZWwsIEJ1dHRvbiwKLSAgICAgICAgICAgICAgICAgICAgIENoZWNrYnV0dG9uLCBSYWRpb2J1dHRvbikKK2Zyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwsIEZyYW1lCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBFbnRyeSwgTGFiZWwsIEJ1dHRvbiwgQ2hlY2tidXR0b24sIFJhZGlvYnV0dG9uCisKIAogY2xhc3MgU2VhcmNoRGlhbG9nQmFzZToKICAgICAnJydDcmVhdGUgbW9zdCBvZiBhIDMgb3IgNCByb3csIDMgY29sdW1uIHNlYXJjaCBkaWFsb2cuCkBAIC03OSw2ICs4MCw3IEBACiAgICAgICAgIHRvcC53bV90aXRsZShzZWxmLnRpdGxlKQogICAgICAgICB0b3Aud21faWNvbm5hbWUoc2VsZi5pY29uKQogICAgICAgICBzZWxmLnRvcCA9IHRvcAorICAgICAgICBzZWxmLmJlbGwgPSB0b3AuYmVsbAogCiAgICAgICAgIHNlbGYucm93ID0gMAogICAgICAgICBzZWxmLnRvcC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgwLCBwYWQ9Miwgd2VpZ2h0PTApCkBAIC0xMjUsNyArMTI3LDcgQEAKICAgICBkZWYgY3JlYXRlX29wdGlvbl9idXR0b25zKHNlbGYpOgogICAgICAgICAnJydSZXR1cm4gKGZpbGxlZCBmcmFtZSwgb3B0aW9ucykgZm9yIHRlc3RpbmcuCiAKLSAgICAgICAgT3B0aW9ucyBpcyBhIGxpc3Qgb2YgU2VhcmNoRW5naW5lIGJvb2xlYW52YXIsIGxhYmVsIHBhaXJzLgorICAgICAgICBPcHRpb25zIGlzIGEgbGlzdCBvZiBzZWFyY2hlbmdpbmUgYm9vbGVhbnZhciwgbGFiZWwgcGFpcnMuCiAgICAgICAgIEEgZ3JpZGRlZCBmcmFtZSBmcm9tIG1ha2VfZnJhbWUgaXMgZmlsbGVkIHdpdGggYSBDaGVja2J1dHRvbgogICAgICAgICBmb3IgZWFjaCBwYWlyLCBib3VuZCB0byB0aGUgdmFyLCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGxhYmVsLgogICAgICAgICAnJycKQEAgLTEzNywxMCArMTM5LDggQEAKICAgICAgICAgaWYgc2VsZi5uZWVkd3JhcGJ1dHRvbjoKICAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKChlbmdpbmUud3JhcHZhciwgIldyYXAgYXJvdW5kIikpCiAgICAgICAgIGZvciB2YXIsIGxhYmVsIGluIG9wdGlvbnM6Ci0gICAgICAgICAgICBidG4gPSBDaGVja2J1dHRvbihmcmFtZSwgYW5jaG9yPSJ3IiwgdmFyaWFibGU9dmFyLCB0ZXh0PWxhYmVsKQorICAgICAgICAgICAgYnRuID0gQ2hlY2tidXR0b24oZnJhbWUsIHZhcmlhYmxlPXZhciwgdGV4dD1sYWJlbCkKICAgICAgICAgICAgIGJ0bi5wYWNrKHNpZGU9ImxlZnQiLCBmaWxsPSJib3RoIikKLSAgICAgICAgICAgIGlmIHZhci5nZXQoKToKLSAgICAgICAgICAgICAgICBidG4uc2VsZWN0KCkKICAgICAgICAgcmV0dXJuIGZyYW1lLCBvcHRpb25zCiAKICAgICBkZWYgY3JlYXRlX290aGVyX2J1dHRvbnMoc2VsZik6CkBAIC0xNTMsMTEgKzE1Myw4IEBACiAgICAgICAgIHZhciA9IHNlbGYuZW5naW5lLmJhY2t2YXIKICAgICAgICAgb3RoZXJzID0gWygxLCAnVXAnKSwgKDAsICdEb3duJyldCiAgICAgICAgIGZvciB2YWwsIGxhYmVsIGluIG90aGVyczoKLSAgICAgICAgICAgIGJ0biA9IFJhZGlvYnV0dG9uKGZyYW1lLCBhbmNob3I9InciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU9dmFyLCB2YWx1ZT12YWwsIHRleHQ9bGFiZWwpCisgICAgICAgICAgICBidG4gPSBSYWRpb2J1dHRvbihmcmFtZSwgdmFyaWFibGU9dmFyLCB2YWx1ZT12YWwsIHRleHQ9bGFiZWwpCiAgICAgICAgICAgICBidG4ucGFjayhzaWRlPSJsZWZ0IiwgZmlsbD0iYm90aCIpCi0gICAgICAgICAgICBpZiB2YXIuZ2V0KCkgPT0gdmFsOgotICAgICAgICAgICAgICAgIGJ0bi5zZWxlY3QoKQogICAgICAgICByZXR1cm4gZnJhbWUsIG90aGVycwogCiAgICAgZGVmIG1ha2VfYnV0dG9uKHNlbGYsIGxhYmVsLCBjb21tYW5kLCBpc2RlZj0wKToKQEAgLTE3OCw3ICsxNzUsMjYgQEAKICAgICAgICAgYiA9IHNlbGYubWFrZV9idXR0b24oImNsb3NlIiwgc2VsZi5jbG9zZSkKICAgICAgICAgYi5sb3dlcigpCiAKKworY2xhc3MgX3NlYXJjaGJhc2UoU2VhcmNoRGlhbG9nQmFzZSk6ICAjIGh0ZXN0ICMKKyAgICAiQ3JlYXRlIGF1dG8tb3BlbmluZyBkaWFsb2cgd2l0aCBubyB0ZXh0IGNvbm5lY3Rpb24uIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCk6CisgICAgICAgIGltcG9ydCByZQorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IHNlYXJjaGVuZ2luZQorCisgICAgICAgIHNlbGYucm9vdCA9IHBhcmVudAorICAgICAgICBzZWxmLmVuZ2luZSA9IHNlYXJjaGVuZ2luZS5nZXQocGFyZW50KQorICAgICAgICBzZWxmLmNyZWF0ZV93aWRnZXRzKCkKKyAgICAgICAgcHJpbnQocGFyZW50Lmdlb21ldHJ5KCkpCisgICAgICAgIHdpZHRoLGhlaWdodCwgeCx5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCisgICAgICAgIHNlbGYudG9wLmdlb21ldHJ5KCIrJWQrJWQiICUgKHggKyA0MCwgeSArIDE3NSkpCisKKyAgICBkZWYgZGVmYXVsdF9jb21tYW5kKHNlbGYsIGR1bW15KTogcGFzcworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oCi0gICAgICAgICdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3NlYXJjaGRpYWxvZ2Jhc2UnLCB2ZXJib3NpdHk9MikKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3NlYXJjaGJhc2UnLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKworICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihfc2VhcmNoYmFzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1NlYXJjaEVuZ2luZS5weSBiL0xpYi9pZGxlbGliL3NlYXJjaGVuZ2luZS5weQpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3NlYXJjaGVuZ2luZS5weQppbmRleCAzNzg4M2JmLi4yNTNmMWIwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHkKKysrIGIvTGliL2lkbGVsaWIvc2VhcmNoZW5naW5lLnB5CkBAIC0xLDUgKzEsNiBAQAogJycnRGVmaW5lIFNlYXJjaEVuZ2luZSBmb3Igc2VhcmNoIGRpYWxvZ3MuJycnCiBpbXBvcnQgcmUKKwogZnJvbSB0a2ludGVyIGltcG9ydCBTdHJpbmdWYXIsIEJvb2xlYW5WYXIsIFRjbEVycm9yCiBpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAogCkBAIC0xNCw2ICsxNSw3IEBACiAgICAgICAgICMgVGhpcyBjcmVhdGVzIGEgY3ljbGUgdGhhdCBwZXJzaXN0cyB1bnRpbCByb290IGlzIGRlbGV0ZWQuCiAgICAgcmV0dXJuIHJvb3QuX3NlYXJjaGVuZ2luZQogCisKIGNsYXNzIFNlYXJjaEVuZ2luZToKICAgICAiIiJIYW5kbGVzIHNlYXJjaGluZyBhIHRleHQgd2lkZ2V0IGZvciBGaW5kLCBSZXBsYWNlLCBhbmQgR3JlcC4iIiIKIApAQCAtNTcsNyArNTksNyBAQAogCiAgICAgZGVmIHNldGNvb2tlZHBhdChzZWxmLCBwYXQpOgogICAgICAgICAiU2V0IHBhdHRlcm4gYWZ0ZXIgZXNjYXBpbmcgaWYgcmUuIgotICAgICAgICAjIGNhbGxlZCBvbmx5IGluIFNlYXJjaERpYWxvZy5weTogNjYKKyAgICAgICAgIyBjYWxsZWQgb25seSBpbiBzZWFyY2gucHk6IDY2CiAgICAgICAgIGlmIHNlbGYuaXNyZSgpOgogICAgICAgICAgICAgcGF0ID0gcmUuZXNjYXBlKHBhdCkKICAgICAgICAgc2VsZi5zZXRwYXQocGF0KQpAQCAtMTg2LDYgKzE4OCw3IEBACiAgICAgICAgICAgICBjb2wgPSBsZW4oY2hhcnMpIC0gMQogICAgICAgICByZXR1cm4gTm9uZQogCisKIGRlZiBzZWFyY2hfcmV2ZXJzZShwcm9nLCBjaGFycywgY29sKToKICAgICAnJydTZWFyY2ggYmFja3dhcmRzIGFuZCByZXR1cm4gYW4gcmUgbWF0Y2ggb2JqZWN0IG9yIE5vbmUuCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1N0YWNrVmlld2VyLnB5IGIvTGliL2lkbGVsaWIvc3RhY2t2aWV3ZXIucHkKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvU3RhY2tWaWV3ZXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3N0YWNrdmlld2VyLnB5CmluZGV4IGNjYzc1NWMuLjA2OThkZWYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1N0YWNrVmlld2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL3N0YWNrdmlld2VyLnB5CkBAIC0xLDEyICsxLDEyIEBACi1pbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCBvcwogaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKIGltcG9ydCB0a2ludGVyIGFzIHRrCiAKLWZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlTm9kZSwgVHJlZUl0ZW0sIFNjcm9sbGVkQ2FudmFzCi1mcm9tIGlkbGVsaWIuT2JqZWN0QnJvd3NlciBpbXBvcnQgT2JqZWN0VHJlZUl0ZW0sIG1ha2Vfb2JqZWN0dHJlZWl0ZW0KLWZyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKK2Zyb20gaWRsZWxpYi5kZWJ1Z29iaiBpbXBvcnQgT2JqZWN0VHJlZUl0ZW0sIG1ha2Vfb2JqZWN0dHJlZWl0ZW0KK2Zyb20gaWRsZWxpYi50cmVlIGltcG9ydCBUcmVlTm9kZSwgVHJlZUl0ZW0sIFNjcm9sbGVkQ2FudmFzCiAKIGRlZiBTdGFja0Jyb3dzZXIocm9vdCwgZmxpc3Q9Tm9uZSwgdGI9Tm9uZSwgdG9wPU5vbmUpOgogICAgIGlmIHRvcCBpcyBOb25lOgpAQCAtMTcsNiArMTcsNyBAQAogICAgIG5vZGUgPSBUcmVlTm9kZShzYy5jYW52YXMsIE5vbmUsIGl0ZW0pCiAgICAgbm9kZS5leHBhbmQoKQogCisKIGNsYXNzIFN0YWNrVHJlZUl0ZW0oVHJlZUl0ZW0pOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0PU5vbmUsIHRiPU5vbmUpOgpAQCAtNTUsNiArNTYsNyBAQAogICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKICAgICAgICAgcmV0dXJuIHN1Ymxpc3QKIAorCiBjbGFzcyBGcmFtZVRyZWVJdGVtKFRyZWVJdGVtKToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmZvLCBmbGlzdCk6CkBAIC05Niw2ICs5OCw3IEBACiAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmaWxlbmFtZSk6CiAgICAgICAgICAgICAgICAgc2VsZi5mbGlzdC5nb3RvZmlsZWxpbmUoZmlsZW5hbWUsIGxpbmVubykKIAorCiBjbGFzcyBWYXJpYWJsZXNUcmVlSXRlbShPYmplY3RUcmVlSXRlbSk6CiAKICAgICBkZWYgR2V0VGV4dChzZWxmKToKQEAgLTEyMCwxNSArMTIzLDE0IEBACiAgICAgICAgICAgICBzdWJsaXN0LmFwcGVuZChpdGVtKQogICAgICAgICByZXR1cm4gc3VibGlzdAogCi0gICAgZGVmIGtleXMoc2VsZik6ICAjIHVudXNlZCwgbGVmdCBmb3IgcG9zc2libGUgM3JkIHBhcnR5IHVzZQotICAgICAgICByZXR1cm4gbGlzdChzZWxmLm9iamVjdC5rZXlzKCkpCiAKLWRlZiBfc3RhY2tfdmlld2VyKHBhcmVudCk6Ci0gICAgcm9vdCA9IHRrLlRrKCkKLSAgICByb290LnRpdGxlKCJUZXN0IFN0YWNrVmlld2VyIikKLSAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCi0gICAgZmxpc3QgPSBQeVNoZWxsRmlsZUxpc3Qocm9vdCkKK2RlZiBfc3RhY2tfdmlld2VyKHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICBmcm9tIGlkbGVsaWIucHlzaGVsbCBpbXBvcnQgUHlTaGVsbEZpbGVMaXN0CisgICAgdG9wID0gdGsuVG9wbGV2ZWwocGFyZW50KQorICAgIHRvcC50aXRsZSgiVGVzdCBTdGFja1ZpZXdlciIpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4ICsgNTAsIHkgKyAxNzUpKQorICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHRvcCkKICAgICB0cnk6ICMgdG8gb2J0YWluIGEgdHJhY2ViYWNrIG9iamVjdAogICAgICAgICBpbnRlbnRpb25hbF9uYW1lX2Vycm9yCiAgICAgZXhjZXB0IE5hbWVFcnJvcjoKQEAgLTEzOSw3ICsxNDEsNyBAQAogICAgIHN5cy5sYXN0X3ZhbHVlID0gZXhjX3ZhbHVlCiAgICAgc3lzLmxhc3RfdHJhY2ViYWNrID0gZXhjX3RiCiAKLSAgICBTdGFja0Jyb3dzZXIocm9vdCwgZmxpc3Q9Zmxpc3QsIHRvcD1yb290LCB0Yj1leGNfdGIpCisgICAgU3RhY2tCcm93c2VyKHRvcCwgZmxpc3Q9Zmxpc3QsIHRvcD10b3AsIHRiPWV4Y190YikKIAogICAgICMgcmVzdG9yZSBzeXMgdG8gb3JpZ2luYWwgc3RhdGUKICAgICBkZWwgc3lzLmxhc3RfdHlwZQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvc3RhdHVzYmFyLnB5IGIvTGliL2lkbGVsaWIvc3RhdHVzYmFyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTg1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9zdGF0dXNiYXIucHkKQEAgLTAsMCArMSw0NiBAQAorZnJvbSB0a2ludGVyIGltcG9ydCBGcmFtZSwgTGFiZWwKKworCitjbGFzcyBNdWx0aVN0YXR1c0JhcihGcmFtZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCAqKmt3KToKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyLCAqKmt3KQorICAgICAgICBzZWxmLmxhYmVscyA9IHt9CisKKyAgICBkZWYgc2V0X2xhYmVsKHNlbGYsIG5hbWUsIHRleHQ9JycsIHNpZGU9J2xlZnQnLCB3aWR0aD0wKToKKyAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5sYWJlbHM6CisgICAgICAgICAgICBsYWJlbCA9IExhYmVsKHNlbGYsIGJvcmRlcndpZHRoPTAsIGFuY2hvcj0ndycpCisgICAgICAgICAgICBsYWJlbC5wYWNrKHNpZGU9c2lkZSwgcGFkeT0wLCBwYWR4PTQpCisgICAgICAgICAgICBzZWxmLmxhYmVsc1tuYW1lXSA9IGxhYmVsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYWJlbCA9IHNlbGYubGFiZWxzW25hbWVdCisgICAgICAgIGlmIHdpZHRoICE9IDA6CisgICAgICAgICAgICBsYWJlbC5jb25maWcod2lkdGg9d2lkdGgpCisgICAgICAgIGxhYmVsLmNvbmZpZyh0ZXh0PXRleHQpCisKKworZGVmIF9tdWx0aXN0YXR1c19iYXIocGFyZW50KTogICMgaHRlc3QgIworICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwsIEZyYW1lLCBUZXh0LCBCdXR0b24KKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlKHgsIHkgKyAxNzUpKQorICAgIHRvcC50aXRsZSgiVGVzdCBtdWx0aXN0YXR1cyBiYXIiKQorICAgIGZyYW1lID0gRnJhbWUodG9wKQorICAgIHRleHQgPSBUZXh0KGZyYW1lLCBoZWlnaHQ9NSwgd2lkdGg9NDApCisgICAgdGV4dC5wYWNrKCkKKyAgICBtc2IgPSBNdWx0aVN0YXR1c0JhcihmcmFtZSkKKyAgICBtc2Iuc2V0X2xhYmVsKCJvbmUiLCAiaGVsbG8iKQorICAgIG1zYi5zZXRfbGFiZWwoInR3byIsICJ3b3JsZCIpCisgICAgbXNiLnBhY2soc2lkZT0nYm90dG9tJywgZmlsbD0neCcpCisKKyAgICBkZWYgY2hhbmdlKCk6CisgICAgICAgIG1zYi5zZXRfbGFiZWwoIm9uZSIsICJmb28iKQorICAgICAgICBtc2Iuc2V0X2xhYmVsKCJ0d28iLCAiYmFyIikKKworICAgIGJ1dHRvbiA9IEJ1dHRvbih0b3AsIHRleHQ9IlVwZGF0ZSBzdGF0dXMiLCBjb21tYW5kPWNoYW5nZSkKKyAgICBidXR0b24ucGFjayhzaWRlPSdib3R0b20nKQorICAgIGZyYW1lLnBhY2soKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihfbXVsdGlzdGF0dXNfYmFyKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvdGFiYmVkcGFnZXMucHkgYi9MaWIvaWRsZWxpYi90YWJiZWRwYWdlcy5weQppbmRleCA5NjVmOWY4Li40MTg2ZmEyIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi90YWJiZWRwYWdlcy5weQorKysgYi9MaWIvaWRsZWxpYi90YWJiZWRwYWdlcy5weQpAQCAtMjg1LDYgKzI4NSw3IEBACiAgICAgICAgICAgICAjIHBsYWNlZCBoaWRlIGl0CiAgICAgICAgICAgICBzZWxmLnRhYl9zZXQubG93ZXIoKQogCisKIGNsYXNzIFRhYmJlZFBhZ2VTZXQoRnJhbWUpOgogICAgICIiIkEgVGtpbnRlciB0YWJiZWQtcGFuZSB3aWRnZXQuCiAKQEAgLTMwMiw2ICszMDMsNyBAQAogICAgIHJlbW92ZV9wYWdlKCkgbWV0aG9kcy4KIAogICAgICIiIgorCiAgICAgY2xhc3MgUGFnZShvYmplY3QpOgogICAgICAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBUYWJiZWRQYWdlU2V0J3MgcGFnZXMuCiAKQEAgLTQ2NywzMSArNDY5LDI5IEBACiAKICAgICAgICAgc2VsZi5fdGFiX3NldC5zZXRfc2VsZWN0ZWRfdGFiKHBhZ2VfbmFtZSkKIAotZGVmIF90YWJiZWRfcGFnZXMocGFyZW50KToKLSAgICAjIHRlc3QgZGlhbG9nCi0gICAgcm9vdD1UaygpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNzUpKQotICAgIHJvb3QudGl0bGUoIlRlc3QgdGFiYmVkIHBhZ2VzIikKLSAgICB0YWJQYWdlPVRhYmJlZFBhZ2VTZXQocm9vdCwgcGFnZV9uYW1lcz1bJ0Zvb2JhcicsJ0JheiddLCBuX3Jvd3M9MCwKKworZGVmIF90YWJiZWRfcGFnZXMocGFyZW50KTogICMgaHRlc3QgIworICAgIHRvcD1Ub3BsZXZlbChwYXJlbnQpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKKyAgICB0b3AudGl0bGUoIlRlc3QgdGFiYmVkIHBhZ2VzIikKKyAgICB0YWJQYWdlPVRhYmJlZFBhZ2VTZXQodG9wLCBwYWdlX25hbWVzPVsnRm9vYmFyJywnQmF6J10sIG5fcm93cz0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRfdGFicz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgIHRhYlBhZ2UucGFjayhzaWRlPVRPUCwgZXhwYW5kPVRSVUUsIGZpbGw9Qk9USCkKICAgICBMYWJlbCh0YWJQYWdlLnBhZ2VzWydGb29iYXInXS5mcmFtZSwgdGV4dD0nRm9vJywgcGFkeT0yMCkucGFjaygpCiAgICAgTGFiZWwodGFiUGFnZS5wYWdlc1snRm9vYmFyJ10uZnJhbWUsIHRleHQ9J0JhcicsIHBhZHk9MjApLnBhY2soKQogICAgIExhYmVsKHRhYlBhZ2UucGFnZXNbJ0JheiddLmZyYW1lLCB0ZXh0PSdCYXonKS5wYWNrKCkKLSAgICBlbnRyeVBnTmFtZT1FbnRyeShyb290KQotICAgIGJ1dHRvbkFkZD1CdXR0b24ocm9vdCwgdGV4dD0nQWRkIFBhZ2UnLAorICAgIGVudHJ5UGdOYW1lPUVudHJ5KHRvcCkKKyAgICBidXR0b25BZGQ9QnV0dG9uKHRvcCwgdGV4dD0nQWRkIFBhZ2UnLAogICAgICAgICAgICAgY29tbWFuZD1sYW1iZGE6dGFiUGFnZS5hZGRfcGFnZShlbnRyeVBnTmFtZS5nZXQoKSkpCi0gICAgYnV0dG9uUmVtb3ZlPUJ1dHRvbihyb290LCB0ZXh0PSdSZW1vdmUgUGFnZScsCisgICAgYnV0dG9uUmVtb3ZlPUJ1dHRvbih0b3AsIHRleHQ9J1JlbW92ZSBQYWdlJywKICAgICAgICAgICAgIGNvbW1hbmQ9bGFtYmRhOnRhYlBhZ2UucmVtb3ZlX3BhZ2UoZW50cnlQZ05hbWUuZ2V0KCkpKQotICAgIGxhYmVsUGdOYW1lPUxhYmVsKHJvb3QsIHRleHQ9J25hbWUgb2YgcGFnZSB0byBhZGQvcmVtb3ZlOicpCisgICAgbGFiZWxQZ05hbWU9TGFiZWwodG9wLCB0ZXh0PSduYW1lIG9mIHBhZ2UgdG8gYWRkL3JlbW92ZTonKQogICAgIGJ1dHRvbkFkZC5wYWNrKHBhZHg9NSwgcGFkeT01KQogICAgIGJ1dHRvblJlbW92ZS5wYWNrKHBhZHg9NSwgcGFkeT01KQogICAgIGxhYmVsUGdOYW1lLnBhY2socGFkeD01KQogICAgIGVudHJ5UGdOYW1lLnBhY2socGFkeD01KQotICAgIHJvb3QubWFpbmxvb3AoKQotCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi90ZXh0Vmlldy5weSBiL0xpYi9pZGxlbGliL3RleHR2aWV3LnB5CnNpbWlsYXJpdHkgaW5kZXggNzYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL3RleHRWaWV3LnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi90ZXh0dmlldy5weQppbmRleCAxMmFjMzE5Li5hZGVlMzI2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi90ZXh0Vmlldy5weQorKysgYi9MaWIvaWRsZWxpYi90ZXh0dmlldy5weQpAQCAtMSwxNCArMSwxNCBAQAogIiIiU2ltcGxlIHRleHQgYnJvd3NlciBmb3IgSURMRQogCiAiIiIKLQogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1pbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCitmcm9tIHRraW50ZXIubWVzc2FnZWJveCBpbXBvcnQgc2hvd2Vycm9yCisKIAogY2xhc3MgVGV4dFZpZXdlcihUb3BsZXZlbCk6Ci0gICAgIiIiQSBzaW1wbGUgdGV4dCB2aWV3ZXIgZGlhbG9nIGZvciBJRExFCisgICAgIkEgc2ltcGxlIHRleHQgdmlld2VyIGRpYWxvZyBmb3IgSURMRS4iCiAKLSAgICAiIiIKICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgdGV4dCwgbW9kYWw9VHJ1ZSwgX2h0ZXN0PUZhbHNlKToKICAgICAgICAgIiIiU2hvdyB0aGUgZ2l2ZW4gdGV4dCBpbiBhIHNjcm9sbGFibGUgd2luZG93IHdpdGggYSAnY2xvc2UnIGJ1dHRvbgogCkBAIC0yMCwxMSArMjAsMTEgQEAKICAgICAgICAgIiIiCiAgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKICAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKLSAgICAgICAgIyBwbGFjZSBkaWFsb2cgYmVsb3cgcGFyZW50IGlmIHJ1bm5pbmcgaHRlc3QKKyAgICAgICAgIyBQbGFjZSBkaWFsb2cgYmVsb3cgcGFyZW50IGlmIHJ1bm5pbmcgaHRlc3QuCiAgICAgICAgIHNlbGYuZ2VvbWV0cnkoIj0lZHglZCslZCslZCIgJSAoNzUwLCA1MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHgoKSArIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R5KCkgKyAoMTAgaWYgbm90IF9odGVzdCBlbHNlIDEwMCkpKQotICAgICAgICAjZWxndWF2YXMgLSBjb25maWcgcGxhY2Vob2xkZXJzIHRpbCBjb25maWcgc3R1ZmYgY29tcGxldGVkCisgICAgICAgICMgVE9ETzogZ2V0IGZnL2JnIGZyb20gdGhlbWUuCiAgICAgICAgIHNlbGYuYmcgPSAnI2ZmZmZmZicKICAgICAgICAgc2VsZi5mZyA9ICcjMDAwMDAwJwogCkBAIC0zMyw5ICszMyw5IEBACiAgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLk9rKQogICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAogICAgICAgICBzZWxmLnRleHRWaWV3LmZvY3VzX3NldCgpCi0gICAgICAgICNrZXkgYmluZGluZ3MgZm9yIHRoaXMgZGlhbG9nCi0gICAgICAgIHNlbGYuYmluZCgnPFJldHVybj4nLHNlbGYuT2spICNkaXNtaXNzIGRpYWxvZwotICAgICAgICBzZWxmLmJpbmQoJzxFc2NhcGU+JyxzZWxmLk9rKSAjZGlzbWlzcyBkaWFsb2cKKyAgICAgICAgIyBCaW5kIGtleXMgZm9yIGNsb3NpbmcgdGhpcyBkaWFsb2cuCisgICAgICAgIHNlbGYuYmluZCgnPFJldHVybj4nLHNlbGYuT2spCisgICAgICAgIHNlbGYuYmluZCgnPEVzY2FwZT4nLHNlbGYuT2spCiAgICAgICAgIHNlbGYudGV4dFZpZXcuaW5zZXJ0KDAuMCwgdGV4dCkKICAgICAgICAgc2VsZi50ZXh0Vmlldy5jb25maWcoc3RhdGU9RElTQUJMRUQpCiAKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgc2VsZi5idXR0b25PayA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsIHRleHQ9J0Nsb3NlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuT2ssIHRha2Vmb2N1cz1GQUxTRSkKICAgICAgICAgc2VsZi5zY3JvbGxiYXJWaWV3ID0gU2Nyb2xsYmFyKGZyYW1lVGV4dCwgb3JpZW50PVZFUlRJQ0FMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZWZvY3VzPUZBTFNFLCBoaWdobGlnaHR0aGlja25lc3M9MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2Vmb2N1cz1GQUxTRSkKICAgICAgICAgc2VsZi50ZXh0VmlldyA9IFRleHQoZnJhbWVUZXh0LCB3cmFwPVdPUkQsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZz1zZWxmLmZnLCBiZz1zZWxmLmJnKQogICAgICAgICBzZWxmLnNjcm9sbGJhclZpZXcuY29uZmlnKGNvbW1hbmQ9c2VsZi50ZXh0Vmlldy55dmlldykKQEAgLTcyLDE0ICs3MiwxNCBAQAogICAgIHRyeToKICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncicsIGVuY29kaW5nPWVuY29kaW5nKSBhcyBmaWxlOgogICAgICAgICAgICAgY29udGVudHMgPSBmaWxlLnJlYWQoKQotICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdGaWxlIExvYWQgRXJyb3InLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1VuYWJsZSB0byBsb2FkIGZpbGUgJXIgLicgJSBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9cGFyZW50KQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBzaG93ZXJyb3IodGl0bGU9J0ZpbGUgTG9hZCBFcnJvcicsCisgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdVbmFibGUgdG8gbG9hZCBmaWxlICVyIC4nICUgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICBwYXJlbnQ9cGFyZW50KQogICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3IgYXMgZXJyOgotICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdVbmljb2RlIERlY29kZSBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT1zdHIoZXJyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9cGFyZW50KQorICAgICAgICBzaG93ZXJyb3IodGl0bGU9J1VuaWNvZGUgRGVjb2RlIEVycm9yJywKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9c3RyKGVyciksCisgICAgICAgICAgICAgICAgICBwYXJlbnQ9cGFyZW50KQogICAgIGVsc2U6CiAgICAgICAgIHJldHVybiB2aWV3X3RleHQocGFyZW50LCB0aXRsZSwgY29udGVudHMsIG1vZGFsKQogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9Ub29sVGlwLnB5IGIvTGliL2lkbGVsaWIvdG9vbHRpcC5weQpzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9Ub29sVGlwLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi90b29sdGlwLnB5CmluZGV4IDk2NDEwN2UuLjg0M2ZiNGEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1Rvb2xUaXAucHkKKysrIGIvTGliL2lkbGVsaWIvdG9vbHRpcC5weQpAQCAtMSw0ICsxLDQgQEAKLSMgZ2VuZXJhbCBwdXJwb3NlICd0b29sdGlwJyByb3V0aW5lcyAtIGN1cnJlbnRseSB1bnVzZWQgaW4gaWRsZWZvcmsKKyMgZ2VuZXJhbCBwdXJwb3NlICd0b29sdGlwJyByb3V0aW5lcyAtIGN1cnJlbnRseSB1bnVzZWQgaW4gaWRsZWxpYgogIyAoYWx0aG91Z2ggdGhlICdjYWxsdGlwcycgZXh0ZW5zaW9uIGlzIHBhcnRseSBiYXNlZCBvbiB0aGlzIGNvZGUpCiAjIG1heSBiZSB1c2VmdWwgZm9yIHNvbWUgcHVycG9zZXMgaW4gKG9yIGFsbW9zdCBpbiA7KSB0aGUgY3VycmVudCBwcm9qZWN0IHNjb3BlCiAjIElkZWFzIGdsZWFuZWQgZnJvbSBQeVNvbApAQCAtNzYsMjEgKzc2LDIwIEBACiAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuaXRlbXM6CiAgICAgICAgICAgICBsaXN0Ym94Lmluc2VydChFTkQsIGl0ZW0pCiAKLWRlZiBfdG9vbHRpcChwYXJlbnQpOgotICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCB0b29sdGlwIikKLSAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCi0gICAgbGFiZWwgPSBMYWJlbChyb290LCB0ZXh0PSJQbGFjZSB5b3VyIG1vdXNlIG92ZXIgYnV0dG9ucyIpCitkZWYgX3Rvb2x0aXAocGFyZW50KTogICMgaHRlc3QgIworICAgIHRvcCA9IFRvcGxldmVsKHBhcmVudCkKKyAgICB0b3AudGl0bGUoIlRlc3QgdG9vbHRpcCIpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTUwKSkKKyAgICBsYWJlbCA9IExhYmVsKHRvcCwgdGV4dD0iUGxhY2UgeW91ciBtb3VzZSBvdmVyIGJ1dHRvbnMiKQogICAgIGxhYmVsLnBhY2soKQotICAgIGJ1dHRvbjEgPSBCdXR0b24ocm9vdCwgdGV4dD0iQnV0dG9uIDEiKQotICAgIGJ1dHRvbjIgPSBCdXR0b24ocm9vdCwgdGV4dD0iQnV0dG9uIDIiKQorICAgIGJ1dHRvbjEgPSBCdXR0b24odG9wLCB0ZXh0PSJCdXR0b24gMSIpCisgICAgYnV0dG9uMiA9IEJ1dHRvbih0b3AsIHRleHQ9IkJ1dHRvbiAyIikKICAgICBidXR0b24xLnBhY2soKQogICAgIGJ1dHRvbjIucGFjaygpCiAgICAgVG9vbFRpcChidXR0b24xLCAiVGhpcyBpcyB0b29sdGlwIHRleHQgZm9yIGJ1dHRvbjEuIikKICAgICBMaXN0Ym94VG9vbFRpcChidXR0b24yLCBbIlRoaXMgaXMiLCJtdWx0aXBsZSBsaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9vbHRpcCB0ZXh0IiwiZm9yIGJ1dHRvbjIiXSkKLSAgICByb290Lm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1RyZWVXaWRnZXQucHkgYi9MaWIvaWRsZWxpYi90cmVlLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1RyZWVXaWRnZXQucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3RyZWUucHkKaW5kZXggYTE5NTc4Zi4uMjkyY2UzNiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvVHJlZVdpZGdldC5weQorKysgYi9MaWIvaWRsZWxpYi90cmVlLnB5CkBAIC0xNSwxMCArMTUsMTIgQEAKICMgLSBvcHRpbWl6ZSB0cmVlIHJlZHJhdyBhZnRlciBleHBhbmQgb2Ygc3Vibm9kZQogCiBpbXBvcnQgb3MKLWZyb20gdGtpbnRlciBpbXBvcnQgKgogCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFpvb21IZWlnaHQKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSB0a2ludGVyIGltcG9ydCAqCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKKworZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYiBpbXBvcnQgem9vbWhlaWdodAogCiBJQ09ORElSID0gIkljb25zIgogCkBAIC00NDUsMjIgKzQ0NywyMSBAQAogICAgICAgICBzZWxmLmNhbnZhcy55dmlld19zY3JvbGwoMSwgInVuaXQiKQogICAgICAgICByZXR1cm4gImJyZWFrIgogICAgIGRlZiB6b29tX2hlaWdodChzZWxmLCBldmVudCk6Ci0gICAgICAgIFpvb21IZWlnaHQuem9vbV9oZWlnaHQoc2VsZi5tYXN0ZXIpCisgICAgICAgIHpvb21oZWlnaHQuem9vbV9oZWlnaHQoc2VsZi5tYXN0ZXIpCiAgICAgICAgIHJldHVybiAiYnJlYWsiCiAKIAotZGVmIF90cmVlX3dpZGdldChwYXJlbnQpOgotICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBUcmVlV2lkZ2V0IikKLSAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCi0gICAgc2MgPSBTY3JvbGxlZENhbnZhcyhyb290LCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCitkZWYgX3RyZWVfd2lkZ2V0KHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4KzUwLCB5KzE3NSkpCisgICAgc2MgPSBTY3JvbGxlZENhbnZhcyh0b3AsIGJnPSJ3aGl0ZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCB0YWtlZm9jdXM9MSkKICAgICBzYy5mcmFtZS5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIiwgc2lkZT1MRUZUKQotICAgIGl0ZW0gPSBGaWxlVHJlZUl0ZW0ob3MuZ2V0Y3dkKCkpCisgICAgaXRlbSA9IEZpbGVUcmVlSXRlbShJQ09ORElSKQogICAgIG5vZGUgPSBUcmVlTm9kZShzYy5jYW52YXMsIE5vbmUsIGl0ZW0pCiAgICAgbm9kZS5leHBhbmQoKQotICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICMgdGVzdF90cmVlIGlzIGN1cnJlbnRseSBhIGNvcHkgb2YgdGhpcwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfdHJlZV93aWRnZXQpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5IGIvTGliL2lkbGVsaWIvdW5kby5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi91bmRvLnB5CmluZGV4IDFjMjUwMmQuLjQzMzJmMTAgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1VuZG9EZWxlZ2F0b3IucHkKKysrIGIvTGliL2lkbGVsaWIvdW5kby5weQpAQCAtMSw3ICsxLDkgQEAKIGltcG9ydCBzdHJpbmcKLWZyb20gdGtpbnRlciBpbXBvcnQgKgogCi1mcm9tIGlkbGVsaWIuRGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5kZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgorCisjIHRraW50dGVyIGltcG9ydCBub3QgbmVlZGVkIGJlY2F1c2UgbW9kdWxlIGRvZXMgbm90IGNyZWF0ZSB3aWRnZXRzLAorIyBhbHRob3VnaCBtYW55IG1ldGhvZHMgb3BlcmF0ZSBvbiB0ZXh0IHdpZGdldCBhcmd1bWVudHMuCiAKICMkIGV2ZW50IDw8cmVkbz4+CiAjJCB3aW4gPENvbnRyb2wteT4KQEAgLTE1OCw3ICsxNjAsNiBAQAogCiAKIGNsYXNzIENvbW1hbmQ6Ci0KICAgICAjIEJhc2UgY2xhc3MgZm9yIFVuZG9hYmxlIGNvbW1hbmRzCiAKICAgICB0YWdzID0gTm9uZQpAQCAtMjA0LDcgKzIwNSw2IEBACiAKIAogY2xhc3MgSW5zZXJ0Q29tbWFuZChDb21tYW5kKToKLQogICAgICMgVW5kb2FibGUgaW5zZXJ0IGNvbW1hbmQKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmRleDEsIGNoYXJzLCB0YWdzPU5vbmUpOgpAQCAtMjYyLDcgKzI2Miw2IEBACiAKIAogY2xhc3MgRGVsZXRlQ29tbWFuZChDb21tYW5kKToKLQogICAgICMgVW5kb2FibGUgZGVsZXRlIGNvbW1hbmQKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmRleDEsIGluZGV4Mj1Ob25lKToKQEAgLTI5Nyw4ICsyOTYsOCBAQAogICAgICAgICB0ZXh0LnNlZSgnaW5zZXJ0JykKICAgICAgICAgIyNzeXMuX19zdGRlcnJfXy53cml0ZSgidW5kbzogJXNcbiIgJSBzZWxmKQogCi1jbGFzcyBDb21tYW5kU2VxdWVuY2UoQ29tbWFuZCk6CiAKK2NsYXNzIENvbW1hbmRTZXF1ZW5jZShDb21tYW5kKToKICAgICAjIFdyYXBwZXIgZm9yIGEgc2VxdWVuY2Ugb2YgdW5kb2FibGUgY21kcyB0byBiZSB1bmRvbmUvcmVkb25lCiAgICAgIyBhcyBhIHVuaXQKIApAQCAtMzM4LDEzICszMzcsMTIgQEAKIAogCiBkZWYgX3VuZG9fZGVsZWdhdG9yKHBhcmVudCk6ICAjIGh0ZXN0ICMKLSAgICBpbXBvcnQgcmUKLSAgICBpbXBvcnQgdGtpbnRlciBhcyB0awotICAgIGZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCi0gICAgdW5kb3dpbiA9IHRrLlRvcGxldmVsKCkKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBUZXh0LCBCdXR0b24KKyAgICBmcm9tIGlkbGVsaWIucGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgorICAgIHVuZG93aW4gPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgdW5kb3dpbi50aXRsZSgiVGVzdCBVbmRvRGVsZWdhdG9yIikKLSAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgdW5kb3dpbi5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHVuZG93aW4uZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSArIDE3NSkpCiAKICAgICB0ZXh0ID0gVGV4dCh1bmRvd2luLCBoZWlnaHQ9MTApCiAgICAgdGV4dC5wYWNrKCkKQEAgLTM2Miw3ICszNjAsNyBAQAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfdW5kb2RlbGVnYXRvcicsIHZlcmJvc2l0eT0yLAotICAgICAgICAgICAgICAgICAgZXhpdD1GYWxzZSkKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3VuZG8nLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfdW5kb19kZWxlZ2F0b3IpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9XaW5kb3dMaXN0LnB5IGIvTGliL2lkbGVsaWIvd2luZG93cy5weQpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9XaW5kb3dMaXN0LnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi93aW5kb3dzLnB5CmluZGV4IGJjNzQzNDguLmEzZjg1OGEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1dpbmRvd0xpc3QucHkKKysrIGIvTGliL2lkbGVsaWIvd2luZG93cy5weQpAQCAtMSw1ICsxLDYgQEAKIGZyb20gdGtpbnRlciBpbXBvcnQgKgogCisKIGNsYXNzIFdpbmRvd0xpc3Q6CiAKICAgICBkZWYgX19pbml0X18oc2VsZik6CkBAIC00OCw2ICs0OSw3IEBACiAgICAgICAgICAgICAgICAgdCwgdiwgdGIgPSBzeXMuZXhjX2luZm8oKQogICAgICAgICAgICAgICAgIHByaW50KCJ3YXJuaW5nOiBjYWxsYmFjayBmYWlsZWQgaW4gV2luZG93TGlzdCIsIHQsICI6IiwgdikKIAorCiByZWdpc3RyeSA9IFdpbmRvd0xpc3QoKQogCiBhZGRfd2luZG93c190b19tZW51ID0gcmVnaXN0cnkuYWRkX3dpbmRvd3NfdG9fbWVudQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvWm9vbUhlaWdodC5weSBiL0xpYi9pZGxlbGliL3pvb21oZWlnaHQucHkKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvWm9vbUhlaWdodC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvem9vbWhlaWdodC5weQppbmRleCBhNWQ2NzllLi5hYTRhNDI3IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ab29tSGVpZ2h0LnB5CisrKyBiL0xpYi9pZGxlbGliL3pvb21oZWlnaHQucHkKQEAgLTMsNyArMyw4IEBACiBpbXBvcnQgcmUKIGltcG9ydCBzeXMKIAotZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0Citmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeAorCiAKIGNsYXNzIFpvb21IZWlnaHQ6CiAKQEAgLTIwLDYgKzIxLDcgQEAKICAgICAgICAgdG9wID0gc2VsZi5lZGl0d2luLnRvcAogICAgICAgICB6b29tX2hlaWdodCh0b3ApCiAKKwogZGVmIHpvb21faGVpZ2h0KHRvcCk6CiAgICAgZ2VvbSA9IHRvcC53bV9nZW9tZXRyeSgpCiAgICAgbSA9IHJlLm1hdGNoKHIiKFxkKyl4KFxkKylcKygtP1xkKylcKygtP1xkKykiLCBnZW9tKQpAQCAtMzIsNyArMzQsNyBAQAogICAgICAgICBuZXd5ID0gMAogICAgICAgICBuZXdoZWlnaHQgPSBuZXdoZWlnaHQgLSA3MgogCi0gICAgZWxpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgZWxpZiBtYWNvc3guaXNBcXVhVGsoKToKICAgICAgICAgIyBUaGUgJzg4JyBiZWxvdyBpcyBhIG1hZ2ljIG51bWJlciB0aGF0IGF2b2lkcyBwbGFjaW5nIHRoZSBib3R0b20KICAgICAgICAgIyBvZiB0aGUgd2luZG93IGJlbG93IHRoZSBwYW5lbCBvbiBteSBtYWNoaW5lLiBJIGRvbid0IGtub3cgaG93CiAgICAgICAgICMgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGlzIHdpdGggdGtpbnRlci4KZGlmZiAtLWdpdCBhL0xpYi9pbWFwbGliLnB5IGIvTGliL2ltYXBsaWIucHkKaW5kZXggNGU4YTRiYi4uOTY1ZWQ4MyAxMDA2NDQKLS0tIGEvTGliL2ltYXBsaWIucHkKKysrIGIvTGliL2ltYXBsaWIucHkKQEAgLTExMSw3ICsxMTEsMTUgQEAKICMgTGl0ZXJhbCBpcyBubyBsb25nZXIgdXNlZDsga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KIExpdGVyYWwgPSByZS5jb21waWxlKGJyJy4qeyg/UDxzaXplPlxkKyl9JCcsIHJlLkFTQ0lJKQogTWFwQ1JMRiA9IHJlLmNvbXBpbGUoYnInXHJcbnxccnxcbicpCi1SZXNwb25zZV9jb2RlID0gcmUuY29tcGlsZShicidcWyg/UDx0eXBlPltBLVotXSspKCAoP1A8ZGF0YT5bXlxdXSopKT9cXScpCisjIFdlIG5vIGxvbmdlciBleGNsdWRlIHRoZSAnXScgY2hhcmFjdGVyIGZyb20gdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgcmVzcG9uc2UKKyMgY29kZSwgZXZlbiB0aG91Z2ggaXQgdmlvbGF0ZXMgdGhlIFJGQy4gIFBvcHVsYXIgSU1BUCBzZXJ2ZXJzIHN1Y2ggYXMgR21haWwKKyMgYWxsb3cgZmxhZ3Mgd2l0aCAnXScsIGFuZCB0aGVyZSBhcmUgcHJvZ3JhbXMgKGluY2x1ZGluZyBpbWFwbGliISkgdGhhdCBjYW4KKyMgcHJvZHVjZSB0aGVtLiAgVGhlIHByb2JsZW0gd2l0aCB0aGlzIGlzIGlmIHRoZSAndGV4dCcgcG9ydGlvbiBvZiB0aGUgcmVzcG9uc2UKKyMgaW5jbHVkZXMgYSAnXScgd2UnbGwgcGFyc2UgdGhlIHJlc3BvbnNlIHdyb25nICh3aGljaCBpcyB0aGUgcG9pbnQgb2YgdGhlIFJGQworIyByZXN0cmljdGlvbikuICBIb3dldmVyLCB0aGF0IHNlZW1zIGxlc3MgbGlrZWx5IHRvIGJlIGEgcHJvYmxlbSBpbiBwcmFjdGljZQorIyB0aGFuIGJlaW5nIHVuYWJsZSB0byBjb3JyZWN0bHkgcGFyc2UgZmxhZ3MgdGhhdCBpbmNsdWRlICddJyBjaGFycywgd2hpY2gKKyMgd2FzIHJlcG9ydGVkIGFzIGEgcmVhbC13b3JsZCBwcm9ibGVtIGluIGlzc3VlICMyMTgxNS4KK1Jlc3BvbnNlX2NvZGUgPSByZS5jb21waWxlKGJyJ1xbKD9QPHR5cGU+W0EtWi1dKykoICg/UDxkYXRhPi4qKSk/XF0nKQogVW50YWdnZWRfcmVzcG9uc2UgPSByZS5jb21waWxlKGJyJ1wqICg/UDx0eXBlPltBLVotXSspKCAoP1A8ZGF0YT4uKikpPycpCiAjIFVudGFnZ2VkX3N0YXR1cyBpcyBubyBsb25nZXIgdXNlZDsga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogVW50YWdnZWRfc3RhdHVzID0gcmUuY29tcGlsZSgKQEAgLTEyNCw3ICsxMzIsNyBAQAogCiBjbGFzcyBJTUFQNDoKIAotICAgICIiIklNQVA0IGNsaWVudCBjbGFzcy4KKyAgICByIiIiSU1BUDQgY2xpZW50IGNsYXNzLgogCiAgICAgSW5zdGFudGlhdGUgd2l0aDogSU1BUDQoW2hvc3RbLCBwb3J0XV0pCiAKQEAgLTE1MjcsNyArMTUzNSw3IEBACiAgICAgKCdzZWxlY3QnLCAoJy90bXAveXl6IDInLCkpLAogICAgICgnc2VhcmNoJywgKE5vbmUsICdTVUJKRUNUJywgJ3Rlc3QnKSksCiAgICAgKCdmZXRjaCcsICgnMScsICcoRkxBR1MgSU5URVJOQUxEQVRFIFJGQzgyMiknKSksCi0gICAgKCdzdG9yZScsICgnMScsICdGTEFHUycsICcoXERlbGV0ZWQpJykpLAorICAgICgnc3RvcmUnLCAoJzEnLCAnRkxBR1MnLCByJyhcRGVsZXRlZCknKSksCiAgICAgKCduYW1lc3BhY2UnLCAoKSksCiAgICAgKCdleHB1bmdlJywgKCkpLAogICAgICgncmVjZW50JywgKCkpLApkaWZmIC0tZ2l0IGEvTGliL2ltcC5weSBiL0xpYi9pbXAucHkKaW5kZXggZTI2NDM5MS4uNzgxZmYyMyAxMDA2NDQKLS0tIGEvTGliL2ltcC5weQorKysgYi9MaWIvaW1wLnB5CkBAIC0zMCw3ICszMCw3IEBACiAKIHdhcm5pbmdzLndhcm4oInRoZSBpbXAgbW9kdWxlIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGltcG9ydGxpYjsgIgogICAgICAgICAgICAgICAic2VlIHRoZSBtb2R1bGUncyBkb2N1bWVudGF0aW9uIGZvciBhbHRlcm5hdGl2ZSB1c2VzIiwKLSAgICAgICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKIAogIyBERVBSRUNBVEVECiBTRUFSQ0hfRVJST1IgPSAwCmRpZmYgLS1naXQgYS9MaWIvaW1wb3J0bGliL19ib290c3RyYXAucHkgYi9MaWIvaW1wb3J0bGliL19ib290c3RyYXAucHkKaW5kZXggOWVlY2JmZS4uYTUzMWEwMyAxMDA2NDQKLS0tIGEvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwLnB5CisrKyBiL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcC5weQpAQCAtMzYsMjMgKzM2LDYgQEAKICAgICByZXR1cm4gdHlwZShzeXMpKG5hbWUpCiAKIAotY2xhc3MgX01hbmFnZVJlbG9hZDoKLQotICAgICIiIk1hbmFnZXMgdGhlIHBvc3NpYmxlIGNsZWFuLXVwIG9mIHN5cy5tb2R1bGVzIGZvciBsb2FkX21vZHVsZSgpLiIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgotICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQotCi0gICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKLSAgICAgICAgc2VsZi5faXNfcmVsb2FkID0gc2VsZi5fbmFtZSBpbiBzeXMubW9kdWxlcwotCi0gICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKLSAgICAgICAgaWYgYW55KGFyZyBpcyBub3QgTm9uZSBmb3IgYXJnIGluIGFyZ3MpIGFuZCBub3Qgc2VsZi5faXNfcmVsb2FkOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tzZWxmLl9uYW1lXQotICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgICAgIHBhc3MKLQogIyBNb2R1bGUtbGV2ZWwgbG9ja2luZyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAjIEEgZGljdCBtYXBwaW5nIG1vZHVsZSBuYW1lcyB0byB3ZWFrcmVmcyBvZiBfTW9kdWxlTG9jayBpbnN0YW5jZXMKQEAgLTI3MCw3ICsyNTMsNyBAQAogIyBNb2R1bGUgc3BlY2lmaWNhdGlvbnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBkZWYgX21vZHVsZV9yZXByKG1vZHVsZSk6Ci0gICAgIyBUaGUgaW1wbGVtZW50YXRpb24gb2YgTW9kdWxlVHlwZV9fcmVwcl9fKCkuCisgICAgIyBUaGUgaW1wbGVtZW50YXRpb24gb2YgTW9kdWxlVHlwZS5fX3JlcHJfXygpLgogICAgIGxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICAgaWYgaGFzYXR0cihsb2FkZXIsICdtb2R1bGVfcmVwcicpOgogICAgICAgICAjIEFzIHNvb24gYXMgQnVpbHRpbkltcG9ydGVyLCBGcm96ZW5JbXBvcnRlciwgYW5kIE5hbWVzcGFjZUxvYWRlcgpAQCAtNTc2LDkgKzU1OSw4IEBACiAgICAgICAgICMgbW9kdWxlIGNyZWF0aW9uIHNob3VsZCBiZSB1c2VkLgogICAgICAgICBtb2R1bGUgPSBzcGVjLmxvYWRlci5jcmVhdGVfbW9kdWxlKHNwZWMpCiAgICAgZWxpZiBoYXNhdHRyKHNwZWMubG9hZGVyLCAnZXhlY19tb2R1bGUnKToKLSAgICAgICAgX3dhcm5pbmdzLndhcm4oJ3N0YXJ0aW5nIGluIFB5dGhvbiAzLjYsIGxvYWRlcnMgZGVmaW5pbmcgZXhlY19tb2R1bGUoKSAnCi0gICAgICAgICAgICAgICAgICAgICAgICdtdXN0IGFsc28gZGVmaW5lIGNyZWF0ZV9tb2R1bGUoKScsCi0gICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICByYWlzZSBJbXBvcnRFcnJvcignbG9hZGVycyB0aGF0IGRlZmluZSBleGVjX21vZHVsZSgpICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ211c3QgYWxzbyBkZWZpbmUgY3JlYXRlX21vZHVsZSgpJykKICAgICBpZiBtb2R1bGUgaXMgTm9uZToKICAgICAgICAgbW9kdWxlID0gX25ld19tb2R1bGUoc3BlYy5uYW1lKQogICAgIF9pbml0X21vZHVsZV9hdHRycyhzcGVjLCBtb2R1bGUpCkBAIC02MDMsNyArNTg1LDcgQEAKIAogIyBVc2VkIGJ5IGltcG9ydGxpYi5yZWxvYWQoKSBhbmQgX2xvYWRfbW9kdWxlX3NoaW0oKS4KIGRlZiBfZXhlYyhzcGVjLCBtb2R1bGUpOgotICAgICIiIkV4ZWN1dGUgdGhlIHNwZWMgaW4gYW4gZXhpc3RpbmcgbW9kdWxlJ3MgbmFtZXNwYWNlLiIiIgorICAgICIiIkV4ZWN1dGUgdGhlIHNwZWMncyBzcGVjaWZpZWQgbW9kdWxlIGluIGFuIGV4aXN0aW5nIG1vZHVsZSdzIG5hbWVzcGFjZS4iIiIKICAgICBuYW1lID0gc3BlYy5uYW1lCiAgICAgX2ltcC5hY3F1aXJlX2xvY2soKQogICAgIHdpdGggX01vZHVsZUxvY2tNYW5hZ2VyKG5hbWUpOgpAQCAtODc3LDE0ICs4NTksMjEgQEAKIAogCiBkZWYgX2ZpbmRfc3BlYyhuYW1lLCBwYXRoLCB0YXJnZXQ9Tm9uZSk6Ci0gICAgIiIiRmluZCBhIG1vZHVsZSdzIGxvYWRlci4iIiIKLSAgICBpZiBzeXMubWV0YV9wYXRoIGlzIG5vdCBOb25lIGFuZCBub3Qgc3lzLm1ldGFfcGF0aDoKKyAgICAiIiJGaW5kIGEgbW9kdWxlJ3Mgc3BlYy4iIiIKKyAgICBtZXRhX3BhdGggPSBzeXMubWV0YV9wYXRoCisgICAgaWYgbWV0YV9wYXRoIGlzIE5vbmU6CisgICAgICAgICMgUHlJbXBvcnRfQ2xlYW51cCgpIGlzIHJ1bm5pbmcgb3IgaGFzIGJlZW4gY2FsbGVkLgorICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigic3lzLm1ldGFfcGF0aCBpcyBOb25lLCBQeXRob24gaXMgbGlrZWx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNodXR0aW5nIGRvd24iKQorCisgICAgaWYgbm90IG1ldGFfcGF0aDoKICAgICAgICAgX3dhcm5pbmdzLndhcm4oJ3N5cy5tZXRhX3BhdGggaXMgZW1wdHknLCBJbXBvcnRXYXJuaW5nKQorCiAgICAgIyBXZSBjaGVjayBzeXMubW9kdWxlcyBoZXJlIGZvciB0aGUgcmVsb2FkIGNhc2UuICBXaGlsZSBhIHBhc3NlZC1pbgogICAgICMgdGFyZ2V0IHdpbGwgdXN1YWxseSBpbmRpY2F0ZSBhIHJlbG9hZCB0aGVyZSBpcyBubyBndWFyYW50ZWUsIHdoZXJlYXMKICAgICAjIHN5cy5tb2R1bGVzIHByb3ZpZGVzIG9uZS4KICAgICBpc19yZWxvYWQgPSBuYW1lIGluIHN5cy5tb2R1bGVzCi0gICAgZm9yIGZpbmRlciBpbiBzeXMubWV0YV9wYXRoOgorICAgIGZvciBmaW5kZXIgaW4gbWV0YV9wYXRoOgogICAgICAgICB3aXRoIF9JbXBvcnRMb2NrQ29udGV4dCgpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGZpbmRfc3BlYyA9IGZpbmRlci5maW5kX3NwZWMKQEAgLTkyNSw2ICs5MTQsOSBAQAogICAgIGlmIGxldmVsID4gMDoKICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGFja2FnZSwgc3RyKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignX19wYWNrYWdlX18gbm90IHNldCB0byBhIHN0cmluZycpCisgICAgICAgIGVsaWYgbm90IHBhY2thZ2U6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcignYXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCB3aXRoIG5vIGtub3duIHBhcmVudCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFja2FnZScpCiAgICAgICAgIGVsaWYgcGFja2FnZSBub3QgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICBtc2cgPSAoJ1BhcmVudCBtb2R1bGUgeyFyfSBub3QgbG9hZGVkLCBjYW5ub3QgcGVyZm9ybSByZWxhdGl2ZSAnCiAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCcpCkBAIC05NTAsMTAgKzk0MiwxMCBAQAogICAgICAgICAgICAgcGF0aCA9IHBhcmVudF9tb2R1bGUuX19wYXRoX18KICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgbXNnID0gKF9FUlJfTVNHICsgJzsgeyFyfSBpcyBub3QgYSBwYWNrYWdlJykuZm9ybWF0KG5hbWUsIHBhcmVudCkKLSAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKG1zZywgbmFtZT1uYW1lKSBmcm9tIE5vbmUKKyAgICAgICAgICAgIHJhaXNlIE1vZHVsZU5vdEZvdW5kRXJyb3IobXNnLCBuYW1lPW5hbWUpIGZyb20gTm9uZQogICAgIHNwZWMgPSBfZmluZF9zcGVjKG5hbWUsIHBhdGgpCiAgICAgaWYgc3BlYyBpcyBOb25lOgotICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihfRVJSX01TRy5mb3JtYXQobmFtZSksIG5hbWU9bmFtZSkKKyAgICAgICAgcmFpc2UgTW9kdWxlTm90Rm91bmRFcnJvcihfRVJSX01TRy5mb3JtYXQobmFtZSksIG5hbWU9bmFtZSkKICAgICBlbHNlOgogICAgICAgICBtb2R1bGUgPSBfbG9hZF91bmxvY2tlZChzcGVjKQogICAgIGlmIHBhcmVudDoKQEAgLTk4OSwxMCArOTgxLDExIEBACiAgICAgICAgIF9pbXAucmVsZWFzZV9sb2NrKCkKICAgICAgICAgbWVzc2FnZSA9ICgnaW1wb3J0IG9mIHt9IGhhbHRlZDsgJwogICAgICAgICAgICAgICAgICAgICdOb25lIGluIHN5cy5tb2R1bGVzJy5mb3JtYXQobmFtZSkpCi0gICAgICAgIHJhaXNlIEltcG9ydEVycm9yKG1lc3NhZ2UsIG5hbWU9bmFtZSkKKyAgICAgICAgcmFpc2UgTW9kdWxlTm90Rm91bmRFcnJvcihtZXNzYWdlLCBuYW1lPW5hbWUpCiAgICAgX2xvY2tfdW5sb2NrX21vZHVsZShuYW1lKQogICAgIHJldHVybiBtb2R1bGUKIAorCiBkZWYgX2hhbmRsZV9mcm9tbGlzdChtb2R1bGUsIGZyb21saXN0LCBpbXBvcnRfKToKICAgICAiIiJGaWd1cmUgb3V0IHdoYXQgX19pbXBvcnRfXyBzaG91bGQgcmV0dXJuLgogCkBAIC0xMDE0LDEzICsxMDA3LDEyIEBACiAgICAgICAgICAgICAgICAgZnJvbV9uYW1lID0gJ3t9Lnt9Jy5mb3JtYXQobW9kdWxlLl9fbmFtZV9fLCB4KQogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgX2NhbGxfd2l0aF9mcmFtZXNfcmVtb3ZlZChpbXBvcnRfLCBmcm9tX25hbWUpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICAgICBleGNlcHQgTW9kdWxlTm90Rm91bmRFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICAgICAgICMgQmFja3dhcmRzLWNvbXBhdGliaWxpdHkgZGljdGF0ZXMgd2UgaWdub3JlIGZhaWxlZAogICAgICAgICAgICAgICAgICAgICAjIGltcG9ydHMgdHJpZ2dlcmVkIGJ5IGZyb21saXN0IGZvciBtb2R1bGVzIHRoYXQgZG9uJ3QKICAgICAgICAgICAgICAgICAgICAgIyBleGlzdC4KLSAgICAgICAgICAgICAgICAgICAgaWYgc3RyKGV4Yykuc3RhcnRzd2l0aChfRVJSX01TR19QUkVGSVgpOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXhjLm5hbWUgPT0gZnJvbV9uYW1lOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIGV4Yy5uYW1lID09IGZyb21fbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgcmV0dXJuIG1vZHVsZQogCkBAIC0xMDMzLDcgKzEwMjUsMTkgQEAKIAogICAgICIiIgogICAgIHBhY2thZ2UgPSBnbG9iYWxzLmdldCgnX19wYWNrYWdlX18nKQotICAgIGlmIHBhY2thZ2UgaXMgTm9uZToKKyAgICBzcGVjID0gZ2xvYmFscy5nZXQoJ19fc3BlY19fJykKKyAgICBpZiBwYWNrYWdlIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBzcGVjIGlzIG5vdCBOb25lIGFuZCBwYWNrYWdlICE9IHNwZWMucGFyZW50OgorICAgICAgICAgICAgX3dhcm5pbmdzLndhcm4oIl9fcGFja2FnZV9fICE9IF9fc3BlY19fLnBhcmVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmIih7cGFja2FnZSFyfSAhPSB7c3BlYy5wYXJlbnQhcn0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydFdhcm5pbmcsIHN0YWNrbGV2ZWw9MykKKyAgICAgICAgcmV0dXJuIHBhY2thZ2UKKyAgICBlbGlmIHNwZWMgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBzcGVjLnBhcmVudAorICAgIGVsc2U6CisgICAgICAgIF93YXJuaW5ncy53YXJuKCJjYW4ndCByZXNvbHZlIHBhY2thZ2UgZnJvbSBfX3NwZWNfXyBvciBfX3BhY2thZ2VfXywgIgorICAgICAgICAgICAgICAgICAgICAgICAiZmFsbGluZyBiYWNrIG9uIF9fbmFtZV9fIGFuZCBfX3BhdGhfXyIsCisgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydFdhcm5pbmcsIHN0YWNrbGV2ZWw9MykKICAgICAgICAgcGFja2FnZSA9IGdsb2JhbHNbJ19fbmFtZV9fJ10KICAgICAgICAgaWYgJ19fcGF0aF9fJyBub3QgaW4gZ2xvYmFsczoKICAgICAgICAgICAgIHBhY2thZ2UgPSBwYWNrYWdlLnJwYXJ0aXRpb24oJy4nKVswXQpkaWZmIC0tZ2l0IGEvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwX2V4dGVybmFsLnB5IGIvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwX2V4dGVybmFsLnB5CmluZGV4IGU1NGQ2OTEuLjQzNDBjM2IgMTAwNjQ0Ci0tLSBhL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcF9leHRlcm5hbC5weQorKysgYi9MaWIvaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHkKQEAgLTEzNywxMCArMTM3LDYgQEAKICMgYSAucHljIGZpbGUgaW4gdGV4dCBtb2RlIHRoZSBtYWdpYyBudW1iZXIgd2lsbCBiZSB3cm9uZzsgYWxzbywgdGhlCiAjIEFwcGxlIE1QVyBjb21waWxlciBzd2FwcyB0aGVpciB2YWx1ZXMsIGJvdGNoaW5nIHN0cmluZyBjb25zdGFudHMuCiAjCi0jIFRoZSBtYWdpYyBudW1iZXJzIG11c3QgYmUgc3BhY2VkIGFwYXJ0IGF0IGxlYXN0IDIgdmFsdWVzLCBhcyB0aGUKLSMgLVUgaW50ZXJwZXRlciBmbGFnIHdpbGwgY2F1c2UgTUFHSUMrMSBiZWluZyB1c2VkLiBUaGV5IGhhdmUgYmVlbgotIyBvZGQgbnVtYmVycyBmb3Igc29tZSB0aW1lIG5vdy4KLSMKICMgVGhlcmUgd2VyZSBhIHZhcmlldHkgb2Ygb2xkIHNjaGVtZXMgZm9yIHNldHRpbmcgdGhlIG1hZ2ljIG51bWJlci4KICMgVGhlIGN1cnJlbnQgd29ya2luZyBzY2hlbWUgaXMgdG8gaW5jcmVtZW50IHRoZSBwcmV2aW91cyB2YWx1ZSBieQogIyAxMC4KQEAgLTIzMSw2ICsyMjcsMTYgQEAKICMgICAgIFB5dGhvbiAzLjViMiAgMzM0MCAoZml4IGRpY3Rpb25hcnkgZGlzcGxheSBldmFsdWF0aW9uIG9yZGVyICMxMTIwNSkKICMgICAgIFB5dGhvbiAzLjViMiAgMzM1MCAoYWRkIEdFVF9ZSUVMRF9GUk9NX0lURVIgb3Bjb2RlICMyNDQwMCkKICMgICAgIFB5dGhvbiAzLjUuMiAgMzM1MSAoZml4IEJVSUxEX01BUF9VTlBBQ0tfV0lUSF9DQUxMIG9wY29kZSAjMjcyODYpCisjICAgICBQeXRob24gMy42YTAgIDMzNjAgKGFkZCBGT1JNQVRfVkFMVUUgb3Bjb2RlICMyNTQ4MworIyAgICAgUHl0aG9uIDMuNmEwICAzMzYxIChsaW5lbm8gZGVsdGEgb2YgY29kZS5jb19sbm90YWIgYmVjb21lcyBzaWduZWQpCisjICAgICBQeXRob24gMy42YTEgIDMzNzAgKDE2IGJpdCB3b3JkY29kZSkKKyMgICAgIFB5dGhvbiAzLjZhMSAgMzM3MSAoYWRkIEJVSUxEX0NPTlNUX0tFWV9NQVAgb3Bjb2RlICMyNzE0MCkKKyMgICAgIFB5dGhvbiAzLjZhMSAgMzM3MiAoTUFLRV9GVU5DVElPTiBzaW1wbGlmaWNhdGlvbiwgcmVtb3ZlIE1BS0VfQ0xPU1VSRQorIyAgICAgICAgICAgICAgICAgICAgICAgICAjMjcwOTUpCisjICAgICBQeXRob24gMy42YjEgIDMzNzMgKGFkZCBCVUlMRF9TVFJJTkcgb3Bjb2RlICMyNzA3OCkKKyMgICAgIFB5dGhvbiAzLjZiMSAgMzM3NSAoYWRkIFNFVFVQX0FOTk9UQVRJT05TIGFuZCBTVE9SRV9BTk5PVEFUSU9OIG9wY29kZXMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIzI3OTg1KQorIyAgICAgUHl0aG9uIDMuNmExICAzMzc2IChzaW1wbGlmeSBDQUxMX0ZVTkNUSU9OcyAmIEJVSUxEX01BUF9VTlBBQ0tfV0lUSF9DQUxMKQogIwogIyBNQUdJQyBtdXN0IGNoYW5nZSB3aGVuZXZlciB0aGUgYnl0ZWNvZGUgZW1pdHRlZCBieSB0aGUgY29tcGlsZXIgbWF5IG5vCiAjIGxvbmdlciBiZSB1bmRlcnN0b29kIGJ5IG9sZGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZXZhbCBsb29wICh1c3VhbGx5CkBAIC0yMzksNyArMjQ1LDcgQEAKICMgV2hlbmV2ZXIgTUFHSUNfTlVNQkVSIGlzIGNoYW5nZWQsIHRoZSByYW5nZXMgaW4gdGhlIG1hZ2ljX3ZhbHVlcyBhcnJheQogIyBpbiBQQy9sYXVuY2hlci5jIG11c3QgYWxzbyBiZSB1cGRhdGVkLgogCi1NQUdJQ19OVU1CRVIgPSAoMzM1MSkudG9fYnl0ZXMoMiwgJ2xpdHRsZScpICsgYidcclxuJworTUFHSUNfTlVNQkVSID0gKDMzNzYpLnRvX2J5dGVzKDIsICdsaXR0bGUnKSArIGInXHJcbicKIF9SQVdfTUFHSUNfTlVNQkVSID0gaW50LmZyb21fYnl0ZXMoTUFHSUNfTlVNQkVSLCAnbGl0dGxlJykgICMgRm9yIGltcG9ydC5jCiAKIF9QWUNBQ0hFID0gJ19fcHljYWNoZV9fJwpAQCAtMjc2LDYgKzI4Miw3IEBACiAgICAgICAgICAgICBtZXNzYWdlID0gJ2RlYnVnX292ZXJyaWRlIG9yIG9wdGltaXphdGlvbiBtdXN0IGJlIHNldCB0byBOb25lJwogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKG1lc3NhZ2UpCiAgICAgICAgIG9wdGltaXphdGlvbiA9ICcnIGlmIGRlYnVnX292ZXJyaWRlIGVsc2UgMQorICAgIHBhdGggPSBfb3MuZnNwYXRoKHBhdGgpCiAgICAgaGVhZCwgdGFpbCA9IF9wYXRoX3NwbGl0KHBhdGgpCiAgICAgYmFzZSwgc2VwLCByZXN0ID0gdGFpbC5ycGFydGl0aW9uKCcuJykKICAgICB0YWcgPSBzeXMuaW1wbGVtZW50YXRpb24uY2FjaGVfdGFnCkBAIC0zMDYsNiArMzEzLDcgQEAKICAgICAiIiIKICAgICBpZiBzeXMuaW1wbGVtZW50YXRpb24uY2FjaGVfdGFnIGlzIE5vbmU6CiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ3N5cy5pbXBsZW1lbnRhdGlvbi5jYWNoZV90YWcgaXMgTm9uZScpCisgICAgcGF0aCA9IF9vcy5mc3BhdGgocGF0aCkKICAgICBoZWFkLCBweWNhY2hlX2ZpbGVuYW1lID0gX3BhdGhfc3BsaXQocGF0aCkKICAgICBoZWFkLCBweWNhY2hlID0gX3BhdGhfc3BsaXQoaGVhZCkKICAgICBpZiBweWNhY2hlICE9IF9QWUNBQ0hFOgpAQCAtMzcxLDE0ICszNzksNiBAQAogICAgIHJldHVybiBtb2RlCiAKIAotZGVmIF92ZXJib3NlX21lc3NhZ2UobWVzc2FnZSwgKmFyZ3MsIHZlcmJvc2l0eT0xKToKLSAgICAiIiJQcmludCB0aGUgbWVzc2FnZSB0byBzdGRlcnIgaWYgLXYvUFlUSE9OVkVSQk9TRSBpcyB0dXJuZWQgb24uIiIiCi0gICAgaWYgc3lzLmZsYWdzLnZlcmJvc2UgPj0gdmVyYm9zaXR5OgotICAgICAgICBpZiBub3QgbWVzc2FnZS5zdGFydHN3aXRoKCgnIycsICdpbXBvcnQgJykpOgotICAgICAgICAgICAgbWVzc2FnZSA9ICcjICcgKyBtZXNzYWdlCi0gICAgICAgIHByaW50KG1lc3NhZ2UuZm9ybWF0KCphcmdzKSwgZmlsZT1zeXMuc3RkZXJyKQotCi0KIGRlZiBfY2hlY2tfbmFtZShtZXRob2QpOgogICAgICIiIkRlY29yYXRvciB0byB2ZXJpZnkgdGhhdCB0aGUgbW9kdWxlIGJlaW5nIHJlcXVlc3RlZCBtYXRjaGVzIHRoZSBvbmUgdGhlCiAgICAgbG9hZGVyIGNhbiBoYW5kbGUuCkBAIC00NDgsMTUgKzQ0OCwxNSBAQAogICAgIHJhd19zaXplID0gZGF0YVs4OjEyXQogICAgIGlmIG1hZ2ljICE9IE1BR0lDX05VTUJFUjoKICAgICAgICAgbWVzc2FnZSA9ICdiYWQgbWFnaWMgbnVtYmVyIGluIHshcn06IHshcn0nLmZvcm1hdChuYW1lLCBtYWdpYykKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IobWVzc2FnZSwgKipleGNfZGV0YWlscykKICAgICBlbGlmIGxlbihyYXdfdGltZXN0YW1wKSAhPSA0OgogICAgICAgICBtZXNzYWdlID0gJ3JlYWNoZWQgRU9GIHdoaWxlIHJlYWRpbmcgdGltZXN0YW1wIGluIHshcn0nLmZvcm1hdChuYW1lKQotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQogICAgICAgICByYWlzZSBFT0ZFcnJvcihtZXNzYWdlKQogICAgIGVsaWYgbGVuKHJhd19zaXplKSAhPSA0OgogICAgICAgICBtZXNzYWdlID0gJ3JlYWNoZWQgRU9GIHdoaWxlIHJlYWRpbmcgc2l6ZSBvZiBzb3VyY2UgaW4geyFyfScuZm9ybWF0KG5hbWUpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCiAgICAgICAgIHJhaXNlIEVPRkVycm9yKG1lc3NhZ2UpCiAgICAgaWYgc291cmNlX3N0YXRzIGlzIG5vdCBOb25lOgogICAgICAgICB0cnk6CkBAIC00NjYsNyArNDY2LDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGlmIF9yX2xvbmcocmF3X3RpbWVzdGFtcCkgIT0gc291cmNlX210aW1lOgogICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnYnl0ZWNvZGUgaXMgc3RhbGUgZm9yIHshcn0nLmZvcm1hdChuYW1lKQotICAgICAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKKyAgICAgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKICAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihtZXNzYWdlLCAqKmV4Y19kZXRhaWxzKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzb3VyY2Vfc2l6ZSA9IHNvdXJjZV9zdGF0c1snc2l6ZSddICYgMHhGRkZGRkZGRgpAQCAtNDgzLDcgKzQ4Myw3IEBACiAgICAgIiIiQ29tcGlsZSBieXRlY29kZSBhcyByZXR1cm5lZCBieSBfdmFsaWRhdGVfYnl0ZWNvZGVfaGVhZGVyKCkuIiIiCiAgICAgY29kZSA9IG1hcnNoYWwubG9hZHMoZGF0YSkKICAgICBpZiBpc2luc3RhbmNlKGNvZGUsIF9jb2RlX3R5cGUpOgotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdjb2RlIG9iamVjdCBmcm9tIHshcn0nLCBieXRlY29kZV9wYXRoKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2NvZGUgb2JqZWN0IGZyb20geyFyfScsIGJ5dGVjb2RlX3BhdGgpCiAgICAgICAgIGlmIHNvdXJjZV9wYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgX2ltcC5fZml4X2NvX2ZpbGVuYW1lKGNvZGUsIHNvdXJjZV9wYXRoKQogICAgICAgICByZXR1cm4gY29kZQpAQCAtNTQxLDYgKzU0MSw4IEBACiAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBsb2FkZXIuZ2V0X2ZpbGVuYW1lKG5hbWUpCiAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGxvY2F0aW9uID0gX29zLmZzcGF0aChsb2NhdGlvbikKIAogICAgICMgSWYgdGhlIGxvY2F0aW9uIGlzIG9uIHRoZSBmaWxlc3lzdGVtLCBidXQgZG9lc24ndCBhY3R1YWxseSBleGlzdCwKICAgICAjIHdlIGNvdWxkIHJldHVybiBOb25lIGhlcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgbG9jYXRpb24gaXMgbm90CkBAIC02MTAsNyArNjEyLDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJlZ2lzdHJ5X2tleSA9IGNscy5SRUdJU1RSWV9LRVkKICAgICAgICAga2V5ID0gcmVnaXN0cnlfa2V5LmZvcm1hdChmdWxsbmFtZT1mdWxsbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNfdmVyc2lvbj1zeXMudmVyc2lvbls6M10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzX3ZlcnNpb249JyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICB3aXRoIGNscy5fb3Blbl9yZWdpc3RyeShrZXkpIGFzIGhrZXk6CiAgICAgICAgICAgICAgICAgZmlsZXBhdGggPSBfd2lucmVnLlF1ZXJ5VmFsdWUoaGtleSwgJycpCkBAIC02NzMsNiArNjc1LDcgQEAKICAgICAgICAgX2Jvb3RzdHJhcC5fY2FsbF93aXRoX2ZyYW1lc19yZW1vdmVkKGV4ZWMsIGNvZGUsIG1vZHVsZS5fX2RpY3RfXykKIAogICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgICIiIlRoaXMgbW9kdWxlIGlzIGRlcHJlY2F0ZWQuIiIiCiAgICAgICAgIHJldHVybiBfYm9vdHN0cmFwLl9sb2FkX21vZHVsZV9zaGltKHNlbGYsIGZ1bGxuYW1lKQogCiAKQEAgLTc2NiwyMSArNzY5LDIxIEBACiAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEVPRkVycm9yKToKICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3t9IG1hdGNoZXMge30nLCBieXRlY29kZV9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd7fSBtYXRjaGVzIHt9JywgYnl0ZWNvZGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29tcGlsZV9ieXRlY29kZShieXRlc19kYXRhLCBuYW1lPWZ1bGxuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVjb2RlX3BhdGg9Ynl0ZWNvZGVfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfcGF0aD1zb3VyY2VfcGF0aCkKICAgICAgICAgc291cmNlX2J5dGVzID0gc2VsZi5nZXRfZGF0YShzb3VyY2VfcGF0aCkKICAgICAgICAgY29kZV9vYmplY3QgPSBzZWxmLnNvdXJjZV90b19jb2RlKHNvdXJjZV9ieXRlcywgc291cmNlX3BhdGgpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2NvZGUgb2JqZWN0IGZyb20ge30nLCBzb3VyY2VfcGF0aCkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjb2RlIG9iamVjdCBmcm9tIHt9Jywgc291cmNlX3BhdGgpCiAgICAgICAgIGlmIChub3Qgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgYW5kIGJ5dGVjb2RlX3BhdGggaXMgbm90IE5vbmUgYW5kCiAgICAgICAgICAgICAgICAgc291cmNlX210aW1lIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgIGRhdGEgPSBfY29kZV90b19ieXRlY29kZShjb2RlX29iamVjdCwgc291cmNlX210aW1lLAogICAgICAgICAgICAgICAgICAgICBsZW4oc291cmNlX2J5dGVzKSkKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBzZWxmLl9jYWNoZV9ieXRlY29kZShzb3VyY2VfcGF0aCwgYnl0ZWNvZGVfcGF0aCwgZGF0YSkKLSAgICAgICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd3cm90ZSB7IXJ9JywgYnl0ZWNvZGVfcGF0aCkKKyAgICAgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3dyb3RlIHshcn0nLCBieXRlY29kZV9wYXRoKQogICAgICAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICByZXR1cm4gY29kZV9vYmplY3QKQEAgLTg2MCwxNCArODYzLDE2IEBACiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICAgIyBDb3VsZCBiZSBhIHBlcm1pc3Npb24gZXJyb3IsIHJlYWQtb25seSBmaWxlc3lzdGVtOiBqdXN0IGZvcmdldAogICAgICAgICAgICAgICAgICMgYWJvdXQgd3JpdGluZyB0aGUgZGF0YS4KLSAgICAgICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdjb3VsZCBub3QgY3JlYXRlIHshcn06IHshcn0nLCBwYXJlbnQsIGV4YykKKyAgICAgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2NvdWxkIG5vdCBjcmVhdGUgeyFyfTogeyFyfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwgZXhjKQogICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBfd3JpdGVfYXRvbWljKHBhdGgsIGRhdGEsIF9tb2RlKQotICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY3JlYXRlZCB7IXJ9JywgcGF0aCkKKyAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnY3JlYXRlZCB7IXJ9JywgcGF0aCkKICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAgIyBTYW1lIGFzIGFib3ZlOiBqdXN0IGRvbid0IHdyaXRlIHRoZSBieXRlY29kZS4KLSAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2NvdWxkIG5vdCBjcmVhdGUgeyFyfTogeyFyfScsIHBhdGgsIGV4YykKKyAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnY291bGQgbm90IGNyZWF0ZSB7IXJ9OiB7IXJ9JywgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMpCiAKIAogY2xhc3MgU291cmNlbGVzc0ZpbGVMb2FkZXIoRmlsZUxvYWRlciwgX0xvYWRlckJhc2ljcyk6CkBAIC05MTIsMTQgKzkxNywxNCBAQAogICAgICAgICAiIiJDcmVhdGUgYW4gdW5pdGlhbGl6ZWQgZXh0ZW5zaW9uIG1vZHVsZSIiIgogICAgICAgICBtb2R1bGUgPSBfYm9vdHN0cmFwLl9jYWxsX3dpdGhfZnJhbWVzX3JlbW92ZWQoCiAgICAgICAgICAgICBfaW1wLmNyZWF0ZV9keW5hbWljLCBzcGVjKQotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdleHRlbnNpb24gbW9kdWxlIHshcn0gbG9hZGVkIGZyb20geyFyfScsCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnZXh0ZW5zaW9uIG1vZHVsZSB7IXJ9IGxvYWRlZCBmcm9tIHshcn0nLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMubmFtZSwgc2VsZi5wYXRoKQogICAgICAgICByZXR1cm4gbW9kdWxlCiAKICAgICBkZWYgZXhlY19tb2R1bGUoc2VsZiwgbW9kdWxlKToKICAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBleHRlbnNpb24gbW9kdWxlIiIiCiAgICAgICAgIF9ib290c3RyYXAuX2NhbGxfd2l0aF9mcmFtZXNfcmVtb3ZlZChfaW1wLmV4ZWNfZHluYW1pYywgbW9kdWxlKQotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdleHRlbnNpb24gbW9kdWxlIHshcn0gZXhlY3V0ZWQgZnJvbSB7IXJ9JywKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdleHRlbnNpb24gbW9kdWxlIHshcn0gZXhlY3V0ZWQgZnJvbSB7IXJ9JywKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYucGF0aCkKIAogICAgIGRlZiBpc19wYWNrYWdlKHNlbGYsIGZ1bGxuYW1lKToKQEAgLTk4NSw2ICs5OTAsOSBAQAogICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fcmVjYWxjdWxhdGUoKSkKIAorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBpbmRleCwgcGF0aCk6CisgICAgICAgIHNlbGYuX3BhdGhbaW5kZXhdID0gcGF0aAorCiAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgIHJldHVybiBsZW4oc2VsZi5fcmVjYWxjdWxhdGUoKSkKIApAQCAtMTAzNCw3ICsxMDQyLDggQEAKIAogICAgICAgICAiIiIKICAgICAgICAgIyBUaGUgaW1wb3J0IHN5c3RlbSBuZXZlciBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnbmFtZXNwYWNlIG1vZHVsZSBsb2FkZWQgd2l0aCBwYXRoIHshcn0nLCBzZWxmLl9wYXRoKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ25hbWVzcGFjZSBtb2R1bGUgbG9hZGVkIHdpdGggcGF0aCB7IXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhdGgpCiAgICAgICAgIHJldHVybiBfYm9vdHN0cmFwLl9sb2FkX21vZHVsZV9zaGltKHNlbGYsIGZ1bGxuYW1lKQogCiAKQEAgLTEwNTQsMTEgKzEwNjMsNyBAQAogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIF9wYXRoX2hvb2tzKGNscywgcGF0aCk6Ci0gICAgICAgICIiIlNlYXJjaCBzZXF1ZW5jZSBvZiBob29rcyBmb3IgYSBmaW5kZXIgZm9yICdwYXRoJy4KLQotICAgICAgICBJZiAnaG9va3MnIGlzIGZhbHNlIHRoZW4gdXNlIHN5cy5wYXRoX2hvb2tzLgotCi0gICAgICAgICIiIgorICAgICAgICAiIiJTZWFyY2ggc3lzLnBhdGhfaG9va3MgZm9yIGEgZmluZGVyIGZvciAncGF0aCcuIiIiCiAgICAgICAgIGlmIHN5cy5wYXRoX2hvb2tzIGlzIG5vdCBOb25lIGFuZCBub3Qgc3lzLnBhdGhfaG9va3M6CiAgICAgICAgICAgICBfd2FybmluZ3Mud2Fybignc3lzLnBhdGhfaG9va3MgaXMgZW1wdHknLCBJbXBvcnRXYXJuaW5nKQogICAgICAgICBmb3IgaG9vayBpbiBzeXMucGF0aF9ob29rczoKQEAgLTExNDAsOCArMTE0NSwxMCBAQAogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIGZpbmRfc3BlYyhjbHMsIGZ1bGxuYW1lLCBwYXRoPU5vbmUsIHRhcmdldD1Ob25lKToKLSAgICAgICAgIiIiZmluZCB0aGUgbW9kdWxlIG9uIHN5cy5wYXRoIG9yICdwYXRoJyBiYXNlZCBvbiBzeXMucGF0aF9ob29rcyBhbmQKLSAgICAgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuIiIiCisgICAgICAgICIiIlRyeSB0byBmaW5kIGEgc3BlYyBmb3IgJ2Z1bGxuYW1lJyBvbiBzeXMucGF0aCBvciAncGF0aCcuCisKKyAgICAgICAgVGhlIHNlYXJjaCBpcyBiYXNlZCBvbiBzeXMucGF0aF9ob29rcyBhbmQgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuCisgICAgICAgICIiIgogICAgICAgICBpZiBwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKICAgICAgICAgc3BlYyA9IGNscy5fZ2V0X3NwZWMoZnVsbG5hbWUsIHBhdGgsIHRhcmdldCkKQEAgLTEyMjEsOCArMTIyOCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnM9c21zbCkKIAogICAgIGRlZiBmaW5kX3NwZWMoc2VsZiwgZnVsbG5hbWUsIHRhcmdldD1Ob25lKToKLSAgICAgICAgIiIiVHJ5IHRvIGZpbmQgYSBzcGVjIGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gIFJldHVybnMgdGhlCi0gICAgICAgIG1hdGNoaW5nIHNwZWMsIG9yIE5vbmUgaWYgbm90IGZvdW5kLiIiIgorICAgICAgICAiIiJUcnkgdG8gZmluZCBhIHNwZWMgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLgorCisgICAgICAgIFJldHVybnMgdGhlIG1hdGNoaW5nIHNwZWMsIG9yIE5vbmUgaWYgbm90IGZvdW5kLgorICAgICAgICAiIiIKICAgICAgICAgaXNfbmFtZXNwYWNlID0gRmFsc2UKICAgICAgICAgdGFpbF9tb2R1bGUgPSBmdWxsbmFtZS5ycGFydGl0aW9uKCcuJylbMl0KICAgICAgICAgdHJ5OgpAQCAtMTI1NCwxMiArMTI2MywxMyBAQAogICAgICAgICAjIENoZWNrIGZvciBhIGZpbGUgdy8gYSBwcm9wZXIgc3VmZml4IGV4aXN0cy4KICAgICAgICAgZm9yIHN1ZmZpeCwgbG9hZGVyX2NsYXNzIGluIHNlbGYuX2xvYWRlcnM6CiAgICAgICAgICAgICBmdWxsX3BhdGggPSBfcGF0aF9qb2luKHNlbGYucGF0aCwgdGFpbF9tb2R1bGUgKyBzdWZmaXgpCi0gICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd0cnlpbmcge30nLmZvcm1hdChmdWxsX3BhdGgpLCB2ZXJib3NpdHk9MikKKyAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgndHJ5aW5nIHt9JywgZnVsbF9wYXRoLCB2ZXJib3NpdHk9MikKICAgICAgICAgICAgIGlmIGNhY2hlX21vZHVsZSArIHN1ZmZpeCBpbiBjYWNoZToKICAgICAgICAgICAgICAgICBpZiBfcGF0aF9pc2ZpbGUoZnVsbF9wYXRoKToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9zcGVjKGxvYWRlcl9jbGFzcywgZnVsbG5hbWUsIGZ1bGxfcGF0aCwgTm9uZSwgdGFyZ2V0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3NwZWMobG9hZGVyX2NsYXNzLCBmdWxsbmFtZSwgZnVsbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgdGFyZ2V0KQogICAgICAgICBpZiBpc19uYW1lc3BhY2U6Ci0gICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdwb3NzaWJsZSBuYW1lc3BhY2UgZm9yIHt9Jy5mb3JtYXQoYmFzZV9wYXRoKSkKKyAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgncG9zc2libGUgbmFtZXNwYWNlIGZvciB7fScsIGJhc2VfcGF0aCkKICAgICAgICAgICAgIHNwZWMgPSBfYm9vdHN0cmFwLk1vZHVsZVNwZWMoZnVsbG5hbWUsIE5vbmUpCiAgICAgICAgICAgICBzcGVjLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zID0gW2Jhc2VfcGF0aF0KICAgICAgICAgICAgIHJldHVybiBzcGVjCmRpZmYgLS1naXQgYS9MaWIvaW1wb3J0bGliL3V0aWwucHkgYi9MaWIvaW1wb3J0bGliL3V0aWwucHkKaW5kZXggZTFmYTA3YS4uNmJkZjBkNCAxMDA2NDQKLS0tIGEvTGliL2ltcG9ydGxpYi91dGlsLnB5CisrKyBiL0xpYi9pbXBvcnRsaWIvdXRpbC5weQpAQCAtMjIsOCArMjIsOCBAQAogICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJy4nKToKICAgICAgICAgcmV0dXJuIG5hbWUKICAgICBlbGlmIG5vdCBwYWNrYWdlOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd7IXJ9IGlzIG5vdCBhIHJlbGF0aXZlIG5hbWUgJwotICAgICAgICAgICAgICAgICAgICAgICAgICcobm8gbGVhZGluZyBkb3QpJy5mb3JtYXQobmFtZSkpCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZidubyBwYWNrYWdlIHNwZWNpZmllZCBmb3Ige3JlcHIobmFtZSl9ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnKHJlcXVpcmVkIGZvciByZWxhdGl2ZSBtb2R1bGUgbmFtZXMpJykKICAgICBsZXZlbCA9IDAKICAgICBmb3IgY2hhcmFjdGVyIGluIG5hbWU6CiAgICAgICAgIGlmIGNoYXJhY3RlciAhPSAnLic6CkBAIC0yMDQsMTEgKzIwNCw2IEBACiAgICAgcmV0dXJuIG1vZHVsZV9mb3JfbG9hZGVyX3dyYXBwZXIKIAogCi1jbGFzcyBfTW9kdWxlKHR5cGVzLk1vZHVsZVR5cGUpOgotCi0gICAgIiIiQSBzdWJjbGFzcyBvZiB0aGUgbW9kdWxlIHR5cGUgdG8gYWxsb3cgX19jbGFzc19fIG1hbmlwdWxhdGlvbi4iIiIKLQotCiBjbGFzcyBfTGF6eU1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlKToKIAogICAgICIiIkEgc3ViY2xhc3Mgb2YgdGhlIG1vZHVsZSB0eXBlIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgdXBvbiBhdHRyaWJ1dGUgYWNjZXNzLiIiIgpAQCAtMjE4LDEzICsyMTMsMTQgQEAKICAgICAgICAgIyBBbGwgbW9kdWxlIG1ldGFkYXRhIG11c3QgYmUgZ2FybmVyZWQgZnJvbSBfX3NwZWNfXyBpbiBvcmRlciB0byBhdm9pZAogICAgICAgICAjIHVzaW5nIG11dGF0ZWQgdmFsdWVzLgogICAgICAgICAjIFN0b3AgdHJpZ2dlcmluZyB0aGlzIG1ldGhvZC4KLSAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBfTW9kdWxlCisgICAgICAgIHNlbGYuX19jbGFzc19fID0gdHlwZXMuTW9kdWxlVHlwZQogICAgICAgICAjIEdldCB0aGUgb3JpZ2luYWwgbmFtZSB0byBtYWtlIHN1cmUgbm8gb2JqZWN0IHN1YnN0aXR1dGlvbiBvY2N1cnJlZAogICAgICAgICAjIGluIHN5cy5tb2R1bGVzLgogICAgICAgICBvcmlnaW5hbF9uYW1lID0gc2VsZi5fX3NwZWNfXy5uYW1lCiAgICAgICAgICMgRmlndXJlIG91dCBleGFjdGx5IHdoYXQgYXR0cmlidXRlcyB3ZXJlIG11dGF0ZWQgYmV0d2VlbiB0aGUgY3JlYXRpb24KICAgICAgICAgIyBvZiB0aGUgbW9kdWxlIGFuZCBub3cuCi0gICAgICAgIGF0dHJzX3RoZW4gPSBzZWxmLl9fc3BlY19fLmxvYWRlcl9zdGF0ZQorICAgICAgICBhdHRyc190aGVuID0gc2VsZi5fX3NwZWNfXy5sb2FkZXJfc3RhdGVbJ19fZGljdF9fJ10KKyAgICAgICAgb3JpZ2luYWxfdHlwZSA9IHNlbGYuX19zcGVjX18ubG9hZGVyX3N0YXRlWydfX2NsYXNzX18nXQogICAgICAgICBhdHRyc19ub3cgPSBzZWxmLl9fZGljdF9fCiAgICAgICAgIGF0dHJzX3VwZGF0ZWQgPSB7fQogICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBhdHRyc19ub3cuaXRlbXMoKToKQEAgLTIzOSw5ICsyMzUsOSBAQAogICAgICAgICAjIG9iamVjdCB3YXMgcHV0IGludG8gc3lzLm1vZHVsZXMuCiAgICAgICAgIGlmIG9yaWdpbmFsX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICBpZiBpZChzZWxmKSAhPSBpZChzeXMubW9kdWxlc1tvcmlnaW5hbF9uYW1lXSk6Ci0gICAgICAgICAgICAgICAgbXNnID0gKCdtb2R1bGUgb2JqZWN0IGZvciB7IXJ9IHN1YnN0aXR1dGVkIGluIHN5cy5tb2R1bGVzICcKLSAgICAgICAgICAgICAgICAgICAgICAgJ2R1cmluZyBhIGxhenkgbG9hZCcpCi0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cuZm9ybWF0KG9yaWdpbmFsX25hbWUpKQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJtb2R1bGUgb2JqZWN0IGZvciB7b3JpZ2luYWxfbmFtZSFyfSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1YnN0aXR1dGVkIGluIHN5cy5tb2R1bGVzIGR1cmluZyBhIGxhenkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkIikKICAgICAgICAgIyBVcGRhdGUgYWZ0ZXIgbG9hZGluZyBzaW5jZSB0aGF0J3Mgd2hhdCB3b3VsZCBoYXBwZW4gaW4gYW4gZWFnZXIKICAgICAgICAgIyBsb2FkaW5nIHNpdHVhdGlvbi4KICAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoYXR0cnNfdXBkYXRlZCkKQEAgLTI3NSw4ICsyNzEsNyBAQAogICAgICAgICBzZWxmLmxvYWRlciA9IGxvYWRlcgogCiAgICAgZGVmIGNyZWF0ZV9tb2R1bGUoc2VsZiwgc3BlYyk6Ci0gICAgICAgICIiIkNyZWF0ZSBhIG1vZHVsZSB3aGljaCBjYW4gaGF2ZSBpdHMgX19jbGFzc19fIG1hbmlwdWxhdGVkLiIiIgotICAgICAgICByZXR1cm4gX01vZHVsZShzcGVjLm5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLmxvYWRlci5jcmVhdGVfbW9kdWxlKHNwZWMpCiAKICAgICBkZWYgZXhlY19tb2R1bGUoc2VsZiwgbW9kdWxlKToKICAgICAgICAgIiIiTWFrZSB0aGUgbW9kdWxlIGxvYWQgbGF6aWx5LiIiIgpAQCAtMjg2LDUgKzI4MSw4IEBACiAgICAgICAgICMgb24gYW4gb2JqZWN0IHdvdWxkIGhhdmUgdHJpZ2dlcmVkIHRoZSBsb2FkLAogICAgICAgICAjIGUuZy4gYGBtb2R1bGUuX19zcGVjX18ubG9hZGVyID0gTm9uZWBgIHdvdWxkIHRyaWdnZXIgYSBsb2FkIGZyb20KICAgICAgICAgIyB0cnlpbmcgdG8gYWNjZXNzIG1vZHVsZS5fX3NwZWNfXy4KLSAgICAgICAgbW9kdWxlLl9fc3BlY19fLmxvYWRlcl9zdGF0ZSA9IG1vZHVsZS5fX2RpY3RfXy5jb3B5KCkKKyAgICAgICAgbG9hZGVyX3N0YXRlID0ge30KKyAgICAgICAgbG9hZGVyX3N0YXRlWydfX2RpY3RfXyddID0gbW9kdWxlLl9fZGljdF9fLmNvcHkoKQorICAgICAgICBsb2FkZXJfc3RhdGVbJ19fY2xhc3NfXyddID0gbW9kdWxlLl9fY2xhc3NfXworICAgICAgICBtb2R1bGUuX19zcGVjX18ubG9hZGVyX3N0YXRlID0gbG9hZGVyX3N0YXRlCiAgICAgICAgIG1vZHVsZS5fX2NsYXNzX18gPSBfTGF6eU1vZHVsZQpkaWZmIC0tZ2l0IGEvTGliL2luc3BlY3QucHkgYi9MaWIvaW5zcGVjdC5weQppbmRleCBjYTFkNTUxLi4yMzgwMDk1IDEwMDY0NAotLS0gYS9MaWIvaW5zcGVjdC5weQorKysgYi9MaWIvaW5zcGVjdC5weQpAQCAtMTYsNyArMTYsNyBAQAogICAgIGdldG1vZHVsZSgpIC0gZGV0ZXJtaW5lIHRoZSBtb2R1bGUgdGhhdCBhbiBvYmplY3QgY2FtZSBmcm9tCiAgICAgZ2V0Y2xhc3N0cmVlKCkgLSBhcnJhbmdlIGNsYXNzZXMgc28gYXMgdG8gcmVwcmVzZW50IHRoZWlyIGhpZXJhcmNoeQogCi0gICAgZ2V0YXJnc3BlYygpLCBnZXRhcmd2YWx1ZXMoKSwgZ2V0Y2FsbGFyZ3MoKSAtIGdldCBpbmZvIGFib3V0IGZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGdldGFyZ3ZhbHVlcygpLCBnZXRjYWxsYXJncygpIC0gZ2V0IGluZm8gYWJvdXQgZnVuY3Rpb24gYXJndW1lbnRzCiAgICAgZ2V0ZnVsbGFyZ3NwZWMoKSAtIHNhbWUsIHdpdGggc3VwcG9ydCBmb3IgUHl0aG9uIDMgZmVhdHVyZXMKICAgICBmb3JtYXRhcmdzcGVjKCksIGZvcm1hdGFyZ3ZhbHVlcygpIC0gZm9ybWF0IGFuIGFyZ3VtZW50IHNwZWMKICAgICBnZXRvdXRlcmZyYW1lcygpLCBnZXRpbm5lcmZyYW1lcygpIC0gZ2V0IGluZm8gYWJvdXQgZnJhbWVzCkBAIC0xODUsNiArMTg1LDEzIEBACiAgICAgcmV0dXJuIGJvb2woKGlzZnVuY3Rpb24ob2JqZWN0KSBvciBpc21ldGhvZChvYmplY3QpKSBhbmQKICAgICAgICAgICAgICAgICBvYmplY3QuX19jb2RlX18uY29fZmxhZ3MgJiBDT19DT1JPVVRJTkUpCiAKK2RlZiBpc2FzeW5jZ2VuZnVuY3Rpb24ob2JqZWN0KToKKyAgICByZXR1cm4gYm9vbCgoaXNmdW5jdGlvbihvYmplY3QpIG9yIGlzbWV0aG9kKG9iamVjdCkpIGFuZAorICAgICAgICAgICAgICAgIG9iamVjdC5fX2NvZGVfXy5jb19mbGFncyAmIENPX0FTWU5DX0dFTkVSQVRPUikKKworZGVmIGlzYXN5bmNnZW4ob2JqZWN0KToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvYmplY3QsIHR5cGVzLkFzeW5jR2VuZXJhdG9yVHlwZSkKKwogZGVmIGlzZ2VuZXJhdG9yKG9iamVjdCk6CiAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGdlbmVyYXRvci4KIApAQCAtNjIzLDIzICs2MzAsNiBAQAogICAgIHJhaXNlIFR5cGVFcnJvcigneyFyfSBpcyBub3QgYSBtb2R1bGUsIGNsYXNzLCBtZXRob2QsICcKICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uLCB0cmFjZWJhY2ssIGZyYW1lLCBvciBjb2RlIG9iamVjdCcuZm9ybWF0KG9iamVjdCkpCiAKLU1vZHVsZUluZm8gPSBuYW1lZHR1cGxlKCdNb2R1bGVJbmZvJywgJ25hbWUgc3VmZml4IG1vZGUgbW9kdWxlX3R5cGUnKQotCi1kZWYgZ2V0bW9kdWxlaW5mbyhwYXRoKToKLSAgICAiIiJHZXQgdGhlIG1vZHVsZSBuYW1lLCBzdWZmaXgsIG1vZGUsIGFuZCBtb2R1bGUgdHlwZSBmb3IgYSBnaXZlbiBmaWxlLiIiIgotICAgIHdhcm5pbmdzLndhcm4oJ2luc3BlY3QuZ2V0bW9kdWxlaW5mbygpIGlzIGRlcHJlY2F0ZWQnLCBEZXByZWNhdGlvbldhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAyKQotICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICBpbXBvcnQgaW1wCi0gICAgZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCi0gICAgc3VmZml4ZXMgPSBbKC1sZW4oc3VmZml4KSwgc3VmZml4LCBtb2RlLCBtdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgZm9yIHN1ZmZpeCwgbW9kZSwgbXR5cGUgaW4gaW1wLmdldF9zdWZmaXhlcygpXQotICAgIHN1ZmZpeGVzLnNvcnQoKSAjIHRyeSBsb25nZXN0IHN1ZmZpeGVzIGZpcnN0LCBpbiBjYXNlIHRoZXkgb3ZlcmxhcAotICAgIGZvciBuZWdsZW4sIHN1ZmZpeCwgbW9kZSwgbXR5cGUgaW4gc3VmZml4ZXM6Ci0gICAgICAgIGlmIGZpbGVuYW1lW25lZ2xlbjpdID09IHN1ZmZpeDoKLSAgICAgICAgICAgIHJldHVybiBNb2R1bGVJbmZvKGZpbGVuYW1lWzpuZWdsZW5dLCBzdWZmaXgsIG1vZGUsIG10eXBlKQotCiBkZWYgZ2V0bW9kdWxlbmFtZShwYXRoKToKICAgICAiIiJSZXR1cm4gdGhlIG1vZHVsZSBuYW1lIGZvciBhIGdpdmVuIGZpbGUsIG9yIE5vbmUuIiIiCiAgICAgZm5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCkBAIC0xMDYwLDggKzEwNTAsNiBAQAogICAgICdrd29ubHlkZWZhdWx0cycgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgbmFtZXMgZnJvbSBrd29ubHlhcmdzIHRvIGRlZmF1bHRzLgogICAgICdhbm5vdGF0aW9ucycgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgYXJndW1lbnQgbmFtZXMgdG8gYW5ub3RhdGlvbnMuCiAKLSAgICBUaGUgZmlyc3QgZm91ciBpdGVtcyBpbiB0aGUgdHVwbGUgY29ycmVzcG9uZCB0byBnZXRhcmdzcGVjKCkuCi0KICAgICBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQsIHVzZSBpbnNwZWN0LnNpZ25hdHVyZSgpIGluc3RlYWQuCiAgICAgIiIiCiAKQEAgLTExNzIsOCArMTE2MCw3IEBACiAgICAgICAgICAgICAgICAgICBmb3JtYXR2YWx1ZT1sYW1iZGEgdmFsdWU6ICc9JyArIHJlcHIodmFsdWUpLAogICAgICAgICAgICAgICAgICAgZm9ybWF0cmV0dXJucz1sYW1iZGEgdGV4dDogJyAtPiAnICsgdGV4dCwKICAgICAgICAgICAgICAgICAgIGZvcm1hdGFubm90YXRpb249Zm9ybWF0YW5ub3RhdGlvbik6Ci0gICAgIiIiRm9ybWF0IGFuIGFyZ3VtZW50IHNwZWMgZnJvbSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGdldGFyZ3NwZWMKLSAgICBvciBnZXRmdWxsYXJnc3BlYy4KKyAgICAiIiJGb3JtYXQgYW4gYXJndW1lbnQgc3BlYyBmcm9tIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgZ2V0ZnVsbGFyZ3NwZWMuCiAKICAgICBUaGUgZmlyc3Qgc2V2ZW4gYXJndW1lbnRzIGFyZSAoYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzLAogICAgIGt3b25seWFyZ3MsIGt3b25seWRlZmF1bHRzLCBhbm5vdGF0aW9ucykuICBUaGUgb3RoZXIgZml2ZSBhcmd1bWVudHMKQEAgLTI0MTUsNiArMjQwMiwyMCBAQAogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuYW1lLCBzdHIpOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJuYW1lIG11c3QgYmUgYSBzdHIsIG5vdCBhIHshcn0iLmZvcm1hdChuYW1lKSkKIAorICAgICAgICBpZiBuYW1lWzBdID09ICcuJyBhbmQgbmFtZVsxOl0uaXNkaWdpdCgpOgorICAgICAgICAgICAgIyBUaGVzZSBhcmUgaW1wbGljaXQgYXJndW1lbnRzIGdlbmVyYXRlZCBieSBjb21wcmVoZW5zaW9ucy4gSW4KKyAgICAgICAgICAgICMgb3JkZXIgdG8gcHJvdmlkZSBhIGZyaWVuZGxpZXIgaW50ZXJmYWNlIHRvIHVzZXJzLCB3ZSByZWNhc3QKKyAgICAgICAgICAgICMgdGhlaXIgbmFtZSBhcyAiaW1wbGljaXROIiBhbmQgdHJlYXQgdGhlbSBhcyBwb3NpdGlvbmFsLW9ubHkuCisgICAgICAgICAgICAjIFNlZSBpc3N1ZSAxOTYxMS4KKyAgICAgICAgICAgIGlmIGtpbmQgIT0gX1BPU0lUSU9OQUxfT1JfS0VZV09SRDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnaW1wbGljaXQgYXJndW1lbnRzIG11c3QgYmUgcGFzc2VkIGluIGFzIHt9Jy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBfUE9TSVRJT05BTF9PUl9LRVlXT1JECisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLl9raW5kID0gX1BPU0lUSU9OQUxfT05MWQorICAgICAgICAgICAgbmFtZSA9ICdpbXBsaWNpdHt9Jy5mb3JtYXQobmFtZVsxOl0pCisKICAgICAgICAgaWYgbm90IG5hbWUuaXNpZGVudGlmaWVyKCk6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd7IXJ9IGlzIG5vdCBhIHZhbGlkIHBhcmFtZXRlciBuYW1lJy5mb3JtYXQobmFtZSkpCiAKZGlmZiAtLWdpdCBhL0xpYi9pby5weSBiL0xpYi9pby5weQppbmRleCBlMDNkYjk3Li45NjhlZTUwIDEwMDY0NAotLS0gYS9MaWIvaW8ucHkKKysrIGIvTGliL2lvLnB5CkBAIC05MCwzICs5MCwxMCBAQAogZm9yIGtsYXNzIGluIChTdHJpbmdJTywgVGV4dElPV3JhcHBlcik6CiAgICAgVGV4dElPQmFzZS5yZWdpc3RlcihrbGFzcykKIGRlbCBrbGFzcworCit0cnk6CisgICAgZnJvbSBfaW8gaW1wb3J0IF9XaW5kb3dzQ29uc29sZUlPCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBSYXdJT0Jhc2UucmVnaXN0ZXIoX1dpbmRvd3NDb25zb2xlSU8pCmRpZmYgLS1naXQgYS9MaWIvaXBhZGRyZXNzLnB5IGIvTGliL2lwYWRkcmVzcy5weQppbmRleCAxZjkwMDU4Li4yMGYzM2NiIDEwMDY0NAotLS0gYS9MaWIvaXBhZGRyZXNzLnB5CisrKyBiL0xpYi9pcGFkZHJlc3MucHkKQEAgLTYzNiwxMiArNjM2LDEyIEBACiAgICAgICAgIGJyb2FkY2FzdCA9IGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKQogICAgICAgICBpZiBuID49IDA6CiAgICAgICAgICAgICBpZiBuZXR3b3JrICsgbiA+IGJyb2FkY2FzdDoKLSAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcignYWRkcmVzcyBvdXQgb2YgcmFuZ2UnKQogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZHJlc3NfY2xhc3MobmV0d29yayArIG4pCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBuICs9IDEKICAgICAgICAgICAgIGlmIGJyb2FkY2FzdCArIG4gPCBuZXR3b3JrOgotICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yKCdhZGRyZXNzIG91dCBvZiByYW5nZScpCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkcmVzc19jbGFzcyhicm9hZGNhc3QgKyBuKQogCiAgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CmRpZmYgLS1naXQgYS9MaWIvanNvbi9fX2luaXRfXy5weSBiL0xpYi9qc29uL19faW5pdF9fLnB5CmluZGV4IGY3MmIwNTguLmYyYzBkMjMgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL19faW5pdF9fLnB5CisrKyBiL0xpYi9qc29uL19faW5pdF9fLnB5CkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICBkZWZhdWx0PU5vbmUsCiApCiAKLWRlZiBkdW1wKG9iaiwgZnAsIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwKK2RlZiBkdW1wKG9iaiwgZnAsICosIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwKICAgICAgICAgYWxsb3dfbmFuPVRydWUsIGNscz1Ob25lLCBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLAogICAgICAgICBkZWZhdWx0PU5vbmUsIHNvcnRfa2V5cz1GYWxzZSwgKiprdyk6CiAgICAgIiIiU2VyaWFsaXplIGBgb2JqYGAgYXMgYSBKU09OIGZvcm1hdHRlZCBzdHJlYW0gdG8gYGBmcGBgIChhCkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgICAgZnAud3JpdGUoY2h1bmspCiAKIAotZGVmIGR1bXBzKG9iaiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLAorZGVmIGR1bXBzKG9iaiwgKiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLAogICAgICAgICBhbGxvd19uYW49VHJ1ZSwgY2xzPU5vbmUsIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsCiAgICAgICAgIGRlZmF1bHQ9Tm9uZSwgc29ydF9rZXlzPUZhbHNlLCAqKmt3KToKICAgICAiIiJTZXJpYWxpemUgYGBvYmpgYCB0byBhIEpTT04gZm9ybWF0dGVkIGBgc3RyYGAuCkBAIC0yNDAsNyArMjQwLDcgQEAKIF9kZWZhdWx0X2RlY29kZXIgPSBKU09ORGVjb2RlcihvYmplY3RfaG9vaz1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lKQogCiAKLWRlZiBsb2FkKGZwLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwKK2RlZiBsb2FkKGZwLCAqLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwKICAgICAgICAgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIG9iamVjdF9wYWlyc19ob29rPU5vbmUsICoqa3cpOgogICAgICIiIkRlc2VyaWFsaXplIGBgZnBgYCAoYSBgYC5yZWFkKClgYC1zdXBwb3J0aW5nIGZpbGUtbGlrZSBvYmplY3QgY29udGFpbmluZwogICAgIGEgSlNPTiBkb2N1bWVudCkgdG8gYSBQeXRob24gb2JqZWN0LgpAQCAtMjY4LDcgKzI2OCw3IEBACiAgICAgICAgIHBhcnNlX2NvbnN0YW50PXBhcnNlX2NvbnN0YW50LCBvYmplY3RfcGFpcnNfaG9vaz1vYmplY3RfcGFpcnNfaG9vaywgKiprdykKIAogCi1kZWYgbG9hZHMocywgZW5jb2Rpbmc9Tm9uZSwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsCitkZWYgbG9hZHMocywgKiwgZW5jb2Rpbmc9Tm9uZSwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsCiAgICAgICAgIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KToKICAgICAiIiJEZXNlcmlhbGl6ZSBgYHNgYCAoYSBgYHN0cmBgIGluc3RhbmNlIGNvbnRhaW5pbmcgYSBKU09OCiAgICAgZG9jdW1lbnQpIHRvIGEgUHl0aG9uIG9iamVjdC4KZGlmZiAtLWdpdCBhL0xpYi9qc29uL2RlY29kZXIucHkgYi9MaWIvanNvbi9kZWNvZGVyLnB5CmluZGV4IDBmMDNmMjAuLjI0MjJjNmEgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL2RlY29kZXIucHkKKysrIGIvTGliL2pzb24vZGVjb2Rlci5weQpAQCAtMjgwLDcgKzI4MCw3IEBACiAKICAgICAiIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLAogICAgICAgICAgICAgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIHN0cmljdD1UcnVlLAogICAgICAgICAgICAgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSk6CiAgICAgICAgICIiImBgb2JqZWN0X2hvb2tgYCwgaWYgc3BlY2lmaWVkLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSByZXN1bHQKZGlmZiAtLWdpdCBhL0xpYi9qc29uL2VuY29kZXIucHkgYi9MaWIvanNvbi9lbmNvZGVyLnB5CmluZGV4IGQ1OTY0ODkuLjQxYTQ5N2MgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL2VuY29kZXIucHkKKysrIGIvTGliL2pzb24vZW5jb2Rlci5weQpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgIiIiCiAgICAgaXRlbV9zZXBhcmF0b3IgPSAnLCAnCiAgICAga2V5X3NlcGFyYXRvciA9ICc6ICcKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsCiAgICAgICAgICAgICBjaGVja19jaXJjdWxhcj1UcnVlLCBhbGxvd19uYW49VHJ1ZSwgc29ydF9rZXlzPUZhbHNlLAogICAgICAgICAgICAgaW5kZW50PU5vbmUsIHNlcGFyYXRvcnM9Tm9uZSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAgIiIiQ29uc3RydWN0b3IgZm9yIEpTT05FbmNvZGVyLCB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzLgpAQCAtMTc2LDcgKzE3Niw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT05FbmNvZGVyLmRlZmF1bHQoc2VsZiwgbykKIAogICAgICAgICAiIiIKLSAgICAgICAgcmFpc2UgVHlwZUVycm9yKHJlcHIobykgKyAiIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZSIpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiT2JqZWN0IG9mIHR5cGUgJyVzJyBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUiICUKKyAgICAgICAgICAgICAgICAgICAgICAgIG8uX19jbGFzc19fLl9fbmFtZV9fKQogCiAgICAgZGVmIGVuY29kZShzZWxmLCBvKToKICAgICAgICAgIiIiUmV0dXJuIGEgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBQeXRob24gZGF0YSBzdHJ1Y3R1cmUuCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9HcmFtbWFyLnR4dCBiL0xpYi9saWIydG8zL0dyYW1tYXIudHh0CmluZGV4IGM5NTQ2NjkuLmRjZGQwMmQgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL0dyYW1tYXIudHh0CisrKyBiL0xpYi9saWIydG8zL0dyYW1tYXIudHh0CkBAIC01NCwxMiArNTQsMTMgQEAKIHNpbXBsZV9zdG10OiBzbWFsbF9zdG10ICgnOycgc21hbGxfc3RtdCkqIFsnOyddIE5FV0xJTkUKIHNtYWxsX3N0bXQ6IChleHByX3N0bXQgfCBwcmludF9zdG10ICB8IGRlbF9zdG10IHwgcGFzc19zdG10IHwgZmxvd19zdG10IHwKICAgICAgICAgICAgICBpbXBvcnRfc3RtdCB8IGdsb2JhbF9zdG10IHwgZXhlY19zdG10IHwgYXNzZXJ0X3N0bXQpCi1leHByX3N0bXQ6IHRlc3RsaXN0X3N0YXJfZXhwciAoYXVnYXNzaWduICh5aWVsZF9leHByfHRlc3RsaXN0KSB8CitleHByX3N0bXQ6IHRlc3RsaXN0X3N0YXJfZXhwciAoYW5uYXNzaWduIHwgYXVnYXNzaWduICh5aWVsZF9leHByfHRlc3RsaXN0KSB8CiAgICAgICAgICAgICAgICAgICAgICAoJz0nICh5aWVsZF9leHByfHRlc3RsaXN0X3N0YXJfZXhwcikpKikKK2FubmFzc2lnbjogJzonIHRlc3QgWyc9JyB0ZXN0XQogdGVzdGxpc3Rfc3Rhcl9leHByOiAodGVzdHxzdGFyX2V4cHIpICgnLCcgKHRlc3R8c3Rhcl9leHByKSkqIFsnLCddCiBhdWdhc3NpZ246ICgnKz0nIHwgJy09JyB8ICcqPScgfCAnQD0nIHwgJy89JyB8ICclPScgfCAnJj0nIHwgJ3w9JyB8ICdePScgfAogICAgICAgICAgICAgJzw8PScgfCAnPj49JyB8ICcqKj0nIHwgJy8vPScpCi0jIEZvciBub3JtYWwgYXNzaWdubWVudHMsIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIGVuZm9yY2VkIGJ5IHRoZSBpbnRlcnByZXRlcgorIyBGb3Igbm9ybWFsIGFuZCBhbm5vdGF0ZWQgYXNzaWdubWVudHMsIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIGVuZm9yY2VkIGJ5IHRoZSBpbnRlcnByZXRlcgogcHJpbnRfc3RtdDogJ3ByaW50JyAoIFsgdGVzdCAoJywnIHRlc3QpKiBbJywnXSBdIHwKICAgICAgICAgICAgICAgICAgICAgICAnPj4nIHRlc3QgWyAoJywnIHRlc3QpKyBbJywnXSBdICkKIGRlbF9zdG10OiAnZGVsJyBleHBybGlzdApAQCAtMTQ5LDcgKzE1MCw3IEBACiBhcmd1bWVudDogdGVzdCBbY29tcF9mb3JdIHwgdGVzdCAnPScgdGVzdCAgIyBSZWFsbHkgW2tleXdvcmQgJz0nXSB0ZXN0CiAKIGNvbXBfaXRlcjogY29tcF9mb3IgfCBjb21wX2lmCi1jb21wX2ZvcjogJ2ZvcicgZXhwcmxpc3QgJ2luJyB0ZXN0bGlzdF9zYWZlIFtjb21wX2l0ZXJdCitjb21wX2ZvcjogW0FTWU5DXSAnZm9yJyBleHBybGlzdCAnaW4nIHRlc3RsaXN0X3NhZmUgW2NvbXBfaXRlcl0KIGNvbXBfaWY6ICdpZicgb2xkX3Rlc3QgW2NvbXBfaXRlcl0KIAogdGVzdGxpc3QxOiB0ZXN0ICgnLCcgdGVzdCkqCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcl91dGlsLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXJfdXRpbC5weQppbmRleCA0NDUwMmJmLi5iYWJlNmNiIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcl91dGlsLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVyX3V0aWwucHkKQEAgLTEsOCArMSw2IEBACiAiIiJVdGlsaXR5IGZ1bmN0aW9ucywgbm9kZSBjb25zdHJ1Y3Rpb24gbWFjcm9zLCBldGMuIiIiCiAjIEF1dGhvcjogQ29sbGluIFdpbnRlcgogCi1mcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCi0KICMgTG9jYWwgaW1wb3J0cwogZnJvbSAucGdlbjIgaW1wb3J0IHRva2VuCiBmcm9tIC5weXRyZWUgaW1wb3J0IExlYWYsIE5vZGUKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKaW5kZXggOTYzZjk1Mi4uZDM2NTVjOSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKQEAgLTMwLDkgKzMwLDggQEAKICMgTG9jYWwgaW1wb3J0cwogZnJvbSAuLiBpbXBvcnQgcHl0cmVlCiBmcm9tIC4uIGltcG9ydCBwYXRjb21wCi1mcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCiBmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCi1mcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgQ2FsbCwgTFBhcmVuLCBSUGFyZW4sIEFyZ0xpc3QsIERvdAorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIERvdAogZnJvbSAuLiBpbXBvcnQgZml4ZXJfdXRpbAogCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHkKaW5kZXggMmM5YjcyZC4uYWI5MjFlZSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHkKQEAgLTEwLDcgKzEwLDYgQEAKICIiIgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gLi4gaW1wb3J0IHB5dHJlZQogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IENvbW1hLCBOYW1lLCBDYWxsCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5CmluZGV4IDM5MTg4OWYuLmJiNjcxOGMgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weQpAQCAtMTQsNyArMTQsNiBAQAogIiIiCiAKICMgTG9jYWwgaW1wb3J0cwotZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIExpc3RDb21wLCBpbl9zcGVjaWFsX2NvbnRleHQKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weQppbmRleCAxOGM1NjBmLi40Mzk3MDhjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weQpAQCAtMzEsNyArMzEsNiBAQAogCiAjIExvY2FsIGltcG9ydHMKIGZyb20gLi4gaW1wb3J0IHB5dHJlZQotZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIHBhcmVudGhlc2l6ZQogCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weQppbmRleCA0NmM3YWFmLi44ZTM0NDYzIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9tZXRhY2xhc3MucHkKQEAgLTIwLDcgKzIwLDcgQEAKICMgTG9jYWwgaW1wb3J0cwogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLnB5Z3JhbSBpbXBvcnQgdG9rZW4KLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBzeW1zLCBOb2RlLCBMZWFmCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgc3ltcywgTm9kZSwgTGVhZgogCiAKIGRlZiBoYXNfbWV0YWNsYXNzKHBhcmVudCk6CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbm9uemVyby5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CmluZGV4IGFkOTFhMjkuLmMyMjk1OTYgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CkBAIC0zLDcgKzMsNyBAQAogCiAjIExvY2FsIGltcG9ydHMKIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBzeW1zCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZQogCiBjbGFzcyBGaXhOb256ZXJvKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CiAgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weQppbmRleCBhMWZlMmY1Li44NzgwMzIyIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5CkBAIC0xOCw3ICsxOCw3IEBACiBmcm9tIC4uIGltcG9ydCBweXRyZWUKIGZyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBDb21tYSwgU3RyaW5nLCBpc190dXBsZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIENvbW1hLCBTdHJpbmcKIAogCiBwYXJlbmRfZXhwciA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5CmluZGV4IGRiMzQxMDQuLjY3YmY1MWYgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkKQEAgLTIwLDcgKzIwLDYgQEAKICIiIgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKIGZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lCiAKQEAgLTQyLDcgKzQxLDcgQEAKICAgICAgICAgJ05vdEltcGxlbWVudGVkVHlwZScgOiAndHlwZShOb3RJbXBsZW1lbnRlZCknLAogICAgICAgICAnU2xpY2VUeXBlJyA6ICdzbGljZScsCiAgICAgICAgICdTdHJpbmdUeXBlJzogJ2J5dGVzJywgIyBYWFggPwotICAgICAgICAnU3RyaW5nVHlwZXMnIDogJ3N0cicsICMgWFhYID8KKyAgICAgICAgJ1N0cmluZ1R5cGVzJyA6ICcoc3RyLCknLCAjIFhYWCA/CiAgICAgICAgICdUdXBsZVR5cGUnOiAndHVwbGUnLAogICAgICAgICAnVHlwZVR5cGUnIDogJ3R5cGUnLAogICAgICAgICAnVW5pY29kZVR5cGUnOiAnc3RyJywKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5CmluZGV4IDE0ODFjZDkuLjVhMzYwNDkgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weQpAQCAtNiw3ICs2LDYgQEAKIAogIyBMb2NhbCBpbXBvcnRzCiBmcm9tIGxpYjJ0bzMuZml4ZXMuZml4X2ltcG9ydHMgaW1wb3J0IGFsdGVybmF0ZXMsIEZpeEltcG9ydHMKLWZyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IChOYW1lLCBDb21tYSwgRnJvbUltcG9ydCwgTmV3bGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZF9pbmRlbnRhdGlvbiwgTm9kZSwgc3ltcykKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcmVmYWN0b3IucHkgYi9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQppbmRleCAwNzI4MDgzLi5jNWExYWEyIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQorKysgYi9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQpAQCAtOCw4ICs4LDYgQEAKIHByb3ZpZGVzIGluZnJhc3RydWN0dXJlIHRvIHdyaXRlIHlvdXIgb3duIHJlZmFjdG9yaW5nIHRvb2wuCiAiIiIKIAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAotCiBfX2F1dGhvcl9fID0gIkd1aWRvIHZhbiBSb3NzdW0gPGd1aWRvQHB5dGhvbi5vcmc+IgogCiAKQEAgLTI2LDcgKzI0LDYgQEAKIGZyb20gLnBnZW4yIGltcG9ydCBkcml2ZXIsIHRva2VuaXplLCB0b2tlbgogZnJvbSAuZml4ZXJfdXRpbCBpbXBvcnQgZmluZF9yb290CiBmcm9tIC4gaW1wb3J0IHB5dHJlZSwgcHlncmFtCi1mcm9tIC4gaW1wb3J0IGJ0bV91dGlscyBhcyBidQogZnJvbSAuIGltcG9ydCBidG1fbWF0Y2hlciBhcyBibQogCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvcHkzX3Rlc3RfZ3JhbW1hci5weSBiL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvcHkzX3Rlc3RfZ3JhbW1hci5weQppbmRleCBjMGJmN2YyLi5jZjMxYTU0IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL3B5M190ZXN0X2dyYW1tYXIucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9weTNfdGVzdF9ncmFtbWFyLnB5CkBAIC0zMTksNyArMzE5LDcgQEAKICAgICAgICAgZGVmIGYoeCkgLT4gbGlzdDogcGFzcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLl9fYW5ub3RhdGlvbnNfXywgeydyZXR1cm4nOiBsaXN0fSkKIAotICAgICAgICAjIHRlc3QgTUFLRV9DTE9TVVJFIHdpdGggYSB2YXJpZXR5IG9mIG9wYXJnJ3MKKyAgICAgICAgIyB0ZXN0IGNsb3N1cmVzIHdpdGggYSB2YXJpZXR5IG9mIG9wYXJnJ3MKICAgICAgICAgY2xvc3VyZSA9IDEKICAgICAgICAgZGVmIGYoKTogcmV0dXJuIGNsb3N1cmUKICAgICAgICAgZGVmIGYoeD0xKTogcmV0dXJuIGNsb3N1cmUKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHkgYi9MaWIvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5CmluZGV4IDA4OTcxNzcuLmFlN2NmZTggMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weQpAQCAtMywxMCArMyw4IEBACiAKICMgUHl0aG9uIGltcG9ydHMKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgb3MucGF0aAotaW1wb3J0IHJlCiBmcm9tIHRleHR3cmFwIGltcG9ydCBkZWRlbnQKIAogIyBMb2NhbCBpbXBvcnRzCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkKaW5kZXggMTUwNzlmZS4uYzA1MDdjZiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weQpAQCAtMTAsNyArMTAsNiBAQAogaW1wb3J0IHRlc3Quc3VwcG9ydAogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gbGliMnRvMyBpbXBvcnQgcmVmYWN0b3IKIGZyb20gLiBpbXBvcnQgc3VwcG9ydAogCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkKaW5kZXggMDZiMDAzMy4uYjk3YjczYSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkKQEAgLTIsMTIgKzIsMTEgQEAKIAogIyBQeXRob24gaW1wb3J0cwogaW1wb3J0IG9zCi1pbXBvcnQgdW5pdHRlc3QKIGZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgogZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gbGliMnRvMyBpbXBvcnQgcHlncmFtLCBweXRyZWUsIHJlZmFjdG9yLCBmaXhlcl91dGlsCitmcm9tIGxpYjJ0bzMgaW1wb3J0IHB5Z3JhbSwgZml4ZXJfdXRpbAogZnJvbSBsaWIydG8zLnRlc3RzIGltcG9ydCBzdXBwb3J0CiAKIApAQCAtMzMyMiw2ICszMzIxLDEwIEBACiAgICAgICAgIGEgPSAiIiJ0eXBlKE5vbmUpIiIiCiAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKIAorICAgICAgICBiID0gInR5cGVzLlN0cmluZ1R5cGVzIgorICAgICAgICBhID0gIihzdHIsKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCiBjbGFzcyBUZXN0X2lkaW9tcyhGaXhlclRlc3RDYXNlKToKICAgICBmaXhlciA9ICJpZGlvbXMiCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcGFyc2VyLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkKaW5kZXggMGIyY2E4Yi4uNzYxM2Y1MyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkKQEAgLTgsNyArOCw3IEBACiAKICMgVGVzdGluZyBpbXBvcnRzCiBmcm9tIC4gaW1wb3J0IHN1cHBvcnQKLWZyb20gLnN1cHBvcnQgaW1wb3J0IGRyaXZlciwgdGVzdF9kaXIKK2Zyb20gLnN1cHBvcnQgaW1wb3J0IGRyaXZlcgogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHZlcmJvc2UKIAogIyBQeXRob24gaW1wb3J0cwpAQCAtMTM0LDYgKzEzNCwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICIiIikKIAogICAgICAgICBzZWxmLnZhbGlkYXRlKCIiImFzeW5jIGRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2kgYXN5bmMgZm9yIGkgaW4gYl0KKyAgICAgICAgICAgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiIiJhc3luYyBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpIGZvciBpIGluIGIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgZm9yIGkgaW4gYSBpZiBhd2FpdCBpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGIgaW4gaX0KKyAgICAgICAgICAgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiIiJhc3luYyBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthd2FpdCBpIGZvciBpIGluIGIgaWYgYXdhaXQgY10KKyAgICAgICAgICAgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiIiJhc3luYyBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgaSBmb3IgaSBpbiBiIGlmIGNdCisgICAgICAgICAgICAgICAgICAgICAgIiIiKQorCisgICAgICAgIHNlbGYudmFsaWRhdGUoIiIiYXN5bmMgZGVmIGZvbygpOgogCiAgICAgICAgICAgICBkZWYgZm9vKCk6IHBhc3MKIApAQCAtMjM3LDYgKzI1NSwzNiBAQAogICAgICAgICBzZWxmLnZhbGlkYXRlKHMpCiAKIAorIyBBZGFwdGVkIGZyb20gUHl0aG9uIDMncyBMaWIvdGVzdC90ZXN0X2dyYW1tYXIucHk6R3JhbW1hclRlc3RzLnRlc3RfdmFyX2Fubm90CitjbGFzcyBUZXN0RnVuY3Rpb25Bbm5vdGF0aW9ucyhHcmFtbWFyVGVzdCk6CisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgidmFyMTogaW50ID0gNSIpCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCJ2YXIyOiBbaW50LCBzdHJdIikKKworICAgIGRlZiB0ZXN0XzMoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoImRlZiBmKCk6XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBzdDogc3RyID0gJ0hlbGxvJ1xuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgYS5iOiBpbnQgPSAoMSwgMilcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIHJldHVybiBzdFxuIikKKworICAgIGRlZiB0ZXN0XzQoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoImRlZiBmYmFkKCk6XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICB4OiBpbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIHByaW50KHgpXG4iKQorCisgICAgZGVmIHRlc3RfNShzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiY2xhc3MgQzpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIHg6IGludFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgczogc3RyID0gJ2F0dHInXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICB6ID0gMlxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOlxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIHNlbGYueDogaW50ID0geFxuIikKKworICAgIGRlZiB0ZXN0XzYoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoImxzdDogTGlzdFtpbnRdID0gW10iKQorCiBjbGFzcyBUZXN0RXhjZXB0KEdyYW1tYXJUZXN0KToKICAgICBkZWYgdGVzdF9uZXcoc2VsZik6CiAgICAgICAgIHMgPSAiIiIKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKaW5kZXggNGQ1ODVhOC4uMTc3MTI2ZCAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKQEAgLTksMTEgKzksNiBAQAogZXNwZWNpYWxseSB3aGVuIGRlYnVnZ2luZyBhIHRlc3QuCiAiIiIKIAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAotCi1pbXBvcnQgc3lzCi1pbXBvcnQgd2FybmluZ3MKLQogIyBUZXN0aW5nIGltcG9ydHMKIGZyb20gLiBpbXBvcnQgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weQppbmRleCA4NTYzMDAxLi5lOWJhZTVlIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkKQEAgLTIsMjQgKzIsMTggQEAKIFVuaXQgdGVzdHMgZm9yIHJlZmFjdG9yLnB5LgogIiIiCiAKLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKLQogaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgY29kZWNzCi1pbXBvcnQgb3BlcmF0b3IKIGltcG9ydCBpbwogaW1wb3J0IHJlCiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCBzaHV0aWwKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHdhcm5pbmdzCiAKIGZyb20gbGliMnRvMyBpbXBvcnQgcmVmYWN0b3IsIHB5Z3JhbSwgZml4ZXJfYmFzZQogZnJvbSBsaWIydG8zLnBnZW4yIGltcG9ydCB0b2tlbgogCi1mcm9tIC4gaW1wb3J0IHN1cHBvcnQKLQogCiBURVNUX0RBVEFfRElSID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJkYXRhIikKIEZJWEVSX0RJUiA9IG9zLnBhdGguam9pbihURVNUX0RBVEFfRElSLCAiZml4ZXJzIikKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weQppbmRleCBkMmJlODJjLi5jNmM2MTM5IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5CkBAIC0zLDkgKzMsNiBAQAogIyBUZXN0aW5nIGltcG9ydHMKIGZyb20gLiBpbXBvcnQgc3VwcG9ydAogCi0jIFB5dGhvbiBpbXBvcnRzCi1pbXBvcnQgb3MucGF0aAotCiAjIExvY2FsIGltcG9ydHMKIGZyb20gbGliMnRvMy5weXRyZWUgaW1wb3J0IE5vZGUsIExlYWYKIGZyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfdXRpbApkaWZmIC0tZ2l0IGEvTGliL2xvY2FsZS5weSBiL0xpYi9sb2NhbGUucHkKaW5kZXggNmQ1OWNkOC4uNGRlMDA5MCAxMDA2NDQKLS0tIGEvTGliL2xvY2FsZS5weQorKysgYi9MaWIvbG9jYWxlLnB5CkBAIC0zMDIsMTIgKzMwMiwxNiBAQAogCiBkZWYgZGVsb2NhbGl6ZShzdHJpbmcpOgogICAgICJQYXJzZXMgYSBzdHJpbmcgYXMgYSBub3JtYWxpemVkIG51bWJlciBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsZSBzZXR0aW5ncy4iCisKKyAgICBjb252ID0gbG9jYWxlY29udigpCisKICAgICAjRmlyc3QsIGdldCByaWQgb2YgdGhlIGdyb3VwaW5nCi0gICAgdHMgPSBsb2NhbGVjb252KClbJ3Rob3VzYW5kc19zZXAnXQorICAgIHRzID0gY29udlsndGhvdXNhbmRzX3NlcCddCiAgICAgaWYgdHM6CiAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHRzLCAnJykKKwogICAgICNuZXh0LCByZXBsYWNlIHRoZSBkZWNpbWFsIHBvaW50IHdpdGggYSBkb3QKLSAgICBkZCA9IGxvY2FsZWNvbnYoKVsnZGVjaW1hbF9wb2ludCddCisgICAgZGQgPSBjb252WydkZWNpbWFsX3BvaW50J10KICAgICBpZiBkZDoKICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoZGQsICcuJykKICAgICByZXR1cm4gc3RyaW5nCmRpZmYgLS1naXQgYS9MaWIvbG9nZ2luZy9fX2luaXRfXy5weSBiL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CmluZGV4IDIyNzQ0ZTEuLjI1OTBkNjUgMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CisrKyBiL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CkBAIC0zMyw4ICszMyw5IEBACiAgICAgICAgICAgICdTdHJlYW1IYW5kbGVyJywgJ1dBUk4nLCAnV0FSTklORycsICdhZGRMZXZlbE5hbWUnLCAnYmFzaWNDb25maWcnLAogICAgICAgICAgICAnY2FwdHVyZVdhcm5pbmdzJywgJ2NyaXRpY2FsJywgJ2RlYnVnJywgJ2Rpc2FibGUnLCAnZXJyb3InLAogICAgICAgICAgICAnZXhjZXB0aW9uJywgJ2ZhdGFsJywgJ2dldExldmVsTmFtZScsICdnZXRMb2dnZXInLCAnZ2V0TG9nZ2VyQ2xhc3MnLAotICAgICAgICAgICAnaW5mbycsICdsb2cnLCAnbWFrZUxvZ1JlY29yZCcsICdzZXRMb2dnZXJDbGFzcycsICd3YXJuJywgJ3dhcm5pbmcnLAotICAgICAgICAgICAnZ2V0TG9nUmVjb3JkRmFjdG9yeScsICdzZXRMb2dSZWNvcmRGYWN0b3J5JywgJ2xhc3RSZXNvcnQnXQorICAgICAgICAgICAnaW5mbycsICdsb2cnLCAnbWFrZUxvZ1JlY29yZCcsICdzZXRMb2dnZXJDbGFzcycsICdzaHV0ZG93bicsCisgICAgICAgICAgICd3YXJuJywgJ3dhcm5pbmcnLCAnZ2V0TG9nUmVjb3JkRmFjdG9yeScsICdzZXRMb2dSZWNvcmRGYWN0b3J5JywKKyAgICAgICAgICAgJ2xhc3RSZXNvcnQnLCAncmFpc2VFeGNlcHRpb25zJ10KIAogdHJ5OgogICAgIGltcG9ydCB0aHJlYWRpbmcKQEAgLTEwNyw2ICsxMDgsNyBAQAogfQogX25hbWVUb0xldmVsID0gewogICAgICdDUklUSUNBTCc6IENSSVRJQ0FMLAorICAgICdGQVRBTCc6IEZBVEFMLAogICAgICdFUlJPUic6IEVSUk9SLAogICAgICdXQVJOJzogV0FSTklORywKICAgICAnV0FSTklORyc6IFdBUk5JTkcsCkBAIC05MzUsNiArOTM3LDEwIEBACiAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgIGRlbCB0LCB2LCB0YgogCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBsZXZlbCA9IGdldExldmVsTmFtZShzZWxmLmxldmVsKQorICAgICAgICByZXR1cm4gJzwlcyAoJXMpPicgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGxldmVsKQorCiBjbGFzcyBTdHJlYW1IYW5kbGVyKEhhbmRsZXIpOgogICAgICIiIgogICAgIEEgaGFuZGxlciBjbGFzcyB3aGljaCB3cml0ZXMgbG9nZ2luZyByZWNvcmRzLCBhcHByb3ByaWF0ZWx5IGZvcm1hdHRlZCwKQEAgLTk4Niw2ICs5OTIsMTQgQEAKICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIHNlbGYuaGFuZGxlRXJyb3IocmVjb3JkKQogCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBsZXZlbCA9IGdldExldmVsTmFtZShzZWxmLmxldmVsKQorICAgICAgICBuYW1lID0gZ2V0YXR0cihzZWxmLnN0cmVhbSwgJ25hbWUnLCAnJykKKyAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgIG5hbWUgKz0gJyAnCisgICAgICAgIHJldHVybiAnPCVzICVzKCVzKT4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBuYW1lLCBsZXZlbCkKKworCiBjbGFzcyBGaWxlSGFuZGxlcihTdHJlYW1IYW5kbGVyKToKICAgICAiIiIKICAgICBBIGhhbmRsZXIgY2xhc3Mgd2hpY2ggd3JpdGVzIGZvcm1hdHRlZCBsb2dnaW5nIHJlY29yZHMgdG8gZGlzayBmaWxlcy4KQEAgLTk5NCw2ICsxMDA4LDggQEAKICAgICAgICAgIiIiCiAgICAgICAgIE9wZW4gdGhlIHNwZWNpZmllZCBmaWxlIGFuZCB1c2UgaXQgYXMgdGhlIHN0cmVhbSBmb3IgbG9nZ2luZy4KICAgICAgICAgIiIiCisgICAgICAgICMgSXNzdWUgIzI3NDkzOiBhZGQgc3VwcG9ydCBmb3IgUGF0aCBvYmplY3RzIHRvIGJlIHBhc3NlZCBpbgorICAgICAgICBmaWxlbmFtZSA9IG9zLmZzcGF0aChmaWxlbmFtZSkKICAgICAgICAgI2tlZXAgdGhlIGFic29sdXRlIHBhdGgsIG90aGVyd2lzZSBkZXJpdmVkIGNsYXNzZXMgd2hpY2ggdXNlIHRoaXMKICAgICAgICAgI21heSBjb21lIGEgY3JvcHBlciB3aGVuIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBjaGFuZ2VzCiAgICAgICAgIHNlbGYuYmFzZUZpbGVuYW1lID0gb3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKQpAQCAtMTA0OCw2ICsxMDY0LDExIEBACiAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHNlbGYuX29wZW4oKQogICAgICAgICBTdHJlYW1IYW5kbGVyLmVtaXQoc2VsZiwgcmVjb3JkKQogCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBsZXZlbCA9IGdldExldmVsTmFtZShzZWxmLmxldmVsKQorICAgICAgICByZXR1cm4gJzwlcyAlcyAoJXMpPicgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuYmFzZUZpbGVuYW1lLCBsZXZlbCkKKworCiBjbGFzcyBfU3RkZXJySGFuZGxlcihTdHJlYW1IYW5kbGVyKToKICAgICAiIiIKICAgICBUaGlzIGNsYXNzIGlzIGxpa2UgYSBTdHJlYW1IYW5kbGVyIHVzaW5nIHN5cy5zdGRlcnIsIGJ1dCBhbHdheXMgdXNlcwpAQCAtMTU0MCw2ICsxNTYxLDExIEBACiAgICAgICAgICAgICBzdWZmaXggPSAnLicuam9pbigoc2VsZi5uYW1lLCBzdWZmaXgpKQogICAgICAgICByZXR1cm4gc2VsZi5tYW5hZ2VyLmdldExvZ2dlcihzdWZmaXgpCiAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGxldmVsID0gZ2V0TGV2ZWxOYW1lKHNlbGYuZ2V0RWZmZWN0aXZlTGV2ZWwoKSkKKyAgICAgICAgcmV0dXJuICc8JXMgJXMgKCVzKT4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLm5hbWUsIGxldmVsKQorCisKIGNsYXNzIFJvb3RMb2dnZXIoTG9nZ2VyKToKICAgICAiIiIKICAgICBBIHJvb3QgbG9nZ2VyIGlzIG5vdCB0aGF0IGRpZmZlcmVudCB0byBhbnkgb3RoZXIgbG9nZ2VyLCBleGNlcHQgdGhhdApAQCAtMTY2Niw2ICsxNjkyLDExIEBACiAgICAgICAgICIiIgogICAgICAgICByZXR1cm4gc2VsZi5sb2dnZXIuaGFzSGFuZGxlcnMoKQogCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBsb2dnZXIgPSBzZWxmLmxvZ2dlcgorICAgICAgICBsZXZlbCA9IGdldExldmVsTmFtZShsb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSkKKyAgICAgICAgcmV0dXJuICc8JXMgJXMgKCVzKT4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBsb2dnZXIubmFtZSwgbGV2ZWwpCisKIHJvb3QgPSBSb290TG9nZ2VyKFdBUk5JTkcpCiBMb2dnZXIucm9vdCA9IHJvb3QKIExvZ2dlci5tYW5hZ2VyID0gTWFuYWdlcihMb2dnZXIucm9vdCkKZGlmZiAtLWdpdCBhL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5IGIvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkKaW5kZXggYzM5YTU2Zi4uN2Q3Nzk3MyAxMDA2NDQKLS0tIGEvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkKKysrIGIvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkKQEAgLTI0Niw2ICsyNDYsOSBAQAogCiAgICAgICAgIHNlbGYuZXh0TWF0Y2ggPSByZS5jb21waWxlKHNlbGYuZXh0TWF0Y2gsIHJlLkFTQ0lJKQogICAgICAgICBzZWxmLmludGVydmFsID0gc2VsZi5pbnRlcnZhbCAqIGludGVydmFsICMgbXVsdGlwbHkgYnkgdW5pdHMgcmVxdWVzdGVkCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBsaW5lIGFkZGVkIGJlY2F1c2UgdGhlIGZpbGVuYW1lIHBhc3NlZCBpbiBjb3VsZCBiZSBhCisgICAgICAgICMgcGF0aCBvYmplY3QgKHNlZSBJc3N1ZSAjMjc0OTMpLCBidXQgc2VsZi5iYXNlRmlsZW5hbWUgd2lsbCBiZSBhIHN0cmluZworICAgICAgICBmaWxlbmFtZSA9IHNlbGYuYmFzZUZpbGVuYW1lCiAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgIHQgPSBvcy5zdGF0KGZpbGVuYW1lKVtTVF9NVElNRV0KICAgICAgICAgZWxzZToKQEAgLTQ0MCwxMSArNDQzLDExIEBACiAgICAgICAgICAgICBzcmVzID0gb3MuZnN0YXQoc2VsZi5zdHJlYW0uZmlsZW5vKCkpCiAgICAgICAgICAgICBzZWxmLmRldiwgc2VsZi5pbm8gPSBzcmVzW1NUX0RFVl0sIHNyZXNbU1RfSU5PXQogCi0gICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICBkZWYgcmVvcGVuSWZOZWVkZWQoc2VsZik6CiAgICAgICAgICIiIgotICAgICAgICBFbWl0IGEgcmVjb3JkLgorICAgICAgICBSZW9wZW4gbG9nIGZpbGUgaWYgbmVlZGVkLgogCi0gICAgICAgIEZpcnN0IGNoZWNrIGlmIHRoZSB1bmRlcmx5aW5nIGZpbGUgaGFzIGNoYW5nZWQsIGFuZCBpZiBpdAorICAgICAgICBDaGVja3MgaWYgdGhlIHVuZGVybHlpbmcgZmlsZSBoYXMgY2hhbmdlZCwgYW5kIGlmIGl0CiAgICAgICAgIGhhcywgY2xvc2UgdGhlIG9sZCBzdHJlYW0gYW5kIHJlb3BlbiB0aGUgZmlsZSB0byBnZXQgdGhlCiAgICAgICAgIGN1cnJlbnQgc3RyZWFtLgogICAgICAgICAiIiIKQEAgLTQ2Nyw2ICs0NzAsMTUgQEAKICAgICAgICAgICAgICAgICAjIG9wZW4gYSBuZXcgZmlsZSBoYW5kbGUgYW5kIGdldCBuZXcgc3RhdCBpbmZvIGZyb20gdGhhdCBmZAogICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc2VsZi5fb3BlbigpCiAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdHN0cmVhbSgpCisKKyAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRW1pdCBhIHJlY29yZC4KKworICAgICAgICBJZiB1bmRlcmx5aW5nIGZpbGUgaGFzIGNoYW5nZWQsIHJlb3BlbiB0aGUgZmlsZSBiZWZvcmUgZW1pdHRpbmcgdGhlCisgICAgICAgIHJlY29yZCB0byBpdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucmVvcGVuSWZOZWVkZWQoKQogICAgICAgICBsb2dnaW5nLkZpbGVIYW5kbGVyLmVtaXQoc2VsZiwgcmVjb3JkKQogCiAKQEAgLTEyMjksMTcgKzEyNDEsMjUgQEAKICAgICBmbHVzaGluZyB0aGVtIHRvIGEgdGFyZ2V0IGhhbmRsZXIuIEZsdXNoaW5nIG9jY3VycyB3aGVuZXZlciB0aGUgYnVmZmVyCiAgICAgaXMgZnVsbCwgb3Igd2hlbiBhbiBldmVudCBvZiBhIGNlcnRhaW4gc2V2ZXJpdHkgb3IgZ3JlYXRlciBpcyBzZWVuLgogICAgICIiIgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYXBhY2l0eSwgZmx1c2hMZXZlbD1sb2dnaW5nLkVSUk9SLCB0YXJnZXQ9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhcGFjaXR5LCBmbHVzaExldmVsPWxvZ2dpbmcuRVJST1IsIHRhcmdldD1Ob25lLAorICAgICAgICAgICAgICAgICBmbHVzaE9uQ2xvc2U9VHJ1ZSk6CiAgICAgICAgICIiIgogICAgICAgICBJbml0aWFsaXplIHRoZSBoYW5kbGVyIHdpdGggdGhlIGJ1ZmZlciBzaXplLCB0aGUgbGV2ZWwgYXQgd2hpY2gKICAgICAgICAgZmx1c2hpbmcgc2hvdWxkIG9jY3VyIGFuZCBhbiBvcHRpb25hbCB0YXJnZXQuCiAKICAgICAgICAgTm90ZSB0aGF0IHdpdGhvdXQgYSB0YXJnZXQgYmVpbmcgc2V0IGVpdGhlciBoZXJlIG9yIHZpYSBzZXRUYXJnZXQoKSwKICAgICAgICAgYSBNZW1vcnlIYW5kbGVyIGlzIG5vIHVzZSB0byBhbnlvbmUhCisKKyAgICAgICAgVGhlIGBgZmx1c2hPbkNsb3NlYGAgYXJndW1lbnQgaXMgYGBUcnVlYGAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICAgICAgcmVhc29ucyAtIHRoZSBvbGQgYmVoYXZpb3VyIGlzIHRoYXQgd2hlbiB0aGUgaGFuZGxlciBpcyBjbG9zZWQsIHRoZQorICAgICAgICBidWZmZXIgaXMgZmx1c2hlZCwgZXZlbiBpZiB0aGUgZmx1c2ggbGV2ZWwgaGFzbid0IGJlZW4gZXhjZWVkZWQgbm9yIHRoZQorICAgICAgICBjYXBhY2l0eSBleGNlZWRlZC4gVG8gcHJldmVudCB0aGlzLCBzZXQgYGBmbHVzaE9uQ2xvc2VgYCB0byBgYEZhbHNlYGAuCiAgICAgICAgICIiIgogICAgICAgICBCdWZmZXJpbmdIYW5kbGVyLl9faW5pdF9fKHNlbGYsIGNhcGFjaXR5KQogICAgICAgICBzZWxmLmZsdXNoTGV2ZWwgPSBmbHVzaExldmVsCiAgICAgICAgIHNlbGYudGFyZ2V0ID0gdGFyZ2V0CisgICAgICAgICMgU2VlIElzc3VlICMyNjU1OSBmb3Igd2h5IHRoaXMgaGFzIGJlZW4gYWRkZWQKKyAgICAgICAgc2VsZi5mbHVzaE9uQ2xvc2UgPSBmbHVzaE9uQ2xvc2UKIAogICAgIGRlZiBzaG91bGRGbHVzaChzZWxmLCByZWNvcmQpOgogICAgICAgICAiIiIKQEAgLTEyNzMsMTAgKzEyOTMsMTIgQEAKIAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgIiIiCi0gICAgICAgIEZsdXNoLCBzZXQgdGhlIHRhcmdldCB0byBOb25lIGFuZCBsb3NlIHRoZSBidWZmZXIuCisgICAgICAgIEZsdXNoLCBpZiBhcHByb3ByaWF0ZWx5IGNvbmZpZ3VyZWQsIHNldCB0aGUgdGFyZ2V0IHRvIE5vbmUgYW5kIGxvc2UgdGhlCisgICAgICAgIGJ1ZmZlci4KICAgICAgICAgIiIiCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICAgICAgaWYgc2VsZi5mbHVzaE9uQ2xvc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mbHVzaCgpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzZWxmLmFjcXVpcmUoKQogICAgICAgICAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL21haWxib3gucHkgYi9MaWIvbWFpbGJveC5weQppbmRleCAwMjcwZTI1Li4wZTIzOTg3IDEwMDY0NAotLS0gYS9MaWIvbWFpbGJveC5weQorKysgYi9MaWIvbWFpbGJveC5weQpAQCAtMjMsOSArMjMsMTAgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBmY250bCA9IE5vbmUKIAotX19hbGxfXyA9IFsgJ01haWxib3gnLCAnTWFpbGRpcicsICdtYm94JywgJ01IJywgJ0JhYnlsJywgJ01NREYnLAotICAgICAgICAgICAgJ01lc3NhZ2UnLCAnTWFpbGRpck1lc3NhZ2UnLCAnbWJveE1lc3NhZ2UnLCAnTUhNZXNzYWdlJywKLSAgICAgICAgICAgICdCYWJ5bE1lc3NhZ2UnLCAnTU1ERk1lc3NhZ2UnXQorX19hbGxfXyA9IFsnTWFpbGJveCcsICdNYWlsZGlyJywgJ21ib3gnLCAnTUgnLCAnQmFieWwnLCAnTU1ERicsCisgICAgICAgICAgICdNZXNzYWdlJywgJ01haWxkaXJNZXNzYWdlJywgJ21ib3hNZXNzYWdlJywgJ01ITWVzc2FnZScsCisgICAgICAgICAgICdCYWJ5bE1lc3NhZ2UnLCAnTU1ERk1lc3NhZ2UnLCAnRXJyb3InLCAnTm9TdWNoTWFpbGJveEVycm9yJywKKyAgICAgICAgICAgJ05vdEVtcHR5RXJyb3InLCAnRXh0ZXJuYWxDbGFzaEVycm9yJywgJ0Zvcm1hdEVycm9yJ10KIAogbGluZXNlcCA9IG9zLmxpbmVzZXAuZW5jb2RlKCdhc2NpaScpCiAKZGlmZiAtLWdpdCBhL0xpYi9taW1ldHlwZXMucHkgYi9MaWIvbWltZXR5cGVzLnB5CmluZGV4IDBiZTc2YWQuLjlhODg2ODAgMTAwNjQ0Ci0tLSBhL0xpYi9taW1ldHlwZXMucHkKKysrIGIvTGliL21pbWV0eXBlcy5weQpAQCAtMzMsOCArMzMsMTAgQEAKICAgICBfd2lucmVnID0gTm9uZQogCiBfX2FsbF9fID0gWwotICAgICJndWVzc190eXBlIiwiZ3Vlc3NfZXh0ZW5zaW9uIiwiZ3Vlc3NfYWxsX2V4dGVuc2lvbnMiLAotICAgICJhZGRfdHlwZSIsInJlYWRfbWltZV90eXBlcyIsImluaXQiCisgICAgImtub3duZmlsZXMiLCAiaW5pdGVkIiwgIk1pbWVUeXBlcyIsCisgICAgImd1ZXNzX3R5cGUiLCAiZ3Vlc3NfYWxsX2V4dGVuc2lvbnMiLCAiZ3Vlc3NfZXh0ZW5zaW9uIiwKKyAgICAiYWRkX3R5cGUiLCAiaW5pdCIsICJyZWFkX21pbWVfdHlwZXMiLAorICAgICJzdWZmaXhfbWFwIiwgImVuY29kaW5nc19tYXAiLCAidHlwZXNfbWFwIiwgImNvbW1vbl90eXBlcyIKIF0KIAoga25vd25maWxlcyA9IFsKZGlmZiAtLWdpdCBhL0xpYi9tb2R1bGVmaW5kZXIucHkgYi9MaWIvbW9kdWxlZmluZGVyLnB5CmluZGV4IDgxMDM1MDIuLmUyMjAzMTUgMTAwNjQ0Ci0tLSBhL0xpYi9tb2R1bGVmaW5kZXIucHkKKysrIGIvTGliL21vZHVsZWZpbmRlci5weQpAQCAtMTAsNyArMTAsNyBAQAogaW1wb3J0IHN0cnVjdAogaW1wb3J0IHdhcm5pbmdzCiB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQorICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgIGltcG9ydCBpbXAKIAogTE9BRF9DT05TVCA9IGRpcy5vcG1hcFsnTE9BRF9DT05TVCddCkBAIC0zMzYsOCArMzM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gbmFtZSArICIuIiArIHN1YgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYWRkX2JhZG1vZHVsZShmdWxsbmFtZSwgY2FsbGVyKQogCi0gICAgZGVmIHNjYW5fb3Bjb2Rlc18yNShzZWxmLCBjbywKLSAgICAgICAgICAgICAgICAgICAgIHVucGFjayA9IHN0cnVjdC51bnBhY2spOgorICAgIGRlZiBzY2FuX29wY29kZXMoc2VsZiwgY28pOgogICAgICAgICAjIFNjYW4gdGhlIGNvZGUsIGFuZCB5aWVsZCAnaW50ZXJlc3RpbmcnIG9wY29kZSBjb21iaW5hdGlvbnMKICAgICAgICAgY29kZSA9IGNvLmNvX2NvZGUKICAgICAgICAgbmFtZXMgPSBjby5jb19uYW1lcwpAQCAtMzYwLDcgKzM1OSw3IEBACiAKICAgICBkZWYgc2Nhbl9jb2RlKHNlbGYsIGNvLCBtKToKICAgICAgICAgY29kZSA9IGNvLmNvX2NvZGUKLSAgICAgICAgc2Nhbm5lciA9IHNlbGYuc2Nhbl9vcGNvZGVzXzI1CisgICAgICAgIHNjYW5uZXIgPSBzZWxmLnNjYW5fb3Bjb2RlcwogICAgICAgICBmb3Igd2hhdCwgYXJncyBpbiBzY2FubmVyKGNvKToKICAgICAgICAgICAgIGlmIHdoYXQgPT0gInN0b3JlIjoKICAgICAgICAgICAgICAgICBuYW1lLCA9IGFyZ3MKZGlmZiAtLWdpdCBhL0xpYi9tc2lsaWIvX19pbml0X18ucHkgYi9MaWIvbXNpbGliL19faW5pdF9fLnB5CmluZGV4IDZkMGEyOGYuLmYwMzcwYzIgMTAwNjQ0Ci0tLSBhL0xpYi9tc2lsaWIvX19pbml0X18ucHkKKysrIGIvTGliL21zaWxpYi9fX2luaXRfXy5weQpAQCAtMSw3ICsxLDcgQEAKICMgQ29weXJpZ2h0IChDKSAyMDA1IE1hcnRpbiB2LiBMw7Z3aXMKICMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgogZnJvbSBfbXNpIGltcG9ydCAqCi1pbXBvcnQgZ2xvYgoraW1wb3J0IGZubWF0Y2gKIGltcG9ydCBvcwogaW1wb3J0IHJlCiBpbXBvcnQgc3RyaW5nCkBAIC0yODksNyArMjg5LDcgQEAKICAgICBkZWYgbWFrZV9zaG9ydChzZWxmLCBmaWxlKToKICAgICAgICAgb2xkZmlsZSA9IGZpbGUKICAgICAgICAgZmlsZSA9IGZpbGUucmVwbGFjZSgnKycsICdfJykKLSAgICAgICAgZmlsZSA9ICcnLmpvaW4oYyBmb3IgYyBpbiBmaWxlIGlmIG5vdCBjIGluICcgIi9cW106Oz0sJykKKyAgICAgICAgZmlsZSA9ICcnLmpvaW4oYyBmb3IgYyBpbiBmaWxlIGlmIG5vdCBjIGluIHInICIvXFtdOjs9LCcpCiAgICAgICAgIHBhcnRzID0gZmlsZS5zcGxpdCgiLiIpCiAgICAgICAgIGlmIGxlbihwYXJ0cykgPiAxOgogICAgICAgICAgICAgcHJlZml4ID0gIiIuam9pbihwYXJ0c1s6LTFdKS51cHBlcigpCkBAIC0zNzksNyArMzc5LDEzIEBACiAgICAgZGVmIGdsb2Ioc2VsZiwgcGF0dGVybiwgZXhjbHVkZSA9IE5vbmUpOgogICAgICAgICAiIiJBZGQgYSBsaXN0IG9mIGZpbGVzIHRvIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhcyBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgIGdsb2IgcGF0dGVybi4gSW5kaXZpZHVhbCBmaWxlcyBjYW4gYmUgZXhjbHVkZWQgaW4gdGhlIGV4Y2x1ZGUgbGlzdC4iIiIKLSAgICAgICAgZmlsZXMgPSBnbG9iLmdsb2IxKHNlbGYuYWJzb2x1dGUsIHBhdHRlcm4pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihzZWxmLmFic29sdXRlKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBpZiBwYXR0ZXJuWzoxXSAhPSAnLic6CisgICAgICAgICAgICBmaWxlcyA9IChmIGZvciBmIGluIGZpbGVzIGlmIGZbMF0gIT0gJy4nKQorICAgICAgICBmaWxlcyA9IGZubWF0Y2guZmlsdGVyKGZpbGVzLCBwYXR0ZXJuKQogICAgICAgICBmb3IgZiBpbiBmaWxlczoKICAgICAgICAgICAgIGlmIGV4Y2x1ZGUgYW5kIGYgaW4gZXhjbHVkZTogY29udGludWUKICAgICAgICAgICAgIHNlbGYuYWRkX2ZpbGUoZikKZGlmZiAtLWdpdCBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvbWFuYWdlcnMucHkgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL21hbmFnZXJzLnB5CmluZGV4IGIxNzU0NzAuLmM0ZGM5NzIgMTAwNjQ0Ci0tLSBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvbWFuYWdlcnMucHkKKysrIGIvTGliL211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weQpAQCAtMTQyLDcgKzE0Miw4IEBACiAKICAgICAgICAgc2VsZi5pZF90b19vYmogPSB7JzAnOiAoTm9uZSwgKCkpfQogICAgICAgICBzZWxmLmlkX3RvX3JlZmNvdW50ID0ge30KLSAgICAgICAgc2VsZi5tdXRleCA9IHRocmVhZGluZy5STG9jaygpCisgICAgICAgIHNlbGYuaWRfdG9fbG9jYWxfcHJveHlfb2JqID0ge30KKyAgICAgICAgc2VsZi5tdXRleCA9IHRocmVhZGluZy5Mb2NrKCkKIAogICAgIGRlZiBzZXJ2ZV9mb3JldmVyKHNlbGYpOgogICAgICAgICAnJycKQEAgLTIyNyw3ICsyMjgsMTQgQEAKICAgICAgICAgICAgICAgICBtZXRob2RuYW1lID0gb2JqID0gTm9uZQogICAgICAgICAgICAgICAgIHJlcXVlc3QgPSByZWN2KCkKICAgICAgICAgICAgICAgICBpZGVudCwgbWV0aG9kbmFtZSwgYXJncywga3dkcyA9IHJlcXVlc3QKLSAgICAgICAgICAgICAgICBvYmosIGV4cG9zZWQsIGdldHR5cGVpZCA9IGlkX3RvX29ialtpZGVudF0KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9iaiwgZXhwb3NlZCwgZ2V0dHlwZWlkID0gaWRfdG9fb2JqW2lkZW50XQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvciBhcyBrZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgb2JqLCBleHBvc2VkLCBnZXR0eXBlaWQgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pZF90b19sb2NhbF9wcm94eV9vYmpbaWRlbnRdCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvciBhcyBzZWNvbmRfa2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBrZQogCiAgICAgICAgICAgICAgICAgaWYgbWV0aG9kbmFtZSBub3QgaW4gZXhwb3NlZDoKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoCkBAIC0zMDgsNyArMzE2LDcgQEAKICAgICAgICAgJycnCiAgICAgICAgIHdpdGggc2VsZi5tdXRleDoKICAgICAgICAgICAgIHJlc3VsdCA9IFtdCi0gICAgICAgICAgICBrZXlzID0gbGlzdChzZWxmLmlkX3RvX29iai5rZXlzKCkpCisgICAgICAgICAgICBrZXlzID0gbGlzdChzZWxmLmlkX3RvX3JlZmNvdW50LmtleXMoKSkKICAgICAgICAgICAgIGtleXMuc29ydCgpCiAgICAgICAgICAgICBmb3IgaWRlbnQgaW4ga2V5czoKICAgICAgICAgICAgICAgICBpZiBpZGVudCAhPSAnMCc6CkBAIC0zMjEsNyArMzI5LDggQEAKICAgICAgICAgJycnCiAgICAgICAgIE51bWJlciBvZiBzaGFyZWQgb2JqZWN0cwogICAgICAgICAnJycKLSAgICAgICAgcmV0dXJuIGxlbihzZWxmLmlkX3RvX29iaikgLSAxICAgICAgIyBkb24ndCBjb3VudCBpZGVudD0nMCcKKyAgICAgICAgIyBEb2Vzbid0IHVzZSAobGVuKHNlbGYuaWRfdG9fb2JqKSAtIDEpIGFzIHdlIHNob3VsZG4ndCBjb3VudCBpZGVudD0nMCcKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmlkX3RvX3JlZmNvdW50KQogCiAgICAgZGVmIHNodXRkb3duKHNlbGYsIGMpOgogICAgICAgICAnJycKQEAgLTM2MywxMyArMzcyLDkgQEAKICAgICAgICAgICAgIHNlbGYuaWRfdG9fb2JqW2lkZW50XSA9IChvYmosIHNldChleHBvc2VkKSwgbWV0aG9kX3RvX3R5cGVpZCkKICAgICAgICAgICAgIGlmIGlkZW50IG5vdCBpbiBzZWxmLmlkX3RvX3JlZmNvdW50OgogICAgICAgICAgICAgICAgIHNlbGYuaWRfdG9fcmVmY291bnRbaWRlbnRdID0gMAotICAgICAgICAgICAgIyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBpbW1lZGlhdGVseSwgdG8gYXZvaWQKLSAgICAgICAgICAgICMgdGhpcyBvYmplY3QgYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQgYmVmb3JlIGEgUHJveHkKLSAgICAgICAgICAgICMgb2JqZWN0IGZvciBpdCBjYW4gYmUgY3JlYXRlZC4gIFRoZSBjYWxsZXIgb2YgY3JlYXRlKCkKLSAgICAgICAgICAgICMgaXMgcmVzcG9uc2libGUgZm9yIGRvaW5nIGEgZGVjcmVmIG9uY2UgdGhlIFByb3h5IG9iamVjdAotICAgICAgICAgICAgIyBoYXMgYmVlbiBjcmVhdGVkLgotICAgICAgICAgICAgc2VsZi5pbmNyZWYoYywgaWRlbnQpCi0gICAgICAgICAgICByZXR1cm4gaWRlbnQsIHR1cGxlKGV4cG9zZWQpCisKKyAgICAgICAgc2VsZi5pbmNyZWYoYywgaWRlbnQpCisgICAgICAgIHJldHVybiBpZGVudCwgdHVwbGUoZXhwb3NlZCkKIAogICAgIGRlZiBnZXRfbWV0aG9kcyhzZWxmLCBjLCB0b2tlbik6CiAgICAgICAgICcnJwpAQCAtMzg3LDE1ICszOTIsNDUgQEAKIAogICAgIGRlZiBpbmNyZWYoc2VsZiwgYywgaWRlbnQpOgogICAgICAgICB3aXRoIHNlbGYubXV0ZXg6Ci0gICAgICAgICAgICBzZWxmLmlkX3RvX3JlZmNvdW50W2lkZW50XSArPSAxCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5pZF90b19yZWZjb3VudFtpZGVudF0gKz0gMQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yIGFzIGtlOgorICAgICAgICAgICAgICAgICMgSWYgbm8gZXh0ZXJuYWwgcmVmZXJlbmNlcyBleGlzdCBidXQgYW4gaW50ZXJuYWwgKHRvIHRoZQorICAgICAgICAgICAgICAgICMgbWFuYWdlcikgc3RpbGwgZG9lcyBhbmQgYSBuZXcgZXh0ZXJuYWwgcmVmZXJlbmNlIGlzIGNyZWF0ZWQKKyAgICAgICAgICAgICAgICAjIGZyb20gaXQsIHJlc3RvcmUgdGhlIG1hbmFnZXIncyB0cmFja2luZyBvZiBpdCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICMgcHJldmlvdXNseSBzdGFzaGVkIGludGVybmFsIHJlZi4KKyAgICAgICAgICAgICAgICBpZiBpZGVudCBpbiBzZWxmLmlkX3RvX2xvY2FsX3Byb3h5X29iajoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pZF90b19yZWZjb3VudFtpZGVudF0gPSAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaWRfdG9fb2JqW2lkZW50XSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWRfdG9fbG9jYWxfcHJveHlfb2JqW2lkZW50XQorICAgICAgICAgICAgICAgICAgICBvYmosIGV4cG9zZWQsIGdldHR5cGVpZCA9IHNlbGYuaWRfdG9fb2JqW2lkZW50XQorICAgICAgICAgICAgICAgICAgICB1dGlsLmRlYnVnKCdTZXJ2ZXIgcmUtZW5hYmxlZCB0cmFja2luZyAmIElOQ1JFRiAlcicsIGlkZW50KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGtlCiAKICAgICBkZWYgZGVjcmVmKHNlbGYsIGMsIGlkZW50KToKKyAgICAgICAgaWYgaWRlbnQgbm90IGluIHNlbGYuaWRfdG9fcmVmY291bnQgYW5kIFwKKyAgICAgICAgICAgIGlkZW50IGluIHNlbGYuaWRfdG9fbG9jYWxfcHJveHlfb2JqOgorICAgICAgICAgICAgdXRpbC5kZWJ1ZygnU2VydmVyIERFQ1JFRiBza2lwcGluZyAlcicsIGlkZW50KQorICAgICAgICAgICAgcmV0dXJuCisKICAgICAgICAgd2l0aCBzZWxmLm11dGV4OgogICAgICAgICAgICAgYXNzZXJ0IHNlbGYuaWRfdG9fcmVmY291bnRbaWRlbnRdID49IDEKICAgICAgICAgICAgIHNlbGYuaWRfdG9fcmVmY291bnRbaWRlbnRdIC09IDEKICAgICAgICAgICAgIGlmIHNlbGYuaWRfdG9fcmVmY291bnRbaWRlbnRdID09IDA6Ci0gICAgICAgICAgICAgICAgZGVsIHNlbGYuaWRfdG9fb2JqW2lkZW50XSwgc2VsZi5pZF90b19yZWZjb3VudFtpZGVudF0KLSAgICAgICAgICAgICAgICB1dGlsLmRlYnVnKCdkaXNwb3Npbmcgb2Ygb2JqIHdpdGggaWQgJXInLCBpZGVudCkKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5pZF90b19yZWZjb3VudFtpZGVudF0KKworICAgICAgICBpZiBpZGVudCBub3QgaW4gc2VsZi5pZF90b19yZWZjb3VudDoKKyAgICAgICAgICAgICMgVHdvLXN0ZXAgcHJvY2VzcyBpbiBjYXNlIHRoZSBvYmplY3QgdHVybnMgb3V0IHRvIGNvbnRhaW4gb3RoZXIKKyAgICAgICAgICAgICMgcHJveHkgb2JqZWN0cyAoZS5nLiBhIG1hbmFnZWQgbGlzdCBvZiBtYW5hZ2VkIGxpc3RzKS4KKyAgICAgICAgICAgICMgT3RoZXJ3aXNlLCBkZWxldGluZyBzZWxmLmlkX3RvX29ialtpZGVudF0gd291bGQgdHJpZ2dlciB0aGUKKyAgICAgICAgICAgICMgZGVsZXRpbmcgb2YgdGhlIHN0b3JlZCB2YWx1ZSAoYW5vdGhlciBtYW5hZ2VkIG9iamVjdCkgd2hpY2ggd291bGQKKyAgICAgICAgICAgICMgaW4gdHVybiBhdHRlbXB0IHRvIGFjcXVpcmUgdGhlIG11dGV4IHRoYXQgaXMgYWxyZWFkeSBoZWxkIGhlcmUuCisgICAgICAgICAgICBzZWxmLmlkX3RvX29ialtpZGVudF0gPSAoTm9uZSwgKCksIE5vbmUpICAjIHRocmVhZC1zYWZlCisgICAgICAgICAgICB1dGlsLmRlYnVnKCdkaXNwb3Npbmcgb2Ygb2JqIHdpdGggaWQgJXInLCBpZGVudCkKKyAgICAgICAgICAgIHdpdGggc2VsZi5tdXRleDoKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5pZF90b19vYmpbaWRlbnRdCisKIAogIwogIyBDbGFzcyB0byByZXByZXNlbnQgc3RhdGUgb2YgYSBtYW5hZ2VyCkBAIC02NTgsNyArNjkzLDcgQEAKICAgICBfbXV0ZXggPSB1dGlsLkZvcmtBd2FyZVRocmVhZExvY2soKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuLCBzZXJpYWxpemVyLCBtYW5hZ2VyPU5vbmUsCi0gICAgICAgICAgICAgICAgIGF1dGhrZXk9Tm9uZSwgZXhwb3NlZD1Ob25lLCBpbmNyZWY9VHJ1ZSk6CisgICAgICAgICAgICAgICAgIGF1dGhrZXk9Tm9uZSwgZXhwb3NlZD1Ob25lLCBpbmNyZWY9VHJ1ZSwgbWFuYWdlcl9vd25lZD1GYWxzZSk6CiAgICAgICAgIHdpdGggQmFzZVByb3h5Ll9tdXRleDoKICAgICAgICAgICAgIHRsc19pZHNldCA9IEJhc2VQcm94eS5fYWRkcmVzc190b19sb2NhbC5nZXQodG9rZW4uYWRkcmVzcywgTm9uZSkKICAgICAgICAgICAgIGlmIHRsc19pZHNldCBpcyBOb25lOgpAQCAtNjgwLDYgKzcxNSwxMiBAQAogICAgICAgICBzZWxmLl9zZXJpYWxpemVyID0gc2VyaWFsaXplcgogICAgICAgICBzZWxmLl9DbGllbnQgPSBsaXN0ZW5lcl9jbGllbnRbc2VyaWFsaXplcl1bMV0KIAorICAgICAgICAjIFNob3VsZCBiZSBzZXQgdG8gVHJ1ZSBvbmx5IHdoZW4gYSBwcm94eSBvYmplY3QgaXMgYmVpbmcgY3JlYXRlZAorICAgICAgICAjIG9uIHRoZSBtYW5hZ2VyIHNlcnZlcjsgcHJpbWFyeSB1c2UgY2FzZTogbmVzdGVkIHByb3h5IG9iamVjdHMuCisgICAgICAgICMgUmVidWlsZFByb3h5IGRldGVjdHMgd2hlbiBhIHByb3h5IGlzIGJlaW5nIGNyZWF0ZWQgb24gdGhlIG1hbmFnZXIKKyAgICAgICAgIyBhbmQgc2V0cyB0aGlzIHZhbHVlIGFwcHJvcHJpYXRlbHkuCisgICAgICAgIHNlbGYuX293bmVkX2J5X21hbmFnZXIgPSBtYW5hZ2VyX293bmVkCisKICAgICAgICAgaWYgYXV0aGtleSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHNlbGYuX2F1dGhrZXkgPSBwcm9jZXNzLkF1dGhlbnRpY2F0aW9uU3RyaW5nKGF1dGhrZXkpCiAgICAgICAgIGVsaWYgc2VsZi5fbWFuYWdlciBpcyBub3QgTm9uZToKQEAgLTczOCw2ICs3NzksMTAgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJyNHRVRWQUxVRScpCiAKICAgICBkZWYgX2luY3JlZihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fb3duZWRfYnlfbWFuYWdlcjoKKyAgICAgICAgICAgIHV0aWwuZGVidWcoJ293bmVkX2J5X21hbmFnZXIgc2tpcHBlZCBJTkNSRUYgb2YgJXInLCBzZWxmLl90b2tlbi5pZCkKKyAgICAgICAgICAgIHJldHVybgorCiAgICAgICAgIGNvbm4gPSBzZWxmLl9DbGllbnQoc2VsZi5fdG9rZW4uYWRkcmVzcywgYXV0aGtleT1zZWxmLl9hdXRoa2V5KQogICAgICAgICBkaXNwYXRjaChjb25uLCBOb25lLCAnaW5jcmVmJywgKHNlbGYuX2lkLCkpCiAgICAgICAgIHV0aWwuZGVidWcoJ0lOQ1JFRiAlcicsIHNlbGYuX3Rva2VuLmlkKQpAQCAtODIyLDE5ICs4NjcsMTkgQEAKIGRlZiBSZWJ1aWxkUHJveHkoZnVuYywgdG9rZW4sIHNlcmlhbGl6ZXIsIGt3ZHMpOgogICAgICcnJwogICAgIEZ1bmN0aW9uIHVzZWQgZm9yIHVucGlja2xpbmcgcHJveHkgb2JqZWN0cy4KLQotICAgIElmIHBvc3NpYmxlIHRoZSBzaGFyZWQgb2JqZWN0IGlzIHJldHVybmVkLCBvciBvdGhlcndpc2UgYSBwcm94eSBmb3IgaXQuCiAgICAgJycnCiAgICAgc2VydmVyID0gZ2V0YXR0cihwcm9jZXNzLmN1cnJlbnRfcHJvY2VzcygpLCAnX21hbmFnZXJfc2VydmVyJywgTm9uZSkKLQogICAgIGlmIHNlcnZlciBhbmQgc2VydmVyLmFkZHJlc3MgPT0gdG9rZW4uYWRkcmVzczoKLSAgICAgICAgcmV0dXJuIHNlcnZlci5pZF90b19vYmpbdG9rZW4uaWRdWzBdCi0gICAgZWxzZToKLSAgICAgICAgaW5jcmVmID0gKAotICAgICAgICAgICAga3dkcy5wb3AoJ2luY3JlZicsIFRydWUpIGFuZAotICAgICAgICAgICAgbm90IGdldGF0dHIocHJvY2Vzcy5jdXJyZW50X3Byb2Nlc3MoKSwgJ19pbmhlcml0aW5nJywgRmFsc2UpCi0gICAgICAgICAgICApCi0gICAgICAgIHJldHVybiBmdW5jKHRva2VuLCBzZXJpYWxpemVyLCBpbmNyZWY9aW5jcmVmLCAqKmt3ZHMpCisgICAgICAgIHV0aWwuZGVidWcoJ1JlYnVpbGQgYSBwcm94eSBvd25lZCBieSBtYW5hZ2VyLCB0b2tlbj0lcicsIHRva2VuKQorICAgICAgICBrd2RzWydtYW5hZ2VyX293bmVkJ10gPSBUcnVlCisgICAgICAgIGlmIHRva2VuLmlkIG5vdCBpbiBzZXJ2ZXIuaWRfdG9fbG9jYWxfcHJveHlfb2JqOgorICAgICAgICAgICAgc2VydmVyLmlkX3RvX2xvY2FsX3Byb3h5X29ialt0b2tlbi5pZF0gPSBcCisgICAgICAgICAgICAgICAgc2VydmVyLmlkX3RvX29ialt0b2tlbi5pZF0KKyAgICBpbmNyZWYgPSAoCisgICAgICAgIGt3ZHMucG9wKCdpbmNyZWYnLCBUcnVlKSBhbmQKKyAgICAgICAgbm90IGdldGF0dHIocHJvY2Vzcy5jdXJyZW50X3Byb2Nlc3MoKSwgJ19pbmhlcml0aW5nJywgRmFsc2UpCisgICAgICAgICkKKyAgICByZXR1cm4gZnVuYyh0b2tlbiwgc2VyaWFsaXplciwgaW5jcmVmPWluY3JlZiwgKiprd2RzKQogCiAjCiAjIEZ1bmN0aW9ucyB0byBjcmVhdGUgcHJveGllcyBhbmQgcHJveHkgdHlwZXMKZGlmZiAtLWdpdCBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weSBiL0xpYi9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weQppbmRleCA2ZDI1NDY5Li5mZmRmNDI2IDEwMDY0NAotLS0gYS9MaWIvbXVsdGlwcm9jZXNzaW5nL3Bvb2wucHkKKysrIGIvTGliL211bHRpcHJvY2Vzc2luZy9wb29sLnB5CkBAIC02MzgsMjIgKzYzOCwyNiBAQAogICAgICAgICAgICAgc2VsZi5fbnVtYmVyX2xlZnQgPSBsZW5ndGgvL2NodW5rc2l6ZSArIGJvb2wobGVuZ3RoICUgY2h1bmtzaXplKQogCiAgICAgZGVmIF9zZXQoc2VsZiwgaSwgc3VjY2Vzc19yZXN1bHQpOgorICAgICAgICBzZWxmLl9udW1iZXJfbGVmdCAtPSAxCiAgICAgICAgIHN1Y2Nlc3MsIHJlc3VsdCA9IHN1Y2Nlc3NfcmVzdWx0Ci0gICAgICAgIGlmIHN1Y2Nlc3M6CisgICAgICAgIGlmIHN1Y2Nlc3MgYW5kIHNlbGYuX3N1Y2Nlc3M6CiAgICAgICAgICAgICBzZWxmLl92YWx1ZVtpKnNlbGYuX2NodW5rc2l6ZTooaSsxKSpzZWxmLl9jaHVua3NpemVdID0gcmVzdWx0Ci0gICAgICAgICAgICBzZWxmLl9udW1iZXJfbGVmdCAtPSAxCiAgICAgICAgICAgICBpZiBzZWxmLl9udW1iZXJfbGVmdCA9PSAwOgogICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgogICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYWxsYmFjayhzZWxmLl92YWx1ZSkKICAgICAgICAgICAgICAgICBkZWwgc2VsZi5fY2FjaGVbc2VsZi5fam9iXQogICAgICAgICAgICAgICAgIHNlbGYuX2V2ZW50LnNldCgpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLl9zdWNjZXNzID0gRmFsc2UKLSAgICAgICAgICAgIHNlbGYuX3ZhbHVlID0gcmVzdWx0Ci0gICAgICAgICAgICBpZiBzZWxmLl9lcnJvcl9jYWxsYmFjazoKLSAgICAgICAgICAgICAgICBzZWxmLl9lcnJvcl9jYWxsYmFjayhzZWxmLl92YWx1ZSkKLSAgICAgICAgICAgIGRlbCBzZWxmLl9jYWNoZVtzZWxmLl9qb2JdCi0gICAgICAgICAgICBzZWxmLl9ldmVudC5zZXQoKQorICAgICAgICAgICAgaWYgbm90IHN1Y2Nlc3MgYW5kIHNlbGYuX3N1Y2Nlc3M6CisgICAgICAgICAgICAgICAgIyBvbmx5IHN0b3JlIGZpcnN0IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHNlbGYuX3N1Y2Nlc3MgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuX3ZhbHVlID0gcmVzdWx0CisgICAgICAgICAgICBpZiBzZWxmLl9udW1iZXJfbGVmdCA9PSAwOgorICAgICAgICAgICAgICAgICMgb25seSBjb25zaWRlciB0aGUgcmVzdWx0IHJlYWR5IG9uY2UgYWxsIGpvYnMgYXJlIGRvbmUKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9lcnJvcl9jYWxsYmFjazoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXJyb3JfY2FsbGJhY2soc2VsZi5fdmFsdWUpCisgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2NhY2hlW3NlbGYuX2pvYl0KKyAgICAgICAgICAgICAgICBzZWxmLl9ldmVudC5zZXQoKQogCiAjCiAjIENsYXNzIHdob3NlIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgYnkgYFBvb2wuaW1hcCgpYApkaWZmIC0tZ2l0IGEvTGliL250cGF0aC5weSBiL0xpYi9udHBhdGgucHkKaW5kZXggYWY2YTcwOS4uYThmNGIzNyAxMDA2NDQKLS0tIGEvTGliL250cGF0aC5weQorKysgYi9MaWIvbnRwYXRoLnB5CkBAIC0yOCw4ICsyOCw2IEBACiBwYXRoc2VwID0gJzsnCiBhbHRzZXAgPSAnLycKIGRlZnBhdGggPSAnLjtDOlxcYmluJwotaWYgJ2NlJyBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6Ci0gICAgZGVmcGF0aCA9ICdcXFdpbmRvd3MnCiBkZXZudWxsID0gJ251bCcKIAogZGVmIF9nZXRfYm90aHNlcHMocGF0aCk6CkBAIC00Niw2ICs0NCw3IEBACiAgICAgIiIiTm9ybWFsaXplIGNhc2Ugb2YgcGF0aG5hbWUuCiAKICAgICBNYWtlcyBhbGwgY2hhcmFjdGVycyBsb3dlcmNhc2UgYW5kIGFsbCBzbGFzaGVzIGludG8gYmFja3NsYXNoZXMuIiIiCisgICAgcyA9IG9zLmZzcGF0aChzKQogICAgIHRyeToKICAgICAgICAgaWYgaXNpbnN0YW5jZShzLCBieXRlcyk6CiAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKGInLycsIGInXFwnKS5sb3dlcigpCkBAIC02NiwxMiArNjUsMTQgQEAKIAogZGVmIGlzYWJzKHMpOgogICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggaXMgYWJzb2x1dGUiIiIKKyAgICBzID0gb3MuZnNwYXRoKHMpCiAgICAgcyA9IHNwbGl0ZHJpdmUocylbMV0KICAgICByZXR1cm4gbGVuKHMpID4gMCBhbmQgc1swXSBpbiBfZ2V0X2JvdGhzZXBzKHMpCiAKIAogIyBKb2luIHR3byAob3IgbW9yZSkgcGF0aHMuCiBkZWYgam9pbihwYXRoLCAqcGF0aHMpOgorICAgIHBhdGggPSBvcy5mc3BhdGgocGF0aCkKICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIGJ5dGVzKToKICAgICAgICAgc2VwID0gYidcXCcKICAgICAgICAgc2VwcyA9IGInXFwvJwpAQCAtODQsNyArODUsNyBAQAogICAgICAgICBpZiBub3QgcGF0aHM6CiAgICAgICAgICAgICBwYXRoWzowXSArIHNlcCAgIzIzNzgwOiBFbnN1cmUgY29tcGF0aWJsZSBkYXRhIHR5cGUgZXZlbiBpZiBwIGlzIG51bGwuCiAgICAgICAgIHJlc3VsdF9kcml2ZSwgcmVzdWx0X3BhdGggPSBzcGxpdGRyaXZlKHBhdGgpCi0gICAgICAgIGZvciBwIGluIHBhdGhzOgorICAgICAgICBmb3IgcCBpbiBtYXAob3MuZnNwYXRoLCBwYXRocyk6CiAgICAgICAgICAgICBwX2RyaXZlLCBwX3BhdGggPSBzcGxpdGRyaXZlKHApCiAgICAgICAgICAgICBpZiBwX3BhdGggYW5kIHBfcGF0aFswXSBpbiBzZXBzOgogICAgICAgICAgICAgICAgICMgU2Vjb25kIHBhdGggaXMgYWJzb2x1dGUKQEAgLTEzNiw2ICsxMzcsNyBAQAogICAgIFBhdGhzIGNhbm5vdCBjb250YWluIGJvdGggYSBkcml2ZSBsZXR0ZXIgYW5kIGEgVU5DIHBhdGguCiAKICAgICAiIiIKKyAgICBwID0gb3MuZnNwYXRoKHApCiAgICAgaWYgbGVuKHApID49IDI6CiAgICAgICAgIGlmIGlzaW5zdGFuY2UocCwgYnl0ZXMpOgogICAgICAgICAgICAgc2VwID0gYidcXCcKQEAgLTE5OSw3ICsyMDEsNyBAQAogCiAgICAgUmV0dXJuIHR1cGxlIChoZWFkLCB0YWlsKSB3aGVyZSB0YWlsIGlzIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpbmFsIHNsYXNoLgogICAgIEVpdGhlciBwYXJ0IG1heSBiZSBlbXB0eS4iIiIKLQorICAgIHAgPSBvcy5mc3BhdGgocCkKICAgICBzZXBzID0gX2dldF9ib3Roc2VwcyhwKQogICAgIGQsIHAgPSBzcGxpdGRyaXZlKHApCiAgICAgIyBzZXQgaSB0byBpbmRleCBiZXlvbmQgcCdzIGxhc3Qgc2xhc2gKQEAgLTIxOCw2ICsyMjAsNyBAQAogIyBJdCBpcyBhbHdheXMgdHJ1ZSB0aGF0IHJvb3QgKyBleHQgPT0gcC4KIAogZGVmIHNwbGl0ZXh0KHApOgorICAgIHAgPSBvcy5mc3BhdGgocCkKICAgICBpZiBpc2luc3RhbmNlKHAsIGJ5dGVzKToKICAgICAgICAgcmV0dXJuIGdlbmVyaWNwYXRoLl9zcGxpdGV4dChwLCBiJ1xcJywgYicvJywgYicuJykKICAgICBlbHNlOgpAQCAtMjc4LDYgKzI4MSw3IEBACiBkZWYgaXNtb3VudChwYXRoKToKICAgICAiIiJUZXN0IHdoZXRoZXIgYSBwYXRoIGlzIGEgbW91bnQgcG9pbnQgKGEgZHJpdmUgcm9vdCwgdGhlIHJvb3Qgb2YgYQogICAgIHNoYXJlLCBvciBhIG1vdW50ZWQgdm9sdW1lKSIiIgorICAgIHBhdGggPSBvcy5mc3BhdGgocGF0aCkKICAgICBzZXBzID0gX2dldF9ib3Roc2VwcyhwYXRoKQogICAgIHBhdGggPSBhYnNwYXRoKHBhdGgpCiAgICAgcm9vdCwgcmVzdCA9IHNwbGl0ZHJpdmUocGF0aCkKQEAgLTMwNSw2ICszMDksNyBAQAogICAgICIiIkV4cGFuZCB+IGFuZCB+dXNlciBjb25zdHJ1Y3RzLgogCiAgICAgSWYgdXNlciBvciAkSE9NRSBpcyB1bmtub3duLCBkbyBub3RoaW5nLiIiIgorICAgIHBhdGggPSBvcy5mc3BhdGgocGF0aCkKICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIGJ5dGVzKToKICAgICAgICAgdGlsZGUgPSBiJ34nCiAgICAgZWxzZToKQEAgLTM1NCw2ICszNTksNyBAQAogICAgICIiIkV4cGFuZCBzaGVsbCB2YXJpYWJsZXMgb2YgdGhlIGZvcm1zICR2YXIsICR7dmFyfSBhbmQgJXZhciUuCiAKICAgICBVbmtub3duIHZhcmlhYmxlcyBhcmUgbGVmdCB1bmNoYW5nZWQuIiIiCisgICAgcGF0aCA9IG9zLmZzcGF0aChwYXRoKQogICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgYnl0ZXMpOgogICAgICAgICBpZiBiJyQnIG5vdCBpbiBwYXRoIGFuZCBiJyUnIG5vdCBpbiBwYXRoOgogICAgICAgICAgICAgcmV0dXJuIHBhdGgKQEAgLTQ2NCw2ICs0NzAsNyBAQAogCiBkZWYgbm9ybXBhdGgocGF0aCk6CiAgICAgIiIiTm9ybWFsaXplIHBhdGgsIGVsaW1pbmF0aW5nIGRvdWJsZSBzbGFzaGVzLCBldGMuIiIiCisgICAgcGF0aCA9IG9zLmZzcGF0aChwYXRoKQogICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgYnl0ZXMpOgogICAgICAgICBzZXAgPSBiJ1xcJwogICAgICAgICBhbHRzZXAgPSBiJy8nCkBAIC01MTgsNiArNTI1LDcgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjogIyBub3QgcnVubmluZyBvbiBXaW5kb3dzIC0gbW9jayB1cCBzb21ldGhpbmcgc2Vuc2libGUKICAgICBkZWYgYWJzcGF0aChwYXRoKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBhYnNvbHV0ZSB2ZXJzaW9uIG9mIGEgcGF0aC4iIiIKKyAgICAgICAgcGF0aCA9IG9zLmZzcGF0aChwYXRoKQogICAgICAgICBpZiBub3QgaXNhYnMocGF0aCk6CiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIGJ5dGVzKToKICAgICAgICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2RiKCkKQEAgLTUzMSw2ICs1MzksNyBAQAogICAgICAgICAiIiJSZXR1cm4gdGhlIGFic29sdXRlIHZlcnNpb24gb2YgYSBwYXRoLiIiIgogCiAgICAgICAgIGlmIHBhdGg6ICMgRW1wdHkgcGF0aCBtdXN0IHJldHVybiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAgICAgICAgcGF0aCA9IG9zLmZzcGF0aChwYXRoKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHBhdGggPSBfZ2V0ZnVsbHBhdGhuYW1lKHBhdGgpCiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKQEAgLTU0OSw2ICs1NTgsNyBAQAogCiBkZWYgcmVscGF0aChwYXRoLCBzdGFydD1Ob25lKToKICAgICAiIiJSZXR1cm4gYSByZWxhdGl2ZSB2ZXJzaW9uIG9mIGEgcGF0aCIiIgorICAgIHBhdGggPSBvcy5mc3BhdGgocGF0aCkKICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIGJ5dGVzKToKICAgICAgICAgc2VwID0gYidcXCcKICAgICAgICAgY3VyZGlyID0gYicuJwpAQCAtNTY0LDYgKzU3NCw3IEBACiAgICAgaWYgbm90IHBhdGg6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vIHBhdGggc3BlY2lmaWVkIikKIAorICAgIHN0YXJ0ID0gb3MuZnNwYXRoKHN0YXJ0KQogICAgIHRyeToKICAgICAgICAgc3RhcnRfYWJzID0gYWJzcGF0aChub3JtcGF0aChzdGFydCkpCiAgICAgICAgIHBhdGhfYWJzID0gYWJzcGF0aChub3JtcGF0aChwYXRoKSkKQEAgLTYwNyw2ICs2MTgsNyBAQAogICAgIGlmIG5vdCBwYXRoczoKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignY29tbW9ucGF0aCgpIGFyZyBpcyBhbiBlbXB0eSBzZXF1ZW5jZScpCiAKKyAgICBwYXRocyA9IHR1cGxlKG1hcChvcy5mc3BhdGgsIHBhdGhzKSkKICAgICBpZiBpc2luc3RhbmNlKHBhdGhzWzBdLCBieXRlcyk6CiAgICAgICAgIHNlcCA9IGInXFwnCiAgICAgICAgIGFsdHNlcCA9IGInLycKZGlmZiAtLWdpdCBhL0xpYi9vcGNvZGUucHkgYi9MaWIvb3Bjb2RlLnB5CmluZGV4IDRjODI2YTcuLmJlMjY0NzUgMTAwNjQ0Ci0tLSBhL0xpYi9vcGNvZGUucHkKKysrIGIvTGliL29wY29kZS5weQpAQCAtMzEsMTIgKzMxLDEwIEBACiBoYXNsb2NhbCA9IFtdCiBoYXNjb21wYXJlID0gW10KIGhhc2ZyZWUgPSBbXQotaGFzbmFyZ3MgPSBbXQoraGFzbmFyZ3MgPSBbXSAjIHVudXNlZAogCiBvcG1hcCA9IHt9Ci1vcG5hbWUgPSBbJyddICogMjU2Ci1mb3Igb3AgaW4gcmFuZ2UoMjU2KTogb3BuYW1lW29wXSA9ICc8JXI+JyAlIChvcCwpCi1kZWwgb3AKK29wbmFtZSA9IFsnPCVyPicgJSAob3AsKSBmb3Igb3AgaW4gcmFuZ2UoMjU2KV0KIAogZGVmIGRlZl9vcChuYW1lLCBvcCk6CiAgICAgb3BuYW1lW29wXSA9IG5hbWUKQEAgLTEyMSw3ICsxMTksNyBAQAogCiBkZWZfb3AoJ1JFVFVSTl9WQUxVRScsIDgzKQogZGVmX29wKCdJTVBPUlRfU1RBUicsIDg0KQotCitkZWZfb3AoJ1NFVFVQX0FOTk9UQVRJT05TJywgODUpCiBkZWZfb3AoJ1lJRUxEX1ZBTFVFJywgODYpCiBkZWZfb3AoJ1BPUF9CTE9DSycsIDg3KQogZGVmX29wKCdFTkRfRklOQUxMWScsIDg4KQpAQCAtMTcxLDEzICsxNjksMTIgQEAKIGhhc2xvY2FsLmFwcGVuZCgxMjUpCiBkZWZfb3AoJ0RFTEVURV9GQVNUJywgMTI2KSAgICAgICMgTG9jYWwgdmFyaWFibGUgbnVtYmVyCiBoYXNsb2NhbC5hcHBlbmQoMTI2KQorbmFtZV9vcCgnU1RPUkVfQU5OT1RBVElPTicsIDEyNykgIyBJbmRleCBpbiBuYW1lIGxpc3QKIAogZGVmX29wKCdSQUlTRV9WQVJBUkdTJywgMTMwKSAgICAjIE51bWJlciBvZiByYWlzZSBhcmd1bWVudHMgKDEsIDIsIG9yIDMpCi1kZWZfb3AoJ0NBTExfRlVOQ1RJT04nLCAxMzEpICAgICMgI2FyZ3MgKyAoI2t3YXJncyA8PCA4KQotaGFzbmFyZ3MuYXBwZW5kKDEzMSkKLWRlZl9vcCgnTUFLRV9GVU5DVElPTicsIDEzMikgICAgIyBOdW1iZXIgb2YgYXJncyB3aXRoIGRlZmF1bHQgdmFsdWVzCitkZWZfb3AoJ0NBTExfRlVOQ1RJT04nLCAxMzEpICAgICMgI2FyZ3MKK2RlZl9vcCgnTUFLRV9GVU5DVElPTicsIDEzMikgICAgIyBGbGFncwogZGVmX29wKCdCVUlMRF9TTElDRScsIDEzMykgICAgICAjIE51bWJlciBvZiBpdGVtcwotZGVmX29wKCdNQUtFX0NMT1NVUkUnLCAxMzQpCiBkZWZfb3AoJ0xPQURfQ0xPU1VSRScsIDEzNSkKIGhhc2ZyZWUuYXBwZW5kKDEzNSkKIGRlZl9vcCgnTE9BRF9ERVJFRicsIDEzNikKQEAgLTE4NywxMiArMTg0LDggQEAKIGRlZl9vcCgnREVMRVRFX0RFUkVGJywgMTM4KQogaGFzZnJlZS5hcHBlbmQoMTM4KQogCi1kZWZfb3AoJ0NBTExfRlVOQ1RJT05fVkFSJywgMTQwKSAgICAgIyAjYXJncyArICgja3dhcmdzIDw8IDgpCi1oYXNuYXJncy5hcHBlbmQoMTQwKQotZGVmX29wKCdDQUxMX0ZVTkNUSU9OX0tXJywgMTQxKSAgICAgICMgI2FyZ3MgKyAoI2t3YXJncyA8PCA4KQotaGFzbmFyZ3MuYXBwZW5kKDE0MSkKLWRlZl9vcCgnQ0FMTF9GVU5DVElPTl9WQVJfS1cnLCAxNDIpICAjICNhcmdzICsgKCNrd2FyZ3MgPDwgOCkKLWhhc25hcmdzLmFwcGVuZCgxNDIpCitkZWZfb3AoJ0NBTExfRlVOQ1RJT05fS1cnLCAxNDEpICAjICNhcmdzICsgI2t3YXJncworZGVmX29wKCdDQUxMX0ZVTkNUSU9OX0VYJywgMTQyKSAgIyBGbGFncwogCiBqcmVsX29wKCdTRVRVUF9XSVRIJywgMTQzKQogCkBAIC0yMTQsNCArMjA3LDggQEAKIGRlZl9vcCgnQlVJTERfVFVQTEVfVU5QQUNLJywgMTUyKQogZGVmX29wKCdCVUlMRF9TRVRfVU5QQUNLJywgMTUzKQogCitkZWZfb3AoJ0ZPUk1BVF9WQUxVRScsIDE1NSkKK2RlZl9vcCgnQlVJTERfQ09OU1RfS0VZX01BUCcsIDE1NikKK2RlZl9vcCgnQlVJTERfU1RSSU5HJywgMTU3KQorCiBkZWwgZGVmX29wLCBuYW1lX29wLCBqcmVsX29wLCBqYWJzX29wCmRpZmYgLS1naXQgYS9MaWIvb3B0cGFyc2UucHkgYi9MaWIvb3B0cGFyc2UucHkKaW5kZXggNzRiM2IzNi4uZThhYzFlMSAxMDA2NDQKLS0tIGEvTGliL29wdHBhcnNlLnB5CisrKyBiL0xpYi9vcHRwYXJzZS5weQpAQCAtMzgsNyArMzgsOCBAQAogICAgICAgICAgICAnT3B0aW9uRXJyb3InLAogICAgICAgICAgICAnT3B0aW9uQ29uZmxpY3RFcnJvcicsCiAgICAgICAgICAgICdPcHRpb25WYWx1ZUVycm9yJywKLSAgICAgICAgICAgJ0JhZE9wdGlvbkVycm9yJ10KKyAgICAgICAgICAgJ0JhZE9wdGlvbkVycm9yJywKKyAgICAgICAgICAgJ2NoZWNrX2Nob2ljZSddCiAKIF9fY29weXJpZ2h0X18gPSAiIiIKIENvcHlyaWdodCAoYykgMjAwMS0yMDA2IEdyZWdvcnkgUC4gV2FyZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCmRpZmYgLS1naXQgYS9MaWIvb3MucHkgYi9MaWIvb3MucHkKaW5kZXggYjRjNjUxZC4uNzM3OWRhZCAxMDA2NDQKLS0tIGEvTGliL29zLnB5CisrKyBiL0xpYi9vcy5weQpAQCAtMSw5ICsxLDkgQEAKIHIiIiJPUyByb3V0aW5lcyBmb3IgTlQgb3IgUG9zaXggZGVwZW5kaW5nIG9uIHdoYXQgc3lzdGVtIHdlJ3JlIG9uLgogCiBUaGlzIGV4cG9ydHM6Ci0gIC0gYWxsIGZ1bmN0aW9ucyBmcm9tIHBvc2l4LCBudCBvciBjZSwgZS5nLiB1bmxpbmssIHN0YXQsIGV0Yy4KKyAgLSBhbGwgZnVuY3Rpb25zIGZyb20gcG9zaXggb3IgbnQsIGUuZy4gdW5saW5rLCBzdGF0LCBldGMuCiAgIC0gb3MucGF0aCBpcyBlaXRoZXIgcG9zaXhwYXRoIG9yIG50cGF0aAotICAtIG9zLm5hbWUgaXMgZWl0aGVyICdwb3NpeCcsICdudCcgb3IgJ2NlJy4KKyAgLSBvcy5uYW1lIGlzIGVpdGhlciAncG9zaXgnIG9yICdudCcKICAgLSBvcy5jdXJkaXIgaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAoJy4nIG9yICc6JykKICAgLSBvcy5wYXJkaXIgaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICgnLi4nIG9yICc6OicpCiAgIC0gb3Muc2VwIGlzIHRoZSAob3IgYSBtb3N0IGNvbW1vbikgcGF0aG5hbWUgc2VwYXJhdG9yICgnLycgb3IgJzonIG9yICdcXCcpCkBAIC0yMiw3ICsyMiw3IEBACiAiIiIKIAogIycKLQoraW1wb3J0IGFiYwogaW1wb3J0IHN5cywgZXJybm8KIGltcG9ydCBzdGF0IGFzIHN0CiAKQEAgLTg1LDI3ICs4NSw2IEBACiAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICBwYXNzCiAKLWVsaWYgJ2NlJyBpbiBfbmFtZXM6Ci0gICAgbmFtZSA9ICdjZScKLSAgICBsaW5lc2VwID0gJ1xyXG4nCi0gICAgZnJvbSBjZSBpbXBvcnQgKgotICAgIHRyeToKLSAgICAgICAgZnJvbSBjZSBpbXBvcnQgX2V4aXQKLSAgICAgICAgX19hbGxfXy5hcHBlbmQoJ19leGl0JykKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICAjIFdlIGNhbiB1c2UgdGhlIHN0YW5kYXJkIFdpbmRvd3MgcGF0aC4KLSAgICBpbXBvcnQgbnRwYXRoIGFzIHBhdGgKLQotICAgIGltcG9ydCBjZQotICAgIF9fYWxsX18uZXh0ZW5kKF9nZXRfZXhwb3J0c19saXN0KGNlKSkKLSAgICBkZWwgY2UKLQotICAgIHRyeToKLSAgICAgICAgZnJvbSBjZSBpbXBvcnQgX2hhdmVfZnVuY3Rpb25zCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBwYXNzCi0KIGVsc2U6CiAgICAgcmFpc2UgSW1wb3J0RXJyb3IoJ25vIG9zIHNwZWNpZmljIG1vZHVsZSBmb3VuZCcpCiAKQEAgLTM1Myw5ICszMzIsMTAgQEAKICAgICAgICAgICAgIGRpcnMucmVtb3ZlKCdDVlMnKSAgIyBkb24ndCB2aXNpdCBDVlMgZGlyZWN0b3JpZXMKIAogICAgICIiIgotCisgICAgdG9wID0gZnNwYXRoKHRvcCkKICAgICBkaXJzID0gW10KICAgICBub25kaXJzID0gW10KKyAgICB3YWxrX2RpcnMgPSBbXQogCiAgICAgIyBXZSBtYXkgbm90IGhhdmUgcmVhZCBwZXJtaXNzaW9uIGZvciB0b3AsIGluIHdoaWNoIGNhc2Ugd2UgY2FuJ3QKICAgICAjIGdldCBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoZSBkaXJlY3RvcnkgY29udGFpbnMuICBvcy53YWxrCkBAIC0zNjksNDIgKzM0OSw1MiBAQAogICAgICAgICAgICAgIyBOb3RlIHRoYXQgc2NhbmRpciBpcyBnbG9iYWwgaW4gdGhpcyBtb2R1bGUgZHVlCiAgICAgICAgICAgICAjIHRvIGVhcmxpZXIgaW1wb3J0LSouCiAgICAgICAgICAgICBzY2FuZGlyX2l0ID0gc2NhbmRpcih0b3ApCi0gICAgICAgIGVudHJpZXMgPSBsaXN0KHNjYW5kaXJfaXQpCiAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyb3I6CiAgICAgICAgIGlmIG9uZXJyb3IgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBvbmVycm9yKGVycm9yKQogICAgICAgICByZXR1cm4KIAotICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpc19kaXIgPSBlbnRyeS5pc19kaXIoKQotICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICMgSWYgaXNfZGlyKCkgcmFpc2VzIGFuIE9TRXJyb3IsIGNvbnNpZGVyIHRoYXQgdGhlIGVudHJ5IGlzIG5vdAotICAgICAgICAgICAgIyBhIGRpcmVjdG9yeSwgc2FtZSBiZWhhdmlvdXIgdGhhbiBvcy5wYXRoLmlzZGlyKCkuCi0gICAgICAgICAgICBpc19kaXIgPSBGYWxzZQotCi0gICAgICAgIGlmIGlzX2RpcjoKLSAgICAgICAgICAgIGRpcnMuYXBwZW5kKGVudHJ5Lm5hbWUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBub25kaXJzLmFwcGVuZChlbnRyeS5uYW1lKQotCi0gICAgICAgIGlmIG5vdCB0b3Bkb3duIGFuZCBpc19kaXI6Ci0gICAgICAgICAgICAjIEJvdHRvbS11cDogcmVjdXJzZSBpbnRvIHN1Yi1kaXJlY3RvcnksIGJ1dCBleGNsdWRlIHN5bWxpbmtzIHRvCi0gICAgICAgICAgICAjIGRpcmVjdG9yaWVzIGlmIGZvbGxvd2xpbmtzIGlzIEZhbHNlCi0gICAgICAgICAgICBpZiBmb2xsb3dsaW5rczoKLSAgICAgICAgICAgICAgICB3YWxrX2ludG8gPSBUcnVlCi0gICAgICAgICAgICBlbHNlOgorICAgIHdpdGggc2NhbmRpcl9pdDoKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGlzX3N5bWxpbmsgPSBlbnRyeS5pc19zeW1saW5rKCkKLSAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgIyBJZiBpc19zeW1saW5rKCkgcmFpc2VzIGFuIE9TRXJyb3IsIGNvbnNpZGVyIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICMgZW50cnkgaXMgbm90IGEgc3ltYm9saWMgbGluaywgc2FtZSBiZWhhdmlvdXIgdGhhbgotICAgICAgICAgICAgICAgICAgICAjIG9zLnBhdGguaXNsaW5rKCkuCi0gICAgICAgICAgICAgICAgICAgIGlzX3N5bWxpbmsgPSBGYWxzZQotICAgICAgICAgICAgICAgIHdhbGtfaW50byA9IG5vdCBpc19zeW1saW5rCisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV4dChzY2FuZGlyX2l0KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyb3I6CisgICAgICAgICAgICAgICAgaWYgb25lcnJvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb25lcnJvcihlcnJvcikKKyAgICAgICAgICAgICAgICByZXR1cm4KIAotICAgICAgICAgICAgaWYgd2Fsa19pbnRvOgotICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gd2FsayhlbnRyeS5wYXRoLCB0b3Bkb3duLCBvbmVycm9yLCBmb2xsb3dsaW5rcykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpc19kaXIgPSBlbnRyeS5pc19kaXIoKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgIyBJZiBpc19kaXIoKSByYWlzZXMgYW4gT1NFcnJvciwgY29uc2lkZXIgdGhhdCB0aGUgZW50cnkgaXMgbm90CisgICAgICAgICAgICAgICAgIyBhIGRpcmVjdG9yeSwgc2FtZSBiZWhhdmlvdXIgdGhhbiBvcy5wYXRoLmlzZGlyKCkuCisgICAgICAgICAgICAgICAgaXNfZGlyID0gRmFsc2UKKworICAgICAgICAgICAgaWYgaXNfZGlyOgorICAgICAgICAgICAgICAgIGRpcnMuYXBwZW5kKGVudHJ5Lm5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5vbmRpcnMuYXBwZW5kKGVudHJ5Lm5hbWUpCisKKyAgICAgICAgICAgIGlmIG5vdCB0b3Bkb3duIGFuZCBpc19kaXI6CisgICAgICAgICAgICAgICAgIyBCb3R0b20tdXA6IHJlY3Vyc2UgaW50byBzdWItZGlyZWN0b3J5LCBidXQgZXhjbHVkZSBzeW1saW5rcyB0bworICAgICAgICAgICAgICAgICMgZGlyZWN0b3JpZXMgaWYgZm9sbG93bGlua3MgaXMgRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBmb2xsb3dsaW5rczoKKyAgICAgICAgICAgICAgICAgICAgd2Fsa19pbnRvID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N5bWxpbmsgPSBlbnRyeS5pc19zeW1saW5rKCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAjIElmIGlzX3N5bWxpbmsoKSByYWlzZXMgYW4gT1NFcnJvciwgY29uc2lkZXIgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZW50cnkgaXMgbm90IGEgc3ltYm9saWMgbGluaywgc2FtZSBiZWhhdmlvdXIgdGhhbgorICAgICAgICAgICAgICAgICAgICAgICAgIyBvcy5wYXRoLmlzbGluaygpLgorICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3ltbGluayA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIHdhbGtfaW50byA9IG5vdCBpc19zeW1saW5rCisKKyAgICAgICAgICAgICAgICBpZiB3YWxrX2ludG86CisgICAgICAgICAgICAgICAgICAgIHdhbGtfZGlycy5hcHBlbmQoZW50cnkucGF0aCkKIAogICAgICMgWWllbGQgYmVmb3JlIHJlY3Vyc2lvbiBpZiBnb2luZyB0b3AgZG93bgogICAgIGlmIHRvcGRvd246CkBAIC00MjEsNiArNDExLDkgQEAKICAgICAgICAgICAgIGlmIGZvbGxvd2xpbmtzIG9yIG5vdCBpc2xpbmsobmV3X3BhdGgpOgogICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gd2FsayhuZXdfcGF0aCwgdG9wZG93biwgb25lcnJvciwgZm9sbG93bGlua3MpCiAgICAgZWxzZToKKyAgICAgICAgIyBSZWN1cnNlIGludG8gc3ViLWRpcmVjdG9yaWVzCisgICAgICAgIGZvciBuZXdfcGF0aCBpbiB3YWxrX2RpcnM6CisgICAgICAgICAgICB5aWVsZCBmcm9tIHdhbGsobmV3X3BhdGgsIHRvcGRvd24sIG9uZXJyb3IsIGZvbGxvd2xpbmtzKQogICAgICAgICAjIFlpZWxkIGFmdGVyIHJlY3Vyc2lvbiBpZiBnb2luZyBib3R0b20gdXAKICAgICAgICAgeWllbGQgdG9wLCBkaXJzLCBub25kaXJzCiAKQEAgLTQ2NywxMCArNDYwLDIzIEBACiAgICAgICAgIHN0YXQgPSBzZWxmLnN0YXQoZm9sbG93X3N5bWxpbmtzPUZhbHNlKQogICAgICAgICByZXR1cm4gc3QuU19JU0xOSyhzdGF0LnN0X21vZGUpCiAKLWRlZiBfZHVtbXlfc2NhbmRpcihkaXIpOgorY2xhc3MgX2R1bW15X3NjYW5kaXI6CiAgICAgIyBsaXN0ZGlyLWJhc2VkIGltcGxlbWVudGF0aW9uIGZvciBieXRlcyBwYXRjaGVzIG9uIFdpbmRvd3MKLSAgICBmb3IgbmFtZSBpbiBsaXN0ZGlyKGRpcik6Ci0gICAgICAgIHlpZWxkIF9EdW1teURpckVudHJ5KGRpciwgbmFtZSkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyKToKKyAgICAgICAgc2VsZi5kaXIgPSBkaXIKKyAgICAgICAgc2VsZi5pdCA9IGl0ZXIobGlzdGRpcihkaXIpKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fbmV4dF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gX0R1bW15RGlyRW50cnkoc2VsZi5kaXIsIG5leHQoc2VsZi5pdCkpCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5pdCA9IGl0ZXIoKCkpCiAKIF9fYWxsX18uYXBwZW5kKCJ3YWxrIikKIApAQCAtNTA5LDYgKzUxNSw4IEBACiAgICAgICAgICAgICBpZiAnQ1ZTJyBpbiBkaXJzOgogICAgICAgICAgICAgICAgIGRpcnMucmVtb3ZlKCdDVlMnKSAgIyBkb24ndCB2aXNpdCBDVlMgZGlyZWN0b3JpZXMKICAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRvcCwgaW50KSBvciBub3QgaGFzYXR0cih0b3AsICdfX2luZGV4X18nKToKKyAgICAgICAgICAgIHRvcCA9IGZzcGF0aCh0b3ApCiAgICAgICAgICMgTm90ZTogVG8gZ3VhcmQgYWdhaW5zdCBzeW1saW5rIHJhY2VzLCB3ZSB1c2UgdGhlIHN0YW5kYXJkCiAgICAgICAgICMgbHN0YXQoKS9vcGVuKCkvZnN0YXQoKSB0cmljay4KICAgICAgICAgb3JpZ19zdCA9IHN0YXQodG9wLCBmb2xsb3dfc3ltbGlua3M9RmFsc2UsIGRpcl9mZD1kaXJfZmQpCkBAIC04NDMsMzYgKzg1MSwzMSBAQAogCiBkZWYgX2ZzY29kZWMoKToKICAgICBlbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQotICAgIGlmIGVuY29kaW5nID09ICdtYmNzJzoKLSAgICAgICAgZXJyb3JzID0gJ3N0cmljdCcKLSAgICBlbHNlOgotICAgICAgICBlcnJvcnMgPSAnc3Vycm9nYXRlZXNjYXBlJworICAgIGVycm9ycyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RlZXJyb3JzKCkKIAogICAgIGRlZiBmc2VuY29kZShmaWxlbmFtZSk6CisgICAgICAgICIiIkVuY29kZSBmaWxlbmFtZSAoYW4gb3MuUGF0aExpa2UsIGJ5dGVzLCBvciBzdHIpIHRvIHRoZSBmaWxlc3lzdGVtCisgICAgICAgIGVuY29kaW5nIHdpdGggJ3N1cnJvZ2F0ZWVzY2FwZScgZXJyb3IgaGFuZGxlciwgcmV0dXJuIGJ5dGVzIHVuY2hhbmdlZC4KKyAgICAgICAgT24gV2luZG93cywgdXNlICdzdHJpY3QnIGVycm9yIGhhbmRsZXIgaWYgdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nIGlzCisgICAgICAgICdtYmNzJyAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgogICAgICAgICAiIiIKLSAgICAgICAgRW5jb2RlIGZpbGVuYW1lIHRvIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nIHdpdGggJ3N1cnJvZ2F0ZWVzY2FwZScgZXJyb3IKLSAgICAgICAgaGFuZGxlciwgcmV0dXJuIGJ5dGVzIHVuY2hhbmdlZC4gT24gV2luZG93cywgdXNlICdzdHJpY3QnIGVycm9yIGhhbmRsZXIgaWYKLSAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nIGlzICdtYmNzJyAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgotICAgICAgICAiIiIKLSAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgYnl0ZXMpOgotICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCi0gICAgICAgIGVsaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgc3RyKToKKyAgICAgICAgZmlsZW5hbWUgPSBmc3BhdGgoZmlsZW5hbWUpICAjIERvZXMgdHlwZS1jaGVja2luZyBvZiBgZmlsZW5hbWVgLgorICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBzdHIpOgogICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmVuY29kZShlbmNvZGluZywgZXJyb3JzKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3QgYnl0ZXMgb3Igc3RyLCBub3QgJXMiICUgdHlwZShmaWxlbmFtZSkuX19uYW1lX18pCisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKIAogICAgIGRlZiBmc2RlY29kZShmaWxlbmFtZSk6CisgICAgICAgICIiIkRlY29kZSBmaWxlbmFtZSAoYW4gb3MuUGF0aExpa2UsIGJ5dGVzLCBvciBzdHIpIGZyb20gdGhlIGZpbGVzeXN0ZW0KKyAgICAgICAgZW5jb2Rpbmcgd2l0aCAnc3Vycm9nYXRlZXNjYXBlJyBlcnJvciBoYW5kbGVyLCByZXR1cm4gc3RyIHVuY2hhbmdlZC4gT24KKyAgICAgICAgV2luZG93cywgdXNlICdzdHJpY3QnIGVycm9yIGhhbmRsZXIgaWYgdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nIGlzCisgICAgICAgICdtYmNzJyAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgogICAgICAgICAiIiIKLSAgICAgICAgRGVjb2RlIGZpbGVuYW1lIGZyb20gdGhlIGZpbGVzeXN0ZW0gZW5jb2Rpbmcgd2l0aCAnc3Vycm9nYXRlZXNjYXBlJyBlcnJvcgotICAgICAgICBoYW5kbGVyLCByZXR1cm4gc3RyIHVuY2hhbmdlZC4gT24gV2luZG93cywgdXNlICdzdHJpY3QnIGVycm9yIGhhbmRsZXIgaWYKLSAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nIGlzICdtYmNzJyAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgotICAgICAgICAiIiIKLSAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgc3RyKToKLSAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQotICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIGJ5dGVzKToKKyAgICAgICAgZmlsZW5hbWUgPSBmc3BhdGgoZmlsZW5hbWUpICAjIERvZXMgdHlwZS1jaGVja2luZyBvZiBgZmlsZW5hbWVgLgorICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBieXRlcyk6CiAgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuZGVjb2RlKGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdCBieXRlcyBvciBzdHIsIG5vdCAlcyIgJSB0eXBlKGZpbGVuYW1lKS5fX25hbWVfXykKKyAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQogCiAgICAgcmV0dXJuIGZzZW5jb2RlLCBmc2RlY29kZQogCkBAIC0xMDcwLDMgKzEwNzMsNTUgQEAKICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIGZkIHR5cGUgKCVzLCBleHBlY3RlZCBpbnRlZ2VyKSIgJSB0eXBlKGZkKSkKICAgICBpbXBvcnQgaW8KICAgICByZXR1cm4gaW8ub3BlbihmZCwgKmFyZ3MsICoqa3dhcmdzKQorCisKKyMgRm9yIHRlc3RpbmcgcHVycG9zZXMsIG1ha2Ugc3VyZSB0aGUgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHdoZW4gdGhlIEMKKyMgaW1wbGVtZW50YXRpb24gZXhpc3RzLgorZGVmIF9mc3BhdGgocGF0aCk6CisgICAgIiIiUmV0dXJuIHRoZSBwYXRoIHJlcHJlc2VudGF0aW9uIG9mIGEgcGF0aC1saWtlIG9iamVjdC4KKworICAgIElmIHN0ciBvciBieXRlcyBpcyBwYXNzZWQgaW4sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4gT3RoZXJ3aXNlIHRoZQorICAgIG9zLlBhdGhMaWtlIGludGVyZmFjZSBpcyB1c2VkIHRvIGdldCB0aGUgcGF0aCByZXByZXNlbnRhdGlvbi4gSWYgdGhlCisgICAgcGF0aCByZXByZXNlbnRhdGlvbiBpcyBub3Qgc3RyIG9yIGJ5dGVzLCBUeXBlRXJyb3IgaXMgcmFpc2VkLiBJZiB0aGUKKyAgICBwcm92aWRlZCBwYXRoIGlzIG5vdCBzdHIsIGJ5dGVzLCBvciBvcy5QYXRoTGlrZSwgVHlwZUVycm9yIGlzIHJhaXNlZC4KKyAgICAiIiIKKyAgICBpZiBpc2luc3RhbmNlKHBhdGgsIChzdHIsIGJ5dGVzKSk6CisgICAgICAgIHJldHVybiBwYXRoCisKKyAgICAjIFdvcmsgZnJvbSB0aGUgb2JqZWN0J3MgdHlwZSB0byBtYXRjaCBtZXRob2QgcmVzb2x1dGlvbiBvZiBvdGhlciBtYWdpYworICAgICMgbWV0aG9kcy4KKyAgICBwYXRoX3R5cGUgPSB0eXBlKHBhdGgpCisgICAgdHJ5OgorICAgICAgICBwYXRoX3JlcHIgPSBwYXRoX3R5cGUuX19mc3BhdGhfXyhwYXRoKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgaWYgaGFzYXR0cihwYXRoX3R5cGUsICdfX2ZzcGF0aF9fJyk6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3RlZCBzdHIsIGJ5dGVzIG9yIG9zLlBhdGhMaWtlIG9iamVjdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgIiArIHBhdGhfdHlwZS5fX25hbWVfXykKKyAgICBpZiBpc2luc3RhbmNlKHBhdGhfcmVwciwgKHN0ciwgYnl0ZXMpKToKKyAgICAgICAgcmV0dXJuIHBhdGhfcmVwcgorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXhwZWN0ZWQge30uX19mc3BhdGhfXygpIHRvIHJldHVybiBzdHIgb3IgYnl0ZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3Qge30iLmZvcm1hdChwYXRoX3R5cGUuX19uYW1lX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShwYXRoX3JlcHIpLl9fbmFtZV9fKSkKKworIyBJZiB0aGVyZSBpcyBubyBDIGltcGxlbWVudGF0aW9uLCBtYWtlIHRoZSBwdXJlIFB5dGhvbiB2ZXJzaW9uIHRoZQorIyBpbXBsZW1lbnRhdGlvbiBhcyB0cmFuc3BhcmVudGx5IGFzIHBvc3NpYmxlLgoraWYgbm90IF9leGlzdHMoJ2ZzcGF0aCcpOgorICAgIGZzcGF0aCA9IF9mc3BhdGgKKyAgICBmc3BhdGguX19uYW1lX18gPSAiZnNwYXRoIgorCisKK2NsYXNzIFBhdGhMaWtlKGFiYy5BQkMpOgorCisgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHByb3RvY29sLiIiIgorCisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2ZzcGF0aF9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHBhdGggcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBzdWJjbGFzcyk6CisgICAgICAgIHJldHVybiBoYXNhdHRyKHN1YmNsYXNzLCAnX19mc3BhdGhfXycpCmRpZmYgLS1naXQgYS9MaWIvcGF0aGxpYi5weSBiL0xpYi9wYXRobGliLnB5CmluZGV4IDE0ODBlMmYuLjFiNWFiMzggMTAwNjQ0Ci0tLSBhL0xpYi9wYXRobGliLnB5CisrKyBiL0xpYi9wYXRobGliLnB5CkBAIC0zODUsNiArMzg1LDggQEAKIAogICAgIGxpc3RkaXIgPSBfd3JhcF9zdHJmdW5jKG9zLmxpc3RkaXIpCiAKKyAgICBzY2FuZGlyID0gX3dyYXBfc3RyZnVuYyhvcy5zY2FuZGlyKQorCiAgICAgY2htb2QgPSBfd3JhcF9zdHJmdW5jKG9zLmNobW9kKQogCiAgICAgaWYgaGFzYXR0cihvcywgImxjaG1vZCIpOgpAQCAtNDI5LDI1ICs0MzEsNiBAQAogIyBHbG9iYmluZyBoZWxwZXJzCiAjCiAKLUBjb250ZXh0bWFuYWdlcgotZGVmIF9jYWNoZWQoZnVuYyk6Ci0gICAgdHJ5OgotICAgICAgICBmdW5jLl9fY2FjaGVkX18KLSAgICAgICAgeWllbGQgZnVuYwotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgY2FjaGUgPSB7fQotICAgICAgICBkZWYgd3JhcHBlcigqYXJncyk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlW2FyZ3NdCi0gICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBjYWNoZVthcmdzXSA9IGZ1bmMoKmFyZ3MpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlCi0gICAgICAgIHdyYXBwZXIuX19jYWNoZWRfXyA9IFRydWUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgeWllbGQgd3JhcHBlcgotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQotCiBkZWYgX21ha2Vfc2VsZWN0b3IocGF0dGVybl9wYXJ0cyk6CiAgICAgcGF0ID0gcGF0dGVybl9wYXJ0c1swXQogICAgIGNoaWxkX3BhcnRzID0gcGF0dGVybl9wYXJ0c1sxOl0KQEAgLTQ3Myw4ICs0NTYsMTAgQEAKICAgICAgICAgc2VsZi5jaGlsZF9wYXJ0cyA9IGNoaWxkX3BhcnRzCiAgICAgICAgIGlmIGNoaWxkX3BhcnRzOgogICAgICAgICAgICAgc2VsZi5zdWNjZXNzb3IgPSBfbWFrZV9zZWxlY3RvcihjaGlsZF9wYXJ0cykKKyAgICAgICAgICAgIHNlbGYuZGlyb25seSA9IFRydWUKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuc3VjY2Vzc29yID0gX1Rlcm1pbmF0aW5nU2VsZWN0b3IoKQorICAgICAgICAgICAgc2VsZi5kaXJvbmx5ID0gRmFsc2UKIAogICAgIGRlZiBzZWxlY3RfZnJvbShzZWxmLCBwYXJlbnRfcGF0aCk6CiAgICAgICAgICIiIkl0ZXJhdGUgb3ZlciBhbGwgY2hpbGQgcGF0aHMgb2YgYHBhcmVudF9wYXRoYCBtYXRjaGVkIGJ5IHRoaXMKQEAgLTQ4MiwxMyArNDY3LDE1IEBACiAgICAgICAgIHBhdGhfY2xzID0gdHlwZShwYXJlbnRfcGF0aCkKICAgICAgICAgaXNfZGlyID0gcGF0aF9jbHMuaXNfZGlyCiAgICAgICAgIGV4aXN0cyA9IHBhdGhfY2xzLmV4aXN0cwotICAgICAgICBsaXN0ZGlyID0gcGFyZW50X3BhdGguX2FjY2Vzc29yLmxpc3RkaXIKLSAgICAgICAgcmV0dXJuIHNlbGYuX3NlbGVjdF9mcm9tKHBhcmVudF9wYXRoLCBpc19kaXIsIGV4aXN0cywgbGlzdGRpcikKKyAgICAgICAgc2NhbmRpciA9IHBhcmVudF9wYXRoLl9hY2Nlc3Nvci5zY2FuZGlyCisgICAgICAgIGlmIG5vdCBpc19kaXIocGFyZW50X3BhdGgpOgorICAgICAgICAgICAgcmV0dXJuIGl0ZXIoW10pCisgICAgICAgIHJldHVybiBzZWxmLl9zZWxlY3RfZnJvbShwYXJlbnRfcGF0aCwgaXNfZGlyLCBleGlzdHMsIHNjYW5kaXIpCiAKIAogY2xhc3MgX1Rlcm1pbmF0aW5nU2VsZWN0b3I6CiAKLSAgICBkZWYgX3NlbGVjdF9mcm9tKHNlbGYsIHBhcmVudF9wYXRoLCBpc19kaXIsIGV4aXN0cywgbGlzdGRpcik6CisgICAgZGVmIF9zZWxlY3RfZnJvbShzZWxmLCBwYXJlbnRfcGF0aCwgaXNfZGlyLCBleGlzdHMsIHNjYW5kaXIpOgogICAgICAgICB5aWVsZCBwYXJlbnRfcGF0aAogCiAKQEAgLTQ5OCwxMyArNDg1LDExIEBACiAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICAgX1NlbGVjdG9yLl9faW5pdF9fKHNlbGYsIGNoaWxkX3BhcnRzKQogCi0gICAgZGVmIF9zZWxlY3RfZnJvbShzZWxmLCBwYXJlbnRfcGF0aCwgaXNfZGlyLCBleGlzdHMsIGxpc3RkaXIpOgorICAgIGRlZiBfc2VsZWN0X2Zyb20oc2VsZiwgcGFyZW50X3BhdGgsIGlzX2RpciwgZXhpc3RzLCBzY2FuZGlyKToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgaWYgbm90IGlzX2RpcihwYXJlbnRfcGF0aCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICBwYXRoID0gcGFyZW50X3BhdGguX21ha2VfY2hpbGRfcmVscGF0aChzZWxmLm5hbWUpCi0gICAgICAgICAgICBpZiBleGlzdHMocGF0aCk6Ci0gICAgICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5zdWNjZXNzb3IuX3NlbGVjdF9mcm9tKHBhdGgsIGlzX2RpciwgZXhpc3RzLCBsaXN0ZGlyKToKKyAgICAgICAgICAgIGlmIChpc19kaXIgaWYgc2VsZi5kaXJvbmx5IGVsc2UgZXhpc3RzKShwYXRoKToKKyAgICAgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLnN1Y2Nlc3Nvci5fc2VsZWN0X2Zyb20ocGF0aCwgaXNfZGlyLCBleGlzdHMsIHNjYW5kaXIpOgogICAgICAgICAgICAgICAgICAgICB5aWVsZCBwCiAgICAgICAgIGV4Y2VwdCBQZXJtaXNzaW9uRXJyb3I6CiAgICAgICAgICAgICByZXR1cm4KQEAgLTUxNiwxNyArNTAxLDE4IEBACiAgICAgICAgIHNlbGYucGF0ID0gcmUuY29tcGlsZShmbm1hdGNoLnRyYW5zbGF0ZShwYXQpKQogICAgICAgICBfU2VsZWN0b3IuX19pbml0X18oc2VsZiwgY2hpbGRfcGFydHMpCiAKLSAgICBkZWYgX3NlbGVjdF9mcm9tKHNlbGYsIHBhcmVudF9wYXRoLCBpc19kaXIsIGV4aXN0cywgbGlzdGRpcik6CisgICAgZGVmIF9zZWxlY3RfZnJvbShzZWxmLCBwYXJlbnRfcGF0aCwgaXNfZGlyLCBleGlzdHMsIHNjYW5kaXIpOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpZiBub3QgaXNfZGlyKHBhcmVudF9wYXRoKToKLSAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgIGNmID0gcGFyZW50X3BhdGguX2ZsYXZvdXIuY2FzZWZvbGQKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGxpc3RkaXIocGFyZW50X3BhdGgpOgotICAgICAgICAgICAgICAgIGNhc2Vmb2xkZWQgPSBjZihuYW1lKQotICAgICAgICAgICAgICAgIGlmIHNlbGYucGF0Lm1hdGNoKGNhc2Vmb2xkZWQpOgotICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGFyZW50X3BhdGguX21ha2VfY2hpbGRfcmVscGF0aChuYW1lKQotICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLnN1Y2Nlc3Nvci5fc2VsZWN0X2Zyb20ocGF0aCwgaXNfZGlyLCBleGlzdHMsIGxpc3RkaXIpOgotICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgcAorICAgICAgICAgICAgZW50cmllcyA9IGxpc3Qoc2NhbmRpcihwYXJlbnRfcGF0aCkpCisgICAgICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kaXJvbmx5IG9yIGVudHJ5LmlzX2RpcigpOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gZW50cnkubmFtZQorICAgICAgICAgICAgICAgICAgICBjYXNlZm9sZGVkID0gY2YobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wYXQubWF0Y2goY2FzZWZvbGRlZCk6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGFyZW50X3BhdGguX21ha2VfY2hpbGRfcmVscGF0aChuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5zdWNjZXNzb3IuX3NlbGVjdF9mcm9tKHBhdGgsIGlzX2RpciwgZXhpc3RzLCBzY2FuZGlyKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBwCiAgICAgICAgIGV4Y2VwdCBQZXJtaXNzaW9uRXJyb3I6CiAgICAgICAgICAgICByZXR1cm4KIApAQCAtNTM3LDMyICs1MjMsMzAgQEAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0LCBjaGlsZF9wYXJ0cyk6CiAgICAgICAgIF9TZWxlY3Rvci5fX2luaXRfXyhzZWxmLCBjaGlsZF9wYXJ0cykKIAotICAgIGRlZiBfaXRlcmF0ZV9kaXJlY3RvcmllcyhzZWxmLCBwYXJlbnRfcGF0aCwgaXNfZGlyLCBsaXN0ZGlyKToKKyAgICBkZWYgX2l0ZXJhdGVfZGlyZWN0b3JpZXMoc2VsZiwgcGFyZW50X3BhdGgsIGlzX2Rpciwgc2NhbmRpcik6CiAgICAgICAgIHlpZWxkIHBhcmVudF9wYXRoCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGxpc3RkaXIocGFyZW50X3BhdGgpOgotICAgICAgICAgICAgICAgIHBhdGggPSBwYXJlbnRfcGF0aC5fbWFrZV9jaGlsZF9yZWxwYXRoKG5hbWUpCi0gICAgICAgICAgICAgICAgaWYgaXNfZGlyKHBhdGgpIGFuZCBub3QgcGF0aC5pc19zeW1saW5rKCk6Ci0gICAgICAgICAgICAgICAgICAgIGZvciBwIGluIHNlbGYuX2l0ZXJhdGVfZGlyZWN0b3JpZXMocGF0aCwgaXNfZGlyLCBsaXN0ZGlyKToKKyAgICAgICAgICAgIGVudHJpZXMgPSBsaXN0KHNjYW5kaXIocGFyZW50X3BhdGgpKQorICAgICAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAgICAgICAgICAgICAgaWYgZW50cnkuaXNfZGlyKCkgYW5kIG5vdCBlbnRyeS5pc19zeW1saW5rKCk6CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXJlbnRfcGF0aC5fbWFrZV9jaGlsZF9yZWxwYXRoKGVudHJ5Lm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGZvciBwIGluIHNlbGYuX2l0ZXJhdGVfZGlyZWN0b3JpZXMocGF0aCwgaXNfZGlyLCBzY2FuZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHAKICAgICAgICAgZXhjZXB0IFBlcm1pc3Npb25FcnJvcjoKICAgICAgICAgICAgIHJldHVybgogCi0gICAgZGVmIF9zZWxlY3RfZnJvbShzZWxmLCBwYXJlbnRfcGF0aCwgaXNfZGlyLCBleGlzdHMsIGxpc3RkaXIpOgorICAgIGRlZiBfc2VsZWN0X2Zyb20oc2VsZiwgcGFyZW50X3BhdGgsIGlzX2RpciwgZXhpc3RzLCBzY2FuZGlyKToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgaWYgbm90IGlzX2RpcihwYXJlbnRfcGF0aCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICB3aXRoIF9jYWNoZWQobGlzdGRpcikgYXMgbGlzdGRpcjoKLSAgICAgICAgICAgICAgICB5aWVsZGVkID0gc2V0KCkKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3Nvcl9zZWxlY3QgPSBzZWxmLnN1Y2Nlc3Nvci5fc2VsZWN0X2Zyb20KLSAgICAgICAgICAgICAgICAgICAgZm9yIHN0YXJ0aW5nX3BvaW50IGluIHNlbGYuX2l0ZXJhdGVfZGlyZWN0b3JpZXMocGFyZW50X3BhdGgsIGlzX2RpciwgbGlzdGRpcik6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBzdWNjZXNzb3Jfc2VsZWN0KHN0YXJ0aW5nX3BvaW50LCBpc19kaXIsIGV4aXN0cywgbGlzdGRpcik6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcCBub3QgaW4geWllbGRlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZGVkLmFkZChwKQotICAgICAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgICAgIHlpZWxkZWQuY2xlYXIoKQorICAgICAgICAgICAgeWllbGRlZCA9IHNldCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3VjY2Vzc29yX3NlbGVjdCA9IHNlbGYuc3VjY2Vzc29yLl9zZWxlY3RfZnJvbQorICAgICAgICAgICAgICAgIGZvciBzdGFydGluZ19wb2ludCBpbiBzZWxmLl9pdGVyYXRlX2RpcmVjdG9yaWVzKHBhcmVudF9wYXRoLCBpc19kaXIsIHNjYW5kaXIpOgorICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBzdWNjZXNzb3Jfc2VsZWN0KHN0YXJ0aW5nX3BvaW50LCBpc19kaXIsIGV4aXN0cywgc2NhbmRpcik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwIG5vdCBpbiB5aWVsZGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZGVkLmFkZChwKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB5aWVsZGVkLmNsZWFyKCkKICAgICAgICAgZXhjZXB0IFBlcm1pc3Npb25FcnJvcjoKICAgICAgICAgICAgIHJldHVybgogCkBAIC02MzQsMTMgKzYxOCwxNiBAQAogICAgICAgICBmb3IgYSBpbiBhcmdzOgogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhLCBQdXJlUGF0aCk6CiAgICAgICAgICAgICAgICAgcGFydHMgKz0gYS5fcGFydHMKLSAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShhLCBzdHIpOgotICAgICAgICAgICAgICAgICMgRm9yY2UtY2FzdCBzdHIgc3ViY2xhc3NlcyB0byBzdHIgKGlzc3VlICMyMTEyNykKLSAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoc3RyKGEpKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBzaG91bGQgYmUgYSBwYXRoIG9yIHN0ciBvYmplY3QsIG5vdCAlciIKLSAgICAgICAgICAgICAgICAgICAgJSB0eXBlKGEpKQorICAgICAgICAgICAgICAgIGEgPSBvcy5mc3BhdGgoYSkKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGEsIHN0cik6CisgICAgICAgICAgICAgICAgICAgICMgRm9yY2UtY2FzdCBzdHIgc3ViY2xhc3NlcyB0byBzdHIgKGlzc3VlICMyMTEyNykKKyAgICAgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKHN0cihhKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgc2hvdWxkIGJlIGEgc3RyIG9iamVjdCBvciBhbiBvcy5QYXRoTGlrZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IHJldHVybmluZyBzdHIsIG5vdCAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgdHlwZShhKSkKICAgICAgICAgcmV0dXJuIGNscy5fZmxhdm91ci5wYXJzZV9wYXJ0cyhwYXJ0cykKIAogICAgIEBjbGFzc21ldGhvZApAQCAtNjkzLDYgKzY4MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcnRzKSBvciAnLicKICAgICAgICAgICAgIHJldHVybiBzZWxmLl9zdHIKIAorICAgIGRlZiBfX2ZzcGF0aF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYpCisKICAgICBkZWYgYXNfcG9zaXgoc2VsZik6CiAgICAgICAgICIiIlJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoIHdpdGggZm9yd2FyZCAoLykKICAgICAgICAgc2xhc2hlcy4iIiIKQEAgLTk0Myw2ICs5MzMsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgcmV0dXJuIFRydWUKIAorIyBDYW4ndCBzdWJjbGFzcyBvcy5QYXRoTGlrZSBmcm9tIFB1cmVQYXRoIGFuZCBrZWVwIHRoZSBjb25zdHJ1Y3RvcgorIyBvcHRpbWl6YXRpb25zIGluIFB1cmVQYXRoLl9wYXJzZV9hcmdzKCkuCitvcy5QYXRoTGlrZS5yZWdpc3RlcihQdXJlUGF0aCkKKwogCiBjbGFzcyBQdXJlUG9zaXhQYXRoKFB1cmVQYXRoKToKICAgICBfZmxhdm91ciA9IF9wb3NpeF9mbGF2b3VyCmRpZmYgLS1naXQgYS9MaWIvcGlja2xlLnB5IGIvTGliL3BpY2tsZS5weQppbmRleCAwNDBlY2IyLi5jODM3MGM5IDEwMDY0NAotLS0gYS9MaWIvcGlja2xlLnB5CisrKyBiL0xpYi9waWNrbGUucHkKQEAgLTI3LDYgKzI3LDcgQEAKIGZyb20gY29weXJlZyBpbXBvcnQgZGlzcGF0Y2hfdGFibGUKIGZyb20gY29weXJlZyBpbXBvcnQgX2V4dGVuc2lvbl9yZWdpc3RyeSwgX2ludmVydGVkX3JlZ2lzdHJ5LCBfZXh0ZW5zaW9uX2NhY2hlCiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgcGFydGlhbAogaW1wb3J0IHN5cwogZnJvbSBzeXMgaW1wb3J0IG1heHNpemUKIGZyb20gc3RydWN0IGltcG9ydCBwYWNrLCB1bnBhY2sKQEAgLTU0OCw3ICs1NDksNyBAQAogICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGUKIAogICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICJfX25hbWVfXyIsICIiKQotICAgICAgICBpZiBzZWxmLnByb3RvID49IDQgYW5kIGZ1bmNfbmFtZSA9PSAiX19uZXdvYmpfZXhfXyI6CisgICAgICAgIGlmIHNlbGYucHJvdG8gPj0gMiBhbmQgZnVuY19uYW1lID09ICJfX25ld29ial9leF9fIjoKICAgICAgICAgICAgIGNscywgYXJncywga3dhcmdzID0gYXJncwogICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoY2xzLCAiX19uZXdfXyIpOgogICAgICAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoImFyZ3NbMF0gZnJvbSB7fSBhcmdzIGhhcyBubyBfX25ld19fIgpAQCAtNTU2LDEwICs1NTcsMTYgQEAKICAgICAgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZSBhbmQgY2xzIGlzIG5vdCBvYmouX19jbGFzc19fOgogICAgICAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoImFyZ3NbMF0gZnJvbSB7fSBhcmdzIGhhcyB0aGUgd3JvbmcgY2xhc3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGZ1bmNfbmFtZSkpCi0gICAgICAgICAgICBzYXZlKGNscykKLSAgICAgICAgICAgIHNhdmUoYXJncykKLSAgICAgICAgICAgIHNhdmUoa3dhcmdzKQotICAgICAgICAgICAgd3JpdGUoTkVXT0JKX0VYKQorICAgICAgICAgICAgaWYgc2VsZi5wcm90byA+PSA0OgorICAgICAgICAgICAgICAgIHNhdmUoY2xzKQorICAgICAgICAgICAgICAgIHNhdmUoYXJncykKKyAgICAgICAgICAgICAgICBzYXZlKGt3YXJncykKKyAgICAgICAgICAgICAgICB3cml0ZShORVdPQkpfRVgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1bmMgPSBwYXJ0aWFsKGNscy5fX25ld19fLCBjbHMsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICBzYXZlKGZ1bmMpCisgICAgICAgICAgICAgICAgc2F2ZSgoKSkKKyAgICAgICAgICAgICAgICB3cml0ZShSRURVQ0UpCiAgICAgICAgIGVsaWYgc2VsZi5wcm90byA+PSAyIGFuZCBmdW5jX25hbWUgPT0gIl9fbmV3b2JqX18iOgogICAgICAgICAgICAgIyBBIF9fcmVkdWNlX18gaW1wbGVtZW50YXRpb24gY2FuIGRpcmVjdCBwcm90b2NvbCAyIG9yIG5ld2VyIHRvCiAgICAgICAgICAgICAjIHVzZSB0aGUgbW9yZSBlZmZpY2llbnQgTkVXT0JKIG9wY29kZSwgd2hpbGUgc3RpbGwKQEAgLTEwMjgsNyArMTAzNSw3IEBACiAgICAgICAgIHNlbGYuX3VuZnJhbWVyID0gX1VuZnJhbWVyKHNlbGYuX2ZpbGVfcmVhZCwgc2VsZi5fZmlsZV9yZWFkbGluZSkKICAgICAgICAgc2VsZi5yZWFkID0gc2VsZi5fdW5mcmFtZXIucmVhZAogICAgICAgICBzZWxmLnJlYWRsaW5lID0gc2VsZi5fdW5mcmFtZXIucmVhZGxpbmUKLSAgICAgICAgc2VsZi5tYXJrID0gb2JqZWN0KCkgIyBhbnkgbmV3IHVuaXF1ZSBvYmplY3QKKyAgICAgICAgc2VsZi5tZXRhc3RhY2sgPSBbXQogICAgICAgICBzZWxmLnN0YWNrID0gW10KICAgICAgICAgc2VsZi5hcHBlbmQgPSBzZWxmLnN0YWNrLmFwcGVuZAogICAgICAgICBzZWxmLnByb3RvID0gMApAQCAtMTA0NCwyMCArMTA1MSwxMiBAQAogICAgICAgICBleGNlcHQgX1N0b3AgYXMgc3RvcGluc3Q6CiAgICAgICAgICAgICByZXR1cm4gc3RvcGluc3QudmFsdWUKIAotICAgICMgUmV0dXJuIGxhcmdlc3QgaW5kZXggayBzdWNoIHRoYXQgc2VsZi5zdGFja1trXSBpcyBzZWxmLm1hcmsuCi0gICAgIyBJZiB0aGUgc3RhY2sgZG9lc24ndCBjb250YWluIGEgbWFyaywgZXZlbnR1YWxseSByYWlzZXMgSW5kZXhFcnJvci4KLSAgICAjIFRoaXMgY291bGQgYmUgc3BlZCBieSBtYWludGFpbmluZyBhbm90aGVyIHN0YWNrLCBvZiBpbmRpY2VzIGF0IHdoaWNoCi0gICAgIyB0aGUgbWFyayBhcHBlYXJzLiAgRm9yIHRoYXQgbWF0dGVyLCB0aGUgbGF0dGVyIHN0YWNrIHdvdWxkIHN1ZmZpY2UsCi0gICAgIyBhbmQgd2Ugd291bGRuJ3QgbmVlZCB0byBwdXNoIG1hcmsgb2JqZWN0cyBvbiBzZWxmLnN0YWNrIGF0IGFsbC4KLSAgICAjIERvaW5nIHNvIGlzIHByb2JhYmx5IGEgZ29vZCB0aGluZywgdGhvdWdoLCBzaW5jZSBpZiB0aGUgcGlja2xlIGlzCi0gICAgIyBjb3JydXB0IChvciBob3N0aWxlKSB3ZSBtYXkgZ2V0IGEgY2x1ZSBmcm9tIGZpbmRpbmcgc2VsZi5tYXJrIGVtYmVkZGVkCi0gICAgIyBpbiB1bnBpY2tsZWQgb2JqZWN0cy4KLSAgICBkZWYgbWFya2VyKHNlbGYpOgotICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKLSAgICAgICAgbWFyayA9IHNlbGYubWFyawotICAgICAgICBrID0gbGVuKHN0YWNrKS0xCi0gICAgICAgIHdoaWxlIHN0YWNrW2tdIGlzIG5vdCBtYXJrOiBrID0gay0xCi0gICAgICAgIHJldHVybiBrCisgICAgIyBSZXR1cm4gYSBsaXN0IG9mIGl0ZW1zIHB1c2hlZCBpbiB0aGUgc3RhY2sgYWZ0ZXIgbGFzdCBNQVJLIGluc3RydWN0aW9uLgorICAgIGRlZiBwb3BfbWFyayhzZWxmKToKKyAgICAgICAgaXRlbXMgPSBzZWxmLnN0YWNrCisgICAgICAgIHNlbGYuc3RhY2sgPSBzZWxmLm1ldGFzdGFjay5wb3AoKQorICAgICAgICBzZWxmLmFwcGVuZCA9IHNlbGYuc3RhY2suYXBwZW5kCisgICAgICAgIHJldHVybiBpdGVtcwogCiAgICAgZGVmIHBlcnNpc3RlbnRfbG9hZChzZWxmLCBwaWQpOgogICAgICAgICByYWlzZSBVbnBpY2tsaW5nRXJyb3IoInVuc3VwcG9ydGVkIHBlcnNpc3RlbnQgaWQgZW5jb3VudGVyZWQiKQpAQCAtMTIzOCw4ICsxMjM3LDggQEAKICAgICBkaXNwYXRjaFtTSE9SVF9CSU5VTklDT0RFWzBdXSA9IGxvYWRfc2hvcnRfYmludW5pY29kZQogCiAgICAgZGVmIGxvYWRfdHVwbGUoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIHNlbGYuc3RhY2tbazpdID0gW3R1cGxlKHNlbGYuc3RhY2tbaysxOl0pXQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBzZWxmLmFwcGVuZCh0dXBsZShpdGVtcykpCiAgICAgZGlzcGF0Y2hbVFVQTEVbMF1dID0gbG9hZF90dXBsZQogCiAgICAgZGVmIGxvYWRfZW1wdHlfdHVwbGUoc2VsZik6CkBAIC0xMjcxLDIxICsxMjcwLDIwIEBACiAgICAgZGlzcGF0Y2hbRU1QVFlfU0VUWzBdXSA9IGxvYWRfZW1wdHlfc2V0CiAKICAgICBkZWYgbG9hZF9mcm96ZW5zZXQoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIHNlbGYuc3RhY2tbazpdID0gW2Zyb3plbnNldChzZWxmLnN0YWNrW2srMTpdKV0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgc2VsZi5hcHBlbmQoZnJvemVuc2V0KGl0ZW1zKSkKICAgICBkaXNwYXRjaFtGUk9aRU5TRVRbMF1dID0gbG9hZF9mcm96ZW5zZXQKIAogICAgIGRlZiBsb2FkX2xpc3Qoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIHNlbGYuc3RhY2tbazpdID0gW3NlbGYuc3RhY2tbaysxOl1dCisgICAgICAgIGl0ZW1zID0gc2VsZi5wb3BfbWFyaygpCisgICAgICAgIHNlbGYuYXBwZW5kKGl0ZW1zKQogICAgIGRpc3BhdGNoW0xJU1RbMF1dID0gbG9hZF9saXN0CiAKICAgICBkZWYgbG9hZF9kaWN0KHNlbGYpOgotICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBpdGVtcyA9IHNlbGYuc3RhY2tbaysxOl0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKICAgICAgICAgZCA9IHtpdGVtc1tpXTogaXRlbXNbaSsxXQogICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihpdGVtcyksIDIpfQotICAgICAgICBzZWxmLnN0YWNrW2s6XSA9IFtkXQorICAgICAgICBzZWxmLmFwcGVuZChkKQogICAgIGRpc3BhdGNoW0RJQ1RbMF1dID0gbG9hZF9kaWN0CiAKICAgICAjIElOU1QgYW5kIE9CSiBkaWZmZXIgb25seSBpbiBob3cgdGhleSBnZXQgYSBjbGFzcyBvYmplY3QuICBJdCdzIG5vdApAQCAtMTI5Myw5ICsxMjkxLDcgQEAKICAgICAjIHByZXZpb3VzbHkgZGl2ZXJnZWQgYW5kIGdyZXcgZGlmZmVyZW50IGJ1Z3MuCiAgICAgIyBrbGFzcyBpcyB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUsIGFuZCBrIHBvaW50cyB0byB0aGUgdG9wbW9zdCBtYXJrCiAgICAgIyBvYmplY3QsIGZvbGxvd2luZyB3aGljaCBhcmUgdGhlIGFyZ3VtZW50cyBmb3Iga2xhc3MuX19pbml0X18uCi0gICAgZGVmIF9pbnN0YW50aWF0ZShzZWxmLCBrbGFzcywgayk6Ci0gICAgICAgIGFyZ3MgPSB0dXBsZShzZWxmLnN0YWNrW2srMTpdKQotICAgICAgICBkZWwgc2VsZi5zdGFja1trOl0KKyAgICBkZWYgX2luc3RhbnRpYXRlKHNlbGYsIGtsYXNzLCBhcmdzKToKICAgICAgICAgaWYgKGFyZ3Mgb3Igbm90IGlzaW5zdGFuY2Uoa2xhc3MsIHR5cGUpIG9yCiAgICAgICAgICAgICBoYXNhdHRyKGtsYXNzLCAiX19nZXRpbml0YXJnc19fIikpOgogICAgICAgICAgICAgdHJ5OgpAQCAtMTMxMSwxNCArMTMwNywxNCBAQAogICAgICAgICBtb2R1bGUgPSBzZWxmLnJlYWRsaW5lKClbOi0xXS5kZWNvZGUoImFzY2lpIikKICAgICAgICAgbmFtZSA9IHNlbGYucmVhZGxpbmUoKVs6LTFdLmRlY29kZSgiYXNjaWkiKQogICAgICAgICBrbGFzcyA9IHNlbGYuZmluZF9jbGFzcyhtb2R1bGUsIG5hbWUpCi0gICAgICAgIHNlbGYuX2luc3RhbnRpYXRlKGtsYXNzLCBzZWxmLm1hcmtlcigpKQorICAgICAgICBzZWxmLl9pbnN0YW50aWF0ZShrbGFzcywgc2VsZi5wb3BfbWFyaygpKQogICAgIGRpc3BhdGNoW0lOU1RbMF1dID0gbG9hZF9pbnN0CiAKICAgICBkZWYgbG9hZF9vYmooc2VsZik6CiAgICAgICAgICMgU3RhY2sgaXMgLi4uIG1hcmtvYmplY3QgY2xhc3NvYmplY3QgYXJnMSBhcmcyIC4uLgotICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBrbGFzcyA9IHNlbGYuc3RhY2sucG9wKGsrMSkKLSAgICAgICAgc2VsZi5faW5zdGFudGlhdGUoa2xhc3MsIGspCisgICAgICAgIGFyZ3MgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgY2xzID0gYXJncy5wb3AoMCkKKyAgICAgICAgc2VsZi5faW5zdGFudGlhdGUoY2xzLCBhcmdzKQogICAgIGRpc3BhdGNoW09CSlswXV0gPSBsb2FkX29iagogCiAgICAgZGVmIGxvYWRfbmV3b2JqKHNlbGYpOgpAQCAtMTQwMywxMiArMTM5OSwxNCBAQAogICAgIGRpc3BhdGNoW1JFRFVDRVswXV0gPSBsb2FkX3JlZHVjZQogCiAgICAgZGVmIGxvYWRfcG9wKHNlbGYpOgotICAgICAgICBkZWwgc2VsZi5zdGFja1stMV0KKyAgICAgICAgaWYgc2VsZi5zdGFjazoKKyAgICAgICAgICAgIGRlbCBzZWxmLnN0YWNrWy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wb3BfbWFyaygpCiAgICAgZGlzcGF0Y2hbUE9QWzBdXSA9IGxvYWRfcG9wCiAKICAgICBkZWYgbG9hZF9wb3BfbWFyayhzZWxmKToKLSAgICAgICAgayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgZGVsIHNlbGYuc3RhY2tbazpdCisgICAgICAgIHNlbGYucG9wX21hcmsoKQogICAgIGRpc3BhdGNoW1BPUF9NQVJLWzBdXSA9IGxvYWRfcG9wX21hcmsKIAogICAgIGRlZiBsb2FkX2R1cChzZWxmKToKQEAgLTE0NjQsMTcgKzE0NjIsMTQgQEAKICAgICBkaXNwYXRjaFtBUFBFTkRbMF1dID0gbG9hZF9hcHBlbmQKIAogICAgIGRlZiBsb2FkX2FwcGVuZHMoc2VsZik6Ci0gICAgICAgIHN0YWNrID0gc2VsZi5zdGFjawotICAgICAgICBtYXJrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBsaXN0X29iaiA9IHN0YWNrW21hcmsgLSAxXQotICAgICAgICBpdGVtcyA9IHN0YWNrW21hcmsgKyAxOl0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgbGlzdF9vYmogPSBzZWxmLnN0YWNrWy0xXQogICAgICAgICBpZiBpc2luc3RhbmNlKGxpc3Rfb2JqLCBsaXN0KToKICAgICAgICAgICAgIGxpc3Rfb2JqLmV4dGVuZChpdGVtcykKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGFwcGVuZCA9IGxpc3Rfb2JqLmFwcGVuZAogICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgICAgICAgICAgYXBwZW5kKGl0ZW0pCi0gICAgICAgIGRlbCBzdGFja1ttYXJrOl0KICAgICBkaXNwYXRjaFtBUFBFTkRTWzBdXSA9IGxvYWRfYXBwZW5kcwogCiAgICAgZGVmIGxvYWRfc2V0aXRlbShzZWxmKToKQEAgLTE0ODYsMjcgKzE0ODEsMjEgQEAKICAgICBkaXNwYXRjaFtTRVRJVEVNWzBdXSA9IGxvYWRfc2V0aXRlbQogCiAgICAgZGVmIGxvYWRfc2V0aXRlbXMoc2VsZik6Ci0gICAgICAgIHN0YWNrID0gc2VsZi5zdGFjawotICAgICAgICBtYXJrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBkaWN0ID0gc3RhY2tbbWFyayAtIDFdCi0gICAgICAgIGZvciBpIGluIHJhbmdlKG1hcmsgKyAxLCBsZW4oc3RhY2spLCAyKToKLSAgICAgICAgICAgIGRpY3Rbc3RhY2tbaV1dID0gc3RhY2tbaSArIDFdCi0KLSAgICAgICAgZGVsIHN0YWNrW21hcms6XQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBkaWN0ID0gc2VsZi5zdGFja1stMV0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGl0ZW1zKSwgMik6CisgICAgICAgICAgICBkaWN0W2l0ZW1zW2ldXSA9IGl0ZW1zW2kgKyAxXQogICAgIGRpc3BhdGNoW1NFVElURU1TWzBdXSA9IGxvYWRfc2V0aXRlbXMKIAogICAgIGRlZiBsb2FkX2FkZGl0ZW1zKHNlbGYpOgotICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKLSAgICAgICAgbWFyayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgc2V0X29iaiA9IHN0YWNrW21hcmsgLSAxXQotICAgICAgICBpdGVtcyA9IHN0YWNrW21hcmsgKyAxOl0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgc2V0X29iaiA9IHNlbGYuc3RhY2tbLTFdCiAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2V0X29iaiwgc2V0KToKICAgICAgICAgICAgIHNldF9vYmoudXBkYXRlKGl0ZW1zKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgYWRkID0gc2V0X29iai5hZGQKICAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgogICAgICAgICAgICAgICAgIGFkZChpdGVtKQotICAgICAgICBkZWwgc3RhY2tbbWFyazpdCiAgICAgZGlzcGF0Y2hbQURESVRFTVNbMF1dID0gbG9hZF9hZGRpdGVtcwogCiAgICAgZGVmIGxvYWRfYnVpbGQoc2VsZik6CkBAIC0xNTM0LDcgKzE1MjMsOSBAQAogICAgIGRpc3BhdGNoW0JVSUxEWzBdXSA9IGxvYWRfYnVpbGQKIAogICAgIGRlZiBsb2FkX21hcmsoc2VsZik6Ci0gICAgICAgIHNlbGYuYXBwZW5kKHNlbGYubWFyaykKKyAgICAgICAgc2VsZi5tZXRhc3RhY2suYXBwZW5kKHNlbGYuc3RhY2spCisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBzZWxmLmFwcGVuZCA9IHNlbGYuc3RhY2suYXBwZW5kCiAgICAgZGlzcGF0Y2hbTUFSS1swXV0gPSBsb2FkX21hcmsKIAogICAgIGRlZiBsb2FkX3N0b3Aoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvcGlja2xldG9vbHMucHkgYi9MaWIvcGlja2xldG9vbHMucHkKaW5kZXggMTZhZTdkNS4uNGVlZmMxOSAxMDA2NDQKLS0tIGEvTGliL3BpY2tsZXRvb2xzLnB5CisrKyBiL0xpYi9waWNrbGV0b29scy5weQpAQCAtMjQ0MCw2ICsyNDQwLDcgQEAKICAgICAgICAgaWYgb3Bjb2RlLm5hbWUgaW4gKCJQVVQiLCAiQklOUFVUIiwgIkxPTkdfQklOUFVUIiwgIk1FTU9JWkUiKToKICAgICAgICAgICAgIGlmIG9wY29kZS5uYW1lID09ICJNRU1PSVpFIjoKICAgICAgICAgICAgICAgICBtZW1vX2lkeCA9IGxlbihtZW1vKQorICAgICAgICAgICAgICAgIG1hcmttc2cgPSAiKGFzICVkKSIgJSBtZW1vX2lkeAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBhc3NlcnQgYXJnIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICAgbWVtb19pZHggPSBhcmcKZGlmZiAtLWdpdCBhL0xpYi9wa2d1dGlsLnB5IGIvTGliL3BrZ3V0aWwucHkKaW5kZXggODFkNDE4ZC4uZTM3YWQ0NSAxMDA2NDQKLS0tIGEvTGliL3BrZ3V0aWwucHkKKysrIGIvTGliL3BrZ3V0aWwucHkKQEAgLTEsNSArMSw2IEBACiAiIiJVdGlsaXRpZXMgdG8gc3VwcG9ydCBwYWNrYWdlcy4iIiIKIAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQogZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHNpbmdsZWRpc3BhdGNoIGFzIHNpbXBsZWdlbmVyaWMKIGltcG9ydCBpbXBvcnRsaWIKIGltcG9ydCBpbXBvcnRsaWIudXRpbApAQCAtMTQsOSArMTUsMTQgQEAKICAgICAnZ2V0X2ltcG9ydGVyJywgJ2l0ZXJfaW1wb3J0ZXJzJywgJ2dldF9sb2FkZXInLCAnZmluZF9sb2FkZXInLAogICAgICd3YWxrX3BhY2thZ2VzJywgJ2l0ZXJfbW9kdWxlcycsICdnZXRfZGF0YScsCiAgICAgJ0ltcEltcG9ydGVyJywgJ0ltcExvYWRlcicsICdyZWFkX2NvZGUnLCAnZXh0ZW5kX3BhdGgnLAorICAgICdNb2R1bGVJbmZvJywKIF0KIAogCitNb2R1bGVJbmZvID0gbmFtZWR0dXBsZSgnTW9kdWxlSW5mbycsICdtb2R1bGVfZmluZGVyIG5hbWUgaXNwa2cnKQorTW9kdWxlSW5mby5fX2RvY19fID0gJ0EgbmFtZWR0dXBsZSB3aXRoIG1pbmltYWwgaW5mbyBhYm91dCBhIG1vZHVsZS4nCisKKwogZGVmIF9nZXRfc3BlYyhmaW5kZXIsIG5hbWUpOgogICAgICIiIlJldHVybiB0aGUgZmluZGVyLXNwZWNpZmljIG1vZHVsZSBzcGVjLiIiIgogICAgICMgV29ya3Mgd2l0aCBsZWdhY3kgZmluZGVycy4KQEAgLTQ1LDcgKzUxLDcgQEAKIAogCiBkZWYgd2Fsa19wYWNrYWdlcyhwYXRoPU5vbmUsIHByZWZpeD0nJywgb25lcnJvcj1Ob25lKToKLSAgICAiIiJZaWVsZHMgKG1vZHVsZV9maW5kZXIsIG5hbWUsIGlzcGtnKSBmb3IgYWxsIG1vZHVsZXMgcmVjdXJzaXZlbHkKKyAgICAiIiJZaWVsZHMgTW9kdWxlSW5mbyBmb3IgYWxsIG1vZHVsZXMgcmVjdXJzaXZlbHkKICAgICBvbiBwYXRoLCBvciwgaWYgcGF0aCBpcyBOb25lLCBhbGwgYWNjZXNzaWJsZSBtb2R1bGVzLgogCiAgICAgJ3BhdGgnIHNob3VsZCBiZSBlaXRoZXIgTm9uZSBvciBhIGxpc3Qgb2YgcGF0aHMgdG8gbG9vayBmb3IKQEAgLTc4LDMxICs4NCwzMSBAQAogICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgbVtwXSA9IFRydWUKIAotICAgIGZvciBpbXBvcnRlciwgbmFtZSwgaXNwa2cgaW4gaXRlcl9tb2R1bGVzKHBhdGgsIHByZWZpeCk6Ci0gICAgICAgIHlpZWxkIGltcG9ydGVyLCBuYW1lLCBpc3BrZworICAgIGZvciBpbmZvIGluIGl0ZXJfbW9kdWxlcyhwYXRoLCBwcmVmaXgpOgorICAgICAgICB5aWVsZCBpbmZvCiAKLSAgICAgICAgaWYgaXNwa2c6CisgICAgICAgIGlmIGluZm8uaXNwa2c6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgX19pbXBvcnRfXyhuYW1lKQorICAgICAgICAgICAgICAgIF9faW1wb3J0X18oaW5mby5uYW1lKQogICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgIGlmIG9uZXJyb3IgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIG9uZXJyb3IobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgb25lcnJvcihpbmZvLm5hbWUpCiAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgIGlmIG9uZXJyb3IgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIG9uZXJyb3IobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgb25lcnJvcihpbmZvLm5hbWUpCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcGF0aCA9IGdldGF0dHIoc3lzLm1vZHVsZXNbbmFtZV0sICdfX3BhdGhfXycsIE5vbmUpIG9yIFtdCisgICAgICAgICAgICAgICAgcGF0aCA9IGdldGF0dHIoc3lzLm1vZHVsZXNbaW5mby5uYW1lXSwgJ19fcGF0aF9fJywgTm9uZSkgb3IgW10KIAogICAgICAgICAgICAgICAgICMgZG9uJ3QgdHJhdmVyc2UgcGF0aCBpdGVtcyB3ZSd2ZSBzZWVuIGJlZm9yZQogICAgICAgICAgICAgICAgIHBhdGggPSBbcCBmb3IgcCBpbiBwYXRoIGlmIG5vdCBzZWVuKHApXQogCi0gICAgICAgICAgICAgICAgeWllbGQgZnJvbSB3YWxrX3BhY2thZ2VzKHBhdGgsIG5hbWUrJy4nLCBvbmVycm9yKQorICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gd2Fsa19wYWNrYWdlcyhwYXRoLCBpbmZvLm5hbWUrJy4nLCBvbmVycm9yKQogCiAKIGRlZiBpdGVyX21vZHVsZXMocGF0aD1Ob25lLCBwcmVmaXg9JycpOgotICAgICIiIllpZWxkcyAobW9kdWxlX2ZpbmRlciwgbmFtZSwgaXNwa2cpIGZvciBhbGwgc3VibW9kdWxlcyBvbiBwYXRoLAorICAgICIiIllpZWxkcyBNb2R1bGVJbmZvIGZvciBhbGwgc3VibW9kdWxlcyBvbiBwYXRoLAogICAgIG9yLCBpZiBwYXRoIGlzIE5vbmUsIGFsbCB0b3AtbGV2ZWwgbW9kdWxlcyBvbiBzeXMucGF0aC4KIAogICAgICdwYXRoJyBzaG91bGQgYmUgZWl0aGVyIE5vbmUgb3IgYSBsaXN0IG9mIHBhdGhzIHRvIGxvb2sgZm9yCkBAIC0xMTEsNyArMTE3LDYgQEAKICAgICAncHJlZml4JyBpcyBhIHN0cmluZyB0byBvdXRwdXQgb24gdGhlIGZyb250IG9mIGV2ZXJ5IG1vZHVsZSBuYW1lCiAgICAgb24gb3V0cHV0LgogICAgICIiIgotCiAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICBpbXBvcnRlcnMgPSBpdGVyX2ltcG9ydGVycygpCiAgICAgZWxzZToKQEAgLTEyMiw3ICsxMjcsNyBAQAogICAgICAgICBmb3IgbmFtZSwgaXNwa2cgaW4gaXRlcl9pbXBvcnRlcl9tb2R1bGVzKGksIHByZWZpeCk6CiAgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiB5aWVsZGVkOgogICAgICAgICAgICAgICAgIHlpZWxkZWRbbmFtZV0gPSAxCi0gICAgICAgICAgICAgICAgeWllbGQgaSwgbmFtZSwgaXNwa2cKKyAgICAgICAgICAgICAgICB5aWVsZCBNb2R1bGVJbmZvKGksIG5hbWUsIGlzcGtnKQogCiAKIEBzaW1wbGVnZW5lcmljCkBAIC0xODAsNyArMTg1LDcgQEAKIGRlZiBfaW1wb3J0X2ltcCgpOgogICAgIGdsb2JhbCBpbXAKICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgIGltcCA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCdpbXAnKQogCiBjbGFzcyBJbXBJbXBvcnRlcjoKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWFpeDQvSU4ucHkgYi9MaWIvcGxhdC1haXg0L0lOLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Y4ZjIzLi4wMDAwMDAwCi0tLSBhL0xpYi9wbGF0LWFpeDQvSU4ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotIyBHZW5lcmF0ZWQgYnkgaDJweSBmcm9tIC91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmgKLQotIyBJbmNsdWRlZCBmcm9tIG5ldC9uaC5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvbWFjaGluZS5oCi1MSVRUTEVfRU5ESUFOID0gMTIzNAotQklHX0VORElBTiA9IDQzMjEKLVBEUF9FTkRJQU4gPSAzNDEyCi1CWVRFX09SREVSID0gQklHX0VORElBTgotREVGQVVMVF9HUFIgPSAweERFQURCRUVGCi1NU1JfRUUgPSAweDgwMDAKLU1TUl9QUiA9IDB4NDAwMAotTVNSX0ZQID0gMHgyMDAwCi1NU1JfTUUgPSAweDEwMDAKLU1TUl9GRSA9IDB4MDgwMAotTVNSX0ZFMCA9IDB4MDgwMAotTVNSX1NFID0gMHgwNDAwCi1NU1JfQkUgPSAweDAyMDAKLU1TUl9JRSA9IDB4MDEwMAotTVNSX0ZFMSA9IDB4MDEwMAotTVNSX0FMID0gMHgwMDgwCi1NU1JfSVAgPSAweDAwNDAKLU1TUl9JUiA9IDB4MDAyMAotTVNSX0RSID0gMHgwMDEwCi1NU1JfUE0gPSAweDAwMDQKLURFRkFVTFRfTVNSID0gKE1TUl9FRSB8IE1TUl9NRSB8IE1TUl9BTCB8IE1TUl9JUiB8IE1TUl9EUikKLURFRkFVTFRfVVNFUl9NU1IgPSAoREVGQVVMVF9NU1IgfCBNU1JfUFIpCi1DUl9MVCA9IDB4ODAwMDAwMDAKLUNSX0dUID0gMHg0MDAwMDAwMAotQ1JfRVEgPSAweDIwMDAwMDAwCi1DUl9TTyA9IDB4MTAwMDAwMDAKLUNSX0ZYID0gMHgwODAwMDAwMAotQ1JfRkVYID0gMHgwNDAwMDAwMAotQ1JfVlggPSAweDAyMDAwMDAwCi1DUl9PWCA9IDB4MDEwMDAwMDAKLVhFUl9TTyA9IDB4ODAwMDAwMDAKLVhFUl9PViA9IDB4NDAwMDAwMDAKLVhFUl9DQSA9IDB4MjAwMDAwMDAKLWRlZiBYRVJfQ09NUF9CWVRFKHhlcik6IHJldHVybiAoKHhlciA+PiA4KSAmIDB4MDAwMDAwRkYpCi0KLWRlZiBYRVJfTEVOR1RIKHhlcik6IHJldHVybiAoeGVyICYgMHgwMDAwMDA3RikKLQotRFNJU1JfSU8gPSAweDgwMDAwMDAwCi1EU0lTUl9QRlQgPSAweDQwMDAwMDAwCi1EU0lTUl9MT0NLID0gMHgyMDAwMDAwMAotRFNJU1JfRlBJTyA9IDB4MTAwMDAwMDAKLURTSVNSX1BST1QgPSAweDA4MDAwMDAwCi1EU0lTUl9MT09QID0gMHgwNDAwMDAwMAotRFNJU1JfRFJTVCA9IDB4MDQwMDAwMDAKLURTSVNSX1NUID0gMHgwMjAwMDAwMAotRFNJU1JfU0VHQiA9IDB4MDEwMDAwMDAKLURTSVNSX0RBQlIgPSAweDAwNDAwMDAwCi1EU0lTUl9FQVIgPSAweDAwMTAwMDAwCi1TUlJfSVNfUEZUID0gMHg0MDAwMDAwMAotU1JSX0lTX0lTUEVDID0gMHgyMDAwMDAwMAotU1JSX0lTX0lJTyA9IDB4MTAwMDAwMDAKLVNSUl9JU19HVUFSRCA9IDB4MTAwMDAwMDAKLVNSUl9JU19QUk9UID0gMHgwODAwMDAwMAotU1JSX0lTX0xPT1AgPSAweDA0MDAwMDAwCi1TUlJfUFJfRlBFTiA9IDB4MDAxMDAwMDAKLVNSUl9QUl9JTlZBTCA9IDB4MDAwODAwMDAKLVNSUl9QUl9QUklWID0gMHgwMDA0MDAwMAotU1JSX1BSX1RSQVAgPSAweDAwMDIwMDAwCi1TUlJfUFJfSU1QUkUgPSAweDAwMDEwMDAwCi1kZWYgQlVJRF83Rl9TUlZBTChyYWRkcik6IHJldHVybiAoMHg4N0YwMDAwMCB8ICgoKHVpbnQpKHJhZGRyKSkgPj4gMjgpKQotCi1CVF8yNTZNID0gMHgxRkZDCi1CVF8xMjhNID0gMHgwRkZDCi1CVF82NE0gPSAweDA3RkMKLUJUXzMyTSA9IDB4MDNGQwotQlRfMTZNID0gMHgwMUZDCi1CVF84TSA9IDB4MDBGQwotQlRfNE0gPSAweDAwN0MKLUJUXzJNID0gMHgwMDNDCi1CVF8xTSA9IDB4MDAxQwotQlRfNTEySyA9IDB4MDAwQwotQlRfMjU2SyA9IDB4MDAwNAotQlRfMTI4SyA9IDB4MDAwMAotQlRfTk9BQ0NFU1MgPSAweDAKLUJUX1JET05MWSA9IDB4MQotQlRfV1JJVEUgPSAweDIKLUJUX1ZTID0gMHgyCi1CVF9WUCA9IDB4MQotZGVmIEJBVF9FU0VHKGRiYXR1KTogcmV0dXJuICgoKHVpbnQpKGRiYXR1KSA+PiAyOCkpCi0KLU1JTl9CQVRfU0laRSA9IDB4MDAwMjAwMDAKLU1BWF9CQVRfU0laRSA9IDB4MTAwMDAwMDAKLWRlZiBudG9obCh4KTogcmV0dXJuICh4KQotCi1kZWYgbnRvaHMoeCk6IHJldHVybiAoeCkKLQotZGVmIGh0b25sKHgpOiByZXR1cm4gKHgpCi0KLWRlZiBodG9ucyh4KTogcmV0dXJuICh4KQotCi1JUFBST1RPX0lQID0gMAotSVBQUk9UT19JQ01QID0gMQotSVBQUk9UT19JR01QID0gMgotSVBQUk9UT19HR1AgPSAzCi1JUFBST1RPX1RDUCA9IDYKLUlQUFJPVE9fRUdQID0gOAotSVBQUk9UT19QVVAgPSAxMgotSVBQUk9UT19VRFAgPSAxNwotSVBQUk9UT19JRFAgPSAyMgotSVBQUk9UT19UUCA9IDI5Ci1JUFBST1RPX0xPQ0FMID0gNjMKLUlQUFJPVE9fRU9OID0gODAKLUlQUFJPVE9fQklQID0gMHg1MwotSVBQUk9UT19SQVcgPSAyNTUKLUlQUFJPVE9fTUFYID0gMjU2Ci1JUFBPUlRfUkVTRVJWRUQgPSAxMDI0Ci1JUFBPUlRfVVNFUlJFU0VSVkVEID0gNTAwMAotSVBQT1JUX1RJTUVTRVJWRVIgPSAzNwotZGVmIElOX0NMQVNTQShpKTogcmV0dXJuICgoKGludCkoaSkgJiAweDgwMDAwMDAwKSA9PSAwKQotCi1JTl9DTEFTU0FfTkVUID0gMHhmZjAwMDAwMAotSU5fQ0xBU1NBX05TSElGVCA9IDI0Ci1JTl9DTEFTU0FfSE9TVCA9IDB4MDBmZmZmZmYKLUlOX0NMQVNTQV9NQVggPSAxMjgKLWRlZiBJTl9DTEFTU0IoaSk6IHJldHVybiAoKChpbnQpKGkpICYgMHhjMDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkKLQotSU5fQ0xBU1NCX05FVCA9IDB4ZmZmZjAwMDAKLUlOX0NMQVNTQl9OU0hJRlQgPSAxNgotSU5fQ0xBU1NCX0hPU1QgPSAweDAwMDBmZmZmCi1JTl9DTEFTU0JfTUFYID0gNjU1MzYKLWRlZiBJTl9DTEFTU0MoaSk6IHJldHVybiAoKChpbnQpKGkpICYgMHhlMDAwMDAwMCkgPT0gMHhjMDAwMDAwMCkKLQotSU5fQ0xBU1NDX05FVCA9IDB4ZmZmZmZmMDAKLUlOX0NMQVNTQ19OU0hJRlQgPSA4Ci1JTl9DTEFTU0NfSE9TVCA9IDB4MDAwMDAwZmYKLWRlZiBJTl9DTEFTU0QoaSk6IHJldHVybiAoKChpbnQpKGkpICYgMHhmMDAwMDAwMCkgPT0gMHhlMDAwMDAwMCkKLQotZGVmIElOX01VTFRJQ0FTVChpKTogcmV0dXJuIElOX0NMQVNTRChpKQotCi1JTl9DTEFTU0RfTkVUID0gMHhmMDAwMDAwMAotSU5fQ0xBU1NEX05TSElGVCA9IDI4Ci1JTl9DTEFTU0RfSE9TVCA9IDB4MGZmZmZmZmYKLUlOQUREUl9VTlNQRUNfR1JPVVAgPSAweGUwMDAwMDAwCi1JTkFERFJfQUxMSE9TVFNfR1JPVVAgPSAweGUwMDAwMDAxCi1JTkFERFJfTUFYX0xPQ0FMX0dST1VQID0gMHhlMDAwMDBmZgotZGVmIElOX0VYUEVSSU1FTlRBTChpKTogcmV0dXJuICgoKGludCkoaSkgJiAweGUwMDAwMDAwKSA9PSAweGUwMDAwMDAwKQotCi1kZWYgSU5fQkFEQ0xBU1MoaSk6IHJldHVybiAoKChpbnQpKGkpICYgMHhmMDAwMDAwMCkgPT0gMHhmMDAwMDAwMCkKLQotSU5BRERSX0FOWSA9IDB4MDAwMDAwMDAKLUlOQUREUl9CUk9BRENBU1QgPSAweGZmZmZmZmZmCi1JTkFERFJfTE9PUEJBQ0sgPSAweDdmMDAwMDAxCi1JTkFERFJfTk9ORSA9IDB4ZmZmZmZmZmYKLUlOX0xPT1BCQUNLTkVUID0gMTI3Ci1JUF9PUFRJT05TID0gMQotSVBfSERSSU5DTCA9IDIKLUlQX1RPUyA9IDMKLUlQX1RUTCA9IDQKLUlQX1JFQ1ZPUFRTID0gNQotSVBfUkVDVlJFVE9QVFMgPSA2Ci1JUF9SRUNWRFNUQUREUiA9IDcKLUlQX1JFVE9QVFMgPSA4Ci1JUF9NVUxUSUNBU1RfSUYgPSA5Ci1JUF9NVUxUSUNBU1RfVFRMID0gMTAKLUlQX01VTFRJQ0FTVF9MT09QID0gMTEKLUlQX0FERF9NRU1CRVJTSElQID0gMTIKLUlQX0RST1BfTUVNQkVSU0hJUCA9IDEzCi1JUF9ERUZBVUxUX01VTFRJQ0FTVF9UVEwgPSAxCi1JUF9ERUZBVUxUX01VTFRJQ0FTVF9MT09QID0gMQotSVBfTUFYX01FTUJFUlNISVBTID0gMjAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWFpeDQvcmVnZW4gYi9MaWIvcGxhdC1haXg0L3JlZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2E3MWM0Li4wMDAwMDAwCi0tLSBhL0xpYi9wbGF0LWFpeDQvcmVnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMhIC9iaW4vc2gKLWNhc2UgYHVuYW1lIC1zdmAgaW4KLSdBSVggNCcqKSAgOzsKLSopICAgICAgZWNobyBQcm9iYWJseSBub3Qgb24gYW4gQUlYIDQgc3lzdGVtIDE+JjIKLSAgICAgICAgZXhpdCAxOzsKLWVzYWMKLXNldCAtdgotaDJweS5weSAtaSAnKHVfbG9uZyknIC91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmgKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWRhcndpbi9JTi5weSBiL0xpYi9wbGF0LWRhcndpbi9JTi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2YmUzMy4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC1kYXJ3aW4vSU4ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2NjIgKzAsMCBAQAotIyBHZW5lcmF0ZWQgYnkgaDJweSBmcm9tIC91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9hcHBsZWFwaW9wdHMuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL190eXBlcy5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvY2RlZnMuaAotZGVmIF9fUChwcm90b3MpOiByZXR1cm4gcHJvdG9zCi0KLWRlZiBfX1NUUklORyh4KTogcmV0dXJuICN4Ci0KLWRlZiBfX1AocHJvdG9zKTogcmV0dXJuICgpCi0KLWRlZiBfX1NUUklORyh4KTogcmV0dXJuICJ4IgotCi1kZWYgX19hdHRyaWJ1dGVfXyh4KTogcmV0dXJuCi0KLWRlZiBfX0NPUFlSSUdIVChzKTogcmV0dXJuIF9fSURTVFJJTkcoY29weXJpZ2h0LHMpCi0KLWRlZiBfX1JDU0lEKHMpOiByZXR1cm4gX19JRFNUUklORyhyY3NpZCxzKQotCi1kZWYgX19TQ0NTSUQocyk6IHJldHVybiBfX0lEU1RSSU5HKHNjY3NpZCxzKQotCi1kZWYgX19QUk9KRUNUX1ZFUlNJT04ocyk6IHJldHVybiBfX0lEU1RSSU5HKHByb2plY3RfdmVyc2lvbixzKQotCi1fX0RBUldJTl9VTklYMDMgPSAxCi1fX0RBUldJTl9VTklYMDMgPSAwCi1fX0RBUldJTl9VTklYMDMgPSAwCi1fX0RBUldJTl9VTklYMDMgPSAxCi1fX0RBUldJTl82NF9CSVRfSU5PX1QgPSAxCi1fX0RBUldJTl82NF9CSVRfSU5PX1QgPSAwCi1fX0RBUldJTl82NF9CSVRfSU5PX1QgPSAwCi1fX0RBUldJTl9OT05fQ0FOQ0VMQUJMRSA9IDAKLV9fREFSV0lOX1ZFUlNfMTA1MCA9IDEKLV9fREFSV0lOX1ZFUlNfMTA1MCA9IDAKLV9fREFSV0lOX1NVRl9VTklYMDMgPSAiJFVOSVgyMDAzIgotX19EQVJXSU5fU1VGX1VOSVgwM19TRVQgPSAxCi1fX0RBUldJTl9TVUZfVU5JWDAzX1NFVCA9IDAKLV9fREFSV0lOX1NVRl82NF9CSVRfSU5PX1QgPSAiJElOT0RFNjQiCi1fX0RBUldJTl9TVUZfTk9OX0NBTkNFTEFCTEUgPSAiJE5PQ0FOQ0VMIgotX19EQVJXSU5fU1VGXzEwNTAgPSAiJDEwNTAiCi1fX0RBUldJTl9TVUZfVU5JWDAzX1NFVCA9IDAKLV9fREFSV0lOX1NVRl9FWFRTTiA9ICIkREFSV0lOX0VYVFNOIgotX19EQVJXSU5fTE9OR19ET1VCTEVfSVNfRE9VQkxFID0gMAotZGVmIF9fREFSV0lOX0xEQkxfQ09NUEFUKHgpOiByZXR1cm4KLQotZGVmIF9fREFSV0lOX0xEQkxfQ09NUEFUMih4KTogcmV0dXJuCi0KLV9fREFSV0lOX0xPTkdfRE9VQkxFX0lTX0RPVUJMRSA9IDEKLWRlZiBfX0RBUldJTl9MREJMX0NPTVBBVCh4KTogcmV0dXJuCi0KLWRlZiBfX0RBUldJTl9MREJMX0NPTVBBVDIoeCk6IHJldHVybgotCi1fX0RBUldJTl9MT05HX0RPVUJMRV9JU19ET1VCTEUgPSAwCi1fREFSV0lOX0ZFQVRVUkVfTE9OR19ET1VCTEVfSVNfRE9VQkxFID0gMQotX0RBUldJTl9GRUFUVVJFX1VOSVhfQ09ORk9STUFOQ0UgPSAzCi1fREFSV0lOX0ZFQVRVUkVfNjRfQklUX0lOT0RFID0gMQotCi0jIEluY2x1ZGVkIGZyb20gbWFjaGluZS9fdHlwZXMuaAotX19QVEhSRUFEX1NJWkVfXyA9IDExNjgKLV9fUFRIUkVBRF9BVFRSX1NJWkVfXyA9IDU2Ci1fX1BUSFJFQURfTVVURVhBVFRSX1NJWkVfXyA9IDgKLV9fUFRIUkVBRF9NVVRFWF9TSVpFX18gPSA1NgotX19QVEhSRUFEX0NPTkRBVFRSX1NJWkVfXyA9IDgKLV9fUFRIUkVBRF9DT05EX1NJWkVfXyA9IDQwCi1fX1BUSFJFQURfT05DRV9TSVpFX18gPSA4Ci1fX1BUSFJFQURfUldMT0NLX1NJWkVfXyA9IDE5MgotX19QVEhSRUFEX1JXTE9DS0FUVFJfU0laRV9fID0gMTYKLV9fUFRIUkVBRF9TSVpFX18gPSA1OTYKLV9fUFRIUkVBRF9BVFRSX1NJWkVfXyA9IDM2Ci1fX1BUSFJFQURfTVVURVhBVFRSX1NJWkVfXyA9IDgKLV9fUFRIUkVBRF9NVVRFWF9TSVpFX18gPSA0MAotX19QVEhSRUFEX0NPTkRBVFRSX1NJWkVfXyA9IDQKLV9fUFRIUkVBRF9DT05EX1NJWkVfXyA9IDI0Ci1fX1BUSFJFQURfT05DRV9TSVpFX18gPSA0Ci1fX1BUSFJFQURfUldMT0NLX1NJWkVfXyA9IDEyNAotX19QVEhSRUFEX1JXTE9DS0FUVFJfU0laRV9fID0gMTIKLV9fREFSV0lOX05VTEwgPSAwCi0KLSMgSW5jbHVkZWQgZnJvbSBzdGRpbnQuaAotX19XT1JEU0laRSA9IDY0Ci1fX1dPUkRTSVpFID0gMzIKLUlOVDhfTUFYID0gMTI3Ci1JTlQxNl9NQVggPSAzMjc2NwotSU5UMzJfTUFYID0gMjE0NzQ4MzY0NwotSU5UOF9NSU4gPSAtMTI4Ci1JTlQxNl9NSU4gPSAtMzI3NjgKLUlOVDMyX01JTiA9ICgtSU5UMzJfTUFYLTEpCi1VSU5UOF9NQVggPSAyNTUKLVVJTlQxNl9NQVggPSA2NTUzNQotSU5UX0xFQVNUOF9NSU4gPSBJTlQ4X01JTgotSU5UX0xFQVNUMTZfTUlOID0gSU5UMTZfTUlOCi1JTlRfTEVBU1QzMl9NSU4gPSBJTlQzMl9NSU4KLUlOVF9MRUFTVDhfTUFYID0gSU5UOF9NQVgKLUlOVF9MRUFTVDE2X01BWCA9IElOVDE2X01BWAotSU5UX0xFQVNUMzJfTUFYID0gSU5UMzJfTUFYCi1VSU5UX0xFQVNUOF9NQVggPSBVSU5UOF9NQVgKLVVJTlRfTEVBU1QxNl9NQVggPSBVSU5UMTZfTUFYCi1JTlRfRkFTVDhfTUlOID0gSU5UOF9NSU4KLUlOVF9GQVNUMTZfTUlOID0gSU5UMTZfTUlOCi1JTlRfRkFTVDMyX01JTiA9IElOVDMyX01JTgotSU5UX0ZBU1Q4X01BWCA9IElOVDhfTUFYCi1JTlRfRkFTVDE2X01BWCA9IElOVDE2X01BWAotSU5UX0ZBU1QzMl9NQVggPSBJTlQzMl9NQVgKLVVJTlRfRkFTVDhfTUFYID0gVUlOVDhfTUFYCi1VSU5UX0ZBU1QxNl9NQVggPSBVSU5UMTZfTUFYCi1JTlRQVFJfTUlOID0gSU5UMzJfTUlOCi1JTlRQVFJfTUFYID0gSU5UMzJfTUFYCi1QVFJESUZGX01JTiA9IElOVDMyX01JTgotUFRSRElGRl9NQVggPSBJTlQzMl9NQVgKLVdDSEFSX01BWCA9IDB4N2ZmZmZmZmYKLVdDSEFSX01JTiA9IDAKLVdDSEFSX01JTiA9ICgtV0NIQVJfTUFYLTEpCi1XSU5UX01JTiA9IElOVDMyX01JTgotV0lOVF9NQVggPSBJTlQzMl9NQVgKLVNJR19BVE9NSUNfTUlOID0gSU5UMzJfTUlOCi1TSUdfQVRPTUlDX01BWCA9IElOVDMyX01BWAotZGVmIElOVDhfQyh2KTogcmV0dXJuICh2KQotCi1kZWYgSU5UMTZfQyh2KTogcmV0dXJuICh2KQotCi1kZWYgSU5UMzJfQyh2KTogcmV0dXJuICh2KQotCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvc29ja2V0LmgKLQotIyBJbmNsdWRlZCBmcm9tIG1hY2hpbmUvX3BhcmFtLmgKLVNPQ0tfU1RSRUFNID0gMQotU09DS19ER1JBTSA9IDIKLVNPQ0tfUkFXID0gMwotU09DS19SRE0gPSA0Ci1TT0NLX1NFUVBBQ0tFVCA9IDUKLVNPX0RFQlVHID0gMHgwMDAxCi1TT19BQ0NFUFRDT05OID0gMHgwMDAyCi1TT19SRVVTRUFERFIgPSAweDAwMDQKLVNPX0tFRVBBTElWRSA9IDB4MDAwOAotU09fRE9OVFJPVVRFID0gMHgwMDEwCi1TT19CUk9BRENBU1QgPSAweDAwMjAKLVNPX1VTRUxPT1BCQUNLID0gMHgwMDQwCi1TT19MSU5HRVIgPSAweDAwODAKLVNPX0xJTkdFUiA9IDB4MTA4MAotU09fT09CSU5MSU5FID0gMHgwMTAwCi1TT19SRVVTRVBPUlQgPSAweDAyMDAKLVNPX1RJTUVTVEFNUCA9IDB4MDQwMAotU09fQUNDRVBURklMVEVSID0gMHgxMDAwCi1TT19ET05UVFJVTkMgPSAweDIwMDAKLVNPX1dBTlRNT1JFID0gMHg0MDAwCi1TT19XQU5UT09CRkxBRyA9IDB4ODAwMAotU09fU05EQlVGID0gMHgxMDAxCi1TT19SQ1ZCVUYgPSAweDEwMDIKLVNPX1NORExPV0FUID0gMHgxMDAzCi1TT19SQ1ZMT1dBVCA9IDB4MTAwNAotU09fU05EVElNRU8gPSAweDEwMDUKLVNPX1JDVlRJTUVPID0gMHgxMDA2Ci1TT19FUlJPUiA9IDB4MTAwNwotU09fVFlQRSA9IDB4MTAwOAotU09fTlJFQUQgPSAweDEwMjAKLVNPX05LRSA9IDB4MTAyMQotU09fTk9TSUdQSVBFID0gMHgxMDIyCi1TT19OT0FERFJFUlIgPSAweDEwMjMKLVNPX05XUklURSA9IDB4MTAyNAotU09fUkVVU0VTSEFSRVVJRCA9IDB4MTAyNQotU09fTk9USUZZQ09ORkxJQ1QgPSAweDEwMjYKLVNPX0xJTkdFUl9TRUMgPSAweDEwODAKLVNPX1JFU1RSSUNUSU9OUyA9IDB4MTA4MQotU09fUkVTVFJJQ1RfREVOWUlOID0gMHgwMDAwMDAwMQotU09fUkVTVFJJQ1RfREVOWU9VVCA9IDB4MDAwMDAwMDIKLVNPX1JFU1RSSUNUX0RFTllTRVQgPSAoLTIxNDc0ODM2NDgpCi1TT19MQUJFTCA9IDB4MTAxMAotU09fUEVFUkxBQkVMID0gMHgxMDExCi1TT0xfU09DS0VUID0gMHhmZmZmCi1BRl9VTlNQRUMgPSAwCi1BRl9VTklYID0gMQotQUZfTE9DQUwgPSBBRl9VTklYCi1BRl9JTkVUID0gMgotQUZfSU1QTElOSyA9IDMKLUFGX1BVUCA9IDQKLUFGX0NIQU9TID0gNQotQUZfTlMgPSA2Ci1BRl9JU08gPSA3Ci1BRl9PU0kgPSBBRl9JU08KLUFGX0VDTUEgPSA4Ci1BRl9EQVRBS0lUID0gOQotQUZfQ0NJVFQgPSAxMAotQUZfU05BID0gMTEKLUFGX0RFQ25ldCA9IDEyCi1BRl9ETEkgPSAxMwotQUZfTEFUID0gMTQKLUFGX0hZTElOSyA9IDE1Ci1BRl9BUFBMRVRBTEsgPSAxNgotQUZfUk9VVEUgPSAxNwotQUZfTElOSyA9IDE4Ci1wc2V1ZG9fQUZfWFRQID0gMTkKLUFGX0NPSVAgPSAyMAotQUZfQ05UID0gMjEKLXBzZXVkb19BRl9SVElQID0gMjIKLUFGX0lQWCA9IDIzCi1BRl9TSVAgPSAyNAotcHNldWRvX0FGX1BJUCA9IDI1Ci1BRl9ORFJWID0gMjcKLUFGX0lTRE4gPSAyOAotQUZfRTE2NCA9IEFGX0lTRE4KLXBzZXVkb19BRl9LRVkgPSAyOQotQUZfSU5FVDYgPSAzMAotQUZfTkFUTSA9IDMxCi1BRl9TWVNURU0gPSAzMgotQUZfTkVUQklPUyA9IDMzCi1BRl9QUFAgPSAzNAotQUZfQVRNID0gMzAKLXBzZXVkb19BRl9IRFJDTVBMVCA9IDM1Ci1BRl9SRVNFUlZFRF8zNiA9IDM2Ci1BRl9ORVRHUkFQSCA9IDMyCi1BRl9NQVggPSAzNwotU09DS19NQVhBRERSTEVOID0gMjU1Ci1fU1NfTUFYU0laRSA9IDEyOAotUEZfVU5TUEVDID0gQUZfVU5TUEVDCi1QRl9MT0NBTCA9IEFGX0xPQ0FMCi1QRl9VTklYID0gUEZfTE9DQUwKLVBGX0lORVQgPSBBRl9JTkVUCi1QRl9JTVBMSU5LID0gQUZfSU1QTElOSwotUEZfUFVQID0gQUZfUFVQCi1QRl9DSEFPUyA9IEFGX0NIQU9TCi1QRl9OUyA9IEFGX05TCi1QRl9JU08gPSBBRl9JU08KLVBGX09TSSA9IEFGX0lTTwotUEZfRUNNQSA9IEFGX0VDTUEKLVBGX0RBVEFLSVQgPSBBRl9EQVRBS0lUCi1QRl9DQ0lUVCA9IEFGX0NDSVRUCi1QRl9TTkEgPSBBRl9TTkEKLVBGX0RFQ25ldCA9IEFGX0RFQ25ldAotUEZfRExJID0gQUZfRExJCi1QRl9MQVQgPSBBRl9MQVQKLVBGX0hZTElOSyA9IEFGX0hZTElOSwotUEZfQVBQTEVUQUxLID0gQUZfQVBQTEVUQUxLCi1QRl9ST1VURSA9IEFGX1JPVVRFCi1QRl9MSU5LID0gQUZfTElOSwotUEZfWFRQID0gcHNldWRvX0FGX1hUUAotUEZfQ09JUCA9IEFGX0NPSVAKLVBGX0NOVCA9IEFGX0NOVAotUEZfU0lQID0gQUZfU0lQCi1QRl9JUFggPSBBRl9JUFgKLVBGX1JUSVAgPSBwc2V1ZG9fQUZfUlRJUAotUEZfUElQID0gcHNldWRvX0FGX1BJUAotUEZfTkRSViA9IEFGX05EUlYKLVBGX0lTRE4gPSBBRl9JU0ROCi1QRl9LRVkgPSBwc2V1ZG9fQUZfS0VZCi1QRl9JTkVUNiA9IEFGX0lORVQ2Ci1QRl9OQVRNID0gQUZfTkFUTQotUEZfU1lTVEVNID0gQUZfU1lTVEVNCi1QRl9ORVRCSU9TID0gQUZfTkVUQklPUwotUEZfUFBQID0gQUZfUFBQCi1QRl9SRVNFUlZFRF8zNiA9IEFGX1JFU0VSVkVEXzM2Ci1QRl9BVE0gPSBBRl9BVE0KLVBGX05FVEdSQVBIID0gQUZfTkVUR1JBUEgKLVBGX01BWCA9IEFGX01BWAotTkVUX01BWElEID0gQUZfTUFYCi1ORVRfUlRfRFVNUCA9IDEKLU5FVF9SVF9GTEFHUyA9IDIKLU5FVF9SVF9JRkxJU1QgPSAzCi1ORVRfUlRfU1RBVCA9IDQKLU5FVF9SVF9UUkFTSCA9IDUKLU5FVF9SVF9JRkxJU1QyID0gNgotTkVUX1JUX0RVTVAyID0gNwotTkVUX1JUX01BWElEID0gOAotU09NQVhDT05OID0gMTI4Ci1NU0dfT09CID0gMHgxCi1NU0dfUEVFSyA9IDB4MgotTVNHX0RPTlRST1VURSA9IDB4NAotTVNHX0VPUiA9IDB4OAotTVNHX1RSVU5DID0gMHgxMAotTVNHX0NUUlVOQyA9IDB4MjAKLU1TR19XQUlUQUxMID0gMHg0MAotTVNHX0RPTlRXQUlUID0gMHg4MAotTVNHX0VPRiA9IDB4MTAwCi1NU0dfV0FJVFNUUkVBTSA9IDB4MjAwCi1NU0dfRkxVU0ggPSAweDQwMAotTVNHX0hPTEQgPSAweDgwMAotTVNHX1NFTkQgPSAweDEwMDAKLU1TR19IQVZFTU9SRSA9IDB4MjAwMAotTVNHX1JDVk1PUkUgPSAweDQwMDAKLU1TR19ORUVEU0EgPSAweDEwMDAwCi1DTUdST1VQX01BWCA9IDE2Ci1TQ01fUklHSFRTID0gMHgwMQotU0NNX1RJTUVTVEFNUCA9IDB4MDIKLVNDTV9DUkVEUyA9IDB4MDMKLVNIVVRfUkQgPSAwCi1TSFVUX1dSID0gMQotU0hVVF9SRFdSID0gMgotCi0jIEluY2x1ZGVkIGZyb20gbWFjaGluZS9lbmRpYW4uaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL19lbmRpYW4uaAotZGVmIG50b2hsKHgpOiByZXR1cm4gKHgpCi0KLWRlZiBudG9ocyh4KTogcmV0dXJuICh4KQotCi1kZWYgaHRvbmwoeCk6IHJldHVybiAoeCkKLQotZGVmIGh0b25zKHgpOiByZXR1cm4gKHgpCi0KLWRlZiBOVE9ITCh4KTogcmV0dXJuICh4KQotCi1kZWYgTlRPSFMoeCk6IHJldHVybiAoeCkKLQotZGVmIEhUT05MKHgpOiByZXR1cm4gKHgpCi0KLWRlZiBIVE9OUyh4KTogcmV0dXJuICh4KQotCi0KLSMgSW5jbHVkZWQgZnJvbSBsaWJrZXJuL19PU0J5dGVPcmRlci5oCi1kZWYgX19EQVJXSU5fT1NTd2FwQ29uc3RJbnQxNih4KTogcmV0dXJuIFwKLQotZGVmIF9fREFSV0lOX09TU3dhcENvbnN0SW50MzIoeCk6IHJldHVybiBcCi0KLWRlZiBfX0RBUldJTl9PU1N3YXBDb25zdEludDY0KHgpOiByZXR1cm4gXAotCi0KLSMgSW5jbHVkZWQgZnJvbSBsaWJrZXJuL2kzODYvX09TQnl0ZU9yZGVyLmgKLWRlZiBfX0RBUldJTl9PU1N3YXBJbnQxNih4KTogcmV0dXJuIFwKLQotZGVmIF9fREFSV0lOX09TU3dhcEludDMyKHgpOiByZXR1cm4gXAotCi1kZWYgX19EQVJXSU5fT1NTd2FwSW50NjQoeCk6IHJldHVybiBcCi0KLWRlZiBfX0RBUldJTl9PU1N3YXBJbnQxNih4KTogcmV0dXJuIF9PU1N3YXBJbnQxNih4KQotCi1kZWYgX19EQVJXSU5fT1NTd2FwSW50MzIoeCk6IHJldHVybiBfT1NTd2FwSW50MzIoeCkKLQotZGVmIF9fREFSV0lOX09TU3dhcEludDY0KHgpOiByZXR1cm4gX09TU3dhcEludDY0KHgpCi0KLWRlZiBudG9ocyh4KTogcmV0dXJuIF9fREFSV0lOX09TU3dhcEludDE2KHgpCi0KLWRlZiBodG9ucyh4KTogcmV0dXJuIF9fREFSV0lOX09TU3dhcEludDE2KHgpCi0KLWRlZiBudG9obCh4KTogcmV0dXJuIF9fREFSV0lOX09TU3dhcEludDMyKHgpCi0KLWRlZiBodG9ubCh4KTogcmV0dXJuIF9fREFSV0lOX09TU3dhcEludDMyKHgpCi0KLUlQUFJPVE9fSVAgPSAwCi1JUFBST1RPX0hPUE9QVFMgPSAwCi1JUFBST1RPX0lDTVAgPSAxCi1JUFBST1RPX0lHTVAgPSAyCi1JUFBST1RPX0dHUCA9IDMKLUlQUFJPVE9fSVBWNCA9IDQKLUlQUFJPVE9fSVBJUCA9IElQUFJPVE9fSVBWNAotSVBQUk9UT19UQ1AgPSA2Ci1JUFBST1RPX1NUID0gNwotSVBQUk9UT19FR1AgPSA4Ci1JUFBST1RPX1BJR1AgPSA5Ci1JUFBST1RPX1JDQ01PTiA9IDEwCi1JUFBST1RPX05WUElJID0gMTEKLUlQUFJPVE9fUFVQID0gMTIKLUlQUFJPVE9fQVJHVVMgPSAxMwotSVBQUk9UT19FTUNPTiA9IDE0Ci1JUFBST1RPX1hORVQgPSAxNQotSVBQUk9UT19DSEFPUyA9IDE2Ci1JUFBST1RPX1VEUCA9IDE3Ci1JUFBST1RPX01VWCA9IDE4Ci1JUFBST1RPX01FQVMgPSAxOQotSVBQUk9UT19ITVAgPSAyMAotSVBQUk9UT19QUk0gPSAyMQotSVBQUk9UT19JRFAgPSAyMgotSVBQUk9UT19UUlVOSzEgPSAyMwotSVBQUk9UT19UUlVOSzIgPSAyNAotSVBQUk9UT19MRUFGMSA9IDI1Ci1JUFBST1RPX0xFQUYyID0gMjYKLUlQUFJPVE9fUkRQID0gMjcKLUlQUFJPVE9fSVJUUCA9IDI4Ci1JUFBST1RPX1RQID0gMjkKLUlQUFJPVE9fQkxUID0gMzAKLUlQUFJPVE9fTlNQID0gMzEKLUlQUFJPVE9fSU5QID0gMzIKLUlQUFJPVE9fU0VQID0gMzMKLUlQUFJPVE9fM1BDID0gMzQKLUlQUFJPVE9fSURQUiA9IDM1Ci1JUFBST1RPX1hUUCA9IDM2Ci1JUFBST1RPX0REUCA9IDM3Ci1JUFBST1RPX0NNVFAgPSAzOAotSVBQUk9UT19UUFhYID0gMzkKLUlQUFJPVE9fSUwgPSA0MAotSVBQUk9UT19JUFY2ID0gNDEKLUlQUFJPVE9fU0RSUCA9IDQyCi1JUFBST1RPX1JPVVRJTkcgPSA0MwotSVBQUk9UT19GUkFHTUVOVCA9IDQ0Ci1JUFBST1RPX0lEUlAgPSA0NQotSVBQUk9UT19SU1ZQID0gNDYKLUlQUFJPVE9fR1JFID0gNDcKLUlQUFJPVE9fTUhSUCA9IDQ4Ci1JUFBST1RPX0JIQSA9IDQ5Ci1JUFBST1RPX0VTUCA9IDUwCi1JUFBST1RPX0FIID0gNTEKLUlQUFJPVE9fSU5MU1AgPSA1MgotSVBQUk9UT19TV0lQRSA9IDUzCi1JUFBST1RPX05IUlAgPSA1NAotSVBQUk9UT19JQ01QVjYgPSA1OAotSVBQUk9UT19OT05FID0gNTkKLUlQUFJPVE9fRFNUT1BUUyA9IDYwCi1JUFBST1RPX0FISVAgPSA2MQotSVBQUk9UT19DRlRQID0gNjIKLUlQUFJPVE9fSEVMTE8gPSA2MwotSVBQUk9UT19TQVRFWFBBSyA9IDY0Ci1JUFBST1RPX0tSWVBUT0xBTiA9IDY1Ci1JUFBST1RPX1JWRCA9IDY2Ci1JUFBST1RPX0lQUEMgPSA2NwotSVBQUk9UT19BREZTID0gNjgKLUlQUFJPVE9fU0FUTU9OID0gNjkKLUlQUFJPVE9fVklTQSA9IDcwCi1JUFBST1RPX0lQQ1YgPSA3MQotSVBQUk9UT19DUE5YID0gNzIKLUlQUFJPVE9fQ1BIQiA9IDczCi1JUFBST1RPX1dTTiA9IDc0Ci1JUFBST1RPX1BWUCA9IDc1Ci1JUFBST1RPX0JSU0FUTU9OID0gNzYKLUlQUFJPVE9fTkQgPSA3NwotSVBQUk9UT19XQk1PTiA9IDc4Ci1JUFBST1RPX1dCRVhQQUsgPSA3OQotSVBQUk9UT19FT04gPSA4MAotSVBQUk9UT19WTVRQID0gODEKLUlQUFJPVE9fU1ZNVFAgPSA4MgotSVBQUk9UT19WSU5FUyA9IDgzCi1JUFBST1RPX1RUUCA9IDg0Ci1JUFBST1RPX0lHUCA9IDg1Ci1JUFBST1RPX0RHUCA9IDg2Ci1JUFBST1RPX1RDRiA9IDg3Ci1JUFBST1RPX0lHUlAgPSA4OAotSVBQUk9UT19PU1BGSUdQID0gODkKLUlQUFJPVE9fU1JQQyA9IDkwCi1JUFBST1RPX0xBUlAgPSA5MQotSVBQUk9UT19NVFAgPSA5MgotSVBQUk9UT19BWDI1ID0gOTMKLUlQUFJPVE9fSVBFSVAgPSA5NAotSVBQUk9UT19NSUNQID0gOTUKLUlQUFJPVE9fU0NDU1AgPSA5NgotSVBQUk9UT19FVEhFUklQID0gOTcKLUlQUFJPVE9fRU5DQVAgPSA5OAotSVBQUk9UT19BUEVTID0gOTkKLUlQUFJPVE9fR01UUCA9IDEwMAotSVBQUk9UT19JUENPTVAgPSAxMDgKLUlQUFJPVE9fUElNID0gMTAzCi1JUFBST1RPX1BHTSA9IDExMwotSVBQUk9UT19ESVZFUlQgPSAyNTQKLUlQUFJPVE9fUkFXID0gMjU1Ci1JUFBST1RPX01BWCA9IDI1NgotSVBQUk9UT19ET05FID0gMjU3Ci1fX0RBUldJTl9JUFBPUlRfUkVTRVJWRUQgPSAxMDI0Ci1JUFBPUlRfUkVTRVJWRUQgPSBfX0RBUldJTl9JUFBPUlRfUkVTRVJWRUQKLUlQUE9SVF9VU0VSUkVTRVJWRUQgPSA1MDAwCi1JUFBPUlRfSElGSVJTVEFVVE8gPSA0OTE1MgotSVBQT1JUX0hJTEFTVEFVVE8gPSA2NTUzNQotSVBQT1JUX1JFU0VSVkVEU1RBUlQgPSA2MDAKLWRlZiBJTl9DTEFTU0EoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgKC0yMTQ3NDgzNjQ4KSkgPT0gMCkKLQotSU5fQ0xBU1NBX05FVCA9ICgtMTY3NzcyMTYpCi1JTl9DTEFTU0FfTlNISUZUID0gMjQKLUlOX0NMQVNTQV9IT1NUID0gMHgwMGZmZmZmZgotSU5fQ0xBU1NBX01BWCA9IDEyOAotZGVmIElOX0NMQVNTQihpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAoLTEwNzM3NDE4MjQpKSA9PSAoLTIxNDc0ODM2NDgpKQotCi1JTl9DTEFTU0JfTkVUID0gKC02NTUzNikKLUlOX0NMQVNTQl9OU0hJRlQgPSAxNgotSU5fQ0xBU1NCX0hPU1QgPSAweDAwMDBmZmZmCi1JTl9DTEFTU0JfTUFYID0gNjU1MzYKLWRlZiBJTl9DTEFTU0MoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgKC01MzY4NzA5MTIpKSA9PSAoLTEwNzM3NDE4MjQpKQotCi1JTl9DTEFTU0NfTkVUID0gKC0yNTYpCi1JTl9DTEFTU0NfTlNISUZUID0gOAotSU5fQ0xBU1NDX0hPU1QgPSAweDAwMDAwMGZmCi1kZWYgSU5fQ0xBU1NEKGkpOiByZXR1cm4gKCgodV9pbnQzMl90KShpKSAmICgtMjY4NDM1NDU2KSkgPT0gKC01MzY4NzA5MTIpKQotCi1JTl9DTEFTU0RfTkVUID0gKC0yNjg0MzU0NTYpCi1JTl9DTEFTU0RfTlNISUZUID0gMjgKLUlOX0NMQVNTRF9IT1NUID0gMHgwZmZmZmZmZgotZGVmIElOX01VTFRJQ0FTVChpKTogcmV0dXJuIElOX0NMQVNTRChpKQotCi1kZWYgSU5fRVhQRVJJTUVOVEFMKGkpOiByZXR1cm4gKCgodV9pbnQzMl90KShpKSAmICgtMjY4NDM1NDU2KSkgPT0gKC0yNjg0MzU0NTYpKQotCi1kZWYgSU5fQkFEQ0xBU1MoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgKC0yNjg0MzU0NTYpKSA9PSAoLTI2ODQzNTQ1NikpCi0KLUlOQUREUl9OT05FID0gKC0xKQotZGVmIElOX0xJTktMT0NBTChpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiBJTl9DTEFTU0JfTkVUKSA9PSBJTl9MSU5LTE9DQUxORVROVU0pCi0KLUlOX0xPT1BCQUNLTkVUID0gMTI3Ci1JTkVUX0FERFJTVFJMRU4gPSAxNgotSVBfT1BUSU9OUyA9IDEKLUlQX0hEUklOQ0wgPSAyCi1JUF9UT1MgPSAzCi1JUF9UVEwgPSA0Ci1JUF9SRUNWT1BUUyA9IDUKLUlQX1JFQ1ZSRVRPUFRTID0gNgotSVBfUkVDVkRTVEFERFIgPSA3Ci1JUF9SRVRPUFRTID0gOAotSVBfTVVMVElDQVNUX0lGID0gOQotSVBfTVVMVElDQVNUX1RUTCA9IDEwCi1JUF9NVUxUSUNBU1RfTE9PUCA9IDExCi1JUF9BRERfTUVNQkVSU0hJUCA9IDEyCi1JUF9EUk9QX01FTUJFUlNISVAgPSAxMwotSVBfTVVMVElDQVNUX1ZJRiA9IDE0Ci1JUF9SU1ZQX09OID0gMTUKLUlQX1JTVlBfT0ZGID0gMTYKLUlQX1JTVlBfVklGX09OID0gMTcKLUlQX1JTVlBfVklGX09GRiA9IDE4Ci1JUF9QT1JUUkFOR0UgPSAxOQotSVBfUkVDVklGID0gMjAKLUlQX0lQU0VDX1BPTElDWSA9IDIxCi1JUF9GQUlUSCA9IDIyCi1JUF9TVFJJUEhEUiA9IDIzCi1JUF9SRUNWVFRMID0gMjQKLUlQX0ZXX0FERCA9IDQwCi1JUF9GV19ERUwgPSA0MQotSVBfRldfRkxVU0ggPSA0MgotSVBfRldfWkVSTyA9IDQzCi1JUF9GV19HRVQgPSA0NAotSVBfRldfUkVTRVRMT0cgPSA0NQotSVBfT0xEX0ZXX0FERCA9IDUwCi1JUF9PTERfRldfREVMID0gNTEKLUlQX09MRF9GV19GTFVTSCA9IDUyCi1JUF9PTERfRldfWkVSTyA9IDUzCi1JUF9PTERfRldfR0VUID0gNTQKLUlQX05BVF9fWFhYID0gNTUKLUlQX09MRF9GV19SRVNFVExPRyA9IDU2Ci1JUF9EVU1NWU5FVF9DT05GSUdVUkUgPSA2MAotSVBfRFVNTVlORVRfREVMID0gNjEKLUlQX0RVTU1ZTkVUX0ZMVVNIID0gNjIKLUlQX0RVTU1ZTkVUX0dFVCA9IDY0Ci1JUF9UUkFGRklDX01HVF9CQUNLR1JPVU5EID0gNjUKLUlQX0ZPUkNFX09VVF9JRlAgPSA2OQotVFJBRkZJQ19NR1RfU09fQkFDS0dST1VORCA9IDB4MDAwMQotVFJBRkZJQ19NR1RfU09fQkdfU1VQUFJFU1NFRCA9IDB4MDAwMgotSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMID0gMQotSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCA9IDEKLUlQX01BWF9NRU1CRVJTSElQUyA9IDIwCi1JUF9QT1JUUkFOR0VfREVGQVVMVCA9IDAKLUlQX1BPUlRSQU5HRV9ISUdIID0gMQotSVBfUE9SVFJBTkdFX0xPVyA9IDIKLUlQUFJPVE9fTUFYSUQgPSAoSVBQUk9UT19BSCArIDEpCi1JUENUTF9GT1JXQVJESU5HID0gMQotSVBDVExfU0VORFJFRElSRUNUUyA9IDIKLUlQQ1RMX0RFRlRUTCA9IDMKLUlQQ1RMX0RFRk1UVSA9IDQKLUlQQ1RMX1JURVhQSVJFID0gNQotSVBDVExfUlRNSU5FWFBJUkUgPSA2Ci1JUENUTF9SVE1BWENBQ0hFID0gNwotSVBDVExfU09VUkNFUk9VVEUgPSA4Ci1JUENUTF9ESVJFQ1RFREJST0FEQ0FTVCA9IDkKLUlQQ1RMX0lOVFJRTUFYTEVOID0gMTAKLUlQQ1RMX0lOVFJRRFJPUFMgPSAxMQotSVBDVExfU1RBVFMgPSAxMgotSVBDVExfQUNDRVBUU09VUkNFUk9VVEUgPSAxMwotSVBDVExfRkFTVEZPUldBUkRJTkcgPSAxNAotSVBDVExfS0VFUEZBSVRIID0gMTUKLUlQQ1RMX0dJRl9UVEwgPSAxNgotSVBDVExfTUFYSUQgPSAxNwotCi0jIEluY2x1ZGVkIGZyb20gbmV0aW5ldDYvaW42LmgKLV9fS0FNRV9WRVJTSU9OID0gIjIwMDEwNTI4L2FwcGxlLWRhcndpbiIKLUlQVjZQT1JUX1JFU0VSVkVEID0gMTAyNAotSVBWNlBPUlRfQU5PTk1JTiA9IDQ5MTUyCi1JUFY2UE9SVF9BTk9OTUFYID0gNjU1MzUKLUlQVjZQT1JUX1JFU0VSVkVETUlOID0gNjAwCi1JUFY2UE9SVF9SRVNFUlZFRE1BWCA9IChJUFY2UE9SVF9SRVNFUlZFRC0xKQotSU5FVDZfQUREUlNUUkxFTiA9IDQ2Ci1kZWYgSU42X0lTX0FERFJfVU5TUEVDSUZJRUQoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9MT09QQkFDSyhhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX1Y0Q09NUEFUKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfVjRNQVBQRUQoYSk6IHJldHVybiBcCi0KLV9fSVBWNl9BRERSX1NDT1BFX05PREVMT0NBTCA9IDB4MDEKLV9fSVBWNl9BRERSX1NDT1BFX0xJTktMT0NBTCA9IDB4MDIKLV9fSVBWNl9BRERSX1NDT1BFX1NJVEVMT0NBTCA9IDB4MDUKLV9fSVBWNl9BRERSX1NDT1BFX09SR0xPQ0FMID0gMHgwOAotX19JUFY2X0FERFJfU0NPUEVfR0xPQkFMID0gMHgwZQotZGVmIElONl9JU19BRERSX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX1NJVEVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX05PREVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX1NJVEVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX09SR0xPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfR0xPQkFMKGEpOiByZXR1cm4gXAotCi1JUFY2X09QVElPTlMgPSAxCi1JUFY2X1JFQ1ZPUFRTID0gNQotSVBWNl9SRUNWUkVUT1BUUyA9IDYKLUlQVjZfUkVDVkRTVEFERFIgPSA3Ci1JUFY2X1JFVE9QVFMgPSA4Ci1JUFY2X1NPQ0tPUFRfUkVTRVJWRUQxID0gMwotSVBWNl9VTklDQVNUX0hPUFMgPSA0Ci1JUFY2X01VTFRJQ0FTVF9JRiA9IDkKLUlQVjZfTVVMVElDQVNUX0hPUFMgPSAxMAotSVBWNl9NVUxUSUNBU1RfTE9PUCA9IDExCi1JUFY2X0pPSU5fR1JPVVAgPSAxMgotSVBWNl9MRUFWRV9HUk9VUCA9IDEzCi1JUFY2X1BPUlRSQU5HRSA9IDE0Ci1JQ01QNl9GSUxURVIgPSAxOAotSVBWNl9QS1RJTkZPID0gMTkKLUlQVjZfSE9QTElNSVQgPSAyMAotSVBWNl9ORVhUSE9QID0gMjEKLUlQVjZfSE9QT1BUUyA9IDIyCi1JUFY2X0RTVE9QVFMgPSAyMwotSVBWNl9SVEhEUiA9IDI0Ci1JUFY2X1BLVE9QVElPTlMgPSAyNQotSVBWNl9DSEVDS1NVTSA9IDI2Ci1JUFY2X1Y2T05MWSA9IDI3Ci1JUFY2X0JJTkRWNk9OTFkgPSBJUFY2X1Y2T05MWQotSVBWNl9JUFNFQ19QT0xJQ1kgPSAyOAotSVBWNl9GQUlUSCA9IDI5Ci1JUFY2X0ZXX0FERCA9IDMwCi1JUFY2X0ZXX0RFTCA9IDMxCi1JUFY2X0ZXX0ZMVVNIID0gMzIKLUlQVjZfRldfWkVSTyA9IDMzCi1JUFY2X0ZXX0dFVCA9IDM0Ci1JUFY2X1JUSERSX0xPT1NFID0gMAotSVBWNl9SVEhEUl9TVFJJQ1QgPSAxCi1JUFY2X1JUSERSX1RZUEVfMCA9IDAKLUlQVjZfREVGQVVMVF9NVUxUSUNBU1RfSE9QUyA9IDEKLUlQVjZfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCA9IDEKLUlQVjZfUE9SVFJBTkdFX0RFRkFVTFQgPSAwCi1JUFY2X1BPUlRSQU5HRV9ISUdIID0gMQotSVBWNl9QT1JUUkFOR0VfTE9XID0gMgotSVBWNlBST1RPX01BWElEID0gKElQUFJPVE9fUElNICsgMSkKLUlQVjZDVExfRk9SV0FSRElORyA9IDEKLUlQVjZDVExfU0VORFJFRElSRUNUUyA9IDIKLUlQVjZDVExfREVGSExJTSA9IDMKLUlQVjZDVExfREVGTVRVID0gNAotSVBWNkNUTF9GT1JXU1JDUlQgPSA1Ci1JUFY2Q1RMX1NUQVRTID0gNgotSVBWNkNUTF9NUlRTVEFUUyA9IDcKLUlQVjZDVExfTVJUUFJPVE8gPSA4Ci1JUFY2Q1RMX01BWEZSQUdQQUNLRVRTID0gOQotSVBWNkNUTF9TT1VSQ0VDSEVDSyA9IDEwCi1JUFY2Q1RMX1NPVVJDRUNIRUNLX0xPR0lOVCA9IDExCi1JUFY2Q1RMX0FDQ0VQVF9SVEFEViA9IDEyCi1JUFY2Q1RMX0tFRVBGQUlUSCA9IDEzCi1JUFY2Q1RMX0xPR19JTlRFUlZBTCA9IDE0Ci1JUFY2Q1RMX0hEUk5FU1RMSU1JVCA9IDE1Ci1JUFY2Q1RMX0RBRF9DT1VOVCA9IDE2Ci1JUFY2Q1RMX0FVVE9fRkxPV0xBQkVMID0gMTcKLUlQVjZDVExfREVGTUNBU1RITElNID0gMTgKLUlQVjZDVExfR0lGX0hMSU0gPSAxOQotSVBWNkNUTF9LQU1FX1ZFUlNJT04gPSAyMAotSVBWNkNUTF9VU0VfREVQUkVDQVRFRCA9IDIxCi1JUFY2Q1RMX1JSX1BSVU5FID0gMjIKLUlQVjZDVExfTUFQUEVEX0FERFIgPSAyMwotSVBWNkNUTF9WNk9OTFkgPSAyNAotSVBWNkNUTF9SVEVYUElSRSA9IDI1Ci1JUFY2Q1RMX1JUTUlORVhQSVJFID0gMjYKLUlQVjZDVExfUlRNQVhDQUNIRSA9IDI3Ci1JUFY2Q1RMX1VTRVRFTVBBRERSID0gMzIKLUlQVjZDVExfVEVNUFBMVElNRSA9IDMzCi1JUFY2Q1RMX1RFTVBWTFRJTUUgPSAzNAotSVBWNkNUTF9BVVRPX0xJTktMT0NBTCA9IDM1Ci1JUFY2Q1RMX1JJUDZTVEFUUyA9IDM2Ci1JUFY2Q1RMX01BWEZSQUdTID0gNDEKLUlQVjZDVExfTUFYSUQgPSA0MgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtZGFyd2luL3JlZ2VuIGIvTGliL3BsYXQtZGFyd2luL3JlZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjBjZGMxLi4wMDAwMDAwCi0tLSBhL0xpYi9wbGF0LWRhcndpbi9yZWdlbgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyEgL2Jpbi9zaAotc2V0IC12Ci1weXRob24kRVhFIC4uLy4uL1Rvb2xzL3NjcmlwdHMvaDJweS5weSAtaSAnKHVfbG9uZyknIC91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmgKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWZyZWVic2Q0L0lOLnB5IGIvTGliL3BsYXQtZnJlZWJzZDQvSU4ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYTI0MTguLjAwMDAwMDAKLS0tIGEvTGliL3BsYXQtZnJlZWJzZDQvSU4ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotIyBHZW5lcmF0ZWQgYnkgaDJweSBmcm9tIC91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmgKLUlQUFJPVE9fSVAgPSAwCi1JUFBST1RPX0hPUE9QVFMgPSAwCi1JUFBST1RPX0lDTVAgPSAxCi1JUFBST1RPX0lHTVAgPSAyCi1JUFBST1RPX0dHUCA9IDMKLUlQUFJPVE9fSVBWNCA9IDQKLUlQUFJPVE9fSVBJUCA9IElQUFJPVE9fSVBWNAotSVBQUk9UT19UQ1AgPSA2Ci1JUFBST1RPX1NUID0gNwotSVBQUk9UT19FR1AgPSA4Ci1JUFBST1RPX1BJR1AgPSA5Ci1JUFBST1RPX1JDQ01PTiA9IDEwCi1JUFBST1RPX05WUElJID0gMTEKLUlQUFJPVE9fUFVQID0gMTIKLUlQUFJPVE9fQVJHVVMgPSAxMwotSVBQUk9UT19FTUNPTiA9IDE0Ci1JUFBST1RPX1hORVQgPSAxNQotSVBQUk9UT19DSEFPUyA9IDE2Ci1JUFBST1RPX1VEUCA9IDE3Ci1JUFBST1RPX01VWCA9IDE4Ci1JUFBST1RPX01FQVMgPSAxOQotSVBQUk9UT19ITVAgPSAyMAotSVBQUk9UT19QUk0gPSAyMQotSVBQUk9UT19JRFAgPSAyMgotSVBQUk9UT19UUlVOSzEgPSAyMwotSVBQUk9UT19UUlVOSzIgPSAyNAotSVBQUk9UT19MRUFGMSA9IDI1Ci1JUFBST1RPX0xFQUYyID0gMjYKLUlQUFJPVE9fUkRQID0gMjcKLUlQUFJPVE9fSVJUUCA9IDI4Ci1JUFBST1RPX1RQID0gMjkKLUlQUFJPVE9fQkxUID0gMzAKLUlQUFJPVE9fTlNQID0gMzEKLUlQUFJPVE9fSU5QID0gMzIKLUlQUFJPVE9fU0VQID0gMzMKLUlQUFJPVE9fM1BDID0gMzQKLUlQUFJPVE9fSURQUiA9IDM1Ci1JUFBST1RPX1hUUCA9IDM2Ci1JUFBST1RPX0REUCA9IDM3Ci1JUFBST1RPX0NNVFAgPSAzOAotSVBQUk9UT19UUFhYID0gMzkKLUlQUFJPVE9fSUwgPSA0MAotSVBQUk9UT19JUFY2ID0gNDEKLUlQUFJPVE9fU0RSUCA9IDQyCi1JUFBST1RPX1JPVVRJTkcgPSA0MwotSVBQUk9UT19GUkFHTUVOVCA9IDQ0Ci1JUFBST1RPX0lEUlAgPSA0NQotSVBQUk9UT19SU1ZQID0gNDYKLUlQUFJPVE9fR1JFID0gNDcKLUlQUFJPVE9fTUhSUCA9IDQ4Ci1JUFBST1RPX0JIQSA9IDQ5Ci1JUFBST1RPX0VTUCA9IDUwCi1JUFBST1RPX0FIID0gNTEKLUlQUFJPVE9fSU5MU1AgPSA1MgotSVBQUk9UT19TV0lQRSA9IDUzCi1JUFBST1RPX05IUlAgPSA1NAotSVBQUk9UT19JQ01QVjYgPSA1OAotSVBQUk9UT19OT05FID0gNTkKLUlQUFJPVE9fRFNUT1BUUyA9IDYwCi1JUFBST1RPX0FISVAgPSA2MQotSVBQUk9UT19DRlRQID0gNjIKLUlQUFJPVE9fSEVMTE8gPSA2MwotSVBQUk9UT19TQVRFWFBBSyA9IDY0Ci1JUFBST1RPX0tSWVBUT0xBTiA9IDY1Ci1JUFBST1RPX1JWRCA9IDY2Ci1JUFBST1RPX0lQUEMgPSA2NwotSVBQUk9UT19BREZTID0gNjgKLUlQUFJPVE9fU0FUTU9OID0gNjkKLUlQUFJPVE9fVklTQSA9IDcwCi1JUFBST1RPX0lQQ1YgPSA3MQotSVBQUk9UT19DUE5YID0gNzIKLUlQUFJPVE9fQ1BIQiA9IDczCi1JUFBST1RPX1dTTiA9IDc0Ci1JUFBST1RPX1BWUCA9IDc1Ci1JUFBST1RPX0JSU0FUTU9OID0gNzYKLUlQUFJPVE9fTkQgPSA3NwotSVBQUk9UT19XQk1PTiA9IDc4Ci1JUFBST1RPX1dCRVhQQUsgPSA3OQotSVBQUk9UT19FT04gPSA4MAotSVBQUk9UT19WTVRQID0gODEKLUlQUFJPVE9fU1ZNVFAgPSA4MgotSVBQUk9UT19WSU5FUyA9IDgzCi1JUFBST1RPX1RUUCA9IDg0Ci1JUFBST1RPX0lHUCA9IDg1Ci1JUFBST1RPX0RHUCA9IDg2Ci1JUFBST1RPX1RDRiA9IDg3Ci1JUFBST1RPX0lHUlAgPSA4OAotSVBQUk9UT19PU1BGSUdQID0gODkKLUlQUFJPVE9fU1JQQyA9IDkwCi1JUFBST1RPX0xBUlAgPSA5MQotSVBQUk9UT19NVFAgPSA5MgotSVBQUk9UT19BWDI1ID0gOTMKLUlQUFJPVE9fSVBFSVAgPSA5NAotSVBQUk9UT19NSUNQID0gOTUKLUlQUFJPVE9fU0NDU1AgPSA5NgotSVBQUk9UT19FVEhFUklQID0gOTcKLUlQUFJPVE9fRU5DQVAgPSA5OAotSVBQUk9UT19BUEVTID0gOTkKLUlQUFJPVE9fR01UUCA9IDEwMAotSVBQUk9UT19JUENPTVAgPSAxMDgKLUlQUFJPVE9fUElNID0gMTAzCi1JUFBST1RPX1BHTSA9IDExMwotSVBQUk9UT19ESVZFUlQgPSAyNTQKLUlQUFJPVE9fUkFXID0gMjU1Ci1JUFBST1RPX01BWCA9IDI1NgotSVBQUk9UT19ET05FID0gMjU3Ci1JUFBPUlRfUkVTRVJWRUQgPSAxMDI0Ci1JUFBPUlRfVVNFUlJFU0VSVkVEID0gNTAwMAotSVBQT1JUX0hJRklSU1RBVVRPID0gNDkxNTIKLUlQUE9SVF9ISUxBU1RBVVRPID0gNjU1MzUKLUlQUE9SVF9SRVNFUlZFRFNUQVJUID0gNjAwCi1kZWYgSU5fQ0xBU1NBKGkpOiByZXR1cm4gKCgodV9pbnQzMl90KShpKSAmIDB4ODAwMDAwMDApID09IDApCi0KLUlOX0NMQVNTQV9ORVQgPSAweGZmMDAwMDAwCi1JTl9DTEFTU0FfTlNISUZUID0gMjQKLUlOX0NMQVNTQV9IT1NUID0gMHgwMGZmZmZmZgotSU5fQ0xBU1NBX01BWCA9IDEyOAotZGVmIElOX0NMQVNTQihpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAweGMwMDAwMDAwKSA9PSAweDgwMDAwMDAwKQotCi1JTl9DTEFTU0JfTkVUID0gMHhmZmZmMDAwMAotSU5fQ0xBU1NCX05TSElGVCA9IDE2Ci1JTl9DTEFTU0JfSE9TVCA9IDB4MDAwMGZmZmYKLUlOX0NMQVNTQl9NQVggPSA2NTUzNgotZGVmIElOX0NMQVNTQyhpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAweGUwMDAwMDAwKSA9PSAweGMwMDAwMDAwKQotCi1JTl9DTEFTU0NfTkVUID0gMHhmZmZmZmYwMAotSU5fQ0xBU1NDX05TSElGVCA9IDgKLUlOX0NMQVNTQ19IT1NUID0gMHgwMDAwMDBmZgotZGVmIElOX0NMQVNTRChpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAweGYwMDAwMDAwKSA9PSAweGUwMDAwMDAwKQotCi1JTl9DTEFTU0RfTkVUID0gMHhmMDAwMDAwMAotSU5fQ0xBU1NEX05TSElGVCA9IDI4Ci1JTl9DTEFTU0RfSE9TVCA9IDB4MGZmZmZmZmYKLWRlZiBJTl9NVUxUSUNBU1QoaSk6IHJldHVybiBJTl9DTEFTU0QoaSkKLQotZGVmIElOX0VYUEVSSU1FTlRBTChpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAweGYwMDAwMDAwKSA9PSAweGYwMDAwMDAwKQotCi1kZWYgSU5fQkFEQ0xBU1MoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhmMDAwMDAwMCkgPT0gMHhmMDAwMDAwMCkKLQotSU5BRERSX05PTkUgPSAweGZmZmZmZmZmCi1JTl9MT09QQkFDS05FVCA9IDEyNwotSU5FVF9BRERSU1RSTEVOID0gMTYKLUlQX09QVElPTlMgPSAxCi1JUF9IRFJJTkNMID0gMgotSVBfVE9TID0gMwotSVBfVFRMID0gNAotSVBfUkVDVk9QVFMgPSA1Ci1JUF9SRUNWUkVUT1BUUyA9IDYKLUlQX1JFQ1ZEU1RBRERSID0gNwotSVBfUkVUT1BUUyA9IDgKLUlQX01VTFRJQ0FTVF9JRiA9IDkKLUlQX01VTFRJQ0FTVF9UVEwgPSAxMAotSVBfTVVMVElDQVNUX0xPT1AgPSAxMQotSVBfQUREX01FTUJFUlNISVAgPSAxMgotSVBfRFJPUF9NRU1CRVJTSElQID0gMTMKLUlQX01VTFRJQ0FTVF9WSUYgPSAxNAotSVBfUlNWUF9PTiA9IDE1Ci1JUF9SU1ZQX09GRiA9IDE2Ci1JUF9SU1ZQX1ZJRl9PTiA9IDE3Ci1JUF9SU1ZQX1ZJRl9PRkYgPSAxOAotSVBfUE9SVFJBTkdFID0gMTkKLUlQX1JFQ1ZJRiA9IDIwCi1JUF9JUFNFQ19QT0xJQ1kgPSAyMQotSVBfRkFJVEggPSAyMgotSVBfRldfQUREID0gNTAKLUlQX0ZXX0RFTCA9IDUxCi1JUF9GV19GTFVTSCA9IDUyCi1JUF9GV19aRVJPID0gNTMKLUlQX0ZXX0dFVCA9IDU0Ci1JUF9GV19SRVNFVExPRyA9IDU1Ci1JUF9EVU1NWU5FVF9DT05GSUdVUkUgPSA2MAotSVBfRFVNTVlORVRfREVMID0gNjEKLUlQX0RVTU1ZTkVUX0ZMVVNIID0gNjIKLUlQX0RVTU1ZTkVUX0dFVCA9IDY0Ci1JUF9ERUZBVUxUX01VTFRJQ0FTVF9UVEwgPSAxCi1JUF9ERUZBVUxUX01VTFRJQ0FTVF9MT09QID0gMQotSVBfTUFYX01FTUJFUlNISVBTID0gMjAKLUlQX1BPUlRSQU5HRV9ERUZBVUxUID0gMAotSVBfUE9SVFJBTkdFX0hJR0ggPSAxCi1JUF9QT1JUUkFOR0VfTE9XID0gMgotSVBQUk9UT19NQVhJRCA9IChJUFBST1RPX0FIICsgMSkKLUlQQ1RMX0ZPUldBUkRJTkcgPSAxCi1JUENUTF9TRU5EUkVESVJFQ1RTID0gMgotSVBDVExfREVGVFRMID0gMwotSVBDVExfREVGTVRVID0gNAotSVBDVExfUlRFWFBJUkUgPSA1Ci1JUENUTF9SVE1JTkVYUElSRSA9IDYKLUlQQ1RMX1JUTUFYQ0FDSEUgPSA3Ci1JUENUTF9TT1VSQ0VST1VURSA9IDgKLUlQQ1RMX0RJUkVDVEVEQlJPQURDQVNUID0gOQotSVBDVExfSU5UUlFNQVhMRU4gPSAxMAotSVBDVExfSU5UUlFEUk9QUyA9IDExCi1JUENUTF9TVEFUUyA9IDEyCi1JUENUTF9BQ0NFUFRTT1VSQ0VST1VURSA9IDEzCi1JUENUTF9GQVNURk9SV0FSRElORyA9IDE0Ci1JUENUTF9LRUVQRkFJVEggPSAxNQotSVBDVExfR0lGX1RUTCA9IDE2Ci1JUENUTF9NQVhJRCA9IDE3Ci0KLSMgSW5jbHVkZWQgZnJvbSBuZXRpbmV0Ni9pbjYuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3F1ZXVlLmgKLWRlZiBTTElTVF9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpOiByZXR1cm4gXAotCi1kZWYgU0xJU1RfRU5UUlkodHlwZSk6IHJldHVybiBcCi0KLWRlZiBTVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKTogcmV0dXJuIFwKLQotZGVmIFNUQUlMUV9FTlRSWSh0eXBlKTogcmV0dXJuIFwKLQotZGVmIExJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKTogcmV0dXJuIFwKLQotZGVmIExJU1RfRU5UUlkodHlwZSk6IHJldHVybiBcCi0KLWRlZiBUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpOiByZXR1cm4gXAotCi1kZWYgVEFJTFFfRU5UUlkodHlwZSk6IHJldHVybiBcCi0KLWRlZiBDSVJDTEVRX0VOVFJZKHR5cGUpOiByZXR1cm4gXAotCi1fX0tBTUVfVkVSU0lPTiA9ICIyMDAwMDcwMS9GcmVlQlNELWN1cnJlbnQiCi1JUFY2UE9SVF9SRVNFUlZFRCA9IDEwMjQKLUlQVjZQT1JUX0FOT05NSU4gPSA0OTE1MgotSVBWNlBPUlRfQU5PTk1BWCA9IDY1NTM1Ci1JUFY2UE9SVF9SRVNFUlZFRE1JTiA9IDYwMAotSVBWNlBPUlRfUkVTRVJWRURNQVggPSAoSVBWNlBPUlRfUkVTRVJWRUQtMSkKLUlORVQ2X0FERFJTVFJMRU4gPSA0NgotSVBWNl9BRERSX0lOVDMyX09ORSA9IDEKLUlQVjZfQUREUl9JTlQzMl9UV08gPSAyCi1JUFY2X0FERFJfSU5UMzJfTU5MID0gMHhmZjAxMDAwMAotSVBWNl9BRERSX0lOVDMyX01MTCA9IDB4ZmYwMjAwMDAKLUlQVjZfQUREUl9JTlQzMl9TTVAgPSAweDAwMDBmZmZmCi1JUFY2X0FERFJfSU5UMTZfVUxMID0gMHhmZTgwCi1JUFY2X0FERFJfSU5UMTZfVVNMID0gMHhmZWMwCi1JUFY2X0FERFJfSU5UMTZfTUxMID0gMHhmZjAyCi1JUFY2X0FERFJfSU5UMzJfT05FID0gMHgwMTAwMDAwMAotSVBWNl9BRERSX0lOVDMyX1RXTyA9IDB4MDIwMDAwMDAKLUlQVjZfQUREUl9JTlQzMl9NTkwgPSAweDAwMDAwMWZmCi1JUFY2X0FERFJfSU5UMzJfTUxMID0gMHgwMDAwMDJmZgotSVBWNl9BRERSX0lOVDMyX1NNUCA9IDB4ZmZmZjAwMDAKLUlQVjZfQUREUl9JTlQxNl9VTEwgPSAweDgwZmUKLUlQVjZfQUREUl9JTlQxNl9VU0wgPSAweGMwZmUKLUlQVjZfQUREUl9JTlQxNl9NTEwgPSAweDAyZmYKLWRlZiBJTjZfSVNfQUREUl9VTlNQRUNJRklFRChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX0xPT1BCQUNLKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfVjRDT01QQVQoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9WNE1BUFBFRChhKTogcmV0dXJuIFwKLQotSVBWNl9BRERSX1NDT1BFX05PREVMT0NBTCA9IDB4MDEKLUlQVjZfQUREUl9TQ09QRV9MSU5LTE9DQUwgPSAweDAyCi1JUFY2X0FERFJfU0NPUEVfU0lURUxPQ0FMID0gMHgwNQotSVBWNl9BRERSX1NDT1BFX09SR0xPQ0FMID0gMHgwOAotSVBWNl9BRERSX1NDT1BFX0dMT0JBTCA9IDB4MGUKLV9fSVBWNl9BRERSX1NDT1BFX05PREVMT0NBTCA9IDB4MDEKLV9fSVBWNl9BRERSX1NDT1BFX0xJTktMT0NBTCA9IDB4MDIKLV9fSVBWNl9BRERSX1NDT1BFX1NJVEVMT0NBTCA9IDB4MDUKLV9fSVBWNl9BRERSX1NDT1BFX09SR0xPQ0FMID0gMHgwOAotX19JUFY2X0FERFJfU0NPUEVfR0xPQkFMID0gMHgwZQotZGVmIElONl9JU19BRERSX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX1NJVEVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX05PREVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX1NJVEVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX09SR0xPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfR0xPQkFMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfTk9ERUxPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfTElOS0xPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfU0lURUxPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfT1JHTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19HTE9CQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfU0NPUEVfTElOS0xPQ0FMKGEpOiByZXR1cm4gXAotCi1JUFY2X09QVElPTlMgPSAxCi1JUFY2X1JFQ1ZPUFRTID0gNQotSVBWNl9SRUNWUkVUT1BUUyA9IDYKLUlQVjZfUkVDVkRTVEFERFIgPSA3Ci1JUFY2X1JFVE9QVFMgPSA4Ci1JUFY2X1NPQ0tPUFRfUkVTRVJWRUQxID0gMwotSVBWNl9VTklDQVNUX0hPUFMgPSA0Ci1JUFY2X01VTFRJQ0FTVF9JRiA9IDkKLUlQVjZfTVVMVElDQVNUX0hPUFMgPSAxMAotSVBWNl9NVUxUSUNBU1RfTE9PUCA9IDExCi1JUFY2X0pPSU5fR1JPVVAgPSAxMgotSVBWNl9MRUFWRV9HUk9VUCA9IDEzCi1JUFY2X1BPUlRSQU5HRSA9IDE0Ci1JQ01QNl9GSUxURVIgPSAxOAotSVBWNl9QS1RJTkZPID0gMTkKLUlQVjZfSE9QTElNSVQgPSAyMAotSVBWNl9ORVhUSE9QID0gMjEKLUlQVjZfSE9QT1BUUyA9IDIyCi1JUFY2X0RTVE9QVFMgPSAyMwotSVBWNl9SVEhEUiA9IDI0Ci1JUFY2X1BLVE9QVElPTlMgPSAyNQotSVBWNl9DSEVDS1NVTSA9IDI2Ci1JUFY2X0JJTkRWNk9OTFkgPSAyNwotSVBWNl9JUFNFQ19QT0xJQ1kgPSAyOAotSVBWNl9GQUlUSCA9IDI5Ci1JUFY2X0ZXX0FERCA9IDMwCi1JUFY2X0ZXX0RFTCA9IDMxCi1JUFY2X0ZXX0ZMVVNIID0gMzIKLUlQVjZfRldfWkVSTyA9IDMzCi1JUFY2X0ZXX0dFVCA9IDM0Ci1JUFY2X1JUSERSX0xPT1NFID0gMAotSVBWNl9SVEhEUl9TVFJJQ1QgPSAxCi1JUFY2X1JUSERSX1RZUEVfMCA9IDAKLUlQVjZfREVGQVVMVF9NVUxUSUNBU1RfSE9QUyA9IDEKLUlQVjZfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCA9IDEKLUlQVjZfUE9SVFJBTkdFX0RFRkFVTFQgPSAwCi1JUFY2X1BPUlRSQU5HRV9ISUdIID0gMQotSVBWNl9QT1JUUkFOR0VfTE9XID0gMgotSVBWNlBST1RPX01BWElEID0gKElQUFJPVE9fUElNICsgMSkKLUlQVjZDVExfRk9SV0FSRElORyA9IDEKLUlQVjZDVExfU0VORFJFRElSRUNUUyA9IDIKLUlQVjZDVExfREVGSExJTSA9IDMKLUlQVjZDVExfREVGTVRVID0gNAotSVBWNkNUTF9GT1JXU1JDUlQgPSA1Ci1JUFY2Q1RMX1NUQVRTID0gNgotSVBWNkNUTF9NUlRTVEFUUyA9IDcKLUlQVjZDVExfTVJUUFJPVE8gPSA4Ci1JUFY2Q1RMX01BWEZSQUdQQUNLRVRTID0gOQotSVBWNkNUTF9TT1VSQ0VDSEVDSyA9IDEwCi1JUFY2Q1RMX1NPVVJDRUNIRUNLX0xPR0lOVCA9IDExCi1JUFY2Q1RMX0FDQ0VQVF9SVEFEViA9IDEyCi1JUFY2Q1RMX0tFRVBGQUlUSCA9IDEzCi1JUFY2Q1RMX0xPR19JTlRFUlZBTCA9IDE0Ci1JUFY2Q1RMX0hEUk5FU1RMSU1JVCA9IDE1Ci1JUFY2Q1RMX0RBRF9DT1VOVCA9IDE2Ci1JUFY2Q1RMX0FVVE9fRkxPV0xBQkVMID0gMTcKLUlQVjZDVExfREVGTUNBU1RITElNID0gMTgKLUlQVjZDVExfR0lGX0hMSU0gPSAxOQotSVBWNkNUTF9LQU1FX1ZFUlNJT04gPSAyMAotSVBWNkNUTF9VU0VfREVQUkVDQVRFRCA9IDIxCi1JUFY2Q1RMX1JSX1BSVU5FID0gMjIKLUlQVjZDVExfTUFQUEVEX0FERFIgPSAyMwotSVBWNkNUTF9CSU5EVjZPTkxZID0gMjQKLUlQVjZDVExfUlRFWFBJUkUgPSAyNQotSVBWNkNUTF9SVE1JTkVYUElSRSA9IDI2Ci1JUFY2Q1RMX1JUTUFYQ0FDSEUgPSAyNwotSVBWNkNUTF9NQVhJRCA9IDI4CmRpZmYgLS1naXQgYS9MaWIvcGxhdC1mcmVlYnNkNC9yZWdlbiBiL0xpYi9wbGF0LWZyZWVic2Q0L3JlZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YWE2ODk4Li4wMDAwMDAwCi0tLSBhL0xpYi9wbGF0LWZyZWVic2Q0L3JlZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jISAvYmluL3NoCi1zZXQgLXYKLXB5dGhvbiAuLi8uLi9Ub29scy9zY3JpcHRzL2gycHkucHkgLWkgJyh1X2xvbmcpJyAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1mcmVlYnNkNS9JTi5weSBiL0xpYi9wbGF0LWZyZWVic2Q1L0lOLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2EyNDE4Li4wMDAwMDAwCi0tLSBhL0xpYi9wbGF0LWZyZWVic2Q1L0lOLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLSMgR2VuZXJhdGVkIGJ5IGgycHkgZnJvbSAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCi1JUFBST1RPX0lQID0gMAotSVBQUk9UT19IT1BPUFRTID0gMAotSVBQUk9UT19JQ01QID0gMQotSVBQUk9UT19JR01QID0gMgotSVBQUk9UT19HR1AgPSAzCi1JUFBST1RPX0lQVjQgPSA0Ci1JUFBST1RPX0lQSVAgPSBJUFBST1RPX0lQVjQKLUlQUFJPVE9fVENQID0gNgotSVBQUk9UT19TVCA9IDcKLUlQUFJPVE9fRUdQID0gOAotSVBQUk9UT19QSUdQID0gOQotSVBQUk9UT19SQ0NNT04gPSAxMAotSVBQUk9UT19OVlBJSSA9IDExCi1JUFBST1RPX1BVUCA9IDEyCi1JUFBST1RPX0FSR1VTID0gMTMKLUlQUFJPVE9fRU1DT04gPSAxNAotSVBQUk9UT19YTkVUID0gMTUKLUlQUFJPVE9fQ0hBT1MgPSAxNgotSVBQUk9UT19VRFAgPSAxNwotSVBQUk9UT19NVVggPSAxOAotSVBQUk9UT19NRUFTID0gMTkKLUlQUFJPVE9fSE1QID0gMjAKLUlQUFJPVE9fUFJNID0gMjEKLUlQUFJPVE9fSURQID0gMjIKLUlQUFJPVE9fVFJVTksxID0gMjMKLUlQUFJPVE9fVFJVTksyID0gMjQKLUlQUFJPVE9fTEVBRjEgPSAyNQotSVBQUk9UT19MRUFGMiA9IDI2Ci1JUFBST1RPX1JEUCA9IDI3Ci1JUFBST1RPX0lSVFAgPSAyOAotSVBQUk9UT19UUCA9IDI5Ci1JUFBST1RPX0JMVCA9IDMwCi1JUFBST1RPX05TUCA9IDMxCi1JUFBST1RPX0lOUCA9IDMyCi1JUFBST1RPX1NFUCA9IDMzCi1JUFBST1RPXzNQQyA9IDM0Ci1JUFBST1RPX0lEUFIgPSAzNQotSVBQUk9UT19YVFAgPSAzNgotSVBQUk9UT19ERFAgPSAzNwotSVBQUk9UT19DTVRQID0gMzgKLUlQUFJPVE9fVFBYWCA9IDM5Ci1JUFBST1RPX0lMID0gNDAKLUlQUFJPVE9fSVBWNiA9IDQxCi1JUFBST1RPX1NEUlAgPSA0MgotSVBQUk9UT19ST1VUSU5HID0gNDMKLUlQUFJPVE9fRlJBR01FTlQgPSA0NAotSVBQUk9UT19JRFJQID0gNDUKLUlQUFJPVE9fUlNWUCA9IDQ2Ci1JUFBST1RPX0dSRSA9IDQ3Ci1JUFBST1RPX01IUlAgPSA0OAotSVBQUk9UT19CSEEgPSA0OQotSVBQUk9UT19FU1AgPSA1MAotSVBQUk9UT19BSCA9IDUxCi1JUFBST1RPX0lOTFNQID0gNTIKLUlQUFJPVE9fU1dJUEUgPSA1MwotSVBQUk9UT19OSFJQID0gNTQKLUlQUFJPVE9fSUNNUFY2ID0gNTgKLUlQUFJPVE9fTk9ORSA9IDU5Ci1JUFBST1RPX0RTVE9QVFMgPSA2MAotSVBQUk9UT19BSElQID0gNjEKLUlQUFJPVE9fQ0ZUUCA9IDYyCi1JUFBST1RPX0hFTExPID0gNjMKLUlQUFJPVE9fU0FURVhQQUsgPSA2NAotSVBQUk9UT19LUllQVE9MQU4gPSA2NQotSVBQUk9UT19SVkQgPSA2NgotSVBQUk9UT19JUFBDID0gNjcKLUlQUFJPVE9fQURGUyA9IDY4Ci1JUFBST1RPX1NBVE1PTiA9IDY5Ci1JUFBST1RPX1ZJU0EgPSA3MAotSVBQUk9UT19JUENWID0gNzEKLUlQUFJPVE9fQ1BOWCA9IDcyCi1JUFBST1RPX0NQSEIgPSA3MwotSVBQUk9UT19XU04gPSA3NAotSVBQUk9UT19QVlAgPSA3NQotSVBQUk9UT19CUlNBVE1PTiA9IDc2Ci1JUFBST1RPX05EID0gNzcKLUlQUFJPVE9fV0JNT04gPSA3OAotSVBQUk9UT19XQkVYUEFLID0gNzkKLUlQUFJPVE9fRU9OID0gODAKLUlQUFJPVE9fVk1UUCA9IDgxCi1JUFBST1RPX1NWTVRQID0gODIKLUlQUFJPVE9fVklORVMgPSA4MwotSVBQUk9UT19UVFAgPSA4NAotSVBQUk9UT19JR1AgPSA4NQotSVBQUk9UT19ER1AgPSA4NgotSVBQUk9UT19UQ0YgPSA4NwotSVBQUk9UT19JR1JQID0gODgKLUlQUFJPVE9fT1NQRklHUCA9IDg5Ci1JUFBST1RPX1NSUEMgPSA5MAotSVBQUk9UT19MQVJQID0gOTEKLUlQUFJPVE9fTVRQID0gOTIKLUlQUFJPVE9fQVgyNSA9IDkzCi1JUFBST1RPX0lQRUlQID0gOTQKLUlQUFJPVE9fTUlDUCA9IDk1Ci1JUFBST1RPX1NDQ1NQID0gOTYKLUlQUFJPVE9fRVRIRVJJUCA9IDk3Ci1JUFBST1RPX0VOQ0FQID0gOTgKLUlQUFJPVE9fQVBFUyA9IDk5Ci1JUFBST1RPX0dNVFAgPSAxMDAKLUlQUFJPVE9fSVBDT01QID0gMTA4Ci1JUFBST1RPX1BJTSA9IDEwMwotSVBQUk9UT19QR00gPSAxMTMKLUlQUFJPVE9fRElWRVJUID0gMjU0Ci1JUFBST1RPX1JBVyA9IDI1NQotSVBQUk9UT19NQVggPSAyNTYKLUlQUFJPVE9fRE9ORSA9IDI1NwotSVBQT1JUX1JFU0VSVkVEID0gMTAyNAotSVBQT1JUX1VTRVJSRVNFUlZFRCA9IDUwMDAKLUlQUE9SVF9ISUZJUlNUQVVUTyA9IDQ5MTUyCi1JUFBPUlRfSElMQVNUQVVUTyA9IDY1NTM1Ci1JUFBPUlRfUkVTRVJWRURTVEFSVCA9IDYwMAotZGVmIElOX0NMQVNTQShpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAweDgwMDAwMDAwKSA9PSAwKQotCi1JTl9DTEFTU0FfTkVUID0gMHhmZjAwMDAwMAotSU5fQ0xBU1NBX05TSElGVCA9IDI0Ci1JTl9DTEFTU0FfSE9TVCA9IDB4MDBmZmZmZmYKLUlOX0NMQVNTQV9NQVggPSAxMjgKLWRlZiBJTl9DTEFTU0IoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhjMDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkKLQotSU5fQ0xBU1NCX05FVCA9IDB4ZmZmZjAwMDAKLUlOX0NMQVNTQl9OU0hJRlQgPSAxNgotSU5fQ0xBU1NCX0hPU1QgPSAweDAwMDBmZmZmCi1JTl9DTEFTU0JfTUFYID0gNjU1MzYKLWRlZiBJTl9DTEFTU0MoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhlMDAwMDAwMCkgPT0gMHhjMDAwMDAwMCkKLQotSU5fQ0xBU1NDX05FVCA9IDB4ZmZmZmZmMDAKLUlOX0NMQVNTQ19OU0hJRlQgPSA4Ci1JTl9DTEFTU0NfSE9TVCA9IDB4MDAwMDAwZmYKLWRlZiBJTl9DTEFTU0QoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhmMDAwMDAwMCkgPT0gMHhlMDAwMDAwMCkKLQotSU5fQ0xBU1NEX05FVCA9IDB4ZjAwMDAwMDAKLUlOX0NMQVNTRF9OU0hJRlQgPSAyOAotSU5fQ0xBU1NEX0hPU1QgPSAweDBmZmZmZmZmCi1kZWYgSU5fTVVMVElDQVNUKGkpOiByZXR1cm4gSU5fQ0xBU1NEKGkpCi0KLWRlZiBJTl9FWFBFUklNRU5UQUwoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhmMDAwMDAwMCkgPT0gMHhmMDAwMDAwMCkKLQotZGVmIElOX0JBRENMQVNTKGkpOiByZXR1cm4gKCgodV9pbnQzMl90KShpKSAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDApCi0KLUlOQUREUl9OT05FID0gMHhmZmZmZmZmZgotSU5fTE9PUEJBQ0tORVQgPSAxMjcKLUlORVRfQUREUlNUUkxFTiA9IDE2Ci1JUF9PUFRJT05TID0gMQotSVBfSERSSU5DTCA9IDIKLUlQX1RPUyA9IDMKLUlQX1RUTCA9IDQKLUlQX1JFQ1ZPUFRTID0gNQotSVBfUkVDVlJFVE9QVFMgPSA2Ci1JUF9SRUNWRFNUQUREUiA9IDcKLUlQX1JFVE9QVFMgPSA4Ci1JUF9NVUxUSUNBU1RfSUYgPSA5Ci1JUF9NVUxUSUNBU1RfVFRMID0gMTAKLUlQX01VTFRJQ0FTVF9MT09QID0gMTEKLUlQX0FERF9NRU1CRVJTSElQID0gMTIKLUlQX0RST1BfTUVNQkVSU0hJUCA9IDEzCi1JUF9NVUxUSUNBU1RfVklGID0gMTQKLUlQX1JTVlBfT04gPSAxNQotSVBfUlNWUF9PRkYgPSAxNgotSVBfUlNWUF9WSUZfT04gPSAxNwotSVBfUlNWUF9WSUZfT0ZGID0gMTgKLUlQX1BPUlRSQU5HRSA9IDE5Ci1JUF9SRUNWSUYgPSAyMAotSVBfSVBTRUNfUE9MSUNZID0gMjEKLUlQX0ZBSVRIID0gMjIKLUlQX0ZXX0FERCA9IDUwCi1JUF9GV19ERUwgPSA1MQotSVBfRldfRkxVU0ggPSA1MgotSVBfRldfWkVSTyA9IDUzCi1JUF9GV19HRVQgPSA1NAotSVBfRldfUkVTRVRMT0cgPSA1NQotSVBfRFVNTVlORVRfQ09ORklHVVJFID0gNjAKLUlQX0RVTU1ZTkVUX0RFTCA9IDYxCi1JUF9EVU1NWU5FVF9GTFVTSCA9IDYyCi1JUF9EVU1NWU5FVF9HRVQgPSA2NAotSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMID0gMQotSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCA9IDEKLUlQX01BWF9NRU1CRVJTSElQUyA9IDIwCi1JUF9QT1JUUkFOR0VfREVGQVVMVCA9IDAKLUlQX1BPUlRSQU5HRV9ISUdIID0gMQotSVBfUE9SVFJBTkdFX0xPVyA9IDIKLUlQUFJPVE9fTUFYSUQgPSAoSVBQUk9UT19BSCArIDEpCi1JUENUTF9GT1JXQVJESU5HID0gMQotSVBDVExfU0VORFJFRElSRUNUUyA9IDIKLUlQQ1RMX0RFRlRUTCA9IDMKLUlQQ1RMX0RFRk1UVSA9IDQKLUlQQ1RMX1JURVhQSVJFID0gNQotSVBDVExfUlRNSU5FWFBJUkUgPSA2Ci1JUENUTF9SVE1BWENBQ0hFID0gNwotSVBDVExfU09VUkNFUk9VVEUgPSA4Ci1JUENUTF9ESVJFQ1RFREJST0FEQ0FTVCA9IDkKLUlQQ1RMX0lOVFJRTUFYTEVOID0gMTAKLUlQQ1RMX0lOVFJRRFJPUFMgPSAxMQotSVBDVExfU1RBVFMgPSAxMgotSVBDVExfQUNDRVBUU09VUkNFUk9VVEUgPSAxMwotSVBDVExfRkFTVEZPUldBUkRJTkcgPSAxNAotSVBDVExfS0VFUEZBSVRIID0gMTUKLUlQQ1RMX0dJRl9UVEwgPSAxNgotSVBDVExfTUFYSUQgPSAxNwotCi0jIEluY2x1ZGVkIGZyb20gbmV0aW5ldDYvaW42LmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9xdWV1ZS5oCi1kZWYgU0xJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKTogcmV0dXJuIFwKLQotZGVmIFNMSVNUX0VOVFJZKHR5cGUpOiByZXR1cm4gXAotCi1kZWYgU1RBSUxRX0hFQURfSU5JVElBTElaRVIoaGVhZCk6IHJldHVybiBcCi0KLWRlZiBTVEFJTFFfRU5UUlkodHlwZSk6IHJldHVybiBcCi0KLWRlZiBMSVNUX0hFQURfSU5JVElBTElaRVIoaGVhZCk6IHJldHVybiBcCi0KLWRlZiBMSVNUX0VOVFJZKHR5cGUpOiByZXR1cm4gXAotCi1kZWYgVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKTogcmV0dXJuIFwKLQotZGVmIFRBSUxRX0VOVFJZKHR5cGUpOiByZXR1cm4gXAotCi1kZWYgQ0lSQ0xFUV9FTlRSWSh0eXBlKTogcmV0dXJuIFwKLQotX19LQU1FX1ZFUlNJT04gPSAiMjAwMDA3MDEvRnJlZUJTRC1jdXJyZW50IgotSVBWNlBPUlRfUkVTRVJWRUQgPSAxMDI0Ci1JUFY2UE9SVF9BTk9OTUlOID0gNDkxNTIKLUlQVjZQT1JUX0FOT05NQVggPSA2NTUzNQotSVBWNlBPUlRfUkVTRVJWRURNSU4gPSA2MDAKLUlQVjZQT1JUX1JFU0VSVkVETUFYID0gKElQVjZQT1JUX1JFU0VSVkVELTEpCi1JTkVUNl9BRERSU1RSTEVOID0gNDYKLUlQVjZfQUREUl9JTlQzMl9PTkUgPSAxCi1JUFY2X0FERFJfSU5UMzJfVFdPID0gMgotSVBWNl9BRERSX0lOVDMyX01OTCA9IDB4ZmYwMTAwMDAKLUlQVjZfQUREUl9JTlQzMl9NTEwgPSAweGZmMDIwMDAwCi1JUFY2X0FERFJfSU5UMzJfU01QID0gMHgwMDAwZmZmZgotSVBWNl9BRERSX0lOVDE2X1VMTCA9IDB4ZmU4MAotSVBWNl9BRERSX0lOVDE2X1VTTCA9IDB4ZmVjMAotSVBWNl9BRERSX0lOVDE2X01MTCA9IDB4ZmYwMgotSVBWNl9BRERSX0lOVDMyX09ORSA9IDB4MDEwMDAwMDAKLUlQVjZfQUREUl9JTlQzMl9UV08gPSAweDAyMDAwMDAwCi1JUFY2X0FERFJfSU5UMzJfTU5MID0gMHgwMDAwMDFmZgotSVBWNl9BRERSX0lOVDMyX01MTCA9IDB4MDAwMDAyZmYKLUlQVjZfQUREUl9JTlQzMl9TTVAgPSAweGZmZmYwMDAwCi1JUFY2X0FERFJfSU5UMTZfVUxMID0gMHg4MGZlCi1JUFY2X0FERFJfSU5UMTZfVVNMID0gMHhjMGZlCi1JUFY2X0FERFJfSU5UMTZfTUxMID0gMHgwMmZmCi1kZWYgSU42X0lTX0FERFJfVU5TUEVDSUZJRUQoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9MT09QQkFDSyhhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX1Y0Q09NUEFUKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfVjRNQVBQRUQoYSk6IHJldHVybiBcCi0KLUlQVjZfQUREUl9TQ09QRV9OT0RFTE9DQUwgPSAweDAxCi1JUFY2X0FERFJfU0NPUEVfTElOS0xPQ0FMID0gMHgwMgotSVBWNl9BRERSX1NDT1BFX1NJVEVMT0NBTCA9IDB4MDUKLUlQVjZfQUREUl9TQ09QRV9PUkdMT0NBTCA9IDB4MDgKLUlQVjZfQUREUl9TQ09QRV9HTE9CQUwgPSAweDBlCi1fX0lQVjZfQUREUl9TQ09QRV9OT0RFTE9DQUwgPSAweDAxCi1fX0lQVjZfQUREUl9TQ09QRV9MSU5LTE9DQUwgPSAweDAyCi1fX0lQVjZfQUREUl9TQ09QRV9TSVRFTE9DQUwgPSAweDA1Ci1fX0lQVjZfQUREUl9TQ09QRV9PUkdMT0NBTCA9IDB4MDgKLV9fSVBWNl9BRERSX1NDT1BFX0dMT0JBTCA9IDB4MGUKLWRlZiBJTjZfSVNfQUREUl9MSU5LTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9TSVRFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19OT0RFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19TSVRFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19PUkdMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0dMT0JBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX05PREVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX1NJVEVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX09SR0xPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfR0xPQkFMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX1NDT1BFX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotSVBWNl9PUFRJT05TID0gMQotSVBWNl9SRUNWT1BUUyA9IDUKLUlQVjZfUkVDVlJFVE9QVFMgPSA2Ci1JUFY2X1JFQ1ZEU1RBRERSID0gNwotSVBWNl9SRVRPUFRTID0gOAotSVBWNl9TT0NLT1BUX1JFU0VSVkVEMSA9IDMKLUlQVjZfVU5JQ0FTVF9IT1BTID0gNAotSVBWNl9NVUxUSUNBU1RfSUYgPSA5Ci1JUFY2X01VTFRJQ0FTVF9IT1BTID0gMTAKLUlQVjZfTVVMVElDQVNUX0xPT1AgPSAxMQotSVBWNl9KT0lOX0dST1VQID0gMTIKLUlQVjZfTEVBVkVfR1JPVVAgPSAxMwotSVBWNl9QT1JUUkFOR0UgPSAxNAotSUNNUDZfRklMVEVSID0gMTgKLUlQVjZfUEtUSU5GTyA9IDE5Ci1JUFY2X0hPUExJTUlUID0gMjAKLUlQVjZfTkVYVEhPUCA9IDIxCi1JUFY2X0hPUE9QVFMgPSAyMgotSVBWNl9EU1RPUFRTID0gMjMKLUlQVjZfUlRIRFIgPSAyNAotSVBWNl9QS1RPUFRJT05TID0gMjUKLUlQVjZfQ0hFQ0tTVU0gPSAyNgotSVBWNl9CSU5EVjZPTkxZID0gMjcKLUlQVjZfSVBTRUNfUE9MSUNZID0gMjgKLUlQVjZfRkFJVEggPSAyOQotSVBWNl9GV19BREQgPSAzMAotSVBWNl9GV19ERUwgPSAzMQotSVBWNl9GV19GTFVTSCA9IDMyCi1JUFY2X0ZXX1pFUk8gPSAzMwotSVBWNl9GV19HRVQgPSAzNAotSVBWNl9SVEhEUl9MT09TRSA9IDAKLUlQVjZfUlRIRFJfU1RSSUNUID0gMQotSVBWNl9SVEhEUl9UWVBFXzAgPSAwCi1JUFY2X0RFRkFVTFRfTVVMVElDQVNUX0hPUFMgPSAxCi1JUFY2X0RFRkFVTFRfTVVMVElDQVNUX0xPT1AgPSAxCi1JUFY2X1BPUlRSQU5HRV9ERUZBVUxUID0gMAotSVBWNl9QT1JUUkFOR0VfSElHSCA9IDEKLUlQVjZfUE9SVFJBTkdFX0xPVyA9IDIKLUlQVjZQUk9UT19NQVhJRCA9IChJUFBST1RPX1BJTSArIDEpCi1JUFY2Q1RMX0ZPUldBUkRJTkcgPSAxCi1JUFY2Q1RMX1NFTkRSRURJUkVDVFMgPSAyCi1JUFY2Q1RMX0RFRkhMSU0gPSAzCi1JUFY2Q1RMX0RFRk1UVSA9IDQKLUlQVjZDVExfRk9SV1NSQ1JUID0gNQotSVBWNkNUTF9TVEFUUyA9IDYKLUlQVjZDVExfTVJUU1RBVFMgPSA3Ci1JUFY2Q1RMX01SVFBST1RPID0gOAotSVBWNkNUTF9NQVhGUkFHUEFDS0VUUyA9IDkKLUlQVjZDVExfU09VUkNFQ0hFQ0sgPSAxMAotSVBWNkNUTF9TT1VSQ0VDSEVDS19MT0dJTlQgPSAxMQotSVBWNkNUTF9BQ0NFUFRfUlRBRFYgPSAxMgotSVBWNkNUTF9LRUVQRkFJVEggPSAxMwotSVBWNkNUTF9MT0dfSU5URVJWQUwgPSAxNAotSVBWNkNUTF9IRFJORVNUTElNSVQgPSAxNQotSVBWNkNUTF9EQURfQ09VTlQgPSAxNgotSVBWNkNUTF9BVVRPX0ZMT1dMQUJFTCA9IDE3Ci1JUFY2Q1RMX0RFRk1DQVNUSExJTSA9IDE4Ci1JUFY2Q1RMX0dJRl9ITElNID0gMTkKLUlQVjZDVExfS0FNRV9WRVJTSU9OID0gMjAKLUlQVjZDVExfVVNFX0RFUFJFQ0FURUQgPSAyMQotSVBWNkNUTF9SUl9QUlVORSA9IDIyCi1JUFY2Q1RMX01BUFBFRF9BRERSID0gMjMKLUlQVjZDVExfQklORFY2T05MWSA9IDI0Ci1JUFY2Q1RMX1JURVhQSVJFID0gMjUKLUlQVjZDVExfUlRNSU5FWFBJUkUgPSAyNgotSVBWNkNUTF9SVE1BWENBQ0hFID0gMjcKLUlQVjZDVExfTUFYSUQgPSAyOApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtZnJlZWJzZDUvcmVnZW4gYi9MaWIvcGxhdC1mcmVlYnNkNS9yZWdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFhNjg5OC4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC1mcmVlYnNkNS9yZWdlbgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyEgL2Jpbi9zaAotc2V0IC12Ci1weXRob24gLi4vLi4vVG9vbHMvc2NyaXB0cy9oMnB5LnB5IC1pICcodV9sb25nKScgL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtZnJlZWJzZDYvSU4ucHkgYi9MaWIvcGxhdC1mcmVlYnNkNi9JTi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwYmY4NC4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC1mcmVlYnNkNi9JTi5weQorKysgL2Rldi9udWxsCkBAIC0xLDU1MSArMCwwIEBACi0jIEdlbmVyYXRlZCBieSBoMnB5IGZyb20gL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2NkZWZzLmgKLV9fR05VQ0xJS0VfQVNNID0gMwotX19HTlVDTElLRV9BU00gPSAyCi1fX0dOVUNMSUtFX19fVFlQRU9GID0gMQotX19HTlVDTElLRV9fX09GRlNFVE9GID0gMQotX19HTlVDTElLRV9fX1NFQ1RJT04gPSAxCi1fX0dOVUNMSUtFX0FUVFJJQlVURV9NT0RFX0RJID0gMQotX19HTlVDTElLRV9DVE9SX1NFQ1RJT05fSEFORExJTkcgPSAxCi1fX0dOVUNMSUtFX0JVSUxUSU5fQ09OU1RBTlRfUCA9IDEKLV9fR05VQ0xJS0VfQlVJTFRJTl9WQVJBUkdTID0gMQotX19HTlVDTElLRV9CVUlMVElOX1NUREFSRyA9IDEKLV9fR05VQ0xJS0VfQlVJTFRJTl9WQUFMSVNUID0gMQotX19HTlVDX1ZBX0xJU1RfQ09NUEFUSUJJTElUWSA9IDEKLV9fR05VQ0xJS0VfQlVJTFRJTl9ORVhUX0FSRyA9IDEKLV9fR05VQ0xJS0VfQlVJTFRJTl9NRU1DUFkgPSAxCi1fX0NDX1NVUFBPUlRTX0lOTElORSA9IDEKLV9fQ0NfU1VQUE9SVFNfX19JTkxJTkUgPSAxCi1fX0NDX1NVUFBPUlRTX19fSU5MSU5FX18gPSAxCi1fX0NDX1NVUFBPUlRTX19fRlVOQ19fID0gMQotX19DQ19TVVBQT1JUU19XQVJOSU5HID0gMQotX19DQ19TVVBQT1JUU19WQVJBRElDX1hYWCA9IDEKLV9fQ0NfU1VQUE9SVFNfRFlOQU1JQ19BUlJBWV9JTklUID0gMQotX19DQ19JTlRfSVNfMzJCSVQgPSAxCi1kZWYgX19QKHByb3Rvcyk6IHJldHVybiBwcm90b3MKLQotZGVmIF9fU1RSSU5HKHgpOiByZXR1cm4gI3gKLQotZGVmIF9fWFNUUklORyh4KTogcmV0dXJuIF9fU1RSSU5HKHgpCi0KLWRlZiBfX1AocHJvdG9zKTogcmV0dXJuICgpCi0KLWRlZiBfX1NUUklORyh4KTogcmV0dXJuICJ4IgotCi1kZWYgX19hbGlnbmVkKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oeCkpKQotCi1kZWYgX19zZWN0aW9uKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oeCkpKQotCi1kZWYgX19hbGlnbmVkKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oeCkpKQotCi1kZWYgX19zZWN0aW9uKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oeCkpKQotCi1kZWYgX19ub25udWxsKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19ub25udWxsX18oeCkpKQotCi1kZWYgX19wcmVkaWN0X3RydWUoZXhwKTogcmV0dXJuIF9fYnVpbHRpbl9leHBlY3QoKGV4cCksIDEpCi0KLWRlZiBfX3ByZWRpY3RfZmFsc2UoZXhwKTogcmV0dXJuIF9fYnVpbHRpbl9leHBlY3QoKGV4cCksIDApCi0KLWRlZiBfX3ByZWRpY3RfdHJ1ZShleHApOiByZXR1cm4gKGV4cCkKLQotZGVmIF9fcHJlZGljdF9mYWxzZShleHApOiByZXR1cm4gKGV4cCkKLQotZGVmIF9fZm9ybWF0X2FyZyhmbXRhcmcpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfYXJnX18gKGZtdGFyZykpKQotCi1kZWYgX19GQlNESUQocyk6IHJldHVybiBfX0lEU1RSSU5HKF9fQ09OQ0FUKF9fcmNzaWRfLF9fTElORV9fKSxzKQotCi1kZWYgX19SQ1NJRChzKTogcmV0dXJuIF9fSURTVFJJTkcoX19DT05DQVQoX19yY3NpZF8sX19MSU5FX18pLHMpCi0KLWRlZiBfX1JDU0lEX1NPVVJDRShzKTogcmV0dXJuIF9fSURTVFJJTkcoX19DT05DQVQoX19yY3NpZF9zb3VyY2VfLF9fTElORV9fKSxzKQotCi1kZWYgX19TQ0NTSUQocyk6IHJldHVybiBfX0lEU1RSSU5HKF9fQ09OQ0FUKF9fc2Njc2lkXyxfX0xJTkVfXykscykKLQotZGVmIF9fQ09QWVJJR0hUKHMpOiByZXR1cm4gX19JRFNUUklORyhfX0NPTkNBVChfX2NvcHlyaWdodF8sX19MSU5FX18pLHMpCi0KLV9QT1NJWF9DX1NPVVJDRSA9IDE5OTAwOQotX1BPU0lYX0NfU09VUkNFID0gMTk5MjA5Ci1fX1hTSV9WSVNJQkxFID0gNjAwCi1fUE9TSVhfQ19TT1VSQ0UgPSAyMDAxMTIKLV9fWFNJX1ZJU0lCTEUgPSA1MDAKLV9QT1NJWF9DX1NPVVJDRSA9IDE5OTUwNgotX1BPU0lYX0NfU09VUkNFID0gMTk4ODA4Ci1fX1BPU0lYX1ZJU0lCTEUgPSAyMDAxMTIKLV9fSVNPX0NfVklTSUJMRSA9IDE5OTkKLV9fUE9TSVhfVklTSUJMRSA9IDE5OTUwNgotX19JU09fQ19WSVNJQkxFID0gMTk5MAotX19QT1NJWF9WSVNJQkxFID0gMTk5MzA5Ci1fX0lTT19DX1ZJU0lCTEUgPSAxOTkwCi1fX1BPU0lYX1ZJU0lCTEUgPSAxOTkyMDkKLV9fSVNPX0NfVklTSUJMRSA9IDE5OTAKLV9fUE9TSVhfVklTSUJMRSA9IDE5OTAwOQotX19JU09fQ19WSVNJQkxFID0gMTk5MAotX19QT1NJWF9WSVNJQkxFID0gMTk4ODA4Ci1fX0lTT19DX1ZJU0lCTEUgPSAwCi1fX1BPU0lYX1ZJU0lCTEUgPSAwCi1fX1hTSV9WSVNJQkxFID0gMAotX19CU0RfVklTSUJMRSA9IDAKLV9fSVNPX0NfVklTSUJMRSA9IDE5OTAKLV9fUE9TSVhfVklTSUJMRSA9IDAKLV9fWFNJX1ZJU0lCTEUgPSAwCi1fX0JTRF9WSVNJQkxFID0gMAotX19JU09fQ19WSVNJQkxFID0gMTk5OQotX19QT1NJWF9WSVNJQkxFID0gMjAwMTEyCi1fX1hTSV9WSVNJQkxFID0gNjAwCi1fX0JTRF9WSVNJQkxFID0gMQotX19JU09fQ19WSVNJQkxFID0gMTk5OQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL190eXBlcy5oCi0KLSMgSW5jbHVkZWQgZnJvbSBtYWNoaW5lL190eXBlcy5oCi0KLSMgSW5jbHVkZWQgZnJvbSBtYWNoaW5lL2VuZGlhbi5oCi1fUVVBRF9ISUdIV09SRCA9IDEKLV9RVUFEX0xPV1dPUkQgPSAwCi1fTElUVExFX0VORElBTiA9IDEyMzQKLV9CSUdfRU5ESUFOID0gNDMyMQotX1BEUF9FTkRJQU4gPSAzNDEyCi1fQllURV9PUkRFUiA9IF9MSVRUTEVfRU5ESUFOCi1MSVRUTEVfRU5ESUFOID0gX0xJVFRMRV9FTkRJQU4KLUJJR19FTkRJQU4gPSBfQklHX0VORElBTgotUERQX0VORElBTiA9IF9QRFBfRU5ESUFOCi1CWVRFX09SREVSID0gX0JZVEVfT1JERVIKLWRlZiBfX3dvcmRfc3dhcF9pbnRfdmFyKHgpOiByZXR1cm4gXAotCi1kZWYgX193b3JkX3N3YXBfaW50X2NvbnN0KHgpOiByZXR1cm4gXAotCi1kZWYgX193b3JkX3N3YXBfaW50KHgpOiByZXR1cm4gX193b3JkX3N3YXBfaW50X3Zhcih4KQotCi1kZWYgX19ieXRlX3N3YXBfaW50X3Zhcih4KTogcmV0dXJuIFwKLQotZGVmIF9fYnl0ZV9zd2FwX2ludF9jb25zdCh4KTogcmV0dXJuIFwKLQotZGVmIF9fYnl0ZV9zd2FwX2ludCh4KTogcmV0dXJuIF9fYnl0ZV9zd2FwX2ludF92YXIoeCkKLQotZGVmIF9fYnl0ZV9zd2FwX2xvbmdfdmFyKHgpOiByZXR1cm4gXAotCi1kZWYgX19ieXRlX3N3YXBfbG9uZ19jb25zdCh4KTogcmV0dXJuIFwKLQotZGVmIF9fYnl0ZV9zd2FwX2xvbmcoeCk6IHJldHVybiBfX2J5dGVfc3dhcF9sb25nX3Zhcih4KQotCi1kZWYgX19ieXRlX3N3YXBfd29yZF92YXIoeCk6IHJldHVybiBcCi0KLWRlZiBfX2J5dGVfc3dhcF93b3JkX2NvbnN0KHgpOiByZXR1cm4gXAotCi1kZWYgX19ieXRlX3N3YXBfd29yZCh4KTogcmV0dXJuIF9fYnl0ZV9zd2FwX3dvcmRfdmFyKHgpCi0KLWRlZiBfX2h0b25sKHgpOiByZXR1cm4gX19ic3dhcDMyKHgpCi0KLWRlZiBfX2h0b25zKHgpOiByZXR1cm4gX19ic3dhcDE2KHgpCi0KLWRlZiBfX250b2hsKHgpOiByZXR1cm4gX19ic3dhcDMyKHgpCi0KLWRlZiBfX250b2hzKHgpOiByZXR1cm4gX19ic3dhcDE2KHgpCi0KLUlQUFJPVE9fSVAgPSAwCi1JUFBST1RPX0lDTVAgPSAxCi1JUFBST1RPX1RDUCA9IDYKLUlQUFJPVE9fVURQID0gMTcKLWRlZiBodG9ubCh4KTogcmV0dXJuIF9faHRvbmwoeCkKLQotZGVmIGh0b25zKHgpOiByZXR1cm4gX19odG9ucyh4KQotCi1kZWYgbnRvaGwoeCk6IHJldHVybiBfX250b2hsKHgpCi0KLWRlZiBudG9ocyh4KTogcmV0dXJuIF9fbnRvaHMoeCkKLQotSVBQUk9UT19SQVcgPSAyNTUKLUlORVRfQUREUlNUUkxFTiA9IDE2Ci1JUFBST1RPX0hPUE9QVFMgPSAwCi1JUFBST1RPX0lHTVAgPSAyCi1JUFBST1RPX0dHUCA9IDMKLUlQUFJPVE9fSVBWNCA9IDQKLUlQUFJPVE9fSVBJUCA9IElQUFJPVE9fSVBWNAotSVBQUk9UT19TVCA9IDcKLUlQUFJPVE9fRUdQID0gOAotSVBQUk9UT19QSUdQID0gOQotSVBQUk9UT19SQ0NNT04gPSAxMAotSVBQUk9UT19OVlBJSSA9IDExCi1JUFBST1RPX1BVUCA9IDEyCi1JUFBST1RPX0FSR1VTID0gMTMKLUlQUFJPVE9fRU1DT04gPSAxNAotSVBQUk9UT19YTkVUID0gMTUKLUlQUFJPVE9fQ0hBT1MgPSAxNgotSVBQUk9UT19NVVggPSAxOAotSVBQUk9UT19NRUFTID0gMTkKLUlQUFJPVE9fSE1QID0gMjAKLUlQUFJPVE9fUFJNID0gMjEKLUlQUFJPVE9fSURQID0gMjIKLUlQUFJPVE9fVFJVTksxID0gMjMKLUlQUFJPVE9fVFJVTksyID0gMjQKLUlQUFJPVE9fTEVBRjEgPSAyNQotSVBQUk9UT19MRUFGMiA9IDI2Ci1JUFBST1RPX1JEUCA9IDI3Ci1JUFBST1RPX0lSVFAgPSAyOAotSVBQUk9UT19UUCA9IDI5Ci1JUFBST1RPX0JMVCA9IDMwCi1JUFBST1RPX05TUCA9IDMxCi1JUFBST1RPX0lOUCA9IDMyCi1JUFBST1RPX1NFUCA9IDMzCi1JUFBST1RPXzNQQyA9IDM0Ci1JUFBST1RPX0lEUFIgPSAzNQotSVBQUk9UT19YVFAgPSAzNgotSVBQUk9UT19ERFAgPSAzNwotSVBQUk9UT19DTVRQID0gMzgKLUlQUFJPVE9fVFBYWCA9IDM5Ci1JUFBST1RPX0lMID0gNDAKLUlQUFJPVE9fSVBWNiA9IDQxCi1JUFBST1RPX1NEUlAgPSA0MgotSVBQUk9UT19ST1VUSU5HID0gNDMKLUlQUFJPVE9fRlJBR01FTlQgPSA0NAotSVBQUk9UT19JRFJQID0gNDUKLUlQUFJPVE9fUlNWUCA9IDQ2Ci1JUFBST1RPX0dSRSA9IDQ3Ci1JUFBST1RPX01IUlAgPSA0OAotSVBQUk9UT19CSEEgPSA0OQotSVBQUk9UT19FU1AgPSA1MAotSVBQUk9UT19BSCA9IDUxCi1JUFBST1RPX0lOTFNQID0gNTIKLUlQUFJPVE9fU1dJUEUgPSA1MwotSVBQUk9UT19OSFJQID0gNTQKLUlQUFJPVE9fTU9CSUxFID0gNTUKLUlQUFJPVE9fVExTUCA9IDU2Ci1JUFBST1RPX1NLSVAgPSA1NwotSVBQUk9UT19JQ01QVjYgPSA1OAotSVBQUk9UT19OT05FID0gNTkKLUlQUFJPVE9fRFNUT1BUUyA9IDYwCi1JUFBST1RPX0FISVAgPSA2MQotSVBQUk9UT19DRlRQID0gNjIKLUlQUFJPVE9fSEVMTE8gPSA2MwotSVBQUk9UT19TQVRFWFBBSyA9IDY0Ci1JUFBST1RPX0tSWVBUT0xBTiA9IDY1Ci1JUFBST1RPX1JWRCA9IDY2Ci1JUFBST1RPX0lQUEMgPSA2NwotSVBQUk9UT19BREZTID0gNjgKLUlQUFJPVE9fU0FUTU9OID0gNjkKLUlQUFJPVE9fVklTQSA9IDcwCi1JUFBST1RPX0lQQ1YgPSA3MQotSVBQUk9UT19DUE5YID0gNzIKLUlQUFJPVE9fQ1BIQiA9IDczCi1JUFBST1RPX1dTTiA9IDc0Ci1JUFBST1RPX1BWUCA9IDc1Ci1JUFBST1RPX0JSU0FUTU9OID0gNzYKLUlQUFJPVE9fTkQgPSA3NwotSVBQUk9UT19XQk1PTiA9IDc4Ci1JUFBST1RPX1dCRVhQQUsgPSA3OQotSVBQUk9UT19FT04gPSA4MAotSVBQUk9UT19WTVRQID0gODEKLUlQUFJPVE9fU1ZNVFAgPSA4MgotSVBQUk9UT19WSU5FUyA9IDgzCi1JUFBST1RPX1RUUCA9IDg0Ci1JUFBST1RPX0lHUCA9IDg1Ci1JUFBST1RPX0RHUCA9IDg2Ci1JUFBST1RPX1RDRiA9IDg3Ci1JUFBST1RPX0lHUlAgPSA4OAotSVBQUk9UT19PU1BGSUdQID0gODkKLUlQUFJPVE9fU1JQQyA9IDkwCi1JUFBST1RPX0xBUlAgPSA5MQotSVBQUk9UT19NVFAgPSA5MgotSVBQUk9UT19BWDI1ID0gOTMKLUlQUFJPVE9fSVBFSVAgPSA5NAotSVBQUk9UT19NSUNQID0gOTUKLUlQUFJPVE9fU0NDU1AgPSA5NgotSVBQUk9UT19FVEhFUklQID0gOTcKLUlQUFJPVE9fRU5DQVAgPSA5OAotSVBQUk9UT19BUEVTID0gOTkKLUlQUFJPVE9fR01UUCA9IDEwMAotSVBQUk9UT19JUENPTVAgPSAxMDgKLUlQUFJPVE9fU0NUUCA9IDEzMgotSVBQUk9UT19QSU0gPSAxMDMKLUlQUFJPVE9fQ0FSUCA9IDExMgotSVBQUk9UT19QR00gPSAxMTMKLUlQUFJPVE9fUEZTWU5DID0gMjQwCi1JUFBST1RPX09MRF9ESVZFUlQgPSAyNTQKLUlQUFJPVE9fTUFYID0gMjU2Ci1JUFBST1RPX0RPTkUgPSAyNTcKLUlQUFJPVE9fRElWRVJUID0gMjU4Ci1JUFBST1RPX1NQQUNFUiA9IDMyNzY3Ci1JUFBPUlRfUkVTRVJWRUQgPSAxMDI0Ci1JUFBPUlRfSElGSVJTVEFVVE8gPSA0OTE1MgotSVBQT1JUX0hJTEFTVEFVVE8gPSA2NTUzNQotSVBQT1JUX1JFU0VSVkVEU1RBUlQgPSA2MDAKLUlQUE9SVF9NQVggPSA2NTUzNQotZGVmIElOX0NMQVNTQShpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAweDgwMDAwMDAwKSA9PSAwKQotCi1JTl9DTEFTU0FfTkVUID0gMHhmZjAwMDAwMAotSU5fQ0xBU1NBX05TSElGVCA9IDI0Ci1JTl9DTEFTU0FfSE9TVCA9IDB4MDBmZmZmZmYKLUlOX0NMQVNTQV9NQVggPSAxMjgKLWRlZiBJTl9DTEFTU0IoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhjMDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkKLQotSU5fQ0xBU1NCX05FVCA9IDB4ZmZmZjAwMDAKLUlOX0NMQVNTQl9OU0hJRlQgPSAxNgotSU5fQ0xBU1NCX0hPU1QgPSAweDAwMDBmZmZmCi1JTl9DTEFTU0JfTUFYID0gNjU1MzYKLWRlZiBJTl9DTEFTU0MoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhlMDAwMDAwMCkgPT0gMHhjMDAwMDAwMCkKLQotSU5fQ0xBU1NDX05FVCA9IDB4ZmZmZmZmMDAKLUlOX0NMQVNTQ19OU0hJRlQgPSA4Ci1JTl9DTEFTU0NfSE9TVCA9IDB4MDAwMDAwZmYKLWRlZiBJTl9DTEFTU0QoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhmMDAwMDAwMCkgPT0gMHhlMDAwMDAwMCkKLQotSU5fQ0xBU1NEX05FVCA9IDB4ZjAwMDAwMDAKLUlOX0NMQVNTRF9OU0hJRlQgPSAyOAotSU5fQ0xBU1NEX0hPU1QgPSAweDBmZmZmZmZmCi1kZWYgSU5fTVVMVElDQVNUKGkpOiByZXR1cm4gSU5fQ0xBU1NEKGkpCi0KLWRlZiBJTl9FWFBFUklNRU5UQUwoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhmMDAwMDAwMCkgPT0gMHhmMDAwMDAwMCkKLQotZGVmIElOX0JBRENMQVNTKGkpOiByZXR1cm4gKCgodV9pbnQzMl90KShpKSAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDApCi0KLUlOQUREUl9OT05FID0gMHhmZmZmZmZmZgotSU5fTE9PUEJBQ0tORVQgPSAxMjcKLUlQX09QVElPTlMgPSAxCi1JUF9IRFJJTkNMID0gMgotSVBfVE9TID0gMwotSVBfVFRMID0gNAotSVBfUkVDVk9QVFMgPSA1Ci1JUF9SRUNWUkVUT1BUUyA9IDYKLUlQX1JFQ1ZEU1RBRERSID0gNwotSVBfU0VORFNSQ0FERFIgPSBJUF9SRUNWRFNUQUREUgotSVBfUkVUT1BUUyA9IDgKLUlQX01VTFRJQ0FTVF9JRiA9IDkKLUlQX01VTFRJQ0FTVF9UVEwgPSAxMAotSVBfTVVMVElDQVNUX0xPT1AgPSAxMQotSVBfQUREX01FTUJFUlNISVAgPSAxMgotSVBfRFJPUF9NRU1CRVJTSElQID0gMTMKLUlQX01VTFRJQ0FTVF9WSUYgPSAxNAotSVBfUlNWUF9PTiA9IDE1Ci1JUF9SU1ZQX09GRiA9IDE2Ci1JUF9SU1ZQX1ZJRl9PTiA9IDE3Ci1JUF9SU1ZQX1ZJRl9PRkYgPSAxOAotSVBfUE9SVFJBTkdFID0gMTkKLUlQX1JFQ1ZJRiA9IDIwCi1JUF9JUFNFQ19QT0xJQ1kgPSAyMQotSVBfRkFJVEggPSAyMgotSVBfT05FU0JDQVNUID0gMjMKLUlQX0ZXX1RBQkxFX0FERCA9IDQwCi1JUF9GV19UQUJMRV9ERUwgPSA0MQotSVBfRldfVEFCTEVfRkxVU0ggPSA0MgotSVBfRldfVEFCTEVfR0VUU0laRSA9IDQzCi1JUF9GV19UQUJMRV9MSVNUID0gNDQKLUlQX0ZXX0FERCA9IDUwCi1JUF9GV19ERUwgPSA1MQotSVBfRldfRkxVU0ggPSA1MgotSVBfRldfWkVSTyA9IDUzCi1JUF9GV19HRVQgPSA1NAotSVBfRldfUkVTRVRMT0cgPSA1NQotSVBfRFVNTVlORVRfQ09ORklHVVJFID0gNjAKLUlQX0RVTU1ZTkVUX0RFTCA9IDYxCi1JUF9EVU1NWU5FVF9GTFVTSCA9IDYyCi1JUF9EVU1NWU5FVF9HRVQgPSA2NAotSVBfUkVDVlRUTCA9IDY1Ci1JUF9NSU5UVEwgPSA2NgotSVBfRE9OVEZSQUcgPSA2NwotSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMID0gMQotSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCA9IDEKLUlQX01BWF9NRU1CRVJTSElQUyA9IDIwCi1JUF9QT1JUUkFOR0VfREVGQVVMVCA9IDAKLUlQX1BPUlRSQU5HRV9ISUdIID0gMQotSVBfUE9SVFJBTkdFX0xPVyA9IDIKLUlQUFJPVE9fTUFYSUQgPSAoSVBQUk9UT19BSCArIDEpCi1JUENUTF9GT1JXQVJESU5HID0gMQotSVBDVExfU0VORFJFRElSRUNUUyA9IDIKLUlQQ1RMX0RFRlRUTCA9IDMKLUlQQ1RMX0RFRk1UVSA9IDQKLUlQQ1RMX1JURVhQSVJFID0gNQotSVBDVExfUlRNSU5FWFBJUkUgPSA2Ci1JUENUTF9SVE1BWENBQ0hFID0gNwotSVBDVExfU09VUkNFUk9VVEUgPSA4Ci1JUENUTF9ESVJFQ1RFREJST0FEQ0FTVCA9IDkKLUlQQ1RMX0lOVFJRTUFYTEVOID0gMTAKLUlQQ1RMX0lOVFJRRFJPUFMgPSAxMQotSVBDVExfU1RBVFMgPSAxMgotSVBDVExfQUNDRVBUU09VUkNFUk9VVEUgPSAxMwotSVBDVExfRkFTVEZPUldBUkRJTkcgPSAxNAotSVBDVExfS0VFUEZBSVRIID0gMTUKLUlQQ1RMX0dJRl9UVEwgPSAxNgotSVBDVExfTUFYSUQgPSAxNwotZGVmIGluX251bGxob3N0KHgpOiByZXR1cm4gKCh4KS5zX2FkZHIgPT0gSU5BRERSX0FOWSkKLQotCi0jIEluY2x1ZGVkIGZyb20gbmV0aW5ldDYvaW42LmgKLV9fS0FNRV9WRVJTSU9OID0gIkZyZWVCU0QiCi1JUFY2UE9SVF9SRVNFUlZFRCA9IDEwMjQKLUlQVjZQT1JUX0FOT05NSU4gPSA0OTE1MgotSVBWNlBPUlRfQU5PTk1BWCA9IDY1NTM1Ci1JUFY2UE9SVF9SRVNFUlZFRE1JTiA9IDYwMAotSVBWNlBPUlRfUkVTRVJWRURNQVggPSAoSVBWNlBPUlRfUkVTRVJWRUQtMSkKLUlORVQ2X0FERFJTVFJMRU4gPSA0NgotSVBWNl9BRERSX0lOVDMyX09ORSA9IDEKLUlQVjZfQUREUl9JTlQzMl9UV08gPSAyCi1JUFY2X0FERFJfSU5UMzJfTU5MID0gMHhmZjAxMDAwMAotSVBWNl9BRERSX0lOVDMyX01MTCA9IDB4ZmYwMjAwMDAKLUlQVjZfQUREUl9JTlQzMl9TTVAgPSAweDAwMDBmZmZmCi1JUFY2X0FERFJfSU5UMTZfVUxMID0gMHhmZTgwCi1JUFY2X0FERFJfSU5UMTZfVVNMID0gMHhmZWMwCi1JUFY2X0FERFJfSU5UMTZfTUxMID0gMHhmZjAyCi1JUFY2X0FERFJfSU5UMzJfT05FID0gMHgwMTAwMDAwMAotSVBWNl9BRERSX0lOVDMyX1RXTyA9IDB4MDIwMDAwMDAKLUlQVjZfQUREUl9JTlQzMl9NTkwgPSAweDAwMDAwMWZmCi1JUFY2X0FERFJfSU5UMzJfTUxMID0gMHgwMDAwMDJmZgotSVBWNl9BRERSX0lOVDMyX1NNUCA9IDB4ZmZmZjAwMDAKLUlQVjZfQUREUl9JTlQxNl9VTEwgPSAweDgwZmUKLUlQVjZfQUREUl9JTlQxNl9VU0wgPSAweGMwZmUKLUlQVjZfQUREUl9JTlQxNl9NTEwgPSAweDAyZmYKLWRlZiBJTjZfSVNfQUREUl9VTlNQRUNJRklFRChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX0xPT1BCQUNLKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfVjRDT01QQVQoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9WNE1BUFBFRChhKTogcmV0dXJuIFwKLQotSVBWNl9BRERSX1NDT1BFX05PREVMT0NBTCA9IDB4MDEKLUlQVjZfQUREUl9TQ09QRV9JTlRGQUNFTE9DQUwgPSAweDAxCi1JUFY2X0FERFJfU0NPUEVfTElOS0xPQ0FMID0gMHgwMgotSVBWNl9BRERSX1NDT1BFX1NJVEVMT0NBTCA9IDB4MDUKLUlQVjZfQUREUl9TQ09QRV9PUkdMT0NBTCA9IDB4MDgKLUlQVjZfQUREUl9TQ09QRV9HTE9CQUwgPSAweDBlCi1fX0lQVjZfQUREUl9TQ09QRV9OT0RFTE9DQUwgPSAweDAxCi1fX0lQVjZfQUREUl9TQ09QRV9JTlRGQUNFTE9DQUwgPSAweDAxCi1fX0lQVjZfQUREUl9TQ09QRV9MSU5LTE9DQUwgPSAweDAyCi1fX0lQVjZfQUREUl9TQ09QRV9TSVRFTE9DQUwgPSAweDA1Ci1fX0lQVjZfQUREUl9TQ09QRV9PUkdMT0NBTCA9IDB4MDgKLV9fSVBWNl9BRERSX1NDT1BFX0dMT0JBTCA9IDB4MGUKLWRlZiBJTjZfSVNfQUREUl9MSU5LTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9TSVRFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19OT0RFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19JTlRGQUNFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19TSVRFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19PUkdMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0dMT0JBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX05PREVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX1NJVEVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX09SR0xPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfR0xPQkFMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX1NDT1BFX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElGQTZfSVNfREVQUkVDQVRFRChhKTogcmV0dXJuIFwKLQotZGVmIElGQTZfSVNfSU5WQUxJRChhKTogcmV0dXJuIFwKLQotSVBWNl9PUFRJT05TID0gMQotSVBWNl9SRUNWT1BUUyA9IDUKLUlQVjZfUkVDVlJFVE9QVFMgPSA2Ci1JUFY2X1JFQ1ZEU1RBRERSID0gNwotSVBWNl9SRVRPUFRTID0gOAotSVBWNl9TT0NLT1BUX1JFU0VSVkVEMSA9IDMKLUlQVjZfVU5JQ0FTVF9IT1BTID0gNAotSVBWNl9NVUxUSUNBU1RfSUYgPSA5Ci1JUFY2X01VTFRJQ0FTVF9IT1BTID0gMTAKLUlQVjZfTVVMVElDQVNUX0xPT1AgPSAxMQotSVBWNl9KT0lOX0dST1VQID0gMTIKLUlQVjZfTEVBVkVfR1JPVVAgPSAxMwotSVBWNl9QT1JUUkFOR0UgPSAxNAotSUNNUDZfRklMVEVSID0gMTgKLUlQVjZfMjI5MlBLVElORk8gPSAxOQotSVBWNl8yMjkySE9QTElNSVQgPSAyMAotSVBWNl8yMjkyTkVYVEhPUCA9IDIxCi1JUFY2XzIyOTJIT1BPUFRTID0gMjIKLUlQVjZfMjI5MkRTVE9QVFMgPSAyMwotSVBWNl8yMjkyUlRIRFIgPSAyNAotSVBWNl8yMjkyUEtUT1BUSU9OUyA9IDI1Ci1JUFY2X0NIRUNLU1VNID0gMjYKLUlQVjZfVjZPTkxZID0gMjcKLUlQVjZfQklORFY2T05MWSA9IElQVjZfVjZPTkxZCi1JUFY2X0lQU0VDX1BPTElDWSA9IDI4Ci1JUFY2X0ZBSVRIID0gMjkKLUlQVjZfRldfQUREID0gMzAKLUlQVjZfRldfREVMID0gMzEKLUlQVjZfRldfRkxVU0ggPSAzMgotSVBWNl9GV19aRVJPID0gMzMKLUlQVjZfRldfR0VUID0gMzQKLUlQVjZfUlRIRFJEU1RPUFRTID0gMzUKLUlQVjZfUkVDVlBLVElORk8gPSAzNgotSVBWNl9SRUNWSE9QTElNSVQgPSAzNwotSVBWNl9SRUNWUlRIRFIgPSAzOAotSVBWNl9SRUNWSE9QT1BUUyA9IDM5Ci1JUFY2X1JFQ1ZEU1RPUFRTID0gNDAKLUlQVjZfUkVDVlJUSERSRFNUT1BUUyA9IDQxCi1JUFY2X1VTRV9NSU5fTVRVID0gNDIKLUlQVjZfUkVDVlBBVEhNVFUgPSA0MwotSVBWNl9QQVRITVRVID0gNDQKLUlQVjZfUkVBQ0hDT05GID0gNDUKLUlQVjZfUEtUSU5GTyA9IDQ2Ci1JUFY2X0hPUExJTUlUID0gNDcKLUlQVjZfTkVYVEhPUCA9IDQ4Ci1JUFY2X0hPUE9QVFMgPSA0OQotSVBWNl9EU1RPUFRTID0gNTAKLUlQVjZfUlRIRFIgPSA1MQotSVBWNl9QS1RPUFRJT05TID0gNTIKLUlQVjZfUkVDVlRDTEFTUyA9IDU3Ci1JUFY2X0FVVE9GTE9XTEFCRUwgPSA1OQotSVBWNl9UQ0xBU1MgPSA2MQotSVBWNl9ET05URlJBRyA9IDYyCi1JUFY2X1BSRUZFUl9URU1QQUREUiA9IDYzCi1JUFY2X1JUSERSX0xPT1NFID0gMAotSVBWNl9SVEhEUl9TVFJJQ1QgPSAxCi1JUFY2X1JUSERSX1RZUEVfMCA9IDAKLUlQVjZfREVGQVVMVF9NVUxUSUNBU1RfSE9QUyA9IDEKLUlQVjZfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCA9IDEKLUlQVjZfUE9SVFJBTkdFX0RFRkFVTFQgPSAwCi1JUFY2X1BPUlRSQU5HRV9ISUdIID0gMQotSVBWNl9QT1JUUkFOR0VfTE9XID0gMgotSVBWNlBST1RPX01BWElEID0gKElQUFJPVE9fUElNICsgMSkKLUlQVjZDVExfRk9SV0FSRElORyA9IDEKLUlQVjZDVExfU0VORFJFRElSRUNUUyA9IDIKLUlQVjZDVExfREVGSExJTSA9IDMKLUlQVjZDVExfREVGTVRVID0gNAotSVBWNkNUTF9GT1JXU1JDUlQgPSA1Ci1JUFY2Q1RMX1NUQVRTID0gNgotSVBWNkNUTF9NUlRTVEFUUyA9IDcKLUlQVjZDVExfTVJUUFJPVE8gPSA4Ci1JUFY2Q1RMX01BWEZSQUdQQUNLRVRTID0gOQotSVBWNkNUTF9TT1VSQ0VDSEVDSyA9IDEwCi1JUFY2Q1RMX1NPVVJDRUNIRUNLX0xPR0lOVCA9IDExCi1JUFY2Q1RMX0FDQ0VQVF9SVEFEViA9IDEyCi1JUFY2Q1RMX0tFRVBGQUlUSCA9IDEzCi1JUFY2Q1RMX0xPR19JTlRFUlZBTCA9IDE0Ci1JUFY2Q1RMX0hEUk5FU1RMSU1JVCA9IDE1Ci1JUFY2Q1RMX0RBRF9DT1VOVCA9IDE2Ci1JUFY2Q1RMX0FVVE9fRkxPV0xBQkVMID0gMTcKLUlQVjZDVExfREVGTUNBU1RITElNID0gMTgKLUlQVjZDVExfR0lGX0hMSU0gPSAxOQotSVBWNkNUTF9LQU1FX1ZFUlNJT04gPSAyMAotSVBWNkNUTF9VU0VfREVQUkVDQVRFRCA9IDIxCi1JUFY2Q1RMX1JSX1BSVU5FID0gMjIKLUlQVjZDVExfTUFQUEVEX0FERFIgPSAyMwotSVBWNkNUTF9WNk9OTFkgPSAyNAotSVBWNkNUTF9SVEVYUElSRSA9IDI1Ci1JUFY2Q1RMX1JUTUlORVhQSVJFID0gMjYKLUlQVjZDVExfUlRNQVhDQUNIRSA9IDI3Ci1JUFY2Q1RMX1VTRVRFTVBBRERSID0gMzIKLUlQVjZDVExfVEVNUFBMVElNRSA9IDMzCi1JUFY2Q1RMX1RFTVBWTFRJTUUgPSAzNAotSVBWNkNUTF9BVVRPX0xJTktMT0NBTCA9IDM1Ci1JUFY2Q1RMX1JJUDZTVEFUUyA9IDM2Ci1JUFY2Q1RMX1BSRUZFUl9URU1QQUREUiA9IDM3Ci1JUFY2Q1RMX0FERFJDVExQT0xJQ1kgPSAzOAotSVBWNkNUTF9VU0VfREVGQVVMVFpPTkUgPSAzOQotSVBWNkNUTF9NQVhGUkFHUyA9IDQxCi1JUFY2Q1RMX0lGUSA9IDQyCi1JUFY2Q1RMX0lTQVRBUFJUUiA9IDQzCi1JUFY2Q1RMX01DQVNUX1BNVFUgPSA0NAotSVBWNkNUTF9TVEVBTFRIID0gNDUKLUlQVjZDVExfTUFYSUQgPSA0NgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtZnJlZWJzZDYvcmVnZW4gYi9MaWIvcGxhdC1mcmVlYnNkNi9yZWdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFhNjg5OC4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC1mcmVlYnNkNi9yZWdlbgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyEgL2Jpbi9zaAotc2V0IC12Ci1weXRob24gLi4vLi4vVG9vbHMvc2NyaXB0cy9oMnB5LnB5IC1pICcodV9sb25nKScgL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtZnJlZWJzZDcvSU4ucHkgYi9MaWIvcGxhdC1mcmVlYnNkNy9JTi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzYjNhMi4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC1mcmVlYnNkNy9JTi5weQorKysgL2Rldi9udWxsCkBAIC0xLDU3MSArMCwwIEBACi0jIEdlbmVyYXRlZCBieSBoMnB5IGZyb20gL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2NkZWZzLmgKLV9fR05VQ0xJS0VfQVNNID0gMwotX19HTlVDTElLRV9BU00gPSAyCi1fX0dOVUNMSUtFX19fVFlQRU9GID0gMQotX19HTlVDTElLRV9fX09GRlNFVE9GID0gMQotX19HTlVDTElLRV9fX1NFQ1RJT04gPSAxCi1fX0dOVUNMSUtFX0FUVFJJQlVURV9NT0RFX0RJID0gMQotX19HTlVDTElLRV9DVE9SX1NFQ1RJT05fSEFORExJTkcgPSAxCi1fX0dOVUNMSUtFX0JVSUxUSU5fQ09OU1RBTlRfUCA9IDEKLV9fR05VQ0xJS0VfQlVJTFRJTl9WQVJBUkdTID0gMQotX19HTlVDTElLRV9CVUlMVElOX1NUREFSRyA9IDEKLV9fR05VQ0xJS0VfQlVJTFRJTl9WQUFMSVNUID0gMQotX19HTlVDX1ZBX0xJU1RfQ09NUEFUSUJJTElUWSA9IDEKLV9fR05VQ0xJS0VfQlVJTFRJTl9ORVhUX0FSRyA9IDEKLV9fR05VQ0xJS0VfQlVJTFRJTl9NRU1DUFkgPSAxCi1fX0NDX1NVUFBPUlRTX0lOTElORSA9IDEKLV9fQ0NfU1VQUE9SVFNfX19JTkxJTkUgPSAxCi1fX0NDX1NVUFBPUlRTX19fSU5MSU5FX18gPSAxCi1fX0NDX1NVUFBPUlRTX19fRlVOQ19fID0gMQotX19DQ19TVVBQT1JUU19XQVJOSU5HID0gMQotX19DQ19TVVBQT1JUU19WQVJBRElDX1hYWCA9IDEKLV9fQ0NfU1VQUE9SVFNfRFlOQU1JQ19BUlJBWV9JTklUID0gMQotX19DQ19JTlRfSVNfMzJCSVQgPSAxCi1kZWYgX19QKHByb3Rvcyk6IHJldHVybiBwcm90b3MKLQotZGVmIF9fU1RSSU5HKHgpOiByZXR1cm4gI3gKLQotZGVmIF9fWFNUUklORyh4KTogcmV0dXJuIF9fU1RSSU5HKHgpCi0KLWRlZiBfX1AocHJvdG9zKTogcmV0dXJuICgpCi0KLWRlZiBfX1NUUklORyh4KTogcmV0dXJuICJ4IgotCi1kZWYgX19hbGlnbmVkKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oeCkpKQotCi1kZWYgX19zZWN0aW9uKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oeCkpKQotCi1kZWYgX19hbGlnbmVkKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oeCkpKQotCi1kZWYgX19zZWN0aW9uKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oeCkpKQotCi1kZWYgX19ub25udWxsKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19ub25udWxsX18oeCkpKQotCi1kZWYgX19wcmVkaWN0X3RydWUoZXhwKTogcmV0dXJuIF9fYnVpbHRpbl9leHBlY3QoKGV4cCksIDEpCi0KLWRlZiBfX3ByZWRpY3RfZmFsc2UoZXhwKTogcmV0dXJuIF9fYnVpbHRpbl9leHBlY3QoKGV4cCksIDApCi0KLWRlZiBfX3ByZWRpY3RfdHJ1ZShleHApOiByZXR1cm4gKGV4cCkKLQotZGVmIF9fcHJlZGljdF9mYWxzZShleHApOiByZXR1cm4gKGV4cCkKLQotZGVmIF9fZm9ybWF0X2FyZyhmbXRhcmcpOiByZXR1cm4gX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfYXJnX18gKGZtdGFyZykpKQotCi1kZWYgX19GQlNESUQocyk6IHJldHVybiBfX0lEU1RSSU5HKF9fQ09OQ0FUKF9fcmNzaWRfLF9fTElORV9fKSxzKQotCi1kZWYgX19SQ1NJRChzKTogcmV0dXJuIF9fSURTVFJJTkcoX19DT05DQVQoX19yY3NpZF8sX19MSU5FX18pLHMpCi0KLWRlZiBfX1JDU0lEX1NPVVJDRShzKTogcmV0dXJuIF9fSURTVFJJTkcoX19DT05DQVQoX19yY3NpZF9zb3VyY2VfLF9fTElORV9fKSxzKQotCi1kZWYgX19TQ0NTSUQocyk6IHJldHVybiBfX0lEU1RSSU5HKF9fQ09OQ0FUKF9fc2Njc2lkXyxfX0xJTkVfXykscykKLQotZGVmIF9fQ09QWVJJR0hUKHMpOiByZXR1cm4gX19JRFNUUklORyhfX0NPTkNBVChfX2NvcHlyaWdodF8sX19MSU5FX18pLHMpCi0KLV9QT1NJWF9DX1NPVVJDRSA9IDE5OTAwOQotX1BPU0lYX0NfU09VUkNFID0gMTk5MjA5Ci1fX1hTSV9WSVNJQkxFID0gNjAwCi1fUE9TSVhfQ19TT1VSQ0UgPSAyMDAxMTIKLV9fWFNJX1ZJU0lCTEUgPSA1MDAKLV9QT1NJWF9DX1NPVVJDRSA9IDE5OTUwNgotX1BPU0lYX0NfU09VUkNFID0gMTk4ODA4Ci1fX1BPU0lYX1ZJU0lCTEUgPSAyMDAxMTIKLV9fSVNPX0NfVklTSUJMRSA9IDE5OTkKLV9fUE9TSVhfVklTSUJMRSA9IDE5OTUwNgotX19JU09fQ19WSVNJQkxFID0gMTk5MAotX19QT1NJWF9WSVNJQkxFID0gMTk5MzA5Ci1fX0lTT19DX1ZJU0lCTEUgPSAxOTkwCi1fX1BPU0lYX1ZJU0lCTEUgPSAxOTkyMDkKLV9fSVNPX0NfVklTSUJMRSA9IDE5OTAKLV9fUE9TSVhfVklTSUJMRSA9IDE5OTAwOQotX19JU09fQ19WSVNJQkxFID0gMTk5MAotX19QT1NJWF9WSVNJQkxFID0gMTk4ODA4Ci1fX0lTT19DX1ZJU0lCTEUgPSAwCi1fX1BPU0lYX1ZJU0lCTEUgPSAwCi1fX1hTSV9WSVNJQkxFID0gMAotX19CU0RfVklTSUJMRSA9IDAKLV9fSVNPX0NfVklTSUJMRSA9IDE5OTAKLV9fUE9TSVhfVklTSUJMRSA9IDAKLV9fWFNJX1ZJU0lCTEUgPSAwCi1fX0JTRF9WSVNJQkxFID0gMAotX19JU09fQ19WSVNJQkxFID0gMTk5OQotX19QT1NJWF9WSVNJQkxFID0gMjAwMTEyCi1fX1hTSV9WSVNJQkxFID0gNjAwCi1fX0JTRF9WSVNJQkxFID0gMQotX19JU09fQ19WSVNJQkxFID0gMTk5OQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL190eXBlcy5oCi0KLSMgSW5jbHVkZWQgZnJvbSBtYWNoaW5lL190eXBlcy5oCi0KLSMgSW5jbHVkZWQgZnJvbSBtYWNoaW5lL2VuZGlhbi5oCi1fUVVBRF9ISUdIV09SRCA9IDEKLV9RVUFEX0xPV1dPUkQgPSAwCi1fTElUVExFX0VORElBTiA9IDEyMzQKLV9CSUdfRU5ESUFOID0gNDMyMQotX1BEUF9FTkRJQU4gPSAzNDEyCi1fQllURV9PUkRFUiA9IF9MSVRUTEVfRU5ESUFOCi1MSVRUTEVfRU5ESUFOID0gX0xJVFRMRV9FTkRJQU4KLUJJR19FTkRJQU4gPSBfQklHX0VORElBTgotUERQX0VORElBTiA9IF9QRFBfRU5ESUFOCi1CWVRFX09SREVSID0gX0JZVEVfT1JERVIKLWRlZiBfX3dvcmRfc3dhcF9pbnRfdmFyKHgpOiByZXR1cm4gXAotCi1kZWYgX193b3JkX3N3YXBfaW50X2NvbnN0KHgpOiByZXR1cm4gXAotCi1kZWYgX193b3JkX3N3YXBfaW50KHgpOiByZXR1cm4gX193b3JkX3N3YXBfaW50X3Zhcih4KQotCi1kZWYgX19ieXRlX3N3YXBfaW50X3Zhcih4KTogcmV0dXJuIFwKLQotZGVmIF9fYnl0ZV9zd2FwX2ludF9jb25zdCh4KTogcmV0dXJuIFwKLQotZGVmIF9fYnl0ZV9zd2FwX2ludCh4KTogcmV0dXJuIF9fYnl0ZV9zd2FwX2ludF92YXIoeCkKLQotZGVmIF9fYnl0ZV9zd2FwX3dvcmRfdmFyKHgpOiByZXR1cm4gXAotCi1kZWYgX19ieXRlX3N3YXBfd29yZF9jb25zdCh4KTogcmV0dXJuIFwKLQotZGVmIF9fYnl0ZV9zd2FwX3dvcmQoeCk6IHJldHVybiBfX2J5dGVfc3dhcF93b3JkX3Zhcih4KQotCi1kZWYgX19odG9ubCh4KTogcmV0dXJuIF9fYnN3YXAzMih4KQotCi1kZWYgX19odG9ucyh4KTogcmV0dXJuIF9fYnN3YXAxNih4KQotCi1kZWYgX19udG9obCh4KTogcmV0dXJuIF9fYnN3YXAzMih4KQotCi1kZWYgX19udG9ocyh4KTogcmV0dXJuIF9fYnN3YXAxNih4KQotCi1JUFBST1RPX0lQID0gMAotSVBQUk9UT19JQ01QID0gMQotSVBQUk9UT19UQ1AgPSA2Ci1JUFBST1RPX1VEUCA9IDE3Ci1kZWYgaHRvbmwoeCk6IHJldHVybiBfX2h0b25sKHgpCi0KLWRlZiBodG9ucyh4KTogcmV0dXJuIF9faHRvbnMoeCkKLQotZGVmIG50b2hsKHgpOiByZXR1cm4gX19udG9obCh4KQotCi1kZWYgbnRvaHMoeCk6IHJldHVybiBfX250b2hzKHgpCi0KLUlQUFJPVE9fUkFXID0gMjU1Ci1JTkVUX0FERFJTVFJMRU4gPSAxNgotSVBQUk9UT19IT1BPUFRTID0gMAotSVBQUk9UT19JR01QID0gMgotSVBQUk9UT19HR1AgPSAzCi1JUFBST1RPX0lQVjQgPSA0Ci1JUFBST1RPX0lQSVAgPSBJUFBST1RPX0lQVjQKLUlQUFJPVE9fU1QgPSA3Ci1JUFBST1RPX0VHUCA9IDgKLUlQUFJPVE9fUElHUCA9IDkKLUlQUFJPVE9fUkNDTU9OID0gMTAKLUlQUFJPVE9fTlZQSUkgPSAxMQotSVBQUk9UT19QVVAgPSAxMgotSVBQUk9UT19BUkdVUyA9IDEzCi1JUFBST1RPX0VNQ09OID0gMTQKLUlQUFJPVE9fWE5FVCA9IDE1Ci1JUFBST1RPX0NIQU9TID0gMTYKLUlQUFJPVE9fTVVYID0gMTgKLUlQUFJPVE9fTUVBUyA9IDE5Ci1JUFBST1RPX0hNUCA9IDIwCi1JUFBST1RPX1BSTSA9IDIxCi1JUFBST1RPX0lEUCA9IDIyCi1JUFBST1RPX1RSVU5LMSA9IDIzCi1JUFBST1RPX1RSVU5LMiA9IDI0Ci1JUFBST1RPX0xFQUYxID0gMjUKLUlQUFJPVE9fTEVBRjIgPSAyNgotSVBQUk9UT19SRFAgPSAyNwotSVBQUk9UT19JUlRQID0gMjgKLUlQUFJPVE9fVFAgPSAyOQotSVBQUk9UT19CTFQgPSAzMAotSVBQUk9UT19OU1AgPSAzMQotSVBQUk9UT19JTlAgPSAzMgotSVBQUk9UT19TRVAgPSAzMwotSVBQUk9UT18zUEMgPSAzNAotSVBQUk9UT19JRFBSID0gMzUKLUlQUFJPVE9fWFRQID0gMzYKLUlQUFJPVE9fRERQID0gMzcKLUlQUFJPVE9fQ01UUCA9IDM4Ci1JUFBST1RPX1RQWFggPSAzOQotSVBQUk9UT19JTCA9IDQwCi1JUFBST1RPX0lQVjYgPSA0MQotSVBQUk9UT19TRFJQID0gNDIKLUlQUFJPVE9fUk9VVElORyA9IDQzCi1JUFBST1RPX0ZSQUdNRU5UID0gNDQKLUlQUFJPVE9fSURSUCA9IDQ1Ci1JUFBST1RPX1JTVlAgPSA0NgotSVBQUk9UT19HUkUgPSA0NwotSVBQUk9UT19NSFJQID0gNDgKLUlQUFJPVE9fQkhBID0gNDkKLUlQUFJPVE9fRVNQID0gNTAKLUlQUFJPVE9fQUggPSA1MQotSVBQUk9UT19JTkxTUCA9IDUyCi1JUFBST1RPX1NXSVBFID0gNTMKLUlQUFJPVE9fTkhSUCA9IDU0Ci1JUFBST1RPX01PQklMRSA9IDU1Ci1JUFBST1RPX1RMU1AgPSA1NgotSVBQUk9UT19TS0lQID0gNTcKLUlQUFJPVE9fSUNNUFY2ID0gNTgKLUlQUFJPVE9fTk9ORSA9IDU5Ci1JUFBST1RPX0RTVE9QVFMgPSA2MAotSVBQUk9UT19BSElQID0gNjEKLUlQUFJPVE9fQ0ZUUCA9IDYyCi1JUFBST1RPX0hFTExPID0gNjMKLUlQUFJPVE9fU0FURVhQQUsgPSA2NAotSVBQUk9UT19LUllQVE9MQU4gPSA2NQotSVBQUk9UT19SVkQgPSA2NgotSVBQUk9UT19JUFBDID0gNjcKLUlQUFJPVE9fQURGUyA9IDY4Ci1JUFBST1RPX1NBVE1PTiA9IDY5Ci1JUFBST1RPX1ZJU0EgPSA3MAotSVBQUk9UT19JUENWID0gNzEKLUlQUFJPVE9fQ1BOWCA9IDcyCi1JUFBST1RPX0NQSEIgPSA3MwotSVBQUk9UT19XU04gPSA3NAotSVBQUk9UT19QVlAgPSA3NQotSVBQUk9UT19CUlNBVE1PTiA9IDc2Ci1JUFBST1RPX05EID0gNzcKLUlQUFJPVE9fV0JNT04gPSA3OAotSVBQUk9UT19XQkVYUEFLID0gNzkKLUlQUFJPVE9fRU9OID0gODAKLUlQUFJPVE9fVk1UUCA9IDgxCi1JUFBST1RPX1NWTVRQID0gODIKLUlQUFJPVE9fVklORVMgPSA4MwotSVBQUk9UT19UVFAgPSA4NAotSVBQUk9UT19JR1AgPSA4NQotSVBQUk9UT19ER1AgPSA4NgotSVBQUk9UT19UQ0YgPSA4NwotSVBQUk9UT19JR1JQID0gODgKLUlQUFJPVE9fT1NQRklHUCA9IDg5Ci1JUFBST1RPX1NSUEMgPSA5MAotSVBQUk9UT19MQVJQID0gOTEKLUlQUFJPVE9fTVRQID0gOTIKLUlQUFJPVE9fQVgyNSA9IDkzCi1JUFBST1RPX0lQRUlQID0gOTQKLUlQUFJPVE9fTUlDUCA9IDk1Ci1JUFBST1RPX1NDQ1NQID0gOTYKLUlQUFJPVE9fRVRIRVJJUCA9IDk3Ci1JUFBST1RPX0VOQ0FQID0gOTgKLUlQUFJPVE9fQVBFUyA9IDk5Ci1JUFBST1RPX0dNVFAgPSAxMDAKLUlQUFJPVE9fSVBDT01QID0gMTA4Ci1JUFBST1RPX1NDVFAgPSAxMzIKLUlQUFJPVE9fUElNID0gMTAzCi1JUFBST1RPX0NBUlAgPSAxMTIKLUlQUFJPVE9fUEdNID0gMTEzCi1JUFBST1RPX1BGU1lOQyA9IDI0MAotSVBQUk9UT19PTERfRElWRVJUID0gMjU0Ci1JUFBST1RPX01BWCA9IDI1NgotSVBQUk9UT19ET05FID0gMjU3Ci1JUFBST1RPX0RJVkVSVCA9IDI1OAotSVBQUk9UT19TUEFDRVIgPSAzMjc2NwotSVBQT1JUX1JFU0VSVkVEID0gMTAyNAotSVBQT1JUX0hJRklSU1RBVVRPID0gNDkxNTIKLUlQUE9SVF9ISUxBU1RBVVRPID0gNjU1MzUKLUlQUE9SVF9SRVNFUlZFRFNUQVJUID0gNjAwCi1JUFBPUlRfTUFYID0gNjU1MzUKLWRlZiBJTl9DTEFTU0EoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgKC0yMTQ3NDgzNjQ4KSkgPT0gMCkKLQotSU5fQ0xBU1NBX05FVCA9ICgtMTY3NzcyMTYpCi1JTl9DTEFTU0FfTlNISUZUID0gMjQKLUlOX0NMQVNTQV9IT1NUID0gMHgwMGZmZmZmZgotSU5fQ0xBU1NBX01BWCA9IDEyOAotZGVmIElOX0NMQVNTQihpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAoLTEwNzM3NDE4MjQpKSA9PSAoLTIxNDc0ODM2NDgpKQotCi1JTl9DTEFTU0JfTkVUID0gKC02NTUzNikKLUlOX0NMQVNTQl9OU0hJRlQgPSAxNgotSU5fQ0xBU1NCX0hPU1QgPSAweDAwMDBmZmZmCi1JTl9DTEFTU0JfTUFYID0gNjU1MzYKLWRlZiBJTl9DTEFTU0MoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgKC01MzY4NzA5MTIpKSA9PSAoLTEwNzM3NDE4MjQpKQotCi1JTl9DTEFTU0NfTkVUID0gKC0yNTYpCi1JTl9DTEFTU0NfTlNISUZUID0gOAotSU5fQ0xBU1NDX0hPU1QgPSAweDAwMDAwMGZmCi1kZWYgSU5fQ0xBU1NEKGkpOiByZXR1cm4gKCgodV9pbnQzMl90KShpKSAmICgtMjY4NDM1NDU2KSkgPT0gKC01MzY4NzA5MTIpKQotCi1JTl9DTEFTU0RfTkVUID0gKC0yNjg0MzU0NTYpCi1JTl9DTEFTU0RfTlNISUZUID0gMjgKLUlOX0NMQVNTRF9IT1NUID0gMHgwZmZmZmZmZgotZGVmIElOX01VTFRJQ0FTVChpKTogcmV0dXJuIElOX0NMQVNTRChpKQotCi1kZWYgSU5fRVhQRVJJTUVOVEFMKGkpOiByZXR1cm4gKCgodV9pbnQzMl90KShpKSAmICgtMjY4NDM1NDU2KSkgPT0gKC0yNjg0MzU0NTYpKQotCi1kZWYgSU5fQkFEQ0xBU1MoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgKC0yNjg0MzU0NTYpKSA9PSAoLTI2ODQzNTQ1NikpCi0KLWRlZiBJTl9MSU5LTE9DQUwoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgKC02NTUzNikpID09ICgtMTQ0Mjk3MTY0OCkpCi0KLWRlZiBJTl9MT0NBTF9HUk9VUChpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAoLTI1NikpID09ICgtNTM2ODcwOTEyKSkKLQotSU5BRERSX05PTkUgPSAoLTEpCi1JTl9MT09QQkFDS05FVCA9IDEyNwotSVBfT1BUSU9OUyA9IDEKLUlQX0hEUklOQ0wgPSAyCi1JUF9UT1MgPSAzCi1JUF9UVEwgPSA0Ci1JUF9SRUNWT1BUUyA9IDUKLUlQX1JFQ1ZSRVRPUFRTID0gNgotSVBfUkVDVkRTVEFERFIgPSA3Ci1JUF9TRU5EU1JDQUREUiA9IElQX1JFQ1ZEU1RBRERSCi1JUF9SRVRPUFRTID0gOAotSVBfTVVMVElDQVNUX0lGID0gOQotSVBfTVVMVElDQVNUX1RUTCA9IDEwCi1JUF9NVUxUSUNBU1RfTE9PUCA9IDExCi1JUF9BRERfTUVNQkVSU0hJUCA9IDEyCi1JUF9EUk9QX01FTUJFUlNISVAgPSAxMwotSVBfTVVMVElDQVNUX1ZJRiA9IDE0Ci1JUF9SU1ZQX09OID0gMTUKLUlQX1JTVlBfT0ZGID0gMTYKLUlQX1JTVlBfVklGX09OID0gMTcKLUlQX1JTVlBfVklGX09GRiA9IDE4Ci1JUF9QT1JUUkFOR0UgPSAxOQotSVBfUkVDVklGID0gMjAKLUlQX0lQU0VDX1BPTElDWSA9IDIxCi1JUF9GQUlUSCA9IDIyCi1JUF9PTkVTQkNBU1QgPSAyMwotSVBfRldfVEFCTEVfQUREID0gNDAKLUlQX0ZXX1RBQkxFX0RFTCA9IDQxCi1JUF9GV19UQUJMRV9GTFVTSCA9IDQyCi1JUF9GV19UQUJMRV9HRVRTSVpFID0gNDMKLUlQX0ZXX1RBQkxFX0xJU1QgPSA0NAotSVBfRldfQUREID0gNTAKLUlQX0ZXX0RFTCA9IDUxCi1JUF9GV19GTFVTSCA9IDUyCi1JUF9GV19aRVJPID0gNTMKLUlQX0ZXX0dFVCA9IDU0Ci1JUF9GV19SRVNFVExPRyA9IDU1Ci1JUF9GV19OQVRfQ0ZHID0gNTYKLUlQX0ZXX05BVF9ERUwgPSA1NwotSVBfRldfTkFUX0dFVF9DT05GSUcgPSA1OAotSVBfRldfTkFUX0dFVF9MT0cgPSA1OQotSVBfRFVNTVlORVRfQ09ORklHVVJFID0gNjAKLUlQX0RVTU1ZTkVUX0RFTCA9IDYxCi1JUF9EVU1NWU5FVF9GTFVTSCA9IDYyCi1JUF9EVU1NWU5FVF9HRVQgPSA2NAotSVBfUkVDVlRUTCA9IDY1Ci1JUF9NSU5UVEwgPSA2NgotSVBfRE9OVEZSQUcgPSA2NwotSVBfQUREX1NPVVJDRV9NRU1CRVJTSElQID0gNzAKLUlQX0RST1BfU09VUkNFX01FTUJFUlNISVAgPSA3MQotSVBfQkxPQ0tfU09VUkNFID0gNzIKLUlQX1VOQkxPQ0tfU09VUkNFID0gNzMKLUlQX01TRklMVEVSID0gNzQKLU1DQVNUX0pPSU5fR1JPVVAgPSA4MAotTUNBU1RfTEVBVkVfR1JPVVAgPSA4MQotTUNBU1RfSk9JTl9TT1VSQ0VfR1JPVVAgPSA4MgotTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQID0gODMKLU1DQVNUX0JMT0NLX1NPVVJDRSA9IDg0Ci1NQ0FTVF9VTkJMT0NLX1NPVVJDRSA9IDg1Ci1JUF9ERUZBVUxUX01VTFRJQ0FTVF9UVEwgPSAxCi1JUF9ERUZBVUxUX01VTFRJQ0FTVF9MT09QID0gMQotSVBfTUlOX01FTUJFUlNISVBTID0gMzEKLUlQX01BWF9NRU1CRVJTSElQUyA9IDQwOTUKLUlQX01BWF9TT1VSQ0VfRklMVEVSID0gMTAyNAotTUNBU1RfSU5DTFVERSA9IDEKLU1DQVNUX0VYQ0xVREUgPSAyCi1JUF9QT1JUUkFOR0VfREVGQVVMVCA9IDAKLUlQX1BPUlRSQU5HRV9ISUdIID0gMQotSVBfUE9SVFJBTkdFX0xPVyA9IDIKLUlQUFJPVE9fTUFYSUQgPSAoSVBQUk9UT19BSCArIDEpCi1JUENUTF9GT1JXQVJESU5HID0gMQotSVBDVExfU0VORFJFRElSRUNUUyA9IDIKLUlQQ1RMX0RFRlRUTCA9IDMKLUlQQ1RMX0RFRk1UVSA9IDQKLUlQQ1RMX1JURVhQSVJFID0gNQotSVBDVExfUlRNSU5FWFBJUkUgPSA2Ci1JUENUTF9SVE1BWENBQ0hFID0gNwotSVBDVExfU09VUkNFUk9VVEUgPSA4Ci1JUENUTF9ESVJFQ1RFREJST0FEQ0FTVCA9IDkKLUlQQ1RMX0lOVFJRTUFYTEVOID0gMTAKLUlQQ1RMX0lOVFJRRFJPUFMgPSAxMQotSVBDVExfU1RBVFMgPSAxMgotSVBDVExfQUNDRVBUU09VUkNFUk9VVEUgPSAxMwotSVBDVExfRkFTVEZPUldBUkRJTkcgPSAxNAotSVBDVExfS0VFUEZBSVRIID0gMTUKLUlQQ1RMX0dJRl9UVEwgPSAxNgotSVBDVExfTUFYSUQgPSAxNwotZGVmIGluX251bGxob3N0KHgpOiByZXR1cm4gKCh4KS5zX2FkZHIgPT0gSU5BRERSX0FOWSkKLQotCi0jIEluY2x1ZGVkIGZyb20gbmV0aW5ldDYvaW42LmgKLV9fS0FNRV9WRVJTSU9OID0gIkZyZWVCU0QiCi1JUFY2UE9SVF9SRVNFUlZFRCA9IDEwMjQKLUlQVjZQT1JUX0FOT05NSU4gPSA0OTE1MgotSVBWNlBPUlRfQU5PTk1BWCA9IDY1NTM1Ci1JUFY2UE9SVF9SRVNFUlZFRE1JTiA9IDYwMAotSVBWNlBPUlRfUkVTRVJWRURNQVggPSAoSVBWNlBPUlRfUkVTRVJWRUQtMSkKLUlORVQ2X0FERFJTVFJMRU4gPSA0NgotSVBWNl9BRERSX0lOVDMyX09ORSA9IDEKLUlQVjZfQUREUl9JTlQzMl9UV08gPSAyCi1JUFY2X0FERFJfSU5UMzJfTU5MID0gKC0xNjcxMTY4MCkKLUlQVjZfQUREUl9JTlQzMl9NTEwgPSAoLTE2NjQ2MTQ0KQotSVBWNl9BRERSX0lOVDMyX1NNUCA9IDB4MDAwMGZmZmYKLUlQVjZfQUREUl9JTlQxNl9VTEwgPSAweGZlODAKLUlQVjZfQUREUl9JTlQxNl9VU0wgPSAweGZlYzAKLUlQVjZfQUREUl9JTlQxNl9NTEwgPSAweGZmMDIKLUlQVjZfQUREUl9JTlQzMl9PTkUgPSAweDAxMDAwMDAwCi1JUFY2X0FERFJfSU5UMzJfVFdPID0gMHgwMjAwMDAwMAotSVBWNl9BRERSX0lOVDMyX01OTCA9IDB4MDAwMDAxZmYKLUlQVjZfQUREUl9JTlQzMl9NTEwgPSAweDAwMDAwMmZmCi1JUFY2X0FERFJfSU5UMzJfU01QID0gKC02NTUzNikKLUlQVjZfQUREUl9JTlQxNl9VTEwgPSAweDgwZmUKLUlQVjZfQUREUl9JTlQxNl9VU0wgPSAweGMwZmUKLUlQVjZfQUREUl9JTlQxNl9NTEwgPSAweDAyZmYKLWRlZiBJTjZfSVNfQUREUl9VTlNQRUNJRklFRChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX0xPT1BCQUNLKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfVjRDT01QQVQoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9WNE1BUFBFRChhKTogcmV0dXJuIFwKLQotSVBWNl9BRERSX1NDT1BFX05PREVMT0NBTCA9IDB4MDEKLUlQVjZfQUREUl9TQ09QRV9JTlRGQUNFTE9DQUwgPSAweDAxCi1JUFY2X0FERFJfU0NPUEVfTElOS0xPQ0FMID0gMHgwMgotSVBWNl9BRERSX1NDT1BFX1NJVEVMT0NBTCA9IDB4MDUKLUlQVjZfQUREUl9TQ09QRV9PUkdMT0NBTCA9IDB4MDgKLUlQVjZfQUREUl9TQ09QRV9HTE9CQUwgPSAweDBlCi1fX0lQVjZfQUREUl9TQ09QRV9OT0RFTE9DQUwgPSAweDAxCi1fX0lQVjZfQUREUl9TQ09QRV9JTlRGQUNFTE9DQUwgPSAweDAxCi1fX0lQVjZfQUREUl9TQ09QRV9MSU5LTE9DQUwgPSAweDAyCi1fX0lQVjZfQUREUl9TQ09QRV9TSVRFTE9DQUwgPSAweDA1Ci1fX0lQVjZfQUREUl9TQ09QRV9PUkdMT0NBTCA9IDB4MDgKLV9fSVBWNl9BRERSX1NDT1BFX0dMT0JBTCA9IDB4MGUKLWRlZiBJTjZfSVNfQUREUl9MSU5LTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9TSVRFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19OT0RFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19JTlRGQUNFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19TSVRFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19PUkdMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0dMT0JBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX05PREVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX1NJVEVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX09SR0xPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfR0xPQkFMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX1NDT1BFX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19TQ09QRV9FTUJFRChhKTogcmV0dXJuIFwKLQotZGVmIElGQTZfSVNfREVQUkVDQVRFRChhKTogcmV0dXJuIFwKLQotZGVmIElGQTZfSVNfSU5WQUxJRChhKTogcmV0dXJuIFwKLQotSVBWNl9PUFRJT05TID0gMQotSVBWNl9SRUNWT1BUUyA9IDUKLUlQVjZfUkVDVlJFVE9QVFMgPSA2Ci1JUFY2X1JFQ1ZEU1RBRERSID0gNwotSVBWNl9SRVRPUFRTID0gOAotSVBWNl9TT0NLT1BUX1JFU0VSVkVEMSA9IDMKLUlQVjZfVU5JQ0FTVF9IT1BTID0gNAotSVBWNl9NVUxUSUNBU1RfSUYgPSA5Ci1JUFY2X01VTFRJQ0FTVF9IT1BTID0gMTAKLUlQVjZfTVVMVElDQVNUX0xPT1AgPSAxMQotSVBWNl9KT0lOX0dST1VQID0gMTIKLUlQVjZfTEVBVkVfR1JPVVAgPSAxMwotSVBWNl9QT1JUUkFOR0UgPSAxNAotSUNNUDZfRklMVEVSID0gMTgKLUlQVjZfMjI5MlBLVElORk8gPSAxOQotSVBWNl8yMjkySE9QTElNSVQgPSAyMAotSVBWNl8yMjkyTkVYVEhPUCA9IDIxCi1JUFY2XzIyOTJIT1BPUFRTID0gMjIKLUlQVjZfMjI5MkRTVE9QVFMgPSAyMwotSVBWNl8yMjkyUlRIRFIgPSAyNAotSVBWNl8yMjkyUEtUT1BUSU9OUyA9IDI1Ci1JUFY2X0NIRUNLU1VNID0gMjYKLUlQVjZfVjZPTkxZID0gMjcKLUlQVjZfQklORFY2T05MWSA9IElQVjZfVjZPTkxZCi1JUFY2X0lQU0VDX1BPTElDWSA9IDI4Ci1JUFY2X0ZBSVRIID0gMjkKLUlQVjZfRldfQUREID0gMzAKLUlQVjZfRldfREVMID0gMzEKLUlQVjZfRldfRkxVU0ggPSAzMgotSVBWNl9GV19aRVJPID0gMzMKLUlQVjZfRldfR0VUID0gMzQKLUlQVjZfUlRIRFJEU1RPUFRTID0gMzUKLUlQVjZfUkVDVlBLVElORk8gPSAzNgotSVBWNl9SRUNWSE9QTElNSVQgPSAzNwotSVBWNl9SRUNWUlRIRFIgPSAzOAotSVBWNl9SRUNWSE9QT1BUUyA9IDM5Ci1JUFY2X1JFQ1ZEU1RPUFRTID0gNDAKLUlQVjZfUkVDVlJUSERSRFNUT1BUUyA9IDQxCi1JUFY2X1VTRV9NSU5fTVRVID0gNDIKLUlQVjZfUkVDVlBBVEhNVFUgPSA0MwotSVBWNl9QQVRITVRVID0gNDQKLUlQVjZfUkVBQ0hDT05GID0gNDUKLUlQVjZfUEtUSU5GTyA9IDQ2Ci1JUFY2X0hPUExJTUlUID0gNDcKLUlQVjZfTkVYVEhPUCA9IDQ4Ci1JUFY2X0hPUE9QVFMgPSA0OQotSVBWNl9EU1RPUFRTID0gNTAKLUlQVjZfUlRIRFIgPSA1MQotSVBWNl9QS1RPUFRJT05TID0gNTIKLUlQVjZfUkVDVlRDTEFTUyA9IDU3Ci1JUFY2X0FVVE9GTE9XTEFCRUwgPSA1OQotSVBWNl9UQ0xBU1MgPSA2MQotSVBWNl9ET05URlJBRyA9IDYyCi1JUFY2X1BSRUZFUl9URU1QQUREUiA9IDYzCi1JUFY2X01TRklMVEVSID0gNzQKLUlQVjZfUlRIRFJfTE9PU0UgPSAwCi1JUFY2X1JUSERSX1NUUklDVCA9IDEKLUlQVjZfUlRIRFJfVFlQRV8wID0gMAotSVBWNl9ERUZBVUxUX01VTFRJQ0FTVF9IT1BTID0gMQotSVBWNl9ERUZBVUxUX01VTFRJQ0FTVF9MT09QID0gMQotSVBWNl9QT1JUUkFOR0VfREVGQVVMVCA9IDAKLUlQVjZfUE9SVFJBTkdFX0hJR0ggPSAxCi1JUFY2X1BPUlRSQU5HRV9MT1cgPSAyCi1JUFY2UFJPVE9fTUFYSUQgPSAoSVBQUk9UT19QSU0gKyAxKQotSVBWNkNUTF9GT1JXQVJESU5HID0gMQotSVBWNkNUTF9TRU5EUkVESVJFQ1RTID0gMgotSVBWNkNUTF9ERUZITElNID0gMwotSVBWNkNUTF9ERUZNVFUgPSA0Ci1JUFY2Q1RMX0ZPUldTUkNSVCA9IDUKLUlQVjZDVExfU1RBVFMgPSA2Ci1JUFY2Q1RMX01SVFNUQVRTID0gNwotSVBWNkNUTF9NUlRQUk9UTyA9IDgKLUlQVjZDVExfTUFYRlJBR1BBQ0tFVFMgPSA5Ci1JUFY2Q1RMX1NPVVJDRUNIRUNLID0gMTAKLUlQVjZDVExfU09VUkNFQ0hFQ0tfTE9HSU5UID0gMTEKLUlQVjZDVExfQUNDRVBUX1JUQURWID0gMTIKLUlQVjZDVExfS0VFUEZBSVRIID0gMTMKLUlQVjZDVExfTE9HX0lOVEVSVkFMID0gMTQKLUlQVjZDVExfSERSTkVTVExJTUlUID0gMTUKLUlQVjZDVExfREFEX0NPVU5UID0gMTYKLUlQVjZDVExfQVVUT19GTE9XTEFCRUwgPSAxNwotSVBWNkNUTF9ERUZNQ0FTVEhMSU0gPSAxOAotSVBWNkNUTF9HSUZfSExJTSA9IDE5Ci1JUFY2Q1RMX0tBTUVfVkVSU0lPTiA9IDIwCi1JUFY2Q1RMX1VTRV9ERVBSRUNBVEVEID0gMjEKLUlQVjZDVExfUlJfUFJVTkUgPSAyMgotSVBWNkNUTF9NQVBQRURfQUREUiA9IDIzCi1JUFY2Q1RMX1Y2T05MWSA9IDI0Ci1JUFY2Q1RMX1JURVhQSVJFID0gMjUKLUlQVjZDVExfUlRNSU5FWFBJUkUgPSAyNgotSVBWNkNUTF9SVE1BWENBQ0hFID0gMjcKLUlQVjZDVExfVVNFVEVNUEFERFIgPSAzMgotSVBWNkNUTF9URU1QUExUSU1FID0gMzMKLUlQVjZDVExfVEVNUFZMVElNRSA9IDM0Ci1JUFY2Q1RMX0FVVE9fTElOS0xPQ0FMID0gMzUKLUlQVjZDVExfUklQNlNUQVRTID0gMzYKLUlQVjZDVExfUFJFRkVSX1RFTVBBRERSID0gMzcKLUlQVjZDVExfQUREUkNUTFBPTElDWSA9IDM4Ci1JUFY2Q1RMX1VTRV9ERUZBVUxUWk9ORSA9IDM5Ci1JUFY2Q1RMX01BWEZSQUdTID0gNDEKLUlQVjZDVExfSUZRID0gNDIKLUlQVjZDVExfSVNBVEFQUlRSID0gNDMKLUlQVjZDVExfTUNBU1RfUE1UVSA9IDQ0Ci1JUFY2Q1RMX1NURUFMVEggPSA0NQotSVBWNkNUTF9NQVhJRCA9IDQ2CmRpZmYgLS1naXQgYS9MaWIvcGxhdC1mcmVlYnNkNy9yZWdlbiBiL0xpYi9wbGF0LWZyZWVic2Q3L3JlZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YWE2ODk4Li4wMDAwMDAwCi0tLSBhL0xpYi9wbGF0LWZyZWVic2Q3L3JlZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jISAvYmluL3NoCi1zZXQgLXYKLXB5dGhvbiAuLi8uLi9Ub29scy9zY3JpcHRzL2gycHkucHkgLWkgJyh1X2xvbmcpJyAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1mcmVlYnNkOC9JTi5weSBiL0xpYi9wbGF0LWZyZWVic2Q4L0lOLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNiM2EyLi4wMDAwMDAwCi0tLSBhL0xpYi9wbGF0LWZyZWVic2Q4L0lOLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTcxICswLDAgQEAKLSMgR2VuZXJhdGVkIGJ5IGgycHkgZnJvbSAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvY2RlZnMuaAotX19HTlVDTElLRV9BU00gPSAzCi1fX0dOVUNMSUtFX0FTTSA9IDIKLV9fR05VQ0xJS0VfX19UWVBFT0YgPSAxCi1fX0dOVUNMSUtFX19fT0ZGU0VUT0YgPSAxCi1fX0dOVUNMSUtFX19fU0VDVElPTiA9IDEKLV9fR05VQ0xJS0VfQVRUUklCVVRFX01PREVfREkgPSAxCi1fX0dOVUNMSUtFX0NUT1JfU0VDVElPTl9IQU5ETElORyA9IDEKLV9fR05VQ0xJS0VfQlVJTFRJTl9DT05TVEFOVF9QID0gMQotX19HTlVDTElLRV9CVUlMVElOX1ZBUkFSR1MgPSAxCi1fX0dOVUNMSUtFX0JVSUxUSU5fU1REQVJHID0gMQotX19HTlVDTElLRV9CVUlMVElOX1ZBQUxJU1QgPSAxCi1fX0dOVUNfVkFfTElTVF9DT01QQVRJQklMSVRZID0gMQotX19HTlVDTElLRV9CVUlMVElOX05FWFRfQVJHID0gMQotX19HTlVDTElLRV9CVUlMVElOX01FTUNQWSA9IDEKLV9fQ0NfU1VQUE9SVFNfSU5MSU5FID0gMQotX19DQ19TVVBQT1JUU19fX0lOTElORSA9IDEKLV9fQ0NfU1VQUE9SVFNfX19JTkxJTkVfXyA9IDEKLV9fQ0NfU1VQUE9SVFNfX19GVU5DX18gPSAxCi1fX0NDX1NVUFBPUlRTX1dBUk5JTkcgPSAxCi1fX0NDX1NVUFBPUlRTX1ZBUkFESUNfWFhYID0gMQotX19DQ19TVVBQT1JUU19EWU5BTUlDX0FSUkFZX0lOSVQgPSAxCi1fX0NDX0lOVF9JU18zMkJJVCA9IDEKLWRlZiBfX1AocHJvdG9zKTogcmV0dXJuIHByb3RvcwotCi1kZWYgX19TVFJJTkcoeCk6IHJldHVybiAjeAotCi1kZWYgX19YU1RSSU5HKHgpOiByZXR1cm4gX19TVFJJTkcoeCkKLQotZGVmIF9fUChwcm90b3MpOiByZXR1cm4gKCkKLQotZGVmIF9fU1RSSU5HKHgpOiByZXR1cm4gIngiCi0KLWRlZiBfX2FsaWduZWQoeCk6IHJldHVybiBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyh4KSkpCi0KLWRlZiBfX3NlY3Rpb24oeCk6IHJldHVybiBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXyh4KSkpCi0KLWRlZiBfX2FsaWduZWQoeCk6IHJldHVybiBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyh4KSkpCi0KLWRlZiBfX3NlY3Rpb24oeCk6IHJldHVybiBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXyh4KSkpCi0KLWRlZiBfX25vbm51bGwoeCk6IHJldHVybiBfX2F0dHJpYnV0ZV9fKChfX25vbm51bGxfXyh4KSkpCi0KLWRlZiBfX3ByZWRpY3RfdHJ1ZShleHApOiByZXR1cm4gX19idWlsdGluX2V4cGVjdCgoZXhwKSwgMSkKLQotZGVmIF9fcHJlZGljdF9mYWxzZShleHApOiByZXR1cm4gX19idWlsdGluX2V4cGVjdCgoZXhwKSwgMCkKLQotZGVmIF9fcHJlZGljdF90cnVlKGV4cCk6IHJldHVybiAoZXhwKQotCi1kZWYgX19wcmVkaWN0X2ZhbHNlKGV4cCk6IHJldHVybiAoZXhwKQotCi1kZWYgX19mb3JtYXRfYXJnKGZtdGFyZyk6IHJldHVybiBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9hcmdfXyAoZm10YXJnKSkpCi0KLWRlZiBfX0ZCU0RJRChzKTogcmV0dXJuIF9fSURTVFJJTkcoX19DT05DQVQoX19yY3NpZF8sX19MSU5FX18pLHMpCi0KLWRlZiBfX1JDU0lEKHMpOiByZXR1cm4gX19JRFNUUklORyhfX0NPTkNBVChfX3Jjc2lkXyxfX0xJTkVfXykscykKLQotZGVmIF9fUkNTSURfU09VUkNFKHMpOiByZXR1cm4gX19JRFNUUklORyhfX0NPTkNBVChfX3Jjc2lkX3NvdXJjZV8sX19MSU5FX18pLHMpCi0KLWRlZiBfX1NDQ1NJRChzKTogcmV0dXJuIF9fSURTVFJJTkcoX19DT05DQVQoX19zY2NzaWRfLF9fTElORV9fKSxzKQotCi1kZWYgX19DT1BZUklHSFQocyk6IHJldHVybiBfX0lEU1RSSU5HKF9fQ09OQ0FUKF9fY29weXJpZ2h0XyxfX0xJTkVfXykscykKLQotX1BPU0lYX0NfU09VUkNFID0gMTk5MDA5Ci1fUE9TSVhfQ19TT1VSQ0UgPSAxOTkyMDkKLV9fWFNJX1ZJU0lCTEUgPSA2MDAKLV9QT1NJWF9DX1NPVVJDRSA9IDIwMDExMgotX19YU0lfVklTSUJMRSA9IDUwMAotX1BPU0lYX0NfU09VUkNFID0gMTk5NTA2Ci1fUE9TSVhfQ19TT1VSQ0UgPSAxOTg4MDgKLV9fUE9TSVhfVklTSUJMRSA9IDIwMDExMgotX19JU09fQ19WSVNJQkxFID0gMTk5OQotX19QT1NJWF9WSVNJQkxFID0gMTk5NTA2Ci1fX0lTT19DX1ZJU0lCTEUgPSAxOTkwCi1fX1BPU0lYX1ZJU0lCTEUgPSAxOTkzMDkKLV9fSVNPX0NfVklTSUJMRSA9IDE5OTAKLV9fUE9TSVhfVklTSUJMRSA9IDE5OTIwOQotX19JU09fQ19WSVNJQkxFID0gMTk5MAotX19QT1NJWF9WSVNJQkxFID0gMTk5MDA5Ci1fX0lTT19DX1ZJU0lCTEUgPSAxOTkwCi1fX1BPU0lYX1ZJU0lCTEUgPSAxOTg4MDgKLV9fSVNPX0NfVklTSUJMRSA9IDAKLV9fUE9TSVhfVklTSUJMRSA9IDAKLV9fWFNJX1ZJU0lCTEUgPSAwCi1fX0JTRF9WSVNJQkxFID0gMAotX19JU09fQ19WSVNJQkxFID0gMTk5MAotX19QT1NJWF9WSVNJQkxFID0gMAotX19YU0lfVklTSUJMRSA9IDAKLV9fQlNEX1ZJU0lCTEUgPSAwCi1fX0lTT19DX1ZJU0lCTEUgPSAxOTk5Ci1fX1BPU0lYX1ZJU0lCTEUgPSAyMDAxMTIKLV9fWFNJX1ZJU0lCTEUgPSA2MDAKLV9fQlNEX1ZJU0lCTEUgPSAxCi1fX0lTT19DX1ZJU0lCTEUgPSAxOTk5Ci0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvX3R5cGVzLmgKLQotIyBJbmNsdWRlZCBmcm9tIG1hY2hpbmUvX3R5cGVzLmgKLQotIyBJbmNsdWRlZCBmcm9tIG1hY2hpbmUvZW5kaWFuLmgKLV9RVUFEX0hJR0hXT1JEID0gMQotX1FVQURfTE9XV09SRCA9IDAKLV9MSVRUTEVfRU5ESUFOID0gMTIzNAotX0JJR19FTkRJQU4gPSA0MzIxCi1fUERQX0VORElBTiA9IDM0MTIKLV9CWVRFX09SREVSID0gX0xJVFRMRV9FTkRJQU4KLUxJVFRMRV9FTkRJQU4gPSBfTElUVExFX0VORElBTgotQklHX0VORElBTiA9IF9CSUdfRU5ESUFOCi1QRFBfRU5ESUFOID0gX1BEUF9FTkRJQU4KLUJZVEVfT1JERVIgPSBfQllURV9PUkRFUgotZGVmIF9fd29yZF9zd2FwX2ludF92YXIoeCk6IHJldHVybiBcCi0KLWRlZiBfX3dvcmRfc3dhcF9pbnRfY29uc3QoeCk6IHJldHVybiBcCi0KLWRlZiBfX3dvcmRfc3dhcF9pbnQoeCk6IHJldHVybiBfX3dvcmRfc3dhcF9pbnRfdmFyKHgpCi0KLWRlZiBfX2J5dGVfc3dhcF9pbnRfdmFyKHgpOiByZXR1cm4gXAotCi1kZWYgX19ieXRlX3N3YXBfaW50X2NvbnN0KHgpOiByZXR1cm4gXAotCi1kZWYgX19ieXRlX3N3YXBfaW50KHgpOiByZXR1cm4gX19ieXRlX3N3YXBfaW50X3Zhcih4KQotCi1kZWYgX19ieXRlX3N3YXBfd29yZF92YXIoeCk6IHJldHVybiBcCi0KLWRlZiBfX2J5dGVfc3dhcF93b3JkX2NvbnN0KHgpOiByZXR1cm4gXAotCi1kZWYgX19ieXRlX3N3YXBfd29yZCh4KTogcmV0dXJuIF9fYnl0ZV9zd2FwX3dvcmRfdmFyKHgpCi0KLWRlZiBfX2h0b25sKHgpOiByZXR1cm4gX19ic3dhcDMyKHgpCi0KLWRlZiBfX2h0b25zKHgpOiByZXR1cm4gX19ic3dhcDE2KHgpCi0KLWRlZiBfX250b2hsKHgpOiByZXR1cm4gX19ic3dhcDMyKHgpCi0KLWRlZiBfX250b2hzKHgpOiByZXR1cm4gX19ic3dhcDE2KHgpCi0KLUlQUFJPVE9fSVAgPSAwCi1JUFBST1RPX0lDTVAgPSAxCi1JUFBST1RPX1RDUCA9IDYKLUlQUFJPVE9fVURQID0gMTcKLWRlZiBodG9ubCh4KTogcmV0dXJuIF9faHRvbmwoeCkKLQotZGVmIGh0b25zKHgpOiByZXR1cm4gX19odG9ucyh4KQotCi1kZWYgbnRvaGwoeCk6IHJldHVybiBfX250b2hsKHgpCi0KLWRlZiBudG9ocyh4KTogcmV0dXJuIF9fbnRvaHMoeCkKLQotSVBQUk9UT19SQVcgPSAyNTUKLUlORVRfQUREUlNUUkxFTiA9IDE2Ci1JUFBST1RPX0hPUE9QVFMgPSAwCi1JUFBST1RPX0lHTVAgPSAyCi1JUFBST1RPX0dHUCA9IDMKLUlQUFJPVE9fSVBWNCA9IDQKLUlQUFJPVE9fSVBJUCA9IElQUFJPVE9fSVBWNAotSVBQUk9UT19TVCA9IDcKLUlQUFJPVE9fRUdQID0gOAotSVBQUk9UT19QSUdQID0gOQotSVBQUk9UT19SQ0NNT04gPSAxMAotSVBQUk9UT19OVlBJSSA9IDExCi1JUFBST1RPX1BVUCA9IDEyCi1JUFBST1RPX0FSR1VTID0gMTMKLUlQUFJPVE9fRU1DT04gPSAxNAotSVBQUk9UT19YTkVUID0gMTUKLUlQUFJPVE9fQ0hBT1MgPSAxNgotSVBQUk9UT19NVVggPSAxOAotSVBQUk9UT19NRUFTID0gMTkKLUlQUFJPVE9fSE1QID0gMjAKLUlQUFJPVE9fUFJNID0gMjEKLUlQUFJPVE9fSURQID0gMjIKLUlQUFJPVE9fVFJVTksxID0gMjMKLUlQUFJPVE9fVFJVTksyID0gMjQKLUlQUFJPVE9fTEVBRjEgPSAyNQotSVBQUk9UT19MRUFGMiA9IDI2Ci1JUFBST1RPX1JEUCA9IDI3Ci1JUFBST1RPX0lSVFAgPSAyOAotSVBQUk9UT19UUCA9IDI5Ci1JUFBST1RPX0JMVCA9IDMwCi1JUFBST1RPX05TUCA9IDMxCi1JUFBST1RPX0lOUCA9IDMyCi1JUFBST1RPX1NFUCA9IDMzCi1JUFBST1RPXzNQQyA9IDM0Ci1JUFBST1RPX0lEUFIgPSAzNQotSVBQUk9UT19YVFAgPSAzNgotSVBQUk9UT19ERFAgPSAzNwotSVBQUk9UT19DTVRQID0gMzgKLUlQUFJPVE9fVFBYWCA9IDM5Ci1JUFBST1RPX0lMID0gNDAKLUlQUFJPVE9fSVBWNiA9IDQxCi1JUFBST1RPX1NEUlAgPSA0MgotSVBQUk9UT19ST1VUSU5HID0gNDMKLUlQUFJPVE9fRlJBR01FTlQgPSA0NAotSVBQUk9UT19JRFJQID0gNDUKLUlQUFJPVE9fUlNWUCA9IDQ2Ci1JUFBST1RPX0dSRSA9IDQ3Ci1JUFBST1RPX01IUlAgPSA0OAotSVBQUk9UT19CSEEgPSA0OQotSVBQUk9UT19FU1AgPSA1MAotSVBQUk9UT19BSCA9IDUxCi1JUFBST1RPX0lOTFNQID0gNTIKLUlQUFJPVE9fU1dJUEUgPSA1MwotSVBQUk9UT19OSFJQID0gNTQKLUlQUFJPVE9fTU9CSUxFID0gNTUKLUlQUFJPVE9fVExTUCA9IDU2Ci1JUFBST1RPX1NLSVAgPSA1NwotSVBQUk9UT19JQ01QVjYgPSA1OAotSVBQUk9UT19OT05FID0gNTkKLUlQUFJPVE9fRFNUT1BUUyA9IDYwCi1JUFBST1RPX0FISVAgPSA2MQotSVBQUk9UT19DRlRQID0gNjIKLUlQUFJPVE9fSEVMTE8gPSA2MwotSVBQUk9UT19TQVRFWFBBSyA9IDY0Ci1JUFBST1RPX0tSWVBUT0xBTiA9IDY1Ci1JUFBST1RPX1JWRCA9IDY2Ci1JUFBST1RPX0lQUEMgPSA2NwotSVBQUk9UT19BREZTID0gNjgKLUlQUFJPVE9fU0FUTU9OID0gNjkKLUlQUFJPVE9fVklTQSA9IDcwCi1JUFBST1RPX0lQQ1YgPSA3MQotSVBQUk9UT19DUE5YID0gNzIKLUlQUFJPVE9fQ1BIQiA9IDczCi1JUFBST1RPX1dTTiA9IDc0Ci1JUFBST1RPX1BWUCA9IDc1Ci1JUFBST1RPX0JSU0FUTU9OID0gNzYKLUlQUFJPVE9fTkQgPSA3NwotSVBQUk9UT19XQk1PTiA9IDc4Ci1JUFBST1RPX1dCRVhQQUsgPSA3OQotSVBQUk9UT19FT04gPSA4MAotSVBQUk9UT19WTVRQID0gODEKLUlQUFJPVE9fU1ZNVFAgPSA4MgotSVBQUk9UT19WSU5FUyA9IDgzCi1JUFBST1RPX1RUUCA9IDg0Ci1JUFBST1RPX0lHUCA9IDg1Ci1JUFBST1RPX0RHUCA9IDg2Ci1JUFBST1RPX1RDRiA9IDg3Ci1JUFBST1RPX0lHUlAgPSA4OAotSVBQUk9UT19PU1BGSUdQID0gODkKLUlQUFJPVE9fU1JQQyA9IDkwCi1JUFBST1RPX0xBUlAgPSA5MQotSVBQUk9UT19NVFAgPSA5MgotSVBQUk9UT19BWDI1ID0gOTMKLUlQUFJPVE9fSVBFSVAgPSA5NAotSVBQUk9UT19NSUNQID0gOTUKLUlQUFJPVE9fU0NDU1AgPSA5NgotSVBQUk9UT19FVEhFUklQID0gOTcKLUlQUFJPVE9fRU5DQVAgPSA5OAotSVBQUk9UT19BUEVTID0gOTkKLUlQUFJPVE9fR01UUCA9IDEwMAotSVBQUk9UT19JUENPTVAgPSAxMDgKLUlQUFJPVE9fU0NUUCA9IDEzMgotSVBQUk9UT19QSU0gPSAxMDMKLUlQUFJPVE9fQ0FSUCA9IDExMgotSVBQUk9UT19QR00gPSAxMTMKLUlQUFJPVE9fUEZTWU5DID0gMjQwCi1JUFBST1RPX09MRF9ESVZFUlQgPSAyNTQKLUlQUFJPVE9fTUFYID0gMjU2Ci1JUFBST1RPX0RPTkUgPSAyNTcKLUlQUFJPVE9fRElWRVJUID0gMjU4Ci1JUFBST1RPX1NQQUNFUiA9IDMyNzY3Ci1JUFBPUlRfUkVTRVJWRUQgPSAxMDI0Ci1JUFBPUlRfSElGSVJTVEFVVE8gPSA0OTE1MgotSVBQT1JUX0hJTEFTVEFVVE8gPSA2NTUzNQotSVBQT1JUX1JFU0VSVkVEU1RBUlQgPSA2MDAKLUlQUE9SVF9NQVggPSA2NTUzNQotZGVmIElOX0NMQVNTQShpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAoLTIxNDc0ODM2NDgpKSA9PSAwKQotCi1JTl9DTEFTU0FfTkVUID0gKC0xNjc3NzIxNikKLUlOX0NMQVNTQV9OU0hJRlQgPSAyNAotSU5fQ0xBU1NBX0hPU1QgPSAweDAwZmZmZmZmCi1JTl9DTEFTU0FfTUFYID0gMTI4Ci1kZWYgSU5fQ0xBU1NCKGkpOiByZXR1cm4gKCgodV9pbnQzMl90KShpKSAmICgtMTA3Mzc0MTgyNCkpID09ICgtMjE0NzQ4MzY0OCkpCi0KLUlOX0NMQVNTQl9ORVQgPSAoLTY1NTM2KQotSU5fQ0xBU1NCX05TSElGVCA9IDE2Ci1JTl9DTEFTU0JfSE9TVCA9IDB4MDAwMGZmZmYKLUlOX0NMQVNTQl9NQVggPSA2NTUzNgotZGVmIElOX0NMQVNTQyhpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAoLTUzNjg3MDkxMikpID09ICgtMTA3Mzc0MTgyNCkpCi0KLUlOX0NMQVNTQ19ORVQgPSAoLTI1NikKLUlOX0NMQVNTQ19OU0hJRlQgPSA4Ci1JTl9DTEFTU0NfSE9TVCA9IDB4MDAwMDAwZmYKLWRlZiBJTl9DTEFTU0QoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgKC0yNjg0MzU0NTYpKSA9PSAoLTUzNjg3MDkxMikpCi0KLUlOX0NMQVNTRF9ORVQgPSAoLTI2ODQzNTQ1NikKLUlOX0NMQVNTRF9OU0hJRlQgPSAyOAotSU5fQ0xBU1NEX0hPU1QgPSAweDBmZmZmZmZmCi1kZWYgSU5fTVVMVElDQVNUKGkpOiByZXR1cm4gSU5fQ0xBU1NEKGkpCi0KLWRlZiBJTl9FWFBFUklNRU5UQUwoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgKC0yNjg0MzU0NTYpKSA9PSAoLTI2ODQzNTQ1NikpCi0KLWRlZiBJTl9CQURDTEFTUyhpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAoLTI2ODQzNTQ1NikpID09ICgtMjY4NDM1NDU2KSkKLQotZGVmIElOX0xJTktMT0NBTChpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAoLTY1NTM2KSkgPT0gKC0xNDQyOTcxNjQ4KSkKLQotZGVmIElOX0xPQ0FMX0dST1VQKGkpOiByZXR1cm4gKCgodV9pbnQzMl90KShpKSAmICgtMjU2KSkgPT0gKC01MzY4NzA5MTIpKQotCi1JTkFERFJfTk9ORSA9ICgtMSkKLUlOX0xPT1BCQUNLTkVUID0gMTI3Ci1JUF9PUFRJT05TID0gMQotSVBfSERSSU5DTCA9IDIKLUlQX1RPUyA9IDMKLUlQX1RUTCA9IDQKLUlQX1JFQ1ZPUFRTID0gNQotSVBfUkVDVlJFVE9QVFMgPSA2Ci1JUF9SRUNWRFNUQUREUiA9IDcKLUlQX1NFTkRTUkNBRERSID0gSVBfUkVDVkRTVEFERFIKLUlQX1JFVE9QVFMgPSA4Ci1JUF9NVUxUSUNBU1RfSUYgPSA5Ci1JUF9NVUxUSUNBU1RfVFRMID0gMTAKLUlQX01VTFRJQ0FTVF9MT09QID0gMTEKLUlQX0FERF9NRU1CRVJTSElQID0gMTIKLUlQX0RST1BfTUVNQkVSU0hJUCA9IDEzCi1JUF9NVUxUSUNBU1RfVklGID0gMTQKLUlQX1JTVlBfT04gPSAxNQotSVBfUlNWUF9PRkYgPSAxNgotSVBfUlNWUF9WSUZfT04gPSAxNwotSVBfUlNWUF9WSUZfT0ZGID0gMTgKLUlQX1BPUlRSQU5HRSA9IDE5Ci1JUF9SRUNWSUYgPSAyMAotSVBfSVBTRUNfUE9MSUNZID0gMjEKLUlQX0ZBSVRIID0gMjIKLUlQX09ORVNCQ0FTVCA9IDIzCi1JUF9GV19UQUJMRV9BREQgPSA0MAotSVBfRldfVEFCTEVfREVMID0gNDEKLUlQX0ZXX1RBQkxFX0ZMVVNIID0gNDIKLUlQX0ZXX1RBQkxFX0dFVFNJWkUgPSA0MwotSVBfRldfVEFCTEVfTElTVCA9IDQ0Ci1JUF9GV19BREQgPSA1MAotSVBfRldfREVMID0gNTEKLUlQX0ZXX0ZMVVNIID0gNTIKLUlQX0ZXX1pFUk8gPSA1MwotSVBfRldfR0VUID0gNTQKLUlQX0ZXX1JFU0VUTE9HID0gNTUKLUlQX0ZXX05BVF9DRkcgPSA1NgotSVBfRldfTkFUX0RFTCA9IDU3Ci1JUF9GV19OQVRfR0VUX0NPTkZJRyA9IDU4Ci1JUF9GV19OQVRfR0VUX0xPRyA9IDU5Ci1JUF9EVU1NWU5FVF9DT05GSUdVUkUgPSA2MAotSVBfRFVNTVlORVRfREVMID0gNjEKLUlQX0RVTU1ZTkVUX0ZMVVNIID0gNjIKLUlQX0RVTU1ZTkVUX0dFVCA9IDY0Ci1JUF9SRUNWVFRMID0gNjUKLUlQX01JTlRUTCA9IDY2Ci1JUF9ET05URlJBRyA9IDY3Ci1JUF9BRERfU09VUkNFX01FTUJFUlNISVAgPSA3MAotSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUCA9IDcxCi1JUF9CTE9DS19TT1VSQ0UgPSA3MgotSVBfVU5CTE9DS19TT1VSQ0UgPSA3MwotSVBfTVNGSUxURVIgPSA3NAotTUNBU1RfSk9JTl9HUk9VUCA9IDgwCi1NQ0FTVF9MRUFWRV9HUk9VUCA9IDgxCi1NQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUCA9IDgyCi1NQ0FTVF9MRUFWRV9TT1VSQ0VfR1JPVVAgPSA4MwotTUNBU1RfQkxPQ0tfU09VUkNFID0gODQKLU1DQVNUX1VOQkxPQ0tfU09VUkNFID0gODUKLUlQX0RFRkFVTFRfTVVMVElDQVNUX1RUTCA9IDEKLUlQX0RFRkFVTFRfTVVMVElDQVNUX0xPT1AgPSAxCi1JUF9NSU5fTUVNQkVSU0hJUFMgPSAzMQotSVBfTUFYX01FTUJFUlNISVBTID0gNDA5NQotSVBfTUFYX1NPVVJDRV9GSUxURVIgPSAxMDI0Ci1NQ0FTVF9JTkNMVURFID0gMQotTUNBU1RfRVhDTFVERSA9IDIKLUlQX1BPUlRSQU5HRV9ERUZBVUxUID0gMAotSVBfUE9SVFJBTkdFX0hJR0ggPSAxCi1JUF9QT1JUUkFOR0VfTE9XID0gMgotSVBQUk9UT19NQVhJRCA9IChJUFBST1RPX0FIICsgMSkKLUlQQ1RMX0ZPUldBUkRJTkcgPSAxCi1JUENUTF9TRU5EUkVESVJFQ1RTID0gMgotSVBDVExfREVGVFRMID0gMwotSVBDVExfREVGTVRVID0gNAotSVBDVExfUlRFWFBJUkUgPSA1Ci1JUENUTF9SVE1JTkVYUElSRSA9IDYKLUlQQ1RMX1JUTUFYQ0FDSEUgPSA3Ci1JUENUTF9TT1VSQ0VST1VURSA9IDgKLUlQQ1RMX0RJUkVDVEVEQlJPQURDQVNUID0gOQotSVBDVExfSU5UUlFNQVhMRU4gPSAxMAotSVBDVExfSU5UUlFEUk9QUyA9IDExCi1JUENUTF9TVEFUUyA9IDEyCi1JUENUTF9BQ0NFUFRTT1VSQ0VST1VURSA9IDEzCi1JUENUTF9GQVNURk9SV0FSRElORyA9IDE0Ci1JUENUTF9LRUVQRkFJVEggPSAxNQotSVBDVExfR0lGX1RUTCA9IDE2Ci1JUENUTF9NQVhJRCA9IDE3Ci1kZWYgaW5fbnVsbGhvc3QoeCk6IHJldHVybiAoKHgpLnNfYWRkciA9PSBJTkFERFJfQU5ZKQotCi0KLSMgSW5jbHVkZWQgZnJvbSBuZXRpbmV0Ni9pbjYuaAotX19LQU1FX1ZFUlNJT04gPSAiRnJlZUJTRCIKLUlQVjZQT1JUX1JFU0VSVkVEID0gMTAyNAotSVBWNlBPUlRfQU5PTk1JTiA9IDQ5MTUyCi1JUFY2UE9SVF9BTk9OTUFYID0gNjU1MzUKLUlQVjZQT1JUX1JFU0VSVkVETUlOID0gNjAwCi1JUFY2UE9SVF9SRVNFUlZFRE1BWCA9IChJUFY2UE9SVF9SRVNFUlZFRC0xKQotSU5FVDZfQUREUlNUUkxFTiA9IDQ2Ci1JUFY2X0FERFJfSU5UMzJfT05FID0gMQotSVBWNl9BRERSX0lOVDMyX1RXTyA9IDIKLUlQVjZfQUREUl9JTlQzMl9NTkwgPSAoLTE2NzExNjgwKQotSVBWNl9BRERSX0lOVDMyX01MTCA9ICgtMTY2NDYxNDQpCi1JUFY2X0FERFJfSU5UMzJfU01QID0gMHgwMDAwZmZmZgotSVBWNl9BRERSX0lOVDE2X1VMTCA9IDB4ZmU4MAotSVBWNl9BRERSX0lOVDE2X1VTTCA9IDB4ZmVjMAotSVBWNl9BRERSX0lOVDE2X01MTCA9IDB4ZmYwMgotSVBWNl9BRERSX0lOVDMyX09ORSA9IDB4MDEwMDAwMDAKLUlQVjZfQUREUl9JTlQzMl9UV08gPSAweDAyMDAwMDAwCi1JUFY2X0FERFJfSU5UMzJfTU5MID0gMHgwMDAwMDFmZgotSVBWNl9BRERSX0lOVDMyX01MTCA9IDB4MDAwMDAyZmYKLUlQVjZfQUREUl9JTlQzMl9TTVAgPSAoLTY1NTM2KQotSVBWNl9BRERSX0lOVDE2X1VMTCA9IDB4ODBmZQotSVBWNl9BRERSX0lOVDE2X1VTTCA9IDB4YzBmZQotSVBWNl9BRERSX0lOVDE2X01MTCA9IDB4MDJmZgotZGVmIElONl9JU19BRERSX1VOU1BFQ0lGSUVEKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTE9PUEJBQ0soYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9WNENPTVBBVChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX1Y0TUFQUEVEKGEpOiByZXR1cm4gXAotCi1JUFY2X0FERFJfU0NPUEVfTk9ERUxPQ0FMID0gMHgwMQotSVBWNl9BRERSX1NDT1BFX0lOVEZBQ0VMT0NBTCA9IDB4MDEKLUlQVjZfQUREUl9TQ09QRV9MSU5LTE9DQUwgPSAweDAyCi1JUFY2X0FERFJfU0NPUEVfU0lURUxPQ0FMID0gMHgwNQotSVBWNl9BRERSX1NDT1BFX09SR0xPQ0FMID0gMHgwOAotSVBWNl9BRERSX1NDT1BFX0dMT0JBTCA9IDB4MGUKLV9fSVBWNl9BRERSX1NDT1BFX05PREVMT0NBTCA9IDB4MDEKLV9fSVBWNl9BRERSX1NDT1BFX0lOVEZBQ0VMT0NBTCA9IDB4MDEKLV9fSVBWNl9BRERSX1NDT1BFX0xJTktMT0NBTCA9IDB4MDIKLV9fSVBWNl9BRERSX1NDT1BFX1NJVEVMT0NBTCA9IDB4MDUKLV9fSVBWNl9BRERSX1NDT1BFX09SR0xPQ0FMID0gMHgwOAotX19JUFY2X0FERFJfU0NPUEVfR0xPQkFMID0gMHgwZQotZGVmIElONl9JU19BRERSX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX1NJVEVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX05PREVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0lOVEZBQ0VMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX1NJVEVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX09SR0xPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfR0xPQkFMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfTk9ERUxPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfTElOS0xPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfU0lURUxPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfT1JHTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19HTE9CQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfU0NPUEVfTElOS0xPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX1NDT1BFX0VNQkVEKGEpOiByZXR1cm4gXAotCi1kZWYgSUZBNl9JU19ERVBSRUNBVEVEKGEpOiByZXR1cm4gXAotCi1kZWYgSUZBNl9JU19JTlZBTElEKGEpOiByZXR1cm4gXAotCi1JUFY2X09QVElPTlMgPSAxCi1JUFY2X1JFQ1ZPUFRTID0gNQotSVBWNl9SRUNWUkVUT1BUUyA9IDYKLUlQVjZfUkVDVkRTVEFERFIgPSA3Ci1JUFY2X1JFVE9QVFMgPSA4Ci1JUFY2X1NPQ0tPUFRfUkVTRVJWRUQxID0gMwotSVBWNl9VTklDQVNUX0hPUFMgPSA0Ci1JUFY2X01VTFRJQ0FTVF9JRiA9IDkKLUlQVjZfTVVMVElDQVNUX0hPUFMgPSAxMAotSVBWNl9NVUxUSUNBU1RfTE9PUCA9IDExCi1JUFY2X0pPSU5fR1JPVVAgPSAxMgotSVBWNl9MRUFWRV9HUk9VUCA9IDEzCi1JUFY2X1BPUlRSQU5HRSA9IDE0Ci1JQ01QNl9GSUxURVIgPSAxOAotSVBWNl8yMjkyUEtUSU5GTyA9IDE5Ci1JUFY2XzIyOTJIT1BMSU1JVCA9IDIwCi1JUFY2XzIyOTJORVhUSE9QID0gMjEKLUlQVjZfMjI5MkhPUE9QVFMgPSAyMgotSVBWNl8yMjkyRFNUT1BUUyA9IDIzCi1JUFY2XzIyOTJSVEhEUiA9IDI0Ci1JUFY2XzIyOTJQS1RPUFRJT05TID0gMjUKLUlQVjZfQ0hFQ0tTVU0gPSAyNgotSVBWNl9WNk9OTFkgPSAyNwotSVBWNl9CSU5EVjZPTkxZID0gSVBWNl9WNk9OTFkKLUlQVjZfSVBTRUNfUE9MSUNZID0gMjgKLUlQVjZfRkFJVEggPSAyOQotSVBWNl9GV19BREQgPSAzMAotSVBWNl9GV19ERUwgPSAzMQotSVBWNl9GV19GTFVTSCA9IDMyCi1JUFY2X0ZXX1pFUk8gPSAzMwotSVBWNl9GV19HRVQgPSAzNAotSVBWNl9SVEhEUkRTVE9QVFMgPSAzNQotSVBWNl9SRUNWUEtUSU5GTyA9IDM2Ci1JUFY2X1JFQ1ZIT1BMSU1JVCA9IDM3Ci1JUFY2X1JFQ1ZSVEhEUiA9IDM4Ci1JUFY2X1JFQ1ZIT1BPUFRTID0gMzkKLUlQVjZfUkVDVkRTVE9QVFMgPSA0MAotSVBWNl9SRUNWUlRIRFJEU1RPUFRTID0gNDEKLUlQVjZfVVNFX01JTl9NVFUgPSA0MgotSVBWNl9SRUNWUEFUSE1UVSA9IDQzCi1JUFY2X1BBVEhNVFUgPSA0NAotSVBWNl9SRUFDSENPTkYgPSA0NQotSVBWNl9QS1RJTkZPID0gNDYKLUlQVjZfSE9QTElNSVQgPSA0NwotSVBWNl9ORVhUSE9QID0gNDgKLUlQVjZfSE9QT1BUUyA9IDQ5Ci1JUFY2X0RTVE9QVFMgPSA1MAotSVBWNl9SVEhEUiA9IDUxCi1JUFY2X1BLVE9QVElPTlMgPSA1MgotSVBWNl9SRUNWVENMQVNTID0gNTcKLUlQVjZfQVVUT0ZMT1dMQUJFTCA9IDU5Ci1JUFY2X1RDTEFTUyA9IDYxCi1JUFY2X0RPTlRGUkFHID0gNjIKLUlQVjZfUFJFRkVSX1RFTVBBRERSID0gNjMKLUlQVjZfTVNGSUxURVIgPSA3NAotSVBWNl9SVEhEUl9MT09TRSA9IDAKLUlQVjZfUlRIRFJfU1RSSUNUID0gMQotSVBWNl9SVEhEUl9UWVBFXzAgPSAwCi1JUFY2X0RFRkFVTFRfTVVMVElDQVNUX0hPUFMgPSAxCi1JUFY2X0RFRkFVTFRfTVVMVElDQVNUX0xPT1AgPSAxCi1JUFY2X1BPUlRSQU5HRV9ERUZBVUxUID0gMAotSVBWNl9QT1JUUkFOR0VfSElHSCA9IDEKLUlQVjZfUE9SVFJBTkdFX0xPVyA9IDIKLUlQVjZQUk9UT19NQVhJRCA9IChJUFBST1RPX1BJTSArIDEpCi1JUFY2Q1RMX0ZPUldBUkRJTkcgPSAxCi1JUFY2Q1RMX1NFTkRSRURJUkVDVFMgPSAyCi1JUFY2Q1RMX0RFRkhMSU0gPSAzCi1JUFY2Q1RMX0RFRk1UVSA9IDQKLUlQVjZDVExfRk9SV1NSQ1JUID0gNQotSVBWNkNUTF9TVEFUUyA9IDYKLUlQVjZDVExfTVJUU1RBVFMgPSA3Ci1JUFY2Q1RMX01SVFBST1RPID0gOAotSVBWNkNUTF9NQVhGUkFHUEFDS0VUUyA9IDkKLUlQVjZDVExfU09VUkNFQ0hFQ0sgPSAxMAotSVBWNkNUTF9TT1VSQ0VDSEVDS19MT0dJTlQgPSAxMQotSVBWNkNUTF9BQ0NFUFRfUlRBRFYgPSAxMgotSVBWNkNUTF9LRUVQRkFJVEggPSAxMwotSVBWNkNUTF9MT0dfSU5URVJWQUwgPSAxNAotSVBWNkNUTF9IRFJORVNUTElNSVQgPSAxNQotSVBWNkNUTF9EQURfQ09VTlQgPSAxNgotSVBWNkNUTF9BVVRPX0ZMT1dMQUJFTCA9IDE3Ci1JUFY2Q1RMX0RFRk1DQVNUSExJTSA9IDE4Ci1JUFY2Q1RMX0dJRl9ITElNID0gMTkKLUlQVjZDVExfS0FNRV9WRVJTSU9OID0gMjAKLUlQVjZDVExfVVNFX0RFUFJFQ0FURUQgPSAyMQotSVBWNkNUTF9SUl9QUlVORSA9IDIyCi1JUFY2Q1RMX01BUFBFRF9BRERSID0gMjMKLUlQVjZDVExfVjZPTkxZID0gMjQKLUlQVjZDVExfUlRFWFBJUkUgPSAyNQotSVBWNkNUTF9SVE1JTkVYUElSRSA9IDI2Ci1JUFY2Q1RMX1JUTUFYQ0FDSEUgPSAyNwotSVBWNkNUTF9VU0VURU1QQUREUiA9IDMyCi1JUFY2Q1RMX1RFTVBQTFRJTUUgPSAzMwotSVBWNkNUTF9URU1QVkxUSU1FID0gMzQKLUlQVjZDVExfQVVUT19MSU5LTE9DQUwgPSAzNQotSVBWNkNUTF9SSVA2U1RBVFMgPSAzNgotSVBWNkNUTF9QUkVGRVJfVEVNUEFERFIgPSAzNwotSVBWNkNUTF9BRERSQ1RMUE9MSUNZID0gMzgKLUlQVjZDVExfVVNFX0RFRkFVTFRaT05FID0gMzkKLUlQVjZDVExfTUFYRlJBR1MgPSA0MQotSVBWNkNUTF9JRlEgPSA0MgotSVBWNkNUTF9JU0FUQVBSVFIgPSA0MwotSVBWNkNUTF9NQ0FTVF9QTVRVID0gNDQKLUlQVjZDVExfU1RFQUxUSCA9IDQ1Ci1JUFY2Q1RMX01BWElEID0gNDYKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWZyZWVic2Q4L3JlZ2VuIGIvTGliL3BsYXQtZnJlZWJzZDgvcmVnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhYTY4OTguLjAwMDAwMDAKLS0tIGEvTGliL3BsYXQtZnJlZWJzZDgvcmVnZW4KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMhIC9iaW4vc2gKLXNldCAtdgotcHl0aG9uIC4uLy4uL1Rvb2xzL3NjcmlwdHMvaDJweS5weSAtaSAnKHVfbG9uZyknIC91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmgKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWdlbmVyaWMvcmVnZW4gYi9MaWIvcGxhdC1nZW5lcmljL3JlZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTYxNjdkLi4wMDAwMDAwCi0tLSBhL0xpYi9wbGF0LWdlbmVyaWMvcmVnZW4KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMhIC9iaW4vc2gKLXNldCAtdgotZXZhbCAkUFlUSE9OX0ZPUl9CVUlMRCAuLi8uLi9Ub29scy9zY3JpcHRzL2gycHkucHkgLWkgIicodV9sb25nKSciIC91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmgKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWxpbnV4L0NEUk9NLnB5IGIvTGliL3BsYXQtbGludXgvQ0RST00ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNDA5MzYuLjAwMDAwMDAKLS0tIGEvTGliL3BsYXQtbGludXgvQ0RST00ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotIyBHZW5lcmF0ZWQgYnkgaDJweSBmcm9tIC91c3IvaW5jbHVkZS9saW51eC9jZHJvbS5oCi0KLUNEUk9NUEFVU0UgPSAweDUzMDEKLUNEUk9NUkVTVU1FID0gMHg1MzAyCi1DRFJPTVBMQVlNU0YgPSAweDUzMDMKLUNEUk9NUExBWVRSS0lORCA9IDB4NTMwNAotQ0RST01SRUFEVE9DSERSID0gMHg1MzA1Ci1DRFJPTVJFQURUT0NFTlRSWSA9IDB4NTMwNgotQ0RST01TVE9QID0gMHg1MzA3Ci1DRFJPTVNUQVJUID0gMHg1MzA4Ci1DRFJPTUVKRUNUID0gMHg1MzA5Ci1DRFJPTVZPTENUUkwgPSAweDUzMGEKLUNEUk9NU1VCQ0hOTCA9IDB4NTMwYgotQ0RST01SRUFETU9ERTIgPSAweDUzMGMKLUNEUk9NUkVBRE1PREUxID0gMHg1MzBkCi1DRFJPTVJFQURBVURJTyA9IDB4NTMwZQotQ0RST01FSkVDVF9TVyA9IDB4NTMwZgotQ0RST01NVUxUSVNFU1NJT04gPSAweDUzMTAKLUNEUk9NX0dFVF9NQ04gPSAweDUzMTEKLUNEUk9NX0dFVF9VUEMgPSBDRFJPTV9HRVRfTUNOCi1DRFJPTVJFU0VUID0gMHg1MzEyCi1DRFJPTVZPTFJFQUQgPSAweDUzMTMKLUNEUk9NUkVBRFJBVyA9IDB4NTMxNAotQ0RST01SRUFEQ09PS0VEID0gMHg1MzE1Ci1DRFJPTVNFRUsgPSAweDUzMTYKLUNEUk9NUExBWUJMSyA9IDB4NTMxNwotQ0RST01SRUFEQUxMID0gMHg1MzE4Ci1DRFJPTUdFVFNQSU5ET1dOID0gMHg1MzFkCi1DRFJPTVNFVFNQSU5ET1dOID0gMHg1MzFlCi1DRFJPTUNMT1NFVFJBWSA9IDB4NTMxOQotQ0RST01fU0VUX09QVElPTlMgPSAweDUzMjAKLUNEUk9NX0NMRUFSX09QVElPTlMgPSAweDUzMjEKLUNEUk9NX1NFTEVDVF9TUEVFRCA9IDB4NTMyMgotQ0RST01fU0VMRUNUX0RJU0MgPSAweDUzMjMKLUNEUk9NX01FRElBX0NIQU5HRUQgPSAweDUzMjUKLUNEUk9NX0RSSVZFX1NUQVRVUyA9IDB4NTMyNgotQ0RST01fRElTQ19TVEFUVVMgPSAweDUzMjcKLUNEUk9NX0NIQU5HRVJfTlNMT1RTID0gMHg1MzI4Ci1DRFJPTV9MT0NLRE9PUiA9IDB4NTMyOQotQ0RST01fREVCVUcgPSAweDUzMzAKLUNEUk9NX0dFVF9DQVBBQklMSVRZID0gMHg1MzMxCi1DRFJPTUFVRElPQlVGU0laID0gMHg1MzgyCi1EVkRfUkVBRF9TVFJVQ1QgPSAweDUzOTAKLURWRF9XUklURV9TVFJVQ1QgPSAweDUzOTEKLURWRF9BVVRIID0gMHg1MzkyCi1DRFJPTV9TRU5EX1BBQ0tFVCA9IDB4NTM5MwotQ0RST01fTkVYVF9XUklUQUJMRSA9IDB4NTM5NAotQ0RST01fTEFTVF9XUklUVEVOID0gMHg1Mzk1Ci1DRFJPTV9QQUNLRVRfU0laRSA9IDEyCi1DR0NfREFUQV9VTktOT1dOID0gMAotQ0dDX0RBVEFfV1JJVEUgPSAxCi1DR0NfREFUQV9SRUFEID0gMgotQ0dDX0RBVEFfTk9ORSA9IDMKLUNEX01JTlMgPSA3NAotQ0RfU0VDUyA9IDYwCi1DRF9GUkFNRVMgPSA3NQotQ0RfU1lOQ19TSVpFID0gMTIKLUNEX01TRl9PRkZTRVQgPSAxNTAKLUNEX0NIVU5LX1NJWkUgPSAyNAotQ0RfTlVNX09GX0NIVU5LUyA9IDk4Ci1DRF9GUkFNRVNJWkVfU1VCID0gOTYKLUNEX0hFQURfU0laRSA9IDQKLUNEX1NVQkhFQURfU0laRSA9IDgKLUNEX0VEQ19TSVpFID0gNAotQ0RfWkVST19TSVpFID0gOAotQ0RfRUNDX1NJWkUgPSAyNzYKLUNEX0ZSQU1FU0laRSA9IDIwNDgKLUNEX0ZSQU1FU0laRV9SQVcgPSAyMzUyCi1DRF9GUkFNRVNJWkVfUkFXRVIgPSAyNjQ2Ci1DRF9GUkFNRVNJWkVfUkFXMSA9IChDRF9GUkFNRVNJWkVfUkFXLUNEX1NZTkNfU0laRSkKLUNEX0ZSQU1FU0laRV9SQVcwID0gKENEX0ZSQU1FU0laRV9SQVctQ0RfU1lOQ19TSVpFLUNEX0hFQURfU0laRSkKLUNEX1hBX0hFQUQgPSAoQ0RfSEVBRF9TSVpFK0NEX1NVQkhFQURfU0laRSkKLUNEX1hBX1RBSUwgPSAoQ0RfRURDX1NJWkUrQ0RfRUNDX1NJWkUpCi1DRF9YQV9TWU5DX0hFQUQgPSAoQ0RfU1lOQ19TSVpFK0NEX1hBX0hFQUQpCi1DRFJPTV9MQkEgPSAweDAxCi1DRFJPTV9NU0YgPSAweDAyCi1DRFJPTV9EQVRBX1RSQUNLID0gMHgwNAotQ0RST01fTEVBRE9VVCA9IDB4QUEKLUNEUk9NX0FVRElPX0lOVkFMSUQgPSAweDAwCi1DRFJPTV9BVURJT19QTEFZID0gMHgxMQotQ0RST01fQVVESU9fUEFVU0VEID0gMHgxMgotQ0RST01fQVVESU9fQ09NUExFVEVEID0gMHgxMwotQ0RST01fQVVESU9fRVJST1IgPSAweDE0Ci1DRFJPTV9BVURJT19OT19TVEFUVVMgPSAweDE1Ci1DRENfQ0xPU0VfVFJBWSA9IDB4MQotQ0RDX09QRU5fVFJBWSA9IDB4MgotQ0RDX0xPQ0sgPSAweDQKLUNEQ19TRUxFQ1RfU1BFRUQgPSAweDgKLUNEQ19TRUxFQ1RfRElTQyA9IDB4MTAKLUNEQ19NVUxUSV9TRVNTSU9OID0gMHgyMAotQ0RDX01DTiA9IDB4NDAKLUNEQ19NRURJQV9DSEFOR0VEID0gMHg4MAotQ0RDX1BMQVlfQVVESU8gPSAweDEwMAotQ0RDX1JFU0VUID0gMHgyMDAKLUNEQ19JT0NUTFMgPSAweDQwMAotQ0RDX0RSSVZFX1NUQVRVUyA9IDB4ODAwCi1DRENfR0VORVJJQ19QQUNLRVQgPSAweDEwMDAKLUNEQ19DRF9SID0gMHgyMDAwCi1DRENfQ0RfUlcgPSAweDQwMDAKLUNEQ19EVkQgPSAweDgwMDAKLUNEQ19EVkRfUiA9IDB4MTAwMDAKLUNEQ19EVkRfUkFNID0gMHgyMDAwMAotQ0RTX05PX0lORk8gPSAwCi1DRFNfTk9fRElTQyA9IDEKLUNEU19UUkFZX09QRU4gPSAyCi1DRFNfRFJJVkVfTk9UX1JFQURZID0gMwotQ0RTX0RJU0NfT0sgPSA0Ci1DRFNfQVVESU8gPSAxMDAKLUNEU19EQVRBXzEgPSAxMDEKLUNEU19EQVRBXzIgPSAxMDIKLUNEU19YQV8yXzEgPSAxMDMKLUNEU19YQV8yXzIgPSAxMDQKLUNEU19NSVhFRCA9IDEwNQotQ0RPX0FVVE9fQ0xPU0UgPSAweDEKLUNET19BVVRPX0VKRUNUID0gMHgyCi1DRE9fVVNFX0ZGTEFHUyA9IDB4NAotQ0RPX0xPQ0sgPSAweDgKLUNET19DSEVDS19UWVBFID0gMHgxMAotQ0RfUEFSVF9NQVggPSA2NAotQ0RfUEFSVF9NQVNLID0gKENEX1BBUlRfTUFYIC0gMSkKLUdQQ01EX0JMQU5LID0gMHhhMQotR1BDTURfQ0xPU0VfVFJBQ0sgPSAweDViCi1HUENNRF9GTFVTSF9DQUNIRSA9IDB4MzUKLUdQQ01EX0ZPUk1BVF9VTklUID0gMHgwNAotR1BDTURfR0VUX0NPTkZJR1VSQVRJT04gPSAweDQ2Ci1HUENNRF9HRVRfRVZFTlRfU1RBVFVTX05PVElGSUNBVElPTiA9IDB4NGEKLUdQQ01EX0dFVF9QRVJGT1JNQU5DRSA9IDB4YWMKLUdQQ01EX0lOUVVJUlkgPSAweDEyCi1HUENNRF9MT0FEX1VOTE9BRCA9IDB4YTYKLUdQQ01EX01FQ0hBTklTTV9TVEFUVVMgPSAweGJkCi1HUENNRF9NT0RFX1NFTEVDVF8xMCA9IDB4NTUKLUdQQ01EX01PREVfU0VOU0VfMTAgPSAweDVhCi1HUENNRF9QQVVTRV9SRVNVTUUgPSAweDRiCi1HUENNRF9QTEFZX0FVRElPXzEwID0gMHg0NQotR1BDTURfUExBWV9BVURJT19NU0YgPSAweDQ3Ci1HUENNRF9QTEFZX0FVRElPX1RJID0gMHg0OAotR1BDTURfUExBWV9DRCA9IDB4YmMKLUdQQ01EX1BSRVZFTlRfQUxMT1dfTUVESVVNX1JFTU9WQUwgPSAweDFlCi1HUENNRF9SRUFEXzEwID0gMHgyOAotR1BDTURfUkVBRF8xMiA9IDB4YTgKLUdQQ01EX1JFQURfQ0RWRF9DQVBBQ0lUWSA9IDB4MjUKLUdQQ01EX1JFQURfQ0QgPSAweGJlCi1HUENNRF9SRUFEX0NEX01TRiA9IDB4YjkKLUdQQ01EX1JFQURfRElTQ19JTkZPID0gMHg1MQotR1BDTURfUkVBRF9EVkRfU1RSVUNUVVJFID0gMHhhZAotR1BDTURfUkVBRF9GT1JNQVRfQ0FQQUNJVElFUyA9IDB4MjMKLUdQQ01EX1JFQURfSEVBREVSID0gMHg0NAotR1BDTURfUkVBRF9UUkFDS19SWk9ORV9JTkZPID0gMHg1MgotR1BDTURfUkVBRF9TVUJDSEFOTkVMID0gMHg0MgotR1BDTURfUkVBRF9UT0NfUE1BX0FUSVAgPSAweDQzCi1HUENNRF9SRVBBSVJfUlpPTkVfVFJBQ0sgPSAweDU4Ci1HUENNRF9SRVBPUlRfS0VZID0gMHhhNAotR1BDTURfUkVRVUVTVF9TRU5TRSA9IDB4MDMKLUdQQ01EX1JFU0VSVkVfUlpPTkVfVFJBQ0sgPSAweDUzCi1HUENNRF9TQ0FOID0gMHhiYQotR1BDTURfU0VFSyA9IDB4MmIKLUdQQ01EX1NFTkRfRFZEX1NUUlVDVFVSRSA9IDB4YWQKLUdQQ01EX1NFTkRfRVZFTlQgPSAweGEyCi1HUENNRF9TRU5EX0tFWSA9IDB4YTMKLUdQQ01EX1NFTkRfT1BDID0gMHg1NAotR1BDTURfU0VUX1JFQURfQUhFQUQgPSAweGE3Ci1HUENNRF9TRVRfU1RSRUFNSU5HID0gMHhiNgotR1BDTURfU1RBUlRfU1RPUF9VTklUID0gMHgxYgotR1BDTURfU1RPUF9QTEFZX1NDQU4gPSAweDRlCi1HUENNRF9URVNUX1VOSVRfUkVBRFkgPSAweDAwCi1HUENNRF9WRVJJRllfMTAgPSAweDJmCi1HUENNRF9XUklURV8xMCA9IDB4MmEKLUdQQ01EX1dSSVRFX0FORF9WRVJJRllfMTAgPSAweDJlCi1HUENNRF9TRVRfU1BFRUQgPSAweGJiCi1HUENNRF9QTEFZQVVESU9fVEkgPSAweDQ4Ci1HUENNRF9HRVRfTUVESUFfU1RBVFVTID0gMHhkYQotR1BNT0RFX1JfV19FUlJPUl9QQUdFID0gMHgwMQotR1BNT0RFX1dSSVRFX1BBUk1TX1BBR0UgPSAweDA1Ci1HUE1PREVfQVVESU9fQ1RMX1BBR0UgPSAweDBlCi1HUE1PREVfUE9XRVJfUEFHRSA9IDB4MWEKLUdQTU9ERV9GQVVMVF9GQUlMX1BBR0UgPSAweDFjCi1HUE1PREVfVE9fUFJPVEVDVF9QQUdFID0gMHgxZAotR1BNT0RFX0NBUEFCSUxJVElFU19QQUdFID0gMHgyYQotR1BNT0RFX0FMTF9QQUdFUyA9IDB4M2YKLUdQTU9ERV9DRFJPTV9QQUdFID0gMHgwZAotRFZEX1NUUlVDVF9QSFlTSUNBTCA9IDB4MDAKLURWRF9TVFJVQ1RfQ09QWVJJR0hUID0gMHgwMQotRFZEX1NUUlVDVF9ESVNDS0VZID0gMHgwMgotRFZEX1NUUlVDVF9CQ0EgPSAweDAzCi1EVkRfU1RSVUNUX01BTlVGQUNUID0gMHgwNAotRFZEX0xBWUVSUyA9IDQKLURWRF9MVV9TRU5EX0FHSUQgPSAwCi1EVkRfSE9TVF9TRU5EX0NIQUxMRU5HRSA9IDEKLURWRF9MVV9TRU5EX0tFWTEgPSAyCi1EVkRfTFVfU0VORF9DSEFMTEVOR0UgPSAzCi1EVkRfSE9TVF9TRU5EX0tFWTIgPSA0Ci1EVkRfQVVUSF9FU1RBQkxJU0hFRCA9IDUKLURWRF9BVVRIX0ZBSUxVUkUgPSA2Ci1EVkRfTFVfU0VORF9USVRMRV9LRVkgPSA3Ci1EVkRfTFVfU0VORF9BU0YgPSA4Ci1EVkRfSU5WQUxJREFURV9BR0lEID0gOQotRFZEX0xVX1NFTkRfUlBDX1NUQVRFID0gMTAKLURWRF9IT1NUX1NFTkRfUlBDX1NUQVRFID0gMTEKLURWRF9DUE1fTk9fQ09QWVJJR0hUID0gMAotRFZEX0NQTV9DT1BZUklHSFRFRCA9IDEKLURWRF9DUF9TRUNfTk9ORSA9IDAKLURWRF9DUF9TRUNfRVhJU1QgPSAxCi1EVkRfQ0dNU19VTlJFU1RSSUNURUQgPSAwCi1EVkRfQ0dNU19TSU5HTEUgPSAyCi1EVkRfQ0dNU19SRVNUUklDVEVEID0gMwotCi1DRFJPTV9NQVhfU0xPVFMgPSAyNTYKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWxpbnV4L0RMRkNOLnB5IGIvTGliL3BsYXQtbGludXgvRExGQ04ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTBhYzQuLjAwMDAwMDAKLS0tIGEvTGliL3BsYXQtbGludXgvRExGQ04ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0jIEdlbmVyYXRlZCBieSBoMnB5IGZyb20gL3Vzci9pbmNsdWRlL2RsZmNuLmgKLV9ETEZDTl9IID0gMQotCi0jIEluY2x1ZGVkIGZyb20gZmVhdHVyZXMuaAotX0ZFQVRVUkVTX0ggPSAxCi1fX1VTRV9BTlNJID0gMQotX19GQVZPUl9CU0QgPSAxCi1fSVNPQzk5X1NPVVJDRSA9IDEKLV9QT1NJWF9TT1VSQ0UgPSAxCi1fUE9TSVhfQ19TT1VSQ0UgPSAxOTk1MDYKLV9YT1BFTl9TT1VSQ0UgPSA2MDAKLV9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgPSAxCi1fTEFSR0VGSUxFNjRfU09VUkNFID0gMQotX0JTRF9TT1VSQ0UgPSAxCi1fU1ZJRF9TT1VSQ0UgPSAxCi1fQlNEX1NPVVJDRSA9IDEKLV9TVklEX1NPVVJDRSA9IDEKLV9fVVNFX0lTT0M5OSA9IDEKLV9QT1NJWF9TT1VSQ0UgPSAxCi1fUE9TSVhfQ19TT1VSQ0UgPSAyCi1fUE9TSVhfQ19TT1VSQ0UgPSAxOTk1MDYKLV9fVVNFX1BPU0lYID0gMQotX19VU0VfUE9TSVgyID0gMQotX19VU0VfUE9TSVgxOTkzMDkgPSAxCi1fX1VTRV9QT1NJWDE5OTUwNiA9IDEKLV9fVVNFX1hPUEVOID0gMQotX19VU0VfWE9QRU5fRVhURU5ERUQgPSAxCi1fX1VTRV9VTklYOTggPSAxCi1fTEFSR0VGSUxFX1NPVVJDRSA9IDEKLV9fVVNFX1hPUEVOMksgPSAxCi1fX1VTRV9JU09DOTkgPSAxCi1fX1VTRV9YT1BFTl9FWFRFTkRFRCA9IDEKLV9fVVNFX0xBUkdFRklMRSA9IDEKLV9fVVNFX0xBUkdFRklMRTY0ID0gMQotX19VU0VfRklMRV9PRkZTRVQ2NCA9IDEKLV9fVVNFX01JU0MgPSAxCi1fX1VTRV9CU0QgPSAxCi1fX1VTRV9TVklEID0gMQotX19VU0VfR05VID0gMQotX19VU0VfUkVFTlRSQU5UID0gMQotX19TVERDX0lFQ181NTlfXyA9IDEKLV9fU1REQ19JRUNfNTU5X0NPTVBMRVhfXyA9IDEKLV9fU1REQ19JU09fMTA2NDZfXyA9IDIwMDAwOQotX19HTlVfTElCUkFSWV9fID0gNgotX19HTElCQ19fID0gMgotX19HTElCQ19NSU5PUl9fID0gMgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2NkZWZzLmgKLV9TWVNfQ0RFRlNfSCA9IDEKLWRlZiBfX1BNVChhcmdzKTogcmV0dXJuIGFyZ3MKLQotZGVmIF9fUChhcmdzKTogcmV0dXJuIGFyZ3MKLQotZGVmIF9fUE1UKGFyZ3MpOiByZXR1cm4gYXJncwotCi1kZWYgX19TVFJJTkcoeCk6IHJldHVybiAjeAotCi1fX2ZsZXhhcnIgPSBbXQotX19mbGV4YXJyID0gWzBdCi1fX2ZsZXhhcnIgPSBbXQotX19mbGV4YXJyID0gWzFdCi1kZWYgX19BU01OQU1FKGNuYW1lKTogcmV0dXJuIF9fQVNNTkFNRTIgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgY25hbWUpCi0KLWRlZiBfX2F0dHJpYnV0ZV9fKHh5eik6IHJldHVybgotCi1kZWYgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X2FyZ19fICh4KSkpCi0KLWRlZiBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18oeCk6IHJldHVybgotCi1fX1VTRV9MQVJHRUZJTEUgPSAxCi1fX1VTRV9MQVJHRUZJTEU2NCA9IDEKLV9fVVNFX0VYVEVSTl9JTkxJTkVTID0gMQotCi0jIEluY2x1ZGVkIGZyb20gZ251L3N0dWJzLmgKLQotIyBJbmNsdWRlZCBmcm9tIGJpdHMvZGxmY24uaAotUlRMRF9MQVpZID0gMHgwMDAwMQotUlRMRF9OT1cgPSAweDAwMDAyCi1SVExEX0JJTkRJTkdfTUFTSyA9IDB4MwotUlRMRF9OT0xPQUQgPSAweDAwMDA0Ci1SVExEX0dMT0JBTCA9IDB4MDAxMDAKLVJUTERfTE9DQUwgPSAwCi1SVExEX05PREVMRVRFID0gMHgwMTAwMApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbGludXgvSU4ucHkgYi9MaWIvcGxhdC1saW51eC9JTi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkMzAwMi4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC1saW51eC9JTi5weQorKysgL2Rldi9udWxsCkBAIC0xLDYxNSArMCwwIEBACi0jIEdlbmVyYXRlZCBieSBoMnB5IGZyb20gL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaAotX05FVElORVRfSU5fSCA9IDEKLQotIyBJbmNsdWRlZCBmcm9tIGZlYXR1cmVzLmgKLV9GRUFUVVJFU19IID0gMQotX19VU0VfQU5TSSA9IDEKLV9fRkFWT1JfQlNEID0gMQotX0lTT0M5OV9TT1VSQ0UgPSAxCi1fUE9TSVhfU09VUkNFID0gMQotX1BPU0lYX0NfU09VUkNFID0gMTk5NTA2Ci1fWE9QRU5fU09VUkNFID0gNjAwCi1fWE9QRU5fU09VUkNFX0VYVEVOREVEID0gMQotX0xBUkdFRklMRTY0X1NPVVJDRSA9IDEKLV9CU0RfU09VUkNFID0gMQotX1NWSURfU09VUkNFID0gMQotX0JTRF9TT1VSQ0UgPSAxCi1fU1ZJRF9TT1VSQ0UgPSAxCi1fX1VTRV9JU09DOTkgPSAxCi1fUE9TSVhfU09VUkNFID0gMQotX1BPU0lYX0NfU09VUkNFID0gMgotX1BPU0lYX0NfU09VUkNFID0gMTk5NTA2Ci1fX1VTRV9QT1NJWCA9IDEKLV9fVVNFX1BPU0lYMiA9IDEKLV9fVVNFX1BPU0lYMTk5MzA5ID0gMQotX19VU0VfUE9TSVgxOTk1MDYgPSAxCi1fX1VTRV9YT1BFTiA9IDEKLV9fVVNFX1hPUEVOX0VYVEVOREVEID0gMQotX19VU0VfVU5JWDk4ID0gMQotX0xBUkdFRklMRV9TT1VSQ0UgPSAxCi1fX1VTRV9YT1BFTjJLID0gMQotX19VU0VfSVNPQzk5ID0gMQotX19VU0VfWE9QRU5fRVhURU5ERUQgPSAxCi1fX1VTRV9MQVJHRUZJTEUgPSAxCi1fX1VTRV9MQVJHRUZJTEU2NCA9IDEKLV9fVVNFX0ZJTEVfT0ZGU0VUNjQgPSAxCi1fX1VTRV9NSVNDID0gMQotX19VU0VfQlNEID0gMQotX19VU0VfU1ZJRCA9IDEKLV9fVVNFX0dOVSA9IDEKLV9fVVNFX1JFRU5UUkFOVCA9IDEKLV9fU1REQ19JRUNfNTU5X18gPSAxCi1fX1NURENfSUVDXzU1OV9DT01QTEVYX18gPSAxCi1fX1NURENfSVNPXzEwNjQ2X18gPSAyMDAwMDkKLV9fR05VX0xJQlJBUllfXyA9IDYKLV9fR0xJQkNfXyA9IDIKLV9fR0xJQkNfTUlOT1JfXyA9IDIKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9jZGVmcy5oCi1fU1lTX0NERUZTX0ggPSAxCi1kZWYgX19QTVQoYXJncyk6IHJldHVybiBhcmdzCi0KLWRlZiBfX1AoYXJncyk6IHJldHVybiBhcmdzCi0KLWRlZiBfX1BNVChhcmdzKTogcmV0dXJuIGFyZ3MKLQotZGVmIF9fU1RSSU5HKHgpOiByZXR1cm4gI3gKLQotX19mbGV4YXJyID0gW10KLV9fZmxleGFyciA9IFswXQotX19mbGV4YXJyID0gW10KLV9fZmxleGFyciA9IFsxXQotZGVmIF9fQVNNTkFNRShjbmFtZSk6IHJldHVybiBfX0FTTU5BTUUyIChfX1VTRVJfTEFCRUxfUFJFRklYX18sIGNuYW1lKQotCi1kZWYgX19hdHRyaWJ1dGVfXyh4eXopOiByZXR1cm4KLQotZGVmIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyh4KTogcmV0dXJuIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9hcmdfXyAoeCkpKQotCi1kZWYgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpOiByZXR1cm4KLQotX19VU0VfTEFSR0VGSUxFID0gMQotX19VU0VfTEFSR0VGSUxFNjQgPSAxCi1fX1VTRV9FWFRFUk5fSU5MSU5FUyA9IDEKLQotIyBJbmNsdWRlZCBmcm9tIGdudS9zdHVicy5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzdGRpbnQuaAotX1NURElOVF9IID0gMQotCi0jIEluY2x1ZGVkIGZyb20gYml0cy93Y2hhci5oCi1fQklUU19XQ0hBUl9IID0gMQotX19XQ0hBUl9NSU4gPSAoLTIxNDc0ODM2NDcgLSAxKQotX19XQ0hBUl9NQVggPSAoMjE0NzQ4MzY0NykKLQotIyBJbmNsdWRlZCBmcm9tIGJpdHMvd29yZHNpemUuaAotX19XT1JEU0laRSA9IDMyCi1kZWYgX19JTlQ2NF9DKGMpOiByZXR1cm4gYyAjIyBMCi0KLWRlZiBfX1VJTlQ2NF9DKGMpOiByZXR1cm4gYyAjIyBVTAotCi1kZWYgX19JTlQ2NF9DKGMpOiByZXR1cm4gYyAjIyBMTAotCi1kZWYgX19VSU5UNjRfQyhjKTogcmV0dXJuIGMgIyMgVUxMCi0KLUlOVDhfTUlOID0gKC0xMjgpCi1JTlQxNl9NSU4gPSAoLTMyNzY3LTEpCi1JTlQzMl9NSU4gPSAoLTIxNDc0ODM2NDctMSkKLUlOVDY0X01JTiA9ICgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCi1JTlQ4X01BWCA9ICgxMjcpCi1JTlQxNl9NQVggPSAoMzI3NjcpCi1JTlQzMl9NQVggPSAoMjE0NzQ4MzY0NykKLUlOVDY0X01BWCA9IChfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCi1VSU5UOF9NQVggPSAoMjU1KQotVUlOVDE2X01BWCA9ICg2NTUzNSkKLVVJTlQ2NF9NQVggPSAoX19VSU5UNjRfQygxODQ0Njc0NDA3MzcwOTU1MTYxNSkpCi1JTlRfTEVBU1Q4X01JTiA9ICgtMTI4KQotSU5UX0xFQVNUMTZfTUlOID0gKC0zMjc2Ny0xKQotSU5UX0xFQVNUMzJfTUlOID0gKC0yMTQ3NDgzNjQ3LTEpCi1JTlRfTEVBU1Q2NF9NSU4gPSAoLV9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KS0xKQotSU5UX0xFQVNUOF9NQVggPSAoMTI3KQotSU5UX0xFQVNUMTZfTUFYID0gKDMyNzY3KQotSU5UX0xFQVNUMzJfTUFYID0gKDIxNDc0ODM2NDcpCi1JTlRfTEVBU1Q2NF9NQVggPSAoX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpKQotVUlOVF9MRUFTVDhfTUFYID0gKDI1NSkKLVVJTlRfTEVBU1QxNl9NQVggPSAoNjU1MzUpCi1VSU5UX0xFQVNUNjRfTUFYID0gKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQotSU5UX0ZBU1Q4X01JTiA9ICgtMTI4KQotSU5UX0ZBU1QxNl9NSU4gPSAoLTkyMjMzNzIwMzY4NTQ3NzU4MDctMSkKLUlOVF9GQVNUMzJfTUlOID0gKC05MjIzMzcyMDM2ODU0Nzc1ODA3LTEpCi1JTlRfRkFTVDE2X01JTiA9ICgtMjE0NzQ4MzY0Ny0xKQotSU5UX0ZBU1QzMl9NSU4gPSAoLTIxNDc0ODM2NDctMSkKLUlOVF9GQVNUNjRfTUlOID0gKC1fX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNyktMSkKLUlOVF9GQVNUOF9NQVggPSAoMTI3KQotSU5UX0ZBU1QxNl9NQVggPSAoOTIyMzM3MjAzNjg1NDc3NTgwNykKLUlOVF9GQVNUMzJfTUFYID0gKDkyMjMzNzIwMzY4NTQ3NzU4MDcpCi1JTlRfRkFTVDE2X01BWCA9ICgyMTQ3NDgzNjQ3KQotSU5UX0ZBU1QzMl9NQVggPSAoMjE0NzQ4MzY0NykKLUlOVF9GQVNUNjRfTUFYID0gKF9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKLVVJTlRfRkFTVDhfTUFYID0gKDI1NSkKLVVJTlRfRkFTVDY0X01BWCA9IChfX1VJTlQ2NF9DKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSkKLUlOVFBUUl9NSU4gPSAoLTkyMjMzNzIwMzY4NTQ3NzU4MDctMSkKLUlOVFBUUl9NQVggPSAoOTIyMzM3MjAzNjg1NDc3NTgwNykKLUlOVFBUUl9NSU4gPSAoLTIxNDc0ODM2NDctMSkKLUlOVFBUUl9NQVggPSAoMjE0NzQ4MzY0NykKLUlOVE1BWF9NSU4gPSAoLV9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KS0xKQotSU5UTUFYX01BWCA9IChfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCi1VSU5UTUFYX01BWCA9IChfX1VJTlQ2NF9DKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSkKLVBUUkRJRkZfTUlOID0gKC05MjIzMzcyMDM2ODU0Nzc1ODA3LTEpCi1QVFJESUZGX01BWCA9ICg5MjIzMzcyMDM2ODU0Nzc1ODA3KQotUFRSRElGRl9NSU4gPSAoLTIxNDc0ODM2NDctMSkKLVBUUkRJRkZfTUFYID0gKDIxNDc0ODM2NDcpCi1TSUdfQVRPTUlDX01JTiA9ICgtMjE0NzQ4MzY0Ny0xKQotU0lHX0FUT01JQ19NQVggPSAoMjE0NzQ4MzY0NykKLVdDSEFSX01JTiA9IF9fV0NIQVJfTUlOCi1XQ0hBUl9NQVggPSBfX1dDSEFSX01BWAotZGVmIElOVDhfQyhjKTogcmV0dXJuIGMKLQotZGVmIElOVDE2X0MoYyk6IHJldHVybiBjCi0KLWRlZiBJTlQzMl9DKGMpOiByZXR1cm4gYwotCi1kZWYgSU5UNjRfQyhjKTogcmV0dXJuIGMgIyMgTAotCi1kZWYgSU5UNjRfQyhjKTogcmV0dXJuIGMgIyMgTEwKLQotZGVmIFVJTlQ4X0MoYyk6IHJldHVybiBjICMjIFUKLQotZGVmIFVJTlQxNl9DKGMpOiByZXR1cm4gYyAjIyBVCi0KLWRlZiBVSU5UMzJfQyhjKTogcmV0dXJuIGMgIyMgVQotCi1kZWYgVUlOVDY0X0MoYyk6IHJldHVybiBjICMjIFVMCi0KLWRlZiBVSU5UNjRfQyhjKTogcmV0dXJuIGMgIyMgVUxMCi0KLWRlZiBJTlRNQVhfQyhjKTogcmV0dXJuIGMgIyMgTAotCi1kZWYgVUlOVE1BWF9DKGMpOiByZXR1cm4gYyAjIyBVTAotCi1kZWYgSU5UTUFYX0MoYyk6IHJldHVybiBjICMjIExMCi0KLWRlZiBVSU5UTUFYX0MoYyk6IHJldHVybiBjICMjIFVMTAotCi0KLSMgSW5jbHVkZWQgZnJvbSBiaXRzL3R5cGVzLmgKLV9CSVRTX1RZUEVTX0ggPSAxCi1fX0ZEX1NFVFNJWkUgPSAxMDI0Ci0KLSMgSW5jbHVkZWQgZnJvbSBiaXRzL3B0aHJlYWR0eXBlcy5oCi1fQklUU19QVEhSRUFEVFlQRVNfSCA9IDEKLQotIyBJbmNsdWRlZCBmcm9tIGJpdHMvc2NoZWQuaAotU0NIRURfT1RIRVIgPSAwCi1TQ0hFRF9GSUZPID0gMQotU0NIRURfUlIgPSAyCi1DU0lHTkFMID0gMHgwMDAwMDBmZgotQ0xPTkVfVk0gPSAweDAwMDAwMTAwCi1DTE9ORV9GUyA9IDB4MDAwMDAyMDAKLUNMT05FX0ZJTEVTID0gMHgwMDAwMDQwMAotQ0xPTkVfU0lHSEFORCA9IDB4MDAwMDA4MDAKLUNMT05FX1BJRCA9IDB4MDAwMDEwMDAKLUNMT05FX1BUUkFDRSA9IDB4MDAwMDIwMDAKLUNMT05FX1ZGT1JLID0gMHgwMDAwNDAwMAotX19kZWZpbmVkX3NjaGVkcGFyYW0gPSAxCi1kZWYgSU5fQ0xBU1NBKGEpOiByZXR1cm4gKCgoKGluX2FkZHJfdCkoYSkpICYgKC0yMTQ3NDgzNjQ4KSkgPT0gMCkKLQotSU5fQ0xBU1NBX05FVCA9ICgtMTY3NzcyMTYpCi1JTl9DTEFTU0FfTlNISUZUID0gMjQKLUlOX0NMQVNTQV9IT1NUID0gKCgtMSkgJiB+SU5fQ0xBU1NBX05FVCkKLUlOX0NMQVNTQV9NQVggPSAxMjgKLWRlZiBJTl9DTEFTU0IoYSk6IHJldHVybiAoKCgoaW5fYWRkcl90KShhKSkgJiAoLTEwNzM3NDE4MjQpKSA9PSAoLTIxNDc0ODM2NDgpKQotCi1JTl9DTEFTU0JfTkVUID0gKC02NTUzNikKLUlOX0NMQVNTQl9OU0hJRlQgPSAxNgotSU5fQ0xBU1NCX0hPU1QgPSAoKC0xKSAmIH5JTl9DTEFTU0JfTkVUKQotSU5fQ0xBU1NCX01BWCA9IDY1NTM2Ci1kZWYgSU5fQ0xBU1NDKGEpOiByZXR1cm4gKCgoKGluX2FkZHJfdCkoYSkpICYgKC01MzY4NzA5MTIpKSA9PSAoLTEwNzM3NDE4MjQpKQotCi1JTl9DTEFTU0NfTkVUID0gKC0yNTYpCi1JTl9DTEFTU0NfTlNISUZUID0gOAotSU5fQ0xBU1NDX0hPU1QgPSAoKC0xKSAmIH5JTl9DTEFTU0NfTkVUKQotZGVmIElOX0NMQVNTRChhKTogcmV0dXJuICgoKChpbl9hZGRyX3QpKGEpKSAmICgtMjY4NDM1NDU2KSkgPT0gKC01MzY4NzA5MTIpKQotCi1kZWYgSU5fTVVMVElDQVNUKGEpOiByZXR1cm4gSU5fQ0xBU1NEKGEpCi0KLWRlZiBJTl9FWFBFUklNRU5UQUwoYSk6IHJldHVybiAoKCgoaW5fYWRkcl90KShhKSkgJiAoLTUzNjg3MDkxMikpID09ICgtNTM2ODcwOTEyKSkKLQotZGVmIElOX0JBRENMQVNTKGEpOiByZXR1cm4gKCgoKGluX2FkZHJfdCkoYSkpICYgKC0yNjg0MzU0NTYpKSA9PSAoLTI2ODQzNTQ1NikpCi0KLUlOX0xPT1BCQUNLTkVUID0gMTI3Ci1JTkVUX0FERFJTVFJMRU4gPSAxNgotSU5FVDZfQUREUlNUUkxFTiA9IDQ2Ci0KLSMgSW5jbHVkZWQgZnJvbSBiaXRzL3NvY2tldC5oCi0KLSMgSW5jbHVkZWQgZnJvbSBsaW1pdHMuaAotX0xJQkNfTElNSVRTX0hfID0gMQotTUJfTEVOX01BWCA9IDE2Ci1fTElNSVRTX0ggPSAxCi1DSEFSX0JJVCA9IDgKLVNDSEFSX01JTiA9ICgtMTI4KQotU0NIQVJfTUFYID0gMTI3Ci1VQ0hBUl9NQVggPSAyNTUKLUNIQVJfTUlOID0gMAotQ0hBUl9NQVggPSBVQ0hBUl9NQVgKLUNIQVJfTUlOID0gU0NIQVJfTUlOCi1DSEFSX01BWCA9IFNDSEFSX01BWAotU0hSVF9NSU4gPSAoLTMyNzY4KQotU0hSVF9NQVggPSAzMjc2NwotVVNIUlRfTUFYID0gNjU1MzUKLUlOVF9NQVggPSAyMTQ3NDgzNjQ3Ci1MT05HX01BWCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKLUxPTkdfTUFYID0gMjE0NzQ4MzY0NwotTE9OR19NSU4gPSAoLUxPTkdfTUFYIC0gMSkKLQotIyBJbmNsdWRlZCBmcm9tIGJpdHMvcG9zaXgxX2xpbS5oCi1fQklUU19QT1NJWDFfTElNX0ggPSAxCi1fUE9TSVhfQUlPX0xJU1RJT19NQVggPSAyCi1fUE9TSVhfQUlPX01BWCA9IDEKLV9QT1NJWF9BUkdfTUFYID0gNDA5NgotX1BPU0lYX0NISUxEX01BWCA9IDYKLV9QT1NJWF9ERUxBWVRJTUVSX01BWCA9IDMyCi1fUE9TSVhfTElOS19NQVggPSA4Ci1fUE9TSVhfTUFYX0NBTk9OID0gMjU1Ci1fUE9TSVhfTUFYX0lOUFVUID0gMjU1Ci1fUE9TSVhfTVFfT1BFTl9NQVggPSA4Ci1fUE9TSVhfTVFfUFJJT19NQVggPSAzMgotX1BPU0lYX05HUk9VUFNfTUFYID0gMAotX1BPU0lYX09QRU5fTUFYID0gMTYKLV9QT1NJWF9GRF9TRVRTSVpFID0gX1BPU0lYX09QRU5fTUFYCi1fUE9TSVhfTkFNRV9NQVggPSAxNAotX1BPU0lYX1BBVEhfTUFYID0gMjU2Ci1fUE9TSVhfUElQRV9CVUYgPSA1MTIKLV9QT1NJWF9SVFNJR19NQVggPSA4Ci1fUE9TSVhfU0VNX05TRU1TX01BWCA9IDI1NgotX1BPU0lYX1NFTV9WQUxVRV9NQVggPSAzMjc2NwotX1BPU0lYX1NJR1FVRVVFX01BWCA9IDMyCi1fUE9TSVhfU1NJWkVfTUFYID0gMzI3NjcKLV9QT1NJWF9TVFJFQU1fTUFYID0gOAotX1BPU0lYX1RaTkFNRV9NQVggPSA2Ci1fUE9TSVhfUUxJTUlUID0gMQotX1BPU0lYX0hJV0FUID0gX1BPU0lYX1BJUEVfQlVGCi1fUE9TSVhfVUlPX01BWElPViA9IDE2Ci1fUE9TSVhfVFRZX05BTUVfTUFYID0gOQotX1BPU0lYX1RJTUVSX01BWCA9IDMyCi1fUE9TSVhfTE9HSU5fTkFNRV9NQVggPSA5Ci1fUE9TSVhfQ0xPQ0tSRVNfTUlOID0gMjAwMDAwMDAKLQotIyBJbmNsdWRlZCBmcm9tIGJpdHMvbG9jYWxfbGltLmgKLQotIyBJbmNsdWRlZCBmcm9tIGxpbnV4L2xpbWl0cy5oCi1OUl9PUEVOID0gMTAyNAotTkdST1VQU19NQVggPSAzMgotQVJHX01BWCA9IDEzMTA3MgotQ0hJTERfTUFYID0gOTk5Ci1PUEVOX01BWCA9IDI1NgotTElOS19NQVggPSAxMjcKLU1BWF9DQU5PTiA9IDI1NQotTUFYX0lOUFVUID0gMjU1Ci1OQU1FX01BWCA9IDI1NQotUEFUSF9NQVggPSA0MDk2Ci1QSVBFX0JVRiA9IDQwOTYKLVJUU0lHX01BWCA9IDMyCi1fUE9TSVhfVEhSRUFEX0tFWVNfTUFYID0gMTI4Ci1QVEhSRUFEX0tFWVNfTUFYID0gMTAyNAotX1BPU0lYX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMgPSA0Ci1QVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUyA9IF9QT1NJWF9USFJFQURfREVTVFJVQ1RPUl9JVEVSQVRJT05TCi1fUE9TSVhfVEhSRUFEX1RIUkVBRFNfTUFYID0gNjQKLVBUSFJFQURfVEhSRUFEU19NQVggPSAxMDI0Ci1BSU9fUFJJT19ERUxUQV9NQVggPSAyMAotUFRIUkVBRF9TVEFDS19NSU4gPSAxNjM4NAotVElNRVJfTUFYID0gMjU2Ci1TU0laRV9NQVggPSBMT05HX01BWAotTkdST1VQU19NQVggPSBfUE9TSVhfTkdST1VQU19NQVgKLQotIyBJbmNsdWRlZCBmcm9tIGJpdHMvcG9zaXgyX2xpbS5oCi1fQklUU19QT1NJWDJfTElNX0ggPSAxCi1fUE9TSVgyX0JDX0JBU0VfTUFYID0gOTkKLV9QT1NJWDJfQkNfRElNX01BWCA9IDIwNDgKLV9QT1NJWDJfQkNfU0NBTEVfTUFYID0gOTkKLV9QT1NJWDJfQkNfU1RSSU5HX01BWCA9IDEwMDAKLV9QT1NJWDJfQ09MTF9XRUlHSFRTX01BWCA9IDIKLV9QT1NJWDJfRVhQUl9ORVNUX01BWCA9IDMyCi1fUE9TSVgyX0xJTkVfTUFYID0gMjA0OAotX1BPU0lYMl9SRV9EVVBfTUFYID0gMjU1Ci1fUE9TSVgyX0NIQVJDTEFTU19OQU1FX01BWCA9IDE0Ci1CQ19CQVNFX01BWCA9IF9QT1NJWDJfQkNfQkFTRV9NQVgKLUJDX0RJTV9NQVggPSBfUE9TSVgyX0JDX0RJTV9NQVgKLUJDX1NDQUxFX01BWCA9IF9QT1NJWDJfQkNfU0NBTEVfTUFYCi1CQ19TVFJJTkdfTUFYID0gX1BPU0lYMl9CQ19TVFJJTkdfTUFYCi1DT0xMX1dFSUdIVFNfTUFYID0gMjU1Ci1FWFBSX05FU1RfTUFYID0gX1BPU0lYMl9FWFBSX05FU1RfTUFYCi1MSU5FX01BWCA9IF9QT1NJWDJfTElORV9NQVgKLUNIQVJDTEFTU19OQU1FX01BWCA9IDIwNDgKLVJFX0RVUF9NQVggPSAoMHg3ZmZmKQotCi0jIEluY2x1ZGVkIGZyb20gYml0cy94b3Blbl9saW0uaAotX1hPUEVOX0xJTV9IID0gMQotCi0jIEluY2x1ZGVkIGZyb20gYml0cy9zdGRpb19saW0uaAotTF90bXBuYW0gPSAyMAotVE1QX01BWCA9IDIzODMyOAotRklMRU5BTUVfTUFYID0gNDA5NgotTF9jdGVybWlkID0gOQotTF9jdXNlcmlkID0gOQotRk9QRU5fTUFYID0gMTYKLUlPVl9NQVggPSAxMDI0Ci1fWE9QRU5fSU9WX01BWCA9IF9QT1NJWF9VSU9fTUFYSU9WCi1OTF9BUkdNQVggPSBfUE9TSVhfQVJHX01BWAotTkxfTEFOR01BWCA9IF9QT1NJWDJfTElORV9NQVgKLU5MX01TR01BWCA9IElOVF9NQVgKLU5MX05NQVggPSBJTlRfTUFYCi1OTF9TRVRNQVggPSBJTlRfTUFYCi1OTF9URVhUTUFYID0gSU5UX01BWAotTlpFUk8gPSAyMAotV09SRF9CSVQgPSAxNgotV09SRF9CSVQgPSAzMgotV09SRF9CSVQgPSA2NAotV09SRF9CSVQgPSAxNgotV09SRF9CSVQgPSAzMgotV09SRF9CSVQgPSA2NAotV09SRF9CSVQgPSAzMgotTE9OR19CSVQgPSAzMgotTE9OR19CSVQgPSA2NAotTE9OR19CSVQgPSAzMgotTE9OR19CSVQgPSA2NAotTE9OR19CSVQgPSA2NAotTE9OR19CSVQgPSAzMgotZnJvbSBUWVBFUyBpbXBvcnQgKgotUEZfVU5TUEVDID0gMAotUEZfTE9DQUwgPSAxCi1QRl9VTklYID0gUEZfTE9DQUwKLVBGX0ZJTEUgPSBQRl9MT0NBTAotUEZfSU5FVCA9IDIKLVBGX0FYMjUgPSAzCi1QRl9JUFggPSA0Ci1QRl9BUFBMRVRBTEsgPSA1Ci1QRl9ORVRST00gPSA2Ci1QRl9CUklER0UgPSA3Ci1QRl9BVE1QVkMgPSA4Ci1QRl9YMjUgPSA5Ci1QRl9JTkVUNiA9IDEwCi1QRl9ST1NFID0gMTEKLVBGX0RFQ25ldCA9IDEyCi1QRl9ORVRCRVVJID0gMTMKLVBGX1NFQ1VSSVRZID0gMTQKLVBGX0tFWSA9IDE1Ci1QRl9ORVRMSU5LID0gMTYKLVBGX1JPVVRFID0gUEZfTkVUTElOSwotUEZfUEFDS0VUID0gMTcKLVBGX0FTSCA9IDE4Ci1QRl9FQ09ORVQgPSAxOQotUEZfQVRNU1ZDID0gMjAKLVBGX1NOQSA9IDIyCi1QRl9JUkRBID0gMjMKLVBGX1BQUE9YID0gMjQKLVBGX1dBTlBJUEUgPSAyNQotUEZfQkxVRVRPT1RIID0gMzEKLVBGX01BWCA9IDMyCi1BRl9VTlNQRUMgPSBQRl9VTlNQRUMKLUFGX0xPQ0FMID0gUEZfTE9DQUwKLUFGX1VOSVggPSBQRl9VTklYCi1BRl9GSUxFID0gUEZfRklMRQotQUZfSU5FVCA9IFBGX0lORVQKLUFGX0FYMjUgPSBQRl9BWDI1Ci1BRl9JUFggPSBQRl9JUFgKLUFGX0FQUExFVEFMSyA9IFBGX0FQUExFVEFMSwotQUZfTkVUUk9NID0gUEZfTkVUUk9NCi1BRl9CUklER0UgPSBQRl9CUklER0UKLUFGX0FUTVBWQyA9IFBGX0FUTVBWQwotQUZfWDI1ID0gUEZfWDI1Ci1BRl9JTkVUNiA9IFBGX0lORVQ2Ci1BRl9ST1NFID0gUEZfUk9TRQotQUZfREVDbmV0ID0gUEZfREVDbmV0Ci1BRl9ORVRCRVVJID0gUEZfTkVUQkVVSQotQUZfU0VDVVJJVFkgPSBQRl9TRUNVUklUWQotQUZfS0VZID0gUEZfS0VZCi1BRl9ORVRMSU5LID0gUEZfTkVUTElOSwotQUZfUk9VVEUgPSBQRl9ST1VURQotQUZfUEFDS0VUID0gUEZfUEFDS0VUCi1BRl9BU0ggPSBQRl9BU0gKLUFGX0VDT05FVCA9IFBGX0VDT05FVAotQUZfQVRNU1ZDID0gUEZfQVRNU1ZDCi1BRl9TTkEgPSBQRl9TTkEKLUFGX0lSREEgPSBQRl9JUkRBCi1BRl9QUFBPWCA9IFBGX1BQUE9YCi1BRl9XQU5QSVBFID0gUEZfV0FOUElQRQotQUZfQkxVRVRPT1RIID0gUEZfQkxVRVRPT1RICi1BRl9NQVggPSBQRl9NQVgKLVNPTF9SQVcgPSAyNTUKLVNPTF9ERUNORVQgPSAyNjEKLVNPTF9YMjUgPSAyNjIKLVNPTF9QQUNLRVQgPSAyNjMKLVNPTF9BVE0gPSAyNjQKLVNPTF9BQUwgPSAyNjUKLVNPTF9JUkRBID0gMjY2Ci1TT01BWENPTk4gPSAxMjgKLQotIyBJbmNsdWRlZCBmcm9tIGJpdHMvc29ja2FkZHIuaAotX0JJVFNfU09DS0FERFJfSCA9IDEKLWRlZiBfX1NPQ0tBRERSX0NPTU1PTihzYV9wcmVmaXgpOiByZXR1cm4gXAotCi1fU1NfU0laRSA9IDEyOAotZGVmIENNU0dfRklSU1RIRFIobWhkcik6IHJldHVybiBcCi0KLQotIyBJbmNsdWRlZCBmcm9tIGFzbS9zb2NrZXQuaAotCi0jIEluY2x1ZGVkIGZyb20gYXNtL3NvY2tpb3MuaAotRklPU0VUT1dOID0gMHg4OTAxCi1TSU9DU1BHUlAgPSAweDg5MDIKLUZJT0dFVE9XTiA9IDB4ODkwMwotU0lPQ0dQR1JQID0gMHg4OTA0Ci1TSU9DQVRNQVJLID0gMHg4OTA1Ci1TSU9DR1NUQU1QID0gMHg4OTA2Ci1TT0xfU09DS0VUID0gMQotU09fREVCVUcgPSAxCi1TT19SRVVTRUFERFIgPSAyCi1TT19UWVBFID0gMwotU09fRVJST1IgPSA0Ci1TT19ET05UUk9VVEUgPSA1Ci1TT19CUk9BRENBU1QgPSA2Ci1TT19TTkRCVUYgPSA3Ci1TT19SQ1ZCVUYgPSA4Ci1TT19LRUVQQUxJVkUgPSA5Ci1TT19PT0JJTkxJTkUgPSAxMAotU09fTk9fQ0hFQ0sgPSAxMQotU09fUFJJT1JJVFkgPSAxMgotU09fTElOR0VSID0gMTMKLVNPX0JTRENPTVBBVCA9IDE0Ci1TT19QQVNTQ1JFRCA9IDE2Ci1TT19QRUVSQ1JFRCA9IDE3Ci1TT19SQ1ZMT1dBVCA9IDE4Ci1TT19TTkRMT1dBVCA9IDE5Ci1TT19SQ1ZUSU1FTyA9IDIwCi1TT19TTkRUSU1FTyA9IDIxCi1TT19TRUNVUklUWV9BVVRIRU5USUNBVElPTiA9IDIyCi1TT19TRUNVUklUWV9FTkNSWVBUSU9OX1RSQU5TUE9SVCA9IDIzCi1TT19TRUNVUklUWV9FTkNSWVBUSU9OX05FVFdPUksgPSAyNAotU09fQklORFRPREVWSUNFID0gMjUKLVNPX0FUVEFDSF9GSUxURVIgPSAyNgotU09fREVUQUNIX0ZJTFRFUiA9IDI3Ci1TT19QRUVSTkFNRSA9IDI4Ci1TT19USU1FU1RBTVAgPSAyOQotU0NNX1RJTUVTVEFNUCA9IFNPX1RJTUVTVEFNUAotU09fQUNDRVBUQ09OTiA9IDMwCi1TT0NLX1NUUkVBTSA9IDEKLVNPQ0tfREdSQU0gPSAyCi1TT0NLX1JBVyA9IDMKLVNPQ0tfUkRNID0gNAotU09DS19TRVFQQUNLRVQgPSA1Ci1TT0NLX1BBQ0tFVCA9IDEwCi1TT0NLX01BWCA9IChTT0NLX1BBQ0tFVCsxKQotCi0jIEluY2x1ZGVkIGZyb20gYml0cy9pbi5oCi1JUF9UT1MgPSAxCi1JUF9UVEwgPSAyCi1JUF9IRFJJTkNMID0gMwotSVBfT1BUSU9OUyA9IDQKLUlQX1JPVVRFUl9BTEVSVCA9IDUKLUlQX1JFQ1ZPUFRTID0gNgotSVBfUkVUT1BUUyA9IDcKLUlQX1BLVElORk8gPSA4Ci1JUF9QS1RPUFRJT05TID0gOQotSVBfUE1UVURJU0MgPSAxMAotSVBfTVRVX0RJU0NPVkVSID0gMTAKLUlQX1JFQ1ZFUlIgPSAxMQotSVBfUkVDVlRUTCA9IDEyCi1JUF9SRUNWVE9TID0gMTMKLUlQX01VTFRJQ0FTVF9JRiA9IDMyCi1JUF9NVUxUSUNBU1RfVFRMID0gMzMKLUlQX01VTFRJQ0FTVF9MT09QID0gMzQKLUlQX0FERF9NRU1CRVJTSElQID0gMzUKLUlQX0RST1BfTUVNQkVSU0hJUCA9IDM2Ci1JUF9SRUNWUkVUT1BUUyA9IElQX1JFVE9QVFMKLUlQX1BNVFVESVNDX0RPTlQgPSAwCi1JUF9QTVRVRElTQ19XQU5UID0gMQotSVBfUE1UVURJU0NfRE8gPSAyCi1TT0xfSVAgPSAwCi1JUF9ERUZBVUxUX01VTFRJQ0FTVF9UVEwgPSAxCi1JUF9ERUZBVUxUX01VTFRJQ0FTVF9MT09QID0gMQotSVBfTUFYX01FTUJFUlNISVBTID0gMjAKLUlQVjZfQUREUkZPUk0gPSAxCi1JUFY2X1BLVElORk8gPSAyCi1JUFY2X0hPUE9QVFMgPSAzCi1JUFY2X0RTVE9QVFMgPSA0Ci1JUFY2X1JUSERSID0gNQotSVBWNl9QS1RPUFRJT05TID0gNgotSVBWNl9DSEVDS1NVTSA9IDcKLUlQVjZfSE9QTElNSVQgPSA4Ci1JUFY2X05FWFRIT1AgPSA5Ci1JUFY2X0FVVEhIRFIgPSAxMAotSVBWNl9VTklDQVNUX0hPUFMgPSAxNgotSVBWNl9NVUxUSUNBU1RfSUYgPSAxNwotSVBWNl9NVUxUSUNBU1RfSE9QUyA9IDE4Ci1JUFY2X01VTFRJQ0FTVF9MT09QID0gMTkKLUlQVjZfSk9JTl9HUk9VUCA9IDIwCi1JUFY2X0xFQVZFX0dST1VQID0gMjEKLUlQVjZfUk9VVEVSX0FMRVJUID0gMjIKLUlQVjZfTVRVX0RJU0NPVkVSID0gMjMKLUlQVjZfTVRVID0gMjQKLUlQVjZfUkVDVkVSUiA9IDI1Ci1JUFY2X1JYSE9QT1BUUyA9IElQVjZfSE9QT1BUUwotSVBWNl9SWERTVE9QVFMgPSBJUFY2X0RTVE9QVFMKLUlQVjZfQUREX01FTUJFUlNISVAgPSBJUFY2X0pPSU5fR1JPVVAKLUlQVjZfRFJPUF9NRU1CRVJTSElQID0gSVBWNl9MRUFWRV9HUk9VUAotSVBWNl9QTVRVRElTQ19ET05UID0gMAotSVBWNl9QTVRVRElTQ19XQU5UID0gMQotSVBWNl9QTVRVRElTQ19ETyA9IDIKLVNPTF9JUFY2ID0gNDEKLVNPTF9JQ01QVjYgPSA1OAotSVBWNl9SVEhEUl9MT09TRSA9IDAKLUlQVjZfUlRIRFJfU1RSSUNUID0gMQotSVBWNl9SVEhEUl9UWVBFXzAgPSAwCi0KLSMgSW5jbHVkZWQgZnJvbSBlbmRpYW4uaAotX0VORElBTl9IID0gMQotX19MSVRUTEVfRU5ESUFOID0gMTIzNAotX19CSUdfRU5ESUFOID0gNDMyMQotX19QRFBfRU5ESUFOID0gMzQxMgotCi0jIEluY2x1ZGVkIGZyb20gYml0cy9lbmRpYW4uaAotX19CWVRFX09SREVSID0gX19MSVRUTEVfRU5ESUFOCi1fX0ZMT0FUX1dPUkRfT1JERVIgPSBfX0JZVEVfT1JERVIKLUxJVFRMRV9FTkRJQU4gPSBfX0xJVFRMRV9FTkRJQU4KLUJJR19FTkRJQU4gPSBfX0JJR19FTkRJQU4KLVBEUF9FTkRJQU4gPSBfX1BEUF9FTkRJQU4KLUJZVEVfT1JERVIgPSBfX0JZVEVfT1JERVIKLQotIyBJbmNsdWRlZCBmcm9tIGJpdHMvYnl0ZXN3YXAuaAotX0JJVFNfQllURVNXQVBfSCA9IDEKLWRlZiBfX2Jzd2FwX2NvbnN0YW50XzE2KHgpOiByZXR1cm4gXAotCi1kZWYgX19ic3dhcF8xNih4KTogcmV0dXJuIFwKLQotZGVmIF9fYnN3YXBfMTYoeCk6IHJldHVybiBfX2Jzd2FwX2NvbnN0YW50XzE2ICh4KQotCi1kZWYgX19ic3dhcF9jb25zdGFudF8zMih4KTogcmV0dXJuIFwKLQotZGVmIF9fYnN3YXBfMzIoeCk6IHJldHVybiBcCi0KLWRlZiBfX2Jzd2FwXzMyKHgpOiByZXR1cm4gXAotCi1kZWYgX19ic3dhcF8zMih4KTogcmV0dXJuIF9fYnN3YXBfY29uc3RhbnRfMzIgKHgpCi0KLWRlZiBfX2Jzd2FwX2NvbnN0YW50XzY0KHgpOiByZXR1cm4gXAotCi1kZWYgX19ic3dhcF82NCh4KTogcmV0dXJuIFwKLQotZGVmIG50b2hsKHgpOiByZXR1cm4gKHgpCi0KLWRlZiBudG9ocyh4KTogcmV0dXJuICh4KQotCi1kZWYgaHRvbmwoeCk6IHJldHVybiAoeCkKLQotZGVmIGh0b25zKHgpOiByZXR1cm4gKHgpCi0KLWRlZiBudG9obCh4KTogcmV0dXJuIF9fYnN3YXBfMzIgKHgpCi0KLWRlZiBudG9ocyh4KTogcmV0dXJuIF9fYnN3YXBfMTYgKHgpCi0KLWRlZiBodG9ubCh4KTogcmV0dXJuIF9fYnN3YXBfMzIgKHgpCi0KLWRlZiBodG9ucyh4KTogcmV0dXJuIF9fYnN3YXBfMTYgKHgpCi0KLWRlZiBJTjZfSVNfQUREUl9VTlNQRUNJRklFRChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX0xPT1BCQUNLKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTElOS0xPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfU0lURUxPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfVjRNQVBQRUQoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9WNENPTVBBVChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX05PREVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0xJTktMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX1NJVEVMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX09SR0xPQ0FMKGEpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfR0xPQkFMKGEpOiByZXR1cm4KZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWxpbnV4L1RZUEVTLnB5IGIvTGliL3BsYXQtbGludXgvVFlQRVMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YTMyNGIuLjAwMDAwMDAKLS0tIGEvTGliL3BsYXQtbGludXgvVFlQRVMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotIyBHZW5lcmF0ZWQgYnkgaDJweSBmcm9tIC91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaAotX1NZU19UWVBFU19IID0gMQotCi0jIEluY2x1ZGVkIGZyb20gZmVhdHVyZXMuaAotX0ZFQVRVUkVTX0ggPSAxCi1fX1VTRV9BTlNJID0gMQotX19GQVZPUl9CU0QgPSAxCi1fSVNPQzk5X1NPVVJDRSA9IDEKLV9QT1NJWF9TT1VSQ0UgPSAxCi1fUE9TSVhfQ19TT1VSQ0UgPSAxOTk1MDYKLV9YT1BFTl9TT1VSQ0UgPSA2MDAKLV9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgPSAxCi1fTEFSR0VGSUxFNjRfU09VUkNFID0gMQotX0JTRF9TT1VSQ0UgPSAxCi1fU1ZJRF9TT1VSQ0UgPSAxCi1fQlNEX1NPVVJDRSA9IDEKLV9TVklEX1NPVVJDRSA9IDEKLV9fVVNFX0lTT0M5OSA9IDEKLV9QT1NJWF9TT1VSQ0UgPSAxCi1fUE9TSVhfQ19TT1VSQ0UgPSAyCi1fUE9TSVhfQ19TT1VSQ0UgPSAxOTk1MDYKLV9fVVNFX1BPU0lYID0gMQotX19VU0VfUE9TSVgyID0gMQotX19VU0VfUE9TSVgxOTkzMDkgPSAxCi1fX1VTRV9QT1NJWDE5OTUwNiA9IDEKLV9fVVNFX1hPUEVOID0gMQotX19VU0VfWE9QRU5fRVhURU5ERUQgPSAxCi1fX1VTRV9VTklYOTggPSAxCi1fTEFSR0VGSUxFX1NPVVJDRSA9IDEKLV9fVVNFX1hPUEVOMksgPSAxCi1fX1VTRV9JU09DOTkgPSAxCi1fX1VTRV9YT1BFTl9FWFRFTkRFRCA9IDEKLV9fVVNFX0xBUkdFRklMRSA9IDEKLV9fVVNFX0xBUkdFRklMRTY0ID0gMQotX19VU0VfRklMRV9PRkZTRVQ2NCA9IDEKLV9fVVNFX01JU0MgPSAxCi1fX1VTRV9CU0QgPSAxCi1fX1VTRV9TVklEID0gMQotX19VU0VfR05VID0gMQotX19VU0VfUkVFTlRSQU5UID0gMQotX19TVERDX0lFQ181NTlfXyA9IDEKLV9fU1REQ19JRUNfNTU5X0NPTVBMRVhfXyA9IDEKLV9fU1REQ19JU09fMTA2NDZfXyA9IDIwMDAwOQotX19HTlVfTElCUkFSWV9fID0gNgotX19HTElCQ19fID0gMgotX19HTElCQ19NSU5PUl9fID0gMgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2NkZWZzLmgKLV9TWVNfQ0RFRlNfSCA9IDEKLWRlZiBfX1BNVChhcmdzKTogcmV0dXJuIGFyZ3MKLQotZGVmIF9fUChhcmdzKTogcmV0dXJuIGFyZ3MKLQotZGVmIF9fUE1UKGFyZ3MpOiByZXR1cm4gYXJncwotCi1kZWYgX19TVFJJTkcoeCk6IHJldHVybiAjeAotCi1fX2ZsZXhhcnIgPSBbXQotX19mbGV4YXJyID0gWzBdCi1fX2ZsZXhhcnIgPSBbXQotX19mbGV4YXJyID0gWzFdCi1kZWYgX19BU01OQU1FKGNuYW1lKTogcmV0dXJuIF9fQVNNTkFNRTIgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgY25hbWUpCi0KLWRlZiBfX2F0dHJpYnV0ZV9fKHh5eik6IHJldHVybgotCi1kZWYgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X2FyZ19fICh4KSkpCi0KLWRlZiBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18oeCk6IHJldHVybgotCi1fX1VTRV9MQVJHRUZJTEUgPSAxCi1fX1VTRV9MQVJHRUZJTEU2NCA9IDEKLV9fVVNFX0VYVEVSTl9JTkxJTkVTID0gMQotCi0jIEluY2x1ZGVkIGZyb20gZ251L3N0dWJzLmgKLQotIyBJbmNsdWRlZCBmcm9tIGJpdHMvdHlwZXMuaAotX0JJVFNfVFlQRVNfSCA9IDEKLV9fRkRfU0VUU0laRSA9IDEwMjQKLQotIyBJbmNsdWRlZCBmcm9tIGJpdHMvcHRocmVhZHR5cGVzLmgKLV9CSVRTX1BUSFJFQURUWVBFU19IID0gMQotCi0jIEluY2x1ZGVkIGZyb20gYml0cy9zY2hlZC5oCi1TQ0hFRF9PVEhFUiA9IDAKLVNDSEVEX0ZJRk8gPSAxCi1TQ0hFRF9SUiA9IDIKLUNTSUdOQUwgPSAweDAwMDAwMGZmCi1DTE9ORV9WTSA9IDB4MDAwMDAxMDAKLUNMT05FX0ZTID0gMHgwMDAwMDIwMAotQ0xPTkVfRklMRVMgPSAweDAwMDAwNDAwCi1DTE9ORV9TSUdIQU5EID0gMHgwMDAwMDgwMAotQ0xPTkVfUElEID0gMHgwMDAwMTAwMAotQ0xPTkVfUFRSQUNFID0gMHgwMDAwMjAwMAotQ0xPTkVfVkZPUksgPSAweDAwMDA0MDAwCi1fX2RlZmluZWRfc2NoZWRwYXJhbSA9IDEKLQotIyBJbmNsdWRlZCBmcm9tIHRpbWUuaAotX1RJTUVfSCA9IDEKLQotIyBJbmNsdWRlZCBmcm9tIGJpdHMvdGltZS5oCi1fQklUU19USU1FX0ggPSAxCi1DTE9DS1NfUEVSX1NFQyA9IDEwMDAwMDAKLUNMT0NLX1JFQUxUSU1FID0gMAotQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEID0gMgotQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQgPSAzCi1USU1FUl9BQlNUSU1FID0gMQotX1NUUlVDVF9USU1FVkFMID0gMQotQ0xLX1RDSyA9IENMT0NLU19QRVJfU0VDCi1fX2Nsb2NrX3RfZGVmaW5lZCA9IDEKLV9fdGltZV90X2RlZmluZWQgPSAxCi1fX2Nsb2NraWRfdF9kZWZpbmVkID0gMQotX190aW1lcl90X2RlZmluZWQgPSAxCi1fX3RpbWVzcGVjX2RlZmluZWQgPSAxCi1kZWYgX19pc2xlYXAoeWVhcik6IHJldHVybiBcCi0KLV9fQklUX1RZUEVTX0RFRklORURfXyA9IDEKLQotIyBJbmNsdWRlZCBmcm9tIGVuZGlhbi5oCi1fRU5ESUFOX0ggPSAxCi1fX0xJVFRMRV9FTkRJQU4gPSAxMjM0Ci1fX0JJR19FTkRJQU4gPSA0MzIxCi1fX1BEUF9FTkRJQU4gPSAzNDEyCi0KLSMgSW5jbHVkZWQgZnJvbSBiaXRzL2VuZGlhbi5oCi1fX0JZVEVfT1JERVIgPSBfX0xJVFRMRV9FTkRJQU4KLV9fRkxPQVRfV09SRF9PUkRFUiA9IF9fQllURV9PUkRFUgotTElUVExFX0VORElBTiA9IF9fTElUVExFX0VORElBTgotQklHX0VORElBTiA9IF9fQklHX0VORElBTgotUERQX0VORElBTiA9IF9fUERQX0VORElBTgotQllURV9PUkRFUiA9IF9fQllURV9PUkRFUgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3NlbGVjdC5oCi1fU1lTX1NFTEVDVF9IID0gMQotCi0jIEluY2x1ZGVkIGZyb20gYml0cy9zZWxlY3QuaAotZGVmIF9fRkRfWkVSTyhmZHNwKTogcmV0dXJuIFwKLQotZGVmIF9fRkRfWkVSTyhzZXQpOiByZXR1cm4gXAotCi0KLSMgSW5jbHVkZWQgZnJvbSBiaXRzL3NpZ3NldC5oCi1fU0lHU0VUX0hfdHlwZXMgPSAxCi1fU0lHU0VUX0hfZm5zID0gMQotZGVmIF9fc2lnbWFzayhzaWcpOiByZXR1cm4gXAotCi1kZWYgX19zaWdlbXB0eXNldChzZXQpOiByZXR1cm4gXAotCi1kZWYgX19zaWdmaWxsc2V0KHNldCk6IHJldHVybiBcCi0KLWRlZiBfX3NpZ2lzZW1wdHlzZXQoc2V0KTogcmV0dXJuIFwKLQotZGVmIF9fRkRFTFQoZCk6IHJldHVybiAoKGQpIC8gX19ORkRCSVRTKQotCi1GRF9TRVRTSVpFID0gX19GRF9TRVRTSVpFCi1kZWYgRkRfWkVSTyhmZHNldHApOiByZXR1cm4gX19GRF9aRVJPIChmZHNldHApCi0KLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9zeXNtYWNyb3MuaAotX1NZU19TWVNNQUNST1NfSCA9IDEKLWRlZiBtYWpvcihkZXYpOiByZXR1cm4gKChpbnQpKCgoZGV2KSA+PiA4KSAmIDB4ZmYpKQotCi1kZWYgbWlub3IoZGV2KTogcmV0dXJuICgoaW50KSgoZGV2KSAmIDB4ZmYpKQotCi1kZWYgbWFqb3IoZGV2KTogcmV0dXJuICgoKGRldikuX192YWxbMV0gPj4gOCkgJiAweGZmKQotCi1kZWYgbWlub3IoZGV2KTogcmV0dXJuICgoZGV2KS5fX3ZhbFsxXSAmIDB4ZmYpCi0KLWRlZiBtYWpvcihkZXYpOiByZXR1cm4gKCgoZGV2KS5fX3ZhbFswXSA+PiA4KSAmIDB4ZmYpCi0KLWRlZiBtaW5vcihkZXYpOiByZXR1cm4gKChkZXYpLl9fdmFsWzBdICYgMHhmZikKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWxpbnV4L3JlZ2VuIGIvTGliL3BsYXQtbGludXgvcmVnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3Njk1MGUuLjAwMDAwMDAKLS0tIGEvTGliL3BsYXQtbGludXgvcmVnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMhIC9iaW4vc2gKLWNhc2UgYHVuYW1lYCBpbgotTGludXgqKQk7OwotKikJZWNobyBQcm9iYWJseSBub3Qgb24gYSBMaW51eCBzeXN0ZW0gMT4mMgotCWV4aXQgMTs7Ci1lc2FjCi1zZXQgLXYKLWgycHkgLWkgJyh1X2xvbmcpJyAvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmggL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaCAvdXNyL2luY2x1ZGUvZGxmY24uaApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbmV0YnNkMS9JTi5weSBiL0xpYi9wbGF0LW5ldGJzZDEvSU4ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NGM1MWUuLjAwMDAwMDAKLS0tIGEvTGliL3BsYXQtbmV0YnNkMS9JTi5weQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMgR2VuZXJhdGVkIGJ5IGgycHkgZnJvbSAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCi1JUFBST1RPX0lQID0gMAotSVBQUk9UT19JQ01QID0gMQotSVBQUk9UT19JR01QID0gMgotSVBQUk9UT19HR1AgPSAzCi1JUFBST1RPX0lQSVAgPSA0Ci1JUFBST1RPX1RDUCA9IDYKLUlQUFJPVE9fRUdQID0gOAotSVBQUk9UT19QVVAgPSAxMgotSVBQUk9UT19VRFAgPSAxNwotSVBQUk9UT19JRFAgPSAyMgotSVBQUk9UT19UUCA9IDI5Ci1JUFBST1RPX0VPTiA9IDgwCi1JUFBST1RPX0VOQ0FQID0gOTgKLUlQUFJPVE9fUkFXID0gMjU1Ci1JUFBST1RPX01BWCA9IDI1NgotSVBQT1JUX1JFU0VSVkVEID0gMTAyNAotSVBQT1JUX1VTRVJSRVNFUlZFRCA9IDUwMDAKLWRlZiBfX0lQQUREUih4KTogcmV0dXJuICgodV9pbnQzMl90KSh4KSkKLQotSU5fQ0xBU1NBX05TSElGVCA9IDI0Ci1JTl9DTEFTU0FfTUFYID0gMTI4Ci1JTl9DTEFTU0JfTlNISUZUID0gMTYKLUlOX0NMQVNTQl9NQVggPSA2NTUzNgotSU5fQ0xBU1NDX05TSElGVCA9IDgKLUlOX0NMQVNTRF9OU0hJRlQgPSAyOAotZGVmIElOX01VTFRJQ0FTVChpKTogcmV0dXJuIElOX0NMQVNTRChpKQotCi1JTl9MT09QQkFDS05FVCA9IDEyNwotSVBfT1BUSU9OUyA9IDEKLUlQX0hEUklOQ0wgPSAyCi1JUF9UT1MgPSAzCi1JUF9UVEwgPSA0Ci1JUF9SRUNWT1BUUyA9IDUKLUlQX1JFQ1ZSRVRPUFRTID0gNgotSVBfUkVDVkRTVEFERFIgPSA3Ci1JUF9SRVRPUFRTID0gOAotSVBfTVVMVElDQVNUX0lGID0gOQotSVBfTVVMVElDQVNUX1RUTCA9IDEwCi1JUF9NVUxUSUNBU1RfTE9PUCA9IDExCi1JUF9BRERfTUVNQkVSU0hJUCA9IDEyCi1JUF9EUk9QX01FTUJFUlNISVAgPSAxMwotSVBfUkVDVklGID0gMjAKLUlQX0RFRkFVTFRfTVVMVElDQVNUX1RUTCA9IDEKLUlQX0RFRkFVTFRfTVVMVElDQVNUX0xPT1AgPSAxCi1JUF9NQVhfTUVNQkVSU0hJUFMgPSAyMAotSVBQUk9UT19NQVhJRCA9IChJUFBST1RPX0lEUCArIDEpCi1JUENUTF9GT1JXQVJESU5HID0gMQotSVBDVExfU0VORFJFRElSRUNUUyA9IDIKLUlQQ1RMX0RFRlRUTCA9IDMKLUlQQ1RMX0RFRk1UVSA9IDQKLUlQQ1RMX0ZPUldTUkNSVCA9IDUKLUlQQ1RMX0RJUkVDVEVEQkNBU1QgPSA2Ci1JUENUTF9BTExPV1NSQ1JUID0gNwotSVBDVExfTUFYSUQgPSA4Ci1kZWYgaW5fbnVsbGhvc3QoeCk6IHJldHVybiAoKHgpLnNfYWRkciA9PSBJTkFERFJfQU5ZKQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbmV0YnNkMS9yZWdlbiBiL0xpYi9wbGF0LW5ldGJzZDEvcmVnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhYTY4OTguLjAwMDAwMDAKLS0tIGEvTGliL3BsYXQtbmV0YnNkMS9yZWdlbgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyEgL2Jpbi9zaAotc2V0IC12Ci1weXRob24gLi4vLi4vVG9vbHMvc2NyaXB0cy9oMnB5LnB5IC1pICcodV9sb25nKScgL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbmV4dDMvcmVnZW4gYi9MaWIvcGxhdC1uZXh0My9yZWdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2EwMzYxMy4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC1uZXh0My9yZWdlbgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyEgL2Jpbi9zaAotc2V0IC12Ci1JTkNMVURFPSIvTmV4dERldmVsb3Blci9IZWFkZXJzOy9OZXh0RGV2ZWxvcGVyL0hlYWRlcnMvYW5zaTsvTmV4dERldmVsb3Blci9IZWFkZXJzL2JzZCIKLWV4cG9ydCBJTkNMVURFCi0KLXB5dGhvbiAuLi8uLi9Ub29scy9zY3JpcHRzL2gycHkucHkgLWkgJyh1X2xvbmcpJyAvdXNyL2luY2x1ZGUvYnNkL25ldGluZXQvaW4uaApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtc3Vub3M1L0NESU8ucHkgYi9MaWIvcGxhdC1zdW5vczUvQ0RJTy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2NmI1MC4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC1zdW5vczUvQ0RJTy5weQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMgR2VuZXJhdGVkIGJ5IGgycHkgZnJvbSAvdXNyL2luY2x1ZGUvc3lzL2NkaW8uaAotQ0RST01fTEJBID0gMHgwMQotQ0RST01fTVNGID0gMHgwMgotQ0RST01fREFUQV9UUkFDSyA9IDB4MDQKLUNEUk9NX0xFQURPVVQgPSAweEFBCi1DRFJPTV9BVURJT19JTlZBTElEID0gMHgwMAotQ0RST01fQVVESU9fUExBWSA9IDB4MTEKLUNEUk9NX0FVRElPX1BBVVNFRCA9IDB4MTIKLUNEUk9NX0FVRElPX0NPTVBMRVRFRCA9IDB4MTMKLUNEUk9NX0FVRElPX0VSUk9SID0gMHgxNAotQ0RST01fQVVESU9fTk9fU1RBVFVTID0gMHgxNQotQ0RST01fREFfTk9fU1VCQ09ERSA9IDB4MDAKLUNEUk9NX0RBX1NVQlEgPSAweDAxCi1DRFJPTV9EQV9BTExfU1VCQ09ERSA9IDB4MDIKLUNEUk9NX0RBX1NVQkNPREVfT05MWSA9IDB4MDMKLUNEUk9NX1hBX0RBVEEgPSAweDAwCi1DRFJPTV9YQV9TRUNUT1JfREFUQSA9IDB4MDEKLUNEUk9NX1hBX0RBVEFfV19FUlJPUiA9IDB4MDIKLUNEUk9NX0JMS181MTIgPSA1MTIKLUNEUk9NX0JMS18xMDI0ID0gMTAyNAotQ0RST01fQkxLXzIwNDggPSAyMDQ4Ci1DRFJPTV9CTEtfMjA1NiA9IDIwNTYKLUNEUk9NX0JMS18yMzM2ID0gMjMzNgotQ0RST01fQkxLXzIzNDAgPSAyMzQwCi1DRFJPTV9CTEtfMjM1MiA9IDIzNTIKLUNEUk9NX0JMS18yMzY4ID0gMjM2OAotQ0RST01fQkxLXzI0NDggPSAyNDQ4Ci1DRFJPTV9CTEtfMjY0NiA9IDI2NDYKLUNEUk9NX0JMS18yNjQ3ID0gMjY0NwotQ0RST01fQkxLX1NVQkNPREUgPSA5NgotQ0RST01fTk9STUFMX1NQRUVEID0gMHgwMAotQ0RST01fRE9VQkxFX1NQRUVEID0gMHgwMQotQ0RST01fUVVBRF9TUEVFRCA9IDB4MDMKLUNEUk9NX1RXRUxWRV9TUEVFRCA9IDB4MEMKLUNEUk9NX01BWElNVU1fU1BFRUQgPSAweGZmCi1DRElPQyA9ICgweDA0IDw8IDgpCi1DRFJPTVBBVVNFID0gKENESU9DfDE1MSkKLUNEUk9NUkVTVU1FID0gKENESU9DfDE1MikKLUNEUk9NUExBWU1TRiA9IChDRElPQ3wxNTMpCi1DRFJPTVBMQVlUUktJTkQgPSAoQ0RJT0N8MTU0KQotQ0RST01SRUFEVE9DSERSID0gKENESU9DfDE1NSkKLUNEUk9NUkVBRFRPQ0VOVFJZID0gKENESU9DfDE1NikKLUNEUk9NU1RPUCA9IChDRElPQ3wxNTcpCi1DRFJPTVNUQVJUID0gKENESU9DfDE1OCkKLUNEUk9NRUpFQ1QgPSAoQ0RJT0N8MTU5KQotQ0RST01WT0xDVFJMID0gKENESU9DfDE2MCkKLUNEUk9NU1VCQ0hOTCA9IChDRElPQ3wxNjEpCi1DRFJPTVJFQURNT0RFMiA9IChDRElPQ3wxNjIpCi1DRFJPTVJFQURNT0RFMSA9IChDRElPQ3wxNjMpCi1DRFJPTVJFQURPRkZTRVQgPSAoQ0RJT0N8MTY0KQotQ0RST01HQkxLTU9ERSA9IChDRElPQ3wxNjUpCi1DRFJPTVNCTEtNT0RFID0gKENESU9DfDE2NikKLUNEUk9NQ0REQSA9IChDRElPQ3wxNjcpCi1DRFJPTUNEWEEgPSAoQ0RJT0N8MTY4KQotQ0RST01TVUJDT0RFID0gKENESU9DfDE2OSkKLUNEUk9NR0RSVlNQRUVEID0gKENESU9DfDE3MCkKLUNEUk9NU0RSVlNQRUVEID0gKENESU9DfDE3MSkKLVNDTURfUkVBRF9UT0MgPSAweDQzCi1TQ01EX1BMQVlBVURJT19NU0YgPSAweDQ3Ci1TQ01EX1BMQVlBVURJT19USSA9IDB4NDgKLVNDTURfUEFVU0VfUkVTVU1FID0gMHg0QgotU0NNRF9SRUFEX1NVQkNIQU5ORUwgPSAweDQyCi1TQ01EX1BMQVlBVURJTzEwID0gMHg0NQotU0NNRF9QTEFZVFJBQ0tfUkVMMTAgPSAweDQ5Ci1TQ01EX1JFQURfSEVBREVSID0gMHg0NAotU0NNRF9QTEFZQVVESU8xMiA9IDB4QTUKLVNDTURfUExBWVRSQUNLX1JFTDEyID0gMHhBOQotU0NNRF9DRF9QTEFZQkFDS19DT05UUk9MID0gMHhDOQotU0NNRF9DRF9QTEFZQkFDS19TVEFUVVMgPSAweEM0Ci1TQ01EX1JFQURfQ0REQSA9IDB4RDgKLVNDTURfUkVBRF9DRFhBID0gMHhEQgotU0NNRF9SRUFEX0FMTF9TVUJDT0RFUyA9IDB4REYKLUNEUk9NX01PREUyX1NJWkUgPSAyMzM2CmRpZmYgLS1naXQgYS9MaWIvcGxhdC1zdW5vczUvRExGQ04ucHkgYi9MaWIvcGxhdC1zdW5vczUvRExGQ04ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OTIzNTAuLjAwMDAwMDAKLS0tIGEvTGliL3BsYXQtc3Vub3M1L0RMRkNOLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBHZW5lcmF0ZWQgYnkgaDJweSBmcm9tIC91c3IvaW5jbHVkZS9kbGZjbi5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1SVExEX0xBWlkgPSAweDAwMDAxCi1SVExEX05PVyA9IDB4MDAwMDIKLVJUTERfTk9MT0FEID0gMHgwMDAwNAotUlRMRF9HTE9CQUwgPSAweDAwMTAwCi1SVExEX0xPQ0FMID0gMHgwMDAwMAotUlRMRF9QQVJFTlQgPSAweDAwMjAwCi1SVExEX0dST1VQID0gMHgwMDQwMAotUlRMRF9XT1JMRCA9IDB4MDA4MDAKLVJUTERfTk9ERUxFVEUgPSAweDAxMDAwCi1SVExEX0NPTkZHRU4gPSAweDEwMDAwCi1SVExEX1JFTF9SRUxBVElWRSA9IDB4MDAwMDEKLVJUTERfUkVMX0VYRUMgPSAweDAwMDAyCi1SVExEX1JFTF9ERVBFTkRTID0gMHgwMDAwNAotUlRMRF9SRUxfUFJFTE9BRCA9IDB4MDAwMDgKLVJUTERfUkVMX1NFTEYgPSAweDAwMDEwCi1SVExEX1JFTF9XRUFLID0gMHgwMDAyMAotUlRMRF9SRUxfQUxMID0gMHgwMGZmZgotUlRMRF9NRU1PUlkgPSAweDAxMDAwCi1SVExEX1NUUklQID0gMHgwMjAwMAotUlRMRF9OT0hFQVAgPSAweDA0MDAwCi1SVExEX0NPTkZTRVQgPSAweDEwMDAwCi1SVExEX0RJX0xNSUQgPSAxCi1SVExEX0RJX0xJTktNQVAgPSAyCi1SVExEX0RJX0NPTkZJR0FERFIgPSAzCi1SVExEX0RJX01BWCA9IDMKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LXN1bm9zNS9JTi5weSBiL0xpYi9wbGF0LXN1bm9zNS9JTi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3MmVhZC4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC1zdW5vczUvSU4ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIxICswLDAgQEAKLSMgR2VuZXJhdGVkIGJ5IGgycHkgZnJvbSAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvZmVhdHVyZV90ZXN0cy5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvaXNhX2RlZnMuaAotX0NIQVJfQUxJR05NRU5UID0gMQotX1NIT1JUX0FMSUdOTUVOVCA9IDIKLV9JTlRfQUxJR05NRU5UID0gNAotX0xPTkdfQUxJR05NRU5UID0gOAotX0xPTkdfTE9OR19BTElHTk1FTlQgPSA4Ci1fRE9VQkxFX0FMSUdOTUVOVCA9IDgKLV9MT05HX0RPVUJMRV9BTElHTk1FTlQgPSAxNgotX1BPSU5URVJfQUxJR05NRU5UID0gOAotX01BWF9BTElHTk1FTlQgPSAxNgotX0FMSUdOTUVOVF9SRVFVSVJFRCA9IDEKLV9DSEFSX0FMSUdOTUVOVCA9IDEKLV9TSE9SVF9BTElHTk1FTlQgPSAyCi1fSU5UX0FMSUdOTUVOVCA9IDQKLV9MT05HX0FMSUdOTUVOVCA9IDQKLV9MT05HX0xPTkdfQUxJR05NRU5UID0gNAotX0RPVUJMRV9BTElHTk1FTlQgPSA0Ci1fTE9OR19ET1VCTEVfQUxJR05NRU5UID0gNAotX1BPSU5URVJfQUxJR05NRU5UID0gNAotX01BWF9BTElHTk1FTlQgPSA0Ci1fQUxJR05NRU5UX1JFUVVJUkVEID0gMAotX0NIQVJfQUxJR05NRU5UID0gMQotX1NIT1JUX0FMSUdOTUVOVCA9IDIKLV9JTlRfQUxJR05NRU5UID0gNAotX0xPTkdfTE9OR19BTElHTk1FTlQgPSA4Ci1fRE9VQkxFX0FMSUdOTUVOVCA9IDgKLV9BTElHTk1FTlRfUkVRVUlSRUQgPSAxCi1fTE9OR19BTElHTk1FTlQgPSA0Ci1fTE9OR19ET1VCTEVfQUxJR05NRU5UID0gOAotX1BPSU5URVJfQUxJR05NRU5UID0gNAotX01BWF9BTElHTk1FTlQgPSA4Ci1fTE9OR19BTElHTk1FTlQgPSA4Ci1fTE9OR19ET1VCTEVfQUxJR05NRU5UID0gMTYKLV9QT0lOVEVSX0FMSUdOTUVOVCA9IDgKLV9NQVhfQUxJR05NRU5UID0gMTYKLV9QT1NJWF9DX1NPVVJDRSA9IDEKLV9MQVJHRUZJTEU2NF9TT1VSQ0UgPSAxCi1fTEFSR0VGSUxFX1NPVVJDRSA9IDEKLV9GSUxFX09GRlNFVF9CSVRTID0gNjQKLV9GSUxFX09GRlNFVF9CSVRTID0gMzIKLV9QT1NJWF9DX1NPVVJDRSA9IDE5OTUwNgotX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTID0gMQotX1hPUEVOX1ZFUlNJT04gPSA1MDAKLV9YT1BFTl9WRVJTSU9OID0gNAotX1hPUEVOX1ZFUlNJT04gPSAzCi1mcm9tIFRZUEVTIGltcG9ydCAqCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvc3RyZWFtLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy92bm9kZS5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdF9sb2NrLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9tYWNobG9jay5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1MT0NLX0hFTERfVkFMVUUgPSAweGZmCi1kZWYgU1BJTl9MT0NLKHBsKTogcmV0dXJuICgocGwpID4gaXBsdG9zcGwoTE9DS19MRVZFTCkpCi0KLWRlZiBMT0NLX1NBTVBMRV9JTlRFUlZBTChpKTogcmV0dXJuICgoKGkpICYgMHhmZikgPT0gMCkKLQotQ0xPQ0tfTEVWRUwgPSAxMAotTE9DS19MRVZFTCA9IDEwCi1ESVNQX0xFVkVMID0gKExPQ0tfTEVWRUwgKyAxKQotUFRSMjRfTFNCID0gNQotUFRSMjRfTVNCID0gKFBUUjI0X0xTQiArIDI0KQotUFRSMjRfQUxJR04gPSAzMgotUFRSMjRfQkFTRSA9IDB4ZTAwMDAwMDAKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9wYXJhbS5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1fUE9TSVhfVkRJU0FCTEUgPSAwCi1NQVhfSU5QVVQgPSA1MTIKLU1BWF9DQU5PTiA9IDI1NgotVUlEX05PQk9EWSA9IDYwMDAxCi1HSURfTk9CT0RZID0gVUlEX05PQk9EWQotVUlEX05PQUNDRVNTID0gNjAwMDIKLU1BWF9UQVNLSUQgPSA5OTk5OTkKLU1BWF9NQVhQSUQgPSA5OTk5OTkKLURFRkFVTFRfTUFYUElEID0gOTk5OTk5Ci1ERUZBVUxUX0pVTVBQSUQgPSAxMDAwMDAKLURFRkFVTFRfTUFYUElEID0gMzAwMDAKLURFRkFVTFRfSlVNUFBJRCA9IDAKLU1BWFVJRCA9IDIxNDc0ODM2NDcKLU1BWFBST0pJRCA9IE1BWFVJRAotTUFYTElOSyA9IDMyNzY3Ci1OTU9VTlQgPSA0MAotQ0FOQlNJWiA9IDI1NgotTk9GSUxFID0gMjAKLU5HUk9VUFNfVU1JTiA9IDAKLU5HUk9VUFNfVU1BWCA9IDMyCi1OR1JPVVBTX01BWF9ERUZBVUxUID0gMTYKLU5aRVJPID0gMjAKLU5VTEwgPSAwCi1OVUxMID0gMAotQ01BU0sgPSAwbzIyCi1DRExJTUlUID0gKDE8PDExKQotTkJQUyA9IDB4MjAwMDAKLU5CUFNDVFIgPSA1MTIKLVVCU0laRSA9IDUxMgotU0NUUlNIRlQgPSA5Ci1TWVNOQU1FID0gOQotUFJFTU9URSA9IDM5Ci1NQVhQQVRITEVOID0gMTAyNAotTUFYU1lNTElOS1MgPSAyMAotTUFYTkFNRUxFTiA9IDI1NgotTkFERFIgPSAxMwotUElQRV9CVUYgPSA1MTIwCi1QSVBFX01BWCA9IDUxMjAKLU5CQlkgPSA4Ci1NQVhCU0laRSA9IDgxOTIKLURFVl9CU0laRSA9IDUxMgotREVWX0JTSElGVCA9IDkKLU1BWEZSQUcgPSA4Ci1NQVhPRkYzMl9UID0gMHg3ZmZmZmZmZgotTUFYT0ZGX1QgPSAweDdmZmZmZmZmZmZmZmZmZmYKLU1BWE9GRlNFVF9UID0gMHg3ZmZmZmZmZmZmZmZmZmZmCi1NQVhPRkZfVCA9IDB4N2ZmZmZmZmYKLU1BWE9GRlNFVF9UID0gMHg3ZmZmZmZmZgotZGVmIGJ0b2RiKGJ5dGVzKTogcmV0dXJuICAgXAotCi1kZWYgZGJ0b2IoZGIpOiByZXR1cm4gICBcCi0KLWRlZiBsYnRvZGIoYnl0ZXMpOiByZXR1cm4gICBcCi0KLWRlZiBsZGJ0b2IoZGIpOiByZXR1cm4gICBcCi0KLU5DQVJHUzMyID0gMHgxMDAwMDAKLU5DQVJHUzY0ID0gMHgyMDAwMDAKLU5DQVJHUyA9IE5DQVJHUzY0Ci1OQ0FSR1MgPSBOQ0FSR1MzMgotRlNISUZUID0gOAotRlNDQUxFID0gKDE8PEZTSElGVCkKLWRlZiBERUxBWShuKTogcmV0dXJuIGRydl91c2Vjd2FpdChuKQotCi1kZWYgbW11X3B0b2IoeCk6IHJldHVybiAoKHgpIDw8IE1NVV9QQUdFU0hJRlQpCi0KLWRlZiBtbXVfYnRvcCh4KTogcmV0dXJuICgoKHgpKSA+PiBNTVVfUEFHRVNISUZUKQotCi1kZWYgbW11X2J0b3ByKHgpOiByZXR1cm4gKCgoKHgpICsgTU1VX1BBR0VPRkZTRVQpID4+IE1NVV9QQUdFU0hJRlQpKQotCi1kZWYgbW11X3B0b2QoeCk6IHJldHVybiAoKHgpIDw8IChNTVVfUEFHRVNISUZUIC0gREVWX0JTSElGVCkpCi0KLWRlZiBwdG9kKHgpOiByZXR1cm4gKCh4KSA8PCAoUEFHRVNISUZUIC0gREVWX0JTSElGVCkpCi0KLWRlZiBwdG9iKHgpOiByZXR1cm4gKCh4KSA8PCBQQUdFU0hJRlQpCi0KLWRlZiBidG9wKHgpOiByZXR1cm4gKCgoeCkgPj4gUEFHRVNISUZUKSkKLQotZGVmIGJ0b3ByKHgpOiByZXR1cm4gKCgoKHgpICsgUEFHRU9GRlNFVCkgPj4gUEFHRVNISUZUKSkKLQotZGVmIGR0b3AoREQpOiByZXR1cm4gKCgoREQpICsgTkRQUCAtIDEpID4+IChQQUdFU0hJRlQgLSBERVZfQlNISUZUKSkKLQotZGVmIGR0b3B0KEREKTogcmV0dXJuICgoREQpID4+IChQQUdFU0hJRlQgLSBERVZfQlNISUZUKSkKLQotX0FJT19MSVNUSU9fTUFYID0gKDQwOTYpCi1fQUlPX01BWCA9ICgtMSkKLV9NUV9PUEVOX01BWCA9ICgzMikKLV9NUV9QUklPX01BWCA9ICgzMikKLV9TRU1fTlNFTVNfTUFYID0gSU5UX01BWAotX1NFTV9WQUxVRV9NQVggPSBJTlRfTUFYCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdW5pc3RkLmgKLV9DU19QQVRIID0gNjUKLV9DU19MRlNfQ0ZMQUdTID0gNjgKLV9DU19MRlNfTERGTEFHUyA9IDY5Ci1fQ1NfTEZTX0xJQlMgPSA3MAotX0NTX0xGU19MSU5URkxBR1MgPSA3MQotX0NTX0xGUzY0X0NGTEFHUyA9IDcyCi1fQ1NfTEZTNjRfTERGTEFHUyA9IDczCi1fQ1NfTEZTNjRfTElCUyA9IDc0Ci1fQ1NfTEZTNjRfTElOVEZMQUdTID0gNzUKLV9DU19YQlM1X0lMUDMyX09GRjMyX0NGTEFHUyA9IDcwMAotX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTERGTEFHUyA9IDcwMQotX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElCUyA9IDcwMgotX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElOVEZMQUdTID0gNzAzCi1fQ1NfWEJTNV9JTFAzMl9PRkZCSUdfQ0ZMQUdTID0gNzA1Ci1fQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTERGTEFHUyA9IDcwNgotX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xJQlMgPSA3MDcKLV9DU19YQlM1X0lMUDMyX09GRkJJR19MSU5URkxBR1MgPSA3MDgKLV9DU19YQlM1X0xQNjRfT0ZGNjRfQ0ZMQUdTID0gNzA5Ci1fQ1NfWEJTNV9MUDY0X09GRjY0X0xERkxBR1MgPSA3MTAKLV9DU19YQlM1X0xQNjRfT0ZGNjRfTElCUyA9IDcxMQotX0NTX1hCUzVfTFA2NF9PRkY2NF9MSU5URkxBR1MgPSA3MTIKLV9DU19YQlM1X0xQQklHX09GRkJJR19DRkxBR1MgPSA3MTMKLV9DU19YQlM1X0xQQklHX09GRkJJR19MREZMQUdTID0gNzE0Ci1fQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElCUyA9IDcxNQotX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUyA9IDcxNgotX1NDX0FSR19NQVggPSAxCi1fU0NfQ0hJTERfTUFYID0gMgotX1NDX0NMS19UQ0sgPSAzCi1fU0NfTkdST1VQU19NQVggPSA0Ci1fU0NfT1BFTl9NQVggPSA1Ci1fU0NfSk9CX0NPTlRST0wgPSA2Ci1fU0NfU0FWRURfSURTID0gNwotX1NDX1ZFUlNJT04gPSA4Ci1fU0NfUEFTU19NQVggPSA5Ci1fU0NfTE9HTkFNRV9NQVggPSAxMAotX1NDX1BBR0VTSVpFID0gMTEKLV9TQ19YT1BFTl9WRVJTSU9OID0gMTIKLV9TQ19OUFJPQ0VTU09SU19DT05GID0gMTQKLV9TQ19OUFJPQ0VTU09SU19PTkxOID0gMTUKLV9TQ19TVFJFQU1fTUFYID0gMTYKLV9TQ19UWk5BTUVfTUFYID0gMTcKLV9TQ19BSU9fTElTVElPX01BWCA9IDE4Ci1fU0NfQUlPX01BWCA9IDE5Ci1fU0NfQUlPX1BSSU9fREVMVEFfTUFYID0gMjAKLV9TQ19BU1lOQ0hST05PVVNfSU8gPSAyMQotX1NDX0RFTEFZVElNRVJfTUFYID0gMjIKLV9TQ19GU1lOQyA9IDIzCi1fU0NfTUFQUEVEX0ZJTEVTID0gMjQKLV9TQ19NRU1MT0NLID0gMjUKLV9TQ19NRU1MT0NLX1JBTkdFID0gMjYKLV9TQ19NRU1PUllfUFJPVEVDVElPTiA9IDI3Ci1fU0NfTUVTU0FHRV9QQVNTSU5HID0gMjgKLV9TQ19NUV9PUEVOX01BWCA9IDI5Ci1fU0NfTVFfUFJJT19NQVggPSAzMAotX1NDX1BSSU9SSVRJWkVEX0lPID0gMzEKLV9TQ19QUklPUklUWV9TQ0hFRFVMSU5HID0gMzIKLV9TQ19SRUFMVElNRV9TSUdOQUxTID0gMzMKLV9TQ19SVFNJR19NQVggPSAzNAotX1NDX1NFTUFQSE9SRVMgPSAzNQotX1NDX1NFTV9OU0VNU19NQVggPSAzNgotX1NDX1NFTV9WQUxVRV9NQVggPSAzNwotX1NDX1NIQVJFRF9NRU1PUllfT0JKRUNUUyA9IDM4Ci1fU0NfU0lHUVVFVUVfTUFYID0gMzkKLV9TQ19TSUdSVF9NSU4gPSA0MAotX1NDX1NJR1JUX01BWCA9IDQxCi1fU0NfU1lOQ0hST05JWkVEX0lPID0gNDIKLV9TQ19USU1FUlMgPSA0MwotX1NDX1RJTUVSX01BWCA9IDQ0Ci1fU0NfMl9DX0JJTkQgPSA0NQotX1NDXzJfQ19ERVYgPSA0NgotX1NDXzJfQ19WRVJTSU9OID0gNDcKLV9TQ18yX0ZPUlRfREVWID0gNDgKLV9TQ18yX0ZPUlRfUlVOID0gNDkKLV9TQ18yX0xPQ0FMRURFRiA9IDUwCi1fU0NfMl9TV19ERVYgPSA1MQotX1NDXzJfVVBFID0gNTIKLV9TQ18yX1ZFUlNJT04gPSA1MwotX1NDX0JDX0JBU0VfTUFYID0gNTQKLV9TQ19CQ19ESU1fTUFYID0gNTUKLV9TQ19CQ19TQ0FMRV9NQVggPSA1NgotX1NDX0JDX1NUUklOR19NQVggPSA1NwotX1NDX0NPTExfV0VJR0hUU19NQVggPSA1OAotX1NDX0VYUFJfTkVTVF9NQVggPSA1OQotX1NDX0xJTkVfTUFYID0gNjAKLV9TQ19SRV9EVVBfTUFYID0gNjEKLV9TQ19YT1BFTl9DUllQVCA9IDYyCi1fU0NfWE9QRU5fRU5IX0kxOE4gPSA2MwotX1NDX1hPUEVOX1NITSA9IDY0Ci1fU0NfMl9DSEFSX1RFUk0gPSA2NgotX1NDX1hPUEVOX1hDVV9WRVJTSU9OID0gNjcKLV9TQ19BVEVYSVRfTUFYID0gNzYKLV9TQ19JT1ZfTUFYID0gNzcKLV9TQ19YT1BFTl9VTklYID0gNzgKLV9TQ19QQUdFX1NJWkUgPSBfU0NfUEFHRVNJWkUKLV9TQ19UX0lPVl9NQVggPSA3OQotX1NDX1BIWVNfUEFHRVMgPSA1MDAKLV9TQ19BVlBIWVNfUEFHRVMgPSA1MDEKLV9TQ19DT0hFUl9CTEtTWiA9IDUwMwotX1NDX1NQTElUX0NBQ0hFID0gNTA0Ci1fU0NfSUNBQ0hFX1NaID0gNTA1Ci1fU0NfRENBQ0hFX1NaID0gNTA2Ci1fU0NfSUNBQ0hFX0xJTkVTWiA9IDUwNwotX1NDX0RDQUNIRV9MSU5FU1ogPSA1MDgKLV9TQ19JQ0FDSEVfQkxLU1ogPSA1MDkKLV9TQ19EQ0FDSEVfQkxLU1ogPSA1MTAKLV9TQ19EQ0FDSEVfVEJMS1NaID0gNTExCi1fU0NfSUNBQ0hFX0FTU09DID0gNTEyCi1fU0NfRENBQ0hFX0FTU09DID0gNTEzCi1fU0NfTUFYUElEID0gNTE0Ci1fU0NfU1RBQ0tfUFJPVCA9IDUxNQotX1NDX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMgPSA1NjgKLV9TQ19HRVRHUl9SX1NJWkVfTUFYID0gNTY5Ci1fU0NfR0VUUFdfUl9TSVpFX01BWCA9IDU3MAotX1NDX0xPR0lOX05BTUVfTUFYID0gNTcxCi1fU0NfVEhSRUFEX0tFWVNfTUFYID0gNTcyCi1fU0NfVEhSRUFEX1NUQUNLX01JTiA9IDU3MwotX1NDX1RIUkVBRF9USFJFQURTX01BWCA9IDU3NAotX1NDX1RUWV9OQU1FX01BWCA9IDU3NQotX1NDX1RIUkVBRFMgPSA1NzYKLV9TQ19USFJFQURfQVRUUl9TVEFDS0FERFIgPSA1NzcKLV9TQ19USFJFQURfQVRUUl9TVEFDS1NJWkUgPSA1NzgKLV9TQ19USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyA9IDU3OQotX1NDX1RIUkVBRF9QUklPX0lOSEVSSVQgPSA1ODAKLV9TQ19USFJFQURfUFJJT19QUk9URUNUID0gNTgxCi1fU0NfVEhSRUFEX1BST0NFU1NfU0hBUkVEID0gNTgyCi1fU0NfVEhSRUFEX1NBRkVfRlVOQ1RJT05TID0gNTgzCi1fU0NfWE9QRU5fTEVHQUNZID0gNzE3Ci1fU0NfWE9QRU5fUkVBTFRJTUUgPSA3MTgKLV9TQ19YT1BFTl9SRUFMVElNRV9USFJFQURTID0gNzE5Ci1fU0NfWEJTNV9JTFAzMl9PRkYzMiA9IDcyMAotX1NDX1hCUzVfSUxQMzJfT0ZGQklHID0gNzIxCi1fU0NfWEJTNV9MUDY0X09GRjY0ID0gNzIyCi1fU0NfWEJTNV9MUEJJR19PRkZCSUcgPSA3MjMKLV9QQ19MSU5LX01BWCA9IDEKLV9QQ19NQVhfQ0FOT04gPSAyCi1fUENfTUFYX0lOUFVUID0gMwotX1BDX05BTUVfTUFYID0gNAotX1BDX1BBVEhfTUFYID0gNQotX1BDX1BJUEVfQlVGID0gNgotX1BDX05PX1RSVU5DID0gNwotX1BDX1ZESVNBQkxFID0gOAotX1BDX0NIT1dOX1JFU1RSSUNURUQgPSA5Ci1fUENfQVNZTkNfSU8gPSAxMAotX1BDX1BSSU9fSU8gPSAxMQotX1BDX1NZTkNfSU8gPSAxMgotX1BDX0ZJTEVTSVpFQklUUyA9IDY3Ci1fUENfTEFTVCA9IDY3Ci1fUE9TSVhfVkVSU0lPTiA9IDE5OTUwNgotX1BPU0lYMl9WRVJTSU9OID0gMTk5MjA5Ci1fUE9TSVgyX0NfVkVSU0lPTiA9IDE5OTIwOQotX1hPUEVOX1hDVV9WRVJTSU9OID0gNAotX1hPUEVOX1JFQUxUSU1FID0gMQotX1hPUEVOX0VOSF9JMThOID0gMQotX1hPUEVOX1NITSA9IDEKLV9QT1NJWDJfQ19CSU5EID0gMQotX1BPU0lYMl9DSEFSX1RFUk0gPSAxCi1fUE9TSVgyX0xPQ0FMRURFRiA9IDEKLV9QT1NJWDJfQ19ERVYgPSAxCi1fUE9TSVgyX1NXX0RFViA9IDEKLV9QT1NJWDJfVVBFID0gMQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL211dGV4LmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLWRlZiBNVVRFWF9IRUxEKHgpOiByZXR1cm4gKG11dGV4X293bmVkKHgpKQotCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvcndsb2NrLmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLWRlZiBSV19SRUFEX0hFTEQoeCk6IHJldHVybiAocndfcmVhZF9oZWxkKCh4KSkpCi0KLWRlZiBSV19XUklURV9IRUxEKHgpOiByZXR1cm4gKHJ3X3dyaXRlX2hlbGQoKHgpKSkKLQotZGVmIFJXX0xPQ0tfSEVMRCh4KTogcmV0dXJuIChyd19sb2NrX2hlbGQoKHgpKSkKLQotZGVmIFJXX0lTV1JJVEVSKHgpOiByZXR1cm4gKHJ3X2lzd3JpdGVyKHgpKQotCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvc2VtYXBob3JlLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy90aHJlYWQuaAotZnJvbSBUWVBFUyBpbXBvcnQgKgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2tsd3AuaAotZnJvbSBUWVBFUyBpbXBvcnQgKgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2NvbmR2YXIuaAotZnJvbSBUWVBFUyBpbXBvcnQgKgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3RpbWUuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3R5cGVzMzIuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2ludF90eXBlcy5oCi1USU1FMzJfTUFYID0gSU5UMzJfTUFYCi1USU1FMzJfTUlOID0gSU5UMzJfTUlOCi1kZWYgVElNRVZBTF9PVkVSRkxPVyh0dik6IHJldHVybiBcCi0KLWZyb20gVFlQRVMgaW1wb3J0ICoKLURTVF9OT05FID0gMAotRFNUX1VTQSA9IDEKLURTVF9BVVNUID0gMgotRFNUX1dFVCA9IDMKLURTVF9NRVQgPSA0Ci1EU1RfRUVUID0gNQotRFNUX0NBTiA9IDYKLURTVF9HQiA9IDcKLURTVF9SVU0gPSA4Ci1EU1RfVFVSID0gOQotRFNUX0FVU1RBTFQgPSAxMAotSVRJTUVSX1JFQUwgPSAwCi1JVElNRVJfVklSVFVBTCA9IDEKLUlUSU1FUl9QUk9GID0gMgotSVRJTUVSX1JFQUxQUk9GID0gMwotZGVmIElUSU1FUlZBTF9PVkVSRkxPVyhpdHYpOiByZXR1cm4gXAotCi1TRUMgPSAxCi1NSUxMSVNFQyA9IDEwMDAKLU1JQ1JPU0VDID0gMTAwMDAwMAotTkFOT1NFQyA9IDEwMDAwMDAwMDAKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy90aW1lX2ltcGwuaAotZGVmIFRJTUVTUEVDX09WRVJGTE9XKHRzKTogcmV0dXJuIFwKLQotZGVmIElUSU1FUlNQRUNfT1ZFUkZMT1coaXQpOiByZXR1cm4gXAotCi1fX0NMT0NLX1JFQUxUSU1FMCA9IDAKLUNMT0NLX1ZJUlRVQUwgPSAxCi1DTE9DS19QUk9GID0gMgotX19DTE9DS19SRUFMVElNRTMgPSAzCi1DTE9DS19ISUdIUkVTID0gNAotQ0xPQ0tfTUFYID0gNQotQ0xPQ0tfUkVBTFRJTUUgPSBfX0NMT0NLX1JFQUxUSU1FMwotQ0xPQ0tfUkVBTFRJTUUgPSBfX0NMT0NLX1JFQUxUSU1FMAotVElNRVJfUkVMVElNRSA9IDB4MAotVElNRVJfQUJTVElNRSA9IDB4MQotZGVmIFRJQ0tfVE9fU0VDKHRpY2spOiByZXR1cm4gKCh0aWNrKSAvIGh6KQotCi1kZWYgU0VDX1RPX1RJQ0soc2VjKTogcmV0dXJuICgoc2VjKSAqIGh6KQotCi1kZWYgVElDS19UT19NU0VDKHRpY2spOiByZXR1cm4gXAotCi1kZWYgTVNFQ19UT19USUNLKG1zZWMpOiByZXR1cm4gXAotCi1kZWYgTVNFQ19UT19USUNLX1JPVU5EVVAobXNlYyk6IHJldHVybiBcCi0KLWRlZiBUSUNLX1RPX1VTRUModGljayk6IHJldHVybiAoKHRpY2spICogdXNlY19wZXJfdGljaykKLQotZGVmIFVTRUNfVE9fVElDSyh1c2VjKTogcmV0dXJuICgodXNlYykgLyB1c2VjX3Blcl90aWNrKQotCi1kZWYgVVNFQ19UT19USUNLX1JPVU5EVVAodXNlYyk6IHJldHVybiBcCi0KLWRlZiBUSUNLX1RPX05TRUModGljayk6IHJldHVybiAoKHRpY2spICogbnNlY19wZXJfdGljaykKLQotZGVmIE5TRUNfVE9fVElDSyhuc2VjKTogcmV0dXJuICgobnNlYykgLyBuc2VjX3Blcl90aWNrKQotCi1kZWYgTlNFQ19UT19USUNLX1JPVU5EVVAobnNlYyk6IHJldHVybiBcCi0KLWRlZiBUSU1FVkFMX1RPX1RJQ0sodHZwKTogcmV0dXJuIFwKLQotZGVmIFRJTUVTVFJVQ19UT19USUNLKHRzcCk6IHJldHVybiBcCi0KLQotIyBJbmNsdWRlZCBmcm9tIHRpbWUuaAotZnJvbSBUWVBFUyBpbXBvcnQgKgotCi0jIEluY2x1ZGVkIGZyb20gaXNvL3RpbWVfaXNvLmgKLU5VTEwgPSAwCi1OVUxMID0gMAotQ0xPQ0tTX1BFUl9TRUMgPSAxMDAwMDAwCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvc2VsZWN0LmgKLUZEX1NFVFNJWkUgPSA2NTUzNgotRkRfU0VUU0laRSA9IDEwMjQKLV9OQkJZID0gOAotTkJCWSA9IF9OQkJZCi1kZWYgRkRfWkVSTyhwKTogcmV0dXJuIGJ6ZXJvKChwKSwgc2l6ZW9mICgqKHApKSkKLQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3NpZ25hbC5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvaXNvL3NpZ25hbF9pc28uaAotU0lHSFVQID0gMQotU0lHSU5UID0gMgotU0lHUVVJVCA9IDMKLVNJR0lMTCA9IDQKLVNJR1RSQVAgPSA1Ci1TSUdJT1QgPSA2Ci1TSUdBQlJUID0gNgotU0lHRU1UID0gNwotU0lHRlBFID0gOAotU0lHS0lMTCA9IDkKLVNJR0JVUyA9IDEwCi1TSUdTRUdWID0gMTEKLVNJR1NZUyA9IDEyCi1TSUdQSVBFID0gMTMKLVNJR0FMUk0gPSAxNAotU0lHVEVSTSA9IDE1Ci1TSUdVU1IxID0gMTYKLVNJR1VTUjIgPSAxNwotU0lHQ0xEID0gMTgKLVNJR0NITEQgPSAxOAotU0lHUFdSID0gMTkKLVNJR1dJTkNIID0gMjAKLVNJR1VSRyA9IDIxCi1TSUdQT0xMID0gMjIKLVNJR0lPID0gU0lHUE9MTAotU0lHU1RPUCA9IDIzCi1TSUdUU1RQID0gMjQKLVNJR0NPTlQgPSAyNQotU0lHVFRJTiA9IDI2Ci1TSUdUVE9VID0gMjcKLVNJR1ZUQUxSTSA9IDI4Ci1TSUdQUk9GID0gMjkKLVNJR1hDUFUgPSAzMAotU0lHWEZTWiA9IDMxCi1TSUdXQUlUSU5HID0gMzIKLVNJR0xXUCA9IDMzCi1TSUdGUkVFWkUgPSAzNAotU0lHVEhBVyA9IDM1Ci1TSUdDQU5DRUwgPSAzNgotU0lHTE9TVCA9IDM3Ci1fU0lHUlRNSU4gPSAzOAotX1NJR1JUTUFYID0gNDUKLVNJR19CTE9DSyA9IDEKLVNJR19VTkJMT0NLID0gMgotU0lHX1NFVE1BU0sgPSAzCi1TSUdOT19NQVNLID0gMHhGRgotU0lHREVGRVIgPSAweDEwMAotU0lHSE9MRCA9IDB4MjAwCi1TSUdSRUxTRSA9IDB4NDAwCi1TSUdJR05PUkUgPSAweDgwMAotU0lHUEFVU0UgPSAweDEwMDAKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9zaWdpbmZvLmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLVNJR0VWX05PTkUgPSAxCi1TSUdFVl9TSUdOQUwgPSAyCi1TSUdFVl9USFJFQUQgPSAzCi1TSV9OT0lORk8gPSAzMjc2NwotU0lfVVNFUiA9IDAKLVNJX0xXUCA9ICgtMSkKLVNJX1FVRVVFID0gKC0yKQotU0lfVElNRVIgPSAoLTMpCi1TSV9BU1lOQ0lPID0gKC00KQotU0lfTUVTR1EgPSAoLTUpCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvbWFjaHNpZy5oCi1JTExfSUxMT1BDID0gMQotSUxMX0lMTE9QTiA9IDIKLUlMTF9JTExBRFIgPSAzCi1JTExfSUxMVFJQID0gNAotSUxMX1BSVk9QQyA9IDUKLUlMTF9QUlZSRUcgPSA2Ci1JTExfQ09QUk9DID0gNwotSUxMX0JBRFNUSyA9IDgKLU5TSUdJTEwgPSA4Ci1FTVRfVEFHT1ZGID0gMQotRU1UX0NQQ09WRiA9IDIKLU5TSUdFTVQgPSAyCi1GUEVfSU5URElWID0gMQotRlBFX0lOVE9WRiA9IDIKLUZQRV9GTFRESVYgPSAzCi1GUEVfRkxUT1ZGID0gNAotRlBFX0ZMVFVORCA9IDUKLUZQRV9GTFRSRVMgPSA2Ci1GUEVfRkxUSU5WID0gNwotRlBFX0ZMVFNVQiA9IDgKLU5TSUdGUEUgPSA4Ci1TRUdWX01BUEVSUiA9IDEKLVNFR1ZfQUNDRVJSID0gMgotTlNJR1NFR1YgPSAyCi1CVVNfQURSQUxOID0gMQotQlVTX0FEUkVSUiA9IDIKLUJVU19PQkpFUlIgPSAzCi1OU0lHQlVTID0gMwotVFJBUF9CUktQVCA9IDEKLVRSQVBfVFJBQ0UgPSAyCi1UUkFQX1JXQVRDSCA9IDMKLVRSQVBfV1dBVENIID0gNAotVFJBUF9YV0FUQ0ggPSA1Ci1OU0lHVFJBUCA9IDUKLUNMRF9FWElURUQgPSAxCi1DTERfS0lMTEVEID0gMgotQ0xEX0RVTVBFRCA9IDMKLUNMRF9UUkFQUEVEID0gNAotQ0xEX1NUT1BQRUQgPSA1Ci1DTERfQ09OVElOVUVEID0gNgotTlNJR0NMRCA9IDYKLVBPTExfSU4gPSAxCi1QT0xMX09VVCA9IDIKLVBPTExfTVNHID0gMwotUE9MTF9FUlIgPSA0Ci1QT0xMX1BSSSA9IDUKLVBPTExfSFVQID0gNgotTlNJR1BPTEwgPSA2Ci1QUk9GX1NJRyA9IDEKLU5TSUdQUk9GID0gMQotU0lfTUFYU1ogPSAyNTYKLVNJX01BWFNaID0gMTI4Ci0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdGltZV9zdGRfaW1wbC5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1TSTMyX01BWFNaID0gMTI4Ci1kZWYgU0lfQ0FOUVVFVUUoYyk6IHJldHVybiAoKGMpIDw9IFNJX1FVRVVFKQotCi1TQV9OT0NMRFNUT1AgPSAweDAwMDIwMDAwCi1TQV9PTlNUQUNLID0gMHgwMDAwMDAwMQotU0FfUkVTRVRIQU5EID0gMHgwMDAwMDAwMgotU0FfUkVTVEFSVCA9IDB4MDAwMDAwMDQKLVNBX1NJR0lORk8gPSAweDAwMDAwMDA4Ci1TQV9OT0RFRkVSID0gMHgwMDAwMDAxMAotU0FfTk9DTERXQUlUID0gMHgwMDAxMDAwMAotU0FfV0FJVFNJRyA9IDB4MDAwMTAwMDAKLU5TSUcgPSA0NgotTUFYU0lHID0gNDUKLVNfU0lHTkFMID0gMQotU19TSUdTRVQgPSAyCi1TX1NJR0FDVElPTiA9IDMKLVNfTk9ORSA9IDQKLU1JTlNJR1NUS1NaID0gMjA0OAotU0lHU1RLU1ogPSA4MTkyCi1TU19PTlNUQUNLID0gMHgwMDAwMDAwMQotU1NfRElTQUJMRSA9IDB4MDAwMDAwMDIKLVNOX1BST0MgPSAxCi1TTl9DQU5DRUwgPSAyCi1TTl9TRU5EID0gMwotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3Vjb250ZXh0LmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9yZWdzZXQuaAotUkVHX0NDUiA9ICgwKQotUkVHX1BTUiA9ICgwKQotUkVHX1BTUiA9ICgwKQotUkVHX1BDID0gKDEpCi1SRUdfblBDID0gKDIpCi1SRUdfWSA9ICgzKQotUkVHX0cxID0gKDQpCi1SRUdfRzIgPSAoNSkKLVJFR19HMyA9ICg2KQotUkVHX0c0ID0gKDcpCi1SRUdfRzUgPSAoOCkKLVJFR19HNiA9ICg5KQotUkVHX0c3ID0gKDEwKQotUkVHX08wID0gKDExKQotUkVHX08xID0gKDEyKQotUkVHX08yID0gKDEzKQotUkVHX08zID0gKDE0KQotUkVHX080ID0gKDE1KQotUkVHX081ID0gKDE2KQotUkVHX082ID0gKDE3KQotUkVHX083ID0gKDE4KQotUkVHX0FTSSA9ICgxOSkKLVJFR19GUFJTID0gKDIwKQotUkVHX1BTID0gUkVHX1BTUgotUkVHX1NQID0gUkVHX082Ci1SRUdfUjAgPSBSRUdfTzAKLVJFR19SMSA9IFJFR19PMQotX05HUkVHID0gMjEKLV9OR1JFRyA9IDE5Ci1OR1JFRyA9IF9OR1JFRwotX05HUkVHMzIgPSAxOQotX05HUkVHNjQgPSAyMQotU1BBUkNfTUFYUkVHV0lORE9XID0gMzEKLU1BWEZQUSA9IDE2Ci1YUlNfSUQgPSAweDc4NzI3MzAwCi0KLSMgSW5jbHVkZWQgZnJvbSB2Ny9zeXMvcHJpdnJlZ3MuaAotCi0jIEluY2x1ZGVkIGZyb20gdjcvc3lzL3Bzci5oCi1QU1JfQ1dQID0gMHgwMDAwMDAxRgotUFNSX0VUID0gMHgwMDAwMDAyMAotUFNSX1BTID0gMHgwMDAwMDA0MAotUFNSX1MgPSAweDAwMDAwMDgwCi1QU1JfUElMID0gMHgwMDAwMEYwMAotUFNSX0VGID0gMHgwMDAwMTAwMAotUFNSX0VDID0gMHgwMDAwMjAwMAotUFNSX1JTViA9IDB4MDAwRkMwMDAKLVBTUl9JQ0MgPSAweDAwRjAwMDAwCi1QU1JfQyA9IDB4MDAxMDAwMDAKLVBTUl9WID0gMHgwMDIwMDAwMAotUFNSX1ogPSAweDAwNDAwMDAwCi1QU1JfTiA9IDB4MDA4MDAwMDAKLVBTUl9WRVIgPSAweDBGMDAwMDAwCi1QU1JfSU1QTCA9IDB4RjAwMDAwMDAKLVBTTF9BTExDQyA9IFBTUl9JQ0MKLVBTTF9VU0VSID0gKFBTUl9TKQotUFNMX1VTRVJNQVNLID0gKFBTUl9JQ0MpCi1QU0xfVUJJVFMgPSAoUFNSX0lDQ3xQU1JfRUYpCi1kZWYgVVNFUk1PREUocHMpOiByZXR1cm4gKCgocHMpICYgUFNSX1BTKSA9PSAwKQotCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvZnNyLmgKLUZTUl9DRVhDID0gMHgwMDAwMDAxZgotRlNSX0FFWEMgPSAweDAwMDAwM2UwCi1GU1JfRkNDID0gMHgwMDAwMGMwMAotRlNSX1BSID0gMHgwMDAwMTAwMAotRlNSX1FORSA9IDB4MDAwMDIwMDAKLUZTUl9GVFQgPSAweDAwMDFjMDAwCi1GU1JfVkVSID0gMHgwMDBlMDAwMAotRlNSX1RFTSA9IDB4MGY4MDAwMDAKLUZTUl9SUCA9IDB4MzAwMDAwMDAKLUZTUl9SRCA9IDB4YzAwMDAwMDAKLUZTUl9WRVJfU0hJRlQgPSAxNwotRlNSX0ZDQzEgPSAweDAwMDAwMDAzCi1GU1JfRkNDMiA9IDB4MDAwMDAwMEMKLUZTUl9GQ0MzID0gMHgwMDAwMDAzMAotRlNSX0NFWENfTlggPSAweDAwMDAwMDAxCi1GU1JfQ0VYQ19EWiA9IDB4MDAwMDAwMDIKLUZTUl9DRVhDX1VGID0gMHgwMDAwMDAwNAotRlNSX0NFWENfT0YgPSAweDAwMDAwMDA4Ci1GU1JfQ0VYQ19OViA9IDB4MDAwMDAwMTAKLUZTUl9BRVhDX05YID0gKDB4MSA8PCA1KQotRlNSX0FFWENfRFogPSAoMHgyIDw8IDUpCi1GU1JfQUVYQ19VRiA9ICgweDQgPDwgNSkKLUZTUl9BRVhDX09GID0gKDB4OCA8PCA1KQotRlNSX0FFWENfTlYgPSAoMHgxMCA8PCA1KQotRlRUX05PTkUgPSAwCi1GVFRfSUVFRSA9IDEKLUZUVF9VTkZJTiA9IDIKLUZUVF9VTklNUCA9IDMKLUZUVF9TRVEgPSA0Ci1GVFRfQUxJR04gPSA1Ci1GVFRfREZBVUxUID0gNgotRlNSX0ZUVF9TSElGVCA9IDE0Ci1GU1JfRlRUX0lFRUUgPSAoRlRUX0lFRUUgICA8PCBGU1JfRlRUX1NISUZUKQotRlNSX0ZUVF9VTkZJTiA9IChGVFRfVU5GSU4gIDw8IEZTUl9GVFRfU0hJRlQpCi1GU1JfRlRUX1VOSU1QID0gKEZUVF9VTklNUCAgPDwgRlNSX0ZUVF9TSElGVCkKLUZTUl9GVFRfU0VRID0gKEZUVF9TRVEgICAgPDwgRlNSX0ZUVF9TSElGVCkKLUZTUl9GVFRfQUxJR04gPSAoRlRUX0FMSUdOICA8PCBGU1JfRlRUX1NISUZUKQotRlNSX0ZUVF9ERkFVTFQgPSAoRlRUX0RGQVVMVCA8PCBGU1JfRlRUX1NISUZUKQotRlNSX1RFTV9OWCA9ICgweDEgPDwgMjMpCi1GU1JfVEVNX0RaID0gKDB4MiA8PCAyMykKLUZTUl9URU1fVUYgPSAoMHg0IDw8IDIzKQotRlNSX1RFTV9PRiA9ICgweDggPDwgMjMpCi1GU1JfVEVNX05WID0gKDB4MTAgPDwgMjMpCi1SUF9EQkxFWFQgPSAwCi1SUF9TSU5HTEUgPSAxCi1SUF9ET1VCTEUgPSAyCi1SUF9SRVNFUlZFRCA9IDMKLVJEX05FQVIgPSAwCi1SRF9aRVIwID0gMQotUkRfUE9TSU5GID0gMgotUkRfTkVHSU5GID0gMwotRlBSU19ETCA9IDB4MQotRlBSU19EVSA9IDB4MgotRlBSU19GRUYgPSAweDQKLVBJTF9NQVggPSAweGYKLWRlZiBTQVZFX0dMT0JBTFMoUlApOiByZXR1cm4gXAotCi1kZWYgUkVTVE9SRV9HTE9CQUxTKFJQKTogcmV0dXJuIFwKLQotZGVmIFNBVkVfT1VUUyhSUCk6IHJldHVybiBcCi0KLWRlZiBSRVNUT1JFX09VVFMoUlApOiByZXR1cm4gXAotCi1kZWYgU0FWRV9XSU5ET1coU0JQKTogcmV0dXJuIFwKLQotZGVmIFJFU1RPUkVfV0lORE9XKFNCUCk6IHJldHVybiBcCi0KLWRlZiBTVE9SRV9GUFJFR1MoRlApOiByZXR1cm4gXAotCi1kZWYgTE9BRF9GUFJFR1MoRlApOiByZXR1cm4gXAotCi1fU1BBUkNfTUFYUkVHV0lORE9XID0gMzEKLV9YUlNfSUQgPSAweDc4NzI3MzAwCi1HRVRDT05URVhUID0gMAotU0VUQ09OVEVYVCA9IDEKLVVDX1NJR01BU0sgPSAwbzAxCi1VQ19TVEFDSyA9IDBvMDIKLVVDX0NQVSA9IDBvMDQKLVVDX01BVSA9IDBvMTAKLVVDX0ZQVSA9IFVDX01BVQotVUNfSU5UUiA9IDBvMjAKLVVDX0FTUiA9IDBvNDAKLVVDX01DT05URVhUID0gKFVDX0NQVXxVQ19GUFV8VUNfQVNSKQotVUNfQUxMID0gKFVDX1NJR01BU0t8VUNfU1RBQ0t8VUNfTUNPTlRFWFQpCi1fU0lHUVVFVUVfTUFYID0gMzIKLV9TSUdOT1RJRllfTUFYID0gMzIKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9wY2IuaAotSU5TVFJfVkFMSUQgPSAweDAyCi1OT1JNQUxfU1RFUCA9IDB4MDQKLVdBVENIX1NURVAgPSAweDA4Ci1DUENfT1ZFUkZMT1cgPSAweDEwCi1BU1lOQ19IV0VSUiA9IDB4MjAKLVNURVBfTk9ORSA9IDAKLVNURVBfUkVRVUVTVEVEID0gMQotU1RFUF9BQ1RJVkUgPSAyCi1TVEVQX1dBU0FDVElWRSA9IDMKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9tc2FjY3QuaAotTE1TX1VTRVIgPSAwCi1MTVNfU1lTVEVNID0gMQotTE1TX1RSQVAgPSAyCi1MTVNfVEZBVUxUID0gMwotTE1TX0RGQVVMVCA9IDQKLUxNU19LRkFVTFQgPSA1Ci1MTVNfVVNFUl9MT0NLID0gNgotTE1TX1NMRUVQID0gNwotTE1TX1dBSVRfQ1BVID0gOAotTE1TX1NUT1BQRUQgPSA5Ci1OTVNUQVRFUyA9IDEwCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvbHdwLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9zeW5jaC5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1VU1lOQ19USFJFQUQgPSAweDAwCi1VU1lOQ19QUk9DRVNTID0gMHgwMQotTE9DS19OT1JNQUwgPSAweDAwCi1MT0NLX0VSUk9SQ0hFQ0sgPSAweDAyCi1MT0NLX1JFQ1VSU0lWRSA9IDB4MDQKLVVTWU5DX1BST0NFU1NfUk9CVVNUID0gMHgwOAotTE9DS19QUklPX05PTkUgPSAweDAwCi1MT0NLX1BSSU9fSU5IRVJJVCA9IDB4MTAKLUxPQ0tfUFJJT19QUk9URUNUID0gMHgyMAotTE9DS19TVEFMTF9OUCA9IDB4MDAKLUxPQ0tfUk9CVVNUX05QID0gMHg0MAotTE9DS19PV05FUkRFQUQgPSAweDEKLUxPQ0tfTk9UUkVDT1ZFUkFCTEUgPSAweDIKLUxPQ0tfSU5JVEVEID0gMHg0Ci1MT0NLX1VOTUFQUEVEID0gMHg4Ci1MV1BfREVUQUNIRUQgPSAweDAwMDAwMDQwCi1MV1BfU1VTUEVOREVEID0gMHgwMDAwMDA4MAotX19MV1BfQVNMV1AgPSAweDAwMDAwMTAwCi1NQVhTWVNBUkdTID0gOAotTk9STUFMUkVUVVJOID0gMAotSlVTVFJFVFVSTiA9IDEKLUxXUF9VU0VSID0gMHgwMQotTFdQX1NZUyA9IDB4MDIKLVRTX0ZSRUUgPSAweDAwCi1UU19TTEVFUCA9IDB4MDEKLVRTX1JVTiA9IDB4MDIKLVRTX09OUFJPQyA9IDB4MDQKLVRTX1pPTUIgPSAweDA4Ci1UU19TVE9QUEVEID0gMHgxMAotVF9JTlRSX1RIUkVBRCA9IDB4MDAwMQotVF9XQUtFQUJMRSA9IDB4MDAwMgotVF9UT01BU0sgPSAweDAwMDQKLVRfVEFMTE9DU1RLID0gMHgwMDA4Ci1UX1dPVUxEQkxPQ0sgPSAweDAwMjAKLVRfRE9OVEJMT0NLID0gMHgwMDQwCi1UX0RPTlRQRU5EID0gMHgwMDgwCi1UX1NZU19QUk9GID0gMHgwMTAwCi1UX1dBSVRDVlNFTSA9IDB4MDIwMAotVF9XQVRDSFBUID0gMHgwNDAwCi1UX1BBTklDID0gMHgwODAwCi1UUF9IT0xETFdQID0gMHgwMDAyCi1UUF9UV0FJVCA9IDB4MDAwNAotVFBfTFdQRVhJVCA9IDB4MDAwOAotVFBfUFJTVE9QID0gMHgwMDEwCi1UUF9DSEtQVCA9IDB4MDAyMAotVFBfRVhJVExXUCA9IDB4MDA0MAotVFBfUFJWU1RPUCA9IDB4MDA4MAotVFBfTVNBQ0NUID0gMHgwMTAwCi1UUF9TVE9QUElORyA9IDB4MDIwMAotVFBfV0FUQ0hQVCA9IDB4MDQwMAotVFBfUEFVU0UgPSAweDA4MDAKLVRQX0NIQU5HRUJJTkQgPSAweDEwMDAKLVRTX0xPQUQgPSAweDAwMDEKLVRTX0RPTlRfU1dBUCA9IDB4MDAwMgotVFNfU1dBUEVOUSA9IDB4MDAwNAotVFNfT05fU1dBUFEgPSAweDAwMDgKLVRTX0NTVEFSVCA9IDB4MDEwMAotVFNfVU5QQVVTRSA9IDB4MDIwMAotVFNfWFNUQVJUID0gMHgwNDAwCi1UU19QU1RBUlQgPSAweDA4MDAKLVRTX1JFU1VNRSA9IDB4MTAwMAotVFNfQ1JFQVRFID0gMHgyMDAwCi1UU19BTExTVEFSVCA9IFwKLSAgICAgICAgKFRTX0NTVEFSVHxUU19VTlBBVVNFfFRTX1hTVEFSVHxUU19QU1RBUlR8VFNfUkVTVU1FfFRTX0NSRUFURSkKLWRlZiBDUFJfVlNUT1BQRUQodCk6IHJldHVybiBcCi0KLWRlZiBUSFJFQURfVFJBTlNJVElPTih0cCk6IHJldHVybiB0aHJlYWRfdHJhbnNpdGlvbih0cCk7Ci0KLWRlZiBUSFJFQURfU1RPUCh0cCk6IHJldHVybiBcCi0KLWRlZiBUSFJFQURfWk9NQih0cCk6IHJldHVybiBUSFJFQURfU0VUX1NUQVRFKHRwLCBUU19aT01CLCBOVUxMKQotCi1kZWYgU0VNQV9IRUxEKHgpOiByZXR1cm4gKHNlbWFfaGVsZCgoeCkpKQotCi1OT19MT0NLU19IRUxEID0gMQotTk9fQ09NUEVUSU5HX1RIUkVBRFMgPSAxCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvY3JlZC5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdWlvLmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9yZXNvdXJjZS5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1QUklPX1BST0NFU1MgPSAwCi1QUklPX1BHUlAgPSAxCi1QUklPX1VTRVIgPSAyCi1STElNSVRfQ1BVID0gMAotUkxJTUlUX0ZTSVpFID0gMQotUkxJTUlUX0RBVEEgPSAyCi1STElNSVRfU1RBQ0sgPSAzCi1STElNSVRfQ09SRSA9IDQKLVJMSU1JVF9OT0ZJTEUgPSA1Ci1STElNSVRfVk1FTSA9IDYKLVJMSU1JVF9BUyA9IFJMSU1JVF9WTUVNCi1STElNX05MSU1JVFMgPSA3Ci1STElNX0lORklOSVRZID0gKC0zKQotUkxJTV9TQVZFRF9NQVggPSAoLTIpCi1STElNX1NBVkVEX0NVUiA9ICgtMSkKLVJMSU1fSU5GSU5JVFkgPSAweDdmZmZmZmZmCi1STElNX1NBVkVEX01BWCA9IDB4N2ZmZmZmZmUKLVJMSU1fU0FWRURfQ1VSID0gMHg3ZmZmZmZmZAotUkxJTTMyX0lORklOSVRZID0gMHg3ZmZmZmZmZgotUkxJTTMyX1NBVkVEX01BWCA9IDB4N2ZmZmZmZmUKLVJMSU0zMl9TQVZFRF9DVVIgPSAweDdmZmZmZmZkCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvbW9kZWwuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2RlYnVnLmgKLWRlZiBBU1NFUlQ2NCh4KTogcmV0dXJuIEFTU0VSVCh4KQotCi1kZWYgQVNTRVJUMzIoeCk6IHJldHVybiBBU1NFUlQoeCkKLQotREFUQU1PREVMX01BU0sgPSAweDBGRjAwMDAwCi1EQVRBTU9ERUxfSUxQMzIgPSAweDAwMTAwMDAwCi1EQVRBTU9ERUxfTFA2NCA9IDB4MDAyMDAwMDAKLURBVEFNT0RFTF9OT05FID0gMAotREFUQU1PREVMX05BVElWRSA9IERBVEFNT0RFTF9MUDY0Ci1EQVRBTU9ERUxfTkFUSVZFID0gREFUQU1PREVMX0lMUDMyCi1kZWYgU1RSVUNUX1NJWkUoaGFuZGxlKTogcmV0dXJuIFwKLQotZGVmIFNUUlVDVF9CVUYoaGFuZGxlKTogcmV0dXJuICgoaGFuZGxlKS5wdHIubTY0KQotCi1kZWYgU0laRU9GX1BUUih1bW9kZWwpOiByZXR1cm4gXAotCi1kZWYgU1RSVUNUX1NJWkUoaGFuZGxlKTogcmV0dXJuIChzaXplb2YgKCooaGFuZGxlKS5wdHIpKQotCi1kZWYgU1RSVUNUX0JVRihoYW5kbGUpOiByZXR1cm4gKChoYW5kbGUpLnB0cikKLQotZGVmIFNJWkVPRl9QVFIodW1vZGVsKTogcmV0dXJuIHNpemVvZiAoY2FkZHJfdCkKLQotZGVmIGx3cF9nZXRkYXRhbW9kZWwodCk6IHJldHVybiBEQVRBTU9ERUxfSUxQMzIKLQotUlVTQUdFX1NFTEYgPSAwCi1SVVNBR0VfQ0hJTERSRU4gPSAtMQotCi0jIEluY2x1ZGVkIGZyb20gdm0vc2VnX2VudW0uaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2J1Zi5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMva3N0YXQuaAotZnJvbSBUWVBFUyBpbXBvcnQgKgotS1NUQVRfU1RSTEVOID0gMzEKLWRlZiBLU1RBVF9FTlRFUihrKTogcmV0dXJuIFwKLQotZGVmIEtTVEFUX0VYSVQoayk6IHJldHVybiBcCi0KLUtTVEFUX1RZUEVfUkFXID0gMAotS1NUQVRfVFlQRV9OQU1FRCA9IDEKLUtTVEFUX1RZUEVfSU5UUiA9IDIKLUtTVEFUX1RZUEVfSU8gPSAzCi1LU1RBVF9UWVBFX1RJTUVSID0gNAotS1NUQVRfTlVNX1RZUEVTID0gNQotS1NUQVRfRkxBR19WSVJUVUFMID0gMHgwMQotS1NUQVRfRkxBR19WQVJfU0laRSA9IDB4MDIKLUtTVEFUX0ZMQUdfV1JJVEFCTEUgPSAweDA0Ci1LU1RBVF9GTEFHX1BFUlNJU1RFTlQgPSAweDA4Ci1LU1RBVF9GTEFHX0RPUk1BTlQgPSAweDEwCi1LU1RBVF9GTEFHX0lOVkFMSUQgPSAweDIwCi1LU1RBVF9SRUFEID0gMAotS1NUQVRfV1JJVEUgPSAxCi1LU1RBVF9EQVRBX0NIQVIgPSAwCi1LU1RBVF9EQVRBX0lOVDMyID0gMQotS1NUQVRfREFUQV9VSU5UMzIgPSAyCi1LU1RBVF9EQVRBX0lOVDY0ID0gMwotS1NUQVRfREFUQV9VSU5UNjQgPSA0Ci1LU1RBVF9EQVRBX0xPTkcgPSBLU1RBVF9EQVRBX0lOVDMyCi1LU1RBVF9EQVRBX1VMT05HID0gS1NUQVRfREFUQV9VSU5UMzIKLUtTVEFUX0RBVEFfTE9ORyA9IEtTVEFUX0RBVEFfSU5UNjQKLUtTVEFUX0RBVEFfVUxPTkcgPSBLU1RBVF9EQVRBX1VJTlQ2NAotS1NUQVRfREFUQV9MT05HID0gNwotS1NUQVRfREFUQV9VTE9ORyA9IDgKLUtTVEFUX0RBVEFfTE9OR0xPTkcgPSBLU1RBVF9EQVRBX0lOVDY0Ci1LU1RBVF9EQVRBX1VMT05HTE9ORyA9IEtTVEFUX0RBVEFfVUlOVDY0Ci1LU1RBVF9EQVRBX0ZMT0FUID0gNQotS1NUQVRfREFUQV9ET1VCTEUgPSA2Ci1LU1RBVF9JTlRSX0hBUkQgPSAwCi1LU1RBVF9JTlRSX1NPRlQgPSAxCi1LU1RBVF9JTlRSX1dBVENIRE9HID0gMgotS1NUQVRfSU5UUl9TUFVSSU9VUyA9IDMKLUtTVEFUX0lOVFJfTVVMVFNWQyA9IDQKLUtTVEFUX05VTV9JTlRSUyA9IDUKLUJfQlVTWSA9IDB4MDAwMQotQl9ET05FID0gMHgwMDAyCi1CX0VSUk9SID0gMHgwMDA0Ci1CX1BBR0VJTyA9IDB4MDAxMAotQl9QSFlTID0gMHgwMDIwCi1CX1JFQUQgPSAweDAwNDAKLUJfV1JJVEUgPSAweDAxMDAKLUJfS0VSTkJVRiA9IDB4MDAwOAotQl9XQU5URUQgPSAweDAwODAKLUJfQUdFID0gMHgwMDAyMDAKLUJfQVNZTkMgPSAweDAwMDQwMAotQl9ERUxXUkkgPSAweDAwMDgwMAotQl9TVEFMRSA9IDB4MDAxMDAwCi1CX0RPTlRORUVEID0gMHgwMDIwMDAKLUJfUkVNQVBQRUQgPSAweDAwNDAwMAotQl9GUkVFID0gMHgwMDgwMDAKLUJfSU5WQUwgPSAweDAxMDAwMAotQl9GT1JDRSA9IDB4MDIwMDAwCi1CX0hFQUQgPSAweDA0MDAwMAotQl9OT0NBQ0hFID0gMHgwODAwMDAKLUJfVFJVTkMgPSAweDEwMDAwMAotQl9TSEFET1cgPSAweDIwMDAwMAotQl9SRVRSWVdSSSA9IDB4NDAwMDAwCi1kZWYgbm90YXZhaWwoYnApOiByZXR1cm4gXAotCi1kZWYgQldSSVRFKGJwKTogcmV0dXJuIFwKLQotZGVmIEJXUklURTIoYnApOiByZXR1cm4gXAotCi1WUk9PVCA9IDB4MDEKLVZOT0NBQ0hFID0gMHgwMgotVk5PTUFQID0gMHgwNAotVkRVUCA9IDB4MDgKLVZOT1NXQVAgPSAweDEwCi1WTk9NT1VOVCA9IDB4MjAKLVZJU1NXQVAgPSAweDQwCi1WU1dBUExJS0UgPSAweDgwCi1WVkZTTE9DSyA9IDB4MTAwCi1WVkZTV0FJVCA9IDB4MjAwCi1WVk1MT0NLID0gMHg0MDAKLVZESVJPUEVOID0gMHg4MDAKLVZWTUVYRUMgPSAweDEwMDAKLVZQWEZTID0gMHgyMDAwCi1BVF9UWVBFID0gMHgwMDAxCi1BVF9NT0RFID0gMHgwMDAyCi1BVF9VSUQgPSAweDAwMDQKLUFUX0dJRCA9IDB4MDAwOAotQVRfRlNJRCA9IDB4MDAxMAotQVRfTk9ERUlEID0gMHgwMDIwCi1BVF9OTElOSyA9IDB4MDA0MAotQVRfU0laRSA9IDB4MDA4MAotQVRfQVRJTUUgPSAweDAxMDAKLUFUX01USU1FID0gMHgwMjAwCi1BVF9DVElNRSA9IDB4MDQwMAotQVRfUkRFViA9IDB4MDgwMAotQVRfQkxLU0laRSA9IDB4MTAwMAotQVRfTkJMT0NLUyA9IDB4MjAwMAotQVRfVkNPREUgPSAweDQwMDAKLUFUX0FMTCA9IChBVF9UWVBFfEFUX01PREV8QVRfVUlEfEFUX0dJRHxBVF9GU0lEfEFUX05PREVJRHxcCi0gICAgICAgICAgICAgICAgICAgICAgICBBVF9OTElOS3xBVF9TSVpFfEFUX0FUSU1FfEFUX01USU1FfEFUX0NUSU1FfFwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUX1JERVZ8QVRfQkxLU0laRXxBVF9OQkxPQ0tTfEFUX1ZDT0RFKQotQVRfU1RBVCA9IChBVF9NT0RFfEFUX1VJRHxBVF9HSUR8QVRfRlNJRHxBVF9OT0RFSUR8QVRfTkxJTkt8XAotICAgICAgICAgICAgICAgICAgICAgICAgQVRfU0laRXxBVF9BVElNRXxBVF9NVElNRXxBVF9DVElNRXxBVF9SREVWKQotQVRfVElNRVMgPSAoQVRfQVRJTUV8QVRfTVRJTUV8QVRfQ1RJTUUpCi1BVF9OT1NFVCA9IChBVF9OTElOS3xBVF9SREVWfEFUX0ZTSUR8QVRfTk9ERUlEfEFUX1RZUEV8XAotICAgICAgICAgICAgICAgICAgICAgICAgQVRfQkxLU0laRXxBVF9OQkxPQ0tTfEFUX1ZDT0RFKQotVlNVSUQgPSAwbzQwMDAKLVZTR0lEID0gMG8yMDAwCi1WU1ZUWCA9IDBvMTAwMAotVlJFQUQgPSAwbzA0MDAKLVZXUklURSA9IDBvMDIwMAotVkVYRUMgPSAwbzAxMDAKLU1PREVNQVNLID0gMG83Nzc3Ci1QRVJNTUFTSyA9IDBvMDc3NwotZGVmIE1BTkRNT0RFKG1vZGUpOiByZXR1cm4gKCgobW9kZSkgJiAoVlNHSUR8KFZFWEVDPj4zKSkpID09IFZTR0lEKQotCi1WU0FfQUNMID0gMHgwMDAxCi1WU0FfQUNMQ05UID0gMHgwMDAyCi1WU0FfREZBQ0wgPSAweDAwMDQKLVZTQV9ERkFDTENOVCA9IDB4MDAwOAotTE9PS1VQX0RJUiA9IDB4MDEKLURVTVBfQUxMT0MgPSAwCi1EVU1QX0ZSRUUgPSAxCi1EVU1QX1NDQU4gPSAyCi1BVFRSX1VUSU1FID0gMHgwMQotQVRUUl9FWEVDID0gMHgwMgotQVRUUl9DT01NID0gMHgwNAotQVRUUl9ISU5UID0gMHgwOAotQVRUUl9SRUFMID0gMHgxMAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3BvbGwuaAotUE9MTElOID0gMHgwMDAxCi1QT0xMUFJJID0gMHgwMDAyCi1QT0xMT1VUID0gMHgwMDA0Ci1QT0xMUkROT1JNID0gMHgwMDQwCi1QT0xMV1JOT1JNID0gUE9MTE9VVAotUE9MTFJEQkFORCA9IDB4MDA4MAotUE9MTFdSQkFORCA9IDB4MDEwMAotUE9MTE5PUk0gPSBQT0xMUkROT1JNCi1QT0xMRVJSID0gMHgwMDA4Ci1QT0xMSFVQID0gMHgwMDEwCi1QT0xMTlZBTCA9IDB4MDAyMAotUE9MTFJFTU9WRSA9IDB4MDgwMAotUE9MTFJEREFUQSA9IDB4MDIwMAotUE9MTE5PRVJSID0gMHgwNDAwCi1QT0xMQ0xPU0VEID0gMHg4MDAwCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvc3RybWRlcC5oCi1kZWYgc3RyX2FsaWduZWQoWCk6IHJldHVybiAoKCh1bG9uZ190KShYKSAmIChzaXplb2YgKGludCkgLSAxKSkgPT0gMCkKLQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3N0cmZ0LmgKLXRkZWx0YV90X3N6ID0gMTIKLUZURVZfTUFTSyA9IDB4MUZGRgotRlRFVl9JU1dSID0gMHg4MDAwCi1GVEVWX0NTID0gMHg0MDAwCi1GVEVWX1BTID0gMHgyMDAwCi1GVEVWX1FNQVNLID0gMHgxRjAwCi1GVEVWX0FMTE9DTUFTSyA9IDB4MUZGOAotRlRFVl9BTExPQ0IgPSAweDAwMDAKLUZURVZfRVNCQUxMT0MgPSAweDAwMDEKLUZURVZfREVTQkFMTE9DID0gMHgwMDAyCi1GVEVWX0VTQkFMTE9DQSA9IDB4MDAwMwotRlRFVl9ERVNCQUxMT0NBID0gMHgwMDA0Ci1GVEVWX0FMTE9DQklHID0gMHgwMDA1Ci1GVEVWX0FMTE9DQlcgPSAweDAwMDYKLUZURVZfRlJFRUIgPSAweDAwMDgKLUZURVZfRFVQQiA9IDB4MDAwOQotRlRFVl9DT1BZQiA9IDB4MDAwQQotRlRFVl9DQUxMRVIgPSAweDAwMEYKLUZURVZfUFVUID0gMHgwMTAwCi1GVEVWX0ZTWU5DUSA9IDB4MDEwMwotRlRFVl9EU1lOQ1EgPSAweDAxMDQKLUZURVZfUFVUUSA9IDB4MDEwNQotRlRFVl9HRVRRID0gMHgwMTA2Ci1GVEVWX1JNVlEgPSAweDAxMDcKLUZURVZfSU5TUSA9IDB4MDEwOAotRlRFVl9QVVRCUSA9IDB4MDEwOQotRlRFVl9GTFVTSFEgPSAweDAxMEEKLUZURVZfUkVQTFlRID0gMHgwMTBCCi1GVEVWX1BVVE5FWFQgPSAweDAxMEQKLUZURVZfUldORVhUID0gMHgwMTBFCi1GVEVWX1FXSU5ORVIgPSAweDAxMEYKLUZURVZfR0VXUklURSA9IDB4MDEwMQotZGVmIEZURkxXX0hBU0goaCk6IHJldHVybiAoKCh1bnNpZ25lZCkoaCkpJWZ0Zmx3X2hhc2hfc3opCi0KLUZUQkxLX0VWTlRTID0gMHg5Ci1RRU5BQiA9IDB4MDAwMDAwMDEKLVFXQU5UUiA9IDB4MDAwMDAwMDIKLVFXQU5UVyA9IDB4MDAwMDAwMDQKLVFGVUxMID0gMHgwMDAwMDAwOAotUVJFQURSID0gMHgwMDAwMDAxMAotUVVTRSA9IDB4MDAwMDAwMjAKLVFOT0VOQiA9IDB4MDAwMDAwNDAKLVFCQUNLID0gMHgwMDAwMDEwMAotUUhMSVNUID0gMHgwMDAwMDIwMAotUVBBSVIgPSAweDAwMDAwODAwCi1RUEVSUSA9IDB4MDAwMDEwMDAKLVFQRVJNT0QgPSAweDAwMDAyMDAwCi1RTVRTQUZFID0gMHgwMDAwNDAwMAotUU1UT1VUUEVSSU0gPSAweDAwMDA4MDAwCi1RTVRfVFlQRU1BU0sgPSAoUVBBSVJ8UVBFUlF8UVBFUk1PRHxRTVRTQUZFfFFNVE9VVFBFUklNKQotUUlOU0VSVklDRSA9IDB4MDAwMTAwMDAKLVFXQ0xPU0UgPSAweDAwMDIwMDAwCi1RRU5EID0gMHgwMDA0MDAwMAotUVdBTlRXU1lOQyA9IDB4MDAwODAwMDAKLVFTWU5DU1RSID0gMHgwMDEwMDAwMAotUUlTRFJWID0gMHgwMDIwMDAwMAotUUhPVCA9IDB4MDA0MDAwMDAKLVFORVhUSE9UID0gMHgwMDgwMDAwMAotX1FJTlNFUlRJTkcgPSAweDA0MDAwMDAwCi1fUVJFTU9WSU5HID0gMHgwODAwMDAwMAotUV9TUVFVRVVFRCA9IDB4MDEKLVFfU1FEUkFJTklORyA9IDB4MDIKLVFCX0ZVTEwgPSAweDAxCi1RQl9XQU5UVyA9IDB4MDIKLVFCX0JBQ0sgPSAweDA0Ci1OQkFORCA9IDI1NgotU1RSVUlPVF9OT05FID0gLTEKLVNUUlVJT1RfRE9OVENBUkUgPSAwCi1TVFJVSU9UX1NUQU5EQVJEID0gMQotU1RSVUlPVF9JUCA9IDIKLURCTEtfUkVGTUlOID0gMHgwMQotU1RSVUlPX1NQRUMgPSAweDAxCi1TVFJVSU9fRE9ORSA9IDB4MDIKLVNUUlVJT19JUCA9IDB4MDQKLVNUUlVJT19aQyA9IDB4MDgKLVNUUlVJT19JQ0sgPSAweDEwCi1NU0dNQVJLID0gMHgwMQotTVNHTk9MT09QID0gMHgwMgotTVNHREVMSU0gPSAweDA0Ci1NU0dOT0dFVCA9IDB4MDgKLU1TR01BUktORVhUID0gMHgxMAotTVNHTk9UTUFSS05FWFQgPSAweDIwCi1NX0RBVEEgPSAweDAwCi1NX1BST1RPID0gMHgwMQotTV9CUkVBSyA9IDB4MDgKLU1fUEFTU0ZQID0gMHgwOQotTV9FVkVOVCA9IDB4MGEKLU1fU0lHID0gMHgwYgotTV9ERUxBWSA9IDB4MGMKLU1fQ1RMID0gMHgwZAotTV9JT0NUTCA9IDB4MGUKLU1fU0VUT1BUUyA9IDB4MTAKLU1fUlNFID0gMHgxMQotTV9JT0NBQ0sgPSAweDgxCi1NX0lPQ05BSyA9IDB4ODIKLU1fUENQUk9UTyA9IDB4ODMKLU1fUENTSUcgPSAweDg0Ci1NX1JFQUQgPSAweDg1Ci1NX0ZMVVNIID0gMHg4NgotTV9TVE9QID0gMHg4NwotTV9TVEFSVCA9IDB4ODgKLU1fSEFOR1VQID0gMHg4OQotTV9FUlJPUiA9IDB4OGEKLU1fQ09QWUlOID0gMHg4YgotTV9DT1BZT1VUID0gMHg4YwotTV9JT0NEQVRBID0gMHg4ZAotTV9QQ1JTRSA9IDB4OGUKLU1fU1RPUEkgPSAweDhmCi1NX1NUQVJUSSA9IDB4OTAKLU1fUENFVkVOVCA9IDB4OTEKLU1fVU5IQU5HVVAgPSAweDkyCi1RTk9STSA9IDB4MDAKLVFQQ1RMID0gMHg4MAotSU9DX01PREVMUyA9IERBVEFNT0RFTF9NQVNLCi1JT0NfSUxQMzIgPSBEQVRBTU9ERUxfSUxQMzIKLUlPQ19MUDY0ID0gREFUQU1PREVMX0xQNjQKLUlPQ19OQVRJVkUgPSBEQVRBTU9ERUxfTkFUSVZFCi1JT0NfTk9ORSA9IERBVEFNT0RFTF9OT05FCi1TVFJDQU5PTiA9IDB4MDEKLVJFQ09QWSA9IDB4MDIKLVNPX0FMTCA9IDB4MDAzZgotU09fUkVBRE9QVCA9IDB4MDAwMQotU09fV1JPRkYgPSAweDAwMDIKLVNPX01JTlBTWiA9IDB4MDAwNAotU09fTUFYUFNaID0gMHgwMDA4Ci1TT19ISVdBVCA9IDB4MDAxMAotU09fTE9XQVQgPSAweDAwMjAKLVNPX01SRUFET04gPSAweDAwNDAKLVNPX01SRUFET0ZGID0gMHgwMDgwCi1TT19OREVMT04gPSAweDAxMDAKLVNPX05ERUxPRkYgPSAweDAyMDAKLVNPX0lTVFRZID0gMHgwNDAwCi1TT19JU05UVFkgPSAweDA4MDAKLVNPX1RPU1RPUCA9IDB4MTAwMAotU09fVE9OU1RPUCA9IDB4MjAwMAotU09fQkFORCA9IDB4NDAwMAotU09fREVMSU0gPSAweDgwMDAKLVNPX05PREVMSU0gPSAweDAxMDAwMAotU09fU1RSSE9MRCA9IDB4MDIwMDAwCi1TT19FUlJPUFQgPSAweDA0MDAwMAotU09fQ09QWU9QVCA9IDB4MDgwMDAwCi1TT19NQVhCTEsgPSAweDEwMDAwMAotREVGX0lPVl9NQVggPSAxNgotSU5GT0RfRklSU1RCWVRFUyA9IDB4MDIKLUlORk9EX0JZVEVTID0gMHgwNAotSU5GT0RfQ09VTlQgPSAweDA4Ci1JTkZPRF9DT1BZT1VUID0gMHgxMAotTU9ET1BFTiA9IDB4MQotQ0xPTkVPUEVOID0gMHgyCi1DT05TT1BFTiA9IDB4NAotT1BFTkZBSUwgPSAtMQotQlBSSV9MTyA9IDEKLUJQUklfTUVEID0gMgotQlBSSV9ISSA9IDMKLUJQUklfRlQgPSA0Ci1JTkZQU1ogPSAtMQotRkxVU0hBTEwgPSAxCi1GTFVTSERBVEEgPSAwCi1TVFJISUdIID0gNTEyMAotU1RSTE9XID0gMTAyNAotTUFYSU9DQlNaID0gMTAyNAotUEVSSU1fSU5ORVIgPSAxCi1QRVJJTV9PVVRFUiA9IDIKLWRlZiBkYXRhbXNnKHR5cGUpOiByZXR1cm4gXAotCi1kZWYgc3RyYWxuKGEpOiByZXR1cm4gKGNhZGRyX3QpKChpbnRwdHJfdCkoYSkgJiB+KHNpemVvZiAoaW50KS0xKSkKLQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2J5dGVvcmRlci5oCi1kZWYgbnRvaGwoeCk6IHJldHVybiAoeCkKLQotZGVmIG50b2hzKHgpOiByZXR1cm4gKHgpCi0KLWRlZiBodG9ubCh4KTogcmV0dXJuICh4KQotCi1kZWYgaHRvbnMoeCk6IHJldHVybiAoeCkKLQotSVBQUk9UT19JUCA9IDAKLUlQUFJPVE9fSE9QT1BUUyA9IDAKLUlQUFJPVE9fSUNNUCA9IDEKLUlQUFJPVE9fSUdNUCA9IDIKLUlQUFJPVE9fR0dQID0gMwotSVBQUk9UT19FTkNBUCA9IDQKLUlQUFJPVE9fVENQID0gNgotSVBQUk9UT19FR1AgPSA4Ci1JUFBST1RPX1BVUCA9IDEyCi1JUFBST1RPX1VEUCA9IDE3Ci1JUFBST1RPX0lEUCA9IDIyCi1JUFBST1RPX0lQVjYgPSA0MQotSVBQUk9UT19ST1VUSU5HID0gNDMKLUlQUFJPVE9fRlJBR01FTlQgPSA0NAotSVBQUk9UT19SU1ZQID0gNDYKLUlQUFJPVE9fRVNQID0gNTAKLUlQUFJPVE9fQUggPSA1MQotSVBQUk9UT19JQ01QVjYgPSA1OAotSVBQUk9UT19OT05FID0gNTkKLUlQUFJPVE9fRFNUT1BUUyA9IDYwCi1JUFBST1RPX0hFTExPID0gNjMKLUlQUFJPVE9fTkQgPSA3NwotSVBQUk9UT19FT04gPSA4MAotSVBQUk9UT19QSU0gPSAxMDMKLUlQUFJPVE9fUkFXID0gMjU1Ci1JUFBST1RPX01BWCA9IDI1NgotSVBQT1JUX0VDSE8gPSA3Ci1JUFBPUlRfRElTQ0FSRCA9IDkKLUlQUE9SVF9TWVNUQVQgPSAxMQotSVBQT1JUX0RBWVRJTUUgPSAxMwotSVBQT1JUX05FVFNUQVQgPSAxNQotSVBQT1JUX0ZUUCA9IDIxCi1JUFBPUlRfVEVMTkVUID0gMjMKLUlQUE9SVF9TTVRQID0gMjUKLUlQUE9SVF9USU1FU0VSVkVSID0gMzcKLUlQUE9SVF9OQU1FU0VSVkVSID0gNDIKLUlQUE9SVF9XSE9JUyA9IDQzCi1JUFBPUlRfTVRQID0gNTcKLUlQUE9SVF9CT09UUFMgPSA2NwotSVBQT1JUX0JPT1RQQyA9IDY4Ci1JUFBPUlRfVEZUUCA9IDY5Ci1JUFBPUlRfUkpFID0gNzcKLUlQUE9SVF9GSU5HRVIgPSA3OQotSVBQT1JUX1RUWUxJTksgPSA4NwotSVBQT1JUX1NVUERVUCA9IDk1Ci1JUFBPUlRfRVhFQ1NFUlZFUiA9IDUxMgotSVBQT1JUX0xPR0lOU0VSVkVSID0gNTEzCi1JUFBPUlRfQ01EU0VSVkVSID0gNTE0Ci1JUFBPUlRfRUZTU0VSVkVSID0gNTIwCi1JUFBPUlRfQklGRlVEUCA9IDUxMgotSVBQT1JUX1dIT1NFUlZFUiA9IDUxMwotSVBQT1JUX1JPVVRFU0VSVkVSID0gNTIwCi1JUFBPUlRfUkVTRVJWRUQgPSAxMDI0Ci1JUFBPUlRfVVNFUlJFU0VSVkVEID0gNTAwMAotSU1QTElOS19JUCA9IDE1NQotSU1QTElOS19MT1dFWFBFUiA9IDE1NgotSU1QTElOS19ISUdIRVhQRVIgPSAxNTgKLUlOX0NMQVNTQV9OU0hJRlQgPSAyNAotSU5fQ0xBU1NBX01BWCA9IDEyOAotSU5fQ0xBU1NCX05TSElGVCA9IDE2Ci1JTl9DTEFTU0JfTUFYID0gNjU1MzYKLUlOX0NMQVNTQ19OU0hJRlQgPSA4Ci1JTl9DTEFTU0RfTlNISUZUID0gMjgKLWRlZiBJTl9NVUxUSUNBU1QoaSk6IHJldHVybiBJTl9DTEFTU0QoaSkKLQotSU5fTE9PUEJBQ0tORVQgPSAxMjcKLWRlZiBJTl9TRVRfTE9PUEJBQ0tfQUREUihhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX1VOU1BFQ0lGSUVEKGFkZHIpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTE9PUEJBQ0soYWRkcik6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9MT09QQkFDSyhhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01VTFRJQ0FTVChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01VTFRJQ0FTVChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX0xJTktMT0NBTChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX0xJTktMT0NBTChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX1NJVEVMT0NBTChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX1NJVEVMT0NBTChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX1Y0TUFQUEVEKGFkZHIpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfVjRNQVBQRUQoYWRkcik6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9WNE1BUFBFRF9BTlkoYWRkcik6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9WNE1BUFBFRF9BTlkoYWRkcik6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9WNENPTVBBVChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX1Y0Q09NUEFUKGFkZHIpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfUkVTRVJWRUQoYWRkcik6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19SRVNFUlZFRChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX05PREVMT0NBTChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX05PREVMT0NBTChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0xJTktMT0NBTChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0xJTktMT0NBTChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX1NJVEVMT0NBTChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX1NJVEVMT0NBTChhZGRyKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX09SR0xPQ0FMKGFkZHIpOiByZXR1cm4gXAotCi1kZWYgSU42X0lTX0FERFJfTUNfT1JHTE9DQUwoYWRkcik6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19HTE9CQUwoYWRkcik6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19HTE9CQUwoYWRkcik6IHJldHVybiBcCi0KLUlQX09QVElPTlMgPSAxCi1JUF9IRFJJTkNMID0gMgotSVBfVE9TID0gMwotSVBfVFRMID0gNAotSVBfUkVDVk9QVFMgPSA1Ci1JUF9SRUNWUkVUT1BUUyA9IDYKLUlQX1JFQ1ZEU1RBRERSID0gNwotSVBfUkVUT1BUUyA9IDgKLUlQX01VTFRJQ0FTVF9JRiA9IDB4MTAKLUlQX01VTFRJQ0FTVF9UVEwgPSAweDExCi1JUF9NVUxUSUNBU1RfTE9PUCA9IDB4MTIKLUlQX0FERF9NRU1CRVJTSElQID0gMHgxMwotSVBfRFJPUF9NRU1CRVJTSElQID0gMHgxNAotSVBfU0VDX09QVCA9IDB4MjIKLUlQU0VDX1BSRUZfTkVWRVIgPSAweDAxCi1JUFNFQ19QUkVGX1JFUVVJUkVEID0gMHgwMgotSVBTRUNfUFJFRl9VTklRVUUgPSAweDA0Ci1JUF9BRERfUFJPWFlfQUREUiA9IDB4NDAKLUlQX0JPVU5EX0lGID0gMHg0MQotSVBfVU5TUEVDX1NSQyA9IDB4NDIKLUlQX1JFVVNFQUREUiA9IDB4MTA0Ci1JUF9ET05UUk9VVEUgPSAweDEwNQotSVBfQlJPQURDQVNUID0gMHgxMDYKLUlQX0RFRkFVTFRfTVVMVElDQVNUX1RUTCA9IDEKLUlQX0RFRkFVTFRfTVVMVElDQVNUX0xPT1AgPSAxCi1JUFY2X1JUSERSX1RZUEVfMCA9IDAKLUlQVjZfVU5JQ0FTVF9IT1BTID0gMHg1Ci1JUFY2X01VTFRJQ0FTVF9JRiA9IDB4NgotSVBWNl9NVUxUSUNBU1RfSE9QUyA9IDB4NwotSVBWNl9NVUxUSUNBU1RfTE9PUCA9IDB4OAotSVBWNl9KT0lOX0dST1VQID0gMHg5Ci1JUFY2X0xFQVZFX0dST1VQID0gMHhhCi1JUFY2X0FERF9NRU1CRVJTSElQID0gMHg5Ci1JUFY2X0RST1BfTUVNQkVSU0hJUCA9IDB4YQotSVBWNl9QS1RJTkZPID0gMHhiCi1JUFY2X0hPUExJTUlUID0gMHhjCi1JUFY2X05FWFRIT1AgPSAweGQKLUlQVjZfSE9QT1BUUyA9IDB4ZQotSVBWNl9EU1RPUFRTID0gMHhmCi1JUFY2X1JUSERSID0gMHgxMAotSVBWNl9SVEhEUkRTVE9QVFMgPSAweDExCi1JUFY2X1JFQ1ZQS1RJTkZPID0gMHgxMgotSVBWNl9SRUNWSE9QTElNSVQgPSAweDEzCi1JUFY2X1JFQ1ZIT1BPUFRTID0gMHgxNAotSVBWNl9SRUNWRFNUT1BUUyA9IDB4MTUKLUlQVjZfUkVDVlJUSERSID0gMHgxNgotSVBWNl9SRUNWUlRIRFJEU1RPUFRTID0gMHgxNwotSVBWNl9DSEVDS1NVTSA9IDB4MTgKLUlQVjZfQk9VTkRfSUYgPSAweDQxCi1JUFY2X1VOU1BFQ19TUkMgPSAweDQyCi1JTkVUX0FERFJTVFJMRU4gPSAxNgotSU5FVDZfQUREUlNUUkxFTiA9IDQ2Ci1JUFY2X1BBRDFfT1BUID0gMApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtc3Vub3M1L1NUUk9QVFMucHkgYi9MaWIvcGxhdC1zdW5vczUvU1RST1BUUy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3MzVjNC4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC1zdW5vczUvU1RST1BUUy5weQorKysgL2Rldi9udWxsCkBAIC0xLDE4MTMgKzAsMCBAQAotIyBHZW5lcmF0ZWQgYnkgaDJweSBmcm9tIC91c3IvaW5jbHVkZS9zeXMvc3Ryb3B0cy5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvZmVhdHVyZV90ZXN0cy5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvaXNhX2RlZnMuaAotX0NIQVJfQUxJR05NRU5UID0gMQotX1NIT1JUX0FMSUdOTUVOVCA9IDIKLV9JTlRfQUxJR05NRU5UID0gNAotX0xPTkdfQUxJR05NRU5UID0gOAotX0xPTkdfTE9OR19BTElHTk1FTlQgPSA4Ci1fRE9VQkxFX0FMSUdOTUVOVCA9IDgKLV9MT05HX0RPVUJMRV9BTElHTk1FTlQgPSAxNgotX1BPSU5URVJfQUxJR05NRU5UID0gOAotX01BWF9BTElHTk1FTlQgPSAxNgotX0FMSUdOTUVOVF9SRVFVSVJFRCA9IDEKLV9DSEFSX0FMSUdOTUVOVCA9IDEKLV9TSE9SVF9BTElHTk1FTlQgPSAyCi1fSU5UX0FMSUdOTUVOVCA9IDQKLV9MT05HX0FMSUdOTUVOVCA9IDQKLV9MT05HX0xPTkdfQUxJR05NRU5UID0gNAotX0RPVUJMRV9BTElHTk1FTlQgPSA0Ci1fTE9OR19ET1VCTEVfQUxJR05NRU5UID0gNAotX1BPSU5URVJfQUxJR05NRU5UID0gNAotX01BWF9BTElHTk1FTlQgPSA0Ci1fQUxJR05NRU5UX1JFUVVJUkVEID0gMAotX0NIQVJfQUxJR05NRU5UID0gMQotX1NIT1JUX0FMSUdOTUVOVCA9IDIKLV9JTlRfQUxJR05NRU5UID0gNAotX0xPTkdfTE9OR19BTElHTk1FTlQgPSA4Ci1fRE9VQkxFX0FMSUdOTUVOVCA9IDgKLV9BTElHTk1FTlRfUkVRVUlSRUQgPSAxCi1fTE9OR19BTElHTk1FTlQgPSA0Ci1fTE9OR19ET1VCTEVfQUxJR05NRU5UID0gOAotX1BPSU5URVJfQUxJR05NRU5UID0gNAotX01BWF9BTElHTk1FTlQgPSA4Ci1fTE9OR19BTElHTk1FTlQgPSA4Ci1fTE9OR19ET1VCTEVfQUxJR05NRU5UID0gMTYKLV9QT0lOVEVSX0FMSUdOTUVOVCA9IDgKLV9NQVhfQUxJR05NRU5UID0gMTYKLV9QT1NJWF9DX1NPVVJDRSA9IDEKLV9MQVJHRUZJTEU2NF9TT1VSQ0UgPSAxCi1fTEFSR0VGSUxFX1NPVVJDRSA9IDEKLV9GSUxFX09GRlNFVF9CSVRTID0gNjQKLV9GSUxFX09GRlNFVF9CSVRTID0gMzIKLV9QT1NJWF9DX1NPVVJDRSA9IDE5OTUwNgotX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTID0gMQotX1hPUEVOX1ZFUlNJT04gPSA1MDAKLV9YT1BFTl9WRVJTSU9OID0gNAotX1hPUEVOX1ZFUlNJT04gPSAzCi1mcm9tIFRZUEVTIGltcG9ydCAqCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvY29uZi5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdF9sb2NrLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9tYWNobG9jay5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1MT0NLX0hFTERfVkFMVUUgPSAweGZmCi1kZWYgU1BJTl9MT0NLKHBsKTogcmV0dXJuICgocGwpID4gaXBsdG9zcGwoTE9DS19MRVZFTCkpCi0KLWRlZiBMT0NLX1NBTVBMRV9JTlRFUlZBTChpKTogcmV0dXJuICgoKGkpICYgMHhmZikgPT0gMCkKLQotQ0xPQ0tfTEVWRUwgPSAxMAotTE9DS19MRVZFTCA9IDEwCi1ESVNQX0xFVkVMID0gKExPQ0tfTEVWRUwgKyAxKQotUFRSMjRfTFNCID0gNQotUFRSMjRfTVNCID0gKFBUUjI0X0xTQiArIDI0KQotUFRSMjRfQUxJR04gPSAzMgotUFRSMjRfQkFTRSA9IDB4ZTAwMDAwMDAKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9wYXJhbS5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1fUE9TSVhfVkRJU0FCTEUgPSAwCi1NQVhfSU5QVVQgPSA1MTIKLU1BWF9DQU5PTiA9IDI1NgotVUlEX05PQk9EWSA9IDYwMDAxCi1HSURfTk9CT0RZID0gVUlEX05PQk9EWQotVUlEX05PQUNDRVNTID0gNjAwMDIKLU1BWF9UQVNLSUQgPSA5OTk5OTkKLU1BWF9NQVhQSUQgPSA5OTk5OTkKLURFRkFVTFRfTUFYUElEID0gOTk5OTk5Ci1ERUZBVUxUX0pVTVBQSUQgPSAxMDAwMDAKLURFRkFVTFRfTUFYUElEID0gMzAwMDAKLURFRkFVTFRfSlVNUFBJRCA9IDAKLU1BWFVJRCA9IDIxNDc0ODM2NDcKLU1BWFBST0pJRCA9IE1BWFVJRAotTUFYTElOSyA9IDMyNzY3Ci1OTU9VTlQgPSA0MAotQ0FOQlNJWiA9IDI1NgotTk9GSUxFID0gMjAKLU5HUk9VUFNfVU1JTiA9IDAKLU5HUk9VUFNfVU1BWCA9IDMyCi1OR1JPVVBTX01BWF9ERUZBVUxUID0gMTYKLU5aRVJPID0gMjAKLU5VTEwgPSAwCi1OVUxMID0gMAotQ01BU0sgPSAwbzIyCi1DRExJTUlUID0gKDE8PDExKQotTkJQUyA9IDB4MjAwMDAKLU5CUFNDVFIgPSA1MTIKLVVCU0laRSA9IDUxMgotU0NUUlNIRlQgPSA5Ci1TWVNOQU1FID0gOQotUFJFTU9URSA9IDM5Ci1NQVhQQVRITEVOID0gMTAyNAotTUFYU1lNTElOS1MgPSAyMAotTUFYTkFNRUxFTiA9IDI1NgotTkFERFIgPSAxMwotUElQRV9CVUYgPSA1MTIwCi1QSVBFX01BWCA9IDUxMjAKLU5CQlkgPSA4Ci1NQVhCU0laRSA9IDgxOTIKLURFVl9CU0laRSA9IDUxMgotREVWX0JTSElGVCA9IDkKLU1BWEZSQUcgPSA4Ci1NQVhPRkYzMl9UID0gMHg3ZmZmZmZmZgotTUFYT0ZGX1QgPSAweDdmZmZmZmZmZmZmZmZmZmYKLU1BWE9GRlNFVF9UID0gMHg3ZmZmZmZmZmZmZmZmZmZmCi1NQVhPRkZfVCA9IDB4N2ZmZmZmZmYKLU1BWE9GRlNFVF9UID0gMHg3ZmZmZmZmZgotZGVmIGJ0b2RiKGJ5dGVzKTogcmV0dXJuICAgXAotCi1kZWYgZGJ0b2IoZGIpOiByZXR1cm4gICBcCi0KLWRlZiBsYnRvZGIoYnl0ZXMpOiByZXR1cm4gICBcCi0KLWRlZiBsZGJ0b2IoZGIpOiByZXR1cm4gICBcCi0KLU5DQVJHUzMyID0gMHgxMDAwMDAKLU5DQVJHUzY0ID0gMHgyMDAwMDAKLU5DQVJHUyA9IE5DQVJHUzY0Ci1OQ0FSR1MgPSBOQ0FSR1MzMgotRlNISUZUID0gOAotRlNDQUxFID0gKDE8PEZTSElGVCkKLWRlZiBERUxBWShuKTogcmV0dXJuIGRydl91c2Vjd2FpdChuKQotCi1kZWYgbW11X3B0b2IoeCk6IHJldHVybiAoKHgpIDw8IE1NVV9QQUdFU0hJRlQpCi0KLWRlZiBtbXVfYnRvcCh4KTogcmV0dXJuICgoKHgpKSA+PiBNTVVfUEFHRVNISUZUKQotCi1kZWYgbW11X2J0b3ByKHgpOiByZXR1cm4gKCgoKHgpICsgTU1VX1BBR0VPRkZTRVQpID4+IE1NVV9QQUdFU0hJRlQpKQotCi1kZWYgbW11X3B0b2QoeCk6IHJldHVybiAoKHgpIDw8IChNTVVfUEFHRVNISUZUIC0gREVWX0JTSElGVCkpCi0KLWRlZiBwdG9kKHgpOiByZXR1cm4gKCh4KSA8PCAoUEFHRVNISUZUIC0gREVWX0JTSElGVCkpCi0KLWRlZiBwdG9iKHgpOiByZXR1cm4gKCh4KSA8PCBQQUdFU0hJRlQpCi0KLWRlZiBidG9wKHgpOiByZXR1cm4gKCgoeCkgPj4gUEFHRVNISUZUKSkKLQotZGVmIGJ0b3ByKHgpOiByZXR1cm4gKCgoKHgpICsgUEFHRU9GRlNFVCkgPj4gUEFHRVNISUZUKSkKLQotZGVmIGR0b3AoREQpOiByZXR1cm4gKCgoREQpICsgTkRQUCAtIDEpID4+IChQQUdFU0hJRlQgLSBERVZfQlNISUZUKSkKLQotZGVmIGR0b3B0KEREKTogcmV0dXJuICgoREQpID4+IChQQUdFU0hJRlQgLSBERVZfQlNISUZUKSkKLQotX0FJT19MSVNUSU9fTUFYID0gKDQwOTYpCi1fQUlPX01BWCA9ICgtMSkKLV9NUV9PUEVOX01BWCA9ICgzMikKLV9NUV9QUklPX01BWCA9ICgzMikKLV9TRU1fTlNFTVNfTUFYID0gSU5UX01BWAotX1NFTV9WQUxVRV9NQVggPSBJTlRfTUFYCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdW5pc3RkLmgKLV9DU19QQVRIID0gNjUKLV9DU19MRlNfQ0ZMQUdTID0gNjgKLV9DU19MRlNfTERGTEFHUyA9IDY5Ci1fQ1NfTEZTX0xJQlMgPSA3MAotX0NTX0xGU19MSU5URkxBR1MgPSA3MQotX0NTX0xGUzY0X0NGTEFHUyA9IDcyCi1fQ1NfTEZTNjRfTERGTEFHUyA9IDczCi1fQ1NfTEZTNjRfTElCUyA9IDc0Ci1fQ1NfTEZTNjRfTElOVEZMQUdTID0gNzUKLV9DU19YQlM1X0lMUDMyX09GRjMyX0NGTEFHUyA9IDcwMAotX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTERGTEFHUyA9IDcwMQotX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElCUyA9IDcwMgotX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElOVEZMQUdTID0gNzAzCi1fQ1NfWEJTNV9JTFAzMl9PRkZCSUdfQ0ZMQUdTID0gNzA1Ci1fQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTERGTEFHUyA9IDcwNgotX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xJQlMgPSA3MDcKLV9DU19YQlM1X0lMUDMyX09GRkJJR19MSU5URkxBR1MgPSA3MDgKLV9DU19YQlM1X0xQNjRfT0ZGNjRfQ0ZMQUdTID0gNzA5Ci1fQ1NfWEJTNV9MUDY0X09GRjY0X0xERkxBR1MgPSA3MTAKLV9DU19YQlM1X0xQNjRfT0ZGNjRfTElCUyA9IDcxMQotX0NTX1hCUzVfTFA2NF9PRkY2NF9MSU5URkxBR1MgPSA3MTIKLV9DU19YQlM1X0xQQklHX09GRkJJR19DRkxBR1MgPSA3MTMKLV9DU19YQlM1X0xQQklHX09GRkJJR19MREZMQUdTID0gNzE0Ci1fQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElCUyA9IDcxNQotX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUyA9IDcxNgotX1NDX0FSR19NQVggPSAxCi1fU0NfQ0hJTERfTUFYID0gMgotX1NDX0NMS19UQ0sgPSAzCi1fU0NfTkdST1VQU19NQVggPSA0Ci1fU0NfT1BFTl9NQVggPSA1Ci1fU0NfSk9CX0NPTlRST0wgPSA2Ci1fU0NfU0FWRURfSURTID0gNwotX1NDX1ZFUlNJT04gPSA4Ci1fU0NfUEFTU19NQVggPSA5Ci1fU0NfTE9HTkFNRV9NQVggPSAxMAotX1NDX1BBR0VTSVpFID0gMTEKLV9TQ19YT1BFTl9WRVJTSU9OID0gMTIKLV9TQ19OUFJPQ0VTU09SU19DT05GID0gMTQKLV9TQ19OUFJPQ0VTU09SU19PTkxOID0gMTUKLV9TQ19TVFJFQU1fTUFYID0gMTYKLV9TQ19UWk5BTUVfTUFYID0gMTcKLV9TQ19BSU9fTElTVElPX01BWCA9IDE4Ci1fU0NfQUlPX01BWCA9IDE5Ci1fU0NfQUlPX1BSSU9fREVMVEFfTUFYID0gMjAKLV9TQ19BU1lOQ0hST05PVVNfSU8gPSAyMQotX1NDX0RFTEFZVElNRVJfTUFYID0gMjIKLV9TQ19GU1lOQyA9IDIzCi1fU0NfTUFQUEVEX0ZJTEVTID0gMjQKLV9TQ19NRU1MT0NLID0gMjUKLV9TQ19NRU1MT0NLX1JBTkdFID0gMjYKLV9TQ19NRU1PUllfUFJPVEVDVElPTiA9IDI3Ci1fU0NfTUVTU0FHRV9QQVNTSU5HID0gMjgKLV9TQ19NUV9PUEVOX01BWCA9IDI5Ci1fU0NfTVFfUFJJT19NQVggPSAzMAotX1NDX1BSSU9SSVRJWkVEX0lPID0gMzEKLV9TQ19QUklPUklUWV9TQ0hFRFVMSU5HID0gMzIKLV9TQ19SRUFMVElNRV9TSUdOQUxTID0gMzMKLV9TQ19SVFNJR19NQVggPSAzNAotX1NDX1NFTUFQSE9SRVMgPSAzNQotX1NDX1NFTV9OU0VNU19NQVggPSAzNgotX1NDX1NFTV9WQUxVRV9NQVggPSAzNwotX1NDX1NIQVJFRF9NRU1PUllfT0JKRUNUUyA9IDM4Ci1fU0NfU0lHUVVFVUVfTUFYID0gMzkKLV9TQ19TSUdSVF9NSU4gPSA0MAotX1NDX1NJR1JUX01BWCA9IDQxCi1fU0NfU1lOQ0hST05JWkVEX0lPID0gNDIKLV9TQ19USU1FUlMgPSA0MwotX1NDX1RJTUVSX01BWCA9IDQ0Ci1fU0NfMl9DX0JJTkQgPSA0NQotX1NDXzJfQ19ERVYgPSA0NgotX1NDXzJfQ19WRVJTSU9OID0gNDcKLV9TQ18yX0ZPUlRfREVWID0gNDgKLV9TQ18yX0ZPUlRfUlVOID0gNDkKLV9TQ18yX0xPQ0FMRURFRiA9IDUwCi1fU0NfMl9TV19ERVYgPSA1MQotX1NDXzJfVVBFID0gNTIKLV9TQ18yX1ZFUlNJT04gPSA1MwotX1NDX0JDX0JBU0VfTUFYID0gNTQKLV9TQ19CQ19ESU1fTUFYID0gNTUKLV9TQ19CQ19TQ0FMRV9NQVggPSA1NgotX1NDX0JDX1NUUklOR19NQVggPSA1NwotX1NDX0NPTExfV0VJR0hUU19NQVggPSA1OAotX1NDX0VYUFJfTkVTVF9NQVggPSA1OQotX1NDX0xJTkVfTUFYID0gNjAKLV9TQ19SRV9EVVBfTUFYID0gNjEKLV9TQ19YT1BFTl9DUllQVCA9IDYyCi1fU0NfWE9QRU5fRU5IX0kxOE4gPSA2MwotX1NDX1hPUEVOX1NITSA9IDY0Ci1fU0NfMl9DSEFSX1RFUk0gPSA2NgotX1NDX1hPUEVOX1hDVV9WRVJTSU9OID0gNjcKLV9TQ19BVEVYSVRfTUFYID0gNzYKLV9TQ19JT1ZfTUFYID0gNzcKLV9TQ19YT1BFTl9VTklYID0gNzgKLV9TQ19QQUdFX1NJWkUgPSBfU0NfUEFHRVNJWkUKLV9TQ19UX0lPVl9NQVggPSA3OQotX1NDX1BIWVNfUEFHRVMgPSA1MDAKLV9TQ19BVlBIWVNfUEFHRVMgPSA1MDEKLV9TQ19DT0hFUl9CTEtTWiA9IDUwMwotX1NDX1NQTElUX0NBQ0hFID0gNTA0Ci1fU0NfSUNBQ0hFX1NaID0gNTA1Ci1fU0NfRENBQ0hFX1NaID0gNTA2Ci1fU0NfSUNBQ0hFX0xJTkVTWiA9IDUwNwotX1NDX0RDQUNIRV9MSU5FU1ogPSA1MDgKLV9TQ19JQ0FDSEVfQkxLU1ogPSA1MDkKLV9TQ19EQ0FDSEVfQkxLU1ogPSA1MTAKLV9TQ19EQ0FDSEVfVEJMS1NaID0gNTExCi1fU0NfSUNBQ0hFX0FTU09DID0gNTEyCi1fU0NfRENBQ0hFX0FTU09DID0gNTEzCi1fU0NfTUFYUElEID0gNTE0Ci1fU0NfU1RBQ0tfUFJPVCA9IDUxNQotX1NDX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMgPSA1NjgKLV9TQ19HRVRHUl9SX1NJWkVfTUFYID0gNTY5Ci1fU0NfR0VUUFdfUl9TSVpFX01BWCA9IDU3MAotX1NDX0xPR0lOX05BTUVfTUFYID0gNTcxCi1fU0NfVEhSRUFEX0tFWVNfTUFYID0gNTcyCi1fU0NfVEhSRUFEX1NUQUNLX01JTiA9IDU3MwotX1NDX1RIUkVBRF9USFJFQURTX01BWCA9IDU3NAotX1NDX1RUWV9OQU1FX01BWCA9IDU3NQotX1NDX1RIUkVBRFMgPSA1NzYKLV9TQ19USFJFQURfQVRUUl9TVEFDS0FERFIgPSA1NzcKLV9TQ19USFJFQURfQVRUUl9TVEFDS1NJWkUgPSA1NzgKLV9TQ19USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyA9IDU3OQotX1NDX1RIUkVBRF9QUklPX0lOSEVSSVQgPSA1ODAKLV9TQ19USFJFQURfUFJJT19QUk9URUNUID0gNTgxCi1fU0NfVEhSRUFEX1BST0NFU1NfU0hBUkVEID0gNTgyCi1fU0NfVEhSRUFEX1NBRkVfRlVOQ1RJT05TID0gNTgzCi1fU0NfWE9QRU5fTEVHQUNZID0gNzE3Ci1fU0NfWE9QRU5fUkVBTFRJTUUgPSA3MTgKLV9TQ19YT1BFTl9SRUFMVElNRV9USFJFQURTID0gNzE5Ci1fU0NfWEJTNV9JTFAzMl9PRkYzMiA9IDcyMAotX1NDX1hCUzVfSUxQMzJfT0ZGQklHID0gNzIxCi1fU0NfWEJTNV9MUDY0X09GRjY0ID0gNzIyCi1fU0NfWEJTNV9MUEJJR19PRkZCSUcgPSA3MjMKLV9QQ19MSU5LX01BWCA9IDEKLV9QQ19NQVhfQ0FOT04gPSAyCi1fUENfTUFYX0lOUFVUID0gMwotX1BDX05BTUVfTUFYID0gNAotX1BDX1BBVEhfTUFYID0gNQotX1BDX1BJUEVfQlVGID0gNgotX1BDX05PX1RSVU5DID0gNwotX1BDX1ZESVNBQkxFID0gOAotX1BDX0NIT1dOX1JFU1RSSUNURUQgPSA5Ci1fUENfQVNZTkNfSU8gPSAxMAotX1BDX1BSSU9fSU8gPSAxMQotX1BDX1NZTkNfSU8gPSAxMgotX1BDX0ZJTEVTSVpFQklUUyA9IDY3Ci1fUENfTEFTVCA9IDY3Ci1fUE9TSVhfVkVSU0lPTiA9IDE5OTUwNgotX1BPU0lYMl9WRVJTSU9OID0gMTk5MjA5Ci1fUE9TSVgyX0NfVkVSU0lPTiA9IDE5OTIwOQotX1hPUEVOX1hDVV9WRVJTSU9OID0gNAotX1hPUEVOX1JFQUxUSU1FID0gMQotX1hPUEVOX0VOSF9JMThOID0gMQotX1hPUEVOX1NITSA9IDEKLV9QT1NJWDJfQ19CSU5EID0gMQotX1BPU0lYMl9DSEFSX1RFUk0gPSAxCi1fUE9TSVgyX0xPQ0FMRURFRiA9IDEKLV9QT1NJWDJfQ19ERVYgPSAxCi1fUE9TSVgyX1NXX0RFViA9IDEKLV9QT1NJWDJfVVBFID0gMQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL211dGV4LmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLWRlZiBNVVRFWF9IRUxEKHgpOiByZXR1cm4gKG11dGV4X293bmVkKHgpKQotCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvcndsb2NrLmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLWRlZiBSV19SRUFEX0hFTEQoeCk6IHJldHVybiAocndfcmVhZF9oZWxkKCh4KSkpCi0KLWRlZiBSV19XUklURV9IRUxEKHgpOiByZXR1cm4gKHJ3X3dyaXRlX2hlbGQoKHgpKSkKLQotZGVmIFJXX0xPQ0tfSEVMRCh4KTogcmV0dXJuIChyd19sb2NrX2hlbGQoKHgpKSkKLQotZGVmIFJXX0lTV1JJVEVSKHgpOiByZXR1cm4gKHJ3X2lzd3JpdGVyKHgpKQotCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvc2VtYXBob3JlLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy90aHJlYWQuaAotZnJvbSBUWVBFUyBpbXBvcnQgKgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2tsd3AuaAotZnJvbSBUWVBFUyBpbXBvcnQgKgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2NvbmR2YXIuaAotZnJvbSBUWVBFUyBpbXBvcnQgKgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3RpbWUuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3R5cGVzMzIuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2ludF90eXBlcy5oCi1USU1FMzJfTUFYID0gSU5UMzJfTUFYCi1USU1FMzJfTUlOID0gSU5UMzJfTUlOCi1kZWYgVElNRVZBTF9PVkVSRkxPVyh0dik6IHJldHVybiBcCi0KLWZyb20gVFlQRVMgaW1wb3J0ICoKLURTVF9OT05FID0gMAotRFNUX1VTQSA9IDEKLURTVF9BVVNUID0gMgotRFNUX1dFVCA9IDMKLURTVF9NRVQgPSA0Ci1EU1RfRUVUID0gNQotRFNUX0NBTiA9IDYKLURTVF9HQiA9IDcKLURTVF9SVU0gPSA4Ci1EU1RfVFVSID0gOQotRFNUX0FVU1RBTFQgPSAxMAotSVRJTUVSX1JFQUwgPSAwCi1JVElNRVJfVklSVFVBTCA9IDEKLUlUSU1FUl9QUk9GID0gMgotSVRJTUVSX1JFQUxQUk9GID0gMwotZGVmIElUSU1FUlZBTF9PVkVSRkxPVyhpdHYpOiByZXR1cm4gXAotCi1TRUMgPSAxCi1NSUxMSVNFQyA9IDEwMDAKLU1JQ1JPU0VDID0gMTAwMDAwMAotTkFOT1NFQyA9IDEwMDAwMDAwMDAKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy90aW1lX2ltcGwuaAotZGVmIFRJTUVTUEVDX09WRVJGTE9XKHRzKTogcmV0dXJuIFwKLQotZGVmIElUSU1FUlNQRUNfT1ZFUkZMT1coaXQpOiByZXR1cm4gXAotCi1fX0NMT0NLX1JFQUxUSU1FMCA9IDAKLUNMT0NLX1ZJUlRVQUwgPSAxCi1DTE9DS19QUk9GID0gMgotX19DTE9DS19SRUFMVElNRTMgPSAzCi1DTE9DS19ISUdIUkVTID0gNAotQ0xPQ0tfTUFYID0gNQotQ0xPQ0tfUkVBTFRJTUUgPSBfX0NMT0NLX1JFQUxUSU1FMwotQ0xPQ0tfUkVBTFRJTUUgPSBfX0NMT0NLX1JFQUxUSU1FMAotVElNRVJfUkVMVElNRSA9IDB4MAotVElNRVJfQUJTVElNRSA9IDB4MQotZGVmIFRJQ0tfVE9fU0VDKHRpY2spOiByZXR1cm4gKCh0aWNrKSAvIGh6KQotCi1kZWYgU0VDX1RPX1RJQ0soc2VjKTogcmV0dXJuICgoc2VjKSAqIGh6KQotCi1kZWYgVElDS19UT19NU0VDKHRpY2spOiByZXR1cm4gXAotCi1kZWYgTVNFQ19UT19USUNLKG1zZWMpOiByZXR1cm4gXAotCi1kZWYgTVNFQ19UT19USUNLX1JPVU5EVVAobXNlYyk6IHJldHVybiBcCi0KLWRlZiBUSUNLX1RPX1VTRUModGljayk6IHJldHVybiAoKHRpY2spICogdXNlY19wZXJfdGljaykKLQotZGVmIFVTRUNfVE9fVElDSyh1c2VjKTogcmV0dXJuICgodXNlYykgLyB1c2VjX3Blcl90aWNrKQotCi1kZWYgVVNFQ19UT19USUNLX1JPVU5EVVAodXNlYyk6IHJldHVybiBcCi0KLWRlZiBUSUNLX1RPX05TRUModGljayk6IHJldHVybiAoKHRpY2spICogbnNlY19wZXJfdGljaykKLQotZGVmIE5TRUNfVE9fVElDSyhuc2VjKTogcmV0dXJuICgobnNlYykgLyBuc2VjX3Blcl90aWNrKQotCi1kZWYgTlNFQ19UT19USUNLX1JPVU5EVVAobnNlYyk6IHJldHVybiBcCi0KLWRlZiBUSU1FVkFMX1RPX1RJQ0sodHZwKTogcmV0dXJuIFwKLQotZGVmIFRJTUVTVFJVQ19UT19USUNLKHRzcCk6IHJldHVybiBcCi0KLQotIyBJbmNsdWRlZCBmcm9tIHRpbWUuaAotZnJvbSBUWVBFUyBpbXBvcnQgKgotCi0jIEluY2x1ZGVkIGZyb20gaXNvL3RpbWVfaXNvLmgKLU5VTEwgPSAwCi1OVUxMID0gMAotQ0xPQ0tTX1BFUl9TRUMgPSAxMDAwMDAwCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvc2VsZWN0LmgKLUZEX1NFVFNJWkUgPSA2NTUzNgotRkRfU0VUU0laRSA9IDEwMjQKLV9OQkJZID0gOAotTkJCWSA9IF9OQkJZCi1kZWYgRkRfWkVSTyhwKTogcmV0dXJuIGJ6ZXJvKChwKSwgc2l6ZW9mICgqKHApKSkKLQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3NpZ25hbC5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvaXNvL3NpZ25hbF9pc28uaAotU0lHSFVQID0gMQotU0lHSU5UID0gMgotU0lHUVVJVCA9IDMKLVNJR0lMTCA9IDQKLVNJR1RSQVAgPSA1Ci1TSUdJT1QgPSA2Ci1TSUdBQlJUID0gNgotU0lHRU1UID0gNwotU0lHRlBFID0gOAotU0lHS0lMTCA9IDkKLVNJR0JVUyA9IDEwCi1TSUdTRUdWID0gMTEKLVNJR1NZUyA9IDEyCi1TSUdQSVBFID0gMTMKLVNJR0FMUk0gPSAxNAotU0lHVEVSTSA9IDE1Ci1TSUdVU1IxID0gMTYKLVNJR1VTUjIgPSAxNwotU0lHQ0xEID0gMTgKLVNJR0NITEQgPSAxOAotU0lHUFdSID0gMTkKLVNJR1dJTkNIID0gMjAKLVNJR1VSRyA9IDIxCi1TSUdQT0xMID0gMjIKLVNJR0lPID0gU0lHUE9MTAotU0lHU1RPUCA9IDIzCi1TSUdUU1RQID0gMjQKLVNJR0NPTlQgPSAyNQotU0lHVFRJTiA9IDI2Ci1TSUdUVE9VID0gMjcKLVNJR1ZUQUxSTSA9IDI4Ci1TSUdQUk9GID0gMjkKLVNJR1hDUFUgPSAzMAotU0lHWEZTWiA9IDMxCi1TSUdXQUlUSU5HID0gMzIKLVNJR0xXUCA9IDMzCi1TSUdGUkVFWkUgPSAzNAotU0lHVEhBVyA9IDM1Ci1TSUdDQU5DRUwgPSAzNgotU0lHTE9TVCA9IDM3Ci1fU0lHUlRNSU4gPSAzOAotX1NJR1JUTUFYID0gNDUKLVNJR19CTE9DSyA9IDEKLVNJR19VTkJMT0NLID0gMgotU0lHX1NFVE1BU0sgPSAzCi1TSUdOT19NQVNLID0gMHhGRgotU0lHREVGRVIgPSAweDEwMAotU0lHSE9MRCA9IDB4MjAwCi1TSUdSRUxTRSA9IDB4NDAwCi1TSUdJR05PUkUgPSAweDgwMAotU0lHUEFVU0UgPSAweDEwMDAKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9zaWdpbmZvLmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLVNJR0VWX05PTkUgPSAxCi1TSUdFVl9TSUdOQUwgPSAyCi1TSUdFVl9USFJFQUQgPSAzCi1TSV9OT0lORk8gPSAzMjc2NwotU0lfVVNFUiA9IDAKLVNJX0xXUCA9ICgtMSkKLVNJX1FVRVVFID0gKC0yKQotU0lfVElNRVIgPSAoLTMpCi1TSV9BU1lOQ0lPID0gKC00KQotU0lfTUVTR1EgPSAoLTUpCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvbWFjaHNpZy5oCi1JTExfSUxMT1BDID0gMQotSUxMX0lMTE9QTiA9IDIKLUlMTF9JTExBRFIgPSAzCi1JTExfSUxMVFJQID0gNAotSUxMX1BSVk9QQyA9IDUKLUlMTF9QUlZSRUcgPSA2Ci1JTExfQ09QUk9DID0gNwotSUxMX0JBRFNUSyA9IDgKLU5TSUdJTEwgPSA4Ci1FTVRfVEFHT1ZGID0gMQotRU1UX0NQQ09WRiA9IDIKLU5TSUdFTVQgPSAyCi1GUEVfSU5URElWID0gMQotRlBFX0lOVE9WRiA9IDIKLUZQRV9GTFRESVYgPSAzCi1GUEVfRkxUT1ZGID0gNAotRlBFX0ZMVFVORCA9IDUKLUZQRV9GTFRSRVMgPSA2Ci1GUEVfRkxUSU5WID0gNwotRlBFX0ZMVFNVQiA9IDgKLU5TSUdGUEUgPSA4Ci1TRUdWX01BUEVSUiA9IDEKLVNFR1ZfQUNDRVJSID0gMgotTlNJR1NFR1YgPSAyCi1CVVNfQURSQUxOID0gMQotQlVTX0FEUkVSUiA9IDIKLUJVU19PQkpFUlIgPSAzCi1OU0lHQlVTID0gMwotVFJBUF9CUktQVCA9IDEKLVRSQVBfVFJBQ0UgPSAyCi1UUkFQX1JXQVRDSCA9IDMKLVRSQVBfV1dBVENIID0gNAotVFJBUF9YV0FUQ0ggPSA1Ci1OU0lHVFJBUCA9IDUKLUNMRF9FWElURUQgPSAxCi1DTERfS0lMTEVEID0gMgotQ0xEX0RVTVBFRCA9IDMKLUNMRF9UUkFQUEVEID0gNAotQ0xEX1NUT1BQRUQgPSA1Ci1DTERfQ09OVElOVUVEID0gNgotTlNJR0NMRCA9IDYKLVBPTExfSU4gPSAxCi1QT0xMX09VVCA9IDIKLVBPTExfTVNHID0gMwotUE9MTF9FUlIgPSA0Ci1QT0xMX1BSSSA9IDUKLVBPTExfSFVQID0gNgotTlNJR1BPTEwgPSA2Ci1QUk9GX1NJRyA9IDEKLU5TSUdQUk9GID0gMQotU0lfTUFYU1ogPSAyNTYKLVNJX01BWFNaID0gMTI4Ci0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdGltZV9zdGRfaW1wbC5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1TSTMyX01BWFNaID0gMTI4Ci1kZWYgU0lfQ0FOUVVFVUUoYyk6IHJldHVybiAoKGMpIDw9IFNJX1FVRVVFKQotCi1TQV9OT0NMRFNUT1AgPSAweDAwMDIwMDAwCi1TQV9PTlNUQUNLID0gMHgwMDAwMDAwMQotU0FfUkVTRVRIQU5EID0gMHgwMDAwMDAwMgotU0FfUkVTVEFSVCA9IDB4MDAwMDAwMDQKLVNBX1NJR0lORk8gPSAweDAwMDAwMDA4Ci1TQV9OT0RFRkVSID0gMHgwMDAwMDAxMAotU0FfTk9DTERXQUlUID0gMHgwMDAxMDAwMAotU0FfV0FJVFNJRyA9IDB4MDAwMTAwMDAKLU5TSUcgPSA0NgotTUFYU0lHID0gNDUKLVNfU0lHTkFMID0gMQotU19TSUdTRVQgPSAyCi1TX1NJR0FDVElPTiA9IDMKLVNfTk9ORSA9IDQKLU1JTlNJR1NUS1NaID0gMjA0OAotU0lHU1RLU1ogPSA4MTkyCi1TU19PTlNUQUNLID0gMHgwMDAwMDAwMQotU1NfRElTQUJMRSA9IDB4MDAwMDAwMDIKLVNOX1BST0MgPSAxCi1TTl9DQU5DRUwgPSAyCi1TTl9TRU5EID0gMwotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3Vjb250ZXh0LmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9yZWdzZXQuaAotUkVHX0NDUiA9ICgwKQotUkVHX1BTUiA9ICgwKQotUkVHX1BTUiA9ICgwKQotUkVHX1BDID0gKDEpCi1SRUdfblBDID0gKDIpCi1SRUdfWSA9ICgzKQotUkVHX0cxID0gKDQpCi1SRUdfRzIgPSAoNSkKLVJFR19HMyA9ICg2KQotUkVHX0c0ID0gKDcpCi1SRUdfRzUgPSAoOCkKLVJFR19HNiA9ICg5KQotUkVHX0c3ID0gKDEwKQotUkVHX08wID0gKDExKQotUkVHX08xID0gKDEyKQotUkVHX08yID0gKDEzKQotUkVHX08zID0gKDE0KQotUkVHX080ID0gKDE1KQotUkVHX081ID0gKDE2KQotUkVHX082ID0gKDE3KQotUkVHX083ID0gKDE4KQotUkVHX0FTSSA9ICgxOSkKLVJFR19GUFJTID0gKDIwKQotUkVHX1BTID0gUkVHX1BTUgotUkVHX1NQID0gUkVHX082Ci1SRUdfUjAgPSBSRUdfTzAKLVJFR19SMSA9IFJFR19PMQotX05HUkVHID0gMjEKLV9OR1JFRyA9IDE5Ci1OR1JFRyA9IF9OR1JFRwotX05HUkVHMzIgPSAxOQotX05HUkVHNjQgPSAyMQotU1BBUkNfTUFYUkVHV0lORE9XID0gMzEKLU1BWEZQUSA9IDE2Ci1YUlNfSUQgPSAweDc4NzI3MzAwCi0KLSMgSW5jbHVkZWQgZnJvbSB2Ny9zeXMvcHJpdnJlZ3MuaAotCi0jIEluY2x1ZGVkIGZyb20gdjcvc3lzL3Bzci5oCi1QU1JfQ1dQID0gMHgwMDAwMDAxRgotUFNSX0VUID0gMHgwMDAwMDAyMAotUFNSX1BTID0gMHgwMDAwMDA0MAotUFNSX1MgPSAweDAwMDAwMDgwCi1QU1JfUElMID0gMHgwMDAwMEYwMAotUFNSX0VGID0gMHgwMDAwMTAwMAotUFNSX0VDID0gMHgwMDAwMjAwMAotUFNSX1JTViA9IDB4MDAwRkMwMDAKLVBTUl9JQ0MgPSAweDAwRjAwMDAwCi1QU1JfQyA9IDB4MDAxMDAwMDAKLVBTUl9WID0gMHgwMDIwMDAwMAotUFNSX1ogPSAweDAwNDAwMDAwCi1QU1JfTiA9IDB4MDA4MDAwMDAKLVBTUl9WRVIgPSAweDBGMDAwMDAwCi1QU1JfSU1QTCA9IDB4RjAwMDAwMDAKLVBTTF9BTExDQyA9IFBTUl9JQ0MKLVBTTF9VU0VSID0gKFBTUl9TKQotUFNMX1VTRVJNQVNLID0gKFBTUl9JQ0MpCi1QU0xfVUJJVFMgPSAoUFNSX0lDQ3xQU1JfRUYpCi1kZWYgVVNFUk1PREUocHMpOiByZXR1cm4gKCgocHMpICYgUFNSX1BTKSA9PSAwKQotCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvZnNyLmgKLUZTUl9DRVhDID0gMHgwMDAwMDAxZgotRlNSX0FFWEMgPSAweDAwMDAwM2UwCi1GU1JfRkNDID0gMHgwMDAwMGMwMAotRlNSX1BSID0gMHgwMDAwMTAwMAotRlNSX1FORSA9IDB4MDAwMDIwMDAKLUZTUl9GVFQgPSAweDAwMDFjMDAwCi1GU1JfVkVSID0gMHgwMDBlMDAwMAotRlNSX1RFTSA9IDB4MGY4MDAwMDAKLUZTUl9SUCA9IDB4MzAwMDAwMDAKLUZTUl9SRCA9IDB4YzAwMDAwMDAKLUZTUl9WRVJfU0hJRlQgPSAxNwotRlNSX0ZDQzEgPSAweDAwMDAwMDAzCi1GU1JfRkNDMiA9IDB4MDAwMDAwMEMKLUZTUl9GQ0MzID0gMHgwMDAwMDAzMAotRlNSX0NFWENfTlggPSAweDAwMDAwMDAxCi1GU1JfQ0VYQ19EWiA9IDB4MDAwMDAwMDIKLUZTUl9DRVhDX1VGID0gMHgwMDAwMDAwNAotRlNSX0NFWENfT0YgPSAweDAwMDAwMDA4Ci1GU1JfQ0VYQ19OViA9IDB4MDAwMDAwMTAKLUZTUl9BRVhDX05YID0gKDB4MSA8PCA1KQotRlNSX0FFWENfRFogPSAoMHgyIDw8IDUpCi1GU1JfQUVYQ19VRiA9ICgweDQgPDwgNSkKLUZTUl9BRVhDX09GID0gKDB4OCA8PCA1KQotRlNSX0FFWENfTlYgPSAoMHgxMCA8PCA1KQotRlRUX05PTkUgPSAwCi1GVFRfSUVFRSA9IDEKLUZUVF9VTkZJTiA9IDIKLUZUVF9VTklNUCA9IDMKLUZUVF9TRVEgPSA0Ci1GVFRfQUxJR04gPSA1Ci1GVFRfREZBVUxUID0gNgotRlNSX0ZUVF9TSElGVCA9IDE0Ci1GU1JfRlRUX0lFRUUgPSAoRlRUX0lFRUUgICA8PCBGU1JfRlRUX1NISUZUKQotRlNSX0ZUVF9VTkZJTiA9IChGVFRfVU5GSU4gIDw8IEZTUl9GVFRfU0hJRlQpCi1GU1JfRlRUX1VOSU1QID0gKEZUVF9VTklNUCAgPDwgRlNSX0ZUVF9TSElGVCkKLUZTUl9GVFRfU0VRID0gKEZUVF9TRVEgICAgPDwgRlNSX0ZUVF9TSElGVCkKLUZTUl9GVFRfQUxJR04gPSAoRlRUX0FMSUdOICA8PCBGU1JfRlRUX1NISUZUKQotRlNSX0ZUVF9ERkFVTFQgPSAoRlRUX0RGQVVMVCA8PCBGU1JfRlRUX1NISUZUKQotRlNSX1RFTV9OWCA9ICgweDEgPDwgMjMpCi1GU1JfVEVNX0RaID0gKDB4MiA8PCAyMykKLUZTUl9URU1fVUYgPSAoMHg0IDw8IDIzKQotRlNSX1RFTV9PRiA9ICgweDggPDwgMjMpCi1GU1JfVEVNX05WID0gKDB4MTAgPDwgMjMpCi1SUF9EQkxFWFQgPSAwCi1SUF9TSU5HTEUgPSAxCi1SUF9ET1VCTEUgPSAyCi1SUF9SRVNFUlZFRCA9IDMKLVJEX05FQVIgPSAwCi1SRF9aRVIwID0gMQotUkRfUE9TSU5GID0gMgotUkRfTkVHSU5GID0gMwotRlBSU19ETCA9IDB4MQotRlBSU19EVSA9IDB4MgotRlBSU19GRUYgPSAweDQKLVBJTF9NQVggPSAweGYKLWRlZiBTQVZFX0dMT0JBTFMoUlApOiByZXR1cm4gXAotCi1kZWYgUkVTVE9SRV9HTE9CQUxTKFJQKTogcmV0dXJuIFwKLQotZGVmIFNBVkVfT1VUUyhSUCk6IHJldHVybiBcCi0KLWRlZiBSRVNUT1JFX09VVFMoUlApOiByZXR1cm4gXAotCi1kZWYgU0FWRV9XSU5ET1coU0JQKTogcmV0dXJuIFwKLQotZGVmIFJFU1RPUkVfV0lORE9XKFNCUCk6IHJldHVybiBcCi0KLWRlZiBTVE9SRV9GUFJFR1MoRlApOiByZXR1cm4gXAotCi1kZWYgTE9BRF9GUFJFR1MoRlApOiByZXR1cm4gXAotCi1fU1BBUkNfTUFYUkVHV0lORE9XID0gMzEKLV9YUlNfSUQgPSAweDc4NzI3MzAwCi1HRVRDT05URVhUID0gMAotU0VUQ09OVEVYVCA9IDEKLVVDX1NJR01BU0sgPSAwbzAxCi1VQ19TVEFDSyA9IDBvMDIKLVVDX0NQVSA9IDBvMDQKLVVDX01BVSA9IDBvMTAKLVVDX0ZQVSA9IFVDX01BVQotVUNfSU5UUiA9IDBvMjAKLVVDX0FTUiA9IDBvNDAKLVVDX01DT05URVhUID0gKFVDX0NQVXxVQ19GUFV8VUNfQVNSKQotVUNfQUxMID0gKFVDX1NJR01BU0t8VUNfU1RBQ0t8VUNfTUNPTlRFWFQpCi1fU0lHUVVFVUVfTUFYID0gMzIKLV9TSUdOT1RJRllfTUFYID0gMzIKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9wY2IuaAotSU5TVFJfVkFMSUQgPSAweDAyCi1OT1JNQUxfU1RFUCA9IDB4MDQKLVdBVENIX1NURVAgPSAweDA4Ci1DUENfT1ZFUkZMT1cgPSAweDEwCi1BU1lOQ19IV0VSUiA9IDB4MjAKLVNURVBfTk9ORSA9IDAKLVNURVBfUkVRVUVTVEVEID0gMQotU1RFUF9BQ1RJVkUgPSAyCi1TVEVQX1dBU0FDVElWRSA9IDMKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9tc2FjY3QuaAotTE1TX1VTRVIgPSAwCi1MTVNfU1lTVEVNID0gMQotTE1TX1RSQVAgPSAyCi1MTVNfVEZBVUxUID0gMwotTE1TX0RGQVVMVCA9IDQKLUxNU19LRkFVTFQgPSA1Ci1MTVNfVVNFUl9MT0NLID0gNgotTE1TX1NMRUVQID0gNwotTE1TX1dBSVRfQ1BVID0gOAotTE1TX1NUT1BQRUQgPSA5Ci1OTVNUQVRFUyA9IDEwCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvbHdwLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9zeW5jaC5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1VU1lOQ19USFJFQUQgPSAweDAwCi1VU1lOQ19QUk9DRVNTID0gMHgwMQotTE9DS19OT1JNQUwgPSAweDAwCi1MT0NLX0VSUk9SQ0hFQ0sgPSAweDAyCi1MT0NLX1JFQ1VSU0lWRSA9IDB4MDQKLVVTWU5DX1BST0NFU1NfUk9CVVNUID0gMHgwOAotTE9DS19QUklPX05PTkUgPSAweDAwCi1MT0NLX1BSSU9fSU5IRVJJVCA9IDB4MTAKLUxPQ0tfUFJJT19QUk9URUNUID0gMHgyMAotTE9DS19TVEFMTF9OUCA9IDB4MDAKLUxPQ0tfUk9CVVNUX05QID0gMHg0MAotTE9DS19PV05FUkRFQUQgPSAweDEKLUxPQ0tfTk9UUkVDT1ZFUkFCTEUgPSAweDIKLUxPQ0tfSU5JVEVEID0gMHg0Ci1MT0NLX1VOTUFQUEVEID0gMHg4Ci1MV1BfREVUQUNIRUQgPSAweDAwMDAwMDQwCi1MV1BfU1VTUEVOREVEID0gMHgwMDAwMDA4MAotX19MV1BfQVNMV1AgPSAweDAwMDAwMTAwCi1NQVhTWVNBUkdTID0gOAotTk9STUFMUkVUVVJOID0gMAotSlVTVFJFVFVSTiA9IDEKLUxXUF9VU0VSID0gMHgwMQotTFdQX1NZUyA9IDB4MDIKLVRTX0ZSRUUgPSAweDAwCi1UU19TTEVFUCA9IDB4MDEKLVRTX1JVTiA9IDB4MDIKLVRTX09OUFJPQyA9IDB4MDQKLVRTX1pPTUIgPSAweDA4Ci1UU19TVE9QUEVEID0gMHgxMAotVF9JTlRSX1RIUkVBRCA9IDB4MDAwMQotVF9XQUtFQUJMRSA9IDB4MDAwMgotVF9UT01BU0sgPSAweDAwMDQKLVRfVEFMTE9DU1RLID0gMHgwMDA4Ci1UX1dPVUxEQkxPQ0sgPSAweDAwMjAKLVRfRE9OVEJMT0NLID0gMHgwMDQwCi1UX0RPTlRQRU5EID0gMHgwMDgwCi1UX1NZU19QUk9GID0gMHgwMTAwCi1UX1dBSVRDVlNFTSA9IDB4MDIwMAotVF9XQVRDSFBUID0gMHgwNDAwCi1UX1BBTklDID0gMHgwODAwCi1UUF9IT0xETFdQID0gMHgwMDAyCi1UUF9UV0FJVCA9IDB4MDAwNAotVFBfTFdQRVhJVCA9IDB4MDAwOAotVFBfUFJTVE9QID0gMHgwMDEwCi1UUF9DSEtQVCA9IDB4MDAyMAotVFBfRVhJVExXUCA9IDB4MDA0MAotVFBfUFJWU1RPUCA9IDB4MDA4MAotVFBfTVNBQ0NUID0gMHgwMTAwCi1UUF9TVE9QUElORyA9IDB4MDIwMAotVFBfV0FUQ0hQVCA9IDB4MDQwMAotVFBfUEFVU0UgPSAweDA4MDAKLVRQX0NIQU5HRUJJTkQgPSAweDEwMDAKLVRTX0xPQUQgPSAweDAwMDEKLVRTX0RPTlRfU1dBUCA9IDB4MDAwMgotVFNfU1dBUEVOUSA9IDB4MDAwNAotVFNfT05fU1dBUFEgPSAweDAwMDgKLVRTX0NTVEFSVCA9IDB4MDEwMAotVFNfVU5QQVVTRSA9IDB4MDIwMAotVFNfWFNUQVJUID0gMHgwNDAwCi1UU19QU1RBUlQgPSAweDA4MDAKLVRTX1JFU1VNRSA9IDB4MTAwMAotVFNfQ1JFQVRFID0gMHgyMDAwCi1UU19BTExTVEFSVCA9IFwKLSAgICAgICAgKFRTX0NTVEFSVHxUU19VTlBBVVNFfFRTX1hTVEFSVHxUU19QU1RBUlR8VFNfUkVTVU1FfFRTX0NSRUFURSkKLWRlZiBDUFJfVlNUT1BQRUQodCk6IHJldHVybiBcCi0KLWRlZiBUSFJFQURfVFJBTlNJVElPTih0cCk6IHJldHVybiB0aHJlYWRfdHJhbnNpdGlvbih0cCk7Ci0KLWRlZiBUSFJFQURfU1RPUCh0cCk6IHJldHVybiBcCi0KLWRlZiBUSFJFQURfWk9NQih0cCk6IHJldHVybiBUSFJFQURfU0VUX1NUQVRFKHRwLCBUU19aT01CLCBOVUxMKQotCi1kZWYgU0VNQV9IRUxEKHgpOiByZXR1cm4gKHNlbWFfaGVsZCgoeCkpKQotCi1OT19MT0NLU19IRUxEID0gMQotTk9fQ09NUEVUSU5HX1RIUkVBRFMgPSAxCi1GTU5BTUVTWiA9IDgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9zeXN0bS5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvcHJvYy5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvY3JlZC5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdXNlci5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvcmVzb3VyY2UuaAotZnJvbSBUWVBFUyBpbXBvcnQgKgotUFJJT19QUk9DRVNTID0gMAotUFJJT19QR1JQID0gMQotUFJJT19VU0VSID0gMgotUkxJTUlUX0NQVSA9IDAKLVJMSU1JVF9GU0laRSA9IDEKLVJMSU1JVF9EQVRBID0gMgotUkxJTUlUX1NUQUNLID0gMwotUkxJTUlUX0NPUkUgPSA0Ci1STElNSVRfTk9GSUxFID0gNQotUkxJTUlUX1ZNRU0gPSA2Ci1STElNSVRfQVMgPSBSTElNSVRfVk1FTQotUkxJTV9OTElNSVRTID0gNwotUkxJTV9JTkZJTklUWSA9ICgtMykKLVJMSU1fU0FWRURfTUFYID0gKC0yKQotUkxJTV9TQVZFRF9DVVIgPSAoLTEpCi1STElNX0lORklOSVRZID0gMHg3ZmZmZmZmZgotUkxJTV9TQVZFRF9NQVggPSAweDdmZmZmZmZlCi1STElNX1NBVkVEX0NVUiA9IDB4N2ZmZmZmZmQKLVJMSU0zMl9JTkZJTklUWSA9IDB4N2ZmZmZmZmYKLVJMSU0zMl9TQVZFRF9NQVggPSAweDdmZmZmZmZlCi1STElNMzJfU0FWRURfQ1VSID0gMHg3ZmZmZmZmZAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL21vZGVsLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9kZWJ1Zy5oCi1kZWYgQVNTRVJUNjQoeCk6IHJldHVybiBBU1NFUlQoeCkKLQotZGVmIEFTU0VSVDMyKHgpOiByZXR1cm4gQVNTRVJUKHgpCi0KLURBVEFNT0RFTF9NQVNLID0gMHgwRkYwMDAwMAotREFUQU1PREVMX0lMUDMyID0gMHgwMDEwMDAwMAotREFUQU1PREVMX0xQNjQgPSAweDAwMjAwMDAwCi1EQVRBTU9ERUxfTk9ORSA9IDAKLURBVEFNT0RFTF9OQVRJVkUgPSBEQVRBTU9ERUxfTFA2NAotREFUQU1PREVMX05BVElWRSA9IERBVEFNT0RFTF9JTFAzMgotZGVmIFNUUlVDVF9TSVpFKGhhbmRsZSk6IHJldHVybiBcCi0KLWRlZiBTVFJVQ1RfQlVGKGhhbmRsZSk6IHJldHVybiAoKGhhbmRsZSkucHRyLm02NCkKLQotZGVmIFNJWkVPRl9QVFIodW1vZGVsKTogcmV0dXJuIFwKLQotZGVmIFNUUlVDVF9TSVpFKGhhbmRsZSk6IHJldHVybiAoc2l6ZW9mICgqKGhhbmRsZSkucHRyKSkKLQotZGVmIFNUUlVDVF9CVUYoaGFuZGxlKTogcmV0dXJuICgoaGFuZGxlKS5wdHIpCi0KLWRlZiBTSVpFT0ZfUFRSKHVtb2RlbCk6IHJldHVybiBzaXplb2YgKGNhZGRyX3QpCi0KLWRlZiBsd3BfZ2V0ZGF0YW1vZGVsKHQpOiByZXR1cm4gREFUQU1PREVMX0lMUDMyCi0KLVJVU0FHRV9TRUxGID0gMAotUlVTQUdFX0NISUxEUkVOID0gLTEKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9hdXh2LmgKLUFUX05VTEwgPSAwCi1BVF9JR05PUkUgPSAxCi1BVF9FWEVDRkQgPSAyCi1BVF9QSERSID0gMwotQVRfUEhFTlQgPSA0Ci1BVF9QSE5VTSA9IDUKLUFUX1BBR0VTWiA9IDYKLUFUX0JBU0UgPSA3Ci1BVF9GTEFHUyA9IDgKLUFUX0VOVFJZID0gOQotQVRfRENBQ0hFQlNJWkUgPSAxMAotQVRfSUNBQ0hFQlNJWkUgPSAxMQotQVRfVUNBQ0hFQlNJWkUgPSAxMgotQVRfU1VOX1VJRCA9IDIwMDAKLUFUX1NVTl9SVUlEID0gMjAwMQotQVRfU1VOX0dJRCA9IDIwMDIKLUFUX1NVTl9SR0lEID0gMjAwMwotQVRfU1VOX0xERUxGID0gMjAwNAotQVRfU1VOX0xEU0hEUiA9IDIwMDUKLUFUX1NVTl9MRE5BTUUgPSAyMDA2Ci1BVF9TVU5fTFBBR0VTWiA9IDIwMDcKLUFUX1NVTl9QTEFURk9STSA9IDIwMDgKLUFUX1NVTl9IV0NBUCA9IDIwMDkKLUFUX1NVTl9JRkxVU0ggPSAyMDEwCi1BVF9TVU5fQ1BVID0gMjAxMQotQVRfU1VOX0VNVUxfRU5UUlkgPSAyMDEyCi1BVF9TVU5fRU1VTF9FWEVDRkQgPSAyMDEzCi1BVF9TVU5fRVhFQ05BTUUgPSAyMDE0Ci1BVF9TVU5fTU1VID0gMjAxNQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2Vycm5vLmgKLUVQRVJNID0gMQotRU5PRU5UID0gMgotRVNSQ0ggPSAzCi1FSU5UUiA9IDQKLUVJTyA9IDUKLUVOWElPID0gNgotRTJCSUcgPSA3Ci1FTk9FWEVDID0gOAotRUJBREYgPSA5Ci1FQ0hJTEQgPSAxMAotRUFHQUlOID0gMTEKLUVOT01FTSA9IDEyCi1FQUNDRVMgPSAxMwotRUZBVUxUID0gMTQKLUVOT1RCTEsgPSAxNQotRUJVU1kgPSAxNgotRUVYSVNUID0gMTcKLUVYREVWID0gMTgKLUVOT0RFViA9IDE5Ci1FTk9URElSID0gMjAKLUVJU0RJUiA9IDIxCi1FSU5WQUwgPSAyMgotRU5GSUxFID0gMjMKLUVNRklMRSA9IDI0Ci1FTk9UVFkgPSAyNQotRVRYVEJTWSA9IDI2Ci1FRkJJRyA9IDI3Ci1FTk9TUEMgPSAyOAotRVNQSVBFID0gMjkKLUVST0ZTID0gMzAKLUVNTElOSyA9IDMxCi1FUElQRSA9IDMyCi1FRE9NID0gMzMKLUVSQU5HRSA9IDM0Ci1FTk9NU0cgPSAzNQotRUlEUk0gPSAzNgotRUNIUk5HID0gMzcKLUVMMk5TWU5DID0gMzgKLUVMM0hMVCA9IDM5Ci1FTDNSU1QgPSA0MAotRUxOUk5HID0gNDEKLUVVTkFUQ0ggPSA0MgotRU5PQ1NJID0gNDMKLUVMMkhMVCA9IDQ0Ci1FREVBRExLID0gNDUKLUVOT0xDSyA9IDQ2Ci1FQ0FOQ0VMRUQgPSA0NwotRU5PVFNVUCA9IDQ4Ci1FRFFVT1QgPSA0OQotRUJBREUgPSA1MAotRUJBRFIgPSA1MQotRVhGVUxMID0gNTIKLUVOT0FOTyA9IDUzCi1FQkFEUlFDID0gNTQKLUVCQURTTFQgPSA1NQotRURFQURMT0NLID0gNTYKLUVCRk9OVCA9IDU3Ci1FT1dORVJERUFEID0gNTgKLUVOT1RSRUNPVkVSQUJMRSA9IDU5Ci1FTk9TVFIgPSA2MAotRU5PREFUQSA9IDYxCi1FVElNRSA9IDYyCi1FTk9TUiA9IDYzCi1FTk9ORVQgPSA2NAotRU5PUEtHID0gNjUKLUVSRU1PVEUgPSA2NgotRU5PTElOSyA9IDY3Ci1FQURWID0gNjgKLUVTUk1OVCA9IDY5Ci1FQ09NTSA9IDcwCi1FUFJPVE8gPSA3MQotRUxPQ0tVTk1BUFBFRCA9IDcyCi1FTk9UQUNUSVZFID0gNzMKLUVNVUxUSUhPUCA9IDc0Ci1FQkFETVNHID0gNzcKLUVOQU1FVE9PTE9ORyA9IDc4Ci1FT1ZFUkZMT1cgPSA3OQotRU5PVFVOSVEgPSA4MAotRUJBREZEID0gODEKLUVSRU1DSEcgPSA4MgotRUxJQkFDQyA9IDgzCi1FTElCQkFEID0gODQKLUVMSUJTQ04gPSA4NQotRUxJQk1BWCA9IDg2Ci1FTElCRVhFQyA9IDg3Ci1FSUxTRVEgPSA4OAotRU5PU1lTID0gODkKLUVMT09QID0gOTAKLUVSRVNUQVJUID0gOTEKLUVTVFJQSVBFID0gOTIKLUVOT1RFTVBUWSA9IDkzCi1FVVNFUlMgPSA5NAotRU5PVFNPQ0sgPSA5NQotRURFU1RBRERSUkVRID0gOTYKLUVNU0dTSVpFID0gOTcKLUVQUk9UT1RZUEUgPSA5OAotRU5PUFJPVE9PUFQgPSA5OQotRVBST1RPTk9TVVBQT1JUID0gMTIwCi1FU09DS1ROT1NVUFBPUlQgPSAxMjEKLUVPUE5PVFNVUFAgPSAxMjIKLUVQRk5PU1VQUE9SVCA9IDEyMwotRUFGTk9TVVBQT1JUID0gMTI0Ci1FQUREUklOVVNFID0gMTI1Ci1FQUREUk5PVEFWQUlMID0gMTI2Ci1FTkVURE9XTiA9IDEyNwotRU5FVFVOUkVBQ0ggPSAxMjgKLUVORVRSRVNFVCA9IDEyOQotRUNPTk5BQk9SVEVEID0gMTMwCi1FQ09OTlJFU0VUID0gMTMxCi1FTk9CVUZTID0gMTMyCi1FSVNDT05OID0gMTMzCi1FTk9UQ09OTiA9IDEzNAotRVNIVVRET1dOID0gMTQzCi1FVE9PTUFOWVJFRlMgPSAxNDQKLUVUSU1FRE9VVCA9IDE0NQotRUNPTk5SRUZVU0VEID0gMTQ2Ci1FSE9TVERPV04gPSAxNDcKLUVIT1NUVU5SRUFDSCA9IDE0OAotRVdPVUxEQkxPQ0sgPSBFQUdBSU4KLUVBTFJFQURZID0gMTQ5Ci1FSU5QUk9HUkVTUyA9IDE1MAotRVNUQUxFID0gMTUxCi1QU0FSR1NaID0gODAKLVBTQ09NU0laID0gMTQKLU1BWENPTUxFTiA9IDE2Ci1fX0tFUk5fTkFVWFZfSU1QTCA9IDE5Ci1fX0tFUk5fTkFVWFZfSU1QTCA9IDIxCi1fX0tFUk5fTkFVWFZfSU1QTCA9IDIxCi1QU0FSR1NaID0gODAKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy93YXRjaHBvaW50LmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLQotIyBJbmNsdWRlZCBmcm9tIHZtL3NlZ19lbnVtLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9jb3B5b3BzLmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9idWYuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2tzdGF0LmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLUtTVEFUX1NUUkxFTiA9IDMxCi1kZWYgS1NUQVRfRU5URVIoayk6IHJldHVybiBcCi0KLWRlZiBLU1RBVF9FWElUKGspOiByZXR1cm4gXAotCi1LU1RBVF9UWVBFX1JBVyA9IDAKLUtTVEFUX1RZUEVfTkFNRUQgPSAxCi1LU1RBVF9UWVBFX0lOVFIgPSAyCi1LU1RBVF9UWVBFX0lPID0gMwotS1NUQVRfVFlQRV9USU1FUiA9IDQKLUtTVEFUX05VTV9UWVBFUyA9IDUKLUtTVEFUX0ZMQUdfVklSVFVBTCA9IDB4MDEKLUtTVEFUX0ZMQUdfVkFSX1NJWkUgPSAweDAyCi1LU1RBVF9GTEFHX1dSSVRBQkxFID0gMHgwNAotS1NUQVRfRkxBR19QRVJTSVNURU5UID0gMHgwOAotS1NUQVRfRkxBR19ET1JNQU5UID0gMHgxMAotS1NUQVRfRkxBR19JTlZBTElEID0gMHgyMAotS1NUQVRfUkVBRCA9IDAKLUtTVEFUX1dSSVRFID0gMQotS1NUQVRfREFUQV9DSEFSID0gMAotS1NUQVRfREFUQV9JTlQzMiA9IDEKLUtTVEFUX0RBVEFfVUlOVDMyID0gMgotS1NUQVRfREFUQV9JTlQ2NCA9IDMKLUtTVEFUX0RBVEFfVUlOVDY0ID0gNAotS1NUQVRfREFUQV9MT05HID0gS1NUQVRfREFUQV9JTlQzMgotS1NUQVRfREFUQV9VTE9ORyA9IEtTVEFUX0RBVEFfVUlOVDMyCi1LU1RBVF9EQVRBX0xPTkcgPSBLU1RBVF9EQVRBX0lOVDY0Ci1LU1RBVF9EQVRBX1VMT05HID0gS1NUQVRfREFUQV9VSU5UNjQKLUtTVEFUX0RBVEFfTE9ORyA9IDcKLUtTVEFUX0RBVEFfVUxPTkcgPSA4Ci1LU1RBVF9EQVRBX0xPTkdMT05HID0gS1NUQVRfREFUQV9JTlQ2NAotS1NUQVRfREFUQV9VTE9OR0xPTkcgPSBLU1RBVF9EQVRBX1VJTlQ2NAotS1NUQVRfREFUQV9GTE9BVCA9IDUKLUtTVEFUX0RBVEFfRE9VQkxFID0gNgotS1NUQVRfSU5UUl9IQVJEID0gMAotS1NUQVRfSU5UUl9TT0ZUID0gMQotS1NUQVRfSU5UUl9XQVRDSERPRyA9IDIKLUtTVEFUX0lOVFJfU1BVUklPVVMgPSAzCi1LU1RBVF9JTlRSX01VTFRTVkMgPSA0Ci1LU1RBVF9OVU1fSU5UUlMgPSA1Ci1CX0JVU1kgPSAweDAwMDEKLUJfRE9ORSA9IDB4MDAwMgotQl9FUlJPUiA9IDB4MDAwNAotQl9QQUdFSU8gPSAweDAwMTAKLUJfUEhZUyA9IDB4MDAyMAotQl9SRUFEID0gMHgwMDQwCi1CX1dSSVRFID0gMHgwMTAwCi1CX0tFUk5CVUYgPSAweDAwMDgKLUJfV0FOVEVEID0gMHgwMDgwCi1CX0FHRSA9IDB4MDAwMjAwCi1CX0FTWU5DID0gMHgwMDA0MDAKLUJfREVMV1JJID0gMHgwMDA4MDAKLUJfU1RBTEUgPSAweDAwMTAwMAotQl9ET05UTkVFRCA9IDB4MDAyMDAwCi1CX1JFTUFQUEVEID0gMHgwMDQwMDAKLUJfRlJFRSA9IDB4MDA4MDAwCi1CX0lOVkFMID0gMHgwMTAwMDAKLUJfRk9SQ0UgPSAweDAyMDAwMAotQl9IRUFEID0gMHgwNDAwMDAKLUJfTk9DQUNIRSA9IDB4MDgwMDAwCi1CX1RSVU5DID0gMHgxMDAwMDAKLUJfU0hBRE9XID0gMHgyMDAwMDAKLUJfUkVUUllXUkkgPSAweDQwMDAwMAotZGVmIG5vdGF2YWlsKGJwKTogcmV0dXJuIFwKLQotZGVmIEJXUklURShicCk6IHJldHVybiBcCi0KLWRlZiBCV1JJVEUyKGJwKTogcmV0dXJuIFwKLQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2Fpb19yZXEuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3Vpby5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1XUF9OT1dBVENIID0gMHgwMQotV1BfU0VUUFJPVCA9IDB4MDIKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy90aW1lci5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1fVElNRVJfTUFYID0gMzIKLUlUTEtfTE9DS0VEID0gMHgwMQotSVRMS19XQU5URUQgPSAweDAyCi1JVExLX1JFTU9WRSA9IDB4MDQKLUlUX1BFUkxXUCA9IDB4MDEKLUlUX1NJR05BTCA9IDB4MDIKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy91dHJhcC5oCi1VVF9JTlNUUlVDVElPTl9ESVNBQkxFRCA9IDEKLVVUX0lOU1RSVUNUSU9OX0VSUk9SID0gMgotVVRfSU5TVFJVQ1RJT05fUFJPVEVDVElPTiA9IDMKLVVUX0lMTFRSQVBfSU5TVFJVQ1RJT04gPSA0Ci1VVF9JTExFR0FMX0lOU1RSVUNUSU9OID0gNQotVVRfUFJJVklMRUdFRF9PUENPREUgPSA2Ci1VVF9GUF9ESVNBQkxFRCA9IDcKLVVUX0ZQX0VYQ0VQVElPTl9JRUVFXzc1NCA9IDgKLVVUX0ZQX0VYQ0VQVElPTl9PVEhFUiA9IDkKLVVUX1RBR19PVkVSRkxPVyA9IDEwCi1VVF9ESVZJU0lPTl9CWV9aRVJPID0gMTEKLVVUX0RBVEFfRVhDRVBUSU9OID0gMTIKLVVUX0RBVEFfRVJST1IgPSAxMwotVVRfREFUQV9QUk9URUNUSU9OID0gMTQKLVVUX01FTV9BRERSRVNTX05PVF9BTElHTkVEID0gMTUKLVVUX1BSSVZJTEVHRURfQUNUSU9OID0gMTYKLVVUX0FTWU5DX0RBVEFfRVJST1IgPSAxNwotVVRfVFJBUF9JTlNUUlVDVElPTl8xNiA9IDE4Ci1VVF9UUkFQX0lOU1RSVUNUSU9OXzE3ID0gMTkKLVVUX1RSQVBfSU5TVFJVQ1RJT05fMTggPSAyMAotVVRfVFJBUF9JTlNUUlVDVElPTl8xOSA9IDIxCi1VVF9UUkFQX0lOU1RSVUNUSU9OXzIwID0gMjIKLVVUX1RSQVBfSU5TVFJVQ1RJT05fMjEgPSAyMwotVVRfVFJBUF9JTlNUUlVDVElPTl8yMiA9IDI0Ci1VVF9UUkFQX0lOU1RSVUNUSU9OXzIzID0gMjUKLVVUX1RSQVBfSU5TVFJVQ1RJT05fMjQgPSAyNgotVVRfVFJBUF9JTlNUUlVDVElPTl8yNSA9IDI3Ci1VVF9UUkFQX0lOU1RSVUNUSU9OXzI2ID0gMjgKLVVUX1RSQVBfSU5TVFJVQ1RJT05fMjcgPSAyOQotVVRfVFJBUF9JTlNUUlVDVElPTl8yOCA9IDMwCi1VVF9UUkFQX0lOU1RSVUNUSU9OXzI5ID0gMzEKLVVUX1RSQVBfSU5TVFJVQ1RJT05fMzAgPSAzMgotVVRfVFJBUF9JTlNUUlVDVElPTl8zMSA9IDMzCi1VVFJBUF9WOFBfRlBfRElTQUJMRUQgPSBVVF9GUF9ESVNBQkxFRAotVVRSQVBfVjhQX01FTV9BRERSRVNTX05PVF9BTElHTkVEID0gVVRfTUVNX0FERFJFU1NfTk9UX0FMSUdORUQKLVVUX1BSRUNJU0VfTUFYVFJBUFMgPSAzMwotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3JlZnN0ci5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdGFzay5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1UQVNLX05PUk1BTCA9IDB4MAotVEFTS19GSU5BTCA9IDB4MQotVEFTS19GSU5BTElUWSA9IDB4MQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2lkX3NwYWNlLmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy92bWVtLmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLVZNX1NMRUVQID0gMHgwMDAwMDAwMAotVk1fTk9TTEVFUCA9IDB4MDAwMDAwMDEKLVZNX1BBTklDID0gMHgwMDAwMDAwMgotVk1fS01GTEFHUyA9IDB4MDAwMDAwZmYKLVZNX0JFU1RGSVQgPSAweDAwMDAwMTAwCi1WTUVNX0FMTE9DID0gMHgwMQotVk1FTV9GUkVFID0gMHgwMgotVk1FTV9TUEFOID0gMHgxMAotSVNQX05PUk1BTCA9IDB4MAotSVNQX1JFU0VSVkUgPSAweDEKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9leGFjY3RfaW1wbC5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMva21lbS5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1LTV9TTEVFUCA9IDB4MDAwMAotS01fTk9TTEVFUCA9IDB4MDAwMQotS01fUEFOSUMgPSAweDAwMDIKLUtNX1ZNRkxBR1MgPSAweDAwZmYKLUtNX0ZMQUdTID0gMHhmZmZmCi1LTUNfTk9UT1VDSCA9IDB4MDAwMTAwMDAKLUtNQ19OT0RFQlVHID0gMHgwMDAyMDAwMAotS01DX05PTUFHQVpJTkUgPSAweDAwMDQwMDAwCi1LTUNfTk9IQVNIID0gMHgwMDA4MDAwMAotS01DX1FDQUNIRSA9IDB4MDAxMDAwMDAKLV9JU0FfSUEzMiA9IDAKLV9JU0FfSUE2NCA9IDEKLVNTTEVFUCA9IDEKLVNSVU4gPSAyCi1TWk9NQiA9IDMKLVNTVE9QID0gNAotU0lETCA9IDUKLVNPTlBST0MgPSA2Ci1DTERQRU5EID0gMHgwMDAxCi1DTERDT05UID0gMHgwMDAyCi1TU1lTID0gMHgwMDAwMDAwMQotU1RSQyA9IDB4MDAwMDAwMDIKLVNMT0FEID0gMHgwMDAwMDAwOAotU0xPQ0sgPSAweDAwMDAwMDEwCi1TUFJFWEVDID0gMHgwMDAwMDAyMAotU1BST0NUUiA9IDB4MDAwMDAwNDAKLVNQUkZPUksgPSAweDAwMDAwMDgwCi1TS0lMTEVEID0gMHgwMDAwMDEwMAotU1VMT0FEID0gMHgwMDAwMDIwMAotU1JVTkxDTCA9IDB4MDAwMDA0MDAKLVNCUFRBREogPSAweDAwMDAwODAwCi1TS0lMTENMID0gMHgwMDAwMTAwMAotU09XRVVQQyA9IDB4MDAwMDIwMDAKLVNFWEVDRUQgPSAweDAwMDA0MDAwCi1TUEFTWU5DID0gMHgwMDAwODAwMAotU0pDVEwgPSAweDAwMDEwMDAwCi1TTk9XQUlUID0gMHgwMDAyMDAwMAotU1ZGT1JLID0gMHgwMDA0MDAwMAotU1ZGV0FJVCA9IDB4MDAwODAwMDAKLUVYSVRMV1BTID0gMHgwMDEwMDAwMAotSE9MREZPUksgPSAweDAwMjAwMDAwCi1TV0FJVFNJRyA9IDB4MDA0MDAwMDAKLUhPTERGT1JLMSA9IDB4MDA4MDAwMDAKLUNPUkVEVU1QID0gMHgwMTAwMDAwMAotU01TQUNDVCA9IDB4MDIwMDAwMDAKLUFTTFdQID0gMHgwNDAwMDAwMAotU1BSTE9DSyA9IDB4MDgwMDAwMDAKLU5PQ0QgPSAweDEwMDAwMDAwCi1IT0xEV0FUQ0ggPSAweDIwMDAwMDAwCi1TTVNGT1JLID0gMHg0MDAwMDAwMAotU0RPQ09SRSA9IDB4ODAwMDAwMDAKLUZPUlJFQUwgPSAwCi1KVVNUTE9PS0lORyA9IDEKLVNVU1BFTkRfTk9STUFMID0gMAotU1VTUEVORF9QQVVTRSA9IDEKLU5PQ0xBU1MgPSAoLTEpCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvZGRpdHlwZXMuaAotRERJX0RFVklDRV9BVFRSX1YwID0gMHgwMDAxCi1ERElfTkVWRVJTV0FQX0FDQyA9IDB4MDAKLURESV9TVFJVQ1RVUkVfTEVfQUNDID0gMHgwMQotRERJX1NUUlVDVFVSRV9CRV9BQ0MgPSAweDAyCi1ERElfU1RSSUNUT1JERVJfQUNDID0gMHgwMAotRERJX1VOT1JERVJFRF9PS19BQ0MgPSAweDAxCi1ERElfTUVSR0lOR19PS19BQ0MgPSAweDAyCi1ERElfTE9BRENBQ0hJTkdfT0tfQUNDID0gMHgwMwotRERJX1NUT1JFQ0FDSElOR19PS19BQ0MgPSAweDA0Ci1ERElfREFUQV9TWjAxX0FDQyA9IDEKLURESV9EQVRBX1NaMDJfQUNDID0gMgotRERJX0RBVEFfU1owNF9BQ0MgPSA0Ci1ERElfREFUQV9TWjA4X0FDQyA9IDgKLVZFUlNfQUNDSERMID0gMHgwMDAxCi1ERVZJRF9OT05FID0gMAotREVWSURfU0NTSTNfV1dOID0gMQotREVWSURfU0NTSV9TRVJJQUwgPSAyCi1ERVZJRF9GQUIgPSAzCi1ERVZJRF9FTkNBUCA9IDQKLURFVklEX01BWFRZUEUgPSA0Ci0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdmFyYXJncy5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdmFfbGlzdC5oCi1WQV9BTElHTiA9IDgKLWRlZiBfQVJHU0laRU9GKHQpOiByZXR1cm4gKChzaXplb2YgKHQpICsgVkFfQUxJR04gLSAxKSAmIH4oVkFfQUxJR04gLSAxKSkKLQotVkFfQUxJR04gPSA4Ci1kZWYgX0FSR1NJWkVPRih0KTogcmV0dXJuICgoc2l6ZW9mICh0KSArIFZBX0FMSUdOIC0gMSkgJiB+KFZBX0FMSUdOIC0gMSkpCi0KLU5TWVNDQUxMID0gMjU2Ci1TRV8zMlJWQUwxID0gMHgwCi1TRV8zMlJWQUwyID0gMHgxCi1TRV82NFJWQUwgPSAweDIKLVNFX1JWQUxfTUFTSyA9IDB4MwotU0VfTE9BREFCTEUgPSAweDA4Ci1TRV9MT0FERUQgPSAweDEwCi1TRV9OT1VOTE9BRCA9IDB4MjAKLVNFX0FSR0MgPSAweDQwCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvZGV2b3BzLmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9wb2xsLmgKLVBPTExJTiA9IDB4MDAwMQotUE9MTFBSSSA9IDB4MDAwMgotUE9MTE9VVCA9IDB4MDAwNAotUE9MTFJETk9STSA9IDB4MDA0MAotUE9MTFdSTk9STSA9IFBPTExPVVQKLVBPTExSREJBTkQgPSAweDAwODAKLVBPTExXUkJBTkQgPSAweDAxMDAKLVBPTExOT1JNID0gUE9MTFJETk9STQotUE9MTEVSUiA9IDB4MDAwOAotUE9MTEhVUCA9IDB4MDAxMAotUE9MTE5WQUwgPSAweDAwMjAKLVBPTExSRU1PVkUgPSAweDA4MDAKLVBPTExSRERBVEEgPSAweDAyMDAKLVBPTExOT0VSUiA9IDB4MDQwMAotUE9MTENMT1NFRCA9IDB4ODAwMAotCi0jIEluY2x1ZGVkIGZyb20gdm0vYXMuaAotCi0jIEluY2x1ZGVkIGZyb20gdm0vc2VnLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy92bm9kZS5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1WUk9PVCA9IDB4MDEKLVZOT0NBQ0hFID0gMHgwMgotVk5PTUFQID0gMHgwNAotVkRVUCA9IDB4MDgKLVZOT1NXQVAgPSAweDEwCi1WTk9NT1VOVCA9IDB4MjAKLVZJU1NXQVAgPSAweDQwCi1WU1dBUExJS0UgPSAweDgwCi1WVkZTTE9DSyA9IDB4MTAwCi1WVkZTV0FJVCA9IDB4MjAwCi1WVk1MT0NLID0gMHg0MDAKLVZESVJPUEVOID0gMHg4MDAKLVZWTUVYRUMgPSAweDEwMDAKLVZQWEZTID0gMHgyMDAwCi1BVF9UWVBFID0gMHgwMDAxCi1BVF9NT0RFID0gMHgwMDAyCi1BVF9VSUQgPSAweDAwMDQKLUFUX0dJRCA9IDB4MDAwOAotQVRfRlNJRCA9IDB4MDAxMAotQVRfTk9ERUlEID0gMHgwMDIwCi1BVF9OTElOSyA9IDB4MDA0MAotQVRfU0laRSA9IDB4MDA4MAotQVRfQVRJTUUgPSAweDAxMDAKLUFUX01USU1FID0gMHgwMjAwCi1BVF9DVElNRSA9IDB4MDQwMAotQVRfUkRFViA9IDB4MDgwMAotQVRfQkxLU0laRSA9IDB4MTAwMAotQVRfTkJMT0NLUyA9IDB4MjAwMAotQVRfVkNPREUgPSAweDQwMDAKLUFUX0FMTCA9IChBVF9UWVBFfEFUX01PREV8QVRfVUlEfEFUX0dJRHxBVF9GU0lEfEFUX05PREVJRHxcCi0gICAgICAgICAgICAgICAgICAgICAgICBBVF9OTElOS3xBVF9TSVpFfEFUX0FUSU1FfEFUX01USU1FfEFUX0NUSU1FfFwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUX1JERVZ8QVRfQkxLU0laRXxBVF9OQkxPQ0tTfEFUX1ZDT0RFKQotQVRfU1RBVCA9IChBVF9NT0RFfEFUX1VJRHxBVF9HSUR8QVRfRlNJRHxBVF9OT0RFSUR8QVRfTkxJTkt8XAotICAgICAgICAgICAgICAgICAgICAgICAgQVRfU0laRXxBVF9BVElNRXxBVF9NVElNRXxBVF9DVElNRXxBVF9SREVWKQotQVRfVElNRVMgPSAoQVRfQVRJTUV8QVRfTVRJTUV8QVRfQ1RJTUUpCi1BVF9OT1NFVCA9IChBVF9OTElOS3xBVF9SREVWfEFUX0ZTSUR8QVRfTk9ERUlEfEFUX1RZUEV8XAotICAgICAgICAgICAgICAgICAgICAgICAgQVRfQkxLU0laRXxBVF9OQkxPQ0tTfEFUX1ZDT0RFKQotVlNVSUQgPSAwbzQwMDAKLVZTR0lEID0gMG8yMDAwCi1WU1ZUWCA9IDBvMTAwMAotVlJFQUQgPSAwbzA0MDAKLVZXUklURSA9IDBvMDIwMAotVkVYRUMgPSAwbzAxMDAKLU1PREVNQVNLID0gMG83Nzc3Ci1QRVJNTUFTSyA9IDBvMDc3NwotZGVmIE1BTkRNT0RFKG1vZGUpOiByZXR1cm4gKCgobW9kZSkgJiAoVlNHSUR8KFZFWEVDPj4zKSkpID09IFZTR0lEKQotCi1WU0FfQUNMID0gMHgwMDAxCi1WU0FfQUNMQ05UID0gMHgwMDAyCi1WU0FfREZBQ0wgPSAweDAwMDQKLVZTQV9ERkFDTENOVCA9IDB4MDAwOAotTE9PS1VQX0RJUiA9IDB4MDEKLURVTVBfQUxMT0MgPSAwCi1EVU1QX0ZSRUUgPSAxCi1EVU1QX1NDQU4gPSAyCi1BVFRSX1VUSU1FID0gMHgwMQotQVRUUl9FWEVDID0gMHgwMgotQVRUUl9DT01NID0gMHgwNAotQVRUUl9ISU5UID0gMHgwOAotQVRUUl9SRUFMID0gMHgxMAotCi0jIEluY2x1ZGVkIGZyb20gdm0vZmF1bHRjb2RlLmgKLUZDX0hXRVJSID0gMHgxCi1GQ19BTElHTiA9IDB4MgotRkNfT0JKRVJSID0gMHgzCi1GQ19QUk9UID0gMHg0Ci1GQ19OT01BUCA9IDB4NQotRkNfTk9TVVBQT1JUID0gMHg2Ci1kZWYgRkNfTUFLRV9FUlIoZSk6IHJldHVybiAoKChlKSA8PCA4KSB8IEZDX09CSkVSUikKLQotZGVmIEZDX0NPREUoZmMpOiByZXR1cm4gKChmYykgJiAweGZmKQotCi1kZWYgRkNfRVJSTk8oZmMpOiByZXR1cm4gKCh1bnNpZ25lZCkoZmMpID4+IDgpCi0KLQotIyBJbmNsdWRlZCBmcm9tIHZtL2hhdC5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi0KLSMgSW5jbHVkZWQgZnJvbSB2bS9wYWdlLmgKLVBBR0VfSEFTSEFWRUxFTiA9IDQKLVBBR0VfSEFTSFZQU0hJRlQgPSA2Ci1QR19FWENMID0gMHgwMDAxCi1QR19XQUlUID0gMHgwMDAyCi1QR19QSFlTQ09OVElHID0gMHgwMDA0Ci1QR19NQVRDSF9DT0xPUiA9IDB4MDAwOAotUEdfTk9SRUxPQyA9IDB4MDAxMAotUEdfRlJFRV9MSVNUID0gMQotUEdfQ0FDSEVfTElTVCA9IDIKLVBHX0xJU1RfVEFJTCA9IDAKLVBHX0xJU1RfSEVBRCA9IDEKLWRlZiBwYWdlX25leHRfcmF3KFBQKTogcmV0dXJuIHBhZ2VfbmV4dG5fcmF3KChQUCksIDEpCi0KLVBBR0VfSU9fSU5VU0UgPSAweDEKLVBBR0VfSU9fV0FOVEVEID0gMHgyCi1QR1JFTF9OT1RSRUwgPSAweDEKLVBHUkVMX0NMRUFOID0gMHgyCi1QR1JFTF9NT0QgPSAweDMKLVBfRlJFRSA9IDB4ODAKLVBfTk9SRUxPQyA9IDB4NDAKLWRlZiBQUF9TRVRBR0VEKHBwKTogcmV0dXJuIEFTU0VSVChQUF9JU0FHRUQocHApKQotCi1IQVRfRkxBR1NfUkVTViA9IDB4RkYwMDAwMDAKLUhBVF9MT0FEID0gMHgwMAotSEFUX0xPQURfTE9DSyA9IDB4MDEKLUhBVF9MT0FEX0FEViA9IDB4MDQKLUhBVF9MT0FEX0NPTlRJRyA9IDB4MTAKLUhBVF9MT0FEX05PQ09OU0lTVCA9IDB4MjAKLUhBVF9MT0FEX1NIQVJFID0gMHg0MAotSEFUX0xPQURfUkVNQVAgPSAweDgwCi1IQVRfUkVMT0FEX1NIQVJFID0gMHgxMDAKLUhBVF9QTEFUX0FUVFJfTUFTSyA9IDB4RjAwMDAwCi1IQVRfUFJPVF9NQVNLID0gMHgwRgotSEFUX05PRkFVTFQgPSAweDEwCi1IQVRfTk9TWU5DID0gMHgyMAotSEFUX1NUUklDVE9SREVSID0gMHgwMDAwCi1IQVRfVU5PUkRFUkVEX09LID0gMHgwMTAwCi1IQVRfTUVSR0lOR19PSyA9IDB4MDIwMAotSEFUX0xPQURDQUNISU5HX09LID0gMHgwMzAwCi1IQVRfU1RPUkVDQUNISU5HX09LID0gMHgwNDAwCi1IQVRfT1JERVJfTUFTSyA9IDB4MDcwMAotSEFUX05FVkVSU1dBUCA9IDB4MDAwMAotSEFUX1NUUlVDVFVSRV9CRSA9IDB4MTAwMAotSEFUX1NUUlVDVFVSRV9MRSA9IDB4MjAwMAotSEFUX0VORElBTl9NQVNLID0gMHgzMDAwCi1IQVRfQ09XID0gMHgwMDAxCi1IQVRfVU5MT0FEID0gMHgwMAotSEFUX1VOTE9BRF9OT1NZTkMgPSAweDAyCi1IQVRfVU5MT0FEX1VOTE9DSyA9IDB4MDQKLUhBVF9VTkxPQURfT1RIRVIgPSAweDA4Ci1IQVRfVU5MT0FEX1VOTUFQID0gMHgxMAotSEFUX1NZTkNfRE9OVFpFUk8gPSAweDAwCi1IQVRfU1lOQ19aRVJPUk0gPSAweDAxCi1IQVRfU1lOQ19TVE9QT05fUkVGID0gMHgwMgotSEFUX1NZTkNfU1RPUE9OX01PRCA9IDB4MDQKLUhBVF9TWU5DX1NUT1BPTl9STSA9IChIQVRfU1lOQ19TVE9QT05fUkVGIHwgSEFUX1NZTkNfU1RPUE9OX01PRCkKLUhBVF9EVVBfQUxMID0gMQotSEFUX0RVUF9DT1cgPSAyCi1IQVRfTUFQID0gMHgwMAotSEFUX0FEVl9QR1VOTE9BRCA9IDB4MDAKLUhBVF9GT1JDRV9QR1VOTE9BRCA9IDB4MDEKLVBfTU9EID0gMHgxCi1QX1JFRiA9IDB4MgotUF9STyA9IDB4NAotZGVmIGhhdF9pc21vZChwcCk6IHJldHVybiAoaGF0X3BhZ2VfZ2V0YXR0cihwcCwgUF9NT0QpKQotCi1kZWYgaGF0X2lzcmVmKHBwKTogcmV0dXJuIChoYXRfcGFnZV9nZXRhdHRyKHBwLCBQX1JFRikpCi0KLWRlZiBoYXRfaXNybyhwcCk6IHJldHVybiAoaGF0X3BhZ2VfZ2V0YXR0cihwcCwgUF9STykpCi0KLWRlZiBoYXRfc2V0bW9kKHBwKTogcmV0dXJuIChoYXRfcGFnZV9zZXRhdHRyKHBwLCBQX01PRCkpCi0KLWRlZiBoYXRfc2V0cmVmKHBwKTogcmV0dXJuIChoYXRfcGFnZV9zZXRhdHRyKHBwLCBQX1JFRikpCi0KLWRlZiBoYXRfc2V0cmVmbW9kKHBwKTogcmV0dXJuIChoYXRfcGFnZV9zZXRhdHRyKHBwLCBQX1JFRnxQX01PRCkpCi0KLWRlZiBoYXRfY2xybW9kKHBwKTogcmV0dXJuIChoYXRfcGFnZV9jbHJhdHRyKHBwLCBQX01PRCkpCi0KLWRlZiBoYXRfY2xycmVmKHBwKTogcmV0dXJuIChoYXRfcGFnZV9jbHJhdHRyKHBwLCBQX1JFRikpCi0KLWRlZiBoYXRfY2xycmVmbW9kKHBwKTogcmV0dXJuIChoYXRfcGFnZV9jbHJhdHRyKHBwLCBQX1JFRnxQX01PRCkpCi0KLWRlZiBoYXRfcGFnZV9pc19tYXBwZWQocHApOiByZXR1cm4gKGhhdF9wYWdlX2dldHNoYXJlKHBwKSkKLQotSEFUX0RPTlRBTExPQyA9IDAKLUhBVF9BTExPQyA9IDEKLUhSTV9TSElGVCA9IDQKLUhSTV9CWVRFUyA9ICgxIDw8IEhSTV9TSElGVCkKLUhSTV9QQUdFUyA9ICgoSFJNX0JZVEVTICogTkJCWSkgLyAyKQotSFJNX1BHUEVSQllURSA9IChOQkJZLzIpCi1IUk1fUEdCWVRFTUFTSyA9IChIUk1fUEdQRVJCWVRFLTEpCi1IUk1fSEFTSFNJWkUgPSAweDIwMAotSFJNX0hBU0hNQVNLID0gKEhSTV9IQVNIU0laRSAtIDEpCi1IUk1fQkxJU1RfSU5DUiA9IDB4MjAwCi1IUk1fU1dTTU9OSUQgPSAxCi1TU0xfTkxFVkVMUyA9IDQKLVNTTF9CRkFDVE9SID0gNAotU1NMX0xPRzJCRiA9IDIKLVNFR1BfQVNZTkNfRkxVU0ggPSAweDEKLVNFR1BfRk9SQ0VfV0lSRUQgPSAweDIKLVNFR1BfU1VDQ0VTUyA9IDAKLVNFR1BfRkFJTCA9IDEKLWRlZiBzZWdfcGFnZXMoc2VnKTogcmV0dXJuIFwKLQotSUVfTk9NRU0gPSAtMQotQVNfUEFHTENLID0gMHg4MAotQVNfQ0xBSU1HQVAgPSAweDQwCi1BU19VTk1BUFdBSVQgPSAweDIwCi1kZWYgQVNfVFlQRV82NEJJVChhc18pOiByZXR1cm4gXAotCi1BU19MUkVQX0xJTktFRExJU1QgPSAwCi1BU19MUkVQX1NLSVBMSVNUID0gMQotQVNfTVVUQVRJT05fVEhSRVNIID0gMjI1Ci1BSF9ESVIgPSAweDEKLUFIX0xPID0gMHgwCi1BSF9ISSA9IDB4MQotQUhfQ09OVEFJTiA9IDB4MgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2RkaWRtYXJlcS5oCi1ETUFfVU5JVF84ID0gMQotRE1BX1VOSVRfMTYgPSAyCi1ETUFfVU5JVF8zMiA9IDQKLURNQUxJTV9WRVIwID0gKCgweDg2MDAwMDAwKSArIDApCi1ERElfRE1BX0ZPUkNFX1BIWVNJQ0FMID0gMHgwMTAwCi1ETUFfQVRUUl9WMCA9IDAKLURNQV9BVFRSX1ZFUlNJT04gPSBETUFfQVRUUl9WMAotRERJX0RNQV9DQUxMQkFDS19SVU5PVVQgPSAwCi1ERElfRE1BX0NBTExCQUNLX0RPTkUgPSAxCi1ERElfRE1BX1dSSVRFID0gMHgwMDAxCi1ERElfRE1BX1JFQUQgPSAweDAwMDIKLURESV9ETUFfUkRXUiA9IChERElfRE1BX1JFQUQgfCBERElfRE1BX1dSSVRFKQotRERJX0RNQV9SRURaT05FID0gMHgwMDA0Ci1ERElfRE1BX1BBUlRJQUwgPSAweDAwMDgKLURESV9ETUFfQ09OU0lTVEVOVCA9IDB4MDAxMAotRERJX0RNQV9FWENMVVNJVkUgPSAweDAwMjAKLURESV9ETUFfU1RSRUFNSU5HID0gMHgwMDQwCi1ERElfRE1BX1NCVVNfNjRCSVQgPSAweDIwMDAKLURESV9ETUFfTUFQUEVEID0gMAotRERJX0RNQV9NQVBPSyA9IDAKLURESV9ETUFfUEFSVElBTF9NQVAgPSAxCi1ERElfRE1BX0RPTkUgPSAyCi1ERElfRE1BX05PUkVTT1VSQ0VTID0gLTEKLURESV9ETUFfTk9NQVBQSU5HID0gLTIKLURESV9ETUFfVE9PQklHID0gLTMKLURESV9ETUFfVE9PU01BTEwgPSAtNAotRERJX0RNQV9MT0NLRUQgPSAtNQotRERJX0RNQV9CQURMSU1JVFMgPSAtNgotRERJX0RNQV9TVEFMRSA9IC03Ci1ERElfRE1BX0JBREFUVFIgPSAtOAotRERJX0RNQV9JTlVTRSA9IC05Ci1ERElfRE1BX1NZTkNfRk9SREVWID0gMHgwCi1ERElfRE1BX1NZTkNfRk9SQ1BVID0gMHgxCi1ERElfRE1BX1NZTkNfRk9SS0VSTkVMID0gMHgyCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvZGRpbWFwcmVxLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9tbWFuLmgKLVBST1RfUkVBRCA9IDB4MQotUFJPVF9XUklURSA9IDB4MgotUFJPVF9FWEVDID0gMHg0Ci1QUk9UX1VTRVIgPSAweDgKLVBST1RfWkZPRCA9IChQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDIHwgUFJPVF9VU0VSKQotUFJPVF9BTEwgPSAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQyB8IFBST1RfVVNFUikKLVBST1RfTk9ORSA9IDB4MAotTUFQX1NIQVJFRCA9IDEKLU1BUF9QUklWQVRFID0gMgotTUFQX1RZUEUgPSAweGYKLU1BUF9GSVhFRCA9IDB4MTAKLU1BUF9OT1JFU0VSVkUgPSAweDQwCi1NQVBfQU5PTiA9IDB4MTAwCi1NQVBfQU5PTllNT1VTID0gTUFQX0FOT04KLU1BUF9SRU5BTUUgPSAweDIwCi1QUk9DX1RFWFQgPSAoUFJPVF9FWEVDIHwgUFJPVF9SRUFEKQotUFJPQ19EQVRBID0gKFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMpCi1TSEFSRUQgPSAweDEwCi1QUklWQVRFID0gMHgyMAotVkFMSURfQVRUUiA9IChQUk9UX1JFQUR8UFJPVF9XUklURXxQUk9UX0VYRUN8U0hBUkVEfFBSSVZBVEUpCi1QUk9UX0VYQ0wgPSAweDIwCi1fTUFQX0xPVzMyID0gMHg4MAotX01BUF9ORVcgPSAweDgwMDAwMDAwCi1mcm9tIFRZUEVTIGltcG9ydCAqCi1NQURWX05PUk1BTCA9IDAKLU1BRFZfUkFORE9NID0gMQotTUFEVl9TRVFVRU5USUFMID0gMgotTUFEVl9XSUxMTkVFRCA9IDMKLU1BRFZfRE9OVE5FRUQgPSA0Ci1NQURWX0ZSRUUgPSA1Ci1NU19PTERTWU5DID0gMHgwCi1NU19TWU5DID0gMHg0Ci1NU19BU1lOQyA9IDB4MQotTVNfSU5WQUxJREFURSA9IDB4MgotTUNfU1lOQyA9IDEKLU1DX0xPQ0sgPSAyCi1NQ19VTkxPQ0sgPSAzCi1NQ19BRFZJU0UgPSA0Ci1NQ19MT0NLQVMgPSA1Ci1NQ19VTkxPQ0tBUyA9IDYKLU1DTF9DVVJSRU5UID0gMHgxCi1NQ0xfRlVUVVJFID0gMHgyCi1ERElfTUFQX1ZFUlNJT04gPSAweDAwMDEKLURESV9NRl9VU0VSX01BUFBJTkcgPSAweDEKLURESV9NRl9LRVJORUxfTUFQUElORyA9IDB4MgotRERJX01GX0RFVklDRV9NQVBQSU5HID0gMHg0Ci1ERElfTUVfR0VORVJJQyA9ICgtMSkKLURESV9NRV9VTklNUExFTUVOVEVEID0gKC0yKQotRERJX01FX05PUkVTT1VSQ0VTID0gKC0zKQotRERJX01FX1VOU1VQUE9SVEVEID0gKC00KQotRERJX01FX1JFR1NQRUNfUkFOR0UgPSAoLTUpCi1ERElfTUVfUk5VTUJFUl9SQU5HRSA9ICgtNikKLURESV9NRV9JTlZBTCA9ICgtNykKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9kZGlwcm9wZGVmcy5oCi1kZWYgQ0VMTFNfMTI3NV9UT19CWVRFUyhuKTogcmV0dXJuICgobikgKiBQUk9QXzEyNzVfQ0VMTF9TSVpFKQotCi1kZWYgQllURVNfVE9fMTI3NV9DRUxMUyhuKTogcmV0dXJuICgobikgLyBQUk9QXzEyNzVfQ0VMTF9TSVpFKQotCi1QSF9GUk9NX1BST00gPSAweDAxCi1ERElfUFJPUF9TVUNDRVNTID0gMAotRERJX1BST1BfTk9UX0ZPVU5EID0gMQotRERJX1BST1BfVU5ERUZJTkVEID0gMgotRERJX1BST1BfTk9fTUVNT1JZID0gMwotRERJX1BST1BfSU5WQUxfQVJHID0gNAotRERJX1BST1BfQlVGX1RPT19TTUFMTCA9IDUKLURESV9QUk9QX0NBTk5PVF9ERUNPREUgPSA2Ci1ERElfUFJPUF9DQU5OT1RfRU5DT0RFID0gNwotRERJX1BST1BfRU5EX09GX0RBVEEgPSA4Ci1ERElfUFJPUF9GT1VORF8xMjc1ID0gMjU1Ci1QUk9QXzEyNzVfSU5UX1NJWkUgPSA0Ci1ERElfUFJPUF9ET05UUEFTUyA9IDB4MDAwMQotRERJX1BST1BfQ0FOU0xFRVAgPSAweDAwMDIKLURESV9QUk9QX1NZU1RFTV9ERUYgPSAweDAwMDQKLURESV9QUk9QX05PVFBST00gPSAweDAwMDgKLURESV9QUk9QX0RPTlRTTEVFUCA9IDB4MDAxMAotRERJX1BST1BfU1RBQ0tfQ1JFQVRFID0gMHgwMDIwCi1ERElfUFJPUF9VTkRFRl9JVCA9IDB4MDA0MAotRERJX1BST1BfSFdfREVGID0gMHgwMDgwCi1ERElfUFJPUF9UWVBFX0lOVCA9IDB4MDEwMAotRERJX1BST1BfVFlQRV9TVFJJTkcgPSAweDAyMDAKLURESV9QUk9QX1RZUEVfQllURSA9IDB4MDQwMAotRERJX1BST1BfVFlQRV9DT01QT1NJVEUgPSAweDA4MDAKLURESV9QUk9QX1RZUEVfQU5ZID0gKERESV9QUk9QX1RZUEVfSU5UICB8ICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERElfUFJPUF9UWVBFX1NUUklORyAgICB8ICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERElfUFJPUF9UWVBFX0JZVEUgICAgICB8ICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERElfUFJPUF9UWVBFX0NPTVBPU0lURSkKLURESV9QUk9QX1RZUEVfTUFTSyA9IChERElfUFJPUF9UWVBFX0lOVCB8ICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERElfUFJPUF9UWVBFX1NUUklORyAgICB8ICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERElfUFJPUF9UWVBFX0JZVEUgICAgICB8ICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERElfUFJPUF9UWVBFX0NPTVBPU0lURSkKLURESV9SRUxBVElWRV9BRERSRVNTSU5HID0gInJlbGF0aXZlLWFkZHJlc3NpbmciCi1ERElfR0VORVJJQ19BRERSRVNTSU5HID0gImdlbmVyaWMtYWRkcmVzc2luZyIKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9kZGlkZXZtYXAuaAotS01FTV9QQUdFQUJMRSA9IDB4MTAwCi1LTUVNX05PTl9QQUdFQUJMRSA9IDB4MjAwCi1VTUVNX0xPQ0tFRCA9IDB4NDAwCi1VTUVNX1RSQVNIID0gMHg4MDAKLURFVk1BUF9PUFNfUkVWID0gMQotREVWTUFQX0RFRkFVTFRTID0gMHgwMAotREVWTUFQX01BUFBJTkdfSU5WQUxJRCA9IDB4MDEKLURFVk1BUF9BTExPV19SRU1BUCA9IDB4MDIKLURFVk1BUF9VU0VfUEFHRVNJWkUgPSAweDA0Ci1ERVZNQVBfU0VUVVBfRkxBR1MgPSBcCi0gICAgICAgIChERVZNQVBfTUFQUElOR19JTlZBTElEIHwgREVWTUFQX0FMTE9XX1JFTUFQIHwgREVWTUFQX1VTRV9QQUdFU0laRSkKLURFVk1BUF9TRVRVUF9ET05FID0gMHgxMDAKLURFVk1BUF9MT0NLX0lOSVRFRCA9IDB4MjAwCi1ERVZNQVBfRkFVTFRJTkcgPSAweDQwMAotREVWTUFQX0xPQ0tFRCA9IDB4ODAwCi1ERVZNQVBfRkxBR19MQVJHRSA9IDB4MTAwMAotRERJX1VNRU1fU0xFRVAgPSAweDAKLURESV9VTUVNX05PU0xFRVAgPSAweDAxCi1ERElfVU1FTV9QQUdFQUJMRSA9IDB4MDIKLURESV9VTUVNX1RSQVNIID0gMHgwNAotRERJX1VNRU1MT0NLX1JFQUQgPSAweDAxCi1ERElfVU1FTUxPQ0tfV1JJVEUgPSAweDAyCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvbmV4dXNkZWZzLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9uZXh1c2ludHIuaAotQlVTT19SRVYgPSA0Ci1CVVNPX1JFVl8zID0gMwotQlVTT19SRVZfNCA9IDQKLURFVk9fUkVWID0gMwotQ0JfUkVWID0gMQotRERJX0lERU5USUZJRUQgPSAoMCkKLURESV9OT1RfSURFTlRJRklFRCA9ICgtMSkKLURESV9QUk9CRV9GQUlMVVJFID0gRU5YSU8KLURESV9QUk9CRV9ET05UQ0FSRSA9IDAKLURESV9QUk9CRV9QQVJUSUFMID0gMQotRERJX1BST0JFX1NVQ0NFU1MgPSAyCi1NQVBERVZfUkVWID0gMQotZnJvbSBUWVBFUyBpbXBvcnQgKgotRF9ORVcgPSAweDAwCi1fRF9PTEQgPSAweDAxCi1EX1RBUEUgPSAweDA4Ci1EX01UU0FGRSA9IDB4MDAyMAotX0RfUU5FWFRMRVNTID0gMHgwMDQwCi1fRF9NVE9DU0hBUkVEID0gMHgwMDgwCi1EX01UT0NFWENMID0gMHgwODAwCi1EX01UUFVUU0hBUkVEID0gMHgxMDAwCi1EX01UUEVSUSA9IDB4MjAwMAotRF9NVFFQQUlSID0gMHg0MDAwCi1EX01UUEVSTU9EID0gMHg2MDAwCi1EX01UT1VUUEVSSU0gPSAweDgwMDAKLV9EX01UQ0JTSEFSRUQgPSAweDEwMDAwCi1EX01USU5ORVJfTU9EID0gKERfTVRQVVRTSEFSRUR8X0RfTVRPQ1NIQVJFRHxfRF9NVENCU0hBUkVEKQotRF9NVE9VVEVSX01PRCA9IChEX01UT0NFWENMKQotRF9NUCA9IERfTVRTQUZFCi1EXzY0QklUID0gMHgyMDAKLURfU1lOQ1NUUiA9IDB4NDAwCi1EX0RFVk1BUCA9IDB4MTAwCi1EX0hPVFBMVUcgPSAweDQKLVNORFpFUk8gPSAweDAwMQotU05EUElQRSA9IDB4MDAyCi1STk9STSA9IDB4MDAwCi1STVNHRCA9IDB4MDAxCi1STVNHTiA9IDB4MDAyCi1STU9ERU1BU0sgPSAweDAwMwotUlBST1REQVQgPSAweDAwNAotUlBST1RESVMgPSAweDAwOAotUlBST1ROT1JNID0gMHgwMTAKLVJQUk9UTUFTSyA9IDB4MDFjCi1SRkxVU0hNQVNLID0gMHgwMjAKLVJGTFVTSFBDUFJPVCA9IDB4MDIwCi1SRVJSTk9STSA9IDB4MDAxCi1SRVJSTk9OUEVSU0lTVCA9IDB4MDAyCi1SRVJSTUFTSyA9IChSRVJSTk9STXxSRVJSTk9OUEVSU0lTVCkKLVdFUlJOT1JNID0gMHgwMDQKLVdFUlJOT05QRVJTSVNUID0gMHgwMDgKLVdFUlJNQVNLID0gKFdFUlJOT1JNfFdFUlJOT05QRVJTSVNUKQotRkxVU0hSID0gMHgwMQotRkxVU0hXID0gMHgwMgotRkxVU0hSVyA9IDB4MDMKLUZMVVNIQkFORCA9IDB4MDQKLU1BUElOT0sgPSAweDAxCi1OT01BUElOID0gMHgwMgotUkVNQVBPSyA9IDB4MDQKLU5PUkVNQVAgPSAweDA4Ci1TX0lOUFVUID0gMHgwMDAxCi1TX0hJUFJJID0gMHgwMDAyCi1TX09VVFBVVCA9IDB4MDAwNAotU19NU0cgPSAweDAwMDgKLVNfRVJST1IgPSAweDAwMTAKLVNfSEFOR1VQID0gMHgwMDIwCi1TX1JETk9STSA9IDB4MDA0MAotU19XUk5PUk0gPSBTX09VVFBVVAotU19SREJBTkQgPSAweDAwODAKLVNfV1JCQU5EID0gMHgwMTAwCi1TX0JBTkRVUkcgPSAweDAyMDAKLVJTX0hJUFJJID0gMHgwMQotU1RSVUlPX1BPU1RQT05FID0gMHgwOAotU1RSVUlPX01BUElOID0gMHgxMAotTVNHX0hJUFJJID0gMHgwMQotTVNHX0FOWSA9IDB4MDIKLU1TR19CQU5EID0gMHgwNAotTVNHX1hQRzQgPSAweDA4Ci1NU0dfSVBFRUsgPSAweDEwCi1NU0dfRElTQ0FSRFRBSUwgPSAweDIwCi1NU0dfSE9MRFNJRyA9IDB4NDAKLU1TR19JR05FUlJPUiA9IDB4ODAKLU1TR19ERUxBWUVSUk9SID0gMHgxMDAKLU1TR19JR05GTE9XID0gMHgyMDAKLU1TR19OT01BUksgPSAweDQwMAotTU9SRUNUTCA9IDEKLU1PUkVEQVRBID0gMgotTVVYSURfQUxMID0gKC0xKQotQU5ZTUFSSyA9IDB4MDEKLUxBU1RNQVJLID0gMHgwMgotX0lORlRJTSA9IC0xCi1JTkZUSU0gPSBfSU5GVElNCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1zdW5vczUvVFlQRVMucHkgYi9MaWIvcGxhdC1zdW5vczUvVFlQRVMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNGU2YjEuLjAwMDAwMDAKLS0tIGEvTGliL3BsYXQtc3Vub3M1L1RZUEVTLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLSMgR2VuZXJhdGVkIGJ5IGgycHkgZnJvbSAvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9pc2FfZGVmcy5oCi1fQ0hBUl9BTElHTk1FTlQgPSAxCi1fU0hPUlRfQUxJR05NRU5UID0gMgotX0lOVF9BTElHTk1FTlQgPSA0Ci1fTE9OR19BTElHTk1FTlQgPSA4Ci1fTE9OR19MT05HX0FMSUdOTUVOVCA9IDgKLV9ET1VCTEVfQUxJR05NRU5UID0gOAotX0xPTkdfRE9VQkxFX0FMSUdOTUVOVCA9IDE2Ci1fUE9JTlRFUl9BTElHTk1FTlQgPSA4Ci1fTUFYX0FMSUdOTUVOVCA9IDE2Ci1fQUxJR05NRU5UX1JFUVVJUkVEID0gMQotX0NIQVJfQUxJR05NRU5UID0gMQotX1NIT1JUX0FMSUdOTUVOVCA9IDIKLV9JTlRfQUxJR05NRU5UID0gNAotX0xPTkdfQUxJR05NRU5UID0gNAotX0xPTkdfTE9OR19BTElHTk1FTlQgPSA0Ci1fRE9VQkxFX0FMSUdOTUVOVCA9IDQKLV9MT05HX0RPVUJMRV9BTElHTk1FTlQgPSA0Ci1fUE9JTlRFUl9BTElHTk1FTlQgPSA0Ci1fTUFYX0FMSUdOTUVOVCA9IDQKLV9BTElHTk1FTlRfUkVRVUlSRUQgPSAwCi1fQ0hBUl9BTElHTk1FTlQgPSAxCi1fU0hPUlRfQUxJR05NRU5UID0gMgotX0lOVF9BTElHTk1FTlQgPSA0Ci1fTE9OR19MT05HX0FMSUdOTUVOVCA9IDgKLV9ET1VCTEVfQUxJR05NRU5UID0gOAotX0FMSUdOTUVOVF9SRVFVSVJFRCA9IDEKLV9MT05HX0FMSUdOTUVOVCA9IDQKLV9MT05HX0RPVUJMRV9BTElHTk1FTlQgPSA4Ci1fUE9JTlRFUl9BTElHTk1FTlQgPSA0Ci1fTUFYX0FMSUdOTUVOVCA9IDgKLV9MT05HX0FMSUdOTUVOVCA9IDgKLV9MT05HX0RPVUJMRV9BTElHTk1FTlQgPSAxNgotX1BPSU5URVJfQUxJR05NRU5UID0gOAotX01BWF9BTElHTk1FTlQgPSAxNgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2ZlYXR1cmVfdGVzdHMuaAotX1BPU0lYX0NfU09VUkNFID0gMQotX0xBUkdFRklMRTY0X1NPVVJDRSA9IDEKLV9MQVJHRUZJTEVfU09VUkNFID0gMQotX0ZJTEVfT0ZGU0VUX0JJVFMgPSA2NAotX0ZJTEVfT0ZGU0VUX0JJVFMgPSAzMgotX1BPU0lYX0NfU09VUkNFID0gMTk5NTA2Ci1fUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgPSAxCi1fWE9QRU5fVkVSU0lPTiA9IDUwMAotX1hPUEVOX1ZFUlNJT04gPSA0Ci1fWE9QRU5fVkVSU0lPTiA9IDMKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9tYWNodHlwZXMuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2ludHR5cGVzLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9pbnRfdHlwZXMuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2ludF9saW1pdHMuaAotSU5UOF9NQVggPSAoMTI3KQotSU5UMTZfTUFYID0gKDMyNzY3KQotSU5UMzJfTUFYID0gKDIxNDc0ODM2NDcpCi1JTlRNQVhfTUFYID0gSU5UMzJfTUFYCi1JTlRfTEVBU1Q4X01BWCA9IElOVDhfTUFYCi1JTlRfTEVBU1QxNl9NQVggPSBJTlQxNl9NQVgKLUlOVF9MRUFTVDMyX01BWCA9IElOVDMyX01BWAotSU5UOF9NSU4gPSAoLTEyOCkKLUlOVDE2X01JTiA9ICgtMzI3NjctMSkKLUlOVDMyX01JTiA9ICgtMjE0NzQ4MzY0Ny0xKQotSU5UTUFYX01JTiA9IElOVDMyX01JTgotSU5UX0xFQVNUOF9NSU4gPSBJTlQ4X01JTgotSU5UX0xFQVNUMTZfTUlOID0gSU5UMTZfTUlOCi1JTlRfTEVBU1QzMl9NSU4gPSBJTlQzMl9NSU4KLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9pbnRfY29uc3QuaAotZGVmIElOVDhfQyhjKTogcmV0dXJuIChjKQotCi1kZWYgSU5UMTZfQyhjKTogcmV0dXJuIChjKQotCi1kZWYgSU5UMzJfQyhjKTogcmV0dXJuIChjKQotCi1kZWYgSU5UNjRfQyhjKTogcmV0dXJuIF9fQ09OQ0FUX18oYyxsKQotCi1kZWYgSU5UNjRfQyhjKTogcmV0dXJuIF9fQ09OQ0FUX18oYyxsbCkKLQotZGVmIFVJTlQ4X0MoYyk6IHJldHVybiBfX0NPTkNBVF9fKGMsdSkKLQotZGVmIFVJTlQxNl9DKGMpOiByZXR1cm4gX19DT05DQVRfXyhjLHUpCi0KLWRlZiBVSU5UMzJfQyhjKTogcmV0dXJuIF9fQ09OQ0FUX18oYyx1KQotCi1kZWYgVUlOVDY0X0MoYyk6IHJldHVybiBfX0NPTkNBVF9fKGMsdWwpCi0KLWRlZiBVSU5UNjRfQyhjKTogcmV0dXJuIF9fQ09OQ0FUX18oYyx1bGwpCi0KLWRlZiBJTlRNQVhfQyhjKTogcmV0dXJuIF9fQ09OQ0FUX18oYyxsKQotCi1kZWYgVUlOVE1BWF9DKGMpOiByZXR1cm4gX19DT05DQVRfXyhjLHVsKQotCi1kZWYgSU5UTUFYX0MoYyk6IHJldHVybiBfX0NPTkNBVF9fKGMsbGwpCi0KLWRlZiBVSU5UTUFYX0MoYyk6IHJldHVybiBfX0NPTkNBVF9fKGMsdWxsKQotCi1kZWYgSU5UTUFYX0MoYyk6IHJldHVybiAoYykKLQotZGVmIFVJTlRNQVhfQyhjKTogcmV0dXJuIChjKQotCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvaW50X2ZtdGlvLmgKLVBSSWQ4ID0gImQiCi1QUklkMTYgPSAiZCIKLVBSSWQzMiA9ICJkIgotUFJJZDY0ID0gImxkIgotUFJJZDY0ID0gImxsZCIKLVBSSWRMRUFTVDggPSAiZCIKLVBSSWRMRUFTVDE2ID0gImQiCi1QUklkTEVBU1QzMiA9ICJkIgotUFJJZExFQVNUNjQgPSAibGQiCi1QUklkTEVBU1Q2NCA9ICJsbGQiCi1QUklpOCA9ICJpIgotUFJJaTE2ID0gImkiCi1QUklpMzIgPSAiaSIKLVBSSWk2NCA9ICJsaSIKLVBSSWk2NCA9ICJsbGkiCi1QUklpTEVBU1Q4ID0gImkiCi1QUklpTEVBU1QxNiA9ICJpIgotUFJJaUxFQVNUMzIgPSAiaSIKLVBSSWlMRUFTVDY0ID0gImxpIgotUFJJaUxFQVNUNjQgPSAibGxpIgotUFJJbzggPSAibyIKLVBSSW8xNiA9ICJvIgotUFJJbzMyID0gIm8iCi1QUklvNjQgPSAibG8iCi1QUklvNjQgPSAibGxvIgotUFJJb0xFQVNUOCA9ICJvIgotUFJJb0xFQVNUMTYgPSAibyIKLVBSSW9MRUFTVDMyID0gIm8iCi1QUklvTEVBU1Q2NCA9ICJsbyIKLVBSSW9MRUFTVDY0ID0gImxsbyIKLVBSSXg4ID0gIngiCi1QUkl4MTYgPSAieCIKLVBSSXgzMiA9ICJ4IgotUFJJeDY0ID0gImx4IgotUFJJeDY0ID0gImxseCIKLVBSSXhMRUFTVDggPSAieCIKLVBSSXhMRUFTVDE2ID0gIngiCi1QUkl4TEVBU1QzMiA9ICJ4IgotUFJJeExFQVNUNjQgPSAibHgiCi1QUkl4TEVBU1Q2NCA9ICJsbHgiCi1QUklYOCA9ICJYIgotUFJJWDE2ID0gIlgiCi1QUklYMzIgPSAiWCIKLVBSSVg2NCA9ICJsWCIKLVBSSVg2NCA9ICJsbFgiCi1QUklYTEVBU1Q4ID0gIlgiCi1QUklYTEVBU1QxNiA9ICJYIgotUFJJWExFQVNUMzIgPSAiWCIKLVBSSVhMRUFTVDY0ID0gImxYIgotUFJJWExFQVNUNjQgPSAibGxYIgotUFJJdTggPSAidSIKLVBSSXUxNiA9ICJ1IgotUFJJdTMyID0gInUiCi1QUkl1NjQgPSAibHUiCi1QUkl1NjQgPSAibGx1IgotUFJJdUxFQVNUOCA9ICJ1IgotUFJJdUxFQVNUMTYgPSAidSIKLVBSSXVMRUFTVDMyID0gInUiCi1QUkl1TEVBU1Q2NCA9ICJsdSIKLVBSSXVMRUFTVDY0ID0gImxsdSIKLVNDTmQxNiA9ICJoZCIKLVNDTmQzMiA9ICJkIgotU0NOZDY0ID0gImxkIgotU0NOZDY0ID0gImxsZCIKLVNDTmkxNiA9ICJoaSIKLVNDTmkzMiA9ICJpIgotU0NOaTY0ID0gImxpIgotU0NOaTY0ID0gImxsaSIKLVNDTm8xNiA9ICJobyIKLVNDTm8zMiA9ICJvIgotU0NObzY0ID0gImxvIgotU0NObzY0ID0gImxsbyIKLVNDTnUxNiA9ICJodSIKLVNDTnUzMiA9ICJ1IgotU0NOdTY0ID0gImx1IgotU0NOdTY0ID0gImxsdSIKLVNDTngxNiA9ICJoeCIKLVNDTngzMiA9ICJ4IgotU0NOeDY0ID0gImx4IgotU0NOeDY0ID0gImxseCIKLVBSSWRNQVggPSAibGQiCi1QUklvTUFYID0gImxvIgotUFJJeE1BWCA9ICJseCIKLVBSSXVNQVggPSAibHUiCi1QUklkTUFYID0gImxsZCIKLVBSSW9NQVggPSAibGxvIgotUFJJeE1BWCA9ICJsbHgiCi1QUkl1TUFYID0gImxsdSIKLVBSSWRNQVggPSAiZCIKLVBSSW9NQVggPSAibyIKLVBSSXhNQVggPSAieCIKLVBSSXVNQVggPSAidSIKLVNDTmlNQVggPSAibGkiCi1TQ05kTUFYID0gImxkIgotU0NOb01BWCA9ICJsbyIKLVNDTnhNQVggPSAibHgiCi1TQ05pTUFYID0gImxsaSIKLVNDTmRNQVggPSAibGxkIgotU0NOb01BWCA9ICJsbG8iCi1TQ054TUFYID0gImxseCIKLVNDTmlNQVggPSAiaSIKLVNDTmRNQVggPSAiZCIKLVNDTm9NQVggPSAibyIKLVNDTnhNQVggPSAieCIKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy90eXBlczMyLmgKLVNIUlRfTUlOID0gKC0zMjc2OCkKLVNIUlRfTUFYID0gMzI3NjcKLVVTSFJUX01BWCA9IDY1NTM1Ci1JTlRfTUlOID0gKC0yMTQ3NDgzNjQ3LTEpCi1JTlRfTUFYID0gMjE0NzQ4MzY0NwotTE9OR19NSU4gPSAoLTkyMjMzNzIwMzY4NTQ3NzU4MDctMSkKLUxPTkdfTUFYID0gOTIyMzM3MjAzNjg1NDc3NTgwNwotTE9OR19NSU4gPSAoLTIxNDc0ODM2NDctMSkKLUxPTkdfTUFYID0gMjE0NzQ4MzY0NwotUF9NWUlEID0gKC0xKQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3NlbGVjdC5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdGltZS5oCi1USU1FMzJfTUFYID0gSU5UMzJfTUFYCi1USU1FMzJfTUlOID0gSU5UMzJfTUlOCi1kZWYgVElNRVZBTF9PVkVSRkxPVyh0dik6IHJldHVybiBcCi0KLWZyb20gVFlQRVMgaW1wb3J0ICoKLURTVF9OT05FID0gMAotRFNUX1VTQSA9IDEKLURTVF9BVVNUID0gMgotRFNUX1dFVCA9IDMKLURTVF9NRVQgPSA0Ci1EU1RfRUVUID0gNQotRFNUX0NBTiA9IDYKLURTVF9HQiA9IDcKLURTVF9SVU0gPSA4Ci1EU1RfVFVSID0gOQotRFNUX0FVU1RBTFQgPSAxMAotSVRJTUVSX1JFQUwgPSAwCi1JVElNRVJfVklSVFVBTCA9IDEKLUlUSU1FUl9QUk9GID0gMgotSVRJTUVSX1JFQUxQUk9GID0gMwotZGVmIElUSU1FUlZBTF9PVkVSRkxPVyhpdHYpOiByZXR1cm4gXAotCi1TRUMgPSAxCi1NSUxMSVNFQyA9IDEwMDAKLU1JQ1JPU0VDID0gMTAwMDAwMAotTkFOT1NFQyA9IDEwMDAwMDAwMDAKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy90aW1lX2ltcGwuaAotZGVmIFRJTUVTUEVDX09WRVJGTE9XKHRzKTogcmV0dXJuIFwKLQotZGVmIElUSU1FUlNQRUNfT1ZFUkZMT1coaXQpOiByZXR1cm4gXAotCi1fX0NMT0NLX1JFQUxUSU1FMCA9IDAKLUNMT0NLX1ZJUlRVQUwgPSAxCi1DTE9DS19QUk9GID0gMgotX19DTE9DS19SRUFMVElNRTMgPSAzCi1DTE9DS19ISUdIUkVTID0gNAotQ0xPQ0tfTUFYID0gNQotQ0xPQ0tfUkVBTFRJTUUgPSBfX0NMT0NLX1JFQUxUSU1FMwotQ0xPQ0tfUkVBTFRJTUUgPSBfX0NMT0NLX1JFQUxUSU1FMAotVElNRVJfUkVMVElNRSA9IDB4MAotVElNRVJfQUJTVElNRSA9IDB4MQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL211dGV4LmgKLWZyb20gVFlQRVMgaW1wb3J0ICoKLWRlZiBNVVRFWF9IRUxEKHgpOiByZXR1cm4gKG11dGV4X293bmVkKHgpKQotCi1kZWYgVElDS19UT19TRUModGljayk6IHJldHVybiAoKHRpY2spIC8gaHopCi0KLWRlZiBTRUNfVE9fVElDSyhzZWMpOiByZXR1cm4gKChzZWMpICogaHopCi0KLWRlZiBUSUNLX1RPX01TRUModGljayk6IHJldHVybiBcCi0KLWRlZiBNU0VDX1RPX1RJQ0sobXNlYyk6IHJldHVybiBcCi0KLWRlZiBNU0VDX1RPX1RJQ0tfUk9VTkRVUChtc2VjKTogcmV0dXJuIFwKLQotZGVmIFRJQ0tfVE9fVVNFQyh0aWNrKTogcmV0dXJuICgodGljaykgKiB1c2VjX3Blcl90aWNrKQotCi1kZWYgVVNFQ19UT19USUNLKHVzZWMpOiByZXR1cm4gKCh1c2VjKSAvIHVzZWNfcGVyX3RpY2spCi0KLWRlZiBVU0VDX1RPX1RJQ0tfUk9VTkRVUCh1c2VjKTogcmV0dXJuIFwKLQotZGVmIFRJQ0tfVE9fTlNFQyh0aWNrKTogcmV0dXJuICgodGljaykgKiBuc2VjX3Blcl90aWNrKQotCi1kZWYgTlNFQ19UT19USUNLKG5zZWMpOiByZXR1cm4gKChuc2VjKSAvIG5zZWNfcGVyX3RpY2spCi0KLWRlZiBOU0VDX1RPX1RJQ0tfUk9VTkRVUChuc2VjKTogcmV0dXJuIFwKLQotZGVmIFRJTUVWQUxfVE9fVElDSyh0dnApOiByZXR1cm4gXAotCi1kZWYgVElNRVNUUlVDX1RPX1RJQ0sodHNwKTogcmV0dXJuIFwKLQotCi0jIEluY2x1ZGVkIGZyb20gdGltZS5oCi1mcm9tIFRZUEVTIGltcG9ydCAqCi0KLSMgSW5jbHVkZWQgZnJvbSBpc28vdGltZV9pc28uaAotTlVMTCA9IDAKLU5VTEwgPSAwCi1DTE9DS1NfUEVSX1NFQyA9IDEwMDAwMDAKLUZEX1NFVFNJWkUgPSA2NTUzNgotRkRfU0VUU0laRSA9IDEwMjQKLV9OQkJZID0gOAotTkJCWSA9IF9OQkJZCi1kZWYgRkRfWkVSTyhwKTogcmV0dXJuIGJ6ZXJvKChwKSwgc2l6ZW9mICgqKHApKSkKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LXN1bm9zNS9yZWdlbiBiL0xpYi9wbGF0LXN1bm9zNS9yZWdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzhjYjdkZS4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC1zdW5vczUvcmVnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMhIC9iaW4vc2gKLWNhc2UgYHVuYW1lIC1zcmAgaW4KLSdTdW5PUyA1LicqKQk7OwotKikJZWNobyBQcm9iYWJseSBub3Qgb24gYSBTb2xhcmlzIDIgc3lzdGVtIDE+JjIKLQlleGl0IDE7OwotZXNhYwotc2V0IC12Ci1oMnB5IC1pICcodV9sb25nKScgL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIC91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmggL3Vzci9pbmNsdWRlL3N5cy9zdHJvcHRzLmggL3Vzci9pbmNsdWRlL2RsZmNuLmgKLQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtdW5peHdhcmU3L0lOLnB5IGIvTGliL3BsYXQtdW5peHdhcmU3L0lOLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjAyM2I0Li4wMDAwMDAwCi0tLSBhL0xpYi9wbGF0LXVuaXh3YXJlNy9JTi5weQorKysgL2Rldi9udWxsCkBAIC0xLDgzNiArMCwwIEBACi0jIEdlbmVyYXRlZCBieSBoMnB5IGZyb20gL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaAotCi0jIEluY2x1ZGVkIGZyb20gbmV0aW5ldC9pbl9mLmgKLWRlZiBJTl9DTEFTU0EoaSk6IHJldHVybiAoKChpbnQpKGkpICYgMHg4MDAwMDAwMCkgPT0gMCkKLQotSU5fQ0xBU1NBX05FVCA9IDB4ZmYwMDAwMDAKLUlOX0NMQVNTQV9OU0hJRlQgPSAyNAotSU5fQ0xBU1NBX0hPU1QgPSAweDAwZmZmZmZmCi1JTl9DTEFTU0FfTUFYID0gMTI4Ci1kZWYgSU5fQ0xBU1NCKGkpOiByZXR1cm4gKCgoaW50KShpKSAmIDB4YzAwMDAwMDApID09IDB4ODAwMDAwMDApCi0KLUlOX0NMQVNTQl9ORVQgPSAweGZmZmYwMDAwCi1JTl9DTEFTU0JfTlNISUZUID0gMTYKLUlOX0NMQVNTQl9IT1NUID0gMHgwMDAwZmZmZgotSU5fQ0xBU1NCX01BWCA9IDY1NTM2Ci1kZWYgSU5fQ0xBU1NDKGkpOiByZXR1cm4gKCgoaW50KShpKSAmIDB4ZTAwMDAwMDApID09IDB4YzAwMDAwMDApCi0KLUlOX0NMQVNTQ19ORVQgPSAweGZmZmZmZjAwCi1JTl9DTEFTU0NfTlNISUZUID0gOAotSU5fQ0xBU1NDX0hPU1QgPSAweDAwMDAwMGZmCi1kZWYgSU5fQ0xBU1NEKGkpOiByZXR1cm4gKCgoaW50KShpKSAmIDB4ZjAwMDAwMDApID09IDB4ZTAwMDAwMDApCi0KLUlOX0NMQVNTRF9ORVQgPSAweGYwMDAwMDAwCi1JTl9DTEFTU0RfTlNISUZUID0gMjgKLUlOX0NMQVNTRF9IT1NUID0gMHgwZmZmZmZmZgotZGVmIElOX01VTFRJQ0FTVChpKTogcmV0dXJuIElOX0NMQVNTRChpKQotCi1kZWYgSU5fRVhQRVJJTUVOVEFMKGkpOiByZXR1cm4gKCgoaW50KShpKSAmIDB4ZTAwMDAwMDApID09IDB4ZTAwMDAwMDApCi0KLWRlZiBJTl9CQURDTEFTUyhpKTogcmV0dXJuICgoKGludCkoaSkgJiAweGYwMDAwMDAwKSA9PSAweGYwMDAwMDAwKQotCi1JTkFERFJfQU5ZID0gMHgwMDAwMDAwMAotSU5BRERSX0xPT1BCQUNLID0gMHg3ZjAwMDAwMQotSU5BRERSX0JST0FEQ0FTVCA9IDB4ZmZmZmZmZmYKLUlOQUREUl9OT05FID0gMHhmZmZmZmZmZgotSU5fTE9PUEJBQ0tORVQgPSAxMjcKLUlOQUREUl9VTlNQRUNfR1JPVVAgPSAweGUwMDAwMDAwCi1JTkFERFJfQUxMSE9TVFNfR1JPVVAgPSAweGUwMDAwMDAxCi1JTkFERFJfQUxMUlRSU19HUk9VUCA9IDB4ZTAwMDAwMDIKLUlOQUREUl9NQVhfTE9DQUxfR1JPVVAgPSAweGUwMDAwMGZmCi0KLSMgSW5jbHVkZWQgZnJvbSBuZXRpbmV0L2luNi5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdHlwZXMuaAotZGVmIHF1YWRfbG93KHgpOiByZXR1cm4geC52YWxbMF0KLQotQURUX0VNQVNLU0laRSA9IDgKLVNIUlRfTUlOID0gLTMyNzY4Ci1TSFJUX01BWCA9IDMyNzY3Ci1JTlRfTUlOID0gKC0yMTQ3NDgzNjQ3LTEpCi1JTlRfTUFYID0gMjE0NzQ4MzY0NwotTE9OR19NSU4gPSAoLTIxNDc0ODM2NDctMSkKLUxPTkdfTUFYID0gMjE0NzQ4MzY0NwotT0ZGMzJfTUFYID0gTE9OR19NQVgKLUlTVEFUX0FTU0VSVEVEID0gMAotSVNUQVRfQVNTVU1FRCA9IDEKLUlTVEFUX05PTkUgPSAyCi1PRkZfTUFYID0gT0ZGMzJfTUFYCi1DTE9DS19NQVggPSBMT05HX01BWAotUF9NWUlEID0gKC0xKQotUF9NWUhPU1RJRCA9ICgtMSkKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9zZWxlY3QuaAotRkRfU0VUU0laRSA9IDQwOTYKLU5CQlkgPSA4Ci1OVUxMID0gMAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2JpdHlwZXMuaAotCi0jIEluY2x1ZGVkIGZyb20gbmV0aW5ldC9pbjZfZi5oCi1kZWYgSU42X0lTX0FERFJfVU5TUEVDSUZJRUQoYSk6IHJldHVybiBJTjZfQUREUl9FUVVBTF9MKGEsIDAsIDAsIDAsIDApCi0KLWRlZiBJTjZfU0VUX0FERFJfVU5TUEVDSUZJRUQoYSk6IHJldHVybiBJTjZfQUREUl9DT1BZX0woYSwgMCwgMCwgMCwgMCkKLQotZGVmIElONl9JU19BRERSX0FOWShhKTogcmV0dXJuIElONl9BRERSX0VRVUFMX0woYSwgMCwgMCwgMCwgMCkKLQotZGVmIElONl9TRVRfQUREUl9BTlkoYSk6IHJldHVybiBJTjZfQUREUl9DT1BZX0woYSwgMCwgMCwgMCwgMCkKLQotZGVmIElONl9JU19BRERSX0xPT1BCQUNLKGEpOiByZXR1cm4gSU42X0FERFJfRVFVQUxfTChhLCAwLCAwLCAwLCAweDAxMDAwMDAwKQotCi1kZWYgSU42X1NFVF9BRERSX0xPT1BCQUNLKGEpOiByZXR1cm4gSU42X0FERFJfQ09QWV9MKGEsIDAsIDAsIDAsIDB4MDEwMDAwMDApCi0KLUlONl9NQ19GTEFHX1BFUk1BTkVOVCA9IDB4MAotSU42X01DX0ZMQUdfVFJBTlNJRU5UID0gMHgxCi1JTjZfTUNfU0NPUEVfTk9ERUxPQ0FMID0gMHgxCi1JTjZfTUNfU0NPUEVfTElOS0xPQ0FMID0gMHgyCi1JTjZfTUNfU0NPUEVfU0lURUxPQ0FMID0gMHg1Ci1JTjZfTUNfU0NPUEVfT1JHTE9DQUwgPSAweDgKLUlONl9NQ19TQ09QRV9HTE9CQUwgPSAweEUKLWRlZiBJTjZfSVNfQUREUl9NQ19OT0RFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19TSVRFTE9DQUwoYSk6IHJldHVybiBcCi0KLWRlZiBJTjZfSVNfQUREUl9NQ19PUkdMT0NBTChhKTogcmV0dXJuIFwKLQotZGVmIElONl9JU19BRERSX01DX0dMT0JBTChhKTogcmV0dXJuIFwKLQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2NvbnZzYS5oCi1fX05FVExJQl9VVzIxMV9TVlI0ID0gMQotX19ORVRMSUJfVVcyMTFfWFBHNCA9IDIKLV9fTkVUTElCX0dFTUlOSV9TVlI0ID0gMwotX19ORVRMSUJfR0VNSU5JX1hQRzQgPSA0Ci1fX05FVExJQl9GUDFfU1ZSNCA9IDUKLV9fTkVUTElCX0ZQMV9YUEc0ID0gNgotX19ORVRMSUJfQkFTRV9WRVJTSU9OX18gPSBfX05FVExJQl9VVzIxMV9TVlI0Ci1fX05FVExJQl9WRVJTSU9OX18gPSBfX05FVExJQl9GUDFfU1ZSNAotX19ORVRMSUJfVkVSU0lPTl9fID0gX19ORVRMSUJfRlAxX1hQRzQKLV9fTkVUTElCX1ZFUlNJT05fXyA9IF9fTkVUTElCX0dFTUlOSV9TVlI0Ci1fX05FVExJQl9WRVJTSU9OX18gPSBfX05FVExJQl9HRU1JTklfWFBHNAotX19ORVRMSUJfVkVSU0lPTl9fID0gX19ORVRMSUJfVVcyMTFfU1ZSNAotX19ORVRMSUJfVkVSU0lPTl9fID0gX19ORVRMSUJfVVcyMTFfWFBHNAotX19ORVRMSUJfVkVSU0lPTl9fID0gX19ORVRMSUJfRlAxX1hQRzQKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9ieXRlb3JkZXIuaAotTElUVExFX0VORElBTiA9IDEyMzQKLUJJR19FTkRJQU4gPSA0MzIxCi1QRFBfRU5ESUFOID0gMzQxMgotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2J5dGVvcmRlcl9mLmgKLUJZVEVfT1JERVIgPSBMSVRUTEVfRU5ESUFOCi1kZWYgaHRvbmwoaGwpOiByZXR1cm4gX19odG9ubChobCkKLQotZGVmIG50b2hsKG5sKTogcmV0dXJuIF9fbnRvaGwobmwpCi0KLWRlZiBodG9ucyhocyk6IHJldHVybiBfX2h0b25zKGhzKQotCi1kZWYgbnRvaHMobnMpOiByZXR1cm4gX19udG9ocyhucykKLQotZGVmIG50b2hsKHgpOiByZXR1cm4gKHgpCi0KLWRlZiBudG9ocyh4KTogcmV0dXJuICh4KQotCi1kZWYgaHRvbmwoeCk6IHJldHVybiAoeCkKLQotZGVmIGh0b25zKHgpOiByZXR1cm4gKHgpCi0KLWRlZiBfX05FVExJQl9WRVJTSU9OX0lTX1hQRzQodmVyc2lvbik6IHJldHVybiAoKCh2ZXJzaW9uKSAlIDIpID09IDApCi0KLWRlZiBfX05FVExJQl9WRVJTSU9OX0hBU19TQUxFTih2ZXJzaW9uKTogcmV0dXJuICgodmVyc2lvbikgPj0gX19ORVRMSUJfR0VNSU5JX1NWUjQpCi0KLWRlZiBfX05FVExJQl9WRVJTSU9OX0lTX0lLUyh2ZXJzaW9uKTogcmV0dXJuICgodmVyc2lvbikgPj0gX19ORVRMSUJfRlAxX1NWUjQpCi0KLWRlZiBTQV9GQU1JTFlfR0VUKHNhKTogcmV0dXJuIFwKLQotSU5FVDZfQUREUlNUUkxFTiA9IDQ2Ci1JUFY2X1VOSUNBU1RfSE9QUyA9IDMKLUlQVjZfQUREUkZPUk0gPSAyNAotSVBWNl9NVUxUSUNBU1RfSE9QUyA9IDI1Ci1JUFY2X01VTFRJQ0FTVF9JRiA9IDI2Ci1JUFY2X01VTFRJQ0FTVF9MT09QID0gMjcKLUlQVjZfQUREX01FTUJFUlNISVAgPSAyOAotSVBWNl9EUk9QX01FTUJFUlNISVAgPSAyOQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2luc3JlbS5oCi1kZWYgTElTVF9JTklUKGhlYWQpOiByZXR1cm4gXAotCi1kZWYgTElTVF9JTklUKGhlYWQpOiByZXR1cm4gXAotCi1kZWYgcmVtcXVlKGEpOiByZXR1cm4gUkVNUVVFKGEpCi0KLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9zb2NrZXQuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3Vpby5oCi1TSFVUX1JEID0gMAotU0hVVF9XUiA9IDEKLVNIVVRfUkRXUiA9IDIKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9uZXRjb25maWcuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2NkZWZzLmgKLWRlZiBfX1AocHJvdG9zKTogcmV0dXJuIHByb3RvcwotCi1kZWYgX19TVFJJTkcoeCk6IHJldHVybiAjeAotCi1kZWYgX19QKHByb3Rvcyk6IHJldHVybiAoKQotCi1kZWYgX19TVFJJTkcoeCk6IHJldHVybiAieCIKLQotTkVUQ09ORklHID0gIi9ldGMvbmV0Y29uZmlnIgotTkVUUEFUSCA9ICJORVRQQVRIIgotTkNfVFBJX0NMVFMgPSAxCi1OQ19UUElfQ09UUyA9IDIKLU5DX1RQSV9DT1RTX09SRCA9IDMKLU5DX1RQSV9SQVcgPSA0Ci1OQ19OT0ZMQUcgPSAwMAotTkNfVklTSUJMRSA9IDBvMQotTkNfQlJPQURDQVNUID0gMG8yCi1OQ19OT1BST1RPRk1MWSA9ICItIgotTkNfTE9PUEJBQ0sgPSAibG9vcGJhY2siCi1OQ19JTkVUID0gImluZXQiCi1OQ19JTkVUNiA9ICJpbmV0NiIKLU5DX0lNUExJTksgPSAiaW1wbGluayIKLU5DX1BVUCA9ICJwdXAiCi1OQ19DSEFPUyA9ICJjaGFvcyIKLU5DX05TID0gIm5zIgotTkNfTkJTID0gIm5icyIKLU5DX0VDTUEgPSAiZWNtYSIKLU5DX0RBVEFLSVQgPSAiZGF0YWtpdCIKLU5DX0NDSVRUID0gImNjaXR0IgotTkNfU05BID0gInNuYSIKLU5DX0RFQ05FVCA9ICJkZWNuZXQiCi1OQ19ETEkgPSAiZGxpIgotTkNfTEFUID0gImxhdCIKLU5DX0hZTElOSyA9ICJoeWxpbmsiCi1OQ19BUFBMRVRBTEsgPSAiYXBwbGV0YWxrIgotTkNfTklUID0gIm5pdCIKLU5DX0lFRUU4MDIgPSAiaWVlZTgwMiIKLU5DX09TSSA9ICJvc2kiCi1OQ19YMjUgPSAieDI1IgotTkNfT1NJTkVUID0gIm9zaW5ldCIKLU5DX0dPU0lQID0gImdvc2lwIgotTkNfTkVUV0FSRSA9ICJuZXR3YXJlIgotTkNfTk9QUk9UTyA9ICItIgotTkNfVENQID0gInRjcCIKLU5DX1VEUCA9ICJ1ZHAiCi1OQ19JQ01QID0gImljbXAiCi1OQ19JUFggPSAiaXB4IgotTkNfU1BYID0gInNweCIKLU5DX1RQSV9DTFRTID0gMQotTkNfVFBJX0NPVFMgPSAyCi1OQ19UUElfQ09UU19PUkQgPSAzCi1OQ19UUElfUkFXID0gNAotU09DS19TVFJFQU0gPSAyCi1TT0NLX0RHUkFNID0gMQotU09DS19SQVcgPSA0Ci1TT0NLX1JETSA9IDUKLVNPQ0tfU0VRUEFDS0VUID0gNgotU09fREVCVUcgPSAweDAwMDEKLVNPX0FDQ0VQVENPTk4gPSAweDAwMDIKLVNPX1JFVVNFQUREUiA9IDB4MDAwNAotU09fS0VFUEFMSVZFID0gMHgwMDA4Ci1TT19ET05UUk9VVEUgPSAweDAwMTAKLVNPX0JST0FEQ0FTVCA9IDB4MDAyMAotU09fVVNFTE9PUEJBQ0sgPSAweDAwNDAKLVNPX0xJTkdFUiA9IDB4MDA4MAotU09fT09CSU5MSU5FID0gMHgwMTAwCi1TT19PUkRSRUwgPSAweDAyMDAKLVNPX0lNQVNPQ0tFVCA9IDB4MDQwMAotU09fTUdNVCA9IDB4MDgwMAotU09fUkVVU0VQT1JUID0gMHgxMDAwCi1TT19MSVNURU5JTkcgPSAweDIwMDAKLVNPX1JEV1IgPSAweDQwMDAKLVNPX1NFTUEgPSAweDgwMDAKLVNPX0RPTlRMSU5HRVIgPSAoflNPX0xJTkdFUikKLVNPX1NOREJVRiA9IDB4MTAwMQotU09fUkNWQlVGID0gMHgxMDAyCi1TT19TTkRMT1dBVCA9IDB4MTAwMwotU09fUkNWTE9XQVQgPSAweDEwMDQKLVNPX1NORFRJTUVPID0gMHgxMDA1Ci1TT19SQ1ZUSU1FTyA9IDB4MTAwNgotU09fRVJST1IgPSAweDEwMDcKLVNPX1RZUEUgPSAweDEwMDgKLVNPX1BST1RPVFlQRSA9IDB4MTAwOQotU09fQUxMUkFXID0gMHgxMDBhCi1TT0xfU09DS0VUID0gMHhmZmZmCi1BRl9VTlNQRUMgPSAwCi1BRl9VTklYID0gMQotQUZfTE9DQUwgPSBBRl9VTklYCi1BRl9JTkVUID0gMgotQUZfSU1QTElOSyA9IDMKLUFGX1BVUCA9IDQKLUFGX0NIQU9TID0gNQotQUZfTlMgPSA2Ci1BRl9OQlMgPSA3Ci1BRl9FQ01BID0gOAotQUZfREFUQUtJVCA9IDkKLUFGX0NDSVRUID0gMTAKLUFGX1NOQSA9IDExCi1BRl9ERUNuZXQgPSAxMgotQUZfRExJID0gMTMKLUFGX0xBVCA9IDE0Ci1BRl9IWUxJTksgPSAxNQotQUZfQVBQTEVUQUxLID0gMTYKLUFGX05JVCA9IDE3Ci1BRl84MDIgPSAxOAotQUZfT1NJID0gMTkKLUFGX0lTTyA9IEFGX09TSQotQUZfWDI1ID0gMjAKLUFGX09TSU5FVCA9IDIxCi1BRl9HT1NJUCA9IDIyCi1BRl9ZTkVUID0gMjMKLUFGX1JPVVRFID0gMjQKLUFGX0xJTksgPSAyNQotcHNldWRvX0FGX1hUUCA9IDI2Ci1BRl9JTkVUNiA9IDI3Ci1BRl9NQVggPSAyNwotQUZfSU5FVF9CU1dBUCA9IDB4MDIwMAotUEZfVU5TUEVDID0gQUZfVU5TUEVDCi1QRl9VTklYID0gQUZfVU5JWAotUEZfTE9DQUwgPSBBRl9MT0NBTAotUEZfSU5FVCA9IEFGX0lORVQKLVBGX0lNUExJTksgPSBBRl9JTVBMSU5LCi1QRl9QVVAgPSBBRl9QVVAKLVBGX0NIQU9TID0gQUZfQ0hBT1MKLVBGX05TID0gQUZfTlMKLVBGX05CUyA9IEFGX05CUwotUEZfRUNNQSA9IEFGX0VDTUEKLVBGX0RBVEFLSVQgPSBBRl9EQVRBS0lUCi1QRl9DQ0lUVCA9IEFGX0NDSVRUCi1QRl9TTkEgPSBBRl9TTkEKLVBGX0RFQ25ldCA9IEFGX0RFQ25ldAotUEZfRExJID0gQUZfRExJCi1QRl9MQVQgPSBBRl9MQVQKLVBGX0hZTElOSyA9IEFGX0hZTElOSwotUEZfQVBQTEVUQUxLID0gQUZfQVBQTEVUQUxLCi1QRl9OSVQgPSBBRl9OSVQKLVBGXzgwMiA9IEFGXzgwMgotUEZfT1NJID0gQUZfT1NJCi1QRl9JU08gPSBQRl9PU0kKLVBGX1gyNSA9IEFGX1gyNQotUEZfT1NJTkVUID0gQUZfT1NJTkVUCi1QRl9HT1NJUCA9IEFGX0dPU0lQCi1QRl9ZTkVUID0gQUZfWU5FVAotUEZfUk9VVEUgPSBBRl9ST1VURQotUEZfTElOSyA9IEFGX0xJTksKLXBzZXVkb19QRl9YVFAgPSBwc2V1ZG9fQUZfWFRQCi1QRl9JTkVUNiA9IEFGX0lORVQ2Ci1QRl9NQVggPSBBRl9NQVgKLVNPTUFYQ09OTiA9IDUKLVNDTV9SSUdIVFMgPSAxCi1NU0dfT09CID0gMHgxCi1NU0dfUEVFSyA9IDB4MgotTVNHX0RPTlRST1VURSA9IDB4NAotTVNHX0NUUlVOQyA9IDB4OAotTVNHX1RSVU5DID0gMHgxMAotTVNHX0VPUiA9IDB4MzAKLU1TR19XQUlUQUxMID0gMHgyMAotTVNHX01BWElPVkxFTiA9IDE2Ci1kZWYgT1BUTEVOKHgpOiByZXR1cm4gKCgoKHgpICsgc2l6ZW9mKGludCkgLSAxKSAvIHNpemVvZihpbnQpKSAqIHNpemVvZihpbnQpKQotCi1HSUFSRyA9IDB4MQotQ09OVEkgPSAweDIKLUdJVEFCID0gMHg0Ci1TT0NLRVRTWVMgPSA4OAotU09DS0VUU1lTID0gODMKLVNPX0FDQ0VQVCA9IDEKLVNPX0JJTkQgPSAyCi1TT19DT05ORUNUID0gMwotU09fR0VUUEVFUk5BTUUgPSA0Ci1TT19HRVRTT0NLTkFNRSA9IDUKLVNPX0dFVFNPQ0tPUFQgPSA2Ci1TT19MSVNURU4gPSA3Ci1TT19SRUNWID0gOAotU09fUkVDVkZST00gPSA5Ci1TT19TRU5EID0gMTAKLVNPX1NFTkRUTyA9IDExCi1TT19TRVRTT0NLT1BUID0gMTIKLVNPX1NIVVRET1dOID0gMTMKLVNPX1NPQ0tFVCA9IDE0Ci1TT19TT0NLUE9MTCA9IDE1Ci1TT19HRVRJUERPTUFJTiA9IDE2Ci1TT19TRVRJUERPTUFJTiA9IDE3Ci1TT19BREpUSU1FID0gMTgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9zdHJlYW0uaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2NyZWQuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2tzeW5jaC5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvZGwuaAotU0lHTkJJVCA9IDB4ODAwMDAwMDAKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9pcGwuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2Rpc3BfcC5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvdHJhcC5oCi1ESVZFUlIgPSAwCi1TR0xTVFAgPSAxCi1OTUlGTFQgPSAyCi1CUFRGTFQgPSAzCi1JTlRPRkxUID0gNAotQk9VTkRGTFQgPSA1Ci1JTlZPUEZMVCA9IDYKLU5PRVhURkxUID0gNwotREJMRkxUID0gOAotRVhUT1ZSRkxUID0gOQotSU5WVFNTRkxUID0gMTAKLVNFR05QRkxUID0gMTEKLVNUS0ZMVCA9IDEyCi1HUEZMVCA9IDEzCi1QR0ZMVCA9IDE0Ci1FWFRFUlJGTFQgPSAxNgotQUxJR05GTFQgPSAxNwotTUNFRkxUID0gMTgKLVVTRVJGTFQgPSAweDEwMAotVFJQX1BSRUVNUFQgPSAweDIwMAotVFJQX1VOVVNFRCA9IDB4MjAxCi1QRl9FUlJfTUFTSyA9IDB4MDEKLVBGX0VSUl9QQUdFID0gMAotUEZfRVJSX1BST1QgPSAxCi1QRl9FUlJfV1JJVEUgPSAyCi1QRl9FUlJfVVNFUiA9IDQKLUVWVF9TVFJTQ0hFRCA9IDB4MDQKLUVWVF9HTE9CQ0FMTE9VVCA9IDB4MDgKLUVWVF9MQ0xDQUxMT1VUID0gMHgxMAotRVZUX1NPRlRJTlRNQVNLID0gKEVWVF9TVFJTQ0hFRHxFVlRfR0xPQkNBTExPVVR8RVZUX0xDTENBTExPVVQpCi1QTDAgPSAwCi1QTDEgPSAxCi1QTDIgPSAyCi1QTDMgPSAzCi1QTDQgPSA0Ci1QTDUgPSA1Ci1QTDYgPSA2Ci1QTEhJID0gOAotUEw3ID0gUExISQotUExCQVNFID0gUEwwCi1QTFRJTUVPVVQgPSBQTDEKLVBMRElTSyA9IFBMNQotUExTVFIgPSBQTDYKLVBMVFRZID0gUExTVFIKLVBMTUlOID0gUEwwCi1QTE1JTiA9IFBMMQotTUFYX0lOVFJfTEVWRUxTID0gMTAKLU1BWF9JTlRSX05FU1RJTkcgPSA1MAotU1RSU0NIRUQgPSBFVlRfU1RSU0NIRUQKLUdMT0JBTFNPRlRJTlQgPSBFVlRfR0xPQkNBTExPVVQKLUxPQ0FMU09GVElOVCA9IEVWVF9MQ0xDQUxMT1VUCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMva3N5bmNoX3AuaAotZGVmIEdFVF9USU1FKHRpbWVwKTogcmV0dXJuIFwKLQotTEtfVEhSRVNIT0xEID0gNTAwMDAwCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvbGlzdC5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvbGlzdGFzbS5oCi1kZWYgcmVtcXVlX251bGwoZSk6IHJldHVybiBcCi0KLWRlZiBMU19JU0VNUFRZKGxpc3RwKTogcmV0dXJuIFwKLQotTEtfQkFTSUMgPSAweDEKLUxLX1NMRUVQID0gMHgyCi1MS19OT1NUQVRTID0gMHg0Ci1kZWYgQ1lDTEVTX1NJTkNFKGMpOiByZXR1cm4gQ1lDTEVTX0JFVFdFRU4oKGMpLCBDWUNMRVMoKSkKLQotTFNCX05MS0RTID0gOTIKLUVWVF9SVU5SVU4gPSAweDAxCi1FVlRfS1BSVU5SVU4gPSAweDAyCi1TUF9VTkxPQ0tFRCA9IDAKLVNQX0xPQ0tFRCA9IDEKLUtTX0xPQ0tURVNUID0gMHgwMQotS1NfTVBTVEFUUyA9IDB4MDIKLUtTX0RFSU5JVEVEID0gMHgwNAotS1NfTlZMVFRSQUNFID0gMHgwOAotUldTX1JFQUQgPSAob3JkKCdyJykpCi1SV1NfV1JJVEUgPSAob3JkKCd3JykpCi1SV1NfVU5MT0NLRUQgPSAob3JkKCd1JykpCi1SV1NfQlVTWSA9IChvcmQoJ2InKSkKLWRlZiBTTEVFUF9MT0NLT1dORUQobGtwKTogcmV0dXJuIFwKLQotZGVmIFNMRUVQX0RJU09XTihsa3ApOiByZXR1cm4gXAotCi1LU19OT1BSTVBUID0gMHgwMDAwMDAwMQotX19LU19MT0NLVEVTVCA9IEtTX0xPQ0tURVNUCi1fX0tTX0xPQ0tURVNUID0gMAotX19LU19NUFNUQVRTID0gS1NfTVBTVEFUUwotX19LU19NUFNUQVRTID0gMAotX19LU19OVkxUVFJBQ0UgPSBLU19OVkxUVFJBQ0UKLV9fS1NfTlZMVFRSQUNFID0gMAotS1NGTEFHUyA9IChfX0tTX0xPQ0tURVNUfF9fS1NfTVBTVEFUU3xfX0tTX05WTFRUUkFDRSkKLUtTVlVOSVBST0MgPSAxCi1LU1ZNUERFQlVHID0gMgotS1NWTVBOT0RFQlVHID0gMwotS1NWRkxBRyA9IEtTVlVOSVBST0MKLUtTVkZMQUcgPSBLU1ZNUERFQlVHCi1LU1ZGTEFHID0gS1NWTVBOT0RFQlVHCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMva3NpbmxpbmUuaAotX0FfU1BfTE9DS0VEID0gMQotX0FfU1BfVU5MT0NLRUQgPSAwCi1fQV9JTlZQTCA9IC0xCi1kZWYgX0FUT01JQ19JTlRfSU5DUihhdG9taWNfaW50cCk6IHJldHVybiBcCi0KLWRlZiBfQVRPTUlDX0lOVF9ERUNSKGF0b21pY19pbnRwKTogcmV0dXJuIFwKLQotZGVmIEFUT01JQ19JTlRfUkVBRChhdG9taWNfaW50cCk6IHJldHVybiBfQVRPTUlDX0lOVF9SRUFEKGF0b21pY19pbnRwKQotCi1kZWYgQVRPTUlDX0lOVF9JTkNSKGF0b21pY19pbnRwKTogcmV0dXJuIF9BVE9NSUNfSU5UX0lOQ1IoYXRvbWljX2ludHApCi0KLWRlZiBBVE9NSUNfSU5UX0RFQ1IoYXRvbWljX2ludHApOiByZXR1cm4gX0FUT01JQ19JTlRfREVDUihhdG9taWNfaW50cCkKLQotZGVmIEZTUElOX0lOSVQobHApOiByZXR1cm4KLQotZGVmIEZTUElOX0xPQ0sobCk6IHJldHVybiBESVNBQkxFKCkKLQotZGVmIEZTUElOX1RSWUxPQ0sobCk6IHJldHVybiAoRElTQUJMRSgpLCBCX1RSVUUpCi0KLWRlZiBGU1BJTl9VTkxPQ0sobCk6IHJldHVybiBFTkFCTEUoKQotCi1kZWYgTE9DS19ERUlOSVQobHApOiByZXR1cm4KLQotZGVmIExPQ0tfREVBTExPQyhscCk6IHJldHVybgotCi1kZWYgTE9DS19PV05FRChscCk6IHJldHVybiAoQl9UUlVFKQotCi1kZWYgUldfREVJTklUKGxwKTogcmV0dXJuCi0KLWRlZiBSV19ERUFMTE9DKGxwKTogcmV0dXJuCi0KLWRlZiBSV19PV05FRChscCk6IHJldHVybiAoQl9UUlVFKQotCi1kZWYgSVNfTE9DS0VEKGxvY2twKTogcmV0dXJuIEJfRkFMU0UKLQotZGVmIExPQ0tfUExNSU4obG9ja3ApOiByZXR1cm4gXAotCi1kZWYgVFJZTE9DS19QTE1JTihsb2NrcCk6IHJldHVybiBMT0NLX1BMTUlOKGxvY2twKQotCi1kZWYgTE9DS19TSF9QTE1JTihsb2NrcCk6IHJldHVybiBMT0NLX1BMTUlOKGxvY2twKQotCi1kZWYgUldfUkRMT0NLX1BMTUlOKGxvY2twKTogcmV0dXJuIExPQ0tfUExNSU4obG9ja3ApCi0KLWRlZiBSV19XUkxPQ0tfUExNSU4obG9ja3ApOiByZXR1cm4gTE9DS19QTE1JTihsb2NrcCkKLQotZGVmIExPQ0tfREVJTklUKGwpOiByZXR1cm4KLQotZGVmIExPQ0tfUExNSU4obG9ja3ApOiByZXR1cm4gTE9DSygobG9ja3ApLCBQTE1JTikKLQotZGVmIFRSWUxPQ0tfUExNSU4obG9ja3ApOiByZXR1cm4gVFJZTE9DSygobG9ja3ApLCBQTE1JTikKLQotZGVmIExPQ0tfU0hfUExNSU4obG9ja3ApOiByZXR1cm4gTE9DS19TSCgobG9ja3ApLCBQTE1JTikKLQotZGVmIFJXX1JETE9DS19QTE1JTihsb2NrcCk6IHJldHVybiBSV19SRExPQ0soKGxvY2twKSwgUExNSU4pCi0KLWRlZiBSV19XUkxPQ0tfUExNSU4obG9ja3ApOiByZXR1cm4gUldfV1JMT0NLKChsb2NrcCksIFBMTUlOKQotCi1kZWYgRlNQSU5fSVNfTE9DS0VEKGZzcCk6IHJldHVybiBCX0ZBTFNFCi0KLWRlZiBTUElOX0lTX0xPQ0tFRChsb2NrcCk6IHJldHVybiBCX0ZBTFNFCi0KLWRlZiBGU1BJTl9PV05FRChsKTogcmV0dXJuIChCX1RSVUUpCi0KLUNSX01MRFJFQUwgPSAweDAwMDAwMDAxCi1DUl9SRFVNUCA9IDB4MDAwMDAwMDIKLWRlZiBjcmhvbGQoY3JlZHApOiByZXR1cm4gY3Job2xkbigoY3JlZHApLCAxKQotCi1kZWYgY3JmcmVlKGNyZWRwKTogcmV0dXJuIGNyZnJlZW4oKGNyZWRwKSwgMSkKLQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3N0cm1kZXAuaAotZGVmIHN0cl9hbGlnbmVkKFgpOiByZXR1cm4gKCgodWludCkoWCkgJiAoc2l6ZW9mKGludCkgLSAxKSkgPT0gMCkKLQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2VuZ2luZS5oCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvY2xvY2suaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3RpbWUuaAotRFNUX05PTkUgPSAwCi1EU1RfVVNBID0gMQotRFNUX0FVU1QgPSAyCi1EU1RfV0VUID0gMwotRFNUX01FVCA9IDQKLURTVF9FRVQgPSA1Ci1EU1RfQ0FOID0gNgotRFNUX0dCID0gNwotRFNUX1JVTSA9IDgKLURTVF9UVVIgPSA5Ci1EU1RfQVVTVEFMVCA9IDEwCi1JVElNRVJfUkVBTCA9IDAKLUlUSU1FUl9WSVJUVUFMID0gMQotSVRJTUVSX1BST0YgPSAyCi1GRF9TRVRTSVpFID0gNDA5NgotRkRfTkJCWSA9IDgKLQotIyBJbmNsdWRlZCBmcm9tIHRpbWUuaAotTlVMTCA9IDAKLUNMT0NLU19QRVJfU0VDID0gMTAwMDAwMAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2Nsb2NrX3AuaAotQ0dCSVRTID0gNAotSURCSVRTID0gMjgKLWRlZiB0b2lkX3VucGFja2NnKGlkdmFsKTogcmV0dXJuICgoKGlkdmFsKSA+PiBJREJJVFMpICYgMHhmKQotCi1kZWYgdG9pZF91bnBhY2tpZChpZHZhbCk6IHJldHVybiAoKGlkdmFsKSAmIDB4ZmZmZmZmZikKLQotZGVmIHRvaWRfdW5wYWNrY2coaWR2YWwpOiByZXR1cm4gMAotCi1kZWYgdG9pZF91bnBhY2tpZChpZHZhbCk6IHJldHVybiAoaWR2YWwpCi0KLU5DQUxMT1VUX0hBU0ggPSAxMDI0Ci1DQUxMT1VUX01BWFZBTCA9IDB4N2ZmZmZmZmYKLVRPX1BFUklPRElDID0gMHg4MDAwMDAwMAotVE9fSU1NRURJQVRFID0gMHg4MDAwMDAwMAotU0VDID0gMQotTUlMTElTRUMgPSAxMDAwCi1NSUNST1NFQyA9IDEwMDAwMDAKLU5BTk9TRUMgPSAxMDAwMDAwMDAwCi1TRUNIUiA9ICg2MCo2MCkKLVNFQ0RBWSA9ICgyNCpTRUNIUikKLVNFQ1lSID0gKDM2NSpTRUNEQVkpCi1kZWYgVElNRV9PV05FRF9SKGNnbnVtKTogcmV0dXJuIChCX1RSVUUpCi0KLUxPT1BTRUNPTkRTID0gMTgwMAotTE9PUE1JQ1JPU0VDT05EUyA9IChMT09QU0VDT05EUyAqIE1JQ1JPU0VDKQotZGVmIFRJQ0tTX1NJTkNFKHQpOiByZXR1cm4gVElDS1NfQkVUV0VFTih0LCBUSUNLUygpKQotCi1NQVhSUVMgPSAyCi1FX09GRkxJTkUgPSAweDAxCi1FX0JBRCA9IDB4MDIKLUVfU0hVVERPV04gPSAweDA0Ci1FX0RSSVZFUiA9IDB4MDgKLUVfREVGQVVMVEtFRVAgPSAweDEwMAotRV9EUklWRVJCT1VORCA9IDB4MjAwCi1FX0VYQ0xVU0lWRSA9IDB4NDAwCi1FX0NHTEVBREVSID0gMHg4MDAKLUVfTk9XQVkgPSAoRV9PRkZMSU5FfEVfQkFEfEVfU0hVVERPV04pCi1FX0JPVU5EID0gMHgwMQotRV9HTE9CQUwgPSAweDAwCi1FX1VOQVZBSUwgPSAtMQotRU5HSU5FX09OTElORSA9IDEKLWRlZiBQUk9DRVNTT1JfVU5NQVAoZSk6IHJldHVybiAoKGUpIC0gZW5naW5lKQotCi1CT09URU5HID0gMAotUU1PVkVEID0gMHgwMDAxCi1RV0FOVFIgPSAweDAwMDIKLVFXQU5UVyA9IDB4MDAwNAotUUZVTEwgPSAweDAwMDgKLVFSRUFEUiA9IDB4MDAxMAotUVVTRSA9IDB4MDAyMAotUU5PRU5CID0gMHgwMDQwCi1RVVAgPSAweDAwODAKLVFCQUNLID0gMHgwMTAwCi1RSU5URVIgPSAweDAyMDAKLVFQUk9DU09OID0gMHgwNDAwCi1RVE9FTkFCID0gMHgwODAwCi1RRlJFRVpFID0gMHgxMDAwCi1RQk9VTkQgPSAweDIwMDAKLVFERUZDTlQgPSAweDQwMDAKLVFFTkFCID0gMHgwMDAxCi1RU1ZDQlVTWSA9IDB4MDAwMgotU1RSTV9QVVRDTlRfVEFCTEVTID0gMzEKLWRlZiBTVFJNX01ZRU5HX1BVVENOVChzZHApOiByZXR1cm4gU1RSTV9QVVRDTlQobC5lbmdfbnVtLCBzZHApCi0KLVFCX0ZVTEwgPSAweDAxCi1RQl9XQU5UVyA9IDB4MDIKLVFCX0JBQ0sgPSAweDA0Ci1OQkFORCA9IDI1NgotREJfV0FTRFVQRUQgPSAweDEKLURCXzJQSUVDRSA9IDB4MgotU1RSTEVBS0hBU0hTWiA9IDEwMjEKLU1TR01BUksgPSAweDAxCi1NU0dOT0xPT1AgPSAweDAyCi1NU0dERUxJTSA9IDB4MDQKLU1TR05PR0VUID0gMHgwOAotTVNHTE9HID0gMHgxMAotTV9EQVRBID0gMHgwMAotTV9QUk9UTyA9IDB4MDEKLU1fQlJFQUsgPSAweDA4Ci1NX1BBU1NGUCA9IDB4MDkKLU1fU0lHID0gMHgwYgotTV9ERUxBWSA9IDB4MGMKLU1fQ1RMID0gMHgwZAotTV9JT0NUTCA9IDB4MGUKLU1fU0VUT1BUUyA9IDB4MTAKLU1fUlNFID0gMHgxMQotTV9UUkFJTCA9IDB4MTIKLU1fSU9DQUNLID0gMHg4MQotTV9JT0NOQUsgPSAweDgyCi1NX1BDUFJPVE8gPSAweDgzCi1NX1BDU0lHID0gMHg4NAotTV9SRUFEID0gMHg4NQotTV9GTFVTSCA9IDB4ODYKLU1fU1RPUCA9IDB4ODcKLU1fU1RBUlQgPSAweDg4Ci1NX0hBTkdVUCA9IDB4ODkKLU1fRVJST1IgPSAweDhhCi1NX0NPUFlJTiA9IDB4OGIKLU1fQ09QWU9VVCA9IDB4OGMKLU1fSU9DREFUQSA9IDB4OGQKLU1fUENSU0UgPSAweDhlCi1NX1NUT1BJID0gMHg4ZgotTV9TVEFSVEkgPSAweDkwCi1NX1BDQ1RMID0gMHg5MQotTV9QQ1NFVE9QVFMgPSAweDkyCi1RTk9STSA9IDB4MDAKLVFQQ1RMID0gMHg4MAotU1RSQ0FOT04gPSAweDAxCi1SRUNPUFkgPSAweDAyCi1TT19BTEwgPSAweDAwM2YKLVNPX1JFQURPUFQgPSAweDAwMDEKLVNPX1dST0ZGID0gMHgwMDAyCi1TT19NSU5QU1ogPSAweDAwMDQKLVNPX01BWFBTWiA9IDB4MDAwOAotU09fSElXQVQgPSAweDAwMTAKLVNPX0xPV0FUID0gMHgwMDIwCi1TT19NUkVBRE9OID0gMHgwMDQwCi1TT19NUkVBRE9GRiA9IDB4MDA4MAotU09fTkRFTE9OID0gMHgwMTAwCi1TT19OREVMT0ZGID0gMHgwMjAwCi1TT19JU1RUWSA9IDB4MDQwMAotU09fSVNOVFRZID0gMHgwODAwCi1TT19UT1NUT1AgPSAweDEwMDAKLVNPX1RPTlNUT1AgPSAweDIwMDAKLVNPX0JBTkQgPSAweDQwMDAKLVNPX0RFTElNID0gMHg4MDAwCi1TT19OT0RFTElNID0gMHgwMTAwMDAKLVNPX1NUUkhPTEQgPSAweDAyMDAwMAotU09fTE9PUCA9IDB4MDQwMDAwCi1EUlZPUEVOID0gMHgwCi1NT0RPUEVOID0gMHgxCi1DTE9ORU9QRU4gPSAweDIKLU9QRU5GQUlMID0gLTEKLUJQUklfTE8gPSAxCi1CUFJJX01FRCA9IDIKLUJQUklfSEkgPSAzCi1JTkZQU1ogPSAtMQotRkxVU0hBTEwgPSAxCi1GTFVTSERBVEEgPSAwCi1TVFJISUdIID0gNTEyMAotU1RSTE9XID0gMTAyNAotTUFYSU9DQlNaID0gMTAyNAotZGVmIHN0cmFsbihhKTogcmV0dXJuIChjYWRkcl90KSgoaW50KShhKSAmIH4oc2l6ZW9mKGludCktMSkpCi0KLUlQTV9JRCA9IDIwMAotSUNNUE1fSUQgPSAyMDEKLVRDUE1fSUQgPSAyMDIKLVVEUE1fSUQgPSAyMDMKLUFSUE1fSUQgPSAyMDQKLUFQUE1fSUQgPSAyMDUKLVJJUE1fSUQgPSAyMDYKLVBQUE1fSUQgPSAyMDcKLUFIRExDTV9JRCA9IDIwOAotTUhETENSSVBNX0lEID0gMjA5Ci1IRExDTV9JRCA9IDIxMAotUFBDSURfSUQgPSAyMTEKLUlHTVBNX0lEID0gMjEyCi1JUElQTV9JRCA9IDIxMwotSVBQUk9UT19JUCA9IDAKLUlQUFJPVE9fSE9QT1BUUyA9IDAKLUlQUFJPVE9fSUNNUCA9IDEKLUlQUFJPVE9fSUdNUCA9IDIKLUlQUFJPVE9fR0dQID0gMwotSVBQUk9UT19JUElQID0gNAotSVBQUk9UT19UQ1AgPSA2Ci1JUFBST1RPX0VHUCA9IDgKLUlQUFJPVE9fUFVQID0gMTIKLUlQUFJPVE9fVURQID0gMTcKLUlQUFJPVE9fSURQID0gMjIKLUlQUFJPVE9fVFAgPSAyOQotSVBQUk9UT19JUFY2ID0gNDEKLUlQUFJPVE9fUk9VVElORyA9IDQzCi1JUFBST1RPX0ZSQUdNRU5UID0gNDQKLUlQUFJPVE9fRVNQID0gNTAKLUlQUFJPVE9fQUggPSA1MQotSVBQUk9UT19JQ01QVjYgPSA1OAotSVBQUk9UT19OT05FID0gNTkKLUlQUFJPVE9fRFNUT1BUUyA9IDYwCi1JUFBST1RPX0hFTExPID0gNjMKLUlQUFJPVE9fTkQgPSA3NwotSVBQUk9UT19FT04gPSA4MAotSVBQUk9UT19SQVcgPSAyNTUKLUlQUFJPVE9fTUFYID0gMjU2Ci1JUFBPUlRfRUNITyA9IDcKLUlQUE9SVF9ESVNDQVJEID0gOQotSVBQT1JUX1NZU1RBVCA9IDExCi1JUFBPUlRfREFZVElNRSA9IDEzCi1JUFBPUlRfTkVUU1RBVCA9IDE1Ci1JUFBPUlRfRlRQID0gMjEKLUlQUE9SVF9URUxORVQgPSAyMwotSVBQT1JUX1NNVFAgPSAyNQotSVBQT1JUX1RJTUVTRVJWRVIgPSAzNwotSVBQT1JUX05BTUVTRVJWRVIgPSA0MgotSVBQT1JUX1dIT0lTID0gNDMKLUlQUE9SVF9NVFAgPSA1NwotSVBQT1JUX1RGVFAgPSA2OQotSVBQT1JUX1JKRSA9IDc3Ci1JUFBPUlRfRklOR0VSID0gNzkKLUlQUE9SVF9UVFlMSU5LID0gODcKLUlQUE9SVF9TVVBEVVAgPSA5NQotSVBQT1JUX0VYRUNTRVJWRVIgPSA1MTIKLUlQUE9SVF9MT0dJTlNFUlZFUiA9IDUxMwotSVBQT1JUX0NNRFNFUlZFUiA9IDUxNAotSVBQT1JUX0VGU1NFUlZFUiA9IDUyMAotSVBQT1JUX0JJRkZVRFAgPSA1MTIKLUlQUE9SVF9XSE9TRVJWRVIgPSA1MTMKLUlQUE9SVF9ST1VURVNFUlZFUiA9IDUyMAotSVBQT1JUX1JFU0VSVkVEID0gMTAyNAotSVBQT1JUX1VTRVJSRVNFUlZFRCA9IDY1NTM1Ci1JUFBPUlRfUkVTRVJWRURfTE9XID0gNTEyCi1JUFBPUlRfUkVTRVJWRURfSElHSCA9IDEwMjMKLUlQUE9SVF9VU0VSUkVTRVJWRURfTE9XID0gMzI3NjgKLUlQUE9SVF9VU0VSUkVTRVJWRURfSElHSCA9IDY1NTM1Ci1JTkVUX0FERFJTVFJMRU4gPSAxNgotSVBfT1BUSU9OUyA9IDEKLUlQX1RPUyA9IDIKLUlQX1RUTCA9IDMKLUlQX0hEUklOQ0wgPSA0Ci1JUF9SRUNWT1BUUyA9IDUKLUlQX1JFQ1ZSRVRPUFRTID0gNgotSVBfUkVDVkRTVEFERFIgPSA3Ci1JUF9SRVRPUFRTID0gOAotSVBfTVVMVElDQVNUX0lGID0gOQotSVBfTVVMVElDQVNUX0xPT1AgPSAxMAotSVBfQUREX01FTUJFUlNISVAgPSAxMQotSVBfRFJPUF9NRU1CRVJTSElQID0gMTIKLUlQX0JST0FEQ0FTVF9JRiA9IDE0Ci1JUF9SRUNWSUZJTkRFWCA9IDE1Ci1JUF9NVUxUSUNBU1RfVFRMID0gMTYKLU1SVF9JTklUID0gMTcKLU1SVF9ET05FID0gMTgKLU1SVF9BRERfVklGID0gMTkKLU1SVF9ERUxfVklGID0gMjAKLU1SVF9BRERfTUZDID0gMjEKLU1SVF9ERUxfTUZDID0gMjIKLU1SVF9WRVJTSU9OID0gMjMKLUlQX0RFRkFVTFRfTVVMVElDQVNUX1RUTCA9IDEKLUlQX0RFRkFVTFRfTVVMVElDQVNUX0xPT1AgPSAxCi1JUF9NQVhfTUVNQkVSU0hJUFMgPSAyMAotSU5BRERSX1VOU1BFQ19HUk9VUCA9IDB4ZTAwMDAwMDAKLUlOQUREUl9BTExIT1NUU19HUk9VUCA9IDB4ZTAwMDAwMDEKLUlOQUREUl9BTExSVFJTX0dST1VQID0gMHhlMDAwMDAwMgotSU5BRERSX01BWF9MT0NBTF9HUk9VUCA9IDB4ZTAwMDAwZmYKLQotIyBJbmNsdWRlZCBmcm9tIG5ldGluZXQvaW5fbXAuaAotCi0jIEluY2x1ZGVkIGZyb20gbmV0aW5ldC9pbl9tcF9kZGkuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL2lubGluZS5oCi1JUF9ISUVSX0JBU0UgPSAoMjApCi1kZWYgQVNTRVJUX0xPQ0soeCk6IHJldHVybgotCi1kZWYgQVNTRVJUX1dSTE9DSyh4KTogcmV0dXJuCi0KLWRlZiBBU1NFUlRfVU5MT0NLKHgpOiByZXR1cm4KLQotZGVmIENBTlBVVChxKTogcmV0dXJuIGNhbnB1dCgocSkpCi0KLWRlZiBDQU5QVVRORVhUKHEpOiByZXR1cm4gY2FucHV0bmV4dCgocSkpCi0KLUlORVRfREVCVUcgPSAxCmRpZmYgLS1naXQgYS9MaWIvcGxhdC11bml4d2FyZTcvU1RST1BUUy5weSBiL0xpYi9wbGF0LXVuaXh3YXJlNy9TVFJPUFRTLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjUwYTljLi4wMDAwMDAwCi0tLSBhL0xpYi9wbGF0LXVuaXh3YXJlNy9TVFJPUFRTLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLSMgR2VuZXJhdGVkIGJ5IGgycHkgZnJvbSAvdXNyL2luY2x1ZGUvc3lzL3N0cm9wdHMuaAotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3R5cGVzLmgKLWRlZiBxdWFkX2xvdyh4KTogcmV0dXJuIHgudmFsWzBdCi0KLUFEVF9FTUFTS1NJWkUgPSA4Ci1TSFJUX01JTiA9IC0zMjc2OAotU0hSVF9NQVggPSAzMjc2NwotSU5UX01JTiA9ICgtMjE0NzQ4MzY0Ny0xKQotSU5UX01BWCA9IDIxNDc0ODM2NDcKLUxPTkdfTUlOID0gKC0yMTQ3NDgzNjQ3LTEpCi1MT05HX01BWCA9IDIxNDc0ODM2NDcKLU9GRjMyX01BWCA9IExPTkdfTUFYCi1JU1RBVF9BU1NFUlRFRCA9IDAKLUlTVEFUX0FTU1VNRUQgPSAxCi1JU1RBVF9OT05FID0gMgotT0ZGX01BWCA9IE9GRjMyX01BWAotQ0xPQ0tfTUFYID0gTE9OR19NQVgKLVBfTVlJRCA9ICgtMSkKLVBfTVlIT1NUSUQgPSAoLTEpCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvc2VsZWN0LmgKLUZEX1NFVFNJWkUgPSA0MDk2Ci1OQkJZID0gOAotTlVMTCA9IDAKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy9jb25mLmgKLURfTkVXID0gMHgwMAotRF9PTEQgPSAweDAxCi1EX0RNQSA9IDB4MDIKLURfQkxLT0ZGID0gMHg0MDAKLURfTEZTID0gMHg4MDAwCi1EX1NUUiA9IDB4MDgwMAotRF9NT0QgPSAweDEwMDAKLURfUFNFVURPID0gMHgyMDAwCi1EX1JBTkRPTSA9IDB4NDAwMAotRF9IT1QgPSAweDEwMDAwCi1EX1NFRUtORUcgPSAweDA0Ci1EX1RBUEUgPSAweDA4Ci1EX05PQlJLVVAgPSAweDEwCi1EX0lOSVRQVUIgPSAweDIwCi1EX05PU1BFQ01BQ0RBVEEgPSAweDQwCi1EX1JEV0VRID0gMHg4MAotU0VDTUFTSyA9IChEX0lOSVRQVUJ8RF9OT1NQRUNNQUNEQVRBfERfUkRXRVEpCi1EQUZfUkVRRE1BID0gMHgxCi1EQUZfUEhZU1JFUSA9IDB4MgotREFGX1BSRTggPSAweDQKLURBRl9TVEFUSUMgPSAweDgKLURBRl9TVFIgPSAweDEwCi1EX01QID0gMHgxMDAKLURfVVBGID0gMHgyMDAKLVJPT1RGU19OQU1FU1ogPSA3Ci1GTU5BTUVTWiA9IDgKLU1DRF9WRVJTSU9OID0gMQotRElfQkNCUCA9IDAKLURJX01FRElBID0gMQotCi0jIEluY2x1ZGVkIGZyb20gc3lzL3NlY3N5cy5oCi1FU19NQUNPUEVOTElEID0gMQotRVNfTUFDU1lTTElEID0gMgotRVNfTUFDUk9PVExJRCA9IDMKLUVTX1BSVklORk8gPSA0Ci1FU19QUlZTRVRDTlQgPSA1Ci1FU19QUlZTRVRTID0gNgotRVNfTUFDQURUTElEID0gNwotRVNfUFJWSUQgPSA4Ci1FU19UUEdFVE1BSk9SID0gOQotU0FfRVhFQyA9IDBvMDEKLVNBX1dSSVRFID0gMG8wMgotU0FfUkVBRCA9IDBvMDQKLVNBX1NVQlNJWkUgPSAwbzEwCi0KLSMgSW5jbHVkZWQgZnJvbSBzeXMvc3Ryb3B0c19mLmgKLVhfU1RSID0gKG9yZCgnUycpPDw4KQotWF9JX0JBU0UgPSAoWF9TVFJ8MG8yMDApCi1YX0lfTlJFQUQgPSAoWF9TVFJ8MG8yMDEpCi1YX0lfUFVTSCA9IChYX1NUUnwwbzIwMikKLVhfSV9QT1AgPSAoWF9TVFJ8MG8yMDMpCi1YX0lfTE9PSyA9IChYX1NUUnwwbzIwNCkKLVhfSV9GTFVTSCA9IChYX1NUUnwwbzIwNSkKLVhfSV9TUkRPUFQgPSAoWF9TVFJ8MG8yMDYpCi1YX0lfR1JET1BUID0gKFhfU1RSfDBvMjA3KQotWF9JX1NUUiA9IChYX1NUUnwwbzIxMCkKLVhfSV9TRVRTSUcgPSAoWF9TVFJ8MG8yMTEpCi1YX0lfR0VUU0lHID0gKFhfU1RSfDBvMjEyKQotWF9JX0ZJTkQgPSAoWF9TVFJ8MG8yMTMpCi1YX0lfTElOSyA9IChYX1NUUnwwbzIxNCkKLVhfSV9VTkxJTksgPSAoWF9TVFJ8MG8yMTUpCi1YX0lfUEVFSyA9IChYX1NUUnwwbzIxNykKLVhfSV9GRElOU0VSVCA9IChYX1NUUnwwbzIyMCkKLVhfSV9TRU5ERkQgPSAoWF9TVFJ8MG8yMjEpCi1YX0lfUkVDVkZEID0gKFhfU1RSfDBvMjIyKQotCi0jIEluY2x1ZGVkIGZyb20gdW5pc3RkLmgKLQotIyBJbmNsdWRlZCBmcm9tIHN5cy91bmlzdGQuaAotUl9PSyA9IDBvMDQKLVdfT0sgPSAwbzAyCi1YX09LID0gMG8wMQotRl9PSyA9IDAwMAotRUZGX09OTFlfT0sgPSAwbzEwCi1FWF9PSyA9IDBvMjAKLVNFRUtfU0VUID0gMAotU0VFS19DVVIgPSAxCi1TRUVLX0VORCA9IDIKLV9TQ19BUkdfTUFYID0gMQotX1NDX0NISUxEX01BWCA9IDIKLV9TQ19DTEtfVENLID0gMwotX1NDX05HUk9VUFNfTUFYID0gNAotX1NDX09QRU5fTUFYID0gNQotX1NDX0pPQl9DT05UUk9MID0gNgotX1NDX1NBVkVEX0lEUyA9IDcKLV9TQ19WRVJTSU9OID0gOAotX1NDX1BBU1NfTUFYID0gOQotX1NDX0xPR05BTUVfTUFYID0gMTAKLV9TQ19QQUdFU0laRSA9IDExCi1fU0NfUEFHRV9TSVpFID0gX1NDX1BBR0VTSVpFCi1fU0NfWE9QRU5fVkVSU0lPTiA9IDEyCi1fU0NfTkFDTFNfTUFYID0gMTMKLV9TQ19OUFJPQ0VTU09SU19DT05GID0gMTQKLV9TQ19OUFJPQ0VTU09SU19PTkxOID0gMTUKLV9TQ19OUFJPQ0VTU0VTID0gMzkKLV9TQ19UT1RBTF9NRU1PUlkgPSA0MAotX1NDX1VTRUFCTEVfTUVNT1JZID0gNDEKLV9TQ19HRU5FUkFMX01FTU9SWSA9IDQyCi1fU0NfREVESUNBVEVEX01FTU9SWSA9IDQzCi1fU0NfTkNHU19DT05GID0gNDQKLV9TQ19OQ0dTX09OTE4gPSA0NQotX1NDX01BWF9DUFVTX1BFUl9DRyA9IDQ2Ci1fU0NfQ0dfU0lNUExFX0lNUEwgPSA0NwotX1NDX0NBQ0hFX0xJTkUgPSA0OAotX1NDX1NZU1RFTV9JRCA9IDQ5Ci1fU0NfVEhSRUFEUyA9IDUxCi1fU0NfVEhSRUFEX0FUVFJfU1RBQ0tBRERSID0gNTIKLV9TQ19USFJFQURfQVRUUl9TVEFDS1NJWkUgPSA1MwotX1NDX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMgPSA1NAotX1NDX1RIUkVBRF9LRVlTX01BWCA9IDU1Ci1fU0NfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgPSA1NgotX1NDX1RIUkVBRF9QUklPX0lOSEVSSVQgPSA1NwotX1NDX1RIUkVBRF9QUklPX1BST1RFQ1QgPSA1OAotX1NDX1RIUkVBRF9TVEFDS19NSU4gPSA1OQotX1NDX1RIUkVBRF9QUk9DRVNTX1NIQVJFRCA9IDYwCi1fU0NfVEhSRUFEX1NBRkVfRlVOQ1RJT05TID0gNjEKLV9TQ19USFJFQURfVEhSRUFEU19NQVggPSA2MgotX1NDX0tFUk5FTF9WTSA9IDYzCi1fU0NfVFpOQU1FX01BWCA9IDMyMAotX1NDX1NUUkVBTV9NQVggPSAzMjEKLV9TQ19YT1BFTl9DUllQVCA9IDMyMwotX1NDX1hPUEVOX0VOSF9JMThOID0gMzI0Ci1fU0NfWE9QRU5fU0hNID0gMzI1Ci1fU0NfWE9QRU5fWENVX1ZFUlNJT04gPSAzMjcKLV9TQ19BRVNfT1NfVkVSU0lPTiA9IDMzMAotX1NDX0FURVhJVF9NQVggPSAzMzEKLV9TQ18yX0NfQklORCA9IDM1MAotX1NDXzJfQ19ERVYgPSAzNTEKLV9TQ18yX0NfVkVSU0lPTiA9IDM1MgotX1NDXzJfQ0hBUl9URVJNID0gMzUzCi1fU0NfMl9GT1JUX0RFViA9IDM1NAotX1NDXzJfRk9SVF9SVU4gPSAzNTUKLV9TQ18yX0xPQ0FMRURFRiA9IDM1NgotX1NDXzJfU1dfREVWID0gMzU3Ci1fU0NfMl9VUEUgPSAzNTgKLV9TQ18yX1ZFUlNJT04gPSAzNTkKLV9TQ19CQ19CQVNFX01BWCA9IDM3MAotX1NDX0JDX0RJTV9NQVggPSAzNzEKLV9TQ19CQ19TQ0FMRV9NQVggPSAzNzIKLV9TQ19CQ19TVFJJTkdfTUFYID0gMzczCi1fU0NfQ09MTF9XRUlHSFRTX01BWCA9IDM4MAotX1NDX0VYUFJfTkVTVF9NQVggPSAzODEKLV9TQ19MSU5FX01BWCA9IDM4MgotX1NDX1JFX0RVUF9NQVggPSAzODMKLV9TQ19JT1ZfTUFYID0gMzkwCi1fU0NfTlBST0NfQ09ORiA9IDM5MQotX1NDX05QUk9DX09OTE4gPSAzOTIKLV9TQ19YT1BFTl9VTklYID0gNDAwCi1fU0NfU0VNQVBIT1JFUyA9IDQ0MAotX0NTX1BBVEggPSAxCi1fX09fQ1NfSE9TVE5BTUUgPSAyCi1fQ1NfUkVMRUFTRSA9IDMKLV9DU19WRVJTSU9OID0gNAotX19PX0NTX01BQ0hJTkUgPSA1Ci1fX09fQ1NfQVJDSElURUNUVVJFID0gNgotX0NTX0hXX1NFUklBTCA9IDcKLV9fT19DU19IV19QUk9WSURFUiA9IDgKLV9DU19TUlBDX0RPTUFJTiA9IDkKLV9DU19JTklUVEFCX05BTUUgPSAxMAotX19PX0NTX1NZU05BTUUgPSAxMQotX0NTX0xGU19DRkxBR1MgPSAyMAotX0NTX0xGU19MREZMQUdTID0gMjEKLV9DU19MRlNfTElCUyA9IDIyCi1fQ1NfTEZTX0xJTlRGTEFHUyA9IDIzCi1fQ1NfTEZTNjRfQ0ZMQUdTID0gMjQKLV9DU19MRlM2NF9MREZMQUdTID0gMjUKLV9DU19MRlM2NF9MSUJTID0gMjYKLV9DU19MRlM2NF9MSU5URkxBR1MgPSAyNwotX0NTX0FSQ0hJVEVDVFVSRSA9IDEwMAotX0NTX0JVU1RZUEVTID0gMTAxCi1fQ1NfSE9TVE5BTUUgPSAxMDIKLV9DU19IV19QUk9WSURFUiA9IDEwMwotX0NTX0tFUk5FTF9TVEFNUCA9IDEwNAotX0NTX01BQ0hJTkUgPSAxMDUKLV9DU19PU19CQVNFID0gMTA2Ci1fQ1NfT1NfUFJPVklERVIgPSAxMDcKLV9DU19TWVNOQU1FID0gMTA4Ci1fQ1NfVVNFUl9MSU1JVCA9IDEwOQotX1BDX0xJTktfTUFYID0gMQotX1BDX01BWF9DQU5PTiA9IDIKLV9QQ19NQVhfSU5QVVQgPSAzCi1fUENfTkFNRV9NQVggPSA0Ci1fUENfUEFUSF9NQVggPSA1Ci1fUENfUElQRV9CVUYgPSA2Ci1fUENfTk9fVFJVTkMgPSA3Ci1fUENfVkRJU0FCTEUgPSA4Ci1fUENfQ0hPV05fUkVTVFJJQ1RFRCA9IDkKLV9QQ19GSUxFU0laRUJJVFMgPSAxMAotX1BPU0lYX1ZFUlNJT04gPSAxOTkwMDkKLV9YT1BFTl9WRVJTSU9OID0gNAotR0ZfUEFUSCA9ICIvZXRjL2dyb3VwIgotUEZfUEFUSCA9ICIvZXRjL3Bhc3N3ZCIKLUZfVUxPQ0sgPSAwCi1GX0xPQ0sgPSAxCi1GX1RMT0NLID0gMgotRl9URVNUID0gMwotX1BPU0lYX0pPQl9DT05UUk9MID0gMQotX1BPU0lYX1NBVkVEX0lEUyA9IDEKLV9QT1NJWF9WRElTQUJMRSA9IDAKLU5VTEwgPSAwCi1TVERJTl9GSUxFTk8gPSAwCi1TVERPVVRfRklMRU5PID0gMQotU1RERVJSX0ZJTEVOTyA9IDIKLV9YT1BFTl9VTklYID0gMQotX1hPUEVOX0VOSF9JMThOID0gMQotX1hPUEVOX1hQRzQgPSAxCi1fUE9TSVgyX0NfVkVSU0lPTiA9IDE5OTIwOQotX1BPU0lYMl9WRVJTSU9OID0gMTk5MjA5Ci1fWE9QRU5fWENVX1ZFUlNJT04gPSA0Ci1fUE9TSVhfU0VNQVBIT1JFUyA9IDEKLV9QT1NJWF9USFJFQURTID0gMQotX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLQUREUiA9IDEKLV9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgPSAxCi1fUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgPSAxCi1fUE9TSVhfVEhSRUFEX1BST0NFU1NfU0hBUkVEID0gMQotX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUyA9IDEKLV9QT1NJWDJfQ19CSU5EID0gMQotX1BPU0lYMl9DSEFSX1RFUk0gPSAxCi1fUE9TSVgyX0ZPUlRfUlVOID0gMQotX1BPU0lYMl9MT0NBTEVERUYgPSAxCi1fUE9TSVgyX1VQRSA9IDEKLV9MRlNfQVNZTkNIUk9OT1VTX0lPID0gMQotX0xGU19MQVJHRUZJTEUgPSAxCi1fTEZTNjRfQVNZTkNIUk9OT1VTX0lPID0gMQotX0xGUzY0X0xBUkdFRklMRSA9IDEKLV9MRlM2NF9TVERJTyA9IDEKLUZNTkFNRVNaID0gOAotU05EWkVSTyA9IDB4MDAxCi1TTkRQSVBFID0gMHgwMDIKLVJOT1JNID0gMHgwMDAKLVJNU0dEID0gMHgwMDEKLVJNU0dOID0gMHgwMDIKLVJNT0RFTUFTSyA9IDB4MDAzCi1SUFJPVERBVCA9IDB4MDA0Ci1SUFJPVERJUyA9IDB4MDA4Ci1SUFJPVE5PUk0gPSAweDAxMAotUlBST1RNQVNLID0gMHgwMWMKLUZMVVNIUiA9IDB4MDEKLUZMVVNIVyA9IDB4MDIKLUZMVVNIUlcgPSAweDAzCi1GTFVTSEJBTkQgPSAweDA0Ci1TX0lOUFVUID0gMHgwMDAxCi1TX0hJUFJJID0gMHgwMDAyCi1TX09VVFBVVCA9IDB4MDAwNAotU19NU0cgPSAweDAwMDgKLVNfRVJST1IgPSAweDAwMTAKLVNfSEFOR1VQID0gMHgwMDIwCi1TX1JETk9STSA9IDB4MDA0MAotU19XUk5PUk0gPSBTX09VVFBVVAotU19SREJBTkQgPSAweDAwODAKLVNfV1JCQU5EID0gMHgwMTAwCi1TX0JBTkRVUkcgPSAweDAyMDAKLVJTX0hJUFJJID0gMHgwMQotTVNHX0hJUFJJID0gMHgwMQotTVNHX0FOWSA9IDB4MDIKLU1TR19CQU5EID0gMHgwNAotTVNHX0RJU0NBUkQgPSAweDA4Ci1NU0dfUEVFS0lPQ1RMID0gMHgxMAotTU9SRUNUTCA9IDEKLU1PUkVEQVRBID0gMgotTVVYSURfQUxMID0gKC0xKQotQU5ZTUFSSyA9IDB4MDEKLUxBU1RNQVJLID0gMHgwMgotU1RSID0gKG9yZCgnUycpPDw4KQotSV9OUkVBRCA9IChTVFJ8MG8xKQotSV9QVVNIID0gKFNUUnwwbzIpCi1JX1BPUCA9IChTVFJ8MG8zKQotSV9MT09LID0gKFNUUnwwbzQpCi1JX0ZMVVNIID0gKFNUUnwwbzUpCi1JX1NSRE9QVCA9IChTVFJ8MG82KQotSV9HUkRPUFQgPSAoU1RSfDBvNykKLUlfU1RSID0gKFNUUnwwbzEwKQotSV9TRVRTSUcgPSAoU1RSfDBvMTEpCi1JX0dFVFNJRyA9IChTVFJ8MG8xMikKLUlfRklORCA9IChTVFJ8MG8xMykKLUlfTElOSyA9IChTVFJ8MG8xNCkKLUlfVU5MSU5LID0gKFNUUnwwbzE1KQotSV9QRUVLID0gKFNUUnwwbzE3KQotSV9GRElOU0VSVCA9IChTVFJ8MG8yMCkKLUlfU0VOREZEID0gKFNUUnwwbzIxKQotSV9SRUNWRkQgPSAoU1RSfDBvMjIpCi1JX0VfUkVDVkZEID0gKFNUUnwwbzE2KQotSV9SRUNWRkQgPSAoU1RSfDBvMTYpCi1JX1JFQ1ZGRCA9IChTVFJ8MG8yMikKLUlfU1dST1BUID0gKFNUUnwwbzIzKQotSV9HV1JPUFQgPSAoU1RSfDBvMjQpCi1JX0xJU1QgPSAoU1RSfDBvMjUpCi1JX1BMSU5LID0gKFNUUnwwbzI2KQotSV9QVU5MSU5LID0gKFNUUnwwbzI3KQotSV9GTFVTSEJBTkQgPSAoU1RSfDBvMzQpCi1JX0NLQkFORCA9IChTVFJ8MG8zNSkKLUlfR0VUQkFORCA9IChTVFJ8MG8zNikKLUlfQVRNQVJLID0gKFNUUnwwbzM3KQotSV9TRVRDTFRJTUUgPSAoU1RSfDBvNDApCi1JX0dFVENMVElNRSA9IChTVFJ8MG80MSkKLUlfQ0FOUFVUID0gKFNUUnwwbzQyKQotSV9TX1JFQ1ZGRCA9IChTVFJ8MG80MykKLUlfU1RBVFMgPSAoU1RSfDBvNDQpCi1JX0JJR1BJUEUgPSAoU1RSfDBvNDUpCi1JX0dFVFRQID0gKFNUUnwwbzQ2KQotSU5GVElNID0gLTEKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LXVuaXh3YXJlNy9yZWdlbiBiL0xpYi9wbGF0LXVuaXh3YXJlNy9yZWdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjg5OThhNy4uMDAwMDAwMAotLS0gYS9MaWIvcGxhdC11bml4d2FyZTcvcmVnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMhIC9iaW4vc2gKLWNhc2UgYHVuYW1lIC1zcmAgaW4KLVVuaXhXYXJlKikJOzsKLSopCWVjaG8gUHJvYmFibHkgbm90IG9uIGEgVW5peFdhcmUgc3lzdGVtIDE+JjIKLQlleGl0IDE7OwotZXNhYwotc2V0IC12Ci1oMnB5IC1pICcodV9sb25nKScgL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaAotaDJweSAvdXNyL2luY2x1ZGUvc3lzL3N0cm9wdHMuaApkaWZmIC0tZ2l0IGEvTGliL3BsYXRmb3JtLnB5IGIvTGliL3BsYXRmb3JtLnB5CmluZGV4IGU3ZWFhMzIuLmVlMzE1ZmEgMTAwNzU1Ci0tLSBhL0xpYi9wbGF0Zm9ybS5weQorKysgYi9MaWIvcGxhdGZvcm0ucHkKQEAgLTEzLDcgKzEzLDYgQEAKICMgICAgUHl0aG9uIGJ1ZyB0cmFja2VyIChodHRwOi8vYnVncy5weXRob24ub3JnKSBhbmQgYXNzaWduIHRoZW0gdG8gImxlbWJ1cmciLgogIwogIyAgICBTdGlsbCBuZWVkZWQ6Ci0jICAgICogbW9yZSBzdXBwb3J0IGZvciBXaW5DRQogIyAgICAqIHN1cHBvcnQgZm9yIE1TLURPUyAoUHl0aG9uRFggPykKICMgICAgKiBzdXBwb3J0IGZvciBBbWlnYSBhbmQgb3RoZXIgc3RpbGwgdW5zdXBwb3J0ZWQgcGxhdGZvcm1zIHJ1bm5pbmcgUHl0aG9uCiAjICAgICogc3VwcG9ydCBmb3IgYWRkaXRpb25hbCBMaW51eCBkaXN0cmlidXRpb25zCkBAIC0yNTIsMTMgKzI1MSwxMyBAQAogCiBfcmVsZWFzZV9maWxlbmFtZSA9IHJlLmNvbXBpbGUocicoXHcrKVstX10ocmVsZWFzZXx2ZXJzaW9uKScsIHJlLkFTQ0lJKQogX2xzYl9yZWxlYXNlX3ZlcnNpb24gPSByZS5jb21waWxlKHInKC4rKScKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyByZWxlYXNlICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhbXGQuXSspJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW14oXSooPzpcKCguKylcKSk/JywgcmUuQVNDSUkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicgcmVsZWFzZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicoW1xkLl0rKScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1teKF0qKD86XCgoLispXCkpPycsIHJlLkFTQ0lJKQogX3JlbGVhc2VfdmVyc2lvbiA9IHJlLmNvbXBpbGUocicoW14wLTldKyknCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyg/OiByZWxlYXNlICk/JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoW1xkLl0rKScKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW14oXSooPzpcKCguKylcKSk/JywgcmUuQVNDSUkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJyg/OiByZWxlYXNlICk/JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicoW1xkLl0rKScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInW14oXSooPzpcKCguKylcKSk/JywgcmUuQVNDSUkpCiAKICMgU2VlIGFsc28gaHR0cDovL3d3dy5ub3ZlbGwuY29tL2Nvb2xzb2x1dGlvbnMvZmVhdHVyZS8xMTI1MS5odG1sCiAjIGFuZCBodHRwOi8vbGludXhtYWZpYS5jb20vZmFxL0FkbWluL3JlbGVhc2UtZmlsZXMuaHRtbApAQCAtNDA4LDggKzQwNyw4IEBACiAgICAgcmV0dXJuIHZlcnNpb24KIAogX3Zlcl9vdXRwdXQgPSByZS5jb21waWxlKHInKD86KFtcdyBdKykgKFtcdy5dKykgJwotICAgICAgICAgICAgICAgICAgICAgICAgICcuKicKLSAgICAgICAgICAgICAgICAgICAgICAgICAnXFsuKiAoW1xkLl0rKVxdKScpCisgICAgICAgICAgICAgICAgICAgICAgICAgcicuKicKKyAgICAgICAgICAgICAgICAgICAgICAgICByJ1xbLiogKFtcZC5dKylcXSknKQogCiAjIEV4YW1wbGVzIG9mIFZFUiBjb21tYW5kIG91dHB1dDoKICMKQEAgLTExNTQsMjIgKzExNTMsMjIgQEAKIAogX2lyb25weXRob25fc3lzX3ZlcnNpb25fcGFyc2VyID0gcmUuY29tcGlsZSgKICAgICByJ0lyb25QeXRob25ccyonCi0gICAgJyhbXGRcLl0rKScKLSAgICAnKD86IFwoKFtcZFwuXSspXCkpPycKLSAgICAnIG9uICguTkVUIFtcZFwuXSspJywgcmUuQVNDSUkpCisgICAgcicoW1xkXC5dKyknCisgICAgcicoPzogXCgoW1xkXC5dKylcKSk/JworICAgIHInIG9uICguTkVUIFtcZFwuXSspJywgcmUuQVNDSUkpCiAKICMgSXJvblB5dGhvbiBjb3ZlcmluZyAyLjYgYW5kIDIuNwogX2lyb25weXRob24yNl9zeXNfdmVyc2lvbl9wYXJzZXIgPSByZS5jb21waWxlKAogICAgIHInKFtcZC5dKylccyonCi0gICAgJ1woSXJvblB5dGhvblxzKicKLSAgICAnW1xkLl0rXHMqJwotICAgICdcKChbXGQuXSspXCkgb24gKFtcdy5dKyBbXGQuXSsoPzogXChcZCstYml0XCkpPylcKScKKyAgICByJ1woSXJvblB5dGhvblxzKicKKyAgICByJ1tcZC5dK1xzKicKKyAgICByJ1woKFtcZC5dKylcKSBvbiAoW1x3Ll0rIFtcZC5dKyg/OiBcKFxkKy1iaXRcKSk/KVwpJwogKQogCiBfcHlweV9zeXNfdmVyc2lvbl9wYXJzZXIgPSByZS5jb21waWxlKAogICAgIHInKFtcdy4rXSspXHMqJwotICAgICdcKCM/KFteLF0rKSxccyooW1x3IF0rKSxccyooW1x3IDpdKylcKVxzKicKLSAgICAnXFtQeVB5IFteXF1dK1xdPycpCisgICAgcidcKCM/KFteLF0rKSxccyooW1x3IF0rKSxccyooW1x3IDpdKylcKVxzKicKKyAgICByJ1xbUHlQeSBbXlxdXStcXT8nKQogCiBfc3lzX3ZlcnNpb25fY2FjaGUgPSB7fQogCkBAIC0xNDA0LDcgKzE0MDMsNyBAQAogICAgICAgICAgICAgIyBzZWUgaXNzdWUgIzEzMjIgZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKAogICAgICAgICAgICAgICAgICdpZ25vcmUnLAotICAgICAgICAgICAgICAgICdkaXN0XChcKSBhbmQgbGludXhfZGlzdHJpYnV0aW9uXChcKSAnCisgICAgICAgICAgICAgICAgcidkaXN0XChcKSBhbmQgbGludXhfZGlzdHJpYnV0aW9uXChcKSAnCiAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9ucyBhcmUgZGVwcmVjYXRlZCAuKicsCiAgICAgICAgICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9wbGlzdGxpYi5weSBiL0xpYi9wbGlzdGxpYi5weQppbmRleCBiNjY2MzljLi40ZjM2MGYzIDEwMDY0NAotLS0gYS9MaWIvcGxpc3RsaWIucHkKKysrIGIvTGliL3BsaXN0bGliLnB5CkBAIC00Nyw3ICs0Nyw3IEBACiAiIiIKIF9fYWxsX18gPSBbCiAgICAgInJlYWRQbGlzdCIsICJ3cml0ZVBsaXN0IiwgInJlYWRQbGlzdEZyb21CeXRlcyIsICJ3cml0ZVBsaXN0VG9CeXRlcyIsCi0gICAgIlBsaXN0IiwgIkRhdGEiLCAiRGljdCIsICJGTVRfWE1MIiwgIkZNVF9CSU5BUlkiLAorICAgICJQbGlzdCIsICJEYXRhIiwgIkRpY3QiLCAiSW52YWxpZEZpbGVFeGNlcHRpb24iLCAiRk1UX1hNTCIsICJGTVRfQklOQVJZIiwKICAgICAibG9hZCIsICJkdW1wIiwgImxvYWRzIiwgImR1bXBzIgogXQogCmRpZmYgLS1naXQgYS9MaWIvcG9zaXhwYXRoLnB5IGIvTGliL3Bvc2l4cGF0aC5weQppbmRleCBkOWYzZjk5Li42ZGJkYWIyIDEwMDY0NAotLS0gYS9MaWIvcG9zaXhwYXRoLnB5CisrKyBiL0xpYi9wb3NpeHBhdGgucHkKQEAgLTQ5LDYgKzQ5LDcgQEAKIAogZGVmIG5vcm1jYXNlKHMpOgogICAgICIiIk5vcm1hbGl6ZSBjYXNlIG9mIHBhdGhuYW1lLiAgSGFzIG5vIGVmZmVjdCB1bmRlciBQb3NpeCIiIgorICAgIHMgPSBvcy5mc3BhdGgocykKICAgICBpZiBub3QgaXNpbnN0YW5jZShzLCAoYnl0ZXMsIHN0cikpOgogICAgICAgICByYWlzZSBUeXBlRXJyb3IoIm5vcm1jYXNlKCkgYXJndW1lbnQgbXVzdCBiZSBzdHIgb3IgYnl0ZXMsICIKICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgJ3t9JyIuZm9ybWF0KHMuX19jbGFzc19fLl9fbmFtZV9fKSkKQEAgLTYwLDYgKzYxLDcgQEAKIAogZGVmIGlzYWJzKHMpOgogICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggaXMgYWJzb2x1dGUiIiIKKyAgICBzID0gb3MuZnNwYXRoKHMpCiAgICAgc2VwID0gX2dldF9zZXAocykKICAgICByZXR1cm4gcy5zdGFydHN3aXRoKHNlcCkKIApAQCAtNzMsMTIgKzc1LDEzIEBACiAgICAgSWYgYW55IGNvbXBvbmVudCBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBhbGwgcHJldmlvdXMgcGF0aCBjb21wb25lbnRzCiAgICAgd2lsbCBiZSBkaXNjYXJkZWQuICBBbiBlbXB0eSBsYXN0IHBhcnQgd2lsbCByZXN1bHQgaW4gYSBwYXRoIHRoYXQKICAgICBlbmRzIHdpdGggYSBzZXBhcmF0b3IuIiIiCisgICAgYSA9IG9zLmZzcGF0aChhKQogICAgIHNlcCA9IF9nZXRfc2VwKGEpCiAgICAgcGF0aCA9IGEKICAgICB0cnk6CiAgICAgICAgIGlmIG5vdCBwOgogICAgICAgICAgICAgcGF0aFs6MF0gKyBzZXAgICMyMzc4MDogRW5zdXJlIGNvbXBhdGlibGUgZGF0YSB0eXBlIGV2ZW4gaWYgcCBpcyBudWxsLgotICAgICAgICBmb3IgYiBpbiBwOgorICAgICAgICBmb3IgYiBpbiBtYXAob3MuZnNwYXRoLCBwKToKICAgICAgICAgICAgIGlmIGIuc3RhcnRzd2l0aChzZXApOgogICAgICAgICAgICAgICAgIHBhdGggPSBiCiAgICAgICAgICAgICBlbGlmIG5vdCBwYXRoIG9yIHBhdGguZW5kc3dpdGgoc2VwKToKQEAgLTk5LDYgKzEwMiw3IEBACiBkZWYgc3BsaXQocCk6CiAgICAgIiIiU3BsaXQgYSBwYXRobmFtZS4gIFJldHVybnMgdHVwbGUgIihoZWFkLCB0YWlsKSIgd2hlcmUgInRhaWwiIGlzCiAgICAgZXZlcnl0aGluZyBhZnRlciB0aGUgZmluYWwgc2xhc2guICBFaXRoZXIgcGFydCBtYXkgYmUgZW1wdHkuIiIiCisgICAgcCA9IG9zLmZzcGF0aChwKQogICAgIHNlcCA9IF9nZXRfc2VwKHApCiAgICAgaSA9IHAucmZpbmQoc2VwKSArIDEKICAgICBoZWFkLCB0YWlsID0gcFs6aV0sIHBbaTpdCkBAIC0xMTMsNiArMTE3LDcgQEAKICMgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCByb290ICsgZXh0ID09IHAuCiAKIGRlZiBzcGxpdGV4dChwKToKKyAgICBwID0gb3MuZnNwYXRoKHApCiAgICAgaWYgaXNpbnN0YW5jZShwLCBieXRlcyk6CiAgICAgICAgIHNlcCA9IGInLycKICAgICAgICAgZXh0c2VwID0gYicuJwpAQCAtMTI4LDYgKzEzMyw3IEBACiBkZWYgc3BsaXRkcml2ZShwKToKICAgICAiIiJTcGxpdCBhIHBhdGhuYW1lIGludG8gZHJpdmUgYW5kIHBhdGguIE9uIFBvc2l4LCBkcml2ZSBpcyBhbHdheXMKICAgICBlbXB0eS4iIiIKKyAgICBwID0gb3MuZnNwYXRoKHApCiAgICAgcmV0dXJuIHBbOjBdLCBwCiAKIApAQCAtMTM1LDYgKzE0MSw3IEBACiAKIGRlZiBiYXNlbmFtZShwKToKICAgICAiIiJSZXR1cm5zIHRoZSBmaW5hbCBjb21wb25lbnQgb2YgYSBwYXRobmFtZSIiIgorICAgIHAgPSBvcy5mc3BhdGgocCkKICAgICBzZXAgPSBfZ2V0X3NlcChwKQogICAgIGkgPSBwLnJmaW5kKHNlcCkgKyAxCiAgICAgcmV0dXJuIHBbaTpdCkBAIC0xNDQsNiArMTUxLDcgQEAKIAogZGVmIGRpcm5hbWUocCk6CiAgICAgIiIiUmV0dXJucyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lIiIiCisgICAgcCA9IG9zLmZzcGF0aChwKQogICAgIHNlcCA9IF9nZXRfc2VwKHApCiAgICAgaSA9IHAucmZpbmQoc2VwKSArIDEKICAgICBoZWFkID0gcFs6aV0KQEAgLTIyMiw2ICsyMzAsNyBAQAogZGVmIGV4cGFuZHVzZXIocGF0aCk6CiAgICAgIiIiRXhwYW5kIH4gYW5kIH51c2VyIGNvbnN0cnVjdGlvbnMuICBJZiB1c2VyIG9yICRIT01FIGlzIHVua25vd24sCiAgICAgZG8gbm90aGluZy4iIiIKKyAgICBwYXRoID0gb3MuZnNwYXRoKHBhdGgpCiAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBieXRlcyk6CiAgICAgICAgIHRpbGRlID0gYid+JwogICAgIGVsc2U6CkBAIC0yNjcsNiArMjc2LDcgQEAKIGRlZiBleHBhbmR2YXJzKHBhdGgpOgogICAgICIiIkV4cGFuZCBzaGVsbCB2YXJpYWJsZXMgb2YgZm9ybSAkdmFyIGFuZCAke3Zhcn0uICBVbmtub3duIHZhcmlhYmxlcwogICAgIGFyZSBsZWZ0IHVuY2hhbmdlZC4iIiIKKyAgICBwYXRoID0gb3MuZnNwYXRoKHBhdGgpCiAgICAgZ2xvYmFsIF92YXJwcm9nLCBfdmFycHJvZ2IKICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIGJ5dGVzKToKICAgICAgICAgaWYgYickJyBub3QgaW4gcGF0aDoKQEAgLTMxOCw2ICszMjgsNyBAQAogCiBkZWYgbm9ybXBhdGgocGF0aCk6CiAgICAgIiIiTm9ybWFsaXplIHBhdGgsIGVsaW1pbmF0aW5nIGRvdWJsZSBzbGFzaGVzLCBldGMuIiIiCisgICAgcGF0aCA9IG9zLmZzcGF0aChwYXRoKQogICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgYnl0ZXMpOgogICAgICAgICBzZXAgPSBiJy8nCiAgICAgICAgIGVtcHR5ID0gYicnCkBAIC0zNTUsNiArMzY2LDcgQEAKIAogZGVmIGFic3BhdGgocGF0aCk6CiAgICAgIiIiUmV0dXJuIGFuIGFic29sdXRlIHBhdGguIiIiCisgICAgcGF0aCA9IG9zLmZzcGF0aChwYXRoKQogICAgIGlmIG5vdCBpc2FicyhwYXRoKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBieXRlcyk6CiAgICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2RiKCkKQEAgLTM3MCw2ICszODIsNyBAQAogZGVmIHJlYWxwYXRoKGZpbGVuYW1lKToKICAgICAiIiJSZXR1cm4gdGhlIGNhbm9uaWNhbCBwYXRoIG9mIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUsIGVsaW1pbmF0aW5nIGFueQogc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQgaW4gdGhlIHBhdGguIiIiCisgICAgZmlsZW5hbWUgPSBvcy5mc3BhdGgoZmlsZW5hbWUpCiAgICAgcGF0aCwgb2sgPSBfam9pbnJlYWxwYXRoKGZpbGVuYW1lWzowXSwgZmlsZW5hbWUsIHt9KQogICAgIHJldHVybiBhYnNwYXRoKHBhdGgpCiAKQEAgLTQzNCw2ICs0NDcsNyBAQAogICAgIGlmIG5vdCBwYXRoOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJubyBwYXRoIHNwZWNpZmllZCIpCiAKKyAgICBwYXRoID0gb3MuZnNwYXRoKHBhdGgpCiAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBieXRlcyk6CiAgICAgICAgIGN1cmRpciA9IGInLicKICAgICAgICAgc2VwID0gYicvJwpAQCAtNDQ1LDYgKzQ1OSw4IEBACiAKICAgICBpZiBzdGFydCBpcyBOb25lOgogICAgICAgICBzdGFydCA9IGN1cmRpcgorICAgIGVsc2U6CisgICAgICAgIHN0YXJ0ID0gb3MuZnNwYXRoKHN0YXJ0KQogCiAgICAgdHJ5OgogICAgICAgICBzdGFydF9saXN0ID0gW3ggZm9yIHggaW4gYWJzcGF0aChzdGFydCkuc3BsaXQoc2VwKSBpZiB4XQpAQCAtNDcyLDYgKzQ4OCw3IEBACiAgICAgaWYgbm90IHBhdGhzOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdjb21tb25wYXRoKCkgYXJnIGlzIGFuIGVtcHR5IHNlcXVlbmNlJykKIAorICAgIHBhdGhzID0gdHVwbGUobWFwKG9zLmZzcGF0aCwgcGF0aHMpKQogICAgIGlmIGlzaW5zdGFuY2UocGF0aHNbMF0sIGJ5dGVzKToKICAgICAgICAgc2VwID0gYicvJwogICAgICAgICBjdXJkaXIgPSBiJy4nCmRpZmYgLS1naXQgYS9MaWIvcHljbGJyLnB5IGIvTGliL3B5Y2xici5weQppbmRleCA0ZDQwYjg3Li5kN2RiYTk3IDEwMDY0NAotLS0gYS9MaWIvcHljbGJyLnB5CisrKyBiL0xpYi9weWNsYnIucHkKQEAgLTQwLDEyICs0MCwxMCBAQAogIiIiCiAKIGltcG9ydCBpbwotaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgaW1wb3J0bGliLnV0aWwKIGltcG9ydCB0b2tlbml6ZQogZnJvbSB0b2tlbiBpbXBvcnQgTkFNRSwgREVERU5ULCBPUAotZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgogCiBfX2FsbF9fID0gWyJyZWFkbW9kdWxlIiwgInJlYWRtb2R1bGVfZXgiLCAiQ2xhc3MiLCAiRnVuY3Rpb24iXQogCkBAIC0zMjgsNiArMzI2LDcgQEAKIGRlZiBfbWFpbigpOgogICAgICMgTWFpbiBwcm9ncmFtIGZvciB0ZXN0aW5nLgogICAgIGltcG9ydCBvcworICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGl0ZW1nZXR0ZXIKICAgICBtb2QgPSBzeXMuYXJndlsxXQogICAgIGlmIG9zLnBhdGguZXhpc3RzKG1vZCk6CiAgICAgICAgIHBhdGggPSBbb3MucGF0aC5kaXJuYW1lKG1vZCldCmRpZmYgLS1naXQgYS9MaWIvcHlkb2MucHkgYi9MaWIvcHlkb2MucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAwZDBkMGFiLi4zOWRiMzkxCi0tLSBhL0xpYi9weWRvYy5weQorKysgYi9MaWIvcHlkb2MucHkKQEAgLTIwOSw2ICsyMDksMTggQEAKICAgICAgICAgcmVzdWx0cy5hcHBlbmQoKG5hbWUsIGtpbmQsIGNscywgdmFsdWUpKQogICAgIHJldHVybiByZXN1bHRzCiAKK2RlZiBzb3J0X2F0dHJpYnV0ZXMoYXR0cnMsIG9iamVjdCk6CisgICAgJ1NvcnQgdGhlIGF0dHJzIGxpc3QgaW4tcGxhY2UgYnkgX2ZpZWxkcyBhbmQgdGhlbiBhbHBoYWJldGljYWxseSBieSBuYW1lJworICAgICMgVGhpcyBhbGxvd3MgZGF0YSBkZXNjcmlwdG9ycyB0byBiZSBvcmRlcmVkIGFjY29yZGluZworICAgICMgdG8gYSBfZmllbGRzIGF0dHJpYnV0ZSBpZiBwcmVzZW50LgorICAgIGZpZWxkcyA9IGdldGF0dHIob2JqZWN0LCAnX2ZpZWxkcycsIFtdKQorICAgIHRyeToKKyAgICAgICAgZmllbGRfb3JkZXIgPSB7bmFtZSA6IGktbGVuKGZpZWxkcykgZm9yIChpLCBuYW1lKSBpbiBlbnVtZXJhdGUoZmllbGRzKX0KKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICBmaWVsZF9vcmRlciA9IHt9CisgICAga2V5ZnVuYyA9IGxhbWJkYSBhdHRyOiAoZmllbGRfb3JkZXIuZ2V0KGF0dHJbMF0sIDApLCBhdHRyWzBdKQorICAgIGF0dHJzLnNvcnQoa2V5PWtleWZ1bmMpCisKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbW9kdWxlIG1hbmlwdWxhdGlvbgogCiBkZWYgaXNwYWNrYWdlKHBhdGgpOgpAQCAtMzM4LDcgKzM1MCw3IEBACiAgICAgICAgIGVsaWYgZXhjIGlzIFN5bnRheEVycm9yOgogICAgICAgICAgICAgIyBBIFN5bnRheEVycm9yIG9jY3VycmVkIGJlZm9yZSB3ZSBjb3VsZCBleGVjdXRlIHRoZSBtb2R1bGUuCiAgICAgICAgICAgICByYWlzZSBFcnJvckR1cmluZ0ltcG9ydCh2YWx1ZS5maWxlbmFtZSwgaW5mbykKLSAgICAgICAgZWxpZiBleGMgaXMgSW1wb3J0RXJyb3IgYW5kIHZhbHVlLm5hbWUgPT0gcGF0aDoKKyAgICAgICAgZWxpZiBpc3N1YmNsYXNzKGV4YywgSW1wb3J0RXJyb3IpIGFuZCB2YWx1ZS5uYW1lID09IHBhdGg6CiAgICAgICAgICAgICAjIE5vIHN1Y2ggbW9kdWxlIGluIHRoZSBwYXRoLgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgZWxzZToKQEAgLTg2OCw4ICs4ODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuX19tb2R1bGVfXykKICAgICAgICAgICAgIHRhZyArPSAnOjxicj5cbicKIAotICAgICAgICAgICAgIyBTb3J0IGF0dHJzIGJ5IG5hbWUuCi0gICAgICAgICAgICBhdHRycy5zb3J0KGtleT1sYW1iZGEgdDogdFswXSkKKyAgICAgICAgICAgIHNvcnRfYXR0cmlidXRlcyhhdHRycywgb2JqZWN0KQogCiAgICAgICAgICAgICAjIFB1bXAgb3V0IHRoZSBhdHRycywgc2VncmVnYXRlZCBieSBraW5kLgogICAgICAgICAgICAgYXR0cnMgPSBzcGlsbCgnTWV0aG9kcyAlcycgJSB0YWcsIGF0dHJzLApAQCAtMTI4Nyw4ICsxMjk4LDggQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgdGFnID0gImluaGVyaXRlZCBmcm9tICVzIiAlIGNsYXNzbmFtZSh0aGlzY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuX19tb2R1bGVfXykKLSAgICAgICAgICAgICMgU29ydCBhdHRycyBieSBuYW1lLgotICAgICAgICAgICAgYXR0cnMuc29ydCgpCisKKyAgICAgICAgICAgIHNvcnRfYXR0cmlidXRlcyhhdHRycywgb2JqZWN0KQogCiAgICAgICAgICAgICAjIFB1bXAgb3V0IHRoZSBhdHRycywgc2VncmVnYXRlZCBieSBraW5kLgogICAgICAgICAgICAgYXR0cnMgPSBzcGlsbCgiTWV0aG9kcyAlczpcbiIgJSB0YWcsIGF0dHJzLApAQCAtMTQxOCwxMyArMTQyOSwxNCBAQAogICAgICAgICByZXR1cm4gcGxhaW5wYWdlcgogICAgIGlmIG5vdCBzeXMuc3RkaW4uaXNhdHR5KCkgb3Igbm90IHN5cy5zdGRvdXQuaXNhdHR5KCk6CiAgICAgICAgIHJldHVybiBwbGFpbnBhZ2VyCi0gICAgaWYgJ1BBR0VSJyBpbiBvcy5lbnZpcm9uOgorICAgIHVzZV9wYWdlciA9IG9zLmVudmlyb24uZ2V0KCdNQU5QQUdFUicpIG9yIG9zLmVudmlyb24uZ2V0KCdQQUdFUicpCisgICAgaWYgdXNlX3BhZ2VyOgogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzogIyBwaXBlcyBjb21wbGV0ZWx5IGJyb2tlbiBpbiBXaW5kb3dzCi0gICAgICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHRlbXBmaWxlcGFnZXIocGxhaW4odGV4dCksIG9zLmVudmlyb25bJ1BBR0VSJ10pCisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHRlbXBmaWxlcGFnZXIocGxhaW4odGV4dCksIHVzZV9wYWdlcikKICAgICAgICAgZWxpZiBvcy5lbnZpcm9uLmdldCgnVEVSTScpIGluICgnZHVtYicsICdlbWFjcycpOgotICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSB0ZXh0OiBwaXBlcGFnZXIocGxhaW4odGV4dCksIG9zLmVudmlyb25bJ1BBR0VSJ10pCisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHBpcGVwYWdlcihwbGFpbih0ZXh0KSwgdXNlX3BhZ2VyKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSB0ZXh0OiBwaXBlcGFnZXIodGV4dCwgb3MuZW52aXJvblsnUEFHRVInXSkKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogcGlwZXBhZ2VyKHRleHQsIHVzZV9wYWdlcikKICAgICBpZiBvcy5lbnZpcm9uLmdldCgnVEVSTScpIGluICgnZHVtYicsICdlbWFjcycpOgogICAgICAgICByZXR1cm4gcGxhaW5wYWdlcgogICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgpAQCAtMTkwMSwxMCArMTkxMywxMCBAQAogCiAgICAgZGVmIGludHJvKHNlbGYpOgogICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnJycKLVdlbGNvbWUgdG8gUHl0aG9uICVzJ3MgaGVscCB1dGlsaXR5IQorV2VsY29tZSB0byBQeXRob24gezB9J3MgaGVscCB1dGlsaXR5IQogCiBJZiB0aGlzIGlzIHlvdXIgZmlyc3QgdGltZSB1c2luZyBQeXRob24sIHlvdSBzaG91bGQgZGVmaW5pdGVseSBjaGVjayBvdXQKLXRoZSB0dXRvcmlhbCBvbiB0aGUgSW50ZXJuZXQgYXQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8lcy90dXRvcmlhbC8uCit0aGUgdHV0b3JpYWwgb24gdGhlIEludGVybmV0IGF0IGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvezB9L3R1dG9yaWFsLy4KIAogRW50ZXIgdGhlIG5hbWUgb2YgYW55IG1vZHVsZSwga2V5d29yZCwgb3IgdG9waWMgdG8gZ2V0IGhlbHAgb24gd3JpdGluZwogUHl0aG9uIHByb2dyYW1zIGFuZCB1c2luZyBQeXRob24gbW9kdWxlcy4gIFRvIHF1aXQgdGhpcyBoZWxwIHV0aWxpdHkgYW5kCkBAIC0xOTE0LDcgKzE5MjYsNyBAQAogIm1vZHVsZXMiLCAia2V5d29yZHMiLCAic3ltYm9scyIsIG9yICJ0b3BpY3MiLiAgRWFjaCBtb2R1bGUgYWxzbyBjb21lcwogd2l0aCBhIG9uZS1saW5lIHN1bW1hcnkgb2Ygd2hhdCBpdCBkb2VzOyB0byBsaXN0IHRoZSBtb2R1bGVzIHdob3NlIG5hbWUKIG9yIHN1bW1hcnkgY29udGFpbiBhIGdpdmVuIHN0cmluZyBzdWNoIGFzICJzcGFtIiwgdHlwZSAibW9kdWxlcyBzcGFtIi4KLScnJyAlIHR1cGxlKFtzeXMudmVyc2lvbls6M11dKjIpKQorJycnLmZvcm1hdCgnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0pKQogCiAgICAgZGVmIGxpc3Qoc2VsZiwgaXRlbXMsIGNvbHVtbnM9NCwgd2lkdGg9ODApOgogICAgICAgICBpdGVtcyA9IGxpc3Qoc29ydGVkKGl0ZW1zKSkKZGlmZiAtLWdpdCBhL0xpYi9weWRvY19kYXRhL3RvcGljcy5weSBiL0xpYi9weWRvY19kYXRhL3RvcGljcy5weQppbmRleCBkNmYxMzY2Li41OTBmNjEzIDEwMDY0NAotLS0gYS9MaWIvcHlkb2NfZGF0YS90b3BpY3MucHkKKysrIGIvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5CkBAIC0xLDc5ICsxLDEyODEwIEBACiAjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQotIyBBdXRvZ2VuZXJhdGVkIGJ5IFNwaGlueCBvbiBTYXQgSnVuIDI1IDE0OjA4OjQ0IDIwMTYKLXRvcGljcyA9IHsnYXNzZXJ0JzogdSdcblRoZSAiYXNzZXJ0IiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKipcblxuQXNzZXJ0IHN0YXRlbWVudHMgYXJlIGEgY29udmVuaWVudCB3YXkgdG8gaW5zZXJ0IGRlYnVnZ2luZyBhc3NlcnRpb25zXG5pbnRvIGEgcHJvZ3JhbTpcblxuICAgYXNzZXJ0X3N0bXQgOjo9ICJhc3NlcnQiIGV4cHJlc3Npb24gWyIsIiBleHByZXNzaW9uXVxuXG5UaGUgc2ltcGxlIGZvcm0sICJhc3NlcnQgZXhwcmVzc2lvbiIsIGlzIGVxdWl2YWxlbnQgdG9cblxuICAgaWYgX19kZWJ1Z19fOlxuICAgICAgIGlmIG5vdCBleHByZXNzaW9uOiByYWlzZSBBc3NlcnRpb25FcnJvclxuXG5UaGUgZXh0ZW5kZWQgZm9ybSwgImFzc2VydCBleHByZXNzaW9uMSwgZXhwcmVzc2lvbjIiLCBpcyBlcXVpdmFsZW50IHRvXG5cbiAgIGlmIF9fZGVidWdfXzpcbiAgICAgICBpZiBub3QgZXhwcmVzc2lvbjE6IHJhaXNlIEFzc2VydGlvbkVycm9yKGV4cHJlc3Npb24yKVxuXG5UaGVzZSBlcXVpdmFsZW5jZXMgYXNzdW1lIHRoYXQgIl9fZGVidWdfXyIgYW5kICJBc3NlcnRpb25FcnJvciIgcmVmZXJcbnRvIHRoZSBidWlsdC1pbiB2YXJpYWJsZXMgd2l0aCB0aG9zZSBuYW1lcy4gIEluIHRoZSBjdXJyZW50XG5pbXBsZW1lbnRhdGlvbiwgdGhlIGJ1aWx0LWluIHZhcmlhYmxlICJfX2RlYnVnX18iIGlzICJUcnVlIiB1bmRlclxubm9ybWFsIGNpcmN1bXN0YW5jZXMsICJGYWxzZSIgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkIChjb21tYW5kXG5saW5lIG9wdGlvbiAtTykuICBUaGUgY3VycmVudCBjb2RlIGdlbmVyYXRvciBlbWl0cyBubyBjb2RlIGZvciBhblxuYXNzZXJ0IHN0YXRlbWVudCB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgYXQgY29tcGlsZSB0aW1lLiAgTm90ZVxudGhhdCBpdCBpcyB1bm5lY2Vzc2FyeSB0byBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGV4cHJlc3Npb25cbnRoYXQgZmFpbGVkIGluIHRoZSBlcnJvciBtZXNzYWdlOyBpdCB3aWxsIGJlIGRpc3BsYXllZCBhcyBwYXJ0IG9mIHRoZVxuc3RhY2sgdHJhY2UuXG5cbkFzc2lnbm1lbnRzIHRvICJfX2RlYnVnX18iIGFyZSBpbGxlZ2FsLiAgVGhlIHZhbHVlIGZvciB0aGUgYnVpbHQtaW5cbnZhcmlhYmxlIGlzIGRldGVybWluZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgc3RhcnRzLlxuJywKLSAnYXNzaWdubWVudCc6IHUnXG5Bc3NpZ25tZW50IHN0YXRlbWVudHNcbioqKioqKioqKioqKioqKioqKioqKlxuXG5Bc3NpZ25tZW50IHN0YXRlbWVudHMgYXJlIHVzZWQgdG8gKHJlKWJpbmQgbmFtZXMgdG8gdmFsdWVzIGFuZCB0b1xubW9kaWZ5IGF0dHJpYnV0ZXMgb3IgaXRlbXMgb2YgbXV0YWJsZSBvYmplY3RzOlxuXG4gICBhc3NpZ25tZW50X3N0bXQgOjo9ICh0YXJnZXRfbGlzdCAiPSIpKyAoc3RhcnJlZF9leHByZXNzaW9uIHwgeWllbGRfZXhwcmVzc2lvbilcbiAgIHRhcmdldF9saXN0ICAgICA6Oj0gdGFyZ2V0ICgiLCIgdGFyZ2V0KSogWyIsIl1cbiAgIHRhcmdldCAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuICAgICAgICAgICAgICB8ICIoIiB0YXJnZXRfbGlzdCAiKSJcbiAgICAgICAgICAgICAgfCAiWyIgW3RhcmdldF9saXN0XSAiXSJcbiAgICAgICAgICAgICAgfCBhdHRyaWJ1dGVyZWZcbiAgICAgICAgICAgICAgfCBzdWJzY3JpcHRpb25cbiAgICAgICAgICAgICAgfCBzbGljaW5nXG4gICAgICAgICAgICAgIHwgIioiIHRhcmdldFxuXG4oU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yXG4qYXR0cmlidXRlcmVmKiwgKnN1YnNjcmlwdGlvbiosIGFuZCAqc2xpY2luZyouKVxuXG5BbiBhc3NpZ25tZW50IHN0YXRlbWVudCBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gbGlzdCAocmVtZW1iZXIgdGhhdFxudGhpcyBjYW4gYmUgYSBzaW5nbGUgZXhwcmVzc2lvbiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCB0aGUgbGF0dGVyXG55aWVsZGluZyBhIHR1cGxlKSBhbmQgYXNzaWducyB0aGUgc2luZ2xlIHJlc3VsdGluZyBvYmplY3QgdG8gZWFjaCBvZlxudGhlIHRhcmdldCBsaXN0cywgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuXG5Bc3NpZ25tZW50IGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgZGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIHRoZSB0YXJnZXRcbihsaXN0KS4gV2hlbiBhIHRhcmdldCBpcyBwYXJ0IG9mIGEgbXV0YWJsZSBvYmplY3QgKGFuIGF0dHJpYnV0ZVxucmVmZXJlbmNlLCBzdWJzY3JpcHRpb24gb3Igc2xpY2luZyksIHRoZSBtdXRhYmxlIG9iamVjdCBtdXN0XG51bHRpbWF0ZWx5IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQgYW5kIGRlY2lkZSBhYm91dCBpdHMgdmFsaWRpdHksIGFuZFxubWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYXNzaWdubWVudCBpcyB1bmFjY2VwdGFibGUuICBUaGUgcnVsZXNcbm9ic2VydmVkIGJ5IHZhcmlvdXMgdHlwZXMgYW5kIHRoZSBleGNlcHRpb25zIHJhaXNlZCBhcmUgZ2l2ZW4gd2l0aCB0aGVcbmRlZmluaXRpb24gb2YgdGhlIG9iamVjdCB0eXBlcyAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlXG5oaWVyYXJjaHkqKS5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSB0YXJnZXQgbGlzdCwgb3B0aW9uYWxseSBlbmNsb3NlZCBpblxucGFyZW50aGVzZXMgb3Igc3F1YXJlIGJyYWNrZXRzLCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzIGZvbGxvd3MuXG5cbiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGVtcHR5OiBUaGUgb2JqZWN0IG11c3QgYWxzbyBiZSBhbiBlbXB0eVxuICBpdGVyYWJsZS5cblxuKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBzaW5nbGUgdGFyZ2V0IGluIHBhcmVudGhlc2VzOiBUaGUgb2JqZWN0XG4gIGlzIGFzc2lnbmVkIHRvIHRoYXQgdGFyZ2V0LlxuXG4qIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRhcmdldHMsIG9yIGFcbiAgc2luZ2xlIHRhcmdldCBpbiBzcXVhcmUgYnJhY2tldHM6IFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpdGVyYWJsZVxuICB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0XG4gIGxpc3QsIGFuZCB0aGUgaXRlbXMgYXJlIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvIHRoZVxuICBjb3JyZXNwb25kaW5nIHRhcmdldHMuXG5cbiAgKiBJZiB0aGUgdGFyZ2V0IGxpc3QgY29udGFpbnMgb25lIHRhcmdldCBwcmVmaXhlZCB3aXRoIGFuXG4gICAgYXN0ZXJpc2ssIGNhbGxlZCBhICJzdGFycmVkIiB0YXJnZXQ6IFRoZSBvYmplY3QgbXVzdCBiZSBhblxuICAgIGl0ZXJhYmxlIHdpdGggYXQgbGVhc3QgYXMgbWFueSBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGVcbiAgICB0YXJnZXQgbGlzdCwgbWludXMgb25lLiAgVGhlIGZpcnN0IGl0ZW1zIG9mIHRoZSBpdGVyYWJsZSBhcmVcbiAgICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgdGFyZ2V0cyBiZWZvcmUgdGhlIHN0YXJyZWRcbiAgICB0YXJnZXQuICBUaGUgZmluYWwgaXRlbXMgb2YgdGhlIGl0ZXJhYmxlIGFyZSBhc3NpZ25lZCB0byB0aGVcbiAgICB0YXJnZXRzIGFmdGVyIHRoZSBzdGFycmVkIHRhcmdldC4gIEEgbGlzdCBvZiB0aGUgcmVtYWluaW5nIGl0ZW1zXG4gICAgaW4gdGhlIGl0ZXJhYmxlIGlzIHRoZW4gYXNzaWduZWQgdG8gdGhlIHN0YXJyZWQgdGFyZ2V0ICh0aGUgbGlzdFxuICAgIGNhbiBiZSBlbXB0eSkuXG5cbiAgKiBFbHNlOiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaXRlcmFibGUgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2ZcbiAgICBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGxpc3QsIGFuZCB0aGUgaXRlbXMgYXJlXG4gICAgYXNzaWduZWQsIGZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSBzaW5nbGUgdGFyZ2V0IGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXNcbmZvbGxvd3MuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhbiBpZGVudGlmaWVyIChuYW1lKTpcblxuICAqIElmIHRoZSBuYW1lIGRvZXMgbm90IG9jY3VyIGluIGEgImdsb2JhbCIgb3IgIm5vbmxvY2FsIiBzdGF0ZW1lbnRcbiAgICBpbiB0aGUgY3VycmVudCBjb2RlIGJsb2NrOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZVxuICAgIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlLlxuXG4gICogT3RoZXJ3aXNlOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBnbG9iYWxcbiAgICBuYW1lc3BhY2Ugb3IgdGhlIG91dGVyIG5hbWVzcGFjZSBkZXRlcm1pbmVkIGJ5ICJub25sb2NhbCIsXG4gICAgcmVzcGVjdGl2ZWx5LlxuXG4gIFRoZSBuYW1lIGlzIHJlYm91bmQgaWYgaXQgd2FzIGFscmVhZHkgYm91bmQuICBUaGlzIG1heSBjYXVzZSB0aGVcbiAgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgb2JqZWN0IHByZXZpb3VzbHkgYm91bmQgdG8gdGhlIG5hbWUgdG8gcmVhY2hcbiAgemVybywgY2F1c2luZyB0aGUgb2JqZWN0IHRvIGJlIGRlYWxsb2NhdGVkIGFuZCBpdHMgZGVzdHJ1Y3RvciAoaWYgaXRcbiAgaGFzIG9uZSkgdG8gYmUgY2FsbGVkLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYW4gYXR0cmlidXRlIHJlZmVyZW5jZTogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpblxuICB0aGUgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBhbiBvYmplY3Qgd2l0aFxuICBhc3NpZ25hYmxlIGF0dHJpYnV0ZXM7IGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCAiVHlwZUVycm9yIiBpc1xuICByYWlzZWQuICBUaGF0IG9iamVjdCBpcyB0aGVuIGFza2VkIHRvIGFzc2lnbiB0aGUgYXNzaWduZWQgb2JqZWN0IHRvXG4gIHRoZSBnaXZlbiBhdHRyaWJ1dGU7IGlmIGl0IGNhbm5vdCBwZXJmb3JtIHRoZSBhc3NpZ25tZW50LCBpdCByYWlzZXNcbiAgYW4gZXhjZXB0aW9uICh1c3VhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHkgIkF0dHJpYnV0ZUVycm9yIikuXG5cbiAgTm90ZTogSWYgdGhlIG9iamVjdCBpcyBhIGNsYXNzIGluc3RhbmNlIGFuZCB0aGUgYXR0cmlidXRlIHJlZmVyZW5jZVxuICBvY2N1cnMgb24gYm90aCBzaWRlcyBvZiB0aGUgYXNzaWdubWVudCBvcGVyYXRvciwgdGhlIFJIUyBleHByZXNzaW9uLFxuICAiYS54IiBjYW4gYWNjZXNzIGVpdGhlciBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgb3IgKGlmIG5vIGluc3RhbmNlXG4gIGF0dHJpYnV0ZSBleGlzdHMpIGEgY2xhc3MgYXR0cmlidXRlLiAgVGhlIExIUyB0YXJnZXQgImEueCIgaXMgYWx3YXlzXG4gIHNldCBhcyBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4gIFRodXMsIHRoZVxuICB0d28gb2NjdXJyZW5jZXMgb2YgImEueCIgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmVyIHRvIHRoZSBzYW1lXG4gIGF0dHJpYnV0ZTogaWYgdGhlIFJIUyBleHByZXNzaW9uIHJlZmVycyB0byBhIGNsYXNzIGF0dHJpYnV0ZSwgdGhlXG4gIExIUyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIGF0dHJpYnV0ZSBhcyB0aGUgdGFyZ2V0IG9mIHRoZVxuICBhc3NpZ25tZW50OlxuXG4gICAgIGNsYXNzIENsczpcbiAgICAgICAgIHggPSAzICAgICAgICAgICAgICMgY2xhc3MgdmFyaWFibGVcbiAgICAgaW5zdCA9IENscygpXG4gICAgIGluc3QueCA9IGluc3QueCArIDEgICAjIHdyaXRlcyBpbnN0LnggYXMgNCBsZWF2aW5nIENscy54IGFzIDNcblxuICBUaGlzIGRlc2NyaXB0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGFwcGx5IHRvIGRlc2NyaXB0b3JcbiAgYXR0cmlidXRlcywgc3VjaCBhcyBwcm9wZXJ0aWVzIGNyZWF0ZWQgd2l0aCAicHJvcGVydHkoKSIuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhIHN1YnNjcmlwdGlvbjogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGVcbiAgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBlaXRoZXIgYSBtdXRhYmxlIHNlcXVlbmNlXG4gIG9iamVjdCAoc3VjaCBhcyBhIGxpc3QpIG9yIGEgbWFwcGluZyBvYmplY3QgKHN1Y2ggYXMgYSBkaWN0aW9uYXJ5KS5cbiAgTmV4dCwgdGhlIHN1YnNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZC5cblxuICBJZiB0aGUgcHJpbWFyeSBpcyBhIG11dGFibGUgc2VxdWVuY2Ugb2JqZWN0IChzdWNoIGFzIGEgbGlzdCksIHRoZVxuICBzdWJzY3JpcHQgbXVzdCB5aWVsZCBhbiBpbnRlZ2VyLiAgSWYgaXQgaXMgbmVnYXRpdmUsIHRoZSBzZXF1ZW5jZVwnc1xuICBsZW5ndGggaXMgYWRkZWQgdG8gaXQuICBUaGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYSBub25uZWdhdGl2ZVxuICBpbnRlZ2VyIGxlc3MgdGhhbiB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoLCBhbmQgdGhlIHNlcXVlbmNlIGlzIGFza2VkXG4gIHRvIGFzc2lnbiB0aGUgYXNzaWduZWQgb2JqZWN0IHRvIGl0cyBpdGVtIHdpdGggdGhhdCBpbmRleC4gIElmIHRoZVxuICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsICJJbmRleEVycm9yIiBpcyByYWlzZWQgKGFzc2lnbm1lbnQgdG8gYVxuICBzdWJzY3JpcHRlZCBzZXF1ZW5jZSBjYW5ub3QgYWRkIG5ldyBpdGVtcyB0byBhIGxpc3QpLlxuXG4gIElmIHRoZSBwcmltYXJ5IGlzIGEgbWFwcGluZyBvYmplY3QgKHN1Y2ggYXMgYSBkaWN0aW9uYXJ5KSwgdGhlXG4gIHN1YnNjcmlwdCBtdXN0IGhhdmUgYSB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgbWFwcGluZ1wncyBrZXkgdHlwZSxcbiAgYW5kIHRoZSBtYXBwaW5nIGlzIHRoZW4gYXNrZWQgdG8gY3JlYXRlIGEga2V5L2RhdHVtIHBhaXIgd2hpY2ggbWFwc1xuICB0aGUgc3Vic2NyaXB0IHRvIHRoZSBhc3NpZ25lZCBvYmplY3QuICBUaGlzIGNhbiBlaXRoZXIgcmVwbGFjZSBhblxuICBleGlzdGluZyBrZXkvdmFsdWUgcGFpciB3aXRoIHRoZSBzYW1lIGtleSB2YWx1ZSwgb3IgaW5zZXJ0IGEgbmV3XG4gIGtleS92YWx1ZSBwYWlyIChpZiBubyBrZXkgd2l0aCB0aGUgc2FtZSB2YWx1ZSBleGlzdGVkKS5cblxuICBGb3IgdXNlci1kZWZpbmVkIG9iamVjdHMsIHRoZSAiX19zZXRpdGVtX18oKSIgbWV0aG9kIGlzIGNhbGxlZCB3aXRoXG4gIGFwcHJvcHJpYXRlIGFyZ3VtZW50cy5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc2xpY2luZzogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGVcbiAgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBhIG11dGFibGUgc2VxdWVuY2Ugb2JqZWN0XG4gIChzdWNoIGFzIGEgbGlzdCkuICBUaGUgYXNzaWduZWQgb2JqZWN0IHNob3VsZCBiZSBhIHNlcXVlbmNlIG9iamVjdFxuICBvZiB0aGUgc2FtZSB0eXBlLiAgTmV4dCwgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBleHByZXNzaW9ucyBhcmVcbiAgZXZhbHVhdGVkLCBpbnNvZmFyIHRoZXkgYXJlIHByZXNlbnQ7IGRlZmF1bHRzIGFyZSB6ZXJvIGFuZCB0aGVcbiAgc2VxdWVuY2VcJ3MgbGVuZ3RoLiAgVGhlIGJvdW5kcyBzaG91bGQgZXZhbHVhdGUgdG8gaW50ZWdlcnMuIElmXG4gIGVpdGhlciBib3VuZCBpcyBuZWdhdGl2ZSwgdGhlIHNlcXVlbmNlXCdzIGxlbmd0aCBpcyBhZGRlZCB0byBpdC4gIFRoZVxuICByZXN1bHRpbmcgYm91bmRzIGFyZSBjbGlwcGVkIHRvIGxpZSBiZXR3ZWVuIHplcm8gYW5kIHRoZSBzZXF1ZW5jZVwnc1xuICBsZW5ndGgsIGluY2x1c2l2ZS4gIEZpbmFsbHksIHRoZSBzZXF1ZW5jZSBvYmplY3QgaXMgYXNrZWQgdG8gcmVwbGFjZVxuICB0aGUgc2xpY2Ugd2l0aCB0aGUgaXRlbXMgb2YgdGhlIGFzc2lnbmVkIHNlcXVlbmNlLiAgVGhlIGxlbmd0aCBvZlxuICB0aGUgc2xpY2UgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBsZW5ndGggb2YgdGhlIGFzc2lnbmVkIHNlcXVlbmNlLFxuICB0aHVzIGNoYW5naW5nIHRoZSBsZW5ndGggb2YgdGhlIHRhcmdldCBzZXF1ZW5jZSwgaWYgdGhlIHRhcmdldFxuICBzZXF1ZW5jZSBhbGxvd3MgaXQuXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZVxuc3ludGF4IGZvciB0YXJnZXRzIGlzIHRha2VuIHRvIGJlIHRoZSBzYW1lIGFzIGZvciBleHByZXNzaW9ucywgYW5kXG5pbnZhbGlkIHN5bnRheCBpcyByZWplY3RlZCBkdXJpbmcgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwaGFzZSwgY2F1c2luZ1xubGVzcyBkZXRhaWxlZCBlcnJvciBtZXNzYWdlcy5cblxuQWx0aG91Z2ggdGhlIGRlZmluaXRpb24gb2YgYXNzaWdubWVudCBpbXBsaWVzIHRoYXQgb3ZlcmxhcHMgYmV0d2VlblxudGhlIGxlZnQtaGFuZCBzaWRlIGFuZCB0aGUgcmlnaHQtaGFuZCBzaWRlIGFyZSBcJ3NpbXVsdGFuZW91c1wnIChmb3JcbmV4YW1wbGUgImEsIGIgPSBiLCBhIiBzd2FwcyB0d28gdmFyaWFibGVzKSwgb3ZlcmxhcHMgKndpdGhpbiogdGhlXG5jb2xsZWN0aW9uIG9mIGFzc2lnbmVkLXRvIHZhcmlhYmxlcyBvY2N1ciBsZWZ0LXRvLXJpZ2h0LCBzb21ldGltZXNcbnJlc3VsdGluZyBpbiBjb25mdXNpb24uICBGb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBwcmludHNcbiJbMCwgMl0iOlxuXG4gICB4ID0gWzAsIDFdXG4gICBpID0gMFxuICAgaSwgeFtpXSA9IDEsIDIgICAgICAgICAjIGkgaXMgdXBkYXRlZCwgdGhlbiB4W2ldIGlzIHVwZGF0ZWRcbiAgIHByaW50KHgpXG5cblNlZSBhbHNvOiAqKlBFUCAzMTMyKiogLSBFeHRlbmRlZCBJdGVyYWJsZSBVbnBhY2tpbmdcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlICIqdGFyZ2V0IiBmZWF0dXJlLlxuXG5cbkF1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsIG9mIGFcbmJpbmFyeSBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OlxuXG4gICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pXG4gICBhdWd0YXJnZXQgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIHwgYXR0cmlidXRlcmVmIHwgc3Vic2NyaXB0aW9uIHwgc2xpY2luZ1xuICAgYXVnb3AgICAgICAgICAgICAgICAgICAgICA6Oj0gIis9IiB8ICItPSIgfCAiKj0iIHwgIkA9IiB8ICIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuXG4oU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgb2YgdGhlIGxhc3QgdGhyZWVcbnN5bWJvbHMuKVxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBldmFsdWF0ZXMgdGhlIHRhcmdldCAod2hpY2gsIHVubGlrZSBub3JtYWxcbmFzc2lnbm1lbnQgc3RhdGVtZW50cywgY2Fubm90IGJlIGFuIHVucGFja2luZykgYW5kIHRoZSBleHByZXNzaW9uXG5saXN0LCBwZXJmb3JtcyB0aGUgYmluYXJ5IG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBhc3NpZ25tZW50XG5vbiB0aGUgdHdvIG9wZXJhbmRzLCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBvcmlnaW5hbCB0YXJnZXQuXG5UaGUgdGFyZ2V0IGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuXG5cbkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV4cHJlc3Npb24gbGlrZSAieCArPSAxIiBjYW4gYmUgcmV3cml0dGVuIGFzXG4ieCA9IHggKyAxIiB0byBhY2hpZXZlIGEgc2ltaWxhciwgYnV0IG5vdCBleGFjdGx5IGVxdWFsIGVmZmVjdC4gSW4gdGhlXG5hdWdtZW50ZWQgdmVyc2lvbiwgIngiIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIEFsc28sIHdoZW4gcG9zc2libGUsXG50aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgKmluLXBsYWNlKiwgbWVhbmluZyB0aGF0IHJhdGhlciB0aGFuXG5jcmVhdGluZyBhIG5ldyBvYmplY3QgYW5kIGFzc2lnbmluZyB0aGF0IHRvIHRoZSB0YXJnZXQsIHRoZSBvbGQgb2JqZWN0XG5pcyBtb2RpZmllZCBpbnN0ZWFkLlxuXG5Vbmxpa2Ugbm9ybWFsIGFzc2lnbm1lbnRzLCBhdWdtZW50ZWQgYXNzaWdubWVudHMgZXZhbHVhdGUgdGhlIGxlZnQtXG5oYW5kIHNpZGUgKmJlZm9yZSogZXZhbHVhdGluZyB0aGUgcmlnaHQtaGFuZCBzaWRlLiAgRm9yIGV4YW1wbGUsICJhW2ldXG4rPSBmKHgpIiBmaXJzdCBsb29rcy11cCAiYVtpXSIsIHRoZW4gaXQgZXZhbHVhdGVzICJmKHgpIiBhbmQgcGVyZm9ybXNcbnRoZSBhZGRpdGlvbiwgYW5kIGxhc3RseSwgaXQgd3JpdGVzIHRoZSByZXN1bHQgYmFjayB0byAiYVtpXSIuXG5cbldpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzIGluIGFcbnNpbmdsZSBzdGF0ZW1lbnQsIHRoZSBhc3NpZ25tZW50IGRvbmUgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnRcbnN0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiBTaW1pbGFybHksXG53aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSBiaW5hcnlcbm9wZXJhdGlvbiBwZXJmb3JtZWQgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbFxuYmluYXJ5IG9wZXJhdGlvbnMuXG5cbkZvciB0YXJnZXRzIHdoaWNoIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgdGhlIHNhbWUgKmNhdmVhdCBhYm91dFxuY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMqIGFwcGxpZXMgYXMgZm9yIHJlZ3VsYXIgYXNzaWdubWVudHMuXG4nLAotICdhdG9tLWlkZW50aWZpZXJzJzogdSdcbklkZW50aWZpZXJzIChOYW1lcylcbioqKioqKioqKioqKioqKioqKipcblxuQW4gaWRlbnRpZmllciBvY2N1cnJpbmcgYXMgYW4gYXRvbSBpcyBhIG5hbWUuICBTZWUgc2VjdGlvblxuKklkZW50aWZpZXJzIGFuZCBrZXl3b3JkcyogZm9yIGxleGljYWwgZGVmaW5pdGlvbiBhbmQgc2VjdGlvbiAqTmFtaW5nXG5hbmQgYmluZGluZyogZm9yIGRvY3VtZW50YXRpb24gb2YgbmFtaW5nIGFuZCBiaW5kaW5nLlxuXG5XaGVuIHRoZSBuYW1lIGlzIGJvdW5kIHRvIGFuIG9iamVjdCwgZXZhbHVhdGlvbiBvZiB0aGUgYXRvbSB5aWVsZHNcbnRoYXQgb2JqZWN0LiBXaGVuIGEgbmFtZSBpcyBub3QgYm91bmQsIGFuIGF0dGVtcHQgdG8gZXZhbHVhdGUgaXRcbnJhaXNlcyBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbi5cblxuKipQcml2YXRlIG5hbWUgbWFuZ2xpbmc6KiogV2hlbiBhbiBpZGVudGlmaWVyIHRoYXQgdGV4dHVhbGx5IG9jY3VycyBpblxuYSBjbGFzcyBkZWZpbml0aW9uIGJlZ2lucyB3aXRoIHR3byBvciBtb3JlIHVuZGVyc2NvcmUgY2hhcmFjdGVycyBhbmRcbmRvZXMgbm90IGVuZCBpbiB0d28gb3IgbW9yZSB1bmRlcnNjb3JlcywgaXQgaXMgY29uc2lkZXJlZCBhICpwcml2YXRlXG5uYW1lKiBvZiB0aGF0IGNsYXNzLiBQcml2YXRlIG5hbWVzIGFyZSB0cmFuc2Zvcm1lZCB0byBhIGxvbmdlciBmb3JtXG5iZWZvcmUgY29kZSBpcyBnZW5lcmF0ZWQgZm9yIHRoZW0uICBUaGUgdHJhbnNmb3JtYXRpb24gaW5zZXJ0cyB0aGVcbmNsYXNzIG5hbWUsIHdpdGggbGVhZGluZyB1bmRlcnNjb3JlcyByZW1vdmVkIGFuZCBhIHNpbmdsZSB1bmRlcnNjb3JlXG5pbnNlcnRlZCwgaW4gZnJvbnQgb2YgdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwgdGhlIGlkZW50aWZpZXIgIl9fc3BhbSJcbm9jY3VycmluZyBpbiBhIGNsYXNzIG5hbWVkICJIYW0iIHdpbGwgYmUgdHJhbnNmb3JtZWQgdG8gIl9IYW1fX3NwYW0iLlxuVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc3ludGFjdGljYWwgY29udGV4dCBpbiB3aGljaFxudGhlIGlkZW50aWZpZXIgaXMgdXNlZC4gIElmIHRoZSB0cmFuc2Zvcm1lZCBuYW1lIGlzIGV4dHJlbWVseSBsb25nXG4obG9uZ2VyIHRoYW4gMjU1IGNoYXJhY3RlcnMpLCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHRydW5jYXRpb24gbWF5XG5oYXBwZW4uIElmIHRoZSBjbGFzcyBuYW1lIGNvbnNpc3RzIG9ubHkgb2YgdW5kZXJzY29yZXMsIG5vXG50cmFuc2Zvcm1hdGlvbiBpcyBkb25lLlxuJywKLSAnYXRvbS1saXRlcmFscyc6IHUiXG5MaXRlcmFsc1xuKioqKioqKipcblxuUHl0aG9uIHN1cHBvcnRzIHN0cmluZyBhbmQgYnl0ZXMgbGl0ZXJhbHMgYW5kIHZhcmlvdXMgbnVtZXJpY1xubGl0ZXJhbHM6XG5cbiAgIGxpdGVyYWwgOjo9IHN0cmluZ2xpdGVyYWwgfCBieXRlc2xpdGVyYWxcbiAgICAgICAgICAgICAgIHwgaW50ZWdlciB8IGZsb2F0bnVtYmVyIHwgaW1hZ251bWJlclxuXG5FdmFsdWF0aW9uIG9mIGEgbGl0ZXJhbCB5aWVsZHMgYW4gb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlIChzdHJpbmcsXG5ieXRlcywgaW50ZWdlciwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBjb21wbGV4IG51bWJlcikgd2l0aCB0aGUgZ2l2ZW5cbnZhbHVlLiAgVGhlIHZhbHVlIG1heSBiZSBhcHByb3hpbWF0ZWQgaW4gdGhlIGNhc2Ugb2YgZmxvYXRpbmcgcG9pbnRcbmFuZCBpbWFnaW5hcnkgKGNvbXBsZXgpIGxpdGVyYWxzLiAgU2VlIHNlY3Rpb24gKkxpdGVyYWxzKiBmb3IgZGV0YWlscy5cblxuQWxsIGxpdGVyYWxzIGNvcnJlc3BvbmQgdG8gaW1tdXRhYmxlIGRhdGEgdHlwZXMsIGFuZCBoZW5jZSB0aGVcbm9iamVjdCdzIGlkZW50aXR5IGlzIGxlc3MgaW1wb3J0YW50IHRoYW4gaXRzIHZhbHVlLiAgTXVsdGlwbGVcbmV2YWx1YXRpb25zIG9mIGxpdGVyYWxzIHdpdGggdGhlIHNhbWUgdmFsdWUgKGVpdGhlciB0aGUgc2FtZVxub2NjdXJyZW5jZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IG9yIGEgZGlmZmVyZW50IG9jY3VycmVuY2UpIG1heSBvYnRhaW5cbnRoZSBzYW1lIG9iamVjdCBvciBhIGRpZmZlcmVudCBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZS5cbiIsCi0gJ2F0dHJpYnV0ZS1hY2Nlc3MnOiB1J1xuQ3VzdG9taXppbmcgYXR0cmlidXRlIGFjY2Vzc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gY3VzdG9taXplIHRoZSBtZWFuaW5nIG9mXG5hdHRyaWJ1dGUgYWNjZXNzICh1c2Ugb2YsIGFzc2lnbm1lbnQgdG8sIG9yIGRlbGV0aW9uIG9mICJ4Lm5hbWUiKSBmb3JcbmNsYXNzIGluc3RhbmNlcy5cblxub2JqZWN0Ll9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBsb29rdXAgaGFzIG5vdCBmb3VuZCB0aGUgYXR0cmlidXRlIGluIHRoZVxuICAgdXN1YWwgcGxhY2VzIChpLmUuIGl0IGlzIG5vdCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgbm9yIGlzIGl0IGZvdW5kXG4gICBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgInNlbGYiKS4gICJuYW1lIiBpcyB0aGUgYXR0cmlidXRlIG5hbWUuIFRoaXNcbiAgIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhblxuICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uXG5cbiAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc20sXG4gICAiX19nZXRhdHRyX18oKSIgaXMgbm90IGNhbGxlZC4gIChUaGlzIGlzIGFuIGludGVudGlvbmFsIGFzeW1tZXRyeVxuICAgYmV0d2VlbiAiX19nZXRhdHRyX18oKSIgYW5kICJfX3NldGF0dHJfXygpIi4pIFRoaXMgaXMgZG9uZSBib3RoIGZvclxuICAgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSAiX19nZXRhdHRyX18oKSIgd291bGQgaGF2ZVxuICAgbm8gd2F5IHRvIGFjY2VzcyBvdGhlciBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZS4gIE5vdGUgdGhhdCBhdFxuICAgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiBmYWtlIHRvdGFsIGNvbnRyb2wgYnkgbm90XG4gICBpbnNlcnRpbmcgYW55IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIGRpY3Rpb25hcnkgKGJ1dFxuICAgaW5zdGVhZCBpbnNlcnRpbmcgdGhlbSBpbiBhbm90aGVyIG9iamVjdCkuICBTZWUgdGhlXG4gICAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgYmVsb3cgZm9yIGEgd2F5IHRvIGFjdHVhbGx5IGdldCB0b3RhbFxuICAgY29udHJvbCBvdmVyIGF0dHJpYnV0ZSBhY2Nlc3MuXG5cbm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB1bmNvbmRpdGlvbmFsbHkgdG8gaW1wbGVtZW50IGF0dHJpYnV0ZSBhY2Nlc3NlcyBmb3JcbiAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXMgIl9fZ2V0YXR0cl9fKCkiLFxuICAgdGhlIGxhdHRlciB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzICJfX2dldGF0dHJpYnV0ZV9fKCkiIGVpdGhlclxuICAgY2FsbHMgaXQgZXhwbGljaXRseSBvciByYWlzZXMgYW4gIkF0dHJpYnV0ZUVycm9yIi4gVGhpcyBtZXRob2RcbiAgIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4gICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi4gSW4gb3JkZXIgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGluXG4gICB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgYmFzZSBjbGFzc1xuICAgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB0byBhY2Nlc3MgYW55IGF0dHJpYnV0ZXMgaXQgbmVlZHMsIGZvclxuICAgZXhhbXBsZSwgIm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpIi5cblxuICAgTm90ZTogVGhpcyBtZXRob2QgbWF5IHN0aWxsIGJlIGJ5cGFzc2VkIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsXG4gICAgIG1ldGhvZHMgYXMgdGhlIHJlc3VsdCBvZiBpbXBsaWNpdCBpbnZvY2F0aW9uIHZpYSBsYW5ndWFnZSBzeW50YXhcbiAgICAgb3IgYnVpbHQtaW4gZnVuY3Rpb25zLiBTZWUgKlNwZWNpYWwgbWV0aG9kIGxvb2t1cCouXG5cbm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgVGhpcyBpcyBjYWxsZWRcbiAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZWNoYW5pc20gKGkuZS4gc3RvcmUgdGhlIHZhbHVlIGluIHRoZVxuICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICpuYW1lKiBpcyB0aGUgYXR0cmlidXRlIG5hbWUsICp2YWx1ZSogaXMgdGhlXG4gICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC5cblxuICAgSWYgIl9fc2V0YXR0cl9fKCkiIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGl0XG4gICBzaG91bGQgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgZXhhbXBsZSxcbiAgICJvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpIi5cblxub2JqZWN0Ll9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIExpa2UgIl9fc2V0YXR0cl9fKCkiIGJ1dCBmb3IgYXR0cmlidXRlIGRlbGV0aW9uIGluc3RlYWQgb2ZcbiAgIGFzc2lnbm1lbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmICJkZWwgb2JqLm5hbWUiIGlzXG4gICBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LlxuXG5vYmplY3QuX19kaXJfXyhzZWxmKVxuXG4gICBDYWxsZWQgd2hlbiAiZGlyKCkiIGlzIGNhbGxlZCBvbiB0aGUgb2JqZWN0LiBBIHNlcXVlbmNlIG11c3QgYmVcbiAgIHJldHVybmVkLiAiZGlyKCkiIGNvbnZlcnRzIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSB0byBhIGxpc3QgYW5kXG4gICBzb3J0cyBpdC5cblxuXG5JbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnNcbj09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzc1xuY29udGFpbmluZyB0aGUgbWV0aG9kIChhIHNvLWNhbGxlZCAqZGVzY3JpcHRvciogY2xhc3MpIGFwcGVhcnMgaW4gYW5cbipvd25lciogY2xhc3MgKHRoZSBkZXNjcmlwdG9yIG11c3QgYmUgaW4gZWl0aGVyIHRoZSBvd25lclwncyBjbGFzc1xuZGljdGlvbmFyeSBvciBpbiB0aGUgY2xhc3MgZGljdGlvbmFyeSBmb3Igb25lIG9mIGl0cyBwYXJlbnRzKS4gIEluIHRoZVxuZXhhbXBsZXMgYmVsb3csICJ0aGUgYXR0cmlidXRlIiByZWZlcnMgdG8gdGhlIGF0dHJpYnV0ZSB3aG9zZSBuYW1lIGlzXG50aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgb3duZXIgY2xhc3NcJyAiX19kaWN0X18iLlxuXG5vYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXIpXG5cbiAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZVxuICAgYWNjZXNzKSBvciBvZiBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIChpbnN0YW5jZSBhdHRyaWJ1dGVcbiAgIGFjY2VzcykuICpvd25lciogaXMgYWx3YXlzIHRoZSBvd25lciBjbGFzcywgd2hpbGUgKmluc3RhbmNlKiBpcyB0aGVcbiAgIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwgb3IgIk5vbmUiIHdoZW5cbiAgIHRoZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgKm93bmVyKi4gIFRoaXMgbWV0aG9kIHNob3VsZFxuICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbiAiQXR0cmlidXRlRXJyb3IiXG4gICBleGNlcHRpb24uXG5cbm9iamVjdC5fX3NldF9fKHNlbGYsIGluc3RhbmNlLCB2YWx1ZSlcblxuICAgQ2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlIG93bmVyXG4gICBjbGFzcyB0byBhIG5ldyB2YWx1ZSwgKnZhbHVlKi5cblxub2JqZWN0Ll9fZGVsZXRlX18oc2VsZiwgaW5zdGFuY2UpXG5cbiAgIENhbGxlZCB0byBkZWxldGUgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZVxuICAgb3duZXIgY2xhc3MuXG5cblRoZSBhdHRyaWJ1dGUgIl9fb2JqY2xhc3NfXyIgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlICJpbnNwZWN0IiBtb2R1bGUgYXNcbnNwZWNpZnlpbmcgdGhlIGNsYXNzIHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBkZWZpbmVkIChzZXR0aW5nIHRoaXNcbmFwcHJvcHJpYXRlbHkgY2FuIGFzc2lzdCBpbiBydW50aW1lIGludHJvc3BlY3Rpb24gb2YgZHluYW1pYyBjbGFzc1xuYXR0cmlidXRlcykuIEZvciBjYWxsYWJsZXMsIGl0IG1heSBpbmRpY2F0ZSB0aGF0IGFuIGluc3RhbmNlIG9mIHRoZVxuZ2l2ZW4gdHlwZSAob3IgYSBzdWJjbGFzcykgaXMgZXhwZWN0ZWQgb3IgcmVxdWlyZWQgYXMgdGhlIGZpcnN0XG5wb3NpdGlvbmFsIGFyZ3VtZW50IChmb3IgZXhhbXBsZSwgQ1B5dGhvbiBzZXRzIHRoaXMgYXR0cmlidXRlIGZvclxudW5ib3VuZCBtZXRob2RzIHRoYXQgYXJlIGltcGxlbWVudGVkIGluIEMpLlxuXG5cbkludm9raW5nIERlc2NyaXB0b3JzXG49PT09PT09PT09PT09PT09PT09PVxuXG5JbiBnZW5lcmFsLCBhIGRlc2NyaXB0b3IgaXMgYW4gb2JqZWN0IGF0dHJpYnV0ZSB3aXRoICJiaW5kaW5nXG5iZWhhdmlvciIsIG9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuIG92ZXJyaWRkZW4gYnkgbWV0aG9kc1xuaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIsIGFuZFxuIl9fZGVsZXRlX18oKSIuIElmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciBhbiBvYmplY3QsIGl0XG5pcyBzYWlkIHRvIGJlIGEgZGVzY3JpcHRvci5cblxuVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCBzZXQsIG9yIGRlbGV0ZVxudGhlIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdFwncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsICJhLngiIGhhcyBhXG5sb29rdXAgY2hhaW4gc3RhcnRpbmcgd2l0aCAiYS5fX2RpY3RfX1tcJ3hcJ10iLCB0aGVuXG4idHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10iLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgb2ZcbiJ0eXBlKGEpIiBleGNsdWRpbmcgbWV0YWNsYXNzZXMuXG5cbkhvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nIG9uZSBvZiB0aGVcbmRlc2NyaXB0b3IgbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZFxuaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gdGhlXG5wcmVjZWRlbmNlIGNoYWluIGRlcGVuZHMgb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIHdlcmUgZGVmaW5lZCBhbmRcbmhvdyB0aGV5IHdlcmUgY2FsbGVkLlxuXG5UaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhIGJpbmRpbmcsICJhLngiLiBIb3dcbnRoZSBhcmd1bWVudHMgYXJlIGFzc2VtYmxlZCBkZXBlbmRzIG9uICJhIjpcblxuRGlyZWN0IENhbGxcbiAgIFRoZSBzaW1wbGVzdCBhbmQgbGVhc3QgY29tbW9uIGNhbGwgaXMgd2hlbiB1c2VyIGNvZGUgZGlyZWN0bHlcbiAgIGludm9rZXMgYSBkZXNjcmlwdG9yIG1ldGhvZDogICAgInguX19nZXRfXyhhKSIuXG5cbkluc3RhbmNlIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYW4gb2JqZWN0IGluc3RhbmNlLCAiYS54IiBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZVxuICAgY2FsbDogInR5cGUoYSkuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oYSwgdHlwZShhKSkiLlxuXG5DbGFzcyBCaW5kaW5nXG4gICBJZiBiaW5kaW5nIHRvIGEgY2xhc3MsICJBLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGNhbGw6XG4gICAiQS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhOb25lLCBBKSIuXG5cblN1cGVyIEJpbmRpbmdcbiAgIElmICJhIiBpcyBhbiBpbnN0YW5jZSBvZiAic3VwZXIiLCB0aGVuIHRoZSBiaW5kaW5nICJzdXBlcihCLFxuICAgb2JqKS5tKCkiIHNlYXJjaGVzICJvYmouX19jbGFzc19fLl9fbXJvX18iIGZvciB0aGUgYmFzZSBjbGFzcyAiQSJcbiAgIGltbWVkaWF0ZWx5IHByZWNlZGluZyAiQiIgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZVxuICAgY2FsbDogIkEuX19kaWN0X19bXCdtXCddLl9fZ2V0X18ob2JqLCBvYmouX19jbGFzc19fKSIuXG5cbkZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGRlcGVuZHNcbm9uIHRoZSB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgYXJlIGRlZmluZWQuICBBIGRlc2NyaXB0b3IgY2FuIGRlZmluZVxuYW55IGNvbWJpbmF0aW9uIG9mICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiBhbmQgIl9fZGVsZXRlX18oKSIuICBJZiBpdFxuZG9lcyBub3QgZGVmaW5lICJfX2dldF9fKCkiLCB0aGVuIGFjY2Vzc2luZyB0aGUgYXR0cmlidXRlIHdpbGwgcmV0dXJuXG50aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZSBvYmplY3RcJ3Ncbmluc3RhbmNlIGRpY3Rpb25hcnkuICBJZiB0aGUgZGVzY3JpcHRvciBkZWZpbmVzICJfX3NldF9fKCkiIGFuZC9vclxuIl9fZGVsZXRlX18oKSIsIGl0IGlzIGEgZGF0YSBkZXNjcmlwdG9yOyBpZiBpdCBkZWZpbmVzIG5laXRoZXIsIGl0IGlzXG5hIG5vbi1kYXRhIGRlc2NyaXB0b3IuICBOb3JtYWxseSwgZGF0YSBkZXNjcmlwdG9ycyBkZWZpbmUgYm90aFxuIl9fZ2V0X18oKSIgYW5kICJfX3NldF9fKCkiLCB3aGlsZSBub24tZGF0YSBkZXNjcmlwdG9ycyBoYXZlIGp1c3QgdGhlXG4iX19nZXRfXygpIiBtZXRob2QuICBEYXRhIGRlc2NyaXB0b3JzIHdpdGggIl9fc2V0X18oKSIgYW5kICJfX2dldF9fKCkiXG5kZWZpbmVkIGFsd2F5cyBvdmVycmlkZSBhIHJlZGVmaW5pdGlvbiBpbiBhbiBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSW5cbmNvbnRyYXN0LCBub24tZGF0YSBkZXNjcmlwdG9ycyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBpbnN0YW5jZXMuXG5cblB5dGhvbiBtZXRob2RzIChpbmNsdWRpbmcgInN0YXRpY21ldGhvZCgpIiBhbmQgImNsYXNzbWV0aG9kKCkiKSBhcmVcbmltcGxlbWVudGVkIGFzIG5vbi1kYXRhIGRlc2NyaXB0b3JzLiAgQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5cbnJlZGVmaW5lIGFuZCBvdmVycmlkZSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgaW5kaXZpZHVhbCBpbnN0YW5jZXMgdG9cbmFjcXVpcmUgYmVoYXZpb3JzIHRoYXQgZGlmZmVyIGZyb20gb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGNsYXNzLlxuXG5UaGUgInByb3BlcnR5KCkiIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGFzIGEgZGF0YSBkZXNjcmlwdG9yLlxuQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgcHJvcGVydHkuXG5cblxuX19zbG90c19fXG49PT09PT09PT1cblxuQnkgZGVmYXVsdCwgaW5zdGFuY2VzIG9mIGNsYXNzZXMgaGF2ZSBhIGRpY3Rpb25hcnkgZm9yIGF0dHJpYnV0ZVxuc3RvcmFnZS4gIFRoaXMgd2FzdGVzIHNwYWNlIGZvciBvYmplY3RzIGhhdmluZyB2ZXJ5IGZldyBpbnN0YW5jZVxudmFyaWFibGVzLiAgVGhlIHNwYWNlIGNvbnN1bXB0aW9uIGNhbiBiZWNvbWUgYWN1dGUgd2hlbiBjcmVhdGluZyBsYXJnZVxubnVtYmVycyBvZiBpbnN0YW5jZXMuXG5cblRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nICpfX3Nsb3RzX18qIGluIGEgY2xhc3NcbmRlZmluaXRpb24uIFRoZSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiB0YWtlcyBhIHNlcXVlbmNlIG9mIGluc3RhbmNlXG52YXJpYWJsZXMgYW5kIHJlc2VydmVzIGp1c3QgZW5vdWdoIHNwYWNlIGluIGVhY2ggaW5zdGFuY2UgdG8gaG9sZCBhXG52YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gIFNwYWNlIGlzIHNhdmVkIGJlY2F1c2UgKl9fZGljdF9fKiBpcyBub3RcbmNyZWF0ZWQgZm9yIGVhY2ggaW5zdGFuY2UuXG5cbm9iamVjdC5fX3Nsb3RzX19cblxuICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCBvciBzZXF1ZW5jZVxuICAgb2Ygc3RyaW5ncyB3aXRoIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgaW5zdGFuY2VzLiAgKl9fc2xvdHNfXypcbiAgIHJlc2VydmVzIHNwYWNlIGZvciB0aGUgZGVjbGFyZWQgdmFyaWFibGVzIGFuZCBwcmV2ZW50cyB0aGVcbiAgIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZCAqX193ZWFrcmVmX18qIGZvciBlYWNoXG4gICBpbnN0YW5jZS5cblxuXG5Ob3RlcyBvbiB1c2luZyAqX19zbG90c19fKlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuKiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhIGNsYXNzIHdpdGhvdXQgKl9fc2xvdHNfXyosIHRoZSAqX19kaWN0X18qXG4gIGF0dHJpYnV0ZSBvZiB0aGF0IGNsYXNzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUsIHNvIGEgKl9fc2xvdHNfXypcbiAgZGVmaW5pdGlvbiBpbiB0aGUgc3ViY2xhc3MgaXMgbWVhbmluZ2xlc3MuXG5cbiogV2l0aG91dCBhICpfX2RpY3RfXyogdmFyaWFibGUsIGluc3RhbmNlcyBjYW5ub3QgYmUgYXNzaWduZWQgbmV3XG4gIHZhcmlhYmxlcyBub3QgbGlzdGVkIGluIHRoZSAqX19zbG90c19fKiBkZWZpbml0aW9uLiAgQXR0ZW1wdHMgdG9cbiAgYXNzaWduIHRvIGFuIHVubGlzdGVkIHZhcmlhYmxlIG5hbWUgcmFpc2VzICJBdHRyaWJ1dGVFcnJvciIuIElmXG4gIGR5bmFtaWMgYXNzaWdubWVudCBvZiBuZXcgdmFyaWFibGVzIGlzIGRlc2lyZWQsIHRoZW4gYWRkXG4gICJcJ19fZGljdF9fXCciIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKlxuICBkZWNsYXJhdGlvbi5cblxuKiBXaXRob3V0IGEgKl9fd2Vha3JlZl9fKiB2YXJpYWJsZSBmb3IgZWFjaCBpbnN0YW5jZSwgY2xhc3Nlc1xuICBkZWZpbmluZyAqX19zbG90c19fKiBkbyBub3Qgc3VwcG9ydCB3ZWFrIHJlZmVyZW5jZXMgdG8gaXRzXG4gIGluc3RhbmNlcy4gSWYgd2VhayByZWZlcmVuY2Ugc3VwcG9ydCBpcyBuZWVkZWQsIHRoZW4gYWRkXG4gICJcJ19fd2Vha3JlZl9fXCciIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKlxuICBkZWNsYXJhdGlvbi5cblxuKiAqX19zbG90c19fKiBhcmUgaW1wbGVtZW50ZWQgYXQgdGhlIGNsYXNzIGxldmVsIGJ5IGNyZWF0aW5nXG4gIGRlc2NyaXB0b3JzICgqSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzKikgZm9yIGVhY2ggdmFyaWFibGUgbmFtZS4gIEFzXG4gIGEgcmVzdWx0LCBjbGFzcyBhdHRyaWJ1dGVzIGNhbm5vdCBiZSB1c2VkIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3JcbiAgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQgYnkgKl9fc2xvdHNfXyo7IG90aGVyd2lzZSwgdGhlIGNsYXNzXG4gIGF0dHJpYnV0ZSB3b3VsZCBvdmVyd3JpdGUgdGhlIGRlc2NyaXB0b3IgYXNzaWdubWVudC5cblxuKiBUaGUgYWN0aW9uIG9mIGEgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gaXMgbGltaXRlZCB0byB0aGUgY2xhc3NcbiAgd2hlcmUgaXQgaXMgZGVmaW5lZC4gIEFzIGEgcmVzdWx0LCBzdWJjbGFzc2VzIHdpbGwgaGF2ZSBhICpfX2RpY3RfXypcbiAgdW5sZXNzIHRoZXkgYWxzbyBkZWZpbmUgKl9fc2xvdHNfXyogKHdoaWNoIG11c3Qgb25seSBjb250YWluIG5hbWVzXG4gIG9mIGFueSAqYWRkaXRpb25hbCogc2xvdHMpLlxuXG4qIElmIGEgY2xhc3MgZGVmaW5lcyBhIHNsb3QgYWxzbyBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcywgdGhlXG4gIGluc3RhbmNlIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyBpbmFjY2Vzc2libGVcbiAgKGV4Y2VwdCBieSByZXRyaWV2aW5nIGl0cyBkZXNjcmlwdG9yIGRpcmVjdGx5IGZyb20gdGhlIGJhc2UgY2xhc3MpLlxuICBUaGlzIHJlbmRlcnMgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0gdW5kZWZpbmVkLiAgSW4gdGhlIGZ1dHVyZSwgYVxuICBjaGVjayBtYXkgYmUgYWRkZWQgdG8gcHJldmVudCB0aGlzLlxuXG4qIE5vbmVtcHR5ICpfX3Nsb3RzX18qIGRvZXMgbm90IHdvcmsgZm9yIGNsYXNzZXMgZGVyaXZlZCBmcm9tXG4gICJ2YXJpYWJsZS1sZW5ndGgiIGJ1aWx0LWluIHR5cGVzIHN1Y2ggYXMgImludCIsICJieXRlcyIgYW5kICJ0dXBsZSIuXG5cbiogQW55IG5vbi1zdHJpbmcgaXRlcmFibGUgbWF5IGJlIGFzc2lnbmVkIHRvICpfX3Nsb3RzX18qLiBNYXBwaW5nc1xuICBtYXkgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsIG1lYW5pbmcgbWF5IGJlXG4gIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS5cblxuKiAqX19jbGFzc19fKiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlIHNhbWVcbiAgKl9fc2xvdHNfXyouXG4nLAotICdhdHRyaWJ1dGUtcmVmZXJlbmNlcyc6IHUnXG5BdHRyaWJ1dGUgcmVmZXJlbmNlc1xuKioqKioqKioqKioqKioqKioqKipcblxuQW4gYXR0cmlidXRlIHJlZmVyZW5jZSBpcyBhIHByaW1hcnkgZm9sbG93ZWQgYnkgYSBwZXJpb2QgYW5kIGEgbmFtZTpcblxuICAgYXR0cmlidXRlcmVmIDo6PSBwcmltYXJ5ICIuIiBpZGVudGlmaWVyXG5cblRoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IG9mIGEgdHlwZSB0aGF0IHN1cHBvcnRzXG5hdHRyaWJ1dGUgcmVmZXJlbmNlcywgd2hpY2ggbW9zdCBvYmplY3RzIGRvLiAgVGhpcyBvYmplY3QgaXMgdGhlblxuYXNrZWQgdG8gcHJvZHVjZSB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXMgdGhlIGlkZW50aWZpZXIuICBUaGlzXG5wcm9kdWN0aW9uIGNhbiBiZSBjdXN0b21pemVkIGJ5IG92ZXJyaWRpbmcgdGhlICJfX2dldGF0dHJfXygpIiBtZXRob2QuXG5JZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgZXhjZXB0aW9uICJBdHRyaWJ1dGVFcnJvciIgaXNcbnJhaXNlZC4gIE90aGVyd2lzZSwgdGhlIHR5cGUgYW5kIHZhbHVlIG9mIHRoZSBvYmplY3QgcHJvZHVjZWQgaXNcbmRldGVybWluZWQgYnkgdGhlIG9iamVjdC4gIE11bHRpcGxlIGV2YWx1YXRpb25zIG9mIHRoZSBzYW1lIGF0dHJpYnV0ZVxucmVmZXJlbmNlIG1heSB5aWVsZCBkaWZmZXJlbnQgb2JqZWN0cy5cbicsCi0gJ2F1Z2Fzc2lnbic6IHUnXG5BdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgc3RhdGVtZW50LCBvZiBhXG5iaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDpcblxuICAgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0IGF1Z29wIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgYXVndGFyZ2V0ICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciB8IGF0dHJpYnV0ZXJlZiB8IHN1YnNjcmlwdGlvbiB8IHNsaWNpbmdcbiAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICJAPSIgfCAiLz0iIHwgIi8vPSIgfCAiJT0iIHwgIioqPSJcbiAgICAgICAgICAgICB8ICI+Pj0iIHwgIjw8PSIgfCAiJj0iIHwgIl49IiB8ICJ8PSJcblxuKFNlZSBzZWN0aW9uICpQcmltYXJpZXMqIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIG9mIHRoZSBsYXN0IHRocmVlXG5zeW1ib2xzLilcblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2Ugbm9ybWFsXG5hc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgZXhwcmVzc2lvblxubGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgYXNzaWdubWVudFxub24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgdGFyZ2V0LlxuVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLlxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIGxpa2UgInggKz0gMSIgY2FuIGJlIHJld3JpdHRlbiBhc1xuInggPSB4ICsgMSIgdG8gYWNoaWV2ZSBhIHNpbWlsYXIsIGJ1dCBub3QgZXhhY3RseSBlcXVhbCBlZmZlY3QuIEluIHRoZVxuYXVnbWVudGVkIHZlcnNpb24sICJ4IiBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuIHBvc3NpYmxlLFxudGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkICppbi1wbGFjZSosIG1lYW5pbmcgdGhhdCByYXRoZXIgdGhhblxuY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LCB0aGUgb2xkIG9iamVjdFxuaXMgbW9kaWZpZWQgaW5zdGVhZC5cblxuVW5saWtlIG5vcm1hbCBhc3NpZ25tZW50cywgYXVnbWVudGVkIGFzc2lnbm1lbnRzIGV2YWx1YXRlIHRoZSBsZWZ0LVxuaGFuZCBzaWRlICpiZWZvcmUqIGV2YWx1YXRpbmcgdGhlIHJpZ2h0LWhhbmQgc2lkZS4gIEZvciBleGFtcGxlLCAiYVtpXVxuKz0gZih4KSIgZmlyc3QgbG9va3MtdXAgImFbaV0iLCB0aGVuIGl0IGV2YWx1YXRlcyAiZih4KSIgYW5kIHBlcmZvcm1zXG50aGUgYWRkaXRpb24sIGFuZCBsYXN0bHksIGl0IHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gImFbaV0iLlxuXG5XaXRoIHRoZSBleGNlcHRpb24gb2YgYXNzaWduaW5nIHRvIHR1cGxlcyBhbmQgbXVsdGlwbGUgdGFyZ2V0cyBpbiBhXG5zaW5nbGUgc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50XG5zdGF0ZW1lbnRzIGlzIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBhc3NpZ25tZW50cy4gU2ltaWxhcmx5LFxud2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBwb3NzaWJsZSAqaW4tcGxhY2UqIGJlaGF2aW9yLCB0aGUgYmluYXJ5XG5vcGVyYXRpb24gcGVyZm9ybWVkIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBzYW1lIGFzIHRoZSBub3JtYWxcbmJpbmFyeSBvcGVyYXRpb25zLlxuXG5Gb3IgdGFyZ2V0cyB3aGljaCBhcmUgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHRoZSBzYW1lICpjYXZlYXQgYWJvdXRcbmNsYXNzIGFuZCBpbnN0YW5jZSBhdHRyaWJ1dGVzKiBhcHBsaWVzIGFzIGZvciByZWd1bGFyIGFzc2lnbm1lbnRzLlxuJywKLSAnYmluYXJ5JzogdSdcbkJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgaGF2ZSB0aGUgY29udmVudGlvbmFsIHByaW9yaXR5XG5sZXZlbHMuICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSBvcGVyYXRpb25zIGFsc28gYXBwbHkgdG8gY2VydGFpbiBub24tXG5udW1lcmljIHR5cGVzLiAgQXBhcnQgZnJvbSB0aGUgcG93ZXIgb3BlcmF0b3IsIHRoZXJlIGFyZSBvbmx5IHR3b1xubGV2ZWxzLCBvbmUgZm9yIG11bHRpcGxpY2F0aXZlIG9wZXJhdG9ycyBhbmQgb25lIGZvciBhZGRpdGl2ZVxub3BlcmF0b3JzOlxuXG4gICBtX2V4cHIgOjo9IHVfZXhwciB8IG1fZXhwciAiKiIgdV9leHByIHwgbV9leHByICJAIiBtX2V4cHIgfFxuICAgICAgICAgICAgICBtX2V4cHIgIi8vIiB1X2V4cHJ8IG1fZXhwciAiLyIgdV9leHByIHxcbiAgICAgICAgICAgICAgbV9leHByICIlIiB1X2V4cHJcbiAgIGFfZXhwciA6Oj0gbV9leHByIHwgYV9leHByICIrIiBtX2V4cHIgfCBhX2V4cHIgIi0iIG1fZXhwclxuXG5UaGUgIioiIChtdWx0aXBsaWNhdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBwcm9kdWN0IG9mIGl0cyBhcmd1bWVudHMuXG5UaGUgYXJndW1lbnRzIG11c3QgZWl0aGVyIGJvdGggYmUgbnVtYmVycywgb3Igb25lIGFyZ3VtZW50IG11c3QgYmUgYW5cbmludGVnZXIgYW5kIHRoZSBvdGhlciBtdXN0IGJlIGEgc2VxdWVuY2UuIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlXG5udW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSBhbmQgdGhlbiBtdWx0aXBsaWVkIHRvZ2V0aGVyLlxuSW4gdGhlIGxhdHRlciBjYXNlLCBzZXF1ZW5jZSByZXBldGl0aW9uIGlzIHBlcmZvcm1lZDsgYSBuZWdhdGl2ZVxucmVwZXRpdGlvbiBmYWN0b3IgeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlLlxuXG5UaGUgIkAiIChhdCkgb3BlcmF0b3IgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbWF0cml4XG5tdWx0aXBsaWNhdGlvbi4gIE5vIGJ1aWx0aW4gUHl0aG9uIHR5cGVzIGltcGxlbWVudCB0aGlzIG9wZXJhdG9yLlxuXG5OZXcgaW4gdmVyc2lvbiAzLjUuXG5cblRoZSAiLyIgKGRpdmlzaW9uKSBhbmQgIi8vIiAoZmxvb3IgZGl2aXNpb24pIG9wZXJhdG9ycyB5aWVsZCB0aGVcbnF1b3RpZW50IG9mIHRoZWlyIGFyZ3VtZW50cy4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3RcbmNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiBEaXZpc2lvbiBvZiBpbnRlZ2VycyB5aWVsZHMgYSBmbG9hdCwgd2hpbGVcbmZsb29yIGRpdmlzaW9uIG9mIGludGVnZXJzIHJlc3VsdHMgaW4gYW4gaW50ZWdlcjsgdGhlIHJlc3VsdCBpcyB0aGF0XG5vZiBtYXRoZW1hdGljYWwgZGl2aXNpb24gd2l0aCB0aGUgXCdmbG9vclwnIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlXG5yZXN1bHQuICBEaXZpc2lvbiBieSB6ZXJvIHJhaXNlcyB0aGUgIlplcm9EaXZpc2lvbkVycm9yIiBleGNlcHRpb24uXG5cblRoZSAiJSIgKG1vZHVsbykgb3BlcmF0b3IgeWllbGRzIHRoZSByZW1haW5kZXIgZnJvbSB0aGUgZGl2aXNpb24gb2ZcbnRoZSBmaXJzdCBhcmd1bWVudCBieSB0aGUgc2Vjb25kLiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdFxuY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBBIHplcm8gcmlnaHQgYXJndW1lbnQgcmFpc2VzIHRoZVxuIlplcm9EaXZpc2lvbkVycm9yIiBleGNlcHRpb24uICBUaGUgYXJndW1lbnRzIG1heSBiZSBmbG9hdGluZyBwb2ludFxubnVtYmVycywgZS5nLiwgIjMuMTQlMC43IiBlcXVhbHMgIjAuMzQiIChzaW5jZSAiMy4xNCIgZXF1YWxzICI0KjAuNyArXG4wLjM0Ii4pICBUaGUgbW9kdWxvIG9wZXJhdG9yIGFsd2F5cyB5aWVsZHMgYSByZXN1bHQgd2l0aCB0aGUgc2FtZSBzaWduXG5hcyBpdHMgc2Vjb25kIG9wZXJhbmQgKG9yIHplcm8pOyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHJlc3VsdCBpc1xuc3RyaWN0bHkgc21hbGxlciB0aGFuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgWzFdLlxuXG5UaGUgZmxvb3IgZGl2aXNpb24gYW5kIG1vZHVsbyBvcGVyYXRvcnMgYXJlIGNvbm5lY3RlZCBieSB0aGUgZm9sbG93aW5nXG5pZGVudGl0eTogInggPT0gKHgvL3kpKnkgKyAoeCV5KSIuICBGbG9vciBkaXZpc2lvbiBhbmQgbW9kdWxvIGFyZSBhbHNvXG5jb25uZWN0ZWQgd2l0aCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImRpdm1vZCgpIjogImRpdm1vZCh4LCB5KSA9PVxuKHgvL3ksIHgleSkiLiBbMl0uXG5cbkluIGFkZGl0aW9uIHRvIHBlcmZvcm1pbmcgdGhlIG1vZHVsbyBvcGVyYXRpb24gb24gbnVtYmVycywgdGhlICIlIlxub3BlcmF0b3IgaXMgYWxzbyBvdmVybG9hZGVkIGJ5IHN0cmluZyBvYmplY3RzIHRvIHBlcmZvcm0gb2xkLXN0eWxlXG5zdHJpbmcgZm9ybWF0dGluZyAoYWxzbyBrbm93biBhcyBpbnRlcnBvbGF0aW9uKS4gIFRoZSBzeW50YXggZm9yXG5zdHJpbmcgZm9ybWF0dGluZyBpcyBkZXNjcmliZWQgaW4gdGhlIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSxcbnNlY3Rpb24gKnByaW50Zi1zdHlsZSBTdHJpbmcgRm9ybWF0dGluZyouXG5cblRoZSBmbG9vciBkaXZpc2lvbiBvcGVyYXRvciwgdGhlIG1vZHVsbyBvcGVyYXRvciwgYW5kIHRoZSAiZGl2bW9kKCkiXG5mdW5jdGlvbiBhcmUgbm90IGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycy4gIEluc3RlYWQsIGNvbnZlcnQgdG8gYVxuZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHVzaW5nIHRoZSAiYWJzKCkiIGZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLlxuXG5UaGUgIisiIChhZGRpdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBzdW0gb2YgaXRzIGFyZ3VtZW50cy4gIFRoZVxuYXJndW1lbnRzIG11c3QgZWl0aGVyIGJvdGggYmUgbnVtYmVycyBvciBib3RoIGJlIHNlcXVlbmNlcyBvZiB0aGUgc2FtZVxudHlwZS4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlXG5hbmQgdGhlbiBhZGRlZCB0b2dldGhlci4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgc2VxdWVuY2VzIGFyZVxuY29uY2F0ZW5hdGVkLlxuXG5UaGUgIi0iIChzdWJ0cmFjdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBkaWZmZXJlbmNlIG9mIGl0cyBhcmd1bWVudHMuXG5UaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLlxuJywKLSAnYml0d2lzZSc6IHUnXG5CaW5hcnkgYml0d2lzZSBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkVhY2ggb2YgdGhlIHRocmVlIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXMgYSBkaWZmZXJlbnQgcHJpb3JpdHkgbGV2ZWw6XG5cbiAgIGFuZF9leHByIDo6PSBzaGlmdF9leHByIHwgYW5kX2V4cHIgIiYiIHNoaWZ0X2V4cHJcbiAgIHhvcl9leHByIDo6PSBhbmRfZXhwciB8IHhvcl9leHByICJeIiBhbmRfZXhwclxuICAgb3JfZXhwciAgOjo9IHhvcl9leHByIHwgb3JfZXhwciAifCIgeG9yX2V4cHJcblxuVGhlICImIiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgQU5EIG9mIGl0cyBhcmd1bWVudHMsIHdoaWNoIG11c3RcbmJlIGludGVnZXJzLlxuXG5UaGUgIl4iIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBYT1IgKGV4Y2x1c2l2ZSBPUikgb2YgaXRzXG5hcmd1bWVudHMsIHdoaWNoIG11c3QgYmUgaW50ZWdlcnMuXG5cblRoZSAifCIgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIChpbmNsdXNpdmUpIE9SIG9mIGl0cyBhcmd1bWVudHMsXG53aGljaCBtdXN0IGJlIGludGVnZXJzLlxuJywKLSAnYmx0aW4tY29kZS1vYmplY3RzJzogdSdcbkNvZGUgT2JqZWN0c1xuKioqKioqKioqKioqXG5cbkNvZGUgb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gdG8gcmVwcmVzZW50ICJwc2V1ZG8tXG5jb21waWxlZCIgZXhlY3V0YWJsZSBQeXRob24gY29kZSBzdWNoIGFzIGEgZnVuY3Rpb24gYm9keS4gVGhleSBkaWZmZXJcbmZyb20gZnVuY3Rpb24gb2JqZWN0cyBiZWNhdXNlIHRoZXkgZG9uXCd0IGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlaXJcbmdsb2JhbCBleGVjdXRpb24gZW52aXJvbm1lbnQuICBDb2RlIG9iamVjdHMgYXJlIHJldHVybmVkIGJ5IHRoZSBidWlsdC1cbmluICJjb21waWxlKCkiIGZ1bmN0aW9uIGFuZCBjYW4gYmUgZXh0cmFjdGVkIGZyb20gZnVuY3Rpb24gb2JqZWN0c1xudGhyb3VnaCB0aGVpciAiX19jb2RlX18iIGF0dHJpYnV0ZS4gU2VlIGFsc28gdGhlICJjb2RlIiBtb2R1bGUuXG5cbkEgY29kZSBvYmplY3QgY2FuIGJlIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCBieSBwYXNzaW5nIGl0IChpbnN0ZWFkIG9mIGFcbnNvdXJjZSBzdHJpbmcpIHRvIHRoZSAiZXhlYygpIiBvciAiZXZhbCgpIiAgYnVpbHQtaW4gZnVuY3Rpb25zLlxuXG5TZWUgKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAotICdibHRpbi1lbGxpcHNpcy1vYmplY3QnOiB1J1xuVGhlIEVsbGlwc2lzIE9iamVjdFxuKioqKioqKioqKioqKioqKioqKlxuXG5UaGlzIG9iamVjdCBpcyBjb21tb25seSB1c2VkIGJ5IHNsaWNpbmcgKHNlZSAqU2xpY2luZ3MqKS4gIEl0IHN1cHBvcnRzXG5ubyBzcGVjaWFsIG9wZXJhdGlvbnMuICBUaGVyZSBpcyBleGFjdGx5IG9uZSBlbGxpcHNpcyBvYmplY3QsIG5hbWVkXG4iRWxsaXBzaXMiIChhIGJ1aWx0LWluIG5hbWUpLiAgInR5cGUoRWxsaXBzaXMpKCkiIHByb2R1Y2VzIHRoZVxuIkVsbGlwc2lzIiBzaW5nbGV0b24uXG5cbkl0IGlzIHdyaXR0ZW4gYXMgIkVsbGlwc2lzIiBvciAiLi4uIi5cbicsCi0gJ2JsdGluLW51bGwtb2JqZWN0JzogdSdcblRoZSBOdWxsIE9iamVjdFxuKioqKioqKioqKioqKioqXG5cblRoaXMgb2JqZWN0IGlzIHJldHVybmVkIGJ5IGZ1bmN0aW9ucyB0aGF0IGRvblwndCBleHBsaWNpdGx5IHJldHVybiBhXG52YWx1ZS4gIEl0IHN1cHBvcnRzIG5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lIG51bGxcbm9iamVjdCwgbmFtZWQgIk5vbmUiIChhIGJ1aWx0LWluIG5hbWUpLiAgInR5cGUoTm9uZSkoKSIgcHJvZHVjZXMgdGhlXG5zYW1lIHNpbmdsZXRvbi5cblxuSXQgaXMgd3JpdHRlbiBhcyAiTm9uZSIuXG4nLAotICdibHRpbi10eXBlLW9iamVjdHMnOiB1J1xuVHlwZSBPYmplY3RzXG4qKioqKioqKioqKipcblxuVHlwZSBvYmplY3RzIHJlcHJlc2VudCB0aGUgdmFyaW91cyBvYmplY3QgdHlwZXMuICBBbiBvYmplY3RcJ3MgdHlwZSBpc1xuYWNjZXNzZWQgYnkgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJ0eXBlKCkiLiAgVGhlcmUgYXJlIG5vIHNwZWNpYWxcbm9wZXJhdGlvbnMgb24gdHlwZXMuICBUaGUgc3RhbmRhcmQgbW9kdWxlICJ0eXBlcyIgZGVmaW5lcyBuYW1lcyBmb3JcbmFsbCBzdGFuZGFyZCBidWlsdC1pbiB0eXBlcy5cblxuVHlwZXMgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiAiPGNsYXNzIFwnaW50XCc+Ii5cbicsCi0gJ2Jvb2xlYW5zJzogdSdcbkJvb2xlYW4gb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqXG5cbiAgIG9yX3Rlc3QgIDo6PSBhbmRfdGVzdCB8IG9yX3Rlc3QgIm9yIiBhbmRfdGVzdFxuICAgYW5kX3Rlc3QgOjo9IG5vdF90ZXN0IHwgYW5kX3Rlc3QgImFuZCIgbm90X3Rlc3RcbiAgIG5vdF90ZXN0IDo6PSBjb21wYXJpc29uIHwgIm5vdCIgbm90X3Rlc3RcblxuSW4gdGhlIGNvbnRleHQgb2YgQm9vbGVhbiBvcGVyYXRpb25zLCBhbmQgYWxzbyB3aGVuIGV4cHJlc3Npb25zIGFyZVxudXNlZCBieSBjb250cm9sIGZsb3cgc3RhdGVtZW50cywgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGludGVycHJldGVkXG5hcyBmYWxzZTogIkZhbHNlIiwgIk5vbmUiLCBudW1lcmljIHplcm8gb2YgYWxsIHR5cGVzLCBhbmQgZW1wdHlcbnN0cmluZ3MgYW5kIGNvbnRhaW5lcnMgKGluY2x1ZGluZyBzdHJpbmdzLCB0dXBsZXMsIGxpc3RzLFxuZGljdGlvbmFyaWVzLCBzZXRzIGFuZCBmcm96ZW5zZXRzKS4gIEFsbCBvdGhlciB2YWx1ZXMgYXJlIGludGVycHJldGVkXG5hcyB0cnVlLiAgVXNlci1kZWZpbmVkIG9iamVjdHMgY2FuIGN1c3RvbWl6ZSB0aGVpciB0cnV0aCB2YWx1ZSBieVxucHJvdmlkaW5nIGEgIl9fYm9vbF9fKCkiIG1ldGhvZC5cblxuVGhlIG9wZXJhdG9yICJub3QiIHlpZWxkcyAiVHJ1ZSIgaWYgaXRzIGFyZ3VtZW50IGlzIGZhbHNlLCAiRmFsc2UiXG5vdGhlcndpc2UuXG5cblRoZSBleHByZXNzaW9uICJ4IGFuZCB5IiBmaXJzdCBldmFsdWF0ZXMgKngqOyBpZiAqeCogaXMgZmFsc2UsIGl0c1xudmFsdWUgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSwgKnkqIGlzIGV2YWx1YXRlZCBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZVxuaXMgcmV0dXJuZWQuXG5cblRoZSBleHByZXNzaW9uICJ4IG9yIHkiIGZpcnN0IGV2YWx1YXRlcyAqeCo7IGlmICp4KiBpcyB0cnVlLCBpdHMgdmFsdWVcbmlzIHJldHVybmVkOyBvdGhlcndpc2UsICp5KiBpcyBldmFsdWF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgdmFsdWUgaXNcbnJldHVybmVkLlxuXG4oTm90ZSB0aGF0IG5laXRoZXIgImFuZCIgbm9yICJvciIgcmVzdHJpY3QgdGhlIHZhbHVlIGFuZCB0eXBlIHRoZXlcbnJldHVybiB0byAiRmFsc2UiIGFuZCAiVHJ1ZSIsIGJ1dCByYXRoZXIgcmV0dXJuIHRoZSBsYXN0IGV2YWx1YXRlZFxuYXJndW1lbnQuICBUaGlzIGlzIHNvbWV0aW1lcyB1c2VmdWwsIGUuZy4sIGlmICJzIiBpcyBhIHN0cmluZyB0aGF0XG5zaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBkZWZhdWx0IHZhbHVlIGlmIGl0IGlzIGVtcHR5LCB0aGUgZXhwcmVzc2lvblxuInMgb3IgXCdmb29cJyIgeWllbGRzIHRoZSBkZXNpcmVkIHZhbHVlLiAgQmVjYXVzZSAibm90IiBoYXMgdG8gY3JlYXRlIGFcbm5ldyB2YWx1ZSwgaXQgcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBvZiBpdHNcbmFyZ3VtZW50IChmb3IgZXhhbXBsZSwgIm5vdCBcJ2Zvb1wnIiBwcm9kdWNlcyAiRmFsc2UiIHJhdGhlciB0aGFuICJcJ1wnIi4pXG4nLAotICdicmVhayc6IHUnXG5UaGUgImJyZWFrIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBicmVha19zdG10IDo6PSAiYnJlYWsiXG5cbiJicmVhayIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSAiZm9yIiBvciAid2hpbGUiXG5sb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb24gd2l0aGluIHRoYXRcbmxvb3AuXG5cbkl0IHRlcm1pbmF0ZXMgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxvb3AsIHNraXBwaW5nIHRoZSBvcHRpb25hbCAiZWxzZSJcbmNsYXVzZSBpZiB0aGUgbG9vcCBoYXMgb25lLlxuXG5JZiBhICJmb3IiIGxvb3AgaXMgdGVybWluYXRlZCBieSAiYnJlYWsiLCB0aGUgbG9vcCBjb250cm9sIHRhcmdldFxua2VlcHMgaXRzIGN1cnJlbnQgdmFsdWUuXG5cbldoZW4gImJyZWFrIiBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSAidHJ5IiBzdGF0ZW1lbnQgd2l0aCBhICJmaW5hbGx5IlxuY2xhdXNlLCB0aGF0ICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseSBsZWF2aW5nIHRoZVxubG9vcC5cbicsCi0gJ2NhbGxhYmxlLXR5cGVzJzogdSdcbkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5vYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgImNhbGxlZCIgYXMgYSBmdW5jdGlvbjsgaWYgdGhpcyBtZXRob2RcbiAgIGlzIGRlZmluZWQsICJ4KGFyZzEsIGFyZzIsIC4uLikiIGlzIGEgc2hvcnRoYW5kIGZvclxuICAgInguX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKSIuXG4nLAotICdjYWxscyc6IHUnXG5DYWxsc1xuKioqKipcblxuQSBjYWxsIGNhbGxzIGEgY2FsbGFibGUgb2JqZWN0IChlLmcuLCBhICpmdW5jdGlvbiopIHdpdGggYSBwb3NzaWJseVxuZW1wdHkgc2VyaWVzIG9mICphcmd1bWVudHMqOlxuXG4gICBjYWxsICAgICAgICAgICAgICAgICA6Oj0gcHJpbWFyeSAiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl0gfCBjb21wcmVoZW5zaW9uXSAiKSJcbiAgIGFyZ3VtZW50X2xpc3QgICAgICAgIDo6PSBwb3NpdGlvbmFsX2FyZ3VtZW50cyBbIiwiIHN0YXJyZWRfYW5kX2tleXdvcmRzXVxuICAgICAgICAgICAgICAgICAgICAgICBbIiwiIGtleXdvcmRzX2FyZ3VtZW50c11cbiAgICAgICAgICAgICAgICAgICAgIHwgc3RhcnJlZF9hbmRfa2V5d29yZHMgWyIsIiBrZXl3b3Jkc19hcmd1bWVudHNdXG4gICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmRzX2FyZ3VtZW50c1xuICAgcG9zaXRpb25hbF9hcmd1bWVudHMgOjo9IFsiKiJdIGV4cHJlc3Npb24gKCIsIiBbIioiXSBleHByZXNzaW9uKSpcbiAgIHN0YXJyZWRfYW5kX2tleXdvcmRzIDo6PSAoIioiIGV4cHJlc3Npb24gfCBrZXl3b3JkX2l0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCIsIiAiKiIgZXhwcmVzc2lvbiB8ICIsIiBrZXl3b3JkX2l0ZW0pKlxuICAga2V5d29yZHNfYXJndW1lbnRzICAgOjo9IChrZXl3b3JkX2l0ZW0gfCAiKioiIGV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgiLCIga2V5d29yZF9pdGVtIHwgIioqIiBleHByZXNzaW9uKSpcbiAgIGtleXdvcmRfaXRlbSAgICAgICAgIDo6PSBpZGVudGlmaWVyICI9IiBleHByZXNzaW9uXG5cbkFuIG9wdGlvbmFsIHRyYWlsaW5nIGNvbW1hIG1heSBiZSBwcmVzZW50IGFmdGVyIHRoZSBwb3NpdGlvbmFsIGFuZFxua2V5d29yZCBhcmd1bWVudHMgYnV0IGRvZXMgbm90IGFmZmVjdCB0aGUgc2VtYW50aWNzLlxuXG5UaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGEgY2FsbGFibGUgb2JqZWN0ICh1c2VyLWRlZmluZWRcbmZ1bmN0aW9ucywgYnVpbHQtaW4gZnVuY3Rpb25zLCBtZXRob2RzIG9mIGJ1aWx0LWluIG9iamVjdHMsIGNsYXNzXG5vYmplY3RzLCBtZXRob2RzIG9mIGNsYXNzIGluc3RhbmNlcywgYW5kIGFsbCBvYmplY3RzIGhhdmluZyBhXG4iX19jYWxsX18oKSIgbWV0aG9kIGFyZSBjYWxsYWJsZSkuICBBbGwgYXJndW1lbnQgZXhwcmVzc2lvbnMgYXJlXG5ldmFsdWF0ZWQgYmVmb3JlIHRoZSBjYWxsIGlzIGF0dGVtcHRlZC4gIFBsZWFzZSByZWZlciB0byBzZWN0aW9uXG4qRnVuY3Rpb24gZGVmaW5pdGlvbnMqIGZvciB0aGUgc3ludGF4IG9mIGZvcm1hbCAqcGFyYW1ldGVyKiBsaXN0cy5cblxuSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIGZpcnN0IGNvbnZlcnRlZCB0b1xucG9zaXRpb25hbCBhcmd1bWVudHMsIGFzIGZvbGxvd3MuICBGaXJzdCwgYSBsaXN0IG9mIHVuZmlsbGVkIHNsb3RzIGlzXG5jcmVhdGVkIGZvciB0aGUgZm9ybWFsIHBhcmFtZXRlcnMuICBJZiB0aGVyZSBhcmUgTiBwb3NpdGlvbmFsXG5hcmd1bWVudHMsIHRoZXkgYXJlIHBsYWNlZCBpbiB0aGUgZmlyc3QgTiBzbG90cy4gIE5leHQsIGZvciBlYWNoXG5rZXl3b3JkIGFyZ3VtZW50LCB0aGUgaWRlbnRpZmllciBpcyB1c2VkIHRvIGRldGVybWluZSB0aGVcbmNvcnJlc3BvbmRpbmcgc2xvdCAoaWYgdGhlIGlkZW50aWZpZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGZvcm1hbFxucGFyYW1ldGVyIG5hbWUsIHRoZSBmaXJzdCBzbG90IGlzIHVzZWQsIGFuZCBzbyBvbikuICBJZiB0aGUgc2xvdCBpc1xuYWxyZWFkeSBmaWxsZWQsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4gT3RoZXJ3aXNlLCB0aGVcbnZhbHVlIG9mIHRoZSBhcmd1bWVudCBpcyBwbGFjZWQgaW4gdGhlIHNsb3QsIGZpbGxpbmcgaXQgKGV2ZW4gaWYgdGhlXG5leHByZXNzaW9uIGlzICJOb25lIiwgaXQgZmlsbHMgdGhlIHNsb3QpLiAgV2hlbiBhbGwgYXJndW1lbnRzIGhhdmVcbmJlZW4gcHJvY2Vzc2VkLCB0aGUgc2xvdHMgdGhhdCBhcmUgc3RpbGwgdW5maWxsZWQgYXJlIGZpbGxlZCB3aXRoIHRoZVxuY29ycmVzcG9uZGluZyBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICAoRGVmYXVsdFxudmFsdWVzIGFyZSBjYWxjdWxhdGVkLCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkOyB0aHVzLCBhXG5tdXRhYmxlIG9iamVjdCBzdWNoIGFzIGEgbGlzdCBvciBkaWN0aW9uYXJ5IHVzZWQgYXMgZGVmYXVsdCB2YWx1ZSB3aWxsXG5iZSBzaGFyZWQgYnkgYWxsIGNhbGxzIHRoYXQgZG9uXCd0IHNwZWNpZnkgYW4gYXJndW1lbnQgdmFsdWUgZm9yIHRoZVxuY29ycmVzcG9uZGluZyBzbG90OyB0aGlzIHNob3VsZCB1c3VhbGx5IGJlIGF2b2lkZWQuKSAgSWYgdGhlcmUgYXJlIGFueVxudW5maWxsZWQgc2xvdHMgZm9yIHdoaWNoIG5vIGRlZmF1bHQgdmFsdWUgaXMgc3BlY2lmaWVkLCBhICJUeXBlRXJyb3IiXG5leGNlcHRpb24gaXMgcmFpc2VkLiAgT3RoZXJ3aXNlLCB0aGUgbGlzdCBvZiBmaWxsZWQgc2xvdHMgaXMgdXNlZCBhc1xudGhlIGFyZ3VtZW50IGxpc3QgZm9yIHRoZSBjYWxsLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEFuIGltcGxlbWVudGF0aW9uIG1heSBwcm92aWRlXG5idWlsdC1pbiBmdW5jdGlvbnMgd2hvc2UgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIGRvIG5vdCBoYXZlIG5hbWVzLCBldmVuXG5pZiB0aGV5IGFyZSBcJ25hbWVkXCcgZm9yIHRoZSBwdXJwb3NlIG9mIGRvY3VtZW50YXRpb24sIGFuZCB3aGljaFxudGhlcmVmb3JlIGNhbm5vdCBiZSBzdXBwbGllZCBieSBrZXl3b3JkLiAgSW4gQ1B5dGhvbiwgdGhpcyBpcyB0aGUgY2FzZVxuZm9yIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBDIHRoYXQgdXNlICJQeUFyZ19QYXJzZVR1cGxlKCkiIHRvIHBhcnNlXG50aGVpciBhcmd1bWVudHMuXG5cbklmIHRoZXJlIGFyZSBtb3JlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhlcmUgYXJlIGZvcm1hbCBwYXJhbWV0ZXJcbnNsb3RzLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXJcbnVzaW5nIHRoZSBzeW50YXggIippZGVudGlmaWVyIiBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXQgZm9ybWFsXG5wYXJhbWV0ZXIgcmVjZWl2ZXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBleGNlc3MgcG9zaXRpb25hbCBhcmd1bWVudHNcbihvciBhbiBlbXB0eSB0dXBsZSBpZiB0aGVyZSB3ZXJlIG5vIGV4Y2VzcyBwb3NpdGlvbmFsIGFyZ3VtZW50cykuXG5cbklmIGFueSBrZXl3b3JkIGFyZ3VtZW50IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBmb3JtYWwgcGFyYW1ldGVyXG5uYW1lLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXJcbnVzaW5nIHRoZSBzeW50YXggIioqaWRlbnRpZmllciIgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0IGZvcm1hbFxucGFyYW1ldGVyIHJlY2VpdmVzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBleGNlc3Mga2V5d29yZFxuYXJndW1lbnRzICh1c2luZyB0aGUga2V5d29yZHMgYXMga2V5cyBhbmQgdGhlIGFyZ3VtZW50IHZhbHVlcyBhc1xuY29ycmVzcG9uZGluZyB2YWx1ZXMpLCBvciBhIChuZXcpIGVtcHR5IGRpY3Rpb25hcnkgaWYgdGhlcmUgd2VyZSBub1xuZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLlxuXG5JZiB0aGUgc3ludGF4ICIqZXhwcmVzc2lvbiIgYXBwZWFycyBpbiB0aGUgZnVuY3Rpb24gY2FsbCwgImV4cHJlc3Npb24iXG5tdXN0IGV2YWx1YXRlIHRvIGFuICppdGVyYWJsZSouICBFbGVtZW50cyBmcm9tIHRoZXNlIGl0ZXJhYmxlcyBhcmVcbnRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBhcmd1bWVudHMuICBGb3IgdGhlIGNhbGxcbiJmKHgxLCB4MiwgKnksIHgzLCB4NCkiLCBpZiAqeSogZXZhbHVhdGVzIHRvIGEgc2VxdWVuY2UgKnkxKiwgLi4uLFxuKnlNKiwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgY2FsbCB3aXRoIE0rNCBwb3NpdGlvbmFsIGFyZ3VtZW50cyAqeDEqLFxuKngyKiwgKnkxKiwgLi4uLCAqeU0qLCAqeDMqLCAqeDQqLlxuXG5BIGNvbnNlcXVlbmNlIG9mIHRoaXMgaXMgdGhhdCBhbHRob3VnaCB0aGUgIipleHByZXNzaW9uIiBzeW50YXggbWF5XG5hcHBlYXIgKmFmdGVyKiBleHBsaWNpdCBrZXl3b3JkIGFyZ3VtZW50cywgaXQgaXMgcHJvY2Vzc2VkICpiZWZvcmUqXG50aGUga2V5d29yZCBhcmd1bWVudHMgKGFuZCBhbnkgIioqZXhwcmVzc2lvbiIgYXJndW1lbnRzIC0tIHNlZSBiZWxvdykuXG5TbzpcblxuICAgPj4+IGRlZiBmKGEsIGIpOlxuICAgLi4uICAgICBwcmludChhLCBiKVxuICAgLi4uXG4gICA+Pj4gZihiPTEsICooMiwpKVxuICAgMiAxXG4gICA+Pj4gZihhPTEsICooMiwpKVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/XG4gICBUeXBlRXJyb3I6IGYoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50IFwnYVwnXG4gICA+Pj4gZigxLCAqKDIsKSlcbiAgIDEgMlxuXG5JdCBpcyB1bnVzdWFsIGZvciBib3RoIGtleXdvcmQgYXJndW1lbnRzIGFuZCB0aGUgIipleHByZXNzaW9uIiBzeW50YXhcbnRvIGJlIHVzZWQgaW4gdGhlIHNhbWUgY2FsbCwgc28gaW4gcHJhY3RpY2UgdGhpcyBjb25mdXNpb24gZG9lcyBub3RcbmFyaXNlLlxuXG5JZiB0aGUgc3ludGF4ICIqKmV4cHJlc3Npb24iIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsXG4iZXhwcmVzc2lvbiIgbXVzdCBldmFsdWF0ZSB0byBhICptYXBwaW5nKiwgdGhlIGNvbnRlbnRzIG9mIHdoaWNoIGFyZVxudHJlYXRlZCBhcyBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzLiAgSWYgYSBrZXl3b3JkIGlzIGFscmVhZHlcbnByZXNlbnQgKGFzIGFuIGV4cGxpY2l0IGtleXdvcmQgYXJndW1lbnQsIG9yIGZyb20gYW5vdGhlciB1bnBhY2tpbmcpLFxuYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuXG5Gb3JtYWwgcGFyYW1ldGVycyB1c2luZyB0aGUgc3ludGF4ICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciJcbmNhbm5vdCBiZSB1c2VkIGFzIHBvc2l0aW9uYWwgYXJndW1lbnQgc2xvdHMgb3IgYXMga2V5d29yZCBhcmd1bWVudFxubmFtZXMuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjU6IEZ1bmN0aW9uIGNhbGxzIGFjY2VwdCBhbnkgbnVtYmVyIG9mICIqIiBhbmRcbiIqKiIgdW5wYWNraW5ncywgcG9zaXRpb25hbCBhcmd1bWVudHMgbWF5IGZvbGxvdyBpdGVyYWJsZSB1bnBhY2tpbmdzXG4oIioiKSwgYW5kIGtleXdvcmQgYXJndW1lbnRzIG1heSBmb2xsb3cgZGljdGlvbmFyeSB1bnBhY2tpbmdzICgiKioiKS5cbk9yaWdpbmFsbHkgcHJvcG9zZWQgYnkgKipQRVAgNDQ4KiouXG5cbkEgY2FsbCBhbHdheXMgcmV0dXJucyBzb21lIHZhbHVlLCBwb3NzaWJseSAiTm9uZSIsIHVubGVzcyBpdCByYWlzZXMgYW5cbmV4Y2VwdGlvbi4gIEhvdyB0aGlzIHZhbHVlIGlzIGNvbXB1dGVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlXG5jYWxsYWJsZSBvYmplY3QuXG5cbklmIGl0IGlzLS0tXG5cbmEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uOlxuICAgVGhlIGNvZGUgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCwgcGFzc2luZyBpdCB0aGVcbiAgIGFyZ3VtZW50IGxpc3QuICBUaGUgZmlyc3QgdGhpbmcgdGhlIGNvZGUgYmxvY2sgd2lsbCBkbyBpcyBiaW5kIHRoZVxuICAgZm9ybWFsIHBhcmFtZXRlcnMgdG8gdGhlIGFyZ3VtZW50czsgdGhpcyBpcyBkZXNjcmliZWQgaW4gc2VjdGlvblxuICAgKkZ1bmN0aW9uIGRlZmluaXRpb25zKi4gIFdoZW4gdGhlIGNvZGUgYmxvY2sgZXhlY3V0ZXMgYSAicmV0dXJuIlxuICAgc3RhdGVtZW50LCB0aGlzIHNwZWNpZmllcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxuXG5hIGJ1aWx0LWluIGZ1bmN0aW9uIG9yIG1ldGhvZDpcbiAgIFRoZSByZXN1bHQgaXMgdXAgdG8gdGhlIGludGVycHJldGVyOyBzZWUgKkJ1aWx0LWluIEZ1bmN0aW9ucyogZm9yXG4gICB0aGUgZGVzY3JpcHRpb25zIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy5cblxuYSBjbGFzcyBvYmplY3Q6XG4gICBBIG5ldyBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIGlzIHJldHVybmVkLlxuXG5hIGNsYXNzIGluc3RhbmNlIG1ldGhvZDpcbiAgIFRoZSBjb3JyZXNwb25kaW5nIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBpcyBjYWxsZWQsIHdpdGggYW4gYXJndW1lbnRcbiAgIGxpc3QgdGhhdCBpcyBvbmUgbG9uZ2VyIHRoYW4gdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIGNhbGw6IHRoZVxuICAgaW5zdGFuY2UgYmVjb21lcyB0aGUgZmlyc3QgYXJndW1lbnQuXG5cbmEgY2xhc3MgaW5zdGFuY2U6XG4gICBUaGUgY2xhc3MgbXVzdCBkZWZpbmUgYSAiX19jYWxsX18oKSIgbWV0aG9kOyB0aGUgZWZmZWN0IGlzIHRoZW4gdGhlXG4gICBzYW1lIGFzIGlmIHRoYXQgbWV0aG9kIHdhcyBjYWxsZWQuXG4nLAotICdjbGFzcyc6IHUnXG5DbGFzcyBkZWZpbml0aW9uc1xuKioqKioqKioqKioqKioqKipcblxuQSBjbGFzcyBkZWZpbml0aW9uIGRlZmluZXMgYSBjbGFzcyBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmRcbnR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGNsYXNzZGVmICAgIDo6PSBbZGVjb3JhdG9yc10gImNsYXNzIiBjbGFzc25hbWUgW2luaGVyaXRhbmNlXSAiOiIgc3VpdGVcbiAgIGluaGVyaXRhbmNlIDo6PSAiKCIgW2FyZ3VtZW50X2xpc3RdICIpIlxuICAgY2xhc3NuYW1lICAgOjo9IGlkZW50aWZpZXJcblxuQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgVGhlIGluaGVyaXRhbmNlIGxpc3RcbnVzdWFsbHkgZ2l2ZXMgYSBsaXN0IG9mIGJhc2UgY2xhc3NlcyAoc2VlICpDdXN0b21pemluZyBjbGFzcyBjcmVhdGlvbipcbmZvciBtb3JlIGFkdmFuY2VkIHVzZXMpLCBzbyBlYWNoIGl0ZW0gaW4gdGhlIGxpc3Qgc2hvdWxkIGV2YWx1YXRlIHRvIGFcbmNsYXNzIG9iamVjdCB3aGljaCBhbGxvd3Mgc3ViY2xhc3NpbmcuICBDbGFzc2VzIHdpdGhvdXQgYW4gaW5oZXJpdGFuY2Vcbmxpc3QgaW5oZXJpdCwgYnkgZGVmYXVsdCwgZnJvbSB0aGUgYmFzZSBjbGFzcyAib2JqZWN0IjsgaGVuY2UsXG5cbiAgIGNsYXNzIEZvbzpcbiAgICAgICBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgY2xhc3MgRm9vKG9iamVjdCk6XG4gICAgICAgcGFzc1xuXG5UaGUgY2xhc3NcJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb24gZnJhbWUgKHNlZVxuKk5hbWluZyBhbmQgYmluZGluZyopLCB1c2luZyBhIG5ld2x5IGNyZWF0ZWQgbG9jYWwgbmFtZXNwYWNlIGFuZCB0aGVcbm9yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUgY29udGFpbnMgbW9zdGx5XG5mdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzc1wncyBzdWl0ZSBmaW5pc2hlcyBleGVjdXRpb24sIGl0c1xuZXhlY3V0aW9uIGZyYW1lIGlzIGRpc2NhcmRlZCBidXQgaXRzIGxvY2FsIG5hbWVzcGFjZSBpcyBzYXZlZC4gWzRdIEFcbmNsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3QgZm9yIHRoZSBiYXNlXG5jbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkuXG5UaGUgY2xhc3MgbmFtZSBpcyBib3VuZCB0byB0aGlzIGNsYXNzIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbG9jYWxcbm5hbWVzcGFjZS5cblxuQ2xhc3MgY3JlYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgaGVhdmlseSB1c2luZyAqbWV0YWNsYXNzZXMqLlxuXG5DbGFzc2VzIGNhbiBhbHNvIGJlIGRlY29yYXRlZDoganVzdCBsaWtlIHdoZW4gZGVjb3JhdGluZyBmdW5jdGlvbnMsXG5cbiAgIEBmMShhcmcpXG4gICBAZjJcbiAgIGNsYXNzIEZvbzogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGNsYXNzIEZvbzogcGFzc1xuICAgRm9vID0gZjEoYXJnKShmMihGb28pKVxuXG5UaGUgZXZhbHVhdGlvbiBydWxlcyBmb3IgdGhlIGRlY29yYXRvciBleHByZXNzaW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yXG5mdW5jdGlvbiBkZWNvcmF0b3JzLiAgVGhlIHJlc3VsdCBtdXN0IGJlIGEgY2xhc3Mgb2JqZWN0LCB3aGljaCBpcyB0aGVuXG5ib3VuZCB0byB0aGUgY2xhc3MgbmFtZS5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gYXJlXG5jbGFzcyBhdHRyaWJ1dGVzOyB0aGV5IGFyZSBzaGFyZWQgYnkgaW5zdGFuY2VzLiAgSW5zdGFuY2UgYXR0cmlidXRlc1xuY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoICJzZWxmLm5hbWUgPSB2YWx1ZSIuICBCb3RoIGNsYXNzIGFuZFxuaW5zdGFuY2UgYXR0cmlidXRlcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBub3RhdGlvbiAiInNlbGYubmFtZSIiLFxuYW5kIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBoaWRlcyBhIGNsYXNzIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lIG5hbWVcbndoZW4gYWNjZXNzZWQgaW4gdGhpcyB3YXkuICBDbGFzcyBhdHRyaWJ1dGVzIGNhbiBiZSB1c2VkIGFzIGRlZmF1bHRzXG5mb3IgaW5zdGFuY2UgYXR0cmlidXRlcywgYnV0IHVzaW5nIG11dGFibGUgdmFsdWVzIHRoZXJlIGNhbiBsZWFkIHRvXG51bmV4cGVjdGVkIHJlc3VsdHMuICAqRGVzY3JpcHRvcnMqIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZVxudmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMyAqKlBFUCAzMTI5KiogLVxuICBDbGFzcyBEZWNvcmF0b3JzXG4nLAotICdjb21wYXJpc29ucyc6IHUnXG5Db21wYXJpc29uc1xuKioqKioqKioqKipcblxuVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksXG53aGljaCBpcyBsb3dlciB0aGFuIHRoYXQgb2YgYW55IGFyaXRobWV0aWMsIHNoaWZ0aW5nIG9yIGJpdHdpc2Vcbm9wZXJhdGlvbi4gIEFsc28gdW5saWtlIEMsIGV4cHJlc3Npb25zIGxpa2UgImEgPCBiIDwgYyIgaGF2ZSB0aGVcbmludGVycHJldGF0aW9uIHRoYXQgaXMgY29udmVudGlvbmFsIGluIG1hdGhlbWF0aWNzOlxuXG4gICBjb21wYXJpc29uICAgIDo6PSBvcl9leHByICggY29tcF9vcGVyYXRvciBvcl9leHByICkqXG4gICBjb21wX29wZXJhdG9yIDo6PSAiPCIgfCAiPiIgfCAiPT0iIHwgIj49IiB8ICI8PSIgfCAiIT0iXG4gICAgICAgICAgICAgICAgICAgICB8ICJpcyIgWyJub3QiXSB8IFsibm90Il0gImluIlxuXG5Db21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogIlRydWUiIG9yICJGYWxzZSIuXG5cbkNvbXBhcmlzb25zIGNhbiBiZSBjaGFpbmVkIGFyYml0cmFyaWx5LCBlLmcuLCAieCA8IHkgPD0geiIgaXNcbmVxdWl2YWxlbnQgdG8gInggPCB5IGFuZCB5IDw9IHoiLCBleGNlcHQgdGhhdCAieSIgaXMgZXZhbHVhdGVkIG9ubHlcbm9uY2UgKGJ1dCBpbiBib3RoIGNhc2VzICJ6IiBpcyBub3QgZXZhbHVhdGVkIGF0IGFsbCB3aGVuICJ4IDwgeSIgaXNcbmZvdW5kIHRvIGJlIGZhbHNlKS5cblxuRm9ybWFsbHksIGlmICphKiwgKmIqLCAqYyosIC4uLiwgKnkqLCAqeiogYXJlIGV4cHJlc3Npb25zIGFuZCAqb3AxKixcbipvcDIqLCAuLi4sICpvcE4qIGFyZSBjb21wYXJpc29uIG9wZXJhdG9ycywgdGhlbiAiYSBvcDEgYiBvcDIgYyAuLi4geVxub3BOIHoiIGlzIGVxdWl2YWxlbnQgdG8gImEgb3AxIGIgYW5kIGIgb3AyIGMgYW5kIC4uLiB5IG9wTiB6IiwgZXhjZXB0XG50aGF0IGVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgbW9zdCBvbmNlLlxuXG5Ob3RlIHRoYXQgImEgb3AxIGIgb3AyIGMiIGRvZXNuXCd0IGltcGx5IGFueSBraW5kIG9mIGNvbXBhcmlzb24gYmV0d2VlblxuKmEqIGFuZCAqYyosIHNvIHRoYXQsIGUuZy4sICJ4IDwgeSA+IHoiIGlzIHBlcmZlY3RseSBsZWdhbCAodGhvdWdoXG5wZXJoYXBzIG5vdCBwcmV0dHkpLlxuXG5cblZhbHVlIGNvbXBhcmlzb25zXG49PT09PT09PT09PT09PT09PVxuXG5UaGUgb3BlcmF0b3JzICI8IiwgIj4iLCAiPT0iLCAiPj0iLCAiPD0iLCBhbmQgIiE9IiBjb21wYXJlIHRoZSB2YWx1ZXNcbm9mIHR3byBvYmplY3RzLiAgVGhlIG9iamVjdHMgZG8gbm90IG5lZWQgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlLlxuXG5DaGFwdGVyICpPYmplY3RzLCB2YWx1ZXMgYW5kIHR5cGVzKiBzdGF0ZXMgdGhhdCBvYmplY3RzIGhhdmUgYSB2YWx1ZVxuKGluIGFkZGl0aW9uIHRvIHR5cGUgYW5kIGlkZW50aXR5KS4gIFRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgaXMgYVxucmF0aGVyIGFic3RyYWN0IG5vdGlvbiBpbiBQeXRob246IEZvciBleGFtcGxlLCB0aGVyZSBpcyBubyBjYW5vbmljYWxcbmFjY2VzcyBtZXRob2QgZm9yIGFuIG9iamVjdFwncyB2YWx1ZS4gIEFsc28sIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50XG50aGF0IHRoZSB2YWx1ZSBvZiBhbiBvYmplY3Qgc2hvdWxkIGJlIGNvbnN0cnVjdGVkIGluIGEgcGFydGljdWxhciB3YXksXG5lLmcuIGNvbXByaXNlZCBvZiBhbGwgaXRzIGRhdGEgYXR0cmlidXRlcy4gQ29tcGFyaXNvbiBvcGVyYXRvcnNcbmltcGxlbWVudCBhIHBhcnRpY3VsYXIgbm90aW9uIG9mIHdoYXQgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpcy4gIE9uZVxuY2FuIHRoaW5rIG9mIHRoZW0gYXMgZGVmaW5pbmcgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpbmRpcmVjdGx5LCBieVxubWVhbnMgb2YgdGhlaXIgY29tcGFyaXNvbiBpbXBsZW1lbnRhdGlvbi5cblxuQmVjYXVzZSBhbGwgdHlwZXMgYXJlIChkaXJlY3Qgb3IgaW5kaXJlY3QpIHN1YnR5cGVzIG9mICJvYmplY3QiLCB0aGV5XG5pbmhlcml0IHRoZSBkZWZhdWx0IGNvbXBhcmlzb24gYmVoYXZpb3IgZnJvbSAib2JqZWN0Ii4gIFR5cGVzIGNhblxuY3VzdG9taXplIHRoZWlyIGNvbXBhcmlzb24gYmVoYXZpb3IgYnkgaW1wbGVtZW50aW5nICpyaWNoIGNvbXBhcmlzb25cbm1ldGhvZHMqIGxpa2UgIl9fbHRfXygpIiwgZGVzY3JpYmVkIGluICpCYXNpYyBjdXN0b21pemF0aW9uKi5cblxuVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb24gKCI9PSIgYW5kICIhPSIpIGlzIGJhc2VkXG5vbiB0aGUgaWRlbnRpdHkgb2YgdGhlIG9iamVjdHMuICBIZW5jZSwgZXF1YWxpdHkgY29tcGFyaXNvbiBvZlxuaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUgaWRlbnRpdHkgcmVzdWx0cyBpbiBlcXVhbGl0eSwgYW5kIGVxdWFsaXR5XG5jb21wYXJpc29uIG9mIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBpZGVudGl0aWVzIHJlc3VsdHMgaW5cbmluZXF1YWxpdHkuICBBIG1vdGl2YXRpb24gZm9yIHRoaXMgZGVmYXVsdCBiZWhhdmlvciBpcyB0aGUgZGVzaXJlIHRoYXRcbmFsbCBvYmplY3RzIHNob3VsZCBiZSByZWZsZXhpdmUgKGkuZS4gInggaXMgeSIgaW1wbGllcyAieCA9PSB5IikuXG5cbkEgZGVmYXVsdCBvcmRlciBjb21wYXJpc29uICgiPCIsICI+IiwgIjw9IiwgYW5kICI+PSIpIGlzIG5vdCBwcm92aWRlZDtcbmFuIGF0dGVtcHQgcmFpc2VzICJUeXBlRXJyb3IiLiAgQSBtb3RpdmF0aW9uIGZvciB0aGlzIGRlZmF1bHQgYmVoYXZpb3JcbmlzIHRoZSBsYWNrIG9mIGEgc2ltaWxhciBpbnZhcmlhbnQgYXMgZm9yIGVxdWFsaXR5LlxuXG5UaGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgZXF1YWxpdHkgY29tcGFyaXNvbiwgdGhhdCBpbnN0YW5jZXMgd2l0aFxuZGlmZmVyZW50IGlkZW50aXRpZXMgYXJlIGFsd2F5cyB1bmVxdWFsLCBtYXkgYmUgaW4gY29udHJhc3QgdG8gd2hhdFxudHlwZXMgd2lsbCBuZWVkIHRoYXQgaGF2ZSBhIHNlbnNpYmxlIGRlZmluaXRpb24gb2Ygb2JqZWN0IHZhbHVlIGFuZFxudmFsdWUtYmFzZWQgZXF1YWxpdHkuICBTdWNoIHR5cGVzIHdpbGwgbmVlZCB0byBjdXN0b21pemUgdGhlaXJcbmNvbXBhcmlzb24gYmVoYXZpb3IsIGFuZCBpbiBmYWN0LCBhIG51bWJlciBvZiBidWlsdC1pbiB0eXBlcyBoYXZlIGRvbmVcbnRoYXQuXG5cblRoZSBmb2xsb3dpbmcgbGlzdCBkZXNjcmliZXMgdGhlIGNvbXBhcmlzb24gYmVoYXZpb3Igb2YgdGhlIG1vc3RcbmltcG9ydGFudCBidWlsdC1pbiB0eXBlcy5cblxuKiBOdW1iZXJzIG9mIGJ1aWx0LWluIG51bWVyaWMgdHlwZXMgKCpOdW1lcmljIFR5cGVzIC0tLSBpbnQsIGZsb2F0LFxuICBjb21wbGV4KikgYW5kIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHR5cGVzICJmcmFjdGlvbnMuRnJhY3Rpb24iIGFuZFxuICAiZGVjaW1hbC5EZWNpbWFsIiBjYW4gYmUgY29tcGFyZWQgd2l0aGluIGFuZCBhY3Jvc3MgdGhlaXIgdHlwZXMsXG4gIHdpdGggdGhlIHJlc3RyaWN0aW9uIHRoYXQgY29tcGxleCBudW1iZXJzIGRvIG5vdCBzdXBwb3J0IG9yZGVyXG4gIGNvbXBhcmlzb24uICBXaXRoaW4gdGhlIGxpbWl0cyBvZiB0aGUgdHlwZXMgaW52b2x2ZWQsIHRoZXkgY29tcGFyZVxuICBtYXRoZW1hdGljYWxseSAoYWxnb3JpdGhtaWNhbGx5KSBjb3JyZWN0IHdpdGhvdXQgbG9zcyBvZiBwcmVjaXNpb24uXG5cbiAgVGhlIG5vdC1hLW51bWJlciB2YWx1ZXMgImZsb2F0KFwnTmFOXCcpIiBhbmQgIkRlY2ltYWwoXCdOYU5cJykiIGFyZVxuICBzcGVjaWFsLiAgVGhleSBhcmUgaWRlbnRpY2FsIHRvIHRoZW1zZWx2ZXMgKCJ4IGlzIHgiIGlzIHRydWUpIGJ1dFxuICBhcmUgbm90IGVxdWFsIHRvIHRoZW1zZWx2ZXMgKCJ4ID09IHgiIGlzIGZhbHNlKS4gIEFkZGl0aW9uYWxseSxcbiAgY29tcGFyaW5nIGFueSBudW1iZXIgdG8gYSBub3QtYS1udW1iZXIgdmFsdWUgd2lsbCByZXR1cm4gIkZhbHNlIi5cbiAgRm9yIGV4YW1wbGUsIGJvdGggIjMgPCBmbG9hdChcJ05hTlwnKSIgYW5kICJmbG9hdChcJ05hTlwnKSA8IDMiIHdpbGxcbiAgcmV0dXJuICJGYWxzZSIuXG5cbiogQmluYXJ5IHNlcXVlbmNlcyAoaW5zdGFuY2VzIG9mICJieXRlcyIgb3IgImJ5dGVhcnJheSIpIGNhbiBiZVxuICBjb21wYXJlZCB3aXRoaW4gYW5kIGFjcm9zcyB0aGVpciB0eXBlcy4gIFRoZXkgY29tcGFyZVxuICBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgdGhlaXIgZWxlbWVudHMuXG5cbiogU3RyaW5ncyAoaW5zdGFuY2VzIG9mICJzdHIiKSBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIHRoZVxuICBudW1lcmljYWwgVW5pY29kZSBjb2RlIHBvaW50cyAodGhlIHJlc3VsdCBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb25cbiAgIm9yZCgpIikgb2YgdGhlaXIgY2hhcmFjdGVycy4gWzNdXG5cbiAgU3RyaW5ncyBhbmQgYmluYXJ5IHNlcXVlbmNlcyBjYW5ub3QgYmUgZGlyZWN0bHkgY29tcGFyZWQuXG5cbiogU2VxdWVuY2VzIChpbnN0YW5jZXMgb2YgInR1cGxlIiwgImxpc3QiLCBvciAicmFuZ2UiKSBjYW4gYmVcbiAgY29tcGFyZWQgb25seSB3aXRoaW4gZWFjaCBvZiB0aGVpciB0eXBlcywgd2l0aCB0aGUgcmVzdHJpY3Rpb24gdGhhdFxuICByYW5nZXMgZG8gbm90IHN1cHBvcnQgb3JkZXIgY29tcGFyaXNvbi4gIEVxdWFsaXR5IGNvbXBhcmlzb24gYWNyb3NzXG4gIHRoZXNlIHR5cGVzIHJlc3VsdHMgaW4gdW5lcXVhbGl0eSwgYW5kIG9yZGVyaW5nIGNvbXBhcmlzb24gYWNyb3NzXG4gIHRoZXNlIHR5cGVzIHJhaXNlcyAiVHlwZUVycm9yIi5cblxuICBTZXF1ZW5jZXMgY29tcGFyZSBsZXhpY29ncmFwaGljYWxseSB1c2luZyBjb21wYXJpc29uIG9mXG4gIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMsIHdoZXJlYnkgcmVmbGV4aXZpdHkgb2YgdGhlIGVsZW1lbnRzIGlzXG4gIGVuZm9yY2VkLlxuXG4gIEluIGVuZm9yY2luZyByZWZsZXhpdml0eSBvZiBlbGVtZW50cywgdGhlIGNvbXBhcmlzb24gb2YgY29sbGVjdGlvbnNcbiAgYXNzdW1lcyB0aGF0IGZvciBhIGNvbGxlY3Rpb24gZWxlbWVudCAieCIsICJ4ID09IHgiIGlzIGFsd2F5cyB0cnVlLlxuICBCYXNlZCBvbiB0aGF0IGFzc3VtcHRpb24sIGVsZW1lbnQgaWRlbnRpdHkgaXMgY29tcGFyZWQgZmlyc3QsIGFuZFxuICBlbGVtZW50IGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkIG9ubHkgZm9yIGRpc3RpbmN0IGVsZW1lbnRzLiAgVGhpc1xuICBhcHByb2FjaCB5aWVsZHMgdGhlIHNhbWUgcmVzdWx0IGFzIGEgc3RyaWN0IGVsZW1lbnQgY29tcGFyaXNvblxuICB3b3VsZCwgaWYgdGhlIGNvbXBhcmVkIGVsZW1lbnRzIGFyZSByZWZsZXhpdmUuICBGb3Igbm9uLXJlZmxleGl2ZVxuICBlbGVtZW50cywgdGhlIHJlc3VsdCBpcyBkaWZmZXJlbnQgdGhhbiBmb3Igc3RyaWN0IGVsZW1lbnRcbiAgY29tcGFyaXNvbiwgYW5kIG1heSBiZSBzdXJwcmlzaW5nOiAgVGhlIG5vbi1yZWZsZXhpdmUgbm90LWEtbnVtYmVyXG4gIHZhbHVlcyBmb3IgZXhhbXBsZSByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBjb21wYXJpc29uIGJlaGF2aW9yIHdoZW5cbiAgdXNlZCBpbiBhIGxpc3Q6XG5cbiAgICAgPj4+IG5hbiA9IGZsb2F0KFwnTmFOXCcpXG4gICAgID4+PiBuYW4gaXMgbmFuXG4gICAgIFRydWVcbiAgICAgPj4+IG5hbiA9PSBuYW5cbiAgICAgRmFsc2UgICAgICAgICAgICAgICAgIDwtLSB0aGUgZGVmaW5lZCBub24tcmVmbGV4aXZlIGJlaGF2aW9yIG9mIE5hTlxuICAgICA+Pj4gW25hbl0gPT0gW25hbl1cbiAgICAgVHJ1ZSAgICAgICAgICAgICAgICAgIDwtLSBsaXN0IGVuZm9yY2VzIHJlZmxleGl2aXR5IGFuZCB0ZXN0cyBpZGVudGl0eSBmaXJzdFxuXG4gIExleGljb2dyYXBoaWNhbCBjb21wYXJpc29uIGJldHdlZW4gYnVpbHQtaW4gY29sbGVjdGlvbnMgd29ya3MgYXNcbiAgZm9sbG93czpcblxuICAqIEZvciB0d28gY29sbGVjdGlvbnMgdG8gY29tcGFyZSBlcXVhbCwgdGhleSBtdXN0IGJlIG9mIHRoZSBzYW1lXG4gICAgdHlwZSwgaGF2ZSB0aGUgc2FtZSBsZW5ndGgsIGFuZCBlYWNoIHBhaXIgb2YgY29ycmVzcG9uZGluZ1xuICAgIGVsZW1lbnRzIG11c3QgY29tcGFyZSBlcXVhbCAoZm9yIGV4YW1wbGUsICJbMSwyXSA9PSAoMSwyKSIgaXNcbiAgICBmYWxzZSBiZWNhdXNlIHRoZSB0eXBlIGlzIG5vdCB0aGUgc2FtZSkuXG5cbiAgKiBDb2xsZWN0aW9ucyB0aGF0IHN1cHBvcnQgb3JkZXIgY29tcGFyaXNvbiBhcmUgb3JkZXJlZCB0aGUgc2FtZVxuICAgIGFzIHRoZWlyIGZpcnN0IHVuZXF1YWwgZWxlbWVudHMgKGZvciBleGFtcGxlLCAiWzEsMix4XSA8PSBbMSwyLHldIlxuICAgIGhhcyB0aGUgc2FtZSB2YWx1ZSBhcyAieCA8PSB5IikuICBJZiBhIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkb2VzXG4gICAgbm90IGV4aXN0LCB0aGUgc2hvcnRlciBjb2xsZWN0aW9uIGlzIG9yZGVyZWQgZmlyc3QgKGZvciBleGFtcGxlLFxuICAgICJbMSwyXSA8IFsxLDIsM10iIGlzIHRydWUpLlxuXG4qIE1hcHBpbmdzIChpbnN0YW5jZXMgb2YgImRpY3QiKSBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZXlcbiAgaGF2ZSBlcXVhbCAqKGtleSwgdmFsdWUpKiBwYWlycy4gRXF1YWxpdHkgY29tcGFyaXNvbiBvZiB0aGUga2V5cyBhbmRcbiAgZWxlbWVudHMgZW5mb3JjZXMgcmVmbGV4aXZpdHkuXG5cbiAgT3JkZXIgY29tcGFyaXNvbnMgKCI8IiwgIj4iLCAiPD0iLCBhbmQgIj49IikgcmFpc2UgIlR5cGVFcnJvciIuXG5cbiogU2V0cyAoaW5zdGFuY2VzIG9mICJzZXQiIG9yICJmcm96ZW5zZXQiKSBjYW4gYmUgY29tcGFyZWQgd2l0aGluXG4gIGFuZCBhY3Jvc3MgdGhlaXIgdHlwZXMuXG5cbiAgVGhleSBkZWZpbmUgb3JkZXIgY29tcGFyaXNvbiBvcGVyYXRvcnMgdG8gbWVhbiBzdWJzZXQgYW5kIHN1cGVyc2V0XG4gIHRlc3RzLiAgVGhvc2UgcmVsYXRpb25zIGRvIG5vdCBkZWZpbmUgdG90YWwgb3JkZXJpbmdzIChmb3IgZXhhbXBsZSxcbiAgdGhlIHR3byBzZXRzICJ7MSwyfSIgYW5kICJ7MiwzfSIgYXJlIG5vdCBlcXVhbCwgbm9yIHN1YnNldHMgb2Ygb25lXG4gIGFub3RoZXIsIG5vciBzdXBlcnNldHMgb2Ygb25lIGFub3RoZXIpLiAgQWNjb3JkaW5nbHksIHNldHMgYXJlIG5vdFxuICBhcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZXBlbmQgb24gdG90YWwgb3JkZXJpbmdcbiAgKGZvciBleGFtcGxlLCAibWluKCkiLCAibWF4KCkiLCBhbmQgInNvcnRlZCgpIiBwcm9kdWNlIHVuZGVmaW5lZFxuICByZXN1bHRzIGdpdmVuIGEgbGlzdCBvZiBzZXRzIGFzIGlucHV0cykuXG5cbiAgQ29tcGFyaXNvbiBvZiBzZXRzIGVuZm9yY2VzIHJlZmxleGl2aXR5IG9mIGl0cyBlbGVtZW50cy5cblxuKiBNb3N0IG90aGVyIGJ1aWx0LWluIHR5cGVzIGhhdmUgbm8gY29tcGFyaXNvbiBtZXRob2RzIGltcGxlbWVudGVkLFxuICBzbyB0aGV5IGluaGVyaXQgdGhlIGRlZmF1bHQgY29tcGFyaXNvbiBiZWhhdmlvci5cblxuVXNlci1kZWZpbmVkIGNsYXNzZXMgdGhhdCBjdXN0b21pemUgdGhlaXIgY29tcGFyaXNvbiBiZWhhdmlvciBzaG91bGRcbmZvbGxvdyBzb21lIGNvbnNpc3RlbmN5IHJ1bGVzLCBpZiBwb3NzaWJsZTpcblxuKiBFcXVhbGl0eSBjb21wYXJpc29uIHNob3VsZCBiZSByZWZsZXhpdmUuIEluIG90aGVyIHdvcmRzLCBpZGVudGljYWxcbiAgb2JqZWN0cyBzaG91bGQgY29tcGFyZSBlcXVhbDpcblxuICAgICAieCBpcyB5IiBpbXBsaWVzICJ4ID09IHkiXG5cbiogQ29tcGFyaXNvbiBzaG91bGQgYmUgc3ltbWV0cmljLiBJbiBvdGhlciB3b3JkcywgdGhlIGZvbGxvd2luZ1xuICBleHByZXNzaW9ucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSByZXN1bHQ6XG5cbiAgICAgInggPT0geSIgYW5kICJ5ID09IHgiXG5cbiAgICAgInggIT0geSIgYW5kICJ5ICE9IHgiXG5cbiAgICAgInggPCB5IiBhbmQgInkgPiB4IlxuXG4gICAgICJ4IDw9IHkiIGFuZCAieSA+PSB4IlxuXG4qIENvbXBhcmlzb24gc2hvdWxkIGJlIHRyYW5zaXRpdmUuIFRoZSBmb2xsb3dpbmcgKG5vbi1leGhhdXN0aXZlKVxuICBleGFtcGxlcyBpbGx1c3RyYXRlIHRoYXQ6XG5cbiAgICAgInggPiB5IGFuZCB5ID4geiIgaW1wbGllcyAieCA+IHoiXG5cbiAgICAgInggPCB5IGFuZCB5IDw9IHoiIGltcGxpZXMgInggPCB6IlxuXG4qIEludmVyc2UgY29tcGFyaXNvbiBzaG91bGQgcmVzdWx0IGluIHRoZSBib29sZWFuIG5lZ2F0aW9uLiBJbiBvdGhlclxuICB3b3JkcywgdGhlIGZvbGxvd2luZyBleHByZXNzaW9ucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSByZXN1bHQ6XG5cbiAgICAgInggPT0geSIgYW5kICJub3QgeCAhPSB5IlxuXG4gICAgICJ4IDwgeSIgYW5kICJub3QgeCA+PSB5IiAoZm9yIHRvdGFsIG9yZGVyaW5nKVxuXG4gICAgICJ4ID4geSIgYW5kICJub3QgeCA8PSB5IiAoZm9yIHRvdGFsIG9yZGVyaW5nKVxuXG4gIFRoZSBsYXN0IHR3byBleHByZXNzaW9ucyBhcHBseSB0byB0b3RhbGx5IG9yZGVyZWQgY29sbGVjdGlvbnMgKGUuZy5cbiAgdG8gc2VxdWVuY2VzLCBidXQgbm90IHRvIHNldHMgb3IgbWFwcGluZ3MpLiBTZWUgYWxzbyB0aGVcbiAgInRvdGFsX29yZGVyaW5nKCkiIGRlY29yYXRvci5cblxuUHl0aG9uIGRvZXMgbm90IGVuZm9yY2UgdGhlc2UgY29uc2lzdGVuY3kgcnVsZXMuIEluIGZhY3QsIHRoZVxubm90LWEtbnVtYmVyIHZhbHVlcyBhcmUgYW4gZXhhbXBsZSBmb3Igbm90IGZvbGxvd2luZyB0aGVzZSBydWxlcy5cblxuXG5NZW1iZXJzaGlwIHRlc3Qgb3BlcmF0aW9uc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG9wZXJhdG9ycyAiaW4iIGFuZCAibm90IGluIiB0ZXN0IGZvciBtZW1iZXJzaGlwLiAgInggaW4gcyJcbmV2YWx1YXRlcyB0byB0cnVlIGlmICp4KiBpcyBhIG1lbWJlciBvZiAqcyosIGFuZCBmYWxzZSBvdGhlcndpc2UuICAieFxubm90IGluIHMiIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mICJ4IGluIHMiLiAgQWxsIGJ1aWx0LWluIHNlcXVlbmNlc1xuYW5kIHNldCB0eXBlcyBzdXBwb3J0IHRoaXMgYXMgd2VsbCBhcyBkaWN0aW9uYXJ5LCBmb3Igd2hpY2ggImluIiB0ZXN0c1xud2hldGhlciB0aGUgZGljdGlvbmFyeSBoYXMgYSBnaXZlbiBrZXkuIEZvciBjb250YWluZXIgdHlwZXMgc3VjaCBhc1xubGlzdCwgdHVwbGUsIHNldCwgZnJvemVuc2V0LCBkaWN0LCBvciBjb2xsZWN0aW9ucy5kZXF1ZSwgdGhlXG5leHByZXNzaW9uICJ4IGluIHkiIGlzIGVxdWl2YWxlbnQgdG8gImFueSh4IGlzIGUgb3IgeCA9PSBlIGZvciBlIGluXG55KSIuXG5cbkZvciB0aGUgc3RyaW5nIGFuZCBieXRlcyB0eXBlcywgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogaXNcbmEgc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyAieS5maW5kKHgpICE9IC0xIi4gIEVtcHR5XG5zdHJpbmdzIGFyZSBhbHdheXMgY29uc2lkZXJlZCB0byBiZSBhIHN1YnN0cmluZyBvZiBhbnkgb3RoZXIgc3RyaW5nLFxuc28gIiIiIGluICJhYmMiIiB3aWxsIHJldHVybiAiVHJ1ZSIuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlICJfX2NvbnRhaW5zX18oKSIgbWV0aG9kLCAieFxuaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAieS5fX2NvbnRhaW5zX18oeCkiIGlzIHRydWUuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkbyBub3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIgYnV0IGRvXG5kZWZpbmUgIl9faXRlcl9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIHNvbWUgdmFsdWUgInoiIHdpdGggInggPT0geiJcbmlzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZyBvdmVyICJ5Ii4gIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWRcbmR1cmluZyB0aGUgaXRlcmF0aW9uLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbi5cblxuTGFzdGx5LCB0aGUgb2xkLXN0eWxlIGl0ZXJhdGlvbiBwcm90b2NvbCBpcyB0cmllZDogaWYgYSBjbGFzcyBkZWZpbmVzXG4iX19nZXRpdGVtX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBub24tXG5uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4ICppKiBzdWNoIHRoYXQgInggPT0geVtpXSIsIGFuZCBhbGwgbG93ZXJcbmludGVnZXIgaW5kaWNlcyBkbyBub3QgcmFpc2UgIkluZGV4RXJyb3IiIGV4Y2VwdGlvbi4gIChJZiBhbnkgb3RoZXJcbmV4Y2VwdGlvbiBpcyByYWlzZWQsIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uKS5cblxuVGhlIG9wZXJhdG9yICJub3QgaW4iIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnVlIHZhbHVlIG9mXG4iaW4iLlxuXG5cbklkZW50aXR5IGNvbXBhcmlzb25zXG49PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb3BlcmF0b3JzICJpcyIgYW5kICJpcyBub3QiIHRlc3QgZm9yIG9iamVjdCBpZGVudGl0eTogInggaXMgeSIgaXNcbnRydWUgaWYgYW5kIG9ubHkgaWYgKngqIGFuZCAqeSogYXJlIHRoZSBzYW1lIG9iamVjdC4gICJ4IGlzIG5vdCB5IlxueWllbGRzIHRoZSBpbnZlcnNlIHRydXRoIHZhbHVlLiBbNF1cbicsCi0gJ2NvbXBvdW5kJzogdSdcbkNvbXBvdW5kIHN0YXRlbWVudHNcbioqKioqKioqKioqKioqKioqKipcblxuQ29tcG91bmQgc3RhdGVtZW50cyBjb250YWluIChncm91cHMgb2YpIG90aGVyIHN0YXRlbWVudHM7IHRoZXkgYWZmZWN0XG5vciBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhvc2Ugb3RoZXIgc3RhdGVtZW50cyBpbiBzb21lIHdheS4gIEluXG5nZW5lcmFsLCBjb21wb3VuZCBzdGF0ZW1lbnRzIHNwYW4gbXVsdGlwbGUgbGluZXMsIGFsdGhvdWdoIGluIHNpbXBsZVxuaW5jYXJuYXRpb25zIGEgd2hvbGUgY29tcG91bmQgc3RhdGVtZW50IG1heSBiZSBjb250YWluZWQgaW4gb25lIGxpbmUuXG5cblRoZSAiaWYiLCAid2hpbGUiIGFuZCAiZm9yIiBzdGF0ZW1lbnRzIGltcGxlbWVudCB0cmFkaXRpb25hbCBjb250cm9sXG5mbG93IGNvbnN0cnVjdHMuICAidHJ5IiBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwXG5jb2RlIGZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHMsIHdoaWxlIHRoZSAid2l0aCIgc3RhdGVtZW50IGFsbG93cyB0aGVcbmV4ZWN1dGlvbiBvZiBpbml0aWFsaXphdGlvbiBhbmQgZmluYWxpemF0aW9uIGNvZGUgYXJvdW5kIGEgYmxvY2sgb2ZcbmNvZGUuICBGdW5jdGlvbiBhbmQgY2xhc3MgZGVmaW5pdGlvbnMgYXJlIGFsc28gc3ludGFjdGljYWxseSBjb21wb3VuZFxuc3RhdGVtZW50cy5cblxuQSBjb21wb3VuZCBzdGF0ZW1lbnQgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgXCdjbGF1c2VzLlwnICBBIGNsYXVzZVxuY29uc2lzdHMgb2YgYSBoZWFkZXIgYW5kIGEgXCdzdWl0ZS5cJyAgVGhlIGNsYXVzZSBoZWFkZXJzIG9mIGFcbnBhcnRpY3VsYXIgY29tcG91bmQgc3RhdGVtZW50IGFyZSBhbGwgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gbGV2ZWwuXG5FYWNoIGNsYXVzZSBoZWFkZXIgYmVnaW5zIHdpdGggYSB1bmlxdWVseSBpZGVudGlmeWluZyBrZXl3b3JkIGFuZCBlbmRzXG53aXRoIGEgY29sb24uICBBIHN1aXRlIGlzIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cyBjb250cm9sbGVkIGJ5IGFcbmNsYXVzZS4gIEEgc3VpdGUgY2FuIGJlIG9uZSBvciBtb3JlIHNlbWljb2xvbi1zZXBhcmF0ZWQgc2ltcGxlXG5zdGF0ZW1lbnRzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGhlYWRlciwgZm9sbG93aW5nIHRoZSBoZWFkZXJcJ3NcbmNvbG9uLCBvciBpdCBjYW4gYmUgb25lIG9yIG1vcmUgaW5kZW50ZWQgc3RhdGVtZW50cyBvbiBzdWJzZXF1ZW50XG5saW5lcy4gIE9ubHkgdGhlIGxhdHRlciBmb3JtIG9mIGEgc3VpdGUgY2FuIGNvbnRhaW4gbmVzdGVkIGNvbXBvdW5kXG5zdGF0ZW1lbnRzOyB0aGUgZm9sbG93aW5nIGlzIGlsbGVnYWwsIG1vc3RseSBiZWNhdXNlIGl0IHdvdWxkblwndCBiZVxuY2xlYXIgdG8gd2hpY2ggImlmIiBjbGF1c2UgYSBmb2xsb3dpbmcgImVsc2UiIGNsYXVzZSB3b3VsZCBiZWxvbmc6XG5cbiAgIGlmIHRlc3QxOiBpZiB0ZXN0MjogcHJpbnQoeClcblxuQWxzbyBub3RlIHRoYXQgdGhlIHNlbWljb2xvbiBiaW5kcyB0aWdodGVyIHRoYW4gdGhlIGNvbG9uIGluIHRoaXNcbmNvbnRleHQsIHNvIHRoYXQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBlaXRoZXIgYWxsIG9yIG5vbmUgb2YgdGhlXG4icHJpbnQoKSIgY2FsbHMgYXJlIGV4ZWN1dGVkOlxuXG4gICBpZiB4IDwgeSA8IHo6IHByaW50KHgpOyBwcmludCh5KTsgcHJpbnQoeilcblxuU3VtbWFyaXppbmc6XG5cbiAgIGNvbXBvdW5kX3N0bXQgOjo9IGlmX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgd2hpbGVfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBmb3Jfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCB0cnlfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCB3aXRoX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgZnVuY2RlZlxuICAgICAgICAgICAgICAgICAgICAgfCBjbGFzc2RlZlxuICAgICAgICAgICAgICAgICAgICAgfCBhc3luY193aXRoX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNfZm9yX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNfZnVuY2RlZlxuICAgc3VpdGUgICAgICAgICA6Oj0gc3RtdF9saXN0IE5FV0xJTkUgfCBORVdMSU5FIElOREVOVCBzdGF0ZW1lbnQrIERFREVOVFxuICAgc3RhdGVtZW50ICAgICA6Oj0gc3RtdF9saXN0IE5FV0xJTkUgfCBjb21wb3VuZF9zdG10XG4gICBzdG10X2xpc3QgICAgIDo6PSBzaW1wbGVfc3RtdCAoIjsiIHNpbXBsZV9zdG10KSogWyI7Il1cblxuTm90ZSB0aGF0IHN0YXRlbWVudHMgYWx3YXlzIGVuZCBpbiBhICJORVdMSU5FIiBwb3NzaWJseSBmb2xsb3dlZCBieSBhXG4iREVERU5UIi4gIEFsc28gbm90ZSB0aGF0IG9wdGlvbmFsIGNvbnRpbnVhdGlvbiBjbGF1c2VzIGFsd2F5cyBiZWdpblxud2l0aCBhIGtleXdvcmQgdGhhdCBjYW5ub3Qgc3RhcnQgYSBzdGF0ZW1lbnQsIHRodXMgdGhlcmUgYXJlIG5vXG5hbWJpZ3VpdGllcyAodGhlIFwnZGFuZ2xpbmcgImVsc2UiXCcgcHJvYmxlbSBpcyBzb2x2ZWQgaW4gUHl0aG9uIGJ5XG5yZXF1aXJpbmcgbmVzdGVkICJpZiIgc3RhdGVtZW50cyB0byBiZSBpbmRlbnRlZCkuXG5cblRoZSBmb3JtYXR0aW5nIG9mIHRoZSBncmFtbWFyIHJ1bGVzIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgcGxhY2VzXG5lYWNoIGNsYXVzZSBvbiBhIHNlcGFyYXRlIGxpbmUgZm9yIGNsYXJpdHkuXG5cblxuVGhlICJpZiIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT1cblxuVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcblxuICAgaWZfc3RtdCA6Oj0gImlmIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbiAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5JdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgb25lXG5ieSBvbmUgdW50aWwgb25lIGlzIGZvdW5kIHRvIGJlIHRydWUgKHNlZSBzZWN0aW9uICpCb29sZWFuIG9wZXJhdGlvbnMqXG5mb3IgdGhlIGRlZmluaXRpb24gb2YgdHJ1ZSBhbmQgZmFsc2UpOyB0aGVuIHRoYXQgc3VpdGUgaXMgZXhlY3V0ZWRcbihhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbklmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWZcbnByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuXG5cblRoZSAid2hpbGUiIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PT09XG5cblRoZSAid2hpbGUiIHN0YXRlbWVudCBpcyB1c2VkIGZvciByZXBlYXRlZCBleGVjdXRpb24gYXMgbG9uZyBhcyBhblxuZXhwcmVzc2lvbiBpcyB0cnVlOlxuXG4gICB3aGlsZV9zdG10IDo6PSAid2hpbGUiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhpcyByZXBlYXRlZGx5IHRlc3RzIHRoZSBleHByZXNzaW9uIGFuZCwgaWYgaXQgaXMgdHJ1ZSwgZXhlY3V0ZXMgdGhlXG5maXJzdCBzdWl0ZTsgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UgKHdoaWNoIG1heSBiZSB0aGUgZmlyc3QgdGltZVxuaXQgaXMgdGVzdGVkKSB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkXG5hbmQgdGhlIGxvb3AgdGVybWluYXRlcy5cblxuQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2VcJ3Mgc3VpdGUuICBBICJjb250aW51ZSIgc3RhdGVtZW50XG5leGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBnb2VzIGJhY2tcbnRvIHRlc3RpbmcgdGhlIGV4cHJlc3Npb24uXG5cblxuVGhlICJmb3IiIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PVxuXG5UaGUgImZvciIgc3RhdGVtZW50IGlzIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlXG4oc3VjaCBhcyBhIHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3Igb3RoZXIgaXRlcmFibGUgb2JqZWN0OlxuXG4gICBmb3Jfc3RtdCA6Oj0gImZvciIgdGFyZ2V0X2xpc3QgImluIiBleHByZXNzaW9uX2xpc3QgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoZSBleHByZXNzaW9uIGxpc3QgaXMgZXZhbHVhdGVkIG9uY2U7IGl0IHNob3VsZCB5aWVsZCBhbiBpdGVyYWJsZVxub2JqZWN0LiAgQW4gaXRlcmF0b3IgaXMgY3JlYXRlZCBmb3IgdGhlIHJlc3VsdCBvZiB0aGVcbiJleHByZXNzaW9uX2xpc3QiLiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaCBpdGVtXG5wcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IuICBFYWNoXG5pdGVtIGluIHR1cm4gaXMgYXNzaWduZWQgdG8gdGhlIHRhcmdldCBsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlc1xuZm9yIGFzc2lnbm1lbnRzIChzZWUgKkFzc2lnbm1lbnQgc3RhdGVtZW50cyopLCBhbmQgdGhlbiB0aGUgc3VpdGUgaXNcbmV4ZWN1dGVkLiAgV2hlbiB0aGUgaXRlbXMgYXJlIGV4aGF1c3RlZCAod2hpY2ggaXMgaW1tZWRpYXRlbHkgd2hlbiB0aGVcbnNlcXVlbmNlIGlzIGVtcHR5IG9yIGFuIGl0ZXJhdG9yIHJhaXNlcyBhICJTdG9wSXRlcmF0aW9uIiBleGNlcHRpb24pLFxudGhlIHN1aXRlIGluIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZCwgYW5kIHRoZSBsb29wXG50ZXJtaW5hdGVzLlxuXG5BICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnRcbmV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGNvbnRpbnVlc1xud2l0aCB0aGUgbmV4dCBpdGVtLCBvciB3aXRoIHRoZSAiZWxzZSIgY2xhdXNlIGlmIHRoZXJlIGlzIG5vIG5leHRcbml0ZW0uXG5cblRoZSBmb3ItbG9vcCBtYWtlcyBhc3NpZ25tZW50cyB0byB0aGUgdmFyaWFibGVzKHMpIGluIHRoZSB0YXJnZXQgbGlzdC5cblRoaXMgb3ZlcndyaXRlcyBhbGwgcHJldmlvdXMgYXNzaWdubWVudHMgdG8gdGhvc2UgdmFyaWFibGVzIGluY2x1ZGluZ1xudGhvc2UgbWFkZSBpbiB0aGUgc3VpdGUgb2YgdGhlIGZvci1sb29wOlxuXG4gICBmb3IgaSBpbiByYW5nZSgxMCk6XG4gICAgICAgcHJpbnQoaSlcbiAgICAgICBpID0gNSAgICAgICAgICAgICAjIHRoaXMgd2lsbCBub3QgYWZmZWN0IHRoZSBmb3ItbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSBpIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kZXggaW4gdGhlIHJhbmdlXG5cbk5hbWVzIGluIHRoZSB0YXJnZXQgbGlzdCBhcmUgbm90IGRlbGV0ZWQgd2hlbiB0aGUgbG9vcCBpcyBmaW5pc2hlZCxcbmJ1dCBpZiB0aGUgc2VxdWVuY2UgaXMgZW1wdHksIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGF0XG5hbGwgYnkgdGhlIGxvb3AuICBIaW50OiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gInJhbmdlKCkiIHJldHVybnMgYW5cbml0ZXJhdG9yIG9mIGludGVnZXJzIHN1aXRhYmxlIHRvIGVtdWxhdGUgdGhlIGVmZmVjdCBvZiBQYXNjYWxcJ3MgImZvciBpXG46PSBhIHRvIGIgZG8iOyBlLmcuLCAibGlzdChyYW5nZSgzKSkiIHJldHVybnMgdGhlIGxpc3QgIlswLCAxLCAyXSIuXG5cbk5vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlXG4gIGxvb3AgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gIEFuXG4gIGludGVybmFsIGNvdW50ZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGl0ZW0gaXMgdXNlZCBuZXh0LFxuICBhbmQgdGhpcyBpcyBpbmNyZW1lbnRlZCBvbiBlYWNoIGl0ZXJhdGlvbi4gIFdoZW4gdGhpcyBjb3VudGVyIGhhc1xuICByZWFjaGVkIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIHRoZSBsb29wIHRlcm1pbmF0ZXMuICBUaGlzIG1lYW5zXG4gIHRoYXQgaWYgdGhlIHN1aXRlIGRlbGV0ZXMgdGhlIGN1cnJlbnQgKG9yIGEgcHJldmlvdXMpIGl0ZW0gZnJvbSB0aGVcbiAgc2VxdWVuY2UsIHRoZSBuZXh0IGl0ZW0gd2lsbCBiZSBza2lwcGVkIChzaW5jZSBpdCBnZXRzIHRoZSBpbmRleCBvZlxuICB0aGUgY3VycmVudCBpdGVtIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gdHJlYXRlZCkuICBMaWtld2lzZSwgaWYgdGhlXG4gIHN1aXRlIGluc2VydHMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UgYmVmb3JlIHRoZSBjdXJyZW50IGl0ZW0sIHRoZVxuICBjdXJyZW50IGl0ZW0gd2lsbCBiZSB0cmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcC5cbiAgVGhpcyBjYW4gbGVhZCB0byBuYXN0eSBidWdzIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIGFcbiAgdGVtcG9yYXJ5IGNvcHkgdXNpbmcgYSBzbGljZSBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIGUuZy4sXG5cbiAgICAgZm9yIHggaW4gYVs6XTpcbiAgICAgICAgIGlmIHggPCAwOiBhLnJlbW92ZSh4KVxuXG5cblRoZSAidHJ5IiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT1cblxuVGhlICJ0cnkiIHN0YXRlbWVudCBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwIGNvZGVcbmZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6XG5cbiAgIHRyeV9zdG10ICA6Oj0gdHJ5MV9zdG10IHwgdHJ5Ml9zdG10XG4gICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgW2V4cHJlc3Npb24gWyJhcyIgaWRlbnRpZmllcl1dICI6IiBzdWl0ZSkrXG4gICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV1cbiAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICJmaW5hbGx5IiAiOiIgc3VpdGVcblxuVGhlICJleGNlcHQiIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4Y2VwdGlvbiBoYW5kbGVycy4gV2hlbiBub1xuZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgY2xhdXNlLCBubyBleGNlcHRpb24gaGFuZGxlciBpc1xuZXhlY3V0ZWQuIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgc3VpdGUsIGEgc2VhcmNoIGZvciBhblxuZXhjZXB0aW9uIGhhbmRsZXIgaXMgc3RhcnRlZC4gIFRoaXMgc2VhcmNoIGluc3BlY3RzIHRoZSBleGNlcHQgY2xhdXNlc1xuaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uICBBbiBleHByZXNzaW9uLVxubGVzcyBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXMgYW55XG5leGNlcHRpb24uICBGb3IgYW4gZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXQgZXhwcmVzc2lvblxuaXMgZXZhbHVhdGVkLCBhbmQgdGhlIGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24gaWYgdGhlIHJlc3VsdGluZ1xub2JqZWN0IGlzICJjb21wYXRpYmxlIiB3aXRoIHRoZSBleGNlcHRpb24uICBBbiBvYmplY3QgaXMgY29tcGF0aWJsZVxud2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIGNsYXNzIG9yIGEgYmFzZSBjbGFzcyBvZiB0aGUgZXhjZXB0aW9uXG5vYmplY3Qgb3IgYSB0dXBsZSBjb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZSBleGNlcHRpb24uXG5cbklmIG5vIGV4Y2VwdCBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLCB0aGUgc2VhcmNoIGZvciBhbiBleGNlcHRpb25cbmhhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUgaW52b2NhdGlvbiBzdGFjay5cblsxXVxuXG5JZiB0aGUgZXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIGluIHRoZSBoZWFkZXIgb2YgYW4gZXhjZXB0IGNsYXVzZVxucmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgYSBoYW5kbGVyIGlzIGNhbmNlbGVkIGFuZFxuYSBzZWFyY2ggc3RhcnRzIGZvciB0aGUgbmV3IGV4Y2VwdGlvbiBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb25cbnRoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgInRyeSIgc3RhdGVtZW50IHJhaXNlZFxudGhlIGV4Y2VwdGlvbikuXG5cbldoZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIGFzc2lnbmVkIHRvXG50aGUgdGFyZ2V0IHNwZWNpZmllZCBhZnRlciB0aGUgImFzIiBrZXl3b3JkIGluIHRoYXQgZXhjZXB0IGNsYXVzZSwgaWZcbnByZXNlbnQsIGFuZCB0aGUgZXhjZXB0IGNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZC4gIEFsbCBleGNlcHRcbmNsYXVzZXMgbXVzdCBoYXZlIGFuIGV4ZWN1dGFibGUgYmxvY2suICBXaGVuIHRoZSBlbmQgb2YgdGhpcyBibG9jayBpc1xucmVhY2hlZCwgZXhlY3V0aW9uIGNvbnRpbnVlcyBub3JtYWxseSBhZnRlciB0aGUgZW50aXJlIHRyeSBzdGF0ZW1lbnQuXG4oVGhpcyBtZWFucyB0aGF0IGlmIHR3byBuZXN0ZWQgaGFuZGxlcnMgZXhpc3QgZm9yIHRoZSBzYW1lIGV4Y2VwdGlvbixcbmFuZCB0aGUgZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgdHJ5IGNsYXVzZSBvZiB0aGUgaW5uZXIgaGFuZGxlciwgdGhlXG5vdXRlciBoYW5kbGVyIHdpbGwgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLilcblxuV2hlbiBhbiBleGNlcHRpb24gaGFzIGJlZW4gYXNzaWduZWQgdXNpbmcgImFzIHRhcmdldCIsIGl0IGlzIGNsZWFyZWRcbmF0IHRoZSBlbmQgb2YgdGhlIGV4Y2VwdCBjbGF1c2UuICBUaGlzIGlzIGFzIGlmXG5cbiAgIGV4Y2VwdCBFIGFzIE46XG4gICAgICAgZm9vXG5cbndhcyB0cmFuc2xhdGVkIHRvXG5cbiAgIGV4Y2VwdCBFIGFzIE46XG4gICAgICAgdHJ5OlxuICAgICAgICAgICBmb29cbiAgICAgICBmaW5hbGx5OlxuICAgICAgICAgICBkZWwgTlxuXG5UaGlzIG1lYW5zIHRoZSBleGNlcHRpb24gbXVzdCBiZSBhc3NpZ25lZCB0byBhIGRpZmZlcmVudCBuYW1lIHRvIGJlXG5hYmxlIHRvIHJlZmVyIHRvIGl0IGFmdGVyIHRoZSBleGNlcHQgY2xhdXNlLiAgRXhjZXB0aW9ucyBhcmUgY2xlYXJlZFxuYmVjYXVzZSB3aXRoIHRoZSB0cmFjZWJhY2sgYXR0YWNoZWQgdG8gdGhlbSwgdGhleSBmb3JtIGEgcmVmZXJlbmNlXG5jeWNsZSB3aXRoIHRoZSBzdGFjayBmcmFtZSwga2VlcGluZyBhbGwgbG9jYWxzIGluIHRoYXQgZnJhbWUgYWxpdmVcbnVudGlsIHRoZSBuZXh0IGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuXG5cbkJlZm9yZSBhbiBleGNlcHQgY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLCBkZXRhaWxzIGFib3V0IHRoZVxuZXhjZXB0aW9uIGFyZSBzdG9yZWQgaW4gdGhlICJzeXMiIG1vZHVsZSBhbmQgY2FuIGJlIGFjY2Vzc2VkIHZpYVxuInN5cy5leGNfaW5mbygpIi4gInN5cy5leGNfaW5mbygpIiByZXR1cm5zIGEgMy10dXBsZSBjb25zaXN0aW5nIG9mIHRoZVxuZXhjZXB0aW9uIGNsYXNzLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIGFuZCBhIHRyYWNlYmFjayBvYmplY3QgKHNlZVxuc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KikgaWRlbnRpZnlpbmcgdGhlIHBvaW50IGluIHRoZVxucHJvZ3JhbSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLiAgInN5cy5leGNfaW5mbygpIiB2YWx1ZXMgYXJlXG5yZXN0b3JlZCB0byB0aGVpciBwcmV2aW91cyB2YWx1ZXMgKGJlZm9yZSB0aGUgY2FsbCkgd2hlbiByZXR1cm5pbmdcbmZyb20gYSBmdW5jdGlvbiB0aGF0IGhhbmRsZWQgYW4gZXhjZXB0aW9uLlxuXG5UaGUgb3B0aW9uYWwgImVsc2UiIGNsYXVzZSBpcyBleGVjdXRlZCBpZiBhbmQgd2hlbiBjb250cm9sIGZsb3dzIG9mZlxudGhlIGVuZCBvZiB0aGUgInRyeSIgY2xhdXNlLiBbMl0gRXhjZXB0aW9ucyBpbiB0aGUgImVsc2UiIGNsYXVzZSBhcmVcbm5vdCBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgImV4Y2VwdCIgY2xhdXNlcy5cblxuSWYgImZpbmFsbHkiIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIFwnY2xlYW51cFwnIGhhbmRsZXIuICBUaGUgInRyeSJcbmNsYXVzZSBpcyBleGVjdXRlZCwgaW5jbHVkaW5nIGFueSAiZXhjZXB0IiBhbmQgImVsc2UiIGNsYXVzZXMuICBJZiBhblxuZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXVzZXMgYW5kIGlzIG5vdCBoYW5kbGVkLCB0aGVcbmV4Y2VwdGlvbiBpcyB0ZW1wb3JhcmlseSBzYXZlZC4gVGhlICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQuICBJZlxudGhlcmUgaXMgYSBzYXZlZCBleGNlcHRpb24gaXQgaXMgcmUtcmFpc2VkIGF0IHRoZSBlbmQgb2YgdGhlICJmaW5hbGx5IlxuY2xhdXNlLiAgSWYgdGhlICJmaW5hbGx5IiBjbGF1c2UgcmFpc2VzIGFub3RoZXIgZXhjZXB0aW9uLCB0aGUgc2F2ZWRcbmV4Y2VwdGlvbiBpcyBzZXQgYXMgdGhlIGNvbnRleHQgb2YgdGhlIG5ldyBleGNlcHRpb24uIElmIHRoZSAiZmluYWxseSJcbmNsYXVzZSBleGVjdXRlcyBhICJyZXR1cm4iIG9yICJicmVhayIgc3RhdGVtZW50LCB0aGUgc2F2ZWQgZXhjZXB0aW9uXG5pcyBkaXNjYXJkZWQ6XG5cbiAgID4+PiBkZWYgZigpOlxuICAgLi4uICAgICB0cnk6XG4gICAuLi4gICAgICAgICAxLzBcbiAgIC4uLiAgICAgZmluYWxseTpcbiAgIC4uLiAgICAgICAgIHJldHVybiA0MlxuICAgLi4uXG4gICA+Pj4gZigpXG4gICA0MlxuXG5UaGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0gZHVyaW5nXG5leGVjdXRpb24gb2YgdGhlICJmaW5hbGx5IiBjbGF1c2UuXG5cbldoZW4gYSAicmV0dXJuIiwgImJyZWFrIiBvciAiY29udGludWUiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBpbiB0aGVcbiJ0cnkiIHN1aXRlIG9mIGEgInRyeSIuLi4iZmluYWxseSIgc3RhdGVtZW50LCB0aGUgImZpbmFsbHkiIGNsYXVzZSBpc1xuYWxzbyBleGVjdXRlZCBcJ29uIHRoZSB3YXkgb3V0LlwnIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgaWxsZWdhbCBpblxudGhlICJmaW5hbGx5IiBjbGF1c2UuIChUaGUgcmVhc29uIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjdXJyZW50XG5pbXBsZW1lbnRhdGlvbiAtLS0gdGhpcyByZXN0cmljdGlvbiBtYXkgYmUgbGlmdGVkIGluIHRoZSBmdXR1cmUpLlxuXG5UaGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGFzdCAicmV0dXJuIlxuc3RhdGVtZW50IGV4ZWN1dGVkLiAgU2luY2UgdGhlICJmaW5hbGx5IiBjbGF1c2UgYWx3YXlzIGV4ZWN1dGVzLCBhXG4icmV0dXJuIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlICJmaW5hbGx5IiBjbGF1c2Ugd2lsbCBhbHdheXMgYmUgdGhlXG5sYXN0IG9uZSBleGVjdXRlZDpcblxuICAgPj4+IGRlZiBmb28oKTpcbiAgIC4uLiAgICAgdHJ5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwndHJ5XCdcbiAgIC4uLiAgICAgZmluYWxseTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBcJ2ZpbmFsbHlcJ1xuICAgLi4uXG4gICA+Pj4gZm9vKClcbiAgIFwnZmluYWxseVwnXG5cbkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvblxuKkV4Y2VwdGlvbnMqLCBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlICJyYWlzZSIgc3RhdGVtZW50IHRvXG5nZW5lcmF0ZSBleGNlcHRpb25zIG1heSBiZSBmb3VuZCBpbiBzZWN0aW9uICpUaGUgcmFpc2Ugc3RhdGVtZW50Ki5cblxuXG5UaGUgIndpdGgiIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PT1cblxuVGhlICJ3aXRoIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoXG5tZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uICpXaXRoIFN0YXRlbWVudFxuQ29udGV4dCBNYW5hZ2VycyopLiBUaGlzIGFsbG93cyBjb21tb24gInRyeSIuLi4iZXhjZXB0Ii4uLiJmaW5hbGx5IlxudXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkIGZvciBjb252ZW5pZW50IHJldXNlLlxuXG4gICB3aXRoX3N0bXQgOjo9ICJ3aXRoIiB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKiAiOiIgc3VpdGVcbiAgIHdpdGhfaXRlbSA6Oj0gZXhwcmVzc2lvbiBbImFzIiB0YXJnZXRdXG5cblRoZSBleGVjdXRpb24gb2YgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzIGFzXG5mb2xsb3dzOlxuXG4xLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgIndpdGhfaXRlbSIpXG4gICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuXG4yLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBpcyBsb2FkZWQgZm9yIGxhdGVyIHVzZS5cblxuMy4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19lbnRlcl9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLlxuXG40LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlICJ3aXRoIiBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbiAgIHZhbHVlIGZyb20gIl9fZW50ZXJfXygpIiBpcyBhc3NpZ25lZCB0byBpdC5cblxuICAgTm90ZTogVGhlICJ3aXRoIiBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSAiX19lbnRlcl9fKCkiXG4gICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gIl9fZXhpdF9fKCkiIHdpbGwgYWx3YXlzIGJlXG4gICAgIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byB0aGVcbiAgICAgdGFyZ2V0IGxpc3QsIGl0IHdpbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhbiBlcnJvciBvY2N1cnJpbmdcbiAgICAgd2l0aGluIHRoZSBzdWl0ZSB3b3VsZCBiZS4gU2VlIHN0ZXAgNiBiZWxvdy5cblxuNS4gVGhlIHN1aXRlIGlzIGV4ZWN1dGVkLlxuXG42LiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBtZXRob2QgaXMgaW52b2tlZC4gIElmIGFuXG4gICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kXG4gICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gIl9fZXhpdF9fKCkiLiBPdGhlcndpc2UsIHRocmVlXG4gICAiTm9uZSIgYXJndW1lbnRzIGFyZSBzdXBwbGllZC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gdmFsdWVcbiAgIGZyb20gdGhlICJfX2V4aXRfXygpIiBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzIHJlcmFpc2VkLlxuICAgSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCBhbmRcbiAgIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgIndpdGgiXG4gICBzdGF0ZW1lbnQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gZXhjZXB0aW9uLCB0aGVcbiAgIHJldHVybiB2YWx1ZSBmcm9tICJfX2V4aXRfXygpIiBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uIHByb2NlZWRzXG4gICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuXG5XaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZlxubXVsdGlwbGUgIndpdGgiIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG5cbiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuICAgICAgIHN1aXRlXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgd2l0aCBBKCkgYXMgYTpcbiAgICAgICB3aXRoIEIoKSBhcyBiOlxuICAgICAgICAgICBzdWl0ZVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLlxuXG5TZWUgYWxzbzogKipQRVAgMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuXG4gICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24gIndpdGgiXG4gICAgIHN0YXRlbWVudC5cblxuXG5GdW5jdGlvbiBkZWZpbml0aW9uc1xuPT09PT09PT09PT09PT09PT09PT1cblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IChzZWVcbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopOlxuXG4gICBmdW5jZGVmICAgICAgICA6Oj0gW2RlY29yYXRvcnNdICJkZWYiIGZ1bmNuYW1lICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIiBbIi0+IiBleHByZXNzaW9uXSAiOiIgc3VpdGVcbiAgIGRlY29yYXRvcnMgICAgIDo6PSBkZWNvcmF0b3IrXG4gICBkZWNvcmF0b3IgICAgICA6Oj0gIkAiIGRvdHRlZF9uYW1lIFsiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl1dICIpIl0gTkVXTElORVxuICAgZG90dGVkX25hbWUgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSpcbiAgIHBhcmFtZXRlcl9saXN0IDo6PSAoZGVmcGFyYW1ldGVyICIsIikqXG4gICAgICAgICAgICAgICAgICAgICAgfCAiKiIgW3BhcmFtZXRlcl0gKCIsIiBkZWZwYXJhbWV0ZXIpKiBbIiwiICIqKiIgcGFyYW1ldGVyXVxuICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAgICAgICB8IGRlZnBhcmFtZXRlciBbIiwiXSApXG4gICBwYXJhbWV0ZXIgICAgICA6Oj0gaWRlbnRpZmllciBbIjoiIGV4cHJlc3Npb25dXG4gICBkZWZwYXJhbWV0ZXIgICA6Oj0gcGFyYW1ldGVyIFsiPSIgZXhwcmVzc2lvbl1cbiAgIGZ1bmNuYW1lICAgICAgIDo6PSBpZGVudGlmaWVyXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0cyBleGVjdXRpb24gYmluZHNcbnRoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZSB0byBhIGZ1bmN0aW9uIG9iamVjdFxuKGEgd3JhcHBlciBhcm91bmQgdGhlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uKS4gIFRoaXNcbmZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBnbG9iYWwgbmFtZXNwYWNlXG5hcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC5cblxuVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZG9lcyBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gYm9keTsgdGhpcyBnZXRzXG5leGVjdXRlZCBvbmx5IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gWzNdXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSAqZGVjb3JhdG9yKlxuZXhwcmVzc2lvbnMuIERlY29yYXRvciBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzXG5kZWZpbmVkLCBpbiB0aGUgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZVxucmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3RcbmFzIHRoZSBvbmx5IGFyZ3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYm91bmQgdG8gdGhlIGZ1bmN0aW9uIG5hbWVcbmluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIE11bHRpcGxlIGRlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW5cbm5lc3RlZCBmYXNoaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlXG5cbiAgIEBmMShhcmcpXG4gICBAZjJcbiAgIGRlZiBmdW5jKCk6IHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBkZWYgZnVuYygpOiBwYXNzXG4gICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcblxuV2hlbiBvbmUgb3IgbW9yZSAqcGFyYW1ldGVycyogaGF2ZSB0aGUgZm9ybSAqcGFyYW1ldGVyKiAiPSJcbipleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzLiJcbkZvciBhIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmcgKmFyZ3VtZW50KiBtYXlcbmJlIG9taXR0ZWQgZnJvbSBhIGNhbGwsIGluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlclwncyBkZWZhdWx0IHZhbHVlIGlzXG5zdWJzdGl0dXRlZC4gIElmIGEgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGFsbCBmb2xsb3dpbmdcbnBhcmFtZXRlcnMgdXAgdW50aWwgdGhlICIiKiIiIG11c3QgYWxzbyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAtLS0gdGhpc1xuaXMgYSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSBncmFtbWFyLlxuXG4qKkRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB3aGVuIHRoZVxuZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4qKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGV4cHJlc3Npb24gaXNcbmV2YWx1YXRlZCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSAicHJlLVxuY29tcHV0ZWQiIHZhbHVlIGlzIHVzZWQgZm9yIGVhY2ggY2FsbC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnRcbnRvIHVuZGVyc3RhbmQgd2hlbiBhIGRlZmF1bHQgcGFyYW1ldGVyIGlzIGEgbXV0YWJsZSBvYmplY3QsIHN1Y2ggYXMgYVxubGlzdCBvciBhIGRpY3Rpb25hcnk6IGlmIHRoZSBmdW5jdGlvbiBtb2RpZmllcyB0aGUgb2JqZWN0IChlLmcuIGJ5XG5hcHBlbmRpbmcgYW4gaXRlbSB0byBhIGxpc3QpLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBpbiBlZmZlY3QgbW9kaWZpZWQuXG5UaGlzIGlzIGdlbmVyYWxseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQuICBBIHdheSBhcm91bmQgdGhpcyBpcyB0byB1c2VcbiJOb25lIiBhcyB0aGUgZGVmYXVsdCwgYW5kIGV4cGxpY2l0bHkgdGVzdCBmb3IgaXQgaW4gdGhlIGJvZHkgb2YgdGhlXG5mdW5jdGlvbiwgZS5nLjpcblxuICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOlxuICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZTpcbiAgICAgICAgICAgcGVuZ3VpbiA9IFtdXG4gICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKVxuICAgICAgIHJldHVybiBwZW5ndWluXG5cbkZ1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvblxuKkNhbGxzKi4gQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVyc1xubWVudGlvbmVkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tXG5rZXl3b3JkIGFyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtXG4iIippZGVudGlmaWVyIiIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmcgYW55XG5leGNlc3MgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSB0dXBsZS4gIElmIHRoZVxuZm9ybSAiIioqaWRlbnRpZmllciIiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3XG5kaWN0aW9uYXJ5IHJlY2VpdmluZyBhbnkgZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLCBkZWZhdWx0aW5nIHRvIGEgbmV3XG5lbXB0eSBkaWN0aW9uYXJ5LiBQYXJhbWV0ZXJzIGFmdGVyICIiKiIiIG9yICIiKmlkZW50aWZpZXIiIiBhcmVcbmtleXdvcmQtb25seSBwYXJhbWV0ZXJzIGFuZCBtYXkgb25seSBiZSBwYXNzZWQgdXNlZCBrZXl3b3JkIGFyZ3VtZW50cy5cblxuUGFyYW1ldGVycyBtYXkgaGF2ZSBhbm5vdGF0aW9ucyBvZiB0aGUgZm9ybSAiIjogZXhwcmVzc2lvbiIiIGZvbGxvd2luZ1xudGhlIHBhcmFtZXRlciBuYW1lLiAgQW55IHBhcmFtZXRlciBtYXkgaGF2ZSBhbiBhbm5vdGF0aW9uIGV2ZW4gdGhvc2Vcbm9mIHRoZSBmb3JtICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciIuICBGdW5jdGlvbnMgbWF5IGhhdmVcbiJyZXR1cm4iIGFubm90YXRpb24gb2YgdGhlIGZvcm0gIiItPiBleHByZXNzaW9uIiIgYWZ0ZXIgdGhlIHBhcmFtZXRlclxubGlzdC4gIFRoZXNlIGFubm90YXRpb25zIGNhbiBiZSBhbnkgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gYW5kIGFyZVxuZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuICBBbm5vdGF0aW9ucyBtYXlcbmJlIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UgY29kZS5cblRoZSBwcmVzZW5jZSBvZiBhbm5vdGF0aW9ucyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiBhXG5mdW5jdGlvbi4gIFRoZSBhbm5vdGF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGFzIHZhbHVlcyBvZiBhXG5kaWN0aW9uYXJ5IGtleWVkIGJ5IHRoZSBwYXJhbWV0ZXJzXCcgbmFtZXMgaW4gdGhlICJfX2Fubm90YXRpb25zX18iXG5hdHRyaWJ1dGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC5cblxuSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCBib3VuZFxudG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhXG5leHByZXNzaW9ucywgZGVzY3JpYmVkIGluIHNlY3Rpb24gKkxhbWJkYXMqLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGFcbmV4cHJlc3Npb24gaXMgbWVyZWx5IGEgc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gZGVmaW5pdGlvbjtcbmEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhICIiZGVmIiIgc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kIG9yXG5hc3NpZ25lZCB0byBhbm90aGVyIG5hbWUganVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGxhbWJkYVxuZXhwcmVzc2lvbi4gIFRoZSAiImRlZiIiIGZvcm0gaXMgYWN0dWFsbHkgbW9yZSBwb3dlcmZ1bCBzaW5jZSBpdFxuYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgc3RhdGVtZW50cyBhbmQgYW5ub3RhdGlvbnMuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgIiJkZWYiIlxuc3RhdGVtZW50IGV4ZWN1dGVkIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIGxvY2FsXG5mdW5jdGlvbiB0aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgdXNlZFxuaW4gdGhlIG5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZ1bmN0aW9uXG5jb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiBmb3IgZGV0YWlscy5cblxuU2VlIGFsc286ICoqUEVQIDMxMDcqKiAtIEZ1bmN0aW9uIEFubm90YXRpb25zXG5cbiAgICAgVGhlIG9yaWdpbmFsIHNwZWNpZmljYXRpb24gZm9yIGZ1bmN0aW9uIGFubm90YXRpb25zLlxuXG5cbkNsYXNzIGRlZmluaXRpb25zXG49PT09PT09PT09PT09PT09PVxuXG5BIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZFxudHlwZSBoaWVyYXJjaHkqKTpcblxuICAgY2xhc3NkZWYgICAgOjo9IFtkZWNvcmF0b3JzXSAiY2xhc3MiIGNsYXNzbmFtZSBbaW5oZXJpdGFuY2VdICI6IiBzdWl0ZVxuICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbYXJndW1lbnRfbGlzdF0gIikiXG4gICBjbGFzc25hbWUgICA6Oj0gaWRlbnRpZmllclxuXG5BIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBUaGUgaW5oZXJpdGFuY2UgbGlzdFxudXN1YWxseSBnaXZlcyBhIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIChzZWUgKkN1c3RvbWl6aW5nIGNsYXNzIGNyZWF0aW9uKlxuZm9yIG1vcmUgYWR2YW5jZWQgdXNlcyksIHNvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBzaG91bGQgZXZhbHVhdGUgdG8gYVxuY2xhc3Mgb2JqZWN0IHdoaWNoIGFsbG93cyBzdWJjbGFzc2luZy4gIENsYXNzZXMgd2l0aG91dCBhbiBpbmhlcml0YW5jZVxubGlzdCBpbmhlcml0LCBieSBkZWZhdWx0LCBmcm9tIHRoZSBiYXNlIGNsYXNzICJvYmplY3QiOyBoZW5jZSxcblxuICAgY2xhc3MgRm9vOlxuICAgICAgIHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBjbGFzcyBGb28ob2JqZWN0KTpcbiAgICAgICBwYXNzXG5cblRoZSBjbGFzc1wncyBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIGluIGEgbmV3IGV4ZWN1dGlvbiBmcmFtZSAoc2VlXG4qTmFtaW5nIGFuZCBiaW5kaW5nKiksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbCBuYW1lc3BhY2UgYW5kIHRoZVxub3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZSBjb250YWlucyBtb3N0bHlcbmZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNzXCdzIHN1aXRlIGZpbmlzaGVzIGV4ZWN1dGlvbiwgaXRzXG5leGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzIHNhdmVkLiBbNF0gQVxuY2xhc3Mgb2JqZWN0IGlzIHRoZW4gY3JlYXRlZCB1c2luZyB0aGUgaW5oZXJpdGFuY2UgbGlzdCBmb3IgdGhlIGJhc2VcbmNsYXNzZXMgYW5kIHRoZSBzYXZlZCBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeS5cblRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZSBvcmlnaW5hbCBsb2NhbFxubmFtZXNwYWNlLlxuXG5DbGFzcyBjcmVhdGlvbiBjYW4gYmUgY3VzdG9taXplZCBoZWF2aWx5IHVzaW5nICptZXRhY2xhc3NlcyouXG5cbkNsYXNzZXMgY2FuIGFsc28gYmUgZGVjb3JhdGVkOiBqdXN0IGxpa2Ugd2hlbiBkZWNvcmF0aW5nIGZ1bmN0aW9ucyxcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgY2xhc3MgRm9vOiBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgY2xhc3MgRm9vOiBwYXNzXG4gICBGb28gPSBmMShhcmcpKGYyKEZvbykpXG5cblRoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyBmb3JcbmZ1bmN0aW9uIGRlY29yYXRvcnMuICBUaGUgcmVzdWx0IG11c3QgYmUgYSBjbGFzcyBvYmplY3QsIHdoaWNoIGlzIHRoZW5cbmJvdW5kIHRvIHRoZSBjbGFzcyBuYW1lLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBhcmVcbmNsYXNzIGF0dHJpYnV0ZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBpbnN0YW5jZXMuICBJbnN0YW5jZSBhdHRyaWJ1dGVzXG5jYW4gYmUgc2V0IGluIGEgbWV0aG9kIHdpdGggInNlbGYubmFtZSA9IHZhbHVlIi4gIEJvdGggY2xhc3MgYW5kXG5pbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIG5vdGF0aW9uICIic2VsZi5uYW1lIiIsXG5hbmQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGhpZGVzIGEgY2xhc3MgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZVxud2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gIENsYXNzIGF0dHJpYnV0ZXMgY2FuIGJlIHVzZWQgYXMgZGVmYXVsdHNcbmZvciBpbnN0YW5jZSBhdHRyaWJ1dGVzLCBidXQgdXNpbmcgbXV0YWJsZSB2YWx1ZXMgdGhlcmUgY2FuIGxlYWQgdG9cbnVuZXhwZWN0ZWQgcmVzdWx0cy4gICpEZXNjcmlwdG9ycyogY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlXG52YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cblxuU2VlIGFsc286ICoqUEVQIDMxMTUqKiAtIE1ldGFjbGFzc2VzIGluIFB5dGhvbiAzICoqUEVQIDMxMjkqKiAtXG4gIENsYXNzIERlY29yYXRvcnNcblxuXG5Db3JvdXRpbmVzXG49PT09PT09PT09XG5cbk5ldyBpbiB2ZXJzaW9uIDMuNS5cblxuXG5Db3JvdXRpbmUgZnVuY3Rpb24gZGVmaW5pdGlvblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgYXN5bmNfZnVuY2RlZiA6Oj0gW2RlY29yYXRvcnNdICJhc3luYyIgImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZVxuXG5FeGVjdXRpb24gb2YgUHl0aG9uIGNvcm91dGluZXMgY2FuIGJlIHN1c3BlbmRlZCBhbmQgcmVzdW1lZCBhdCBtYW55XG5wb2ludHMgKHNlZSAqY29yb3V0aW5lKikuICBJbiB0aGUgYm9keSBvZiBhIGNvcm91dGluZSwgYW55ICJhd2FpdCIgYW5kXG4iYXN5bmMiIGlkZW50aWZpZXJzIGJlY29tZSByZXNlcnZlZCBrZXl3b3JkczsgImF3YWl0IiBleHByZXNzaW9ucyxcbiJhc3luYyBmb3IiIGFuZCAiYXN5bmMgd2l0aCIgY2FuIG9ubHkgYmUgdXNlZCBpbiBjb3JvdXRpbmUgYm9kaWVzLlxuXG5GdW5jdGlvbnMgZGVmaW5lZCB3aXRoICJhc3luYyBkZWYiIHN5bnRheCBhcmUgYWx3YXlzIGNvcm91dGluZVxuZnVuY3Rpb25zLCBldmVuIGlmIHRoZXkgZG8gbm90IGNvbnRhaW4gImF3YWl0IiBvciAiYXN5bmMiIGtleXdvcmRzLlxuXG5JdCBpcyBhICJTeW50YXhFcnJvciIgdG8gdXNlICJ5aWVsZCIgZXhwcmVzc2lvbnMgaW4gImFzeW5jIGRlZiJcbmNvcm91dGluZXMuXG5cbkFuIGV4YW1wbGUgb2YgYSBjb3JvdXRpbmUgZnVuY3Rpb246XG5cbiAgIGFzeW5jIGRlZiBmdW5jKHBhcmFtMSwgcGFyYW0yKTpcbiAgICAgICBkb19zdHVmZigpXG4gICAgICAgYXdhaXQgc29tZV9jb3JvdXRpbmUoKVxuXG5cblRoZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnRcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgYXN5bmNfZm9yX3N0bXQgOjo9ICJhc3luYyIgZm9yX3N0bXRcblxuQW4gKmFzeW5jaHJvbm91cyBpdGVyYWJsZSogaXMgYWJsZSB0byBjYWxsIGFzeW5jaHJvbm91cyBjb2RlIGluIGl0c1xuKml0ZXIqIGltcGxlbWVudGF0aW9uLCBhbmQgKmFzeW5jaHJvbm91cyBpdGVyYXRvciogY2FuIGNhbGxcbmFzeW5jaHJvbm91cyBjb2RlIGluIGl0cyAqbmV4dCogbWV0aG9kLlxuXG5UaGUgImFzeW5jIGZvciIgc3RhdGVtZW50IGFsbG93cyBjb252ZW5pZW50IGl0ZXJhdGlvbiBvdmVyXG5hc3luY2hyb25vdXMgaXRlcmF0b3JzLlxuXG5UaGUgZm9sbG93aW5nIGNvZGU6XG5cbiAgIGFzeW5jIGZvciBUQVJHRVQgaW4gSVRFUjpcbiAgICAgICBCTE9DS1xuICAgZWxzZTpcbiAgICAgICBCTE9DSzJcblxuSXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86XG5cbiAgIGl0ZXIgPSAoSVRFUilcbiAgIGl0ZXIgPSB0eXBlKGl0ZXIpLl9fYWl0ZXJfXyhpdGVyKVxuICAgcnVubmluZyA9IFRydWVcbiAgIHdoaWxlIHJ1bm5pbmc6XG4gICAgICAgdHJ5OlxuICAgICAgICAgICBUQVJHRVQgPSBhd2FpdCB0eXBlKGl0ZXIpLl9fYW5leHRfXyhpdGVyKVxuICAgICAgIGV4Y2VwdCBTdG9wQXN5bmNJdGVyYXRpb246XG4gICAgICAgICAgIHJ1bm5pbmcgPSBGYWxzZVxuICAgICAgIGVsc2U6XG4gICAgICAgICAgIEJMT0NLXG4gICBlbHNlOlxuICAgICAgIEJMT0NLMlxuXG5TZWUgYWxzbyAiX19haXRlcl9fKCkiIGFuZCAiX19hbmV4dF9fKCkiIGZvciBkZXRhaWxzLlxuXG5JdCBpcyBhICJTeW50YXhFcnJvciIgdG8gdXNlICJhc3luYyBmb3IiIHN0YXRlbWVudCBvdXRzaWRlIG9mIGFuXG4iYXN5bmMgZGVmIiBmdW5jdGlvbi5cblxuXG5UaGUgImFzeW5jIHdpdGgiIHN0YXRlbWVudFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgYXN5bmNfd2l0aF9zdG10IDo6PSAiYXN5bmMiIHdpdGhfc3RtdFxuXG5BbiAqYXN5bmNocm9ub3VzIGNvbnRleHQgbWFuYWdlciogaXMgYSAqY29udGV4dCBtYW5hZ2VyKiB0aGF0IGlzIGFibGVcbnRvIHN1c3BlbmQgZXhlY3V0aW9uIGluIGl0cyAqZW50ZXIqIGFuZCAqZXhpdCogbWV0aG9kcy5cblxuVGhlIGZvbGxvd2luZyBjb2RlOlxuXG4gICBhc3luYyB3aXRoIEVYUFIgYXMgVkFSOlxuICAgICAgIEJMT0NLXG5cbklzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvOlxuXG4gICBtZ3IgPSAoRVhQUilcbiAgIGFleGl0ID0gdHlwZShtZ3IpLl9fYWV4aXRfX1xuICAgYWVudGVyID0gdHlwZShtZ3IpLl9fYWVudGVyX18obWdyKVxuICAgZXhjID0gVHJ1ZVxuXG4gICBWQVIgPSBhd2FpdCBhZW50ZXJcbiAgIHRyeTpcbiAgICAgICBCTE9DS1xuICAgZXhjZXB0OlxuICAgICAgIGlmIG5vdCBhd2FpdCBhZXhpdChtZ3IsICpzeXMuZXhjX2luZm8oKSk6XG4gICAgICAgICAgIHJhaXNlXG4gICBlbHNlOlxuICAgICAgIGF3YWl0IGFleGl0KG1nciwgTm9uZSwgTm9uZSwgTm9uZSlcblxuU2VlIGFsc28gIl9fYWVudGVyX18oKSIgYW5kICJfX2FleGl0X18oKSIgZm9yIGRldGFpbHMuXG5cbkl0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgImFzeW5jIHdpdGgiIHN0YXRlbWVudCBvdXRzaWRlIG9mIGFuXG4iYXN5bmMgZGVmIiBmdW5jdGlvbi5cblxuU2VlIGFsc286ICoqUEVQIDQ5MioqIC0gQ29yb3V0aW5lcyB3aXRoIGFzeW5jIGFuZCBhd2FpdCBzeW50YXhcblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBUaGUgZXhjZXB0aW9uIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGludm9jYXRpb24gc3RhY2sgdW5sZXNzXG4gICAgdGhlcmUgaXMgYSAiZmluYWxseSIgY2xhdXNlIHdoaWNoIGhhcHBlbnMgdG8gcmFpc2UgYW5vdGhlclxuICAgIGV4Y2VwdGlvbi4gVGhhdCBuZXcgZXhjZXB0aW9uIGNhdXNlcyB0aGUgb2xkIG9uZSB0byBiZSBsb3N0LlxuXG5bMl0gQ3VycmVudGx5LCBjb250cm9sICJmbG93cyBvZmYgdGhlIGVuZCIgZXhjZXB0IGluIHRoZSBjYXNlIG9mXG4gICAgYW4gZXhjZXB0aW9uIG9yIHRoZSBleGVjdXRpb24gb2YgYSAicmV0dXJuIiwgImNvbnRpbnVlIiwgb3JcbiAgICAiYnJlYWsiIHN0YXRlbWVudC5cblxuWzNdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlXG4gICAgZnVuY3Rpb24gYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBmdW5jdGlvblwncyAiX19kb2NfXyJcbiAgICBhdHRyaWJ1dGUgYW5kIHRoZXJlZm9yZSB0aGUgZnVuY3Rpb25cJ3MgKmRvY3N0cmluZyouXG5cbls0XSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBjbGFzc1xuICAgIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgbmFtZXNwYWNlXCdzICJfX2RvY19fIiBpdGVtIGFuZFxuICAgIHRoZXJlZm9yZSB0aGUgY2xhc3NcJ3MgKmRvY3N0cmluZyouXG4nLAotICdjb250ZXh0LW1hbmFnZXJzJzogdSdcbldpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQSAqY29udGV4dCBtYW5hZ2VyKiBpcyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBydW50aW1lIGNvbnRleHQgdG9cbmJlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgIndpdGgiIHN0YXRlbWVudC4gVGhlIGNvbnRleHQgbWFuYWdlclxuaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWUgY29udGV4dFxuZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZSBub3JtYWxseVxuaW52b2tlZCB1c2luZyB0aGUgIndpdGgiIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb24gKlRoZSB3aXRoXG5zdGF0ZW1lbnQqKSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXIgbWV0aG9kcy5cblxuVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzXG5raW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkXG5maWxlcywgZXRjLlxuXG5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgKkNvbnRleHQgTWFuYWdlciBUeXBlcyouXG5cbm9iamVjdC5fX2VudGVyX18oc2VsZilcblxuICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgIndpdGgiXG4gICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kXCdzIHJldHVybiB2YWx1ZSB0byB0aGUgdGFyZ2V0KHMpXG4gICBzcGVjaWZpZWQgaW4gdGhlICJhcyIgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmIGFueS5cblxub2JqZWN0Ll9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjaylcblxuICAgRXhpdCB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSBwYXJhbWV0ZXJzXG4gICBkZXNjcmliZSB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoZSBjb250ZXh0IHRvIGJlIGV4aXRlZC4gSWYgdGhlXG4gICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMgd2lsbFxuICAgYmUgIk5vbmUiLlxuXG4gICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGVcbiAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCBpdCBzaG91bGRcbiAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHByb2Nlc3NlZFxuICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuXG5cbiAgIE5vdGUgdGhhdCAiX19leGl0X18oKSIgbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlIHBhc3NlZC1pblxuICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXJcJ3MgcmVzcG9uc2liaWxpdHkuXG5cblNlZSBhbHNvOiAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAid2l0aCJcbiAgICAgc3RhdGVtZW50LlxuJywKLSAnY29udGludWUnOiB1J1xuVGhlICJjb250aW51ZSIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgY29udGludWVfc3RtdCA6Oj0gImNvbnRpbnVlIlxuXG4iY29udGludWUiIG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgImZvciIgb3IgIndoaWxlIlxubG9vcCwgYnV0IG5vdCBuZXN0ZWQgaW4gYSBmdW5jdGlvbiBvciBjbGFzcyBkZWZpbml0aW9uIG9yICJmaW5hbGx5IlxuY2xhdXNlIHdpdGhpbiB0aGF0IGxvb3AuICBJdCBjb250aW51ZXMgd2l0aCB0aGUgbmV4dCBjeWNsZSBvZiB0aGVcbm5lYXJlc3QgZW5jbG9zaW5nIGxvb3AuXG5cbldoZW4gImNvbnRpbnVlIiBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSAidHJ5IiBzdGF0ZW1lbnQgd2l0aCBhXG4iZmluYWxseSIgY2xhdXNlLCB0aGF0ICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseVxuc3RhcnRpbmcgdGhlIG5leHQgbG9vcCBjeWNsZS5cbicsCi0gJ2NvbnZlcnNpb25zJzogdSdcbkFyaXRobWV0aWMgY29udmVyc2lvbnNcbioqKioqKioqKioqKioqKioqKioqKipcblxuV2hlbiBhIGRlc2NyaXB0aW9uIG9mIGFuIGFyaXRobWV0aWMgb3BlcmF0b3IgYmVsb3cgdXNlcyB0aGUgcGhyYXNlXG4idGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSwiIHRoaXMgbWVhbnNcbnRoYXQgdGhlIG9wZXJhdG9yIGltcGxlbWVudGF0aW9uIGZvciBidWlsdC1pbiB0eXBlcyB3b3JrcyBhcyBmb2xsb3dzOlxuXG4qIElmIGVpdGhlciBhcmd1bWVudCBpcyBhIGNvbXBsZXggbnVtYmVyLCB0aGUgb3RoZXIgaXMgY29udmVydGVkIHRvXG4gIGNvbXBsZXg7XG5cbiogb3RoZXJ3aXNlLCBpZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIHRoZVxuICBvdGhlciBpcyBjb252ZXJ0ZWQgdG8gZmxvYXRpbmcgcG9pbnQ7XG5cbiogb3RoZXJ3aXNlLCBib3RoIG11c3QgYmUgaW50ZWdlcnMgYW5kIG5vIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5LlxuXG5Tb21lIGFkZGl0aW9uYWwgcnVsZXMgYXBwbHkgZm9yIGNlcnRhaW4gb3BlcmF0b3JzIChlLmcuLCBhIHN0cmluZyBhcyBhXG5sZWZ0IGFyZ3VtZW50IHRvIHRoZSBcJyVcJyBvcGVyYXRvcikuICBFeHRlbnNpb25zIG11c3QgZGVmaW5lIHRoZWlyIG93blxuY29udmVyc2lvbiBiZWhhdmlvci5cbicsCi0gJ2N1c3RvbWl6YXRpb24nOiB1J1xuQmFzaWMgY3VzdG9taXphdGlvblxuKioqKioqKioqKioqKioqKioqKlxuXG5vYmplY3QuX19uZXdfXyhjbHNbLCAuLi5dKVxuXG4gICBDYWxsZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzICpjbHMqLiAgIl9fbmV3X18oKSIgaXMgYVxuICAgc3RhdGljIG1ldGhvZCAoc3BlY2lhbC1jYXNlZCBzbyB5b3UgbmVlZCBub3QgZGVjbGFyZSBpdCBhcyBzdWNoKVxuICAgdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCBhcyBpdHNcbiAgIGZpcnN0IGFyZ3VtZW50LiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRob3NlIHBhc3NlZCB0byB0aGVcbiAgIG9iamVjdCBjb25zdHJ1Y3RvciBleHByZXNzaW9uICh0aGUgY2FsbCB0byB0aGUgY2xhc3MpLiAgVGhlIHJldHVyblxuICAgdmFsdWUgb2YgIl9fbmV3X18oKSIgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICh1c3VhbGx5IGFuXG4gICBpbnN0YW5jZSBvZiAqY2xzKikuXG5cbiAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYnlcbiAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNzXCdzICJfX25ld19fKCkiIG1ldGhvZCB1c2luZ1xuICAgInN1cGVyKGN1cnJlbnRjbGFzcywgY2xzKS5fX25ld19fKGNsc1ssIC4uLl0pIiB3aXRoIGFwcHJvcHJpYXRlXG4gICBhcmd1bWVudHMgYW5kIHRoZW4gbW9kaWZ5aW5nIHRoZSBuZXdseS1jcmVhdGVkIGluc3RhbmNlIGFzXG4gICBuZWNlc3NhcnkgYmVmb3JlIHJldHVybmluZyBpdC5cblxuICAgSWYgIl9fbmV3X18oKSIgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3XG4gICBpbnN0YW5jZVwncyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBsaWtlXG4gICAiX19pbml0X18oc2VsZlssIC4uLl0pIiwgd2hlcmUgKnNlbGYqIGlzIHRoZSBuZXcgaW5zdGFuY2UgYW5kIHRoZVxuICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZSBwYXNzZWQgdG8gIl9fbmV3X18oKSIuXG5cbiAgIElmICJfX25ld19fKCkiIGRvZXMgbm90IHJldHVybiBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3XG4gICBpbnN0YW5jZVwncyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgbm90IGJlIGludm9rZWQuXG5cbiAgICJfX25ld19fKCkiIGlzIGludGVuZGVkIG1haW5seSB0byBhbGxvdyBzdWJjbGFzc2VzIG9mIGltbXV0YWJsZVxuICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgY3JlYXRpb24uICBJdFxuICAgaXMgYWxzbyBjb21tb25seSBvdmVycmlkZGVuIGluIGN1c3RvbSBtZXRhY2xhc3NlcyBpbiBvcmRlciB0b1xuICAgY3VzdG9taXplIGNsYXNzIGNyZWF0aW9uLlxuXG5vYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pXG5cbiAgIENhbGxlZCBhZnRlciB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZCAoYnkgIl9fbmV3X18oKSIpLCBidXRcbiAgIGJlZm9yZSBpdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhvc2VcbiAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYW5cbiAgICJfX2luaXRfXygpIiBtZXRob2QsIHRoZSBkZXJpdmVkIGNsYXNzXCdzICJfX2luaXRfXygpIiBtZXRob2QsIGlmXG4gICBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2YgdGhlXG4gICBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlOyBmb3IgZXhhbXBsZTpcbiAgICJCYXNlQ2xhc3MuX19pbml0X18oc2VsZiwgW2FyZ3MuLi5dKSIuXG5cbiAgIEJlY2F1c2UgIl9fbmV3X18oKSIgYW5kICJfX2luaXRfXygpIiB3b3JrIHRvZ2V0aGVyIGluIGNvbnN0cnVjdGluZ1xuICAgb2JqZWN0cyAoIl9fbmV3X18oKSIgdG8gY3JlYXRlIGl0LCBhbmQgIl9faW5pdF9fKCkiIHRvIGN1c3RvbWlzZVxuICAgaXQpLCBubyBub24tIk5vbmUiIHZhbHVlIG1heSBiZSByZXR1cm5lZCBieSAiX19pbml0X18oKSI7IGRvaW5nIHNvXG4gICB3aWxsIGNhdXNlIGEgIlR5cGVFcnJvciIgdG8gYmUgcmFpc2VkIGF0IHJ1bnRpbWUuXG5cbm9iamVjdC5fX2RlbF9fKHNlbGYpXG5cbiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQuICBUaGlzIGlzIGFsc29cbiAgIGNhbGxlZCBhIGRlc3RydWN0b3IuICBJZiBhIGJhc2UgY2xhc3MgaGFzIGEgIl9fZGVsX18oKSIgbWV0aG9kLCB0aGVcbiAgIGRlcml2ZWQgY2xhc3NcJ3MgIl9fZGVsX18oKSIgbWV0aG9kLCBpZiBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0XG4gICB0byBlbnN1cmUgcHJvcGVyIGRlbGV0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlLlxuICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yIHRoZVxuICAgIl9fZGVsX18oKSIgbWV0aG9kIHRvIHBvc3Rwb25lIGRlc3RydWN0aW9uIG9mIHRoZSBpbnN0YW5jZSBieVxuICAgY3JlYXRpbmcgYSBuZXcgcmVmZXJlbmNlIHRvIGl0LiAgSXQgbWF5IHRoZW4gYmUgY2FsbGVkIGF0IGEgbGF0ZXJcbiAgIHRpbWUgd2hlbiB0aGlzIG5ldyByZWZlcmVuY2UgaXMgZGVsZXRlZC4gIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXRcbiAgICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGNhbGxlZCBmb3Igb2JqZWN0cyB0aGF0IHN0aWxsIGV4aXN0IHdoZW5cbiAgIHRoZSBpbnRlcnByZXRlciBleGl0cy5cblxuICAgTm90ZTogImRlbCB4IiBkb2VzblwndCBkaXJlY3RseSBjYWxsICJ4Ll9fZGVsX18oKSIgLS0tIHRoZSBmb3JtZXJcbiAgICAgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciAieCIgYnkgb25lLCBhbmQgdGhlIGxhdHRlciBpc1xuICAgICBvbmx5IGNhbGxlZCB3aGVuICJ4IlwncyByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLiAgU29tZSBjb21tb25cbiAgICAgc2l0dWF0aW9ucyB0aGF0IG1heSBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4gb2JqZWN0IGZyb21cbiAgICAgZ29pbmcgdG8gemVybyBpbmNsdWRlOiBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW4gb2JqZWN0cyAoZS5nLixcbiAgICAgYSBkb3VibHktbGlua2VkIGxpc3Qgb3IgYSB0cmVlIGRhdGEgc3RydWN0dXJlIHdpdGggcGFyZW50IGFuZFxuICAgICBjaGlsZCBwb2ludGVycyk7IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIG9mXG4gICAgIGEgZnVuY3Rpb24gdGhhdCBjYXVnaHQgYW4gZXhjZXB0aW9uICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICAic3lzLmV4Y19pbmZvKClbMl0iIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSk7IG9yIGEgcmVmZXJlbmNlXG4gICAgIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIHRoYXQgcmFpc2VkIGFuIHVuaGFuZGxlZFxuICAgICBleGNlcHRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW5cbiAgICAgInN5cy5sYXN0X3RyYWNlYmFjayIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKS4gIFRoZSBmaXJzdFxuICAgICBzaXR1YXRpb24gY2FuIG9ubHkgYmUgcmVtZWRpZWQgYnkgZXhwbGljaXRseSBicmVha2luZyB0aGUgY3ljbGVzO1xuICAgICB0aGUgc2Vjb25kIGNhbiBiZSByZXNvbHZlZCBieSBmcmVlaW5nIHRoZSByZWZlcmVuY2UgdG8gdGhlXG4gICAgIHRyYWNlYmFjayBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZnVsLCBhbmQgdGhlIHRoaXJkIGNhblxuICAgICBiZSByZXNvbHZlZCBieSBzdG9yaW5nICJOb25lIiBpbiAic3lzLmxhc3RfdHJhY2ViYWNrIi4gQ2lyY3VsYXJcbiAgICAgcmVmZXJlbmNlcyB3aGljaCBhcmUgZ2FyYmFnZSBhcmUgZGV0ZWN0ZWQgYW5kIGNsZWFuZWQgdXAgd2hlbiB0aGVcbiAgICAgY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yIGlzIGVuYWJsZWQgKGl0XCdzIG9uIGJ5IGRlZmF1bHQpLiBSZWZlclxuICAgICB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJnYyIgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gICAgIGFib3V0IHRoaXMgdG9waWMuXG5cbiAgIFdhcm5pbmc6IER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoXG4gICAgICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmdcbiAgICAgdGhlaXIgZXhlY3V0aW9uIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG9cbiAgICAgInN5cy5zdGRlcnIiIGluc3RlYWQuIEFsc28sIHdoZW4gIl9fZGVsX18oKSIgaXMgaW52b2tlZCBpblxuICAgICByZXNwb25zZSB0byBhIG1vZHVsZSBiZWluZyBkZWxldGVkIChlLmcuLCB3aGVuIGV4ZWN1dGlvbiBvZiB0aGVcbiAgICAgcHJvZ3JhbSBpcyBkb25lKSwgb3RoZXIgZ2xvYmFscyByZWZlcmVuY2VkIGJ5IHRoZSAiX19kZWxfXygpIlxuICAgICBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmdcbiAgICAgdG9ybiBkb3duIChlLmcuIHRoZSBpbXBvcnQgbWFjaGluZXJ5IHNodXR0aW5nIGRvd24pLiAgRm9yIHRoaXNcbiAgICAgcmVhc29uLCAiX19kZWxfXygpIiBtZXRob2RzIHNob3VsZCBkbyB0aGUgYWJzb2x1dGUgbWluaW11bSBuZWVkZWRcbiAgICAgdG8gbWFpbnRhaW4gZXh0ZXJuYWwgaW52YXJpYW50cy4gIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAxLjUsXG4gICAgIFB5dGhvbiBndWFyYW50ZWVzIHRoYXQgZ2xvYmFscyB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoIGEgc2luZ2xlXG4gICAgIHVuZGVyc2NvcmUgYXJlIGRlbGV0ZWQgZnJvbSB0aGVpciBtb2R1bGUgYmVmb3JlIG90aGVyIGdsb2JhbHMgYXJlXG4gICAgIGRlbGV0ZWQ7IGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCB0aGlzIG1heVxuICAgICBoZWxwIGluIGFzc3VyaW5nIHRoYXQgaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc3RpbGwgYXZhaWxhYmxlIGF0IHRoZVxuICAgICB0aW1lIHdoZW4gdGhlICJfX2RlbF9fKCkiIG1ldGhvZCBpcyBjYWxsZWQuXG5cbm9iamVjdC5fX3JlcHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgdGhlICJyZXByKCkiIGJ1aWx0LWluIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlICJvZmZpY2lhbCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBJZiBhdCBhbGwgcG9zc2libGUsIHRoaXNcbiAgIHNob3VsZCBsb29rIGxpa2UgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiB0aGF0IGNvdWxkIGJlIHVzZWQgdG9cbiAgIHJlY3JlYXRlIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlIChnaXZlbiBhbiBhcHByb3ByaWF0ZVxuICAgZW52aXJvbm1lbnQpLiAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIGEgc3RyaW5nIG9mIHRoZSBmb3JtXG4gICAiPC4uLnNvbWUgdXNlZnVsIGRlc2NyaXB0aW9uLi4uPiIgc2hvdWxkIGJlIHJldHVybmVkLiBUaGUgcmV0dXJuXG4gICB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC4gSWYgYSBjbGFzcyBkZWZpbmVzICJfX3JlcHJfXygpIiBidXRcbiAgIG5vdCAiX19zdHJfXygpIiwgdGhlbiAiX19yZXByX18oKSIgaXMgYWxzbyB1c2VkIHdoZW4gYW4gImluZm9ybWFsIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIGlzIHJlcXVpcmVkLlxuXG4gICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZVxuICAgcmVwcmVzZW50YXRpb24gaXMgaW5mb3JtYXRpb24tcmljaCBhbmQgdW5hbWJpZ3VvdXMuXG5cbm9iamVjdC5fX3N0cl9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSAic3RyKG9iamVjdCkiIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJmb3JtYXQoKSIgYW5kXG4gICAicHJpbnQoKSIgdG8gY29tcHV0ZSB0aGUgImluZm9ybWFsIiBvciBuaWNlbHkgcHJpbnRhYmxlIHN0cmluZ1xuICAgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgKnN0cmluZypcbiAgIG9iamVjdC5cblxuICAgVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tICJvYmplY3QuX19yZXByX18oKSIgaW4gdGhhdCB0aGVyZSBpcyBub1xuICAgZXhwZWN0YXRpb24gdGhhdCAiX19zdHJfXygpIiByZXR1cm4gYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbjogYVxuICAgbW9yZSBjb252ZW5pZW50IG9yIGNvbmNpc2UgcmVwcmVzZW50YXRpb24gY2FuIGJlIHVzZWQuXG5cbiAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRlZmluZWQgYnkgdGhlIGJ1aWx0LWluIHR5cGUgIm9iamVjdCJcbiAgIGNhbGxzICJvYmplY3QuX19yZXByX18oKSIuXG5cbm9iamVjdC5fX2J5dGVzX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5ICJieXRlcygpIiB0byBjb21wdXRlIGEgYnl0ZS1zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW5cbiAgIG9iamVjdC4gVGhpcyBzaG91bGQgcmV0dXJuIGEgImJ5dGVzIiBvYmplY3QuXG5cbm9iamVjdC5fX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKVxuXG4gICBDYWxsZWQgYnkgdGhlICJmb3JtYXQoKSIgYnVpbHQtaW4gZnVuY3Rpb24gKGFuZCBieSBleHRlbnNpb24sIHRoZVxuICAgInN0ci5mb3JtYXQoKSIgbWV0aG9kIG9mIGNsYXNzICJzdHIiKSB0byBwcm9kdWNlIGEgImZvcm1hdHRlZCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuIFRoZSAiZm9ybWF0X3NwZWMiIGFyZ3VtZW50IGlzIGFcbiAgIHN0cmluZyB0aGF0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdHRpbmcgb3B0aW9uc1xuICAgZGVzaXJlZC4gVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSAiZm9ybWF0X3NwZWMiIGFyZ3VtZW50IGlzIHVwIHRvXG4gICB0aGUgdHlwZSBpbXBsZW1lbnRpbmcgIl9fZm9ybWF0X18oKSIsIGhvd2V2ZXIgbW9zdCBjbGFzc2VzIHdpbGxcbiAgIGVpdGhlciBkZWxlZ2F0ZSBmb3JtYXR0aW5nIHRvIG9uZSBvZiB0aGUgYnVpbHQtaW4gdHlwZXMsIG9yIHVzZSBhXG4gICBzaW1pbGFyIGZvcm1hdHRpbmcgb3B0aW9uIHN5bnRheC5cblxuICAgU2VlICpGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlKiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGVcbiAgIHN0YW5kYXJkIGZvcm1hdHRpbmcgc3ludGF4LlxuXG4gICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMy40OiBUaGUgX19mb3JtYXRfXyBtZXRob2Qgb2YgIm9iamVjdCIgaXRzZWxmXG4gICByYWlzZXMgYSAiVHlwZUVycm9yIiBpZiBwYXNzZWQgYW55IG5vbi1lbXB0eSBzdHJpbmcuXG5cbm9iamVjdC5fX2x0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19sZV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZXFfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX25lX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ndF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZ2VfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQgInJpY2ggY29tcGFyaXNvbiIgbWV0aG9kcy4gVGhlXG4gICBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIG9wZXJhdG9yIHN5bWJvbHMgYW5kIG1ldGhvZCBuYW1lcyBpcyBhc1xuICAgZm9sbG93czogIng8eSIgY2FsbHMgInguX19sdF9fKHkpIiwgIng8PXkiIGNhbGxzICJ4Ll9fbGVfXyh5KSIsXG4gICAieD09eSIgY2FsbHMgInguX19lcV9fKHkpIiwgInghPXkiIGNhbGxzICJ4Ll9fbmVfXyh5KSIsICJ4PnkiIGNhbGxzXG4gICAieC5fX2d0X18oeSkiLCBhbmQgIng+PXkiIGNhbGxzICJ4Ll9fZ2VfXyh5KSIuXG5cbiAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b24gIk5vdEltcGxlbWVudGVkIlxuICAgaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIGEgZ2l2ZW4gcGFpciBvZlxuICAgYXJndW1lbnRzLiBCeSBjb252ZW50aW9uLCAiRmFsc2UiIGFuZCAiVHJ1ZSIgYXJlIHJldHVybmVkIGZvciBhXG4gICBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuIHJldHVybiBhbnkgdmFsdWUsXG4gICBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGEgQm9vbGVhbiBjb250ZXh0IChlLmcuLFxuICAgaW4gdGhlIGNvbmRpdGlvbiBvZiBhbiAiaWYiIHN0YXRlbWVudCksIFB5dGhvbiB3aWxsIGNhbGwgImJvb2woKSJcbiAgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdCBpcyB0cnVlIG9yIGZhbHNlLlxuXG4gICBCeSBkZWZhdWx0LCAiX19uZV9fKCkiIGRlbGVnYXRlcyB0byAiX19lcV9fKCkiIGFuZCBpbnZlcnRzIHRoZVxuICAgcmVzdWx0IHVubGVzcyBpdCBpcyAiTm90SW1wbGVtZW50ZWQiLiAgVGhlcmUgYXJlIG5vIG90aGVyIGltcGxpZWRcbiAgIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBmb3IgZXhhbXBsZSwgdGhlXG4gICB0cnV0aCBvZiAiKHg8eSBvciB4PT15KSIgZG9lcyBub3QgaW1wbHkgIng8PXkiLiBUbyBhdXRvbWF0aWNhbGx5XG4gICBnZW5lcmF0ZSBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdCBvcGVyYXRpb24sIHNlZVxuICAgImZ1bmN0b29scy50b3RhbF9vcmRlcmluZygpIi5cblxuICAgU2VlIHRoZSBwYXJhZ3JhcGggb24gIl9faGFzaF9fKCkiIGZvciBzb21lIGltcG9ydGFudCBub3RlcyBvblxuICAgY3JlYXRpbmcgKmhhc2hhYmxlKiBvYmplY3RzIHdoaWNoIHN1cHBvcnQgY3VzdG9tIGNvbXBhcmlzb25cbiAgIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLlxuXG4gICBUaGVyZSBhcmUgbm8gc3dhcHBlZC1hcmd1bWVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzICh0byBiZSB1c2VkXG4gICB3aGVuIHRoZSBsZWZ0IGFyZ3VtZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiBidXQgdGhlIHJpZ2h0XG4gICBhcmd1bWVudCBkb2VzKTsgcmF0aGVyLCAiX19sdF9fKCkiIGFuZCAiX19ndF9fKCkiIGFyZSBlYWNoIG90aGVyXCdzXG4gICByZWZsZWN0aW9uLCAiX19sZV9fKCkiIGFuZCAiX19nZV9fKCkiIGFyZSBlYWNoIG90aGVyXCdzIHJlZmxlY3Rpb24sXG4gICBhbmQgIl9fZXFfXygpIiBhbmQgIl9fbmVfXygpIiBhcmUgdGhlaXIgb3duIHJlZmxlY3Rpb24uIElmIHRoZVxuICAgb3BlcmFuZHMgYXJlIG9mIGRpZmZlcmVudCB0eXBlcywgYW5kIHJpZ2h0IG9wZXJhbmRcJ3MgdHlwZSBpcyBhXG4gICBkaXJlY3Qgb3IgaW5kaXJlY3Qgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZFwncyB0eXBlLCB0aGVcbiAgIHJlZmxlY3RlZCBtZXRob2Qgb2YgdGhlIHJpZ2h0IG9wZXJhbmQgaGFzIHByaW9yaXR5LCBvdGhlcndpc2UgdGhlXG4gICBsZWZ0IG9wZXJhbmRcJ3MgbWV0aG9kIGhhcyBwcmlvcml0eS4gIFZpcnR1YWwgc3ViY2xhc3NpbmcgaXMgbm90XG4gICBjb25zaWRlcmVkLlxuXG5vYmplY3QuX19oYXNoX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IGJ1aWx0LWluIGZ1bmN0aW9uICJoYXNoKCkiIGFuZCBmb3Igb3BlcmF0aW9ucyBvbiBtZW1iZXJzXG4gICBvZiBoYXNoZWQgY29sbGVjdGlvbnMgaW5jbHVkaW5nICJzZXQiLCAiZnJvemVuc2V0IiwgYW5kICJkaWN0Ii5cbiAgICJfX2hhc2hfXygpIiBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIuICBUaGUgb25seSByZXF1aXJlZCBwcm9wZXJ0eVxuICAgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlOyBpdCBpc1xuICAgYWR2aXNlZCB0byBzb21laG93IG1peCB0b2dldGhlciAoZS5nLiB1c2luZyBleGNsdXNpdmUgb3IpIHRoZSBoYXNoXG4gICB2YWx1ZXMgZm9yIHRoZSBjb21wb25lbnRzIG9mIHRoZSBvYmplY3QgdGhhdCBhbHNvIHBsYXkgYSBwYXJ0IGluXG4gICBjb21wYXJpc29uIG9mIG9iamVjdHMuXG5cbiAgIE5vdGU6ICJoYXNoKCkiIHRydW5jYXRlcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBhbiBvYmplY3RcJ3NcbiAgICAgY3VzdG9tICJfX2hhc2hfXygpIiBtZXRob2QgdG8gdGhlIHNpemUgb2YgYSAiUHlfc3NpemVfdCIuICBUaGlzXG4gICAgIGlzIHR5cGljYWxseSA4IGJ5dGVzIG9uIDY0LWJpdCBidWlsZHMgYW5kIDQgYnl0ZXMgb24gMzItYml0XG4gICAgIGJ1aWxkcy4gSWYgYW4gb2JqZWN0XCdzICAgIl9faGFzaF9fKCkiIG11c3QgaW50ZXJvcGVyYXRlIG9uIGJ1aWxkc1xuICAgICBvZiBkaWZmZXJlbnQgYml0IHNpemVzLCBiZSBzdXJlIHRvIGNoZWNrIHRoZSB3aWR0aCBvbiBhbGxcbiAgICAgc3VwcG9ydGVkIGJ1aWxkcy4gIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXMgd2l0aCAicHl0aG9uIC1jXG4gICAgICJpbXBvcnQgc3lzOyBwcmludChzeXMuaGFzaF9pbmZvLndpZHRoKSIiLlxuXG4gICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhbiAiX19lcV9fKCkiIG1ldGhvZCBpdCBzaG91bGQgbm90XG4gICBkZWZpbmUgYSAiX19oYXNoX18oKSIgb3BlcmF0aW9uIGVpdGhlcjsgaWYgaXQgZGVmaW5lcyAiX19lcV9fKCkiXG4gICBidXQgbm90ICJfX2hhc2hfXygpIiwgaXRzIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgYXMgaXRlbXMgaW5cbiAgIGhhc2hhYmxlIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzcyBkZWZpbmVzIG11dGFibGUgb2JqZWN0cyBhbmRcbiAgIGltcGxlbWVudHMgYW4gIl9fZXFfXygpIiBtZXRob2QsIGl0IHNob3VsZCBub3QgaW1wbGVtZW50XG4gICAiX19oYXNoX18oKSIsIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBoYXNoYWJsZSBjb2xsZWN0aW9uc1xuICAgcmVxdWlyZXMgdGhhdCBhIGtleVwncyBoYXNoIHZhbHVlIGlzIGltbXV0YWJsZSAoaWYgdGhlIG9iamVjdFwncyBoYXNoXG4gICB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuXG5cbiAgIFVzZXItZGVmaW5lZCBjbGFzc2VzIGhhdmUgIl9fZXFfXygpIiBhbmQgIl9faGFzaF9fKCkiIG1ldGhvZHMgYnlcbiAgIGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgd2l0aFxuICAgdGhlbXNlbHZlcykgYW5kICJ4Ll9faGFzaF9fKCkiIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgdmFsdWUgc3VjaFxuICAgdGhhdCAieCA9PSB5IiBpbXBsaWVzIGJvdGggdGhhdCAieCBpcyB5IiBhbmQgImhhc2goeCkgPT0gaGFzaCh5KSIuXG5cbiAgIEEgY2xhc3MgdGhhdCBvdmVycmlkZXMgIl9fZXFfXygpIiBhbmQgZG9lcyBub3QgZGVmaW5lICJfX2hhc2hfXygpIlxuICAgd2lsbCBoYXZlIGl0cyAiX19oYXNoX18oKSIgaW1wbGljaXRseSBzZXQgdG8gIk5vbmUiLiAgV2hlbiB0aGVcbiAgICJfX2hhc2hfXygpIiBtZXRob2Qgb2YgYSBjbGFzcyBpcyAiTm9uZSIsIGluc3RhbmNlcyBvZiB0aGUgY2xhc3NcbiAgIHdpbGwgcmFpc2UgYW4gYXBwcm9wcmlhdGUgIlR5cGVFcnJvciIgd2hlbiBhIHByb2dyYW0gYXR0ZW1wdHMgdG9cbiAgIHJldHJpZXZlIHRoZWlyIGhhc2ggdmFsdWUsIGFuZCB3aWxsIGFsc28gYmUgY29ycmVjdGx5IGlkZW50aWZpZWQgYXNcbiAgIHVuaGFzaGFibGUgd2hlbiBjaGVja2luZyAiaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSIuXG5cbiAgIElmIGEgY2xhc3MgdGhhdCBvdmVycmlkZXMgIl9fZXFfXygpIiBuZWVkcyB0byByZXRhaW4gdGhlXG4gICBpbXBsZW1lbnRhdGlvbiBvZiAiX19oYXNoX18oKSIgZnJvbSBhIHBhcmVudCBjbGFzcywgdGhlIGludGVycHJldGVyXG4gICBtdXN0IGJlIHRvbGQgdGhpcyBleHBsaWNpdGx5IGJ5IHNldHRpbmcgIl9faGFzaF9fID1cbiAgIDxQYXJlbnRDbGFzcz4uX19oYXNoX18iLlxuXG4gICBJZiBhIGNsYXNzIHRoYXQgZG9lcyBub3Qgb3ZlcnJpZGUgIl9fZXFfXygpIiB3aXNoZXMgdG8gc3VwcHJlc3NcbiAgIGhhc2ggc3VwcG9ydCwgaXQgc2hvdWxkIGluY2x1ZGUgIl9faGFzaF9fID0gTm9uZSIgaW4gdGhlIGNsYXNzXG4gICBkZWZpbml0aW9uLiBBIGNsYXNzIHdoaWNoIGRlZmluZXMgaXRzIG93biAiX19oYXNoX18oKSIgdGhhdFxuICAgZXhwbGljaXRseSByYWlzZXMgYSAiVHlwZUVycm9yIiB3b3VsZCBiZSBpbmNvcnJlY3RseSBpZGVudGlmaWVkIGFzXG4gICBoYXNoYWJsZSBieSBhbiAiaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSIgY2FsbC5cblxuICAgTm90ZTogQnkgZGVmYXVsdCwgdGhlICJfX2hhc2hfXygpIiB2YWx1ZXMgb2Ygc3RyLCBieXRlcyBhbmRcbiAgICAgZGF0ZXRpbWUgb2JqZWN0cyBhcmUgInNhbHRlZCIgd2l0aCBhbiB1bnByZWRpY3RhYmxlIHJhbmRvbSB2YWx1ZS5cbiAgICAgQWx0aG91Z2ggdGhleSByZW1haW4gY29uc3RhbnQgd2l0aGluIGFuIGluZGl2aWR1YWwgUHl0aG9uXG4gICAgIHByb2Nlc3MsIHRoZXkgYXJlIG5vdCBwcmVkaWN0YWJsZSBiZXR3ZWVuIHJlcGVhdGVkIGludm9jYXRpb25zIG9mXG4gICAgIFB5dGhvbi5UaGlzIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0IGEgZGVuaWFsLVxuICAgICBvZi1zZXJ2aWNlIGNhdXNlZCBieSBjYXJlZnVsbHktY2hvc2VuIGlucHV0cyB0aGF0IGV4cGxvaXQgdGhlXG4gICAgIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2Ugb2YgYSBkaWN0IGluc2VydGlvbiwgTyhuXjIpIGNvbXBsZXhpdHkuXG4gICAgIFNlZSBodHRwOi8vd3d3Lm9jZXJ0Lm9yZy9hZHZpc29yaWVzL29jZXJ0LTIwMTEtMDAzLmh0bWwgZm9yXG4gICAgIGRldGFpbHMuQ2hhbmdpbmcgaGFzaCB2YWx1ZXMgYWZmZWN0cyB0aGUgaXRlcmF0aW9uIG9yZGVyIG9mXG4gICAgIGRpY3RzLCBzZXRzIGFuZCBvdGhlciBtYXBwaW5ncy4gIFB5dGhvbiBoYXMgbmV2ZXIgbWFkZSBndWFyYW50ZWVzXG4gICAgIGFib3V0IHRoaXMgb3JkZXJpbmcgKGFuZCBpdCB0eXBpY2FsbHkgdmFyaWVzIGJldHdlZW4gMzItYml0IGFuZFxuICAgICA2NC1iaXQgYnVpbGRzKS5TZWUgYWxzbyAiUFlUSE9OSEFTSFNFRUQiLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBIYXNoIHJhbmRvbWl6YXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LlxuXG5vYmplY3QuX19ib29sX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0cnV0aCB2YWx1ZSB0ZXN0aW5nIGFuZCB0aGUgYnVpbHQtaW4gb3BlcmF0aW9uXG4gICAiYm9vbCgpIjsgc2hvdWxkIHJldHVybiAiRmFsc2UiIG9yICJUcnVlIi4gIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90XG4gICBkZWZpbmVkLCAiX19sZW5fXygpIiBpcyBjYWxsZWQsIGlmIGl0IGlzIGRlZmluZWQsIGFuZCB0aGUgb2JqZWN0IGlzXG4gICBjb25zaWRlcmVkIHRydWUgaWYgaXRzIHJlc3VsdCBpcyBub256ZXJvLiAgSWYgYSBjbGFzcyBkZWZpbmVzXG4gICBuZWl0aGVyICJfX2xlbl9fKCkiIG5vciAiX19ib29sX18oKSIsIGFsbCBpdHMgaW5zdGFuY2VzIGFyZVxuICAgY29uc2lkZXJlZCB0cnVlLlxuJywKLSAnZGVidWdnZXInOiB1J1xuInBkYiIgLS0tIFRoZSBQeXRob24gRGVidWdnZXJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbioqU291cmNlIGNvZGU6KiogTGliL3BkYi5weVxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBtb2R1bGUgInBkYiIgZGVmaW5lcyBhbiBpbnRlcmFjdGl2ZSBzb3VyY2UgY29kZSBkZWJ1Z2dlciBmb3JcblB5dGhvbiBwcm9ncmFtcy4gIEl0IHN1cHBvcnRzIHNldHRpbmcgKGNvbmRpdGlvbmFsKSBicmVha3BvaW50cyBhbmRcbnNpbmdsZSBzdGVwcGluZyBhdCB0aGUgc291cmNlIGxpbmUgbGV2ZWwsIGluc3BlY3Rpb24gb2Ygc3RhY2sgZnJhbWVzLFxuc291cmNlIGNvZGUgbGlzdGluZywgYW5kIGV2YWx1YXRpb24gb2YgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIGluIHRoZVxuY29udGV4dCBvZiBhbnkgc3RhY2sgZnJhbWUuICBJdCBhbHNvIHN1cHBvcnRzIHBvc3QtbW9ydGVtIGRlYnVnZ2luZ1xuYW5kIGNhbiBiZSBjYWxsZWQgdW5kZXIgcHJvZ3JhbSBjb250cm9sLlxuXG5UaGUgZGVidWdnZXIgaXMgZXh0ZW5zaWJsZSAtLSBpdCBpcyBhY3R1YWxseSBkZWZpbmVkIGFzIHRoZSBjbGFzc1xuIlBkYiIuIFRoaXMgaXMgY3VycmVudGx5IHVuZG9jdW1lbnRlZCBidXQgZWFzaWx5IHVuZGVyc3Rvb2QgYnkgcmVhZGluZ1xudGhlIHNvdXJjZS4gIFRoZSBleHRlbnNpb24gaW50ZXJmYWNlIHVzZXMgdGhlIG1vZHVsZXMgImJkYiIgYW5kICJjbWQiLlxuXG5UaGUgZGVidWdnZXJcJ3MgcHJvbXB0IGlzICIoUGRiKSIuIFR5cGljYWwgdXNhZ2UgdG8gcnVuIGEgcHJvZ3JhbSB1bmRlclxuY29udHJvbCBvZiB0aGUgZGVidWdnZXIgaXM6XG5cbiAgID4+PiBpbXBvcnQgcGRiXG4gICA+Pj4gaW1wb3J0IG15bW9kdWxlXG4gICA+Pj4gcGRiLnJ1bihcJ215bW9kdWxlLnRlc3QoKVwnKVxuICAgPiA8c3RyaW5nPigwKT8oKVxuICAgKFBkYikgY29udGludWVcbiAgID4gPHN0cmluZz4oMSk/KClcbiAgIChQZGIpIGNvbnRpbnVlXG4gICBOYW1lRXJyb3I6IFwnc3BhbVwnXG4gICA+IDxzdHJpbmc+KDEpPygpXG4gICAoUGRiKVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBUYWItY29tcGxldGlvbiB2aWEgdGhlICJyZWFkbGluZSIgbW9kdWxlIGlzXG5hdmFpbGFibGUgZm9yIGNvbW1hbmRzIGFuZCBjb21tYW5kIGFyZ3VtZW50cywgZS5nLiB0aGUgY3VycmVudCBnbG9iYWxcbmFuZCBsb2NhbCBuYW1lcyBhcmUgb2ZmZXJlZCBhcyBhcmd1bWVudHMgb2YgdGhlICJwIiBjb21tYW5kLlxuXG4icGRiLnB5IiBjYW4gYWxzbyBiZSBpbnZva2VkIGFzIGEgc2NyaXB0IHRvIGRlYnVnIG90aGVyIHNjcmlwdHMuICBGb3JcbmV4YW1wbGU6XG5cbiAgIHB5dGhvbjMgLW0gcGRiIG15c2NyaXB0LnB5XG5cbldoZW4gaW52b2tlZCBhcyBhIHNjcmlwdCwgcGRiIHdpbGwgYXV0b21hdGljYWxseSBlbnRlciBwb3N0LW1vcnRlbVxuZGVidWdnaW5nIGlmIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIGV4aXRzIGFibm9ybWFsbHkuICBBZnRlciBwb3N0LVxubW9ydGVtIGRlYnVnZ2luZyAob3IgYWZ0ZXIgbm9ybWFsIGV4aXQgb2YgdGhlIHByb2dyYW0pLCBwZGIgd2lsbFxucmVzdGFydCB0aGUgcHJvZ3JhbS4gIEF1dG9tYXRpYyByZXN0YXJ0aW5nIHByZXNlcnZlcyBwZGJcJ3Mgc3RhdGUgKHN1Y2hcbmFzIGJyZWFrcG9pbnRzKSBhbmQgaW4gbW9zdCBjYXNlcyBpcyBtb3JlIHVzZWZ1bCB0aGFuIHF1aXR0aW5nIHRoZVxuZGVidWdnZXIgdXBvbiBwcm9ncmFtXCdzIGV4aXQuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuMjogInBkYi5weSIgbm93IGFjY2VwdHMgYSAiLWMiIG9wdGlvbiB0aGF0IGV4ZWN1dGVzXG5jb21tYW5kcyBhcyBpZiBnaXZlbiBpbiBhICIucGRicmMiIGZpbGUsIHNlZSAqRGVidWdnZXIgQ29tbWFuZHMqLlxuXG5UaGUgdHlwaWNhbCB1c2FnZSB0byBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlciBmcm9tIGEgcnVubmluZyBwcm9ncmFtIGlzXG50byBpbnNlcnRcblxuICAgaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpXG5cbmF0IHRoZSBsb2NhdGlvbiB5b3Ugd2FudCB0byBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlci4gIFlvdSBjYW4gdGhlblxuc3RlcCB0aHJvdWdoIHRoZSBjb2RlIGZvbGxvd2luZyB0aGlzIHN0YXRlbWVudCwgYW5kIGNvbnRpbnVlIHJ1bm5pbmdcbndpdGhvdXQgdGhlIGRlYnVnZ2VyIHVzaW5nIHRoZSAiY29udGludWUiIGNvbW1hbmQuXG5cblRoZSB0eXBpY2FsIHVzYWdlIHRvIGluc3BlY3QgYSBjcmFzaGVkIHByb2dyYW0gaXM6XG5cbiAgID4+PiBpbXBvcnQgcGRiXG4gICA+Pj4gaW1wb3J0IG15bW9kdWxlXG4gICA+Pj4gbXltb2R1bGUudGVzdCgpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID9cbiAgICAgRmlsZSAiLi9teW1vZHVsZS5weSIsIGxpbmUgNCwgaW4gdGVzdFxuICAgICAgIHRlc3QyKClcbiAgICAgRmlsZSAiLi9teW1vZHVsZS5weSIsIGxpbmUgMywgaW4gdGVzdDJcbiAgICAgICBwcmludChzcGFtKVxuICAgTmFtZUVycm9yOiBzcGFtXG4gICA+Pj4gcGRiLnBtKClcbiAgID4gLi9teW1vZHVsZS5weSgzKXRlc3QyKClcbiAgIC0+IHByaW50KHNwYW0pXG4gICAoUGRiKVxuXG5UaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM7IGVhY2ggZW50ZXJzIHRoZSBkZWJ1Z2dlclxuaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgd2F5OlxuXG5wZGIucnVuKHN0YXRlbWVudCwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSlcblxuICAgRXhlY3V0ZSB0aGUgKnN0YXRlbWVudCogKGdpdmVuIGFzIGEgc3RyaW5nIG9yIGEgY29kZSBvYmplY3QpIHVuZGVyXG4gICBkZWJ1Z2dlciBjb250cm9sLiAgVGhlIGRlYnVnZ2VyIHByb21wdCBhcHBlYXJzIGJlZm9yZSBhbnkgY29kZSBpc1xuICAgZXhlY3V0ZWQ7IHlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzIGFuZCB0eXBlICJjb250aW51ZSIsIG9yIHlvdSBjYW5cbiAgIHN0ZXAgdGhyb3VnaCB0aGUgc3RhdGVtZW50IHVzaW5nICJzdGVwIiBvciAibmV4dCIgKGFsbCB0aGVzZVxuICAgY29tbWFuZHMgYXJlIGV4cGxhaW5lZCBiZWxvdykuICBUaGUgb3B0aW9uYWwgKmdsb2JhbHMqIGFuZCAqbG9jYWxzKlxuICAgYXJndW1lbnRzIHNwZWNpZnkgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRoZSBjb2RlIGlzIGV4ZWN1dGVkOyBieVxuICAgZGVmYXVsdCB0aGUgZGljdGlvbmFyeSBvZiB0aGUgbW9kdWxlICJfX21haW5fXyIgaXMgdXNlZC4gIChTZWUgdGhlXG4gICBleHBsYW5hdGlvbiBvZiB0aGUgYnVpbHQtaW4gImV4ZWMoKSIgb3IgImV2YWwoKSIgZnVuY3Rpb25zLilcblxucGRiLnJ1bmV2YWwoZXhwcmVzc2lvbiwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSlcblxuICAgRXZhbHVhdGUgdGhlICpleHByZXNzaW9uKiAoZ2l2ZW4gYXMgYSBzdHJpbmcgb3IgYSBjb2RlIG9iamVjdClcbiAgIHVuZGVyIGRlYnVnZ2VyIGNvbnRyb2wuICBXaGVuICJydW5ldmFsKCkiIHJldHVybnMsIGl0IHJldHVybnMgdGhlXG4gICB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4gIE90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG9cbiAgICJydW4oKSIuXG5cbnBkYi5ydW5jYWxsKGZ1bmN0aW9uLCAqYXJncywgKiprd2RzKVxuXG4gICBDYWxsIHRoZSAqZnVuY3Rpb24qIChhIGZ1bmN0aW9uIG9yIG1ldGhvZCBvYmplY3QsIG5vdCBhIHN0cmluZylcbiAgIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gIFdoZW4gInJ1bmNhbGwoKSIgcmV0dXJucywgaXQgcmV0dXJuc1xuICAgd2hhdGV2ZXIgdGhlIGZ1bmN0aW9uIGNhbGwgcmV0dXJuZWQuICBUaGUgZGVidWdnZXIgcHJvbXB0IGFwcGVhcnNcbiAgIGFzIHNvb24gYXMgdGhlIGZ1bmN0aW9uIGlzIGVudGVyZWQuXG5cbnBkYi5zZXRfdHJhY2UoKVxuXG4gICBFbnRlciB0aGUgZGVidWdnZXIgYXQgdGhlIGNhbGxpbmcgc3RhY2sgZnJhbWUuICBUaGlzIGlzIHVzZWZ1bCB0b1xuICAgaGFyZC1jb2RlIGEgYnJlYWtwb2ludCBhdCBhIGdpdmVuIHBvaW50IGluIGEgcHJvZ3JhbSwgZXZlbiBpZiB0aGVcbiAgIGNvZGUgaXMgbm90IG90aGVyd2lzZSBiZWluZyBkZWJ1Z2dlZCAoZS5nLiB3aGVuIGFuIGFzc2VydGlvblxuICAgZmFpbHMpLlxuXG5wZGIucG9zdF9tb3J0ZW0odHJhY2ViYWNrPU5vbmUpXG5cbiAgIEVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgZ2l2ZW4gKnRyYWNlYmFjayogb2JqZWN0LiAgSWYgbm9cbiAgICp0cmFjZWJhY2sqIGlzIGdpdmVuLCBpdCB1c2VzIHRoZSBvbmUgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IGlzXG4gICBjdXJyZW50bHkgYmVpbmcgaGFuZGxlZCAoYW4gZXhjZXB0aW9uIG11c3QgYmUgYmVpbmcgaGFuZGxlZCBpZiB0aGVcbiAgIGRlZmF1bHQgaXMgdG8gYmUgdXNlZCkuXG5cbnBkYi5wbSgpXG5cbiAgIEVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgdHJhY2ViYWNrIGZvdW5kIGluXG4gICAic3lzLmxhc3RfdHJhY2ViYWNrIi5cblxuVGhlICJydW4qIiBmdW5jdGlvbnMgYW5kICJzZXRfdHJhY2UoKSIgYXJlIGFsaWFzZXMgZm9yIGluc3RhbnRpYXRpbmdcbnRoZSAiUGRiIiBjbGFzcyBhbmQgY2FsbGluZyB0aGUgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUuICBJZiB5b3Ugd2FudFxudG8gYWNjZXNzIGZ1cnRoZXIgZmVhdHVyZXMsIHlvdSBoYXZlIHRvIGRvIHRoaXMgeW91cnNlbGY6XG5cbmNsYXNzIGNsYXNzIHBkYi5QZGIoY29tcGxldGVrZXk9XCd0YWJcJywgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHNraXA9Tm9uZSwgbm9zaWdpbnQ9RmFsc2UpXG5cbiAgICJQZGIiIGlzIHRoZSBkZWJ1Z2dlciBjbGFzcy5cblxuICAgVGhlICpjb21wbGV0ZWtleSosICpzdGRpbiogYW5kICpzdGRvdXQqIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZVxuICAgdW5kZXJseWluZyAiY21kLkNtZCIgY2xhc3M7IHNlZSB0aGUgZGVzY3JpcHRpb24gdGhlcmUuXG5cbiAgIFRoZSAqc2tpcCogYXJndW1lbnQsIGlmIGdpdmVuLCBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mIGdsb2Itc3R5bGVcbiAgIG1vZHVsZSBuYW1lIHBhdHRlcm5zLiAgVGhlIGRlYnVnZ2VyIHdpbGwgbm90IHN0ZXAgaW50byBmcmFtZXMgdGhhdFxuICAgb3JpZ2luYXRlIGluIGEgbW9kdWxlIHRoYXQgbWF0Y2hlcyBvbmUgb2YgdGhlc2UgcGF0dGVybnMuIFsxXVxuXG4gICBCeSBkZWZhdWx0LCBQZGIgc2V0cyBhIGhhbmRsZXIgZm9yIHRoZSBTSUdJTlQgc2lnbmFsICh3aGljaCBpcyBzZW50XG4gICB3aGVuIHRoZSB1c2VyIHByZXNzZXMgIkN0cmwtQyIgb24gdGhlIGNvbnNvbGUpIHdoZW4geW91IGdpdmUgYVxuICAgImNvbnRpbnVlIiBjb21tYW5kLiBUaGlzIGFsbG93cyB5b3UgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXJcbiAgIGFnYWluIGJ5IHByZXNzaW5nICJDdHJsLUMiLiAgSWYgeW91IHdhbnQgUGRiIG5vdCB0byB0b3VjaCB0aGVcbiAgIFNJR0lOVCBoYW5kbGVyLCBzZXQgKm5vc2lnaW50KiB0b3QgdHJ1ZS5cblxuICAgRXhhbXBsZSBjYWxsIHRvIGVuYWJsZSB0cmFjaW5nIHdpdGggKnNraXAqOlxuXG4gICAgICBpbXBvcnQgcGRiOyBwZGIuUGRiKHNraXA9W1wnZGphbmdvLipcJ10pLnNldF90cmFjZSgpXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMTogVGhlICpza2lwKiBhcmd1bWVudC5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yOiBUaGUgKm5vc2lnaW50KiBhcmd1bWVudC4gIFByZXZpb3VzbHksIGEgU0lHSU5UXG4gICBoYW5kbGVyIHdhcyBuZXZlciBzZXQgYnkgUGRiLlxuXG4gICBydW4oc3RhdGVtZW50LCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuICAgcnVuZXZhbChleHByZXNzaW9uLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuICAgcnVuY2FsbChmdW5jdGlvbiwgKmFyZ3MsICoqa3dkcylcbiAgIHNldF90cmFjZSgpXG5cbiAgICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGZ1bmN0aW9ucyBleHBsYWluZWQgYWJvdmUuXG5cblxuRGVidWdnZXIgQ29tbWFuZHNcbj09PT09PT09PT09PT09PT09XG5cblRoZSBjb21tYW5kcyByZWNvZ25pemVkIGJ5IHRoZSBkZWJ1Z2dlciBhcmUgbGlzdGVkIGJlbG93LiAgTW9zdFxuY29tbWFuZHMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIG9uZSBvciB0d28gbGV0dGVycyBhcyBpbmRpY2F0ZWQ7IGUuZy5cbiJoKGVscCkiIG1lYW5zIHRoYXQgZWl0aGVyICJoIiBvciAiaGVscCIgY2FuIGJlIHVzZWQgdG8gZW50ZXIgdGhlIGhlbHBcbmNvbW1hbmQgKGJ1dCBub3QgImhlIiBvciAiaGVsIiwgbm9yICJIIiBvciAiSGVscCIgb3IgIkhFTFAiKS5cbkFyZ3VtZW50cyB0byBjb21tYW5kcyBtdXN0IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIChzcGFjZXMgb3JcbnRhYnMpLiAgT3B0aW9uYWwgYXJndW1lbnRzIGFyZSBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMgKCJbXSIpIGluXG50aGUgY29tbWFuZCBzeW50YXg7IHRoZSBzcXVhcmUgYnJhY2tldHMgbXVzdCBub3QgYmUgdHlwZWQuXG5BbHRlcm5hdGl2ZXMgaW4gdGhlIGNvbW1hbmQgc3ludGF4IGFyZSBzZXBhcmF0ZWQgYnkgYSB2ZXJ0aWNhbCBiYXJcbigifCIpLlxuXG5FbnRlcmluZyBhIGJsYW5rIGxpbmUgcmVwZWF0cyB0aGUgbGFzdCBjb21tYW5kIGVudGVyZWQuICBFeGNlcHRpb246IGlmXG50aGUgbGFzdCBjb21tYW5kIHdhcyBhICJsaXN0IiBjb21tYW5kLCB0aGUgbmV4dCAxMSBsaW5lcyBhcmUgbGlzdGVkLlxuXG5Db21tYW5kcyB0aGF0IHRoZSBkZWJ1Z2dlciBkb2VzblwndCByZWNvZ25pemUgYXJlIGFzc3VtZWQgdG8gYmUgUHl0aG9uXG5zdGF0ZW1lbnRzIGFuZCBhcmUgZXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb2dyYW0gYmVpbmdcbmRlYnVnZ2VkLiAgUHl0aG9uIHN0YXRlbWVudHMgY2FuIGFsc28gYmUgcHJlZml4ZWQgd2l0aCBhbiBleGNsYW1hdGlvblxucG9pbnQgKCIhIikuICBUaGlzIGlzIGEgcG93ZXJmdWwgd2F5IHRvIGluc3BlY3QgdGhlIHByb2dyYW0gYmVpbmdcbmRlYnVnZ2VkOyBpdCBpcyBldmVuIHBvc3NpYmxlIHRvIGNoYW5nZSBhIHZhcmlhYmxlIG9yIGNhbGwgYSBmdW5jdGlvbi5cbldoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiBzdWNoIGEgc3RhdGVtZW50LCB0aGUgZXhjZXB0aW9uIG5hbWUgaXNcbnByaW50ZWQgYnV0IHRoZSBkZWJ1Z2dlclwncyBzdGF0ZSBpcyBub3QgY2hhbmdlZC5cblxuVGhlIGRlYnVnZ2VyIHN1cHBvcnRzICphbGlhc2VzKi4gIEFsaWFzZXMgY2FuIGhhdmUgcGFyYW1ldGVycyB3aGljaFxuYWxsb3dzIG9uZSBhIGNlcnRhaW4gbGV2ZWwgb2YgYWRhcHRhYmlsaXR5IHRvIHRoZSBjb250ZXh0IHVuZGVyXG5leGFtaW5hdGlvbi5cblxuTXVsdGlwbGUgY29tbWFuZHMgbWF5IGJlIGVudGVyZWQgb24gYSBzaW5nbGUgbGluZSwgc2VwYXJhdGVkIGJ5ICI7OyIuXG4oQSBzaW5nbGUgIjsiIGlzIG5vdCB1c2VkIGFzIGl0IGlzIHRoZSBzZXBhcmF0b3IgZm9yIG11bHRpcGxlIGNvbW1hbmRzXG5pbiBhIGxpbmUgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIFB5dGhvbiBwYXJzZXIuKSAgTm8gaW50ZWxsaWdlbmNlIGlzXG5hcHBsaWVkIHRvIHNlcGFyYXRpbmcgdGhlIGNvbW1hbmRzOyB0aGUgaW5wdXQgaXMgc3BsaXQgYXQgdGhlIGZpcnN0XG4iOzsiIHBhaXIsIGV2ZW4gaWYgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIHF1b3RlZCBzdHJpbmcuXG5cbklmIGEgZmlsZSAiLnBkYnJjIiBleGlzdHMgaW4gdGhlIHVzZXJcJ3MgaG9tZSBkaXJlY3Rvcnkgb3IgaW4gdGhlXG5jdXJyZW50IGRpcmVjdG9yeSwgaXQgaXMgcmVhZCBpbiBhbmQgZXhlY3V0ZWQgYXMgaWYgaXQgaGFkIGJlZW4gdHlwZWRcbmF0IHRoZSBkZWJ1Z2dlciBwcm9tcHQuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGFsaWFzZXMuICBJZlxuYm90aCBmaWxlcyBleGlzdCwgdGhlIG9uZSBpbiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgcmVhZCBmaXJzdCBhbmRcbmFsaWFzZXMgZGVmaW5lZCB0aGVyZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgbG9jYWwgZmlsZS5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogIi5wZGJyYyIgY2FuIG5vdyBjb250YWluIGNvbW1hbmRzIHRoYXRcbmNvbnRpbnVlIGRlYnVnZ2luZywgc3VjaCBhcyAiY29udGludWUiIG9yICJuZXh0Ii4gIFByZXZpb3VzbHksIHRoZXNlXG5jb21tYW5kcyBoYWQgbm8gZWZmZWN0LlxuXG5oKGVscCkgW2NvbW1hbmRdXG5cbiAgIFdpdGhvdXQgYXJndW1lbnQsIHByaW50IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcy4gIFdpdGggYVxuICAgKmNvbW1hbmQqIGFzIGFyZ3VtZW50LCBwcmludCBoZWxwIGFib3V0IHRoYXQgY29tbWFuZC4gICJoZWxwIHBkYiJcbiAgIGRpc3BsYXlzIHRoZSBmdWxsIGRvY3VtZW50YXRpb24gKHRoZSBkb2NzdHJpbmcgb2YgdGhlICJwZGIiXG4gICBtb2R1bGUpLiAgU2luY2UgdGhlICpjb21tYW5kKiBhcmd1bWVudCBtdXN0IGJlIGFuIGlkZW50aWZpZXIsICJoZWxwXG4gICBleGVjIiBtdXN0IGJlIGVudGVyZWQgdG8gZ2V0IGhlbHAgb24gdGhlICIhIiBjb21tYW5kLlxuXG53KGhlcmUpXG5cbiAgIFByaW50IGEgc3RhY2sgdHJhY2UsIHdpdGggdGhlIG1vc3QgcmVjZW50IGZyYW1lIGF0IHRoZSBib3R0b20uICBBblxuICAgYXJyb3cgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGZyYW1lLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBjb250ZXh0IG9mXG4gICBtb3N0IGNvbW1hbmRzLlxuXG5kKG93bikgW2NvdW50XVxuXG4gICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lICpjb3VudCogKGRlZmF1bHQgb25lKSBsZXZlbHMgZG93biBpbiB0aGVcbiAgIHN0YWNrIHRyYWNlICh0byBhIG5ld2VyIGZyYW1lKS5cblxudShwKSBbY291bnRdXG5cbiAgIE1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgKmNvdW50KiAoZGVmYXVsdCBvbmUpIGxldmVscyB1cCBpbiB0aGUgc3RhY2tcbiAgIHRyYWNlICh0byBhbiBvbGRlciBmcmFtZSkuXG5cbmIocmVhaykgWyhbZmlsZW5hbWU6XWxpbmVubyB8IGZ1bmN0aW9uKSBbLCBjb25kaXRpb25dXVxuXG4gICBXaXRoIGEgKmxpbmVubyogYXJndW1lbnQsIHNldCBhIGJyZWFrIHRoZXJlIGluIHRoZSBjdXJyZW50IGZpbGUuXG4gICBXaXRoIGEgKmZ1bmN0aW9uKiBhcmd1bWVudCwgc2V0IGEgYnJlYWsgYXQgdGhlIGZpcnN0IGV4ZWN1dGFibGVcbiAgIHN0YXRlbWVudCB3aXRoaW4gdGhhdCBmdW5jdGlvbi4gIFRoZSBsaW5lIG51bWJlciBtYXkgYmUgcHJlZml4ZWRcbiAgIHdpdGggYSBmaWxlbmFtZSBhbmQgYSBjb2xvbiwgdG8gc3BlY2lmeSBhIGJyZWFrcG9pbnQgaW4gYW5vdGhlclxuICAgZmlsZSAocHJvYmFibHkgb25lIHRoYXQgaGFzblwndCBiZWVuIGxvYWRlZCB5ZXQpLiAgVGhlIGZpbGUgaXNcbiAgIHNlYXJjaGVkIG9uICJzeXMucGF0aCIuICBOb3RlIHRoYXQgZWFjaCBicmVha3BvaW50IGlzIGFzc2lnbmVkIGFcbiAgIG51bWJlciB0byB3aGljaCBhbGwgdGhlIG90aGVyIGJyZWFrcG9pbnQgY29tbWFuZHMgcmVmZXIuXG5cbiAgIElmIGEgc2Vjb25kIGFyZ3VtZW50IGlzIHByZXNlbnQsIGl0IGlzIGFuIGV4cHJlc3Npb24gd2hpY2ggbXVzdFxuICAgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC5cblxuICAgV2l0aG91dCBhcmd1bWVudCwgbGlzdCBhbGwgYnJlYWtzLCBpbmNsdWRpbmcgZm9yIGVhY2ggYnJlYWtwb2ludCxcbiAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBicmVha3BvaW50IGhhcyBiZWVuIGhpdCwgdGhlIGN1cnJlbnRcbiAgIGlnbm9yZSBjb3VudCwgYW5kIHRoZSBhc3NvY2lhdGVkIGNvbmRpdGlvbiBpZiBhbnkuXG5cbnRicmVhayBbKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssIGNvbmRpdGlvbl1dXG5cbiAgIFRlbXBvcmFyeSBicmVha3BvaW50LCB3aGljaCBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBpc1xuICAgZmlyc3QgaGl0LiBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgImJyZWFrIi5cblxuY2woZWFyKSBbZmlsZW5hbWU6bGluZW5vIHwgYnBudW1iZXIgW2JwbnVtYmVyIC4uLl1dXG5cbiAgIFdpdGggYSAqZmlsZW5hbWU6bGluZW5vKiBhcmd1bWVudCwgY2xlYXIgYWxsIHRoZSBicmVha3BvaW50cyBhdFxuICAgdGhpcyBsaW5lLiBXaXRoIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgYnJlYWtwb2ludCBudW1iZXJzLCBjbGVhclxuICAgdGhvc2UgYnJlYWtwb2ludHMuIFdpdGhvdXQgYXJndW1lbnQsIGNsZWFyIGFsbCBicmVha3MgKGJ1dCBmaXJzdFxuICAgYXNrIGNvbmZpcm1hdGlvbikuXG5cbmRpc2FibGUgW2JwbnVtYmVyIFticG51bWJlciAuLi5dXVxuXG4gICBEaXNhYmxlIHRoZSBicmVha3BvaW50cyBnaXZlbiBhcyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mXG4gICBicmVha3BvaW50IG51bWJlcnMuICBEaXNhYmxpbmcgYSBicmVha3BvaW50IG1lYW5zIGl0IGNhbm5vdCBjYXVzZVxuICAgdGhlIHByb2dyYW0gdG8gc3RvcCBleGVjdXRpb24sIGJ1dCB1bmxpa2UgY2xlYXJpbmcgYSBicmVha3BvaW50LCBpdFxuICAgcmVtYWlucyBpbiB0aGUgbGlzdCBvZiBicmVha3BvaW50cyBhbmQgY2FuIGJlIChyZS0pZW5hYmxlZC5cblxuZW5hYmxlIFticG51bWJlciBbYnBudW1iZXIgLi4uXV1cblxuICAgRW5hYmxlIHRoZSBicmVha3BvaW50cyBzcGVjaWZpZWQuXG5cbmlnbm9yZSBicG51bWJlciBbY291bnRdXG5cbiAgIFNldCB0aGUgaWdub3JlIGNvdW50IGZvciB0aGUgZ2l2ZW4gYnJlYWtwb2ludCBudW1iZXIuICBJZiBjb3VudCBpc1xuICAgb21pdHRlZCwgdGhlIGlnbm9yZSBjb3VudCBpcyBzZXQgdG8gMC4gIEEgYnJlYWtwb2ludCBiZWNvbWVzIGFjdGl2ZVxuICAgd2hlbiB0aGUgaWdub3JlIGNvdW50IGlzIHplcm8uICBXaGVuIG5vbi16ZXJvLCB0aGUgY291bnQgaXNcbiAgIGRlY3JlbWVudGVkIGVhY2ggdGltZSB0aGUgYnJlYWtwb2ludCBpcyByZWFjaGVkIGFuZCB0aGUgYnJlYWtwb2ludFxuICAgaXMgbm90IGRpc2FibGVkIGFuZCBhbnkgYXNzb2NpYXRlZCBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRydWUuXG5cbmNvbmRpdGlvbiBicG51bWJlciBbY29uZGl0aW9uXVxuXG4gICBTZXQgYSBuZXcgKmNvbmRpdGlvbiogZm9yIHRoZSBicmVha3BvaW50LCBhbiBleHByZXNzaW9uIHdoaWNoIG11c3RcbiAgIGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuICBJZiAqY29uZGl0aW9uKlxuICAgaXMgYWJzZW50LCBhbnkgZXhpc3RpbmcgY29uZGl0aW9uIGlzIHJlbW92ZWQ7IGkuZS4sIHRoZSBicmVha3BvaW50XG4gICBpcyBtYWRlIHVuY29uZGl0aW9uYWwuXG5cbmNvbW1hbmRzIFticG51bWJlcl1cblxuICAgU3BlY2lmeSBhIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGJyZWFrcG9pbnQgbnVtYmVyICpicG51bWJlciouICBUaGVcbiAgIGNvbW1hbmRzIHRoZW1zZWx2ZXMgYXBwZWFyIG9uIHRoZSBmb2xsb3dpbmcgbGluZXMuICBUeXBlIGEgbGluZVxuICAgY29udGFpbmluZyBqdXN0ICJlbmQiIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWFuZHMuIEFuIGV4YW1wbGU6XG5cbiAgICAgIChQZGIpIGNvbW1hbmRzIDFcbiAgICAgIChjb20pIHAgc29tZV92YXJpYWJsZVxuICAgICAgKGNvbSkgZW5kXG4gICAgICAoUGRiKVxuXG4gICBUbyByZW1vdmUgYWxsIGNvbW1hbmRzIGZyb20gYSBicmVha3BvaW50LCB0eXBlIGNvbW1hbmRzIGFuZCBmb2xsb3dcbiAgIGl0IGltbWVkaWF0ZWx5IHdpdGggImVuZCI7IHRoYXQgaXMsIGdpdmUgbm8gY29tbWFuZHMuXG5cbiAgIFdpdGggbm8gKmJwbnVtYmVyKiBhcmd1bWVudCwgY29tbWFuZHMgcmVmZXJzIHRvIHRoZSBsYXN0IGJyZWFrcG9pbnRcbiAgIHNldC5cblxuICAgWW91IGNhbiB1c2UgYnJlYWtwb2ludCBjb21tYW5kcyB0byBzdGFydCB5b3VyIHByb2dyYW0gdXAgYWdhaW4uXG4gICBTaW1wbHkgdXNlIHRoZSBjb250aW51ZSBjb21tYW5kLCBvciBzdGVwLCBvciBhbnkgb3RoZXIgY29tbWFuZCB0aGF0XG4gICByZXN1bWVzIGV4ZWN1dGlvbi5cblxuICAgU3BlY2lmeWluZyBhbnkgY29tbWFuZCByZXN1bWluZyBleGVjdXRpb24gKGN1cnJlbnRseSBjb250aW51ZSxcbiAgIHN0ZXAsIG5leHQsIHJldHVybiwganVtcCwgcXVpdCBhbmQgdGhlaXIgYWJicmV2aWF0aW9ucykgdGVybWluYXRlc1xuICAgdGhlIGNvbW1hbmQgbGlzdCAoYXMgaWYgdGhhdCBjb21tYW5kIHdhcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieVxuICAgZW5kKS4gVGhpcyBpcyBiZWNhdXNlIGFueSB0aW1lIHlvdSByZXN1bWUgZXhlY3V0aW9uIChldmVuIHdpdGggYVxuICAgc2ltcGxlIG5leHQgb3Igc3RlcCksIHlvdSBtYXkgZW5jb3VudGVyIGFub3RoZXIgYnJlYWtwb2ludC0td2hpY2hcbiAgIGNvdWxkIGhhdmUgaXRzIG93biBjb21tYW5kIGxpc3QsIGxlYWRpbmcgdG8gYW1iaWd1aXRpZXMgYWJvdXQgd2hpY2hcbiAgIGxpc3QgdG8gZXhlY3V0ZS5cblxuICAgSWYgeW91IHVzZSB0aGUgXCdzaWxlbnRcJyBjb21tYW5kIGluIHRoZSBjb21tYW5kIGxpc3QsIHRoZSB1c3VhbFxuICAgbWVzc2FnZSBhYm91dCBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQgaXMgbm90IHByaW50ZWQuICBUaGlzIG1heSBiZVxuICAgZGVzaXJhYmxlIGZvciBicmVha3BvaW50cyB0aGF0IGFyZSB0byBwcmludCBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kXG4gICB0aGVuIGNvbnRpbnVlLiAgSWYgbm9uZSBvZiB0aGUgb3RoZXIgY29tbWFuZHMgcHJpbnQgYW55dGhpbmcsIHlvdVxuICAgc2VlIG5vIHNpZ24gdGhhdCB0aGUgYnJlYWtwb2ludCB3YXMgcmVhY2hlZC5cblxucyh0ZXApXG5cbiAgIEV4ZWN1dGUgdGhlIGN1cnJlbnQgbGluZSwgc3RvcCBhdCB0aGUgZmlyc3QgcG9zc2libGUgb2NjYXNpb25cbiAgIChlaXRoZXIgaW4gYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBvciBvbiB0aGUgbmV4dCBsaW5lIGluIHRoZVxuICAgY3VycmVudCBmdW5jdGlvbikuXG5cbm4oZXh0KVxuXG4gICBDb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIG5leHQgbGluZSBpbiB0aGUgY3VycmVudCBmdW5jdGlvbiBpc1xuICAgcmVhY2hlZCBvciBpdCByZXR1cm5zLiAgKFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIm5leHQiIGFuZCAic3RlcCJcbiAgIGlzIHRoYXQgInN0ZXAiIHN0b3BzIGluc2lkZSBhIGNhbGxlZCBmdW5jdGlvbiwgd2hpbGUgIm5leHQiXG4gICBleGVjdXRlcyBjYWxsZWQgZnVuY3Rpb25zIGF0IChuZWFybHkpIGZ1bGwgc3BlZWQsIG9ubHkgc3RvcHBpbmcgYXRcbiAgIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uKVxuXG51bnQoaWwpIFtsaW5lbm9dXG5cbiAgIFdpdGhvdXQgYXJndW1lbnQsIGNvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbGluZSB3aXRoIGEgbnVtYmVyXG4gICBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgb25lIGlzIHJlYWNoZWQuXG5cbiAgIFdpdGggYSBsaW5lIG51bWJlciwgY29udGludWUgZXhlY3V0aW9uIHVudGlsIGEgbGluZSB3aXRoIGEgbnVtYmVyXG4gICBncmVhdGVyIG9yIGVxdWFsIHRvIHRoYXQgaXMgcmVhY2hlZC4gIEluIGJvdGggY2FzZXMsIGFsc28gc3RvcCB3aGVuXG4gICB0aGUgY3VycmVudCBmcmFtZSByZXR1cm5zLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBBbGxvdyBnaXZpbmcgYW4gZXhwbGljaXQgbGluZSBudW1iZXIuXG5cbnIoZXR1cm4pXG5cbiAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY3VycmVudCBmdW5jdGlvbiByZXR1cm5zLlxuXG5jKG9udChpbnVlKSlcblxuICAgQ29udGludWUgZXhlY3V0aW9uLCBvbmx5IHN0b3Agd2hlbiBhIGJyZWFrcG9pbnQgaXMgZW5jb3VudGVyZWQuXG5cbmoodW1wKSBsaW5lbm9cblxuICAgU2V0IHRoZSBuZXh0IGxpbmUgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkLiAgT25seSBhdmFpbGFibGUgaW4gdGhlXG4gICBib3R0b20tbW9zdCBmcmFtZS4gIFRoaXMgbGV0cyB5b3UganVtcCBiYWNrIGFuZCBleGVjdXRlIGNvZGUgYWdhaW4sXG4gICBvciBqdW1wIGZvcndhcmQgdG8gc2tpcCBjb2RlIHRoYXQgeW91IGRvblwndCB3YW50IHRvIHJ1bi5cblxuICAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgbm90IGFsbCBqdW1wcyBhcmUgYWxsb3dlZCAtLSBmb3IgaW5zdGFuY2VcbiAgIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBqdW1wIGludG8gdGhlIG1pZGRsZSBvZiBhICJmb3IiIGxvb3Agb3Igb3V0XG4gICBvZiBhICJmaW5hbGx5IiBjbGF1c2UuXG5cbmwoaXN0KSBbZmlyc3RbLCBsYXN0XV1cblxuICAgTGlzdCBzb3VyY2UgY29kZSBmb3IgdGhlIGN1cnJlbnQgZmlsZS4gIFdpdGhvdXQgYXJndW1lbnRzLCBsaXN0IDExXG4gICBsaW5lcyBhcm91bmQgdGhlIGN1cnJlbnQgbGluZSBvciBjb250aW51ZSB0aGUgcHJldmlvdXMgbGlzdGluZy5cbiAgIFdpdGggIi4iIGFzIGFyZ3VtZW50LCBsaXN0IDExIGxpbmVzIGFyb3VuZCB0aGUgY3VycmVudCBsaW5lLiAgV2l0aFxuICAgb25lIGFyZ3VtZW50LCBsaXN0IDExIGxpbmVzIGFyb3VuZCBhdCB0aGF0IGxpbmUuICBXaXRoIHR3b1xuICAgYXJndW1lbnRzLCBsaXN0IHRoZSBnaXZlbiByYW5nZTsgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBsZXNzXG4gICB0aGFuIHRoZSBmaXJzdCwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBjb3VudC5cblxuICAgVGhlIGN1cnJlbnQgbGluZSBpbiB0aGUgY3VycmVudCBmcmFtZSBpcyBpbmRpY2F0ZWQgYnkgIi0+Ii4gIElmIGFuXG4gICBleGNlcHRpb24gaXMgYmVpbmcgZGVidWdnZWQsIHRoZSBsaW5lIHdoZXJlIHRoZSBleGNlcHRpb24gd2FzXG4gICBvcmlnaW5hbGx5IHJhaXNlZCBvciBwcm9wYWdhdGVkIGlzIGluZGljYXRlZCBieSAiPj4iLCBpZiBpdCBkaWZmZXJzXG4gICBmcm9tIHRoZSBjdXJyZW50IGxpbmUuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMjogVGhlICI+PiIgbWFya2VyLlxuXG5sbCB8IGxvbmdsaXN0XG5cbiAgIExpc3QgYWxsIHNvdXJjZSBjb2RlIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbiBvciBmcmFtZS5cbiAgIEludGVyZXN0aW5nIGxpbmVzIGFyZSBtYXJrZWQgYXMgZm9yICJsaXN0Ii5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG5hKHJncylcblxuICAgUHJpbnQgdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uXG5cbnAgZXhwcmVzc2lvblxuXG4gICBFdmFsdWF0ZSB0aGUgKmV4cHJlc3Npb24qIGluIHRoZSBjdXJyZW50IGNvbnRleHQgYW5kIHByaW50IGl0c1xuICAgdmFsdWUuXG5cbiAgIE5vdGU6ICJwcmludCgpIiBjYW4gYWxzbyBiZSB1c2VkLCBidXQgaXMgbm90IGEgZGVidWdnZXIgY29tbWFuZFxuICAgICAtLS0gdGhpcyBleGVjdXRlcyB0aGUgUHl0aG9uICJwcmludCgpIiBmdW5jdGlvbi5cblxucHAgZXhwcmVzc2lvblxuXG4gICBMaWtlIHRoZSAicCIgY29tbWFuZCwgZXhjZXB0IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBwcmV0dHktXG4gICBwcmludGVkIHVzaW5nIHRoZSAicHByaW50IiBtb2R1bGUuXG5cbndoYXRpcyBleHByZXNzaW9uXG5cbiAgIFByaW50IHRoZSB0eXBlIG9mIHRoZSAqZXhwcmVzc2lvbiouXG5cbnNvdXJjZSBleHByZXNzaW9uXG5cbiAgIFRyeSB0byBnZXQgc291cmNlIGNvZGUgZm9yIHRoZSBnaXZlbiBvYmplY3QgYW5kIGRpc3BsYXkgaXQuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxuZGlzcGxheSBbZXhwcmVzc2lvbl1cblxuICAgRGlzcGxheSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaWYgaXQgY2hhbmdlZCwgZWFjaCB0aW1lXG4gICBleGVjdXRpb24gc3RvcHMgaW4gdGhlIGN1cnJlbnQgZnJhbWUuXG5cbiAgIFdpdGhvdXQgZXhwcmVzc2lvbiwgbGlzdCBhbGwgZGlzcGxheSBleHByZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnRcbiAgIGZyYW1lLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbnVuZGlzcGxheSBbZXhwcmVzc2lvbl1cblxuICAgRG8gbm90IGRpc3BsYXkgdGhlIGV4cHJlc3Npb24gYW55IG1vcmUgaW4gdGhlIGN1cnJlbnQgZnJhbWUuXG4gICBXaXRob3V0IGV4cHJlc3Npb24sIGNsZWFyIGFsbCBkaXNwbGF5IGV4cHJlc3Npb25zIGZvciB0aGUgY3VycmVudFxuICAgZnJhbWUuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxuaW50ZXJhY3RcblxuICAgU3RhcnQgYW4gaW50ZXJhdGl2ZSBpbnRlcnByZXRlciAodXNpbmcgdGhlICJjb2RlIiBtb2R1bGUpIHdob3NlXG4gICBnbG9iYWwgbmFtZXNwYWNlIGNvbnRhaW5zIGFsbCB0aGUgKGdsb2JhbCBhbmQgbG9jYWwpIG5hbWVzIGZvdW5kIGluXG4gICB0aGUgY3VycmVudCBzY29wZS5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG5hbGlhcyBbbmFtZSBbY29tbWFuZF1dXG5cbiAgIENyZWF0ZSBhbiBhbGlhcyBjYWxsZWQgKm5hbWUqIHRoYXQgZXhlY3V0ZXMgKmNvbW1hbmQqLiAgVGhlIGNvbW1hbmRcbiAgIG11c3QgKm5vdCogYmUgZW5jbG9zZWQgaW4gcXVvdGVzLiAgUmVwbGFjZWFibGUgcGFyYW1ldGVycyBjYW4gYmVcbiAgIGluZGljYXRlZCBieSAiJTEiLCAiJTIiLCBhbmQgc28gb24sIHdoaWxlICIlKiIgaXMgcmVwbGFjZWQgYnkgYWxsXG4gICB0aGUgcGFyYW1ldGVycy4gSWYgbm8gY29tbWFuZCBpcyBnaXZlbiwgdGhlIGN1cnJlbnQgYWxpYXMgZm9yXG4gICAqbmFtZSogaXMgc2hvd24uIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIGFsbCBhbGlhc2VzIGFyZSBsaXN0ZWQuXG5cbiAgIEFsaWFzZXMgbWF5IGJlIG5lc3RlZCBhbmQgY2FuIGNvbnRhaW4gYW55dGhpbmcgdGhhdCBjYW4gYmUgbGVnYWxseVxuICAgdHlwZWQgYXQgdGhlIHBkYiBwcm9tcHQuICBOb3RlIHRoYXQgaW50ZXJuYWwgcGRiIGNvbW1hbmRzICpjYW4qIGJlXG4gICBvdmVycmlkZGVuIGJ5IGFsaWFzZXMuICBTdWNoIGEgY29tbWFuZCBpcyB0aGVuIGhpZGRlbiB1bnRpbCB0aGVcbiAgIGFsaWFzIGlzIHJlbW92ZWQuICBBbGlhc2luZyBpcyByZWN1cnNpdmVseSBhcHBsaWVkIHRvIHRoZSBmaXJzdFxuICAgd29yZCBvZiB0aGUgY29tbWFuZCBsaW5lOyBhbGwgb3RoZXIgd29yZHMgaW4gdGhlIGxpbmUgYXJlIGxlZnRcbiAgIGFsb25lLlxuXG4gICBBcyBhbiBleGFtcGxlLCBoZXJlIGFyZSB0d28gdXNlZnVsIGFsaWFzZXMgKGVzcGVjaWFsbHkgd2hlbiBwbGFjZWRcbiAgIGluIHRoZSAiLnBkYnJjIiBmaWxlKTpcblxuICAgICAgIyBQcmludCBpbnN0YW5jZSB2YXJpYWJsZXMgKHVzYWdlICJwaSBjbGFzc0luc3QiKVxuICAgICAgYWxpYXMgcGkgZm9yIGsgaW4gJTEuX19kaWN0X18ua2V5cygpOiBwcmludCgiJTEuIixrLCI9IiwlMS5fX2RpY3RfX1trXSlcbiAgICAgICMgUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzIGluIHNlbGZcbiAgICAgIGFsaWFzIHBzIHBpIHNlbGZcblxudW5hbGlhcyBuYW1lXG5cbiAgIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGFsaWFzLlxuXG4hIHN0YXRlbWVudFxuXG4gICBFeGVjdXRlIHRoZSAob25lLWxpbmUpICpzdGF0ZW1lbnQqIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50XG4gICBzdGFjayBmcmFtZS4gVGhlIGV4Y2xhbWF0aW9uIHBvaW50IGNhbiBiZSBvbWl0dGVkIHVubGVzcyB0aGUgZmlyc3RcbiAgIHdvcmQgb2YgdGhlIHN0YXRlbWVudCByZXNlbWJsZXMgYSBkZWJ1Z2dlciBjb21tYW5kLiAgVG8gc2V0IGFcbiAgIGdsb2JhbCB2YXJpYWJsZSwgeW91IGNhbiBwcmVmaXggdGhlIGFzc2lnbm1lbnQgY29tbWFuZCB3aXRoIGFcbiAgICJnbG9iYWwiIHN0YXRlbWVudCBvbiB0aGUgc2FtZSBsaW5lLCBlLmcuOlxuXG4gICAgICAoUGRiKSBnbG9iYWwgbGlzdF9vcHRpb25zOyBsaXN0X29wdGlvbnMgPSBbXCctbFwnXVxuICAgICAgKFBkYilcblxucnVuIFthcmdzIC4uLl1cbnJlc3RhcnQgW2FyZ3MgLi4uXVxuXG4gICBSZXN0YXJ0IHRoZSBkZWJ1Z2dlZCBQeXRob24gcHJvZ3JhbS4gIElmIGFuIGFyZ3VtZW50IGlzIHN1cHBsaWVkLFxuICAgaXQgaXMgc3BsaXQgd2l0aCAic2hsZXgiIGFuZCB0aGUgcmVzdWx0IGlzIHVzZWQgYXMgdGhlIG5ld1xuICAgInN5cy5hcmd2Ii4gSGlzdG9yeSwgYnJlYWtwb2ludHMsIGFjdGlvbnMgYW5kIGRlYnVnZ2VyIG9wdGlvbnMgYXJlXG4gICBwcmVzZXJ2ZWQuICJyZXN0YXJ0IiBpcyBhbiBhbGlhcyBmb3IgInJ1biIuXG5cbnEodWl0KVxuXG4gICBRdWl0IGZyb20gdGhlIGRlYnVnZ2VyLiAgVGhlIHByb2dyYW0gYmVpbmcgZXhlY3V0ZWQgaXMgYWJvcnRlZC5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBXaGV0aGVyIGEgZnJhbWUgaXMgY29uc2lkZXJlZCB0byBvcmlnaW5hdGUgaW4gYSBjZXJ0YWluIG1vZHVsZVxuICAgIGlzIGRldGVybWluZWQgYnkgdGhlICJfX25hbWVfXyIgaW4gdGhlIGZyYW1lIGdsb2JhbHMuXG4nLAotICdkZWwnOiB1J1xuVGhlICJkZWwiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKlxuXG4gICBkZWxfc3RtdCA6Oj0gImRlbCIgdGFyZ2V0X2xpc3RcblxuRGVsZXRpb24gaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHdheSBhc3NpZ25tZW50IGlzXG5kZWZpbmVkLiBSYXRoZXIgdGhhbiBzcGVsbGluZyBpdCBvdXQgaW4gZnVsbCBkZXRhaWxzLCBoZXJlIGFyZSBzb21lXG5oaW50cy5cblxuRGVsZXRpb24gb2YgYSB0YXJnZXQgbGlzdCByZWN1cnNpdmVseSBkZWxldGVzIGVhY2ggdGFyZ2V0LCBmcm9tIGxlZnRcbnRvIHJpZ2h0LlxuXG5EZWxldGlvbiBvZiBhIG5hbWUgcmVtb3ZlcyB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgZnJvbSB0aGUgbG9jYWwgb3Jcbmdsb2JhbCBuYW1lc3BhY2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuYW1lIG9jY3VycyBpbiBhICJnbG9iYWwiXG5zdGF0ZW1lbnQgaW4gdGhlIHNhbWUgY29kZSBibG9jay4gIElmIHRoZSBuYW1lIGlzIHVuYm91bmQsIGFcbiJOYW1lRXJyb3IiIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC5cblxuRGVsZXRpb24gb2YgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHN1YnNjcmlwdGlvbnMgYW5kIHNsaWNpbmdzIGlzIHBhc3NlZFxudG8gdGhlIHByaW1hcnkgb2JqZWN0IGludm9sdmVkOyBkZWxldGlvbiBvZiBhIHNsaWNpbmcgaXMgaW4gZ2VuZXJhbFxuZXF1aXZhbGVudCB0byBhc3NpZ25tZW50IG9mIGFuIGVtcHR5IHNsaWNlIG9mIHRoZSByaWdodCB0eXBlIChidXQgZXZlblxudGhpcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzbGljZWQgb2JqZWN0KS5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogUHJldmlvdXNseSBpdCB3YXMgaWxsZWdhbCB0byBkZWxldGUgYSBuYW1lXG5mcm9tIHRoZSBsb2NhbCBuYW1lc3BhY2UgaWYgaXQgb2NjdXJzIGFzIGEgZnJlZSB2YXJpYWJsZSBpbiBhIG5lc3RlZFxuYmxvY2suXG4nLAotICdkaWN0JzogdSdcbkRpY3Rpb25hcnkgZGlzcGxheXNcbioqKioqKioqKioqKioqKioqKipcblxuQSBkaWN0aW9uYXJ5IGRpc3BsYXkgaXMgYSBwb3NzaWJseSBlbXB0eSBzZXJpZXMgb2Yga2V5L2RhdHVtIHBhaXJzXG5lbmNsb3NlZCBpbiBjdXJseSBicmFjZXM6XG5cbiAgIGRpY3RfZGlzcGxheSAgICAgICA6Oj0gInsiIFtrZXlfZGF0dW1fbGlzdCB8IGRpY3RfY29tcHJlaGVuc2lvbl0gIn0iXG4gICBrZXlfZGF0dW1fbGlzdCAgICAgOjo9IGtleV9kYXR1bSAoIiwiIGtleV9kYXR1bSkqIFsiLCJdXG4gICBrZXlfZGF0dW0gICAgICAgICAgOjo9IGV4cHJlc3Npb24gIjoiIGV4cHJlc3Npb24gfCAiKioiIG9yX2V4cHJcbiAgIGRpY3RfY29tcHJlaGVuc2lvbiA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbiBjb21wX2ZvclxuXG5BIGRpY3Rpb25hcnkgZGlzcGxheSB5aWVsZHMgYSBuZXcgZGljdGlvbmFyeSBvYmplY3QuXG5cbklmIGEgY29tbWEtc2VwYXJhdGVkIHNlcXVlbmNlIG9mIGtleS9kYXR1bSBwYWlycyBpcyBnaXZlbiwgdGhleSBhcmVcbmV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgdG8gZGVmaW5lIHRoZSBlbnRyaWVzIG9mIHRoZSBkaWN0aW9uYXJ5OlxuZWFjaCBrZXkgb2JqZWN0IGlzIHVzZWQgYXMgYSBrZXkgaW50byB0aGUgZGljdGlvbmFyeSB0byBzdG9yZSB0aGVcbmNvcnJlc3BvbmRpbmcgZGF0dW0uICBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiBzcGVjaWZ5IHRoZSBzYW1lIGtleVxubXVsdGlwbGUgdGltZXMgaW4gdGhlIGtleS9kYXR1bSBsaXN0LCBhbmQgdGhlIGZpbmFsIGRpY3Rpb25hcnlcJ3MgdmFsdWVcbmZvciB0aGF0IGtleSB3aWxsIGJlIHRoZSBsYXN0IG9uZSBnaXZlbi5cblxuQSBkb3VibGUgYXN0ZXJpc2sgIioqIiBkZW5vdGVzICpkaWN0aW9uYXJ5IHVucGFja2luZyouIEl0cyBvcGVyYW5kXG5tdXN0IGJlIGEgKm1hcHBpbmcqLiAgRWFjaCBtYXBwaW5nIGl0ZW0gaXMgYWRkZWQgdG8gdGhlIG5ld1xuZGljdGlvbmFyeS4gIExhdGVyIHZhbHVlcyByZXBsYWNlIHZhbHVlcyBhbHJlYWR5IHNldCBieSBlYXJsaWVyXG5rZXkvZGF0dW0gcGFpcnMgYW5kIGVhcmxpZXIgZGljdGlvbmFyeSB1bnBhY2tpbmdzLlxuXG5OZXcgaW4gdmVyc2lvbiAzLjU6IFVucGFja2luZyBpbnRvIGRpY3Rpb25hcnkgZGlzcGxheXMsIG9yaWdpbmFsbHlcbnByb3Bvc2VkIGJ5ICoqUEVQIDQ0OCoqLlxuXG5BIGRpY3QgY29tcHJlaGVuc2lvbiwgaW4gY29udHJhc3QgdG8gbGlzdCBhbmQgc2V0IGNvbXByZWhlbnNpb25zLFxubmVlZHMgdHdvIGV4cHJlc3Npb25zIHNlcGFyYXRlZCB3aXRoIGEgY29sb24gZm9sbG93ZWQgYnkgdGhlIHVzdWFsXG4iZm9yIiBhbmQgImlmIiBjbGF1c2VzLiBXaGVuIHRoZSBjb21wcmVoZW5zaW9uIGlzIHJ1biwgdGhlIHJlc3VsdGluZ1xua2V5IGFuZCB2YWx1ZSBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIG5ldyBkaWN0aW9uYXJ5IGluIHRoZSBvcmRlclxudGhleSBhcmUgcHJvZHVjZWQuXG5cblJlc3RyaWN0aW9ucyBvbiB0aGUgdHlwZXMgb2YgdGhlIGtleSB2YWx1ZXMgYXJlIGxpc3RlZCBlYXJsaWVyIGluXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqLiAgKFRvIHN1bW1hcml6ZSwgdGhlIGtleSB0eXBlXG5zaG91bGQgYmUgKmhhc2hhYmxlKiwgd2hpY2ggZXhjbHVkZXMgYWxsIG11dGFibGUgb2JqZWN0cy4pICBDbGFzaGVzXG5iZXR3ZWVuIGR1cGxpY2F0ZSBrZXlzIGFyZSBub3QgZGV0ZWN0ZWQ7IHRoZSBsYXN0IGRhdHVtICh0ZXh0dWFsbHlcbnJpZ2h0bW9zdCBpbiB0aGUgZGlzcGxheSkgc3RvcmVkIGZvciBhIGdpdmVuIGtleSB2YWx1ZSBwcmV2YWlscy5cbicsCi0gJ2R5bmFtaWMtZmVhdHVyZXMnOiB1J1xuSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuTmFtZSByZXNvbHV0aW9uIG9mIGZyZWUgdmFyaWFibGVzIG9jY3VycyBhdCBydW50aW1lLCBub3QgYXQgY29tcGlsZVxudGltZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHByaW50IDQyOlxuXG4gICBpID0gMTBcbiAgIGRlZiBmKCk6XG4gICAgICAgcHJpbnQoaSlcbiAgIGkgPSA0MlxuICAgZigpXG5cblRoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSBpbGxlZ2FsIHdoZW4gdXNlZFxuaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlIHZhcmlhYmxlcy5cblxuSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgaWxsZWdhbCB0b1xuZGVsZXRlIHRoZSBuYW1lLiAgQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuXG5cblRoZSAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgZnVuY3Rpb25zIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgZnVsbFxuZW52aXJvbm1lbnQgZm9yIHJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgbG9jYWxcbmFuZCBnbG9iYWwgbmFtZXNwYWNlcyBvZiB0aGUgY2FsbGVyLiAgRnJlZSB2YXJpYWJsZXMgYXJlIG5vdCByZXNvbHZlZFxuaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSwgYnV0IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgWzFdXG5UaGUgImV4ZWMoKSIgYW5kICJldmFsKCkiIGZ1bmN0aW9ucyBoYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0b1xub3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLiAgSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzXG5zcGVjaWZpZWQsIGl0IGlzIHVzZWQgZm9yIGJvdGguXG4nLAotICdlbHNlJzogdSdcblRoZSAiaWYiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqXG5cblRoZSAiaWYiIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG5cbiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4gICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZVxuYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKlxuZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4oYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlICJpZiIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG5JZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmXG5wcmVzZW50LCBpcyBleGVjdXRlZC5cbicsCi0gJ2V4Y2VwdGlvbnMnOiB1J1xuRXhjZXB0aW9uc1xuKioqKioqKioqKlxuXG5FeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgY29udHJvbFxub2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgZXhjZXB0aW9uYWxcbmNvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMgKnJhaXNlZCogYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBlcnJvciBpc1xuZGV0ZWN0ZWQ7IGl0IG1heSBiZSAqaGFuZGxlZCogYnkgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYmxvY2sgb3IgYnkgYW55XG5jb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrIHdoZXJlXG50aGUgZXJyb3Igb2NjdXJyZWQuXG5cblRoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSBydW4tdGltZVxuZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvXG5leHBsaWNpdGx5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSAicmFpc2UiIHN0YXRlbWVudC4gRXhjZXB0aW9uXG5oYW5kbGVycyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlICJ0cnkiIC4uLiAiZXhjZXB0IiBzdGF0ZW1lbnQuICBUaGVcbiJmaW5hbGx5IiBjbGF1c2Ugb2Ygc3VjaCBhIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGNsZWFudXBcbmNvZGUgd2hpY2ggZG9lcyBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24sIGJ1dCBpcyBleGVjdXRlZCB3aGV0aGVyIGFuXG5leGNlcHRpb24gb2NjdXJyZWQgb3Igbm90IGluIHRoZSBwcmVjZWRpbmcgY29kZS5cblxuUHl0aG9uIHVzZXMgdGhlICJ0ZXJtaW5hdGlvbiIgbW9kZWwgb2YgZXJyb3IgaGFuZGxpbmc6IGFuIGV4Y2VwdGlvblxuaGFuZGxlciBjYW4gZmluZCBvdXQgd2hhdCBoYXBwZW5lZCBhbmQgY29udGludWUgZXhlY3V0aW9uIGF0IGFuIG91dGVyXG5sZXZlbCwgYnV0IGl0IGNhbm5vdCByZXBhaXIgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBhbmQgcmV0cnkgdGhlXG5mYWlsaW5nIG9wZXJhdGlvbiAoZXhjZXB0IGJ5IHJlLWVudGVyaW5nIHRoZSBvZmZlbmRpbmcgcGllY2Ugb2YgY29kZVxuZnJvbSB0aGUgdG9wKS5cblxuV2hlbiBhbiBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYXQgYWxsLCB0aGUgaW50ZXJwcmV0ZXIgdGVybWluYXRlc1xuZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtLCBvciByZXR1cm5zIHRvIGl0cyBpbnRlcmFjdGl2ZSBtYWluIGxvb3AuICBJblxuZWl0aGVyIGNhc2UsIGl0IHByaW50cyBhIHN0YWNrIGJhY2t0cmFjZSwgZXhjZXB0IHdoZW4gdGhlIGV4Y2VwdGlvbiBpc1xuIlN5c3RlbUV4aXQiLlxuXG5FeGNlcHRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGNsYXNzIGluc3RhbmNlcy4gIFRoZSAiZXhjZXB0IiBjbGF1c2UgaXNcbnNlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0IHJlZmVyZW5jZSB0aGVcbmNsYXNzIG9mIHRoZSBpbnN0YW5jZSBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZi4gIFRoZSBpbnN0YW5jZSBjYW4gYmVcbnJlY2VpdmVkIGJ5IHRoZSBoYW5kbGVyIGFuZCBjYW4gY2FycnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGVcbmV4Y2VwdGlvbmFsIGNvbmRpdGlvbi5cblxuTm90ZTogRXhjZXB0aW9uIG1lc3NhZ2VzIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gIFRoZWlyXG4gIGNvbnRlbnRzIG1heSBjaGFuZ2UgZnJvbSBvbmUgdmVyc2lvbiBvZiBQeXRob24gdG8gdGhlIG5leHQgd2l0aG91dFxuICB3YXJuaW5nIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuIHVuZGVyXG4gIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBpbnRlcnByZXRlci5cblxuU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSAidHJ5IiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiAqVGhlIHRyeVxuc3RhdGVtZW50KiBhbmQgInJhaXNlIiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gVGhpcyBsaW1pdGF0aW9uIG9jY3VycyBiZWNhdXNlIHRoZSBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgYnlcbiAgICB0aGVzZSBvcGVyYXRpb25zIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgdGhlIG1vZHVsZSBpc1xuICAgIGNvbXBpbGVkLlxuJywKLSAnZXhlY21vZGVsJzogdSdcbkV4ZWN1dGlvbiBtb2RlbFxuKioqKioqKioqKioqKioqXG5cblxuU3RydWN0dXJlIG9mIGEgcHJvZ3JhbVxuPT09PT09PT09PT09PT09PT09PT09PVxuXG5BIFB5dGhvbiBwcm9ncmFtIGlzIGNvbnN0cnVjdGVkIGZyb20gY29kZSBibG9ja3MuIEEgKmJsb2NrKiBpcyBhIHBpZWNlXG5vZiBQeXRob24gcHJvZ3JhbSB0ZXh0IHRoYXQgaXMgZXhlY3V0ZWQgYXMgYSB1bml0LiBUaGUgZm9sbG93aW5nIGFyZVxuYmxvY2tzOiBhIG1vZHVsZSwgYSBmdW5jdGlvbiBib2R5LCBhbmQgYSBjbGFzcyBkZWZpbml0aW9uLiBFYWNoXG5jb21tYW5kIHR5cGVkIGludGVyYWN0aXZlbHkgaXMgYSBibG9jay4gIEEgc2NyaXB0IGZpbGUgKGEgZmlsZSBnaXZlblxuYXMgc3RhbmRhcmQgaW5wdXQgdG8gdGhlIGludGVycHJldGVyIG9yIHNwZWNpZmllZCBhcyBhIGNvbW1hbmQgbGluZVxuYXJndW1lbnQgdG8gdGhlIGludGVycHJldGVyKSBpcyBhIGNvZGUgYmxvY2suICBBIHNjcmlwdCBjb21tYW5kIChhXG5jb21tYW5kIHNwZWNpZmllZCBvbiB0aGUgaW50ZXJwcmV0ZXIgY29tbWFuZCBsaW5lIHdpdGggdGhlIFwnKiotYyoqXCdcbm9wdGlvbikgaXMgYSBjb2RlIGJsb2NrLiAgVGhlIHN0cmluZyBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGJ1aWx0LWluXG5mdW5jdGlvbnMgImV2YWwoKSIgYW5kICJleGVjKCkiIGlzIGEgY29kZSBibG9jay5cblxuQSBjb2RlIGJsb2NrIGlzIGV4ZWN1dGVkIGluIGFuICpleGVjdXRpb24gZnJhbWUqLiAgQSBmcmFtZSBjb250YWluc1xuc29tZSBhZG1pbmlzdHJhdGl2ZSBpbmZvcm1hdGlvbiAodXNlZCBmb3IgZGVidWdnaW5nKSBhbmQgZGV0ZXJtaW5lc1xud2hlcmUgYW5kIGhvdyBleGVjdXRpb24gY29udGludWVzIGFmdGVyIHRoZSBjb2RlIGJsb2NrXCdzIGV4ZWN1dGlvbiBoYXNcbmNvbXBsZXRlZC5cblxuXG5OYW1pbmcgYW5kIGJpbmRpbmdcbj09PT09PT09PT09PT09PT09PVxuXG5cbkJpbmRpbmcgb2YgbmFtZXNcbi0tLS0tLS0tLS0tLS0tLS1cblxuKk5hbWVzKiByZWZlciB0byBvYmplY3RzLiAgTmFtZXMgYXJlIGludHJvZHVjZWQgYnkgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLlxuXG5UaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczogZm9ybWFsIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLFxuImltcG9ydCIgc3RhdGVtZW50cywgY2xhc3MgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zICh0aGVzZSBiaW5kIHRoZVxuY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZSBpbiB0aGUgZGVmaW5pbmcgYmxvY2spLCBhbmQgdGFyZ2V0cyB0aGF0IGFyZVxuaWRlbnRpZmllcnMgaWYgb2NjdXJyaW5nIGluIGFuIGFzc2lnbm1lbnQsICJmb3IiIGxvb3AgaGVhZGVyLCBvciBhZnRlclxuImFzIiBpbiBhICJ3aXRoIiBzdGF0ZW1lbnQgb3IgImV4Y2VwdCIgY2xhdXNlLiBUaGUgImltcG9ydCIgc3RhdGVtZW50XG5vZiB0aGUgZm9ybSAiZnJvbSAuLi4gaW1wb3J0ICoiIGJpbmRzIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZVxuaW1wb3J0ZWQgbW9kdWxlLCBleGNlcHQgdGhvc2UgYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZS4gIFRoaXMgZm9ybVxubWF5IG9ubHkgYmUgdXNlZCBhdCB0aGUgbW9kdWxlIGxldmVsLlxuXG5BIHRhcmdldCBvY2N1cnJpbmcgaW4gYSAiZGVsIiBzdGF0ZW1lbnQgaXMgYWxzbyBjb25zaWRlcmVkIGJvdW5kIGZvclxudGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgbmFtZSkuXG5cbkVhY2ggYXNzaWdubWVudCBvciBpbXBvcnQgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jayBkZWZpbmVkIGJ5IGFcbmNsYXNzIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24gb3IgYXQgdGhlIG1vZHVsZSBsZXZlbCAodGhlIHRvcC1sZXZlbFxuY29kZSBibG9jaykuXG5cbklmIGEgbmFtZSBpcyBib3VuZCBpbiBhIGJsb2NrLCBpdCBpcyBhIGxvY2FsIHZhcmlhYmxlIG9mIHRoYXQgYmxvY2ssXG51bmxlc3MgZGVjbGFyZWQgYXMgIm5vbmxvY2FsIiBvciAiZ2xvYmFsIi4gIElmIGEgbmFtZSBpcyBib3VuZCBhdCB0aGVcbm1vZHVsZSBsZXZlbCwgaXQgaXMgYSBnbG9iYWwgdmFyaWFibGUuICAoVGhlIHZhcmlhYmxlcyBvZiB0aGUgbW9kdWxlXG5jb2RlIGJsb2NrIGFyZSBsb2NhbCBhbmQgZ2xvYmFsLikgIElmIGEgdmFyaWFibGUgaXMgdXNlZCBpbiBhIGNvZGVcbmJsb2NrIGJ1dCBub3QgZGVmaW5lZCB0aGVyZSwgaXQgaXMgYSAqZnJlZSB2YXJpYWJsZSouXG5cbkVhY2ggb2NjdXJyZW5jZSBvZiBhIG5hbWUgaW4gdGhlIHByb2dyYW0gdGV4dCByZWZlcnMgdG8gdGhlICpiaW5kaW5nKlxub2YgdGhhdCBuYW1lIGVzdGFibGlzaGVkIGJ5IHRoZSBmb2xsb3dpbmcgbmFtZSByZXNvbHV0aW9uIHJ1bGVzLlxuXG5cblJlc29sdXRpb24gb2YgbmFtZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS1cblxuQSAqc2NvcGUqIGRlZmluZXMgdGhlIHZpc2liaWxpdHkgb2YgYSBuYW1lIHdpdGhpbiBhIGJsb2NrLiAgSWYgYSBsb2NhbFxudmFyaWFibGUgaXMgZGVmaW5lZCBpbiBhIGJsb2NrLCBpdHMgc2NvcGUgaW5jbHVkZXMgdGhhdCBibG9jay4gIElmIHRoZVxuZGVmaW5pdGlvbiBvY2N1cnMgaW4gYSBmdW5jdGlvbiBibG9jaywgdGhlIHNjb3BlIGV4dGVuZHMgdG8gYW55IGJsb2Nrc1xuY29udGFpbmVkIHdpdGhpbiB0aGUgZGVmaW5pbmcgb25lLCB1bmxlc3MgYSBjb250YWluZWQgYmxvY2sgaW50cm9kdWNlc1xuYSBkaWZmZXJlbnQgYmluZGluZyBmb3IgdGhlIG5hbWUuXG5cbldoZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgbmVhcmVzdFxuZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgYmxvY2tcbmlzIGNhbGxlZCB0aGUgYmxvY2tcJ3MgKmVudmlyb25tZW50Ki5cblxuV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSAiTmFtZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLiBJZlxudGhlIGN1cnJlbnQgc2NvcGUgaXMgYSBmdW5jdGlvbiBzY29wZSwgYW5kIHRoZSBuYW1lIHJlZmVycyB0byBhIGxvY2FsXG52YXJpYWJsZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYm91bmQgdG8gYSB2YWx1ZSBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlXG5uYW1lIGlzIHVzZWQsIGFuICJVbmJvdW5kTG9jYWxFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbiJVbmJvdW5kTG9jYWxFcnJvciIgaXMgYSBzdWJjbGFzcyBvZiAiTmFtZUVycm9yIi5cblxuSWYgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uIG9jY3VycyBhbnl3aGVyZSB3aXRoaW4gYSBjb2RlIGJsb2NrLCBhbGxcbnVzZXMgb2YgdGhlIG5hbWUgd2l0aGluIHRoZSBibG9jayBhcmUgdHJlYXRlZCBhcyByZWZlcmVuY2VzIHRvIHRoZVxuY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgd2l0aGluIGFcbmJsb2NrIGJlZm9yZSBpdCBpcyBib3VuZC4gIFRoaXMgcnVsZSBpcyBzdWJ0bGUuICBQeXRob24gbGFja3NcbmRlY2xhcmF0aW9ucyBhbmQgYWxsb3dzIG5hbWUgYmluZGluZyBvcGVyYXRpb25zIHRvIG9jY3VyIGFueXdoZXJlXG53aXRoaW4gYSBjb2RlIGJsb2NrLiAgVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGNvZGUgYmxvY2sgY2FuIGJlXG5kZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgYmxvY2sgZm9yIG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy5cblxuSWYgdGhlICJnbG9iYWwiIHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2ssIGFsbCB1c2VzIG9mIHRoZSBuYW1lXG5zcGVjaWZpZWQgaW4gdGhlIHN0YXRlbWVudCByZWZlciB0byB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgaW4gdGhlXG50b3AtbGV2ZWwgbmFtZXNwYWNlLiAgTmFtZXMgYXJlIHJlc29sdmVkIGluIHRoZSB0b3AtbGV2ZWwgbmFtZXNwYWNlIGJ5XG5zZWFyY2hpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGkuZS4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlXG5jb250YWluaW5nIHRoZSBjb2RlIGJsb2NrLCBhbmQgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSwgdGhlIG5hbWVzcGFjZVxub2YgdGhlIG1vZHVsZSAiYnVpbHRpbnMiLiAgVGhlIGdsb2JhbCBuYW1lc3BhY2UgaXMgc2VhcmNoZWQgZmlyc3QuICBJZlxudGhlIG5hbWUgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIGlzIHNlYXJjaGVkLiAgVGhlXG4iZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBuYW1lLlxuXG5UaGUgImdsb2JhbCIgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZyBvcGVyYXRpb25cbmluIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhIGZyZWUgdmFyaWFibGVcbmNvbnRhaW5zIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlIGZyZWUgdmFyaWFibGUgaXMgdHJlYXRlZCBhcyBhIGdsb2JhbC5cblxuVGhlICJub25sb2NhbCIgc3RhdGVtZW50IGNhdXNlcyBjb3JyZXNwb25kaW5nIG5hbWVzIHRvIHJlZmVyIHRvXG5wcmV2aW91c2x5IGJvdW5kIHZhcmlhYmxlcyBpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgZnVuY3Rpb24gc2NvcGUuXG4iU3ludGF4RXJyb3IiIGlzIHJhaXNlZCBhdCBjb21waWxlIHRpbWUgaWYgdGhlIGdpdmVuIG5hbWUgZG9lcyBub3RcbmV4aXN0IGluIGFueSBlbmNsb3NpbmcgZnVuY3Rpb24gc2NvcGUuXG5cblRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhXG5tb2R1bGUgaXMgaW1wb3J0ZWQuICBUaGUgbWFpbiBtb2R1bGUgZm9yIGEgc2NyaXB0IGlzIGFsd2F5cyBjYWxsZWRcbiJfX21haW5fXyIuXG5cbkNsYXNzIGRlZmluaXRpb24gYmxvY2tzIGFuZCBhcmd1bWVudHMgdG8gImV4ZWMoKSIgYW5kICJldmFsKCkiIGFyZVxuc3BlY2lhbCBpbiB0aGUgY29udGV4dCBvZiBuYW1lIHJlc29sdXRpb24uIEEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhblxuZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmUgbmFtZXMuIFRoZXNlIHJlZmVyZW5jZXNcbmZvbGxvdyB0aGUgbm9ybWFsIHJ1bGVzIGZvciBuYW1lIHJlc29sdXRpb24gd2l0aCBhbiBleGNlcHRpb24gdGhhdFxudW5ib3VuZCBsb2NhbCB2YXJpYWJsZXMgYXJlIGxvb2tlZCB1cCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gVGhlXG5uYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkgb2ZcbnRoZSBjbGFzcy4gVGhlIHNjb3BlIG9mIG5hbWVzIGRlZmluZWQgaW4gYSBjbGFzcyBibG9jayBpcyBsaW1pdGVkIHRvXG50aGUgY2xhc3MgYmxvY2s7IGl0IGRvZXMgbm90IGV4dGVuZCB0byB0aGUgY29kZSBibG9ja3Mgb2YgbWV0aG9kcyAtLVxudGhpcyBpbmNsdWRlcyBjb21wcmVoZW5zaW9ucyBhbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlIHRoZXkgYXJlXG5pbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmdcbndpbGwgZmFpbDpcblxuICAgY2xhc3MgQTpcbiAgICAgICBhID0gNDJcbiAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpXG5cblxuQnVpbHRpbnMgYW5kIHJlc3RyaWN0ZWQgZXhlY3V0aW9uXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4ZWN1dGlvbiBvZiBhIGNvZGUgYmxvY2tcbmlzIGFjdHVhbGx5IGZvdW5kIGJ5IGxvb2tpbmcgdXAgdGhlIG5hbWUgIl9fYnVpbHRpbnNfXyIgaW4gaXRzIGdsb2JhbFxubmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZSBsYXR0ZXIgY2FzZVxudGhlIG1vZHVsZVwncyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGUgIl9fbWFpbl9fIlxubW9kdWxlLCAiX19idWlsdGluc19fIiBpcyB0aGUgYnVpbHQtaW4gbW9kdWxlICJidWlsdGlucyI7IHdoZW4gaW4gYW55XG5vdGhlciBtb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiB0aGVcbiJidWlsdGlucyIgbW9kdWxlIGl0c2VsZi4gICJfX2J1aWx0aW5zX18iIGNhbiBiZSBzZXQgdG8gYSB1c2VyLWNyZWF0ZWRcbmRpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQgZXhlY3V0aW9uLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFVzZXJzIHNob3VsZCBub3QgdG91Y2hcbiJfX2J1aWx0aW5zX18iOyBpdCBpcyBzdHJpY3RseSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICBVc2Vyc1xud2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBzaG91bGQgImltcG9ydCJcbnRoZSAiYnVpbHRpbnMiIG1vZHVsZSBhbmQgbW9kaWZ5IGl0cyBhdHRyaWJ1dGVzIGFwcHJvcHJpYXRlbHkuXG5cblxuSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuTmFtZSByZXNvbHV0aW9uIG9mIGZyZWUgdmFyaWFibGVzIG9jY3VycyBhdCBydW50aW1lLCBub3QgYXQgY29tcGlsZVxudGltZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHByaW50IDQyOlxuXG4gICBpID0gMTBcbiAgIGRlZiBmKCk6XG4gICAgICAgcHJpbnQoaSlcbiAgIGkgPSA0MlxuICAgZigpXG5cblRoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSBpbGxlZ2FsIHdoZW4gdXNlZFxuaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlIHZhcmlhYmxlcy5cblxuSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgaWxsZWdhbCB0b1xuZGVsZXRlIHRoZSBuYW1lLiAgQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuXG5cblRoZSAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgZnVuY3Rpb25zIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgZnVsbFxuZW52aXJvbm1lbnQgZm9yIHJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgbG9jYWxcbmFuZCBnbG9iYWwgbmFtZXNwYWNlcyBvZiB0aGUgY2FsbGVyLiAgRnJlZSB2YXJpYWJsZXMgYXJlIG5vdCByZXNvbHZlZFxuaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSwgYnV0IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgWzFdXG5UaGUgImV4ZWMoKSIgYW5kICJldmFsKCkiIGZ1bmN0aW9ucyBoYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0b1xub3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLiAgSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzXG5zcGVjaWZpZWQsIGl0IGlzIHVzZWQgZm9yIGJvdGguXG5cblxuRXhjZXB0aW9uc1xuPT09PT09PT09PVxuXG5FeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgY29udHJvbFxub2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgZXhjZXB0aW9uYWxcbmNvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMgKnJhaXNlZCogYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBlcnJvciBpc1xuZGV0ZWN0ZWQ7IGl0IG1heSBiZSAqaGFuZGxlZCogYnkgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYmxvY2sgb3IgYnkgYW55XG5jb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrIHdoZXJlXG50aGUgZXJyb3Igb2NjdXJyZWQuXG5cblRoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSBydW4tdGltZVxuZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvXG5leHBsaWNpdGx5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSAicmFpc2UiIHN0YXRlbWVudC4gRXhjZXB0aW9uXG5oYW5kbGVycyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlICJ0cnkiIC4uLiAiZXhjZXB0IiBzdGF0ZW1lbnQuICBUaGVcbiJmaW5hbGx5IiBjbGF1c2Ugb2Ygc3VjaCBhIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGNsZWFudXBcbmNvZGUgd2hpY2ggZG9lcyBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24sIGJ1dCBpcyBleGVjdXRlZCB3aGV0aGVyIGFuXG5leGNlcHRpb24gb2NjdXJyZWQgb3Igbm90IGluIHRoZSBwcmVjZWRpbmcgY29kZS5cblxuUHl0aG9uIHVzZXMgdGhlICJ0ZXJtaW5hdGlvbiIgbW9kZWwgb2YgZXJyb3IgaGFuZGxpbmc6IGFuIGV4Y2VwdGlvblxuaGFuZGxlciBjYW4gZmluZCBvdXQgd2hhdCBoYXBwZW5lZCBhbmQgY29udGludWUgZXhlY3V0aW9uIGF0IGFuIG91dGVyXG5sZXZlbCwgYnV0IGl0IGNhbm5vdCByZXBhaXIgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBhbmQgcmV0cnkgdGhlXG5mYWlsaW5nIG9wZXJhdGlvbiAoZXhjZXB0IGJ5IHJlLWVudGVyaW5nIHRoZSBvZmZlbmRpbmcgcGllY2Ugb2YgY29kZVxuZnJvbSB0aGUgdG9wKS5cblxuV2hlbiBhbiBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYXQgYWxsLCB0aGUgaW50ZXJwcmV0ZXIgdGVybWluYXRlc1xuZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtLCBvciByZXR1cm5zIHRvIGl0cyBpbnRlcmFjdGl2ZSBtYWluIGxvb3AuICBJblxuZWl0aGVyIGNhc2UsIGl0IHByaW50cyBhIHN0YWNrIGJhY2t0cmFjZSwgZXhjZXB0IHdoZW4gdGhlIGV4Y2VwdGlvbiBpc1xuIlN5c3RlbUV4aXQiLlxuXG5FeGNlcHRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGNsYXNzIGluc3RhbmNlcy4gIFRoZSAiZXhjZXB0IiBjbGF1c2UgaXNcbnNlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0IHJlZmVyZW5jZSB0aGVcbmNsYXNzIG9mIHRoZSBpbnN0YW5jZSBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZi4gIFRoZSBpbnN0YW5jZSBjYW4gYmVcbnJlY2VpdmVkIGJ5IHRoZSBoYW5kbGVyIGFuZCBjYW4gY2FycnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGVcbmV4Y2VwdGlvbmFsIGNvbmRpdGlvbi5cblxuTm90ZTogRXhjZXB0aW9uIG1lc3NhZ2VzIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gIFRoZWlyXG4gIGNvbnRlbnRzIG1heSBjaGFuZ2UgZnJvbSBvbmUgdmVyc2lvbiBvZiBQeXRob24gdG8gdGhlIG5leHQgd2l0aG91dFxuICB3YXJuaW5nIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuIHVuZGVyXG4gIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBpbnRlcnByZXRlci5cblxuU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSAidHJ5IiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiAqVGhlIHRyeVxuc3RhdGVtZW50KiBhbmQgInJhaXNlIiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gVGhpcyBsaW1pdGF0aW9uIG9jY3VycyBiZWNhdXNlIHRoZSBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgYnlcbiAgICB0aGVzZSBvcGVyYXRpb25zIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgdGhlIG1vZHVsZSBpc1xuICAgIGNvbXBpbGVkLlxuJywKLSAnZXhwcmxpc3RzJzogdSdcbkV4cHJlc3Npb24gbGlzdHNcbioqKioqKioqKioqKioqKipcblxuICAgZXhwcmVzc2lvbl9saXN0ICAgIDo6PSBleHByZXNzaW9uICggIiwiIGV4cHJlc3Npb24gKSogWyIsIl1cbiAgIHN0YXJyZWRfbGlzdCAgICAgICA6Oj0gc3RhcnJlZF9pdGVtICggIiwiIHN0YXJyZWRfaXRlbSApKiBbIiwiXVxuICAgc3RhcnJlZF9leHByZXNzaW9uIDo6PSBleHByZXNzaW9uIHwgKCBzdGFycmVkX2l0ZW0gIiwiICkqIFtzdGFycmVkX2l0ZW1dXG4gICBzdGFycmVkX2l0ZW0gICAgICAgOjo9IGV4cHJlc3Npb24gfCAiKiIgb3JfZXhwclxuXG5FeGNlcHQgd2hlbiBwYXJ0IG9mIGEgbGlzdCBvciBzZXQgZGlzcGxheSwgYW4gZXhwcmVzc2lvbiBsaXN0XG5jb250YWluaW5nIGF0IGxlYXN0IG9uZSBjb21tYSB5aWVsZHMgYSB0dXBsZS4gIFRoZSBsZW5ndGggb2YgdGhlIHR1cGxlXG5pcyB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb25zIGluIHRoZSBsaXN0LiAgVGhlIGV4cHJlc3Npb25zIGFyZVxuZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodC5cblxuQW4gYXN0ZXJpc2sgIioiIGRlbm90ZXMgKml0ZXJhYmxlIHVucGFja2luZyouICBJdHMgb3BlcmFuZCBtdXN0IGJlIGFuXG4qaXRlcmFibGUqLiAgVGhlIGl0ZXJhYmxlIGlzIGV4cGFuZGVkIGludG8gYSBzZXF1ZW5jZSBvZiBpdGVtcywgd2hpY2hcbmFyZSBpbmNsdWRlZCBpbiB0aGUgbmV3IHR1cGxlLCBsaXN0LCBvciBzZXQsIGF0IHRoZSBzaXRlIG9mIHRoZVxudW5wYWNraW5nLlxuXG5OZXcgaW4gdmVyc2lvbiAzLjU6IEl0ZXJhYmxlIHVucGFja2luZyBpbiBleHByZXNzaW9uIGxpc3RzLCBvcmlnaW5hbGx5XG5wcm9wb3NlZCBieSAqKlBFUCA0NDgqKi5cblxuVGhlIHRyYWlsaW5nIGNvbW1hIGlzIHJlcXVpcmVkIG9ubHkgdG8gY3JlYXRlIGEgc2luZ2xlIHR1cGxlIChhLmsuYS4gYVxuKnNpbmdsZXRvbiopOyBpdCBpcyBvcHRpb25hbCBpbiBhbGwgb3RoZXIgY2FzZXMuICBBIHNpbmdsZSBleHByZXNzaW9uXG53aXRob3V0IGEgdHJhaWxpbmcgY29tbWEgZG9lc25cJ3QgY3JlYXRlIGEgdHVwbGUsIGJ1dCByYXRoZXIgeWllbGRzIHRoZVxudmFsdWUgb2YgdGhhdCBleHByZXNzaW9uLiAoVG8gY3JlYXRlIGFuIGVtcHR5IHR1cGxlLCB1c2UgYW4gZW1wdHkgcGFpclxub2YgcGFyZW50aGVzZXM6ICIoKSIuKVxuJywKLSAnZmxvYXRpbmcnOiB1J1xuRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKioqKioqKioqXG5cbkZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsXG5kZWZpbml0aW9uczpcblxuICAgZmxvYXRudW1iZXIgICA6Oj0gcG9pbnRmbG9hdCB8IGV4cG9uZW50ZmxvYXRcbiAgIHBvaW50ZmxvYXQgICAgOjo9IFtpbnRwYXJ0XSBmcmFjdGlvbiB8IGludHBhcnQgIi4iXG4gICBleHBvbmVudGZsb2F0IDo6PSAoaW50cGFydCB8IHBvaW50ZmxvYXQpIGV4cG9uZW50XG4gICBpbnRwYXJ0ICAgICAgIDo6PSBkaWdpdCtcbiAgIGZyYWN0aW9uICAgICAgOjo9ICIuIiBkaWdpdCtcbiAgIGV4cG9uZW50ICAgICAgOjo9ICgiZSIgfCAiRSIpIFsiKyIgfCAiLSJdIGRpZ2l0K1xuXG5Ob3RlIHRoYXQgdGhlIGludGVnZXIgYW5kIGV4cG9uZW50IHBhcnRzIGFyZSBhbHdheXMgaW50ZXJwcmV0ZWQgdXNpbmdcbnJhZGl4IDEwLiBGb3IgZXhhbXBsZSwgIjA3N2UwMTAiIGlzIGxlZ2FsLCBhbmQgZGVub3RlcyB0aGUgc2FtZSBudW1iZXJcbmFzICI3N2UxMCIuIFRoZSBhbGxvd2VkIHJhbmdlIG9mIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGlzXG5pbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIFNvbWUgZXhhbXBsZXMgb2YgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHM6XG5cbiAgIDMuMTQgICAgMTAuICAgIC4wMDEgICAgMWUxMDAgICAgMy4xNGUtMTAgICAgMGUwXG5cbk5vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZSAiLTEiXG5pcyBhY3R1YWxseSBhbiBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHRoZSB1bmFyeSBvcGVyYXRvciAiLSIgYW5kIHRoZVxubGl0ZXJhbCAiMSIuXG4nLAotICdmb3InOiB1J1xuVGhlICJmb3IiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgImZvciIgc3RhdGVtZW50IGlzIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlXG4oc3VjaCBhcyBhIHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3Igb3RoZXIgaXRlcmFibGUgb2JqZWN0OlxuXG4gICBmb3Jfc3RtdCA6Oj0gImZvciIgdGFyZ2V0X2xpc3QgImluIiBleHByZXNzaW9uX2xpc3QgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoZSBleHByZXNzaW9uIGxpc3QgaXMgZXZhbHVhdGVkIG9uY2U7IGl0IHNob3VsZCB5aWVsZCBhbiBpdGVyYWJsZVxub2JqZWN0LiAgQW4gaXRlcmF0b3IgaXMgY3JlYXRlZCBmb3IgdGhlIHJlc3VsdCBvZiB0aGVcbiJleHByZXNzaW9uX2xpc3QiLiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaCBpdGVtXG5wcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IuICBFYWNoXG5pdGVtIGluIHR1cm4gaXMgYXNzaWduZWQgdG8gdGhlIHRhcmdldCBsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlc1xuZm9yIGFzc2lnbm1lbnRzIChzZWUgKkFzc2lnbm1lbnQgc3RhdGVtZW50cyopLCBhbmQgdGhlbiB0aGUgc3VpdGUgaXNcbmV4ZWN1dGVkLiAgV2hlbiB0aGUgaXRlbXMgYXJlIGV4aGF1c3RlZCAod2hpY2ggaXMgaW1tZWRpYXRlbHkgd2hlbiB0aGVcbnNlcXVlbmNlIGlzIGVtcHR5IG9yIGFuIGl0ZXJhdG9yIHJhaXNlcyBhICJTdG9wSXRlcmF0aW9uIiBleGNlcHRpb24pLFxudGhlIHN1aXRlIGluIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZCwgYW5kIHRoZSBsb29wXG50ZXJtaW5hdGVzLlxuXG5BICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnRcbmV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGNvbnRpbnVlc1xud2l0aCB0aGUgbmV4dCBpdGVtLCBvciB3aXRoIHRoZSAiZWxzZSIgY2xhdXNlIGlmIHRoZXJlIGlzIG5vIG5leHRcbml0ZW0uXG5cblRoZSBmb3ItbG9vcCBtYWtlcyBhc3NpZ25tZW50cyB0byB0aGUgdmFyaWFibGVzKHMpIGluIHRoZSB0YXJnZXQgbGlzdC5cblRoaXMgb3ZlcndyaXRlcyBhbGwgcHJldmlvdXMgYXNzaWdubWVudHMgdG8gdGhvc2UgdmFyaWFibGVzIGluY2x1ZGluZ1xudGhvc2UgbWFkZSBpbiB0aGUgc3VpdGUgb2YgdGhlIGZvci1sb29wOlxuXG4gICBmb3IgaSBpbiByYW5nZSgxMCk6XG4gICAgICAgcHJpbnQoaSlcbiAgICAgICBpID0gNSAgICAgICAgICAgICAjIHRoaXMgd2lsbCBub3QgYWZmZWN0IHRoZSBmb3ItbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSBpIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kZXggaW4gdGhlIHJhbmdlXG5cbk5hbWVzIGluIHRoZSB0YXJnZXQgbGlzdCBhcmUgbm90IGRlbGV0ZWQgd2hlbiB0aGUgbG9vcCBpcyBmaW5pc2hlZCxcbmJ1dCBpZiB0aGUgc2VxdWVuY2UgaXMgZW1wdHksIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGF0XG5hbGwgYnkgdGhlIGxvb3AuICBIaW50OiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gInJhbmdlKCkiIHJldHVybnMgYW5cbml0ZXJhdG9yIG9mIGludGVnZXJzIHN1aXRhYmxlIHRvIGVtdWxhdGUgdGhlIGVmZmVjdCBvZiBQYXNjYWxcJ3MgImZvciBpXG46PSBhIHRvIGIgZG8iOyBlLmcuLCAibGlzdChyYW5nZSgzKSkiIHJldHVybnMgdGhlIGxpc3QgIlswLCAxLCAyXSIuXG5cbk5vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlXG4gIGxvb3AgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gIEFuXG4gIGludGVybmFsIGNvdW50ZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGl0ZW0gaXMgdXNlZCBuZXh0LFxuICBhbmQgdGhpcyBpcyBpbmNyZW1lbnRlZCBvbiBlYWNoIGl0ZXJhdGlvbi4gIFdoZW4gdGhpcyBjb3VudGVyIGhhc1xuICByZWFjaGVkIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIHRoZSBsb29wIHRlcm1pbmF0ZXMuICBUaGlzIG1lYW5zXG4gIHRoYXQgaWYgdGhlIHN1aXRlIGRlbGV0ZXMgdGhlIGN1cnJlbnQgKG9yIGEgcHJldmlvdXMpIGl0ZW0gZnJvbSB0aGVcbiAgc2VxdWVuY2UsIHRoZSBuZXh0IGl0ZW0gd2lsbCBiZSBza2lwcGVkIChzaW5jZSBpdCBnZXRzIHRoZSBpbmRleCBvZlxuICB0aGUgY3VycmVudCBpdGVtIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gdHJlYXRlZCkuICBMaWtld2lzZSwgaWYgdGhlXG4gIHN1aXRlIGluc2VydHMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UgYmVmb3JlIHRoZSBjdXJyZW50IGl0ZW0sIHRoZVxuICBjdXJyZW50IGl0ZW0gd2lsbCBiZSB0cmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcC5cbiAgVGhpcyBjYW4gbGVhZCB0byBuYXN0eSBidWdzIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIGFcbiAgdGVtcG9yYXJ5IGNvcHkgdXNpbmcgYSBzbGljZSBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIGUuZy4sXG5cbiAgICAgZm9yIHggaW4gYVs6XTpcbiAgICAgICAgIGlmIHggPCAwOiBhLnJlbW92ZSh4KVxuJywKLSAnZm9ybWF0c3RyaW5ncyc6IHUnXG5Gb3JtYXQgU3RyaW5nIFN5bnRheFxuKioqKioqKioqKioqKioqKioqKipcblxuVGhlICJzdHIuZm9ybWF0KCkiIG1ldGhvZCBhbmQgdGhlICJGb3JtYXR0ZXIiIGNsYXNzIHNoYXJlIHRoZSBzYW1lXG5zeW50YXggZm9yIGZvcm1hdCBzdHJpbmdzIChhbHRob3VnaCBpbiB0aGUgY2FzZSBvZiAiRm9ybWF0dGVyIixcbnN1YmNsYXNzZXMgY2FuIGRlZmluZSB0aGVpciBvd24gZm9ybWF0IHN0cmluZyBzeW50YXgpLlxuXG5Gb3JtYXQgc3RyaW5ncyBjb250YWluICJyZXBsYWNlbWVudCBmaWVsZHMiIHN1cnJvdW5kZWQgYnkgY3VybHkgYnJhY2VzXG4ie30iLiBBbnl0aGluZyB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYnJhY2VzIGlzIGNvbnNpZGVyZWQgbGl0ZXJhbFxudGV4dCwgd2hpY2ggaXMgY29waWVkIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0LiAgSWYgeW91IG5lZWQgdG8gaW5jbHVkZVxuYSBicmFjZSBjaGFyYWN0ZXIgaW4gdGhlIGxpdGVyYWwgdGV4dCwgaXQgY2FuIGJlIGVzY2FwZWQgYnkgZG91Ymxpbmc6XG4ie3siIGFuZCAifX0iLlxuXG5UaGUgZ3JhbW1hciBmb3IgYSByZXBsYWNlbWVudCBmaWVsZCBpcyBhcyBmb2xsb3dzOlxuXG4gICAgICByZXBsYWNlbWVudF9maWVsZCA6Oj0gInsiIFtmaWVsZF9uYW1lXSBbIiEiIGNvbnZlcnNpb25dIFsiOiIgZm9ybWF0X3NwZWNdICJ9IlxuICAgICAgZmllbGRfbmFtZSAgICAgICAgOjo9IGFyZ19uYW1lICgiLiIgYXR0cmlidXRlX25hbWUgfCAiWyIgZWxlbWVudF9pbmRleCAiXSIpKlxuICAgICAgYXJnX25hbWUgICAgICAgICAgOjo9IFtpZGVudGlmaWVyIHwgaW50ZWdlcl1cbiAgICAgIGF0dHJpYnV0ZV9uYW1lICAgIDo6PSBpZGVudGlmaWVyXG4gICAgICBlbGVtZW50X2luZGV4ICAgICA6Oj0gaW50ZWdlciB8IGluZGV4X3N0cmluZ1xuICAgICAgaW5kZXhfc3RyaW5nICAgICAgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgIl0iPiArXG4gICAgICBjb252ZXJzaW9uICAgICAgICA6Oj0gInIiIHwgInMiIHwgImEiXG4gICAgICBmb3JtYXRfc3BlYyAgICAgICA6Oj0gPGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uPlxuXG5JbiBsZXNzIGZvcm1hbCB0ZXJtcywgdGhlIHJlcGxhY2VtZW50IGZpZWxkIGNhbiBzdGFydCB3aXRoIGFcbipmaWVsZF9uYW1lKiB0aGF0IHNwZWNpZmllcyB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHRvIGJlIGZvcm1hdHRlZFxuYW5kIGluc2VydGVkIGludG8gdGhlIG91dHB1dCBpbnN0ZWFkIG9mIHRoZSByZXBsYWNlbWVudCBmaWVsZC4gVGhlXG4qZmllbGRfbmFtZSogaXMgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICAqY29udmVyc2lvbiogZmllbGQsIHdoaWNoIGlzXG5wcmVjZWRlZCBieSBhbiBleGNsYW1hdGlvbiBwb2ludCAiXCchXCciLCBhbmQgYSAqZm9ybWF0X3NwZWMqLCB3aGljaCBpc1xucHJlY2VkZWQgYnkgYSBjb2xvbiAiXCc6XCciLiAgVGhlc2Ugc3BlY2lmeSBhIG5vbi1kZWZhdWx0IGZvcm1hdCBmb3IgdGhlXG5yZXBsYWNlbWVudCB2YWx1ZS5cblxuU2VlIGFsc28gdGhlICpGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlKiBzZWN0aW9uLlxuXG5UaGUgKmZpZWxkX25hbWUqIGl0c2VsZiBiZWdpbnMgd2l0aCBhbiAqYXJnX25hbWUqIHRoYXQgaXMgZWl0aGVyIGFcbm51bWJlciBvciBhIGtleXdvcmQuICBJZiBpdFwncyBhIG51bWJlciwgaXQgcmVmZXJzIHRvIGEgcG9zaXRpb25hbFxuYXJndW1lbnQsIGFuZCBpZiBpdFwncyBhIGtleXdvcmQsIGl0IHJlZmVycyB0byBhIG5hbWVkIGtleXdvcmRcbmFyZ3VtZW50LiAgSWYgdGhlIG51bWVyaWNhbCBhcmdfbmFtZXMgaW4gYSBmb3JtYXQgc3RyaW5nIGFyZSAwLCAxLCAyLFxuLi4uIGluIHNlcXVlbmNlLCB0aGV5IGNhbiBhbGwgYmUgb21pdHRlZCAobm90IGp1c3Qgc29tZSkgYW5kIHRoZVxubnVtYmVycyAwLCAxLCAyLCAuLi4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGluIHRoYXQgb3JkZXIuXG5CZWNhdXNlICphcmdfbmFtZSogaXMgbm90IHF1b3RlLWRlbGltaXRlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvXG5zcGVjaWZ5IGFyYml0cmFyeSBkaWN0aW9uYXJ5IGtleXMgKGUuZy4sIHRoZSBzdHJpbmdzICJcJzEwXCciIG9yXG4iXCc6LV1cJyIpIHdpdGhpbiBhIGZvcm1hdCBzdHJpbmcuIFRoZSAqYXJnX25hbWUqIGNhbiBiZSBmb2xsb3dlZCBieSBhbnlcbm51bWJlciBvZiBpbmRleCBvciBhdHRyaWJ1dGUgZXhwcmVzc2lvbnMuIEFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm1cbiJcJy5uYW1lXCciIHNlbGVjdHMgdGhlIG5hbWVkIGF0dHJpYnV0ZSB1c2luZyAiZ2V0YXR0cigpIiwgd2hpbGUgYW5cbmV4cHJlc3Npb24gb2YgdGhlIGZvcm0gIlwnW2luZGV4XVwnIiBkb2VzIGFuIGluZGV4IGxvb2t1cCB1c2luZ1xuIl9fZ2V0aXRlbV9fKCkiLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBUaGUgcG9zaXRpb25hbCBhcmd1bWVudCBzcGVjaWZpZXJzIGNhbiBiZVxub21pdHRlZCwgc28gIlwne30ge31cJyIgaXMgZXF1aXZhbGVudCB0byAiXCd7MH0gezF9XCciLlxuXG5Tb21lIHNpbXBsZSBmb3JtYXQgc3RyaW5nIGV4YW1wbGVzOlxuXG4gICAiRmlyc3QsIHRob3Ugc2hhbHQgY291bnQgdG8gezB9IiAgIyBSZWZlcmVuY2VzIGZpcnN0IHBvc2l0aW9uYWwgYXJndW1lbnRcbiAgICJCcmluZyBtZSBhIHt9IiAgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0bHkgcmVmZXJlbmNlcyB0aGUgZmlyc3QgcG9zaXRpb25hbCBhcmd1bWVudFxuICAgIkZyb20ge30gdG8ge30iICAgICAgICAgICAgICAgICAgICMgU2FtZSBhcyAiRnJvbSB7MH0gdG8gezF9IlxuICAgIk15IHF1ZXN0IGlzIHtuYW1lfSIgICAgICAgICAgICAgICMgUmVmZXJlbmNlcyBrZXl3b3JkIGFyZ3VtZW50IFwnbmFtZVwnXG4gICAiV2VpZ2h0IGluIHRvbnMgezAud2VpZ2h0fSIgICAgICAgIyBcJ3dlaWdodFwnIGF0dHJpYnV0ZSBvZiBmaXJzdCBwb3NpdGlvbmFsIGFyZ1xuICAgIlVuaXRzIGRlc3Ryb3llZDoge3BsYXllcnNbMF19IiAgICMgRmlyc3QgZWxlbWVudCBvZiBrZXl3b3JkIGFyZ3VtZW50IFwncGxheWVyc1wnLlxuXG5UaGUgKmNvbnZlcnNpb24qIGZpZWxkIGNhdXNlcyBhIHR5cGUgY29lcmNpb24gYmVmb3JlIGZvcm1hdHRpbmcuXG5Ob3JtYWxseSwgdGhlIGpvYiBvZiBmb3JtYXR0aW5nIGEgdmFsdWUgaXMgZG9uZSBieSB0aGUgIl9fZm9ybWF0X18oKSJcbm1ldGhvZCBvZiB0aGUgdmFsdWUgaXRzZWxmLiAgSG93ZXZlciwgaW4gc29tZSBjYXNlcyBpdCBpcyBkZXNpcmFibGUgdG9cbmZvcmNlIGEgdHlwZSB0byBiZSBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcsIG92ZXJyaWRpbmcgaXRzIG93blxuZGVmaW5pdGlvbiBvZiBmb3JtYXR0aW5nLiAgQnkgY29udmVydGluZyB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG5jYWxsaW5nICJfX2Zvcm1hdF9fKCkiLCB0aGUgbm9ybWFsIGZvcm1hdHRpbmcgbG9naWMgaXMgYnlwYXNzZWQuXG5cblRocmVlIGNvbnZlcnNpb24gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6ICJcJyFzXCciIHdoaWNoIGNhbGxzXG4ic3RyKCkiIG9uIHRoZSB2YWx1ZSwgIlwnIXJcJyIgd2hpY2ggY2FsbHMgInJlcHIoKSIgYW5kICJcJyFhXCciIHdoaWNoXG5jYWxscyAiYXNjaWkoKSIuXG5cblNvbWUgZXhhbXBsZXM6XG5cbiAgICJIYXJvbGRcJ3MgYSBjbGV2ZXIgezAhc30iICAgICAgICAjIENhbGxzIHN0cigpIG9uIHRoZSBhcmd1bWVudCBmaXJzdFxuICAgIkJyaW5nIG91dCB0aGUgaG9seSB7bmFtZSFyfSIgICAgIyBDYWxscyByZXByKCkgb24gdGhlIGFyZ3VtZW50IGZpcnN0XG4gICAiTW9yZSB7IWF9IiAgICAgICAgICAgICAgICAgICAgICAjIENhbGxzIGFzY2lpKCkgb24gdGhlIGFyZ3VtZW50IGZpcnN0XG5cblRoZSAqZm9ybWF0X3NwZWMqIGZpZWxkIGNvbnRhaW5zIGEgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlIHZhbHVlXG5zaG91bGQgYmUgcHJlc2VudGVkLCBpbmNsdWRpbmcgc3VjaCBkZXRhaWxzIGFzIGZpZWxkIHdpZHRoLCBhbGlnbm1lbnQsXG5wYWRkaW5nLCBkZWNpbWFsIHByZWNpc2lvbiBhbmQgc28gb24uICBFYWNoIHZhbHVlIHR5cGUgY2FuIGRlZmluZSBpdHNcbm93biAiZm9ybWF0dGluZyBtaW5pLWxhbmd1YWdlIiBvciBpbnRlcnByZXRhdGlvbiBvZiB0aGUgKmZvcm1hdF9zcGVjKi5cblxuTW9zdCBidWlsdC1pbiB0eXBlcyBzdXBwb3J0IGEgY29tbW9uIGZvcm1hdHRpbmcgbWluaS1sYW5ndWFnZSwgd2hpY2hcbmlzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLlxuXG5BICpmb3JtYXRfc3BlYyogZmllbGQgY2FuIGFsc28gaW5jbHVkZSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzXG53aXRoaW4gaXQuIFRoZXNlIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHMgbWF5IGNvbnRhaW4gYSBmaWVsZCBuYW1lLFxuY29udmVyc2lvbiBmbGFnIGFuZCBmb3JtYXQgc3BlY2lmaWNhdGlvbiwgYnV0IGRlZXBlciBuZXN0aW5nIGlzIG5vdFxuYWxsb3dlZC4gIFRoZSByZXBsYWNlbWVudCBmaWVsZHMgd2l0aGluIHRoZSBmb3JtYXRfc3BlYyBhcmVcbnN1YnN0aXR1dGVkIGJlZm9yZSB0aGUgKmZvcm1hdF9zcGVjKiBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQuIFRoaXNcbmFsbG93cyB0aGUgZm9ybWF0dGluZyBvZiBhIHZhbHVlIHRvIGJlIGR5bmFtaWNhbGx5IHNwZWNpZmllZC5cblxuU2VlIHRoZSAqRm9ybWF0IGV4YW1wbGVzKiBzZWN0aW9uIGZvciBzb21lIGV4YW1wbGVzLlxuXG5cbkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2Vcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIkZvcm1hdCBzcGVjaWZpY2F0aW9ucyIgYXJlIHVzZWQgd2l0aGluIHJlcGxhY2VtZW50IGZpZWxkcyBjb250YWluZWRcbndpdGhpbiBhIGZvcm1hdCBzdHJpbmcgdG8gZGVmaW5lIGhvdyBpbmRpdmlkdWFsIHZhbHVlcyBhcmUgcHJlc2VudGVkXG4oc2VlICpGb3JtYXQgU3RyaW5nIFN5bnRheCopLiAgVGhleSBjYW4gYWxzbyBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlXG5idWlsdC1pbiAiZm9ybWF0KCkiIGZ1bmN0aW9uLiAgRWFjaCBmb3JtYXR0YWJsZSB0eXBlIG1heSBkZWZpbmUgaG93XG50aGUgZm9ybWF0IHNwZWNpZmljYXRpb24gaXMgdG8gYmUgaW50ZXJwcmV0ZWQuXG5cbk1vc3QgYnVpbHQtaW4gdHlwZXMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBmb3IgZm9ybWF0XG5zcGVjaWZpY2F0aW9ucywgYWx0aG91Z2ggc29tZSBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGFyZSBvbmx5XG5zdXBwb3J0ZWQgYnkgdGhlIG51bWVyaWMgdHlwZXMuXG5cbkEgZ2VuZXJhbCBjb252ZW50aW9uIGlzIHRoYXQgYW4gZW1wdHkgZm9ybWF0IHN0cmluZyAoIiIiIikgcHJvZHVjZXNcbnRoZSBzYW1lIHJlc3VsdCBhcyBpZiB5b3UgaGFkIGNhbGxlZCAic3RyKCkiIG9uIHRoZSB2YWx1ZS4gQSBub24tZW1wdHlcbmZvcm1hdCBzdHJpbmcgdHlwaWNhbGx5IG1vZGlmaWVzIHRoZSByZXN1bHQuXG5cblRoZSBnZW5lcmFsIGZvcm0gb2YgYSAqc3RhbmRhcmQgZm9ybWF0IHNwZWNpZmllciogaXM6XG5cbiAgIGZvcm1hdF9zcGVjIDo6PSBbW2ZpbGxdYWxpZ25dW3NpZ25dWyNdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt0eXBlXVxuICAgZmlsbCAgICAgICAgOjo9IDxhbnkgY2hhcmFjdGVyPlxuICAgYWxpZ24gICAgICAgOjo9ICI8IiB8ICI+IiB8ICI9IiB8ICJeIlxuICAgc2lnbiAgICAgICAgOjo9ICIrIiB8ICItIiB8ICIgIlxuICAgd2lkdGggICAgICAgOjo9IGludGVnZXJcbiAgIHByZWNpc2lvbiAgIDo6PSBpbnRlZ2VyXG4gICB0eXBlICAgICAgICA6Oj0gImIiIHwgImMiIHwgImQiIHwgImUiIHwgIkUiIHwgImYiIHwgIkYiIHwgImciIHwgIkciIHwgIm4iIHwgIm8iIHwgInMiIHwgIngiIHwgIlgiIHwgIiUiXG5cbklmIGEgdmFsaWQgKmFsaWduKiB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IGNhbiBiZSBwcmVjZWRlZCBieSBhICpmaWxsKlxuY2hhcmFjdGVyIHRoYXQgY2FuIGJlIGFueSBjaGFyYWN0ZXIgYW5kIGRlZmF1bHRzIHRvIGEgc3BhY2UgaWZcbm9taXR0ZWQuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgYSBsaXRlcmFsIGN1cmx5IGJyYWNlICgiInsiIiBvclxuIiJ9IiIpIGFzIHRoZSAqZmlsbCogY2hhcmFjdGVyIHdoZW4gdXNpbmcgdGhlICJzdHIuZm9ybWF0KCkiIG1ldGhvZC5cbkhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRvIGluc2VydCBhIGN1cmx5IGJyYWNlIHdpdGggYSBuZXN0ZWRcbnJlcGxhY2VtZW50IGZpZWxkLiAgVGhpcyBsaW1pdGF0aW9uIGRvZXNuXCd0IGFmZmVjdCB0aGUgImZvcm1hdCgpIlxuZnVuY3Rpb24uXG5cblRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGFsaWdubWVudCBvcHRpb25zIGlzIGFzIGZvbGxvd3M6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE9wdGlvbiAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgIlwnPFwnIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIGxlZnQtYWxpZ25lZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgIHxcbiAgIHwgICAgICAgICAgIHwgc3BhY2UgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIG1vc3Qgb2JqZWN0cykuICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCc+XCciICAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgcmlnaHQtYWxpZ25lZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgfFxuICAgfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgbnVtYmVycykuICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJz1cJyIgICAgIHwgRm9yY2VzIHRoZSBwYWRkaW5nIHRvIGJlIHBsYWNlZCBhZnRlciB0aGUgc2lnbiAoaWYgYW55KSAgICB8XG4gICB8ICAgICAgICAgICB8IGJ1dCBiZWZvcmUgdGhlIGRpZ2l0cy4gIFRoaXMgaXMgdXNlZCBmb3IgcHJpbnRpbmcgZmllbGRzICAgfFxuICAgfCAgICAgICAgICAgfCBpbiB0aGUgZm9ybSBcJyswMDAwMDAxMjBcJy4gVGhpcyBhbGlnbm1lbnQgb3B0aW9uIGlzIG9ubHkgICAgfFxuICAgfCAgICAgICAgICAgfCB2YWxpZCBmb3IgbnVtZXJpYyB0eXBlcy4gIEl0IGJlY29tZXMgdGhlIGRlZmF1bHQgd2hlbiBcJzBcJyAgfFxuICAgfCAgICAgICAgICAgfCBpbW1lZGlhdGVseSBwcmVjZWRlcyB0aGUgZmllbGQgd2lkdGguICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ15cJyIgICAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSBjZW50ZXJlZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgICAgICB8XG4gICB8ICAgICAgICAgICB8IHNwYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuTm90ZSB0aGF0IHVubGVzcyBhIG1pbmltdW0gZmllbGQgd2lkdGggaXMgZGVmaW5lZCwgdGhlIGZpZWxkIHdpZHRoXG53aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBkYXRhIHRvIGZpbGwgaXQsIHNvIHRoYXQgdGhlXG5hbGlnbm1lbnQgb3B0aW9uIGhhcyBubyBtZWFuaW5nIGluIHRoaXMgY2FzZS5cblxuVGhlICpzaWduKiBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgbnVtYmVyIHR5cGVzLCBhbmQgY2FuIGJlIG9uZSBvZlxudGhlIGZvbGxvd2luZzpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgT3B0aW9uICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCAiXCcrXCciICAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCBmb3IgYm90aCBwb3NpdGl2ZSBhcyAgfFxuICAgfCAgICAgICAgICAgfCB3ZWxsIGFzIG5lZ2F0aXZlIG51bWJlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJy1cJyIgICAgIHwgaW5kaWNhdGVzIHRoYXQgYSBzaWduIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG5lZ2F0aXZlICAgICB8XG4gICB8ICAgICAgICAgICB8IG51bWJlcnMgKHRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgc3BhY2UgICAgIHwgaW5kaWNhdGVzIHRoYXQgYSBsZWFkaW5nIHNwYWNlIHNob3VsZCBiZSB1c2VkIG9uIHBvc2l0aXZlICB8XG4gICB8ICAgICAgICAgICB8IG51bWJlcnMsIGFuZCBhIG1pbnVzIHNpZ24gb24gbmVnYXRpdmUgbnVtYmVycy4gICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuVGhlICJcJyNcJyIgb3B0aW9uIGNhdXNlcyB0aGUgImFsdGVybmF0ZSBmb3JtIiB0byBiZSB1c2VkIGZvciB0aGVcbmNvbnZlcnNpb24uICBUaGUgYWx0ZXJuYXRlIGZvcm0gaXMgZGVmaW5lZCBkaWZmZXJlbnRseSBmb3IgZGlmZmVyZW50XG50eXBlcy4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIGludGVnZXIsIGZsb2F0LCBjb21wbGV4IGFuZFxuRGVjaW1hbCB0eXBlcy4gRm9yIGludGVnZXJzLCB3aGVuIGJpbmFyeSwgb2N0YWwsIG9yIGhleGFkZWNpbWFsIG91dHB1dFxuaXMgdXNlZCwgdGhpcyBvcHRpb24gYWRkcyB0aGUgcHJlZml4IHJlc3BlY3RpdmUgIlwnMGJcJyIsICJcJzBvXCciLCBvclxuIlwnMHhcJyIgdG8gdGhlIG91dHB1dCB2YWx1ZS4gRm9yIGZsb2F0cywgY29tcGxleCBhbmQgRGVjaW1hbCB0aGVcbmFsdGVybmF0ZSBmb3JtIGNhdXNlcyB0aGUgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uIHRvIGFsd2F5cyBjb250YWluIGFcbmRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyLCBldmVuIGlmIG5vIGRpZ2l0cyBmb2xsb3cgaXQuIE5vcm1hbGx5LCBhXG5kZWNpbWFsLXBvaW50IGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSByZXN1bHQgb2YgdGhlc2UgY29udmVyc2lvbnNcbm9ubHkgaWYgYSBkaWdpdCBmb2xsb3dzIGl0LiBJbiBhZGRpdGlvbiwgZm9yICJcJ2dcJyIgYW5kICJcJ0dcJyJcbmNvbnZlcnNpb25zLCB0cmFpbGluZyB6ZXJvcyBhcmUgbm90IHJlbW92ZWQgZnJvbSB0aGUgcmVzdWx0LlxuXG5UaGUgIlwnLFwnIiBvcHRpb24gc2lnbmFscyB0aGUgdXNlIG9mIGEgY29tbWEgZm9yIGEgdGhvdXNhbmRzIHNlcGFyYXRvci5cbkZvciBhIGxvY2FsZSBhd2FyZSBzZXBhcmF0b3IsIHVzZSB0aGUgIlwnblwnIiBpbnRlZ2VyIHByZXNlbnRhdGlvbiB0eXBlXG5pbnN0ZWFkLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBBZGRlZCB0aGUgIlwnLFwnIiBvcHRpb24gKHNlZSBhbHNvICoqUEVQIDM3OCoqKS5cblxuKndpZHRoKiBpcyBhIGRlY2ltYWwgaW50ZWdlciBkZWZpbmluZyB0aGUgbWluaW11bSBmaWVsZCB3aWR0aC4gIElmIG5vdFxuc3BlY2lmaWVkLCB0aGVuIHRoZSBmaWVsZCB3aWR0aCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGNvbnRlbnQuXG5cbldoZW4gbm8gZXhwbGljaXQgYWxpZ25tZW50IGlzIGdpdmVuLCBwcmVjZWRpbmcgdGhlICp3aWR0aCogZmllbGQgYnkgYVxuemVybyAoIlwnMFwnIikgY2hhcmFjdGVyIGVuYWJsZXMgc2lnbi1hd2FyZSB6ZXJvLXBhZGRpbmcgZm9yIG51bWVyaWNcbnR5cGVzLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgKmZpbGwqIGNoYXJhY3RlciBvZiAiXCcwXCciIHdpdGggYW5cbiphbGlnbm1lbnQqIHR5cGUgb2YgIlwnPVwnIi5cblxuVGhlICpwcmVjaXNpb24qIGlzIGEgZGVjaW1hbCBudW1iZXIgaW5kaWNhdGluZyBob3cgbWFueSBkaWdpdHMgc2hvdWxkXG5iZSBkaXNwbGF5ZWQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgZm9yIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWVcbmZvcm1hdHRlZCB3aXRoICJcJ2ZcJyIgYW5kICJcJ0ZcJyIsIG9yIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnRcbmZvciBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIGZvcm1hdHRlZCB3aXRoICJcJ2dcJyIgb3IgIlwnR1wnIi4gIEZvciBub24tXG5udW1iZXIgdHlwZXMgdGhlIGZpZWxkIGluZGljYXRlcyB0aGUgbWF4aW11bSBmaWVsZCBzaXplIC0gaW4gb3RoZXJcbndvcmRzLCBob3cgbWFueSBjaGFyYWN0ZXJzIHdpbGwgYmUgdXNlZCBmcm9tIHRoZSBmaWVsZCBjb250ZW50LiBUaGVcbipwcmVjaXNpb24qIGlzIG5vdCBhbGxvd2VkIGZvciBpbnRlZ2VyIHZhbHVlcy5cblxuRmluYWxseSwgdGhlICp0eXBlKiBkZXRlcm1pbmVzIGhvdyB0aGUgZGF0YSBzaG91bGQgYmUgcHJlc2VudGVkLlxuXG5UaGUgYXZhaWxhYmxlIHN0cmluZyBwcmVzZW50YXRpb24gdHlwZXMgYXJlOlxuXG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBUeXBlICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8ICJcJ3NcJyIgICAgIHwgU3RyaW5nIGZvcm1hdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCB0eXBlIGZvciBzdHJpbmdzIGFuZCAgICB8XG4gICB8ICAgICAgICAgICB8IG1heSBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgTm9uZSAgICAgIHwgVGhlIHNhbWUgYXMgIlwnc1wnIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cblRoZSBhdmFpbGFibGUgaW50ZWdlciBwcmVzZW50YXRpb24gdHlwZXMgYXJlOlxuXG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBUeXBlICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8ICJcJ2JcJyIgICAgIHwgQmluYXJ5IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMi4gICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCdjXCciICAgICB8IENoYXJhY3Rlci4gQ29udmVydHMgdGhlIGludGVnZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgICAgICAgfFxuICAgfCAgICAgICAgICAgfCB1bmljb2RlIGNoYXJhY3RlciBiZWZvcmUgcHJpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ2RcJyIgICAgIHwgRGVjaW1hbCBJbnRlZ2VyLiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAxMC4gICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCdvXCciICAgICB8IE9jdGFsIGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgOC4gICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwneFwnIiAgICAgfCBIZXggZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAxNiwgdXNpbmcgbG93ZXItICAgIHxcbiAgIHwgICAgICAgICAgIHwgY2FzZSBsZXR0ZXJzIGZvciB0aGUgZGlnaXRzIGFib3ZlIDkuICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCdYXCciICAgICB8IEhleCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDE2LCB1c2luZyB1cHBlci0gICAgfFxuICAgfCAgICAgICAgICAgfCBjYXNlIGxldHRlcnMgZm9yIHRoZSBkaWdpdHMgYWJvdmUgOS4gICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ25cJyIgICAgIHwgTnVtYmVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzICJcJ2RcJyIsIGV4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlIHxcbiAgIHwgICAgICAgICAgIHwgY3VycmVudCBsb2NhbGUgc2V0dGluZyB0byBpbnNlcnQgdGhlIGFwcHJvcHJpYXRlIG51bWJlciAgICB8XG4gICB8ICAgICAgICAgICB8IHNlcGFyYXRvciBjaGFyYWN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgTm9uZSAgICAgIHwgVGhlIHNhbWUgYXMgIlwnZFwnIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbkluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBwcmVzZW50YXRpb24gdHlwZXMsIGludGVnZXJzIGNhbiBiZSBmb3JtYXR0ZWRcbndpdGggdGhlIGZsb2F0aW5nIHBvaW50IHByZXNlbnRhdGlvbiB0eXBlcyBsaXN0ZWQgYmVsb3cgKGV4Y2VwdCAiXCduXCciXG5hbmQgTm9uZSkuIFdoZW4gZG9pbmcgc28sICJmbG9hdCgpIiBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGludGVnZXIgdG9cbmEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGJlZm9yZSBmb3JtYXR0aW5nLlxuXG5UaGUgYXZhaWxhYmxlIHByZXNlbnRhdGlvbiB0eXBlcyBmb3IgZmxvYXRpbmcgcG9pbnQgYW5kIGRlY2ltYWwgdmFsdWVzXG5hcmU6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IFR5cGUgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgIlwnZVwnIiAgICAgfCBFeHBvbmVudCBub3RhdGlvbi4gUHJpbnRzIHRoZSBudW1iZXIgaW4gc2NpZW50aWZpYyAgICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgbm90YXRpb24gdXNpbmcgdGhlIGxldHRlciBcJ2VcJyB0byBpbmRpY2F0ZSB0aGUgZXhwb25lbnQuICAgIHxcbiAgIHwgICAgICAgICAgIHwgVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzICI2Ii4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCdFXCciICAgICB8IEV4cG9uZW50IG5vdGF0aW9uLiBTYW1lIGFzICJcJ2VcJyIgZXhjZXB0IGl0IHVzZXMgYW4gdXBwZXIgICB8XG4gICB8ICAgICAgICAgICB8IGNhc2UgXCdFXCcgYXMgdGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIuICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCdmXCciICAgICB8IEZpeGVkIHBvaW50LiBEaXNwbGF5cyB0aGUgbnVtYmVyIGFzIGEgZml4ZWQtcG9pbnQgbnVtYmVyLiAgfFxuICAgfCAgICAgICAgICAgfCBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgIjYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ0ZcJyIgICAgIHwgRml4ZWQgcG9pbnQuIFNhbWUgYXMgIlwnZlwnIiwgYnV0IGNvbnZlcnRzICJuYW4iIHRvICJOQU4iICAgIHxcbiAgIHwgICAgICAgICAgIHwgYW5kICJpbmYiIHRvICJJTkYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCdnXCciICAgICB8IEdlbmVyYWwgZm9ybWF0LiAgRm9yIGEgZ2l2ZW4gcHJlY2lzaW9uICJwID49IDEiLCB0aGlzICAgICAgfFxuICAgfCAgICAgICAgICAgfCByb3VuZHMgdGhlIG51bWJlciB0byAicCIgc2lnbmlmaWNhbnQgZGlnaXRzIGFuZCB0aGVuICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgZm9ybWF0cyB0aGUgcmVzdWx0IGluIGVpdGhlciBmaXhlZC1wb2ludCBmb3JtYXQgb3IgaW4gICAgICB8XG4gICB8ICAgICAgICAgICB8IHNjaWVudGlmaWMgbm90YXRpb24sIGRlcGVuZGluZyBvbiBpdHMgbWFnbml0dWRlLiAgVGhlICAgICAgfFxuICAgfCAgICAgICAgICAgfCBwcmVjaXNlIHJ1bGVzIGFyZSBhcyBmb2xsb3dzOiBzdXBwb3NlIHRoYXQgdGhlIHJlc3VsdCAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgIlwnZVwnIiBhbmQgcHJlY2lzaW9uICJwLTEiIHxcbiAgIHwgICAgICAgICAgIHwgd291bGQgaGF2ZSBleHBvbmVudCAiZXhwIi4gIFRoZW4gaWYgIi00IDw9IGV4cCA8IHAiLCB0aGUgICB8XG4gICB8ICAgICAgICAgICB8IG51bWJlciBpcyBmb3JtYXR0ZWQgd2l0aCBwcmVzZW50YXRpb24gdHlwZSAiXCdmXCciIGFuZCAgICAgICB8XG4gICB8ICAgICAgICAgICB8IHByZWNpc2lvbiAicC0xLWV4cCIuICBPdGhlcndpc2UsIHRoZSBudW1iZXIgaXMgZm9ybWF0dGVkICAgfFxuICAgfCAgICAgICAgICAgfCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICJcJ2VcJyIgYW5kIHByZWNpc2lvbiAicC0xIi4gSW4gYm90aCAgfFxuICAgfCAgICAgICAgICAgfCBjYXNlcyBpbnNpZ25pZmljYW50IHRyYWlsaW5nIHplcm9zIGFyZSByZW1vdmVkIGZyb20gdGhlICAgIHxcbiAgIHwgICAgICAgICAgIHwgc2lnbmlmaWNhbmQsIGFuZCB0aGUgZGVjaW1hbCBwb2ludCBpcyBhbHNvIHJlbW92ZWQgaWYgICAgICB8XG4gICB8ICAgICAgICAgICB8IHRoZXJlIGFyZSBubyByZW1haW5pbmcgZGlnaXRzIGZvbGxvd2luZyBpdC4gIFBvc2l0aXZlIGFuZCAgfFxuICAgfCAgICAgICAgICAgfCBuZWdhdGl2ZSBpbmZpbml0eSwgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHplcm8sIGFuZCBuYW5zLCAgIHxcbiAgIHwgICAgICAgICAgIHwgYXJlIGZvcm1hdHRlZCBhcyAiaW5mIiwgIi1pbmYiLCAiMCIsICItMCIgYW5kICJuYW4iICAgICAgICB8XG4gICB8ICAgICAgICAgICB8IHJlc3BlY3RpdmVseSwgcmVnYXJkbGVzcyBvZiB0aGUgcHJlY2lzaW9uLiAgQSBwcmVjaXNpb24gb2YgfFxuICAgfCAgICAgICAgICAgfCAiMCIgaXMgdHJlYXRlZCBhcyBlcXVpdmFsZW50IHRvIGEgcHJlY2lzaW9uIG9mICIxIi4gVGhlICAgIHxcbiAgIHwgICAgICAgICAgIHwgZGVmYXVsdCBwcmVjaXNpb24gaXMgIjYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCdHXCciICAgICB8IEdlbmVyYWwgZm9ybWF0LiBTYW1lIGFzICJcJ2dcJyIgZXhjZXB0IHN3aXRjaGVzIHRvICJcJ0VcJyIgaWYgIHxcbiAgIHwgICAgICAgICAgIHwgdGhlIG51bWJlciBnZXRzIHRvbyBsYXJnZS4gVGhlIHJlcHJlc2VudGF0aW9ucyBvZiBpbmZpbml0eSB8XG4gICB8ICAgICAgICAgICB8IGFuZCBOYU4gYXJlIHVwcGVyY2FzZWQsIHRvby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnblwnIiAgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgIlwnZ1wnIiwgZXhjZXB0IHRoYXQgaXQgdXNlcyB0aGUgfFxuICAgfCAgICAgICAgICAgfCBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyICAgIHxcbiAgIHwgICAgICAgICAgIHwgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCclXCciICAgICB8IFBlcmNlbnRhZ2UuIE11bHRpcGxpZXMgdGhlIG51bWJlciBieSAxMDAgYW5kIGRpc3BsYXlzIGluICAgfFxuICAgfCAgICAgICAgICAgfCBmaXhlZCAoIlwnZlwnIikgZm9ybWF0LCBmb2xsb3dlZCBieSBhIHBlcmNlbnQgc2lnbi4gICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgTm9uZSAgICAgIHwgU2ltaWxhciB0byAiXCdnXCciLCBleGNlcHQgdGhhdCBmaXhlZC1wb2ludCBub3RhdGlvbiwgd2hlbiAgIHxcbiAgIHwgICAgICAgICAgIHwgdXNlZCwgaGFzIGF0IGxlYXN0IG9uZSBkaWdpdCBwYXN0IHRoZSBkZWNpbWFsIHBvaW50LiBUaGUgICB8XG4gICB8ICAgICAgICAgICB8IGRlZmF1bHQgcHJlY2lzaW9uIGlzIGFzIGhpZ2ggYXMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgICAgfFxuICAgfCAgICAgICAgICAgfCBwYXJ0aWN1bGFyIHZhbHVlLiBUaGUgb3ZlcmFsbCBlZmZlY3QgaXMgdG8gbWF0Y2ggdGhlICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgb3V0cHV0IG9mICJzdHIoKSIgYXMgYWx0ZXJlZCBieSB0aGUgb3RoZXIgZm9ybWF0ICAgICAgICAgICB8XG4gICB8ICAgICAgICAgICB8IG1vZGlmaWVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuXG5Gb3JtYXQgZXhhbXBsZXNcbj09PT09PT09PT09PT09PVxuXG5UaGlzIHNlY3Rpb24gY29udGFpbnMgZXhhbXBsZXMgb2YgdGhlICJzdHIuZm9ybWF0KCkiIHN5bnRheCBhbmRcbmNvbXBhcmlzb24gd2l0aCB0aGUgb2xkICIlIi1mb3JtYXR0aW5nLlxuXG5JbiBtb3N0IG9mIHRoZSBjYXNlcyB0aGUgc3ludGF4IGlzIHNpbWlsYXIgdG8gdGhlIG9sZCAiJSItZm9ybWF0dGluZyxcbndpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSAie30iIGFuZCB3aXRoICI6IiB1c2VkIGluc3RlYWQgb2YgIiUiLiBGb3JcbmV4YW1wbGUsICJcJyUwMy4yZlwnIiBjYW4gYmUgdHJhbnNsYXRlZCB0byAiXCd7OjAzLjJmfVwnIi5cblxuVGhlIG5ldyBmb3JtYXQgc3ludGF4IGFsc28gc3VwcG9ydHMgbmV3IGFuZCBkaWZmZXJlbnQgb3B0aW9ucywgc2hvd25cbmluIHRoZSBmb2xsb3cgZXhhbXBsZXMuXG5cbkFjY2Vzc2luZyBhcmd1bWVudHMgYnkgcG9zaXRpb246XG5cbiAgID4+PiBcJ3swfSwgezF9LCB7Mn1cJy5mb3JtYXQoXCdhXCcsIFwnYlwnLCBcJ2NcJylcbiAgIFwnYSwgYiwgY1wnXG4gICA+Pj4gXCd7fSwge30sIHt9XCcuZm9ybWF0KFwnYVwnLCBcJ2JcJywgXCdjXCcpICAjIDMuMSsgb25seVxuICAgXCdhLCBiLCBjXCdcbiAgID4+PiBcJ3syfSwgezF9LCB7MH1cJy5mb3JtYXQoXCdhXCcsIFwnYlwnLCBcJ2NcJylcbiAgIFwnYywgYiwgYVwnXG4gICA+Pj4gXCd7Mn0sIHsxfSwgezB9XCcuZm9ybWF0KCpcJ2FiY1wnKSAgICAgICMgdW5wYWNraW5nIGFyZ3VtZW50IHNlcXVlbmNlXG4gICBcJ2MsIGIsIGFcJ1xuICAgPj4+IFwnezB9ezF9ezB9XCcuZm9ybWF0KFwnYWJyYVwnLCBcJ2NhZFwnKSAgICMgYXJndW1lbnRzXCcgaW5kaWNlcyBjYW4gYmUgcmVwZWF0ZWRcbiAgIFwnYWJyYWNhZGFicmFcJ1xuXG5BY2Nlc3NpbmcgYXJndW1lbnRzIGJ5IG5hbWU6XG5cbiAgID4+PiBcJ0Nvb3JkaW5hdGVzOiB7bGF0aXR1ZGV9LCB7bG9uZ2l0dWRlfVwnLmZvcm1hdChsYXRpdHVkZT1cJzM3LjI0TlwnLCBsb25naXR1ZGU9XCctMTE1LjgxV1wnKVxuICAgXCdDb29yZGluYXRlczogMzcuMjROLCAtMTE1LjgxV1wnXG4gICA+Pj4gY29vcmQgPSB7XCdsYXRpdHVkZVwnOiBcJzM3LjI0TlwnLCBcJ2xvbmdpdHVkZVwnOiBcJy0xMTUuODFXXCd9XG4gICA+Pj4gXCdDb29yZGluYXRlczoge2xhdGl0dWRlfSwge2xvbmdpdHVkZX1cJy5mb3JtYXQoKipjb29yZClcbiAgIFwnQ29vcmRpbmF0ZXM6IDM3LjI0TiwgLTExNS44MVdcJ1xuXG5BY2Nlc3NpbmcgYXJndW1lbnRzXCcgYXR0cmlidXRlczpcblxuICAgPj4+IGMgPSAzLTVqXG4gICA+Pj4gKFwnVGhlIGNvbXBsZXggbnVtYmVyIHswfSBpcyBmb3JtZWQgZnJvbSB0aGUgcmVhbCBwYXJ0IHswLnJlYWx9IFwnXG4gICAuLi4gIFwnYW5kIHRoZSBpbWFnaW5hcnkgcGFydCB7MC5pbWFnfS5cJykuZm9ybWF0KGMpXG4gICBcJ1RoZSBjb21wbGV4IG51bWJlciAoMy01aikgaXMgZm9ybWVkIGZyb20gdGhlIHJlYWwgcGFydCAzLjAgYW5kIHRoZSBpbWFnaW5hcnkgcGFydCAtNS4wLlwnXG4gICA+Pj4gY2xhc3MgUG9pbnQ6XG4gICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5KTpcbiAgIC4uLiAgICAgICAgIHNlbGYueCwgc2VsZi55ID0geCwgeVxuICAgLi4uICAgICBkZWYgX19zdHJfXyhzZWxmKTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBcJ1BvaW50KHtzZWxmLnh9LCB7c2VsZi55fSlcJy5mb3JtYXQoc2VsZj1zZWxmKVxuICAgLi4uXG4gICA+Pj4gc3RyKFBvaW50KDQsIDIpKVxuICAgXCdQb2ludCg0LCAyKVwnXG5cbkFjY2Vzc2luZyBhcmd1bWVudHNcJyBpdGVtczpcblxuICAgPj4+IGNvb3JkID0gKDMsIDUpXG4gICA+Pj4gXCdYOiB7MFswXX07ICBZOiB7MFsxXX1cJy5mb3JtYXQoY29vcmQpXG4gICBcJ1g6IDM7ICBZOiA1XCdcblxuUmVwbGFjaW5nICIlcyIgYW5kICIlciI6XG5cbiAgID4+PiAicmVwcigpIHNob3dzIHF1b3RlczogeyFyfTsgc3RyKCkgZG9lc25cJ3Q6IHshc30iLmZvcm1hdChcJ3Rlc3QxXCcsIFwndGVzdDJcJylcbiAgICJyZXByKCkgc2hvd3MgcXVvdGVzOiBcJ3Rlc3QxXCc7IHN0cigpIGRvZXNuXCd0OiB0ZXN0MiJcblxuQWxpZ25pbmcgdGhlIHRleHQgYW5kIHNwZWNpZnlpbmcgYSB3aWR0aDpcblxuICAgPj4+IFwnezo8MzB9XCcuZm9ybWF0KFwnbGVmdCBhbGlnbmVkXCcpXG4gICBcJ2xlZnQgYWxpZ25lZCAgICAgICAgICAgICAgICAgIFwnXG4gICA+Pj4gXCd7Oj4zMH1cJy5mb3JtYXQoXCdyaWdodCBhbGlnbmVkXCcpXG4gICBcJyAgICAgICAgICAgICAgICAgcmlnaHQgYWxpZ25lZFwnXG4gICA+Pj4gXCd7Ol4zMH1cJy5mb3JtYXQoXCdjZW50ZXJlZFwnKVxuICAgXCcgICAgICAgICAgIGNlbnRlcmVkICAgICAgICAgICBcJ1xuICAgPj4+IFwnezoqXjMwfVwnLmZvcm1hdChcJ2NlbnRlcmVkXCcpICAjIHVzZSBcJypcJyBhcyBhIGZpbGwgY2hhclxuICAgXCcqKioqKioqKioqKmNlbnRlcmVkKioqKioqKioqKipcJ1xuXG5SZXBsYWNpbmcgIiUrZiIsICIlLWYiLCBhbmQgIiUgZiIgYW5kIHNwZWNpZnlpbmcgYSBzaWduOlxuXG4gICA+Pj4gXCd7OitmfTsgezorZn1cJy5mb3JtYXQoMy4xNCwgLTMuMTQpICAjIHNob3cgaXQgYWx3YXlzXG4gICBcJyszLjE0MDAwMDsgLTMuMTQwMDAwXCdcbiAgID4+PiBcJ3s6IGZ9OyB7OiBmfVwnLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBhIHNwYWNlIGZvciBwb3NpdGl2ZSBudW1iZXJzXG4gICBcJyAzLjE0MDAwMDsgLTMuMTQwMDAwXCdcbiAgID4+PiBcJ3s6LWZ9OyB7Oi1mfVwnLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBvbmx5IHRoZSBtaW51cyAtLSBzYW1lIGFzIFwnezpmfTsgezpmfVwnXG4gICBcJzMuMTQwMDAwOyAtMy4xNDAwMDBcJ1xuXG5SZXBsYWNpbmcgIiV4IiBhbmQgIiVvIiBhbmQgY29udmVydGluZyB0aGUgdmFsdWUgdG8gZGlmZmVyZW50IGJhc2VzOlxuXG4gICA+Pj4gIyBmb3JtYXQgYWxzbyBzdXBwb3J0cyBiaW5hcnkgbnVtYmVyc1xuICAgPj4+ICJpbnQ6IHswOmR9OyAgaGV4OiB7MDp4fTsgIG9jdDogezA6b307ICBiaW46IHswOmJ9Ii5mb3JtYXQoNDIpXG4gICBcJ2ludDogNDI7ICBoZXg6IDJhOyAgb2N0OiA1MjsgIGJpbjogMTAxMDEwXCdcbiAgID4+PiAjIHdpdGggMHgsIDBvLCBvciAwYiBhcyBwcmVmaXg6XG4gICA+Pj4gImludDogezA6ZH07ICBoZXg6IHswOiN4fTsgIG9jdDogezA6I299OyAgYmluOiB7MDojYn0iLmZvcm1hdCg0MilcbiAgIFwnaW50OiA0MjsgIGhleDogMHgyYTsgIG9jdDogMG81MjsgIGJpbjogMGIxMDEwMTBcJ1xuXG5Vc2luZyB0aGUgY29tbWEgYXMgYSB0aG91c2FuZHMgc2VwYXJhdG9yOlxuXG4gICA+Pj4gXCd7Oix9XCcuZm9ybWF0KDEyMzQ1Njc4OTApXG4gICBcJzEsMjM0LDU2Nyw4OTBcJ1xuXG5FeHByZXNzaW5nIGEgcGVyY2VudGFnZTpcblxuICAgPj4+IHBvaW50cyA9IDE5XG4gICA+Pj4gdG90YWwgPSAyMlxuICAgPj4+IFwnQ29ycmVjdCBhbnN3ZXJzOiB7Oi4yJX1cJy5mb3JtYXQocG9pbnRzL3RvdGFsKVxuICAgXCdDb3JyZWN0IGFuc3dlcnM6IDg2LjM2JVwnXG5cblVzaW5nIHR5cGUtc3BlY2lmaWMgZm9ybWF0dGluZzpcblxuICAgPj4+IGltcG9ydCBkYXRldGltZVxuICAgPj4+IGQgPSBkYXRldGltZS5kYXRldGltZSgyMDEwLCA3LCA0LCAxMiwgMTUsIDU4KVxuICAgPj4+IFwnezolWS0lbS0lZCAlSDolTTolU31cJy5mb3JtYXQoZClcbiAgIFwnMjAxMC0wNy0wNCAxMjoxNTo1OFwnXG5cbk5lc3RpbmcgYXJndW1lbnRzIGFuZCBtb3JlIGNvbXBsZXggZXhhbXBsZXM6XG5cbiAgID4+PiBmb3IgYWxpZ24sIHRleHQgaW4gemlwKFwnPF4+XCcsIFtcJ2xlZnRcJywgXCdjZW50ZXJcJywgXCdyaWdodFwnXSk6XG4gICAuLi4gICAgIFwnezA6e2ZpbGx9e2FsaWdufTE2fVwnLmZvcm1hdCh0ZXh0LCBmaWxsPWFsaWduLCBhbGlnbj1hbGlnbilcbiAgIC4uLlxuICAgXCdsZWZ0PDw8PDw8PDw8PDw8XCdcbiAgIFwnXl5eXl5jZW50ZXJeXl5eXlwnXG4gICBcJz4+Pj4+Pj4+Pj4+cmlnaHRcJ1xuICAgPj4+XG4gICA+Pj4gb2N0ZXRzID0gWzE5MiwgMTY4LCAwLCAxXVxuICAgPj4+IFwnezowMlh9ezowMlh9ezowMlh9ezowMlh9XCcuZm9ybWF0KCpvY3RldHMpXG4gICBcJ0MwQTgwMDAxXCdcbiAgID4+PiBpbnQoXywgMTYpXG4gICAzMjMyMjM1NTIxXG4gICA+Pj5cbiAgID4+PiB3aWR0aCA9IDVcbiAgID4+PiBmb3IgbnVtIGluIHJhbmdlKDUsMTIpOiAjZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFXG4gICAuLi4gICAgIGZvciBiYXNlIGluIFwnZFhvYlwnOlxuICAgLi4uICAgICAgICAgcHJpbnQoXCd7MDp7d2lkdGh9e2Jhc2V9fVwnLmZvcm1hdChudW0sIGJhc2U9YmFzZSwgd2lkdGg9d2lkdGgpLCBlbmQ9XCcgXCcpXG4gICAuLi4gICAgIHByaW50KClcbiAgIC4uLlxuICAgICAgIDUgICAgIDUgICAgIDUgICAxMDFcbiAgICAgICA2ICAgICA2ICAgICA2ICAgMTEwXG4gICAgICAgNyAgICAgNyAgICAgNyAgIDExMVxuICAgICAgIDggICAgIDggICAgMTAgIDEwMDBcbiAgICAgICA5ICAgICA5ICAgIDExICAxMDAxXG4gICAgICAxMCAgICAgQSAgICAxMiAgMTAxMFxuICAgICAgMTEgICAgIEIgICAgMTMgIDEwMTFcbicsCi0gJ2Z1bmN0aW9uJzogdSdcbkZ1bmN0aW9uIGRlZmluaXRpb25zXG4qKioqKioqKioqKioqKioqKioqKlxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgKHNlZVxuc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGZ1bmNkZWYgICAgICAgIDo6PSBbZGVjb3JhdG9yc10gImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZVxuICAgZGVjb3JhdG9ycyAgICAgOjo9IGRlY29yYXRvcitcbiAgIGRlY29yYXRvciAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiBbYXJndW1lbnRfbGlzdCBbIiwiXV0gIikiXSBORVdMSU5FXG4gICBkb3R0ZWRfbmFtZSAgICA6Oj0gaWRlbnRpZmllciAoIi4iIGlkZW50aWZpZXIpKlxuICAgcGFyYW1ldGVyX2xpc3QgOjo9IChkZWZwYXJhbWV0ZXIgIiwiKSpcbiAgICAgICAgICAgICAgICAgICAgICB8ICIqIiBbcGFyYW1ldGVyXSAoIiwiIGRlZnBhcmFtZXRlcikqIFsiLCIgIioqIiBwYXJhbWV0ZXJdXG4gICAgICAgICAgICAgICAgICAgICAgfCAiKioiIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgICAgICAgIHwgZGVmcGFyYW1ldGVyIFsiLCJdIClcbiAgIHBhcmFtZXRlciAgICAgIDo6PSBpZGVudGlmaWVyIFsiOiIgZXhwcmVzc2lvbl1cbiAgIGRlZnBhcmFtZXRlciAgIDo6PSBwYXJhbWV0ZXIgWyI9IiBleHByZXNzaW9uXVxuICAgZnVuY25hbWUgICAgICAgOjo9IGlkZW50aWZpZXJcblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgSXRzIGV4ZWN1dGlvbiBiaW5kc1xudGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlIHRvIGEgZnVuY3Rpb24gb2JqZWN0XG4oYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhlY3V0YWJsZSBjb2RlIGZvciB0aGUgZnVuY3Rpb24pLiAgVGhpc1xuZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBuYW1lc3BhY2VcbmFzIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHRvIGJlIHVzZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLlxuXG5UaGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBkb2VzIG5vdCBleGVjdXRlIHRoZSBmdW5jdGlvbiBib2R5OyB0aGlzIGdldHNcbmV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBbM11cblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvciBtb3JlICpkZWNvcmF0b3IqXG5leHByZXNzaW9ucy4gRGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXNcbmRlZmluZWQsIGluIHRoZSBzY29wZSB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhlXG5yZXN1bHQgbXVzdCBiZSBhIGNhbGxhYmxlLCB3aGljaCBpcyBpbnZva2VkIHdpdGggdGhlIGZ1bmN0aW9uIG9iamVjdFxuYXMgdGhlIG9ubHkgYXJndW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBib3VuZCB0byB0aGUgZnVuY3Rpb24gbmFtZVxuaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgTXVsdGlwbGUgZGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpblxubmVzdGVkIGZhc2hpb24uIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGVcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgZGVmIGZ1bmMoKTogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGRlZiBmdW5jKCk6IHBhc3NcbiAgIGZ1bmMgPSBmMShhcmcpKGYyKGZ1bmMpKVxuXG5XaGVuIG9uZSBvciBtb3JlICpwYXJhbWV0ZXJzKiBoYXZlIHRoZSBmb3JtICpwYXJhbWV0ZXIqICI9IlxuKmV4cHJlc3Npb24qLCB0aGUgZnVuY3Rpb24gaXMgc2FpZCB0byBoYXZlICJkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMuIlxuRm9yIGEgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZyAqYXJndW1lbnQqIG1heVxuYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVyXCdzIGRlZmF1bHQgdmFsdWUgaXNcbnN1YnN0aXR1dGVkLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZ1xucGFyYW1ldGVycyB1cCB1bnRpbCB0aGUgIiIqIiIgbXVzdCBhbHNvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIC0tLSB0aGlzXG5pcyBhIHN5bnRhY3RpYyByZXN0cmljdGlvbiB0aGF0IGlzIG5vdCBleHByZXNzZWQgYnkgdGhlIGdyYW1tYXIuXG5cbioqRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHdoZW4gdGhlXG5mdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLioqIFRoaXMgbWVhbnMgdGhhdCB0aGUgZXhwcmVzc2lvbiBpc1xuZXZhbHVhdGVkIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGF0IHRoZSBzYW1lICJwcmUtXG5jb21wdXRlZCIgdmFsdWUgaXMgdXNlZCBmb3IgZWFjaCBjYWxsLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudFxudG8gdW5kZXJzdGFuZCB3aGVuIGEgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgYSBtdXRhYmxlIG9iamVjdCwgc3VjaCBhcyBhXG5saXN0IG9yIGEgZGljdGlvbmFyeTogaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QgKGUuZy4gYnlcbmFwcGVuZGluZyBhbiBpdGVtIHRvIGEgbGlzdCksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGluIGVmZmVjdCBtb2RpZmllZC5cblRoaXMgaXMgZ2VuZXJhbGx5IG5vdCB3aGF0IHdhcyBpbnRlbmRlZC4gIEEgd2F5IGFyb3VuZCB0aGlzIGlzIHRvIHVzZVxuIk5vbmUiIGFzIHRoZSBkZWZhdWx0LCBhbmQgZXhwbGljaXRseSB0ZXN0IGZvciBpdCBpbiB0aGUgYm9keSBvZiB0aGVcbmZ1bmN0aW9uLCBlLmcuOlxuXG4gICBkZWYgd2hhdHNfb25fdGhlX3RlbGx5KHBlbmd1aW49Tm9uZSk6XG4gICAgICAgaWYgcGVuZ3VpbiBpcyBOb25lOlxuICAgICAgICAgICBwZW5ndWluID0gW11cbiAgICAgICBwZW5ndWluLmFwcGVuZCgicHJvcGVydHkgb2YgdGhlIHpvbyIpXG4gICAgICAgcmV0dXJuIHBlbmd1aW5cblxuRnVuY3Rpb24gY2FsbCBzZW1hbnRpY3MgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiBzZWN0aW9uXG4qQ2FsbHMqLiBBIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIGFzc2lnbnMgdmFsdWVzIHRvIGFsbCBwYXJhbWV0ZXJzXG5tZW50aW9uZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCBlaXRoZXIgZnJvbSBwb3NpdGlvbiBhcmd1bWVudHMsIGZyb21cbmtleXdvcmQgYXJndW1lbnRzLCBvciBmcm9tIGRlZmF1bHQgdmFsdWVzLiAgSWYgdGhlIGZvcm1cbiIiKmlkZW50aWZpZXIiIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZyBhbnlcbmV4Y2VzcyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiAgSWYgdGhlXG5mb3JtICIiKippZGVudGlmaWVyIiIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXdcbmRpY3Rpb25hcnkgcmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYSBuZXdcbmVtcHR5IGRpY3Rpb25hcnkuIFBhcmFtZXRlcnMgYWZ0ZXIgIiIqIiIgb3IgIiIqaWRlbnRpZmllciIiIGFyZVxua2V5d29yZC1vbmx5IHBhcmFtZXRlcnMgYW5kIG1heSBvbmx5IGJlIHBhc3NlZCB1c2VkIGtleXdvcmQgYXJndW1lbnRzLlxuXG5QYXJhbWV0ZXJzIG1heSBoYXZlIGFubm90YXRpb25zIG9mIHRoZSBmb3JtICIiOiBleHByZXNzaW9uIiIgZm9sbG93aW5nXG50aGUgcGFyYW1ldGVyIG5hbWUuICBBbnkgcGFyYW1ldGVyIG1heSBoYXZlIGFuIGFubm90YXRpb24gZXZlbiB0aG9zZVxub2YgdGhlIGZvcm0gIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIi4gIEZ1bmN0aW9ucyBtYXkgaGF2ZVxuInJldHVybiIgYW5ub3RhdGlvbiBvZiB0aGUgZm9ybSAiIi0+IGV4cHJlc3Npb24iIiBhZnRlciB0aGUgcGFyYW1ldGVyXG5saXN0LiAgVGhlc2UgYW5ub3RhdGlvbnMgY2FuIGJlIGFueSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiBhbmQgYXJlXG5ldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4gIEFubm90YXRpb25zIG1heVxuYmUgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IG9yZGVyIHRoYW4gdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBjb2RlLlxuVGhlIHByZXNlbmNlIG9mIGFubm90YXRpb25zIGRvZXMgbm90IGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mIGFcbmZ1bmN0aW9uLiAgVGhlIGFubm90YXRpb24gdmFsdWVzIGFyZSBhdmFpbGFibGUgYXMgdmFsdWVzIG9mIGFcbmRpY3Rpb25hcnkga2V5ZWQgYnkgdGhlIHBhcmFtZXRlcnNcJyBuYW1lcyBpbiB0aGUgIl9fYW5ub3RhdGlvbnNfXyJcbmF0dHJpYnV0ZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LlxuXG5JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbm9ueW1vdXMgZnVuY3Rpb25zIChmdW5jdGlvbnMgbm90IGJvdW5kXG50byBhIG5hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGFcbmV4cHJlc3Npb25zLCBkZXNjcmliZWQgaW4gc2VjdGlvbiAqTGFtYmRhcyouICBOb3RlIHRoYXQgdGhlIGxhbWJkYVxuZXhwcmVzc2lvbiBpcyBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEgc2ltcGxpZmllZCBmdW5jdGlvbiBkZWZpbml0aW9uO1xuYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgIiJkZWYiIiBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgb3JcbmFzc2lnbmVkIHRvIGFub3RoZXIgbmFtZSBqdXN0IGxpa2UgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgbGFtYmRhXG5leHByZXNzaW9uLiAgVGhlICIiZGVmIiIgZm9ybSBpcyBhY3R1YWxseSBtb3JlIHBvd2VyZnVsIHNpbmNlIGl0XG5hbGxvd3MgdGhlIGV4ZWN1dGlvbiBvZiBtdWx0aXBsZSBzdGF0ZW1lbnRzIGFuZCBhbm5vdGF0aW9ucy5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogRnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzLiAgQSAiImRlZiIiXG5zdGF0ZW1lbnQgZXhlY3V0ZWQgaW5zaWRlIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgbG9jYWxcbmZ1bmN0aW9uIHRoYXQgY2FuIGJlIHJldHVybmVkIG9yIHBhc3NlZCBhcm91bmQuICBGcmVlIHZhcmlhYmxlcyB1c2VkXG5pbiB0aGUgbmVzdGVkIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZnVuY3Rpb25cbmNvbnRhaW5pbmcgdGhlIGRlZi4gIFNlZSBzZWN0aW9uICpOYW1pbmcgYW5kIGJpbmRpbmcqIGZvciBkZXRhaWxzLlxuXG5TZWUgYWxzbzogKipQRVAgMzEwNyoqIC0gRnVuY3Rpb24gQW5ub3RhdGlvbnNcblxuICAgICBUaGUgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbiBmb3IgZnVuY3Rpb24gYW5ub3RhdGlvbnMuXG4nLAotICdnbG9iYWwnOiB1J1xuVGhlICJnbG9iYWwiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBnbG9iYWxfc3RtdCA6Oj0gImdsb2JhbCIgaWRlbnRpZmllciAoIiwiIGlkZW50aWZpZXIpKlxuXG5UaGUgImdsb2JhbCIgc3RhdGVtZW50IGlzIGEgZGVjbGFyYXRpb24gd2hpY2ggaG9sZHMgZm9yIHRoZSBlbnRpcmVcbmN1cnJlbnQgY29kZSBibG9jay4gIEl0IG1lYW5zIHRoYXQgdGhlIGxpc3RlZCBpZGVudGlmaWVycyBhcmUgdG8gYmVcbmludGVycHJldGVkIGFzIGdsb2JhbHMuICBJdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvIGFzc2lnbiB0byBhIGdsb2JhbFxudmFyaWFibGUgd2l0aG91dCAiZ2xvYmFsIiwgYWx0aG91Z2ggZnJlZSB2YXJpYWJsZXMgbWF5IHJlZmVyIHRvXG5nbG9iYWxzIHdpdGhvdXQgYmVpbmcgZGVjbGFyZWQgZ2xvYmFsLlxuXG5OYW1lcyBsaXN0ZWQgaW4gYSAiZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBub3QgYmUgdXNlZCBpbiB0aGUgc2FtZSBjb2RlXG5ibG9jayB0ZXh0dWFsbHkgcHJlY2VkaW5nIHRoYXQgImdsb2JhbCIgc3RhdGVtZW50LlxuXG5OYW1lcyBsaXN0ZWQgaW4gYSAiZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBub3QgYmUgZGVmaW5lZCBhcyBmb3JtYWxcbnBhcmFtZXRlcnMgb3IgaW4gYSAiZm9yIiBsb29wIGNvbnRyb2wgdGFyZ2V0LCAiY2xhc3MiIGRlZmluaXRpb24sXG5mdW5jdGlvbiBkZWZpbml0aW9uLCBvciAiaW1wb3J0IiBzdGF0ZW1lbnQuXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RcbmVuZm9yY2UgdGhlIHR3byByZXN0cmljdGlvbnMsIGJ1dCBwcm9ncmFtcyBzaG91bGQgbm90IGFidXNlIHRoaXNcbmZyZWVkb20sIGFzIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGVuZm9yY2UgdGhlbSBvciBzaWxlbnRseSBjaGFuZ2VcbnRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiB0aGUgImdsb2JhbCIgaXMgYSBkaXJlY3RpdmUgdG8gdGhlIHBhcnNlci4gIEl0XG5hcHBsaWVzIG9ubHkgdG8gY29kZSBwYXJzZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgImdsb2JhbCJcbnN0YXRlbWVudC4gSW4gcGFydGljdWxhciwgYSAiZ2xvYmFsIiBzdGF0ZW1lbnQgY29udGFpbmVkIGluIGEgc3RyaW5nXG5vciBjb2RlIG9iamVjdCBzdXBwbGllZCB0byB0aGUgYnVpbHQtaW4gImV4ZWMoKSIgZnVuY3Rpb24gZG9lcyBub3RcbmFmZmVjdCB0aGUgY29kZSBibG9jayAqY29udGFpbmluZyogdGhlIGZ1bmN0aW9uIGNhbGwsIGFuZCBjb2RlXG5jb250YWluZWQgaW4gc3VjaCBhIHN0cmluZyBpcyB1bmFmZmVjdGVkIGJ5ICJnbG9iYWwiIHN0YXRlbWVudHMgaW4gdGhlXG5jb2RlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGNhbGwuICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSAiZXZhbCgpIlxuYW5kICJjb21waWxlKCkiIGZ1bmN0aW9ucy5cbicsCi0gJ2lkLWNsYXNzZXMnOiB1J1xuUmVzZXJ2ZWQgY2xhc3NlcyBvZiBpZGVudGlmaWVyc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5DZXJ0YWluIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMgKGJlc2lkZXMga2V5d29yZHMpIGhhdmUgc3BlY2lhbFxubWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiBsZWFkaW5nIGFuZFxudHJhaWxpbmcgdW5kZXJzY29yZSBjaGFyYWN0ZXJzOlxuXG4iXyoiXG4gICBOb3QgaW1wb3J0ZWQgYnkgImZyb20gbW9kdWxlIGltcG9ydCAqIi4gIFRoZSBzcGVjaWFsIGlkZW50aWZpZXIgIl8iXG4gICBpcyB1c2VkIGluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIHRoZVxuICAgbGFzdCBldmFsdWF0aW9uOyBpdCBpcyBzdG9yZWQgaW4gdGhlICJidWlsdGlucyIgbW9kdWxlLiAgV2hlbiBub3RcbiAgIGluIGludGVyYWN0aXZlIG1vZGUsICJfIiBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nIGFuZCBpcyBub3QgZGVmaW5lZC5cbiAgIFNlZSBzZWN0aW9uICpUaGUgaW1wb3J0IHN0YXRlbWVudCouXG5cbiAgIE5vdGU6IFRoZSBuYW1lICJfIiBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGhcbiAgICAgaW50ZXJuYXRpb25hbGl6YXRpb247IHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGVcbiAgICAgImdldHRleHQiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbnZlbnRpb24uXG5cbiJfXypfXyJcbiAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLiBUaGVzZSBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgaW50ZXJwcmV0ZXJcbiAgIGFuZCBpdHMgaW1wbGVtZW50YXRpb24gKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuICBDdXJyZW50XG4gICBzeXN0ZW0gbmFtZXMgYXJlIGRpc2N1c3NlZCBpbiB0aGUgKlNwZWNpYWwgbWV0aG9kIG5hbWVzKiBzZWN0aW9uXG4gICBhbmQgZWxzZXdoZXJlLiAgTW9yZSB3aWxsIGxpa2VseSBiZSBkZWZpbmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZlxuICAgUHl0aG9uLiAgKkFueSogdXNlIG9mICJfXypfXyIgbmFtZXMsIGluIGFueSBjb250ZXh0LCB0aGF0IGRvZXMgbm90XG4gICBmb2xsb3cgZXhwbGljaXRseSBkb2N1bWVudGVkIHVzZSwgaXMgc3ViamVjdCB0byBicmVha2FnZSB3aXRob3V0XG4gICB3YXJuaW5nLlxuXG4iX18qIlxuICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCB3aXRoaW4gdGhlXG4gICBjb250ZXh0IG9mIGEgY2xhc3MgZGVmaW5pdGlvbiwgYXJlIHJlLXdyaXR0ZW4gdG8gdXNlIGEgbWFuZ2xlZCBmb3JtXG4gICB0byBoZWxwIGF2b2lkIG5hbWUgY2xhc2hlcyBiZXR3ZWVuICJwcml2YXRlIiBhdHRyaWJ1dGVzIG9mIGJhc2UgYW5kXG4gICBkZXJpdmVkIGNsYXNzZXMuIFNlZSBzZWN0aW9uICpJZGVudGlmaWVycyAoTmFtZXMpKi5cbicsCi0gJ2lkZW50aWZpZXJzJzogdSdcbklkZW50aWZpZXJzIGFuZCBrZXl3b3Jkc1xuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbklkZW50aWZpZXJzIChhbHNvIHJlZmVycmVkIHRvIGFzICpuYW1lcyopIGFyZSBkZXNjcmliZWQgYnkgdGhlXG5mb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9ucy5cblxuVGhlIHN5bnRheCBvZiBpZGVudGlmaWVycyBpbiBQeXRob24gaXMgYmFzZWQgb24gdGhlIFVuaWNvZGUgc3RhbmRhcmRcbmFubmV4IFVBWC0zMSwgd2l0aCBlbGFib3JhdGlvbiBhbmQgY2hhbmdlcyBhcyBkZWZpbmVkIGJlbG93OyBzZWUgYWxzb1xuKipQRVAgMzEzMSoqIGZvciBmdXJ0aGVyIGRldGFpbHMuXG5cbldpdGhpbiB0aGUgQVNDSUkgcmFuZ2UgKFUrMDAwMS4uVSswMDdGKSwgdGhlIHZhbGlkIGNoYXJhY3RlcnMgZm9yXG5pZGVudGlmaWVycyBhcmUgdGhlIHNhbWUgYXMgaW4gUHl0aG9uIDIueDogdGhlIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlXG5sZXR0ZXJzICJBIiB0aHJvdWdoICJaIiwgdGhlIHVuZGVyc2NvcmUgIl8iIGFuZCwgZXhjZXB0IGZvciB0aGUgZmlyc3RcbmNoYXJhY3RlciwgdGhlIGRpZ2l0cyAiMCIgdGhyb3VnaCAiOSIuXG5cblB5dGhvbiAzLjAgaW50cm9kdWNlcyBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgZnJvbSBvdXRzaWRlIHRoZSBBU0NJSVxucmFuZ2UgKHNlZSAqKlBFUCAzMTMxKiopLiAgRm9yIHRoZXNlIGNoYXJhY3RlcnMsIHRoZSBjbGFzc2lmaWNhdGlvblxudXNlcyB0aGUgdmVyc2lvbiBvZiB0aGUgVW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2UgYXMgaW5jbHVkZWQgaW4gdGhlXG4idW5pY29kZWRhdGEiIG1vZHVsZS5cblxuSWRlbnRpZmllcnMgYXJlIHVubGltaXRlZCBpbiBsZW5ndGguICBDYXNlIGlzIHNpZ25pZmljYW50LlxuXG4gICBpZGVudGlmaWVyICAgOjo9IHhpZF9zdGFydCB4aWRfY29udGludWUqXG4gICBpZF9zdGFydCAgICAgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBnZW5lcmFsIGNhdGVnb3JpZXMgTHUsIExsLCBMdCwgTG0sIExvLCBObCwgdGhlIHVuZGVyc2NvcmUsIGFuZCBjaGFyYWN0ZXJzIHdpdGggdGhlIE90aGVyX0lEX1N0YXJ0IHByb3BlcnR5PlxuICAgaWRfY29udGludWUgIDo6PSA8YWxsIGNoYXJhY3RlcnMgaW4gaWRfc3RhcnQsIHBsdXMgY2hhcmFjdGVycyBpbiB0aGUgY2F0ZWdvcmllcyBNbiwgTWMsIE5kLCBQYyBhbmQgb3RoZXJzIHdpdGggdGhlIE90aGVyX0lEX0NvbnRpbnVlIHByb3BlcnR5PlxuICAgeGlkX3N0YXJ0ICAgIDo6PSA8YWxsIGNoYXJhY3RlcnMgaW4gaWRfc3RhcnQgd2hvc2UgTkZLQyBub3JtYWxpemF0aW9uIGlzIGluICJpZF9zdGFydCB4aWRfY29udGludWUqIj5cbiAgIHhpZF9jb250aW51ZSA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX2NvbnRpbnVlIHdob3NlIE5GS0Mgbm9ybWFsaXphdGlvbiBpcyBpbiAiaWRfY29udGludWUqIj5cblxuVGhlIFVuaWNvZGUgY2F0ZWdvcnkgY29kZXMgbWVudGlvbmVkIGFib3ZlIHN0YW5kIGZvcjpcblxuKiAqTHUqIC0gdXBwZXJjYXNlIGxldHRlcnNcblxuKiAqTGwqIC0gbG93ZXJjYXNlIGxldHRlcnNcblxuKiAqTHQqIC0gdGl0bGVjYXNlIGxldHRlcnNcblxuKiAqTG0qIC0gbW9kaWZpZXIgbGV0dGVyc1xuXG4qICpMbyogLSBvdGhlciBsZXR0ZXJzXG5cbiogKk5sKiAtIGxldHRlciBudW1iZXJzXG5cbiogKk1uKiAtIG5vbnNwYWNpbmcgbWFya3NcblxuKiAqTWMqIC0gc3BhY2luZyBjb21iaW5pbmcgbWFya3NcblxuKiAqTmQqIC0gZGVjaW1hbCBudW1iZXJzXG5cbiogKlBjKiAtIGNvbm5lY3RvciBwdW5jdHVhdGlvbnNcblxuKiAqT3RoZXJfSURfU3RhcnQqIC0gZXhwbGljaXQgbGlzdCBvZiBjaGFyYWN0ZXJzIGluIFByb3BMaXN0LnR4dCB0b1xuICBzdXBwb3J0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cbiogKk90aGVyX0lEX0NvbnRpbnVlKiAtIGxpa2V3aXNlXG5cbkFsbCBpZGVudGlmaWVycyBhcmUgY29udmVydGVkIGludG8gdGhlIG5vcm1hbCBmb3JtIE5GS0Mgd2hpbGUgcGFyc2luZztcbmNvbXBhcmlzb24gb2YgaWRlbnRpZmllcnMgaXMgYmFzZWQgb24gTkZLQy5cblxuQSBub24tbm9ybWF0aXZlIEhUTUwgZmlsZSBsaXN0aW5nIGFsbCB2YWxpZCBpZGVudGlmaWVyIGNoYXJhY3RlcnMgZm9yXG5Vbmljb2RlIDQuMSBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cuZGNsLmhwaS51bmktXG5wb3RzZGFtLmRlL2hvbWUvbG9ld2lzL3RhYmxlLTMxMzEuaHRtbC5cblxuXG5LZXl3b3Jkc1xuPT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBpZGVudGlmaWVycyBhcmUgdXNlZCBhcyByZXNlcnZlZCB3b3Jkcywgb3IgKmtleXdvcmRzKiBvZlxudGhlIGxhbmd1YWdlLCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgb3JkaW5hcnkgaWRlbnRpZmllcnMuICBUaGV5IG11c3RcbmJlIHNwZWxsZWQgZXhhY3RseSBhcyB3cml0dGVuIGhlcmU6XG5cbiAgIEZhbHNlICAgICAgY2xhc3MgICAgICBmaW5hbGx5ICAgIGlzICAgICAgICAgcmV0dXJuXG4gICBOb25lICAgICAgIGNvbnRpbnVlICAgZm9yICAgICAgICBsYW1iZGEgICAgIHRyeVxuICAgVHJ1ZSAgICAgICBkZWYgICAgICAgIGZyb20gICAgICAgbm9ubG9jYWwgICB3aGlsZVxuICAgYW5kICAgICAgICBkZWwgICAgICAgIGdsb2JhbCAgICAgbm90ICAgICAgICB3aXRoXG4gICBhcyAgICAgICAgIGVsaWYgICAgICAgaWYgICAgICAgICBvciAgICAgICAgIHlpZWxkXG4gICBhc3NlcnQgICAgIGVsc2UgICAgICAgaW1wb3J0ICAgICBwYXNzXG4gICBicmVhayAgICAgIGV4Y2VwdCAgICAgaW4gICAgICAgICByYWlzZVxuXG5cblJlc2VydmVkIGNsYXNzZXMgb2YgaWRlbnRpZmllcnNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQ2VydGFpbiBjbGFzc2VzIG9mIGlkZW50aWZpZXJzIChiZXNpZGVzIGtleXdvcmRzKSBoYXZlIHNwZWNpYWxcbm1lYW5pbmdzLiAgVGhlc2UgY2xhc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgcGF0dGVybnMgb2YgbGVhZGluZyBhbmRcbnRyYWlsaW5nIHVuZGVyc2NvcmUgY2hhcmFjdGVyczpcblxuIl8qIlxuICAgTm90IGltcG9ydGVkIGJ5ICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIuICBUaGUgc3BlY2lhbCBpZGVudGlmaWVyICJfIlxuICAgaXMgdXNlZCBpbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGVcbiAgIGxhc3QgZXZhbHVhdGlvbjsgaXQgaXMgc3RvcmVkIGluIHRoZSAiYnVpbHRpbnMiIG1vZHVsZS4gIFdoZW4gbm90XG4gICBpbiBpbnRlcmFjdGl2ZSBtb2RlLCAiXyIgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgaXMgbm90IGRlZmluZWQuXG4gICBTZWUgc2VjdGlvbiAqVGhlIGltcG9ydCBzdGF0ZW1lbnQqLlxuXG4gICBOb3RlOiBUaGUgbmFtZSAiXyIgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoXG4gICAgIGludGVybmF0aW9uYWxpemF0aW9uOyByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlXG4gICAgICJnZXR0ZXh0IiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBjb252ZW50aW9uLlxuXG4iX18qX18iXG4gICBTeXN0ZW0tZGVmaW5lZCBuYW1lcy4gVGhlc2UgbmFtZXMgYXJlIGRlZmluZWQgYnkgdGhlIGludGVycHJldGVyXG4gICBhbmQgaXRzIGltcGxlbWVudGF0aW9uIChpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkpLiAgQ3VycmVudFxuICAgc3lzdGVtIG5hbWVzIGFyZSBkaXNjdXNzZWQgaW4gdGhlICpTcGVjaWFsIG1ldGhvZCBuYW1lcyogc2VjdGlvblxuICAgYW5kIGVsc2V3aGVyZS4gIE1vcmUgd2lsbCBsaWtlbHkgYmUgZGVmaW5lZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2ZcbiAgIFB5dGhvbi4gICpBbnkqIHVzZSBvZiAiX18qX18iIG5hbWVzLCBpbiBhbnkgY29udGV4dCwgdGhhdCBkb2VzIG5vdFxuICAgZm9sbG93IGV4cGxpY2l0bHkgZG9jdW1lbnRlZCB1c2UsIGlzIHN1YmplY3QgdG8gYnJlYWthZ2Ugd2l0aG91dFxuICAgd2FybmluZy5cblxuIl9fKiJcbiAgIENsYXNzLXByaXZhdGUgbmFtZXMuICBOYW1lcyBpbiB0aGlzIGNhdGVnb3J5LCB3aGVuIHVzZWQgd2l0aGluIHRoZVxuICAgY29udGV4dCBvZiBhIGNsYXNzIGRlZmluaXRpb24sIGFyZSByZS13cml0dGVuIHRvIHVzZSBhIG1hbmdsZWQgZm9ybVxuICAgdG8gaGVscCBhdm9pZCBuYW1lIGNsYXNoZXMgYmV0d2VlbiAicHJpdmF0ZSIgYXR0cmlidXRlcyBvZiBiYXNlIGFuZFxuICAgZGVyaXZlZCBjbGFzc2VzLiBTZWUgc2VjdGlvbiAqSWRlbnRpZmllcnMgKE5hbWVzKSouXG4nLAotICdpZic6IHUnXG5UaGUgImlmIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKlxuXG5UaGUgImlmIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSAiaWYiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLlxuSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nLAotICdpbWFnaW5hcnknOiB1J1xuSW1hZ2luYXJ5IGxpdGVyYWxzXG4qKioqKioqKioqKioqKioqKipcblxuSW1hZ2luYXJ5IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBpbWFnbnVtYmVyIDo6PSAoZmxvYXRudW1iZXIgfCBpbnRwYXJ0KSAoImoiIHwgIkoiKVxuXG5BbiBpbWFnaW5hcnkgbGl0ZXJhbCB5aWVsZHMgYSBjb21wbGV4IG51bWJlciB3aXRoIGEgcmVhbCBwYXJ0IG9mIDAuMC5cbkNvbXBsZXggbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgYXMgYSBwYWlyIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnNcbmFuZCBoYXZlIHRoZSBzYW1lIHJlc3RyaWN0aW9ucyBvbiB0aGVpciByYW5nZS4gIFRvIGNyZWF0ZSBhIGNvbXBsZXhcbm51bWJlciB3aXRoIGEgbm9uemVybyByZWFsIHBhcnQsIGFkZCBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB0byBpdCxcbmUuZy4sICIoMys0aikiLiAgU29tZSBleGFtcGxlcyBvZiBpbWFnaW5hcnkgbGl0ZXJhbHM6XG5cbiAgIDMuMTRqICAgMTAuaiAgICAxMGogICAgIC4wMDFqICAgMWUxMDBqICAzLjE0ZS0xMGpcbicsCi0gJ2ltcG9ydCc6IHUnXG5UaGUgImltcG9ydCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGltcG9ydF9zdG10ICAgICA6Oj0gImltcG9ydCIgbW9kdWxlIFsiYXMiIG5hbWVdICggIiwiIG1vZHVsZSBbImFzIiBuYW1lXSApKlxuICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgKCAiLCIgaWRlbnRpZmllciBbImFzIiBuYW1lXSApKlxuICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiAiKCIgaWRlbnRpZmllciBbImFzIiBuYW1lXVxuICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSogWyIsIl0gIikiXG4gICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgbW9kdWxlICJpbXBvcnQiICIqIlxuICAgbW9kdWxlICAgICAgICAgIDo6PSAoaWRlbnRpZmllciAiLiIpKiBpZGVudGlmaWVyXG4gICByZWxhdGl2ZV9tb2R1bGUgOjo9ICIuIiogbW9kdWxlIHwgIi4iK1xuICAgbmFtZSAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG5cblRoZSBiYXNpYyBpbXBvcnQgc3RhdGVtZW50IChubyAiZnJvbSIgY2xhdXNlKSBpcyBleGVjdXRlZCBpbiB0d29cbnN0ZXBzOlxuXG4xLiBmaW5kIGEgbW9kdWxlLCBsb2FkaW5nIGFuZCBpbml0aWFsaXppbmcgaXQgaWYgbmVjZXNzYXJ5XG5cbjIuIGRlZmluZSBhIG5hbWUgb3IgbmFtZXMgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIHNjb3BlXG4gICB3aGVyZSB0aGUgImltcG9ydCIgc3RhdGVtZW50IG9jY3Vycy5cblxuV2hlbiB0aGUgc3RhdGVtZW50IGNvbnRhaW5zIG11bHRpcGxlIGNsYXVzZXMgKHNlcGFyYXRlZCBieSBjb21tYXMpIHRoZVxudHdvIHN0ZXBzIGFyZSBjYXJyaWVkIG91dCBzZXBhcmF0ZWx5IGZvciBlYWNoIGNsYXVzZSwganVzdCBhcyB0aG91Z2hcbnRoZSBjbGF1c2VzIGhhZCBiZWVuIHNlcGFyYXRlZCBvdXQgaW50byBpbmRpdmlkdWFsIGltcG9ydCBzdGF0ZW1lbnRzLlxuXG5UaGUgZGV0YWlscyBvZiB0aGUgZmlyc3Qgc3RlcCwgZmluZGluZyBhbmQgbG9hZGluZyBtb2R1bGVzIGFyZVxuZGVzY3JpYmVkIGluIGdyZWF0ZXIgZGV0YWlsIGluIHRoZSBzZWN0aW9uIG9uIHRoZSAqaW1wb3J0IHN5c3RlbSosXG53aGljaCBhbHNvIGRlc2NyaWJlcyB0aGUgdmFyaW91cyB0eXBlcyBvZiBwYWNrYWdlcyBhbmQgbW9kdWxlcyB0aGF0XG5jYW4gYmUgaW1wb3J0ZWQsIGFzIHdlbGwgYXMgYWxsIHRoZSBob29rcyB0aGF0IGNhbiBiZSB1c2VkIHRvXG5jdXN0b21pemUgdGhlIGltcG9ydCBzeXN0ZW0uIE5vdGUgdGhhdCBmYWlsdXJlcyBpbiB0aGlzIHN0ZXAgbWF5XG5pbmRpY2F0ZSBlaXRoZXIgdGhhdCB0aGUgbW9kdWxlIGNvdWxkIG5vdCBiZSBsb2NhdGVkLCAqb3IqIHRoYXQgYW5cbmVycm9yIG9jY3VycmVkIHdoaWxlIGluaXRpYWxpemluZyB0aGUgbW9kdWxlLCB3aGljaCBpbmNsdWRlcyBleGVjdXRpb25cbm9mIHRoZSBtb2R1bGVcJ3MgY29kZS5cblxuSWYgdGhlIHJlcXVlc3RlZCBtb2R1bGUgaXMgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseSwgaXQgd2lsbCBiZSBtYWRlXG5hdmFpbGFibGUgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBpbiBvbmUgb2YgdGhyZWUgd2F5czpcblxuKiBJZiB0aGUgbW9kdWxlIG5hbWUgaXMgZm9sbG93ZWQgYnkgImFzIiwgdGhlbiB0aGUgbmFtZSBmb2xsb3dpbmdcbiAgImFzIiBpcyBib3VuZCBkaXJlY3RseSB0byB0aGUgaW1wb3J0ZWQgbW9kdWxlLlxuXG4qIElmIG5vIG90aGVyIG5hbWUgaXMgc3BlY2lmaWVkLCBhbmQgdGhlIG1vZHVsZSBiZWluZyBpbXBvcnRlZCBpcyBhXG4gIHRvcCBsZXZlbCBtb2R1bGUsIHRoZSBtb2R1bGVcJ3MgbmFtZSBpcyBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlXG4gIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBpbXBvcnRlZCBtb2R1bGVcblxuKiBJZiB0aGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkIGlzICpub3QqIGEgdG9wIGxldmVsIG1vZHVsZSwgdGhlbiB0aGVcbiAgbmFtZSBvZiB0aGUgdG9wIGxldmVsIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgbW9kdWxlIGlzIGJvdW5kIGluXG4gIHRoZSBsb2NhbCBuYW1lc3BhY2UgYXMgYSByZWZlcmVuY2UgdG8gdGhlIHRvcCBsZXZlbCBwYWNrYWdlLiBUaGVcbiAgaW1wb3J0ZWQgbW9kdWxlIG11c3QgYmUgYWNjZXNzZWQgdXNpbmcgaXRzIGZ1bGwgcXVhbGlmaWVkIG5hbWVcbiAgcmF0aGVyIHRoYW4gZGlyZWN0bHlcblxuVGhlICJmcm9tIiBmb3JtIHVzZXMgYSBzbGlnaHRseSBtb3JlIGNvbXBsZXggcHJvY2VzczpcblxuMS4gZmluZCB0aGUgbW9kdWxlIHNwZWNpZmllZCBpbiB0aGUgImZyb20iIGNsYXVzZSwgbG9hZGluZyBhbmRcbiAgIGluaXRpYWxpemluZyBpdCBpZiBuZWNlc3Nhcnk7XG5cbjIuIGZvciBlYWNoIG9mIHRoZSBpZGVudGlmaWVycyBzcGVjaWZpZWQgaW4gdGhlICJpbXBvcnQiIGNsYXVzZXM6XG5cbiAgIDEuIGNoZWNrIGlmIHRoZSBpbXBvcnRlZCBtb2R1bGUgaGFzIGFuIGF0dHJpYnV0ZSBieSB0aGF0IG5hbWVcblxuICAgMi4gaWYgbm90LCBhdHRlbXB0IHRvIGltcG9ydCBhIHN1Ym1vZHVsZSB3aXRoIHRoYXQgbmFtZSBhbmQgdGhlblxuICAgICAgY2hlY2sgdGhlIGltcG9ydGVkIG1vZHVsZSBhZ2FpbiBmb3IgdGhhdCBhdHRyaWJ1dGVcblxuICAgMy4gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQsICJJbXBvcnRFcnJvciIgaXMgcmFpc2VkLlxuXG4gICA0LiBvdGhlcndpc2UsIGEgcmVmZXJlbmNlIHRvIHRoYXQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBsb2NhbFxuICAgICAgbmFtZXNwYWNlLCB1c2luZyB0aGUgbmFtZSBpbiB0aGUgImFzIiBjbGF1c2UgaWYgaXQgaXMgcHJlc2VudCxcbiAgICAgIG90aGVyd2lzZSB1c2luZyB0aGUgYXR0cmlidXRlIG5hbWVcblxuRXhhbXBsZXM6XG5cbiAgIGltcG9ydCBmb28gICAgICAgICAgICAgICAgICMgZm9vIGltcG9ydGVkIGFuZCBib3VuZCBsb2NhbGx5XG4gICBpbXBvcnQgZm9vLmJhci5iYXogICAgICAgICAjIGZvby5iYXIuYmF6IGltcG9ydGVkLCBmb28gYm91bmQgbG9jYWxseVxuICAgaW1wb3J0IGZvby5iYXIuYmF6IGFzIGZiYiAgIyBmb28uYmFyLmJheiBpbXBvcnRlZCBhbmQgYm91bmQgYXMgZmJiXG4gICBmcm9tIGZvby5iYXIgaW1wb3J0IGJheiAgICAjIGZvby5iYXIuYmF6IGltcG9ydGVkIGFuZCBib3VuZCBhcyBiYXpcbiAgIGZyb20gZm9vIGltcG9ydCBhdHRyICAgICAgICMgZm9vIGltcG9ydGVkIGFuZCBmb28uYXR0ciBib3VuZCBhcyBhdHRyXG5cbklmIHRoZSBsaXN0IG9mIGlkZW50aWZpZXJzIGlzIHJlcGxhY2VkIGJ5IGEgc3RhciAoIlwnKlwnIiksIGFsbCBwdWJsaWNcbm5hbWVzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSBhcmUgYm91bmQgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlXG5zY29wZSB3aGVyZSB0aGUgImltcG9ydCIgc3RhdGVtZW50IG9jY3Vycy5cblxuVGhlICpwdWJsaWMgbmFtZXMqIGRlZmluZWQgYnkgYSBtb2R1bGUgYXJlIGRldGVybWluZWQgYnkgY2hlY2tpbmcgdGhlXG5tb2R1bGVcJ3MgbmFtZXNwYWNlIGZvciBhIHZhcmlhYmxlIG5hbWVkICJfX2FsbF9fIjsgaWYgZGVmaW5lZCwgaXQgbXVzdFxuYmUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBuYW1lcyBkZWZpbmVkIG9yIGltcG9ydGVkIGJ5IHRoYXRcbm1vZHVsZS4gIFRoZSBuYW1lcyBnaXZlbiBpbiAiX19hbGxfXyIgYXJlIGFsbCBjb25zaWRlcmVkIHB1YmxpYyBhbmRcbmFyZSByZXF1aXJlZCB0byBleGlzdC4gIElmICJfX2FsbF9fIiBpcyBub3QgZGVmaW5lZCwgdGhlIHNldCBvZiBwdWJsaWNcbm5hbWVzIGluY2x1ZGVzIGFsbCBuYW1lcyBmb3VuZCBpbiB0aGUgbW9kdWxlXCdzIG5hbWVzcGFjZSB3aGljaCBkbyBub3RcbmJlZ2luIHdpdGggYW4gdW5kZXJzY29yZSBjaGFyYWN0ZXIgKCJcJ19cJyIpLiAgIl9fYWxsX18iIHNob3VsZCBjb250YWluXG50aGUgZW50aXJlIHB1YmxpYyBBUEkuIEl0IGlzIGludGVuZGVkIHRvIGF2b2lkIGFjY2lkZW50YWxseSBleHBvcnRpbmdcbml0ZW1zIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBBUEkgKHN1Y2ggYXMgbGlicmFyeSBtb2R1bGVzIHdoaWNoIHdlcmVcbmltcG9ydGVkIGFuZCB1c2VkIHdpdGhpbiB0aGUgbW9kdWxlKS5cblxuVGhlIHdpbGQgY2FyZCBmb3JtIG9mIGltcG9ydCAtLS0gImZyb20gbW9kdWxlIGltcG9ydCAqIiAtLS0gaXMgb25seVxuYWxsb3dlZCBhdCB0aGUgbW9kdWxlIGxldmVsLiAgQXR0ZW1wdGluZyB0byB1c2UgaXQgaW4gY2xhc3Mgb3JcbmZ1bmN0aW9uIGRlZmluaXRpb25zIHdpbGwgcmFpc2UgYSAiU3ludGF4RXJyb3IiLlxuXG5XaGVuIHNwZWNpZnlpbmcgd2hhdCBtb2R1bGUgdG8gaW1wb3J0IHlvdSBkbyBub3QgaGF2ZSB0byBzcGVjaWZ5IHRoZVxuYWJzb2x1dGUgbmFtZSBvZiB0aGUgbW9kdWxlLiBXaGVuIGEgbW9kdWxlIG9yIHBhY2thZ2UgaXMgY29udGFpbmVkXG53aXRoaW4gYW5vdGhlciBwYWNrYWdlIGl0IGlzIHBvc3NpYmxlIHRvIG1ha2UgYSByZWxhdGl2ZSBpbXBvcnQgd2l0aGluXG50aGUgc2FtZSB0b3AgcGFja2FnZSB3aXRob3V0IGhhdmluZyB0byBtZW50aW9uIHRoZSBwYWNrYWdlIG5hbWUuIEJ5XG51c2luZyBsZWFkaW5nIGRvdHMgaW4gdGhlIHNwZWNpZmllZCBtb2R1bGUgb3IgcGFja2FnZSBhZnRlciAiZnJvbSIgeW91XG5jYW4gc3BlY2lmeSBob3cgaGlnaCB0byB0cmF2ZXJzZSB1cCB0aGUgY3VycmVudCBwYWNrYWdlIGhpZXJhcmNoeVxud2l0aG91dCBzcGVjaWZ5aW5nIGV4YWN0IG5hbWVzLiBPbmUgbGVhZGluZyBkb3QgbWVhbnMgdGhlIGN1cnJlbnRcbnBhY2thZ2Ugd2hlcmUgdGhlIG1vZHVsZSBtYWtpbmcgdGhlIGltcG9ydCBleGlzdHMuIFR3byBkb3RzIG1lYW5zIHVwXG5vbmUgcGFja2FnZSBsZXZlbC4gVGhyZWUgZG90cyBpcyB1cCB0d28gbGV2ZWxzLCBldGMuIFNvIGlmIHlvdSBleGVjdXRlXG4iZnJvbSAuIGltcG9ydCBtb2QiIGZyb20gYSBtb2R1bGUgaW4gdGhlICJwa2ciIHBhY2thZ2UgdGhlbiB5b3Ugd2lsbFxuZW5kIHVwIGltcG9ydGluZyAicGtnLm1vZCIuIElmIHlvdSBleGVjdXRlICJmcm9tIC4uc3VicGtnMiBpbXBvcnQgbW9kIlxuZnJvbSB3aXRoaW4gInBrZy5zdWJwa2cxIiB5b3Ugd2lsbCBpbXBvcnQgInBrZy5zdWJwa2cyLm1vZCIuIFRoZVxuc3BlY2lmaWNhdGlvbiBmb3IgcmVsYXRpdmUgaW1wb3J0cyBpcyBjb250YWluZWQgd2l0aGluICoqUEVQIDMyOCoqLlxuXG4iaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoKSIgaXMgcHJvdmlkZWQgdG8gc3VwcG9ydCBhcHBsaWNhdGlvbnMgdGhhdFxuZGV0ZXJtaW5lIGR5bmFtaWNhbGx5IHRoZSBtb2R1bGVzIHRvIGJlIGxvYWRlZC5cblxuXG5GdXR1cmUgc3RhdGVtZW50c1xuPT09PT09PT09PT09PT09PT1cblxuQSAqZnV0dXJlIHN0YXRlbWVudCogaXMgYSBkaXJlY3RpdmUgdG8gdGhlIGNvbXBpbGVyIHRoYXQgYSBwYXJ0aWN1bGFyXG5tb2R1bGUgc2hvdWxkIGJlIGNvbXBpbGVkIHVzaW5nIHN5bnRheCBvciBzZW1hbnRpY3MgdGhhdCB3aWxsIGJlXG5hdmFpbGFibGUgaW4gYSBzcGVjaWZpZWQgZnV0dXJlIHJlbGVhc2Ugb2YgUHl0aG9uIHdoZXJlIHRoZSBmZWF0dXJlXG5iZWNvbWVzIHN0YW5kYXJkLlxuXG5UaGUgZnV0dXJlIHN0YXRlbWVudCBpcyBpbnRlbmRlZCB0byBlYXNlIG1pZ3JhdGlvbiB0byBmdXR1cmUgdmVyc2lvbnNcbm9mIFB5dGhvbiB0aGF0IGludHJvZHVjZSBpbmNvbXBhdGlibGUgY2hhbmdlcyB0byB0aGUgbGFuZ3VhZ2UuICBJdFxuYWxsb3dzIHVzZSBvZiB0aGUgbmV3IGZlYXR1cmVzIG9uIGEgcGVyLW1vZHVsZSBiYXNpcyBiZWZvcmUgdGhlXG5yZWxlYXNlIGluIHdoaWNoIHRoZSBmZWF0dXJlIGJlY29tZXMgc3RhbmRhcmQuXG5cbiAgIGZ1dHVyZV9zdGF0ZW1lbnQgOjo9ICJmcm9tIiAiX19mdXR1cmVfXyIgImltcG9ydCIgZmVhdHVyZSBbImFzIiBuYW1lXVxuICAgICAgICAgICAgICAgICAgICAgICAgKCIsIiBmZWF0dXJlIFsiYXMiIG5hbWVdKSpcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgImZyb20iICJfX2Z1dHVyZV9fIiAiaW1wb3J0IiAiKCIgZmVhdHVyZSBbImFzIiBuYW1lXVxuICAgICAgICAgICAgICAgICAgICAgICAgKCIsIiBmZWF0dXJlIFsiYXMiIG5hbWVdKSogWyIsIl0gIikiXG4gICBmZWF0dXJlICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4gICBuYW1lICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG5cbkEgZnV0dXJlIHN0YXRlbWVudCBtdXN0IGFwcGVhciBuZWFyIHRoZSB0b3Agb2YgdGhlIG1vZHVsZS4gIFRoZSBvbmx5XG5saW5lcyB0aGF0IGNhbiBhcHBlYXIgYmVmb3JlIGEgZnV0dXJlIHN0YXRlbWVudCBhcmU6XG5cbiogdGhlIG1vZHVsZSBkb2NzdHJpbmcgKGlmIGFueSksXG5cbiogY29tbWVudHMsXG5cbiogYmxhbmsgbGluZXMsIGFuZFxuXG4qIG90aGVyIGZ1dHVyZSBzdGF0ZW1lbnRzLlxuXG5UaGUgZmVhdHVyZXMgcmVjb2duaXplZCBieSBQeXRob24gMy4wIGFyZSAiYWJzb2x1dGVfaW1wb3J0IixcbiJkaXZpc2lvbiIsICJnZW5lcmF0b3JzIiwgInVuaWNvZGVfbGl0ZXJhbHMiLCAicHJpbnRfZnVuY3Rpb24iLFxuIm5lc3RlZF9zY29wZXMiIGFuZCAid2l0aF9zdGF0ZW1lbnQiLiAgVGhleSBhcmUgYWxsIHJlZHVuZGFudCBiZWNhdXNlXG50aGV5IGFyZSBhbHdheXMgZW5hYmxlZCwgYW5kIG9ubHkga2VwdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5cbkEgZnV0dXJlIHN0YXRlbWVudCBpcyByZWNvZ25pemVkIGFuZCB0cmVhdGVkIHNwZWNpYWxseSBhdCBjb21waWxlXG50aW1lOiBDaGFuZ2VzIHRvIHRoZSBzZW1hbnRpY3Mgb2YgY29yZSBjb25zdHJ1Y3RzIGFyZSBvZnRlblxuaW1wbGVtZW50ZWQgYnkgZ2VuZXJhdGluZyBkaWZmZXJlbnQgY29kZS4gIEl0IG1heSBldmVuIGJlIHRoZSBjYXNlXG50aGF0IGEgbmV3IGZlYXR1cmUgaW50cm9kdWNlcyBuZXcgaW5jb21wYXRpYmxlIHN5bnRheCAoc3VjaCBhcyBhIG5ld1xucmVzZXJ2ZWQgd29yZCksIGluIHdoaWNoIGNhc2UgdGhlIGNvbXBpbGVyIG1heSBuZWVkIHRvIHBhcnNlIHRoZVxubW9kdWxlIGRpZmZlcmVudGx5LiAgU3VjaCBkZWNpc2lvbnMgY2Fubm90IGJlIHB1c2hlZCBvZmYgdW50aWxcbnJ1bnRpbWUuXG5cbkZvciBhbnkgZ2l2ZW4gcmVsZWFzZSwgdGhlIGNvbXBpbGVyIGtub3dzIHdoaWNoIGZlYXR1cmUgbmFtZXMgaGF2ZVxuYmVlbiBkZWZpbmVkLCBhbmQgcmFpc2VzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgZnV0dXJlIHN0YXRlbWVudFxuY29udGFpbnMgYSBmZWF0dXJlIG5vdCBrbm93biB0byBpdC5cblxuVGhlIGRpcmVjdCBydW50aW1lIHNlbWFudGljcyBhcmUgdGhlIHNhbWUgYXMgZm9yIGFueSBpbXBvcnQgc3RhdGVtZW50OlxudGhlcmUgaXMgYSBzdGFuZGFyZCBtb2R1bGUgIl9fZnV0dXJlX18iLCBkZXNjcmliZWQgbGF0ZXIsIGFuZCBpdCB3aWxsXG5iZSBpbXBvcnRlZCBpbiB0aGUgdXN1YWwgd2F5IGF0IHRoZSB0aW1lIHRoZSBmdXR1cmUgc3RhdGVtZW50IGlzXG5leGVjdXRlZC5cblxuVGhlIGludGVyZXN0aW5nIHJ1bnRpbWUgc2VtYW50aWNzIGRlcGVuZCBvbiB0aGUgc3BlY2lmaWMgZmVhdHVyZVxuZW5hYmxlZCBieSB0aGUgZnV0dXJlIHN0YXRlbWVudC5cblxuTm90ZSB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCBhYm91dCB0aGUgc3RhdGVtZW50OlxuXG4gICBpbXBvcnQgX19mdXR1cmVfXyBbYXMgbmFtZV1cblxuVGhhdCBpcyBub3QgYSBmdXR1cmUgc3RhdGVtZW50OyBpdFwncyBhbiBvcmRpbmFyeSBpbXBvcnQgc3RhdGVtZW50IHdpdGhcbm5vIHNwZWNpYWwgc2VtYW50aWNzIG9yIHN5bnRheCByZXN0cmljdGlvbnMuXG5cbkNvZGUgY29tcGlsZWQgYnkgY2FsbHMgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiZXhlYygpIiBhbmRcbiJjb21waWxlKCkiIHRoYXQgb2NjdXIgaW4gYSBtb2R1bGUgIk0iIGNvbnRhaW5pbmcgYSBmdXR1cmUgc3RhdGVtZW50XG53aWxsLCBieSBkZWZhdWx0LCB1c2UgdGhlIG5ldyBzeW50YXggb3Igc2VtYW50aWNzIGFzc29jaWF0ZWQgd2l0aCB0aGVcbmZ1dHVyZSBzdGF0ZW1lbnQuICBUaGlzIGNhbiBiZSBjb250cm9sbGVkIGJ5IG9wdGlvbmFsIGFyZ3VtZW50cyB0b1xuImNvbXBpbGUoKSIgLS0tIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGZ1bmN0aW9uIGZvciBkZXRhaWxzLlxuXG5BIGZ1dHVyZSBzdGF0ZW1lbnQgdHlwZWQgYXQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgcHJvbXB0IHdpbGxcbnRha2UgZWZmZWN0IGZvciB0aGUgcmVzdCBvZiB0aGUgaW50ZXJwcmV0ZXIgc2Vzc2lvbi4gIElmIGFuXG5pbnRlcnByZXRlciBpcyBzdGFydGVkIHdpdGggdGhlICotaSogb3B0aW9uLCBpcyBwYXNzZWQgYSBzY3JpcHQgbmFtZVxudG8gZXhlY3V0ZSwgYW5kIHRoZSBzY3JpcHQgaW5jbHVkZXMgYSBmdXR1cmUgc3RhdGVtZW50LCBpdCB3aWxsIGJlIGluXG5lZmZlY3QgaW4gdGhlIGludGVyYWN0aXZlIHNlc3Npb24gc3RhcnRlZCBhZnRlciB0aGUgc2NyaXB0IGlzXG5leGVjdXRlZC5cblxuU2VlIGFsc286ICoqUEVQIDIzNioqIC0gQmFjayB0byB0aGUgX19mdXR1cmVfX1xuXG4gICAgIFRoZSBvcmlnaW5hbCBwcm9wb3NhbCBmb3IgdGhlIF9fZnV0dXJlX18gbWVjaGFuaXNtLlxuJywKLSAnaW4nOiB1J1xuTWVtYmVyc2hpcCB0ZXN0IG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBvcGVyYXRvcnMgImluIiBhbmQgIm5vdCBpbiIgdGVzdCBmb3IgbWVtYmVyc2hpcC4gICJ4IGluIHMiXG5ldmFsdWF0ZXMgdG8gdHJ1ZSBpZiAqeCogaXMgYSBtZW1iZXIgb2YgKnMqLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgInhcbm5vdCBpbiBzIiByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiAieCBpbiBzIi4gIEFsbCBidWlsdC1pbiBzZXF1ZW5jZXNcbmFuZCBzZXQgdHlwZXMgc3VwcG9ydCB0aGlzIGFzIHdlbGwgYXMgZGljdGlvbmFyeSwgZm9yIHdoaWNoICJpbiIgdGVzdHNcbndoZXRoZXIgdGhlIGRpY3Rpb25hcnkgaGFzIGEgZ2l2ZW4ga2V5LiBGb3IgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXNcbmxpc3QsIHR1cGxlLCBzZXQsIGZyb3plbnNldCwgZGljdCwgb3IgY29sbGVjdGlvbnMuZGVxdWUsIHRoZVxuZXhwcmVzc2lvbiAieCBpbiB5IiBpcyBlcXVpdmFsZW50IHRvICJhbnkoeCBpcyBlIG9yIHggPT0gZSBmb3IgZSBpblxueSkiLlxuXG5Gb3IgdGhlIHN0cmluZyBhbmQgYnl0ZXMgdHlwZXMsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgKngqIGlzXG5hIHN1YnN0cmluZyBvZiAqeSouICBBbiBlcXVpdmFsZW50IHRlc3QgaXMgInkuZmluZCh4KSAhPSAtMSIuICBFbXB0eVxuc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyIHN0cmluZyxcbnNvICIiIiBpbiAiYWJjIiIgd2lsbCByZXR1cm4gIlRydWUiLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSAiX19jb250YWluc19fKCkiIG1ldGhvZCwgInhcbmluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgInkuX19jb250YWluc19fKHgpIiBpcyB0cnVlLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZG8gbm90IGRlZmluZSAiX19jb250YWluc19fKCkiIGJ1dCBkb1xuZGVmaW5lICJfX2l0ZXJfXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBzb21lIHZhbHVlICJ6IiB3aXRoICJ4ID09IHoiXG5pcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcgb3ZlciAieSIuICBJZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkXG5kdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24uXG5cbkxhc3RseSwgdGhlIG9sZC1zdHlsZSBpdGVyYXRpb24gcHJvdG9jb2wgaXMgdHJpZWQ6IGlmIGEgY2xhc3MgZGVmaW5lc1xuIl9fZ2V0aXRlbV9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uLVxubmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0ICJ4ID09IHlbaV0iLCBhbmQgYWxsIGxvd2VyXG5pbnRlZ2VyIGluZGljZXMgZG8gbm90IHJhaXNlICJJbmRleEVycm9yIiBleGNlcHRpb24uICAoSWYgYW55IG90aGVyXG5leGNlcHRpb24gaXMgcmFpc2VkLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbikuXG5cblRoZSBvcGVyYXRvciAibm90IGluIiBpcyBkZWZpbmVkIHRvIGhhdmUgdGhlIGludmVyc2UgdHJ1ZSB2YWx1ZSBvZlxuImluIi5cbicsCi0gJ2ludGVnZXJzJzogdSdcbkludGVnZXIgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKipcblxuSW50ZWdlciBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgaW50ZWdlciAgICAgICAgOjo9IGRlY2ltYWxpbnRlZ2VyIHwgb2N0aW50ZWdlciB8IGhleGludGVnZXIgfCBiaW5pbnRlZ2VyXG4gICBkZWNpbWFsaW50ZWdlciA6Oj0gbm9uemVyb2RpZ2l0IGRpZ2l0KiB8ICIwIitcbiAgIG5vbnplcm9kaWdpdCAgIDo6PSAiMSIuLi4iOSJcbiAgIGRpZ2l0ICAgICAgICAgIDo6PSAiMCIuLi4iOSJcbiAgIG9jdGludGVnZXIgICAgIDo6PSAiMCIgKCJvIiB8ICJPIikgb2N0ZGlnaXQrXG4gICBoZXhpbnRlZ2VyICAgICA6Oj0gIjAiICgieCIgfCAiWCIpIGhleGRpZ2l0K1xuICAgYmluaW50ZWdlciAgICAgOjo9ICIwIiAoImIiIHwgIkIiKSBiaW5kaWdpdCtcbiAgIG9jdGRpZ2l0ICAgICAgIDo6PSAiMCIuLi4iNyJcbiAgIGhleGRpZ2l0ICAgICAgIDo6PSBkaWdpdCB8ICJhIi4uLiJmIiB8ICJBIi4uLiJGIlxuICAgYmluZGlnaXQgICAgICAgOjo9ICIwIiB8ICIxIlxuXG5UaGVyZSBpcyBubyBsaW1pdCBmb3IgdGhlIGxlbmd0aCBvZiBpbnRlZ2VyIGxpdGVyYWxzIGFwYXJ0IGZyb20gd2hhdFxuY2FuIGJlIHN0b3JlZCBpbiBhdmFpbGFibGUgbWVtb3J5LlxuXG5Ob3RlIHRoYXQgbGVhZGluZyB6ZXJvcyBpbiBhIG5vbi16ZXJvIGRlY2ltYWwgbnVtYmVyIGFyZSBub3QgYWxsb3dlZC5cblRoaXMgaXMgZm9yIGRpc2FtYmlndWF0aW9uIHdpdGggQy1zdHlsZSBvY3RhbCBsaXRlcmFscywgd2hpY2ggUHl0aG9uXG51c2VkIGJlZm9yZSB2ZXJzaW9uIDMuMC5cblxuU29tZSBleGFtcGxlcyBvZiBpbnRlZ2VyIGxpdGVyYWxzOlxuXG4gICA3ICAgICAyMTQ3NDgzNjQ3ICAgICAgICAgICAgICAgICAgICAgICAgMG8xNzcgICAgMGIxMDAxMTAxMTFcbiAgIDMgICAgIDc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2ICAgICAwbzM3NyAgICAweGRlYWRiZWVmXG4nLAotICdsYW1iZGEnOiB1J1xuTGFtYmRhc1xuKioqKioqKlxuXG4gICBsYW1iZGFfZXhwciAgICAgICAgOjo9ICJsYW1iZGEiIFtwYXJhbWV0ZXJfbGlzdF06IGV4cHJlc3Npb25cbiAgIGxhbWJkYV9leHByX25vY29uZCA6Oj0gImxhbWJkYSIgW3BhcmFtZXRlcl9saXN0XTogZXhwcmVzc2lvbl9ub2NvbmRcblxuTGFtYmRhIGV4cHJlc3Npb25zIChzb21ldGltZXMgY2FsbGVkIGxhbWJkYSBmb3JtcykgYXJlIHVzZWQgdG8gY3JlYXRlXG5hbm9ueW1vdXMgZnVuY3Rpb25zLiBUaGUgZXhwcmVzc2lvbiAibGFtYmRhIGFyZ3VtZW50czogZXhwcmVzc2lvbiJcbnlpZWxkcyBhIGZ1bmN0aW9uIG9iamVjdC4gIFRoZSB1bm5hbWVkIG9iamVjdCBiZWhhdmVzIGxpa2UgYSBmdW5jdGlvblxub2JqZWN0IGRlZmluZWQgd2l0aFxuXG4gICBkZWYgPGxhbWJkYT4oYXJndW1lbnRzKTpcbiAgICAgICByZXR1cm4gZXhwcmVzc2lvblxuXG5TZWUgc2VjdGlvbiAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqIGZvciB0aGUgc3ludGF4IG9mIHBhcmFtZXRlciBsaXN0cy5cbk5vdGUgdGhhdCBmdW5jdGlvbnMgY3JlYXRlZCB3aXRoIGxhbWJkYSBleHByZXNzaW9ucyBjYW5ub3QgY29udGFpblxuc3RhdGVtZW50cyBvciBhbm5vdGF0aW9ucy5cbicsCi0gJ2xpc3RzJzogdSdcbkxpc3QgZGlzcGxheXNcbioqKioqKioqKioqKipcblxuQSBsaXN0IGRpc3BsYXkgaXMgYSBwb3NzaWJseSBlbXB0eSBzZXJpZXMgb2YgZXhwcmVzc2lvbnMgZW5jbG9zZWQgaW5cbnNxdWFyZSBicmFja2V0czpcblxuICAgbGlzdF9kaXNwbGF5IDo6PSAiWyIgW3N0YXJyZWRfbGlzdCB8IGNvbXByZWhlbnNpb25dICJdIlxuXG5BIGxpc3QgZGlzcGxheSB5aWVsZHMgYSBuZXcgbGlzdCBvYmplY3QsIHRoZSBjb250ZW50cyBiZWluZyBzcGVjaWZpZWRcbmJ5IGVpdGhlciBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMgb3IgYSBjb21wcmVoZW5zaW9uLiAgV2hlbiBhIGNvbW1hLVxuc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgaXMgc3VwcGxpZWQsIGl0cyBlbGVtZW50cyBhcmUgZXZhbHVhdGVkXG5mcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHBsYWNlZCBpbnRvIHRoZSBsaXN0IG9iamVjdCBpbiB0aGF0IG9yZGVyLlxuV2hlbiBhIGNvbXByZWhlbnNpb24gaXMgc3VwcGxpZWQsIHRoZSBsaXN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlXG5lbGVtZW50cyByZXN1bHRpbmcgZnJvbSB0aGUgY29tcHJlaGVuc2lvbi5cbicsCi0gJ25hbWluZyc6IHUnXG5OYW1pbmcgYW5kIGJpbmRpbmdcbioqKioqKioqKioqKioqKioqKlxuXG5cbkJpbmRpbmcgb2YgbmFtZXNcbj09PT09PT09PT09PT09PT1cblxuKk5hbWVzKiByZWZlciB0byBvYmplY3RzLiAgTmFtZXMgYXJlIGludHJvZHVjZWQgYnkgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLlxuXG5UaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczogZm9ybWFsIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLFxuImltcG9ydCIgc3RhdGVtZW50cywgY2xhc3MgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zICh0aGVzZSBiaW5kIHRoZVxuY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZSBpbiB0aGUgZGVmaW5pbmcgYmxvY2spLCBhbmQgdGFyZ2V0cyB0aGF0IGFyZVxuaWRlbnRpZmllcnMgaWYgb2NjdXJyaW5nIGluIGFuIGFzc2lnbm1lbnQsICJmb3IiIGxvb3AgaGVhZGVyLCBvciBhZnRlclxuImFzIiBpbiBhICJ3aXRoIiBzdGF0ZW1lbnQgb3IgImV4Y2VwdCIgY2xhdXNlLiBUaGUgImltcG9ydCIgc3RhdGVtZW50XG5vZiB0aGUgZm9ybSAiZnJvbSAuLi4gaW1wb3J0ICoiIGJpbmRzIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZVxuaW1wb3J0ZWQgbW9kdWxlLCBleGNlcHQgdGhvc2UgYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZS4gIFRoaXMgZm9ybVxubWF5IG9ubHkgYmUgdXNlZCBhdCB0aGUgbW9kdWxlIGxldmVsLlxuXG5BIHRhcmdldCBvY2N1cnJpbmcgaW4gYSAiZGVsIiBzdGF0ZW1lbnQgaXMgYWxzbyBjb25zaWRlcmVkIGJvdW5kIGZvclxudGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgbmFtZSkuXG5cbkVhY2ggYXNzaWdubWVudCBvciBpbXBvcnQgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jayBkZWZpbmVkIGJ5IGFcbmNsYXNzIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24gb3IgYXQgdGhlIG1vZHVsZSBsZXZlbCAodGhlIHRvcC1sZXZlbFxuY29kZSBibG9jaykuXG5cbklmIGEgbmFtZSBpcyBib3VuZCBpbiBhIGJsb2NrLCBpdCBpcyBhIGxvY2FsIHZhcmlhYmxlIG9mIHRoYXQgYmxvY2ssXG51bmxlc3MgZGVjbGFyZWQgYXMgIm5vbmxvY2FsIiBvciAiZ2xvYmFsIi4gIElmIGEgbmFtZSBpcyBib3VuZCBhdCB0aGVcbm1vZHVsZSBsZXZlbCwgaXQgaXMgYSBnbG9iYWwgdmFyaWFibGUuICAoVGhlIHZhcmlhYmxlcyBvZiB0aGUgbW9kdWxlXG5jb2RlIGJsb2NrIGFyZSBsb2NhbCBhbmQgZ2xvYmFsLikgIElmIGEgdmFyaWFibGUgaXMgdXNlZCBpbiBhIGNvZGVcbmJsb2NrIGJ1dCBub3QgZGVmaW5lZCB0aGVyZSwgaXQgaXMgYSAqZnJlZSB2YXJpYWJsZSouXG5cbkVhY2ggb2NjdXJyZW5jZSBvZiBhIG5hbWUgaW4gdGhlIHByb2dyYW0gdGV4dCByZWZlcnMgdG8gdGhlICpiaW5kaW5nKlxub2YgdGhhdCBuYW1lIGVzdGFibGlzaGVkIGJ5IHRoZSBmb2xsb3dpbmcgbmFtZSByZXNvbHV0aW9uIHJ1bGVzLlxuXG5cblJlc29sdXRpb24gb2YgbmFtZXNcbj09PT09PT09PT09PT09PT09PT1cblxuQSAqc2NvcGUqIGRlZmluZXMgdGhlIHZpc2liaWxpdHkgb2YgYSBuYW1lIHdpdGhpbiBhIGJsb2NrLiAgSWYgYSBsb2NhbFxudmFyaWFibGUgaXMgZGVmaW5lZCBpbiBhIGJsb2NrLCBpdHMgc2NvcGUgaW5jbHVkZXMgdGhhdCBibG9jay4gIElmIHRoZVxuZGVmaW5pdGlvbiBvY2N1cnMgaW4gYSBmdW5jdGlvbiBibG9jaywgdGhlIHNjb3BlIGV4dGVuZHMgdG8gYW55IGJsb2Nrc1xuY29udGFpbmVkIHdpdGhpbiB0aGUgZGVmaW5pbmcgb25lLCB1bmxlc3MgYSBjb250YWluZWQgYmxvY2sgaW50cm9kdWNlc1xuYSBkaWZmZXJlbnQgYmluZGluZyBmb3IgdGhlIG5hbWUuXG5cbldoZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgbmVhcmVzdFxuZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgYmxvY2tcbmlzIGNhbGxlZCB0aGUgYmxvY2tcJ3MgKmVudmlyb25tZW50Ki5cblxuV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSAiTmFtZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLiBJZlxudGhlIGN1cnJlbnQgc2NvcGUgaXMgYSBmdW5jdGlvbiBzY29wZSwgYW5kIHRoZSBuYW1lIHJlZmVycyB0byBhIGxvY2FsXG52YXJpYWJsZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYm91bmQgdG8gYSB2YWx1ZSBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlXG5uYW1lIGlzIHVzZWQsIGFuICJVbmJvdW5kTG9jYWxFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbiJVbmJvdW5kTG9jYWxFcnJvciIgaXMgYSBzdWJjbGFzcyBvZiAiTmFtZUVycm9yIi5cblxuSWYgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uIG9jY3VycyBhbnl3aGVyZSB3aXRoaW4gYSBjb2RlIGJsb2NrLCBhbGxcbnVzZXMgb2YgdGhlIG5hbWUgd2l0aGluIHRoZSBibG9jayBhcmUgdHJlYXRlZCBhcyByZWZlcmVuY2VzIHRvIHRoZVxuY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgd2l0aGluIGFcbmJsb2NrIGJlZm9yZSBpdCBpcyBib3VuZC4gIFRoaXMgcnVsZSBpcyBzdWJ0bGUuICBQeXRob24gbGFja3NcbmRlY2xhcmF0aW9ucyBhbmQgYWxsb3dzIG5hbWUgYmluZGluZyBvcGVyYXRpb25zIHRvIG9jY3VyIGFueXdoZXJlXG53aXRoaW4gYSBjb2RlIGJsb2NrLiAgVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGNvZGUgYmxvY2sgY2FuIGJlXG5kZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgYmxvY2sgZm9yIG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy5cblxuSWYgdGhlICJnbG9iYWwiIHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2ssIGFsbCB1c2VzIG9mIHRoZSBuYW1lXG5zcGVjaWZpZWQgaW4gdGhlIHN0YXRlbWVudCByZWZlciB0byB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgaW4gdGhlXG50b3AtbGV2ZWwgbmFtZXNwYWNlLiAgTmFtZXMgYXJlIHJlc29sdmVkIGluIHRoZSB0b3AtbGV2ZWwgbmFtZXNwYWNlIGJ5XG5zZWFyY2hpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGkuZS4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlXG5jb250YWluaW5nIHRoZSBjb2RlIGJsb2NrLCBhbmQgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSwgdGhlIG5hbWVzcGFjZVxub2YgdGhlIG1vZHVsZSAiYnVpbHRpbnMiLiAgVGhlIGdsb2JhbCBuYW1lc3BhY2UgaXMgc2VhcmNoZWQgZmlyc3QuICBJZlxudGhlIG5hbWUgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIGlzIHNlYXJjaGVkLiAgVGhlXG4iZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBuYW1lLlxuXG5UaGUgImdsb2JhbCIgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZyBvcGVyYXRpb25cbmluIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhIGZyZWUgdmFyaWFibGVcbmNvbnRhaW5zIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlIGZyZWUgdmFyaWFibGUgaXMgdHJlYXRlZCBhcyBhIGdsb2JhbC5cblxuVGhlICJub25sb2NhbCIgc3RhdGVtZW50IGNhdXNlcyBjb3JyZXNwb25kaW5nIG5hbWVzIHRvIHJlZmVyIHRvXG5wcmV2aW91c2x5IGJvdW5kIHZhcmlhYmxlcyBpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgZnVuY3Rpb24gc2NvcGUuXG4iU3ludGF4RXJyb3IiIGlzIHJhaXNlZCBhdCBjb21waWxlIHRpbWUgaWYgdGhlIGdpdmVuIG5hbWUgZG9lcyBub3RcbmV4aXN0IGluIGFueSBlbmNsb3NpbmcgZnVuY3Rpb24gc2NvcGUuXG5cblRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhXG5tb2R1bGUgaXMgaW1wb3J0ZWQuICBUaGUgbWFpbiBtb2R1bGUgZm9yIGEgc2NyaXB0IGlzIGFsd2F5cyBjYWxsZWRcbiJfX21haW5fXyIuXG5cbkNsYXNzIGRlZmluaXRpb24gYmxvY2tzIGFuZCBhcmd1bWVudHMgdG8gImV4ZWMoKSIgYW5kICJldmFsKCkiIGFyZVxuc3BlY2lhbCBpbiB0aGUgY29udGV4dCBvZiBuYW1lIHJlc29sdXRpb24uIEEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhblxuZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmUgbmFtZXMuIFRoZXNlIHJlZmVyZW5jZXNcbmZvbGxvdyB0aGUgbm9ybWFsIHJ1bGVzIGZvciBuYW1lIHJlc29sdXRpb24gd2l0aCBhbiBleGNlcHRpb24gdGhhdFxudW5ib3VuZCBsb2NhbCB2YXJpYWJsZXMgYXJlIGxvb2tlZCB1cCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gVGhlXG5uYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkgb2ZcbnRoZSBjbGFzcy4gVGhlIHNjb3BlIG9mIG5hbWVzIGRlZmluZWQgaW4gYSBjbGFzcyBibG9jayBpcyBsaW1pdGVkIHRvXG50aGUgY2xhc3MgYmxvY2s7IGl0IGRvZXMgbm90IGV4dGVuZCB0byB0aGUgY29kZSBibG9ja3Mgb2YgbWV0aG9kcyAtLVxudGhpcyBpbmNsdWRlcyBjb21wcmVoZW5zaW9ucyBhbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlIHRoZXkgYXJlXG5pbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmdcbndpbGwgZmFpbDpcblxuICAgY2xhc3MgQTpcbiAgICAgICBhID0gNDJcbiAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpXG5cblxuQnVpbHRpbnMgYW5kIHJlc3RyaWN0ZWQgZXhlY3V0aW9uXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4ZWN1dGlvbiBvZiBhIGNvZGUgYmxvY2tcbmlzIGFjdHVhbGx5IGZvdW5kIGJ5IGxvb2tpbmcgdXAgdGhlIG5hbWUgIl9fYnVpbHRpbnNfXyIgaW4gaXRzIGdsb2JhbFxubmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZSBsYXR0ZXIgY2FzZVxudGhlIG1vZHVsZVwncyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGUgIl9fbWFpbl9fIlxubW9kdWxlLCAiX19idWlsdGluc19fIiBpcyB0aGUgYnVpbHQtaW4gbW9kdWxlICJidWlsdGlucyI7IHdoZW4gaW4gYW55XG5vdGhlciBtb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiB0aGVcbiJidWlsdGlucyIgbW9kdWxlIGl0c2VsZi4gICJfX2J1aWx0aW5zX18iIGNhbiBiZSBzZXQgdG8gYSB1c2VyLWNyZWF0ZWRcbmRpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQgZXhlY3V0aW9uLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFVzZXJzIHNob3VsZCBub3QgdG91Y2hcbiJfX2J1aWx0aW5zX18iOyBpdCBpcyBzdHJpY3RseSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICBVc2Vyc1xud2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBzaG91bGQgImltcG9ydCJcbnRoZSAiYnVpbHRpbnMiIG1vZHVsZSBhbmQgbW9kaWZ5IGl0cyBhdHRyaWJ1dGVzIGFwcHJvcHJpYXRlbHkuXG5cblxuSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuTmFtZSByZXNvbHV0aW9uIG9mIGZyZWUgdmFyaWFibGVzIG9jY3VycyBhdCBydW50aW1lLCBub3QgYXQgY29tcGlsZVxudGltZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHByaW50IDQyOlxuXG4gICBpID0gMTBcbiAgIGRlZiBmKCk6XG4gICAgICAgcHJpbnQoaSlcbiAgIGkgPSA0MlxuICAgZigpXG5cblRoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSBpbGxlZ2FsIHdoZW4gdXNlZFxuaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlIHZhcmlhYmxlcy5cblxuSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgaWxsZWdhbCB0b1xuZGVsZXRlIHRoZSBuYW1lLiAgQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuXG5cblRoZSAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgZnVuY3Rpb25zIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgZnVsbFxuZW52aXJvbm1lbnQgZm9yIHJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgbG9jYWxcbmFuZCBnbG9iYWwgbmFtZXNwYWNlcyBvZiB0aGUgY2FsbGVyLiAgRnJlZSB2YXJpYWJsZXMgYXJlIG5vdCByZXNvbHZlZFxuaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSwgYnV0IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgWzFdXG5UaGUgImV4ZWMoKSIgYW5kICJldmFsKCkiIGZ1bmN0aW9ucyBoYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0b1xub3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLiAgSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzXG5zcGVjaWZpZWQsIGl0IGlzIHVzZWQgZm9yIGJvdGguXG4nLAotICdub25sb2NhbCc6IHUnXG5UaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBub25sb2NhbF9zdG10IDo6PSAibm9ubG9jYWwiIGlkZW50aWZpZXIgKCIsIiBpZGVudGlmaWVyKSpcblxuVGhlICJub25sb2NhbCIgc3RhdGVtZW50IGNhdXNlcyB0aGUgbGlzdGVkIGlkZW50aWZpZXJzIHRvIHJlZmVyIHRvXG5wcmV2aW91c2x5IGJvdW5kIHZhcmlhYmxlcyBpbiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZXhjbHVkaW5nXG5nbG9iYWxzLiBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBiaW5kaW5nIGlzXG50byBzZWFyY2ggdGhlIGxvY2FsIG5hbWVzcGFjZSBmaXJzdC4gIFRoZSBzdGF0ZW1lbnQgYWxsb3dzXG5lbmNhcHN1bGF0ZWQgY29kZSB0byByZWJpbmQgdmFyaWFibGVzIG91dHNpZGUgb2YgdGhlIGxvY2FsIHNjb3BlXG5iZXNpZGVzIHRoZSBnbG9iYWwgKG1vZHVsZSkgc2NvcGUuXG5cbk5hbWVzIGxpc3RlZCBpbiBhICJub25sb2NhbCIgc3RhdGVtZW50LCB1bmxpa2UgdGhvc2UgbGlzdGVkIGluIGFcbiJnbG9iYWwiIHN0YXRlbWVudCwgbXVzdCByZWZlciB0byBwcmUtZXhpc3RpbmcgYmluZGluZ3MgaW4gYW5cbmVuY2xvc2luZyBzY29wZSAodGhlIHNjb3BlIGluIHdoaWNoIGEgbmV3IGJpbmRpbmcgc2hvdWxkIGJlIGNyZWF0ZWRcbmNhbm5vdCBiZSBkZXRlcm1pbmVkIHVuYW1iaWd1b3VzbHkpLlxuXG5OYW1lcyBsaXN0ZWQgaW4gYSAibm9ubG9jYWwiIHN0YXRlbWVudCBtdXN0IG5vdCBjb2xsaWRlIHdpdGggcHJlLVxuZXhpc3RpbmcgYmluZGluZ3MgaW4gdGhlIGxvY2FsIHNjb3BlLlxuXG5TZWUgYWxzbzogKipQRVAgMzEwNCoqIC0gQWNjZXNzIHRvIE5hbWVzIGluIE91dGVyIFNjb3Blc1xuXG4gICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQuXG4nLAotICdudW1iZXJzJzogdSdcbk51bWVyaWMgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKipcblxuVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIG51bWVyaWMgbGl0ZXJhbHM6IGludGVnZXJzLCBmbG9hdGluZyBwb2ludFxubnVtYmVycywgYW5kIGltYWdpbmFyeSBudW1iZXJzLiAgVGhlcmUgYXJlIG5vIGNvbXBsZXggbGl0ZXJhbHNcbihjb21wbGV4IG51bWJlcnMgY2FuIGJlIGZvcm1lZCBieSBhZGRpbmcgYSByZWFsIG51bWJlciBhbmQgYW5cbmltYWdpbmFyeSBudW1iZXIpLlxuXG5Ob3RlIHRoYXQgbnVtZXJpYyBsaXRlcmFscyBkbyBub3QgaW5jbHVkZSBhIHNpZ247IGEgcGhyYXNlIGxpa2UgIi0xIlxuaXMgYWN0dWFsbHkgYW4gZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0aGUgdW5hcnkgb3BlcmF0b3IgXCciLSJcJyBhbmQgdGhlXG5saXRlcmFsICIxIi5cbicsCi0gJ251bWVyaWMtdHlwZXMnOiB1J1xuRW11bGF0aW5nIG51bWVyaWMgdHlwZXNcbioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBlbXVsYXRlIG51bWVyaWMgb2JqZWN0cy5cbk1ldGhvZHMgY29ycmVzcG9uZGluZyB0byBvcGVyYXRpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlXG5wYXJ0aWN1bGFyIGtpbmQgb2YgbnVtYmVyIGltcGxlbWVudGVkIChlLmcuLCBiaXR3aXNlIG9wZXJhdGlvbnMgZm9yXG5ub24taW50ZWdyYWwgbnVtYmVycykgc2hvdWxkIGJlIGxlZnQgdW5kZWZpbmVkLlxuXG5vYmplY3QuX19hZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3N1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tYXRtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9fbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9feG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgImRpdm1vZCgpIixcbiAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpLiAgRm9yIGluc3RhbmNlLCB0b1xuICAgZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gInggKyB5Iiwgd2hlcmUgKngqIGlzIGFuIGluc3RhbmNlIG9mIGFcbiAgIGNsYXNzIHRoYXQgaGFzIGFuICJfX2FkZF9fKCkiIG1ldGhvZCwgInguX19hZGRfXyh5KSIgaXMgY2FsbGVkLlxuICAgVGhlICJfX2Rpdm1vZF9fKCkiIG1ldGhvZCBzaG91bGQgYmUgdGhlIGVxdWl2YWxlbnQgdG8gdXNpbmdcbiAgICJfX2Zsb29yZGl2X18oKSIgYW5kICJfX21vZF9fKCkiOyBpdCBzaG91bGQgbm90IGJlIHJlbGF0ZWQgdG9cbiAgICJfX3RydWVkaXZfXygpIi4gIE5vdGUgdGhhdCAiX19wb3dfXygpIiBzaG91bGQgYmUgZGVmaW5lZCB0byBhY2NlcHRcbiAgIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlIGJ1aWx0LWluXG4gICAicG93KCkiIGZ1bmN0aW9uIGlzIHRvIGJlIHN1cHBvcnRlZC5cblxuICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlXG4gICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gIk5vdEltcGxlbWVudGVkIi5cblxub2JqZWN0Ll9fcmFkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnN1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm1hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnRydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnBvd19fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAiZGl2bW9kKCkiLFxuICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8Iikgd2l0aCByZWZsZWN0ZWQgKHN3YXBwZWQpXG4gICBvcGVyYW5kcy4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIGxlZnQgb3BlcmFuZCBkb2VzXG4gICBub3Qgc3VwcG9ydCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gYW5kIHRoZSBvcGVyYW5kcyBhcmUgb2ZcbiAgIGRpZmZlcmVudCB0eXBlcy4gWzJdIEZvciBpbnN0YW5jZSwgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gInggLVxuICAgeSIsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuICJfX3JzdWJfXygpIlxuICAgbWV0aG9kLCAieS5fX3JzdWJfXyh4KSIgaXMgY2FsbGVkIGlmICJ4Ll9fc3ViX18oeSkiIHJldHVybnNcbiAgICpOb3RJbXBsZW1lbnRlZCouXG5cbiAgIE5vdGUgdGhhdCB0ZXJuYXJ5ICJwb3coKSIgd2lsbCBub3QgdHJ5IGNhbGxpbmcgIl9fcnBvd19fKCkiICh0aGVcbiAgIGNvZXJjaW9uIHJ1bGVzIHdvdWxkIGJlY29tZSB0b28gY29tcGxpY2F0ZWQpLlxuXG4gICBOb3RlOiBJZiB0aGUgcmlnaHQgb3BlcmFuZFwncyB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGxlZnRcbiAgICAgb3BlcmFuZFwncyB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIHRoZSByZWZsZWN0ZWQgbWV0aG9kXG4gICAgIGZvciB0aGUgb3BlcmF0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGxlZnRcbiAgICAgb3BlcmFuZFwncyBub24tcmVmbGVjdGVkIG1ldGhvZC4gIFRoaXMgYmVoYXZpb3IgYWxsb3dzIHN1YmNsYXNzZXNcbiAgICAgdG8gb3ZlcnJpZGUgdGhlaXIgYW5jZXN0b3JzXCcgb3BlcmF0aW9ucy5cblxub2JqZWN0Ll9faWFkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXN1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW1hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXRydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXBvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbm9iamVjdC5fX2lsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgYXJpdGhtZXRpY1xuICAgYXNzaWdubWVudHMgKCIrPSIsICItPSIsICIqPSIsICJAPSIsICIvPSIsICIvLz0iLCAiJT0iLCAiKio9IixcbiAgICI8PD0iLCAiPj49IiwgIiY9IiwgIl49IiwgInw9IikuICBUaGVzZSBtZXRob2RzIHNob3VsZCBhdHRlbXB0IHRvXG4gICBkbyB0aGUgb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgKnNlbGYqKSBhbmQgcmV0dXJuIHRoZSByZXN1bHRcbiAgICh3aGljaCBjb3VsZCBiZSwgYnV0IGRvZXMgbm90IGhhdmUgdG8gYmUsICpzZWxmKikuICBJZiBhIHNwZWNpZmljXG4gICBtZXRob2QgaXMgbm90IGRlZmluZWQsIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBmYWxscyBiYWNrIHRvIHRoZVxuICAgbm9ybWFsIG1ldGhvZHMuICBGb3IgaW5zdGFuY2UsIGlmICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzXG4gICB3aXRoIGFuICJfX2lhZGRfXygpIiBtZXRob2QsICJ4ICs9IHkiIGlzIGVxdWl2YWxlbnQgdG8gInggPVxuICAgeC5fX2lhZGRfXyh5KSIgLiBPdGhlcndpc2UsICJ4Ll9fYWRkX18oeSkiIGFuZCAieS5fX3JhZGRfXyh4KSIgYXJlXG4gICBjb25zaWRlcmVkLCBhcyB3aXRoIHRoZSBldmFsdWF0aW9uIG9mICJ4ICsgeSIuIEluIGNlcnRhaW5cbiAgIHNpdHVhdGlvbnMsIGF1Z21lbnRlZCBhc3NpZ25tZW50IGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCBlcnJvcnNcbiAgIChzZWUgKldoeSBkb2VzIGFfdHVwbGVbaV0gKz0gW1wnaXRlbVwnXSByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB0aGVcbiAgIGFkZGl0aW9uIHdvcmtzPyopLCBidXQgdGhpcyBiZWhhdmlvciBpcyBpbiBmYWN0IHBhcnQgb2YgdGhlIGRhdGFcbiAgIG1vZGVsLlxuXG5vYmplY3QuX19uZWdfXyhzZWxmKVxub2JqZWN0Ll9fcG9zX18oc2VsZilcbm9iamVjdC5fX2Fic19fKHNlbGYpXG5vYmplY3QuX19pbnZlcnRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgKCItIiwgIisiLFxuICAgImFicygpIiBhbmQgIn4iKS5cblxub2JqZWN0Ll9fY29tcGxleF9fKHNlbGYpXG5vYmplY3QuX19pbnRfXyhzZWxmKVxub2JqZWN0Ll9fZmxvYXRfXyhzZWxmKVxub2JqZWN0Ll9fcm91bmRfXyhzZWxmWywgbl0pXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiY29tcGxleCgpIiwgImludCgpIixcbiAgICJmbG9hdCgpIiBhbmQgInJvdW5kKCkiLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mIHRoZSBhcHByb3ByaWF0ZVxuICAgdHlwZS5cblxub2JqZWN0Ll9faW5kZXhfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5pbmRleCgpIiwgYW5kIHdoZW5ldmVyIFB5dGhvbiBuZWVkc1xuICAgdG8gbG9zc2xlc3NseSBjb252ZXJ0IHRoZSBudW1lcmljIG9iamVjdCB0byBhbiBpbnRlZ2VyIG9iamVjdCAoc3VjaFxuICAgYXMgaW4gc2xpY2luZywgb3IgaW4gdGhlIGJ1aWx0LWluICJiaW4oKSIsICJoZXgoKSIgYW5kICJvY3QoKSJcbiAgIGZ1bmN0aW9ucykuIFByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGluZGljYXRlcyB0aGF0IHRoZSBudW1lcmljXG4gICBvYmplY3QgaXMgYW4gaW50ZWdlciB0eXBlLiAgTXVzdCByZXR1cm4gYW4gaW50ZWdlci5cblxuICAgTm90ZTogSW4gb3JkZXIgdG8gaGF2ZSBhIGNvaGVyZW50IGludGVnZXIgdHlwZSBjbGFzcywgd2hlblxuICAgICAiX19pbmRleF9fKCkiIGlzIGRlZmluZWQgIl9faW50X18oKSIgc2hvdWxkIGFsc28gYmUgZGVmaW5lZCwgYW5kXG4gICAgIGJvdGggc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZS5cbicsCi0gJ29iamVjdHMnOiB1J1xuT2JqZWN0cywgdmFsdWVzIGFuZCB0eXBlc1xuKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4qT2JqZWN0cyogYXJlIFB5dGhvblwncyBhYnN0cmFjdGlvbiBmb3IgZGF0YS4gIEFsbCBkYXRhIGluIGEgUHl0aG9uXG5wcm9ncmFtIGlzIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMgb3IgYnkgcmVsYXRpb25zIGJldHdlZW4gb2JqZWN0cy4gKEluXG5hIHNlbnNlLCBhbmQgaW4gY29uZm9ybWFuY2UgdG8gVm9uIE5ldW1hbm5cJ3MgbW9kZWwgb2YgYSAic3RvcmVkXG5wcm9ncmFtIGNvbXB1dGVyLCIgY29kZSBpcyBhbHNvIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMuKVxuXG5FdmVyeSBvYmplY3QgaGFzIGFuIGlkZW50aXR5LCBhIHR5cGUgYW5kIGEgdmFsdWUuICBBbiBvYmplY3RcJ3NcbippZGVudGl0eSogbmV2ZXIgY2hhbmdlcyBvbmNlIGl0IGhhcyBiZWVuIGNyZWF0ZWQ7IHlvdSBtYXkgdGhpbmsgb2YgaXRcbmFzIHRoZSBvYmplY3RcJ3MgYWRkcmVzcyBpbiBtZW1vcnkuICBUaGUgXCciaXMiXCcgb3BlcmF0b3IgY29tcGFyZXMgdGhlXG5pZGVudGl0eSBvZiB0d28gb2JqZWN0czsgdGhlICJpZCgpIiBmdW5jdGlvbiByZXR1cm5zIGFuIGludGVnZXJcbnJlcHJlc2VudGluZyBpdHMgaWRlbnRpdHkuXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogRm9yIENQeXRob24sICJpZCh4KSIgaXMgdGhlIG1lbW9yeVxuYWRkcmVzcyB3aGVyZSAieCIgaXMgc3RvcmVkLlxuXG5BbiBvYmplY3RcJ3MgdHlwZSBkZXRlcm1pbmVzIHRoZSBvcGVyYXRpb25zIHRoYXQgdGhlIG9iamVjdCBzdXBwb3J0c1xuKGUuZy4sICJkb2VzIGl0IGhhdmUgYSBsZW5ndGg/IikgYW5kIGFsc28gZGVmaW5lcyB0aGUgcG9zc2libGUgdmFsdWVzXG5mb3Igb2JqZWN0cyBvZiB0aGF0IHR5cGUuICBUaGUgInR5cGUoKSIgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3RcJ3NcbnR5cGUgKHdoaWNoIGlzIGFuIG9iamVjdCBpdHNlbGYpLiAgTGlrZSBpdHMgaWRlbnRpdHksIGFuIG9iamVjdFwnc1xuKnR5cGUqIGlzIGFsc28gdW5jaGFuZ2VhYmxlLiBbMV1cblxuVGhlICp2YWx1ZSogb2Ygc29tZSBvYmplY3RzIGNhbiBjaGFuZ2UuICBPYmplY3RzIHdob3NlIHZhbHVlIGNhblxuY2hhbmdlIGFyZSBzYWlkIHRvIGJlICptdXRhYmxlKjsgb2JqZWN0cyB3aG9zZSB2YWx1ZSBpcyB1bmNoYW5nZWFibGVcbm9uY2UgdGhleSBhcmUgY3JlYXRlZCBhcmUgY2FsbGVkICppbW11dGFibGUqLiAoVGhlIHZhbHVlIG9mIGFuXG5pbW11dGFibGUgY29udGFpbmVyIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgbXV0YWJsZVxub2JqZWN0IGNhbiBjaGFuZ2Ugd2hlbiB0aGUgbGF0dGVyXCdzIHZhbHVlIGlzIGNoYW5nZWQ7IGhvd2V2ZXIgdGhlXG5jb250YWluZXIgaXMgc3RpbGwgY29uc2lkZXJlZCBpbW11dGFibGUsIGJlY2F1c2UgdGhlIGNvbGxlY3Rpb24gb2Zcbm9iamVjdHMgaXQgY29udGFpbnMgY2Fubm90IGJlIGNoYW5nZWQuICBTbywgaW1tdXRhYmlsaXR5IGlzIG5vdFxuc3RyaWN0bHkgdGhlIHNhbWUgYXMgaGF2aW5nIGFuIHVuY2hhbmdlYWJsZSB2YWx1ZSwgaXQgaXMgbW9yZSBzdWJ0bGUuKVxuQW4gb2JqZWN0XCdzIG11dGFiaWxpdHkgaXMgZGV0ZXJtaW5lZCBieSBpdHMgdHlwZTsgZm9yIGluc3RhbmNlLFxubnVtYmVycywgc3RyaW5ncyBhbmQgdHVwbGVzIGFyZSBpbW11dGFibGUsIHdoaWxlIGRpY3Rpb25hcmllcyBhbmRcbmxpc3RzIGFyZSBtdXRhYmxlLlxuXG5PYmplY3RzIGFyZSBuZXZlciBleHBsaWNpdGx5IGRlc3Ryb3llZDsgaG93ZXZlciwgd2hlbiB0aGV5IGJlY29tZVxudW5yZWFjaGFibGUgdGhleSBtYXkgYmUgZ2FyYmFnZS1jb2xsZWN0ZWQuICBBbiBpbXBsZW1lbnRhdGlvbiBpc1xuYWxsb3dlZCB0byBwb3N0cG9uZSBnYXJiYWdlIGNvbGxlY3Rpb24gb3Igb21pdCBpdCBhbHRvZ2V0aGVyIC0tLSBpdCBpc1xuYSBtYXR0ZXIgb2YgaW1wbGVtZW50YXRpb24gcXVhbGl0eSBob3cgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzXG5pbXBsZW1lbnRlZCwgYXMgbG9uZyBhcyBubyBvYmplY3RzIGFyZSBjb2xsZWN0ZWQgdGhhdCBhcmUgc3RpbGxcbnJlYWNoYWJsZS5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBDUHl0aG9uIGN1cnJlbnRseSB1c2VzIGEgcmVmZXJlbmNlLVxuY291bnRpbmcgc2NoZW1lIHdpdGggKG9wdGlvbmFsKSBkZWxheWVkIGRldGVjdGlvbiBvZiBjeWNsaWNhbGx5IGxpbmtlZFxuZ2FyYmFnZSwgd2hpY2ggY29sbGVjdHMgbW9zdCBvYmplY3RzIGFzIHNvb24gYXMgdGhleSBiZWNvbWVcbnVucmVhY2hhYmxlLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gY29sbGVjdCBnYXJiYWdlIGNvbnRhaW5pbmdcbmNpcmN1bGFyIHJlZmVyZW5jZXMuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlICJnYyIgbW9kdWxlIGZvclxuaW5mb3JtYXRpb24gb24gY29udHJvbGxpbmcgdGhlIGNvbGxlY3Rpb24gb2YgY3ljbGljIGdhcmJhZ2UuIE90aGVyXG5pbXBsZW1lbnRhdGlvbnMgYWN0IGRpZmZlcmVudGx5IGFuZCBDUHl0aG9uIG1heSBjaGFuZ2UuIERvIG5vdCBkZXBlbmRcbm9uIGltbWVkaWF0ZSBmaW5hbGl6YXRpb24gb2Ygb2JqZWN0cyB3aGVuIHRoZXkgYmVjb21lIHVucmVhY2hhYmxlIChzb1xueW91IHNob3VsZCBhbHdheXMgY2xvc2UgZmlsZXMgZXhwbGljaXRseSkuXG5cbk5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoZSBpbXBsZW1lbnRhdGlvblwncyB0cmFjaW5nIG9yIGRlYnVnZ2luZ1xuZmFjaWxpdGllcyBtYXkga2VlcCBvYmplY3RzIGFsaXZlIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgY29sbGVjdGFibGUuXG5BbHNvIG5vdGUgdGhhdCBjYXRjaGluZyBhbiBleGNlcHRpb24gd2l0aCBhIFwnInRyeSIuLi4iZXhjZXB0IlwnXG5zdGF0ZW1lbnQgbWF5IGtlZXAgb2JqZWN0cyBhbGl2ZS5cblxuU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byAiZXh0ZXJuYWwiIHJlc291cmNlcyBzdWNoIGFzIG9wZW5cbmZpbGVzIG9yIHdpbmRvd3MuICBJdCBpcyB1bmRlcnN0b29kIHRoYXQgdGhlc2UgcmVzb3VyY2VzIGFyZSBmcmVlZFxud2hlbiB0aGUgb2JqZWN0IGlzIGdhcmJhZ2UtY29sbGVjdGVkLCBidXQgc2luY2UgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzXG5ub3QgZ3VhcmFudGVlZCB0byBoYXBwZW4sIHN1Y2ggb2JqZWN0cyBhbHNvIHByb3ZpZGUgYW4gZXhwbGljaXQgd2F5IHRvXG5yZWxlYXNlIHRoZSBleHRlcm5hbCByZXNvdXJjZSwgdXN1YWxseSBhICJjbG9zZSgpIiBtZXRob2QuIFByb2dyYW1zXG5hcmUgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gZXhwbGljaXRseSBjbG9zZSBzdWNoIG9iamVjdHMuICBUaGVcblwnInRyeSIuLi4iZmluYWxseSJcJyBzdGF0ZW1lbnQgYW5kIHRoZSBcJyJ3aXRoIlwnIHN0YXRlbWVudCBwcm92aWRlXG5jb252ZW5pZW50IHdheXMgdG8gZG8gdGhpcy5cblxuU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzOyB0aGVzZSBhcmUgY2FsbGVkXG4qY29udGFpbmVycyouIEV4YW1wbGVzIG9mIGNvbnRhaW5lcnMgYXJlIHR1cGxlcywgbGlzdHMgYW5kXG5kaWN0aW9uYXJpZXMuICBUaGUgcmVmZXJlbmNlcyBhcmUgcGFydCBvZiBhIGNvbnRhaW5lclwncyB2YWx1ZS4gIEluXG5tb3N0IGNhc2VzLCB3aGVuIHdlIHRhbGsgYWJvdXQgdGhlIHZhbHVlIG9mIGEgY29udGFpbmVyLCB3ZSBpbXBseSB0aGVcbnZhbHVlcywgbm90IHRoZSBpZGVudGl0aWVzIG9mIHRoZSBjb250YWluZWQgb2JqZWN0czsgaG93ZXZlciwgd2hlbiB3ZVxudGFsayBhYm91dCB0aGUgbXV0YWJpbGl0eSBvZiBhIGNvbnRhaW5lciwgb25seSB0aGUgaWRlbnRpdGllcyBvZiB0aGVcbmltbWVkaWF0ZWx5IGNvbnRhaW5lZCBvYmplY3RzIGFyZSBpbXBsaWVkLiAgU28sIGlmIGFuIGltbXV0YWJsZVxuY29udGFpbmVyIChsaWtlIGEgdHVwbGUpIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgbXV0YWJsZSBvYmplY3QsIGl0c1xudmFsdWUgY2hhbmdlcyBpZiB0aGF0IG11dGFibGUgb2JqZWN0IGlzIGNoYW5nZWQuXG5cblR5cGVzIGFmZmVjdCBhbG1vc3QgYWxsIGFzcGVjdHMgb2Ygb2JqZWN0IGJlaGF2aW9yLiAgRXZlbiB0aGVcbmltcG9ydGFuY2Ugb2Ygb2JqZWN0IGlkZW50aXR5IGlzIGFmZmVjdGVkIGluIHNvbWUgc2Vuc2U6IGZvciBpbW11dGFibGVcbnR5cGVzLCBvcGVyYXRpb25zIHRoYXQgY29tcHV0ZSBuZXcgdmFsdWVzIG1heSBhY3R1YWxseSByZXR1cm4gYVxucmVmZXJlbmNlIHRvIGFueSBleGlzdGluZyBvYmplY3Qgd2l0aCB0aGUgc2FtZSB0eXBlIGFuZCB2YWx1ZSwgd2hpbGVcbmZvciBtdXRhYmxlIG9iamVjdHMgdGhpcyBpcyBub3QgYWxsb3dlZC4gIEUuZy4sIGFmdGVyICJhID0gMTsgYiA9IDEiLFxuImEiIGFuZCAiYiIgbWF5IG9yIG1heSBub3QgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHdpdGggdGhlIHZhbHVlXG5vbmUsIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24sIGJ1dCBhZnRlciAiYyA9IFtdOyBkID0gW10iLCAiYyJcbmFuZCAiZCIgYXJlIGd1YXJhbnRlZWQgdG8gcmVmZXIgdG8gdHdvIGRpZmZlcmVudCwgdW5pcXVlLCBuZXdseVxuY3JlYXRlZCBlbXB0eSBsaXN0cy4gKE5vdGUgdGhhdCAiYyA9IGQgPSBbXSIgYXNzaWducyB0aGUgc2FtZSBvYmplY3RcbnRvIGJvdGggImMiIGFuZCAiZCIuKVxuJywKLSAnb3BlcmF0b3Itc3VtbWFyeSc6IHUnXG5PcGVyYXRvciBwcmVjZWRlbmNlXG4qKioqKioqKioqKioqKioqKioqXG5cblRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgb3BlcmF0b3IgcHJlY2VkZW5jZSBpbiBQeXRob24sIGZyb21cbmxvd2VzdCBwcmVjZWRlbmNlIChsZWFzdCBiaW5kaW5nKSB0byBoaWdoZXN0IHByZWNlZGVuY2UgKG1vc3RcbmJpbmRpbmcpLiAgT3BlcmF0b3JzIGluIHRoZSBzYW1lIGJveCBoYXZlIHRoZSBzYW1lIHByZWNlZGVuY2UuICBVbmxlc3NcbnRoZSBzeW50YXggaXMgZXhwbGljaXRseSBnaXZlbiwgb3BlcmF0b3JzIGFyZSBiaW5hcnkuICBPcGVyYXRvcnMgaW5cbnRoZSBzYW1lIGJveCBncm91cCBsZWZ0IHRvIHJpZ2h0IChleGNlcHQgZm9yIGV4cG9uZW50aWF0aW9uLCB3aGljaFxuZ3JvdXBzIGZyb20gcmlnaHQgdG8gbGVmdCkuXG5cbk5vdGUgdGhhdCBjb21wYXJpc29ucywgbWVtYmVyc2hpcCB0ZXN0cywgYW5kIGlkZW50aXR5IHRlc3RzLCBhbGwgaGF2ZVxudGhlIHNhbWUgcHJlY2VkZW5jZSBhbmQgaGF2ZSBhIGxlZnQtdG8tcmlnaHQgY2hhaW5pbmcgZmVhdHVyZSBhc1xuZGVzY3JpYmVkIGluIHRoZSAqQ29tcGFyaXNvbnMqIHNlY3Rpb24uXG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgT3BlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbnwgImxhbWJkYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMYW1iZGEgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImlmIiAtLSAiZWxzZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDb25kaXRpb25hbCBleHByZXNzaW9uICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgIm9yIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImFuZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgIm5vdCIgIngiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIE5PVCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImluIiwgIm5vdCBpbiIsICJpcyIsICJpcyBub3QiLCAiPCIsICI8PSIsICI+IiwgfCBDb21wYXJpc29ucywgaW5jbHVkaW5nIG1lbWJlcnNoaXAgICAgIHxcbnwgIj49IiwgIiE9IiwgIj09IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0ZXN0cyBhbmQgaWRlbnRpdHkgdGVzdHMgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgIl4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIFhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgIiYiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgIjw8IiwgIj4+IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTaGlmdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgIisiLCAiLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiICAgICAgICAgICAgICAgICAgICAgICAgfCBNdWx0aXBsaWNhdGlvbiwgbWF0cml4IG11bHRpcGxpY2F0aW9uIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkaXZpc2lvbiwgcmVtYWluZGVyIFs1XSAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgIit4IiwgIi14IiwgIn54IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQb3NpdGl2ZSwgbmVnYXRpdmUsIGJpdHdpc2UgTk9UICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgIioqIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeHBvbmVudGlhdGlvbiBbNl0gICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImF3YWl0IiAieCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBd2FpdCBleHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInhbaW5kZXhdIiwgInhbaW5kZXg6aW5kZXhdIiwgICAgICAgICAgICAgICAgICAgfCBTdWJzY3JpcHRpb24sIHNsaWNpbmcsIGNhbGwsICAgICAgICAgIHxcbnwgIngoYXJndW1lbnRzLi4uKSIsICJ4LmF0dHJpYnV0ZSIgICAgICAgICAgICAgICAgfCBhdHRyaWJ1dGUgcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgIihleHByZXNzaW9ucy4uLikiLCAiW2V4cHJlc3Npb25zLi4uXSIsICJ7a2V5OiAgfCBCaW5kaW5nIG9yIHR1cGxlIGRpc3BsYXksIGxpc3QgICAgICAgIHxcbnwgdmFsdWUuLi59IiwgIntleHByZXNzaW9ucy4uLn0iICAgICAgICAgICAgICAgICAgfCBkaXNwbGF5LCBkaWN0aW9uYXJ5IGRpc3BsYXksIHNldCAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkaXNwbGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBXaGlsZSAiYWJzKHgleSkgPCBhYnMoeSkiIGlzIHRydWUgbWF0aGVtYXRpY2FsbHksIGZvciBmbG9hdHNcbiAgICBpdCBtYXkgbm90IGJlIHRydWUgbnVtZXJpY2FsbHkgZHVlIHRvIHJvdW5kb2ZmLiAgRm9yIGV4YW1wbGUsIGFuZFxuICAgIGFzc3VtaW5nIGEgcGxhdGZvcm0gb24gd2hpY2ggYSBQeXRob24gZmxvYXQgaXMgYW4gSUVFRSA3NTQgZG91YmxlLVxuICAgIHByZWNpc2lvbiBudW1iZXIsIGluIG9yZGVyIHRoYXQgIi0xZS0xMDAgJSAxZTEwMCIgaGF2ZSB0aGUgc2FtZVxuICAgIHNpZ24gYXMgIjFlMTAwIiwgdGhlIGNvbXB1dGVkIHJlc3VsdCBpcyAiLTFlLTEwMCArIDFlMTAwIiwgd2hpY2hcbiAgICBpcyBudW1lcmljYWxseSBleGFjdGx5IGVxdWFsIHRvICIxZTEwMCIuICBUaGUgZnVuY3Rpb25cbiAgICAibWF0aC5mbW9kKCkiIHJldHVybnMgYSByZXN1bHQgd2hvc2Ugc2lnbiBtYXRjaGVzIHRoZSBzaWduIG9mIHRoZVxuICAgIGZpcnN0IGFyZ3VtZW50IGluc3RlYWQsIGFuZCBzbyByZXR1cm5zICItMWUtMTAwIiBpbiB0aGlzIGNhc2UuXG4gICAgV2hpY2ggYXBwcm9hY2ggaXMgbW9yZSBhcHByb3ByaWF0ZSBkZXBlbmRzIG9uIHRoZSBhcHBsaWNhdGlvbi5cblxuWzJdIElmIHggaXMgdmVyeSBjbG9zZSB0byBhbiBleGFjdCBpbnRlZ2VyIG11bHRpcGxlIG9mIHksIGl0XCdzXG4gICAgcG9zc2libGUgZm9yICJ4Ly95IiB0byBiZSBvbmUgbGFyZ2VyIHRoYW4gIih4LXgleSkvL3kiIGR1ZSB0b1xuICAgIHJvdW5kaW5nLiAgSW4gc3VjaCBjYXNlcywgUHl0aG9uIHJldHVybnMgdGhlIGxhdHRlciByZXN1bHQsIGluXG4gICAgb3JkZXIgdG8gcHJlc2VydmUgdGhhdCAiZGl2bW9kKHgseSlbMF0gKiB5ICsgeCAlIHkiIGJlIHZlcnkgY2xvc2VcbiAgICB0byAieCIuXG5cblszXSBUaGUgVW5pY29kZSBzdGFuZGFyZCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gKmNvZGUgcG9pbnRzKiAoZS5nLlxuICAgIFUrMDA0MSkgYW5kICphYnN0cmFjdCBjaGFyYWN0ZXJzKiAoZS5nLiAiTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSIpLlxuICAgIFdoaWxlIG1vc3QgYWJzdHJhY3QgY2hhcmFjdGVycyBpbiBVbmljb2RlIGFyZSBvbmx5IHJlcHJlc2VudGVkXG4gICAgdXNpbmcgb25lIGNvZGUgcG9pbnQsIHRoZXJlIGlzIGEgbnVtYmVyIG9mIGFic3RyYWN0IGNoYXJhY3RlcnNcbiAgICB0aGF0IGNhbiBpbiBhZGRpdGlvbiBiZSByZXByZXNlbnRlZCB1c2luZyBhIHNlcXVlbmNlIG9mIG1vcmUgdGhhblxuICAgIG9uZSBjb2RlIHBvaW50LiAgRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdCBjaGFyYWN0ZXIgIkxBVElOXG4gICAgQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEiIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIHNpbmdsZVxuICAgICpwcmVjb21wb3NlZCBjaGFyYWN0ZXIqIGF0IGNvZGUgcG9zaXRpb24gVSswMEM3LCBvciBhcyBhIHNlcXVlbmNlXG4gICAgb2YgYSAqYmFzZSBjaGFyYWN0ZXIqIGF0IGNvZGUgcG9zaXRpb24gVSswMDQzIChMQVRJTiBDQVBJVEFMXG4gICAgTEVUVEVSIEMpLCBmb2xsb3dlZCBieSBhICpjb21iaW5pbmcgY2hhcmFjdGVyKiBhdCBjb2RlIHBvc2l0aW9uXG4gICAgVSswMzI3IChDT01CSU5JTkcgQ0VESUxMQSkuXG5cbiAgICBUaGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgb24gc3RyaW5ncyBjb21wYXJlIGF0IHRoZSBsZXZlbCBvZlxuICAgIFVuaWNvZGUgY29kZSBwb2ludHMuIFRoaXMgbWF5IGJlIGNvdW50ZXItaW50dWl0aXZlIHRvIGh1bWFucy4gIEZvclxuICAgIGV4YW1wbGUsICIiXFx1MDBDNyIgPT0gIlxcdTAwNDNcXHUwMzI3IiIgaXMgIkZhbHNlIiwgZXZlbiB0aG91Z2ggYm90aFxuICAgIHN0cmluZ3MgcmVwcmVzZW50IHRoZSBzYW1lIGFic3RyYWN0IGNoYXJhY3RlciAiTEFUSU4gQ0FQSVRBTFxuICAgIExFVFRFUiBDIFdJVEggQ0VESUxMQSIuXG5cbiAgICBUbyBjb21wYXJlIHN0cmluZ3MgYXQgdGhlIGxldmVsIG9mIGFic3RyYWN0IGNoYXJhY3RlcnMgKHRoYXQgaXMsXG4gICAgaW4gYSB3YXkgaW50dWl0aXZlIHRvIGh1bWFucyksIHVzZSAidW5pY29kZWRhdGEubm9ybWFsaXplKCkiLlxuXG5bNF0gRHVlIHRvIGF1dG9tYXRpYyBnYXJiYWdlLWNvbGxlY3Rpb24sIGZyZWUgbGlzdHMsIGFuZCB0aGVcbiAgICBkeW5hbWljIG5hdHVyZSBvZiBkZXNjcmlwdG9ycywgeW91IG1heSBub3RpY2Ugc2VlbWluZ2x5IHVudXN1YWxcbiAgICBiZWhhdmlvdXIgaW4gY2VydGFpbiB1c2VzIG9mIHRoZSAiaXMiIG9wZXJhdG9yLCBsaWtlIHRob3NlXG4gICAgaW52b2x2aW5nIGNvbXBhcmlzb25zIGJldHdlZW4gaW5zdGFuY2UgbWV0aG9kcywgb3IgY29uc3RhbnRzLlxuICAgIENoZWNrIHRoZWlyIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mby5cblxuWzVdIFRoZSAiJSIgb3BlcmF0b3IgaXMgYWxzbyB1c2VkIGZvciBzdHJpbmcgZm9ybWF0dGluZzsgdGhlIHNhbWVcbiAgICBwcmVjZWRlbmNlIGFwcGxpZXMuXG5cbls2XSBUaGUgcG93ZXIgb3BlcmF0b3IgIioqIiBiaW5kcyBsZXNzIHRpZ2h0bHkgdGhhbiBhbiBhcml0aG1ldGljXG4gICAgb3IgYml0d2lzZSB1bmFyeSBvcGVyYXRvciBvbiBpdHMgcmlnaHQsIHRoYXQgaXMsICIyKiotMSIgaXMgIjAuNSIuXG4nLAotICdwYXNzJzogdSdcblRoZSAicGFzcyIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKlxuXG4gICBwYXNzX3N0bXQgOjo9ICJwYXNzIlxuXG4icGFzcyIgaXMgYSBudWxsIG9wZXJhdGlvbiAtLS0gd2hlbiBpdCBpcyBleGVjdXRlZCwgbm90aGluZyBoYXBwZW5zLlxuSXQgaXMgdXNlZnVsIGFzIGEgcGxhY2Vob2xkZXIgd2hlbiBhIHN0YXRlbWVudCBpcyByZXF1aXJlZFxuc3ludGFjdGljYWxseSwgYnV0IG5vIGNvZGUgbmVlZHMgdG8gYmUgZXhlY3V0ZWQsIGZvciBleGFtcGxlOlxuXG4gICBkZWYgZihhcmcpOiBwYXNzICAgICMgYSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZyAoeWV0KVxuXG4gICBjbGFzcyBDOiBwYXNzICAgICAgICMgYSBjbGFzcyB3aXRoIG5vIG1ldGhvZHMgKHlldClcbicsCi0gJ3Bvd2VyJzogdSdcblRoZSBwb3dlciBvcGVyYXRvclxuKioqKioqKioqKioqKioqKioqXG5cblRoZSBwb3dlciBvcGVyYXRvciBiaW5kcyBtb3JlIHRpZ2h0bHkgdGhhbiB1bmFyeSBvcGVyYXRvcnMgb24gaXRzXG5sZWZ0OyBpdCBiaW5kcyBsZXNzIHRpZ2h0bHkgdGhhbiB1bmFyeSBvcGVyYXRvcnMgb24gaXRzIHJpZ2h0LiAgVGhlXG5zeW50YXggaXM6XG5cbiAgIHBvd2VyIDo6PSAoIGF3YWl0X2V4cHIgfCBwcmltYXJ5ICkgWyIqKiIgdV9leHByXVxuXG5UaHVzLCBpbiBhbiB1bnBhcmVudGhlc2l6ZWQgc2VxdWVuY2Ugb2YgcG93ZXIgYW5kIHVuYXJ5IG9wZXJhdG9ycywgdGhlXG5vcGVyYXRvcnMgYXJlIGV2YWx1YXRlZCBmcm9tIHJpZ2h0IHRvIGxlZnQgKHRoaXMgZG9lcyBub3QgY29uc3RyYWluXG50aGUgZXZhbHVhdGlvbiBvcmRlciBmb3IgdGhlIG9wZXJhbmRzKTogIi0xKioyIiByZXN1bHRzIGluICItMSIuXG5cblRoZSBwb3dlciBvcGVyYXRvciBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBidWlsdC1pbiAicG93KCkiXG5mdW5jdGlvbiwgd2hlbiBjYWxsZWQgd2l0aCB0d28gYXJndW1lbnRzOiBpdCB5aWVsZHMgaXRzIGxlZnQgYXJndW1lbnRcbnJhaXNlZCB0byB0aGUgcG93ZXIgb2YgaXRzIHJpZ2h0IGFyZ3VtZW50LiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZVxuZmlyc3QgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUsIGFuZCB0aGUgcmVzdWx0IGlzIG9mIHRoYXQgdHlwZS5cblxuRm9yIGludCBvcGVyYW5kcywgdGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb3BlcmFuZHMgdW5sZXNzXG50aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5lZ2F0aXZlOyBpbiB0aGF0IGNhc2UsIGFsbCBhcmd1bWVudHMgYXJlXG5jb252ZXJ0ZWQgdG8gZmxvYXQgYW5kIGEgZmxvYXQgcmVzdWx0IGlzIGRlbGl2ZXJlZC4gRm9yIGV4YW1wbGUsXG4iMTAqKjIiIHJldHVybnMgIjEwMCIsIGJ1dCAiMTAqKi0yIiByZXR1cm5zICIwLjAxIi5cblxuUmFpc2luZyAiMC4wIiB0byBhIG5lZ2F0aXZlIHBvd2VyIHJlc3VsdHMgaW4gYSAiWmVyb0RpdmlzaW9uRXJyb3IiLlxuUmFpc2luZyBhIG5lZ2F0aXZlIG51bWJlciB0byBhIGZyYWN0aW9uYWwgcG93ZXIgcmVzdWx0cyBpbiBhICJjb21wbGV4IlxubnVtYmVyLiAoSW4gZWFybGllciB2ZXJzaW9ucyBpdCByYWlzZWQgYSAiVmFsdWVFcnJvciIuKVxuJywKLSAncmFpc2UnOiB1J1xuVGhlICJyYWlzZSIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKipcblxuICAgcmFpc2Vfc3RtdCA6Oj0gInJhaXNlIiBbZXhwcmVzc2lvbiBbImZyb20iIGV4cHJlc3Npb25dXVxuXG5JZiBubyBleHByZXNzaW9ucyBhcmUgcHJlc2VudCwgInJhaXNlIiByZS1yYWlzZXMgdGhlIGxhc3QgZXhjZXB0aW9uXG50aGF0IHdhcyBhY3RpdmUgaW4gdGhlIGN1cnJlbnQgc2NvcGUuICBJZiBubyBleGNlcHRpb24gaXMgYWN0aXZlIGluXG50aGUgY3VycmVudCBzY29wZSwgYSAiUnVudGltZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkIGluZGljYXRpbmdcbnRoYXQgdGhpcyBpcyBhbiBlcnJvci5cblxuT3RoZXJ3aXNlLCAicmFpc2UiIGV2YWx1YXRlcyB0aGUgZmlyc3QgZXhwcmVzc2lvbiBhcyB0aGUgZXhjZXB0aW9uXG5vYmplY3QuICBJdCBtdXN0IGJlIGVpdGhlciBhIHN1YmNsYXNzIG9yIGFuIGluc3RhbmNlIG9mXG4iQmFzZUV4Y2VwdGlvbiIuIElmIGl0IGlzIGEgY2xhc3MsIHRoZSBleGNlcHRpb24gaW5zdGFuY2Ugd2lsbCBiZVxub2J0YWluZWQgd2hlbiBuZWVkZWQgYnkgaW5zdGFudGlhdGluZyB0aGUgY2xhc3Mgd2l0aCBubyBhcmd1bWVudHMuXG5cblRoZSAqdHlwZSogb2YgdGhlIGV4Y2VwdGlvbiBpcyB0aGUgZXhjZXB0aW9uIGluc3RhbmNlXCdzIGNsYXNzLCB0aGVcbip2YWx1ZSogaXMgdGhlIGluc3RhbmNlIGl0c2VsZi5cblxuQSB0cmFjZWJhY2sgb2JqZWN0IGlzIG5vcm1hbGx5IGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFuIGV4Y2VwdGlvblxuaXMgcmFpc2VkIGFuZCBhdHRhY2hlZCB0byBpdCBhcyB0aGUgIl9fdHJhY2ViYWNrX18iIGF0dHJpYnV0ZSwgd2hpY2hcbmlzIHdyaXRhYmxlLiBZb3UgY2FuIGNyZWF0ZSBhbiBleGNlcHRpb24gYW5kIHNldCB5b3VyIG93biB0cmFjZWJhY2sgaW5cbm9uZSBzdGVwIHVzaW5nIHRoZSAid2l0aF90cmFjZWJhY2soKSIgZXhjZXB0aW9uIG1ldGhvZCAod2hpY2ggcmV0dXJuc1xudGhlIHNhbWUgZXhjZXB0aW9uIGluc3RhbmNlLCB3aXRoIGl0cyB0cmFjZWJhY2sgc2V0IHRvIGl0cyBhcmd1bWVudCksXG5saWtlIHNvOlxuXG4gICByYWlzZSBFeGNlcHRpb24oImZvbyBvY2N1cnJlZCIpLndpdGhfdHJhY2ViYWNrKHRyYWNlYmFja29iailcblxuVGhlICJmcm9tIiBjbGF1c2UgaXMgdXNlZCBmb3IgZXhjZXB0aW9uIGNoYWluaW5nOiBpZiBnaXZlbiwgdGhlIHNlY29uZFxuKmV4cHJlc3Npb24qIG11c3QgYmUgYW5vdGhlciBleGNlcHRpb24gY2xhc3Mgb3IgaW5zdGFuY2UsIHdoaWNoIHdpbGxcbnRoZW4gYmUgYXR0YWNoZWQgdG8gdGhlIHJhaXNlZCBleGNlcHRpb24gYXMgdGhlICJfX2NhdXNlX18iIGF0dHJpYnV0ZVxuKHdoaWNoIGlzIHdyaXRhYmxlKS4gIElmIHRoZSByYWlzZWQgZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkLCBib3RoXG5leGNlcHRpb25zIHdpbGwgYmUgcHJpbnRlZDpcblxuICAgPj4+IHRyeTpcbiAgIC4uLiAgICAgcHJpbnQoMSAvIDApXG4gICAuLi4gZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6XG4gICAuLi4gICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU29tZXRoaW5nIGJhZCBoYXBwZW5lZCIpIGZyb20gZXhjXG4gICAuLi5cbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gPG1vZHVsZT5cbiAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnQgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cblxuICAgVGhlIGFib3ZlIGV4Y2VwdGlvbiB3YXMgdGhlIGRpcmVjdCBjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjpcblxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSA0LCBpbiA8bW9kdWxlPlxuICAgUnVudGltZUVycm9yOiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkXG5cbkEgc2ltaWxhciBtZWNoYW5pc20gd29ya3MgaW1wbGljaXRseSBpZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGluc2lkZVxuYW4gZXhjZXB0aW9uIGhhbmRsZXIgb3IgYSAiZmluYWxseSIgY2xhdXNlOiB0aGUgcHJldmlvdXMgZXhjZXB0aW9uIGlzXG50aGVuIGF0dGFjaGVkIGFzIHRoZSBuZXcgZXhjZXB0aW9uXCdzICJfX2NvbnRleHRfXyIgYXR0cmlidXRlOlxuXG4gICA+Pj4gdHJ5OlxuICAgLi4uICAgICBwcmludCgxIC8gMClcbiAgIC4uLiBleGNlcHQ6XG4gICAuLi4gICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU29tZXRoaW5nIGJhZCBoYXBwZW5lZCIpXG4gICAuLi5cbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gPG1vZHVsZT5cbiAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnQgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cblxuICAgRHVyaW5nIGhhbmRsaW5nIG9mIHRoZSBhYm92ZSBleGNlcHRpb24sIGFub3RoZXIgZXhjZXB0aW9uIG9jY3VycmVkOlxuXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDQsIGluIDxtb2R1bGU+XG4gICBSdW50aW1lRXJyb3I6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWRcblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBoYW5kbGluZyBleGNlcHRpb25zIGlzIGluIHNlY3Rpb25cbipUaGUgdHJ5IHN0YXRlbWVudCouXG4nLAotICdyZXR1cm4nOiB1J1xuVGhlICJyZXR1cm4iIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICByZXR1cm5fc3RtdCA6Oj0gInJldHVybiIgW2V4cHJlc3Npb25fbGlzdF1cblxuInJldHVybiIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uLFxubm90IHdpdGhpbiBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uLlxuXG5JZiBhbiBleHByZXNzaW9uIGxpc3QgaXMgcHJlc2VudCwgaXQgaXMgZXZhbHVhdGVkLCBlbHNlICJOb25lIiBpc1xuc3Vic3RpdHV0ZWQuXG5cbiJyZXR1cm4iIGxlYXZlcyB0aGUgY3VycmVudCBmdW5jdGlvbiBjYWxsIHdpdGggdGhlIGV4cHJlc3Npb24gbGlzdCAob3JcbiJOb25lIikgYXMgcmV0dXJuIHZhbHVlLlxuXG5XaGVuICJyZXR1cm4iIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGEgImZpbmFsbHkiXG5jbGF1c2UsIHRoYXQgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5IGxlYXZpbmcgdGhlXG5mdW5jdGlvbi5cblxuSW4gYSBnZW5lcmF0b3IgZnVuY3Rpb24sIHRoZSAicmV0dXJuIiBzdGF0ZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhlXG5nZW5lcmF0b3IgaXMgZG9uZSBhbmQgd2lsbCBjYXVzZSAiU3RvcEl0ZXJhdGlvbiIgdG8gYmUgcmFpc2VkLiBUaGVcbnJldHVybmVkIHZhbHVlIChpZiBhbnkpIGlzIHVzZWQgYXMgYW4gYXJndW1lbnQgdG8gY29uc3RydWN0XG4iU3RvcEl0ZXJhdGlvbiIgYW5kIGJlY29tZXMgdGhlICJTdG9wSXRlcmF0aW9uLnZhbHVlIiBhdHRyaWJ1dGUuXG4nLAotICdzZXF1ZW5jZS10eXBlcyc6IHUnXG5FbXVsYXRpbmcgY29udGFpbmVyIHR5cGVzXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBpbXBsZW1lbnQgY29udGFpbmVyIG9iamVjdHMuXG5Db250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpIG9yIG1hcHBpbmdzXG4obGlrZSBkaWN0aW9uYXJpZXMpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzIGFzIHdlbGwuICBUaGVcbmZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSBvciB0b1xuZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEgc2VxdWVuY2UsIHRoZVxuYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoICIwIDw9IGsgPCBOIiB3aGVyZVxuKk4qIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLCBvciBzbGljZSBvYmplY3RzLCB3aGljaCBkZWZpbmUgYVxucmFuZ2Ugb2YgaXRlbXMuICBJdCBpcyBhbHNvIHJlY29tbWVuZGVkIHRoYXQgbWFwcGluZ3MgcHJvdmlkZSB0aGVcbm1ldGhvZHMgImtleXMoKSIsICJ2YWx1ZXMoKSIsICJpdGVtcygpIiwgImdldCgpIiwgImNsZWFyKCkiLFxuInNldGRlZmF1bHQoKSIsICJwb3AoKSIsICJwb3BpdGVtKCkiLCAiY29weSgpIiwgYW5kICJ1cGRhdGUoKSJcbmJlaGF2aW5nIHNpbWlsYXIgdG8gdGhvc2UgZm9yIFB5dGhvblwncyBzdGFuZGFyZCBkaWN0aW9uYXJ5IG9iamVjdHMuXG5UaGUgImNvbGxlY3Rpb25zIiBtb2R1bGUgcHJvdmlkZXMgYSAiTXV0YWJsZU1hcHBpbmciIGFic3RyYWN0IGJhc2VcbmNsYXNzIHRvIGhlbHAgY3JlYXRlIHRob3NlIG1ldGhvZHMgZnJvbSBhIGJhc2Ugc2V0IG9mICJfX2dldGl0ZW1fXygpIixcbiJfX3NldGl0ZW1fXygpIiwgIl9fZGVsaXRlbV9fKCkiLCBhbmQgImtleXMoKSIuIE11dGFibGUgc2VxdWVuY2VzXG5zaG91bGQgcHJvdmlkZSBtZXRob2RzICJhcHBlbmQoKSIsICJjb3VudCgpIiwgImluZGV4KCkiLCAiZXh0ZW5kKCkiLFxuImluc2VydCgpIiwgInBvcCgpIiwgInJlbW92ZSgpIiwgInJldmVyc2UoKSIgYW5kICJzb3J0KCkiLCBsaWtlIFB5dGhvblxuc3RhbmRhcmQgbGlzdCBvYmplY3RzLiAgRmluYWxseSwgc2VxdWVuY2UgdHlwZXMgc2hvdWxkIGltcGxlbWVudFxuYWRkaXRpb24gKG1lYW5pbmcgY29uY2F0ZW5hdGlvbikgYW5kIG11bHRpcGxpY2F0aW9uIChtZWFuaW5nXG5yZXBldGl0aW9uKSBieSBkZWZpbmluZyB0aGUgbWV0aG9kcyAiX19hZGRfXygpIiwgIl9fcmFkZF9fKCkiLFxuIl9faWFkZF9fKCkiLCAiX19tdWxfXygpIiwgIl9fcm11bF9fKCkiIGFuZCAiX19pbXVsX18oKSIgZGVzY3JpYmVkXG5iZWxvdzsgdGhleSBzaG91bGQgbm90IGRlZmluZSBvdGhlciBudW1lcmljYWwgb3BlcmF0b3JzLiAgSXQgaXNcbnJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGVcbiJfX2NvbnRhaW5zX18oKSIgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCB1c2Ugb2YgdGhlICJpbiIgb3BlcmF0b3I7XG5mb3IgbWFwcGluZ3MsICJpbiIgc2hvdWxkIHNlYXJjaCB0aGUgbWFwcGluZ1wncyBrZXlzOyBmb3Igc2VxdWVuY2VzLCBpdFxuc2hvdWxkIHNlYXJjaCB0aHJvdWdoIHRoZSB2YWx1ZXMuICBJdCBpcyBmdXJ0aGVyIHJlY29tbWVuZGVkIHRoYXQgYm90aFxubWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlICJfX2l0ZXJfXygpIiBtZXRob2QgdG8gYWxsb3dcbmVmZmljaWVudCBpdGVyYXRpb24gdGhyb3VnaCB0aGUgY29udGFpbmVyOyBmb3IgbWFwcGluZ3MsICJfX2l0ZXJfXygpIlxuc2hvdWxkIGJlIHRoZSBzYW1lIGFzICJrZXlzKCkiOyBmb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgaXRlcmF0ZVxudGhyb3VnaCB0aGUgdmFsdWVzLlxuXG5vYmplY3QuX19sZW5fXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAibGVuKCkiLiAgU2hvdWxkIHJldHVyblxuICAgdGhlIGxlbmd0aCBvZiB0aGUgb2JqZWN0LCBhbiBpbnRlZ2VyICI+PSIgMC4gIEFsc28sIGFuIG9iamVjdCB0aGF0XG4gICBkb2VzblwndCBkZWZpbmUgYSAiX19ib29sX18oKSIgbWV0aG9kIGFuZCB3aG9zZSAiX19sZW5fXygpIiBtZXRob2RcbiAgIHJldHVybnMgemVybyBpcyBjb25zaWRlcmVkIHRvIGJlIGZhbHNlIGluIGEgQm9vbGVhbiBjb250ZXh0LlxuXG5vYmplY3QuX19sZW5ndGhfaGludF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmxlbmd0aF9oaW50KCkiLiBTaG91bGQgcmV0dXJuIGFuXG4gICBlc3RpbWF0ZWQgbGVuZ3RoIGZvciB0aGUgb2JqZWN0ICh3aGljaCBtYXkgYmUgZ3JlYXRlciBvciBsZXNzIHRoYW5cbiAgIHRoZSBhY3R1YWwgbGVuZ3RoKS4gVGhlIGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIgIj49IiAwLiBUaGlzXG4gICBtZXRob2QgaXMgcHVyZWx5IGFuIG9wdGltaXphdGlvbiBhbmQgaXMgbmV2ZXIgcmVxdWlyZWQgZm9yXG4gICBjb3JyZWN0bmVzcy5cblxuICAgTmV3IGluIHZlcnNpb24gMy40LlxuXG5Ob3RlOiBTbGljaW5nIGlzIGRvbmUgZXhjbHVzaXZlbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRocmVlIG1ldGhvZHMuXG4gIEEgY2FsbCBsaWtlXG5cbiAgICAgYVsxOjJdID0gYlxuXG4gIGlzIHRyYW5zbGF0ZWQgdG9cblxuICAgICBhW3NsaWNlKDEsIDIsIE5vbmUpXSA9IGJcblxuICBhbmQgc28gZm9ydGguICBNaXNzaW5nIHNsaWNlIGl0ZW1zIGFyZSBhbHdheXMgZmlsbGVkIGluIHdpdGggIk5vbmUiLlxuXG5vYmplY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGV2YWx1YXRpb24gb2YgInNlbGZba2V5XSIuIEZvciBzZXF1ZW5jZSB0eXBlcyxcbiAgIHRoZSBhY2NlcHRlZCBrZXlzIHNob3VsZCBiZSBpbnRlZ2VycyBhbmQgc2xpY2Ugb2JqZWN0cy4gIE5vdGUgdGhhdFxuICAgdGhlIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgaW5kZXhlcyAoaWYgdGhlIGNsYXNzIHdpc2hlc1xuICAgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIHR5cGUpIGlzIHVwIHRvIHRoZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLiBJZlxuICAgKmtleSogaXMgb2YgYW4gaW5hcHByb3ByaWF0ZSB0eXBlLCAiVHlwZUVycm9yIiBtYXkgYmUgcmFpc2VkOyBpZiBvZlxuICAgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzZXQgb2YgaW5kZXhlcyBmb3IgdGhlIHNlcXVlbmNlIChhZnRlciBhbnlcbiAgIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgdmFsdWVzKSwgIkluZGV4RXJyb3IiIHNob3VsZCBiZVxuICAgcmFpc2VkLiBGb3IgbWFwcGluZyB0eXBlcywgaWYgKmtleSogaXMgbWlzc2luZyAobm90IGluIHRoZVxuICAgY29udGFpbmVyKSwgIktleUVycm9yIiBzaG91bGQgYmUgcmFpc2VkLlxuXG4gICBOb3RlOiAiZm9yIiBsb29wcyBleHBlY3QgdGhhdCBhbiAiSW5kZXhFcnJvciIgd2lsbCBiZSByYWlzZWQgZm9yXG4gICAgIGlsbGVnYWwgaW5kZXhlcyB0byBhbGxvdyBwcm9wZXIgZGV0ZWN0aW9uIG9mIHRoZSBlbmQgb2YgdGhlXG4gICAgIHNlcXVlbmNlLlxuXG5vYmplY3QuX19taXNzaW5nX18oc2VsZiwga2V5KVxuXG4gICBDYWxsZWQgYnkgImRpY3QiLiJfX2dldGl0ZW1fXygpIiB0byBpbXBsZW1lbnQgInNlbGZba2V5XSIgZm9yIGRpY3RcbiAgIHN1YmNsYXNzZXMgd2hlbiBrZXkgaXMgbm90IGluIHRoZSBkaWN0aW9uYXJ5LlxuXG5vYmplY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBhc3NpZ25tZW50IHRvICJzZWxmW2tleV0iLiAgU2FtZSBub3RlIGFzIGZvclxuICAgIl9fZ2V0aXRlbV9fKCkiLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWZcbiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgY2hhbmdlcyB0byB0aGUgdmFsdWVzIGZvciBrZXlzLCBvciBpZiBuZXcga2V5c1xuICAgY2FuIGJlIGFkZGVkLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzIGNhbiBiZSByZXBsYWNlZC4gIFRoZVxuICAgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZSByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3JcbiAgIHRoZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuXG5vYmplY3QuX19kZWxpdGVtX18oc2VsZiwga2V5KVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mICJzZWxmW2tleV0iLiAgU2FtZSBub3RlIGFzIGZvclxuICAgIl9fZ2V0aXRlbV9fKCkiLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWZcbiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgcmVtb3ZhbCBvZiBrZXlzLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzXG4gICBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXF1ZW5jZS4gIFRoZSBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlXG4gICByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IgdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG5cbm9iamVjdC5fX2l0ZXJfXyhzZWxmKVxuXG4gICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBpdGVyYXRvciBpcyByZXF1aXJlZCBmb3IgYSBjb250YWluZXIuXG4gICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbiBpdGVyYXRlXG4gICBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyLiAgRm9yIG1hcHBpbmdzLCBpdCBzaG91bGRcbiAgIGl0ZXJhdGUgb3ZlciB0aGUga2V5cyBvZiB0aGUgY29udGFpbmVyLlxuXG4gICBJdGVyYXRvciBvYmplY3RzIGFsc28gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2Q7IHRoZXkgYXJlXG4gICByZXF1aXJlZCB0byByZXR1cm4gdGhlbXNlbHZlcy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGl0ZXJhdG9yXG4gICBvYmplY3RzLCBzZWUgKkl0ZXJhdG9yIFR5cGVzKi5cblxub2JqZWN0Ll9fcmV2ZXJzZWRfXyhzZWxmKVxuXG4gICBDYWxsZWQgKGlmIHByZXNlbnQpIGJ5IHRoZSAicmV2ZXJzZWQoKSIgYnVpbHQtaW4gdG8gaW1wbGVtZW50XG4gICByZXZlcnNlIGl0ZXJhdGlvbi4gIEl0IHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXRcbiAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gcmV2ZXJzZSBvcmRlci5cblxuICAgSWYgdGhlICJfX3JldmVyc2VkX18oKSIgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdGhlICJyZXZlcnNlZCgpIlxuICAgYnVpbHQtaW4gd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIHNlcXVlbmNlIHByb3RvY29sICgiX19sZW5fXygpIlxuICAgYW5kICJfX2dldGl0ZW1fXygpIikuICBPYmplY3RzIHRoYXQgc3VwcG9ydCB0aGUgc2VxdWVuY2UgcHJvdG9jb2xcbiAgIHNob3VsZCBvbmx5IHByb3ZpZGUgIl9fcmV2ZXJzZWRfXygpIiBpZiB0aGV5IGNhbiBwcm92aWRlIGFuXG4gICBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIG9uZSBwcm92aWRlZCBieVxuICAgInJldmVyc2VkKCkiLlxuXG5UaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoImluIiBhbmQgIm5vdCBpbiIpIGFyZSBub3JtYWxseVxuaW1wbGVtZW50ZWQgYXMgYW4gaXRlcmF0aW9uIHRocm91Z2ggYSBzZXF1ZW5jZS4gIEhvd2V2ZXIsIGNvbnRhaW5lclxub2JqZWN0cyBjYW4gc3VwcGx5IHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBtZXRob2Qgd2l0aCBhIG1vcmUgZWZmaWNpZW50XG5pbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBkb2VzIG5vdCByZXF1aXJlIHRoZSBvYmplY3QgYmUgYSBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fY29udGFpbnNfXyhzZWxmLCBpdGVtKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgcmV0dXJuIHRydWVcbiAgIGlmICppdGVtKiBpcyBpbiAqc2VsZiosIGZhbHNlIG90aGVyd2lzZS4gIEZvciBtYXBwaW5nIG9iamVjdHMsIHRoaXNcbiAgIHNob3VsZCBjb25zaWRlciB0aGUga2V5cyBvZiB0aGUgbWFwcGluZyByYXRoZXIgdGhhbiB0aGUgdmFsdWVzIG9yXG4gICB0aGUga2V5LWl0ZW0gcGFpcnMuXG5cbiAgIEZvciBvYmplY3RzIHRoYXQgZG9uXCd0IGRlZmluZSAiX19jb250YWluc19fKCkiLCB0aGUgbWVtYmVyc2hpcCB0ZXN0XG4gICBmaXJzdCB0cmllcyBpdGVyYXRpb24gdmlhICJfX2l0ZXJfXygpIiwgdGhlbiB0aGUgb2xkIHNlcXVlbmNlXG4gICBpdGVyYXRpb24gcHJvdG9jb2wgdmlhICJfX2dldGl0ZW1fXygpIiwgc2VlICp0aGlzIHNlY3Rpb24gaW4gdGhlXG4gICBsYW5ndWFnZSByZWZlcmVuY2UqLlxuJywKLSAnc2hpZnRpbmcnOiB1J1xuU2hpZnRpbmcgb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgc2hpZnRpbmcgb3BlcmF0aW9ucyBoYXZlIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGFyaXRobWV0aWNcbm9wZXJhdGlvbnM6XG5cbiAgIHNoaWZ0X2V4cHIgOjo9IGFfZXhwciB8IHNoaWZ0X2V4cHIgKCAiPDwiIHwgIj4+IiApIGFfZXhwclxuXG5UaGVzZSBvcGVyYXRvcnMgYWNjZXB0IGludGVnZXJzIGFzIGFyZ3VtZW50cy4gIFRoZXkgc2hpZnQgdGhlIGZpcnN0XG5hcmd1bWVudCB0byB0aGUgbGVmdCBvciByaWdodCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgZ2l2ZW4gYnkgdGhlXG5zZWNvbmQgYXJndW1lbnQuXG5cbkEgcmlnaHQgc2hpZnQgYnkgKm4qIGJpdHMgaXMgZGVmaW5lZCBhcyBmbG9vciBkaXZpc2lvbiBieSAicG93KDIsbikiLlxuQSBsZWZ0IHNoaWZ0IGJ5ICpuKiBiaXRzIGlzIGRlZmluZWQgYXMgbXVsdGlwbGljYXRpb24gd2l0aCAicG93KDIsbikiLlxuXG5Ob3RlOiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZCBpc1xuICByZXF1aXJlZCB0byBiZSBhdCBtb3N0ICJzeXMubWF4c2l6ZSIuICBJZiB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIGlzXG4gIGxhcmdlciB0aGFuICJzeXMubWF4c2l6ZSIgYW4gIk92ZXJmbG93RXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nLAotICdzbGljaW5ncyc6IHUnXG5TbGljaW5nc1xuKioqKioqKipcblxuQSBzbGljaW5nIHNlbGVjdHMgYSByYW5nZSBvZiBpdGVtcyBpbiBhIHNlcXVlbmNlIG9iamVjdCAoZS5nLiwgYVxuc3RyaW5nLCB0dXBsZSBvciBsaXN0KS4gIFNsaWNpbmdzIG1heSBiZSB1c2VkIGFzIGV4cHJlc3Npb25zIG9yIGFzXG50YXJnZXRzIGluIGFzc2lnbm1lbnQgb3IgImRlbCIgc3RhdGVtZW50cy4gIFRoZSBzeW50YXggZm9yIGEgc2xpY2luZzpcblxuICAgc2xpY2luZyAgICAgIDo6PSBwcmltYXJ5ICJbIiBzbGljZV9saXN0ICJdIlxuICAgc2xpY2VfbGlzdCAgIDo6PSBzbGljZV9pdGVtICgiLCIgc2xpY2VfaXRlbSkqIFsiLCJdXG4gICBzbGljZV9pdGVtICAgOjo9IGV4cHJlc3Npb24gfCBwcm9wZXJfc2xpY2VcbiAgIHByb3Blcl9zbGljZSA6Oj0gW2xvd2VyX2JvdW5kXSAiOiIgW3VwcGVyX2JvdW5kXSBbICI6IiBbc3RyaWRlXSBdXG4gICBsb3dlcl9ib3VuZCAgOjo9IGV4cHJlc3Npb25cbiAgIHVwcGVyX2JvdW5kICA6Oj0gZXhwcmVzc2lvblxuICAgc3RyaWRlICAgICAgIDo6PSBleHByZXNzaW9uXG5cblRoZXJlIGlzIGFtYmlndWl0eSBpbiB0aGUgZm9ybWFsIHN5bnRheCBoZXJlOiBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2VcbmFuIGV4cHJlc3Npb24gbGlzdCBhbHNvIGxvb2tzIGxpa2UgYSBzbGljZSBsaXN0LCBzbyBhbnkgc3Vic2NyaXB0aW9uXG5jYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBzbGljaW5nLiAgUmF0aGVyIHRoYW4gZnVydGhlciBjb21wbGljYXRpbmcgdGhlXG5zeW50YXgsIHRoaXMgaXMgZGlzYW1iaWd1YXRlZCBieSBkZWZpbmluZyB0aGF0IGluIHRoaXMgY2FzZSB0aGVcbmludGVycHJldGF0aW9uIGFzIGEgc3Vic2NyaXB0aW9uIHRha2VzIHByaW9yaXR5IG92ZXIgdGhlXG5pbnRlcnByZXRhdGlvbiBhcyBhIHNsaWNpbmcgKHRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIHNsaWNlIGxpc3RcbmNvbnRhaW5zIG5vIHByb3BlciBzbGljZSkuXG5cblRoZSBzZW1hbnRpY3MgZm9yIGEgc2xpY2luZyBhcmUgYXMgZm9sbG93cy4gIFRoZSBwcmltYXJ5IGlzIGluZGV4ZWRcbih1c2luZyB0aGUgc2FtZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kIGFzIG5vcm1hbCBzdWJzY3JpcHRpb24pIHdpdGggYVxua2V5IHRoYXQgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgc2xpY2UgbGlzdCwgYXMgZm9sbG93cy4gIElmIHRoZSBzbGljZVxubGlzdCBjb250YWlucyBhdCBsZWFzdCBvbmUgY29tbWEsIHRoZSBrZXkgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZVxuY29udmVyc2lvbiBvZiB0aGUgc2xpY2UgaXRlbXM7IG90aGVyd2lzZSwgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGxvbmVcbnNsaWNlIGl0ZW0gaXMgdGhlIGtleS4gIFRoZSBjb252ZXJzaW9uIG9mIGEgc2xpY2UgaXRlbSB0aGF0IGlzIGFuXG5leHByZXNzaW9uIGlzIHRoYXQgZXhwcmVzc2lvbi4gIFRoZSBjb252ZXJzaW9uIG9mIGEgcHJvcGVyIHNsaWNlIGlzIGFcbnNsaWNlIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopIHdob3NlXG4ic3RhcnQiLCAic3RvcCIgYW5kICJzdGVwIiBhdHRyaWJ1dGVzIGFyZSB0aGUgdmFsdWVzIG9mIHRoZVxuZXhwcmVzc2lvbnMgZ2l2ZW4gYXMgbG93ZXIgYm91bmQsIHVwcGVyIGJvdW5kIGFuZCBzdHJpZGUsXG5yZXNwZWN0aXZlbHksIHN1YnN0aXR1dGluZyAiTm9uZSIgZm9yIG1pc3NpbmcgZXhwcmVzc2lvbnMuXG4nLAotICdzcGVjaWFsYXR0cnMnOiB1J1xuU3BlY2lhbCBBdHRyaWJ1dGVzXG4qKioqKioqKioqKioqKioqKipcblxuVGhlIGltcGxlbWVudGF0aW9uIGFkZHMgYSBmZXcgc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcyB0byBzZXZlcmFsXG5vYmplY3QgdHlwZXMsIHdoZXJlIHRoZXkgYXJlIHJlbGV2YW50LiAgU29tZSBvZiB0aGVzZSBhcmUgbm90IHJlcG9ydGVkXG5ieSB0aGUgImRpcigpIiBidWlsdC1pbiBmdW5jdGlvbi5cblxub2JqZWN0Ll9fZGljdF9fXG5cbiAgIEEgZGljdGlvbmFyeSBvciBvdGhlciBtYXBwaW5nIG9iamVjdCB1c2VkIHRvIHN0b3JlIGFuIG9iamVjdFwnc1xuICAgKHdyaXRhYmxlKSBhdHRyaWJ1dGVzLlxuXG5pbnN0YW5jZS5fX2NsYXNzX19cblxuICAgVGhlIGNsYXNzIHRvIHdoaWNoIGEgY2xhc3MgaW5zdGFuY2UgYmVsb25ncy5cblxuY2xhc3MuX19iYXNlc19fXG5cbiAgIFRoZSB0dXBsZSBvZiBiYXNlIGNsYXNzZXMgb2YgYSBjbGFzcyBvYmplY3QuXG5cbmNsYXNzLl9fbmFtZV9fXG5cbiAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvciB0eXBlLlxuXG5jbGFzcy5fX3F1YWxuYW1lX19cblxuICAgVGhlICpxdWFsaWZpZWQgbmFtZSogb2YgdGhlIGNsYXNzIG9yIHR5cGUuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMy5cblxuY2xhc3MuX19tcm9fX1xuXG4gICBUaGlzIGF0dHJpYnV0ZSBpcyBhIHR1cGxlIG9mIGNsYXNzZXMgdGhhdCBhcmUgY29uc2lkZXJlZCB3aGVuXG4gICBsb29raW5nIGZvciBiYXNlIGNsYXNzZXMgZHVyaW5nIG1ldGhvZCByZXNvbHV0aW9uLlxuXG5jbGFzcy5tcm8oKVxuXG4gICBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIG1ldGFjbGFzcyB0byBjdXN0b21pemUgdGhlXG4gICBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciBmb3IgaXRzIGluc3RhbmNlcy4gIEl0IGlzIGNhbGxlZCBhdCBjbGFzc1xuICAgaW5zdGFudGlhdGlvbiwgYW5kIGl0cyByZXN1bHQgaXMgc3RvcmVkIGluICJfX21yb19fIi5cblxuY2xhc3MuX19zdWJjbGFzc2VzX18oKVxuXG4gICBFYWNoIGNsYXNzIGtlZXBzIGEgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gaXRzIGltbWVkaWF0ZVxuICAgc3ViY2xhc3Nlcy4gIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIGFsbCB0aG9zZSByZWZlcmVuY2VzXG4gICBzdGlsbCBhbGl2ZS4gRXhhbXBsZTpcblxuICAgICAgPj4+IGludC5fX3N1YmNsYXNzZXNfXygpXG4gICAgICBbPGNsYXNzIFwnYm9vbFwnPl1cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZXNlIHNwZWNpYWwgbWV0aG9kcyBtYXkgYmUgZm91bmRcbiAgICBpbiB0aGUgUHl0aG9uIFJlZmVyZW5jZSBNYW51YWwgKCpCYXNpYyBjdXN0b21pemF0aW9uKikuXG5cblsyXSBBcyBhIGNvbnNlcXVlbmNlLCB0aGUgbGlzdCAiWzEsIDJdIiBpcyBjb25zaWRlcmVkIGVxdWFsIHRvXG4gICAgIlsxLjAsIDIuMF0iLCBhbmQgc2ltaWxhcmx5IGZvciB0dXBsZXMuXG5cblszXSBUaGV5IG11c3QgaGF2ZSBzaW5jZSB0aGUgcGFyc2VyIGNhblwndCB0ZWxsIHRoZSB0eXBlIG9mIHRoZVxuICAgIG9wZXJhbmRzLlxuXG5bNF0gQ2FzZWQgY2hhcmFjdGVycyBhcmUgdGhvc2Ugd2l0aCBnZW5lcmFsIGNhdGVnb3J5IHByb3BlcnR5XG4gICAgYmVpbmcgb25lIG9mICJMdSIgKExldHRlciwgdXBwZXJjYXNlKSwgIkxsIiAoTGV0dGVyLCBsb3dlcmNhc2UpLFxuICAgIG9yICJMdCIgKExldHRlciwgdGl0bGVjYXNlKS5cblxuWzVdIFRvIGZvcm1hdCBvbmx5IGEgdHVwbGUgeW91IHNob3VsZCB0aGVyZWZvcmUgcHJvdmlkZSBhXG4gICAgc2luZ2xldG9uIHR1cGxlIHdob3NlIG9ubHkgZWxlbWVudCBpcyB0aGUgdHVwbGUgdG8gYmUgZm9ybWF0dGVkLlxuJywKLSAnc3BlY2lhbG5hbWVzJzogdSdcblNwZWNpYWwgbWV0aG9kIG5hbWVzXG4qKioqKioqKioqKioqKioqKioqKlxuXG5BIGNsYXNzIGNhbiBpbXBsZW1lbnQgY2VydGFpbiBvcGVyYXRpb25zIHRoYXQgYXJlIGludm9rZWQgYnkgc3BlY2lhbFxuc3ludGF4IChzdWNoIGFzIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvciBzdWJzY3JpcHRpbmcgYW5kIHNsaWNpbmcpIGJ5XG5kZWZpbmluZyBtZXRob2RzIHdpdGggc3BlY2lhbCBuYW1lcy4gVGhpcyBpcyBQeXRob25cJ3MgYXBwcm9hY2ggdG9cbipvcGVyYXRvciBvdmVybG9hZGluZyosIGFsbG93aW5nIGNsYXNzZXMgdG8gZGVmaW5lIHRoZWlyIG93biBiZWhhdmlvclxud2l0aCByZXNwZWN0IHRvIGxhbmd1YWdlIG9wZXJhdG9ycy4gIEZvciBpbnN0YW5jZSwgaWYgYSBjbGFzcyBkZWZpbmVzXG5hIG1ldGhvZCBuYW1lZCAiX19nZXRpdGVtX18oKSIsIGFuZCAieCIgaXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyxcbnRoZW4gInhbaV0iIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byAidHlwZSh4KS5fX2dldGl0ZW1fXyh4LCBpKSIuXG5FeGNlcHQgd2hlcmUgbWVudGlvbmVkLCBhdHRlbXB0cyB0byBleGVjdXRlIGFuIG9wZXJhdGlvbiByYWlzZSBhblxuZXhjZXB0aW9uIHdoZW4gbm8gYXBwcm9wcmlhdGUgbWV0aG9kIGlzIGRlZmluZWQgKHR5cGljYWxseVxuIkF0dHJpYnV0ZUVycm9yIiBvciAiVHlwZUVycm9yIikuXG5cbldoZW4gaW1wbGVtZW50aW5nIGEgY2xhc3MgdGhhdCBlbXVsYXRlcyBhbnkgYnVpbHQtaW4gdHlwZSwgaXQgaXNcbmltcG9ydGFudCB0aGF0IHRoZSBlbXVsYXRpb24gb25seSBiZSBpbXBsZW1lbnRlZCB0byB0aGUgZGVncmVlIHRoYXQgaXRcbm1ha2VzIHNlbnNlIGZvciB0aGUgb2JqZWN0IGJlaW5nIG1vZGVsbGVkLiAgRm9yIGV4YW1wbGUsIHNvbWVcbnNlcXVlbmNlcyBtYXkgd29yayB3ZWxsIHdpdGggcmV0cmlldmFsIG9mIGluZGl2aWR1YWwgZWxlbWVudHMsIGJ1dFxuZXh0cmFjdGluZyBhIHNsaWNlIG1heSBub3QgbWFrZSBzZW5zZS4gIChPbmUgZXhhbXBsZSBvZiB0aGlzIGlzIHRoZVxuIk5vZGVMaXN0IiBpbnRlcmZhY2UgaW4gdGhlIFczQ1wncyBEb2N1bWVudCBPYmplY3QgTW9kZWwuKVxuXG5cbkJhc2ljIGN1c3RvbWl6YXRpb25cbj09PT09PT09PT09PT09PT09PT1cblxub2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSlcblxuICAgQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyAqY2xzKi4gICJfX25ld19fKCkiIGlzIGFcbiAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgYXMgc3VjaClcbiAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgYXMgaXRzXG4gICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgdG8gdGhlXG4gICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gIFRoZSByZXR1cm5cbiAgIHZhbHVlIG9mICJfX25ld19fKCkiIHNob3VsZCBiZSB0aGUgbmV3IG9iamVjdCBpbnN0YW5jZSAodXN1YWxseSBhblxuICAgaW5zdGFuY2Ugb2YgKmNscyopLlxuXG4gICBUeXBpY2FsIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGJ5XG4gICBpbnZva2luZyB0aGUgc3VwZXJjbGFzc1wncyAiX19uZXdfXygpIiBtZXRob2QgdXNpbmdcbiAgICJzdXBlcihjdXJyZW50Y2xhc3MsIGNscykuX19uZXdfXyhjbHNbLCAuLi5dKSIgd2l0aCBhcHByb3ByaWF0ZVxuICAgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSBhc1xuICAgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcgaXQuXG5cbiAgIElmICJfX25ld19fKCkiIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ld1xuICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgbGlrZVxuICAgIl9faW5pdF9fKHNlbGZbLCAuLi5dKSIsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3IGluc3RhbmNlIGFuZCB0aGVcbiAgIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdlcmUgcGFzc2VkIHRvICJfX25ld19fKCkiLlxuXG4gICBJZiAiX19uZXdfXygpIiBkb2VzIG5vdCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ld1xuICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLlxuXG4gICAiX19uZXdfXygpIiBpcyBpbnRlbmRlZCBtYWlubHkgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZiBpbW11dGFibGVcbiAgIHR5cGVzIChsaWtlIGludCwgc3RyLCBvciB0dXBsZSkgdG8gY3VzdG9taXplIGluc3RhbmNlIGNyZWF0aW9uLiAgSXRcbiAgIGlzIGFsc28gY29tbW9ubHkgb3ZlcnJpZGRlbiBpbiBjdXN0b20gbWV0YWNsYXNzZXMgaW4gb3JkZXIgdG9cbiAgIGN1c3RvbWl6ZSBjbGFzcyBjcmVhdGlvbi5cblxub2JqZWN0Ll9faW5pdF9fKHNlbGZbLCAuLi5dKVxuXG4gICBDYWxsZWQgYWZ0ZXIgdGhlIGluc3RhbmNlIGhhcyBiZWVuIGNyZWF0ZWQgKGJ5ICJfX25ld19fKCkiKSwgYnV0XG4gICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gIFRoZSBhcmd1bWVudHMgYXJlIHRob3NlXG4gICBwYXNzZWQgdG8gdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uICBJZiBhIGJhc2UgY2xhc3MgaGFzIGFuXG4gICAiX19pbml0X18oKSIgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzc1wncyAiX19pbml0X18oKSIgbWV0aG9kLCBpZlxuICAgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mIHRoZVxuICAgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZTsgZm9yIGV4YW1wbGU6XG4gICAiQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYsIFthcmdzLi4uXSkiLlxuXG4gICBCZWNhdXNlICJfX25ld19fKCkiIGFuZCAiX19pbml0X18oKSIgd29yayB0b2dldGhlciBpbiBjb25zdHJ1Y3RpbmdcbiAgIG9iamVjdHMgKCJfX25ld19fKCkiIHRvIGNyZWF0ZSBpdCwgYW5kICJfX2luaXRfXygpIiB0byBjdXN0b21pc2VcbiAgIGl0KSwgbm8gbm9uLSJOb25lIiB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgYnkgIl9faW5pdF9fKCkiOyBkb2luZyBzb1xuICAgd2lsbCBjYXVzZSBhICJUeXBlRXJyb3IiIHRvIGJlIHJhaXNlZCBhdCBydW50aW1lLlxuXG5vYmplY3QuX19kZWxfXyhzZWxmKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAgVGhpcyBpcyBhbHNvXG4gICBjYWxsZWQgYSBkZXN0cnVjdG9yLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhICJfX2RlbF9fKCkiIG1ldGhvZCwgdGhlXG4gICBkZXJpdmVkIGNsYXNzXCdzICJfX2RlbF9fKCkiIG1ldGhvZCwgaWYgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdFxuICAgdG8gZW5zdXJlIHByb3BlciBkZWxldGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZS5cbiAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSAodGhvdWdoIG5vdCByZWNvbW1lbmRlZCEpIGZvciB0aGVcbiAgICJfX2RlbF9fKCkiIG1ldGhvZCB0byBwb3N0cG9uZSBkZXN0cnVjdGlvbiBvZiB0aGUgaW5zdGFuY2UgYnlcbiAgIGNyZWF0aW5nIGEgbmV3IHJlZmVyZW5jZSB0byBpdC4gIEl0IG1heSB0aGVuIGJlIGNhbGxlZCBhdCBhIGxhdGVyXG4gICB0aW1lIHdoZW4gdGhpcyBuZXcgcmVmZXJlbmNlIGlzIGRlbGV0ZWQuICBJdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0XG4gICAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBjYWxsZWQgZm9yIG9iamVjdHMgdGhhdCBzdGlsbCBleGlzdCB3aGVuXG4gICB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuXG5cbiAgIE5vdGU6ICJkZWwgeCIgZG9lc25cJ3QgZGlyZWN0bHkgY2FsbCAieC5fX2RlbF9fKCkiIC0tLSB0aGUgZm9ybWVyXG4gICAgIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgIngiIGJ5IG9uZSwgYW5kIHRoZSBsYXR0ZXIgaXNcbiAgICAgb25seSBjYWxsZWQgd2hlbiAieCJcJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gIFNvbWUgY29tbW9uXG4gICAgIHNpdHVhdGlvbnMgdGhhdCBtYXkgcHJldmVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuIG9iamVjdCBmcm9tXG4gICAgIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuIG9iamVjdHMgKGUuZy4sXG4gICAgIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoIHBhcmVudCBhbmRcbiAgICAgY2hpbGQgcG9pbnRlcnMpOyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayBmcmFtZSBvZlxuICAgICBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW5cbiAgICAgInN5cy5leGNfaW5mbygpWzJdIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpOyBvciBhIHJlZmVyZW5jZVxuICAgICB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayBmcmFtZSB0aGF0IHJhaXNlZCBhbiB1bmhhbmRsZWRcbiAgICAgZXhjZXB0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4gICAgICJzeXMubGFzdF90cmFjZWJhY2siIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSkuICBUaGUgZmlyc3RcbiAgICAgc2l0dWF0aW9uIGNhbiBvbmx5IGJlIHJlbWVkaWVkIGJ5IGV4cGxpY2l0bHkgYnJlYWtpbmcgdGhlIGN5Y2xlcztcbiAgICAgdGhlIHNlY29uZCBjYW4gYmUgcmVzb2x2ZWQgYnkgZnJlZWluZyB0aGUgcmVmZXJlbmNlIHRvIHRoZVxuICAgICB0cmFjZWJhY2sgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWZ1bCwgYW5kIHRoZSB0aGlyZCBjYW5cbiAgICAgYmUgcmVzb2x2ZWQgYnkgc3RvcmluZyAiTm9uZSIgaW4gInN5cy5sYXN0X3RyYWNlYmFjayIuIENpcmN1bGFyXG4gICAgIHJlZmVyZW5jZXMgd2hpY2ggYXJlIGdhcmJhZ2UgYXJlIGRldGVjdGVkIGFuZCBjbGVhbmVkIHVwIHdoZW4gdGhlXG4gICAgIGN5Y2xpYyBnYXJiYWdlIGNvbGxlY3RvciBpcyBlbmFibGVkIChpdFwncyBvbiBieSBkZWZhdWx0KS4gUmVmZXJcbiAgICAgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSAiZ2MiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvblxuICAgICBhYm91dCB0aGlzIHRvcGljLlxuXG4gICBXYXJuaW5nOiBEdWUgdG8gdGhlIHByZWNhcmlvdXMgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaFxuICAgICAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBpbnZva2VkLCBleGNlcHRpb25zIHRoYXQgb2NjdXIgZHVyaW5nXG4gICAgIHRoZWlyIGV4ZWN1dGlvbiBhcmUgaWdub3JlZCwgYW5kIGEgd2FybmluZyBpcyBwcmludGVkIHRvXG4gICAgICJzeXMuc3RkZXJyIiBpbnN0ZWFkLiBBbHNvLCB3aGVuICJfX2RlbF9fKCkiIGlzIGludm9rZWQgaW5cbiAgICAgcmVzcG9uc2UgdG8gYSBtb2R1bGUgYmVpbmcgZGVsZXRlZCAoZS5nLiwgd2hlbiBleGVjdXRpb24gb2YgdGhlXG4gICAgIHByb2dyYW0gaXMgZG9uZSksIG90aGVyIGdsb2JhbHMgcmVmZXJlbmNlZCBieSB0aGUgIl9fZGVsX18oKSJcbiAgICAgbWV0aG9kIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBkZWxldGVkIG9yIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nXG4gICAgIHRvcm4gZG93biAoZS5nLiB0aGUgaW1wb3J0IG1hY2hpbmVyeSBzaHV0dGluZyBkb3duKS4gIEZvciB0aGlzXG4gICAgIHJlYXNvbiwgIl9fZGVsX18oKSIgbWV0aG9kcyBzaG91bGQgZG8gdGhlIGFic29sdXRlIG1pbmltdW0gbmVlZGVkXG4gICAgIHRvIG1haW50YWluIGV4dGVybmFsIGludmFyaWFudHMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMS41LFxuICAgICBQeXRob24gZ3VhcmFudGVlcyB0aGF0IGdsb2JhbHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBhIHNpbmdsZVxuICAgICB1bmRlcnNjb3JlIGFyZSBkZWxldGVkIGZyb20gdGhlaXIgbW9kdWxlIGJlZm9yZSBvdGhlciBnbG9iYWxzIGFyZVxuICAgICBkZWxldGVkOyBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIHN1Y2ggZ2xvYmFscyBleGlzdCwgdGhpcyBtYXlcbiAgICAgaGVscCBpbiBhc3N1cmluZyB0aGF0IGltcG9ydGVkIG1vZHVsZXMgYXJlIHN0aWxsIGF2YWlsYWJsZSBhdCB0aGVcbiAgICAgdGltZSB3aGVuIHRoZSAiX19kZWxfXygpIiBtZXRob2QgaXMgY2FsbGVkLlxuXG5vYmplY3QuX19yZXByX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IHRoZSAicmVwcigpIiBidWlsdC1pbiBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSAib2ZmaWNpYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCB0aGlzXG4gICBzaG91bGQgbG9vayBsaWtlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjb3VsZCBiZSB1c2VkIHRvXG4gICByZWNyZWF0ZSBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZ2l2ZW4gYW4gYXBwcm9wcmlhdGVcbiAgIGVudmlyb25tZW50KS4gIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgZm9ybVxuICAgIjwuLi5zb21lIHVzZWZ1bCBkZXNjcmlwdGlvbi4uLj4iIHNob3VsZCBiZSByZXR1cm5lZC4gVGhlIHJldHVyblxuICAgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuIElmIGEgY2xhc3MgZGVmaW5lcyAiX19yZXByX18oKSIgYnV0XG4gICBub3QgIl9fc3RyX18oKSIsIHRoZW4gIl9fcmVwcl9fKCkiIGlzIGFsc28gdXNlZCB3aGVuIGFuICJpbmZvcm1hbCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyByZXF1aXJlZC5cblxuICAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgZGVidWdnaW5nLCBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGVcbiAgIHJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLlxuXG5vYmplY3QuX19zdHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgInN0cihvYmplY3QpIiBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiZm9ybWF0KCkiIGFuZFxuICAgInByaW50KCkiIHRvIGNvbXB1dGUgdGhlICJpbmZvcm1hbCIgb3IgbmljZWx5IHByaW50YWJsZSBzdHJpbmdcbiAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhICpzdHJpbmcqXG4gICBvYmplY3QuXG5cbiAgIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSAib2JqZWN0Ll9fcmVwcl9fKCkiIGluIHRoYXQgdGhlcmUgaXMgbm9cbiAgIGV4cGVjdGF0aW9uIHRoYXQgIl9fc3RyX18oKSIgcmV0dXJuIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb246IGFcbiAgIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkLlxuXG4gICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ5IHRoZSBidWlsdC1pbiB0eXBlICJvYmplY3QiXG4gICBjYWxscyAib2JqZWN0Ll9fcmVwcl9fKCkiLlxuXG5vYmplY3QuX19ieXRlc19fKHNlbGYpXG5cbiAgIENhbGxlZCBieSAiYnl0ZXMoKSIgdG8gY29tcHV0ZSBhIGJ5dGUtc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuXG4gICBvYmplY3QuIFRoaXMgc2hvdWxkIHJldHVybiBhICJieXRlcyIgb2JqZWN0LlxuXG5vYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYylcblxuICAgQ2FsbGVkIGJ5IHRoZSAiZm9ybWF0KCkiIGJ1aWx0LWluIGZ1bmN0aW9uIChhbmQgYnkgZXh0ZW5zaW9uLCB0aGVcbiAgICJzdHIuZm9ybWF0KCkiIG1ldGhvZCBvZiBjbGFzcyAic3RyIikgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiBUaGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyBhXG4gICBzdHJpbmcgdGhhdCBjb250YWlucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnNcbiAgIGRlc2lyZWQuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyB1cCB0b1xuICAgdGhlIHR5cGUgaW1wbGVtZW50aW5nICJfX2Zvcm1hdF9fKCkiLCBob3dldmVyIG1vc3QgY2xhc3NlcyB3aWxsXG4gICBlaXRoZXIgZGVsZWdhdGUgZm9ybWF0dGluZyB0byBvbmUgb2YgdGhlIGJ1aWx0LWluIHR5cGVzLCBvciB1c2UgYVxuICAgc2ltaWxhciBmb3JtYXR0aW5nIG9wdGlvbiBzeW50YXguXG5cbiAgIFNlZSAqRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlXG4gICBzdGFuZGFyZCBmb3JtYXR0aW5nIHN5bnRheC5cblxuICAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNDogVGhlIF9fZm9ybWF0X18gbWV0aG9kIG9mICJvYmplY3QiIGl0c2VsZlxuICAgcmFpc2VzIGEgIlR5cGVFcnJvciIgaWYgcGFzc2VkIGFueSBub24tZW1wdHkgc3RyaW5nLlxuXG5vYmplY3QuX19sdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbGVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19uZV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZ3RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIGFyZSB0aGUgc28tY2FsbGVkICJyaWNoIGNvbXBhcmlzb24iIG1ldGhvZHMuIFRoZVxuICAgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBvcGVyYXRvciBzeW1ib2xzIGFuZCBtZXRob2QgbmFtZXMgaXMgYXNcbiAgIGZvbGxvd3M6ICJ4PHkiIGNhbGxzICJ4Ll9fbHRfXyh5KSIsICJ4PD15IiBjYWxscyAieC5fX2xlX18oeSkiLFxuICAgIng9PXkiIGNhbGxzICJ4Ll9fZXFfXyh5KSIsICJ4IT15IiBjYWxscyAieC5fX25lX18oeSkiLCAieD55IiBjYWxsc1xuICAgInguX19ndF9fKHkpIiwgYW5kICJ4Pj15IiBjYWxscyAieC5fX2dlX18oeSkiLlxuXG4gICBBIHJpY2ggY29tcGFyaXNvbiBtZXRob2QgbWF5IHJldHVybiB0aGUgc2luZ2xldG9uICJOb3RJbXBsZW1lbnRlZCJcbiAgIGlmIGl0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciBhIGdpdmVuIHBhaXIgb2ZcbiAgIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgIkZhbHNlIiBhbmQgIlRydWUiIGFyZSByZXR1cm5lZCBmb3IgYVxuICAgc3VjY2Vzc2Z1bCBjb21wYXJpc29uLiBIb3dldmVyLCB0aGVzZSBtZXRob2RzIGNhbiByZXR1cm4gYW55IHZhbHVlLFxuICAgc28gaWYgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgdXNlZCBpbiBhIEJvb2xlYW4gY29udGV4dCAoZS5nLixcbiAgIGluIHRoZSBjb25kaXRpb24gb2YgYW4gImlmIiBzdGF0ZW1lbnQpLCBQeXRob24gd2lsbCBjYWxsICJib29sKCkiXG4gICBvbiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSBvciBmYWxzZS5cblxuICAgQnkgZGVmYXVsdCwgIl9fbmVfXygpIiBkZWxlZ2F0ZXMgdG8gIl9fZXFfXygpIiBhbmQgaW52ZXJ0cyB0aGVcbiAgIHJlc3VsdCB1bmxlc3MgaXQgaXMgIk5vdEltcGxlbWVudGVkIi4gIFRoZXJlIGFyZSBubyBvdGhlciBpbXBsaWVkXG4gICByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycywgZm9yIGV4YW1wbGUsIHRoZVxuICAgdHJ1dGggb2YgIih4PHkgb3IgeD09eSkiIGRvZXMgbm90IGltcGx5ICJ4PD15Ii4gVG8gYXV0b21hdGljYWxseVxuICAgZ2VuZXJhdGUgb3JkZXJpbmcgb3BlcmF0aW9ucyBmcm9tIGEgc2luZ2xlIHJvb3Qgb3BlcmF0aW9uLCBzZWVcbiAgICJmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKSIuXG5cbiAgIFNlZSB0aGUgcGFyYWdyYXBoIG9uICJfX2hhc2hfXygpIiBmb3Igc29tZSBpbXBvcnRhbnQgbm90ZXMgb25cbiAgIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uXG4gICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy5cblxuICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAodG8gYmUgdXNlZFxuICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0IHRoZSByaWdodFxuICAgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgIl9fbHRfXygpIiBhbmQgIl9fZ3RfXygpIiBhcmUgZWFjaCBvdGhlclwnc1xuICAgcmVmbGVjdGlvbiwgIl9fbGVfXygpIiBhbmQgIl9fZ2VfXygpIiBhcmUgZWFjaCBvdGhlclwncyByZWZsZWN0aW9uLFxuICAgYW5kICJfX2VxX18oKSIgYW5kICJfX25lX18oKSIgYXJlIHRoZWlyIG93biByZWZsZWN0aW9uLiBJZiB0aGVcbiAgIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMsIGFuZCByaWdodCBvcGVyYW5kXCdzIHR5cGUgaXMgYVxuICAgZGlyZWN0IG9yIGluZGlyZWN0IHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmRcJ3MgdHlwZSwgdGhlXG4gICByZWZsZWN0ZWQgbWV0aG9kIG9mIHRoZSByaWdodCBvcGVyYW5kIGhhcyBwcmlvcml0eSwgb3RoZXJ3aXNlIHRoZVxuICAgbGVmdCBvcGVyYW5kXCdzIG1ldGhvZCBoYXMgcHJpb3JpdHkuICBWaXJ0dWFsIHN1YmNsYXNzaW5nIGlzIG5vdFxuICAgY29uc2lkZXJlZC5cblxub2JqZWN0Ll9faGFzaF9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiAiaGFzaCgpIiBhbmQgZm9yIG9wZXJhdGlvbnMgb24gbWVtYmVyc1xuICAgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyAic2V0IiwgImZyb3plbnNldCIsIGFuZCAiZGljdCIuXG4gICAiX19oYXNoX18oKSIgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHkgcmVxdWlyZWQgcHJvcGVydHlcbiAgIGlzIHRoYXQgb2JqZWN0cyB3aGljaCBjb21wYXJlIGVxdWFsIGhhdmUgdGhlIHNhbWUgaGFzaCB2YWx1ZTsgaXQgaXNcbiAgIGFkdmlzZWQgdG8gc29tZWhvdyBtaXggdG9nZXRoZXIgKGUuZy4gdXNpbmcgZXhjbHVzaXZlIG9yKSB0aGUgaGFzaFxuICAgdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgYWxzbyBwbGF5IGEgcGFydCBpblxuICAgY29tcGFyaXNvbiBvZiBvYmplY3RzLlxuXG4gICBOb3RlOiAiaGFzaCgpIiB0cnVuY2F0ZXMgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gYW4gb2JqZWN0XCdzXG4gICAgIGN1c3RvbSAiX19oYXNoX18oKSIgbWV0aG9kIHRvIHRoZSBzaXplIG9mIGEgIlB5X3NzaXplX3QiLiAgVGhpc1xuICAgICBpcyB0eXBpY2FsbHkgOCBieXRlcyBvbiA2NC1iaXQgYnVpbGRzIGFuZCA0IGJ5dGVzIG9uIDMyLWJpdFxuICAgICBidWlsZHMuIElmIGFuIG9iamVjdFwncyAgICJfX2hhc2hfXygpIiBtdXN0IGludGVyb3BlcmF0ZSBvbiBidWlsZHNcbiAgICAgb2YgZGlmZmVyZW50IGJpdCBzaXplcywgYmUgc3VyZSB0byBjaGVjayB0aGUgd2lkdGggb24gYWxsXG4gICAgIHN1cHBvcnRlZCBidWlsZHMuICBBbiBlYXN5IHdheSB0byBkbyB0aGlzIGlzIHdpdGggInB5dGhvbiAtY1xuICAgICAiaW1wb3J0IHN5czsgcHJpbnQoc3lzLmhhc2hfaW5mby53aWR0aCkiIi5cblxuICAgSWYgYSBjbGFzcyBkb2VzIG5vdCBkZWZpbmUgYW4gIl9fZXFfXygpIiBtZXRob2QgaXQgc2hvdWxkIG5vdFxuICAgZGVmaW5lIGEgIl9faGFzaF9fKCkiIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0IGRlZmluZXMgIl9fZXFfXygpIlxuICAgYnV0IG5vdCAiX19oYXNoX18oKSIsIGl0cyBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlIGFzIGl0ZW1zIGluXG4gICBoYXNoYWJsZSBjb2xsZWN0aW9ucy4gIElmIGEgY2xhc3MgZGVmaW5lcyBtdXRhYmxlIG9iamVjdHMgYW5kXG4gICBpbXBsZW1lbnRzIGFuICJfX2VxX18oKSIgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudFxuICAgIl9faGFzaF9fKCkiLCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgaGFzaGFibGUgY29sbGVjdGlvbnNcbiAgIHJlcXVpcmVzIHRoYXQgYSBrZXlcJ3MgaGFzaCB2YWx1ZSBpcyBpbW11dGFibGUgKGlmIHRoZSBvYmplY3RcJ3MgaGFzaFxuICAgdmFsdWUgY2hhbmdlcywgaXQgd2lsbCBiZSBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuXG4gICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlICJfX2VxX18oKSIgYW5kICJfX2hhc2hfXygpIiBtZXRob2RzIGJ5XG4gICBkZWZhdWx0OyB3aXRoIHRoZW0sIGFsbCBvYmplY3RzIGNvbXBhcmUgdW5lcXVhbCAoZXhjZXB0IHdpdGhcbiAgIHRoZW1zZWx2ZXMpIGFuZCAieC5fX2hhc2hfXygpIiByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIHZhbHVlIHN1Y2hcbiAgIHRoYXQgInggPT0geSIgaW1wbGllcyBib3RoIHRoYXQgInggaXMgeSIgYW5kICJoYXNoKHgpID09IGhhc2goeSkiLlxuXG4gICBBIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgYW5kIGRvZXMgbm90IGRlZmluZSAiX19oYXNoX18oKSJcbiAgIHdpbGwgaGF2ZSBpdHMgIl9faGFzaF9fKCkiIGltcGxpY2l0bHkgc2V0IHRvICJOb25lIi4gIFdoZW4gdGhlXG4gICAiX19oYXNoX18oKSIgbWV0aG9kIG9mIGEgY2xhc3MgaXMgIk5vbmUiLCBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzXG4gICB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlICJUeXBlRXJyb3IiIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvXG4gICByZXRyaWV2ZSB0aGVpciBoYXNoIHZhbHVlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSBpZGVudGlmaWVkIGFzXG4gICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkiLlxuXG4gICBJZiBhIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgbmVlZHMgdG8gcmV0YWluIHRoZVxuICAgaW1wbGVtZW50YXRpb24gb2YgIl9faGFzaF9fKCkiIGZyb20gYSBwYXJlbnQgY2xhc3MsIHRoZSBpbnRlcnByZXRlclxuICAgbXVzdCBiZSB0b2xkIHRoaXMgZXhwbGljaXRseSBieSBzZXR0aW5nICJfX2hhc2hfXyA9XG4gICA8UGFyZW50Q2xhc3M+Ll9faGFzaF9fIi5cblxuICAgSWYgYSBjbGFzcyB0aGF0IGRvZXMgbm90IG92ZXJyaWRlICJfX2VxX18oKSIgd2lzaGVzIHRvIHN1cHByZXNzXG4gICBoYXNoIHN1cHBvcnQsIGl0IHNob3VsZCBpbmNsdWRlICJfX2hhc2hfXyA9IE5vbmUiIGluIHRoZSBjbGFzc1xuICAgZGVmaW5pdGlvbi4gQSBjbGFzcyB3aGljaCBkZWZpbmVzIGl0cyBvd24gIl9faGFzaF9fKCkiIHRoYXRcbiAgIGV4cGxpY2l0bHkgcmFpc2VzIGEgIlR5cGVFcnJvciIgd291bGQgYmUgaW5jb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgaGFzaGFibGUgYnkgYW4gImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkiIGNhbGwuXG5cbiAgIE5vdGU6IEJ5IGRlZmF1bHQsIHRoZSAiX19oYXNoX18oKSIgdmFsdWVzIG9mIHN0ciwgYnl0ZXMgYW5kXG4gICAgIGRhdGV0aW1lIG9iamVjdHMgYXJlICJzYWx0ZWQiIHdpdGggYW4gdW5wcmVkaWN0YWJsZSByYW5kb20gdmFsdWUuXG4gICAgIEFsdGhvdWdoIHRoZXkgcmVtYWluIGNvbnN0YW50IHdpdGhpbiBhbiBpbmRpdmlkdWFsIFB5dGhvblxuICAgICBwcm9jZXNzLCB0aGV5IGFyZSBub3QgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCBpbnZvY2F0aW9ucyBvZlxuICAgICBQeXRob24uVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBhIGRlbmlhbC1cbiAgICAgb2Ytc2VydmljZSBjYXVzZWQgYnkgY2FyZWZ1bGx5LWNob3NlbiBpbnB1dHMgdGhhdCBleHBsb2l0IHRoZVxuICAgICB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIG9mIGEgZGljdCBpbnNlcnRpb24sIE8obl4yKSBjb21wbGV4aXR5LlxuICAgICBTZWUgaHR0cDovL3d3dy5vY2VydC5vcmcvYWR2aXNvcmllcy9vY2VydC0yMDExLTAwMy5odG1sIGZvclxuICAgICBkZXRhaWxzLkNoYW5naW5nIGhhc2ggdmFsdWVzIGFmZmVjdHMgdGhlIGl0ZXJhdGlvbiBvcmRlciBvZlxuICAgICBkaWN0cywgc2V0cyBhbmQgb3RoZXIgbWFwcGluZ3MuICBQeXRob24gaGFzIG5ldmVyIG1hZGUgZ3VhcmFudGVlc1xuICAgICBhYm91dCB0aGlzIG9yZGVyaW5nIChhbmQgaXQgdHlwaWNhbGx5IHZhcmllcyBiZXR3ZWVuIDMyLWJpdCBhbmRcbiAgICAgNjQtYml0IGJ1aWxkcykuU2VlIGFsc28gIlBZVEhPTkhBU0hTRUVEIi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogSGFzaCByYW5kb21pemF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC5cblxub2JqZWN0Ll9fYm9vbF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluIG9wZXJhdGlvblxuICAgImJvb2woKSI7IHNob3VsZCByZXR1cm4gIkZhbHNlIiBvciAiVHJ1ZSIuICBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdFxuICAgZGVmaW5lZCwgIl9fbGVuX18oKSIgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlIG9iamVjdCBpc1xuICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gIElmIGEgY2xhc3MgZGVmaW5lc1xuICAgbmVpdGhlciAiX19sZW5fXygpIiBub3IgIl9fYm9vbF9fKCkiLCBhbGwgaXRzIGluc3RhbmNlcyBhcmVcbiAgIGNvbnNpZGVyZWQgdHJ1ZS5cblxuXG5DdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlIG1lYW5pbmcgb2ZcbmF0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgIngubmFtZSIpIGZvclxuY2xhc3MgaW5zdGFuY2VzLlxuXG5vYmplY3QuX19nZXRhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGxvb2t1cCBoYXMgbm90IGZvdW5kIHRoZSBhdHRyaWJ1dGUgaW4gdGhlXG4gICB1c3VhbCBwbGFjZXMgKGkuZS4gaXQgaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBub3IgaXMgaXQgZm91bmRcbiAgIGluIHRoZSBjbGFzcyB0cmVlIGZvciAic2VsZiIpLiAgIm5hbWUiIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZS4gVGhpc1xuICAgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4gICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi5cblxuICAgTm90ZSB0aGF0IGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQgdGhyb3VnaCB0aGUgbm9ybWFsIG1lY2hhbmlzbSxcbiAgICJfX2dldGF0dHJfXygpIiBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgYXN5bW1ldHJ5XG4gICBiZXR3ZWVuICJfX2dldGF0dHJfXygpIiBhbmQgIl9fc2V0YXR0cl9fKCkiLikgVGhpcyBpcyBkb25lIGJvdGggZm9yXG4gICBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb3RoZXJ3aXNlICJfX2dldGF0dHJfXygpIiB3b3VsZCBoYXZlXG4gICBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgTm90ZSB0aGF0IGF0XG4gICBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgY29udHJvbCBieSBub3RcbiAgIGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0XG4gICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbiAgICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgZ2V0IHRvdGFsXG4gICBjb250cm9sIG92ZXIgYXR0cmlidXRlIGFjY2Vzcy5cblxub2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlcblxuICAgQ2FsbGVkIHVuY29uZGl0aW9uYWxseSB0byBpbXBsZW1lbnQgYXR0cmlidXRlIGFjY2Vzc2VzIGZvclxuICAgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy4gSWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lcyAiX19nZXRhdHRyX18oKSIsXG4gICB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgIl9fZ2V0YXR0cmlidXRlX18oKSIgZWl0aGVyXG4gICBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhbiAiQXR0cmlidXRlRXJyb3IiLiBUaGlzIG1ldGhvZFxuICAgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW5cbiAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLiBJbiBvcmRlciB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gaW5cbiAgIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFsd2F5cyBjYWxsIHRoZSBiYXNlIGNsYXNzXG4gICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCBuZWVkcywgZm9yXG4gICBleGFtcGxlLCAib2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkiLlxuXG4gICBOb3RlOiBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nIHVwIHNwZWNpYWxcbiAgICAgbWV0aG9kcyBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhIGxhbmd1YWdlIHN5bnRheFxuICAgICBvciBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSAqU3BlY2lhbCBtZXRob2QgbG9va3VwKi5cblxub2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKVxuXG4gICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgYXNzaWdubWVudCBpcyBhdHRlbXB0ZWQuICBUaGlzIGlzIGNhbGxlZFxuICAgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIG1lY2hhbmlzbSAoaS5lLiBzdG9yZSB0aGUgdmFsdWUgaW4gdGhlXG4gICBpbnN0YW5jZSBkaWN0aW9uYXJ5KS4gKm5hbWUqIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSwgKnZhbHVlKiBpcyB0aGVcbiAgIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBJZiAiX19zZXRhdHRyX18oKSIgd2FudHMgdG8gYXNzaWduIHRvIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgaXRcbiAgIHNob3VsZCBjYWxsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUsIGZvciBleGFtcGxlLFxuICAgIm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkiLlxuXG5vYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgTGlrZSAiX19zZXRhdHRyX18oKSIgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gaW5zdGVhZCBvZlxuICAgYXNzaWdubWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgImRlbCBvYmoubmFtZSIgaXNcbiAgIG1lYW5pbmdmdWwgZm9yIHRoZSBvYmplY3QuXG5cbm9iamVjdC5fX2Rpcl9fKHNlbGYpXG5cbiAgIENhbGxlZCB3aGVuICJkaXIoKSIgaXMgY2FsbGVkIG9uIHRoZSBvYmplY3QuIEEgc2VxdWVuY2UgbXVzdCBiZVxuICAgcmV0dXJuZWQuICJkaXIoKSIgY29udmVydHMgdGhlIHJldHVybmVkIHNlcXVlbmNlIHRvIGEgbGlzdCBhbmRcbiAgIHNvcnRzIGl0LlxuXG5cbkltcGxlbWVudGluZyBEZXNjcmlwdG9yc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzXG5jb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgYXBwZWFycyBpbiBhblxuKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlIG93bmVyXCdzIGNsYXNzXG5kaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzIHBhcmVudHMpLiAgSW4gdGhlXG5leGFtcGxlcyBiZWxvdywgInRoZSBhdHRyaWJ1dGUiIHJlZmVycyB0byB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXNcbnRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBvd25lciBjbGFzc1wnICJfX2RpY3RfXyIuXG5cbm9iamVjdC5fX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcilcblxuICAgQ2FsbGVkIHRvIGdldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBvd25lciBjbGFzcyAoY2xhc3MgYXR0cmlidXRlXG4gICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlIGF0dHJpYnV0ZVxuICAgYWNjZXNzKS4gKm93bmVyKiBpcyBhbHdheXMgdGhlIG93bmVyIGNsYXNzLCB3aGlsZSAqaW5zdGFuY2UqIGlzIHRoZVxuICAgaW5zdGFuY2UgdGhhdCB0aGUgYXR0cmlidXRlIHdhcyBhY2Nlc3NlZCB0aHJvdWdoLCBvciAiTm9uZSIgd2hlblxuICAgdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLiAgVGhpcyBtZXRob2Qgc2hvdWxkXG4gICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuICJBdHRyaWJ1dGVFcnJvciJcbiAgIGV4Y2VwdGlvbi5cblxub2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUgb3duZXJcbiAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLlxuXG5vYmplY3QuX19kZWxldGVfXyhzZWxmLCBpbnN0YW5jZSlcblxuICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlXG4gICBvd25lciBjbGFzcy5cblxuVGhlIGF0dHJpYnV0ZSAiX19vYmpjbGFzc19fIiBpcyBpbnRlcnByZXRlZCBieSB0aGUgImluc3BlY3QiIG1vZHVsZSBhc1xuc3BlY2lmeWluZyB0aGUgY2xhc3Mgd2hlcmUgdGhpcyBvYmplY3Qgd2FzIGRlZmluZWQgKHNldHRpbmcgdGhpc1xuYXBwcm9wcmlhdGVseSBjYW4gYXNzaXN0IGluIHJ1bnRpbWUgaW50cm9zcGVjdGlvbiBvZiBkeW5hbWljIGNsYXNzXG5hdHRyaWJ1dGVzKS4gRm9yIGNhbGxhYmxlcywgaXQgbWF5IGluZGljYXRlIHRoYXQgYW4gaW5zdGFuY2Ugb2YgdGhlXG5naXZlbiB0eXBlIChvciBhIHN1YmNsYXNzKSBpcyBleHBlY3RlZCBvciByZXF1aXJlZCBhcyB0aGUgZmlyc3RcbnBvc2l0aW9uYWwgYXJndW1lbnQgKGZvciBleGFtcGxlLCBDUHl0aG9uIHNldHMgdGhpcyBhdHRyaWJ1dGUgZm9yXG51bmJvdW5kIG1ldGhvZHMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gQykuXG5cblxuSW52b2tpbmcgRGVzY3JpcHRvcnNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkluIGdlbmVyYWwsIGEgZGVzY3JpcHRvciBpcyBhbiBvYmplY3QgYXR0cmlidXRlIHdpdGggImJpbmRpbmdcbmJlaGF2aW9yIiwgb25lIHdob3NlIGF0dHJpYnV0ZSBhY2Nlc3MgaGFzIGJlZW4gb3ZlcnJpZGRlbiBieSBtZXRob2RzXG5pbiB0aGUgZGVzY3JpcHRvciBwcm90b2NvbDogICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiwgYW5kXG4iX19kZWxldGVfXygpIi4gSWYgYW55IG9mIHRob3NlIG1ldGhvZHMgYXJlIGRlZmluZWQgZm9yIGFuIG9iamVjdCwgaXRcbmlzIHNhaWQgdG8gYmUgYSBkZXNjcmlwdG9yLlxuXG5UaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYXR0cmlidXRlIGFjY2VzcyBpcyB0byBnZXQsIHNldCwgb3IgZGVsZXRlXG50aGUgYXR0cmlidXRlIGZyb20gYW4gb2JqZWN0XCdzIGRpY3Rpb25hcnkuIEZvciBpbnN0YW5jZSwgImEueCIgaGFzIGFcbmxvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoICJhLl9fZGljdF9fW1wneFwnXSIsIHRoZW5cbiJ0eXBlKGEpLl9fZGljdF9fW1wneFwnXSIsIGFuZCBjb250aW51aW5nIHRocm91Z2ggdGhlIGJhc2UgY2xhc3NlcyBvZlxuInR5cGUoYSkiIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy5cblxuSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mIHRoZVxuZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kXG5pbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyBpbiB0aGVcbnByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSBkZWZpbmVkIGFuZFxuaG93IHRoZXkgd2VyZSBjYWxsZWQuXG5cblRoZSBzdGFydGluZyBwb2ludCBmb3IgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGlzIGEgYmluZGluZywgImEueCIuIEhvd1xudGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gImEiOlxuXG5EaXJlY3QgQ2FsbFxuICAgVGhlIHNpbXBsZXN0IGFuZCBsZWFzdCBjb21tb24gY2FsbCBpcyB3aGVuIHVzZXIgY29kZSBkaXJlY3RseVxuICAgaW52b2tlcyBhIGRlc2NyaXB0b3IgbWV0aG9kOiAgICAieC5fX2dldF9fKGEpIi5cblxuSW5zdGFuY2UgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhbiBvYmplY3QgaW5zdGFuY2UsICJhLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlXG4gICBjYWxsOiAidHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhhLCB0eXBlKGEpKSIuXG5cbkNsYXNzIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYSBjbGFzcywgIkEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgY2FsbDpcbiAgICJBLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKE5vbmUsIEEpIi5cblxuU3VwZXIgQmluZGluZ1xuICAgSWYgImEiIGlzIGFuIGluc3RhbmNlIG9mICJzdXBlciIsIHRoZW4gdGhlIGJpbmRpbmcgInN1cGVyKEIsXG4gICBvYmopLm0oKSIgc2VhcmNoZXMgIm9iai5fX2NsYXNzX18uX19tcm9fXyIgZm9yIHRoZSBiYXNlIGNsYXNzICJBIlxuICAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nICJCIiBhbmQgdGhlbiBpbnZva2VzIHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlXG4gICBjYWxsOiAiQS5fX2RpY3RfX1tcJ21cJ10uX19nZXRfXyhvYmosIG9iai5fX2NsYXNzX18pIi5cblxuRm9yIGluc3RhbmNlIGJpbmRpbmdzLCB0aGUgcHJlY2VkZW5jZSBvZiBkZXNjcmlwdG9yIGludm9jYXRpb24gZGVwZW5kc1xub24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciBjYW4gZGVmaW5lXG5hbnkgY29tYmluYXRpb24gb2YgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiIGFuZCAiX19kZWxldGVfXygpIi4gIElmIGl0XG5kb2VzIG5vdCBkZWZpbmUgIl9fZ2V0X18oKSIsIHRoZW4gYWNjZXNzaW5nIHRoZSBhdHRyaWJ1dGUgd2lsbCByZXR1cm5cbnRoZSBkZXNjcmlwdG9yIG9iamVjdCBpdHNlbGYgdW5sZXNzIHRoZXJlIGlzIGEgdmFsdWUgaW4gdGhlIG9iamVjdFwnc1xuaW5zdGFuY2UgZGljdGlvbmFyeS4gIElmIHRoZSBkZXNjcmlwdG9yIGRlZmluZXMgIl9fc2V0X18oKSIgYW5kL29yXG4iX19kZWxldGVfXygpIiwgaXQgaXMgYSBkYXRhIGRlc2NyaXB0b3I7IGlmIGl0IGRlZmluZXMgbmVpdGhlciwgaXQgaXNcbmEgbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzIGRlZmluZSBib3RoXG4iX19nZXRfXygpIiBhbmQgIl9fc2V0X18oKSIsIHdoaWxlIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGhhdmUganVzdCB0aGVcbiJfX2dldF9fKCkiIG1ldGhvZC4gIERhdGEgZGVzY3JpcHRvcnMgd2l0aCAiX19zZXRfXygpIiBhbmQgIl9fZ2V0X18oKSJcbmRlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uIGluIGFuIGluc3RhbmNlIGRpY3Rpb25hcnkuICBJblxuY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGluc3RhbmNlcy5cblxuUHl0aG9uIG1ldGhvZHMgKGluY2x1ZGluZyAic3RhdGljbWV0aG9kKCkiIGFuZCAiY2xhc3NtZXRob2QoKSIpIGFyZVxuaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhblxucmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsIGluc3RhbmNlcyB0b1xuYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2xhc3MuXG5cblRoZSAicHJvcGVydHkoKSIgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhIGRlc2NyaXB0b3IuXG5BY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhbm5vdCBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgYSBwcm9wZXJ0eS5cblxuXG5fX3Nsb3RzX19cbi0tLS0tLS0tLVxuXG5CeSBkZWZhdWx0LCBpbnN0YW5jZXMgb2YgY2xhc3NlcyBoYXZlIGEgZGljdGlvbmFyeSBmb3IgYXR0cmlidXRlXG5zdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHMgaGF2aW5nIHZlcnkgZmV3IGluc3RhbmNlXG52YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZSBhY3V0ZSB3aGVuIGNyZWF0aW5nIGxhcmdlXG5udW1iZXJzIG9mIGluc3RhbmNlcy5cblxuVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgKl9fc2xvdHNfXyogaW4gYSBjbGFzc1xuZGVmaW5pdGlvbi4gVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2YgaW5zdGFuY2VcbnZhcmlhYmxlcyBhbmQgcmVzZXJ2ZXMganVzdCBlbm91Z2ggc3BhY2UgaW4gZWFjaCBpbnN0YW5jZSB0byBob2xkIGFcbnZhbHVlIGZvciBlYWNoIHZhcmlhYmxlLiAgU3BhY2UgaXMgc2F2ZWQgYmVjYXVzZSAqX19kaWN0X18qIGlzIG5vdFxuY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS5cblxub2JqZWN0Ll9fc2xvdHNfX1xuXG4gICBUaGlzIGNsYXNzIHZhcmlhYmxlIGNhbiBiZSBhc3NpZ25lZCBhIHN0cmluZywgaXRlcmFibGUsIG9yIHNlcXVlbmNlXG4gICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICAqX19zbG90c19fKlxuICAgcmVzZXJ2ZXMgc3BhY2UgZm9yIHRoZSBkZWNsYXJlZCB2YXJpYWJsZXMgYW5kIHByZXZlbnRzIHRoZVxuICAgYXV0b21hdGljIGNyZWF0aW9uIG9mICpfX2RpY3RfXyogYW5kICpfX3dlYWtyZWZfXyogZm9yIGVhY2hcbiAgIGluc3RhbmNlLlxuXG5cbk5vdGVzIG9uIHVzaW5nICpfX3Nsb3RzX18qXG5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+flxuXG4qIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICpfX2RpY3RfXypcbiAgYXR0cmlidXRlIG9mIHRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZSwgc28gYSAqX19zbG90c19fKlxuICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy5cblxuKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSBhc3NpZ25lZCBuZXdcbiAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICBBdHRlbXB0cyB0b1xuICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgIkF0dHJpYnV0ZUVycm9yIi4gSWZcbiAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGRcbiAgIlwnX19kaWN0X19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qXG4gIGRlY2xhcmF0aW9uLlxuXG4qIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCBjbGFzc2VzXG4gIGRlZmluaW5nICpfX3Nsb3RzX18qIGRvIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyB0byBpdHNcbiAgaW5zdGFuY2VzLiBJZiB3ZWFrIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGRcbiAgIlwnX193ZWFrcmVmX19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qXG4gIGRlY2xhcmF0aW9uLlxuXG4qICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgY3JlYXRpbmdcbiAgZGVzY3JpcHRvcnMgKCpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqKSBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXNcbiAgYSByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvclxuICBpbnN0YW5jZSB2YXJpYWJsZXMgZGVmaW5lZCBieSAqX19zbG90c19fKjsgb3RoZXJ3aXNlLCB0aGUgY2xhc3NcbiAgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZGVzY3JpcHRvciBhc3NpZ25tZW50LlxuXG4qIFRoZSBhY3Rpb24gb2YgYSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzc1xuICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgQXMgYSByZXN1bHQsIHN1YmNsYXNzZXMgd2lsbCBoYXZlIGEgKl9fZGljdF9fKlxuICB1bmxlc3MgdGhleSBhbHNvIGRlZmluZSAqX19zbG90c19fKiAod2hpY2ggbXVzdCBvbmx5IGNvbnRhaW4gbmFtZXNcbiAgb2YgYW55ICphZGRpdGlvbmFsKiBzbG90cykuXG5cbiogSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLCB0aGVcbiAgaW5zdGFuY2UgdmFyaWFibGUgZGVmaW5lZCBieSB0aGUgYmFzZSBjbGFzcyBzbG90IGlzIGluYWNjZXNzaWJsZVxuICAoZXhjZXB0IGJ5IHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgYmFzZSBjbGFzcykuXG4gIFRoaXMgcmVuZGVycyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSB1bmRlZmluZWQuICBJbiB0aGUgZnV0dXJlLCBhXG4gIGNoZWNrIG1heSBiZSBhZGRlZCB0byBwcmV2ZW50IHRoaXMuXG5cbiogTm9uZW1wdHkgKl9fc2xvdHNfXyogZG9lcyBub3Qgd29yayBmb3IgY2xhc3NlcyBkZXJpdmVkIGZyb21cbiAgInZhcmlhYmxlLWxlbmd0aCIgYnVpbHQtaW4gdHlwZXMgc3VjaCBhcyAiaW50IiwgImJ5dGVzIiBhbmQgInR1cGxlIi5cblxuKiBBbnkgbm9uLXN0cmluZyBpdGVyYWJsZSBtYXkgYmUgYXNzaWduZWQgdG8gKl9fc2xvdHNfXyouIE1hcHBpbmdzXG4gIG1heSBhbHNvIGJlIHVzZWQ7IGhvd2V2ZXIsIGluIHRoZSBmdXR1cmUsIHNwZWNpYWwgbWVhbmluZyBtYXkgYmVcbiAgYXNzaWduZWQgdG8gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2gga2V5LlxuXG4qICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgd29ya3Mgb25seSBpZiBib3RoIGNsYXNzZXMgaGF2ZSB0aGUgc2FtZVxuICAqX19zbG90c19fKi5cblxuXG5DdXN0b21pemluZyBjbGFzcyBjcmVhdGlvblxuPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQnkgZGVmYXVsdCwgY2xhc3NlcyBhcmUgY29uc3RydWN0ZWQgdXNpbmcgInR5cGUoKSIuIFRoZSBjbGFzcyBib2R5IGlzXG5leGVjdXRlZCBpbiBhIG5ldyBuYW1lc3BhY2UgYW5kIHRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIGxvY2FsbHkgdG8gdGhlXG5yZXN1bHQgb2YgInR5cGUobmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkiLlxuXG5UaGUgY2xhc3MgY3JlYXRpb24gcHJvY2VzcyBjYW4gYmUgY3VzdG9taXNlZCBieSBwYXNzaW5nIHRoZVxuIm1ldGFjbGFzcyIga2V5d29yZCBhcmd1bWVudCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBsaW5lLCBvciBieVxuaW5oZXJpdGluZyBmcm9tIGFuIGV4aXN0aW5nIGNsYXNzIHRoYXQgaW5jbHVkZWQgc3VjaCBhbiBhcmd1bWVudC4gSW5cbnRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgYm90aCAiTXlDbGFzcyIgYW5kICJNeVN1YmNsYXNzIiBhcmUgaW5zdGFuY2VzXG5vZiAiTWV0YSI6XG5cbiAgIGNsYXNzIE1ldGEodHlwZSk6XG4gICAgICAgcGFzc1xuXG4gICBjbGFzcyBNeUNsYXNzKG1ldGFjbGFzcz1NZXRhKTpcbiAgICAgICBwYXNzXG5cbiAgIGNsYXNzIE15U3ViY2xhc3MoTXlDbGFzcyk6XG4gICAgICAgcGFzc1xuXG5Bbnkgb3RoZXIga2V5d29yZCBhcmd1bWVudHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uXG5hcmUgcGFzc2VkIHRocm91Z2ggdG8gYWxsIG1ldGFjbGFzcyBvcGVyYXRpb25zIGRlc2NyaWJlZCBiZWxvdy5cblxuV2hlbiBhIGNsYXNzIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQsIHRoZSBmb2xsb3dpbmcgc3RlcHMgb2NjdXI6XG5cbiogdGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBpcyBkZXRlcm1pbmVkXG5cbiogdGhlIGNsYXNzIG5hbWVzcGFjZSBpcyBwcmVwYXJlZFxuXG4qIHRoZSBjbGFzcyBib2R5IGlzIGV4ZWN1dGVkXG5cbiogdGhlIGNsYXNzIG9iamVjdCBpcyBjcmVhdGVkXG5cblxuRGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGZvciBhIGNsYXNzIGRlZmluaXRpb24gaXMgZGV0ZXJtaW5lZCBhc1xuZm9sbG93czpcblxuKiBpZiBubyBiYXNlcyBhbmQgbm8gZXhwbGljaXQgbWV0YWNsYXNzIGFyZSBnaXZlbiwgdGhlbiAidHlwZSgpIiBpc1xuICB1c2VkXG5cbiogaWYgYW4gZXhwbGljaXQgbWV0YWNsYXNzIGlzIGdpdmVuIGFuZCBpdCBpcyAqbm90KiBhbiBpbnN0YW5jZSBvZlxuICAidHlwZSgpIiwgdGhlbiBpdCBpcyB1c2VkIGRpcmVjdGx5IGFzIHRoZSBtZXRhY2xhc3NcblxuKiBpZiBhbiBpbnN0YW5jZSBvZiAidHlwZSgpIiBpcyBnaXZlbiBhcyB0aGUgZXhwbGljaXQgbWV0YWNsYXNzLCBvclxuICBiYXNlcyBhcmUgZGVmaW5lZCwgdGhlbiB0aGUgbW9zdCBkZXJpdmVkIG1ldGFjbGFzcyBpcyB1c2VkXG5cblRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzIHNlbGVjdGVkIGZyb20gdGhlIGV4cGxpY2l0bHkgc3BlY2lmaWVkXG5tZXRhY2xhc3MgKGlmIGFueSkgYW5kIHRoZSBtZXRhY2xhc3NlcyAoaS5lLiAidHlwZShjbHMpIikgb2YgYWxsXG5zcGVjaWZpZWQgYmFzZSBjbGFzc2VzLiBUaGUgbW9zdCBkZXJpdmVkIG1ldGFjbGFzcyBpcyBvbmUgd2hpY2ggaXMgYVxuc3VidHlwZSBvZiAqYWxsKiBvZiB0aGVzZSBjYW5kaWRhdGUgbWV0YWNsYXNzZXMuIElmIG5vbmUgb2YgdGhlXG5jYW5kaWRhdGUgbWV0YWNsYXNzZXMgbWVldHMgdGhhdCBjcml0ZXJpb24sIHRoZW4gdGhlIGNsYXNzIGRlZmluaXRpb25cbndpbGwgZmFpbCB3aXRoICJUeXBlRXJyb3IiLlxuXG5cblByZXBhcmluZyB0aGUgY2xhc3MgbmFtZXNwYWNlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5PbmNlIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgaGFzIGJlZW4gaWRlbnRpZmllZCwgdGhlbiB0aGUgY2xhc3Ncbm5hbWVzcGFjZSBpcyBwcmVwYXJlZC4gSWYgdGhlIG1ldGFjbGFzcyBoYXMgYSAiX19wcmVwYXJlX18iIGF0dHJpYnV0ZSxcbml0IGlzIGNhbGxlZCBhcyAibmFtZXNwYWNlID0gbWV0YWNsYXNzLl9fcHJlcGFyZV9fKG5hbWUsIGJhc2VzLFxuKiprd2RzKSIgKHdoZXJlIHRoZSBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzLCBpZiBhbnksIGNvbWUgZnJvbVxudGhlIGNsYXNzIGRlZmluaXRpb24pLlxuXG5JZiB0aGUgbWV0YWNsYXNzIGhhcyBubyAiX19wcmVwYXJlX18iIGF0dHJpYnV0ZSwgdGhlbiB0aGUgY2xhc3Ncbm5hbWVzcGFjZSBpcyBpbml0aWFsaXNlZCBhcyBhbiBlbXB0eSAiZGljdCgpIiBpbnN0YW5jZS5cblxuU2VlIGFsc286ICoqUEVQIDMxMTUqKiAtIE1ldGFjbGFzc2VzIGluIFB5dGhvbiAzMDAwXG5cbiAgICAgSW50cm9kdWNlZCB0aGUgIl9fcHJlcGFyZV9fIiBuYW1lc3BhY2UgaG9va1xuXG5cbkV4ZWN1dGluZyB0aGUgY2xhc3MgYm9keVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBjbGFzcyBib2R5IGlzIGV4ZWN1dGVkIChhcHByb3hpbWF0ZWx5KSBhcyAiZXhlYyhib2R5LCBnbG9iYWxzKCksXG5uYW1lc3BhY2UpIi4gVGhlIGtleSBkaWZmZXJlbmNlIGZyb20gYSBub3JtYWwgY2FsbCB0byAiZXhlYygpIiBpcyB0aGF0XG5sZXhpY2FsIHNjb3BpbmcgYWxsb3dzIHRoZSBjbGFzcyBib2R5IChpbmNsdWRpbmcgYW55IG1ldGhvZHMpIHRvXG5yZWZlcmVuY2UgbmFtZXMgZnJvbSB0aGUgY3VycmVudCBhbmQgb3V0ZXIgc2NvcGVzIHdoZW4gdGhlIGNsYXNzXG5kZWZpbml0aW9uIG9jY3VycyBpbnNpZGUgYSBmdW5jdGlvbi5cblxuSG93ZXZlciwgZXZlbiB3aGVuIHRoZSBjbGFzcyBkZWZpbml0aW9uIG9jY3VycyBpbnNpZGUgdGhlIGZ1bmN0aW9uLFxubWV0aG9kcyBkZWZpbmVkIGluc2lkZSB0aGUgY2xhc3Mgc3RpbGwgY2Fubm90IHNlZSBuYW1lcyBkZWZpbmVkIGF0IHRoZVxuY2xhc3Mgc2NvcGUuIENsYXNzIHZhcmlhYmxlcyBtdXN0IGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGZpcnN0XG5wYXJhbWV0ZXIgb2YgaW5zdGFuY2Ugb3IgY2xhc3MgbWV0aG9kcywgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBhdCBhbGxcbmZyb20gc3RhdGljIG1ldGhvZHMuXG5cblxuQ3JlYXRpbmcgdGhlIGNsYXNzIG9iamVjdFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5PbmNlIHRoZSBjbGFzcyBuYW1lc3BhY2UgaGFzIGJlZW4gcG9wdWxhdGVkIGJ5IGV4ZWN1dGluZyB0aGUgY2xhc3NcbmJvZHksIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZCBieSBjYWxsaW5nICJtZXRhY2xhc3MobmFtZSwgYmFzZXMsXG5uYW1lc3BhY2UsICoqa3dkcykiICh0aGUgYWRkaXRpb25hbCBrZXl3b3JkcyBwYXNzZWQgaGVyZSBhcmUgdGhlIHNhbWVcbmFzIHRob3NlIHBhc3NlZCB0byAiX19wcmVwYXJlX18iKS5cblxuVGhpcyBjbGFzcyBvYmplY3QgaXMgdGhlIG9uZSB0aGF0IHdpbGwgYmUgcmVmZXJlbmNlZCBieSB0aGUgemVyby1cbmFyZ3VtZW50IGZvcm0gb2YgInN1cGVyKCkiLiAiX19jbGFzc19fIiBpcyBhbiBpbXBsaWNpdCBjbG9zdXJlXG5yZWZlcmVuY2UgY3JlYXRlZCBieSB0aGUgY29tcGlsZXIgaWYgYW55IG1ldGhvZHMgaW4gYSBjbGFzcyBib2R5IHJlZmVyXG50byBlaXRoZXIgIl9fY2xhc3NfXyIgb3IgInN1cGVyIi4gVGhpcyBhbGxvd3MgdGhlIHplcm8gYXJndW1lbnQgZm9ybVxub2YgInN1cGVyKCkiIHRvIGNvcnJlY3RseSBpZGVudGlmeSB0aGUgY2xhc3MgYmVpbmcgZGVmaW5lZCBiYXNlZCBvblxubGV4aWNhbCBzY29waW5nLCB3aGlsZSB0aGUgY2xhc3Mgb3IgaW5zdGFuY2UgdGhhdCB3YXMgdXNlZCB0byBtYWtlIHRoZVxuY3VycmVudCBjYWxsIGlzIGlkZW50aWZpZWQgYmFzZWQgb24gdGhlIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byB0aGVcbm1ldGhvZC5cblxuQWZ0ZXIgdGhlIGNsYXNzIG9iamVjdCBpcyBjcmVhdGVkLCBpdCBpcyBwYXNzZWQgdG8gdGhlIGNsYXNzXG5kZWNvcmF0b3JzIGluY2x1ZGVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIChpZiBhbnkpIGFuZCB0aGUgcmVzdWx0aW5nXG5vYmplY3QgaXMgYm91bmQgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBhcyB0aGUgZGVmaW5lZCBjbGFzcy5cblxuV2hlbiBhIG5ldyBjbGFzcyBpcyBjcmVhdGVkIGJ5ICJ0eXBlLl9fbmV3X18iLCB0aGUgb2JqZWN0IHByb3ZpZGVkIGFzXG50aGUgbmFtZXNwYWNlIHBhcmFtZXRlciBpcyBjb3BpZWQgdG8gYSBzdGFuZGFyZCBQeXRob24gZGljdGlvbmFyeSBhbmRcbnRoZSBvcmlnaW5hbCBvYmplY3QgaXMgZGlzY2FyZGVkLiBUaGUgbmV3IGNvcHkgYmVjb21lcyB0aGUgIl9fZGljdF9fIlxuYXR0cmlidXRlIG9mIHRoZSBjbGFzcyBvYmplY3QuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTM1KiogLSBOZXcgc3VwZXJcblxuICAgICBEZXNjcmliZXMgdGhlIGltcGxpY2l0ICJfX2NsYXNzX18iIGNsb3N1cmUgcmVmZXJlbmNlXG5cblxuTWV0YWNsYXNzIGV4YW1wbGVcbi0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBwb3RlbnRpYWwgdXNlcyBmb3IgbWV0YWNsYXNzZXMgYXJlIGJvdW5kbGVzcy4gU29tZSBpZGVhcyB0aGF0IGhhdmVcbmJlZW4gZXhwbG9yZWQgaW5jbHVkZSBsb2dnaW5nLCBpbnRlcmZhY2UgY2hlY2tpbmcsIGF1dG9tYXRpY1xuZGVsZWdhdGlvbiwgYXV0b21hdGljIHByb3BlcnR5IGNyZWF0aW9uLCBwcm94aWVzLCBmcmFtZXdvcmtzLCBhbmRcbmF1dG9tYXRpYyByZXNvdXJjZSBsb2NraW5nL3N5bmNocm9uaXphdGlvbi5cblxuSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgbWV0YWNsYXNzIHRoYXQgdXNlcyBhblxuImNvbGxlY3Rpb25zLk9yZGVyZWREaWN0IiB0byByZW1lbWJlciB0aGUgb3JkZXIgdGhhdCBjbGFzcyB2YXJpYWJsZXNcbmFyZSBkZWZpbmVkOlxuXG4gICBjbGFzcyBPcmRlcmVkQ2xhc3ModHlwZSk6XG5cbiAgICAgICBAY2xhc3NtZXRob2RcbiAgICAgICBkZWYgX19wcmVwYXJlX18obWV0YWNscywgbmFtZSwgYmFzZXMsICoqa3dkcyk6XG4gICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCgpXG5cbiAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UsICoqa3dkcyk6XG4gICAgICAgICAgIHJlc3VsdCA9IHR5cGUuX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBkaWN0KG5hbWVzcGFjZSkpXG4gICAgICAgICAgIHJlc3VsdC5tZW1iZXJzID0gdHVwbGUobmFtZXNwYWNlKVxuICAgICAgICAgICByZXR1cm4gcmVzdWx0XG5cbiAgIGNsYXNzIEEobWV0YWNsYXNzPU9yZGVyZWRDbGFzcyk6XG4gICAgICAgZGVmIG9uZShzZWxmKTogcGFzc1xuICAgICAgIGRlZiB0d28oc2VsZik6IHBhc3NcbiAgICAgICBkZWYgdGhyZWUoc2VsZik6IHBhc3NcbiAgICAgICBkZWYgZm91cihzZWxmKTogcGFzc1xuXG4gICA+Pj4gQS5tZW1iZXJzXG4gICAoXCdfX21vZHVsZV9fXCcsIFwnb25lXCcsIFwndHdvXCcsIFwndGhyZWVcJywgXCdmb3VyXCcpXG5cbldoZW4gdGhlIGNsYXNzIGRlZmluaXRpb24gZm9yICpBKiBnZXRzIGV4ZWN1dGVkLCB0aGUgcHJvY2VzcyBiZWdpbnNcbndpdGggY2FsbGluZyB0aGUgbWV0YWNsYXNzXCdzICJfX3ByZXBhcmVfXygpIiBtZXRob2Qgd2hpY2ggcmV0dXJucyBhblxuZW1wdHkgImNvbGxlY3Rpb25zLk9yZGVyZWREaWN0Ii4gIFRoYXQgbWFwcGluZyByZWNvcmRzIHRoZSBtZXRob2RzIGFuZFxuYXR0cmlidXRlcyBvZiAqQSogYXMgdGhleSBhcmUgZGVmaW5lZCB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIGNsYXNzXG5zdGF0ZW1lbnQuIE9uY2UgdGhvc2UgZGVmaW5pdGlvbnMgYXJlIGV4ZWN1dGVkLCB0aGUgb3JkZXJlZCBkaWN0aW9uYXJ5XG5pcyBmdWxseSBwb3B1bGF0ZWQgYW5kIHRoZSBtZXRhY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kIGdldHNcbmludm9rZWQuICBUaGF0IG1ldGhvZCBidWlsZHMgdGhlIG5ldyB0eXBlIGFuZCBpdCBzYXZlcyB0aGUgb3JkZXJlZFxuZGljdGlvbmFyeSBrZXlzIGluIGFuIGF0dHJpYnV0ZSBjYWxsZWQgIm1lbWJlcnMiLlxuXG5cbkN1c3RvbWl6aW5nIGluc3RhbmNlIGFuZCBzdWJjbGFzcyBjaGVja3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZVxuImlzaW5zdGFuY2UoKSIgYW5kICJpc3N1YmNsYXNzKCkiIGJ1aWx0LWluIGZ1bmN0aW9ucy5cblxuSW4gcGFydGljdWxhciwgdGhlIG1ldGFjbGFzcyAiYWJjLkFCQ01ldGEiIGltcGxlbWVudHMgdGhlc2UgbWV0aG9kcyBpblxub3JkZXIgdG8gYWxsb3cgdGhlIGFkZGl0aW9uIG9mIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoQUJDcykgYXNcbiJ2aXJ0dWFsIGJhc2UgY2xhc3NlcyIgdG8gYW55IGNsYXNzIG9yIHR5cGUgKGluY2x1ZGluZyBidWlsdC1pblxudHlwZXMpLCBpbmNsdWRpbmcgb3RoZXIgQUJDcy5cblxuY2xhc3MuX19pbnN0YW5jZWNoZWNrX18oc2VsZiwgaW5zdGFuY2UpXG5cbiAgIFJldHVybiB0cnVlIGlmICppbnN0YW5jZSogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAoZGlyZWN0IG9yXG4gICBpbmRpcmVjdCkgaW5zdGFuY2Ugb2YgKmNsYXNzKi4gSWYgZGVmaW5lZCwgY2FsbGVkIHRvIGltcGxlbWVudFxuICAgImlzaW5zdGFuY2UoaW5zdGFuY2UsIGNsYXNzKSIuXG5cbmNsYXNzLl9fc3ViY2xhc3NjaGVja19fKHNlbGYsIHN1YmNsYXNzKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiAqc3ViY2xhc3MqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCBvclxuICAgaW5kaXJlY3QpIHN1YmNsYXNzIG9mICpjbGFzcyouICBJZiBkZWZpbmVkLCBjYWxsZWQgdG8gaW1wbGVtZW50XG4gICAiaXNzdWJjbGFzcyhzdWJjbGFzcywgY2xhc3MpIi5cblxuTm90ZSB0aGF0IHRoZXNlIG1ldGhvZHMgYXJlIGxvb2tlZCB1cCBvbiB0aGUgdHlwZSAobWV0YWNsYXNzKSBvZiBhXG5jbGFzcy4gIFRoZXkgY2Fubm90IGJlIGRlZmluZWQgYXMgY2xhc3MgbWV0aG9kcyBpbiB0aGUgYWN0dWFsIGNsYXNzLlxuVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGxvb2t1cCBvZiBzcGVjaWFsIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkXG5vbiBpbnN0YW5jZXMsIG9ubHkgaW4gdGhpcyBjYXNlIHRoZSBpbnN0YW5jZSBpcyBpdHNlbGYgYSBjbGFzcy5cblxuU2VlIGFsc286ICoqUEVQIDMxMTkqKiAtIEludHJvZHVjaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3Nlc1xuXG4gICAgIEluY2x1ZGVzIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBjdXN0b21pemluZyAiaXNpbnN0YW5jZSgpIiBhbmRcbiAgICAgImlzc3ViY2xhc3MoKSIgYmVoYXZpb3IgdGhyb3VnaCAiX19pbnN0YW5jZWNoZWNrX18oKSIgYW5kXG4gICAgICJfX3N1YmNsYXNzY2hlY2tfXygpIiwgd2l0aCBtb3RpdmF0aW9uIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHkgaW5cbiAgICAgdGhlIGNvbnRleHQgb2YgYWRkaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoc2VlIHRoZSAiYWJjIlxuICAgICBtb2R1bGUpIHRvIHRoZSBsYW5ndWFnZS5cblxuXG5FbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xuPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxub2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSlcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmIHRoaXMgbWV0aG9kXG4gICBpcyBkZWZpbmVkLCAieChhcmcxLCBhcmcyLCAuLi4pIiBpcyBhIHNob3J0aGFuZCBmb3JcbiAgICJ4Ll9fY2FsbF9fKGFyZzEsIGFyZzIsIC4uLikiLlxuXG5cbkVtdWxhdGluZyBjb250YWluZXIgdHlwZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCBjb250YWluZXIgb2JqZWN0cy5cbkNvbnRhaW5lcnMgdXN1YWxseSBhcmUgc2VxdWVuY2VzIChzdWNoIGFzIGxpc3RzIG9yIHR1cGxlcykgb3IgbWFwcGluZ3NcbihsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgd2VsbC4gIFRoZVxuZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIG9yIHRvXG5lbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgdGhlXG5hbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggIjAgPD0gayA8IE4iIHdoZXJlXG4qTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoIGRlZmluZSBhXG5yYW5nZSBvZiBpdGVtcy4gIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdGhhdCBtYXBwaW5ncyBwcm92aWRlIHRoZVxubWV0aG9kcyAia2V5cygpIiwgInZhbHVlcygpIiwgIml0ZW1zKCkiLCAiZ2V0KCkiLCAiY2xlYXIoKSIsXG4ic2V0ZGVmYXVsdCgpIiwgInBvcCgpIiwgInBvcGl0ZW0oKSIsICJjb3B5KCkiLCBhbmQgInVwZGF0ZSgpIlxuYmVoYXZpbmcgc2ltaWxhciB0byB0aG9zZSBmb3IgUHl0aG9uXCdzIHN0YW5kYXJkIGRpY3Rpb25hcnkgb2JqZWN0cy5cblRoZSAiY29sbGVjdGlvbnMiIG1vZHVsZSBwcm92aWRlcyBhICJNdXRhYmxlTWFwcGluZyIgYWJzdHJhY3QgYmFzZVxuY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2YgIl9fZ2V0aXRlbV9fKCkiLFxuIl9fc2V0aXRlbV9fKCkiLCAiX19kZWxpdGVtX18oKSIsIGFuZCAia2V5cygpIi4gTXV0YWJsZSBzZXF1ZW5jZXNcbnNob3VsZCBwcm92aWRlIG1ldGhvZHMgImFwcGVuZCgpIiwgImNvdW50KCkiLCAiaW5kZXgoKSIsICJleHRlbmQoKSIsXG4iaW5zZXJ0KCkiLCAicG9wKCkiLCAicmVtb3ZlKCkiLCAicmV2ZXJzZSgpIiBhbmQgInNvcnQoKSIsIGxpa2UgUHl0aG9uXG5zdGFuZGFyZCBsaXN0IG9iamVjdHMuICBGaW5hbGx5LCBzZXF1ZW5jZSB0eXBlcyBzaG91bGQgaW1wbGVtZW50XG5hZGRpdGlvbiAobWVhbmluZyBjb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gKG1lYW5pbmdcbnJlcGV0aXRpb24pIGJ5IGRlZmluaW5nIHRoZSBtZXRob2RzICJfX2FkZF9fKCkiLCAiX19yYWRkX18oKSIsXG4iX19pYWRkX18oKSIsICJfX211bF9fKCkiLCAiX19ybXVsX18oKSIgYW5kICJfX2ltdWxfXygpIiBkZXNjcmliZWRcbmJlbG93OyB0aGV5IHNob3VsZCBub3QgZGVmaW5lIG90aGVyIG51bWVyaWNhbCBvcGVyYXRvcnMuICBJdCBpc1xucmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZVxuIl9fY29udGFpbnNfXygpIiBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgImluIiBvcGVyYXRvcjtcbmZvciBtYXBwaW5ncywgImluIiBzaG91bGQgc2VhcmNoIHRoZSBtYXBwaW5nXCdzIGtleXM7IGZvciBzZXF1ZW5jZXMsIGl0XG5zaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlIHZhbHVlcy4gIEl0IGlzIGZ1cnRoZXIgcmVjb21tZW5kZWQgdGhhdCBib3RoXG5tYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGUgIl9faXRlcl9fKCkiIG1ldGhvZCB0byBhbGxvd1xuZWZmaWNpZW50IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBjb250YWluZXI7IGZvciBtYXBwaW5ncywgIl9faXRlcl9fKCkiXG5zaG91bGQgYmUgdGhlIHNhbWUgYXMgImtleXMoKSI7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBpdGVyYXRlXG50aHJvdWdoIHRoZSB2YWx1ZXMuXG5cbm9iamVjdC5fX2xlbl9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIuICBTaG91bGQgcmV0dXJuXG4gICB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QsIGFuIGludGVnZXIgIj49IiAwLiAgQWxzbywgYW4gb2JqZWN0IHRoYXRcbiAgIGRvZXNuXCd0IGRlZmluZSBhICJfX2Jvb2xfXygpIiBtZXRob2QgYW5kIHdob3NlICJfX2xlbl9fKCkiIG1ldGhvZFxuICAgcmV0dXJucyB6ZXJvIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgaW4gYSBCb29sZWFuIGNvbnRleHQuXG5cbm9iamVjdC5fX2xlbmd0aF9oaW50X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IubGVuZ3RoX2hpbnQoKSIuIFNob3VsZCByZXR1cm4gYW5cbiAgIGVzdGltYXRlZCBsZW5ndGggZm9yIHRoZSBvYmplY3QgKHdoaWNoIG1heSBiZSBncmVhdGVyIG9yIGxlc3MgdGhhblxuICAgdGhlIGFjdHVhbCBsZW5ndGgpLiBUaGUgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciAiPj0iIDAuIFRoaXNcbiAgIG1ldGhvZCBpcyBwdXJlbHkgYW4gb3B0aW1pemF0aW9uIGFuZCBpcyBuZXZlciByZXF1aXJlZCBmb3JcbiAgIGNvcnJlY3RuZXNzLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjQuXG5cbk5vdGU6IFNsaWNpbmcgaXMgZG9uZSBleGNsdXNpdmVseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGhyZWUgbWV0aG9kcy5cbiAgQSBjYWxsIGxpa2VcblxuICAgICBhWzE6Ml0gPSBiXG5cbiAgaXMgdHJhbnNsYXRlZCB0b1xuXG4gICAgIGFbc2xpY2UoMSwgMiwgTm9uZSldID0gYlxuXG4gIGFuZCBzbyBmb3J0aC4gIE1pc3Npbmcgc2xpY2UgaXRlbXMgYXJlIGFsd2F5cyBmaWxsZWQgaW4gd2l0aCAiTm9uZSIuXG5cbm9iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiAic2VsZltrZXldIi4gRm9yIHNlcXVlbmNlIHR5cGVzLFxuICAgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzIGFuZCBzbGljZSBvYmplY3RzLiAgTm90ZSB0aGF0XG4gICB0aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGUgY2xhc3Mgd2lzaGVzXG4gICB0byBlbXVsYXRlIGEgc2VxdWVuY2UgdHlwZSkgaXMgdXAgdG8gdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuIElmXG4gICAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsICJUeXBlRXJyb3IiIG1heSBiZSByYWlzZWQ7IGlmIG9mXG4gICBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZiBpbmRleGVzIGZvciB0aGUgc2VxdWVuY2UgKGFmdGVyIGFueVxuICAgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSB2YWx1ZXMpLCAiSW5kZXhFcnJvciIgc2hvdWxkIGJlXG4gICByYWlzZWQuIEZvciBtYXBwaW5nIHR5cGVzLCBpZiAqa2V5KiBpcyBtaXNzaW5nIChub3QgaW4gdGhlXG4gICBjb250YWluZXIpLCAiS2V5RXJyb3IiIHNob3VsZCBiZSByYWlzZWQuXG5cbiAgIE5vdGU6ICJmb3IiIGxvb3BzIGV4cGVjdCB0aGF0IGFuICJJbmRleEVycm9yIiB3aWxsIGJlIHJhaXNlZCBmb3JcbiAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiB0aGVcbiAgICAgc2VxdWVuY2UuXG5cbm9iamVjdC5fX21pc3NpbmdfXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCBieSAiZGljdCIuIl9fZ2V0aXRlbV9fKCkiIHRvIGltcGxlbWVudCAic2VsZltrZXldIiBmb3IgZGljdFxuICAgc3ViY2xhc3NlcyB3aGVuIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbm9iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gInNlbGZba2V5XSIuICBTYW1lIG5vdGUgYXMgZm9yXG4gICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmIG5ldyBrZXlzXG4gICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlIHJlcGxhY2VkLiAgVGhlXG4gICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvclxuICAgdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG5cbm9iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgInNlbGZba2V5XSIuICBTYW1lIG5vdGUgYXMgZm9yXG4gICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHNcbiAgIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcXVlbmNlLiAgVGhlIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmVcbiAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cblxub2JqZWN0Ll9faXRlcl9fKHNlbGYpXG5cbiAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGl0ZXJhdG9yIGlzIHJlcXVpcmVkIGZvciBhIGNvbnRhaW5lci5cbiAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQgY2FuIGl0ZXJhdGVcbiAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0IHNob3VsZFxuICAgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIuXG5cbiAgIEl0ZXJhdG9yIG9iamVjdHMgYWxzbyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZDsgdGhleSBhcmVcbiAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaXRlcmF0b3JcbiAgIG9iamVjdHMsIHNlZSAqSXRlcmF0b3IgVHlwZXMqLlxuXG5vYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpXG5cbiAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlICJyZXZlcnNlZCgpIiBidWlsdC1pbiB0byBpbXBsZW1lbnRcbiAgIHJldmVyc2UgaXRlcmF0aW9uLiAgSXQgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdFxuICAgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lciBpbiByZXZlcnNlIG9yZGVyLlxuXG4gICBJZiB0aGUgIl9fcmV2ZXJzZWRfXygpIiBtZXRob2QgaXMgbm90IHByb3ZpZGVkLCB0aGUgInJldmVyc2VkKCkiXG4gICBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgKCJfX2xlbl9fKCkiXG4gICBhbmQgIl9fZ2V0aXRlbV9fKCkiKS4gIE9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSBzZXF1ZW5jZSBwcm90b2NvbFxuICAgc2hvdWxkIG9ubHkgcHJvdmlkZSAiX19yZXZlcnNlZF9fKCkiIGlmIHRoZXkgY2FuIHByb3ZpZGUgYW5cbiAgIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lIHByb3ZpZGVkIGJ5XG4gICAicmV2ZXJzZWQoKSIuXG5cblRoZSBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzICgiaW4iIGFuZCAibm90IGluIikgYXJlIG5vcm1hbGx5XG5pbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIHNlcXVlbmNlLiAgSG93ZXZlciwgY29udGFpbmVyXG5vYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgbW9yZSBlZmZpY2llbnRcbmltcGxlbWVudGF0aW9uLCB3aGljaCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhlIG9iamVjdCBiZSBhIHNlcXVlbmNlLlxuXG5vYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycy4gIFNob3VsZCByZXR1cm4gdHJ1ZVxuICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgb2JqZWN0cywgdGhpc1xuICAgc2hvdWxkIGNvbnNpZGVyIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nIHJhdGhlciB0aGFuIHRoZSB2YWx1ZXMgb3JcbiAgIHRoZSBrZXktaXRlbSBwYWlycy5cblxuICAgRm9yIG9iamVjdHMgdGhhdCBkb25cJ3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIsIHRoZSBtZW1iZXJzaGlwIHRlc3RcbiAgIGZpcnN0IHRyaWVzIGl0ZXJhdGlvbiB2aWEgIl9faXRlcl9fKCkiLCB0aGVuIHRoZSBvbGQgc2VxdWVuY2VcbiAgIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgIl9fZ2V0aXRlbV9fKCkiLCBzZWUgKnRoaXMgc2VjdGlvbiBpbiB0aGVcbiAgIGxhbmd1YWdlIHJlZmVyZW5jZSouXG5cblxuRW11bGF0aW5nIG51bWVyaWMgdHlwZXNcbj09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBlbXVsYXRlIG51bWVyaWMgb2JqZWN0cy5cbk1ldGhvZHMgY29ycmVzcG9uZGluZyB0byBvcGVyYXRpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlXG5wYXJ0aWN1bGFyIGtpbmQgb2YgbnVtYmVyIGltcGxlbWVudGVkIChlLmcuLCBiaXR3aXNlIG9wZXJhdGlvbnMgZm9yXG5ub24taW50ZWdyYWwgbnVtYmVycykgc2hvdWxkIGJlIGxlZnQgdW5kZWZpbmVkLlxuXG5vYmplY3QuX19hZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3N1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tYXRtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9fbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9feG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgImRpdm1vZCgpIixcbiAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpLiAgRm9yIGluc3RhbmNlLCB0b1xuICAgZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gInggKyB5Iiwgd2hlcmUgKngqIGlzIGFuIGluc3RhbmNlIG9mIGFcbiAgIGNsYXNzIHRoYXQgaGFzIGFuICJfX2FkZF9fKCkiIG1ldGhvZCwgInguX19hZGRfXyh5KSIgaXMgY2FsbGVkLlxuICAgVGhlICJfX2Rpdm1vZF9fKCkiIG1ldGhvZCBzaG91bGQgYmUgdGhlIGVxdWl2YWxlbnQgdG8gdXNpbmdcbiAgICJfX2Zsb29yZGl2X18oKSIgYW5kICJfX21vZF9fKCkiOyBpdCBzaG91bGQgbm90IGJlIHJlbGF0ZWQgdG9cbiAgICJfX3RydWVkaXZfXygpIi4gIE5vdGUgdGhhdCAiX19wb3dfXygpIiBzaG91bGQgYmUgZGVmaW5lZCB0byBhY2NlcHRcbiAgIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlIGJ1aWx0LWluXG4gICAicG93KCkiIGZ1bmN0aW9uIGlzIHRvIGJlIHN1cHBvcnRlZC5cblxuICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlXG4gICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gIk5vdEltcGxlbWVudGVkIi5cblxub2JqZWN0Ll9fcmFkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnN1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm1hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnRydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnBvd19fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAiZGl2bW9kKCkiLFxuICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8Iikgd2l0aCByZWZsZWN0ZWQgKHN3YXBwZWQpXG4gICBvcGVyYW5kcy4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIGxlZnQgb3BlcmFuZCBkb2VzXG4gICBub3Qgc3VwcG9ydCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gYW5kIHRoZSBvcGVyYW5kcyBhcmUgb2ZcbiAgIGRpZmZlcmVudCB0eXBlcy4gWzJdIEZvciBpbnN0YW5jZSwgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gInggLVxuICAgeSIsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuICJfX3JzdWJfXygpIlxuICAgbWV0aG9kLCAieS5fX3JzdWJfXyh4KSIgaXMgY2FsbGVkIGlmICJ4Ll9fc3ViX18oeSkiIHJldHVybnNcbiAgICpOb3RJbXBsZW1lbnRlZCouXG5cbiAgIE5vdGUgdGhhdCB0ZXJuYXJ5ICJwb3coKSIgd2lsbCBub3QgdHJ5IGNhbGxpbmcgIl9fcnBvd19fKCkiICh0aGVcbiAgIGNvZXJjaW9uIHJ1bGVzIHdvdWxkIGJlY29tZSB0b28gY29tcGxpY2F0ZWQpLlxuXG4gICBOb3RlOiBJZiB0aGUgcmlnaHQgb3BlcmFuZFwncyB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGxlZnRcbiAgICAgb3BlcmFuZFwncyB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIHRoZSByZWZsZWN0ZWQgbWV0aG9kXG4gICAgIGZvciB0aGUgb3BlcmF0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGxlZnRcbiAgICAgb3BlcmFuZFwncyBub24tcmVmbGVjdGVkIG1ldGhvZC4gIFRoaXMgYmVoYXZpb3IgYWxsb3dzIHN1YmNsYXNzZXNcbiAgICAgdG8gb3ZlcnJpZGUgdGhlaXIgYW5jZXN0b3JzXCcgb3BlcmF0aW9ucy5cblxub2JqZWN0Ll9faWFkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXN1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW1hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXRydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXBvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbm9iamVjdC5fX2lsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgYXJpdGhtZXRpY1xuICAgYXNzaWdubWVudHMgKCIrPSIsICItPSIsICIqPSIsICJAPSIsICIvPSIsICIvLz0iLCAiJT0iLCAiKio9IixcbiAgICI8PD0iLCAiPj49IiwgIiY9IiwgIl49IiwgInw9IikuICBUaGVzZSBtZXRob2RzIHNob3VsZCBhdHRlbXB0IHRvXG4gICBkbyB0aGUgb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgKnNlbGYqKSBhbmQgcmV0dXJuIHRoZSByZXN1bHRcbiAgICh3aGljaCBjb3VsZCBiZSwgYnV0IGRvZXMgbm90IGhhdmUgdG8gYmUsICpzZWxmKikuICBJZiBhIHNwZWNpZmljXG4gICBtZXRob2QgaXMgbm90IGRlZmluZWQsIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBmYWxscyBiYWNrIHRvIHRoZVxuICAgbm9ybWFsIG1ldGhvZHMuICBGb3IgaW5zdGFuY2UsIGlmICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzXG4gICB3aXRoIGFuICJfX2lhZGRfXygpIiBtZXRob2QsICJ4ICs9IHkiIGlzIGVxdWl2YWxlbnQgdG8gInggPVxuICAgeC5fX2lhZGRfXyh5KSIgLiBPdGhlcndpc2UsICJ4Ll9fYWRkX18oeSkiIGFuZCAieS5fX3JhZGRfXyh4KSIgYXJlXG4gICBjb25zaWRlcmVkLCBhcyB3aXRoIHRoZSBldmFsdWF0aW9uIG9mICJ4ICsgeSIuIEluIGNlcnRhaW5cbiAgIHNpdHVhdGlvbnMsIGF1Z21lbnRlZCBhc3NpZ25tZW50IGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCBlcnJvcnNcbiAgIChzZWUgKldoeSBkb2VzIGFfdHVwbGVbaV0gKz0gW1wnaXRlbVwnXSByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB0aGVcbiAgIGFkZGl0aW9uIHdvcmtzPyopLCBidXQgdGhpcyBiZWhhdmlvciBpcyBpbiBmYWN0IHBhcnQgb2YgdGhlIGRhdGFcbiAgIG1vZGVsLlxuXG5vYmplY3QuX19uZWdfXyhzZWxmKVxub2JqZWN0Ll9fcG9zX18oc2VsZilcbm9iamVjdC5fX2Fic19fKHNlbGYpXG5vYmplY3QuX19pbnZlcnRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgKCItIiwgIisiLFxuICAgImFicygpIiBhbmQgIn4iKS5cblxub2JqZWN0Ll9fY29tcGxleF9fKHNlbGYpXG5vYmplY3QuX19pbnRfXyhzZWxmKVxub2JqZWN0Ll9fZmxvYXRfXyhzZWxmKVxub2JqZWN0Ll9fcm91bmRfXyhzZWxmWywgbl0pXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiY29tcGxleCgpIiwgImludCgpIixcbiAgICJmbG9hdCgpIiBhbmQgInJvdW5kKCkiLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mIHRoZSBhcHByb3ByaWF0ZVxuICAgdHlwZS5cblxub2JqZWN0Ll9faW5kZXhfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5pbmRleCgpIiwgYW5kIHdoZW5ldmVyIFB5dGhvbiBuZWVkc1xuICAgdG8gbG9zc2xlc3NseSBjb252ZXJ0IHRoZSBudW1lcmljIG9iamVjdCB0byBhbiBpbnRlZ2VyIG9iamVjdCAoc3VjaFxuICAgYXMgaW4gc2xpY2luZywgb3IgaW4gdGhlIGJ1aWx0LWluICJiaW4oKSIsICJoZXgoKSIgYW5kICJvY3QoKSJcbiAgIGZ1bmN0aW9ucykuIFByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGluZGljYXRlcyB0aGF0IHRoZSBudW1lcmljXG4gICBvYmplY3QgaXMgYW4gaW50ZWdlciB0eXBlLiAgTXVzdCByZXR1cm4gYW4gaW50ZWdlci5cblxuICAgTm90ZTogSW4gb3JkZXIgdG8gaGF2ZSBhIGNvaGVyZW50IGludGVnZXIgdHlwZSBjbGFzcywgd2hlblxuICAgICAiX19pbmRleF9fKCkiIGlzIGRlZmluZWQgIl9faW50X18oKSIgc2hvdWxkIGFsc28gYmUgZGVmaW5lZCwgYW5kXG4gICAgIGJvdGggc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZS5cblxuXG5XaXRoIFN0YXRlbWVudCBDb250ZXh0IE1hbmFnZXJzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkEgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSBjb250ZXh0IHRvXG5iZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhICJ3aXRoIiBzdGF0ZW1lbnQuIFRoZSBjb250ZXh0IG1hbmFnZXJcbmhhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCBydW50aW1lIGNvbnRleHRcbmZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyBhcmUgbm9ybWFsbHlcbmludm9rZWQgdXNpbmcgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uICpUaGUgd2l0aFxuc3RhdGVtZW50KiksIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nIHRoZWlyIG1ldGhvZHMuXG5cblR5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaW91c1xua2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZFxuZmlsZXMsIGV0Yy5cblxuRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlICpDb250ZXh0IE1hbmFnZXIgVHlwZXMqLlxuXG5vYmplY3QuX19lbnRlcl9fKHNlbGYpXG5cbiAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICJ3aXRoIlxuICAgc3RhdGVtZW50IHdpbGwgYmluZCB0aGlzIG1ldGhvZFwncyByZXR1cm4gdmFsdWUgdG8gdGhlIHRhcmdldChzKVxuICAgc3BlY2lmaWVkIGluIHRoZSAiYXMiIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuXG5cbm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spXG5cbiAgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgcGFyYW1ldGVyc1xuICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZVxuICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgYXJndW1lbnRzIHdpbGxcbiAgIGJlICJOb25lIi5cblxuICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gc3VwcHJlc3MgdGhlXG4gICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkXG4gICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWRcbiAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuXG4gICBOb3RlIHRoYXQgIl9fZXhpdF9fKCkiIG1ldGhvZHMgc2hvdWxkIG5vdCByZXJhaXNlIHRoZSBwYXNzZWQtaW5cbiAgIGV4Y2VwdGlvbjsgdGhpcyBpcyB0aGUgY2FsbGVyXCdzIHJlc3BvbnNpYmlsaXR5LlxuXG5TZWUgYWxzbzogKipQRVAgMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuXG4gICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24gIndpdGgiXG4gICAgIHN0YXRlbWVudC5cblxuXG5TcGVjaWFsIG1ldGhvZCBsb29rdXBcbj09PT09PT09PT09PT09PT09PT09PVxuXG5Gb3IgY3VzdG9tIGNsYXNzZXMsIGltcGxpY2l0IGludm9jYXRpb25zIG9mIHNwZWNpYWwgbWV0aG9kcyBhcmUgb25seVxuZ3VhcmFudGVlZCB0byB3b3JrIGNvcnJlY3RseSBpZiBkZWZpbmVkIG9uIGFuIG9iamVjdFwncyB0eXBlLCBub3QgaW5cbnRoZSBvYmplY3RcJ3MgaW5zdGFuY2UgZGljdGlvbmFyeS4gIFRoYXQgYmVoYXZpb3VyIGlzIHRoZSByZWFzb24gd2h5XG50aGUgZm9sbG93aW5nIGNvZGUgcmFpc2VzIGFuIGV4Y2VwdGlvbjpcblxuICAgPj4+IGNsYXNzIEM6XG4gICAuLi4gICAgIHBhc3NcbiAgIC4uLlxuICAgPj4+IGMgPSBDKClcbiAgID4+PiBjLl9fbGVuX18gPSBsYW1iZGE6IDVcbiAgID4+PiBsZW4oYylcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbiAgIFR5cGVFcnJvcjogb2JqZWN0IG9mIHR5cGUgXCdDXCcgaGFzIG5vIGxlbigpXG5cblRoZSByYXRpb25hbGUgYmVoaW5kIHRoaXMgYmVoYXZpb3VyIGxpZXMgd2l0aCBhIG51bWJlciBvZiBzcGVjaWFsXG5tZXRob2RzIHN1Y2ggYXMgIl9faGFzaF9fKCkiIGFuZCAiX19yZXByX18oKSIgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYnlcbmFsbCBvYmplY3RzLCBpbmNsdWRpbmcgdHlwZSBvYmplY3RzLiBJZiB0aGUgaW1wbGljaXQgbG9va3VwIG9mIHRoZXNlXG5tZXRob2RzIHVzZWQgdGhlIGNvbnZlbnRpb25hbCBsb29rdXAgcHJvY2VzcywgdGhleSB3b3VsZCBmYWlsIHdoZW5cbmludm9rZWQgb24gdGhlIHR5cGUgb2JqZWN0IGl0c2VsZjpcblxuICAgPj4+IDEgLl9faGFzaF9fKCkgPT0gaGFzaCgxKVxuICAgVHJ1ZVxuICAgPj4+IGludC5fX2hhc2hfXygpID09IGhhc2goaW50KVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPlxuICAgVHlwZUVycm9yOiBkZXNjcmlwdG9yIFwnX19oYXNoX19cJyBvZiBcJ2ludFwnIG9iamVjdCBuZWVkcyBhbiBhcmd1bWVudFxuXG5JbmNvcnJlY3RseSBhdHRlbXB0aW5nIHRvIGludm9rZSBhbiB1bmJvdW5kIG1ldGhvZCBvZiBhIGNsYXNzIGluIHRoaXNcbndheSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgXCdtZXRhY2xhc3MgY29uZnVzaW9uXCcsIGFuZCBpcyBhdm9pZGVkXG5ieSBieXBhc3NpbmcgdGhlIGluc3RhbmNlIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsIG1ldGhvZHM6XG5cbiAgID4+PiB0eXBlKDEpLl9faGFzaF9fKDEpID09IGhhc2goMSlcbiAgIFRydWVcbiAgID4+PiB0eXBlKGludCkuX19oYXNoX18oaW50KSA9PSBoYXNoKGludClcbiAgIFRydWVcblxuSW4gYWRkaXRpb24gdG8gYnlwYXNzaW5nIGFueSBpbnN0YW5jZSBhdHRyaWJ1dGVzIGluIHRoZSBpbnRlcmVzdCBvZlxuY29ycmVjdG5lc3MsIGltcGxpY2l0IHNwZWNpYWwgbWV0aG9kIGxvb2t1cCBnZW5lcmFsbHkgYWxzbyBieXBhc3Nlc1xudGhlICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1ldGhvZCBldmVuIG9mIHRoZSBvYmplY3RcJ3MgbWV0YWNsYXNzOlxuXG4gICA+Pj4gY2xhc3MgTWV0YSh0eXBlKTpcbiAgIC4uLiAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpOlxuICAgLi4uICAgICAgICAgcHJpbnQoIk1ldGFjbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZCIpXG4gICAuLi4gICAgICAgICByZXR1cm4gdHlwZS5fX2dldGF0dHJpYnV0ZV9fKCphcmdzKVxuICAgLi4uXG4gICA+Pj4gY2xhc3MgQyhvYmplY3QsIG1ldGFjbGFzcz1NZXRhKTpcbiAgIC4uLiAgICAgZGVmIF9fbGVuX18oc2VsZik6XG4gICAuLi4gICAgICAgICByZXR1cm4gMTBcbiAgIC4uLiAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpOlxuICAgLi4uICAgICAgICAgcHJpbnQoIkNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIilcbiAgIC4uLiAgICAgICAgIHJldHVybiBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXygqYXJncylcbiAgIC4uLlxuICAgPj4+IGMgPSBDKClcbiAgID4+PiBjLl9fbGVuX18oKSAgICAgICAgICAgICAgICAgIyBFeHBsaWNpdCBsb29rdXAgdmlhIGluc3RhbmNlXG4gICBDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZFxuICAgMTBcbiAgID4+PiB0eXBlKGMpLl9fbGVuX18oYykgICAgICAgICAgIyBFeHBsaWNpdCBsb29rdXAgdmlhIHR5cGVcbiAgIE1ldGFjbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZFxuICAgMTBcbiAgID4+PiBsZW4oYykgICAgICAgICAgICAgICAgICAgICAgIyBJbXBsaWNpdCBsb29rdXBcbiAgIDEwXG5cbkJ5cGFzc2luZyB0aGUgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWFjaGluZXJ5IGluIHRoaXMgZmFzaGlvbiBwcm92aWRlc1xuc2lnbmlmaWNhbnQgc2NvcGUgZm9yIHNwZWVkIG9wdGltaXNhdGlvbnMgd2l0aGluIHRoZSBpbnRlcnByZXRlciwgYXRcbnRoZSBjb3N0IG9mIHNvbWUgZmxleGliaWxpdHkgaW4gdGhlIGhhbmRsaW5nIG9mIHNwZWNpYWwgbWV0aG9kcyAodGhlXG5zcGVjaWFsIG1ldGhvZCAqbXVzdCogYmUgc2V0IG9uIHRoZSBjbGFzcyBvYmplY3QgaXRzZWxmIGluIG9yZGVyIHRvIGJlXG5jb25zaXN0ZW50bHkgaW52b2tlZCBieSB0aGUgaW50ZXJwcmV0ZXIpLlxuJywKLSAnc3RyaW5nLW1ldGhvZHMnOiB1J1xuU3RyaW5nIE1ldGhvZHNcbioqKioqKioqKioqKioqXG5cblN0cmluZ3MgaW1wbGVtZW50IGFsbCBvZiB0aGUgKmNvbW1vbiogc2VxdWVuY2Ugb3BlcmF0aW9ucywgYWxvbmcgd2l0aFxudGhlIGFkZGl0aW9uYWwgbWV0aG9kcyBkZXNjcmliZWQgYmVsb3cuXG5cblN0cmluZ3MgYWxzbyBzdXBwb3J0IHR3byBzdHlsZXMgb2Ygc3RyaW5nIGZvcm1hdHRpbmcsIG9uZSBwcm92aWRpbmcgYVxubGFyZ2UgZGVncmVlIG9mIGZsZXhpYmlsaXR5IGFuZCBjdXN0b21pemF0aW9uIChzZWUgInN0ci5mb3JtYXQoKSIsXG4qRm9ybWF0IFN0cmluZyBTeW50YXgqIGFuZCAqQ3VzdG9tIFN0cmluZyBGb3JtYXR0aW5nKikgYW5kIHRoZSBvdGhlclxuYmFzZWQgb24gQyAicHJpbnRmIiBzdHlsZSBmb3JtYXR0aW5nIHRoYXQgaGFuZGxlcyBhIG5hcnJvd2VyIHJhbmdlIG9mXG50eXBlcyBhbmQgaXMgc2xpZ2h0bHkgaGFyZGVyIHRvIHVzZSBjb3JyZWN0bHksIGJ1dCBpcyBvZnRlbiBmYXN0ZXIgZm9yXG50aGUgY2FzZXMgaXQgY2FuIGhhbmRsZSAoKnByaW50Zi1zdHlsZSBTdHJpbmcgRm9ybWF0dGluZyopLlxuXG5UaGUgKlRleHQgUHJvY2Vzc2luZyBTZXJ2aWNlcyogc2VjdGlvbiBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSBjb3ZlcnNcbmEgbnVtYmVyIG9mIG90aGVyIG1vZHVsZXMgdGhhdCBwcm92aWRlIHZhcmlvdXMgdGV4dCByZWxhdGVkIHV0aWxpdGllc1xuKGluY2x1ZGluZyByZWd1bGFyIGV4cHJlc3Npb24gc3VwcG9ydCBpbiB0aGUgInJlIiBtb2R1bGUpLlxuXG5zdHIuY2FwaXRhbGl6ZSgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGl0cyBmaXJzdCBjaGFyYWN0ZXIgY2FwaXRhbGl6ZWRcbiAgIGFuZCB0aGUgcmVzdCBsb3dlcmNhc2VkLlxuXG5zdHIuY2FzZWZvbGQoKVxuXG4gICBSZXR1cm4gYSBjYXNlZm9sZGVkIGNvcHkgb2YgdGhlIHN0cmluZy4gQ2FzZWZvbGRlZCBzdHJpbmdzIG1heSBiZVxuICAgdXNlZCBmb3IgY2FzZWxlc3MgbWF0Y2hpbmcuXG5cbiAgIENhc2Vmb2xkaW5nIGlzIHNpbWlsYXIgdG8gbG93ZXJjYXNpbmcgYnV0IG1vcmUgYWdncmVzc2l2ZSBiZWNhdXNlXG4gICBpdCBpcyBpbnRlbmRlZCB0byByZW1vdmUgYWxsIGNhc2UgZGlzdGluY3Rpb25zIGluIGEgc3RyaW5nLiBGb3JcbiAgIGV4YW1wbGUsIHRoZSBHZXJtYW4gbG93ZXJjYXNlIGxldHRlciAiXCdceGRmXCciIGlzIGVxdWl2YWxlbnQgdG8gIiJzcyIiLlxuICAgU2luY2UgaXQgaXMgYWxyZWFkeSBsb3dlcmNhc2UsICJsb3dlcigpIiB3b3VsZCBkbyBub3RoaW5nIHRvICJcJ1x4ZGZcJyI7XG4gICAiY2FzZWZvbGQoKSIgY29udmVydHMgaXQgdG8gIiJzcyIiLlxuXG4gICBUaGUgY2FzZWZvbGRpbmcgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMgb2YgdGhlXG4gICBVbmljb2RlIFN0YW5kYXJkLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjMuXG5cbnN0ci5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gUGFkZGluZyBpcyBkb25lXG4gICB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYW4gQVNDSUkgc3BhY2UpLiBUaGVcbiAgIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0b1xuICAgImxlbihzKSIuXG5cbnN0ci5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nICpzdWIqXG4gICBpbiB0aGUgcmFuZ2UgWypzdGFydCosICplbmQqXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyAqc3RhcnQqIGFuZFxuICAgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuXG5zdHIuZW5jb2RlKGVuY29kaW5nPSJ1dGYtOCIsIGVycm9ycz0ic3RyaWN0IilcblxuICAgUmV0dXJuIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIGFzIGEgYnl0ZXMgb2JqZWN0LiBEZWZhdWx0XG4gICBlbmNvZGluZyBpcyAiXCd1dGYtOFwnIi4gKmVycm9ycyogbWF5IGJlIGdpdmVuIHRvIHNldCBhIGRpZmZlcmVudFxuICAgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiBUaGUgZGVmYXVsdCBmb3IgKmVycm9ycyogaXMgIlwnc3RyaWN0XCciLFxuICAgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBhICJVbmljb2RlRXJyb3IiLiBPdGhlciBwb3NzaWJsZVxuICAgdmFsdWVzIGFyZSAiXCdpZ25vcmVcJyIsICJcJ3JlcGxhY2VcJyIsICJcJ3htbGNoYXJyZWZyZXBsYWNlXCciLFxuICAgIlwnYmFja3NsYXNocmVwbGFjZVwnIiBhbmQgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCB2aWFcbiAgICJjb2RlY3MucmVnaXN0ZXJfZXJyb3IoKSIsIHNlZSBzZWN0aW9uICpFcnJvciBIYW5kbGVycyouIEZvciBhIGxpc3RcbiAgIG9mIHBvc3NpYmxlIGVuY29kaW5ncywgc2VlIHNlY3Rpb24gKlN0YW5kYXJkIEVuY29kaW5ncyouXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIGtleXdvcmQgYXJndW1lbnRzIGFkZGVkLlxuXG5zdHIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuICJUcnVlIiBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkICpzdWZmaXgqLFxuICAgb3RoZXJ3aXNlIHJldHVybiAiRmFsc2UiLiAgKnN1ZmZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdWZmaXhlc1xuICAgdG8gbG9vayBmb3IuICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3QgYmVnaW5uaW5nIGF0IHRoYXRcbiAgIHBvc2l0aW9uLiAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgYXQgdGhhdCBwb3NpdGlvbi5cblxuc3RyLmV4cGFuZHRhYnModGFic2l6ZT04KVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZFxuICAgYnkgb25lIG9yIG1vcmUgc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGVcbiAgIGdpdmVuIHRhYiBzaXplLiAgVGFiIHBvc2l0aW9ucyBvY2N1ciBldmVyeSAqdGFic2l6ZSogY2hhcmFjdGVyc1xuICAgKGRlZmF1bHQgaXMgOCwgZ2l2aW5nIHRhYiBwb3NpdGlvbnMgYXQgY29sdW1ucyAwLCA4LCAxNiBhbmQgc28gb24pLlxuICAgVG8gZXhwYW5kIHRoZSBzdHJpbmcsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBzZXQgdG8gemVybyBhbmQgdGhlXG4gICBzdHJpbmcgaXMgZXhhbWluZWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4gIElmIHRoZSBjaGFyYWN0ZXIgaXMgYVxuICAgdGFiICgiXFx0IiksIG9uZSBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkIGluIHRoZSByZXN1bHRcbiAgIHVudGlsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBlcXVhbCB0byB0aGUgbmV4dCB0YWIgcG9zaXRpb24uIChUaGVcbiAgIHRhYiBjaGFyYWN0ZXIgaXRzZWxmIGlzIG5vdCBjb3BpZWQuKSAgSWYgdGhlIGNoYXJhY3RlciBpcyBhIG5ld2xpbmVcbiAgICgiXFxuIikgb3IgcmV0dXJuICgiXFxyIiksIGl0IGlzIGNvcGllZCBhbmQgdGhlIGN1cnJlbnQgY29sdW1uIGlzXG4gICByZXNldCB0byB6ZXJvLiAgQW55IG90aGVyIGNoYXJhY3RlciBpcyBjb3BpZWQgdW5jaGFuZ2VkIGFuZCB0aGVcbiAgIGN1cnJlbnQgY29sdW1uIGlzIGluY3JlbWVudGVkIGJ5IG9uZSByZWdhcmRsZXNzIG9mIGhvdyB0aGVcbiAgIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCB3aGVuIHByaW50ZWQuXG5cbiAgID4+PiBcJzAxXFx0MDEyXFx0MDEyM1xcdDAxMjM0XCcuZXhwYW5kdGFicygpXG4gICBcJzAxICAgICAgMDEyICAgICAwMTIzICAgIDAxMjM0XCdcbiAgID4+PiBcJzAxXFx0MDEyXFx0MDEyM1xcdDAxMjM0XCcuZXhwYW5kdGFicyg0KVxuICAgXCcwMSAgMDEyIDAxMjMgICAgMDEyMzRcJ1xuXG5zdHIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQgd2l0aGluIHRoZSBzbGljZSAic1tzdGFydDplbmRdIi4gIE9wdGlvbmFsIGFyZ3VtZW50cyAqc3RhcnQqXG4gICBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLiAgUmV0dXJuICItMSIgaWZcbiAgICpzdWIqIGlzIG5vdCBmb3VuZC5cblxuICAgTm90ZTogVGhlICJmaW5kKCkiIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIHlvdSBuZWVkIHRvIGtub3dcbiAgICAgdGhlIHBvc2l0aW9uIG9mICpzdWIqLiAgVG8gY2hlY2sgaWYgKnN1YiogaXMgYSBzdWJzdHJpbmcgb3Igbm90LFxuICAgICB1c2UgdGhlICJpbiIgb3BlcmF0b3I6XG5cbiAgICAgICAgPj4+IFwnUHlcJyBpbiBcJ1B5dGhvblwnXG4gICAgICAgIFRydWVcblxuc3RyLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpXG5cbiAgIFBlcmZvcm0gYSBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24uICBUaGUgc3RyaW5nIG9uIHdoaWNoIHRoaXNcbiAgIG1ldGhvZCBpcyBjYWxsZWQgY2FuIGNvbnRhaW4gbGl0ZXJhbCB0ZXh0IG9yIHJlcGxhY2VtZW50IGZpZWxkc1xuICAgZGVsaW1pdGVkIGJ5IGJyYWNlcyAie30iLiAgRWFjaCByZXBsYWNlbWVudCBmaWVsZCBjb250YWlucyBlaXRoZXJcbiAgIHRoZSBudW1lcmljIGluZGV4IG9mIGEgcG9zaXRpb25hbCBhcmd1bWVudCwgb3IgdGhlIG5hbWUgb2YgYVxuICAga2V5d29yZCBhcmd1bWVudC4gIFJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgZWFjaFxuICAgcmVwbGFjZW1lbnQgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZVxuICAgY29ycmVzcG9uZGluZyBhcmd1bWVudC5cblxuICAgPj4+ICJUaGUgc3VtIG9mIDEgKyAyIGlzIHswfSIuZm9ybWF0KDErMilcbiAgIFwnVGhlIHN1bSBvZiAxICsgMiBpcyAzXCdcblxuICAgU2VlICpGb3JtYXQgU3RyaW5nIFN5bnRheCogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlvdXNcbiAgIGZvcm1hdHRpbmcgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaW4gZm9ybWF0IHN0cmluZ3MuXG5cbnN0ci5mb3JtYXRfbWFwKG1hcHBpbmcpXG5cbiAgIFNpbWlsYXIgdG8gInN0ci5mb3JtYXQoKiptYXBwaW5nKSIsIGV4Y2VwdCB0aGF0ICJtYXBwaW5nIiBpcyB1c2VkXG4gICBkaXJlY3RseSBhbmQgbm90IGNvcGllZCB0byBhICJkaWN0Ii4gIFRoaXMgaXMgdXNlZnVsIGlmIGZvciBleGFtcGxlXG4gICAibWFwcGluZyIgaXMgYSBkaWN0IHN1YmNsYXNzOlxuXG4gICA+Pj4gY2xhc3MgRGVmYXVsdChkaWN0KTpcbiAgIC4uLiAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6XG4gICAuLi4gICAgICAgICByZXR1cm4ga2V5XG4gICAuLi5cbiAgID4+PiBcJ3tuYW1lfSB3YXMgYm9ybiBpbiB7Y291bnRyeX1cJy5mb3JtYXRfbWFwKERlZmF1bHQobmFtZT1cJ0d1aWRvXCcpKVxuICAgXCdHdWlkbyB3YXMgYm9ybiBpbiBjb3VudHJ5XCdcblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG5zdHIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSAiZmluZCgpIiwgYnV0IHJhaXNlICJWYWx1ZUVycm9yIiB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90XG4gICBmb3VuZC5cblxuc3RyLmlzYWxudW0oKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYW51bWVyaWMgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBBIGNoYXJhY3RlciAiYyJcbiAgIGlzIGFscGhhbnVtZXJpYyBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyByZXR1cm5zICJUcnVlIjpcbiAgICJjLmlzYWxwaGEoKSIsICJjLmlzZGVjaW1hbCgpIiwgImMuaXNkaWdpdCgpIiwgb3IgImMuaXNudW1lcmljKCkiLlxuXG5zdHIuaXNhbHBoYSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhYmV0aWMgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBBbHBoYWJldGljXG4gICBjaGFyYWN0ZXJzIGFyZSB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyXG4gICBkYXRhYmFzZSBhcyAiTGV0dGVyIiwgaS5lLiwgdGhvc2Ugd2l0aCBnZW5lcmFsIGNhdGVnb3J5IHByb3BlcnR5XG4gICBiZWluZyBvbmUgb2YgIkxtIiwgIkx0IiwgIkx1IiwgIkxsIiwgb3IgIkxvIi4gIE5vdGUgdGhhdCB0aGlzIGlzXG4gICBkaWZmZXJlbnQgZnJvbSB0aGUgIkFscGhhYmV0aWMiIHByb3BlcnR5IGRlZmluZWQgaW4gdGhlIFVuaWNvZGVcbiAgIFN0YW5kYXJkLlxuXG5zdHIuaXNkZWNpbWFsKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGVjaW1hbCBjaGFyYWN0ZXJzXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiBEZWNpbWFsXG4gICBjaGFyYWN0ZXJzIGFyZSB0aG9zZSBmcm9tIGdlbmVyYWwgY2F0ZWdvcnkgIk5kIi4gVGhpcyBjYXRlZ29yeVxuICAgaW5jbHVkZXMgZGlnaXQgY2hhcmFjdGVycywgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG9cbiAgIGZvcm0gZGVjaW1hbC1yYWRpeCBudW1iZXJzLCBlLmcuIFUrMDY2MCwgQVJBQklDLUlORElDIERJR0lUIFpFUk8uXG5cbnN0ci5pc2RpZ2l0KClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGlnaXRzIGFuZCB0aGVyZSBpc1xuICAgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgRGlnaXRzIGluY2x1ZGUgZGVjaW1hbFxuICAgY2hhcmFjdGVycyBhbmQgZGlnaXRzIHRoYXQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nLCBzdWNoIGFzIHRoZVxuICAgY29tcGF0aWJpbGl0eSBzdXBlcnNjcmlwdCBkaWdpdHMuICBGb3JtYWxseSwgYSBkaWdpdCBpcyBhIGNoYXJhY3RlclxuICAgdGhhdCBoYXMgdGhlIHByb3BlcnR5IHZhbHVlIE51bWVyaWNfVHlwZT1EaWdpdCBvclxuICAgTnVtZXJpY19UeXBlPURlY2ltYWwuXG5cbnN0ci5pc2lkZW50aWZpZXIoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgaWRlbnRpZmllciBhY2NvcmRpbmcgdG8gdGhlXG4gICBsYW5ndWFnZSBkZWZpbml0aW9uLCBzZWN0aW9uICpJZGVudGlmaWVycyBhbmQga2V5d29yZHMqLlxuXG4gICBVc2UgImtleXdvcmQuaXNrZXl3b3JkKCkiIHRvIHRlc3QgZm9yIHJlc2VydmVkIGlkZW50aWZpZXJzIHN1Y2ggYXNcbiAgICJkZWYiIGFuZCAiY2xhc3MiLlxuXG5zdHIuaXNsb3dlcigpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nIGFyZSBsb3dlcmNhc2VcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbnN0ci5pc251bWVyaWMoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBudW1lcmljIGNoYXJhY3RlcnMsXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiBOdW1lcmljXG4gICBjaGFyYWN0ZXJzIGluY2x1ZGUgZGlnaXQgY2hhcmFjdGVycywgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZVxuICAgdGhlIFVuaWNvZGUgbnVtZXJpYyB2YWx1ZSBwcm9wZXJ0eSwgZS5nLiBVKzIxNTUsIFZVTEdBUiBGUkFDVElPTlxuICAgT05FIEZJRlRILiAgRm9ybWFsbHksIG51bWVyaWMgY2hhcmFjdGVycyBhcmUgdGhvc2Ugd2l0aCB0aGVcbiAgIHByb3BlcnR5IHZhbHVlIE51bWVyaWNfVHlwZT1EaWdpdCwgTnVtZXJpY19UeXBlPURlY2ltYWwgb3JcbiAgIE51bWVyaWNfVHlwZT1OdW1lcmljLlxuXG5zdHIuaXNwcmludGFibGUoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBwcmludGFibGUgb3IgdGhlXG4gICBzdHJpbmcgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4gIE5vbnByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZVxuICAgdGhvc2UgY2hhcmFjdGVycyBkZWZpbmVkIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlciBkYXRhYmFzZSBhc1xuICAgIk90aGVyIiBvciAiU2VwYXJhdG9yIiwgZXhjZXB0aW5nIHRoZSBBU0NJSSBzcGFjZSAoMHgyMCkgd2hpY2ggaXNcbiAgIGNvbnNpZGVyZWQgcHJpbnRhYmxlLiAgKE5vdGUgdGhhdCBwcmludGFibGUgY2hhcmFjdGVycyBpbiB0aGlzXG4gICBjb250ZXh0IGFyZSB0aG9zZSB3aGljaCBzaG91bGQgbm90IGJlIGVzY2FwZWQgd2hlbiAicmVwcigpIiBpc1xuICAgaW52b2tlZCBvbiBhIHN0cmluZy4gIEl0IGhhcyBubyBiZWFyaW5nIG9uIHRoZSBoYW5kbGluZyBvZiBzdHJpbmdzXG4gICB3cml0dGVuIHRvICJzeXMuc3Rkb3V0IiBvciAic3lzLnN0ZGVyciIuKVxuXG5zdHIuaXNzcGFjZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgV2hpdGVzcGFjZVxuICAgY2hhcmFjdGVycyAgYXJlIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcbiAgIGRhdGFiYXNlIGFzICJPdGhlciIgb3IgIlNlcGFyYXRvciIgYW5kIHRob3NlIHdpdGggYmlkaXJlY3Rpb25hbFxuICAgcHJvcGVydHkgYmVpbmcgb25lIG9mICJXUyIsICJCIiwgb3IgIlMiLlxuXG5zdHIuaXN0aXRsZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZWNhc2VkIHN0cmluZyBhbmQgdGhlcmUgaXMgYXRcbiAgIGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZvciBleGFtcGxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5XG4gICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXG4gICBSZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLlxuXG5zdHIuaXN1cHBlcigpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nIGFyZSB1cHBlcmNhc2VcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbnN0ci5qb2luKGl0ZXJhYmxlKVxuXG4gICBSZXR1cm4gYSBzdHJpbmcgd2hpY2ggaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHN0cmluZ3MgaW4gdGhlXG4gICAqaXRlcmFibGUqICppdGVyYWJsZSouICBBICJUeXBlRXJyb3IiIHdpbGwgYmUgcmFpc2VkIGlmIHRoZXJlIGFyZVxuICAgYW55IG5vbi1zdHJpbmcgdmFsdWVzIGluICppdGVyYWJsZSosIGluY2x1ZGluZyAiYnl0ZXMiIG9iamVjdHMuXG4gICBUaGUgc2VwYXJhdG9yIGJldHdlZW4gZWxlbWVudHMgaXMgdGhlIHN0cmluZyBwcm92aWRpbmcgdGhpcyBtZXRob2QuXG5cbnN0ci5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouXG4gICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGFuIEFTQ0lJXG4gICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3JcbiAgIGVxdWFsIHRvICJsZW4ocykiLlxuXG5zdHIubG93ZXIoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdXG4gICBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuXG4gICBUaGUgbG93ZXJjYXNpbmcgYWxnb3JpdGhtIHVzZWQgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gMy4xMyBvZiB0aGVcbiAgIFVuaWNvZGUgU3RhbmRhcmQuXG5cbnN0ci5sc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBUaGVcbiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmVcbiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG9cbiAgIHJlbW92aW5nIHdoaXRlc3BhY2UuICBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBub3QgYSBwcmVmaXg7IHJhdGhlcixcbiAgIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUgc3RyaXBwZWQ6XG5cbiAgICAgID4+PiBcJyAgIHNwYWNpb3VzICAgXCcubHN0cmlwKClcbiAgICAgIFwnc3BhY2lvdXMgICBcJ1xuICAgICAgPj4+IFwnd3d3LmV4YW1wbGUuY29tXCcubHN0cmlwKFwnY21vd3ouXCcpXG4gICAgICBcJ2V4YW1wbGUuY29tXCdcblxuc3RhdGljIHN0ci5tYWtldHJhbnMoeFssIHlbLCB6XV0pXG5cbiAgIFRoaXMgc3RhdGljIG1ldGhvZCByZXR1cm5zIGEgdHJhbnNsYXRpb24gdGFibGUgdXNhYmxlIGZvclxuICAgInN0ci50cmFuc2xhdGUoKSIuXG5cbiAgIElmIHRoZXJlIGlzIG9ubHkgb25lIGFyZ3VtZW50LCBpdCBtdXN0IGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nXG4gICBVbmljb2RlIG9yZGluYWxzIChpbnRlZ2Vycykgb3IgY2hhcmFjdGVycyAoc3RyaW5ncyBvZiBsZW5ndGggMSkgdG9cbiAgIFVuaWNvZGUgb3JkaW5hbHMsIHN0cmluZ3MgKG9mIGFyYml0cmFyeSBsZW5ndGhzKSBvciBOb25lLlxuICAgQ2hhcmFjdGVyIGtleXMgd2lsbCB0aGVuIGJlIGNvbnZlcnRlZCB0byBvcmRpbmFscy5cblxuICAgSWYgdGhlcmUgYXJlIHR3byBhcmd1bWVudHMsIHRoZXkgbXVzdCBiZSBzdHJpbmdzIG9mIGVxdWFsIGxlbmd0aCxcbiAgIGFuZCBpbiB0aGUgcmVzdWx0aW5nIGRpY3Rpb25hcnksIGVhY2ggY2hhcmFjdGVyIGluIHggd2lsbCBiZSBtYXBwZWRcbiAgIHRvIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4geS4gIElmIHRoZXJlIGlzIGEgdGhpcmRcbiAgIGFyZ3VtZW50LCBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aG9zZSBjaGFyYWN0ZXJzIHdpbGwgYmUgbWFwcGVkIHRvXG4gICBOb25lIGluIHRoZSByZXN1bHQuXG5cbnN0ci5wYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICpzZXAqLCBhbmQgcmV0dXJuIGFcbiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxuICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90XG4gICBmb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgaXRzZWxmLCBmb2xsb3dlZCBieVxuICAgdHdvIGVtcHR5IHN0cmluZ3MuXG5cbnN0ci5yZXBsYWNlKG9sZCwgbmV3WywgY291bnRdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nICpvbGQqXG4gICByZXBsYWNlZCBieSAqbmV3Ki4gIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCAqY291bnQqIGlzIGdpdmVuLCBvbmx5XG4gICB0aGUgZmlyc3QgKmNvdW50KiBvY2N1cnJlbmNlcyBhcmUgcmVwbGFjZWQuXG5cbnN0ci5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgKnN1YiogaXNcbiAgIGZvdW5kLCBzdWNoIHRoYXQgKnN1YiogaXMgY29udGFpbmVkIHdpdGhpbiAic1tzdGFydDplbmRdIi5cbiAgIE9wdGlvbmFsIGFyZ3VtZW50cyAqc3RhcnQqIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2VcbiAgIG5vdGF0aW9uLiAgUmV0dXJuICItMSIgb24gZmFpbHVyZS5cblxuc3RyLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlICJyZmluZCgpIiBidXQgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuIHRoZSBzdWJzdHJpbmcgKnN1YiogaXNcbiAgIG5vdCBmb3VuZC5cblxuc3RyLnJqdXN0KHdpZHRoWywgZmlsbGNoYXJdKVxuXG4gICBSZXR1cm4gdGhlIHN0cmluZyByaWdodCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouXG4gICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGFuIEFTQ0lJXG4gICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3JcbiAgIGVxdWFsIHRvICJsZW4ocykiLlxuXG5zdHIucnBhcnRpdGlvbihzZXApXG5cbiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5ncywgZm9sbG93ZWQgYnlcbiAgIHRoZSBzdHJpbmcgaXRzZWxmLlxuXG5zdHIucnNwbGl0KHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcblxuICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgKnNlcCogYXMgdGhlXG4gICBkZWxpbWl0ZXIgc3RyaW5nLiBJZiAqbWF4c3BsaXQqIGlzIGdpdmVuLCBhdCBtb3N0ICptYXhzcGxpdCogc3BsaXRzXG4gICBhcmUgZG9uZSwgdGhlICpyaWdodG1vc3QqIG9uZXMuICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yXG4gICAiTm9uZSIsIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCBmb3Igc3BsaXR0aW5nXG4gICBmcm9tIHRoZSByaWdodCwgInJzcGxpdCgpIiBiZWhhdmVzIGxpa2UgInNwbGl0KCkiIHdoaWNoIGlzXG4gICBkZXNjcmliZWQgaW4gZGV0YWlsIGJlbG93LlxuXG5zdHIucnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRyYWlsaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0b1xuICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHN1ZmZpeDsgcmF0aGVyLFxuICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5yc3RyaXAoKVxuICAgICAgXCcgICBzcGFjaW91c1wnXG4gICAgICA+Pj4gXCdtaXNzaXNzaXBwaVwnLnJzdHJpcChcJ2lwelwnKVxuICAgICAgXCdtaXNzaXNzXCdcblxuc3RyLnNwbGl0KHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcblxuICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgKnNlcCogYXMgdGhlXG4gICBkZWxpbWl0ZXIgc3RyaW5nLiAgSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqXG4gICBzcGxpdHMgYXJlIGRvbmUgKHRodXMsIHRoZSBsaXN0IHdpbGwgaGF2ZSBhdCBtb3N0ICJtYXhzcGxpdCsxIlxuICAgZWxlbWVudHMpLiAgSWYgKm1heHNwbGl0KiBpcyBub3Qgc3BlY2lmaWVkIG9yICItMSIsIHRoZW4gdGhlcmUgaXNcbiAgIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzIChhbGwgcG9zc2libGUgc3BsaXRzIGFyZSBtYWRlKS5cblxuICAgSWYgKnNlcCogaXMgZ2l2ZW4sIGNvbnNlY3V0aXZlIGRlbGltaXRlcnMgYXJlIG5vdCBncm91cGVkIHRvZ2V0aGVyXG4gICBhbmQgYXJlIGRlZW1lZCB0byBkZWxpbWl0IGVtcHR5IHN0cmluZ3MgKGZvciBleGFtcGxlLFxuICAgIlwnMSwsMlwnLnNwbGl0KFwnLFwnKSIgcmV0dXJucyAiW1wnMVwnLCBcJ1wnLCBcJzJcJ10iKS4gIFRoZSAqc2VwKiBhcmd1bWVudFxuICAgbWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgY2hhcmFjdGVycyAoZm9yIGV4YW1wbGUsXG4gICAiXCcxPD4yPD4zXCcuc3BsaXQoXCc8PlwnKSIgcmV0dXJucyAiW1wnMVwnLCBcJzJcJywgXCczXCddIikuIFNwbGl0dGluZyBhblxuICAgZW1wdHkgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgc2VwYXJhdG9yIHJldHVybnMgIltcJ1wnXSIuXG5cbiAgIEZvciBleGFtcGxlOlxuXG4gICAgICA+Pj4gXCcxLDIsM1wnLnNwbGl0KFwnLFwnKVxuICAgICAgW1wnMVwnLCBcJzJcJywgXCczXCddXG4gICAgICA+Pj4gXCcxLDIsM1wnLnNwbGl0KFwnLFwnLCBtYXhzcGxpdD0xKVxuICAgICAgW1wnMVwnLCBcJzIsM1wnXVxuICAgICAgPj4+IFwnMSwyLCwzLFwnLnNwbGl0KFwnLFwnKVxuICAgICAgW1wnMVwnLCBcJzJcJywgXCdcJywgXCczXCcsIFwnXCddXG5cbiAgIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgIk5vbmUiLCBhIGRpZmZlcmVudCBzcGxpdHRpbmdcbiAgIGFsZ29yaXRobSBpcyBhcHBsaWVkOiBydW5zIG9mIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgYXJlIHJlZ2FyZGVkXG4gICBhcyBhIHNpbmdsZSBzZXBhcmF0b3IsIGFuZCB0aGUgcmVzdWx0IHdpbGwgY29udGFpbiBubyBlbXB0eSBzdHJpbmdzXG4gICBhdCB0aGUgc3RhcnQgb3IgZW5kIGlmIHRoZSBzdHJpbmcgaGFzIGxlYWRpbmcgb3IgdHJhaWxpbmdcbiAgIHdoaXRlc3BhY2UuICBDb25zZXF1ZW50bHksIHNwbGl0dGluZyBhbiBlbXB0eSBzdHJpbmcgb3IgYSBzdHJpbmdcbiAgIGNvbnNpc3Rpbmcgb2YganVzdCB3aGl0ZXNwYWNlIHdpdGggYSAiTm9uZSIgc2VwYXJhdG9yIHJldHVybnMgIltdIi5cblxuICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiBcJzEgMiAzXCcuc3BsaXQoKVxuICAgICAgW1wnMVwnLCBcJzJcJywgXCczXCddXG4gICAgICA+Pj4gXCcxIDIgM1wnLnNwbGl0KG1heHNwbGl0PTEpXG4gICAgICBbXCcxXCcsIFwnMiAzXCddXG4gICAgICA+Pj4gXCcgICAxICAgMiAgIDMgICBcJy5zcGxpdCgpXG4gICAgICBbXCcxXCcsIFwnMlwnLCBcJzNcJ11cblxuc3RyLnNwbGl0bGluZXMoW2tlZXBlbmRzXSlcblxuICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgbGluZVxuICAgYm91bmRhcmllcy4gIExpbmUgYnJlYWtzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0XG4gICB1bmxlc3MgKmtlZXBlbmRzKiBpcyBnaXZlbiBhbmQgdHJ1ZS5cblxuICAgVGhpcyBtZXRob2Qgc3BsaXRzIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBib3VuZGFyaWVzLiAgSW5cbiAgIHBhcnRpY3VsYXIsIHRoZSBib3VuZGFyaWVzIGFyZSBhIHN1cGVyc2V0IG9mICp1bml2ZXJzYWwgbmV3bGluZXMqLlxuXG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBSZXByZXNlbnRhdGlvbiAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8ICJcXG4iICAgICAgICAgICAgICAgICAgICB8IExpbmUgRmVlZCAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHIiICAgICAgICAgICAgICAgICAgICB8IENhcnJpYWdlIFJldHVybiAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHJcXG4iICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSBSZXR1cm4gKyBMaW5lIEZlZWQgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx2IiBvciAiXFx4MGIiICAgICAgICAgIHwgTGluZSBUYWJ1bGF0aW9uICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcZiIgb3IgIlxceDBjIiAgICAgICAgICB8IEZvcm0gRmVlZCAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHgxYyIgICAgICAgICAgICAgICAgICB8IEZpbGUgU2VwYXJhdG9yICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHgxZCIgICAgICAgICAgICAgICAgICB8IEdyb3VwIFNlcGFyYXRvciAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHgxZSIgICAgICAgICAgICAgICAgICB8IFJlY29yZCBTZXBhcmF0b3IgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHg4NSIgICAgICAgICAgICAgICAgICB8IE5leHQgTGluZSAoQzEgQ29udHJvbCBDb2RlKSAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHUyMDI4IiAgICAgICAgICAgICAgICB8IExpbmUgU2VwYXJhdG9yICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHUyMDI5IiAgICAgICAgICAgICAgICB8IFBhcmFncmFwaCBTZXBhcmF0b3IgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjI6ICJcXHYiIGFuZCAiXFxmIiBhZGRlZCB0byBsaXN0IG9mIGxpbmVcbiAgIGJvdW5kYXJpZXMuXG5cbiAgIEZvciBleGFtcGxlOlxuXG4gICAgICA+Pj4gXCdhYiBjXFxuXFxuZGUgZmdcXHJrbFxcclxcblwnLnNwbGl0bGluZXMoKVxuICAgICAgW1wnYWIgY1wnLCBcJ1wnLCBcJ2RlIGZnXCcsIFwna2xcJ11cbiAgICAgID4+PiBcJ2FiIGNcXG5cXG5kZSBmZ1xccmtsXFxyXFxuXCcuc3BsaXRsaW5lcyhrZWVwZW5kcz1UcnVlKVxuICAgICAgW1wnYWIgY1xcblwnLCBcJ1xcblwnLCBcJ2RlIGZnXFxyXCcsIFwna2xcXHJcXG5cJ11cblxuICAgVW5saWtlICJzcGxpdCgpIiB3aGVuIGEgZGVsaW1pdGVyIHN0cmluZyAqc2VwKiBpcyBnaXZlbiwgdGhpc1xuICAgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgbGlzdCBmb3IgdGhlIGVtcHR5IHN0cmluZywgYW5kIGEgdGVybWluYWxcbiAgIGxpbmUgYnJlYWsgZG9lcyBub3QgcmVzdWx0IGluIGFuIGV4dHJhIGxpbmU6XG5cbiAgICAgID4+PiAiIi5zcGxpdGxpbmVzKClcbiAgICAgIFtdXG4gICAgICA+Pj4gIk9uZSBsaW5lXFxuIi5zcGxpdGxpbmVzKClcbiAgICAgIFtcJ09uZSBsaW5lXCddXG5cbiAgIEZvciBjb21wYXJpc29uLCAic3BsaXQoXCdcXG5cJykiIGdpdmVzOlxuXG4gICAgICA+Pj4gXCdcJy5zcGxpdChcJ1xcblwnKVxuICAgICAgW1wnXCddXG4gICAgICA+Pj4gXCdUd28gbGluZXNcXG5cJy5zcGxpdChcJ1xcblwnKVxuICAgICAgW1wnVHdvIGxpbmVzXCcsIFwnXCddXG5cbnN0ci5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiAiVHJ1ZSIgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSAqcHJlZml4Kiwgb3RoZXJ3aXNlIHJldHVyblxuICAgIkZhbHNlIi4gKnByZWZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBwcmVmaXhlcyB0byBsb29rIGZvci5cbiAgIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBzdHJpbmcgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG4gICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdCBwb3NpdGlvbi5cblxuc3RyLnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuICAgY2hhcmFjdGVycyByZW1vdmVkLiBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZVxuICAgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVtb3ZlZC4gSWYgb21pdHRlZCBvciAiTm9uZSIsIHRoZSAqY2hhcnMqXG4gICBhcmd1bWVudCBkZWZhdWx0cyB0byByZW1vdmluZyB3aGl0ZXNwYWNlLiBUaGUgKmNoYXJzKiBhcmd1bWVudCBpc1xuICAgbm90IGEgcHJlZml4IG9yIHN1ZmZpeDsgcmF0aGVyLCBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlXG4gICBzdHJpcHBlZDpcblxuICAgICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5zdHJpcCgpXG4gICAgICBcJ3NwYWNpb3VzXCdcbiAgICAgID4+PiBcJ3d3dy5leGFtcGxlLmNvbVwnLnN0cmlwKFwnY21vd3ouXCcpXG4gICAgICBcJ2V4YW1wbGVcJ1xuXG4gICBUaGUgb3V0ZXJtb3N0IGxlYWRpbmcgYW5kIHRyYWlsaW5nICpjaGFycyogYXJndW1lbnQgdmFsdWVzIGFyZVxuICAgc3RyaXBwZWQgZnJvbSB0aGUgc3RyaW5nLiBDaGFyYWN0ZXJzIGFyZSByZW1vdmVkIGZyb20gdGhlIGxlYWRpbmdcbiAgIGVuZCB1bnRpbCByZWFjaGluZyBhIHN0cmluZyBjaGFyYWN0ZXIgdGhhdCBpcyBub3QgY29udGFpbmVkIGluIHRoZVxuICAgc2V0IG9mIGNoYXJhY3RlcnMgaW4gKmNoYXJzKi4gQSBzaW1pbGFyIGFjdGlvbiB0YWtlcyBwbGFjZSBvbiB0aGVcbiAgIHRyYWlsaW5nIGVuZC4gRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiBjb21tZW50X3N0cmluZyA9IFwnIy4uLi4uLi4gU2VjdGlvbiAzLjIuMSBJc3N1ZSAjMzIgLi4uLi4uLlwnXG4gICAgICA+Pj4gY29tbWVudF9zdHJpbmcuc3RyaXAoXCcuIyEgXCcpXG4gICAgICBcJ1NlY3Rpb24gMy4yLjEgSXNzdWUgIzMyXCdcblxuc3RyLnN3YXBjYXNlKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdXBwZXJjYXNlIGNoYXJhY3RlcnMgY29udmVydGVkIHRvXG4gICBsb3dlcmNhc2UgYW5kIHZpY2UgdmVyc2EuIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZSB0aGF0XG4gICAicy5zd2FwY2FzZSgpLnN3YXBjYXNlKCkgPT0gcyIuXG5cbnN0ci50aXRsZSgpXG5cbiAgIFJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoZXJlIHdvcmRzIHN0YXJ0IHdpdGggYW5cbiAgIHVwcGVyY2FzZSBjaGFyYWN0ZXIgYW5kIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgbG93ZXJjYXNlLlxuXG4gICBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+IFwnSGVsbG8gd29ybGRcJy50aXRsZSgpXG4gICAgICBcJ0hlbGxvIFdvcmxkXCdcblxuICAgVGhlIGFsZ29yaXRobSB1c2VzIGEgc2ltcGxlIGxhbmd1YWdlLWluZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYVxuICAgd29yZCBhcyBncm91cHMgb2YgY29uc2VjdXRpdmUgbGV0dGVycy4gIFRoZSBkZWZpbml0aW9uIHdvcmtzIGluXG4gICBtYW55IGNvbnRleHRzIGJ1dCBpdCBtZWFucyB0aGF0IGFwb3N0cm9waGVzIGluIGNvbnRyYWN0aW9ucyBhbmRcbiAgIHBvc3Nlc3NpdmVzIGZvcm0gd29yZCBib3VuZGFyaWVzLCB3aGljaCBtYXkgbm90IGJlIHRoZSBkZXNpcmVkXG4gICByZXN1bHQ6XG5cbiAgICAgID4+PiAidGhleVwncmUgYmlsbFwncyBmcmllbmRzIGZyb20gdGhlIFVLIi50aXRsZSgpXG4gICAgICAiVGhleVwnUmUgQmlsbFwnUyBGcmllbmRzIEZyb20gVGhlIFVrIlxuXG4gICBBIHdvcmthcm91bmQgZm9yIGFwb3N0cm9waGVzIGNhbiBiZSBjb25zdHJ1Y3RlZCB1c2luZyByZWd1bGFyXG4gICBleHByZXNzaW9uczpcblxuICAgICAgPj4+IGltcG9ydCByZVxuICAgICAgPj4+IGRlZiB0aXRsZWNhc2Uocyk6XG4gICAgICAuLi4gICAgIHJldHVybiByZS5zdWIociJbQS1aYS16XSsoXCdbQS1aYS16XSspPyIsXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgbGFtYmRhIG1vOiBtby5ncm91cCgwKVswXS51cHBlcigpICtcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vLmdyb3VwKDApWzE6XS5sb3dlcigpLFxuICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHMpXG4gICAgICAuLi5cbiAgICAgID4+PiB0aXRsZWNhc2UoInRoZXlcJ3JlIGJpbGxcJ3MgZnJpZW5kcy4iKVxuICAgICAgIlRoZXlcJ3JlIEJpbGxcJ3MgRnJpZW5kcy4iXG5cbnN0ci50cmFuc2xhdGUodGFibGUpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBpbiB3aGljaCBlYWNoIGNoYXJhY3RlciBoYXMgYmVlbiBtYXBwZWRcbiAgIHRocm91Z2ggdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLiAgVGhlIHRhYmxlIG11c3QgYmUgYW4gb2JqZWN0XG4gICB0aGF0IGltcGxlbWVudHMgaW5kZXhpbmcgdmlhICJfX2dldGl0ZW1fXygpIiwgdHlwaWNhbGx5IGEgKm1hcHBpbmcqXG4gICBvciAqc2VxdWVuY2UqLiAgV2hlbiBpbmRleGVkIGJ5IGEgVW5pY29kZSBvcmRpbmFsIChhbiBpbnRlZ2VyKSwgdGhlXG4gICB0YWJsZSBvYmplY3QgY2FuIGRvIGFueSBvZiB0aGUgZm9sbG93aW5nOiByZXR1cm4gYSBVbmljb2RlIG9yZGluYWxcbiAgIG9yIGEgc3RyaW5nLCB0byBtYXAgdGhlIGNoYXJhY3RlciB0byBvbmUgb3IgbW9yZSBvdGhlciBjaGFyYWN0ZXJzO1xuICAgcmV0dXJuICJOb25lIiwgdG8gZGVsZXRlIHRoZSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmV0dXJuIHN0cmluZzsgb3JcbiAgIHJhaXNlIGEgIkxvb2t1cEVycm9yIiBleGNlcHRpb24sIHRvIG1hcCB0aGUgY2hhcmFjdGVyIHRvIGl0c2VsZi5cblxuICAgWW91IGNhbiB1c2UgInN0ci5tYWtldHJhbnMoKSIgdG8gY3JlYXRlIGEgdHJhbnNsYXRpb24gbWFwIGZyb21cbiAgIGNoYXJhY3Rlci10by1jaGFyYWN0ZXIgbWFwcGluZ3MgaW4gZGlmZmVyZW50IGZvcm1hdHMuXG5cbiAgIFNlZSBhbHNvIHRoZSAiY29kZWNzIiBtb2R1bGUgZm9yIGEgbW9yZSBmbGV4aWJsZSBhcHByb2FjaCB0byBjdXN0b21cbiAgIGNoYXJhY3RlciBtYXBwaW5ncy5cblxuc3RyLnVwcGVyKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCBjaGFyYWN0ZXJzIFs0XVxuICAgY29udmVydGVkIHRvIHVwcGVyY2FzZS4gIE5vdGUgdGhhdCAic3RyLnVwcGVyKCkuaXN1cHBlcigpIiBtaWdodCBiZVxuICAgIkZhbHNlIiBpZiAicyIgY29udGFpbnMgdW5jYXNlZCBjaGFyYWN0ZXJzIG9yIGlmIHRoZSBVbmljb2RlXG4gICBjYXRlZ29yeSBvZiB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlcihzKSBpcyBub3QgIkx1IiAoTGV0dGVyLFxuICAgdXBwZXJjYXNlKSwgYnV0IGUuZy4gIkx0IiAoTGV0dGVyLCB0aXRsZWNhc2UpLlxuXG4gICBUaGUgdXBwZXJjYXNpbmcgYWxnb3JpdGhtIHVzZWQgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gMy4xMyBvZiB0aGVcbiAgIFVuaWNvZGUgU3RhbmRhcmQuXG5cbnN0ci56ZmlsbCh3aWR0aClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIGxlZnQgZmlsbGVkIHdpdGggQVNDSUkgIlwnMFwnIiBkaWdpdHMgdG9cbiAgIG1ha2UgYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouIEEgbGVhZGluZyBzaWduIHByZWZpeFxuICAgKCJcJytcJyIvIlwnLVwnIikgaXMgaGFuZGxlZCBieSBpbnNlcnRpbmcgdGhlIHBhZGRpbmcgKmFmdGVyKiB0aGUgc2lnblxuICAgY2hhcmFjdGVyIHJhdGhlciB0aGFuIGJlZm9yZS4gVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZlxuICAgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gImxlbihzKSIuXG5cbiAgIEZvciBleGFtcGxlOlxuXG4gICAgICA+Pj4gIjQyIi56ZmlsbCg1KVxuICAgICAgXCcwMDA0MlwnXG4gICAgICA+Pj4gIi00MiIuemZpbGwoNSlcbiAgICAgIFwnLTAwNDJcJ1xuJywKLSAnc3RyaW5ncyc6IHUnXG5TdHJpbmcgYW5kIEJ5dGVzIGxpdGVyYWxzXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG5cblN0cmluZyBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgc3RyaW5nbGl0ZXJhbCAgIDo6PSBbc3RyaW5ncHJlZml4XShzaG9ydHN0cmluZyB8IGxvbmdzdHJpbmcpXG4gICBzdHJpbmdwcmVmaXggICAgOjo9ICJyIiB8ICJ1IiB8ICJSIiB8ICJVIlxuICAgc2hvcnRzdHJpbmcgICAgIDo6PSAiXCciIHNob3J0c3RyaW5naXRlbSogIlwnIiB8IFwnIlwnIHNob3J0c3RyaW5naXRlbSogXCciXCdcbiAgIGxvbmdzdHJpbmcgICAgICA6Oj0gIlwnXCdcJyIgbG9uZ3N0cmluZ2l0ZW0qICJcJ1wnXCciIHwgXCciIiJcJyBsb25nc3RyaW5naXRlbSogXCciIiJcJ1xuICAgc2hvcnRzdHJpbmdpdGVtIDo6PSBzaG9ydHN0cmluZ2NoYXIgfCBzdHJpbmdlc2NhcGVzZXFcbiAgIGxvbmdzdHJpbmdpdGVtICA6Oj0gbG9uZ3N0cmluZ2NoYXIgfCBzdHJpbmdlc2NhcGVzZXFcbiAgIHNob3J0c3RyaW5nY2hhciA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiIG9yIG5ld2xpbmUgb3IgdGhlIHF1b3RlPlxuICAgbG9uZ3N0cmluZ2NoYXIgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCI+XG4gICBzdHJpbmdlc2NhcGVzZXEgOjo9ICJcXCIgPGFueSBzb3VyY2UgY2hhcmFjdGVyPlxuXG4gICBieXRlc2xpdGVyYWwgICA6Oj0gYnl0ZXNwcmVmaXgoc2hvcnRieXRlcyB8IGxvbmdieXRlcylcbiAgIGJ5dGVzcHJlZml4ICAgIDo6PSAiYiIgfCAiQiIgfCAiYnIiIHwgIkJyIiB8ICJiUiIgfCAiQlIiIHwgInJiIiB8ICJyQiIgfCAiUmIiIHwgIlJCIlxuICAgc2hvcnRieXRlcyAgICAgOjo9ICJcJyIgc2hvcnRieXRlc2l0ZW0qICJcJyIgfCBcJyJcJyBzaG9ydGJ5dGVzaXRlbSogXCciXCdcbiAgIGxvbmdieXRlcyAgICAgIDo6PSAiXCdcJ1wnIiBsb25nYnl0ZXNpdGVtKiAiXCdcJ1wnIiB8IFwnIiIiXCcgbG9uZ2J5dGVzaXRlbSogXCciIiJcJ1xuICAgc2hvcnRieXRlc2l0ZW0gOjo9IHNob3J0Ynl0ZXNjaGFyIHwgYnl0ZXNlc2NhcGVzZXFcbiAgIGxvbmdieXRlc2l0ZW0gIDo6PSBsb25nYnl0ZXNjaGFyIHwgYnl0ZXNlc2NhcGVzZXFcbiAgIHNob3J0Ynl0ZXNjaGFyIDo6PSA8YW55IEFTQ0lJIGNoYXJhY3RlciBleGNlcHQgIlxcIiBvciBuZXdsaW5lIG9yIHRoZSBxdW90ZT5cbiAgIGxvbmdieXRlc2NoYXIgIDo6PSA8YW55IEFTQ0lJIGNoYXJhY3RlciBleGNlcHQgIlxcIj5cbiAgIGJ5dGVzZXNjYXBlc2VxIDo6PSAiXFwiIDxhbnkgQVNDSUkgY2hhcmFjdGVyPlxuXG5PbmUgc3ludGFjdGljIHJlc3RyaWN0aW9uIG5vdCBpbmRpY2F0ZWQgYnkgdGhlc2UgcHJvZHVjdGlvbnMgaXMgdGhhdFxud2hpdGVzcGFjZSBpcyBub3QgYWxsb3dlZCBiZXR3ZWVuIHRoZSAic3RyaW5ncHJlZml4IiBvciAiYnl0ZXNwcmVmaXgiXG5hbmQgdGhlIHJlc3Qgb2YgdGhlIGxpdGVyYWwuIFRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldCBpcyBkZWZpbmVkIGJ5XG50aGUgZW5jb2RpbmcgZGVjbGFyYXRpb247IGl0IGlzIFVURi04IGlmIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uIGlzXG5naXZlbiBpbiB0aGUgc291cmNlIGZpbGU7IHNlZSBzZWN0aW9uICpFbmNvZGluZyBkZWNsYXJhdGlvbnMqLlxuXG5JbiBwbGFpbiBFbmdsaXNoOiBCb3RoIHR5cGVzIG9mIGxpdGVyYWxzIGNhbiBiZSBlbmNsb3NlZCBpbiBtYXRjaGluZ1xuc2luZ2xlIHF1b3RlcyAoIlwnIikgb3IgZG91YmxlIHF1b3RlcyAoIiIiKS4gIFRoZXkgY2FuIGFsc28gYmUgZW5jbG9zZWRcbmluIG1hdGNoaW5nIGdyb3VwcyBvZiB0aHJlZSBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyAodGhlc2UgYXJlXG5nZW5lcmFsbHkgcmVmZXJyZWQgdG8gYXMgKnRyaXBsZS1xdW90ZWQgc3RyaW5ncyopLiAgVGhlIGJhY2tzbGFzaFxuKCJcXCIpIGNoYXJhY3RlciBpcyB1c2VkIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgb3RoZXJ3aXNlIGhhdmUgYVxuc3BlY2lhbCBtZWFuaW5nLCBzdWNoIGFzIG5ld2xpbmUsIGJhY2tzbGFzaCBpdHNlbGYsIG9yIHRoZSBxdW90ZVxuY2hhcmFjdGVyLlxuXG5CeXRlcyBsaXRlcmFscyBhcmUgYWx3YXlzIHByZWZpeGVkIHdpdGggIlwnYlwnIiBvciAiXCdCXCciOyB0aGV5IHByb2R1Y2VcbmFuIGluc3RhbmNlIG9mIHRoZSAiYnl0ZXMiIHR5cGUgaW5zdGVhZCBvZiB0aGUgInN0ciIgdHlwZS4gIFRoZXkgbWF5XG5vbmx5IGNvbnRhaW4gQVNDSUkgY2hhcmFjdGVyczsgYnl0ZXMgd2l0aCBhIG51bWVyaWMgdmFsdWUgb2YgMTI4IG9yXG5ncmVhdGVyIG11c3QgYmUgZXhwcmVzc2VkIHdpdGggZXNjYXBlcy5cblxuQXMgb2YgUHl0aG9uIDMuMyBpdCBpcyBwb3NzaWJsZSBhZ2FpbiB0byBwcmVmaXggc3RyaW5nIGxpdGVyYWxzIHdpdGggYVxuInUiIHByZWZpeCB0byBzaW1wbGlmeSBtYWludGVuYW5jZSBvZiBkdWFsIDIueCBhbmQgMy54IGNvZGViYXNlcy5cblxuQm90aCBzdHJpbmcgYW5kIGJ5dGVzIGxpdGVyYWxzIG1heSBvcHRpb25hbGx5IGJlIHByZWZpeGVkIHdpdGggYVxubGV0dGVyICJcJ3JcJyIgb3IgIlwnUlwnIjsgc3VjaCBzdHJpbmdzIGFyZSBjYWxsZWQgKnJhdyBzdHJpbmdzKiBhbmQgdHJlYXRcbmJhY2tzbGFzaGVzIGFzIGxpdGVyYWwgY2hhcmFjdGVycy4gIEFzIGEgcmVzdWx0LCBpbiBzdHJpbmcgbGl0ZXJhbHMsXG4iXCdcXFVcJyIgYW5kICJcJ1xcdVwnIiBlc2NhcGVzIGluIHJhdyBzdHJpbmdzIGFyZSBub3QgdHJlYXRlZCBzcGVjaWFsbHkuXG5HaXZlbiB0aGF0IFB5dGhvbiAyLnhcJ3MgcmF3IHVuaWNvZGUgbGl0ZXJhbHMgYmVoYXZlIGRpZmZlcmVudGx5IHRoYW5cblB5dGhvbiAzLnhcJ3MgdGhlICJcJ3VyXCciIHN5bnRheCBpcyBub3Qgc3VwcG9ydGVkLlxuXG5OZXcgaW4gdmVyc2lvbiAzLjM6IFRoZSAiXCdyYlwnIiBwcmVmaXggb2YgcmF3IGJ5dGVzIGxpdGVyYWxzIGhhcyBiZWVuXG5hZGRlZCBhcyBhIHN5bm9ueW0gb2YgIlwnYnJcJyIuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuMzogU3VwcG9ydCBmb3IgdGhlIHVuaWNvZGUgbGVnYWN5IGxpdGVyYWxcbigidVwndmFsdWVcJyIpIHdhcyByZWludHJvZHVjZWQgdG8gc2ltcGxpZnkgdGhlIG1haW50ZW5hbmNlIG9mIGR1YWxcblB5dGhvbiAyLnggYW5kIDMueCBjb2RlYmFzZXMuIFNlZSAqKlBFUCA0MTQqKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuSW4gdHJpcGxlLXF1b3RlZCBsaXRlcmFscywgdW5lc2NhcGVkIG5ld2xpbmVzIGFuZCBxdW90ZXMgYXJlIGFsbG93ZWRcbihhbmQgYXJlIHJldGFpbmVkKSwgZXhjZXB0IHRoYXQgdGhyZWUgdW5lc2NhcGVkIHF1b3RlcyBpbiBhIHJvd1xudGVybWluYXRlIHRoZSBsaXRlcmFsLiAgKEEgInF1b3RlIiBpcyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gb3BlbiB0aGVcbmxpdGVyYWwsIGkuZS4gZWl0aGVyICJcJyIgb3IgIiIiLilcblxuVW5sZXNzIGFuICJcJ3JcJyIgb3IgIlwnUlwnIiBwcmVmaXggaXMgcHJlc2VudCwgZXNjYXBlIHNlcXVlbmNlcyBpbiBzdHJpbmdcbmFuZCBieXRlcyBsaXRlcmFscyBhcmUgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHJ1bGVzIHNpbWlsYXIgdG8gdGhvc2VcbnVzZWQgYnkgU3RhbmRhcmQgQy4gIFRoZSByZWNvZ25pemVkIGVzY2FwZSBzZXF1ZW5jZXMgYXJlOlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IEVzY2FwZSBTZXF1ZW5jZSAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICB8XG4rPT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT0rXG58ICJcXG5ld2xpbmUiICAgICAgICB8IEJhY2tzbGFzaCBhbmQgbmV3bGluZSBpZ25vcmVkICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxcXCIgICAgICAgICAgICAgIHwgQmFja3NsYXNoICgiXFwiKSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxcJyIgICAgICAgICAgICAgIHwgU2luZ2xlIHF1b3RlICgiXCciKSAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFwiIiAgICAgICAgICAgICAgfCBEb3VibGUgcXVvdGUgKCIiIikgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcYSIgICAgICAgICAgICAgIHwgQVNDSUkgQmVsbCAoQkVMKSAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXGIiICAgICAgICAgICAgICB8IEFTQ0lJIEJhY2tzcGFjZSAoQlMpICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxmIiAgICAgICAgICAgICAgfCBBU0NJSSBGb3JtZmVlZCAoRkYpICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcbiIgICAgICAgICAgICAgIHwgQVNDSUkgTGluZWZlZWQgKExGKSAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXHIiICAgICAgICAgICAgICB8IEFTQ0lJIENhcnJpYWdlIFJldHVybiAoQ1IpICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFx0IiAgICAgICAgICAgICAgfCBBU0NJSSBIb3Jpem9udGFsIFRhYiAoVEFCKSAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcdiIgICAgICAgICAgICAgIHwgQVNDSUkgVmVydGljYWwgVGFiIChWVCkgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXG9vbyIgICAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIG9jdGFsIHZhbHVlICpvb28qICB8ICgxLDMpICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFx4aGgiICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCBoZXggdmFsdWUgKmhoKiAgICAgfCAoMiwzKSAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcblxuRXNjYXBlIHNlcXVlbmNlcyBvbmx5IHJlY29nbml6ZWQgaW4gc3RyaW5nIGxpdGVyYWxzIGFyZTpcblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBFc2NhcGUgU2VxdWVuY2UgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgfFxuKz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09K1xufCAiXFxOe25hbWV9IiAgICAgICAgfCBDaGFyYWN0ZXIgbmFtZWQgKm5hbWUqIGluIHRoZSAgICAgfCAoNCkgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgfCBVbmljb2RlIGRhdGFiYXNlICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcdXh4eHgiICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggMTYtYml0IGhleCB2YWx1ZSAgIHwgKDUpICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgKnh4eHgqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXFV4eHh4eHh4eCIgICAgICB8IENoYXJhY3RlciB3aXRoIDMyLWJpdCBoZXggdmFsdWUgICB8ICg2KSAgICAgfFxufCAgICAgICAgICAgICAgICAgICB8ICp4eHh4eHh4eCogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuXG5Ob3RlczpcblxuMS4gQXMgaW4gU3RhbmRhcmQgQywgdXAgdG8gdGhyZWUgb2N0YWwgZGlnaXRzIGFyZSBhY2NlcHRlZC5cblxuMi4gVW5saWtlIGluIFN0YW5kYXJkIEMsIGV4YWN0bHkgdHdvIGhleCBkaWdpdHMgYXJlIHJlcXVpcmVkLlxuXG4zLiBJbiBhIGJ5dGVzIGxpdGVyYWwsIGhleGFkZWNpbWFsIGFuZCBvY3RhbCBlc2NhcGVzIGRlbm90ZSB0aGVcbiAgIGJ5dGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIEluIGEgc3RyaW5nIGxpdGVyYWwsIHRoZXNlIGVzY2FwZXNcbiAgIGRlbm90ZSBhIFVuaWNvZGUgY2hhcmFjdGVyIHdpdGggdGhlIGdpdmVuIHZhbHVlLlxuXG40LiBDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBTdXBwb3J0IGZvciBuYW1lIGFsaWFzZXMgWzFdIGhhcyBiZWVuXG4gICBhZGRlZC5cblxuNS4gRXhhY3RseSBmb3VyIGhleCBkaWdpdHMgYXJlIHJlcXVpcmVkLlxuXG42LiBBbnkgVW5pY29kZSBjaGFyYWN0ZXIgY2FuIGJlIGVuY29kZWQgdGhpcyB3YXkuICBFeGFjdGx5IGVpZ2h0XG4gICBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC5cblxuVW5saWtlIFN0YW5kYXJkIEMsIGFsbCB1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmUgbGVmdCBpbiB0aGVcbnN0cmluZyB1bmNoYW5nZWQsIGkuZS4sICp0aGUgYmFja3NsYXNoIGlzIGxlZnQgaW4gdGhlIHJlc3VsdCouICAoVGhpc1xuYmVoYXZpb3IgaXMgdXNlZnVsIHdoZW4gZGVidWdnaW5nOiBpZiBhbiBlc2NhcGUgc2VxdWVuY2UgaXMgbWlzdHlwZWQsXG50aGUgcmVzdWx0aW5nIG91dHB1dCBpcyBtb3JlIGVhc2lseSByZWNvZ25pemVkIGFzIGJyb2tlbi4pICBJdCBpcyBhbHNvXG5pbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBlc2NhcGUgc2VxdWVuY2VzIG9ubHkgcmVjb2duaXplZCBpbiBzdHJpbmdcbmxpdGVyYWxzIGZhbGwgaW50byB0aGUgY2F0ZWdvcnkgb2YgdW5yZWNvZ25pemVkIGVzY2FwZXMgZm9yIGJ5dGVzXG5saXRlcmFscy5cblxuRXZlbiBpbiBhIHJhdyBsaXRlcmFsLCBxdW90ZXMgY2FuIGJlIGVzY2FwZWQgd2l0aCBhIGJhY2tzbGFzaCwgYnV0IHRoZVxuYmFja3NsYXNoIHJlbWFpbnMgaW4gdGhlIHJlc3VsdDsgZm9yIGV4YW1wbGUsICJyIlxcIiIiIGlzIGEgdmFsaWRcbnN0cmluZyBsaXRlcmFsIGNvbnNpc3Rpbmcgb2YgdHdvIGNoYXJhY3RlcnM6IGEgYmFja3NsYXNoIGFuZCBhIGRvdWJsZVxucXVvdGU7ICJyIlxcIiIgaXMgbm90IGEgdmFsaWQgc3RyaW5nIGxpdGVyYWwgKGV2ZW4gYSByYXcgc3RyaW5nIGNhbm5vdFxuZW5kIGluIGFuIG9kZCBudW1iZXIgb2YgYmFja3NsYXNoZXMpLiAgU3BlY2lmaWNhbGx5LCAqYSByYXcgbGl0ZXJhbFxuY2Fubm90IGVuZCBpbiBhIHNpbmdsZSBiYWNrc2xhc2gqIChzaW5jZSB0aGUgYmFja3NsYXNoIHdvdWxkIGVzY2FwZVxudGhlIGZvbGxvd2luZyBxdW90ZSBjaGFyYWN0ZXIpLiAgTm90ZSBhbHNvIHRoYXQgYSBzaW5nbGUgYmFja3NsYXNoXG5mb2xsb3dlZCBieSBhIG5ld2xpbmUgaXMgaW50ZXJwcmV0ZWQgYXMgdGhvc2UgdHdvIGNoYXJhY3RlcnMgYXMgcGFydFxub2YgdGhlIGxpdGVyYWwsICpub3QqIGFzIGEgbGluZSBjb250aW51YXRpb24uXG4nLAotICdzdWJzY3JpcHRpb25zJzogdSdcblN1YnNjcmlwdGlvbnNcbioqKioqKioqKioqKipcblxuQSBzdWJzY3JpcHRpb24gc2VsZWN0cyBhbiBpdGVtIG9mIGEgc2VxdWVuY2UgKHN0cmluZywgdHVwbGUgb3IgbGlzdClcbm9yIG1hcHBpbmcgKGRpY3Rpb25hcnkpIG9iamVjdDpcblxuICAgc3Vic2NyaXB0aW9uIDo6PSBwcmltYXJ5ICJbIiBleHByZXNzaW9uX2xpc3QgIl0iXG5cblRoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IHRoYXQgc3VwcG9ydHMgc3Vic2NyaXB0aW9uXG4obGlzdHMgb3IgZGljdGlvbmFyaWVzIGZvciBleGFtcGxlKS4gIFVzZXItZGVmaW5lZCBvYmplY3RzIGNhbiBzdXBwb3J0XG5zdWJzY3JpcHRpb24gYnkgZGVmaW5pbmcgYSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuXG5Gb3IgYnVpbHQtaW4gb2JqZWN0cywgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBvYmplY3RzIHRoYXQgc3VwcG9ydFxuc3Vic2NyaXB0aW9uOlxuXG5JZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcsIHRoZSBleHByZXNzaW9uIGxpc3QgbXVzdCBldmFsdWF0ZSB0byBhblxub2JqZWN0IHdob3NlIHZhbHVlIGlzIG9uZSBvZiB0aGUga2V5cyBvZiB0aGUgbWFwcGluZywgYW5kIHRoZVxuc3Vic2NyaXB0aW9uIHNlbGVjdHMgdGhlIHZhbHVlIGluIHRoZSBtYXBwaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhhdFxua2V5LiAgKFRoZSBleHByZXNzaW9uIGxpc3QgaXMgYSB0dXBsZSBleGNlcHQgaWYgaXQgaGFzIGV4YWN0bHkgb25lXG5pdGVtLilcblxuSWYgdGhlIHByaW1hcnkgaXMgYSBzZXF1ZW5jZSwgdGhlIGV4cHJlc3Npb24gKGxpc3QpIG11c3QgZXZhbHVhdGUgdG9cbmFuIGludGVnZXIgb3IgYSBzbGljZSAoYXMgZGlzY3Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbikuXG5cblRoZSBmb3JtYWwgc3ludGF4IG1ha2VzIG5vIHNwZWNpYWwgcHJvdmlzaW9uIGZvciBuZWdhdGl2ZSBpbmRpY2VzIGluXG5zZXF1ZW5jZXM7IGhvd2V2ZXIsIGJ1aWx0LWluIHNlcXVlbmNlcyBhbGwgcHJvdmlkZSBhICJfX2dldGl0ZW1fXygpIlxubWV0aG9kIHRoYXQgaW50ZXJwcmV0cyBuZWdhdGl2ZSBpbmRpY2VzIGJ5IGFkZGluZyB0aGUgbGVuZ3RoIG9mIHRoZVxuc2VxdWVuY2UgdG8gdGhlIGluZGV4IChzbyB0aGF0ICJ4Wy0xXSIgc2VsZWN0cyB0aGUgbGFzdCBpdGVtIG9mICJ4IikuXG5UaGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhbiB0aGUgbnVtYmVyXG5vZiBpdGVtcyBpbiB0aGUgc2VxdWVuY2UsIGFuZCB0aGUgc3Vic2NyaXB0aW9uIHNlbGVjdHMgdGhlIGl0ZW0gd2hvc2VcbmluZGV4IGlzIHRoYXQgdmFsdWUgKGNvdW50aW5nIGZyb20gemVybykuIFNpbmNlIHRoZSBzdXBwb3J0IGZvclxubmVnYXRpdmUgaW5kaWNlcyBhbmQgc2xpY2luZyBvY2N1cnMgaW4gdGhlIG9iamVjdFwncyAiX19nZXRpdGVtX18oKSJcbm1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCB0byBleHBsaWNpdGx5IGFkZFxudGhhdCBzdXBwb3J0LlxuXG5BIHN0cmluZ1wncyBpdGVtcyBhcmUgY2hhcmFjdGVycy4gIEEgY2hhcmFjdGVyIGlzIG5vdCBhIHNlcGFyYXRlIGRhdGFcbnR5cGUgYnV0IGEgc3RyaW5nIG9mIGV4YWN0bHkgb25lIGNoYXJhY3Rlci5cbicsCi0gJ3RydXRoJzogdSdcblRydXRoIFZhbHVlIFRlc3RpbmdcbioqKioqKioqKioqKioqKioqKipcblxuQW55IG9iamVjdCBjYW4gYmUgdGVzdGVkIGZvciB0cnV0aCB2YWx1ZSwgZm9yIHVzZSBpbiBhbiAiaWYiIG9yXG4id2hpbGUiIGNvbmRpdGlvbiBvciBhcyBvcGVyYW5kIG9mIHRoZSBCb29sZWFuIG9wZXJhdGlvbnMgYmVsb3cuIFRoZVxuZm9sbG93aW5nIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBmYWxzZTpcblxuKiAiTm9uZSJcblxuKiAiRmFsc2UiXG5cbiogemVybyBvZiBhbnkgbnVtZXJpYyB0eXBlLCBmb3IgZXhhbXBsZSwgIjAiLCAiMC4wIiwgIjBqIi5cblxuKiBhbnkgZW1wdHkgc2VxdWVuY2UsIGZvciBleGFtcGxlLCAiXCdcJyIsICIoKSIsICJbXSIuXG5cbiogYW55IGVtcHR5IG1hcHBpbmcsIGZvciBleGFtcGxlLCAie30iLlxuXG4qIGluc3RhbmNlcyBvZiB1c2VyLWRlZmluZWQgY2xhc3NlcywgaWYgdGhlIGNsYXNzIGRlZmluZXMgYVxuICAiX19ib29sX18oKSIgb3IgIl9fbGVuX18oKSIgbWV0aG9kLCB3aGVuIHRoYXQgbWV0aG9kIHJldHVybnMgdGhlXG4gIGludGVnZXIgemVybyBvciAiYm9vbCIgdmFsdWUgIkZhbHNlIi4gWzFdXG5cbkFsbCBvdGhlciB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgdHJ1ZSAtLS0gc28gb2JqZWN0cyBvZiBtYW55IHR5cGVzIGFyZVxuYWx3YXlzIHRydWUuXG5cbk9wZXJhdGlvbnMgYW5kIGJ1aWx0LWluIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYSBCb29sZWFuIHJlc3VsdCBhbHdheXNcbnJldHVybiAiMCIgb3IgIkZhbHNlIiBmb3IgZmFsc2UgYW5kICIxIiBvciAiVHJ1ZSIgZm9yIHRydWUsIHVubGVzc1xub3RoZXJ3aXNlIHN0YXRlZC4gKEltcG9ydGFudCBleGNlcHRpb246IHRoZSBCb29sZWFuIG9wZXJhdGlvbnMgIm9yIlxuYW5kICJhbmQiIGFsd2F5cyByZXR1cm4gb25lIG9mIHRoZWlyIG9wZXJhbmRzLilcbicsCi0gJ3RyeSc6IHUnXG5UaGUgInRyeSIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqXG5cblRoZSAidHJ5IiBzdGF0ZW1lbnQgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cCBjb2RlXG5mb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzOlxuXG4gICB0cnlfc3RtdCAgOjo9IHRyeTFfc3RtdCB8IHRyeTJfc3RtdFxuICAgdHJ5MV9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgKCJleGNlcHQiIFtleHByZXNzaW9uIFsiYXMiIGlkZW50aWZpZXJdXSAiOiIgc3VpdGUpK1xuICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdXG4gICB0cnkyX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAiZmluYWxseSIgIjoiIHN1aXRlXG5cblRoZSAiZXhjZXB0IiBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuIFdoZW4gbm9cbmV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIGNsYXVzZSwgbm8gZXhjZXB0aW9uIGhhbmRsZXIgaXNcbmV4ZWN1dGVkLiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIHN1aXRlLCBhIHNlYXJjaCBmb3IgYW5cbmV4Y2VwdGlvbiBoYW5kbGVyIGlzIHN0YXJ0ZWQuICBUaGlzIHNlYXJjaCBpbnNwZWN0cyB0aGUgZXhjZXB0IGNsYXVzZXNcbmluIHR1cm4gdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiAgQW4gZXhwcmVzc2lvbi1cbmxlc3MgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgbXVzdCBiZSBsYXN0OyBpdCBtYXRjaGVzIGFueVxuZXhjZXB0aW9uLiAgRm9yIGFuIGV4Y2VwdCBjbGF1c2Ugd2l0aCBhbiBleHByZXNzaW9uLCB0aGF0IGV4cHJlc3Npb25cbmlzIGV2YWx1YXRlZCwgYW5kIHRoZSBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIGlmIHRoZSByZXN1bHRpbmdcbm9iamVjdCBpcyAiY29tcGF0aWJsZSIgd2l0aCB0aGUgZXhjZXB0aW9uLiAgQW4gb2JqZWN0IGlzIGNvbXBhdGlibGVcbndpdGggYW4gZXhjZXB0aW9uIGlmIGl0IGlzIHRoZSBjbGFzcyBvciBhIGJhc2UgY2xhc3Mgb2YgdGhlIGV4Y2VwdGlvblxub2JqZWN0IG9yIGEgdHVwbGUgY29udGFpbmluZyBhbiBpdGVtIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhjZXB0aW9uLlxuXG5JZiBubyBleGNlcHQgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNvbnRpbnVlcyBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb24gdGhlIGludm9jYXRpb24gc3RhY2suXG5bMV1cblxuSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuIGV4Y2VwdCBjbGF1c2VcbnJhaXNlcyBhbiBleGNlcHRpb24sIHRoZSBvcmlnaW5hbCBzZWFyY2ggZm9yIGEgaGFuZGxlciBpcyBjYW5jZWxlZCBhbmRcbmEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uXG50aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlICJ0cnkiIHN0YXRlbWVudCByYWlzZWRcbnRoZSBleGNlcHRpb24pLlxuXG5XaGVuIGEgbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZSBpcyBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBpcyBhc3NpZ25lZCB0b1xudGhlIHRhcmdldCBzcGVjaWZpZWQgYWZ0ZXIgdGhlICJhcyIga2V5d29yZCBpbiB0aGF0IGV4Y2VwdCBjbGF1c2UsIGlmXG5wcmVzZW50LCBhbmQgdGhlIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0XG5jbGF1c2VzIG11c3QgaGF2ZSBhbiBleGVjdXRhYmxlIGJsb2NrLiAgV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgaXNcbnJlYWNoZWQsIGV4ZWN1dGlvbiBjb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgc3RhdGVtZW50LlxuKFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZSBleGNlcHRpb24sXG5hbmQgdGhlIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIHRyeSBjbGF1c2Ugb2YgdGhlIGlubmVyIGhhbmRsZXIsIHRoZVxub3V0ZXIgaGFuZGxlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pXG5cbldoZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIGFzc2lnbmVkIHVzaW5nICJhcyB0YXJnZXQiLCBpdCBpcyBjbGVhcmVkXG5hdCB0aGUgZW5kIG9mIHRoZSBleGNlcHQgY2xhdXNlLiAgVGhpcyBpcyBhcyBpZlxuXG4gICBleGNlcHQgRSBhcyBOOlxuICAgICAgIGZvb1xuXG53YXMgdHJhbnNsYXRlZCB0b1xuXG4gICBleGNlcHQgRSBhcyBOOlxuICAgICAgIHRyeTpcbiAgICAgICAgICAgZm9vXG4gICAgICAgZmluYWxseTpcbiAgICAgICAgICAgZGVsIE5cblxuVGhpcyBtZWFucyB0aGUgZXhjZXB0aW9uIG11c3QgYmUgYXNzaWduZWQgdG8gYSBkaWZmZXJlbnQgbmFtZSB0byBiZVxuYWJsZSB0byByZWZlciB0byBpdCBhZnRlciB0aGUgZXhjZXB0IGNsYXVzZS4gIEV4Y2VwdGlvbnMgYXJlIGNsZWFyZWRcbmJlY2F1c2Ugd2l0aCB0aGUgdHJhY2ViYWNrIGF0dGFjaGVkIHRvIHRoZW0sIHRoZXkgZm9ybSBhIHJlZmVyZW5jZVxuY3ljbGUgd2l0aCB0aGUgc3RhY2sgZnJhbWUsIGtlZXBpbmcgYWxsIGxvY2FscyBpbiB0aGF0IGZyYW1lIGFsaXZlXG51bnRpbCB0aGUgbmV4dCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLlxuXG5CZWZvcmUgYW4gZXhjZXB0IGNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZCwgZGV0YWlscyBhYm91dCB0aGVcbmV4Y2VwdGlvbiBhcmUgc3RvcmVkIGluIHRoZSAic3lzIiBtb2R1bGUgYW5kIGNhbiBiZSBhY2Nlc3NlZCB2aWFcbiJzeXMuZXhjX2luZm8oKSIuICJzeXMuZXhjX2luZm8oKSIgcmV0dXJucyBhIDMtdHVwbGUgY29uc2lzdGluZyBvZiB0aGVcbmV4Y2VwdGlvbiBjbGFzcywgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSBhbmQgYSB0cmFjZWJhY2sgb2JqZWN0IChzZWVcbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopIGlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiB0aGVcbnByb2dyYW0gd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gICJzeXMuZXhjX2luZm8oKSIgdmFsdWVzIGFyZVxucmVzdG9yZWQgdG8gdGhlaXIgcHJldmlvdXMgdmFsdWVzIChiZWZvcmUgdGhlIGNhbGwpIHdoZW4gcmV0dXJuaW5nXG5mcm9tIGEgZnVuY3Rpb24gdGhhdCBoYW5kbGVkIGFuIGV4Y2VwdGlvbi5cblxuVGhlIG9wdGlvbmFsICJlbHNlIiBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyBvZmZcbnRoZSBlbmQgb2YgdGhlICJ0cnkiIGNsYXVzZS4gWzJdIEV4Y2VwdGlvbnMgaW4gdGhlICJlbHNlIiBjbGF1c2UgYXJlXG5ub3QgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nICJleGNlcHQiIGNsYXVzZXMuXG5cbklmICJmaW5hbGx5IiBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSBcJ2NsZWFudXBcJyBoYW5kbGVyLiAgVGhlICJ0cnkiXG5jbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgImV4Y2VwdCIgYW5kICJlbHNlIiBjbGF1c2VzLiAgSWYgYW5cbmV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3QgaGFuZGxlZCwgdGhlXG5leGNlcHRpb24gaXMgdGVtcG9yYXJpbHkgc2F2ZWQuIFRoZSAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkLiAgSWZcbnRoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kIG9mIHRoZSAiZmluYWxseSJcbmNsYXVzZS4gIElmIHRoZSAiZmluYWxseSIgY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiwgdGhlIHNhdmVkXG5leGNlcHRpb24gaXMgc2V0IGFzIHRoZSBjb250ZXh0IG9mIHRoZSBuZXcgZXhjZXB0aW9uLiBJZiB0aGUgImZpbmFsbHkiXG5jbGF1c2UgZXhlY3V0ZXMgYSAicmV0dXJuIiBvciAiYnJlYWsiIHN0YXRlbWVudCwgdGhlIHNhdmVkIGV4Y2VwdGlvblxuaXMgZGlzY2FyZGVkOlxuXG4gICA+Pj4gZGVmIGYoKTpcbiAgIC4uLiAgICAgdHJ5OlxuICAgLi4uICAgICAgICAgMS8wXG4gICAuLi4gICAgIGZpbmFsbHk6XG4gICAuLi4gICAgICAgICByZXR1cm4gNDJcbiAgIC4uLlxuICAgPj4+IGYoKVxuICAgNDJcblxuVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtIGR1cmluZ1xuZXhlY3V0aW9uIG9mIHRoZSAiZmluYWxseSIgY2xhdXNlLlxuXG5XaGVuIGEgInJldHVybiIsICJicmVhayIgb3IgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgaW4gdGhlXG4idHJ5IiBzdWl0ZSBvZiBhICJ0cnkiLi4uImZpbmFsbHkiIHN0YXRlbWVudCwgdGhlICJmaW5hbGx5IiBjbGF1c2UgaXNcbmFsc28gZXhlY3V0ZWQgXCdvbiB0aGUgd2F5IG91dC5cJyBBICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGlsbGVnYWwgaW5cbnRoZSAiZmluYWxseSIgY2xhdXNlLiAoVGhlIHJlYXNvbiBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY3VycmVudFxuaW1wbGVtZW50YXRpb24gLS0tIHRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlIGxpZnRlZCBpbiB0aGUgZnV0dXJlKS5cblxuVGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGxhc3QgInJldHVybiJcbnN0YXRlbWVudCBleGVjdXRlZC4gIFNpbmNlIHRoZSAiZmluYWxseSIgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgYVxuInJldHVybiIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSAiZmluYWxseSIgY2xhdXNlIHdpbGwgYWx3YXlzIGJlIHRoZVxubGFzdCBvbmUgZXhlY3V0ZWQ6XG5cbiAgID4+PiBkZWYgZm9vKCk6XG4gICAuLi4gICAgIHRyeTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBcJ3RyeVwnXG4gICAuLi4gICAgIGZpbmFsbHk6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCdmaW5hbGx5XCdcbiAgIC4uLlxuICAgPj4+IGZvbygpXG4gICBcJ2ZpbmFsbHlcJ1xuXG5BZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbipFeGNlcHRpb25zKiwgYW5kIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSAicmFpc2UiIHN0YXRlbWVudCB0b1xuZ2VuZXJhdGUgZXhjZXB0aW9ucyBtYXkgYmUgZm91bmQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG4nLAotICd0eXBlcyc6IHUnXG5UaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHlcbioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5CZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIGJ1aWx0IGludG8gUHl0aG9uLiAgRXh0ZW5zaW9uXG5tb2R1bGVzICh3cml0dGVuIGluIEMsIEphdmEsIG9yIG90aGVyIGxhbmd1YWdlcywgZGVwZW5kaW5nIG9uIHRoZVxuaW1wbGVtZW50YXRpb24pIGNhbiBkZWZpbmUgYWRkaXRpb25hbCB0eXBlcy4gIEZ1dHVyZSB2ZXJzaW9ucyBvZlxuUHl0aG9uIG1heSBhZGQgdHlwZXMgdG8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuLCByYXRpb25hbCBudW1iZXJzLFxuZWZmaWNpZW50bHkgc3RvcmVkIGFycmF5cyBvZiBpbnRlZ2VycywgZXRjLiksIGFsdGhvdWdoIHN1Y2ggYWRkaXRpb25zXG53aWxsIG9mdGVuIGJlIHByb3ZpZGVkIHZpYSB0aGUgc3RhbmRhcmQgbGlicmFyeSBpbnN0ZWFkLlxuXG5Tb21lIG9mIHRoZSB0eXBlIGRlc2NyaXB0aW9ucyBiZWxvdyBjb250YWluIGEgcGFyYWdyYXBoIGxpc3Rpbmdcblwnc3BlY2lhbCBhdHRyaWJ1dGVzLlwnICBUaGVzZSBhcmUgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZVxuaW1wbGVtZW50YXRpb24gYW5kIGFyZSBub3QgaW50ZW5kZWQgZm9yIGdlbmVyYWwgdXNlLiAgVGhlaXIgZGVmaW5pdGlvblxubWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLlxuXG5Ob25lXG4gICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpc1xuICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWUgIk5vbmUiLiBJdFxuICAgaXMgdXNlZCB0byBzaWduaWZ5IHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gbWFueSBzaXR1YXRpb25zLCBlLmcuLFxuICAgaXQgaXMgcmV0dXJuZWQgZnJvbSBmdW5jdGlvbnMgdGhhdCBkb25cJ3QgZXhwbGljaXRseSByZXR1cm5cbiAgIGFueXRoaW5nLiBJdHMgdHJ1dGggdmFsdWUgaXMgZmFsc2UuXG5cbk5vdEltcGxlbWVudGVkXG4gICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpc1xuICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWVcbiAgICJOb3RJbXBsZW1lbnRlZCIuIE51bWVyaWMgbWV0aG9kcyBhbmQgcmljaCBjb21wYXJpc29uIG1ldGhvZHNcbiAgIHNob3VsZCByZXR1cm4gdGhpcyB2YWx1ZSBpZiB0aGV5IGRvIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3JcbiAgIHRoZSBvcGVyYW5kcyBwcm92aWRlZC4gIChUaGUgaW50ZXJwcmV0ZXIgd2lsbCB0aGVuIHRyeSB0aGVcbiAgIHJlZmxlY3RlZCBvcGVyYXRpb24sIG9yIHNvbWUgb3RoZXIgZmFsbGJhY2ssIGRlcGVuZGluZyBvbiB0aGVcbiAgIG9wZXJhdG9yLikgIEl0cyB0cnV0aCB2YWx1ZSBpcyB0cnVlLlxuXG4gICBTZWUgKkltcGxlbWVudGluZyB0aGUgYXJpdGhtZXRpYyBvcGVyYXRpb25zKiBmb3IgbW9yZSBkZXRhaWxzLlxuXG5FbGxpcHNpc1xuICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXNcbiAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBsaXRlcmFsICIuLi4iIG9yIHRoZVxuICAgYnVpbHQtaW4gbmFtZSAiRWxsaXBzaXMiLiAgSXRzIHRydXRoIHZhbHVlIGlzIHRydWUuXG5cbiJudW1iZXJzLk51bWJlciJcbiAgIFRoZXNlIGFyZSBjcmVhdGVkIGJ5IG51bWVyaWMgbGl0ZXJhbHMgYW5kIHJldHVybmVkIGFzIHJlc3VsdHMgYnlcbiAgIGFyaXRobWV0aWMgb3BlcmF0b3JzIGFuZCBhcml0aG1ldGljIGJ1aWx0LWluIGZ1bmN0aW9ucy4gIE51bWVyaWNcbiAgIG9iamVjdHMgYXJlIGltbXV0YWJsZTsgb25jZSBjcmVhdGVkIHRoZWlyIHZhbHVlIG5ldmVyIGNoYW5nZXMuXG4gICBQeXRob24gbnVtYmVycyBhcmUgb2YgY291cnNlIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gbWF0aGVtYXRpY2FsXG4gICBudW1iZXJzLCBidXQgc3ViamVjdCB0byB0aGUgbGltaXRhdGlvbnMgb2YgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uXG4gICBpbiBjb21wdXRlcnMuXG5cbiAgIFB5dGhvbiBkaXN0aW5ndWlzaGVzIGJldHdlZW4gaW50ZWdlcnMsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGFuZFxuICAgY29tcGxleCBudW1iZXJzOlxuXG4gICAibnVtYmVycy5JbnRlZ3JhbCJcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBlbGVtZW50cyBmcm9tIHRoZSBtYXRoZW1hdGljYWwgc2V0IG9mIGludGVnZXJzXG4gICAgICAocG9zaXRpdmUgYW5kIG5lZ2F0aXZlKS5cblxuICAgICAgVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBpbnRlZ2VyczpcblxuICAgICAgSW50ZWdlcnMgKCJpbnQiKVxuXG4gICAgICAgICBUaGVzZSByZXByZXNlbnQgbnVtYmVycyBpbiBhbiB1bmxpbWl0ZWQgcmFuZ2UsIHN1YmplY3QgdG9cbiAgICAgICAgIGF2YWlsYWJsZSAodmlydHVhbCkgbWVtb3J5IG9ubHkuICBGb3IgdGhlIHB1cnBvc2Ugb2Ygc2hpZnRcbiAgICAgICAgIGFuZCBtYXNrIG9wZXJhdGlvbnMsIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGlzIGFzc3VtZWQsIGFuZFxuICAgICAgICAgbmVnYXRpdmUgbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgaW4gYSB2YXJpYW50IG9mIDJcJ3NcbiAgICAgICAgIGNvbXBsZW1lbnQgd2hpY2ggZ2l2ZXMgdGhlIGlsbHVzaW9uIG9mIGFuIGluZmluaXRlIHN0cmluZyBvZlxuICAgICAgICAgc2lnbiBiaXRzIGV4dGVuZGluZyB0byB0aGUgbGVmdC5cblxuICAgICAgQm9vbGVhbnMgKCJib29sIilcbiAgICAgICAgIFRoZXNlIHJlcHJlc2VudCB0aGUgdHJ1dGggdmFsdWVzIEZhbHNlIGFuZCBUcnVlLiAgVGhlIHR3b1xuICAgICAgICAgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyAiRmFsc2UiIGFuZCAiVHJ1ZSIgYXJlIHRoZVxuICAgICAgICAgb25seSBCb29sZWFuIG9iamVjdHMuIFRoZSBCb29sZWFuIHR5cGUgaXMgYSBzdWJ0eXBlIG9mIHRoZVxuICAgICAgICAgaW50ZWdlciB0eXBlLCBhbmQgQm9vbGVhbiB2YWx1ZXMgYmVoYXZlIGxpa2UgdGhlIHZhbHVlcyAwIGFuZFxuICAgICAgICAgMSwgcmVzcGVjdGl2ZWx5LCBpbiBhbG1vc3QgYWxsIGNvbnRleHRzLCB0aGUgZXhjZXB0aW9uIGJlaW5nXG4gICAgICAgICB0aGF0IHdoZW4gY29udmVydGVkIHRvIGEgc3RyaW5nLCB0aGUgc3RyaW5ncyAiIkZhbHNlIiIgb3JcbiAgICAgICAgICIiVHJ1ZSIiIGFyZSByZXR1cm5lZCwgcmVzcGVjdGl2ZWx5LlxuXG4gICAgICBUaGUgcnVsZXMgZm9yIGludGVnZXIgcmVwcmVzZW50YXRpb24gYXJlIGludGVuZGVkIHRvIGdpdmUgdGhlXG4gICAgICBtb3N0IG1lYW5pbmdmdWwgaW50ZXJwcmV0YXRpb24gb2Ygc2hpZnQgYW5kIG1hc2sgb3BlcmF0aW9uc1xuICAgICAgaW52b2x2aW5nIG5lZ2F0aXZlIGludGVnZXJzLlxuXG4gICAibnVtYmVycy5SZWFsIiAoImZsb2F0IilcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBtYWNoaW5lLWxldmVsIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnRcbiAgICAgIG51bWJlcnMuIFlvdSBhcmUgYXQgdGhlIG1lcmN5IG9mIHRoZSB1bmRlcmx5aW5nIG1hY2hpbmVcbiAgICAgIGFyY2hpdGVjdHVyZSAoYW5kIEMgb3IgSmF2YSBpbXBsZW1lbnRhdGlvbikgZm9yIHRoZSBhY2NlcHRlZFxuICAgICAgcmFuZ2UgYW5kIGhhbmRsaW5nIG9mIG92ZXJmbG93LiBQeXRob24gZG9lcyBub3Qgc3VwcG9ydCBzaW5nbGUtXG4gICAgICBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyczsgdGhlIHNhdmluZ3MgaW4gcHJvY2Vzc29yIGFuZFxuICAgICAgbWVtb3J5IHVzYWdlIHRoYXQgYXJlIHVzdWFsbHkgdGhlIHJlYXNvbiBmb3IgdXNpbmcgdGhlc2UgYXJlXG4gICAgICBkd2FyZmVkIGJ5IHRoZSBvdmVyaGVhZCBvZiB1c2luZyBvYmplY3RzIGluIFB5dGhvbiwgc28gdGhlcmUgaXNcbiAgICAgIG5vIHJlYXNvbiB0byBjb21wbGljYXRlIHRoZSBsYW5ndWFnZSB3aXRoIHR3byBraW5kcyBvZiBmbG9hdGluZ1xuICAgICAgcG9pbnQgbnVtYmVycy5cblxuICAgIm51bWJlcnMuQ29tcGxleCIgKCJjb21wbGV4IilcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBjb21wbGV4IG51bWJlcnMgYXMgYSBwYWlyIG9mIG1hY2hpbmUtbGV2ZWxcbiAgICAgIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gIFRoZSBzYW1lIGNhdmVhdHMgYXBwbHlcbiAgICAgIGFzIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBUaGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIGFcbiAgICAgIGNvbXBsZXggbnVtYmVyICJ6IiBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIHJlYWQtb25seVxuICAgICAgYXR0cmlidXRlcyAiei5yZWFsIiBhbmQgInouaW1hZyIuXG5cblNlcXVlbmNlc1xuICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBvcmRlcmVkIHNldHMgaW5kZXhlZCBieSBub24tbmVnYXRpdmVcbiAgIG51bWJlcnMuIFRoZSBidWlsdC1pbiBmdW5jdGlvbiAibGVuKCkiIHJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtc1xuICAgb2YgYSBzZXF1ZW5jZS4gV2hlbiB0aGUgbGVuZ3RoIG9mIGEgc2VxdWVuY2UgaXMgKm4qLCB0aGUgaW5kZXggc2V0XG4gICBjb250YWlucyB0aGUgbnVtYmVycyAwLCAxLCAuLi4sICpuKi0xLiAgSXRlbSAqaSogb2Ygc2VxdWVuY2UgKmEqIGlzXG4gICBzZWxlY3RlZCBieSAiYVtpXSIuXG5cbiAgIFNlcXVlbmNlcyBhbHNvIHN1cHBvcnQgc2xpY2luZzogImFbaTpqXSIgc2VsZWN0cyBhbGwgaXRlbXMgd2l0aFxuICAgaW5kZXggKmsqIHN1Y2ggdGhhdCAqaSogIjw9IiAqayogIjwiICpqKi4gIFdoZW4gdXNlZCBhcyBhblxuICAgZXhwcmVzc2lvbiwgYSBzbGljZSBpcyBhIHNlcXVlbmNlIG9mIHRoZSBzYW1lIHR5cGUuICBUaGlzIGltcGxpZXNcbiAgIHRoYXQgdGhlIGluZGV4IHNldCBpcyByZW51bWJlcmVkIHNvIHRoYXQgaXQgc3RhcnRzIGF0IDAuXG5cbiAgIFNvbWUgc2VxdWVuY2VzIGFsc28gc3VwcG9ydCAiZXh0ZW5kZWQgc2xpY2luZyIgd2l0aCBhIHRoaXJkICJzdGVwIlxuICAgcGFyYW1ldGVyOiAiYVtpOmo6a10iIHNlbGVjdHMgYWxsIGl0ZW1zIG9mICphKiB3aXRoIGluZGV4ICp4KiB3aGVyZVxuICAgInggPSBpICsgbiprIiwgKm4qICI+PSIgIjAiIGFuZCAqaSogIjw9IiAqeCogIjwiICpqKi5cblxuICAgU2VxdWVuY2VzIGFyZSBkaXN0aW5ndWlzaGVkIGFjY29yZGluZyB0byB0aGVpciBtdXRhYmlsaXR5OlxuXG4gICBJbW11dGFibGUgc2VxdWVuY2VzXG4gICAgICBBbiBvYmplY3Qgb2YgYW4gaW1tdXRhYmxlIHNlcXVlbmNlIHR5cGUgY2Fubm90IGNoYW5nZSBvbmNlIGl0IGlzXG4gICAgICBjcmVhdGVkLiAgKElmIHRoZSBvYmplY3QgY29udGFpbnMgcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzLFxuICAgICAgdGhlc2Ugb3RoZXIgb2JqZWN0cyBtYXkgYmUgbXV0YWJsZSBhbmQgbWF5IGJlIGNoYW5nZWQ7IGhvd2V2ZXIsXG4gICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgYW4gaW1tdXRhYmxlXG4gICAgICBvYmplY3QgY2Fubm90IGNoYW5nZS4pXG5cbiAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZXM6XG5cbiAgICAgIFN0cmluZ3NcbiAgICAgICAgIEEgc3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHRoYXQgcmVwcmVzZW50IFVuaWNvZGUgY29kZVxuICAgICAgICAgcG9pbnRzLiBBbGwgdGhlIGNvZGUgcG9pbnRzIGluIHRoZSByYW5nZSAiVSswMDAwIC0gVSsxMEZGRkYiXG4gICAgICAgICBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gYSBzdHJpbmcuICBQeXRob24gZG9lc25cJ3QgaGF2ZSBhICJjaGFyIlxuICAgICAgICAgdHlwZTsgaW5zdGVhZCwgZXZlcnkgY29kZSBwb2ludCBpbiB0aGUgc3RyaW5nIGlzIHJlcHJlc2VudGVkXG4gICAgICAgICBhcyBhIHN0cmluZyBvYmplY3Qgd2l0aCBsZW5ndGggIjEiLiAgVGhlIGJ1aWx0LWluIGZ1bmN0aW9uXG4gICAgICAgICAib3JkKCkiIGNvbnZlcnRzIGEgY29kZSBwb2ludCBmcm9tIGl0cyBzdHJpbmcgZm9ybSB0byBhblxuICAgICAgICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgIjAgLSAxMEZGRkYiOyAiY2hyKCkiIGNvbnZlcnRzIGFuXG4gICAgICAgICBpbnRlZ2VyIGluIHRoZSByYW5nZSAiMCAtIDEwRkZGRiIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGVuZ3RoXG4gICAgICAgICAiMSIgc3RyaW5nIG9iamVjdC4gInN0ci5lbmNvZGUoKSIgY2FuIGJlIHVzZWQgdG8gY29udmVydCBhXG4gICAgICAgICAic3RyIiB0byAiYnl0ZXMiIHVzaW5nIHRoZSBnaXZlbiB0ZXh0IGVuY29kaW5nLCBhbmRcbiAgICAgICAgICJieXRlcy5kZWNvZGUoKSIgY2FuIGJlIHVzZWQgdG8gYWNoaWV2ZSB0aGUgb3Bwb3NpdGUuXG5cbiAgICAgIFR1cGxlc1xuICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgdHVwbGUgYXJlIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4gVHVwbGVzIG9mXG4gICAgICAgICB0d28gb3IgbW9yZSBpdGVtcyBhcmUgZm9ybWVkIGJ5IGNvbW1hLXNlcGFyYXRlZCBsaXN0cyBvZlxuICAgICAgICAgZXhwcmVzc2lvbnMuICBBIHR1cGxlIG9mIG9uZSBpdGVtIChhIFwnc2luZ2xldG9uXCcpIGNhbiBiZVxuICAgICAgICAgZm9ybWVkIGJ5IGFmZml4aW5nIGEgY29tbWEgdG8gYW4gZXhwcmVzc2lvbiAoYW4gZXhwcmVzc2lvbiBieVxuICAgICAgICAgaXRzZWxmIGRvZXMgbm90IGNyZWF0ZSBhIHR1cGxlLCBzaW5jZSBwYXJlbnRoZXNlcyBtdXN0IGJlXG4gICAgICAgICB1c2FibGUgZm9yIGdyb3VwaW5nIG9mIGV4cHJlc3Npb25zKS4gIEFuIGVtcHR5IHR1cGxlIGNhbiBiZVxuICAgICAgICAgZm9ybWVkIGJ5IGFuIGVtcHR5IHBhaXIgb2YgcGFyZW50aGVzZXMuXG5cbiAgICAgIEJ5dGVzXG4gICAgICAgICBBIGJ5dGVzIG9iamVjdCBpcyBhbiBpbW11dGFibGUgYXJyYXkuICBUaGUgaXRlbXMgYXJlIDgtYml0XG4gICAgICAgICBieXRlcywgcmVwcmVzZW50ZWQgYnkgaW50ZWdlcnMgaW4gdGhlIHJhbmdlIDAgPD0geCA8IDI1Ni5cbiAgICAgICAgIEJ5dGVzIGxpdGVyYWxzIChsaWtlICJiXCdhYmNcJyIpIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25cbiAgICAgICAgICJieXRlcygpIiBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYnl0ZXMgb2JqZWN0cy4gIEFsc28sXG4gICAgICAgICBieXRlcyBvYmplY3RzIGNhbiBiZSBkZWNvZGVkIHRvIHN0cmluZ3MgdmlhIHRoZSAiZGVjb2RlKCkiXG4gICAgICAgICBtZXRob2QuXG5cbiAgIE11dGFibGUgc2VxdWVuY2VzXG4gICAgICBNdXRhYmxlIHNlcXVlbmNlcyBjYW4gYmUgY2hhbmdlZCBhZnRlciB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlXG4gICAgICBzdWJzY3JpcHRpb24gYW5kIHNsaWNpbmcgbm90YXRpb25zIGNhbiBiZSB1c2VkIGFzIHRoZSB0YXJnZXQgb2ZcbiAgICAgIGFzc2lnbm1lbnQgYW5kICJkZWwiIChkZWxldGUpIHN0YXRlbWVudHMuXG5cbiAgICAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGludHJpbnNpYyBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzOlxuXG4gICAgICBMaXN0c1xuICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgbGlzdCBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiAgTGlzdHMgYXJlXG4gICAgICAgICBmb3JtZWQgYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGluXG4gICAgICAgICBzcXVhcmUgYnJhY2tldHMuIChOb3RlIHRoYXQgdGhlcmUgYXJlIG5vIHNwZWNpYWwgY2FzZXMgbmVlZGVkXG4gICAgICAgICB0byBmb3JtIGxpc3RzIG9mIGxlbmd0aCAwIG9yIDEuKVxuXG4gICAgICBCeXRlIEFycmF5c1xuICAgICAgICAgQSBieXRlYXJyYXkgb2JqZWN0IGlzIGEgbXV0YWJsZSBhcnJheS4gVGhleSBhcmUgY3JlYXRlZCBieVxuICAgICAgICAgdGhlIGJ1aWx0LWluICJieXRlYXJyYXkoKSIgY29uc3RydWN0b3IuICBBc2lkZSBmcm9tIGJlaW5nXG4gICAgICAgICBtdXRhYmxlIChhbmQgaGVuY2UgdW5oYXNoYWJsZSksIGJ5dGUgYXJyYXlzIG90aGVyd2lzZSBwcm92aWRlXG4gICAgICAgICB0aGUgc2FtZSBpbnRlcmZhY2UgYW5kIGZ1bmN0aW9uYWxpdHkgYXMgaW1tdXRhYmxlIGJ5dGVzXG4gICAgICAgICBvYmplY3RzLlxuXG4gICAgICBUaGUgZXh0ZW5zaW9uIG1vZHVsZSAiYXJyYXkiIHByb3ZpZGVzIGFuIGFkZGl0aW9uYWwgZXhhbXBsZSBvZiBhXG4gICAgICBtdXRhYmxlIHNlcXVlbmNlIHR5cGUsIGFzIGRvZXMgdGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlLlxuXG5TZXQgdHlwZXNcbiAgIFRoZXNlIHJlcHJlc2VudCB1bm9yZGVyZWQsIGZpbml0ZSBzZXRzIG9mIHVuaXF1ZSwgaW1tdXRhYmxlXG4gICBvYmplY3RzLiBBcyBzdWNoLCB0aGV5IGNhbm5vdCBiZSBpbmRleGVkIGJ5IGFueSBzdWJzY3JpcHQuIEhvd2V2ZXIsXG4gICB0aGV5IGNhbiBiZSBpdGVyYXRlZCBvdmVyLCBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSJcbiAgIHJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIHNldC4gQ29tbW9uIHVzZXMgZm9yIHNldHMgYXJlIGZhc3RcbiAgIG1lbWJlcnNoaXAgdGVzdGluZywgcmVtb3ZpbmcgZHVwbGljYXRlcyBmcm9tIGEgc2VxdWVuY2UsIGFuZFxuICAgY29tcHV0aW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zIHN1Y2ggYXMgaW50ZXJzZWN0aW9uLCB1bmlvbixcbiAgIGRpZmZlcmVuY2UsIGFuZCBzeW1tZXRyaWMgZGlmZmVyZW5jZS5cblxuICAgRm9yIHNldCBlbGVtZW50cywgdGhlIHNhbWUgaW1tdXRhYmlsaXR5IHJ1bGVzIGFwcGx5IGFzIGZvclxuICAgZGljdGlvbmFyeSBrZXlzLiBOb3RlIHRoYXQgbnVtZXJpYyB0eXBlcyBvYmV5IHRoZSBub3JtYWwgcnVsZXMgZm9yXG4gICBudW1lcmljIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWwgKGUuZy4sICIxIiBhbmRcbiAgICIxLjAiKSwgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgY29udGFpbmVkIGluIGEgc2V0LlxuXG4gICBUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgc2V0IHR5cGVzOlxuXG4gICBTZXRzXG4gICAgICBUaGVzZSByZXByZXNlbnQgYSBtdXRhYmxlIHNldC4gVGhleSBhcmUgY3JlYXRlZCBieSB0aGUgYnVpbHQtaW5cbiAgICAgICJzZXQoKSIgY29uc3RydWN0b3IgYW5kIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIGJ5IHNldmVyYWxcbiAgICAgIG1ldGhvZHMsIHN1Y2ggYXMgImFkZCgpIi5cblxuICAgRnJvemVuIHNldHNcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBhbiBpbW11dGFibGUgc2V0LiAgVGhleSBhcmUgY3JlYXRlZCBieSB0aGVcbiAgICAgIGJ1aWx0LWluICJmcm96ZW5zZXQoKSIgY29uc3RydWN0b3IuICBBcyBhIGZyb3plbnNldCBpcyBpbW11dGFibGVcbiAgICAgIGFuZCAqaGFzaGFibGUqLCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBhcyBhbiBlbGVtZW50IG9mIGFub3RoZXJcbiAgICAgIHNldCwgb3IgYXMgYSBkaWN0aW9uYXJ5IGtleS5cblxuTWFwcGluZ3NcbiAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgc2V0cyBvZiBvYmplY3RzIGluZGV4ZWQgYnkgYXJiaXRyYXJ5IGluZGV4XG4gICBzZXRzLiBUaGUgc3Vic2NyaXB0IG5vdGF0aW9uICJhW2tdIiBzZWxlY3RzIHRoZSBpdGVtIGluZGV4ZWQgYnkgImsiXG4gICBmcm9tIHRoZSBtYXBwaW5nICJhIjsgdGhpcyBjYW4gYmUgdXNlZCBpbiBleHByZXNzaW9ucyBhbmQgYXMgdGhlXG4gICB0YXJnZXQgb2YgYXNzaWdubWVudHMgb3IgImRlbCIgc3RhdGVtZW50cy4gVGhlIGJ1aWx0LWluIGZ1bmN0aW9uXG4gICAibGVuKCkiIHJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIG1hcHBpbmcuXG5cbiAgIFRoZXJlIGlzIGN1cnJlbnRseSBhIHNpbmdsZSBpbnRyaW5zaWMgbWFwcGluZyB0eXBlOlxuXG4gICBEaWN0aW9uYXJpZXNcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgc2V0cyBvZiBvYmplY3RzIGluZGV4ZWQgYnkgbmVhcmx5XG4gICAgICBhcmJpdHJhcnkgdmFsdWVzLiAgVGhlIG9ubHkgdHlwZXMgb2YgdmFsdWVzIG5vdCBhY2NlcHRhYmxlIGFzXG4gICAgICBrZXlzIGFyZSB2YWx1ZXMgY29udGFpbmluZyBsaXN0cyBvciBkaWN0aW9uYXJpZXMgb3Igb3RoZXJcbiAgICAgIG11dGFibGUgdHlwZXMgdGhhdCBhcmUgY29tcGFyZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gYnkgb2JqZWN0XG4gICAgICBpZGVudGl0eSwgdGhlIHJlYXNvbiBiZWluZyB0aGF0IHRoZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gb2ZcbiAgICAgIGRpY3Rpb25hcmllcyByZXF1aXJlcyBhIGtleVwncyBoYXNoIHZhbHVlIHRvIHJlbWFpbiBjb25zdGFudC5cbiAgICAgIE51bWVyaWMgdHlwZXMgdXNlZCBmb3Iga2V5cyBvYmV5IHRoZSBub3JtYWwgcnVsZXMgZm9yIG51bWVyaWNcbiAgICAgIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWwgKGUuZy4sICIxIiBhbmQgIjEuMCIpXG4gICAgICB0aGVuIHRoZXkgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHRvIGluZGV4IHRoZSBzYW1lXG4gICAgICBkaWN0aW9uYXJ5IGVudHJ5LlxuXG4gICAgICBEaWN0aW9uYXJpZXMgYXJlIG11dGFibGU7IHRoZXkgY2FuIGJlIGNyZWF0ZWQgYnkgdGhlICJ7Li4ufSJcbiAgICAgIG5vdGF0aW9uIChzZWUgc2VjdGlvbiAqRGljdGlvbmFyeSBkaXNwbGF5cyopLlxuXG4gICAgICBUaGUgZXh0ZW5zaW9uIG1vZHVsZXMgImRibS5uZGJtIiBhbmQgImRibS5nbnUiIHByb3ZpZGVcbiAgICAgIGFkZGl0aW9uYWwgZXhhbXBsZXMgb2YgbWFwcGluZyB0eXBlcywgYXMgZG9lcyB0aGUgImNvbGxlY3Rpb25zIlxuICAgICAgbW9kdWxlLlxuXG5DYWxsYWJsZSB0eXBlc1xuICAgVGhlc2UgYXJlIHRoZSB0eXBlcyB0byB3aGljaCB0aGUgZnVuY3Rpb24gY2FsbCBvcGVyYXRpb24gKHNlZVxuICAgc2VjdGlvbiAqQ2FsbHMqKSBjYW4gYmUgYXBwbGllZDpcblxuICAgVXNlci1kZWZpbmVkIGZ1bmN0aW9uc1xuICAgICAgQSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IGlzIGNyZWF0ZWQgYnkgYSBmdW5jdGlvblxuICAgICAgZGVmaW5pdGlvbiAoc2VlIHNlY3Rpb24gKkZ1bmN0aW9uIGRlZmluaXRpb25zKikuICBJdCBzaG91bGQgYmVcbiAgICAgIGNhbGxlZCB3aXRoIGFuIGFyZ3VtZW50IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXNcbiAgICAgIGFzIHRoZSBmdW5jdGlvblwncyBmb3JtYWwgcGFyYW1ldGVyIGxpc3QuXG5cbiAgICAgIFNwZWNpYWwgYXR0cmlidXRlczpcblxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgQXR0cmlidXRlICAgICAgICAgICAgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArPT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09K1xuICAgICAgfCAiX19kb2NfXyIgICAgICAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9uXCdzIGRvY3VtZW50YXRpb24gICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcsIG9yICJOb25lIiBpZiAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdW5hdmFpbGFibGU7IG5vdCBpbmhlcml0ZWQgYnkgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN1YmNsYXNzZXMgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19uYW1lX18iICAgICAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9uXCdzIG5hbWUgICAgICAgICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19xdWFsbmFtZV9fIiAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9uXCdzICpxdWFsaWZpZWQgbmFtZSogfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOZXcgaW4gdmVyc2lvbiAzLjMuICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fbW9kdWxlX18iICAgICAgICAgICAgICB8IFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbiB3YXMgZGVmaW5lZCBpbiwgb3IgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIk5vbmUiIGlmIHVuYXZhaWxhYmxlLiAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX2RlZmF1bHRzX18iICAgICAgICAgICAgfCBBIHR1cGxlIGNvbnRhaW5pbmcgZGVmYXVsdCAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnQgdmFsdWVzIGZvciB0aG9zZSAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyZ3VtZW50cyB0aGF0IGhhdmUgZGVmYXVsdHMsICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvciAiTm9uZSIgaWYgbm8gYXJndW1lbnRzIGhhdmUgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYSBkZWZhdWx0IHZhbHVlICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX2NvZGVfXyIgICAgICAgICAgICAgICAgfCBUaGUgY29kZSBvYmplY3QgcmVwcmVzZW50aW5nICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIGJvZHkuICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX2dsb2JhbHNfXyIgICAgICAgICAgICAgfCBBIHJlZmVyZW5jZSB0byB0aGUgZGljdGlvbmFyeSAgIHwgUmVhZC1vbmx5ICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhhdCBob2xkcyB0aGUgZnVuY3Rpb25cJ3MgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnbG9iYWwgdmFyaWFibGVzIC0tLSB0aGUgZ2xvYmFsIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGUgaW4gICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdoaWNoIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZC4gfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19kaWN0X18iICAgICAgICAgICAgICAgIHwgVGhlIG5hbWVzcGFjZSBzdXBwb3J0aW5nICAgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyYml0cmFyeSBmdW5jdGlvbiBhdHRyaWJ1dGVzLiAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19jbG9zdXJlX18iICAgICAgICAgICAgIHwgIk5vbmUiIG9yIGEgdHVwbGUgb2YgY2VsbHMgdGhhdCB8IFJlYWQtb25seSAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbnRhaW4gYmluZGluZ3MgZm9yIHRoZSAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvblwncyBmcmVlIHZhcmlhYmxlcy4gICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX2Fubm90YXRpb25zX18iICAgICAgICAgfCBBIGRpY3QgY29udGFpbmluZyBhbm5vdGF0aW9ucyAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2YgcGFyYW1ldGVycy4gIFRoZSBrZXlzIG9mIHRoZSB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRpY3QgYXJlIHRoZSBwYXJhbWV0ZXIgbmFtZXMsICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbmQgIlwncmV0dXJuXCciIGZvciB0aGUgcmV0dXJuICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbm5vdGF0aW9uLCBpZiBwcm92aWRlZC4gICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fa3dkZWZhdWx0c19fIiAgICAgICAgICB8IEEgZGljdCBjb250YWluaW5nIGRlZmF1bHRzIGZvciAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrZXl3b3JkLW9ubHkgcGFyYW1ldGVycy4gICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcblxuICAgICAgTW9zdCBvZiB0aGUgYXR0cmlidXRlcyBsYWJlbGxlZCAiV3JpdGFibGUiIGNoZWNrIHRoZSB0eXBlIG9mIHRoZVxuICAgICAgYXNzaWduZWQgdmFsdWUuXG5cbiAgICAgIEZ1bmN0aW9uIG9iamVjdHMgYWxzbyBzdXBwb3J0IGdldHRpbmcgYW5kIHNldHRpbmcgYXJiaXRyYXJ5XG4gICAgICBhdHRyaWJ1dGVzLCB3aGljaCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIGF0dGFjaCBtZXRhZGF0YVxuICAgICAgdG8gZnVuY3Rpb25zLiAgUmVndWxhciBhdHRyaWJ1dGUgZG90LW5vdGF0aW9uIGlzIHVzZWQgdG8gZ2V0IGFuZFxuICAgICAgc2V0IHN1Y2ggYXR0cmlidXRlcy4gKk5vdGUgdGhhdCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5XG4gICAgICBzdXBwb3J0cyBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuIEZ1bmN0aW9uXG4gICAgICBhdHRyaWJ1dGVzIG9uIGJ1aWx0LWluIGZ1bmN0aW9ucyBtYXkgYmUgc3VwcG9ydGVkIGluIHRoZVxuICAgICAgZnV0dXJlLipcblxuICAgICAgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uXCdzIGRlZmluaXRpb24gY2FuIGJlXG4gICAgICByZXRyaWV2ZWQgZnJvbSBpdHMgY29kZSBvYmplY3Q7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgaW50ZXJuYWxcbiAgICAgIHR5cGVzIGJlbG93LlxuXG4gICBJbnN0YW5jZSBtZXRob2RzXG4gICAgICBBbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGNvbWJpbmVzIGEgY2xhc3MsIGEgY2xhc3MgaW5zdGFuY2UgYW5kXG4gICAgICBhbnkgY2FsbGFibGUgb2JqZWN0IChub3JtYWxseSBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbikuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJfX3NlbGZfXyIgaXMgdGhlIGNsYXNzIGluc3RhbmNlXG4gICAgICBvYmplY3QsICJfX2Z1bmNfXyIgaXMgdGhlIGZ1bmN0aW9uIG9iamVjdDsgIl9fZG9jX18iIGlzIHRoZVxuICAgICAgbWV0aG9kXCdzIGRvY3VtZW50YXRpb24gKHNhbWUgYXMgIl9fZnVuY19fLl9fZG9jX18iKTsgIl9fbmFtZV9fIlxuICAgICAgaXMgdGhlIG1ldGhvZCBuYW1lIChzYW1lIGFzICJfX2Z1bmNfXy5fX25hbWVfXyIpOyAiX19tb2R1bGVfXyJcbiAgICAgIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlIG1ldGhvZCB3YXMgZGVmaW5lZCBpbiwgb3IgIk5vbmUiXG4gICAgICBpZiB1bmF2YWlsYWJsZS5cblxuICAgICAgTWV0aG9kcyBhbHNvIHN1cHBvcnQgYWNjZXNzaW5nIChidXQgbm90IHNldHRpbmcpIHRoZSBhcmJpdHJhcnlcbiAgICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0LlxuXG4gICAgICBVc2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdHMgbWF5IGJlIGNyZWF0ZWQgd2hlbiBnZXR0aW5nIGFuXG4gICAgICBhdHRyaWJ1dGUgb2YgYSBjbGFzcyAocGVyaGFwcyB2aWEgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyksIGlmXG4gICAgICB0aGF0IGF0dHJpYnV0ZSBpcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3Qgb3IgYSBjbGFzc1xuICAgICAgbWV0aG9kIG9iamVjdC5cblxuICAgICAgV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhIHVzZXItXG4gICAgICBkZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBmcm9tIGEgY2xhc3MgdmlhIG9uZSBvZiBpdHMgaW5zdGFuY2VzLFxuICAgICAgaXRzICJfX3NlbGZfXyIgYXR0cmlidXRlIGlzIHRoZSBpbnN0YW5jZSwgYW5kIHRoZSBtZXRob2Qgb2JqZWN0XG4gICAgICBpcyBzYWlkIHRvIGJlIGJvdW5kLiAgVGhlIG5ldyBtZXRob2RcJ3MgIl9fZnVuY19fIiBhdHRyaWJ1dGUgaXNcbiAgICAgIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBvYmplY3QuXG5cbiAgICAgIFdoZW4gYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmdcbiAgICAgIGFub3RoZXIgbWV0aG9kIG9iamVjdCBmcm9tIGEgY2xhc3Mgb3IgaW5zdGFuY2UsIHRoZSBiZWhhdmlvdXIgaXNcbiAgICAgIHRoZSBzYW1lIGFzIGZvciBhIGZ1bmN0aW9uIG9iamVjdCwgZXhjZXB0IHRoYXQgdGhlICJfX2Z1bmNfXyJcbiAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgbmV3IGluc3RhbmNlIGlzIG5vdCB0aGUgb3JpZ2luYWwgbWV0aG9kIG9iamVjdFxuICAgICAgYnV0IGl0cyAiX19mdW5jX18iIGF0dHJpYnV0ZS5cblxuICAgICAgV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhIGNsYXNzXG4gICAgICBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgaXRzICJfX3NlbGZfXyIgYXR0cmlidXRlXG4gICAgICBpcyB0aGUgY2xhc3MgaXRzZWxmLCBhbmQgaXRzICJfX2Z1bmNfXyIgYXR0cmlidXRlIGlzIHRoZVxuICAgICAgZnVuY3Rpb24gb2JqZWN0IHVuZGVybHlpbmcgdGhlIGNsYXNzIG1ldGhvZC5cblxuICAgICAgV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGNhbGxlZCwgdGhlIHVuZGVybHlpbmdcbiAgICAgIGZ1bmN0aW9uICgiX19mdW5jX18iKSBpcyBjYWxsZWQsIGluc2VydGluZyB0aGUgY2xhc3MgaW5zdGFuY2VcbiAgICAgICgiX19zZWxmX18iKSBpbiBmcm9udCBvZiB0aGUgYXJndW1lbnQgbGlzdC4gIEZvciBpbnN0YW5jZSwgd2hlblxuICAgICAgIkMiIGlzIGEgY2xhc3Mgd2hpY2ggY29udGFpbnMgYSBkZWZpbml0aW9uIGZvciBhIGZ1bmN0aW9uICJmKCkiLFxuICAgICAgYW5kICJ4IiBpcyBhbiBpbnN0YW5jZSBvZiAiQyIsIGNhbGxpbmcgInguZigxKSIgaXMgZXF1aXZhbGVudCB0b1xuICAgICAgY2FsbGluZyAiQy5mKHgsIDEpIi5cblxuICAgICAgV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGRlcml2ZWQgZnJvbSBhIGNsYXNzIG1ldGhvZFxuICAgICAgb2JqZWN0LCB0aGUgImNsYXNzIGluc3RhbmNlIiBzdG9yZWQgaW4gIl9fc2VsZl9fIiB3aWxsIGFjdHVhbGx5XG4gICAgICBiZSB0aGUgY2xhc3MgaXRzZWxmLCBzbyB0aGF0IGNhbGxpbmcgZWl0aGVyICJ4LmYoMSkiIG9yICJDLmYoMSkiXG4gICAgICBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgImYoQywxKSIgd2hlcmUgImYiIGlzIHRoZSB1bmRlcmx5aW5nXG4gICAgICBmdW5jdGlvbi5cblxuICAgICAgTm90ZSB0aGF0IHRoZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGZ1bmN0aW9uIG9iamVjdCB0byBpbnN0YW5jZVxuICAgICAgbWV0aG9kIG9iamVjdCBoYXBwZW5zIGVhY2ggdGltZSB0aGUgYXR0cmlidXRlIGlzIHJldHJpZXZlZCBmcm9tXG4gICAgICB0aGUgaW5zdGFuY2UuICBJbiBzb21lIGNhc2VzLCBhIGZydWl0ZnVsIG9wdGltaXphdGlvbiBpcyB0b1xuICAgICAgYXNzaWduIHRoZSBhdHRyaWJ1dGUgdG8gYSBsb2NhbCB2YXJpYWJsZSBhbmQgY2FsbCB0aGF0IGxvY2FsXG4gICAgICB2YXJpYWJsZS4gQWxzbyBub3RpY2UgdGhhdCB0aGlzIHRyYW5zZm9ybWF0aW9uIG9ubHkgaGFwcGVucyBmb3JcbiAgICAgIHVzZXItZGVmaW5lZCBmdW5jdGlvbnM7IG90aGVyIGNhbGxhYmxlIG9iamVjdHMgKGFuZCBhbGwgbm9uLVxuICAgICAgY2FsbGFibGUgb2JqZWN0cykgYXJlIHJldHJpZXZlZCB3aXRob3V0IHRyYW5zZm9ybWF0aW9uLiAgSXQgaXNcbiAgICAgIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIHdoaWNoIGFyZVxuICAgICAgYXR0cmlidXRlcyBvZiBhIGNsYXNzIGluc3RhbmNlIGFyZSBub3QgY29udmVydGVkIHRvIGJvdW5kXG4gICAgICBtZXRob2RzOyB0aGlzICpvbmx5KiBoYXBwZW5zIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGFuIGF0dHJpYnV0ZVxuICAgICAgb2YgdGhlIGNsYXNzLlxuXG4gICBHZW5lcmF0b3IgZnVuY3Rpb25zXG4gICAgICBBIGZ1bmN0aW9uIG9yIG1ldGhvZCB3aGljaCB1c2VzIHRoZSAieWllbGQiIHN0YXRlbWVudCAoc2VlXG4gICAgICBzZWN0aW9uICpUaGUgeWllbGQgc3RhdGVtZW50KikgaXMgY2FsbGVkIGEgKmdlbmVyYXRvciBmdW5jdGlvbiouXG4gICAgICBTdWNoIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCBhbHdheXMgcmV0dXJucyBhbiBpdGVyYXRvciBvYmplY3RcbiAgICAgIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uOiAgY2FsbGluZ1xuICAgICAgdGhlIGl0ZXJhdG9yXCdzICJpdGVyYXRvci5fX25leHRfXygpIiBtZXRob2Qgd2lsbCBjYXVzZSB0aGVcbiAgICAgIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgdW50aWwgaXQgcHJvdmlkZXMgYSB2YWx1ZSB1c2luZyB0aGUgInlpZWxkIlxuICAgICAgc3RhdGVtZW50LiAgV2hlbiB0aGUgZnVuY3Rpb24gZXhlY3V0ZXMgYSAicmV0dXJuIiBzdGF0ZW1lbnQgb3JcbiAgICAgIGZhbGxzIG9mZiB0aGUgZW5kLCBhICJTdG9wSXRlcmF0aW9uIiBleGNlcHRpb24gaXMgcmFpc2VkIGFuZCB0aGVcbiAgICAgIGl0ZXJhdG9yIHdpbGwgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHNldCBvZiB2YWx1ZXMgdG8gYmVcbiAgICAgIHJldHVybmVkLlxuXG4gICBDb3JvdXRpbmUgZnVuY3Rpb25zXG4gICAgICBBIGZ1bmN0aW9uIG9yIG1ldGhvZCB3aGljaCBpcyBkZWZpbmVkIHVzaW5nICJhc3luYyBkZWYiIGlzXG4gICAgICBjYWxsZWQgYSAqY29yb3V0aW5lIGZ1bmN0aW9uKi4gIFN1Y2ggYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsXG4gICAgICByZXR1cm5zIGEgKmNvcm91dGluZSogb2JqZWN0LiAgSXQgbWF5IGNvbnRhaW4gImF3YWl0IlxuICAgICAgZXhwcmVzc2lvbnMsIGFzIHdlbGwgYXMgImFzeW5jIHdpdGgiIGFuZCAiYXN5bmMgZm9yIiBzdGF0ZW1lbnRzLlxuICAgICAgU2VlIGFsc28gdGhlICpDb3JvdXRpbmUgT2JqZWN0cyogc2VjdGlvbi5cblxuICAgQnVpbHQtaW4gZnVuY3Rpb25zXG4gICAgICBBIGJ1aWx0LWluIGZ1bmN0aW9uIG9iamVjdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGEgQyBmdW5jdGlvbi5cbiAgICAgIEV4YW1wbGVzIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhcmUgImxlbigpIiBhbmQgIm1hdGguc2luKCkiXG4gICAgICAoIm1hdGgiIGlzIGEgc3RhbmRhcmQgYnVpbHQtaW4gbW9kdWxlKS4gVGhlIG51bWJlciBhbmQgdHlwZSBvZlxuICAgICAgdGhlIGFyZ3VtZW50cyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgQyBmdW5jdGlvbi4gU3BlY2lhbCByZWFkLVxuICAgICAgb25seSBhdHRyaWJ1dGVzOiAiX19kb2NfXyIgaXMgdGhlIGZ1bmN0aW9uXCdzIGRvY3VtZW50YXRpb25cbiAgICAgIHN0cmluZywgb3IgIk5vbmUiIGlmIHVuYXZhaWxhYmxlOyAiX19uYW1lX18iIGlzIHRoZSBmdW5jdGlvblwnc1xuICAgICAgbmFtZTsgIl9fc2VsZl9fIiBpcyBzZXQgdG8gIk5vbmUiIChidXQgc2VlIHRoZSBuZXh0IGl0ZW0pO1xuICAgICAgIl9fbW9kdWxlX18iIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkXG4gICAgICBpbiBvciAiTm9uZSIgaWYgdW5hdmFpbGFibGUuXG5cbiAgIEJ1aWx0LWluIG1ldGhvZHNcbiAgICAgIFRoaXMgaXMgcmVhbGx5IGEgZGlmZmVyZW50IGRpc2d1aXNlIG9mIGEgYnVpbHQtaW4gZnVuY3Rpb24sIHRoaXNcbiAgICAgIHRpbWUgY29udGFpbmluZyBhbiBvYmplY3QgcGFzc2VkIHRvIHRoZSBDIGZ1bmN0aW9uIGFzIGFuXG4gICAgICBpbXBsaWNpdCBleHRyYSBhcmd1bWVudC4gIEFuIGV4YW1wbGUgb2YgYSBidWlsdC1pbiBtZXRob2QgaXNcbiAgICAgICJhbGlzdC5hcHBlbmQoKSIsIGFzc3VtaW5nICphbGlzdCogaXMgYSBsaXN0IG9iamVjdC4gSW4gdGhpc1xuICAgICAgY2FzZSwgdGhlIHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZSAiX19zZWxmX18iIGlzIHNldCB0byB0aGVcbiAgICAgIG9iamVjdCBkZW5vdGVkIGJ5ICphbGlzdCouXG5cbiAgIENsYXNzZXNcbiAgICAgIENsYXNzZXMgYXJlIGNhbGxhYmxlLiAgVGhlc2Ugb2JqZWN0cyBub3JtYWxseSBhY3QgYXMgZmFjdG9yaWVzXG4gICAgICBmb3IgbmV3IGluc3RhbmNlcyBvZiB0aGVtc2VsdmVzLCBidXQgdmFyaWF0aW9ucyBhcmUgcG9zc2libGUgZm9yXG4gICAgICBjbGFzcyB0eXBlcyB0aGF0IG92ZXJyaWRlICJfX25ld19fKCkiLiAgVGhlIGFyZ3VtZW50cyBvZiB0aGVcbiAgICAgIGNhbGwgYXJlIHBhc3NlZCB0byAiX19uZXdfXygpIiBhbmQsIGluIHRoZSB0eXBpY2FsIGNhc2UsIHRvXG4gICAgICAiX19pbml0X18oKSIgdG8gaW5pdGlhbGl6ZSB0aGUgbmV3IGluc3RhbmNlLlxuXG4gICBDbGFzcyBJbnN0YW5jZXNcbiAgICAgIEluc3RhbmNlcyBvZiBhcmJpdHJhcnkgY2xhc3NlcyBjYW4gYmUgbWFkZSBjYWxsYWJsZSBieSBkZWZpbmluZ1xuICAgICAgYSAiX19jYWxsX18oKSIgbWV0aG9kIGluIHRoZWlyIGNsYXNzLlxuXG5Nb2R1bGVzXG4gICBNb2R1bGVzIGFyZSBhIGJhc2ljIG9yZ2FuaXphdGlvbmFsIHVuaXQgb2YgUHl0aG9uIGNvZGUsIGFuZCBhcmVcbiAgIGNyZWF0ZWQgYnkgdGhlICppbXBvcnQgc3lzdGVtKiBhcyBpbnZva2VkIGVpdGhlciBieSB0aGUgImltcG9ydCJcbiAgIHN0YXRlbWVudCAoc2VlICJpbXBvcnQiKSwgb3IgYnkgY2FsbGluZyBmdW5jdGlvbnMgc3VjaCBhc1xuICAgImltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkiIGFuZCBidWlsdC1pbiAiX19pbXBvcnRfXygpIi4gIEEgbW9kdWxlXG4gICBvYmplY3QgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkIGJ5IGEgZGljdGlvbmFyeSBvYmplY3QgKHRoaXMgaXNcbiAgIHRoZSBkaWN0aW9uYXJ5IHJlZmVyZW5jZWQgYnkgdGhlICJfX2dsb2JhbHNfXyIgYXR0cmlidXRlIG9mXG4gICBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlKS4gIEF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZVxuICAgdHJhbnNsYXRlZCB0byBsb29rdXBzIGluIHRoaXMgZGljdGlvbmFyeSwgZS5nLiwgIm0ueCIgaXMgZXF1aXZhbGVudFxuICAgdG8gIm0uX19kaWN0X19bIngiXSIuIEEgbW9kdWxlIG9iamVjdCBkb2VzIG5vdCBjb250YWluIHRoZSBjb2RlXG4gICBvYmplY3QgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb2R1bGUgKHNpbmNlIGl0IGlzblwndCBuZWVkZWQgb25jZVxuICAgdGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUpLlxuXG4gICBBdHRyaWJ1dGUgYXNzaWdubWVudCB1cGRhdGVzIHRoZSBtb2R1bGVcJ3MgbmFtZXNwYWNlIGRpY3Rpb25hcnksXG4gICBlLmcuLCAibS54ID0gMSIgaXMgZXF1aXZhbGVudCB0byAibS5fX2RpY3RfX1sieCJdID0gMSIuXG5cbiAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZTogIl9fZGljdF9fIiBpcyB0aGUgbW9kdWxlXCdzIG5hbWVzcGFjZVxuICAgYXMgYSBkaWN0aW9uYXJ5IG9iamVjdC5cblxuICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBCZWNhdXNlIG9mIHRoZSB3YXkgQ1B5dGhvblxuICAgY2xlYXJzIG1vZHVsZSBkaWN0aW9uYXJpZXMsIHRoZSBtb2R1bGUgZGljdGlvbmFyeSB3aWxsIGJlIGNsZWFyZWRcbiAgIHdoZW4gdGhlIG1vZHVsZSBmYWxscyBvdXQgb2Ygc2NvcGUgZXZlbiBpZiB0aGUgZGljdGlvbmFyeSBzdGlsbCBoYXNcbiAgIGxpdmUgcmVmZXJlbmNlcy4gIFRvIGF2b2lkIHRoaXMsIGNvcHkgdGhlIGRpY3Rpb25hcnkgb3Iga2VlcCB0aGVcbiAgIG1vZHVsZSBhcm91bmQgd2hpbGUgdXNpbmcgaXRzIGRpY3Rpb25hcnkgZGlyZWN0bHkuXG5cbiAgIFByZWRlZmluZWQgKHdyaXRhYmxlKSBhdHRyaWJ1dGVzOiAiX19uYW1lX18iIGlzIHRoZSBtb2R1bGVcJ3MgbmFtZTtcbiAgICJfX2RvY19fIiBpcyB0aGUgbW9kdWxlXCdzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciAiTm9uZSIgaWZcbiAgIHVuYXZhaWxhYmxlOyAiX19maWxlX18iIGlzIHRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZVxuICAgbW9kdWxlIHdhcyBsb2FkZWQsIGlmIGl0IHdhcyBsb2FkZWQgZnJvbSBhIGZpbGUuIFRoZSAiX19maWxlX18iXG4gICBhdHRyaWJ1dGUgbWF5IGJlIG1pc3NpbmcgZm9yIGNlcnRhaW4gdHlwZXMgb2YgbW9kdWxlcywgc3VjaCBhcyBDXG4gICBtb2R1bGVzIHRoYXQgYXJlIHN0YXRpY2FsbHkgbGlua2VkIGludG8gdGhlIGludGVycHJldGVyOyBmb3JcbiAgIGV4dGVuc2lvbiBtb2R1bGVzIGxvYWRlZCBkeW5hbWljYWxseSBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIGl0IGlzXG4gICB0aGUgcGF0aG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGZpbGUuXG5cbkN1c3RvbSBjbGFzc2VzXG4gICBDdXN0b20gY2xhc3MgdHlwZXMgYXJlIHR5cGljYWxseSBjcmVhdGVkIGJ5IGNsYXNzIGRlZmluaXRpb25zIChzZWVcbiAgIHNlY3Rpb24gKkNsYXNzIGRlZmluaXRpb25zKikuICBBIGNsYXNzIGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZFxuICAgYnkgYSBkaWN0aW9uYXJ5IG9iamVjdC4gQ2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHRyYW5zbGF0ZWRcbiAgIHRvIGxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LCBlLmcuLCAiQy54IiBpcyB0cmFuc2xhdGVkIHRvXG4gICAiQy5fX2RpY3RfX1sieCJdIiAoYWx0aG91Z2ggdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGhvb2tzIHdoaWNoIGFsbG93XG4gICBmb3Igb3RoZXIgbWVhbnMgb2YgbG9jYXRpbmcgYXR0cmlidXRlcykuIFdoZW4gdGhlIGF0dHJpYnV0ZSBuYW1lIGlzXG4gICBub3QgZm91bmQgdGhlcmUsIHRoZSBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRpbnVlcyBpbiB0aGUgYmFzZVxuICAgY2xhc3Nlcy4gVGhpcyBzZWFyY2ggb2YgdGhlIGJhc2UgY2xhc3NlcyB1c2VzIHRoZSBDMyBtZXRob2RcbiAgIHJlc29sdXRpb24gb3JkZXIgd2hpY2ggYmVoYXZlcyBjb3JyZWN0bHkgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2ZcbiAgIFwnZGlhbW9uZFwnIGluaGVyaXRhbmNlIHN0cnVjdHVyZXMgd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlXG4gICBpbmhlcml0YW5jZSBwYXRocyBsZWFkaW5nIGJhY2sgdG8gYSBjb21tb24gYW5jZXN0b3IuIEFkZGl0aW9uYWxcbiAgIGRldGFpbHMgb24gdGhlIEMzIE1STyB1c2VkIGJ5IFB5dGhvbiBjYW4gYmUgZm91bmQgaW4gdGhlXG4gICBkb2N1bWVudGF0aW9uIGFjY29tcGFueWluZyB0aGUgMi4zIHJlbGVhc2UgYXRcbiAgIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvcmVsZWFzZXMvMi4zL21yby8uXG5cbiAgIFdoZW4gYSBjbGFzcyBhdHRyaWJ1dGUgcmVmZXJlbmNlIChmb3IgY2xhc3MgIkMiLCBzYXkpIHdvdWxkIHlpZWxkIGFcbiAgIGNsYXNzIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYW4gaW5zdGFuY2UgbWV0aG9kXG4gICBvYmplY3Qgd2hvc2UgIl9fc2VsZl9fIiBhdHRyaWJ1dGVzIGlzICJDIi4gIFdoZW4gaXQgd291bGQgeWllbGQgYVxuICAgc3RhdGljIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG9iamVjdCB3cmFwcGVkIGJ5XG4gICB0aGUgc3RhdGljIG1ldGhvZCBvYmplY3QuIFNlZSBzZWN0aW9uICpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqXG4gICBmb3IgYW5vdGhlciB3YXkgaW4gd2hpY2ggYXR0cmlidXRlcyByZXRyaWV2ZWQgZnJvbSBhIGNsYXNzIG1heVxuICAgZGlmZmVyIGZyb20gdGhvc2UgYWN0dWFsbHkgY29udGFpbmVkIGluIGl0cyAiX19kaWN0X18iLlxuXG4gICBDbGFzcyBhdHRyaWJ1dGUgYXNzaWdubWVudHMgdXBkYXRlIHRoZSBjbGFzc1wncyBkaWN0aW9uYXJ5LCBuZXZlclxuICAgdGhlIGRpY3Rpb25hcnkgb2YgYSBiYXNlIGNsYXNzLlxuXG4gICBBIGNsYXNzIG9iamVjdCBjYW4gYmUgY2FsbGVkIChzZWUgYWJvdmUpIHRvIHlpZWxkIGEgY2xhc3MgaW5zdGFuY2VcbiAgIChzZWUgYmVsb3cpLlxuXG4gICBTcGVjaWFsIGF0dHJpYnV0ZXM6ICJfX25hbWVfXyIgaXMgdGhlIGNsYXNzIG5hbWU7ICJfX21vZHVsZV9fIiBpc1xuICAgdGhlIG1vZHVsZSBuYW1lIGluIHdoaWNoIHRoZSBjbGFzcyB3YXMgZGVmaW5lZDsgIl9fZGljdF9fIiBpcyB0aGVcbiAgIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgY2xhc3NcJ3MgbmFtZXNwYWNlOyAiX19iYXNlc19fIiBpcyBhIHR1cGxlXG4gICAocG9zc2libHkgZW1wdHkgb3IgYSBzaW5nbGV0b24pIGNvbnRhaW5pbmcgdGhlIGJhc2UgY2xhc3NlcywgaW4gdGhlXG4gICBvcmRlciBvZiB0aGVpciBvY2N1cnJlbmNlIGluIHRoZSBiYXNlIGNsYXNzIGxpc3Q7ICJfX2RvY19fIiBpcyB0aGVcbiAgIGNsYXNzXCdzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciBOb25lIGlmIHVuZGVmaW5lZC5cblxuQ2xhc3MgaW5zdGFuY2VzXG4gICBBIGNsYXNzIGluc3RhbmNlIGlzIGNyZWF0ZWQgYnkgY2FsbGluZyBhIGNsYXNzIG9iamVjdCAoc2VlIGFib3ZlKS5cbiAgIEEgY2xhc3MgaW5zdGFuY2UgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkIGFzIGEgZGljdGlvbmFyeSB3aGljaFxuICAgaXMgdGhlIGZpcnN0IHBsYWNlIGluIHdoaWNoIGF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZSBzZWFyY2hlZC5cbiAgIFdoZW4gYW4gYXR0cmlidXRlIGlzIG5vdCBmb3VuZCB0aGVyZSwgYW5kIHRoZSBpbnN0YW5jZVwncyBjbGFzcyBoYXNcbiAgIGFuIGF0dHJpYnV0ZSBieSB0aGF0IG5hbWUsIHRoZSBzZWFyY2ggY29udGludWVzIHdpdGggdGhlIGNsYXNzXG4gICBhdHRyaWJ1dGVzLiAgSWYgYSBjbGFzcyBhdHRyaWJ1dGUgaXMgZm91bmQgdGhhdCBpcyBhIHVzZXItZGVmaW5lZFxuICAgZnVuY3Rpb24gb2JqZWN0LCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3RcbiAgIHdob3NlICJfX3NlbGZfXyIgYXR0cmlidXRlIGlzIHRoZSBpbnN0YW5jZS4gIFN0YXRpYyBtZXRob2QgYW5kXG4gICBjbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgYWxzbyB0cmFuc2Zvcm1lZDsgc2VlIGFib3ZlIHVuZGVyXG4gICAiQ2xhc3NlcyIuICBTZWUgc2VjdGlvbiAqSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzKiBmb3IgYW5vdGhlciB3YXlcbiAgIGluIHdoaWNoIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyByZXRyaWV2ZWQgdmlhIGl0cyBpbnN0YW5jZXMgbWF5XG4gICBkaWZmZXIgZnJvbSB0aGUgb2JqZWN0cyBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIGNsYXNzXCdzICJfX2RpY3RfXyIuXG4gICBJZiBubyBjbGFzcyBhdHRyaWJ1dGUgaXMgZm91bmQsIGFuZCB0aGUgb2JqZWN0XCdzIGNsYXNzIGhhcyBhXG4gICAiX19nZXRhdHRyX18oKSIgbWV0aG9kLCB0aGF0IGlzIGNhbGxlZCB0byBzYXRpc2Z5IHRoZSBsb29rdXAuXG5cbiAgIEF0dHJpYnV0ZSBhc3NpZ25tZW50cyBhbmQgZGVsZXRpb25zIHVwZGF0ZSB0aGUgaW5zdGFuY2VcJ3NcbiAgIGRpY3Rpb25hcnksIG5ldmVyIGEgY2xhc3NcJ3MgZGljdGlvbmFyeS4gIElmIHRoZSBjbGFzcyBoYXMgYVxuICAgIl9fc2V0YXR0cl9fKCkiIG9yICJfX2RlbGF0dHJfXygpIiBtZXRob2QsIHRoaXMgaXMgY2FsbGVkIGluc3RlYWRcbiAgIG9mIHVwZGF0aW5nIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5IGRpcmVjdGx5LlxuXG4gICBDbGFzcyBpbnN0YW5jZXMgY2FuIHByZXRlbmQgdG8gYmUgbnVtYmVycywgc2VxdWVuY2VzLCBvciBtYXBwaW5nc1xuICAgaWYgdGhleSBoYXZlIG1ldGhvZHMgd2l0aCBjZXJ0YWluIHNwZWNpYWwgbmFtZXMuICBTZWUgc2VjdGlvblxuICAgKlNwZWNpYWwgbWV0aG9kIG5hbWVzKi5cblxuICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiAiX19kaWN0X18iIGlzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeTtcbiAgICJfX2NsYXNzX18iIGlzIHRoZSBpbnN0YW5jZVwncyBjbGFzcy5cblxuSS9PIG9iamVjdHMgKGFsc28ga25vd24gYXMgZmlsZSBvYmplY3RzKVxuICAgQSAqZmlsZSBvYmplY3QqIHJlcHJlc2VudHMgYW4gb3BlbiBmaWxlLiAgVmFyaW91cyBzaG9ydGN1dHMgYXJlXG4gICBhdmFpbGFibGUgdG8gY3JlYXRlIGZpbGUgb2JqZWN0czogdGhlICJvcGVuKCkiIGJ1aWx0LWluIGZ1bmN0aW9uLFxuICAgYW5kIGFsc28gIm9zLnBvcGVuKCkiLCAib3MuZmRvcGVuKCkiLCBhbmQgdGhlICJtYWtlZmlsZSgpIiBtZXRob2RcbiAgIG9mIHNvY2tldCBvYmplY3RzIChhbmQgcGVyaGFwcyBieSBvdGhlciBmdW5jdGlvbnMgb3IgbWV0aG9kc1xuICAgcHJvdmlkZWQgYnkgZXh0ZW5zaW9uIG1vZHVsZXMpLlxuXG4gICBUaGUgb2JqZWN0cyAic3lzLnN0ZGluIiwgInN5cy5zdGRvdXQiIGFuZCAic3lzLnN0ZGVyciIgYXJlXG4gICBpbml0aWFsaXplZCB0byBmaWxlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZXJwcmV0ZXJcJ3NcbiAgIHN0YW5kYXJkIGlucHV0LCBvdXRwdXQgYW5kIGVycm9yIHN0cmVhbXM7IHRoZXkgYXJlIGFsbCBvcGVuIGluIHRleHRcbiAgIG1vZGUgYW5kIHRoZXJlZm9yZSBmb2xsb3cgdGhlIGludGVyZmFjZSBkZWZpbmVkIGJ5IHRoZVxuICAgImlvLlRleHRJT0Jhc2UiIGFic3RyYWN0IGNsYXNzLlxuXG5JbnRlcm5hbCB0eXBlc1xuICAgQSBmZXcgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBpbnRlcnByZXRlciBhcmUgZXhwb3NlZCB0byB0aGVcbiAgIHVzZXIuIFRoZWlyIGRlZmluaXRpb25zIG1heSBjaGFuZ2Ugd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlXG4gICBpbnRlcnByZXRlciwgYnV0IHRoZXkgYXJlIG1lbnRpb25lZCBoZXJlIGZvciBjb21wbGV0ZW5lc3MuXG5cbiAgIENvZGUgb2JqZWN0c1xuICAgICAgQ29kZSBvYmplY3RzIHJlcHJlc2VudCAqYnl0ZS1jb21waWxlZCogZXhlY3V0YWJsZSBQeXRob24gY29kZSxcbiAgICAgIG9yICpieXRlY29kZSouIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBjb2RlIG9iamVjdCBhbmQgYVxuICAgICAgZnVuY3Rpb24gb2JqZWN0IGlzIHRoYXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhbiBleHBsaWNpdFxuICAgICAgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvblwncyBnbG9iYWxzICh0aGUgbW9kdWxlIGluIHdoaWNoIGl0IHdhc1xuICAgICAgZGVmaW5lZCksIHdoaWxlIGEgY29kZSBvYmplY3QgY29udGFpbnMgbm8gY29udGV4dDsgYWxzbyB0aGVcbiAgICAgIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGZ1bmN0aW9uIG9iamVjdCwgbm90XG4gICAgICBpbiB0aGUgY29kZSBvYmplY3QgKGJlY2F1c2UgdGhleSByZXByZXNlbnQgdmFsdWVzIGNhbGN1bGF0ZWQgYXRcbiAgICAgIHJ1bi10aW1lKS4gIFVubGlrZSBmdW5jdGlvbiBvYmplY3RzLCBjb2RlIG9iamVjdHMgYXJlIGltbXV0YWJsZVxuICAgICAgYW5kIGNvbnRhaW4gbm8gcmVmZXJlbmNlcyAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgdG8gbXV0YWJsZVxuICAgICAgb2JqZWN0cy5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogImNvX25hbWUiIGdpdmVzIHRoZSBmdW5jdGlvbiBuYW1lO1xuICAgICAgImNvX2FyZ2NvdW50IiBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzIChpbmNsdWRpbmdcbiAgICAgIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzKTsgImNvX25sb2NhbHMiIGlzIHRoZSBudW1iZXIgb2ZcbiAgICAgIGxvY2FsIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiAoaW5jbHVkaW5nIGFyZ3VtZW50cyk7XG4gICAgICAiY29fdmFybmFtZXMiIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGxvY2FsXG4gICAgICB2YXJpYWJsZXMgKHN0YXJ0aW5nIHdpdGggdGhlIGFyZ3VtZW50IG5hbWVzKTsgImNvX2NlbGx2YXJzIiBpcyBhXG4gICAgICB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBsb2NhbCB2YXJpYWJsZXMgdGhhdCBhcmVcbiAgICAgIHJlZmVyZW5jZWQgYnkgbmVzdGVkIGZ1bmN0aW9uczsgImNvX2ZyZWV2YXJzIiBpcyBhIHR1cGxlXG4gICAgICBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBmcmVlIHZhcmlhYmxlczsgImNvX2NvZGUiIGlzIGEgc3RyaW5nXG4gICAgICByZXByZXNlbnRpbmcgdGhlIHNlcXVlbmNlIG9mIGJ5dGVjb2RlIGluc3RydWN0aW9uczsgImNvX2NvbnN0cyJcbiAgICAgIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbGl0ZXJhbHMgdXNlZCBieSB0aGUgYnl0ZWNvZGU7XG4gICAgICAiY29fbmFtZXMiIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgdXNlZCBieSB0aGUgYnl0ZWNvZGU7XG4gICAgICAiY29fZmlsZW5hbWUiIGlzIHRoZSBmaWxlbmFtZSBmcm9tIHdoaWNoIHRoZSBjb2RlIHdhcyBjb21waWxlZDtcbiAgICAgICJjb19maXJzdGxpbmVubyIgaXMgdGhlIGZpcnN0IGxpbmUgbnVtYmVyIG9mIHRoZSBmdW5jdGlvbjtcbiAgICAgICJjb19sbm90YWIiIGlzIGEgc3RyaW5nIGVuY29kaW5nIHRoZSBtYXBwaW5nIGZyb20gYnl0ZWNvZGVcbiAgICAgIG9mZnNldHMgdG8gbGluZSBudW1iZXJzIChmb3IgZGV0YWlscyBzZWUgdGhlIHNvdXJjZSBjb2RlIG9mIHRoZVxuICAgICAgaW50ZXJwcmV0ZXIpOyAiY29fc3RhY2tzaXplIiBpcyB0aGUgcmVxdWlyZWQgc3RhY2sgc2l6ZVxuICAgICAgKGluY2x1ZGluZyBsb2NhbCB2YXJpYWJsZXMpOyAiY29fZmxhZ3MiIGlzIGFuIGludGVnZXIgZW5jb2RpbmcgYVxuICAgICAgbnVtYmVyIG9mIGZsYWdzIGZvciB0aGUgaW50ZXJwcmV0ZXIuXG5cbiAgICAgIFRoZSBmb2xsb3dpbmcgZmxhZyBiaXRzIGFyZSBkZWZpbmVkIGZvciAiY29fZmxhZ3MiOiBiaXQgIjB4MDQiXG4gICAgICBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlICIqYXJndW1lbnRzIiBzeW50YXggdG8gYWNjZXB0IGFuXG4gICAgICBhcmJpdHJhcnkgbnVtYmVyIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzOyBiaXQgIjB4MDgiIGlzIHNldCBpZlxuICAgICAgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlICIqKmtleXdvcmRzIiBzeW50YXggdG8gYWNjZXB0IGFyYml0cmFyeVxuICAgICAga2V5d29yZCBhcmd1bWVudHM7IGJpdCAiMHgyMCIgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiBpcyBhXG4gICAgICBnZW5lcmF0b3IuXG5cbiAgICAgIEZ1dHVyZSBmZWF0dXJlIGRlY2xhcmF0aW9ucyAoImZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24iKVxuICAgICAgYWxzbyB1c2UgYml0cyBpbiAiY29fZmxhZ3MiIHRvIGluZGljYXRlIHdoZXRoZXIgYSBjb2RlIG9iamVjdFxuICAgICAgd2FzIGNvbXBpbGVkIHdpdGggYSBwYXJ0aWN1bGFyIGZlYXR1cmUgZW5hYmxlZDogYml0ICIweDIwMDAiIGlzXG4gICAgICBzZXQgaWYgdGhlIGZ1bmN0aW9uIHdhcyBjb21waWxlZCB3aXRoIGZ1dHVyZSBkaXZpc2lvbiBlbmFibGVkO1xuICAgICAgYml0cyAiMHgxMCIgYW5kICIweDEwMDAiIHdlcmUgdXNlZCBpbiBlYXJsaWVyIHZlcnNpb25zIG9mXG4gICAgICBQeXRob24uXG5cbiAgICAgIE90aGVyIGJpdHMgaW4gImNvX2ZsYWdzIiBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZS5cblxuICAgICAgSWYgYSBjb2RlIG9iamVjdCByZXByZXNlbnRzIGEgZnVuY3Rpb24sIHRoZSBmaXJzdCBpdGVtIGluXG4gICAgICAiY29fY29uc3RzIiBpcyB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcgb2YgdGhlIGZ1bmN0aW9uLCBvclxuICAgICAgIk5vbmUiIGlmIHVuZGVmaW5lZC5cblxuICAgRnJhbWUgb2JqZWN0c1xuICAgICAgRnJhbWUgb2JqZWN0cyByZXByZXNlbnQgZXhlY3V0aW9uIGZyYW1lcy4gIFRoZXkgbWF5IG9jY3VyIGluXG4gICAgICB0cmFjZWJhY2sgb2JqZWN0cyAoc2VlIGJlbG93KS5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogImZfYmFjayIgaXMgdG8gdGhlIHByZXZpb3VzIHN0YWNrXG4gICAgICBmcmFtZSAodG93YXJkcyB0aGUgY2FsbGVyKSwgb3IgIk5vbmUiIGlmIHRoaXMgaXMgdGhlIGJvdHRvbVxuICAgICAgc3RhY2sgZnJhbWU7ICJmX2NvZGUiIGlzIHRoZSBjb2RlIG9iamVjdCBiZWluZyBleGVjdXRlZCBpbiB0aGlzXG4gICAgICBmcmFtZTsgImZfbG9jYWxzIiBpcyB0aGUgZGljdGlvbmFyeSB1c2VkIHRvIGxvb2sgdXAgbG9jYWxcbiAgICAgIHZhcmlhYmxlczsgImZfZ2xvYmFscyIgaXMgdXNlZCBmb3IgZ2xvYmFsIHZhcmlhYmxlcztcbiAgICAgICJmX2J1aWx0aW5zIiBpcyB1c2VkIGZvciBidWlsdC1pbiAoaW50cmluc2ljKSBuYW1lczsgImZfbGFzdGkiXG4gICAgICBnaXZlcyB0aGUgcHJlY2lzZSBpbnN0cnVjdGlvbiAodGhpcyBpcyBhbiBpbmRleCBpbnRvIHRoZVxuICAgICAgYnl0ZWNvZGUgc3RyaW5nIG9mIHRoZSBjb2RlIG9iamVjdCkuXG5cbiAgICAgIFNwZWNpYWwgd3JpdGFibGUgYXR0cmlidXRlczogImZfdHJhY2UiLCBpZiBub3QgIk5vbmUiLCBpcyBhXG4gICAgICBmdW5jdGlvbiBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGNvZGUgbGluZSAodGhpcyBpc1xuICAgICAgdXNlZCBieSB0aGUgZGVidWdnZXIpOyAiZl9saW5lbm8iIGlzIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIG9mXG4gICAgICB0aGUgZnJhbWUgLS0tIHdyaXRpbmcgdG8gdGhpcyBmcm9tIHdpdGhpbiBhIHRyYWNlIGZ1bmN0aW9uIGp1bXBzXG4gICAgICB0byB0aGUgZ2l2ZW4gbGluZSAob25seSBmb3IgdGhlIGJvdHRvbS1tb3N0IGZyYW1lKS4gIEEgZGVidWdnZXJcbiAgICAgIGNhbiBpbXBsZW1lbnQgYSBKdW1wIGNvbW1hbmQgKGFrYSBTZXQgTmV4dCBTdGF0ZW1lbnQpIGJ5IHdyaXRpbmdcbiAgICAgIHRvIGZfbGluZW5vLlxuXG4gICAgICBGcmFtZSBvYmplY3RzIHN1cHBvcnQgb25lIG1ldGhvZDpcblxuICAgICAgZnJhbWUuY2xlYXIoKVxuXG4gICAgICAgICBUaGlzIG1ldGhvZCBjbGVhcnMgYWxsIHJlZmVyZW5jZXMgdG8gbG9jYWwgdmFyaWFibGVzIGhlbGQgYnlcbiAgICAgICAgIHRoZSBmcmFtZS4gIEFsc28sIGlmIHRoZSBmcmFtZSBiZWxvbmdlZCB0byBhIGdlbmVyYXRvciwgdGhlXG4gICAgICAgICBnZW5lcmF0b3IgaXMgZmluYWxpemVkLiAgVGhpcyBoZWxwcyBicmVhayByZWZlcmVuY2UgY3ljbGVzXG4gICAgICAgICBpbnZvbHZpbmcgZnJhbWUgb2JqZWN0cyAoZm9yIGV4YW1wbGUgd2hlbiBjYXRjaGluZyBhblxuICAgICAgICAgZXhjZXB0aW9uIGFuZCBzdG9yaW5nIGl0cyB0cmFjZWJhY2sgZm9yIGxhdGVyIHVzZSkuXG5cbiAgICAgICAgICJSdW50aW1lRXJyb3IiIGlzIHJhaXNlZCBpZiB0aGUgZnJhbWUgaXMgY3VycmVudGx5IGV4ZWN1dGluZy5cblxuICAgICAgICAgTmV3IGluIHZlcnNpb24gMy40LlxuXG4gICBUcmFjZWJhY2sgb2JqZWN0c1xuICAgICAgVHJhY2ViYWNrIG9iamVjdHMgcmVwcmVzZW50IGEgc3RhY2sgdHJhY2Ugb2YgYW4gZXhjZXB0aW9uLiAgQVxuICAgICAgdHJhY2ViYWNrIG9iamVjdCBpcyBjcmVhdGVkIHdoZW4gYW4gZXhjZXB0aW9uIG9jY3Vycy4gIFdoZW4gdGhlXG4gICAgICBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHVud2luZHMgdGhlIGV4ZWN1dGlvbiBzdGFjaywgYXRcbiAgICAgIGVhY2ggdW53b3VuZCBsZXZlbCBhIHRyYWNlYmFjayBvYmplY3QgaXMgaW5zZXJ0ZWQgaW4gZnJvbnQgb2ZcbiAgICAgIHRoZSBjdXJyZW50IHRyYWNlYmFjay4gIFdoZW4gYW4gZXhjZXB0aW9uIGhhbmRsZXIgaXMgZW50ZXJlZCxcbiAgICAgIHRoZSBzdGFjayB0cmFjZSBpcyBtYWRlIGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbS4gKFNlZSBzZWN0aW9uXG4gICAgICAqVGhlIHRyeSBzdGF0ZW1lbnQqLikgSXQgaXMgYWNjZXNzaWJsZSBhcyB0aGUgdGhpcmQgaXRlbSBvZiB0aGVcbiAgICAgIHR1cGxlIHJldHVybmVkIGJ5ICJzeXMuZXhjX2luZm8oKSIuIFdoZW4gdGhlIHByb2dyYW0gY29udGFpbnMgbm9cbiAgICAgIHN1aXRhYmxlIGhhbmRsZXIsIHRoZSBzdGFjayB0cmFjZSBpcyB3cml0dGVuIChuaWNlbHkgZm9ybWF0dGVkKVxuICAgICAgdG8gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbTsgaWYgdGhlIGludGVycHJldGVyIGlzIGludGVyYWN0aXZlLFxuICAgICAgaXQgaXMgYWxzbyBtYWRlIGF2YWlsYWJsZSB0byB0aGUgdXNlciBhcyAic3lzLmxhc3RfdHJhY2ViYWNrIi5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogInRiX25leHQiIGlzIHRoZSBuZXh0IGxldmVsIGluIHRoZVxuICAgICAgc3RhY2sgdHJhY2UgKHRvd2FyZHMgdGhlIGZyYW1lIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQpLCBvclxuICAgICAgIk5vbmUiIGlmIHRoZXJlIGlzIG5vIG5leHQgbGV2ZWw7ICJ0Yl9mcmFtZSIgcG9pbnRzIHRvIHRoZVxuICAgICAgZXhlY3V0aW9uIGZyYW1lIG9mIHRoZSBjdXJyZW50IGxldmVsOyAidGJfbGluZW5vIiBnaXZlcyB0aGUgbGluZVxuICAgICAgbnVtYmVyIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQ7ICJ0Yl9sYXN0aSIgaW5kaWNhdGVzIHRoZVxuICAgICAgcHJlY2lzZSBpbnN0cnVjdGlvbi4gIFRoZSBsaW5lIG51bWJlciBhbmQgbGFzdCBpbnN0cnVjdGlvbiBpblxuICAgICAgdGhlIHRyYWNlYmFjayBtYXkgZGlmZmVyIGZyb20gdGhlIGxpbmUgbnVtYmVyIG9mIGl0cyBmcmFtZVxuICAgICAgb2JqZWN0IGlmIHRoZSBleGNlcHRpb24gb2NjdXJyZWQgaW4gYSAidHJ5IiBzdGF0ZW1lbnQgd2l0aCBub1xuICAgICAgbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZSBvciB3aXRoIGEgZmluYWxseSBjbGF1c2UuXG5cbiAgIFNsaWNlIG9iamVjdHNcbiAgICAgIFNsaWNlIG9iamVjdHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHNsaWNlcyBmb3IgIl9fZ2V0aXRlbV9fKCkiXG4gICAgICBtZXRob2RzLiAgVGhleSBhcmUgYWxzbyBjcmVhdGVkIGJ5IHRoZSBidWlsdC1pbiAic2xpY2UoKSJcbiAgICAgIGZ1bmN0aW9uLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAic3RhcnQiIGlzIHRoZSBsb3dlciBib3VuZDsgInN0b3AiXG4gICAgICBpcyB0aGUgdXBwZXIgYm91bmQ7ICJzdGVwIiBpcyB0aGUgc3RlcCB2YWx1ZTsgZWFjaCBpcyAiTm9uZSIgaWZcbiAgICAgIG9taXR0ZWQuICBUaGVzZSBhdHRyaWJ1dGVzIGNhbiBoYXZlIGFueSB0eXBlLlxuXG4gICAgICBTbGljZSBvYmplY3RzIHN1cHBvcnQgb25lIG1ldGhvZDpcblxuICAgICAgc2xpY2UuaW5kaWNlcyhzZWxmLCBsZW5ndGgpXG5cbiAgICAgICAgIFRoaXMgbWV0aG9kIHRha2VzIGEgc2luZ2xlIGludGVnZXIgYXJndW1lbnQgKmxlbmd0aCogYW5kXG4gICAgICAgICBjb21wdXRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2xpY2UgdGhhdCB0aGUgc2xpY2Ugb2JqZWN0XG4gICAgICAgICB3b3VsZCBkZXNjcmliZSBpZiBhcHBsaWVkIHRvIGEgc2VxdWVuY2Ugb2YgKmxlbmd0aCogaXRlbXMuXG4gICAgICAgICBJdCByZXR1cm5zIGEgdHVwbGUgb2YgdGhyZWUgaW50ZWdlcnM7IHJlc3BlY3RpdmVseSB0aGVzZSBhcmVcbiAgICAgICAgIHRoZSAqc3RhcnQqIGFuZCAqc3RvcCogaW5kaWNlcyBhbmQgdGhlICpzdGVwKiBvciBzdHJpZGVcbiAgICAgICAgIGxlbmd0aCBvZiB0aGUgc2xpY2UuIE1pc3Npbmcgb3Igb3V0LW9mLWJvdW5kcyBpbmRpY2VzIGFyZVxuICAgICAgICAgaGFuZGxlZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggcmVndWxhciBzbGljZXMuXG5cbiAgIFN0YXRpYyBtZXRob2Qgb2JqZWN0c1xuICAgICAgU3RhdGljIG1ldGhvZCBvYmplY3RzIHByb3ZpZGUgYSB3YXkgb2YgZGVmZWF0aW5nIHRoZVxuICAgICAgdHJhbnNmb3JtYXRpb24gb2YgZnVuY3Rpb24gb2JqZWN0cyB0byBtZXRob2Qgb2JqZWN0cyBkZXNjcmliZWRcbiAgICAgIGFib3ZlLiBBIHN0YXRpYyBtZXRob2Qgb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYW55IG90aGVyXG4gICAgICBvYmplY3QsIHVzdWFsbHkgYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdC4gV2hlbiBhIHN0YXRpY1xuICAgICAgbWV0aG9kIG9iamVjdCBpcyByZXRyaWV2ZWQgZnJvbSBhIGNsYXNzIG9yIGEgY2xhc3MgaW5zdGFuY2UsIHRoZVxuICAgICAgb2JqZWN0IGFjdHVhbGx5IHJldHVybmVkIGlzIHRoZSB3cmFwcGVkIG9iamVjdCwgd2hpY2ggaXMgbm90XG4gICAgICBzdWJqZWN0IHRvIGFueSBmdXJ0aGVyIHRyYW5zZm9ybWF0aW9uLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgYXJlXG4gICAgICBub3QgdGhlbXNlbHZlcyBjYWxsYWJsZSwgYWx0aG91Z2ggdGhlIG9iamVjdHMgdGhleSB3cmFwIHVzdWFsbHlcbiAgICAgIGFyZS4gU3RhdGljIG1ldGhvZCBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IHRoZSBidWlsdC1pblxuICAgICAgInN0YXRpY21ldGhvZCgpIiBjb25zdHJ1Y3Rvci5cblxuICAgQ2xhc3MgbWV0aG9kIG9iamVjdHNcbiAgICAgIEEgY2xhc3MgbWV0aG9kIG9iamVjdCwgbGlrZSBhIHN0YXRpYyBtZXRob2Qgb2JqZWN0LCBpcyBhIHdyYXBwZXJcbiAgICAgIGFyb3VuZCBhbm90aGVyIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgd2F5IGluIHdoaWNoIHRoYXQgb2JqZWN0XG4gICAgICBpcyByZXRyaWV2ZWQgZnJvbSBjbGFzc2VzIGFuZCBjbGFzcyBpbnN0YW5jZXMuIFRoZSBiZWhhdmlvdXIgb2ZcbiAgICAgIGNsYXNzIG1ldGhvZCBvYmplY3RzIHVwb24gc3VjaCByZXRyaWV2YWwgaXMgZGVzY3JpYmVkIGFib3ZlLFxuICAgICAgdW5kZXIgIlVzZXItZGVmaW5lZCBtZXRob2RzIi4gQ2xhc3MgbWV0aG9kIG9iamVjdHMgYXJlIGNyZWF0ZWRcbiAgICAgIGJ5IHRoZSBidWlsdC1pbiAiY2xhc3NtZXRob2QoKSIgY29uc3RydWN0b3IuXG4nLAotICd0eXBlc2Z1bmN0aW9ucyc6IHUnXG5GdW5jdGlvbnNcbioqKioqKioqKlxuXG5GdW5jdGlvbiBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgVGhlIG9ubHlcbm9wZXJhdGlvbiBvbiBhIGZ1bmN0aW9uIG9iamVjdCBpcyB0byBjYWxsIGl0OiAiZnVuYyhhcmd1bWVudC1saXN0KSIuXG5cblRoZXJlIGFyZSByZWFsbHkgdHdvIGZsYXZvcnMgb2YgZnVuY3Rpb24gb2JqZWN0czogYnVpbHQtaW4gZnVuY3Rpb25zXG5hbmQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4gIEJvdGggc3VwcG9ydCB0aGUgc2FtZSBvcGVyYXRpb24gKHRvIGNhbGxcbnRoZSBmdW5jdGlvbiksIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gaXMgZGlmZmVyZW50LCBoZW5jZSB0aGVcbmRpZmZlcmVudCBvYmplY3QgdHlwZXMuXG5cblNlZSAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuJywKLSAndHlwZXNtYXBwaW5nJzogdSdcbk1hcHBpbmcgVHlwZXMgLS0tICJkaWN0IlxuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkEgKm1hcHBpbmcqIG9iamVjdCBtYXBzICpoYXNoYWJsZSogdmFsdWVzIHRvIGFyYml0cmFyeSBvYmplY3RzLlxuTWFwcGluZ3MgYXJlIG11dGFibGUgb2JqZWN0cy4gIFRoZXJlIGlzIGN1cnJlbnRseSBvbmx5IG9uZSBzdGFuZGFyZFxubWFwcGluZyB0eXBlLCB0aGUgKmRpY3Rpb25hcnkqLiAgKEZvciBvdGhlciBjb250YWluZXJzIHNlZSB0aGUgYnVpbHQtXG5pbiAibGlzdCIsICJzZXQiLCBhbmQgInR1cGxlIiBjbGFzc2VzLCBhbmQgdGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlLilcblxuQSBkaWN0aW9uYXJ5XCdzIGtleXMgYXJlICphbG1vc3QqIGFyYml0cmFyeSB2YWx1ZXMuICBWYWx1ZXMgdGhhdCBhcmVcbm5vdCAqaGFzaGFibGUqLCB0aGF0IGlzLCB2YWx1ZXMgY29udGFpbmluZyBsaXN0cywgZGljdGlvbmFyaWVzIG9yXG5vdGhlciBtdXRhYmxlIHR5cGVzICh0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSBvYmplY3RcbmlkZW50aXR5KSBtYXkgbm90IGJlIHVzZWQgYXMga2V5cy4gIE51bWVyaWMgdHlwZXMgdXNlZCBmb3Iga2V5cyBvYmV5XG50aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWxcbihzdWNoIGFzICIxIiBhbmQgIjEuMCIpIHRoZW4gdGhleSBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgdG8gaW5kZXhcbnRoZSBzYW1lIGRpY3Rpb25hcnkgZW50cnkuICAoTm90ZSBob3dldmVyLCB0aGF0IHNpbmNlIGNvbXB1dGVycyBzdG9yZVxuZmxvYXRpbmctcG9pbnQgbnVtYmVycyBhcyBhcHByb3hpbWF0aW9ucyBpdCBpcyB1c3VhbGx5IHVud2lzZSB0byB1c2VcbnRoZW0gYXMgZGljdGlvbmFyeSBrZXlzLilcblxuRGljdGlvbmFyaWVzIGNhbiBiZSBjcmVhdGVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiAia2V5OlxudmFsdWUiIHBhaXJzIHdpdGhpbiBicmFjZXMsIGZvciBleGFtcGxlOiAie1wnamFja1wnOiA0MDk4LCBcJ3Nqb2VyZFwnOlxuNDEyN30iIG9yICJ7NDA5ODogXCdqYWNrXCcsIDQxMjc6IFwnc2pvZXJkXCd9Iiwgb3IgYnkgdGhlICJkaWN0IlxuY29uc3RydWN0b3IuXG5cbmNsYXNzIGNsYXNzIGRpY3QoKiprd2FyZylcbmNsYXNzIGNsYXNzIGRpY3QobWFwcGluZywgKiprd2FyZylcbmNsYXNzIGNsYXNzIGRpY3QoaXRlcmFibGUsICoqa3dhcmcpXG5cbiAgIFJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGZyb20gYW4gb3B0aW9uYWwgcG9zaXRpb25hbFxuICAgYXJndW1lbnQgYW5kIGEgcG9zc2libHkgZW1wdHkgc2V0IG9mIGtleXdvcmQgYXJndW1lbnRzLlxuXG4gICBJZiBubyBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuLCBhbiBlbXB0eSBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQuXG4gICBJZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZ2l2ZW4gYW5kIGl0IGlzIGEgbWFwcGluZyBvYmplY3QsIGFcbiAgIGRpY3Rpb25hcnkgaXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGtleS12YWx1ZSBwYWlycyBhcyB0aGUgbWFwcGluZ1xuICAgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBtdXN0IGJlIGFuICppdGVyYWJsZSpcbiAgIG9iamVjdC4gIEVhY2ggaXRlbSBpbiB0aGUgaXRlcmFibGUgbXVzdCBpdHNlbGYgYmUgYW4gaXRlcmFibGUgd2l0aFxuICAgZXhhY3RseSB0d28gb2JqZWN0cy4gIFRoZSBmaXJzdCBvYmplY3Qgb2YgZWFjaCBpdGVtIGJlY29tZXMgYSBrZXlcbiAgIGluIHRoZSBuZXcgZGljdGlvbmFyeSwgYW5kIHRoZSBzZWNvbmQgb2JqZWN0IHRoZSBjb3JyZXNwb25kaW5nXG4gICB2YWx1ZS4gIElmIGEga2V5IG9jY3VycyBtb3JlIHRoYW4gb25jZSwgdGhlIGxhc3QgdmFsdWUgZm9yIHRoYXQga2V5XG4gICBiZWNvbWVzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBuZXcgZGljdGlvbmFyeS5cblxuICAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUga2V5d29yZCBhcmd1bWVudHMgYW5kIHRoZWlyXG4gICB2YWx1ZXMgYXJlIGFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5IGNyZWF0ZWQgZnJvbSB0aGUgcG9zaXRpb25hbFxuICAgYXJndW1lbnQuICBJZiBhIGtleSBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZSB2YWx1ZSBmcm9tXG4gICB0aGUga2V5d29yZCBhcmd1bWVudCByZXBsYWNlcyB0aGUgdmFsdWUgZnJvbSB0aGUgcG9zaXRpb25hbFxuICAgYXJndW1lbnQuXG5cbiAgIFRvIGlsbHVzdHJhdGUsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYWxsIHJldHVybiBhIGRpY3Rpb25hcnkgZXF1YWxcbiAgIHRvICJ7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfSI6XG5cbiAgICAgID4+PiBhID0gZGljdChvbmU9MSwgdHdvPTIsIHRocmVlPTMpXG4gICAgICA+Pj4gYiA9IHtcJ29uZVwnOiAxLCBcJ3R3b1wnOiAyLCBcJ3RocmVlXCc6IDN9XG4gICAgICA+Pj4gYyA9IGRpY3QoemlwKFtcJ29uZVwnLCBcJ3R3b1wnLCBcJ3RocmVlXCddLCBbMSwgMiwgM10pKVxuICAgICAgPj4+IGQgPSBkaWN0KFsoXCd0d29cJywgMiksIChcJ29uZVwnLCAxKSwgKFwndGhyZWVcJywgMyldKVxuICAgICAgPj4+IGUgPSBkaWN0KHtcJ3RocmVlXCc6IDMsIFwnb25lXCc6IDEsIFwndHdvXCc6IDJ9KVxuICAgICAgPj4+IGEgPT0gYiA9PSBjID09IGQgPT0gZVxuICAgICAgVHJ1ZVxuXG4gICBQcm92aWRpbmcga2V5d29yZCBhcmd1bWVudHMgYXMgaW4gdGhlIGZpcnN0IGV4YW1wbGUgb25seSB3b3JrcyBmb3JcbiAgIGtleXMgdGhhdCBhcmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLiAgT3RoZXJ3aXNlLCBhbnkgdmFsaWQga2V5c1xuICAgY2FuIGJlIHVzZWQuXG5cbiAgIFRoZXNlIGFyZSB0aGUgb3BlcmF0aW9ucyB0aGF0IGRpY3Rpb25hcmllcyBzdXBwb3J0IChhbmQgdGhlcmVmb3JlLFxuICAgY3VzdG9tIG1hcHBpbmcgdHlwZXMgc2hvdWxkIHN1cHBvcnQgdG9vKTpcblxuICAgbGVuKGQpXG5cbiAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkaWN0aW9uYXJ5ICpkKi5cblxuICAgZFtrZXldXG5cbiAgICAgIFJldHVybiB0aGUgaXRlbSBvZiAqZCogd2l0aCBrZXkgKmtleSouICBSYWlzZXMgYSAiS2V5RXJyb3IiIGlmXG4gICAgICAqa2V5KiBpcyBub3QgaW4gdGhlIG1hcC5cblxuICAgICAgSWYgYSBzdWJjbGFzcyBvZiBkaWN0IGRlZmluZXMgYSBtZXRob2QgIl9fbWlzc2luZ19fKCkiIGFuZCAqa2V5KlxuICAgICAgaXMgbm90IHByZXNlbnQsIHRoZSAiZFtrZXldIiBvcGVyYXRpb24gY2FsbHMgdGhhdCBtZXRob2Qgd2l0aFxuICAgICAgdGhlIGtleSAqa2V5KiBhcyBhcmd1bWVudC4gIFRoZSAiZFtrZXldIiBvcGVyYXRpb24gdGhlbiByZXR1cm5zXG4gICAgICBvciByYWlzZXMgd2hhdGV2ZXIgaXMgcmV0dXJuZWQgb3IgcmFpc2VkIGJ5IHRoZVxuICAgICAgIl9fbWlzc2luZ19fKGtleSkiIGNhbGwuIE5vIG90aGVyIG9wZXJhdGlvbnMgb3IgbWV0aG9kcyBpbnZva2VcbiAgICAgICJfX21pc3NpbmdfXygpIi4gSWYgIl9fbWlzc2luZ19fKCkiIGlzIG5vdCBkZWZpbmVkLCAiS2V5RXJyb3IiXG4gICAgICBpcyByYWlzZWQuICJfX21pc3NpbmdfXygpIiBtdXN0IGJlIGEgbWV0aG9kOyBpdCBjYW5ub3QgYmUgYW5cbiAgICAgIGluc3RhbmNlIHZhcmlhYmxlOlxuXG4gICAgICAgICA+Pj4gY2xhc3MgQ291bnRlcihkaWN0KTpcbiAgICAgICAgIC4uLiAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6XG4gICAgICAgICAuLi4gICAgICAgICByZXR1cm4gMFxuICAgICAgICAgPj4+IGMgPSBDb3VudGVyKClcbiAgICAgICAgID4+PiBjW1wncmVkXCddXG4gICAgICAgICAwXG4gICAgICAgICA+Pj4gY1tcJ3JlZFwnXSArPSAxXG4gICAgICAgICA+Pj4gY1tcJ3JlZFwnXVxuICAgICAgICAgMVxuXG4gICAgICBUaGUgZXhhbXBsZSBhYm92ZSBzaG93cyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZlxuICAgICAgImNvbGxlY3Rpb25zLkNvdW50ZXIiLiAgQSBkaWZmZXJlbnQgIl9fbWlzc2luZ19fIiBtZXRob2QgaXMgdXNlZFxuICAgICAgYnkgImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0Ii5cblxuICAgZFtrZXldID0gdmFsdWVcblxuICAgICAgU2V0ICJkW2tleV0iIHRvICp2YWx1ZSouXG5cbiAgIGRlbCBkW2tleV1cblxuICAgICAgUmVtb3ZlICJkW2tleV0iIGZyb20gKmQqLiAgUmFpc2VzIGEgIktleUVycm9yIiBpZiAqa2V5KiBpcyBub3RcbiAgICAgIGluIHRoZSBtYXAuXG5cbiAgIGtleSBpbiBkXG5cbiAgICAgIFJldHVybiAiVHJ1ZSIgaWYgKmQqIGhhcyBhIGtleSAqa2V5KiwgZWxzZSAiRmFsc2UiLlxuXG4gICBrZXkgbm90IGluIGRcblxuICAgICAgRXF1aXZhbGVudCB0byAibm90IGtleSBpbiBkIi5cblxuICAgaXRlcihkKVxuXG4gICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeS4gIFRoaXMgaXMgYVxuICAgICAgc2hvcnRjdXQgZm9yICJpdGVyKGQua2V5cygpKSIuXG5cbiAgIGNsZWFyKClcblxuICAgICAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIHRoZSBkaWN0aW9uYXJ5LlxuXG4gICBjb3B5KClcblxuICAgICAgUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBkaWN0aW9uYXJ5LlxuXG4gICBjbGFzc21ldGhvZCBmcm9ta2V5cyhzZXFbLCB2YWx1ZV0pXG5cbiAgICAgIENyZWF0ZSBhIG5ldyBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tICpzZXEqIGFuZCB2YWx1ZXMgc2V0IHRvXG4gICAgICAqdmFsdWUqLlxuXG4gICAgICAiZnJvbWtleXMoKSIgaXMgYSBjbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIGEgbmV3IGRpY3Rpb25hcnkuXG4gICAgICAqdmFsdWUqIGRlZmF1bHRzIHRvICJOb25lIi5cblxuICAgZ2V0KGtleVssIGRlZmF1bHRdKVxuXG4gICAgICBSZXR1cm4gdGhlIHZhbHVlIGZvciAqa2V5KiBpZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgZWxzZVxuICAgICAgKmRlZmF1bHQqLiBJZiAqZGVmYXVsdCogaXMgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byAiTm9uZSIsIHNvXG4gICAgICB0aGF0IHRoaXMgbWV0aG9kIG5ldmVyIHJhaXNlcyBhICJLZXlFcnJvciIuXG5cbiAgIGl0ZW1zKClcblxuICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3MgaXRlbXMgKCIoa2V5LCB2YWx1ZSkiXG4gICAgICBwYWlycykuIFNlZSB0aGUgKmRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzKi5cblxuICAga2V5cygpXG5cbiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGtleXMuICBTZWUgdGhlXG4gICAgICAqZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMqLlxuXG4gICBwb3Aoa2V5WywgZGVmYXVsdF0pXG5cbiAgICAgIElmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCByZW1vdmUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICBlbHNlIHJldHVybiAqZGVmYXVsdCouICBJZiAqZGVmYXVsdCogaXMgbm90IGdpdmVuIGFuZCAqa2V5KiBpc1xuICAgICAgbm90IGluIHRoZSBkaWN0aW9uYXJ5LCBhICJLZXlFcnJvciIgaXMgcmFpc2VkLlxuXG4gICBwb3BpdGVtKClcblxuICAgICAgUmVtb3ZlIGFuZCByZXR1cm4gYW4gYXJiaXRyYXJ5ICIoa2V5LCB2YWx1ZSkiIHBhaXIgZnJvbSB0aGVcbiAgICAgIGRpY3Rpb25hcnkuXG5cbiAgICAgICJwb3BpdGVtKCkiIGlzIHVzZWZ1bCB0byBkZXN0cnVjdGl2ZWx5IGl0ZXJhdGUgb3ZlciBhXG4gICAgICBkaWN0aW9uYXJ5LCBhcyBvZnRlbiB1c2VkIGluIHNldCBhbGdvcml0aG1zLiAgSWYgdGhlIGRpY3Rpb25hcnlcbiAgICAgIGlzIGVtcHR5LCBjYWxsaW5nICJwb3BpdGVtKCkiIHJhaXNlcyBhICJLZXlFcnJvciIuXG5cbiAgIHNldGRlZmF1bHQoa2V5WywgZGVmYXVsdF0pXG5cbiAgICAgIElmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCByZXR1cm4gaXRzIHZhbHVlLiAgSWYgbm90LCBpbnNlcnRcbiAgICAgICprZXkqIHdpdGggYSB2YWx1ZSBvZiAqZGVmYXVsdCogYW5kIHJldHVybiAqZGVmYXVsdCouICAqZGVmYXVsdCpcbiAgICAgIGRlZmF1bHRzIHRvICJOb25lIi5cblxuICAgdXBkYXRlKFtvdGhlcl0pXG5cbiAgICAgIFVwZGF0ZSB0aGUgZGljdGlvbmFyeSB3aXRoIHRoZSBrZXkvdmFsdWUgcGFpcnMgZnJvbSAqb3RoZXIqLFxuICAgICAgb3ZlcndyaXRpbmcgZXhpc3Rpbmcga2V5cy4gIFJldHVybiAiTm9uZSIuXG5cbiAgICAgICJ1cGRhdGUoKSIgYWNjZXB0cyBlaXRoZXIgYW5vdGhlciBkaWN0aW9uYXJ5IG9iamVjdCBvciBhblxuICAgICAgaXRlcmFibGUgb2Yga2V5L3ZhbHVlIHBhaXJzIChhcyB0dXBsZXMgb3Igb3RoZXIgaXRlcmFibGVzIG9mXG4gICAgICBsZW5ndGggdHdvKS4gIElmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQsIHRoZSBkaWN0aW9uYXJ5XG4gICAgICBpcyB0aGVuIHVwZGF0ZWQgd2l0aCB0aG9zZSBrZXkvdmFsdWUgcGFpcnM6ICJkLnVwZGF0ZShyZWQ9MSxcbiAgICAgIGJsdWU9MikiLlxuXG4gICB2YWx1ZXMoKVxuXG4gICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeVwncyB2YWx1ZXMuICBTZWUgdGhlXG4gICAgICAqZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMqLlxuXG4gICBEaWN0aW9uYXJpZXMgY29tcGFyZSBlcXVhbCBpZiBhbmQgb25seSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgIihrZXksXG4gICB2YWx1ZSkiIHBhaXJzLiBPcmRlciBjb21wYXJpc29ucyAoXCc8XCcsIFwnPD1cJywgXCc+PVwnLCBcJz5cJykgcmFpc2VcbiAgICJUeXBlRXJyb3IiLlxuXG5TZWUgYWxzbzogInR5cGVzLk1hcHBpbmdQcm94eVR5cGUiIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHJlYWQtb25seVxuICB2aWV3IG9mIGEgImRpY3QiLlxuXG5cbkRpY3Rpb25hcnkgdmlldyBvYmplY3RzXG49PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb2JqZWN0cyByZXR1cm5lZCBieSAiZGljdC5rZXlzKCkiLCAiZGljdC52YWx1ZXMoKSIgYW5kXG4iZGljdC5pdGVtcygpIiBhcmUgKnZpZXcgb2JqZWN0cyouICBUaGV5IHByb3ZpZGUgYSBkeW5hbWljIHZpZXcgb24gdGhlXG5kaWN0aW9uYXJ5XCdzIGVudHJpZXMsIHdoaWNoIG1lYW5zIHRoYXQgd2hlbiB0aGUgZGljdGlvbmFyeSBjaGFuZ2VzLFxudGhlIHZpZXcgcmVmbGVjdHMgdGhlc2UgY2hhbmdlcy5cblxuRGljdGlvbmFyeSB2aWV3cyBjYW4gYmUgaXRlcmF0ZWQgb3ZlciB0byB5aWVsZCB0aGVpciByZXNwZWN0aXZlIGRhdGEsXG5hbmQgc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3RzOlxuXG5sZW4oZGljdHZpZXcpXG5cbiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbml0ZXIoZGljdHZpZXcpXG5cbiAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzLCB2YWx1ZXMgb3IgaXRlbXMgKHJlcHJlc2VudGVkIGFzXG4gICB0dXBsZXMgb2YgIihrZXksIHZhbHVlKSIpIGluIHRoZSBkaWN0aW9uYXJ5LlxuXG4gICBLZXlzIGFuZCB2YWx1ZXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyIHdoaWNoIGlzXG4gICBub24tcmFuZG9tLCB2YXJpZXMgYWNyb3NzIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMsIGFuZCBkZXBlbmRzIG9uXG4gICB0aGUgZGljdGlvbmFyeVwncyBoaXN0b3J5IG9mIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucy4gSWYga2V5cyxcbiAgIHZhbHVlcyBhbmQgaXRlbXMgdmlld3MgYXJlIGl0ZXJhdGVkIG92ZXIgd2l0aCBubyBpbnRlcnZlbmluZ1xuICAgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGljdGlvbmFyeSwgdGhlIG9yZGVyIG9mIGl0ZW1zIHdpbGwgZGlyZWN0bHlcbiAgIGNvcnJlc3BvbmQuICBUaGlzIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgIih2YWx1ZSwga2V5KSIgcGFpcnMgdXNpbmdcbiAgICJ6aXAoKSI6ICJwYWlycyA9IHppcChkLnZhbHVlcygpLCBkLmtleXMoKSkiLiAgQW5vdGhlciB3YXkgdG9cbiAgIGNyZWF0ZSB0aGUgc2FtZSBsaXN0IGlzICJwYWlycyA9IFsodiwgaykgZm9yIChrLCB2KSBpbiBkLml0ZW1zKCldIi5cblxuICAgSXRlcmF0aW5nIHZpZXdzIHdoaWxlIGFkZGluZyBvciBkZWxldGluZyBlbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5XG4gICBtYXkgcmFpc2UgYSAiUnVudGltZUVycm9yIiBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlciBhbGwgZW50cmllcy5cblxueCBpbiBkaWN0dmlld1xuXG4gICBSZXR1cm4gIlRydWUiIGlmICp4KiBpcyBpbiB0aGUgdW5kZXJseWluZyBkaWN0aW9uYXJ5XCdzIGtleXMsIHZhbHVlc1xuICAgb3IgaXRlbXMgKGluIHRoZSBsYXR0ZXIgY2FzZSwgKngqIHNob3VsZCBiZSBhICIoa2V5LCB2YWx1ZSkiXG4gICB0dXBsZSkuXG5cbktleXMgdmlld3MgYXJlIHNldC1saWtlIHNpbmNlIHRoZWlyIGVudHJpZXMgYXJlIHVuaXF1ZSBhbmQgaGFzaGFibGUuXG5JZiBhbGwgdmFsdWVzIGFyZSBoYXNoYWJsZSwgc28gdGhhdCAiKGtleSwgdmFsdWUpIiBwYWlycyBhcmUgdW5pcXVlXG5hbmQgaGFzaGFibGUsIHRoZW4gdGhlIGl0ZW1zIHZpZXcgaXMgYWxzbyBzZXQtbGlrZS4gIChWYWx1ZXMgdmlld3MgYXJlXG5ub3QgdHJlYXRlZCBhcyBzZXQtbGlrZSBzaW5jZSB0aGUgZW50cmllcyBhcmUgZ2VuZXJhbGx5IG5vdCB1bmlxdWUuKVxuRm9yIHNldC1saWtlIHZpZXdzLCBhbGwgb2YgdGhlIG9wZXJhdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGFic3RyYWN0XG5iYXNlIGNsYXNzICJjb2xsZWN0aW9ucy5hYmMuU2V0IiBhcmUgYXZhaWxhYmxlIChmb3IgZXhhbXBsZSwgIj09IixcbiI8Iiwgb3IgIl4iKS5cblxuQW4gZXhhbXBsZSBvZiBkaWN0aW9uYXJ5IHZpZXcgdXNhZ2U6XG5cbiAgID4+PiBkaXNoZXMgPSB7XCdlZ2dzXCc6IDIsIFwnc2F1c2FnZVwnOiAxLCBcJ2JhY29uXCc6IDEsIFwnc3BhbVwnOiA1MDB9XG4gICA+Pj4ga2V5cyA9IGRpc2hlcy5rZXlzKClcbiAgID4+PiB2YWx1ZXMgPSBkaXNoZXMudmFsdWVzKClcblxuICAgPj4+ICMgaXRlcmF0aW9uXG4gICA+Pj4gbiA9IDBcbiAgID4+PiBmb3IgdmFsIGluIHZhbHVlczpcbiAgIC4uLiAgICAgbiArPSB2YWxcbiAgID4+PiBwcmludChuKVxuICAgNTA0XG5cbiAgID4+PiAjIGtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiB0aGUgc2FtZSBvcmRlclxuICAgPj4+IGxpc3Qoa2V5cylcbiAgIFtcJ2VnZ3NcJywgXCdiYWNvblwnLCBcJ3NhdXNhZ2VcJywgXCdzcGFtXCddXG4gICA+Pj4gbGlzdCh2YWx1ZXMpXG4gICBbMiwgMSwgMSwgNTAwXVxuXG4gICA+Pj4gIyB2aWV3IG9iamVjdHMgYXJlIGR5bmFtaWMgYW5kIHJlZmxlY3QgZGljdCBjaGFuZ2VzXG4gICA+Pj4gZGVsIGRpc2hlc1tcJ2VnZ3NcJ11cbiAgID4+PiBkZWwgZGlzaGVzW1wnc2F1c2FnZVwnXVxuICAgPj4+IGxpc3Qoa2V5cylcbiAgIFtcJ3NwYW1cJywgXCdiYWNvblwnXVxuXG4gICA+Pj4gIyBzZXQgb3BlcmF0aW9uc1xuICAgPj4+IGtleXMgJiB7XCdlZ2dzXCcsIFwnYmFjb25cJywgXCdzYWxhZFwnfVxuICAge1wnYmFjb25cJ31cbiAgID4+PiBrZXlzIF4ge1wnc2F1c2FnZVwnLCBcJ2p1aWNlXCd9XG4gICB7XCdqdWljZVwnLCBcJ3NhdXNhZ2VcJywgXCdiYWNvblwnLCBcJ3NwYW1cJ31cbicsCi0gJ3R5cGVzbWV0aG9kcyc6IHUnXG5NZXRob2RzXG4qKioqKioqXG5cbk1ldGhvZHMgYXJlIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgdXNpbmcgdGhlIGF0dHJpYnV0ZSBub3RhdGlvbi5cblRoZXJlIGFyZSB0d28gZmxhdm9yczogYnVpbHQtaW4gbWV0aG9kcyAoc3VjaCBhcyAiYXBwZW5kKCkiIG9uIGxpc3RzKVxuYW5kIGNsYXNzIGluc3RhbmNlIG1ldGhvZHMuICBCdWlsdC1pbiBtZXRob2RzIGFyZSBkZXNjcmliZWQgd2l0aCB0aGVcbnR5cGVzIHRoYXQgc3VwcG9ydCB0aGVtLlxuXG5JZiB5b3UgYWNjZXNzIGEgbWV0aG9kIChhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSBjbGFzcyBuYW1lc3BhY2UpXG50aHJvdWdoIGFuIGluc3RhbmNlLCB5b3UgZ2V0IGEgc3BlY2lhbCBvYmplY3Q6IGEgKmJvdW5kIG1ldGhvZCogKGFsc29cbmNhbGxlZCAqaW5zdGFuY2UgbWV0aG9kKikgb2JqZWN0LiBXaGVuIGNhbGxlZCwgaXQgd2lsbCBhZGQgdGhlICJzZWxmIlxuYXJndW1lbnQgdG8gdGhlIGFyZ3VtZW50IGxpc3QuICBCb3VuZCBtZXRob2RzIGhhdmUgdHdvIHNwZWNpYWwgcmVhZC1cbm9ubHkgYXR0cmlidXRlczogIm0uX19zZWxmX18iIGlzIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGhvZFxub3BlcmF0ZXMsIGFuZCAibS5fX2Z1bmNfXyIgaXMgdGhlIGZ1bmN0aW9uIGltcGxlbWVudGluZyB0aGUgbWV0aG9kLlxuQ2FsbGluZyAibShhcmctMSwgYXJnLTIsIC4uLiwgYXJnLW4pIiBpcyBjb21wbGV0ZWx5IGVxdWl2YWxlbnQgdG9cbmNhbGxpbmcgIm0uX19mdW5jX18obS5fX3NlbGZfXywgYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKSIuXG5cbkxpa2UgZnVuY3Rpb24gb2JqZWN0cywgYm91bmQgbWV0aG9kIG9iamVjdHMgc3VwcG9ydCBnZXR0aW5nIGFyYml0cmFyeVxuYXR0cmlidXRlcy4gIEhvd2V2ZXIsIHNpbmNlIG1ldGhvZCBhdHRyaWJ1dGVzIGFyZSBhY3R1YWxseSBzdG9yZWQgb25cbnRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdCAoIm1ldGguX19mdW5jX18iKSwgc2V0dGluZyBtZXRob2RcbmF0dHJpYnV0ZXMgb24gYm91bmQgbWV0aG9kcyBpcyBkaXNhbGxvd2VkLiAgQXR0ZW1wdGluZyB0byBzZXQgYW5cbmF0dHJpYnV0ZSBvbiBhIG1ldGhvZCByZXN1bHRzIGluIGFuICJBdHRyaWJ1dGVFcnJvciIgYmVpbmcgcmFpc2VkLiAgSW5cbm9yZGVyIHRvIHNldCBhIG1ldGhvZCBhdHRyaWJ1dGUsIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGl0IG9uIHRoZVxudW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3Q6XG5cbiAgID4+PiBjbGFzcyBDOlxuICAgLi4uICAgICBkZWYgbWV0aG9kKHNlbGYpOlxuICAgLi4uICAgICAgICAgcGFzc1xuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMubWV0aG9kLndob2FtaSA9IFwnbXkgbmFtZSBpcyBtZXRob2RcJyAgIyBjYW5cJ3Qgc2V0IG9uIHRoZSBtZXRob2RcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbiAgIEF0dHJpYnV0ZUVycm9yOiBcJ21ldGhvZFwnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlIFwnd2hvYW1pXCdcbiAgID4+PiBjLm1ldGhvZC5fX2Z1bmNfXy53aG9hbWkgPSBcJ215IG5hbWUgaXMgbWV0aG9kXCdcbiAgID4+PiBjLm1ldGhvZC53aG9hbWlcbiAgIFwnbXkgbmFtZSBpcyBtZXRob2RcJ1xuXG5TZWUgKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAotICd0eXBlc21vZHVsZXMnOiB1J1xuTW9kdWxlc1xuKioqKioqKlxuXG5UaGUgb25seSBzcGVjaWFsIG9wZXJhdGlvbiBvbiBhIG1vZHVsZSBpcyBhdHRyaWJ1dGUgYWNjZXNzOiAibS5uYW1lIixcbndoZXJlICptKiBpcyBhIG1vZHVsZSBhbmQgKm5hbWUqIGFjY2Vzc2VzIGEgbmFtZSBkZWZpbmVkIGluICptKlwnc1xuc3ltYm9sIHRhYmxlLiBNb2R1bGUgYXR0cmlidXRlcyBjYW4gYmUgYXNzaWduZWQgdG8uICAoTm90ZSB0aGF0IHRoZVxuImltcG9ydCIgc3RhdGVtZW50IGlzIG5vdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGFuIG9wZXJhdGlvbiBvbiBhIG1vZHVsZVxub2JqZWN0OyAiaW1wb3J0IGZvbyIgZG9lcyBub3QgcmVxdWlyZSBhIG1vZHVsZSBvYmplY3QgbmFtZWQgKmZvbyogdG9cbmV4aXN0LCByYXRoZXIgaXQgcmVxdWlyZXMgYW4gKGV4dGVybmFsKSAqZGVmaW5pdGlvbiogZm9yIGEgbW9kdWxlXG5uYW1lZCAqZm9vKiBzb21ld2hlcmUuKVxuXG5BIHNwZWNpYWwgYXR0cmlidXRlIG9mIGV2ZXJ5IG1vZHVsZSBpcyAiX19kaWN0X18iLiBUaGlzIGlzIHRoZVxuZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBtb2R1bGVcJ3Mgc3ltYm9sIHRhYmxlLiBNb2RpZnlpbmcgdGhpc1xuZGljdGlvbmFyeSB3aWxsIGFjdHVhbGx5IGNoYW5nZSB0aGUgbW9kdWxlXCdzIHN5bWJvbCB0YWJsZSwgYnV0IGRpcmVjdFxuYXNzaWdubWVudCB0byB0aGUgIl9fZGljdF9fIiBhdHRyaWJ1dGUgaXMgbm90IHBvc3NpYmxlICh5b3UgY2FuIHdyaXRlXG4ibS5fX2RpY3RfX1tcJ2FcJ10gPSAxIiwgd2hpY2ggZGVmaW5lcyAibS5hIiB0byBiZSAiMSIsIGJ1dCB5b3UgY2FuXCd0XG53cml0ZSAibS5fX2RpY3RfXyA9IHt9IikuICBNb2RpZnlpbmcgIl9fZGljdF9fIiBkaXJlY3RseSBpcyBub3RcbnJlY29tbWVuZGVkLlxuXG5Nb2R1bGVzIGJ1aWx0IGludG8gdGhlIGludGVycHJldGVyIGFyZSB3cml0dGVuIGxpa2UgdGhpczogIjxtb2R1bGVcblwnc3lzXCcgKGJ1aWx0LWluKT4iLiAgSWYgbG9hZGVkIGZyb20gYSBmaWxlLCB0aGV5IGFyZSB3cml0dGVuIGFzXG4iPG1vZHVsZSBcJ29zXCcgZnJvbSBcJy91c3IvbG9jYWwvbGliL3B5dGhvblguWS9vcy5weWNcJz4iLlxuJywKLSAndHlwZXNzZXEnOiB1J1xuU2VxdWVuY2UgVHlwZXMgLS0tICJsaXN0IiwgInR1cGxlIiwgInJhbmdlIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGVyZSBhcmUgdGhyZWUgYmFzaWMgc2VxdWVuY2UgdHlwZXM6IGxpc3RzLCB0dXBsZXMsIGFuZCByYW5nZVxub2JqZWN0cy4gQWRkaXRpb25hbCBzZXF1ZW5jZSB0eXBlcyB0YWlsb3JlZCBmb3IgcHJvY2Vzc2luZyBvZiAqYmluYXJ5XG5kYXRhKiBhbmQgKnRleHQgc3RyaW5ncyogYXJlIGRlc2NyaWJlZCBpbiBkZWRpY2F0ZWQgc2VjdGlvbnMuXG5cblxuQ29tbW9uIFNlcXVlbmNlIE9wZXJhdGlvbnNcbj09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIHN1cHBvcnRlZCBieSBtb3N0IHNlcXVlbmNlXG50eXBlcywgYm90aCBtdXRhYmxlIGFuZCBpbW11dGFibGUuIFRoZSAiY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIiBBQkNcbmlzIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlc2Ugb3BlcmF0aW9uc1xub24gY3VzdG9tIHNlcXVlbmNlIHR5cGVzLlxuXG5UaGlzIHRhYmxlIGxpc3RzIHRoZSBzZXF1ZW5jZSBvcGVyYXRpb25zIHNvcnRlZCBpbiBhc2NlbmRpbmcgcHJpb3JpdHkuXG5JbiB0aGUgdGFibGUsICpzKiBhbmQgKnQqIGFyZSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgdHlwZSwgKm4qLCAqaSosXG4qaiogYW5kICprKiBhcmUgaW50ZWdlcnMgYW5kICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHRoYXQgbWVldHMgYW55XG50eXBlIGFuZCB2YWx1ZSByZXN0cmljdGlvbnMgaW1wb3NlZCBieSAqcyouXG5cblRoZSAiaW4iIGFuZCAibm90IGluIiBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdGllcyBhcyB0aGVcbmNvbXBhcmlzb24gb3BlcmF0aW9ucy4gVGhlICIrIiAoY29uY2F0ZW5hdGlvbikgYW5kICIqIiAocmVwZXRpdGlvbilcbm9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUgY29ycmVzcG9uZGluZyBudW1lcmljXG5vcGVyYXRpb25zLlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT0rXG58ICJ4IGluIHMiICAgICAgICAgICAgICAgICAgIHwgIlRydWUiIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgICAgfCAoMSkgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgIkZhbHNlIiAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJ4IG5vdCBpbiBzIiAgICAgICAgICAgICAgIHwgIkZhbHNlIiBpZiBhbiBpdGVtIG9mICpzKiBpcyAgICAgfCAoMSkgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgIlRydWUiICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzICsgdCIgICAgICAgICAgICAgICAgICAgIHwgdGhlIGNvbmNhdGVuYXRpb24gb2YgKnMqIGFuZCAqdCogfCAoNikoNykgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAicyAqIG4iIG9yICJuICogcyIgICAgICAgICB8IGVxdWl2YWxlbnQgdG8gYWRkaW5nICpzKiB0byAgICAgIHwgKDIpKDcpICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRzZWxmICpuKiB0aW1lcyAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAic1tpXSIgICAgICAgICAgICAgICAgICAgICB8ICppKnRoIGl0ZW0gb2YgKnMqLCBvcmlnaW4gMCAgICAgIHwgKDMpICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICAgICB8ICgzKSg0KSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiAgICAgfCAoMykoNSkgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aXRoIHN0ZXAgKmsqICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJsZW4ocykiICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mICpzKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAibWluKHMpIiAgICAgICAgICAgICAgICAgICB8IHNtYWxsZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgIm1heChzKSIgICAgICAgICAgICAgICAgICAgfCBsYXJnZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzLmluZGV4KHhbLCBpWywgal1dKSIgICAgIHwgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgfCAoOCkgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogaW4gKnMqIChhdCBvciBhZnRlciBpbmRleCAgICB8ICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICppKiBhbmQgYmVmb3JlIGluZGV4ICpqKikgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInMuY291bnQoeCkiICAgICAgICAgICAgICAgfCB0b3RhbCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgICB8ICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiBpbiAqcyogICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcblxuU2VxdWVuY2VzIG9mIHRoZSBzYW1lIHR5cGUgYWxzbyBzdXBwb3J0IGNvbXBhcmlzb25zLiAgSW4gcGFydGljdWxhcixcbnR1cGxlcyBhbmQgbGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IGJ5IGNvbXBhcmluZ1xuY29ycmVzcG9uZGluZyBlbGVtZW50cy4gVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGV2ZXJ5XG5lbGVtZW50IG11c3QgY29tcGFyZSBlcXVhbCBhbmQgdGhlIHR3byBzZXF1ZW5jZXMgbXVzdCBiZSBvZiB0aGUgc2FtZVxudHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguICAoRm9yIGZ1bGwgZGV0YWlscyBzZWUgKkNvbXBhcmlzb25zKiBpblxudGhlIGxhbmd1YWdlIHJlZmVyZW5jZS4pXG5cbk5vdGVzOlxuXG4xLiBXaGlsZSB0aGUgImluIiBhbmQgIm5vdCBpbiIgb3BlcmF0aW9ucyBhcmUgdXNlZCBvbmx5IGZvciBzaW1wbGVcbiAgIGNvbnRhaW5tZW50IHRlc3RpbmcgaW4gdGhlIGdlbmVyYWwgY2FzZSwgc29tZSBzcGVjaWFsaXNlZCBzZXF1ZW5jZXNcbiAgIChzdWNoIGFzICJzdHIiLCAiYnl0ZXMiIGFuZCAiYnl0ZWFycmF5IikgYWxzbyB1c2UgdGhlbSBmb3JcbiAgIHN1YnNlcXVlbmNlIHRlc3Rpbmc6XG5cbiAgICAgID4+PiAiZ2ciIGluICJlZ2dzIlxuICAgICAgVHJ1ZVxuXG4yLiBWYWx1ZXMgb2YgKm4qIGxlc3MgdGhhbiAiMCIgYXJlIHRyZWF0ZWQgYXMgIjAiICh3aGljaCB5aWVsZHMgYW5cbiAgIGVtcHR5IHNlcXVlbmNlIG9mIHRoZSBzYW1lIHR5cGUgYXMgKnMqKS4gIE5vdGUgdGhhdCBpdGVtcyBpbiB0aGVcbiAgIHNlcXVlbmNlICpzKiBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCBtdWx0aXBsZSB0aW1lcy5cbiAgIFRoaXMgb2Z0ZW4gaGF1bnRzIG5ldyBQeXRob24gcHJvZ3JhbW1lcnM7IGNvbnNpZGVyOlxuXG4gICAgICA+Pj4gbGlzdHMgPSBbW11dICogM1xuICAgICAgPj4+IGxpc3RzXG4gICAgICBbW10sIFtdLCBbXV1cbiAgICAgID4+PiBsaXN0c1swXS5hcHBlbmQoMylcbiAgICAgID4+PiBsaXN0c1xuICAgICAgW1szXSwgWzNdLCBbM11dXG5cbiAgIFdoYXQgaGFzIGhhcHBlbmVkIGlzIHRoYXQgIltbXV0iIGlzIGEgb25lLWVsZW1lbnQgbGlzdCBjb250YWluaW5nXG4gICBhbiBlbXB0eSBsaXN0LCBzbyBhbGwgdGhyZWUgZWxlbWVudHMgb2YgIltbXV0gKiAzIiBhcmUgcmVmZXJlbmNlc1xuICAgdG8gdGhpcyBzaW5nbGUgZW1wdHkgbGlzdC4gIE1vZGlmeWluZyBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mXG4gICAibGlzdHMiIG1vZGlmaWVzIHRoaXMgc2luZ2xlIGxpc3QuIFlvdSBjYW4gY3JlYXRlIGEgbGlzdCBvZlxuICAgZGlmZmVyZW50IGxpc3RzIHRoaXMgd2F5OlxuXG4gICAgICA+Pj4gbGlzdHMgPSBbW10gZm9yIGkgaW4gcmFuZ2UoMyldXG4gICAgICA+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpXG4gICAgICA+Pj4gbGlzdHNbMV0uYXBwZW5kKDUpXG4gICAgICA+Pj4gbGlzdHNbMl0uYXBwZW5kKDcpXG4gICAgICA+Pj4gbGlzdHNcbiAgICAgIFtbM10sIFs1XSwgWzddXVxuXG4gICBGdXJ0aGVyIGV4cGxhbmF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgRkFRIGVudHJ5ICpIb3cgZG8gSSBjcmVhdGVcbiAgIGEgbXVsdGlkaW1lbnNpb25hbCBsaXN0PyouXG5cbjMuIElmICppKiBvciAqaiogaXMgbmVnYXRpdmUsIHRoZSBpbmRleCBpcyByZWxhdGl2ZSB0byB0aGUgZW5kIG9mXG4gICB0aGUgc3RyaW5nOiAibGVuKHMpICsgaSIgb3IgImxlbihzKSArIGoiIGlzIHN1YnN0aXR1dGVkLiAgQnV0IG5vdGVcbiAgIHRoYXQgIi0wIiBpcyBzdGlsbCAiMCIuXG5cbjQuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlIG9mXG4gICBpdGVtcyB3aXRoIGluZGV4ICprKiBzdWNoIHRoYXQgImkgPD0gayA8IGoiLiAgSWYgKmkqIG9yICpqKiBpc1xuICAgZ3JlYXRlciB0aGFuICJsZW4ocykiLCB1c2UgImxlbihzKSIuICBJZiAqaSogaXMgb21pdHRlZCBvciAiTm9uZSIsXG4gICB1c2UgIjAiLiAgSWYgKmoqIGlzIG9taXR0ZWQgb3IgIk5vbmUiLCB1c2UgImxlbihzKSIuICBJZiAqaSogaXNcbiAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAqaiosIHRoZSBzbGljZSBpcyBlbXB0eS5cblxuNS4gVGhlIHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogd2l0aCBzdGVwICprKiBpcyBkZWZpbmVkIGFzIHRoZVxuICAgc2VxdWVuY2Ugb2YgaXRlbXMgd2l0aCBpbmRleCAgInggPSBpICsgbiprIiBzdWNoIHRoYXQgIjAgPD0gbiA8XG4gICAoai1pKS9rIi4gIEluIG90aGVyIHdvcmRzLCB0aGUgaW5kaWNlcyBhcmUgImkiLCAiaStrIiwgImkrMiprIixcbiAgICJpKzMqayIgYW5kIHNvIG9uLCBzdG9wcGluZyB3aGVuICpqKiBpcyByZWFjaGVkIChidXQgbmV2ZXJcbiAgIGluY2x1ZGluZyAqaiopLiAgSWYgKmkqIG9yICpqKiBpcyBncmVhdGVyIHRoYW4gImxlbihzKSIsIHVzZVxuICAgImxlbihzKSIuICBJZiAqaSogb3IgKmoqIGFyZSBvbWl0dGVkIG9yICJOb25lIiwgdGhleSBiZWNvbWUgImVuZCJcbiAgIHZhbHVlcyAod2hpY2ggZW5kIGRlcGVuZHMgb24gdGhlIHNpZ24gb2YgKmsqKS4gIE5vdGUsICprKiBjYW5ub3QgYmVcbiAgIHplcm8uIElmICprKiBpcyAiTm9uZSIsIGl0IGlzIHRyZWF0ZWQgbGlrZSAiMSIuXG5cbjYuIENvbmNhdGVuYXRpbmcgaW1tdXRhYmxlIHNlcXVlbmNlcyBhbHdheXMgcmVzdWx0cyBpbiBhIG5ld1xuICAgb2JqZWN0LiBUaGlzIG1lYW5zIHRoYXQgYnVpbGRpbmcgdXAgYSBzZXF1ZW5jZSBieSByZXBlYXRlZFxuICAgY29uY2F0ZW5hdGlvbiB3aWxsIGhhdmUgYSBxdWFkcmF0aWMgcnVudGltZSBjb3N0IGluIHRoZSB0b3RhbFxuICAgc2VxdWVuY2UgbGVuZ3RoLiBUbyBnZXQgYSBsaW5lYXIgcnVudGltZSBjb3N0LCB5b3UgbXVzdCBzd2l0Y2ggdG9cbiAgIG9uZSBvZiB0aGUgYWx0ZXJuYXRpdmVzIGJlbG93OlxuXG4gICAqIGlmIGNvbmNhdGVuYXRpbmcgInN0ciIgb2JqZWN0cywgeW91IGNhbiBidWlsZCBhIGxpc3QgYW5kIHVzZVxuICAgICAic3RyLmpvaW4oKSIgYXQgdGhlIGVuZCBvciBlbHNlIHdyaXRlIHRvIGFuICJpby5TdHJpbmdJTyJcbiAgICAgaW5zdGFuY2UgYW5kIHJldHJpZXZlIGl0cyB2YWx1ZSB3aGVuIGNvbXBsZXRlXG5cbiAgICogaWYgY29uY2F0ZW5hdGluZyAiYnl0ZXMiIG9iamVjdHMsIHlvdSBjYW4gc2ltaWxhcmx5IHVzZVxuICAgICAiYnl0ZXMuam9pbigpIiBvciAiaW8uQnl0ZXNJTyIsIG9yIHlvdSBjYW4gZG8gaW4tcGxhY2VcbiAgICAgY29uY2F0ZW5hdGlvbiB3aXRoIGEgImJ5dGVhcnJheSIgb2JqZWN0LiAgImJ5dGVhcnJheSIgb2JqZWN0cyBhcmVcbiAgICAgbXV0YWJsZSBhbmQgaGF2ZSBhbiBlZmZpY2llbnQgb3ZlcmFsbG9jYXRpb24gbWVjaGFuaXNtXG5cbiAgICogaWYgY29uY2F0ZW5hdGluZyAidHVwbGUiIG9iamVjdHMsIGV4dGVuZCBhICJsaXN0IiBpbnN0ZWFkXG5cbiAgICogZm9yIG90aGVyIHR5cGVzLCBpbnZlc3RpZ2F0ZSB0aGUgcmVsZXZhbnQgY2xhc3MgZG9jdW1lbnRhdGlvblxuXG43LiBTb21lIHNlcXVlbmNlIHR5cGVzIChzdWNoIGFzICJyYW5nZSIpIG9ubHkgc3VwcG9ydCBpdGVtXG4gICBzZXF1ZW5jZXMgdGhhdCBmb2xsb3cgc3BlY2lmaWMgcGF0dGVybnMsIGFuZCBoZW5jZSBkb25cJ3Qgc3VwcG9ydFxuICAgc2VxdWVuY2UgY29uY2F0ZW5hdGlvbiBvciByZXBldGl0aW9uLlxuXG44LiAiaW5kZXgiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi4gV2hlblxuICAgc3VwcG9ydGVkLCB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gdGhlIGluZGV4IG1ldGhvZCBhbGxvd1xuICAgZWZmaWNpZW50IHNlYXJjaGluZyBvZiBzdWJzZWN0aW9ucyBvZiB0aGUgc2VxdWVuY2UuIFBhc3NpbmcgdGhlXG4gICBleHRyYSBhcmd1bWVudHMgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHVzaW5nICJzW2k6al0uaW5kZXgoeCkiLFxuICAgb25seSB3aXRob3V0IGNvcHlpbmcgYW55IGRhdGEgYW5kIHdpdGggdGhlIHJldHVybmVkIGluZGV4IGJlaW5nXG4gICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlcXVlbmNlIHJhdGhlciB0aGFuIHRoZSBzdGFydCBvZiB0aGVcbiAgIHNsaWNlLlxuXG5cbkltbXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvbmx5IG9wZXJhdGlvbiB0aGF0IGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBnZW5lcmFsbHkgaW1wbGVtZW50XG50aGF0IGlzIG5vdCBhbHNvIGltcGxlbWVudGVkIGJ5IG11dGFibGUgc2VxdWVuY2UgdHlwZXMgaXMgc3VwcG9ydCBmb3JcbnRoZSAiaGFzaCgpIiBidWlsdC1pbi5cblxuVGhpcyBzdXBwb3J0IGFsbG93cyBpbW11dGFibGUgc2VxdWVuY2VzLCBzdWNoIGFzICJ0dXBsZSIgaW5zdGFuY2VzLCB0b1xuYmUgdXNlZCBhcyAiZGljdCIga2V5cyBhbmQgc3RvcmVkIGluICJzZXQiIGFuZCAiZnJvemVuc2V0IiBpbnN0YW5jZXMuXG5cbkF0dGVtcHRpbmcgdG8gaGFzaCBhbiBpbW11dGFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB1bmhhc2hhYmxlXG52YWx1ZXMgd2lsbCByZXN1bHQgaW4gIlR5cGVFcnJvciIuXG5cblxuTXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuPT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBkZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2VcbnR5cGVzLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiIEFCQyBpcyBwcm92aWRlZCB0byBtYWtlXG5pdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSBvcGVyYXRpb25zIG9uIGN1c3RvbSBzZXF1ZW5jZVxudHlwZXMuXG5cbkluIHRoZSB0YWJsZSAqcyogaXMgYW4gaW5zdGFuY2Ugb2YgYSBtdXRhYmxlIHNlcXVlbmNlIHR5cGUsICp0KiBpcyBhbnlcbml0ZXJhYmxlIG9iamVjdCBhbmQgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QgdGhhdCBtZWV0cyBhbnkgdHlwZSBhbmRcbnZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKiAoZm9yIGV4YW1wbGUsICJieXRlYXJyYXkiIG9ubHlcbmFjY2VwdHMgaW50ZWdlcnMgdGhhdCBtZWV0IHRoZSB2YWx1ZSByZXN0cmljdGlvbiAiMCA8PSB4IDw9IDI1NSIpLlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICAgICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rXG58ICJzW2ldID0geCIgICAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAqdCogICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImRlbCBzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyAic1tpOmpdID0gW10iICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAic1tpOmo6a10iIGFyZSAgIHwgKDEpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhvc2Ugb2YgKnQqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzIG9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbaTpqOmtdIiBmcm9tIHRoZSBsaXN0ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmFwcGVuZCh4KSIgICAgICAgICAgICAgICAgICB8IGFwcGVuZHMgKngqIHRvIHRoZSBlbmQgb2YgdGhlICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VxdWVuY2UgKHNhbWUgYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tsZW4ocyk6bGVuKHMpXSA9IFt4XSIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuY2xlYXIoKSIgICAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyBhbGwgaXRlbXMgZnJvbSAicyIgKHNhbWUgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAiZGVsIHNbOl0iKSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuY29weSgpIiAgICAgICAgICAgICAgICAgICAgIHwgY3JlYXRlcyBhIHNoYWxsb3cgY29weSBvZiAicyIgICAgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoc2FtZSBhcyAic1s6XSIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuZXh0ZW5kKHQpIiBvciAicyArPSB0IiAgICAgIHwgZXh0ZW5kcyAqcyogd2l0aCB0aGUgY29udGVudHMgb2YgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqdCogKGZvciB0aGUgbW9zdCBwYXJ0IHRoZSBzYW1lICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJzW2xlbihzKTpsZW4ocyldID0gdCIpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicyAqPSBuIiAgICAgICAgICAgICAgICAgICAgICAgfCB1cGRhdGVzICpzKiB3aXRoIGl0cyBjb250ZW50cyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGVhdGVkICpuKiB0aW1lcyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5pbnNlcnQoaSwgeCkiICAgICAgICAgICAgICAgfCBpbnNlcnRzICp4KiBpbnRvICpzKiBhdCB0aGUgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4IGdpdmVuIGJ5ICppKiAoc2FtZSBhcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbaTppXSA9IFt4XSIpICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnBvcChbaV0pIiAgICAgICAgICAgICAgICAgICB8IHJldHJpZXZlcyB0aGUgaXRlbSBhdCAqaSogYW5kICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxzbyByZW1vdmVzIGl0IGZyb20gKnMqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnJlbW92ZSh4KSIgICAgICAgICAgICAgICAgICB8IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSBmcm9tICpzKiAgIHwgKDMpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hlcmUgInNbaV0gPT0geCIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnJldmVyc2UoKSIgICAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogaW4gICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbk5vdGVzOlxuXG4xLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgcmVwbGFjaW5nLlxuXG4yLiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvICItMSIsIHNvIHRoYXQgYnkgZGVmYXVsdFxuICAgdGhlIGxhc3QgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC5cblxuMy4gInJlbW92ZSIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLlxuXG40LiBUaGUgInJldmVyc2UoKSIgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSBmb3JcbiAgIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiByZXZlcnNpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvIHJlbWluZCB1c2Vyc1xuICAgdGhhdCBpdCBvcGVyYXRlcyBieSBzaWRlIGVmZmVjdCwgaXQgZG9lcyBub3QgcmV0dXJuIHRoZSByZXZlcnNlZFxuICAgc2VxdWVuY2UuXG5cbjUuICJjbGVhcigpIiBhbmQgImNvcHkoKSIgYXJlIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZVxuICAgaW50ZXJmYWNlcyBvZiBtdXRhYmxlIGNvbnRhaW5lcnMgdGhhdCBkb25cJ3Qgc3VwcG9ydCBzbGljaW5nXG4gICBvcGVyYXRpb25zIChzdWNoIGFzICJkaWN0IiBhbmQgInNldCIpXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMzogImNsZWFyKCkiIGFuZCAiY29weSgpIiBtZXRob2RzLlxuXG42LiBUaGUgdmFsdWUgKm4qIGlzIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmdcbiAgICJfX2luZGV4X18oKSIuICBaZXJvIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgb2YgKm4qIGNsZWFyIHRoZSBzZXF1ZW5jZS5cbiAgIEl0ZW1zIGluIHRoZSBzZXF1ZW5jZSBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCBtdWx0aXBsZVxuICAgdGltZXMsIGFzIGV4cGxhaW5lZCBmb3IgInMgKiBuIiB1bmRlciAqQ29tbW9uIFNlcXVlbmNlIE9wZXJhdGlvbnMqLlxuXG5cbkxpc3RzXG49PT09PVxuXG5MaXN0cyBhcmUgbXV0YWJsZSBzZXF1ZW5jZXMsIHR5cGljYWxseSB1c2VkIHRvIHN0b3JlIGNvbGxlY3Rpb25zIG9mXG5ob21vZ2VuZW91cyBpdGVtcyAod2hlcmUgdGhlIHByZWNpc2UgZGVncmVlIG9mIHNpbWlsYXJpdHkgd2lsbCB2YXJ5IGJ5XG5hcHBsaWNhdGlvbikuXG5cbmNsYXNzIGNsYXNzIGxpc3QoW2l0ZXJhYmxlXSlcblxuICAgTGlzdHMgbWF5IGJlIGNvbnN0cnVjdGVkIGluIHNldmVyYWwgd2F5czpcblxuICAgKiBVc2luZyBhIHBhaXIgb2Ygc3F1YXJlIGJyYWNrZXRzIHRvIGRlbm90ZSB0aGUgZW1wdHkgbGlzdDogIltdIlxuXG4gICAqIFVzaW5nIHNxdWFyZSBicmFja2V0cywgc2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogIlthXSIsXG4gICAgICJbYSwgYiwgY10iXG5cbiAgICogVXNpbmcgYSBsaXN0IGNvbXByZWhlbnNpb246ICJbeCBmb3IgeCBpbiBpdGVyYWJsZV0iXG5cbiAgICogVXNpbmcgdGhlIHR5cGUgY29uc3RydWN0b3I6ICJsaXN0KCkiIG9yICJsaXN0KGl0ZXJhYmxlKSJcblxuICAgVGhlIGNvbnN0cnVjdG9yIGJ1aWxkcyBhIGxpc3Qgd2hvc2UgaXRlbXMgYXJlIHRoZSBzYW1lIGFuZCBpbiB0aGVcbiAgIHNhbWUgb3JkZXIgYXMgKml0ZXJhYmxlKlwncyBpdGVtcy4gICppdGVyYWJsZSogbWF5IGJlIGVpdGhlciBhXG4gICBzZXF1ZW5jZSwgYSBjb250YWluZXIgdGhhdCBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuIGl0ZXJhdG9yXG4gICBvYmplY3QuICBJZiAqaXRlcmFibGUqIGlzIGFscmVhZHkgYSBsaXN0LCBhIGNvcHkgaXMgbWFkZSBhbmRcbiAgIHJldHVybmVkLCBzaW1pbGFyIHRvICJpdGVyYWJsZVs6XSIuIEZvciBleGFtcGxlLCAibGlzdChcJ2FiY1wnKSJcbiAgIHJldHVybnMgIltcJ2FcJywgXCdiXCcsIFwnY1wnXSIgYW5kICJsaXN0KCAoMSwgMiwgMykgKSIgcmV0dXJucyAiWzEsIDIsXG4gICAzXSIuIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyBlbXB0eVxuICAgbGlzdCwgIltdIi5cblxuICAgTWFueSBvdGhlciBvcGVyYXRpb25zIGFsc28gcHJvZHVjZSBsaXN0cywgaW5jbHVkaW5nIHRoZSAic29ydGVkKCkiXG4gICBidWlsdC1pbi5cblxuICAgTGlzdHMgaW1wbGVtZW50IGFsbCBvZiB0aGUgKmNvbW1vbiogYW5kICptdXRhYmxlKiBzZXF1ZW5jZVxuICAgb3BlcmF0aW9ucy4gTGlzdHMgYWxzbyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBtZXRob2Q6XG5cbiAgIHNvcnQoKiwga2V5PU5vbmUsIHJldmVyc2U9Tm9uZSlcblxuICAgICAgVGhpcyBtZXRob2Qgc29ydHMgdGhlIGxpc3QgaW4gcGxhY2UsIHVzaW5nIG9ubHkgIjwiIGNvbXBhcmlzb25zXG4gICAgICBiZXR3ZWVuIGl0ZW1zLiBFeGNlcHRpb25zIGFyZSBub3Qgc3VwcHJlc3NlZCAtIGlmIGFueSBjb21wYXJpc29uXG4gICAgICBvcGVyYXRpb25zIGZhaWwsIHRoZSBlbnRpcmUgc29ydCBvcGVyYXRpb24gd2lsbCBmYWlsIChhbmQgdGhlXG4gICAgICBsaXN0IHdpbGwgbGlrZWx5IGJlIGxlZnQgaW4gYSBwYXJ0aWFsbHkgbW9kaWZpZWQgc3RhdGUpLlxuXG4gICAgICAic29ydCgpIiBhY2NlcHRzIHR3byBhcmd1bWVudHMgdGhhdCBjYW4gb25seSBiZSBwYXNzZWQgYnlcbiAgICAgIGtleXdvcmQgKCprZXl3b3JkLW9ubHkgYXJndW1lbnRzKik6XG5cbiAgICAgICprZXkqIHNwZWNpZmllcyBhIGZ1bmN0aW9uIG9mIG9uZSBhcmd1bWVudCB0aGF0IGlzIHVzZWQgdG9cbiAgICAgIGV4dHJhY3QgYSBjb21wYXJpc29uIGtleSBmcm9tIGVhY2ggbGlzdCBlbGVtZW50IChmb3IgZXhhbXBsZSxcbiAgICAgICJrZXk9c3RyLmxvd2VyIikuIFRoZSBrZXkgY29ycmVzcG9uZGluZyB0byBlYWNoIGl0ZW0gaW4gdGhlIGxpc3RcbiAgICAgIGlzIGNhbGN1bGF0ZWQgb25jZSBhbmQgdGhlbiB1c2VkIGZvciB0aGUgZW50aXJlIHNvcnRpbmcgcHJvY2Vzcy5cbiAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mICJOb25lIiBtZWFucyB0aGF0IGxpc3QgaXRlbXMgYXJlIHNvcnRlZFxuICAgICAgZGlyZWN0bHkgd2l0aG91dCBjYWxjdWxhdGluZyBhIHNlcGFyYXRlIGtleSB2YWx1ZS5cblxuICAgICAgVGhlICJmdW5jdG9vbHMuY21wX3RvX2tleSgpIiB1dGlsaXR5IGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IGFcbiAgICAgIDIueCBzdHlsZSAqY21wKiBmdW5jdGlvbiB0byBhICprZXkqIGZ1bmN0aW9uLlxuXG4gICAgICAqcmV2ZXJzZSogaXMgYSBib29sZWFuIHZhbHVlLiAgSWYgc2V0IHRvICJUcnVlIiwgdGhlbiB0aGUgbGlzdFxuICAgICAgZWxlbWVudHMgYXJlIHNvcnRlZCBhcyBpZiBlYWNoIGNvbXBhcmlzb24gd2VyZSByZXZlcnNlZC5cblxuICAgICAgVGhpcyBtZXRob2QgbW9kaWZpZXMgdGhlIHNlcXVlbmNlIGluIHBsYWNlIGZvciBlY29ub215IG9mIHNwYWNlXG4gICAgICB3aGVuIHNvcnRpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvIHJlbWluZCB1c2VycyB0aGF0IGl0IG9wZXJhdGVzXG4gICAgICBieSBzaWRlIGVmZmVjdCwgaXQgZG9lcyBub3QgcmV0dXJuIHRoZSBzb3J0ZWQgc2VxdWVuY2UgKHVzZVxuICAgICAgInNvcnRlZCgpIiB0byBleHBsaWNpdGx5IHJlcXVlc3QgYSBuZXcgc29ydGVkIGxpc3QgaW5zdGFuY2UpLlxuXG4gICAgICBUaGUgInNvcnQoKSIgbWV0aG9kIGlzIGd1YXJhbnRlZWQgdG8gYmUgc3RhYmxlLiAgQSBzb3J0IGlzXG4gICAgICBzdGFibGUgaWYgaXQgZ3VhcmFudGVlcyBub3QgdG8gY2hhbmdlIHRoZSByZWxhdGl2ZSBvcmRlciBvZlxuICAgICAgZWxlbWVudHMgdGhhdCBjb21wYXJlIGVxdWFsIC0tLSB0aGlzIGlzIGhlbHBmdWwgZm9yIHNvcnRpbmcgaW5cbiAgICAgIG11bHRpcGxlIHBhc3NlcyAoZm9yIGV4YW1wbGUsIHNvcnQgYnkgZGVwYXJ0bWVudCwgdGhlbiBieSBzYWxhcnlcbiAgICAgIGdyYWRlKS5cblxuICAgICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBXaGlsZSBhIGxpc3QgaXMgYmVpbmcgc29ydGVkLFxuICAgICAgdGhlIGVmZmVjdCBvZiBhdHRlbXB0aW5nIHRvIG11dGF0ZSwgb3IgZXZlbiBpbnNwZWN0LCB0aGUgbGlzdCBpc1xuICAgICAgdW5kZWZpbmVkLiAgVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIG1ha2VzIHRoZSBsaXN0IGFwcGVhclxuICAgICAgZW1wdHkgZm9yIHRoZSBkdXJhdGlvbiwgYW5kIHJhaXNlcyAiVmFsdWVFcnJvciIgaWYgaXQgY2FuIGRldGVjdFxuICAgICAgdGhhdCB0aGUgbGlzdCBoYXMgYmVlbiBtdXRhdGVkIGR1cmluZyBhIHNvcnQuXG5cblxuVHVwbGVzXG49PT09PT1cblxuVHVwbGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2VzLCB0eXBpY2FsbHkgdXNlZCB0byBzdG9yZSBjb2xsZWN0aW9ucyBvZlxuaGV0ZXJvZ2VuZW91cyBkYXRhIChzdWNoIGFzIHRoZSAyLXR1cGxlcyBwcm9kdWNlZCBieSB0aGUgImVudW1lcmF0ZSgpIlxuYnVpbHQtaW4pLiBUdXBsZXMgYXJlIGFsc28gdXNlZCBmb3IgY2FzZXMgd2hlcmUgYW4gaW1tdXRhYmxlIHNlcXVlbmNlXG5vZiBob21vZ2VuZW91cyBkYXRhIGlzIG5lZWRlZCAoc3VjaCBhcyBhbGxvd2luZyBzdG9yYWdlIGluIGEgInNldCIgb3JcbiJkaWN0IiBpbnN0YW5jZSkuXG5cbmNsYXNzIGNsYXNzIHR1cGxlKFtpdGVyYWJsZV0pXG5cbiAgIFR1cGxlcyBtYXkgYmUgY29uc3RydWN0ZWQgaW4gYSBudW1iZXIgb2Ygd2F5czpcblxuICAgKiBVc2luZyBhIHBhaXIgb2YgcGFyZW50aGVzZXMgdG8gZGVub3RlIHRoZSBlbXB0eSB0dXBsZTogIigpIlxuXG4gICAqIFVzaW5nIGEgdHJhaWxpbmcgY29tbWEgZm9yIGEgc2luZ2xldG9uIHR1cGxlOiAiYSwiIG9yICIoYSwpIlxuXG4gICAqIFNlcGFyYXRpbmcgaXRlbXMgd2l0aCBjb21tYXM6ICJhLCBiLCBjIiBvciAiKGEsIGIsIGMpIlxuXG4gICAqIFVzaW5nIHRoZSAidHVwbGUoKSIgYnVpbHQtaW46ICJ0dXBsZSgpIiBvciAidHVwbGUoaXRlcmFibGUpIlxuXG4gICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgdHVwbGUgd2hvc2UgaXRlbXMgYXJlIHRoZSBzYW1lIGFuZCBpbiB0aGVcbiAgIHNhbWUgb3JkZXIgYXMgKml0ZXJhYmxlKlwncyBpdGVtcy4gICppdGVyYWJsZSogbWF5IGJlIGVpdGhlciBhXG4gICBzZXF1ZW5jZSwgYSBjb250YWluZXIgdGhhdCBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuIGl0ZXJhdG9yXG4gICBvYmplY3QuICBJZiAqaXRlcmFibGUqIGlzIGFscmVhZHkgYSB0dXBsZSwgaXQgaXMgcmV0dXJuZWRcbiAgIHVuY2hhbmdlZC4gRm9yIGV4YW1wbGUsICJ0dXBsZShcJ2FiY1wnKSIgcmV0dXJucyAiKFwnYVwnLCBcJ2JcJywgXCdjXCcpIlxuICAgYW5kICJ0dXBsZSggWzEsIDIsIDNdICkiIHJldHVybnMgIigxLCAyLCAzKSIuIElmIG5vIGFyZ3VtZW50IGlzXG4gICBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgZW1wdHkgdHVwbGUsICIoKSIuXG5cbiAgIE5vdGUgdGhhdCBpdCBpcyBhY3R1YWxseSB0aGUgY29tbWEgd2hpY2ggbWFrZXMgYSB0dXBsZSwgbm90IHRoZVxuICAgcGFyZW50aGVzZXMuIFRoZSBwYXJlbnRoZXNlcyBhcmUgb3B0aW9uYWwsIGV4Y2VwdCBpbiB0aGUgZW1wdHlcbiAgIHR1cGxlIGNhc2UsIG9yIHdoZW4gdGhleSBhcmUgbmVlZGVkIHRvIGF2b2lkIHN5bnRhY3RpYyBhbWJpZ3VpdHkuXG4gICBGb3IgZXhhbXBsZSwgImYoYSwgYiwgYykiIGlzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIHRocmVlIGFyZ3VtZW50cyxcbiAgIHdoaWxlICJmKChhLCBiLCBjKSkiIGlzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgMy10dXBsZSBhcyB0aGUgc29sZVxuICAgYXJndW1lbnQuXG5cbiAgIFR1cGxlcyBpbXBsZW1lbnQgYWxsIG9mIHRoZSAqY29tbW9uKiBzZXF1ZW5jZSBvcGVyYXRpb25zLlxuXG5Gb3IgaGV0ZXJvZ2VuZW91cyBjb2xsZWN0aW9ucyBvZiBkYXRhIHdoZXJlIGFjY2VzcyBieSBuYW1lIGlzIGNsZWFyZXJcbnRoYW4gYWNjZXNzIGJ5IGluZGV4LCAiY29sbGVjdGlvbnMubmFtZWR0dXBsZSgpIiBtYXkgYmUgYSBtb3JlXG5hcHByb3ByaWF0ZSBjaG9pY2UgdGhhbiBhIHNpbXBsZSB0dXBsZSBvYmplY3QuXG5cblxuUmFuZ2VzXG49PT09PT1cblxuVGhlICJyYW5nZSIgdHlwZSByZXByZXNlbnRzIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSBvZiBudW1iZXJzIGFuZCBpc1xuY29tbW9ubHkgdXNlZCBmb3IgbG9vcGluZyBhIHNwZWNpZmljIG51bWJlciBvZiB0aW1lcyBpbiAiZm9yIiBsb29wcy5cblxuY2xhc3MgY2xhc3MgcmFuZ2Uoc3RvcClcbmNsYXNzIGNsYXNzIHJhbmdlKHN0YXJ0LCBzdG9wWywgc3RlcF0pXG5cbiAgIFRoZSBhcmd1bWVudHMgdG8gdGhlIHJhbmdlIGNvbnN0cnVjdG9yIG11c3QgYmUgaW50ZWdlcnMgKGVpdGhlclxuICAgYnVpbHQtaW4gImludCIgb3IgYW55IG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlICJfX2luZGV4X18iXG4gICBzcGVjaWFsIG1ldGhvZCkuICBJZiB0aGUgKnN0ZXAqIGFyZ3VtZW50IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvXG4gICAiMSIuIElmIHRoZSAqc3RhcnQqIGFyZ3VtZW50IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvICIwIi4gSWZcbiAgICpzdGVwKiBpcyB6ZXJvLCAiVmFsdWVFcnJvciIgaXMgcmFpc2VkLlxuXG4gICBGb3IgYSBwb3NpdGl2ZSAqc3RlcCosIHRoZSBjb250ZW50cyBvZiBhIHJhbmdlICJyIiBhcmUgZGV0ZXJtaW5lZFxuICAgYnkgdGhlIGZvcm11bGEgInJbaV0gPSBzdGFydCArIHN0ZXAqaSIgd2hlcmUgImkgPj0gMCIgYW5kICJyW2ldIDxcbiAgIHN0b3AiLlxuXG4gICBGb3IgYSBuZWdhdGl2ZSAqc3RlcCosIHRoZSBjb250ZW50cyBvZiB0aGUgcmFuZ2UgYXJlIHN0aWxsXG4gICBkZXRlcm1pbmVkIGJ5IHRoZSBmb3JtdWxhICJyW2ldID0gc3RhcnQgKyBzdGVwKmkiLCBidXQgdGhlXG4gICBjb25zdHJhaW50cyBhcmUgImkgPj0gMCIgYW5kICJyW2ldID4gc3RvcCIuXG5cbiAgIEEgcmFuZ2Ugb2JqZWN0IHdpbGwgYmUgZW1wdHkgaWYgInJbMF0iIGRvZXMgbm90IG1lZXQgdGhlIHZhbHVlXG4gICBjb25zdHJhaW50LiBSYW5nZXMgZG8gc3VwcG9ydCBuZWdhdGl2ZSBpbmRpY2VzLCBidXQgdGhlc2UgYXJlXG4gICBpbnRlcnByZXRlZCBhcyBpbmRleGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIGRldGVybWluZWQgYnlcbiAgIHRoZSBwb3NpdGl2ZSBpbmRpY2VzLlxuXG4gICBSYW5nZXMgY29udGFpbmluZyBhYnNvbHV0ZSB2YWx1ZXMgbGFyZ2VyIHRoYW4gInN5cy5tYXhzaXplIiBhcmVcbiAgIHBlcm1pdHRlZCBidXQgc29tZSBmZWF0dXJlcyAoc3VjaCBhcyAibGVuKCkiKSBtYXkgcmFpc2VcbiAgICJPdmVyZmxvd0Vycm9yIi5cblxuICAgUmFuZ2UgZXhhbXBsZXM6XG5cbiAgICAgID4+PiBsaXN0KHJhbmdlKDEwKSlcbiAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XVxuICAgICAgPj4+IGxpc3QocmFuZ2UoMSwgMTEpKVxuICAgICAgWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXVxuICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgMzAsIDUpKVxuICAgICAgWzAsIDUsIDEwLCAxNSwgMjAsIDI1XVxuICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgMTAsIDMpKVxuICAgICAgWzAsIDMsIDYsIDldXG4gICAgICA+Pj4gbGlzdChyYW5nZSgwLCAtMTAsIC0xKSlcbiAgICAgIFswLCAtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgsIC05XVxuICAgICAgPj4+IGxpc3QocmFuZ2UoMCkpXG4gICAgICBbXVxuICAgICAgPj4+IGxpc3QocmFuZ2UoMSwgMCkpXG4gICAgICBbXVxuXG4gICBSYW5nZXMgaW1wbGVtZW50IGFsbCBvZiB0aGUgKmNvbW1vbiogc2VxdWVuY2Ugb3BlcmF0aW9ucyBleGNlcHRcbiAgIGNvbmNhdGVuYXRpb24gYW5kIHJlcGV0aXRpb24gKGR1ZSB0byB0aGUgZmFjdCB0aGF0IHJhbmdlIG9iamVjdHNcbiAgIGNhbiBvbmx5IHJlcHJlc2VudCBzZXF1ZW5jZXMgdGhhdCBmb2xsb3cgYSBzdHJpY3QgcGF0dGVybiBhbmRcbiAgIHJlcGV0aXRpb24gYW5kIGNvbmNhdGVuYXRpb24gd2lsbCB1c3VhbGx5IHZpb2xhdGUgdGhhdCBwYXR0ZXJuKS5cblxuICAgc3RhcnRcblxuICAgICAgVGhlIHZhbHVlIG9mIHRoZSAqc3RhcnQqIHBhcmFtZXRlciAob3IgIjAiIGlmIHRoZSBwYXJhbWV0ZXIgd2FzXG4gICAgICBub3Qgc3VwcGxpZWQpXG5cbiAgIHN0b3BcblxuICAgICAgVGhlIHZhbHVlIG9mIHRoZSAqc3RvcCogcGFyYW1ldGVyXG5cbiAgIHN0ZXBcblxuICAgICAgVGhlIHZhbHVlIG9mIHRoZSAqc3RlcCogcGFyYW1ldGVyIChvciAiMSIgaWYgdGhlIHBhcmFtZXRlciB3YXNcbiAgICAgIG5vdCBzdXBwbGllZClcblxuVGhlIGFkdmFudGFnZSBvZiB0aGUgInJhbmdlIiB0eXBlIG92ZXIgYSByZWd1bGFyICJsaXN0IiBvciAidHVwbGUiIGlzXG50aGF0IGEgInJhbmdlIiBvYmplY3Qgd2lsbCBhbHdheXMgdGFrZSB0aGUgc2FtZSAoc21hbGwpIGFtb3VudCBvZlxubWVtb3J5LCBubyBtYXR0ZXIgdGhlIHNpemUgb2YgdGhlIHJhbmdlIGl0IHJlcHJlc2VudHMgKGFzIGl0IG9ubHlcbnN0b3JlcyB0aGUgInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCIgdmFsdWVzLCBjYWxjdWxhdGluZyBpbmRpdmlkdWFsXG5pdGVtcyBhbmQgc3VicmFuZ2VzIGFzIG5lZWRlZCkuXG5cblJhbmdlIG9iamVjdHMgaW1wbGVtZW50IHRoZSAiY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIiBBQkMsIGFuZFxucHJvdmlkZSBmZWF0dXJlcyBzdWNoIGFzIGNvbnRhaW5tZW50IHRlc3RzLCBlbGVtZW50IGluZGV4IGxvb2t1cCxcbnNsaWNpbmcgYW5kIHN1cHBvcnQgZm9yIG5lZ2F0aXZlIGluZGljZXMgKHNlZSAqU2VxdWVuY2UgVHlwZXMgLS0tXG5saXN0LCB0dXBsZSwgcmFuZ2UqKTpcblxuPj4+IHIgPSByYW5nZSgwLCAyMCwgMilcbj4+PiByXG5yYW5nZSgwLCAyMCwgMilcbj4+PiAxMSBpbiByXG5GYWxzZVxuPj4+IDEwIGluIHJcblRydWVcbj4+PiByLmluZGV4KDEwKVxuNVxuPj4+IHJbNV1cbjEwXG4+Pj4gcls6NV1cbnJhbmdlKDAsIDEwLCAyKVxuPj4+IHJbLTFdXG4xOFxuXG5UZXN0aW5nIHJhbmdlIG9iamVjdHMgZm9yIGVxdWFsaXR5IHdpdGggIj09IiBhbmQgIiE9IiBjb21wYXJlcyB0aGVtIGFzXG5zZXF1ZW5jZXMuICBUaGF0IGlzLCB0d28gcmFuZ2Ugb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5XG5yZXByZXNlbnQgdGhlIHNhbWUgc2VxdWVuY2Ugb2YgdmFsdWVzLiAgKE5vdGUgdGhhdCB0d28gcmFuZ2Ugb2JqZWN0c1xudGhhdCBjb21wYXJlIGVxdWFsIG1pZ2h0IGhhdmUgZGlmZmVyZW50ICJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiXG5hdHRyaWJ1dGVzLCBmb3IgZXhhbXBsZSAicmFuZ2UoMCkgPT0gcmFuZ2UoMiwgMSwgMykiIG9yICJyYW5nZSgwLCAzLFxuMikgPT0gcmFuZ2UoMCwgNCwgMikiLilcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogSW1wbGVtZW50IHRoZSBTZXF1ZW5jZSBBQkMuIFN1cHBvcnQgc2xpY2luZ1xuYW5kIG5lZ2F0aXZlIGluZGljZXMuIFRlc3QgImludCIgb2JqZWN0cyBmb3IgbWVtYmVyc2hpcCBpbiBjb25zdGFudFxudGltZSBpbnN0ZWFkIG9mIGl0ZXJhdGluZyB0aHJvdWdoIGFsbCBpdGVtcy5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogRGVmaW5lIFwnPT1cJyBhbmQgXCchPVwnIHRvIGNvbXBhcmUgcmFuZ2Ugb2JqZWN0c1xuYmFzZWQgb24gdGhlIHNlcXVlbmNlIG9mIHZhbHVlcyB0aGV5IGRlZmluZSAoaW5zdGVhZCBvZiBjb21wYXJpbmdcbmJhc2VkIG9uIG9iamVjdCBpZGVudGl0eSkuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuMzogVGhlICJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiIGF0dHJpYnV0ZXMuXG4nLAotICd0eXBlc3NlcS1tdXRhYmxlJzogdSdcbk11dGFibGUgU2VxdWVuY2UgVHlwZXNcbioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIG9wZXJhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgZGVmaW5lZCBvbiBtdXRhYmxlIHNlcXVlbmNlXG50eXBlcy4gVGhlICJjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlIiBBQkMgaXMgcHJvdmlkZWQgdG8gbWFrZVxuaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlc2Ugb3BlcmF0aW9ucyBvbiBjdXN0b20gc2VxdWVuY2VcbnR5cGVzLlxuXG5JbiB0aGUgdGFibGUgKnMqIGlzIGFuIGluc3RhbmNlIG9mIGEgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLCAqdCogaXMgYW55XG5pdGVyYWJsZSBvYmplY3QgYW5kICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHRoYXQgbWVldHMgYW55IHR5cGUgYW5kXG52YWx1ZSByZXN0cmljdGlvbnMgaW1wb3NlZCBieSAqcyogKGZvciBleGFtcGxlLCAiYnl0ZWFycmF5IiBvbmx5XG5hY2NlcHRzIGludGVnZXJzIHRoYXQgbWVldCB0aGUgdmFsdWUgcmVzdHJpY3Rpb24gIjAgPD0geCA8PSAyNTUiKS5cblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09K1xufCAic1tpXSA9IHgiICAgICAgICAgICAgICAgICAgICAgfCBpdGVtICppKiBvZiAqcyogaXMgcmVwbGFjZWQgYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAic1tpOmpdID0gdCIgICAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJkZWwgc1tpOmpdIiAgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgInNbaTpqXSA9IFtdIiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAic1tpOmo6a10gPSB0IiAgICAgICAgICAgICAgICAgfCB0aGUgZWxlbWVudHMgb2YgInNbaTpqOmtdIiBhcmUgICB8ICgxKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRob3NlIG9mICp0KiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiZGVsIHNbaTpqOmtdIiAgICAgICAgICAgICAgICAgfCByZW1vdmVzIHRoZSBlbGVtZW50cyBvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6ajprXSIgZnJvbSB0aGUgbGlzdCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5hcHBlbmQoeCkiICAgICAgICAgICAgICAgICAgfCBhcHBlbmRzICp4KiB0byB0aGUgZW5kIG9mIHRoZSAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNlcXVlbmNlIChzYW1lIGFzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbbGVuKHMpOmxlbihzKV0gPSBbeF0iKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmNsZWFyKCkiICAgICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgYWxsIGl0ZW1zIGZyb20gInMiIChzYW1lIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgImRlbCBzWzpdIikgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmNvcHkoKSIgICAgICAgICAgICAgICAgICAgICB8IGNyZWF0ZXMgYSBzaGFsbG93IGNvcHkgb2YgInMiICAgIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHNhbWUgYXMgInNbOl0iKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmV4dGVuZCh0KSIgb3IgInMgKz0gdCIgICAgICB8IGV4dGVuZHMgKnMqIHdpdGggdGhlIGNvbnRlbnRzIG9mIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnQqIChmb3IgdGhlIG1vc3QgcGFydCB0aGUgc2FtZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAic1tsZW4ocyk6bGVuKHMpXSA9IHQiKSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMgKj0gbiIgICAgICAgICAgICAgICAgICAgICAgIHwgdXBkYXRlcyAqcyogd2l0aCBpdHMgY29udGVudHMgICAgfCAoNikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBlYXRlZCAqbiogdGltZXMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuaW5zZXJ0KGksIHgpIiAgICAgICAgICAgICAgIHwgaW5zZXJ0cyAqeCogaW50byAqcyogYXQgdGhlICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbmRleCBnaXZlbiBieSAqaSogKHNhbWUgYXMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6aV0gPSBbeF0iKSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5wb3AoW2ldKSIgICAgICAgICAgICAgICAgICAgfCByZXRyaWV2ZXMgdGhlIGl0ZW0gYXQgKmkqIGFuZCAgICB8ICgyKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFsc28gcmVtb3ZlcyBpdCBmcm9tICpzKiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5yZW1vdmUoeCkiICAgICAgICAgICAgICAgICAgfCByZW1vdmUgdGhlIGZpcnN0IGl0ZW0gZnJvbSAqcyogICB8ICgzKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdoZXJlICJzW2ldID09IHgiICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5yZXZlcnNlKCkiICAgICAgICAgICAgICAgICAgfCByZXZlcnNlcyB0aGUgaXRlbXMgb2YgKnMqIGluICAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBsYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5Ob3RlczpcblxuMS4gKnQqIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNsaWNlIGl0IGlzIHJlcGxhY2luZy5cblxuMi4gVGhlIG9wdGlvbmFsIGFyZ3VtZW50ICppKiBkZWZhdWx0cyB0byAiLTEiLCBzbyB0aGF0IGJ5IGRlZmF1bHRcbiAgIHRoZSBsYXN0IGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuXG5cbjMuICJyZW1vdmUiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi5cblxuNC4gVGhlICJyZXZlcnNlKCkiIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgZm9yXG4gICBlY29ub215IG9mIHNwYWNlIHdoZW4gcmV2ZXJzaW5nIGEgbGFyZ2Ugc2VxdWVuY2UuICBUbyByZW1pbmQgdXNlcnNcbiAgIHRoYXQgaXQgb3BlcmF0ZXMgYnkgc2lkZSBlZmZlY3QsIGl0IGRvZXMgbm90IHJldHVybiB0aGUgcmV2ZXJzZWRcbiAgIHNlcXVlbmNlLlxuXG41LiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIGFyZSBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGVcbiAgIGludGVyZmFjZXMgb2YgbXV0YWJsZSBjb250YWluZXJzIHRoYXQgZG9uXCd0IHN1cHBvcnQgc2xpY2luZ1xuICAgb3BlcmF0aW9ucyAoc3VjaCBhcyAiZGljdCIgYW5kICJzZXQiKVxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjM6ICJjbGVhcigpIiBhbmQgImNvcHkoKSIgbWV0aG9kcy5cblxuNi4gVGhlIHZhbHVlICpuKiBpcyBhbiBpbnRlZ2VyLCBvciBhbiBvYmplY3QgaW1wbGVtZW50aW5nXG4gICAiX19pbmRleF9fKCkiLiAgWmVybyBhbmQgbmVnYXRpdmUgdmFsdWVzIG9mICpuKiBjbGVhciB0aGUgc2VxdWVuY2UuXG4gICBJdGVtcyBpbiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHJlZmVyZW5jZWQgbXVsdGlwbGVcbiAgIHRpbWVzLCBhcyBleHBsYWluZWQgZm9yICJzICogbiIgdW5kZXIgKkNvbW1vbiBTZXF1ZW5jZSBPcGVyYXRpb25zKi5cbicsCi0gJ3VuYXJ5JzogdSdcblVuYXJ5IGFyaXRobWV0aWMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkFsbCB1bmFyeSBhcml0aG1ldGljIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eTpcblxuICAgdV9leHByIDo6PSBwb3dlciB8ICItIiB1X2V4cHIgfCAiKyIgdV9leHByIHwgIn4iIHVfZXhwclxuXG5UaGUgdW5hcnkgIi0iIChtaW51cykgb3BlcmF0b3IgeWllbGRzIHRoZSBuZWdhdGlvbiBvZiBpdHMgbnVtZXJpY1xuYXJndW1lbnQuXG5cblRoZSB1bmFyeSAiKyIgKHBsdXMpIG9wZXJhdG9yIHlpZWxkcyBpdHMgbnVtZXJpYyBhcmd1bWVudCB1bmNoYW5nZWQuXG5cblRoZSB1bmFyeSAifiIgKGludmVydCkgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiBpdHNcbmludGVnZXIgYXJndW1lbnQuICBUaGUgYml0d2lzZSBpbnZlcnNpb24gb2YgIngiIGlzIGRlZmluZWQgYXNcbiItKHgrMSkiLiAgSXQgb25seSBhcHBsaWVzIHRvIGludGVncmFsIG51bWJlcnMuXG5cbkluIGFsbCB0aHJlZSBjYXNlcywgaWYgdGhlIGFyZ3VtZW50IGRvZXMgbm90IGhhdmUgdGhlIHByb3BlciB0eXBlLCBhXG4iVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuJywKLSAnd2hpbGUnOiB1J1xuVGhlICJ3aGlsZSIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKipcblxuVGhlICJ3aGlsZSIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuXG5leHByZXNzaW9uIGlzIHRydWU6XG5cbiAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyB0aGVcbmZpcnN0IHN1aXRlOyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSAod2hpY2ggbWF5IGJlIHRoZSBmaXJzdCB0aW1lXG5pdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWRcbmFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLlxuXG5BICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnRcbmV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGdvZXMgYmFja1xudG8gdGVzdGluZyB0aGUgZXhwcmVzc2lvbi5cbicsCi0gJ3dpdGgnOiB1J1xuVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqXG5cblRoZSAid2l0aCIgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgd2l0aFxubWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiAqV2l0aCBTdGF0ZW1lbnRcbkNvbnRleHQgTWFuYWdlcnMqKS4gVGhpcyBhbGxvd3MgY29tbW9uICJ0cnkiLi4uImV4Y2VwdCIuLi4iZmluYWxseSJcbnVzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZCBmb3IgY29udmVuaWVudCByZXVzZS5cblxuICAgd2l0aF9zdG10IDo6PSAid2l0aCIgd2l0aF9pdGVtICgiLCIgd2l0aF9pdGVtKSogIjoiIHN1aXRlXG4gICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuXG5UaGUgZXhlY3V0aW9uIG9mIHRoZSAid2l0aCIgc3RhdGVtZW50IHdpdGggb25lICJpdGVtIiBwcm9jZWVkcyBhc1xuZm9sbG93czpcblxuMS4gVGhlIGNvbnRleHQgZXhwcmVzc2lvbiAodGhlIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlICJ3aXRoX2l0ZW0iKVxuICAgaXMgZXZhbHVhdGVkIHRvIG9idGFpbiBhIGNvbnRleHQgbWFuYWdlci5cblxuMi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgaXMgbG9hZGVkIGZvciBsYXRlciB1c2UuXG5cbjMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZW50ZXJfXygpIiBtZXRob2QgaXMgaW52b2tlZC5cblxuNC4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSAid2l0aCIgc3RhdGVtZW50LCB0aGUgcmV0dXJuXG4gICB2YWx1ZSBmcm9tICJfX2VudGVyX18oKSIgaXMgYXNzaWduZWQgdG8gaXQuXG5cbiAgIE5vdGU6IFRoZSAid2l0aCIgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgIl9fZW50ZXJfXygpIlxuICAgICBtZXRob2QgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuICJfX2V4aXRfXygpIiB3aWxsIGFsd2F5cyBiZVxuICAgICBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlXG4gICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3Igb2NjdXJyaW5nXG4gICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDYgYmVsb3cuXG5cbjUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cblxuNi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgbWV0aG9kIGlzIGludm9rZWQuICBJZiBhblxuICAgZXhjZXB0aW9uIGNhdXNlZCB0aGUgc3VpdGUgdG8gYmUgZXhpdGVkLCBpdHMgdHlwZSwgdmFsdWUsIGFuZFxuICAgdHJhY2ViYWNrIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvICJfX2V4aXRfXygpIi4gT3RoZXJ3aXNlLCB0aHJlZVxuICAgIk5vbmUiIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuIHZhbHVlXG4gICBmcm9tIHRoZSAiX19leGl0X18oKSIgbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyByZXJhaXNlZC5cbiAgIElmIHRoZSByZXR1cm4gdmFsdWUgd2FzIHRydWUsIHRoZSBleGNlcHRpb24gaXMgc3VwcHJlc3NlZCwgYW5kXG4gICBleGVjdXRpb24gY29udGludWVzIHdpdGggdGhlIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlICJ3aXRoIlxuICAgc3RhdGVtZW50LlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGV4Y2VwdGlvbiwgdGhlXG4gICByZXR1cm4gdmFsdWUgZnJvbSAiX19leGl0X18oKSIgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkc1xuICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi5cblxuV2l0aCBtb3JlIHRoYW4gb25lIGl0ZW0sIHRoZSBjb250ZXh0IG1hbmFnZXJzIGFyZSBwcm9jZXNzZWQgYXMgaWZcbm11bHRpcGxlICJ3aXRoIiBzdGF0ZW1lbnRzIHdlcmUgbmVzdGVkOlxuXG4gICB3aXRoIEEoKSBhcyBhLCBCKCkgYXMgYjpcbiAgICAgICBzdWl0ZVxuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIHdpdGggQSgpIGFzIGE6XG4gICAgICAgd2l0aCBCKCkgYXMgYjpcbiAgICAgICAgICAgc3VpdGVcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogU3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGV4dCBleHByZXNzaW9ucy5cblxuU2VlIGFsc286ICoqUEVQIDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIlxuICAgICBzdGF0ZW1lbnQuXG4nLAotICd5aWVsZCc6IHUnXG5UaGUgInlpZWxkIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG4gICB5aWVsZF9zdG10IDo6PSB5aWVsZF9leHByZXNzaW9uXG5cbkEgInlpZWxkIiBzdGF0ZW1lbnQgaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gYSAqeWllbGRcbmV4cHJlc3Npb24qLiBUaGUgeWllbGQgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIG9taXQgdGhlIHBhcmVudGhlc2VzXG50aGF0IHdvdWxkIG90aGVyd2lzZSBiZSByZXF1aXJlZCBpbiB0aGUgZXF1aXZhbGVudCB5aWVsZCBleHByZXNzaW9uXG5zdGF0ZW1lbnQuIEZvciBleGFtcGxlLCB0aGUgeWllbGQgc3RhdGVtZW50c1xuXG4gICB5aWVsZCA8ZXhwcj5cbiAgIHlpZWxkIGZyb20gPGV4cHI+XG5cbmFyZSBlcXVpdmFsZW50IHRvIHRoZSB5aWVsZCBleHByZXNzaW9uIHN0YXRlbWVudHNcblxuICAgKHlpZWxkIDxleHByPilcbiAgICh5aWVsZCBmcm9tIDxleHByPilcblxuWWllbGQgZXhwcmVzc2lvbnMgYW5kIHN0YXRlbWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGRlZmluaW5nIGFcbipnZW5lcmF0b3IqIGZ1bmN0aW9uLCBhbmQgYXJlIG9ubHkgdXNlZCBpbiB0aGUgYm9keSBvZiB0aGUgZ2VuZXJhdG9yXG5mdW5jdGlvbi4gIFVzaW5nIHlpZWxkIGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBzdWZmaWNpZW50IHRvIGNhdXNlXG50aGF0IGRlZmluaXRpb24gdG8gY3JlYXRlIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBub3JtYWxcbmZ1bmN0aW9uLlxuXG5Gb3IgZnVsbCBkZXRhaWxzIG9mICJ5aWVsZCIgc2VtYW50aWNzLCByZWZlciB0byB0aGUgKllpZWxkXG5leHByZXNzaW9ucyogc2VjdGlvbi5cbid9CisjIEF1dG9nZW5lcmF0ZWQgYnkgU3BoaW54IG9uIE1vbiBBdWcgMTUgMTY6MTE6MjAgMjAxNgordG9waWNzID0geydhc3NlcnQnOiAnXG4nCisgICAgICAgICAgICdUaGUgImFzc2VydCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0Fzc2VydCBzdGF0ZW1lbnRzIGFyZSBhIGNvbnZlbmllbnQgd2F5IHRvIGluc2VydCBkZWJ1Z2dpbmcgJworICAgICAgICAgICAnYXNzZXJ0aW9uc1xuJworICAgICAgICAgICAnaW50byBhIHByb2dyYW06XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGFzc2VydF9zdG10IDo6PSAiYXNzZXJ0IiBleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl1cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIHNpbXBsZSBmb3JtLCAiYXNzZXJ0IGV4cHJlc3Npb24iLCBpcyBlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGlmIF9fZGVidWdfXzpcbicKKyAgICAgICAgICAgJyAgICAgICBpZiBub3QgZXhwcmVzc2lvbjogcmFpc2UgQXNzZXJ0aW9uRXJyb3JcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGV4dGVuZGVkIGZvcm0sICJhc3NlcnQgZXhwcmVzc2lvbjEsIGV4cHJlc3Npb24yIiwgaXMgJworICAgICAgICAgICAnZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBpZiBfX2RlYnVnX186XG4nCisgICAgICAgICAgICcgICAgICAgaWYgbm90IGV4cHJlc3Npb24xOiByYWlzZSBBc3NlcnRpb25FcnJvcihleHByZXNzaW9uMilcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlc2UgZXF1aXZhbGVuY2VzIGFzc3VtZSB0aGF0ICJfX2RlYnVnX18iIGFuZCAiQXNzZXJ0aW9uRXJyb3IiICcKKyAgICAgICAgICAgJ3JlZmVyXG4nCisgICAgICAgICAgICd0byB0aGUgYnVpbHQtaW4gdmFyaWFibGVzIHdpdGggdGhvc2UgbmFtZXMuICBJbiB0aGUgY3VycmVudFxuJworICAgICAgICAgICAnaW1wbGVtZW50YXRpb24sIHRoZSBidWlsdC1pbiB2YXJpYWJsZSAiX19kZWJ1Z19fIiBpcyAiVHJ1ZSIgdW5kZXJcbicKKyAgICAgICAgICAgJ25vcm1hbCBjaXJjdW1zdGFuY2VzLCAiRmFsc2UiIHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZCAnCisgICAgICAgICAgICcoY29tbWFuZFxuJworICAgICAgICAgICAnbGluZSBvcHRpb24gLU8pLiAgVGhlIGN1cnJlbnQgY29kZSBnZW5lcmF0b3IgZW1pdHMgbm8gY29kZSBmb3IgYW5cbicKKyAgICAgICAgICAgJ2Fzc2VydCBzdGF0ZW1lbnQgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkIGF0IGNvbXBpbGUgdGltZS4gICcKKyAgICAgICAgICAgJ05vdGVcbicKKyAgICAgICAgICAgJ3RoYXQgaXQgaXMgdW5uZWNlc3NhcnkgdG8gaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSAnCisgICAgICAgICAgICdleHByZXNzaW9uXG4nCisgICAgICAgICAgICd0aGF0IGZhaWxlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZTsgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgcGFydCBvZiAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ3N0YWNrIHRyYWNlLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBc3NpZ25tZW50cyB0byAiX19kZWJ1Z19fIiBhcmUgaWxsZWdhbC4gIFRoZSB2YWx1ZSBmb3IgdGhlICcKKyAgICAgICAgICAgJ2J1aWx0LWluXG4nCisgICAgICAgICAgICd2YXJpYWJsZSBpcyBkZXRlcm1pbmVkIHdoZW4gdGhlIGludGVycHJldGVyIHN0YXJ0cy5cbicsCisgJ2Fzc2lnbm1lbnQnOiAnXG4nCisgICAgICAgICAgICAgICAnQXNzaWdubWVudCBzdGF0ZW1lbnRzXG4nCisgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQXNzaWdubWVudCBzdGF0ZW1lbnRzIGFyZSB1c2VkIHRvIChyZSliaW5kIG5hbWVzIHRvIHZhbHVlcyBhbmQgJworICAgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgICAnbW9kaWZ5IGF0dHJpYnV0ZXMgb3IgaXRlbXMgb2YgbXV0YWJsZSBvYmplY3RzOlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgIGFzc2lnbm1lbnRfc3RtdCA6Oj0gKHRhcmdldF9saXN0ICI9IikrIChzdGFycmVkX2V4cHJlc3Npb24gJworICAgICAgICAgICAgICAgJ3wgeWllbGRfZXhwcmVzc2lvbilcbicKKyAgICAgICAgICAgICAgICcgICB0YXJnZXRfbGlzdCAgICAgOjo9IHRhcmdldCAoIiwiIHRhcmdldCkqIFsiLCJdXG4nCisgICAgICAgICAgICAgICAnICAgdGFyZ2V0ICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICAgICAnICAgICAgICAgICAgICB8ICIoIiBbdGFyZ2V0X2xpc3RdICIpIlxuJworICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgfCAiWyIgW3RhcmdldF9saXN0XSAiXSJcbicKKyAgICAgICAgICAgICAgICcgICAgICAgICAgICAgIHwgYXR0cmlidXRlcmVmXG4nCisgICAgICAgICAgICAgICAnICAgICAgICAgICAgICB8IHN1YnNjcmlwdGlvblxuJworICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgfCBzbGljaW5nXG4nCisgICAgICAgICAgICAgICAnICAgICAgICAgICAgICB8ICIqIiB0YXJnZXRcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcoU2VlIHNlY3Rpb24gUHJpbWFyaWVzIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIGZvciAnCisgICAgICAgICAgICAgICAnKmF0dHJpYnV0ZXJlZiosXG4nCisgICAgICAgICAgICAgICAnKnN1YnNjcmlwdGlvbiosIGFuZCAqc2xpY2luZyouKVxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0FuIGFzc2lnbm1lbnQgc3RhdGVtZW50IGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBsaXN0ICcKKyAgICAgICAgICAgICAgICcocmVtZW1iZXIgdGhhdFxuJworICAgICAgICAgICAgICAgJ3RoaXMgY2FuIGJlIGEgc2luZ2xlIGV4cHJlc3Npb24gb3IgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgdGhlICcKKyAgICAgICAgICAgICAgICdsYXR0ZXJcbicKKyAgICAgICAgICAgICAgICd5aWVsZGluZyBhIHR1cGxlKSBhbmQgYXNzaWducyB0aGUgc2luZ2xlIHJlc3VsdGluZyBvYmplY3QgdG8gJworICAgICAgICAgICAgICAgJ2VhY2ggb2ZcbicKKyAgICAgICAgICAgICAgICd0aGUgdGFyZ2V0IGxpc3RzLCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQXNzaWdubWVudCBpcyBkZWZpbmVkIHJlY3Vyc2l2ZWx5IGRlcGVuZGluZyBvbiB0aGUgZm9ybSBvZiB0aGUgJworICAgICAgICAgICAgICAgJ3RhcmdldFxuJworICAgICAgICAgICAgICAgJyhsaXN0KS4gV2hlbiBhIHRhcmdldCBpcyBwYXJ0IG9mIGEgbXV0YWJsZSBvYmplY3QgKGFuICcKKyAgICAgICAgICAgICAgICdhdHRyaWJ1dGVcbicKKyAgICAgICAgICAgICAgICdyZWZlcmVuY2UsIHN1YnNjcmlwdGlvbiBvciBzbGljaW5nKSwgdGhlIG11dGFibGUgb2JqZWN0IG11c3RcbicKKyAgICAgICAgICAgICAgICd1bHRpbWF0ZWx5IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQgYW5kIGRlY2lkZSBhYm91dCBpdHMgJworICAgICAgICAgICAgICAgJ3ZhbGlkaXR5LCBhbmRcbicKKyAgICAgICAgICAgICAgICdtYXkgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBhc3NpZ25tZW50IGlzIHVuYWNjZXB0YWJsZS4gIFRoZSAnCisgICAgICAgICAgICAgICAncnVsZXNcbicKKyAgICAgICAgICAgICAgICdvYnNlcnZlZCBieSB2YXJpb3VzIHR5cGVzIGFuZCB0aGUgZXhjZXB0aW9ucyByYWlzZWQgYXJlIGdpdmVuICcKKyAgICAgICAgICAgICAgICd3aXRoIHRoZVxuJworICAgICAgICAgICAgICAgJ2RlZmluaXRpb24gb2YgdGhlIG9iamVjdCB0eXBlcyAoc2VlIHNlY3Rpb24gVGhlIHN0YW5kYXJkIHR5cGVcbicKKyAgICAgICAgICAgICAgICdoaWVyYXJjaHkpLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0Fzc2lnbm1lbnQgb2YgYW4gb2JqZWN0IHRvIGEgdGFyZ2V0IGxpc3QsIG9wdGlvbmFsbHkgZW5jbG9zZWQgJworICAgICAgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgICAgICAncGFyZW50aGVzZXMgb3Igc3F1YXJlIGJyYWNrZXRzLCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzICcKKyAgICAgICAgICAgICAgICdmb2xsb3dzLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGVtcHR5OiBUaGUgb2JqZWN0IG11c3QgYWxzbyBiZSBhbiAnCisgICAgICAgICAgICAgICAnZW1wdHlcbicKKyAgICAgICAgICAgICAgICcgIGl0ZXJhYmxlLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgc2luZ2xlIHRhcmdldCBpbiBwYXJlbnRoZXNlczogVGhlICcKKyAgICAgICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAgICAgICcgIGlzIGFzc2lnbmVkIHRvIHRoYXQgdGFyZ2V0LlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFyZ2V0cywgb3IgJworICAgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAgICcgIHNpbmdsZSB0YXJnZXQgaW4gc3F1YXJlIGJyYWNrZXRzOiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gJworICAgICAgICAgICAgICAgJ2l0ZXJhYmxlXG4nCisgICAgICAgICAgICAgICAnICB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgJworICAgICAgICAgICAgICAgJ3RhcmdldFxuJworICAgICAgICAgICAgICAgJyAgbGlzdCwgYW5kIHRoZSBpdGVtcyBhcmUgYXNzaWduZWQsIGZyb20gbGVmdCB0byByaWdodCwgdG8gJworICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgJyAgY29ycmVzcG9uZGluZyB0YXJnZXRzLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgKiBJZiB0aGUgdGFyZ2V0IGxpc3QgY29udGFpbnMgb25lIHRhcmdldCBwcmVmaXhlZCB3aXRoIGFuXG4nCisgICAgICAgICAgICAgICAnICAgIGFzdGVyaXNrLCBjYWxsZWQgYSAic3RhcnJlZCIgdGFyZ2V0OiBUaGUgb2JqZWN0IG11c3QgYmUgJworICAgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgICAnICAgIGl0ZXJhYmxlIHdpdGggYXQgbGVhc3QgYXMgbWFueSBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyAnCisgICAgICAgICAgICAgICAnaW4gdGhlXG4nCisgICAgICAgICAgICAgICAnICAgIHRhcmdldCBsaXN0LCBtaW51cyBvbmUuICBUaGUgZmlyc3QgaXRlbXMgb2YgdGhlIGl0ZXJhYmxlICcKKyAgICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAgICcgICAgYXNzaWduZWQsIGZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlIHRhcmdldHMgYmVmb3JlIHRoZSAnCisgICAgICAgICAgICAgICAnc3RhcnJlZFxuJworICAgICAgICAgICAgICAgJyAgICB0YXJnZXQuICBUaGUgZmluYWwgaXRlbXMgb2YgdGhlIGl0ZXJhYmxlIGFyZSBhc3NpZ25lZCB0byAnCisgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAnICAgIHRhcmdldHMgYWZ0ZXIgdGhlIHN0YXJyZWQgdGFyZ2V0LiAgQSBsaXN0IG9mIHRoZSByZW1haW5pbmcgJworICAgICAgICAgICAgICAgJ2l0ZW1zXG4nCisgICAgICAgICAgICAgICAnICAgIGluIHRoZSBpdGVyYWJsZSBpcyB0aGVuIGFzc2lnbmVkIHRvIHRoZSBzdGFycmVkIHRhcmdldCAnCisgICAgICAgICAgICAgICAnKHRoZSBsaXN0XG4nCisgICAgICAgICAgICAgICAnICAgIGNhbiBiZSBlbXB0eSkuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAqIEVsc2U6IFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzYW1lIG51bWJlciAnCisgICAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAgICcgICAgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICdpdGVtcyBhcmVcbicKKyAgICAgICAgICAgICAgICcgICAgYXNzaWduZWQsIGZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgJworICAgICAgICAgICAgICAgJ3RhcmdldHMuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSBzaW5nbGUgdGFyZ2V0IGlzIHJlY3Vyc2l2ZWx5ICcKKyAgICAgICAgICAgICAgICdkZWZpbmVkIGFzXG4nCisgICAgICAgICAgICAgICAnZm9sbG93cy5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcqIElmIHRoZSB0YXJnZXQgaXMgYW4gaWRlbnRpZmllciAobmFtZSk6XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAqIElmIHRoZSBuYW1lIGRvZXMgbm90IG9jY3VyIGluIGEgImdsb2JhbCIgb3IgIm5vbmxvY2FsIiAnCisgICAgICAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgICAnICAgIGluIHRoZSBjdXJyZW50IGNvZGUgYmxvY2s6IHRoZSBuYW1lIGlzIGJvdW5kIHRvIHRoZSBvYmplY3QgJworICAgICAgICAgICAgICAgJ2luIHRoZVxuJworICAgICAgICAgICAgICAgJyAgICBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICogT3RoZXJ3aXNlOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBnbG9iYWxcbicKKyAgICAgICAgICAgICAgICcgICAgbmFtZXNwYWNlIG9yIHRoZSBvdXRlciBuYW1lc3BhY2UgZGV0ZXJtaW5lZCBieSAnCisgICAgICAgICAgICAgICAnIm5vbmxvY2FsIixcbicKKyAgICAgICAgICAgICAgICcgICAgcmVzcGVjdGl2ZWx5LlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgVGhlIG5hbWUgaXMgcmVib3VuZCBpZiBpdCB3YXMgYWxyZWFkeSBib3VuZC4gIFRoaXMgbWF5IGNhdXNlICcKKyAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICcgIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIG9iamVjdCBwcmV2aW91c2x5IGJvdW5kIHRvIHRoZSBuYW1lICcKKyAgICAgICAgICAgICAgICd0byByZWFjaFxuJworICAgICAgICAgICAgICAgJyAgemVybywgY2F1c2luZyB0aGUgb2JqZWN0IHRvIGJlIGRlYWxsb2NhdGVkIGFuZCBpdHMgJworICAgICAgICAgICAgICAgJ2Rlc3RydWN0b3IgKGlmIGl0XG4nCisgICAgICAgICAgICAgICAnICBoYXMgb25lKSB0byBiZSBjYWxsZWQuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKiBJZiB0aGUgdGFyZ2V0IGlzIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2U6IFRoZSBwcmltYXJ5ICcKKyAgICAgICAgICAgICAgICdleHByZXNzaW9uIGluXG4nCisgICAgICAgICAgICAgICAnICB0aGUgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBhbiBvYmplY3Qgd2l0aFxuJworICAgICAgICAgICAgICAgJyAgYXNzaWduYWJsZSBhdHRyaWJ1dGVzOyBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgIlR5cGVFcnJvciIgJworICAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICAnICByYWlzZWQuICBUaGF0IG9iamVjdCBpcyB0aGVuIGFza2VkIHRvIGFzc2lnbiB0aGUgYXNzaWduZWQgJworICAgICAgICAgICAgICAgJ29iamVjdCB0b1xuJworICAgICAgICAgICAgICAgJyAgdGhlIGdpdmVuIGF0dHJpYnV0ZTsgaWYgaXQgY2Fubm90IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQsIGl0ICcKKyAgICAgICAgICAgICAgICdyYWlzZXNcbicKKyAgICAgICAgICAgICAgICcgIGFuIGV4Y2VwdGlvbiAodXN1YWxseSBidXQgbm90IG5lY2Vzc2FyaWx5ICcKKyAgICAgICAgICAgICAgICciQXR0cmlidXRlRXJyb3IiKS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgIE5vdGU6IElmIHRoZSBvYmplY3QgaXMgYSBjbGFzcyBpbnN0YW5jZSBhbmQgdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICAncmVmZXJlbmNlXG4nCisgICAgICAgICAgICAgICAnICBvY2N1cnMgb24gYm90aCBzaWRlcyBvZiB0aGUgYXNzaWdubWVudCBvcGVyYXRvciwgdGhlIFJIUyAnCisgICAgICAgICAgICAgICAnZXhwcmVzc2lvbixcbicKKyAgICAgICAgICAgICAgICcgICJhLngiIGNhbiBhY2Nlc3MgZWl0aGVyIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBvciAoaWYgbm8gJworICAgICAgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgICAgICAnICBhdHRyaWJ1dGUgZXhpc3RzKSBhIGNsYXNzIGF0dHJpYnV0ZS4gIFRoZSBMSFMgdGFyZ2V0ICJhLngiICcKKyAgICAgICAgICAgICAgICdpcyBhbHdheXNcbicKKyAgICAgICAgICAgICAgICcgIHNldCBhcyBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4gICcKKyAgICAgICAgICAgICAgICdUaHVzLCB0aGVcbicKKyAgICAgICAgICAgICAgICcgIHR3byBvY2N1cnJlbmNlcyBvZiAiYS54IiBkbyBub3QgbmVjZXNzYXJpbHkgcmVmZXIgdG8gdGhlICcKKyAgICAgICAgICAgICAgICdzYW1lXG4nCisgICAgICAgICAgICAgICAnICBhdHRyaWJ1dGU6IGlmIHRoZSBSSFMgZXhwcmVzc2lvbiByZWZlcnMgdG8gYSBjbGFzcyAnCisgICAgICAgICAgICAgICAnYXR0cmlidXRlLCB0aGVcbicKKyAgICAgICAgICAgICAgICcgIExIUyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIGF0dHJpYnV0ZSBhcyB0aGUgdGFyZ2V0IG9mIHRoZVxuJworICAgICAgICAgICAgICAgJyAgYXNzaWdubWVudDpcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICAgIGNsYXNzIENsczpcbicKKyAgICAgICAgICAgICAgICcgICAgICAgICB4ID0gMyAgICAgICAgICAgICAjIGNsYXNzIHZhcmlhYmxlXG4nCisgICAgICAgICAgICAgICAnICAgICBpbnN0ID0gQ2xzKClcbicKKyAgICAgICAgICAgICAgICcgICAgIGluc3QueCA9IGluc3QueCArIDEgICAjIHdyaXRlcyBpbnN0LnggYXMgNCBsZWF2aW5nIENscy54ICcKKyAgICAgICAgICAgICAgICdhcyAzXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICBUaGlzIGRlc2NyaXB0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGFwcGx5IHRvIGRlc2NyaXB0b3JcbicKKyAgICAgICAgICAgICAgICcgIGF0dHJpYnV0ZXMsIHN1Y2ggYXMgcHJvcGVydGllcyBjcmVhdGVkIHdpdGggInByb3BlcnR5KCkiLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyogSWYgdGhlIHRhcmdldCBpcyBhIHN1YnNjcmlwdGlvbjogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiAnCisgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAnICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGVpdGhlciBhIG11dGFibGUgJworICAgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgICAnICBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSBvciBhIG1hcHBpbmcgb2JqZWN0IChzdWNoIGFzIGEgJworICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkpLlxuJworICAgICAgICAgICAgICAgJyAgTmV4dCwgdGhlIHN1YnNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgIElmIHRoZSBwcmltYXJ5IGlzIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYSAnCisgICAgICAgICAgICAgICAnbGlzdCksIHRoZVxuJworICAgICAgICAgICAgICAgJyAgc3Vic2NyaXB0IG11c3QgeWllbGQgYW4gaW50ZWdlci4gIElmIGl0IGlzIG5lZ2F0aXZlLCB0aGUgJworICAgICAgICAgICAgICAgInNlcXVlbmNlJ3NcbiIKKyAgICAgICAgICAgICAgICcgIGxlbmd0aCBpcyBhZGRlZCB0byBpdC4gIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhICcKKyAgICAgICAgICAgICAgICdub25uZWdhdGl2ZVxuJworICAgICAgICAgICAgICAgIiAgaW50ZWdlciBsZXNzIHRoYW4gdGhlIHNlcXVlbmNlJ3MgbGVuZ3RoLCBhbmQgdGhlIHNlcXVlbmNlIGlzICIKKyAgICAgICAgICAgICAgICdhc2tlZFxuJworICAgICAgICAgICAgICAgJyAgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG8gaXRzIGl0ZW0gd2l0aCB0aGF0IGluZGV4LiAgJworICAgICAgICAgICAgICAgJ0lmIHRoZVxuJworICAgICAgICAgICAgICAgJyAgaW5kZXggaXMgb3V0IG9mIHJhbmdlLCAiSW5kZXhFcnJvciIgaXMgcmFpc2VkIChhc3NpZ25tZW50IHRvICcKKyAgICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgICAnICBzdWJzY3JpcHRlZCBzZXF1ZW5jZSBjYW5ub3QgYWRkIG5ldyBpdGVtcyB0byBhIGxpc3QpLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLCAnCisgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAiICBzdWJzY3JpcHQgbXVzdCBoYXZlIGEgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIG1hcHBpbmcncyBrZXkgIgorICAgICAgICAgICAgICAgJ3R5cGUsXG4nCisgICAgICAgICAgICAgICAnICBhbmQgdGhlIG1hcHBpbmcgaXMgdGhlbiBhc2tlZCB0byBjcmVhdGUgYSBrZXkvZGF0dW0gcGFpciAnCisgICAgICAgICAgICAgICAnd2hpY2ggbWFwc1xuJworICAgICAgICAgICAgICAgJyAgdGhlIHN1YnNjcmlwdCB0byB0aGUgYXNzaWduZWQgb2JqZWN0LiAgVGhpcyBjYW4gZWl0aGVyICcKKyAgICAgICAgICAgICAgICdyZXBsYWNlIGFuXG4nCisgICAgICAgICAgICAgICAnICBleGlzdGluZyBrZXkvdmFsdWUgcGFpciB3aXRoIHRoZSBzYW1lIGtleSB2YWx1ZSwgb3IgaW5zZXJ0IGEgJworICAgICAgICAgICAgICAgJ25ld1xuJworICAgICAgICAgICAgICAgJyAga2V5L3ZhbHVlIHBhaXIgKGlmIG5vIGtleSB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0ZWQpLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgRm9yIHVzZXItZGVmaW5lZCBvYmplY3RzLCB0aGUgIl9fc2V0aXRlbV9fKCkiIG1ldGhvZCBpcyAnCisgICAgICAgICAgICAgICAnY2FsbGVkIHdpdGhcbicKKyAgICAgICAgICAgICAgICcgIGFwcHJvcHJpYXRlIGFyZ3VtZW50cy5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcqIElmIHRoZSB0YXJnZXQgaXMgYSBzbGljaW5nOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuJworICAgICAgICAgICAgICAgJyAgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBhIG11dGFibGUgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICAgJyAgKHN1Y2ggYXMgYSBsaXN0KS4gIFRoZSBhc3NpZ25lZCBvYmplY3Qgc2hvdWxkIGJlIGEgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICAgJyAgb2YgdGhlIHNhbWUgdHlwZS4gIE5leHQsIHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmQgJworICAgICAgICAgICAgICAgJ2V4cHJlc3Npb25zIGFyZVxuJworICAgICAgICAgICAgICAgJyAgZXZhbHVhdGVkLCBpbnNvZmFyIHRoZXkgYXJlIHByZXNlbnQ7IGRlZmF1bHRzIGFyZSB6ZXJvIGFuZCAnCisgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAiICBzZXF1ZW5jZSdzIGxlbmd0aC4gIFRoZSBib3VuZHMgc2hvdWxkIGV2YWx1YXRlIHRvIGludGVnZXJzLiAiCisgICAgICAgICAgICAgICAnSWZcbicKKyAgICAgICAgICAgICAgICIgIGVpdGhlciBib3VuZCBpcyBuZWdhdGl2ZSwgdGhlIHNlcXVlbmNlJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvICIKKyAgICAgICAgICAgICAgICdpdC4gIFRoZVxuJworICAgICAgICAgICAgICAgJyAgcmVzdWx0aW5nIGJvdW5kcyBhcmUgY2xpcHBlZCB0byBsaWUgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgJworICAgICAgICAgICAgICAgInNlcXVlbmNlJ3NcbiIKKyAgICAgICAgICAgICAgICcgIGxlbmd0aCwgaW5jbHVzaXZlLiAgRmluYWxseSwgdGhlIHNlcXVlbmNlIG9iamVjdCBpcyBhc2tlZCB0byAnCisgICAgICAgICAgICAgICAncmVwbGFjZVxuJworICAgICAgICAgICAgICAgJyAgdGhlIHNsaWNlIHdpdGggdGhlIGl0ZW1zIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZS4gIFRoZSAnCisgICAgICAgICAgICAgICAnbGVuZ3RoIG9mXG4nCisgICAgICAgICAgICAgICAnICB0aGUgc2xpY2UgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBsZW5ndGggb2YgdGhlIGFzc2lnbmVkICcKKyAgICAgICAgICAgICAgICdzZXF1ZW5jZSxcbicKKyAgICAgICAgICAgICAgICcgIHRodXMgY2hhbmdpbmcgdGhlIGxlbmd0aCBvZiB0aGUgdGFyZ2V0IHNlcXVlbmNlLCBpZiB0aGUgJworICAgICAgICAgICAgICAgJ3RhcmdldFxuJworICAgICAgICAgICAgICAgJyAgc2VxdWVuY2UgYWxsb3dzIGl0LlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogSW4gdGhlIGN1cnJlbnQgJworICAgICAgICAgICAgICAgJ2ltcGxlbWVudGF0aW9uLCB0aGVcbicKKyAgICAgICAgICAgICAgICdzeW50YXggZm9yIHRhcmdldHMgaXMgdGFrZW4gdG8gYmUgdGhlIHNhbWUgYXMgZm9yIGV4cHJlc3Npb25zLCAnCisgICAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgICAnaW52YWxpZCBzeW50YXggaXMgcmVqZWN0ZWQgZHVyaW5nIHRoZSBjb2RlIGdlbmVyYXRpb24gcGhhc2UsICcKKyAgICAgICAgICAgICAgICdjYXVzaW5nXG4nCisgICAgICAgICAgICAgICAnbGVzcyBkZXRhaWxlZCBlcnJvciBtZXNzYWdlcy5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBbHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZiBhc3NpZ25tZW50IGltcGxpZXMgdGhhdCBvdmVybGFwcyAnCisgICAgICAgICAgICAgICAnYmV0d2VlblxuJworICAgICAgICAgICAgICAgInRoZSBsZWZ0LWhhbmQgc2lkZSBhbmQgdGhlIHJpZ2h0LWhhbmQgc2lkZSBhcmUgJ3NpbXVsdGFuZW91cycgIgorICAgICAgICAgICAgICAgJyhmb3JcbicKKyAgICAgICAgICAgICAgICdleGFtcGxlICJhLCBiID0gYiwgYSIgc3dhcHMgdHdvIHZhcmlhYmxlcyksIG92ZXJsYXBzICp3aXRoaW4qICcKKyAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICdjb2xsZWN0aW9uIG9mIGFzc2lnbmVkLXRvIHZhcmlhYmxlcyBvY2N1ciBsZWZ0LXRvLXJpZ2h0LCAnCisgICAgICAgICAgICAgICAnc29tZXRpbWVzXG4nCisgICAgICAgICAgICAgICAncmVzdWx0aW5nIGluIGNvbmZ1c2lvbi4gIEZvciBpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBwcm9ncmFtICcKKyAgICAgICAgICAgICAgICdwcmludHNcbicKKyAgICAgICAgICAgICAgICciWzAsIDJdIjpcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICB4ID0gWzAsIDFdXG4nCisgICAgICAgICAgICAgICAnICAgaSA9IDBcbicKKyAgICAgICAgICAgICAgICcgICBpLCB4W2ldID0gMSwgMiAgICAgICAgICMgaSBpcyB1cGRhdGVkLCB0aGVuIHhbaV0gaXMgJworICAgICAgICAgICAgICAgJ3VwZGF0ZWRcbicKKyAgICAgICAgICAgICAgICcgICBwcmludCh4KVxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgKipQRVAgMzEzMioqIC0gRXh0ZW5kZWQgSXRlcmFibGUgVW5wYWNraW5nXG4nCisgICAgICAgICAgICAgICAnICAgICBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlICIqdGFyZ2V0IiBmZWF0dXJlLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0F1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHNcbicKKyAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSAnCisgICAgICAgICAgICAgICAnc3RhdGVtZW50LCBvZiBhXG4nCisgICAgICAgICAgICAgICAnYmluYXJ5IG9wZXJhdGlvbiBhbmQgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQ6XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0IGF1Z29wICcKKyAgICAgICAgICAgICAgICcoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbilcbicKKyAgICAgICAgICAgICAgICcgICBhdWd0YXJnZXQgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIHwgYXR0cmlidXRlcmVmIHwgJworICAgICAgICAgICAgICAgJ3N1YnNjcmlwdGlvbiB8IHNsaWNpbmdcbicKKyAgICAgICAgICAgICAgICcgICBhdWdvcCAgICAgICAgICAgICAgICAgICAgIDo6PSAiKz0iIHwgIi09IiB8ICIqPSIgfCAiQD0iIHwgJworICAgICAgICAgICAgICAgJyIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuJworICAgICAgICAgICAgICAgJyAgICAgICAgICAgICB8ICI+Pj0iIHwgIjw8PSIgfCAiJj0iIHwgIl49IiB8ICJ8PSJcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcoU2VlIHNlY3Rpb24gUHJpbWFyaWVzIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIG9mIHRoZSBsYXN0ICcKKyAgICAgICAgICAgICAgICd0aHJlZVxuJworICAgICAgICAgICAgICAgJ3N5bWJvbHMuKVxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0FuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV2YWx1YXRlcyB0aGUgdGFyZ2V0ICh3aGljaCwgdW5saWtlICcKKyAgICAgICAgICAgICAgICdub3JtYWxcbicKKyAgICAgICAgICAgICAgICdhc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgJworICAgICAgICAgICAgICAgJ2V4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAgICdsaXN0LCBwZXJmb3JtcyB0aGUgYmluYXJ5IG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiAnCisgICAgICAgICAgICAgICAnYXNzaWdubWVudFxuJworICAgICAgICAgICAgICAgJ29uIHRoZSB0d28gb3BlcmFuZHMsIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gdGhlIG9yaWdpbmFsICcKKyAgICAgICAgICAgICAgICd0YXJnZXQuXG4nCisgICAgICAgICAgICAgICAnVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0FuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV4cHJlc3Npb24gbGlrZSAieCArPSAxIiBjYW4gYmUgJworICAgICAgICAgICAgICAgJ3Jld3JpdHRlbiBhc1xuJworICAgICAgICAgICAgICAgJyJ4ID0geCArIDEiIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgJworICAgICAgICAgICAgICAgJ2VmZmVjdC4gSW4gdGhlXG4nCisgICAgICAgICAgICAgICAnYXVnbWVudGVkIHZlcnNpb24sICJ4IiBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuICcKKyAgICAgICAgICAgICAgICdwb3NzaWJsZSxcbicKKyAgICAgICAgICAgICAgICd0aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgKmluLXBsYWNlKiwgbWVhbmluZyB0aGF0ICcKKyAgICAgICAgICAgICAgICdyYXRoZXIgdGhhblxuJworICAgICAgICAgICAgICAgJ2NyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgYXNzaWduaW5nIHRoYXQgdG8gdGhlIHRhcmdldCwgdGhlICcKKyAgICAgICAgICAgICAgICdvbGQgb2JqZWN0XG4nCisgICAgICAgICAgICAgICAnaXMgbW9kaWZpZWQgaW5zdGVhZC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdVbmxpa2Ugbm9ybWFsIGFzc2lnbm1lbnRzLCBhdWdtZW50ZWQgYXNzaWdubWVudHMgZXZhbHVhdGUgdGhlICcKKyAgICAgICAgICAgICAgICdsZWZ0LVxuJworICAgICAgICAgICAgICAgJ2hhbmQgc2lkZSAqYmVmb3JlKiBldmFsdWF0aW5nIHRoZSByaWdodC1oYW5kIHNpZGUuICBGb3IgJworICAgICAgICAgICAgICAgJ2V4YW1wbGUsICJhW2ldXG4nCisgICAgICAgICAgICAgICAnKz0gZih4KSIgZmlyc3QgbG9va3MtdXAgImFbaV0iLCB0aGVuIGl0IGV2YWx1YXRlcyAiZih4KSIgYW5kICcKKyAgICAgICAgICAgICAgICdwZXJmb3Jtc1xuJworICAgICAgICAgICAgICAgJ3RoZSBhZGRpdGlvbiwgYW5kIGxhc3RseSwgaXQgd3JpdGVzIHRoZSByZXN1bHQgYmFjayB0byAnCisgICAgICAgICAgICAgICAnImFbaV0iLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1dpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzICcKKyAgICAgICAgICAgICAgICdpbiBhXG4nCisgICAgICAgICAgICAgICAnc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudFxuJworICAgICAgICAgICAgICAgJ3N0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiAnCisgICAgICAgICAgICAgICAnU2ltaWxhcmx5LFxuJworICAgICAgICAgICAgICAgJ3dpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlICcKKyAgICAgICAgICAgICAgICdiaW5hcnlcbicKKyAgICAgICAgICAgICAgICdvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBzYW1lIGFzIHRoZSAnCisgICAgICAgICAgICAgICAnbm9ybWFsXG4nCisgICAgICAgICAgICAgICAnYmluYXJ5IG9wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSBjYXZlYXQgJworICAgICAgICAgICAgICAgJ2Fib3V0XG4nCisgICAgICAgICAgICAgICAnY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMgYXBwbGllcyBhcyBmb3IgcmVndWxhciAnCisgICAgICAgICAgICAgICAnYXNzaWdubWVudHMuXG4nLAorICdhdG9tLWlkZW50aWZpZXJzJzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0lkZW50aWZpZXJzIChOYW1lcylcbicKKyAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnQW4gaWRlbnRpZmllciBvY2N1cnJpbmcgYXMgYW4gYXRvbSBpcyBhIG5hbWUuICBTZWUgJworICAgICAgICAgICAgICAgICAgICAgJ3NlY3Rpb24gSWRlbnRpZmllcnNcbicKKyAgICAgICAgICAgICAgICAgICAgICdhbmQga2V5d29yZHMgZm9yIGxleGljYWwgZGVmaW5pdGlvbiBhbmQgc2VjdGlvbiBOYW1pbmcgJworICAgICAgICAgICAgICAgICAgICAgJ2FuZCBiaW5kaW5nIGZvclxuJworICAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24gb2YgbmFtaW5nIGFuZCBiaW5kaW5nLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1doZW4gdGhlIG5hbWUgaXMgYm91bmQgdG8gYW4gb2JqZWN0LCBldmFsdWF0aW9uIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXRvbSB5aWVsZHNcbicKKyAgICAgICAgICAgICAgICAgICAgICd0aGF0IG9iamVjdC4gV2hlbiBhIG5hbWUgaXMgbm90IGJvdW5kLCBhbiBhdHRlbXB0IHRvICcKKyAgICAgICAgICAgICAgICAgICAgICdldmFsdWF0ZSBpdFxuJworICAgICAgICAgICAgICAgICAgICAgJ3JhaXNlcyBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqKlByaXZhdGUgbmFtZSBtYW5nbGluZzoqKiBXaGVuIGFuIGlkZW50aWZpZXIgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgICAndGV4dHVhbGx5IG9jY3VycyBpblxuJworICAgICAgICAgICAgICAgICAgICAgJ2EgY2xhc3MgZGVmaW5pdGlvbiBiZWdpbnMgd2l0aCB0d28gb3IgbW9yZSB1bmRlcnNjb3JlICcKKyAgICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzIGFuZFxuJworICAgICAgICAgICAgICAgICAgICAgJ2RvZXMgbm90IGVuZCBpbiB0d28gb3IgbW9yZSB1bmRlcnNjb3JlcywgaXQgaXMgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnNpZGVyZWQgYSAqcHJpdmF0ZVxuJworICAgICAgICAgICAgICAgICAgICAgJ25hbWUqIG9mIHRoYXQgY2xhc3MuIFByaXZhdGUgbmFtZXMgYXJlIHRyYW5zZm9ybWVkIHRvIGEgJworICAgICAgICAgICAgICAgICAgICAgJ2xvbmdlciBmb3JtXG4nCisgICAgICAgICAgICAgICAgICAgICAnYmVmb3JlIGNvZGUgaXMgZ2VuZXJhdGVkIGZvciB0aGVtLiAgVGhlIHRyYW5zZm9ybWF0aW9uICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnNlcnRzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzIG5hbWUsIHdpdGggbGVhZGluZyB1bmRlcnNjb3JlcyByZW1vdmVkIGFuZCBhICcKKyAgICAgICAgICAgICAgICAgICAgICdzaW5nbGUgdW5kZXJzY29yZVxuJworICAgICAgICAgICAgICAgICAgICAgJ2luc2VydGVkLCBpbiBmcm9udCBvZiB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2lkZW50aWZpZXIgIl9fc3BhbSJcbicKKyAgICAgICAgICAgICAgICAgICAgICdvY2N1cnJpbmcgaW4gYSBjbGFzcyBuYW1lZCAiSGFtIiB3aWxsIGJlIHRyYW5zZm9ybWVkIHRvICcKKyAgICAgICAgICAgICAgICAgICAgICciX0hhbV9fc3BhbSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc3ludGFjdGljYWwgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRleHQgaW4gd2hpY2hcbicKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgaWRlbnRpZmllciBpcyB1c2VkLiAgSWYgdGhlIHRyYW5zZm9ybWVkIG5hbWUgaXMgJworICAgICAgICAgICAgICAgICAgICAgJ2V4dHJlbWVseSBsb25nXG4nCisgICAgICAgICAgICAgICAgICAgICAnKGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzKSwgaW1wbGVtZW50YXRpb24gZGVmaW5lZCAnCisgICAgICAgICAgICAgICAgICAgICAndHJ1bmNhdGlvbiBtYXlcbicKKyAgICAgICAgICAgICAgICAgICAgICdoYXBwZW4uIElmIHRoZSBjbGFzcyBuYW1lIGNvbnNpc3RzIG9ubHkgb2YgdW5kZXJzY29yZXMsICcKKyAgICAgICAgICAgICAgICAgICAgICdub1xuJworICAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybWF0aW9uIGlzIGRvbmUuXG4nLAorICdhdG9tLWxpdGVyYWxzJzogJ1xuJworICAgICAgICAgICAgICAgICAgJ0xpdGVyYWxzXG4nCisgICAgICAgICAgICAgICAgICAnKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdQeXRob24gc3VwcG9ydHMgc3RyaW5nIGFuZCBieXRlcyBsaXRlcmFscyBhbmQgdmFyaW91cyAnCisgICAgICAgICAgICAgICAgICAnbnVtZXJpY1xuJworICAgICAgICAgICAgICAgICAgJ2xpdGVyYWxzOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIGxpdGVyYWwgOjo9IHN0cmluZ2xpdGVyYWwgfCBieXRlc2xpdGVyYWxcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICB8IGludGVnZXIgfCBmbG9hdG51bWJlciB8IGltYWdudW1iZXJcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdFdmFsdWF0aW9uIG9mIGEgbGl0ZXJhbCB5aWVsZHMgYW4gb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlICcKKyAgICAgICAgICAgICAgICAgICcoc3RyaW5nLFxuJworICAgICAgICAgICAgICAgICAgJ2J5dGVzLCBpbnRlZ2VyLCBmbG9hdGluZyBwb2ludCBudW1iZXIsIGNvbXBsZXggbnVtYmVyKSB3aXRoICcKKyAgICAgICAgICAgICAgICAgICd0aGUgZ2l2ZW5cbicKKyAgICAgICAgICAgICAgICAgICd2YWx1ZS4gIFRoZSB2YWx1ZSBtYXkgYmUgYXBwcm94aW1hdGVkIGluIHRoZSBjYXNlIG9mICcKKyAgICAgICAgICAgICAgICAgICdmbG9hdGluZyBwb2ludFxuJworICAgICAgICAgICAgICAgICAgJ2FuZCBpbWFnaW5hcnkgKGNvbXBsZXgpIGxpdGVyYWxzLiAgU2VlIHNlY3Rpb24gTGl0ZXJhbHMgZm9yICcKKyAgICAgICAgICAgICAgICAgICdkZXRhaWxzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0FsbCBsaXRlcmFscyBjb3JyZXNwb25kIHRvIGltbXV0YWJsZSBkYXRhIHR5cGVzLCBhbmQgaGVuY2UgJworICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgIm9iamVjdCdzIGlkZW50aXR5IGlzIGxlc3MgaW1wb3J0YW50IHRoYW4gaXRzIHZhbHVlLiAgIgorICAgICAgICAgICAgICAgICAgJ011bHRpcGxlXG4nCisgICAgICAgICAgICAgICAgICAnZXZhbHVhdGlvbnMgb2YgbGl0ZXJhbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZWl0aGVyIHRoZSAnCisgICAgICAgICAgICAgICAgICAnc2FtZVxuJworICAgICAgICAgICAgICAgICAgJ29jY3VycmVuY2UgaW4gdGhlIHByb2dyYW0gdGV4dCBvciBhIGRpZmZlcmVudCBvY2N1cnJlbmNlKSAnCisgICAgICAgICAgICAgICAgICAnbWF5IG9idGFpblxuJworICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIG9iamVjdCBvciBhIGRpZmZlcmVudCBvYmplY3Qgd2l0aCB0aGUgc2FtZSAnCisgICAgICAgICAgICAgICAgICAndmFsdWUuXG4nLAorICdhdHRyaWJ1dGUtYWNjZXNzJzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3NcbicKKyAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ21lYW5pbmcgb2ZcbicKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgYWNjZXNzICh1c2Ugb2YsIGFzc2lnbm1lbnQgdG8sIG9yIGRlbGV0aW9uIG9mICcKKyAgICAgICAgICAgICAgICAgICAgICcieC5uYW1lIikgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnY2xhc3MgaW5zdGFuY2VzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dldGF0dHJfXyhzZWxmLCBuYW1lKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBsb29rdXAgaGFzIG5vdCBmb3VuZCB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB1c3VhbCBwbGFjZXMgKGkuZS4gaXQgaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICAgICAgICAnbm9yIGlzIGl0IGZvdW5kXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW4gdGhlIGNsYXNzIHRyZWUgZm9yICJzZWxmIikuICAibmFtZSIgaXMgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgbmFtZS4gVGhpc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSAnCisgICAgICAgICAgICAgICAgICAgICAnb3IgcmFpc2UgYW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aHJvdWdoIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnbm9ybWFsIG1lY2hhbmlzbSxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAiX19nZXRhdHRyX18oKSIgaXMgbm90IGNhbGxlZC4gIChUaGlzIGlzIGFuICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnRlbnRpb25hbCBhc3ltbWV0cnlcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBiZXR3ZWVuICJfX2dldGF0dHJfXygpIiBhbmQgIl9fc2V0YXR0cl9fKCkiLikgVGhpcyBpcyAnCisgICAgICAgICAgICAgICAgICAgICAnZG9uZSBib3RoIGZvclxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBvdGhlcndpc2UgJworICAgICAgICAgICAgICAgICAgICAgJyJfX2dldGF0dHJfXygpIiB3b3VsZCBoYXZlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgbm8gd2F5IHRvIGFjY2VzcyBvdGhlciBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZS4gICcKKyAgICAgICAgICAgICAgICAgICAgICdOb3RlIHRoYXQgYXRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRyb2wgYnkgbm90XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW5zZXJ0aW5nIGFueSB2YWx1ZXMgaW4gdGhlIGluc3RhbmNlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeSAoYnV0XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW5zdGVhZCBpbnNlcnRpbmcgdGhlbSBpbiBhbm90aGVyIG9iamVjdCkuICBTZWUgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGJlbG93IGZvciBhIHdheSB0byAnCisgICAgICAgICAgICAgICAgICAgICAnYWN0dWFsbHkgZ2V0IHRvdGFsXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgY29udHJvbCBvdmVyIGF0dHJpYnV0ZSBhY2Nlc3MuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAgICAgJ2FjY2Vzc2VzIGZvclxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXMgJworICAgICAgICAgICAgICAgICAgICAgJyJfX2dldGF0dHJfXygpIixcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgJworICAgICAgICAgICAgICAgICAgICAgJyJfX2dldGF0dHJpYnV0ZV9fKCkiIGVpdGhlclxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGNhbGxzIGl0IGV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuICJBdHRyaWJ1dGVFcnJvciIuICcKKyAgICAgICAgICAgICAgICAgICAgICdUaGlzIG1ldGhvZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlICcKKyAgICAgICAgICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLiBJbiBvcmRlciB0byBhdm9pZCAnCisgICAgICAgICAgICAgICAgICAgICAnaW5maW5pdGUgcmVjdXJzaW9uIGluXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgdGhpcyBtZXRob2QsIGl0cyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWx3YXlzIGNhbGwgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBiYXNlIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB0byBhY2Nlc3MgYW55IGF0dHJpYnV0ZXMgaXQgJworICAgICAgICAgICAgICAgICAgICAgJ25lZWRzLCBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBleGFtcGxlLCAib2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIE5vdGU6IFRoaXMgbWV0aG9kIG1heSBzdGlsbCBiZSBieXBhc3NlZCB3aGVuIGxvb2tpbmcgJworICAgICAgICAgICAgICAgICAgICAgJ3VwIHNwZWNpYWxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgIG1ldGhvZHMgYXMgdGhlIHJlc3VsdCBvZiBpbXBsaWNpdCBpbnZvY2F0aW9uIHZpYSAnCisgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2Ugc3ludGF4XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICBvciBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSBTcGVjaWFsIG1ldGhvZCBsb29rdXAuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBhc3NpZ25tZW50IGlzIGF0dGVtcHRlZC4gICcKKyAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGNhbGxlZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZWNoYW5pc20gKGkuZS4gc3RvcmUgdGhlIHZhbHVlICcKKyAgICAgICAgICAgICAgICAgICAgICdpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZSBkaWN0aW9uYXJ5KS4gKm5hbWUqIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSwgJworICAgICAgICAgICAgICAgICAgICAgJyp2YWx1ZSogaXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gaXQuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgSWYgIl9fc2V0YXR0cl9fKCkiIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlLCBpdFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBjYWxsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUsICcKKyAgICAgICAgICAgICAgICAgICAgICdmb3IgZXhhbXBsZSxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAib2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgTGlrZSAiX19zZXRhdHRyX18oKSIgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gJworICAgICAgICAgICAgICAgICAgICAgJ2luc3RlYWQgb2ZcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiAiZGVsICcKKyAgICAgICAgICAgICAgICAgICAgICdvYmoubmFtZSIgaXNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Rpcl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gImRpcigpIiBpcyBjYWxsZWQgb24gdGhlIG9iamVjdC4gQSAnCisgICAgICAgICAgICAgICAgICAgICAnc2VxdWVuY2UgbXVzdCBiZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHJldHVybmVkLiAiZGlyKCkiIGNvbnZlcnRzIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSB0byBhICcKKyAgICAgICAgICAgICAgICAgICAgICdsaXN0IGFuZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHNvcnRzIGl0LlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0ltcGxlbWVudGluZyBEZXNjcmlwdG9yc1xuJworICAgICAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRhaW5pbmcgdGhlIG1ldGhvZCAoYSBzby1jYWxsZWQgKmRlc2NyaXB0b3IqIGNsYXNzKSAnCisgICAgICAgICAgICAgICAgICAgICAnYXBwZWFycyBpbiBhblxuJworICAgICAgICAgICAgICAgICAgICAgJypvd25lciogY2xhc3MgKHRoZSBkZXNjcmlwdG9yIG11c3QgYmUgaW4gZWl0aGVyIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAib3duZXIncyBjbGFzc1xuIgorICAgICAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkgb3IgaW4gdGhlIGNsYXNzIGRpY3Rpb25hcnkgZm9yIG9uZSBvZiBpdHMgJworICAgICAgICAgICAgICAgICAgICAgJ3BhcmVudHMpLiAgSW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnZXhhbXBsZXMgYmVsb3csICJ0aGUgYXR0cmlidXRlIiByZWZlcnMgdG8gdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICAgICAgICAnd2hvc2UgbmFtZSBpc1xuJworICAgICAgICAgICAgICAgICAgICAgInRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBvd25lciBjbGFzcycgIgorICAgICAgICAgICAgICAgICAgICAgJyJfX2RpY3RfXyIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2V0X18oc2VsZiwgaW5zdGFuY2UsIG93bmVyKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBhY2Nlc3MpLiAqb3duZXIqIGlzIGFsd2F5cyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlICcKKyAgICAgICAgICAgICAgICAgICAgICcqaW5zdGFuY2UqIGlzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwgb3IgJworICAgICAgICAgICAgICAgICAgICAgJyJOb25lIiB3aGVuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICAgICAnbWV0aG9kIHNob3VsZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4gJworICAgICAgICAgICAgICAgICAgICAgJyJBdHRyaWJ1dGVFcnJvciJcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBleGNlcHRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqICcKKyAgICAgICAgICAgICAgICAgICAgICdvZiB0aGUgb3duZXJcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBjbGFzcyB0byBhIG5ldyB2YWx1ZSwgKnZhbHVlKi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19kZWxldGVfXyhzZWxmLCBpbnN0YW5jZSlcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAgICAgJyppbnN0YW5jZSogb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgb3duZXIgY2xhc3MuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2V0X25hbWVfXyhzZWxmLCBvd25lciwgbmFtZSlcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYXQgdGhlIHRpbWUgdGhlIG93bmluZyBjbGFzcyAqb3duZXIqIGlzICcKKyAgICAgICAgICAgICAgICAgICAgICdjcmVhdGVkLiBUaGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBkZXNjcmlwdG9yIGhhcyBiZWVuIGFzc2lnbmVkIHRvICpuYW1lKi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjYuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlIGF0dHJpYnV0ZSAiX19vYmpjbGFzc19fIiBpcyBpbnRlcnByZXRlZCBieSB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJyJpbnNwZWN0IiBtb2R1bGUgYXNcbicKKyAgICAgICAgICAgICAgICAgICAgICdzcGVjaWZ5aW5nIHRoZSBjbGFzcyB3aGVyZSB0aGlzIG9iamVjdCB3YXMgZGVmaW5lZCAnCisgICAgICAgICAgICAgICAgICAgICAnKHNldHRpbmcgdGhpc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlbHkgY2FuIGFzc2lzdCBpbiBydW50aW1lIGludHJvc3BlY3Rpb24gb2YgJworICAgICAgICAgICAgICAgICAgICAgJ2R5bmFtaWMgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVzKS4gRm9yIGNhbGxhYmxlcywgaXQgbWF5IGluZGljYXRlIHRoYXQgYW4gJworICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJ2dpdmVuIHR5cGUgKG9yIGEgc3ViY2xhc3MpIGlzIGV4cGVjdGVkIG9yIHJlcXVpcmVkIGFzICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgZmlyc3RcbicKKyAgICAgICAgICAgICAgICAgICAgICdwb3NpdGlvbmFsIGFyZ3VtZW50IChmb3IgZXhhbXBsZSwgQ1B5dGhvbiBzZXRzIHRoaXMgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICd1bmJvdW5kIG1ldGhvZHMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gQykuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSW52b2tpbmcgRGVzY3JpcHRvcnNcbicKKyAgICAgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0luIGdlbmVyYWwsIGEgZGVzY3JpcHRvciBpcyBhbiBvYmplY3QgYXR0cmlidXRlIHdpdGggJworICAgICAgICAgICAgICAgICAgICAgJyJiaW5kaW5nXG4nCisgICAgICAgICAgICAgICAgICAgICAnYmVoYXZpb3IiLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiAnCisgICAgICAgICAgICAgICAgICAgICAnb3ZlcnJpZGRlbiBieSBtZXRob2RzXG4nCisgICAgICAgICAgICAgICAgICAgICAnaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIsICcKKyAgICAgICAgICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAgICAgICAgICciX19kZWxldGVfXygpIi4gSWYgYW55IG9mIHRob3NlIG1ldGhvZHMgYXJlIGRlZmluZWQgZm9yICcKKyAgICAgICAgICAgICAgICAgICAgICdhbiBvYmplY3QsIGl0XG4nCisgICAgICAgICAgICAgICAgICAgICAnaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCAnCisgICAgICAgICAgICAgICAgICAgICAnc2V0LCBvciBkZWxldGVcbicKKyAgICAgICAgICAgICAgICAgICAgICJ0aGUgYXR0cmlidXRlIGZyb20gYW4gb2JqZWN0J3MgZGljdGlvbmFyeS4gRm9yIGluc3RhbmNlLCAiCisgICAgICAgICAgICAgICAgICAgICAnImEueCIgaGFzIGFcbicKKyAgICAgICAgICAgICAgICAgICAgICdsb29rdXAgY2hhaW4gc3RhcnRpbmcgd2l0aCAiYS5fX2RpY3RfX1tcJ3hcJ10iLCB0aGVuXG4nCisgICAgICAgICAgICAgICAgICAgICAnInR5cGUoYSkuX19kaWN0X19bXCd4XCddIiwgYW5kIGNvbnRpbnVpbmcgdGhyb3VnaCB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2Jhc2UgY2xhc3NlcyBvZlxuJworICAgICAgICAgICAgICAgICAgICAgJyJ0eXBlKGEpIiBleGNsdWRpbmcgbWV0YWNsYXNzZXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgJworICAgICAgICAgICAgICAgICAgICAgJ29uZSBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yIG1ldGhvZHMsIHRoZW4gUHl0aG9uIG1heSBvdmVycmlkZSB0aGUgZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICAgICAnYmVoYXZpb3IgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgICAnaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgJworICAgICAgICAgICAgICAgICAgICAgJ2luIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJ3ByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgJworICAgICAgICAgICAgICAgICAgICAgJ3dlcmUgZGVmaW5lZCBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAgICdob3cgdGhleSB3ZXJlIGNhbGxlZC5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhICcKKyAgICAgICAgICAgICAgICAgICAgICdiaW5kaW5nLCAiYS54Ii4gSG93XG4nCisgICAgICAgICAgICAgICAgICAgICAndGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gImEiOlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0RpcmVjdCBDYWxsXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgVGhlIHNpbXBsZXN0IGFuZCBsZWFzdCBjb21tb24gY2FsbCBpcyB3aGVuIHVzZXIgY29kZSAnCisgICAgICAgICAgICAgICAgICAgICAnZGlyZWN0bHlcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgICJ4Ll9fZ2V0X18oYSkiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0luc3RhbmNlIEJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBJZiBiaW5kaW5nIHRvIGFuIG9iamVjdCBpbnN0YW5jZSwgImEueCIgaXMgJworICAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybWVkIGludG8gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgY2FsbDogInR5cGUoYSkuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oYSwgdHlwZShhKSkiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0NsYXNzIEJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBJZiBiaW5kaW5nIHRvIGEgY2xhc3MsICJBLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdjYWxsOlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICJBLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKE5vbmUsIEEpIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdTdXBlciBCaW5kaW5nXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgSWYgImEiIGlzIGFuIGluc3RhbmNlIG9mICJzdXBlciIsIHRoZW4gdGhlIGJpbmRpbmcgJworICAgICAgICAgICAgICAgICAgICAgJyJzdXBlcihCLFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG9iaikubSgpIiBzZWFyY2hlcyAib2JqLl9fY2xhc3NfXy5fX21yb19fIiBmb3IgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdiYXNlIGNsYXNzICJBIlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGltbWVkaWF0ZWx5IHByZWNlZGluZyAiQiIgYW5kIHRoZW4gaW52b2tlcyB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3Igd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBjYWxsOiAiQS5fX2RpY3RfX1tcJ21cJ10uX19nZXRfXyhvYmosICcKKyAgICAgICAgICAgICAgICAgICAgICdvYmouX19jbGFzc19fKSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnRm9yIGluc3RhbmNlIGJpbmRpbmdzLCB0aGUgcHJlY2VkZW5jZSBvZiBkZXNjcmlwdG9yICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnZvY2F0aW9uIGRlcGVuZHNcbicKKyAgICAgICAgICAgICAgICAgICAgICdvbiB0aGUgd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIGFyZSBkZWZpbmVkLiAgQSAnCisgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRvciBjYW4gZGVmaW5lXG4nCisgICAgICAgICAgICAgICAgICAgICAnYW55IGNvbWJpbmF0aW9uIG9mICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiBhbmQgJworICAgICAgICAgICAgICAgICAgICAgJyJfX2RlbGV0ZV9fKCkiLiAgSWYgaXRcbicKKyAgICAgICAgICAgICAgICAgICAgICdkb2VzIG5vdCBkZWZpbmUgIl9fZ2V0X18oKSIsIHRoZW4gYWNjZXNzaW5nIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIHdpbGwgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICAgICAndGhlIGRlc2NyaXB0b3Igb2JqZWN0IGl0c2VsZiB1bmxlc3MgdGhlcmUgaXMgYSB2YWx1ZSBpbiAnCisgICAgICAgICAgICAgICAgICAgICAidGhlIG9iamVjdCdzXG4iCisgICAgICAgICAgICAgICAgICAgICAnaW5zdGFuY2UgZGljdGlvbmFyeS4gIElmIHRoZSBkZXNjcmlwdG9yIGRlZmluZXMgJworICAgICAgICAgICAgICAgICAgICAgJyJfX3NldF9fKCkiIGFuZC9vclxuJworICAgICAgICAgICAgICAgICAgICAgJyJfX2RlbGV0ZV9fKCkiLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICAgICAnbmVpdGhlciwgaXQgaXNcbicKKyAgICAgICAgICAgICAgICAgICAgICdhIG5vbi1kYXRhIGRlc2NyaXB0b3IuICBOb3JtYWxseSwgZGF0YSBkZXNjcmlwdG9ycyAnCisgICAgICAgICAgICAgICAgICAgICAnZGVmaW5lIGJvdGhcbicKKyAgICAgICAgICAgICAgICAgICAgICciX19nZXRfXygpIiBhbmQgIl9fc2V0X18oKSIsIHdoaWxlIG5vbi1kYXRhIGRlc2NyaXB0b3JzICcKKyAgICAgICAgICAgICAgICAgICAgICdoYXZlIGp1c3QgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnIl9fZ2V0X18oKSIgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoICJfX3NldF9fKCkiICcKKyAgICAgICAgICAgICAgICAgICAgICdhbmQgIl9fZ2V0X18oKSJcbicKKyAgICAgICAgICAgICAgICAgICAgICdkZWZpbmVkIGFsd2F5cyBvdmVycmlkZSBhIHJlZGVmaW5pdGlvbiBpbiBhbiBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeS4gIEluXG4nCisgICAgICAgICAgICAgICAgICAgICAnY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZSBvdmVycmlkZGVuIGJ5ICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0YW5jZXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uIG1ldGhvZHMgKGluY2x1ZGluZyAic3RhdGljbWV0aG9kKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICAgICAnImNsYXNzbWV0aG9kKCkiKSBhcmVcbicKKyAgICAgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LCAnCisgICAgICAgICAgICAgICAgICAgICAnaW5zdGFuY2VzIGNhblxuJworICAgICAgICAgICAgICAgICAgICAgJ3JlZGVmaW5lIGFuZCBvdmVycmlkZSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgaW5kaXZpZHVhbCAnCisgICAgICAgICAgICAgICAgICAgICAnaW5zdGFuY2VzIHRvXG4nCisgICAgICAgICAgICAgICAgICAgICAnYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIGNsYXNzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSAicHJvcGVydHkoKSIgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhICcKKyAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yLlxuJworICAgICAgICAgICAgICAgICAgICAgJ0FjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBhICcKKyAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdfX3Nsb3RzX19cbicKKyAgICAgICAgICAgICAgICAgICAgICc9PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdCeSBkZWZhdWx0LCBpbnN0YW5jZXMgb2YgY2xhc3NlcyBoYXZlIGEgZGljdGlvbmFyeSBmb3IgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2UuICBUaGlzIHdhc3RlcyBzcGFjZSBmb3Igb2JqZWN0cyBoYXZpbmcgdmVyeSBmZXcgJworICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgICAgICAgICAgICAndmFyaWFibGVzLiAgVGhlIHNwYWNlIGNvbnN1bXB0aW9uIGNhbiBiZWNvbWUgYWN1dGUgd2hlbiAnCisgICAgICAgICAgICAgICAgICAgICAnY3JlYXRpbmcgbGFyZ2VcbicKKyAgICAgICAgICAgICAgICAgICAgICdudW1iZXJzIG9mIGluc3RhbmNlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyAqX19zbG90c19fKiBpbiAnCisgICAgICAgICAgICAgICAgICAgICAnYSBjbGFzc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2RlZmluaXRpb24uIFRoZSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiB0YWtlcyBhIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICdvZiBpbnN0YW5jZVxuJworICAgICAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlcyBhbmQgcmVzZXJ2ZXMganVzdCBlbm91Z2ggc3BhY2UgaW4gZWFjaCAnCisgICAgICAgICAgICAgICAgICAgICAnaW5zdGFuY2UgdG8gaG9sZCBhXG4nCisgICAgICAgICAgICAgICAgICAgICAndmFsdWUgZm9yIGVhY2ggdmFyaWFibGUuICBTcGFjZSBpcyBzYXZlZCBiZWNhdXNlICcKKyAgICAgICAgICAgICAgICAgICAgICcqX19kaWN0X18qIGlzIG5vdFxuJworICAgICAgICAgICAgICAgICAgICAgJ2NyZWF0ZWQgZm9yIGVhY2ggaW5zdGFuY2UuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2xvdHNfX1xuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIFRoaXMgY2xhc3MgdmFyaWFibGUgY2FuIGJlIGFzc2lnbmVkIGEgc3RyaW5nLCAnCisgICAgICAgICAgICAgICAgICAgICAnaXRlcmFibGUsIG9yIHNlcXVlbmNlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgb2Ygc3RyaW5ncyB3aXRoIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgaW5zdGFuY2VzLiAgJworICAgICAgICAgICAgICAgICAgICAgJypfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgcmVzZXJ2ZXMgc3BhY2UgZm9yIHRoZSBkZWNsYXJlZCB2YXJpYWJsZXMgYW5kICcKKyAgICAgICAgICAgICAgICAgICAgICdwcmV2ZW50cyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBhdXRvbWF0aWMgY3JlYXRpb24gb2YgKl9fZGljdF9fKiBhbmQgKl9fd2Vha3JlZl9fKiAnCisgICAgICAgICAgICAgICAgICAgICAnZm9yIGVhY2hcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdOb3RlcyBvbiB1c2luZyAqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhIGNsYXNzIHdpdGhvdXQgKl9fc2xvdHNfXyosIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnKl9fZGljdF9fKlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgYXR0cmlidXRlIG9mIHRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZSwgc28gJworICAgICAgICAgICAgICAgICAgICAgJ2EgKl9fc2xvdHNfXypcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGRlZmluaXRpb24gaW4gdGhlIHN1YmNsYXNzIGlzIG1lYW5pbmdsZXNzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyogV2l0aG91dCBhICpfX2RpY3RfXyogdmFyaWFibGUsIGluc3RhbmNlcyBjYW5ub3QgYmUgJworICAgICAgICAgICAgICAgICAgICAgJ2Fzc2lnbmVkIG5ld1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICAnCisgICAgICAgICAgICAgICAgICAgICAnQXR0ZW1wdHMgdG9cbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGFzc2lnbiB0byBhbiB1bmxpc3RlZCB2YXJpYWJsZSBuYW1lIHJhaXNlcyAnCisgICAgICAgICAgICAgICAgICAgICAnIkF0dHJpYnV0ZUVycm9yIi4gSWZcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGR5bmFtaWMgYXNzaWdubWVudCBvZiBuZXcgdmFyaWFibGVzIGlzIGRlc2lyZWQsIHRoZW4gJworICAgICAgICAgICAgICAgICAgICAgJ2FkZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIlwnX19kaWN0X19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICcqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgZGVjbGFyYXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiBXaXRob3V0IGEgKl9fd2Vha3JlZl9fKiB2YXJpYWJsZSBmb3IgZWFjaCBpbnN0YW5jZSwgJworICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzZXNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGRlZmluaW5nICpfX3Nsb3RzX18qIGRvIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyB0byAnCisgICAgICAgICAgICAgICAgICAgICAnaXRzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBpbnN0YW5jZXMuIElmIHdlYWsgcmVmZXJlbmNlIHN1cHBvcnQgaXMgbmVlZGVkLCB0aGVuICcKKyAgICAgICAgICAgICAgICAgICAgICdhZGRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICJcJ19fd2Vha3JlZl9fXCciIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnKl9fc2xvdHNfXypcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGRlY2xhcmF0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyogKl9fc2xvdHNfXyogYXJlIGltcGxlbWVudGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBieSAnCisgICAgICAgICAgICAgICAgICAgICAnY3JlYXRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGRlc2NyaXB0b3JzIChJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMpIGZvciBlYWNoICcKKyAgICAgICAgICAgICAgICAgICAgICd2YXJpYWJsZSBuYW1lLiAgQXMgYVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgcmVzdWx0LCBjbGFzcyBhdHRyaWJ1dGVzIGNhbm5vdCBiZSB1c2VkIHRvIHNldCBkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgICAgICd2YWx1ZXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBpbnN0YW5jZSB2YXJpYWJsZXMgZGVmaW5lZCBieSAqX19zbG90c19fKjsgb3RoZXJ3aXNlLCAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBhdHRyaWJ1dGUgd291bGQgb3ZlcndyaXRlIHRoZSBkZXNjcmlwdG9yIGFzc2lnbm1lbnQuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiBUaGUgYWN0aW9uIG9mIGEgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gaXMgbGltaXRlZCB0byAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgQXMgYSByZXN1bHQsIHN1YmNsYXNzZXMgd2lsbCAnCisgICAgICAgICAgICAgICAgICAgICAnaGF2ZSBhICpfX2RpY3RfXypcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIHVubGVzcyB0aGV5IGFsc28gZGVmaW5lICpfX3Nsb3RzX18qICh3aGljaCBtdXN0IG9ubHkgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRhaW4gbmFtZXNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIG9mIGFueSAqYWRkaXRpb25hbCogc2xvdHMpLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyogSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlICcKKyAgICAgICAgICAgICAgICAgICAgICdjbGFzcywgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBpbnN0YW5jZSB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzIHNsb3QgaXMgJworICAgICAgICAgICAgICAgICAgICAgJ2luYWNjZXNzaWJsZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgKGV4Y2VwdCBieSByZXRyaWV2aW5nIGl0cyBkZXNjcmlwdG9yIGRpcmVjdGx5IGZyb20gdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdiYXNlIGNsYXNzKS5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgIFRoaXMgcmVuZGVycyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSB1bmRlZmluZWQuICBJbiAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIGZ1dHVyZSwgYVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgY2hlY2sgbWF5IGJlIGFkZGVkIHRvIHByZXZlbnQgdGhpcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqIE5vbmVtcHR5ICpfX3Nsb3RzX18qIGRvZXMgbm90IHdvcmsgZm9yIGNsYXNzZXMgZGVyaXZlZCAnCisgICAgICAgICAgICAgICAgICAgICAnZnJvbVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgInZhcmlhYmxlLWxlbmd0aCIgYnVpbHQtaW4gdHlwZXMgc3VjaCBhcyAiaW50IiwgJworICAgICAgICAgICAgICAgICAgICAgJyJieXRlcyIgYW5kICJ0dXBsZSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiBBbnkgbm9uLXN0cmluZyBpdGVyYWJsZSBtYXkgYmUgYXNzaWduZWQgdG8gJworICAgICAgICAgICAgICAgICAgICAgJypfX3Nsb3RzX18qLiBNYXBwaW5nc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgbWF5IGFsc28gYmUgdXNlZDsgaG93ZXZlciwgaW4gdGhlIGZ1dHVyZSwgc3BlY2lhbCAnCisgICAgICAgICAgICAgICAgICAgICAnbWVhbmluZyBtYXkgYmVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgd29ya3Mgb25seSBpZiBib3RoIGNsYXNzZXMgaGF2ZSAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIHNhbWVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICpfX3Nsb3RzX18qLlxuJywKKyAnYXR0cmlidXRlLXJlZmVyZW5jZXMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0F0dHJpYnV0ZSByZWZlcmVuY2VzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICdBbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIGlzIGEgcHJpbWFyeSBmb2xsb3dlZCBieSBhICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAncGVyaW9kIGFuZCBhIG5hbWU6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcgICBhdHRyaWJ1dGVyZWYgOjo9IHByaW1hcnkgIi4iIGlkZW50aWZpZXJcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IG9mIGEgdHlwZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoYXQgc3VwcG9ydHNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIHJlZmVyZW5jZXMsIHdoaWNoIG1vc3Qgb2JqZWN0cyBkby4gIFRoaXMgJworICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QgaXMgdGhlblxuJworICAgICAgICAgICAgICAgICAgICAgICAgICdhc2tlZCB0byBwcm9kdWNlIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcyB0aGUgJworICAgICAgICAgICAgICAgICAgICAgICAgICdpZGVudGlmaWVyLiAgVGhpc1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9kdWN0aW9uIGNhbiBiZSBjdXN0b21pemVkIGJ5IG92ZXJyaWRpbmcgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIl9fZ2V0YXR0cl9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGV4Y2VwdGlvbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJyJBdHRyaWJ1dGVFcnJvciIgaXNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAncmFpc2VkLiAgT3RoZXJ3aXNlLCB0aGUgdHlwZSBhbmQgdmFsdWUgb2YgdGhlIG9iamVjdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2R1Y2VkIGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2RldGVybWluZWQgYnkgdGhlIG9iamVjdC4gIE11bHRpcGxlIGV2YWx1YXRpb25zIG9mICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGhlIHNhbWUgYXR0cmlidXRlXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZSBtYXkgeWllbGQgZGlmZmVyZW50IG9iamVjdHMuXG4nLAorICdhdWdhc3NpZ24nOiAnXG4nCisgICAgICAgICAgICAgICdBdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzXG4nCisgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0F1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgc3RhdGVtZW50LCAnCisgICAgICAgICAgICAgICdvZiBhXG4nCisgICAgICAgICAgICAgICdiaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDpcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnICAgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0IGF1Z29wICcKKyAgICAgICAgICAgICAgJyhleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuJworICAgICAgICAgICAgICAnICAgYXVndGFyZ2V0ICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciB8IGF0dHJpYnV0ZXJlZiB8ICcKKyAgICAgICAgICAgICAgJ3N1YnNjcmlwdGlvbiB8IHNsaWNpbmdcbicKKyAgICAgICAgICAgICAgJyAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICJAPSIgfCAnCisgICAgICAgICAgICAgICciLz0iIHwgIi8vPSIgfCAiJT0iIHwgIioqPSJcbicKKyAgICAgICAgICAgICAgJyAgICAgICAgICAgICB8ICI+Pj0iIHwgIjw8PSIgfCAiJj0iIHwgIl49IiB8ICJ8PSJcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnKFNlZSBzZWN0aW9uIFByaW1hcmllcyBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBvZiB0aGUgbGFzdCAnCisgICAgICAgICAgICAgICd0aHJlZVxuJworICAgICAgICAgICAgICAnc3ltYm9scy4pXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0FuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV2YWx1YXRlcyB0aGUgdGFyZ2V0ICh3aGljaCwgdW5saWtlICcKKyAgICAgICAgICAgICAgJ25vcm1hbFxuJworICAgICAgICAgICAgICAnYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBjYW5ub3QgYmUgYW4gdW5wYWNraW5nKSBhbmQgdGhlICcKKyAgICAgICAgICAgICAgJ2V4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAgJ2xpc3QsIHBlcmZvcm1zIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mICcKKyAgICAgICAgICAgICAgJ2Fzc2lnbm1lbnRcbicKKyAgICAgICAgICAgICAgJ29uIHRoZSB0d28gb3BlcmFuZHMsIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gdGhlIG9yaWdpbmFsICcKKyAgICAgICAgICAgICAgJ3RhcmdldC5cbicKKyAgICAgICAgICAgICAgJ1RoZSB0YXJnZXQgaXMgb25seSBldmFsdWF0ZWQgb25jZS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBsaWtlICJ4ICs9IDEiIGNhbiBiZSAnCisgICAgICAgICAgICAgICdyZXdyaXR0ZW4gYXNcbicKKyAgICAgICAgICAgICAgJyJ4ID0geCArIDEiIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiAnCisgICAgICAgICAgICAgICdJbiB0aGVcbicKKyAgICAgICAgICAgICAgJ2F1Z21lbnRlZCB2ZXJzaW9uLCAieCIgaXMgb25seSBldmFsdWF0ZWQgb25jZS4gQWxzbywgd2hlbiAnCisgICAgICAgICAgICAgICdwb3NzaWJsZSxcbicKKyAgICAgICAgICAgICAgJ3RoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXQgJworICAgICAgICAgICAgICAncmF0aGVyIHRoYW5cbicKKyAgICAgICAgICAgICAgJ2NyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgYXNzaWduaW5nIHRoYXQgdG8gdGhlIHRhcmdldCwgdGhlIG9sZCAnCisgICAgICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAgICAgJ2lzIG1vZGlmaWVkIGluc3RlYWQuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1VubGlrZSBub3JtYWwgYXNzaWdubWVudHMsIGF1Z21lbnRlZCBhc3NpZ25tZW50cyBldmFsdWF0ZSB0aGUgJworICAgICAgICAgICAgICAnbGVmdC1cbicKKyAgICAgICAgICAgICAgJ2hhbmQgc2lkZSAqYmVmb3JlKiBldmFsdWF0aW5nIHRoZSByaWdodC1oYW5kIHNpZGUuICBGb3IgJworICAgICAgICAgICAgICAnZXhhbXBsZSwgImFbaV1cbicKKyAgICAgICAgICAgICAgJys9IGYoeCkiIGZpcnN0IGxvb2tzLXVwICJhW2ldIiwgdGhlbiBpdCBldmFsdWF0ZXMgImYoeCkiIGFuZCAnCisgICAgICAgICAgICAgICdwZXJmb3Jtc1xuJworICAgICAgICAgICAgICAndGhlIGFkZGl0aW9uLCBhbmQgbGFzdGx5LCBpdCB3cml0ZXMgdGhlIHJlc3VsdCBiYWNrIHRvICJhW2ldIi5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgJworICAgICAgICAgICAgICAnaW4gYVxuJworICAgICAgICAgICAgICAnc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudFxuJworICAgICAgICAgICAgICAnc3RhdGVtZW50cyBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBub3JtYWwgYXNzaWdubWVudHMuICcKKyAgICAgICAgICAgICAgJ1NpbWlsYXJseSxcbicKKyAgICAgICAgICAgICAgJ3dpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlICcKKyAgICAgICAgICAgICAgJ2JpbmFyeVxuJworICAgICAgICAgICAgICAnb3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgJworICAgICAgICAgICAgICAnbm9ybWFsXG4nCisgICAgICAgICAgICAgICdiaW5hcnkgb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSBjYXZlYXQgJworICAgICAgICAgICAgICAnYWJvdXRcbicKKyAgICAgICAgICAgICAgJ2NsYXNzIGFuZCBpbnN0YW5jZSBhdHRyaWJ1dGVzIGFwcGxpZXMgYXMgZm9yIHJlZ3VsYXIgJworICAgICAgICAgICAgICAnYXNzaWdubWVudHMuXG4nLAorICdiaW5hcnknOiAnXG4nCisgICAgICAgICAgICdCaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zXG4nCisgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBiaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGhhdmUgdGhlIGNvbnZlbnRpb25hbCBwcmlvcml0eVxuJworICAgICAgICAgICAnbGV2ZWxzLiAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2Ugb3BlcmF0aW9ucyBhbHNvIGFwcGx5IHRvIGNlcnRhaW4gJworICAgICAgICAgICAnbm9uLVxuJworICAgICAgICAgICAnbnVtZXJpYyB0eXBlcy4gIEFwYXJ0IGZyb20gdGhlIHBvd2VyIG9wZXJhdG9yLCB0aGVyZSBhcmUgb25seSB0d29cbicKKyAgICAgICAgICAgJ2xldmVscywgb25lIGZvciBtdWx0aXBsaWNhdGl2ZSBvcGVyYXRvcnMgYW5kIG9uZSBmb3IgYWRkaXRpdmVcbicKKyAgICAgICAgICAgJ29wZXJhdG9yczpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgbV9leHByIDo6PSB1X2V4cHIgfCBtX2V4cHIgIioiIHVfZXhwciB8IG1fZXhwciAiQCIgbV9leHByIHxcbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgbV9leHByICIvLyIgdV9leHByfCBtX2V4cHIgIi8iIHVfZXhwciB8XG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgIG1fZXhwciAiJSIgdV9leHByXG4nCisgICAgICAgICAgICcgICBhX2V4cHIgOjo9IG1fZXhwciB8IGFfZXhwciAiKyIgbV9leHByIHwgYV9leHByICItIiBtX2V4cHJcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICIqIiAobXVsdGlwbGljYXRpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgcHJvZHVjdCBvZiBpdHMgJworICAgICAgICAgICAnYXJndW1lbnRzLlxuJworICAgICAgICAgICAnVGhlIGFyZ3VtZW50cyBtdXN0IGVpdGhlciBib3RoIGJlIG51bWJlcnMsIG9yIG9uZSBhcmd1bWVudCBtdXN0IGJlICcKKyAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICdpbnRlZ2VyIGFuZCB0aGUgb3RoZXIgbXVzdCBiZSBhIHNlcXVlbmNlLiBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZVxuJworICAgICAgICAgICAnbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUgYW5kIHRoZW4gbXVsdGlwbGllZCAnCisgICAgICAgICAgICd0b2dldGhlci5cbicKKyAgICAgICAgICAgJ0luIHRoZSBsYXR0ZXIgY2FzZSwgc2VxdWVuY2UgcmVwZXRpdGlvbiBpcyBwZXJmb3JtZWQ7IGEgbmVnYXRpdmVcbicKKyAgICAgICAgICAgJ3JlcGV0aXRpb24gZmFjdG9yIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICJAIiAoYXQpIG9wZXJhdG9yIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIG1hdHJpeFxuJworICAgICAgICAgICAnbXVsdGlwbGljYXRpb24uICBObyBidWlsdGluIFB5dGhvbiB0eXBlcyBpbXBsZW1lbnQgdGhpcyBvcGVyYXRvci5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy41LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgIi8iIChkaXZpc2lvbikgYW5kICIvLyIgKGZsb29yIGRpdmlzaW9uKSBvcGVyYXRvcnMgeWllbGQgdGhlXG4nCisgICAgICAgICAgICdxdW90aWVudCBvZiB0aGVpciBhcmd1bWVudHMuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0XG4nCisgICAgICAgICAgICdjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gRGl2aXNpb24gb2YgaW50ZWdlcnMgeWllbGRzIGEgZmxvYXQsICcKKyAgICAgICAgICAgJ3doaWxlXG4nCisgICAgICAgICAgICdmbG9vciBkaXZpc2lvbiBvZiBpbnRlZ2VycyByZXN1bHRzIGluIGFuIGludGVnZXI7IHRoZSByZXN1bHQgaXMgJworICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAib2YgbWF0aGVtYXRpY2FsIGRpdmlzaW9uIHdpdGggdGhlICdmbG9vcicgZnVuY3Rpb24gYXBwbGllZCB0byB0aGVcbiIKKyAgICAgICAgICAgJ3Jlc3VsdC4gIERpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIHRoZSAiWmVyb0RpdmlzaW9uRXJyb3IiICcKKyAgICAgICAgICAgJ2V4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICIlIiAobW9kdWxvKSBvcGVyYXRvciB5aWVsZHMgdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBkaXZpc2lvbiAnCisgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAndGhlIGZpcnN0IGFyZ3VtZW50IGJ5IHRoZSBzZWNvbmQuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlICcKKyAgICAgICAgICAgJ2ZpcnN0XG4nCisgICAgICAgICAgICdjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIEEgemVybyByaWdodCBhcmd1bWVudCByYWlzZXMgdGhlXG4nCisgICAgICAgICAgICciWmVyb0RpdmlzaW9uRXJyb3IiIGV4Y2VwdGlvbi4gIFRoZSBhcmd1bWVudHMgbWF5IGJlIGZsb2F0aW5nICcKKyAgICAgICAgICAgJ3BvaW50XG4nCisgICAgICAgICAgICdudW1iZXJzLCBlLmcuLCAiMy4xNCUwLjciIGVxdWFscyAiMC4zNCIgKHNpbmNlICIzLjE0IiBlcXVhbHMgJworICAgICAgICAgICAnIjQqMC43ICtcbicKKyAgICAgICAgICAgJzAuMzQiLikgIFRoZSBtb2R1bG8gb3BlcmF0b3IgYWx3YXlzIHlpZWxkcyBhIHJlc3VsdCB3aXRoIHRoZSBzYW1lICcKKyAgICAgICAgICAgJ3NpZ25cbicKKyAgICAgICAgICAgJ2FzIGl0cyBzZWNvbmQgb3BlcmFuZCAob3IgemVybyk7IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgcmVzdWx0ICcKKyAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICdzdHJpY3RseSBzbWFsbGVyIHRoYW4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCAnCisgICAgICAgICAgICdbMV0uXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBmbG9vciBkaXZpc2lvbiBhbmQgbW9kdWxvIG9wZXJhdG9ycyBhcmUgY29ubmVjdGVkIGJ5IHRoZSAnCisgICAgICAgICAgICdmb2xsb3dpbmdcbicKKyAgICAgICAgICAgJ2lkZW50aXR5OiAieCA9PSAoeC8veSkqeSArICh4JXkpIi4gIEZsb29yIGRpdmlzaW9uIGFuZCBtb2R1bG8gYXJlICcKKyAgICAgICAgICAgJ2Fsc29cbicKKyAgICAgICAgICAgJ2Nvbm5lY3RlZCB3aXRoIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAiZGl2bW9kKCkiOiAiZGl2bW9kKHgsIHkpID09XG4nCisgICAgICAgICAgICcoeC8veSwgeCV5KSIuIFsyXS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSW4gYWRkaXRpb24gdG8gcGVyZm9ybWluZyB0aGUgbW9kdWxvIG9wZXJhdGlvbiBvbiBudW1iZXJzLCB0aGUgJworICAgICAgICAgICAnIiUiXG4nCisgICAgICAgICAgICdvcGVyYXRvciBpcyBhbHNvIG92ZXJsb2FkZWQgYnkgc3RyaW5nIG9iamVjdHMgdG8gcGVyZm9ybSAnCisgICAgICAgICAgICdvbGQtc3R5bGVcbicKKyAgICAgICAgICAgJ3N0cmluZyBmb3JtYXR0aW5nIChhbHNvIGtub3duIGFzIGludGVycG9sYXRpb24pLiAgVGhlIHN5bnRheCBmb3JcbicKKyAgICAgICAgICAgJ3N0cmluZyBmb3JtYXR0aW5nIGlzIGRlc2NyaWJlZCBpbiB0aGUgUHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlLFxuJworICAgICAgICAgICAnc2VjdGlvbiBwcmludGYtc3R5bGUgU3RyaW5nIEZvcm1hdHRpbmcuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBmbG9vciBkaXZpc2lvbiBvcGVyYXRvciwgdGhlIG1vZHVsbyBvcGVyYXRvciwgYW5kIHRoZSAnCisgICAgICAgICAgICciZGl2bW9kKCkiXG4nCisgICAgICAgICAgICdmdW5jdGlvbiBhcmUgbm90IGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycy4gIEluc3RlYWQsIGNvbnZlcnQgdG8gJworICAgICAgICAgICAnYVxuJworICAgICAgICAgICAnZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHVzaW5nIHRoZSAiYWJzKCkiIGZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgIisiIChhZGRpdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBzdW0gb2YgaXRzIGFyZ3VtZW50cy4gIFRoZVxuJworICAgICAgICAgICAnYXJndW1lbnRzIG11c3QgZWl0aGVyIGJvdGggYmUgbnVtYmVycyBvciBib3RoIGJlIHNlcXVlbmNlcyBvZiB0aGUgJworICAgICAgICAgICAnc2FtZVxuJworICAgICAgICAgICAndHlwZS4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiAnCisgICAgICAgICAgICd0eXBlXG4nCisgICAgICAgICAgICdhbmQgdGhlbiBhZGRlZCB0b2dldGhlci4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgc2VxdWVuY2VzIGFyZVxuJworICAgICAgICAgICAnY29uY2F0ZW5hdGVkLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgIi0iIChzdWJ0cmFjdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBkaWZmZXJlbmNlIG9mIGl0cyAnCisgICAgICAgICAgICdhcmd1bWVudHMuXG4nCisgICAgICAgICAgICdUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLlxuJywKKyAnYml0d2lzZSc6ICdcbicKKyAgICAgICAgICAgICdCaW5hcnkgYml0d2lzZSBvcGVyYXRpb25zXG4nCisgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0VhY2ggb2YgdGhlIHRocmVlIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXMgYSBkaWZmZXJlbnQgcHJpb3JpdHkgJworICAgICAgICAgICAgJ2xldmVsOlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJyAgIGFuZF9leHByIDo6PSBzaGlmdF9leHByIHwgYW5kX2V4cHIgIiYiIHNoaWZ0X2V4cHJcbicKKyAgICAgICAgICAgICcgICB4b3JfZXhwciA6Oj0gYW5kX2V4cHIgfCB4b3JfZXhwciAiXiIgYW5kX2V4cHJcbicKKyAgICAgICAgICAgICcgICBvcl9leHByICA6Oj0geG9yX2V4cHIgfCBvcl9leHByICJ8IiB4b3JfZXhwclxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ1RoZSAiJiIgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIEFORCBvZiBpdHMgYXJndW1lbnRzLCB3aGljaCAnCisgICAgICAgICAgICAnbXVzdFxuJworICAgICAgICAgICAgJ2JlIGludGVnZXJzLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ1RoZSAiXiIgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIFhPUiAoZXhjbHVzaXZlIE9SKSBvZiBpdHNcbicKKyAgICAgICAgICAgICdhcmd1bWVudHMsIHdoaWNoIG11c3QgYmUgaW50ZWdlcnMuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVGhlICJ8IiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgKGluY2x1c2l2ZSkgT1Igb2YgaXRzICcKKyAgICAgICAgICAgICdhcmd1bWVudHMsXG4nCisgICAgICAgICAgICAnd2hpY2ggbXVzdCBiZSBpbnRlZ2Vycy5cbicsCisgJ2JsdGluLWNvZGUtb2JqZWN0cyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ0NvZGUgT2JqZWN0c1xuJworICAgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ0NvZGUgb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gdG8gJworICAgICAgICAgICAgICAgICAgICAgICAncmVwcmVzZW50ICJwc2V1ZG8tXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdjb21waWxlZCIgZXhlY3V0YWJsZSBQeXRob24gY29kZSBzdWNoIGFzIGEgZnVuY3Rpb24gJworICAgICAgICAgICAgICAgICAgICAgICAnYm9keS4gVGhleSBkaWZmZXJcbicKKyAgICAgICAgICAgICAgICAgICAgICAgImZyb20gZnVuY3Rpb24gb2JqZWN0cyBiZWNhdXNlIHRoZXkgZG9uJ3QgY29udGFpbiBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZSB0byB0aGVpclxuJworICAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4gIENvZGUgb2JqZWN0cyBhcmUgJworICAgICAgICAgICAgICAgICAgICAgICAncmV0dXJuZWQgYnkgdGhlIGJ1aWx0LVxuJworICAgICAgICAgICAgICAgICAgICAgICAnaW4gImNvbXBpbGUoKSIgZnVuY3Rpb24gYW5kIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSAnCisgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbiBvYmplY3RzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICd0aHJvdWdoIHRoZWlyICJfX2NvZGVfXyIgYXR0cmlidXRlLiBTZWUgYWxzbyB0aGUgJworICAgICAgICAgICAgICAgICAgICAgICAnImNvZGUiIG1vZHVsZS5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAnQSBjb2RlIG9iamVjdCBjYW4gYmUgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkIGJ5IHBhc3NpbmcgJworICAgICAgICAgICAgICAgICAgICAgICAnaXQgKGluc3RlYWQgb2YgYVxuJworICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlIHN0cmluZykgdG8gdGhlICJleGVjKCkiIG9yICJldmFsKCkiICBidWlsdC1pbiAnCisgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbnMuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1NlZSBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkgZm9yIG1vcmUgJworICAgICAgICAgICAgICAgICAgICAgICAnaW5mb3JtYXRpb24uXG4nLAorICdibHRpbi1lbGxpcHNpcy1vYmplY3QnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgRWxsaXBzaXMgT2JqZWN0XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgb2JqZWN0IGlzIGNvbW1vbmx5IHVzZWQgYnkgc2xpY2luZyAoc2VlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NsaWNpbmdzKS4gIEl0IHN1cHBvcnRzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICdubyBzcGVjaWFsIG9wZXJhdGlvbnMuICBUaGVyZSBpcyBleGFjdGx5IG9uZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGxpcHNpcyBvYmplY3QsIG5hbWVkXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICciRWxsaXBzaXMiIChhIGJ1aWx0LWluIG5hbWUpLiAgInR5cGUoRWxsaXBzaXMpKCkiICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2R1Y2VzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnIkVsbGlwc2lzIiBzaW5nbGV0b24uXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ0l0IGlzIHdyaXR0ZW4gYXMgIkVsbGlwc2lzIiBvciAiLi4uIi5cbicsCisgJ2JsdGluLW51bGwtb2JqZWN0JzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgICdUaGUgTnVsbCBPYmplY3RcbicKKyAgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICJUaGlzIG9iamVjdCBpcyByZXR1cm5lZCBieSBmdW5jdGlvbnMgdGhhdCBkb24ndCAiCisgICAgICAgICAgICAgICAgICAgICAgJ2V4cGxpY2l0bHkgcmV0dXJuIGFcbicKKyAgICAgICAgICAgICAgICAgICAgICAndmFsdWUuICBJdCBzdXBwb3J0cyBubyBzcGVjaWFsIG9wZXJhdGlvbnMuICBUaGVyZSBpcyAnCisgICAgICAgICAgICAgICAgICAgICAgJ2V4YWN0bHkgb25lIG51bGxcbicKKyAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0LCBuYW1lZCAiTm9uZSIgKGEgYnVpbHQtaW4gbmFtZSkuICAidHlwZShOb25lKSgpIiAnCisgICAgICAgICAgICAgICAgICAgICAgJ3Byb2R1Y2VzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgICdzYW1lIHNpbmdsZXRvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgJ0l0IGlzIHdyaXR0ZW4gYXMgIk5vbmUiLlxuJywKKyAnYmx0aW4tdHlwZS1vYmplY3RzJzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAnVHlwZSBPYmplY3RzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAnVHlwZSBvYmplY3RzIHJlcHJlc2VudCB0aGUgdmFyaW91cyBvYmplY3QgdHlwZXMuICBBbiAnCisgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QncyB0eXBlIGlzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICdhY2Nlc3NlZCBieSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gInR5cGUoKSIuICBUaGVyZSBhcmUgJworICAgICAgICAgICAgICAgICAgICAgICAnbm8gc3BlY2lhbFxuJworICAgICAgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9ucyBvbiB0eXBlcy4gIFRoZSBzdGFuZGFyZCBtb2R1bGUgInR5cGVzIiAnCisgICAgICAgICAgICAgICAgICAgICAgICdkZWZpbmVzIG5hbWVzIGZvclxuJworICAgICAgICAgICAgICAgICAgICAgICAnYWxsIHN0YW5kYXJkIGJ1aWx0LWluIHR5cGVzLlxuJworICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdUeXBlcyBhcmUgd3JpdHRlbiBsaWtlIHRoaXM6ICI8Y2xhc3MgXCdpbnRcJz4iLlxuJywKKyAnYm9vbGVhbnMnOiAnXG4nCisgICAgICAgICAgICAgJ0Jvb2xlYW4gb3BlcmF0aW9uc1xuJworICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIG9yX3Rlc3QgIDo6PSBhbmRfdGVzdCB8IG9yX3Rlc3QgIm9yIiBhbmRfdGVzdFxuJworICAgICAgICAgICAgICcgICBhbmRfdGVzdCA6Oj0gbm90X3Rlc3QgfCBhbmRfdGVzdCAiYW5kIiBub3RfdGVzdFxuJworICAgICAgICAgICAgICcgICBub3RfdGVzdCA6Oj0gY29tcGFyaXNvbiB8ICJub3QiIG5vdF90ZXN0XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJbiB0aGUgY29udGV4dCBvZiBCb29sZWFuIG9wZXJhdGlvbnMsIGFuZCBhbHNvIHdoZW4gZXhwcmVzc2lvbnMgJworICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAndXNlZCBieSBjb250cm9sIGZsb3cgc3RhdGVtZW50cywgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlICcKKyAgICAgICAgICAgICAnaW50ZXJwcmV0ZWRcbicKKyAgICAgICAgICAgICAnYXMgZmFsc2U6ICJGYWxzZSIsICJOb25lIiwgbnVtZXJpYyB6ZXJvIG9mIGFsbCB0eXBlcywgYW5kIGVtcHR5XG4nCisgICAgICAgICAgICAgJ3N0cmluZ3MgYW5kIGNvbnRhaW5lcnMgKGluY2x1ZGluZyBzdHJpbmdzLCB0dXBsZXMsIGxpc3RzLFxuJworICAgICAgICAgICAgICdkaWN0aW9uYXJpZXMsIHNldHMgYW5kIGZyb3plbnNldHMpLiAgQWxsIG90aGVyIHZhbHVlcyBhcmUgJworICAgICAgICAgICAgICdpbnRlcnByZXRlZFxuJworICAgICAgICAgICAgICdhcyB0cnVlLiAgVXNlci1kZWZpbmVkIG9iamVjdHMgY2FuIGN1c3RvbWl6ZSB0aGVpciB0cnV0aCB2YWx1ZSAnCisgICAgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgICAgJ3Byb3ZpZGluZyBhICJfX2Jvb2xfXygpIiBtZXRob2QuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgb3BlcmF0b3IgIm5vdCIgeWllbGRzICJUcnVlIiBpZiBpdHMgYXJndW1lbnQgaXMgZmFsc2UsICcKKyAgICAgICAgICAgICAnIkZhbHNlIlxuJworICAgICAgICAgICAgICdvdGhlcndpc2UuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZXhwcmVzc2lvbiAieCBhbmQgeSIgZmlyc3QgZXZhbHVhdGVzICp4KjsgaWYgKngqIGlzIGZhbHNlLCAnCisgICAgICAgICAgICAgJ2l0c1xuJworICAgICAgICAgICAgICd2YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nICcKKyAgICAgICAgICAgICAndmFsdWVcbicKKyAgICAgICAgICAgICAnaXMgcmV0dXJuZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZXhwcmVzc2lvbiAieCBvciB5IiBmaXJzdCBldmFsdWF0ZXMgKngqOyBpZiAqeCogaXMgdHJ1ZSwgaXRzICcKKyAgICAgICAgICAgICAndmFsdWVcbicKKyAgICAgICAgICAgICAnaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSwgKnkqIGlzIGV2YWx1YXRlZCBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZSAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJ3JldHVybmVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnKE5vdGUgdGhhdCBuZWl0aGVyICJhbmQiIG5vciAib3IiIHJlc3RyaWN0IHRoZSB2YWx1ZSBhbmQgdHlwZSAnCisgICAgICAgICAgICAgJ3RoZXlcbicKKyAgICAgICAgICAgICAncmV0dXJuIHRvICJGYWxzZSIgYW5kICJUcnVlIiwgYnV0IHJhdGhlciByZXR1cm4gdGhlIGxhc3QgJworICAgICAgICAgICAgICdldmFsdWF0ZWRcbicKKyAgICAgICAgICAgICAnYXJndW1lbnQuICBUaGlzIGlzIHNvbWV0aW1lcyB1c2VmdWwsIGUuZy4sIGlmICJzIiBpcyBhIHN0cmluZyAnCisgICAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgICAnc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgZGVmYXVsdCB2YWx1ZSBpZiBpdCBpcyBlbXB0eSwgdGhlICcKKyAgICAgICAgICAgICAnZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICcicyBvciBcJ2Zvb1wnIiB5aWVsZHMgdGhlIGRlc2lyZWQgdmFsdWUuICBCZWNhdXNlICJub3QiIGhhcyB0byAnCisgICAgICAgICAgICAgJ2NyZWF0ZSBhXG4nCisgICAgICAgICAgICAgJ25ldyB2YWx1ZSwgaXQgcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBvZiAnCisgICAgICAgICAgICAgJ2l0c1xuJworICAgICAgICAgICAgICdhcmd1bWVudCAoZm9yIGV4YW1wbGUsICJub3QgXCdmb29cJyIgcHJvZHVjZXMgIkZhbHNlIiByYXRoZXIgJworICAgICAgICAgICAgICd0aGFuICJcJ1wnIi4pXG4nLAorICdicmVhayc6ICdcbicKKyAgICAgICAgICAnVGhlICJicmVhayIgc3RhdGVtZW50XG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgYnJlYWtfc3RtdCA6Oj0gImJyZWFrIlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnImJyZWFrIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhICJmb3IiIG9yICJ3aGlsZSJcbicKKyAgICAgICAgICAnbG9vcCwgYnV0IG5vdCBuZXN0ZWQgaW4gYSBmdW5jdGlvbiBvciBjbGFzcyBkZWZpbml0aW9uIHdpdGhpbiB0aGF0XG4nCisgICAgICAgICAgJ2xvb3AuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJdCB0ZXJtaW5hdGVzIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBsb29wLCBza2lwcGluZyB0aGUgb3B0aW9uYWwgJworICAgICAgICAgICciZWxzZSJcbicKKyAgICAgICAgICAnY2xhdXNlIGlmIHRoZSBsb29wIGhhcyBvbmUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJZiBhICJmb3IiIGxvb3AgaXMgdGVybWluYXRlZCBieSAiYnJlYWsiLCB0aGUgbG9vcCBjb250cm9sIHRhcmdldFxuJworICAgICAgICAgICdrZWVwcyBpdHMgY3VycmVudCB2YWx1ZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1doZW4gImJyZWFrIiBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSAidHJ5IiBzdGF0ZW1lbnQgd2l0aCBhICcKKyAgICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICAgJ2NsYXVzZSwgdGhhdCAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHkgbGVhdmluZyAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICdsb29wLlxuJywKKyAnY2FsbGFibGUtdHlwZXMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgJ0VtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzXG4nCisgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmICcKKyAgICAgICAgICAgICAgICAgICAndGhpcyBtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXMgZGVmaW5lZCwgIngoYXJnMSwgYXJnMiwgLi4uKSIgaXMgYSBzaG9ydGhhbmQgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJ4Ll9fY2FsbF9fKGFyZzEsIGFyZzIsIC4uLikiLlxuJywKKyAnY2FsbHMnOiAnXG4nCisgICAgICAgICAgJ0NhbGxzXG4nCisgICAgICAgICAgJyoqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBIGNhbGwgY2FsbHMgYSBjYWxsYWJsZSBvYmplY3QgKGUuZy4sIGEgKmZ1bmN0aW9uKikgd2l0aCBhICcKKyAgICAgICAgICAncG9zc2libHlcbicKKyAgICAgICAgICAnZW1wdHkgc2VyaWVzIG9mICphcmd1bWVudHMqOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgY2FsbCAgICAgICAgICAgICAgICAgOjo9IHByaW1hcnkgIigiIFthcmd1bWVudF9saXN0IFsiLCJdIHwgJworICAgICAgICAgICdjb21wcmVoZW5zaW9uXSAiKSJcbicKKyAgICAgICAgICAnICAgYXJndW1lbnRfbGlzdCAgICAgICAgOjo9IHBvc2l0aW9uYWxfYXJndW1lbnRzIFsiLCIgJworICAgICAgICAgICdzdGFycmVkX2FuZF9rZXl3b3Jkc11cbicKKyAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICBbIiwiIGtleXdvcmRzX2FyZ3VtZW50c11cbicKKyAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCBzdGFycmVkX2FuZF9rZXl3b3JkcyBbIiwiICcKKyAgICAgICAgICAna2V5d29yZHNfYXJndW1lbnRzXVxuJworICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmRzX2FyZ3VtZW50c1xuJworICAgICAgICAgICcgICBwb3NpdGlvbmFsX2FyZ3VtZW50cyA6Oj0gWyIqIl0gZXhwcmVzc2lvbiAoIiwiIFsiKiJdICcKKyAgICAgICAgICAnZXhwcmVzc2lvbikqXG4nCisgICAgICAgICAgJyAgIHN0YXJyZWRfYW5kX2tleXdvcmRzIDo6PSAoIioiIGV4cHJlc3Npb24gfCBrZXl3b3JkX2l0ZW0pXG4nCisgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIiwiICIqIiBleHByZXNzaW9uIHwgIiwiICcKKyAgICAgICAgICAna2V5d29yZF9pdGVtKSpcbicKKyAgICAgICAgICAnICAga2V5d29yZHNfYXJndW1lbnRzICAgOjo9IChrZXl3b3JkX2l0ZW0gfCAiKioiIGV4cHJlc3Npb24pXG4nCisgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAgKCIsIiBrZXl3b3JkX2l0ZW0gfCAiKioiIGV4cHJlc3Npb24pKlxuJworICAgICAgICAgICcgICBrZXl3b3JkX2l0ZW0gICAgICAgICA6Oj0gaWRlbnRpZmllciAiPSIgZXhwcmVzc2lvblxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQW4gb3B0aW9uYWwgdHJhaWxpbmcgY29tbWEgbWF5IGJlIHByZXNlbnQgYWZ0ZXIgdGhlIHBvc2l0aW9uYWwgYW5kXG4nCisgICAgICAgICAgJ2tleXdvcmQgYXJndW1lbnRzIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbWFudGljcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYSBjYWxsYWJsZSBvYmplY3QgKHVzZXItZGVmaW5lZFxuJworICAgICAgICAgICdmdW5jdGlvbnMsIGJ1aWx0LWluIGZ1bmN0aW9ucywgbWV0aG9kcyBvZiBidWlsdC1pbiBvYmplY3RzLCBjbGFzc1xuJworICAgICAgICAgICdvYmplY3RzLCBtZXRob2RzIG9mIGNsYXNzIGluc3RhbmNlcywgYW5kIGFsbCBvYmplY3RzIGhhdmluZyBhXG4nCisgICAgICAgICAgJyJfX2NhbGxfXygpIiBtZXRob2QgYXJlIGNhbGxhYmxlKS4gIEFsbCBhcmd1bWVudCBleHByZXNzaW9ucyBhcmVcbicKKyAgICAgICAgICAnZXZhbHVhdGVkIGJlZm9yZSB0aGUgY2FsbCBpcyBhdHRlbXB0ZWQuICBQbGVhc2UgcmVmZXIgdG8gc2VjdGlvblxuJworICAgICAgICAgICdGdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgdGhlIHN5bnRheCBvZiBmb3JtYWwgKnBhcmFtZXRlciogbGlzdHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgcHJlc2VudCwgdGhleSBhcmUgZmlyc3QgY29udmVydGVkIHRvXG4nCisgICAgICAgICAgJ3Bvc2l0aW9uYWwgYXJndW1lbnRzLCBhcyBmb2xsb3dzLiAgRmlyc3QsIGEgbGlzdCBvZiB1bmZpbGxlZCBzbG90cyAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJ2NyZWF0ZWQgZm9yIHRoZSBmb3JtYWwgcGFyYW1ldGVycy4gIElmIHRoZXJlIGFyZSBOIHBvc2l0aW9uYWxcbicKKyAgICAgICAgICAnYXJndW1lbnRzLCB0aGV5IGFyZSBwbGFjZWQgaW4gdGhlIGZpcnN0IE4gc2xvdHMuICBOZXh0LCBmb3IgZWFjaFxuJworICAgICAgICAgICdrZXl3b3JkIGFyZ3VtZW50LCB0aGUgaWRlbnRpZmllciBpcyB1c2VkIHRvIGRldGVybWluZSB0aGVcbicKKyAgICAgICAgICAnY29ycmVzcG9uZGluZyBzbG90IChpZiB0aGUgaWRlbnRpZmllciBpcyB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgJworICAgICAgICAgICdmb3JtYWxcbicKKyAgICAgICAgICAncGFyYW1ldGVyIG5hbWUsIHRoZSBmaXJzdCBzbG90IGlzIHVzZWQsIGFuZCBzbyBvbikuICBJZiB0aGUgc2xvdCAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJ2FscmVhZHkgZmlsbGVkLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuIE90aGVyd2lzZSwgdGhlXG4nCisgICAgICAgICAgJ3ZhbHVlIG9mIHRoZSBhcmd1bWVudCBpcyBwbGFjZWQgaW4gdGhlIHNsb3QsIGZpbGxpbmcgaXQgKGV2ZW4gaWYgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnZXhwcmVzc2lvbiBpcyAiTm9uZSIsIGl0IGZpbGxzIHRoZSBzbG90KS4gIFdoZW4gYWxsIGFyZ3VtZW50cyBoYXZlXG4nCisgICAgICAgICAgJ2JlZW4gcHJvY2Vzc2VkLCB0aGUgc2xvdHMgdGhhdCBhcmUgc3RpbGwgdW5maWxsZWQgYXJlIGZpbGxlZCB3aXRoICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJ2NvcnJlc3BvbmRpbmcgZGVmYXVsdCB2YWx1ZSBmcm9tIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgJworICAgICAgICAgICcoRGVmYXVsdFxuJworICAgICAgICAgICd2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQsIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQ7IHRodXMsIGFcbicKKyAgICAgICAgICAnbXV0YWJsZSBvYmplY3Qgc3VjaCBhcyBhIGxpc3Qgb3IgZGljdGlvbmFyeSB1c2VkIGFzIGRlZmF1bHQgdmFsdWUgJworICAgICAgICAgICd3aWxsXG4nCisgICAgICAgICAgImJlIHNoYXJlZCBieSBhbGwgY2FsbHMgdGhhdCBkb24ndCBzcGVjaWZ5IGFuIGFyZ3VtZW50IHZhbHVlIGZvciAiCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICdjb3JyZXNwb25kaW5nIHNsb3Q7IHRoaXMgc2hvdWxkIHVzdWFsbHkgYmUgYXZvaWRlZC4pICBJZiB0aGVyZSBhcmUgJworICAgICAgICAgICdhbnlcbicKKyAgICAgICAgICAndW5maWxsZWQgc2xvdHMgZm9yIHdoaWNoIG5vIGRlZmF1bHQgdmFsdWUgaXMgc3BlY2lmaWVkLCBhICcKKyAgICAgICAgICAnIlR5cGVFcnJvciJcbicKKyAgICAgICAgICAnZXhjZXB0aW9uIGlzIHJhaXNlZC4gIE90aGVyd2lzZSwgdGhlIGxpc3Qgb2YgZmlsbGVkIHNsb3RzIGlzIHVzZWQgJworICAgICAgICAgICdhc1xuJworICAgICAgICAgICd0aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIGNhbGwuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEFuIGltcGxlbWVudGF0aW9uIG1heSBwcm92aWRlXG4nCisgICAgICAgICAgJ2J1aWx0LWluIGZ1bmN0aW9ucyB3aG9zZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgZG8gbm90IGhhdmUgbmFtZXMsICcKKyAgICAgICAgICAnZXZlblxuJworICAgICAgICAgICJpZiB0aGV5IGFyZSAnbmFtZWQnIGZvciB0aGUgcHVycG9zZSBvZiBkb2N1bWVudGF0aW9uLCBhbmQgd2hpY2hcbiIKKyAgICAgICAgICAndGhlcmVmb3JlIGNhbm5vdCBiZSBzdXBwbGllZCBieSBrZXl3b3JkLiAgSW4gQ1B5dGhvbiwgdGhpcyBpcyB0aGUgJworICAgICAgICAgICdjYXNlXG4nCisgICAgICAgICAgJ2ZvciBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gQyB0aGF0IHVzZSAiUHlBcmdfUGFyc2VUdXBsZSgpIiB0byAnCisgICAgICAgICAgJ3BhcnNlXG4nCisgICAgICAgICAgJ3RoZWlyIGFyZ3VtZW50cy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0lmIHRoZXJlIGFyZSBtb3JlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhlcmUgYXJlIGZvcm1hbCAnCisgICAgICAgICAgJ3BhcmFtZXRlclxuJworICAgICAgICAgICdzbG90cywgYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLCB1bmxlc3MgYSBmb3JtYWwgJworICAgICAgICAgICdwYXJhbWV0ZXJcbicKKyAgICAgICAgICAndXNpbmcgdGhlIHN5bnRheCAiKmlkZW50aWZpZXIiIGlzIHByZXNlbnQ7IGluIHRoaXMgY2FzZSwgdGhhdCAnCisgICAgICAgICAgJ2Zvcm1hbFxuJworICAgICAgICAgICdwYXJhbWV0ZXIgcmVjZWl2ZXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBleGNlc3MgcG9zaXRpb25hbCAnCisgICAgICAgICAgJ2FyZ3VtZW50c1xuJworICAgICAgICAgICcob3IgYW4gZW1wdHkgdHVwbGUgaWYgdGhlcmUgd2VyZSBubyBleGNlc3MgcG9zaXRpb25hbCBhcmd1bWVudHMpLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSWYgYW55IGtleXdvcmQgYXJndW1lbnQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIGZvcm1hbCBwYXJhbWV0ZXJcbicKKyAgICAgICAgICAnbmFtZSwgYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLCB1bmxlc3MgYSBmb3JtYWwgcGFyYW1ldGVyXG4nCisgICAgICAgICAgJ3VzaW5nIHRoZSBzeW50YXggIioqaWRlbnRpZmllciIgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0ICcKKyAgICAgICAgICAnZm9ybWFsXG4nCisgICAgICAgICAgJ3BhcmFtZXRlciByZWNlaXZlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgZXhjZXNzIGtleXdvcmRcbicKKyAgICAgICAgICAnYXJndW1lbnRzICh1c2luZyB0aGUga2V5d29yZHMgYXMga2V5cyBhbmQgdGhlIGFyZ3VtZW50IHZhbHVlcyBhc1xuJworICAgICAgICAgICdjb3JyZXNwb25kaW5nIHZhbHVlcyksIG9yIGEgKG5ldykgZW1wdHkgZGljdGlvbmFyeSBpZiB0aGVyZSB3ZXJlICcKKyAgICAgICAgICAnbm9cbicKKyAgICAgICAgICAnZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSWYgdGhlIHN5bnRheCAiKmV4cHJlc3Npb24iIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsICcKKyAgICAgICAgICAnImV4cHJlc3Npb24iXG4nCisgICAgICAgICAgJ211c3QgZXZhbHVhdGUgdG8gYW4gKml0ZXJhYmxlKi4gIEVsZW1lbnRzIGZyb20gdGhlc2UgaXRlcmFibGVzIGFyZVxuJworICAgICAgICAgICd0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZSBhZGRpdGlvbmFsIHBvc2l0aW9uYWwgYXJndW1lbnRzLiAgRm9yIHRoZSAnCisgICAgICAgICAgJ2NhbGxcbicKKyAgICAgICAgICAnImYoeDEsIHgyLCAqeSwgeDMsIHg0KSIsIGlmICp5KiBldmFsdWF0ZXMgdG8gYSBzZXF1ZW5jZSAqeTEqLCAuLi4sXG4nCisgICAgICAgICAgJyp5TSosIHRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGNhbGwgd2l0aCBNKzQgcG9zaXRpb25hbCBhcmd1bWVudHMgJworICAgICAgICAgICcqeDEqLFxuJworICAgICAgICAgICcqeDIqLCAqeTEqLCAuLi4sICp5TSosICp4MyosICp4NCouXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBIGNvbnNlcXVlbmNlIG9mIHRoaXMgaXMgdGhhdCBhbHRob3VnaCB0aGUgIipleHByZXNzaW9uIiBzeW50YXggJworICAgICAgICAgICdtYXlcbicKKyAgICAgICAgICAnYXBwZWFyICphZnRlciogZXhwbGljaXQga2V5d29yZCBhcmd1bWVudHMsIGl0IGlzIHByb2Nlc3NlZCAnCisgICAgICAgICAgJypiZWZvcmUqXG4nCisgICAgICAgICAgJ3RoZSBrZXl3b3JkIGFyZ3VtZW50cyAoYW5kIGFueSAiKipleHByZXNzaW9uIiBhcmd1bWVudHMgLS0gc2VlICcKKyAgICAgICAgICAnYmVsb3cpLlxuJworICAgICAgICAgICdTbzpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgID4+PiBkZWYgZihhLCBiKTpcbicKKyAgICAgICAgICAnICAgLi4uICAgICBwcmludChhLCBiKVxuJworICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAnICAgPj4+IGYoYj0xLCAqKDIsKSlcbicKKyAgICAgICAgICAnICAgMiAxXG4nCisgICAgICAgICAgJyAgID4+PiBmKGE9MSwgKigyLCkpXG4nCisgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAnICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/XG4nCisgICAgICAgICAgIiAgIFR5cGVFcnJvcjogZigpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJndW1lbnQgJ2EnXG4iCisgICAgICAgICAgJyAgID4+PiBmKDEsICooMiwpKVxuJworICAgICAgICAgICcgICAxIDJcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0l0IGlzIHVudXN1YWwgZm9yIGJvdGgga2V5d29yZCBhcmd1bWVudHMgYW5kIHRoZSAiKmV4cHJlc3Npb24iICcKKyAgICAgICAgICAnc3ludGF4XG4nCisgICAgICAgICAgJ3RvIGJlIHVzZWQgaW4gdGhlIHNhbWUgY2FsbCwgc28gaW4gcHJhY3RpY2UgdGhpcyBjb25mdXNpb24gZG9lcyAnCisgICAgICAgICAgJ25vdFxuJworICAgICAgICAgICdhcmlzZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0lmIHRoZSBzeW50YXggIioqZXhwcmVzc2lvbiIgYXBwZWFycyBpbiB0aGUgZnVuY3Rpb24gY2FsbCxcbicKKyAgICAgICAgICAnImV4cHJlc3Npb24iIG11c3QgZXZhbHVhdGUgdG8gYSAqbWFwcGluZyosIHRoZSBjb250ZW50cyBvZiB3aGljaCAnCisgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICd0cmVhdGVkIGFzIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMuICBJZiBhIGtleXdvcmQgaXMgYWxyZWFkeVxuJworICAgICAgICAgICdwcmVzZW50IChhcyBhbiBleHBsaWNpdCBrZXl3b3JkIGFyZ3VtZW50LCBvciBmcm9tIGFub3RoZXIgJworICAgICAgICAgICd1bnBhY2tpbmcpLFxuJworICAgICAgICAgICdhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdGb3JtYWwgcGFyYW1ldGVycyB1c2luZyB0aGUgc3ludGF4ICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciJcbicKKyAgICAgICAgICAnY2Fubm90IGJlIHVzZWQgYXMgcG9zaXRpb25hbCBhcmd1bWVudCBzbG90cyBvciBhcyBrZXl3b3JkIGFyZ3VtZW50XG4nCisgICAgICAgICAgJ25hbWVzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNTogRnVuY3Rpb24gY2FsbHMgYWNjZXB0IGFueSBudW1iZXIgb2YgIioiICcKKyAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgJyIqKiIgdW5wYWNraW5ncywgcG9zaXRpb25hbCBhcmd1bWVudHMgbWF5IGZvbGxvdyBpdGVyYWJsZSAnCisgICAgICAgICAgJ3VucGFja2luZ3NcbicKKyAgICAgICAgICAnKCIqIiksIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyBtYXkgZm9sbG93IGRpY3Rpb25hcnkgdW5wYWNraW5ncyAnCisgICAgICAgICAgJygiKioiKS5cbicKKyAgICAgICAgICAnT3JpZ2luYWxseSBwcm9wb3NlZCBieSAqKlBFUCA0NDgqKi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgY2FsbCBhbHdheXMgcmV0dXJucyBzb21lIHZhbHVlLCBwb3NzaWJseSAiTm9uZSIsIHVubGVzcyBpdCByYWlzZXMgJworICAgICAgICAgICdhblxuJworICAgICAgICAgICdleGNlcHRpb24uICBIb3cgdGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZVxuJworICAgICAgICAgICdjYWxsYWJsZSBvYmplY3QuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJZiBpdCBpcy0tLVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnYSB1c2VyLWRlZmluZWQgZnVuY3Rpb246XG4nCisgICAgICAgICAgJyAgIFRoZSBjb2RlIGJsb2NrIGZvciB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQsIHBhc3NpbmcgaXQgdGhlXG4nCisgICAgICAgICAgJyAgIGFyZ3VtZW50IGxpc3QuICBUaGUgZmlyc3QgdGhpbmcgdGhlIGNvZGUgYmxvY2sgd2lsbCBkbyBpcyBiaW5kICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgIGZvcm1hbCBwYXJhbWV0ZXJzIHRvIHRoZSBhcmd1bWVudHM7IHRoaXMgaXMgZGVzY3JpYmVkIGluICcKKyAgICAgICAgICAnc2VjdGlvblxuJworICAgICAgICAgICcgICBGdW5jdGlvbiBkZWZpbml0aW9ucy4gIFdoZW4gdGhlIGNvZGUgYmxvY2sgZXhlY3V0ZXMgYSAicmV0dXJuIlxuJworICAgICAgICAgICcgICBzdGF0ZW1lbnQsIHRoaXMgc3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uICcKKyAgICAgICAgICAnY2FsbC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ2EgYnVpbHQtaW4gZnVuY3Rpb24gb3IgbWV0aG9kOlxuJworICAgICAgICAgICcgICBUaGUgcmVzdWx0IGlzIHVwIHRvIHRoZSBpbnRlcnByZXRlcjsgc2VlIEJ1aWx0LWluIEZ1bmN0aW9ucyBmb3IgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgZGVzY3JpcHRpb25zIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ2EgY2xhc3Mgb2JqZWN0OlxuJworICAgICAgICAgICcgICBBIG5ldyBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIGlzIHJldHVybmVkLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnYSBjbGFzcyBpbnN0YW5jZSBtZXRob2Q6XG4nCisgICAgICAgICAgJyAgIFRoZSBjb3JyZXNwb25kaW5nIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBpcyBjYWxsZWQsIHdpdGggYW4gJworICAgICAgICAgICdhcmd1bWVudFxuJworICAgICAgICAgICcgICBsaXN0IHRoYXQgaXMgb25lIGxvbmdlciB0aGFuIHRoZSBhcmd1bWVudCBsaXN0IG9mIHRoZSBjYWxsOiB0aGVcbicKKyAgICAgICAgICAnICAgaW5zdGFuY2UgYmVjb21lcyB0aGUgZmlyc3QgYXJndW1lbnQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdhIGNsYXNzIGluc3RhbmNlOlxuJworICAgICAgICAgICcgICBUaGUgY2xhc3MgbXVzdCBkZWZpbmUgYSAiX19jYWxsX18oKSIgbWV0aG9kOyB0aGUgZWZmZWN0IGlzIHRoZW4gJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgc2FtZSBhcyBpZiB0aGF0IG1ldGhvZCB3YXMgY2FsbGVkLlxuJywKKyAnY2xhc3MnOiAnXG4nCisgICAgICAgICAgJ0NsYXNzIGRlZmluaXRpb25zXG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gVGhlICcKKyAgICAgICAgICAnc3RhbmRhcmRcbicKKyAgICAgICAgICAndHlwZSBoaWVyYXJjaHkpOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgY2xhc3NkZWYgICAgOjo9IFtkZWNvcmF0b3JzXSAiY2xhc3MiIGNsYXNzbmFtZSBbaW5oZXJpdGFuY2VdICI6IiAnCisgICAgICAgICAgJ3N1aXRlXG4nCisgICAgICAgICAgJyAgIGluaGVyaXRhbmNlIDo6PSAiKCIgW2FyZ3VtZW50X2xpc3RdICIpIlxuJworICAgICAgICAgICcgICBjbGFzc25hbWUgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgVGhlIGluaGVyaXRhbmNlICcKKyAgICAgICAgICAnbGlzdFxuJworICAgICAgICAgICd1c3VhbGx5IGdpdmVzIGEgbGlzdCBvZiBiYXNlIGNsYXNzZXMgKHNlZSBNZXRhY2xhc3NlcyBmb3IgbW9yZVxuJworICAgICAgICAgICdhZHZhbmNlZCB1c2VzKSwgc28gZWFjaCBpdGVtIGluIHRoZSBsaXN0IHNob3VsZCBldmFsdWF0ZSB0byBhICcKKyAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAnb2JqZWN0IHdoaWNoIGFsbG93cyBzdWJjbGFzc2luZy4gIENsYXNzZXMgd2l0aG91dCBhbiBpbmhlcml0YW5jZSAnCisgICAgICAgICAgJ2xpc3RcbicKKyAgICAgICAgICAnaW5oZXJpdCwgYnkgZGVmYXVsdCwgZnJvbSB0aGUgYmFzZSBjbGFzcyAib2JqZWN0IjsgaGVuY2UsXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBjbGFzcyBGb286XG4nCisgICAgICAgICAgJyAgICAgICBwYXNzXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdpcyBlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBjbGFzcyBGb28ob2JqZWN0KTpcbicKKyAgICAgICAgICAnICAgICAgIHBhc3NcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgIlRoZSBjbGFzcydzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgaW4gYSBuZXcgZXhlY3V0aW9uIGZyYW1lIChzZWVcbiIKKyAgICAgICAgICAnTmFtaW5nIGFuZCBiaW5kaW5nKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsIG5hbWVzcGFjZSBhbmQgdGhlXG4nCisgICAgICAgICAgJ29yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUgY29udGFpbnMgbW9zdGx5XG4nCisgICAgICAgICAgImZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNzJ3Mgc3VpdGUgZmluaXNoZXMgZXhlY3V0aW9uLCAiCisgICAgICAgICAgJ2l0c1xuJworICAgICAgICAgICdleGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzIHNhdmVkLiBbNF0gJworICAgICAgICAgICdBXG4nCisgICAgICAgICAgJ2NsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3QgZm9yIHRoZSAnCisgICAgICAgICAgJ2Jhc2VcbicKKyAgICAgICAgICAnY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgJ2RpY3Rpb25hcnkuXG4nCisgICAgICAgICAgJ1RoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZSBvcmlnaW5hbCBsb2NhbFxuJworICAgICAgICAgICduYW1lc3BhY2UuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdDbGFzcyBjcmVhdGlvbiBjYW4gYmUgY3VzdG9taXplZCBoZWF2aWx5IHVzaW5nIG1ldGFjbGFzc2VzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQ2xhc3NlcyBjYW4gYWxzbyBiZSBkZWNvcmF0ZWQ6IGp1c3QgbGlrZSB3aGVuIGRlY29yYXRpbmcgJworICAgICAgICAgICdmdW5jdGlvbnMsXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBAZjEoYXJnKVxuJworICAgICAgICAgICcgICBAZjJcbicKKyAgICAgICAgICAnICAgY2xhc3MgRm9vOiBwYXNzXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIGNsYXNzIEZvbzogcGFzc1xuJworICAgICAgICAgICcgICBGb28gPSBmMShhcmcpKGYyKEZvbykpXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgZXZhbHVhdGlvbiBydWxlcyBmb3IgdGhlIGRlY29yYXRvciBleHByZXNzaW9ucyBhcmUgdGhlIHNhbWUgYXMgJworICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAnZnVuY3Rpb24gZGVjb3JhdG9ycy4gIFRoZSByZXN1bHQgaXMgdGhlbiBib3VuZCB0byB0aGUgY2xhc3MgbmFtZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgIioqUHJvZ3JhbW1lcidzIG5vdGU6KiogVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gIgorICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAnY2xhc3MgYXR0cmlidXRlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGluc3RhbmNlcy4gIEluc3RhbmNlICcKKyAgICAgICAgICAnYXR0cmlidXRlc1xuJworICAgICAgICAgICdjYW4gYmUgc2V0IGluIGEgbWV0aG9kIHdpdGggInNlbGYubmFtZSA9IHZhbHVlIi4gIEJvdGggY2xhc3MgYW5kXG4nCisgICAgICAgICAgJ2luc3RhbmNlIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb24gJworICAgICAgICAgICciInNlbGYubmFtZSIiLFxuJworICAgICAgICAgICdhbmQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGhpZGVzIGEgY2xhc3MgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgJworICAgICAgICAgICduYW1lXG4nCisgICAgICAgICAgJ3doZW4gYWNjZXNzZWQgaW4gdGhpcyB3YXkuICBDbGFzcyBhdHRyaWJ1dGVzIGNhbiBiZSB1c2VkIGFzICcKKyAgICAgICAgICAnZGVmYXVsdHNcbicKKyAgICAgICAgICAnZm9yIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4gbGVhZCAnCisgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgJ3VuZXhwZWN0ZWQgcmVzdWx0cy4gIERlc2NyaXB0b3JzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZVxuJworICAgICAgICAgICd2YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1NlZSBhbHNvOiAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMyAqKlBFUCAzMTI5KiogLVxuJworICAgICAgICAgICcgIENsYXNzIERlY29yYXRvcnNcbicsCisgJ2NvbXBhcmlzb25zJzogJ1xuJworICAgICAgICAgICAgICAgICdDb21wYXJpc29uc1xuJworICAgICAgICAgICAgICAgICcqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICdwcmlvcml0eSxcbicKKyAgICAgICAgICAgICAgICAnd2hpY2ggaXMgbG93ZXIgdGhhbiB0aGF0IG9mIGFueSBhcml0aG1ldGljLCBzaGlmdGluZyBvciAnCisgICAgICAgICAgICAgICAgJ2JpdHdpc2VcbicKKyAgICAgICAgICAgICAgICAnb3BlcmF0aW9uLiAgQWxzbyB1bmxpa2UgQywgZXhwcmVzc2lvbnMgbGlrZSAiYSA8IGIgPCBjIiBoYXZlICcKKyAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgJ2ludGVycHJldGF0aW9uIHRoYXQgaXMgY29udmVudGlvbmFsIGluIG1hdGhlbWF0aWNzOlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgY29tcGFyaXNvbiAgICA6Oj0gb3JfZXhwciAoIGNvbXBfb3BlcmF0b3Igb3JfZXhwciApKlxuJworICAgICAgICAgICAgICAgICcgICBjb21wX29wZXJhdG9yIDo6PSAiPCIgfCAiPiIgfCAiPT0iIHwgIj49IiB8ICI8PSIgfCAiIT0iXG4nCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdDb21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogIlRydWUiIG9yICJGYWxzZSIuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdDb21wYXJpc29ucyBjYW4gYmUgY2hhaW5lZCBhcmJpdHJhcmlseSwgZS5nLiwgInggPCB5IDw9IHoiICcKKyAgICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgICAnZXF1aXZhbGVudCB0byAieCA8IHkgYW5kIHkgPD0geiIsIGV4Y2VwdCB0aGF0ICJ5IiBpcyAnCisgICAgICAgICAgICAgICAgJ2V2YWx1YXRlZCBvbmx5XG4nCisgICAgICAgICAgICAgICAgJ29uY2UgKGJ1dCBpbiBib3RoIGNhc2VzICJ6IiBpcyBub3QgZXZhbHVhdGVkIGF0IGFsbCB3aGVuICJ4IDwgJworICAgICAgICAgICAgICAgICd5IiBpc1xuJworICAgICAgICAgICAgICAgICdmb3VuZCB0byBiZSBmYWxzZSkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdGb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwgLi4uLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICcKKyAgICAgICAgICAgICAgICAnKm9wMSosXG4nCisgICAgICAgICAgICAgICAgJypvcDIqLCAuLi4sICpvcE4qIGFyZSBjb21wYXJpc29uIG9wZXJhdG9ycywgdGhlbiAiYSBvcDEgYiBvcDIgJworICAgICAgICAgICAgICAgICdjIC4uLiB5XG4nCisgICAgICAgICAgICAgICAgJ29wTiB6IiBpcyBlcXVpdmFsZW50IHRvICJhIG9wMSBiIGFuZCBiIG9wMiBjIGFuZCAuLi4geSBvcE4gJworICAgICAgICAgICAgICAgICd6IiwgZXhjZXB0XG4nCisgICAgICAgICAgICAgICAgJ3RoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdOb3RlIHRoYXQgImEgb3AxIGIgb3AyIGMiIGRvZXNuXCd0IGltcGx5IGFueSBraW5kIG9mICcKKyAgICAgICAgICAgICAgICAnY29tcGFyaXNvbiBiZXR3ZWVuXG4nCisgICAgICAgICAgICAgICAgJyphKiBhbmQgKmMqLCBzbyB0aGF0LCBlLmcuLCAieCA8IHkgPiB6IiBpcyBwZXJmZWN0bHkgbGVnYWwgJworICAgICAgICAgICAgICAgICcodGhvdWdoXG4nCisgICAgICAgICAgICAgICAgJ3BlcmhhcHMgbm90IHByZXR0eSkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVmFsdWUgY29tcGFyaXNvbnNcbicKKyAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1RoZSBvcGVyYXRvcnMgIjwiLCAiPiIsICI9PSIsICI+PSIsICI8PSIsIGFuZCAiIT0iIGNvbXBhcmUgJworICAgICAgICAgICAgICAgICd0aGUgdmFsdWVzXG4nCisgICAgICAgICAgICAgICAgJ29mIHR3byBvYmplY3RzLiAgVGhlIG9iamVjdHMgZG8gbm90IG5lZWQgdG8gaGF2ZSB0aGUgc2FtZSAnCisgICAgICAgICAgICAgICAgJ3R5cGUuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdDaGFwdGVyIE9iamVjdHMsIHZhbHVlcyBhbmQgdHlwZXMgc3RhdGVzIHRoYXQgb2JqZWN0cyBoYXZlIGEgJworICAgICAgICAgICAgICAgICd2YWx1ZSAoaW5cbicKKyAgICAgICAgICAgICAgICAnYWRkaXRpb24gdG8gdHlwZSBhbmQgaWRlbnRpdHkpLiAgVGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpcyBhICcKKyAgICAgICAgICAgICAgICAncmF0aGVyXG4nCisgICAgICAgICAgICAgICAgJ2Fic3RyYWN0IG5vdGlvbiBpbiBQeXRob246IEZvciBleGFtcGxlLCB0aGVyZSBpcyBubyBjYW5vbmljYWwgJworICAgICAgICAgICAgICAgICdhY2Nlc3NcbicKKyAgICAgICAgICAgICAgICAibWV0aG9kIGZvciBhbiBvYmplY3QncyB2YWx1ZS4gIEFsc28sIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50ICIKKyAgICAgICAgICAgICAgICAndGhhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAndmFsdWUgb2YgYW4gb2JqZWN0IHNob3VsZCBiZSBjb25zdHJ1Y3RlZCBpbiBhIHBhcnRpY3VsYXIgd2F5LCAnCisgICAgICAgICAgICAgICAgJ2UuZy5cbicKKyAgICAgICAgICAgICAgICAnY29tcHJpc2VkIG9mIGFsbCBpdHMgZGF0YSBhdHRyaWJ1dGVzLiBDb21wYXJpc29uIG9wZXJhdG9ycyAnCisgICAgICAgICAgICAgICAgJ2ltcGxlbWVudCBhXG4nCisgICAgICAgICAgICAgICAgJ3BhcnRpY3VsYXIgbm90aW9uIG9mIHdoYXQgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpcy4gIE9uZSBjYW4gJworICAgICAgICAgICAgICAgICd0aGluayBvZlxuJworICAgICAgICAgICAgICAgICd0aGVtIGFzIGRlZmluaW5nIHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgaW5kaXJlY3RseSwgYnkgbWVhbnMgJworICAgICAgICAgICAgICAgICdvZiB0aGVpclxuJworICAgICAgICAgICAgICAgICdjb21wYXJpc29uIGltcGxlbWVudGF0aW9uLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQmVjYXVzZSBhbGwgdHlwZXMgYXJlIChkaXJlY3Qgb3IgaW5kaXJlY3QpIHN1YnR5cGVzIG9mICcKKyAgICAgICAgICAgICAgICAnIm9iamVjdCIsIHRoZXlcbicKKyAgICAgICAgICAgICAgICAnaW5oZXJpdCB0aGUgZGVmYXVsdCBjb21wYXJpc29uIGJlaGF2aW9yIGZyb20gIm9iamVjdCIuICBUeXBlcyAnCisgICAgICAgICAgICAgICAgJ2NhblxuJworICAgICAgICAgICAgICAgICdjdXN0b21pemUgdGhlaXIgY29tcGFyaXNvbiBiZWhhdmlvciBieSBpbXBsZW1lbnRpbmcgKnJpY2ggJworICAgICAgICAgICAgICAgICdjb21wYXJpc29uXG4nCisgICAgICAgICAgICAgICAgJ21ldGhvZHMqIGxpa2UgIl9fbHRfXygpIiwgZGVzY3JpYmVkIGluIEJhc2ljIGN1c3RvbWl6YXRpb24uXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbiAoIj09IiBhbmQgIiE9IikgJworICAgICAgICAgICAgICAgICdpcyBiYXNlZFxuJworICAgICAgICAgICAgICAgICdvbiB0aGUgaWRlbnRpdHkgb2YgdGhlIG9iamVjdHMuICBIZW5jZSwgZXF1YWxpdHkgY29tcGFyaXNvbiAnCisgICAgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgICAgJ2luc3RhbmNlcyB3aXRoIHRoZSBzYW1lIGlkZW50aXR5IHJlc3VsdHMgaW4gZXF1YWxpdHksIGFuZCAnCisgICAgICAgICAgICAgICAgJ2VxdWFsaXR5XG4nCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gb2YgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGlkZW50aXRpZXMgcmVzdWx0cyBpblxuJworICAgICAgICAgICAgICAgICdpbmVxdWFsaXR5LiAgQSBtb3RpdmF0aW9uIGZvciB0aGlzIGRlZmF1bHQgYmVoYXZpb3IgaXMgdGhlICcKKyAgICAgICAgICAgICAgICAnZGVzaXJlIHRoYXRcbicKKyAgICAgICAgICAgICAgICAnYWxsIG9iamVjdHMgc2hvdWxkIGJlIHJlZmxleGl2ZSAoaS5lLiAieCBpcyB5IiBpbXBsaWVzICJ4ID09ICcKKyAgICAgICAgICAgICAgICAneSIpLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQSBkZWZhdWx0IG9yZGVyIGNvbXBhcmlzb24gKCI8IiwgIj4iLCAiPD0iLCBhbmQgIj49IikgaXMgbm90ICcKKyAgICAgICAgICAgICAgICAncHJvdmlkZWQ7XG4nCisgICAgICAgICAgICAgICAgJ2FuIGF0dGVtcHQgcmFpc2VzICJUeXBlRXJyb3IiLiAgQSBtb3RpdmF0aW9uIGZvciB0aGlzIGRlZmF1bHQgJworICAgICAgICAgICAgICAgICdiZWhhdmlvclxuJworICAgICAgICAgICAgICAgICdpcyB0aGUgbGFjayBvZiBhIHNpbWlsYXIgaW52YXJpYW50IGFzIGZvciBlcXVhbGl0eS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1RoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBlcXVhbGl0eSBjb21wYXJpc29uLCB0aGF0ICcKKyAgICAgICAgICAgICAgICAnaW5zdGFuY2VzIHdpdGhcbicKKyAgICAgICAgICAgICAgICAnZGlmZmVyZW50IGlkZW50aXRpZXMgYXJlIGFsd2F5cyB1bmVxdWFsLCBtYXkgYmUgaW4gY29udHJhc3QgJworICAgICAgICAgICAgICAgICd0byB3aGF0XG4nCisgICAgICAgICAgICAgICAgJ3R5cGVzIHdpbGwgbmVlZCB0aGF0IGhhdmUgYSBzZW5zaWJsZSBkZWZpbml0aW9uIG9mIG9iamVjdCAnCisgICAgICAgICAgICAgICAgJ3ZhbHVlIGFuZFxuJworICAgICAgICAgICAgICAgICd2YWx1ZS1iYXNlZCBlcXVhbGl0eS4gIFN1Y2ggdHlwZXMgd2lsbCBuZWVkIHRvIGN1c3RvbWl6ZSAnCisgICAgICAgICAgICAgICAgJ3RoZWlyXG4nCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gYmVoYXZpb3IsIGFuZCBpbiBmYWN0LCBhIG51bWJlciBvZiBidWlsdC1pbiB0eXBlcyAnCisgICAgICAgICAgICAgICAgJ2hhdmUgZG9uZVxuJworICAgICAgICAgICAgICAgICd0aGF0LlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBsaXN0IGRlc2NyaWJlcyB0aGUgY29tcGFyaXNvbiBiZWhhdmlvciBvZiB0aGUgJworICAgICAgICAgICAgICAgICdtb3N0XG4nCisgICAgICAgICAgICAgICAgJ2ltcG9ydGFudCBidWlsdC1pbiB0eXBlcy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogTnVtYmVycyBvZiBidWlsdC1pbiBudW1lcmljIHR5cGVzIChOdW1lcmljIFR5cGVzIC0tLSBpbnQsICcKKyAgICAgICAgICAgICAgICAnZmxvYXQsXG4nCisgICAgICAgICAgICAgICAgJyAgY29tcGxleCkgYW5kIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHR5cGVzICcKKyAgICAgICAgICAgICAgICAnImZyYWN0aW9ucy5GcmFjdGlvbiIgYW5kXG4nCisgICAgICAgICAgICAgICAgJyAgImRlY2ltYWwuRGVjaW1hbCIgY2FuIGJlIGNvbXBhcmVkIHdpdGhpbiBhbmQgYWNyb3NzIHRoZWlyICcKKyAgICAgICAgICAgICAgICAndHlwZXMsXG4nCisgICAgICAgICAgICAgICAgJyAgd2l0aCB0aGUgcmVzdHJpY3Rpb24gdGhhdCBjb21wbGV4IG51bWJlcnMgZG8gbm90IHN1cHBvcnQgJworICAgICAgICAgICAgICAgICdvcmRlclxuJworICAgICAgICAgICAgICAgICcgIGNvbXBhcmlzb24uICBXaXRoaW4gdGhlIGxpbWl0cyBvZiB0aGUgdHlwZXMgaW52b2x2ZWQsIHRoZXkgJworICAgICAgICAgICAgICAgICdjb21wYXJlXG4nCisgICAgICAgICAgICAgICAgJyAgbWF0aGVtYXRpY2FsbHkgKGFsZ29yaXRobWljYWxseSkgY29ycmVjdCB3aXRob3V0IGxvc3Mgb2YgJworICAgICAgICAgICAgICAgICdwcmVjaXNpb24uXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgIFRoZSBub3QtYS1udW1iZXIgdmFsdWVzICJmbG9hdChcJ05hTlwnKSIgYW5kICcKKyAgICAgICAgICAgICAgICAnIkRlY2ltYWwoXCdOYU5cJykiIGFyZVxuJworICAgICAgICAgICAgICAgICcgIHNwZWNpYWwuICBUaGV5IGFyZSBpZGVudGljYWwgdG8gdGhlbXNlbHZlcyAoInggaXMgeCIgaXMgJworICAgICAgICAgICAgICAgICd0cnVlKSBidXRcbicKKyAgICAgICAgICAgICAgICAnICBhcmUgbm90IGVxdWFsIHRvIHRoZW1zZWx2ZXMgKCJ4ID09IHgiIGlzIGZhbHNlKS4gICcKKyAgICAgICAgICAgICAgICAnQWRkaXRpb25hbGx5LFxuJworICAgICAgICAgICAgICAgICcgIGNvbXBhcmluZyBhbnkgbnVtYmVyIHRvIGEgbm90LWEtbnVtYmVyIHZhbHVlIHdpbGwgcmV0dXJuICcKKyAgICAgICAgICAgICAgICAnIkZhbHNlIi5cbicKKyAgICAgICAgICAgICAgICAnICBGb3IgZXhhbXBsZSwgYm90aCAiMyA8IGZsb2F0KFwnTmFOXCcpIiBhbmQgImZsb2F0KFwnTmFOXCcpICcKKyAgICAgICAgICAgICAgICAnPCAzIiB3aWxsXG4nCisgICAgICAgICAgICAgICAgJyAgcmV0dXJuICJGYWxzZSIuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIEJpbmFyeSBzZXF1ZW5jZXMgKGluc3RhbmNlcyBvZiAiYnl0ZXMiIG9yICJieXRlYXJyYXkiKSBjYW4gJworICAgICAgICAgICAgICAgICdiZVxuJworICAgICAgICAgICAgICAgICcgIGNvbXBhcmVkIHdpdGhpbiBhbmQgYWNyb3NzIHRoZWlyIHR5cGVzLiAgVGhleSBjb21wYXJlXG4nCisgICAgICAgICAgICAgICAgJyAgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWMgdmFsdWVzIG9mIHRoZWlyICcKKyAgICAgICAgICAgICAgICAnZWxlbWVudHMuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIFN0cmluZ3MgKGluc3RhbmNlcyBvZiAic3RyIikgY29tcGFyZSBsZXhpY29ncmFwaGljYWxseSAnCisgICAgICAgICAgICAgICAgJ3VzaW5nIHRoZVxuJworICAgICAgICAgICAgICAgICcgIG51bWVyaWNhbCBVbmljb2RlIGNvZGUgcG9pbnRzICh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiAnCisgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgICAgICAgJyAgIm9yZCgpIikgb2YgdGhlaXIgY2hhcmFjdGVycy4gWzNdXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgIFN0cmluZ3MgYW5kIGJpbmFyeSBzZXF1ZW5jZXMgY2Fubm90IGJlIGRpcmVjdGx5IGNvbXBhcmVkLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBTZXF1ZW5jZXMgKGluc3RhbmNlcyBvZiAidHVwbGUiLCAibGlzdCIsIG9yICJyYW5nZSIpIGNhbiAnCisgICAgICAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICAgICAgJyAgY29tcGFyZWQgb25seSB3aXRoaW4gZWFjaCBvZiB0aGVpciB0eXBlcywgd2l0aCB0aGUgJworICAgICAgICAgICAgICAgICdyZXN0cmljdGlvbiB0aGF0XG4nCisgICAgICAgICAgICAgICAgJyAgcmFuZ2VzIGRvIG5vdCBzdXBwb3J0IG9yZGVyIGNvbXBhcmlzb24uICBFcXVhbGl0eSAnCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gYWNyb3NzXG4nCisgICAgICAgICAgICAgICAgJyAgdGhlc2UgdHlwZXMgcmVzdWx0cyBpbiB1bmVxdWFsaXR5LCBhbmQgb3JkZXJpbmcgY29tcGFyaXNvbiAnCisgICAgICAgICAgICAgICAgJ2Fjcm9zc1xuJworICAgICAgICAgICAgICAgICcgIHRoZXNlIHR5cGVzIHJhaXNlcyAiVHlwZUVycm9yIi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgU2VxdWVuY2VzIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgY29tcGFyaXNvbiBvZlxuJworICAgICAgICAgICAgICAgICcgIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMsIHdoZXJlYnkgcmVmbGV4aXZpdHkgb2YgdGhlIGVsZW1lbnRzICcKKyAgICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgICAnICBlbmZvcmNlZC5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgSW4gZW5mb3JjaW5nIHJlZmxleGl2aXR5IG9mIGVsZW1lbnRzLCB0aGUgY29tcGFyaXNvbiBvZiAnCisgICAgICAgICAgICAgICAgJ2NvbGxlY3Rpb25zXG4nCisgICAgICAgICAgICAgICAgJyAgYXNzdW1lcyB0aGF0IGZvciBhIGNvbGxlY3Rpb24gZWxlbWVudCAieCIsICJ4ID09IHgiIGlzICcKKyAgICAgICAgICAgICAgICAnYWx3YXlzIHRydWUuXG4nCisgICAgICAgICAgICAgICAgJyAgQmFzZWQgb24gdGhhdCBhc3N1bXB0aW9uLCBlbGVtZW50IGlkZW50aXR5IGlzIGNvbXBhcmVkICcKKyAgICAgICAgICAgICAgICAnZmlyc3QsIGFuZFxuJworICAgICAgICAgICAgICAgICcgIGVsZW1lbnQgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgb25seSBmb3IgZGlzdGluY3QgJworICAgICAgICAgICAgICAgICdlbGVtZW50cy4gIFRoaXNcbicKKyAgICAgICAgICAgICAgICAnICBhcHByb2FjaCB5aWVsZHMgdGhlIHNhbWUgcmVzdWx0IGFzIGEgc3RyaWN0IGVsZW1lbnQgJworICAgICAgICAgICAgICAgICdjb21wYXJpc29uXG4nCisgICAgICAgICAgICAgICAgJyAgd291bGQsIGlmIHRoZSBjb21wYXJlZCBlbGVtZW50cyBhcmUgcmVmbGV4aXZlLiAgRm9yICcKKyAgICAgICAgICAgICAgICAnbm9uLXJlZmxleGl2ZVxuJworICAgICAgICAgICAgICAgICcgIGVsZW1lbnRzLCB0aGUgcmVzdWx0IGlzIGRpZmZlcmVudCB0aGFuIGZvciBzdHJpY3QgZWxlbWVudFxuJworICAgICAgICAgICAgICAgICcgIGNvbXBhcmlzb24sIGFuZCBtYXkgYmUgc3VycHJpc2luZzogIFRoZSBub24tcmVmbGV4aXZlICcKKyAgICAgICAgICAgICAgICAnbm90LWEtbnVtYmVyXG4nCisgICAgICAgICAgICAgICAgJyAgdmFsdWVzIGZvciBleGFtcGxlIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNvbXBhcmlzb24gJworICAgICAgICAgICAgICAgICdiZWhhdmlvciB3aGVuXG4nCisgICAgICAgICAgICAgICAgJyAgdXNlZCBpbiBhIGxpc3Q6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICIgICAgID4+PiBuYW4gPSBmbG9hdCgnTmFOJylcbiIKKyAgICAgICAgICAgICAgICAnICAgICA+Pj4gbmFuIGlzIG5hblxuJworICAgICAgICAgICAgICAgICcgICAgIFRydWVcbicKKyAgICAgICAgICAgICAgICAnICAgICA+Pj4gbmFuID09IG5hblxuJworICAgICAgICAgICAgICAgICcgICAgIEZhbHNlICAgICAgICAgICAgICAgICA8LS0gdGhlIGRlZmluZWQgbm9uLXJlZmxleGl2ZSAnCisgICAgICAgICAgICAgICAgJ2JlaGF2aW9yIG9mIE5hTlxuJworICAgICAgICAgICAgICAgICcgICAgID4+PiBbbmFuXSA9PSBbbmFuXVxuJworICAgICAgICAgICAgICAgICcgICAgIFRydWUgICAgICAgICAgICAgICAgICA8LS0gbGlzdCBlbmZvcmNlcyByZWZsZXhpdml0eSBhbmQgJworICAgICAgICAgICAgICAgICd0ZXN0cyBpZGVudGl0eSBmaXJzdFxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBMZXhpY29ncmFwaGljYWwgY29tcGFyaXNvbiBiZXR3ZWVuIGJ1aWx0LWluIGNvbGxlY3Rpb25zICcKKyAgICAgICAgICAgICAgICAnd29ya3MgYXNcbicKKyAgICAgICAgICAgICAgICAnICBmb2xsb3dzOlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAqIEZvciB0d28gY29sbGVjdGlvbnMgdG8gY29tcGFyZSBlcXVhbCwgdGhleSBtdXN0IGJlIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgJ3NhbWVcbicKKyAgICAgICAgICAgICAgICAnICAgIHR5cGUsIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgZWFjaCBwYWlyIG9mICcKKyAgICAgICAgICAgICAgICAnY29ycmVzcG9uZGluZ1xuJworICAgICAgICAgICAgICAgICcgICAgZWxlbWVudHMgbXVzdCBjb21wYXJlIGVxdWFsIChmb3IgZXhhbXBsZSwgIlsxLDJdID09ICcKKyAgICAgICAgICAgICAgICAnKDEsMikiIGlzXG4nCisgICAgICAgICAgICAgICAgJyAgICBmYWxzZSBiZWNhdXNlIHRoZSB0eXBlIGlzIG5vdCB0aGUgc2FtZSkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICogQ29sbGVjdGlvbnMgdGhhdCBzdXBwb3J0IG9yZGVyIGNvbXBhcmlzb24gYXJlIG9yZGVyZWQgdGhlICcKKyAgICAgICAgICAgICAgICAnc2FtZVxuJworICAgICAgICAgICAgICAgICcgICAgYXMgdGhlaXIgZmlyc3QgdW5lcXVhbCBlbGVtZW50cyAoZm9yIGV4YW1wbGUsICJbMSwyLHhdIDw9ICcKKyAgICAgICAgICAgICAgICAnWzEsMix5XSJcbicKKyAgICAgICAgICAgICAgICAnICAgIGhhcyB0aGUgc2FtZSB2YWx1ZSBhcyAieCA8PSB5IikuICBJZiBhIGNvcnJlc3BvbmRpbmcgJworICAgICAgICAgICAgICAgICdlbGVtZW50IGRvZXNcbicKKyAgICAgICAgICAgICAgICAnICAgIG5vdCBleGlzdCwgdGhlIHNob3J0ZXIgY29sbGVjdGlvbiBpcyBvcmRlcmVkIGZpcnN0IChmb3IgJworICAgICAgICAgICAgICAgICdleGFtcGxlLFxuJworICAgICAgICAgICAgICAgICcgICAgIlsxLDJdIDwgWzEsMiwzXSIgaXMgdHJ1ZSkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIE1hcHBpbmdzIChpbnN0YW5jZXMgb2YgImRpY3QiKSBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmICcKKyAgICAgICAgICAgICAgICAndGhleVxuJworICAgICAgICAgICAgICAgICcgIGhhdmUgZXF1YWwgKihrZXksIHZhbHVlKSogcGFpcnMuIEVxdWFsaXR5IGNvbXBhcmlzb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAna2V5cyBhbmRcbicKKyAgICAgICAgICAgICAgICAnICBlbGVtZW50cyBlbmZvcmNlcyByZWZsZXhpdml0eS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgT3JkZXIgY29tcGFyaXNvbnMgKCI8IiwgIj4iLCAiPD0iLCBhbmQgIj49IikgcmFpc2UgJworICAgICAgICAgICAgICAgICciVHlwZUVycm9yIi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogU2V0cyAoaW5zdGFuY2VzIG9mICJzZXQiIG9yICJmcm96ZW5zZXQiKSBjYW4gYmUgY29tcGFyZWQgJworICAgICAgICAgICAgICAgICd3aXRoaW5cbicKKyAgICAgICAgICAgICAgICAnICBhbmQgYWNyb3NzIHRoZWlyIHR5cGVzLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBUaGV5IGRlZmluZSBvcmRlciBjb21wYXJpc29uIG9wZXJhdG9ycyB0byBtZWFuIHN1YnNldCBhbmQgJworICAgICAgICAgICAgICAgICdzdXBlcnNldFxuJworICAgICAgICAgICAgICAgICcgIHRlc3RzLiAgVGhvc2UgcmVsYXRpb25zIGRvIG5vdCBkZWZpbmUgdG90YWwgb3JkZXJpbmdzIChmb3IgJworICAgICAgICAgICAgICAgICdleGFtcGxlLFxuJworICAgICAgICAgICAgICAgICcgIHRoZSB0d28gc2V0cyAiezEsMn0iIGFuZCAiezIsM30iIGFyZSBub3QgZXF1YWwsIG5vciBzdWJzZXRzICcKKyAgICAgICAgICAgICAgICAnb2Ygb25lXG4nCisgICAgICAgICAgICAgICAgJyAgYW5vdGhlciwgbm9yIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlcikuICBBY2NvcmRpbmdseSwgc2V0cyAnCisgICAgICAgICAgICAgICAgJ2FyZSBub3RcbicKKyAgICAgICAgICAgICAgICAnICBhcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZXBlbmQgb24gdG90YWwgJworICAgICAgICAgICAgICAgICdvcmRlcmluZ1xuJworICAgICAgICAgICAgICAgICcgIChmb3IgZXhhbXBsZSwgIm1pbigpIiwgIm1heCgpIiwgYW5kICJzb3J0ZWQoKSIgcHJvZHVjZSAnCisgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZFxuJworICAgICAgICAgICAgICAgICcgIHJlc3VsdHMgZ2l2ZW4gYSBsaXN0IG9mIHNldHMgYXMgaW5wdXRzKS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgQ29tcGFyaXNvbiBvZiBzZXRzIGVuZm9yY2VzIHJlZmxleGl2aXR5IG9mIGl0cyBlbGVtZW50cy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogTW9zdCBvdGhlciBidWlsdC1pbiB0eXBlcyBoYXZlIG5vIGNvbXBhcmlzb24gbWV0aG9kcyAnCisgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGVkLFxuJworICAgICAgICAgICAgICAgICcgIHNvIHRoZXkgaW5oZXJpdCB0aGUgZGVmYXVsdCBjb21wYXJpc29uIGJlaGF2aW9yLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVXNlci1kZWZpbmVkIGNsYXNzZXMgdGhhdCBjdXN0b21pemUgdGhlaXIgY29tcGFyaXNvbiBiZWhhdmlvciAnCisgICAgICAgICAgICAgICAgJ3Nob3VsZFxuJworICAgICAgICAgICAgICAgICdmb2xsb3cgc29tZSBjb25zaXN0ZW5jeSBydWxlcywgaWYgcG9zc2libGU6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIEVxdWFsaXR5IGNvbXBhcmlzb24gc2hvdWxkIGJlIHJlZmxleGl2ZS4gSW4gb3RoZXIgd29yZHMsICcKKyAgICAgICAgICAgICAgICAnaWRlbnRpY2FsXG4nCisgICAgICAgICAgICAgICAgJyAgb2JqZWN0cyBzaG91bGQgY29tcGFyZSBlcXVhbDpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggaXMgeSIgaW1wbGllcyAieCA9PSB5IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBDb21wYXJpc29uIHNob3VsZCBiZSBzeW1tZXRyaWMuIEluIG90aGVyIHdvcmRzLCB0aGUgJworICAgICAgICAgICAgICAgICdmb2xsb3dpbmdcbicKKyAgICAgICAgICAgICAgICAnICBleHByZXNzaW9ucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSByZXN1bHQ6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4ID09IHkiIGFuZCAieSA9PSB4IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCAhPSB5IiBhbmQgInkgIT0geCJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggPCB5IiBhbmQgInkgPiB4IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCA8PSB5IiBhbmQgInkgPj0geCJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogQ29tcGFyaXNvbiBzaG91bGQgYmUgdHJhbnNpdGl2ZS4gVGhlIGZvbGxvd2luZyAnCisgICAgICAgICAgICAgICAgJyhub24tZXhoYXVzdGl2ZSlcbicKKyAgICAgICAgICAgICAgICAnICBleGFtcGxlcyBpbGx1c3RyYXRlIHRoYXQ6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4ID4geSBhbmQgeSA+IHoiIGltcGxpZXMgInggPiB6IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCA8IHkgYW5kIHkgPD0geiIgaW1wbGllcyAieCA8IHoiXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIEludmVyc2UgY29tcGFyaXNvbiBzaG91bGQgcmVzdWx0IGluIHRoZSBib29sZWFuIG5lZ2F0aW9uLiAnCisgICAgICAgICAgICAgICAgJ0luIG90aGVyXG4nCisgICAgICAgICAgICAgICAgJyAgd29yZHMsIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICdyZXN1bHQ6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4ID09IHkiIGFuZCAibm90IHggIT0geSJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggPCB5IiBhbmQgIm5vdCB4ID49IHkiIChmb3IgdG90YWwgb3JkZXJpbmcpXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4ID4geSIgYW5kICJub3QgeCA8PSB5IiAoZm9yIHRvdGFsIG9yZGVyaW5nKVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBUaGUgbGFzdCB0d28gZXhwcmVzc2lvbnMgYXBwbHkgdG8gdG90YWxseSBvcmRlcmVkICcKKyAgICAgICAgICAgICAgICAnY29sbGVjdGlvbnMgKGUuZy5cbicKKyAgICAgICAgICAgICAgICAnICB0byBzZXF1ZW5jZXMsIGJ1dCBub3QgdG8gc2V0cyBvciBtYXBwaW5ncykuIFNlZSBhbHNvIHRoZVxuJworICAgICAgICAgICAgICAgICcgICJ0b3RhbF9vcmRlcmluZygpIiBkZWNvcmF0b3IuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdQeXRob24gZG9lcyBub3QgZW5mb3JjZSB0aGVzZSBjb25zaXN0ZW5jeSBydWxlcy4gSW4gZmFjdCwgJworICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAnbm90LWEtbnVtYmVyIHZhbHVlcyBhcmUgYW4gZXhhbXBsZSBmb3Igbm90IGZvbGxvd2luZyB0aGVzZSAnCisgICAgICAgICAgICAgICAgJ3J1bGVzLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ01lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zXG4nCisgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiAnCisgICAgICAgICAgICAgICAgJ3MiXG4nCisgICAgICAgICAgICAgICAgJ2V2YWx1YXRlcyB0byB0cnVlIGlmICp4KiBpcyBhIG1lbWJlciBvZiAqcyosIGFuZCBmYWxzZSAnCisgICAgICAgICAgICAgICAgJ290aGVyd2lzZS4gICJ4XG4nCisgICAgICAgICAgICAgICAgJ25vdCBpbiBzIiByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiAieCBpbiBzIi4gIEFsbCBidWlsdC1pbiAnCisgICAgICAgICAgICAgICAgJ3NlcXVlbmNlc1xuJworICAgICAgICAgICAgICAgICdhbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAnCisgICAgICAgICAgICAgICAgJyJpbiIgdGVzdHNcbicKKyAgICAgICAgICAgICAgICAnd2hldGhlciB0aGUgZGljdGlvbmFyeSBoYXMgYSBnaXZlbiBrZXkuIEZvciBjb250YWluZXIgdHlwZXMgJworICAgICAgICAgICAgICAgICdzdWNoIGFzXG4nCisgICAgICAgICAgICAgICAgJ2xpc3QsIHR1cGxlLCBzZXQsIGZyb3plbnNldCwgZGljdCwgb3IgY29sbGVjdGlvbnMuZGVxdWUsIHRoZVxuJworICAgICAgICAgICAgICAgICdleHByZXNzaW9uICJ4IGluIHkiIGlzIGVxdWl2YWxlbnQgdG8gImFueSh4IGlzIGUgb3IgeCA9PSBlICcKKyAgICAgICAgICAgICAgICAnZm9yIGUgaW5cbicKKyAgICAgICAgICAgICAgICAneSkiLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5ICcKKyAgICAgICAgICAgICAgICAnaWYgKngqIGlzXG4nCisgICAgICAgICAgICAgICAgJ2Egc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyAieS5maW5kKHgpICE9ICcKKyAgICAgICAgICAgICAgICAnLTEiLiAgRW1wdHlcbicKKyAgICAgICAgICAgICAgICAnc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyICcKKyAgICAgICAgICAgICAgICAnc3RyaW5nLFxuJworICAgICAgICAgICAgICAgICdzbyAiIiIgaW4gImFiYyIiIHdpbGwgcmV0dXJuICJUcnVlIi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0ZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlICJfX2NvbnRhaW5zX18oKSIgJworICAgICAgICAgICAgICAgICdtZXRob2QsICJ4XG4nCisgICAgICAgICAgICAgICAgJ2luIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgInkuX19jb250YWluc19fKHgpIiBpcyB0cnVlLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiAnCisgICAgICAgICAgICAgICAgJ2J1dCBkb1xuJworICAgICAgICAgICAgICAgICdkZWZpbmUgIl9faXRlcl9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIHNvbWUgdmFsdWUgInoiIHdpdGggJworICAgICAgICAgICAgICAgICcieCA9PSB6IlxuJworICAgICAgICAgICAgICAgICdpcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcgb3ZlciAieSIuICBJZiBhbiBleGNlcHRpb24gaXMgJworICAgICAgICAgICAgICAgICdyYWlzZWRcbicKKyAgICAgICAgICAgICAgICAnZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgJworICAgICAgICAgICAgICAgICdleGNlcHRpb24uXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdMYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzICcKKyAgICAgICAgICAgICAgICAnZGVmaW5lc1xuJworICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSAnCisgICAgICAgICAgICAgICAgJ25vbi1cbicKKyAgICAgICAgICAgICAgICAnbmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0ICJ4ID09IHlbaV0iLCBhbmQgYWxsICcKKyAgICAgICAgICAgICAgICAnbG93ZXJcbicKKyAgICAgICAgICAgICAgICAnaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSAiSW5kZXhFcnJvciIgZXhjZXB0aW9uLiAgKElmIGFueSAnCisgICAgICAgICAgICAgICAgJ290aGVyXG4nCisgICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBpcyByYWlzZWQsIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgJworICAgICAgICAgICAgICAgICdleGNlcHRpb24pLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIG9wZXJhdG9yICJub3QgaW4iIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnVlICcKKyAgICAgICAgICAgICAgICAndmFsdWUgb2ZcbicKKyAgICAgICAgICAgICAgICAnImluIi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdJZGVudGl0eSBjb21wYXJpc29uc1xuJworICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIG9wZXJhdG9ycyAiaXMiIGFuZCAiaXMgbm90IiB0ZXN0IGZvciBvYmplY3QgaWRlbnRpdHk6ICJ4ICcKKyAgICAgICAgICAgICAgICAnaXMgeSIgaXNcbicKKyAgICAgICAgICAgICAgICAndHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogYW5kICp5KiBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgInggaXMgJworICAgICAgICAgICAgICAgICdub3QgeSJcbicKKyAgICAgICAgICAgICAgICAneWllbGRzIHRoZSBpbnZlcnNlIHRydXRoIHZhbHVlLiBbNF1cbicsCisgJ2NvbXBvdW5kJzogJ1xuJworICAgICAgICAgICAgICdDb21wb3VuZCBzdGF0ZW1lbnRzXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NvbXBvdW5kIHN0YXRlbWVudHMgY29udGFpbiAoZ3JvdXBzIG9mKSBvdGhlciBzdGF0ZW1lbnRzOyB0aGV5ICcKKyAgICAgICAgICAgICAnYWZmZWN0XG4nCisgICAgICAgICAgICAgJ29yIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aG9zZSBvdGhlciBzdGF0ZW1lbnRzIGluIHNvbWUgd2F5LiAgJworICAgICAgICAgICAgICdJblxuJworICAgICAgICAgICAgICdnZW5lcmFsLCBjb21wb3VuZCBzdGF0ZW1lbnRzIHNwYW4gbXVsdGlwbGUgbGluZXMsIGFsdGhvdWdoIGluICcKKyAgICAgICAgICAgICAnc2ltcGxlXG4nCisgICAgICAgICAgICAgJ2luY2FybmF0aW9ucyBhIHdob2xlIGNvbXBvdW5kIHN0YXRlbWVudCBtYXkgYmUgY29udGFpbmVkIGluIG9uZSAnCisgICAgICAgICAgICAgJ2xpbmUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImlmIiwgIndoaWxlIiBhbmQgImZvciIgc3RhdGVtZW50cyBpbXBsZW1lbnQgdHJhZGl0aW9uYWwgJworICAgICAgICAgICAgICdjb250cm9sXG4nCisgICAgICAgICAgICAgJ2Zsb3cgY29uc3RydWN0cy4gICJ0cnkiIHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yICcKKyAgICAgICAgICAgICAnY2xlYW51cFxuJworICAgICAgICAgICAgICdjb2RlIGZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHMsIHdoaWxlIHRoZSAid2l0aCIgc3RhdGVtZW50ICcKKyAgICAgICAgICAgICAnYWxsb3dzIHRoZVxuJworICAgICAgICAgICAgICdleGVjdXRpb24gb2YgaW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiBjb2RlIGFyb3VuZCBhIGJsb2NrICcKKyAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAnY29kZS4gIEZ1bmN0aW9uIGFuZCBjbGFzcyBkZWZpbml0aW9ucyBhcmUgYWxzbyBzeW50YWN0aWNhbGx5ICcKKyAgICAgICAgICAgICAnY29tcG91bmRcbicKKyAgICAgICAgICAgICAnc3RhdGVtZW50cy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIkEgY29tcG91bmQgc3RhdGVtZW50IGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlICdjbGF1c2VzLicgIEEgIgorICAgICAgICAgICAgICdjbGF1c2VcbicKKyAgICAgICAgICAgICAiY29uc2lzdHMgb2YgYSBoZWFkZXIgYW5kIGEgJ3N1aXRlLicgIFRoZSBjbGF1c2UgaGVhZGVycyBvZiBhXG4iCisgICAgICAgICAgICAgJ3BhcnRpY3VsYXIgY29tcG91bmQgc3RhdGVtZW50IGFyZSBhbGwgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gJworICAgICAgICAgICAgICdsZXZlbC5cbicKKyAgICAgICAgICAgICAnRWFjaCBjbGF1c2UgaGVhZGVyIGJlZ2lucyB3aXRoIGEgdW5pcXVlbHkgaWRlbnRpZnlpbmcga2V5d29yZCAnCisgICAgICAgICAgICAgJ2FuZCBlbmRzXG4nCisgICAgICAgICAgICAgJ3dpdGggYSBjb2xvbi4gIEEgc3VpdGUgaXMgYSBncm91cCBvZiBzdGF0ZW1lbnRzIGNvbnRyb2xsZWQgYnkgYVxuJworICAgICAgICAgICAgICdjbGF1c2UuICBBIHN1aXRlIGNhbiBiZSBvbmUgb3IgbW9yZSBzZW1pY29sb24tc2VwYXJhdGVkIHNpbXBsZVxuJworICAgICAgICAgICAgICdzdGF0ZW1lbnRzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGhlYWRlciwgZm9sbG93aW5nIHRoZSAnCisgICAgICAgICAgICAgImhlYWRlcidzXG4iCisgICAgICAgICAgICAgJ2NvbG9uLCBvciBpdCBjYW4gYmUgb25lIG9yIG1vcmUgaW5kZW50ZWQgc3RhdGVtZW50cyBvbiAnCisgICAgICAgICAgICAgJ3N1YnNlcXVlbnRcbicKKyAgICAgICAgICAgICAnbGluZXMuICBPbmx5IHRoZSBsYXR0ZXIgZm9ybSBvZiBhIHN1aXRlIGNhbiBjb250YWluIG5lc3RlZCAnCisgICAgICAgICAgICAgJ2NvbXBvdW5kXG4nCisgICAgICAgICAgICAgInN0YXRlbWVudHM7IHRoZSBmb2xsb3dpbmcgaXMgaWxsZWdhbCwgbW9zdGx5IGJlY2F1c2UgaXQgd291bGRuJ3QgIgorICAgICAgICAgICAgICdiZVxuJworICAgICAgICAgICAgICdjbGVhciB0byB3aGljaCAiaWYiIGNsYXVzZSBhIGZvbGxvd2luZyAiZWxzZSIgY2xhdXNlIHdvdWxkICcKKyAgICAgICAgICAgICAnYmVsb25nOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgaWYgdGVzdDE6IGlmIHRlc3QyOiBwcmludCh4KVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQWxzbyBub3RlIHRoYXQgdGhlIHNlbWljb2xvbiBiaW5kcyB0aWdodGVyIHRoYW4gdGhlIGNvbG9uIGluICcKKyAgICAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICAgICdjb250ZXh0LCBzbyB0aGF0IGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgZWl0aGVyIGFsbCBvciBub25lIG9mICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyJwcmludCgpIiBjYWxscyBhcmUgZXhlY3V0ZWQ6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBpZiB4IDwgeSA8IHo6IHByaW50KHgpOyBwcmludCh5KTsgcHJpbnQoeilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1N1bW1hcml6aW5nOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgY29tcG91bmRfc3RtdCA6Oj0gaWZfc3RtdFxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IHdoaWxlX3N0bXRcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCBmb3Jfc3RtdFxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IHRyeV9zdG10XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgd2l0aF9zdG10XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgZnVuY2RlZlxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IGNsYXNzZGVmXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNfd2l0aF9zdG10XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNfZm9yX3N0bXRcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCBhc3luY19mdW5jZGVmXG4nCisgICAgICAgICAgICAgJyAgIHN1aXRlICAgICAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgTkVXTElORSBJTkRFTlQgJworICAgICAgICAgICAgICdzdGF0ZW1lbnQrIERFREVOVFxuJworICAgICAgICAgICAgICcgICBzdGF0ZW1lbnQgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IGNvbXBvdW5kX3N0bXRcbicKKyAgICAgICAgICAgICAnICAgc3RtdF9saXN0ICAgICA6Oj0gc2ltcGxlX3N0bXQgKCI7IiBzaW1wbGVfc3RtdCkqIFsiOyJdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlIHRoYXQgc3RhdGVtZW50cyBhbHdheXMgZW5kIGluIGEgIk5FV0xJTkUiIHBvc3NpYmx5IGZvbGxvd2VkICcKKyAgICAgICAgICAgICAnYnkgYVxuJworICAgICAgICAgICAgICciREVERU5UIi4gIEFsc28gbm90ZSB0aGF0IG9wdGlvbmFsIGNvbnRpbnVhdGlvbiBjbGF1c2VzIGFsd2F5cyAnCisgICAgICAgICAgICAgJ2JlZ2luXG4nCisgICAgICAgICAgICAgJ3dpdGggYSBrZXl3b3JkIHRoYXQgY2Fubm90IHN0YXJ0IGEgc3RhdGVtZW50LCB0aHVzIHRoZXJlIGFyZSBub1xuJworICAgICAgICAgICAgICdhbWJpZ3VpdGllcyAodGhlIFwnZGFuZ2xpbmcgImVsc2UiXCcgcHJvYmxlbSBpcyBzb2x2ZWQgaW4gUHl0aG9uICcKKyAgICAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAgICAncmVxdWlyaW5nIG5lc3RlZCAiaWYiIHN0YXRlbWVudHMgdG8gYmUgaW5kZW50ZWQpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGZvcm1hdHRpbmcgb2YgdGhlIGdyYW1tYXIgcnVsZXMgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucyAnCisgICAgICAgICAgICAgJ3BsYWNlc1xuJworICAgICAgICAgICAgICdlYWNoIGNsYXVzZSBvbiBhIHNlcGFyYXRlIGxpbmUgZm9yIGNsYXJpdHkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgJworICAgICAgICAgICAgICdleHByZXNzaW9ucyBvbmVcbicKKyAgICAgICAgICAgICAnYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiBCb29sZWFuICcKKyAgICAgICAgICAgICAnb3BlcmF0aW9uc1xuJworICAgICAgICAgICAgICdmb3IgdGhlIGRlZmluaXRpb24gb2YgdHJ1ZSBhbmQgZmFsc2UpOyB0aGVuIHRoYXQgc3VpdGUgaXMgJworICAgICAgICAgICAgICdleGVjdXRlZFxuJworICAgICAgICAgICAgICcoYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlICJpZiIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yICcKKyAgICAgICAgICAgICAnZXZhbHVhdGVkKS5cbicKKyAgICAgICAgICAgICAnSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCAnCisgICAgICAgICAgICAgJ2lmXG4nCisgICAgICAgICAgICAgJ3ByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAid2hpbGUiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAid2hpbGUiIHN0YXRlbWVudCBpcyB1c2VkIGZvciByZXBlYXRlZCBleGVjdXRpb24gYXMgbG9uZyBhcyAnCisgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24gaXMgdHJ1ZTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCAnCisgICAgICAgICAgICAgJ2V4ZWN1dGVzIHRoZVxuJworICAgICAgICAgICAgICdmaXJzdCBzdWl0ZTsgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UgKHdoaWNoIG1heSBiZSB0aGUgZmlyc3QgJworICAgICAgICAgICAgICd0aW1lXG4nCisgICAgICAgICAgICAgJ2l0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyAnCisgICAgICAgICAgICAgJ2V4ZWN1dGVkXG4nCisgICAgICAgICAgICAgJ2FuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgJworICAgICAgICAgICAgICdsb29wXG4nCisgICAgICAgICAgICAgJ3dpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiICcKKyAgICAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGdvZXMgJworICAgICAgICAgICAgICdiYWNrXG4nCisgICAgICAgICAgICAgJ3RvIHRlc3RpbmcgdGhlIGV4cHJlc3Npb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJmb3IiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImZvciIgc3RhdGVtZW50IGlzIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBvZiBhICcKKyAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAnKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgJworICAgICAgICAgICAgICdzdWl0ZVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gJworICAgICAgICAgICAgICdpdGVyYWJsZVxuJworICAgICAgICAgICAgICdvYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuJworICAgICAgICAgICAgICciZXhwcmVzc2lvbl9saXN0Ii4gIFRoZSBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIG9uY2UgZm9yIGVhY2ggJworICAgICAgICAgICAgICdpdGVtXG4nCisgICAgICAgICAgICAgJ3Byb3ZpZGVkIGJ5IHRoZSBpdGVyYXRvciwgaW4gdGhlIG9yZGVyIHJldHVybmVkIGJ5IHRoZSAnCisgICAgICAgICAgICAgJ2l0ZXJhdG9yLiAgRWFjaFxuJworICAgICAgICAgICAgICdpdGVtIGluIHR1cm4gaXMgYXNzaWduZWQgdG8gdGhlIHRhcmdldCBsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCAnCisgICAgICAgICAgICAgJ3J1bGVzXG4nCisgICAgICAgICAgICAgJ2ZvciBhc3NpZ25tZW50cyAoc2VlIEFzc2lnbm1lbnQgc3RhdGVtZW50cyksIGFuZCB0aGVuIHRoZSBzdWl0ZSAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGVkLiAgV2hlbiB0aGUgaXRlbXMgYXJlIGV4aGF1c3RlZCAod2hpY2ggaXMgaW1tZWRpYXRlbHkgJworICAgICAgICAgICAgICd3aGVuIHRoZVxuJworICAgICAgICAgICAgICdzZXF1ZW5jZSBpcyBlbXB0eSBvciBhbiBpdGVyYXRvciByYWlzZXMgYSAiU3RvcEl0ZXJhdGlvbiIgJworICAgICAgICAgICAgICdleGNlcHRpb24pLFxuJworICAgICAgICAgICAgICd0aGUgc3VpdGUgaW4gdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlICcKKyAgICAgICAgICAgICAnbG9vcFxuJworICAgICAgICAgICAgICd0ZXJtaW5hdGVzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgJworICAgICAgICAgICAgICdsb29wXG4nCisgICAgICAgICAgICAgJ3dpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiICcKKyAgICAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kICcKKyAgICAgICAgICAgICAnY29udGludWVzXG4nCisgICAgICAgICAgICAgJ3dpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgImVsc2UiIGNsYXVzZSBpZiB0aGVyZSBpcyBubyAnCisgICAgICAgICAgICAgJ25leHRcbicKKyAgICAgICAgICAgICAnaXRlbS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBmb3ItbG9vcCBtYWtlcyBhc3NpZ25tZW50cyB0byB0aGUgdmFyaWFibGVzKHMpIGluIHRoZSB0YXJnZXQgJworICAgICAgICAgICAgICdsaXN0LlxuJworICAgICAgICAgICAgICdUaGlzIG92ZXJ3cml0ZXMgYWxsIHByZXZpb3VzIGFzc2lnbm1lbnRzIHRvIHRob3NlIHZhcmlhYmxlcyAnCisgICAgICAgICAgICAgJ2luY2x1ZGluZ1xuJworICAgICAgICAgICAgICd0aG9zZSBtYWRlIGluIHRoZSBzdWl0ZSBvZiB0aGUgZm9yLWxvb3A6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBmb3IgaSBpbiByYW5nZSgxMCk6XG4nCisgICAgICAgICAgICAgJyAgICAgICBwcmludChpKVxuJworICAgICAgICAgICAgICcgICAgICAgaSA9IDUgICAgICAgICAgICAgIyB0aGlzIHdpbGwgbm90IGFmZmVjdCB0aGUgZm9yLWxvb3BcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSBpIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCAnCisgICAgICAgICAgICAgJ3RoZSBuZXh0XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4IGluIHRoZSByYW5nZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTmFtZXMgaW4gdGhlIHRhcmdldCBsaXN0IGFyZSBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzICcKKyAgICAgICAgICAgICAnZmluaXNoZWQsXG4nCisgICAgICAgICAgICAgJ2J1dCBpZiB0aGUgc2VxdWVuY2UgaXMgZW1wdHksIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkICcKKyAgICAgICAgICAgICAndG8gYXRcbicKKyAgICAgICAgICAgICAnYWxsIGJ5IHRoZSBsb29wLiAgSGludDogdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJyYW5nZSgpIiByZXR1cm5zICcKKyAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAiaXRlcmF0b3Igb2YgaW50ZWdlcnMgc3VpdGFibGUgdG8gZW11bGF0ZSB0aGUgZWZmZWN0IG9mIFBhc2NhbCdzICIKKyAgICAgICAgICAgICAnImZvciBpXG4nCisgICAgICAgICAgICAgJzo9IGEgdG8gYiBkbyI7IGUuZy4sICJsaXN0KHJhbmdlKDMpKSIgcmV0dXJucyB0aGUgbGlzdCAiWzAsIDEsICcKKyAgICAgICAgICAgICAnMl0iLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTm90ZTogVGhlcmUgaXMgYSBzdWJ0bGV0eSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBiZWluZyBtb2RpZmllZCBieSAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgIGxvb3AgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gICcKKyAgICAgICAgICAgICAnQW5cbicKKyAgICAgICAgICAgICAnICBpbnRlcm5hbCBjb3VudGVyIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBpdGVtIGlzIHVzZWQgJworICAgICAgICAgICAgICduZXh0LFxuJworICAgICAgICAgICAgICcgIGFuZCB0aGlzIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgJworICAgICAgICAgICAgICdoYXNcbicKKyAgICAgICAgICAgICAnICByZWFjaGVkIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIHRoZSBsb29wIHRlcm1pbmF0ZXMuICBUaGlzICcKKyAgICAgICAgICAgICAnbWVhbnNcbicKKyAgICAgICAgICAgICAnICB0aGF0IGlmIHRoZSBzdWl0ZSBkZWxldGVzIHRoZSBjdXJyZW50IChvciBhIHByZXZpb3VzKSBpdGVtICcKKyAgICAgICAgICAgICAnZnJvbSB0aGVcbicKKyAgICAgICAgICAgICAnICBzZXF1ZW5jZSwgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlICcKKyAgICAgICAgICAgICAnaW5kZXggb2ZcbicKKyAgICAgICAgICAgICAnICB0aGUgY3VycmVudCBpdGVtIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gdHJlYXRlZCkuICBMaWtld2lzZSwgJworICAgICAgICAgICAgICdpZiB0aGVcbicKKyAgICAgICAgICAgICAnICBzdWl0ZSBpbnNlcnRzIGFuIGl0ZW0gaW4gdGhlIHNlcXVlbmNlIGJlZm9yZSB0aGUgY3VycmVudCBpdGVtLCAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSAnCisgICAgICAgICAgICAgJ2xvb3AuXG4nCisgICAgICAgICAgICAgJyAgVGhpcyBjYW4gbGVhZCB0byBuYXN0eSBidWdzIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIGFcbicKKyAgICAgICAgICAgICAnICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgZm9yIHggaW4gYVs6XTpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJ0cnkiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgInRyeSIgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgJworICAgICAgICAgICAgICdjb2RlXG4nCisgICAgICAgICAgICAgJ2ZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICB0cnlfc3RtdCAgOjo9IHRyeTFfc3RtdCB8IHRyeTJfc3RtdFxuJworICAgICAgICAgICAgICcgICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbImFzIiBpZGVudGlmaWVyXV0gIjoiICcKKyAgICAgICAgICAgICAnc3VpdGUpK1xuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXVxuJworICAgICAgICAgICAgICcgICB0cnkyX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICJmaW5hbGx5IiAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiZXhjZXB0IiBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuICcKKyAgICAgICAgICAgICAnV2hlbiBub1xuJworICAgICAgICAgICAgICdleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGVkLiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIHN1aXRlLCBhIHNlYXJjaCAnCisgICAgICAgICAgICAgJ2ZvciBhblxuJworICAgICAgICAgICAgICdleGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdCAnCisgICAgICAgICAgICAgJ2NsYXVzZXNcbicKKyAgICAgICAgICAgICAnaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uICBBbiAnCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24tXG4nCisgICAgICAgICAgICAgJ2xlc3MgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgbXVzdCBiZSBsYXN0OyBpdCBtYXRjaGVzIGFueVxuJworICAgICAgICAgICAgICdleGNlcHRpb24uICBGb3IgYW4gZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXQgJworICAgICAgICAgICAgICdleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJ2lzIGV2YWx1YXRlZCwgYW5kIHRoZSBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIGlmIHRoZSAnCisgICAgICAgICAgICAgJ3Jlc3VsdGluZ1xuJworICAgICAgICAgICAgICdvYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcyAnCisgICAgICAgICAgICAgJ2NvbXBhdGlibGVcbicKKyAgICAgICAgICAgICAnd2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIGNsYXNzIG9yIGEgYmFzZSBjbGFzcyBvZiB0aGUgJworICAgICAgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgICAgICAnb2JqZWN0IG9yIGEgdHVwbGUgY29udGFpbmluZyBhbiBpdGVtIGNvbXBhdGlibGUgd2l0aCB0aGUgJworICAgICAgICAgICAgICdleGNlcHRpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJZiBubyBleGNlcHQgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4gJworICAgICAgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgICAgICAnaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uICcKKyAgICAgICAgICAgICAnc3RhY2suXG4nCisgICAgICAgICAgICAgJ1sxXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuIGV4Y2VwdCAnCisgICAgICAgICAgICAgJ2NsYXVzZVxuJworICAgICAgICAgICAgICdyYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgJworICAgICAgICAgICAgICdjYW5jZWxlZCBhbmRcbicKKyAgICAgICAgICAgICAnYSBzZWFyY2ggc3RhcnRzIGZvciB0aGUgbmV3IGV4Y2VwdGlvbiBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSAnCisgICAgICAgICAgICAgJ2FuZCBvblxuJworICAgICAgICAgICAgICd0aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlICJ0cnkiIHN0YXRlbWVudCAnCisgICAgICAgICAgICAgJ3JhaXNlZFxuJworICAgICAgICAgICAgICd0aGUgZXhjZXB0aW9uKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1doZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzICcKKyAgICAgICAgICAgICAnYXNzaWduZWQgdG9cbicKKyAgICAgICAgICAgICAndGhlIHRhcmdldCBzcGVjaWZpZWQgYWZ0ZXIgdGhlICJhcyIga2V5d29yZCBpbiB0aGF0IGV4Y2VwdCAnCisgICAgICAgICAgICAgJ2NsYXVzZSwgaWZcbicKKyAgICAgICAgICAgICAicHJlc2VudCwgYW5kIHRoZSBleGNlcHQgY2xhdXNlJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0XG4iCisgICAgICAgICAgICAgJ2NsYXVzZXMgbXVzdCBoYXZlIGFuIGV4ZWN1dGFibGUgYmxvY2suICBXaGVuIHRoZSBlbmQgb2YgdGhpcyAnCisgICAgICAgICAgICAgJ2Jsb2NrIGlzXG4nCisgICAgICAgICAgICAgJ3JlYWNoZWQsIGV4ZWN1dGlvbiBjb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgJworICAgICAgICAgICAgICdzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICAgJyhUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgJworICAgICAgICAgICAgICdleGNlcHRpb24sXG4nCisgICAgICAgICAgICAgJ2FuZCB0aGUgZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgdHJ5IGNsYXVzZSBvZiB0aGUgaW5uZXIgaGFuZGxlciwgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnb3V0ZXIgaGFuZGxlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgJworICAgICAgICAgICAgICdjbGVhcmVkXG4nCisgICAgICAgICAgICAgJ2F0IHRoZSBlbmQgb2YgdGhlIGV4Y2VwdCBjbGF1c2UuICBUaGlzIGlzIGFzIGlmXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBleGNlcHQgRSBhcyBOOlxuJworICAgICAgICAgICAgICcgICAgICAgZm9vXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICd3YXMgdHJhbnNsYXRlZCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZXhjZXB0IEUgYXMgTjpcbicKKyAgICAgICAgICAgICAnICAgICAgIHRyeTpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICBmb29cbicKKyAgICAgICAgICAgICAnICAgICAgIGZpbmFsbHk6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgZGVsIE5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gJworICAgICAgICAgICAgICdiZVxuJworICAgICAgICAgICAgICdhYmxlIHRvIHJlZmVyIHRvIGl0IGFmdGVyIHRoZSBleGNlcHQgY2xhdXNlLiAgRXhjZXB0aW9ucyBhcmUgJworICAgICAgICAgICAgICdjbGVhcmVkXG4nCisgICAgICAgICAgICAgJ2JlY2F1c2Ugd2l0aCB0aGUgdHJhY2ViYWNrIGF0dGFjaGVkIHRvIHRoZW0sIHRoZXkgZm9ybSBhICcKKyAgICAgICAgICAgICAncmVmZXJlbmNlXG4nCisgICAgICAgICAgICAgJ2N5Y2xlIHdpdGggdGhlIHN0YWNrIGZyYW1lLCBrZWVwaW5nIGFsbCBsb2NhbHMgaW4gdGhhdCBmcmFtZSAnCisgICAgICAgICAgICAgJ2FsaXZlXG4nCisgICAgICAgICAgICAgJ3VudGlsIHRoZSBuZXh0IGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICJCZWZvcmUgYW4gZXhjZXB0IGNsYXVzZSdzIHN1aXRlIGlzIGV4ZWN1dGVkLCBkZXRhaWxzIGFib3V0IHRoZVxuIgorICAgICAgICAgICAgICdleGNlcHRpb24gYXJlIHN0b3JlZCBpbiB0aGUgInN5cyIgbW9kdWxlIGFuZCBjYW4gYmUgYWNjZXNzZWQgJworICAgICAgICAgICAgICd2aWFcbicKKyAgICAgICAgICAgICAnInN5cy5leGNfaW5mbygpIi4gInN5cy5leGNfaW5mbygpIiByZXR1cm5zIGEgMy10dXBsZSBjb25zaXN0aW5nICcKKyAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBjbGFzcywgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSBhbmQgYSB0cmFjZWJhY2sgb2JqZWN0ICcKKyAgICAgICAgICAgICAnKHNlZVxuJworICAgICAgICAgICAgICdzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSkgaWRlbnRpZnlpbmcgdGhlIHBvaW50IGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ3Byb2dyYW0gd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gICJzeXMuZXhjX2luZm8oKSIgdmFsdWVzICcKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJ3Jlc3RvcmVkIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuICcKKyAgICAgICAgICAgICAncmV0dXJuaW5nXG4nCisgICAgICAgICAgICAgJ2Zyb20gYSBmdW5jdGlvbiB0aGF0IGhhbmRsZWQgYW4gZXhjZXB0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIG9wdGlvbmFsICJlbHNlIiBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyAnCisgICAgICAgICAgICAgJ29mZlxuJworICAgICAgICAgICAgICd0aGUgZW5kIG9mIHRoZSAidHJ5IiBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSAiZWxzZSIgY2xhdXNlICcKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJ25vdCBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgImV4Y2VwdCIgY2xhdXNlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0lmICJmaW5hbGx5IiBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSBcJ2NsZWFudXBcJyBoYW5kbGVyLiAgJworICAgICAgICAgICAgICdUaGUgInRyeSJcbicKKyAgICAgICAgICAgICAnY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gICcKKyAgICAgICAgICAgICAnSWYgYW5cbicKKyAgICAgICAgICAgICAnZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXVzZXMgYW5kIGlzIG5vdCBoYW5kbGVkLCB0aGVcbicKKyAgICAgICAgICAgICAnZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgImZpbmFsbHkiIGNsYXVzZSBpcyAnCisgICAgICAgICAgICAgJ2V4ZWN1dGVkLiAgSWZcbicKKyAgICAgICAgICAgICAndGhlcmUgaXMgYSBzYXZlZCBleGNlcHRpb24gaXQgaXMgcmUtcmFpc2VkIGF0IHRoZSBlbmQgb2YgdGhlICcKKyAgICAgICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICAgICAgJ2NsYXVzZS4gIElmIHRoZSAiZmluYWxseSIgY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiwgdGhlICcKKyAgICAgICAgICAgICAnc2F2ZWRcbicKKyAgICAgICAgICAgICAnZXhjZXB0aW9uIGlzIHNldCBhcyB0aGUgY29udGV4dCBvZiB0aGUgbmV3IGV4Y2VwdGlvbi4gSWYgdGhlICcKKyAgICAgICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICAgICAgJ2NsYXVzZSBleGVjdXRlcyBhICJyZXR1cm4iIG9yICJicmVhayIgc3RhdGVtZW50LCB0aGUgc2F2ZWQgJworICAgICAgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgICAgICAnaXMgZGlzY2FyZGVkOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgPj4+IGRlZiBmKCk6XG4nCisgICAgICAgICAgICAgJyAgIC4uLiAgICAgdHJ5OlxuJworICAgICAgICAgICAgICcgICAuLi4gICAgICAgICAxLzBcbicKKyAgICAgICAgICAgICAnICAgLi4uICAgICBmaW5hbGx5OlxuJworICAgICAgICAgICAgICcgICAuLi4gICAgICAgICByZXR1cm4gNDJcbicKKyAgICAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgICAgJyAgID4+PiBmKClcbicKKyAgICAgICAgICAgICAnICAgNDJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSAnCisgICAgICAgICAgICAgJ2R1cmluZ1xuJworICAgICAgICAgICAgICdleGVjdXRpb24gb2YgdGhlICJmaW5hbGx5IiBjbGF1c2UuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaGVuIGEgInJldHVybiIsICJicmVhayIgb3IgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnInRyeSIgc3VpdGUgb2YgYSAidHJ5Ii4uLiJmaW5hbGx5IiBzdGF0ZW1lbnQsIHRoZSAiZmluYWxseSIgJworICAgICAgICAgICAgICdjbGF1c2UgaXNcbicKKyAgICAgICAgICAgICAnYWxzbyBleGVjdXRlZCBcJ29uIHRoZSB3YXkgb3V0LlwnIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgJworICAgICAgICAgICAgICdpbGxlZ2FsIGluXG4nCisgICAgICAgICAgICAgJ3RoZSAiZmluYWxseSIgY2xhdXNlLiAoVGhlIHJlYXNvbiBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY3VycmVudFxuJworICAgICAgICAgICAgICdpbXBsZW1lbnRhdGlvbiAtLS0gdGhpcyByZXN0cmljdGlvbiBtYXkgYmUgbGlmdGVkIGluIHRoZSAnCisgICAgICAgICAgICAgJ2Z1dHVyZSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGFzdCAnCisgICAgICAgICAgICAgJyJyZXR1cm4iXG4nCisgICAgICAgICAgICAgJ3N0YXRlbWVudCBleGVjdXRlZC4gIFNpbmNlIHRoZSAiZmluYWxseSIgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgJworICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJyJyZXR1cm4iIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgImZpbmFsbHkiIGNsYXVzZSB3aWxsIGFsd2F5cyAnCisgICAgICAgICAgICAgJ2JlIHRoZVxuJworICAgICAgICAgICAgICdsYXN0IG9uZSBleGVjdXRlZDpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgID4+PiBkZWYgZm9vKCk6XG4nCisgICAgICAgICAgICAgJyAgIC4uLiAgICAgdHJ5OlxuJworICAgICAgICAgICAgICIgICAuLi4gICAgICAgICByZXR1cm4gJ3RyeSdcbiIKKyAgICAgICAgICAgICAnICAgLi4uICAgICBmaW5hbGx5OlxuJworICAgICAgICAgICAgICIgICAuLi4gICAgICAgICByZXR1cm4gJ2ZpbmFsbHknXG4iCisgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICcgICA+Pj4gZm9vKClcbicKKyAgICAgICAgICAgICAiICAgJ2ZpbmFsbHknXG4iCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbicKKyAgICAgICAgICAgICAnRXhjZXB0aW9ucywgYW5kIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSAicmFpc2UiIHN0YXRlbWVudCB0byAnCisgICAgICAgICAgICAgJ2dlbmVyYXRlXG4nCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gVGhlIHJhaXNlIHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgIndpdGgiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJ3aXRoIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayAnCisgICAgICAgICAgICAgJ3dpdGhcbicKKyAgICAgICAgICAgICAnbWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiBXaXRoICcKKyAgICAgICAgICAgICAnU3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJ0NvbnRleHQgTWFuYWdlcnMpLiBUaGlzIGFsbG93cyBjb21tb24gJworICAgICAgICAgICAgICcidHJ5Ii4uLiJleGNlcHQiLi4uImZpbmFsbHkiXG4nCisgICAgICAgICAgICAgJ3VzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZCBmb3IgY29udmVuaWVudCByZXVzZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICcgICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGV4ZWN1dGlvbiBvZiB0aGUgIndpdGgiIHN0YXRlbWVudCB3aXRoIG9uZSAiaXRlbSIgcHJvY2VlZHMgJworICAgICAgICAgICAgICdhc1xuJworICAgICAgICAgICAgICdmb2xsb3dzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnMS4gVGhlIGNvbnRleHQgZXhwcmVzc2lvbiAodGhlIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlICcKKyAgICAgICAgICAgICAnIndpdGhfaXRlbSIpXG4nCisgICAgICAgICAgICAgJyAgIGlzIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcyLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBpcyBsb2FkZWQgZm9yIGxhdGVyIHVzZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZW50ZXJfXygpIiBtZXRob2QgaXMgaW52b2tlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzQuIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgIndpdGgiIHN0YXRlbWVudCwgdGhlIHJldHVyblxuJworICAgICAgICAgICAgICcgICB2YWx1ZSBmcm9tICJfX2VudGVyX18oKSIgaXMgYXNzaWduZWQgdG8gaXQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOb3RlOiBUaGUgIndpdGgiIHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlICcKKyAgICAgICAgICAgICAnIl9fZW50ZXJfXygpIlxuJworICAgICAgICAgICAgICcgICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gIl9fZXhpdF9fKCkiIHdpbGwgJworICAgICAgICAgICAgICdhbHdheXMgYmVcbicKKyAgICAgICAgICAgICAnICAgICBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yICcKKyAgICAgICAgICAgICAnb2NjdXJyaW5nXG4nCisgICAgICAgICAgICAgJyAgICAgd2l0aGluIHRoZSBzdWl0ZSB3b3VsZCBiZS4gU2VlIHN0ZXAgNiBiZWxvdy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzYuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLiAgSWYgJworICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICcgICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgJworICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAnICAgdHJhY2ViYWNrIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvICJfX2V4aXRfXygpIi4gT3RoZXJ3aXNlLCAnCisgICAgICAgICAgICAgJ3RocmVlXG4nCisgICAgICAgICAgICAgJyAgICJOb25lIiBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gJworICAgICAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgICAgICcgICBmcm9tIHRoZSAiX19leGl0X18oKSIgbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyAnCisgICAgICAgICAgICAgJ3JlcmFpc2VkLlxuJworICAgICAgICAgICAgICcgICBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzIHN1cHByZXNzZWQsICcKKyAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgJyAgIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgIndpdGgiXG4nCisgICAgICAgICAgICAgJyAgIHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gJworICAgICAgICAgICAgICdleGNlcHRpb24sIHRoZVxuJworICAgICAgICAgICAgICcgICByZXR1cm4gdmFsdWUgZnJvbSAiX19leGl0X18oKSIgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiAnCisgICAgICAgICAgICAgJ3Byb2NlZWRzXG4nCisgICAgICAgICAgICAgJyAgIGF0IHRoZSBub3JtYWwgbG9jYXRpb24gZm9yIHRoZSBraW5kIG9mIGV4aXQgdGhhdCB3YXMgdGFrZW4uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyAnCisgICAgICAgICAgICAgJ2lmXG4nCisgICAgICAgICAgICAgJ211bHRpcGxlICJ3aXRoIiBzdGF0ZW1lbnRzIHdlcmUgbmVzdGVkOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4nCisgICAgICAgICAgICAgJyAgICAgICBzdWl0ZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgd2l0aCBBKCkgYXMgYTpcbicKKyAgICAgICAgICAgICAnICAgICAgIHdpdGggQigpIGFzIGI6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgc3VpdGVcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIG11bHRpcGxlIGNvbnRleHQgJworICAgICAgICAgICAgICdleHByZXNzaW9ucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJyAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAnCisgICAgICAgICAgICAgJyJ3aXRoIlxuJworICAgICAgICAgICAgICcgICAgIHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdGdW5jdGlvbiBkZWZpbml0aW9uc1xuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0ICcKKyAgICAgICAgICAgICAnKHNlZVxuJworICAgICAgICAgICAgICdzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSk6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBmdW5jZGVmICAgICAgICAgICAgICAgICA6Oj0gW2RlY29yYXRvcnNdICJkZWYiIGZ1bmNuYW1lICIoIiAnCisgICAgICAgICAgICAgJ1twYXJhbWV0ZXJfbGlzdF0gIikiIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICcgICBkZWNvcmF0b3JzICAgICAgICAgICAgICA6Oj0gZGVjb3JhdG9yK1xuJworICAgICAgICAgICAgICcgICBkZWNvcmF0b3IgICAgICAgICAgICAgICA6Oj0gIkAiIGRvdHRlZF9uYW1lIFsiKCIgJworICAgICAgICAgICAgICdbYXJndW1lbnRfbGlzdCBbIiwiXV0gIikiXSBORVdMSU5FXG4nCisgICAgICAgICAgICAgJyAgIGRvdHRlZF9uYW1lICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyICgiLiIgaWRlbnRpZmllcikqXG4nCisgICAgICAgICAgICAgJyAgIHBhcmFtZXRlcl9saXN0ICAgICAgICAgIDo6PSBkZWZwYXJhbWV0ZXIgKCIsIiBkZWZwYXJhbWV0ZXIpKiAnCisgICAgICAgICAgICAgJ1siLCIgW3BhcmFtZXRlcl9saXN0X3N0YXJhcmdzXV1cbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgIHwgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NcbicKKyAgICAgICAgICAgICAnICAgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3MgOjo9ICIqIiBbcGFyYW1ldGVyXSAoIiwiICcKKyAgICAgICAgICAgICAnZGVmcGFyYW1ldGVyKSogWyIsIiBbIioqIiBwYXJhbWV0ZXIgWyIsIl1dXVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAiKioiIHBhcmFtZXRlciBbIiwiXVxuJworICAgICAgICAgICAgICcgICBwYXJhbWV0ZXIgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciBbIjoiIGV4cHJlc3Npb25dXG4nCisgICAgICAgICAgICAgJyAgIGRlZnBhcmFtZXRlciAgICAgICAgICAgIDo6PSBwYXJhbWV0ZXIgWyI9IiBleHByZXNzaW9uXVxuJworICAgICAgICAgICAgICcgICBmdW5jbmFtZSAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgSXRzIGV4ZWN1dGlvbiAnCisgICAgICAgICAgICAgJ2JpbmRzXG4nCisgICAgICAgICAgICAgJ3RoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZSB0byBhIGZ1bmN0aW9uICcKKyAgICAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgICAgJyhhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBnbG9iYWwgJworICAgICAgICAgICAgICduYW1lc3BhY2VcbicKKyAgICAgICAgICAgICAnYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBkb2VzIG5vdCBleGVjdXRlIHRoZSBmdW5jdGlvbiBib2R5OyB0aGlzICcKKyAgICAgICAgICAgICAnZ2V0c1xuJworICAgICAgICAgICAgICdleGVjdXRlZCBvbmx5IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gWzNdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcipcbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbnMuIERlY29yYXRvciBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlICcKKyAgICAgICAgICAgICAnZnVuY3Rpb24gaXNcbicKKyAgICAgICAgICAgICAnZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICAnCisgICAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAgICdyZXN1bHQgbXVzdCBiZSBhIGNhbGxhYmxlLCB3aGljaCBpcyBpbnZva2VkIHdpdGggdGhlIGZ1bmN0aW9uICcKKyAgICAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgICAgJ2FzIHRoZSBvbmx5IGFyZ3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYm91bmQgdG8gdGhlICcKKyAgICAgICAgICAgICAnZnVuY3Rpb24gbmFtZVxuJworICAgICAgICAgICAgICdpbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkICcKKyAgICAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAgICAnbmVzdGVkIGZhc2hpb24uIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGVcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEBmMShhcmcpXG4nCisgICAgICAgICAgICAgJyAgIEBmMlxuJworICAgICAgICAgICAgICcgICBkZWYgZnVuYygpOiBwYXNzXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGRlZiBmdW5jKCk6IHBhc3NcbicKKyAgICAgICAgICAgICAnICAgZnVuYyA9IGYxKGFyZykoZjIoZnVuYykpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdleGNlcHQgdGhhdCB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gaXMgbm90IHRlbXBvcmFyaWx5IGJvdW5kIHRvICcKKyAgICAgICAgICAgICAndGhlIG5hbWVcbicKKyAgICAgICAgICAgICAnImZ1bmMiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnV2hlbiBvbmUgb3IgbW9yZSAqcGFyYW1ldGVycyogaGF2ZSB0aGUgZm9ybSAqcGFyYW1ldGVyKiAiPSJcbicKKyAgICAgICAgICAgICAnKmV4cHJlc3Npb24qLCB0aGUgZnVuY3Rpb24gaXMgc2FpZCB0byBoYXZlICJkZWZhdWx0IHBhcmFtZXRlciAnCisgICAgICAgICAgICAgJ3ZhbHVlcy4iXG4nCisgICAgICAgICAgICAgJ0ZvciBhIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmcgJworICAgICAgICAgICAgICcqYXJndW1lbnQqIG1heVxuJworICAgICAgICAgICAgICJiZSBvbWl0dGVkIGZyb20gYSBjYWxsLCBpbiB3aGljaCBjYXNlIHRoZSBwYXJhbWV0ZXIncyBkZWZhdWx0ICIKKyAgICAgICAgICAgICAndmFsdWUgaXNcbicKKyAgICAgICAgICAgICAnc3Vic3RpdHV0ZWQuICBJZiBhIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBhbGwgZm9sbG93aW5nXG4nCisgICAgICAgICAgICAgJ3BhcmFtZXRlcnMgdXAgdW50aWwgdGhlICIiKiIiIG11c3QgYWxzbyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAtLS0gJworICAgICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgICAgJ2lzIGEgc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgJworICAgICAgICAgICAgICdncmFtbWFyLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnKipEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgd2hlbiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLioqIFRoaXMgbWVhbnMgdGhhdCB0aGUgJworICAgICAgICAgICAgICdleHByZXNzaW9uIGlzXG4nCisgICAgICAgICAgICAgJ2V2YWx1YXRlZCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSAnCisgICAgICAgICAgICAgJyJwcmUtXG4nCisgICAgICAgICAgICAgJ2NvbXB1dGVkIiB2YWx1ZSBpcyB1c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgJworICAgICAgICAgICAgICdpbXBvcnRhbnRcbicKKyAgICAgICAgICAgICAndG8gdW5kZXJzdGFuZCB3aGVuIGEgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgYSBtdXRhYmxlIG9iamVjdCwgc3VjaCAnCisgICAgICAgICAgICAgJ2FzIGFcbicKKyAgICAgICAgICAgICAnbGlzdCBvciBhIGRpY3Rpb25hcnk6IGlmIHRoZSBmdW5jdGlvbiBtb2RpZmllcyB0aGUgb2JqZWN0IChlLmcuICcKKyAgICAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAgICAnYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYSBsaXN0KSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gZWZmZWN0ICcKKyAgICAgICAgICAgICAnbW9kaWZpZWQuXG4nCisgICAgICAgICAgICAgJ1RoaXMgaXMgZ2VuZXJhbGx5IG5vdCB3aGF0IHdhcyBpbnRlbmRlZC4gIEEgd2F5IGFyb3VuZCB0aGlzIGlzICcKKyAgICAgICAgICAgICAndG8gdXNlXG4nCisgICAgICAgICAgICAgJyJOb25lIiBhcyB0aGUgZGVmYXVsdCwgYW5kIGV4cGxpY2l0bHkgdGVzdCBmb3IgaXQgaW4gdGhlIGJvZHkgb2YgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24sIGUuZy46XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBkZWYgd2hhdHNfb25fdGhlX3RlbGx5KHBlbmd1aW49Tm9uZSk6XG4nCisgICAgICAgICAgICAgJyAgICAgICBpZiBwZW5ndWluIGlzIE5vbmU6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgcGVuZ3VpbiA9IFtdXG4nCisgICAgICAgICAgICAgJyAgICAgICBwZW5ndWluLmFwcGVuZCgicHJvcGVydHkgb2YgdGhlIHpvbyIpXG4nCisgICAgICAgICAgICAgJyAgICAgICByZXR1cm4gcGVuZ3VpblxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnRnVuY3Rpb24gY2FsbCBzZW1hbnRpY3MgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiBzZWN0aW9uICcKKyAgICAgICAgICAgICAnQ2FsbHMuXG4nCisgICAgICAgICAgICAgJ0EgZnVuY3Rpb24gY2FsbCBhbHdheXMgYXNzaWducyB2YWx1ZXMgdG8gYWxsIHBhcmFtZXRlcnMgJworICAgICAgICAgICAgICdtZW50aW9uZWQgaW5cbicKKyAgICAgICAgICAgICAndGhlIHBhcmFtZXRlciBsaXN0LCBlaXRoZXIgZnJvbSBwb3NpdGlvbiBhcmd1bWVudHMsIGZyb20gJworICAgICAgICAgICAgICdrZXl3b3JkXG4nCisgICAgICAgICAgICAgJ2FyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtICIiKmlkZW50aWZpZXIiIiAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJ3ByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgdHVwbGUgcmVjZWl2aW5nIGFueSBleGNlc3MgJworICAgICAgICAgICAgICdwb3NpdGlvbmFsXG4nCisgICAgICAgICAgICAgJ3BhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiAgSWYgdGhlIGZvcm1cbicKKyAgICAgICAgICAgICAnIiIqKmlkZW50aWZpZXIiIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ldyAnCisgICAgICAgICAgICAgJ2RpY3Rpb25hcnlcbicKKyAgICAgICAgICAgICAncmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYSBuZXcgJworICAgICAgICAgICAgICdlbXB0eVxuJworICAgICAgICAgICAgICdkaWN0aW9uYXJ5LiBQYXJhbWV0ZXJzIGFmdGVyICIiKiIiIG9yICIiKmlkZW50aWZpZXIiIiBhcmUgJworICAgICAgICAgICAgICdrZXl3b3JkLW9ubHlcbicKKyAgICAgICAgICAgICAncGFyYW1ldGVycyBhbmQgbWF5IG9ubHkgYmUgcGFzc2VkIHVzZWQga2V5d29yZCBhcmd1bWVudHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdQYXJhbWV0ZXJzIG1heSBoYXZlIGFubm90YXRpb25zIG9mIHRoZSBmb3JtICIiOiBleHByZXNzaW9uIiIgJworICAgICAgICAgICAgICdmb2xsb3dpbmdcbicKKyAgICAgICAgICAgICAndGhlIHBhcmFtZXRlciBuYW1lLiAgQW55IHBhcmFtZXRlciBtYXkgaGF2ZSBhbiBhbm5vdGF0aW9uIGV2ZW4gJworICAgICAgICAgICAgICd0aG9zZVxuJworICAgICAgICAgICAgICdvZiB0aGUgZm9ybSAiKmlkZW50aWZpZXIiIG9yICIqKmlkZW50aWZpZXIiLiAgRnVuY3Rpb25zIG1heSAnCisgICAgICAgICAgICAgJ2hhdmVcbicKKyAgICAgICAgICAgICAnInJldHVybiIgYW5ub3RhdGlvbiBvZiB0aGUgZm9ybSAiIi0+IGV4cHJlc3Npb24iIiBhZnRlciB0aGUgJworICAgICAgICAgICAgICdwYXJhbWV0ZXJcbicKKyAgICAgICAgICAgICAnbGlzdC4gIFRoZXNlIGFubm90YXRpb25zIGNhbiBiZSBhbnkgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gYW5kICcKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJ2V2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLiAgQW5ub3RhdGlvbnMgJworICAgICAgICAgICAgICdtYXlcbicKKyAgICAgICAgICAgICAnYmUgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IG9yZGVyIHRoYW4gdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSAnCisgICAgICAgICAgICAgJ2NvZGUuXG4nCisgICAgICAgICAgICAgJ1RoZSBwcmVzZW5jZSBvZiBhbm5vdGF0aW9ucyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiBhXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uLiAgVGhlIGFubm90YXRpb24gdmFsdWVzIGFyZSBhdmFpbGFibGUgYXMgdmFsdWVzIG9mIGFcbicKKyAgICAgICAgICAgICAiZGljdGlvbmFyeSBrZXllZCBieSB0aGUgcGFyYW1ldGVycycgbmFtZXMgaW4gdGhlICIKKyAgICAgICAgICAgICAnIl9fYW5ub3RhdGlvbnNfXyJcbicKKyAgICAgICAgICAgICAnYXR0cmlidXRlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbm9ueW1vdXMgZnVuY3Rpb25zIChmdW5jdGlvbnMgbm90ICcKKyAgICAgICAgICAgICAnYm91bmRcbicKKyAgICAgICAgICAgICAndG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb25zLCBkZXNjcmliZWQgaW4gc2VjdGlvbiBMYW1iZGFzLiAgTm90ZSB0aGF0IHRoZSAnCisgICAgICAgICAgICAgJ2xhbWJkYVxuJworICAgICAgICAgICAgICdleHByZXNzaW9uIGlzIG1lcmVseSBhIHNob3J0aGFuZCBmb3IgYSBzaW1wbGlmaWVkIGZ1bmN0aW9uICcKKyAgICAgICAgICAgICAnZGVmaW5pdGlvbjtcbicKKyAgICAgICAgICAgICAnYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgIiJkZWYiIiBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgJworICAgICAgICAgICAgICdvclxuJworICAgICAgICAgICAgICdhc3NpZ25lZCB0byBhbm90aGVyIG5hbWUganVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhICcKKyAgICAgICAgICAgICAnbGFtYmRhXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24uICBUaGUgIiJkZWYiIiBmb3JtIGlzIGFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgJworICAgICAgICAgICAgICdpdFxuJworICAgICAgICAgICAgICdhbGxvd3MgdGhlIGV4ZWN1dGlvbiBvZiBtdWx0aXBsZSBzdGF0ZW1lbnRzIGFuZCBhbm5vdGF0aW9ucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIioqUHJvZ3JhbW1lcidzIG5vdGU6KiogRnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzLiAgQSAiCisgICAgICAgICAgICAgJyIiZGVmIiJcbicKKyAgICAgICAgICAgICAnc3RhdGVtZW50IGV4ZWN1dGVkIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIGxvY2FsXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIHRoYXQgY2FuIGJlIHJldHVybmVkIG9yIHBhc3NlZCBhcm91bmQuICBGcmVlIHZhcmlhYmxlcyAnCisgICAgICAgICAgICAgJ3VzZWRcbicKKyAgICAgICAgICAgICAnaW4gdGhlIG5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlICcKKyAgICAgICAgICAgICAnZnVuY3Rpb25cbicKKyAgICAgICAgICAgICAnY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb24gTmFtaW5nIGFuZCBiaW5kaW5nIGZvciAnCisgICAgICAgICAgICAgJ2RldGFpbHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgKipQRVAgMzEwNyoqIC0gRnVuY3Rpb24gQW5ub3RhdGlvbnNcbicKKyAgICAgICAgICAgICAnICAgICBUaGUgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbiBmb3IgZnVuY3Rpb24gYW5ub3RhdGlvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ2xhc3MgZGVmaW5pdGlvbnNcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgY2xhc3MgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgb2JqZWN0IChzZWUgc2VjdGlvbiBUaGUgJworICAgICAgICAgICAgICdzdGFuZGFyZFxuJworICAgICAgICAgICAgICd0eXBlIGhpZXJhcmNoeSk6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBjbGFzc2RlZiAgICA6Oj0gW2RlY29yYXRvcnNdICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gJworICAgICAgICAgICAgICciOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbYXJndW1lbnRfbGlzdF0gIikiXG4nCisgICAgICAgICAgICAgJyAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBUaGUgaW5oZXJpdGFuY2UgJworICAgICAgICAgICAgICdsaXN0XG4nCisgICAgICAgICAgICAgJ3VzdWFsbHkgZ2l2ZXMgYSBsaXN0IG9mIGJhc2UgY2xhc3NlcyAoc2VlIE1ldGFjbGFzc2VzIGZvciBtb3JlXG4nCisgICAgICAgICAgICAgJ2FkdmFuY2VkIHVzZXMpLCBzbyBlYWNoIGl0ZW0gaW4gdGhlIGxpc3Qgc2hvdWxkIGV2YWx1YXRlIHRvIGEgJworICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICdvYmplY3Qgd2hpY2ggYWxsb3dzIHN1YmNsYXNzaW5nLiAgQ2xhc3NlcyB3aXRob3V0IGFuIGluaGVyaXRhbmNlICcKKyAgICAgICAgICAgICAnbGlzdFxuJworICAgICAgICAgICAgICdpbmhlcml0LCBieSBkZWZhdWx0LCBmcm9tIHRoZSBiYXNlIGNsYXNzICJvYmplY3QiOyBoZW5jZSxcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGNsYXNzIEZvbzpcbicKKyAgICAgICAgICAgICAnICAgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2lzIGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGNsYXNzIEZvbyhvYmplY3QpOlxuJworICAgICAgICAgICAgICcgICAgICAgcGFzc1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiVGhlIGNsYXNzJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb24gZnJhbWUgIgorICAgICAgICAgICAgICcoc2VlXG4nCisgICAgICAgICAgICAgJ05hbWluZyBhbmQgYmluZGluZyksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbCBuYW1lc3BhY2UgYW5kICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ29yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUgY29udGFpbnMgbW9zdGx5XG4nCisgICAgICAgICAgICAgImZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNzJ3Mgc3VpdGUgZmluaXNoZXMgIgorICAgICAgICAgICAgICdleGVjdXRpb24sIGl0c1xuJworICAgICAgICAgICAgICdleGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzIHNhdmVkLiAnCisgICAgICAgICAgICAgJ1s0XSBBXG4nCisgICAgICAgICAgICAgJ2NsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3QgZm9yIHRoZSAnCisgICAgICAgICAgICAgJ2Jhc2VcbicKKyAgICAgICAgICAgICAnY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgJ2RpY3Rpb25hcnkuXG4nCisgICAgICAgICAgICAgJ1RoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZSBvcmlnaW5hbCAnCisgICAgICAgICAgICAgJ2xvY2FsXG4nCisgICAgICAgICAgICAgJ25hbWVzcGFjZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NsYXNzIGNyZWF0aW9uIGNhbiBiZSBjdXN0b21pemVkIGhlYXZpbHkgdXNpbmcgbWV0YWNsYXNzZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDbGFzc2VzIGNhbiBhbHNvIGJlIGRlY29yYXRlZDoganVzdCBsaWtlIHdoZW4gZGVjb3JhdGluZyAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9ucyxcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEBmMShhcmcpXG4nCisgICAgICAgICAgICAgJyAgIEBmMlxuJworICAgICAgICAgICAgICcgICBjbGFzcyBGb286IHBhc3NcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2lzIHJvdWdobHkgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgY2xhc3MgRm9vOiBwYXNzXG4nCisgICAgICAgICAgICAgJyAgIEZvbyA9IGYxKGFyZykoZjIoRm9vKSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSAnCisgICAgICAgICAgICAgJ2FzIGZvclxuJworICAgICAgICAgICAgICdmdW5jdGlvbiBkZWNvcmF0b3JzLiAgVGhlIHJlc3VsdCBpcyB0aGVuIGJvdW5kIHRvIHRoZSBjbGFzcyAnCisgICAgICAgICAgICAgJ25hbWUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICIqKlByb2dyYW1tZXIncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uICIKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJ2NsYXNzIGF0dHJpYnV0ZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBpbnN0YW5jZXMuICBJbnN0YW5jZSAnCisgICAgICAgICAgICAgJ2F0dHJpYnV0ZXNcbicKKyAgICAgICAgICAgICAnY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoICJzZWxmLm5hbWUgPSB2YWx1ZSIuICBCb3RoIGNsYXNzICcKKyAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgJ2luc3RhbmNlIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb24gJworICAgICAgICAgICAgICciInNlbGYubmFtZSIiLFxuJworICAgICAgICAgICAgICdhbmQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGhpZGVzIGEgY2xhc3MgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgJworICAgICAgICAgICAgICduYW1lXG4nCisgICAgICAgICAgICAgJ3doZW4gYWNjZXNzZWQgaW4gdGhpcyB3YXkuICBDbGFzcyBhdHRyaWJ1dGVzIGNhbiBiZSB1c2VkIGFzICcKKyAgICAgICAgICAgICAnZGVmYXVsdHNcbicKKyAgICAgICAgICAgICAnZm9yIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4gbGVhZCAnCisgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgJ3VuZXhwZWN0ZWQgcmVzdWx0cy4gIERlc2NyaXB0b3JzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZVxuJworICAgICAgICAgICAgICd2YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvOiAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMyAqKlBFUCAzMTI5KiogLVxuJworICAgICAgICAgICAgICcgIENsYXNzIERlY29yYXRvcnNcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDb3JvdXRpbmVzXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05ldyBpbiB2ZXJzaW9uIDMuNS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDb3JvdXRpbmUgZnVuY3Rpb24gZGVmaW5pdGlvblxuJworICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgYXN5bmNfZnVuY2RlZiA6Oj0gW2RlY29yYXRvcnNdICJhc3luYyIgImRlZiIgZnVuY25hbWUgIigiICcKKyAgICAgICAgICAgICAnW3BhcmFtZXRlcl9saXN0XSAiKSIgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdFeGVjdXRpb24gb2YgUHl0aG9uIGNvcm91dGluZXMgY2FuIGJlIHN1c3BlbmRlZCBhbmQgcmVzdW1lZCBhdCAnCisgICAgICAgICAgICAgJ21hbnlcbicKKyAgICAgICAgICAgICAncG9pbnRzIChzZWUgKmNvcm91dGluZSopLiAgSW4gdGhlIGJvZHkgb2YgYSBjb3JvdXRpbmUsIGFueSAnCisgICAgICAgICAgICAgJyJhd2FpdCIgYW5kXG4nCisgICAgICAgICAgICAgJyJhc3luYyIgaWRlbnRpZmllcnMgYmVjb21lIHJlc2VydmVkIGtleXdvcmRzOyAiYXdhaXQiICcKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbnMsXG4nCisgICAgICAgICAgICAgJyJhc3luYyBmb3IiIGFuZCAiYXN5bmMgd2l0aCIgY2FuIG9ubHkgYmUgdXNlZCBpbiBjb3JvdXRpbmUgJworICAgICAgICAgICAgICdib2RpZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdGdW5jdGlvbnMgZGVmaW5lZCB3aXRoICJhc3luYyBkZWYiIHN5bnRheCBhcmUgYWx3YXlzIGNvcm91dGluZVxuJworICAgICAgICAgICAgICdmdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSBkbyBub3QgY29udGFpbiAiYXdhaXQiIG9yICJhc3luYyIgJworICAgICAgICAgICAgICdrZXl3b3Jkcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0l0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgInlpZWxkIiBleHByZXNzaW9ucyBpbiAiYXN5bmMgZGVmIlxuJworICAgICAgICAgICAgICdjb3JvdXRpbmVzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQW4gZXhhbXBsZSBvZiBhIGNvcm91dGluZSBmdW5jdGlvbjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGFzeW5jIGRlZiBmdW5jKHBhcmFtMSwgcGFyYW0yKTpcbicKKyAgICAgICAgICAgICAnICAgICAgIGRvX3N0dWZmKClcbicKKyAgICAgICAgICAgICAnICAgICAgIGF3YWl0IHNvbWVfY29yb3V0aW5lKClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImFzeW5jIGZvciIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGFzeW5jX2Zvcl9zdG10IDo6PSAiYXN5bmMiIGZvcl9zdG10XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBbiAqYXN5bmNocm9ub3VzIGl0ZXJhYmxlKiBpcyBhYmxlIHRvIGNhbGwgYXN5bmNocm9ub3VzIGNvZGUgaW4gJworICAgICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAgICAnKml0ZXIqIGltcGxlbWVudGF0aW9uLCBhbmQgKmFzeW5jaHJvbm91cyBpdGVyYXRvciogY2FuIGNhbGxcbicKKyAgICAgICAgICAgICAnYXN5bmNocm9ub3VzIGNvZGUgaW4gaXRzICpuZXh0KiBtZXRob2QuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImFzeW5jIGZvciIgc3RhdGVtZW50IGFsbG93cyBjb252ZW5pZW50IGl0ZXJhdGlvbiBvdmVyXG4nCisgICAgICAgICAgICAgJ2FzeW5jaHJvbm91cyBpdGVyYXRvcnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIGNvZGU6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBhc3luYyBmb3IgVEFSR0VUIGluIElURVI6XG4nCisgICAgICAgICAgICAgJyAgICAgICBCTE9DS1xuJworICAgICAgICAgICAgICcgICBlbHNlOlxuJworICAgICAgICAgICAgICcgICAgICAgQkxPQ0syXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGl0ZXIgPSAoSVRFUilcbicKKyAgICAgICAgICAgICAnICAgaXRlciA9IHR5cGUoaXRlcikuX19haXRlcl9fKGl0ZXIpXG4nCisgICAgICAgICAgICAgJyAgIHJ1bm5pbmcgPSBUcnVlXG4nCisgICAgICAgICAgICAgJyAgIHdoaWxlIHJ1bm5pbmc6XG4nCisgICAgICAgICAgICAgJyAgICAgICB0cnk6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgVEFSR0VUID0gYXdhaXQgdHlwZShpdGVyKS5fX2FuZXh0X18oaXRlcilcbicKKyAgICAgICAgICAgICAnICAgICAgIGV4Y2VwdCBTdG9wQXN5bmNJdGVyYXRpb246XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgcnVubmluZyA9IEZhbHNlXG4nCisgICAgICAgICAgICAgJyAgICAgICBlbHNlOlxuJworICAgICAgICAgICAgICcgICAgICAgICAgIEJMT0NLXG4nCisgICAgICAgICAgICAgJyAgIGVsc2U6XG4nCisgICAgICAgICAgICAgJyAgICAgICBCTE9DSzJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvICJfX2FpdGVyX18oKSIgYW5kICJfX2FuZXh0X18oKSIgZm9yIGRldGFpbHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJdCBpcyBhICJTeW50YXhFcnJvciIgdG8gdXNlICJhc3luYyBmb3IiIHN0YXRlbWVudCBvdXRzaWRlIG9mICcKKyAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAnImFzeW5jIGRlZiIgZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJhc3luYyB3aXRoIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGFzeW5jX3dpdGhfc3RtdCA6Oj0gImFzeW5jIiB3aXRoX3N0bXRcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0FuICphc3luY2hyb25vdXMgY29udGV4dCBtYW5hZ2VyKiBpcyBhICpjb250ZXh0IG1hbmFnZXIqIHRoYXQgaXMgJworICAgICAgICAgICAgICdhYmxlXG4nCisgICAgICAgICAgICAgJ3RvIHN1c3BlbmQgZXhlY3V0aW9uIGluIGl0cyAqZW50ZXIqIGFuZCAqZXhpdCogbWV0aG9kcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgY29kZTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGFzeW5jIHdpdGggRVhQUiBhcyBWQVI6XG4nCisgICAgICAgICAgICAgJyAgICAgICBCTE9DS1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBtZ3IgPSAoRVhQUilcbicKKyAgICAgICAgICAgICAnICAgYWV4aXQgPSB0eXBlKG1ncikuX19hZXhpdF9fXG4nCisgICAgICAgICAgICAgJyAgIGFlbnRlciA9IHR5cGUobWdyKS5fX2FlbnRlcl9fKG1ncilcbicKKyAgICAgICAgICAgICAnICAgZXhjID0gVHJ1ZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVkFSID0gYXdhaXQgYWVudGVyXG4nCisgICAgICAgICAgICAgJyAgIHRyeTpcbicKKyAgICAgICAgICAgICAnICAgICAgIEJMT0NLXG4nCisgICAgICAgICAgICAgJyAgIGV4Y2VwdDpcbicKKyAgICAgICAgICAgICAnICAgICAgIGlmIG5vdCBhd2FpdCBhZXhpdChtZ3IsICpzeXMuZXhjX2luZm8oKSk6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgcmFpc2VcbicKKyAgICAgICAgICAgICAnICAgZWxzZTpcbicKKyAgICAgICAgICAgICAnICAgICAgIGF3YWl0IGFleGl0KG1nciwgTm9uZSwgTm9uZSwgTm9uZSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvICJfX2FlbnRlcl9fKCkiIGFuZCAiX19hZXhpdF9fKCkiIGZvciBkZXRhaWxzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSAiYXN5bmMgd2l0aCIgc3RhdGVtZW50IG91dHNpZGUgb2YgJworICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICciYXN5bmMgZGVmIiBmdW5jdGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvOiAqKlBFUCA0OTIqKiAtIENvcm91dGluZXMgd2l0aCBhc3luYyBhbmQgYXdhaXQgc3ludGF4XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICctWyBGb290bm90ZXMgXS1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1sxXSBUaGUgZXhjZXB0aW9uIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGludm9jYXRpb24gc3RhY2sgdW5sZXNzXG4nCisgICAgICAgICAgICAgJyAgICB0aGVyZSBpcyBhICJmaW5hbGx5IiBjbGF1c2Ugd2hpY2ggaGFwcGVucyB0byByYWlzZSBhbm90aGVyXG4nCisgICAgICAgICAgICAgJyAgICBleGNlcHRpb24uIFRoYXQgbmV3IGV4Y2VwdGlvbiBjYXVzZXMgdGhlIG9sZCBvbmUgdG8gYmUgJworICAgICAgICAgICAgICdsb3N0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnWzJdIEN1cnJlbnRseSwgY29udHJvbCAiZmxvd3Mgb2ZmIHRoZSBlbmQiIGV4Y2VwdCBpbiB0aGUgY2FzZSAnCisgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgJyAgICBhbiBleGNlcHRpb24gb3IgdGhlIGV4ZWN1dGlvbiBvZiBhICJyZXR1cm4iLCAiY29udGludWUiLCBvclxuJworICAgICAgICAgICAgICcgICAgImJyZWFrIiBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdbM10gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGVcbicKKyAgICAgICAgICAgICAnICAgIGZ1bmN0aW9uIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgZnVuY3Rpb25cJ3MgIl9fZG9jX18iXG4nCisgICAgICAgICAgICAgIiAgICBhdHRyaWJ1dGUgYW5kIHRoZXJlZm9yZSB0aGUgZnVuY3Rpb24ncyAqZG9jc3RyaW5nKi5cbiIKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1s0XSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSAnCisgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgJyAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG5hbWVzcGFjZVwncyAiX19kb2NfXyIgaXRlbSAnCisgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICIgICAgdGhlcmVmb3JlIHRoZSBjbGFzcydzICpkb2NzdHJpbmcqLlxuIiwKKyAnY29udGV4dC1tYW5hZ2Vycyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdXaXRoIFN0YXRlbWVudCBDb250ZXh0IE1hbmFnZXJzXG4nCisgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0EgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ3J1bnRpbWUgY29udGV4dCB0b1xuJworICAgICAgICAgICAgICAgICAgICAgJ2JlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgIndpdGgiIHN0YXRlbWVudC4gVGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdjb250ZXh0IG1hbmFnZXJcbicKKyAgICAgICAgICAgICAgICAgICAgICdoYW5kbGVzIHRoZSBlbnRyeSBpbnRvLCBhbmQgdGhlIGV4aXQgZnJvbSwgdGhlIGRlc2lyZWQgJworICAgICAgICAgICAgICAgICAgICAgJ3J1bnRpbWUgY29udGV4dFxuJworICAgICAgICAgICAgICAgICAgICAgJ2ZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCAnCisgICAgICAgICAgICAgICAgICAgICAnbWFuYWdlcnMgYXJlIG5vcm1hbGx5XG4nCisgICAgICAgICAgICAgICAgICAgICAnaW52b2tlZCB1c2luZyB0aGUgIndpdGgiIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb24gJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSB3aXRoXG4nCisgICAgICAgICAgICAgICAgICAgICAnc3RhdGVtZW50KSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZWlyIG1ldGhvZHMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kICcKKyAgICAgICAgICAgICAgICAgICAgICdyZXN0b3JpbmcgdmFyaW91c1xuJworICAgICAgICAgICAgICAgICAgICAgJ2tpbmRzIG9mIGdsb2JhbCBzdGF0ZSwgbG9ja2luZyBhbmQgdW5sb2NraW5nIHJlc291cmNlcywgJworICAgICAgICAgICAgICAgICAgICAgJ2Nsb3Npbmcgb3BlbmVkXG4nCisgICAgICAgICAgICAgICAgICAgICAnZmlsZXMsIGV0Yy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgQ29udGV4dCAnCisgICAgICAgICAgICAgICAgICAgICAnTWFuYWdlciBUeXBlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19lbnRlcl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgJworICAgICAgICAgICAgICAgICAgICAgJyJ3aXRoIlxuJworICAgICAgICAgICAgICAgICAgICAgIiAgIHN0YXRlbWVudCB3aWxsIGJpbmQgdGhpcyBtZXRob2QncyByZXR1cm4gdmFsdWUgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICd0YXJnZXQocylcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBzcGVjaWZpZWQgaW4gdGhlICJhcyIgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmICcKKyAgICAgICAgICAgICAgICAgICAgICdhbnkuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjaylcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdwYXJhbWV0ZXJzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSAnCisgICAgICAgICAgICAgICAgICAgICAnZXhpdGVkLiBJZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXJndW1lbnRzIHdpbGxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBiZSAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gJworICAgICAgICAgICAgICAgICAgICAgJ3N1cHByZXNzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCAnCisgICAgICAgICAgICAgICAgICAgICAnaXQgc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgcmV0dXJuIGEgdHJ1ZSB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgJworICAgICAgICAgICAgICAgICAgICAgJ3Byb2Nlc3NlZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIE5vdGUgdGhhdCAiX19leGl0X18oKSIgbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdwYXNzZWQtaW5cbicKKyAgICAgICAgICAgICAgICAgICAgICIgICBleGNlcHRpb247IHRoaXMgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5LlxuIgorICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgKipQRVAgMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdQeXRob24gIndpdGgiXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICBzdGF0ZW1lbnQuXG4nLAorICdjb250aW51ZSc6ICdcbicKKyAgICAgICAgICAgICAnVGhlICJjb250aW51ZSIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgY29udGludWVfc3RtdCA6Oj0gImNvbnRpbnVlIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnImNvbnRpbnVlIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhICJmb3IiIG9yICcKKyAgICAgICAgICAgICAnIndoaWxlIlxuJworICAgICAgICAgICAgICdsb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb24gb3IgJworICAgICAgICAgICAgICciZmluYWxseSJcbicKKyAgICAgICAgICAgICAnY2xhdXNlIHdpdGhpbiB0aGF0IGxvb3AuICBJdCBjb250aW51ZXMgd2l0aCB0aGUgbmV4dCBjeWNsZSBvZiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICduZWFyZXN0IGVuY2xvc2luZyBsb29wLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnV2hlbiAiY29udGludWUiIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGFcbicKKyAgICAgICAgICAgICAnImZpbmFsbHkiIGNsYXVzZSwgdGhhdCAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSAnCisgICAgICAgICAgICAgJ3JlYWxseVxuJworICAgICAgICAgICAgICdzdGFydGluZyB0aGUgbmV4dCBsb29wIGN5Y2xlLlxuJywKKyAnY29udmVyc2lvbnMnOiAnXG4nCisgICAgICAgICAgICAgICAgJ0FyaXRobWV0aWMgY29udmVyc2lvbnNcbicKKyAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnV2hlbiBhIGRlc2NyaXB0aW9uIG9mIGFuIGFyaXRobWV0aWMgb3BlcmF0b3IgYmVsb3cgdXNlcyB0aGUgJworICAgICAgICAgICAgICAgICdwaHJhc2VcbicKKyAgICAgICAgICAgICAgICAnInRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUsIiB0aGlzICcKKyAgICAgICAgICAgICAgICAnbWVhbnNcbicKKyAgICAgICAgICAgICAgICAndGhhdCB0aGUgb3BlcmF0b3IgaW1wbGVtZW50YXRpb24gZm9yIGJ1aWx0LWluIHR5cGVzIHdvcmtzIGFzICcKKyAgICAgICAgICAgICAgICAnZm9sbG93czpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgY29tcGxleCBudW1iZXIsIHRoZSBvdGhlciBpcyAnCisgICAgICAgICAgICAgICAgJ2NvbnZlcnRlZCB0b1xuJworICAgICAgICAgICAgICAgICcgIGNvbXBsZXg7XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIG90aGVyd2lzZSwgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCAnCisgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICcgIG90aGVyIGlzIGNvbnZlcnRlZCB0byBmbG9hdGluZyBwb2ludDtcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogb3RoZXJ3aXNlLCBib3RoIG11c3QgYmUgaW50ZWdlcnMgYW5kIG5vIGNvbnZlcnNpb24gaXMgJworICAgICAgICAgICAgICAgICduZWNlc3NhcnkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdTb21lIGFkZGl0aW9uYWwgcnVsZXMgYXBwbHkgZm9yIGNlcnRhaW4gb3BlcmF0b3JzIChlLmcuLCBhICcKKyAgICAgICAgICAgICAgICAnc3RyaW5nIGFzIGFcbicKKyAgICAgICAgICAgICAgICAibGVmdCBhcmd1bWVudCB0byB0aGUgJyUnIG9wZXJhdG9yKS4gIEV4dGVuc2lvbnMgbXVzdCBkZWZpbmUgIgorICAgICAgICAgICAgICAgICd0aGVpciBvd25cbicKKyAgICAgICAgICAgICAgICAnY29udmVyc2lvbiBiZWhhdmlvci5cbicsCisgJ2N1c3RvbWl6YXRpb24nOiAnXG4nCisgICAgICAgICAgICAgICAgICAnQmFzaWMgY3VzdG9taXphdGlvblxuJworICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19uZXdfXyhjbHNbLCAuLi5dKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICAnCisgICAgICAgICAgICAgICAgICAnIl9fbmV3X18oKSIgaXMgYVxuJworICAgICAgICAgICAgICAgICAgJyAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgJworICAgICAgICAgICAgICAgICAgJ2FzIHN1Y2gpXG4nCisgICAgICAgICAgICAgICAgICAnICAgdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCAnCisgICAgICAgICAgICAgICAgICAnYXMgaXRzXG4nCisgICAgICAgICAgICAgICAgICAnICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgJworICAgICAgICAgICAgICAgICAgJ3Bhc3NlZCB0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gICcKKyAgICAgICAgICAgICAgICAgICdUaGUgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICAnICAgdmFsdWUgb2YgIl9fbmV3X18oKSIgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgICcodXN1YWxseSBhblxuJworICAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlIG9mICpjbHMqKS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUeXBpY2FsIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICdjbGFzcyBieVxuJworICAgICAgICAgICAgICAgICAgJyAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNzXCdzICJfX25ld19fKCkiIG1ldGhvZCB1c2luZ1xuJworICAgICAgICAgICAgICAgICAgJyAgICJzdXBlcihjdXJyZW50Y2xhc3MsIGNscykuX19uZXdfXyhjbHNbLCAuLi5dKSIgd2l0aCAnCisgICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudHMgYW5kIHRoZW4gbW9kaWZ5aW5nIHRoZSBuZXdseS1jcmVhdGVkIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgICdhc1xuJworICAgICAgICAgICAgICAgICAgJyAgIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIElmICJfX25ld19fKCkiIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICduZXdcbicKKyAgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZVwncyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBsaWtlXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9faW5pdF9fKHNlbGZbLCAuLi5dKSIsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3ICcKKyAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSBhbmQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZSBwYXNzZWQgdG8gJworICAgICAgICAgICAgICAgICAgJyJfX25ld19fKCkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIElmICJfX25ld19fKCkiIGRvZXMgbm90IHJldHVybiBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgJworICAgICAgICAgICAgICAgICAgJ3RoZW4gdGhlIG5ld1xuJworICAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19uZXdfXygpIiBpcyBpbnRlbmRlZCBtYWlubHkgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZiAnCisgICAgICAgICAgICAgICAgICAnaW1tdXRhYmxlXG4nCisgICAgICAgICAgICAgICAgICAnICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAgJ2NyZWF0aW9uLiAgSXRcbicKKyAgICAgICAgICAgICAgICAgICcgICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluICcKKyAgICAgICAgICAgICAgICAgICdvcmRlciB0b1xuJworICAgICAgICAgICAgICAgICAgJyAgIGN1c3RvbWl6ZSBjbGFzcyBjcmVhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIChieSAnCisgICAgICAgICAgICAgICAgICAnIl9fbmV3X18oKSIpLCBidXRcbicKKyAgICAgICAgICAgICAgICAgICcgICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gIFRoZSBhcmd1bWVudHMgYXJlICcKKyAgICAgICAgICAgICAgICAgICd0aG9zZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSAnCisgICAgICAgICAgICAgICAgICAnY2xhc3MgaGFzIGFuXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9faW5pdF9fKCkiIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgIl9faW5pdF9fKCkiICcKKyAgICAgICAgICAgICAgICAgICdtZXRob2QsIGlmXG4nCisgICAgICAgICAgICAgICAgICAnICAgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyICcKKyAgICAgICAgICAgICAgICAgICdpbml0aWFsaXphdGlvbiBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlOyBmb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICcgICAiQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYsIFthcmdzLi4uXSkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIEJlY2F1c2UgIl9fbmV3X18oKSIgYW5kICJfX2luaXRfXygpIiB3b3JrIHRvZ2V0aGVyIGluICcKKyAgICAgICAgICAgICAgICAgICdjb25zdHJ1Y3RpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICBvYmplY3RzICgiX19uZXdfXygpIiB0byBjcmVhdGUgaXQsIGFuZCAiX19pbml0X18oKSIgdG8gJworICAgICAgICAgICAgICAgICAgJ2N1c3RvbWlzZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGl0KSwgbm8gbm9uLSJOb25lIiB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgYnkgJworICAgICAgICAgICAgICAgICAgJyJfX2luaXRfXygpIjsgZG9pbmcgc29cbicKKyAgICAgICAgICAgICAgICAgICcgICB3aWxsIGNhdXNlIGEgIlR5cGVFcnJvciIgdG8gYmUgcmFpc2VkIGF0IHJ1bnRpbWUuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGVsX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICAnaXMgYWxzb1xuJworICAgICAgICAgICAgICAgICAgJyAgIGNhbGxlZCBhIGRlc3RydWN0b3IuICBJZiBhIGJhc2UgY2xhc3MgaGFzIGEgIl9fZGVsX18oKSIgJworICAgICAgICAgICAgICAgICAgJ21ldGhvZCwgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgZGVyaXZlZCBjbGFzc1wncyAiX19kZWxfXygpIiBtZXRob2QsIGlmIGFueSwgbXVzdCAnCisgICAgICAgICAgICAgICAgICAnZXhwbGljaXRseSBjYWxsIGl0XG4nCisgICAgICAgICAgICAgICAgICAnICAgdG8gZW5zdXJlIHByb3BlciBkZWxldGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAnaW5zdGFuY2UuXG4nCisgICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yICcKKyAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19kZWxfXygpIiBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSBieVxuJworICAgICAgICAgICAgICAgICAgJyAgIGNyZWF0aW5nIGEgbmV3IHJlZmVyZW5jZSB0byBpdC4gIEl0IG1heSB0aGVuIGJlIGNhbGxlZCAnCisgICAgICAgICAgICAgICAgICAnYXQgYSBsYXRlclxuJworICAgICAgICAgICAgICAgICAgJyAgIHRpbWUgd2hlbiB0aGlzIG5ldyByZWZlcmVuY2UgaXMgZGVsZXRlZC4gIEl0IGlzIG5vdCAnCisgICAgICAgICAgICAgICAgICAnZ3VhcmFudGVlZCB0aGF0XG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgJworICAgICAgICAgICAgICAgICAgJ2V4aXN0IHdoZW5cbicKKyAgICAgICAgICAgICAgICAgICcgICB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgTm90ZTogImRlbCB4IiBkb2VzblwndCBkaXJlY3RseSBjYWxsICJ4Ll9fZGVsX18oKSIgLS0tICcKKyAgICAgICAgICAgICAgICAgICd0aGUgZm9ybWVyXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yICJ4IiBieSBvbmUsIGFuZCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2xhdHRlciBpc1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgb25seSBjYWxsZWQgd2hlbiAieCJcJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gICcKKyAgICAgICAgICAgICAgICAgICdTb21lIGNvbW1vblxuJworICAgICAgICAgICAgICAgICAgJyAgICAgc2l0dWF0aW9ucyB0aGF0IG1heSBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4gJworICAgICAgICAgICAgICAgICAgJ29iamVjdCBmcm9tXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBnb2luZyB0byB6ZXJvIGluY2x1ZGU6IGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiAnCisgICAgICAgICAgICAgICAgICAnb2JqZWN0cyAoZS5nLixcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoICcKKyAgICAgICAgICAgICAgICAgICdwYXJlbnQgYW5kXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBjaGlsZCBwb2ludGVycyk7IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlICcKKyAgICAgICAgICAgICAgICAgICdzdGFjayBmcmFtZSBvZlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgYSBmdW5jdGlvbiB0aGF0IGNhdWdodCBhbiBleGNlcHRpb24gKHRoZSB0cmFjZWJhY2sgJworICAgICAgICAgICAgICAgICAgJ3N0b3JlZCBpblxuJworICAgICAgICAgICAgICAgICAgJyAgICAgInN5cy5leGNfaW5mbygpWzJdIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpOyBvciBhICcKKyAgICAgICAgICAgICAgICAgICdyZWZlcmVuY2VcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIHRoYXQgcmFpc2VkIGFuICcKKyAgICAgICAgICAgICAgICAgICd1bmhhbmRsZWRcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCAnCisgICAgICAgICAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgICJzeXMubGFzdF90cmFjZWJhY2siIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSkuICAnCisgICAgICAgICAgICAgICAgICAnVGhlIGZpcnN0XG4nCisgICAgICAgICAgICAgICAgICAnICAgICBzaXR1YXRpb24gY2FuIG9ubHkgYmUgcmVtZWRpZWQgYnkgZXhwbGljaXRseSBicmVha2luZyAnCisgICAgICAgICAgICAgICAgICAndGhlIGN5Y2xlcztcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRoZSBzZWNvbmQgY2FuIGJlIHJlc29sdmVkIGJ5IGZyZWVpbmcgdGhlIHJlZmVyZW5jZSB0byAnCisgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB0cmFjZWJhY2sgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWZ1bCwgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICAndGhpcmQgY2FuXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBiZSByZXNvbHZlZCBieSBzdG9yaW5nICJOb25lIiBpbiAic3lzLmxhc3RfdHJhY2ViYWNrIi4gJworICAgICAgICAgICAgICAgICAgJ0NpcmN1bGFyXG4nCisgICAgICAgICAgICAgICAgICAnICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCBhbmQgY2xlYW5lZCAnCisgICAgICAgICAgICAgICAgICAndXAgd2hlbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICIgICAgIGN5Y2xpYyBnYXJiYWdlIGNvbGxlY3RvciBpcyBlbmFibGVkIChpdCdzIG9uIGJ5ICIKKyAgICAgICAgICAgICAgICAgICdkZWZhdWx0KS4gUmVmZXJcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgImdjIiBtb2R1bGUgZm9yIG1vcmUgJworICAgICAgICAgICAgICAgICAgJ2luZm9ybWF0aW9uXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBhYm91dCB0aGlzIHRvcGljLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFdhcm5pbmc6IER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyICcKKyAgICAgICAgICAgICAgICAgICd3aGljaFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyICcKKyAgICAgICAgICAgICAgICAgICdkdXJpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRoZWlyIGV4ZWN1dGlvbiBhcmUgaWdub3JlZCwgYW5kIGEgd2FybmluZyBpcyBwcmludGVkICcKKyAgICAgICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgInN5cy5zdGRlcnIiIGluc3RlYWQuIEFsc28sIHdoZW4gIl9fZGVsX18oKSIgaXMgJworICAgICAgICAgICAgICAgICAgJ2ludm9rZWQgaW5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHJlc3BvbnNlIHRvIGEgbW9kdWxlIGJlaW5nIGRlbGV0ZWQgKGUuZy4sIHdoZW4gJworICAgICAgICAgICAgICAgICAgJ2V4ZWN1dGlvbiBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHByb2dyYW0gaXMgZG9uZSksIG90aGVyIGdsb2JhbHMgcmVmZXJlbmNlZCBieSB0aGUgJworICAgICAgICAgICAgICAgICAgJyJfX2RlbF9fKCkiXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgaW4gdGhlIHByb2Nlc3MgJworICAgICAgICAgICAgICAgICAgJ29mIGJlaW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB0b3JuIGRvd24gKGUuZy4gdGhlIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICAnCisgICAgICAgICAgICAgICAgICAnRm9yIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHJlYXNvbiwgIl9fZGVsX18oKSIgbWV0aG9kcyBzaG91bGQgZG8gdGhlIGFic29sdXRlICcKKyAgICAgICAgICAgICAgICAgICdtaW5pbXVtIG5lZWRlZFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgdG8gbWFpbnRhaW4gZXh0ZXJuYWwgaW52YXJpYW50cy4gIFN0YXJ0aW5nIHdpdGggJworICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24gMS41LFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgUHl0aG9uIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggJworICAgICAgICAgICAgICAgICAgJ2Egc2luZ2xlXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB1bmRlcnNjb3JlIGFyZSBkZWxldGVkIGZyb20gdGhlaXIgbW9kdWxlIGJlZm9yZSBvdGhlciAnCisgICAgICAgICAgICAgICAgICAnZ2xvYmFscyBhcmVcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGRlbGV0ZWQ7IGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCAnCisgICAgICAgICAgICAgICAgICAndGhpcyBtYXlcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCAnCisgICAgICAgICAgICAgICAgICAnYXZhaWxhYmxlIGF0IHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgdGltZSB3aGVuIHRoZSAiX19kZWxfXygpIiBtZXRob2QgaXMgY2FsbGVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JlcHJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSB0aGUgInJlcHIoKSIgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgJworICAgICAgICAgICAgICAgICAgJyJvZmZpY2lhbCJcbicKKyAgICAgICAgICAgICAgICAgICcgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCAnCisgICAgICAgICAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBsb29rIGxpa2UgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiB0aGF0IGNvdWxkIGJlICcKKyAgICAgICAgICAgICAgICAgICd1c2VkIHRvXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmVjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuICcKKyAgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGVudmlyb25tZW50KS4gIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2Zvcm1cbicKKyAgICAgICAgICAgICAgICAgICcgICAiPC4uLnNvbWUgdXNlZnVsIGRlc2NyaXB0aW9uLi4uPiIgc2hvdWxkIGJlIHJldHVybmVkLiAnCisgICAgICAgICAgICAgICAgICAnVGhlIHJldHVyblxuJworICAgICAgICAgICAgICAgICAgJyAgIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgJworICAgICAgICAgICAgICAgICAgJyJfX3JlcHJfXygpIiBidXRcbicKKyAgICAgICAgICAgICAgICAgICcgICBub3QgIl9fc3RyX18oKSIsIHRoZW4gIl9fcmVwcl9fKCkiIGlzIGFsc28gdXNlZCB3aGVuIGFuICcKKyAgICAgICAgICAgICAgICAgICciaW5mb3JtYWwiXG4nCisgICAgICAgICAgICAgICAgICAnICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIGlzICcKKyAgICAgICAgICAgICAgICAgICdyZXF1aXJlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHNvIGl0IGlzIGltcG9ydGFudCAnCisgICAgICAgICAgICAgICAgICAndGhhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19zdHJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSAic3RyKG9iamVjdCkiIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICcKKyAgICAgICAgICAgICAgICAgICciZm9ybWF0KCkiIGFuZFxuJworICAgICAgICAgICAgICAgICAgJyAgICJwcmludCgpIiB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIG9yIG5pY2VseSBwcmludGFibGUgJworICAgICAgICAgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICAgICAgICAgJyAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhICcKKyAgICAgICAgICAgICAgICAgICdzdHJpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tICJvYmplY3QuX19yZXByX18oKSIgaW4gdGhhdCAnCisgICAgICAgICAgICAgICAgICAndGhlcmUgaXMgbm9cbicKKyAgICAgICAgICAgICAgICAgICcgICBleHBlY3RhdGlvbiB0aGF0ICJfX3N0cl9fKCkiIHJldHVybiBhIHZhbGlkIFB5dGhvbiAnCisgICAgICAgICAgICAgICAgICAnZXhwcmVzc2lvbjogYVxuJworICAgICAgICAgICAgICAgICAgJyAgIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRlZmluZWQgYnkgdGhlIGJ1aWx0LWluIHR5cGUgJworICAgICAgICAgICAgICAgICAgJyJvYmplY3QiXG4nCisgICAgICAgICAgICAgICAgICAnICAgY2FsbHMgIm9iamVjdC5fX3JlcHJfXygpIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ieXRlc19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5ICJieXRlcygpIiB0byBjb21wdXRlIGEgYnl0ZS1zdHJpbmcgJworICAgICAgICAgICAgICAgICAgJ3JlcHJlc2VudGF0aW9uIG9mIGFuXG4nCisgICAgICAgICAgICAgICAgICAnICAgb2JqZWN0LiBUaGlzIHNob3VsZCByZXR1cm4gYSAiYnl0ZXMiIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYylcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgdGhlICJmb3JtYXQoKSIgYnVpbHQtaW4gZnVuY3Rpb24sIGFuZCBieSAnCisgICAgICAgICAgICAgICAgICAnZXh0ZW5zaW9uLFxuJworICAgICAgICAgICAgICAgICAgJyAgIGV2YWx1YXRpb24gb2YgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICAgICcic3RyLmZvcm1hdCgpIlxuJworICAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCwgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiIHN0cmluZyByZXByZXNlbnRhdGlvbiAnCisgICAgICAgICAgICAgICAgICAnb2YgYW5cbicKKyAgICAgICAgICAgICAgICAgICcgICBvYmplY3QuIFRoZSAiZm9ybWF0X3NwZWMiIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHRoYXQgJworICAgICAgICAgICAgICAgICAgJ2NvbnRhaW5zIGFcbicKKyAgICAgICAgICAgICAgICAgICcgICBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGRlc2lyZWQuIFRoZSAnCisgICAgICAgICAgICAgICAgICAnaW50ZXJwcmV0YXRpb25cbicKKyAgICAgICAgICAgICAgICAgICcgICBvZiB0aGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyB1cCB0byB0aGUgdHlwZSAnCisgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50aW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9fZm9ybWF0X18oKSIsIGhvd2V2ZXIgbW9zdCBjbGFzc2VzIHdpbGwgZWl0aGVyICcKKyAgICAgICAgICAgICAgICAgICdkZWxlZ2F0ZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGZvcm1hdHRpbmcgdG8gb25lIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3IgdXNlIGEgJworICAgICAgICAgICAgICAgICAgJ3NpbWlsYXJcbicKKyAgICAgICAgICAgICAgICAgICcgICBmb3JtYXR0aW5nIG9wdGlvbiBzeW50YXguXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgU2VlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UgZm9yIGEgZGVzY3JpcHRpb24gJworICAgICAgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHN0YW5kYXJkIGZvcm1hdHRpbmcgc3ludGF4LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNDogVGhlIF9fZm9ybWF0X18gbWV0aG9kIG9mICcKKyAgICAgICAgICAgICAgICAgICcib2JqZWN0IiBpdHNlbGZcbicKKyAgICAgICAgICAgICAgICAgICcgICByYWlzZXMgYSAiVHlwZUVycm9yIiBpZiBwYXNzZWQgYW55IG5vbi1lbXB0eSBzdHJpbmcuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19sZV9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ndF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQgInJpY2ggY29tcGFyaXNvbiIgbWV0aG9kcy4gVGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBvcGVyYXRvciBzeW1ib2xzIGFuZCBtZXRob2QgbmFtZXMgJworICAgICAgICAgICAgICAgICAgJ2lzIGFzXG4nCisgICAgICAgICAgICAgICAgICAnICAgZm9sbG93czogIng8eSIgY2FsbHMgInguX19sdF9fKHkpIiwgIng8PXkiIGNhbGxzICcKKyAgICAgICAgICAgICAgICAgICcieC5fX2xlX18oeSkiLFxuJworICAgICAgICAgICAgICAgICAgJyAgICJ4PT15IiBjYWxscyAieC5fX2VxX18oeSkiLCAieCE9eSIgY2FsbHMgInguX19uZV9fKHkpIiwgJworICAgICAgICAgICAgICAgICAgJyJ4PnkiIGNhbGxzXG4nCisgICAgICAgICAgICAgICAgICAnICAgInguX19ndF9fKHkpIiwgYW5kICJ4Pj15IiBjYWxscyAieC5fX2dlX18oeSkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b24gJworICAgICAgICAgICAgICAgICAgJyJOb3RJbXBsZW1lbnRlZCJcbicKKyAgICAgICAgICAgICAgICAgICcgICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyICcKKyAgICAgICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgIkZhbHNlIiBhbmQgIlRydWUiIGFyZSAnCisgICAgICAgICAgICAgICAgICAncmV0dXJuZWQgZm9yIGFcbicKKyAgICAgICAgICAgICAgICAgICcgICBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuIHJldHVybiAnCisgICAgICAgICAgICAgICAgICAnYW55IHZhbHVlLFxuJworICAgICAgICAgICAgICAgICAgJyAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuICcKKyAgICAgICAgICAgICAgICAgICdjb250ZXh0IChlLmcuLFxuJworICAgICAgICAgICAgICAgICAgJyAgIGluIHRoZSBjb25kaXRpb24gb2YgYW4gImlmIiBzdGF0ZW1lbnQpLCBQeXRob24gd2lsbCBjYWxsICcKKyAgICAgICAgICAgICAgICAgICciYm9vbCgpIlxuJworICAgICAgICAgICAgICAgICAgJyAgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdCBpcyB0cnVlIG9yICcKKyAgICAgICAgICAgICAgICAgICdmYWxzZS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBCeSBkZWZhdWx0LCAiX19uZV9fKCkiIGRlbGVnYXRlcyB0byAiX19lcV9fKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICAnaW52ZXJ0cyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICByZXN1bHQgdW5sZXNzIGl0IGlzICJOb3RJbXBsZW1lbnRlZCIuICBUaGVyZSBhcmUgbm8gJworICAgICAgICAgICAgICAgICAgJ290aGVyIGltcGxpZWRcbicKKyAgICAgICAgICAgICAgICAgICcgICByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycywgZm9yICcKKyAgICAgICAgICAgICAgICAgICdleGFtcGxlLCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICB0cnV0aCBvZiAiKHg8eSBvciB4PT15KSIgZG9lcyBub3QgaW1wbHkgIng8PXkiLiBUbyAnCisgICAgICAgICAgICAgICAgICAnYXV0b21hdGljYWxseVxuJworICAgICAgICAgICAgICAgICAgJyAgIGdlbmVyYXRlIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290ICcKKyAgICAgICAgICAgICAgICAgICdvcGVyYXRpb24sIHNlZVxuJworICAgICAgICAgICAgICAgICAgJyAgICJmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgU2VlIHRoZSBwYXJhZ3JhcGggb24gIl9faGFzaF9fKCkiIGZvciBzb21lIGltcG9ydGFudCAnCisgICAgICAgICAgICAgICAgICAnbm90ZXMgb25cbicKKyAgICAgICAgICAgICAgICAgICcgICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gJworICAgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb25cbicKKyAgICAgICAgICAgICAgICAgICcgICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGVyZSBhcmUgbm8gc3dhcHBlZC1hcmd1bWVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzICcKKyAgICAgICAgICAgICAgICAgICcodG8gYmUgdXNlZFxuJworICAgICAgICAgICAgICAgICAgJyAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uICcKKyAgICAgICAgICAgICAgICAgICdidXQgdGhlIHJpZ2h0XG4nCisgICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgIl9fbHRfXygpIiBhbmQgIl9fZ3RfXygpIiBhcmUgJworICAgICAgICAgICAgICAgICAgImVhY2ggb3RoZXInc1xuIgorICAgICAgICAgICAgICAgICAgJyAgIHJlZmxlY3Rpb24sICJfX2xlX18oKSIgYW5kICJfX2dlX18oKSIgYXJlIGVhY2ggb3RoZXJcJ3MgJworICAgICAgICAgICAgICAgICAgJ3JlZmxlY3Rpb24sXG4nCisgICAgICAgICAgICAgICAgICAnICAgYW5kICJfX2VxX18oKSIgYW5kICJfX25lX18oKSIgYXJlIHRoZWlyIG93biByZWZsZWN0aW9uLiAnCisgICAgICAgICAgICAgICAgICAnSWYgdGhlXG4nCisgICAgICAgICAgICAgICAgICAiICAgb3BlcmFuZHMgYXJlIG9mIGRpZmZlcmVudCB0eXBlcywgYW5kIHJpZ2h0IG9wZXJhbmQncyAiCisgICAgICAgICAgICAgICAgICAndHlwZSBpcyBhXG4nCisgICAgICAgICAgICAgICAgICAiICAgZGlyZWN0IG9yIGluZGlyZWN0IHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmQncyB0eXBlLCAiCisgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmVmbGVjdGVkIG1ldGhvZCBvZiB0aGUgcmlnaHQgb3BlcmFuZCBoYXMgcHJpb3JpdHksICcKKyAgICAgICAgICAgICAgICAgICdvdGhlcndpc2UgdGhlXG4nCisgICAgICAgICAgICAgICAgICAiICAgbGVmdCBvcGVyYW5kJ3MgbWV0aG9kIGhhcyBwcmlvcml0eS4gIFZpcnR1YWwgc3ViY2xhc3NpbmcgIgorICAgICAgICAgICAgICAgICAgJ2lzIG5vdFxuJworICAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faGFzaF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5IGJ1aWx0LWluIGZ1bmN0aW9uICJoYXNoKCkiIGFuZCBmb3Igb3BlcmF0aW9ucyAnCisgICAgICAgICAgICAgICAgICAnb24gbWVtYmVyc1xuJworICAgICAgICAgICAgICAgICAgJyAgIG9mIGhhc2hlZCBjb2xsZWN0aW9ucyBpbmNsdWRpbmcgInNldCIsICJmcm96ZW5zZXQiLCBhbmQgJworICAgICAgICAgICAgICAgICAgJyJkaWN0Ii5cbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19oYXNoX18oKSIgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHkgJworICAgICAgICAgICAgICAgICAgJ3JlcXVpcmVkIHByb3BlcnR5XG4nCisgICAgICAgICAgICAgICAgICAnICAgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZSBoYXNoICcKKyAgICAgICAgICAgICAgICAgICd2YWx1ZTsgaXQgaXNcbicKKyAgICAgICAgICAgICAgICAgICcgICBhZHZpc2VkIHRvIHNvbWVob3cgbWl4IHRvZ2V0aGVyIChlLmcuIHVzaW5nIGV4Y2x1c2l2ZSAnCisgICAgICAgICAgICAgICAgICAnb3IpIHRoZSBoYXNoXG4nCisgICAgICAgICAgICAgICAgICAnICAgdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgYWxzbyBwbGF5IGEgJworICAgICAgICAgICAgICAgICAgJ3BhcnQgaW5cbicKKyAgICAgICAgICAgICAgICAgICcgICBjb21wYXJpc29uIG9mIG9iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgTm90ZTogImhhc2goKSIgdHJ1bmNhdGVzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGFuICcKKyAgICAgICAgICAgICAgICAgICJvYmplY3Qnc1xuIgorICAgICAgICAgICAgICAgICAgJyAgICAgY3VzdG9tICJfX2hhc2hfXygpIiBtZXRob2QgdG8gdGhlIHNpemUgb2YgYSAnCisgICAgICAgICAgICAgICAgICAnIlB5X3NzaXplX3QiLiAgVGhpc1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgaXMgdHlwaWNhbGx5IDggYnl0ZXMgb24gNjQtYml0IGJ1aWxkcyBhbmQgNCBieXRlcyBvbiAnCisgICAgICAgICAgICAgICAgICAnMzItYml0XG4nCisgICAgICAgICAgICAgICAgICAnICAgICBidWlsZHMuIElmIGFuIG9iamVjdFwncyAgICJfX2hhc2hfXygpIiBtdXN0ICcKKyAgICAgICAgICAgICAgICAgICdpbnRlcm9wZXJhdGUgb24gYnVpbGRzXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBvZiBkaWZmZXJlbnQgYml0IHNpemVzLCBiZSBzdXJlIHRvIGNoZWNrIHRoZSB3aWR0aCBvbiAnCisgICAgICAgICAgICAgICAgICAnYWxsXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBzdXBwb3J0ZWQgYnVpbGRzLiAgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoICcKKyAgICAgICAgICAgICAgICAgICcicHl0aG9uIC1jXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAiaW1wb3J0IHN5czsgcHJpbnQoc3lzLmhhc2hfaW5mby53aWR0aCkiIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhbiAiX19lcV9fKCkiIG1ldGhvZCBpdCAnCisgICAgICAgICAgICAgICAgICAnc2hvdWxkIG5vdFxuJworICAgICAgICAgICAgICAgICAgJyAgIGRlZmluZSBhICJfX2hhc2hfXygpIiBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdCBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgICciX19lcV9fKCkiXG4nCisgICAgICAgICAgICAgICAgICAnICAgYnV0IG5vdCAiX19oYXNoX18oKSIsIGl0cyBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlICcKKyAgICAgICAgICAgICAgICAgICdhcyBpdGVtcyBpblxuJworICAgICAgICAgICAgICAgICAgJyAgIGhhc2hhYmxlIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzcyBkZWZpbmVzIG11dGFibGUgJworICAgICAgICAgICAgICAgICAgJ29iamVjdHMgYW5kXG4nCisgICAgICAgICAgICAgICAgICAnICAgaW1wbGVtZW50cyBhbiAiX19lcV9fKCkiIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCAnCisgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9faGFzaF9fKCkiLCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgaGFzaGFibGUgJworICAgICAgICAgICAgICAgICAgJ2NvbGxlY3Rpb25zXG4nCisgICAgICAgICAgICAgICAgICAiICAgcmVxdWlyZXMgdGhhdCBhIGtleSdzIGhhc2ggdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgIgorICAgICAgICAgICAgICAgICAgIm9iamVjdCdzIGhhc2hcbiIKKyAgICAgICAgICAgICAgICAgICcgICB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVXNlci1kZWZpbmVkIGNsYXNzZXMgaGF2ZSAiX19lcV9fKCkiIGFuZCAiX19oYXNoX18oKSIgJworICAgICAgICAgICAgICAgICAgJ21ldGhvZHMgYnlcbicKKyAgICAgICAgICAgICAgICAgICcgICBkZWZhdWx0OyB3aXRoIHRoZW0sIGFsbCBvYmplY3RzIGNvbXBhcmUgdW5lcXVhbCAoZXhjZXB0ICcKKyAgICAgICAgICAgICAgICAgICd3aXRoXG4nCisgICAgICAgICAgICAgICAgICAnICAgdGhlbXNlbHZlcykgYW5kICJ4Ll9faGFzaF9fKCkiIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgJworICAgICAgICAgICAgICAgICAgJ3ZhbHVlIHN1Y2hcbicKKyAgICAgICAgICAgICAgICAgICcgICB0aGF0ICJ4ID09IHkiIGltcGxpZXMgYm90aCB0aGF0ICJ4IGlzIHkiIGFuZCAiaGFzaCh4KSA9PSAnCisgICAgICAgICAgICAgICAgICAnaGFzaCh5KSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIGFuZCBkb2VzIG5vdCBkZWZpbmUgJworICAgICAgICAgICAgICAgICAgJyJfX2hhc2hfXygpIlxuJworICAgICAgICAgICAgICAgICAgJyAgIHdpbGwgaGF2ZSBpdHMgIl9faGFzaF9fKCkiIGltcGxpY2l0bHkgc2V0IHRvICJOb25lIi4gICcKKyAgICAgICAgICAgICAgICAgICdXaGVuIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgICJfX2hhc2hfXygpIiBtZXRob2Qgb2YgYSBjbGFzcyBpcyAiTm9uZSIsIGluc3RhbmNlcyBvZiAnCisgICAgICAgICAgICAgICAgICAndGhlIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICAnICAgd2lsbCByYWlzZSBhbiBhcHByb3ByaWF0ZSAiVHlwZUVycm9yIiB3aGVuIGEgcHJvZ3JhbSAnCisgICAgICAgICAgICAgICAgICAnYXR0ZW1wdHMgdG9cbicKKyAgICAgICAgICAgICAgICAgICcgICByZXRyaWV2ZSB0aGVpciBoYXNoIHZhbHVlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSAnCisgICAgICAgICAgICAgICAgICAnaWRlbnRpZmllZCBhc1xuJworICAgICAgICAgICAgICAgICAgJyAgIHVuaGFzaGFibGUgd2hlbiBjaGVja2luZyAiaXNpbnN0YW5jZShvYmosICcKKyAgICAgICAgICAgICAgICAgICdjb2xsZWN0aW9ucy5IYXNoYWJsZSkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIElmIGEgY2xhc3MgdGhhdCBvdmVycmlkZXMgIl9fZXFfXygpIiBuZWVkcyB0byByZXRhaW4gJworICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGltcGxlbWVudGF0aW9uIG9mICJfX2hhc2hfXygpIiBmcm9tIGEgcGFyZW50IGNsYXNzLCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2ludGVycHJldGVyXG4nCisgICAgICAgICAgICAgICAgICAnICAgbXVzdCBiZSB0b2xkIHRoaXMgZXhwbGljaXRseSBieSBzZXR0aW5nICJfX2hhc2hfXyA9XG4nCisgICAgICAgICAgICAgICAgICAnICAgPFBhcmVudENsYXNzPi5fX2hhc2hfXyIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgSWYgYSBjbGFzcyB0aGF0IGRvZXMgbm90IG92ZXJyaWRlICJfX2VxX18oKSIgd2lzaGVzIHRvICcKKyAgICAgICAgICAgICAgICAgICdzdXBwcmVzc1xuJworICAgICAgICAgICAgICAgICAgJyAgIGhhc2ggc3VwcG9ydCwgaXQgc2hvdWxkIGluY2x1ZGUgIl9faGFzaF9fID0gTm9uZSIgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAgJyAgIGRlZmluaXRpb24uIEEgY2xhc3Mgd2hpY2ggZGVmaW5lcyBpdHMgb3duICJfX2hhc2hfXygpIiAnCisgICAgICAgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgICAgICAgJyAgIGV4cGxpY2l0bHkgcmFpc2VzIGEgIlR5cGVFcnJvciIgd291bGQgYmUgaW5jb3JyZWN0bHkgJworICAgICAgICAgICAgICAgICAgJ2lkZW50aWZpZWQgYXNcbicKKyAgICAgICAgICAgICAgICAgICcgICBoYXNoYWJsZSBieSBhbiAiaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSIgJworICAgICAgICAgICAgICAgICAgJ2NhbGwuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgTm90ZTogQnkgZGVmYXVsdCwgdGhlICJfX2hhc2hfXygpIiB2YWx1ZXMgb2Ygc3RyLCBieXRlcyAnCisgICAgICAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBkYXRldGltZSBvYmplY3RzIGFyZSAic2FsdGVkIiB3aXRoIGFuIHVucHJlZGljdGFibGUgJworICAgICAgICAgICAgICAgICAgJ3JhbmRvbSB2YWx1ZS5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIEFsdGhvdWdoIHRoZXkgcmVtYWluIGNvbnN0YW50IHdpdGhpbiBhbiBpbmRpdmlkdWFsICcKKyAgICAgICAgICAgICAgICAgICdQeXRob25cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHByb2Nlc3MsIHRoZXkgYXJlIG5vdCBwcmVkaWN0YWJsZSBiZXR3ZWVuIHJlcGVhdGVkICcKKyAgICAgICAgICAgICAgICAgICdpbnZvY2F0aW9ucyBvZlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgUHl0aG9uLlRoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgJworICAgICAgICAgICAgICAgICAgJ2EgZGVuaWFsLVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgb2Ytc2VydmljZSBjYXVzZWQgYnkgY2FyZWZ1bGx5LWNob3NlbiBpbnB1dHMgdGhhdCAnCisgICAgICAgICAgICAgICAgICAnZXhwbG9pdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2Ugb2YgYSBkaWN0IGluc2VydGlvbiwgTyhuXjIpICcKKyAgICAgICAgICAgICAgICAgICdjb21wbGV4aXR5LlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgU2VlICcKKyAgICAgICAgICAgICAgICAgICdodHRwOi8vd3d3Lm9jZXJ0Lm9yZy9hZHZpc29yaWVzL29jZXJ0LTIwMTEtMDAzLmh0bWwgZm9yXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBkZXRhaWxzLkNoYW5naW5nIGhhc2ggdmFsdWVzIGFmZmVjdHMgdGhlIGl0ZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICAnb3JkZXIgb2ZcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGRpY3RzLCBzZXRzIGFuZCBvdGhlciBtYXBwaW5ncy4gIFB5dGhvbiBoYXMgbmV2ZXIgbWFkZSAnCisgICAgICAgICAgICAgICAgICAnZ3VhcmFudGVlc1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgYWJvdXQgdGhpcyBvcmRlcmluZyAoYW5kIGl0IHR5cGljYWxseSB2YXJpZXMgYmV0d2VlbiAnCisgICAgICAgICAgICAgICAgICAnMzItYml0IGFuZFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgNjQtYml0IGJ1aWxkcykuU2VlIGFsc28gIlBZVEhPTkhBU0hTRUVEIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBIYXNoIHJhbmRvbWl6YXRpb24gaXMgZW5hYmxlZCBieSAnCisgICAgICAgICAgICAgICAgICAnZGVmYXVsdC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ib29sX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiAnCisgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uXG4nCisgICAgICAgICAgICAgICAgICAnICAgImJvb2woKSI7IHNob3VsZCByZXR1cm4gIkZhbHNlIiBvciAiVHJ1ZSIuICBXaGVuIHRoaXMgJworICAgICAgICAgICAgICAgICAgJ21ldGhvZCBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgICcgICBkZWZpbmVkLCAiX19sZW5fXygpIiBpcyBjYWxsZWQsIGlmIGl0IGlzIGRlZmluZWQsIGFuZCAnCisgICAgICAgICAgICAgICAgICAndGhlIG9iamVjdCBpc1xuJworICAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQgdHJ1ZSBpZiBpdHMgcmVzdWx0IGlzIG5vbnplcm8uICBJZiBhIGNsYXNzICcKKyAgICAgICAgICAgICAgICAgICdkZWZpbmVzXG4nCisgICAgICAgICAgICAgICAgICAnICAgbmVpdGhlciAiX19sZW5fXygpIiBub3IgIl9fYm9vbF9fKCkiLCBhbGwgaXRzIGluc3RhbmNlcyAnCisgICAgICAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZCB0cnVlLlxuJywKKyAnZGVidWdnZXInOiAnXG4nCisgICAgICAgICAgICAgJyJwZGIiIC0tLSBUaGUgUHl0aG9uIERlYnVnZ2VyXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcqKlNvdXJjZSBjb2RlOioqIExpYi9wZGIucHlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBtb2R1bGUgInBkYiIgZGVmaW5lcyBhbiBpbnRlcmFjdGl2ZSBzb3VyY2UgY29kZSBkZWJ1Z2dlciAnCisgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICdQeXRob24gcHJvZ3JhbXMuICBJdCBzdXBwb3J0cyBzZXR0aW5nIChjb25kaXRpb25hbCkgYnJlYWtwb2ludHMgJworICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAnc2luZ2xlIHN0ZXBwaW5nIGF0IHRoZSBzb3VyY2UgbGluZSBsZXZlbCwgaW5zcGVjdGlvbiBvZiBzdGFjayAnCisgICAgICAgICAgICAgJ2ZyYW1lcyxcbicKKyAgICAgICAgICAgICAnc291cmNlIGNvZGUgbGlzdGluZywgYW5kIGV2YWx1YXRpb24gb2YgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2NvbnRleHQgb2YgYW55IHN0YWNrIGZyYW1lLiAgSXQgYWxzbyBzdXBwb3J0cyBwb3N0LW1vcnRlbSAnCisgICAgICAgICAgICAgJ2RlYnVnZ2luZ1xuJworICAgICAgICAgICAgICdhbmQgY2FuIGJlIGNhbGxlZCB1bmRlciBwcm9ncmFtIGNvbnRyb2wuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZGVidWdnZXIgaXMgZXh0ZW5zaWJsZSAtLSBpdCBpcyBhY3R1YWxseSBkZWZpbmVkIGFzIHRoZSAnCisgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgJyJQZGIiLiBUaGlzIGlzIGN1cnJlbnRseSB1bmRvY3VtZW50ZWQgYnV0IGVhc2lseSB1bmRlcnN0b29kIGJ5ICcKKyAgICAgICAgICAgICAncmVhZGluZ1xuJworICAgICAgICAgICAgICd0aGUgc291cmNlLiAgVGhlIGV4dGVuc2lvbiBpbnRlcmZhY2UgdXNlcyB0aGUgbW9kdWxlcyAiYmRiIiBhbmQgJworICAgICAgICAgICAgICciY21kIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBkZWJ1Z2dlclwncyBwcm9tcHQgaXMgIihQZGIpIi4gVHlwaWNhbCB1c2FnZSB0byBydW4gYSAnCisgICAgICAgICAgICAgJ3Byb2dyYW0gdW5kZXJcbicKKyAgICAgICAgICAgICAnY29udHJvbCBvZiB0aGUgZGVidWdnZXIgaXM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICA+Pj4gaW1wb3J0IHBkYlxuJworICAgICAgICAgICAgICcgICA+Pj4gaW1wb3J0IG15bW9kdWxlXG4nCisgICAgICAgICAgICAgIiAgID4+PiBwZGIucnVuKCdteW1vZHVsZS50ZXN0KCknKVxuIgorICAgICAgICAgICAgICcgICA+IDxzdHJpbmc+KDApPygpXG4nCisgICAgICAgICAgICAgJyAgIChQZGIpIGNvbnRpbnVlXG4nCisgICAgICAgICAgICAgJyAgID4gPHN0cmluZz4oMSk/KClcbicKKyAgICAgICAgICAgICAnICAgKFBkYikgY29udGludWVcbicKKyAgICAgICAgICAgICAiICAgTmFtZUVycm9yOiAnc3BhbSdcbiIKKyAgICAgICAgICAgICAnICAgPiA8c3RyaW5nPigxKT8oKVxuJworICAgICAgICAgICAgICcgICAoUGRiKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogVGFiLWNvbXBsZXRpb24gdmlhIHRoZSAicmVhZGxpbmUiIG1vZHVsZSAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJ2F2YWlsYWJsZSBmb3IgY29tbWFuZHMgYW5kIGNvbW1hbmQgYXJndW1lbnRzLCBlLmcuIHRoZSBjdXJyZW50ICcKKyAgICAgICAgICAgICAnZ2xvYmFsXG4nCisgICAgICAgICAgICAgJ2FuZCBsb2NhbCBuYW1lcyBhcmUgb2ZmZXJlZCBhcyBhcmd1bWVudHMgb2YgdGhlICJwIiBjb21tYW5kLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnInBkYi5weSIgY2FuIGFsc28gYmUgaW52b2tlZCBhcyBhIHNjcmlwdCB0byBkZWJ1ZyBvdGhlciAnCisgICAgICAgICAgICAgJ3NjcmlwdHMuICBGb3JcbicKKyAgICAgICAgICAgICAnZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHB5dGhvbjMgLW0gcGRiIG15c2NyaXB0LnB5XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaGVuIGludm9rZWQgYXMgYSBzY3JpcHQsIHBkYiB3aWxsIGF1dG9tYXRpY2FsbHkgZW50ZXIgJworICAgICAgICAgICAgICdwb3N0LW1vcnRlbVxuJworICAgICAgICAgICAgICdkZWJ1Z2dpbmcgaWYgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgZXhpdHMgYWJub3JtYWxseS4gIEFmdGVyICcKKyAgICAgICAgICAgICAncG9zdC1cbicKKyAgICAgICAgICAgICAnbW9ydGVtIGRlYnVnZ2luZyAob3IgYWZ0ZXIgbm9ybWFsIGV4aXQgb2YgdGhlIHByb2dyYW0pLCBwZGIgJworICAgICAgICAgICAgICd3aWxsXG4nCisgICAgICAgICAgICAgInJlc3RhcnQgdGhlIHByb2dyYW0uICBBdXRvbWF0aWMgcmVzdGFydGluZyBwcmVzZXJ2ZXMgcGRiJ3Mgc3RhdGUgIgorICAgICAgICAgICAgICcoc3VjaFxuJworICAgICAgICAgICAgICdhcyBicmVha3BvaW50cykgYW5kIGluIG1vc3QgY2FzZXMgaXMgbW9yZSB1c2VmdWwgdGhhbiBxdWl0dGluZyAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICJkZWJ1Z2dlciB1cG9uIHByb2dyYW0ncyBleGl0LlxuIgorICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy4yOiAicGRiLnB5IiBub3cgYWNjZXB0cyBhICItYyIgb3B0aW9uIHRoYXQgJworICAgICAgICAgICAgICdleGVjdXRlc1xuJworICAgICAgICAgICAgICdjb21tYW5kcyBhcyBpZiBnaXZlbiBpbiBhICIucGRicmMiIGZpbGUsIHNlZSBEZWJ1Z2dlciBDb21tYW5kcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSB0eXBpY2FsIHVzYWdlIHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyIGZyb20gYSBydW5uaW5nICcKKyAgICAgICAgICAgICAncHJvZ3JhbSBpc1xuJworICAgICAgICAgICAgICd0byBpbnNlcnRcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnYXQgdGhlIGxvY2F0aW9uIHlvdSB3YW50IHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyLiAgWW91IGNhbiAnCisgICAgICAgICAgICAgJ3RoZW5cbicKKyAgICAgICAgICAgICAnc3RlcCB0aHJvdWdoIHRoZSBjb2RlIGZvbGxvd2luZyB0aGlzIHN0YXRlbWVudCwgYW5kIGNvbnRpbnVlICcKKyAgICAgICAgICAgICAncnVubmluZ1xuJworICAgICAgICAgICAgICd3aXRob3V0IHRoZSBkZWJ1Z2dlciB1c2luZyB0aGUgImNvbnRpbnVlIiBjb21tYW5kLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIHR5cGljYWwgdXNhZ2UgdG8gaW5zcGVjdCBhIGNyYXNoZWQgcHJvZ3JhbSBpczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgID4+PiBpbXBvcnQgcGRiXG4nCisgICAgICAgICAgICAgJyAgID4+PiBpbXBvcnQgbXltb2R1bGVcbicKKyAgICAgICAgICAgICAnICAgPj4+IG15bW9kdWxlLnRlc3QoKVxuJworICAgICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gP1xuJworICAgICAgICAgICAgICcgICAgIEZpbGUgIi4vbXltb2R1bGUucHkiLCBsaW5lIDQsIGluIHRlc3RcbicKKyAgICAgICAgICAgICAnICAgICAgIHRlc3QyKClcbicKKyAgICAgICAgICAgICAnICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSAzLCBpbiB0ZXN0MlxuJworICAgICAgICAgICAgICcgICAgICAgcHJpbnQoc3BhbSlcbicKKyAgICAgICAgICAgICAnICAgTmFtZUVycm9yOiBzcGFtXG4nCisgICAgICAgICAgICAgJyAgID4+PiBwZGIucG0oKVxuJworICAgICAgICAgICAgICcgICA+IC4vbXltb2R1bGUucHkoMyl0ZXN0MigpXG4nCisgICAgICAgICAgICAgJyAgIC0+IHByaW50KHNwYW0pXG4nCisgICAgICAgICAgICAgJyAgIChQZGIpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM7IGVhY2ggZW50ZXJzIHRoZSAnCisgICAgICAgICAgICAgJ2RlYnVnZ2VyXG4nCisgICAgICAgICAgICAgJ2luIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHdheTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3BkYi5ydW4oc3RhdGVtZW50LCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRXhlY3V0ZSB0aGUgKnN0YXRlbWVudCogKGdpdmVuIGFzIGEgc3RyaW5nIG9yIGEgY29kZSBvYmplY3QpICcKKyAgICAgICAgICAgICAndW5kZXJcbicKKyAgICAgICAgICAgICAnICAgZGVidWdnZXIgY29udHJvbC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFycyBiZWZvcmUgYW55ICcKKyAgICAgICAgICAgICAnY29kZSBpc1xuJworICAgICAgICAgICAgICcgICBleGVjdXRlZDsgeW91IGNhbiBzZXQgYnJlYWtwb2ludHMgYW5kIHR5cGUgImNvbnRpbnVlIiwgb3IgeW91ICcKKyAgICAgICAgICAgICAnY2FuXG4nCisgICAgICAgICAgICAgJyAgIHN0ZXAgdGhyb3VnaCB0aGUgc3RhdGVtZW50IHVzaW5nICJzdGVwIiBvciAibmV4dCIgKGFsbCB0aGVzZVxuJworICAgICAgICAgICAgICcgICBjb21tYW5kcyBhcmUgZXhwbGFpbmVkIGJlbG93KS4gIFRoZSBvcHRpb25hbCAqZ2xvYmFscyogYW5kICcKKyAgICAgICAgICAgICAnKmxvY2FscypcbicKKyAgICAgICAgICAgICAnICAgYXJndW1lbnRzIHNwZWNpZnkgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRoZSBjb2RlIGlzICcKKyAgICAgICAgICAgICAnZXhlY3V0ZWQ7IGJ5XG4nCisgICAgICAgICAgICAgJyAgIGRlZmF1bHQgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIG1vZHVsZSAiX19tYWluX18iIGlzIHVzZWQuICAnCisgICAgICAgICAgICAgJyhTZWUgdGhlXG4nCisgICAgICAgICAgICAgJyAgIGV4cGxhbmF0aW9uIG9mIHRoZSBidWlsdC1pbiAiZXhlYygpIiBvciAiZXZhbCgpIiBmdW5jdGlvbnMuKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncGRiLnJ1bmV2YWwoZXhwcmVzc2lvbiwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEV2YWx1YXRlIHRoZSAqZXhwcmVzc2lvbiogKGdpdmVuIGFzIGEgc3RyaW5nIG9yIGEgY29kZSAnCisgICAgICAgICAgICAgJ29iamVjdClcbicKKyAgICAgICAgICAgICAnICAgdW5kZXIgZGVidWdnZXIgY29udHJvbC4gIFdoZW4gInJ1bmV2YWwoKSIgcmV0dXJucywgaXQgcmV0dXJucyAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4gIE90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgJworICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICcgICAicnVuKCkiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncGRiLnJ1bmNhbGwoZnVuY3Rpb24sICphcmdzLCAqKmt3ZHMpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBDYWxsIHRoZSAqZnVuY3Rpb24qIChhIGZ1bmN0aW9uIG9yIG1ldGhvZCBvYmplY3QsIG5vdCBhICcKKyAgICAgICAgICAgICAnc3RyaW5nKVxuJworICAgICAgICAgICAgICcgICB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICBXaGVuICJydW5jYWxsKCkiIHJldHVybnMsIGl0ICcKKyAgICAgICAgICAgICAncmV0dXJuc1xuJworICAgICAgICAgICAgICcgICB3aGF0ZXZlciB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5lZC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgJworICAgICAgICAgICAgICdhcHBlYXJzXG4nCisgICAgICAgICAgICAgJyAgIGFzIHNvb24gYXMgdGhlIGZ1bmN0aW9uIGlzIGVudGVyZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdwZGIuc2V0X3RyYWNlKClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEVudGVyIHRoZSBkZWJ1Z2dlciBhdCB0aGUgY2FsbGluZyBzdGFjayBmcmFtZS4gIFRoaXMgaXMgJworICAgICAgICAgICAgICd1c2VmdWwgdG9cbicKKyAgICAgICAgICAgICAnICAgaGFyZC1jb2RlIGEgYnJlYWtwb2ludCBhdCBhIGdpdmVuIHBvaW50IGluIGEgcHJvZ3JhbSwgZXZlbiBpZiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBjb2RlIGlzIG5vdCBvdGhlcndpc2UgYmVpbmcgZGVidWdnZWQgKGUuZy4gd2hlbiBhbiBhc3NlcnRpb25cbicKKyAgICAgICAgICAgICAnICAgZmFpbHMpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncGRiLnBvc3RfbW9ydGVtKHRyYWNlYmFjaz1Ob25lKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSBnaXZlbiAqdHJhY2ViYWNrKiBvYmplY3QuICAnCisgICAgICAgICAgICAgJ0lmIG5vXG4nCisgICAgICAgICAgICAgJyAgICp0cmFjZWJhY2sqIGlzIGdpdmVuLCBpdCB1c2VzIHRoZSBvbmUgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0ICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnICAgY3VycmVudGx5IGJlaW5nIGhhbmRsZWQgKGFuIGV4Y2VwdGlvbiBtdXN0IGJlIGJlaW5nIGhhbmRsZWQgJworICAgICAgICAgICAgICdpZiB0aGVcbicKKyAgICAgICAgICAgICAnICAgZGVmYXVsdCBpcyB0byBiZSB1c2VkKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3BkYi5wbSgpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFbnRlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb2YgdGhlIHRyYWNlYmFjayBmb3VuZCBpblxuJworICAgICAgICAgICAgICcgICAic3lzLmxhc3RfdHJhY2ViYWNrIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAicnVuKiIgZnVuY3Rpb25zIGFuZCAic2V0X3RyYWNlKCkiIGFyZSBhbGlhc2VzIGZvciAnCisgICAgICAgICAgICAgJ2luc3RhbnRpYXRpbmdcbicKKyAgICAgICAgICAgICAndGhlICJQZGIiIGNsYXNzIGFuZCBjYWxsaW5nIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZS4gIElmIHlvdSAnCisgICAgICAgICAgICAgJ3dhbnRcbicKKyAgICAgICAgICAgICAndG8gYWNjZXNzIGZ1cnRoZXIgZmVhdHVyZXMsIHlvdSBoYXZlIHRvIGRvIHRoaXMgeW91cnNlbGY6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICJjbGFzcyBwZGIuUGRiKGNvbXBsZXRla2V5PSd0YWInLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgIgorICAgICAgICAgICAgICdza2lwPU5vbmUsIG5vc2lnaW50PUZhbHNlKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgIlBkYiIgaXMgdGhlIGRlYnVnZ2VyIGNsYXNzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVGhlICpjb21wbGV0ZWtleSosICpzdGRpbiogYW5kICpzdGRvdXQqIGFyZ3VtZW50cyBhcmUgcGFzc2VkICcKKyAgICAgICAgICAgICAndG8gdGhlXG4nCisgICAgICAgICAgICAgJyAgIHVuZGVybHlpbmcgImNtZC5DbWQiIGNsYXNzOyBzZWUgdGhlIGRlc2NyaXB0aW9uIHRoZXJlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVGhlICpza2lwKiBhcmd1bWVudCwgaWYgZ2l2ZW4sIG11c3QgYmUgYW4gaXRlcmFibGUgb2YgJworICAgICAgICAgICAgICdnbG9iLXN0eWxlXG4nCisgICAgICAgICAgICAgJyAgIG1vZHVsZSBuYW1lIHBhdHRlcm5zLiAgVGhlIGRlYnVnZ2VyIHdpbGwgbm90IHN0ZXAgaW50byBmcmFtZXMgJworICAgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICAgJyAgIG9yaWdpbmF0ZSBpbiBhIG1vZHVsZSB0aGF0IG1hdGNoZXMgb25lIG9mIHRoZXNlIHBhdHRlcm5zLiAnCisgICAgICAgICAgICAgJ1sxXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQnkgZGVmYXVsdCwgUGRiIHNldHMgYSBoYW5kbGVyIGZvciB0aGUgU0lHSU5UIHNpZ25hbCAod2hpY2ggJworICAgICAgICAgICAgICdpcyBzZW50XG4nCisgICAgICAgICAgICAgJyAgIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyAiQ3RybC1DIiBvbiB0aGUgY29uc29sZSkgd2hlbiB5b3UgZ2l2ZSAnCisgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAnICAgImNvbnRpbnVlIiBjb21tYW5kLiBUaGlzIGFsbG93cyB5b3UgdG8gYnJlYWsgaW50byB0aGUgJworICAgICAgICAgICAgICdkZWJ1Z2dlclxuJworICAgICAgICAgICAgICcgICBhZ2FpbiBieSBwcmVzc2luZyAiQ3RybC1DIi4gIElmIHlvdSB3YW50IFBkYiBub3QgdG8gdG91Y2ggJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgU0lHSU5UIGhhbmRsZXIsIHNldCAqbm9zaWdpbnQqIHRvdCB0cnVlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRXhhbXBsZSBjYWxsIHRvIGVuYWJsZSB0cmFjaW5nIHdpdGggKnNraXAqOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiICAgICAgaW1wb3J0IHBkYjsgcGRiLlBkYihza2lwPVsnZGphbmdvLionXSkuc2V0X3RyYWNlKClcbiIKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMTogVGhlICpza2lwKiBhcmd1bWVudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMjogVGhlICpub3NpZ2ludCogYXJndW1lbnQuICBQcmV2aW91c2x5LCBhICcKKyAgICAgICAgICAgICAnU0lHSU5UXG4nCisgICAgICAgICAgICAgJyAgIGhhbmRsZXIgd2FzIG5ldmVyIHNldCBieSBQZGIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBydW4oc3RhdGVtZW50LCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuJworICAgICAgICAgICAgICcgICBydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG4nCisgICAgICAgICAgICAgJyAgIHJ1bmNhbGwoZnVuY3Rpb24sICphcmdzLCAqKmt3ZHMpXG4nCisgICAgICAgICAgICAgJyAgIHNldF90cmFjZSgpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBmdW5jdGlvbnMgZXhwbGFpbmVkIGFib3ZlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0RlYnVnZ2VyIENvbW1hbmRzXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgY29tbWFuZHMgcmVjb2duaXplZCBieSB0aGUgZGVidWdnZXIgYXJlIGxpc3RlZCBiZWxvdy4gIE1vc3RcbicKKyAgICAgICAgICAgICAnY29tbWFuZHMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIG9uZSBvciB0d28gbGV0dGVycyBhcyBpbmRpY2F0ZWQ7ICcKKyAgICAgICAgICAgICAnZS5nLlxuJworICAgICAgICAgICAgICciaChlbHApIiBtZWFucyB0aGF0IGVpdGhlciAiaCIgb3IgImhlbHAiIGNhbiBiZSB1c2VkIHRvIGVudGVyICcKKyAgICAgICAgICAgICAndGhlIGhlbHBcbicKKyAgICAgICAgICAgICAnY29tbWFuZCAoYnV0IG5vdCAiaGUiIG9yICJoZWwiLCBub3IgIkgiIG9yICJIZWxwIiBvciAiSEVMUCIpLlxuJworICAgICAgICAgICAgICdBcmd1bWVudHMgdG8gY29tbWFuZHMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSAoc3BhY2VzICcKKyAgICAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAgICAndGFicykuICBPcHRpb25hbCBhcmd1bWVudHMgYXJlIGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cyAnCisgICAgICAgICAgICAgJygiW10iKSBpblxuJworICAgICAgICAgICAgICd0aGUgY29tbWFuZCBzeW50YXg7IHRoZSBzcXVhcmUgYnJhY2tldHMgbXVzdCBub3QgYmUgdHlwZWQuXG4nCisgICAgICAgICAgICAgJ0FsdGVybmF0aXZlcyBpbiB0aGUgY29tbWFuZCBzeW50YXggYXJlIHNlcGFyYXRlZCBieSBhIHZlcnRpY2FsICcKKyAgICAgICAgICAgICAnYmFyXG4nCisgICAgICAgICAgICAgJygifCIpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnRW50ZXJpbmcgYSBibGFuayBsaW5lIHJlcGVhdHMgdGhlIGxhc3QgY29tbWFuZCBlbnRlcmVkLiAgJworICAgICAgICAgICAgICdFeGNlcHRpb246IGlmXG4nCisgICAgICAgICAgICAgJ3RoZSBsYXN0IGNvbW1hbmQgd2FzIGEgImxpc3QiIGNvbW1hbmQsIHRoZSBuZXh0IDExIGxpbmVzIGFyZSAnCisgICAgICAgICAgICAgJ2xpc3RlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIkNvbW1hbmRzIHRoYXQgdGhlIGRlYnVnZ2VyIGRvZXNuJ3QgcmVjb2duaXplIGFyZSBhc3N1bWVkIHRvIGJlICIKKyAgICAgICAgICAgICAnUHl0aG9uXG4nCisgICAgICAgICAgICAgJ3N0YXRlbWVudHMgYW5kIGFyZSBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvZ3JhbSBiZWluZ1xuJworICAgICAgICAgICAgICdkZWJ1Z2dlZC4gIFB5dGhvbiBzdGF0ZW1lbnRzIGNhbiBhbHNvIGJlIHByZWZpeGVkIHdpdGggYW4gJworICAgICAgICAgICAgICdleGNsYW1hdGlvblxuJworICAgICAgICAgICAgICdwb2ludCAoIiEiKS4gIFRoaXMgaXMgYSBwb3dlcmZ1bCB3YXkgdG8gaW5zcGVjdCB0aGUgcHJvZ3JhbSAnCisgICAgICAgICAgICAgJ2JlaW5nXG4nCisgICAgICAgICAgICAgJ2RlYnVnZ2VkOyBpdCBpcyBldmVuIHBvc3NpYmxlIHRvIGNoYW5nZSBhIHZhcmlhYmxlIG9yIGNhbGwgYSAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uLlxuJworICAgICAgICAgICAgICdXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gc3VjaCBhIHN0YXRlbWVudCwgdGhlIGV4Y2VwdGlvbiBuYW1lICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAicHJpbnRlZCBidXQgdGhlIGRlYnVnZ2VyJ3Mgc3RhdGUgaXMgbm90IGNoYW5nZWQuXG4iCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZGVidWdnZXIgc3VwcG9ydHMgYWxpYXNlcy4gIEFsaWFzZXMgY2FuIGhhdmUgcGFyYW1ldGVycyAnCisgICAgICAgICAgICAgJ3doaWNoXG4nCisgICAgICAgICAgICAgJ2FsbG93cyBvbmUgYSBjZXJ0YWluIGxldmVsIG9mIGFkYXB0YWJpbGl0eSB0byB0aGUgY29udGV4dCB1bmRlclxuJworICAgICAgICAgICAgICdleGFtaW5hdGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ011bHRpcGxlIGNvbW1hbmRzIG1heSBiZSBlbnRlcmVkIG9uIGEgc2luZ2xlIGxpbmUsIHNlcGFyYXRlZCBieSAnCisgICAgICAgICAgICAgJyI7OyIuXG4nCisgICAgICAgICAgICAgJyhBIHNpbmdsZSAiOyIgaXMgbm90IHVzZWQgYXMgaXQgaXMgdGhlIHNlcGFyYXRvciBmb3IgbXVsdGlwbGUgJworICAgICAgICAgICAgICdjb21tYW5kc1xuJworICAgICAgICAgICAgICdpbiBhIGxpbmUgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIFB5dGhvbiBwYXJzZXIuKSAgTm8gaW50ZWxsaWdlbmNlICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnYXBwbGllZCB0byBzZXBhcmF0aW5nIHRoZSBjb21tYW5kczsgdGhlIGlucHV0IGlzIHNwbGl0IGF0IHRoZSAnCisgICAgICAgICAgICAgJ2ZpcnN0XG4nCisgICAgICAgICAgICAgJyI7OyIgcGFpciwgZXZlbiBpZiBpdCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgcXVvdGVkIHN0cmluZy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0lmIGEgZmlsZSAiLnBkYnJjIiBleGlzdHMgaW4gdGhlIHVzZXJcJ3MgaG9tZSBkaXJlY3Rvcnkgb3IgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnY3VycmVudCBkaXJlY3RvcnksIGl0IGlzIHJlYWQgaW4gYW5kIGV4ZWN1dGVkIGFzIGlmIGl0IGhhZCBiZWVuICcKKyAgICAgICAgICAgICAndHlwZWRcbicKKyAgICAgICAgICAgICAnYXQgdGhlIGRlYnVnZ2VyIHByb21wdC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgJworICAgICAgICAgICAgICdhbGlhc2VzLiAgSWZcbicKKyAgICAgICAgICAgICAnYm90aCBmaWxlcyBleGlzdCwgdGhlIG9uZSBpbiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgcmVhZCBmaXJzdCAnCisgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICdhbGlhc2VzIGRlZmluZWQgdGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGxvY2FsIGZpbGUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiLnBkYnJjIiBjYW4gbm93IGNvbnRhaW4gY29tbWFuZHMgdGhhdFxuJworICAgICAgICAgICAgICdjb250aW51ZSBkZWJ1Z2dpbmcsIHN1Y2ggYXMgImNvbnRpbnVlIiBvciAibmV4dCIuICBQcmV2aW91c2x5LCAnCisgICAgICAgICAgICAgJ3RoZXNlXG4nCisgICAgICAgICAgICAgJ2NvbW1hbmRzIGhhZCBubyBlZmZlY3QuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdoKGVscCkgW2NvbW1hbmRdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaXRob3V0IGFyZ3VtZW50LCBwcmludCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuICBXaXRoICcKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICcgICAqY29tbWFuZCogYXMgYXJndW1lbnQsIHByaW50IGhlbHAgYWJvdXQgdGhhdCBjb21tYW5kLiAgImhlbHAgJworICAgICAgICAgICAgICdwZGIiXG4nCisgICAgICAgICAgICAgJyAgIGRpc3BsYXlzIHRoZSBmdWxsIGRvY3VtZW50YXRpb24gKHRoZSBkb2NzdHJpbmcgb2YgdGhlICJwZGIiXG4nCisgICAgICAgICAgICAgJyAgIG1vZHVsZSkuICBTaW5jZSB0aGUgKmNvbW1hbmQqIGFyZ3VtZW50IG11c3QgYmUgYW4gaWRlbnRpZmllciwgJworICAgICAgICAgICAgICciaGVscFxuJworICAgICAgICAgICAgICcgICBleGVjIiBtdXN0IGJlIGVudGVyZWQgdG8gZ2V0IGhlbHAgb24gdGhlICIhIiBjb21tYW5kLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAndyhoZXJlKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUHJpbnQgYSBzdGFjayB0cmFjZSwgd2l0aCB0aGUgbW9zdCByZWNlbnQgZnJhbWUgYXQgdGhlICcKKyAgICAgICAgICAgICAnYm90dG9tLiAgQW5cbicKKyAgICAgICAgICAgICAnICAgYXJyb3cgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGZyYW1lLCB3aGljaCBkZXRlcm1pbmVzIHRoZSAnCisgICAgICAgICAgICAgJ2NvbnRleHQgb2ZcbicKKyAgICAgICAgICAgICAnICAgbW9zdCBjb21tYW5kcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2Qob3duKSBbY291bnRdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lICpjb3VudCogKGRlZmF1bHQgb25lKSBsZXZlbHMgZG93biBpbiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBzdGFjayB0cmFjZSAodG8gYSBuZXdlciBmcmFtZSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICd1KHApIFtjb3VudF1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgKmNvdW50KiAoZGVmYXVsdCBvbmUpIGxldmVscyB1cCBpbiB0aGUgJworICAgICAgICAgICAgICdzdGFja1xuJworICAgICAgICAgICAgICcgICB0cmFjZSAodG8gYW4gb2xkZXIgZnJhbWUpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnYihyZWFrKSBbKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssIGNvbmRpdGlvbl1dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaXRoIGEgKmxpbmVubyogYXJndW1lbnQsIHNldCBhIGJyZWFrIHRoZXJlIGluIHRoZSBjdXJyZW50ICcKKyAgICAgICAgICAgICAnZmlsZS5cbicKKyAgICAgICAgICAgICAnICAgV2l0aCBhICpmdW5jdGlvbiogYXJndW1lbnQsIHNldCBhIGJyZWFrIGF0IHRoZSBmaXJzdCAnCisgICAgICAgICAgICAgJ2V4ZWN1dGFibGVcbicKKyAgICAgICAgICAgICAnICAgc3RhdGVtZW50IHdpdGhpbiB0aGF0IGZ1bmN0aW9uLiAgVGhlIGxpbmUgbnVtYmVyIG1heSBiZSAnCisgICAgICAgICAgICAgJ3ByZWZpeGVkXG4nCisgICAgICAgICAgICAgJyAgIHdpdGggYSBmaWxlbmFtZSBhbmQgYSBjb2xvbiwgdG8gc3BlY2lmeSBhIGJyZWFrcG9pbnQgaW4gJworICAgICAgICAgICAgICdhbm90aGVyXG4nCisgICAgICAgICAgICAgIiAgIGZpbGUgKHByb2JhYmx5IG9uZSB0aGF0IGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQpLiAgVGhlIGZpbGUgIgorICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICBzZWFyY2hlZCBvbiAic3lzLnBhdGgiLiAgTm90ZSB0aGF0IGVhY2ggYnJlYWtwb2ludCBpcyAnCisgICAgICAgICAgICAgJ2Fzc2lnbmVkIGFcbicKKyAgICAgICAgICAgICAnICAgbnVtYmVyIHRvIHdoaWNoIGFsbCB0aGUgb3RoZXIgYnJlYWtwb2ludCBjb21tYW5kcyByZWZlci5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIElmIGEgc2Vjb25kIGFyZ3VtZW50IGlzIHByZXNlbnQsIGl0IGlzIGFuIGV4cHJlc3Npb24gd2hpY2ggJworICAgICAgICAgICAgICdtdXN0XG4nCisgICAgICAgICAgICAgJyAgIGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaXRob3V0IGFyZ3VtZW50LCBsaXN0IGFsbCBicmVha3MsIGluY2x1ZGluZyBmb3IgZWFjaCAnCisgICAgICAgICAgICAgJ2JyZWFrcG9pbnQsXG4nCisgICAgICAgICAgICAgJyAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBicmVha3BvaW50IGhhcyBiZWVuIGhpdCwgdGhlICcKKyAgICAgICAgICAgICAnY3VycmVudFxuJworICAgICAgICAgICAgICcgICBpZ25vcmUgY291bnQsIGFuZCB0aGUgYXNzb2NpYXRlZCBjb25kaXRpb24gaWYgYW55LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAndGJyZWFrIFsoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFRlbXBvcmFyeSBicmVha3BvaW50LCB3aGljaCBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJyAgIGZpcnN0IGhpdC4gVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yICJicmVhayIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdjbChlYXIpIFtmaWxlbmFtZTpsaW5lbm8gfCBicG51bWJlciBbYnBudW1iZXIgLi4uXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGggYSAqZmlsZW5hbWU6bGluZW5vKiBhcmd1bWVudCwgY2xlYXIgYWxsIHRoZSBicmVha3BvaW50cyAnCisgICAgICAgICAgICAgJ2F0XG4nCisgICAgICAgICAgICAgJyAgIHRoaXMgbGluZS4gV2l0aCBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGJyZWFrcG9pbnQgbnVtYmVycywgJworICAgICAgICAgICAgICdjbGVhclxuJworICAgICAgICAgICAgICcgICB0aG9zZSBicmVha3BvaW50cy4gV2l0aG91dCBhcmd1bWVudCwgY2xlYXIgYWxsIGJyZWFrcyAoYnV0ICcKKyAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAnICAgYXNrIGNvbmZpcm1hdGlvbikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdkaXNhYmxlIFticG51bWJlciBbYnBudW1iZXIgLi4uXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIERpc2FibGUgdGhlIGJyZWFrcG9pbnRzIGdpdmVuIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2ZcbicKKyAgICAgICAgICAgICAnICAgYnJlYWtwb2ludCBudW1iZXJzLiAgRGlzYWJsaW5nIGEgYnJlYWtwb2ludCBtZWFucyBpdCBjYW5ub3QgJworICAgICAgICAgICAgICdjYXVzZVxuJworICAgICAgICAgICAgICcgICB0aGUgcHJvZ3JhbSB0byBzdG9wIGV4ZWN1dGlvbiwgYnV0IHVubGlrZSBjbGVhcmluZyBhICcKKyAgICAgICAgICAgICAnYnJlYWtwb2ludCwgaXRcbicKKyAgICAgICAgICAgICAnICAgcmVtYWlucyBpbiB0aGUgbGlzdCBvZiBicmVha3BvaW50cyBhbmQgY2FuIGJlIChyZS0pZW5hYmxlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2VuYWJsZSBbYnBudW1iZXIgW2JwbnVtYmVyIC4uLl1dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFbmFibGUgdGhlIGJyZWFrcG9pbnRzIHNwZWNpZmllZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2lnbm9yZSBicG51bWJlciBbY291bnRdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBTZXQgdGhlIGlnbm9yZSBjb3VudCBmb3IgdGhlIGdpdmVuIGJyZWFrcG9pbnQgbnVtYmVyLiAgSWYgJworICAgICAgICAgICAgICdjb3VudCBpc1xuJworICAgICAgICAgICAgICcgICBvbWl0dGVkLCB0aGUgaWdub3JlIGNvdW50IGlzIHNldCB0byAwLiAgQSBicmVha3BvaW50IGJlY29tZXMgJworICAgICAgICAgICAgICdhY3RpdmVcbicKKyAgICAgICAgICAgICAnICAgd2hlbiB0aGUgaWdub3JlIGNvdW50IGlzIHplcm8uICBXaGVuIG5vbi16ZXJvLCB0aGUgY291bnQgaXNcbicKKyAgICAgICAgICAgICAnICAgZGVjcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBicmVha3BvaW50IGlzIHJlYWNoZWQgYW5kIHRoZSAnCisgICAgICAgICAgICAgJ2JyZWFrcG9pbnRcbicKKyAgICAgICAgICAgICAnICAgaXMgbm90IGRpc2FibGVkIGFuZCBhbnkgYXNzb2NpYXRlZCBjb25kaXRpb24gZXZhbHVhdGVzIHRvICcKKyAgICAgICAgICAgICAndHJ1ZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2NvbmRpdGlvbiBicG51bWJlciBbY29uZGl0aW9uXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgU2V0IGEgbmV3ICpjb25kaXRpb24qIGZvciB0aGUgYnJlYWtwb2ludCwgYW4gZXhwcmVzc2lvbiB3aGljaCAnCisgICAgICAgICAgICAgJ211c3RcbicKKyAgICAgICAgICAgICAnICAgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC4gIElmICcKKyAgICAgICAgICAgICAnKmNvbmRpdGlvbipcbicKKyAgICAgICAgICAgICAnICAgaXMgYWJzZW50LCBhbnkgZXhpc3RpbmcgY29uZGl0aW9uIGlzIHJlbW92ZWQ7IGkuZS4sIHRoZSAnCisgICAgICAgICAgICAgJ2JyZWFrcG9pbnRcbicKKyAgICAgICAgICAgICAnICAgaXMgbWFkZSB1bmNvbmRpdGlvbmFsLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnY29tbWFuZHMgW2JwbnVtYmVyXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgU3BlY2lmeSBhIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGJyZWFrcG9pbnQgbnVtYmVyICpicG51bWJlciouICAnCisgICAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAgICcgICBjb21tYW5kcyB0aGVtc2VsdmVzIGFwcGVhciBvbiB0aGUgZm9sbG93aW5nIGxpbmVzLiAgVHlwZSBhICcKKyAgICAgICAgICAgICAnbGluZVxuJworICAgICAgICAgICAgICcgICBjb250YWluaW5nIGp1c3QgImVuZCIgdG8gdGVybWluYXRlIHRoZSBjb21tYW5kcy4gQW4gZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIChQZGIpIGNvbW1hbmRzIDFcbicKKyAgICAgICAgICAgICAnICAgICAgKGNvbSkgcCBzb21lX3ZhcmlhYmxlXG4nCisgICAgICAgICAgICAgJyAgICAgIChjb20pIGVuZFxuJworICAgICAgICAgICAgICcgICAgICAoUGRiKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVG8gcmVtb3ZlIGFsbCBjb21tYW5kcyBmcm9tIGEgYnJlYWtwb2ludCwgdHlwZSBjb21tYW5kcyBhbmQgJworICAgICAgICAgICAgICdmb2xsb3dcbicKKyAgICAgICAgICAgICAnICAgaXQgaW1tZWRpYXRlbHkgd2l0aCAiZW5kIjsgdGhhdCBpcywgZ2l2ZSBubyBjb21tYW5kcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGggbm8gKmJwbnVtYmVyKiBhcmd1bWVudCwgY29tbWFuZHMgcmVmZXJzIHRvIHRoZSBsYXN0ICcKKyAgICAgICAgICAgICAnYnJlYWtwb2ludFxuJworICAgICAgICAgICAgICcgICBzZXQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBZb3UgY2FuIHVzZSBicmVha3BvaW50IGNvbW1hbmRzIHRvIHN0YXJ0IHlvdXIgcHJvZ3JhbSB1cCAnCisgICAgICAgICAgICAgJ2FnYWluLlxuJworICAgICAgICAgICAgICcgICBTaW1wbHkgdXNlIHRoZSBjb250aW51ZSBjb21tYW5kLCBvciBzdGVwLCBvciBhbnkgb3RoZXIgJworICAgICAgICAgICAgICdjb21tYW5kIHRoYXRcbicKKyAgICAgICAgICAgICAnICAgcmVzdW1lcyBleGVjdXRpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBTcGVjaWZ5aW5nIGFueSBjb21tYW5kIHJlc3VtaW5nIGV4ZWN1dGlvbiAoY3VycmVudGx5ICcKKyAgICAgICAgICAgICAnY29udGludWUsXG4nCisgICAgICAgICAgICAgJyAgIHN0ZXAsIG5leHQsIHJldHVybiwganVtcCwgcXVpdCBhbmQgdGhlaXIgYWJicmV2aWF0aW9ucykgJworICAgICAgICAgICAgICd0ZXJtaW5hdGVzXG4nCisgICAgICAgICAgICAgJyAgIHRoZSBjb21tYW5kIGxpc3QgKGFzIGlmIHRoYXQgY29tbWFuZCB3YXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgJworICAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgICcgICBlbmQpLiBUaGlzIGlzIGJlY2F1c2UgYW55IHRpbWUgeW91IHJlc3VtZSBleGVjdXRpb24gKGV2ZW4gJworICAgICAgICAgICAgICd3aXRoIGFcbicKKyAgICAgICAgICAgICAnICAgc2ltcGxlIG5leHQgb3Igc3RlcCksIHlvdSBtYXkgZW5jb3VudGVyIGFub3RoZXIgJworICAgICAgICAgICAgICdicmVha3BvaW50LS13aGljaFxuJworICAgICAgICAgICAgICcgICBjb3VsZCBoYXZlIGl0cyBvd24gY29tbWFuZCBsaXN0LCBsZWFkaW5nIHRvIGFtYmlndWl0aWVzIGFib3V0ICcKKyAgICAgICAgICAgICAnd2hpY2hcbicKKyAgICAgICAgICAgICAnICAgbGlzdCB0byBleGVjdXRlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiICAgSWYgeW91IHVzZSB0aGUgJ3NpbGVudCcgY29tbWFuZCBpbiB0aGUgY29tbWFuZCBsaXN0LCB0aGUgIgorICAgICAgICAgICAgICd1c3VhbFxuJworICAgICAgICAgICAgICcgICBtZXNzYWdlIGFib3V0IHN0b3BwaW5nIGF0IGEgYnJlYWtwb2ludCBpcyBub3QgcHJpbnRlZC4gIFRoaXMgJworICAgICAgICAgICAgICdtYXkgYmVcbicKKyAgICAgICAgICAgICAnICAgZGVzaXJhYmxlIGZvciBicmVha3BvaW50cyB0aGF0IGFyZSB0byBwcmludCBhIHNwZWNpZmljICcKKyAgICAgICAgICAgICAnbWVzc2FnZSBhbmRcbicKKyAgICAgICAgICAgICAnICAgdGhlbiBjb250aW51ZS4gIElmIG5vbmUgb2YgdGhlIG90aGVyIGNvbW1hbmRzIHByaW50IGFueXRoaW5nLCAnCisgICAgICAgICAgICAgJ3lvdVxuJworICAgICAgICAgICAgICcgICBzZWUgbm8gc2lnbiB0aGF0IHRoZSBicmVha3BvaW50IHdhcyByZWFjaGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncyh0ZXApXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFeGVjdXRlIHRoZSBjdXJyZW50IGxpbmUsIHN0b3AgYXQgdGhlIGZpcnN0IHBvc3NpYmxlICcKKyAgICAgICAgICAgICAnb2NjYXNpb25cbicKKyAgICAgICAgICAgICAnICAgKGVpdGhlciBpbiBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9yIG9uIHRoZSBuZXh0IGxpbmUgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgY3VycmVudCBmdW5jdGlvbikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICduKGV4dClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50ICcKKyAgICAgICAgICAgICAnZnVuY3Rpb24gaXNcbicKKyAgICAgICAgICAgICAnICAgcmVhY2hlZCBvciBpdCByZXR1cm5zLiAgKFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIm5leHQiIGFuZCAnCisgICAgICAgICAgICAgJyJzdGVwIlxuJworICAgICAgICAgICAgICcgICBpcyB0aGF0ICJzdGVwIiBzdG9wcyBpbnNpZGUgYSBjYWxsZWQgZnVuY3Rpb24sIHdoaWxlICJuZXh0IlxuJworICAgICAgICAgICAgICcgICBleGVjdXRlcyBjYWxsZWQgZnVuY3Rpb25zIGF0IChuZWFybHkpIGZ1bGwgc3BlZWQsIG9ubHkgJworICAgICAgICAgICAgICdzdG9wcGluZyBhdFxuJworICAgICAgICAgICAgICcgICB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3VudChpbCkgW2xpbmVub11cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGhvdXQgYXJndW1lbnQsIGNvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbGluZSB3aXRoIGEgJworICAgICAgICAgICAgICdudW1iZXJcbicKKyAgICAgICAgICAgICAnICAgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG9uZSBpcyByZWFjaGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgV2l0aCBhIGxpbmUgbnVtYmVyLCBjb250aW51ZSBleGVjdXRpb24gdW50aWwgYSBsaW5lIHdpdGggYSAnCisgICAgICAgICAgICAgJ251bWJlclxuJworICAgICAgICAgICAgICcgICBncmVhdGVyIG9yIGVxdWFsIHRvIHRoYXQgaXMgcmVhY2hlZC4gIEluIGJvdGggY2FzZXMsIGFsc28gJworICAgICAgICAgICAgICdzdG9wIHdoZW5cbicKKyAgICAgICAgICAgICAnICAgdGhlIGN1cnJlbnQgZnJhbWUgcmV0dXJucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IEFsbG93IGdpdmluZyBhbiBleHBsaWNpdCBsaW5lICcKKyAgICAgICAgICAgICAnbnVtYmVyLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncihldHVybilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY3VycmVudCBmdW5jdGlvbiByZXR1cm5zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnYyhvbnQoaW51ZSkpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBDb250aW51ZSBleGVjdXRpb24sIG9ubHkgc3RvcCB3aGVuIGEgYnJlYWtwb2ludCBpcyAnCisgICAgICAgICAgICAgJ2VuY291bnRlcmVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaih1bXApIGxpbmVub1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgU2V0IHRoZSBuZXh0IGxpbmUgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkLiAgT25seSBhdmFpbGFibGUgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgYm90dG9tLW1vc3QgZnJhbWUuICBUaGlzIGxldHMgeW91IGp1bXAgYmFjayBhbmQgZXhlY3V0ZSBjb2RlICcKKyAgICAgICAgICAgICAnYWdhaW4sXG4nCisgICAgICAgICAgICAgIiAgIG9yIGp1bXAgZm9yd2FyZCB0byBza2lwIGNvZGUgdGhhdCB5b3UgZG9uJ3Qgd2FudCB0byBydW4uXG4iCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBub3QgYWxsIGp1bXBzIGFyZSBhbGxvd2VkIC0tIGZvciAnCisgICAgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgICAgJyAgIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBqdW1wIGludG8gdGhlIG1pZGRsZSBvZiBhICJmb3IiIGxvb3Agb3IgJworICAgICAgICAgICAgICdvdXRcbicKKyAgICAgICAgICAgICAnICAgb2YgYSAiZmluYWxseSIgY2xhdXNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnbChpc3QpIFtmaXJzdFssIGxhc3RdXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTGlzdCBzb3VyY2UgY29kZSBmb3IgdGhlIGN1cnJlbnQgZmlsZS4gIFdpdGhvdXQgYXJndW1lbnRzLCAnCisgICAgICAgICAgICAgJ2xpc3QgMTFcbicKKyAgICAgICAgICAgICAnICAgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUgb3IgY29udGludWUgdGhlIHByZXZpb3VzICcKKyAgICAgICAgICAgICAnbGlzdGluZy5cbicKKyAgICAgICAgICAgICAnICAgV2l0aCAiLiIgYXMgYXJndW1lbnQsIGxpc3QgMTEgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUuICAnCisgICAgICAgICAgICAgJ1dpdGhcbicKKyAgICAgICAgICAgICAnICAgb25lIGFyZ3VtZW50LCBsaXN0IDExIGxpbmVzIGFyb3VuZCBhdCB0aGF0IGxpbmUuICBXaXRoIHR3b1xuJworICAgICAgICAgICAgICcgICBhcmd1bWVudHMsIGxpc3QgdGhlIGdpdmVuIHJhbmdlOyBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzICcKKyAgICAgICAgICAgICAnbGVzc1xuJworICAgICAgICAgICAgICcgICB0aGFuIHRoZSBmaXJzdCwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBjb3VudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnJhbWUgaXMgaW5kaWNhdGVkIGJ5ICItPiIuICAnCisgICAgICAgICAgICAgJ0lmIGFuXG4nCisgICAgICAgICAgICAgJyAgIGV4Y2VwdGlvbiBpcyBiZWluZyBkZWJ1Z2dlZCwgdGhlIGxpbmUgd2hlcmUgdGhlIGV4Y2VwdGlvbiAnCisgICAgICAgICAgICAgJ3dhc1xuJworICAgICAgICAgICAgICcgICBvcmlnaW5hbGx5IHJhaXNlZCBvciBwcm9wYWdhdGVkIGlzIGluZGljYXRlZCBieSAiPj4iLCBpZiBpdCAnCisgICAgICAgICAgICAgJ2RpZmZlcnNcbicKKyAgICAgICAgICAgICAnICAgZnJvbSB0aGUgY3VycmVudCBsaW5lLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4yOiBUaGUgIj4+IiBtYXJrZXIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdsbCB8IGxvbmdsaXN0XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBMaXN0IGFsbCBzb3VyY2UgY29kZSBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24gb3IgZnJhbWUuXG4nCisgICAgICAgICAgICAgJyAgIEludGVyZXN0aW5nIGxpbmVzIGFyZSBtYXJrZWQgYXMgZm9yICJsaXN0Ii5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2EocmdzKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUHJpbnQgdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdwIGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEV2YWx1YXRlIHRoZSAqZXhwcmVzc2lvbiogaW4gdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHJpbnQgJworICAgICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAgICAnICAgdmFsdWUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOb3RlOiAicHJpbnQoKSIgY2FuIGFsc28gYmUgdXNlZCwgYnV0IGlzIG5vdCBhIGRlYnVnZ2VyICcKKyAgICAgICAgICAgICAnY29tbWFuZFxuJworICAgICAgICAgICAgICcgICAgIC0tLSB0aGlzIGV4ZWN1dGVzIHRoZSBQeXRob24gInByaW50KCkiIGZ1bmN0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncHAgZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTGlrZSB0aGUgInAiIGNvbW1hbmQsIGV4Y2VwdCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgJworICAgICAgICAgICAgICdwcmV0dHktXG4nCisgICAgICAgICAgICAgJyAgIHByaW50ZWQgdXNpbmcgdGhlICJwcHJpbnQiIG1vZHVsZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3doYXRpcyBleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBQcmludCB0aGUgdHlwZSBvZiB0aGUgKmV4cHJlc3Npb24qLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnc291cmNlIGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFRyeSB0byBnZXQgc291cmNlIGNvZGUgZm9yIHRoZSBnaXZlbiBvYmplY3QgYW5kIGRpc3BsYXkgaXQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdkaXNwbGF5IFtleHByZXNzaW9uXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRGlzcGxheSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaWYgaXQgY2hhbmdlZCwgZWFjaCB0aW1lXG4nCisgICAgICAgICAgICAgJyAgIGV4ZWN1dGlvbiBzdG9wcyBpbiB0aGUgY3VycmVudCBmcmFtZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGhvdXQgZXhwcmVzc2lvbiwgbGlzdCBhbGwgZGlzcGxheSBleHByZXNzaW9ucyBmb3IgdGhlICcKKyAgICAgICAgICAgICAnY3VycmVudFxuJworICAgICAgICAgICAgICcgICBmcmFtZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3VuZGlzcGxheSBbZXhwcmVzc2lvbl1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIERvIG5vdCBkaXNwbGF5IHRoZSBleHByZXNzaW9uIGFueSBtb3JlIGluIHRoZSBjdXJyZW50IGZyYW1lLlxuJworICAgICAgICAgICAgICcgICBXaXRob3V0IGV4cHJlc3Npb24sIGNsZWFyIGFsbCBkaXNwbGF5IGV4cHJlc3Npb25zIGZvciB0aGUgJworICAgICAgICAgICAgICdjdXJyZW50XG4nCisgICAgICAgICAgICAgJyAgIGZyYW1lLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4yLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaW50ZXJhY3RcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFN0YXJ0IGFuIGludGVyYWN0aXZlIGludGVycHJldGVyICh1c2luZyB0aGUgImNvZGUiIG1vZHVsZSkgJworICAgICAgICAgICAgICd3aG9zZVxuJworICAgICAgICAgICAgICcgICBnbG9iYWwgbmFtZXNwYWNlIGNvbnRhaW5zIGFsbCB0aGUgKGdsb2JhbCBhbmQgbG9jYWwpIG5hbWVzICcKKyAgICAgICAgICAgICAnZm91bmQgaW5cbicKKyAgICAgICAgICAgICAnICAgdGhlIGN1cnJlbnQgc2NvcGUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdhbGlhcyBbbmFtZSBbY29tbWFuZF1dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBDcmVhdGUgYW4gYWxpYXMgY2FsbGVkICpuYW1lKiB0aGF0IGV4ZWN1dGVzICpjb21tYW5kKi4gIFRoZSAnCisgICAgICAgICAgICAgJ2NvbW1hbmRcbicKKyAgICAgICAgICAgICAnICAgbXVzdCAqbm90KiBiZSBlbmNsb3NlZCBpbiBxdW90ZXMuICBSZXBsYWNlYWJsZSBwYXJhbWV0ZXJzIGNhbiAnCisgICAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICAgJyAgIGluZGljYXRlZCBieSAiJTEiLCAiJTIiLCBhbmQgc28gb24sIHdoaWxlICIlKiIgaXMgcmVwbGFjZWQgYnkgJworICAgICAgICAgICAgICdhbGxcbicKKyAgICAgICAgICAgICAnICAgdGhlIHBhcmFtZXRlcnMuIElmIG5vIGNvbW1hbmQgaXMgZ2l2ZW4sIHRoZSBjdXJyZW50IGFsaWFzICcKKyAgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAgJyAgICpuYW1lKiBpcyBzaG93bi4gSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgYWxsIGFsaWFzZXMgYXJlICcKKyAgICAgICAgICAgICAnbGlzdGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQWxpYXNlcyBtYXkgYmUgbmVzdGVkIGFuZCBjYW4gY29udGFpbiBhbnl0aGluZyB0aGF0IGNhbiBiZSAnCisgICAgICAgICAgICAgJ2xlZ2FsbHlcbicKKyAgICAgICAgICAgICAnICAgdHlwZWQgYXQgdGhlIHBkYiBwcm9tcHQuICBOb3RlIHRoYXQgaW50ZXJuYWwgcGRiIGNvbW1hbmRzICcKKyAgICAgICAgICAgICAnKmNhbiogYmVcbicKKyAgICAgICAgICAgICAnICAgb3ZlcnJpZGRlbiBieSBhbGlhc2VzLiAgU3VjaCBhIGNvbW1hbmQgaXMgdGhlbiBoaWRkZW4gdW50aWwgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgYWxpYXMgaXMgcmVtb3ZlZC4gIEFsaWFzaW5nIGlzIHJlY3Vyc2l2ZWx5IGFwcGxpZWQgdG8gdGhlICcKKyAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAnICAgd29yZCBvZiB0aGUgY29tbWFuZCBsaW5lOyBhbGwgb3RoZXIgd29yZHMgaW4gdGhlIGxpbmUgYXJlICcKKyAgICAgICAgICAgICAnbGVmdFxuJworICAgICAgICAgICAgICcgICBhbG9uZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEFzIGFuIGV4YW1wbGUsIGhlcmUgYXJlIHR3byB1c2VmdWwgYWxpYXNlcyAoZXNwZWNpYWxseSB3aGVuICcKKyAgICAgICAgICAgICAncGxhY2VkXG4nCisgICAgICAgICAgICAgJyAgIGluIHRoZSAiLnBkYnJjIiBmaWxlKTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgICMgUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzICh1c2FnZSAicGkgY2xhc3NJbnN0IilcbicKKyAgICAgICAgICAgICAnICAgICAgYWxpYXMgcGkgZm9yIGsgaW4gJTEuX19kaWN0X18ua2V5cygpOiAnCisgICAgICAgICAgICAgJ3ByaW50KCIlMS4iLGssIj0iLCUxLl9fZGljdF9fW2tdKVxuJworICAgICAgICAgICAgICcgICAgICAjIFByaW50IGluc3RhbmNlIHZhcmlhYmxlcyBpbiBzZWxmXG4nCisgICAgICAgICAgICAgJyAgICAgIGFsaWFzIHBzIHBpIHNlbGZcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3VuYWxpYXMgbmFtZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRGVsZXRlIHRoZSBzcGVjaWZpZWQgYWxpYXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICchIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRXhlY3V0ZSB0aGUgKG9uZS1saW5lKSAqc3RhdGVtZW50KiBpbiB0aGUgY29udGV4dCBvZiB0aGUgJworICAgICAgICAgICAgICdjdXJyZW50XG4nCisgICAgICAgICAgICAgJyAgIHN0YWNrIGZyYW1lLiBUaGUgZXhjbGFtYXRpb24gcG9pbnQgY2FuIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSAnCisgICAgICAgICAgICAgJ2ZpcnN0XG4nCisgICAgICAgICAgICAgJyAgIHdvcmQgb2YgdGhlIHN0YXRlbWVudCByZXNlbWJsZXMgYSBkZWJ1Z2dlciBjb21tYW5kLiAgVG8gc2V0ICcKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICcgICBnbG9iYWwgdmFyaWFibGUsIHlvdSBjYW4gcHJlZml4IHRoZSBhc3NpZ25tZW50IGNvbW1hbmQgd2l0aCAnCisgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAnICAgImdsb2JhbCIgc3RhdGVtZW50IG9uIHRoZSBzYW1lIGxpbmUsIGUuZy46XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICIgICAgICAoUGRiKSBnbG9iYWwgbGlzdF9vcHRpb25zOyBsaXN0X29wdGlvbnMgPSBbJy1sJ11cbiIKKyAgICAgICAgICAgICAnICAgICAgKFBkYilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3J1biBbYXJncyAuLi5dXG4nCisgICAgICAgICAgICAgJ3Jlc3RhcnQgW2FyZ3MgLi4uXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUmVzdGFydCB0aGUgZGVidWdnZWQgUHl0aG9uIHByb2dyYW0uICBJZiBhbiBhcmd1bWVudCBpcyAnCisgICAgICAgICAgICAgJ3N1cHBsaWVkLFxuJworICAgICAgICAgICAgICcgICBpdCBpcyBzcGxpdCB3aXRoICJzaGxleCIgYW5kIHRoZSByZXN1bHQgaXMgdXNlZCBhcyB0aGUgbmV3XG4nCisgICAgICAgICAgICAgJyAgICJzeXMuYXJndiIuIEhpc3RvcnksIGJyZWFrcG9pbnRzLCBhY3Rpb25zIGFuZCBkZWJ1Z2dlciAnCisgICAgICAgICAgICAgJ29wdGlvbnMgYXJlXG4nCisgICAgICAgICAgICAgJyAgIHByZXNlcnZlZC4gInJlc3RhcnQiIGlzIGFuIGFsaWFzIGZvciAicnVuIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3EodWl0KVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUXVpdCBmcm9tIHRoZSBkZWJ1Z2dlci4gIFRoZSBwcm9ncmFtIGJlaW5nIGV4ZWN1dGVkIGlzICcKKyAgICAgICAgICAgICAnYWJvcnRlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJy1bIEZvb3Rub3RlcyBdLVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnWzFdIFdoZXRoZXIgYSBmcmFtZSBpcyBjb25zaWRlcmVkIHRvIG9yaWdpbmF0ZSBpbiBhIGNlcnRhaW4gJworICAgICAgICAgICAgICdtb2R1bGVcbicKKyAgICAgICAgICAgICAnICAgIGlzIGRldGVybWluZWQgYnkgdGhlICJfX25hbWVfXyIgaW4gdGhlIGZyYW1lIGdsb2JhbHMuXG4nLAorICdkZWwnOiAnXG4nCisgICAgICAgICdUaGUgImRlbCIgc3RhdGVtZW50XG4nCisgICAgICAgICcqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJyAgIGRlbF9zdG10IDo6PSAiZGVsIiB0YXJnZXRfbGlzdFxuJworICAgICAgICAnXG4nCisgICAgICAgICdEZWxldGlvbiBpcyByZWN1cnNpdmVseSBkZWZpbmVkIHZlcnkgc2ltaWxhciB0byB0aGUgd2F5IGFzc2lnbm1lbnQgJworICAgICAgICAnaXNcbicKKyAgICAgICAgJ2RlZmluZWQuIFJhdGhlciB0aGFuIHNwZWxsaW5nIGl0IG91dCBpbiBmdWxsIGRldGFpbHMsIGhlcmUgYXJlIHNvbWVcbicKKyAgICAgICAgJ2hpbnRzLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdEZWxldGlvbiBvZiBhIHRhcmdldCBsaXN0IHJlY3Vyc2l2ZWx5IGRlbGV0ZXMgZWFjaCB0YXJnZXQsIGZyb20gbGVmdFxuJworICAgICAgICAndG8gcmlnaHQuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0RlbGV0aW9uIG9mIGEgbmFtZSByZW1vdmVzIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBmcm9tIHRoZSBsb2NhbCAnCisgICAgICAgICdvclxuJworICAgICAgICAnZ2xvYmFsIG5hbWVzcGFjZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hbWUgb2NjdXJzIGluIGEgImdsb2JhbCJcbicKKyAgICAgICAgJ3N0YXRlbWVudCBpbiB0aGUgc2FtZSBjb2RlIGJsb2NrLiAgSWYgdGhlIG5hbWUgaXMgdW5ib3VuZCwgYVxuJworICAgICAgICAnIk5hbWVFcnJvciIgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdEZWxldGlvbiBvZiBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgc3Vic2NyaXB0aW9ucyBhbmQgc2xpY2luZ3MgaXMgJworICAgICAgICAncGFzc2VkXG4nCisgICAgICAgICd0byB0aGUgcHJpbWFyeSBvYmplY3QgaW52b2x2ZWQ7IGRlbGV0aW9uIG9mIGEgc2xpY2luZyBpcyBpbiBnZW5lcmFsXG4nCisgICAgICAgICdlcXVpdmFsZW50IHRvIGFzc2lnbm1lbnQgb2YgYW4gZW1wdHkgc2xpY2Ugb2YgdGhlIHJpZ2h0IHR5cGUgKGJ1dCAnCisgICAgICAgICdldmVuXG4nCisgICAgICAgICd0aGlzIGlzIGRldGVybWluZWQgYnkgdGhlIHNsaWNlZCBvYmplY3QpLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBQcmV2aW91c2x5IGl0IHdhcyBpbGxlZ2FsIHRvIGRlbGV0ZSBhIG5hbWVcbicKKyAgICAgICAgJ2Zyb20gdGhlIGxvY2FsIG5hbWVzcGFjZSBpZiBpdCBvY2N1cnMgYXMgYSBmcmVlIHZhcmlhYmxlIGluIGEgbmVzdGVkXG4nCisgICAgICAgICdibG9jay5cbicsCisgJ2RpY3QnOiAnXG4nCisgICAgICAgICAnRGljdGlvbmFyeSBkaXNwbGF5c1xuJworICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdBIGRpY3Rpb25hcnkgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBrZXkvZGF0dW0gcGFpcnNcbicKKyAgICAgICAgICdlbmNsb3NlZCBpbiBjdXJseSBicmFjZXM6XG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgZGljdF9kaXNwbGF5ICAgICAgIDo6PSAieyIgW2tleV9kYXR1bV9saXN0IHwgZGljdF9jb21wcmVoZW5zaW9uXSAnCisgICAgICAgICAnIn0iXG4nCisgICAgICAgICAnICAga2V5X2RhdHVtX2xpc3QgICAgIDo6PSBrZXlfZGF0dW0gKCIsIiBrZXlfZGF0dW0pKiBbIiwiXVxuJworICAgICAgICAgJyAgIGtleV9kYXR1bSAgICAgICAgICA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbiB8ICIqKiIgb3JfZXhwclxuJworICAgICAgICAgJyAgIGRpY3RfY29tcHJlaGVuc2lvbiA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbiBjb21wX2ZvclxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0EgZGljdGlvbmFyeSBkaXNwbGF5IHlpZWxkcyBhIG5ldyBkaWN0aW9uYXJ5IG9iamVjdC5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdJZiBhIGNvbW1hLXNlcGFyYXRlZCBzZXF1ZW5jZSBvZiBrZXkvZGF0dW0gcGFpcnMgaXMgZ2l2ZW4sIHRoZXkgYXJlXG4nCisgICAgICAgICAnZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB0byBkZWZpbmUgdGhlIGVudHJpZXMgb2YgdGhlICcKKyAgICAgICAgICdkaWN0aW9uYXJ5OlxuJworICAgICAgICAgJ2VhY2gga2V5IG9iamVjdCBpcyB1c2VkIGFzIGEga2V5IGludG8gdGhlIGRpY3Rpb25hcnkgdG8gc3RvcmUgdGhlXG4nCisgICAgICAgICAnY29ycmVzcG9uZGluZyBkYXR1bS4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHNwZWNpZnkgdGhlIHNhbWUga2V5XG4nCisgICAgICAgICAibXVsdGlwbGUgdGltZXMgaW4gdGhlIGtleS9kYXR1bSBsaXN0LCBhbmQgdGhlIGZpbmFsIGRpY3Rpb25hcnkncyAiCisgICAgICAgICAndmFsdWVcbicKKyAgICAgICAgICdmb3IgdGhhdCBrZXkgd2lsbCBiZSB0aGUgbGFzdCBvbmUgZ2l2ZW4uXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnQSBkb3VibGUgYXN0ZXJpc2sgIioqIiBkZW5vdGVzICpkaWN0aW9uYXJ5IHVucGFja2luZyouIEl0cyBvcGVyYW5kXG4nCisgICAgICAgICAnbXVzdCBiZSBhICptYXBwaW5nKi4gIEVhY2ggbWFwcGluZyBpdGVtIGlzIGFkZGVkIHRvIHRoZSBuZXdcbicKKyAgICAgICAgICdkaWN0aW9uYXJ5LiAgTGF0ZXIgdmFsdWVzIHJlcGxhY2UgdmFsdWVzIGFscmVhZHkgc2V0IGJ5IGVhcmxpZXJcbicKKyAgICAgICAgICdrZXkvZGF0dW0gcGFpcnMgYW5kIGVhcmxpZXIgZGljdGlvbmFyeSB1bnBhY2tpbmdzLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ05ldyBpbiB2ZXJzaW9uIDMuNTogVW5wYWNraW5nIGludG8gZGljdGlvbmFyeSBkaXNwbGF5cywgb3JpZ2luYWxseVxuJworICAgICAgICAgJ3Byb3Bvc2VkIGJ5ICoqUEVQIDQ0OCoqLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0EgZGljdCBjb21wcmVoZW5zaW9uLCBpbiBjb250cmFzdCB0byBsaXN0IGFuZCBzZXQgY29tcHJlaGVuc2lvbnMsXG4nCisgICAgICAgICAnbmVlZHMgdHdvIGV4cHJlc3Npb25zIHNlcGFyYXRlZCB3aXRoIGEgY29sb24gZm9sbG93ZWQgYnkgdGhlIHVzdWFsXG4nCisgICAgICAgICAnImZvciIgYW5kICJpZiIgY2xhdXNlcy4gV2hlbiB0aGUgY29tcHJlaGVuc2lvbiBpcyBydW4sIHRoZSAnCisgICAgICAgICAncmVzdWx0aW5nXG4nCisgICAgICAgICAna2V5IGFuZCB2YWx1ZSBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIG5ldyBkaWN0aW9uYXJ5IGluIHRoZSAnCisgICAgICAgICAnb3JkZXJcbicKKyAgICAgICAgICd0aGV5IGFyZSBwcm9kdWNlZC5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdSZXN0cmljdGlvbnMgb24gdGhlIHR5cGVzIG9mIHRoZSBrZXkgdmFsdWVzIGFyZSBsaXN0ZWQgZWFybGllciBpblxuJworICAgICAgICAgJ3NlY3Rpb24gVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5LiAgKFRvIHN1bW1hcml6ZSwgdGhlIGtleSB0eXBlXG4nCisgICAgICAgICAnc2hvdWxkIGJlICpoYXNoYWJsZSosIHdoaWNoIGV4Y2x1ZGVzIGFsbCBtdXRhYmxlIG9iamVjdHMuKSAgQ2xhc2hlc1xuJworICAgICAgICAgJ2JldHdlZW4gZHVwbGljYXRlIGtleXMgYXJlIG5vdCBkZXRlY3RlZDsgdGhlIGxhc3QgZGF0dW0gKHRleHR1YWxseVxuJworICAgICAgICAgJ3JpZ2h0bW9zdCBpbiB0aGUgZGlzcGxheSkgc3RvcmVkIGZvciBhIGdpdmVuIGtleSB2YWx1ZSBwcmV2YWlscy5cbicsCisgJ2R5bmFtaWMtZmVhdHVyZXMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzXG4nCisgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnTmFtZSByZXNvbHV0aW9uIG9mIGZyZWUgdmFyaWFibGVzIG9jY3VycyBhdCBydW50aW1lLCBub3QgJworICAgICAgICAgICAgICAgICAgICAgJ2F0IGNvbXBpbGVcbicKKyAgICAgICAgICAgICAgICAgICAgICd0aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaSA9IDEwXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgZGVmIGYoKTpcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgICAgcHJpbnQoaSlcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpID0gNDJcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBmKClcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgJworICAgICAgICAgICAgICAgICAgICAgJ2lsbGVnYWwgd2hlbiB1c2VkXG4nCisgICAgICAgICAgICAgICAgICAgICAnaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlICcKKyAgICAgICAgICAgICAgICAgICAgICd2YXJpYWJsZXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgJworICAgICAgICAgICAgICAgICAgICAgJ2lsbGVnYWwgdG9cbicKKyAgICAgICAgICAgICAgICAgICAgICdkZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgJworICAgICAgICAgICAgICAgICAgICAgJ3RpbWUuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzICcKKyAgICAgICAgICAgICAgICAgICAgICd0byB0aGUgZnVsbFxuJworICAgICAgICAgICAgICAgICAgICAgJ2Vudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgJworICAgICAgICAgICAgICAgICAgICAgJ2luIHRoZSBsb2NhbFxuJworICAgICAgICAgICAgICAgICAgICAgJ2FuZCBnbG9iYWwgbmFtZXNwYWNlcyBvZiB0aGUgY2FsbGVyLiAgRnJlZSB2YXJpYWJsZXMgYXJlICcKKyAgICAgICAgICAgICAgICAgICAgICdub3QgcmVzb2x2ZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICdpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCAnCisgICAgICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlLiAgWzFdXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCAnCisgICAgICAgICAgICAgICAgICAgICAnYXJndW1lbnRzIHRvXG4nCisgICAgICAgICAgICAgICAgICAgICAnb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLiAgSWYgb25seSBvbmUgJworICAgICAgICAgICAgICAgICAgICAgJ25hbWVzcGFjZSBpc1xuJworICAgICAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicsCisgJ2Vsc2UnOiAnXG4nCisgICAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50XG4nCisgICAgICAgICAnKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcgICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4nCisgICAgICAgICAnICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbicKKyAgICAgICAgICcgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdJdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgJworICAgICAgICAgJ29uZVxuJworICAgICAgICAgJ2J5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gQm9vbGVhbiAnCisgICAgICAgICAnb3BlcmF0aW9uc1xuJworICAgICAgICAgJ2ZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuJworICAgICAgICAgJyhhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbicKKyAgICAgICAgICdJZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmXG4nCisgICAgICAgICAncHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nLAorICdleGNlcHRpb25zJzogJ1xuJworICAgICAgICAgICAgICAgJ0V4Y2VwdGlvbnNcbicKKyAgICAgICAgICAgICAgICcqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnRXhjZXB0aW9ucyBhcmUgYSBtZWFucyBvZiBicmVha2luZyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IG9mICcKKyAgICAgICAgICAgICAgICdjb250cm9sXG4nCisgICAgICAgICAgICAgICAnb2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgJworICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbmFsXG4nCisgICAgICAgICAgICAgICAnY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlICcKKyAgICAgICAgICAgICAgICdlcnJvciBpc1xuJworICAgICAgICAgICAgICAgJ2RldGVjdGVkOyBpdCBtYXkgYmUgKmhhbmRsZWQqIGJ5IHRoZSBzdXJyb3VuZGluZyBjb2RlIGJsb2NrIG9yICcKKyAgICAgICAgICAgICAgICdieSBhbnlcbicKKyAgICAgICAgICAgICAgICdjb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrICcKKyAgICAgICAgICAgICAgICd3aGVyZVxuJworICAgICAgICAgICAgICAgJ3RoZSBlcnJvciBvY2N1cnJlZC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdUaGUgUHl0aG9uIGludGVycHJldGVyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBkZXRlY3RzIGEgJworICAgICAgICAgICAgICAgJ3J1bi10aW1lXG4nCisgICAgICAgICAgICAgICAnZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvXG4nCisgICAgICAgICAgICAgICAnZXhwbGljaXRseSByYWlzZSBhbiBleGNlcHRpb24gd2l0aCB0aGUgInJhaXNlIiBzdGF0ZW1lbnQuICcKKyAgICAgICAgICAgICAgICdFeGNlcHRpb25cbicKKyAgICAgICAgICAgICAgICdoYW5kbGVycyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlICJ0cnkiIC4uLiAiZXhjZXB0IiBzdGF0ZW1lbnQuICAnCisgICAgICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICAgICAnImZpbmFsbHkiIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgJworICAgICAgICAgICAgICAgJ2NsZWFudXBcbicKKyAgICAgICAgICAgICAgICdjb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMgZXhlY3V0ZWQgJworICAgICAgICAgICAgICAgJ3doZXRoZXIgYW5cbicKKyAgICAgICAgICAgICAgICdleGNlcHRpb24gb2NjdXJyZWQgb3Igbm90IGluIHRoZSBwcmVjZWRpbmcgY29kZS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdQeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gJworICAgICAgICAgICAgICAgJ2V4Y2VwdGlvblxuJworICAgICAgICAgICAgICAgJ2hhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCAnCisgICAgICAgICAgICAgICAnYW4gb3V0ZXJcbicKKyAgICAgICAgICAgICAgICdsZXZlbCwgYnV0IGl0IGNhbm5vdCByZXBhaXIgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBhbmQgcmV0cnkgJworICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgJ2ZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSAnCisgICAgICAgICAgICAgICAnb2YgY29kZVxuJworICAgICAgICAgICAgICAgJ2Zyb20gdGhlIHRvcCkuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnV2hlbiBhbiBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYXQgYWxsLCB0aGUgaW50ZXJwcmV0ZXIgJworICAgICAgICAgICAgICAgJ3Rlcm1pbmF0ZXNcbicKKyAgICAgICAgICAgICAgICdleGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gJworICAgICAgICAgICAgICAgJ2xvb3AuICBJblxuJworICAgICAgICAgICAgICAgJ2VpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSAnCisgICAgICAgICAgICAgICAnZXhjZXB0aW9uIGlzXG4nCisgICAgICAgICAgICAgICAnIlN5c3RlbUV4aXQiLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0V4Y2VwdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgY2xhc3MgaW5zdGFuY2VzLiAgVGhlICJleGNlcHQiICcKKyAgICAgICAgICAgICAgICdjbGF1c2UgaXNcbicKKyAgICAgICAgICAgICAgICdzZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZTogaXQgbXVzdCAnCisgICAgICAgICAgICAgICAncmVmZXJlbmNlIHRoZVxuJworICAgICAgICAgICAgICAgJ2NsYXNzIG9mIHRoZSBpbnN0YW5jZSBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZi4gIFRoZSBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAnY2FuIGJlXG4nCisgICAgICAgICAgICAgICAncmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICcKKyAgICAgICAgICAgICAgICdhYm91dCB0aGVcbicKKyAgICAgICAgICAgICAgICdleGNlcHRpb25hbCBjb25kaXRpb24uXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnTm90ZTogRXhjZXB0aW9uIG1lc3NhZ2VzIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gICcKKyAgICAgICAgICAgICAgICdUaGVpclxuJworICAgICAgICAgICAgICAgJyAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCAnCisgICAgICAgICAgICAgICAnd2l0aG91dFxuJworICAgICAgICAgICAgICAgJyAgd2FybmluZyBhbmQgc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gYnkgY29kZSB3aGljaCB3aWxsIHJ1biAnCisgICAgICAgICAgICAgICAndW5kZXJcbicKKyAgICAgICAgICAgICAgICcgIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBpbnRlcnByZXRlci5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdTZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICJ0cnkiIHN0YXRlbWVudCBpbiBzZWN0aW9uIFRoZSAnCisgICAgICAgICAgICAgICAndHJ5XG4nCisgICAgICAgICAgICAgICAnc3RhdGVtZW50IGFuZCAicmFpc2UiIHN0YXRlbWVudCBpbiBzZWN0aW9uIFRoZSByYWlzZSAnCisgICAgICAgICAgICAgICAnc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJy1bIEZvb3Rub3RlcyBdLVxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1sxXSBUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcyBleGVjdXRlZCAnCisgICAgICAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAgICAgICcgICAgdGhlc2Ugb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgJworICAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICAnICAgIGNvbXBpbGVkLlxuJywKKyAnZXhlY21vZGVsJzogJ1xuJworICAgICAgICAgICAgICAnRXhlY3V0aW9uIG1vZGVsXG4nCisgICAgICAgICAgICAgICcqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdTdHJ1Y3R1cmUgb2YgYSBwcm9ncmFtXG4nCisgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0EgUHl0aG9uIHByb2dyYW0gaXMgY29uc3RydWN0ZWQgZnJvbSBjb2RlIGJsb2Nrcy4gQSAqYmxvY2sqIGlzICcKKyAgICAgICAgICAgICAgJ2EgcGllY2VcbicKKyAgICAgICAgICAgICAgJ29mIFB5dGhvbiBwcm9ncmFtIHRleHQgdGhhdCBpcyBleGVjdXRlZCBhcyBhIHVuaXQuIFRoZSAnCisgICAgICAgICAgICAgICdmb2xsb3dpbmcgYXJlXG4nCisgICAgICAgICAgICAgICdibG9ja3M6IGEgbW9kdWxlLCBhIGZ1bmN0aW9uIGJvZHksIGFuZCBhIGNsYXNzIGRlZmluaXRpb24uICcKKyAgICAgICAgICAgICAgJ0VhY2hcbicKKyAgICAgICAgICAgICAgJ2NvbW1hbmQgdHlwZWQgaW50ZXJhY3RpdmVseSBpcyBhIGJsb2NrLiAgQSBzY3JpcHQgZmlsZSAoYSBmaWxlICcKKyAgICAgICAgICAgICAgJ2dpdmVuXG4nCisgICAgICAgICAgICAgICdhcyBzdGFuZGFyZCBpbnB1dCB0byB0aGUgaW50ZXJwcmV0ZXIgb3Igc3BlY2lmaWVkIGFzIGEgY29tbWFuZCAnCisgICAgICAgICAgICAgICdsaW5lXG4nCisgICAgICAgICAgICAgICdhcmd1bWVudCB0byB0aGUgaW50ZXJwcmV0ZXIpIGlzIGEgY29kZSBibG9jay4gIEEgc2NyaXB0IGNvbW1hbmQgJworICAgICAgICAgICAgICAnKGFcbicKKyAgICAgICAgICAgICAgJ2NvbW1hbmQgc3BlY2lmaWVkIG9uIHRoZSBpbnRlcnByZXRlciBjb21tYW5kIGxpbmUgd2l0aCB0aGUgJworICAgICAgICAgICAgICAiJyoqLWMqKidcbiIKKyAgICAgICAgICAgICAgJ29wdGlvbikgaXMgYSBjb2RlIGJsb2NrLiAgVGhlIHN0cmluZyBhcmd1bWVudCBwYXNzZWQgdG8gdGhlICcKKyAgICAgICAgICAgICAgJ2J1aWx0LWluXG4nCisgICAgICAgICAgICAgICdmdW5jdGlvbnMgImV2YWwoKSIgYW5kICJleGVjKCkiIGlzIGEgY29kZSBibG9jay5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQSBjb2RlIGJsb2NrIGlzIGV4ZWN1dGVkIGluIGFuICpleGVjdXRpb24gZnJhbWUqLiAgQSBmcmFtZSAnCisgICAgICAgICAgICAgICdjb250YWluc1xuJworICAgICAgICAgICAgICAnc29tZSBhZG1pbmlzdHJhdGl2ZSBpbmZvcm1hdGlvbiAodXNlZCBmb3IgZGVidWdnaW5nKSBhbmQgJworICAgICAgICAgICAgICAnZGV0ZXJtaW5lc1xuJworICAgICAgICAgICAgICAid2hlcmUgYW5kIGhvdyBleGVjdXRpb24gY29udGludWVzIGFmdGVyIHRoZSBjb2RlIGJsb2NrJ3MgIgorICAgICAgICAgICAgICAnZXhlY3V0aW9uIGhhc1xuJworICAgICAgICAgICAgICAnY29tcGxldGVkLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ05hbWluZyBhbmQgYmluZGluZ1xuJworICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQmluZGluZyBvZiBuYW1lc1xuJworICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcqTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lICcKKyAgICAgICAgICAgICAgJ2JpbmRpbmdcbicKKyAgICAgICAgICAgICAgJ29wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byAnCisgICAgICAgICAgICAgICdmdW5jdGlvbnMsXG4nCisgICAgICAgICAgICAgICciaW1wb3J0IiBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgJworICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICdjbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgJworICAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgICdpZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgImZvciIgbG9vcCBoZWFkZXIsICcKKyAgICAgICAgICAgICAgJ29yIGFmdGVyXG4nCisgICAgICAgICAgICAgICciYXMiIGluIGEgIndpdGgiIHN0YXRlbWVudCBvciAiZXhjZXB0IiBjbGF1c2UuIFRoZSAiaW1wb3J0IiAnCisgICAgICAgICAgICAgICdzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAgJ29mIHRoZSBmb3JtICJmcm9tIC4uLiBpbXBvcnQgKiIgYmluZHMgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlXG4nCisgICAgICAgICAgICAgICdpbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdCB0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgJworICAgICAgICAgICAgICAnVGhpcyBmb3JtXG4nCisgICAgICAgICAgICAgICdtYXkgb25seSBiZSB1c2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0EgdGFyZ2V0IG9jY3VycmluZyBpbiBhICJkZWwiIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgJworICAgICAgICAgICAgICAnYm91bmQgZm9yXG4nCisgICAgICAgICAgICAgICd0aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSAnCisgICAgICAgICAgICAgICduYW1lKS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrICcKKyAgICAgICAgICAgICAgJ2RlZmluZWQgYnkgYVxuJworICAgICAgICAgICAgICAnY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgJworICAgICAgICAgICAgICAndG9wLWxldmVsXG4nCisgICAgICAgICAgICAgICdjb2RlIGJsb2NrKS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCAnCisgICAgICAgICAgICAgICdibG9jayxcbicKKyAgICAgICAgICAgICAgJ3VubGVzcyBkZWNsYXJlZCBhcyAibm9ubG9jYWwiIG9yICJnbG9iYWwiLiAgSWYgYSBuYW1lIGlzIGJvdW5kICcKKyAgICAgICAgICAgICAgJ2F0IHRoZVxuJworICAgICAgICAgICAgICAnbW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGUgdmFyaWFibGVzIG9mIHRoZSAnCisgICAgICAgICAgICAgICdtb2R1bGVcbicKKyAgICAgICAgICAgICAgJ2NvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYSB2YXJpYWJsZSBpcyB1c2VkIGluIGEgJworICAgICAgICAgICAgICAnY29kZVxuJworICAgICAgICAgICAgICAnYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlIHZhcmlhYmxlKi5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0byB0aGUgJworICAgICAgICAgICAgICAnKmJpbmRpbmcqXG4nCisgICAgICAgICAgICAgICdvZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBuYW1lIHJlc29sdXRpb24gJworICAgICAgICAgICAgICAncnVsZXMuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnUmVzb2x1dGlvbiBvZiBuYW1lc1xuJworICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdBICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiAnCisgICAgICAgICAgICAgICdhIGxvY2FsXG4nCisgICAgICAgICAgICAgICd2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgJworICAgICAgICAgICAgICAnSWYgdGhlXG4nCisgICAgICAgICAgICAgICdkZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgJworICAgICAgICAgICAgICAnYmxvY2tzXG4nCisgICAgICAgICAgICAgICdjb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayAnCisgICAgICAgICAgICAgICdpbnRyb2R1Y2VzXG4nCisgICAgICAgICAgICAgICdhIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSAnCisgICAgICAgICAgICAgICduZWFyZXN0XG4nCisgICAgICAgICAgICAgICdlbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSAnCisgICAgICAgICAgICAgICdibG9ja1xuJworICAgICAgICAgICAgICAiaXMgY2FsbGVkIHRoZSBibG9jaydzICplbnZpcm9ubWVudCouXG4iCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1doZW4gYSBuYW1lIGlzIG5vdCBmb3VuZCBhdCBhbGwsIGEgIk5hbWVFcnJvciIgZXhjZXB0aW9uIGlzICcKKyAgICAgICAgICAgICAgJ3JhaXNlZC4gSWZcbicKKyAgICAgICAgICAgICAgJ3RoZSBjdXJyZW50IHNjb3BlIGlzIGEgZnVuY3Rpb24gc2NvcGUsIGFuZCB0aGUgbmFtZSByZWZlcnMgdG8gYSAnCisgICAgICAgICAgICAgICdsb2NhbFxuJworICAgICAgICAgICAgICAndmFyaWFibGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGJvdW5kIHRvIGEgdmFsdWUgYXQgdGhlIHBvaW50ICcKKyAgICAgICAgICAgICAgJ3doZXJlIHRoZVxuJworICAgICAgICAgICAgICAnbmFtZSBpcyB1c2VkLCBhbiAiVW5ib3VuZExvY2FsRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nCisgICAgICAgICAgICAgICciVW5ib3VuZExvY2FsRXJyb3IiIGlzIGEgc3ViY2xhc3Mgb2YgIk5hbWVFcnJvciIuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0lmIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbiBvY2N1cnMgYW55d2hlcmUgd2l0aGluIGEgY29kZSAnCisgICAgICAgICAgICAgICdibG9jaywgYWxsXG4nCisgICAgICAgICAgICAgICd1c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byAnCisgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgJ2N1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkICcKKyAgICAgICAgICAgICAgJ3dpdGhpbiBhXG4nCisgICAgICAgICAgICAgICdibG9jayBiZWZvcmUgaXQgaXMgYm91bmQuICBUaGlzIHJ1bGUgaXMgc3VidGxlLiAgUHl0aG9uIGxhY2tzXG4nCisgICAgICAgICAgICAgICdkZWNsYXJhdGlvbnMgYW5kIGFsbG93cyBuYW1lIGJpbmRpbmcgb3BlcmF0aW9ucyB0byBvY2N1ciAnCisgICAgICAgICAgICAgICdhbnl3aGVyZVxuJworICAgICAgICAgICAgICAnd2l0aGluIGEgY29kZSBibG9jay4gIFRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgYSBjb2RlIGJsb2NrIGNhbiAnCisgICAgICAgICAgICAgICdiZVxuJworICAgICAgICAgICAgICAnZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIGJsb2NrIGZvciBuYW1lICcKKyAgICAgICAgICAgICAgJ2JpbmRpbmdcbicKKyAgICAgICAgICAgICAgJ29wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0lmIHRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiAnCisgICAgICAgICAgICAgICd0aGUgbmFtZVxuJworICAgICAgICAgICAgICAnc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluICcKKyAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAndG9wLWxldmVsIG5hbWVzcGFjZS4gIE5hbWVzIGFyZSByZXNvbHZlZCBpbiB0aGUgdG9wLWxldmVsICcKKyAgICAgICAgICAgICAgJ25hbWVzcGFjZSBieVxuJworICAgICAgICAgICAgICAnc2VhcmNoaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpLmUuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlICcKKyAgICAgICAgICAgICAgJ21vZHVsZVxuJworICAgICAgICAgICAgICAnY29udGFpbmluZyB0aGUgY29kZSBibG9jaywgYW5kIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIHRoZSAnCisgICAgICAgICAgICAgICduYW1lc3BhY2VcbicKKyAgICAgICAgICAgICAgJ29mIHRoZSBtb2R1bGUgImJ1aWx0aW5zIi4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkICcKKyAgICAgICAgICAgICAgJ2ZpcnN0LiAgSWZcbicKKyAgICAgICAgICAgICAgJ3RoZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpcyAnCisgICAgICAgICAgICAgICdzZWFyY2hlZC4gIFRoZVxuJworICAgICAgICAgICAgICAnImdsb2JhbCIgc3RhdGVtZW50IG11c3QgcHJlY2VkZSBhbGwgdXNlcyBvZiB0aGUgbmFtZS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlICJnbG9iYWwiIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmcgJworICAgICAgICAgICAgICAnb3BlcmF0aW9uXG4nCisgICAgICAgICAgICAgICdpbiB0aGUgc2FtZSBibG9jay4gIElmIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSBmb3IgYSBmcmVlICcKKyAgICAgICAgICAgICAgJ3ZhcmlhYmxlXG4nCisgICAgICAgICAgICAgICdjb250YWlucyBhIGdsb2JhbCBzdGF0ZW1lbnQsIHRoZSBmcmVlIHZhcmlhYmxlIGlzIHRyZWF0ZWQgYXMgYSAnCisgICAgICAgICAgICAgICdnbG9iYWwuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSAibm9ubG9jYWwiIHN0YXRlbWVudCBjYXVzZXMgY29ycmVzcG9uZGluZyBuYW1lcyB0byByZWZlciAnCisgICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICAncHJldmlvdXNseSBib3VuZCB2YXJpYWJsZXMgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGZ1bmN0aW9uICcKKyAgICAgICAgICAgICAgJ3Njb3BlLlxuJworICAgICAgICAgICAgICAnIlN5bnRheEVycm9yIiBpcyByYWlzZWQgYXQgY29tcGlsZSB0aW1lIGlmIHRoZSBnaXZlbiBuYW1lIGRvZXMgJworICAgICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICAgICdleGlzdCBpbiBhbnkgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdUaGUgbmFtZXNwYWNlIGZvciBhIG1vZHVsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGhlIGZpcnN0ICcKKyAgICAgICAgICAgICAgJ3RpbWUgYVxuJworICAgICAgICAgICAgICAnbW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgJworICAgICAgICAgICAgICAnY2FsbGVkXG4nCisgICAgICAgICAgICAgICciX19tYWluX18iLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdDbGFzcyBkZWZpbml0aW9uIGJsb2NrcyBhbmQgYXJndW1lbnRzIHRvICJleGVjKCkiIGFuZCAiZXZhbCgpIiAnCisgICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAgJ3NwZWNpYWwgaW4gdGhlIGNvbnRleHQgb2YgbmFtZSByZXNvbHV0aW9uLiBBIGNsYXNzIGRlZmluaXRpb24gJworICAgICAgICAgICAgICAnaXMgYW5cbicKKyAgICAgICAgICAgICAgJ2V4ZWN1dGFibGUgc3RhdGVtZW50IHRoYXQgbWF5IHVzZSBhbmQgZGVmaW5lIG5hbWVzLiBUaGVzZSAnCisgICAgICAgICAgICAgICdyZWZlcmVuY2VzXG4nCisgICAgICAgICAgICAgICdmb2xsb3cgdGhlIG5vcm1hbCBydWxlcyBmb3IgbmFtZSByZXNvbHV0aW9uIHdpdGggYW4gZXhjZXB0aW9uICcKKyAgICAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgICAgJ3VuYm91bmQgbG9jYWwgdmFyaWFibGVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICcKKyAgICAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAgICAnbmFtZXNwYWNlIG9mIHRoZSBjbGFzcyBkZWZpbml0aW9uIGJlY29tZXMgdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICdkaWN0aW9uYXJ5IG9mXG4nCisgICAgICAgICAgICAgICd0aGUgY2xhc3MuIFRoZSBzY29wZSBvZiBuYW1lcyBkZWZpbmVkIGluIGEgY2xhc3MgYmxvY2sgaXMgJworICAgICAgICAgICAgICAnbGltaXRlZCB0b1xuJworICAgICAgICAgICAgICAndGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlIGNvZGUgYmxvY2tzIG9mICcKKyAgICAgICAgICAgICAgJ21ldGhvZHMgLS1cbicKKyAgICAgICAgICAgICAgJ3RoaXMgaW5jbHVkZXMgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvciBleHByZXNzaW9ucyBzaW5jZSAnCisgICAgICAgICAgICAgICd0aGV5IGFyZVxuJworICAgICAgICAgICAgICAnaW1wbGVtZW50ZWQgdXNpbmcgYSBmdW5jdGlvbiBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgJworICAgICAgICAgICAgICAnZm9sbG93aW5nXG4nCisgICAgICAgICAgICAgICd3aWxsIGZhaWw6XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyAgIGNsYXNzIEE6XG4nCisgICAgICAgICAgICAgICcgICAgICAgYSA9IDQyXG4nCisgICAgICAgICAgICAgICcgICAgICAgYiA9IGxpc3QoYSArIGkgZm9yIGkgaW4gcmFuZ2UoMTApKVxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0J1aWx0aW5zIGFuZCByZXN0cmljdGVkIGV4ZWN1dGlvblxuJworICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSBidWlsdGlucyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlICcKKyAgICAgICAgICAgICAgJ2Jsb2NrXG4nCisgICAgICAgICAgICAgICdpcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lICJfX2J1aWx0aW5zX18iIGluIGl0cyAnCisgICAgICAgICAgICAgICdnbG9iYWxcbicKKyAgICAgICAgICAgICAgJ25hbWVzcGFjZTsgdGhpcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG9yIGEgbW9kdWxlIChpbiB0aGUgJworICAgICAgICAgICAgICAnbGF0dGVyIGNhc2VcbicKKyAgICAgICAgICAgICAgInRoZSBtb2R1bGUncyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGUgIgorICAgICAgICAgICAgICAnIl9fbWFpbl9fIlxuJworICAgICAgICAgICAgICAnbW9kdWxlLCAiX19idWlsdGluc19fIiBpcyB0aGUgYnVpbHQtaW4gbW9kdWxlICJidWlsdGlucyI7IHdoZW4gJworICAgICAgICAgICAgICAnaW4gYW55XG4nCisgICAgICAgICAgICAgICdvdGhlciBtb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiAnCisgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgJyJidWlsdGlucyIgbW9kdWxlIGl0c2VsZi4gICJfX2J1aWx0aW5zX18iIGNhbiBiZSBzZXQgdG8gYSAnCisgICAgICAgICAgICAgICd1c2VyLWNyZWF0ZWRcbicKKyAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQgZXhlY3V0aW9uLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFVzZXJzIHNob3VsZCBub3QgdG91Y2hcbicKKyAgICAgICAgICAgICAgJyJfX2J1aWx0aW5zX18iOyBpdCBpcyBzdHJpY3RseSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICAnCisgICAgICAgICAgICAgICdVc2Vyc1xuJworICAgICAgICAgICAgICAnd2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBzaG91bGQgJworICAgICAgICAgICAgICAnImltcG9ydCJcbicKKyAgICAgICAgICAgICAgJ3RoZSAiYnVpbHRpbnMiIG1vZHVsZSBhbmQgbW9kaWZ5IGl0cyBhdHRyaWJ1dGVzIGFwcHJvcHJpYXRlbHkuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzXG4nCisgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnTmFtZSByZXNvbHV0aW9uIG9mIGZyZWUgdmFyaWFibGVzIG9jY3VycyBhdCBydW50aW1lLCBub3QgYXQgJworICAgICAgICAgICAgICAnY29tcGlsZVxuJworICAgICAgICAgICAgICAndGltZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHByaW50IDQyOlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcgICBpID0gMTBcbicKKyAgICAgICAgICAgICAgJyAgIGRlZiBmKCk6XG4nCisgICAgICAgICAgICAgICcgICAgICAgcHJpbnQoaSlcbicKKyAgICAgICAgICAgICAgJyAgIGkgPSA0MlxuJworICAgICAgICAgICAgICAnICAgZigpXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSBpbGxlZ2FsICcKKyAgICAgICAgICAgICAgJ3doZW4gdXNlZFxuJworICAgICAgICAgICAgICAnaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlIHZhcmlhYmxlcy5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgJworICAgICAgICAgICAgICAnaWxsZWdhbCB0b1xuJworICAgICAgICAgICAgICAnZGVsZXRlIHRoZSBuYW1lLiAgQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgZnVuY3Rpb25zIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgJworICAgICAgICAgICAgICAnZnVsbFxuJworICAgICAgICAgICAgICAnZW52aXJvbm1lbnQgZm9yIHJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgJworICAgICAgICAgICAgICAnbG9jYWxcbicKKyAgICAgICAgICAgICAgJ2FuZCBnbG9iYWwgbmFtZXNwYWNlcyBvZiB0aGUgY2FsbGVyLiAgRnJlZSB2YXJpYWJsZXMgYXJlIG5vdCAnCisgICAgICAgICAgICAgICdyZXNvbHZlZFxuJworICAgICAgICAgICAgICAnaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSwgYnV0IGluIHRoZSBnbG9iYWwgJworICAgICAgICAgICAgICAnbmFtZXNwYWNlLiAgWzFdXG4nCisgICAgICAgICAgICAgICdUaGUgImV4ZWMoKSIgYW5kICJldmFsKCkiIGZ1bmN0aW9ucyBoYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0b1xuJworICAgICAgICAgICAgICAnb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLiAgSWYgb25seSBvbmUgbmFtZXNwYWNlICcKKyAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICdzcGVjaWZpZWQsIGl0IGlzIHVzZWQgZm9yIGJvdGguXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnRXhjZXB0aW9uc1xuJworICAgICAgICAgICAgICAnPT09PT09PT09PVxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgJworICAgICAgICAgICAgICAnY29udHJvbFxuJworICAgICAgICAgICAgICAnb2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgZXhjZXB0aW9uYWxcbicKKyAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMgKnJhaXNlZCogYXQgdGhlIHBvaW50IHdoZXJlIHRoZSAnCisgICAgICAgICAgICAgICdlcnJvciBpc1xuJworICAgICAgICAgICAgICAnZGV0ZWN0ZWQ7IGl0IG1heSBiZSAqaGFuZGxlZCogYnkgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYmxvY2sgb3IgJworICAgICAgICAgICAgICAnYnkgYW55XG4nCisgICAgICAgICAgICAgICdjb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrICcKKyAgICAgICAgICAgICAgJ3doZXJlXG4nCisgICAgICAgICAgICAgICd0aGUgZXJyb3Igb2NjdXJyZWQuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSAnCisgICAgICAgICAgICAgICdydW4tdGltZVxuJworICAgICAgICAgICAgICAnZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvXG4nCisgICAgICAgICAgICAgICdleHBsaWNpdGx5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSAicmFpc2UiIHN0YXRlbWVudC4gJworICAgICAgICAgICAgICAnRXhjZXB0aW9uXG4nCisgICAgICAgICAgICAgICdoYW5kbGVycyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlICJ0cnkiIC4uLiAiZXhjZXB0IiBzdGF0ZW1lbnQuICAnCisgICAgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgICAgJyJmaW5hbGx5IiBjbGF1c2Ugb2Ygc3VjaCBhIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5ICcKKyAgICAgICAgICAgICAgJ2NsZWFudXBcbicKKyAgICAgICAgICAgICAgJ2NvZGUgd2hpY2ggZG9lcyBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24sIGJ1dCBpcyBleGVjdXRlZCAnCisgICAgICAgICAgICAgICd3aGV0aGVyIGFuXG4nCisgICAgICAgICAgICAgICdleGNlcHRpb24gb2NjdXJyZWQgb3Igbm90IGluIHRoZSBwcmVjZWRpbmcgY29kZS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnUHl0aG9uIHVzZXMgdGhlICJ0ZXJtaW5hdGlvbiIgbW9kZWwgb2YgZXJyb3IgaGFuZGxpbmc6IGFuICcKKyAgICAgICAgICAgICAgJ2V4Y2VwdGlvblxuJworICAgICAgICAgICAgICAnaGFuZGxlciBjYW4gZmluZCBvdXQgd2hhdCBoYXBwZW5lZCBhbmQgY29udGludWUgZXhlY3V0aW9uIGF0IGFuICcKKyAgICAgICAgICAgICAgJ291dGVyXG4nCisgICAgICAgICAgICAgICdsZXZlbCwgYnV0IGl0IGNhbm5vdCByZXBhaXIgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBhbmQgcmV0cnkgJworICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICdmYWlsaW5nIG9wZXJhdGlvbiAoZXhjZXB0IGJ5IHJlLWVudGVyaW5nIHRoZSBvZmZlbmRpbmcgcGllY2Ugb2YgJworICAgICAgICAgICAgICAnY29kZVxuJworICAgICAgICAgICAgICAnZnJvbSB0aGUgdG9wKS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnV2hlbiBhbiBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYXQgYWxsLCB0aGUgaW50ZXJwcmV0ZXIgJworICAgICAgICAgICAgICAndGVybWluYXRlc1xuJworICAgICAgICAgICAgICAnZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtLCBvciByZXR1cm5zIHRvIGl0cyBpbnRlcmFjdGl2ZSBtYWluICcKKyAgICAgICAgICAgICAgJ2xvb3AuICBJblxuJworICAgICAgICAgICAgICAnZWl0aGVyIGNhc2UsIGl0IHByaW50cyBhIHN0YWNrIGJhY2t0cmFjZSwgZXhjZXB0IHdoZW4gdGhlICcKKyAgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBpc1xuJworICAgICAgICAgICAgICAnIlN5c3RlbUV4aXQiLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFeGNlcHRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGNsYXNzIGluc3RhbmNlcy4gIFRoZSAiZXhjZXB0IiAnCisgICAgICAgICAgICAgICdjbGF1c2UgaXNcbicKKyAgICAgICAgICAgICAgJ3NlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0ICcKKyAgICAgICAgICAgICAgJ3JlZmVyZW5jZSB0aGVcbicKKyAgICAgICAgICAgICAgJ2NsYXNzIG9mIHRoZSBpbnN0YW5jZSBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZi4gIFRoZSBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICdjYW4gYmVcbicKKyAgICAgICAgICAgICAgJ3JlY2VpdmVkIGJ5IHRoZSBoYW5kbGVyIGFuZCBjYW4gY2FycnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAnCisgICAgICAgICAgICAgICdhYm91dCB0aGVcbicKKyAgICAgICAgICAgICAgJ2V4Y2VwdGlvbmFsIGNvbmRpdGlvbi5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnTm90ZTogRXhjZXB0aW9uIG1lc3NhZ2VzIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gICcKKyAgICAgICAgICAgICAgJ1RoZWlyXG4nCisgICAgICAgICAgICAgICcgIGNvbnRlbnRzIG1heSBjaGFuZ2UgZnJvbSBvbmUgdmVyc2lvbiBvZiBQeXRob24gdG8gdGhlIG5leHQgJworICAgICAgICAgICAgICAnd2l0aG91dFxuJworICAgICAgICAgICAgICAnICB3YXJuaW5nIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuICcKKyAgICAgICAgICAgICAgJ3VuZGVyXG4nCisgICAgICAgICAgICAgICcgIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBpbnRlcnByZXRlci5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSAidHJ5IiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiBUaGUgJworICAgICAgICAgICAgICAndHJ5XG4nCisgICAgICAgICAgICAgICdzdGF0ZW1lbnQgYW5kICJyYWlzZSIgc3RhdGVtZW50IGluIHNlY3Rpb24gVGhlIHJhaXNlICcKKyAgICAgICAgICAgICAgJ3N0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnLVsgRm9vdG5vdGVzIF0tXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1sxXSBUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcyBleGVjdXRlZCAnCisgICAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgICAnICAgIHRoZXNlIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUgbW9kdWxlICcKKyAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICcgICAgY29tcGlsZWQuXG4nLAorICdleHBybGlzdHMnOiAnXG4nCisgICAgICAgICAgICAgICdFeHByZXNzaW9uIGxpc3RzXG4nCisgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyAgIGV4cHJlc3Npb25fbGlzdCAgICA6Oj0gZXhwcmVzc2lvbiAoICIsIiBleHByZXNzaW9uICkqIFsiLCJdXG4nCisgICAgICAgICAgICAgICcgICBzdGFycmVkX2xpc3QgICAgICAgOjo9IHN0YXJyZWRfaXRlbSAoICIsIiBzdGFycmVkX2l0ZW0gKSogJworICAgICAgICAgICAgICAnWyIsIl1cbicKKyAgICAgICAgICAgICAgJyAgIHN0YXJyZWRfZXhwcmVzc2lvbiA6Oj0gZXhwcmVzc2lvbiB8ICggc3RhcnJlZF9pdGVtICIsIiApKiAnCisgICAgICAgICAgICAgICdbc3RhcnJlZF9pdGVtXVxuJworICAgICAgICAgICAgICAnICAgc3RhcnJlZF9pdGVtICAgICAgIDo6PSBleHByZXNzaW9uIHwgIioiIG9yX2V4cHJcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnRXhjZXB0IHdoZW4gcGFydCBvZiBhIGxpc3Qgb3Igc2V0IGRpc3BsYXksIGFuIGV4cHJlc3Npb24gbGlzdFxuJworICAgICAgICAgICAgICAnY29udGFpbmluZyBhdCBsZWFzdCBvbmUgY29tbWEgeWllbGRzIGEgdHVwbGUuICBUaGUgbGVuZ3RoIG9mICcKKyAgICAgICAgICAgICAgJ3RoZSB0dXBsZVxuJworICAgICAgICAgICAgICAnaXMgdGhlIG51bWJlciBvZiBleHByZXNzaW9ucyBpbiB0aGUgbGlzdC4gIFRoZSBleHByZXNzaW9ucyBhcmVcbicKKyAgICAgICAgICAgICAgJ2V2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0FuIGFzdGVyaXNrICIqIiBkZW5vdGVzICppdGVyYWJsZSB1bnBhY2tpbmcqLiAgSXRzIG9wZXJhbmQgbXVzdCAnCisgICAgICAgICAgICAgICdiZSBhblxuJworICAgICAgICAgICAgICAnKml0ZXJhYmxlKi4gIFRoZSBpdGVyYWJsZSBpcyBleHBhbmRlZCBpbnRvIGEgc2VxdWVuY2Ugb2YgaXRlbXMsICcKKyAgICAgICAgICAgICAgJ3doaWNoXG4nCisgICAgICAgICAgICAgICdhcmUgaW5jbHVkZWQgaW4gdGhlIG5ldyB0dXBsZSwgbGlzdCwgb3Igc2V0LCBhdCB0aGUgc2l0ZSBvZiAnCisgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgJ3VucGFja2luZy5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy41OiBJdGVyYWJsZSB1bnBhY2tpbmcgaW4gZXhwcmVzc2lvbiBsaXN0cywgJworICAgICAgICAgICAgICAnb3JpZ2luYWxseVxuJworICAgICAgICAgICAgICAncHJvcG9zZWQgYnkgKipQRVAgNDQ4KiouXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSB0cmFpbGluZyBjb21tYSBpcyByZXF1aXJlZCBvbmx5IHRvIGNyZWF0ZSBhIHNpbmdsZSB0dXBsZSAnCisgICAgICAgICAgICAgICcoYS5rLmEuIGFcbicKKyAgICAgICAgICAgICAgJypzaW5nbGV0b24qKTsgaXQgaXMgb3B0aW9uYWwgaW4gYWxsIG90aGVyIGNhc2VzLiAgQSBzaW5nbGUgJworICAgICAgICAgICAgICAnZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICAid2l0aG91dCBhIHRyYWlsaW5nIGNvbW1hIGRvZXNuJ3QgY3JlYXRlIGEgdHVwbGUsIGJ1dCByYXRoZXIgIgorICAgICAgICAgICAgICAneWllbGRzIHRoZVxuJworICAgICAgICAgICAgICAndmFsdWUgb2YgdGhhdCBleHByZXNzaW9uLiAoVG8gY3JlYXRlIGFuIGVtcHR5IHR1cGxlLCB1c2UgYW4gJworICAgICAgICAgICAgICAnZW1wdHkgcGFpclxuJworICAgICAgICAgICAgICAnb2YgcGFyZW50aGVzZXM6ICIoKSIuKVxuJywKKyAnZmxvYXRpbmcnOiAnXG4nCisgICAgICAgICAgICAgJ0Zsb2F0aW5nIHBvaW50IGxpdGVyYWxzXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdGbG9hdGluZyBwb2ludCBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbFxuJworICAgICAgICAgICAgICdkZWZpbml0aW9uczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGZsb2F0bnVtYmVyICAgOjo9IHBvaW50ZmxvYXQgfCBleHBvbmVudGZsb2F0XG4nCisgICAgICAgICAgICAgJyAgIHBvaW50ZmxvYXQgICAgOjo9IFtpbnRwYXJ0XSBmcmFjdGlvbiB8IGludHBhcnQgIi4iXG4nCisgICAgICAgICAgICAgJyAgIGV4cG9uZW50ZmxvYXQgOjo9IChpbnRwYXJ0IHwgcG9pbnRmbG9hdCkgZXhwb25lbnRcbicKKyAgICAgICAgICAgICAnICAgaW50cGFydCAgICAgICA6Oj0gZGlnaXQrXG4nCisgICAgICAgICAgICAgJyAgIGZyYWN0aW9uICAgICAgOjo9ICIuIiBkaWdpdCtcbicKKyAgICAgICAgICAgICAnICAgZXhwb25lbnQgICAgICA6Oj0gKCJlIiB8ICJFIikgWyIrIiB8ICItIl0gZGlnaXQrXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlIHRoYXQgdGhlIGludGVnZXIgYW5kIGV4cG9uZW50IHBhcnRzIGFyZSBhbHdheXMgaW50ZXJwcmV0ZWQgJworICAgICAgICAgICAgICd1c2luZ1xuJworICAgICAgICAgICAgICdyYWRpeCAxMC4gRm9yIGV4YW1wbGUsICIwNzdlMDEwIiBpcyBsZWdhbCwgYW5kIGRlbm90ZXMgdGhlIHNhbWUgJworICAgICAgICAgICAgICdudW1iZXJcbicKKyAgICAgICAgICAgICAnYXMgIjc3ZTEwIi4gVGhlIGFsbG93ZWQgcmFuZ2Ugb2YgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgaXNcbicKKyAgICAgICAgICAgICAnaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiBTb21lIGV4YW1wbGVzIG9mIGZsb2F0aW5nIHBvaW50ICcKKyAgICAgICAgICAgICAnbGl0ZXJhbHM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAzLjE0ICAgIDEwLiAgICAuMDAxICAgIDFlMTAwICAgIDMuMTRlLTEwICAgIDBlMFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlICcKKyAgICAgICAgICAgICAnIi0xIlxuJworICAgICAgICAgICAgICdpcyBhY3R1YWxseSBhbiBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHRoZSB1bmFyeSBvcGVyYXRvciAiLSIgYW5kICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2xpdGVyYWwgIjEiLlxuJywKKyAnZm9yJzogJ1xuJworICAgICAgICAnVGhlICJmb3IiIHN0YXRlbWVudFxuJworICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAnXG4nCisgICAgICAgICdUaGUgImZvciIgc3RhdGVtZW50IGlzIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBvZiBhICcKKyAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICcoc3VjaCBhcyBhIHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3Igb3RoZXIgaXRlcmFibGUgb2JqZWN0OlxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICBmb3Jfc3RtdCA6Oj0gImZvciIgdGFyZ2V0X2xpc3QgImluIiBleHByZXNzaW9uX2xpc3QgIjoiIHN1aXRlXG4nCisgICAgICAgICcgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSBleHByZXNzaW9uIGxpc3QgaXMgZXZhbHVhdGVkIG9uY2U7IGl0IHNob3VsZCB5aWVsZCBhbiBpdGVyYWJsZVxuJworICAgICAgICAnb2JqZWN0LiAgQW4gaXRlcmF0b3IgaXMgY3JlYXRlZCBmb3IgdGhlIHJlc3VsdCBvZiB0aGVcbicKKyAgICAgICAgJyJleHByZXNzaW9uX2xpc3QiLiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaCBpdGVtXG4nCisgICAgICAgICdwcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IuICAnCisgICAgICAgICdFYWNoXG4nCisgICAgICAgICdpdGVtIGluIHR1cm4gaXMgYXNzaWduZWQgdG8gdGhlIHRhcmdldCBsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlc1xuJworICAgICAgICAnZm9yIGFzc2lnbm1lbnRzIChzZWUgQXNzaWdubWVudCBzdGF0ZW1lbnRzKSwgYW5kIHRoZW4gdGhlIHN1aXRlIGlzXG4nCisgICAgICAgICdleGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZSBleGhhdXN0ZWQgKHdoaWNoIGlzIGltbWVkaWF0ZWx5IHdoZW4gJworICAgICAgICAndGhlXG4nCisgICAgICAgICdzZXF1ZW5jZSBpcyBlbXB0eSBvciBhbiBpdGVyYXRvciByYWlzZXMgYSAiU3RvcEl0ZXJhdGlvbiIgJworICAgICAgICAnZXhjZXB0aW9uKSxcbicKKyAgICAgICAgJ3RoZSBzdWl0ZSBpbiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgJworICAgICAgICAnbG9vcFxuJworICAgICAgICAndGVybWluYXRlcy5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxuJworICAgICAgICAnd2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2VcJ3Mgc3VpdGUuICBBICJjb250aW51ZSIgJworICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICdleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCAnCisgICAgICAgICdjb250aW51ZXNcbicKKyAgICAgICAgJ3dpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgImVsc2UiIGNsYXVzZSBpZiB0aGVyZSBpcyBubyBuZXh0XG4nCisgICAgICAgICdpdGVtLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdUaGUgZm9yLWxvb3AgbWFrZXMgYXNzaWdubWVudHMgdG8gdGhlIHZhcmlhYmxlcyhzKSBpbiB0aGUgdGFyZ2V0ICcKKyAgICAgICAgJ2xpc3QuXG4nCisgICAgICAgICdUaGlzIG92ZXJ3cml0ZXMgYWxsIHByZXZpb3VzIGFzc2lnbm1lbnRzIHRvIHRob3NlIHZhcmlhYmxlcyAnCisgICAgICAgICdpbmNsdWRpbmdcbicKKyAgICAgICAgJ3Rob3NlIG1hZGUgaW4gdGhlIHN1aXRlIG9mIHRoZSBmb3ItbG9vcDpcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgZm9yIGkgaW4gcmFuZ2UoMTApOlxuJworICAgICAgICAnICAgICAgIHByaW50KGkpXG4nCisgICAgICAgICcgICAgICAgaSA9IDUgICAgICAgICAgICAgIyB0aGlzIHdpbGwgbm90IGFmZmVjdCB0aGUgZm9yLWxvb3BcbicKKyAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlICcKKyAgICAgICAgJ25leHRcbicKKyAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4IGluIHRoZSByYW5nZVxuJworICAgICAgICAnXG4nCisgICAgICAgICdOYW1lcyBpbiB0aGUgdGFyZ2V0IGxpc3QgYXJlIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsXG4nCisgICAgICAgICdidXQgaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBhc3NpZ25lZCB0byBhdFxuJworICAgICAgICAnYWxsIGJ5IHRoZSBsb29wLiAgSGludDogdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJyYW5nZSgpIiByZXR1cm5zIGFuXG4nCisgICAgICAgICdpdGVyYXRvciBvZiBpbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsXCdzICJmb3IgJworICAgICAgICAnaVxuJworICAgICAgICAnOj0gYSB0byBiIGRvIjsgZS5nLiwgImxpc3QocmFuZ2UoMykpIiByZXR1cm5zIHRoZSBsaXN0ICJbMCwgMSwgMl0iLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdOb3RlOiBUaGVyZSBpcyBhIHN1YnRsZXR5IHdoZW4gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZVxuJworICAgICAgICAnICBsb29wICh0aGlzIGNhbiBvbmx5IG9jY3VyIGZvciBtdXRhYmxlIHNlcXVlbmNlcywgaS5lLiBsaXN0cykuICBBblxuJworICAgICAgICAnICBpbnRlcm5hbCBjb3VudGVyIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBpdGVtIGlzIHVzZWQgbmV4dCxcbicKKyAgICAgICAgJyAgYW5kIHRoaXMgaXMgaW5jcmVtZW50ZWQgb24gZWFjaCBpdGVyYXRpb24uICBXaGVuIHRoaXMgY291bnRlciBoYXNcbicKKyAgICAgICAgJyAgcmVhY2hlZCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSB0aGUgbG9vcCB0ZXJtaW5hdGVzLiAgVGhpcyAnCisgICAgICAgICdtZWFuc1xuJworICAgICAgICAnICB0aGF0IGlmIHRoZSBzdWl0ZSBkZWxldGVzIHRoZSBjdXJyZW50IChvciBhIHByZXZpb3VzKSBpdGVtIGZyb20gJworICAgICAgICAndGhlXG4nCisgICAgICAgICcgIHNlcXVlbmNlLCB0aGUgbmV4dCBpdGVtIHdpbGwgYmUgc2tpcHBlZCAoc2luY2UgaXQgZ2V0cyB0aGUgaW5kZXggJworICAgICAgICAnb2ZcbicKKyAgICAgICAgJyAgdGhlIGN1cnJlbnQgaXRlbSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHRyZWF0ZWQpLiAgTGlrZXdpc2UsIGlmICcKKyAgICAgICAgJ3RoZVxuJworICAgICAgICAnICBzdWl0ZSBpbnNlcnRzIGFuIGl0ZW0gaW4gdGhlIHNlcXVlbmNlIGJlZm9yZSB0aGUgY3VycmVudCBpdGVtLCB0aGVcbicKKyAgICAgICAgJyAgY3VycmVudCBpdGVtIHdpbGwgYmUgdHJlYXRlZCBhZ2FpbiB0aGUgbmV4dCB0aW1lIHRocm91Z2ggdGhlIGxvb3AuXG4nCisgICAgICAgICcgIFRoaXMgY2FuIGxlYWQgdG8gbmFzdHkgYnVncyB0aGF0IGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyBhXG4nCisgICAgICAgICcgIHRlbXBvcmFyeSBjb3B5IHVzaW5nIGEgc2xpY2Ugb2YgdGhlIHdob2xlIHNlcXVlbmNlLCBlLmcuLFxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICAgIGZvciB4IGluIGFbOl06XG4nCisgICAgICAgICcgICAgICAgICBpZiB4IDwgMDogYS5yZW1vdmUoeClcbicsCisgJ2Zvcm1hdHN0cmluZ3MnOiAnXG4nCisgICAgICAgICAgICAgICAgICAnRm9ybWF0IFN0cmluZyBTeW50YXhcbicKKyAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAic3RyLmZvcm1hdCgpIiBtZXRob2QgYW5kIHRoZSAiRm9ybWF0dGVyIiBjbGFzcyBzaGFyZSAnCisgICAgICAgICAgICAgICAgICAndGhlIHNhbWVcbicKKyAgICAgICAgICAgICAgICAgICdzeW50YXggZm9yIGZvcm1hdCBzdHJpbmdzIChhbHRob3VnaCBpbiB0aGUgY2FzZSBvZiAnCisgICAgICAgICAgICAgICAgICAnIkZvcm1hdHRlciIsXG4nCisgICAgICAgICAgICAgICAgICAnc3ViY2xhc3NlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXQgc3RyaW5nIHN5bnRheCkuICBUaGUgJworICAgICAgICAgICAgICAgICAgJ3N5bnRheCBpc1xuJworICAgICAgICAgICAgICAgICAgJ3JlbGF0ZWQgdG8gdGhhdCBvZiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzLCBidXQgdGhlcmUgJworICAgICAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAgICAgJ2RpZmZlcmVuY2VzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0Zvcm1hdCBzdHJpbmdzIGNvbnRhaW4gInJlcGxhY2VtZW50IGZpZWxkcyIgc3Vycm91bmRlZCBieSAnCisgICAgICAgICAgICAgICAgICAnY3VybHkgYnJhY2VzXG4nCisgICAgICAgICAgICAgICAgICAnInt9Ii4gQW55dGhpbmcgdGhhdCBpcyBub3QgY29udGFpbmVkIGluIGJyYWNlcyBpcyAnCisgICAgICAgICAgICAgICAgICAnY29uc2lkZXJlZCBsaXRlcmFsXG4nCisgICAgICAgICAgICAgICAgICAndGV4dCwgd2hpY2ggaXMgY29waWVkIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0LiAgSWYgeW91IG5lZWQgJworICAgICAgICAgICAgICAgICAgJ3RvIGluY2x1ZGVcbicKKyAgICAgICAgICAgICAgICAgICdhIGJyYWNlIGNoYXJhY3RlciBpbiB0aGUgbGl0ZXJhbCB0ZXh0LCBpdCBjYW4gYmUgZXNjYXBlZCBieSAnCisgICAgICAgICAgICAgICAgICAnZG91Ymxpbmc6XG4nCisgICAgICAgICAgICAgICAgICAnInt7IiBhbmQgIn19Ii5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgZ3JhbW1hciBmb3IgYSByZXBsYWNlbWVudCBmaWVsZCBpcyBhcyBmb2xsb3dzOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgIHJlcGxhY2VtZW50X2ZpZWxkIDo6PSAieyIgW2ZpZWxkX25hbWVdIFsiISIgJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnNpb25dIFsiOiIgZm9ybWF0X3NwZWNdICJ9IlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIGZpZWxkX25hbWUgICAgICAgIDo6PSBhcmdfbmFtZSAoIi4iIGF0dHJpYnV0ZV9uYW1lIHwgJworICAgICAgICAgICAgICAgICAgJyJbIiBlbGVtZW50X2luZGV4ICJdIikqXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgYXJnX25hbWUgICAgICAgICAgOjo9IFtpZGVudGlmaWVyIHwgaW50ZWdlcl1cbicKKyAgICAgICAgICAgICAgICAgICcgICAgICBhdHRyaWJ1dGVfbmFtZSAgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIGVsZW1lbnRfaW5kZXggICAgIDo6PSBpbnRlZ2VyIHwgaW5kZXhfc3RyaW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgaW5kZXhfc3RyaW5nICAgICAgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgJworICAgICAgICAgICAgICAgICAgJyJdIj4gK1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgIGNvbnZlcnNpb24gICAgICAgIDo6PSAiciIgfCAicyIgfCAiYSJcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICBmb3JtYXRfc3BlYyAgICAgICA6Oj0gPGRlc2NyaWJlZCBpbiB0aGUgbmV4dCAnCisgICAgICAgICAgICAgICAgICAnc2VjdGlvbj5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJbiBsZXNzIGZvcm1hbCB0ZXJtcywgdGhlIHJlcGxhY2VtZW50IGZpZWxkIGNhbiBzdGFydCB3aXRoICcKKyAgICAgICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgICAgICAnKmZpZWxkX25hbWUqIHRoYXQgc3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgdG8gYmUgJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlZFxuJworICAgICAgICAgICAgICAgICAgJ2FuZCBpbnNlcnRlZCBpbnRvIHRoZSBvdXRwdXQgaW5zdGVhZCBvZiB0aGUgcmVwbGFjZW1lbnQgJworICAgICAgICAgICAgICAgICAgJ2ZpZWxkLiBUaGVcbicKKyAgICAgICAgICAgICAgICAgICcqZmllbGRfbmFtZSogaXMgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICAqY29udmVyc2lvbiogJworICAgICAgICAgICAgICAgICAgJ2ZpZWxkLCB3aGljaCBpc1xuJworICAgICAgICAgICAgICAgICAgJ3ByZWNlZGVkIGJ5IGFuIGV4Y2xhbWF0aW9uIHBvaW50ICJcJyFcJyIsIGFuZCBhICcKKyAgICAgICAgICAgICAgICAgICcqZm9ybWF0X3NwZWMqLCB3aGljaCBpc1xuJworICAgICAgICAgICAgICAgICAgJ3ByZWNlZGVkIGJ5IGEgY29sb24gIlwnOlwnIi4gIFRoZXNlIHNwZWNpZnkgYSBub24tZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICAnZm9ybWF0IGZvciB0aGVcbicKKyAgICAgICAgICAgICAgICAgICdyZXBsYWNlbWVudCB2YWx1ZS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdTZWUgYWxzbyB0aGUgRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSBzZWN0aW9uLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAqZmllbGRfbmFtZSogaXRzZWxmIGJlZ2lucyB3aXRoIGFuICphcmdfbmFtZSogdGhhdCBpcyAnCisgICAgICAgICAgICAgICAgICAnZWl0aGVyIGFcbicKKyAgICAgICAgICAgICAgICAgICJudW1iZXIgb3IgYSBrZXl3b3JkLiAgSWYgaXQncyBhIG51bWJlciwgaXQgcmVmZXJzIHRvIGEgIgorICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWxcbicKKyAgICAgICAgICAgICAgICAgICJhcmd1bWVudCwgYW5kIGlmIGl0J3MgYSBrZXl3b3JkLCBpdCByZWZlcnMgdG8gYSBuYW1lZCAiCisgICAgICAgICAgICAgICAgICAna2V5d29yZFxuJworICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50LiAgSWYgdGhlIG51bWVyaWNhbCBhcmdfbmFtZXMgaW4gYSBmb3JtYXQgc3RyaW5nICcKKyAgICAgICAgICAgICAgICAgICdhcmUgMCwgMSwgMixcbicKKyAgICAgICAgICAgICAgICAgICcuLi4gaW4gc2VxdWVuY2UsIHRoZXkgY2FuIGFsbCBiZSBvbWl0dGVkIChub3QganVzdCBzb21lKSAnCisgICAgICAgICAgICAgICAgICAnYW5kIHRoZVxuJworICAgICAgICAgICAgICAgICAgJ251bWJlcnMgMCwgMSwgMiwgLi4uIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbiB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICdvcmRlci5cbicKKyAgICAgICAgICAgICAgICAgICdCZWNhdXNlICphcmdfbmFtZSogaXMgbm90IHF1b3RlLWRlbGltaXRlZCwgaXQgaXMgbm90ICcKKyAgICAgICAgICAgICAgICAgICdwb3NzaWJsZSB0b1xuJworICAgICAgICAgICAgICAgICAgJ3NwZWNpZnkgYXJiaXRyYXJ5IGRpY3Rpb25hcnkga2V5cyAoZS5nLiwgdGhlIHN0cmluZ3MgJworICAgICAgICAgICAgICAgICAgJyJcJzEwXCciIG9yXG4nCisgICAgICAgICAgICAgICAgICAnIlwnOi1dXCciKSB3aXRoaW4gYSBmb3JtYXQgc3RyaW5nLiBUaGUgKmFyZ19uYW1lKiBjYW4gYmUgJworICAgICAgICAgICAgICAgICAgJ2ZvbGxvd2VkIGJ5IGFueVxuJworICAgICAgICAgICAgICAgICAgJ251bWJlciBvZiBpbmRleCBvciBhdHRyaWJ1dGUgZXhwcmVzc2lvbnMuIEFuIGV4cHJlc3Npb24gb2YgJworICAgICAgICAgICAgICAgICAgJ3RoZSBmb3JtXG4nCisgICAgICAgICAgICAgICAgICAnIlwnLm5hbWVcJyIgc2VsZWN0cyB0aGUgbmFtZWQgYXR0cmlidXRlIHVzaW5nICJnZXRhdHRyKCkiLCAnCisgICAgICAgICAgICAgICAgICAnd2hpbGUgYW5cbicKKyAgICAgICAgICAgICAgICAgICdleHByZXNzaW9uIG9mIHRoZSBmb3JtICJcJ1tpbmRleF1cJyIgZG9lcyBhbiBpbmRleCBsb29rdXAgJworICAgICAgICAgICAgICAgICAgJ3VzaW5nXG4nCisgICAgICAgICAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IHNwZWNpZmllcnMgJworICAgICAgICAgICAgICAgICAgJ2NhbiBiZVxuJworICAgICAgICAgICAgICAgICAgJ29taXR0ZWQsIHNvICJcJ3t9IHt9XCciIGlzIGVxdWl2YWxlbnQgdG8gIlwnezB9IHsxfVwnIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdTb21lIHNpbXBsZSBmb3JtYXQgc3RyaW5nIGV4YW1wbGVzOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICJGaXJzdCwgdGhvdSBzaGFsdCBjb3VudCB0byB7MH0iICAjIFJlZmVyZW5jZXMgZmlyc3QgJworICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWwgYXJndW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICcgICAiQnJpbmcgbWUgYSB7fSIgICAgICAgICAgICAgICAgICAgIyBJbXBsaWNpdGx5ICcKKyAgICAgICAgICAgICAgICAgICdyZWZlcmVuY2VzIHRoZSBmaXJzdCBwb3NpdGlvbmFsIGFyZ3VtZW50XG4nCisgICAgICAgICAgICAgICAgICAnICAgIkZyb20ge30gdG8ge30iICAgICAgICAgICAgICAgICAgICMgU2FtZSBhcyAiRnJvbSB7MH0gdG8gJworICAgICAgICAgICAgICAgICAgJ3sxfSJcbicKKyAgICAgICAgICAgICAgICAgICcgICAiTXkgcXVlc3QgaXMge25hbWV9IiAgICAgICAgICAgICAgIyBSZWZlcmVuY2VzIGtleXdvcmQgJworICAgICAgICAgICAgICAgICAgImFyZ3VtZW50ICduYW1lJ1xuIgorICAgICAgICAgICAgICAgICAgJyAgICJXZWlnaHQgaW4gdG9ucyB7MC53ZWlnaHR9IiAgICAgICAjIFwnd2VpZ2h0XCcgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgICdvZiBmaXJzdCBwb3NpdGlvbmFsIGFyZ1xuJworICAgICAgICAgICAgICAgICAgJyAgICJVbml0cyBkZXN0cm95ZWQ6IHtwbGF5ZXJzWzBdfSIgICAjIEZpcnN0IGVsZW1lbnQgb2YgJworICAgICAgICAgICAgICAgICAgImtleXdvcmQgYXJndW1lbnQgJ3BsYXllcnMnLlxuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAqY29udmVyc2lvbiogZmllbGQgY2F1c2VzIGEgdHlwZSBjb2VyY2lvbiBiZWZvcmUgJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRpbmcuXG4nCisgICAgICAgICAgICAgICAgICAnTm9ybWFsbHksIHRoZSBqb2Igb2YgZm9ybWF0dGluZyBhIHZhbHVlIGlzIGRvbmUgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgICciX19mb3JtYXRfXygpIlxuJworICAgICAgICAgICAgICAgICAgJ21ldGhvZCBvZiB0aGUgdmFsdWUgaXRzZWxmLiAgSG93ZXZlciwgaW4gc29tZSBjYXNlcyBpdCBpcyAnCisgICAgICAgICAgICAgICAgICAnZGVzaXJhYmxlIHRvXG4nCisgICAgICAgICAgICAgICAgICAnZm9yY2UgYSB0eXBlIHRvIGJlIGZvcm1hdHRlZCBhcyBhIHN0cmluZywgb3ZlcnJpZGluZyBpdHMgJworICAgICAgICAgICAgICAgICAgJ293blxuJworICAgICAgICAgICAgICAgICAgJ2RlZmluaXRpb24gb2YgZm9ybWF0dGluZy4gIEJ5IGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGEgJworICAgICAgICAgICAgICAgICAgJ3N0cmluZyBiZWZvcmVcbicKKyAgICAgICAgICAgICAgICAgICdjYWxsaW5nICJfX2Zvcm1hdF9fKCkiLCB0aGUgbm9ybWFsIGZvcm1hdHRpbmcgbG9naWMgaXMgJworICAgICAgICAgICAgICAgICAgJ2J5cGFzc2VkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RocmVlIGNvbnZlcnNpb24gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6ICJcJyFzXCciICcKKyAgICAgICAgICAgICAgICAgICd3aGljaCBjYWxsc1xuJworICAgICAgICAgICAgICAgICAgJyJzdHIoKSIgb24gdGhlIHZhbHVlLCAiXCchclwnIiB3aGljaCBjYWxscyAicmVwcigpIiBhbmQgJworICAgICAgICAgICAgICAgICAgJyJcJyFhXCciIHdoaWNoXG4nCisgICAgICAgICAgICAgICAgICAnY2FsbHMgImFzY2lpKCkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1NvbWUgZXhhbXBsZXM6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgIkhhcm9sZFwncyBhIGNsZXZlciB7MCFzfSIgICAgICAgICMgQ2FsbHMgc3RyKCkgb24gdGhlICcKKyAgICAgICAgICAgICAgICAgICdhcmd1bWVudCBmaXJzdFxuJworICAgICAgICAgICAgICAgICAgJyAgICJCcmluZyBvdXQgdGhlIGhvbHkge25hbWUhcn0iICAgICMgQ2FsbHMgcmVwcigpIG9uIHRoZSAnCisgICAgICAgICAgICAgICAgICAnYXJndW1lbnQgZmlyc3RcbicKKyAgICAgICAgICAgICAgICAgICcgICAiTW9yZSB7IWF9IiAgICAgICAgICAgICAgICAgICAgICAjIENhbGxzIGFzY2lpKCkgb24gdGhlICcKKyAgICAgICAgICAgICAgICAgICdhcmd1bWVudCBmaXJzdFxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAqZm9ybWF0X3NwZWMqIGZpZWxkIGNvbnRhaW5zIGEgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlICcKKyAgICAgICAgICAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBwcmVzZW50ZWQsIGluY2x1ZGluZyBzdWNoIGRldGFpbHMgYXMgZmllbGQgd2lkdGgsICcKKyAgICAgICAgICAgICAgICAgICdhbGlnbm1lbnQsXG4nCisgICAgICAgICAgICAgICAgICAncGFkZGluZywgZGVjaW1hbCBwcmVjaXNpb24gYW5kIHNvIG9uLiAgRWFjaCB2YWx1ZSB0eXBlIGNhbiAnCisgICAgICAgICAgICAgICAgICAnZGVmaW5lIGl0c1xuJworICAgICAgICAgICAgICAgICAgJ293biAiZm9ybWF0dGluZyBtaW5pLWxhbmd1YWdlIiBvciBpbnRlcnByZXRhdGlvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgJypmb3JtYXRfc3BlYyouXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnTW9zdCBidWlsdC1pbiB0eXBlcyBzdXBwb3J0IGEgY29tbW9uIGZvcm1hdHRpbmcgJworICAgICAgICAgICAgICAgICAgJ21pbmktbGFuZ3VhZ2UsIHdoaWNoXG4nCisgICAgICAgICAgICAgICAgICAnaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQSAqZm9ybWF0X3NwZWMqIGZpZWxkIGNhbiBhbHNvIGluY2x1ZGUgbmVzdGVkIHJlcGxhY2VtZW50ICcKKyAgICAgICAgICAgICAgICAgICdmaWVsZHNcbicKKyAgICAgICAgICAgICAgICAgICd3aXRoaW4gaXQuIFRoZXNlIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHMgbWF5IGNvbnRhaW4gYSAnCisgICAgICAgICAgICAgICAgICAnZmllbGQgbmFtZSxcbicKKyAgICAgICAgICAgICAgICAgICdjb252ZXJzaW9uIGZsYWcgYW5kIGZvcm1hdCBzcGVjaWZpY2F0aW9uLCBidXQgZGVlcGVyICcKKyAgICAgICAgICAgICAgICAgICduZXN0aW5nIGlzIG5vdFxuJworICAgICAgICAgICAgICAgICAgJ2FsbG93ZWQuICBUaGUgcmVwbGFjZW1lbnQgZmllbGRzIHdpdGhpbiB0aGUgZm9ybWF0X3NwZWMgJworICAgICAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAgICAgJ3N1YnN0aXR1dGVkIGJlZm9yZSB0aGUgKmZvcm1hdF9zcGVjKiBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQuICcKKyAgICAgICAgICAgICAgICAgICdUaGlzXG4nCisgICAgICAgICAgICAgICAgICAnYWxsb3dzIHRoZSBmb3JtYXR0aW5nIG9mIGEgdmFsdWUgdG8gYmUgZHluYW1pY2FsbHkgJworICAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdTZWUgdGhlIEZvcm1hdCBleGFtcGxlcyBzZWN0aW9uIGZvciBzb21lIGV4YW1wbGVzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0Zvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2VcbicKKyAgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnIkZvcm1hdCBzcGVjaWZpY2F0aW9ucyIgYXJlIHVzZWQgd2l0aGluIHJlcGxhY2VtZW50IGZpZWxkcyAnCisgICAgICAgICAgICAgICAgICAnY29udGFpbmVkXG4nCisgICAgICAgICAgICAgICAgICAnd2l0aGluIGEgZm9ybWF0IHN0cmluZyB0byBkZWZpbmUgaG93IGluZGl2aWR1YWwgdmFsdWVzIGFyZSAnCisgICAgICAgICAgICAgICAgICAncHJlc2VudGVkXG4nCisgICAgICAgICAgICAgICAgICAnKHNlZSBGb3JtYXQgU3RyaW5nIFN5bnRheCBhbmQgRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscykuICcKKyAgICAgICAgICAgICAgICAgICdUaGV5IGNhblxuJworICAgICAgICAgICAgICAgICAgJ2Fsc28gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBidWlsdC1pbiAiZm9ybWF0KCkiICcKKyAgICAgICAgICAgICAgICAgICdmdW5jdGlvbi4gIEVhY2hcbicKKyAgICAgICAgICAgICAgICAgICdmb3JtYXR0YWJsZSB0eXBlIG1heSBkZWZpbmUgaG93IHRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyAnCisgICAgICAgICAgICAgICAgICAndG8gYmVcbicKKyAgICAgICAgICAgICAgICAgICdpbnRlcnByZXRlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdNb3N0IGJ1aWx0LWluIHR5cGVzIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgZm9yICcKKyAgICAgICAgICAgICAgICAgICdmb3JtYXRcbicKKyAgICAgICAgICAgICAgICAgICdzcGVjaWZpY2F0aW9ucywgYWx0aG91Z2ggc29tZSBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGFyZSAnCisgICAgICAgICAgICAgICAgICAnb25seVxuJworICAgICAgICAgICAgICAgICAgJ3N1cHBvcnRlZCBieSB0aGUgbnVtZXJpYyB0eXBlcy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdBIGdlbmVyYWwgY29udmVudGlvbiBpcyB0aGF0IGFuIGVtcHR5IGZvcm1hdCBzdHJpbmcgKCIiIiIpICcKKyAgICAgICAgICAgICAgICAgICdwcm9kdWNlc1xuJworICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIHJlc3VsdCBhcyBpZiB5b3UgaGFkIGNhbGxlZCAic3RyKCkiIG9uIHRoZSB2YWx1ZS4gJworICAgICAgICAgICAgICAgICAgJ0Egbm9uLWVtcHR5XG4nCisgICAgICAgICAgICAgICAgICAnZm9ybWF0IHN0cmluZyB0eXBpY2FsbHkgbW9kaWZpZXMgdGhlIHJlc3VsdC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgZ2VuZXJhbCBmb3JtIG9mIGEgKnN0YW5kYXJkIGZvcm1hdCBzcGVjaWZpZXIqIGlzOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIGZvcm1hdF9zcGVjIDo6PSAnCisgICAgICAgICAgICAgICAgICAnW1tmaWxsXWFsaWduXVtzaWduXVsjXVswXVt3aWR0aF1bLF1bLnByZWNpc2lvbl1bdHlwZV1cbicKKyAgICAgICAgICAgICAgICAgICcgICBmaWxsICAgICAgICA6Oj0gPGFueSBjaGFyYWN0ZXI+XG4nCisgICAgICAgICAgICAgICAgICAnICAgYWxpZ24gICAgICAgOjo9ICI8IiB8ICI+IiB8ICI9IiB8ICJeIlxuJworICAgICAgICAgICAgICAgICAgJyAgIHNpZ24gICAgICAgIDo6PSAiKyIgfCAiLSIgfCAiICJcbicKKyAgICAgICAgICAgICAgICAgICcgICB3aWR0aCAgICAgICA6Oj0gaW50ZWdlclxuJworICAgICAgICAgICAgICAgICAgJyAgIHByZWNpc2lvbiAgIDo6PSBpbnRlZ2VyXG4nCisgICAgICAgICAgICAgICAgICAnICAgdHlwZSAgICAgICAgOjo9ICJiIiB8ICJjIiB8ICJkIiB8ICJlIiB8ICJFIiB8ICJmIiB8ICJGIiAnCisgICAgICAgICAgICAgICAgICAnfCAiZyIgfCAiRyIgfCAibiIgfCAibyIgfCAicyIgfCAieCIgfCAiWCIgfCAiJSJcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJZiBhIHZhbGlkICphbGlnbiogdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCBjYW4gYmUgcHJlY2VkZWQgJworICAgICAgICAgICAgICAgICAgJ2J5IGEgKmZpbGwqXG4nCisgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyIHRoYXQgY2FuIGJlIGFueSBjaGFyYWN0ZXIgYW5kIGRlZmF1bHRzIHRvIGEgc3BhY2UgJworICAgICAgICAgICAgICAgICAgJ2lmXG4nCisgICAgICAgICAgICAgICAgICAnb21pdHRlZC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBhIGxpdGVyYWwgY3VybHkgYnJhY2UgJworICAgICAgICAgICAgICAgICAgJygiInsiIiBvclxuJworICAgICAgICAgICAgICAgICAgJyIifSIiKSBhcyB0aGUgKmZpbGwqIGNoYXJhY3RlciBpbiBhIGZvcm1hdHRlZCBzdHJpbmcgJworICAgICAgICAgICAgICAgICAgJ2xpdGVyYWwgb3Igd2hlblxuJworICAgICAgICAgICAgICAgICAgJ3VzaW5nIHRoZSAic3RyLmZvcm1hdCgpIiBtZXRob2QuICBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSAnCisgICAgICAgICAgICAgICAgICAndG8gaW5zZXJ0IGFcbicKKyAgICAgICAgICAgICAgICAgICdjdXJseSBicmFjZSB3aXRoIGEgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICAibGltaXRhdGlvbiBkb2Vzbid0XG4iCisgICAgICAgICAgICAgICAgICAnYWZmZWN0IHRoZSAiZm9ybWF0KCkiIGZ1bmN0aW9uLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGFsaWdubWVudCBvcHRpb25zIGlzIGFzICcKKyAgICAgICAgICAgICAgICAgICdmb2xsb3dzOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgT3B0aW9uICAgIHwgJworICAgICAgICAgICAgICAgICAgJ01lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJzxcJyIgICAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSBsZWZ0LWFsaWduZWQgJworICAgICAgICAgICAgICAgICAgJ3dpdGhpbiB0aGUgYXZhaWxhYmxlICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgc3BhY2UgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIG1vc3QgJworICAgICAgICAgICAgICAgICAgJ29iamVjdHMpLiAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnPlwnIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIHJpZ2h0LWFsaWduZWQgJworICAgICAgICAgICAgICAgICAgJ3dpdGhpbiB0aGUgYXZhaWxhYmxlICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgJworICAgICAgICAgICAgICAgICAgJ251bWJlcnMpLiAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCc9XCciICAgICB8IEZvcmNlcyB0aGUgcGFkZGluZyB0byBiZSBwbGFjZWQgYWZ0ZXIgJworICAgICAgICAgICAgICAgICAgJ3RoZSBzaWduIChpZiBhbnkpICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGJ1dCBiZWZvcmUgdGhlIGRpZ2l0cy4gIFRoaXMgaXMgdXNlZCBmb3IgJworICAgICAgICAgICAgICAgICAgJ3ByaW50aW5nIGZpZWxkcyAgIHxcbicKKyAgICAgICAgICAgICAgICAgICIgICB8ICAgICAgICAgICB8IGluIHRoZSBmb3JtICcrMDAwMDAwMTIwJy4gVGhpcyBhbGlnbm1lbnQgIgorICAgICAgICAgICAgICAgICAgJ29wdGlvbiBpcyBvbmx5ICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHZhbGlkIGZvciBudW1lcmljIHR5cGVzLiAgSXQgYmVjb21lcyB0aGUgJworICAgICAgICAgICAgICAgICAgImRlZmF1bHQgd2hlbiAnMCcgIHxcbiIKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGltbWVkaWF0ZWx5IHByZWNlZGVzIHRoZSBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAnd2lkdGguICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ15cJyIgICAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSBjZW50ZXJlZCB3aXRoaW4gJworICAgICAgICAgICAgICAgICAgJ3RoZSBhdmFpbGFibGUgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgJ3NwYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdOb3RlIHRoYXQgdW5sZXNzIGEgbWluaW11bSBmaWVsZCB3aWR0aCBpcyBkZWZpbmVkLCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2ZpZWxkIHdpZHRoXG4nCisgICAgICAgICAgICAgICAgICAnd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZGF0YSB0byBmaWxsIGl0LCBzbyAnCisgICAgICAgICAgICAgICAgICAndGhhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICdhbGlnbm1lbnQgb3B0aW9uIGhhcyBubyBtZWFuaW5nIGluIHRoaXMgY2FzZS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgKnNpZ24qIG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBudW1iZXIgdHlwZXMsIGFuZCBjYW4gJworICAgICAgICAgICAgICAgICAgJ2JlIG9uZSBvZlxuJworICAgICAgICAgICAgICAgICAgJ3RoZSBmb2xsb3dpbmc6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCBPcHRpb24gICAgfCAnCisgICAgICAgICAgICAgICAgICAnTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnK1wnIiAgICAgfCBpbmRpY2F0ZXMgdGhhdCBhIHNpZ24gc2hvdWxkIGJlIHVzZWQgZm9yICcKKyAgICAgICAgICAgICAgICAgICdib3RoIHBvc2l0aXZlIGFzICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCB3ZWxsIGFzIG5lZ2F0aXZlICcKKyAgICAgICAgICAgICAgICAgICdudW1iZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCctXCciICAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCAnCisgICAgICAgICAgICAgICAgICAnb25seSBmb3IgbmVnYXRpdmUgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IG51bWJlcnMgKHRoaXMgaXMgdGhlIGRlZmF1bHQgJworICAgICAgICAgICAgICAgICAgJ2JlaGF2aW9yKS4gICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IHNwYWNlICAgICB8IGluZGljYXRlcyB0aGF0IGEgbGVhZGluZyBzcGFjZSBzaG91bGQgYmUgJworICAgICAgICAgICAgICAgICAgJ3VzZWQgb24gcG9zaXRpdmUgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IG51bWJlcnMsIGFuZCBhIG1pbnVzIHNpZ24gb24gbmVnYXRpdmUgJworICAgICAgICAgICAgICAgICAgJ251bWJlcnMuICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgIlwnI1wnIiBvcHRpb24gY2F1c2VzIHRoZSAiYWx0ZXJuYXRlIGZvcm0iIHRvIGJlIHVzZWQgJworICAgICAgICAgICAgICAgICAgJ2ZvciB0aGVcbicKKyAgICAgICAgICAgICAgICAgICdjb252ZXJzaW9uLiAgVGhlIGFsdGVybmF0ZSBmb3JtIGlzIGRlZmluZWQgZGlmZmVyZW50bHkgZm9yICcKKyAgICAgICAgICAgICAgICAgICdkaWZmZXJlbnRcbicKKyAgICAgICAgICAgICAgICAgICd0eXBlcy4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIGludGVnZXIsIGZsb2F0LCAnCisgICAgICAgICAgICAgICAgICAnY29tcGxleCBhbmRcbicKKyAgICAgICAgICAgICAgICAgICdEZWNpbWFsIHR5cGVzLiBGb3IgaW50ZWdlcnMsIHdoZW4gYmluYXJ5LCBvY3RhbCwgb3IgJworICAgICAgICAgICAgICAgICAgJ2hleGFkZWNpbWFsIG91dHB1dFxuJworICAgICAgICAgICAgICAgICAgJ2lzIHVzZWQsIHRoaXMgb3B0aW9uIGFkZHMgdGhlIHByZWZpeCByZXNwZWN0aXZlICJcJzBiXCciLCAnCisgICAgICAgICAgICAgICAgICAnIlwnMG9cJyIsIG9yXG4nCisgICAgICAgICAgICAgICAgICAnIlwnMHhcJyIgdG8gdGhlIG91dHB1dCB2YWx1ZS4gRm9yIGZsb2F0cywgY29tcGxleCBhbmQgJworICAgICAgICAgICAgICAgICAgJ0RlY2ltYWwgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnYWx0ZXJuYXRlIGZvcm0gY2F1c2VzIHRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24gdG8gJworICAgICAgICAgICAgICAgICAgJ2Fsd2F5cyBjb250YWluIGFcbicKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsLXBvaW50IGNoYXJhY3RlciwgZXZlbiBpZiBubyBkaWdpdHMgZm9sbG93IGl0LiAnCisgICAgICAgICAgICAgICAgICAnTm9ybWFsbHksIGFcbicKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsLXBvaW50IGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSByZXN1bHQgb2YgdGhlc2UgJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnNpb25zXG4nCisgICAgICAgICAgICAgICAgICAnb25seSBpZiBhIGRpZ2l0IGZvbGxvd3MgaXQuIEluIGFkZGl0aW9uLCBmb3IgIlwnZ1wnIiBhbmQgJworICAgICAgICAgICAgICAgICAgJyJcJ0dcJyJcbicKKyAgICAgICAgICAgICAgICAgICdjb252ZXJzaW9ucywgdHJhaWxpbmcgemVyb3MgYXJlIG5vdCByZW1vdmVkIGZyb20gdGhlICcKKyAgICAgICAgICAgICAgICAgICdyZXN1bHQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlICJcJyxcJyIgb3B0aW9uIHNpZ25hbHMgdGhlIHVzZSBvZiBhIGNvbW1hIGZvciBhICcKKyAgICAgICAgICAgICAgICAgICd0aG91c2FuZHMgc2VwYXJhdG9yLlxuJworICAgICAgICAgICAgICAgICAgJ0ZvciBhIGxvY2FsZSBhd2FyZSBzZXBhcmF0b3IsIHVzZSB0aGUgIlwnblwnIiBpbnRlZ2VyICcKKyAgICAgICAgICAgICAgICAgICdwcmVzZW50YXRpb24gdHlwZVxuJworICAgICAgICAgICAgICAgICAgJ2luc3RlYWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogQWRkZWQgdGhlICJcJyxcJyIgb3B0aW9uIChzZWUgYWxzbyAnCisgICAgICAgICAgICAgICAgICAnKipQRVAgMzc4KiopLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyp3aWR0aCogaXMgYSBkZWNpbWFsIGludGVnZXIgZGVmaW5pbmcgdGhlIG1pbmltdW0gZmllbGQgJworICAgICAgICAgICAgICAgICAgJ3dpZHRoLiAgSWYgbm90XG4nCisgICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkLCB0aGVuIHRoZSBmaWVsZCB3aWR0aCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgICdjb250ZW50LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1doZW4gbm8gZXhwbGljaXQgYWxpZ25tZW50IGlzIGdpdmVuLCBwcmVjZWRpbmcgdGhlICp3aWR0aCogJworICAgICAgICAgICAgICAgICAgJ2ZpZWxkIGJ5IGFcbicKKyAgICAgICAgICAgICAgICAgICd6ZXJvICgiXCcwXCciKSBjaGFyYWN0ZXIgZW5hYmxlcyBzaWduLWF3YXJlIHplcm8tcGFkZGluZyAnCisgICAgICAgICAgICAgICAgICAnZm9yIG51bWVyaWNcbicKKyAgICAgICAgICAgICAgICAgICd0eXBlcy4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhICpmaWxsKiBjaGFyYWN0ZXIgb2YgIlwnMFwnIiAnCisgICAgICAgICAgICAgICAgICAnd2l0aCBhblxuJworICAgICAgICAgICAgICAgICAgJyphbGlnbm1lbnQqIHR5cGUgb2YgIlwnPVwnIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgKnByZWNpc2lvbiogaXMgYSBkZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIGhvdyBtYW55ICcKKyAgICAgICAgICAgICAgICAgICdkaWdpdHMgc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICAnYmUgZGlzcGxheWVkIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGZvciBhIGZsb2F0aW5nIHBvaW50ICcKKyAgICAgICAgICAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlZCB3aXRoICJcJ2ZcJyIgYW5kICJcJ0ZcJyIsIG9yIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlICcKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsIHBvaW50XG4nCisgICAgICAgICAgICAgICAgICAnZm9yIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgZm9ybWF0dGVkIHdpdGggIlwnZ1wnIiBvciAnCisgICAgICAgICAgICAgICAgICAnIlwnR1wnIi4gIEZvciBub24tXG4nCisgICAgICAgICAgICAgICAgICAnbnVtYmVyIHR5cGVzIHRoZSBmaWVsZCBpbmRpY2F0ZXMgdGhlIG1heGltdW0gZmllbGQgc2l6ZSAtICcKKyAgICAgICAgICAgICAgICAgICdpbiBvdGhlclxuJworICAgICAgICAgICAgICAgICAgJ3dvcmRzLCBob3cgbWFueSBjaGFyYWN0ZXJzIHdpbGwgYmUgdXNlZCBmcm9tIHRoZSBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAnY29udGVudC4gVGhlXG4nCisgICAgICAgICAgICAgICAgICAnKnByZWNpc2lvbiogaXMgbm90IGFsbG93ZWQgZm9yIGludGVnZXIgdmFsdWVzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0ZpbmFsbHksIHRoZSAqdHlwZSogZGV0ZXJtaW5lcyBob3cgdGhlIGRhdGEgc2hvdWxkIGJlICcKKyAgICAgICAgICAgICAgICAgICdwcmVzZW50ZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlIGF2YWlsYWJsZSBzdHJpbmcgcHJlc2VudGF0aW9uIHR5cGVzIGFyZTpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IFR5cGUgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICdNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdzXCciICAgICB8IFN0cmluZyBmb3JtYXQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdHlwZSAnCisgICAgICAgICAgICAgICAgICAnZm9yIHN0cmluZ3MgYW5kICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IG1heSBiZSAnCisgICAgICAgICAgICAgICAgICAnb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzICcKKyAgICAgICAgICAgICAgICAgICciXCdzXCciLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBhdmFpbGFibGUgaW50ZWdlciBwcmVzZW50YXRpb24gdHlwZXMgYXJlOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgVHlwZSAgICAgIHwgJworICAgICAgICAgICAgICAgICAgJ01lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ2JcJyIgICAgIHwgQmluYXJ5IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluICcKKyAgICAgICAgICAgICAgICAgICdiYXNlIDIuICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnY1wnIiAgICAgfCBDaGFyYWN0ZXIuIENvbnZlcnRzIHRoZSBpbnRlZ2VyIHRvIHRoZSAnCisgICAgICAgICAgICAgICAgICAnY29ycmVzcG9uZGluZyAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCB1bmljb2RlIGNoYXJhY3RlciBiZWZvcmUgJworICAgICAgICAgICAgICAgICAgJ3ByaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdkXCciICAgICB8IERlY2ltYWwgSW50ZWdlci4gT3V0cHV0cyB0aGUgbnVtYmVyIGluICcKKyAgICAgICAgICAgICAgICAgICdiYXNlIDEwLiAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ29cJyIgICAgIHwgT2N0YWwgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAnCisgICAgICAgICAgICAgICAgICAnOC4gICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwneFwnIiAgICAgfCBIZXggZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAnCisgICAgICAgICAgICAgICAgICAnMTYsIHVzaW5nIGxvd2VyLSAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBjYXNlIGxldHRlcnMgZm9yIHRoZSBkaWdpdHMgYWJvdmUgJworICAgICAgICAgICAgICAgICAgJzkuICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdYXCciICAgICB8IEhleCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlICcKKyAgICAgICAgICAgICAgICAgICcxNiwgdXNpbmcgdXBwZXItICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSAnCisgICAgICAgICAgICAgICAgICAnOS4gICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ25cJyIgICAgIHwgTnVtYmVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzICJcJ2RcJyIsICcKKyAgICAgICAgICAgICAgICAgICdleGNlcHQgdGhhdCBpdCB1c2VzIHRoZSB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlIG51bWJlciAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBzZXBhcmF0b3IgJworICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyAnCisgICAgICAgICAgICAgICAgICAnIlwnZFwnIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgcHJlc2VudGF0aW9uIHR5cGVzLCBpbnRlZ2VycyBjYW4gJworICAgICAgICAgICAgICAgICAgJ2JlIGZvcm1hdHRlZFxuJworICAgICAgICAgICAgICAgICAgJ3dpdGggdGhlIGZsb2F0aW5nIHBvaW50IHByZXNlbnRhdGlvbiB0eXBlcyBsaXN0ZWQgYmVsb3cgJworICAgICAgICAgICAgICAgICAgJyhleGNlcHQgIlwnblwnIlxuJworICAgICAgICAgICAgICAgICAgJ2FuZCBOb25lKS4gV2hlbiBkb2luZyBzbywgImZsb2F0KCkiIGlzIHVzZWQgdG8gY29udmVydCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2ludGVnZXIgdG9cbicKKyAgICAgICAgICAgICAgICAgICdhIGZsb2F0aW5nIHBvaW50IG51bWJlciBiZWZvcmUgZm9ybWF0dGluZy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgYXZhaWxhYmxlIHByZXNlbnRhdGlvbiB0eXBlcyBmb3IgZmxvYXRpbmcgcG9pbnQgYW5kICcKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsIHZhbHVlc1xuJworICAgICAgICAgICAgICAgICAgJ2FyZTpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IFR5cGUgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICdNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdlXCciICAgICB8IEV4cG9uZW50IG5vdGF0aW9uLiBQcmludHMgdGhlIG51bWJlciBpbiAnCisgICAgICAgICAgICAgICAgICAnc2NpZW50aWZpYyAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICIgICB8ICAgICAgICAgICB8IG5vdGF0aW9uIHVzaW5nIHRoZSBsZXR0ZXIgJ2UnIHRvIGluZGljYXRlICIKKyAgICAgICAgICAgICAgICAgICd0aGUgZXhwb25lbnQuICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyAnCisgICAgICAgICAgICAgICAgICAnIjYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ0VcJyIgICAgIHwgRXhwb25lbnQgbm90YXRpb24uIFNhbWUgYXMgIlwnZVwnIiAnCisgICAgICAgICAgICAgICAgICAnZXhjZXB0IGl0IHVzZXMgYW4gdXBwZXIgICB8XG4nCisgICAgICAgICAgICAgICAgICAiICAgfCAgICAgICAgICAgfCBjYXNlICdFJyBhcyB0aGUgc2VwYXJhdG9yICIKKyAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXIuICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdmXCciICAgICB8IEZpeGVkIHBvaW50LiBEaXNwbGF5cyB0aGUgbnVtYmVyIGFzIGEgJworICAgICAgICAgICAgICAgICAgJ2ZpeGVkLXBvaW50IG51bWJlci4gIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyAnCisgICAgICAgICAgICAgICAgICAnIjYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ0ZcJyIgICAgIHwgRml4ZWQgcG9pbnQuIFNhbWUgYXMgIlwnZlwnIiwgYnV0ICcKKyAgICAgICAgICAgICAgICAgICdjb252ZXJ0cyAibmFuIiB0byAiTkFOIiAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBhbmQgImluZiIgdG8gJworICAgICAgICAgICAgICAgICAgJyJJTkYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdnXCciICAgICB8IEdlbmVyYWwgZm9ybWF0LiAgRm9yIGEgZ2l2ZW4gcHJlY2lzaW9uICcKKyAgICAgICAgICAgICAgICAgICcicCA+PSAxIiwgdGhpcyAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHJvdW5kcyB0aGUgbnVtYmVyIHRvICJwIiBzaWduaWZpY2FudCAnCisgICAgICAgICAgICAgICAgICAnZGlnaXRzIGFuZCB0aGVuICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGZvcm1hdHMgdGhlIHJlc3VsdCBpbiBlaXRoZXIgZml4ZWQtcG9pbnQgJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdCBvciBpbiAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHNjaWVudGlmaWMgbm90YXRpb24sIGRlcGVuZGluZyBvbiBpdHMgJworICAgICAgICAgICAgICAgICAgJ21hZ25pdHVkZS4gIFRoZSAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHByZWNpc2UgcnVsZXMgYXJlIGFzIGZvbGxvd3M6IHN1cHBvc2UgdGhhdCAnCisgICAgICAgICAgICAgICAgICAndGhlIHJlc3VsdCAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICJcJ2VcJyIgJworICAgICAgICAgICAgICAgICAgJ2FuZCBwcmVjaXNpb24gInAtMSIgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgd291bGQgaGF2ZSBleHBvbmVudCAiZXhwIi4gIFRoZW4gaWYgIi00IDw9ICcKKyAgICAgICAgICAgICAgICAgICdleHAgPCBwIiwgdGhlICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgbnVtYmVyIGlzIGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICcKKyAgICAgICAgICAgICAgICAgICciXCdmXCciIGFuZCAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBwcmVjaXNpb24gInAtMS1leHAiLiAgT3RoZXJ3aXNlLCB0aGUgJworICAgICAgICAgICAgICAgICAgJ251bWJlciBpcyBmb3JtYXR0ZWQgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICJcJ2VcJyIgYW5kICcKKyAgICAgICAgICAgICAgICAgICdwcmVjaXNpb24gInAtMSIuIEluIGJvdGggIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGNhc2VzIGluc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3MgYXJlICcKKyAgICAgICAgICAgICAgICAgICdyZW1vdmVkIGZyb20gdGhlICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHNpZ25pZmljYW5kLCBhbmQgdGhlIGRlY2ltYWwgcG9pbnQgaXMgYWxzbyAnCisgICAgICAgICAgICAgICAgICAncmVtb3ZlZCBpZiAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHRoZXJlIGFyZSBubyByZW1haW5pbmcgZGlnaXRzIGZvbGxvd2luZyAnCisgICAgICAgICAgICAgICAgICAnaXQuICBQb3NpdGl2ZSBhbmQgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IG5lZ2F0aXZlIGluZmluaXR5LCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgJworICAgICAgICAgICAgICAgICAgJ3plcm8sIGFuZCBuYW5zLCAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGFyZSBmb3JtYXR0ZWQgYXMgImluZiIsICItaW5mIiwgIjAiLCAiLTAiICcKKyAgICAgICAgICAgICAgICAgICdhbmQgIm5hbiIgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHJlc3BlY3RpdmVseSwgcmVnYXJkbGVzcyBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgJ3ByZWNpc2lvbi4gIEEgcHJlY2lzaW9uIG9mIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8ICIwIiBpcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYSAnCisgICAgICAgICAgICAgICAgICAncHJlY2lzaW9uIG9mICIxIi4gVGhlICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGRlZmF1bHQgcHJlY2lzaW9uIGlzICcKKyAgICAgICAgICAgICAgICAgICciNiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ0dcJyIgICAgIHwgR2VuZXJhbCBmb3JtYXQuIFNhbWUgYXMgIlwnZ1wnIiBleGNlcHQgJworICAgICAgICAgICAgICAgICAgJ3N3aXRjaGVzIHRvICJcJ0VcJyIgaWYgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHRoZSBudW1iZXIgZ2V0cyB0b28gbGFyZ2UuIFRoZSAnCisgICAgICAgICAgICAgICAgICAncmVwcmVzZW50YXRpb25zIG9mIGluZmluaXR5IHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGFuZCBOYU4gYXJlIHVwcGVyY2FzZWQsICcKKyAgICAgICAgICAgICAgICAgICd0b28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ25cJyIgICAgIHwgTnVtYmVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzICJcJ2dcJyIsICcKKyAgICAgICAgICAgICAgICAgICdleGNlcHQgdGhhdCBpdCB1c2VzIHRoZSB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlIG51bWJlciAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBzZXBhcmF0b3IgJworICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCclXCciICAgICB8IFBlcmNlbnRhZ2UuIE11bHRpcGxpZXMgdGhlIG51bWJlciBieSAxMDAgJworICAgICAgICAgICAgICAgICAgJ2FuZCBkaXNwbGF5cyBpbiAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGZpeGVkICgiXCdmXCciKSBmb3JtYXQsIGZvbGxvd2VkIGJ5IGEgJworICAgICAgICAgICAgICAgICAgJ3BlcmNlbnQgc2lnbi4gICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgTm9uZSAgICAgIHwgU2ltaWxhciB0byAiXCdnXCciLCBleGNlcHQgdGhhdCAnCisgICAgICAgICAgICAgICAgICAnZml4ZWQtcG9pbnQgbm90YXRpb24sIHdoZW4gICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCB1c2VkLCBoYXMgYXQgbGVhc3Qgb25lIGRpZ2l0IHBhc3QgdGhlICcKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsIHBvaW50LiBUaGUgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBkZWZhdWx0IHByZWNpc2lvbiBpcyBhcyBoaWdoIGFzIG5lZWRlZCB0byAnCisgICAgICAgICAgICAgICAgICAncmVwcmVzZW50IHRoZSAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBwYXJ0aWN1bGFyIHZhbHVlLiBUaGUgb3ZlcmFsbCBlZmZlY3QgaXMgdG8gJworICAgICAgICAgICAgICAgICAgJ21hdGNoIHRoZSAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBvdXRwdXQgb2YgInN0cigpIiBhcyBhbHRlcmVkIGJ5IHRoZSBvdGhlciAnCisgICAgICAgICAgICAgICAgICAnZm9ybWF0ICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAnbW9kaWZpZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0Zvcm1hdCBleGFtcGxlc1xuJworICAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoaXMgc2VjdGlvbiBjb250YWlucyBleGFtcGxlcyBvZiB0aGUgInN0ci5mb3JtYXQoKSIgc3ludGF4ICcKKyAgICAgICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAgICAgICdjb21wYXJpc29uIHdpdGggdGhlIG9sZCAiJSItZm9ybWF0dGluZy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJbiBtb3N0IG9mIHRoZSBjYXNlcyB0aGUgc3ludGF4IGlzIHNpbWlsYXIgdG8gdGhlIG9sZCAnCisgICAgICAgICAgICAgICAgICAnIiUiLWZvcm1hdHRpbmcsXG4nCisgICAgICAgICAgICAgICAgICAnd2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlICJ7fSIgYW5kIHdpdGggIjoiIHVzZWQgaW5zdGVhZCBvZiAnCisgICAgICAgICAgICAgICAgICAnIiUiLiBGb3JcbicKKyAgICAgICAgICAgICAgICAgICdleGFtcGxlLCAiXCclMDMuMmZcJyIgY2FuIGJlIHRyYW5zbGF0ZWQgdG8gIlwnezowMy4yZn1cJyIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlIG5ldyBmb3JtYXQgc3ludGF4IGFsc28gc3VwcG9ydHMgbmV3IGFuZCBkaWZmZXJlbnQgJworICAgICAgICAgICAgICAgICAgJ29wdGlvbnMsIHNob3duXG4nCisgICAgICAgICAgICAgICAgICAnaW4gdGhlIGZvbGxvdyBleGFtcGxlcy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdBY2Nlc3NpbmcgYXJndW1lbnRzIGJ5IHBvc2l0aW9uOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezB9LCB7MX0sIHsyfScuZm9ybWF0KCdhJywgJ2InLCAnYycpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ2EsIGIsIGMnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7fSwge30sIHt9Jy5mb3JtYXQoJ2EnLCAnYicsICdjJykgICMgMy4xKyBvbmx5XG4iCisgICAgICAgICAgICAgICAgICAiICAgJ2EsIGIsIGMnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7Mn0sIHsxfSwgezB9Jy5mb3JtYXQoJ2EnLCAnYicsICdjJylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnYywgYiwgYSdcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3syfSwgezF9LCB7MH0nLmZvcm1hdCgqJ2FiYycpICAgICAgIyB1bnBhY2tpbmcgIgorICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IHNlcXVlbmNlXG4nCisgICAgICAgICAgICAgICAgICAiICAgJ2MsIGIsIGEnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7MH17MX17MH0nLmZvcm1hdCgnYWJyYScsICdjYWQnKSAgICMgYXJndW1lbnRzJyAiCisgICAgICAgICAgICAgICAgICAnaW5kaWNlcyBjYW4gYmUgcmVwZWF0ZWRcbicKKyAgICAgICAgICAgICAgICAgICIgICAnYWJyYWNhZGFicmEnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQWNjZXNzaW5nIGFyZ3VtZW50cyBieSBuYW1lOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sICIKKyAgICAgICAgICAgICAgICAgICJ7bG9uZ2l0dWRlfScuZm9ybWF0KGxhdGl0dWRlPSczNy4yNE4nLCAiCisgICAgICAgICAgICAgICAgICAibG9uZ2l0dWRlPSctMTE1LjgxVycpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXJ1xuIgorICAgICAgICAgICAgICAgICAgIiAgID4+PiBjb29yZCA9IHsnbGF0aXR1ZGUnOiAnMzcuMjROJywgJ2xvbmdpdHVkZSc6ICIKKyAgICAgICAgICAgICAgICAgICInLTExNS44MVcnfVxuIgorICAgICAgICAgICAgICAgICAgIiAgID4+PiAnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sICIKKyAgICAgICAgICAgICAgICAgICJ7bG9uZ2l0dWRlfScuZm9ybWF0KCoqY29vcmQpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgIkFjY2Vzc2luZyBhcmd1bWVudHMnIGF0dHJpYnV0ZXM6XG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IGMgPSAzLTVqXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICgnVGhlIGNvbXBsZXggbnVtYmVyIHswfSBpcyBmb3JtZWQgZnJvbSB0aGUgcmVhbCAiCisgICAgICAgICAgICAgICAgICAicGFydCB7MC5yZWFsfSAnXG4iCisgICAgICAgICAgICAgICAgICAiICAgLi4uICAnYW5kIHRoZSBpbWFnaW5hcnkgcGFydCB7MC5pbWFnfS4nKS5mb3JtYXQoYylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnVGhlIGNvbXBsZXggbnVtYmVyICgzLTVqKSBpcyBmb3JtZWQgZnJvbSB0aGUgcmVhbCBwYXJ0ICIKKyAgICAgICAgICAgICAgICAgICIzLjAgYW5kIHRoZSBpbWFnaW5hcnkgcGFydCAtNS4wLidcbiIKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gY2xhc3MgUG9pbnQ6XG4nCisgICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSk6XG4nCisgICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgc2VsZi54LCBzZWxmLnkgPSB4LCB5XG4nCisgICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19zdHJfXyhzZWxmKTpcbicKKyAgICAgICAgICAgICAgICAgICIgICAuLi4gICAgICAgICByZXR1cm4gJ1BvaW50KHtzZWxmLnh9LCAiCisgICAgICAgICAgICAgICAgICAie3NlbGYueX0pJy5mb3JtYXQoc2VsZj1zZWxmKVxuIgorICAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiBzdHIoUG9pbnQoNCwgMikpXG4nCisgICAgICAgICAgICAgICAgICAiICAgJ1BvaW50KDQsIDIpJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgIkFjY2Vzc2luZyBhcmd1bWVudHMnIGl0ZW1zOlxuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiBjb29yZCA9ICgzLCA1KVxuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnWDogezBbMF19OyAgWTogezBbMV19Jy5mb3JtYXQoY29vcmQpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ1g6IDM7ICBZOiA1J1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1JlcGxhY2luZyAiJXMiIGFuZCAiJXIiOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiAicmVwcigpIHNob3dzIHF1b3RlczogeyFyfTsgc3RyKCkgZG9lc25cJ3Q6ICcKKyAgICAgICAgICAgICAgICAgICd7IXN9Ii5mb3JtYXQoXCd0ZXN0MVwnLCBcJ3Rlc3QyXCcpXG4nCisgICAgICAgICAgICAgICAgICAnICAgInJlcHIoKSBzaG93cyBxdW90ZXM6IFwndGVzdDFcJzsgc3RyKCkgZG9lc25cJ3Q6IHRlc3QyIlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0FsaWduaW5nIHRoZSB0ZXh0IGFuZCBzcGVjaWZ5aW5nIGEgd2lkdGg6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7OjwzMH0nLmZvcm1hdCgnbGVmdCBhbGlnbmVkJylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnbGVmdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgJ1xuIgorICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezo+MzB9Jy5mb3JtYXQoJ3JpZ2h0IGFsaWduZWQnKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICcgICAgICAgICAgICAgICAgIHJpZ2h0IGFsaWduZWQnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7Ol4zMH0nLmZvcm1hdCgnY2VudGVyZWQnKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICcgICAgICAgICAgIGNlbnRlcmVkICAgICAgICAgICAnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7OipeMzB9Jy5mb3JtYXQoJ2NlbnRlcmVkJykgICMgdXNlICcqJyBhcyBhIGZpbGwgIgorICAgICAgICAgICAgICAgICAgJ2NoYXJcbicKKyAgICAgICAgICAgICAgICAgICIgICAnKioqKioqKioqKipjZW50ZXJlZCoqKioqKioqKioqJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1JlcGxhY2luZyAiJStmIiwgIiUtZiIsIGFuZCAiJSBmIiBhbmQgc3BlY2lmeWluZyBhIHNpZ246XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7OitmfTsgezorZn0nLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBpdCAiCisgICAgICAgICAgICAgICAgICAnYWx3YXlzXG4nCisgICAgICAgICAgICAgICAgICAiICAgJyszLjE0MDAwMDsgLTMuMTQwMDAwJ1xuIgorICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezogZn07IHs6IGZ9Jy5mb3JtYXQoMy4xNCwgLTMuMTQpICAjIHNob3cgYSBzcGFjZSAiCisgICAgICAgICAgICAgICAgICAnZm9yIHBvc2l0aXZlIG51bWJlcnNcbicKKyAgICAgICAgICAgICAgICAgICIgICAnIDMuMTQwMDAwOyAtMy4xNDAwMDAnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7Oi1mfTsgezotZn0nLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBvbmx5IHRoZSAiCisgICAgICAgICAgICAgICAgICAibWludXMgLS0gc2FtZSBhcyAnezpmfTsgezpmfSdcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnMy4xNDAwMDA7IC0zLjE0MDAwMCdcbiIKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdSZXBsYWNpbmcgIiV4IiBhbmQgIiVvIiBhbmQgY29udmVydGluZyB0aGUgdmFsdWUgdG8gJworICAgICAgICAgICAgICAgICAgJ2RpZmZlcmVudCBiYXNlczpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gIyBmb3JtYXQgYWxzbyBzdXBwb3J0cyBiaW5hcnkgbnVtYmVyc1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6eH07ICBvY3Q6IHswOm99OyAgYmluOiAnCisgICAgICAgICAgICAgICAgICAnezA6Yn0iLmZvcm1hdCg0MilcbicKKyAgICAgICAgICAgICAgICAgICIgICAnaW50OiA0MjsgIGhleDogMmE7ICBvY3Q6IDUyOyAgYmluOiAxMDEwMTAnXG4iCisgICAgICAgICAgICAgICAgICAnICAgPj4+ICMgd2l0aCAweCwgMG8sIG9yIDBiIGFzIHByZWZpeDpcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gImludDogezA6ZH07ICBoZXg6IHswOiN4fTsgIG9jdDogezA6I299OyAgYmluOiAnCisgICAgICAgICAgICAgICAgICAnezA6I2J9Ii5mb3JtYXQoNDIpXG4nCisgICAgICAgICAgICAgICAgICAiICAgJ2ludDogNDI7ICBoZXg6IDB4MmE7ICBvY3Q6IDBvNTI7ICBiaW46IDBiMTAxMDEwJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1VzaW5nIHRoZSBjb21tYSBhcyBhIHRob3VzYW5kcyBzZXBhcmF0b3I6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7Oix9Jy5mb3JtYXQoMTIzNDU2Nzg5MClcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnMSwyMzQsNTY3LDg5MCdcbiIKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdFeHByZXNzaW5nIGEgcGVyY2VudGFnZTpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gcG9pbnRzID0gMTlcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gdG90YWwgPSAyMlxuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnQ29ycmVjdCBhbnN3ZXJzOiB7Oi4yJX0nLmZvcm1hdChwb2ludHMvdG90YWwpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ0NvcnJlY3QgYW5zd2VyczogODYuMzYlJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1VzaW5nIHR5cGUtc3BlY2lmaWMgZm9ybWF0dGluZzpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gaW1wb3J0IGRhdGV0aW1lXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IGQgPSBkYXRldGltZS5kYXRldGltZSgyMDEwLCA3LCA0LCAxMiwgMTUsIDU4KVxuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezolWS0lbS0lZCAlSDolTTolU30nLmZvcm1hdChkKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICcyMDEwLTA3LTA0IDEyOjE1OjU4J1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ05lc3RpbmcgYXJndW1lbnRzIGFuZCBtb3JlIGNvbXBsZXggZXhhbXBsZXM6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+IGZvciBhbGlnbiwgdGV4dCBpbiB6aXAoJzxePicsIFsnbGVmdCcsICdjZW50ZXInLCAiCisgICAgICAgICAgICAgICAgICAiJ3JpZ2h0J10pOlxuIgorICAgICAgICAgICAgICAgICAgIiAgIC4uLiAgICAgJ3swOntmaWxsfXthbGlnbn0xNn0nLmZvcm1hdCh0ZXh0LCBmaWxsPWFsaWduLCAiCisgICAgICAgICAgICAgICAgICAnYWxpZ249YWxpZ24pXG4nCisgICAgICAgICAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgICAgICAgICAiICAgJ2xlZnQ8PDw8PDw8PDw8PDwnXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ15eXl5eY2VudGVyXl5eXl4nXG4iCisgICAgICAgICAgICAgICAgICAiICAgJz4+Pj4+Pj4+Pj4+cmlnaHQnXG4iCisgICAgICAgICAgICAgICAgICAnICAgPj4+XG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IG9jdGV0cyA9IFsxOTIsIDE2OCwgMCwgMV1cbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6MDJYfXs6MDJYfXs6MDJYfXs6MDJYfScuZm9ybWF0KCpvY3RldHMpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ0MwQTgwMDAxJ1xuIgorICAgICAgICAgICAgICAgICAgJyAgID4+PiBpbnQoXywgMTYpXG4nCisgICAgICAgICAgICAgICAgICAnICAgMzIzMjIzNTUyMVxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PlxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiB3aWR0aCA9IDVcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gZm9yIG51bSBpbiByYW5nZSg1LDEyKTogI2RvY3Rlc3Q6ICcKKyAgICAgICAgICAgICAgICAgICcrTk9STUFMSVpFX1dISVRFU1BBQ0VcbicKKyAgICAgICAgICAgICAgICAgICIgICAuLi4gICAgIGZvciBiYXNlIGluICdkWG9iJzpcbiIKKyAgICAgICAgICAgICAgICAgICIgICAuLi4gICAgICAgICBwcmludCgnezA6e3dpZHRofXtiYXNlfX0nLmZvcm1hdChudW0sICIKKyAgICAgICAgICAgICAgICAgICJiYXNlPWJhc2UsIHdpZHRoPXdpZHRoKSwgZW5kPScgJylcbiIKKyAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIHByaW50KClcbicKKyAgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgICAgNSAgICAgNSAgICAgNSAgIDEwMVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgICA2ICAgICA2ICAgICA2ICAgMTEwXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgIDcgICAgIDcgICAgIDcgICAxMTFcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICAgOCAgICAgOCAgICAxMCAgMTAwMFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgICA5ICAgICA5ICAgIDExICAxMDAxXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgMTAgICAgIEEgICAgMTIgIDEwMTBcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICAxMSAgICAgQiAgICAxMyAgMTAxMVxuJywKKyAnZnVuY3Rpb24nOiAnXG4nCisgICAgICAgICAgICAgJ0Z1bmN0aW9uIGRlZmluaXRpb25zXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgJworICAgICAgICAgICAgICcoc2VlXG4nCisgICAgICAgICAgICAgJ3NlY3Rpb24gVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGZ1bmNkZWYgICAgICAgICAgICAgICAgIDo6PSBbZGVjb3JhdG9yc10gImRlZiIgZnVuY25hbWUgIigiICcKKyAgICAgICAgICAgICAnW3BhcmFtZXRlcl9saXN0XSAiKSIgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJyAgIGRlY29yYXRvcnMgICAgICAgICAgICAgIDo6PSBkZWNvcmF0b3IrXG4nCisgICAgICAgICAgICAgJyAgIGRlY29yYXRvciAgICAgICAgICAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiAnCisgICAgICAgICAgICAgJ1thcmd1bWVudF9saXN0IFsiLCJdXSAiKSJdIE5FV0xJTkVcbicKKyAgICAgICAgICAgICAnICAgZG90dGVkX25hbWUgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSpcbicKKyAgICAgICAgICAgICAnICAgcGFyYW1ldGVyX2xpc3QgICAgICAgICAgOjo9IGRlZnBhcmFtZXRlciAoIiwiIGRlZnBhcmFtZXRlcikqICcKKyAgICAgICAgICAgICAnWyIsIiBbcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NdXVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgfCBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnc1xuJworICAgICAgICAgICAgICcgICBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJncyA6Oj0gIioiIFtwYXJhbWV0ZXJdICgiLCIgJworICAgICAgICAgICAgICdkZWZwYXJhbWV0ZXIpKiBbIiwiIFsiKioiIHBhcmFtZXRlciBbIiwiXV1dXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICIqKiIgcGFyYW1ldGVyIFsiLCJdXG4nCisgICAgICAgICAgICAgJyAgIHBhcmFtZXRlciAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIFsiOiIgZXhwcmVzc2lvbl1cbicKKyAgICAgICAgICAgICAnICAgZGVmcGFyYW1ldGVyICAgICAgICAgICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4nCisgICAgICAgICAgICAgJyAgIGZ1bmNuYW1lICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uICcKKyAgICAgICAgICAgICAnYmluZHNcbicKKyAgICAgICAgICAgICAndGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlIHRvIGEgZnVuY3Rpb24gJworICAgICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAgICAnKGEgd3JhcHBlciBhcm91bmQgdGhlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uKS4gIFRoaXNcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdsb2JhbCAnCisgICAgICAgICAgICAgJ25hbWVzcGFjZVxuJworICAgICAgICAgICAgICdhcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgJworICAgICAgICAgICAgICdnZXRzXG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBbM11cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSAqZGVjb3JhdG9yKlxuJworICAgICAgICAgICAgICdleHByZXNzaW9ucy4gRGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgJworICAgICAgICAgICAgICdmdW5jdGlvbiBpc1xuJworICAgICAgICAgICAgICdkZWZpbmVkLCBpbiB0aGUgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gICcKKyAgICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICAgJ3Jlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gJworICAgICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAgICAnYXMgdGhlIG9ubHkgYXJndW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBib3VuZCB0byB0aGUgJworICAgICAgICAgICAgICdmdW5jdGlvbiBuYW1lXG4nCisgICAgICAgICAgICAgJ2luc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIE11bHRpcGxlIGRlY29yYXRvcnMgYXJlIGFwcGxpZWQgJworICAgICAgICAgICAgICdpblxuJworICAgICAgICAgICAgICduZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQGYxKGFyZylcbicKKyAgICAgICAgICAgICAnICAgQGYyXG4nCisgICAgICAgICAgICAgJyAgIGRlZiBmdW5jKCk6IHBhc3NcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2lzIHJvdWdobHkgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZGVmIGZ1bmMoKTogcGFzc1xuJworICAgICAgICAgICAgICcgICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2V4Y2VwdCB0aGF0IHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBpcyBub3QgdGVtcG9yYXJpbHkgYm91bmQgdG8gJworICAgICAgICAgICAgICd0aGUgbmFtZVxuJworICAgICAgICAgICAgICciZnVuYyIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaGVuIG9uZSBvciBtb3JlICpwYXJhbWV0ZXJzKiBoYXZlIHRoZSBmb3JtICpwYXJhbWV0ZXIqICI9IlxuJworICAgICAgICAgICAgICcqZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyICcKKyAgICAgICAgICAgICAndmFsdWVzLiJcbicKKyAgICAgICAgICAgICAnRm9yIGEgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZyAnCisgICAgICAgICAgICAgJyphcmd1bWVudCogbWF5XG4nCisgICAgICAgICAgICAgImJlIG9taXR0ZWQgZnJvbSBhIGNhbGwsIGluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlcidzIGRlZmF1bHQgIgorICAgICAgICAgICAgICd2YWx1ZSBpc1xuJworICAgICAgICAgICAgICdzdWJzdGl0dXRlZC4gIElmIGEgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGFsbCBmb2xsb3dpbmdcbicKKyAgICAgICAgICAgICAncGFyYW1ldGVycyB1cCB1bnRpbCB0aGUgIiIqIiIgbXVzdCBhbHNvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIC0tLSAnCisgICAgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAgICAnaXMgYSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgJ2dyYW1tYXIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcqKkRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB3aGVuICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuKiogVGhpcyBtZWFucyB0aGF0IHRoZSAnCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24gaXNcbicKKyAgICAgICAgICAgICAnZXZhbHVhdGVkIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGF0IHRoZSBzYW1lICcKKyAgICAgICAgICAgICAnInByZS1cbicKKyAgICAgICAgICAgICAnY29tcHV0ZWQiIHZhbHVlIGlzIHVzZWQgZm9yIGVhY2ggY2FsbC4gIFRoaXMgaXMgZXNwZWNpYWxseSAnCisgICAgICAgICAgICAgJ2ltcG9ydGFudFxuJworICAgICAgICAgICAgICd0byB1bmRlcnN0YW5kIHdoZW4gYSBkZWZhdWx0IHBhcmFtZXRlciBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoICcKKyAgICAgICAgICAgICAnYXMgYVxuJworICAgICAgICAgICAgICdsaXN0IG9yIGEgZGljdGlvbmFyeTogaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QgKGUuZy4gJworICAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgICdhcHBlbmRpbmcgYW4gaXRlbSB0byBhIGxpc3QpLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBpbiBlZmZlY3QgJworICAgICAgICAgICAgICdtb2RpZmllZC5cbicKKyAgICAgICAgICAgICAnVGhpcyBpcyBnZW5lcmFsbHkgbm90IHdoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkgYXJvdW5kIHRoaXMgaXMgJworICAgICAgICAgICAgICd0byB1c2VcbicKKyAgICAgICAgICAgICAnIk5vbmUiIGFzIHRoZSBkZWZhdWx0LCBhbmQgZXhwbGljaXRseSB0ZXN0IGZvciBpdCBpbiB0aGUgYm9keSBvZiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdmdW5jdGlvbiwgZS5nLjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKTpcbicKKyAgICAgICAgICAgICAnICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZTpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICBwZW5ndWluID0gW11cbicKKyAgICAgICAgICAgICAnICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIilcbicKKyAgICAgICAgICAgICAnICAgICAgIHJldHVybiBwZW5ndWluXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdGdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb24gJworICAgICAgICAgICAgICdDYWxscy5cbicKKyAgICAgICAgICAgICAnQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVycyAnCisgICAgICAgICAgICAgJ21lbnRpb25lZCBpblxuJworICAgICAgICAgICAgICd0aGUgcGFyYW1ldGVyIGxpc3QsIGVpdGhlciBmcm9tIHBvc2l0aW9uIGFyZ3VtZW50cywgZnJvbSAnCisgICAgICAgICAgICAgJ2tleXdvcmRcbicKKyAgICAgICAgICAgICAnYXJndW1lbnRzLCBvciBmcm9tIGRlZmF1bHQgdmFsdWVzLiAgSWYgdGhlIGZvcm0gIiIqaWRlbnRpZmllciIiICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAncHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmcgYW55IGV4Y2VzcyAnCisgICAgICAgICAgICAgJ3Bvc2l0aW9uYWxcbicKKyAgICAgICAgICAgICAncGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuICBJZiB0aGUgZm9ybVxuJworICAgICAgICAgICAgICciIioqaWRlbnRpZmllciIiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3ICcKKyAgICAgICAgICAgICAnZGljdGlvbmFyeVxuJworICAgICAgICAgICAgICdyZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ldyAnCisgICAgICAgICAgICAgJ2VtcHR5XG4nCisgICAgICAgICAgICAgJ2RpY3Rpb25hcnkuIFBhcmFtZXRlcnMgYWZ0ZXIgIiIqIiIgb3IgIiIqaWRlbnRpZmllciIiIGFyZSAnCisgICAgICAgICAgICAgJ2tleXdvcmQtb25seVxuJworICAgICAgICAgICAgICdwYXJhbWV0ZXJzIGFuZCBtYXkgb25seSBiZSBwYXNzZWQgdXNlZCBrZXl3b3JkIGFyZ3VtZW50cy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1BhcmFtZXRlcnMgbWF5IGhhdmUgYW5ub3RhdGlvbnMgb2YgdGhlIGZvcm0gIiI6IGV4cHJlc3Npb24iIiAnCisgICAgICAgICAgICAgJ2ZvbGxvd2luZ1xuJworICAgICAgICAgICAgICd0aGUgcGFyYW1ldGVyIG5hbWUuICBBbnkgcGFyYW1ldGVyIG1heSBoYXZlIGFuIGFubm90YXRpb24gZXZlbiAnCisgICAgICAgICAgICAgJ3Rob3NlXG4nCisgICAgICAgICAgICAgJ29mIHRoZSBmb3JtICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciIuICBGdW5jdGlvbnMgbWF5ICcKKyAgICAgICAgICAgICAnaGF2ZVxuJworICAgICAgICAgICAgICcicmV0dXJuIiBhbm5vdGF0aW9uIG9mIHRoZSBmb3JtICIiLT4gZXhwcmVzc2lvbiIiIGFmdGVyIHRoZSAnCisgICAgICAgICAgICAgJ3BhcmFtZXRlclxuJworICAgICAgICAgICAgICdsaXN0LiAgVGhlc2UgYW5ub3RhdGlvbnMgY2FuIGJlIGFueSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiBhbmQgJworICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAnZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuICBBbm5vdGF0aW9ucyAnCisgICAgICAgICAgICAgJ21heVxuJworICAgICAgICAgICAgICdiZSBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlICcKKyAgICAgICAgICAgICAnY29kZS5cbicKKyAgICAgICAgICAgICAnVGhlIHByZXNlbmNlIG9mIGFubm90YXRpb25zIGRvZXMgbm90IGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mIGFcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24uICBUaGUgYW5ub3RhdGlvbiB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBhcyB2YWx1ZXMgb2YgYVxuJworICAgICAgICAgICAgICJkaWN0aW9uYXJ5IGtleWVkIGJ5IHRoZSBwYXJhbWV0ZXJzJyBuYW1lcyBpbiB0aGUgIgorICAgICAgICAgICAgICciX19hbm5vdGF0aW9uc19fIlxuJworICAgICAgICAgICAgICdhdHRyaWJ1dGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0l0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgJworICAgICAgICAgICAgICdib3VuZFxuJworICAgICAgICAgICAgICd0byBhIG5hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGFcbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbnMsIGRlc2NyaWJlZCBpbiBzZWN0aW9uIExhbWJkYXMuICBOb3RlIHRoYXQgdGhlICcKKyAgICAgICAgICAgICAnbGFtYmRhXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24gaXMgbWVyZWx5IGEgc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gJworICAgICAgICAgICAgICdkZWZpbml0aW9uO1xuJworICAgICAgICAgICAgICdhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSAiImRlZiIiIHN0YXRlbWVudCBjYW4gYmUgcGFzc2VkIGFyb3VuZCAnCisgICAgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgICAgJ2Fzc2lnbmVkIHRvIGFub3RoZXIgbmFtZSBqdXN0IGxpa2UgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgJworICAgICAgICAgICAgICdsYW1iZGFcbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbi4gIFRoZSAiImRlZiIiIGZvcm0gaXMgYWN0dWFsbHkgbW9yZSBwb3dlcmZ1bCBzaW5jZSAnCisgICAgICAgICAgICAgJ2l0XG4nCisgICAgICAgICAgICAgJ2FsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHN0YXRlbWVudHMgYW5kIGFubm90YXRpb25zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiKipQcm9ncmFtbWVyJ3Mgbm90ZToqKiBGdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIG9iamVjdHMuICBBICIKKyAgICAgICAgICAgICAnIiJkZWYiIlxuJworICAgICAgICAgICAgICdzdGF0ZW1lbnQgZXhlY3V0ZWQgaW5zaWRlIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgbG9jYWxcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24gdGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzICcKKyAgICAgICAgICAgICAndXNlZFxuJworICAgICAgICAgICAgICdpbiB0aGUgbmVzdGVkIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgJworICAgICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICAgICdjb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiBOYW1pbmcgYW5kIGJpbmRpbmcgZm9yICcKKyAgICAgICAgICAgICAnZGV0YWlscy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAqKlBFUCAzMTA3KiogLSBGdW5jdGlvbiBBbm5vdGF0aW9uc1xuJworICAgICAgICAgICAgICcgICAgIFRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBmdW5jdGlvbiBhbm5vdGF0aW9ucy5cbicsCisgJ2dsb2JhbCc6ICdcbicKKyAgICAgICAgICAgJ1RoZSAiZ2xvYmFsIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgZ2xvYmFsX3N0bXQgOjo9ICJnbG9iYWwiIGlkZW50aWZpZXIgKCIsIiBpZGVudGlmaWVyKSpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICJnbG9iYWwiIHN0YXRlbWVudCBpcyBhIGRlY2xhcmF0aW9uIHdoaWNoIGhvbGRzIGZvciB0aGUgJworICAgICAgICAgICAnZW50aXJlXG4nCisgICAgICAgICAgICdjdXJyZW50IGNvZGUgYmxvY2suICBJdCBtZWFucyB0aGF0IHRoZSBsaXN0ZWQgaWRlbnRpZmllcnMgYXJlIHRvICcKKyAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICdpbnRlcnByZXRlZCBhcyBnbG9iYWxzLiAgSXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byBhc3NpZ24gdG8gYSAnCisgICAgICAgICAgICdnbG9iYWxcbicKKyAgICAgICAgICAgJ3ZhcmlhYmxlIHdpdGhvdXQgImdsb2JhbCIsIGFsdGhvdWdoIGZyZWUgdmFyaWFibGVzIG1heSByZWZlciB0b1xuJworICAgICAgICAgICAnZ2xvYmFscyB3aXRob3V0IGJlaW5nIGRlY2xhcmVkIGdsb2JhbC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnTmFtZXMgbGlzdGVkIGluIGEgImdsb2JhbCIgc3RhdGVtZW50IG11c3Qgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgJworICAgICAgICAgICAnY29kZVxuJworICAgICAgICAgICAnYmxvY2sgdGV4dHVhbGx5IHByZWNlZGluZyB0aGF0ICJnbG9iYWwiIHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnTmFtZXMgbGlzdGVkIGluIGEgImdsb2JhbCIgc3RhdGVtZW50IG11c3Qgbm90IGJlIGRlZmluZWQgYXMgJworICAgICAgICAgICAnZm9ybWFsXG4nCisgICAgICAgICAgICdwYXJhbWV0ZXJzIG9yIGluIGEgImZvciIgbG9vcCBjb250cm9sIHRhcmdldCwgImNsYXNzIiBkZWZpbml0aW9uLFxuJworICAgICAgICAgICAnZnVuY3Rpb24gZGVmaW5pdGlvbiwgb3IgImltcG9ydCIgc3RhdGVtZW50LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgJworICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICdlbmZvcmNlIHRoZSB0d28gcmVzdHJpY3Rpb25zLCBidXQgcHJvZ3JhbXMgc2hvdWxkIG5vdCBhYnVzZSB0aGlzXG4nCisgICAgICAgICAgICdmcmVlZG9tLCBhcyBmdXR1cmUgaW1wbGVtZW50YXRpb25zIG1heSBlbmZvcmNlIHRoZW0gb3Igc2lsZW50bHkgJworICAgICAgICAgICAnY2hhbmdlXG4nCisgICAgICAgICAgICd0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogdGhlICJnbG9iYWwiIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSAnCisgICAgICAgICAgICdwYXJzZXIuICBJdFxuJworICAgICAgICAgICAnYXBwbGllcyBvbmx5IHRvIGNvZGUgcGFyc2VkIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlICJnbG9iYWwiXG4nCisgICAgICAgICAgICdzdGF0ZW1lbnQuIEluIHBhcnRpY3VsYXIsIGEgImdsb2JhbCIgc3RhdGVtZW50IGNvbnRhaW5lZCBpbiBhICcKKyAgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICAnb3IgY29kZSBvYmplY3Qgc3VwcGxpZWQgdG8gdGhlIGJ1aWx0LWluICJleGVjKCkiIGZ1bmN0aW9uIGRvZXMgJworICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICdhZmZlY3QgdGhlIGNvZGUgYmxvY2sgKmNvbnRhaW5pbmcqIHRoZSBmdW5jdGlvbiBjYWxsLCBhbmQgY29kZVxuJworICAgICAgICAgICAnY29udGFpbmVkIGluIHN1Y2ggYSBzdHJpbmcgaXMgdW5hZmZlY3RlZCBieSAiZ2xvYmFsIiBzdGF0ZW1lbnRzIGluICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnY29kZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBjYWxsLiAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgJworICAgICAgICAgICAnImV2YWwoKSJcbicKKyAgICAgICAgICAgJ2FuZCAiY29tcGlsZSgpIiBmdW5jdGlvbnMuXG4nLAorICdpZC1jbGFzc2VzJzogJ1xuJworICAgICAgICAgICAgICAgJ1Jlc2VydmVkIGNsYXNzZXMgb2YgaWRlbnRpZmllcnNcbicKKyAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQ2VydGFpbiBjbGFzc2VzIG9mIGlkZW50aWZpZXJzIChiZXNpZGVzIGtleXdvcmRzKSBoYXZlICcKKyAgICAgICAgICAgICAgICdzcGVjaWFsXG4nCisgICAgICAgICAgICAgICAnbWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiAnCisgICAgICAgICAgICAgICAnbGVhZGluZyBhbmRcbicKKyAgICAgICAgICAgICAgICd0cmFpbGluZyB1bmRlcnNjb3JlIGNoYXJhY3RlcnM6XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnIl8qIlxuJworICAgICAgICAgICAgICAgJyAgIE5vdCBpbXBvcnRlZCBieSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiLiAgVGhlIHNwZWNpYWwgJworICAgICAgICAgICAgICAgJ2lkZW50aWZpZXIgIl8iXG4nCisgICAgICAgICAgICAgICAnICAgaXMgdXNlZCBpbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgdG8gc3RvcmUgdGhlIHJlc3VsdCAnCisgICAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgICAnICAgbGFzdCBldmFsdWF0aW9uOyBpdCBpcyBzdG9yZWQgaW4gdGhlICJidWlsdGlucyIgbW9kdWxlLiAgJworICAgICAgICAgICAgICAgJ1doZW4gbm90XG4nCisgICAgICAgICAgICAgICAnICAgaW4gaW50ZXJhY3RpdmUgbW9kZSwgIl8iIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgYW5kIGlzIG5vdCAnCisgICAgICAgICAgICAgICAnZGVmaW5lZC5cbicKKyAgICAgICAgICAgICAgICcgICBTZWUgc2VjdGlvbiBUaGUgaW1wb3J0IHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICBOb3RlOiBUaGUgbmFtZSAiXyIgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoXG4nCisgICAgICAgICAgICAgICAnICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZVxuJworICAgICAgICAgICAgICAgJyAgICAgImdldHRleHQiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzICcKKyAgICAgICAgICAgICAgICdjb252ZW50aW9uLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyJfXypfXyJcbicKKyAgICAgICAgICAgICAgICcgICBTeXN0ZW0tZGVmaW5lZCBuYW1lcy4gVGhlc2UgbmFtZXMgYXJlIGRlZmluZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAgICdpbnRlcnByZXRlclxuJworICAgICAgICAgICAgICAgJyAgIGFuZCBpdHMgaW1wbGVtZW50YXRpb24gKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuICAnCisgICAgICAgICAgICAgICAnQ3VycmVudFxuJworICAgICAgICAgICAgICAgJyAgIHN5c3RlbSBuYW1lcyBhcmUgZGlzY3Vzc2VkIGluIHRoZSBTcGVjaWFsIG1ldGhvZCBuYW1lcyAnCisgICAgICAgICAgICAgICAnc2VjdGlvbiBhbmRcbicKKyAgICAgICAgICAgICAgICcgICBlbHNld2hlcmUuICBNb3JlIHdpbGwgbGlrZWx5IGJlIGRlZmluZWQgaW4gZnV0dXJlIHZlcnNpb25zICcKKyAgICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICAgJyAgIFB5dGhvbi4gICpBbnkqIHVzZSBvZiAiX18qX18iIG5hbWVzLCBpbiBhbnkgY29udGV4dCwgdGhhdCAnCisgICAgICAgICAgICAgICAnZG9lcyBub3RcbicKKyAgICAgICAgICAgICAgICcgICBmb2xsb3cgZXhwbGljaXRseSBkb2N1bWVudGVkIHVzZSwgaXMgc3ViamVjdCB0byBicmVha2FnZSAnCisgICAgICAgICAgICAgICAnd2l0aG91dFxuJworICAgICAgICAgICAgICAgJyAgIHdhcm5pbmcuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnIl9fKiJcbicKKyAgICAgICAgICAgICAgICcgICBDbGFzcy1wcml2YXRlIG5hbWVzLiAgTmFtZXMgaW4gdGhpcyBjYXRlZ29yeSwgd2hlbiB1c2VkICcKKyAgICAgICAgICAgICAgICd3aXRoaW4gdGhlXG4nCisgICAgICAgICAgICAgICAnICAgY29udGV4dCBvZiBhIGNsYXNzIGRlZmluaXRpb24sIGFyZSByZS13cml0dGVuIHRvIHVzZSBhICcKKyAgICAgICAgICAgICAgICdtYW5nbGVkIGZvcm1cbicKKyAgICAgICAgICAgICAgICcgICB0byBoZWxwIGF2b2lkIG5hbWUgY2xhc2hlcyBiZXR3ZWVuICJwcml2YXRlIiBhdHRyaWJ1dGVzIG9mICcKKyAgICAgICAgICAgICAgICdiYXNlIGFuZFxuJworICAgICAgICAgICAgICAgJyAgIGRlcml2ZWQgY2xhc3Nlcy4gU2VlIHNlY3Rpb24gSWRlbnRpZmllcnMgKE5hbWVzKS5cbicsCisgJ2lkZW50aWZpZXJzJzogJ1xuJworICAgICAgICAgICAgICAgICdJZGVudGlmaWVycyBhbmQga2V5d29yZHNcbicKKyAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdJZGVudGlmaWVycyAoYWxzbyByZWZlcnJlZCB0byBhcyAqbmFtZXMqKSBhcmUgZGVzY3JpYmVkIGJ5ICcKKyAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgJ2ZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIHN5bnRheCBvZiBpZGVudGlmaWVycyBpbiBQeXRob24gaXMgYmFzZWQgb24gdGhlIFVuaWNvZGUgJworICAgICAgICAgICAgICAgICdzdGFuZGFyZFxuJworICAgICAgICAgICAgICAgICdhbm5leCBVQVgtMzEsIHdpdGggZWxhYm9yYXRpb24gYW5kIGNoYW5nZXMgYXMgZGVmaW5lZCBiZWxvdzsgJworICAgICAgICAgICAgICAgICdzZWUgYWxzb1xuJworICAgICAgICAgICAgICAgICcqKlBFUCAzMTMxKiogZm9yIGZ1cnRoZXIgZGV0YWlscy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1dpdGhpbiB0aGUgQVNDSUkgcmFuZ2UgKFUrMDAwMS4uVSswMDdGKSwgdGhlIHZhbGlkIGNoYXJhY3RlcnMgJworICAgICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAgICAnaWRlbnRpZmllcnMgYXJlIHRoZSBzYW1lIGFzIGluIFB5dGhvbiAyLng6IHRoZSB1cHBlcmNhc2UgYW5kICcKKyAgICAgICAgICAgICAgICAnbG93ZXJjYXNlXG4nCisgICAgICAgICAgICAgICAgJ2xldHRlcnMgIkEiIHRocm91Z2ggIloiLCB0aGUgdW5kZXJzY29yZSAiXyIgYW5kLCBleGNlcHQgZm9yICcKKyAgICAgICAgICAgICAgICAndGhlIGZpcnN0XG4nCisgICAgICAgICAgICAgICAgJ2NoYXJhY3RlciwgdGhlIGRpZ2l0cyAiMCIgdGhyb3VnaCAiOSIuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdQeXRob24gMy4wIGludHJvZHVjZXMgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGZyb20gb3V0c2lkZSB0aGUgJworICAgICAgICAgICAgICAgICdBU0NJSVxuJworICAgICAgICAgICAgICAgICdyYW5nZSAoc2VlICoqUEVQIDMxMzEqKikuICBGb3IgdGhlc2UgY2hhcmFjdGVycywgdGhlICcKKyAgICAgICAgICAgICAgICAnY2xhc3NpZmljYXRpb25cbicKKyAgICAgICAgICAgICAgICAndXNlcyB0aGUgdmVyc2lvbiBvZiB0aGUgVW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2UgYXMgJworICAgICAgICAgICAgICAgICdpbmNsdWRlZCBpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAnInVuaWNvZGVkYXRhIiBtb2R1bGUuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdJZGVudGlmaWVycyBhcmUgdW5saW1pdGVkIGluIGxlbmd0aC4gIENhc2UgaXMgc2lnbmlmaWNhbnQuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICBpZGVudGlmaWVyICAgOjo9IHhpZF9zdGFydCB4aWRfY29udGludWUqXG4nCisgICAgICAgICAgICAgICAgJyAgIGlkX3N0YXJ0ICAgICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGdlbmVyYWwgY2F0ZWdvcmllcyBMdSwgJworICAgICAgICAgICAgICAgICdMbCwgTHQsIExtLCBMbywgTmwsIHRoZSB1bmRlcnNjb3JlLCBhbmQgY2hhcmFjdGVycyB3aXRoIHRoZSAnCisgICAgICAgICAgICAgICAgJ090aGVyX0lEX1N0YXJ0IHByb3BlcnR5PlxuJworICAgICAgICAgICAgICAgICcgICBpZF9jb250aW51ZSAgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBpZF9zdGFydCwgcGx1cyAnCisgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgaW4gdGhlIGNhdGVnb3JpZXMgTW4sIE1jLCBOZCwgUGMgYW5kIG90aGVycyB3aXRoICcKKyAgICAgICAgICAgICAgICAndGhlIE90aGVyX0lEX0NvbnRpbnVlIHByb3BlcnR5PlxuJworICAgICAgICAgICAgICAgICcgICB4aWRfc3RhcnQgICAgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBpZF9zdGFydCB3aG9zZSBORktDICcKKyAgICAgICAgICAgICAgICAnbm9ybWFsaXphdGlvbiBpcyBpbiAiaWRfc3RhcnQgeGlkX2NvbnRpbnVlKiI+XG4nCisgICAgICAgICAgICAgICAgJyAgIHhpZF9jb250aW51ZSA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX2NvbnRpbnVlIHdob3NlIE5GS0MgJworICAgICAgICAgICAgICAgICdub3JtYWxpemF0aW9uIGlzIGluICJpZF9jb250aW51ZSoiPlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIFVuaWNvZGUgY2F0ZWdvcnkgY29kZXMgbWVudGlvbmVkIGFib3ZlIHN0YW5kIGZvcjpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKkx1KiAtIHVwcGVyY2FzZSBsZXR0ZXJzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpMbCogLSBsb3dlcmNhc2UgbGV0dGVyc1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTHQqIC0gdGl0bGVjYXNlIGxldHRlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKkxtKiAtIG1vZGlmaWVyIGxldHRlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKkxvKiAtIG90aGVyIGxldHRlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKk5sKiAtIGxldHRlciBudW1iZXJzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpNbiogLSBub25zcGFjaW5nIG1hcmtzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpNYyogLSBzcGFjaW5nIGNvbWJpbmluZyBtYXJrc1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTmQqIC0gZGVjaW1hbCBudW1iZXJzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpQYyogLSBjb25uZWN0b3IgcHVuY3R1YXRpb25zXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpPdGhlcl9JRF9TdGFydCogLSBleHBsaWNpdCBsaXN0IG9mIGNoYXJhY3RlcnMgaW4gJworICAgICAgICAgICAgICAgICdQcm9wTGlzdC50eHQgdG9cbicKKyAgICAgICAgICAgICAgICAnICBzdXBwb3J0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpPdGhlcl9JRF9Db250aW51ZSogLSBsaWtld2lzZVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQWxsIGlkZW50aWZpZXJzIGFyZSBjb252ZXJ0ZWQgaW50byB0aGUgbm9ybWFsIGZvcm0gTkZLQyB3aGlsZSAnCisgICAgICAgICAgICAgICAgJ3BhcnNpbmc7XG4nCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gb2YgaWRlbnRpZmllcnMgaXMgYmFzZWQgb24gTkZLQy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0Egbm9uLW5vcm1hdGl2ZSBIVE1MIGZpbGUgbGlzdGluZyBhbGwgdmFsaWQgaWRlbnRpZmllciAnCisgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgZm9yXG4nCisgICAgICAgICAgICAgICAgJ1VuaWNvZGUgNC4xIGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5kY2wuaHBpLnVuaS1cbicKKyAgICAgICAgICAgICAgICAncG90c2RhbS5kZS9ob21lL2xvZXdpcy90YWJsZS0zMTMxLmh0bWwuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnS2V5d29yZHNcbicKKyAgICAgICAgICAgICAgICAnPT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnMgYXJlIHVzZWQgYXMgcmVzZXJ2ZWQgd29yZHMsIG9yICcKKyAgICAgICAgICAgICAgICAnKmtleXdvcmRzKiBvZlxuJworICAgICAgICAgICAgICAgICd0aGUgbGFuZ3VhZ2UsIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBvcmRpbmFyeSBpZGVudGlmaWVycy4gICcKKyAgICAgICAgICAgICAgICAnVGhleSBtdXN0XG4nCisgICAgICAgICAgICAgICAgJ2JlIHNwZWxsZWQgZXhhY3RseSBhcyB3cml0dGVuIGhlcmU6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICBGYWxzZSAgICAgIGNsYXNzICAgICAgZmluYWxseSAgICBpcyAgICAgICAgIHJldHVyblxuJworICAgICAgICAgICAgICAgICcgICBOb25lICAgICAgIGNvbnRpbnVlICAgZm9yICAgICAgICBsYW1iZGEgICAgIHRyeVxuJworICAgICAgICAgICAgICAgICcgICBUcnVlICAgICAgIGRlZiAgICAgICAgZnJvbSAgICAgICBub25sb2NhbCAgIHdoaWxlXG4nCisgICAgICAgICAgICAgICAgJyAgIGFuZCAgICAgICAgZGVsICAgICAgICBnbG9iYWwgICAgIG5vdCAgICAgICAgd2l0aFxuJworICAgICAgICAgICAgICAgICcgICBhcyAgICAgICAgIGVsaWYgICAgICAgaWYgICAgICAgICBvciAgICAgICAgIHlpZWxkXG4nCisgICAgICAgICAgICAgICAgJyAgIGFzc2VydCAgICAgZWxzZSAgICAgICBpbXBvcnQgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAnICAgYnJlYWsgICAgICBleGNlcHQgICAgIGluICAgICAgICAgcmFpc2VcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdSZXNlcnZlZCBjbGFzc2VzIG9mIGlkZW50aWZpZXJzXG4nCisgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0NlcnRhaW4gY2xhc3NlcyBvZiBpZGVudGlmaWVycyAoYmVzaWRlcyBrZXl3b3JkcykgaGF2ZSAnCisgICAgICAgICAgICAgICAgJ3NwZWNpYWxcbicKKyAgICAgICAgICAgICAgICAnbWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiAnCisgICAgICAgICAgICAgICAgJ2xlYWRpbmcgYW5kXG4nCisgICAgICAgICAgICAgICAgJ3RyYWlsaW5nIHVuZGVyc2NvcmUgY2hhcmFjdGVyczpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyJfKiJcbicKKyAgICAgICAgICAgICAgICAnICAgTm90IGltcG9ydGVkIGJ5ICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIuICBUaGUgc3BlY2lhbCAnCisgICAgICAgICAgICAgICAgJ2lkZW50aWZpZXIgIl8iXG4nCisgICAgICAgICAgICAgICAgJyAgIGlzIHVzZWQgaW4gdGhlIGludGVyYWN0aXZlIGludGVycHJldGVyIHRvIHN0b3JlIHRoZSByZXN1bHQgJworICAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAnICAgbGFzdCBldmFsdWF0aW9uOyBpdCBpcyBzdG9yZWQgaW4gdGhlICJidWlsdGlucyIgbW9kdWxlLiAgJworICAgICAgICAgICAgICAgICdXaGVuIG5vdFxuJworICAgICAgICAgICAgICAgICcgICBpbiBpbnRlcmFjdGl2ZSBtb2RlLCAiXyIgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgaXMgbm90ICcKKyAgICAgICAgICAgICAgICAnZGVmaW5lZC5cbicKKyAgICAgICAgICAgICAgICAnICAgU2VlIHNlY3Rpb24gVGhlIGltcG9ydCBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICBOb3RlOiBUaGUgbmFtZSAiXyIgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoXG4nCisgICAgICAgICAgICAgICAgJyAgICAgaW50ZXJuYXRpb25hbGl6YXRpb247IHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciAnCisgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICcgICAgICJnZXR0ZXh0IiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyAnCisgICAgICAgICAgICAgICAgJ2NvbnZlbnRpb24uXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICciX18qX18iXG4nCisgICAgICAgICAgICAgICAgJyAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLiBUaGVzZSBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgJworICAgICAgICAgICAgICAgICdpbnRlcnByZXRlclxuJworICAgICAgICAgICAgICAgICcgICBhbmQgaXRzIGltcGxlbWVudGF0aW9uIChpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkpLiAgJworICAgICAgICAgICAgICAgICdDdXJyZW50XG4nCisgICAgICAgICAgICAgICAgJyAgIHN5c3RlbSBuYW1lcyBhcmUgZGlzY3Vzc2VkIGluIHRoZSBTcGVjaWFsIG1ldGhvZCBuYW1lcyAnCisgICAgICAgICAgICAgICAgJ3NlY3Rpb24gYW5kXG4nCisgICAgICAgICAgICAgICAgJyAgIGVsc2V3aGVyZS4gIE1vcmUgd2lsbCBsaWtlbHkgYmUgZGVmaW5lZCBpbiBmdXR1cmUgdmVyc2lvbnMgJworICAgICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICAgICcgICBQeXRob24uICAqQW55KiB1c2Ugb2YgIl9fKl9fIiBuYW1lcywgaW4gYW55IGNvbnRleHQsIHRoYXQgJworICAgICAgICAgICAgICAgICdkb2VzIG5vdFxuJworICAgICAgICAgICAgICAgICcgICBmb2xsb3cgZXhwbGljaXRseSBkb2N1bWVudGVkIHVzZSwgaXMgc3ViamVjdCB0byBicmVha2FnZSAnCisgICAgICAgICAgICAgICAgJ3dpdGhvdXRcbicKKyAgICAgICAgICAgICAgICAnICAgd2FybmluZy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyJfXyoiXG4nCisgICAgICAgICAgICAgICAgJyAgIENsYXNzLXByaXZhdGUgbmFtZXMuICBOYW1lcyBpbiB0aGlzIGNhdGVnb3J5LCB3aGVuIHVzZWQgJworICAgICAgICAgICAgICAgICd3aXRoaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgJyAgIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSAnCisgICAgICAgICAgICAgICAgJ21hbmdsZWQgZm9ybVxuJworICAgICAgICAgICAgICAgICcgICB0byBoZWxwIGF2b2lkIG5hbWUgY2xhc2hlcyBiZXR3ZWVuICJwcml2YXRlIiBhdHRyaWJ1dGVzIG9mICcKKyAgICAgICAgICAgICAgICAnYmFzZSBhbmRcbicKKyAgICAgICAgICAgICAgICAnICAgZGVyaXZlZCBjbGFzc2VzLiBTZWUgc2VjdGlvbiBJZGVudGlmaWVycyAoTmFtZXMpLlxuJywKKyAnaWYnOiAnXG4nCisgICAgICAgJ1RoZSAiaWYiIHN0YXRlbWVudFxuJworICAgICAgICcqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAnXG4nCisgICAgICAgJ1RoZSAiaWYiIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG4nCisgICAgICAgJ1xuJworICAgICAgICcgICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4nCisgICAgICAgJyAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4nCisgICAgICAgJyAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICdcbicKKyAgICAgICAnSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zICcKKyAgICAgICAnb25lXG4nCisgICAgICAgJ2J5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gQm9vbGVhbiBvcGVyYXRpb25zXG4nCisgICAgICAgJ2ZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuJworICAgICAgICcoYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlICJpZiIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG4nCisgICAgICAgJ0lmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWZcbicKKyAgICAgICAncHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nLAorICdpbWFnaW5hcnknOiAnXG4nCisgICAgICAgICAgICAgICdJbWFnaW5hcnkgbGl0ZXJhbHNcbicKKyAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdJbWFnaW5hcnkgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgJworICAgICAgICAgICAgICAnZGVmaW5pdGlvbnM6XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyAgIGltYWdudW1iZXIgOjo9IChmbG9hdG51bWJlciB8IGludHBhcnQpICgiaiIgfCAiSiIpXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0FuIGltYWdpbmFyeSBsaXRlcmFsIHlpZWxkcyBhIGNvbXBsZXggbnVtYmVyIHdpdGggYSByZWFsIHBhcnQgJworICAgICAgICAgICAgICAnb2YgMC4wLlxuJworICAgICAgICAgICAgICAnQ29tcGxleCBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBhcyBhIHBhaXIgb2YgZmxvYXRpbmcgcG9pbnQgJworICAgICAgICAgICAgICAnbnVtYmVyc1xuJworICAgICAgICAgICAgICAnYW5kIGhhdmUgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIG9uIHRoZWlyIHJhbmdlLiAgVG8gY3JlYXRlIGEgJworICAgICAgICAgICAgICAnY29tcGxleFxuJworICAgICAgICAgICAgICAnbnVtYmVyIHdpdGggYSBub256ZXJvIHJlYWwgcGFydCwgYWRkIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvICcKKyAgICAgICAgICAgICAgJ2l0LFxuJworICAgICAgICAgICAgICAnZS5nLiwgIigzKzRqKSIuICBTb21lIGV4YW1wbGVzIG9mIGltYWdpbmFyeSBsaXRlcmFsczpcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnICAgMy4xNGogICAxMC5qICAgIDEwaiAgICAgLjAwMWogICAxZTEwMGogIDMuMTRlLTEwalxuJywKKyAnaW1wb3J0JzogJ1xuJworICAgICAgICAgICAnVGhlICJpbXBvcnQiIHN0YXRlbWVudFxuJworICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBpbXBvcnRfc3RtdCAgICAgOjo9ICJpbXBvcnQiIG1vZHVsZSBbImFzIiBuYW1lXSAoICIsIiBtb2R1bGUgJworICAgICAgICAgICAnWyJhcyIgbmFtZV0gKSpcbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgaWRlbnRpZmllciAnCisgICAgICAgICAgICdbImFzIiBuYW1lXVxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSpcbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgIigiICcKKyAgICAgICAgICAgJ2lkZW50aWZpZXIgWyJhcyIgbmFtZV1cbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAoICIsIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdICkqIFsiLCJdICIpIlxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgIHwgImZyb20iIG1vZHVsZSAiaW1wb3J0IiAiKiJcbicKKyAgICAgICAgICAgJyAgIG1vZHVsZSAgICAgICAgICA6Oj0gKGlkZW50aWZpZXIgIi4iKSogaWRlbnRpZmllclxuJworICAgICAgICAgICAnICAgcmVsYXRpdmVfbW9kdWxlIDo6PSAiLiIqIG1vZHVsZSB8ICIuIitcbicKKyAgICAgICAgICAgJyAgIG5hbWUgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgYmFzaWMgaW1wb3J0IHN0YXRlbWVudCAobm8gImZyb20iIGNsYXVzZSkgaXMgZXhlY3V0ZWQgaW4gdHdvXG4nCisgICAgICAgICAgICdzdGVwczpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnMS4gZmluZCBhIG1vZHVsZSwgbG9hZGluZyBhbmQgaW5pdGlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcyLiBkZWZpbmUgYSBuYW1lIG9yIG5hbWVzIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBzY29wZVxuJworICAgICAgICAgICAnICAgd2hlcmUgdGhlICJpbXBvcnQiIHN0YXRlbWVudCBvY2N1cnMuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1doZW4gdGhlIHN0YXRlbWVudCBjb250YWlucyBtdWx0aXBsZSBjbGF1c2VzIChzZXBhcmF0ZWQgYnkgY29tbWFzKSAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ3R3byBzdGVwcyBhcmUgY2FycmllZCBvdXQgc2VwYXJhdGVseSBmb3IgZWFjaCBjbGF1c2UsIGp1c3QgYXMgJworICAgICAgICAgICAndGhvdWdoXG4nCisgICAgICAgICAgICd0aGUgY2xhdXNlcyBoYWQgYmVlbiBzZXBhcmF0ZWQgb3V0IGludG8gaW5kaXZpZHVhbCBpbXBvcnQgJworICAgICAgICAgICAnc3RhdGVtZW50cy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGRldGFpbHMgb2YgdGhlIGZpcnN0IHN0ZXAsIGZpbmRpbmcgYW5kIGxvYWRpbmcgbW9kdWxlcyBhcmVcbicKKyAgICAgICAgICAgJ2Rlc2NyaWJlZCBpbiBncmVhdGVyIGRldGFpbCBpbiB0aGUgc2VjdGlvbiBvbiB0aGUgaW1wb3J0IHN5c3RlbSwgJworICAgICAgICAgICAnd2hpY2hcbicKKyAgICAgICAgICAgJ2Fsc28gZGVzY3JpYmVzIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHBhY2thZ2VzIGFuZCBtb2R1bGVzIHRoYXQgY2FuICcKKyAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICdpbXBvcnRlZCwgYXMgd2VsbCBhcyBhbGwgdGhlIGhvb2tzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnaW1wb3J0IHN5c3RlbS4gTm90ZSB0aGF0IGZhaWx1cmVzIGluIHRoaXMgc3RlcCBtYXkgaW5kaWNhdGUgJworICAgICAgICAgICAnZWl0aGVyXG4nCisgICAgICAgICAgICd0aGF0IHRoZSBtb2R1bGUgY291bGQgbm90IGJlIGxvY2F0ZWQsICpvciogdGhhdCBhbiBlcnJvciBvY2N1cnJlZFxuJworICAgICAgICAgICAnd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBtb2R1bGUsIHdoaWNoIGluY2x1ZGVzIGV4ZWN1dGlvbiBvZiB0aGVcbicKKyAgICAgICAgICAgIm1vZHVsZSdzIGNvZGUuXG4iCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0lmIHRoZSByZXF1ZXN0ZWQgbW9kdWxlIGlzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHksIGl0IHdpbGwgYmUgJworICAgICAgICAgICAnbWFkZVxuJworICAgICAgICAgICAnYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgaW4gb25lIG9mIHRocmVlIHdheXM6XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyogSWYgdGhlIG1vZHVsZSBuYW1lIGlzIGZvbGxvd2VkIGJ5ICJhcyIsIHRoZW4gdGhlIG5hbWUgZm9sbG93aW5nXG4nCisgICAgICAgICAgICcgICJhcyIgaXMgYm91bmQgZGlyZWN0bHkgdG8gdGhlIGltcG9ydGVkIG1vZHVsZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBJZiBubyBvdGhlciBuYW1lIGlzIHNwZWNpZmllZCwgYW5kIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgJworICAgICAgICAgICAnYVxuJworICAgICAgICAgICAiICB0b3AgbGV2ZWwgbW9kdWxlLCB0aGUgbW9kdWxlJ3MgbmFtZSBpcyBib3VuZCBpbiB0aGUgbG9jYWwgIgorICAgICAgICAgICAnbmFtZXNwYWNlXG4nCisgICAgICAgICAgICcgIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBpbXBvcnRlZCBtb2R1bGVcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBJZiB0aGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkIGlzICpub3QqIGEgdG9wIGxldmVsIG1vZHVsZSwgdGhlbiAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJyAgbmFtZSBvZiB0aGUgdG9wIGxldmVsIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgbW9kdWxlIGlzIGJvdW5kICcKKyAgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgICcgIHRoZSBsb2NhbCBuYW1lc3BhY2UgYXMgYSByZWZlcmVuY2UgdG8gdGhlIHRvcCBsZXZlbCBwYWNrYWdlLiAnCisgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgJyAgaW1wb3J0ZWQgbW9kdWxlIG11c3QgYmUgYWNjZXNzZWQgdXNpbmcgaXRzIGZ1bGwgcXVhbGlmaWVkIG5hbWVcbicKKyAgICAgICAgICAgJyAgcmF0aGVyIHRoYW4gZGlyZWN0bHlcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICJmcm9tIiBmb3JtIHVzZXMgYSBzbGlnaHRseSBtb3JlIGNvbXBsZXggcHJvY2VzczpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnMS4gZmluZCB0aGUgbW9kdWxlIHNwZWNpZmllZCBpbiB0aGUgImZyb20iIGNsYXVzZSwgbG9hZGluZyBhbmRcbicKKyAgICAgICAgICAgJyAgIGluaXRpYWxpemluZyBpdCBpZiBuZWNlc3Nhcnk7XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJzIuIGZvciBlYWNoIG9mIHRoZSBpZGVudGlmaWVycyBzcGVjaWZpZWQgaW4gdGhlICJpbXBvcnQiIGNsYXVzZXM6XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIDEuIGNoZWNrIGlmIHRoZSBpbXBvcnRlZCBtb2R1bGUgaGFzIGFuIGF0dHJpYnV0ZSBieSB0aGF0IG5hbWVcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgMi4gaWYgbm90LCBhdHRlbXB0IHRvIGltcG9ydCBhIHN1Ym1vZHVsZSB3aXRoIHRoYXQgbmFtZSBhbmQgJworICAgICAgICAgICAndGhlblxuJworICAgICAgICAgICAnICAgICAgY2hlY2sgdGhlIGltcG9ydGVkIG1vZHVsZSBhZ2FpbiBmb3IgdGhhdCBhdHRyaWJ1dGVcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgMy4gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQsICJJbXBvcnRFcnJvciIgaXMgcmFpc2VkLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICA0LiBvdGhlcndpc2UsIGEgcmVmZXJlbmNlIHRvIHRoYXQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBsb2NhbFxuJworICAgICAgICAgICAnICAgICAgbmFtZXNwYWNlLCB1c2luZyB0aGUgbmFtZSBpbiB0aGUgImFzIiBjbGF1c2UgaWYgaXQgaXMgJworICAgICAgICAgICAncHJlc2VudCxcbicKKyAgICAgICAgICAgJyAgICAgIG90aGVyd2lzZSB1c2luZyB0aGUgYXR0cmlidXRlIG5hbWVcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnRXhhbXBsZXM6XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGltcG9ydCBmb28gICAgICAgICAgICAgICAgICMgZm9vIGltcG9ydGVkIGFuZCBib3VuZCBsb2NhbGx5XG4nCisgICAgICAgICAgICcgICBpbXBvcnQgZm9vLmJhci5iYXogICAgICAgICAjIGZvby5iYXIuYmF6IGltcG9ydGVkLCBmb28gYm91bmQgJworICAgICAgICAgICAnbG9jYWxseVxuJworICAgICAgICAgICAnICAgaW1wb3J0IGZvby5iYXIuYmF6IGFzIGZiYiAgIyBmb28uYmFyLmJheiBpbXBvcnRlZCBhbmQgYm91bmQgYXMgJworICAgICAgICAgICAnZmJiXG4nCisgICAgICAgICAgICcgICBmcm9tIGZvby5iYXIgaW1wb3J0IGJheiAgICAjIGZvby5iYXIuYmF6IGltcG9ydGVkIGFuZCBib3VuZCBhcyAnCisgICAgICAgICAgICdiYXpcbicKKyAgICAgICAgICAgJyAgIGZyb20gZm9vIGltcG9ydCBhdHRyICAgICAgICMgZm9vIGltcG9ydGVkIGFuZCBmb28uYXR0ciBib3VuZCBhcyAnCisgICAgICAgICAgICdhdHRyXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0lmIHRoZSBsaXN0IG9mIGlkZW50aWZpZXJzIGlzIHJlcGxhY2VkIGJ5IGEgc3RhciAoIlwnKlwnIiksIGFsbCAnCisgICAgICAgICAgICdwdWJsaWNcbicKKyAgICAgICAgICAgJ25hbWVzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSBhcmUgYm91bmQgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdzY29wZSB3aGVyZSB0aGUgImltcG9ydCIgc3RhdGVtZW50IG9jY3Vycy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICpwdWJsaWMgbmFtZXMqIGRlZmluZWQgYnkgYSBtb2R1bGUgYXJlIGRldGVybWluZWQgYnkgY2hlY2tpbmcgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdtb2R1bGVcJ3MgbmFtZXNwYWNlIGZvciBhIHZhcmlhYmxlIG5hbWVkICJfX2FsbF9fIjsgaWYgZGVmaW5lZCwgaXQgJworICAgICAgICAgICAnbXVzdFxuJworICAgICAgICAgICAnYmUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBuYW1lcyBkZWZpbmVkIG9yIGltcG9ydGVkIGJ5ICcKKyAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgJ21vZHVsZS4gIFRoZSBuYW1lcyBnaXZlbiBpbiAiX19hbGxfXyIgYXJlIGFsbCBjb25zaWRlcmVkIHB1YmxpYyAnCisgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgJ2FyZSByZXF1aXJlZCB0byBleGlzdC4gIElmICJfX2FsbF9fIiBpcyBub3QgZGVmaW5lZCwgdGhlIHNldCBvZiAnCisgICAgICAgICAgICdwdWJsaWNcbicKKyAgICAgICAgICAgIm5hbWVzIGluY2x1ZGVzIGFsbCBuYW1lcyBmb3VuZCBpbiB0aGUgbW9kdWxlJ3MgbmFtZXNwYWNlIHdoaWNoIGRvICIKKyAgICAgICAgICAgJ25vdFxuJworICAgICAgICAgICAnYmVnaW4gd2l0aCBhbiB1bmRlcnNjb3JlIGNoYXJhY3RlciAoIlwnX1wnIikuICAiX19hbGxfXyIgc2hvdWxkICcKKyAgICAgICAgICAgJ2NvbnRhaW5cbicKKyAgICAgICAgICAgJ3RoZSBlbnRpcmUgcHVibGljIEFQSS4gSXQgaXMgaW50ZW5kZWQgdG8gYXZvaWQgYWNjaWRlbnRhbGx5ICcKKyAgICAgICAgICAgJ2V4cG9ydGluZ1xuJworICAgICAgICAgICAnaXRlbXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIEFQSSAoc3VjaCBhcyBsaWJyYXJ5IG1vZHVsZXMgd2hpY2ggJworICAgICAgICAgICAnd2VyZVxuJworICAgICAgICAgICAnaW1wb3J0ZWQgYW5kIHVzZWQgd2l0aGluIHRoZSBtb2R1bGUpLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiIC0tLSBpcyAnCisgICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgICdhbGxvd2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuICBBdHRlbXB0aW5nIHRvIHVzZSBpdCBpbiBjbGFzcyBvclxuJworICAgICAgICAgICAnZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2lsbCByYWlzZSBhICJTeW50YXhFcnJvciIuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1doZW4gc3BlY2lmeWluZyB3aGF0IG1vZHVsZSB0byBpbXBvcnQgeW91IGRvIG5vdCBoYXZlIHRvIHNwZWNpZnkgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdhYnNvbHV0ZSBuYW1lIG9mIHRoZSBtb2R1bGUuIFdoZW4gYSBtb2R1bGUgb3IgcGFja2FnZSBpcyAnCisgICAgICAgICAgICdjb250YWluZWRcbicKKyAgICAgICAgICAgJ3dpdGhpbiBhbm90aGVyIHBhY2thZ2UgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBhIHJlbGF0aXZlIGltcG9ydCAnCisgICAgICAgICAgICd3aXRoaW5cbicKKyAgICAgICAgICAgJ3RoZSBzYW1lIHRvcCBwYWNrYWdlIHdpdGhvdXQgaGF2aW5nIHRvIG1lbnRpb24gdGhlIHBhY2thZ2UgbmFtZS4gJworICAgICAgICAgICAnQnlcbicKKyAgICAgICAgICAgJ3VzaW5nIGxlYWRpbmcgZG90cyBpbiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBvciBwYWNrYWdlIGFmdGVyICJmcm9tIiAnCisgICAgICAgICAgICd5b3VcbicKKyAgICAgICAgICAgJ2NhbiBzcGVjaWZ5IGhvdyBoaWdoIHRvIHRyYXZlcnNlIHVwIHRoZSBjdXJyZW50IHBhY2thZ2UgaGllcmFyY2h5XG4nCisgICAgICAgICAgICd3aXRob3V0IHNwZWNpZnlpbmcgZXhhY3QgbmFtZXMuIE9uZSBsZWFkaW5nIGRvdCBtZWFucyB0aGUgY3VycmVudFxuJworICAgICAgICAgICAncGFja2FnZSB3aGVyZSB0aGUgbW9kdWxlIG1ha2luZyB0aGUgaW1wb3J0IGV4aXN0cy4gVHdvIGRvdHMgbWVhbnMgJworICAgICAgICAgICAndXBcbicKKyAgICAgICAgICAgJ29uZSBwYWNrYWdlIGxldmVsLiBUaHJlZSBkb3RzIGlzIHVwIHR3byBsZXZlbHMsIGV0Yy4gU28gaWYgeW91ICcKKyAgICAgICAgICAgJ2V4ZWN1dGVcbicKKyAgICAgICAgICAgJyJmcm9tIC4gaW1wb3J0IG1vZCIgZnJvbSBhIG1vZHVsZSBpbiB0aGUgInBrZyIgcGFja2FnZSB0aGVuIHlvdSAnCisgICAgICAgICAgICd3aWxsXG4nCisgICAgICAgICAgICdlbmQgdXAgaW1wb3J0aW5nICJwa2cubW9kIi4gSWYgeW91IGV4ZWN1dGUgImZyb20gLi5zdWJwa2cyIGltcG9ydCAnCisgICAgICAgICAgICdtb2QiXG4nCisgICAgICAgICAgICdmcm9tIHdpdGhpbiAicGtnLnN1YnBrZzEiIHlvdSB3aWxsIGltcG9ydCAicGtnLnN1YnBrZzIubW9kIi4gVGhlXG4nCisgICAgICAgICAgICdzcGVjaWZpY2F0aW9uIGZvciByZWxhdGl2ZSBpbXBvcnRzIGlzIGNvbnRhaW5lZCB3aXRoaW4gKipQRVAgJworICAgICAgICAgICAnMzI4KiouXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyJpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIiBpcyBwcm92aWRlZCB0byBzdXBwb3J0IGFwcGxpY2F0aW9ucyAnCisgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICdkZXRlcm1pbmUgZHluYW1pY2FsbHkgdGhlIG1vZHVsZXMgdG8gYmUgbG9hZGVkLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0Z1dHVyZSBzdGF0ZW1lbnRzXG4nCisgICAgICAgICAgICc9PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBICpmdXR1cmUgc3RhdGVtZW50KiBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgY29tcGlsZXIgdGhhdCBhICcKKyAgICAgICAgICAgJ3BhcnRpY3VsYXJcbicKKyAgICAgICAgICAgJ21vZHVsZSBzaG91bGQgYmUgY29tcGlsZWQgdXNpbmcgc3ludGF4IG9yIHNlbWFudGljcyB0aGF0IHdpbGwgYmVcbicKKyAgICAgICAgICAgJ2F2YWlsYWJsZSBpbiBhIHNwZWNpZmllZCBmdXR1cmUgcmVsZWFzZSBvZiBQeXRob24gd2hlcmUgdGhlICcKKyAgICAgICAgICAgJ2ZlYXR1cmVcbicKKyAgICAgICAgICAgJ2JlY29tZXMgc3RhbmRhcmQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBmdXR1cmUgc3RhdGVtZW50IGlzIGludGVuZGVkIHRvIGVhc2UgbWlncmF0aW9uIHRvIGZ1dHVyZSAnCisgICAgICAgICAgICd2ZXJzaW9uc1xuJworICAgICAgICAgICAnb2YgUHl0aG9uIHRoYXQgaW50cm9kdWNlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZS4gICcKKyAgICAgICAgICAgJ0l0XG4nCisgICAgICAgICAgICdhbGxvd3MgdXNlIG9mIHRoZSBuZXcgZmVhdHVyZXMgb24gYSBwZXItbW9kdWxlIGJhc2lzIGJlZm9yZSB0aGVcbicKKyAgICAgICAgICAgJ3JlbGVhc2UgaW4gd2hpY2ggdGhlIGZlYXR1cmUgYmVjb21lcyBzdGFuZGFyZC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgZnV0dXJlX3N0YXRlbWVudCA6Oj0gImZyb20iICJfX2Z1dHVyZV9fIiAiaW1wb3J0IiBmZWF0dXJlIFsiYXMiICcKKyAgICAgICAgICAgJ25hbWVdXG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKlxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiICIoIiBmZWF0dXJlICcKKyAgICAgICAgICAgJ1siYXMiIG5hbWVdXG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKiBbIiwiXSAiKSJcbicKKyAgICAgICAgICAgJyAgIGZlYXR1cmUgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbicKKyAgICAgICAgICAgJyAgIG5hbWUgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQSBmdXR1cmUgc3RhdGVtZW50IG11c3QgYXBwZWFyIG5lYXIgdGhlIHRvcCBvZiB0aGUgbW9kdWxlLiAgVGhlICcKKyAgICAgICAgICAgJ29ubHlcbicKKyAgICAgICAgICAgJ2xpbmVzIHRoYXQgY2FuIGFwcGVhciBiZWZvcmUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZTpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiB0aGUgbW9kdWxlIGRvY3N0cmluZyAoaWYgYW55KSxcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBjb21tZW50cyxcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBibGFuayBsaW5lcywgYW5kXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyogb3RoZXIgZnV0dXJlIHN0YXRlbWVudHMuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBmZWF0dXJlcyByZWNvZ25pemVkIGJ5IFB5dGhvbiAzLjAgYXJlICJhYnNvbHV0ZV9pbXBvcnQiLFxuJworICAgICAgICAgICAnImRpdmlzaW9uIiwgImdlbmVyYXRvcnMiLCAidW5pY29kZV9saXRlcmFscyIsICJwcmludF9mdW5jdGlvbiIsXG4nCisgICAgICAgICAgICcibmVzdGVkX3Njb3BlcyIgYW5kICJ3aXRoX3N0YXRlbWVudCIuICBUaGV5IGFyZSBhbGwgcmVkdW5kYW50ICcKKyAgICAgICAgICAgJ2JlY2F1c2VcbicKKyAgICAgICAgICAgJ3RoZXkgYXJlIGFsd2F5cyBlbmFibGVkLCBhbmQgb25seSBrZXB0IGZvciBiYWNrd2FyZHMgJworICAgICAgICAgICAnY29tcGF0aWJpbGl0eS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQSBmdXR1cmUgc3RhdGVtZW50IGlzIHJlY29nbml6ZWQgYW5kIHRyZWF0ZWQgc3BlY2lhbGx5IGF0IGNvbXBpbGVcbicKKyAgICAgICAgICAgJ3RpbWU6IENoYW5nZXMgdG8gdGhlIHNlbWFudGljcyBvZiBjb3JlIGNvbnN0cnVjdHMgYXJlIG9mdGVuXG4nCisgICAgICAgICAgICdpbXBsZW1lbnRlZCBieSBnZW5lcmF0aW5nIGRpZmZlcmVudCBjb2RlLiAgSXQgbWF5IGV2ZW4gYmUgdGhlICcKKyAgICAgICAgICAgJ2Nhc2VcbicKKyAgICAgICAgICAgJ3RoYXQgYSBuZXcgZmVhdHVyZSBpbnRyb2R1Y2VzIG5ldyBpbmNvbXBhdGlibGUgc3ludGF4IChzdWNoIGFzIGEgJworICAgICAgICAgICAnbmV3XG4nCisgICAgICAgICAgICdyZXNlcnZlZCB3b3JkKSwgaW4gd2hpY2ggY2FzZSB0aGUgY29tcGlsZXIgbWF5IG5lZWQgdG8gcGFyc2UgdGhlXG4nCisgICAgICAgICAgICdtb2R1bGUgZGlmZmVyZW50bHkuICBTdWNoIGRlY2lzaW9ucyBjYW5ub3QgYmUgcHVzaGVkIG9mZiB1bnRpbFxuJworICAgICAgICAgICAncnVudGltZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnRm9yIGFueSBnaXZlbiByZWxlYXNlLCB0aGUgY29tcGlsZXIga25vd3Mgd2hpY2ggZmVhdHVyZSBuYW1lcyAnCisgICAgICAgICAgICdoYXZlXG4nCisgICAgICAgICAgICdiZWVuIGRlZmluZWQsIGFuZCByYWlzZXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBmdXR1cmUgJworICAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgICdjb250YWlucyBhIGZlYXR1cmUgbm90IGtub3duIHRvIGl0LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgZGlyZWN0IHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYW55IGltcG9ydCAnCisgICAgICAgICAgICdzdGF0ZW1lbnQ6XG4nCisgICAgICAgICAgICd0aGVyZSBpcyBhIHN0YW5kYXJkIG1vZHVsZSAiX19mdXR1cmVfXyIsIGRlc2NyaWJlZCBsYXRlciwgYW5kIGl0ICcKKyAgICAgICAgICAgJ3dpbGxcbicKKyAgICAgICAgICAgJ2JlIGltcG9ydGVkIGluIHRoZSB1c3VhbCB3YXkgYXQgdGhlIHRpbWUgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXNcbicKKyAgICAgICAgICAgJ2V4ZWN1dGVkLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgaW50ZXJlc3RpbmcgcnVudGltZSBzZW1hbnRpY3MgZGVwZW5kIG9uIHRoZSBzcGVjaWZpYyBmZWF0dXJlXG4nCisgICAgICAgICAgICdlbmFibGVkIGJ5IHRoZSBmdXR1cmUgc3RhdGVtZW50LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdOb3RlIHRoYXQgdGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoZSBzdGF0ZW1lbnQ6XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGltcG9ydCBfX2Z1dHVyZV9fIFthcyBuYW1lXVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICJUaGF0IGlzIG5vdCBhIGZ1dHVyZSBzdGF0ZW1lbnQ7IGl0J3MgYW4gb3JkaW5hcnkgaW1wb3J0IHN0YXRlbWVudCAiCisgICAgICAgICAgICd3aXRoXG4nCisgICAgICAgICAgICdubyBzcGVjaWFsIHNlbWFudGljcyBvciBzeW50YXggcmVzdHJpY3Rpb25zLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdDb2RlIGNvbXBpbGVkIGJ5IGNhbGxzIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImV4ZWMoKSIgYW5kXG4nCisgICAgICAgICAgICciY29tcGlsZSgpIiB0aGF0IG9jY3VyIGluIGEgbW9kdWxlICJNIiBjb250YWluaW5nIGEgZnV0dXJlICcKKyAgICAgICAgICAgJ3N0YXRlbWVudFxuJworICAgICAgICAgICAnd2lsbCwgYnkgZGVmYXVsdCwgdXNlIHRoZSBuZXcgc3ludGF4IG9yIHNlbWFudGljcyBhc3NvY2lhdGVkIHdpdGggJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdmdXR1cmUgc3RhdGVtZW50LiAgVGhpcyBjYW4gYmUgY29udHJvbGxlZCBieSBvcHRpb25hbCBhcmd1bWVudHMgJworICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgJyJjb21waWxlKCkiIC0tLSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmdW5jdGlvbiBmb3IgJworICAgICAgICAgICAnZGV0YWlscy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQSBmdXR1cmUgc3RhdGVtZW50IHR5cGVkIGF0IGFuIGludGVyYWN0aXZlIGludGVycHJldGVyIHByb21wdCAnCisgICAgICAgICAgICd3aWxsXG4nCisgICAgICAgICAgICd0YWtlIGVmZmVjdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGludGVycHJldGVyIHNlc3Npb24uICBJZiBhblxuJworICAgICAgICAgICAnaW50ZXJwcmV0ZXIgaXMgc3RhcnRlZCB3aXRoIHRoZSAiLWkiIG9wdGlvbiwgaXMgcGFzc2VkIGEgc2NyaXB0ICcKKyAgICAgICAgICAgJ25hbWVcbicKKyAgICAgICAgICAgJ3RvIGV4ZWN1dGUsIGFuZCB0aGUgc2NyaXB0IGluY2x1ZGVzIGEgZnV0dXJlIHN0YXRlbWVudCwgaXQgd2lsbCBiZSAnCisgICAgICAgICAgICdpblxuJworICAgICAgICAgICAnZWZmZWN0IGluIHRoZSBpbnRlcmFjdGl2ZSBzZXNzaW9uIHN0YXJ0ZWQgYWZ0ZXIgdGhlIHNjcmlwdCBpc1xuJworICAgICAgICAgICAnZXhlY3V0ZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICoqUEVQIDIzNioqIC0gQmFjayB0byB0aGUgX19mdXR1cmVfX1xuJworICAgICAgICAgICAnICAgICBUaGUgb3JpZ2luYWwgcHJvcG9zYWwgZm9yIHRoZSBfX2Z1dHVyZV9fIG1lY2hhbmlzbS5cbicsCisgJ2luJzogJ1xuJworICAgICAgICdNZW1iZXJzaGlwIHRlc3Qgb3BlcmF0aW9uc1xuJworICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICdcbicKKyAgICAgICAnVGhlIG9wZXJhdG9ycyAiaW4iIGFuZCAibm90IGluIiB0ZXN0IGZvciBtZW1iZXJzaGlwLiAgInggaW4gcyJcbicKKyAgICAgICAnZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mICpzKiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gICJ4XG4nCisgICAgICAgJ25vdCBpbiBzIiByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiAieCBpbiBzIi4gIEFsbCBidWlsdC1pbiBzZXF1ZW5jZXNcbicKKyAgICAgICAnYW5kIHNldCB0eXBlcyBzdXBwb3J0IHRoaXMgYXMgd2VsbCBhcyBkaWN0aW9uYXJ5LCBmb3Igd2hpY2ggImluIiAnCisgICAgICAgJ3Rlc3RzXG4nCisgICAgICAgJ3doZXRoZXIgdGhlIGRpY3Rpb25hcnkgaGFzIGEgZ2l2ZW4ga2V5LiBGb3IgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXNcbicKKyAgICAgICAnbGlzdCwgdHVwbGUsIHNldCwgZnJvemVuc2V0LCBkaWN0LCBvciBjb2xsZWN0aW9ucy5kZXF1ZSwgdGhlXG4nCisgICAgICAgJ2V4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW5cbicKKyAgICAgICAneSkiLlxuJworICAgICAgICdcbicKKyAgICAgICAnRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiAnCisgICAgICAgJ2lzXG4nCisgICAgICAgJ2Egc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyAieS5maW5kKHgpICE9IC0xIi4gIEVtcHR5XG4nCisgICAgICAgJ3N0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsXG4nCisgICAgICAgJ3NvICIiIiBpbiAiYWJjIiIgd2lsbCByZXR1cm4gIlRydWUiLlxuJworICAgICAgICdcbicKKyAgICAgICAnRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgIl9fY29udGFpbnNfXygpIiBtZXRob2QsICJ4XG4nCisgICAgICAgJ2luIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgInkuX19jb250YWluc19fKHgpIiBpcyB0cnVlLlxuJworICAgICAgICdcbicKKyAgICAgICAnRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG9cbicKKyAgICAgICAnZGVmaW5lICJfX2l0ZXJfXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBzb21lIHZhbHVlICJ6IiB3aXRoICJ4ID09IHoiXG4nCisgICAgICAgJ2lzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZyBvdmVyICJ5Ii4gIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWRcbicKKyAgICAgICAnZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuJworICAgICAgICdcbicKKyAgICAgICAnTGFzdGx5LCB0aGUgb2xkLXN0eWxlIGl0ZXJhdGlvbiBwcm90b2NvbCBpcyB0cmllZDogaWYgYSBjbGFzcyBkZWZpbmVzXG4nCisgICAgICAgJyJfX2dldGl0ZW1fXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbicKKyAgICAgICAnbmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0ICJ4ID09IHlbaV0iLCBhbmQgYWxsIGxvd2VyXG4nCisgICAgICAgJ2ludGVnZXIgaW5kaWNlcyBkbyBub3QgcmFpc2UgIkluZGV4RXJyb3IiIGV4Y2VwdGlvbi4gIChJZiBhbnkgb3RoZXJcbicKKyAgICAgICAnZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuJworICAgICAgICdcbicKKyAgICAgICAnVGhlIG9wZXJhdG9yICJub3QgaW4iIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnVlIHZhbHVlIG9mXG4nCisgICAgICAgJyJpbiIuXG4nLAorICdpbnRlZ2Vycyc6ICdcbicKKyAgICAgICAgICAgICAnSW50ZWdlciBsaXRlcmFsc1xuJworICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJbnRlZ2VyIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsICcKKyAgICAgICAgICAgICAnZGVmaW5pdGlvbnM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBpbnRlZ2VyICAgICAgICA6Oj0gZGVjaW1hbGludGVnZXIgfCBvY3RpbnRlZ2VyIHwgaGV4aW50ZWdlciB8ICcKKyAgICAgICAgICAgICAnYmluaW50ZWdlclxuJworICAgICAgICAgICAgICcgICBkZWNpbWFsaW50ZWdlciA6Oj0gbm9uemVyb2RpZ2l0IGRpZ2l0KiB8ICIwIitcbicKKyAgICAgICAgICAgICAnICAgbm9uemVyb2RpZ2l0ICAgOjo9ICIxIi4uLiI5IlxuJworICAgICAgICAgICAgICcgICBkaWdpdCAgICAgICAgICA6Oj0gIjAiLi4uIjkiXG4nCisgICAgICAgICAgICAgJyAgIG9jdGludGVnZXIgICAgIDo6PSAiMCIgKCJvIiB8ICJPIikgb2N0ZGlnaXQrXG4nCisgICAgICAgICAgICAgJyAgIGhleGludGVnZXIgICAgIDo6PSAiMCIgKCJ4IiB8ICJYIikgaGV4ZGlnaXQrXG4nCisgICAgICAgICAgICAgJyAgIGJpbmludGVnZXIgICAgIDo6PSAiMCIgKCJiIiB8ICJCIikgYmluZGlnaXQrXG4nCisgICAgICAgICAgICAgJyAgIG9jdGRpZ2l0ICAgICAgIDo6PSAiMCIuLi4iNyJcbicKKyAgICAgICAgICAgICAnICAgaGV4ZGlnaXQgICAgICAgOjo9IGRpZ2l0IHwgImEiLi4uImYiIHwgIkEiLi4uIkYiXG4nCisgICAgICAgICAgICAgJyAgIGJpbmRpZ2l0ICAgICAgIDo6PSAiMCIgfCAiMSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZXJlIGlzIG5vIGxpbWl0IGZvciB0aGUgbGVuZ3RoIG9mIGludGVnZXIgbGl0ZXJhbHMgYXBhcnQgZnJvbSAnCisgICAgICAgICAgICAgJ3doYXRcbicKKyAgICAgICAgICAgICAnY2FuIGJlIHN0b3JlZCBpbiBhdmFpbGFibGUgbWVtb3J5LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTm90ZSB0aGF0IGxlYWRpbmcgemVyb3MgaW4gYSBub24temVybyBkZWNpbWFsIG51bWJlciBhcmUgbm90ICcKKyAgICAgICAgICAgICAnYWxsb3dlZC5cbicKKyAgICAgICAgICAgICAnVGhpcyBpcyBmb3IgZGlzYW1iaWd1YXRpb24gd2l0aCBDLXN0eWxlIG9jdGFsIGxpdGVyYWxzLCB3aGljaCAnCisgICAgICAgICAgICAgJ1B5dGhvblxuJworICAgICAgICAgICAgICd1c2VkIGJlZm9yZSB2ZXJzaW9uIDMuMC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NvbWUgZXhhbXBsZXMgb2YgaW50ZWdlciBsaXRlcmFsczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIDcgICAgIDIxNDc0ODM2NDcgICAgICAgICAgICAgICAgICAgICAgICAwbzE3NyAgICAwYjEwMDExMDExMVxuJworICAgICAgICAgICAgICcgICAzICAgICA3OTIyODE2MjUxNDI2NDMzNzU5MzU0Mzk1MDMzNiAgICAgMG8zNzcgICAgMHhkZWFkYmVlZlxuJywKKyAnbGFtYmRhJzogJ1xuJworICAgICAgICAgICAnTGFtYmRhc1xuJworICAgICAgICAgICAnKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBsYW1iZGFfZXhwciAgICAgICAgOjo9ICJsYW1iZGEiIFtwYXJhbWV0ZXJfbGlzdF06IGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgJyAgIGxhbWJkYV9leHByX25vY29uZCA6Oj0gImxhbWJkYSIgW3BhcmFtZXRlcl9saXN0XTogJworICAgICAgICAgICAnZXhwcmVzc2lvbl9ub2NvbmRcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnTGFtYmRhIGV4cHJlc3Npb25zIChzb21ldGltZXMgY2FsbGVkIGxhbWJkYSBmb3JtcykgYXJlIHVzZWQgdG8gJworICAgICAgICAgICAnY3JlYXRlXG4nCisgICAgICAgICAgICdhbm9ueW1vdXMgZnVuY3Rpb25zLiBUaGUgZXhwcmVzc2lvbiAibGFtYmRhIGFyZ3VtZW50czogJworICAgICAgICAgICAnZXhwcmVzc2lvbiJcbicKKyAgICAgICAgICAgJ3lpZWxkcyBhIGZ1bmN0aW9uIG9iamVjdC4gIFRoZSB1bm5hbWVkIG9iamVjdCBiZWhhdmVzIGxpa2UgYSAnCisgICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICAnb2JqZWN0IGRlZmluZWQgd2l0aDpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgZGVmIDxsYW1iZGE+KGFyZ3VtZW50cyk6XG4nCisgICAgICAgICAgICcgICAgICAgcmV0dXJuIGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnU2VlIHNlY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIHRoZSBzeW50YXggb2YgcGFyYW1ldGVyICcKKyAgICAgICAgICAgJ2xpc3RzLlxuJworICAgICAgICAgICAnTm90ZSB0aGF0IGZ1bmN0aW9ucyBjcmVhdGVkIHdpdGggbGFtYmRhIGV4cHJlc3Npb25zIGNhbm5vdCAnCisgICAgICAgICAgICdjb250YWluXG4nCisgICAgICAgICAgICdzdGF0ZW1lbnRzIG9yIGFubm90YXRpb25zLlxuJywKKyAnbGlzdHMnOiAnXG4nCisgICAgICAgICAgJ0xpc3QgZGlzcGxheXNcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSBsaXN0IGRpc3BsYXkgaXMgYSBwb3NzaWJseSBlbXB0eSBzZXJpZXMgb2YgZXhwcmVzc2lvbnMgZW5jbG9zZWQgJworICAgICAgICAgICdpblxuJworICAgICAgICAgICdzcXVhcmUgYnJhY2tldHM6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBsaXN0X2Rpc3BsYXkgOjo9ICJbIiBbc3RhcnJlZF9saXN0IHwgY29tcHJlaGVuc2lvbl0gIl0iXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBIGxpc3QgZGlzcGxheSB5aWVsZHMgYSBuZXcgbGlzdCBvYmplY3QsIHRoZSBjb250ZW50cyBiZWluZyAnCisgICAgICAgICAgJ3NwZWNpZmllZFxuJworICAgICAgICAgICdieSBlaXRoZXIgYSBsaXN0IG9mIGV4cHJlc3Npb25zIG9yIGEgY29tcHJlaGVuc2lvbi4gIFdoZW4gYSBjb21tYS1cbicKKyAgICAgICAgICAnc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgaXMgc3VwcGxpZWQsIGl0cyBlbGVtZW50cyBhcmUgJworICAgICAgICAgICdldmFsdWF0ZWRcbicKKyAgICAgICAgICAnZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCBwbGFjZWQgaW50byB0aGUgbGlzdCBvYmplY3QgaW4gdGhhdCBvcmRlci5cbicKKyAgICAgICAgICAnV2hlbiBhIGNvbXByZWhlbnNpb24gaXMgc3VwcGxpZWQsIHRoZSBsaXN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlXG4nCisgICAgICAgICAgJ2VsZW1lbnRzIHJlc3VsdGluZyBmcm9tIHRoZSBjb21wcmVoZW5zaW9uLlxuJywKKyAnbmFtaW5nJzogJ1xuJworICAgICAgICAgICAnTmFtaW5nIGFuZCBiaW5kaW5nXG4nCisgICAgICAgICAgICcqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdCaW5kaW5nIG9mIG5hbWVzXG4nCisgICAgICAgICAgICc9PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJypOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgYmluZGluZ1xuJworICAgICAgICAgICAnb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIGJpbmQgbmFtZXM6IGZvcm1hbCBwYXJhbWV0ZXJzIHRvICcKKyAgICAgICAgICAgJ2Z1bmN0aW9ucyxcbicKKyAgICAgICAgICAgJyJpbXBvcnQiIHN0YXRlbWVudHMsIGNsYXNzIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyAodGhlc2UgYmluZCAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ2NsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGRlZmluaW5nIGJsb2NrKSwgYW5kIHRhcmdldHMgdGhhdCAnCisgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgJ2lkZW50aWZpZXJzIGlmIG9jY3VycmluZyBpbiBhbiBhc3NpZ25tZW50LCAiZm9yIiBsb29wIGhlYWRlciwgb3IgJworICAgICAgICAgICAnYWZ0ZXJcbicKKyAgICAgICAgICAgJyJhcyIgaW4gYSAid2l0aCIgc3RhdGVtZW50IG9yICJleGNlcHQiIGNsYXVzZS4gVGhlICJpbXBvcnQiICcKKyAgICAgICAgICAgJ3N0YXRlbWVudFxuJworICAgICAgICAgICAnb2YgdGhlIGZvcm0gImZyb20gLi4uIGltcG9ydCAqIiBiaW5kcyBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGVcbicKKyAgICAgICAgICAgJ2ltcG9ydGVkIG1vZHVsZSwgZXhjZXB0IHRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUuICBUaGlzICcKKyAgICAgICAgICAgJ2Zvcm1cbicKKyAgICAgICAgICAgJ21heSBvbmx5IGJlIHVzZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQSB0YXJnZXQgb2NjdXJyaW5nIGluIGEgImRlbCIgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCBib3VuZCAnCisgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgJ3RoaXMgcHVycG9zZSAodGhvdWdoIHRoZSBhY3R1YWwgc2VtYW50aWNzIGFyZSB0byB1bmJpbmQgdGhlICcKKyAgICAgICAgICAgJ25hbWUpLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdFYWNoIGFzc2lnbm1lbnQgb3IgaW1wb3J0IHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2sgZGVmaW5lZCAnCisgICAgICAgICAgICdieSBhXG4nCisgICAgICAgICAgICdjbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSAnCisgICAgICAgICAgICd0b3AtbGV2ZWxcbicKKyAgICAgICAgICAgJ2NvZGUgYmxvY2spLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0ICcKKyAgICAgICAgICAgJ2Jsb2NrLFxuJworICAgICAgICAgICAndW5sZXNzIGRlY2xhcmVkIGFzICJub25sb2NhbCIgb3IgImdsb2JhbCIuICBJZiBhIG5hbWUgaXMgYm91bmQgYXQgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdtb2R1bGUgbGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZSB2YXJpYWJsZXMgb2YgdGhlICcKKyAgICAgICAgICAgJ21vZHVsZVxuJworICAgICAgICAgICAnY29kZSBibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhIHZhcmlhYmxlIGlzIHVzZWQgaW4gYSAnCisgICAgICAgICAgICdjb2RlXG4nCisgICAgICAgICAgICdibG9jayBidXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEgKmZyZWUgdmFyaWFibGUqLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdFYWNoIG9jY3VycmVuY2Ugb2YgYSBuYW1lIGluIHRoZSBwcm9ncmFtIHRleHQgcmVmZXJzIHRvIHRoZSAnCisgICAgICAgICAgICcqYmluZGluZypcbicKKyAgICAgICAgICAgJ29mIHRoYXQgbmFtZSBlc3RhYmxpc2hlZCBieSB0aGUgZm9sbG93aW5nIG5hbWUgcmVzb2x1dGlvbiBydWxlcy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdSZXNvbHV0aW9uIG9mIG5hbWVzXG4nCisgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0EgKnNjb3BlKiBkZWZpbmVzIHRoZSB2aXNpYmlsaXR5IG9mIGEgbmFtZSB3aXRoaW4gYSBibG9jay4gIElmIGEgJworICAgICAgICAgICAnbG9jYWxcbicKKyAgICAgICAgICAgJ3ZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICBJZiAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ2RlZmluaXRpb24gb2NjdXJzIGluIGEgZnVuY3Rpb24gYmxvY2ssIHRoZSBzY29wZSBleHRlbmRzIHRvIGFueSAnCisgICAgICAgICAgICdibG9ja3NcbicKKyAgICAgICAgICAgJ2NvbnRhaW5lZCB3aXRoaW4gdGhlIGRlZmluaW5nIG9uZSwgdW5sZXNzIGEgY29udGFpbmVkIGJsb2NrICcKKyAgICAgICAgICAgJ2ludHJvZHVjZXNcbicKKyAgICAgICAgICAgJ2EgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdXaGVuIGEgbmFtZSBpcyB1c2VkIGluIGEgY29kZSBibG9jaywgaXQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlICcKKyAgICAgICAgICAgJ25lYXJlc3RcbicKKyAgICAgICAgICAgJ2VuY2xvc2luZyBzY29wZS4gIFRoZSBzZXQgb2YgYWxsIHN1Y2ggc2NvcGVzIHZpc2libGUgdG8gYSBjb2RlICcKKyAgICAgICAgICAgJ2Jsb2NrXG4nCisgICAgICAgICAgICJpcyBjYWxsZWQgdGhlIGJsb2NrJ3MgKmVudmlyb25tZW50Ki5cbiIKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSAiTmFtZUVycm9yIiBleGNlcHRpb24gaXMgJworICAgICAgICAgICAncmFpc2VkLiBJZlxuJworICAgICAgICAgICAndGhlIGN1cnJlbnQgc2NvcGUgaXMgYSBmdW5jdGlvbiBzY29wZSwgYW5kIHRoZSBuYW1lIHJlZmVycyB0byBhICcKKyAgICAgICAgICAgJ2xvY2FsXG4nCisgICAgICAgICAgICd2YXJpYWJsZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYm91bmQgdG8gYSB2YWx1ZSBhdCB0aGUgcG9pbnQgd2hlcmUgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICduYW1lIGlzIHVzZWQsIGFuICJVbmJvdW5kTG9jYWxFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbicKKyAgICAgICAgICAgJyJVbmJvdW5kTG9jYWxFcnJvciIgaXMgYSBzdWJjbGFzcyBvZiAiTmFtZUVycm9yIi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSWYgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uIG9jY3VycyBhbnl3aGVyZSB3aXRoaW4gYSBjb2RlIGJsb2NrLCAnCisgICAgICAgICAgICdhbGxcbicKKyAgICAgICAgICAgJ3VzZXMgb2YgdGhlIG5hbWUgd2l0aGluIHRoZSBibG9jayBhcmUgdHJlYXRlZCBhcyByZWZlcmVuY2VzIHRvICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgd2l0aGluICcKKyAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgJ2Jsb2NrIGJlZm9yZSBpdCBpcyBib3VuZC4gIFRoaXMgcnVsZSBpcyBzdWJ0bGUuICBQeXRob24gbGFja3NcbicKKyAgICAgICAgICAgJ2RlY2xhcmF0aW9ucyBhbmQgYWxsb3dzIG5hbWUgYmluZGluZyBvcGVyYXRpb25zIHRvIG9jY3VyIGFueXdoZXJlXG4nCisgICAgICAgICAgICd3aXRoaW4gYSBjb2RlIGJsb2NrLiAgVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGNvZGUgYmxvY2sgY2FuIGJlXG4nCisgICAgICAgICAgICdkZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgYmxvY2sgZm9yIG5hbWUgJworICAgICAgICAgICAnYmluZGluZ1xuJworICAgICAgICAgICAnb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSWYgdGhlICJnbG9iYWwiIHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2ssIGFsbCB1c2VzIG9mIHRoZSAnCisgICAgICAgICAgICduYW1lXG4nCisgICAgICAgICAgICdzcGVjaWZpZWQgaW4gdGhlIHN0YXRlbWVudCByZWZlciB0byB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgaW4gJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICd0b3AtbGV2ZWwgbmFtZXNwYWNlLiAgTmFtZXMgYXJlIHJlc29sdmVkIGluIHRoZSB0b3AtbGV2ZWwgJworICAgICAgICAgICAnbmFtZXNwYWNlIGJ5XG4nCisgICAgICAgICAgICdzZWFyY2hpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGkuZS4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlXG4nCisgICAgICAgICAgICdjb250YWluaW5nIHRoZSBjb2RlIGJsb2NrLCBhbmQgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSwgdGhlICcKKyAgICAgICAgICAgJ25hbWVzcGFjZVxuJworICAgICAgICAgICAnb2YgdGhlIG1vZHVsZSAiYnVpbHRpbnMiLiAgVGhlIGdsb2JhbCBuYW1lc3BhY2UgaXMgc2VhcmNoZWQgJworICAgICAgICAgICAnZmlyc3QuICBJZlxuJworICAgICAgICAgICAndGhlIG5hbWUgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIGlzIHNlYXJjaGVkLiAgJworICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICciZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBuYW1lLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgImdsb2JhbCIgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZyAnCisgICAgICAgICAgICdvcGVyYXRpb25cbicKKyAgICAgICAgICAgJ2luIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhIGZyZWUgJworICAgICAgICAgICAndmFyaWFibGVcbicKKyAgICAgICAgICAgJ2NvbnRhaW5zIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlIGZyZWUgdmFyaWFibGUgaXMgdHJlYXRlZCBhcyBhICcKKyAgICAgICAgICAgJ2dsb2JhbC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICJub25sb2NhbCIgc3RhdGVtZW50IGNhdXNlcyBjb3JyZXNwb25kaW5nIG5hbWVzIHRvIHJlZmVyIHRvXG4nCisgICAgICAgICAgICdwcmV2aW91c2x5IGJvdW5kIHZhcmlhYmxlcyBpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgZnVuY3Rpb24gJworICAgICAgICAgICAnc2NvcGUuXG4nCisgICAgICAgICAgICciU3ludGF4RXJyb3IiIGlzIHJhaXNlZCBhdCBjb21waWxlIHRpbWUgaWYgdGhlIGdpdmVuIG5hbWUgZG9lcyAnCisgICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAgJ2V4aXN0IGluIGFueSBlbmNsb3NpbmcgZnVuY3Rpb24gc2NvcGUuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSAnCisgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICdtb2R1bGUgaXMgaW1wb3J0ZWQuICBUaGUgbWFpbiBtb2R1bGUgZm9yIGEgc2NyaXB0IGlzIGFsd2F5cyAnCisgICAgICAgICAgICdjYWxsZWRcbicKKyAgICAgICAgICAgJyJfX21haW5fXyIuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0NsYXNzIGRlZmluaXRpb24gYmxvY2tzIGFuZCBhcmd1bWVudHMgdG8gImV4ZWMoKSIgYW5kICJldmFsKCkiICcKKyAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAnc3BlY2lhbCBpbiB0aGUgY29udGV4dCBvZiBuYW1lIHJlc29sdXRpb24uIEEgY2xhc3MgZGVmaW5pdGlvbiBpcyAnCisgICAgICAgICAgICdhblxuJworICAgICAgICAgICAnZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmUgbmFtZXMuIFRoZXNlICcKKyAgICAgICAgICAgJ3JlZmVyZW5jZXNcbicKKyAgICAgICAgICAgJ2ZvbGxvdyB0aGUgbm9ybWFsIHJ1bGVzIGZvciBuYW1lIHJlc29sdXRpb24gd2l0aCBhbiBleGNlcHRpb24gJworICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAndW5ib3VuZCBsb2NhbCB2YXJpYWJsZXMgYXJlIGxvb2tlZCB1cCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gJworICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICduYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkgJworICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgJ3RoZSBjbGFzcy4gVGhlIHNjb3BlIG9mIG5hbWVzIGRlZmluZWQgaW4gYSBjbGFzcyBibG9jayBpcyBsaW1pdGVkICcKKyAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICd0aGUgY2xhc3MgYmxvY2s7IGl0IGRvZXMgbm90IGV4dGVuZCB0byB0aGUgY29kZSBibG9ja3Mgb2YgbWV0aG9kcyAnCisgICAgICAgICAgICctLVxuJworICAgICAgICAgICAndGhpcyBpbmNsdWRlcyBjb21wcmVoZW5zaW9ucyBhbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlIHRoZXkgJworICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICdpbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZSAnCisgICAgICAgICAgICdmb2xsb3dpbmdcbicKKyAgICAgICAgICAgJ3dpbGwgZmFpbDpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgY2xhc3MgQTpcbicKKyAgICAgICAgICAgJyAgICAgICBhID0gNDJcbicKKyAgICAgICAgICAgJyAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQnVpbHRpbnMgYW5kIHJlc3RyaWN0ZWQgZXhlY3V0aW9uXG4nCisgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4ZWN1dGlvbiBvZiBhIGNvZGUgJworICAgICAgICAgICAnYmxvY2tcbicKKyAgICAgICAgICAgJ2lzIGFjdHVhbGx5IGZvdW5kIGJ5IGxvb2tpbmcgdXAgdGhlIG5hbWUgIl9fYnVpbHRpbnNfXyIgaW4gaXRzICcKKyAgICAgICAgICAgJ2dsb2JhbFxuJworICAgICAgICAgICAnbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZSBsYXR0ZXIgJworICAgICAgICAgICAnY2FzZVxuJworICAgICAgICAgICAidGhlIG1vZHVsZSdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZSAiCisgICAgICAgICAgICciX19tYWluX18iXG4nCisgICAgICAgICAgICdtb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIHRoZSBidWlsdC1pbiBtb2R1bGUgImJ1aWx0aW5zIjsgd2hlbiBpbiAnCisgICAgICAgICAgICdhbnlcbicKKyAgICAgICAgICAgJ290aGVyIG1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnImJ1aWx0aW5zIiBtb2R1bGUgaXRzZWxmLiAgIl9fYnVpbHRpbnNfXyIgY2FuIGJlIHNldCB0byBhICcKKyAgICAgICAgICAgJ3VzZXItY3JlYXRlZFxuJworICAgICAgICAgICAnZGljdGlvbmFyeSB0byBjcmVhdGUgYSB3ZWFrIGZvcm0gb2YgcmVzdHJpY3RlZCBleGVjdXRpb24uXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaFxuJworICAgICAgICAgICAnIl9fYnVpbHRpbnNfXyI7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzXG4nCisgICAgICAgICAgICd3YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCAnCisgICAgICAgICAgICciaW1wb3J0IlxuJworICAgICAgICAgICAndGhlICJidWlsdGlucyIgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbicKKyAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdOYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCAnCisgICAgICAgICAgICdjb21waWxlXG4nCisgICAgICAgICAgICd0aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGkgPSAxMFxuJworICAgICAgICAgICAnICAgZGVmIGYoKTpcbicKKyAgICAgICAgICAgJyAgICAgICBwcmludChpKVxuJworICAgICAgICAgICAnICAgaSA9IDQyXG4nCisgICAgICAgICAgICcgICBmKClcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiAnCisgICAgICAgICAgICd1c2VkXG4nCisgICAgICAgICAgICdpbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsICcKKyAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICdkZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSAnCisgICAgICAgICAgICdmdWxsXG4nCisgICAgICAgICAgICdlbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSAnCisgICAgICAgICAgICdsb2NhbFxuJworICAgICAgICAgICAnYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90ICcKKyAgICAgICAgICAgJ3Jlc29sdmVkXG4nCisgICAgICAgICAgICdpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICAnCisgICAgICAgICAgICdbMV1cbicKKyAgICAgICAgICAgJ1RoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG4nCisgICAgICAgICAgICdvdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgJworICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgJ3NwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicsCisgJ25vbmxvY2FsJzogJ1xuJworICAgICAgICAgICAgICdUaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBub25sb2NhbF9zdG10IDo6PSAibm9ubG9jYWwiIGlkZW50aWZpZXIgKCIsIiBpZGVudGlmaWVyKSpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAibm9ubG9jYWwiIHN0YXRlbWVudCBjYXVzZXMgdGhlIGxpc3RlZCBpZGVudGlmaWVycyB0byByZWZlciAnCisgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgJ3ByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSAnCisgICAgICAgICAgICAgJ2V4Y2x1ZGluZ1xuJworICAgICAgICAgICAgICdnbG9iYWxzLiBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciAnCisgICAgICAgICAgICAgJ2JpbmRpbmcgaXNcbicKKyAgICAgICAgICAgICAndG8gc2VhcmNoIHRoZSBsb2NhbCBuYW1lc3BhY2UgZmlyc3QuICBUaGUgc3RhdGVtZW50IGFsbG93c1xuJworICAgICAgICAgICAgICdlbmNhcHN1bGF0ZWQgY29kZSB0byByZWJpbmQgdmFyaWFibGVzIG91dHNpZGUgb2YgdGhlIGxvY2FsICcKKyAgICAgICAgICAgICAnc2NvcGVcbicKKyAgICAgICAgICAgICAnYmVzaWRlcyB0aGUgZ2xvYmFsIChtb2R1bGUpIHNjb3BlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTmFtZXMgbGlzdGVkIGluIGEgIm5vbmxvY2FsIiBzdGF0ZW1lbnQsIHVubGlrZSB0aG9zZSBsaXN0ZWQgaW4gJworICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJyJnbG9iYWwiIHN0YXRlbWVudCwgbXVzdCByZWZlciB0byBwcmUtZXhpc3RpbmcgYmluZGluZ3MgaW4gYW5cbicKKyAgICAgICAgICAgICAnZW5jbG9zaW5nIHNjb3BlICh0aGUgc2NvcGUgaW4gd2hpY2ggYSBuZXcgYmluZGluZyBzaG91bGQgYmUgJworICAgICAgICAgICAgICdjcmVhdGVkXG4nCisgICAgICAgICAgICAgJ2Nhbm5vdCBiZSBkZXRlcm1pbmVkIHVuYW1iaWd1b3VzbHkpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTmFtZXMgbGlzdGVkIGluIGEgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgbXVzdCBub3QgY29sbGlkZSB3aXRoICcKKyAgICAgICAgICAgICAncHJlLVxuJworICAgICAgICAgICAgICdleGlzdGluZyBiaW5kaW5ncyBpbiB0aGUgbG9jYWwgc2NvcGUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgKipQRVAgMzEwNCoqIC0gQWNjZXNzIHRvIE5hbWVzIGluIE91dGVyIFNjb3Blc1xuJworICAgICAgICAgICAgICcgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQuXG4nLAorICdudW1iZXJzJzogJ1xuJworICAgICAgICAgICAgJ051bWVyaWMgbGl0ZXJhbHNcbicKKyAgICAgICAgICAgICcqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIG51bWVyaWMgbGl0ZXJhbHM6IGludGVnZXJzLCBmbG9hdGluZyAnCisgICAgICAgICAgICAncG9pbnRcbicKKyAgICAgICAgICAgICdudW1iZXJzLCBhbmQgaW1hZ2luYXJ5IG51bWJlcnMuICBUaGVyZSBhcmUgbm8gY29tcGxleCBsaXRlcmFsc1xuJworICAgICAgICAgICAgJyhjb21wbGV4IG51bWJlcnMgY2FuIGJlIGZvcm1lZCBieSBhZGRpbmcgYSByZWFsIG51bWJlciBhbmQgYW5cbicKKyAgICAgICAgICAgICdpbWFnaW5hcnkgbnVtYmVyKS5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdOb3RlIHRoYXQgbnVtZXJpYyBsaXRlcmFscyBkbyBub3QgaW5jbHVkZSBhIHNpZ247IGEgcGhyYXNlIGxpa2UgJworICAgICAgICAgICAgJyItMSJcbicKKyAgICAgICAgICAgICdpcyBhY3R1YWxseSBhbiBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHRoZSB1bmFyeSBvcGVyYXRvciBcJyItIlwnICcKKyAgICAgICAgICAgICdhbmQgdGhlXG4nCisgICAgICAgICAgICAnbGl0ZXJhbCAiMSIuXG4nLAorICdudW1lcmljLXR5cGVzJzogJ1xuJworICAgICAgICAgICAgICAgICAgJ0VtdWxhdGluZyBudW1lcmljIHR5cGVzXG4nCisgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZW11bGF0ZSBudW1lcmljICcKKyAgICAgICAgICAgICAgICAgICdvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAgJ01ldGhvZHMgY29ycmVzcG9uZGluZyB0byBvcGVyYXRpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgJworICAgICAgICAgICAgICAgICAgJ2J5IHRoZVxuJworICAgICAgICAgICAgICAgICAgJ3BhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2UgJworICAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbnMgZm9yXG4nCisgICAgICAgICAgICAgICAgICAnbm9uLWludGVncmFsIG51bWJlcnMpIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19hZGRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19zdWJfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19tYXRtdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX190cnVlZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19tb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19kaXZtb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9feG9yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fb3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgJworICAgICAgICAgICAgICAgICAgJ2FyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAgICAgICcgICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAnCisgICAgICAgICAgICAgICAgICAnImRpdm1vZCgpIixcbicKKyAgICAgICAgICAgICAgICAgICcgICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKS4gIEZvciAnCisgICAgICAgICAgICAgICAgICAnaW5zdGFuY2UsIHRvXG4nCisgICAgICAgICAgICAgICAgICAnICAgZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gInggKyB5Iiwgd2hlcmUgKngqIGlzIGFuICcKKyAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSBvZiBhXG4nCisgICAgICAgICAgICAgICAgICAnICAgY2xhc3MgdGhhdCBoYXMgYW4gIl9fYWRkX18oKSIgbWV0aG9kLCAieC5fX2FkZF9fKHkpIiBpcyAnCisgICAgICAgICAgICAgICAgICAnY2FsbGVkLlxuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZSAiX19kaXZtb2RfXygpIiBtZXRob2Qgc2hvdWxkIGJlIHRoZSBlcXVpdmFsZW50IHRvICcKKyAgICAgICAgICAgICAgICAgICd1c2luZ1xuJworICAgICAgICAgICAgICAgICAgJyAgICJfX2Zsb29yZGl2X18oKSIgYW5kICJfX21vZF9fKCkiOyBpdCBzaG91bGQgbm90IGJlICcKKyAgICAgICAgICAgICAgICAgICdyZWxhdGVkIHRvXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9fdHJ1ZWRpdl9fKCkiLiAgTm90ZSB0aGF0ICJfX3Bvd19fKCkiIHNob3VsZCBiZSAnCisgICAgICAgICAgICAgICAgICAnZGVmaW5lZCB0byBhY2NlcHRcbicKKyAgICAgICAgICAgICAgICAgICcgICBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAnYnVpbHQtaW5cbicKKyAgICAgICAgICAgICAgICAgICcgICAicG93KCkiIGZ1bmN0aW9uIGlzIHRvIGJlIHN1cHBvcnRlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gJworICAgICAgICAgICAgICAgICAgJ3dpdGggdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgc3VwcGxpZWQgYXJndW1lbnRzLCBpdCBzaG91bGQgcmV0dXJuICJOb3RJbXBsZW1lbnRlZCIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmFkZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JzdWJfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcm1hdG11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcm1vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JkaXZtb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmxzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcnhvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSAnCisgICAgICAgICAgICAgICAgICAnYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICcKKyAgICAgICAgICAgICAgICAgICciZGl2bW9kKCkiLFxuJworICAgICAgICAgICAgICAgICAgJyAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpIHdpdGggcmVmbGVjdGVkICcKKyAgICAgICAgICAgICAgICAgICcoc3dhcHBlZClcbicKKyAgICAgICAgICAgICAgICAgICcgICBvcGVyYW5kcy4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIGxlZnQgJworICAgICAgICAgICAgICAgICAgJ29wZXJhbmQgZG9lc1xuJworICAgICAgICAgICAgICAgICAgJyAgIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmQgdGhlIG9wZXJhbmRzICcKKyAgICAgICAgICAgICAgICAgICdhcmUgb2ZcbicKKyAgICAgICAgICAgICAgICAgICcgICBkaWZmZXJlbnQgdHlwZXMuIFsyXSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSAnCisgICAgICAgICAgICAgICAgICAnZXhwcmVzc2lvbiAieCAtXG4nCisgICAgICAgICAgICAgICAgICAnICAgeSIsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuICcKKyAgICAgICAgICAgICAgICAgICciX19yc3ViX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICcgICBtZXRob2QsICJ5Ll9fcnN1Yl9fKHgpIiBpcyBjYWxsZWQgaWYgInguX19zdWJfXyh5KSIgJworICAgICAgICAgICAgICAgICAgJ3JldHVybnNcbicKKyAgICAgICAgICAgICAgICAgICcgICAqTm90SW1wbGVtZW50ZWQqLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIE5vdGUgdGhhdCB0ZXJuYXJ5ICJwb3coKSIgd2lsbCBub3QgdHJ5IGNhbGxpbmcgJworICAgICAgICAgICAgICAgICAgJyJfX3Jwb3dfXygpIiAodGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbyBjb21wbGljYXRlZCkuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgTm90ZTogSWYgdGhlIHJpZ2h0IG9wZXJhbmQncyB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgdGhlICIKKyAgICAgICAgICAgICAgICAgICdsZWZ0XG4nCisgICAgICAgICAgICAgICAgICAiICAgICBvcGVyYW5kJ3MgdHlwZSBhbmQgdGhhdCBzdWJjbGFzcyBwcm92aWRlcyB0aGUgIgorICAgICAgICAgICAgICAgICAgJ3JlZmxlY3RlZCBtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGZvciB0aGUgb3BlcmF0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgJworICAgICAgICAgICAgICAgICAgJ3RoZSBsZWZ0XG4nCisgICAgICAgICAgICAgICAgICAiICAgICBvcGVyYW5kJ3Mgbm9uLXJlZmxlY3RlZCBtZXRob2QuICBUaGlzIGJlaGF2aW9yIGFsbG93cyAiCisgICAgICAgICAgICAgICAgICAnc3ViY2xhc3Nlc1xuJworICAgICAgICAgICAgICAgICAgIiAgICAgdG8gb3ZlcnJpZGUgdGhlaXIgYW5jZXN0b3JzJyBvcGVyYXRpb25zLlxuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pc3ViX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ltYXRtdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lsc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faWFuZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2l4b3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgJworICAgICAgICAgICAgICAgICAgJ2FyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAgICAgICcgICBhc3NpZ25tZW50cyAoIis9IiwgIi09IiwgIio9IiwgIkA9IiwgIi89IiwgIi8vPSIsICIlPSIsICcKKyAgICAgICAgICAgICAgICAgICciKio9IixcbicKKyAgICAgICAgICAgICAgICAgICcgICAiPDw9IiwgIj4+PSIsICImPSIsICJePSIsICJ8PSIpLiAgVGhlc2UgbWV0aG9kcyBzaG91bGQgJworICAgICAgICAgICAgICAgICAgJ2F0dGVtcHQgdG9cbicKKyAgICAgICAgICAgICAgICAgICcgICBkbyB0aGUgb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgKnNlbGYqKSBhbmQgcmV0dXJuICcKKyAgICAgICAgICAgICAgICAgICd0aGUgcmVzdWx0XG4nCisgICAgICAgICAgICAgICAgICAnICAgKHdoaWNoIGNvdWxkIGJlLCBidXQgZG9lcyBub3QgaGF2ZSB0byBiZSwgKnNlbGYqKS4gIElmIGEgJworICAgICAgICAgICAgICAgICAgJ3NwZWNpZmljXG4nCisgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkIGFzc2lnbm1lbnQgZmFsbHMgJworICAgICAgICAgICAgICAgICAgJ2JhY2sgdG8gdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgbm9ybWFsIG1ldGhvZHMuICBGb3IgaW5zdGFuY2UsIGlmICp4KiBpcyBhbiBpbnN0YW5jZSBvZiAnCisgICAgICAgICAgICAgICAgICAnYSBjbGFzc1xuJworICAgICAgICAgICAgICAgICAgJyAgIHdpdGggYW4gIl9faWFkZF9fKCkiIG1ldGhvZCwgInggKz0geSIgaXMgZXF1aXZhbGVudCB0byAnCisgICAgICAgICAgICAgICAgICAnInggPVxuJworICAgICAgICAgICAgICAgICAgJyAgIHguX19pYWRkX18oeSkiIC4gT3RoZXJ3aXNlLCAieC5fX2FkZF9fKHkpIiBhbmQgJworICAgICAgICAgICAgICAgICAgJyJ5Ll9fcmFkZF9fKHgpIiBhcmVcbicKKyAgICAgICAgICAgICAgICAgICcgICBjb25zaWRlcmVkLCBhcyB3aXRoIHRoZSBldmFsdWF0aW9uIG9mICJ4ICsgeSIuIEluICcKKyAgICAgICAgICAgICAgICAgICdjZXJ0YWluXG4nCisgICAgICAgICAgICAgICAgICAnICAgc2l0dWF0aW9ucywgYXVnbWVudGVkIGFzc2lnbm1lbnQgY2FuIHJlc3VsdCBpbiAnCisgICAgICAgICAgICAgICAgICAndW5leHBlY3RlZCBlcnJvcnNcbicKKyAgICAgICAgICAgICAgICAgICIgICAoc2VlIFdoeSBkb2VzIGFfdHVwbGVbaV0gKz0gWydpdGVtJ10gcmFpc2UgYW4gZXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICd3aGVuIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGFkZGl0aW9uIHdvcmtzPyksIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIGluIGZhY3QgcGFydCBvZiAnCisgICAgICAgICAgICAgICAgICAndGhlIGRhdGFcbicKKyAgICAgICAgICAgICAgICAgICcgICBtb2RlbC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19uZWdfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Bvc19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYWJzX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbnZlcnRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAnCisgICAgICAgICAgICAgICAgICAnKCItIiwgIisiLFxuJworICAgICAgICAgICAgICAgICAgJyAgICJhYnMoKSIgYW5kICJ+IikuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fY29tcGxleF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW50X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19mbG9hdF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcm91bmRfXyhzZWxmWywgbl0pXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJjb21wbGV4KCkiLCAnCisgICAgICAgICAgICAgICAgICAnImludCgpIixcbicKKyAgICAgICAgICAgICAgICAgICcgICAiZmxvYXQoKSIgYW5kICJyb3VuZCgpIi4gIFNob3VsZCByZXR1cm4gYSB2YWx1ZSBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlXG4nCisgICAgICAgICAgICAgICAgICAnICAgdHlwZS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbmRleF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IuaW5kZXgoKSIsIGFuZCB3aGVuZXZlciAnCisgICAgICAgICAgICAgICAgICAnUHl0aG9uIG5lZWRzXG4nCisgICAgICAgICAgICAgICAgICAnICAgdG8gbG9zc2xlc3NseSBjb252ZXJ0IHRoZSBudW1lcmljIG9iamVjdCB0byBhbiBpbnRlZ2VyICcKKyAgICAgICAgICAgICAgICAgICdvYmplY3QgKHN1Y2hcbicKKyAgICAgICAgICAgICAgICAgICcgICBhcyBpbiBzbGljaW5nLCBvciBpbiB0aGUgYnVpbHQtaW4gImJpbigpIiwgImhleCgpIiBhbmQgJworICAgICAgICAgICAgICAgICAgJyJvY3QoKSJcbicKKyAgICAgICAgICAgICAgICAgICcgICBmdW5jdGlvbnMpLiBQcmVzZW5jZSBvZiB0aGlzIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdCB0aGUgJworICAgICAgICAgICAgICAgICAgJ251bWVyaWNcbicKKyAgICAgICAgICAgICAgICAgICcgICBvYmplY3QgaXMgYW4gaW50ZWdlciB0eXBlLiAgTXVzdCByZXR1cm4gYW4gaW50ZWdlci5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBOb3RlOiBJbiBvcmRlciB0byBoYXZlIGEgY29oZXJlbnQgaW50ZWdlciB0eXBlIGNsYXNzLCAnCisgICAgICAgICAgICAgICAgICAnd2hlblxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIl9faW5kZXhfXygpIiBpcyBkZWZpbmVkICJfX2ludF9fKCkiIHNob3VsZCBhbHNvIGJlICcKKyAgICAgICAgICAgICAgICAgICdkZWZpbmVkLCBhbmRcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGJvdGggc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZS5cbicsCisgJ29iamVjdHMnOiAnXG4nCisgICAgICAgICAgICAnT2JqZWN0cywgdmFsdWVzIGFuZCB0eXBlc1xuJworICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICIqT2JqZWN0cyogYXJlIFB5dGhvbidzIGFic3RyYWN0aW9uIGZvciBkYXRhLiAgQWxsIGRhdGEgaW4gYSAiCisgICAgICAgICAgICAnUHl0aG9uXG4nCisgICAgICAgICAgICAncHJvZ3JhbSBpcyByZXByZXNlbnRlZCBieSBvYmplY3RzIG9yIGJ5IHJlbGF0aW9ucyBiZXR3ZWVuICcKKyAgICAgICAgICAgICdvYmplY3RzLiAoSW5cbicKKyAgICAgICAgICAgICdhIHNlbnNlLCBhbmQgaW4gY29uZm9ybWFuY2UgdG8gVm9uIE5ldW1hbm5cJ3MgbW9kZWwgb2YgYSAic3RvcmVkXG4nCisgICAgICAgICAgICAncHJvZ3JhbSBjb21wdXRlciwiIGNvZGUgaXMgYWxzbyByZXByZXNlbnRlZCBieSBvYmplY3RzLilcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICJFdmVyeSBvYmplY3QgaGFzIGFuIGlkZW50aXR5LCBhIHR5cGUgYW5kIGEgdmFsdWUuICBBbiBvYmplY3Qnc1xuIgorICAgICAgICAgICAgJyppZGVudGl0eSogbmV2ZXIgY2hhbmdlcyBvbmNlIGl0IGhhcyBiZWVuIGNyZWF0ZWQ7IHlvdSBtYXkgdGhpbmsgJworICAgICAgICAgICAgJ29mIGl0XG4nCisgICAgICAgICAgICAnYXMgdGhlIG9iamVjdFwncyBhZGRyZXNzIGluIG1lbW9yeS4gIFRoZSBcJyJpcyJcJyBvcGVyYXRvciAnCisgICAgICAgICAgICAnY29tcGFyZXMgdGhlXG4nCisgICAgICAgICAgICAnaWRlbnRpdHkgb2YgdHdvIG9iamVjdHM7IHRoZSAiaWQoKSIgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyXG4nCisgICAgICAgICAgICAncmVwcmVzZW50aW5nIGl0cyBpZGVudGl0eS5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEZvciBDUHl0aG9uLCAiaWQoeCkiIGlzIHRoZSAnCisgICAgICAgICAgICAnbWVtb3J5XG4nCisgICAgICAgICAgICAnYWRkcmVzcyB3aGVyZSAieCIgaXMgc3RvcmVkLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgIkFuIG9iamVjdCdzIHR5cGUgZGV0ZXJtaW5lcyB0aGUgb3BlcmF0aW9ucyB0aGF0IHRoZSBvYmplY3QgIgorICAgICAgICAgICAgJ3N1cHBvcnRzXG4nCisgICAgICAgICAgICAnKGUuZy4sICJkb2VzIGl0IGhhdmUgYSBsZW5ndGg/IikgYW5kIGFsc28gZGVmaW5lcyB0aGUgcG9zc2libGUgJworICAgICAgICAgICAgJ3ZhbHVlc1xuJworICAgICAgICAgICAgJ2ZvciBvYmplY3RzIG9mIHRoYXQgdHlwZS4gIFRoZSAidHlwZSgpIiBmdW5jdGlvbiByZXR1cm5zIGFuICcKKyAgICAgICAgICAgICJvYmplY3Qnc1xuIgorICAgICAgICAgICAgJ3R5cGUgKHdoaWNoIGlzIGFuIG9iamVjdCBpdHNlbGYpLiAgTGlrZSBpdHMgaWRlbnRpdHksIGFuICcKKyAgICAgICAgICAgICJvYmplY3Qnc1xuIgorICAgICAgICAgICAgJyp0eXBlKiBpcyBhbHNvIHVuY2hhbmdlYWJsZS4gWzFdXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVGhlICp2YWx1ZSogb2Ygc29tZSBvYmplY3RzIGNhbiBjaGFuZ2UuICBPYmplY3RzIHdob3NlIHZhbHVlIGNhblxuJworICAgICAgICAgICAgJ2NoYW5nZSBhcmUgc2FpZCB0byBiZSAqbXV0YWJsZSo7IG9iamVjdHMgd2hvc2UgdmFsdWUgaXMgJworICAgICAgICAgICAgJ3VuY2hhbmdlYWJsZVxuJworICAgICAgICAgICAgJ29uY2UgdGhleSBhcmUgY3JlYXRlZCBhcmUgY2FsbGVkICppbW11dGFibGUqLiAoVGhlIHZhbHVlIG9mIGFuXG4nCisgICAgICAgICAgICAnaW1tdXRhYmxlIGNvbnRhaW5lciBvYmplY3QgdGhhdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byBhICcKKyAgICAgICAgICAgICdtdXRhYmxlXG4nCisgICAgICAgICAgICAib2JqZWN0IGNhbiBjaGFuZ2Ugd2hlbiB0aGUgbGF0dGVyJ3MgdmFsdWUgaXMgY2hhbmdlZDsgaG93ZXZlciAiCisgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAnY29udGFpbmVyIGlzIHN0aWxsIGNvbnNpZGVyZWQgaW1tdXRhYmxlLCBiZWNhdXNlIHRoZSBjb2xsZWN0aW9uICcKKyAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgJ29iamVjdHMgaXQgY29udGFpbnMgY2Fubm90IGJlIGNoYW5nZWQuICBTbywgaW1tdXRhYmlsaXR5IGlzIG5vdFxuJworICAgICAgICAgICAgJ3N0cmljdGx5IHRoZSBzYW1lIGFzIGhhdmluZyBhbiB1bmNoYW5nZWFibGUgdmFsdWUsIGl0IGlzIG1vcmUgJworICAgICAgICAgICAgJ3N1YnRsZS4pXG4nCisgICAgICAgICAgICAiQW4gb2JqZWN0J3MgbXV0YWJpbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IGl0cyB0eXBlOyBmb3IgaW5zdGFuY2UsXG4iCisgICAgICAgICAgICAnbnVtYmVycywgc3RyaW5ncyBhbmQgdHVwbGVzIGFyZSBpbW11dGFibGUsIHdoaWxlIGRpY3Rpb25hcmllcyAnCisgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAnbGlzdHMgYXJlIG11dGFibGUuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnT2JqZWN0cyBhcmUgbmV2ZXIgZXhwbGljaXRseSBkZXN0cm95ZWQ7IGhvd2V2ZXIsIHdoZW4gdGhleSAnCisgICAgICAgICAgICAnYmVjb21lXG4nCisgICAgICAgICAgICAndW5yZWFjaGFibGUgdGhleSBtYXkgYmUgZ2FyYmFnZS1jb2xsZWN0ZWQuICBBbiBpbXBsZW1lbnRhdGlvbiBpc1xuJworICAgICAgICAgICAgJ2FsbG93ZWQgdG8gcG9zdHBvbmUgZ2FyYmFnZSBjb2xsZWN0aW9uIG9yIG9taXQgaXQgYWx0b2dldGhlciAtLS0gJworICAgICAgICAgICAgJ2l0IGlzXG4nCisgICAgICAgICAgICAnYSBtYXR0ZXIgb2YgaW1wbGVtZW50YXRpb24gcXVhbGl0eSBob3cgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzXG4nCisgICAgICAgICAgICAnaW1wbGVtZW50ZWQsIGFzIGxvbmcgYXMgbm8gb2JqZWN0cyBhcmUgY29sbGVjdGVkIHRoYXQgYXJlIHN0aWxsXG4nCisgICAgICAgICAgICAncmVhY2hhYmxlLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJyoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQ1B5dGhvbiBjdXJyZW50bHkgdXNlcyBhICcKKyAgICAgICAgICAgICdyZWZlcmVuY2UtXG4nCisgICAgICAgICAgICAnY291bnRpbmcgc2NoZW1lIHdpdGggKG9wdGlvbmFsKSBkZWxheWVkIGRldGVjdGlvbiBvZiBjeWNsaWNhbGx5ICcKKyAgICAgICAgICAgICdsaW5rZWRcbicKKyAgICAgICAgICAgICdnYXJiYWdlLCB3aGljaCBjb2xsZWN0cyBtb3N0IG9iamVjdHMgYXMgc29vbiBhcyB0aGV5IGJlY29tZVxuJworICAgICAgICAgICAgJ3VucmVhY2hhYmxlLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gY29sbGVjdCBnYXJiYWdlIGNvbnRhaW5pbmdcbicKKyAgICAgICAgICAgICdjaXJjdWxhciByZWZlcmVuY2VzLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSAiZ2MiIG1vZHVsZSAnCisgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAnaW5mb3JtYXRpb24gb24gY29udHJvbGxpbmcgdGhlIGNvbGxlY3Rpb24gb2YgY3ljbGljIGdhcmJhZ2UuICcKKyAgICAgICAgICAgICdPdGhlclxuJworICAgICAgICAgICAgJ2ltcGxlbWVudGF0aW9ucyBhY3QgZGlmZmVyZW50bHkgYW5kIENQeXRob24gbWF5IGNoYW5nZS4gRG8gbm90ICcKKyAgICAgICAgICAgICdkZXBlbmRcbicKKyAgICAgICAgICAgICdvbiBpbW1lZGlhdGUgZmluYWxpemF0aW9uIG9mIG9iamVjdHMgd2hlbiB0aGV5IGJlY29tZSB1bnJlYWNoYWJsZSAnCisgICAgICAgICAgICAnKHNvXG4nCisgICAgICAgICAgICAneW91IHNob3VsZCBhbHdheXMgY2xvc2UgZmlsZXMgZXhwbGljaXRseSkuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAiTm90ZSB0aGF0IHRoZSB1c2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uJ3MgdHJhY2luZyBvciBkZWJ1Z2dpbmdcbiIKKyAgICAgICAgICAgICdmYWNpbGl0aWVzIG1heSBrZWVwIG9iamVjdHMgYWxpdmUgdGhhdCB3b3VsZCBub3JtYWxseSBiZSAnCisgICAgICAgICAgICAnY29sbGVjdGFibGUuXG4nCisgICAgICAgICAgICAnQWxzbyBub3RlIHRoYXQgY2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHdpdGggYSBcJyJ0cnkiLi4uImV4Y2VwdCJcJ1xuJworICAgICAgICAgICAgJ3N0YXRlbWVudCBtYXkga2VlcCBvYmplY3RzIGFsaXZlLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ1NvbWUgb2JqZWN0cyBjb250YWluIHJlZmVyZW5jZXMgdG8gImV4dGVybmFsIiByZXNvdXJjZXMgc3VjaCBhcyAnCisgICAgICAgICAgICAnb3BlblxuJworICAgICAgICAgICAgJ2ZpbGVzIG9yIHdpbmRvd3MuICBJdCBpcyB1bmRlcnN0b29kIHRoYXQgdGhlc2UgcmVzb3VyY2VzIGFyZSAnCisgICAgICAgICAgICAnZnJlZWRcbicKKyAgICAgICAgICAgICd3aGVuIHRoZSBvYmplY3QgaXMgZ2FyYmFnZS1jb2xsZWN0ZWQsIGJ1dCBzaW5jZSBnYXJiYWdlICcKKyAgICAgICAgICAgICdjb2xsZWN0aW9uIGlzXG4nCisgICAgICAgICAgICAnbm90IGd1YXJhbnRlZWQgdG8gaGFwcGVuLCBzdWNoIG9iamVjdHMgYWxzbyBwcm92aWRlIGFuIGV4cGxpY2l0ICcKKyAgICAgICAgICAgICd3YXkgdG9cbicKKyAgICAgICAgICAgICdyZWxlYXNlIHRoZSBleHRlcm5hbCByZXNvdXJjZSwgdXN1YWxseSBhICJjbG9zZSgpIiBtZXRob2QuICcKKyAgICAgICAgICAgICdQcm9ncmFtc1xuJworICAgICAgICAgICAgJ2FyZSBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBleHBsaWNpdGx5IGNsb3NlIHN1Y2ggb2JqZWN0cy4gIFRoZVxuJworICAgICAgICAgICAgJ1wnInRyeSIuLi4iZmluYWxseSJcJyBzdGF0ZW1lbnQgYW5kIHRoZSBcJyJ3aXRoIlwnIHN0YXRlbWVudCAnCisgICAgICAgICAgICAncHJvdmlkZVxuJworICAgICAgICAgICAgJ2NvbnZlbmllbnQgd2F5cyB0byBkbyB0aGlzLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ1NvbWUgb2JqZWN0cyBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0czsgdGhlc2UgYXJlICcKKyAgICAgICAgICAgICdjYWxsZWRcbicKKyAgICAgICAgICAgICcqY29udGFpbmVycyouIEV4YW1wbGVzIG9mIGNvbnRhaW5lcnMgYXJlIHR1cGxlcywgbGlzdHMgYW5kXG4nCisgICAgICAgICAgICAiZGljdGlvbmFyaWVzLiAgVGhlIHJlZmVyZW5jZXMgYXJlIHBhcnQgb2YgYSBjb250YWluZXIncyB2YWx1ZS4gICIKKyAgICAgICAgICAgICdJblxuJworICAgICAgICAgICAgJ21vc3QgY2FzZXMsIHdoZW4gd2UgdGFsayBhYm91dCB0aGUgdmFsdWUgb2YgYSBjb250YWluZXIsIHdlIGltcGx5ICcKKyAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICd2YWx1ZXMsIG5vdCB0aGUgaWRlbnRpdGllcyBvZiB0aGUgY29udGFpbmVkIG9iamVjdHM7IGhvd2V2ZXIsICcKKyAgICAgICAgICAgICd3aGVuIHdlXG4nCisgICAgICAgICAgICAndGFsayBhYm91dCB0aGUgbXV0YWJpbGl0eSBvZiBhIGNvbnRhaW5lciwgb25seSB0aGUgaWRlbnRpdGllcyBvZiAnCisgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAnaW1tZWRpYXRlbHkgY29udGFpbmVkIG9iamVjdHMgYXJlIGltcGxpZWQuICBTbywgaWYgYW4gaW1tdXRhYmxlXG4nCisgICAgICAgICAgICAnY29udGFpbmVyIChsaWtlIGEgdHVwbGUpIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgbXV0YWJsZSAnCisgICAgICAgICAgICAnb2JqZWN0LCBpdHNcbicKKyAgICAgICAgICAgICd2YWx1ZSBjaGFuZ2VzIGlmIHRoYXQgbXV0YWJsZSBvYmplY3QgaXMgY2hhbmdlZC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdUeXBlcyBhZmZlY3QgYWxtb3N0IGFsbCBhc3BlY3RzIG9mIG9iamVjdCBiZWhhdmlvci4gIEV2ZW4gdGhlXG4nCisgICAgICAgICAgICAnaW1wb3J0YW5jZSBvZiBvYmplY3QgaWRlbnRpdHkgaXMgYWZmZWN0ZWQgaW4gc29tZSBzZW5zZTogZm9yICcKKyAgICAgICAgICAgICdpbW11dGFibGVcbicKKyAgICAgICAgICAgICd0eXBlcywgb3BlcmF0aW9ucyB0aGF0IGNvbXB1dGUgbmV3IHZhbHVlcyBtYXkgYWN0dWFsbHkgcmV0dXJuIGFcbicKKyAgICAgICAgICAgICdyZWZlcmVuY2UgdG8gYW55IGV4aXN0aW5nIG9iamVjdCB3aXRoIHRoZSBzYW1lIHR5cGUgYW5kIHZhbHVlLCAnCisgICAgICAgICAgICAnd2hpbGVcbicKKyAgICAgICAgICAgICdmb3IgbXV0YWJsZSBvYmplY3RzIHRoaXMgaXMgbm90IGFsbG93ZWQuICBFLmcuLCBhZnRlciAiYSA9IDE7IGIgPSAnCisgICAgICAgICAgICAnMSIsXG4nCisgICAgICAgICAgICAnImEiIGFuZCAiYiIgbWF5IG9yIG1heSBub3QgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHdpdGggdGhlICcKKyAgICAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgICAgJ29uZSwgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGFmdGVyICJjID0gW107IGQgPSBbXSIsICcKKyAgICAgICAgICAgICciYyJcbicKKyAgICAgICAgICAgICdhbmQgImQiIGFyZSBndWFyYW50ZWVkIHRvIHJlZmVyIHRvIHR3byBkaWZmZXJlbnQsIHVuaXF1ZSwgbmV3bHlcbicKKyAgICAgICAgICAgICdjcmVhdGVkIGVtcHR5IGxpc3RzLiAoTm90ZSB0aGF0ICJjID0gZCA9IFtdIiBhc3NpZ25zIHRoZSBzYW1lICcKKyAgICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAgICd0byBib3RoICJjIiBhbmQgImQiLilcbicsCisgJ29wZXJhdG9yLXN1bW1hcnknOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnT3BlcmF0b3IgcHJlY2VkZW5jZVxuJworICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIG9wZXJhdG9yIHByZWNlZGVuY2UgJworICAgICAgICAgICAgICAgICAgICAgJ2luIFB5dGhvbiwgZnJvbVxuJworICAgICAgICAgICAgICAgICAgICAgJ2xvd2VzdCBwcmVjZWRlbmNlIChsZWFzdCBiaW5kaW5nKSB0byBoaWdoZXN0IHByZWNlZGVuY2UgJworICAgICAgICAgICAgICAgICAgICAgJyhtb3N0XG4nCisgICAgICAgICAgICAgICAgICAgICAnYmluZGluZykuICBPcGVyYXRvcnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICAgICAgJ3ByZWNlZGVuY2UuICBVbmxlc3NcbicKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc3ludGF4IGlzIGV4cGxpY2l0bHkgZ2l2ZW4sIG9wZXJhdG9ycyBhcmUgYmluYXJ5LiAgJworICAgICAgICAgICAgICAgICAgICAgJ09wZXJhdG9ycyBpblxuJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIGJveCBncm91cCBsZWZ0IHRvIHJpZ2h0IChleGNlcHQgZm9yICcKKyAgICAgICAgICAgICAgICAgICAgICdleHBvbmVudGlhdGlvbiwgd2hpY2hcbicKKyAgICAgICAgICAgICAgICAgICAgICdncm91cHMgZnJvbSByaWdodCB0byBsZWZ0KS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdOb3RlIHRoYXQgY29tcGFyaXNvbnMsIG1lbWJlcnNoaXAgdGVzdHMsIGFuZCBpZGVudGl0eSAnCisgICAgICAgICAgICAgICAgICAgICAndGVzdHMsIGFsbCBoYXZlXG4nCisgICAgICAgICAgICAgICAgICAgICAndGhlIHNhbWUgcHJlY2VkZW5jZSBhbmQgaGF2ZSBhIGxlZnQtdG8tcmlnaHQgY2hhaW5pbmcgJworICAgICAgICAgICAgICAgICAgICAgJ2ZlYXR1cmUgYXNcbicKKyAgICAgICAgICAgICAgICAgICAgICdkZXNjcmliZWQgaW4gdGhlIENvbXBhcmlzb25zIHNlY3Rpb24uXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgT3BlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgImxhbWJkYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnTGFtYmRhIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgImlmIiAtLSAiZWxzZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIm9yIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQm9vbGVhbiBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgImFuZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQm9vbGVhbiBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIm5vdCIgIngiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQm9vbGVhbiBOT1QgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgImluIiwgIm5vdCBpbiIsICJpcyIsICJpcyBub3QiLCAiPCIsICI8PSIsICI+IiwgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQ29tcGFyaXNvbnMsIGluY2x1ZGluZyBtZW1iZXJzaGlwICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiPj0iLCAiIT0iLCAiPT0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICd0ZXN0cyBhbmQgaWRlbnRpdHkgdGVzdHMgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAifCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdCaXR3aXNlIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiXiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdCaXR3aXNlIFhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiJiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdCaXR3aXNlIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiPDwiLCAiPj4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdTaGlmdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiKyIsICItIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdBZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdNdWx0aXBsaWNhdGlvbiwgbWF0cml4IG11bHRpcGxpY2F0aW9uIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ2RpdmlzaW9uLCByZW1haW5kZXIgWzVdICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICIreCIsICIteCIsICJ+eCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ1Bvc2l0aXZlLCBuZWdhdGl2ZSwgYml0d2lzZSBOT1QgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICIqKiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0V4cG9uZW50aWF0aW9uIFs2XSAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJhd2FpdCIgIngiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0F3YWl0IGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJ4W2luZGV4XSIsICJ4W2luZGV4OmluZGV4XSIsICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ1N1YnNjcmlwdGlvbiwgc2xpY2luZywgY2FsbCwgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIngoYXJndW1lbnRzLi4uKSIsICJ4LmF0dHJpYnV0ZSIgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIHJlZmVyZW5jZSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIihleHByZXNzaW9ucy4uLikiLCAiW2V4cHJlc3Npb25zLi4uXSIsICJ7a2V5OiAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQmluZGluZyBvciB0dXBsZSBkaXNwbGF5LCBsaXN0ICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCB2YWx1ZS4uLn0iLCAie2V4cHJlc3Npb25zLi4ufSIgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5LCBkaWN0aW9uYXJ5IGRpc3BsYXksIHNldCAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICctWyBGb290bm90ZXMgXS1cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdbMV0gV2hpbGUgImFicyh4JXkpIDwgYWJzKHkpIiBpcyB0cnVlIG1hdGhlbWF0aWNhbGx5LCAnCisgICAgICAgICAgICAgICAgICAgICAnZm9yIGZsb2F0c1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBpdCBtYXkgbm90IGJlIHRydWUgbnVtZXJpY2FsbHkgZHVlIHRvIHJvdW5kb2ZmLiAgRm9yICcKKyAgICAgICAgICAgICAgICAgICAgICdleGFtcGxlLCBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgYXNzdW1pbmcgYSBwbGF0Zm9ybSBvbiB3aGljaCBhIFB5dGhvbiBmbG9hdCBpcyBhbiAnCisgICAgICAgICAgICAgICAgICAgICAnSUVFRSA3NTQgZG91YmxlLVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBwcmVjaXNpb24gbnVtYmVyLCBpbiBvcmRlciB0aGF0ICItMWUtMTAwICUgMWUxMDAiICcKKyAgICAgICAgICAgICAgICAgICAgICdoYXZlIHRoZSBzYW1lXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHNpZ24gYXMgIjFlMTAwIiwgdGhlIGNvbXB1dGVkIHJlc3VsdCBpcyAiLTFlLTEwMCArICcKKyAgICAgICAgICAgICAgICAgICAgICcxZTEwMCIsIHdoaWNoXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGlzIG51bWVyaWNhbGx5IGV4YWN0bHkgZXF1YWwgdG8gIjFlMTAwIi4gIFRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb25cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgIm1hdGguZm1vZCgpIiByZXR1cm5zIGEgcmVzdWx0IHdob3NlIHNpZ24gbWF0Y2hlcyAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIHNpZ24gb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGZpcnN0IGFyZ3VtZW50IGluc3RlYWQsIGFuZCBzbyByZXR1cm5zICItMWUtMTAwIiBpbiAnCisgICAgICAgICAgICAgICAgICAgICAndGhpcyBjYXNlLlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBXaGljaCBhcHByb2FjaCBpcyBtb3JlIGFwcHJvcHJpYXRlIGRlcGVuZHMgb24gdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdbMl0gSWYgeCBpcyB2ZXJ5IGNsb3NlIHRvIGFuIGV4YWN0IGludGVnZXIgbXVsdGlwbGUgb2YgJworICAgICAgICAgICAgICAgICAgICAgInksIGl0J3NcbiIKKyAgICAgICAgICAgICAgICAgICAgICcgICAgcG9zc2libGUgZm9yICJ4Ly95IiB0byBiZSBvbmUgbGFyZ2VyIHRoYW4gJworICAgICAgICAgICAgICAgICAgICAgJyIoeC14JXkpLy95IiBkdWUgdG9cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgcm91bmRpbmcuICBJbiBzdWNoIGNhc2VzLCBQeXRob24gcmV0dXJucyB0aGUgbGF0dGVyICcKKyAgICAgICAgICAgICAgICAgICAgICdyZXN1bHQsIGluXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIG9yZGVyIHRvIHByZXNlcnZlIHRoYXQgImRpdm1vZCh4LHkpWzBdICogeSArIHggJSB5IiAnCisgICAgICAgICAgICAgICAgICAgICAnYmUgdmVyeSBjbG9zZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICB0byAieCIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnWzNdIFRoZSBVbmljb2RlIHN0YW5kYXJkIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiAqY29kZSAnCisgICAgICAgICAgICAgICAgICAgICAncG9pbnRzKiAoZS5nLlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBVKzAwNDEpIGFuZCAqYWJzdHJhY3QgY2hhcmFjdGVycyogKGUuZy4gIkxBVElOICcKKyAgICAgICAgICAgICAgICAgICAgICdDQVBJVEFMIExFVFRFUiBBIikuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFdoaWxlIG1vc3QgYWJzdHJhY3QgY2hhcmFjdGVycyBpbiBVbmljb2RlIGFyZSBvbmx5ICcKKyAgICAgICAgICAgICAgICAgICAgICdyZXByZXNlbnRlZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICB1c2luZyBvbmUgY29kZSBwb2ludCwgdGhlcmUgaXMgYSBudW1iZXIgb2YgYWJzdHJhY3QgJworICAgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgdGhhdCBjYW4gaW4gYWRkaXRpb24gYmUgcmVwcmVzZW50ZWQgdXNpbmcgYSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAnb2YgbW9yZSB0aGFuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIG9uZSBjb2RlIHBvaW50LiAgRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdCBjaGFyYWN0ZXIgJworICAgICAgICAgICAgICAgICAgICAgJyJMQVRJTlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSIgY2FuIGJlIHJlcHJlc2VudGVkIGFzICcKKyAgICAgICAgICAgICAgICAgICAgICdhIHNpbmdsZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAqcHJlY29tcG9zZWQgY2hhcmFjdGVyKiBhdCBjb2RlIHBvc2l0aW9uIFUrMDBDNywgb3IgJworICAgICAgICAgICAgICAgICAgICAgJ2FzIGEgc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgb2YgYSAqYmFzZSBjaGFyYWN0ZXIqIGF0IGNvZGUgcG9zaXRpb24gVSswMDQzIChMQVRJTiAnCisgICAgICAgICAgICAgICAgICAgICAnQ0FQSVRBTFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBMRVRURVIgQyksIGZvbGxvd2VkIGJ5IGEgKmNvbWJpbmluZyBjaGFyYWN0ZXIqIGF0ICcKKyAgICAgICAgICAgICAgICAgICAgICdjb2RlIHBvc2l0aW9uXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFUrMDMyNyAoQ09NQklOSU5HIENFRElMTEEpLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBUaGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgb24gc3RyaW5ncyBjb21wYXJlIGF0IHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnbGV2ZWwgb2ZcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgVW5pY29kZSBjb2RlIHBvaW50cy4gVGhpcyBtYXkgYmUgY291bnRlci1pbnR1aXRpdmUgJworICAgICAgICAgICAgICAgICAgICAgJ3RvIGh1bWFucy4gIEZvclxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBleGFtcGxlLCAiIlxcdTAwQzciID09ICJcXHUwMDQzXFx1MDMyNyIiIGlzICJGYWxzZSIsICcKKyAgICAgICAgICAgICAgICAgICAgICdldmVuIHRob3VnaCBib3RoXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHN0cmluZ3MgcmVwcmVzZW50IHRoZSBzYW1lIGFic3RyYWN0IGNoYXJhY3RlciAiTEFUSU4gJworICAgICAgICAgICAgICAgICAgICAgJ0NBUElUQUxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgTEVUVEVSIEMgV0lUSCBDRURJTExBIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgVG8gY29tcGFyZSBzdHJpbmdzIGF0IHRoZSBsZXZlbCBvZiBhYnN0cmFjdCAnCisgICAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyAodGhhdCBpcyxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgaW4gYSB3YXkgaW50dWl0aXZlIHRvIGh1bWFucyksIHVzZSAnCisgICAgICAgICAgICAgICAgICAgICAnInVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgpIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdbNF0gRHVlIHRvIGF1dG9tYXRpYyBnYXJiYWdlLWNvbGxlY3Rpb24sIGZyZWUgbGlzdHMsIGFuZCAnCisgICAgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGR5bmFtaWMgbmF0dXJlIG9mIGRlc2NyaXB0b3JzLCB5b3UgbWF5IG5vdGljZSAnCisgICAgICAgICAgICAgICAgICAgICAnc2VlbWluZ2x5IHVudXN1YWxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgYmVoYXZpb3VyIGluIGNlcnRhaW4gdXNlcyBvZiB0aGUgImlzIiBvcGVyYXRvciwgbGlrZSAnCisgICAgICAgICAgICAgICAgICAgICAndGhvc2VcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgaW52b2x2aW5nIGNvbXBhcmlzb25zIGJldHdlZW4gaW5zdGFuY2UgbWV0aG9kcywgb3IgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnN0YW50cy5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgQ2hlY2sgdGhlaXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1s1XSBUaGUgIiUiIG9wZXJhdG9yIGlzIGFsc28gdXNlZCBmb3Igc3RyaW5nIGZvcm1hdHRpbmc7ICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc2FtZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBwcmVjZWRlbmNlIGFwcGxpZXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnWzZdIFRoZSBwb3dlciBvcGVyYXRvciAiKioiIGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIGFuICcKKyAgICAgICAgICAgICAgICAgICAgICdhcml0aG1ldGljXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIG9yIGJpdHdpc2UgdW5hcnkgb3BlcmF0b3Igb24gaXRzIHJpZ2h0LCB0aGF0IGlzLCAnCisgICAgICAgICAgICAgICAgICAgICAnIjIqKi0xIiBpcyAiMC41Ii5cbicsCisgJ3Bhc3MnOiAnXG4nCisgICAgICAgICAnVGhlICJwYXNzIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIHBhc3Nfc3RtdCA6Oj0gInBhc3MiXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnInBhc3MiIGlzIGEgbnVsbCBvcGVyYXRpb24gLS0tIHdoZW4gaXQgaXMgZXhlY3V0ZWQsIG5vdGhpbmcgJworICAgICAgICAgJ2hhcHBlbnMuXG4nCisgICAgICAgICAnSXQgaXMgdXNlZnVsIGFzIGEgcGxhY2Vob2xkZXIgd2hlbiBhIHN0YXRlbWVudCBpcyByZXF1aXJlZFxuJworICAgICAgICAgJ3N5bnRhY3RpY2FsbHksIGJ1dCBubyBjb2RlIG5lZWRzIHRvIGJlIGV4ZWN1dGVkLCBmb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcgICBkZWYgZihhcmcpOiBwYXNzICAgICMgYSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZyAoeWV0KVxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIGNsYXNzIEM6IHBhc3MgICAgICAgIyBhIGNsYXNzIHdpdGggbm8gbWV0aG9kcyAoeWV0KVxuJywKKyAncG93ZXInOiAnXG4nCisgICAgICAgICAgJ1RoZSBwb3dlciBvcGVyYXRvclxuJworICAgICAgICAgICcqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSBwb3dlciBvcGVyYXRvciBiaW5kcyBtb3JlIHRpZ2h0bHkgdGhhbiB1bmFyeSBvcGVyYXRvcnMgb24gaXRzXG4nCisgICAgICAgICAgJ2xlZnQ7IGl0IGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHMgcmlnaHQuICAnCisgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICdzeW50YXggaXM6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBwb3dlciA6Oj0gKCBhd2FpdF9leHByIHwgcHJpbWFyeSApIFsiKioiIHVfZXhwcl1cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RodXMsIGluIGFuIHVucGFyZW50aGVzaXplZCBzZXF1ZW5jZSBvZiBwb3dlciBhbmQgdW5hcnkgb3BlcmF0b3JzLCAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICdvcGVyYXRvcnMgYXJlIGV2YWx1YXRlZCBmcm9tIHJpZ2h0IHRvIGxlZnQgKHRoaXMgZG9lcyBub3QgJworICAgICAgICAgICdjb25zdHJhaW5cbicKKyAgICAgICAgICAndGhlIGV2YWx1YXRpb24gb3JkZXIgZm9yIHRoZSBvcGVyYW5kcyk6ICItMSoqMiIgcmVzdWx0cyBpbiAiLTEiLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhlIHBvd2VyIG9wZXJhdG9yIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGJ1aWx0LWluICJwb3coKSJcbicKKyAgICAgICAgICAnZnVuY3Rpb24sIHdoZW4gY2FsbGVkIHdpdGggdHdvIGFyZ3VtZW50czogaXQgeWllbGRzIGl0cyBsZWZ0ICcKKyAgICAgICAgICAnYXJndW1lbnRcbicKKyAgICAgICAgICAncmFpc2VkIHRvIHRoZSBwb3dlciBvZiBpdHMgcmlnaHQgYXJndW1lbnQuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgJworICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAnZmlyc3QgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUsIGFuZCB0aGUgcmVzdWx0IGlzIG9mIHRoYXQgdHlwZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0ZvciBpbnQgb3BlcmFuZHMsIHRoZSByZXN1bHQgaGFzIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG9wZXJhbmRzICcKKyAgICAgICAgICAndW5sZXNzXG4nCisgICAgICAgICAgJ3RoZSBzZWNvbmQgYXJndW1lbnQgaXMgbmVnYXRpdmU7IGluIHRoYXQgY2FzZSwgYWxsIGFyZ3VtZW50cyBhcmVcbicKKyAgICAgICAgICAnY29udmVydGVkIHRvIGZsb2F0IGFuZCBhIGZsb2F0IHJlc3VsdCBpcyBkZWxpdmVyZWQuIEZvciBleGFtcGxlLFxuJworICAgICAgICAgICciMTAqKjIiIHJldHVybnMgIjEwMCIsIGJ1dCAiMTAqKi0yIiByZXR1cm5zICIwLjAxIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1JhaXNpbmcgIjAuMCIgdG8gYSBuZWdhdGl2ZSBwb3dlciByZXN1bHRzIGluIGEgJworICAgICAgICAgICciWmVyb0RpdmlzaW9uRXJyb3IiLlxuJworICAgICAgICAgICdSYWlzaW5nIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGEgZnJhY3Rpb25hbCBwb3dlciByZXN1bHRzIGluIGEgJworICAgICAgICAgICciY29tcGxleCJcbicKKyAgICAgICAgICAnbnVtYmVyLiAoSW4gZWFybGllciB2ZXJzaW9ucyBpdCByYWlzZWQgYSAiVmFsdWVFcnJvciIuKVxuJywKKyAncmFpc2UnOiAnXG4nCisgICAgICAgICAgJ1RoZSAicmFpc2UiIHN0YXRlbWVudFxuJworICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIHJhaXNlX3N0bXQgOjo9ICJyYWlzZSIgW2V4cHJlc3Npb24gWyJmcm9tIiBleHByZXNzaW9uXV1cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0lmIG5vIGV4cHJlc3Npb25zIGFyZSBwcmVzZW50LCAicmFpc2UiIHJlLXJhaXNlcyB0aGUgbGFzdCAnCisgICAgICAgICAgJ2V4Y2VwdGlvblxuJworICAgICAgICAgICd0aGF0IHdhcyBhY3RpdmUgaW4gdGhlIGN1cnJlbnQgc2NvcGUuICBJZiBubyBleGNlcHRpb24gaXMgYWN0aXZlICcKKyAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAndGhlIGN1cnJlbnQgc2NvcGUsIGEgIlJ1bnRpbWVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCBpbmRpY2F0aW5nXG4nCisgICAgICAgICAgJ3RoYXQgdGhpcyBpcyBhbiBlcnJvci5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ090aGVyd2lzZSwgInJhaXNlIiBldmFsdWF0ZXMgdGhlIGZpcnN0IGV4cHJlc3Npb24gYXMgdGhlIGV4Y2VwdGlvblxuJworICAgICAgICAgICdvYmplY3QuICBJdCBtdXN0IGJlIGVpdGhlciBhIHN1YmNsYXNzIG9yIGFuIGluc3RhbmNlIG9mXG4nCisgICAgICAgICAgJyJCYXNlRXhjZXB0aW9uIi4gSWYgaXQgaXMgYSBjbGFzcywgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSB3aWxsIGJlXG4nCisgICAgICAgICAgJ29idGFpbmVkIHdoZW4gbmVlZGVkIGJ5IGluc3RhbnRpYXRpbmcgdGhlIGNsYXNzIHdpdGggbm8gYXJndW1lbnRzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAiVGhlICp0eXBlKiBvZiB0aGUgZXhjZXB0aW9uIGlzIHRoZSBleGNlcHRpb24gaW5zdGFuY2UncyBjbGFzcywgdGhlXG4iCisgICAgICAgICAgJyp2YWx1ZSogaXMgdGhlIGluc3RhbmNlIGl0c2VsZi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgdHJhY2ViYWNrIG9iamVjdCBpcyBub3JtYWxseSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiAnCisgICAgICAgICAgJ2V4Y2VwdGlvblxuJworICAgICAgICAgICdpcyByYWlzZWQgYW5kIGF0dGFjaGVkIHRvIGl0IGFzIHRoZSAiX190cmFjZWJhY2tfXyIgYXR0cmlidXRlLCAnCisgICAgICAgICAgJ3doaWNoXG4nCisgICAgICAgICAgJ2lzIHdyaXRhYmxlLiBZb3UgY2FuIGNyZWF0ZSBhbiBleGNlcHRpb24gYW5kIHNldCB5b3VyIG93biB0cmFjZWJhY2sgJworICAgICAgICAgICdpblxuJworICAgICAgICAgICdvbmUgc3RlcCB1c2luZyB0aGUgIndpdGhfdHJhY2ViYWNrKCkiIGV4Y2VwdGlvbiBtZXRob2QgKHdoaWNoICcKKyAgICAgICAgICAncmV0dXJuc1xuJworICAgICAgICAgICd0aGUgc2FtZSBleGNlcHRpb24gaW5zdGFuY2UsIHdpdGggaXRzIHRyYWNlYmFjayBzZXQgdG8gaXRzICcKKyAgICAgICAgICAnYXJndW1lbnQpLFxuJworICAgICAgICAgICdsaWtlIHNvOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgcmFpc2UgRXhjZXB0aW9uKCJmb28gb2NjdXJyZWQiKS53aXRoX3RyYWNlYmFjayh0cmFjZWJhY2tvYmopXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgImZyb20iIGNsYXVzZSBpcyB1c2VkIGZvciBleGNlcHRpb24gY2hhaW5pbmc6IGlmIGdpdmVuLCB0aGUgJworICAgICAgICAgICdzZWNvbmRcbicKKyAgICAgICAgICAnKmV4cHJlc3Npb24qIG11c3QgYmUgYW5vdGhlciBleGNlcHRpb24gY2xhc3Mgb3IgaW5zdGFuY2UsIHdoaWNoICcKKyAgICAgICAgICAnd2lsbFxuJworICAgICAgICAgICd0aGVuIGJlIGF0dGFjaGVkIHRvIHRoZSByYWlzZWQgZXhjZXB0aW9uIGFzIHRoZSAiX19jYXVzZV9fIiAnCisgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICcod2hpY2ggaXMgd3JpdGFibGUpLiAgSWYgdGhlIHJhaXNlZCBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQsIGJvdGhcbicKKyAgICAgICAgICAnZXhjZXB0aW9ucyB3aWxsIGJlIHByaW50ZWQ6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICA+Pj4gdHJ5OlxuJworICAgICAgICAgICcgICAuLi4gICAgIHByaW50KDEgLyAwKVxuJworICAgICAgICAgICcgICAuLi4gZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6XG4nCisgICAgICAgICAgJyAgIC4uLiAgICAgcmFpc2UgUnVudGltZUVycm9yKCJTb21ldGhpbmcgYmFkIGhhcHBlbmVkIikgZnJvbSBleGNcbicKKyAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAnICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA8bW9kdWxlPlxuJworICAgICAgICAgICcgICBaZXJvRGl2aXNpb25FcnJvcjogaW50IGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBUaGUgYWJvdmUgZXhjZXB0aW9uIHdhcyB0aGUgZGlyZWN0IGNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgJworICAgICAgICAgICdleGNlcHRpb246XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgNCwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAnICAgUnVudGltZUVycm9yOiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBIHNpbWlsYXIgbWVjaGFuaXNtIHdvcmtzIGltcGxpY2l0bHkgaWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCAnCisgICAgICAgICAgJ2luc2lkZVxuJworICAgICAgICAgICdhbiBleGNlcHRpb24gaGFuZGxlciBvciBhICJmaW5hbGx5IiBjbGF1c2U6IHRoZSBwcmV2aW91cyBleGNlcHRpb24gJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICd0aGVuIGF0dGFjaGVkIGFzIHRoZSBuZXcgZXhjZXB0aW9uXCdzICJfX2NvbnRleHRfXyIgYXR0cmlidXRlOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgPj4+IHRyeTpcbicKKyAgICAgICAgICAnICAgLi4uICAgICBwcmludCgxIC8gMClcbicKKyAgICAgICAgICAnICAgLi4uIGV4Y2VwdDpcbicKKyAgICAgICAgICAnICAgLi4uICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQiKVxuJworICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAnICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJworICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIDxtb2R1bGU+XG4nCisgICAgICAgICAgJyAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnQgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIER1cmluZyBoYW5kbGluZyBvZiB0aGUgYWJvdmUgZXhjZXB0aW9uLCBhbm90aGVyIGV4Y2VwdGlvbiAnCisgICAgICAgICAgJ29jY3VycmVkOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJworICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDQsIGluIDxtb2R1bGU+XG4nCisgICAgICAgICAgJyAgIFJ1bnRpbWVFcnJvcjogU29tZXRoaW5nIGJhZCBoYXBwZW5lZFxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4nCisgICAgICAgICAgJ0V4Y2VwdGlvbnMsIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBoYW5kbGluZyBleGNlcHRpb25zIGlzIGluICcKKyAgICAgICAgICAnc2VjdGlvblxuJworICAgICAgICAgICdUaGUgdHJ5IHN0YXRlbWVudC5cbicsCisgJ3JldHVybic6ICdcbicKKyAgICAgICAgICAgJ1RoZSAicmV0dXJuIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgcmV0dXJuX3N0bXQgOjo9ICJyZXR1cm4iIFtleHByZXNzaW9uX2xpc3RdXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyJyZXR1cm4iIG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgZnVuY3Rpb24gJworICAgICAgICAgICAnZGVmaW5pdGlvbixcbicKKyAgICAgICAgICAgJ25vdCB3aXRoaW4gYSBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSWYgYW4gZXhwcmVzc2lvbiBsaXN0IGlzIHByZXNlbnQsIGl0IGlzIGV2YWx1YXRlZCwgZWxzZSAiTm9uZSIgaXNcbicKKyAgICAgICAgICAgJ3N1YnN0aXR1dGVkLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcicmV0dXJuIiBsZWF2ZXMgdGhlIGN1cnJlbnQgZnVuY3Rpb24gY2FsbCB3aXRoIHRoZSBleHByZXNzaW9uIGxpc3QgJworICAgICAgICAgICAnKG9yXG4nCisgICAgICAgICAgICciTm9uZSIpIGFzIHJldHVybiB2YWx1ZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnV2hlbiAicmV0dXJuIiBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSAidHJ5IiBzdGF0ZW1lbnQgd2l0aCBhICcKKyAgICAgICAgICAgJyJmaW5hbGx5IlxuJworICAgICAgICAgICAnY2xhdXNlLCB0aGF0ICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseSBsZWF2aW5nICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnZnVuY3Rpb24uXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0luIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLCB0aGUgInJldHVybiIgc3RhdGVtZW50IGluZGljYXRlcyB0aGF0ICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnZ2VuZXJhdG9yIGlzIGRvbmUgYW5kIHdpbGwgY2F1c2UgIlN0b3BJdGVyYXRpb24iIHRvIGJlIHJhaXNlZC4gJworICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICdyZXR1cm5lZCB2YWx1ZSAoaWYgYW55KSBpcyB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIGNvbnN0cnVjdFxuJworICAgICAgICAgICAnIlN0b3BJdGVyYXRpb24iIGFuZCBiZWNvbWVzIHRoZSAiU3RvcEl0ZXJhdGlvbi52YWx1ZSIgYXR0cmlidXRlLlxuJywKKyAnc2VxdWVuY2UtdHlwZXMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgJ0VtdWxhdGluZyBjb250YWluZXIgdHlwZXNcbicKKyAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCAnCisgICAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lciBvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAgICdDb250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpICcKKyAgICAgICAgICAgICAgICAgICAnb3IgbWFwcGluZ3NcbicKKyAgICAgICAgICAgICAgICAgICAnKGxpa2UgZGljdGlvbmFyaWVzKSwgYnV0IGNhbiByZXByZXNlbnQgb3RoZXIgY29udGFpbmVycyBhcyAnCisgICAgICAgICAgICAgICAgICAgJ3dlbGwuICBUaGVcbicKKyAgICAgICAgICAgICAgICAgICAnZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgICAnb3IgdG9cbicKKyAgICAgICAgICAgICAgICAgICAnZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEgc2VxdWVuY2UsICcKKyAgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAgJ2FsbG93YWJsZSBrZXlzIHNob3VsZCBiZSB0aGUgaW50ZWdlcnMgKmsqIGZvciB3aGljaCAiMCA8PSAnCisgICAgICAgICAgICAgICAgICAgJ2sgPCBOIiB3aGVyZVxuJworICAgICAgICAgICAgICAgICAgICcqTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoICcKKyAgICAgICAgICAgICAgICAgICAnZGVmaW5lIGFcbicKKyAgICAgICAgICAgICAgICAgICAncmFuZ2Ugb2YgaXRlbXMuICBJdCBpcyBhbHNvIHJlY29tbWVuZGVkIHRoYXQgbWFwcGluZ3MgJworICAgICAgICAgICAgICAgICAgICdwcm92aWRlIHRoZVxuJworICAgICAgICAgICAgICAgICAgICdtZXRob2RzICJrZXlzKCkiLCAidmFsdWVzKCkiLCAiaXRlbXMoKSIsICJnZXQoKSIsICcKKyAgICAgICAgICAgICAgICAgICAnImNsZWFyKCkiLFxuJworICAgICAgICAgICAgICAgICAgICcic2V0ZGVmYXVsdCgpIiwgInBvcCgpIiwgInBvcGl0ZW0oKSIsICJjb3B5KCkiLCBhbmQgJworICAgICAgICAgICAgICAgICAgICcidXBkYXRlKCkiXG4nCisgICAgICAgICAgICAgICAgICAgImJlaGF2aW5nIHNpbWlsYXIgdG8gdGhvc2UgZm9yIFB5dGhvbidzIHN0YW5kYXJkIGRpY3Rpb25hcnkgIgorICAgICAgICAgICAgICAgICAgICdvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAgICdUaGUgImNvbGxlY3Rpb25zIiBtb2R1bGUgcHJvdmlkZXMgYSAiTXV0YWJsZU1hcHBpbmciICcKKyAgICAgICAgICAgICAgICAgICAnYWJzdHJhY3QgYmFzZVxuJworICAgICAgICAgICAgICAgICAgICdjbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZiAnCisgICAgICAgICAgICAgICAgICAgJyJfX2dldGl0ZW1fXygpIixcbicKKyAgICAgICAgICAgICAgICAgICAnIl9fc2V0aXRlbV9fKCkiLCAiX19kZWxpdGVtX18oKSIsIGFuZCAia2V5cygpIi4gTXV0YWJsZSAnCisgICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlc1xuJworICAgICAgICAgICAgICAgICAgICdzaG91bGQgcHJvdmlkZSBtZXRob2RzICJhcHBlbmQoKSIsICJjb3VudCgpIiwgImluZGV4KCkiLCAnCisgICAgICAgICAgICAgICAgICAgJyJleHRlbmQoKSIsXG4nCisgICAgICAgICAgICAgICAgICAgJyJpbnNlcnQoKSIsICJwb3AoKSIsICJyZW1vdmUoKSIsICJyZXZlcnNlKCkiIGFuZCAic29ydCgpIiwgJworICAgICAgICAgICAgICAgICAgICdsaWtlIFB5dGhvblxuJworICAgICAgICAgICAgICAgICAgICdzdGFuZGFyZCBsaXN0IG9iamVjdHMuICBGaW5hbGx5LCBzZXF1ZW5jZSB0eXBlcyBzaG91bGQgJworICAgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICAnYWRkaXRpb24gKG1lYW5pbmcgY29uY2F0ZW5hdGlvbikgYW5kIG11bHRpcGxpY2F0aW9uICcKKyAgICAgICAgICAgICAgICAgICAnKG1lYW5pbmdcbicKKyAgICAgICAgICAgICAgICAgICAncmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlIG1ldGhvZHMgIl9fYWRkX18oKSIsICcKKyAgICAgICAgICAgICAgICAgICAnIl9fcmFkZF9fKCkiLFxuJworICAgICAgICAgICAgICAgICAgICciX19pYWRkX18oKSIsICJfX211bF9fKCkiLCAiX19ybXVsX18oKSIgYW5kICJfX2ltdWxfXygpIiAnCisgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaWJlZFxuJworICAgICAgICAgICAgICAgICAgICdiZWxvdzsgdGhleSBzaG91bGQgbm90IGRlZmluZSBvdGhlciBudW1lcmljYWwgb3BlcmF0b3JzLiAgJworICAgICAgICAgICAgICAgICAgICdJdCBpc1xuJworICAgICAgICAgICAgICAgICAgICdyZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnIl9fY29udGFpbnNfXygpIiBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgImluIiAnCisgICAgICAgICAgICAgICAgICAgJ29wZXJhdG9yO1xuJworICAgICAgICAgICAgICAgICAgICdmb3IgbWFwcGluZ3MsICJpbiIgc2hvdWxkIHNlYXJjaCB0aGUgbWFwcGluZ1wncyBrZXlzOyBmb3IgJworICAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZXMsIGl0XG4nCisgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlciAnCisgICAgICAgICAgICAgICAgICAgJ3JlY29tbWVuZGVkIHRoYXQgYm90aFxuJworICAgICAgICAgICAgICAgICAgICdtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGUgIl9faXRlcl9fKCkiIG1ldGhvZCAnCisgICAgICAgICAgICAgICAgICAgJ3RvIGFsbG93XG4nCisgICAgICAgICAgICAgICAgICAgJ2VmZmljaWVudCBpdGVyYXRpb24gdGhyb3VnaCB0aGUgY29udGFpbmVyOyBmb3IgbWFwcGluZ3MsICcKKyAgICAgICAgICAgICAgICAgICAnIl9faXRlcl9fKCkiXG4nCisgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSB0aGUgc2FtZSBhcyAia2V5cygpIjsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkICcKKyAgICAgICAgICAgICAgICAgICAnaXRlcmF0ZVxuJworICAgICAgICAgICAgICAgICAgICd0aHJvdWdoIHRoZSB2YWx1ZXMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19sZW5fXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIi4gICcKKyAgICAgICAgICAgICAgICAgICAnU2hvdWxkIHJldHVyblxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QsIGFuIGludGVnZXIgIj49IiAwLiAgQWxzbywgYW4gJworICAgICAgICAgICAgICAgICAgICdvYmplY3QgdGhhdFxuJworICAgICAgICAgICAgICAgICAgICcgICBkb2VzblwndCBkZWZpbmUgYSAiX19ib29sX18oKSIgbWV0aG9kIGFuZCB3aG9zZSAnCisgICAgICAgICAgICAgICAgICAgJyJfX2xlbl9fKCkiIG1ldGhvZFxuJworICAgICAgICAgICAgICAgICAgICcgICByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhIEJvb2xlYW4gJworICAgICAgICAgICAgICAgICAgICdjb250ZXh0LlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbGVuZ3RoX2hpbnRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IubGVuZ3RoX2hpbnQoKSIuIFNob3VsZCAnCisgICAgICAgICAgICAgICAgICAgJ3JldHVybiBhblxuJworICAgICAgICAgICAgICAgICAgICcgICBlc3RpbWF0ZWQgbGVuZ3RoIGZvciB0aGUgb2JqZWN0ICh3aGljaCBtYXkgYmUgZ3JlYXRlciAnCisgICAgICAgICAgICAgICAgICAgJ29yIGxlc3MgdGhhblxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgYWN0dWFsIGxlbmd0aCkuIFRoZSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyICI+PSIgJworICAgICAgICAgICAgICAgICAgICcwLiBUaGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCBpcyBwdXJlbHkgYW4gb3B0aW1pemF0aW9uIGFuZCBpcyBuZXZlciByZXF1aXJlZCAnCisgICAgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICAgICcgICBjb3JyZWN0bmVzcy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuNC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ05vdGU6IFNsaWNpbmcgaXMgZG9uZSBleGNsdXNpdmVseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGhyZWUgJworICAgICAgICAgICAgICAgICAgICdtZXRob2RzLlxuJworICAgICAgICAgICAgICAgICAgICcgIEEgY2FsbCBsaWtlXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICAgIGFbMToyXSA9IGJcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgaXMgdHJhbnNsYXRlZCB0b1xuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICBhW3NsaWNlKDEsIDIsIE5vbmUpXSA9IGJcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgYW5kIHNvIGZvcnRoLiAgTWlzc2luZyBzbGljZSBpdGVtcyBhcmUgYWx3YXlzIGZpbGxlZCBpbiAnCisgICAgICAgICAgICAgICAgICAgJ3dpdGggIk5vbmUiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiAic2VsZltrZXldIi4gRm9yICcKKyAgICAgICAgICAgICAgICAgICAnc2VxdWVuY2UgdHlwZXMsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBhY2NlcHRlZCBrZXlzIHNob3VsZCBiZSBpbnRlZ2VycyBhbmQgc2xpY2UgJworICAgICAgICAgICAgICAgICAgICdvYmplY3RzLiAgTm90ZSB0aGF0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIGluZGV4ZXMgKGlmIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ2NsYXNzIHdpc2hlc1xuJworICAgICAgICAgICAgICAgICAgICcgICB0byBlbXVsYXRlIGEgc2VxdWVuY2UgdHlwZSkgaXMgdXAgdG8gdGhlICcKKyAgICAgICAgICAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC4gSWZcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKmtleSogaXMgb2YgYW4gaW5hcHByb3ByaWF0ZSB0eXBlLCAiVHlwZUVycm9yIiBtYXkgYmUgJworICAgICAgICAgICAgICAgICAgICdyYWlzZWQ7IGlmIG9mXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mIGluZGV4ZXMgZm9yIHRoZSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAgICAgJyhhZnRlciBhbnlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSB2YWx1ZXMpLCAnCisgICAgICAgICAgICAgICAgICAgJyJJbmRleEVycm9yIiBzaG91bGQgYmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmFpc2VkLiBGb3IgbWFwcGluZyB0eXBlcywgaWYgKmtleSogaXMgbWlzc2luZyAobm90IGluICcKKyAgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvbnRhaW5lciksICJLZXlFcnJvciIgc2hvdWxkIGJlIHJhaXNlZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE5vdGU6ICJmb3IiIGxvb3BzIGV4cGVjdCB0aGF0IGFuICJJbmRleEVycm9yIiB3aWxsIGJlICcKKyAgICAgICAgICAgICAgICAgICAncmFpc2VkIGZvclxuJworICAgICAgICAgICAgICAgICAgICcgICAgIGlsbGVnYWwgaW5kZXhlcyB0byBhbGxvdyBwcm9wZXIgZGV0ZWN0aW9uIG9mIHRoZSBlbmQgJworICAgICAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICBzZXF1ZW5jZS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX21pc3NpbmdfXyhzZWxmLCBrZXkpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgImRpY3QiLiJfX2dldGl0ZW1fXygpIiB0byBpbXBsZW1lbnQgJworICAgICAgICAgICAgICAgICAgICcic2VsZltrZXldIiBmb3IgZGljdFxuJworICAgICAgICAgICAgICAgICAgICcgICBzdWJjbGFzc2VzIHdoZW4ga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCBhc3NpZ25tZW50IHRvICJzZWxmW2tleV0iLiAgU2FtZSAnCisgICAgICAgICAgICAgICAgICAgJ25vdGUgYXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yICcKKyAgICAgICAgICAgICAgICAgICAnbWFwcGluZ3MgaWZcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yICcKKyAgICAgICAgICAgICAgICAgICAnaWYgbmV3IGtleXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2FuIGJlIGFkZGVkLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzIGNhbiBiZSAnCisgICAgICAgICAgICAgICAgICAgJ3JlcGxhY2VkLiAgVGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmUgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiAnCisgICAgICAgICAgICAgICAgICAgJ3ZhbHVlcyBhcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19kZWxpdGVtX18oc2VsZiwga2V5KVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiAic2VsZltrZXldIi4gIFNhbWUgbm90ZSAnCisgICAgICAgICAgICAgICAgICAgJ2FzIGZvclxuJworICAgICAgICAgICAgICAgICAgICcgICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciAnCisgICAgICAgICAgICAgICAgICAgJ21hcHBpbmdzIGlmXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBvYmplY3RzIHN1cHBvcnQgcmVtb3ZhbCBvZiBrZXlzLCBvciBmb3Igc2VxdWVuY2VzICcKKyAgICAgICAgICAgICAgICAgICAnaWYgZWxlbWVudHNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zICcKKyAgICAgICAgICAgICAgICAgICAnc2hvdWxkIGJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgJworICAgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXRlcl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBpdGVyYXRvciBpcyByZXF1aXJlZCBmb3IgJworICAgICAgICAgICAgICAgICAgICdhIGNvbnRhaW5lci5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgJ2NhbiBpdGVyYXRlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsICcKKyAgICAgICAgICAgICAgICAgICAnaXQgc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGl0ZXJhdGUgb3ZlciB0aGUga2V5cyBvZiB0aGUgY29udGFpbmVyLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgSXRlcmF0b3Igb2JqZWN0cyBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kOyAnCisgICAgICAgICAgICAgICAgICAgJ3RoZXkgYXJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gJworICAgICAgICAgICAgICAgICAgICdpdGVyYXRvclxuJworICAgICAgICAgICAgICAgICAgICcgICBvYmplY3RzLCBzZWUgSXRlcmF0b3IgVHlwZXMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgKGlmIHByZXNlbnQpIGJ5IHRoZSAicmV2ZXJzZWQoKSIgYnVpbHQtaW4gdG8gJworICAgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yICcKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0IHRoYXRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lciBpbiAnCisgICAgICAgICAgICAgICAgICAgJ3JldmVyc2Ugb3JkZXIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBJZiB0aGUgIl9fcmV2ZXJzZWRfXygpIiBtZXRob2QgaXMgbm90IHByb3ZpZGVkLCB0aGUgJworICAgICAgICAgICAgICAgICAgICcicmV2ZXJzZWQoKSJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYnVpbHQtaW4gd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIHNlcXVlbmNlIHByb3RvY29sICcKKyAgICAgICAgICAgICAgICAgICAnKCJfX2xlbl9fKCkiXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFuZCAiX19nZXRpdGVtX18oKSIpLiAgT2JqZWN0cyB0aGF0IHN1cHBvcnQgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnc2VxdWVuY2UgcHJvdG9jb2xcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIG9ubHkgcHJvdmlkZSAiX19yZXZlcnNlZF9fKCkiIGlmIHRoZXkgY2FuICcKKyAgICAgICAgICAgICAgICAgICAncHJvdmlkZSBhblxuJworICAgICAgICAgICAgICAgICAgICcgICBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIG9uZSAnCisgICAgICAgICAgICAgICAgICAgJ3Byb3ZpZGVkIGJ5XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJyZXZlcnNlZCgpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1RoZSBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzICgiaW4iIGFuZCAibm90IGluIikgYXJlICcKKyAgICAgICAgICAgICAgICAgICAnbm9ybWFsbHlcbicKKyAgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50ZWQgYXMgYW4gaXRlcmF0aW9uIHRocm91Z2ggYSBzZXF1ZW5jZS4gIEhvd2V2ZXIsICcKKyAgICAgICAgICAgICAgICAgICAnY29udGFpbmVyXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdHMgY2FuIHN1cHBseSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgbWV0aG9kIHdpdGggYSAnCisgICAgICAgICAgICAgICAgICAgJ21vcmUgZWZmaWNpZW50XG4nCisgICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGF0aW9uLCB3aGljaCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhlIG9iamVjdCBiZSAnCisgICAgICAgICAgICAgICAgICAgJ2Egc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgJworICAgICAgICAgICAgICAgICAgICdyZXR1cm4gdHJ1ZVxuJworICAgICAgICAgICAgICAgICAgICcgICBpZiAqaXRlbSogaXMgaW4gKnNlbGYqLCBmYWxzZSBvdGhlcndpc2UuICBGb3IgbWFwcGluZyAnCisgICAgICAgICAgICAgICAgICAgJ29iamVjdHMsIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIGNvbnNpZGVyIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nIHJhdGhlciB0aGFuIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3ZhbHVlcyBvclxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUga2V5LWl0ZW0gcGFpcnMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBGb3Igb2JqZWN0cyB0aGF0IGRvblwndCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiwgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnbWVtYmVyc2hpcCB0ZXN0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZpcnN0IHRyaWVzIGl0ZXJhdGlvbiB2aWEgIl9faXRlcl9fKCkiLCB0aGVuIHRoZSBvbGQgJworICAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZVxuJworICAgICAgICAgICAgICAgICAgICcgICBpdGVyYXRpb24gcHJvdG9jb2wgdmlhICJfX2dldGl0ZW1fXygpIiwgc2VlIHRoaXMgJworICAgICAgICAgICAgICAgICAgICdzZWN0aW9uIGluIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBsYW5ndWFnZSByZWZlcmVuY2UuXG4nLAorICdzaGlmdGluZyc6ICdcbicKKyAgICAgICAgICAgICAnU2hpZnRpbmcgb3BlcmF0aW9uc1xuJworICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgc2hpZnRpbmcgb3BlcmF0aW9ucyBoYXZlIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGFyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAnb3BlcmF0aW9uczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHNoaWZ0X2V4cHIgOjo9IGFfZXhwciB8IHNoaWZ0X2V4cHIgKCAiPDwiIHwgIj4+IiApIGFfZXhwclxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlc2Ugb3BlcmF0b3JzIGFjY2VwdCBpbnRlZ2VycyBhcyBhcmd1bWVudHMuICBUaGV5IHNoaWZ0IHRoZSAnCisgICAgICAgICAgICAgJ2ZpcnN0XG4nCisgICAgICAgICAgICAgJ2FyZ3VtZW50IHRvIHRoZSBsZWZ0IG9yIHJpZ2h0IGJ5IHRoZSBudW1iZXIgb2YgYml0cyBnaXZlbiBieSAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdzZWNvbmQgYXJndW1lbnQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIHJpZ2h0IHNoaWZ0IGJ5ICpuKiBiaXRzIGlzIGRlZmluZWQgYXMgZmxvb3IgZGl2aXNpb24gYnkgJworICAgICAgICAgICAgICcicG93KDIsbikiLlxuJworICAgICAgICAgICAgICdBIGxlZnQgc2hpZnQgYnkgKm4qIGJpdHMgaXMgZGVmaW5lZCBhcyBtdWx0aXBsaWNhdGlvbiB3aXRoICcKKyAgICAgICAgICAgICAnInBvdygyLG4pIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05vdGU6IEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIGlzXG4nCisgICAgICAgICAgICAgJyAgcmVxdWlyZWQgdG8gYmUgYXQgbW9zdCAic3lzLm1heHNpemUiLiAgSWYgdGhlIHJpZ2h0LWhhbmQgJworICAgICAgICAgICAgICdvcGVyYW5kIGlzXG4nCisgICAgICAgICAgICAgJyAgbGFyZ2VyIHRoYW4gInN5cy5tYXhzaXplIiBhbiAiT3ZlcmZsb3dFcnJvciIgZXhjZXB0aW9uIGlzICcKKyAgICAgICAgICAgICAncmFpc2VkLlxuJywKKyAnc2xpY2luZ3MnOiAnXG4nCisgICAgICAgICAgICAgJ1NsaWNpbmdzXG4nCisgICAgICAgICAgICAgJyoqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIHNsaWNpbmcgc2VsZWN0cyBhIHJhbmdlIG9mIGl0ZW1zIGluIGEgc2VxdWVuY2Ugb2JqZWN0IChlLmcuLCAnCisgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAnc3RyaW5nLCB0dXBsZSBvciBsaXN0KS4gIFNsaWNpbmdzIG1heSBiZSB1c2VkIGFzIGV4cHJlc3Npb25zIG9yICcKKyAgICAgICAgICAgICAnYXNcbicKKyAgICAgICAgICAgICAndGFyZ2V0cyBpbiBhc3NpZ25tZW50IG9yICJkZWwiIHN0YXRlbWVudHMuICBUaGUgc3ludGF4IGZvciBhICcKKyAgICAgICAgICAgICAnc2xpY2luZzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHNsaWNpbmcgICAgICA6Oj0gcHJpbWFyeSAiWyIgc2xpY2VfbGlzdCAiXSJcbicKKyAgICAgICAgICAgICAnICAgc2xpY2VfbGlzdCAgIDo6PSBzbGljZV9pdGVtICgiLCIgc2xpY2VfaXRlbSkqIFsiLCJdXG4nCisgICAgICAgICAgICAgJyAgIHNsaWNlX2l0ZW0gICA6Oj0gZXhwcmVzc2lvbiB8IHByb3Blcl9zbGljZVxuJworICAgICAgICAgICAgICcgICBwcm9wZXJfc2xpY2UgOjo9IFtsb3dlcl9ib3VuZF0gIjoiIFt1cHBlcl9ib3VuZF0gWyAiOiIgJworICAgICAgICAgICAgICdbc3RyaWRlXSBdXG4nCisgICAgICAgICAgICAgJyAgIGxvd2VyX2JvdW5kICA6Oj0gZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICcgICB1cHBlcl9ib3VuZCAgOjo9IGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnICAgc3RyaWRlICAgICAgIDo6PSBleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGVyZSBpcyBhbWJpZ3VpdHkgaW4gdGhlIGZvcm1hbCBzeW50YXggaGVyZTogYW55dGhpbmcgdGhhdCAnCisgICAgICAgICAgICAgJ2xvb2tzIGxpa2VcbicKKyAgICAgICAgICAgICAnYW4gZXhwcmVzc2lvbiBsaXN0IGFsc28gbG9va3MgbGlrZSBhIHNsaWNlIGxpc3QsIHNvIGFueSAnCisgICAgICAgICAgICAgJ3N1YnNjcmlwdGlvblxuJworICAgICAgICAgICAgICdjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBzbGljaW5nLiAgUmF0aGVyIHRoYW4gZnVydGhlciAnCisgICAgICAgICAgICAgJ2NvbXBsaWNhdGluZyB0aGVcbicKKyAgICAgICAgICAgICAnc3ludGF4LCB0aGlzIGlzIGRpc2FtYmlndWF0ZWQgYnkgZGVmaW5pbmcgdGhhdCBpbiB0aGlzIGNhc2UgdGhlXG4nCisgICAgICAgICAgICAgJ2ludGVycHJldGF0aW9uIGFzIGEgc3Vic2NyaXB0aW9uIHRha2VzIHByaW9yaXR5IG92ZXIgdGhlXG4nCisgICAgICAgICAgICAgJ2ludGVycHJldGF0aW9uIGFzIGEgc2xpY2luZyAodGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgc2xpY2UgbGlzdFxuJworICAgICAgICAgICAgICdjb250YWlucyBubyBwcm9wZXIgc2xpY2UpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIHNlbWFudGljcyBmb3IgYSBzbGljaW5nIGFyZSBhcyBmb2xsb3dzLiAgVGhlIHByaW1hcnkgaXMgJworICAgICAgICAgICAgICdpbmRleGVkXG4nCisgICAgICAgICAgICAgJyh1c2luZyB0aGUgc2FtZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kIGFzIG5vcm1hbCBzdWJzY3JpcHRpb24pICcKKyAgICAgICAgICAgICAnd2l0aCBhXG4nCisgICAgICAgICAgICAgJ2tleSB0aGF0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNsaWNlIGxpc3QsIGFzIGZvbGxvd3MuICBJZiB0aGUgJworICAgICAgICAgICAgICdzbGljZVxuJworICAgICAgICAgICAgICdsaXN0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBjb21tYSwgdGhlIGtleSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnY29udmVyc2lvbiBvZiB0aGUgc2xpY2UgaXRlbXM7IG90aGVyd2lzZSwgdGhlIGNvbnZlcnNpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAnbG9uZVxuJworICAgICAgICAgICAgICdzbGljZSBpdGVtIGlzIHRoZSBrZXkuICBUaGUgY29udmVyc2lvbiBvZiBhIHNsaWNlIGl0ZW0gdGhhdCBpcyAnCisgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24gaXMgdGhhdCBleHByZXNzaW9uLiAgVGhlIGNvbnZlcnNpb24gb2YgYSBwcm9wZXIgc2xpY2UgJworICAgICAgICAgICAgICdpcyBhXG4nCisgICAgICAgICAgICAgJ3NsaWNlIG9iamVjdCAoc2VlIHNlY3Rpb24gVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KSB3aG9zZSAnCisgICAgICAgICAgICAgJyJzdGFydCIsXG4nCisgICAgICAgICAgICAgJyJzdG9wIiBhbmQgInN0ZXAiIGF0dHJpYnV0ZXMgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlIGV4cHJlc3Npb25zICcKKyAgICAgICAgICAgICAnZ2l2ZW5cbicKKyAgICAgICAgICAgICAnYXMgbG93ZXIgYm91bmQsIHVwcGVyIGJvdW5kIGFuZCBzdHJpZGUsIHJlc3BlY3RpdmVseSwgJworICAgICAgICAgICAgICdzdWJzdGl0dXRpbmdcbicKKyAgICAgICAgICAgICAnIk5vbmUiIGZvciBtaXNzaW5nIGV4cHJlc3Npb25zLlxuJywKKyAnc3BlY2lhbGF0dHJzJzogJ1xuJworICAgICAgICAgICAgICAgICAnU3BlY2lhbCBBdHRyaWJ1dGVzXG4nCisgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGltcGxlbWVudGF0aW9uIGFkZHMgYSBmZXcgc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcyAnCisgICAgICAgICAgICAgICAgICd0byBzZXZlcmFsXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QgdHlwZXMsIHdoZXJlIHRoZXkgYXJlIHJlbGV2YW50LiAgU29tZSBvZiB0aGVzZSBhcmUgJworICAgICAgICAgICAgICAgICAnbm90IHJlcG9ydGVkXG4nCisgICAgICAgICAgICAgICAgICdieSB0aGUgImRpcigpIiBidWlsdC1pbiBmdW5jdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGljdF9fXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEEgZGljdGlvbmFyeSBvciBvdGhlciBtYXBwaW5nIG9iamVjdCB1c2VkIHRvIHN0b3JlIGFuICcKKyAgICAgICAgICAgICAgICAgIm9iamVjdCdzXG4iCisgICAgICAgICAgICAgICAgICcgICAod3JpdGFibGUpIGF0dHJpYnV0ZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlLl9fY2xhc3NfX1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGUgY2xhc3MgdG8gd2hpY2ggYSBjbGFzcyBpbnN0YW5jZSBiZWxvbmdzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcy5fX2Jhc2VzX19cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyBvZiBhIGNsYXNzIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbi5fX25hbWVfX1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGUgbmFtZSBvZiB0aGUgY2xhc3MsIGZ1bmN0aW9uLCBtZXRob2QsIGRlc2NyaXB0b3IsIG9yICcKKyAgICAgICAgICAgICAgICAgJ2dlbmVyYXRvclxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2UuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2RlZmluaXRpb24uX19xdWFsbmFtZV9fXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSAqcXVhbGlmaWVkIG5hbWUqIG9mIHRoZSBjbGFzcywgZnVuY3Rpb24sIG1ldGhvZCwgJworICAgICAgICAgICAgICAgICAnZGVzY3JpcHRvciwgb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIGdlbmVyYXRvciBpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4zLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcy5fX21yb19fXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoaXMgYXR0cmlidXRlIGlzIGEgdHVwbGUgb2YgY2xhc3NlcyB0aGF0IGFyZSBjb25zaWRlcmVkICcKKyAgICAgICAgICAgICAgICAgJ3doZW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIGxvb2tpbmcgZm9yIGJhc2UgY2xhc3NlcyBkdXJpbmcgbWV0aG9kIHJlc29sdXRpb24uXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLm1ybygpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgbWV0YWNsYXNzIHRvIGN1c3RvbWl6ZSAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyIGZvciBpdHMgaW5zdGFuY2VzLiAgSXQgaXMgY2FsbGVkICcKKyAgICAgICAgICAgICAgICAgJ2F0IGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0YW50aWF0aW9uLCBhbmQgaXRzIHJlc3VsdCBpcyBzdG9yZWQgaW4gIl9fbXJvX18iLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcy5fX3N1YmNsYXNzZXNfXygpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEVhY2ggY2xhc3Mga2VlcHMgYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byBpdHMgJworICAgICAgICAgICAgICAgICAnaW1tZWRpYXRlXG4nCisgICAgICAgICAgICAgICAgICcgICBzdWJjbGFzc2VzLiAgVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRob3NlICcKKyAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN0aWxsIGFsaXZlLiBFeGFtcGxlOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICA+Pj4gaW50Ll9fc3ViY2xhc3Nlc19fKClcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgIFs8Y2xhc3MgJ2Jvb2wnPl1cbiIKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnLVsgRm9vdG5vdGVzIF0tXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1sxXSBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZXNlIHNwZWNpYWwgbWV0aG9kcyBtYXkgYmUgJworICAgICAgICAgICAgICAgICAnZm91bmRcbicKKyAgICAgICAgICAgICAgICAgJyAgICBpbiB0aGUgUHl0aG9uIFJlZmVyZW5jZSBNYW51YWwgKEJhc2ljIGN1c3RvbWl6YXRpb24pLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdbMl0gQXMgYSBjb25zZXF1ZW5jZSwgdGhlIGxpc3QgIlsxLCAyXSIgaXMgY29uc2lkZXJlZCBlcXVhbCAnCisgICAgICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICAgICAnICAgICJbMS4wLCAyLjBdIiwgYW5kIHNpbWlsYXJseSBmb3IgdHVwbGVzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICJbM10gVGhleSBtdXN0IGhhdmUgc2luY2UgdGhlIHBhcnNlciBjYW4ndCB0ZWxsIHRoZSB0eXBlIG9mICIKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgIG9wZXJhbmRzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdbNF0gQ2FzZWQgY2hhcmFjdGVycyBhcmUgdGhvc2Ugd2l0aCBnZW5lcmFsIGNhdGVnb3J5ICcKKyAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5XG4nCisgICAgICAgICAgICAgICAgICcgICAgYmVpbmcgb25lIG9mICJMdSIgKExldHRlciwgdXBwZXJjYXNlKSwgIkxsIiAoTGV0dGVyLCAnCisgICAgICAgICAgICAgICAgICdsb3dlcmNhc2UpLFxuJworICAgICAgICAgICAgICAgICAnICAgIG9yICJMdCIgKExldHRlciwgdGl0bGVjYXNlKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnWzVdIFRvIGZvcm1hdCBvbmx5IGEgdHVwbGUgeW91IHNob3VsZCB0aGVyZWZvcmUgcHJvdmlkZSBhXG4nCisgICAgICAgICAgICAgICAgICcgICAgc2luZ2xldG9uIHR1cGxlIHdob3NlIG9ubHkgZWxlbWVudCBpcyB0aGUgdHVwbGUgdG8gYmUgJworICAgICAgICAgICAgICAgICAnZm9ybWF0dGVkLlxuJywKKyAnc3BlY2lhbG5hbWVzJzogJ1xuJworICAgICAgICAgICAgICAgICAnU3BlY2lhbCBtZXRob2QgbmFtZXNcbicKKyAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0EgY2xhc3MgY2FuIGltcGxlbWVudCBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgaW52b2tlZCBieSAnCisgICAgICAgICAgICAgICAgICdzcGVjaWFsXG4nCisgICAgICAgICAgICAgICAgICdzeW50YXggKHN1Y2ggYXMgYXJpdGhtZXRpYyBvcGVyYXRpb25zIG9yIHN1YnNjcmlwdGluZyBhbmQgJworICAgICAgICAgICAgICAgICAnc2xpY2luZykgYnlcbicKKyAgICAgICAgICAgICAgICAgImRlZmluaW5nIG1ldGhvZHMgd2l0aCBzcGVjaWFsIG5hbWVzLiBUaGlzIGlzIFB5dGhvbidzICIKKyAgICAgICAgICAgICAgICAgJ2FwcHJvYWNoIHRvXG4nCisgICAgICAgICAgICAgICAgICcqb3BlcmF0b3Igb3ZlcmxvYWRpbmcqLCBhbGxvd2luZyBjbGFzc2VzIHRvIGRlZmluZSB0aGVpciBvd24gJworICAgICAgICAgICAgICAgICAnYmVoYXZpb3JcbicKKyAgICAgICAgICAgICAgICAgJ3dpdGggcmVzcGVjdCB0byBsYW5ndWFnZSBvcGVyYXRvcnMuICBGb3IgaW5zdGFuY2UsIGlmIGEgJworICAgICAgICAgICAgICAgICAnY2xhc3MgZGVmaW5lc1xuJworICAgICAgICAgICAgICAgICAnYSBtZXRob2QgbmFtZWQgIl9fZ2V0aXRlbV9fKCkiLCBhbmQgIngiIGlzIGFuIGluc3RhbmNlIG9mICcKKyAgICAgICAgICAgICAgICAgJ3RoaXMgY2xhc3MsXG4nCisgICAgICAgICAgICAgICAgICd0aGVuICJ4W2ldIiBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gInR5cGUoeCkuX19nZXRpdGVtX18oeCwgJworICAgICAgICAgICAgICAgICAnaSkiLlxuJworICAgICAgICAgICAgICAgICAnRXhjZXB0IHdoZXJlIG1lbnRpb25lZCwgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBhbiBvcGVyYXRpb24gJworICAgICAgICAgICAgICAgICAncmFpc2UgYW5cbicKKyAgICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbiB3aGVuIG5vIGFwcHJvcHJpYXRlIG1ldGhvZCBpcyBkZWZpbmVkICh0eXBpY2FsbHlcbicKKyAgICAgICAgICAgICAgICAgJyJBdHRyaWJ1dGVFcnJvciIgb3IgIlR5cGVFcnJvciIpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdXaGVuIGltcGxlbWVudGluZyBhIGNsYXNzIHRoYXQgZW11bGF0ZXMgYW55IGJ1aWx0LWluIHR5cGUsICcKKyAgICAgICAgICAgICAgICAgJ2l0IGlzXG4nCisgICAgICAgICAgICAgICAgICdpbXBvcnRhbnQgdGhhdCB0aGUgZW11bGF0aW9uIG9ubHkgYmUgaW1wbGVtZW50ZWQgdG8gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2RlZ3JlZSB0aGF0IGl0XG4nCisgICAgICAgICAgICAgICAgICdtYWtlcyBzZW5zZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtb2RlbGxlZC4gIEZvciBleGFtcGxlLCAnCisgICAgICAgICAgICAgICAgICdzb21lXG4nCisgICAgICAgICAgICAgICAgICdzZXF1ZW5jZXMgbWF5IHdvcmsgd2VsbCB3aXRoIHJldHJpZXZhbCBvZiBpbmRpdmlkdWFsICcKKyAgICAgICAgICAgICAgICAgJ2VsZW1lbnRzLCBidXRcbicKKyAgICAgICAgICAgICAgICAgJ2V4dHJhY3RpbmcgYSBzbGljZSBtYXkgbm90IG1ha2Ugc2Vuc2UuICAoT25lIGV4YW1wbGUgb2YgdGhpcyAnCisgICAgICAgICAgICAgICAgICdpcyB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyJOb2RlTGlzdCIgaW50ZXJmYWNlIGluIHRoZSBXM0NcJ3MgRG9jdW1lbnQgT2JqZWN0IE1vZGVsLilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdCYXNpYyBjdXN0b21pemF0aW9uXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICAnCisgICAgICAgICAgICAgICAgICciX19uZXdfXygpIiBpcyBhXG4nCisgICAgICAgICAgICAgICAgICcgICBzdGF0aWMgbWV0aG9kIChzcGVjaWFsLWNhc2VkIHNvIHlvdSBuZWVkIG5vdCBkZWNsYXJlIGl0ICcKKyAgICAgICAgICAgICAgICAgJ2FzIHN1Y2gpXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGF0IHRha2VzIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSB3YXMgcmVxdWVzdGVkICcKKyAgICAgICAgICAgICAgICAgJ2FzIGl0c1xuJworICAgICAgICAgICAgICAgICAnICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgcGFzc2VkICcKKyAgICAgICAgICAgICAgICAgJ3RvIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIHRoZSBjbGFzcykuICAnCisgICAgICAgICAgICAgICAgICdUaGUgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZSBvZiAiX19uZXdfXygpIiBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAnKHVzdWFsbHkgYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlIG9mICpjbHMqKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzcyBieVxuJworICAgICAgICAgICAgICAgICAnICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kIHVzaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICAic3VwZXIoY3VycmVudGNsYXNzLCBjbHMpLl9fbmV3X18oY2xzWywgLi4uXSkiIHdpdGggJworICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50cyBhbmQgdGhlbiBtb2RpZnlpbmcgdGhlIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAnYXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiAiX19uZXdfXygpIiByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSAnCisgICAgICAgICAgICAgICAgICduZXdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2luaXRfXyhzZWxmWywgLi4uXSkiLCB3aGVyZSAqc2VsZiogaXMgdGhlIG5ldyBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdhbmQgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3ZXJlIHBhc3NlZCB0byAnCisgICAgICAgICAgICAgICAgICciX19uZXdfXygpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgIl9fbmV3X18oKSIgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBuZXdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgIl9fbmV3X18oKSIgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgJworICAgICAgICAgICAgICAgICAnaW1tdXRhYmxlXG4nCisgICAgICAgICAgICAgICAgICcgICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdjcmVhdGlvbi4gIEl0XG4nCisgICAgICAgICAgICAgICAgICcgICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluICcKKyAgICAgICAgICAgICAgICAgJ29yZGVyIHRvXG4nCisgICAgICAgICAgICAgICAgICcgICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIChieSAnCisgICAgICAgICAgICAgICAgICciX19uZXdfXygpIiksIGJ1dFxuJworICAgICAgICAgICAgICAgICAnICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBUaGUgYXJndW1lbnRzIGFyZSAnCisgICAgICAgICAgICAgICAgICd0aG9zZVxuJworICAgICAgICAgICAgICAgICAnICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGhhcyBhblxuJworICAgICAgICAgICAgICAgICAnICAgIl9faW5pdF9fKCkiIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgIl9faW5pdF9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZCwgaWZcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciAnCisgICAgICAgICAgICAgICAgICdpbml0aWFsaXphdGlvbiBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOlxuJworICAgICAgICAgICAgICAgICAnICAgIkJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQmVjYXVzZSAiX19uZXdfXygpIiBhbmQgIl9faW5pdF9fKCkiIHdvcmsgdG9nZXRoZXIgaW4gJworICAgICAgICAgICAgICAgICAnY29uc3RydWN0aW5nXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3RzICgiX19uZXdfXygpIiB0byBjcmVhdGUgaXQsIGFuZCAiX19pbml0X18oKSIgdG8gJworICAgICAgICAgICAgICAgICAnY3VzdG9taXNlXG4nCisgICAgICAgICAgICAgICAgICcgICBpdCksIG5vIG5vbi0iTm9uZSIgdmFsdWUgbWF5IGJlIHJldHVybmVkIGJ5ICJfX2luaXRfXygpIjsgJworICAgICAgICAgICAgICAgICAnZG9pbmcgc29cbicKKyAgICAgICAgICAgICAgICAgJyAgIHdpbGwgY2F1c2UgYSAiVHlwZUVycm9yIiB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGVsX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgJworICAgICAgICAgICAgICAgICAnaXMgYWxzb1xuJworICAgICAgICAgICAgICAgICAnICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSAiX19kZWxfXygpIiAnCisgICAgICAgICAgICAgICAgICdtZXRob2QsIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgZGVyaXZlZCBjbGFzc1wncyAiX19kZWxfXygpIiBtZXRob2QsIGlmIGFueSwgbXVzdCAnCisgICAgICAgICAgICAgICAgICdleHBsaWNpdGx5IGNhbGwgaXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2UuXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKSBmb3IgJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19kZWxfXygpIiBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlIGJ5XG4nCisgICAgICAgICAgICAgICAgICcgICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgYXQgJworICAgICAgICAgICAgICAgICAnYSBsYXRlclxuJworICAgICAgICAgICAgICAgICAnICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90ICcKKyAgICAgICAgICAgICAgICAgJ2d1YXJhbnRlZWQgdGhhdFxuJworICAgICAgICAgICAgICAgICAnICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgJworICAgICAgICAgICAgICAgICAnZXhpc3Qgd2hlblxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlOiAiZGVsIHgiIGRvZXNuXCd0IGRpcmVjdGx5IGNhbGwgInguX19kZWxfXygpIiAtLS0gJworICAgICAgICAgICAgICAgICAndGhlIGZvcm1lclxuJworICAgICAgICAgICAgICAgICAnICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yICJ4IiBieSBvbmUsIGFuZCB0aGUgJworICAgICAgICAgICAgICAgICAnbGF0dGVyIGlzXG4nCisgICAgICAgICAgICAgICAgICcgICAgIG9ubHkgY2FsbGVkIHdoZW4gIngiXCdzIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uICAnCisgICAgICAgICAgICAgICAgICdTb21lIGNvbW1vblxuJworICAgICAgICAgICAgICAgICAnICAgICBzaXR1YXRpb25zIHRoYXQgbWF5IHByZXZlbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiAnCisgICAgICAgICAgICAgICAgICdvYmplY3QgZnJvbVxuJworICAgICAgICAgICAgICAgICAnICAgICBnb2luZyB0byB6ZXJvIGluY2x1ZGU6IGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiAnCisgICAgICAgICAgICAgICAgICdvYmplY3RzIChlLmcuLFxuJworICAgICAgICAgICAgICAgICAnICAgICBhIGRvdWJseS1saW5rZWQgbGlzdCBvciBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUgd2l0aCAnCisgICAgICAgICAgICAgICAgICdwYXJlbnQgYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGNoaWxkIHBvaW50ZXJzKTsgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgJworICAgICAgICAgICAgICAgICAnZnJhbWUgb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgYSBmdW5jdGlvbiB0aGF0IGNhdWdodCBhbiBleGNlcHRpb24gKHRoZSB0cmFjZWJhY2sgJworICAgICAgICAgICAgICAgICAnc3RvcmVkIGluXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJzeXMuZXhjX2luZm8oKVsyXSIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3IgYSAnCisgICAgICAgICAgICAgICAgICdyZWZlcmVuY2VcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW4gJworICAgICAgICAgICAgICAgICAndW5oYW5kbGVkXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuJworICAgICAgICAgICAgICAgICAnICAgICAic3lzLmxhc3RfdHJhY2ViYWNrIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlICcKKyAgICAgICAgICAgICAgICAgJ2ZpcnN0XG4nCisgICAgICAgICAgICAgICAgICcgICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBjeWNsZXM7XG4nCisgICAgICAgICAgICAgICAgICcgICAgIHRoZSBzZWNvbmQgY2FuIGJlIHJlc29sdmVkIGJ5IGZyZWVpbmcgdGhlIHJlZmVyZW5jZSB0byAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdHJhY2ViYWNrIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VmdWwsIGFuZCB0aGUgJworICAgICAgICAgICAgICAgICAndGhpcmQgY2FuXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgIk5vbmUiIGluICJzeXMubGFzdF90cmFjZWJhY2siLiAnCisgICAgICAgICAgICAgICAgICdDaXJjdWxhclxuJworICAgICAgICAgICAgICAgICAnICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCBhbmQgY2xlYW5lZCAnCisgICAgICAgICAgICAgICAgICd1cCB3aGVuIHRoZVxuJworICAgICAgICAgICAgICAgICAiICAgICBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0b3IgaXMgZW5hYmxlZCAoaXQncyBvbiBieSAiCisgICAgICAgICAgICAgICAgICdkZWZhdWx0KS4gUmVmZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSAiZ2MiIG1vZHVsZSBmb3IgbW9yZSAnCisgICAgICAgICAgICAgICAgICdpbmZvcm1hdGlvblxuJworICAgICAgICAgICAgICAgICAnICAgICBhYm91dCB0aGlzIHRvcGljLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBXYXJuaW5nOiBEdWUgdG8gdGhlIHByZWNhcmlvdXMgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaFxuJworICAgICAgICAgICAgICAgICAnICAgICAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBpbnZva2VkLCBleGNlcHRpb25zIHRoYXQgb2NjdXIgJworICAgICAgICAgICAgICAgICAnZHVyaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHRoZWlyIGV4ZWN1dGlvbiBhcmUgaWdub3JlZCwgYW5kIGEgd2FybmluZyBpcyBwcmludGVkICcKKyAgICAgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJzeXMuc3RkZXJyIiBpbnN0ZWFkLiBBbHNvLCB3aGVuICJfX2RlbF9fKCkiIGlzIGludm9rZWQgJworICAgICAgICAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgcmVzcG9uc2UgdG8gYSBtb2R1bGUgYmVpbmcgZGVsZXRlZCAoZS5nLiwgd2hlbiAnCisgICAgICAgICAgICAgICAgICdleGVjdXRpb24gb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHByb2dyYW0gaXMgZG9uZSksIG90aGVyIGdsb2JhbHMgcmVmZXJlbmNlZCBieSB0aGUgJworICAgICAgICAgICAgICAgICAnIl9fZGVsX18oKSJcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgbWV0aG9kIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBkZWxldGVkIG9yIGluIHRoZSBwcm9jZXNzICcKKyAgICAgICAgICAgICAgICAgJ29mIGJlaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHRvcm4gZG93biAoZS5nLiB0aGUgaW1wb3J0IG1hY2hpbmVyeSBzaHV0dGluZyBkb3duKS4gICcKKyAgICAgICAgICAgICAgICAgJ0ZvciB0aGlzXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHJlYXNvbiwgIl9fZGVsX18oKSIgbWV0aG9kcyBzaG91bGQgZG8gdGhlIGFic29sdXRlICcKKyAgICAgICAgICAgICAgICAgJ21pbmltdW0gbmVlZGVkXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHRvIG1haW50YWluIGV4dGVybmFsIGludmFyaWFudHMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gJworICAgICAgICAgICAgICAgICAnMS41LFxuJworICAgICAgICAgICAgICAgICAnICAgICBQeXRob24gZ3VhcmFudGVlcyB0aGF0IGdsb2JhbHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBhICcKKyAgICAgICAgICAgICAgICAgJ3NpbmdsZVxuJworICAgICAgICAgICAgICAgICAnICAgICB1bmRlcnNjb3JlIGFyZSBkZWxldGVkIGZyb20gdGhlaXIgbW9kdWxlIGJlZm9yZSBvdGhlciAnCisgICAgICAgICAgICAgICAgICdnbG9iYWxzIGFyZVxuJworICAgICAgICAgICAgICAgICAnICAgICBkZWxldGVkOyBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIHN1Y2ggZ2xvYmFscyBleGlzdCwgJworICAgICAgICAgICAgICAgICAndGhpcyBtYXlcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgaGVscCBpbiBhc3N1cmluZyB0aGF0IGltcG9ydGVkIG1vZHVsZXMgYXJlIHN0aWxsICcKKyAgICAgICAgICAgICAgICAgJ2F2YWlsYWJsZSBhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdGltZSB3aGVuIHRoZSAiX19kZWxfXygpIiBtZXRob2QgaXMgY2FsbGVkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZXByX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5IHRoZSAicmVwcigpIiBidWlsdC1pbiBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSAnCisgICAgICAgICAgICAgICAgICcib2ZmaWNpYWwiXG4nCisgICAgICAgICAgICAgICAgICcgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCAnCisgICAgICAgICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgICAgICAgICcgICBzaG91bGQgbG9vayBsaWtlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjb3VsZCBiZSAnCisgICAgICAgICAgICAgICAgICd1c2VkIHRvXG4nCisgICAgICAgICAgICAgICAgICcgICByZWNyZWF0ZSBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZ2l2ZW4gYW4gJworICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGVudmlyb25tZW50KS4gIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgJworICAgICAgICAgICAgICAgICAnZm9ybVxuJworICAgICAgICAgICAgICAgICAnICAgIjwuLi5zb21lIHVzZWZ1bCBkZXNjcmlwdGlvbi4uLj4iIHNob3VsZCBiZSByZXR1cm5lZC4gVGhlICcKKyAgICAgICAgICAgICAgICAgJ3JldHVyblxuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuIElmIGEgY2xhc3MgZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICciX19yZXByX18oKSIgYnV0XG4nCisgICAgICAgICAgICAgICAgICcgICBub3QgIl9fc3RyX18oKSIsIHRoZW4gIl9fcmVwcl9fKCkiIGlzIGFsc28gdXNlZCB3aGVuIGFuICcKKyAgICAgICAgICAgICAgICAgJyJpbmZvcm1hbCJcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyAnCisgICAgICAgICAgICAgICAgICdyZXF1aXJlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgZGVidWdnaW5nLCBzbyBpdCBpcyBpbXBvcnRhbnQgJworICAgICAgICAgICAgICAgICAndGhhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19zdHJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgInN0cihvYmplY3QpIiBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAnCisgICAgICAgICAgICAgICAgICciZm9ybWF0KCkiIGFuZFxuJworICAgICAgICAgICAgICAgICAnICAgInByaW50KCkiIHRvIGNvbXB1dGUgdGhlICJpbmZvcm1hbCIgb3IgbmljZWx5IHByaW50YWJsZSAnCisgICAgICAgICAgICAgICAgICdzdHJpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhICcKKyAgICAgICAgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICAgICAgICAnICAgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gIm9iamVjdC5fX3JlcHJfXygpIiBpbiB0aGF0ICcKKyAgICAgICAgICAgICAgICAgJ3RoZXJlIGlzIG5vXG4nCisgICAgICAgICAgICAgICAgICcgICBleHBlY3RhdGlvbiB0aGF0ICJfX3N0cl9fKCkiIHJldHVybiBhIHZhbGlkIFB5dGhvbiAnCisgICAgICAgICAgICAgICAgICdleHByZXNzaW9uOiBhXG4nCisgICAgICAgICAgICAgICAgICcgICBtb3JlIGNvbnZlbmllbnQgb3IgY29uY2lzZSByZXByZXNlbnRhdGlvbiBjYW4gYmUgdXNlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBieSB0aGUgYnVpbHQtaW4gdHlwZSAnCisgICAgICAgICAgICAgICAgICcib2JqZWN0IlxuJworICAgICAgICAgICAgICAgICAnICAgY2FsbHMgIm9iamVjdC5fX3JlcHJfXygpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYnl0ZXNfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgImJ5dGVzKCkiIHRvIGNvbXB1dGUgYSBieXRlLXN0cmluZyAnCisgICAgICAgICAgICAgICAgICdyZXByZXNlbnRhdGlvbiBvZiBhblxuJworICAgICAgICAgICAgICAgICAnICAgb2JqZWN0LiBUaGlzIHNob3VsZCByZXR1cm4gYSAiYnl0ZXMiIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSB0aGUgImZvcm1hdCgpIiBidWlsdC1pbiBmdW5jdGlvbiwgYW5kIGJ5ICcKKyAgICAgICAgICAgICAgICAgJ2V4dGVuc2lvbixcbicKKyAgICAgICAgICAgICAgICAgJyAgIGV2YWx1YXRpb24gb2YgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICAgJyJzdHIuZm9ybWF0KCkiXG4nCisgICAgICAgICAgICAgICAgICcgICBtZXRob2QsIHRvIHByb2R1Y2UgYSAiZm9ybWF0dGVkIiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgJworICAgICAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdC4gVGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgYSBzdHJpbmcgdGhhdCAnCisgICAgICAgICAgICAgICAgICdjb250YWlucyBhXG4nCisgICAgICAgICAgICAgICAgICcgICBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGRlc2lyZWQuIFRoZSAnCisgICAgICAgICAgICAgICAgICdpbnRlcnByZXRhdGlvblxuJworICAgICAgICAgICAgICAgICAnICAgb2YgdGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgdXAgdG8gdGhlIHR5cGUgJworICAgICAgICAgICAgICAgICAnaW1wbGVtZW50aW5nXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19mb3JtYXRfXygpIiwgaG93ZXZlciBtb3N0IGNsYXNzZXMgd2lsbCBlaXRoZXIgJworICAgICAgICAgICAgICAgICAnZGVsZWdhdGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGZvcm1hdHRpbmcgdG8gb25lIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3IgdXNlIGEgJworICAgICAgICAgICAgICAgICAnc2ltaWxhclxuJworICAgICAgICAgICAgICAgICAnICAgZm9ybWF0dGluZyBvcHRpb24gc3ludGF4LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBTZWUgRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSBmb3IgYSBkZXNjcmlwdGlvbiAnCisgICAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN0YW5kYXJkIGZvcm1hdHRpbmcgc3ludGF4LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDaGFuZ2VkIGluIHZlcnNpb24gMy40OiBUaGUgX19mb3JtYXRfXyBtZXRob2Qgb2YgIm9iamVjdCIgJworICAgICAgICAgICAgICAgICAnaXRzZWxmXG4nCisgICAgICAgICAgICAgICAgICcgICByYWlzZXMgYSAiVHlwZUVycm9yIiBpZiBwYXNzZWQgYW55IG5vbi1lbXB0eSBzdHJpbmcuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2x0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19sZV9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZXFfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX25lX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ndF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2VfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQgInJpY2ggY29tcGFyaXNvbiIgbWV0aG9kcy4gVGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIG9wZXJhdG9yIHN5bWJvbHMgYW5kIG1ldGhvZCBuYW1lcyAnCisgICAgICAgICAgICAgICAgICdpcyBhc1xuJworICAgICAgICAgICAgICAgICAnICAgZm9sbG93czogIng8eSIgY2FsbHMgInguX19sdF9fKHkpIiwgIng8PXkiIGNhbGxzICcKKyAgICAgICAgICAgICAgICAgJyJ4Ll9fbGVfXyh5KSIsXG4nCisgICAgICAgICAgICAgICAgICcgICAieD09eSIgY2FsbHMgInguX19lcV9fKHkpIiwgInghPXkiIGNhbGxzICJ4Ll9fbmVfXyh5KSIsICcKKyAgICAgICAgICAgICAgICAgJyJ4PnkiIGNhbGxzXG4nCisgICAgICAgICAgICAgICAgICcgICAieC5fX2d0X18oeSkiLCBhbmQgIng+PXkiIGNhbGxzICJ4Ll9fZ2VfXyh5KSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b24gJworICAgICAgICAgICAgICAgICAnIk5vdEltcGxlbWVudGVkIlxuJworICAgICAgICAgICAgICAgICAnICAgaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIGEgZ2l2ZW4gcGFpciAnCisgICAgICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnRzLiBCeSBjb252ZW50aW9uLCAiRmFsc2UiIGFuZCAiVHJ1ZSIgYXJlIHJldHVybmVkICcKKyAgICAgICAgICAgICAgICAgJ2ZvciBhXG4nCisgICAgICAgICAgICAgICAgICcgICBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuIHJldHVybiAnCisgICAgICAgICAgICAgICAgICdhbnkgdmFsdWUsXG4nCisgICAgICAgICAgICAgICAgICcgICBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGEgQm9vbGVhbiAnCisgICAgICAgICAgICAgICAgICdjb250ZXh0IChlLmcuLFxuJworICAgICAgICAgICAgICAgICAnICAgaW4gdGhlIGNvbmRpdGlvbiBvZiBhbiAiaWYiIHN0YXRlbWVudCksIFB5dGhvbiB3aWxsIGNhbGwgJworICAgICAgICAgICAgICAgICAnImJvb2woKSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdCBpcyB0cnVlIG9yICcKKyAgICAgICAgICAgICAgICAgJ2ZhbHNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBCeSBkZWZhdWx0LCAiX19uZV9fKCkiIGRlbGVnYXRlcyB0byAiX19lcV9fKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICdpbnZlcnRzIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgcmVzdWx0IHVubGVzcyBpdCBpcyAiTm90SW1wbGVtZW50ZWQiLiAgVGhlcmUgYXJlIG5vIG90aGVyICcKKyAgICAgICAgICAgICAgICAgJ2ltcGxpZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBmb3IgJworICAgICAgICAgICAgICAgICAnZXhhbXBsZSwgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICB0cnV0aCBvZiAiKHg8eSBvciB4PT15KSIgZG9lcyBub3QgaW1wbHkgIng8PXkiLiBUbyAnCisgICAgICAgICAgICAgICAgICdhdXRvbWF0aWNhbGx5XG4nCisgICAgICAgICAgICAgICAgICcgICBnZW5lcmF0ZSBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdCAnCisgICAgICAgICAgICAgICAgICdvcGVyYXRpb24sIHNlZVxuJworICAgICAgICAgICAgICAgICAnICAgImZ1bmN0b29scy50b3RhbF9vcmRlcmluZygpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgU2VlIHRoZSBwYXJhZ3JhcGggb24gIl9faGFzaF9fKCkiIGZvciBzb21lIGltcG9ydGFudCAnCisgICAgICAgICAgICAgICAgICdub3RlcyBvblxuJworICAgICAgICAgICAgICAgICAnICAgY3JlYXRpbmcgKmhhc2hhYmxlKiBvYmplY3RzIHdoaWNoIHN1cHBvcnQgY3VzdG9tICcKKyAgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb25cbicKKyAgICAgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGVyZSBhcmUgbm8gc3dhcHBlZC1hcmd1bWVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzICcKKyAgICAgICAgICAgICAgICAgJyh0byBiZSB1c2VkXG4nCisgICAgICAgICAgICAgICAgICcgICB3aGVuIHRoZSBsZWZ0IGFyZ3VtZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiBidXQgJworICAgICAgICAgICAgICAgICAndGhlIHJpZ2h0XG4nCisgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudCBkb2VzKTsgcmF0aGVyLCAiX19sdF9fKCkiIGFuZCAiX19ndF9fKCkiIGFyZSAnCisgICAgICAgICAgICAgICAgICJlYWNoIG90aGVyJ3NcbiIKKyAgICAgICAgICAgICAgICAgJyAgIHJlZmxlY3Rpb24sICJfX2xlX18oKSIgYW5kICJfX2dlX18oKSIgYXJlIGVhY2ggb3RoZXJcJ3MgJworICAgICAgICAgICAgICAgICAncmVmbGVjdGlvbixcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFuZCAiX19lcV9fKCkiIGFuZCAiX19uZV9fKCkiIGFyZSB0aGVpciBvd24gcmVmbGVjdGlvbi4gJworICAgICAgICAgICAgICAgICAnSWYgdGhlXG4nCisgICAgICAgICAgICAgICAgICIgICBvcGVyYW5kcyBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLCBhbmQgcmlnaHQgb3BlcmFuZCdzIHR5cGUgIgorICAgICAgICAgICAgICAgICAnaXMgYVxuJworICAgICAgICAgICAgICAgICAiICAgZGlyZWN0IG9yIGluZGlyZWN0IHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmQncyB0eXBlLCAiCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlZmxlY3RlZCBtZXRob2Qgb2YgdGhlIHJpZ2h0IG9wZXJhbmQgaGFzIHByaW9yaXR5LCAnCisgICAgICAgICAgICAgICAgICdvdGhlcndpc2UgdGhlXG4nCisgICAgICAgICAgICAgICAgICIgICBsZWZ0IG9wZXJhbmQncyBtZXRob2QgaGFzIHByaW9yaXR5LiAgVmlydHVhbCBzdWJjbGFzc2luZyAiCisgICAgICAgICAgICAgICAgICdpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2hhc2hfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gImhhc2goKSIgYW5kIGZvciBvcGVyYXRpb25zICcKKyAgICAgICAgICAgICAgICAgJ29uIG1lbWJlcnNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9mIGhhc2hlZCBjb2xsZWN0aW9ucyBpbmNsdWRpbmcgInNldCIsICJmcm96ZW5zZXQiLCBhbmQgJworICAgICAgICAgICAgICAgICAnImRpY3QiLlxuJworICAgICAgICAgICAgICAgICAnICAgIl9faGFzaF9fKCkiIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gIFRoZSBvbmx5IHJlcXVpcmVkICcKKyAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5XG4nCisgICAgICAgICAgICAgICAgICcgICBpcyB0aGF0IG9iamVjdHMgd2hpY2ggY29tcGFyZSBlcXVhbCBoYXZlIHRoZSBzYW1lIGhhc2ggJworICAgICAgICAgICAgICAgICAndmFsdWU7IGl0IGlzXG4nCisgICAgICAgICAgICAgICAgICcgICBhZHZpc2VkIHRvIHNvbWVob3cgbWl4IHRvZ2V0aGVyIChlLmcuIHVzaW5nIGV4Y2x1c2l2ZSBvcikgJworICAgICAgICAgICAgICAgICAndGhlIGhhc2hcbicKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlcyBmb3IgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0IGFsc28gcGxheSBhICcKKyAgICAgICAgICAgICAgICAgJ3BhcnQgaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvbXBhcmlzb24gb2Ygb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZTogImhhc2goKSIgdHJ1bmNhdGVzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGFuICcKKyAgICAgICAgICAgICAgICAgIm9iamVjdCdzXG4iCisgICAgICAgICAgICAgICAgICcgICAgIGN1c3RvbSAiX19oYXNoX18oKSIgbWV0aG9kIHRvIHRoZSBzaXplIG9mIGEgJworICAgICAgICAgICAgICAgICAnIlB5X3NzaXplX3QiLiAgVGhpc1xuJworICAgICAgICAgICAgICAgICAnICAgICBpcyB0eXBpY2FsbHkgOCBieXRlcyBvbiA2NC1iaXQgYnVpbGRzIGFuZCA0IGJ5dGVzIG9uICcKKyAgICAgICAgICAgICAgICAgJzMyLWJpdFxuJworICAgICAgICAgICAgICAgICAnICAgICBidWlsZHMuIElmIGFuIG9iamVjdFwncyAgICJfX2hhc2hfXygpIiBtdXN0ICcKKyAgICAgICAgICAgICAgICAgJ2ludGVyb3BlcmF0ZSBvbiBidWlsZHNcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgb2YgZGlmZmVyZW50IGJpdCBzaXplcywgYmUgc3VyZSB0byBjaGVjayB0aGUgd2lkdGggb24gJworICAgICAgICAgICAgICAgICAnYWxsXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHN1cHBvcnRlZCBidWlsZHMuICBBbiBlYXN5IHdheSB0byBkbyB0aGlzIGlzIHdpdGggJworICAgICAgICAgICAgICAgICAnInB5dGhvbiAtY1xuJworICAgICAgICAgICAgICAgICAnICAgICAiaW1wb3J0IHN5czsgcHJpbnQoc3lzLmhhc2hfaW5mby53aWR0aCkiIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgYSBjbGFzcyBkb2VzIG5vdCBkZWZpbmUgYW4gIl9fZXFfXygpIiBtZXRob2QgaXQgc2hvdWxkICcKKyAgICAgICAgICAgICAgICAgJ25vdFxuJworICAgICAgICAgICAgICAgICAnICAgZGVmaW5lIGEgIl9faGFzaF9fKCkiIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0IGRlZmluZXMgJworICAgICAgICAgICAgICAgICAnIl9fZXFfXygpIlxuJworICAgICAgICAgICAgICAgICAnICAgYnV0IG5vdCAiX19oYXNoX18oKSIsIGl0cyBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlIGFzICcKKyAgICAgICAgICAgICAgICAgJ2l0ZW1zIGluXG4nCisgICAgICAgICAgICAgICAgICcgICBoYXNoYWJsZSBjb2xsZWN0aW9ucy4gIElmIGEgY2xhc3MgZGVmaW5lcyBtdXRhYmxlIG9iamVjdHMgJworICAgICAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICBpbXBsZW1lbnRzIGFuICJfX2VxX18oKSIgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudFxuJworICAgICAgICAgICAgICAgICAnICAgIl9faGFzaF9fKCkiLCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgaGFzaGFibGUgJworICAgICAgICAgICAgICAgICAnY29sbGVjdGlvbnNcbicKKyAgICAgICAgICAgICAgICAgIiAgIHJlcXVpcmVzIHRoYXQgYSBrZXkncyBoYXNoIHZhbHVlIGlzIGltbXV0YWJsZSAoaWYgdGhlICIKKyAgICAgICAgICAgICAgICAgIm9iamVjdCdzIGhhc2hcbiIKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlIGNoYW5nZXMsIGl0IHdpbGwgYmUgaW4gdGhlIHdyb25nIGhhc2ggYnVja2V0KS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVXNlci1kZWZpbmVkIGNsYXNzZXMgaGF2ZSAiX19lcV9fKCkiIGFuZCAiX19oYXNoX18oKSIgJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyBieVxuJworICAgICAgICAgICAgICAgICAnICAgZGVmYXVsdDsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cyBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCAnCisgICAgICAgICAgICAgICAgICd3aXRoXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGVtc2VsdmVzKSBhbmQgInguX19oYXNoX18oKSIgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSAnCisgICAgICAgICAgICAgICAgICd2YWx1ZSBzdWNoXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGF0ICJ4ID09IHkiIGltcGxpZXMgYm90aCB0aGF0ICJ4IGlzIHkiIGFuZCAiaGFzaCh4KSA9PSAnCisgICAgICAgICAgICAgICAgICdoYXNoKHkpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIGFuZCBkb2VzIG5vdCBkZWZpbmUgJworICAgICAgICAgICAgICAgICAnIl9faGFzaF9fKCkiXG4nCisgICAgICAgICAgICAgICAgICcgICB3aWxsIGhhdmUgaXRzICJfX2hhc2hfXygpIiBpbXBsaWNpdGx5IHNldCB0byAiTm9uZSIuICAnCisgICAgICAgICAgICAgICAgICdXaGVuIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgIl9faGFzaF9fKCkiIG1ldGhvZCBvZiBhIGNsYXNzIGlzICJOb25lIiwgaW5zdGFuY2VzIG9mICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBjbGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgd2lsbCByYWlzZSBhbiBhcHByb3ByaWF0ZSAiVHlwZUVycm9yIiB3aGVuIGEgcHJvZ3JhbSAnCisgICAgICAgICAgICAgICAgICdhdHRlbXB0cyB0b1xuJworICAgICAgICAgICAgICAgICAnICAgcmV0cmlldmUgdGhlaXIgaGFzaCB2YWx1ZSwgYW5kIHdpbGwgYWxzbyBiZSBjb3JyZWN0bHkgJworICAgICAgICAgICAgICAgICAnaWRlbnRpZmllZCBhc1xuJworICAgICAgICAgICAgICAgICAnICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nICJpc2luc3RhbmNlKG9iaiwgJworICAgICAgICAgICAgICAgICAnY29sbGVjdGlvbnMuSGFzaGFibGUpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgYSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIG5lZWRzIHRvIHJldGFpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGltcGxlbWVudGF0aW9uIG9mICJfX2hhc2hfXygpIiBmcm9tIGEgcGFyZW50IGNsYXNzLCB0aGUgJworICAgICAgICAgICAgICAgICAnaW50ZXJwcmV0ZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgIG11c3QgYmUgdG9sZCB0aGlzIGV4cGxpY2l0bHkgYnkgc2V0dGluZyAiX19oYXNoX18gPVxuJworICAgICAgICAgICAgICAgICAnICAgPFBhcmVudENsYXNzPi5fX2hhc2hfXyIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIGEgY2xhc3MgdGhhdCBkb2VzIG5vdCBvdmVycmlkZSAiX19lcV9fKCkiIHdpc2hlcyB0byAnCisgICAgICAgICAgICAgICAgICdzdXBwcmVzc1xuJworICAgICAgICAgICAgICAgICAnICAgaGFzaCBzdXBwb3J0LCBpdCBzaG91bGQgaW5jbHVkZSAiX19oYXNoX18gPSBOb25lIiBpbiB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlZmluaXRpb24uIEEgY2xhc3Mgd2hpY2ggZGVmaW5lcyBpdHMgb3duICJfX2hhc2hfXygpIiAnCisgICAgICAgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICAgICAgICcgICBleHBsaWNpdGx5IHJhaXNlcyBhICJUeXBlRXJyb3IiIHdvdWxkIGJlIGluY29ycmVjdGx5ICcKKyAgICAgICAgICAgICAgICAgJ2lkZW50aWZpZWQgYXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGhhc2hhYmxlIGJ5IGFuICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpIiAnCisgICAgICAgICAgICAgICAgICdjYWxsLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlOiBCeSBkZWZhdWx0LCB0aGUgIl9faGFzaF9fKCkiIHZhbHVlcyBvZiBzdHIsIGJ5dGVzICcKKyAgICAgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICAgICAnICAgICBkYXRldGltZSBvYmplY3RzIGFyZSAic2FsdGVkIiB3aXRoIGFuIHVucHJlZGljdGFibGUgJworICAgICAgICAgICAgICAgICAncmFuZG9tIHZhbHVlLlxuJworICAgICAgICAgICAgICAgICAnICAgICBBbHRob3VnaCB0aGV5IHJlbWFpbiBjb25zdGFudCB3aXRoaW4gYW4gaW5kaXZpZHVhbCAnCisgICAgICAgICAgICAgICAgICdQeXRob25cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgcHJvY2VzcywgdGhleSBhcmUgbm90IHByZWRpY3RhYmxlIGJldHdlZW4gcmVwZWF0ZWQgJworICAgICAgICAgICAgICAgICAnaW52b2NhdGlvbnMgb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgUHl0aG9uLlRoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgYSAnCisgICAgICAgICAgICAgICAgICdkZW5pYWwtXG4nCisgICAgICAgICAgICAgICAgICcgICAgIG9mLXNlcnZpY2UgY2F1c2VkIGJ5IGNhcmVmdWxseS1jaG9zZW4gaW5wdXRzIHRoYXQgJworICAgICAgICAgICAgICAgICAnZXhwbG9pdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBvZiBhIGRpY3QgaW5zZXJ0aW9uLCBPKG5eMikgJworICAgICAgICAgICAgICAgICAnY29tcGxleGl0eS5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgU2VlIGh0dHA6Ly93d3cub2NlcnQub3JnL2Fkdmlzb3JpZXMvb2NlcnQtMjAxMS0wMDMuaHRtbCAnCisgICAgICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgZGV0YWlscy5DaGFuZ2luZyBoYXNoIHZhbHVlcyBhZmZlY3RzIHRoZSBpdGVyYXRpb24gJworICAgICAgICAgICAgICAgICAnb3JkZXIgb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgZGljdHMsIHNldHMgYW5kIG90aGVyIG1hcHBpbmdzLiAgUHl0aG9uIGhhcyBuZXZlciBtYWRlICcKKyAgICAgICAgICAgICAgICAgJ2d1YXJhbnRlZXNcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgYWJvdXQgdGhpcyBvcmRlcmluZyAoYW5kIGl0IHR5cGljYWxseSB2YXJpZXMgYmV0d2VlbiAnCisgICAgICAgICAgICAgICAgICczMi1iaXQgYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAgIDY0LWJpdCBidWlsZHMpLlNlZSBhbHNvICJQWVRIT05IQVNIU0VFRCIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IEhhc2ggcmFuZG9taXphdGlvbiBpcyBlbmFibGVkIGJ5ICcKKyAgICAgICAgICAgICAgICAgJ2RlZmF1bHQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Jvb2xfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiAnCisgICAgICAgICAgICAgICAgICdvcGVyYXRpb25cbicKKyAgICAgICAgICAgICAgICAgJyAgICJib29sKCkiOyBzaG91bGQgcmV0dXJuICJGYWxzZSIgb3IgIlRydWUiLiAgV2hlbiB0aGlzICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZCBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlZmluZWQsICJfX2xlbl9fKCkiIGlzIGNhbGxlZCwgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICdvYmplY3QgaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQgdHJ1ZSBpZiBpdHMgcmVzdWx0IGlzIG5vbnplcm8uICBJZiBhIGNsYXNzICcKKyAgICAgICAgICAgICAgICAgJ2RlZmluZXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5laXRoZXIgIl9fbGVuX18oKSIgbm9yICJfX2Jvb2xfXygpIiwgYWxsIGl0cyBpbnN0YW5jZXMgJworICAgICAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgICAgICcgICBjb25zaWRlcmVkIHRydWUuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQ3VzdG9taXppbmcgYXR0cmlidXRlIGFjY2Vzc1xuJworICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gY3VzdG9taXplIHRoZSAnCisgICAgICAgICAgICAgICAgICdtZWFuaW5nIG9mXG4nCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgYWNjZXNzICh1c2Ugb2YsIGFzc2lnbm1lbnQgdG8sIG9yIGRlbGV0aW9uIG9mICcKKyAgICAgICAgICAgICAgICAgJyJ4Lm5hbWUiKSBmb3JcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGluc3RhbmNlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBsb29rdXAgaGFzIG5vdCBmb3VuZCB0aGUgJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIGluIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgdXN1YWwgcGxhY2VzIChpLmUuIGl0IGlzIG5vdCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgbm9yIGlzICcKKyAgICAgICAgICAgICAgICAgJ2l0IGZvdW5kXG4nCisgICAgICAgICAgICAgICAgICcgICBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgInNlbGYiKS4gICJuYW1lIiBpcyB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgJ25hbWUuIFRoaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciAnCisgICAgICAgICAgICAgICAgICdyYWlzZSBhblxuJworICAgICAgICAgICAgICAgICAnICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlIG5vcm1hbCAnCisgICAgICAgICAgICAgICAgICdtZWNoYW5pc20sXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19nZXRhdHRyX18oKSIgaXMgbm90IGNhbGxlZC4gIChUaGlzIGlzIGFuIGludGVudGlvbmFsICcKKyAgICAgICAgICAgICAgICAgJ2FzeW1tZXRyeVxuJworICAgICAgICAgICAgICAgICAnICAgYmV0d2VlbiAiX19nZXRhdHRyX18oKSIgYW5kICJfX3NldGF0dHJfXygpIi4pIFRoaXMgaXMgJworICAgICAgICAgICAgICAgICAnZG9uZSBib3RoIGZvclxuJworICAgICAgICAgICAgICAgICAnICAgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSAiX19nZXRhdHRyX18oKSIgJworICAgICAgICAgICAgICAgICAnd291bGQgaGF2ZVxuJworICAgICAgICAgICAgICAgICAnICAgbm8gd2F5IHRvIGFjY2VzcyBvdGhlciBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZS4gIE5vdGUgJworICAgICAgICAgICAgICAgICAndGhhdCBhdFxuJworICAgICAgICAgICAgICAgICAnICAgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiBmYWtlIHRvdGFsIGNvbnRyb2wgJworICAgICAgICAgICAgICAgICAnYnkgbm90XG4nCisgICAgICAgICAgICAgICAgICcgICBpbnNlcnRpbmcgYW55IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIGRpY3Rpb25hcnkgJworICAgICAgICAgICAgICAgICAnKGJ1dFxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGVhZCBpbnNlcnRpbmcgdGhlbSBpbiBhbm90aGVyIG9iamVjdCkuICBTZWUgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgYmVsb3cgZm9yIGEgd2F5IHRvIGFjdHVhbGx5ICcKKyAgICAgICAgICAgICAgICAgJ2dldCB0b3RhbFxuJworICAgICAgICAgICAgICAgICAnICAgY29udHJvbCBvdmVyIGF0dHJpYnV0ZSBhY2Nlc3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB1bmNvbmRpdGlvbmFsbHkgdG8gaW1wbGVtZW50IGF0dHJpYnV0ZSBhY2Nlc3NlcyAnCisgICAgICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXMgJworICAgICAgICAgICAgICAgICAnIl9fZ2V0YXR0cl9fKCkiLFxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIGxhdHRlciB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzICJfX2dldGF0dHJpYnV0ZV9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ2VpdGhlclxuJworICAgICAgICAgICAgICAgICAnICAgY2FsbHMgaXQgZXhwbGljaXRseSBvciByYWlzZXMgYW4gIkF0dHJpYnV0ZUVycm9yIi4gVGhpcyAnCisgICAgICAgICAgICAgICAgICdtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4nCisgICAgICAgICAgICAgICAgICcgICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi4gSW4gb3JkZXIgdG8gYXZvaWQgaW5maW5pdGUgJworICAgICAgICAgICAgICAgICAncmVjdXJzaW9uIGluXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgJworICAgICAgICAgICAgICAgICAnYmFzZSBjbGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB0byBhY2Nlc3MgYW55IGF0dHJpYnV0ZXMgaXQgJworICAgICAgICAgICAgICAgICAnbmVlZHMsIGZvclxuJworICAgICAgICAgICAgICAgICAnICAgZXhhbXBsZSwgIm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZTogVGhpcyBtZXRob2QgbWF5IHN0aWxsIGJlIGJ5cGFzc2VkIHdoZW4gbG9va2luZyB1cCAnCisgICAgICAgICAgICAgICAgICdzcGVjaWFsXG4nCisgICAgICAgICAgICAgICAgICcgICAgIG1ldGhvZHMgYXMgdGhlIHJlc3VsdCBvZiBpbXBsaWNpdCBpbnZvY2F0aW9uIHZpYSAnCisgICAgICAgICAgICAgICAgICdsYW5ndWFnZSBzeW50YXhcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgb3IgYnVpbHQtaW4gZnVuY3Rpb25zLiBTZWUgU3BlY2lhbCBtZXRob2QgbG9va3VwLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBhc3NpZ25tZW50IGlzIGF0dGVtcHRlZC4gIFRoaXMgJworICAgICAgICAgICAgICAgICAnaXMgY2FsbGVkXG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgbWVjaGFuaXNtIChpLmUuIHN0b3JlIHRoZSB2YWx1ZSBpbiAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlIGRpY3Rpb25hcnkpLiAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAnCisgICAgICAgICAgICAgICAgICcqdmFsdWUqIGlzIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gaXQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmICJfX3NldGF0dHJfXygpIiB3YW50cyB0byBhc3NpZ24gdG8gYW4gaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlLCBpdFxuJworICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIGNhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgZm9yICcKKyAgICAgICAgICAgICAgICAgJ2V4YW1wbGUsXG4nCisgICAgICAgICAgICAgICAgICcgICAib2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RlbGF0dHJfXyhzZWxmLCBuYW1lKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBMaWtlICJfX3NldGF0dHJfXygpIiBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiBpbnN0ZWFkICcKKyAgICAgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgICAgICcgICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiAiZGVsICcKKyAgICAgICAgICAgICAgICAgJ29iai5uYW1lIiBpc1xuJworICAgICAgICAgICAgICAgICAnICAgbWVhbmluZ2Z1bCBmb3IgdGhlIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGlyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gImRpcigpIiBpcyBjYWxsZWQgb24gdGhlIG9iamVjdC4gQSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAgICdtdXN0IGJlXG4nCisgICAgICAgICAgICAgICAgICcgICByZXR1cm5lZC4gImRpcigpIiBjb252ZXJ0cyB0aGUgcmV0dXJuZWQgc2VxdWVuY2UgdG8gYSAnCisgICAgICAgICAgICAgICAgICdsaXN0IGFuZFxuJworICAgICAgICAgICAgICAgICAnICAgc29ydHMgaXQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzXG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJ2NvbnRhaW5pbmcgdGhlIG1ldGhvZCAoYSBzby1jYWxsZWQgKmRlc2NyaXB0b3IqIGNsYXNzKSAnCisgICAgICAgICAgICAgICAgICdhcHBlYXJzIGluIGFuXG4nCisgICAgICAgICAgICAgICAgICIqb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXIncyAiCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeSBvciBpbiB0aGUgY2xhc3MgZGljdGlvbmFyeSBmb3Igb25lIG9mIGl0cyAnCisgICAgICAgICAgICAgICAgICdwYXJlbnRzKS4gIEluIHRoZVxuJworICAgICAgICAgICAgICAgICAnZXhhbXBsZXMgYmVsb3csICJ0aGUgYXR0cmlidXRlIiByZWZlcnMgdG8gdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICAgICd3aG9zZSBuYW1lIGlzXG4nCisgICAgICAgICAgICAgICAgICd0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgb3duZXIgY2xhc3NcJyAiX19kaWN0X18iLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXIpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzICcKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgICAnICAgYWNjZXNzKSBvciBvZiBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIChpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFjY2VzcykuICpvd25lciogaXMgYWx3YXlzIHRoZSBvd25lciBjbGFzcywgd2hpbGUgJworICAgICAgICAgICAgICAgICAnKmluc3RhbmNlKiBpcyB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwgb3IgJworICAgICAgICAgICAgICAgICAnIk5vbmUiIHdoZW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgKm93bmVyKi4gIFRoaXMgJworICAgICAgICAgICAgICAgICAnbWV0aG9kIHNob3VsZFxuJworICAgICAgICAgICAgICAgICAnICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbiAnCisgICAgICAgICAgICAgICAgICciQXR0cmlidXRlRXJyb3IiXG4nCisgICAgICAgICAgICAgICAgICcgICBleGNlcHRpb24uXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3NldF9fKHNlbGYsIGluc3RhbmNlLCB2YWx1ZSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgJworICAgICAgICAgICAgICAgICAndGhlIG93bmVyXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzcyB0byBhIG5ldyB2YWx1ZSwgKnZhbHVlKi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGVsZXRlX18oc2VsZiwgaW5zdGFuY2UpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBkZWxldGUgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqICcKKyAgICAgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgb3duZXIgY2xhc3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3NldF9uYW1lX18oc2VsZiwgb3duZXIsIG5hbWUpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBhdCB0aGUgdGltZSB0aGUgb3duaW5nIGNsYXNzICpvd25lciogaXMgY3JlYXRlZC4gJworICAgICAgICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBkZXNjcmlwdG9yIGhhcyBiZWVuIGFzc2lnbmVkIHRvICpuYW1lKi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy42LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgYXR0cmlidXRlICJfX29iamNsYXNzX18iIGlzIGludGVycHJldGVkIGJ5IHRoZSAiaW5zcGVjdCIgJworICAgICAgICAgICAgICAgICAnbW9kdWxlIGFzXG4nCisgICAgICAgICAgICAgICAgICdzcGVjaWZ5aW5nIHRoZSBjbGFzcyB3aGVyZSB0aGlzIG9iamVjdCB3YXMgZGVmaW5lZCAoc2V0dGluZyAnCisgICAgICAgICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZWx5IGNhbiBhc3Npc3QgaW4gcnVudGltZSBpbnRyb3NwZWN0aW9uIG9mIGR5bmFtaWMgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMpLiBGb3IgY2FsbGFibGVzLCBpdCBtYXkgaW5kaWNhdGUgdGhhdCBhbiBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ2dpdmVuIHR5cGUgKG9yIGEgc3ViY2xhc3MpIGlzIGV4cGVjdGVkIG9yIHJlcXVpcmVkIGFzIHRoZSAnCisgICAgICAgICAgICAgICAgICdmaXJzdFxuJworICAgICAgICAgICAgICAgICAncG9zaXRpb25hbCBhcmd1bWVudCAoZm9yIGV4YW1wbGUsIENQeXRob24gc2V0cyB0aGlzICcKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBmb3JcbicKKyAgICAgICAgICAgICAgICAgJ3VuYm91bmQgbWV0aG9kcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBDKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJbnZva2luZyBEZXNjcmlwdG9yc1xuJworICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCAnCisgICAgICAgICAgICAgICAgICciYmluZGluZ1xuJworICAgICAgICAgICAgICAgICAnYmVoYXZpb3IiLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiBvdmVycmlkZGVuIGJ5ICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHNcbicKKyAgICAgICAgICAgICAgICAgJ2luIHRoZSBkZXNjcmlwdG9yIHByb3RvY29sOiAgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiLCBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyJfX2RlbGV0ZV9fKCkiLiBJZiBhbnkgb2YgdGhvc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgYW4gJworICAgICAgICAgICAgICAgICAnb2JqZWN0LCBpdFxuJworICAgICAgICAgICAgICAgICAnaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhdHRyaWJ1dGUgYWNjZXNzIGlzIHRvIGdldCwgc2V0LCBvciAnCisgICAgICAgICAgICAgICAgICdkZWxldGVcbicKKyAgICAgICAgICAgICAgICAgInRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3QncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsICIKKyAgICAgICAgICAgICAgICAgJyJhLngiIGhhcyBhXG4nCisgICAgICAgICAgICAgICAgICdsb29rdXAgY2hhaW4gc3RhcnRpbmcgd2l0aCAiYS5fX2RpY3RfX1tcJ3hcJ10iLCB0aGVuXG4nCisgICAgICAgICAgICAgICAgICcidHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10iLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzZXMgb2ZcbicKKyAgICAgICAgICAgICAgICAgJyJ0eXBlKGEpIiBleGNsdWRpbmcgbWV0YWNsYXNzZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0hvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nIG9uZSBvZiAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3IgbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgJ2JlaGF2aW9yIGFuZFxuJworICAgICAgICAgICAgICAgICAnaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICdwcmVjZWRlbmNlIGNoYWluIGRlcGVuZHMgb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIHdlcmUgJworICAgICAgICAgICAgICAgICAnZGVmaW5lZCBhbmRcbicKKyAgICAgICAgICAgICAgICAgJ2hvdyB0aGV5IHdlcmUgY2FsbGVkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhIGJpbmRpbmcsICcKKyAgICAgICAgICAgICAgICAgJyJhLngiLiBIb3dcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBhcmd1bWVudHMgYXJlIGFzc2VtYmxlZCBkZXBlbmRzIG9uICJhIjpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRGlyZWN0IENhbGxcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSBzaW1wbGVzdCBhbmQgbGVhc3QgY29tbW9uIGNhbGwgaXMgd2hlbiB1c2VyIGNvZGUgJworICAgICAgICAgICAgICAgICAnZGlyZWN0bHlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGludm9rZXMgYSBkZXNjcmlwdG9yIG1ldGhvZDogICAgInguX19nZXRfXyhhKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0luc3RhbmNlIEJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIGJpbmRpbmcgdG8gYW4gb2JqZWN0IGluc3RhbmNlLCAiYS54IiBpcyB0cmFuc2Zvcm1lZCAnCisgICAgICAgICAgICAgICAgICdpbnRvIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgY2FsbDogInR5cGUoYSkuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oYSwgdHlwZShhKSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdDbGFzcyBCaW5kaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBiaW5kaW5nIHRvIGEgY2xhc3MsICJBLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NhbGw6XG4nCisgICAgICAgICAgICAgICAgICcgICAiQS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhOb25lLCBBKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1N1cGVyIEJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmICJhIiBpcyBhbiBpbnN0YW5jZSBvZiAic3VwZXIiLCB0aGVuIHRoZSBiaW5kaW5nICcKKyAgICAgICAgICAgICAgICAgJyJzdXBlcihCLFxuJworICAgICAgICAgICAgICAgICAnICAgb2JqKS5tKCkiIHNlYXJjaGVzICJvYmouX19jbGFzc19fLl9fbXJvX18iIGZvciB0aGUgYmFzZSAnCisgICAgICAgICAgICAgICAgICdjbGFzcyAiQSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGltbWVkaWF0ZWx5IHByZWNlZGluZyAiQiIgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVzY3JpcHRvciAnCisgICAgICAgICAgICAgICAgICd3aXRoIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgY2FsbDogIkEuX19kaWN0X19bXCdtXCddLl9fZ2V0X18ob2JqLCBvYmouX19jbGFzc19fKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0ZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciAnCisgICAgICAgICAgICAgICAgICdpbnZvY2F0aW9uIGRlcGVuZHNcbicKKyAgICAgICAgICAgICAgICAgJ29uIHRoZSB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgYXJlIGRlZmluZWQuICBBIGRlc2NyaXB0b3IgJworICAgICAgICAgICAgICAgICAnY2FuIGRlZmluZVxuJworICAgICAgICAgICAgICAgICAnYW55IGNvbWJpbmF0aW9uIG9mICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiBhbmQgJworICAgICAgICAgICAgICAgICAnIl9fZGVsZXRlX18oKSIuICBJZiBpdFxuJworICAgICAgICAgICAgICAgICAnZG9lcyBub3QgZGVmaW5lICJfX2dldF9fKCkiLCB0aGVuIGFjY2Vzc2luZyB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgJ3dpbGwgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICd0aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICJvYmplY3Qnc1xuIgorICAgICAgICAgICAgICAgICAnaW5zdGFuY2UgZGljdGlvbmFyeS4gIElmIHRoZSBkZXNjcmlwdG9yIGRlZmluZXMgIl9fc2V0X18oKSIgJworICAgICAgICAgICAgICAgICAnYW5kL29yXG4nCisgICAgICAgICAgICAgICAgICciX19kZWxldGVfXygpIiwgaXQgaXMgYSBkYXRhIGRlc2NyaXB0b3I7IGlmIGl0IGRlZmluZXMgJworICAgICAgICAgICAgICAgICAnbmVpdGhlciwgaXQgaXNcbicKKyAgICAgICAgICAgICAgICAgJ2Egbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzIGRlZmluZSAnCisgICAgICAgICAgICAgICAgICdib3RoXG4nCisgICAgICAgICAgICAgICAgICciX19nZXRfXygpIiBhbmQgIl9fc2V0X18oKSIsIHdoaWxlIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGhhdmUgJworICAgICAgICAgICAgICAgICAnanVzdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyJfX2dldF9fKCkiIG1ldGhvZC4gIERhdGEgZGVzY3JpcHRvcnMgd2l0aCAiX19zZXRfXygpIiBhbmQgJworICAgICAgICAgICAgICAgICAnIl9fZ2V0X18oKSJcbicKKyAgICAgICAgICAgICAgICAgJ2RlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uIGluIGFuIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkuICBJblxuJworICAgICAgICAgICAgICAgICAnY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZSBvdmVycmlkZGVuIGJ5ICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnUHl0aG9uIG1ldGhvZHMgKGluY2x1ZGluZyAic3RhdGljbWV0aG9kKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICciY2xhc3NtZXRob2QoKSIpIGFyZVxuJworICAgICAgICAgICAgICAgICAnaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwgaW5zdGFuY2VzICcKKyAgICAgICAgICAgICAgICAgJ2NhblxuJworICAgICAgICAgICAgICAgICAncmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlcyB0b1xuJworICAgICAgICAgICAgICAgICAnYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ3NhbWUgY2xhc3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSAicHJvcGVydHkoKSIgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhICcKKyAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3IuXG4nCisgICAgICAgICAgICAgICAgICdBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhbm5vdCBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgYSAnCisgICAgICAgICAgICAgICAgICdwcm9wZXJ0eS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdfX3Nsb3RzX19cbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdCeSBkZWZhdWx0LCBpbnN0YW5jZXMgb2YgY2xhc3NlcyBoYXZlIGEgZGljdGlvbmFyeSBmb3IgJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgICAgICAgICdzdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHMgaGF2aW5nIHZlcnkgZmV3ICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgICAgICAgICd2YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZSBhY3V0ZSB3aGVuICcKKyAgICAgICAgICAgICAgICAgJ2NyZWF0aW5nIGxhcmdlXG4nCisgICAgICAgICAgICAgICAgICdudW1iZXJzIG9mIGluc3RhbmNlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgKl9fc2xvdHNfXyogaW4gYSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbi4gVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2YgJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlcyBhbmQgcmVzZXJ2ZXMganVzdCBlbm91Z2ggc3BhY2UgaW4gZWFjaCBpbnN0YW5jZSB0byAnCisgICAgICAgICAgICAgICAgICdob2xkIGFcbicKKyAgICAgICAgICAgICAgICAgJ3ZhbHVlIGZvciBlYWNoIHZhcmlhYmxlLiAgU3BhY2UgaXMgc2F2ZWQgYmVjYXVzZSAqX19kaWN0X18qICcKKyAgICAgICAgICAgICAgICAgJ2lzIG5vdFxuJworICAgICAgICAgICAgICAgICAnY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2xvdHNfX1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGlzIGNsYXNzIHZhcmlhYmxlIGNhbiBiZSBhc3NpZ25lZCBhIHN0cmluZywgaXRlcmFibGUsICcKKyAgICAgICAgICAgICAgICAgJ29yIHNlcXVlbmNlXG4nCisgICAgICAgICAgICAgICAgICcgICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICAnCisgICAgICAgICAgICAgICAgICcqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAnICAgcmVzZXJ2ZXMgc3BhY2UgZm9yIHRoZSBkZWNsYXJlZCB2YXJpYWJsZXMgYW5kIHByZXZlbnRzICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgYXV0b21hdGljIGNyZWF0aW9uIG9mICpfX2RpY3RfXyogYW5kICpfX3dlYWtyZWZfXyogZm9yICcKKyAgICAgICAgICAgICAgICAgJ2VhY2hcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ05vdGVzIG9uIHVzaW5nICpfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICd+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+flxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICcKKyAgICAgICAgICAgICAgICAgJypfX2RpY3RfXypcbicKKyAgICAgICAgICAgICAgICAgJyAgYXR0cmlidXRlIG9mIHRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZSwgc28gYSAnCisgICAgICAgICAgICAgICAgICcqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAnICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSAnCisgICAgICAgICAgICAgICAgICdhc3NpZ25lZCBuZXdcbicKKyAgICAgICAgICAgICAgICAgJyAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICAnCisgICAgICAgICAgICAgICAgICdBdHRlbXB0cyB0b1xuJworICAgICAgICAgICAgICAgICAnICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgJworICAgICAgICAgICAgICAgICAnIkF0dHJpYnV0ZUVycm9yIi4gSWZcbicKKyAgICAgICAgICAgICAgICAgJyAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGRcbicKKyAgICAgICAgICAgICAgICAgJyAgIlwnX19kaWN0X19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJypfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICcgIGRlY2xhcmF0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCAnCisgICAgICAgICAgICAgICAgICdjbGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICcgIGRlZmluaW5nICpfX3Nsb3RzX18qIGRvIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyB0byAnCisgICAgICAgICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAgICAgICAgJyAgaW5zdGFuY2VzLiBJZiB3ZWFrIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGRcbicKKyAgICAgICAgICAgICAgICAgJyAgIlwnX193ZWFrcmVmX19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJypfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICcgIGRlY2xhcmF0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgJworICAgICAgICAgICAgICAgICAnY3JlYXRpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgZGVzY3JpcHRvcnMgKEltcGxlbWVudGluZyBEZXNjcmlwdG9ycykgZm9yIGVhY2ggdmFyaWFibGUgJworICAgICAgICAgICAgICAgICAnbmFtZS4gIEFzIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgcmVzdWx0LCBjbGFzcyBhdHRyaWJ1dGVzIGNhbm5vdCBiZSB1c2VkIHRvIHNldCBkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgJ3ZhbHVlcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQgYnkgKl9fc2xvdHNfXyo7IG90aGVyd2lzZSwgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICcgIGF0dHJpYnV0ZSB3b3VsZCBvdmVyd3JpdGUgdGhlIGRlc2NyaXB0b3IgYXNzaWdubWVudC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiBUaGUgYWN0aW9uIG9mIGEgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gaXMgbGltaXRlZCB0byB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgd2hlcmUgaXQgaXMgZGVmaW5lZC4gIEFzIGEgcmVzdWx0LCBzdWJjbGFzc2VzIHdpbGwgaGF2ZSBhICcKKyAgICAgICAgICAgICAgICAgJypfX2RpY3RfXypcbicKKyAgICAgICAgICAgICAgICAgJyAgdW5sZXNzIHRoZXkgYWxzbyBkZWZpbmUgKl9fc2xvdHNfXyogKHdoaWNoIG11c3Qgb25seSAnCisgICAgICAgICAgICAgICAgICdjb250YWluIG5hbWVzXG4nCisgICAgICAgICAgICAgICAgICcgIG9mIGFueSAqYWRkaXRpb25hbCogc2xvdHMpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIElmIGEgY2xhc3MgZGVmaW5lcyBhIHNsb3QgYWxzbyBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcywgJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgIGluc3RhbmNlIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyAnCisgICAgICAgICAgICAgICAgICdpbmFjY2Vzc2libGVcbicKKyAgICAgICAgICAgICAgICAgJyAgKGV4Y2VwdCBieSByZXRyaWV2aW5nIGl0cyBkZXNjcmlwdG9yIGRpcmVjdGx5IGZyb20gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2Jhc2UgY2xhc3MpLlxuJworICAgICAgICAgICAgICAgICAnICBUaGlzIHJlbmRlcnMgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0gdW5kZWZpbmVkLiAgSW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2Z1dHVyZSwgYVxuJworICAgICAgICAgICAgICAgICAnICBjaGVjayBtYXkgYmUgYWRkZWQgdG8gcHJldmVudCB0aGlzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIE5vbmVtcHR5ICpfX3Nsb3RzX18qIGRvZXMgbm90IHdvcmsgZm9yIGNsYXNzZXMgZGVyaXZlZCAnCisgICAgICAgICAgICAgICAgICdmcm9tXG4nCisgICAgICAgICAgICAgICAgICcgICJ2YXJpYWJsZS1sZW5ndGgiIGJ1aWx0LWluIHR5cGVzIHN1Y2ggYXMgImludCIsICJieXRlcyIgJworICAgICAgICAgICAgICAgICAnYW5kICJ0dXBsZSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogQW55IG5vbi1zdHJpbmcgaXRlcmFibGUgbWF5IGJlIGFzc2lnbmVkIHRvICpfX3Nsb3RzX18qLiAnCisgICAgICAgICAgICAgICAgICdNYXBwaW5nc1xuJworICAgICAgICAgICAgICAgICAnICBtYXkgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsIG1lYW5pbmcgJworICAgICAgICAgICAgICAgICAnbWF5IGJlXG4nCisgICAgICAgICAgICAgICAgICcgIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiAqX19jbGFzc19fKiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlICcKKyAgICAgICAgICAgICAgICAgJ3NhbWVcbicKKyAgICAgICAgICAgICAgICAgJyAgKl9fc2xvdHNfXyouXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQ3VzdG9taXppbmcgY2xhc3MgY3JlYXRpb25cbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1doZW5ldmVyIGEgY2xhc3MgaW5oZXJpdHMgZnJvbSBhbm90aGVyIGNsYXNzLCAnCisgICAgICAgICAgICAgICAgICcqX19pbml0X3N1YmNsYXNzX18qIGlzXG4nCisgICAgICAgICAgICAgICAgICdjYWxsZWQgb24gdGhhdCBjbGFzcy4gVGhpcyB3YXksIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzZXMgd2hpY2hcbicKKyAgICAgICAgICAgICAgICAgJ2NoYW5nZSB0aGUgYmVoYXZpb3Igb2Ygc3ViY2xhc3Nlcy4gVGhpcyBpcyBjbG9zZWx5IHJlbGF0ZWQgJworICAgICAgICAgICAgICAgICAndG8gY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJ2RlY29yYXRvcnMsIGJ1dCB3aGVyZSBjbGFzcyBkZWNvcmF0b3JzIG9ubHkgYWZmZWN0IHRoZSAnCisgICAgICAgICAgICAgICAgICdzcGVjaWZpYyBjbGFzc1xuJworICAgICAgICAgICAgICAgICAndGhleVwncmUgYXBwbGllZCB0bywgIl9faW5pdF9zdWJjbGFzc19fIiBzb2xlbHkgYXBwbGllcyB0byAnCisgICAgICAgICAgICAgICAgICdmdXR1cmVcbicKKyAgICAgICAgICAgICAgICAgJ3N1YmNsYXNzZXMgb2YgdGhlIGNsYXNzIGRlZmluaW5nIHRoZSBtZXRob2QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzbWV0aG9kIG9iamVjdC5fX2luaXRfc3ViY2xhc3NfXyhjbHMpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgY29udGFpbmluZyBjbGFzcyBpcyAnCisgICAgICAgICAgICAgICAgICdzdWJjbGFzc2VkLlxuJworICAgICAgICAgICAgICAgICAnICAgKmNscyogaXMgdGhlbiB0aGUgbmV3IHN1YmNsYXNzLiBJZiBkZWZpbmVkIGFzIGEgbm9ybWFsICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgICAgICAgICcgICBtZXRob2QsIHRoaXMgbWV0aG9kIGlzIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEgY2xhc3MgJworICAgICAgICAgICAgICAgICAnbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBLZXl3b3JkIGFyZ3VtZW50cyB3aGljaCBhcmUgZ2l2ZW4gdG8gYSBuZXcgY2xhc3MgYXJlICcKKyAgICAgICAgICAgICAgICAgJ3Bhc3NlZCB0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHBhcmVudFwncyBjbGFzcyAiX19pbml0X3N1YmNsYXNzX18iLiBGb3IgY29tcGF0aWJpbGl0eSAnCisgICAgICAgICAgICAgICAgICd3aXRoIG90aGVyXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzc2VzIHVzaW5nICJfX2luaXRfc3ViY2xhc3NfXyIsIG9uZSBzaG91bGQgdGFrZSBvdXQgJworICAgICAgICAgICAgICAgICAndGhlIG5lZWRlZFxuJworICAgICAgICAgICAgICAgICAnICAga2V5d29yZCBhcmd1bWVudHMgYW5kIHBhc3MgdGhlIG90aGVycyBvdmVyIHRvIHRoZSBiYXNlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLCBhc1xuJworICAgICAgICAgICAgICAgICAnICAgaW46XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGNsYXNzIFBoaWxvc29waGVyOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMsIGRlZmF1bHRfbmFtZSwgJworICAgICAgICAgICAgICAgICAnKiprd2FyZ3MpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICBzdXBlcigpLl9faW5pdF9zdWJjbGFzc19fKCoqa3dhcmdzKVxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICBjbHMuZGVmYXVsdF9uYW1lID0gZGVmYXVsdF9uYW1lXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGNsYXNzIEF1c3RyYWxpYW5QaGlsb3NvcGhlcihQaGlsb3NvcGhlciwgJworICAgICAgICAgICAgICAgICAnZGVmYXVsdF9uYW1lPSJCcnVjZSIpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gIm9iamVjdC5fX2luaXRfc3ViY2xhc3NfXyIgJworICAgICAgICAgICAgICAgICAnZG9lcyBub3RoaW5nLFxuJworICAgICAgICAgICAgICAgICAnICAgYnV0IHJhaXNlcyBhbiBlcnJvciBpZiBpdCBpcyBjYWxsZWQgd2l0aCBhbnkgYXJndW1lbnRzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlOiBUaGUgbWV0YWNsYXNzIGhpbnQgIm1ldGFjbGFzcyIgaXMgY29uc3VtZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgJ3Jlc3Qgb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdGhlIHR5cGUgbWFjaGluZXJ5LCBhbmQgaXMgbmV2ZXIgcGFzc2VkIHRvICcKKyAgICAgICAgICAgICAgICAgJyJfX2luaXRfc3ViY2xhc3NfXyJcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgaW1wbGVtZW50YXRpb25zLiBUaGUgYWN0dWFsIG1ldGFjbGFzcyAocmF0aGVyIHRoYW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2V4cGxpY2l0XG4nCisgICAgICAgICAgICAgICAgICcgICAgIGhpbnQpIGNhbiBiZSBhY2Nlc3NlZCBhcyAidHlwZShjbHMpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy42LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ01ldGFjbGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdCeSBkZWZhdWx0LCBjbGFzc2VzIGFyZSBjb25zdHJ1Y3RlZCB1c2luZyAidHlwZSgpIi4gVGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGJvZHkgaXNcbicKKyAgICAgICAgICAgICAgICAgJ2V4ZWN1dGVkIGluIGEgbmV3IG5hbWVzcGFjZSBhbmQgdGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgJworICAgICAgICAgICAgICAgICAnbG9jYWxseSB0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ3Jlc3VsdCBvZiAidHlwZShuYW1lLCBiYXNlcywgbmFtZXNwYWNlKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBjbGFzcyBjcmVhdGlvbiBwcm9jZXNzIGNhbiBiZSBjdXN0b21pc2VkIGJ5IHBhc3NpbmcgdGhlXG4nCisgICAgICAgICAgICAgICAgICcibWV0YWNsYXNzIiBrZXl3b3JkIGFyZ3VtZW50IGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGxpbmUsICcKKyAgICAgICAgICAgICAgICAgJ29yIGJ5XG4nCisgICAgICAgICAgICAgICAgICdpbmhlcml0aW5nIGZyb20gYW4gZXhpc3RpbmcgY2xhc3MgdGhhdCBpbmNsdWRlZCBzdWNoIGFuICcKKyAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50LiBJblxuJworICAgICAgICAgICAgICAgICAndGhlIGZvbGxvd2luZyBleGFtcGxlLCBib3RoICJNeUNsYXNzIiBhbmQgIk15U3ViY2xhc3MiIGFyZSAnCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZXNcbicKKyAgICAgICAgICAgICAgICAgJ29mICJNZXRhIjpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgTWV0YSh0eXBlKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICBwYXNzXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNsYXNzIE15Q2xhc3MobWV0YWNsYXNzPU1ldGEpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgTXlTdWJjbGFzcyhNeUNsYXNzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICBwYXNzXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0FueSBvdGhlciBrZXl3b3JkIGFyZ3VtZW50cyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNsYXNzICcKKyAgICAgICAgICAgICAgICAgJ2RlZmluaXRpb25cbicKKyAgICAgICAgICAgICAgICAgJ2FyZSBwYXNzZWQgdGhyb3VnaCB0byBhbGwgbWV0YWNsYXNzIG9wZXJhdGlvbnMgZGVzY3JpYmVkICcKKyAgICAgICAgICAgICAgICAgJ2JlbG93LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdXaGVuIGEgY2xhc3MgZGVmaW5pdGlvbiBpcyBleGVjdXRlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyAnCisgICAgICAgICAgICAgICAgICdvY2N1cjpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGlzIGRldGVybWluZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiB0aGUgY2xhc3MgbmFtZXNwYWNlIGlzIHByZXBhcmVkXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogdGhlIGNsYXNzIGJvZHkgaXMgZXhlY3V0ZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdEZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzXG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgZm9yIGEgY2xhc3MgZGVmaW5pdGlvbiBpcyAnCisgICAgICAgICAgICAgICAgICdkZXRlcm1pbmVkIGFzXG4nCisgICAgICAgICAgICAgICAgICdmb2xsb3dzOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIGlmIG5vIGJhc2VzIGFuZCBubyBleHBsaWNpdCBtZXRhY2xhc3MgYXJlIGdpdmVuLCB0aGVuICcKKyAgICAgICAgICAgICAgICAgJyJ0eXBlKCkiIGlzXG4nCisgICAgICAgICAgICAgICAgICcgIHVzZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiBpZiBhbiBleHBsaWNpdCBtZXRhY2xhc3MgaXMgZ2l2ZW4gYW5kIGl0IGlzICpub3QqIGFuICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlIG9mXG4nCisgICAgICAgICAgICAgICAgICcgICJ0eXBlKCkiLCB0aGVuIGl0IGlzIHVzZWQgZGlyZWN0bHkgYXMgdGhlIG1ldGFjbGFzc1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIGlmIGFuIGluc3RhbmNlIG9mICJ0eXBlKCkiIGlzIGdpdmVuIGFzIHRoZSBleHBsaWNpdCAnCisgICAgICAgICAgICAgICAgICdtZXRhY2xhc3MsIG9yXG4nCisgICAgICAgICAgICAgICAgICcgIGJhc2VzIGFyZSBkZWZpbmVkLCB0aGVuIHRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzICcKKyAgICAgICAgICAgICAgICAgJ3VzZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgc2VsZWN0ZWQgZnJvbSB0aGUgZXhwbGljaXRseSAnCisgICAgICAgICAgICAgICAgICdzcGVjaWZpZWRcbicKKyAgICAgICAgICAgICAgICAgJ21ldGFjbGFzcyAoaWYgYW55KSBhbmQgdGhlIG1ldGFjbGFzc2VzIChpLmUuICJ0eXBlKGNscykiKSBvZiAnCisgICAgICAgICAgICAgICAgICdhbGxcbicKKyAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZCBiYXNlIGNsYXNzZXMuIFRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzIG9uZSAnCisgICAgICAgICAgICAgICAgICd3aGljaCBpcyBhXG4nCisgICAgICAgICAgICAgICAgICdzdWJ0eXBlIG9mICphbGwqIG9mIHRoZXNlIGNhbmRpZGF0ZSBtZXRhY2xhc3Nlcy4gSWYgbm9uZSBvZiAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJ2NhbmRpZGF0ZSBtZXRhY2xhc3NlcyBtZWV0cyB0aGF0IGNyaXRlcmlvbiwgdGhlbiB0aGUgY2xhc3MgJworICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvblxuJworICAgICAgICAgICAgICAgICAnd2lsbCBmYWlsIHdpdGggIlR5cGVFcnJvciIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnUHJlcGFyaW5nIHRoZSBjbGFzcyBuYW1lc3BhY2VcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ09uY2UgdGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBoYXMgYmVlbiBpZGVudGlmaWVkLCB0aGVuIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlIGlzIHByZXBhcmVkLiBJZiB0aGUgbWV0YWNsYXNzIGhhcyBhICJfX3ByZXBhcmVfXyIgJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlLFxuJworICAgICAgICAgICAgICAgICAnaXQgaXMgY2FsbGVkIGFzICJuYW1lc3BhY2UgPSBtZXRhY2xhc3MuX19wcmVwYXJlX18obmFtZSwgJworICAgICAgICAgICAgICAgICAnYmFzZXMsXG4nCisgICAgICAgICAgICAgICAgICcqKmt3ZHMpIiAod2hlcmUgdGhlIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMsIGlmIGFueSwgJworICAgICAgICAgICAgICAgICAnY29tZSBmcm9tXG4nCisgICAgICAgICAgICAgICAgICd0aGUgY2xhc3MgZGVmaW5pdGlvbikuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0lmIHRoZSBtZXRhY2xhc3MgaGFzIG5vICJfX3ByZXBhcmVfXyIgYXR0cmlidXRlLCB0aGVuIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlIGlzIGluaXRpYWxpc2VkIGFzIGFuIGVtcHR5ICJkaWN0KCkiIGluc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMzAwMFxuJworICAgICAgICAgICAgICAgICAnICAgICBJbnRyb2R1Y2VkIHRoZSAiX19wcmVwYXJlX18iIG5hbWVzcGFjZSBob29rXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRXhlY3V0aW5nIHRoZSBjbGFzcyBib2R5XG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGNsYXNzIGJvZHkgaXMgZXhlY3V0ZWQgKGFwcHJveGltYXRlbHkpIGFzICJleGVjKGJvZHksICcKKyAgICAgICAgICAgICAgICAgJ2dsb2JhbHMoKSxcbicKKyAgICAgICAgICAgICAgICAgJ25hbWVzcGFjZSkiLiBUaGUga2V5IGRpZmZlcmVuY2UgZnJvbSBhIG5vcm1hbCBjYWxsIHRvICcKKyAgICAgICAgICAgICAgICAgJyJleGVjKCkiIGlzIHRoYXRcbicKKyAgICAgICAgICAgICAgICAgJ2xleGljYWwgc2NvcGluZyBhbGxvd3MgdGhlIGNsYXNzIGJvZHkgKGluY2x1ZGluZyBhbnkgJworICAgICAgICAgICAgICAgICAnbWV0aG9kcykgdG9cbicKKyAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZSBuYW1lcyBmcm9tIHRoZSBjdXJyZW50IGFuZCBvdXRlciBzY29wZXMgd2hlbiB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJ2RlZmluaXRpb24gb2NjdXJzIGluc2lkZSBhIGZ1bmN0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdIb3dldmVyLCBldmVuIHdoZW4gdGhlIGNsYXNzIGRlZmluaXRpb24gb2NjdXJzIGluc2lkZSB0aGUgJworICAgICAgICAgICAgICAgICAnZnVuY3Rpb24sXG4nCisgICAgICAgICAgICAgICAgICdtZXRob2RzIGRlZmluZWQgaW5zaWRlIHRoZSBjbGFzcyBzdGlsbCBjYW5ub3Qgc2VlIG5hbWVzICcKKyAgICAgICAgICAgICAgICAgJ2RlZmluZWQgYXQgdGhlXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcyBzY29wZS4gQ2xhc3MgdmFyaWFibGVzIG11c3QgYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgJworICAgICAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAgICAgJ3BhcmFtZXRlciBvZiBpbnN0YW5jZSBvciBjbGFzcyBtZXRob2RzLCBhbmQgY2Fubm90IGJlICcKKyAgICAgICAgICAgICAgICAgJ2FjY2Vzc2VkIGF0IGFsbFxuJworICAgICAgICAgICAgICAgICAnZnJvbSBzdGF0aWMgbWV0aG9kcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdDcmVhdGluZyB0aGUgY2xhc3Mgb2JqZWN0XG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ09uY2UgdGhlIGNsYXNzIG5hbWVzcGFjZSBoYXMgYmVlbiBwb3B1bGF0ZWQgYnkgZXhlY3V0aW5nIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnYm9keSwgdGhlIGNsYXNzIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcgJworICAgICAgICAgICAgICAgICAnIm1ldGFjbGFzcyhuYW1lLCBiYXNlcyxcbicKKyAgICAgICAgICAgICAgICAgJ25hbWVzcGFjZSwgKiprd2RzKSIgKHRoZSBhZGRpdGlvbmFsIGtleXdvcmRzIHBhc3NlZCBoZXJlIGFyZSAnCisgICAgICAgICAgICAgICAgICd0aGUgc2FtZVxuJworICAgICAgICAgICAgICAgICAnYXMgdGhvc2UgcGFzc2VkIHRvICJfX3ByZXBhcmVfXyIpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGlzIGNsYXNzIG9iamVjdCBpcyB0aGUgb25lIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgICd6ZXJvLVxuJworICAgICAgICAgICAgICAgICAnYXJndW1lbnQgZm9ybSBvZiAic3VwZXIoKSIuICJfX2NsYXNzX18iIGlzIGFuIGltcGxpY2l0ICcKKyAgICAgICAgICAgICAgICAgJ2Nsb3N1cmVcbicKKyAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZSBjcmVhdGVkIGJ5IHRoZSBjb21waWxlciBpZiBhbnkgbWV0aG9kcyBpbiBhIGNsYXNzICcKKyAgICAgICAgICAgICAgICAgJ2JvZHkgcmVmZXJcbicKKyAgICAgICAgICAgICAgICAgJ3RvIGVpdGhlciAiX19jbGFzc19fIiBvciAic3VwZXIiLiBUaGlzIGFsbG93cyB0aGUgemVybyAnCisgICAgICAgICAgICAgICAgICdhcmd1bWVudCBmb3JtXG4nCisgICAgICAgICAgICAgICAgICdvZiAic3VwZXIoKSIgdG8gY29ycmVjdGx5IGlkZW50aWZ5IHRoZSBjbGFzcyBiZWluZyBkZWZpbmVkICcKKyAgICAgICAgICAgICAgICAgJ2Jhc2VkIG9uXG4nCisgICAgICAgICAgICAgICAgICdsZXhpY2FsIHNjb3BpbmcsIHdoaWxlIHRoZSBjbGFzcyBvciBpbnN0YW5jZSB0aGF0IHdhcyB1c2VkICcKKyAgICAgICAgICAgICAgICAgJ3RvIG1ha2UgdGhlXG4nCisgICAgICAgICAgICAgICAgICdjdXJyZW50IGNhbGwgaXMgaWRlbnRpZmllZCBiYXNlZCBvbiB0aGUgZmlyc3QgYXJndW1lbnQgJworICAgICAgICAgICAgICAgICAncGFzc2VkIHRvIHRoZVxuJworICAgICAgICAgICAgICAgICAnbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdBZnRlciB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGlzIHBhc3NlZCB0byB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJ2RlY29yYXRvcnMgaW5jbHVkZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gKGlmIGFueSkgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICdyZXN1bHRpbmdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdCBpcyBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGFzIHRoZSBkZWZpbmVkICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdXaGVuIGEgbmV3IGNsYXNzIGlzIGNyZWF0ZWQgYnkgInR5cGUuX19uZXdfXyIsIHRoZSBvYmplY3QgJworICAgICAgICAgICAgICAgICAncHJvdmlkZWQgYXNcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBuYW1lc3BhY2UgcGFyYW1ldGVyIGlzIGNvcGllZCB0byBhIHN0YW5kYXJkIFB5dGhvbiAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5IGFuZFxuJworICAgICAgICAgICAgICAgICAndGhlIG9yaWdpbmFsIG9iamVjdCBpcyBkaXNjYXJkZWQuIFRoZSBuZXcgY29weSBiZWNvbWVzIHRoZSAnCisgICAgICAgICAgICAgICAgICciX19kaWN0X18iXG4nCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgb2YgdGhlIGNsYXNzIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgKipQRVAgMzEzNSoqIC0gTmV3IHN1cGVyXG4nCisgICAgICAgICAgICAgICAgICcgICAgIERlc2NyaWJlcyB0aGUgaW1wbGljaXQgIl9fY2xhc3NfXyIgY2xvc3VyZSByZWZlcmVuY2VcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdNZXRhY2xhc3MgZXhhbXBsZVxuJworICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIHBvdGVudGlhbCB1c2VzIGZvciBtZXRhY2xhc3NlcyBhcmUgYm91bmRsZXNzLiBTb21lIGlkZWFzICcKKyAgICAgICAgICAgICAgICAgJ3RoYXQgaGF2ZVxuJworICAgICAgICAgICAgICAgICAnYmVlbiBleHBsb3JlZCBpbmNsdWRlIGxvZ2dpbmcsIGludGVyZmFjZSBjaGVja2luZywgJworICAgICAgICAgICAgICAgICAnYXV0b21hdGljXG4nCisgICAgICAgICAgICAgICAgICdkZWxlZ2F0aW9uLCBhdXRvbWF0aWMgcHJvcGVydHkgY3JlYXRpb24sIHByb3hpZXMsICcKKyAgICAgICAgICAgICAgICAgJ2ZyYW1ld29ya3MsIGFuZFxuJworICAgICAgICAgICAgICAgICAnYXV0b21hdGljIHJlc291cmNlIGxvY2tpbmcvc3luY2hyb25pemF0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtZXRhY2xhc3MgdGhhdCB1c2VzIGFuXG4nCisgICAgICAgICAgICAgICAgICciY29sbGVjdGlvbnMuT3JkZXJlZERpY3QiIHRvIHJlbWVtYmVyIHRoZSBvcmRlciB0aGF0IGNsYXNzICcKKyAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlc1xuJworICAgICAgICAgICAgICAgICAnYXJlIGRlZmluZWQ6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNsYXNzIE9yZGVyZWRDbGFzcyh0eXBlKTpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgIEBjbGFzc21ldGhvZFxuJworICAgICAgICAgICAgICAgICAnICAgICAgIGRlZiBfX3ByZXBhcmVfXyhtZXRhY2xzLCBuYW1lLCBiYXNlcywgKiprd2RzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0KClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSwgKiprd2RzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgcmVzdWx0ID0gdHlwZS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsICcKKyAgICAgICAgICAgICAgICAgJ2RpY3QobmFtZXNwYWNlKSlcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgcmVzdWx0Lm1lbWJlcnMgPSB0dXBsZShuYW1lc3BhY2UpXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICAgIHJldHVybiByZXN1bHRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgQShtZXRhY2xhc3M9T3JkZXJlZENsYXNzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICBkZWYgb25lKHNlbGYpOiBwYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgZGVmIHR3byhzZWxmKTogcGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgICAgIGRlZiB0aHJlZShzZWxmKTogcGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgICAgIGRlZiBmb3VyKHNlbGYpOiBwYXNzXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBBLm1lbWJlcnNcbicKKyAgICAgICAgICAgICAgICAgIiAgICgnX19tb2R1bGVfXycsICdvbmUnLCAndHdvJywgJ3RocmVlJywgJ2ZvdXInKVxuIgorICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdXaGVuIHRoZSBjbGFzcyBkZWZpbml0aW9uIGZvciAqQSogZ2V0cyBleGVjdXRlZCwgdGhlIHByb2Nlc3MgJworICAgICAgICAgICAgICAgICAnYmVnaW5zXG4nCisgICAgICAgICAgICAgICAgICd3aXRoIGNhbGxpbmcgdGhlIG1ldGFjbGFzc1wncyAiX19wcmVwYXJlX18oKSIgbWV0aG9kIHdoaWNoICcKKyAgICAgICAgICAgICAgICAgJ3JldHVybnMgYW5cbicKKyAgICAgICAgICAgICAgICAgJ2VtcHR5ICJjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCIuICBUaGF0IG1hcHBpbmcgcmVjb3JkcyB0aGUgJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyBhbmRcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMgb2YgKkEqIGFzIHRoZXkgYXJlIGRlZmluZWQgd2l0aGluIHRoZSBib2R5IG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnc3RhdGVtZW50LiBPbmNlIHRob3NlIGRlZmluaXRpb25zIGFyZSBleGVjdXRlZCwgdGhlIG9yZGVyZWQgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeVxuJworICAgICAgICAgICAgICAgICAnaXMgZnVsbHkgcG9wdWxhdGVkIGFuZCB0aGUgbWV0YWNsYXNzXCdzICJfX25ld19fKCkiIG1ldGhvZCAnCisgICAgICAgICAgICAgICAgICdnZXRzXG4nCisgICAgICAgICAgICAgICAgICdpbnZva2VkLiAgVGhhdCBtZXRob2QgYnVpbGRzIHRoZSBuZXcgdHlwZSBhbmQgaXQgc2F2ZXMgdGhlICcKKyAgICAgICAgICAgICAgICAgJ29yZGVyZWRcbicKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkga2V5cyBpbiBhbiBhdHRyaWJ1dGUgY2FsbGVkICJtZW1iZXJzIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdDdXN0b21pemluZyBpbnN0YW5jZSBhbmQgc3ViY2xhc3MgY2hlY2tzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICdiZWhhdmlvciBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyJpc2luc3RhbmNlKCkiIGFuZCAiaXNzdWJjbGFzcygpIiBidWlsdC1pbiBmdW5jdGlvbnMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0luIHBhcnRpY3VsYXIsIHRoZSBtZXRhY2xhc3MgImFiYy5BQkNNZXRhIiBpbXBsZW1lbnRzIHRoZXNlICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgaW5cbicKKyAgICAgICAgICAgICAgICAgJ29yZGVyIHRvIGFsbG93IHRoZSBhZGRpdGlvbiBvZiBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKEFCQ3MpICcKKyAgICAgICAgICAgICAgICAgJ2FzXG4nCisgICAgICAgICAgICAgICAgICcidmlydHVhbCBiYXNlIGNsYXNzZXMiIHRvIGFueSBjbGFzcyBvciB0eXBlIChpbmNsdWRpbmcgJworICAgICAgICAgICAgICAgICAnYnVpbHQtaW5cbicKKyAgICAgICAgICAgICAgICAgJ3R5cGVzKSwgaW5jbHVkaW5nIG90aGVyIEFCQ3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLl9faW5zdGFuY2VjaGVja19fKHNlbGYsIGluc3RhbmNlKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiAqaW5zdGFuY2UqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCAnCisgICAgICAgICAgICAgICAgICdvclxuJworICAgICAgICAgICAgICAgICAnICAgaW5kaXJlY3QpIGluc3RhbmNlIG9mICpjbGFzcyouIElmIGRlZmluZWQsIGNhbGxlZCB0byAnCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgJyAgICJpc2luc3RhbmNlKGluc3RhbmNlLCBjbGFzcykiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcy5fX3N1YmNsYXNzY2hlY2tfXyhzZWxmLCBzdWJjbGFzcylcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgKnN1YmNsYXNzKiBzaG91bGQgYmUgY29uc2lkZXJlZCBhIChkaXJlY3QgJworICAgICAgICAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluZGlyZWN0KSBzdWJjbGFzcyBvZiAqY2xhc3MqLiAgSWYgZGVmaW5lZCwgY2FsbGVkIHRvICcKKyAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudFxuJworICAgICAgICAgICAgICAgICAnICAgImlzc3ViY2xhc3Moc3ViY2xhc3MsIGNsYXNzKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ05vdGUgdGhhdCB0aGVzZSBtZXRob2RzIGFyZSBsb29rZWQgdXAgb24gdGhlIHR5cGUgJworICAgICAgICAgICAgICAgICAnKG1ldGFjbGFzcykgb2YgYVxuJworICAgICAgICAgICAgICAgICAnY2xhc3MuICBUaGV5IGNhbm5vdCBiZSBkZWZpbmVkIGFzIGNsYXNzIG1ldGhvZHMgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2FjdHVhbCBjbGFzcy5cbicKKyAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBsb29rdXAgb2Ygc3BlY2lhbCBtZXRob2RzIHRoYXQgJworICAgICAgICAgICAgICAgICAnYXJlIGNhbGxlZFxuJworICAgICAgICAgICAgICAgICAnb24gaW5zdGFuY2VzLCBvbmx5IGluIHRoaXMgY2FzZSB0aGUgaW5zdGFuY2UgaXMgaXRzZWxmIGEgJworICAgICAgICAgICAgICAgICAnY2xhc3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICoqUEVQIDMxMTkqKiAtIEludHJvZHVjaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3Nlc1xuJworICAgICAgICAgICAgICAgICAnICAgICBJbmNsdWRlcyB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY3VzdG9taXppbmcgJworICAgICAgICAgICAgICAgICAnImlzaW5zdGFuY2UoKSIgYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJpc3N1YmNsYXNzKCkiIGJlaGF2aW9yIHRocm91Z2ggIl9faW5zdGFuY2VjaGVja19fKCkiICcKKyAgICAgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICAgICAnICAgICAiX19zdWJjbGFzc2NoZWNrX18oKSIsIHdpdGggbW90aXZhdGlvbiBmb3IgdGhpcyAnCisgICAgICAgICAgICAgICAgICdmdW5jdGlvbmFsaXR5IGluXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHRoZSBjb250ZXh0IG9mIGFkZGluZyBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKHNlZSB0aGUgJworICAgICAgICAgICAgICAgICAnImFiYyJcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgbW9kdWxlKSB0byB0aGUgbGFuZ3VhZ2UuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRW11bGF0aW5nIGNhbGxhYmxlIG9iamVjdHNcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2NhbGxfXyhzZWxmWywgYXJncy4uLl0pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyAiY2FsbGVkIiBhcyBhIGZ1bmN0aW9uOyBpZiAnCisgICAgICAgICAgICAgICAgICd0aGlzIG1ldGhvZFxuJworICAgICAgICAgICAgICAgICAnICAgaXMgZGVmaW5lZCwgIngoYXJnMSwgYXJnMiwgLi4uKSIgaXMgYSBzaG9ydGhhbmQgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICAieC5fX2NhbGxfXyhhcmcxLCBhcmcyLCAuLi4pIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdFbXVsYXRpbmcgY29udGFpbmVyIHR5cGVzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBpbXBsZW1lbnQgY29udGFpbmVyICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICdDb250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpICcKKyAgICAgICAgICAgICAgICAgJ29yIG1hcHBpbmdzXG4nCisgICAgICAgICAgICAgICAgICcobGlrZSBkaWN0aW9uYXJpZXMpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzIGFzICcKKyAgICAgICAgICAgICAgICAgJ3dlbGwuICBUaGVcbicKKyAgICAgICAgICAgICAgICAgJ2ZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSBvciAnCisgICAgICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICAgICAnZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEgc2VxdWVuY2UsICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoICIwIDw9IGsgJworICAgICAgICAgICAgICAgICAnPCBOIiB3aGVyZVxuJworICAgICAgICAgICAgICAgICAnKk4qIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLCBvciBzbGljZSBvYmplY3RzLCB3aGljaCAnCisgICAgICAgICAgICAgICAgICdkZWZpbmUgYVxuJworICAgICAgICAgICAgICAgICAncmFuZ2Ugb2YgaXRlbXMuICBJdCBpcyBhbHNvIHJlY29tbWVuZGVkIHRoYXQgbWFwcGluZ3MgJworICAgICAgICAgICAgICAgICAncHJvdmlkZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgImtleXMoKSIsICJ2YWx1ZXMoKSIsICJpdGVtcygpIiwgImdldCgpIiwgJworICAgICAgICAgICAgICAgICAnImNsZWFyKCkiLFxuJworICAgICAgICAgICAgICAgICAnInNldGRlZmF1bHQoKSIsICJwb3AoKSIsICJwb3BpdGVtKCkiLCAiY29weSgpIiwgYW5kICcKKyAgICAgICAgICAgICAgICAgJyJ1cGRhdGUoKSJcbicKKyAgICAgICAgICAgICAgICAgImJlaGF2aW5nIHNpbWlsYXIgdG8gdGhvc2UgZm9yIFB5dGhvbidzIHN0YW5kYXJkIGRpY3Rpb25hcnkgIgorICAgICAgICAgICAgICAgICAnb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgJ1RoZSAiY29sbGVjdGlvbnMiIG1vZHVsZSBwcm92aWRlcyBhICJNdXRhYmxlTWFwcGluZyIgJworICAgICAgICAgICAgICAgICAnYWJzdHJhY3QgYmFzZVxuJworICAgICAgICAgICAgICAgICAnY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2YgJworICAgICAgICAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiLFxuJworICAgICAgICAgICAgICAgICAnIl9fc2V0aXRlbV9fKCkiLCAiX19kZWxpdGVtX18oKSIsIGFuZCAia2V5cygpIi4gTXV0YWJsZSAnCisgICAgICAgICAgICAgICAgICdzZXF1ZW5jZXNcbicKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZCBwcm92aWRlIG1ldGhvZHMgImFwcGVuZCgpIiwgImNvdW50KCkiLCAiaW5kZXgoKSIsICcKKyAgICAgICAgICAgICAgICAgJyJleHRlbmQoKSIsXG4nCisgICAgICAgICAgICAgICAgICciaW5zZXJ0KCkiLCAicG9wKCkiLCAicmVtb3ZlKCkiLCAicmV2ZXJzZSgpIiBhbmQgInNvcnQoKSIsICcKKyAgICAgICAgICAgICAgICAgJ2xpa2UgUHl0aG9uXG4nCisgICAgICAgICAgICAgICAgICdzdGFuZGFyZCBsaXN0IG9iamVjdHMuICBGaW5hbGx5LCBzZXF1ZW5jZSB0eXBlcyBzaG91bGQgJworICAgICAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICdhZGRpdGlvbiAobWVhbmluZyBjb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gJworICAgICAgICAgICAgICAgICAnKG1lYW5pbmdcbicKKyAgICAgICAgICAgICAgICAgJ3JlcGV0aXRpb24pIGJ5IGRlZmluaW5nIHRoZSBtZXRob2RzICJfX2FkZF9fKCkiLCAnCisgICAgICAgICAgICAgICAgICciX19yYWRkX18oKSIsXG4nCisgICAgICAgICAgICAgICAgICciX19pYWRkX18oKSIsICJfX211bF9fKCkiLCAiX19ybXVsX18oKSIgYW5kICJfX2ltdWxfXygpIiAnCisgICAgICAgICAgICAgICAgICdkZXNjcmliZWRcbicKKyAgICAgICAgICAgICAgICAgJ2JlbG93OyB0aGV5IHNob3VsZCBub3QgZGVmaW5lIG90aGVyIG51bWVyaWNhbCBvcGVyYXRvcnMuICBJdCAnCisgICAgICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICAgICAncmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZVxuJworICAgICAgICAgICAgICAgICAnIl9fY29udGFpbnNfXygpIiBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgImluIiAnCisgICAgICAgICAgICAgICAgICdvcGVyYXRvcjtcbicKKyAgICAgICAgICAgICAgICAgJ2ZvciBtYXBwaW5ncywgImluIiBzaG91bGQgc2VhcmNoIHRoZSBtYXBwaW5nXCdzIGtleXM7IGZvciAnCisgICAgICAgICAgICAgICAgICdzZXF1ZW5jZXMsIGl0XG4nCisgICAgICAgICAgICAgICAgICdzaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlIHZhbHVlcy4gIEl0IGlzIGZ1cnRoZXIgcmVjb21tZW5kZWQgJworICAgICAgICAgICAgICAgICAndGhhdCBib3RoXG4nCisgICAgICAgICAgICAgICAgICdtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGUgIl9faXRlcl9fKCkiIG1ldGhvZCB0byAnCisgICAgICAgICAgICAgICAgICdhbGxvd1xuJworICAgICAgICAgICAgICAgICAnZWZmaWNpZW50IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBjb250YWluZXI7IGZvciBtYXBwaW5ncywgJworICAgICAgICAgICAgICAgICAnIl9faXRlcl9fKCkiXG4nCisgICAgICAgICAgICAgICAgICdzaG91bGQgYmUgdGhlIHNhbWUgYXMgImtleXMoKSI7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCAnCisgICAgICAgICAgICAgICAgICdpdGVyYXRlXG4nCisgICAgICAgICAgICAgICAgICd0aHJvdWdoIHRoZSB2YWx1ZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xlbl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIuICAnCisgICAgICAgICAgICAgICAgICdTaG91bGQgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QsIGFuIGludGVnZXIgIj49IiAwLiAgQWxzbywgYW4gJworICAgICAgICAgICAgICAgICAnb2JqZWN0IHRoYXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRvZXNuXCd0IGRlZmluZSBhICJfX2Jvb2xfXygpIiBtZXRob2QgYW5kIHdob3NlICcKKyAgICAgICAgICAgICAgICAgJyJfX2xlbl9fKCkiIG1ldGhvZFxuJworICAgICAgICAgICAgICAgICAnICAgcmV0dXJucyB6ZXJvIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgaW4gYSBCb29sZWFuICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRleHQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xlbmd0aF9oaW50X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IubGVuZ3RoX2hpbnQoKSIuIFNob3VsZCAnCisgICAgICAgICAgICAgICAgICdyZXR1cm4gYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIGVzdGltYXRlZCBsZW5ndGggZm9yIHRoZSBvYmplY3QgKHdoaWNoIG1heSBiZSBncmVhdGVyIG9yICcKKyAgICAgICAgICAgICAgICAgJ2xlc3MgdGhhblxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIGFjdHVhbCBsZW5ndGgpLiBUaGUgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciAiPj0iIDAuICcKKyAgICAgICAgICAgICAgICAgJ1RoaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCBpcyBwdXJlbHkgYW4gb3B0aW1pemF0aW9uIGFuZCBpcyBuZXZlciByZXF1aXJlZCAnCisgICAgICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvcnJlY3RuZXNzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ05vdGU6IFNsaWNpbmcgaXMgZG9uZSBleGNsdXNpdmVseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGhyZWUgJworICAgICAgICAgICAgICAgICAnbWV0aG9kcy5cbicKKyAgICAgICAgICAgICAgICAgJyAgQSBjYWxsIGxpa2VcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICBhWzE6Ml0gPSBiXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgaXMgdHJhbnNsYXRlZCB0b1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGFbc2xpY2UoMSwgMiwgTm9uZSldID0gYlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgIGFuZCBzbyBmb3J0aC4gIE1pc3Npbmcgc2xpY2UgaXRlbXMgYXJlIGFsd2F5cyBmaWxsZWQgaW4gJworICAgICAgICAgICAgICAgICAnd2l0aCAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiAic2VsZltrZXldIi4gRm9yICcKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlIHR5cGVzLFxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzIGFuZCBzbGljZSBvYmplY3RzLiAgJworICAgICAgICAgICAgICAgICAnTm90ZSB0aGF0XG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3Mgd2lzaGVzXG4nCisgICAgICAgICAgICAgICAgICcgICB0byBlbXVsYXRlIGEgc2VxdWVuY2UgdHlwZSkgaXMgdXAgdG8gdGhlICJfX2dldGl0ZW1fXygpIiAnCisgICAgICAgICAgICAgICAgICdtZXRob2QuIElmXG4nCisgICAgICAgICAgICAgICAgICcgICAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsICJUeXBlRXJyb3IiIG1heSBiZSAnCisgICAgICAgICAgICAgICAgICdyYWlzZWQ7IGlmIG9mXG4nCisgICAgICAgICAgICAgICAgICcgICBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZiBpbmRleGVzIGZvciB0aGUgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAnKGFmdGVyIGFueVxuJworICAgICAgICAgICAgICAgICAnICAgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSB2YWx1ZXMpLCAiSW5kZXhFcnJvciIgJworICAgICAgICAgICAgICAgICAnc2hvdWxkIGJlXG4nCisgICAgICAgICAgICAgICAgICcgICByYWlzZWQuIEZvciBtYXBwaW5nIHR5cGVzLCBpZiAqa2V5KiBpcyBtaXNzaW5nIChub3QgaW4gJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBjb250YWluZXIpLCAiS2V5RXJyb3IiIHNob3VsZCBiZSByYWlzZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGU6ICJmb3IiIGxvb3BzIGV4cGVjdCB0aGF0IGFuICJJbmRleEVycm9yIiB3aWxsIGJlICcKKyAgICAgICAgICAgICAgICAgJ3JhaXNlZCBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX21pc3NpbmdfXyhzZWxmLCBrZXkpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSAiZGljdCIuIl9fZ2V0aXRlbV9fKCkiIHRvIGltcGxlbWVudCAic2VsZltrZXldIiAnCisgICAgICAgICAgICAgICAgICdmb3IgZGljdFxuJworICAgICAgICAgICAgICAgICAnICAgc3ViY2xhc3NlcyB3aGVuIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gInNlbGZba2V5XSIuICBTYW1lIG5vdGUgJworICAgICAgICAgICAgICAgICAnYXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciAnCisgICAgICAgICAgICAgICAgICdtYXBwaW5ncyBpZlxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmICcKKyAgICAgICAgICAgICAgICAgJ25ldyBrZXlzXG4nCisgICAgICAgICAgICAgICAgICcgICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlICcKKyAgICAgICAgICAgICAgICAgJ3JlcGxhY2VkLiAgVGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogJworICAgICAgICAgICAgICAgICAndmFsdWVzIGFzIGZvclxuJworICAgICAgICAgICAgICAgICAnICAgdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgInNlbGZba2V5XSIuICBTYW1lIG5vdGUgJworICAgICAgICAgICAgICAgICAnYXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciAnCisgICAgICAgICAgICAgICAgICdtYXBwaW5ncyBpZlxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgJworICAgICAgICAgICAgICAgICAnZWxlbWVudHNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcXVlbmNlLiAgVGhlIHNhbWUgZXhjZXB0aW9ucyAnCisgICAgICAgICAgICAgICAgICdzaG91bGQgYmVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgJworICAgICAgICAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXRlcl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGl0ZXJhdG9yIGlzIHJlcXVpcmVkIGZvciBhICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lci5cbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQgY2FuICcKKyAgICAgICAgICAgICAgICAgJ2l0ZXJhdGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0ICcKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZFxuJworICAgICAgICAgICAgICAgICAnICAgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEl0ZXJhdG9yIG9iamVjdHMgYWxzbyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZDsgdGhleSAnCisgICAgICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gJworICAgICAgICAgICAgICAgICAnaXRlcmF0b3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdHMsIHNlZSBJdGVyYXRvciBUeXBlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmV2ZXJzZWRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgKGlmIHByZXNlbnQpIGJ5IHRoZSAicmV2ZXJzZWQoKSIgYnVpbHQtaW4gdG8gJworICAgICAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICcgICByZXZlcnNlIGl0ZXJhdGlvbi4gIEl0IHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3IgJworICAgICAgICAgICAgICAgICAnb2JqZWN0IHRoYXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gcmV2ZXJzZSAnCisgICAgICAgICAgICAgICAgICdvcmRlci5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgdGhlICJfX3JldmVyc2VkX18oKSIgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdGhlICcKKyAgICAgICAgICAgICAgICAgJyJyZXZlcnNlZCgpIlxuJworICAgICAgICAgICAgICAgICAnICAgYnVpbHQtaW4gd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIHNlcXVlbmNlIHByb3RvY29sICcKKyAgICAgICAgICAgICAgICAgJygiX19sZW5fXygpIlxuJworICAgICAgICAgICAgICAgICAnICAgYW5kICJfX2dldGl0ZW1fXygpIikuICBPYmplY3RzIHRoYXQgc3VwcG9ydCB0aGUgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAncHJvdG9jb2xcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBvbmx5IHByb3ZpZGUgIl9fcmV2ZXJzZWRfXygpIiBpZiB0aGV5IGNhbiBwcm92aWRlICcKKyAgICAgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgICAgICcgICBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIG9uZSAnCisgICAgICAgICAgICAgICAgICdwcm92aWRlZCBieVxuJworICAgICAgICAgICAgICAgICAnICAgInJldmVyc2VkKCkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoImluIiBhbmQgIm5vdCBpbiIpIGFyZSAnCisgICAgICAgICAgICAgICAgICdub3JtYWxseVxuJworICAgICAgICAgICAgICAgICAnaW1wbGVtZW50ZWQgYXMgYW4gaXRlcmF0aW9uIHRocm91Z2ggYSBzZXF1ZW5jZS4gIEhvd2V2ZXIsICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lclxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0cyBjYW4gc3VwcGx5IHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBtZXRob2Qgd2l0aCBhIG1vcmUgJworICAgICAgICAgICAgICAgICAnZWZmaWNpZW50XG4nCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBkb2VzIG5vdCByZXF1aXJlIHRoZSBvYmplY3QgYmUgYSAnCisgICAgICAgICAgICAgICAgICdzZXF1ZW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fY29udGFpbnNfXyhzZWxmLCBpdGVtKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgJworICAgICAgICAgICAgICAgICAncmV0dXJuIHRydWVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGlmICppdGVtKiBpcyBpbiAqc2VsZiosIGZhbHNlIG90aGVyd2lzZS4gIEZvciBtYXBwaW5nICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdHMsIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBjb25zaWRlciB0aGUga2V5cyBvZiB0aGUgbWFwcGluZyByYXRoZXIgdGhhbiB0aGUgJworICAgICAgICAgICAgICAgICAndmFsdWVzIG9yXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUga2V5LWl0ZW0gcGFpcnMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEZvciBvYmplY3RzIHRoYXQgZG9uXCd0IGRlZmluZSAiX19jb250YWluc19fKCkiLCB0aGUgJworICAgICAgICAgICAgICAgICAnbWVtYmVyc2hpcCB0ZXN0XG4nCisgICAgICAgICAgICAgICAgICcgICBmaXJzdCB0cmllcyBpdGVyYXRpb24gdmlhICJfX2l0ZXJfXygpIiwgdGhlbiB0aGUgb2xkICcKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgICAgICcgICBpdGVyYXRpb24gcHJvdG9jb2wgdmlhICJfX2dldGl0ZW1fXygpIiwgc2VlIHRoaXMgc2VjdGlvbiAnCisgICAgICAgICAgICAgICAgICdpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGxhbmd1YWdlIHJlZmVyZW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdFbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuJworICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyAnCisgICAgICAgICAgICAgICAgICdvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAnTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCAnCisgICAgICAgICAgICAgICAgICdieSB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ3BhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2UgJworICAgICAgICAgICAgICAgICAnb3BlcmF0aW9ucyBmb3JcbicKKyAgICAgICAgICAgICAgICAgJ25vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSAnCisgICAgICAgICAgICAgICAgICdhcml0aG1ldGljXG4nCisgICAgICAgICAgICAgICAgICcgICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAnCisgICAgICAgICAgICAgICAgICciZGl2bW9kKCkiLFxuJworICAgICAgICAgICAgICAgICAnICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8IikuICBGb3IgaW5zdGFuY2UsICcKKyAgICAgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgICAgICcgICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAnb2YgYVxuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgdGhhdCBoYXMgYW4gIl9fYWRkX18oKSIgbWV0aG9kLCAieC5fX2FkZF9fKHkpIiBpcyAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQuXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGUgIl9fZGl2bW9kX18oKSIgbWV0aG9kIHNob3VsZCBiZSB0aGUgZXF1aXZhbGVudCB0byAnCisgICAgICAgICAgICAgICAgICd1c2luZ1xuJworICAgICAgICAgICAgICAgICAnICAgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgJworICAgICAgICAgICAgICAgICAncmVsYXRlZCB0b1xuJworICAgICAgICAgICAgICAgICAnICAgIl9fdHJ1ZWRpdl9fKCkiLiAgTm90ZSB0aGF0ICJfX3Bvd19fKCkiIHNob3VsZCBiZSBkZWZpbmVkICcKKyAgICAgICAgICAgICAgICAgJ3RvIGFjY2VwdFxuJworICAgICAgICAgICAgICAgICAnICAgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgaWYgdGhlIHRlcm5hcnkgdmVyc2lvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICAnYnVpbHQtaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gJworICAgICAgICAgICAgICAgICAnd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiAiTm90SW1wbGVtZW50ZWQiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yYWRkX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybWF0bXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yb3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5ICcKKyAgICAgICAgICAgICAgICAgJ2FyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICcKKyAgICAgICAgICAgICAgICAgJyJkaXZtb2QoKSIsXG4nCisgICAgICAgICAgICAgICAgICcgICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKSB3aXRoIHJlZmxlY3RlZCAnCisgICAgICAgICAgICAgICAgICcoc3dhcHBlZClcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCAnCisgICAgICAgICAgICAgICAgICdvcGVyYW5kIGRvZXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmQgdGhlIG9wZXJhbmRzICcKKyAgICAgICAgICAgICAgICAgJ2FyZSBvZlxuJworICAgICAgICAgICAgICAgICAnICAgZGlmZmVyZW50IHR5cGVzLiBbMl0gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgJworICAgICAgICAgICAgICAgICAnZXhwcmVzc2lvbiAieCAtXG4nCisgICAgICAgICAgICAgICAgICcgICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gJworICAgICAgICAgICAgICAgICAnIl9fcnN1Yl9fKCkiXG4nCisgICAgICAgICAgICAgICAgICcgICBtZXRob2QsICJ5Ll9fcnN1Yl9fKHgpIiBpcyBjYWxsZWQgaWYgInguX19zdWJfXyh5KSIgJworICAgICAgICAgICAgICAgICAncmV0dXJuc1xuJworICAgICAgICAgICAgICAgICAnICAgKk5vdEltcGxlbWVudGVkKi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAnCisgICAgICAgICAgICAgICAgICciX19ycG93X18oKSIgKHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbyBjb21wbGljYXRlZCkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgIiAgIE5vdGU6IElmIHRoZSByaWdodCBvcGVyYW5kJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICdsZWZ0XG4nCisgICAgICAgICAgICAgICAgICIgICAgIG9wZXJhbmQncyB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIHRoZSByZWZsZWN0ZWQgIgorICAgICAgICAgICAgICAgICAnbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGZvciB0aGUgb3BlcmF0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgJworICAgICAgICAgICAgICAgICAndGhlIGxlZnRcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgb3BlcmFuZCdzIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3MgIgorICAgICAgICAgICAgICAgICAnc3ViY2xhc3Nlc1xuJworICAgICAgICAgICAgICAgICAiICAgICB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnMnIG9wZXJhdGlvbnMuXG4iCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ltdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ltYXRtdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19peG9yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYXVnbWVudGVkICcKKyAgICAgICAgICAgICAgICAgJ2FyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFzc2lnbm1lbnRzICgiKz0iLCAiLT0iLCAiKj0iLCAiQD0iLCAiLz0iLCAiLy89IiwgIiU9IiwgJworICAgICAgICAgICAgICAgICAnIioqPSIsXG4nCisgICAgICAgICAgICAgICAgICcgICAiPDw9IiwgIj4+PSIsICImPSIsICJePSIsICJ8PSIpLiAgVGhlc2UgbWV0aG9kcyBzaG91bGQgJworICAgICAgICAgICAgICAgICAnYXR0ZW1wdCB0b1xuJworICAgICAgICAgICAgICAgICAnICAgZG8gdGhlIG9wZXJhdGlvbiBpbi1wbGFjZSAobW9kaWZ5aW5nICpzZWxmKikgYW5kIHJldHVybiAnCisgICAgICAgICAgICAgICAgICd0aGUgcmVzdWx0XG4nCisgICAgICAgICAgICAgICAgICcgICAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLCAqc2VsZiopLiAgSWYgYSAnCisgICAgICAgICAgICAgICAgICdzcGVjaWZpY1xuJworICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkIGFzc2lnbm1lbnQgZmFsbHMgJworICAgICAgICAgICAgICAgICAnYmFjayB0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5vcm1hbCBtZXRob2RzLiAgRm9yIGluc3RhbmNlLCBpZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgd2l0aCBhbiAiX19pYWRkX18oKSIgbWV0aG9kLCAieCArPSB5IiBpcyBlcXVpdmFsZW50IHRvICJ4ICcKKyAgICAgICAgICAgICAgICAgJz1cbicKKyAgICAgICAgICAgICAgICAgJyAgIHguX19pYWRkX18oeSkiIC4gT3RoZXJ3aXNlLCAieC5fX2FkZF9fKHkpIiBhbmQgJworICAgICAgICAgICAgICAgICAnInkuX19yYWRkX18oeCkiIGFyZVxuJworICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiAieCArIHkiLiBJbiAnCisgICAgICAgICAgICAgICAgICdjZXJ0YWluXG4nCisgICAgICAgICAgICAgICAgICcgICBzaXR1YXRpb25zLCBhdWdtZW50ZWQgYXNzaWdubWVudCBjYW4gcmVzdWx0IGluIHVuZXhwZWN0ZWQgJworICAgICAgICAgICAgICAgICAnZXJyb3JzXG4nCisgICAgICAgICAgICAgICAgICIgICAoc2VlIFdoeSBkb2VzIGFfdHVwbGVbaV0gKz0gWydpdGVtJ10gcmFpc2UgYW4gZXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgJ3doZW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBhZGRpdGlvbiB3b3Jrcz8pLCBidXQgdGhpcyBiZWhhdmlvciBpcyBpbiBmYWN0IHBhcnQgb2YgJworICAgICAgICAgICAgICAgICAndGhlIGRhdGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1vZGVsLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19uZWdfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcG9zX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Fic19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbnZlcnRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgKCItIiwgJworICAgICAgICAgICAgICAgICAnIisiLFxuJworICAgICAgICAgICAgICAgICAnICAgImFicygpIiBhbmQgIn4iKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fY29tcGxleF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbnRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZmxvYXRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcm91bmRfXyhzZWxmWywgbl0pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiY29tcGxleCgpIiwgJworICAgICAgICAgICAgICAgICAnImludCgpIixcbicKKyAgICAgICAgICAgICAgICAgJyAgICJmbG9hdCgpIiBhbmQgInJvdW5kKCkiLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZVxuJworICAgICAgICAgICAgICAgICAnICAgdHlwZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW5kZXhfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5pbmRleCgpIiwgYW5kIHdoZW5ldmVyICcKKyAgICAgICAgICAgICAgICAgJ1B5dGhvbiBuZWVkc1xuJworICAgICAgICAgICAgICAgICAnICAgdG8gbG9zc2xlc3NseSBjb252ZXJ0IHRoZSBudW1lcmljIG9iamVjdCB0byBhbiBpbnRlZ2VyICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdCAoc3VjaFxuJworICAgICAgICAgICAgICAgICAnICAgYXMgaW4gc2xpY2luZywgb3IgaW4gdGhlIGJ1aWx0LWluICJiaW4oKSIsICJoZXgoKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgJyJvY3QoKSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGZ1bmN0aW9ucykuIFByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGluZGljYXRlcyB0aGF0IHRoZSAnCisgICAgICAgICAgICAgICAgICdudW1lcmljXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3QgaXMgYW4gaW50ZWdlciB0eXBlLiAgTXVzdCByZXR1cm4gYW4gaW50ZWdlci5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZTogSW4gb3JkZXIgdG8gaGF2ZSBhIGNvaGVyZW50IGludGVnZXIgdHlwZSBjbGFzcywgJworICAgICAgICAgICAgICAgICAnd2hlblxuJworICAgICAgICAgICAgICAgICAnICAgICAiX19pbmRleF9fKCkiIGlzIGRlZmluZWQgIl9faW50X18oKSIgc2hvdWxkIGFsc28gYmUgJworICAgICAgICAgICAgICAgICAnZGVmaW5lZCwgYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGJvdGggc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdXaXRoIFN0YXRlbWVudCBDb250ZXh0IE1hbmFnZXJzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0EgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSAnCisgICAgICAgICAgICAgICAgICdjb250ZXh0IHRvXG4nCisgICAgICAgICAgICAgICAgICdiZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhICJ3aXRoIiBzdGF0ZW1lbnQuIFRoZSAnCisgICAgICAgICAgICAgICAgICdjb250ZXh0IG1hbmFnZXJcbicKKyAgICAgICAgICAgICAgICAgJ2hhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCAnCisgICAgICAgICAgICAgICAgICdydW50aW1lIGNvbnRleHRcbicKKyAgICAgICAgICAgICAgICAgJ2ZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyAnCisgICAgICAgICAgICAgICAgICdhcmUgbm9ybWFsbHlcbicKKyAgICAgICAgICAgICAgICAgJ2ludm9rZWQgdXNpbmcgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uIFRoZSAnCisgICAgICAgICAgICAgICAgICd3aXRoXG4nCisgICAgICAgICAgICAgICAgICdzdGF0ZW1lbnQpLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpciAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUeXBpY2FsIHVzZXMgb2YgY29udGV4dCBtYW5hZ2VycyBpbmNsdWRlIHNhdmluZyBhbmQgJworICAgICAgICAgICAgICAgICAncmVzdG9yaW5nIHZhcmlvdXNcbicKKyAgICAgICAgICAgICAgICAgJ2tpbmRzIG9mIGdsb2JhbCBzdGF0ZSwgbG9ja2luZyBhbmQgdW5sb2NraW5nIHJlc291cmNlcywgJworICAgICAgICAgICAgICAgICAnY2xvc2luZyBvcGVuZWRcbicKKyAgICAgICAgICAgICAgICAgJ2ZpbGVzLCBldGMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRleHQgbWFuYWdlcnMsIHNlZSBDb250ZXh0ICcKKyAgICAgICAgICAgICAgICAgJ01hbmFnZXIgVHlwZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2VudGVyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgJworICAgICAgICAgICAgICAgICAnIndpdGgiXG4nCisgICAgICAgICAgICAgICAgICIgICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSAiCisgICAgICAgICAgICAgICAgICd0YXJnZXQocylcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNwZWNpZmllZCBpbiB0aGUgImFzIiBjbGF1c2Ugb2YgdGhlIHN0YXRlbWVudCwgaWYgYW55LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICcKKyAgICAgICAgICAgICAgICAgJ3BhcmFtZXRlcnNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlc2NyaWJlIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgJworICAgICAgICAgICAgICAgICAnZXhpdGVkLiBJZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvbnRleHQgd2FzIGV4aXRlZCB3aXRob3V0IGFuIGV4Y2VwdGlvbiwgYWxsIHRocmVlICcKKyAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50cyB3aWxsXG4nCisgICAgICAgICAgICAgICAgICcgICBiZSAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIGFuIGV4Y2VwdGlvbiBpcyBzdXBwbGllZCwgYW5kIHRoZSBtZXRob2Qgd2lzaGVzIHRvICcKKyAgICAgICAgICAgICAgICAgJ3N1cHByZXNzIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgZXhjZXB0aW9uIChpLmUuLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvcGFnYXRlZCksIGl0ICcKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZFxuJworICAgICAgICAgICAgICAgICAnICAgcmV0dXJuIGEgdHJ1ZSB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgJworICAgICAgICAgICAgICAgICAncHJvY2Vzc2VkXG4nCisgICAgICAgICAgICAgICAgICcgICBub3JtYWxseSB1cG9uIGV4aXQgZnJvbSB0aGlzIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0ICJfX2V4aXRfXygpIiBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgJworICAgICAgICAgICAgICAgICAncGFzc2VkLWluXG4nCisgICAgICAgICAgICAgICAgICIgICBleGNlcHRpb247IHRoaXMgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5LlxuIgorICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgICAgICcgICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSAnCisgICAgICAgICAgICAgICAgICdQeXRob24gIndpdGgiXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdTcGVjaWFsIG1ldGhvZCBsb29rdXBcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdGb3IgY3VzdG9tIGNsYXNzZXMsIGltcGxpY2l0IGludm9jYXRpb25zIG9mIHNwZWNpYWwgbWV0aG9kcyAnCisgICAgICAgICAgICAgICAgICdhcmUgb25seVxuJworICAgICAgICAgICAgICAgICAiZ3VhcmFudGVlZCB0byB3b3JrIGNvcnJlY3RseSBpZiBkZWZpbmVkIG9uIGFuIG9iamVjdCdzIHR5cGUsICIKKyAgICAgICAgICAgICAgICAgJ25vdCBpblxuJworICAgICAgICAgICAgICAgICAidGhlIG9iamVjdCdzIGluc3RhbmNlIGRpY3Rpb25hcnkuICBUaGF0IGJlaGF2aW91ciBpcyB0aGUgIgorICAgICAgICAgICAgICAgICAncmVhc29uIHdoeVxuJworICAgICAgICAgICAgICAgICAndGhlIGZvbGxvd2luZyBjb2RlIHJhaXNlcyBhbiBleGNlcHRpb246XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBDOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBwYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjID0gQygpXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gYy5fX2xlbl9fID0gbGFtYmRhOiA1XG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gbGVuKGMpXG4nCisgICAgICAgICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4nCisgICAgICAgICAgICAgICAgICIgICBUeXBlRXJyb3I6IG9iamVjdCBvZiB0eXBlICdDJyBoYXMgbm8gbGVuKClcbiIKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcyBiZWhhdmlvdXIgbGllcyB3aXRoIGEgbnVtYmVyIG9mICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpYWxcbicKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgc3VjaCBhcyAiX19oYXNoX18oKSIgYW5kICJfX3JlcHJfXygpIiB0aGF0IGFyZSAnCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRlZCBieVxuJworICAgICAgICAgICAgICAgICAnYWxsIG9iamVjdHMsIGluY2x1ZGluZyB0eXBlIG9iamVjdHMuIElmIHRoZSBpbXBsaWNpdCBsb29rdXAgJworICAgICAgICAgICAgICAgICAnb2YgdGhlc2VcbicKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgdXNlZCB0aGUgY29udmVudGlvbmFsIGxvb2t1cCBwcm9jZXNzLCB0aGV5IHdvdWxkICcKKyAgICAgICAgICAgICAgICAgJ2ZhaWwgd2hlblxuJworICAgICAgICAgICAgICAgICAnaW52b2tlZCBvbiB0aGUgdHlwZSBvYmplY3QgaXRzZWxmOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gMSAuX19oYXNoX18oKSA9PSBoYXNoKDEpXG4nCisgICAgICAgICAgICAgICAgICcgICBUcnVlXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gaW50Ll9faGFzaF9fKCkgPT0gaGFzaChpbnQpXG4nCisgICAgICAgICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4nCisgICAgICAgICAgICAgICAgICIgICBUeXBlRXJyb3I6IGRlc2NyaXB0b3IgJ19faGFzaF9fJyBvZiAnaW50JyBvYmplY3QgbmVlZHMgYW4gIgorICAgICAgICAgICAgICAgICAnYXJndW1lbnRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSW5jb3JyZWN0bHkgYXR0ZW1wdGluZyB0byBpbnZva2UgYW4gdW5ib3VuZCBtZXRob2Qgb2YgYSAnCisgICAgICAgICAgICAgICAgICdjbGFzcyBpbiB0aGlzXG4nCisgICAgICAgICAgICAgICAgICJ3YXkgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzICdtZXRhY2xhc3MgY29uZnVzaW9uJywgYW5kICIKKyAgICAgICAgICAgICAgICAgJ2lzIGF2b2lkZWRcbicKKyAgICAgICAgICAgICAgICAgJ2J5IGJ5cGFzc2luZyB0aGUgaW5zdGFuY2Ugd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kczpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+IHR5cGUoMSkuX19oYXNoX18oMSkgPT0gaGFzaCgxKVxuJworICAgICAgICAgICAgICAgICAnICAgVHJ1ZVxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IHR5cGUoaW50KS5fX2hhc2hfXyhpbnQpID09IGhhc2goaW50KVxuJworICAgICAgICAgICAgICAgICAnICAgVHJ1ZVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJbiBhZGRpdGlvbiB0byBieXBhc3NpbmcgYW55IGluc3RhbmNlIGF0dHJpYnV0ZXMgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2ludGVyZXN0IG9mXG4nCisgICAgICAgICAgICAgICAgICdjb3JyZWN0bmVzcywgaW1wbGljaXQgc3BlY2lhbCBtZXRob2QgbG9va3VwIGdlbmVyYWxseSBhbHNvICcKKyAgICAgICAgICAgICAgICAgJ2J5cGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICd0aGUgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGV2ZW4gb2YgdGhlIG9iamVjdFwncyAnCisgICAgICAgICAgICAgICAgICdtZXRhY2xhc3M6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBNZXRhKHR5cGUpOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXygqYXJncyk6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgICAgICBwcmludCgiTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIilcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIHJldHVybiB0eXBlLl9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpXG4nCisgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBDKG9iamVjdCwgbWV0YWNsYXNzPU1ldGEpOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19sZW5fXyhzZWxmKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIHJldHVybiAxMFxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXygqYXJncyk6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgICAgICBwcmludCgiQ2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQiKVxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKCphcmdzKVxuJworICAgICAgICAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gYyA9IEMoKVxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGMuX19sZW5fXygpICAgICAgICAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAgICAgJyAgIENsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4nCisgICAgICAgICAgICAgICAgICcgICAxMFxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IHR5cGUoYykuX19sZW5fXyhjKSAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgJworICAgICAgICAgICAgICAgICAndHlwZVxuJworICAgICAgICAgICAgICAgICAnICAgTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4nCisgICAgICAgICAgICAgICAgICcgICAxMFxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGxlbihjKSAgICAgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0IGxvb2t1cFxuJworICAgICAgICAgICAgICAgICAnICAgMTBcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQnlwYXNzaW5nIHRoZSAiX19nZXRhdHRyaWJ1dGVfXygpIiBtYWNoaW5lcnkgaW4gdGhpcyBmYXNoaW9uICcKKyAgICAgICAgICAgICAgICAgJ3Byb3ZpZGVzXG4nCisgICAgICAgICAgICAgICAgICdzaWduaWZpY2FudCBzY29wZSBmb3Igc3BlZWQgb3B0aW1pc2F0aW9ucyB3aXRoaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2ludGVycHJldGVyLCBhdFxuJworICAgICAgICAgICAgICAgICAndGhlIGNvc3Qgb2Ygc29tZSBmbGV4aWJpbGl0eSBpbiB0aGUgaGFuZGxpbmcgb2Ygc3BlY2lhbCAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzICh0aGVcbicKKyAgICAgICAgICAgICAgICAgJ3NwZWNpYWwgbWV0aG9kICptdXN0KiBiZSBzZXQgb24gdGhlIGNsYXNzIG9iamVjdCBpdHNlbGYgaW4gJworICAgICAgICAgICAgICAgICAnb3JkZXIgdG8gYmVcbicKKyAgICAgICAgICAgICAgICAgJ2NvbnNpc3RlbnRseSBpbnZva2VkIGJ5IHRoZSBpbnRlcnByZXRlcikuXG4nLAorICdzdHJpbmctbWV0aG9kcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAnU3RyaW5nIE1ldGhvZHNcbicKKyAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1N0cmluZ3MgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbW9uIHNlcXVlbmNlIG9wZXJhdGlvbnMsICcKKyAgICAgICAgICAgICAgICAgICAnYWxvbmcgd2l0aFxuJworICAgICAgICAgICAgICAgICAgICd0aGUgYWRkaXRpb25hbCBtZXRob2RzIGRlc2NyaWJlZCBiZWxvdy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1N0cmluZ3MgYWxzbyBzdXBwb3J0IHR3byBzdHlsZXMgb2Ygc3RyaW5nIGZvcm1hdHRpbmcsIG9uZSAnCisgICAgICAgICAgICAgICAgICAgJ3Byb3ZpZGluZyBhXG4nCisgICAgICAgICAgICAgICAgICAgJ2xhcmdlIGRlZ3JlZSBvZiBmbGV4aWJpbGl0eSBhbmQgY3VzdG9taXphdGlvbiAoc2VlICcKKyAgICAgICAgICAgICAgICAgICAnInN0ci5mb3JtYXQoKSIsXG4nCisgICAgICAgICAgICAgICAgICAgJ0Zvcm1hdCBTdHJpbmcgU3ludGF4IGFuZCBDdXN0b20gU3RyaW5nIEZvcm1hdHRpbmcpIGFuZCB0aGUgJworICAgICAgICAgICAgICAgICAgICdvdGhlciBiYXNlZFxuJworICAgICAgICAgICAgICAgICAgICdvbiBDICJwcmludGYiIHN0eWxlIGZvcm1hdHRpbmcgdGhhdCBoYW5kbGVzIGEgbmFycm93ZXIgJworICAgICAgICAgICAgICAgICAgICdyYW5nZSBvZiB0eXBlc1xuJworICAgICAgICAgICAgICAgICAgICdhbmQgaXMgc2xpZ2h0bHkgaGFyZGVyIHRvIHVzZSBjb3JyZWN0bHksIGJ1dCBpcyBvZnRlbiAnCisgICAgICAgICAgICAgICAgICAgJ2Zhc3RlciBmb3IgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJ2Nhc2VzIGl0IGNhbiBoYW5kbGUgKHByaW50Zi1zdHlsZSBTdHJpbmcgRm9ybWF0dGluZykuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdUaGUgVGV4dCBQcm9jZXNzaW5nIFNlcnZpY2VzIHNlY3Rpb24gb2YgdGhlIHN0YW5kYXJkICcKKyAgICAgICAgICAgICAgICAgICAnbGlicmFyeSBjb3ZlcnMgYVxuJworICAgICAgICAgICAgICAgICAgICdudW1iZXIgb2Ygb3RoZXIgbW9kdWxlcyB0aGF0IHByb3ZpZGUgdmFyaW91cyB0ZXh0IHJlbGF0ZWQgJworICAgICAgICAgICAgICAgICAgICd1dGlsaXRpZXNcbicKKyAgICAgICAgICAgICAgICAgICAnKGluY2x1ZGluZyByZWd1bGFyIGV4cHJlc3Npb24gc3VwcG9ydCBpbiB0aGUgInJlIiAnCisgICAgICAgICAgICAgICAgICAgJ21vZHVsZSkuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuY2FwaXRhbGl6ZSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgY2hhcmFjdGVyICcKKyAgICAgICAgICAgICAgICAgICAnY2FwaXRhbGl6ZWRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIHRoZSByZXN0IGxvd2VyY2FzZWQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuY2FzZWZvbGQoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY2FzZWZvbGRlZCBjb3B5IG9mIHRoZSBzdHJpbmcuIENhc2Vmb2xkZWQgJworICAgICAgICAgICAgICAgICAgICdzdHJpbmdzIG1heSBiZVxuJworICAgICAgICAgICAgICAgICAgICcgICB1c2VkIGZvciBjYXNlbGVzcyBtYXRjaGluZy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhc2Vmb2xkaW5nIGlzIHNpbWlsYXIgdG8gbG93ZXJjYXNpbmcgYnV0IG1vcmUgJworICAgICAgICAgICAgICAgICAgICdhZ2dyZXNzaXZlIGJlY2F1c2VcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXQgaXMgaW50ZW5kZWQgdG8gcmVtb3ZlIGFsbCBjYXNlIGRpc3RpbmN0aW9ucyBpbiBhICcKKyAgICAgICAgICAgICAgICAgICAnc3RyaW5nLiBGb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZXhhbXBsZSwgdGhlIEdlcm1hbiBsb3dlcmNhc2UgbGV0dGVyICJcJ8OfXCciIGlzICcKKyAgICAgICAgICAgICAgICAgICAnZXF1aXZhbGVudCB0byAiInNzIiIuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFNpbmNlIGl0IGlzIGFscmVhZHkgbG93ZXJjYXNlLCAibG93ZXIoKSIgd291bGQgZG8gJworICAgICAgICAgICAgICAgICAgICdub3RoaW5nIHRvICJcJ8OfXCciO1xuJworICAgICAgICAgICAgICAgICAgICcgICAiY2FzZWZvbGQoKSIgY29udmVydHMgaXQgdG8gIiJzcyIiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhlIGNhc2Vmb2xkaW5nIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAzLjEzICcKKyAgICAgICAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFVuaWNvZGUgU3RhbmRhcmQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLiBQYWRkaW5nICcKKyAgICAgICAgICAgICAgICAgICAnaXMgZG9uZVxuJworICAgICAgICAgICAgICAgICAgICcgICB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYW4gQVNDSUkgJworICAgICAgICAgICAgICAgICAgICdzcGFjZSkuIFRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgJworICAgICAgICAgICAgICAgICAgICdlcXVhbCB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICAibGVuKHMpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mICcKKyAgICAgICAgICAgICAgICAgICAnc3Vic3RyaW5nICpzdWIqXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGluIHRoZSByYW5nZSBbKnN0YXJ0KiwgKmVuZCpdLiAgT3B0aW9uYWwgYXJndW1lbnRzICcKKyAgICAgICAgICAgICAgICAgICAnKnN0YXJ0KiBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmVuY29kZShlbmNvZGluZz0idXRmLTgiLCBlcnJvcnM9InN0cmljdCIpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgYXMgYSBieXRlcyAnCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC4gRGVmYXVsdFxuJworICAgICAgICAgICAgICAgICAgICcgICBlbmNvZGluZyBpcyAiXCd1dGYtOFwnIi4gKmVycm9ycyogbWF5IGJlIGdpdmVuIHRvIHNldCBhICcKKyAgICAgICAgICAgICAgICAgICAnZGlmZmVyZW50XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVycm9yIGhhbmRsaW5nIHNjaGVtZS4gVGhlIGRlZmF1bHQgZm9yICplcnJvcnMqIGlzICcKKyAgICAgICAgICAgICAgICAgICAnIlwnc3RyaWN0XCciLFxuJworICAgICAgICAgICAgICAgICAgICcgICBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGEgIlVuaWNvZGVFcnJvciIuICcKKyAgICAgICAgICAgICAgICAgICAnT3RoZXIgcG9zc2libGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdmFsdWVzIGFyZSAiXCdpZ25vcmVcJyIsICJcJ3JlcGxhY2VcJyIsICcKKyAgICAgICAgICAgICAgICAgICAnIlwneG1sY2hhcnJlZnJlcGxhY2VcJyIsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJcJ2JhY2tzbGFzaHJlcGxhY2VcJyIgYW5kIGFueSBvdGhlciBuYW1lIHJlZ2lzdGVyZWQgJworICAgICAgICAgICAgICAgICAgICd2aWFcbicKKyAgICAgICAgICAgICAgICAgICAnICAgImNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpIiwgc2VlIHNlY3Rpb24gRXJyb3IgSGFuZGxlcnMuICcKKyAgICAgICAgICAgICAgICAgICAnRm9yIGEgbGlzdFxuJworICAgICAgICAgICAgICAgICAgICcgICBvZiBwb3NzaWJsZSBlbmNvZGluZ3MsIHNlZSBzZWN0aW9uIFN0YW5kYXJkIEVuY29kaW5ncy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIGtleXdvcmQgYXJndW1lbnRzICcKKyAgICAgICAgICAgICAgICAgICAnYWRkZWQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiAiVHJ1ZSIgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCAnCisgICAgICAgICAgICAgICAgICAgJypzdWZmaXgqLFxuJworICAgICAgICAgICAgICAgICAgICcgICBvdGhlcndpc2UgcmV0dXJuICJGYWxzZSIuICAqc3VmZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlICcKKyAgICAgICAgICAgICAgICAgICAnb2Ygc3VmZml4ZXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdG8gbG9vayBmb3IuICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3QgYmVnaW5uaW5nIGF0ICcKKyAgICAgICAgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgICAgICAgICcgICBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIGF0IHRoYXQgJworICAgICAgICAgICAgICAgICAgICdwb3NpdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5leHBhbmR0YWJzKHRhYnNpemU9OClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgJworICAgICAgICAgICAgICAgICAgICdhcmUgcmVwbGFjZWRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYnkgb25lIG9yIG1vcmUgc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sdW1uICcKKyAgICAgICAgICAgICAgICAgICAnYW5kIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBnaXZlbiB0YWIgc2l6ZS4gIFRhYiBwb3NpdGlvbnMgb2NjdXIgZXZlcnkgKnRhYnNpemUqICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyc1xuJworICAgICAgICAgICAgICAgICAgICcgICAoZGVmYXVsdCBpcyA4LCBnaXZpbmcgdGFiIHBvc2l0aW9ucyBhdCBjb2x1bW5zIDAsIDgsIDE2ICcKKyAgICAgICAgICAgICAgICAgICAnYW5kIHNvIG9uKS5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgVG8gZXhwYW5kIHRoZSBzdHJpbmcsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBzZXQgdG8gemVybyAnCisgICAgICAgICAgICAgICAgICAgJ2FuZCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc3RyaW5nIGlzIGV4YW1pbmVkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuICBJZiB0aGUgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXIgaXMgYVxuJworICAgICAgICAgICAgICAgICAgICcgICB0YWIgKCJcXHQiKSwgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgJworICAgICAgICAgICAgICAgICAgICdpbiB0aGUgcmVzdWx0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVudGlsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBlcXVhbCB0byB0aGUgbmV4dCB0YWIgJworICAgICAgICAgICAgICAgICAgICdwb3NpdGlvbi4gKFRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICB0YWIgY2hhcmFjdGVyIGl0c2VsZiBpcyBub3QgY29waWVkLikgIElmIHRoZSBjaGFyYWN0ZXIgJworICAgICAgICAgICAgICAgICAgICdpcyBhIG5ld2xpbmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKCJcXG4iKSBvciByZXR1cm4gKCJcXHIiKSwgaXQgaXMgY29waWVkIGFuZCB0aGUgY3VycmVudCAnCisgICAgICAgICAgICAgICAgICAgJ2NvbHVtbiBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICByZXNldCB0byB6ZXJvLiAgQW55IG90aGVyIGNoYXJhY3RlciBpcyBjb3BpZWQgdW5jaGFuZ2VkICcKKyAgICAgICAgICAgICAgICAgICAnYW5kIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBjdXJyZW50IGNvbHVtbiBpcyBpbmNyZW1lbnRlZCBieSBvbmUgcmVnYXJkbGVzcyBvZiBob3cgJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIHdoZW4gcHJpbnRlZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgID4+PiAnMDFcXHQwMTJcXHQwMTIzXFx0MDEyMzQnLmV4cGFuZHRhYnMoKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAnMDEgICAgICAwMTIgICAgIDAxMjMgICAgMDEyMzQnXG4iCisgICAgICAgICAgICAgICAgICAgIiAgID4+PiAnMDFcXHQwMTJcXHQwMTIzXFx0MDEyMzQnLmV4cGFuZHRhYnMoNClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgJzAxICAwMTIgMDEyMyAgICAwMTIzNCdcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAnCisgICAgICAgICAgICAgICAgICAgJypzdWIqIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZvdW5kIHdpdGhpbiB0aGUgc2xpY2UgInNbc3RhcnQ6ZW5kXSIuICBPcHRpb25hbCAnCisgICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50cyAqc3RhcnQqXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uICBSZXR1cm4gJworICAgICAgICAgICAgICAgICAgICciLTEiIGlmXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICpzdWIqIGlzIG5vdCBmb3VuZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE5vdGU6IFRoZSAiZmluZCgpIiBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB5b3UgJworICAgICAgICAgICAgICAgICAgICduZWVkIHRvIGtub3dcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICB0aGUgcG9zaXRpb24gb2YgKnN1YiouICBUbyBjaGVjayBpZiAqc3ViKiBpcyBhICcKKyAgICAgICAgICAgICAgICAgICAnc3Vic3RyaW5nIG9yIG5vdCxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICB1c2UgdGhlICJpbiIgb3BlcmF0b3I6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICIgICAgICAgID4+PiAnUHknIGluICdQeXRob24nXG4iCisgICAgICAgICAgICAgICAgICAgJyAgICAgICAgVHJ1ZVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBQZXJmb3JtIGEgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0aW9uLiAgVGhlIHN0cmluZyBvbiAnCisgICAgICAgICAgICAgICAgICAgJ3doaWNoIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIGlzIGNhbGxlZCBjYW4gY29udGFpbiBsaXRlcmFsIHRleHQgb3IgJworICAgICAgICAgICAgICAgICAgICdyZXBsYWNlbWVudCBmaWVsZHNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZGVsaW1pdGVkIGJ5IGJyYWNlcyAie30iLiAgRWFjaCByZXBsYWNlbWVudCBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAgJ2NvbnRhaW5zIGVpdGhlclxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgbnVtZXJpYyBpbmRleCBvZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQsIG9yIHRoZSBuYW1lICcKKyAgICAgICAgICAgICAgICAgICAnb2YgYVxuJworICAgICAgICAgICAgICAgICAgICcgICBrZXl3b3JkIGFyZ3VtZW50LiAgUmV0dXJucyBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSAnCisgICAgICAgICAgICAgICAgICAgJ2VhY2hcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmVwbGFjZW1lbnQgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nIHZhbHVlIG9mICcKKyAgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICA+Pj4gIlRoZSBzdW0gb2YgMSArIDIgaXMgezB9Ii5mb3JtYXQoMSsyKVxuJworICAgICAgICAgICAgICAgICAgICIgICAnVGhlIHN1bSBvZiAxICsgMiBpcyAzJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgU2VlIEZvcm1hdCBTdHJpbmcgU3ludGF4IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3ZhcmlvdXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm9ybWF0dGluZyBvcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBpbiBmb3JtYXQgJworICAgICAgICAgICAgICAgICAgICdzdHJpbmdzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmZvcm1hdF9tYXAobWFwcGluZylcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFNpbWlsYXIgdG8gInN0ci5mb3JtYXQoKiptYXBwaW5nKSIsIGV4Y2VwdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAnIm1hcHBpbmciIGlzIHVzZWRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZGlyZWN0bHkgYW5kIG5vdCBjb3BpZWQgdG8gYSAiZGljdCIuICBUaGlzIGlzIHVzZWZ1bCBpZiAnCisgICAgICAgICAgICAgICAgICAgJ2ZvciBleGFtcGxlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJtYXBwaW5nIiBpcyBhIGRpY3Qgc3ViY2xhc3M6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICA+Pj4gY2xhc3MgRGVmYXVsdChkaWN0KTpcbicKKyAgICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KTpcbicKKyAgICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgcmV0dXJuIGtleVxuJworICAgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7bmFtZX0gd2FzIGJvcm4gaW4gIgorICAgICAgICAgICAgICAgICAgICJ7Y291bnRyeX0nLmZvcm1hdF9tYXAoRGVmYXVsdChuYW1lPSdHdWlkbycpKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAnR3VpZG8gd2FzIGJvcm4gaW4gY291bnRyeSdcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTGlrZSAiZmluZCgpIiwgYnV0IHJhaXNlICJWYWx1ZUVycm9yIiB3aGVuIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3N1YnN0cmluZyBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm91bmQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNhbG51bSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSAnCisgICAgICAgICAgICAgICAgICAgJ2FscGhhbnVtZXJpYyBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgQSAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlciAiYyJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXMgYWxwaGFudW1lcmljIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJldHVybnMgJworICAgICAgICAgICAgICAgICAgICciVHJ1ZSI6XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJjLmlzYWxwaGEoKSIsICJjLmlzZGVjaW1hbCgpIiwgImMuaXNkaWdpdCgpIiwgb3IgJworICAgICAgICAgICAgICAgICAgICciYy5pc251bWVyaWMoKSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNhbHBoYSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSAnCisgICAgICAgICAgICAgICAgICAgJ2FscGhhYmV0aWMgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gICcKKyAgICAgICAgICAgICAgICAgICAnQWxwaGFiZXRpY1xuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXJzIGFyZSB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZGF0YWJhc2UgYXMgIkxldHRlciIsIGkuZS4sIHRob3NlIHdpdGggZ2VuZXJhbCBjYXRlZ29yeSAnCisgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGJlaW5nIG9uZSBvZiAiTG0iLCAiTHQiLCAiTHUiLCAiTGwiLCBvciAiTG8iLiAgTm90ZSAnCisgICAgICAgICAgICAgICAgICAgJ3RoYXQgdGhpcyBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBkaWZmZXJlbnQgZnJvbSB0aGUgIkFscGhhYmV0aWMiIHByb3BlcnR5IGRlZmluZWQgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICAnVW5pY29kZVxuJworICAgICAgICAgICAgICAgICAgICcgICBTdGFuZGFyZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2RlY2ltYWwoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGVjaW1hbCAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gJworICAgICAgICAgICAgICAgICAgICdEZWNpbWFsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgYXJlIHRob3NlIGZyb20gZ2VuZXJhbCBjYXRlZ29yeSAiTmQiLiBUaGlzICcKKyAgICAgICAgICAgICAgICAgICAnY2F0ZWdvcnlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaW5jbHVkZXMgZGlnaXQgY2hhcmFjdGVycywgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgY2FuICcKKyAgICAgICAgICAgICAgICAgICAnYmUgdXNlZCB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICBmb3JtIGRlY2ltYWwtcmFkaXggbnVtYmVycywgZS5nLiBVKzA2NjAsIEFSQUJJQy1JTkRJQyAnCisgICAgICAgICAgICAgICAgICAgJ0RJR0lUIFpFUk8uXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNkaWdpdCgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgJworICAgICAgICAgICAgICAgICAgICdhbmQgdGhlcmUgaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgRGlnaXRzICcKKyAgICAgICAgICAgICAgICAgICAnaW5jbHVkZSBkZWNpbWFsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgYW5kIGRpZ2l0cyB0aGF0IG5lZWQgc3BlY2lhbCBoYW5kbGluZywgc3VjaCAnCisgICAgICAgICAgICAgICAgICAgJ2FzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBjb21wYXRpYmlsaXR5IHN1cGVyc2NyaXB0IGRpZ2l0cy4gIEZvcm1hbGx5LCBhIGRpZ2l0IGlzICcKKyAgICAgICAgICAgICAgICAgICAnYSBjaGFyYWN0ZXJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhhdCBoYXMgdGhlIHByb3BlcnR5IHZhbHVlIE51bWVyaWNfVHlwZT1EaWdpdCBvclxuJworICAgICAgICAgICAgICAgICAgICcgICBOdW1lcmljX1R5cGU9RGVjaW1hbC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2lkZW50aWZpZXIoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGlkZW50aWZpZXIgJworICAgICAgICAgICAgICAgICAgICdhY2NvcmRpbmcgdG8gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGxhbmd1YWdlIGRlZmluaXRpb24sIHNlY3Rpb24gSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVXNlICJrZXl3b3JkLmlza2V5d29yZCgpIiB0byB0ZXN0IGZvciByZXNlcnZlZCAnCisgICAgICAgICAgICAgICAgICAgJ2lkZW50aWZpZXJzIHN1Y2ggYXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgImRlZiIgYW5kICJjbGFzcyIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNsb3dlcigpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyAnCisgICAgICAgICAgICAgICAgICAgJ2FyZSBsb3dlcmNhc2VcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlICcKKyAgICAgICAgICAgICAgICAgICAnb3RoZXJ3aXNlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzbnVtZXJpYygpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBudW1lcmljICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gJworICAgICAgICAgICAgICAgICAgICdOdW1lcmljXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLCBhbmQgYWxsIGNoYXJhY3RlcnMgJworICAgICAgICAgICAgICAgICAgICd0aGF0IGhhdmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIFVuaWNvZGUgbnVtZXJpYyB2YWx1ZSBwcm9wZXJ0eSwgZS5nLiBVKzIxNTUsIFZVTEdBUiAnCisgICAgICAgICAgICAgICAgICAgJ0ZSQUNUSU9OXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE9ORSBGSUZUSC4gIEZvcm1hbGx5LCBudW1lcmljIGNoYXJhY3RlcnMgYXJlIHRob3NlIHdpdGggJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcHJvcGVydHkgdmFsdWUgTnVtZXJpY19UeXBlPURpZ2l0LCBOdW1lcmljX1R5cGU9RGVjaW1hbCAnCisgICAgICAgICAgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE51bWVyaWNfVHlwZT1OdW1lcmljLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzcHJpbnRhYmxlKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlICcKKyAgICAgICAgICAgICAgICAgICAncHJpbnRhYmxlIG9yIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBzdHJpbmcgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4gIE5vbnByaW50YWJsZSAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgYXJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgJworICAgICAgICAgICAgICAgICAgICdkYXRhYmFzZSBhc1xuJworICAgICAgICAgICAgICAgICAgICcgICAiT3RoZXIiIG9yICJTZXBhcmF0b3IiLCBleGNlcHRpbmcgdGhlIEFTQ0lJIHNwYWNlICcKKyAgICAgICAgICAgICAgICAgICAnKDB4MjApIHdoaWNoIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQgcHJpbnRhYmxlLiAgKE5vdGUgdGhhdCBwcmludGFibGUgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ2luIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29udGV4dCBhcmUgdGhvc2Ugd2hpY2ggc2hvdWxkIG5vdCBiZSBlc2NhcGVkIHdoZW4gJworICAgICAgICAgICAgICAgICAgICcicmVwcigpIiBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBpbnZva2VkIG9uIGEgc3RyaW5nLiAgSXQgaGFzIG5vIGJlYXJpbmcgb24gdGhlIGhhbmRsaW5nICcKKyAgICAgICAgICAgICAgICAgICAnb2Ygc3RyaW5nc1xuJworICAgICAgICAgICAgICAgICAgICcgICB3cml0dGVuIHRvICJzeXMuc3Rkb3V0IiBvciAic3lzLnN0ZGVyciIuKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzc3BhY2UoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluICcKKyAgICAgICAgICAgICAgICAgICAndGhlIHN0cmluZ1xuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgJworICAgICAgICAgICAgICAgICAgICdXaGl0ZXNwYWNlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgIGFyZSB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZGF0YWJhc2UgYXMgIk90aGVyIiBvciAiU2VwYXJhdG9yIiBhbmQgdGhvc2Ugd2l0aCAnCisgICAgICAgICAgICAgICAgICAgJ2JpZGlyZWN0aW9uYWxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcHJvcGVydHkgYmVpbmcgb25lIG9mICJXUyIsICJCIiwgb3IgIlMiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzdGl0bGUoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJ3RoZXJlIGlzIGF0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZvciBleGFtcGxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzICcKKyAgICAgICAgICAgICAgICAgICAnbWF5IG9ubHlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm9sbG93IHVuY2FzZWQgY2hhcmFjdGVycyBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgb25seSAnCisgICAgICAgICAgICAgICAgICAgJ2Nhc2VkIG9uZXMuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBmYWxzZSBvdGhlcndpc2UuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXN1cHBlcigpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyAnCisgICAgICAgICAgICAgICAgICAgJ2FyZSB1cHBlcmNhc2VcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlICcKKyAgICAgICAgICAgICAgICAgICAnb3RoZXJ3aXNlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmpvaW4oaXRlcmFibGUpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBzdHJpbmcgd2hpY2ggaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnc3RyaW5ncyBpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKml0ZXJhYmxlKiAqaXRlcmFibGUqLiAgQSAiVHlwZUVycm9yIiB3aWxsIGJlIHJhaXNlZCBpZiAnCisgICAgICAgICAgICAgICAgICAgJ3RoZXJlIGFyZVxuJworICAgICAgICAgICAgICAgICAgICcgICBhbnkgbm9uLXN0cmluZyB2YWx1ZXMgaW4gKml0ZXJhYmxlKiwgaW5jbHVkaW5nICJieXRlcyIgJworICAgICAgICAgICAgICAgICAgICdvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAgICcgICBUaGUgc2VwYXJhdG9yIGJldHdlZW4gZWxlbWVudHMgaXMgdGhlIHN0cmluZyBwcm92aWRpbmcgJworICAgICAgICAgICAgICAgICAgICd0aGlzIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0aGUgc3RyaW5nIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAnCisgICAgICAgICAgICAgICAgICAgJyp3aWR0aCouXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgJworICAgICAgICAgICAgICAgICAgICdpcyBhbiBBU0NJSVxuJworICAgICAgICAgICAgICAgICAgICcgICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyAnCisgICAgICAgICAgICAgICAgICAgJ2xlc3MgdGhhbiBvclxuJworICAgICAgICAgICAgICAgICAgICcgICBlcXVhbCB0byAibGVuKHMpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5sb3dlcigpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyBbNF1cbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoZSBsb3dlcmNhc2luZyBhbGdvcml0aG0gdXNlZCBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAnCisgICAgICAgICAgICAgICAgICAgJzMuMTMgb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFVuaWNvZGUgU3RhbmRhcmQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIubHN0cmlwKFtjaGFyc10pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgJworICAgICAgICAgICAgICAgICAgICdyZW1vdmVkLiAgVGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyB0byBiZVxuJworICAgICAgICAgICAgICAgICAgICcgICByZW1vdmVkLiAgSWYgb21pdHRlZCBvciAiTm9uZSIsIHRoZSAqY2hhcnMqIGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAgICAgICAnZGVmYXVsdHMgdG9cbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhICcKKyAgICAgICAgICAgICAgICAgICAncHJlZml4OyByYXRoZXIsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUgc3RyaXBwZWQ6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJyAgIHNwYWNpb3VzICAgJy5sc3RyaXAoKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAnc3BhY2lvdXMgICAnXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnd3d3LmV4YW1wbGUuY29tJy5sc3RyaXAoJ2Ntb3d6LicpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdleGFtcGxlLmNvbSdcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0YXRpYyBzdHIubWFrZXRyYW5zKHhbLCB5Wywgel1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhpcyBzdGF0aWMgbWV0aG9kIHJldHVybnMgYSB0cmFuc2xhdGlvbiB0YWJsZSB1c2FibGUgJworICAgICAgICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgInN0ci50cmFuc2xhdGUoKSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBJZiB0aGVyZSBpcyBvbmx5IG9uZSBhcmd1bWVudCwgaXQgbXVzdCBiZSBhIGRpY3Rpb25hcnkgJworICAgICAgICAgICAgICAgICAgICdtYXBwaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFVuaWNvZGUgb3JkaW5hbHMgKGludGVnZXJzKSBvciBjaGFyYWN0ZXJzIChzdHJpbmdzIG9mICcKKyAgICAgICAgICAgICAgICAgICAnbGVuZ3RoIDEpIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFVuaWNvZGUgb3JkaW5hbHMsIHN0cmluZ3MgKG9mIGFyYml0cmFyeSBsZW5ndGhzKSBvciAnCisgICAgICAgICAgICAgICAgICAgJ05vbmUuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENoYXJhY3RlciBrZXlzIHdpbGwgdGhlbiBiZSBjb252ZXJ0ZWQgdG8gb3JkaW5hbHMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBJZiB0aGVyZSBhcmUgdHdvIGFyZ3VtZW50cywgdGhleSBtdXN0IGJlIHN0cmluZ3Mgb2YgJworICAgICAgICAgICAgICAgICAgICdlcXVhbCBsZW5ndGgsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFuZCBpbiB0aGUgcmVzdWx0aW5nIGRpY3Rpb25hcnksIGVhY2ggY2hhcmFjdGVyIGluIHggJworICAgICAgICAgICAgICAgICAgICd3aWxsIGJlIG1hcHBlZFxuJworICAgICAgICAgICAgICAgICAgICcgICB0byB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHkuICBJZiB0aGVyZSAnCisgICAgICAgICAgICAgICAgICAgJ2lzIGEgdGhpcmRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQsIGl0IG11c3QgYmUgYSBzdHJpbmcsIHdob3NlIGNoYXJhY3RlcnMgd2lsbCBiZSAnCisgICAgICAgICAgICAgICAgICAgJ21hcHBlZCB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICBOb25lIGluIHRoZSByZXN1bHQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucGFydGl0aW9uKHNlcClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJ3JldHVybiBhXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnc2VwYXJhdG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgJworICAgICAgICAgICAgICAgICAgICdzZXBhcmF0b3IgaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBpdHNlbGYsICcKKyAgICAgICAgICAgICAgICAgICAnZm9sbG93ZWQgYnlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdHdvIGVtcHR5IHN0cmluZ3MuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucmVwbGFjZShvbGQsIG5ld1ssIGNvdW50XSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiAnCisgICAgICAgICAgICAgICAgICAgJ3N1YnN0cmluZyAqb2xkKlxuJworICAgICAgICAgICAgICAgICAgICcgICByZXBsYWNlZCBieSAqbmV3Ki4gIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCAqY291bnQqIGlzICcKKyAgICAgICAgICAgICAgICAgICAnZ2l2ZW4sIG9ubHlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIGZpcnN0ICpjb3VudCogb2NjdXJyZW5jZXMgYXJlIHJlcGxhY2VkLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgJworICAgICAgICAgICAgICAgICAgICcqc3ViKiBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBmb3VuZCwgc3VjaCB0aGF0ICpzdWIqIGlzIGNvbnRhaW5lZCB3aXRoaW4gJworICAgICAgICAgICAgICAgICAgICcic1tzdGFydDplbmRdIi5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyAnCisgICAgICAgICAgICAgICAgICAgJ2luIHNsaWNlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG5vdGF0aW9uLiAgUmV0dXJuICItMSIgb24gZmFpbHVyZS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIExpa2UgInJmaW5kKCkiIGJ1dCByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICAnc3Vic3RyaW5nICpzdWIqIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG5vdCBmb3VuZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0aGUgc3RyaW5nIHJpZ2h0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggJworICAgICAgICAgICAgICAgICAgICcqd2lkdGgqLlxuJworICAgICAgICAgICAgICAgICAgICcgICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgICAnaXMgYW4gQVNDSUlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc3BhY2UpLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgJworICAgICAgICAgICAgICAgICAgICdsZXNzIHRoYW4gb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZXF1YWwgdG8gImxlbihzKSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucnBhcnRpdGlvbihzZXApXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJ3JldHVybiBhXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnc2VwYXJhdG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgJworICAgICAgICAgICAgICAgICAgICdzZXBhcmF0b3IgaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3MsICcKKyAgICAgICAgICAgICAgICAgICAnZm9sbG93ZWQgYnlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIHN0cmluZyBpdHNlbGYuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucnNwbGl0KHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqICcKKyAgICAgICAgICAgICAgICAgICAnYXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGRlbGltaXRlciBzdHJpbmcuIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgJworICAgICAgICAgICAgICAgICAgICcqbWF4c3BsaXQqIHNwbGl0c1xuJworICAgICAgICAgICAgICAgICAgICcgICBhcmUgZG9uZSwgdGhlICpyaWdodG1vc3QqIG9uZXMuICBJZiAqc2VwKiBpcyBub3QgJworICAgICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgIk5vbmUiLCBhbnkgd2hpdGVzcGFjZSBzdHJpbmcgaXMgYSBzZXBhcmF0b3IuICBFeGNlcHQgJworICAgICAgICAgICAgICAgICAgICdmb3Igc3BsaXR0aW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZyb20gdGhlIHJpZ2h0LCAicnNwbGl0KCkiIGJlaGF2ZXMgbGlrZSAic3BsaXQoKSIgd2hpY2ggJworICAgICAgICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBkZXNjcmliZWQgaW4gZGV0YWlsIGJlbG93LlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnJzdHJpcChbY2hhcnNdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ3JlbW92ZWQuICBUaGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzIHRvIGJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycyogYXJndW1lbnQgJworICAgICAgICAgICAgICAgICAgICdkZWZhdWx0cyB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgJworICAgICAgICAgICAgICAgICAgICdzdWZmaXg7IHJhdGhlcixcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnICAgc3BhY2lvdXMgICAnLnJzdHJpcCgpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICcgICBzcGFjaW91cydcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICdtaXNzaXNzaXBwaScucnN0cmlwKCdpcHonKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAnbWlzc2lzcydcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5zcGxpdChzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiAnCisgICAgICAgICAgICAgICAgICAgJ2FzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBkZWxpbWl0ZXIgc3RyaW5nLiAgSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAnCisgICAgICAgICAgICAgICAgICAgJyptYXhzcGxpdCpcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc3BsaXRzIGFyZSBkb25lICh0aHVzLCB0aGUgbGlzdCB3aWxsIGhhdmUgYXQgbW9zdCAnCisgICAgICAgICAgICAgICAgICAgJyJtYXhzcGxpdCsxIlxuJworICAgICAgICAgICAgICAgICAgICcgICBlbGVtZW50cykuICBJZiAqbWF4c3BsaXQqIGlzIG5vdCBzcGVjaWZpZWQgb3IgIi0xIiwgJworICAgICAgICAgICAgICAgICAgICd0aGVuIHRoZXJlIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzIChhbGwgcG9zc2libGUgc3BsaXRzICcKKyAgICAgICAgICAgICAgICAgICAnYXJlIG1hZGUpLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgSWYgKnNlcCogaXMgZ2l2ZW4sIGNvbnNlY3V0aXZlIGRlbGltaXRlcnMgYXJlIG5vdCAnCisgICAgICAgICAgICAgICAgICAgJ2dyb3VwZWQgdG9nZXRoZXJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIGFyZSBkZWVtZWQgdG8gZGVsaW1pdCBlbXB0eSBzdHJpbmdzIChmb3IgZXhhbXBsZSxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgIlwnMSwsMlwnLnNwbGl0KFwnLFwnKSIgcmV0dXJucyAiW1wnMVwnLCBcJ1wnLCAnCisgICAgICAgICAgICAgICAgICAgJ1wnMlwnXSIpLiAgVGhlICpzZXAqIGFyZ3VtZW50XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG1heSBjb25zaXN0IG9mIG11bHRpcGxlIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuJworICAgICAgICAgICAgICAgICAgICcgICAiXCcxPD4yPD4zXCcuc3BsaXQoXCc8PlwnKSIgcmV0dXJucyAiW1wnMVwnLCBcJzJcJywgJworICAgICAgICAgICAgICAgICAgICdcJzNcJ10iKS4gU3BsaXR0aW5nIGFuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVtcHR5IHN0cmluZyB3aXRoIGEgc3BlY2lmaWVkIHNlcGFyYXRvciByZXR1cm5zICcKKyAgICAgICAgICAgICAgICAgICAnIltcJ1wnXSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBGb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnMSwyLDMnLnNwbGl0KCcsJylcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWycxJywgJzInLCAnMyddXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnMSwyLDMnLnNwbGl0KCcsJywgbWF4c3BsaXQ9MSlcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWycxJywgJzIsMyddXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnMSwyLCwzLCcuc3BsaXQoJywnKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJzEnLCAnMicsICcnLCAnMycsICcnXVxuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvciBpcyAiTm9uZSIsIGEgZGlmZmVyZW50ICcKKyAgICAgICAgICAgICAgICAgICAnc3BsaXR0aW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFsZ29yaXRobSBpcyBhcHBsaWVkOiBydW5zIG9mIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgJworICAgICAgICAgICAgICAgICAgICdhcmUgcmVnYXJkZWRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYXMgYSBzaW5nbGUgc2VwYXJhdG9yLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGNvbnRhaW4gbm8gJworICAgICAgICAgICAgICAgICAgICdlbXB0eSBzdHJpbmdzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGF0IHRoZSBzdGFydCBvciBlbmQgaWYgdGhlIHN0cmluZyBoYXMgbGVhZGluZyBvciAnCisgICAgICAgICAgICAgICAgICAgJ3RyYWlsaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHdoaXRlc3BhY2UuICBDb25zZXF1ZW50bHksIHNwbGl0dGluZyBhbiBlbXB0eSBzdHJpbmcgb3IgJworICAgICAgICAgICAgICAgICAgICdhIHN0cmluZ1xuJworICAgICAgICAgICAgICAgICAgICcgICBjb25zaXN0aW5nIG9mIGp1c3Qgd2hpdGVzcGFjZSB3aXRoIGEgIk5vbmUiIHNlcGFyYXRvciAnCisgICAgICAgICAgICAgICAgICAgJ3JldHVybnMgIltdIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIEZvciBleGFtcGxlOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcxIDIgMycuc3BsaXQoKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJzEnLCAnMicsICczJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcxIDIgMycuc3BsaXQobWF4c3BsaXQ9MSlcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWycxJywgJzIgMyddXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnICAgMSAgIDIgICAzICAgJy5zcGxpdCgpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnMScsICcyJywgJzMnXVxuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnNwbGl0bGluZXMoW2tlZXBlbmRzXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0ICcKKyAgICAgICAgICAgICAgICAgICAnbGluZVxuJworICAgICAgICAgICAgICAgICAgICcgICBib3VuZGFyaWVzLiAgTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgJworICAgICAgICAgICAgICAgICAgICdyZXN1bHRpbmcgbGlzdFxuJworICAgICAgICAgICAgICAgICAgICcgICB1bmxlc3MgKmtlZXBlbmRzKiBpcyBnaXZlbiBhbmQgdHJ1ZS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIHNwbGl0cyBvbiB0aGUgZm9sbG93aW5nIGxpbmUgYm91bmRhcmllcy4gICcKKyAgICAgICAgICAgICAgICAgICAnSW5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgcGFydGljdWxhciwgdGhlIGJvdW5kYXJpZXMgYXJlIGEgc3VwZXJzZXQgb2YgKnVuaXZlcnNhbCAnCisgICAgICAgICAgICAgICAgICAgJ25ld2xpbmVzKi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCBSZXByZXNlbnRhdGlvbiAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAnRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxcbiIgICAgICAgICAgICAgICAgICAgIHwgTGluZSAnCisgICAgICAgICAgICAgICAgICAgJ0ZlZWQgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFxyIiAgICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSAnCisgICAgICAgICAgICAgICAgICAgJ1JldHVybiAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHJcXG4iICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSBSZXR1cm4gKyBMaW5lICcKKyAgICAgICAgICAgICAgICAgICAnRmVlZCAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHYiIG9yICJcXHgwYiIgICAgICAgICAgfCBMaW5lICcKKyAgICAgICAgICAgICAgICAgICAnVGFidWxhdGlvbiAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXGYiIG9yICJcXHgwYyIgICAgICAgICAgfCBGb3JtICcKKyAgICAgICAgICAgICAgICAgICAnRmVlZCAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHgxYyIgICAgICAgICAgICAgICAgICB8IEZpbGUgJworICAgICAgICAgICAgICAgICAgICdTZXBhcmF0b3IgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxceDFkIiAgICAgICAgICAgICAgICAgIHwgR3JvdXAgJworICAgICAgICAgICAgICAgICAgICdTZXBhcmF0b3IgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFx4MWUiICAgICAgICAgICAgICAgICAgfCBSZWNvcmQgJworICAgICAgICAgICAgICAgICAgICdTZXBhcmF0b3IgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHg4NSIgICAgICAgICAgICAgICAgICB8IE5leHQgTGluZSAoQzEgQ29udHJvbCAnCisgICAgICAgICAgICAgICAgICAgJ0NvZGUpICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxcdTIwMjgiICAgICAgICAgICAgICAgIHwgTGluZSAnCisgICAgICAgICAgICAgICAgICAgJ1NlcGFyYXRvciAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFx1MjAyOSIgICAgICAgICAgICAgICAgfCBQYXJhZ3JhcGggJworICAgICAgICAgICAgICAgICAgICdTZXBhcmF0b3IgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogIlxcdiIgYW5kICJcXGYiIGFkZGVkIHRvIGxpc3QgJworICAgICAgICAgICAgICAgICAgICdvZiBsaW5lXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGJvdW5kYXJpZXMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBGb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnYWIgY1xcblxcbmRlIGZnXFxya2xcXHJcXG4nLnNwbGl0bGluZXMoKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJ2FiIGMnLCAnJywgJ2RlIGZnJywgJ2tsJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICdhYiBjXFxuXFxuZGUgIgorICAgICAgICAgICAgICAgICAgICJmZ1xccmtsXFxyXFxuJy5zcGxpdGxpbmVzKGtlZXBlbmRzPVRydWUpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnYWIgY1xcbicsICdcXG4nLCAnZGUgZmdcXHInLCAna2xcXHJcXG4nXVxuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5saWtlICJzcGxpdCgpIiB3aGVuIGEgZGVsaW1pdGVyIHN0cmluZyAqc2VwKiBpcyAnCisgICAgICAgICAgICAgICAgICAgJ2dpdmVuLCB0aGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJ2EgdGVybWluYWxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbGluZSBicmVhayBkb2VzIG5vdCByZXN1bHQgaW4gYW4gZXh0cmEgbGluZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiAiIi5zcGxpdGxpbmVzKClcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgW11cbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+ICJPbmUgbGluZVxcbiIuc3BsaXRsaW5lcygpXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnT25lIGxpbmUnXVxuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgRm9yIGNvbXBhcmlzb24sICJzcGxpdChcJ1xcblwnKSIgZ2l2ZXM6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJycuc3BsaXQoJ1xcbicpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICdUd28gbGluZXNcXG4nLnNwbGl0KCdcXG4nKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJ1R3byBsaW5lcycsICcnXVxuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiAiVHJ1ZSIgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSAqcHJlZml4KiwgJworICAgICAgICAgICAgICAgICAgICdvdGhlcndpc2UgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJGYWxzZSIuICpwcmVmaXgqIGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgcHJlZml4ZXMgdG8gJworICAgICAgICAgICAgICAgICAgICdsb29rIGZvci5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgV2l0aCBvcHRpb25hbCAqc3RhcnQqLCB0ZXN0IHN0cmluZyBiZWdpbm5pbmcgYXQgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICcgICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnN0cmlwKFtjaGFyc10pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0aGUgbGVhZGluZyBhbmQgJworICAgICAgICAgICAgICAgICAgICd0cmFpbGluZ1xuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXJzIHJlbW92ZWQuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nICcKKyAgICAgICAgICAgICAgICAgICAnc3BlY2lmeWluZyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVtb3ZlZC4gSWYgb21pdHRlZCBvciAiTm9uZSIsICcKKyAgICAgICAgICAgICAgICAgICAndGhlICpjaGFycypcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQgZGVmYXVsdHMgdG8gcmVtb3Zpbmcgd2hpdGVzcGFjZS4gVGhlICpjaGFycyogJworICAgICAgICAgICAgICAgICAgICdhcmd1bWVudCBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBub3QgYSBwcmVmaXggb3Igc3VmZml4OyByYXRoZXIsIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzICcKKyAgICAgICAgICAgICAgICAgICAndmFsdWVzIGFyZVxuJworICAgICAgICAgICAgICAgICAgICcgICBzdHJpcHBlZDpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnICAgc3BhY2lvdXMgICAnLnN0cmlwKClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJ3NwYWNpb3VzJ1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJ3d3dy5leGFtcGxlLmNvbScuc3RyaXAoJ2Ntb3d6LicpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdleGFtcGxlJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhlIG91dGVybW9zdCBsZWFkaW5nIGFuZCB0cmFpbGluZyAqY2hhcnMqIGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAgICAgICAndmFsdWVzIGFyZVxuJworICAgICAgICAgICAgICAgICAgICcgICBzdHJpcHBlZCBmcm9tIHRoZSBzdHJpbmcuIENoYXJhY3RlcnMgYXJlIHJlbW92ZWQgZnJvbSAnCisgICAgICAgICAgICAgICAgICAgJ3RoZSBsZWFkaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVuZCB1bnRpbCByZWFjaGluZyBhIHN0cmluZyBjaGFyYWN0ZXIgdGhhdCBpcyBub3QgJworICAgICAgICAgICAgICAgICAgICdjb250YWluZWQgaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHNldCBvZiBjaGFyYWN0ZXJzIGluICpjaGFycyouIEEgc2ltaWxhciBhY3Rpb24gdGFrZXMgJworICAgICAgICAgICAgICAgICAgICdwbGFjZSBvbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdHJhaWxpbmcgZW5kLiBGb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiBjb21tZW50X3N0cmluZyA9ICcjLi4uLi4uLiBTZWN0aW9uIDMuMi4xIElzc3VlICIKKyAgICAgICAgICAgICAgICAgICAiIzMyIC4uLi4uLi4nXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiBjb21tZW50X3N0cmluZy5zdHJpcCgnLiMhICcpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdTZWN0aW9uIDMuMi4xIElzc3VlICMzMidcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5zd2FwY2FzZSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB1cHBlcmNhc2UgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ2NvbnZlcnRlZCB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICBsb3dlcmNhc2UgYW5kIHZpY2UgdmVyc2EuIE5vdGUgdGhhdCBpdCBpcyBub3QgJworICAgICAgICAgICAgICAgICAgICduZWNlc3NhcmlseSB0cnVlIHRoYXRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgInMuc3dhcGNhc2UoKS5zd2FwY2FzZSgpID09IHMiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnRpdGxlKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoZXJlIHdvcmRzICcKKyAgICAgICAgICAgICAgICAgICAnc3RhcnQgd2l0aCBhblxuJworICAgICAgICAgICAgICAgICAgICcgICB1cHBlcmNhc2UgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlICcKKyAgICAgICAgICAgICAgICAgICAnbG93ZXJjYXNlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgRm9yIGV4YW1wbGU6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJ0hlbGxvIHdvcmxkJy50aXRsZSgpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdIZWxsbyBXb3JsZCdcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoZSBhbGdvcml0aG0gdXNlcyBhIHNpbXBsZSBsYW5ndWFnZS1pbmRlcGVuZGVudCAnCisgICAgICAgICAgICAgICAgICAgJ2RlZmluaXRpb24gb2YgYVxuJworICAgICAgICAgICAgICAgICAgICcgICB3b3JkIGFzIGdyb3VwcyBvZiBjb25zZWN1dGl2ZSBsZXR0ZXJzLiAgVGhlIGRlZmluaXRpb24gJworICAgICAgICAgICAgICAgICAgICd3b3JrcyBpblxuJworICAgICAgICAgICAgICAgICAgICcgICBtYW55IGNvbnRleHRzIGJ1dCBpdCBtZWFucyB0aGF0IGFwb3N0cm9waGVzIGluICcKKyAgICAgICAgICAgICAgICAgICAnY29udHJhY3Rpb25zIGFuZFxuJworICAgICAgICAgICAgICAgICAgICcgICBwb3NzZXNzaXZlcyBmb3JtIHdvcmQgYm91bmRhcmllcywgd2hpY2ggbWF5IG5vdCBiZSB0aGUgJworICAgICAgICAgICAgICAgICAgICdkZXNpcmVkXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlc3VsdDpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiAidGhleVwncmUgYmlsbFwncyBmcmllbmRzIGZyb20gdGhlIFVLIi50aXRsZSgpXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgICJUaGV5XCdSZSBCaWxsXCdTIEZyaWVuZHMgRnJvbSBUaGUgVWsiXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBBIHdvcmthcm91bmQgZm9yIGFwb3N0cm9waGVzIGNhbiBiZSBjb25zdHJ1Y3RlZCB1c2luZyAnCisgICAgICAgICAgICAgICAgICAgJ3JlZ3VsYXJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZXhwcmVzc2lvbnM6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICAgICA+Pj4gaW1wb3J0IHJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiBkZWYgdGl0bGVjYXNlKHMpOlxuJworICAgICAgICAgICAgICAgICAgICcgICAgICAuLi4gICAgIHJldHVybiByZS5zdWIociJbQS1aYS16XSsoXCdbQS1aYS16XSspPyIsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBsYW1iZGEgbW86ICcKKyAgICAgICAgICAgICAgICAgICAnbW8uZ3JvdXAoMClbMF0udXBwZXIoKSArXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICAnbW8uZ3JvdXAoMClbMTpdLmxvd2VyKCksXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBzKVxuJworICAgICAgICAgICAgICAgICAgICcgICAgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+IHRpdGxlY2FzZSgidGhleVwncmUgYmlsbFwncyBmcmllbmRzLiIpXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgICJUaGV5XCdyZSBCaWxsXCdzIEZyaWVuZHMuIlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnRyYW5zbGF0ZSh0YWJsZSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBpbiB3aGljaCBlYWNoIGNoYXJhY3RlciBoYXMgJworICAgICAgICAgICAgICAgICAgICdiZWVuIG1hcHBlZFxuJworICAgICAgICAgICAgICAgICAgICcgICB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS4gIFRoZSB0YWJsZSBtdXN0IGJlICcKKyAgICAgICAgICAgICAgICAgICAnYW4gb2JqZWN0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoYXQgaW1wbGVtZW50cyBpbmRleGluZyB2aWEgIl9fZ2V0aXRlbV9fKCkiLCB0eXBpY2FsbHkgJworICAgICAgICAgICAgICAgICAgICdhICptYXBwaW5nKlxuJworICAgICAgICAgICAgICAgICAgICcgICBvciAqc2VxdWVuY2UqLiAgV2hlbiBpbmRleGVkIGJ5IGEgVW5pY29kZSBvcmRpbmFsIChhbiAnCisgICAgICAgICAgICAgICAgICAgJ2ludGVnZXIpLCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGFibGUgb2JqZWN0IGNhbiBkbyBhbnkgb2YgdGhlIGZvbGxvd2luZzogcmV0dXJuIGEgJworICAgICAgICAgICAgICAgICAgICdVbmljb2RlIG9yZGluYWxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgb3IgYSBzdHJpbmcsIHRvIG1hcCB0aGUgY2hhcmFjdGVyIHRvIG9uZSBvciBtb3JlIG90aGVyICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycztcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmV0dXJuICJOb25lIiwgdG8gZGVsZXRlIHRoZSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmV0dXJuICcKKyAgICAgICAgICAgICAgICAgICAnc3RyaW5nOyBvclxuJworICAgICAgICAgICAgICAgICAgICcgICByYWlzZSBhICJMb29rdXBFcnJvciIgZXhjZXB0aW9uLCB0byBtYXAgdGhlIGNoYXJhY3RlciAnCisgICAgICAgICAgICAgICAgICAgJ3RvIGl0c2VsZi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFlvdSBjYW4gdXNlICJzdHIubWFrZXRyYW5zKCkiIHRvIGNyZWF0ZSBhIHRyYW5zbGF0aW9uICcKKyAgICAgICAgICAgICAgICAgICAnbWFwIGZyb21cbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVyLXRvLWNoYXJhY3RlciBtYXBwaW5ncyBpbiBkaWZmZXJlbnQgZm9ybWF0cy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFNlZSBhbHNvIHRoZSAiY29kZWNzIiBtb2R1bGUgZm9yIGEgbW9yZSBmbGV4aWJsZSAnCisgICAgICAgICAgICAgICAgICAgJ2FwcHJvYWNoIHRvIGN1c3RvbVxuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXIgbWFwcGluZ3MuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIudXBwZXIoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgWzRdXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuICBOb3RlIHRoYXQgJworICAgICAgICAgICAgICAgICAgICcic3RyLnVwcGVyKCkuaXN1cHBlcigpIiBtaWdodCBiZVxuJworICAgICAgICAgICAgICAgICAgICcgICAiRmFsc2UiIGlmICJzIiBjb250YWlucyB1bmNhc2VkIGNoYXJhY3RlcnMgb3IgaWYgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnVW5pY29kZVxuJworICAgICAgICAgICAgICAgICAgICcgICBjYXRlZ29yeSBvZiB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlcihzKSBpcyBub3QgIkx1IiAnCisgICAgICAgICAgICAgICAgICAgJyhMZXR0ZXIsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVwcGVyY2FzZSksIGJ1dCBlLmcuICJMdCIgKExldHRlciwgdGl0bGVjYXNlKS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoZSB1cHBlcmNhc2luZyBhbGdvcml0aG0gdXNlZCBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAnCisgICAgICAgICAgICAgICAgICAgJzMuMTMgb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFVuaWNvZGUgU3RhbmRhcmQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuemZpbGwod2lkdGgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCBBU0NJSSAnCisgICAgICAgICAgICAgICAgICAgJyJcJzBcJyIgZGlnaXRzIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG1ha2UgYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouIEEgbGVhZGluZyBzaWduIHByZWZpeFxuJworICAgICAgICAgICAgICAgICAgICcgICAoIlwnK1wnIi8iXCctXCciKSBpcyBoYW5kbGVkIGJ5IGluc2VydGluZyB0aGUgcGFkZGluZyAnCisgICAgICAgICAgICAgICAgICAgJyphZnRlciogdGhlIHNpZ25cbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVyIHJhdGhlciB0aGFuIGJlZm9yZS4gVGhlIG9yaWdpbmFsIHN0cmluZyBpcyAnCisgICAgICAgICAgICAgICAgICAgJ3JldHVybmVkIGlmXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICJsZW4ocykiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgRm9yIGV4YW1wbGU6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICAgICA+Pj4gIjQyIi56ZmlsbCg1KVxuJworICAgICAgICAgICAgICAgICAgICIgICAgICAnMDAwNDInXG4iCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiAiLTQyIi56ZmlsbCg1KVxuJworICAgICAgICAgICAgICAgICAgICIgICAgICAnLTAwNDInXG4iLAorICdzdHJpbmdzJzogJ1xuJworICAgICAgICAgICAgJ1N0cmluZyBhbmQgQnl0ZXMgbGl0ZXJhbHNcbicKKyAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnU3RyaW5nIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsICcKKyAgICAgICAgICAgICdkZWZpbml0aW9uczpcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcgICBzdHJpbmdsaXRlcmFsICAgOjo9IFtzdHJpbmdwcmVmaXhdKHNob3J0c3RyaW5nIHwgbG9uZ3N0cmluZylcbicKKyAgICAgICAgICAgICcgICBzdHJpbmdwcmVmaXggICAgOjo9ICJyIiB8ICJ1IiB8ICJSIiB8ICJVIiB8ICJmIiB8ICJGIlxuJworICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgfCAiZnIiIHwgIkZyIiB8ICJmUiIgfCAiRlIiIHwgInJmIiB8ICJyRiIgfCAnCisgICAgICAgICAgICAnIlJmIiB8ICJSRiJcbicKKyAgICAgICAgICAgICcgICBzaG9ydHN0cmluZyAgICAgOjo9ICJcJyIgc2hvcnRzdHJpbmdpdGVtKiAiXCciIHwgXCciXCcgJworICAgICAgICAgICAgJ3Nob3J0c3RyaW5naXRlbSogXCciXCdcbicKKyAgICAgICAgICAgICcgICBsb25nc3RyaW5nICAgICAgOjo9ICJcJ1wnXCciIGxvbmdzdHJpbmdpdGVtKiAiXCdcJ1wnIiB8ICcKKyAgICAgICAgICAgICdcJyIiIlwnIGxvbmdzdHJpbmdpdGVtKiBcJyIiIlwnXG4nCisgICAgICAgICAgICAnICAgc2hvcnRzdHJpbmdpdGVtIDo6PSBzaG9ydHN0cmluZ2NoYXIgfCBzdHJpbmdlc2NhcGVzZXFcbicKKyAgICAgICAgICAgICcgICBsb25nc3RyaW5naXRlbSAgOjo9IGxvbmdzdHJpbmdjaGFyIHwgc3RyaW5nZXNjYXBlc2VxXG4nCisgICAgICAgICAgICAnICAgc2hvcnRzdHJpbmdjaGFyIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCIgb3IgJworICAgICAgICAgICAgJ25ld2xpbmUgb3IgdGhlIHF1b3RlPlxuJworICAgICAgICAgICAgJyAgIGxvbmdzdHJpbmdjaGFyICA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiPlxuJworICAgICAgICAgICAgJyAgIHN0cmluZ2VzY2FwZXNlcSA6Oj0gIlxcIiA8YW55IHNvdXJjZSBjaGFyYWN0ZXI+XG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnICAgYnl0ZXNsaXRlcmFsICAgOjo9IGJ5dGVzcHJlZml4KHNob3J0Ynl0ZXMgfCBsb25nYnl0ZXMpXG4nCisgICAgICAgICAgICAnICAgYnl0ZXNwcmVmaXggICAgOjo9ICJiIiB8ICJCIiB8ICJiciIgfCAiQnIiIHwgImJSIiB8ICJCUiIgfCAnCisgICAgICAgICAgICAnInJiIiB8ICJyQiIgfCAiUmIiIHwgIlJCIlxuJworICAgICAgICAgICAgJyAgIHNob3J0Ynl0ZXMgICAgIDo6PSAiXCciIHNob3J0Ynl0ZXNpdGVtKiAiXCciIHwgXCciXCcgJworICAgICAgICAgICAgJ3Nob3J0Ynl0ZXNpdGVtKiBcJyJcJ1xuJworICAgICAgICAgICAgJyAgIGxvbmdieXRlcyAgICAgIDo6PSAiXCdcJ1wnIiBsb25nYnl0ZXNpdGVtKiAiXCdcJ1wnIiB8IFwnIiIiXCcgJworICAgICAgICAgICAgJ2xvbmdieXRlc2l0ZW0qIFwnIiIiXCdcbicKKyAgICAgICAgICAgICcgICBzaG9ydGJ5dGVzaXRlbSA6Oj0gc2hvcnRieXRlc2NoYXIgfCBieXRlc2VzY2FwZXNlcVxuJworICAgICAgICAgICAgJyAgIGxvbmdieXRlc2l0ZW0gIDo6PSBsb25nYnl0ZXNjaGFyIHwgYnl0ZXNlc2NhcGVzZXFcbicKKyAgICAgICAgICAgICcgICBzaG9ydGJ5dGVzY2hhciA6Oj0gPGFueSBBU0NJSSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCIgb3IgbmV3bGluZSAnCisgICAgICAgICAgICAnb3IgdGhlIHF1b3RlPlxuJworICAgICAgICAgICAgJyAgIGxvbmdieXRlc2NoYXIgIDo6PSA8YW55IEFTQ0lJIGNoYXJhY3RlciBleGNlcHQgIlxcIj5cbicKKyAgICAgICAgICAgICcgICBieXRlc2VzY2FwZXNlcSA6Oj0gIlxcIiA8YW55IEFTQ0lJIGNoYXJhY3Rlcj5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdPbmUgc3ludGFjdGljIHJlc3RyaWN0aW9uIG5vdCBpbmRpY2F0ZWQgYnkgdGhlc2UgcHJvZHVjdGlvbnMgaXMgJworICAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgICd3aGl0ZXNwYWNlIGlzIG5vdCBhbGxvd2VkIGJldHdlZW4gdGhlICJzdHJpbmdwcmVmaXgiIG9yICcKKyAgICAgICAgICAgICciYnl0ZXNwcmVmaXgiXG4nCisgICAgICAgICAgICAnYW5kIHRoZSByZXN0IG9mIHRoZSBsaXRlcmFsLiBUaGUgc291cmNlIGNoYXJhY3RlciBzZXQgaXMgZGVmaW5lZCAnCisgICAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAgICd0aGUgZW5jb2RpbmcgZGVjbGFyYXRpb247IGl0IGlzIFVURi04IGlmIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uICcKKyAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgJ2dpdmVuIGluIHRoZSBzb3VyY2UgZmlsZTsgc2VlIHNlY3Rpb24gRW5jb2RpbmcgZGVjbGFyYXRpb25zLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0luIHBsYWluIEVuZ2xpc2g6IEJvdGggdHlwZXMgb2YgbGl0ZXJhbHMgY2FuIGJlIGVuY2xvc2VkIGluICcKKyAgICAgICAgICAgICdtYXRjaGluZ1xuJworICAgICAgICAgICAgJ3NpbmdsZSBxdW90ZXMgKCJcJyIpIG9yIGRvdWJsZSBxdW90ZXMgKCIiIikuICBUaGV5IGNhbiBhbHNvIGJlICcKKyAgICAgICAgICAgICdlbmNsb3NlZFxuJworICAgICAgICAgICAgJ2luIG1hdGNoaW5nIGdyb3VwcyBvZiB0aHJlZSBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyAodGhlc2UgYXJlXG4nCisgICAgICAgICAgICAnZ2VuZXJhbGx5IHJlZmVycmVkIHRvIGFzICp0cmlwbGUtcXVvdGVkIHN0cmluZ3MqKS4gIFRoZSAnCisgICAgICAgICAgICAnYmFja3NsYXNoXG4nCisgICAgICAgICAgICAnKCJcXCIpIGNoYXJhY3RlciBpcyB1c2VkIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgb3RoZXJ3aXNlIGhhdmUgJworICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICdzcGVjaWFsIG1lYW5pbmcsIHN1Y2ggYXMgbmV3bGluZSwgYmFja3NsYXNoIGl0c2VsZiwgb3IgdGhlIHF1b3RlXG4nCisgICAgICAgICAgICAnY2hhcmFjdGVyLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0J5dGVzIGxpdGVyYWxzIGFyZSBhbHdheXMgcHJlZml4ZWQgd2l0aCAiXCdiXCciIG9yICJcJ0JcJyI7IHRoZXkgJworICAgICAgICAgICAgJ3Byb2R1Y2VcbicKKyAgICAgICAgICAgICdhbiBpbnN0YW5jZSBvZiB0aGUgImJ5dGVzIiB0eXBlIGluc3RlYWQgb2YgdGhlICJzdHIiIHR5cGUuICBUaGV5ICcKKyAgICAgICAgICAgICdtYXlcbicKKyAgICAgICAgICAgICdvbmx5IGNvbnRhaW4gQVNDSUkgY2hhcmFjdGVyczsgYnl0ZXMgd2l0aCBhIG51bWVyaWMgdmFsdWUgb2YgMTI4ICcKKyAgICAgICAgICAgICdvclxuJworICAgICAgICAgICAgJ2dyZWF0ZXIgbXVzdCBiZSBleHByZXNzZWQgd2l0aCBlc2NhcGVzLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0FzIG9mIFB5dGhvbiAzLjMgaXQgaXMgcG9zc2libGUgYWdhaW4gdG8gcHJlZml4IHN0cmluZyBsaXRlcmFscyAnCisgICAgICAgICAgICAnd2l0aCBhXG4nCisgICAgICAgICAgICAnInUiIHByZWZpeCB0byBzaW1wbGlmeSBtYWludGVuYW5jZSBvZiBkdWFsIDIueCBhbmQgMy54ICcKKyAgICAgICAgICAgICdjb2RlYmFzZXMuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnQm90aCBzdHJpbmcgYW5kIGJ5dGVzIGxpdGVyYWxzIG1heSBvcHRpb25hbGx5IGJlIHByZWZpeGVkIHdpdGggYVxuJworICAgICAgICAgICAgJ2xldHRlciAiXCdyXCciIG9yICJcJ1JcJyI7IHN1Y2ggc3RyaW5ncyBhcmUgY2FsbGVkICpyYXcgc3RyaW5ncyogJworICAgICAgICAgICAgJ2FuZCB0cmVhdFxuJworICAgICAgICAgICAgJ2JhY2tzbGFzaGVzIGFzIGxpdGVyYWwgY2hhcmFjdGVycy4gIEFzIGEgcmVzdWx0LCBpbiBzdHJpbmcgJworICAgICAgICAgICAgJ2xpdGVyYWxzLFxuJworICAgICAgICAgICAgJyJcJ1xcVVwnIiBhbmQgIlwnXFx1XCciIGVzY2FwZXMgaW4gcmF3IHN0cmluZ3MgYXJlIG5vdCB0cmVhdGVkICcKKyAgICAgICAgICAgICdzcGVjaWFsbHkuXG4nCisgICAgICAgICAgICAiR2l2ZW4gdGhhdCBQeXRob24gMi54J3MgcmF3IHVuaWNvZGUgbGl0ZXJhbHMgYmVoYXZlIGRpZmZlcmVudGx5ICIKKyAgICAgICAgICAgICd0aGFuXG4nCisgICAgICAgICAgICAnUHl0aG9uIDMueFwncyB0aGUgIlwndXJcJyIgc3ludGF4IGlzIG5vdCBzdXBwb3J0ZWQuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy4zOiBUaGUgIlwncmJcJyIgcHJlZml4IG9mIHJhdyBieXRlcyBsaXRlcmFscyBoYXMgJworICAgICAgICAgICAgJ2JlZW5cbicKKyAgICAgICAgICAgICdhZGRlZCBhcyBhIHN5bm9ueW0gb2YgIlwnYnJcJyIuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy4zOiBTdXBwb3J0IGZvciB0aGUgdW5pY29kZSBsZWdhY3kgbGl0ZXJhbFxuJworICAgICAgICAgICAgJygidVwndmFsdWVcJyIpIHdhcyByZWludHJvZHVjZWQgdG8gc2ltcGxpZnkgdGhlIG1haW50ZW5hbmNlIG9mICcKKyAgICAgICAgICAgICdkdWFsXG4nCisgICAgICAgICAgICAnUHl0aG9uIDIueCBhbmQgMy54IGNvZGViYXNlcy4gU2VlICoqUEVQIDQxNCoqIGZvciBtb3JlICcKKyAgICAgICAgICAgICdpbmZvcm1hdGlvbi5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdBIHN0cmluZyBsaXRlcmFsIHdpdGggIlwnZlwnIiBvciAiXCdGXCciIGluIGl0cyBwcmVmaXggaXMgYSAnCisgICAgICAgICAgICAnKmZvcm1hdHRlZFxuJworICAgICAgICAgICAgJ3N0cmluZyBsaXRlcmFsKjsgc2VlIEZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMuICBUaGUgIlwnZlwnIiBtYXkgJworICAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICAnY29tYmluZWQgd2l0aCAiXCdyXCciLCBidXQgbm90IHdpdGggIlwnYlwnIiBvciAiXCd1XCciLCB0aGVyZWZvcmUgJworICAgICAgICAgICAgJ3Jhd1xuJworICAgICAgICAgICAgJ2Zvcm1hdHRlZCBzdHJpbmdzIGFyZSBwb3NzaWJsZSwgYnV0IGZvcm1hdHRlZCBieXRlcyBsaXRlcmFscyBhcmUgJworICAgICAgICAgICAgJ25vdC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdJbiB0cmlwbGUtcXVvdGVkIGxpdGVyYWxzLCB1bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgJworICAgICAgICAgICAgJ2FsbG93ZWRcbicKKyAgICAgICAgICAgICcoYW5kIGFyZSByZXRhaW5lZCksIGV4Y2VwdCB0aGF0IHRocmVlIHVuZXNjYXBlZCBxdW90ZXMgaW4gYSByb3dcbicKKyAgICAgICAgICAgICd0ZXJtaW5hdGUgdGhlIGxpdGVyYWwuICAoQSAicXVvdGUiIGlzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBvcGVuICcKKyAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICdsaXRlcmFsLCBpLmUuIGVpdGhlciAiXCciIG9yICIiIi4pXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVW5sZXNzIGFuICJcJ3JcJyIgb3IgIlwnUlwnIiBwcmVmaXggaXMgcHJlc2VudCwgZXNjYXBlIHNlcXVlbmNlcyAnCisgICAgICAgICAgICAnaW4gc3RyaW5nXG4nCisgICAgICAgICAgICAnYW5kIGJ5dGVzIGxpdGVyYWxzIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc2ltaWxhciB0byAnCisgICAgICAgICAgICAndGhvc2VcbicKKyAgICAgICAgICAgICd1c2VkIGJ5IFN0YW5kYXJkIEMuICBUaGUgcmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZTpcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCBFc2NhcGUgU2VxdWVuY2UgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgJworICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICcrPT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT0rXG4nCisgICAgICAgICAgICAnfCAiXFxuZXdsaW5lIiAgICAgICAgfCBCYWNrc2xhc2ggYW5kIG5ld2xpbmUgaWdub3JlZCAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcXFwiICAgICAgICAgICAgICB8IEJhY2tzbGFzaCAoIlxcIikgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcXCciICAgICAgICAgICAgICB8IFNpbmdsZSBxdW90ZSAoIlwnIikgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcIiIgICAgICAgICAgICAgIHwgRG91YmxlIHF1b3RlICgiIiIpICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXGEiICAgICAgICAgICAgICB8IEFTQ0lJIEJlbGwgKEJFTCkgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxiIiAgICAgICAgICAgICAgfCBBU0NJSSBCYWNrc3BhY2UgKEJTKSAgICAgICAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcZiIgICAgICAgICAgICAgIHwgQVNDSUkgRm9ybWZlZWQgKEZGKSAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXG4iICAgICAgICAgICAgICB8IEFTQ0lJIExpbmVmZWVkIChMRikgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxyIiAgICAgICAgICAgICAgfCBBU0NJSSBDYXJyaWFnZSBSZXR1cm4gKENSKSAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcdCIgICAgICAgICAgICAgIHwgQVNDSUkgSG9yaXpvbnRhbCBUYWIgKFRBQikgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXHYiICAgICAgICAgICAgICB8IEFTQ0lJIFZlcnRpY2FsIFRhYiAoVlQpICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxvb28iICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCBvY3RhbCB2YWx1ZSAqb29vKiAgfCAnCisgICAgICAgICAgICAnKDEsMykgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxceGhoIiAgICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggaGV4IHZhbHVlICpoaCogICAgIHwgJworICAgICAgICAgICAgJygyLDMpICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdFc2NhcGUgc2VxdWVuY2VzIG9ubHkgcmVjb2duaXplZCBpbiBzdHJpbmcgbGl0ZXJhbHMgYXJlOlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8IEVzY2FwZSBTZXF1ZW5jZSAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAnCisgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbicKKyAgICAgICAgICAgICd8ICJcXE57bmFtZX0iICAgICAgICB8IENoYXJhY3RlciBuYW1lZCAqbmFtZSogaW4gdGhlICAgICB8ICcKKyAgICAgICAgICAgICcoNCkgICAgIHxcbicKKyAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBkYXRhYmFzZSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAnCisgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXHV4eHh4IiAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIDE2LWJpdCBoZXggdmFsdWUgICB8ICcKKyAgICAgICAgICAgICcoNSkgICAgIHxcbicKKyAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgIHwgKnh4eHgqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAnCisgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXFV4eHh4eHh4eCIgICAgICB8IENoYXJhY3RlciB3aXRoIDMyLWJpdCBoZXggdmFsdWUgICB8ICcKKyAgICAgICAgICAgICcoNikgICAgIHxcbicKKyAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgIHwgKnh4eHh4eHh4KiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAnCisgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdOb3RlczpcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcxLiBBcyBpbiBTdGFuZGFyZCBDLCB1cCB0byB0aHJlZSBvY3RhbCBkaWdpdHMgYXJlIGFjY2VwdGVkLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJzIuIFVubGlrZSBpbiBTdGFuZGFyZCBDLCBleGFjdGx5IHR3byBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICczLiBJbiBhIGJ5dGVzIGxpdGVyYWwsIGhleGFkZWNpbWFsIGFuZCBvY3RhbCBlc2NhcGVzIGRlbm90ZSB0aGVcbicKKyAgICAgICAgICAgICcgICBieXRlIHdpdGggdGhlIGdpdmVuIHZhbHVlLiBJbiBhIHN0cmluZyBsaXRlcmFsLCB0aGVzZSBlc2NhcGVzXG4nCisgICAgICAgICAgICAnICAgZGVub3RlIGEgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnNC4gQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogU3VwcG9ydCBmb3IgbmFtZSBhbGlhc2VzIFsxXSBoYXMgYmVlblxuJworICAgICAgICAgICAgJyAgIGFkZGVkLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJzUuIEV4YWN0bHkgZm91ciBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICc2LiBBbnkgVW5pY29kZSBjaGFyYWN0ZXIgY2FuIGJlIGVuY29kZWQgdGhpcyB3YXkuICBFeGFjdGx5IGVpZ2h0XG4nCisgICAgICAgICAgICAnICAgaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVW5saWtlIFN0YW5kYXJkIEMsIGFsbCB1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmUgbGVmdCBpbiAnCisgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAnc3RyaW5nIHVuY2hhbmdlZCwgaS5lLiwgKnRoZSBiYWNrc2xhc2ggaXMgbGVmdCBpbiB0aGUgcmVzdWx0Ki4gICcKKyAgICAgICAgICAgICcoVGhpc1xuJworICAgICAgICAgICAgJ2JlaGF2aW9yIGlzIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZzogaWYgYW4gZXNjYXBlIHNlcXVlbmNlIGlzICcKKyAgICAgICAgICAgICdtaXN0eXBlZCxcbicKKyAgICAgICAgICAgICd0aGUgcmVzdWx0aW5nIG91dHB1dCBpcyBtb3JlIGVhc2lseSByZWNvZ25pemVkIGFzIGJyb2tlbi4pICBJdCBpcyAnCisgICAgICAgICAgICAnYWxzb1xuJworICAgICAgICAgICAgJ2ltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgb25seSByZWNvZ25pemVkIGluICcKKyAgICAgICAgICAgICdzdHJpbmdcbicKKyAgICAgICAgICAgICdsaXRlcmFscyBmYWxsIGludG8gdGhlIGNhdGVnb3J5IG9mIHVucmVjb2duaXplZCBlc2NhcGVzIGZvciAnCisgICAgICAgICAgICAnYnl0ZXNcbicKKyAgICAgICAgICAgICdsaXRlcmFscy5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdFdmVuIGluIGEgcmF3IGxpdGVyYWwsIHF1b3RlcyBjYW4gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLCAnCisgICAgICAgICAgICAnYnV0IHRoZVxuJworICAgICAgICAgICAgJ2JhY2tzbGFzaCByZW1haW5zIGluIHRoZSByZXN1bHQ7IGZvciBleGFtcGxlLCAiciJcXCIiIiBpcyBhICcKKyAgICAgICAgICAgICd2YWxpZFxuJworICAgICAgICAgICAgJ3N0cmluZyBsaXRlcmFsIGNvbnNpc3Rpbmcgb2YgdHdvIGNoYXJhY3RlcnM6IGEgYmFja3NsYXNoIGFuZCBhICcKKyAgICAgICAgICAgICdkb3VibGVcbicKKyAgICAgICAgICAgICdxdW90ZTsgInIiXFwiIiBpcyBub3QgYSB2YWxpZCBzdHJpbmcgbGl0ZXJhbCAoZXZlbiBhIHJhdyBzdHJpbmcgJworICAgICAgICAgICAgJ2Nhbm5vdFxuJworICAgICAgICAgICAgJ2VuZCBpbiBhbiBvZGQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzKS4gIFNwZWNpZmljYWxseSwgKmEgcmF3ICcKKyAgICAgICAgICAgICdsaXRlcmFsXG4nCisgICAgICAgICAgICAnY2Fubm90IGVuZCBpbiBhIHNpbmdsZSBiYWNrc2xhc2gqIChzaW5jZSB0aGUgYmFja3NsYXNoIHdvdWxkICcKKyAgICAgICAgICAgICdlc2NhcGVcbicKKyAgICAgICAgICAgICd0aGUgZm9sbG93aW5nIHF1b3RlIGNoYXJhY3RlcikuICBOb3RlIGFsc28gdGhhdCBhIHNpbmdsZSAnCisgICAgICAgICAgICAnYmFja3NsYXNoXG4nCisgICAgICAgICAgICAnZm9sbG93ZWQgYnkgYSBuZXdsaW5lIGlzIGludGVycHJldGVkIGFzIHRob3NlIHR3byBjaGFyYWN0ZXJzIGFzICcKKyAgICAgICAgICAgICdwYXJ0XG4nCisgICAgICAgICAgICAnb2YgdGhlIGxpdGVyYWwsICpub3QqIGFzIGEgbGluZSBjb250aW51YXRpb24uXG4nLAorICdzdWJzY3JpcHRpb25zJzogJ1xuJworICAgICAgICAgICAgICAgICAgJ1N1YnNjcmlwdGlvbnNcbicKKyAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQSBzdWJzY3JpcHRpb24gc2VsZWN0cyBhbiBpdGVtIG9mIGEgc2VxdWVuY2UgKHN0cmluZywgdHVwbGUgJworICAgICAgICAgICAgICAgICAgJ29yIGxpc3QpXG4nCisgICAgICAgICAgICAgICAgICAnb3IgbWFwcGluZyAoZGljdGlvbmFyeSkgb2JqZWN0OlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIHN1YnNjcmlwdGlvbiA6Oj0gcHJpbWFyeSAiWyIgZXhwcmVzc2lvbl9saXN0ICJdIlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IHRoYXQgc3VwcG9ydHMgJworICAgICAgICAgICAgICAgICAgJ3N1YnNjcmlwdGlvblxuJworICAgICAgICAgICAgICAgICAgJyhsaXN0cyBvciBkaWN0aW9uYXJpZXMgZm9yIGV4YW1wbGUpLiAgVXNlci1kZWZpbmVkIG9iamVjdHMgJworICAgICAgICAgICAgICAgICAgJ2NhbiBzdXBwb3J0XG4nCisgICAgICAgICAgICAgICAgICAnc3Vic2NyaXB0aW9uIGJ5IGRlZmluaW5nIGEgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdGb3IgYnVpbHQtaW4gb2JqZWN0cywgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBvYmplY3RzIHRoYXQgJworICAgICAgICAgICAgICAgICAgJ3N1cHBvcnRcbicKKyAgICAgICAgICAgICAgICAgICdzdWJzY3JpcHRpb246XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nLCB0aGUgZXhwcmVzc2lvbiBsaXN0IG11c3QgJworICAgICAgICAgICAgICAgICAgJ2V2YWx1YXRlIHRvIGFuXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0IHdob3NlIHZhbHVlIGlzIG9uZSBvZiB0aGUga2V5cyBvZiB0aGUgbWFwcGluZywgYW5kICcKKyAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICdzdWJzY3JpcHRpb24gc2VsZWN0cyB0aGUgdmFsdWUgaW4gdGhlIG1hcHBpbmcgdGhhdCAnCisgICAgICAgICAgICAgICAgICAnY29ycmVzcG9uZHMgdG8gdGhhdFxuJworICAgICAgICAgICAgICAgICAgJ2tleS4gIChUaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGEgdHVwbGUgZXhjZXB0IGlmIGl0IGhhcyAnCisgICAgICAgICAgICAgICAgICAnZXhhY3RseSBvbmVcbicKKyAgICAgICAgICAgICAgICAgICdpdGVtLilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJZiB0aGUgcHJpbWFyeSBpcyBhIHNlcXVlbmNlLCB0aGUgZXhwcmVzc2lvbiAobGlzdCkgbXVzdCAnCisgICAgICAgICAgICAgICAgICAnZXZhbHVhdGUgdG9cbicKKyAgICAgICAgICAgICAgICAgICdhbiBpbnRlZ2VyIG9yIGEgc2xpY2UgKGFzIGRpc2N1c3NlZCBpbiB0aGUgZm9sbG93aW5nICcKKyAgICAgICAgICAgICAgICAgICdzZWN0aW9uKS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgZm9ybWFsIHN5bnRheCBtYWtlcyBubyBzcGVjaWFsIHByb3Zpc2lvbiBmb3IgbmVnYXRpdmUgJworICAgICAgICAgICAgICAgICAgJ2luZGljZXMgaW5cbicKKyAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZXM7IGhvd2V2ZXIsIGJ1aWx0LWluIHNlcXVlbmNlcyBhbGwgcHJvdmlkZSBhICcKKyAgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICdtZXRob2QgdGhhdCBpbnRlcnByZXRzIG5lZ2F0aXZlIGluZGljZXMgYnkgYWRkaW5nIHRoZSAnCisgICAgICAgICAgICAgICAgICAnbGVuZ3RoIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlIHRvIHRoZSBpbmRleCAoc28gdGhhdCAieFstMV0iIHNlbGVjdHMgdGhlIGxhc3QgJworICAgICAgICAgICAgICAgICAgJ2l0ZW0gb2YgIngiKS5cbicKKyAgICAgICAgICAgICAgICAgICdUaGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhbiAnCisgICAgICAgICAgICAgICAgICAndGhlIG51bWJlclxuJworICAgICAgICAgICAgICAgICAgJ29mIGl0ZW1zIGluIHRoZSBzZXF1ZW5jZSwgYW5kIHRoZSBzdWJzY3JpcHRpb24gc2VsZWN0cyB0aGUgJworICAgICAgICAgICAgICAgICAgJ2l0ZW0gd2hvc2VcbicKKyAgICAgICAgICAgICAgICAgICdpbmRleCBpcyB0aGF0IHZhbHVlIChjb3VudGluZyBmcm9tIHplcm8pLiBTaW5jZSB0aGUgc3VwcG9ydCAnCisgICAgICAgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgaW5kaWNlcyBhbmQgc2xpY2luZyBvY2N1cnMgaW4gdGhlIG9iamVjdCdzICIKKyAgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICdtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgdG8gJworICAgICAgICAgICAgICAgICAgJ2V4cGxpY2l0bHkgYWRkXG4nCisgICAgICAgICAgICAgICAgICAndGhhdCBzdXBwb3J0LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgIkEgc3RyaW5nJ3MgaXRlbXMgYXJlIGNoYXJhY3RlcnMuICBBIGNoYXJhY3RlciBpcyBub3QgYSAiCisgICAgICAgICAgICAgICAgICAnc2VwYXJhdGUgZGF0YVxuJworICAgICAgICAgICAgICAgICAgJ3R5cGUgYnV0IGEgc3RyaW5nIG9mIGV4YWN0bHkgb25lIGNoYXJhY3Rlci5cbicsCisgJ3RydXRoJzogJ1xuJworICAgICAgICAgICdUcnV0aCBWYWx1ZSBUZXN0aW5nXG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0FueSBvYmplY3QgY2FuIGJlIHRlc3RlZCBmb3IgdHJ1dGggdmFsdWUsIGZvciB1c2UgaW4gYW4gImlmIiBvclxuJworICAgICAgICAgICcid2hpbGUiIGNvbmRpdGlvbiBvciBhcyBvcGVyYW5kIG9mIHRoZSBCb29sZWFuIG9wZXJhdGlvbnMgYmVsb3cuICcKKyAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgJ2ZvbGxvd2luZyB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZmFsc2U6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcqICJOb25lIlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnKiAiRmFsc2UiXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcqIHplcm8gb2YgYW55IG51bWVyaWMgdHlwZSwgZm9yIGV4YW1wbGUsICIwIiwgIjAuMCIsICIwaiIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcqIGFueSBlbXB0eSBzZXF1ZW5jZSwgZm9yIGV4YW1wbGUsICJcJ1wnIiwgIigpIiwgIltdIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyogYW55IGVtcHR5IG1hcHBpbmcsIGZvciBleGFtcGxlLCAie30iLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnKiBpbnN0YW5jZXMgb2YgdXNlci1kZWZpbmVkIGNsYXNzZXMsIGlmIHRoZSBjbGFzcyBkZWZpbmVzIGFcbicKKyAgICAgICAgICAnICAiX19ib29sX18oKSIgb3IgIl9fbGVuX18oKSIgbWV0aG9kLCB3aGVuIHRoYXQgbWV0aG9kIHJldHVybnMgdGhlXG4nCisgICAgICAgICAgJyAgaW50ZWdlciB6ZXJvIG9yICJib29sIiB2YWx1ZSAiRmFsc2UiLiBbMV1cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0FsbCBvdGhlciB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgdHJ1ZSAtLS0gc28gb2JqZWN0cyBvZiBtYW55IHR5cGVzICcKKyAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgJ2Fsd2F5cyB0cnVlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnT3BlcmF0aW9ucyBhbmQgYnVpbHQtaW4gZnVuY3Rpb25zIHRoYXQgaGF2ZSBhIEJvb2xlYW4gcmVzdWx0ICcKKyAgICAgICAgICAnYWx3YXlzXG4nCisgICAgICAgICAgJ3JldHVybiAiMCIgb3IgIkZhbHNlIiBmb3IgZmFsc2UgYW5kICIxIiBvciAiVHJ1ZSIgZm9yIHRydWUsIHVubGVzc1xuJworICAgICAgICAgICdvdGhlcndpc2Ugc3RhdGVkLiAoSW1wb3J0YW50IGV4Y2VwdGlvbjogdGhlIEJvb2xlYW4gb3BlcmF0aW9ucyAnCisgICAgICAgICAgJyJvciJcbicKKyAgICAgICAgICAnYW5kICJhbmQiIGFsd2F5cyByZXR1cm4gb25lIG9mIHRoZWlyIG9wZXJhbmRzLilcbicsCisgJ3RyeSc6ICdcbicKKyAgICAgICAgJ1RoZSAidHJ5IiBzdGF0ZW1lbnRcbicKKyAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlICJ0cnkiIHN0YXRlbWVudCBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwIGNvZGVcbicKKyAgICAgICAgJ2ZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6XG4nCisgICAgICAgICdcbicKKyAgICAgICAgJyAgIHRyeV9zdG10ICA6Oj0gdHJ5MV9zdG10IHwgdHJ5Ml9zdG10XG4nCisgICAgICAgICcgICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuJworICAgICAgICAnICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgW2V4cHJlc3Npb24gWyJhcyIgaWRlbnRpZmllcl1dICI6IiAnCisgICAgICAgICdzdWl0ZSkrXG4nCisgICAgICAgICcgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICAnICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV1cbicKKyAgICAgICAgJyAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4nCisgICAgICAgICcgICAgICAgICAgICAgICAgICJmaW5hbGx5IiAiOiIgc3VpdGVcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlICJleGNlcHQiIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4Y2VwdGlvbiBoYW5kbGVycy4gV2hlbiAnCisgICAgICAgICdub1xuJworICAgICAgICAnZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgY2xhdXNlLCBubyBleGNlcHRpb24gaGFuZGxlciBpc1xuJworICAgICAgICAnZXhlY3V0ZWQuIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgc3VpdGUsIGEgc2VhcmNoIGZvciAnCisgICAgICAgICdhblxuJworICAgICAgICAnZXhjZXB0aW9uIGhhbmRsZXIgaXMgc3RhcnRlZC4gIFRoaXMgc2VhcmNoIGluc3BlY3RzIHRoZSBleGNlcHQgJworICAgICAgICAnY2xhdXNlc1xuJworICAgICAgICAnaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uICBBbiAnCisgICAgICAgICdleHByZXNzaW9uLVxuJworICAgICAgICAnbGVzcyBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXMgYW55XG4nCisgICAgICAgICdleGNlcHRpb24uICBGb3IgYW4gZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXQgZXhwcmVzc2lvblxuJworICAgICAgICAnaXMgZXZhbHVhdGVkLCBhbmQgdGhlIGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24gaWYgdGhlIHJlc3VsdGluZ1xuJworICAgICAgICAnb2JqZWN0IGlzICJjb21wYXRpYmxlIiB3aXRoIHRoZSBleGNlcHRpb24uICBBbiBvYmplY3QgaXMgY29tcGF0aWJsZVxuJworICAgICAgICAnd2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIGNsYXNzIG9yIGEgYmFzZSBjbGFzcyBvZiB0aGUgJworICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICdvYmplY3Qgb3IgYSB0dXBsZSBjb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZSBleGNlcHRpb24uXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0lmIG5vIGV4Y2VwdCBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLCB0aGUgc2VhcmNoIGZvciBhbiAnCisgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgJ2hhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUgaW52b2NhdGlvbiAnCisgICAgICAgICdzdGFjay5cbicKKyAgICAgICAgJ1sxXVxuJworICAgICAgICAnXG4nCisgICAgICAgICdJZiB0aGUgZXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIGluIHRoZSBoZWFkZXIgb2YgYW4gZXhjZXB0IGNsYXVzZVxuJworICAgICAgICAncmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgYSBoYW5kbGVyIGlzIGNhbmNlbGVkICcKKyAgICAgICAgJ2FuZFxuJworICAgICAgICAnYSBzZWFyY2ggc3RhcnRzIGZvciB0aGUgbmV3IGV4Y2VwdGlvbiBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb25cbicKKyAgICAgICAgJ3RoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgInRyeSIgc3RhdGVtZW50ICcKKyAgICAgICAgJ3JhaXNlZFxuJworICAgICAgICAndGhlIGV4Y2VwdGlvbikuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1doZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIGFzc2lnbmVkIHRvXG4nCisgICAgICAgICd0aGUgdGFyZ2V0IHNwZWNpZmllZCBhZnRlciB0aGUgImFzIiBrZXl3b3JkIGluIHRoYXQgZXhjZXB0IGNsYXVzZSwgJworICAgICAgICAnaWZcbicKKyAgICAgICAgInByZXNlbnQsIGFuZCB0aGUgZXhjZXB0IGNsYXVzZSdzIHN1aXRlIGlzIGV4ZWN1dGVkLiAgQWxsIGV4Y2VwdFxuIgorICAgICAgICAnY2xhdXNlcyBtdXN0IGhhdmUgYW4gZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrICcKKyAgICAgICAgJ2lzXG4nCisgICAgICAgICdyZWFjaGVkLCBleGVjdXRpb24gY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5ICcKKyAgICAgICAgJ3N0YXRlbWVudC5cbicKKyAgICAgICAgJyhUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgJworICAgICAgICAnZXhjZXB0aW9uLFxuJworICAgICAgICAnYW5kIHRoZSBleGNlcHRpb24gb2NjdXJzIGluIHRoZSB0cnkgY2xhdXNlIG9mIHRoZSBpbm5lciBoYW5kbGVyLCB0aGVcbicKKyAgICAgICAgJ291dGVyIGhhbmRsZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKVxuJworICAgICAgICAnXG4nCisgICAgICAgICdXaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgY2xlYXJlZFxuJworICAgICAgICAnYXQgdGhlIGVuZCBvZiB0aGUgZXhjZXB0IGNsYXVzZS4gIFRoaXMgaXMgYXMgaWZcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgZXhjZXB0IEUgYXMgTjpcbicKKyAgICAgICAgJyAgICAgICBmb29cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnd2FzIHRyYW5zbGF0ZWQgdG9cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgZXhjZXB0IEUgYXMgTjpcbicKKyAgICAgICAgJyAgICAgICB0cnk6XG4nCisgICAgICAgICcgICAgICAgICAgIGZvb1xuJworICAgICAgICAnICAgICAgIGZpbmFsbHk6XG4nCisgICAgICAgICcgICAgICAgICAgIGRlbCBOXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gYmVcbicKKyAgICAgICAgJ2FibGUgdG8gcmVmZXIgdG8gaXQgYWZ0ZXIgdGhlIGV4Y2VwdCBjbGF1c2UuICBFeGNlcHRpb25zIGFyZSBjbGVhcmVkXG4nCisgICAgICAgICdiZWNhdXNlIHdpdGggdGhlIHRyYWNlYmFjayBhdHRhY2hlZCB0byB0aGVtLCB0aGV5IGZvcm0gYSByZWZlcmVuY2VcbicKKyAgICAgICAgJ2N5Y2xlIHdpdGggdGhlIHN0YWNrIGZyYW1lLCBrZWVwaW5nIGFsbCBsb2NhbHMgaW4gdGhhdCBmcmFtZSBhbGl2ZVxuJworICAgICAgICAndW50aWwgdGhlIG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAiQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2UncyBzdWl0ZSBpcyBleGVjdXRlZCwgZGV0YWlscyBhYm91dCB0aGVcbiIKKyAgICAgICAgJ2V4Y2VwdGlvbiBhcmUgc3RvcmVkIGluIHRoZSAic3lzIiBtb2R1bGUgYW5kIGNhbiBiZSBhY2Nlc3NlZCB2aWFcbicKKyAgICAgICAgJyJzeXMuZXhjX2luZm8oKSIuICJzeXMuZXhjX2luZm8oKSIgcmV0dXJucyBhIDMtdHVwbGUgY29uc2lzdGluZyBvZiAnCisgICAgICAgICd0aGVcbicKKyAgICAgICAgJ2V4Y2VwdGlvbiBjbGFzcywgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSBhbmQgYSB0cmFjZWJhY2sgb2JqZWN0IChzZWVcbicKKyAgICAgICAgJ3NlY3Rpb24gVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gdGhlXG4nCisgICAgICAgICdwcm9ncmFtIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuICAic3lzLmV4Y19pbmZvKCkiIHZhbHVlcyBhcmVcbicKKyAgICAgICAgJ3Jlc3RvcmVkIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuIHJldHVybmluZ1xuJworICAgICAgICAnZnJvbSBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSBvcHRpb25hbCAiZWxzZSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGlmIGFuZCB3aGVuIGNvbnRyb2wgZmxvd3Mgb2ZmXG4nCisgICAgICAgICd0aGUgZW5kIG9mIHRoZSAidHJ5IiBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSAiZWxzZSIgY2xhdXNlIGFyZVxuJworICAgICAgICAnbm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyAiZXhjZXB0IiBjbGF1c2VzLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdJZiAiZmluYWxseSIgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgXCdjbGVhbnVwXCcgaGFuZGxlci4gIFRoZSAnCisgICAgICAgICcidHJ5IlxuJworICAgICAgICAnY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gIElmICcKKyAgICAgICAgJ2FuXG4nCisgICAgICAgICdleGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90IGhhbmRsZWQsIHRoZVxuJworICAgICAgICAnZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZC4gICcKKyAgICAgICAgJ0lmXG4nCisgICAgICAgICd0aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgJworICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICdjbGF1c2UuICBJZiB0aGUgImZpbmFsbHkiIGNsYXVzZSByYWlzZXMgYW5vdGhlciBleGNlcHRpb24sIHRoZSBzYXZlZFxuJworICAgICAgICAnZXhjZXB0aW9uIGlzIHNldCBhcyB0aGUgY29udGV4dCBvZiB0aGUgbmV3IGV4Y2VwdGlvbi4gSWYgdGhlICcKKyAgICAgICAgJyJmaW5hbGx5IlxuJworICAgICAgICAnY2xhdXNlIGV4ZWN1dGVzIGEgInJldHVybiIgb3IgImJyZWFrIiBzdGF0ZW1lbnQsIHRoZSBzYXZlZCBleGNlcHRpb25cbicKKyAgICAgICAgJ2lzIGRpc2NhcmRlZDpcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgPj4+IGRlZiBmKCk6XG4nCisgICAgICAgICcgICAuLi4gICAgIHRyeTpcbicKKyAgICAgICAgJyAgIC4uLiAgICAgICAgIDEvMFxuJworICAgICAgICAnICAgLi4uICAgICBmaW5hbGx5OlxuJworICAgICAgICAnICAgLi4uICAgICAgICAgcmV0dXJuIDQyXG4nCisgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgJyAgID4+PiBmKClcbicKKyAgICAgICAgJyAgIDQyXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmdcbicKKyAgICAgICAgJ2V4ZWN1dGlvbiBvZiB0aGUgImZpbmFsbHkiIGNsYXVzZS5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnV2hlbiBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluIHRoZVxuJworICAgICAgICAnInRyeSIgc3VpdGUgb2YgYSAidHJ5Ii4uLiJmaW5hbGx5IiBzdGF0ZW1lbnQsIHRoZSAiZmluYWxseSIgY2xhdXNlICcKKyAgICAgICAgJ2lzXG4nCisgICAgICAgICdhbHNvIGV4ZWN1dGVkIFwnb24gdGhlIHdheSBvdXQuXCcgQSAiY29udGludWUiIHN0YXRlbWVudCBpcyBpbGxlZ2FsICcKKyAgICAgICAgJ2luXG4nCisgICAgICAgICd0aGUgImZpbmFsbHkiIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYSBwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnRcbicKKyAgICAgICAgJ2ltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZSBsaWZ0ZWQgaW4gdGhlIGZ1dHVyZSkuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsYXN0ICJyZXR1cm4iXG4nCisgICAgICAgICdzdGF0ZW1lbnQgZXhlY3V0ZWQuICBTaW5jZSB0aGUgImZpbmFsbHkiIGNsYXVzZSBhbHdheXMgZXhlY3V0ZXMsIGFcbicKKyAgICAgICAgJyJyZXR1cm4iIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgImZpbmFsbHkiIGNsYXVzZSB3aWxsIGFsd2F5cyBiZSAnCisgICAgICAgICd0aGVcbicKKyAgICAgICAgJ2xhc3Qgb25lIGV4ZWN1dGVkOlxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICA+Pj4gZGVmIGZvbygpOlxuJworICAgICAgICAnICAgLi4uICAgICB0cnk6XG4nCisgICAgICAgICIgICAuLi4gICAgICAgICByZXR1cm4gJ3RyeSdcbiIKKyAgICAgICAgJyAgIC4uLiAgICAgZmluYWxseTpcbicKKyAgICAgICAgIiAgIC4uLiAgICAgICAgIHJldHVybiAnZmluYWxseSdcbiIKKyAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAnICAgPj4+IGZvbygpXG4nCisgICAgICAgICIgICAnZmluYWxseSdcbiIKKyAgICAgICAgJ1xuJworICAgICAgICAnQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4nCisgICAgICAgICdFeGNlcHRpb25zLCBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlICJyYWlzZSIgc3RhdGVtZW50IHRvICcKKyAgICAgICAgJ2dlbmVyYXRlXG4nCisgICAgICAgICdleGNlcHRpb25zIG1heSBiZSBmb3VuZCBpbiBzZWN0aW9uIFRoZSByYWlzZSBzdGF0ZW1lbnQuXG4nLAorICd0eXBlcyc6ICdcbicKKyAgICAgICAgICAnVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5XG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQmVsb3cgaXMgYSBsaXN0IG9mIHRoZSB0eXBlcyB0aGF0IGFyZSBidWlsdCBpbnRvIFB5dGhvbi4gICcKKyAgICAgICAgICAnRXh0ZW5zaW9uXG4nCisgICAgICAgICAgJ21vZHVsZXMgKHdyaXR0ZW4gaW4gQywgSmF2YSwgb3Igb3RoZXIgbGFuZ3VhZ2VzLCBkZXBlbmRpbmcgb24gdGhlXG4nCisgICAgICAgICAgJ2ltcGxlbWVudGF0aW9uKSBjYW4gZGVmaW5lIGFkZGl0aW9uYWwgdHlwZXMuICBGdXR1cmUgdmVyc2lvbnMgb2ZcbicKKyAgICAgICAgICAnUHl0aG9uIG1heSBhZGQgdHlwZXMgdG8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuLCByYXRpb25hbCAnCisgICAgICAgICAgJ251bWJlcnMsXG4nCisgICAgICAgICAgJ2VmZmljaWVudGx5IHN0b3JlZCBhcnJheXMgb2YgaW50ZWdlcnMsIGV0Yy4pLCBhbHRob3VnaCBzdWNoICcKKyAgICAgICAgICAnYWRkaXRpb25zXG4nCisgICAgICAgICAgJ3dpbGwgb2Z0ZW4gYmUgcHJvdmlkZWQgdmlhIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGluc3RlYWQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdTb21lIG9mIHRoZSB0eXBlIGRlc2NyaXB0aW9ucyBiZWxvdyBjb250YWluIGEgcGFyYWdyYXBoIGxpc3RpbmdcbicKKyAgICAgICAgICAiJ3NwZWNpYWwgYXR0cmlidXRlcy4nICBUaGVzZSBhcmUgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvICIKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJ2ltcGxlbWVudGF0aW9uIGFuZCBhcmUgbm90IGludGVuZGVkIGZvciBnZW5lcmFsIHVzZS4gIFRoZWlyICcKKyAgICAgICAgICAnZGVmaW5pdGlvblxuJworICAgICAgICAgICdtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdOb25lXG4nCisgICAgICAgICAgJyAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCAnCisgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAnICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWUgIk5vbmUiLiAnCisgICAgICAgICAgJ0l0XG4nCisgICAgICAgICAgJyAgIGlzIHVzZWQgdG8gc2lnbmlmeSB0aGUgYWJzZW5jZSBvZiBhIHZhbHVlIGluIG1hbnkgc2l0dWF0aW9ucywgJworICAgICAgICAgICdlLmcuLFxuJworICAgICAgICAgICIgICBpdCBpcyByZXR1cm5lZCBmcm9tIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGV4cGxpY2l0bHkgcmV0dXJuXG4iCisgICAgICAgICAgJyAgIGFueXRoaW5nLiBJdHMgdHJ1dGggdmFsdWUgaXMgZmFsc2UuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdOb3RJbXBsZW1lbnRlZFxuJworICAgICAgICAgICcgICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggJworICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgJyAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lXG4nCisgICAgICAgICAgJyAgICJOb3RJbXBsZW1lbnRlZCIuIE51bWVyaWMgbWV0aG9kcyBhbmQgcmljaCBjb21wYXJpc29uIG1ldGhvZHNcbicKKyAgICAgICAgICAnICAgc2hvdWxkIHJldHVybiB0aGlzIHZhbHVlIGlmIHRoZXkgZG8gbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uICcKKyAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgJyAgIHRoZSBvcGVyYW5kcyBwcm92aWRlZC4gIChUaGUgaW50ZXJwcmV0ZXIgd2lsbCB0aGVuIHRyeSB0aGVcbicKKyAgICAgICAgICAnICAgcmVmbGVjdGVkIG9wZXJhdGlvbiwgb3Igc29tZSBvdGhlciBmYWxsYmFjaywgZGVwZW5kaW5nIG9uIHRoZVxuJworICAgICAgICAgICcgICBvcGVyYXRvci4pICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNlZSBJbXBsZW1lbnRpbmcgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBmb3IgbW9yZSBkZXRhaWxzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnRWxsaXBzaXNcbicKKyAgICAgICAgICAnICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoICcKKyAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICcgICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgbGl0ZXJhbCAiLi4uIiBvciB0aGVcbicKKyAgICAgICAgICAnICAgYnVpbHQtaW4gbmFtZSAiRWxsaXBzaXMiLiAgSXRzIHRydXRoIHZhbHVlIGlzIHRydWUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcibnVtYmVycy5OdW1iZXIiXG4nCisgICAgICAgICAgJyAgIFRoZXNlIGFyZSBjcmVhdGVkIGJ5IG51bWVyaWMgbGl0ZXJhbHMgYW5kIHJldHVybmVkIGFzIHJlc3VsdHMgJworICAgICAgICAgICdieVxuJworICAgICAgICAgICcgICBhcml0aG1ldGljIG9wZXJhdG9ycyBhbmQgYXJpdGhtZXRpYyBidWlsdC1pbiBmdW5jdGlvbnMuICAnCisgICAgICAgICAgJ051bWVyaWNcbicKKyAgICAgICAgICAnICAgb2JqZWN0cyBhcmUgaW1tdXRhYmxlOyBvbmNlIGNyZWF0ZWQgdGhlaXIgdmFsdWUgbmV2ZXIgY2hhbmdlcy5cbicKKyAgICAgICAgICAnICAgUHl0aG9uIG51bWJlcnMgYXJlIG9mIGNvdXJzZSBzdHJvbmdseSByZWxhdGVkIHRvIG1hdGhlbWF0aWNhbFxuJworICAgICAgICAgICcgICBudW1iZXJzLCBidXQgc3ViamVjdCB0byB0aGUgbGltaXRhdGlvbnMgb2YgbnVtZXJpY2FsICcKKyAgICAgICAgICAncmVwcmVzZW50YXRpb25cbicKKyAgICAgICAgICAnICAgaW4gY29tcHV0ZXJzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgUHl0aG9uIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBpbnRlZ2VycywgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgJworICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAnICAgY29tcGxleCBudW1iZXJzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgIm51bWJlcnMuSW50ZWdyYWwiXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBlbGVtZW50cyBmcm9tIHRoZSBtYXRoZW1hdGljYWwgc2V0IG9mICcKKyAgICAgICAgICAnaW50ZWdlcnNcbicKKyAgICAgICAgICAnICAgICAgKHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGludGVnZXJzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgSW50ZWdlcnMgKCJpbnQiKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgICAgVGhlc2UgcmVwcmVzZW50IG51bWJlcnMgaW4gYW4gdW5saW1pdGVkIHJhbmdlLCBzdWJqZWN0IHRvXG4nCisgICAgICAgICAgJyAgICAgICAgIGF2YWlsYWJsZSAodmlydHVhbCkgbWVtb3J5IG9ubHkuICBGb3IgdGhlIHB1cnBvc2Ugb2YgJworICAgICAgICAgICdzaGlmdFxuJworICAgICAgICAgICcgICAgICAgICBhbmQgbWFzayBvcGVyYXRpb25zLCBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBpcyBhc3N1bWVkLCAnCisgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICIgICAgICAgICBuZWdhdGl2ZSBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBpbiBhIHZhcmlhbnQgb2YgMidzXG4iCisgICAgICAgICAgJyAgICAgICAgIGNvbXBsZW1lbnQgd2hpY2ggZ2l2ZXMgdGhlIGlsbHVzaW9uIG9mIGFuIGluZmluaXRlIHN0cmluZyAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgICAgIHNpZ24gYml0cyBleHRlbmRpbmcgdG8gdGhlIGxlZnQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBCb29sZWFucyAoImJvb2wiKVxuJworICAgICAgICAgICcgICAgICAgICBUaGVzZSByZXByZXNlbnQgdGhlIHRydXRoIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZS4gIFRoZSB0d29cbicKKyAgICAgICAgICAnICAgICAgICAgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyAiRmFsc2UiIGFuZCAiVHJ1ZSIgYXJlICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgICAgIG9ubHkgQm9vbGVhbiBvYmplY3RzLiBUaGUgQm9vbGVhbiB0eXBlIGlzIGEgc3VidHlwZSBvZiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICAgICBpbnRlZ2VyIHR5cGUsIGFuZCBCb29sZWFuIHZhbHVlcyBiZWhhdmUgbGlrZSB0aGUgdmFsdWVzIDAgJworICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAnICAgICAgICAgMSwgcmVzcGVjdGl2ZWx5LCBpbiBhbG1vc3QgYWxsIGNvbnRleHRzLCB0aGUgZXhjZXB0aW9uICcKKyAgICAgICAgICAnYmVpbmdcbicKKyAgICAgICAgICAnICAgICAgICAgdGhhdCB3aGVuIGNvbnZlcnRlZCB0byBhIHN0cmluZywgdGhlIHN0cmluZ3MgIiJGYWxzZSIiIG9yXG4nCisgICAgICAgICAgJyAgICAgICAgICIiVHJ1ZSIiIGFyZSByZXR1cm5lZCwgcmVzcGVjdGl2ZWx5LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVGhlIHJ1bGVzIGZvciBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGFyZSBpbnRlbmRlZCB0byBnaXZlICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIG1vc3QgbWVhbmluZ2Z1bCBpbnRlcnByZXRhdGlvbiBvZiBzaGlmdCBhbmQgbWFzayBvcGVyYXRpb25zXG4nCisgICAgICAgICAgJyAgICAgIGludm9sdmluZyBuZWdhdGl2ZSBpbnRlZ2Vycy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICJudW1iZXJzLlJlYWwiICgiZmxvYXQiKVxuJworICAgICAgICAgICcgICAgICBUaGVzZSByZXByZXNlbnQgbWFjaGluZS1sZXZlbCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nICcKKyAgICAgICAgICAncG9pbnRcbicKKyAgICAgICAgICAnICAgICAgbnVtYmVycy4gWW91IGFyZSBhdCB0aGUgbWVyY3kgb2YgdGhlIHVuZGVybHlpbmcgbWFjaGluZVxuJworICAgICAgICAgICcgICAgICBhcmNoaXRlY3R1cmUgKGFuZCBDIG9yIEphdmEgaW1wbGVtZW50YXRpb24pIGZvciB0aGUgYWNjZXB0ZWRcbicKKyAgICAgICAgICAnICAgICAgcmFuZ2UgYW5kIGhhbmRsaW5nIG9mIG92ZXJmbG93LiBQeXRob24gZG9lcyBub3Qgc3VwcG9ydCAnCisgICAgICAgICAgJ3NpbmdsZS1cbicKKyAgICAgICAgICAnICAgICAgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnM7IHRoZSBzYXZpbmdzIGluIHByb2Nlc3NvciAnCisgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICcgICAgICBtZW1vcnkgdXNhZ2UgdGhhdCBhcmUgdXN1YWxseSB0aGUgcmVhc29uIGZvciB1c2luZyB0aGVzZSBhcmVcbicKKyAgICAgICAgICAnICAgICAgZHdhcmZlZCBieSB0aGUgb3ZlcmhlYWQgb2YgdXNpbmcgb2JqZWN0cyBpbiBQeXRob24sIHNvIHRoZXJlICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgbm8gcmVhc29uIHRvIGNvbXBsaWNhdGUgdGhlIGxhbmd1YWdlIHdpdGggdHdvIGtpbmRzIG9mICcKKyAgICAgICAgICAnZmxvYXRpbmdcbicKKyAgICAgICAgICAnICAgICAgcG9pbnQgbnVtYmVycy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICJudW1iZXJzLkNvbXBsZXgiICgiY29tcGxleCIpXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBjb21wbGV4IG51bWJlcnMgYXMgYSBwYWlyIG9mIG1hY2hpbmUtbGV2ZWxcbicKKyAgICAgICAgICAnICAgICAgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAgVGhlIHNhbWUgY2F2ZWF0cyAnCisgICAgICAgICAgJ2FwcGx5XG4nCisgICAgICAgICAgJyAgICAgIGFzIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBUaGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzICcKKyAgICAgICAgICAnb2YgYVxuJworICAgICAgICAgICcgICAgICBjb21wbGV4IG51bWJlciAieiIgY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSByZWFkLW9ubHlcbicKKyAgICAgICAgICAnICAgICAgYXR0cmlidXRlcyAiei5yZWFsIiBhbmQgInouaW1hZyIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdTZXF1ZW5jZXNcbicKKyAgICAgICAgICAnICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBvcmRlcmVkIHNldHMgaW5kZXhlZCBieSBub24tbmVnYXRpdmVcbicKKyAgICAgICAgICAnICAgbnVtYmVycy4gVGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIgcmV0dXJucyB0aGUgbnVtYmVyIG9mICcKKyAgICAgICAgICAnaXRlbXNcbicKKyAgICAgICAgICAnICAgb2YgYSBzZXF1ZW5jZS4gV2hlbiB0aGUgbGVuZ3RoIG9mIGEgc2VxdWVuY2UgaXMgKm4qLCB0aGUgaW5kZXggJworICAgICAgICAgICdzZXRcbicKKyAgICAgICAgICAnICAgY29udGFpbnMgdGhlIG51bWJlcnMgMCwgMSwgLi4uLCAqbiotMS4gIEl0ZW0gKmkqIG9mIHNlcXVlbmNlICphKiAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgIHNlbGVjdGVkIGJ5ICJhW2ldIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNlcXVlbmNlcyBhbHNvIHN1cHBvcnQgc2xpY2luZzogImFbaTpqXSIgc2VsZWN0cyBhbGwgaXRlbXMgd2l0aFxuJworICAgICAgICAgICcgICBpbmRleCAqayogc3VjaCB0aGF0ICppKiAiPD0iICprKiAiPCIgKmoqLiAgV2hlbiB1c2VkIGFzIGFuXG4nCisgICAgICAgICAgJyAgIGV4cHJlc3Npb24sIGEgc2xpY2UgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlLiAgVGhpcyAnCisgICAgICAgICAgJ2ltcGxpZXNcbicKKyAgICAgICAgICAnICAgdGhhdCB0aGUgaW5kZXggc2V0IGlzIHJlbnVtYmVyZWQgc28gdGhhdCBpdCBzdGFydHMgYXQgMC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNvbWUgc2VxdWVuY2VzIGFsc28gc3VwcG9ydCAiZXh0ZW5kZWQgc2xpY2luZyIgd2l0aCBhIHRoaXJkICcKKyAgICAgICAgICAnInN0ZXAiXG4nCisgICAgICAgICAgJyAgIHBhcmFtZXRlcjogImFbaTpqOmtdIiBzZWxlY3RzIGFsbCBpdGVtcyBvZiAqYSogd2l0aCBpbmRleCAqeCogJworICAgICAgICAgICd3aGVyZVxuJworICAgICAgICAgICcgICAieCA9IGkgKyBuKmsiLCAqbiogIj49IiAiMCIgYW5kICppKiAiPD0iICp4KiAiPCIgKmoqLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU2VxdWVuY2VzIGFyZSBkaXN0aW5ndWlzaGVkIGFjY29yZGluZyB0byB0aGVpciBtdXRhYmlsaXR5OlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgSW1tdXRhYmxlIHNlcXVlbmNlc1xuJworICAgICAgICAgICcgICAgICBBbiBvYmplY3Qgb2YgYW4gaW1tdXRhYmxlIHNlcXVlbmNlIHR5cGUgY2Fubm90IGNoYW5nZSBvbmNlIGl0ICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgY3JlYXRlZC4gIChJZiB0aGUgb2JqZWN0IGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gb3RoZXIgJworICAgICAgICAgICdvYmplY3RzLFxuJworICAgICAgICAgICcgICAgICB0aGVzZSBvdGhlciBvYmplY3RzIG1heSBiZSBtdXRhYmxlIGFuZCBtYXkgYmUgY2hhbmdlZDsgJworICAgICAgICAgICdob3dldmVyLFxuJworICAgICAgICAgICcgICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgYW4gJworICAgICAgICAgICdpbW11dGFibGVcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0IGNhbm5vdCBjaGFuZ2UuKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlczpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFN0cmluZ3NcbicKKyAgICAgICAgICAnICAgICAgICAgQSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgdGhhdCByZXByZXNlbnQgVW5pY29kZSAnCisgICAgICAgICAgJ2NvZGVcbicKKyAgICAgICAgICAnICAgICAgICAgcG9pbnRzLiBBbGwgdGhlIGNvZGUgcG9pbnRzIGluIHRoZSByYW5nZSAiVSswMDAwIC0gJworICAgICAgICAgICdVKzEwRkZGRiJcbicKKyAgICAgICAgICAiICAgICAgICAgY2FuIGJlIHJlcHJlc2VudGVkIGluIGEgc3RyaW5nLiAgUHl0aG9uIGRvZXNuJ3QgaGF2ZSBhICIKKyAgICAgICAgICAnImNoYXIiXG4nCisgICAgICAgICAgJyAgICAgICAgIHR5cGU7IGluc3RlYWQsIGV2ZXJ5IGNvZGUgcG9pbnQgaW4gdGhlIHN0cmluZyBpcyAnCisgICAgICAgICAgJ3JlcHJlc2VudGVkXG4nCisgICAgICAgICAgJyAgICAgICAgIGFzIGEgc3RyaW5nIG9iamVjdCB3aXRoIGxlbmd0aCAiMSIuICBUaGUgYnVpbHQtaW4gJworICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICcgICAgICAgICAib3JkKCkiIGNvbnZlcnRzIGEgY29kZSBwb2ludCBmcm9tIGl0cyBzdHJpbmcgZm9ybSB0byBhblxuJworICAgICAgICAgICcgICAgICAgICBpbnRlZ2VyIGluIHRoZSByYW5nZSAiMCAtIDEwRkZGRiI7ICJjaHIoKSIgY29udmVydHMgYW5cbicKKyAgICAgICAgICAnICAgICAgICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgIjAgLSAxMEZGRkYiIHRvIHRoZSBjb3JyZXNwb25kaW5nICcKKyAgICAgICAgICAnbGVuZ3RoXG4nCisgICAgICAgICAgJyAgICAgICAgICIxIiBzdHJpbmcgb2JqZWN0LiAic3RyLmVuY29kZSgpIiBjYW4gYmUgdXNlZCB0byBjb252ZXJ0ICcKKyAgICAgICAgICAnYVxuJworICAgICAgICAgICcgICAgICAgICAic3RyIiB0byAiYnl0ZXMiIHVzaW5nIHRoZSBnaXZlbiB0ZXh0IGVuY29kaW5nLCBhbmRcbicKKyAgICAgICAgICAnICAgICAgICAgImJ5dGVzLmRlY29kZSgpIiBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIHRoZSBvcHBvc2l0ZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFR1cGxlc1xuJworICAgICAgICAgICcgICAgICAgICBUaGUgaXRlbXMgb2YgYSB0dXBsZSBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiBUdXBsZXMgJworICAgICAgICAgICdvZlxuJworICAgICAgICAgICcgICAgICAgICB0d28gb3IgbW9yZSBpdGVtcyBhcmUgZm9ybWVkIGJ5IGNvbW1hLXNlcGFyYXRlZCBsaXN0cyBvZlxuJworICAgICAgICAgICIgICAgICAgICBleHByZXNzaW9ucy4gIEEgdHVwbGUgb2Ygb25lIGl0ZW0gKGEgJ3NpbmdsZXRvbicpIGNhbiBiZVxuIgorICAgICAgICAgICcgICAgICAgICBmb3JtZWQgYnkgYWZmaXhpbmcgYSBjb21tYSB0byBhbiBleHByZXNzaW9uIChhbiBleHByZXNzaW9uICcKKyAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAnICAgICAgICAgaXRzZWxmIGRvZXMgbm90IGNyZWF0ZSBhIHR1cGxlLCBzaW5jZSBwYXJlbnRoZXNlcyBtdXN0IGJlXG4nCisgICAgICAgICAgJyAgICAgICAgIHVzYWJsZSBmb3IgZ3JvdXBpbmcgb2YgZXhwcmVzc2lvbnMpLiAgQW4gZW1wdHkgdHVwbGUgY2FuICcKKyAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAnICAgICAgICAgZm9ybWVkIGJ5IGFuIGVtcHR5IHBhaXIgb2YgcGFyZW50aGVzZXMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBCeXRlc1xuJworICAgICAgICAgICcgICAgICAgICBBIGJ5dGVzIG9iamVjdCBpcyBhbiBpbW11dGFibGUgYXJyYXkuICBUaGUgaXRlbXMgYXJlICcKKyAgICAgICAgICAnOC1iaXRcbicKKyAgICAgICAgICAnICAgICAgICAgYnl0ZXMsIHJlcHJlc2VudGVkIGJ5IGludGVnZXJzIGluIHRoZSByYW5nZSAwIDw9IHggPCAyNTYuXG4nCisgICAgICAgICAgJyAgICAgICAgIEJ5dGVzIGxpdGVyYWxzIChsaWtlICJiXCdhYmNcJyIpIGFuZCB0aGUgYnVpbHQtaW4gJworICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICcgICAgICAgICAiYnl0ZXMoKSIgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IGJ5dGVzIG9iamVjdHMuICBBbHNvLFxuJworICAgICAgICAgICcgICAgICAgICBieXRlcyBvYmplY3RzIGNhbiBiZSBkZWNvZGVkIHRvIHN0cmluZ3MgdmlhIHRoZSAnCisgICAgICAgICAgJyJkZWNvZGUoKSJcbicKKyAgICAgICAgICAnICAgICAgICAgbWV0aG9kLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgTXV0YWJsZSBzZXF1ZW5jZXNcbicKKyAgICAgICAgICAnICAgICAgTXV0YWJsZSBzZXF1ZW5jZXMgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgdGhleSBhcmUgY3JlYXRlZC4gICcKKyAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgJyAgICAgIHN1YnNjcmlwdGlvbiBhbmQgc2xpY2luZyBub3RhdGlvbnMgY2FuIGJlIHVzZWQgYXMgdGhlIHRhcmdldCAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIGFzc2lnbm1lbnQgYW5kICJkZWwiIChkZWxldGUpIHN0YXRlbWVudHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIExpc3RzXG4nCisgICAgICAgICAgJyAgICAgICAgIFRoZSBpdGVtcyBvZiBhIGxpc3QgYXJlIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4gIExpc3RzICcKKyAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgJyAgICAgICAgIGZvcm1lZCBieSBwbGFjaW5nIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgJworICAgICAgICAgICdpblxuJworICAgICAgICAgICcgICAgICAgICBzcXVhcmUgYnJhY2tldHMuIChOb3RlIHRoYXQgdGhlcmUgYXJlIG5vIHNwZWNpYWwgY2FzZXMgJworICAgICAgICAgICduZWVkZWRcbicKKyAgICAgICAgICAnICAgICAgICAgdG8gZm9ybSBsaXN0cyBvZiBsZW5ndGggMCBvciAxLilcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEJ5dGUgQXJyYXlzXG4nCisgICAgICAgICAgJyAgICAgICAgIEEgYnl0ZWFycmF5IG9iamVjdCBpcyBhIG11dGFibGUgYXJyYXkuIFRoZXkgYXJlIGNyZWF0ZWQgJworICAgICAgICAgICdieVxuJworICAgICAgICAgICcgICAgICAgICB0aGUgYnVpbHQtaW4gImJ5dGVhcnJheSgpIiBjb25zdHJ1Y3Rvci4gIEFzaWRlIGZyb20gYmVpbmdcbicKKyAgICAgICAgICAnICAgICAgICAgbXV0YWJsZSAoYW5kIGhlbmNlIHVuaGFzaGFibGUpLCBieXRlIGFycmF5cyBvdGhlcndpc2UgJworICAgICAgICAgICdwcm92aWRlXG4nCisgICAgICAgICAgJyAgICAgICAgIHRoZSBzYW1lIGludGVyZmFjZSBhbmQgZnVuY3Rpb25hbGl0eSBhcyBpbW11dGFibGUgYnl0ZXNcbicKKyAgICAgICAgICAnICAgICAgICAgb2JqZWN0cy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlICJhcnJheSIgcHJvdmlkZXMgYW4gYWRkaXRpb25hbCBleGFtcGxlICcKKyAgICAgICAgICAnb2YgYVxuJworICAgICAgICAgICcgICAgICBtdXRhYmxlIHNlcXVlbmNlIHR5cGUsIGFzIGRvZXMgdGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnU2V0IHR5cGVzXG4nCisgICAgICAgICAgJyAgIFRoZXNlIHJlcHJlc2VudCB1bm9yZGVyZWQsIGZpbml0ZSBzZXRzIG9mIHVuaXF1ZSwgaW1tdXRhYmxlXG4nCisgICAgICAgICAgJyAgIG9iamVjdHMuIEFzIHN1Y2gsIHRoZXkgY2Fubm90IGJlIGluZGV4ZWQgYnkgYW55IHN1YnNjcmlwdC4gJworICAgICAgICAgICdIb3dldmVyLFxuJworICAgICAgICAgICcgICB0aGV5IGNhbiBiZSBpdGVyYXRlZCBvdmVyLCBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSJcbicKKyAgICAgICAgICAnICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgc2V0LiBDb21tb24gdXNlcyBmb3Igc2V0cyBhcmUgJworICAgICAgICAgICdmYXN0XG4nCisgICAgICAgICAgJyAgIG1lbWJlcnNoaXAgdGVzdGluZywgcmVtb3ZpbmcgZHVwbGljYXRlcyBmcm9tIGEgc2VxdWVuY2UsIGFuZFxuJworICAgICAgICAgICcgICBjb21wdXRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgc3VjaCBhcyBpbnRlcnNlY3Rpb24sIHVuaW9uLFxuJworICAgICAgICAgICcgICBkaWZmZXJlbmNlLCBhbmQgc3ltbWV0cmljIGRpZmZlcmVuY2UuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBGb3Igc2V0IGVsZW1lbnRzLCB0aGUgc2FtZSBpbW11dGFiaWxpdHkgcnVsZXMgYXBwbHkgYXMgZm9yXG4nCisgICAgICAgICAgJyAgIGRpY3Rpb25hcnkga2V5cy4gTm90ZSB0aGF0IG51bWVyaWMgdHlwZXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzICcKKyAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgJyAgIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbCAoZS5nLiwgIjEiIGFuZFxuJworICAgICAgICAgICcgICAiMS4wIiksIG9ubHkgb25lIG9mIHRoZW0gY2FuIGJlIGNvbnRhaW5lZCBpbiBhIHNldC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGludHJpbnNpYyBzZXQgdHlwZXM6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBTZXRzXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBhIG11dGFibGUgc2V0LiBUaGV5IGFyZSBjcmVhdGVkIGJ5IHRoZSAnCisgICAgICAgICAgJ2J1aWx0LWluXG4nCisgICAgICAgICAgJyAgICAgICJzZXQoKSIgY29uc3RydWN0b3IgYW5kIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIGJ5ICcKKyAgICAgICAgICAnc2V2ZXJhbFxuJworICAgICAgICAgICcgICAgICBtZXRob2RzLCBzdWNoIGFzICJhZGQoKSIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBGcm96ZW4gc2V0c1xuJworICAgICAgICAgICcgICAgICBUaGVzZSByZXByZXNlbnQgYW4gaW1tdXRhYmxlIHNldC4gIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlXG4nCisgICAgICAgICAgJyAgICAgIGJ1aWx0LWluICJmcm96ZW5zZXQoKSIgY29uc3RydWN0b3IuICBBcyBhIGZyb3plbnNldCBpcyAnCisgICAgICAgICAgJ2ltbXV0YWJsZVxuJworICAgICAgICAgICcgICAgICBhbmQgKmhhc2hhYmxlKiwgaXQgY2FuIGJlIHVzZWQgYWdhaW4gYXMgYW4gZWxlbWVudCBvZiAnCisgICAgICAgICAgJ2Fub3RoZXJcbicKKyAgICAgICAgICAnICAgICAgc2V0LCBvciBhcyBhIGRpY3Rpb25hcnkga2V5LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnTWFwcGluZ3NcbicKKyAgICAgICAgICAnICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBzZXRzIG9mIG9iamVjdHMgaW5kZXhlZCBieSBhcmJpdHJhcnkgJworICAgICAgICAgICdpbmRleFxuJworICAgICAgICAgICcgICBzZXRzLiBUaGUgc3Vic2NyaXB0IG5vdGF0aW9uICJhW2tdIiBzZWxlY3RzIHRoZSBpdGVtIGluZGV4ZWQgYnkgJworICAgICAgICAgICciayJcbicKKyAgICAgICAgICAnICAgZnJvbSB0aGUgbWFwcGluZyAiYSI7IHRoaXMgY2FuIGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMgYW5kIGFzICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgIHRhcmdldCBvZiBhc3NpZ25tZW50cyBvciAiZGVsIiBzdGF0ZW1lbnRzLiBUaGUgYnVpbHQtaW4gJworICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICcgICAibGVuKCkiIHJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIG1hcHBpbmcuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBUaGVyZSBpcyBjdXJyZW50bHkgYSBzaW5nbGUgaW50cmluc2ljIG1hcHBpbmcgdHlwZTpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIERpY3Rpb25hcmllc1xuJworICAgICAgICAgICcgICAgICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IG5lYXJseVxuJworICAgICAgICAgICcgICAgICBhcmJpdHJhcnkgdmFsdWVzLiAgVGhlIG9ubHkgdHlwZXMgb2YgdmFsdWVzIG5vdCBhY2NlcHRhYmxlICcKKyAgICAgICAgICAnYXNcbicKKyAgICAgICAgICAnICAgICAga2V5cyBhcmUgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMgb3IgZGljdGlvbmFyaWVzIG9yIG90aGVyXG4nCisgICAgICAgICAgJyAgICAgIG11dGFibGUgdHlwZXMgdGhhdCBhcmUgY29tcGFyZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gYnkgJworICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAnICAgICAgaWRlbnRpdHksIHRoZSByZWFzb24gYmVpbmcgdGhhdCB0aGUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAiICAgICAgZGljdGlvbmFyaWVzIHJlcXVpcmVzIGEga2V5J3MgaGFzaCB2YWx1ZSB0byByZW1haW4gY29uc3RhbnQuXG4iCisgICAgICAgICAgJyAgICAgIE51bWVyaWMgdHlwZXMgdXNlZCBmb3Iga2V5cyBvYmV5IHRoZSBub3JtYWwgcnVsZXMgZm9yICcKKyAgICAgICAgICAnbnVtZXJpY1xuJworICAgICAgICAgICcgICAgICBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kICcKKyAgICAgICAgICAnIjEuMCIpXG4nCisgICAgICAgICAgJyAgICAgIHRoZW4gdGhleSBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgdG8gaW5kZXggdGhlIHNhbWVcbicKKyAgICAgICAgICAnICAgICAgZGljdGlvbmFyeSBlbnRyeS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIERpY3Rpb25hcmllcyBhcmUgbXV0YWJsZTsgdGhleSBjYW4gYmUgY3JlYXRlZCBieSB0aGUgInsuLi59IlxuJworICAgICAgICAgICcgICAgICBub3RhdGlvbiAoc2VlIHNlY3Rpb24gRGljdGlvbmFyeSBkaXNwbGF5cykuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBUaGUgZXh0ZW5zaW9uIG1vZHVsZXMgImRibS5uZGJtIiBhbmQgImRibS5nbnUiIHByb3ZpZGVcbicKKyAgICAgICAgICAnICAgICAgYWRkaXRpb25hbCBleGFtcGxlcyBvZiBtYXBwaW5nIHR5cGVzLCBhcyBkb2VzIHRoZSAnCisgICAgICAgICAgJyJjb2xsZWN0aW9ucyJcbicKKyAgICAgICAgICAnICAgICAgbW9kdWxlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQ2FsbGFibGUgdHlwZXNcbicKKyAgICAgICAgICAnICAgVGhlc2UgYXJlIHRoZSB0eXBlcyB0byB3aGljaCB0aGUgZnVuY3Rpb24gY2FsbCBvcGVyYXRpb24gKHNlZVxuJworICAgICAgICAgICcgICBzZWN0aW9uIENhbGxzKSBjYW4gYmUgYXBwbGllZDpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFVzZXItZGVmaW5lZCBmdW5jdGlvbnNcbicKKyAgICAgICAgICAnICAgICAgQSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IGlzIGNyZWF0ZWQgYnkgYSBmdW5jdGlvblxuJworICAgICAgICAgICcgICAgICBkZWZpbml0aW9uIChzZWUgc2VjdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9ucykuICBJdCBzaG91bGQgYmVcbicKKyAgICAgICAgICAnICAgICAgY2FsbGVkIHdpdGggYW4gYXJndW1lbnQgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIG51bWJlciBvZiAnCisgICAgICAgICAgJ2l0ZW1zXG4nCisgICAgICAgICAgIiAgICAgIGFzIHRoZSBmdW5jdGlvbidzIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdC5cbiIKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgYXR0cmlidXRlczpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnICAgICAgfCBBdHRyaWJ1dGUgICAgICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fZG9jX18iICAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyAnCisgICAgICAgICAgJ2RvY3VtZW50YXRpb24gICAgfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZywgb3IgIk5vbmUiIGlmICAgICAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdW5hdmFpbGFibGU7IG5vdCBpbmhlcml0ZWQgYnkgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdWJjbGFzc2VzICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnICAgICAgfCAiX19uYW1lX18iICAgICAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9uXCdzICcKKyAgICAgICAgICAnbmFtZSAgICAgICAgICAgICB8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX3F1YWxuYW1lX18iICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgKnF1YWxpZmllZCAnCisgICAgICAgICAgJ25hbWUqIHwgV3JpdGFibGUgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOZXcgaW4gdmVyc2lvbiAzLjMuICAgICAgICAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnICAgICAgfCAiX19tb2R1bGVfXyIgICAgICAgICAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgICAgICAnCisgICAgICAgICAgJ3wgV3JpdGFibGUgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbiB3YXMgZGVmaW5lZCBpbiwgb3IgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJOb25lIiBpZiB1bmF2YWlsYWJsZS4gICAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2RlZmF1bHRzX18iICAgICAgICAgICAgfCBBIHR1cGxlIGNvbnRhaW5pbmcgZGVmYXVsdCAgICAgICcKKyAgICAgICAgICAnfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyZ3VtZW50IHZhbHVlcyBmb3IgdGhvc2UgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnRzIHRoYXQgaGF2ZSBkZWZhdWx0cywgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvciAiTm9uZSIgaWYgbm8gYXJndW1lbnRzIGhhdmUgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEgZGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2NvZGVfXyIgICAgICAgICAgICAgICAgfCBUaGUgY29kZSBvYmplY3QgcmVwcmVzZW50aW5nICAgICcKKyAgICAgICAgICAnfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb21waWxlZCBmdW5jdGlvbiBib2R5LiAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2dsb2JhbHNfXyIgICAgICAgICAgICAgfCBBIHJlZmVyZW5jZSB0byB0aGUgZGljdGlvbmFyeSAgICcKKyAgICAgICAgICAnfCBSZWFkLW9ubHkgICB8XG4nCisgICAgICAgICAgIiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoYXQgaG9sZHMgdGhlIGZ1bmN0aW9uJ3MgICAgICAgIgorICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2xvYmFsIHZhcmlhYmxlcyAtLS0gdGhlIGdsb2JhbCAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZSBpbiAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdoaWNoIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZC4gJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2RpY3RfXyIgICAgICAgICAgICAgICAgfCBUaGUgbmFtZXNwYWNlIHN1cHBvcnRpbmcgICAgICAgICcKKyAgICAgICAgICAnfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyYml0cmFyeSBmdW5jdGlvbiBhdHRyaWJ1dGVzLiAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2Nsb3N1cmVfXyIgICAgICAgICAgICAgfCAiTm9uZSIgb3IgYSB0dXBsZSBvZiBjZWxscyB0aGF0ICcKKyAgICAgICAgICAnfCBSZWFkLW9ubHkgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbnRhaW4gYmluZGluZ3MgZm9yIHRoZSAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAiICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb24ncyBmcmVlIHZhcmlhYmxlcy4gICAgICAiCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fYW5ub3RhdGlvbnNfXyIgICAgICAgICB8IEEgZGljdCBjb250YWluaW5nIGFubm90YXRpb25zICAgJworICAgICAgICAgICd8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2YgcGFyYW1ldGVycy4gIFRoZSBrZXlzIG9mIHRoZSAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkaWN0IGFyZSB0aGUgcGFyYW1ldGVyIG5hbWVzLCAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFuZCAiXCdyZXR1cm5cJyIgZm9yIHRoZSAnCisgICAgICAgICAgJ3JldHVybiAgIHwgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbm5vdGF0aW9uLCBpZiBwcm92aWRlZC4gICAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnICAgICAgfCAiX19rd2RlZmF1bHRzX18iICAgICAgICAgIHwgQSBkaWN0IGNvbnRhaW5pbmcgZGVmYXVsdHMgZm9yICAnCisgICAgICAgICAgJ3wgV3JpdGFibGUgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrZXl3b3JkLW9ubHkgcGFyYW1ldGVycy4gICAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIE1vc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgbGFiZWxsZWQgIldyaXRhYmxlIiBjaGVjayB0aGUgdHlwZSBvZiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBhc3NpZ25lZCB2YWx1ZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEZ1bmN0aW9uIG9iamVjdHMgYWxzbyBzdXBwb3J0IGdldHRpbmcgYW5kIHNldHRpbmcgYXJiaXRyYXJ5XG4nCisgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZXMsIHdoaWNoIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gYXR0YWNoICcKKyAgICAgICAgICAnbWV0YWRhdGFcbicKKyAgICAgICAgICAnICAgICAgdG8gZnVuY3Rpb25zLiAgUmVndWxhciBhdHRyaWJ1dGUgZG90LW5vdGF0aW9uIGlzIHVzZWQgdG8gZ2V0ICcKKyAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgJyAgICAgIHNldCBzdWNoIGF0dHJpYnV0ZXMuICpOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gJworICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgJyAgICAgIHN1cHBvcnRzIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4gJworICAgICAgICAgICdGdW5jdGlvblxuJworICAgICAgICAgICcgICAgICBhdHRyaWJ1dGVzIG9uIGJ1aWx0LWluIGZ1bmN0aW9ucyBtYXkgYmUgc3VwcG9ydGVkIGluIHRoZVxuJworICAgICAgICAgICcgICAgICBmdXR1cmUuKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAiICAgICAgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uJ3MgZGVmaW5pdGlvbiBjYW4gYmVcbiIKKyAgICAgICAgICAnICAgICAgcmV0cmlldmVkIGZyb20gaXRzIGNvZGUgb2JqZWN0OyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mICcKKyAgICAgICAgICAnaW50ZXJuYWxcbicKKyAgICAgICAgICAnICAgICAgdHlwZXMgYmVsb3cuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBJbnN0YW5jZSBtZXRob2RzXG4nCisgICAgICAgICAgJyAgICAgIEFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgY29tYmluZXMgYSBjbGFzcywgYSBjbGFzcyBpbnN0YW5jZSAnCisgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICcgICAgICBhbnkgY2FsbGFibGUgb2JqZWN0IChub3JtYWxseSBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbikuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiX19zZWxmX18iIGlzIHRoZSBjbGFzcyAnCisgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdCwgIl9fZnVuY19fIiBpcyB0aGUgZnVuY3Rpb24gb2JqZWN0OyAiX19kb2NfXyIgaXMgdGhlXG4nCisgICAgICAgICAgJyAgICAgIG1ldGhvZFwncyBkb2N1bWVudGF0aW9uIChzYW1lIGFzICJfX2Z1bmNfXy5fX2RvY19fIik7ICcKKyAgICAgICAgICAnIl9fbmFtZV9fIlxuJworICAgICAgICAgICcgICAgICBpcyB0aGUgbWV0aG9kIG5hbWUgKHNhbWUgYXMgIl9fZnVuY19fLl9fbmFtZV9fIik7ICcKKyAgICAgICAgICAnIl9fbW9kdWxlX18iXG4nCisgICAgICAgICAgJyAgICAgIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlIG1ldGhvZCB3YXMgZGVmaW5lZCBpbiwgb3IgJworICAgICAgICAgICciTm9uZSJcbicKKyAgICAgICAgICAnICAgICAgaWYgdW5hdmFpbGFibGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBNZXRob2RzIGFsc28gc3VwcG9ydCBhY2Nlc3NpbmcgKGJ1dCBub3Qgc2V0dGluZykgdGhlICcKKyAgICAgICAgICAnYXJiaXRyYXJ5XG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3RzIG1heSBiZSBjcmVhdGVkIHdoZW4gZ2V0dGluZyBhblxuJworICAgICAgICAgICcgICAgICBhdHRyaWJ1dGUgb2YgYSBjbGFzcyAocGVyaGFwcyB2aWEgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyksICcKKyAgICAgICAgICAnaWZcbicKKyAgICAgICAgICAnICAgICAgdGhhdCBhdHRyaWJ1dGUgaXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IG9yIGEgY2xhc3NcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kIG9iamVjdC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYSAnCisgICAgICAgICAgJ3VzZXItXG4nCisgICAgICAgICAgJyAgICAgIGRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IGZyb20gYSBjbGFzcyB2aWEgb25lIG9mIGl0cyAnCisgICAgICAgICAgJ2luc3RhbmNlcyxcbicKKyAgICAgICAgICAnICAgICAgaXRzICJfX3NlbGZfXyIgYXR0cmlidXRlIGlzIHRoZSBpbnN0YW5jZSwgYW5kIHRoZSBtZXRob2QgJworICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAnICAgICAgaXMgc2FpZCB0byBiZSBib3VuZC4gIFRoZSBuZXcgbWV0aG9kXCdzICJfX2Z1bmNfXyIgYXR0cmlidXRlICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIG9iamVjdC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFdoZW4gYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmdcbicKKyAgICAgICAgICAnICAgICAgYW5vdGhlciBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgdGhlIGJlaGF2aW91ciAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBzYW1lIGFzIGZvciBhIGZ1bmN0aW9uIG9iamVjdCwgZXhjZXB0IHRoYXQgdGhlICcKKyAgICAgICAgICAnIl9fZnVuY19fIlxuJworICAgICAgICAgICcgICAgICBhdHRyaWJ1dGUgb2YgdGhlIG5ldyBpbnN0YW5jZSBpcyBub3QgdGhlIG9yaWdpbmFsIG1ldGhvZCAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICBidXQgaXRzICJfX2Z1bmNfXyIgYXR0cmlidXRlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhICcKKyAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kIG9iamVjdCBmcm9tIGEgY2xhc3Mgb3IgaW5zdGFuY2UsIGl0cyAiX19zZWxmX18iICcKKyAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgJyAgICAgIGlzIHRoZSBjbGFzcyBpdHNlbGYsIGFuZCBpdHMgIl9fZnVuY19fIiBhdHRyaWJ1dGUgaXMgdGhlXG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uIG9iamVjdCB1bmRlcmx5aW5nIHRoZSBjbGFzcyBtZXRob2QuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY2FsbGVkLCB0aGUgdW5kZXJseWluZ1xuJworICAgICAgICAgICcgICAgICBmdW5jdGlvbiAoIl9fZnVuY19fIikgaXMgY2FsbGVkLCBpbnNlcnRpbmcgdGhlIGNsYXNzICcKKyAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAnICAgICAgKCJfX3NlbGZfXyIpIGluIGZyb250IG9mIHRoZSBhcmd1bWVudCBsaXN0LiAgRm9yIGluc3RhbmNlLCAnCisgICAgICAgICAgJ3doZW5cbicKKyAgICAgICAgICAnICAgICAgIkMiIGlzIGEgY2xhc3Mgd2hpY2ggY29udGFpbnMgYSBkZWZpbml0aW9uIGZvciBhIGZ1bmN0aW9uICcKKyAgICAgICAgICAnImYoKSIsXG4nCisgICAgICAgICAgJyAgICAgIGFuZCAieCIgaXMgYW4gaW5zdGFuY2Ugb2YgIkMiLCBjYWxsaW5nICJ4LmYoMSkiIGlzIGVxdWl2YWxlbnQgJworICAgICAgICAgICd0b1xuJworICAgICAgICAgICcgICAgICBjYWxsaW5nICJDLmYoeCwgMSkiLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGRlcml2ZWQgZnJvbSBhIGNsYXNzICcKKyAgICAgICAgICAnbWV0aG9kXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdCwgdGhlICJjbGFzcyBpbnN0YW5jZSIgc3RvcmVkIGluICJfX3NlbGZfXyIgd2lsbCAnCisgICAgICAgICAgJ2FjdHVhbGx5XG4nCisgICAgICAgICAgJyAgICAgIGJlIHRoZSBjbGFzcyBpdHNlbGYsIHNvIHRoYXQgY2FsbGluZyBlaXRoZXIgInguZigxKSIgb3IgJworICAgICAgICAgICciQy5mKDEpIlxuJworICAgICAgICAgICcgICAgICBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgImYoQywxKSIgd2hlcmUgImYiIGlzIHRoZSAnCisgICAgICAgICAgJ3VuZGVybHlpbmdcbicKKyAgICAgICAgICAnICAgICAgZnVuY3Rpb24uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBOb3RlIHRoYXQgdGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gZnVuY3Rpb24gb2JqZWN0IHRvICcKKyAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kIG9iamVjdCBoYXBwZW5zIGVhY2ggdGltZSB0aGUgYXR0cmlidXRlIGlzIHJldHJpZXZlZCAnCisgICAgICAgICAgJ2Zyb21cbicKKyAgICAgICAgICAnICAgICAgdGhlIGluc3RhbmNlLiAgSW4gc29tZSBjYXNlcywgYSBmcnVpdGZ1bCBvcHRpbWl6YXRpb24gaXMgdG9cbicKKyAgICAgICAgICAnICAgICAgYXNzaWduIHRoZSBhdHRyaWJ1dGUgdG8gYSBsb2NhbCB2YXJpYWJsZSBhbmQgY2FsbCB0aGF0IGxvY2FsXG4nCisgICAgICAgICAgJyAgICAgIHZhcmlhYmxlLiBBbHNvIG5vdGljZSB0aGF0IHRoaXMgdHJhbnNmb3JtYXRpb24gb25seSBoYXBwZW5zICcKKyAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgJyAgICAgIHVzZXItZGVmaW5lZCBmdW5jdGlvbnM7IG90aGVyIGNhbGxhYmxlIG9iamVjdHMgKGFuZCBhbGwgbm9uLVxuJworICAgICAgICAgICcgICAgICBjYWxsYWJsZSBvYmplY3RzKSBhcmUgcmV0cmlldmVkIHdpdGhvdXQgdHJhbnNmb3JtYXRpb24uICBJdCAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgICAgIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIHdoaWNoIGFyZVxuJworICAgICAgICAgICcgICAgICBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgaW5zdGFuY2UgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gYm91bmRcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kczsgdGhpcyAqb25seSogaGFwcGVucyB3aGVuIHRoZSBmdW5jdGlvbiBpcyBhbiAnCisgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICcgICAgICBvZiB0aGUgY2xhc3MuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBHZW5lcmF0b3IgZnVuY3Rpb25zXG4nCisgICAgICAgICAgJyAgICAgIEEgZnVuY3Rpb24gb3IgbWV0aG9kIHdoaWNoIHVzZXMgdGhlICJ5aWVsZCIgc3RhdGVtZW50IChzZWVcbicKKyAgICAgICAgICAnICAgICAgc2VjdGlvbiBUaGUgeWllbGQgc3RhdGVtZW50KSBpcyBjYWxsZWQgYSAqZ2VuZXJhdG9yICcKKyAgICAgICAgICAnZnVuY3Rpb24qLlxuJworICAgICAgICAgICcgICAgICBTdWNoIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCBhbHdheXMgcmV0dXJucyBhbiBpdGVyYXRvciAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbjogICcKKyAgICAgICAgICAnY2FsbGluZ1xuJworICAgICAgICAgICcgICAgICB0aGUgaXRlcmF0b3JcJ3MgIml0ZXJhdG9yLl9fbmV4dF9fKCkiIG1ldGhvZCB3aWxsIGNhdXNlIHRoZVxuJworICAgICAgICAgICcgICAgICBmdW5jdGlvbiB0byBleGVjdXRlIHVudGlsIGl0IHByb3ZpZGVzIGEgdmFsdWUgdXNpbmcgdGhlICcKKyAgICAgICAgICAnInlpZWxkIlxuJworICAgICAgICAgICcgICAgICBzdGF0ZW1lbnQuICBXaGVuIHRoZSBmdW5jdGlvbiBleGVjdXRlcyBhICJyZXR1cm4iIHN0YXRlbWVudCAnCisgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgJyAgICAgIGZhbGxzIG9mZiB0aGUgZW5kLCBhICJTdG9wSXRlcmF0aW9uIiBleGNlcHRpb24gaXMgcmFpc2VkIGFuZCAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBpdGVyYXRvciB3aWxsIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgdmFsdWVzIHRvICcKKyAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAnICAgICAgcmV0dXJuZWQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBDb3JvdXRpbmUgZnVuY3Rpb25zXG4nCisgICAgICAgICAgJyAgICAgIEEgZnVuY3Rpb24gb3IgbWV0aG9kIHdoaWNoIGlzIGRlZmluZWQgdXNpbmcgImFzeW5jIGRlZiIgaXNcbicKKyAgICAgICAgICAnICAgICAgY2FsbGVkIGEgKmNvcm91dGluZSBmdW5jdGlvbiouICBTdWNoIGEgZnVuY3Rpb24sIHdoZW4gJworICAgICAgICAgICdjYWxsZWQsXG4nCisgICAgICAgICAgJyAgICAgIHJldHVybnMgYSAqY29yb3V0aW5lKiBvYmplY3QuICBJdCBtYXkgY29udGFpbiAiYXdhaXQiXG4nCisgICAgICAgICAgJyAgICAgIGV4cHJlc3Npb25zLCBhcyB3ZWxsIGFzICJhc3luYyB3aXRoIiBhbmQgImFzeW5jIGZvciIgJworICAgICAgICAgICdzdGF0ZW1lbnRzLlxuJworICAgICAgICAgICcgICAgICBTZWUgYWxzbyB0aGUgQ29yb3V0aW5lIE9iamVjdHMgc2VjdGlvbi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEJ1aWx0LWluIGZ1bmN0aW9uc1xuJworICAgICAgICAgICcgICAgICBBIGJ1aWx0LWluIGZ1bmN0aW9uIG9iamVjdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGEgQyBmdW5jdGlvbi5cbicKKyAgICAgICAgICAnICAgICAgRXhhbXBsZXMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFyZSAibGVuKCkiIGFuZCAibWF0aC5zaW4oKSJcbicKKyAgICAgICAgICAnICAgICAgKCJtYXRoIiBpcyBhIHN0YW5kYXJkIGJ1aWx0LWluIG1vZHVsZSkuIFRoZSBudW1iZXIgYW5kIHR5cGUgJworICAgICAgICAgICdvZlxuJworICAgICAgICAgICcgICAgICB0aGUgYXJndW1lbnRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDIGZ1bmN0aW9uLiBTcGVjaWFsICcKKyAgICAgICAgICAncmVhZC1cbicKKyAgICAgICAgICAnICAgICAgb25seSBhdHRyaWJ1dGVzOiAiX19kb2NfXyIgaXMgdGhlIGZ1bmN0aW9uXCdzIGRvY3VtZW50YXRpb25cbicKKyAgICAgICAgICAnICAgICAgc3RyaW5nLCBvciAiTm9uZSIgaWYgdW5hdmFpbGFibGU7ICJfX25hbWVfXyIgaXMgdGhlICcKKyAgICAgICAgICAiZnVuY3Rpb24nc1xuIgorICAgICAgICAgICcgICAgICBuYW1lOyAiX19zZWxmX18iIGlzIHNldCB0byAiTm9uZSIgKGJ1dCBzZWUgdGhlIG5leHQgaXRlbSk7XG4nCisgICAgICAgICAgJyAgICAgICJfX21vZHVsZV9fIiBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBmdW5jdGlvbiB3YXMgJworICAgICAgICAgICdkZWZpbmVkXG4nCisgICAgICAgICAgJyAgICAgIGluIG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEJ1aWx0LWluIG1ldGhvZHNcbicKKyAgICAgICAgICAnICAgICAgVGhpcyBpcyByZWFsbHkgYSBkaWZmZXJlbnQgZGlzZ3Vpc2Ugb2YgYSBidWlsdC1pbiBmdW5jdGlvbiwgJworICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgJyAgICAgIHRpbWUgY29udGFpbmluZyBhbiBvYmplY3QgcGFzc2VkIHRvIHRoZSBDIGZ1bmN0aW9uIGFzIGFuXG4nCisgICAgICAgICAgJyAgICAgIGltcGxpY2l0IGV4dHJhIGFyZ3VtZW50LiAgQW4gZXhhbXBsZSBvZiBhIGJ1aWx0LWluIG1ldGhvZCBpc1xuJworICAgICAgICAgICcgICAgICAiYWxpc3QuYXBwZW5kKCkiLCBhc3N1bWluZyAqYWxpc3QqIGlzIGEgbGlzdCBvYmplY3QuIEluIHRoaXNcbicKKyAgICAgICAgICAnICAgICAgY2FzZSwgdGhlIHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZSAiX19zZWxmX18iIGlzIHNldCB0byAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBvYmplY3QgZGVub3RlZCBieSAqYWxpc3QqLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQ2xhc3Nlc1xuJworICAgICAgICAgICcgICAgICBDbGFzc2VzIGFyZSBjYWxsYWJsZS4gIFRoZXNlIG9iamVjdHMgbm9ybWFsbHkgYWN0IGFzICcKKyAgICAgICAgICAnZmFjdG9yaWVzXG4nCisgICAgICAgICAgJyAgICAgIGZvciBuZXcgaW5zdGFuY2VzIG9mIHRoZW1zZWx2ZXMsIGJ1dCB2YXJpYXRpb25zIGFyZSBwb3NzaWJsZSAnCisgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICcgICAgICBjbGFzcyB0eXBlcyB0aGF0IG92ZXJyaWRlICJfX25ld19fKCkiLiAgVGhlIGFyZ3VtZW50cyBvZiB0aGVcbicKKyAgICAgICAgICAnICAgICAgY2FsbCBhcmUgcGFzc2VkIHRvICJfX25ld19fKCkiIGFuZCwgaW4gdGhlIHR5cGljYWwgY2FzZSwgdG9cbicKKyAgICAgICAgICAnICAgICAgIl9faW5pdF9fKCkiIHRvIGluaXRpYWxpemUgdGhlIG5ldyBpbnN0YW5jZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIENsYXNzIEluc3RhbmNlc1xuJworICAgICAgICAgICcgICAgICBJbnN0YW5jZXMgb2YgYXJiaXRyYXJ5IGNsYXNzZXMgY2FuIGJlIG1hZGUgY2FsbGFibGUgYnkgJworICAgICAgICAgICdkZWZpbmluZ1xuJworICAgICAgICAgICcgICAgICBhICJfX2NhbGxfXygpIiBtZXRob2QgaW4gdGhlaXIgY2xhc3MuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdNb2R1bGVzXG4nCisgICAgICAgICAgJyAgIE1vZHVsZXMgYXJlIGEgYmFzaWMgb3JnYW5pemF0aW9uYWwgdW5pdCBvZiBQeXRob24gY29kZSwgYW5kIGFyZVxuJworICAgICAgICAgICcgICBjcmVhdGVkIGJ5IHRoZSBpbXBvcnQgc3lzdGVtIGFzIGludm9rZWQgZWl0aGVyIGJ5IHRoZSAiaW1wb3J0IlxuJworICAgICAgICAgICcgICBzdGF0ZW1lbnQgKHNlZSAiaW1wb3J0IiksIG9yIGJ5IGNhbGxpbmcgZnVuY3Rpb25zIHN1Y2ggYXNcbicKKyAgICAgICAgICAnICAgImltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkiIGFuZCBidWlsdC1pbiAiX19pbXBvcnRfXygpIi4gIEEgJworICAgICAgICAgICdtb2R1bGVcbicKKyAgICAgICAgICAnICAgb2JqZWN0IGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBieSBhIGRpY3Rpb25hcnkgb2JqZWN0ICh0aGlzICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgdGhlIGRpY3Rpb25hcnkgcmVmZXJlbmNlZCBieSB0aGUgIl9fZ2xvYmFsc19fIiBhdHRyaWJ1dGUgb2ZcbicKKyAgICAgICAgICAnICAgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZSkuICBBdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmVcbicKKyAgICAgICAgICAnICAgdHJhbnNsYXRlZCB0byBsb29rdXBzIGluIHRoaXMgZGljdGlvbmFyeSwgZS5nLiwgIm0ueCIgaXMgJworICAgICAgICAgICdlcXVpdmFsZW50XG4nCisgICAgICAgICAgJyAgIHRvICJtLl9fZGljdF9fWyJ4Il0iLiBBIG1vZHVsZSBvYmplY3QgZG9lcyBub3QgY29udGFpbiB0aGUgY29kZVxuJworICAgICAgICAgICIgICBvYmplY3QgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb2R1bGUgKHNpbmNlIGl0IGlzbid0IG5lZWRlZCAiCisgICAgICAgICAgJ29uY2VcbicKKyAgICAgICAgICAnICAgdGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUpLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAiICAgQXR0cmlidXRlIGFzc2lnbm1lbnQgdXBkYXRlcyB0aGUgbW9kdWxlJ3MgbmFtZXNwYWNlIGRpY3Rpb25hcnksXG4iCisgICAgICAgICAgJyAgIGUuZy4sICJtLnggPSAxIiBpcyBlcXVpdmFsZW50IHRvICJtLl9fZGljdF9fWyJ4Il0gPSAxIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZTogIl9fZGljdF9fIiBpcyB0aGUgbW9kdWxlXCdzICcKKyAgICAgICAgICAnbmFtZXNwYWNlXG4nCisgICAgICAgICAgJyAgIGFzIGEgZGljdGlvbmFyeSBvYmplY3QuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEJlY2F1c2Ugb2YgdGhlIHdheSBDUHl0aG9uXG4nCisgICAgICAgICAgJyAgIGNsZWFycyBtb2R1bGUgZGljdGlvbmFyaWVzLCB0aGUgbW9kdWxlIGRpY3Rpb25hcnkgd2lsbCBiZSAnCisgICAgICAgICAgJ2NsZWFyZWRcbicKKyAgICAgICAgICAnICAgd2hlbiB0aGUgbW9kdWxlIGZhbGxzIG91dCBvZiBzY29wZSBldmVuIGlmIHRoZSBkaWN0aW9uYXJ5IHN0aWxsICcKKyAgICAgICAgICAnaGFzXG4nCisgICAgICAgICAgJyAgIGxpdmUgcmVmZXJlbmNlcy4gIFRvIGF2b2lkIHRoaXMsIGNvcHkgdGhlIGRpY3Rpb25hcnkgb3Iga2VlcCAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBtb2R1bGUgYXJvdW5kIHdoaWxlIHVzaW5nIGl0cyBkaWN0aW9uYXJ5IGRpcmVjdGx5LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgUHJlZGVmaW5lZCAod3JpdGFibGUpIGF0dHJpYnV0ZXM6ICJfX25hbWVfXyIgaXMgdGhlIG1vZHVsZVwncyAnCisgICAgICAgICAgJ25hbWU7XG4nCisgICAgICAgICAgJyAgICJfX2RvY19fIiBpcyB0aGUgbW9kdWxlXCdzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciAiTm9uZSIgaWZcbicKKyAgICAgICAgICAnICAgdW5hdmFpbGFibGU7ICJfX2ZpbGVfXyIgaXMgdGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgbW9kdWxlIHdhcyBsb2FkZWQsIGlmIGl0IHdhcyBsb2FkZWQgZnJvbSBhIGZpbGUuIFRoZSAiX19maWxlX18iXG4nCisgICAgICAgICAgJyAgIGF0dHJpYnV0ZSBtYXkgYmUgbWlzc2luZyBmb3IgY2VydGFpbiB0eXBlcyBvZiBtb2R1bGVzLCBzdWNoIGFzICcKKyAgICAgICAgICAnQ1xuJworICAgICAgICAgICcgICBtb2R1bGVzIHRoYXQgYXJlIHN0YXRpY2FsbHkgbGlua2VkIGludG8gdGhlIGludGVycHJldGVyOyBmb3JcbicKKyAgICAgICAgICAnICAgZXh0ZW5zaW9uIG1vZHVsZXMgbG9hZGVkIGR5bmFtaWNhbGx5IGZyb20gYSBzaGFyZWQgbGlicmFyeSwgaXQgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICB0aGUgcGF0aG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGZpbGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdDdXN0b20gY2xhc3Nlc1xuJworICAgICAgICAgICcgICBDdXN0b20gY2xhc3MgdHlwZXMgYXJlIHR5cGljYWxseSBjcmVhdGVkIGJ5IGNsYXNzIGRlZmluaXRpb25zICcKKyAgICAgICAgICAnKHNlZVxuJworICAgICAgICAgICcgICBzZWN0aW9uIENsYXNzIGRlZmluaXRpb25zKS4gIEEgY2xhc3MgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkICcKKyAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAnICAgYSBkaWN0aW9uYXJ5IG9iamVjdC4gQ2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHRyYW5zbGF0ZWQgJworICAgICAgICAgICd0b1xuJworICAgICAgICAgICcgICBsb29rdXBzIGluIHRoaXMgZGljdGlvbmFyeSwgZS5nLiwgIkMueCIgaXMgdHJhbnNsYXRlZCB0b1xuJworICAgICAgICAgICcgICAiQy5fX2RpY3RfX1sieCJdIiAoYWx0aG91Z2ggdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGhvb2tzIHdoaWNoICcKKyAgICAgICAgICAnYWxsb3dcbicKKyAgICAgICAgICAnICAgZm9yIG90aGVyIG1lYW5zIG9mIGxvY2F0aW5nIGF0dHJpYnV0ZXMpLiBXaGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGludWVzIGluIHRoZSBiYXNlXG4nCisgICAgICAgICAgJyAgIGNsYXNzZXMuIFRoaXMgc2VhcmNoIG9mIHRoZSBiYXNlIGNsYXNzZXMgdXNlcyB0aGUgQzMgbWV0aG9kXG4nCisgICAgICAgICAgJyAgIHJlc29sdXRpb24gb3JkZXIgd2hpY2ggYmVoYXZlcyBjb3JyZWN0bHkgZXZlbiBpbiB0aGUgcHJlc2VuY2UgJworICAgICAgICAgICdvZlxuJworICAgICAgICAgICIgICAnZGlhbW9uZCcgaW5oZXJpdGFuY2Ugc3RydWN0dXJlcyB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGVcbiIKKyAgICAgICAgICAnICAgaW5oZXJpdGFuY2UgcGF0aHMgbGVhZGluZyBiYWNrIHRvIGEgY29tbW9uIGFuY2VzdG9yLiBBZGRpdGlvbmFsXG4nCisgICAgICAgICAgJyAgIGRldGFpbHMgb24gdGhlIEMzIE1STyB1c2VkIGJ5IFB5dGhvbiBjYW4gYmUgZm91bmQgaW4gdGhlXG4nCisgICAgICAgICAgJyAgIGRvY3VtZW50YXRpb24gYWNjb21wYW55aW5nIHRoZSAyLjMgcmVsZWFzZSBhdFxuJworICAgICAgICAgICcgICBodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL3JlbGVhc2VzLzIuMy9tcm8vLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgV2hlbiBhIGNsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2UgKGZvciBjbGFzcyAiQyIsIHNheSkgd291bGQgJworICAgICAgICAgICd5aWVsZCBhXG4nCisgICAgICAgICAgJyAgIGNsYXNzIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYW4gaW5zdGFuY2UgbWV0aG9kXG4nCisgICAgICAgICAgJyAgIG9iamVjdCB3aG9zZSAiX19zZWxmX18iIGF0dHJpYnV0ZXMgaXMgIkMiLiAgV2hlbiBpdCB3b3VsZCB5aWVsZCAnCisgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAnICAgc3RhdGljIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG9iamVjdCB3cmFwcGVkICcKKyAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAnICAgdGhlIHN0YXRpYyBtZXRob2Qgb2JqZWN0LiBTZWUgc2VjdGlvbiBJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMgJworICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAnICAgYW5vdGhlciB3YXkgaW4gd2hpY2ggYXR0cmlidXRlcyByZXRyaWV2ZWQgZnJvbSBhIGNsYXNzIG1heSAnCisgICAgICAgICAgJ2RpZmZlclxuJworICAgICAgICAgICcgICBmcm9tIHRob3NlIGFjdHVhbGx5IGNvbnRhaW5lZCBpbiBpdHMgIl9fZGljdF9fIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgIiAgIENsYXNzIGF0dHJpYnV0ZSBhc3NpZ25tZW50cyB1cGRhdGUgdGhlIGNsYXNzJ3MgZGljdGlvbmFyeSwgIgorICAgICAgICAgICduZXZlclxuJworICAgICAgICAgICcgICB0aGUgZGljdGlvbmFyeSBvZiBhIGJhc2UgY2xhc3MuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBBIGNsYXNzIG9iamVjdCBjYW4gYmUgY2FsbGVkIChzZWUgYWJvdmUpIHRvIHlpZWxkIGEgY2xhc3MgJworICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICcgICAoc2VlIGJlbG93KS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNwZWNpYWwgYXR0cmlidXRlczogIl9fbmFtZV9fIiBpcyB0aGUgY2xhc3MgbmFtZTsgIl9fbW9kdWxlX18iICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgdGhlIG1vZHVsZSBuYW1lIGluIHdoaWNoIHRoZSBjbGFzcyB3YXMgZGVmaW5lZDsgIl9fZGljdF9fIiBpcyAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGNsYXNzXCdzIG5hbWVzcGFjZTsgIl9fYmFzZXNfXyIgaXMgYSAnCisgICAgICAgICAgJ3R1cGxlXG4nCisgICAgICAgICAgJyAgIChwb3NzaWJseSBlbXB0eSBvciBhIHNpbmdsZXRvbikgY29udGFpbmluZyB0aGUgYmFzZSBjbGFzc2VzLCBpbiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBvcmRlciBvZiB0aGVpciBvY2N1cnJlbmNlIGluIHRoZSBiYXNlIGNsYXNzIGxpc3Q7ICJfX2RvY19fIiBpcyAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICIgICBjbGFzcydzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciBOb25lIGlmIHVuZGVmaW5lZC5cbiIKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0NsYXNzIGluc3RhbmNlc1xuJworICAgICAgICAgICcgICBBIGNsYXNzIGluc3RhbmNlIGlzIGNyZWF0ZWQgYnkgY2FsbGluZyBhIGNsYXNzIG9iamVjdCAoc2VlICcKKyAgICAgICAgICAnYWJvdmUpLlxuJworICAgICAgICAgICcgICBBIGNsYXNzIGluc3RhbmNlIGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBhcyBhIGRpY3Rpb25hcnkgJworICAgICAgICAgICd3aGljaFxuJworICAgICAgICAgICcgICBpcyB0aGUgZmlyc3QgcGxhY2UgaW4gd2hpY2ggYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHNlYXJjaGVkLlxuJworICAgICAgICAgICIgICBXaGVuIGFuIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgdGhlcmUsIGFuZCB0aGUgaW5zdGFuY2UncyBjbGFzcyAiCisgICAgICAgICAgJ2hhc1xuJworICAgICAgICAgICcgICBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lLCB0aGUgc2VhcmNoIGNvbnRpbnVlcyB3aXRoIHRoZSBjbGFzc1xuJworICAgICAgICAgICcgICBhdHRyaWJ1dGVzLiAgSWYgYSBjbGFzcyBhdHRyaWJ1dGUgaXMgZm91bmQgdGhhdCBpcyBhICcKKyAgICAgICAgICAndXNlci1kZWZpbmVkXG4nCisgICAgICAgICAgJyAgIGZ1bmN0aW9uIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBpbnN0YW5jZSBtZXRob2QgJworICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAnICAgd2hvc2UgIl9fc2VsZl9fIiBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLiAgU3RhdGljIG1ldGhvZCBhbmRcbicKKyAgICAgICAgICAnICAgY2xhc3MgbWV0aG9kIG9iamVjdHMgYXJlIGFsc28gdHJhbnNmb3JtZWQ7IHNlZSBhYm92ZSB1bmRlclxuJworICAgICAgICAgICcgICAiQ2xhc3NlcyIuICBTZWUgc2VjdGlvbiBJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMgZm9yIGFub3RoZXIgd2F5ICcKKyAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAnICAgd2hpY2ggYXR0cmlidXRlcyBvZiBhIGNsYXNzIHJldHJpZXZlZCB2aWEgaXRzIGluc3RhbmNlcyBtYXkgJworICAgICAgICAgICdkaWZmZXJcbicKKyAgICAgICAgICAnICAgZnJvbSB0aGUgb2JqZWN0cyBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIGNsYXNzXCdzICJfX2RpY3RfXyIuICBJZiAnCisgICAgICAgICAgJ25vXG4nCisgICAgICAgICAgIiAgIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCwgYW5kIHRoZSBvYmplY3QncyBjbGFzcyBoYXMgYVxuIgorICAgICAgICAgICcgICAiX19nZXRhdHRyX18oKSIgbWV0aG9kLCB0aGF0IGlzIGNhbGxlZCB0byBzYXRpc2Z5IHRoZSBsb29rdXAuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICIgICBBdHRyaWJ1dGUgYXNzaWdubWVudHMgYW5kIGRlbGV0aW9ucyB1cGRhdGUgdGhlIGluc3RhbmNlJ3NcbiIKKyAgICAgICAgICAiICAgZGljdGlvbmFyeSwgbmV2ZXIgYSBjbGFzcydzIGRpY3Rpb25hcnkuICBJZiB0aGUgY2xhc3MgaGFzIGFcbiIKKyAgICAgICAgICAnICAgIl9fc2V0YXR0cl9fKCkiIG9yICJfX2RlbGF0dHJfXygpIiBtZXRob2QsIHRoaXMgaXMgY2FsbGVkICcKKyAgICAgICAgICAnaW5zdGVhZFxuJworICAgICAgICAgICcgICBvZiB1cGRhdGluZyB0aGUgaW5zdGFuY2UgZGljdGlvbmFyeSBkaXJlY3RseS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIENsYXNzIGluc3RhbmNlcyBjYW4gcHJldGVuZCB0byBiZSBudW1iZXJzLCBzZXF1ZW5jZXMsIG9yICcKKyAgICAgICAgICAnbWFwcGluZ3NcbicKKyAgICAgICAgICAnICAgaWYgdGhleSBoYXZlIG1ldGhvZHMgd2l0aCBjZXJ0YWluIHNwZWNpYWwgbmFtZXMuICBTZWUgc2VjdGlvblxuJworICAgICAgICAgICcgICBTcGVjaWFsIG1ldGhvZCBuYW1lcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNwZWNpYWwgYXR0cmlidXRlczogIl9fZGljdF9fIiBpcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnk7XG4nCisgICAgICAgICAgJyAgICJfX2NsYXNzX18iIGlzIHRoZSBpbnN0YW5jZVwncyBjbGFzcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0kvTyBvYmplY3RzIChhbHNvIGtub3duIGFzIGZpbGUgb2JqZWN0cylcbicKKyAgICAgICAgICAnICAgQSAqZmlsZSBvYmplY3QqIHJlcHJlc2VudHMgYW4gb3BlbiBmaWxlLiAgVmFyaW91cyBzaG9ydGN1dHMgYXJlXG4nCisgICAgICAgICAgJyAgIGF2YWlsYWJsZSB0byBjcmVhdGUgZmlsZSBvYmplY3RzOiB0aGUgIm9wZW4oKSIgYnVpbHQtaW4gJworICAgICAgICAgICdmdW5jdGlvbixcbicKKyAgICAgICAgICAnICAgYW5kIGFsc28gIm9zLnBvcGVuKCkiLCAib3MuZmRvcGVuKCkiLCBhbmQgdGhlICJtYWtlZmlsZSgpIiAnCisgICAgICAgICAgJ21ldGhvZFxuJworICAgICAgICAgICcgICBvZiBzb2NrZXQgb2JqZWN0cyAoYW5kIHBlcmhhcHMgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIG1ldGhvZHNcbicKKyAgICAgICAgICAnICAgcHJvdmlkZWQgYnkgZXh0ZW5zaW9uIG1vZHVsZXMpLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgVGhlIG9iamVjdHMgInN5cy5zdGRpbiIsICJzeXMuc3Rkb3V0IiBhbmQgInN5cy5zdGRlcnIiIGFyZVxuJworICAgICAgICAgICIgICBpbml0aWFsaXplZCB0byBmaWxlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZXJwcmV0ZXInc1xuIgorICAgICAgICAgICcgICBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0IGFuZCBlcnJvciBzdHJlYW1zOyB0aGV5IGFyZSBhbGwgb3BlbiBpbiAnCisgICAgICAgICAgJ3RleHRcbicKKyAgICAgICAgICAnICAgbW9kZSBhbmQgdGhlcmVmb3JlIGZvbGxvdyB0aGUgaW50ZXJmYWNlIGRlZmluZWQgYnkgdGhlXG4nCisgICAgICAgICAgJyAgICJpby5UZXh0SU9CYXNlIiBhYnN0cmFjdCBjbGFzcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0ludGVybmFsIHR5cGVzXG4nCisgICAgICAgICAgJyAgIEEgZmV3IHR5cGVzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgaW50ZXJwcmV0ZXIgYXJlIGV4cG9zZWQgdG8gJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgdXNlci4gVGhlaXIgZGVmaW5pdGlvbnMgbWF5IGNoYW5nZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGVcbicKKyAgICAgICAgICAnICAgaW50ZXJwcmV0ZXIsIGJ1dCB0aGV5IGFyZSBtZW50aW9uZWQgaGVyZSBmb3IgY29tcGxldGVuZXNzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQ29kZSBvYmplY3RzXG4nCisgICAgICAgICAgJyAgICAgIENvZGUgb2JqZWN0cyByZXByZXNlbnQgKmJ5dGUtY29tcGlsZWQqIGV4ZWN1dGFibGUgUHl0aG9uICcKKyAgICAgICAgICAnY29kZSxcbicKKyAgICAgICAgICAnICAgICAgb3IgKmJ5dGVjb2RlKi4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGNvZGUgb2JqZWN0IGFuZCBhXG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uIG9iamVjdCBpcyB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYW4gJworICAgICAgICAgICdleHBsaWNpdFxuJworICAgICAgICAgICIgICAgICByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uJ3MgZ2xvYmFscyAodGhlIG1vZHVsZSBpbiB3aGljaCBpdCAiCisgICAgICAgICAgJ3dhc1xuJworICAgICAgICAgICcgICAgICBkZWZpbmVkKSwgd2hpbGUgYSBjb2RlIG9iamVjdCBjb250YWlucyBubyBjb250ZXh0OyBhbHNvIHRoZVxuJworICAgICAgICAgICcgICAgICBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBmdW5jdGlvbiBvYmplY3QsICcKKyAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgJyAgICAgIGluIHRoZSBjb2RlIG9iamVjdCAoYmVjYXVzZSB0aGV5IHJlcHJlc2VudCB2YWx1ZXMgY2FsY3VsYXRlZCAnCisgICAgICAgICAgJ2F0XG4nCisgICAgICAgICAgJyAgICAgIHJ1bi10aW1lKS4gIFVubGlrZSBmdW5jdGlvbiBvYmplY3RzLCBjb2RlIG9iamVjdHMgYXJlICcKKyAgICAgICAgICAnaW1tdXRhYmxlXG4nCisgICAgICAgICAgJyAgICAgIGFuZCBjb250YWluIG5vIHJlZmVyZW5jZXMgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHRvICcKKyAgICAgICAgICAnbXV0YWJsZVxuJworICAgICAgICAgICcgICAgICBvYmplY3RzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogImNvX25hbWUiIGdpdmVzIHRoZSBmdW5jdGlvbiAnCisgICAgICAgICAgJ25hbWU7XG4nCisgICAgICAgICAgJyAgICAgICJjb19hcmdjb3VudCIgaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyAnCisgICAgICAgICAgJyhpbmNsdWRpbmdcbicKKyAgICAgICAgICAnICAgICAgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMpOyAiY29fbmxvY2FscyIgaXMgdGhlIG51bWJlciAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIGxvY2FsIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiAoaW5jbHVkaW5nIGFyZ3VtZW50cyk7XG4nCisgICAgICAgICAgJyAgICAgICJjb192YXJuYW1lcyIgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgbG9jYWxcbicKKyAgICAgICAgICAnICAgICAgdmFyaWFibGVzIChzdGFydGluZyB3aXRoIHRoZSBhcmd1bWVudCBuYW1lcyk7ICJjb19jZWxsdmFycyIgJworICAgICAgICAgICdpcyBhXG4nCisgICAgICAgICAgJyAgICAgIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZVxuJworICAgICAgICAgICcgICAgICByZWZlcmVuY2VkIGJ5IG5lc3RlZCBmdW5jdGlvbnM7ICJjb19mcmVldmFycyIgaXMgYSB0dXBsZVxuJworICAgICAgICAgICcgICAgICBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBmcmVlIHZhcmlhYmxlczsgImNvX2NvZGUiIGlzIGEgJworICAgICAgICAgICdzdHJpbmdcbicKKyAgICAgICAgICAnICAgICAgcmVwcmVzZW50aW5nIHRoZSBzZXF1ZW5jZSBvZiBieXRlY29kZSBpbnN0cnVjdGlvbnM7ICcKKyAgICAgICAgICAnImNvX2NvbnN0cyJcbicKKyAgICAgICAgICAnICAgICAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBsaXRlcmFscyB1c2VkIGJ5IHRoZSBieXRlY29kZTtcbicKKyAgICAgICAgICAnICAgICAgImNvX25hbWVzIiBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIHVzZWQgYnkgdGhlICcKKyAgICAgICAgICAnYnl0ZWNvZGU7XG4nCisgICAgICAgICAgJyAgICAgICJjb19maWxlbmFtZSIgaXMgdGhlIGZpbGVuYW1lIGZyb20gd2hpY2ggdGhlIGNvZGUgd2FzICcKKyAgICAgICAgICAnY29tcGlsZWQ7XG4nCisgICAgICAgICAgJyAgICAgICJjb19maXJzdGxpbmVubyIgaXMgdGhlIGZpcnN0IGxpbmUgbnVtYmVyIG9mIHRoZSBmdW5jdGlvbjtcbicKKyAgICAgICAgICAnICAgICAgImNvX2xub3RhYiIgaXMgYSBzdHJpbmcgZW5jb2RpbmcgdGhlIG1hcHBpbmcgZnJvbSBieXRlY29kZVxuJworICAgICAgICAgICcgICAgICBvZmZzZXRzIHRvIGxpbmUgbnVtYmVycyAoZm9yIGRldGFpbHMgc2VlIHRoZSBzb3VyY2UgY29kZSBvZiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBpbnRlcnByZXRlcik7ICJjb19zdGFja3NpemUiIGlzIHRoZSByZXF1aXJlZCBzdGFjayBzaXplXG4nCisgICAgICAgICAgJyAgICAgIChpbmNsdWRpbmcgbG9jYWwgdmFyaWFibGVzKTsgImNvX2ZsYWdzIiBpcyBhbiBpbnRlZ2VyICcKKyAgICAgICAgICAnZW5jb2RpbmcgYVxuJworICAgICAgICAgICcgICAgICBudW1iZXIgb2YgZmxhZ3MgZm9yIHRoZSBpbnRlcnByZXRlci5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFRoZSBmb2xsb3dpbmcgZmxhZyBiaXRzIGFyZSBkZWZpbmVkIGZvciAiY29fZmxhZ3MiOiBiaXQgJworICAgICAgICAgICciMHgwNCJcbicKKyAgICAgICAgICAnICAgICAgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSAiKmFyZ3VtZW50cyIgc3ludGF4IHRvIGFjY2VwdCAnCisgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgJyAgICAgIGFyYml0cmFyeSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHM7IGJpdCAiMHgwOCIgaXMgc2V0ICcKKyAgICAgICAgICAnaWZcbicKKyAgICAgICAgICAnICAgICAgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlICIqKmtleXdvcmRzIiBzeW50YXggdG8gYWNjZXB0ICcKKyAgICAgICAgICAnYXJiaXRyYXJ5XG4nCisgICAgICAgICAgJyAgICAgIGtleXdvcmQgYXJndW1lbnRzOyBiaXQgIjB4MjAiIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gaXMgYVxuJworICAgICAgICAgICcgICAgICBnZW5lcmF0b3IuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBGdXR1cmUgZmVhdHVyZSBkZWNsYXJhdGlvbnMgKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0ICcKKyAgICAgICAgICAnZGl2aXNpb24iKVxuJworICAgICAgICAgICcgICAgICBhbHNvIHVzZSBiaXRzIGluICJjb19mbGFncyIgdG8gaW5kaWNhdGUgd2hldGhlciBhIGNvZGUgJworICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAnICAgICAgd2FzIGNvbXBpbGVkIHdpdGggYSBwYXJ0aWN1bGFyIGZlYXR1cmUgZW5hYmxlZDogYml0ICIweDIwMDAiICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgc2V0IGlmIHRoZSBmdW5jdGlvbiB3YXMgY29tcGlsZWQgd2l0aCBmdXR1cmUgZGl2aXNpb24gJworICAgICAgICAgICdlbmFibGVkO1xuJworICAgICAgICAgICcgICAgICBiaXRzICIweDEwIiBhbmQgIjB4MTAwMCIgd2VyZSB1c2VkIGluIGVhcmxpZXIgdmVyc2lvbnMgb2ZcbicKKyAgICAgICAgICAnICAgICAgUHl0aG9uLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgT3RoZXIgYml0cyBpbiAiY29fZmxhZ3MiIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgSWYgYSBjb2RlIG9iamVjdCByZXByZXNlbnRzIGEgZnVuY3Rpb24sIHRoZSBmaXJzdCBpdGVtIGluXG4nCisgICAgICAgICAgJyAgICAgICJjb19jb25zdHMiIGlzIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBvZiB0aGUgZnVuY3Rpb24sIG9yXG4nCisgICAgICAgICAgJyAgICAgICJOb25lIiBpZiB1bmRlZmluZWQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBGcmFtZSBvYmplY3RzXG4nCisgICAgICAgICAgJyAgICAgIEZyYW1lIG9iamVjdHMgcmVwcmVzZW50IGV4ZWN1dGlvbiBmcmFtZXMuICBUaGV5IG1heSBvY2N1ciBpblxuJworICAgICAgICAgICcgICAgICB0cmFjZWJhY2sgb2JqZWN0cyAoc2VlIGJlbG93KS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJmX2JhY2siIGlzIHRvIHRoZSBwcmV2aW91cyAnCisgICAgICAgICAgJ3N0YWNrXG4nCisgICAgICAgICAgJyAgICAgIGZyYW1lICh0b3dhcmRzIHRoZSBjYWxsZXIpLCBvciAiTm9uZSIgaWYgdGhpcyBpcyB0aGUgYm90dG9tXG4nCisgICAgICAgICAgJyAgICAgIHN0YWNrIGZyYW1lOyAiZl9jb2RlIiBpcyB0aGUgY29kZSBvYmplY3QgYmVpbmcgZXhlY3V0ZWQgaW4gJworICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgJyAgICAgIGZyYW1lOyAiZl9sb2NhbHMiIGlzIHRoZSBkaWN0aW9uYXJ5IHVzZWQgdG8gbG9vayB1cCBsb2NhbFxuJworICAgICAgICAgICcgICAgICB2YXJpYWJsZXM7ICJmX2dsb2JhbHMiIGlzIHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXM7XG4nCisgICAgICAgICAgJyAgICAgICJmX2J1aWx0aW5zIiBpcyB1c2VkIGZvciBidWlsdC1pbiAoaW50cmluc2ljKSBuYW1lczsgJworICAgICAgICAgICciZl9sYXN0aSJcbicKKyAgICAgICAgICAnICAgICAgZ2l2ZXMgdGhlIHByZWNpc2UgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgYW4gaW5kZXggaW50byB0aGVcbicKKyAgICAgICAgICAnICAgICAgYnl0ZWNvZGUgc3RyaW5nIG9mIHRoZSBjb2RlIG9iamVjdCkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBTcGVjaWFsIHdyaXRhYmxlIGF0dHJpYnV0ZXM6ICJmX3RyYWNlIiwgaWYgbm90ICJOb25lIiwgaXMgYVxuJworICAgICAgICAgICcgICAgICBmdW5jdGlvbiBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGNvZGUgbGluZSAodGhpcyAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgICAgIHVzZWQgYnkgdGhlIGRlYnVnZ2VyKTsgImZfbGluZW5vIiBpcyB0aGUgY3VycmVudCBsaW5lIG51bWJlciAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBmcmFtZSAtLS0gd3JpdGluZyB0byB0aGlzIGZyb20gd2l0aGluIGEgdHJhY2UgZnVuY3Rpb24gJworICAgICAgICAgICdqdW1wc1xuJworICAgICAgICAgICcgICAgICB0byB0aGUgZ2l2ZW4gbGluZSAob25seSBmb3IgdGhlIGJvdHRvbS1tb3N0IGZyYW1lKS4gIEEgJworICAgICAgICAgICdkZWJ1Z2dlclxuJworICAgICAgICAgICcgICAgICBjYW4gaW1wbGVtZW50IGEgSnVtcCBjb21tYW5kIChha2EgU2V0IE5leHQgU3RhdGVtZW50KSBieSAnCisgICAgICAgICAgJ3dyaXRpbmdcbicKKyAgICAgICAgICAnICAgICAgdG8gZl9saW5lbm8uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBGcmFtZSBvYmplY3RzIHN1cHBvcnQgb25lIG1ldGhvZDpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIGZyYW1lLmNsZWFyKClcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgICAgIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgcmVmZXJlbmNlcyB0byBsb2NhbCB2YXJpYWJsZXMgaGVsZCAnCisgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgJyAgICAgICAgIHRoZSBmcmFtZS4gIEFsc28sIGlmIHRoZSBmcmFtZSBiZWxvbmdlZCB0byBhIGdlbmVyYXRvciwgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgICAgZ2VuZXJhdG9yIGlzIGZpbmFsaXplZC4gIFRoaXMgaGVscHMgYnJlYWsgcmVmZXJlbmNlICcKKyAgICAgICAgICAnY3ljbGVzXG4nCisgICAgICAgICAgJyAgICAgICAgIGludm9sdmluZyBmcmFtZSBvYmplY3RzIChmb3IgZXhhbXBsZSB3aGVuIGNhdGNoaW5nIGFuXG4nCisgICAgICAgICAgJyAgICAgICAgIGV4Y2VwdGlvbiBhbmQgc3RvcmluZyBpdHMgdHJhY2ViYWNrIGZvciBsYXRlciB1c2UpLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgICAgIlJ1bnRpbWVFcnJvciIgaXMgcmFpc2VkIGlmIHRoZSBmcmFtZSBpcyBjdXJyZW50bHkgJworICAgICAgICAgICdleGVjdXRpbmcuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICAgICBOZXcgaW4gdmVyc2lvbiAzLjQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBUcmFjZWJhY2sgb2JqZWN0c1xuJworICAgICAgICAgICcgICAgICBUcmFjZWJhY2sgb2JqZWN0cyByZXByZXNlbnQgYSBzdGFjayB0cmFjZSBvZiBhbiBleGNlcHRpb24uICAnCisgICAgICAgICAgJ0FcbicKKyAgICAgICAgICAnICAgICAgdHJhY2ViYWNrIG9iamVjdCBpcyBjcmVhdGVkIHdoZW4gYW4gZXhjZXB0aW9uIG9jY3Vycy4gIFdoZW4gJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgc2VhcmNoIGZvciBhbiBleGNlcHRpb24gaGFuZGxlciB1bndpbmRzIHRoZSBleGVjdXRpb24gc3RhY2ssICcKKyAgICAgICAgICAnYXRcbicKKyAgICAgICAgICAnICAgICAgZWFjaCB1bndvdW5kIGxldmVsIGEgdHJhY2ViYWNrIG9iamVjdCBpcyBpbnNlcnRlZCBpbiBmcm9udCAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBjdXJyZW50IHRyYWNlYmFjay4gIFdoZW4gYW4gZXhjZXB0aW9uIGhhbmRsZXIgaXMgJworICAgICAgICAgICdlbnRlcmVkLFxuJworICAgICAgICAgICcgICAgICB0aGUgc3RhY2sgdHJhY2UgaXMgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0uIChTZWUgJworICAgICAgICAgICdzZWN0aW9uXG4nCisgICAgICAgICAgJyAgICAgIFRoZSB0cnkgc3RhdGVtZW50LikgSXQgaXMgYWNjZXNzaWJsZSBhcyB0aGUgdGhpcmQgaXRlbSBvZiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICB0dXBsZSByZXR1cm5lZCBieSAic3lzLmV4Y19pbmZvKCkiLiBXaGVuIHRoZSBwcm9ncmFtIGNvbnRhaW5zICcKKyAgICAgICAgICAnbm9cbicKKyAgICAgICAgICAnICAgICAgc3VpdGFibGUgaGFuZGxlciwgdGhlIHN0YWNrIHRyYWNlIGlzIHdyaXR0ZW4gKG5pY2VseSAnCisgICAgICAgICAgJ2Zvcm1hdHRlZClcbicKKyAgICAgICAgICAnICAgICAgdG8gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbTsgaWYgdGhlIGludGVycHJldGVyIGlzICcKKyAgICAgICAgICAnaW50ZXJhY3RpdmUsXG4nCisgICAgICAgICAgJyAgICAgIGl0IGlzIGFsc28gbWFkZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIgYXMgJworICAgICAgICAgICcic3lzLmxhc3RfdHJhY2ViYWNrIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJ0Yl9uZXh0IiBpcyB0aGUgbmV4dCBsZXZlbCBpbiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBzdGFjayB0cmFjZSAodG93YXJkcyB0aGUgZnJhbWUgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZCksICcKKyAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAnICAgICAgIk5vbmUiIGlmIHRoZXJlIGlzIG5vIG5leHQgbGV2ZWw7ICJ0Yl9mcmFtZSIgcG9pbnRzIHRvIHRoZVxuJworICAgICAgICAgICcgICAgICBleGVjdXRpb24gZnJhbWUgb2YgdGhlIGN1cnJlbnQgbGV2ZWw7ICJ0Yl9saW5lbm8iIGdpdmVzIHRoZSAnCisgICAgICAgICAgJ2xpbmVcbicKKyAgICAgICAgICAnICAgICAgbnVtYmVyIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQ7ICJ0Yl9sYXN0aSIgaW5kaWNhdGVzICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIHByZWNpc2UgaW5zdHJ1Y3Rpb24uICBUaGUgbGluZSBudW1iZXIgYW5kIGxhc3QgaW5zdHJ1Y3Rpb24gJworICAgICAgICAgICdpblxuJworICAgICAgICAgICcgICAgICB0aGUgdHJhY2ViYWNrIG1heSBkaWZmZXIgZnJvbSB0aGUgbGluZSBudW1iZXIgb2YgaXRzIGZyYW1lXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdCBpZiB0aGUgZXhjZXB0aW9uIG9jY3VycmVkIGluIGEgInRyeSIgc3RhdGVtZW50IHdpdGggJworICAgICAgICAgICdub1xuJworICAgICAgICAgICcgICAgICBtYXRjaGluZyBleGNlcHQgY2xhdXNlIG9yIHdpdGggYSBmaW5hbGx5IGNsYXVzZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNsaWNlIG9iamVjdHNcbicKKyAgICAgICAgICAnICAgICAgU2xpY2Ugb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2xpY2VzIGZvciAnCisgICAgICAgICAgJyJfX2dldGl0ZW1fXygpIlxuJworICAgICAgICAgICcgICAgICBtZXRob2RzLiAgVGhleSBhcmUgYWxzbyBjcmVhdGVkIGJ5IHRoZSBidWlsdC1pbiAic2xpY2UoKSJcbicKKyAgICAgICAgICAnICAgICAgZnVuY3Rpb24uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAic3RhcnQiIGlzIHRoZSBsb3dlciBib3VuZDsgJworICAgICAgICAgICcic3RvcCJcbicKKyAgICAgICAgICAnICAgICAgaXMgdGhlIHVwcGVyIGJvdW5kOyAic3RlcCIgaXMgdGhlIHN0ZXAgdmFsdWU7IGVhY2ggaXMgIk5vbmUiICcKKyAgICAgICAgICAnaWZcbicKKyAgICAgICAgICAnICAgICAgb21pdHRlZC4gIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGhhdmUgYW55IHR5cGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBTbGljZSBvYmplY3RzIHN1cHBvcnQgb25lIG1ldGhvZDpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIHNsaWNlLmluZGljZXMoc2VsZiwgbGVuZ3RoKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBzaW5nbGUgaW50ZWdlciBhcmd1bWVudCAqbGVuZ3RoKiBhbmRcbicKKyAgICAgICAgICAnICAgICAgICAgY29tcHV0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNsaWNlIHRoYXQgdGhlIHNsaWNlICcKKyAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgJyAgICAgICAgIHdvdWxkIGRlc2NyaWJlIGlmIGFwcGxpZWQgdG8gYSBzZXF1ZW5jZSBvZiAqbGVuZ3RoKiAnCisgICAgICAgICAgJ2l0ZW1zLlxuJworICAgICAgICAgICcgICAgICAgICBJdCByZXR1cm5zIGEgdHVwbGUgb2YgdGhyZWUgaW50ZWdlcnM7IHJlc3BlY3RpdmVseSB0aGVzZSAnCisgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICcgICAgICAgICB0aGUgKnN0YXJ0KiBhbmQgKnN0b3AqIGluZGljZXMgYW5kIHRoZSAqc3RlcCogb3Igc3RyaWRlXG4nCisgICAgICAgICAgJyAgICAgICAgIGxlbmd0aCBvZiB0aGUgc2xpY2UuIE1pc3Npbmcgb3Igb3V0LW9mLWJvdW5kcyBpbmRpY2VzIGFyZVxuJworICAgICAgICAgICcgICAgICAgICBoYW5kbGVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCByZWd1bGFyIHNsaWNlcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFN0YXRpYyBtZXRob2Qgb2JqZWN0c1xuJworICAgICAgICAgICcgICAgICBTdGF0aWMgbWV0aG9kIG9iamVjdHMgcHJvdmlkZSBhIHdheSBvZiBkZWZlYXRpbmcgdGhlXG4nCisgICAgICAgICAgJyAgICAgIHRyYW5zZm9ybWF0aW9uIG9mIGZ1bmN0aW9uIG9iamVjdHMgdG8gbWV0aG9kIG9iamVjdHMgJworICAgICAgICAgICdkZXNjcmliZWRcbicKKyAgICAgICAgICAnICAgICAgYWJvdmUuIEEgc3RhdGljIG1ldGhvZCBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbnkgb3RoZXJcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0LCB1c3VhbGx5IGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QuIFdoZW4gYSBzdGF0aWNcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kIG9iamVjdCBpcyByZXRyaWV2ZWQgZnJvbSBhIGNsYXNzIG9yIGEgY2xhc3MgaW5zdGFuY2UsICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdCBhY3R1YWxseSByZXR1cm5lZCBpcyB0aGUgd3JhcHBlZCBvYmplY3QsIHdoaWNoIGlzIG5vdFxuJworICAgICAgICAgICcgICAgICBzdWJqZWN0IHRvIGFueSBmdXJ0aGVyIHRyYW5zZm9ybWF0aW9uLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgJworICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAnICAgICAgbm90IHRoZW1zZWx2ZXMgY2FsbGFibGUsIGFsdGhvdWdoIHRoZSBvYmplY3RzIHRoZXkgd3JhcCAnCisgICAgICAgICAgJ3VzdWFsbHlcbicKKyAgICAgICAgICAnICAgICAgYXJlLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluXG4nCisgICAgICAgICAgJyAgICAgICJzdGF0aWNtZXRob2QoKSIgY29uc3RydWN0b3IuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBDbGFzcyBtZXRob2Qgb2JqZWN0c1xuJworICAgICAgICAgICcgICAgICBBIGNsYXNzIG1ldGhvZCBvYmplY3QsIGxpa2UgYSBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXMgYSAnCisgICAgICAgICAgJ3dyYXBwZXJcbicKKyAgICAgICAgICAnICAgICAgYXJvdW5kIGFub3RoZXIgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSB3YXkgaW4gd2hpY2ggdGhhdCAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICBpcyByZXRyaWV2ZWQgZnJvbSBjbGFzc2VzIGFuZCBjbGFzcyBpbnN0YW5jZXMuIFRoZSBiZWhhdmlvdXIgJworICAgICAgICAgICdvZlxuJworICAgICAgICAgICcgICAgICBjbGFzcyBtZXRob2Qgb2JqZWN0cyB1cG9uIHN1Y2ggcmV0cmlldmFsIGlzIGRlc2NyaWJlZCBhYm92ZSxcbicKKyAgICAgICAgICAnICAgICAgdW5kZXIgIlVzZXItZGVmaW5lZCBtZXRob2RzIi4gQ2xhc3MgbWV0aG9kIG9iamVjdHMgYXJlICcKKyAgICAgICAgICAnY3JlYXRlZFxuJworICAgICAgICAgICcgICAgICBieSB0aGUgYnVpbHQtaW4gImNsYXNzbWV0aG9kKCkiIGNvbnN0cnVjdG9yLlxuJywKKyAndHlwZXNmdW5jdGlvbnMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgJ0Z1bmN0aW9uc1xuJworICAgICAgICAgICAgICAgICAgICcqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ0Z1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGUgJworICAgICAgICAgICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbiBvbiBhIGZ1bmN0aW9uIG9iamVjdCBpcyB0byBjYWxsIGl0OiAnCisgICAgICAgICAgICAgICAgICAgJyJmdW5jKGFyZ3VtZW50LWxpc3QpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1RoZXJlIGFyZSByZWFsbHkgdHdvIGZsYXZvcnMgb2YgZnVuY3Rpb24gb2JqZWN0czogYnVpbHQtaW4gJworICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbnNcbicKKyAgICAgICAgICAgICAgICAgICAnYW5kIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuICBCb3RoIHN1cHBvcnQgdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICAgICdvcGVyYXRpb24gKHRvIGNhbGxcbicKKyAgICAgICAgICAgICAgICAgICAndGhlIGZ1bmN0aW9uKSwgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkaWZmZXJlbnQsIGhlbmNlICcKKyAgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAgJ2RpZmZlcmVudCBvYmplY3QgdHlwZXMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdTZWUgRnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAorICd0eXBlc21hcHBpbmcnOiAnXG4nCisgICAgICAgICAgICAgICAgICdNYXBwaW5nIFR5cGVzIC0tLSAiZGljdCJcbicKKyAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdBICptYXBwaW5nKiBvYmplY3QgbWFwcyAqaGFzaGFibGUqIHZhbHVlcyB0byBhcmJpdHJhcnkgJworICAgICAgICAgICAgICAgICAnb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgJ01hcHBpbmdzIGFyZSBtdXRhYmxlIG9iamVjdHMuICBUaGVyZSBpcyBjdXJyZW50bHkgb25seSBvbmUgJworICAgICAgICAgICAgICAgICAnc3RhbmRhcmRcbicKKyAgICAgICAgICAgICAgICAgJ21hcHBpbmcgdHlwZSwgdGhlICpkaWN0aW9uYXJ5Ki4gIChGb3Igb3RoZXIgY29udGFpbmVycyBzZWUgJworICAgICAgICAgICAgICAgICAndGhlIGJ1aWx0LVxuJworICAgICAgICAgICAgICAgICAnaW4gImxpc3QiLCAic2V0IiwgYW5kICJ0dXBsZSIgY2xhc3NlcywgYW5kIHRoZSAiY29sbGVjdGlvbnMiICcKKyAgICAgICAgICAgICAgICAgJ21vZHVsZS4pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgIkEgZGljdGlvbmFyeSdzIGtleXMgYXJlICphbG1vc3QqIGFyYml0cmFyeSB2YWx1ZXMuICBWYWx1ZXMgIgorICAgICAgICAgICAgICAgICAndGhhdCBhcmVcbicKKyAgICAgICAgICAgICAgICAgJ25vdCAqaGFzaGFibGUqLCB0aGF0IGlzLCB2YWx1ZXMgY29udGFpbmluZyBsaXN0cywgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyaWVzIG9yXG4nCisgICAgICAgICAgICAgICAgICdvdGhlciBtdXRhYmxlIHR5cGVzICh0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiAnCisgICAgICAgICAgICAgICAgICdieSBvYmplY3RcbicKKyAgICAgICAgICAgICAgICAgJ2lkZW50aXR5KSBtYXkgbm90IGJlIHVzZWQgYXMga2V5cy4gIE51bWVyaWMgdHlwZXMgdXNlZCBmb3IgJworICAgICAgICAgICAgICAgICAna2V5cyBvYmV5XG4nCisgICAgICAgICAgICAgICAgICd0aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzICcKKyAgICAgICAgICAgICAgICAgJ2NvbXBhcmUgZXF1YWxcbicKKyAgICAgICAgICAgICAgICAgJyhzdWNoIGFzICIxIiBhbmQgIjEuMCIpIHRoZW4gdGhleSBjYW4gYmUgdXNlZCAnCisgICAgICAgICAgICAgICAgICdpbnRlcmNoYW5nZWFibHkgdG8gaW5kZXhcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIGRpY3Rpb25hcnkgZW50cnkuICAoTm90ZSBob3dldmVyLCB0aGF0IHNpbmNlICcKKyAgICAgICAgICAgICAgICAgJ2NvbXB1dGVycyBzdG9yZVxuJworICAgICAgICAgICAgICAgICAnZmxvYXRpbmctcG9pbnQgbnVtYmVycyBhcyBhcHByb3hpbWF0aW9ucyBpdCBpcyB1c3VhbGx5ICcKKyAgICAgICAgICAgICAgICAgJ3Vud2lzZSB0byB1c2VcbicKKyAgICAgICAgICAgICAgICAgJ3RoZW0gYXMgZGljdGlvbmFyeSBrZXlzLilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRGljdGlvbmFyaWVzIGNhbiBiZSBjcmVhdGVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgJworICAgICAgICAgICAgICAgICAnbGlzdCBvZiAia2V5OlxuJworICAgICAgICAgICAgICAgICAndmFsdWUiIHBhaXJzIHdpdGhpbiBicmFjZXMsIGZvciBleGFtcGxlOiAie1wnamFja1wnOiA0MDk4LCAnCisgICAgICAgICAgICAgICAgICInc2pvZXJkJzpcbiIKKyAgICAgICAgICAgICAgICAgJzQxMjd9IiBvciAiezQwOTg6IFwnamFja1wnLCA0MTI3OiBcJ3Nqb2VyZFwnfSIsIG9yIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgICciZGljdCJcbicKKyAgICAgICAgICAgICAgICAgJ2NvbnN0cnVjdG9yLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcyBkaWN0KCoqa3dhcmcpXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcyBkaWN0KG1hcHBpbmcsICoqa3dhcmcpXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcyBkaWN0KGl0ZXJhYmxlLCAqKmt3YXJnKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCBmcm9tIGFuIG9wdGlvbmFsICcKKyAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWxcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50IGFuZCBhIHBvc3NpYmx5IGVtcHR5IHNldCBvZiBrZXl3b3JkIGFyZ3VtZW50cy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgbm8gcG9zaXRpb25hbCBhcmd1bWVudCBpcyBnaXZlbiwgYW4gZW1wdHkgZGljdGlvbmFyeSAnCisgICAgICAgICAgICAgICAgICdpcyBjcmVhdGVkLlxuJworICAgICAgICAgICAgICAgICAnICAgSWYgYSBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuIGFuZCBpdCBpcyBhIG1hcHBpbmcgJworICAgICAgICAgICAgICAgICAnb2JqZWN0LCBhXG4nCisgICAgICAgICAgICAgICAgICcgICBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBrZXktdmFsdWUgcGFpcnMgYXMgJworICAgICAgICAgICAgICAgICAndGhlIG1hcHBpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdC4gIE90aGVyd2lzZSwgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgbXVzdCBiZSBhbiAnCisgICAgICAgICAgICAgICAgICcqaXRlcmFibGUqXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3QuICBFYWNoIGl0ZW0gaW4gdGhlIGl0ZXJhYmxlIG11c3QgaXRzZWxmIGJlIGFuICcKKyAgICAgICAgICAgICAgICAgJ2l0ZXJhYmxlIHdpdGhcbicKKyAgICAgICAgICAgICAgICAgJyAgIGV4YWN0bHkgdHdvIG9iamVjdHMuICBUaGUgZmlyc3Qgb2JqZWN0IG9mIGVhY2ggaXRlbSAnCisgICAgICAgICAgICAgICAgICdiZWNvbWVzIGEga2V5XG4nCisgICAgICAgICAgICAgICAgICcgICBpbiB0aGUgbmV3IGRpY3Rpb25hcnksIGFuZCB0aGUgc2Vjb25kIG9iamVjdCB0aGUgJworICAgICAgICAgICAgICAgICAnY29ycmVzcG9uZGluZ1xuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWUuICBJZiBhIGtleSBvY2N1cnMgbW9yZSB0aGFuIG9uY2UsIHRoZSBsYXN0IHZhbHVlICcKKyAgICAgICAgICAgICAgICAgJ2ZvciB0aGF0IGtleVxuJworICAgICAgICAgICAgICAgICAnICAgYmVjb21lcyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgbmV3IGRpY3Rpb25hcnkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIGtleXdvcmQgYXJndW1lbnRzIGFuZCAnCisgICAgICAgICAgICAgICAgICd0aGVpclxuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWVzIGFyZSBhZGRlZCB0byB0aGUgZGljdGlvbmFyeSBjcmVhdGVkIGZyb20gdGhlICcKKyAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWxcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50LiAgSWYgYSBrZXkgYmVpbmcgYWRkZWQgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgJworICAgICAgICAgICAgICAgICAndmFsdWUgZnJvbVxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIGtleXdvcmQgYXJndW1lbnQgcmVwbGFjZXMgdGhlIHZhbHVlIGZyb20gdGhlICcKKyAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWxcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUbyBpbGx1c3RyYXRlLCB0aGUgZm9sbG93aW5nIGV4YW1wbGVzIGFsbCByZXR1cm4gYSAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5IGVxdWFsXG4nCisgICAgICAgICAgICAgICAgICcgICB0byAieyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM30iOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICA+Pj4gYSA9IGRpY3Qob25lPTEsIHR3bz0yLCB0aHJlZT0zKVxuJworICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGIgPSB7J29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzfVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGMgPSBkaWN0KHppcChbJ29uZScsICd0d28nLCAndGhyZWUnXSwgWzEsIDIsIDNdKSlcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgID4+PiBkID0gZGljdChbKCd0d28nLCAyKSwgKCdvbmUnLCAxKSwgKCd0aHJlZScsIDMpXSlcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgID4+PiBlID0gZGljdCh7J3RocmVlJzogMywgJ29uZSc6IDEsICd0d28nOiAyfSlcbiIKKyAgICAgICAgICAgICAgICAgJyAgICAgID4+PiBhID09IGIgPT0gYyA9PSBkID09IGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFRydWVcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgUHJvdmlkaW5nIGtleXdvcmQgYXJndW1lbnRzIGFzIGluIHRoZSBmaXJzdCBleGFtcGxlIG9ubHkgJworICAgICAgICAgICAgICAgICAnd29ya3MgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICBrZXlzIHRoYXQgYXJlIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVycy4gIE90aGVyd2lzZSwgYW55ICcKKyAgICAgICAgICAgICAgICAgJ3ZhbGlkIGtleXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNhbiBiZSB1c2VkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGVzZSBhcmUgdGhlIG9wZXJhdGlvbnMgdGhhdCBkaWN0aW9uYXJpZXMgc3VwcG9ydCAoYW5kICcKKyAgICAgICAgICAgICAgICAgJ3RoZXJlZm9yZSxcbicKKyAgICAgICAgICAgICAgICAgJyAgIGN1c3RvbSBtYXBwaW5nIHR5cGVzIHNob3VsZCBzdXBwb3J0IHRvbyk6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGxlbihkKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGljdGlvbmFyeSAqZCouXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRba2V5XVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZXR1cm4gdGhlIGl0ZW0gb2YgKmQqIHdpdGgga2V5ICprZXkqLiAgUmFpc2VzIGEgJworICAgICAgICAgICAgICAgICAnIktleUVycm9yIiBpZlxuJworICAgICAgICAgICAgICAgICAnICAgICAgKmtleSogaXMgbm90IGluIHRoZSBtYXAuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIElmIGEgc3ViY2xhc3Mgb2YgZGljdCBkZWZpbmVzIGEgbWV0aG9kICJfX21pc3NpbmdfXygpIiAnCisgICAgICAgICAgICAgICAgICdhbmQgKmtleSpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGlzIG5vdCBwcmVzZW50LCB0aGUgImRba2V5XSIgb3BlcmF0aW9uIGNhbGxzIHRoYXQgJworICAgICAgICAgICAgICAgICAnbWV0aG9kIHdpdGhcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIHRoZSBrZXkgKmtleSogYXMgYXJndW1lbnQuICBUaGUgImRba2V5XSIgb3BlcmF0aW9uICcKKyAgICAgICAgICAgICAgICAgJ3RoZW4gcmV0dXJuc1xuJworICAgICAgICAgICAgICAgICAnICAgICAgb3IgcmFpc2VzIHdoYXRldmVyIGlzIHJldHVybmVkIG9yIHJhaXNlZCBieSB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICJfX21pc3NpbmdfXyhrZXkpIiBjYWxsLiBObyBvdGhlciBvcGVyYXRpb25zIG9yICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgaW52b2tlXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAiX19taXNzaW5nX18oKSIuIElmICJfX21pc3NpbmdfXygpIiBpcyBub3QgZGVmaW5lZCwgJworICAgICAgICAgICAgICAgICAnIktleUVycm9yIlxuJworICAgICAgICAgICAgICAgICAnICAgICAgaXMgcmFpc2VkLiAiX19taXNzaW5nX18oKSIgbXVzdCBiZSBhIG1ldGhvZDsgaXQgY2Fubm90ICcKKyAgICAgICAgICAgICAgICAgJ2JlIGFuXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBpbnN0YW5jZSB2YXJpYWJsZTpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgPj4+IGNsYXNzIENvdW50ZXIoZGljdCk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICAuLi4gICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgLi4uICAgICAgICAgcmV0dXJuIDBcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgID4+PiBjID0gQ291bnRlcigpXG4nCisgICAgICAgICAgICAgICAgICIgICAgICAgICA+Pj4gY1sncmVkJ11cbiIKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgIDBcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgID4+PiBjWydyZWQnXSArPSAxXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgICA+Pj4gY1sncmVkJ11cbiIKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgIDFcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgVGhlIGV4YW1wbGUgYWJvdmUgc2hvd3MgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICJjb2xsZWN0aW9ucy5Db3VudGVyIi4gIEEgZGlmZmVyZW50ICJfX21pc3NpbmdfXyIgJworICAgICAgICAgICAgICAgICAnbWV0aG9kIGlzIHVzZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGJ5ICJjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdCIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRba2V5XSA9IHZhbHVlXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFNldCAiZFtrZXldIiB0byAqdmFsdWUqLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBkZWwgZFtrZXldXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJlbW92ZSAiZFtrZXldIiBmcm9tICpkKi4gIFJhaXNlcyBhICJLZXlFcnJvciIgaWYgJworICAgICAgICAgICAgICAgICAnKmtleSogaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICcgICAgICBpbiB0aGUgbWFwLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBrZXkgaW4gZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZXR1cm4gIlRydWUiIGlmICpkKiBoYXMgYSBrZXkgKmtleSosIGVsc2UgIkZhbHNlIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAga2V5IG5vdCBpbiBkXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIEVxdWl2YWxlbnQgdG8gIm5vdCBrZXkgaW4gZCIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGl0ZXIoZClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgdGhlIGRpY3Rpb25hcnkuICAnCisgICAgICAgICAgICAgICAgICdUaGlzIGlzIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIHNob3J0Y3V0IGZvciAiaXRlcihkLmtleXMoKSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGVhcigpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSB0aGUgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY29weSgpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGUgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3NtZXRob2QgZnJvbWtleXMoc2VxWywgdmFsdWVdKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBDcmVhdGUgYSBuZXcgZGljdGlvbmFyeSB3aXRoIGtleXMgZnJvbSAqc2VxKiBhbmQgJworICAgICAgICAgICAgICAgICAndmFsdWVzIHNldCB0b1xuJworICAgICAgICAgICAgICAgICAnICAgICAgKnZhbHVlKi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgImZyb21rZXlzKCkiIGlzIGEgY2xhc3MgbWV0aG9kIHRoYXQgcmV0dXJucyBhIG5ldyAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAnICAgICAgKnZhbHVlKiBkZWZhdWx0cyB0byAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGdldChrZXlbLCBkZWZhdWx0XSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBmb3IgKmtleSogaWYgKmtleSogaXMgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnksIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICpkZWZhdWx0Ki4gSWYgKmRlZmF1bHQqIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gJworICAgICAgICAgICAgICAgICAnIk5vbmUiLCBzb1xuJworICAgICAgICAgICAgICAgICAnICAgICAgdGhhdCB0aGlzIG1ldGhvZCBuZXZlciByYWlzZXMgYSAiS2V5RXJyb3IiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBpdGVtcygpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGl0ZW1zICgiKGtleSwgJworICAgICAgICAgICAgICAgICAndmFsdWUpIlxuJworICAgICAgICAgICAgICAgICAnICAgICAgcGFpcnMpLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBrZXlzKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAiICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnkncyBrZXlzLiAgU2VlIHRoZVxuIgorICAgICAgICAgICAgICAgICAnICAgICAgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIHBvcChrZXlbLCBkZWZhdWx0XSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJlbW92ZSBpdCBhbmQgcmV0dXJuICcKKyAgICAgICAgICAgICAgICAgJ2l0cyB2YWx1ZSxcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGVsc2UgcmV0dXJuICpkZWZhdWx0Ki4gIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4gYW5kICcKKyAgICAgICAgICAgICAgICAgJyprZXkqIGlzXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBub3QgaW4gdGhlIGRpY3Rpb25hcnksIGEgIktleUVycm9yIiBpcyByYWlzZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIHBvcGl0ZW0oKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZW1vdmUgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgIihrZXksIHZhbHVlKSIgcGFpciAnCisgICAgICAgICAgICAgICAgICdmcm9tIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgICAgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgInBvcGl0ZW0oKSIgaXMgdXNlZnVsIHRvIGRlc3RydWN0aXZlbHkgaXRlcmF0ZSBvdmVyIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGRpY3Rpb25hcnksIGFzIG9mdGVuIHVzZWQgaW4gc2V0IGFsZ29yaXRobXMuICBJZiB0aGUgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeVxuJworICAgICAgICAgICAgICAgICAnICAgICAgaXMgZW1wdHksIGNhbGxpbmcgInBvcGl0ZW0oKSIgcmFpc2VzIGEgIktleUVycm9yIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgc2V0ZGVmYXVsdChrZXlbLCBkZWZhdWx0XSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdHMgdmFsdWUuICBJZiAnCisgICAgICAgICAgICAgICAgICdub3QsIGluc2VydFxuJworICAgICAgICAgICAgICAgICAnICAgICAgKmtleSogd2l0aCBhIHZhbHVlIG9mICpkZWZhdWx0KiBhbmQgcmV0dXJuICpkZWZhdWx0Ki4gICcKKyAgICAgICAgICAgICAgICAgJypkZWZhdWx0KlxuJworICAgICAgICAgICAgICAgICAnICAgICAgZGVmYXVsdHMgdG8gIk5vbmUiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICB1cGRhdGUoW290aGVyXSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgVXBkYXRlIHRoZSBkaWN0aW9uYXJ5IHdpdGggdGhlIGtleS92YWx1ZSBwYWlycyBmcm9tICcKKyAgICAgICAgICAgICAgICAgJypvdGhlciosXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBvdmVyd3JpdGluZyBleGlzdGluZyBrZXlzLiAgUmV0dXJuICJOb25lIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgInVwZGF0ZSgpIiBhY2NlcHRzIGVpdGhlciBhbm90aGVyIGRpY3Rpb25hcnkgb2JqZWN0IG9yICcKKyAgICAgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBpdGVyYWJsZSBvZiBrZXkvdmFsdWUgcGFpcnMgKGFzIHR1cGxlcyBvciBvdGhlciAnCisgICAgICAgICAgICAgICAgICdpdGVyYWJsZXMgb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGxlbmd0aCB0d28pLiAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCwgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnlcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGlzIHRoZW4gdXBkYXRlZCB3aXRoIHRob3NlIGtleS92YWx1ZSBwYWlyczogJworICAgICAgICAgICAgICAgICAnImQudXBkYXRlKHJlZD0xLFxuJworICAgICAgICAgICAgICAgICAnICAgICAgYmx1ZT0yKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlcygpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5J3MgdmFsdWVzLiAgU2VlICIKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgICAgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIERpY3Rpb25hcmllcyBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgJworICAgICAgICAgICAgICAgICAnc2FtZSAiKGtleSxcbicKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlKSIgcGFpcnMuIE9yZGVyIGNvbXBhcmlzb25zIChcJzxcJywgXCc8PVwnLCBcJz49XCcsICcKKyAgICAgICAgICAgICAgICAgIic+JykgcmFpc2VcbiIKKyAgICAgICAgICAgICAgICAgJyAgICJUeXBlRXJyb3IiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdTZWUgYWxzbzogInR5cGVzLk1hcHBpbmdQcm94eVR5cGUiIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhICcKKyAgICAgICAgICAgICAgICAgJ3JlYWQtb25seVxuJworICAgICAgICAgICAgICAgICAnICB2aWV3IG9mIGEgImRpY3QiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0RpY3Rpb25hcnkgdmlldyBvYmplY3RzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgb2JqZWN0cyByZXR1cm5lZCBieSAiZGljdC5rZXlzKCkiLCAiZGljdC52YWx1ZXMoKSIgYW5kXG4nCisgICAgICAgICAgICAgICAgICciZGljdC5pdGVtcygpIiBhcmUgKnZpZXcgb2JqZWN0cyouICBUaGV5IHByb3ZpZGUgYSBkeW5hbWljICcKKyAgICAgICAgICAgICAgICAgJ3ZpZXcgb24gdGhlXG4nCisgICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5J3MgZW50cmllcywgd2hpY2ggbWVhbnMgdGhhdCB3aGVuIHRoZSBkaWN0aW9uYXJ5ICIKKyAgICAgICAgICAgICAgICAgJ2NoYW5nZXMsXG4nCisgICAgICAgICAgICAgICAgICd0aGUgdmlldyByZWZsZWN0cyB0aGVzZSBjaGFuZ2VzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdEaWN0aW9uYXJ5IHZpZXdzIGNhbiBiZSBpdGVyYXRlZCBvdmVyIHRvIHlpZWxkIHRoZWlyICcKKyAgICAgICAgICAgICAgICAgJ3Jlc3BlY3RpdmUgZGF0YSxcbicKKyAgICAgICAgICAgICAgICAgJ2FuZCBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdHM6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2xlbihkaWN0dmlldylcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnaXRlcihkaWN0dmlldylcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMsIHZhbHVlcyBvciBpdGVtcyAnCisgICAgICAgICAgICAgICAgICcocmVwcmVzZW50ZWQgYXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIHR1cGxlcyBvZiAiKGtleSwgdmFsdWUpIikgaW4gdGhlIGRpY3Rpb25hcnkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiBhbiBhcmJpdHJhcnkgb3JkZXIgJworICAgICAgICAgICAgICAgICAnd2hpY2ggaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5vbi1yYW5kb20sIHZhcmllcyBhY3Jvc3MgUHl0aG9uIGltcGxlbWVudGF0aW9ucywgYW5kICcKKyAgICAgICAgICAgICAgICAgJ2RlcGVuZHMgb25cbicKKyAgICAgICAgICAgICAgICAgIiAgIHRoZSBkaWN0aW9uYXJ5J3MgaGlzdG9yeSBvZiBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMuIElmICIKKyAgICAgICAgICAgICAgICAgJ2tleXMsXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZXMgYW5kIGl0ZW1zIHZpZXdzIGFyZSBpdGVyYXRlZCBvdmVyIHdpdGggbm8gJworICAgICAgICAgICAgICAgICAnaW50ZXJ2ZW5pbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRpY3Rpb25hcnksIHRoZSBvcmRlciBvZiBpdGVtcyB3aWxsICcKKyAgICAgICAgICAgICAgICAgJ2RpcmVjdGx5XG4nCisgICAgICAgICAgICAgICAgICcgICBjb3JyZXNwb25kLiAgVGhpcyBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mICIodmFsdWUsIGtleSkiICcKKyAgICAgICAgICAgICAgICAgJ3BhaXJzIHVzaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICAiemlwKCkiOiAicGFpcnMgPSB6aXAoZC52YWx1ZXMoKSwgZC5rZXlzKCkpIi4gIEFub3RoZXIgJworICAgICAgICAgICAgICAgICAnd2F5IHRvXG4nCisgICAgICAgICAgICAgICAgICcgICBjcmVhdGUgdGhlIHNhbWUgbGlzdCBpcyAicGFpcnMgPSBbKHYsIGspIGZvciAoaywgdikgaW4gJworICAgICAgICAgICAgICAgICAnZC5pdGVtcygpXSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEl0ZXJhdGluZyB2aWV3cyB3aGlsZSBhZGRpbmcgb3IgZGVsZXRpbmcgZW50cmllcyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeVxuJworICAgICAgICAgICAgICAgICAnICAgbWF5IHJhaXNlIGEgIlJ1bnRpbWVFcnJvciIgb3IgZmFpbCB0byBpdGVyYXRlIG92ZXIgYWxsICcKKyAgICAgICAgICAgICAgICAgJ2VudHJpZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ3ggaW4gZGljdHZpZXdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgUmV0dXJuICJUcnVlIiBpZiAqeCogaXMgaW4gdGhlIHVuZGVybHlpbmcgZGljdGlvbmFyeVwncyAnCisgICAgICAgICAgICAgICAgICdrZXlzLCB2YWx1ZXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9yIGl0ZW1zIChpbiB0aGUgbGF0dGVyIGNhc2UsICp4KiBzaG91bGQgYmUgYSAiKGtleSwgJworICAgICAgICAgICAgICAgICAndmFsdWUpIlxuJworICAgICAgICAgICAgICAgICAnICAgdHVwbGUpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdLZXlzIHZpZXdzIGFyZSBzZXQtbGlrZSBzaW5jZSB0aGVpciBlbnRyaWVzIGFyZSB1bmlxdWUgYW5kICcKKyAgICAgICAgICAgICAgICAgJ2hhc2hhYmxlLlxuJworICAgICAgICAgICAgICAgICAnSWYgYWxsIHZhbHVlcyBhcmUgaGFzaGFibGUsIHNvIHRoYXQgIihrZXksIHZhbHVlKSIgcGFpcnMgYXJlICcKKyAgICAgICAgICAgICAgICAgJ3VuaXF1ZVxuJworICAgICAgICAgICAgICAgICAnYW5kIGhhc2hhYmxlLCB0aGVuIHRoZSBpdGVtcyB2aWV3IGlzIGFsc28gc2V0LWxpa2UuICAoVmFsdWVzICcKKyAgICAgICAgICAgICAgICAgJ3ZpZXdzIGFyZVxuJworICAgICAgICAgICAgICAgICAnbm90IHRyZWF0ZWQgYXMgc2V0LWxpa2Ugc2luY2UgdGhlIGVudHJpZXMgYXJlIGdlbmVyYWxseSBub3QgJworICAgICAgICAgICAgICAgICAndW5pcXVlLilcbicKKyAgICAgICAgICAgICAgICAgJ0ZvciBzZXQtbGlrZSB2aWV3cywgYWxsIG9mIHRoZSBvcGVyYXRpb25zIGRlZmluZWQgZm9yIHRoZSAnCisgICAgICAgICAgICAgICAgICdhYnN0cmFjdFxuJworICAgICAgICAgICAgICAgICAnYmFzZSBjbGFzcyAiY29sbGVjdGlvbnMuYWJjLlNldCIgYXJlIGF2YWlsYWJsZSAoZm9yIGV4YW1wbGUsICcKKyAgICAgICAgICAgICAgICAgJyI9PSIsXG4nCisgICAgICAgICAgICAgICAgICciPCIsIG9yICJeIikuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0FuIGV4YW1wbGUgb2YgZGljdGlvbmFyeSB2aWV3IHVzYWdlOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICIgICA+Pj4gZGlzaGVzID0geydlZ2dzJzogMiwgJ3NhdXNhZ2UnOiAxLCAnYmFjb24nOiAxLCAiCisgICAgICAgICAgICAgICAgICInc3BhbSc6IDUwMH1cbiIKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBrZXlzID0gZGlzaGVzLmtleXMoKVxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IHZhbHVlcyA9IGRpc2hlcy52YWx1ZXMoKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gIyBpdGVyYXRpb25cbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBuID0gMFxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGZvciB2YWwgaW4gdmFsdWVzOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBuICs9IHZhbFxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IHByaW50KG4pXG4nCisgICAgICAgICAgICAgICAgICcgICA1MDRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+ICMga2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIHRoZSBzYW1lICcKKyAgICAgICAgICAgICAgICAgJ29yZGVyXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gbGlzdChrZXlzKVxuJworICAgICAgICAgICAgICAgICAiICAgWydlZ2dzJywgJ2JhY29uJywgJ3NhdXNhZ2UnLCAnc3BhbSddXG4iCisgICAgICAgICAgICAgICAgICcgICA+Pj4gbGlzdCh2YWx1ZXMpXG4nCisgICAgICAgICAgICAgICAgICcgICBbMiwgMSwgMSwgNTAwXVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gIyB2aWV3IG9iamVjdHMgYXJlIGR5bmFtaWMgYW5kIHJlZmxlY3QgZGljdCBjaGFuZ2VzXG4nCisgICAgICAgICAgICAgICAgICIgICA+Pj4gZGVsIGRpc2hlc1snZWdncyddXG4iCisgICAgICAgICAgICAgICAgICIgICA+Pj4gZGVsIGRpc2hlc1snc2F1c2FnZSddXG4iCisgICAgICAgICAgICAgICAgICcgICA+Pj4gbGlzdChrZXlzKVxuJworICAgICAgICAgICAgICAgICAiICAgWydzcGFtJywgJ2JhY29uJ11cbiIKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+ICMgc2V0IG9wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBrZXlzICYgeydlZ2dzJywgJ2JhY29uJywgJ3NhbGFkJ31cbiIKKyAgICAgICAgICAgICAgICAgIiAgIHsnYmFjb24nfVxuIgorICAgICAgICAgICAgICAgICAiICAgPj4+IGtleXMgXiB7J3NhdXNhZ2UnLCAnanVpY2UnfVxuIgorICAgICAgICAgICAgICAgICAiICAgeydqdWljZScsICdzYXVzYWdlJywgJ2JhY29uJywgJ3NwYW0nfVxuIiwKKyAndHlwZXNtZXRob2RzJzogJ1xuJworICAgICAgICAgICAgICAgICAnTWV0aG9kc1xuJworICAgICAgICAgICAgICAgICAnKioqKioqKlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdNZXRob2RzIGFyZSBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIHVzaW5nIHRoZSBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAnbm90YXRpb24uXG4nCisgICAgICAgICAgICAgICAgICdUaGVyZSBhcmUgdHdvIGZsYXZvcnM6IGJ1aWx0LWluIG1ldGhvZHMgKHN1Y2ggYXMgImFwcGVuZCgpIiAnCisgICAgICAgICAgICAgICAgICdvbiBsaXN0cylcbicKKyAgICAgICAgICAgICAgICAgJ2FuZCBjbGFzcyBpbnN0YW5jZSBtZXRob2RzLiAgQnVpbHQtaW4gbWV0aG9kcyBhcmUgZGVzY3JpYmVkICcKKyAgICAgICAgICAgICAgICAgJ3dpdGggdGhlXG4nCisgICAgICAgICAgICAgICAgICd0eXBlcyB0aGF0IHN1cHBvcnQgdGhlbS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSWYgeW91IGFjY2VzcyBhIG1ldGhvZCAoYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgY2xhc3MgJworICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlKVxuJworICAgICAgICAgICAgICAgICAndGhyb3VnaCBhbiBpbnN0YW5jZSwgeW91IGdldCBhIHNwZWNpYWwgb2JqZWN0OiBhICpib3VuZCAnCisgICAgICAgICAgICAgICAgICdtZXRob2QqIChhbHNvXG4nCisgICAgICAgICAgICAgICAgICdjYWxsZWQgKmluc3RhbmNlIG1ldGhvZCopIG9iamVjdC4gV2hlbiBjYWxsZWQsIGl0IHdpbGwgYWRkICcKKyAgICAgICAgICAgICAgICAgJ3RoZSAic2VsZiJcbicKKyAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IHRvIHRoZSBhcmd1bWVudCBsaXN0LiAgQm91bmQgbWV0aG9kcyBoYXZlIHR3byAnCisgICAgICAgICAgICAgICAgICdzcGVjaWFsIHJlYWQtXG4nCisgICAgICAgICAgICAgICAgICdvbmx5IGF0dHJpYnV0ZXM6ICJtLl9fc2VsZl9fIiBpcyB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSAnCisgICAgICAgICAgICAgICAgICdtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgJ29wZXJhdGVzLCBhbmQgIm0uX19mdW5jX18iIGlzIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRpbmcgdGhlICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgJ0NhbGxpbmcgIm0oYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKSIgaXMgY29tcGxldGVseSAnCisgICAgICAgICAgICAgICAgICdlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgICAgICAgICdjYWxsaW5nICJtLl9fZnVuY19fKG0uX19zZWxmX18sIGFyZy0xLCBhcmctMiwgLi4uLCBhcmctbikiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdMaWtlIGZ1bmN0aW9uIG9iamVjdHMsIGJvdW5kIG1ldGhvZCBvYmplY3RzIHN1cHBvcnQgZ2V0dGluZyAnCisgICAgICAgICAgICAgICAgICdhcmJpdHJhcnlcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMuICBIb3dldmVyLCBzaW5jZSBtZXRob2QgYXR0cmlidXRlcyBhcmUgYWN0dWFsbHkgJworICAgICAgICAgICAgICAgICAnc3RvcmVkIG9uXG4nCisgICAgICAgICAgICAgICAgICd0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QgKCJtZXRoLl9fZnVuY19fIiksIHNldHRpbmcgJworICAgICAgICAgICAgICAgICAnbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVzIG9uIGJvdW5kIG1ldGhvZHMgaXMgZGlzYWxsb3dlZC4gIEF0dGVtcHRpbmcgdG8gJworICAgICAgICAgICAgICAgICAnc2V0IGFuXG4nCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgb24gYSBtZXRob2QgcmVzdWx0cyBpbiBhbiAiQXR0cmlidXRlRXJyb3IiIGJlaW5nICcKKyAgICAgICAgICAgICAgICAgJ3JhaXNlZC4gIEluXG4nCisgICAgICAgICAgICAgICAgICdvcmRlciB0byBzZXQgYSBtZXRob2QgYXR0cmlidXRlLCB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHNldCAnCisgICAgICAgICAgICAgICAgICdpdCBvbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ3VuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0OlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gY2xhc3MgQzpcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgZGVmIG1ldGhvZChzZWxmKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGMgPSBDKClcbicKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBjLm1ldGhvZC53aG9hbWkgPSAnbXkgbmFtZSBpcyBtZXRob2QnICAjIGNhbid0IHNldCBvbiAiCisgICAgICAgICAgICAgICAgICd0aGUgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4nCisgICAgICAgICAgICAgICAgICIgICBBdHRyaWJ1dGVFcnJvcjogJ21ldGhvZCcgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgICAgICAiJ3dob2FtaSdcbiIKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBjLm1ldGhvZC5fX2Z1bmNfXy53aG9hbWkgPSAnbXkgbmFtZSBpcyBtZXRob2QnXG4iCisgICAgICAgICAgICAgICAgICcgICA+Pj4gYy5tZXRob2Qud2hvYW1pXG4nCisgICAgICAgICAgICAgICAgICIgICAnbXkgbmFtZSBpcyBtZXRob2QnXG4iCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NlZSBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAorICd0eXBlc21vZHVsZXMnOiAnXG4nCisgICAgICAgICAgICAgICAgICdNb2R1bGVzXG4nCisgICAgICAgICAgICAgICAgICcqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBvbmx5IHNwZWNpYWwgb3BlcmF0aW9uIG9uIGEgbW9kdWxlIGlzIGF0dHJpYnV0ZSBhY2Nlc3M6ICcKKyAgICAgICAgICAgICAgICAgJyJtLm5hbWUiLFxuJworICAgICAgICAgICAgICAgICAnd2hlcmUgKm0qIGlzIGEgbW9kdWxlIGFuZCAqbmFtZSogYWNjZXNzZXMgYSBuYW1lIGRlZmluZWQgaW4gJworICAgICAgICAgICAgICAgICAiKm0qJ3NcbiIKKyAgICAgICAgICAgICAgICAgJ3N5bWJvbCB0YWJsZS4gTW9kdWxlIGF0dHJpYnV0ZXMgY2FuIGJlIGFzc2lnbmVkIHRvLiAgKE5vdGUgJworICAgICAgICAgICAgICAgICAndGhhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyJpbXBvcnQiIHN0YXRlbWVudCBpcyBub3QsIHN0cmljdGx5IHNwZWFraW5nLCBhbiBvcGVyYXRpb24gJworICAgICAgICAgICAgICAgICAnb24gYSBtb2R1bGVcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdDsgImltcG9ydCBmb28iIGRvZXMgbm90IHJlcXVpcmUgYSBtb2R1bGUgb2JqZWN0IG5hbWVkICcKKyAgICAgICAgICAgICAgICAgJypmb28qIHRvXG4nCisgICAgICAgICAgICAgICAgICdleGlzdCwgcmF0aGVyIGl0IHJlcXVpcmVzIGFuIChleHRlcm5hbCkgKmRlZmluaXRpb24qIGZvciBhICcKKyAgICAgICAgICAgICAgICAgJ21vZHVsZVxuJworICAgICAgICAgICAgICAgICAnbmFtZWQgKmZvbyogc29tZXdoZXJlLilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQSBzcGVjaWFsIGF0dHJpYnV0ZSBvZiBldmVyeSBtb2R1bGUgaXMgIl9fZGljdF9fIi4gVGhpcyBpcyAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgImRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLiBNb2RpZnlpbmcgIgorICAgICAgICAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICAgICAgICAiZGljdGlvbmFyeSB3aWxsIGFjdHVhbGx5IGNoYW5nZSB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLCAiCisgICAgICAgICAgICAgICAgICdidXQgZGlyZWN0XG4nCisgICAgICAgICAgICAgICAgICdhc3NpZ25tZW50IHRvIHRoZSAiX19kaWN0X18iIGF0dHJpYnV0ZSBpcyBub3QgcG9zc2libGUgKHlvdSAnCisgICAgICAgICAgICAgICAgICdjYW4gd3JpdGVcbicKKyAgICAgICAgICAgICAgICAgJyJtLl9fZGljdF9fW1wnYVwnXSA9IDEiLCB3aGljaCBkZWZpbmVzICJtLmEiIHRvIGJlICIxIiwgYnV0ICcKKyAgICAgICAgICAgICAgICAgInlvdSBjYW4ndFxuIgorICAgICAgICAgICAgICAgICAnd3JpdGUgIm0uX19kaWN0X18gPSB7fSIpLiAgTW9kaWZ5aW5nICJfX2RpY3RfXyIgZGlyZWN0bHkgaXMgJworICAgICAgICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICAgICAgICdyZWNvbW1lbmRlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnTW9kdWxlcyBidWlsdCBpbnRvIHRoZSBpbnRlcnByZXRlciBhcmUgd3JpdHRlbiBsaWtlIHRoaXM6ICcKKyAgICAgICAgICAgICAgICAgJyI8bW9kdWxlXG4nCisgICAgICAgICAgICAgICAgICdcJ3N5c1wnIChidWlsdC1pbik+Ii4gIElmIGxvYWRlZCBmcm9tIGEgZmlsZSwgdGhleSBhcmUgJworICAgICAgICAgICAgICAgICAnd3JpdHRlbiBhc1xuJworICAgICAgICAgICAgICAgICAnIjxtb2R1bGUgXCdvc1wnIGZyb20gJworICAgICAgICAgICAgICAgICAnXCcvdXNyL2xvY2FsL2xpYi9weXRob25YLlkvb3MucHljXCc+Ii5cbicsCisgJ3R5cGVzc2VxJzogJ1xuJworICAgICAgICAgICAgICdTZXF1ZW5jZSBUeXBlcyAtLS0gImxpc3QiLCAidHVwbGUiLCAicmFuZ2UiXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZXJlIGFyZSB0aHJlZSBiYXNpYyBzZXF1ZW5jZSB0eXBlczogbGlzdHMsIHR1cGxlcywgYW5kIHJhbmdlXG4nCisgICAgICAgICAgICAgJ29iamVjdHMuIEFkZGl0aW9uYWwgc2VxdWVuY2UgdHlwZXMgdGFpbG9yZWQgZm9yIHByb2Nlc3Npbmcgb2YgJworICAgICAgICAgICAgICdiaW5hcnlcbicKKyAgICAgICAgICAgICAnZGF0YSBhbmQgdGV4dCBzdHJpbmdzIGFyZSBkZXNjcmliZWQgaW4gZGVkaWNhdGVkIHNlY3Rpb25zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NvbW1vbiBTZXF1ZW5jZSBPcGVyYXRpb25zXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBzdXBwb3J0ZWQgYnkgbW9zdCAnCisgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgJ3R5cGVzLCBib3RoIG11dGFibGUgYW5kIGltbXV0YWJsZS4gVGhlICcKKyAgICAgICAgICAgICAnImNvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZSIgQUJDXG4nCisgICAgICAgICAgICAgJ2lzIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlc2UgJworICAgICAgICAgICAgICdvcGVyYXRpb25zXG4nCisgICAgICAgICAgICAgJ29uIGN1c3RvbSBzZXF1ZW5jZSB0eXBlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoaXMgdGFibGUgbGlzdHMgdGhlIHNlcXVlbmNlIG9wZXJhdGlvbnMgc29ydGVkIGluIGFzY2VuZGluZyAnCisgICAgICAgICAgICAgJ3ByaW9yaXR5LlxuJworICAgICAgICAgICAgICdJbiB0aGUgdGFibGUsICpzKiBhbmQgKnQqIGFyZSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgdHlwZSwgKm4qLCAnCisgICAgICAgICAgICAgJyppKixcbicKKyAgICAgICAgICAgICAnKmoqIGFuZCAqayogYXJlIGludGVnZXJzIGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0ICcKKyAgICAgICAgICAgICAnbWVldHMgYW55XG4nCisgICAgICAgICAgICAgJ3R5cGUgYW5kIHZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiaW4iIGFuZCAibm90IGluIiBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdGllcyBhcyAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdjb21wYXJpc29uIG9wZXJhdGlvbnMuIFRoZSAiKyIgKGNvbmNhdGVuYXRpb24pIGFuZCAiKiIgJworICAgICAgICAgICAgICcocmVwZXRpdGlvbilcbicKKyAgICAgICAgICAgICAnb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBjb3JyZXNwb25kaW5nIG51bWVyaWNcbicKKyAgICAgICAgICAgICAnb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICd8IE5vdGVzICAgICAgfFxuJworICAgICAgICAgICAgICcrPT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAnfCAieCBpbiBzIiAgICAgICAgICAgICAgICAgICB8ICJUcnVlIiBpZiBhbiBpdGVtIG9mICpzKiBpcyAgICAgICcKKyAgICAgICAgICAgICAnfCAoMSkgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSAiRmFsc2UiICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInggbm90IGluIHMiICAgICAgICAgICAgICAgfCAiRmFsc2UiIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgICAnCisgICAgICAgICAgICAgJ3wgKDEpICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgIlRydWUiICAgICAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzICsgdCIgICAgICAgICAgICAgICAgICAgIHwgdGhlIGNvbmNhdGVuYXRpb24gb2YgKnMqIGFuZCAqdCogJworICAgICAgICAgICAgICd8ICg2KSg3KSAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicyAqIG4iIG9yICJuICogcyIgICAgICAgICB8IGVxdWl2YWxlbnQgdG8gYWRkaW5nICpzKiB0byAgICAgICcKKyAgICAgICAgICAgICAnfCAoMikoNykgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0c2VsZiAqbiogdGltZXMgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInNbaV0iICAgICAgICAgICAgICAgICAgICAgfCAqaSp0aCBpdGVtIG9mICpzKiwgb3JpZ2luIDAgICAgICAnCisgICAgICAgICAgICAgJ3wgKDMpICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiAgICAgJworICAgICAgICAgICAgICd8ICgzKSg0KSAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAic1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgICcKKyAgICAgICAgICAgICAnfCAoMykoNSkgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdpdGggc3RlcCAqayogICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgImxlbihzKSIgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgKnMqICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJtaW4ocykiICAgICAgICAgICAgICAgICAgIHwgc21hbGxlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAibWF4KHMpIiAgICAgICAgICAgICAgICAgICB8IGxhcmdlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMuaW5kZXgoeFssIGlbLCBqXV0pIiAgICAgfCBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAnCisgICAgICAgICAgICAgJ3wgKDgpICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogaW4gKnMqIChhdCBvciBhZnRlciBpbmRleCAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqaSogYW5kIGJlZm9yZSBpbmRleCAqaiopICAgICAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLmNvdW50KHgpIiAgICAgICAgICAgICAgIHwgdG90YWwgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqIGluICpzKiAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlIGFsc28gc3VwcG9ydCBjb21wYXJpc29ucy4gIEluICcKKyAgICAgICAgICAgICAncGFydGljdWxhcixcbicKKyAgICAgICAgICAgICAndHVwbGVzIGFuZCBsaXN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgY29tcGFyaW5nXG4nCisgICAgICAgICAgICAgJ2NvcnJlc3BvbmRpbmcgZWxlbWVudHMuIFRoaXMgbWVhbnMgdGhhdCB0byBjb21wYXJlIGVxdWFsLCBldmVyeVxuJworICAgICAgICAgICAgICdlbGVtZW50IG11c3QgY29tcGFyZSBlcXVhbCBhbmQgdGhlIHR3byBzZXF1ZW5jZXMgbXVzdCBiZSBvZiB0aGUgJworICAgICAgICAgICAgICdzYW1lXG4nCisgICAgICAgICAgICAgJ3R5cGUgYW5kIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLiAgKEZvciBmdWxsIGRldGFpbHMgc2VlICcKKyAgICAgICAgICAgICAnQ29tcGFyaXNvbnMgaW5cbicKKyAgICAgICAgICAgICAndGhlIGxhbmd1YWdlIHJlZmVyZW5jZS4pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzEuIFdoaWxlIHRoZSAiaW4iIGFuZCAibm90IGluIiBvcGVyYXRpb25zIGFyZSB1c2VkIG9ubHkgZm9yICcKKyAgICAgICAgICAgICAnc2ltcGxlXG4nCisgICAgICAgICAgICAgJyAgIGNvbnRhaW5tZW50IHRlc3RpbmcgaW4gdGhlIGdlbmVyYWwgY2FzZSwgc29tZSBzcGVjaWFsaXNlZCAnCisgICAgICAgICAgICAgJ3NlcXVlbmNlc1xuJworICAgICAgICAgICAgICcgICAoc3VjaCBhcyAic3RyIiwgImJ5dGVzIiBhbmQgImJ5dGVhcnJheSIpIGFsc28gdXNlIHRoZW0gZm9yXG4nCisgICAgICAgICAgICAgJyAgIHN1YnNlcXVlbmNlIHRlc3Rpbmc6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICA+Pj4gImdnIiBpbiAiZWdncyJcbicKKyAgICAgICAgICAgICAnICAgICAgVHJ1ZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnMi4gVmFsdWVzIG9mICpuKiBsZXNzIHRoYW4gIjAiIGFyZSB0cmVhdGVkIGFzICIwIiAod2hpY2ggeWllbGRzICcKKyAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAnICAgZW1wdHkgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyAqcyopLiAgTm90ZSB0aGF0IGl0ZW1zIGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgIHNlcXVlbmNlICpzKiBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCBtdWx0aXBsZSAnCisgICAgICAgICAgICAgJ3RpbWVzLlxuJworICAgICAgICAgICAgICcgICBUaGlzIG9mdGVuIGhhdW50cyBuZXcgUHl0aG9uIHByb2dyYW1tZXJzOyBjb25zaWRlcjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0cyA9IFtbXV0gKiAzXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0c1xuJworICAgICAgICAgICAgICcgICAgICBbW10sIFtdLCBbXV1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdHNcbicKKyAgICAgICAgICAgICAnICAgICAgW1szXSwgWzNdLCBbM11dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaGF0IGhhcyBoYXBwZW5lZCBpcyB0aGF0ICJbW11dIiBpcyBhIG9uZS1lbGVtZW50IGxpc3QgJworICAgICAgICAgICAgICdjb250YWluaW5nXG4nCisgICAgICAgICAgICAgJyAgIGFuIGVtcHR5IGxpc3QsIHNvIGFsbCB0aHJlZSBlbGVtZW50cyBvZiAiW1tdXSAqIDMiIGFyZSAnCisgICAgICAgICAgICAgJ3JlZmVyZW5jZXNcbicKKyAgICAgICAgICAgICAnICAgdG8gdGhpcyBzaW5nbGUgZW1wdHkgbGlzdC4gIE1vZGlmeWluZyBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mXG4nCisgICAgICAgICAgICAgJyAgICJsaXN0cyIgbW9kaWZpZXMgdGhpcyBzaW5nbGUgbGlzdC4gWW91IGNhbiBjcmVhdGUgYSBsaXN0IG9mXG4nCisgICAgICAgICAgICAgJyAgIGRpZmZlcmVudCBsaXN0cyB0aGlzIHdheTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0cyA9IFtbXSBmb3IgaSBpbiByYW5nZSgzKV1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdHNbMV0uYXBwZW5kKDUpXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0c1syXS5hcHBlbmQoNylcbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzXG4nCisgICAgICAgICAgICAgJyAgICAgIFtbM10sIFs1XSwgWzddXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRnVydGhlciBleHBsYW5hdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIEZBUSBlbnRyeSBIb3cgZG8gSSAnCisgICAgICAgICAgICAgJ2NyZWF0ZSBhXG4nCisgICAgICAgICAgICAgJyAgIG11bHRpZGltZW5zaW9uYWwgbGlzdD8uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICczLiBJZiAqaSogb3IgKmoqIGlzIG5lZ2F0aXZlLCB0aGUgaW5kZXggaXMgcmVsYXRpdmUgdG8gdGhlIGVuZCAnCisgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgJyAgIHRoZSBzdHJpbmc6ICJsZW4ocykgKyBpIiBvciAibGVuKHMpICsgaiIgaXMgc3Vic3RpdHV0ZWQuICBCdXQgJworICAgICAgICAgICAgICdub3RlXG4nCisgICAgICAgICAgICAgJyAgIHRoYXQgIi0wIiBpcyBzdGlsbCAiMCIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc0LiBUaGUgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiBpcyBkZWZpbmVkIGFzIHRoZSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgJyAgIGl0ZW1zIHdpdGggaW5kZXggKmsqIHN1Y2ggdGhhdCAiaSA8PSBrIDwgaiIuICBJZiAqaSogb3IgKmoqICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnICAgZ3JlYXRlciB0aGFuICJsZW4ocykiLCB1c2UgImxlbihzKSIuICBJZiAqaSogaXMgb21pdHRlZCBvciAnCisgICAgICAgICAgICAgJyJOb25lIixcbicKKyAgICAgICAgICAgICAnICAgdXNlICIwIi4gIElmICpqKiBpcyBvbWl0dGVkIG9yICJOb25lIiwgdXNlICJsZW4ocykiLiAgSWYgKmkqICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICpqKiwgdGhlIHNsaWNlIGlzIGVtcHR5LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnNS4gVGhlIHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogd2l0aCBzdGVwICprKiBpcyBkZWZpbmVkIGFzICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgIHNlcXVlbmNlIG9mIGl0ZW1zIHdpdGggaW5kZXggICJ4ID0gaSArIG4qayIgc3VjaCB0aGF0ICIwIDw9IG4gJworICAgICAgICAgICAgICc8XG4nCisgICAgICAgICAgICAgJyAgIChqLWkpL2siLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBpbmRpY2VzIGFyZSAiaSIsICJpK2siLCAnCisgICAgICAgICAgICAgJyJpKzIqayIsXG4nCisgICAgICAgICAgICAgJyAgICJpKzMqayIgYW5kIHNvIG9uLCBzdG9wcGluZyB3aGVuICpqKiBpcyByZWFjaGVkIChidXQgbmV2ZXJcbicKKyAgICAgICAgICAgICAnICAgaW5jbHVkaW5nICpqKikuICBJZiAqaSogb3IgKmoqIGlzIGdyZWF0ZXIgdGhhbiAibGVuKHMpIiwgdXNlXG4nCisgICAgICAgICAgICAgJyAgICJsZW4ocykiLiAgSWYgKmkqIG9yICpqKiBhcmUgb21pdHRlZCBvciAiTm9uZSIsIHRoZXkgYmVjb21lICcKKyAgICAgICAgICAgICAnImVuZCJcbicKKyAgICAgICAgICAgICAnICAgdmFsdWVzICh3aGljaCBlbmQgZGVwZW5kcyBvbiB0aGUgc2lnbiBvZiAqayopLiAgTm90ZSwgKmsqICcKKyAgICAgICAgICAgICAnY2Fubm90IGJlXG4nCisgICAgICAgICAgICAgJyAgIHplcm8uIElmICprKiBpcyAiTm9uZSIsIGl0IGlzIHRyZWF0ZWQgbGlrZSAiMSIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc2LiBDb25jYXRlbmF0aW5nIGltbXV0YWJsZSBzZXF1ZW5jZXMgYWx3YXlzIHJlc3VsdHMgaW4gYSBuZXdcbicKKyAgICAgICAgICAgICAnICAgb2JqZWN0LiBUaGlzIG1lYW5zIHRoYXQgYnVpbGRpbmcgdXAgYSBzZXF1ZW5jZSBieSByZXBlYXRlZFxuJworICAgICAgICAgICAgICcgICBjb25jYXRlbmF0aW9uIHdpbGwgaGF2ZSBhIHF1YWRyYXRpYyBydW50aW1lIGNvc3QgaW4gdGhlICcKKyAgICAgICAgICAgICAndG90YWxcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2UgbGVuZ3RoLiBUbyBnZXQgYSBsaW5lYXIgcnVudGltZSBjb3N0LCB5b3UgbXVzdCAnCisgICAgICAgICAgICAgJ3N3aXRjaCB0b1xuJworICAgICAgICAgICAgICcgICBvbmUgb2YgdGhlIGFsdGVybmF0aXZlcyBiZWxvdzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogaWYgY29uY2F0ZW5hdGluZyAic3RyIiBvYmplY3RzLCB5b3UgY2FuIGJ1aWxkIGEgbGlzdCBhbmQgJworICAgICAgICAgICAgICd1c2VcbicKKyAgICAgICAgICAgICAnICAgICAic3RyLmpvaW4oKSIgYXQgdGhlIGVuZCBvciBlbHNlIHdyaXRlIHRvIGFuICJpby5TdHJpbmdJTyJcbicKKyAgICAgICAgICAgICAnICAgICBpbnN0YW5jZSBhbmQgcmV0cmlldmUgaXRzIHZhbHVlIHdoZW4gY29tcGxldGVcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogaWYgY29uY2F0ZW5hdGluZyAiYnl0ZXMiIG9iamVjdHMsIHlvdSBjYW4gc2ltaWxhcmx5IHVzZVxuJworICAgICAgICAgICAgICcgICAgICJieXRlcy5qb2luKCkiIG9yICJpby5CeXRlc0lPIiwgb3IgeW91IGNhbiBkbyBpbi1wbGFjZVxuJworICAgICAgICAgICAgICcgICAgIGNvbmNhdGVuYXRpb24gd2l0aCBhICJieXRlYXJyYXkiIG9iamVjdC4gICJieXRlYXJyYXkiICcKKyAgICAgICAgICAgICAnb2JqZWN0cyBhcmVcbicKKyAgICAgICAgICAgICAnICAgICBtdXRhYmxlIGFuZCBoYXZlIGFuIGVmZmljaWVudCBvdmVyYWxsb2NhdGlvbiBtZWNoYW5pc21cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogaWYgY29uY2F0ZW5hdGluZyAidHVwbGUiIG9iamVjdHMsIGV4dGVuZCBhICJsaXN0IiBpbnN0ZWFkXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIGZvciBvdGhlciB0eXBlcywgaW52ZXN0aWdhdGUgdGhlIHJlbGV2YW50IGNsYXNzICcKKyAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvblxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnNy4gU29tZSBzZXF1ZW5jZSB0eXBlcyAoc3VjaCBhcyAicmFuZ2UiKSBvbmx5IHN1cHBvcnQgaXRlbVxuJworICAgICAgICAgICAgICIgICBzZXF1ZW5jZXMgdGhhdCBmb2xsb3cgc3BlY2lmaWMgcGF0dGVybnMsIGFuZCBoZW5jZSBkb24ndCAiCisgICAgICAgICAgICAgJ3N1cHBvcnRcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2UgY29uY2F0ZW5hdGlvbiBvciByZXBldGl0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnOC4gImluZGV4IiByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gKngqIGlzIG5vdCBmb3VuZCBpbiAqcyouICcKKyAgICAgICAgICAgICAnV2hlblxuJworICAgICAgICAgICAgICcgICBzdXBwb3J0ZWQsIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgaW5kZXggbWV0aG9kICcKKyAgICAgICAgICAgICAnYWxsb3dcbicKKyAgICAgICAgICAgICAnICAgZWZmaWNpZW50IHNlYXJjaGluZyBvZiBzdWJzZWN0aW9ucyBvZiB0aGUgc2VxdWVuY2UuIFBhc3NpbmcgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgZXh0cmEgYXJndW1lbnRzIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byB1c2luZyAnCisgICAgICAgICAgICAgJyJzW2k6al0uaW5kZXgoeCkiLFxuJworICAgICAgICAgICAgICcgICBvbmx5IHdpdGhvdXQgY29weWluZyBhbnkgZGF0YSBhbmQgd2l0aCB0aGUgcmV0dXJuZWQgaW5kZXggJworICAgICAgICAgICAgICdiZWluZ1xuJworICAgICAgICAgICAgICcgICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlcXVlbmNlIHJhdGhlciB0aGFuIHRoZSBzdGFydCAnCisgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICcgICBzbGljZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJbW11dGFibGUgU2VxdWVuY2UgVHlwZXNcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgb25seSBvcGVyYXRpb24gdGhhdCBpbW11dGFibGUgc2VxdWVuY2UgdHlwZXMgZ2VuZXJhbGx5ICcKKyAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgJ3RoYXQgaXMgbm90IGFsc28gaW1wbGVtZW50ZWQgYnkgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBpcyAnCisgICAgICAgICAgICAgJ3N1cHBvcnQgZm9yXG4nCisgICAgICAgICAgICAgJ3RoZSAiaGFzaCgpIiBidWlsdC1pbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoaXMgc3VwcG9ydCBhbGxvd3MgaW1tdXRhYmxlIHNlcXVlbmNlcywgc3VjaCBhcyAidHVwbGUiICcKKyAgICAgICAgICAgICAnaW5zdGFuY2VzLCB0b1xuJworICAgICAgICAgICAgICdiZSB1c2VkIGFzICJkaWN0IiBrZXlzIGFuZCBzdG9yZWQgaW4gInNldCIgYW5kICJmcm96ZW5zZXQiICcKKyAgICAgICAgICAgICAnaW5zdGFuY2VzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQXR0ZW1wdGluZyB0byBoYXNoIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zICcKKyAgICAgICAgICAgICAndW5oYXNoYWJsZVxuJworICAgICAgICAgICAgICd2YWx1ZXMgd2lsbCByZXN1bHQgaW4gIlR5cGVFcnJvciIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBkZWZpbmVkIG9uIG11dGFibGUgJworICAgICAgICAgICAgICdzZXF1ZW5jZVxuJworICAgICAgICAgICAgICd0eXBlcy4gVGhlICJjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlIiBBQkMgaXMgcHJvdmlkZWQgdG8gJworICAgICAgICAgICAgICdtYWtlXG4nCisgICAgICAgICAgICAgJ2l0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMgb24gY3VzdG9tICcKKyAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAndHlwZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJbiB0aGUgdGFibGUgKnMqIGlzIGFuIGluc3RhbmNlIG9mIGEgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLCAqdCogJworICAgICAgICAgICAgICdpcyBhbnlcbicKKyAgICAgICAgICAgICAnaXRlcmFibGUgb2JqZWN0IGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0IG1lZXRzIGFueSAnCisgICAgICAgICAgICAgJ3R5cGUgYW5kXG4nCisgICAgICAgICAgICAgJ3ZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKiAoZm9yIGV4YW1wbGUsICJieXRlYXJyYXkiICcKKyAgICAgICAgICAgICAnb25seVxuJworICAgICAgICAgICAgICdhY2NlcHRzIGludGVnZXJzIHRoYXQgbWVldCB0aGUgdmFsdWUgcmVzdHJpY3Rpb24gIjAgPD0geCA8PSAnCisgICAgICAgICAgICAgJzI1NSIpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICdSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICd8ICJzW2ldID0geCIgICAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCAnCisgICAgICAgICAgICAgJ2J5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAnKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAic1tpOmpdID0gdCIgICAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICcKKyAgICAgICAgICAgICAnaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgJworICAgICAgICAgICAgICd0aGUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAnCisgICAgICAgICAgICAgJyp0KiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgImRlbCBzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyAic1tpOmpdID0gJworICAgICAgICAgICAgICdbXSIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAic1tpOmo6a10iICcKKyAgICAgICAgICAgICAnYXJlICAgfCAoMSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRob3NlIG9mICcKKyAgICAgICAgICAgICAnKnQqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAiZGVsIHNbaTpqOmtdIiAgICAgICAgICAgICAgICAgfCByZW1vdmVzIHRoZSBlbGVtZW50cyAnCisgICAgICAgICAgICAgJ29mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmo6a10iIGZyb20gdGhlICcKKyAgICAgICAgICAgICAnbGlzdCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMuYXBwZW5kKHgpIiAgICAgICAgICAgICAgICAgIHwgYXBwZW5kcyAqeCogdG8gdGhlIGVuZCBvZiAnCisgICAgICAgICAgICAgJ3RoZSAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VxdWVuY2UgKHNhbWUgJworICAgICAgICAgICAgICdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbbGVuKHMpOmxlbihzKV0gPSAnCisgICAgICAgICAgICAgJ1t4XSIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLmNsZWFyKCkiICAgICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgYWxsIGl0ZW1zIGZyb20gInMiICcKKyAgICAgICAgICAgICAnKHNhbWUgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJkZWwgJworICAgICAgICAgICAgICdzWzpdIikgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5jb3B5KCkiICAgICAgICAgICAgICAgICAgICAgfCBjcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mICcKKyAgICAgICAgICAgICAnInMiICAgIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoc2FtZSBhcyAnCisgICAgICAgICAgICAgJyJzWzpdIikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMuZXh0ZW5kKHQpIiBvciAicyArPSB0IiAgICAgIHwgZXh0ZW5kcyAqcyogd2l0aCB0aGUgY29udGVudHMgJworICAgICAgICAgICAgICdvZiB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnQqIChmb3IgdGhlIG1vc3QgcGFydCB0aGUgJworICAgICAgICAgICAgICdzYW1lICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgInNbbGVuKHMpOmxlbihzKV0gPSAnCisgICAgICAgICAgICAgJ3QiKSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzICo9IG4iICAgICAgICAgICAgICAgICAgICAgICB8IHVwZGF0ZXMgKnMqIHdpdGggaXRzICcKKyAgICAgICAgICAgICAnY29udGVudHMgICAgfCAoNikgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGVhdGVkICpuKiAnCisgICAgICAgICAgICAgJ3RpbWVzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5pbnNlcnQoaSwgeCkiICAgICAgICAgICAgICAgfCBpbnNlcnRzICp4KiBpbnRvICpzKiBhdCAnCisgICAgICAgICAgICAgJ3RoZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbmRleCBnaXZlbiBieSAqaSogKHNhbWUgJworICAgICAgICAgICAgICdhcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmldID0gJworICAgICAgICAgICAgICdbeF0iKSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMucG9wKFtpXSkiICAgICAgICAgICAgICAgICAgIHwgcmV0cmlldmVzIHRoZSBpdGVtIGF0ICppKiAnCisgICAgICAgICAgICAgJ2FuZCAgICB8ICgyKSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxzbyByZW1vdmVzIGl0IGZyb20gJworICAgICAgICAgICAgICcqcyogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLnJlbW92ZSh4KSIgICAgICAgICAgICAgICAgICB8IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSBmcm9tICcKKyAgICAgICAgICAgICAnKnMqICAgfCAoMykgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdoZXJlICJzW2ldID09ICcKKyAgICAgICAgICAgICAneCIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5yZXZlcnNlKCkiICAgICAgICAgICAgICAgICAgfCByZXZlcnNlcyB0aGUgaXRlbXMgb2YgKnMqICcKKyAgICAgICAgICAgICAnaW4gICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgJ3BsYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyByZXBsYWNpbmcuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcyLiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvICItMSIsIHNvIHRoYXQgYnkgJworICAgICAgICAgICAgICdkZWZhdWx0XG4nCisgICAgICAgICAgICAgJyAgIHRoZSBsYXN0IGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICczLiAicmVtb3ZlIiByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gKngqIGlzIG5vdCBmb3VuZCBpbiAqcyouXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc0LiBUaGUgInJldmVyc2UoKSIgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSBmb3JcbicKKyAgICAgICAgICAgICAnICAgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHJldmVyc2luZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kICcKKyAgICAgICAgICAgICAndXNlcnNcbicKKyAgICAgICAgICAgICAnICAgdGhhdCBpdCBvcGVyYXRlcyBieSBzaWRlIGVmZmVjdCwgaXQgZG9lcyBub3QgcmV0dXJuIHRoZSAnCisgICAgICAgICAgICAgJ3JldmVyc2VkXG4nCisgICAgICAgICAgICAgJyAgIHNlcXVlbmNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnNS4gImNsZWFyKCkiIGFuZCAiY29weSgpIiBhcmUgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlXG4nCisgICAgICAgICAgICAgIiAgIGludGVyZmFjZXMgb2YgbXV0YWJsZSBjb250YWluZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBzbGljaW5nXG4iCisgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgKHN1Y2ggYXMgImRpY3QiIGFuZCAic2V0IilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMzogImNsZWFyKCkiIGFuZCAiY29weSgpIiBtZXRob2RzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnNi4gVGhlIHZhbHVlICpuKiBpcyBhbiBpbnRlZ2VyLCBvciBhbiBvYmplY3QgaW1wbGVtZW50aW5nXG4nCisgICAgICAgICAgICAgJyAgICJfX2luZGV4X18oKSIuICBaZXJvIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgb2YgKm4qIGNsZWFyIHRoZSAnCisgICAgICAgICAgICAgJ3NlcXVlbmNlLlxuJworICAgICAgICAgICAgICcgICBJdGVtcyBpbiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHJlZmVyZW5jZWQgJworICAgICAgICAgICAgICdtdWx0aXBsZVxuJworICAgICAgICAgICAgICcgICB0aW1lcywgYXMgZXhwbGFpbmVkIGZvciAicyAqIG4iIHVuZGVyIENvbW1vbiBTZXF1ZW5jZSAnCisgICAgICAgICAgICAgJ09wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTGlzdHNcbicKKyAgICAgICAgICAgICAnPT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0xpc3RzIGFyZSBtdXRhYmxlIHNlcXVlbmNlcywgdHlwaWNhbGx5IHVzZWQgdG8gc3RvcmUgY29sbGVjdGlvbnMgJworICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICdob21vZ2VuZW91cyBpdGVtcyAod2hlcmUgdGhlIHByZWNpc2UgZGVncmVlIG9mIHNpbWlsYXJpdHkgd2lsbCAnCisgICAgICAgICAgICAgJ3ZhcnkgYnlcbicKKyAgICAgICAgICAgICAnYXBwbGljYXRpb24pLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnY2xhc3MgbGlzdChbaXRlcmFibGVdKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTGlzdHMgbWF5IGJlIGNvbnN0cnVjdGVkIGluIHNldmVyYWwgd2F5czpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogVXNpbmcgYSBwYWlyIG9mIHNxdWFyZSBicmFja2V0cyB0byBkZW5vdGUgdGhlIGVtcHR5IGxpc3Q6ICcKKyAgICAgICAgICAgICAnIltdIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBVc2luZyBzcXVhcmUgYnJhY2tldHMsIHNlcGFyYXRpbmcgaXRlbXMgd2l0aCBjb21tYXM6ICcKKyAgICAgICAgICAgICAnIlthXSIsXG4nCisgICAgICAgICAgICAgJyAgICAgIlthLCBiLCBjXSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogVXNpbmcgYSBsaXN0IGNvbXByZWhlbnNpb246ICJbeCBmb3IgeCBpbiBpdGVyYWJsZV0iXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFVzaW5nIHRoZSB0eXBlIGNvbnN0cnVjdG9yOiAibGlzdCgpIiBvciAibGlzdChpdGVyYWJsZSkiXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgbGlzdCB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgIiAgIHNhbWUgb3JkZXIgYXMgKml0ZXJhYmxlKidzIGl0ZW1zLiAgKml0ZXJhYmxlKiBtYXkgYmUgZWl0aGVyICIKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICcgICBzZXF1ZW5jZSwgYSBjb250YWluZXIgdGhhdCBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuICcKKyAgICAgICAgICAgICAnaXRlcmF0b3JcbicKKyAgICAgICAgICAgICAnICAgb2JqZWN0LiAgSWYgKml0ZXJhYmxlKiBpcyBhbHJlYWR5IGEgbGlzdCwgYSBjb3B5IGlzIG1hZGUgYW5kXG4nCisgICAgICAgICAgICAgJyAgIHJldHVybmVkLCBzaW1pbGFyIHRvICJpdGVyYWJsZVs6XSIuIEZvciBleGFtcGxlLCAnCisgICAgICAgICAgICAgJyJsaXN0KFwnYWJjXCcpIlxuJworICAgICAgICAgICAgICcgICByZXR1cm5zICJbXCdhXCcsIFwnYlwnLCBcJ2NcJ10iIGFuZCAibGlzdCggKDEsIDIsIDMpICkiICcKKyAgICAgICAgICAgICAncmV0dXJucyAiWzEsIDIsXG4nCisgICAgICAgICAgICAgJyAgIDNdIi4gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbmV3ICcKKyAgICAgICAgICAgICAnZW1wdHlcbicKKyAgICAgICAgICAgICAnICAgbGlzdCwgIltdIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE1hbnkgb3RoZXIgb3BlcmF0aW9ucyBhbHNvIHByb2R1Y2UgbGlzdHMsIGluY2x1ZGluZyB0aGUgJworICAgICAgICAgICAgICcic29ydGVkKCkiXG4nCisgICAgICAgICAgICAgJyAgIGJ1aWx0LWluLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTGlzdHMgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbW9uIGFuZCBtdXRhYmxlIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAnb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAnICAgTGlzdHMgYWxzbyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBtZXRob2Q6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBzb3J0KCosIGtleT1Ob25lLCByZXZlcnNlPU5vbmUpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBUaGlzIG1ldGhvZCBzb3J0cyB0aGUgbGlzdCBpbiBwbGFjZSwgdXNpbmcgb25seSAiPCIgJworICAgICAgICAgICAgICdjb21wYXJpc29uc1xuJworICAgICAgICAgICAgICcgICAgICBiZXR3ZWVuIGl0ZW1zLiBFeGNlcHRpb25zIGFyZSBub3Qgc3VwcHJlc3NlZCAtIGlmIGFueSAnCisgICAgICAgICAgICAgJ2NvbXBhcmlzb25cbicKKyAgICAgICAgICAgICAnICAgICAgb3BlcmF0aW9ucyBmYWlsLCB0aGUgZW50aXJlIHNvcnQgb3BlcmF0aW9uIHdpbGwgZmFpbCAoYW5kICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgICAgIGxpc3Qgd2lsbCBsaWtlbHkgYmUgbGVmdCBpbiBhIHBhcnRpYWxseSBtb2RpZmllZCBzdGF0ZSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICAic29ydCgpIiBhY2NlcHRzIHR3byBhcmd1bWVudHMgdGhhdCBjYW4gb25seSBiZSBwYXNzZWQgYnlcbicKKyAgICAgICAgICAgICAnICAgICAga2V5d29yZCAoa2V5d29yZC1vbmx5IGFyZ3VtZW50cyk6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICAqa2V5KiBzcGVjaWZpZXMgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgdGhhdCBpcyB1c2VkICcKKyAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAnICAgICAgZXh0cmFjdCBhIGNvbXBhcmlzb24ga2V5IGZyb20gZWFjaCBsaXN0IGVsZW1lbnQgKGZvciAnCisgICAgICAgICAgICAgJ2V4YW1wbGUsXG4nCisgICAgICAgICAgICAgJyAgICAgICJrZXk9c3RyLmxvd2VyIikuIFRoZSBrZXkgY29ycmVzcG9uZGluZyB0byBlYWNoIGl0ZW0gaW4gJworICAgICAgICAgICAgICd0aGUgbGlzdFxuJworICAgICAgICAgICAgICcgICAgICBpcyBjYWxjdWxhdGVkIG9uY2UgYW5kIHRoZW4gdXNlZCBmb3IgdGhlIGVudGlyZSBzb3J0aW5nICcKKyAgICAgICAgICAgICAncHJvY2Vzcy5cbicKKyAgICAgICAgICAgICAnICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgIk5vbmUiIG1lYW5zIHRoYXQgbGlzdCBpdGVtcyBhcmUgJworICAgICAgICAgICAgICdzb3J0ZWRcbicKKyAgICAgICAgICAgICAnICAgICAgZGlyZWN0bHkgd2l0aG91dCBjYWxjdWxhdGluZyBhIHNlcGFyYXRlIGtleSB2YWx1ZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIFRoZSAiZnVuY3Rvb2xzLmNtcF90b19rZXkoKSIgdXRpbGl0eSBpcyBhdmFpbGFibGUgdG8gJworICAgICAgICAgICAgICdjb252ZXJ0IGFcbicKKyAgICAgICAgICAgICAnICAgICAgMi54IHN0eWxlICpjbXAqIGZ1bmN0aW9uIHRvIGEgKmtleSogZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICAqcmV2ZXJzZSogaXMgYSBib29sZWFuIHZhbHVlLiAgSWYgc2V0IHRvICJUcnVlIiwgdGhlbiB0aGUgJworICAgICAgICAgICAgICdsaXN0XG4nCisgICAgICAgICAgICAgJyAgICAgIGVsZW1lbnRzIGFyZSBzb3J0ZWQgYXMgaWYgZWFjaCBjb21wYXJpc29uIHdlcmUgcmV2ZXJzZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBUaGlzIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgZm9yIGVjb25vbXkgb2YgJworICAgICAgICAgICAgICdzcGFjZVxuJworICAgICAgICAgICAgICcgICAgICB3aGVuIHNvcnRpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvIHJlbWluZCB1c2VycyB0aGF0IGl0ICcKKyAgICAgICAgICAgICAnb3BlcmF0ZXNcbicKKyAgICAgICAgICAgICAnICAgICAgYnkgc2lkZSBlZmZlY3QsIGl0IGRvZXMgbm90IHJldHVybiB0aGUgc29ydGVkIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAnKHVzZVxuJworICAgICAgICAgICAgICcgICAgICAic29ydGVkKCkiIHRvIGV4cGxpY2l0bHkgcmVxdWVzdCBhIG5ldyBzb3J0ZWQgbGlzdCAnCisgICAgICAgICAgICAgJ2luc3RhbmNlKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIFRoZSAic29ydCgpIiBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUuICBBIHNvcnQgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICAgICBzdGFibGUgaWYgaXQgZ3VhcmFudGVlcyBub3QgdG8gY2hhbmdlIHRoZSByZWxhdGl2ZSBvcmRlciAnCisgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgJyAgICAgIGVsZW1lbnRzIHRoYXQgY29tcGFyZSBlcXVhbCAtLS0gdGhpcyBpcyBoZWxwZnVsIGZvciAnCisgICAgICAgICAgICAgJ3NvcnRpbmcgaW5cbicKKyAgICAgICAgICAgICAnICAgICAgbXVsdGlwbGUgcGFzc2VzIChmb3IgZXhhbXBsZSwgc29ydCBieSBkZXBhcnRtZW50LCB0aGVuIGJ5ICcKKyAgICAgICAgICAgICAnc2FsYXJ5XG4nCisgICAgICAgICAgICAgJyAgICAgIGdyYWRlKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogV2hpbGUgYSBsaXN0IGlzIGJlaW5nICcKKyAgICAgICAgICAgICAnc29ydGVkLFxuJworICAgICAgICAgICAgICcgICAgICB0aGUgZWZmZWN0IG9mIGF0dGVtcHRpbmcgdG8gbXV0YXRlLCBvciBldmVuIGluc3BlY3QsIHRoZSAnCisgICAgICAgICAgICAgJ2xpc3QgaXNcbicKKyAgICAgICAgICAgICAnICAgICAgdW5kZWZpbmVkLiAgVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIG1ha2VzIHRoZSBsaXN0ICcKKyAgICAgICAgICAgICAnYXBwZWFyXG4nCisgICAgICAgICAgICAgJyAgICAgIGVtcHR5IGZvciB0aGUgZHVyYXRpb24sIGFuZCByYWlzZXMgIlZhbHVlRXJyb3IiIGlmIGl0IGNhbiAnCisgICAgICAgICAgICAgJ2RldGVjdFxuJworICAgICAgICAgICAgICcgICAgICB0aGF0IHRoZSBsaXN0IGhhcyBiZWVuIG11dGF0ZWQgZHVyaW5nIGEgc29ydC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUdXBsZXNcbicKKyAgICAgICAgICAgICAnPT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUdXBsZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZXMsIHR5cGljYWxseSB1c2VkIHRvIHN0b3JlICcKKyAgICAgICAgICAgICAnY29sbGVjdGlvbnMgb2ZcbicKKyAgICAgICAgICAgICAnaGV0ZXJvZ2VuZW91cyBkYXRhIChzdWNoIGFzIHRoZSAyLXR1cGxlcyBwcm9kdWNlZCBieSB0aGUgJworICAgICAgICAgICAgICciZW51bWVyYXRlKCkiXG4nCisgICAgICAgICAgICAgJ2J1aWx0LWluKS4gVHVwbGVzIGFyZSBhbHNvIHVzZWQgZm9yIGNhc2VzIHdoZXJlIGFuIGltbXV0YWJsZSAnCisgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgJ29mIGhvbW9nZW5lb3VzIGRhdGEgaXMgbmVlZGVkIChzdWNoIGFzIGFsbG93aW5nIHN0b3JhZ2UgaW4gYSAnCisgICAgICAgICAgICAgJyJzZXQiIG9yXG4nCisgICAgICAgICAgICAgJyJkaWN0IiBpbnN0YW5jZSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdjbGFzcyB0dXBsZShbaXRlcmFibGVdKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVHVwbGVzIG1heSBiZSBjb25zdHJ1Y3RlZCBpbiBhIG51bWJlciBvZiB3YXlzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBVc2luZyBhIHBhaXIgb2YgcGFyZW50aGVzZXMgdG8gZGVub3RlIHRoZSBlbXB0eSB0dXBsZTogJworICAgICAgICAgICAgICciKCkiXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFVzaW5nIGEgdHJhaWxpbmcgY29tbWEgZm9yIGEgc2luZ2xldG9uIHR1cGxlOiAiYSwiIG9yICcKKyAgICAgICAgICAgICAnIihhLCkiXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFNlcGFyYXRpbmcgaXRlbXMgd2l0aCBjb21tYXM6ICJhLCBiLCBjIiBvciAiKGEsIGIsIGMpIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBVc2luZyB0aGUgInR1cGxlKCkiIGJ1aWx0LWluOiAidHVwbGUoKSIgb3IgJworICAgICAgICAgICAgICcidHVwbGUoaXRlcmFibGUpIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVGhlIGNvbnN0cnVjdG9yIGJ1aWxkcyBhIHR1cGxlIHdob3NlIGl0ZW1zIGFyZSB0aGUgc2FtZSBhbmQgJworICAgICAgICAgICAgICdpbiB0aGVcbicKKyAgICAgICAgICAgICAiICAgc2FtZSBvcmRlciBhcyAqaXRlcmFibGUqJ3MgaXRlbXMuICAqaXRlcmFibGUqIG1heSBiZSBlaXRoZXIgIgorICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJyAgIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gJworICAgICAgICAgICAgICdpdGVyYXRvclxuJworICAgICAgICAgICAgICcgICBvYmplY3QuICBJZiAqaXRlcmFibGUqIGlzIGFscmVhZHkgYSB0dXBsZSwgaXQgaXMgcmV0dXJuZWRcbicKKyAgICAgICAgICAgICAnICAgdW5jaGFuZ2VkLiBGb3IgZXhhbXBsZSwgInR1cGxlKFwnYWJjXCcpIiByZXR1cm5zICIoXCdhXCcsICcKKyAgICAgICAgICAgICAnXCdiXCcsIFwnY1wnKSJcbicKKyAgICAgICAgICAgICAnICAgYW5kICJ0dXBsZSggWzEsIDIsIDNdICkiIHJldHVybnMgIigxLCAyLCAzKSIuIElmIG5vIGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnICAgZ2l2ZW4sIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbmV3IGVtcHR5IHR1cGxlLCAiKCkiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IGl0IGlzIGFjdHVhbGx5IHRoZSBjb21tYSB3aGljaCBtYWtlcyBhIHR1cGxlLCBub3QgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgcGFyZW50aGVzZXMuIFRoZSBwYXJlbnRoZXNlcyBhcmUgb3B0aW9uYWwsIGV4Y2VwdCBpbiB0aGUgJworICAgICAgICAgICAgICdlbXB0eVxuJworICAgICAgICAgICAgICcgICB0dXBsZSBjYXNlLCBvciB3aGVuIHRoZXkgYXJlIG5lZWRlZCB0byBhdm9pZCBzeW50YWN0aWMgJworICAgICAgICAgICAgICdhbWJpZ3VpdHkuXG4nCisgICAgICAgICAgICAgJyAgIEZvciBleGFtcGxlLCAiZihhLCBiLCBjKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggdGhyZWUgJworICAgICAgICAgICAgICdhcmd1bWVudHMsXG4nCisgICAgICAgICAgICAgJyAgIHdoaWxlICJmKChhLCBiLCBjKSkiIGlzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgMy10dXBsZSBhcyB0aGUgJworICAgICAgICAgICAgICdzb2xlXG4nCisgICAgICAgICAgICAgJyAgIGFyZ3VtZW50LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVHVwbGVzIGltcGxlbWVudCBhbGwgb2YgdGhlIGNvbW1vbiBzZXF1ZW5jZSBvcGVyYXRpb25zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnRm9yIGhldGVyb2dlbmVvdXMgY29sbGVjdGlvbnMgb2YgZGF0YSB3aGVyZSBhY2Nlc3MgYnkgbmFtZSBpcyAnCisgICAgICAgICAgICAgJ2NsZWFyZXJcbicKKyAgICAgICAgICAgICAndGhhbiBhY2Nlc3MgYnkgaW5kZXgsICJjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCkiIG1heSBiZSBhIG1vcmVcbicKKyAgICAgICAgICAgICAnYXBwcm9wcmlhdGUgY2hvaWNlIHRoYW4gYSBzaW1wbGUgdHVwbGUgb2JqZWN0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1Jhbmdlc1xuJworICAgICAgICAgICAgICc9PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAicmFuZ2UiIHR5cGUgcmVwcmVzZW50cyBhbiBpbW11dGFibGUgc2VxdWVuY2Ugb2YgbnVtYmVycyBhbmQgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICdjb21tb25seSB1c2VkIGZvciBsb29waW5nIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHRpbWVzIGluICJmb3IiICcKKyAgICAgICAgICAgICAnbG9vcHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdjbGFzcyByYW5nZShzdG9wKVxuJworICAgICAgICAgICAgICdjbGFzcyByYW5nZShzdGFydCwgc3RvcFssIHN0ZXBdKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVGhlIGFyZ3VtZW50cyB0byB0aGUgcmFuZ2UgY29uc3RydWN0b3IgbXVzdCBiZSBpbnRlZ2VycyAnCisgICAgICAgICAgICAgJyhlaXRoZXJcbicKKyAgICAgICAgICAgICAnICAgYnVpbHQtaW4gImludCIgb3IgYW55IG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlICJfX2luZGV4X18iXG4nCisgICAgICAgICAgICAgJyAgIHNwZWNpYWwgbWV0aG9kKS4gIElmIHRoZSAqc3RlcCogYXJndW1lbnQgaXMgb21pdHRlZCwgaXQgJworICAgICAgICAgICAgICdkZWZhdWx0cyB0b1xuJworICAgICAgICAgICAgICcgICAiMSIuIElmIHRoZSAqc3RhcnQqIGFyZ3VtZW50IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvICIwIi4gJworICAgICAgICAgICAgICdJZlxuJworICAgICAgICAgICAgICcgICAqc3RlcCogaXMgemVybywgIlZhbHVlRXJyb3IiIGlzIHJhaXNlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEZvciBhIHBvc2l0aXZlICpzdGVwKiwgdGhlIGNvbnRlbnRzIG9mIGEgcmFuZ2UgInIiIGFyZSAnCisgICAgICAgICAgICAgJ2RldGVybWluZWRcbicKKyAgICAgICAgICAgICAnICAgYnkgdGhlIGZvcm11bGEgInJbaV0gPSBzdGFydCArIHN0ZXAqaSIgd2hlcmUgImkgPj0gMCIgYW5kICcKKyAgICAgICAgICAgICAnInJbaV0gPFxuJworICAgICAgICAgICAgICcgICBzdG9wIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEZvciBhIG5lZ2F0aXZlICpzdGVwKiwgdGhlIGNvbnRlbnRzIG9mIHRoZSByYW5nZSBhcmUgc3RpbGxcbicKKyAgICAgICAgICAgICAnICAgZGV0ZXJtaW5lZCBieSB0aGUgZm9ybXVsYSAicltpXSA9IHN0YXJ0ICsgc3RlcCppIiwgYnV0IHRoZVxuJworICAgICAgICAgICAgICcgICBjb25zdHJhaW50cyBhcmUgImkgPj0gMCIgYW5kICJyW2ldID4gc3RvcCIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBBIHJhbmdlIG9iamVjdCB3aWxsIGJlIGVtcHR5IGlmICJyWzBdIiBkb2VzIG5vdCBtZWV0IHRoZSAnCisgICAgICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAgICAgJyAgIGNvbnN0cmFpbnQuIFJhbmdlcyBkbyBzdXBwb3J0IG5lZ2F0aXZlIGluZGljZXMsIGJ1dCB0aGVzZSAnCisgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICcgICBpbnRlcnByZXRlZCBhcyBpbmRleGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAnZGV0ZXJtaW5lZCBieVxuJworICAgICAgICAgICAgICcgICB0aGUgcG9zaXRpdmUgaW5kaWNlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFJhbmdlcyBjb250YWluaW5nIGFic29sdXRlIHZhbHVlcyBsYXJnZXIgdGhhbiAic3lzLm1heHNpemUiICcKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJyAgIHBlcm1pdHRlZCBidXQgc29tZSBmZWF0dXJlcyAoc3VjaCBhcyAibGVuKCkiKSBtYXkgcmFpc2VcbicKKyAgICAgICAgICAgICAnICAgIk92ZXJmbG93RXJyb3IiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUmFuZ2UgZXhhbXBsZXM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdChyYW5nZSgxMCkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdChyYW5nZSgxLCAxMSkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgMzAsIDUpKVxuJworICAgICAgICAgICAgICcgICAgICBbMCwgNSwgMTAsIDE1LCAyMCwgMjVdXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0KHJhbmdlKDAsIDEwLCAzKSlcbicKKyAgICAgICAgICAgICAnICAgICAgWzAsIDMsIDYsIDldXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0KHJhbmdlKDAsIC0xMCwgLTEpKVxuJworICAgICAgICAgICAgICcgICAgICBbMCwgLTEsIC0yLCAtMywgLTQsIC01LCAtNiwgLTcsIC04LCAtOV1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3QocmFuZ2UoMCkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFtdXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0KHJhbmdlKDEsIDApKVxuJworICAgICAgICAgICAgICcgICAgICBbXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUmFuZ2VzIGltcGxlbWVudCBhbGwgb2YgdGhlIGNvbW1vbiBzZXF1ZW5jZSBvcGVyYXRpb25zICcKKyAgICAgICAgICAgICAnZXhjZXB0XG4nCisgICAgICAgICAgICAgJyAgIGNvbmNhdGVuYXRpb24gYW5kIHJlcGV0aXRpb24gKGR1ZSB0byB0aGUgZmFjdCB0aGF0IHJhbmdlICcKKyAgICAgICAgICAgICAnb2JqZWN0c1xuJworICAgICAgICAgICAgICcgICBjYW4gb25seSByZXByZXNlbnQgc2VxdWVuY2VzIHRoYXQgZm9sbG93IGEgc3RyaWN0IHBhdHRlcm4gJworICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAnICAgcmVwZXRpdGlvbiBhbmQgY29uY2F0ZW5hdGlvbiB3aWxsIHVzdWFsbHkgdmlvbGF0ZSB0aGF0ICcKKyAgICAgICAgICAgICAncGF0dGVybikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBzdGFydFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgVGhlIHZhbHVlIG9mIHRoZSAqc3RhcnQqIHBhcmFtZXRlciAob3IgIjAiIGlmIHRoZSAnCisgICAgICAgICAgICAgJ3BhcmFtZXRlciB3YXNcbicKKyAgICAgICAgICAgICAnICAgICAgbm90IHN1cHBsaWVkKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgc3RvcFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgVGhlIHZhbHVlIG9mIHRoZSAqc3RvcCogcGFyYW1ldGVyXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBzdGVwXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdGVwKiBwYXJhbWV0ZXIgKG9yICIxIiBpZiB0aGUgcGFyYW1ldGVyICcKKyAgICAgICAgICAgICAnd2FzXG4nCisgICAgICAgICAgICAgJyAgICAgIG5vdCBzdXBwbGllZClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBhZHZhbnRhZ2Ugb2YgdGhlICJyYW5nZSIgdHlwZSBvdmVyIGEgcmVndWxhciAibGlzdCIgb3IgJworICAgICAgICAgICAgICcidHVwbGUiIGlzXG4nCisgICAgICAgICAgICAgJ3RoYXQgYSAicmFuZ2UiIG9iamVjdCB3aWxsIGFsd2F5cyB0YWtlIHRoZSBzYW1lIChzbWFsbCkgYW1vdW50ICcKKyAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAnbWVtb3J5LCBubyBtYXR0ZXIgdGhlIHNpemUgb2YgdGhlIHJhbmdlIGl0IHJlcHJlc2VudHMgKGFzIGl0ICcKKyAgICAgICAgICAgICAnb25seVxuJworICAgICAgICAgICAgICdzdG9yZXMgdGhlICJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiIHZhbHVlcywgY2FsY3VsYXRpbmcgJworICAgICAgICAgICAgICdpbmRpdmlkdWFsXG4nCisgICAgICAgICAgICAgJ2l0ZW1zIGFuZCBzdWJyYW5nZXMgYXMgbmVlZGVkKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1JhbmdlIG9iamVjdHMgaW1wbGVtZW50IHRoZSAiY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIiBBQkMsIGFuZFxuJworICAgICAgICAgICAgICdwcm92aWRlIGZlYXR1cmVzIHN1Y2ggYXMgY29udGFpbm1lbnQgdGVzdHMsIGVsZW1lbnQgaW5kZXggJworICAgICAgICAgICAgICdsb29rdXAsXG4nCisgICAgICAgICAgICAgJ3NsaWNpbmcgYW5kIHN1cHBvcnQgZm9yIG5lZ2F0aXZlIGluZGljZXMgKHNlZSBTZXF1ZW5jZSBUeXBlcyAtLS0gJworICAgICAgICAgICAgICdsaXN0LFxuJworICAgICAgICAgICAgICd0dXBsZSwgcmFuZ2UpOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnPj4+IHIgPSByYW5nZSgwLCAyMCwgMilcbicKKyAgICAgICAgICAgICAnPj4+IHJcbicKKyAgICAgICAgICAgICAncmFuZ2UoMCwgMjAsIDIpXG4nCisgICAgICAgICAgICAgJz4+PiAxMSBpbiByXG4nCisgICAgICAgICAgICAgJ0ZhbHNlXG4nCisgICAgICAgICAgICAgJz4+PiAxMCBpbiByXG4nCisgICAgICAgICAgICAgJ1RydWVcbicKKyAgICAgICAgICAgICAnPj4+IHIuaW5kZXgoMTApXG4nCisgICAgICAgICAgICAgJzVcbicKKyAgICAgICAgICAgICAnPj4+IHJbNV1cbicKKyAgICAgICAgICAgICAnMTBcbicKKyAgICAgICAgICAgICAnPj4+IHJbOjVdXG4nCisgICAgICAgICAgICAgJ3JhbmdlKDAsIDEwLCAyKVxuJworICAgICAgICAgICAgICc+Pj4gclstMV1cbicKKyAgICAgICAgICAgICAnMThcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1Rlc3RpbmcgcmFuZ2Ugb2JqZWN0cyBmb3IgZXF1YWxpdHkgd2l0aCAiPT0iIGFuZCAiIT0iIGNvbXBhcmVzICcKKyAgICAgICAgICAgICAndGhlbSBhc1xuJworICAgICAgICAgICAgICdzZXF1ZW5jZXMuICBUaGF0IGlzLCB0d28gcmFuZ2Ugb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiAnCisgICAgICAgICAgICAgJ3RoZXlcbicKKyAgICAgICAgICAgICAncmVwcmVzZW50IHRoZSBzYW1lIHNlcXVlbmNlIG9mIHZhbHVlcy4gIChOb3RlIHRoYXQgdHdvIHJhbmdlICcKKyAgICAgICAgICAgICAnb2JqZWN0c1xuJworICAgICAgICAgICAgICd0aGF0IGNvbXBhcmUgZXF1YWwgbWlnaHQgaGF2ZSBkaWZmZXJlbnQgInN0YXJ0IiwgInN0b3AiIGFuZCAnCisgICAgICAgICAgICAgJyJzdGVwIlxuJworICAgICAgICAgICAgICdhdHRyaWJ1dGVzLCBmb3IgZXhhbXBsZSAicmFuZ2UoMCkgPT0gcmFuZ2UoMiwgMSwgMykiIG9yICcKKyAgICAgICAgICAgICAnInJhbmdlKDAsIDMsXG4nCisgICAgICAgICAgICAgJzIpID09IHJhbmdlKDAsIDQsIDIpIi4pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBJbXBsZW1lbnQgdGhlIFNlcXVlbmNlIEFCQy4gU3VwcG9ydCAnCisgICAgICAgICAgICAgJ3NsaWNpbmdcbicKKyAgICAgICAgICAgICAnYW5kIG5lZ2F0aXZlIGluZGljZXMuIFRlc3QgImludCIgb2JqZWN0cyBmb3IgbWVtYmVyc2hpcCBpbiAnCisgICAgICAgICAgICAgJ2NvbnN0YW50XG4nCisgICAgICAgICAgICAgJ3RpbWUgaW5zdGVhZCBvZiBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgaXRlbXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICJDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBEZWZpbmUgJz09JyBhbmQgJyE9JyB0byBjb21wYXJlIHJhbmdlICIKKyAgICAgICAgICAgICAnb2JqZWN0c1xuJworICAgICAgICAgICAgICdiYXNlZCBvbiB0aGUgc2VxdWVuY2Ugb2YgdmFsdWVzIHRoZXkgZGVmaW5lIChpbnN0ZWFkIG9mICcKKyAgICAgICAgICAgICAnY29tcGFyaW5nXG4nCisgICAgICAgICAgICAgJ2Jhc2VkIG9uIG9iamVjdCBpZGVudGl0eSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjM6IFRoZSAic3RhcnQiLCAic3RvcCIgYW5kICJzdGVwIiBhdHRyaWJ1dGVzLlxuJywKKyAndHlwZXNzZXEtbXV0YWJsZSc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdNdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG4nCisgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIGRlZmluZWQgb24gJworICAgICAgICAgICAgICAgICAgICAgJ211dGFibGUgc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgICAgICd0eXBlcy4gVGhlICJjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlIiBBQkMgaXMgJworICAgICAgICAgICAgICAgICAgICAgJ3Byb3ZpZGVkIHRvIG1ha2VcbicKKyAgICAgICAgICAgICAgICAgICAgICdpdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSBvcGVyYXRpb25zIG9uICcKKyAgICAgICAgICAgICAgICAgICAgICdjdXN0b20gc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgICAgICd0eXBlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJbiB0aGUgdGFibGUgKnMqIGlzIGFuIGluc3RhbmNlIG9mIGEgbXV0YWJsZSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAndHlwZSwgKnQqIGlzIGFueVxuJworICAgICAgICAgICAgICAgICAgICAgJ2l0ZXJhYmxlIG9iamVjdCBhbmQgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgICAnbWVldHMgYW55IHR5cGUgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgICAndmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqIChmb3IgZXhhbXBsZSwgJworICAgICAgICAgICAgICAgICAgICAgJyJieXRlYXJyYXkiIG9ubHlcbicKKyAgICAgICAgICAgICAgICAgICAgICdhY2NlcHRzIGludGVnZXJzIHRoYXQgbWVldCB0aGUgdmFsdWUgcmVzdHJpY3Rpb24gIjAgPD0geCAnCisgICAgICAgICAgICAgICAgICAgICAnPD0gMjU1IikuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICAgICcrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzW2ldID0geCIgICAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyAnCisgICAgICAgICAgICAgICAgICAgICAncmVwbGFjZWQgYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiAnCisgICAgICAgICAgICAgICAgICAgICAndG8gKmoqIGlzICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnRzIG9mIHRoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgJworICAgICAgICAgICAgICAgICAgICAgJyp0KiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJkZWwgc1tpOmpdIiAgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgInNbaTpqXSA9ICcKKyAgICAgICAgICAgICAgICAgICAgICdbXSIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAic1tpOmo6a10gPSB0IiAgICAgICAgICAgICAgICAgfCB0aGUgZWxlbWVudHMgb2YgJworICAgICAgICAgICAgICAgICAgICAgJyJzW2k6ajprXSIgYXJlICAgfCAoMSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhvc2Ugb2YgJworICAgICAgICAgICAgICAgICAgICAgJyp0KiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzICcKKyAgICAgICAgICAgICAgICAgICAgICdvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmo6a10iIGZyb20gdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdsaXN0ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMuYXBwZW5kKHgpIiAgICAgICAgICAgICAgICAgIHwgYXBwZW5kcyAqeCogdG8gdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdlbmQgb2YgdGhlICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNlcXVlbmNlIChzYW1lICcKKyAgICAgICAgICAgICAgICAgICAgICdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tsZW4ocyk6bGVuKHMpXSA9ICcKKyAgICAgICAgICAgICAgICAgICAgICdbeF0iKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMuY2xlYXIoKSIgICAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyBhbGwgaXRlbXMgJworICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gInMiIChzYW1lIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJkZWwgJworICAgICAgICAgICAgICAgICAgICAgJ3NbOl0iKSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5jb3B5KCkiICAgICAgICAgICAgICAgICAgICAgfCBjcmVhdGVzIGEgc2hhbGxvdyAnCisgICAgICAgICAgICAgICAgICAgICAnY29weSBvZiAicyIgICAgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHNhbWUgYXMgJworICAgICAgICAgICAgICAgICAgICAgJyJzWzpdIikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzLmV4dGVuZCh0KSIgb3IgInMgKz0gdCIgICAgICB8IGV4dGVuZHMgKnMqIHdpdGggdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdjb250ZW50cyBvZiB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqdCogKGZvciB0aGUgbW9zdCAnCisgICAgICAgICAgICAgICAgICAgICAncGFydCB0aGUgc2FtZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgInNbbGVuKHMpOmxlbihzKV0gJworICAgICAgICAgICAgICAgICAgICAgJz0gdCIpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzICo9IG4iICAgICAgICAgICAgICAgICAgICAgICB8IHVwZGF0ZXMgKnMqIHdpdGggaXRzICcKKyAgICAgICAgICAgICAgICAgICAgICdjb250ZW50cyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBlYXRlZCAqbiogJworICAgICAgICAgICAgICAgICAgICAgJ3RpbWVzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMuaW5zZXJ0KGksIHgpIiAgICAgICAgICAgICAgIHwgaW5zZXJ0cyAqeCogaW50byAqcyogJworICAgICAgICAgICAgICAgICAgICAgJ2F0IHRoZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4IGdpdmVuIGJ5ICppKiAnCisgICAgICAgICAgICAgICAgICAgICAnKHNhbWUgYXMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmldID0gJworICAgICAgICAgICAgICAgICAgICAgJ1t4XSIpICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMucG9wKFtpXSkiICAgICAgICAgICAgICAgICAgIHwgcmV0cmlldmVzIHRoZSBpdGVtIGF0ICcKKyAgICAgICAgICAgICAgICAgICAgICcqaSogYW5kICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFsc28gcmVtb3ZlcyBpdCBmcm9tICcKKyAgICAgICAgICAgICAgICAgICAgICcqcyogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5yZW1vdmUoeCkiICAgICAgICAgICAgICAgICAgfCByZW1vdmUgdGhlIGZpcnN0IGl0ZW0gJworICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gKnMqICAgfCAoMykgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hlcmUgInNbaV0gPT0gJworICAgICAgICAgICAgICAgICAgICAgJ3giICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzLnJldmVyc2UoKSIgICAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAnCisgICAgICAgICAgICAgICAgICAgICAnKnMqIGluICAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAncGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdOb3RlczpcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcxLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgJworICAgICAgICAgICAgICAgICAgICAgJ3JlcGxhY2luZy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcyLiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvICItMSIsIHNvIHRoYXQgJworICAgICAgICAgICAgICAgICAgICAgJ2J5IGRlZmF1bHRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJzMuICJyZW1vdmUiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICcKKyAgICAgICAgICAgICAgICAgICAgICcqcyouXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnNC4gVGhlICJyZXZlcnNlKCkiIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgJworICAgICAgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiByZXZlcnNpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvICcKKyAgICAgICAgICAgICAgICAgICAgICdyZW1pbmQgdXNlcnNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB0aGF0IGl0IG9wZXJhdGVzIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSByZXZlcnNlZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHNlcXVlbmNlLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJzUuICJjbGVhcigpIiBhbmQgImNvcHkoKSIgYXJlIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSAnCisgICAgICAgICAgICAgICAgICAgICAnd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICIgICBpbnRlcmZhY2VzIG9mIG11dGFibGUgY29udGFpbmVycyB0aGF0IGRvbid0IHN1cHBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgJ3NsaWNpbmdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBvcGVyYXRpb25zIChzdWNoIGFzICJkaWN0IiBhbmQgInNldCIpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4zOiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIG1ldGhvZHMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnNi4gVGhlIHZhbHVlICpuKiBpcyBhbiBpbnRlZ2VyLCBvciBhbiBvYmplY3QgJworICAgICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGluZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICJfX2luZGV4X18oKSIuICBaZXJvIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgb2YgKm4qIGNsZWFyICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgSXRlbXMgaW4gdGhlIHNlcXVlbmNlIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSAnCisgICAgICAgICAgICAgICAgICAgICAncmVmZXJlbmNlZCBtdWx0aXBsZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHRpbWVzLCBhcyBleHBsYWluZWQgZm9yICJzICogbiIgdW5kZXIgQ29tbW9uIFNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25zLlxuJywKKyAndW5hcnknOiAnXG4nCisgICAgICAgICAgJ1VuYXJ5IGFyaXRobWV0aWMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9uc1xuJworICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0FsbCB1bmFyeSBhcml0aG1ldGljIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSAnCisgICAgICAgICAgJ3ByaW9yaXR5OlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgdV9leHByIDo6PSBwb3dlciB8ICItIiB1X2V4cHIgfCAiKyIgdV9leHByIHwgIn4iIHVfZXhwclxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhlIHVuYXJ5ICItIiAobWludXMpIG9wZXJhdG9yIHlpZWxkcyB0aGUgbmVnYXRpb24gb2YgaXRzIG51bWVyaWNcbicKKyAgICAgICAgICAnYXJndW1lbnQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgdW5hcnkgIisiIChwbHVzKSBvcGVyYXRvciB5aWVsZHMgaXRzIG51bWVyaWMgYXJndW1lbnQgJworICAgICAgICAgICd1bmNoYW5nZWQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgdW5hcnkgIn4iIChpbnZlcnQpIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBpbnZlcnNpb24gb2YgJworICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAnaW50ZWdlciBhcmd1bWVudC4gIFRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiAieCIgaXMgZGVmaW5lZCBhc1xuJworICAgICAgICAgICciLSh4KzEpIi4gIEl0IG9ubHkgYXBwbGllcyB0byBpbnRlZ3JhbCBudW1iZXJzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSW4gYWxsIHRocmVlIGNhc2VzLCBpZiB0aGUgYXJndW1lbnQgZG9lcyBub3QgaGF2ZSB0aGUgcHJvcGVyIHR5cGUsICcKKyAgICAgICAgICAnYVxuJworICAgICAgICAgICciVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuJywKKyAnd2hpbGUnOiAnXG4nCisgICAgICAgICAgJ1RoZSAid2hpbGUiIHN0YXRlbWVudFxuJworICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSAid2hpbGUiIHN0YXRlbWVudCBpcyB1c2VkIGZvciByZXBlYXRlZCBleGVjdXRpb24gYXMgbG9uZyBhcyBhblxuJworICAgICAgICAgICdleHByZXNzaW9uIGlzIHRydWU6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICB3aGlsZV9zdG10IDo6PSAid2hpbGUiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4nCisgICAgICAgICAgJyAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhpcyByZXBlYXRlZGx5IHRlc3RzIHRoZSBleHByZXNzaW9uIGFuZCwgaWYgaXQgaXMgdHJ1ZSwgZXhlY3V0ZXMgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0ICcKKyAgICAgICAgICAndGltZVxuJworICAgICAgICAgICdpdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgJworICAgICAgICAgICdleGVjdXRlZFxuJworICAgICAgICAgICdhbmQgdGhlIGxvb3AgdGVybWluYXRlcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlICcKKyAgICAgICAgICAnbG9vcFxuJworICAgICAgICAgICd3aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiAnCisgICAgICAgICAgJ3N0YXRlbWVudFxuJworICAgICAgICAgICdleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBnb2VzICcKKyAgICAgICAgICAnYmFja1xuJworICAgICAgICAgICd0byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuJywKKyAnd2l0aCc6ICdcbicKKyAgICAgICAgICdUaGUgIndpdGgiIHN0YXRlbWVudFxuJworICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnVGhlICJ3aXRoIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoXG4nCisgICAgICAgICAnbWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiBXaXRoIFN0YXRlbWVudFxuJworICAgICAgICAgJ0NvbnRleHQgTWFuYWdlcnMpLiBUaGlzIGFsbG93cyBjb21tb24gInRyeSIuLi4iZXhjZXB0Ii4uLiJmaW5hbGx5IlxuJworICAgICAgICAgJ3VzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZCBmb3IgY29udmVuaWVudCByZXVzZS5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcgICB3aXRoX3N0bXQgOjo9ICJ3aXRoIiB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKiAiOiIgc3VpdGVcbicKKyAgICAgICAgICcgICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ1RoZSBleGVjdXRpb24gb2YgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzIGFzXG4nCisgICAgICAgICAnZm9sbG93czpcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcxLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgIndpdGhfaXRlbSIpXG4nCisgICAgICAgICAnICAgaXMgZXZhbHVhdGVkIHRvIG9idGFpbiBhIGNvbnRleHQgbWFuYWdlci5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcyLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBpcyBsb2FkZWQgZm9yIGxhdGVyIHVzZS5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICczLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2VudGVyX18oKSIgbWV0aG9kIGlzIGludm9rZWQuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnNC4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSAid2l0aCIgc3RhdGVtZW50LCB0aGUgcmV0dXJuXG4nCisgICAgICAgICAnICAgdmFsdWUgZnJvbSAiX19lbnRlcl9fKCkiIGlzIGFzc2lnbmVkIHRvIGl0LlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIE5vdGU6IFRoZSAid2l0aCIgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgIl9fZW50ZXJfXygpIlxuJworICAgICAgICAgJyAgICAgbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbiAiX19leGl0X18oKSIgd2lsbCBhbHdheXMgJworICAgICAgICAgJ2JlXG4nCisgICAgICAgICAnICAgICBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlXG4nCisgICAgICAgICAnICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZ1xuJworICAgICAgICAgJyAgICAgd2l0aGluIHRoZSBzdWl0ZSB3b3VsZCBiZS4gU2VlIHN0ZXAgNiBiZWxvdy5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICc1LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnNi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgbWV0aG9kIGlzIGludm9rZWQuICBJZiBhblxuJworICAgICAgICAgJyAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmRcbicKKyAgICAgICAgICcgICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gIl9fZXhpdF9fKCkiLiBPdGhlcndpc2UsICcKKyAgICAgICAgICd0aHJlZVxuJworICAgICAgICAgJyAgICJOb25lIiBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuICcKKyAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgJyAgIGZyb20gdGhlICJfX2V4aXRfXygpIiBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzICcKKyAgICAgICAgICdyZXJhaXNlZC5cbicKKyAgICAgICAgICcgICBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzIHN1cHByZXNzZWQsIGFuZFxuJworICAgICAgICAgJyAgIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgIndpdGgiXG4nCisgICAgICAgICAnICAgc3RhdGVtZW50LlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gZXhjZXB0aW9uLCAnCisgICAgICAgICAndGhlXG4nCisgICAgICAgICAnICAgcmV0dXJuIHZhbHVlIGZyb20gIl9fZXhpdF9fKCkiIGlzIGlnbm9yZWQsIGFuZCBleGVjdXRpb24gJworICAgICAgICAgJ3Byb2NlZWRzXG4nCisgICAgICAgICAnICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdXaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZlxuJworICAgICAgICAgJ211bHRpcGxlICJ3aXRoIiBzdGF0ZW1lbnRzIHdlcmUgbmVzdGVkOlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuJworICAgICAgICAgJyAgICAgICBzdWl0ZVxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ2lzIGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcgICB3aXRoIEEoKSBhcyBhOlxuJworICAgICAgICAgJyAgICAgICB3aXRoIEIoKSBhcyBiOlxuJworICAgICAgICAgJyAgICAgICAgICAgc3VpdGVcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgKipQRVAgMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuJworICAgICAgICAgJyAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAnCisgICAgICAgICAnIndpdGgiXG4nCisgICAgICAgICAnICAgICBzdGF0ZW1lbnQuXG4nLAorICd5aWVsZCc6ICdcbicKKyAgICAgICAgICAnVGhlICJ5aWVsZCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgeWllbGRfc3RtdCA6Oj0geWllbGRfZXhwcmVzc2lvblxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSAieWllbGQiIHN0YXRlbWVudCBpcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBhIHlpZWxkICcKKyAgICAgICAgICAnZXhwcmVzc2lvbi5cbicKKyAgICAgICAgICAnVGhlIHlpZWxkIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBvbWl0IHRoZSBwYXJlbnRoZXNlcyB0aGF0IHdvdWxkXG4nCisgICAgICAgICAgJ290aGVyd2lzZSBiZSByZXF1aXJlZCBpbiB0aGUgZXF1aXZhbGVudCB5aWVsZCBleHByZXNzaW9uICcKKyAgICAgICAgICAnc3RhdGVtZW50LlxuJworICAgICAgICAgICdGb3IgZXhhbXBsZSwgdGhlIHlpZWxkIHN0YXRlbWVudHNcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIHlpZWxkIDxleHByPlxuJworICAgICAgICAgICcgICB5aWVsZCBmcm9tIDxleHByPlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnYXJlIGVxdWl2YWxlbnQgdG8gdGhlIHlpZWxkIGV4cHJlc3Npb24gc3RhdGVtZW50c1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgKHlpZWxkIDxleHByPilcbicKKyAgICAgICAgICAnICAgKHlpZWxkIGZyb20gPGV4cHI+KVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnWWllbGQgZXhwcmVzc2lvbnMgYW5kIHN0YXRlbWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGRlZmluaW5nIGFcbicKKyAgICAgICAgICAnKmdlbmVyYXRvciogZnVuY3Rpb24sIGFuZCBhcmUgb25seSB1c2VkIGluIHRoZSBib2R5IG9mIHRoZSAnCisgICAgICAgICAgJ2dlbmVyYXRvclxuJworICAgICAgICAgICdmdW5jdGlvbi4gIFVzaW5nIHlpZWxkIGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBzdWZmaWNpZW50IHRvICcKKyAgICAgICAgICAnY2F1c2VcbicKKyAgICAgICAgICAndGhhdCBkZWZpbml0aW9uIHRvIGNyZWF0ZSBhIGdlbmVyYXRvciBmdW5jdGlvbiBpbnN0ZWFkIG9mIGEgbm9ybWFsXG4nCisgICAgICAgICAgJ2Z1bmN0aW9uLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnRm9yIGZ1bGwgZGV0YWlscyBvZiAieWllbGQiIHNlbWFudGljcywgcmVmZXIgdG8gdGhlIFlpZWxkICcKKyAgICAgICAgICAnZXhwcmVzc2lvbnNcbicKKyAgICAgICAgICAnc2VjdGlvbi5cbid9CmRpZmYgLS1naXQgYS9MaWIvcmFuZG9tLnB5IGIvTGliL3JhbmRvbS5weQppbmRleCA0ZWZiYjBhLi5jZDg1ODNmIDEwMDY0NAotLS0gYS9MaWIvcmFuZG9tLnB5CisrKyBiL0xpYi9yYW5kb20ucHkKQEAgLTgsNiArOCw3IEBACiAgICAgLS0tLS0tLS0tCiAgICAgICAgICAgIHBpY2sgcmFuZG9tIGVsZW1lbnQKICAgICAgICAgICAgcGljayByYW5kb20gc2FtcGxlCisgICAgICAgICAgIHBpY2sgd2VpZ2h0ZWQgcmFuZG9tIHNhbXBsZQogICAgICAgICAgICBnZW5lcmF0ZSByYW5kb20gcGVybXV0YXRpb24KIAogICAgIGRpc3RyaWJ1dGlvbnMgb24gdGhlIHJlYWwgbGluZToKQEAgLTQzLDEyICs0NCwxNCBAQAogZnJvbSBvcyBpbXBvcnQgdXJhbmRvbSBhcyBfdXJhbmRvbQogZnJvbSBfY29sbGVjdGlvbnNfYWJjIGltcG9ydCBTZXQgYXMgX1NldCwgU2VxdWVuY2UgYXMgX1NlcXVlbmNlCiBmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTUxMiBhcyBfc2hhNTEyCitpbXBvcnQgaXRlcnRvb2xzIGFzIF9pdGVydG9vbHMKK2ltcG9ydCBiaXNlY3QgYXMgX2Jpc2VjdAogCiBfX2FsbF9fID0gWyJSYW5kb20iLCJzZWVkIiwicmFuZG9tIiwidW5pZm9ybSIsInJhbmRpbnQiLCJjaG9pY2UiLCJzYW1wbGUiLAogICAgICAgICAgICAicmFuZHJhbmdlIiwic2h1ZmZsZSIsIm5vcm1hbHZhcmlhdGUiLCJsb2dub3JtdmFyaWF0ZSIsCiAgICAgICAgICAgICJleHBvdmFyaWF0ZSIsInZvbm1pc2VzdmFyaWF0ZSIsImdhbW1hdmFyaWF0ZSIsInRyaWFuZ3VsYXIiLAogICAgICAgICAgICAiZ2F1c3MiLCJiZXRhdmFyaWF0ZSIsInBhcmV0b3ZhcmlhdGUiLCJ3ZWlidWxsdmFyaWF0ZSIsCi0gICAgICAgICAgICJnZXRzdGF0ZSIsInNldHN0YXRlIiwgImdldHJhbmRiaXRzIiwKKyAgICAgICAgICAgImdldHN0YXRlIiwic2V0c3RhdGUiLCAiZ2V0cmFuZGJpdHMiLCAiY2hvaWNlcyIsCiAgICAgICAgICAgICJTeXN0ZW1SYW5kb20iXQogCiBOVl9NQUdJQ0NPTlNUID0gNCAqIF9leHAoLTAuNSkvX3NxcnQoMi4wKQpAQCAtMTA1LDE1ICsxMDgsNiBAQAogCiAgICAgICAgICIiIgogCi0gICAgICAgIGlmIGEgaXMgTm9uZToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAjIFNlZWQgd2l0aCBlbm91Z2ggYnl0ZXMgdG8gc3BhbiB0aGUgMTk5MzcgYml0Ci0gICAgICAgICAgICAgICAgIyBzdGF0ZSBzcGFjZSBmb3IgdGhlIE1lcnNlbm5lIFR3aXN0ZXIKLSAgICAgICAgICAgICAgICBhID0gaW50LmZyb21fYnl0ZXMoX3VyYW5kb20oMjUwMCksICdiaWcnKQotICAgICAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHRpbWUKLSAgICAgICAgICAgICAgICBhID0gaW50KHRpbWUudGltZSgpICogMjU2KSAjIHVzZSBmcmFjdGlvbmFsIHNlY29uZHMKLQogICAgICAgICBpZiB2ZXJzaW9uID09IDEgYW5kIGlzaW5zdGFuY2UoYSwgKHN0ciwgYnl0ZXMpKToKICAgICAgICAgICAgIHggPSBvcmQoYVswXSkgPDwgNyBpZiBhIGVsc2UgMAogICAgICAgICAgICAgZm9yIGMgaW4gYToKQEAgLTEyMSwxMiArMTE1LDExIEBACiAgICAgICAgICAgICB4IF49IGxlbihhKQogICAgICAgICAgICAgYSA9IC0yIGlmIHggPT0gLTEgZWxzZSB4CiAKLSAgICAgICAgaWYgdmVyc2lvbiA9PSAyOgotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhLCAoc3RyLCBieXRlcywgYnl0ZWFycmF5KSk6Ci0gICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhLCBzdHIpOgotICAgICAgICAgICAgICAgICAgICBhID0gYS5lbmNvZGUoKQotICAgICAgICAgICAgICAgIGEgKz0gX3NoYTUxMihhKS5kaWdlc3QoKQotICAgICAgICAgICAgICAgIGEgPSBpbnQuZnJvbV9ieXRlcyhhLCAnYmlnJykKKyAgICAgICAgaWYgdmVyc2lvbiA9PSAyIGFuZCBpc2luc3RhbmNlKGEsIChzdHIsIGJ5dGVzLCBieXRlYXJyYXkpKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgc3RyKToKKyAgICAgICAgICAgICAgICBhID0gYS5lbmNvZGUoKQorICAgICAgICAgICAgYSArPSBfc2hhNTEyKGEpLmRpZ2VzdCgpCisgICAgICAgICAgICBhID0gaW50LmZyb21fYnl0ZXMoYSwgJ2JpZycpCiAKICAgICAgICAgc3VwZXIoKS5zZWVkKGEpCiAgICAgICAgIHNlbGYuZ2F1c3NfbmV4dCA9IE5vbmUKQEAgLTM0NCw2ICszMzcsMjggQEAKICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBwb3B1bGF0aW9uW2pdCiAgICAgICAgIHJldHVybiByZXN1bHQKIAorICAgIGRlZiBjaG9pY2VzKHNlbGYsIGssIHBvcHVsYXRpb24sIHdlaWdodHM9Tm9uZSwgKiwgY3VtX3dlaWdodHM9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIGsgc2l6ZWQgbGlzdCBvZiBwb3B1bGF0aW9uIGVsZW1lbnRzIGNob3NlbiB3aXRoIHJlcGxhY2VtZW50LgorCisgICAgICAgIElmIHRoZSByZWxhdGl2ZSB3ZWlnaHRzIG9yIGN1bXVsYXRpdmUgd2VpZ2h0cyBhcmUgbm90IHNwZWNpZmllZCwKKyAgICAgICAgdGhlIHNlbGVjdGlvbnMgYXJlIG1hZGUgd2l0aCBlcXVhbCBwcm9iYWJpbGl0eS4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgY3VtX3dlaWdodHMgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHdlaWdodHMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjaG9pY2UgPSBzZWxmLmNob2ljZQorICAgICAgICAgICAgICAgIHJldHVybiBbY2hvaWNlKHBvcHVsYXRpb24pIGZvciBpIGluIHJhbmdlKGspXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjdW1fd2VpZ2h0cyA9IGxpc3QoX2l0ZXJ0b29scy5hY2N1bXVsYXRlKHdlaWdodHMpKQorICAgICAgICBlbGlmIHdlaWdodHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBzcGVjaWZ5IGJvdGggd2VpZ2h0cyBhbmQgY3VtdWxhdGl2ZV93ZWlnaHRzJykKKyAgICAgICAgaWYgbGVuKGN1bV93ZWlnaHRzKSAhPSBsZW4ocG9wdWxhdGlvbik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdUaGUgbnVtYmVyIG9mIHdlaWdodHMgZG9lcyBub3QgbWF0Y2ggdGhlIHBvcHVsYXRpb24nKQorICAgICAgICBiaXNlY3QgPSBfYmlzZWN0LmJpc2VjdAorICAgICAgICByYW5kb20gPSBzZWxmLnJhbmRvbQorICAgICAgICB0b3RhbCA9IGN1bV93ZWlnaHRzWy0xXQorICAgICAgICByZXR1cm4gW3BvcHVsYXRpb25bYmlzZWN0KGN1bV93ZWlnaHRzLCByYW5kb20oKSAqIHRvdGFsKV0gZm9yIGkgaW4gcmFuZ2UoayldCisKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlYWwtdmFsdWVkIGRpc3RyaWJ1dGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAogIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gdW5pZm9ybSBkaXN0cmlidXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjE1LDExICs2MzAsMTEgQEAKIAogICAgICAgICAjIFRoaXMgdmVyc2lvbiBkdWUgdG8gSmFubmUgU2lua2tvbmVuLCBhbmQgbWF0Y2hlcyBhbGwgdGhlIHN0ZAogICAgICAgICAjIHRleHRzIChlLmcuLCBLbnV0aCBWb2wgMiBFZCAzIHBnIDEzNCAidGhlIGJldGEgZGlzdHJpYnV0aW9uIikuCi0gICAgICAgIHkgPSBzZWxmLmdhbW1hdmFyaWF0ZShhbHBoYSwgMS4pCisgICAgICAgIHkgPSBzZWxmLmdhbW1hdmFyaWF0ZShhbHBoYSwgMS4wKQogICAgICAgICBpZiB5ID09IDA6CiAgICAgICAgICAgICByZXR1cm4gMC4wCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4geSAvICh5ICsgc2VsZi5nYW1tYXZhcmlhdGUoYmV0YSwgMS4pKQorICAgICAgICAgICAgcmV0dXJuIHkgLyAoeSArIHNlbGYuZ2FtbWF2YXJpYXRlKGJldGEsIDEuMCkpCiAKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhcmV0byAtLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC03MzQsNiArNzQ5LDcgQEAKIHJhbmRyYW5nZSA9IF9pbnN0LnJhbmRyYW5nZQogc2FtcGxlID0gX2luc3Quc2FtcGxlCiBzaHVmZmxlID0gX2luc3Quc2h1ZmZsZQorY2hvaWNlcyA9IF9pbnN0LmNob2ljZXMKIG5vcm1hbHZhcmlhdGUgPSBfaW5zdC5ub3JtYWx2YXJpYXRlCiBsb2dub3JtdmFyaWF0ZSA9IF9pbnN0LmxvZ25vcm12YXJpYXRlCiBleHBvdmFyaWF0ZSA9IF9pbnN0LmV4cG92YXJpYXRlCmRpZmYgLS1naXQgYS9MaWIvcmUucHkgYi9MaWIvcmUucHkKaW5kZXggZGRlODkwMS4uNjYxOTI5ZSAxMDA2NDQKLS0tIGEvTGliL3JlLnB5CisrKyBiL0xpYi9yZS5weQpAQCAtMTE5LDcgKzExOSw2IEBACiAKICIiIgogCi1pbXBvcnQgc3lzCiBpbXBvcnQgc3JlX2NvbXBpbGUKIGltcG9ydCBzcmVfcGFyc2UKIHRyeToKZGlmZiAtLWdpdCBhL0xpYi9ybGNvbXBsZXRlci5weSBiL0xpYi9ybGNvbXBsZXRlci5weQppbmRleCA0MDFhNjI2Li5iY2E0YTdiIDEwMDY0NAotLS0gYS9MaWIvcmxjb21wbGV0ZXIucHkKKysrIGIvTGliL3JsY29tcGxldGVyLnB5CkBAIC0xMTMsNiArMTEzLDEyIEBACiAgICAgICAgIGZvciB3b3JkIGluIGtleXdvcmQua3dsaXN0OgogICAgICAgICAgICAgaWYgd29yZFs6bl0gPT0gdGV4dDoKICAgICAgICAgICAgICAgICBzZWVuLmFkZCh3b3JkKQorICAgICAgICAgICAgICAgIGlmIHdvcmQgaW4geydmaW5hbGx5JywgJ3RyeSd9OgorICAgICAgICAgICAgICAgICAgICB3b3JkID0gd29yZCArICc6JworICAgICAgICAgICAgICAgIGVsaWYgd29yZCBub3QgaW4geydGYWxzZScsICdOb25lJywgJ1RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdicmVhaycsICdjb250aW51ZScsICdwYXNzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxzZSd9OgorICAgICAgICAgICAgICAgICAgICB3b3JkID0gd29yZCArICcgJwogICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKHdvcmQpCiAgICAgICAgIGZvciBuc3BhY2UgaW4gW3NlbGYubmFtZXNwYWNlLCBidWlsdGlucy5fX2RpY3RfX106CiAgICAgICAgICAgICBmb3Igd29yZCwgdmFsIGluIG5zcGFjZS5pdGVtcygpOgpAQCAtMTUyLDE0ICsxNTgsMzAgQEAKICAgICAgICAgICAgIHdvcmRzLnVwZGF0ZShnZXRfY2xhc3NfbWVtYmVycyh0aGlzb2JqZWN0Ll9fY2xhc3NfXykpCiAgICAgICAgIG1hdGNoZXMgPSBbXQogICAgICAgICBuID0gbGVuKGF0dHIpCi0gICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgotICAgICAgICAgICAgaWYgd29yZFs6bl0gPT0gYXR0cjoKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IGdldGF0dHIodGhpc29iamVjdCwgd29yZCkKLSAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBFeGNsdWRlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHNldAotICAgICAgICAgICAgICAgIHdvcmQgPSBzZWxmLl9jYWxsYWJsZV9wb3N0Zml4KHZhbCwgIiVzLiVzIiAlIChleHByLCB3b3JkKSkKLSAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCh3b3JkKQorICAgICAgICBpZiBhdHRyID09ICcnOgorICAgICAgICAgICAgbm9wcmVmaXggPSAnXycKKyAgICAgICAgZWxpZiBhdHRyID09ICdfJzoKKyAgICAgICAgICAgIG5vcHJlZml4ID0gJ19fJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbm9wcmVmaXggPSBOb25lCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBmb3Igd29yZCBpbiB3b3JkczoKKyAgICAgICAgICAgICAgICBpZiAod29yZFs6bl0gPT0gYXR0ciBhbmQKKyAgICAgICAgICAgICAgICAgICAgbm90IChub3ByZWZpeCBhbmQgd29yZFs6bisxXSA9PSBub3ByZWZpeCkpOgorICAgICAgICAgICAgICAgICAgICBtYXRjaCA9ICIlcy4lcyIgJSAoZXhwciwgd29yZCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gZ2V0YXR0cih0aGlzb2JqZWN0LCB3b3JkKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAgIyBJbmNsdWRlIGV2ZW4gaWYgYXR0cmlidXRlIG5vdCBzZXQKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gc2VsZi5fY2FsbGFibGVfcG9zdGZpeCh2YWwsIG1hdGNoKQorICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZChtYXRjaCkKKyAgICAgICAgICAgIGlmIG1hdGNoZXMgb3Igbm90IG5vcHJlZml4OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBub3ByZWZpeCA9PSAnXyc6CisgICAgICAgICAgICAgICAgbm9wcmVmaXggPSAnX18nCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5vcHJlZml4ID0gTm9uZQogICAgICAgICBtYXRjaGVzLnNvcnQoKQogICAgICAgICByZXR1cm4gbWF0Y2hlcwogCmRpZmYgLS1naXQgYS9MaWIvc2NoZWQucHkgYi9MaWIvc2NoZWQucHkKaW5kZXggYjQ3NjQ4ZC4uYmQ3YzBmMSAxMDA2NDQKLS0tIGEvTGliL3NjaGVkLnB5CisrKyBiL0xpYi9zY2hlZC5weQpAQCAtNDYsNiArNDYsMTcgQEAKICAgICBkZWYgX19ndF9fKHMsIG8pOiByZXR1cm4gKHMudGltZSwgcy5wcmlvcml0eSkgPiAgKG8udGltZSwgby5wcmlvcml0eSkKICAgICBkZWYgX19nZV9fKHMsIG8pOiByZXR1cm4gKHMudGltZSwgcy5wcmlvcml0eSkgPj0gKG8udGltZSwgby5wcmlvcml0eSkKIAorRXZlbnQudGltZS5fX2RvY19fID0gKCcnJ051bWVyaWMgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUKK3RpbWVmdW5jIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuJycnKQorRXZlbnQucHJpb3JpdHkuX19kb2NfXyA9ICgnJydFdmVudHMgc2NoZWR1bGVkIGZvciB0aGUgc2FtZSB0aW1lIHdpbGwgYmUgZXhlY3V0ZWQKK2luIHRoZSBvcmRlciBvZiB0aGVpciBwcmlvcml0eS4nJycpCitFdmVudC5hY3Rpb24uX19kb2NfXyA9ICgnJydFeGVjdXRpbmcgdGhlIGV2ZW50IG1lYW5zIGV4ZWN1dGluZworYWN0aW9uKCphcmd1bWVudCwgKiprd2FyZ3MpJycnKQorRXZlbnQuYXJndW1lbnQuX19kb2NfXyA9ICgnJydhcmd1bWVudCBpcyBhIHNlcXVlbmNlIGhvbGRpbmcgdGhlIHBvc2l0aW9uYWwKK2FyZ3VtZW50cyBmb3IgdGhlIGFjdGlvbi4nJycpCitFdmVudC5rd2FyZ3MuX19kb2NfXyA9ICgnJydrd2FyZ3MgaXMgYSBkaWN0aW9uYXJ5IGhvbGRpbmcgdGhlIGtleXdvcmQKK2FyZ3VtZW50cyBmb3IgdGhlIGFjdGlvbi4nJycpCisKIF9zZW50aW5lbCA9IG9iamVjdCgpCiAKIGNsYXNzIHNjaGVkdWxlcjoKZGlmZiAtLWdpdCBhL0xpYi9zZWNyZXRzLnB5IGIvTGliL3NlY3JldHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmYTQ1MAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZWNyZXRzLnB5CkBAIC0wLDAgKzEsNzEgQEAKKyIiIkdlbmVyYXRlIGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZyBwc2V1ZG8tcmFuZG9tIG51bWJlcnMgc3VpdGFibGUgZm9yCittYW5hZ2luZyBzZWNyZXRzIHN1Y2ggYXMgYWNjb3VudCBhdXRoZW50aWNhdGlvbiwgdG9rZW5zLCBhbmQgc2ltaWxhci4KKworU2VlIFBFUCA1MDYgZm9yIG1vcmUgaW5mb3JtYXRpb24uCitodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNTA2LworCisiIiIKKworX19hbGxfXyA9IFsnY2hvaWNlJywgJ3JhbmRiZWxvdycsICdyYW5kYml0cycsICdTeXN0ZW1SYW5kb20nLAorICAgICAgICAgICAndG9rZW5fYnl0ZXMnLCAndG9rZW5faGV4JywgJ3Rva2VuX3VybHNhZmUnLAorICAgICAgICAgICAnY29tcGFyZV9kaWdlc3QnLAorICAgICAgICAgICBdCisKKworaW1wb3J0IGJhc2U2NAoraW1wb3J0IGJpbmFzY2lpCitpbXBvcnQgb3MKKworZnJvbSBobWFjIGltcG9ydCBjb21wYXJlX2RpZ2VzdAorZnJvbSByYW5kb20gaW1wb3J0IFN5c3RlbVJhbmRvbQorCitfc3lzcmFuZCA9IFN5c3RlbVJhbmRvbSgpCisKK3JhbmRiaXRzID0gX3N5c3JhbmQuZ2V0cmFuZGJpdHMKK2Nob2ljZSA9IF9zeXNyYW5kLmNob2ljZQorCitkZWYgcmFuZGJlbG93KGV4Y2x1c2l2ZV91cHBlcl9ib3VuZCk6CisgICAgIiIiUmV0dXJuIGEgcmFuZG9tIGludCBpbiB0aGUgcmFuZ2UgWzAsIG4pLiIiIgorICAgIHJldHVybiBfc3lzcmFuZC5fcmFuZGJlbG93KGV4Y2x1c2l2ZV91cHBlcl9ib3VuZCkKKworREVGQVVMVF9FTlRST1BZID0gMzIgICMgbnVtYmVyIG9mIGJ5dGVzIHRvIHJldHVybiBieSBkZWZhdWx0CisKK2RlZiB0b2tlbl9ieXRlcyhuYnl0ZXM9Tm9uZSk6CisgICAgIiIiUmV0dXJuIGEgcmFuZG9tIGJ5dGUgc3RyaW5nIGNvbnRhaW5pbmcgKm5ieXRlcyogYnl0ZXMuCisKKyAgICBJZiAqbmJ5dGVzKiBpcyBgYE5vbmVgYCBvciBub3Qgc3VwcGxpZWQsIGEgcmVhc29uYWJsZQorICAgIGRlZmF1bHQgaXMgdXNlZC4KKworICAgID4+PiB0b2tlbl9ieXRlcygxNikgICNkb2N0ZXN0OitTS0lQCisgICAgYidcXHhlYnJcXHgxN0QqdFxceGFlXFx4ZDRcXHhlM1NcXHhiNlxceGUyXFx4ZWJQMVxceDhiJworCisgICAgIiIiCisgICAgaWYgbmJ5dGVzIGlzIE5vbmU6CisgICAgICAgIG5ieXRlcyA9IERFRkFVTFRfRU5UUk9QWQorICAgIHJldHVybiBvcy51cmFuZG9tKG5ieXRlcykKKworZGVmIHRva2VuX2hleChuYnl0ZXM9Tm9uZSk6CisgICAgIiIiUmV0dXJuIGEgcmFuZG9tIHRleHQgc3RyaW5nLCBpbiBoZXhhZGVjaW1hbC4KKworICAgIFRoZSBzdHJpbmcgaGFzICpuYnl0ZXMqIHJhbmRvbSBieXRlcywgZWFjaCBieXRlIGNvbnZlcnRlZCB0byB0d28KKyAgICBoZXggZGlnaXRzLiAgSWYgKm5ieXRlcyogaXMgYGBOb25lYGAgb3Igbm90IHN1cHBsaWVkLCBhIHJlYXNvbmFibGUKKyAgICBkZWZhdWx0IGlzIHVzZWQuCisKKyAgICA+Pj4gdG9rZW5faGV4KDE2KSAgI2RvY3Rlc3Q6K1NLSVAKKyAgICAnZjliZjc4YjlhMThjZTZkNDZhMGNkMmIwYjg2ZGY5ZGEnCisKKyAgICAiIiIKKyAgICByZXR1cm4gYmluYXNjaWkuaGV4bGlmeSh0b2tlbl9ieXRlcyhuYnl0ZXMpKS5kZWNvZGUoJ2FzY2lpJykKKworZGVmIHRva2VuX3VybHNhZmUobmJ5dGVzPU5vbmUpOgorICAgICIiIlJldHVybiBhIHJhbmRvbSBVUkwtc2FmZSB0ZXh0IHN0cmluZywgaW4gQmFzZTY0IGVuY29kaW5nLgorCisgICAgVGhlIHN0cmluZyBoYXMgKm5ieXRlcyogcmFuZG9tIGJ5dGVzLiAgSWYgKm5ieXRlcyogaXMgYGBOb25lYGAKKyAgICBvciBub3Qgc3VwcGxpZWQsIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCisKKyAgICA+Pj4gdG9rZW5fdXJsc2FmZSgxNikgICNkb2N0ZXN0OitTS0lQCisgICAgJ0RybWh6ZTZFUGN2MGZOXzgxQmotbkEnCisKKyAgICAiIiIKKyAgICB0b2sgPSB0b2tlbl9ieXRlcyhuYnl0ZXMpCisgICAgcmV0dXJuIGJhc2U2NC51cmxzYWZlX2I2NGVuY29kZSh0b2spLnJzdHJpcChiJz0nKS5kZWNvZGUoJ2FzY2lpJykKZGlmZiAtLWdpdCBhL0xpYi9zaGxleC5weSBiL0xpYi9zaGxleC5weQppbmRleCBlY2QyZWZkLi5lODcyNjZmIDEwMDY0NAotLS0gYS9MaWIvc2hsZXgucHkKKysrIGIvTGliL3NobGV4LnB5CkBAIC01LDYgKzUsNyBAQAogIyBwdXNoX3NvdXJjZSgpIGFuZCBwb3Bfc291cmNlKCkgbWFkZSBleHBsaWNpdCBieSBFU1IsIEphbnVhcnkgMjAwMS4KICMgUG9zaXggY29tcGxpYW5jZSwgc3BsaXQoKSwgc3RyaW5nIGFyZ3VtZW50cywgYW5kCiAjIGl0ZXJhdG9yIGludGVyZmFjZSBieSBHdXN0YXZvIE5pZW1leWVyLCBBcHJpbCAyMDAzLgorIyBjaGFuZ2VzIHRvIHRva2VuaXplIG1vcmUgbGlrZSBQb3NpeCBzaGVsbHMgYnkgVmluYXkgU2FqaXAsIEp1bHkgMjAxNi4KIAogaW1wb3J0IG9zCiBpbXBvcnQgcmUKQEAgLTE3LDcgKzE4LDggQEAKIAogY2xhc3Mgc2hsZXg6CiAgICAgIkEgbGV4aWNhbCBhbmFseXplciBjbGFzcyBmb3Igc2ltcGxlIHNoZWxsLWxpa2Ugc3ludGF4ZXMuIgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnN0cmVhbT1Ob25lLCBpbmZpbGU9Tm9uZSwgcG9zaXg9RmFsc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnN0cmVhbT1Ob25lLCBpbmZpbGU9Tm9uZSwgcG9zaXg9RmFsc2UsCisgICAgICAgICAgICAgICAgIHB1bmN0dWF0aW9uX2NoYXJzPUZhbHNlKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShpbnN0cmVhbSwgc3RyKToKICAgICAgICAgICAgIGluc3RyZWFtID0gU3RyaW5nSU8oaW5zdHJlYW0pCiAgICAgICAgIGlmIGluc3RyZWFtIGlzIG5vdCBOb25lOgpAQCAtNDksNiArNTEsMTkgQEAKICAgICAgICAgc2VsZi50b2tlbiA9ICcnCiAgICAgICAgIHNlbGYuZmlsZXN0YWNrID0gZGVxdWUoKQogICAgICAgICBzZWxmLnNvdXJjZSA9IE5vbmUKKyAgICAgICAgaWYgbm90IHB1bmN0dWF0aW9uX2NoYXJzOgorICAgICAgICAgICAgcHVuY3R1YXRpb25fY2hhcnMgPSAnJworICAgICAgICBlbGlmIHB1bmN0dWF0aW9uX2NoYXJzIGlzIFRydWU6CisgICAgICAgICAgICBwdW5jdHVhdGlvbl9jaGFycyA9ICcoKTs8PnwmJworICAgICAgICBzZWxmLnB1bmN0dWF0aW9uX2NoYXJzID0gcHVuY3R1YXRpb25fY2hhcnMKKyAgICAgICAgaWYgcHVuY3R1YXRpb25fY2hhcnM6CisgICAgICAgICAgICAjIF9wdXNoYmFja19jaGFycyBpcyBhIHB1c2ggYmFjayBxdWV1ZSB1c2VkIGJ5IGxvb2thaGVhZCBsb2dpYworICAgICAgICAgICAgc2VsZi5fcHVzaGJhY2tfY2hhcnMgPSBkZXF1ZSgpCisgICAgICAgICAgICAjIHRoZXNlIGNoYXJzIGFkZGVkIGJlY2F1c2UgYWxsb3dlZCBpbiBmaWxlIG5hbWVzLCBhcmdzLCB3aWxkY2FyZHMKKyAgICAgICAgICAgIHNlbGYud29yZGNoYXJzICs9ICd+LS4vKj89JworICAgICAgICAgICAgI3JlbW92ZSBhbnkgcHVuY3R1YXRpb24gY2hhcnMgZnJvbSB3b3JkY2hhcnMKKyAgICAgICAgICAgIHQgPSBzZWxmLndvcmRjaGFycy5tYWtldHJhbnMoZGljdC5mcm9ta2V5cyhwdW5jdHVhdGlvbl9jaGFycykpCisgICAgICAgICAgICBzZWxmLndvcmRjaGFycyA9IHNlbGYud29yZGNoYXJzLnRyYW5zbGF0ZSh0KQogCiAgICAgZGVmIHB1c2hfdG9rZW4oc2VsZiwgdG9rKToKICAgICAgICAgIlB1c2ggYSB0b2tlbiBvbnRvIHRoZSBzdGFjayBwb3BwZWQgYnkgdGhlIGdldF90b2tlbiBtZXRob2QiCkBAIC0xMTUsMTIgKzEzMCwxNSBAQAogICAgICAgICBxdW90ZWQgPSBGYWxzZQogICAgICAgICBlc2NhcGVkc3RhdGUgPSAnICcKICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIG5leHRjaGFyID0gc2VsZi5pbnN0cmVhbS5yZWFkKDEpCisgICAgICAgICAgICBpZiBzZWxmLnB1bmN0dWF0aW9uX2NoYXJzIGFuZCBzZWxmLl9wdXNoYmFja19jaGFyczoKKyAgICAgICAgICAgICAgICBuZXh0Y2hhciA9IHNlbGYuX3B1c2hiYWNrX2NoYXJzLnBvcCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5leHRjaGFyID0gc2VsZi5pbnN0cmVhbS5yZWFkKDEpCiAgICAgICAgICAgICBpZiBuZXh0Y2hhciA9PSAnXG4nOgotICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyAxCisgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gKz0gMQogICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAzOgotICAgICAgICAgICAgICAgIHByaW50KCJzaGxleDogaW4gc3RhdGUiLCByZXByKHNlbGYuc3RhdGUpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIkkgc2VlIGNoYXJhY3RlcjoiLCByZXByKG5leHRjaGFyKSkKKyAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IGluIHN0YXRlICVyIEkgc2VlIGNoYXJhY3RlcjogJXIiICUgKHNlbGYuc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Y2hhcikpCiAgICAgICAgICAgICBpZiBzZWxmLnN0YXRlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9ICcnICAgICAgICAjIHBhc3QgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICBicmVhawpAQCAtMTM3LDEzICsxNTUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLmNvbW1lbnRlcnM6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0ucmVhZGxpbmUoKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyArPSAxCiAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLmVzY2FwZToKICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZHN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53b3JkY2hhcnM6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ2EnCisgICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLnB1bmN0dWF0aW9uX2NoYXJzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdjJwogICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi5xdW90ZXM6CiAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvc2l4OgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCkBAIC0xNjYsMTcgKzE4NywxNyBAQAogICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJObyBjbG9zaW5nIHF1b3RhdGlvbiIpCiAgICAgICAgICAgICAgICAgaWYgbmV4dGNoYXIgPT0gc2VsZi5zdGF0ZToKICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucG9zaXg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuICs9IG5leHRjaGFyCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdhJwotICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5wb3NpeCBhbmQgbmV4dGNoYXIgaW4gc2VsZi5lc2NhcGUgYW5kIFwKLSAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgaW4gc2VsZi5lc2NhcGVkcXVvdGVzOgorICAgICAgICAgICAgICAgIGVsaWYgKHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYuZXNjYXBlIGFuZCBzZWxmLnN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgaW4gc2VsZi5lc2NhcGVkcXVvdGVzKToKICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZHN0YXRlID0gc2VsZi5zdGF0ZQogICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCisgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gKz0gbmV4dGNoYXIKICAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSBpbiBzZWxmLmVzY2FwZToKICAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6ICAgICAgIyBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDI6CkBAIC0xODUsMTIgKzIwNiwxMiBAQAogICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJObyBlc2NhcGVkIGNoYXJhY3RlciIpCiAgICAgICAgICAgICAgICAgIyBJbiBwb3NpeCBzaGVsbHMsIG9ubHkgdGhlIHF1b3RlIGl0c2VsZiBvciB0aGUgZXNjYXBlCiAgICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXIgbWF5IGJlIGVzY2FwZWQgd2l0aGluIHF1b3Rlcy4KLSAgICAgICAgICAgICAgICBpZiBlc2NhcGVkc3RhdGUgaW4gc2VsZi5xdW90ZXMgYW5kIFwKLSAgICAgICAgICAgICAgICAgICBuZXh0Y2hhciAhPSBzZWxmLnN0YXRlIGFuZCBuZXh0Y2hhciAhPSBlc2NhcGVkc3RhdGU6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgc2VsZi5zdGF0ZQotICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgbmV4dGNoYXIKKyAgICAgICAgICAgICAgICBpZiAoZXNjYXBlZHN0YXRlIGluIHNlbGYucXVvdGVzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGNoYXIgIT0gc2VsZi5zdGF0ZSBhbmQgbmV4dGNoYXIgIT0gZXNjYXBlZHN0YXRlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiArPSBzZWxmLnN0YXRlCisgICAgICAgICAgICAgICAgc2VsZi50b2tlbiArPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBlc2NhcGVkc3RhdGUKLSAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSAnYSc6CisgICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgaW4gKCdhJywgJ2MnKToKICAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBOb25lICAgIyBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgICAgICBicmVhawpAQCAtMjA0LDcgKzIyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi5jb21tZW50ZXJzOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RyZWFtLnJlYWRsaW5lKCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIDEKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gKz0gMQogICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnBvc2l4OgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKQEAgLTIxNiwxMSArMjM3LDIyIEBACiAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLmVzY2FwZToKICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZHN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBuZXh0Y2hhcgotICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53b3JkY2hhcnMgb3IgbmV4dGNoYXIgaW4gc2VsZi5xdW90ZXMgXAotICAgICAgICAgICAgICAgICAgICBvciBzZWxmLndoaXRlc3BhY2Vfc3BsaXQ6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgbmV4dGNoYXIKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gJ2MnOgorICAgICAgICAgICAgICAgICAgICBpZiBuZXh0Y2hhciBpbiBzZWxmLnB1bmN0dWF0aW9uX2NoYXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiArPSBuZXh0Y2hhcgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV4dGNoYXIgbm90IGluIHNlbGYud2hpdGVzcGFjZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wdXNoYmFja19jaGFycy5hcHBlbmQobmV4dGNoYXIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgKG5leHRjaGFyIGluIHNlbGYud29yZGNoYXJzIG9yIG5leHRjaGFyIGluIHNlbGYucXVvdGVzCisgICAgICAgICAgICAgICAgICAgICAgb3Igc2VsZi53aGl0ZXNwYWNlX3NwbGl0KToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiArPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaGJhY2suYXBwZW5kbGVmdChuZXh0Y2hhcikKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wdW5jdHVhdGlvbl9jaGFyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3B1c2hiYWNrX2NoYXJzLmFwcGVuZChuZXh0Y2hhcikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaGJhY2suYXBwZW5kbGVmdChuZXh0Y2hhcikKICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiBJIHNlZSBwdW5jdHVhdGlvbiBpbiB3b3JkIHN0YXRlIikKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJwpkaWZmIC0tZ2l0IGEvTGliL3NodXRpbC5weSBiL0xpYi9zaHV0aWwucHkKaW5kZXggZGM5ZjJlYi4uOWQxOTNiNSAxMDA2NDQKLS0tIGEvTGliL3NodXRpbC5weQorKysgYi9MaWIvc2h1dGlsLnB5CkBAIC05NzQsNiArOTc0LDkgQEAKIAogICAgIF9fYWxsX18uYXBwZW5kKCdkaXNrX3VzYWdlJykKICAgICBfbnR1cGxlX2Rpc2t1c2FnZSA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ3VzYWdlJywgJ3RvdGFsIHVzZWQgZnJlZScpCisgICAgX250dXBsZV9kaXNrdXNhZ2UudG90YWwuX19kb2NfXyA9ICdUb3RhbCBzcGFjZSBpbiBieXRlcycKKyAgICBfbnR1cGxlX2Rpc2t1c2FnZS51c2VkLl9fZG9jX18gPSAnVXNlZCBzcGFjZSBpbiBieXRlcycKKyAgICBfbnR1cGxlX2Rpc2t1c2FnZS5mcmVlLl9fZG9jX18gPSAnRnJlZSBzcGFjZSBpbiBieXRlcycKIAogICAgIGRlZiBkaXNrX3VzYWdlKHBhdGgpOgogICAgICAgICAiIiJSZXR1cm4gZGlzayB1c2FnZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBnaXZlbiBwYXRoLgpkaWZmIC0tZ2l0IGEvTGliL3NpdGUtcGFja2FnZXMvUkVBRE1FLnR4dCBiL0xpYi9zaXRlLXBhY2thZ2VzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZjYyNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zaXRlLXBhY2thZ2VzL1JFQURNRS50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIGRpcmVjdG9yeSBleGlzdHMgc28gdGhhdCAzcmQgcGFydHkgcGFja2FnZXMgY2FuIGJlIGluc3RhbGxlZAoraGVyZS4gIFJlYWQgdGhlIHNvdXJjZSBmb3Igc2l0ZS5weSBmb3IgbW9yZSBkZXRhaWxzLgpkaWZmIC0tZ2l0IGEvTGliL3NpdGUucHkgYi9MaWIvc2l0ZS5weQppbmRleCAzZjc4ZWY1Li41MjUwMjY2IDEwMDY0NAotLS0gYS9MaWIvc2l0ZS5weQorKysgYi9MaWIvc2l0ZS5weQpAQCAtMTMxLDEzICsxMzEsMTMgQEAKIAogCiBkZWYgX2luaXRfcGF0aGluZm8oKToKLSAgICAiIiJSZXR1cm4gYSBzZXQgY29udGFpbmluZyBhbGwgZXhpc3RpbmcgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBzeXMucGF0aCIiIgorICAgICIiIlJldHVybiBhIHNldCBjb250YWluaW5nIGFsbCBleGlzdGluZyBmaWxlIHN5c3RlbSBpdGVtcyBmcm9tIHN5cy5wYXRoLiIiIgogICAgIGQgPSBzZXQoKQotICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgZm9yIGl0ZW0gaW4gc3lzLnBhdGg6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlyKToKLSAgICAgICAgICAgICAgICBkaXIsIGRpcmNhc2UgPSBtYWtlcGF0aChkaXIpCi0gICAgICAgICAgICAgICAgZC5hZGQoZGlyY2FzZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGl0ZW0pOgorICAgICAgICAgICAgICAgIF8sIGl0ZW1jYXNlID0gbWFrZXBhdGgoaXRlbSkKKyAgICAgICAgICAgICAgICBkLmFkZChpdGVtY2FzZSkKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgcmV0dXJuIGQKQEAgLTE1MCw5ICsxNTAsOSBAQAogICAgICIiIgogICAgIGlmIGtub3duX3BhdGhzIGlzIE5vbmU6CiAgICAgICAgIGtub3duX3BhdGhzID0gX2luaXRfcGF0aGluZm8oKQotICAgICAgICByZXNldCA9IDEKKyAgICAgICAgcmVzZXQgPSBUcnVlCiAgICAgZWxzZToKLSAgICAgICAgcmVzZXQgPSAwCisgICAgICAgIHJlc2V0ID0gRmFsc2UKICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihzaXRlZGlyLCBuYW1lKQogICAgIHRyeToKICAgICAgICAgZiA9IG9wZW4oZnVsbG5hbWUsICJyIikKQEAgLTE5MCw5ICsxOTAsOSBAQAogICAgICdzaXRlZGlyJyIiIgogICAgIGlmIGtub3duX3BhdGhzIGlzIE5vbmU6CiAgICAgICAgIGtub3duX3BhdGhzID0gX2luaXRfcGF0aGluZm8oKQotICAgICAgICByZXNldCA9IDEKKyAgICAgICAgcmVzZXQgPSBUcnVlCiAgICAgZWxzZToKLSAgICAgICAgcmVzZXQgPSAwCisgICAgICAgIHJlc2V0ID0gRmFsc2UKICAgICBzaXRlZGlyLCBzaXRlZGlyY2FzZSA9IG1ha2VwYXRoKHNpdGVkaXIpCiAgICAgaWYgbm90IHNpdGVkaXJjYXNlIGluIGtub3duX3BhdGhzOgogICAgICAgICBzeXMucGF0aC5hcHBlbmQoc2l0ZWRpcikgICAgICAgICMgQWRkIHBhdGggY29tcG9uZW50CkBAIC0zMDQsNyArMzA0LDcgQEAKIAogICAgICAgICBpZiBvcy5zZXAgPT0gJy8nOgogICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZChvcy5wYXRoLmpvaW4ocHJlZml4LCAibGliIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIiArIHN5cy52ZXJzaW9uWzozXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uJWQuJWQiICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpdGUtcGFja2FnZXMiKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNpdGVwYWNrYWdlcy5hcHBlbmQocHJlZml4KQpAQCAtMzE3LDcgKzMxNyw3IEBACiAgICAgICAgICAgICBpZiBmcmFtZXdvcms6CiAgICAgICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigiL0xpYnJhcnkiLCBmcmFtZXdvcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLCAic2l0ZS1wYWNrYWdlcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwgInNpdGUtcGFja2FnZXMiKSkKICAgICByZXR1cm4gc2l0ZXBhY2thZ2VzCiAKIGRlZiBhZGRzaXRlcGFja2FnZXMoa25vd25fcGF0aHMsIHByZWZpeGVzPU5vbmUpOgpAQCAtNDIzLDIxICs0MjMsNiBAQAogCiAgICAgc3lzLl9faW50ZXJhY3RpdmVob29rX18gPSByZWdpc3Rlcl9yZWFkbGluZQogCi1kZWYgYWxpYXNtYmNzKCk6Ci0gICAgIiIiT24gV2luZG93cywgc29tZSBkZWZhdWx0IGVuY29kaW5ncyBhcmUgbm90IHByb3ZpZGVkIGJ5IFB5dGhvbiwKLSAgICB3aGlsZSB0aGV5IGFyZSBhbHdheXMgYXZhaWxhYmxlIGFzICJtYmNzIiBpbiBlYWNoIGxvY2FsZS4gTWFrZQotICAgIHRoZW0gdXNhYmxlIGJ5IGFsaWFzaW5nIHRvICJtYmNzIiBpbiBzdWNoIGEgY2FzZS4iIiIKLSAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKLSAgICAgICAgaW1wb3J0IF9ib290bG9jYWxlLCBjb2RlY3MKLSAgICAgICAgZW5jID0gX2Jvb3Rsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpCi0gICAgICAgIGlmIGVuYy5zdGFydHN3aXRoKCdjcCcpOiAgICAgICAgICAgICMgImNwKioqIiA/Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY29kZWNzLmxvb2t1cChlbmMpCi0gICAgICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IGVuY29kaW5ncwotICAgICAgICAgICAgICAgIGVuY29kaW5ncy5fY2FjaGVbZW5jXSA9IGVuY29kaW5ncy5fdW5rbm93bgotICAgICAgICAgICAgICAgIGVuY29kaW5ncy5hbGlhc2VzLmFsaWFzZXNbZW5jXSA9ICdtYmNzJwotCiBDT05GSUdfTElORSA9IHInXig/UDxrZXk+KFx3fFstX10pKylccyo9XHMqKD9QPHZhbHVlPi4qKVxzKiQnCiAKIGRlZiB2ZW52KGtub3duX3BhdGhzKToKQEAgLTQ3OCwxMiArNDYzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9zaXRlID0gdmFsdWUubG93ZXIoKQogICAgICAgICAgICAgICAgICAgICBlbGlmIGtleSA9PSAnaG9tZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuX2hvbWUgPSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICBlbGlmIGtleSA9PSAnYXBwbG9jYWwnIGFuZCB2YWx1ZS5sb3dlcigpID09ICd0cnVlJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICMgQXBwLWxvY2FsIGluc3RhbGxzIHVzZSB0aGUgZXhlX2RpciBhcyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAjIG5vdCBvbmUgbGV2ZWwgaGlnaGVyLCBhbmQgZG8gbm90IHVzZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICMgc2l0ZSBwYWNrYWdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVfcHJlZml4ID0gZXhlX2RpcgotICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtX3NpdGUgPSAnZmFsc2UnCiAKICAgICAgICAgc3lzLnByZWZpeCA9IHN5cy5leGVjX3ByZWZpeCA9IHNpdGVfcHJlZml4CiAKQEAgLTUwNCw5ICs0ODMsMTMgQEAKIGRlZiBleGVjc2l0ZWN1c3RvbWl6ZSgpOgogICAgICIiIlJ1biBjdXN0b20gc2l0ZSBzcGVjaWZpYyBjb2RlLCBpZiBhdmFpbGFibGUuIiIiCiAgICAgdHJ5OgotICAgICAgICBpbXBvcnQgc2l0ZWN1c3RvbWl6ZQotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgc2l0ZWN1c3RvbWl6ZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgaWYgZXhjLm5hbWUgPT0gJ3NpdGVjdXN0b21pemUnOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoIlBZVEhPTlZFUkJPU0UiKToKICAgICAgICAgICAgIHN5cy5leGNlcHRob29rKCpzeXMuZXhjX2luZm8oKSkKQEAgLTUyMCw5ICs1MDMsMTMgQEAKIGRlZiBleGVjdXNlcmN1c3RvbWl6ZSgpOgogICAgICIiIlJ1biBjdXN0b20gdXNlciBzcGVjaWZpYyBjb2RlLCBpZiBhdmFpbGFibGUuIiIiCiAgICAgdHJ5OgotICAgICAgICBpbXBvcnQgdXNlcmN1c3RvbWl6ZQotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgdXNlcmN1c3RvbWl6ZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgaWYgZXhjLm5hbWUgPT0gJ3VzZXJjdXN0b21pemUnOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoIlBZVEhPTlZFUkJPU0UiKToKICAgICAgICAgICAgIHN5cy5leGNlcHRob29rKCpzeXMuZXhjX2luZm8oKSkKQEAgLTU1Miw3ICs1MzksNiBAQAogICAgIHNldGNvcHlyaWdodCgpCiAgICAgc2V0aGVscGVyKCkKICAgICBlbmFibGVybGNvbXBsZXRlcigpCi0gICAgYWxpYXNtYmNzKCkKICAgICBleGVjc2l0ZWN1c3RvbWl6ZSgpCiAgICAgaWYgRU5BQkxFX1VTRVJfU0lURToKICAgICAgICAgZXhlY3VzZXJjdXN0b21pemUoKQpkaWZmIC0tZ2l0IGEvTGliL3NtdHBkLnB5IGIvTGliL3NtdHBkLnB5CmluZGV4IDczMjA2NmUuLjgxMDNjYTkgMTAwNzU1Ci0tLSBhL0xpYi9zbXRwZC5weQorKysgYi9MaWIvc210cGQucHkKQEAgLTg5LDcgKzg5LDEwIEBACiBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCiBmcm9tIGVtYWlsLl9oZWFkZXJfdmFsdWVfcGFyc2VyIGltcG9ydCBnZXRfYWRkcl9zcGVjLCBnZXRfYW5nbGVfYWRkcgogCi1fX2FsbF9fID0gWyJTTVRQU2VydmVyIiwiRGVidWdnaW5nU2VydmVyIiwiUHVyZVByb3h5IiwiTWFpbG1hblByb3h5Il0KK19fYWxsX18gPSBbCisgICAgIlNNVFBDaGFubmVsIiwgIlNNVFBTZXJ2ZXIiLCAiRGVidWdnaW5nU2VydmVyIiwgIlB1cmVQcm94eSIsCisgICAgIk1haWxtYW5Qcm94eSIsCitdCiAKIHByb2dyYW0gPSBzeXMuYXJndlswXQogX192ZXJzaW9uX18gPSAnUHl0aG9uIFNNVFAgcHJveHkgdmVyc2lvbiAwLjMnCkBAIC0xMjgsMjQgKzEzMSwxNyBAQAogICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tbWFuZF9zaXplX2xpbWl0CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyLCBjb25uLCBhZGRyLCBkYXRhX3NpemVfbGltaXQ9REFUQV9TSVpFX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgIG1hcD1Ob25lLCBlbmFibGVfU01UUFVURjg9RmFsc2UsIGRlY29kZV9kYXRhPU5vbmUpOgorICAgICAgICAgICAgICAgICBtYXA9Tm9uZSwgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1GYWxzZSk6CiAgICAgICAgIGFzeW5jaGF0LmFzeW5jX2NoYXQuX19pbml0X18oc2VsZiwgY29ubiwgbWFwPW1hcCkKICAgICAgICAgc2VsZi5zbXRwX3NlcnZlciA9IHNlcnZlcgogICAgICAgICBzZWxmLmNvbm4gPSBjb25uCiAgICAgICAgIHNlbGYuYWRkciA9IGFkZHIKICAgICAgICAgc2VsZi5kYXRhX3NpemVfbGltaXQgPSBkYXRhX3NpemVfbGltaXQKICAgICAgICAgc2VsZi5lbmFibGVfU01UUFVURjggPSBlbmFibGVfU01UUFVURjgKLSAgICAgICAgaWYgZW5hYmxlX1NNVFBVVEY4OgotICAgICAgICAgICAgaWYgZGVjb2RlX2RhdGE6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZGVjb2RlX2RhdGEgYW5kIGVuYWJsZV9TTVRQVVRGOCBjYW5ub3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJlIHNldCB0byBUcnVlIGF0IHRoZSBzYW1lIHRpbWUiKQotICAgICAgICAgICAgZGVjb2RlX2RhdGEgPSBGYWxzZQotICAgICAgICBpZiBkZWNvZGVfZGF0YSBpcyBOb25lOgotICAgICAgICAgICAgd2FybigiVGhlIGRlY29kZV9kYXRhIGRlZmF1bHQgb2YgVHJ1ZSB3aWxsIGNoYW5nZSB0byBGYWxzZSBpbiAzLjY7IgotICAgICAgICAgICAgICAgICAiIHNwZWNpZnkgYW4gZXhwbGljaXQgdmFsdWUgZm9yIHRoaXMga2V5d29yZCIsCi0gICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICAgICAgICAgIGRlY29kZV9kYXRhID0gVHJ1ZQogICAgICAgICBzZWxmLl9kZWNvZGVfZGF0YSA9IGRlY29kZV9kYXRhCisgICAgICAgIGlmIGVuYWJsZV9TTVRQVVRGOCBhbmQgZGVjb2RlX2RhdGE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJkZWNvZGVfZGF0YSBhbmQgZW5hYmxlX1NNVFBVVEY4IGNhbm5vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBiZSBzZXQgdG8gVHJ1ZSBhdCB0aGUgc2FtZSB0aW1lIikKICAgICAgICAgaWYgZGVjb2RlX2RhdGE6CiAgICAgICAgICAgICBzZWxmLl9lbXB0eXN0cmluZyA9ICcnCiAgICAgICAgICAgICBzZWxmLl9saW5lc2VwID0gJ1xyXG4nCkBAIC02MzUsMjMgKzYzMSwxNSBAQAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2FsYWRkciwgcmVtb3RlYWRkciwKICAgICAgICAgICAgICAgICAgZGF0YV9zaXplX2xpbWl0PURBVEFfU0laRV9ERUZBVUxULCBtYXA9Tm9uZSwKLSAgICAgICAgICAgICAgICAgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1Ob25lKToKKyAgICAgICAgICAgICAgICAgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1GYWxzZSk6CiAgICAgICAgIHNlbGYuX2xvY2FsYWRkciA9IGxvY2FsYWRkcgogICAgICAgICBzZWxmLl9yZW1vdGVhZGRyID0gcmVtb3RlYWRkcgogICAgICAgICBzZWxmLmRhdGFfc2l6ZV9saW1pdCA9IGRhdGFfc2l6ZV9saW1pdAogICAgICAgICBzZWxmLmVuYWJsZV9TTVRQVVRGOCA9IGVuYWJsZV9TTVRQVVRGOAotICAgICAgICBpZiBlbmFibGVfU01UUFVURjg6Ci0gICAgICAgICAgICBpZiBkZWNvZGVfZGF0YToKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUaGUgZGVjb2RlX2RhdGEgYW5kIGVuYWJsZV9TTVRQVVRGOCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcGFyYW1ldGVycyBjYW5ub3QgYmUgc2V0IHRvIFRydWUgYXQgdGhlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzYW1lIHRpbWUuIikKLSAgICAgICAgICAgIGRlY29kZV9kYXRhID0gRmFsc2UKLSAgICAgICAgaWYgZGVjb2RlX2RhdGEgaXMgTm9uZToKLSAgICAgICAgICAgIHdhcm4oIlRoZSBkZWNvZGVfZGF0YSBkZWZhdWx0IG9mIFRydWUgd2lsbCBjaGFuZ2UgdG8gRmFsc2UgaW4gMy42OyIKLSAgICAgICAgICAgICAgICAgIiBzcGVjaWZ5IGFuIGV4cGxpY2l0IHZhbHVlIGZvciB0aGlzIGtleXdvcmQiLAotICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgICAgICAgICBkZWNvZGVfZGF0YSA9IFRydWUKICAgICAgICAgc2VsZi5fZGVjb2RlX2RhdGEgPSBkZWNvZGVfZGF0YQorICAgICAgICBpZiBlbmFibGVfU01UUFVURjggYW5kIGRlY29kZV9kYXRhOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZGVjb2RlX2RhdGEgYW5kIGVuYWJsZV9TTVRQVVRGOCBjYW5ub3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmUgc2V0IHRvIFRydWUgYXQgdGhlIHNhbWUgdGltZSIpCiAgICAgICAgIGFzeW5jb3JlLmRpc3BhdGNoZXIuX19pbml0X18oc2VsZiwgbWFwPW1hcCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZ2FpX3Jlc3VsdHMgPSBzb2NrZXQuZ2V0YWRkcmluZm8oKmxvY2FsYWRkciwKQEAgLTY5OCw5ICs2ODYsOSBAQAogICAgICAgICBjb250YWluaW5nIGEgYC4nIGZvbGxvd2VkIGJ5IG90aGVyIHRleHQgaGFzIGhhZCB0aGUgbGVhZGluZyBkb3QKICAgICAgICAgcmVtb3ZlZC4KIAotICAgICAgICBrd2FyZ3MgaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gSXQgaXMgZW1wdHkKLSAgICAgICAgdW5sZXNzIGRlY29kZV9kYXRhPUZhbHNlIG9yIGVuYWJsZV9TTVRQVVRGOD1UcnVlIHdhcyBnaXZlbiBhcyBpbml0Ci0gICAgICAgIHBhcmFtZXRlciwgaW4gd2hpY2ggY2FzZSB1dCB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBrZXlzOgorICAgICAgICBrd2FyZ3MgaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gIEl0IGlzCisgICAgICAgIGVtcHR5IGlmIGRlY29kZV9kYXRhPVRydWUgd2FzIGdpdmVuIGFzIGluaXQgcGFyYW1ldGVyLCBvdGhlcndpc2UKKyAgICAgICAgaXQgd2lsbCBjb250YWluIHRoZSBmb2xsb3dpbmcga2V5czoKICAgICAgICAgICAgICdtYWlsX29wdGlvbnMnOiBsaXN0IG9mIHBhcmFtZXRlcnMgdG8gdGhlIG1haWwgY29tbWFuZC4gIEFsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFyZSB1cHBlcmNhc2Ugc3RyaW5ncy4gIEV4YW1wbGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydCT0RZPThCSVRNSU1FJywgJ1NNVFBVVEY4J10uCmRpZmYgLS1naXQgYS9MaWIvc25kaGRyLnB5IGIvTGliL3NuZGhkci5weQppbmRleCBlNTkwMWVjLi43ZWNhZmI0IDEwMDY0NAotLS0gYS9MaWIvc25kaGRyLnB5CisrKyBiL0xpYi9zbmRoZHIucHkKQEAgLTM3LDYgKzM3LDE4IEBACiBTbmRIZWFkZXJzID0gbmFtZWR0dXBsZSgnU25kSGVhZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZXR5cGUgZnJhbWVyYXRlIG5jaGFubmVscyBuZnJhbWVzIHNhbXB3aWR0aCcpCiAKK1NuZEhlYWRlcnMuZmlsZXR5cGUuX19kb2NfXyA9ICgiIiJUaGUgdmFsdWUgZm9yIHR5cGUgaW5kaWNhdGVzIHRoZSBkYXRhIHR5cGUKK2FuZCB3aWxsIGJlIG9uZSBvZiB0aGUgc3RyaW5ncyAnYWlmYycsICdhaWZmJywgJ2F1JywnaGNvbScsCisnc25kcicsICdzbmR0JywgJ3ZvYycsICd3YXYnLCAnOHN2eCcsICdzYicsICd1YicsIG9yICd1bCcuIiIiKQorU25kSGVhZGVycy5mcmFtZXJhdGUuX19kb2NfXyA9ICgiIiJUaGUgc2FtcGxpbmdfcmF0ZSB3aWxsIGJlIGVpdGhlciB0aGUgYWN0dWFsCit2YWx1ZSBvciAwIGlmIHVua25vd24gb3IgZGlmZmljdWx0IHRvIGRlY29kZS4iIiIpCitTbmRIZWFkZXJzLm5jaGFubmVscy5fX2RvY19fID0gKCIiIlRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb3IgMCBpZiBpdCBjYW5ub3QgYmUKK2RldGVybWluZWQgb3IgaWYgdGhlIHZhbHVlIGlzIGRpZmZpY3VsdCB0byBkZWNvZGUuIiIiKQorU25kSGVhZGVycy5uZnJhbWVzLl9fZG9jX18gPSAoIiIiVGhlIHZhbHVlIGZvciBmcmFtZXMgd2lsbCBiZSBlaXRoZXIgdGhlIG51bWJlcgorb2YgZnJhbWVzIG9yIC0xLiIiIikKK1NuZEhlYWRlcnMuc2FtcHdpZHRoLl9fZG9jX18gPSAoIiIiRWl0aGVyIHRoZSBzYW1wbGUgc2l6ZSBpbiBiaXRzIG9yCisnQScgZm9yIEEtTEFXIG9yICdVJyBmb3IgdS1MQVcuIiIiKQorCiBkZWYgd2hhdChmaWxlbmFtZSk6CiAgICAgIiIiR3Vlc3MgdGhlIHR5cGUgb2YgYSBzb3VuZCBmaWxlLiIiIgogICAgIHJlcyA9IHdoYXRoZHIoZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9MaWIvc29ja2V0c2VydmVyLnB5IGIvTGliL3NvY2tldHNlcnZlci5weQppbmRleCA4ODA4ODEzLi40MWEzNzY2IDEwMDY0NAotLS0gYS9MaWIvc29ja2V0c2VydmVyLnB5CisrKyBiL0xpYi9zb2NrZXRzZXJ2ZXIucHkKQEAgLTEyNywxNiArMTI3LDIwIEBACiBpbXBvcnQgc2VsZWN0b3JzCiBpbXBvcnQgb3MKIGltcG9ydCBlcnJubworaW1wb3J0IHN5cwogdHJ5OgogICAgIGltcG9ydCB0aHJlYWRpbmcKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIHRocmVhZGluZworZnJvbSBpbyBpbXBvcnQgQnVmZmVyZWRJT0Jhc2UKIGZyb20gdGltZSBpbXBvcnQgbW9ub3RvbmljIGFzIHRpbWUKIAotX19hbGxfXyA9IFsiQmFzZVNlcnZlciIsICJUQ1BTZXJ2ZXIiLCAiVURQU2VydmVyIiwgIkZvcmtpbmdVRFBTZXJ2ZXIiLAotICAgICAgICAgICAiRm9ya2luZ1RDUFNlcnZlciIsICJUaHJlYWRpbmdVRFBTZXJ2ZXIiLCAiVGhyZWFkaW5nVENQU2VydmVyIiwKK19fYWxsX18gPSBbIkJhc2VTZXJ2ZXIiLCAiVENQU2VydmVyIiwgIlVEUFNlcnZlciIsCisgICAgICAgICAgICJUaHJlYWRpbmdVRFBTZXJ2ZXIiLCAiVGhyZWFkaW5nVENQU2VydmVyIiwKICAgICAgICAgICAgIkJhc2VSZXF1ZXN0SGFuZGxlciIsICJTdHJlYW1SZXF1ZXN0SGFuZGxlciIsCi0gICAgICAgICAgICJEYXRhZ3JhbVJlcXVlc3RIYW5kbGVyIiwgIlRocmVhZGluZ01peEluIiwgIkZvcmtpbmdNaXhJbiJdCisgICAgICAgICAgICJEYXRhZ3JhbVJlcXVlc3RIYW5kbGVyIiwgIlRocmVhZGluZ01peEluIl0KK2lmIGhhc2F0dHIob3MsICJmb3JrIik6CisgICAgX19hbGxfXy5leHRlbmQoWyJGb3JraW5nVURQU2VydmVyIiwiRm9ya2luZ1RDUFNlcnZlciIsICJGb3JraW5nTWl4SW4iXSkKIGlmIGhhc2F0dHIoc29ja2V0LCAiQUZfVU5JWCIpOgogICAgIF9fYWxsX18uZXh0ZW5kKFsiVW5peFN0cmVhbVNlcnZlciIsIlVuaXhEYXRhZ3JhbVNlcnZlciIsCiAgICAgICAgICAgICAgICAgICAgICJUaHJlYWRpbmdVbml4U3RyZWFtU2VydmVyIiwKQEAgLTMxMSw5ICszMTUsMTIgQEAKICAgICAgICAgaWYgc2VsZi52ZXJpZnlfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCi0gICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQogICAgICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKIApAQCAtMzY3LDEyICszNzQsMTggQEAKICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdG8gcHJpbnQgYSB0cmFjZWJhY2sgYW5kIGNvbnRpbnVlLgogCiAgICAgICAgICIiIgotICAgICAgICBwcmludCgnLScqNDApCi0gICAgICAgIHByaW50KCdFeGNlcHRpb24gaGFwcGVuZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgcmVxdWVzdCBmcm9tJywgZW5kPScgJykKLSAgICAgICAgcHJpbnQoY2xpZW50X2FkZHJlc3MpCisgICAgICAgIHByaW50KCctJyo0MCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnRXhjZXB0aW9uIGhhcHBlbmVkIGR1cmluZyBwcm9jZXNzaW5nIG9mIHJlcXVlc3QgZnJvbScsCisgICAgICAgICAgICBjbGllbnRfYWRkcmVzcywgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCi0gICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKSAjIFhYWCBCdXQgdGhpcyBnb2VzIHRvIHN0ZGVyciEKLSAgICAgICAgcHJpbnQoJy0nKjQwKQorICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgcHJpbnQoJy0nKjQwLCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5zZXJ2ZXJfY2xvc2UoKQogCiAKIGNsYXNzIFRDUFNlcnZlcihCYXNlU2VydmVyKToKQEAgLTUyNyw4NSArNTQwLDg2IEBACiAgICAgICAgICMgTm8gbmVlZCB0byBjbG9zZSBhbnl0aGluZy4KICAgICAgICAgcGFzcwogCi1jbGFzcyBGb3JraW5nTWl4SW46CitpZiBoYXNhdHRyKG9zLCAiZm9yayIpOgorICAgIGNsYXNzIEZvcmtpbmdNaXhJbjoKKyAgICAgICAgIiIiTWl4LWluIGNsYXNzIHRvIGhhbmRsZSBlYWNoIHJlcXVlc3QgaW4gYSBuZXcgcHJvY2Vzcy4iIiIKIAotICAgICIiIk1peC1pbiBjbGFzcyB0byBoYW5kbGUgZWFjaCByZXF1ZXN0IGluIGEgbmV3IHByb2Nlc3MuIiIiCisgICAgICAgIHRpbWVvdXQgPSAzMDAKKyAgICAgICAgYWN0aXZlX2NoaWxkcmVuID0gTm9uZQorICAgICAgICBtYXhfY2hpbGRyZW4gPSA0MAogCi0gICAgdGltZW91dCA9IDMwMAotICAgIGFjdGl2ZV9jaGlsZHJlbiA9IE5vbmUKLSAgICBtYXhfY2hpbGRyZW4gPSA0MAotCi0gICAgZGVmIGNvbGxlY3RfY2hpbGRyZW4oc2VsZik6Ci0gICAgICAgICIiIkludGVybmFsIHJvdXRpbmUgdG8gd2FpdCBmb3IgY2hpbGRyZW4gdGhhdCBoYXZlIGV4aXRlZC4iIiIKLSAgICAgICAgaWYgc2VsZi5hY3RpdmVfY2hpbGRyZW4gaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgICMgSWYgd2UncmUgYWJvdmUgdGhlIG1heCBudW1iZXIgb2YgY2hpbGRyZW4sIHdhaXQgYW5kIHJlYXAgdGhlbSB1bnRpbAotICAgICAgICAjIHdlIGdvIGJhY2sgYmVsb3cgdGhyZXNob2xkLiBOb3RlIHRoYXQgd2UgdXNlIHdhaXRwaWQoLTEpIGJlbG93IHRvIGJlCi0gICAgICAgICMgYWJsZSB0byBjb2xsZWN0IGNoaWxkcmVuIGluIHNpemUoPGRlZnVuY3QgY2hpbGRyZW4+KSBzeXNjYWxscyBpbnN0ZWFkCi0gICAgICAgICMgb2Ygc2l6ZSg8Y2hpbGRyZW4+KTogdGhlIGRvd25zaWRlIGlzIHRoYXQgdGhpcyBtaWdodCByZWFwIGNoaWxkcmVuCi0gICAgICAgICMgd2hpY2ggd2UgZGlkbid0IHNwYXduLCB3aGljaCBpcyB3aHkgd2Ugb25seSByZXNvcnQgdG8gdGhpcyB3aGVuIHdlJ3JlCi0gICAgICAgICMgYWJvdmUgbWF4X2NoaWxkcmVuLgotICAgICAgICB3aGlsZSBsZW4oc2VsZi5hY3RpdmVfY2hpbGRyZW4pID49IHNlbGYubWF4X2NoaWxkcmVuOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHBpZCwgXyA9IG9zLndhaXRwaWQoLTEsIDApCi0gICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uZGlzY2FyZChwaWQpCi0gICAgICAgICAgICBleGNlcHQgQ2hpbGRQcm9jZXNzRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyB3ZSBkb24ndCBoYXZlIGFueSBjaGlsZHJlbiwgd2UncmUgZG9uZQotICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmNsZWFyKCkKLSAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgICAgIyBOb3cgcmVhcCBhbGwgZGVmdW5jdCBjaGlsZHJlbi4KLSAgICAgICAgZm9yIHBpZCBpbiBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5jb3B5KCk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcGlkLCBfID0gb3Mud2FpdHBpZChwaWQsIG9zLldOT0hBTkcpCi0gICAgICAgICAgICAgICAgIyBpZiB0aGUgY2hpbGQgaGFzbid0IGV4aXRlZCB5ZXQsIHBpZCB3aWxsIGJlIDAgYW5kIGlnbm9yZWQgYnkKLSAgICAgICAgICAgICAgICAjIGRpc2NhcmQoKSBiZWxvdwotICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmRpc2NhcmQocGlkKQotICAgICAgICAgICAgZXhjZXB0IENoaWxkUHJvY2Vzc0Vycm9yOgotICAgICAgICAgICAgICAgICMgc29tZW9uZSBlbHNlIHJlYXBlZCBpdAotICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmRpc2NhcmQocGlkKQotICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV90aW1lb3V0KHNlbGYpOgotICAgICAgICAiIiJXYWl0IGZvciB6b21iaWVzIGFmdGVyIHNlbGYudGltZW91dCBzZWNvbmRzIG9mIGluYWN0aXZpdHkuCi0KLSAgICAgICAgTWF5IGJlIGV4dGVuZGVkLCBkbyBub3Qgb3ZlcnJpZGUuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQotCi0gICAgZGVmIHNlcnZpY2VfYWN0aW9ucyhzZWxmKToKLSAgICAgICAgIiIiQ29sbGVjdCB0aGUgem9tYmllIGNoaWxkIHByb2Nlc3NlcyByZWd1bGFybHkgaW4gdGhlIEZvcmtpbmdNaXhJbi4KLQotICAgICAgICBzZXJ2aWNlX2FjdGlvbnMgaXMgY2FsbGVkIGluIHRoZSBCYXNlU2VydmVyJ3Mgc2VydmVfZm9ydmVyIGxvb3AuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQotCi0gICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6Ci0gICAgICAgICIiIkZvcmsgYSBuZXcgc3VicHJvY2VzcyB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LiIiIgotICAgICAgICBwaWQgPSBvcy5mb3JrKCkKLSAgICAgICAgaWYgcGlkOgotICAgICAgICAgICAgIyBQYXJlbnQgcHJvY2VzcworICAgICAgICBkZWYgY29sbGVjdF9jaGlsZHJlbihzZWxmKToKKyAgICAgICAgICAgICIiIkludGVybmFsIHJvdXRpbmUgdG8gd2FpdCBmb3IgY2hpbGRyZW4gdGhhdCBoYXZlIGV4aXRlZC4iIiIKICAgICAgICAgICAgIGlmIHNlbGYuYWN0aXZlX2NoaWxkcmVuIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4gPSBzZXQoKQotICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uYWRkKHBpZCkKLSAgICAgICAgICAgIHNlbGYuY2xvc2VfcmVxdWVzdChyZXF1ZXN0KQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIENoaWxkIHByb2Nlc3MuCi0gICAgICAgICAgICAjIFRoaXMgbXVzdCBuZXZlciByZXR1cm4sIGhlbmNlIG9zLl9leGl0KCkhCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5maW5pc2hfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKLSAgICAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKLSAgICAgICAgICAgICAgICBvcy5fZXhpdCgwKQotICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAjIElmIHdlJ3JlIGFib3ZlIHRoZSBtYXggbnVtYmVyIG9mIGNoaWxkcmVuLCB3YWl0IGFuZCByZWFwIHRoZW0gdW50aWwKKyAgICAgICAgICAgICMgd2UgZ28gYmFjayBiZWxvdyB0aHJlc2hvbGQuIE5vdGUgdGhhdCB3ZSB1c2Ugd2FpdHBpZCgtMSkgYmVsb3cgdG8gYmUKKyAgICAgICAgICAgICMgYWJsZSB0byBjb2xsZWN0IGNoaWxkcmVuIGluIHNpemUoPGRlZnVuY3QgY2hpbGRyZW4+KSBzeXNjYWxscyBpbnN0ZWFkCisgICAgICAgICAgICAjIG9mIHNpemUoPGNoaWxkcmVuPik6IHRoZSBkb3duc2lkZSBpcyB0aGF0IHRoaXMgbWlnaHQgcmVhcCBjaGlsZHJlbgorICAgICAgICAgICAgIyB3aGljaCB3ZSBkaWRuJ3Qgc3Bhd24sIHdoaWNoIGlzIHdoeSB3ZSBvbmx5IHJlc29ydCB0byB0aGlzIHdoZW4gd2UncmUKKyAgICAgICAgICAgICMgYWJvdmUgbWF4X2NoaWxkcmVuLgorICAgICAgICAgICAgd2hpbGUgbGVuKHNlbGYuYWN0aXZlX2NoaWxkcmVuKSA+PSBzZWxmLm1heF9jaGlsZHJlbjoKICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBpZCwgXyA9IG9zLndhaXRwaWQoLTEsIDApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmRpc2NhcmQocGlkKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBDaGlsZFByb2Nlc3NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyB3ZSBkb24ndCBoYXZlIGFueSBjaGlsZHJlbiwgd2UncmUgZG9uZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5jbGVhcigpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICMgTm93IHJlYXAgYWxsIGRlZnVuY3QgY2hpbGRyZW4uCisgICAgICAgICAgICBmb3IgcGlkIGluIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmNvcHkoKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBpZCwgXyA9IG9zLndhaXRwaWQocGlkLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBjaGlsZCBoYXNuJ3QgZXhpdGVkIHlldCwgcGlkIHdpbGwgYmUgMCBhbmQgaWdub3JlZCBieQorICAgICAgICAgICAgICAgICAgICAjIGRpc2NhcmQoKSBiZWxvdworICAgICAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5kaXNjYXJkKHBpZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgQ2hpbGRQcm9jZXNzRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgc29tZW9uZSBlbHNlIHJlYXBlZCBpdAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5kaXNjYXJkKHBpZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBoYW5kbGVfdGltZW91dChzZWxmKToKKyAgICAgICAgICAgICIiIldhaXQgZm9yIHpvbWJpZXMgYWZ0ZXIgc2VsZi50aW1lb3V0IHNlY29uZHMgb2YgaW5hY3Rpdml0eS4KKworICAgICAgICAgICAgTWF5IGJlIGV4dGVuZGVkLCBkbyBub3Qgb3ZlcnJpZGUuCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHNlbGYuY29sbGVjdF9jaGlsZHJlbigpCisKKyAgICAgICAgZGVmIHNlcnZpY2VfYWN0aW9ucyhzZWxmKToKKyAgICAgICAgICAgICIiIkNvbGxlY3QgdGhlIHpvbWJpZSBjaGlsZCBwcm9jZXNzZXMgcmVndWxhcmx5IGluIHRoZSBGb3JraW5nTWl4SW4uCisKKyAgICAgICAgICAgIHNlcnZpY2VfYWN0aW9ucyBpcyBjYWxsZWQgaW4gdGhlIEJhc2VTZXJ2ZXIncyBzZXJ2ZV9mb3J2ZXIgbG9vcC4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgc2VsZi5jb2xsZWN0X2NoaWxkcmVuKCkKKworICAgICAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgICAgICIiIkZvcmsgYSBuZXcgc3VicHJvY2VzcyB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LiIiIgorICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICBpZiBwaWQ6CisgICAgICAgICAgICAgICAgIyBQYXJlbnQgcHJvY2VzcworICAgICAgICAgICAgICAgIGlmIHNlbGYuYWN0aXZlX2NoaWxkcmVuIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuID0gc2V0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5hZGQocGlkKQorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIENoaWxkIHByb2Nlc3MuCisgICAgICAgICAgICAgICAgIyBUaGlzIG11c3QgbmV2ZXIgcmV0dXJuLCBoZW5jZSBvcy5fZXhpdCgpIQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IDEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDAKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcihyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCiAgICAgICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoMSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5fZXhpdChzdGF0dXMpCiAKIAogY2xhc3MgVGhyZWFkaW5nTWl4SW46CkBAIC02MjMsOSArNjM3LDkgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuZmluaXNoX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCi0gICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKLSAgICAgICAgZXhjZXB0OgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKIAogICAgIGRlZiBwcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgpAQCAtNjM2LDggKzY1MCw5IEBACiAgICAgICAgIHQuc3RhcnQoKQogCiAKLWNsYXNzIEZvcmtpbmdVRFBTZXJ2ZXIoRm9ya2luZ01peEluLCBVRFBTZXJ2ZXIpOiBwYXNzCi1jbGFzcyBGb3JraW5nVENQU2VydmVyKEZvcmtpbmdNaXhJbiwgVENQU2VydmVyKTogcGFzcworaWYgaGFzYXR0cihvcywgImZvcmsiKToKKyAgICBjbGFzcyBGb3JraW5nVURQU2VydmVyKEZvcmtpbmdNaXhJbiwgVURQU2VydmVyKTogcGFzcworICAgIGNsYXNzIEZvcmtpbmdUQ1BTZXJ2ZXIoRm9ya2luZ01peEluLCBUQ1BTZXJ2ZXIpOiBwYXNzCiAKIGNsYXNzIFRocmVhZGluZ1VEUFNlcnZlcihUaHJlYWRpbmdNaXhJbiwgVURQU2VydmVyKTogcGFzcwogY2xhc3MgVGhyZWFkaW5nVENQU2VydmVyKFRocmVhZGluZ01peEluLCBUQ1BTZXJ2ZXIpOiBwYXNzCkBAIC03MjksNyArNzQ0LDEwIEBACiAgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uc2V0c29ja29wdChzb2NrZXQuSVBQUk9UT19UQ1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuVENQX05PREVMQVksIFRydWUpCiAgICAgICAgIHNlbGYucmZpbGUgPSBzZWxmLmNvbm5lY3Rpb24ubWFrZWZpbGUoJ3JiJywgc2VsZi5yYnVmc2l6ZSkKLSAgICAgICAgc2VsZi53ZmlsZSA9IHNlbGYuY29ubmVjdGlvbi5tYWtlZmlsZSgnd2InLCBzZWxmLndidWZzaXplKQorICAgICAgICBpZiBzZWxmLndidWZzaXplID09IDA6CisgICAgICAgICAgICBzZWxmLndmaWxlID0gX1NvY2tldFdyaXRlcihzZWxmLmNvbm5lY3Rpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndmaWxlID0gc2VsZi5jb25uZWN0aW9uLm1ha2VmaWxlKCd3YicsIHNlbGYud2J1ZnNpemUpCiAKICAgICBkZWYgZmluaXNoKHNlbGYpOgogICAgICAgICBpZiBub3Qgc2VsZi53ZmlsZS5jbG9zZWQ6CkBAIC03NDIsNiArNzYwLDI0IEBACiAgICAgICAgIHNlbGYud2ZpbGUuY2xvc2UoKQogICAgICAgICBzZWxmLnJmaWxlLmNsb3NlKCkKIAorY2xhc3MgX1NvY2tldFdyaXRlcihCdWZmZXJlZElPQmFzZSk6CisgICAgIiIiU2ltcGxlIHdyaXRhYmxlIEJ1ZmZlcmVkSU9CYXNlIGltcGxlbWVudGF0aW9uIGZvciBhIHNvY2tldAorCisgICAgRG9lcyBub3QgaG9sZCBkYXRhIGluIGEgYnVmZmVyLCBhdm9pZGluZyBhbnkgbmVlZCB0byBjYWxsIGZsdXNoKCkuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc29jayk6CisgICAgICAgIHNlbGYuX3NvY2sgPSBzb2NrCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYik6CisgICAgICAgIHNlbGYuX3NvY2suc2VuZGFsbChiKQorICAgICAgICB3aXRoIG1lbW9yeXZpZXcoYikgYXMgdmlldzoKKyAgICAgICAgICAgIHJldHVybiB2aWV3Lm5ieXRlcworCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NvY2suZmlsZW5vKCkKIAogY2xhc3MgRGF0YWdyYW1SZXF1ZXN0SGFuZGxlcihCYXNlUmVxdWVzdEhhbmRsZXIpOgogCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQppbmRleCA3ZmI4ZDdlLi5jYjg1ODE0IDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKQEAgLTE4OCw3ICsxODgsMTAgQEAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuY3ggPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBzZWxmLmN1ID0gc2VsZi5jeC5jdXJzb3IoKQotICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCwgaW5jb21lIG51bWJlcikiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoCisgICAgICAgICAgICAiY3JlYXRlIHRhYmxlIHRlc3QoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB0ZXh0LCAiCisgICAgICAgICAgICAiaW5jb21lIG51bWJlciwgdW5pcXVlX3Rlc3QgdGV4dCB1bmlxdWUpIgorICAgICAgICApCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJmb28iLCkpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CkBAIC00NjIsNiArNDY1LDQ0IEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKICAgICAgICAgICAgIGN1ciA9IHNxbGl0ZS5DdXJzb3IoZm9vKQogCisgICAgZGVmIENoZWNrTGFzdFJvd0lET25SZXBsYWNlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgSU5TRVJUIE9SIFJFUExBQ0UgYW5kIFJFUExBQ0UgSU5UTyBzaG91bGQgcHJvZHVjZSB0aGUgc2FtZSBiZWhhdmlvci4KKyAgICAgICAgIiIiCisgICAgICAgIHNxbCA9ICd7fSBJTlRPIHRlc3QoaWQsIHVuaXF1ZV90ZXN0KSBWQUxVRVMgKD8sID8pJworICAgICAgICBmb3Igc3RhdGVtZW50IGluICgnSU5TRVJUIE9SIFJFUExBQ0UnLCAnUkVQTEFDRScpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qoc3RhdGVtZW50PXN0YXRlbWVudCk6CisgICAgICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKHNxbC5mb3JtYXQoc3RhdGVtZW50KSwgKDEsICdmb28nKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3UubGFzdHJvd2lkLCAxKQorCisgICAgZGVmIENoZWNrTGFzdFJvd0lET25JZ25vcmUoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgKKyAgICAgICAgICAgICJpbnNlcnQgb3IgaWdub3JlIGludG8gdGVzdCh1bmlxdWVfdGVzdCkgdmFsdWVzICg/KSIsCisgICAgICAgICAgICAoJ3Rlc3QnLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5sYXN0cm93aWQsIDIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgKKyAgICAgICAgICAgICJpbnNlcnQgb3IgaWdub3JlIGludG8gdGVzdCh1bmlxdWVfdGVzdCkgdmFsdWVzICg/KSIsCisgICAgICAgICAgICAoJ3Rlc3QnLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5sYXN0cm93aWQsIDIpCisKKyAgICBkZWYgQ2hlY2tMYXN0Um93SURJbnNlcnRPUihzZWxmKToKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGZvciBzdGF0ZW1lbnQgaW4gKCdGQUlMJywgJ0FCT1JUJywgJ1JPTExCQUNLJyk6CisgICAgICAgICAgICBzcWwgPSAnSU5TRVJUIE9SIHt9IElOVE8gdGVzdCh1bmlxdWVfdGVzdCkgVkFMVUVTICg/KScKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHN0YXRlbWVudD0nSU5TRVJUIE9SIHt9Jy5mb3JtYXQoc3RhdGVtZW50KSk6CisgICAgICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKHNxbC5mb3JtYXQoc3RhdGVtZW50KSwgKHN0YXRlbWVudCwpKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKChzdGF0ZW1lbnQsIHNlbGYuY3UubGFzdHJvd2lkKSkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZShzcWwuZm9ybWF0KHN0YXRlbWVudCksIChzdGF0ZW1lbnQsKSkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgoc3RhdGVtZW50LCBzZWxmLmN1Lmxhc3Ryb3dpZCkpCisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgKCdGQUlMJywgMiksICgnRkFJTCcsIDIpLAorICAgICAgICAgICAgKCdBQk9SVCcsIDMpLCAoJ0FCT1JUJywgMyksCisgICAgICAgICAgICAoJ1JPTExCQUNLJywgNCksICgnUk9MTEJBQ0snLCA0KSwKKyAgICAgICAgXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMsIGV4cGVjdGVkKQorCisKIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RoaXMgdGVzdCByZXF1aXJlcyB0aHJlYWRpbmcuJykKIGNsYXNzIFRocmVhZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvc3JlX2NvbXBpbGUucHkgYi9MaWIvc3JlX2NvbXBpbGUucHkKaW5kZXggNTAyYjA2MS4uNGVkYjAzZiAxMDA2NDQKLS0tIGEvTGliL3NyZV9jb21waWxlLnB5CisrKyBiL0xpYi9zcmVfY29tcGlsZS5weQpAQCAtNDA5LDU3ICs0MDksMzkgQEAKICAgICAgICAgICAgIHRhYmxlW2ldID0gaWR4ICsgMQogICAgIHJldHVybiB0YWJsZQogCi1kZWYgX2NvbXBpbGVfaW5mbyhjb2RlLCBwYXR0ZXJuLCBmbGFncyk6Ci0gICAgIyBpbnRlcm5hbDogY29tcGlsZSBhbiBpbmZvIGJsb2NrLiAgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwKLSAgICAjIHRoaXMgY29udGFpbnMgbWluL21heCBwYXR0ZXJuIHdpZHRoLCBhbmQgYW4gb3B0aW9uYWwgbGl0ZXJhbAotICAgICMgcHJlZml4IG9yIGEgY2hhcmFjdGVyIG1hcAotICAgIGxvLCBoaSA9IHBhdHRlcm4uZ2V0d2lkdGgoKQotICAgIGlmIGhpID4gTUFYQ09ERToKLSAgICAgICAgaGkgPSBNQVhDT0RFCi0gICAgaWYgbG8gPT0gMDoKLSAgICAgICAgY29kZS5leHRlbmQoW0lORk8sIDQsIDAsIGxvLCBoaV0pCi0gICAgICAgIHJldHVybgotICAgICMgbG9vayBmb3IgYSBsaXRlcmFsIHByZWZpeAorZGVmIF9nZXRfbGl0ZXJhbF9wcmVmaXgocGF0dGVybik6CisgICAgIyBsb29rIGZvciBsaXRlcmFsIHByZWZpeAogICAgIHByZWZpeCA9IFtdCiAgICAgcHJlZml4YXBwZW5kID0gcHJlZml4LmFwcGVuZAotICAgIHByZWZpeF9za2lwID0gMAorICAgIHByZWZpeF9za2lwID0gTm9uZQorICAgIGdvdF9hbGwgPSBUcnVlCisgICAgZm9yIG9wLCBhdiBpbiBwYXR0ZXJuLmRhdGE6CisgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICBwcmVmaXhhcHBlbmQoYXYpCisgICAgICAgIGVsaWYgb3AgaXMgU1VCUEFUVEVSTjoKKyAgICAgICAgICAgIHByZWZpeDEsIHByZWZpeF9za2lwMSwgZ290X2FsbCA9IF9nZXRfbGl0ZXJhbF9wcmVmaXgoYXZbMV0pCisgICAgICAgICAgICBpZiBwcmVmaXhfc2tpcCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIGF2WzBdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXhfc2tpcCA9IGxlbihwcmVmaXgpCisgICAgICAgICAgICAgICAgZWxpZiBwcmVmaXhfc2tpcDEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHByZWZpeF9za2lwID0gbGVuKHByZWZpeCkgKyBwcmVmaXhfc2tpcDEKKyAgICAgICAgICAgIHByZWZpeC5leHRlbmQocHJlZml4MSkKKyAgICAgICAgICAgIGlmIG5vdCBnb3RfYWxsOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnb3RfYWxsID0gRmFsc2UKKyAgICAgICAgICAgIGJyZWFrCisgICAgcmV0dXJuIHByZWZpeCwgcHJlZml4X3NraXAsIGdvdF9hbGwKKworZGVmIF9nZXRfY2hhcnNldF9wcmVmaXgocGF0dGVybik6CiAgICAgY2hhcnNldCA9IFtdICMgbm90IHVzZWQKICAgICBjaGFyc2V0YXBwZW5kID0gY2hhcnNldC5hcHBlbmQKLSAgICBpZiBub3QgKGZsYWdzICYgU1JFX0ZMQUdfSUdOT1JFQ0FTRSk6Ci0gICAgICAgICMgbG9vayBmb3IgbGl0ZXJhbCBwcmVmaXgKLSAgICAgICAgZm9yIG9wLCBhdiBpbiBwYXR0ZXJuLmRhdGE6CisgICAgaWYgcGF0dGVybi5kYXRhOgorICAgICAgICBvcCwgYXYgPSBwYXR0ZXJuLmRhdGFbMF0KKyAgICAgICAgaWYgb3AgaXMgU1VCUEFUVEVSTiBhbmQgYXZbMV06CisgICAgICAgICAgICBvcCwgYXYgPSBhdlsxXVswXQogICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKLSAgICAgICAgICAgICAgICBpZiBsZW4ocHJlZml4KSA9PSBwcmVmaXhfc2tpcDoKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4X3NraXAgPSBwcmVmaXhfc2tpcCArIDEKLSAgICAgICAgICAgICAgICBwcmVmaXhhcHBlbmQoYXYpCi0gICAgICAgICAgICBlbGlmIG9wIGlzIFNVQlBBVFRFUk4gYW5kIGxlbihhdlsxXSkgPT0gMToKLSAgICAgICAgICAgICAgICBvcCwgYXYgPSBhdlsxXVswXQotICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeGFwcGVuZChhdikKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAjIGlmIG5vIHByZWZpeCwgbG9vayBmb3IgY2hhcnNldCBwcmVmaXgKLSAgICAgICAgaWYgbm90IHByZWZpeCBhbmQgcGF0dGVybi5kYXRhOgotICAgICAgICAgICAgb3AsIGF2ID0gcGF0dGVybi5kYXRhWzBdCi0gICAgICAgICAgICBpZiBvcCBpcyBTVUJQQVRURVJOIGFuZCBhdlsxXToKLSAgICAgICAgICAgICAgICBvcCwgYXYgPSBhdlsxXVswXQotICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzZXRhcHBlbmQoKG9wLCBhdikpCi0gICAgICAgICAgICAgICAgZWxpZiBvcCBpcyBCUkFOQ0g6Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBbXQotICAgICAgICAgICAgICAgICAgICBjYXBwZW5kID0gYy5hcHBlbmQKLSAgICAgICAgICAgICAgICAgICAgZm9yIHAgaW4gYXZbMV06Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICAgICAgb3AsIGF2ID0gcFswXQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBwZW5kKChvcCwgYXYpKQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IGMKKyAgICAgICAgICAgICAgICBjaGFyc2V0YXBwZW5kKChvcCwgYXYpKQogICAgICAgICAgICAgZWxpZiBvcCBpcyBCUkFOQ0g6CiAgICAgICAgICAgICAgICAgYyA9IFtdCiAgICAgICAgICAgICAgICAgY2FwcGVuZCA9IGMuYXBwZW5kCkBAIC00NzMsOCArNDU1LDQzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjCi0gICAgICAgICAgICBlbGlmIG9wIGlzIElOOgotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBhdgorICAgICAgICBlbGlmIG9wIGlzIEJSQU5DSDoKKyAgICAgICAgICAgIGMgPSBbXQorICAgICAgICAgICAgY2FwcGVuZCA9IGMuYXBwZW5kCisgICAgICAgICAgICBmb3IgcCBpbiBhdlsxXToKKyAgICAgICAgICAgICAgICBpZiBub3QgcDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBvcCwgYXYgPSBwWzBdCisgICAgICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKKyAgICAgICAgICAgICAgICAgICAgY2FwcGVuZCgob3AsIGF2KSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjaGFyc2V0ID0gYworICAgICAgICBlbGlmIG9wIGlzIElOOgorICAgICAgICAgICAgY2hhcnNldCA9IGF2CisgICAgcmV0dXJuIGNoYXJzZXQKKworZGVmIF9jb21waWxlX2luZm8oY29kZSwgcGF0dGVybiwgZmxhZ3MpOgorICAgICMgaW50ZXJuYWw6IGNvbXBpbGUgYW4gaW5mbyBibG9jay4gIGluIHRoZSBjdXJyZW50IHZlcnNpb24sCisgICAgIyB0aGlzIGNvbnRhaW5zIG1pbi9tYXggcGF0dGVybiB3aWR0aCwgYW5kIGFuIG9wdGlvbmFsIGxpdGVyYWwKKyAgICAjIHByZWZpeCBvciBhIGNoYXJhY3RlciBtYXAKKyAgICBsbywgaGkgPSBwYXR0ZXJuLmdldHdpZHRoKCkKKyAgICBpZiBoaSA+IE1BWENPREU6CisgICAgICAgIGhpID0gTUFYQ09ERQorICAgIGlmIGxvID09IDA6CisgICAgICAgIGNvZGUuZXh0ZW5kKFtJTkZPLCA0LCAwLCBsbywgaGldKQorICAgICAgICByZXR1cm4KKyAgICAjIGxvb2sgZm9yIGEgbGl0ZXJhbCBwcmVmaXgKKyAgICBwcmVmaXggPSBbXQorICAgIHByZWZpeF9za2lwID0gMAorICAgIGNoYXJzZXQgPSBbXSAjIG5vdCB1c2VkCisgICAgaWYgbm90IChmbGFncyAmIFNSRV9GTEFHX0lHTk9SRUNBU0UpOgorICAgICAgICAjIGxvb2sgZm9yIGxpdGVyYWwgcHJlZml4CisgICAgICAgIHByZWZpeCwgcHJlZml4X3NraXAsIGdvdF9hbGwgPSBfZ2V0X2xpdGVyYWxfcHJlZml4KHBhdHRlcm4pCisgICAgICAgICMgaWYgbm8gcHJlZml4LCBsb29rIGZvciBjaGFyc2V0IHByZWZpeAorICAgICAgICBpZiBub3QgcHJlZml4OgorICAgICAgICAgICAgY2hhcnNldCA9IF9nZXRfY2hhcnNldF9wcmVmaXgocGF0dGVybikKICMjICAgICBpZiBwcmVmaXg6CiAjIyAgICAgICAgIHByaW50KCIqKiogUFJFRklYIiwgcHJlZml4LCBwcmVmaXhfc2tpcCkKICMjICAgICBpZiBjaGFyc2V0OgpAQCAtNDg3LDcgKzUwNCw3IEBACiAgICAgbWFzayA9IDAKICAgICBpZiBwcmVmaXg6CiAgICAgICAgIG1hc2sgPSBTUkVfSU5GT19QUkVGSVgKLSAgICAgICAgaWYgbGVuKHByZWZpeCkgPT0gcHJlZml4X3NraXAgPT0gbGVuKHBhdHRlcm4uZGF0YSk6CisgICAgICAgIGlmIHByZWZpeF9za2lwIGlzIE5vbmUgYW5kIGdvdF9hbGw6CiAgICAgICAgICAgICBtYXNrID0gbWFzayB8IFNSRV9JTkZPX0xJVEVSQUwKICAgICBlbGlmIGNoYXJzZXQ6CiAgICAgICAgIG1hc2sgPSBtYXNrIHwgU1JFX0lORk9fQ0hBUlNFVApAQCAtNTAyLDYgKzUxOSw4IEBACiAgICAgIyBhZGQgbGl0ZXJhbCBwcmVmaXgKICAgICBpZiBwcmVmaXg6CiAgICAgICAgIGVtaXQobGVuKHByZWZpeCkpICMgbGVuZ3RoCisgICAgICAgIGlmIHByZWZpeF9za2lwIGlzIE5vbmU6CisgICAgICAgICAgICBwcmVmaXhfc2tpcCA9ICBsZW4ocHJlZml4KQogICAgICAgICBlbWl0KHByZWZpeF9za2lwKSAjIHNraXAKICAgICAgICAgY29kZS5leHRlbmQocHJlZml4KQogICAgICAgICAjIGdlbmVyYXRlIG92ZXJsYXAgdGFibGUKZGlmZiAtLWdpdCBhL0xpYi9zcmVfcGFyc2UucHkgYi9MaWIvc3JlX3BhcnNlLnB5CmluZGV4IDRmZjUwZDEuLjUyMWUzNzkgMTAwNjQ0Ci0tLSBhL0xpYi9zcmVfcGFyc2UucHkKKysrIGIvTGliL3NyZV9wYXJzZS5weQpAQCAtMjgyLDMzICsyODIsNiBAQAogICAgIGRlZiBlcnJvcihzZWxmLCBtc2csIG9mZnNldD0wKToKICAgICAgICAgcmV0dXJuIGVycm9yKG1zZywgc2VsZi5zdHJpbmcsIHNlbGYudGVsbCgpIC0gb2Zmc2V0KQogCi0jIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGFyZSBub3QgdXNlZCBpbiB0aGlzIG1vZHVsZSBhbnltb3JlLCBidXQgd2Uga2VlcAotIyB0aGVtIGhlcmUgKHdpdGggRGVwcmVjYXRpb25XYXJuaW5ncykgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgotCi1kZWYgaXNpZGVudChjaGFyKToKLSAgICBpbXBvcnQgd2FybmluZ3MKLSAgICB3YXJuaW5ncy53YXJuKCdzcmVfcGFyc2UuaXNpZGVudCgpIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjUnLAotICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgcmV0dXJuICJhIiA8PSBjaGFyIDw9ICJ6IiBvciAiQSIgPD0gY2hhciA8PSAiWiIgb3IgY2hhciA9PSAiXyIKLQotZGVmIGlzZGlnaXQoY2hhcik6Ci0gICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgd2FybmluZ3Mud2Fybignc3JlX3BhcnNlLmlzZGlnaXQoKSB3aWxsIGJlIHJlbW92ZWQgaW4gMy41JywKLSAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotICAgIHJldHVybiAiMCIgPD0gY2hhciA8PSAiOSIKLQotZGVmIGlzbmFtZShuYW1lKToKLSAgICBpbXBvcnQgd2FybmluZ3MKLSAgICB3YXJuaW5ncy53YXJuKCdzcmVfcGFyc2UuaXNuYW1lKCkgd2lsbCBiZSByZW1vdmVkIGluIDMuNScsCi0gICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLSAgICAjIGNoZWNrIHRoYXQgZ3JvdXAgbmFtZSBpcyBhIHZhbGlkIHN0cmluZwotICAgIGlmIG5vdCBpc2lkZW50KG5hbWVbMF0pOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICBmb3IgY2hhciBpbiBuYW1lWzE6XToKLSAgICAgICAgaWYgbm90IGlzaWRlbnQoY2hhcikgYW5kIG5vdCBpc2RpZ2l0KGNoYXIpOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIFRydWUKLQogZGVmIF9jbGFzc19lc2NhcGUoc291cmNlLCBlc2NhcGUpOgogICAgICMgaGFuZGxlIGVzY2FwZSBjb2RlIGluc2lkZSBjaGFyYWN0ZXIgY2xhc3MKICAgICBjb2RlID0gRVNDQVBFUy5nZXQoZXNjYXBlKQpAQCAtMzUxLDkgKzMyNCw3IEBACiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgIGlmIGxlbihlc2NhcGUpID09IDI6CiAgICAgICAgICAgICBpZiBjIGluIEFTQ0lJTEVUVEVSUzoKLSAgICAgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdiYWQgZXNjYXBlICVzJyAlIGVzY2FwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD04KQorICAgICAgICAgICAgICAgIHJhaXNlIHNvdXJjZS5lcnJvcignYmFkIGVzY2FwZSAlcycgJSBlc2NhcGUsIGxlbihlc2NhcGUpKQogICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIG9yZChlc2NhcGVbMV0pCiAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgIHBhc3MKQEAgLTQxOCw5ICszODksNyBAQAogICAgICAgICAgICAgcmFpc2Ugc291cmNlLmVycm9yKCJpbnZhbGlkIGdyb3VwIHJlZmVyZW5jZSIsIGxlbihlc2NhcGUpKQogICAgICAgICBpZiBsZW4oZXNjYXBlKSA9PSAyOgogICAgICAgICAgICAgaWYgYyBpbiBBU0NJSUxFVFRFUlM6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybignYmFkIGVzY2FwZSAlcycgJSBlc2NhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9OCkKKyAgICAgICAgICAgICAgICByYWlzZSBzb3VyY2UuZXJyb3IoImJhZCBlc2NhcGUgJXMiICUgZXNjYXBlLCBsZW4oZXNjYXBlKSkKICAgICAgICAgICAgIHJldHVybiBMSVRFUkFMLCBvcmQoZXNjYXBlWzFdKQogICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICBwYXNzCkBAIC03OTgsMTAgKzc2Nyw3IEBACiAgICAgIyBDaGVjayBhbmQgZml4IGZsYWdzIGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiBwYXR0ZXJuIChzdHIgb3IgYnl0ZXMpCiAgICAgaWYgaXNpbnN0YW5jZShzcmMsIHN0cik6CiAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfTE9DQUxFOgotICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJMT0NBTEUgZmxhZyB3aXRoIGEgc3RyIHBhdHRlcm4gaXMgZGVwcmVjYXRlZC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiV2lsbCBiZSBhbiBlcnJvciBpbiAzLjYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9NikKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCB1c2UgTE9DQUxFIGZsYWcgd2l0aCBhIHN0ciBwYXR0ZXJuIikKICAgICAgICAgaWYgbm90IGZsYWdzICYgU1JFX0ZMQUdfQVNDSUk6CiAgICAgICAgICAgICBmbGFncyB8PSBTUkVfRkxBR19VTklDT0RFCiAgICAgICAgIGVsaWYgZmxhZ3MgJiBTUkVfRkxBR19VTklDT0RFOgpAQCAtODEwLDEwICs3NzYsNyBAQAogICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX1VOSUNPREU6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgdXNlIFVOSUNPREUgZmxhZyB3aXRoIGEgYnl0ZXMgcGF0dGVybiIpCiAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfTE9DQUxFIGFuZCBmbGFncyAmIFNSRV9GTEFHX0FTQ0lJOgotICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJBU0NJSSBhbmQgTE9DQUxFIGZsYWdzIGFyZSBpbmNvbXBhdGlibGUuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIldpbGwgYmUgYW4gZXJyb3IgaW4gMy42IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTYpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBU0NJSSBhbmQgTE9DQUxFIGZsYWdzIGFyZSBpbmNvbXBhdGlibGUiKQogICAgIHJldHVybiBmbGFncwogCiBkZWYgcGFyc2Uoc3RyLCBmbGFncz0wLCBwYXR0ZXJuPU5vbmUpOgpAQCAtOTE0LDkgKzg3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHRoaXMgPSBjaHIoRVNDQVBFU1t0aGlzXVsxXSkKICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIGlmIGMgaW4gQVNDSUlMRVRURVJTOgotICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdiYWQgZXNjYXBlICVzJyAlIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD00KQorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugcy5lcnJvcignYmFkIGVzY2FwZSAlcycgJSB0aGlzLCBsZW4odGhpcykpCiAgICAgICAgICAgICAgICAgbGFwcGVuZCh0aGlzKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgbGFwcGVuZCh0aGlzKQpkaWZmIC0tZ2l0IGEvTGliL3NzbC5weSBiL0xpYi9zc2wucHkKaW5kZXggZTE5MTM5MC4uNDJjYTE2OCAxMDA2NDQKLS0tIGEvTGliL3NzbC5weQorKysgYi9MaWIvc3NsLnB5CkBAIC04OTgsNyArODk4LDYgQEAKICAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IGFtb3VudCk6CiAgICAgICAgICAgICAgICAgdiA9IHNlbGYuc2VuZChkYXRhW2NvdW50Ol0pCiAgICAgICAgICAgICAgICAgY291bnQgKz0gdgotICAgICAgICAgICAgcmV0dXJuIGFtb3VudAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5zZW5kYWxsKHNlbGYsIGRhdGEsIGZsYWdzKQogCmRpZmYgLS1naXQgYS9MaWIvc3RhdGlzdGljcy5weSBiL0xpYi9zdGF0aXN0aWNzLnB5CmluZGV4IDRmNWMxYzEuLjdkNTNlMGMgMTAwNjQ0Ci0tLSBhL0xpYi9zdGF0aXN0aWNzLnB5CisrKyBiL0xpYi9zdGF0aXN0aWNzLnB5CkBAIC0xLDIwICsxLDMgQEAKLSMjICBNb2R1bGUgc3RhdGlzdGljcy5weQotIyMKLSMjICBDb3B5cmlnaHQgKGMpIDIwMTMgU3RldmVuIEQnQXByYW5vIDxzdGV2ZStweXRob25AcGVhcndvb2QuaW5mbz4uCi0jIwotIyMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMjICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMjCi0jIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIwotIyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMjICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMjICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCiAiIiIKIEJhc2ljIHN0YXRpc3RpY3MgbW9kdWxlLgogCkBAIC0yOCw2ICsxMSw4IEBACiBGdW5jdGlvbiAgICAgICAgICAgIERlc2NyaXB0aW9uCiA9PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogbWVhbiAgICAgICAgICAgICAgICBBcml0aG1ldGljIG1lYW4gKGF2ZXJhZ2UpIG9mIGRhdGEuCitnZW9tZXRyaWNfbWVhbiAgICAgIEdlb21ldHJpYyBtZWFuIG9mIGRhdGEuCitoYXJtb25pY19tZWFuICAgICAgIEhhcm1vbmljIG1lYW4gb2YgZGF0YS4KIG1lZGlhbiAgICAgICAgICAgICAgTWVkaWFuIChtaWRkbGUgdmFsdWUpIG9mIGRhdGEuCiBtZWRpYW5fbG93ICAgICAgICAgIExvdyBtZWRpYW4gb2YgZGF0YS4KIG1lZGlhbl9oaWdoICAgICAgICAgSGlnaCBtZWRpYW4gb2YgZGF0YS4KQEAgLTk1LDE2ICs4MCwxOCBAQAogX19hbGxfXyA9IFsgJ1N0YXRpc3RpY3NFcnJvcicsCiAgICAgICAgICAgICAncHN0ZGV2JywgJ3B2YXJpYW5jZScsICdzdGRldicsICd2YXJpYW5jZScsCiAgICAgICAgICAgICAnbWVkaWFuJywgICdtZWRpYW5fbG93JywgJ21lZGlhbl9oaWdoJywgJ21lZGlhbl9ncm91cGVkJywKLSAgICAgICAgICAgICdtZWFuJywgJ21vZGUnLAorICAgICAgICAgICAgJ21lYW4nLCAnbW9kZScsICdnZW9tZXRyaWNfbWVhbicsICdoYXJtb25pY19tZWFuJywKICAgICAgICAgICBdCiAKLQogaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgZGVjaW1hbAogaW1wb3J0IG1hdGgKK2ltcG9ydCBudW1iZXJzCiAKIGZyb20gZnJhY3Rpb25zIGltcG9ydCBGcmFjdGlvbgogZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCi1mcm9tIGl0ZXJ0b29scyBpbXBvcnQgZ3JvdXBieQorZnJvbSBpdGVydG9vbHMgaW1wb3J0IGdyb3VwYnksIGNoYWluCitmcm9tIGJpc2VjdCBpbXBvcnQgYmlzZWN0X2xlZnQsIGJpc2VjdF9yaWdodAogCiAKIApAQCAtMTM0LDcgKzEyMSw4IEBACiAKICAgICBTb21lIHNvdXJjZXMgb2Ygcm91bmQtb2ZmIGVycm9yIHdpbGwgYmUgYXZvaWRlZDoKIAotICAgID4+PiBfc3VtKFsxZTUwLCAxLCAtMWU1MF0gKiAxMDAwKSAgIyBCdWlsdC1pbiBzdW0gcmV0dXJucyB6ZXJvLgorICAgICMgQnVpbHQtaW4gc3VtIHJldHVybnMgemVyby4KKyAgICA+Pj4gX3N1bShbMWU1MCwgMSwgLTFlNTBdICogMTAwMCkKICAgICAoPGNsYXNzICdmbG9hdCc+LCBGcmFjdGlvbigxMDAwLCAxKSwgMzAwMCkKIAogICAgIEZyYWN0aW9ucyBhbmQgRGVjaW1hbHMgYXJlIGFsc28gc3VwcG9ydGVkOgpAQCAtMjIzLDU2ICsyMTEsMjYgQEAKICAgICAgICAgIyBPcHRpbWlzZSB0aGUgY29tbW9uIGNhc2Ugb2YgZmxvYXRzLiBXZSBleHBlY3QgdGhhdCB0aGUgbW9zdCBvZnRlbgogICAgICAgICAjIHVzZWQgbnVtZXJpYyB0eXBlIHdpbGwgYmUgYnVpbHRpbiBmbG9hdHMsIHNvIHRyeSB0byBtYWtlIHRoaXMgYXMKICAgICAgICAgIyBmYXN0IGFzIHBvc3NpYmxlLgotICAgICAgICBpZiB0eXBlKHgpIGlzIGZsb2F0OgorICAgICAgICBpZiB0eXBlKHgpIGlzIGZsb2F0IG9yIHR5cGUoeCkgaXMgRGVjaW1hbDoKICAgICAgICAgICAgIHJldHVybiB4LmFzX2ludGVnZXJfcmF0aW8oKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICAjIHggbWF5IGJlIGFuIGludCwgRnJhY3Rpb24sIG9yIEludGVncmFsIEFCQy4KICAgICAgICAgICAgIHJldHVybiAoeC5udW1lcmF0b3IsIHguZGVub21pbmF0b3IpCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAjIHggbWF5IGJlIGEgZmxvYXQgc3ViY2xhc3MuCisgICAgICAgICAgICAgICAgIyB4IG1heSBiZSBhIGZsb2F0IG9yIERlY2ltYWwgc3ViY2xhc3MuCiAgICAgICAgICAgICAgICAgcmV0dXJuIHguYXNfaW50ZWdlcl9yYXRpbygpCiAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAjIHggbWF5IGJlIGEgRGVjaW1hbC4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWNpbWFsX3RvX3JhdGlvKHgpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICAjIEp1c3QgZ2l2ZSB1cD8KLSAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICMgSnVzdCBnaXZlIHVwPworICAgICAgICAgICAgICAgIHBhc3MKICAgICBleGNlcHQgKE92ZXJmbG93RXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAjIGZsb2F0IE5BTiBvciBJTkYuCi0gICAgICAgIGFzc2VydCBub3QgbWF0aC5pc2Zpbml0ZSh4KQorICAgICAgICBhc3NlcnQgbm90IF9pc2Zpbml0ZSh4KQogICAgICAgICByZXR1cm4gKHgsIE5vbmUpCiAgICAgbXNnID0gImNhbid0IGNvbnZlcnQgdHlwZSAne30nIHRvIG51bWVyYXRvci9kZW5vbWluYXRvciIKICAgICByYWlzZSBUeXBlRXJyb3IobXNnLmZvcm1hdCh0eXBlKHgpLl9fbmFtZV9fKSkKIAogCi0jIEZJWE1FIFRoaXMgaXMgZmFzdGVyIHRoYW4gRnJhY3Rpb24uZnJvbV9kZWNpbWFsLCBidXQgc3RpbGwgdG9vIHNsb3cuCi1kZWYgX2RlY2ltYWxfdG9fcmF0aW8oZCk6Ci0gICAgIiIiQ29udmVydCBEZWNpbWFsIGQgdG8gZXhhY3QgaW50ZWdlciByYXRpbyAobnVtZXJhdG9yLCBkZW5vbWluYXRvcikuCi0KLSAgICA+Pj4gZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCi0gICAgPj4+IF9kZWNpbWFsX3RvX3JhdGlvKERlY2ltYWwoIjIuNiIpKQotICAgICgyNiwgMTApCi0KLSAgICAiIiIKLSAgICBzaWduLCBkaWdpdHMsIGV4cCA9IGQuYXNfdHVwbGUoKQotICAgIGlmIGV4cCBpbiAoJ0YnLCAnbicsICdOJyk6ICAjIElORiwgTkFOLCBzTkFOCi0gICAgICAgIGFzc2VydCBub3QgZC5pc19maW5pdGUoKQotICAgICAgICByZXR1cm4gKGQsIE5vbmUpCi0gICAgbnVtID0gMAotICAgIGZvciBkaWdpdCBpbiBkaWdpdHM6Ci0gICAgICAgIG51bSA9IG51bSoxMCArIGRpZ2l0Ci0gICAgaWYgZXhwIDwgMDoKLSAgICAgICAgZGVuID0gMTAqKi1leHAKLSAgICBlbHNlOgotICAgICAgICBudW0gKj0gMTAqKmV4cAotICAgICAgICBkZW4gPSAxCi0gICAgaWYgc2lnbjoKLSAgICAgICAgbnVtID0gLW51bQotICAgIHJldHVybiAobnVtLCBkZW4pCi0KLQogZGVmIF9jb252ZXJ0KHZhbHVlLCBUKToKICAgICAiIiJDb252ZXJ0IHZhbHVlIHRvIGdpdmVuIG51bWVyaWMgdHlwZSBULiIiIgogICAgIGlmIHR5cGUodmFsdWUpIGlzIFQ6CkBAIC0zMDUsNiArMjYzLDI1MyBAQAogICAgIHJldHVybiB0YWJsZQogCiAKK2RlZiBfZmluZF9sdGVxKGEsIHgpOgorICAgICdMb2NhdGUgdGhlIGxlZnRtb3N0IHZhbHVlIGV4YWN0bHkgZXF1YWwgdG8geCcKKyAgICBpID0gYmlzZWN0X2xlZnQoYSwgeCkKKyAgICBpZiBpICE9IGxlbihhKSBhbmQgYVtpXSA9PSB4OgorICAgICAgICByZXR1cm4gaQorICAgIHJhaXNlIFZhbHVlRXJyb3IKKworCitkZWYgX2ZpbmRfcnRlcShhLCBsLCB4KToKKyAgICAnTG9jYXRlIHRoZSByaWdodG1vc3QgdmFsdWUgZXhhY3RseSBlcXVhbCB0byB4JworICAgIGkgPSBiaXNlY3RfcmlnaHQoYSwgeCwgbG89bCkKKyAgICBpZiBpICE9IChsZW4oYSkrMSkgYW5kIGFbaS0xXSA9PSB4OgorICAgICAgICByZXR1cm4gaS0xCisgICAgcmFpc2UgVmFsdWVFcnJvcgorCisKK2RlZiBfZmFpbF9uZWcodmFsdWVzLCBlcnJtc2c9J25lZ2F0aXZlIHZhbHVlJyk6CisgICAgIiIiSXRlcmF0ZSBvdmVyIHZhbHVlcywgZmFpbGluZyBpZiBhbnkgYXJlIGxlc3MgdGhhbiB6ZXJvLiIiIgorICAgIGZvciB4IGluIHZhbHVlczoKKyAgICAgICAgaWYgeCA8IDA6CisgICAgICAgICAgICByYWlzZSBTdGF0aXN0aWNzRXJyb3IoZXJybXNnKQorICAgICAgICB5aWVsZCB4CisKKworY2xhc3MgX25yb290X05TOgorICAgICIiIkhhbmRzIG9mZiEgRG9uJ3QgdG91Y2ghCisKKyAgICBFdmVyeXRoaW5nIGluc2lkZSB0aGlzIG5hbWVzcGFjZSAoY2xhc3MpIGlzIGFuIGV2ZW4tbW9yZS1wcml2YXRlCisgICAgaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZSBwcml2YXRlIF9udGhfcm9vdCBmdW5jdGlvbi4KKyAgICAiIiIKKyAgICAjIFRoaXMgY2xhc3MgZXhpc3RzIG9ubHkgdG8gYmUgdXNlZCBhcyBhIG5hbWVzcGFjZSwgZm9yIGNvbnZlbmllbmNlCisgICAgIyBvZiBiZWluZyBhYmxlIHRvIGtlZXAgdGhlIHJlbGF0ZWQgZnVuY3Rpb25zIHRvZ2V0aGVyLCBhbmQgdG8KKyAgICAjIGNvbGxhcHNlIHRoZSBncm91cCBpbiBhbiBlZGl0b3IuIElmIHRoaXMgd2VyZSBDIyBvciBDKyssIEkgd291bGQKKyAgICAjIHVzZSBhIE5hbWVzcGFjZSwgYnV0IHRoZSBjbG9zZXN0IFB5dGhvbiBoYXMgaXMgYSBjbGFzcy4KKyAgICAjCisgICAgIyBGSVhNRSBwb3NzaWJseSBtb3ZlIHRoaXMgb3V0IGludG8gYSBzZXBhcmF0ZSBtb2R1bGU/CisgICAgIyBUaGF0IGZlZWxzIGxpa2Ugb3ZlcmtpbGwsIGFuZCBtYXkgZW5jb3VyYWdlIHBlb3BsZSB0byB0cmVhdCBpdCBhcworICAgICMgYSBwdWJsaWMgZmVhdHVyZS4KKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbmFtZXNwYWNlIG9ubHksIGRvIG5vdCBpbnN0YW50aWF0ZScpCisKKyAgICBkZWYgbnRoX3Jvb3QoeCwgbik6CisgICAgICAgICIiIlJldHVybiB0aGUgcG9zaXRpdmUgbnRoIHJvb3Qgb2YgbnVtZXJpYyB4LgorCisgICAgICAgIFRoaXMgbWF5IGJlIG1vcmUgYWNjdXJhdGUgdGhhbiAqKiBvciBwb3coKToKKworICAgICAgICA+Pj4gbWF0aC5wb3coMTAwMCwgMS4wLzMpICAjZG9jdGVzdDorU0tJUAorICAgICAgICA5Ljk5OTk5OTk5OTk5OTk5OAorCisgICAgICAgID4+PiBfbnRoX3Jvb3QoMTAwMCwgMykKKyAgICAgICAgMTAuMAorICAgICAgICA+Pj4gX250aF9yb290KDExKio1LCA1KQorICAgICAgICAxMS4wCisgICAgICAgID4+PiBfbnRoX3Jvb3QoMiwgMTIpCisgICAgICAgIDEuMDU5NDYzMDk0MzU5Mjk1MworCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuLCBpbnQpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdkZWdyZWUgbiBtdXN0IGJlIGFuIGludCcpCisgICAgICAgIGlmIG4gPCAyOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZGVncmVlIG4gbXVzdCBiZSAyIG9yIG1vcmUnKQorICAgICAgICBpZiBpc2luc3RhbmNlKHgsIGRlY2ltYWwuRGVjaW1hbCk6CisgICAgICAgICAgICByZXR1cm4gX25yb290X05TLmRlY2ltYWxfbnJvb3QoeCwgbikKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHgsIG51bWJlcnMuUmVhbCk6CisgICAgICAgICAgICByZXR1cm4gX25yb290X05TLmZsb2F0X25yb290KHgsIG4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4cGVjdGVkIGEgbnVtYmVyLCBnb3QgJXMnKSAlIHR5cGUoeCkuX19uYW1lX18KKworICAgIGRlZiBmbG9hdF9ucm9vdCh4LCBuKToKKyAgICAgICAgIiIiSGFuZGxlIG50aCByb290IG9mIFJlYWxzLCB0cmVhdGVkIGFzIGEgZmxvYXQuIiIiCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG4sIGludCkgYW5kIG4gPiAxCisgICAgICAgIGlmIHggPCAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZG9tYWluIGVycm9yOiByb290IG9mIG5lZ2F0aXZlIG51bWJlcicpCisgICAgICAgIGVsaWYgeCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIG1hdGguY29weXNpZ24oMC4wLCB4KQorICAgICAgICBlbGlmIHggPiAwOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlzaW5maW5pdHkgPSBtYXRoLmlzaW5mKHgpCisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX25yb290X05TLmJpZ251bV9ucm9vdCh4LCBuKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBpc2luZmluaXR5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQoJ2luZicpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ucm9vdF9OUy5ucm9vdCh4LCBuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IG1hdGguaXNuYW4oeCkKKyAgICAgICAgICAgIHJldHVybiBmbG9hdCgnbmFuJykKKworICAgIGRlZiBucm9vdCh4LCBuKToKKyAgICAgICAgIiIiQ2FsY3VsYXRlIHgqKigxL24pLCB0aGVuIGltcHJvdmUgdGhlIGFuc3dlci4iIiIKKyAgICAgICAgIyBUaGlzIHVzZXMgbWF0aC5wb3coKSB0byBjYWxjdWxhdGUgYW4gaW5pdGlhbCBndWVzcyBmb3IgdGhlIHJvb3QsCisgICAgICAgICMgdGhlbiB1c2VzIHRoZSBpdGVyYXRlZCBucm9vdCBhbGdvcml0aG0gdG8gaW1wcm92ZSBpdC4KKyAgICAgICAgIworICAgICAgICAjIEJ5IG15IHRlc3RpbmcsIGFib3V0IDglIG9mIHRoZSB0aW1lIHRoZSBpdGVyYXRlZCBhbGdvcml0aG0gZW5kcworICAgICAgICAjIHVwIGNvbnZlcmdpbmcgdG8gYSByZXN1bHQgd2hpY2ggaXMgbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBpbml0aWFsCisgICAgICAgICMgZ3Vlc3MuIFtGSVhNRTogaXMgdGhpcyBzdGlsbCB0cnVlP10gSW4gdGhhdCBjYXNlLCB3ZSB1c2UgdGhlCisgICAgICAgICMgZ3Vlc3MgaW5zdGVhZCBvZiB0aGUgImltcHJvdmVkIiB2YWx1ZS4gVGhpcyB3YXksIHdlJ3JlIG5ldmVyCisgICAgICAgICMgbGVzcyBhY2N1cmF0ZSB0aGFuIG1hdGgucG93KCkuCisgICAgICAgIHIxID0gbWF0aC5wb3coeCwgMS4wL24pCisgICAgICAgIGVwczEgPSBhYnMocjEqKm4gLSB4KQorICAgICAgICBpZiBlcHMxID09IDAuMDoKKyAgICAgICAgICAgICMgcjEgaXMgdGhlIGV4YWN0IHJvb3QsIHNvIHdlJ3JlIGRvbmUuIEJ5IG15IHRlc3RpbmcsIHRoaXMKKyAgICAgICAgICAgICMgb2NjdXJzIGFib3V0IDgwJSBvZiB0aGUgdGltZSBmb3IgeCA8IDEgYW5kIDMwJSBvZiB0aGUKKyAgICAgICAgICAgICMgdGltZSBmb3IgeCA+IDEuCisgICAgICAgICAgICByZXR1cm4gcjEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByMiA9IF9ucm9vdF9OUy5pdGVyYXRlZF9ucm9vdCh4LCBuLCByMSkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIHIxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVwczIgPSBhYnMocjIqKm4gLSB4KQorICAgICAgICAgICAgICAgIGlmIGVwczEgPCBlcHMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjEKKyAgICAgICAgICAgICAgICByZXR1cm4gcjIKKworICAgIGRlZiBpdGVyYXRlZF9ucm9vdChhLCBuLCBnKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudGggcm9vdCBvZiBhLCBzdGFydGluZyB3aXRoIGd1ZXNzIGcuCisKKyAgICAgICAgVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiBOZXd0b24ncyBNZXRob2QuCisgICAgICAgIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL050aF9yb290X2FsZ29yaXRobQorICAgICAgICAiIiIKKyAgICAgICAgbnAgPSBuIC0gMQorICAgICAgICBkZWYgaXRlcmF0ZShyKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gKG5wKnIgKyBhL21hdGgucG93KHIsIG5wKSkvbgorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgIyBJZiByIGlzIGxhcmdlIGVub3VnaCwgcioqbnAgbWF5IG92ZXJmbG93LiBJZiB0aGF0CisgICAgICAgICAgICAgICAgIyBoYXBwZW5zLCByKiotbnAgd2lsbCBiZSBzbWFsbCwgYnV0IG5vdCBuZWNlc3NhcmlseSB6ZXJvLgorICAgICAgICAgICAgICAgIHJldHVybiAobnAqciArIGEqbWF0aC5wb3cociwgLW5wKSkvbgorICAgICAgICAjIFdpdGggYSBnb29kIGd1ZXNzLCBzdWNoIGFzIGcgPSBhKiooMS9uKSwgdGhpcyB3aWxsIGNvbnZlcmdlIGluCisgICAgICAgICMgb25seSBhIGZldyBpdGVyYXRpb25zLiBIb3dldmVyIGEgcG9vciBndWVzcyBjYW4gdGFrZSB0aG91c2FuZHMKKyAgICAgICAgIyBvZiBpdGVyYXRpb25zIHRvIGNvbnZlcmdlLCBpZiBhdCBhbGwuIFdlIGd1YXJkIGFnYWluc3QgcG9vcgorICAgICAgICAjIGd1ZXNzZXMgYnkgc2V0dGluZyBhbiB1cHBlciBsaW1pdCB0byB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuCisgICAgICAgIHIxID0gZworICAgICAgICByMiA9IGl0ZXJhdGUoZykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICBpZiByMSA9PSByMjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyBVc2UgRmxveWQncyBjeWNsZS1maW5kaW5nIGFsZ29yaXRobSB0byBhdm9pZCBiZWluZyB0cmFwcGVkCisgICAgICAgICAgICAjIGluIGEgY3ljbGUuCisgICAgICAgICAgICAjIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5Y2xlX2RldGVjdGlvbiNUb3J0b2lzZV9hbmRfaGFyZQorICAgICAgICAgICAgcjEgPSBpdGVyYXRlKHIxKQorICAgICAgICAgICAgcjIgPSBpdGVyYXRlKGl0ZXJhdGUocjIpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBJZiB0aGUgZ3Vlc3MgaXMgcGFydGljdWxhcmx5IGJhZCwgdGhlIGFib3ZlIG1heSBmYWlsIHRvCisgICAgICAgICAgICAjIGNvbnZlcmdlIGluIGFueSByZWFzb25hYmxlIHRpbWUuCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ250aC1yb290IGZhaWxlZCB0byBjb252ZXJnZScpCisgICAgICAgIHJldHVybiByMgorCisgICAgZGVmIGRlY2ltYWxfbnJvb3QoeCwgbik6CisgICAgICAgICIiIkhhbmRsZSBudGggcm9vdCBvZiBEZWNpbWFscy4iIiIKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgZGVjaW1hbC5EZWNpbWFsKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuLCBpbnQpCisgICAgICAgIGlmIHguaXNfc25hbigpOgorICAgICAgICAgICAgIyBTaWduYWxsaW5nIE5BTnMgYWx3YXlzIHJhaXNlLgorICAgICAgICAgICAgcmFpc2UgZGVjaW1hbC5JbnZhbGlkT3BlcmF0aW9uKCdudGgtcm9vdCBvZiBzbmFuJykKKyAgICAgICAgaWYgeC5pc19xbmFuKCk6CisgICAgICAgICAgICAjIFF1aWV0IE5BTnMgb25seSByYWlzZSBpZiB0aGUgY29udGV4dCBpcyBzZXQgdG8gcmFpc2UsCisgICAgICAgICAgICAjIG90aGVyd2lzZSByZXR1cm4gYSBOQU4uCisgICAgICAgICAgICBjdHggPSBkZWNpbWFsLmdldGNvbnRleHQoKQorICAgICAgICAgICAgaWYgY3R4LnRyYXBzW2RlY2ltYWwuSW52YWxpZE9wZXJhdGlvbl06CisgICAgICAgICAgICAgICAgcmFpc2UgZGVjaW1hbC5JbnZhbGlkT3BlcmF0aW9uKCdudGgtcm9vdCBvZiBuYW4nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFByZXNlcnZlIHRoZSBpbnB1dCBOQU4uCisgICAgICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgaWYgeCA8IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdkb21haW4gZXJyb3I6IHJvb3Qgb2YgbmVnYXRpdmUgbnVtYmVyJykKKyAgICAgICAgaWYgeC5pc19pbmZpbml0ZSgpOgorICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgIyBGSVhNRSB0aGlzIGhhc24ndCBoYWQgdGhlIGV4dGVuc2l2ZSB0ZXN0aW5nIG9mIHRoZSBmbG9hdAorICAgICAgICAjIHZlcnNpb24gX2l0ZXJhdGVkX25yb290IHNvIHRoZXJlJ3MgcG9zc2libHkgc29tZSBidWdneQorICAgICAgICAjIGNvcm5lciBjYXNlcyBidXJpZWQgaW4gaGVyZS4gQ2FuIGl0IG92ZXJmbG93PyBGYWlsIHRvCisgICAgICAgICMgY29udmVyZ2Ugb3IgZ2V0IHRyYXBwZWQgaW4gYSBjeWNsZT8gQ29udmVyZ2UgdG8gYSBsZXNzCisgICAgICAgICMgYWNjdXJhdGUgcm9vdD8KKyAgICAgICAgbnAgPSBuIC0gMQorICAgICAgICBkZWYgaXRlcmF0ZShyKToKKyAgICAgICAgICAgIHJldHVybiAobnAqciArIHgvcioqbnApL24KKyAgICAgICAgcjAgPSB4KiooZGVjaW1hbC5EZWNpbWFsKDEpL24pCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHIwLCBkZWNpbWFsLkRlY2ltYWwpCisgICAgICAgIHIxID0gaXRlcmF0ZShyMCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHIxID09IHIwOgorICAgICAgICAgICAgICAgIHJldHVybiByMQorICAgICAgICAgICAgcjAsIHIxID0gcjEsIGl0ZXJhdGUocjEpCisKKyAgICBkZWYgYmlnbnVtX25yb290KHgsIG4pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG50aCByb290IG9mIGEgcG9zaXRpdmUgaHVnZSBudW1iZXIuIiIiCisgICAgICAgIGFzc2VydCB4ID4gMAorICAgICAgICAjIEkgc3RhdGUgd2l0aG91dCBwcm9vZiB0aGF0IOKBv+KImngg4omIIOKBv+KImjLCt+KBv+KImih4Ly8yKQorICAgICAgICAjIGFuZCB0aGF0IGZvciBzdWZmaWNpZW50bHkgYmlnIHggdGhlIGVycm9yIGlzIGFjY2VwdGFibGUuCisgICAgICAgICMgV2Ugbm93IGhhbHZlIHggdW50aWwgaXQgaXMgc21hbGwgZW5vdWdoIHRvIGdldCB0aGUgcm9vdC4KKyAgICAgICAgbSA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHggLy89IDIKKyAgICAgICAgICAgIG0gKz0gMQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHkgPSBmbG9hdCh4KQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGEgPSBfbnJvb3RfTlMubnJvb3QoeSwgbikKKyAgICAgICAgIyBBdCB0aGlzIHBvaW50LCB3ZSB3YW50IHRoZSBudGgtcm9vdCBvZiAyKiptLCBvciAyKioobS9uKS4KKyAgICAgICAgIyBXZSBjYW4gd3JpdGUgdGhhdCBhcyAyKioocSArIHIvbikgPSAyKipxICog4oG/4oiaMioqciB3aGVyZSBxID0gbS8vbi4KKyAgICAgICAgcSwgciA9IGRpdm1vZChtLCBuKQorICAgICAgICBiID0gMioqcSAqIF9ucm9vdF9OUy5ucm9vdCgyKipyLCBuKQorICAgICAgICByZXR1cm4gYSAqIGIKKworCisjIFRoaXMgaXMgdGhlIChwcml2YXRlKSBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgbnRoIHJvb3RzOgorX250aF9yb290ID0gX25yb290X05TLm50aF9yb290Cithc3NlcnQgdHlwZShfbnRoX3Jvb3QpIGlzIHR5cGUobGFtYmRhOiBOb25lKQorCisKK2RlZiBfcHJvZHVjdCh2YWx1ZXMpOgorICAgICIiIlJldHVybiBwcm9kdWN0IG9mIHZhbHVlcyBhcyAoZXhwb25lbnQsIG1hbnRpc3NhKS4iIiIKKyAgICBlcnJtc2cgPSAnbWl4ZWQgRGVjaW1hbCBhbmQgZmxvYXQgaXMgbm90IHN1cHBvcnRlZCcKKyAgICBwcm9kID0gMQorICAgIGZvciB4IGluIHZhbHVlczoKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBmbG9hdCk6CisgICAgICAgICAgICBicmVhaworICAgICAgICBwcm9kICo9IHgKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gKDAsIHByb2QpCisgICAgaWYgaXNpbnN0YW5jZShwcm9kLCBEZWNpbWFsKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKGVycm1zZykKKyAgICAjIFNpbmNlIGZsb2F0cyBjYW4gb3ZlcmZsb3cgZWFzaWx5LCB3ZSBjYWxjdWxhdGUgdGhlIHByb2R1Y3QgYXMgYQorICAgICMgc29ydCBvZiBwb29yLW1hbidzIEJpZ0Zsb2F0LiBHaXZlbiB0aGF0OgorICAgICMKKyAgICAjICAgeCA9IDIqKnAgKiBtICAjIHAgPT0gcG93ZXIgb3IgZXhwb25lbnQgKHNjYWxlKSwgbSA9IG1hbnRpc3NhCisgICAgIworICAgICMgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiB0d28gKG9yIG1vcmUpIHggdmFsdWVzIGFzOgorICAgICMKKyAgICAjICAgeDEqeDIgPSAyKipwMSptMSAqIDIqKnAyKm0yID0gMioqKHAxK3AyKSoobTEqbTIpCisgICAgIworICAgIG1hbnQsIHNjYWxlID0gMSwgMCAgI21hdGguZnJleHAocHJvZCkgICMgRklYTUUKKyAgICBmb3IgeSBpbiBjaGFpbihbeF0sIHZhbHVlcyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoeSwgRGVjaW1hbCk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoZXJybXNnKQorICAgICAgICBtMSwgZTEgPSBtYXRoLmZyZXhwKHkpCisgICAgICAgIG0yLCBlMiA9IG1hdGguZnJleHAobWFudCkKKyAgICAgICAgc2NhbGUgKz0gKGUxICsgZTIpCisgICAgICAgIG1hbnQgPSBtMSptMgorICAgIHJldHVybiAoc2NhbGUsIG1hbnQpCisKKwogIyA9PT0gTWVhc3VyZXMgb2YgY2VudHJhbCB0ZW5kZW5jeSAoYXZlcmFnZXMpID09PQogCiBkZWYgbWVhbihkYXRhKToKQEAgLTMzMyw2ICs1MzgsOTUgQEAKICAgICByZXR1cm4gX2NvbnZlcnQodG90YWwvbiwgVCkKIAogCitkZWYgZ2VvbWV0cmljX21lYW4oZGF0YSk6CisgICAgIiIiUmV0dXJuIHRoZSBnZW9tZXRyaWMgbWVhbiBvZiBkYXRhLgorCisgICAgVGhlIGdlb21ldHJpYyBtZWFuIGlzIGFwcHJvcHJpYXRlIHdoZW4gYXZlcmFnaW5nIHF1YW50aXRpZXMgd2hpY2gKKyAgICBhcmUgbXVsdGlwbGllZCB0b2dldGhlciByYXRoZXIgdGhhbiBhZGRlZCwgZm9yIGV4YW1wbGUgZ3Jvd3RoIHJhdGVzLgorICAgIFN1cHBvc2UgYW4gaW52ZXN0bWVudCBncm93cyBieSAxMCUgaW4gdGhlIGZpcnN0IHllYXIsIGZhbGxzIGJ5IDUlIGluCisgICAgdGhlIHNlY29uZCwgdGhlbiBncm93cyBieSAxMiUgaW4gdGhlIHRoaXJkLCB3aGF0IGlzIHRoZSBhdmVyYWdlIHJhdGUKKyAgICBvZiBncm93dGggb3ZlciB0aGUgdGhyZWUgeWVhcnM/CisKKyAgICA+Pj4gZ2VvbWV0cmljX21lYW4oWzEuMTAsIDAuOTUsIDEuMTJdKQorICAgIDEuMDUzODQ4MzEyMzM4MjE3MgorCisgICAgZ2l2aW5nIGFuIGF2ZXJhZ2UgZ3Jvd3RoIG9mIDUuMzg1JS4gVXNpbmcgdGhlIGFyaXRobWV0aWMgbWVhbiB3aWxsCisgICAgZ2l2ZSBhcHByb3hpbWF0ZWx5IDUuNjY3JSwgd2hpY2ggaXMgdG9vIGhpZ2guCisKKyAgICBgYFN0YXRpc3RpY3NFcnJvcmBgIHdpbGwgYmUgcmFpc2VkIGlmIGBgZGF0YWBgIGlzIGVtcHR5LCBvciBhbnkKKyAgICBlbGVtZW50IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICIiIgorICAgIGlmIGl0ZXIoZGF0YSkgaXMgZGF0YToKKyAgICAgICAgZGF0YSA9IGxpc3QoZGF0YSkKKyAgICBlcnJtc2cgPSAnZ2VvbWV0cmljIG1lYW4gZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSB2YWx1ZXMnCisgICAgbiA9IGxlbihkYXRhKQorICAgIGlmIG4gPCAxOgorICAgICAgICByYWlzZSBTdGF0aXN0aWNzRXJyb3IoJ2dlb21ldHJpY19tZWFuIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBkYXRhIHBvaW50JykKKyAgICBlbGlmIG4gPT0gMToKKyAgICAgICAgeCA9IGRhdGFbMF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShnLCAobnVtYmVycy5SZWFsLCBEZWNpbWFsKSk6CisgICAgICAgICAgICBpZiB4IDwgMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdGF0aXN0aWNzRXJyb3IoZXJybXNnKQorICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigndW5zdXBwb3J0ZWQgdHlwZScpCisgICAgZWxzZToKKyAgICAgICAgc2NhbGUsIHByb2QgPSBfcHJvZHVjdChfZmFpbF9uZWcoZGF0YSwgZXJybXNnKSkKKyAgICAgICAgciA9IF9udGhfcm9vdChwcm9kLCBuKQorICAgICAgICBpZiBzY2FsZToKKyAgICAgICAgICAgIHAsIHEgPSBkaXZtb2Qoc2NhbGUsIG4pCisgICAgICAgICAgICBzID0gMioqcCAqIF9udGhfcm9vdCgyKipxLCBuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9IDEKKyAgICAgICAgcmV0dXJuIHMqcgorCisKK2RlZiBoYXJtb25pY19tZWFuKGRhdGEpOgorICAgICIiIlJldHVybiB0aGUgaGFybW9uaWMgbWVhbiBvZiBkYXRhLgorCisgICAgVGhlIGhhcm1vbmljIG1lYW4sIHNvbWV0aW1lcyBjYWxsZWQgdGhlIHN1YmNvbnRyYXJ5IG1lYW4sIGlzIHRoZQorICAgIHJlY2lwcm9jYWwgb2YgdGhlIGFyaXRobWV0aWMgbWVhbiBvZiB0aGUgcmVjaXByb2NhbHMgb2YgdGhlIGRhdGEsCisgICAgYW5kIGlzIG9mdGVuIGFwcHJvcHJpYXRlIHdoZW4gYXZlcmFnaW5nIHF1YW50aXRpZXMgd2hpY2ggYXJlIHJhdGVzCisgICAgb3IgcmF0aW9zLCBmb3IgZXhhbXBsZSBzcGVlZHMuIEV4YW1wbGU6CisKKyAgICBTdXBwb3NlIGFuIGludmVzdG9yIHB1cmNoYXNlcyBhbiBlcXVhbCB2YWx1ZSBvZiBzaGFyZXMgaW4gZWFjaCBvZgorICAgIHRocmVlIGNvbXBhbmllcywgd2l0aCBQL0UgKHByaWNlL2Vhcm5pbmcpIHJhdGlvcyBvZiAyLjUsIDMgYW5kIDEwLgorICAgIFdoYXQgaXMgdGhlIGF2ZXJhZ2UgUC9FIHJhdGlvIGZvciB0aGUgaW52ZXN0b3IncyBwb3J0Zm9saW8/CisKKyAgICA+Pj4gaGFybW9uaWNfbWVhbihbMi41LCAzLCAxMF0pICAjIEZvciBhbiBlcXVhbCBpbnZlc3RtZW50IHBvcnRmb2xpby4KKyAgICAzLjYKKworICAgIFVzaW5nIHRoZSBhcml0aG1ldGljIG1lYW4gd291bGQgZ2l2ZSBhbiBhdmVyYWdlIG9mIGFib3V0IDUuMTY3LCB3aGljaAorICAgIGlzIHRvbyBoaWdoLgorCisgICAgSWYgYGBkYXRhYGAgaXMgZW1wdHksIG9yIGFueSBlbGVtZW50IGlzIGxlc3MgdGhhbiB6ZXJvLAorICAgIGBgaGFybW9uaWNfbWVhbmBgIHdpbGwgcmFpc2UgYGBTdGF0aXN0aWNzRXJyb3JgYC4KKyAgICAiIiIKKyAgICAjIEZvciBhIGp1c3RpZmljYXRpb24gZm9yIHVzaW5nIGhhcm1vbmljIG1lYW4gZm9yIFAvRSByYXRpb3MsIHNlZQorICAgICMgaHR0cDovL2ZpeHRoZXBpdGNoLnBlbGx1Y2lkLmNvbS9jb21wcy1hbmFseXNpcy10aGUtbWlzc2luZy1oYXJtb255LW9mLXN1bW1hcnktc3RhdGlzdGljcy8KKyAgICAjIGh0dHA6Ly9wYXBlcnMuc3Nybi5jb20vc29sMy9wYXBlcnMuY2ZtP2Fic3RyYWN0X2lkPTI2MjEwODcKKyAgICBpZiBpdGVyKGRhdGEpIGlzIGRhdGE6CisgICAgICAgIGRhdGEgPSBsaXN0KGRhdGEpCisgICAgZXJybXNnID0gJ2hhcm1vbmljIG1lYW4gZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSB2YWx1ZXMnCisgICAgbiA9IGxlbihkYXRhKQorICAgIGlmIG4gPCAxOgorICAgICAgICByYWlzZSBTdGF0aXN0aWNzRXJyb3IoJ2hhcm1vbmljX21lYW4gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGRhdGEgcG9pbnQnKQorICAgIGVsaWYgbiA9PSAxOgorICAgICAgICB4ID0gZGF0YVswXQorICAgICAgICBpZiBpc2luc3RhbmNlKHgsIChudW1iZXJzLlJlYWwsIERlY2ltYWwpKToKKyAgICAgICAgICAgIGlmIHggPCAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0YXRpc3RpY3NFcnJvcihlcnJtc2cpCisgICAgICAgICAgICByZXR1cm4geAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd1bnN1cHBvcnRlZCB0eXBlJykKKyAgICB0cnk6CisgICAgICAgIFQsIHRvdGFsLCBjb3VudCA9IF9zdW0oMS94IGZvciB4IGluIF9mYWlsX25lZyhkYXRhLCBlcnJtc2cpKQorICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgcmV0dXJuIDAKKyAgICBhc3NlcnQgY291bnQgPT0gbgorICAgIHJldHVybiBfY29udmVydChuL3RvdGFsLCBUKQorCisKICMgRklYTUU6IGludmVzdGlnYXRlIHdheXMgdG8gY2FsY3VsYXRlIG1lZGlhbnMgd2l0aG91dCBzb3J0aW5nPyBRdWlja3NlbGVjdD8KIGRlZiBtZWRpYW4oZGF0YSk6CiAgICAgIiIiUmV0dXJuIHRoZSBtZWRpYW4gKG1pZGRsZSB2YWx1ZSkgb2YgbnVtZXJpYyBkYXRhLgpAQCAtNDQyLDkgKzczNiwxNSBAQAogICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICMgTWl4ZWQgdHlwZS4gRm9yIG5vdyB3ZSBqdXN0IGNvZXJjZSB0byBmbG9hdC4KICAgICAgICAgTCA9IGZsb2F0KHgpIC0gZmxvYXQoaW50ZXJ2YWwpLzIKLSAgICBjZiA9IGRhdGEuaW5kZXgoeCkgICMgTnVtYmVyIG9mIHZhbHVlcyBiZWxvdyB0aGUgbWVkaWFuIGludGVydmFsLgotICAgICMgRklYTUUgVGhlIGZvbGxvd2luZyBsaW5lIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50IGZvciBiaWcgbGlzdHMuCi0gICAgZiA9IGRhdGEuY291bnQoeCkgICMgTnVtYmVyIG9mIGRhdGEgcG9pbnRzIGluIHRoZSBtZWRpYW4gaW50ZXJ2YWwuCisKKyAgICAjIFVzZXMgYmlzZWN0aW9uIHNlYXJjaCB0byBzZWFyY2ggZm9yIHggaW4gZGF0YSB3aXRoIGxvZyhuKSB0aW1lIGNvbXBsZXhpdHkKKyAgICAjIEZpbmQgdGhlIHBvc2l0aW9uIG9mIGxlZnRtb3N0IG9jY3VycmVuY2Ugb2YgeCBpbiBkYXRhCisgICAgbDEgPSBfZmluZF9sdGVxKGRhdGEsIHgpCisgICAgIyBGaW5kIHRoZSBwb3NpdGlvbiBvZiByaWdodG1vc3Qgb2NjdXJyZW5jZSBvZiB4IGluIGRhdGFbbDEuLi5sZW4oZGF0YSldCisgICAgIyBBc3N1bWluZyBhbHdheXMgbDEgPD0gbDIKKyAgICBsMiA9IF9maW5kX3J0ZXEoZGF0YSwgbDEsIHgpCisgICAgY2YgPSBsMQorICAgIGYgPSBsMiAtIGwxICsgMQogICAgIHJldHVybiBMICsgaW50ZXJ2YWwqKG4vMiAtIGNmKS9mCiAKIApkaWZmIC0tZ2l0IGEvTGliL3N0cmluZy5weSBiL0xpYi9zdHJpbmcucHkKaW5kZXggODkyODdjNC4uYzkwMjAwNyAxMDA2NDQKLS0tIGEvTGliL3N0cmluZy5weQorKysgYi9MaWIvc3RyaW5nLnB5CkBAIC0yOCw3ICsyOCw3IEBACiBkaWdpdHMgPSAnMDEyMzQ1Njc4OScKIGhleGRpZ2l0cyA9IGRpZ2l0cyArICdhYmNkZWYnICsgJ0FCQ0RFRicKIG9jdGRpZ2l0cyA9ICcwMTIzNDU2NycKLXB1bmN0dWF0aW9uID0gIiIiISIjJCUmJygpKissLS4vOjs8PT4/QFtcXV5fYHt8fX4iIiIKK3B1bmN0dWF0aW9uID0gciIiIiEiIyQlJicoKSorLC0uLzo7PD0+P0BbXF1eX2B7fH1+IiIiCiBwcmludGFibGUgPSBkaWdpdHMgKyBhc2NpaV9sZXR0ZXJzICsgcHVuY3R1YXRpb24gKyB3aGl0ZXNwYWNlCiAKICMgRnVuY3Rpb25zIHdoaWNoIGFyZW4ndCBhdmFpbGFibGUgYXMgc3RyaW5nIG1ldGhvZHMuCkBAIC0xMTYsMTAgKzExNiw3IEBACiAgICAgICAgICAgICAjIENoZWNrIHRoZSBtb3N0IGNvbW1vbiBwYXRoIGZpcnN0LgogICAgICAgICAgICAgbmFtZWQgPSBtby5ncm91cCgnbmFtZWQnKSBvciBtby5ncm91cCgnYnJhY2VkJykKICAgICAgICAgICAgIGlmIG5hbWVkIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHZhbCA9IG1hcHBpbmdbbmFtZWRdCi0gICAgICAgICAgICAgICAgIyBXZSB1c2UgdGhpcyBpZGlvbSBpbnN0ZWFkIG9mIHN0cigpIGJlY2F1c2UgdGhlIGxhdHRlciB3aWxsCi0gICAgICAgICAgICAgICAgIyBmYWlsIGlmIHZhbCBpcyBhIFVuaWNvZGUgY29udGFpbmluZyBub24tQVNDSUkgY2hhcmFjdGVycy4KLSAgICAgICAgICAgICAgICByZXR1cm4gJyVzJyAlICh2YWwsKQorICAgICAgICAgICAgICAgIHJldHVybiBzdHIobWFwcGluZ1tuYW1lZF0pCiAgICAgICAgICAgICBpZiBtby5ncm91cCgnZXNjYXBlZCcpIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlbGltaXRlcgogICAgICAgICAgICAgaWYgbW8uZ3JvdXAoJ2ludmFsaWQnKSBpcyBub3QgTm9uZToKQEAgLTE0Niw5ICsxNDMsNyBAQAogICAgICAgICAgICAgbmFtZWQgPSBtby5ncm91cCgnbmFtZWQnKSBvciBtby5ncm91cCgnYnJhY2VkJykKICAgICAgICAgICAgIGlmIG5hbWVkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgIyBXZSB1c2UgdGhpcyBpZGlvbSBpbnN0ZWFkIG9mIHN0cigpIGJlY2F1c2UgdGhlIGxhdHRlcgotICAgICAgICAgICAgICAgICAgICAjIHdpbGwgZmFpbCBpZiB2YWwgaXMgYSBVbmljb2RlIGNvbnRhaW5pbmcgbm9uLUFTQ0lJCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKG1hcHBpbmdbbmFtZWRdLCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihtYXBwaW5nW25hbWVkXSkKICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtby5ncm91cCgpCiAgICAgICAgICAgICBpZiBtby5ncm91cCgnZXNjYXBlZCcpIGlzIG5vdCBOb25lOgpkaWZmIC0tZ2l0IGEvTGliL3N1YnByb2Nlc3MucHkgYi9MaWIvc3VicHJvY2Vzcy5weQppbmRleCBkOGQ2YWIyLi45ZGY5MzE4IDEwMDY0NAotLS0gYS9MaWIvc3VicHJvY2Vzcy5weQorKysgYi9MaWIvc3VicHJvY2Vzcy5weQpAQCAtMzAsNyArMzAsOCBAQAogICAgICAgICAgICAgcHJlZXhlY19mbj1Ob25lLCBjbG9zZV9mZHM9VHJ1ZSwgc2hlbGw9RmFsc2UsCiAgICAgICAgICAgICBjd2Q9Tm9uZSwgZW52PU5vbmUsIHVuaXZlcnNhbF9uZXdsaW5lcz1GYWxzZSwKICAgICAgICAgICAgIHN0YXJ0dXBpbmZvPU5vbmUsIGNyZWF0aW9uZmxhZ3M9MCwKLSAgICAgICAgICAgIHJlc3RvcmVfc2lnbmFscz1UcnVlLCBzdGFydF9uZXdfc2Vzc2lvbj1GYWxzZSwgcGFzc19mZHM9KCkpOgorICAgICAgICAgICAgcmVzdG9yZV9zaWduYWxzPVRydWUsIHN0YXJ0X25ld19zZXNzaW9uPUZhbHNlLCBwYXNzX2Zkcz0oKSwKKyAgICAgICAgICAgICosIGVuY29kaW5nPU5vbmUsIGVycm9ycz1Ob25lKToKIAogCiBBcmd1bWVudHMgYXJlOgpAQCAtMTA0LDIwICsxMDUsMTMgQEAKIElmIGVudiBpcyBub3QgTm9uZSwgaXQgZGVmaW5lcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgbmV3CiBwcm9jZXNzLgogCi1JZiB1bml2ZXJzYWxfbmV3bGluZXMgaXMgRmFsc2UsIHRoZSBmaWxlIG9iamVjdHMgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyCi1hcmUgb3BlbmVkIGFzIGJpbmFyeSBmaWxlcywgYW5kIG5vIGxpbmUgZW5kaW5nIGNvbnZlcnNpb24gaXMgZG9uZS4KK0lmIGVuY29kaW5nIG9yIGVycm9ycyBhcmUgc3BlY2lmaWVkIG9yIHVuaXZlcnNhbF9uZXdsaW5lcyBpcyBUcnVlLCB0aGUgZmlsZQorb2JqZWN0cyBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgb3BlbmVkIGluIHRleHQgbW9kZS4gU2VlIGlvLlRleHRJT1dyYXBwZXIgZm9yCit0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlc2UgcGFyYW1ldGVycyBhcmUgdXNlZC4KIAotSWYgdW5pdmVyc2FsX25ld2xpbmVzIGlzIFRydWUsIHRoZSBmaWxlIG9iamVjdHMgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlCi1vcGVuZWQgYXMgYSB0ZXh0IGZpbGUsIGJ1dCBsaW5lcyBtYXkgYmUgdGVybWluYXRlZCBieSBhbnkgb2YgJ1xuJywKLXRoZSBVbml4IGVuZC1vZi1saW5lIGNvbnZlbnRpb24sICdccicsIHRoZSBvbGQgTWFjaW50b3NoIGNvbnZlbnRpb24gb3IKLSdcclxuJywgdGhlIFdpbmRvd3MgY29udmVudGlvbi4gIEFsbCBvZiB0aGVzZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbnMKLWFyZSBzZWVuIGFzICdcbicgYnkgdGhlIFB5dGhvbiBwcm9ncmFtLiAgQWxzbywgdGhlIG5ld2xpbmVzIGF0dHJpYnV0ZQotb2YgdGhlIGZpbGUgb2JqZWN0cyBzdGRvdXQsIHN0ZGluIGFuZCBzdGRlcnIgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZQotY29tbXVuaWNhdGUoKSBtZXRob2QuCi0KLUluIGVpdGhlciBjYXNlLCB0aGUgcHJvY2VzcyBiZWluZyBjb21tdW5pY2F0ZWQgd2l0aCBzaG91bGQgc3RhcnQgdXAKLWV4cGVjdGluZyB0byByZWNlaXZlIGJ5dGVzIG9uIGl0cyBzdGFuZGFyZCBpbnB1dCBhbmQgZGVjb2RlIHRoZW0gd2l0aAotdGhlIHNhbWUgZW5jb2RpbmcgdGhleSBhcmUgc2VudCBpbi4KK0lmIG5vIGVuY29kaW5nIGlzIHNwZWNpZmllZCBhbmQgdW5pdmVyc2FsX25ld2xpbmVzIGlzIEZhbHNlLCB0aGUgZmlsZQorb2JqZWN0cyBzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIG9wZW5lZCBhcyBiaW5hcnkgZmlsZXMsIGFuZCBubworbGluZSBlbmRpbmcgY29udmVyc2lvbiBpcyBkb25lLgogCiBUaGUgc3RhcnR1cGluZm8gYW5kIGNyZWF0aW9uZmxhZ3MsIGlmIGdpdmVuLCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKIHVuZGVybHlpbmcgQ3JlYXRlUHJvY2VzcygpIGZ1bmN0aW9uLiAgVGhleSBjYW4gc3BlY2lmeSB0aGluZ3Mgc3VjaCBhcwpAQCAtMjM0LDExICsyMjgsOCBAQAogICAgIGFuZCBzdGRlcnIsIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuICBXYWl0IGZvciBwcm9jZXNzIHRvCiAgICAgdGVybWluYXRlLiAgVGhlIG9wdGlvbmFsIGlucHV0IGFyZ3VtZW50IHNob3VsZCBiZSBkYXRhIHRvIGJlCiAgICAgc2VudCB0byB0aGUgY2hpbGQgcHJvY2Vzcywgb3IgTm9uZSwgaWYgbm8gZGF0YSBzaG91bGQgYmUgc2VudCB0bwotICAgIHRoZSBjaGlsZC4gSWYgdGhlIFBvcGVuIGluc3RhbmNlIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIHVuaXZlcnNhbF9uZXdsaW5lcwotICAgIHNldCB0byBUcnVlLCB0aGUgaW5wdXQgYXJndW1lbnQgc2hvdWxkIGJlIGEgc3RyaW5nIGFuZCB3aWxsIGJlIGVuY29kZWQKLSAgICB1c2luZyB0aGUgcHJlZmVycmVkIHN5c3RlbSBlbmNvZGluZyAoc2VlIGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZyk7Ci0gICAgaWYgdW5pdmVyc2FsX25ld2xpbmVzIGlzIEZhbHNlLCB0aGUgaW5wdXQgYXJndW1lbnQgc2hvdWxkIGJlIGEKLSAgICBieXRlIHN0cmluZy4KKyAgICB0aGUgY2hpbGQuIElmIHRoZSBQb3BlbiBpbnN0YW5jZSB3YXMgY29uc3RydWN0ZWQgaW4gdGV4dCBtb2RlLCB0aGUKKyAgICBpbnB1dCBhcmd1bWVudCBzaG91bGQgYmUgYSBzdHJpbmcuIE90aGVyd2lzZSwgaXQgc2hvdWxkIGJlIGJ5dGVzLgogCiAgICAgY29tbXVuaWNhdGUoKSByZXR1cm5zIGEgdHVwbGUgKHN0ZG91dCwgc3RkZXJyKS4KIApAQCAtMzcyLDkgKzM2MywxMSBAQAogCiAKIGNsYXNzIENhbGxlZFByb2Nlc3NFcnJvcihTdWJwcm9jZXNzRXJyb3IpOgotICAgICIiIlRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIGEgcHJvY2VzcyBydW4gYnkgY2hlY2tfY2FsbCgpIG9yCi0gICAgY2hlY2tfb3V0cHV0KCkgcmV0dXJucyBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzLgotICAgIFRoZSBleGl0IHN0YXR1cyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcmV0dXJuY29kZSBhdHRyaWJ1dGU7CisgICAgIiIiUmFpc2VkIHdoZW4gYSBjaGVja19jYWxsKCkgb3IgY2hlY2tfb3V0cHV0KCkgcHJvY2VzcyByZXR1cm5zIG5vbi16ZXJvLgorCisgICAgVGhlIGV4aXQgc3RhdHVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZSwgbmVnYXRpdmUKKyAgICBpZiBpdCByZXByZXNlbnRzIGEgc2lnbmFsIG51bWJlci4KKwogICAgIGNoZWNrX291dHB1dCgpIHdpbGwgYWxzbyBzdG9yZSB0aGUgb3V0cHV0IGluIHRoZSBvdXRwdXQgYXR0cmlidXRlLgogICAgICIiIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXR1cm5jb2RlLCBjbWQsIG91dHB1dD1Ob25lLCBzdGRlcnI9Tm9uZSk6CkBAIC0zODQsNyArMzc3LDE2IEBACiAgICAgICAgIHNlbGYuc3RkZXJyID0gc3RkZXJyCiAKICAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICJDb21tYW5kICclcycgcmV0dXJuZWQgbm9uLXplcm8gZXhpdCBzdGF0dXMgJWQiICUgKHNlbGYuY21kLCBzZWxmLnJldHVybmNvZGUpCisgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBhbmQgc2VsZi5yZXR1cm5jb2RlIDwgMDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNvbW1hbmQgJyVzJyBkaWVkIHdpdGggJXIuIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY21kLCBzaWduYWwuU2lnbmFscygtc2VsZi5yZXR1cm5jb2RlKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiAiQ29tbWFuZCAnJXMnIGRpZWQgd2l0aCB1bmtub3duIHNpZ25hbCAlZC4iICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbWQsIC1zZWxmLnJldHVybmNvZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIkNvbW1hbmQgJyVzJyByZXR1cm5lZCBub24temVybyBleGl0IHN0YXR1cyAlZC4iICUgKAorICAgICAgICAgICAgICAgICAgICBzZWxmLmNtZCwgc2VsZi5yZXR1cm5jb2RlKQogCiAgICAgQHByb3BlcnR5CiAgICAgZGVmIHN0ZG91dChzZWxmKToKQEAgLTQ3MSw3ICs0NzMsOCBAQAogICAgIF9fYWxsX18uZXh0ZW5kKFsiQ1JFQVRFX05FV19DT05TT0xFIiwgIkNSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCIsCiAgICAgICAgICAgICAgICAgICAgICJTVERfSU5QVVRfSEFORExFIiwgIlNURF9PVVRQVVRfSEFORExFIiwKICAgICAgICAgICAgICAgICAgICAgIlNURF9FUlJPUl9IQU5ETEUiLCAiU1dfSElERSIsCi0gICAgICAgICAgICAgICAgICAgICJTVEFSVEZfVVNFU1RESEFORExFUyIsICJTVEFSVEZfVVNFU0hPV1dJTkRPVyJdKQorICAgICAgICAgICAgICAgICAgICAiU1RBUlRGX1VTRVNUREhBTkRMRVMiLCAiU1RBUlRGX1VTRVNIT1dXSU5ET1ciLAorICAgICAgICAgICAgICAgICAgICAiU1RBUlRVUElORk8iXSkKIAogICAgIGNsYXNzIEhhbmRsZShpbnQpOgogICAgICAgICBjbG9zZWQgPSBGYWxzZQpAQCAtNTIwLDYgKzUyMywxNiBAQAogIyBidXQgaXQncyBoZXJlIHNvIHRoYXQgaXQgY2FuIGJlIGltcG9ydGVkIHdoZW4gUHl0aG9uIGlzIGNvbXBpbGVkIHdpdGhvdXQKICMgdGhyZWFkcy4KIAorZGVmIF9vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgcmVwcm9kdWNpbmcgdGhlIGN1cnJlbnQKKyAgICBvcHRpbWl6YXRpb24gc2V0dGluZ3MgaW4gc3lzLmZsYWdzLiIiIgorICAgIGFyZ3MgPSBbXQorICAgIHZhbHVlID0gc3lzLmZsYWdzLm9wdGltaXplCisgICAgaWYgdmFsdWUgPiAwOgorICAgICAgICBhcmdzLmFwcGVuZCgnLScgKyAnTycgKiB2YWx1ZSkKKyAgICByZXR1cm4gYXJncworCisKIGRlZiBfYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCk6CiAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHJlcHJvZHVjaW5nIHRoZSBjdXJyZW50CiAgICAgc2V0dGluZ3MgaW4gc3lzLmZsYWdzIGFuZCBzeXMud2Fybm9wdGlvbnMuIiIiCkBAIC01MjcsNyArNTQwLDYgQEAKICAgICAgICAgJ2RlYnVnJzogJ2QnLAogICAgICAgICAjICdpbnNwZWN0JzogJ2knLAogICAgICAgICAjICdpbnRlcmFjdGl2ZSc6ICdpJywKLSAgICAgICAgJ29wdGltaXplJzogJ08nLAogICAgICAgICAnZG9udF93cml0ZV9ieXRlY29kZSc6ICdCJywKICAgICAgICAgJ25vX3VzZXJfc2l0ZSc6ICdzJywKICAgICAgICAgJ25vX3NpdGUnOiAnUycsCkBAIC01MzUsOCArNTQ3LDkgQEAKICAgICAgICAgJ3ZlcmJvc2UnOiAndicsCiAgICAgICAgICdieXRlc193YXJuaW5nJzogJ2InLAogICAgICAgICAncXVpZXQnOiAncScsCisgICAgICAgICMgLU8gaXMgaGFuZGxlZCBpbiBfb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKICAgICB9Ci0gICAgYXJncyA9IFtdCisgICAgYXJncyA9IF9vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKQogICAgIGZvciBmbGFnLCBvcHQgaW4gZmxhZ19vcHRfbWFwLml0ZW1zKCk6CiAgICAgICAgIHYgPSBnZXRhdHRyKHN5cy5mbGFncywgZmxhZykKICAgICAgICAgaWYgdiA+IDA6CkBAIC03ODYsOCArNzk5LDggQEAKICAgICAiIiIgICAgUmV0dXJuIChzdGF0dXMsIG91dHB1dCkgb2YgZXhlY3V0aW5nIGNtZCBpbiBhIHNoZWxsLgogCiAgICAgRXhlY3V0ZSB0aGUgc3RyaW5nICdjbWQnIGluIGEgc2hlbGwgd2l0aCAnY2hlY2tfb3V0cHV0JyBhbmQKLSAgICByZXR1cm4gYSAyLXR1cGxlIChzdGF0dXMsIG91dHB1dCkuIFVuaXZlcnNhbCBuZXdsaW5lcyBtb2RlIGlzIHVzZWQsCi0gICAgbWVhbmluZyB0aGF0IHRoZSByZXN1bHQgd2l0aCBiZSBkZWNvZGVkIHRvIGEgc3RyaW5nLgorICAgIHJldHVybiBhIDItdHVwbGUgKHN0YXR1cywgb3V0cHV0KS4gVGhlIGxvY2FsZSBlbmNvZGluZyBpcyB1c2VkCisgICAgdG8gZGVjb2RlIHRoZSBvdXRwdXQgYW5kIHByb2Nlc3MgbmV3bGluZXMuCiAKICAgICBBIHRyYWlsaW5nIG5ld2xpbmUgaXMgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0LgogICAgIFRoZSBleGl0IHN0YXR1cyBmb3IgdGhlIGNvbW1hbmQgY2FuIGJlIGludGVycHJldGVkCkBAIC04MzcsNyArODUwLDcgQEAKICAgICAgICAgICAgICAgICAgc2hlbGw9RmFsc2UsIGN3ZD1Ob25lLCBlbnY9Tm9uZSwgdW5pdmVyc2FsX25ld2xpbmVzPUZhbHNlLAogICAgICAgICAgICAgICAgICBzdGFydHVwaW5mbz1Ob25lLCBjcmVhdGlvbmZsYWdzPTAsCiAgICAgICAgICAgICAgICAgIHJlc3RvcmVfc2lnbmFscz1UcnVlLCBzdGFydF9uZXdfc2Vzc2lvbj1GYWxzZSwKLSAgICAgICAgICAgICAgICAgcGFzc19mZHM9KCkpOgorICAgICAgICAgICAgICAgICBwYXNzX2Zkcz0oKSwgKiwgZW5jb2Rpbmc9Tm9uZSwgZXJyb3JzPU5vbmUpOgogICAgICAgICAiIiJDcmVhdGUgbmV3IFBvcGVuIGluc3RhbmNlLiIiIgogICAgICAgICBfY2xlYW51cCgpCiAgICAgICAgICMgSGVsZCB3aGlsZSBhbnl0aGluZyBpcyBjYWxsaW5nIHdhaXRwaWQgYmVmb3JlIHJldHVybmNvZGUgaGFzIGJlZW4KQEAgLTg5MCw2ICs5MDMsOCBAQAogICAgICAgICBzZWxmLnBpZCA9IE5vbmUKICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gTm9uZQogICAgICAgICBzZWxmLnVuaXZlcnNhbF9uZXdsaW5lcyA9IHVuaXZlcnNhbF9uZXdsaW5lcworICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKIAogICAgICAgICAjIElucHV0IGFuZCBvdXRwdXQgb2JqZWN0cy4gVGhlIGdlbmVyYWwgcHJpbmNpcGxlIGlzIGxpa2UKICAgICAgICAgIyB0aGlzOgpAQCAtOTIyLDIyICs5MzcsMjggQEAKICAgICAgICAgICAgIGlmIGVycnJlYWQgIT0gLTE6CiAgICAgICAgICAgICAgICAgZXJycmVhZCA9IG1zdmNydC5vcGVuX29zZmhhbmRsZShlcnJyZWFkLkRldGFjaCgpLCAwKQogCi0gICAgICAgIGlmIHAyY3dyaXRlICE9IC0xOgotICAgICAgICAgICAgc2VsZi5zdGRpbiA9IGlvLm9wZW4ocDJjd3JpdGUsICd3YicsIGJ1ZnNpemUpCi0gICAgICAgICAgICBpZiB1bml2ZXJzYWxfbmV3bGluZXM6Ci0gICAgICAgICAgICAgICAgc2VsZi5zdGRpbiA9IGlvLlRleHRJT1dyYXBwZXIoc2VsZi5zdGRpbiwgd3JpdGVfdGhyb3VnaD1UcnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfYnVmZmVyaW5nPShidWZzaXplID09IDEpKQotICAgICAgICBpZiBjMnByZWFkICE9IC0xOgotICAgICAgICAgICAgc2VsZi5zdGRvdXQgPSBpby5vcGVuKGMycHJlYWQsICdyYicsIGJ1ZnNpemUpCi0gICAgICAgICAgICBpZiB1bml2ZXJzYWxfbmV3bGluZXM6Ci0gICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQgPSBpby5UZXh0SU9XcmFwcGVyKHNlbGYuc3Rkb3V0KQotICAgICAgICBpZiBlcnJyZWFkICE9IC0xOgotICAgICAgICAgICAgc2VsZi5zdGRlcnIgPSBpby5vcGVuKGVycnJlYWQsICdyYicsIGJ1ZnNpemUpCi0gICAgICAgICAgICBpZiB1bml2ZXJzYWxfbmV3bGluZXM6Ci0gICAgICAgICAgICAgICAgc2VsZi5zdGRlcnIgPSBpby5UZXh0SU9XcmFwcGVyKHNlbGYuc3RkZXJyKQorICAgICAgICB0ZXh0X21vZGUgPSBlbmNvZGluZyBvciBlcnJvcnMgb3IgdW5pdmVyc2FsX25ld2xpbmVzCiAKICAgICAgICAgc2VsZi5fY2xvc2VkX2NoaWxkX3BpcGVfZmRzID0gRmFsc2UKKwogICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBwMmN3cml0ZSAhPSAtMToKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZGluID0gaW8ub3BlbihwMmN3cml0ZSwgJ3diJywgYnVmc2l6ZSkKKyAgICAgICAgICAgICAgICBpZiB0ZXh0X21vZGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4gPSBpby5UZXh0SU9XcmFwcGVyKHNlbGYuc3RkaW4sIHdyaXRlX3Rocm91Z2g9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2J1ZmZlcmluZz0oYnVmc2l6ZSA9PSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz1lbmNvZGluZywgZXJyb3JzPWVycm9ycykKKyAgICAgICAgICAgIGlmIGMycHJlYWQgIT0gLTE6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQgPSBpby5vcGVuKGMycHJlYWQsICdyYicsIGJ1ZnNpemUpCisgICAgICAgICAgICAgICAgaWYgdGV4dF9tb2RlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dCA9IGlvLlRleHRJT1dyYXBwZXIoc2VsZi5zdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9ZW5jb2RpbmcsIGVycm9ycz1lcnJvcnMpCisgICAgICAgICAgICBpZiBlcnJyZWFkICE9IC0xOgorICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyID0gaW8ub3BlbihlcnJyZWFkLCAncmInLCBidWZzaXplKQorICAgICAgICAgICAgICAgIGlmIHRleHRfbW9kZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRlcnIgPSBpby5UZXh0SU9XcmFwcGVyKHNlbGYuc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPWVuY29kaW5nLCBlcnJvcnM9ZXJyb3JzKQorCiAgICAgICAgICAgICBzZWxmLl9leGVjdXRlX2NoaWxkKGFyZ3MsIGV4ZWN1dGFibGUsIHByZWV4ZWNfZm4sIGNsb3NlX2ZkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19mZHMsIGN3ZCwgZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHVwaW5mbywgY3JlYXRpb25mbGFncywgc2hlbGwsCkBAIC05NzEsOSArOTkyLDggQEAKIAogICAgICAgICAgICAgcmFpc2UKIAotCi0gICAgZGVmIF90cmFuc2xhdGVfbmV3bGluZXMoc2VsZiwgZGF0YSwgZW5jb2RpbmcpOgotICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoZW5jb2RpbmcpCisgICAgZGVmIF90cmFuc2xhdGVfbmV3bGluZXMoc2VsZiwgZGF0YSwgZW5jb2RpbmcsIGVycm9ycyk6CisgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZShlbmNvZGluZywgZXJyb3JzKQogICAgICAgICByZXR1cm4gZGF0YS5yZXBsYWNlKCJcclxuIiwgIlxuIikucmVwbGFjZSgiXHIiLCAiXG4iKQogCiAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKQEAgLTk5NSw2ICsxMDE1LDExIEBACiAgICAgICAgIGlmIG5vdCBzZWxmLl9jaGlsZF9jcmVhdGVkOgogICAgICAgICAgICAgIyBXZSBkaWRuJ3QgZ2V0IHRvIHN1Y2Nlc3NmdWxseSBjcmVhdGUgYSBjaGlsZCBwcm9jZXNzLgogICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgIyBOb3QgcmVhZGluZyBzdWJwcm9jZXNzIGV4aXQgc3RhdHVzIGNyZWF0ZXMgYSB6b21iaSBwcm9jZXNzIHdoaWNoCisgICAgICAgICAgICAjIGlzIG9ubHkgZGVzdHJveWVkIGF0IHRoZSBwYXJlbnQgcHl0aG9uIHByb2Nlc3MgZXhpdAorICAgICAgICAgICAgd2FybmluZ3Mud2Fybigic3VicHJvY2VzcyAlcyBpcyBzdGlsbCBydW5uaW5nIiAlIHNlbGYucGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVdhcm5pbmcsIHNvdXJjZT1zZWxmKQogICAgICAgICAjIEluIGNhc2UgdGhlIGNoaWxkIGhhc24ndCBiZWVuIHdhaXRlZCBvbiwgY2hlY2sgaWYgaXQncyBkb25lLgogICAgICAgICBzZWxmLl9pbnRlcm5hbF9wb2xsKF9kZWFkc3RhdGU9X21heHNpemUpCiAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lIGFuZCBfYWN0aXZlIGlzIG5vdCBOb25lOgpAQCAtMTUyMCw5ICsxNTQ1LDE0IEBACiAKICAgICAgICAgICAgIGlmIGVycnBpcGVfZGF0YToKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIG9zLndhaXRwaWQoc2VsZi5waWQsIDApCisgICAgICAgICAgICAgICAgICAgIHBpZCwgc3RzID0gb3Mud2FpdHBpZChzZWxmLnBpZCwgMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcGlkID09IHNlbGYucGlkOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX2V4aXRzdGF0dXMoc3RzKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gc3lzLm1heHNpemUKICAgICAgICAgICAgICAgICBleGNlcHQgQ2hpbGRQcm9jZXNzRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIHBhc3MKKwogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX25hbWUsIGhleF9lcnJubywgZXJyX21zZyA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJwaXBlX2RhdGEuc3BsaXQoYic6JywgMikpCkBAIC0xNzQ4LDEzICsxNzc4LDE1IEBACiAKICAgICAgICAgICAgICMgVHJhbnNsYXRlIG5ld2xpbmVzLCBpZiByZXF1ZXN0ZWQuCiAgICAgICAgICAgICAjIFRoaXMgYWxzbyB0dXJucyBieXRlcyBpbnRvIHN0cmluZ3MuCi0gICAgICAgICAgICBpZiBzZWxmLnVuaXZlcnNhbF9uZXdsaW5lczoKKyAgICAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmcgb3Igc2VsZi5lcnJvcnMgb3Igc2VsZi51bml2ZXJzYWxfbmV3bGluZXM6CiAgICAgICAgICAgICAgICAgaWYgc3Rkb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICBzdGRvdXQgPSBzZWxmLl90cmFuc2xhdGVfbmV3bGluZXMoc3Rkb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LmVycm9ycykKICAgICAgICAgICAgICAgICBpZiBzdGRlcnIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgIHN0ZGVyciA9IHNlbGYuX3RyYW5zbGF0ZV9uZXdsaW5lcyhzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGVyci5lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyLmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRlcnIuZXJyb3JzKQogCiAgICAgICAgICAgICByZXR1cm4gKHN0ZG91dCwgc3RkZXJyKQogCkBAIC0xNzY2LDggKzE3OTgsMTAgQEAKICAgICAgICAgICAgIGlmIHNlbGYuc3RkaW4gYW5kIHNlbGYuX2lucHV0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgc2VsZi5faW5wdXRfb2Zmc2V0ID0gMAogICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0ID0gaW5wdXQKLSAgICAgICAgICAgICAgICBpZiBzZWxmLnVuaXZlcnNhbF9uZXdsaW5lcyBhbmQgaW5wdXQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0ID0gc2VsZi5faW5wdXQuZW5jb2RlKHNlbGYuc3RkaW4uZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgaWYgaW5wdXQgaXMgbm90IE5vbmUgYW5kICgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyBvciBzZWxmLmVycm9ycyBvciBzZWxmLnVuaXZlcnNhbF9uZXdsaW5lcyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0ID0gc2VsZi5faW5wdXQuZW5jb2RlKHNlbGYuc3RkaW4uZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4uZXJyb3JzKQogCiAKICAgICAgICAgZGVmIHNlbmRfc2lnbmFsKHNlbGYsIHNpZyk6CmRpZmYgLS1naXQgYS9MaWIvc3ltYm9sLnB5IGIvTGliL3N5bWJvbC5weQppbmRleCA3NTQxNDk3Li5kOWYwMWUwIDEwMDc1NQotLS0gYS9MaWIvc3ltYm9sLnB5CisrKyBiL0xpYi9zeW1ib2wucHkKQEAgLTI3LDc0ICsyNyw3NSBAQAogc2ltcGxlX3N0bXQgPSAyNzAKIHNtYWxsX3N0bXQgPSAyNzEKIGV4cHJfc3RtdCA9IDI3MgotdGVzdGxpc3Rfc3Rhcl9leHByID0gMjczCi1hdWdhc3NpZ24gPSAyNzQKLWRlbF9zdG10ID0gMjc1Ci1wYXNzX3N0bXQgPSAyNzYKLWZsb3dfc3RtdCA9IDI3NwotYnJlYWtfc3RtdCA9IDI3OAotY29udGludWVfc3RtdCA9IDI3OQotcmV0dXJuX3N0bXQgPSAyODAKLXlpZWxkX3N0bXQgPSAyODEKLXJhaXNlX3N0bXQgPSAyODIKLWltcG9ydF9zdG10ID0gMjgzCi1pbXBvcnRfbmFtZSA9IDI4NAotaW1wb3J0X2Zyb20gPSAyODUKLWltcG9ydF9hc19uYW1lID0gMjg2Ci1kb3R0ZWRfYXNfbmFtZSA9IDI4NwotaW1wb3J0X2FzX25hbWVzID0gMjg4Ci1kb3R0ZWRfYXNfbmFtZXMgPSAyODkKLWRvdHRlZF9uYW1lID0gMjkwCi1nbG9iYWxfc3RtdCA9IDI5MQotbm9ubG9jYWxfc3RtdCA9IDI5MgotYXNzZXJ0X3N0bXQgPSAyOTMKLWNvbXBvdW5kX3N0bXQgPSAyOTQKLWFzeW5jX3N0bXQgPSAyOTUKLWlmX3N0bXQgPSAyOTYKLXdoaWxlX3N0bXQgPSAyOTcKLWZvcl9zdG10ID0gMjk4Ci10cnlfc3RtdCA9IDI5OQotd2l0aF9zdG10ID0gMzAwCi13aXRoX2l0ZW0gPSAzMDEKLWV4Y2VwdF9jbGF1c2UgPSAzMDIKLXN1aXRlID0gMzAzCi10ZXN0ID0gMzA0Ci10ZXN0X25vY29uZCA9IDMwNQotbGFtYmRlZiA9IDMwNgotbGFtYmRlZl9ub2NvbmQgPSAzMDcKLW9yX3Rlc3QgPSAzMDgKLWFuZF90ZXN0ID0gMzA5Ci1ub3RfdGVzdCA9IDMxMAotY29tcGFyaXNvbiA9IDMxMQotY29tcF9vcCA9IDMxMgotc3Rhcl9leHByID0gMzEzCi1leHByID0gMzE0Ci14b3JfZXhwciA9IDMxNQotYW5kX2V4cHIgPSAzMTYKLXNoaWZ0X2V4cHIgPSAzMTcKLWFyaXRoX2V4cHIgPSAzMTgKLXRlcm0gPSAzMTkKLWZhY3RvciA9IDMyMAotcG93ZXIgPSAzMjEKLWF0b21fZXhwciA9IDMyMgotYXRvbSA9IDMyMwotdGVzdGxpc3RfY29tcCA9IDMyNAotdHJhaWxlciA9IDMyNQotc3Vic2NyaXB0bGlzdCA9IDMyNgotc3Vic2NyaXB0ID0gMzI3Ci1zbGljZW9wID0gMzI4Ci1leHBybGlzdCA9IDMyOQotdGVzdGxpc3QgPSAzMzAKLWRpY3RvcnNldG1ha2VyID0gMzMxCi1jbGFzc2RlZiA9IDMzMgotYXJnbGlzdCA9IDMzMwotYXJndW1lbnQgPSAzMzQKLWNvbXBfaXRlciA9IDMzNQotY29tcF9mb3IgPSAzMzYKLWNvbXBfaWYgPSAzMzcKLWVuY29kaW5nX2RlY2wgPSAzMzgKLXlpZWxkX2V4cHIgPSAzMzkKLXlpZWxkX2FyZyA9IDM0MAorYW5uYXNzaWduID0gMjczCit0ZXN0bGlzdF9zdGFyX2V4cHIgPSAyNzQKK2F1Z2Fzc2lnbiA9IDI3NQorZGVsX3N0bXQgPSAyNzYKK3Bhc3Nfc3RtdCA9IDI3NworZmxvd19zdG10ID0gMjc4CiticmVha19zdG10ID0gMjc5Citjb250aW51ZV9zdG10ID0gMjgwCityZXR1cm5fc3RtdCA9IDI4MQoreWllbGRfc3RtdCA9IDI4MgorcmFpc2Vfc3RtdCA9IDI4MworaW1wb3J0X3N0bXQgPSAyODQKK2ltcG9ydF9uYW1lID0gMjg1CitpbXBvcnRfZnJvbSA9IDI4NgoraW1wb3J0X2FzX25hbWUgPSAyODcKK2RvdHRlZF9hc19uYW1lID0gMjg4CitpbXBvcnRfYXNfbmFtZXMgPSAyODkKK2RvdHRlZF9hc19uYW1lcyA9IDI5MAorZG90dGVkX25hbWUgPSAyOTEKK2dsb2JhbF9zdG10ID0gMjkyCitub25sb2NhbF9zdG10ID0gMjkzCithc3NlcnRfc3RtdCA9IDI5NAorY29tcG91bmRfc3RtdCA9IDI5NQorYXN5bmNfc3RtdCA9IDI5NgoraWZfc3RtdCA9IDI5Nword2hpbGVfc3RtdCA9IDI5OAorZm9yX3N0bXQgPSAyOTkKK3RyeV9zdG10ID0gMzAwCit3aXRoX3N0bXQgPSAzMDEKK3dpdGhfaXRlbSA9IDMwMgorZXhjZXB0X2NsYXVzZSA9IDMwMworc3VpdGUgPSAzMDQKK3Rlc3QgPSAzMDUKK3Rlc3Rfbm9jb25kID0gMzA2CitsYW1iZGVmID0gMzA3CitsYW1iZGVmX25vY29uZCA9IDMwOAorb3JfdGVzdCA9IDMwOQorYW5kX3Rlc3QgPSAzMTAKK25vdF90ZXN0ID0gMzExCitjb21wYXJpc29uID0gMzEyCitjb21wX29wID0gMzEzCitzdGFyX2V4cHIgPSAzMTQKK2V4cHIgPSAzMTUKK3hvcl9leHByID0gMzE2CithbmRfZXhwciA9IDMxNworc2hpZnRfZXhwciA9IDMxOAorYXJpdGhfZXhwciA9IDMxOQordGVybSA9IDMyMAorZmFjdG9yID0gMzIxCitwb3dlciA9IDMyMgorYXRvbV9leHByID0gMzIzCithdG9tID0gMzI0Cit0ZXN0bGlzdF9jb21wID0gMzI1Cit0cmFpbGVyID0gMzI2CitzdWJzY3JpcHRsaXN0ID0gMzI3CitzdWJzY3JpcHQgPSAzMjgKK3NsaWNlb3AgPSAzMjkKK2V4cHJsaXN0ID0gMzMwCit0ZXN0bGlzdCA9IDMzMQorZGljdG9yc2V0bWFrZXIgPSAzMzIKK2NsYXNzZGVmID0gMzMzCithcmdsaXN0ID0gMzM0Cithcmd1bWVudCA9IDMzNQorY29tcF9pdGVyID0gMzM2Citjb21wX2ZvciA9IDMzNworY29tcF9pZiA9IDMzOAorZW5jb2RpbmdfZGVjbCA9IDMzOQoreWllbGRfZXhwciA9IDM0MAoreWllbGRfYXJnID0gMzQxCiAjLS1lbmQgY29uc3RhbnRzLS0KIAogc3ltX25hbWUgPSB7fQpkaWZmIC0tZ2l0IGEvTGliL3N5bXRhYmxlLnB5IGIvTGliL3N5bXRhYmxlLnB5CmluZGV4IDg0ZmVjNGEuLmIwZTUyNjAgMTAwNjQ0Ci0tLSBhL0xpYi9zeW10YWJsZS5weQorKysgYi9MaWIvc3ltdGFibGUucHkKQEAgLTIsNyArMiw3IEBACiAKIGltcG9ydCBfc3ltdGFibGUKIGZyb20gX3N5bXRhYmxlIGltcG9ydCAoVVNFLCBERUZfR0xPQkFMLCBERUZfTE9DQUwsIERFRl9QQVJBTSwKLSAgICAgREVGX0lNUE9SVCwgREVGX0JPVU5ELCBTQ09QRV9PRkYsIFNDT1BFX01BU0ssIEZSRUUsCisgICAgIERFRl9JTVBPUlQsIERFRl9CT1VORCwgREVGX0FOTk9ULCBTQ09QRV9PRkYsIFNDT1BFX01BU0ssIEZSRUUsCiAgICAgIExPQ0FMLCBHTE9CQUxfSU1QTElDSVQsIEdMT0JBTF9FWFBMSUNJVCwgQ0VMTCkKIAogaW1wb3J0IHdlYWtyZWYKQEAgLTE5MCw2ICsxOTAsOSBAQAogICAgIGRlZiBpc19sb2NhbChzZWxmKToKICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX2ZsYWdzICYgREVGX0JPVU5EKQogCisgICAgZGVmIGlzX2Fubm90YXRlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX2ZsYWdzICYgREVGX0FOTk9UKQorCiAgICAgZGVmIGlzX2ZyZWUoc2VsZik6CiAgICAgICAgIHJldHVybiBib29sKHNlbGYuX19zY29wZSA9PSBGUkVFKQogCmRpZmYgLS1naXQgYS9MaWIvc3lzY29uZmlnLnB5IGIvTGliL3N5c2NvbmZpZy5weQppbmRleCA5YzM0YmUwLi43Yjc4NDQwIDEwMDY0NAotLS0gYS9MaWIvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9zeXNjb25maWcucHkKQEAgLTg2LDggKzg2LDggQEAKICAjIEZJWE1FIGRvbid0IHJlbHkgb24gc3lzLnZlcnNpb24gaGVyZSwgaXRzIGZvcm1hdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwKICAjIG9mIENQeXRob24sIHVzZSBzeXMudmVyc2lvbl9pbmZvIG9yIHN5cy5oZXh2ZXJzaW9uCiBfUFlfVkVSU0lPTiA9IHN5cy52ZXJzaW9uLnNwbGl0KClbMF0KLV9QWV9WRVJTSU9OX1NIT1JUID0gc3lzLnZlcnNpb25bOjNdCi1fUFlfVkVSU0lPTl9TSE9SVF9OT19ET1QgPSBfUFlfVkVSU0lPTlswXSArIF9QWV9WRVJTSU9OWzJdCitfUFlfVkVSU0lPTl9TSE9SVCA9ICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQorX1BZX1ZFUlNJT05fU0hPUlRfTk9fRE9UID0gJyVkJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KIF9QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5wcmVmaXgpCiBfQkFTRV9QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5iYXNlX3ByZWZpeCkKIF9FWEVDX1BSRUZJWCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWNfcHJlZml4KQpAQCAtMjE1LDcgKzIxNSw3IEBACiAgICAgIyBSZWdleGVzIG5lZWRlZCBmb3IgcGFyc2luZyBNYWtlZmlsZSAoYW5kIHNpbWlsYXIgc3ludGF4ZXMsCiAgICAgIyBsaWtlIG9sZC1zdHlsZSBTZXR1cCBmaWxlcykuCiAgICAgaW1wb3J0IHJlCi0gICAgX3ZhcmlhYmxlX3J4ID0gcmUuY29tcGlsZSgiKFthLXpBLVpdW2EtekEtWjAtOV9dKylccyo9XHMqKC4qKSIpCisgICAgX3ZhcmlhYmxlX3J4ID0gcmUuY29tcGlsZShyIihbYS16QS1aXVthLXpBLVowLTlfXSspXHMqPVxzKiguKikiKQogICAgIF9maW5kdmFyMV9yeCA9IHJlLmNvbXBpbGUociJcJFwoKFtBLVphLXpdW0EtWmEtejAtOV9dKilcKSIpCiAgICAgX2ZpbmR2YXIyX3J4ID0gcmUuY29tcGlsZShyIlwkeyhbQS1aYS16XVtBLVphLXowLTlfXSopfSIpCiAKQEAgLTMzNyw2ICszMzcsOCBAQAogICAgICAgICBjb25maWdfZGlyX25hbWUgPSAnY29uZmlnLSVzJXMnICUgKF9QWV9WRVJTSU9OX1NIT1JULCBzeXMuYWJpZmxhZ3MpCiAgICAgZWxzZToKICAgICAgICAgY29uZmlnX2Rpcl9uYW1lID0gJ2NvbmZpZycKKyAgICBpZiBoYXNhdHRyKHN5cy5pbXBsZW1lbnRhdGlvbiwgJ19tdWx0aWFyY2gnKToKKyAgICAgICAgY29uZmlnX2Rpcl9uYW1lICs9ICctJXMnICUgc3lzLmltcGxlbWVudGF0aW9uLl9tdWx0aWFyY2gKICAgICByZXR1cm4gb3MucGF0aC5qb2luKGdldF9wYXRoKCdzdGRsaWInKSwgY29uZmlnX2Rpcl9uYW1lLCAnTWFrZWZpbGUnKQogCiBkZWYgX2dlbmVyYXRlX3Bvc2l4X3ZhcnMoKToKQEAgLTM3OSwxNCArMzgxLDE0IEBACiAgICAgIyBfc3lzY29uZmlnZGF0YSBtb2R1bGUgbWFudWFsbHkgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlIGJ1aWxkIHZhcnMuCiAgICAgIyBUaGlzIGlzIG1vcmUgdGhhbiBzdWZmaWNpZW50IGZvciBlbnN1cmluZyB0aGUgc3Vic2VxdWVudCBjYWxsIHRvCiAgICAgIyBnZXRfcGxhdGZvcm0oKSBzdWNjZWVkcy4KLSAgICBuYW1lID0gJ19zeXNjb25maWdkYXRhJworICAgIG5hbWUgPSAnX3N5c2NvbmZpZ2RhdGFfJyArIHN5cy5hYmlmbGFncwogICAgIGlmICdkYXJ3aW4nIGluIHN5cy5wbGF0Zm9ybToKICAgICAgICAgaW1wb3J0IHR5cGVzCiAgICAgICAgIG1vZHVsZSA9IHR5cGVzLk1vZHVsZVR5cGUobmFtZSkKICAgICAgICAgbW9kdWxlLmJ1aWxkX3RpbWVfdmFycyA9IHZhcnMKICAgICAgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBtb2R1bGUKIAotICAgIHB5YnVpbGRkaXIgPSAnYnVpbGQvbGliLiVzLSVzJyAlIChnZXRfcGxhdGZvcm0oKSwgc3lzLnZlcnNpb25bOjNdKQorICAgIHB5YnVpbGRkaXIgPSAnYnVpbGQvbGliLiVzLSVzJyAlIChnZXRfcGxhdGZvcm0oKSwgX1BZX1ZFUlNJT05fU0hPUlQpCiAgICAgaWYgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CiAgICAgICAgIHB5YnVpbGRkaXIgKz0gJy1weWRlYnVnJwogICAgIG9zLm1ha2VkaXJzKHB5YnVpbGRkaXIsIGV4aXN0X29rPVRydWUpCkBAIC00MDUsNyArNDA3LDkgQEAKIGRlZiBfaW5pdF9wb3NpeCh2YXJzKToKICAgICAiIiJJbml0aWFsaXplIHRoZSBtb2R1bGUgYXMgYXBwcm9wcmlhdGUgZm9yIFBPU0lYIHN5c3RlbXMuIiIiCiAgICAgIyBfc3lzY29uZmlnZGF0YSBpcyBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZSwgc2VlIF9nZW5lcmF0ZV9wb3NpeF92YXJzKCkKLSAgICBmcm9tIF9zeXNjb25maWdkYXRhIGltcG9ydCBidWlsZF90aW1lX3ZhcnMKKyAgICBuYW1lID0gJ19zeXNjb25maWdkYXRhXycgKyBzeXMuYWJpZmxhZ3MKKyAgICBfdGVtcCA9IF9faW1wb3J0X18obmFtZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWydidWlsZF90aW1lX3ZhcnMnXSwgMCkKKyAgICBidWlsZF90aW1lX3ZhcnMgPSBfdGVtcC5idWlsZF90aW1lX3ZhcnMKICAgICB2YXJzLnVwZGF0ZShidWlsZF90aW1lX3ZhcnMpCiAKIGRlZiBfaW5pdF9ub25fcG9zaXgodmFycyk6CkBAIC01MTgsNyArNTIyLDcgQEAKICAgICAgICAgX0NPTkZJR19WQVJTWydleGVjX3ByZWZpeCddID0gX0VYRUNfUFJFRklYCiAgICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbiddID0gX1BZX1ZFUlNJT04KICAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uX3Nob3J0J10gPSBfUFlfVkVSU0lPTl9TSE9SVAotICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fbm9kb3QnXSA9IF9QWV9WRVJTSU9OWzBdICsgX1BZX1ZFUlNJT05bMl0KKyAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uX25vZG90J10gPSBfUFlfVkVSU0lPTl9TSE9SVF9OT19ET1QKICAgICAgICAgX0NPTkZJR19WQVJTWydpbnN0YWxsZWRfYmFzZSddID0gX0JBU0VfUFJFRklYCiAgICAgICAgIF9DT05GSUdfVkFSU1snYmFzZSddID0gX1BSRUZJWAogICAgICAgICBfQ09ORklHX1ZBUlNbJ2luc3RhbGxlZF9wbGF0YmFzZSddID0gX0JBU0VfRVhFQ19QUkVGSVgKZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggNzIxZjlkNy4uOTYwYzY3MyAxMDA3NTUKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTY0LDcgKzY0LDEwIEBACiAgICAgcGFzcwogCiAjIGZyb20gdGFyZmlsZSBpbXBvcnQgKgotX19hbGxfXyA9IFsiVGFyRmlsZSIsICJUYXJJbmZvIiwgImlzX3RhcmZpbGUiLCAiVGFyRXJyb3IiXQorX19hbGxfXyA9IFsiVGFyRmlsZSIsICJUYXJJbmZvIiwgImlzX3RhcmZpbGUiLCAiVGFyRXJyb3IiLCAiUmVhZEVycm9yIiwKKyAgICAgICAgICAgIkNvbXByZXNzaW9uRXJyb3IiLCAiU3RyZWFtRXJyb3IiLCAiRXh0cmFjdEVycm9yIiwgIkhlYWRlckVycm9yIiwKKyAgICAgICAgICAgIkVOQ09ESU5HIiwgIlVTVEFSX0ZPUk1BVCIsICJHTlVfRk9STUFUIiwgIlBBWF9GT1JNQVQiLAorICAgICAgICAgICAiREVGQVVMVF9GT1JNQVQiLCAib3BlbiJdCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgdGFyIGNvbnN0YW50cwpAQCAtMTQxLDcgKzE0NCw3IEBACiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIGluaXRpYWxpemF0aW9uCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKK2lmIG9zLm5hbWUgPT0gIm50IjoKICAgICBFTkNPRElORyA9ICJ1dGYtOCIKIGVsc2U6CiAgICAgRU5DT0RJTkcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKQEAgLTIzNzQsOSArMjM3NywzMiBAQAogICAgICAgICAiIiJQcm92aWRlIGFuIGl0ZXJhdG9yIG9iamVjdC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuX2xvYWRlZDoKLSAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYubWVtYmVycykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBUYXJJdGVyKHNlbGYpCisgICAgICAgICAgICB5aWVsZCBmcm9tIHNlbGYubWVtYmVycworICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBZaWVsZCBpdGVtcyB1c2luZyBUYXJGaWxlJ3MgbmV4dCgpIG1ldGhvZC4KKyAgICAgICAgIyBXaGVuIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkLCBzZXQgVGFyRmlsZSBhcyBfbG9hZGVkLgorICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgIyBGaXggZm9yIFNGICMxMTAwNDI5OiBVbmRlciByYXJlIGNpcmN1bXN0YW5jZXMgaXQgY2FuCisgICAgICAgICMgaGFwcGVuIHRoYXQgZ2V0bWVtYmVycygpIGlzIGNhbGxlZCBkdXJpbmcgaXRlcmF0aW9uLAorICAgICAgICAjIHdoaWNoIHdpbGwgaGF2ZSBhbHJlYWR5IGV4aGF1c3RlZCB0aGUgbmV4dCgpIG1ldGhvZC4KKyAgICAgICAgaWYgc2VsZi5maXJzdG1lbWJlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQorICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICAgICAgeWllbGQgdGFyaW5mbworCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBpbmRleCA8IGxlbihzZWxmLm1lbWJlcnMpOgorICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm1lbWJlcnNbaW5kZXhdCisgICAgICAgICAgICBlbGlmIG5vdCBzZWxmLl9sb2FkZWQ6CisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYubmV4dCgpCisgICAgICAgICAgICAgICAgaWYgbm90IHRhcmluZm86CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICAgICAgeWllbGQgdGFyaW5mbwogCiAgICAgZGVmIF9kYmcoc2VsZiwgbGV2ZWwsIG1zZyk6CiAgICAgICAgICIiIldyaXRlIGRlYnVnZ2luZyBvdXRwdXQgdG8gc3lzLnN0ZGVyci4KQEAgLTIzOTcsNDUgKzI0MjMsNiBAQAogICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CiAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQotIyBjbGFzcyBUYXJGaWxlCi0KLWNsYXNzIFRhckl0ZXI6Ci0gICAgIiIiSXRlcmF0b3IgQ2xhc3MuCi0KLSAgICAgICBmb3IgdGFyaW5mbyBpbiBUYXJGaWxlKC4uLik6Ci0gICAgICAgICAgIHN1aXRlLi4uCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZmlsZSk6Ci0gICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckl0ZXIgb2JqZWN0LgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi50YXJmaWxlID0gdGFyZmlsZQotICAgICAgICBzZWxmLmluZGV4ID0gMAotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgIiIiUmV0dXJuIGl0ZXJhdG9yIG9iamVjdC4KLSAgICAgICAgIiIiCi0gICAgICAgIHJldHVybiBzZWxmCi0gICAgZGVmIF9fbmV4dF9fKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgaXRlbSB1c2luZyBUYXJGaWxlJ3MgbmV4dCgpIG1ldGhvZC4KLSAgICAgICAgICAgV2hlbiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZCwgc2V0IFRhckZpbGUgYXMgX2xvYWRlZC4KLSAgICAgICAgIiIiCi0gICAgICAgICMgRml4IGZvciBTRiAjMTEwMDQyOTogVW5kZXIgcmFyZSBjaXJjdW1zdGFuY2VzIGl0IGNhbgotICAgICAgICAjIGhhcHBlbiB0aGF0IGdldG1lbWJlcnMoKSBpcyBjYWxsZWQgZHVyaW5nIGl0ZXJhdGlvbiwKLSAgICAgICAgIyB3aGljaCB3aWxsIGNhdXNlIFRhckl0ZXIgdG8gc3RvcCBwcmVtYXR1cmVseS4KLQotICAgICAgICBpZiBzZWxmLmluZGV4ID09IDAgYW5kIHNlbGYudGFyZmlsZS5maXJzdG1lbWJlciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubmV4dCgpCi0gICAgICAgIGVsaWYgc2VsZi5pbmRleCA8IGxlbihzZWxmLnRhcmZpbGUubWVtYmVycyk6Ci0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm1lbWJlcnNbc2VsZi5pbmRleF0KLSAgICAgICAgZWxpZiBub3Qgc2VsZi50YXJmaWxlLl9sb2FkZWQ6Ci0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm5leHQoKQotICAgICAgICAgICAgaWYgbm90IHRhcmluZm86Ci0gICAgICAgICAgICAgICAgc2VsZi50YXJmaWxlLl9sb2FkZWQgPSBUcnVlCi0gICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgotICAgICAgICBzZWxmLmluZGV4ICs9IDEKLSAgICAgICAgcmV0dXJuIHRhcmluZm8KIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIGV4cG9ydGVkIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvTGliL3RlbG5ldGxpYi5weSBiL0xpYi90ZWxuZXRsaWIucHkKaW5kZXggNzJkYWJjNy4uYjA4NjNiMSAxMDA2NDQKLS0tIGEvTGliL3RlbG5ldGxpYi5weQorKysgYi9MaWIvdGVsbmV0bGliLnB5CkBAIC02MzcsNiArNjM3LDEyIEBACiAgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgogICAgICAgICByZXR1cm4gKC0xLCBOb25lLCB0ZXh0KQogCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKIAogZGVmIHRlc3QoKToKICAgICAiIiJUZXN0IHByb2dyYW0gZm9yIHRlbG5ldGxpYi4KQEAgLTY2MCwxMSArNjY2LDEwIEBACiAgICAgICAgICAgICBwb3J0ID0gaW50KHBvcnRzdHIpCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgcG9ydCA9IHNvY2tldC5nZXRzZXJ2YnluYW1lKHBvcnRzdHIsICd0Y3AnKQotICAgIHRuID0gVGVsbmV0KCkKLSAgICB0bi5zZXRfZGVidWdsZXZlbChkZWJ1Z2xldmVsKQotICAgIHRuLm9wZW4oaG9zdCwgcG9ydCwgdGltZW91dD0wLjUpCi0gICAgdG4uaW50ZXJhY3QoKQotICAgIHRuLmNsb3NlKCkKKyAgICB3aXRoIFRlbG5ldCgpIGFzIHRuOgorICAgICAgICB0bi5zZXRfZGVidWdsZXZlbChkZWJ1Z2xldmVsKQorICAgICAgICB0bi5vcGVuKGhvc3QsIHBvcnQsIHRpbWVvdXQ9MC41KQorICAgICAgICB0bi5pbnRlcmFjdCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVtcGZpbGUucHkgYi9MaWIvdGVtcGZpbGUucHkKaW5kZXggYWQ2ODdiOS4uNjE0NjIzNSAxMDA2NDQKLS0tIGEvTGliL3RlbXBmaWxlLnB5CisrKyBiL0xpYi90ZW1wZmlsZS5weQpAQCAtNzk3LDcgKzc5Nyw2IEBACiAgICAgICAgIF9zaHV0aWwucm10cmVlKG5hbWUpCiAgICAgICAgIF93YXJuaW5ncy53YXJuKHdhcm5fbWVzc2FnZSwgUmVzb3VyY2VXYXJuaW5nKQogCi0KICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiPHt9IHshcn0+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYubmFtZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvX19tYWluX18ucHkgYi9MaWIvdGVzdC9fX21haW5fXy5weQppbmRleCBkNWZiZTE1Li4xOWE2YjJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9fX21haW5fXy5weQorKysgYi9MaWIvdGVzdC9fX21haW5fXy5weQpAQCAtMSwzICsxLDIgQEAKLWZyb20gdGVzdCBpbXBvcnQgcmVncnRlc3QKLQotcmVncnRlc3QubWFpbl9pbl90ZW1wX2N3ZCgpCitmcm9tIHRlc3QubGlicmVncnRlc3QgaW1wb3J0IG1haW4KK21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvX3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5IGIvTGliL3Rlc3QvX3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5CmluZGV4IDJiZWNmYWEuLmMwMDg0NmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L190ZXN0X211bHRpcHJvY2Vzc2luZy5weQorKysgYi9MaWIvdGVzdC9fdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKQEAgLTE2MjgsMTMgKzE2MjgsMzMgQEAKICAgICAgICAgZCA9IFthLCBiXQogICAgICAgICBlID0gc2VsZi5saXN0KGQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICAgICBlWzpdLAorICAgICAgICAgICAgW2VsZW1lbnRbOl0gZm9yIGVsZW1lbnQgaW4gZV0sCiAgICAgICAgICAgICBbWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldLCBbMCwgMSwgMiwgMywgNCwgMCwgMSwgMiwgMywgNF1dCiAgICAgICAgICAgICApCiAKICAgICAgICAgZiA9IHNlbGYubGlzdChbYV0pCiAgICAgICAgIGEuYXBwZW5kKCdoZWxsbycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZls6XSwgW1swLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAnaGVsbG8nXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZlswXVs6XSwgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksICdoZWxsbyddKQorCisgICAgZGVmIHRlc3RfbGlzdF9wcm94eV9pbl9saXN0KHNlbGYpOgorICAgICAgICBhID0gc2VsZi5saXN0KFtzZWxmLmxpc3QocmFuZ2UoMykpIGZvciBfaSBpbiByYW5nZSgzKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2lubmVyWzpdIGZvciBpbm5lciBpbiBhXSwgW1swLCAxLCAyXV0gKiAzKQorCisgICAgICAgIGFbMF1bLTFdID0gNTUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzBdWzpdLCBbMCwgMSwgNTVdKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCAzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVtpXVs6XSwgWzAsIDEsIDJdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxXS5wb3AoKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYVsxXSksIDIpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIDMsIDIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYVtpXSksIDMpCisKKyAgICAgICAgZGVsIGEKKworICAgICAgICBiID0gc2VsZi5saXN0KCkKKyAgICAgICAgYi5hcHBlbmQoYikKKyAgICAgICAgZGVsIGIKIAogICAgIGRlZiB0ZXN0X2RpY3Qoc2VsZik6CiAgICAgICAgIGQgPSBzZWxmLmRpY3QoKQpAQCAtMTY0Niw2ICsxNjY2LDUyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGQudmFsdWVzKCkpLCBbY2hyKGkpIGZvciBpIGluIGluZGljZXNdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChkLml0ZW1zKCkpLCBbKGksIGNocihpKSkgZm9yIGkgaW4gaW5kaWNlc10pCiAKKyAgICBkZWYgdGVzdF9kaWN0X3Byb3h5X25lc3RlZChzZWxmKToKKyAgICAgICAgcGV0cyA9IHNlbGYuZGljdChmZXJyZXRzPTIsIGhhbXN0ZXJzPTQpCisgICAgICAgIHN1cHBsaWVzID0gc2VsZi5kaWN0KHdhdGVyPTEwLCBmZWVkPTMpCisgICAgICAgIGQgPSBzZWxmLmRpY3QocGV0cz1wZXRzLCBzdXBwbGllcz1zdXBwbGllcykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1cHBsaWVzWyd3YXRlciddLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydzdXBwbGllcyddWyd3YXRlciddLCAxMCkKKworICAgICAgICBkWydzdXBwbGllcyddWydibGFua2V0cyddID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1cHBsaWVzWydibGFua2V0cyddLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ3N1cHBsaWVzJ11bJ2JsYW5rZXRzJ10sIDUpCisKKyAgICAgICAgZFsnc3VwcGxpZXMnXVsnd2F0ZXInXSA9IDcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdXBwbGllc1snd2F0ZXInXSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydzdXBwbGllcyddWyd3YXRlciddLCA3KQorCisgICAgICAgIGRlbCBwZXRzCisgICAgICAgIGRlbCBzdXBwbGllcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ3BldHMnXVsnZmVycmV0cyddLCAyKQorICAgICAgICBkWydzdXBwbGllcyddWydibGFua2V0cyddID0gMTEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydzdXBwbGllcyddWydibGFua2V0cyddLCAxMSkKKworICAgICAgICBwZXRzID0gZFsncGV0cyddCisgICAgICAgIHN1cHBsaWVzID0gZFsnc3VwcGxpZXMnXQorICAgICAgICBzdXBwbGllc1snd2F0ZXInXSA9IDcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdXBwbGllc1snd2F0ZXInXSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydzdXBwbGllcyddWyd3YXRlciddLCA3KQorCisgICAgICAgIGQuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdXBwbGllc1snd2F0ZXInXSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwZXRzWydoYW1zdGVycyddLCA0KQorCisgICAgICAgIGwgPSBzZWxmLmxpc3QoW3BldHMsIHN1cHBsaWVzXSkKKyAgICAgICAgbFswXVsnbWFybW90cyddID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBldHNbJ21hcm1vdHMnXSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWzBdWydtYXJtb3RzJ10sIDEpCisKKyAgICAgICAgZGVsIHBldHMKKyAgICAgICAgZGVsIHN1cHBsaWVzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFswXVsnbWFybW90cyddLCAxKQorCisgICAgICAgIG91dGVyID0gc2VsZi5saXN0KFtbODgsIDk5XSwgbF0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShvdXRlclswXSwgbGlzdCkgICMgTm90IGEgTGlzdFByb3h5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0ZXJbLTFdWy0xXVsnZmVlZCddLCAzKQorCiAgICAgZGVmIHRlc3RfbmFtZXNwYWNlKHNlbGYpOgogICAgICAgICBuID0gc2VsZi5OYW1lc3BhY2UoKQogICAgICAgICBuLm5hbWUgPSAnQm9iJwpAQCAtMTY2OCw2ICsxNzM0LDEwIEBACiBkZWYgbXVsKHgsIHkpOgogICAgIHJldHVybiB4KnkKIAorZGVmIHJhaXNlX2xhcmdlX3ZhbHVlcnJvcih3YWl0KToKKyAgICB0aW1lLnNsZWVwKHdhaXQpCisgICAgcmFpc2UgVmFsdWVFcnJvcigieCIgKiAxMDI0KioyKQorCiBjbGFzcyBTYXlXaGVuRXJyb3IoVmFsdWVFcnJvcik6IHBhc3MKIAogZGVmIGV4Y2VwdGlvbl90aHJvd2luZ19nZW5lcmF0b3IodG90YWwsIHdoZW4pOgpAQCAtMTkxMCw2ICsxOTgwLDI2IEBACiAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CiAgICAgICAgICAgICAgICAgcC5hcHBseShzZWxmLl90ZXN0X3dyYXBwZWRfZXhjZXB0aW9uKQogCisgICAgZGVmIHRlc3RfbWFwX25vX2ZhaWxmYXN0KHNlbGYpOgorICAgICAgICAjIElzc3VlICMyMzk5MjogdGhlIGZhaWwtZmFzdCBiZWhhdmlvdXIgd2hlbiBhbiBleGNlcHRpb24gaXMgcmFpc2VkCisgICAgICAgICMgZHVyaW5nIG1hcCgpIHdvdWxkIG1ha2UgUG9vbC5qb2luKCkgZGVhZGxvY2ssIGJlY2F1c2UgYSB3b3JrZXIKKyAgICAgICAgIyBwcm9jZXNzIHdvdWxkIGZpbGwgdGhlIHJlc3VsdCBxdWV1ZSAoYWZ0ZXIgdGhlIHJlc3VsdCBoYW5kbGVyIHRocmVhZAorICAgICAgICAjIHRlcm1pbmF0ZWQsIGhlbmNlIG5vdCBkcmFpbmluZyBpdCBhbnltb3JlKS4KKworICAgICAgICB0X3N0YXJ0ID0gdGltZS50aW1lKCkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgd2l0aCBzZWxmLlBvb2woMikgYXMgcDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHAubWFwKHJhaXNlX2xhcmdlX3ZhbHVlcnJvciwgWzAsIDFdKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC41KQorICAgICAgICAgICAgICAgICAgICBwLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgcC5qb2luKCkKKworICAgICAgICAjIGNoZWNrIHRoYXQgd2UgaW5kZWVkIHdhaXRlZCBmb3IgYWxsIGpvYnMKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKHRpbWUudGltZSgpIC0gdF9zdGFydCwgMC45KQorCiAKIGRlZiByYWlzaW5nKCk6CiAgICAgcmFpc2UgS2V5RXJyb3IoImtleSIpCkBAIC0zNzY3LDcgKzM4NTcsNyBAQAogICAgICAgICBwLnN0ZGVyci5jbG9zZSgpCiAgICAgICAgIGV4cGVjdGVkID0gJ3NlbWFwaG9yZV90cmFja2VyOiBUaGVyZSBhcHBlYXIgdG8gYmUgMiBsZWFrZWQgc2VtYXBob3JlcycKICAgICAgICAgc2VsZi5hc3NlcnRSZWdleChlcnIsIGV4cGVjdGVkKQotICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KGVyciwgJ3NlbWFwaG9yZV90cmFja2VyOiAlcjogXFtFcnJubycgJSBuYW1lMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleChlcnIsIHInc2VtYXBob3JlX3RyYWNrZXI6ICVyOiBcW0Vycm5vJyAlIG5hbWUxKQogCiAjCiAjIE1peGlucwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvYW5uX21vZHVsZS5weSBiL0xpYi90ZXN0L2Fubl9tb2R1bGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2Yjg3ZAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2Fubl9tb2R1bGUucHkKQEAgLTAsMCArMSw1MyBAQAorCisKKyIiIgorVGhlIG1vZHVsZSBmb3IgdGVzdGluZyB2YXJpYWJsZSBhbm5vdGF0aW9ucy4KK0VtcHR5IGxpbmVzIGFib3ZlIGFyZSBmb3IgZ29vZCByZWFzb24gKHRlc3RpbmcgZm9yIGNvcnJlY3QgbGluZSBudW1iZXJzKQorIiIiCisKK2Zyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAorCitfX2Fubm90YXRpb25zX19bMV0gPSAyCisKK2NsYXNzIEM6CisKKyAgICB4ID0gNTsgeTogT3B0aW9uYWxbJ0MnXSA9IE5vbmUKKworZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCit4OiBpbnQgPSA1OyB5OiBzdHIgPSB4OyBmOiBUdXBsZVtpbnQsIGludF0KKworY2xhc3MgTSh0eXBlKToKKworICAgIF9fYW5ub3RhdGlvbnNfX1snMTIzJ10gPSAxMjMKKyAgICBvOiB0eXBlID0gb2JqZWN0CisKKyhwYXJzKTogYm9vbCA9IFRydWUKKworY2xhc3MgRChDKToKKyAgICBqOiBzdHIgPSAnaGknOyBrOiBzdHI9ICdieWUnCisKK2Zyb20gdHlwZXMgaW1wb3J0IG5ld19jbGFzcworaF9jbGFzcyA9IG5ld19jbGFzcygnSCcsIChDLCkpCitqX2NsYXNzID0gbmV3X2NsYXNzKCdKJykKKworY2xhc3MgRigpOgorICAgIHo6IGludCA9IDUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgIHBhc3MKKworY2xhc3MgWShGKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHN1cGVyKEYsIHNlbGYpLl9faW5pdF9fKDEyMykKKworY2xhc3MgTWV0YSh0eXBlKToKKyAgICBkZWYgX19uZXdfXyhtZXRhLCBuYW1lLCBiYXNlcywgbmFtZXNwYWNlKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKCkuX19uZXdfXyhtZXRhLCBuYW1lLCBiYXNlcywgbmFtZXNwYWNlKQorCitjbGFzcyBTKG1ldGFjbGFzcyA9IE1ldGEpOgorICAgIHg6IHN0ciA9ICdzb21ldGhpbmcnCisgICAgeTogc3RyID0gJ3NvbWV0aGluZyBlbHNlJworCitkZWYgZm9vKHg6IGludCA9IDEwKToKKyAgICBkZWYgYmFyKHk6IExpc3Rbc3RyXSk6CisgICAgICAgIHg6IHN0ciA9ICd5ZXMnCisgICAgYmFyKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2Fubl9tb2R1bGUyLnB5IGIvTGliL3Rlc3QvYW5uX21vZHVsZTIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjZjViMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2Fubl9tb2R1bGUyLnB5CkBAIC0wLDAgKzEsMzYgQEAKKyIiIgorU29tZSBjb3JyZWN0IHN5bnRheCBmb3IgdmFyaWFibGUgYW5ub3RhdGlvbiBoZXJlLgorTW9yZSBleGFtcGxlcyBhcmUgaW4gdGVzdF9ncmFtbWFyIGFuZCB0ZXN0X3BhcnNlci4KKyIiIgorCitmcm9tIHR5cGluZyBpbXBvcnQgbm9fdHlwZV9jaGVjaywgQ2xhc3NWYXIKKworaTogaW50ID0gMQorajogaW50Cit4OiBmbG9hdCA9IGkvMTAKKworZGVmIGYoKToKKyAgICBjbGFzcyBDOiAuLi4KKyAgICByZXR1cm4gQygpCisKK2YoKS5uZXdfYXR0cjogb2JqZWN0ID0gb2JqZWN0KCkKKworY2xhc3MgQzoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgeDogaW50KSAtPiBOb25lOgorICAgICAgICBzZWxmLnggPSB4CisKK2MgPSBDKDUpCitjLm5ld19hdHRyOiBpbnQgPSAxMAorCitfX2Fubm90YXRpb25zX18gPSB7fQorCisKK0Bub190eXBlX2NoZWNrCitjbGFzcyBOVEM6CisgICAgZGVmIG1ldGgoc2VsZiwgcGFyYW06IGNvbXBsZXgpIC0+IE5vbmU6CisgICAgICAgIC4uLgorCitjbGFzcyBDVjoKKyAgICB2YXI6IENsYXNzVmFyWydDViddCisKK0NWLnZhciA9IENWKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2Fubl9tb2R1bGUzLnB5IGIvTGliL3Rlc3QvYW5uX21vZHVsZTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNjZDdiZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2Fubl9tb2R1bGUzLnB5CkBAIC0wLDAgKzEsMTggQEAKKyIiIgorQ29ycmVjdCBzeW50YXggZm9yIHZhcmlhYmxlIGFubm90YXRpb24gdGhhdCBzaG91bGQgZmFpbCBhdCBydW50aW1lCitpbiBhIGNlcnRhaW4gbWFubmVyLiBNb3JlIGV4YW1wbGVzIGFyZSBpbiB0ZXN0X2dyYW1tYXIgYW5kIHRlc3RfcGFyc2VyLgorIiIiCisKK2RlZiBmX2JhZF9hbm4oKToKKyAgICBfX2Fubm90YXRpb25zX19bMV0gPSAyCisKK2NsYXNzIENfT0s6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHg6IGludCkgLT4gTm9uZToKKyAgICAgICAgc2VsZi54OiBub19zdWNoX25hbWUgPSB4ICAjIFRoaXMgb25lIGlzIE9LIGFzIHByb3Bvc2VkIGJ5IEd1aWRvCisKK2NsYXNzIERfYmFkX2FubjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgeDogaW50KSAtPiBOb25lOgorICAgICAgICBzZmVsLnk6IGludCA9IDAKKworZGVmIGdfYmFkX2FubigpOgorICAgIG5vX3N1Y2hfbmFtZS5hdHRyOiBpbnQgPSAwCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb3Rlc3RzLnB5IGIvTGliL3Rlc3QvYXVkaW90ZXN0cy5weQppbmRleCAwYWUyMjQyLi5kM2U4ZTllIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9hdWRpb3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L2F1ZGlvdGVzdHMucHkKQEAgLTEsOSArMSw4IEBACiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgZmluZGZpbGUsIFRFU1RGTiwgdW5saW5rCi1pbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBhcnJheQogaW1wb3J0IGlvCiBpbXBvcnQgcGlja2xlCi1pbXBvcnQgc3lzCisKIAogY2xhc3MgVW5zZWVrYWJsZUlPKGlvLkZpbGVJTyk6CiAgICAgZGVmIHRlbGwoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdXRvdGVzdC5weSBiL0xpYi90ZXN0L2F1dG90ZXN0LnB5CmluZGV4IDQxYzIwODguLmZhODVjYzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2F1dG90ZXN0LnB5CisrKyBiL0xpYi90ZXN0L2F1dG90ZXN0LnB5CkBAIC0xLDYgKzEsNSBAQAogIyBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgcmVncnRlc3QucHkgZnJvbSB0aGUgY21kbGluZS4KICMgSXQgY2FuIGJlIGVzcGVjaWFsbHkgaGFuZHkgaWYgeW91J3JlIGluIGFuIGludGVyYWN0aXZlIHNoZWxsLCBlLmcuLAogIyBmcm9tIHRlc3QgaW1wb3J0IGF1dG90ZXN0LgotCi1mcm9tIHRlc3QgaW1wb3J0IHJlZ3J0ZXN0Ci1yZWdydGVzdC5tYWluKCkKK2Zyb20gdGVzdC5saWJyZWdydGVzdCBpbXBvcnQgbWFpbgorbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9iYWRzeW50YXhfYXN5bmMxLnB5IGIvTGliL3Rlc3QvYmFkc3ludGF4X2FzeW5jMS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4NWUyOS4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9iYWRzeW50YXhfYXN5bmMxLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1hc3luYyBkZWYgZm9vKGE9YXdhaXQgc29tZXRoaW5nKCkpOgotICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2JhZHN5bnRheF9hc3luYzIucHkgYi9MaWIvdGVzdC9iYWRzeW50YXhfYXN5bmMyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjg1ZTI5Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L2JhZHN5bnRheF9hc3luYzIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWFzeW5jIGRlZiBmb28oYT1hd2FpdCBzb21ldGhpbmcoKSk6Ci0gICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvYmFkc3ludGF4X2FzeW5jMy5weSBiL0xpYi90ZXN0L2JhZHN5bnRheF9hc3luYzMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZTFiYzUuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvYmFkc3ludGF4X2FzeW5jMy5weQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYXN5bmMgZGVmIGZvbygpOgotICAgIFtpIGFzeW5jIGZvciBpIGluIGVsc10KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2JhZHN5bnRheF9hc3luYzQucHkgYi9MaWIvdGVzdC9iYWRzeW50YXhfYXN5bmM0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDMzYjI4Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L2JhZHN5bnRheF9hc3luYzQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWFzeW5jIGRlZiBmb28oKToKLSAgICBhd2FpdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvYmFkc3ludGF4X2FzeW5jNS5weSBiL0xpYi90ZXN0L2JhZHN5bnRheF9hc3luYzUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMTlhZjYuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvYmFkc3ludGF4X2FzeW5jNS5weQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZGVmIGZvbygpOgotICAgIGF3YWl0IHNvbWV0aGluZygpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9iYWRzeW50YXhfYXN5bmM2LnB5IGIvTGliL3Rlc3QvYmFkc3ludGF4X2FzeW5jNi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwYTIzZC4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9iYWRzeW50YXhfYXN5bmM2LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1hc3luYyBkZWYgZm9vKCk6Ci0gICAgeWllbGQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2JhZHN5bnRheF9hc3luYzcucHkgYi9MaWIvdGVzdC9iYWRzeW50YXhfYXN5bmM3LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU0YmY5Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L2JhZHN5bnRheF9hc3luYzcucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWFzeW5jIGRlZiBmb28oKToKLSAgICB5aWVsZCBmcm9tIFtdCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9iYWRzeW50YXhfYXN5bmM4LnB5IGIvTGliL3Rlc3QvYmFkc3ludGF4X2FzeW5jOC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2MzZmOS4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9iYWRzeW50YXhfYXN5bmM4LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1hc3luYyBkZWYgZm9vKCk6Ci0gICAgYXdhaXQgYXdhaXQgZnV0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jYXBhdGgvMGU0MDE1YjkuMCBiL0xpYi90ZXN0L2NhcGF0aC8wZTQwMTViOS4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmQyNTliLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L2NhcGF0aC8wZTQwMTViOS4wCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlDbFRDQ0FmNmdBd0lCQWdJSkFLR1U5NXdLUjhwVE1BMEdDU3FHU0liM0RRRUJCUVVBTUhBeEN6QUpCZ05WCi1CQVlUQWxoWk1SY3dGUVlEVlFRSERBNURZWE4wYkdVZ1FXNTBhSEpoZURFak1DRUdBMVVFQ2d3YVVIbDBhRzl1Ci1JRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4SXpBaEJnTlZCQU1NR25ObGJHWXRjMmxuYm1Wa0xuQjVkR2h2Ci1iblJsYzNRdWJtVjBNQjRYRFRFME1URXdNakU0TURreU9Wb1hEVEkwTVRBek1ERTRNRGt5T1Zvd2NERUxNQWtHCi1BMVVFQmhNQ1dGa3hGekFWQmdOVkJBY01Ea05oYzNSc1pTQkJiblJvY21GNE1TTXdJUVlEVlFRS0RCcFFlWFJvCi1iMjRnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmpFak1DRUdBMVVFQXd3YWMyVnNaaTF6YVdkdVpXUXVjSGwwCi1hRzl1ZEdWemRDNXVaWFF3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU5EWFFYVzl0anlaCi1YdDBJdjJ0TEwxK2ppbnI0d0dnMzZpb0xETEZrTWYrMlkxR0wwdjBCbktZRzROMU9LbEFVMTVMWEdlR2VyOHZtCi1Tdi95SXZtZHJFTHZoQWJibzN3NGE5VE1ZUUE0WGtJVkxkdnUzbXZOT0FldCs4UE1KeG4yNmRiRGhHODA5QUx2Ci1FSFk1N2xRc0JTM0c1OVJaeUJQVnFBcW1JbVdOSm5WekFnTUJBQUdqTnpBMU1DVUdBMVVkRVFRZU1CeUNHbk5sCi1iR1l0YzJsbmJtVmtMbkI1ZEdodmJuUmxjM1F1Ym1WME1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOCi1BUUVGQlFBRGdZRUFJdXpBaGdNb3VKcE5kZjNVUkNISWluZXlvU3Q2V0svOStleVVjamxLT3JEb1hOWmFENzJoCi1UWE1lS1lvV3ZKeVZjU0xLTDhja1B0RG9iZ1AyT1R0MFVreUFhajBuK1pIYXFxMWxIMnlWZkdVQTFJTEp2NTE1Ci1DOEJxYnZWWnVxbTNpN3lnbXczYnFFL2xZTWdPcll0WFhucU9yejZudnNFNlljOVY5ckZmbE9NPQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY2FwYXRoL2IxOTMwMjE4LjAgYi9MaWIvdGVzdC9jYXBhdGgvYjE5MzAyMTguMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzMzNDljCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY2FwYXRoL2IxOTMwMjE4LjAKQEAgLTAsMCArMSwyMSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEYlRDQ0FsV2dBd0lCQWdJSkFMQ1NaTEh5MmlIUU1BMEdDU3FHU0liM0RRRUJCUVVBTUUweEN6QUpCZ05WCitCQVlUQWxoWk1TWXdKQVlEVlFRS0RCMVFlWFJvYjI0Z1UyOW1kSGRoY21VZ1JtOTFibVJoZEdsdmJpQkRRVEVXCitNQlFHQTFVRUF3d05iM1Z5TFdOaExYTmxjblpsY2pBZUZ3MHhNekF4TURReE9UUTNNRGRhRncweU16QXhNREl4CitPVFEzTURkYU1FMHhDekFKQmdOVkJBWVRBbGhaTVNZd0pBWURWUVFLREIxUWVYUm9iMjRnVTI5bWRIZGhjbVVnCitSbTkxYm1SaGRHbHZiaUJEUVRFV01CUUdBMVVFQXd3TmIzVnlMV05oTFhObGNuWmxjakNDQVNJd0RRWUpLb1pJCitodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU9mZTZlTU1ud0Myb2Ywclc1YlNiOHpndm9hNUlGN3NBM3BWCitxK3FrNmZsSmhkSm0xZTNIZXVwV2ppMlA1MExpWWlpcG45WWJqdXUxdEp5ZkZLdmY1cFNMZGgwK2JTUmg3UXkvCitBSXBoRE45Y3lEWnpGZ0ROUjdwdHBLUjBpSU1qQ2huOENhYzhTa3ZUNXgwdDVPcE1WQ0h6SnR1Sk54alVBcnRBCitNbCtrL3kwYzk5Uzc3STdQWElLczVud0liRWlGWVFkL0plQmM0THcwWCtDNUJFZDF5RWNMamJ6V3lHaGZNNE5pCiswaUJFTmJHdGdScUt6Yncxc0Z5TFI5WVk2WndZbDh3QlBDbk02QjdrNU1HNDN1ZkNFUmlIV3BNMDJLWWw5eFJ4Cis2K1Fob3RJUExpN1VZZ0ExMDlidlhHQkxUS2tVNHQwVldFWTNNeWEzNXk1ZDdVTGt4VTBDQXdFQUFhTlFNRTR3CitIUVlEVlIwT0JCWUVGTHpkWXRsMjJodlNWR3ZQNEdhYkhoNTdWZ3dMTUI4R0ExVWRJd1FZTUJhQUZMemRZdGwyCisyaHZTVkd2UDRHYWJIaDU3Vmd3TE1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCCitBSDBLOWN1TjAxMjltWTc0S3crNjY4TFpwaWRQTG5zdkRtVFlIRFZRVHU3OGtMbU5iYWpGeGdhd3IvTXR2enU0CitRZ2ZkR0gxdGxWUlhoUmhnUnkvcmVCdjU2QmY5V2cySEZ5aXNUR3JtdkNuMDlGVndLVUxlaGVxcmJDTUdaREIxCitBbzVUdkY0Qk16Zk1IczI0cFAzSzVGOWxPNE1jaHZGVkFxQTZqOXVSdDBBVXRPZU4wdTV6dXVQbE5DMjhsRzlPCitKQWIzWDRzT3A0NXIzbDUxOURLYVVMRkVNNXJRQmVKNGd2L2Iyb3BqNjZuZDBiK2dZYTNqbm9va1hXSU81MHlSCitmKy9mTkRZN0wxMzFoTEl2eEcyVGxocHZNQ2p4MmhLYVpMUkFNeDI5M2l0VHFPcSsxcnhPbHZWRSt6SVlydFVmCis5bW12dGs1N0hWanNPNmxUbzE1WXlKND0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NhcGF0aC9jZTdiODY0My4wIGIvTGliL3Rlc3QvY2FwYXRoL2NlN2I4NjQzLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDI1OWIuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvY2FwYXRoL2NlN2I4NjQzLjAKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUNsVENDQWY2Z0F3SUJBZ0lKQUtHVTk1d0tSOHBUTUEwR0NTcUdTSWIzRFFFQkJRVUFNSEF4Q3pBSkJnTlYKLUJBWVRBbGhaTVJjd0ZRWURWUVFIREE1RFlYTjBiR1VnUVc1MGFISmhlREVqTUNFR0ExVUVDZ3dhVUhsMGFHOXUKLUlGTnZablIzWVhKbElFWnZkVzVrWVhScGIyNHhJekFoQmdOVkJBTU1Hbk5sYkdZdGMybG5ibVZrTG5CNWRHaHYKLWJuUmxjM1F1Ym1WME1CNFhEVEUwTVRFd01qRTRNRGt5T1ZvWERUSTBNVEF6TURFNE1Ea3lPVm93Y0RFTE1Ba0cKLUExVUVCaE1DV0ZreEZ6QVZCZ05WQkFjTURrTmhjM1JzWlNCQmJuUm9jbUY0TVNNd0lRWURWUVFLREJwUWVYUm8KLWIyNGdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiakVqTUNFR0ExVUVBd3dhYzJWc1ppMXphV2R1WldRdWNIbDAKLWFHOXVkR1Z6ZEM1dVpYUXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTkRYUVhXOXRqeVoKLVh0MEl2MnRMTDEramlucjR3R2czNmlvTERMRmtNZisyWTFHTDB2MEJuS1lHNE4xT0tsQVUxNUxYR2VHZXI4dm0KLVN2L3lJdm1kckVMdmhBYmJvM3c0YTlUTVlRQTRYa0lWTGR2dTNtdk5PQWV0KzhQTUp4bjI2ZGJEaEc4MDlBTHYKLUVIWTU3bFFzQlMzRzU5Ulp5QlBWcUFxbUltV05KblZ6QWdNQkFBR2pOekExTUNVR0ExVWRFUVFlTUJ5Q0duTmwKLWJHWXRjMmxuYm1Wa0xuQjVkR2h2Ym5SbGMzUXVibVYwTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y04KLUFRRUZCUUFEZ1lFQUl1ekFoZ01vdUpwTmRmM1VSQ0hJaW5leW9TdDZXSy85K2V5VWNqbEtPckRvWE5aYUQ3MmgKLVRYTWVLWW9Xdkp5VmNTTEtMOGNrUHREb2JnUDJPVHQwVWt5QWFqMG4rWkhhcXExbEgyeVZmR1VBMUlMSnY1MTUKLUM4QnFidlZadXFtM2k3eWdtdzNicUUvbFlNZ09yWXRYWG5xT3J6Nm52c0U2WWM5VjlyRmZsT009Ci0tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jYXBhdGgvY2VmZjE3MTAuMCBiL0xpYi90ZXN0L2NhcGF0aC9jZWZmMTcxMC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzM0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9jYXBhdGgvY2VmZjE3MTAuMApAQCAtMCwwICsxLDIxIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURiVENDQWxXZ0F3SUJBZ0lKQUxDU1pMSHkyaUhRTUEwR0NTcUdTSWIzRFFFQkJRVUFNRTB4Q3pBSkJnTlYKK0JBWVRBbGhaTVNZd0pBWURWUVFLREIxUWVYUm9iMjRnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmlCRFFURVcKK01CUUdBMVVFQXd3TmIzVnlMV05oTFhObGNuWmxjakFlRncweE16QXhNRFF4T1RRM01EZGFGdzB5TXpBeE1ESXgKK09UUTNNRGRhTUUweEN6QUpCZ05WQkFZVEFsaFpNU1l3SkFZRFZRUUtEQjFRZVhSb2IyNGdVMjltZEhkaGNtVWcKK1JtOTFibVJoZEdsdmJpQkRRVEVXTUJRR0ExVUVBd3dOYjNWeUxXTmhMWE5sY25abGNqQ0NBU0l3RFFZSktvWkkKK2h2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT2ZlNmVNTW53QzJvZjByVzViU2I4emd2b2E1SUY3c0EzcFYKK3ErcWs2ZmxKaGRKbTFlM0hldXBXamkyUDUwTGlZaWlwbjlZYmp1dTF0SnlmRkt2ZjVwU0xkaDArYlNSaDdReS8KK0FJcGhETjljeURaekZnRE5SN3B0cEtSMGlJTWpDaG44Q2FjOFNrdlQ1eDB0NU9wTVZDSHpKdHVKTnhqVUFydEEKK01sK2sveTBjOTlTNzdJN1BYSUtzNW53SWJFaUZZUWQvSmVCYzRMdzBYK0M1QkVkMXlFY0xqYnpXeUdoZk00TmkKKzBpQkVOYkd0Z1JxS3pidzFzRnlMUjlZWTZad1lsOHdCUENuTTZCN2s1TUc0M3VmQ0VSaUhXcE0wMktZbDl4UngKKzYrUWhvdElQTGk3VVlnQTEwOWJ2WEdCTFRLa1U0dDBWV0VZM015YTM1eTVkN1VMa3hVMENBd0VBQWFOUU1FNHcKK0hRWURWUjBPQkJZRUZMemRZdGwyMmh2U1ZHdlA0R2FiSGg1N1Znd0xNQjhHQTFVZEl3UVlNQmFBRkx6ZFl0bDIKKzJodlNWR3ZQNEdhYkhoNTdWZ3dMTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUIKK0FIMEs5Y3VOMDEyOW1ZNzRLdys2NjhMWnBpZFBMbnN2RG1UWUhEVlFUdTc4a0xtTmJhakZ4Z2F3ci9NdHZ6dTQKK1FnZmRHSDF0bFZSWGhSaGdSeS9yZUJ2NTZCZjlXZzJIRnlpc1RHcm12Q24wOUZWd0tVTGVoZXFyYkNNR1pEQjEKK0FvNVR2RjRCTXpmTUhzMjRwUDNLNUY5bE80TWNodkZWQXFBNmo5dVJ0MEFVdE9lTjB1NXp1dVBsTkMyOGxHOU8KK0pBYjNYNHNPcDQ1cjNsNTE5REthVUxGRU01clFCZUo0Z3YvYjJvcGo2Nm5kMGIrZ1lhM2pub29rWFdJTzUweVIKK2YrL2ZORFk3TDEzMWhMSXZ4RzJUbGhwdk1DangyaEthWkxSQU14MjkzaXRUcU9xKzFyeE9sdlZFK3pJWXJ0VWYKKzltbXZ0azU3SFZqc082bFRvMTVZeUo0PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY21hdGhfdGVzdGNhc2VzLnR4dCBiL0xpYi90ZXN0L2NtYXRoX3Rlc3RjYXNlcy50eHQKaW5kZXggOWIwODY1My4uZGQ3ZTQ1OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvY21hdGhfdGVzdGNhc2VzLnR4dAorKysgYi9MaWIvdGVzdC9jbWF0aF90ZXN0Y2FzZXMudHh0CkBAIC01Myw2ICs1MywxMiBAQAogLS0gTVBGUiBob21lcGFnZSBhdCBodHRwOi8vd3d3Lm1wZnIub3JnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZQogLS0gTVBGUiBwcm9qZWN0LgogCistLSBBIG1pbm9yaXR5IG9mIHRoZSB0ZXN0IGNhc2VzIHdlcmUgZ2VuZXJhdGVkIHdpdGggdGhlIGhlbHAgb2YKKy0tIG1wbWF0aCAwLjE5IGF0IDEwMCBiaXQgYWNjdXJhY3kgKGh0dHA6Ly9tcG1hdGgub3JnKSB0byBpbXByb3ZlCistLSBjb3ZlcmFnZSBvZiByZWFsIGZ1bmN0aW9ucyB3aXRoIHJlYWwtdmFsdWVkIGFyZ3VtZW50cy4gVGhlc2UgYXJlCistLSB1c2VkIGluIHRlc3QudGVzdF9tYXRoLk1hdGhUZXN0cy50ZXN0X3Rlc3RmaWxlLCBhcyB3ZWxsIGFzIGluCistLSB0ZXN0X2NtYXRoLgorCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAtLSBhY29zOiBJbnZlcnNlIGNvc2luZSAtLQpAQCAtODQ4LDYgKzg1NCwxOCBAQAogYXRhbjAzMDMgYXRhbiAtMWUtMTY1IDEuMCAtPiAtMC43ODUzOTgxNjMzOTc0NDgyOCAxOTAuMzA5ODQzNzYyMjg4NzUKIGF0YW4wMzA0IGF0YW4gLTkuOTk5ODg4NjcxODI2ODMwMWUtMzIxIC0xLjAgLT4gLTAuNzg1Mzk4MTYzMzk3NDQ4MjggLTM2OC43NjAxOTQwMzU3NjY5MgogCistLSBBZGRpdGlvbmFsIHJlYWwgdmFsdWVzIChtcG1hdGgpCithdGFuMDQwMCBhdGFuIDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4IDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYxOTIgMC4wCithdGFuMDQwMSBhdGFuIC0xLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NjE5MiAwLjAKK2F0YW4wNDAyIGF0YW4gMWUtMTcgMC4wIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDcxNWUtMTcgMC4wCithdGFuMDQwMyBhdGFuIC0xZS0xNyAwLjAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDcxNWUtMTcgMC4wCithdGFuMDQwNCBhdGFuIDAuMDAwMSAwLjAgLT4gMC4wMDAwOTk5OTk5OTk2NjY2NjY2NzM0NTkgMC4wCithdGFuMDQwNSBhdGFuIC0wLjAwMDEgMC4wIC0+IC0wLjAwMDA5OTk5OTk5OTY2NjY2NjY3MzQ1OSAwLjAKK2F0YW4wNDA2IGF0YW4gMC45OTk5OTk5OTk5OTk5OTkgMC4wIC0+IDAuNzg1Mzk4MTYzMzk3NDQ3ODEwMDIgMC4wCithdGFuMDQwNyBhdGFuIDEuMDAwMDAwMDAwMDAwMDAxIDAuMCAtPiAwLjc4NTM5ODE2MzM5NzQ0ODg2NDczIDAuMAorYXRhbjA0MDggYXRhbiAxNC4xMDE0MTk5NDcxNzE3MTkgMC4wIC0+IDEuNDk5OTk5OTk5OTk5OTk5OTk2OSAwLjAKK2F0YW4wNDA5IGF0YW4gMTI1NS43NjU1OTE1MDA3ODk3IDAuMCAtPiAxLjU3MDAwMDAwMDAwMDAwMDA2MjIgMC4wCisKIC0tIHNwZWNpYWwgdmFsdWVzCiBhdGFuMTAwMCBhdGFuIC0wLjAgMC4wIC0+IC0wLjAgMC4wCiBhdGFuMTAwMSBhdGFuIG5hbiAwLjAgLT4gbmFuIDAuMApAQCAtMTUxNCw2ICsxNTMyLDExIEBACiBzcXJ0MDE0MCBzcXJ0IDEuNjk5OTk5OTk5OTk5OTk5OWUrMzA4IC0xLjY5OTk5OTk5OTk5OTk5OTllKzMwOCAtPiAxLjQzMjUwODgyMzAxNTQ1NzNlKzE1NCAtNS45MzM2NDU4MjcxMjEyMjA3ZSsxNTMKIHNxcnQwMTQxIHNxcnQgLTEuNzk3ZSszMDggLTkuOTk5OTk5OTk5OTk5OTk5OWUrMzA2IC0+IDMuNzI4NDQ3NjQzMjA1NzMwN2UrMTUyIC0xLjM0MTA0MDY4OTk4MDI5MDFlKzE1NAogCistLSBBZGRpdGlvbmFsIHJlYWwgdmFsdWVzIChtcG1hdGgpCitzcXJ0MDE1MCBzcXJ0IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4IDAuMCAtPiAxLjM0MDc4MDc5Mjk5NDI1OTYzNTVlKzE1NCAwLjAKK3NxcnQwMTUxIHNxcnQgMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDggMC4wIC0+IDEuNDkxNjY4MTQ2MjQwMDQxMzQ4N2UtMTU0IDAuMAorc3FydDAxNTIgc3FydCA1ZS0zMjQgMC4wIC0+IDIuMjIyNzU4NzQ5NDg1MDc3NDgzNGUtMTYyIDAuMAorCiAtLSBzcGVjaWFsIHZhbHVlcwogc3FydDEwMDAgc3FydCAwLjAgMC4wIC0+IDAuMCAwLjAKIHNxcnQxMDAxIHNxcnQgLTAuMCAwLjAgLT4gMC4wIDAuMApAQCAtMTYxNiw2ICsxNjM5LDIwIEBACiBleHAwMDUzIGV4cCA3MTAuMCAxLjYgLT4gLTYuNTIzMTU3OTk5NTUwMTM3MmUrMzA2IGluZiAgIG92ZXJmbG93CiBleHAwMDU0IGV4cCA3MTAuMCAyLjggLT4gLWluZiA3LjQ4MzYxNzc0MTc0NDg1MjhlKzMwNyAgIG92ZXJmbG93CiAKKy0tIEFkZGl0aW9uYWwgcmVhbCB2YWx1ZXMgKG1wbWF0aCkKK2V4cDAwNzAgZXhwIDFlLTA4IDAuMCAtPiAxLjAwMDAwMDAxMDAwMDAwMDA1IDAuMAorZXhwMDA3MSBleHAgMC4wMDAzIDAuMCAtPiAxLjAwMDMwMDA0NTAwNDUwMDMzNzUgMC4wCitleHAwMDcyIGV4cCAwLjIgMC4wIC0+IDEuMjIxNDAyNzU4MTYwMTY5ODQ3NSAwLjAKK2V4cDAwNzMgZXhwIDEuMCAwLjAgLT4gMi43MTgyODE4Mjg0NTkwNDUyMzU0IDAuMAorZXhwMDA3NCBleHAgLTFlLTA4IDAuMCAtPiAwLjk5OTk5OTk5MDAwMDAwMDA1IDAuMAorZXhwMDA3NSBleHAgLTAuMDAwMyAwLjAgLT4gMC45OTk3MDAwNDQ5OTU1MDAzMzc1MSAwLjAKK2V4cDAwNzYgZXhwIC0xLjAgMC4wIC0+IDAuMzY3ODc5NDQxMTcxNDQyMzIxNiAwLjAKK2V4cDAwNzcgZXhwIDIuMjIwNDQ2MDQ5MjUwMzEzZS0xNiAwLjAgLT4gMS4wMDAwMDAwMDAwMDAwMDAyMjIgMC4wCitleHAwMDc4IGV4cCAtMS4xMTAyMjMwMjQ2MjUxNTY1ZS0xNiAwLjAgLT4gMC45OTk5OTk5OTk5OTk5OTk4ODg5OCAwLjAKK2V4cDAwNzkgZXhwIDIuMzAyNTg1MDkyOTk0MDQ2IDAuMCAtPiAxMC4wMDAwMDAwMDAwMDAwMDIxNzEgMC4wCitleHAwMDgwIGV4cCAtMi4zMDI1ODUwOTI5OTQwNDYgMC4wIC0+IDAuMDk5OTk5OTk5OTk5OTk5OTc4MjkyIDAuMAorZXhwMDA4MSBleHAgNzA5Ljc4MjcgMC4wIC0+IDEuNzk3NjY5OTU2NjYzODAxNDY1NGUrMzA4IDAuMAorCiAtLSBzcGVjaWFsIHZhbHVlcwogZXhwMTAwMCBleHAgMC4wIDAuMCAtPiAxLjAgMC4wCiBleHAxMDAxIGV4cCAtMC4wIDAuMCAtPiAxLjAgMC4wCkBAIC0xNzA4LDYgKzE3NDUsMjMgQEAKIGNvc2gwMDMwIGNvc2ggNzEwLjUgMi4zNTE5OTk5OTk5OTk5OTk5IC0+IC0xLjI5Njc0NjUyMzkzNTU5OThlKzMwOCAxLjMwNzY3MDc5MDg4NTczMzNlKzMwOAogY29zaDAwMzEgY29zaCAtNzEwLjUgMC42OTk5OTk5OTk5OTk5OTk5NiAtPiAxLjQwODU0NjYzODEzOTI0OTllKzMwOCAtMS4xODY0MDI0NjY2NDUwMjM5ZSszMDgKIAorLS0gQWRkaXRpb25hbCByZWFsIHZhbHVlcyAobXBtYXRoKQorY29zaDAwNTAgY29zaCAxZS0xNTAgMC4wIC0+IDEuMCAwLjAKK2Nvc2gwMDUxIGNvc2ggMWUtMTggMC4wIC0+IDEuMCAwLjAKK2Nvc2gwMDUyIGNvc2ggMWUtMDkgMC4wIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwNSAwLjAKK2Nvc2gwMDUzIGNvc2ggMC4wMDAzIDAuMCAtPiAxLjAwMDAwMDA0NTAwMDAwMDMzNzUgMC4wCitjb3NoMDA1NCBjb3NoIDAuMiAwLjAgLT4gMS4wMjAwNjY3NTU2MTkwNzU4NDg1IDAuMAorY29zaDAwNTUgY29zaCAxLjAgMC4wIC0+IDEuNTQzMDgwNjM0ODE1MjQzNzc4NSAwLjAKK2Nvc2gwMDU2IGNvc2ggLTFlLTE4IDAuMCAtPiAxLjAgLTAuMAorY29zaDAwNTcgY29zaCAtMC4wMDAzIDAuMCAtPiAxLjAwMDAwMDA0NTAwMDAwMDMzNzUgLTAuMAorY29zaDAwNTggY29zaCAtMS4wIDAuMCAtPiAxLjU0MzA4MDYzNDgxNTI0Mzc3ODUgLTAuMAorY29zaDAwNTkgY29zaCAxLjMxNjk1Nzg5NjkyNDgxNjggMC4wIC0+IDIuMDAwMDAwMDAwMDAwMDAwMTUwNCAwLjAKK2Nvc2gwMDYwIGNvc2ggLTEuMzE2OTU3ODk2OTI0ODE2OCAwLjAgLT4gMi4wMDAwMDAwMDAwMDAwMDAxNTA0IC0wLjAKK2Nvc2gwMDYxIGNvc2ggMTcuMzI4Njc5NTEzOTk4NjMzIDAuMCAtPiAxNjc3NzIxNi4wMDAwMDAwMjE5MzggMC4wCitjb3NoMDA2MiBjb3NoIDE4LjcxNDk3Mzg3NTExODUyNCAwLjAgLT4gNjcxMDg4NjQuMDAwMDAwMDQzNjYyIDAuMAorY29zaDAwNjMgY29zaCA3MDkuNzgyNyAwLjAgLT4gOC45ODgzNDk3ODMzMTkwMDczMjcyZSszMDcgMC4wCitjb3NoMDA2NCBjb3NoIC03MDkuNzgyNyAwLjAgLT4gOC45ODgzNDk3ODMzMTkwMDczMjcyZSszMDcgLTAuMAorCiAtLSBzcGVjaWFsIHZhbHVlcwogY29zaDEwMDAgY29zaCAwLjAgMC4wIC0+IDEuMCAwLjAKIGNvc2gxMDAxIGNvc2ggMC4wIGluZiAtPiBuYW4gMC4wICAgICAgICBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KQEAgLTE4MDAsNiArMTg1NCwyNCBAQAogc2luaDAwMzAgc2luaCA3MTAuNSAtMi4zOTk5OTk5OTk5OTk5OTk5IC0+IC0xLjM1Nzk5NzA1NjQ4ODU5MTllKzMwOCAtMS4yNDM5NDQ3MDkwNzc5OGUrMzA4CiBzaW5oMDAzMSBzaW5oIC03MTAuNSAwLjgwMDAwMDAwMDAwMDAwMDA0IC0+IC0xLjI4MzA2NzE2MDE3MzUxNjRlKzMwOCAxLjMyMTA5NTQxOTM5OTc2NzhlKzMwOAogCistLSBBZGRpdGlvbmFsIHJlYWwgdmFsdWVzIChtcG1hdGgpCitzaW5oMDA1MCBzaW5oIDFlLTEwMCAwLjAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMmUtMTAwIDAuMAorc2luaDAwNTEgc2luaCA1ZS0xNyAwLjAgLT4gNC45OTk5OTk5OTk5OTk5OTk4OTU1ZS0xNyAwLjAKK3NpbmgwMDUyIHNpbmggMWUtMTYgMC4wIC0+IDkuOTk5OTk5OTk5OTk5OTk5NzkxZS0xNyAwLjAKK3NpbmgwMDUzIHNpbmggMy43ZS0wOCAwLjAgLT4gMy43MDAwMDAwMDAwMDAwMDA4ODg1ZS04IDAuMAorc2luaDAwNTQgc2luaCAwLjAwMSAwLjAgLT4gMC4wMDEwMDAwMDAxNjY2NjY2NzUwMjA4IDAuMAorc2luaDAwNTUgc2luaCAwLjIgMC4wIC0+IDAuMjAxMzM2MDAyNTQxMDkzOTk4OTUgMC4wCitzaW5oMDA1NiBzaW5oIDEuMCAwLjAgLT4gMS4xNzUyMDExOTM2NDM4MDE0NTY5IDAuMAorc2luaDAwNTcgc2luaCAtMy43ZS0wOCAwLjAgLT4gLTMuNzAwMDAwMDAwMDAwMDAwODg4NWUtOCAwLjAKK3NpbmgwMDU4IHNpbmggLTAuMDAxIDAuMCAtPiAtMC4wMDEwMDAwMDAxNjY2NjY2NzUwMjA4IDAuMAorc2luaDAwNTkgc2luaCAtMS4wIDAuMCAtPiAtMS4xNzUyMDExOTM2NDM4MDE0NTY5IDAuMAorc2luaDAwNjAgc2luaCAxLjQ0MzYzNTQ3NTE3ODgxMDMgMC4wIC0+IDEuOTk5OTk5OTk5OTk5OTk5OTA3OCAwLjAKK3NpbmgwMDYxIHNpbmggLTEuNDQzNjM1NDc1MTc4ODEwMyAwLjAgLT4gLTEuOTk5OTk5OTk5OTk5OTk5OTA3OCAwLjAKK3NpbmgwMDYyIHNpbmggMTcuMzI4Njc5NTEzOTk4NjMzIDAuMCAtPiAxNjc3NzIxNS45OTk5OTk5OTIxMzYgMC4wCitzaW5oMDA2MyBzaW5oIDE4LjcxNDk3Mzg3NTExODUyNCAwLjAgLT4gNjcxMDg4NjQuMDAwMDAwMDM2MjExIDAuMAorc2luaDAwNjQgc2luaCA3MDkuNzgyNyAwLjAgLT4gOC45ODgzNDk3ODMzMTkwMDczMjcyZSszMDcgMC4wCitzaW5oMDA2NSBzaW5oIC03MDkuNzgyNyAwLjAgLT4gLTguOTg4MzQ5NzgzMzE5MDA3MzI3MmUrMzA3IDAuMAorCiAtLSBzcGVjaWFsIHZhbHVlcwogc2luaDEwMDAgc2luaCAwLjAgMC4wIC0+IDAuMCAwLjAKIHNpbmgxMDAxIHNpbmggMC4wIGluZiAtPiAwLjAgbmFuICAgICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KQEAgLTE4OTcsNiArMTk2OSwyNCBAQAogdGFuaDAwMzIgdGFuaCAxMDAwIC0yLjMxOTk5OTk5OTk5OTk5OTggLT4gMS4wIDAuMAogdGFuaDAwMzMgdGFuaCAtMS4wMDAwMDAwMDAwMDAwMDAxZSszMDAgLTkuNjY5OTk5OTk5OTk5OTk5OSAtPiAtMS4wIC0wLjAKIAorLS0gQWRkaXRpb25hbCByZWFsIHZhbHVlcyAobXBtYXRoKQordGFuaDAwNTAgdGFuaCAxZS0xMDAgMC4wIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDJlLTEwMCAwLjAKK3RhbmgwMDUxIHRhbmggNWUtMTcgMC4wIC0+IDQuOTk5OTk5OTk5OTk5OTk5ODk1NWUtMTcgMC4wCit0YW5oMDA1MiB0YW5oIDFlLTE2IDAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OTc5MWUtMTcgMC4wCit0YW5oMDA1MyB0YW5oIDMuN2UtMDggMC4wIC0+IDMuNjk5OTk5OTk5OTk5OTk4MzU1OWUtOCAwLjAKK3RhbmgwMDU0IHRhbmggMC4wMDEgMC4wIC0+IDAuMDAwOTk5OTk5NjY2NjY2ODAwMDIwNzYgMC4wCit0YW5oMDA1NSB0YW5oIDAuMiAwLjAgLT4gMC4xOTczNzUzMjAyMjQ5MDQwMTE0MSAwLjAKK3RhbmgwMDU2IHRhbmggMS4wIDAuMCAtPiAwLjc2MTU5NDE1NTk1NTc2NDg4ODEyIDAuMAordGFuaDAwNTcgdGFuaCAtMy43ZS0wOCAwLjAgLT4gLTMuNjk5OTk5OTk5OTk5OTk4MzU1OWUtOCAwLjAKK3RhbmgwMDU4IHRhbmggLTAuMDAxIDAuMCAtPiAtMC4wMDA5OTk5OTk2NjY2NjY4MDAwMjA3NiAwLjAKK3RhbmgwMDU5IHRhbmggLTEuMCAwLjAgLT4gLTAuNzYxNTk0MTU1OTU1NzY0ODg4MTIgMC4wCit0YW5oMDA2MCB0YW5oIDAuNTQ5MzA2MTQ0MzM0MDU0OSAwLjAgLT4gMC41MDAwMDAwMDAwMDAwMDAwMzQwMiAwLjAKK3RhbmgwMDYxIHRhbmggLTAuNTQ5MzA2MTQ0MzM0MDU0OSAwLjAgLT4gLTAuNTAwMDAwMDAwMDAwMDAwMDM0MDIgMC4wCit0YW5oMDA2MiB0YW5oIDE3LjMyODY3OTUxMzk5ODYzMyAwLjAgLT4gMC45OTk5OTk5OTk5OTk5OTgyMjM2NCAwLjAKK3RhbmgwMDYzIHRhbmggMTguNzE0OTczODc1MTE4NTI0IDAuMCAtPiAwLjk5OTk5OTk5OTk5OTk5OTg4ODk4IDAuMAordGFuaDAwNjQgdGFuaCA3MTEgMC4wIC0+IDEuMCAwLjAKK3RhbmgwMDY1IHRhbmggMS43OTdlKzMwOCAwLjAgLT4gMS4wIDAuMAorCiAtLXNwZWNpYWwgdmFsdWVzCiB0YW5oMTAwMCB0YW5oIDAuMCAwLjAgLT4gMC4wIDAuMAogdGFuaDEwMDEgdGFuaCAwLjAgaW5mIC0+IG5hbiBuYW4gICAgICAgIGludmFsaWQKQEAgLTE5ODUsNiArMjA3NSwyMiBAQAogY29zMDAyMiBjb3MgNy45OTE0NTE1NDMzODU4NTE1IDAuNzE2NTk5NjY2MTU1MDE0MzYgLT4gLTAuMTczNzU0Mzk5MDY5MzY1NjYgLTAuNzcyMTcwNDM1MjcyOTQ1ODIKIGNvczAwMjMgY29zIDAuNDUxMjQzNTExNTI1NDAyMjYgMS42OTkyNjkzOTkzODEyMTU4IC0+IDIuNTQzNDc3OTQ4OTcyMjM3IC0xLjE1MjgxOTM2OTQ4NzU0NzcKIAorLS0gQWRkaXRpb25hbCByZWFsIHZhbHVlcyAobXBtYXRoKQorY29zMDA1MCBjb3MgMWUtMTUwIDAuMCAtPiAxLjAgLTAuMAorY29zMDA1MSBjb3MgMWUtMTggMC4wIC0+IDEuMCAtMC4wCitjb3MwMDUyIGNvcyAxZS0wOSAwLjAgLT4gMC45OTk5OTk5OTk5OTk5OTk5OTk1IC0wLjAKK2NvczAwNTMgY29zIDAuMDAwMyAwLjAgLT4gMC45OTk5OTk5NTUwMDAwMDAzMzc1IC0wLjAKK2NvczAwNTQgY29zIDAuMiAwLjAgLT4gMC45ODAwNjY1Nzc4NDEyNDE2Mjg5MiAtMC4wCitjb3MwMDU1IGNvcyAxLjAgMC4wIC0+IDAuNTQwMzAyMzA1ODY4MTM5NzE3NCAtMC4wCitjb3MwMDU2IGNvcyAtMWUtMTggMC4wIC0+IDEuMCAwLjAKK2NvczAwNTcgY29zIC0wLjAwMDMgMC4wIC0+IDAuOTk5OTk5OTU1MDAwMDAwMzM3NSAwLjAKK2NvczAwNTggY29zIC0xLjAgMC4wIC0+IDAuNTQwMzAyMzA1ODY4MTM5NzE3NCAwLjAKK2NvczAwNTkgY29zIDEuMDQ3MTk3NTUxMTk2NTk3NiAwLjAgLT4gMC41MDAwMDAwMDAwMDAwMDAwOTk0NSAtMC4wCitjb3MwMDYwIGNvcyAyLjU3MDc5NjMyNjc5NDg5NjYgMC4wIC0+IC0wLjg0MTQ3MDk4NDgwNzg5NjQ3MzU3IC0wLjAKK2NvczAwNjEgY29zIC0yLjU3MDc5NjMyNjc5NDg5NjYgMC4wIC0+IC0wLjg0MTQ3MDk4NDgwNzg5NjQ3MzU3IDAuMAorY29zMDA2MiBjb3MgNy4yMjU2NjMxMDMyNTY1MjMgMC4wIC0+IDAuNTg3Nzg1MjUyMjkyNDc0MDc1NTkgLTAuMAorY29zMDA2MyBjb3MgLTguNzk2NDU5NDMwMDUxNDIgMC4wIC0+IC0wLjgwOTAxNjk5NDM3NDk0NzIyMjU1IDAuMAorCiAtLSBzcGVjaWFsIHZhbHVlcwogY29zMTAwMCBjb3MgLTAuMCAwLjAgLT4gMS4wIDAuMAogY29zMTAwMSBjb3MgLWluZiAwLjAgLT4gbmFuIDAuMCBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KQEAgLTIwNzMsNiArMjE3OSwyMiBAQAogc2luMDAyMiBzaW4gMS4xNTE4MDg3MzU0NDAzNzI1IDQuODU5NzIzNTk2NjE1MDU1OCAtPiA1OC45MTkxNDE5ODk2MDMwNDEgMjYuMjM3MDAzNDAzNzU4ODUyCiBzaW4wMDIzIHNpbiAwLjAwMDg3NzczMDc4NDA2NjQ5MTkyIDM0Ljc5MjM3OTIxMTMxMjA5NSAtPiA1NjU1NDgxNDU1NjkuMzgyNDUgNjQ0MzI5Njg1ODIyNzAwLjYyCiAKKy0tIEFkZGl0aW9uYWwgcmVhbCB2YWx1ZXMgKG1wbWF0aCkKK3NpbjAwNTAgc2luIDFlLTEwMCAwLjAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMmUtMTAwIDAuMAorc2luMDA1MSBzaW4gMy43ZS0wOCAwLjAgLT4gMy42OTk5OTk5OTk5OTk5OTkyMDAxZS04IDAuMAorc2luMDA1MiBzaW4gMC4wMDEgMC4wIC0+IDAuMDAwOTk5OTk5ODMzMzMzMzQxNjg3NDggMC4wCitzaW4wMDUzIHNpbiAwLjIgMC4wIC0+IDAuMTk4NjY5MzMwNzk1MDYxMjI2MzQgMC4wCitzaW4wMDU0IHNpbiAxLjAgMC4wIC0+IDAuODQxNDcwOTg0ODA3ODk2NTA2NjUgMC4wCitzaW4wMDU1IHNpbiAtMy43ZS0wOCAwLjAgLT4gLTMuNjk5OTk5OTk5OTk5OTk5MjAwMWUtOCAwLjAKK3NpbjAwNTYgc2luIC0wLjAwMSAwLjAgLT4gLTAuMDAwOTk5OTk5ODMzMzMzMzQxNjg3NDggMC4wCitzaW4wMDU3IHNpbiAtMS4wIDAuMCAtPiAtMC44NDE0NzA5ODQ4MDc4OTY1MDY2NSAwLjAKK3NpbjAwNTggc2luIDAuNTIzNTk4Nzc1NTk4Mjk4OSAwLjAgLT4gMC41MDAwMDAwMDAwMDAwMDAwNDY0MiAwLjAKK3NpbjAwNTkgc2luIC0wLjUyMzU5ODc3NTU5ODI5ODkgMC4wIC0+IC0wLjUwMDAwMDAwMDAwMDAwMDA0NjQyIDAuMAorc2luMDA2MCBzaW4gMi42MTc5OTM4Nzc5OTE0OTQ0IDAuMCAtPiAwLjQ5OTk5OTk5OTk5OTk5OTk2MDE4IC0wLjAKK3NpbjAwNjEgc2luIC0yLjYxNzk5Mzg3Nzk5MTQ5NDQgMC4wIC0+IC0wLjQ5OTk5OTk5OTk5OTk5OTk2MDE4IC0wLjAKK3NpbjAwNjIgc2luIDcuMjI1NjYzMTAzMjU2NTIzIDAuMCAtPiAwLjgwOTAxNjk5NDM3NDk0NjczNjQ4IDAuMAorc2luMDA2MyBzaW4gLTguNzk2NDU5NDMwMDUxNDIgMC4wIC0+IC0wLjU4Nzc4NTI1MjI5MjQ3MzQwNjU4IC0wLjAKKwogLS0gc3BlY2lhbCB2YWx1ZXMKIHNpbjEwMDAgc2luIC0wLjAgMC4wIC0+IC0wLjAgMC4wCiBzaW4xMDAxIHNpbiAtaW5mIDAuMCAtPiBuYW4gMC4wIGludmFsaWQgaWdub3JlLWltYWctc2lnbgpAQCAtMjE2MSw2ICsyMjgzLDI1IEBACiB0YW4wMDIyIHRhbiAxLjE2MTUzMTM5MDA4ODA1NzcgMS43OTU2Mjk4NzI4NjQ3MTA3IC0+IDAuMDQxNzkzMTg2ODI2MzkwMzYyIDEuMDM3NTMzOTU0NjAzNDc5MgogdGFuMDAyMyB0YW4gMC4wNjcwMTQ3Nzk0Nzc5MDg5NDUgNS44NTE3MzYxNTc3NDU3MDk3IC0+IDIuMjA4ODYzOTc1NDgwMDAzNGUtMDYgMC45OTk5ODM2MTgyNDIwMDYxCiAKKy0tIEFkZGl0aW9uYWwgcmVhbCB2YWx1ZXMgKG1wbWF0aCkKK3RhbjAwNTAgdGFuIDFlLTEwMCAwLjAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMmUtMTAwIDAuMAordGFuMDA1MSB0YW4gMy43ZS0wOCAwLjAgLT4gMy43MDAwMDAwMDAwMDAwMDE3MzI4ZS04IDAuMAordGFuMDA1MiB0YW4gMC4wMDEgMC4wIC0+IDAuMDAxMDAwMDAwMzMzMzMzNDY2Njg3NSAwLjAKK3RhbjAwNTMgdGFuIDAuMiAwLjAgLT4gMC4yMDI3MTAwMzU1MDg2NzI0OTQ4OCAwLjAKK3RhbjAwNTQgdGFuIDEuMCAwLjAgLT4gMS41NTc0MDc3MjQ2NTQ5MDIyMzA1IDAuMAordGFuMDA1NSB0YW4gLTMuN2UtMDggMC4wIC0+IC0zLjcwMDAwMDAwMDAwMDAwMTczMjhlLTggMC4wCit0YW4wMDU2IHRhbiAtMC4wMDEgMC4wIC0+IC0wLjAwMTAwMDAwMDMzMzMzMzQ2NjY4NzUgMC4wCit0YW4wMDU3IHRhbiAtMS4wIDAuMCAtPiAtMS41NTc0MDc3MjQ2NTQ5MDIyMzA1IDAuMAordGFuMDA1OCB0YW4gMC40NjM2NDc2MDkwMDA4MDYxIDAuMCAtPiAwLjQ5OTk5OTk5OTk5OTk5OTk3MTYzIDAuMAordGFuMDA1OSB0YW4gLTAuNDYzNjQ3NjA5MDAwODA2MSAwLjAgLT4gLTAuNDk5OTk5OTk5OTk5OTk5OTcxNjMgMC4wCit0YW4wMDYwIHRhbiAxLjEwNzE0ODcxNzc5NDA5MDQgMC4wIC0+IDEuOTk5OTk5OTk5OTk5OTk5NTI5OCAwLjAKK3RhbjAwNjEgdGFuIC0xLjEwNzE0ODcxNzc5NDA5MDQgMC4wIC0+IC0xLjk5OTk5OTk5OTk5OTk5OTUyOTggMC4wCit0YW4wMDYyIHRhbiAxLjUgMC4wIC0+IDE0LjEwMTQxOTk0NzE3MTcxOTM4OCAwLjAKK3RhbjAwNjMgdGFuIDEuNTcgMC4wIC0+IDEyNTUuNzY1NTkxNTAwNzg5NjQ3NSAwLjAKK3RhbjAwNjQgdGFuIDEuNTcwNzk2MzI2Nzk0ODk2MSAwLjAgLT4gMTk3ODkzNzk2NjA5NTIxOS4wNTM4IDAuMAordGFuMDA2NSB0YW4gNy4yMjU2NjMxMDMyNTY1MjMgMC4wIC0+IDEuMzc2MzgxOTIwNDcxMTcwMTUyMiAwLjAKK3RhbjAwNjYgdGFuIC04Ljc5NjQ1OTQzMDA1MTQyIDAuMCAtPiAwLjcyNjU0MjUyODAwNTM2MTQwOTggMC4wCisKIC0tIHNwZWNpYWwgdmFsdWVzCiB0YW4xMDAwIHRhbiAtMC4wIDAuMCAtPiAtMC4wIDAuMAogdGFuMTAwMSB0YW4gLWluZiAwLjAgLT4gbmFuIG5hbiBpbnZhbGlkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9kYXRldGltZXRlc3Rlci5weSBiL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CmluZGV4IDA4NjBkYjguLjk4OGM2ZjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CisrKyBiL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CkBAIC0yLDE0ICsyLDIyIEBACiAKIFNlZSBodHRwOi8vd3d3LnpvcGUub3JnL01lbWJlcnMvZmRyYWtlL0RhdGVUaW1lV2lraS9UZXN0Q2FzZXMKICIiIgorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGlzX3Jlc291cmNlX2VuYWJsZWQKKworaW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IGJpc2VjdAogCiBpbXBvcnQgY29weQogaW1wb3J0IGRlY2ltYWwKIGltcG9ydCBzeXMKK2ltcG9ydCBvcwogaW1wb3J0IHBpY2tsZQogaW1wb3J0IHJhbmRvbQoraW1wb3J0IHN0cnVjdAogaW1wb3J0IHVuaXR0ZXN0CiAKK2Zyb20gYXJyYXkgaW1wb3J0IGFycmF5CisKIGZyb20gb3BlcmF0b3IgaW1wb3J0IGx0LCBsZSwgZ3QsIGdlLCBlcSwgbmUsIHRydWVkaXYsIGZsb29yZGl2LCBtb2QKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC0yODQsNyArMjkyLDggQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOiBzZWxmLkVTVC5kc3QoNSkKIAogICAgIGRlZiB0ZXN0X3R6bmFtZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnVVRDKzAwOjAwJywgdGltZXpvbmUoWkVSTykudHpuYW1lKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMnLCB0aW1lem9uZS51dGMudHpuYW1lKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMnLCB0aW1lem9uZShaRVJPKS50em5hbWUoTm9uZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQy0wNTowMCcsIHRpbWV6b25lKC01ICogSE9VUikudHpuYW1lKE5vbmUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMrMDk6MzAnLCB0aW1lem9uZSg5LjUgKiBIT1VSKS50em5hbWUoTm9uZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQy0wMDowMScsIHRpbWV6b25lKHRpbWVkZWx0YShtaW51dGVzPS0xKSkudHpuYW1lKE5vbmUpKQpAQCAtMTU1OCwxMyArMTU2NywzMiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZHQyKQogCiAgICAgZGVmIHRlc3RfaXNvZm9ybWF0KHNlbGYpOgotICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyLCAzLCAyLCA0LCA1LCAxLCAxMjMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgICAgIjAwMDItMDMtMDJUMDQ6MDU6MDEuMDAwMTIzIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnVCcpLCAiMDAwMi0wMy0wMlQwNDowNTowMS4wMDAxMjMiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCcgJyksICIwMDAyLTAzLTAyIDA0OjA1OjAxLjAwMDEyMyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJ1x4MDAnKSwgIjAwMDItMDMtMDJceDAwMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCwgNSwgMSwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICAgICIwMDAxLTAyLTAzVDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJ1QnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnICcpLCAiMDAwMS0wMi0wMyAwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCdceDAwJyksICIwMDAxLTAyLTAzXHgwMDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2hvdXJzJyksICIwMDAxLTAyLTAzVDA0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWludXRlcycpLCAiMDAwMS0wMi0wM1QwNDowNSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J3NlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWxsaXNlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWljcm9zZWNvbmRzJyksICIwMDAxLTAyLTAzVDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2F1dG8nKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdChzZXA9JyAnLCB0aW1lc3BlYz0nbWludXRlcycpLCAiMDAwMS0wMi0wMyAwNDowNSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuaXNvZm9ybWF0LCB0aW1lc3BlYz0nZm9vJykKICAgICAgICAgIyBzdHIgaXMgSVNPIGZvcm1hdCB3aXRoIHRoZSBzZXBhcmF0b3IgZm9yY2VkIHRvIGEgYmxhbmsuCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCAiMDAwMi0wMy0wMiAwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0KSwgIjAwMDEtMDItMDMgMDQ6MDU6MDEuMDAwMTIzIikKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0LCA1LCAxLCA5OTk1MDAsIHR6aW5mbz10aW1lem9uZS51dGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMDAwMS0wMi0wM1QwNDowNTowMS45OTkrMDA6MDAiKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDEsIDIsIDMsIDQsIDUsIDEsIDk5OTUwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWlsbGlzZWNvbmRzJyksICIwMDAxLTAyLTAzVDA0OjA1OjAxLjk5OSIpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCwgNSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nYXV0bycpLCAiMDAwMS0wMi0wM1QwNDowNTowMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMDAwMS0wMi0wM1QwNDowNTowMS4wMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWNyb3NlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMDAwIikKIAogICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyLCAzLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICAgICIwMDAyLTAzLTAyVDAwOjAwOjAwIikKQEAgLTE1NzIsNiArMTYwMCwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCcgJyksICIwMDAyLTAzLTAyIDAwOjAwOjAwIikKICAgICAgICAgIyBzdHIgaXMgSVNPIGZvcm1hdCB3aXRoIHRoZSBzZXBhcmF0b3IgZm9yY2VkIHRvIGEgYmxhbmsuCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCAiMDAwMi0wMy0wMiAwMDowMDowMCIpCisgICAgICAgICMgSVNPIGZvcm1hdCB3aXRoIHRpbWV6b25lCisgICAgICAgIHR6ID0gRml4ZWRPZmZzZXQodGltZWRlbHRhKHNlY29uZHM9MTYpLCAnWFhYJykKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMiwgMywgMiwgdHppbmZvPXR6KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICIwMDAyLTAzLTAyVDAwOjAwOjAwKzAwOjAwOjE2IikKIAogICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmKToKICAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzKDIwMDcsIDksIDEwLCA0LCA1LCAxLCAxMjMpCkBAIC0xNjkxLDYgKzE3MjMsMTQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMCwgMSwgMzEsIDIzLCA1OSwgNTksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDApCisgICAgICAgICMgYmFkIGZvbGQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMCwgMSwgMzEsIGZvbGQ9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAsIDEsIDMxLCBmb2xkPTIpCisgICAgICAgICMgUG9zaXRpb25hbCBmb2xkOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudGhlY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAsIDEsIDMxLCAyMywgNTksIDU5LCAwLCBOb25lLCAxKQogCiAgICAgZGVmIHRlc3RfaGFzaF9lcXVhbGl0eShzZWxmKToKICAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMjAwMCwgMTIsIDMxLCAyMywgMzAsIDE3KQpAQCAtMTg3NCwxNiArMTkxNCwyMCBAQAogICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxOTcwLCAxLCAxLCAxLCAyLCAzLCA0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudGltZXN0YW1wKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgMTgwMDAuMCArIDM2MDAgKyAyKjYwICsgMyArIDQqMWUtNikKLSAgICAgICAgIyBNaXNzaW5nIGhvdXIgbWF5IHByb2R1Y2UgcGxhdGZvcm0tZGVwZW5kZW50IHJlc3VsdAotICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyMDEyLCAzLCAxMSwgMiwgMzApCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oc2VsZi50aGVjbGFzcy5mcm9tdGltZXN0YW1wKHQudGltZXN0YW1wKCkpLAotICAgICAgICAgICAgICAgICAgICAgIFt0IC0gdGltZWRlbHRhKGhvdXJzPTEpLCB0ICsgdGltZWRlbHRhKGhvdXJzPTEpXSkKKyAgICAgICAgIyBNaXNzaW5nIGhvdXIKKyAgICAgICAgdDAgPSBzZWxmLnRoZWNsYXNzKDIwMTIsIDMsIDExLCAyLCAzMCkKKyAgICAgICAgdDEgPSB0MC5yZXBsYWNlKGZvbGQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAodDEudGltZXN0YW1wKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHQwIC0gdGltZWRlbHRhKGhvdXJzPTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhlY2xhc3MuZnJvbXRpbWVzdGFtcCh0MC50aW1lc3RhbXAoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdDEgKyB0aW1lZGVsdGEoaG91cnM9MSkpCiAgICAgICAgICMgQW1iaWd1b3VzIGhvdXIgZGVmYXVsdHMgdG8gRFNUCiAgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIwMTIsIDExLCA0LCAxLCAzMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAodC50aW1lc3RhbXAoKSksIHQpCiAKICAgICAgICAgIyBUaW1lc3RhbXAgbWF5IHJhaXNlIGFuIG92ZXJmbG93IGVycm9yIG9uIHNvbWUgcGxhdGZvcm1zCi0gICAgICAgIGZvciB0IGluIFtzZWxmLnRoZWNsYXNzKDEsMSwxKSwgc2VsZi50aGVjbGFzcyg5OTk5LDEyLDEyKV06CisgICAgICAgICMgWFhYOiBEbyB3ZSBjYXJlIHRvIHN1cHBvcnQgdGhlIGZpcnN0IGFuZCBsYXN0IHllYXI/CisgICAgICAgIGZvciB0IGluIFtzZWxmLnRoZWNsYXNzKDIsMSwxKSwgc2VsZi50aGVjbGFzcyg5OTk4LDEyLDEyKV06CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgcyA9IHQudGltZXN0YW1wKCkKICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgpAQCAtMTkwMiw2ICsxOTQ2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRpbWVzdGFtcCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIDE4MDAwICsgMzYwMCArIDIqNjAgKyAzICsgNCoxZS02KQogCisgICAgQHN1cHBvcnQucnVuX3dpdGhfdHooJ01TSy0wMycpICAjIFNvbWV0aGluZyBlYXN0IG9mIEdyZWVud2ljaAogICAgIGRlZiB0ZXN0X21pY3Jvc2Vjb25kX3JvdW5kaW5nKHNlbGYpOgogICAgICAgICBmb3IgZnRzIGluIFtzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAsCiAgICAgICAgICAgICAgICAgICAgIHNlbGYudGhlY2xhc3MudXRjZnJvbXRpbWVzdGFtcF06CkBAIC0yMDc2LDExICsyMTIxLDIyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tYmluZSkgIyBuZWVkIGFuIGFyZwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsIGQpICMgbmVlZCB0d28gYXJncwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsIHQsIGQpICMgYXJncyByZXZlcnNlZAotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsIGQsIHQsIDEpICMgdG9vIG1hbnkgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsIGQsIHQsIDEpICMgd3JvbmcgdHppbmZvIHR5cGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21iaW5lLCBkLCB0LCAxLCAyKSAgIyB0b28gbWFueSBhcmdzCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tYmluZSwgImRhdGUiLCAidGltZSIpICMgd3JvbmcgdHlwZXMKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21iaW5lLCBkLCAidGltZSIpICMgd3JvbmcgdHlwZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsICJkYXRlIiwgdCkgIyB3cm9uZyB0eXBlCiAKKyAgICAgICAgIyB0emluZm89IGFyZ3VtZW50CisgICAgICAgIGR0ID0gY29tYmluZShkLCB0LCB0aW1lem9uZS51dGMpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZHQudHppbmZvLCB0aW1lem9uZS51dGMpCisgICAgICAgIGR0ID0gY29tYmluZShkLCB0LCB0emluZm89dGltZXpvbmUudXRjKQorICAgICAgICBzZWxmLmFzc2VydElzKGR0LnR6aW5mbywgdGltZXpvbmUudXRjKQorICAgICAgICB0ID0gdGltZSgpCisgICAgICAgIGR0ID0gY29tYmluZShkdCwgdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5kYXRlKCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQudGltZSgpLCB0KQorCiAgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKICAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcwogICAgICAgICBhcmdzID0gWzEsIDIsIDMsIDQsIDUsIDYsIDddCkBAIC0yMTA3LDYgKzIxNjMsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiYXNlLnJlcGxhY2UsIHllYXI9MjAwMSkKIAogICAgIGRlZiB0ZXN0X2FzdGltZXpvbmUoc2VsZik6CisgICAgICAgIHJldHVybiAgIyBUaGUgcmVzdCBpcyBubyBsb25nZXIgYXBwbGljYWJsZQogICAgICAgICAjIFByZXR0eSBib3JpbmchICBUaGUgVFogdGVzdCBpcyBtb3JlIGludGVyZXN0aW5nIGhlcmUuICBhc3RpbWV6b25lKCkKICAgICAgICAgIyBzaW1wbHkgY2FuJ3QgYmUgYXBwbGllZCB0byBhIG5haXZlIG9iamVjdC4KICAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzLm5vdygpCkBAIC0yMzI0LDYgKzIzODEsMjMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCAiMDA6MDA6MDAuMTAwMDAwIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCBzdHIodCkpCiAKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoaG91cj0xMiwgbWludXRlPTM0LCBzZWNvbmQ9NTYsIG1pY3Jvc2Vjb25kPTEyMzQ1NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0naG91cnMnKSwgIjEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWludXRlcycpLCAiMTI6MzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdzZWNvbmRzJyksICIxMjozNDo1NiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMTI6MzQ6NTYuMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWljcm9zZWNvbmRzJyksICIxMjozNDo1Ni4xMjM0NTYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdhdXRvJyksICIxMjozNDo1Ni4xMjM0NTYiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0Lmlzb2Zvcm1hdCwgdGltZXNwZWM9J21vbmtleScpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoaG91cj0xMiwgbWludXRlPTM0LCBzZWNvbmQ9NTYsIG1pY3Jvc2Vjb25kPTk5OTUwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWlsbGlzZWNvbmRzJyksICIxMjozNDo1Ni45OTkiKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKGhvdXI9MTIsIG1pbnV0ZT0zNCwgc2Vjb25kPTU2LCBtaWNyb3NlY29uZD0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWxsaXNlY29uZHMnKSwgIjEyOjM0OjU2LjAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pY3Jvc2Vjb25kcycpLCAiMTI6MzQ6NTYuMDAwMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nYXV0bycpLCAiMTI6MzQ6NTYiKQorCiAgICAgZGVmIHRlc3RfMTY1MzczNihzZWxmKToKICAgICAgICAgIyB2ZXJpZnkgaXQgZG9lc24ndCBhY2NlcHQgZXh0cmEga2V5d29yZCBhcmd1bWVudHMKICAgICAgICAgdCA9IHNlbGYudGhlY2xhc3Moc2Vjb25kPTEpCkBAIC0yNTgyLDkgKzI2NTYsOSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnV0Y29mZnNldCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5kc3QpCiAKLSAgICAgICAgIyBOb3QgYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KKyAgICAgICAgIyBOb3QgYSB3aG9sZSBudW1iZXIgb2Ygc2Vjb25kcy4KICAgICAgICAgY2xhc3MgQzcodHppbmZvKToKLSAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiByZXR1cm4gdGltZWRlbHRhKHNlY29uZHM9NjEpCisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShtaWNyb3NlY29uZHM9NjEpCiAgICAgICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShtaWNyb3NlY29uZHM9LTgxKQogICAgICAgICB0ID0gY2xzKDEsIDEsIDEsIHR6aW5mbz1DNygpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnV0Y29mZnNldCkKQEAgLTM5MjcsMTIgKzQwMDEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWUoeHgsIHh4LCB4eCwgeHgsIHh4LCB4eCwgeHgpKQogCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdeYW4gaW50ZWdlciBpcyByZXF1aXJlZCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcKGdvdCB0eXBlIHN0clwpJCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInXChnb3QgdHlwZSBzdHJcKSQnKToKICAgICAgICAgICAgIGRhdGV0aW1lKDEwLCAxMCwgJzEwJykKIAogICAgICAgICBmMTAgPSBOdW1iZXIoMTAuOSkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ15fX2ludF9fIHJldHVybmVkIG5vbi1pbnQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCh0eXBlIGZsb2F0XCkkJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidcKHR5cGUgZmxvYXRcKSQnKToKICAgICAgICAgICAgIGRhdGV0aW1lKDEwLCAxMCwgZjEwKQogCiAgICAgICAgIGNsYXNzIEZsb2F0KGZsb2F0KToKQEAgLTM5NTcsNSArNDAzMSw3OTAgQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICAgZGF0ZXRpbWUoMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAuKQogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBMb2NhbCBUaW1lIERpc2FtYmlndWF0aW9uCisKKyMgQW4gZXhwZXJpbWVudGFsIHJlaW1wbGVtZW50YXRpb24gb2YgZnJvbXV0YyB0aGF0IHJlc3BlY3RzIHRoZSAiZm9sZCIgZmxhZy4KKworY2xhc3MgdHppbmZvMih0emluZm8pOgorCisgICAgZGVmIGZyb211dGMoc2VsZiwgZHQpOgorICAgICAgICAiZGF0ZXRpbWUgaW4gVVRDIC0+IGRhdGV0aW1lIGluIGxvY2FsIHRpbWUuIgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGR0LCBkYXRldGltZSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImZyb211dGMoKSByZXF1aXJlcyBhIGRhdGV0aW1lIGFyZ3VtZW50IikKKyAgICAgICAgaWYgZHQudHppbmZvIGlzIG5vdCBzZWxmOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZHQudHppbmZvIGlzIG5vdCBzZWxmIikKKyAgICAgICAgIyBSZXR1cm5lZCB2YWx1ZSBzYXRpc2ZpZXMKKyAgICAgICAgIyAgICAgICAgICBkdCArIGxkdC51dGNvZmZzZXQoKSA9IGxkdAorICAgICAgICBvZmYwID0gZHQucmVwbGFjZShmb2xkPTApLnV0Y29mZnNldCgpCisgICAgICAgIG9mZjEgPSBkdC5yZXBsYWNlKGZvbGQ9MSkudXRjb2Zmc2V0KCkKKyAgICAgICAgaWYgb2ZmMCBpcyBOb25lIG9yIG9mZjEgaXMgTm9uZSBvciBkdC5kc3QoKSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBpZiBvZmYwID09IG9mZjE6CisgICAgICAgICAgICBsZHQgPSBkdCArIG9mZjAKKyAgICAgICAgICAgIG9mZjEgPSBsZHQudXRjb2Zmc2V0KCkKKyAgICAgICAgICAgIGlmIG9mZjAgPT0gb2ZmMToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGR0CisgICAgICAgICMgTm93LCB3ZSBkaXNjb3ZlcmVkIGJvdGggcG9zc2libGUgb2Zmc2V0cywgc28KKyAgICAgICAgIyB3ZSBjYW4ganVzdCB0cnkgZm91ciBwb3NzaWJsZSBzb2x1dGlvbnM6CisgICAgICAgIGZvciBvZmYgaW4gW29mZjAsIG9mZjFdOgorICAgICAgICAgICAgbGR0ID0gZHQgKyBvZmYKKyAgICAgICAgICAgIGlmIGxkdC51dGNvZmZzZXQoKSA9PSBvZmY6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxkdAorICAgICAgICAgICAgbGR0ID0gbGR0LnJlcGxhY2UoZm9sZD0xKQorICAgICAgICAgICAgaWYgbGR0LnV0Y29mZnNldCgpID09IG9mZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbGR0CisKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gc3VpdGFibGUgbG9jYWwgdGltZSBmb3VuZCIpCisKKyMgUmVpbXBsZW1lbnRpbmcgc2ltcGxpZmllZCBVUyB0aW1lem9uZXMgdG8gcmVzcGVjdCB0aGUgImZvbGQiIGZsYWc6CisKK2NsYXNzIFVTVGltZVpvbmUyKHR6aW5mbzIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvdXJzLCByZXBybmFtZSwgc3RkbmFtZSwgZHN0bmFtZSk6CisgICAgICAgIHNlbGYuc3Rkb2Zmc2V0ID0gdGltZWRlbHRhKGhvdXJzPWhvdXJzKQorICAgICAgICBzZWxmLnJlcHJuYW1lID0gcmVwcm5hbWUKKyAgICAgICAgc2VsZi5zdGRuYW1lID0gc3RkbmFtZQorICAgICAgICBzZWxmLmRzdG5hbWUgPSBkc3RuYW1lCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlcHJuYW1lCisKKyAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KToKKyAgICAgICAgaWYgc2VsZi5kc3QoZHQpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZHN0bmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RkbmFtZQorCisgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6CisgICAgICAgIHJldHVybiBzZWxmLnN0ZG9mZnNldCArIHNlbGYuZHN0KGR0KQorCisgICAgZGVmIGRzdChzZWxmLCBkdCk6CisgICAgICAgIGlmIGR0IGlzIE5vbmUgb3IgZHQudHppbmZvIGlzIE5vbmU6CisgICAgICAgICAgICAjIEFuIGV4Y2VwdGlvbiBpbnN0ZWFkIG1heSBiZSBzZW5zaWJsZSBoZXJlLCBpbiBvbmUgb3IgbW9yZSBvZgorICAgICAgICAgICAgIyB0aGUgY2FzZXMuCisgICAgICAgICAgICByZXR1cm4gWkVSTworICAgICAgICBhc3NlcnQgZHQudHppbmZvIGlzIHNlbGYKKworICAgICAgICAjIEZpbmQgZmlyc3QgU3VuZGF5IGluIEFwcmlsLgorICAgICAgICBzdGFydCA9IGZpcnN0X3N1bmRheV9vbl9vcl9hZnRlcihEU1RTVEFSVC5yZXBsYWNlKHllYXI9ZHQueWVhcikpCisgICAgICAgIGFzc2VydCBzdGFydC53ZWVrZGF5KCkgPT0gNiBhbmQgc3RhcnQubW9udGggPT0gNCBhbmQgc3RhcnQuZGF5IDw9IDcKKworICAgICAgICAjIEZpbmQgbGFzdCBTdW5kYXkgaW4gT2N0b2Jlci4KKyAgICAgICAgZW5kID0gZmlyc3Rfc3VuZGF5X29uX29yX2FmdGVyKERTVEVORC5yZXBsYWNlKHllYXI9ZHQueWVhcikpCisgICAgICAgIGFzc2VydCBlbmQud2Vla2RheSgpID09IDYgYW5kIGVuZC5tb250aCA9PSAxMCBhbmQgZW5kLmRheSA+PSAyNQorCisgICAgICAgICMgQ2FuJ3QgY29tcGFyZSBuYWl2ZSB0byBhd2FyZSBvYmplY3RzLCBzbyBzdHJpcCB0aGUgdGltZXpvbmUgZnJvbQorICAgICAgICAjIGR0IGZpcnN0LgorICAgICAgICBkdCA9IGR0LnJlcGxhY2UodHppbmZvPU5vbmUpCisgICAgICAgIGlmIHN0YXJ0ICsgSE9VUiA8PSBkdCA8IGVuZDoKKyAgICAgICAgICAgICMgRFNUIGlzIGluIGVmZmVjdC4KKyAgICAgICAgICAgIHJldHVybiBIT1VSCisgICAgICAgIGVsaWYgZW5kIDw9IGR0IDwgZW5kICsgSE9VUjoKKyAgICAgICAgICAgICMgRm9sZCAoYW4gYW1iaWd1b3VzIGhvdXIpOiB1c2UgZHQuZm9sZCB0byBkaXNhbWJpZ3VhdGUuCisgICAgICAgICAgICByZXR1cm4gWkVSTyBpZiBkdC5mb2xkIGVsc2UgSE9VUgorICAgICAgICBlbGlmIHN0YXJ0IDw9IGR0IDwgc3RhcnQgKyBIT1VSOgorICAgICAgICAgICAgIyBHYXAgKGEgbm9uLWV4aXN0ZW50IGhvdXIpOiByZXZlcnNlIHRoZSBmb2xkIHJ1bGUuCisgICAgICAgICAgICByZXR1cm4gSE9VUiBpZiBkdC5mb2xkIGVsc2UgWkVSTworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBEU1QgaXMgb2ZmLgorICAgICAgICAgICAgcmV0dXJuIFpFUk8KKworRWFzdGVybjIgID0gVVNUaW1lWm9uZTIoLTUsICJFYXN0ZXJuMiIsICAiRVNUIiwgIkVEVCIpCitDZW50cmFsMiAgPSBVU1RpbWVab25lMigtNiwgIkNlbnRyYWwyIiwgICJDU1QiLCAiQ0RUIikKK01vdW50YWluMiA9IFVTVGltZVpvbmUyKC03LCAiTW91bnRhaW4yIiwgIk1TVCIsICJNRFQiKQorUGFjaWZpYzIgID0gVVNUaW1lWm9uZTIoLTgsICJQYWNpZmljMiIsICAiUFNUIiwgIlBEVCIpCisKKyMgRXVyb3BlX1ZpbG5pdXNfMTk0MSB0emluZm8gaW1wbGVtZW50YXRpb24gcmVwcm9kdWNlcyB0aGUgZm9sbG93aW5nCisjIDE5NDEgdHJhbnNpdGlvbiBmcm9tIE9sc29uJ3MgdHpkaXN0OgorIworIyBab25lIE5BTUUgICAgICAgICAgIEdNVE9GRiBSVUxFUyAgRk9STUFUIFtVTlRJTF0KKyMgWm9uZUV1cm9wZS9WaWxuaXVzICAxOjAwICAgLSAgICAgIENFVCAgICAxOTQwIEF1ZyAgMworIyAgICAgICAgICAgICAgICAgICAgIDM6MDAgICAtICAgICAgTVNLICAgIDE5NDEgSnVuIDI0CisjICAgICAgICAgICAgICAgICAgICAgMTowMCAgIEMtRXVyICBDRSVzVCAgMTk0NCBBdWcKKyMKKyMgJCB6ZHVtcCAtdiBFdXJvcGUvVmlsbml1cyB8IGdyZXAgMTk0MQorIyBFdXJvcGUvVmlsbml1cyAgTW9uIEp1biAyMyAyMDo1OTo1OSAxOTQxIFVUQyA9IE1vbiBKdW4gMjMgMjM6NTk6NTkgMTk0MSBNU0sgaXNkc3Q9MCBnbXRvZmY9MTA4MDAKKyMgRXVyb3BlL1ZpbG5pdXMgIE1vbiBKdW4gMjMgMjE6MDA6MDAgMTk0MSBVVEMgPSBNb24gSnVuIDIzIDIzOjAwOjAwIDE5NDEgQ0VTVCBpc2RzdD0xIGdtdG9mZj03MjAwCisKK2NsYXNzIEV1cm9wZV9WaWxuaXVzXzE5NDEodHppbmZvKToKKyAgICBkZWYgX3V0Y19mb2xkKHNlbGYpOgorICAgICAgICByZXR1cm4gW2RhdGV0aW1lKDE5NDEsIDYsIDIzLCAyMSwgdHppbmZvPXNlbGYpLCAgIyBNb24gSnVuIDIzIDIxOjAwOjAwIDE5NDEgVVRDCisgICAgICAgICAgICAgICAgZGF0ZXRpbWUoMTk0MSwgNiwgMjMsIDIyLCB0emluZm89c2VsZildICAjIE1vbiBKdW4gMjMgMjI6MDA6MDAgMTk0MSBVVEMKKworICAgIGRlZiBfbG9jX2ZvbGQoc2VsZik6CisgICAgICAgIHJldHVybiBbZGF0ZXRpbWUoMTk0MSwgNiwgMjMsIDIzLCB0emluZm89c2VsZiksICAjIE1vbiBKdW4gMjMgMjM6MDA6MDAgMTk0MSBNU0sgLyBDRVNUCisgICAgICAgICAgICAgICAgZGF0ZXRpbWUoMTk0MSwgNiwgMjQsIDAsIHR6aW5mbz1zZWxmKV0gICAjIE1vbiBKdW4gMjQgMDA6MDA6MDAgMTk0MSBDRVNUCisKKyAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKKyAgICAgICAgZm9sZF9zdGFydCwgZm9sZF9zdG9wID0gc2VsZi5fbG9jX2ZvbGQoKQorICAgICAgICBpZiBkdCA8IGZvbGRfc3RhcnQ6CisgICAgICAgICAgICByZXR1cm4gMyAqIEhPVVIKKyAgICAgICAgaWYgZHQgPCBmb2xkX3N0b3A6CisgICAgICAgICAgICByZXR1cm4gKDIgaWYgZHQuZm9sZCBlbHNlIDMpICogSE9VUgorICAgICAgICAjIGlmIGR0ID49IGZvbGRfc3RvcAorICAgICAgICByZXR1cm4gMiAqIEhPVVIKKworICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgorICAgICAgICBmb2xkX3N0YXJ0LCBmb2xkX3N0b3AgPSBzZWxmLl9sb2NfZm9sZCgpCisgICAgICAgIGlmIGR0IDwgZm9sZF9zdGFydDoKKyAgICAgICAgICAgIHJldHVybiAwICogSE9VUgorICAgICAgICBpZiBkdCA8IGZvbGRfc3RvcDoKKyAgICAgICAgICAgIHJldHVybiAoMSBpZiBkdC5mb2xkIGVsc2UgMCkgKiBIT1VSCisgICAgICAgICMgaWYgZHQgPj0gZm9sZF9zdG9wCisgICAgICAgIHJldHVybiAxICogSE9VUgorCisgICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6CisgICAgICAgIGZvbGRfc3RhcnQsIGZvbGRfc3RvcCA9IHNlbGYuX2xvY19mb2xkKCkKKyAgICAgICAgaWYgZHQgPCBmb2xkX3N0YXJ0OgorICAgICAgICAgICAgcmV0dXJuICdNU0snCisgICAgICAgIGlmIGR0IDwgZm9sZF9zdG9wOgorICAgICAgICAgICAgcmV0dXJuICgnTVNLJywgJ0NFU1QnKVtkdC5mb2xkXQorICAgICAgICAjIGlmIGR0ID49IGZvbGRfc3RvcAorICAgICAgICByZXR1cm4gJ0NFU1QnCisKKyAgICBkZWYgZnJvbXV0YyhzZWxmLCBkdCk6CisgICAgICAgIGFzc2VydCBkdC5mb2xkID09IDAKKyAgICAgICAgYXNzZXJ0IGR0LnR6aW5mbyBpcyBzZWxmCisgICAgICAgIGlmIGR0LnllYXIgIT0gMTk0MToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgICAgZm9sZF9zdGFydCwgZm9sZF9zdG9wID0gc2VsZi5fdXRjX2ZvbGQoKQorICAgICAgICBpZiBkdCA8IGZvbGRfc3RhcnQ6CisgICAgICAgICAgICByZXR1cm4gZHQgKyAzICogSE9VUgorICAgICAgICBpZiBkdCA8IGZvbGRfc3RvcDoKKyAgICAgICAgICAgIHJldHVybiAoZHQgKyAyICogSE9VUikucmVwbGFjZShmb2xkPTEpCisgICAgICAgICMgaWYgZHQgPj0gZm9sZF9zdG9wCisgICAgICAgIHJldHVybiBkdCArIDIgKiBIT1VSCisKKworY2xhc3MgVGVzdExvY2FsVGltZURpc2FtYmlndWF0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3ZpbG5pdXNfMTk0MV9mcm9tdXRjKHNlbGYpOgorICAgICAgICBWaWxuaXVzID0gRXVyb3BlX1ZpbG5pdXNfMTk0MSgpCisKKyAgICAgICAgZ2R0ID0gZGF0ZXRpbWUoMTk0MSwgNiwgMjMsIDIwLCA1OSwgNTksIHR6aW5mbz10aW1lem9uZS51dGMpCisgICAgICAgIGxkdCA9IGdkdC5hc3RpbWV6b25lKFZpbG5pdXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGR0LnN0cmZ0aW1lKCIlYyAlWiV6IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ01vbiBKdW4gMjMgMjM6NTk6NTkgMTk0MSBNU0srMDMwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGR0LmZvbGQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGR0LmRzdCgpKQorCisgICAgICAgIGdkdCA9IGRhdGV0aW1lKDE5NDEsIDYsIDIzLCAyMSwgdHppbmZvPXRpbWV6b25lLnV0YykKKyAgICAgICAgbGR0ID0gZ2R0LmFzdGltZXpvbmUoVmlsbml1cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQuc3RyZnRpbWUoIiVjICVaJXoiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnTW9uIEp1biAyMyAyMzowMDowMCAxOTQxIENFU1QrMDIwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGR0LmZvbGQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZHQuZHN0KCkpCisKKyAgICAgICAgZ2R0ID0gZGF0ZXRpbWUoMTk0MSwgNiwgMjMsIDIyLCB0emluZm89dGltZXpvbmUudXRjKQorICAgICAgICBsZHQgPSBnZHQuYXN0aW1lem9uZShWaWxuaXVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxkdC5zdHJmdGltZSgiJWMgJVoleiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUdWUgSnVuIDI0IDAwOjAwOjAwIDE5NDEgQ0VTVCswMjAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQuZm9sZCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxkdC5kc3QoKSkKKworICAgIGRlZiB0ZXN0X3ZpbG5pdXNfMTk0MV90b3V0YyhzZWxmKToKKyAgICAgICAgVmlsbml1cyA9IEV1cm9wZV9WaWxuaXVzXzE5NDEoKQorCisgICAgICAgIGxkdCA9IGRhdGV0aW1lKDE5NDEsIDYsIDIzLCAyMiwgNTksIDU5LCB0emluZm89Vmlsbml1cykKKyAgICAgICAgZ2R0ID0gbGR0LmFzdGltZXpvbmUodGltZXpvbmUudXRjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdkdC5zdHJmdGltZSgiJWMgJVoiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnTW9uIEp1biAyMyAxOTo1OTo1OSAxOTQxIFVUQycpCisKKyAgICAgICAgbGR0ID0gZGF0ZXRpbWUoMTk0MSwgNiwgMjMsIDIzLCA1OSwgNTksIHR6aW5mbz1WaWxuaXVzKQorICAgICAgICBnZHQgPSBsZHQuYXN0aW1lem9uZSh0aW1lem9uZS51dGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2R0LnN0cmZ0aW1lKCIlYyAlWiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdNb24gSnVuIDIzIDIwOjU5OjU5IDE5NDEgVVRDJykKKworICAgICAgICBsZHQgPSBkYXRldGltZSgxOTQxLCA2LCAyMywgMjMsIDU5LCA1OSwgdHppbmZvPVZpbG5pdXMsIGZvbGQ9MSkKKyAgICAgICAgZ2R0ID0gbGR0LmFzdGltZXpvbmUodGltZXpvbmUudXRjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdkdC5zdHJmdGltZSgiJWMgJVoiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnTW9uIEp1biAyMyAyMTo1OTo1OSAxOTQxIFVUQycpCisKKyAgICAgICAgbGR0ID0gZGF0ZXRpbWUoMTk0MSwgNiwgMjQsIDAsIHR6aW5mbz1WaWxuaXVzKQorICAgICAgICBnZHQgPSBsZHQuYXN0aW1lem9uZSh0aW1lem9uZS51dGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2R0LnN0cmZ0aW1lKCIlYyAlWiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdNb24gSnVuIDIzIDIyOjAwOjAwIDE5NDEgVVRDJykKKworCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3JzKHNlbGYpOgorICAgICAgICB0ID0gdGltZSgwLCBmb2xkPTEpCisgICAgICAgIGR0ID0gZGF0ZXRpbWUoMSwgMSwgMSwgZm9sZD0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZm9sZCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5mb2xkLCAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICB0aW1lKDAsIDAsIDAsIDAsIE5vbmUsIDApCisKKyAgICBkZWYgdGVzdF9tZW1iZXIoc2VsZik6CisgICAgICAgIGR0ID0gZGF0ZXRpbWUoMSwgMSwgMSwgZm9sZD0xKQorICAgICAgICB0ID0gZHQudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5mb2xkLCAxKQorICAgICAgICB0ID0gZHQudGltZXR6KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmZvbGQsIDEpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgorICAgICAgICB0ID0gdGltZSgwKQorICAgICAgICBkdCA9IGRhdGV0aW1lKDEsIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5yZXBsYWNlKGZvbGQ9MSkuZm9sZCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5yZXBsYWNlKGZvbGQ9MSkuZm9sZCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnJlcGxhY2UoZm9sZD0wKS5mb2xkLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LnJlcGxhY2UoZm9sZD0wKS5mb2xkLCAwKQorICAgICAgICAjIENoZWNrIHRoYXQgcmVwbGFjZW1lbnQgb2Ygb3RoZXIgZmllbGRzIGRvZXMgbm90IGNoYW5nZSAiZm9sZCIuCisgICAgICAgIHQgPSB0LnJlcGxhY2UoZm9sZD0xLCB0emluZm89RWFzdGVybikKKyAgICAgICAgZHQgPSBkdC5yZXBsYWNlKGZvbGQ9MSwgdHppbmZvPUVhc3Rlcm4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5yZXBsYWNlKHR6aW5mbz1Ob25lKS5mb2xkLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LnJlcGxhY2UodHppbmZvPU5vbmUpLmZvbGQsIDEpCisgICAgICAgICMgQ2hlY2sgdGhhdCBmb2xkIGlzIGEga2V5d29yZC1vbmx5IGFyZ3VtZW50CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHQucmVwbGFjZSgxLCAxLCAxLCBOb25lLCAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBkdC5yZXBsYWNlKDEsIDEsIDEsIDEsIDEsIDEsIDEsIE5vbmUsIDEpCisKKyAgICBkZWYgdGVzdF9jb21wYXJpc29uKHNlbGYpOgorICAgICAgICB0ID0gdGltZSgwKQorICAgICAgICBkdCA9IGRhdGV0aW1lKDEsIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdC5yZXBsYWNlKGZvbGQ9MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQsIGR0LnJlcGxhY2UoZm9sZD0xKSkKKworICAgIGRlZiB0ZXN0X2hhc2goc2VsZik6CisgICAgICAgIHQgPSB0aW1lKDApCisgICAgICAgIGR0ID0gZGF0ZXRpbWUoMSwgMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQpLCBoYXNoKHQucmVwbGFjZShmb2xkPTEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGR0KSwgaGFzaChkdC5yZXBsYWNlKGZvbGQ9MSkpKQorCisgICAgQHN1cHBvcnQucnVuX3dpdGhfdHooJ0VTVCswNUVEVCxNMy4yLjAsTTExLjEuMCcpCisgICAgZGVmIHRlc3RfZnJvbXRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgcyA9IDE0MTQ5MDYyMDAKKyAgICAgICAgZHQwID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChzKQorICAgICAgICBkdDEgPSBkYXRldGltZS5mcm9tdGltZXN0YW1wKHMgKyAzNjAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MC5mb2xkLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MS5mb2xkLCAxKQorCisgICAgQHN1cHBvcnQucnVuX3dpdGhfdHooJ0F1c3RyYWxpYS9Mb3JkX0hvd2UnKQorICAgIGRlZiB0ZXN0X2Zyb210aW1lc3RhbXBfbG9yZF9ob3dlKHNlbGYpOgorICAgICAgICB0bSA9IF90aW1lLmxvY2FsdGltZSgxLjRlOSkKKyAgICAgICAgaWYgX3RpbWUuc3RyZnRpbWUoJyVaJXonLCB0bSkgIT0gJ0xIU1QrMTAzMCc6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdBdXN0cmFsaWEvTG9yZF9Ib3dlIHRpbWV6b25lIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybScpCisgICAgICAgICMgJCBUWj1BdXN0cmFsaWEvTG9yZF9Ib3dlIGRhdGUgLXIgMTQyODE1ODcwMAorICAgICAgICAjIFN1biBBcHIgIDUgMDE6NDU6MDAgTEhEVCAyMDE1CisgICAgICAgICMgJCBUWj1BdXN0cmFsaWEvTG9yZF9Ib3dlIGRhdGUgLXIgMTQyODE2MDUwMAorICAgICAgICAjIFN1biBBcHIgIDUgMDE6NDU6MDAgTEhTVCAyMDE1CisgICAgICAgIHMgPSAxNDI4MTU4NzAwCisgICAgICAgIHQwID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChzKQorICAgICAgICB0MSA9IGRhdGV0aW1lLmZyb210aW1lc3RhbXAocyArIDE4MDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDAsIHQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQwLmZvbGQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEuZm9sZCwgMSkKKworCisgICAgQHN1cHBvcnQucnVuX3dpdGhfdHooJ0VTVCswNUVEVCxNMy4yLjAsTTExLjEuMCcpCisgICAgZGVmIHRlc3RfdGltZXN0YW1wKHNlbGYpOgorICAgICAgICBkdDAgPSBkYXRldGltZSgyMDE0LCAxMSwgMiwgMSwgMzApCisgICAgICAgIGR0MSA9IGR0MC5yZXBsYWNlKGZvbGQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDAudGltZXN0YW1wKCkgKyAzNjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGR0MS50aW1lc3RhbXAoKSkKKworICAgIEBzdXBwb3J0LnJ1bl93aXRoX3R6KCdBdXN0cmFsaWEvTG9yZF9Ib3dlJykKKyAgICBkZWYgdGVzdF90aW1lc3RhbXBfbG9yZF9ob3dlKHNlbGYpOgorICAgICAgICB0bSA9IF90aW1lLmxvY2FsdGltZSgxLjRlOSkKKyAgICAgICAgaWYgX3RpbWUuc3RyZnRpbWUoJyVaJXonLCB0bSkgIT0gJ0xIU1QrMTAzMCc6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdBdXN0cmFsaWEvTG9yZF9Ib3dlIHRpbWV6b25lIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybScpCisgICAgICAgIHQgPSBkYXRldGltZSgyMDE1LCA0LCA1LCAxLCA0NSkKKyAgICAgICAgczAgPSB0LnJlcGxhY2UoZm9sZD0wKS50aW1lc3RhbXAoKQorICAgICAgICBzMSA9IHQucmVwbGFjZShmb2xkPTEpLnRpbWVzdGFtcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczAgKyAxODAwLCBzMSkKKworCisgICAgQHN1cHBvcnQucnVuX3dpdGhfdHooJ0VTVCswNUVEVCxNMy4yLjAsTTExLjEuMCcpCisgICAgZGVmIHRlc3RfYXN0aW1lem9uZShzZWxmKToKKyAgICAgICAgZHQwID0gZGF0ZXRpbWUoMjAxNCwgMTEsIDIsIDEsIDMwKQorICAgICAgICBkdDEgPSBkdDAucmVwbGFjZShmb2xkPTEpCisgICAgICAgICMgQ29udmVydCBib3RoIG5haXZlIGluc3RhbmNlcyB0byBhd2FyZS4KKyAgICAgICAgYWR0MCA9IGR0MC5hc3RpbWV6b25lKCkKKyAgICAgICAgYWR0MSA9IGR0MS5hc3RpbWV6b25lKCkKKyAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBmaXJzdCBpbnN0YW5jZSBpbiBEU1Qgem9uZSBhbmQgdGhlIHNlY29uZCBpbiBTVEQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZHQwLnR6bmFtZSgpLCAnRURUJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZHQxLnR6bmFtZSgpLCAnRVNUJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZHQwICsgSE9VUiwgYWR0MSkKKyAgICAgICAgIyBBd2FyZSBpbnN0YW5jZXMgd2l0aCBmaXhlZCBvZmZzZXQgdHppbmZvJ3MgYWx3YXlzIGhhdmUgZm9sZD0wCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWR0MC5mb2xkLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkdDEuZm9sZCwgMCkKKworCisgICAgZGVmIHRlc3RfcGlja2xlX2ZvbGQoc2VsZik6CisgICAgICAgIHQgPSB0aW1lKGZvbGQ9MSkKKyAgICAgICAgZHQgPSBkYXRldGltZSgxLCAxLCAxLCBmb2xkPTEpCisgICAgICAgIGZvciBwaWNrbGVyLCB1bnBpY2tsZXIsIHByb3RvIGluIHBpY2tsZV9jaG9pY2VzOgorICAgICAgICAgICAgZm9yIHggaW4gW3QsIGR0XToKKyAgICAgICAgICAgICAgICBzID0gcGlja2xlci5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgICAgICB5ID0gdW5waWNrbGVyLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAgaWYgcHJvdG8gPCA0IGVsc2UgeC5mb2xkKSwgeS5mb2xkKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgdCA9IHRpbWUoZm9sZD0xKQorICAgICAgICBkdCA9IGRhdGV0aW1lKDEsIDEsIDEsIGZvbGQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQpLCAnZGF0ZXRpbWUudGltZSgwLCAwLCBmb2xkPTEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGR0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMSwgMSwgMSwgMCwgMCwgZm9sZD0xKScpCisKKyAgICBkZWYgdGVzdF9kc3Qoc2VsZik6CisgICAgICAgICMgTGV0J3MgZmlyc3QgZXN0YWJsaXNoIHRoYXQgdGhpbmdzIHdvcmsgaW4gcmVndWxhciB0aW1lcy4KKyAgICAgICAgZHRfc3VtbWVyID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCAxLCB0emluZm89RWFzdGVybjIpIC0gdGltZWRlbHRhLnJlc29sdXRpb24KKyAgICAgICAgZHRfd2ludGVyID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCAyLCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHRfc3VtbWVyLmRzdCgpLCBIT1VSKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0X3dpbnRlci5kc3QoKSwgWkVSTykKKyAgICAgICAgIyBUaGUgZGlzYW1iaWd1YXRpb24gZmxhZyBpcyBpZ25vcmVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHRfc3VtbWVyLnJlcGxhY2UoZm9sZD0xKS5kc3QoKSwgSE9VUikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdF93aW50ZXIucmVwbGFjZShmb2xkPTEpLmRzdCgpLCBaRVJPKQorCisgICAgICAgICMgUGljayBsb2NhbCB0aW1lIGluIHRoZSBmb2xkLgorICAgICAgICBmb3IgbWludXRlIGluIFswLCAzMCwgNTldOgorICAgICAgICAgICAgZHQgPSBkYXRldGltZSgyMDAyLCAxMCwgMjcsIDEsIG1pbnV0ZSwgdHppbmZvPUVhc3Rlcm4yKQorICAgICAgICAgICAgIyBXaXRoIGZvbGQ9MCAodGhlIGRlZmF1bHQpIGl0IGlzIGluIERTVC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuZHN0KCksIEhPVVIpCisgICAgICAgICAgICAjIFdpdGggZm9sZD0xIGl0IGlzIGluIFNURC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQucmVwbGFjZShmb2xkPTEpLmRzdCgpLCBaRVJPKQorCisgICAgICAgICMgUGljayBsb2NhbCB0aW1lIGluIHRoZSBnYXAuCisgICAgICAgIGZvciBtaW51dGUgaW4gWzAsIDMwLCA1OV06CisgICAgICAgICAgICBkdCA9IGRhdGV0aW1lKDIwMDIsIDQsIDcsIDIsIG1pbnV0ZSwgdHppbmZvPUVhc3Rlcm4yKQorICAgICAgICAgICAgIyBXaXRoIGZvbGQ9MCAodGhlIGRlZmF1bHQpIGl0IGlzIGluIFNURC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuZHN0KCksIFpFUk8pCisgICAgICAgICAgICAjIFdpdGggZm9sZD0xIGl0IGlzIGluIERTVC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQucmVwbGFjZShmb2xkPTEpLmRzdCgpLCBIT1VSKQorCisKKyAgICBkZWYgdGVzdF91dGNvZmZzZXQoc2VsZik6CisgICAgICAgICMgTGV0J3MgZmlyc3QgZXN0YWJsaXNoIHRoYXQgdGhpbmdzIHdvcmsgaW4gcmVndWxhciB0aW1lcy4KKyAgICAgICAgZHRfc3VtbWVyID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCAxLCB0emluZm89RWFzdGVybjIpIC0gdGltZWRlbHRhLnJlc29sdXRpb24KKyAgICAgICAgZHRfd2ludGVyID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCAyLCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHRfc3VtbWVyLnV0Y29mZnNldCgpLCAtNCAqIEhPVVIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHRfd2ludGVyLnV0Y29mZnNldCgpLCAtNSAqIEhPVVIpCisgICAgICAgICMgVGhlIGRpc2FtYmlndWF0aW9uIGZsYWcgaXMgaWdub3JlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0X3N1bW1lci5yZXBsYWNlKGZvbGQ9MSkudXRjb2Zmc2V0KCksIC00ICogSE9VUikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdF93aW50ZXIucmVwbGFjZShmb2xkPTEpLnV0Y29mZnNldCgpLCAtNSAqIEhPVVIpCisKKyAgICBkZWYgdGVzdF9mcm9tdXRjKHNlbGYpOgorICAgICAgICAjIExldCdzIGZpcnN0IGVzdGFibGlzaCB0aGF0IHRoaW5ncyB3b3JrIGluIHJlZ3VsYXIgdGltZXMuCisgICAgICAgIHVfc3VtbWVyID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCA2LCB0emluZm89RWFzdGVybjIpIC0gdGltZWRlbHRhLnJlc29sdXRpb24KKyAgICAgICAgdV93aW50ZXIgPSBkYXRldGltZSgyMDAyLCAxMCwgMjcsIDcsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgdF9zdW1tZXIgPSBFYXN0ZXJuMi5mcm9tdXRjKHVfc3VtbWVyKQorICAgICAgICB0X3dpbnRlciA9IEVhc3Rlcm4yLmZyb211dGModV93aW50ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodF9zdW1tZXIsIHVfc3VtbWVyIC0gNCAqIEhPVVIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodF93aW50ZXIsIHVfd2ludGVyIC0gNSAqIEhPVVIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodF9zdW1tZXIuZm9sZCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0X3dpbnRlci5mb2xkLCAwKQorCisgICAgICAgICMgV2hhdCBoYXBwZW5zIGluIHRoZSBmYWxsLWJhY2sgZm9sZD8KKyAgICAgICAgdSA9IGRhdGV0aW1lKDIwMDIsIDEwLCAyNywgNSwgMzAsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgdDAgPSBFYXN0ZXJuMi5mcm9tdXRjKHUpCisgICAgICAgIHUgKz0gSE9VUgorICAgICAgICB0MSA9IEVhc3Rlcm4yLmZyb211dGModSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MCwgdDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDAuZm9sZCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS5mb2xkLCAxKQorICAgICAgICAjIFRoZSB0cmlja3kgcGFydCBpcyB3aGVuIHUgaXMgaW4gdGhlIGxvY2FsIGZvbGQ6CisgICAgICAgIHUgPSBkYXRldGltZSgyMDAyLCAxMCwgMjcsIDEsIDMwLCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHQgPSBFYXN0ZXJuMi5mcm9tdXRjKHUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHQuZGF5LCB0LmhvdXIpLCAoMjYsIDIxKSkKKyAgICAgICAgIyAuLiBvciBnZXRzIGludG8gdGhlIGxvY2FsIGZvbGQgYWZ0ZXIgYSBzdGFuZGFyZCB0aW1lIGFkanVzdG1lbnQKKyAgICAgICAgdSA9IGRhdGV0aW1lKDIwMDIsIDEwLCAyNywgNiwgMzAsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgdCA9IEVhc3Rlcm4yLmZyb211dGModSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgodC5kYXksIHQuaG91ciksICgyNywgMSkpCisKKyAgICAgICAgIyBXaGF0IGhhcHBlbnMgaW4gdGhlIHNwcmluZy1mb3J3YXJkIGdhcD8KKyAgICAgICAgdSA9IGRhdGV0aW1lKDIwMDIsIDQsIDcsIDIsIDAsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgdCA9IEVhc3Rlcm4yLmZyb211dGModSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgodC5kYXksIHQuaG91ciksICg2LCAyMSkpCisKKyAgICBkZWYgdGVzdF9taXhlZF9jb21wYXJlX3JlZ3VsYXIoc2VsZik6CisgICAgICAgIHQgPSBkYXRldGltZSgyMDAwLCAxLCAxLCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdC5hc3RpbWV6b25lKHRpbWV6b25lLnV0YykpCisgICAgICAgIHQgPSBkYXRldGltZSgyMDAwLCA2LCAxLCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdC5hc3RpbWV6b25lKHRpbWV6b25lLnV0YykpCisKKyAgICBkZWYgdGVzdF9taXhlZF9jb21wYXJlX2ZvbGQoc2VsZik6CisgICAgICAgIHRfZm9sZCA9IGRhdGV0aW1lKDIwMDIsIDEwLCAyNywgMSwgNDUsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgdF9mb2xkX3V0YyA9IHRfZm9sZC5hc3RpbWV6b25lKHRpbWV6b25lLnV0YykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh0X2ZvbGQsIHRfZm9sZF91dGMpCisKKyAgICBkZWYgdGVzdF9taXhlZF9jb21wYXJlX2dhcChzZWxmKToKKyAgICAgICAgdF9nYXAgPSBkYXRldGltZSgyMDAyLCA0LCA3LCAyLCA0NSwgdHppbmZvPUVhc3Rlcm4yKQorICAgICAgICB0X2dhcF91dGMgPSB0X2dhcC5hc3RpbWV6b25lKHRpbWV6b25lLnV0YykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh0X2dhcCwgdF9nYXBfdXRjKQorCisgICAgZGVmIHRlc3RfaGFzaF9hd2FyZShzZWxmKToKKyAgICAgICAgdCA9IGRhdGV0aW1lKDIwMDAsIDEsIDEsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQpLCBoYXNoKHQucmVwbGFjZShmb2xkPTEpKSkKKyAgICAgICAgdF9mb2xkID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCAxLCA0NSwgdHppbmZvPUVhc3Rlcm4yKQorICAgICAgICB0X2dhcCA9IGRhdGV0aW1lKDIwMDIsIDQsIDcsIDIsIDQ1LCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh0X2ZvbGQpLCBoYXNoKHRfZm9sZC5yZXBsYWNlKGZvbGQ9MSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godF9nYXApLCBoYXNoKHRfZ2FwLnJlcGxhY2UoZm9sZD0xKSkpCisKK1NFQyA9IHRpbWVkZWx0YSgwLCAxKQorCitkZWYgcGFpcnMoaXRlcmFibGUpOgorICAgIGEsIGIgPSBpdGVydG9vbHMudGVlKGl0ZXJhYmxlKQorICAgIG5leHQoYiwgTm9uZSkKKyAgICByZXR1cm4gemlwKGEsIGIpCisKK2NsYXNzIFpvbmVJbmZvKHR6aW5mbyk6CisgICAgem9uZXJvb3QgPSAnL3Vzci9zaGFyZS96b25laW5mbycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXQsIHRpKToKKyAgICAgICAgIiIiCisKKyAgICAgICAgOnBhcmFtIHV0OiBhcnJheQorICAgICAgICAgICAgQXJyYXkgb2YgdHJhbnNpdGlvbiBwb2ludCB0aW1lc3RhbXBzCisgICAgICAgIDpwYXJhbSB0aTogbGlzdAorICAgICAgICAgICAgQSBsaXN0IG9mIChvZmZzZXQsIGlzZHN0LCBhYmJyKSB0dXBsZXMKKyAgICAgICAgOnJldHVybjogTm9uZQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi51dCA9IHV0CisgICAgICAgIHNlbGYudGkgPSB0aQorICAgICAgICBzZWxmLmx0ID0gc2VsZi5pbnZlcnQodXQsIHRpKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBpbnZlcnQodXQsIHRpKToKKyAgICAgICAgbHQgPSAoYXJyYXkoJ3EnLCB1dCksIGFycmF5KCdxJywgdXQpKQorICAgICAgICBpZiB1dDoKKyAgICAgICAgICAgIG9mZnNldCA9IHRpWzBdWzBdIC8vIFNFQworICAgICAgICAgICAgbHRbMF1bMF0gKz0gb2Zmc2V0CisgICAgICAgICAgICBsdFsxXVswXSArPSBvZmZzZXQKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbih1dCkpOgorICAgICAgICAgICAgICAgIGx0WzBdW2ldICs9IHRpW2ktMV1bMF0gLy8gU0VDCisgICAgICAgICAgICAgICAgbHRbMV1baV0gKz0gdGlbaV1bMF0gLy8gU0VDCisgICAgICAgIHJldHVybiBsdAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21maWxlKGNscywgZmlsZW9iaik6CisgICAgICAgIGlmIGZpbGVvYmoucmVhZCg0KS5kZWNvZGUoKSAhPSAiVFppZiI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJub3QgYSB6b25laW5mbyBmaWxlIikKKyAgICAgICAgZmlsZW9iai5zZWVrKDMyKQorICAgICAgICBjb3VudHMgPSBhcnJheSgnaScpCisgICAgICAgIGNvdW50cy5mcm9tZmlsZShmaWxlb2JqLCAzKQorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyICE9ICdiaWcnOgorICAgICAgICAgICAgY291bnRzLmJ5dGVzd2FwKCkKKworICAgICAgICB1dCA9IGFycmF5KCdpJykKKyAgICAgICAgdXQuZnJvbWZpbGUoZmlsZW9iaiwgY291bnRzWzBdKQorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyICE9ICdiaWcnOgorICAgICAgICAgICAgdXQuYnl0ZXN3YXAoKQorCisgICAgICAgIHR5cGVfaW5kaWNlcyA9IGFycmF5KCdCJykKKyAgICAgICAgdHlwZV9pbmRpY2VzLmZyb21maWxlKGZpbGVvYmosIGNvdW50c1swXSkKKworICAgICAgICB0dGlzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoY291bnRzWzFdKToKKyAgICAgICAgICAgIHR0aXMuYXBwZW5kKHN0cnVjdC51bnBhY2soIj5sYmIiLCBmaWxlb2JqLnJlYWQoNikpKQorCisgICAgICAgIGFiYnJzID0gZmlsZW9iai5yZWFkKGNvdW50c1syXSkKKworICAgICAgICAjIENvbnZlcnQgdHRpcworICAgICAgICBmb3IgaSwgKGdtdG9mZiwgaXNkc3QsIGFiYnJpbmQpIGluIGVudW1lcmF0ZSh0dGlzKToKKyAgICAgICAgICAgIGFiYnIgPSBhYmJyc1thYmJyaW5kOmFiYnJzLmZpbmQoMCwgYWJicmluZCldLmRlY29kZSgpCisgICAgICAgICAgICB0dGlzW2ldID0gKHRpbWVkZWx0YSgwLCBnbXRvZmYpLCBpc2RzdCwgYWJicikKKworICAgICAgICB0aSA9IFtOb25lXSAqIGxlbih1dCkKKyAgICAgICAgZm9yIGksIGlkeCBpbiBlbnVtZXJhdGUodHlwZV9pbmRpY2VzKToKKyAgICAgICAgICAgIHRpW2ldID0gdHRpc1tpZHhdCisKKyAgICAgICAgc2VsZiA9IGNscyh1dCwgdGkpCisKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tbmFtZShjbHMsIG5hbWUpOgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGNscy56b25lcm9vdCwgbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGY6CisgICAgICAgICAgICByZXR1cm4gY2xzLmZyb21maWxlKGYpCisKKyAgICBFUE9DSE9SRElOQUwgPSBkYXRlKDE5NzAsIDEsIDEpLnRvb3JkaW5hbCgpCisKKyAgICBkZWYgZnJvbXV0YyhzZWxmLCBkdCk6CisgICAgICAgICIiImRhdGV0aW1lIGluIFVUQyAtPiBkYXRldGltZSBpbiBsb2NhbCB0aW1lLiIiIgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGR0LCBkYXRldGltZSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImZyb211dGMoKSByZXF1aXJlcyBhIGRhdGV0aW1lIGFyZ3VtZW50IikKKyAgICAgICAgaWYgZHQudHppbmZvIGlzIG5vdCBzZWxmOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZHQudHppbmZvIGlzIG5vdCBzZWxmIikKKworICAgICAgICB0aW1lc3RhbXAgPSAoKGR0LnRvb3JkaW5hbCgpIC0gc2VsZi5FUE9DSE9SRElOQUwpICogODY0MDAKKyAgICAgICAgICAgICAgICAgICAgICsgZHQuaG91ciAqIDM2MDAKKyAgICAgICAgICAgICAgICAgICAgICsgZHQubWludXRlICogNjAKKyAgICAgICAgICAgICAgICAgICAgICsgZHQuc2Vjb25kKQorCisgICAgICAgIGlmIHRpbWVzdGFtcCA8IHNlbGYudXRbMV06CisgICAgICAgICAgICB0dGkgPSBzZWxmLnRpWzBdCisgICAgICAgICAgICBmb2xkID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWR4ID0gYmlzZWN0LmJpc2VjdF9yaWdodChzZWxmLnV0LCB0aW1lc3RhbXApCisgICAgICAgICAgICBhc3NlcnQgc2VsZi51dFtpZHgtMV0gPD0gdGltZXN0YW1wCisgICAgICAgICAgICBhc3NlcnQgaWR4ID09IGxlbihzZWxmLnV0KSBvciB0aW1lc3RhbXAgPCBzZWxmLnV0W2lkeF0KKyAgICAgICAgICAgIHR0aV9wcmV2LCB0dGkgPSBzZWxmLnRpW2lkeC0yOmlkeF0KKyAgICAgICAgICAgICMgRGV0ZWN0IGZvbGQKKyAgICAgICAgICAgIHNoaWZ0ID0gdHRpX3ByZXZbMF0gLSB0dGlbMF0KKyAgICAgICAgICAgIGZvbGQgPSAoc2hpZnQgPiB0aW1lZGVsdGEoMCwgdGltZXN0YW1wIC0gc2VsZi51dFtpZHgtMV0pKQorICAgICAgICBkdCArPSB0dGlbMF0KKyAgICAgICAgaWYgZm9sZDoKKyAgICAgICAgICAgIHJldHVybiBkdC5yZXBsYWNlKGZvbGQ9MSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBkdAorCisgICAgZGVmIF9maW5kX3RpKHNlbGYsIGR0LCBpKToKKyAgICAgICAgdGltZXN0YW1wID0gKChkdC50b29yZGluYWwoKSAtIHNlbGYuRVBPQ0hPUkRJTkFMKSAqIDg2NDAwCisgICAgICAgICAgICAgKyBkdC5ob3VyICogMzYwMAorICAgICAgICAgICAgICsgZHQubWludXRlICogNjAKKyAgICAgICAgICAgICArIGR0LnNlY29uZCkKKyAgICAgICAgbHQgPSBzZWxmLmx0W2R0LmZvbGRdCisgICAgICAgIGlkeCA9IGJpc2VjdC5iaXNlY3RfcmlnaHQobHQsIHRpbWVzdGFtcCkKKworICAgICAgICByZXR1cm4gc2VsZi50aVttYXgoMCwgaWR4IC0gMSldW2ldCisKKyAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfdGkoZHQsIDApCisKKyAgICBkZWYgZHN0KHNlbGYsIGR0KToKKyAgICAgICAgaXNkc3QgPSBzZWxmLl9maW5kX3RpKGR0LCAxKQorICAgICAgICAjIFhYWDogV2UgY2Fubm90IGFjY3VyYXRlbHkgZGV0ZXJtaW5lIHRoZSAic2F2ZSIgdmFsdWUsCisgICAgICAgICMgc28gbGV0J3MgcmV0dXJuIDFoIHdoZW5ldmVyIERTVCBpcyBpbiBlZmZlY3QuICBTaW5jZQorICAgICAgICAjIHdlIGRvbid0IHVzZSBkc3QoKSBpbiBmcm9tdXRjKCksIGl0IGlzIHVubGlrZWx5IHRoYXQKKyAgICAgICAgIyBpdCB3aWxsIGJlIG5lZWRlZCBmb3IgYW55dGhpbmcgbW9yZSB0aGFuIGJvb2woZHN0KCkpLgorICAgICAgICByZXR1cm4gWkVSTyBpZiBpc2RzdCBlbHNlIEhPVVIKKworICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmluZF90aShkdCwgMikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB6b25lbmFtZXMoY2xzLCB6b25lZGlyPU5vbmUpOgorICAgICAgICBpZiB6b25lZGlyIGlzIE5vbmU6CisgICAgICAgICAgICB6b25lZGlyID0gY2xzLnpvbmVyb290CisgICAgICAgIHpvbmVfdGFiID0gb3MucGF0aC5qb2luKHpvbmVkaXIsICd6b25lLnRhYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKHpvbmVfdGFiKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aXRoIGY6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lIGFuZCBub3QgbGluZS5zdGFydHN3aXRoKCcjJyk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUuc3BsaXQoKVsyXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHN0YXRzKGNscywgc3RhcnRfeWVhcj0xKToKKyAgICAgICAgY291bnQgPSBnYXBfY291bnQgPSBmb2xkX2NvdW50ID0gemVyb3NfY291bnQgPSAwCisgICAgICAgIG1pbl9nYXAgPSBtaW5fZm9sZCA9IHRpbWVkZWx0YS5tYXgKKyAgICAgICAgbWF4X2dhcCA9IG1heF9mb2xkID0gWkVSTworICAgICAgICBtaW5fZ2FwX2RhdGV0aW1lID0gbWF4X2dhcF9kYXRldGltZSA9IGRhdGV0aW1lLm1pbgorICAgICAgICBtaW5fZ2FwX3pvbmUgPSBtYXhfZ2FwX3pvbmUgPSBOb25lCisgICAgICAgIG1pbl9mb2xkX2RhdGV0aW1lID0gbWF4X2ZvbGRfZGF0ZXRpbWUgPSBkYXRldGltZS5taW4KKyAgICAgICAgbWluX2ZvbGRfem9uZSA9IG1heF9mb2xkX3pvbmUgPSBOb25lCisgICAgICAgIHN0YXRzX3NpbmNlID0gZGF0ZXRpbWUoc3RhcnRfeWVhciwgMSwgMSkgIyBTdGFydGluZyBmcm9tIDE5NzAgZWxpbWluYXRlcyBhIGxvdCBvZiBub2lzZQorICAgICAgICBmb3Igem9uZW5hbWUgaW4gY2xzLnpvbmVuYW1lcygpOgorICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgdHogPSBjbHMuZnJvbW5hbWUoem9uZW5hbWUpCisgICAgICAgICAgICBmb3IgZHQsIHNoaWZ0IGluIHR6LnRyYW5zaXRpb25zKCk6CisgICAgICAgICAgICAgICAgaWYgZHQgPCBzdGF0c19zaW5jZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBzaGlmdCA+IFpFUk86CisgICAgICAgICAgICAgICAgICAgIGdhcF9jb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCwgZHQpID4gKG1heF9nYXAsIG1heF9nYXBfZGF0ZXRpbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2dhcCA9IHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZ2FwX3pvbmUgPSB6b25lbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2dhcF9kYXRldGltZSA9IGR0CisgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCwgZGF0ZXRpbWUubWF4IC0gZHQpIDwgKG1pbl9nYXAsIGRhdGV0aW1lLm1heCAtIG1pbl9nYXBfZGF0ZXRpbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgbWluX2dhcCA9IHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZ2FwX3pvbmUgPSB6b25lbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgbWluX2dhcF9kYXRldGltZSA9IGR0CisgICAgICAgICAgICAgICAgZWxpZiBzaGlmdCA8IFpFUk86CisgICAgICAgICAgICAgICAgICAgIGZvbGRfY291bnQgKz0gMQorICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IC1zaGlmdAorICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQsIGR0KSA+IChtYXhfZm9sZCwgbWF4X2ZvbGRfZGF0ZXRpbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2ZvbGQgPSBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2ZvbGRfem9uZSA9IHpvbmVuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZm9sZF9kYXRldGltZSA9IGR0CisgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCwgZGF0ZXRpbWUubWF4IC0gZHQpIDwgKG1pbl9mb2xkLCBkYXRldGltZS5tYXggLSBtaW5fZm9sZF9kYXRldGltZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZm9sZCA9IHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZm9sZF96b25lID0gem9uZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9mb2xkX2RhdGV0aW1lID0gZHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB6ZXJvc19jb3VudCArPSAxCisgICAgICAgIHRyYW5zX2NvdW50cyA9IChnYXBfY291bnQsIGZvbGRfY291bnQsIHplcm9zX2NvdW50KQorICAgICAgICBwcmludCgiTnVtYmVyIG9mIHpvbmVzOiAgICAgICAlNWQiICUgY291bnQpCisgICAgICAgIHByaW50KCJOdW1iZXIgb2YgdHJhbnNpdGlvbnM6ICU1ZCA9ICVkIChnYXBzKSArICVkIChmb2xkcykgKyAlZCAoemVyb3MpIiAlCisgICAgICAgICAgICAgICgoc3VtKHRyYW5zX2NvdW50cyksKSArIHRyYW5zX2NvdW50cykpCisgICAgICAgIHByaW50KCJNaW4gZ2FwOiAgICAgICAgICUxNnMgYXQgJXMgaW4gJXMiICUgKG1pbl9nYXAsIG1pbl9nYXBfZGF0ZXRpbWUsIG1pbl9nYXBfem9uZSkpCisgICAgICAgIHByaW50KCJNYXggZ2FwOiAgICAgICAgICUxNnMgYXQgJXMgaW4gJXMiICUgKG1heF9nYXAsIG1heF9nYXBfZGF0ZXRpbWUsIG1heF9nYXBfem9uZSkpCisgICAgICAgIHByaW50KCJNaW4gZm9sZDogICAgICAgICUxNnMgYXQgJXMgaW4gJXMiICUgKG1pbl9mb2xkLCBtaW5fZm9sZF9kYXRldGltZSwgbWluX2ZvbGRfem9uZSkpCisgICAgICAgIHByaW50KCJNYXggZm9sZDogICAgICAgICUxNnMgYXQgJXMgaW4gJXMiICUgKG1heF9mb2xkLCBtYXhfZm9sZF9kYXRldGltZSwgbWF4X2ZvbGRfem9uZSkpCisKKworICAgIGRlZiB0cmFuc2l0aW9ucyhzZWxmKToKKyAgICAgICAgZm9yIChfLCBwcmV2X3RpKSwgKHQsIHRpKSBpbiBwYWlycyh6aXAoc2VsZi51dCwgc2VsZi50aSkpOgorICAgICAgICAgICAgc2hpZnQgPSB0aVswXSAtIHByZXZfdGlbMF0KKyAgICAgICAgICAgIHlpZWxkIGRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAodCksIHNoaWZ0CisKKyAgICBkZWYgbm9uZHN0X2ZvbGRzKHNlbGYpOgorICAgICAgICAiIiJGaW5kIGFsbCBmb2xkcyB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIGlzZHN0IG9uIGJvdGggc2lkZXMgb2YgdGhlIHRyYW5zaXRpb24uIiIiCisgICAgICAgIGZvciAoXywgcHJldl90aSksICh0LCB0aSkgaW4gcGFpcnMoemlwKHNlbGYudXQsIHNlbGYudGkpKToKKyAgICAgICAgICAgIHNoaWZ0ID0gdGlbMF0gLSBwcmV2X3RpWzBdCisgICAgICAgICAgICBpZiBzaGlmdCA8IFpFUk8gYW5kIHRpWzFdID09IHByZXZfdGlbMV06CisgICAgICAgICAgICAgICAgeWllbGQgZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCh0KSwgLXNoaWZ0LCBwcmV2X3RpWzJdLCB0aVsyXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHByaW50X2FsbF9ub25kc3RfZm9sZHMoY2xzLCBzYW1lX2FiYnI9RmFsc2UsIHN0YXJ0X3llYXI9MSk6CisgICAgICAgIGNvdW50ID0gMAorICAgICAgICBmb3Igem9uZW5hbWUgaW4gY2xzLnpvbmVuYW1lcygpOgorICAgICAgICAgICAgdHogPSBjbHMuZnJvbW5hbWUoem9uZW5hbWUpCisgICAgICAgICAgICBmb3IgZHQsIHNoaWZ0LCBwcmV2X2FiYnIsIGFiYnIgaW4gdHoubm9uZHN0X2ZvbGRzKCk6CisgICAgICAgICAgICAgICAgaWYgZHQueWVhciA8IHN0YXJ0X3llYXIgb3Igc2FtZV9hYmJyIGFuZCBwcmV2X2FiYnIgIT0gYWJicjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgcHJpbnQoIiUzZCkgJS0zMHMgJXMgJTEwcyAlNXMgLT4gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAoY291bnQsIHpvbmVuYW1lLCBkdCwgc2hpZnQsIHByZXZfYWJiciwgYWJicikpCisKKyAgICBkZWYgZm9sZHMoc2VsZik6CisgICAgICAgIGZvciB0LCBzaGlmdCBpbiBzZWxmLnRyYW5zaXRpb25zKCk6CisgICAgICAgICAgICBpZiBzaGlmdCA8IFpFUk86CisgICAgICAgICAgICAgICAgeWllbGQgdCwgLXNoaWZ0CisKKyAgICBkZWYgZ2FwcyhzZWxmKToKKyAgICAgICAgZm9yIHQsIHNoaWZ0IGluIHNlbGYudHJhbnNpdGlvbnMoKToKKyAgICAgICAgICAgIGlmIHNoaWZ0ID4gWkVSTzoKKyAgICAgICAgICAgICAgICB5aWVsZCB0LCBzaGlmdAorCisgICAgZGVmIHplcm9zKHNlbGYpOgorICAgICAgICBmb3IgdCwgc2hpZnQgaW4gc2VsZi50cmFuc2l0aW9ucygpOgorICAgICAgICAgICAgaWYgbm90IHNoaWZ0OgorICAgICAgICAgICAgICAgIHlpZWxkIHQKKworCitjbGFzcyBab25lSW5mb1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHpvbmVuYW1lID0gJ0FtZXJpY2EvTmV3X1lvcmsnCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU2tpcHBpbmcgem9uZWluZm8gdGVzdHMgb24gV2luZG93cyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudHogPSBab25lSW5mby5mcm9tbmFtZShzZWxmLnpvbmVuYW1lKQorICAgICAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU2tpcHBpbmcgJXM6ICVzIiAlIChzZWxmLnpvbmVuYW1lLCBlcnIpKQorCisgICAgZGVmIGFzc2VydEVxdWl2RGF0ZXRpbWVzKHNlbGYsIGEsIGIpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLnJlcGxhY2UodHppbmZvPU5vbmUpLCBhLmZvbGQsIGlkKGEudHppbmZvKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGIucmVwbGFjZSh0emluZm89Tm9uZSksIGIuZm9sZCwgaWQoYi50emluZm8pKSkKKworICAgIGRlZiB0ZXN0X2ZvbGRzKHNlbGYpOgorICAgICAgICB0eiA9IHNlbGYudHoKKyAgICAgICAgZm9yIGR0LCBzaGlmdCBpbiB0ei5mb2xkcygpOgorICAgICAgICAgICAgZm9yIHggaW4gWzAgKiBzaGlmdCwgMC41ICogc2hpZnQsIHNoaWZ0IC0gdGltZWRlbHRhLnJlc29sdXRpb25dOgorICAgICAgICAgICAgICAgIHVkdCA9IGR0ICsgeAorICAgICAgICAgICAgICAgIGxkdCA9IHR6LmZyb211dGModWR0LnJlcGxhY2UodHppbmZvPXR6KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxkdC5mb2xkLCAxKQorICAgICAgICAgICAgICAgIGFkdCA9IHVkdC5yZXBsYWNlKHR6aW5mbz10aW1lem9uZS51dGMpLmFzdGltZXpvbmUodHopCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVpdkRhdGV0aW1lcyhhZHQsIGxkdCkKKyAgICAgICAgICAgICAgICB1dGNvZmZzZXQgPSBsZHQudXRjb2Zmc2V0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxkdC5yZXBsYWNlKHR6aW5mbz1Ob25lKSwgdWR0ICsgdXRjb2Zmc2V0KQorICAgICAgICAgICAgICAgICMgUm91bmQgdHJpcAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1aXZEYXRldGltZXMobGR0LmFzdGltZXpvbmUodGltZXpvbmUudXRjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkdC5yZXBsYWNlKHR6aW5mbz10aW1lem9uZS51dGMpKQorCisKKyAgICAgICAgICAgIGZvciB4IGluIFstdGltZWRlbHRhLnJlc29sdXRpb24sIHNoaWZ0XToKKyAgICAgICAgICAgICAgICB1ZHQgPSBkdCArIHgKKyAgICAgICAgICAgICAgICB1ZHQgPSB1ZHQucmVwbGFjZSh0emluZm89dHopCisgICAgICAgICAgICAgICAgbGR0ID0gdHouZnJvbXV0Yyh1ZHQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQuZm9sZCwgMCkKKworICAgIGRlZiB0ZXN0X2dhcHMoc2VsZik6CisgICAgICAgIHR6ID0gc2VsZi50egorICAgICAgICBmb3IgZHQsIHNoaWZ0IGluIHR6LmdhcHMoKToKKyAgICAgICAgICAgIGZvciB4IGluIFswICogc2hpZnQsIDAuNSAqIHNoaWZ0LCBzaGlmdCAtIHRpbWVkZWx0YS5yZXNvbHV0aW9uXToKKyAgICAgICAgICAgICAgICB1ZHQgPSBkdCArIHgKKyAgICAgICAgICAgICAgICB1ZHQgPSB1ZHQucmVwbGFjZSh0emluZm89dHopCisgICAgICAgICAgICAgICAgbGR0ID0gdHouZnJvbXV0Yyh1ZHQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQuZm9sZCwgMCkKKyAgICAgICAgICAgICAgICBhZHQgPSB1ZHQucmVwbGFjZSh0emluZm89dGltZXpvbmUudXRjKS5hc3RpbWV6b25lKHR6KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1aXZEYXRldGltZXMoYWR0LCBsZHQpCisgICAgICAgICAgICAgICAgdXRjb2Zmc2V0ID0gbGR0LnV0Y29mZnNldCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQucmVwbGFjZSh0emluZm89Tm9uZSksIHVkdC5yZXBsYWNlKHR6aW5mbz1Ob25lKSArIHV0Y29mZnNldCkKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBhIGxvY2FsIHRpbWUgaW5zaWRlIHRoZSBnYXAKKyAgICAgICAgICAgICAgICBsZHQgPSB0ei5mcm9tdXRjKGR0LnJlcGxhY2UodHppbmZvPXR6KSkgLSBzaGlmdCArIHgKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydExlc3MobGR0LnJlcGxhY2UoZm9sZD0xKS51dGNvZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGR0LnJlcGxhY2UoZm9sZD0wKS51dGNvZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0ICVzLiIgJSBsZHQpCisKKyAgICAgICAgICAgIGZvciB4IGluIFstdGltZWRlbHRhLnJlc29sdXRpb24sIHNoaWZ0XToKKyAgICAgICAgICAgICAgICB1ZHQgPSBkdCArIHgKKyAgICAgICAgICAgICAgICBsZHQgPSB0ei5mcm9tdXRjKHVkdC5yZXBsYWNlKHR6aW5mbz10eikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQuZm9sZCwgMCkKKworICAgIGRlZiB0ZXN0X3N5c3RlbV90cmFuc2l0aW9ucyhzZWxmKToKKyAgICAgICAgaWYgKCdSaXlhZGg4JyBpbiBzZWxmLnpvbmVuYW1lIG9yCisgICAgICAgICAgICAjIEZyb20gdHpkYXRhIE5FV1MgZmlsZToKKyAgICAgICAgICAgICMgVGhlIGZpbGVzIHNvbGFyODcsIHNvbGFyODgsIGFuZCBzb2xhcjg5IGFyZSBubyBsb25nZXIgZGlzdHJpYnV0ZWQuCisgICAgICAgICAgICAjIFRoZXkgd2VyZSBhIG5lZ2F0aXZlIGV4cGVyaW1lbnQgLSB0aGF0IGlzLCBhIGRlbW9uc3RyYXRpb24gdGhhdAorICAgICAgICAgICAgIyB0eiBkYXRhIGNhbiByZXByZXNlbnQgc29sYXIgdGltZSBvbmx5IHdpdGggc29tZSBkaWZmaWN1bHR5IGFuZCBlcnJvci4KKyAgICAgICAgICAgICMgVGhlaXIgcHJlc2VuY2UgaW4gdGhlIGRpc3RyaWJ1dGlvbiBjYXVzZWQgY29uZnVzaW9uLCBhcyBSaXlhZGgKKyAgICAgICAgICAgICMgY2l2aWwgdGltZSB3YXMgZ2VuZXJhbGx5IG5vdCBzb2xhciB0aW1lIGluIHRob3NlIHllYXJzLgorICAgICAgICAgICAgICAgIHNlbGYuem9uZW5hbWUuc3RhcnRzd2l0aCgncmlnaHQvJykpOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU2tpcHBpbmcgJXMiICUgc2VsZi56b25lbmFtZSkKKyAgICAgICAgdHogPSBzZWxmLnR6CisgICAgICAgIFRaID0gb3MuZW52aXJvbi5nZXQoJ1RaJykKKyAgICAgICAgb3MuZW52aXJvblsnVFonXSA9IHNlbGYuem9uZW5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX3RpbWUudHpzZXQoKQorICAgICAgICAgICAgZm9yIHVkdCwgc2hpZnQgaW4gdHoudHJhbnNpdGlvbnMoKToKKyAgICAgICAgICAgICAgICBpZiB1ZHQueWVhciA+PSAyMDM3OgorICAgICAgICAgICAgICAgICAgICAjIFN5c3RlbSBzdXBwb3J0IGZvciB0aW1lcyBhcm91bmQgdGhlIGVuZCBvZiAzMi1iaXQgdGltZV90CisgICAgICAgICAgICAgICAgICAgICMgYW5kIGxhdGVyIGlzIGZsYWt5IG9uIG1hbnkgc3lzdGVtcy4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzMCA9ICh1ZHQgLSBkYXRldGltZSgxOTcwLCAxLCAxKSkgLy8gU0VDCisgICAgICAgICAgICAgICAgc3MgPSBzaGlmdCAvLyBTRUMgICAjIHNoaWZ0IHNlY29uZHMKKyAgICAgICAgICAgICAgICBmb3IgeCBpbiBbLTQwICogMzYwMCwgLTIwKjM2MDAsIC0xLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcyAtIDEsIHNzICsgMjAgKiAzNjAwLCBzcyArIDQwICogMzYwMF06CisgICAgICAgICAgICAgICAgICAgIHMgPSBzMCArIHgKKyAgICAgICAgICAgICAgICAgICAgc2R0ID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChzKQorICAgICAgICAgICAgICAgICAgICB0emR0ID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChzLCB0eikucmVwbGFjZSh0emluZm89Tm9uZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVpdkRhdGV0aW1lcyhzZHQsIHR6ZHQpCisgICAgICAgICAgICAgICAgICAgIHMxID0gc2R0LnRpbWVzdGFtcCgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgczEpCisgICAgICAgICAgICAgICAgaWYgc3MgPiAwOiAgIyBnYXAKKyAgICAgICAgICAgICAgICAgICAgIyBDcmVhdGUgbG9jYWwgdGltZSBpbnNpZGUgdGhlIGdhcAorICAgICAgICAgICAgICAgICAgICBkdCA9IGRhdGV0aW1lLmZyb210aW1lc3RhbXAoczApIC0gc2hpZnQgLyAyCisgICAgICAgICAgICAgICAgICAgIHRzMCA9IGR0LnRpbWVzdGFtcCgpCisgICAgICAgICAgICAgICAgICAgIHRzMSA9IGR0LnJlcGxhY2UoZm9sZD0xKS50aW1lc3RhbXAoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzMCwgczAgKyBzcyAvIDIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMxLCBzMCAtIHNzIC8gMikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIFRaIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVsIG9zLmVudmlyb25bJ1RaJ10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3MuZW52aXJvblsnVFonXSA9IFRaCisgICAgICAgICAgICBfdGltZS50enNldCgpCisKKworY2xhc3MgWm9uZUluZm9Db21wbGV0ZVRlc3QodW5pdHRlc3QuVGVzdFN1aXRlKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHRlc3RzID0gW10KKyAgICAgICAgaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgndHpkYXRhJyk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBab25lSW5mby56b25lbmFtZXMoKToKKyAgICAgICAgICAgICAgICBUZXN0ID0gdHlwZSgnWm9uZUluZm9UZXN0WyVzXScgJSBuYW1lLCAoWm9uZUluZm9UZXN0LCksIHt9KQorICAgICAgICAgICAgICAgIFRlc3Quem9uZW5hbWUgPSBuYW1lCisgICAgICAgICAgICAgICAgZm9yIG1ldGhvZCBpbiBkaXIoVGVzdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIG1ldGhvZC5zdGFydHN3aXRoKCd0ZXN0XycpOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMuYXBwZW5kKFRlc3QobWV0aG9kKSkKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXyh0ZXN0cykKKworIyBJcmFuIGhhZCBhIHN1Yi1taW51dGUgVVRDIG9mZnNldCBiZWZvcmUgMTk0Ni4KK2NsYXNzIElyYW5UZXN0KFpvbmVJbmZvVGVzdCk6CisgICAgem9uZW5hbWUgPSAnQXNpYS9UZWhyYW4nCisKK2RlZiBsb2FkX3Rlc3RzKGxvYWRlciwgc3RhbmRhcmRfdGVzdHMsIHBhdHRlcm4pOgorICAgIHN0YW5kYXJkX3Rlc3RzLmFkZFRlc3QoWm9uZUluZm9Db21wbGV0ZVRlc3QoKSkKKyAgICByZXR1cm4gc3RhbmRhcmRfdGVzdHMKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZWludHJkYXRhL2VpbnRyX3Rlc3Rlci5weSBiL0xpYi90ZXN0L2VpbnRyZGF0YS9laW50cl90ZXN0ZXIucHkKaW5kZXggZTNmMWFhNS4uNGZjNzliMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvZWludHJkYXRhL2VpbnRyX3Rlc3Rlci5weQorKysgYi9MaWIvdGVzdC9laW50cmRhdGEvZWludHJfdGVzdGVyLnB5CkBAIC05LDcgKzksNyBAQAogIiIiCiAKIGltcG9ydCBjb250ZXh0bGliCi1pbXBvcnQgaW8KK2ltcG9ydCBmYXVsdGhhbmRsZXIKIGltcG9ydCBvcwogaW1wb3J0IHNlbGVjdAogaW1wb3J0IHNpZ25hbApAQCAtNTAsNiArNTAsMTAgQEAKICAgICAgICAgc2lnbmFsLnNldGl0aW1lcihzaWduYWwuSVRJTUVSX1JFQUwsIGNscy5zaWduYWxfZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLnNpZ25hbF9wZXJpb2QpCiAKKyAgICAgICAgIyBJc3N1ZSAjMjUyNzc6IFVzZSBmYXVsdGhhbmRsZXIgdG8gdHJ5IHRvIGRlYnVnIGEgaGFuZyBvbiBGcmVlQlNECisgICAgICAgIGlmIGhhc2F0dHIoZmF1bHRoYW5kbGVyLCAnZHVtcF90cmFjZWJhY2tfbGF0ZXInKToKKyAgICAgICAgICAgIGZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcigxMCAqIDYwLCBleGl0PVRydWUpCisKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc3RvcF9hbGFybShjbHMpOgogICAgICAgICBzaWduYWwuc2V0aXRpbWVyKHNpZ25hbC5JVElNRVJfUkVBTCwgMCwgMCkKQEAgLTU4LDYgKzYyLDggQEAKICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgogICAgICAgICBjbHMuc3RvcF9hbGFybSgpCiAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIGNscy5vcmlnX2hhbmRsZXIpCisgICAgICAgIGlmIGhhc2F0dHIoZmF1bHRoYW5kbGVyLCAnY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6CisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyKCkKIAogICAgIGRlZiBzdWJwcm9jZXNzKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICAgY21kX2FyZ3MgPSAoc3lzLmV4ZWN1dGFibGUsICctYycpICsgYXJncwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZXhjZXB0aW9uX2hpZXJhcmNoeS50eHQgYi9MaWIvdGVzdC9leGNlcHRpb25faGllcmFyY2h5LnR4dAppbmRleCAwNTEzNzY1Li43MzMzYjJhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9leGNlcHRpb25faGllcmFyY2h5LnR4dAorKysgYi9MaWIvdGVzdC9leGNlcHRpb25faGllcmFyY2h5LnR4dApAQCAtMTQsNiArMTQsNyBAQAogICAgICAgKy0tIEJ1ZmZlckVycm9yCiAgICAgICArLS0gRU9GRXJyb3IKICAgICAgICstLSBJbXBvcnRFcnJvcgorICAgICAgICAgICArLS0gTW9kdWxlTm90Rm91bmRFcnJvcgogICAgICAgKy0tIExvb2t1cEVycm9yCiAgICAgICB8ICAgICstLSBJbmRleEVycm9yCiAgICAgICB8ICAgICstLSBLZXlFcnJvcgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvX19pbml0X18ucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmEwZTZlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvX19pbml0X18ucHkKQEAgLTAsMCArMSw1IEBACisjIFdlIGltcG9ydCBpbXBvcnRsaWIgKkFTQVAqIGluIG9yZGVyIHRvIHRlc3QgIzE1Mzg2CitpbXBvcnQgaW1wb3J0bGliCisKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5jbWRsaW5lIGltcG9ydCBfcGFyc2VfYXJncywgUkVTT1VSQ0VfTkFNRVMKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5tYWluIGltcG9ydCBtYWluCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9jbWRsaW5lLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvY21kbGluZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjdhYWVkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvY21kbGluZS5weQpAQCAtMCwwICsxLDM0NCBAQAoraW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisKK1VTQUdFID0gIiIiXAorcHl0aG9uIC1tIHRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCitweXRob24gcGF0aC90by9MaWIvdGVzdC9yZWdydGVzdC5weSBbb3B0aW9uc10gW3Rlc3RfbmFtZTEgW3Rlc3RfbmFtZTIgLi4uXV0KKyIiIgorCitERVNDUklQVElPTiA9ICIiIlwKK1J1biBQeXRob24gcmVncmVzc2lvbiB0ZXN0cy4KKworSWYgbm8gYXJndW1lbnRzIG9yIG9wdGlvbnMgYXJlIHByb3ZpZGVkLCBmaW5kcyBhbGwgZmlsZXMgbWF0Y2hpbmcKK3RoZSBwYXR0ZXJuICJ0ZXN0XyoiIGluIHRoZSBMaWIvdGVzdCBzdWJkaXJlY3RvcnkgYW5kIHJ1bnMKK3RoZW0gaW4gYWxwaGFiZXRpY2FsIG9yZGVyIChidXQgc2VlIC1NIGFuZCAtdSwgYmVsb3csIGZvciBleGNlcHRpb25zKS4KKworRm9yIG1vcmUgcmlnb3JvdXMgdGVzdGluZywgaXQgaXMgdXNlZnVsIHRvIHVzZSB0aGUgZm9sbG93aW5nCitjb21tYW5kIGxpbmU6CisKK3B5dGhvbiAtRSAtV2QgLW0gdGVzdCBbb3B0aW9uc10gW3Rlc3RfbmFtZTEgLi4uXQorIiIiCisKK0VQSUxPRyA9ICIiIlwKK0FkZGl0aW9uYWwgb3B0aW9uIGRldGFpbHM6CisKKy1yIHJhbmRvbWl6ZXMgdGVzdCBleGVjdXRpb24gb3JkZXIuIFlvdSBjYW4gdXNlIC0tcmFuZHNlZWQ9aW50IHRvIHByb3ZpZGUgYW4KK2ludCBzZWVkIHZhbHVlIGZvciB0aGUgcmFuZG9taXplcjsgdGhpcyBpcyB1c2VmdWwgZm9yIHJlcHJvZHVjaW5nIHRyb3VibGVzb21lCit0ZXN0IG9yZGVycy4KKworLXMgT24gdGhlIGZpcnN0IGludm9jYXRpb24gb2YgcmVncnRlc3QgdXNpbmcgLXMsIHRoZSBmaXJzdCB0ZXN0IGZpbGUgZm91bmQKK29yIHRoZSBmaXJzdCB0ZXN0IGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSBpcyBydW4sIGFuZCB0aGUgbmFtZSBvZgordGhlIG5leHQgdGVzdCBpcyByZWNvcmRlZCBpbiBhIGZpbGUgbmFtZWQgcHluZXh0dGVzdC4gIElmIHJ1biBmcm9tIHRoZQorUHl0aG9uIGJ1aWxkIGRpcmVjdG9yeSwgcHluZXh0dGVzdCBpcyBsb2NhdGVkIGluIHRoZSAnYnVpbGQnIHN1YmRpcmVjdG9yeSwKK290aGVyd2lzZSBpdCBpcyBsb2NhdGVkIGluIHRlbXBmaWxlLmdldHRlbXBkaXIoKS4gIE9uIHN1YnNlcXVlbnQgcnVucywKK3RoZSB0ZXN0IGluIHB5bmV4dHRlc3QgaXMgcnVuLCBhbmQgdGhlIG5leHQgdGVzdCBpcyB3cml0dGVuIHRvIHB5bmV4dHRlc3QuCitXaGVuIHRoZSBsYXN0IHRlc3QgaGFzIGJlZW4gcnVuLCBweW5leHR0ZXN0IGlzIGRlbGV0ZWQuICBJbiB0aGlzIHdheSBpdAoraXMgcG9zc2libGUgdG8gc2luZ2xlIHN0ZXAgdGhyb3VnaCB0aGUgdGVzdCBmaWxlcy4gIFRoaXMgaXMgdXNlZnVsIHdoZW4KK2RvaW5nIG1lbW9yeSBhbmFseXNpcyBvbiB0aGUgUHl0aG9uIGludGVycHJldGVyLCB3aGljaCBwcm9jZXNzIHRlbmRzIHRvCitjb25zdW1lIHRvbyBtYW55IHJlc291cmNlcyB0byBydW4gdGhlIGZ1bGwgcmVncmVzc2lvbiB0ZXN0IG5vbi1zdG9wLgorCistUyBpcyB1c2VkIHRvIGNvbnRpbnVlIHJ1bm5pbmcgdGVzdHMgYWZ0ZXIgYW4gYWJvcnRlZCBydW4uICBJdCB3aWxsCittYWludGFpbiB0aGUgb3JkZXIgYSBzdGFuZGFyZCBydW4gKGllLCB0aGlzIGFzc3VtZXMgLXIgaXMgbm90IHVzZWQpLgorVGhpcyBpcyB1c2VmdWwgYWZ0ZXIgdGhlIHRlc3RzIGhhdmUgcHJlbWF0dXJlbHkgc3RvcHBlZCBmb3Igc29tZSBleHRlcm5hbAorcmVhc29uIGFuZCB5b3Ugd2FudCB0byBzdGFydCBydW5uaW5nIGZyb20gd2hlcmUgeW91IGxlZnQgb2ZmIHJhdGhlcgordGhhbiBzdGFydGluZyBmcm9tIHRoZSBiZWdpbm5pbmcuCisKKy1mIHJlYWRzIHRoZSBuYW1lcyBvZiB0ZXN0cyBmcm9tIHRoZSBmaWxlIGdpdmVuIGFzIGYncyBhcmd1bWVudCwgb25lCitvciBtb3JlIHRlc3QgbmFtZXMgcGVyIGxpbmUuICBXaGl0ZXNwYWNlIGlzIGlnbm9yZWQuICBCbGFuayBsaW5lcyBhbmQKK2xpbmVzIGJlZ2lubmluZyB3aXRoICcjJyBhcmUgaWdub3JlZC4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yCit3aGl0dGxpbmcgZG93biBmYWlsdXJlcyBpbnZvbHZpbmcgaW50ZXJhY3Rpb25zIGFtb25nIHRlc3RzLgorCistTCBjYXVzZXMgdGhlIGxlYWtzKDEpIGNvbW1hbmQgdG8gYmUgcnVuIGp1c3QgYmVmb3JlIGV4aXQgaWYgaXQgZXhpc3RzLgorbGVha3MoMSkgaXMgYXZhaWxhYmxlIG9uIE1hYyBPUyBYIGFuZCBwcmVzdW1hYmx5IG9uIHNvbWUgb3RoZXIKK0ZyZWVCU0QtZGVyaXZlZCBzeXN0ZW1zLgorCistUiBydW5zIGVhY2ggdGVzdCBzZXZlcmFsIHRpbWVzIGFuZCBleGFtaW5lcyBzeXMuZ2V0dG90YWxyZWZjb3VudCgpIHRvCitzZWUgaWYgdGhlIHRlc3QgYXBwZWFycyB0byBiZSBsZWFraW5nIHJlZmVyZW5jZXMuICBUaGUgYXJndW1lbnQgc2hvdWxkCitiZSBvZiB0aGUgZm9ybSBzdGFiOnJ1bjpmbmFtZSB3aGVyZSAnc3RhYicgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUKK3Rlc3QgaXMgcnVuIHRvIGxldCBnZXR0b3RhbHJlZmNvdW50IHNldHRsZSBkb3duLCAncnVuJyBpcyB0aGUgbnVtYmVyCitvZiB0aW1lcyBmdXJ0aGVyIGl0IGlzIHJ1biBhbmQgJ2ZuYW1lJyBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUKK3JlcG9ydHMgYXJlIHdyaXR0ZW4gdG8uICBUaGVzZSBwYXJhbWV0ZXJzIGFsbCBoYXZlIGRlZmF1bHRzICg1LCA0IGFuZAorInJlZmxvZy50eHQiIHJlc3BlY3RpdmVseSksIGFuZCB0aGUgbWluaW1hbCBpbnZvY2F0aW9uIGlzICctUiA6Jy4KKworLU0gcnVucyB0ZXN0cyB0aGF0IHJlcXVpcmUgYW4gZXhvcmJpdGFudCBhbW91bnQgb2YgbWVtb3J5LiBUaGVzZSB0ZXN0cwordHlwaWNhbGx5IHRyeSB0byBhc2NlcnRhaW4gY29udGFpbmVycyBrZWVwIHdvcmtpbmcgd2hlbiBjb250YWluaW5nIG1vcmUgdGhhbgorMiBiaWxsaW9uIG9iamVjdHMsIHdoaWNoIG9ubHkgd29ya3Mgb24gNjQtYml0IHN5c3RlbXMuIFRoZXJlIGFyZSBhbHNvIHNvbWUKK3Rlc3RzIHRoYXQgdHJ5IHRvIGV4aGF1c3QgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHByb2Nlc3MsIHdoaWNoIG9ubHkgbWFrZXMKK3NlbnNlIG9uIDMyLWJpdCBzeXN0ZW1zIHdpdGggYXQgbGVhc3QgMkdiIG9mIG1lbW9yeS4gVGhlIHBhc3NlZC1pbiBtZW1saW1pdCwKK3doaWNoIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtIG9mICcyLjVHYicsIGRldGVybWluZXMgaG93bXVjaCBtZW1vcnkgdGhlCit0ZXN0cyB3aWxsIGxpbWl0IHRoZW1zZWx2ZXMgdG8gKGJ1dCB0aGV5IG1heSBnbyBzbGlnaHRseSBvdmVyLikgVGhlIG51bWJlcgorc2hvdWxkbid0IGJlIG1vcmUgbWVtb3J5IHRoYW4gdGhlIG1hY2hpbmUgaGFzIChpbmNsdWRpbmcgc3dhcCBtZW1vcnkpLiBZb3UKK3Nob3VsZCBhbHNvIGtlZXAgaW4gbWluZCB0aGF0IHN3YXAgbWVtb3J5IGlzIGdlbmVyYWxseSBtdWNoLCBtdWNoIHNsb3dlcgordGhhbiBSQU0sIGFuZCBzZXR0aW5nIG1lbWxpbWl0IHRvIGFsbCBhdmFpbGFibGUgUkFNIG9yIGhpZ2hlciB3aWxsIGhlYXZpbHkKK3RheCB0aGUgbWFjaGluZS4gT24gdGhlIG90aGVyIGhhbmQsIGl0IGlzIG5vIHVzZSBydW5uaW5nIHRoZXNlIHRlc3RzIHdpdGggYQorbGltaXQgb2YgbGVzcyB0aGFuIDIuNUdiLCBhbmQgbWFueSByZXF1aXJlIG1vcmUgdGhhbiAyMEdiLiBUZXN0cyB0aGF0IGV4cGVjdAordG8gdXNlIG1vcmUgdGhhbiBtZW1saW1pdCBtZW1vcnkgd2lsbCBiZSBza2lwcGVkLiBUaGUgYmlnLW1lbW9yeSB0ZXN0cworZ2VuZXJhbGx5IHJ1biB2ZXJ5LCB2ZXJ5IGxvbmcuCisKKy11IGlzIHVzZWQgdG8gc3BlY2lmeSB3aGljaCBzcGVjaWFsIHJlc291cmNlIGludGVuc2l2ZSB0ZXN0cyB0byBydW4sCitzdWNoIGFzIHRob3NlIHJlcXVpcmluZyBsYXJnZSBmaWxlIHN1cHBvcnQgb3IgbmV0d29yayBjb25uZWN0aXZpdHkuCitUaGUgYXJndW1lbnQgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3JkcyBpbmRpY2F0aW5nIHRoZQorcmVzb3VyY2VzIHRvIHRlc3QuICBDdXJyZW50bHkgb25seSB0aGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkOgorCisgICAgYWxsIC0gICAgICAgRW5hYmxlIGFsbCBzcGVjaWFsIHJlc291cmNlcy4KKworICAgIG5vbmUgLSAgICAgIERpc2FibGUgYWxsIHNwZWNpYWwgcmVzb3VyY2VzICh0aGlzIGlzIHRoZSBkZWZhdWx0KS4KKworICAgIGF1ZGlvIC0gICAgIFRlc3RzIHRoYXQgdXNlIHRoZSBhdWRpbyBkZXZpY2UuICAoVGhlcmUgYXJlIGtub3duCisgICAgICAgICAgICAgICAgY2FzZXMgb2YgYnJva2VuIGF1ZGlvIGRyaXZlcnMgdGhhdCBjYW4gY3Jhc2ggUHl0aG9uIG9yCisgICAgICAgICAgICAgICAgZXZlbiB0aGUgTGludXgga2VybmVsLikKKworICAgIGN1cnNlcyAtICAgIFRlc3RzIHRoYXQgdXNlIGN1cnNlcyBhbmQgd2lsbCBtb2RpZnkgdGhlIHRlcm1pbmFsJ3MKKyAgICAgICAgICAgICAgICBzdGF0ZSBhbmQgb3V0cHV0IG1vZGVzLgorCisgICAgbGFyZ2VmaWxlIC0gSXQgaXMgb2theSB0byBydW4gc29tZSB0ZXN0IHRoYXQgbWF5IGNyZWF0ZSBodWdlCisgICAgICAgICAgICAgICAgZmlsZXMuICBUaGVzZSB0ZXN0cyBjYW4gdGFrZSBhIGxvbmcgdGltZSBhbmQgbWF5CisgICAgICAgICAgICAgICAgY29uc3VtZSA+MkdCIG9mIGRpc2sgc3BhY2UgdGVtcG9yYXJpbHkuCisKKyAgICBuZXR3b3JrIC0gICBJdCBpcyBva2F5IHRvIHJ1biB0ZXN0cyB0aGF0IHVzZSBleHRlcm5hbCBuZXR3b3JrCisgICAgICAgICAgICAgICAgcmVzb3VyY2UsIGUuZy4gdGVzdGluZyBTU0wgc3VwcG9ydCBmb3Igc29ja2V0cy4KKworICAgIGRlY2ltYWwgLSAgIFRlc3QgdGhlIGRlY2ltYWwgbW9kdWxlIGFnYWluc3QgYSBsYXJnZSBzdWl0ZSB0aGF0CisgICAgICAgICAgICAgICAgdmVyaWZpZXMgY29tcGxpYW5jZSB3aXRoIHN0YW5kYXJkcy4KKworICAgIGNwdSAtICAgICAgIFVzZWQgZm9yIGNlcnRhaW4gQ1BVLWhlYXZ5IHRlc3RzLgorCisgICAgc3VicHJvY2VzcyAgUnVuIGFsbCB0ZXN0cyBmb3IgdGhlIHN1YnByb2Nlc3MgbW9kdWxlLgorCisgICAgdXJsZmV0Y2ggLSAgSXQgaXMgb2theSB0byBkb3dubG9hZCBmaWxlcyByZXF1aXJlZCBvbiB0ZXN0aW5nLgorCisgICAgZ3VpIC0gICAgICAgUnVuIHRlc3RzIHRoYXQgcmVxdWlyZSBhIHJ1bm5pbmcgR1VJLgorCisgICAgdHpkYXRhIC0gICAgUnVuIHRlc3RzIHRoYXQgcmVxdWlyZSB0aW1lem9uZSBkYXRhLgorCitUbyBlbmFibGUgYWxsIHJlc291cmNlcyBleGNlcHQgb25lLCB1c2UgJy11YWxsLC08cmVzb3VyY2U+Jy4gIEZvcgorZXhhbXBsZSwgdG8gcnVuIGFsbCB0aGUgdGVzdHMgZXhjZXB0IGZvciB0aGUgZ3VpIHRlc3RzLCBnaXZlIHRoZQorb3B0aW9uICctdWFsbCwtZ3VpJy4KKyIiIgorCisKK1JFU09VUkNFX05BTUVTID0gKCdhdWRpbycsICdjdXJzZXMnLCAnbGFyZ2VmaWxlJywgJ25ldHdvcmsnLAorICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwnLCAnY3B1JywgJ3N1YnByb2Nlc3MnLCAndXJsZmV0Y2gnLCAnZ3VpJywgJ3R6ZGF0YScpCisKK2NsYXNzIF9BcmdQYXJzZXIoYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgorCisgICAgZGVmIGVycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzdXBlcigpLmVycm9yKG1lc3NhZ2UgKyAiXG5QYXNzIC1oIG9yIC0taGVscCBmb3IgY29tcGxldGUgaGVscC4iKQorCisKK2RlZiBfY3JlYXRlX3BhcnNlcigpOgorICAgICMgU2V0IHByb2cgdG8gcHJldmVudCB0aGUgdW5pbmZvcm1hdGl2ZSAiX19tYWluX18ucHkiIGZyb20gZGlzcGxheWluZyBpbgorICAgICMgZXJyb3IgbWVzc2FnZXMgd2hlbiB1c2luZyAicHl0aG9uIC1tIHRlc3QgLi4uIi4KKyAgICBwYXJzZXIgPSBfQXJnUGFyc2VyKHByb2c9J3JlZ3J0ZXN0LnB5JywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlPVVTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249REVTQ1JJUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9RVBJTE9HLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2hlbHA9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyKQorCisgICAgIyBBcmd1bWVudHMgd2l0aCB0aGlzIGNsYXVzZSBhZGRlZCB0byBpdHMgaGVscCBhcmUgZGVzY3JpYmVkIGZ1cnRoZXIgaW4KKyAgICAjIHRoZSBlcGlsb2cncyAiQWRkaXRpb25hbCBvcHRpb24gZGV0YWlscyIgc2VjdGlvbi4KKyAgICBtb3JlX2RldGFpbHMgPSAnICBTZWUgdGhlIHNlY3Rpb24gYXQgYm90dG9tIGZvciBtb3JlIGRldGFpbHMuJworCisgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdHZW5lcmFsIG9wdGlvbnMnKQorICAgICMgV2UgYWRkIGhlbHAgZXhwbGljaXRseSB0byBjb250cm9sIHdoYXQgYXJndW1lbnQgZ3JvdXAgaXQgcmVuZGVycyB1bmRlci4KKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1oJywgJy0taGVscCcsIGFjdGlvbj0naGVscCcsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Nob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS10aW1lb3V0JywgbWV0YXZhcj0nVElNRU9VVCcsIHR5cGU9ZmxvYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vcmUgdGhhbiBUSU1FT1VUIHNlY29uZHM7IGRpc2FibGVkIGlmIFRJTUVPVVQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbmVnYXRpdmUgb3IgZXF1YWxzIHRvIHplcm8nKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS13YWl0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2FpdCBmb3IgdXNlciBpbnB1dCwgZS5nLiwgYWxsb3cgYSBkZWJ1Z2dlciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIGJlIGF0dGFjaGVkJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tc2xhdmVhcmdzJywgbWV0YXZhcj0nQVJHUycpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUycsICctLXN0YXJ0JywgbWV0YXZhcj0nU1RBUlQnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd0aGUgbmFtZSBvZiB0aGUgdGVzdCBhdCB3aGljaCB0byBzdGFydC4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisKKyAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1ZlcmJvc2l0eScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J2NvdW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRlc3RzIGluIHZlcmJvc2UgbW9kZSB3aXRoIG91dHB1dCB0byBzdGRvdXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXcnLCAnLS12ZXJib3NlMicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlLXJ1biBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1XJywgJy0tdmVyYm9zZTMnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J25vIG91dHB1dCB1bmxlc3Mgb25lIG9yIG1vcmUgdGVzdHMgZmFpbCcpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbycsICctLXNsb3dlc3QnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdwcmludF9zbG93JywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHJpbnQgdGhlIHNsb3dlc3QgMTAgdGVzdHMnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1oZWFkZXInLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwcmludCBoZWFkZXIgd2l0aCBpbnRlcnByZXRlciBpbmZvJykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU2VsZWN0aW5nIHRlc3RzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmFuZG9taXplJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmFuZG9taXplIHRlc3QgZXhlY3V0aW9uIG9yZGVyLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXJhbmRzZWVkJywgbWV0YXZhcj0nU0VFRCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3JhbmRvbV9zZWVkJywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Bhc3MgYSByYW5kb20gc2VlZCB0byByZXByb2R1Y2UgYSBwcmV2aW91cyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JhbmRvbSBydW4nKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1mcm9tZmlsZScsIG1ldGF2YXI9J0ZJTEUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWFkIG5hbWVzIG9mIHRlc3RzIHRvIHJ1biBmcm9tIGEgZmlsZS4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCcteCcsICctLWV4Y2x1ZGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgYXJlIHRlc3RzIHRvICpleGNsdWRlKicpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcycsICctLXNpbmdsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NpbmdsZSBzdGVwIHRocm91Z2ggYSBzZXQgb2YgdGVzdHMuJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1tYXRjaCcsIG1ldGF2YXI9J1BBVCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J21hdGNoX3Rlc3RzJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbWF0Y2ggdGVzdCBjYXNlcyBhbmQgbWV0aG9kcyB3aXRoIGdsb2IgcGF0dGVybiBQQVQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUcnLCAnLS1mYWlsZmFzdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2ZhaWwgYXMgc29vbiBhcyBhIHRlc3QgZmFpbHMgKG9ubHkgd2l0aCAtdiBvciAtVyknKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXUnLCAnLS11c2UnLCBtZXRhdmFyPSdSRVMxLFJFUzIsLi4uJywKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLCB0eXBlPXJlc291cmNlc19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gcnVuLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTScsICctLW1lbWxpbWl0JywgbWV0YXZhcj0nTElNSVQnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdmVyeSBsYXJnZSBtZW1vcnktY29uc3VtaW5nIHRlc3RzLicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tdGVzdGRpcicsIG1ldGF2YXI9J0RJUicsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cmVsYXRpdmVfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2V4ZWN1dGUgdGVzdCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhpbnN0ZWFkIG9mIHRoZSBQeXRob24gc3RkbGliIHRlc3Qgc3VpdGUpJykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU3BlY2lhbCBydW5zJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1sJywgJy0tZmluZGxlYWtzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0naWYgR0MgaXMgYXZhaWxhYmxlIGRldGVjdCB0ZXN0cyB0aGF0IGxlYWsgbWVtb3J5JykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1MJywgJy0tcnVubGVha3MnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGhlIGxlYWtzKDEpIGNvbW1hbmQganVzdCBiZWZvcmUgZXhpdC4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUicsICctLWh1bnRybGVha3MnLCBtZXRhdmFyPSdSVU5DT1VOVFMnLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWh1bnRybGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NlYXJjaCBmb3IgcmVmZXJlbmNlIGxlYWtzIChuZWVkcyBkZWJ1ZyBidWlsZCwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJ5IHNsb3cpLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaicsICctLW11bHRpcHJvY2VzcycsIG1ldGF2YXI9J1BST0NFU1NFUycsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VzZV9tcCcsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gUFJPQ0VTU0VTIHByb2Nlc3NlcyBhdCBvbmNlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1UJywgJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd0cmFjZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3R1cm4gb24gY29kZSBjb3ZlcmFnZSB0cmFjaW5nIHVzaW5nIHRoZSB0cmFjZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRCcsICctLWNvdmVyZGlyJywgbWV0YXZhcj0nRElSJywKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1yZWxhdGl2ZV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IHdoZXJlIGNvdmVyYWdlIGZpbGVzIGFyZSBwdXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLU4nLCAnLS1ub2NvdmVyZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PU5vbmUsIGRlc3Q9J2NvdmVyZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHV0IGNvdmVyYWdlIGZpbGVzIGFsb25nc2lkZSBtb2R1bGVzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy10JywgJy0tdGhyZXNob2xkJywgbWV0YXZhcj0nVEhSRVNIT0xEJywKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2NhbGwgZ2Muc2V0X3RocmVzaG9sZChUSFJFU0hPTEQpJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1uJywgJy0tbm93aW5kb3dzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3VwcHJlc3MgZXJyb3IgbWVzc2FnZSBib3hlcyBvbiBXaW5kb3dzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1GJywgJy0tZm9yZXZlcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0aGUgc3BlY2lmaWVkIHRlc3RzIGluIGEgbG9vcCwgdW50aWwgYW4gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvciBoYXBwZW5zJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tbGlzdC10ZXN0cycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im9ubHkgd3JpdGUgdGhlIG5hbWUgb2YgdGVzdHMgdGhhdCB3aWxsIGJlIHJ1biwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb24ndCBleGVjdXRlIHRoZW0iKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLVAnLCAnLS1wZ28nLCBkZXN0PSdwZ28nLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdlbmFibGUgUHJvZmlsZSBHdWlkZWQgT3B0aW1pemF0aW9uIHRyYWluaW5nJykKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2FyZ3MnLCBuYXJncz1hcmdwYXJzZS5SRU1BSU5ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKQorCisgICAgcmV0dXJuIHBhcnNlcgorCisKK2RlZiByZWxhdGl2ZV9maWxlbmFtZShzdHJpbmcpOgorICAgICMgQ1dEIGlzIHJlcGxhY2VkIHdpdGggYSB0ZW1wb3JhcnkgZGlyIGJlZm9yZSBjYWxsaW5nIG1haW4oKSwgc28gd2UKKyAgICAjIGpvaW4gaXQgd2l0aCB0aGUgc2F2ZWQgQ1dEIHNvIGl0IGVuZHMgdXAgd2hlcmUgdGhlIHVzZXIgZXhwZWN0cy4KKyAgICByZXR1cm4gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIHN0cmluZykKKworCitkZWYgaHVudHJsZWFrcyhzdHJpbmcpOgorICAgIGFyZ3MgPSBzdHJpbmcuc3BsaXQoJzonKQorICAgIGlmIGxlbihhcmdzKSBub3QgaW4gKDIsIDMpOgorICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcigKKyAgICAgICAgICAgICduZWVkcyAyIG9yIDMgY29sb24tc2VwYXJhdGVkIGFyZ3VtZW50cycpCisgICAgbndhcm11cCA9IGludChhcmdzWzBdKSBpZiBhcmdzWzBdIGVsc2UgNQorICAgIG50cmFja2VkID0gaW50KGFyZ3NbMV0pIGlmIGFyZ3NbMV0gZWxzZSA0CisgICAgZm5hbWUgPSBhcmdzWzJdIGlmIGxlbihhcmdzKSA+IDIgYW5kIGFyZ3NbMl0gZWxzZSAncmVmbG9nLnR4dCcKKyAgICByZXR1cm4gbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lCisKKworZGVmIHJlc291cmNlc19saXN0KHN0cmluZyk6CisgICAgdSA9IFt4Lmxvd2VyKCkgZm9yIHggaW4gc3RyaW5nLnNwbGl0KCcsJyldCisgICAgZm9yIHIgaW4gdToKKyAgICAgICAgaWYgciA9PSAnYWxsJyBvciByID09ICdub25lJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHJbMF0gPT0gJy0nOgorICAgICAgICAgICAgciA9IHJbMTpdCisgICAgICAgIGlmIHIgbm90IGluIFJFU09VUkNFX05BTUVTOgorICAgICAgICAgICAgcmFpc2UgYXJncGFyc2UuQXJndW1lbnRUeXBlRXJyb3IoJ2ludmFsaWQgcmVzb3VyY2U6ICcgKyByKQorICAgIHJldHVybiB1CisKKworZGVmIF9wYXJzZV9hcmdzKGFyZ3MsICoqa3dhcmdzKToKKyAgICAjIERlZmF1bHRzCisgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UodGVzdGRpcj1Ob25lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLAorICAgICAgICAgZXhjbHVkZT1GYWxzZSwgc2luZ2xlPUZhbHNlLCByYW5kb21pemU9RmFsc2UsIGZyb21maWxlPU5vbmUsCisgICAgICAgICBmaW5kbGVha3M9RmFsc2UsIHVzZV9yZXNvdXJjZXM9Tm9uZSwgdHJhY2U9RmFsc2UsIGNvdmVyZGlyPSdjb3ZlcmFnZScsCisgICAgICAgICBydW5sZWFrcz1GYWxzZSwgaHVudHJsZWFrcz1GYWxzZSwgdmVyYm9zZTI9RmFsc2UsIHByaW50X3Nsb3c9RmFsc2UsCisgICAgICAgICByYW5kb21fc2VlZD1Ob25lLCB1c2VfbXA9Tm9uZSwgdmVyYm9zZTM9RmFsc2UsIGZvcmV2ZXI9RmFsc2UsCisgICAgICAgICBoZWFkZXI9RmFsc2UsIGZhaWxmYXN0PUZhbHNlLCBtYXRjaF90ZXN0cz1Ob25lLCBwZ289RmFsc2UpCisgICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZW1zKCk6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG5zLCBrKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXIgaXMgYW4gaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIHRoaXMgZnVuY3Rpb24nICUgaykKKyAgICAgICAgc2V0YXR0cihucywgaywgdikKKyAgICBpZiBucy51c2VfcmVzb3VyY2VzIGlzIE5vbmU6CisgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMgPSBbXQorCisgICAgcGFyc2VyID0gX2NyZWF0ZV9wYXJzZXIoKQorICAgIHBhcnNlci5wYXJzZV9hcmdzKGFyZ3M9YXJncywgbmFtZXNwYWNlPW5zKQorCisgICAgaWYgbnMuc2luZ2xlIGFuZCBucy5mcm9tZmlsZToKKyAgICAgICAgcGFyc2VyLmVycm9yKCItcyBhbmQgLWYgZG9uJ3QgZ28gdG9nZXRoZXIhIikKKyAgICBpZiBucy51c2VfbXAgYW5kIG5zLnRyYWNlOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1UIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMuZmluZGxlYWtzOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1sIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIG5zLmZhaWxmYXN0IGFuZCBub3QgKG5zLnZlcmJvc2Ugb3IgbnMudmVyYm9zZTMpOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1HLy0tZmFpbGZhc3QgbmVlZHMgZWl0aGVyIC12IG9yIC1XIikKKyAgICBpZiBucy5wZ28gYW5kIChucy52ZXJib3NlIG9yIG5zLnZlcmJvc2UyIG9yIG5zLnZlcmJvc2UzKToKKyAgICAgICAgcGFyc2VyLmVycm9yKCItLXBnby8tdiBkb24ndCBnbyB0b2dldGhlciEiKQorCisgICAgaWYgbnMubm93aW5kb3dzOgorICAgICAgICBwcmludCgiV2FybmluZzogdGhlIC0tbm93aW5kb3dzICgtbikgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuICIKKyAgICAgICAgICAgICAgIlVzZSAtdnYgdG8gZGlzcGxheSBhc3NlcnRpb25zIGluIHN0ZGVyci4iLCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICBpZiBucy5xdWlldDoKKyAgICAgICAgbnMudmVyYm9zZSA9IDAKKyAgICBpZiBucy50aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICBpZiBucy50aW1lb3V0IDw9IDA6CisgICAgICAgICAgICBucy50aW1lb3V0ID0gTm9uZQorICAgIGlmIG5zLnVzZV9tcCBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgbnMudXNlX21wIDw9IDA6CisgICAgICAgICAgICAjIFVzZSBhbGwgY29yZXMgKyBleHRyYXMgZm9yIHRlc3RzIHRoYXQgbGlrZSB0byBzbGVlcAorICAgICAgICAgICAgbnMudXNlX21wID0gMiArIChvcy5jcHVfY291bnQoKSBvciAxKQorICAgIGlmIG5zLnVzZToKKyAgICAgICAgZm9yIGEgaW4gbnMudXNlOgorICAgICAgICAgICAgZm9yIHIgaW4gYToKKyAgICAgICAgICAgICAgICBpZiByID09ICdhbGwnOgorICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzWzpdID0gUkVTT1VSQ0VfTkFNRVMKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiByID09ICdub25lJzoKKyAgICAgICAgICAgICAgICAgICAgZGVsIG5zLnVzZV9yZXNvdXJjZXNbOl0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICByZW1vdmUgPSBGYWxzZQorICAgICAgICAgICAgICAgIGlmIHJbMF0gPT0gJy0nOgorICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHIgPSByWzE6XQorICAgICAgICAgICAgICAgIGlmIHJlbW92ZToKKyAgICAgICAgICAgICAgICAgICAgaWYgciBpbiBucy51c2VfcmVzb3VyY2VzOgorICAgICAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlcy5yZW1vdmUocikKKyAgICAgICAgICAgICAgICBlbGlmIHIgbm90IGluIG5zLnVzZV9yZXNvdXJjZXM6CisgICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMuYXBwZW5kKHIpCisgICAgaWYgbnMucmFuZG9tX3NlZWQgaXMgbm90IE5vbmU6CisgICAgICAgIG5zLnJhbmRvbWl6ZSA9IFRydWUKKworICAgIHJldHVybiBucwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvbWFpbi5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L21haW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlZmZjOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L21haW4ucHkKQEAgLTAsMCArMSw1MzIgQEAKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGZhdWx0aGFuZGxlcgoraW1wb3J0IGxvY2FsZQoraW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByYW5kb20KK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHN5c2NvbmZpZworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCB0aW1lCitmcm9tIHRlc3QubGlicmVncnRlc3QuY21kbGluZSBpbXBvcnQgX3BhcnNlX2FyZ3MKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0IGltcG9ydCAoCisgICAgZmluZHRlc3RzLCBydW50ZXN0LAorICAgIFNURFRFU1RTLCBOT1RURVNUUywgUEFTU0VELCBGQUlMRUQsIEVOVl9DSEFOR0VELCBTS0lQUEVELCBSRVNPVVJDRV9ERU5JRUQsCisgICAgSU5URVJSVVBURUQsIENISUxEX0VSUk9SLAorICAgIFBST0dSRVNTX01JTl9USU1FLCBmb3JtYXRfdGVzdF9yZXN1bHQpCitmcm9tIHRlc3QubGlicmVncnRlc3Quc2V0dXAgaW1wb3J0IHNldHVwX3Rlc3RzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgZ2MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnYyA9IE5vbmUKKworCisjIFdoZW4gdGVzdHMgYXJlIHJ1biBmcm9tIHRoZSBQeXRob24gYnVpbGQgZGlyZWN0b3J5LCBpdCBpcyBiZXN0IHByYWN0aWNlCisjIHRvIGtlZXAgdGhlIHRlc3QgZmlsZXMgaW4gYSBzdWJmb2xkZXIuICBUaGlzIGVhc2VzIHRoZSBjbGVhbnVwIG9mIGxlZnRvdmVyCisjIGZpbGVzIHVzaW5nIHRoZSAibWFrZSBkaXN0Y2xlYW4iIGNvbW1hbmQuCitpZiBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6CisgICAgVEVNUERJUiA9IG9zLnBhdGguam9pbihzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3NyY2RpcicpLCAnYnVpbGQnKQorZWxzZToKKyAgICBURU1QRElSID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCitURU1QRElSID0gb3MucGF0aC5hYnNwYXRoKFRFTVBESVIpCisKKworZGVmIGZvcm1hdF9kdXJhdGlvbihzZWNvbmRzKToKKyAgICBpZiBzZWNvbmRzIDwgMS4wOgorICAgICAgICByZXR1cm4gJyUuMGYgbXMnICUgKHNlY29uZHMgKiAxZTMpCisgICAgaWYgc2Vjb25kcyA8IDYwLjA6CisgICAgICAgIHJldHVybiAnJS4wZiBzZWMnICUgc2Vjb25kcworCisgICAgbWludXRlcywgc2Vjb25kcyA9IGRpdm1vZChzZWNvbmRzLCA2MC4wKQorICAgIHJldHVybiAnJS4wZiBtaW4gJS4wZiBzZWMnICUgKG1pbnV0ZXMsIHNlY29uZHMpCisKKworY2xhc3MgUmVncnRlc3Q6CisgICAgIiIiRXhlY3V0ZSBhIHRlc3Qgc3VpdGUuCisKKyAgICBUaGlzIGFsc28gcGFyc2VzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBtb2RpZmllcyBpdHMgYmVoYXZpb3IKKyAgICBhY2NvcmRpbmdseS4KKworICAgIHRlc3RzIC0tIGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGVzdCBuYW1lcyAob3B0aW9uYWwpCisgICAgdGVzdGRpciAtLSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGxvb2sgZm9yIHRlc3RzIChvcHRpb25hbCkKKworICAgIFVzZXJzIG90aGVyIHRoYW4gdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdpbGwgY2VydGFpbmx5IHdhbnQgdG8KKyAgICBzcGVjaWZ5IHRlc3RkaXI7IGlmIGl0J3Mgb21pdHRlZCwgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQorICAgIFB5dGhvbiB0ZXN0IHN1aXRlIGlzIHNlYXJjaGVkIGZvci4KKworICAgIElmIHRoZSB0ZXN0cyBhcmd1bWVudCBpcyBvbWl0dGVkLCB0aGUgdGVzdHMgbGlzdGVkIG9uIHRoZQorICAgIGNvbW1hbmQtbGluZSB3aWxsIGJlIHVzZWQuICBJZiB0aGF0J3MgZW1wdHksIHRvbywgdGhlbiBhbGwgKi5weQorICAgIGZpbGVzIGJlZ2lubmluZyB3aXRoIHRlc3RfIHdpbGwgYmUgdXNlZC4KKworICAgIFRoZSBvdGhlciBkZWZhdWx0IGFyZ3VtZW50cyAodmVyYm9zZSwgcXVpZXQsIGV4Y2x1ZGUsCisgICAgc2luZ2xlLCByYW5kb21pemUsIGZpbmRsZWFrcywgdXNlX3Jlc291cmNlcywgdHJhY2UsIGNvdmVyZGlyLAorICAgIHByaW50X3Nsb3csIGFuZCByYW5kb21fc2VlZCkgYWxsb3cgcHJvZ3JhbW1lcnMgY2FsbGluZyBtYWluKCkKKyAgICBkaXJlY3RseSB0byBzZXQgdGhlIHZhbHVlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHNldCBieSBmbGFncworICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIE5hbWVzcGFjZSBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucworICAgICAgICBzZWxmLm5zID0gTm9uZQorCisgICAgICAgICMgdGVzdHMKKyAgICAgICAgc2VsZi50ZXN0cyA9IFtdCisgICAgICAgIHNlbGYuc2VsZWN0ZWQgPSBbXQorCisgICAgICAgICMgdGVzdCByZXN1bHRzCisgICAgICAgIHNlbGYuZ29vZCA9IFtdCisgICAgICAgIHNlbGYuYmFkID0gW10KKyAgICAgICAgc2VsZi5za2lwcGVkID0gW10KKyAgICAgICAgc2VsZi5yZXNvdXJjZV9kZW5pZWRzID0gW10KKyAgICAgICAgc2VsZi5lbnZpcm9ubWVudF9jaGFuZ2VkID0gW10KKyAgICAgICAgc2VsZi5pbnRlcnJ1cHRlZCA9IEZhbHNlCisKKyAgICAgICAgIyB1c2VkIGJ5IC0tc2xvdworICAgICAgICBzZWxmLnRlc3RfdGltZXMgPSBbXQorCisgICAgICAgICMgdXNlZCBieSAtLWNvdmVyYWdlLCB0cmFjZS5UcmFjZSBpbnN0YW5jZQorICAgICAgICBzZWxmLnRyYWNlciA9IE5vbmUKKworICAgICAgICAjIHVzZWQgYnkgLS1maW5kbGVha3MsIHN0b3JlIGZvciBnYy5nYXJiYWdlCisgICAgICAgIHNlbGYuZm91bmRfZ2FyYmFnZSA9IFtdCisKKyAgICAgICAgIyB1c2VkIHRvIGRpc3BsYXkgdGhlIHByb2dyZXNzIGJhciAiWyAzLzEwMF0iCisgICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IHRpbWUubW9ub3RvbmljKCkKKyAgICAgICAgc2VsZi50ZXN0X2NvdW50ID0gJycKKyAgICAgICAgc2VsZi50ZXN0X2NvdW50X3dpZHRoID0gMQorCisgICAgICAgICMgdXNlZCBieSAtLXNpbmdsZQorICAgICAgICBzZWxmLm5leHRfc2luZ2xlX3Rlc3QgPSBOb25lCisgICAgICAgIHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUgPSBOb25lCisKKyAgICBkZWYgYWNjdW11bGF0ZV9yZXN1bHQoc2VsZiwgdGVzdCwgcmVzdWx0KToKKyAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAorICAgICAgICBpZiBvayBub3QgaW4gKENISUxEX0VSUk9SLCBJTlRFUlJVUFRFRCk6CisgICAgICAgICAgICBzZWxmLnRlc3RfdGltZXMuYXBwZW5kKCh0ZXN0X3RpbWUsIHRlc3QpKQorICAgICAgICBpZiBvayA9PSBQQVNTRUQ6CisgICAgICAgICAgICBzZWxmLmdvb2QuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gRkFJTEVEOgorICAgICAgICAgICAgc2VsZi5iYWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gRU5WX0NIQU5HRUQ6CisgICAgICAgICAgICBzZWxmLmVudmlyb25tZW50X2NoYW5nZWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gU0tJUFBFRDoKKyAgICAgICAgICAgIHNlbGYuc2tpcHBlZC5hcHBlbmQodGVzdCkKKyAgICAgICAgZWxpZiBvayA9PSBSRVNPVVJDRV9ERU5JRUQ6CisgICAgICAgICAgICBzZWxmLnNraXBwZWQuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICBzZWxmLnJlc291cmNlX2RlbmllZHMuYXBwZW5kKHRlc3QpCisKKyAgICBkZWYgZGlzcGxheV9wcm9ncmVzcyhzZWxmLCB0ZXN0X2luZGV4LCB0ZXN0KToKKyAgICAgICAgaWYgc2VsZi5ucy5xdWlldDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmJhZCBhbmQgbm90IHNlbGYubnMucGdvOgorICAgICAgICAgICAgZm10ID0gInt0aW1lfSBbe3Rlc3RfaW5kZXg6e2NvdW50X3dpZHRofX17dGVzdF9jb3VudH0ve25iYWR9XSB7dGVzdF9uYW1lfSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZtdCA9ICJ7dGltZX0gW3t0ZXN0X2luZGV4Ontjb3VudF93aWR0aH19e3Rlc3RfY291bnR9XSB7dGVzdF9uYW1lfSIKKyAgICAgICAgdGVzdF90aW1lID0gdGltZS5tb25vdG9uaWMoKSAtIHNlbGYuc3RhcnRfdGltZQorICAgICAgICB0ZXN0X3RpbWUgPSBkYXRldGltZS50aW1lZGVsdGEoc2Vjb25kcz1pbnQodGVzdF90aW1lKSkKKyAgICAgICAgbGluZSA9IGZtdC5mb3JtYXQoY291bnRfd2lkdGg9c2VsZi50ZXN0X2NvdW50X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZGV4PXRlc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY291bnQ9c2VsZi50ZXN0X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYmFkPWxlbihzZWxmLmJhZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZT10ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lPXRlc3RfdGltZSkKKyAgICAgICAgcHJpbnQobGluZSwgZmx1c2g9VHJ1ZSkKKworICAgIGRlZiBwYXJzZV9hcmdzKHNlbGYsIGt3YXJncyk6CisgICAgICAgIG5zID0gX3BhcnNlX2FyZ3Moc3lzLmFyZ3ZbMTpdLCAqKmt3YXJncykKKworICAgICAgICBpZiBucy50aW1lb3V0IGFuZCBub3QgaGFzYXR0cihmYXVsdGhhbmRsZXIsICdkdW1wX3RyYWNlYmFja19sYXRlcicpOgorICAgICAgICAgICAgcHJpbnQoIldhcm5pbmc6IFRoZSB0aW1lb3V0IG9wdGlvbiByZXF1aXJlcyAiCisgICAgICAgICAgICAgICAgICAiZmF1bHRoYW5kbGVyLmR1bXBfdHJhY2ViYWNrX2xhdGVyIiwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgbnMudGltZW91dCA9IE5vbmUKKworICAgICAgICBpZiBucy50aHJlc2hvbGQgaXMgbm90IE5vbmUgYW5kIGdjIGlzIE5vbmU6CisgICAgICAgICAgICBwcmludCgnTm8gR0MgYXZhaWxhYmxlLCBpZ25vcmUgLS10aHJlc2hvbGQuJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgbnMudGhyZXNob2xkID0gTm9uZQorCisgICAgICAgIGlmIG5zLmZpbmRsZWFrczoKKyAgICAgICAgICAgIGlmIGdjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIHJlcG9ydCBnYXJiYWdlIHRoYXQgaXMgbm90CisgICAgICAgICAgICAgICAgIyBmcmVlYWJsZSBieSByZWZlcmVuY2UgY291bnRpbmcgYWxvbmUuICBCeSBkZWZhdWx0IG9ubHkKKyAgICAgICAgICAgICAgICAjIGdhcmJhZ2UgdGhhdCBpcyBub3QgY29sbGVjdGFibGUgYnkgdGhlIEdDIGlzIHJlcG9ydGVkLgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAjZ2Muc2V0X2RlYnVnKGdjLkRFQlVHX1NBVkVBTEwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50KCdObyBHQyBhdmFpbGFibGUsIGRpc2FibGluZyAtLWZpbmRsZWFrcycsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgICAgIG5zLmZpbmRsZWFrcyA9IEZhbHNlCisKKyAgICAgICAgIyBTdHJpcCAucHkgZXh0ZW5zaW9ucy4KKyAgICAgICAgcmVtb3ZlcHkobnMuYXJncykKKworICAgICAgICByZXR1cm4gbnMKKworICAgIGRlZiBmaW5kX3Rlc3RzKHNlbGYsIHRlc3RzKToKKyAgICAgICAgc2VsZi50ZXN0cyA9IHRlc3RzCisKKyAgICAgICAgaWYgc2VsZi5ucy5zaW5nbGU6CisgICAgICAgICAgICBzZWxmLm5leHRfc2luZ2xlX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICdweW5leHR0ZXN0JykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5uZXh0X3NpbmdsZV9maWxlbmFtZSwgJ3InKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgbmV4dF90ZXN0ID0gZnAucmVhZCgpLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXN0cyA9IFtuZXh0X3Rlc3RdCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgc2VsZi5ucy5mcm9tZmlsZToKKyAgICAgICAgICAgIHNlbGYudGVzdHMgPSBbXQorICAgICAgICAgICAgIyByZWdleCB0byBtYXRjaCAndGVzdF9idWlsdGluJyBpbiBsaW5lOgorICAgICAgICAgICAgIyAnMDowMDowMCBbICA0LzQwMF0gdGVzdF9idWlsdGluIC0tIHRlc3RfZGljdCB0b29rIDEgc2VjJworICAgICAgICAgICAgcmVnZXggPSAocideKD86WzAtOV0rOlswLTldKzpbMC05XSsgKik/JworICAgICAgICAgICAgICAgICAgICAgcicoPzpcW1swLTkvIF0rXF0gKik/JworICAgICAgICAgICAgICAgICAgICAgcicodGVzdF9bYS16QS1aMC05X10rKScpCisgICAgICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUocmVnZXgpCisgICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIHNlbGYubnMuZnJvbWZpbGUpKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmcDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJyMnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gcmVnZXgubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVzdHMuYXBwZW5kKG1hdGNoLmdyb3VwKDEpKQorCisgICAgICAgIHJlbW92ZXB5KHNlbGYudGVzdHMpCisKKyAgICAgICAgc3RkdGVzdHMgPSBTVERURVNUU1s6XQorICAgICAgICBub3R0ZXN0cyA9IE5PVFRFU1RTLmNvcHkoKQorICAgICAgICBpZiBzZWxmLm5zLmV4Y2x1ZGU6CisgICAgICAgICAgICBmb3IgYXJnIGluIHNlbGYubnMuYXJnczoKKyAgICAgICAgICAgICAgICBpZiBhcmcgaW4gc3RkdGVzdHM6CisgICAgICAgICAgICAgICAgICAgIHN0ZHRlc3RzLnJlbW92ZShhcmcpCisgICAgICAgICAgICAgICAgbm90dGVzdHMuYWRkKGFyZykKKyAgICAgICAgICAgIHNlbGYubnMuYXJncyA9IFtdCisKKyAgICAgICAgIyBpZiB0ZXN0ZGlyIGlzIHNldCwgdGhlbiB3ZSBhcmUgbm90IHJ1bm5pbmcgdGhlIHB5dGhvbiB0ZXN0cyBzdWl0ZSwgc28KKyAgICAgICAgIyBkb24ndCBhZGQgZGVmYXVsdCB0ZXN0cyB0byBiZSBleGVjdXRlZCBvciBza2lwcGVkIChwYXNzIGVtcHR5IHZhbHVlcykKKyAgICAgICAgaWYgc2VsZi5ucy50ZXN0ZGlyOgorICAgICAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMoc2VsZi5ucy50ZXN0ZGlyLCBsaXN0KCksIHNldCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMoc2VsZi5ucy50ZXN0ZGlyLCBzdGR0ZXN0cywgbm90dGVzdHMpCisKKyAgICAgICAgaWYgbm90IHNlbGYubnMuZnJvbWZpbGU6CisgICAgICAgICAgICBzZWxmLnNlbGVjdGVkID0gc2VsZi50ZXN0cyBvciBzZWxmLm5zLmFyZ3Mgb3IgYWxsdGVzdHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWQgPSBzZWxmLnRlc3RzCisgICAgICAgIGlmIHNlbGYubnMuc2luZ2xlOgorICAgICAgICAgICAgc2VsZi5zZWxlY3RlZCA9IHNlbGYuc2VsZWN0ZWRbOjFdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcG9zID0gYWxsdGVzdHMuaW5kZXgoc2VsZi5zZWxlY3RlZFswXSkKKyAgICAgICAgICAgICAgICBzZWxmLm5leHRfc2luZ2xlX3Rlc3QgPSBhbGx0ZXN0c1twb3MgKyAxXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgUmVtb3ZlIGFsbCB0aGUgc2VsZWN0ZWQgdGVzdHMgdGhhdCBwcmVjZWRlIHN0YXJ0IGlmIGl0J3Mgc2V0LgorICAgICAgICBpZiBzZWxmLm5zLnN0YXJ0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnNlbGVjdGVkWzpzZWxmLnNlbGVjdGVkLmluZGV4KHNlbGYubnMuc3RhcnQpXQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQoIkNvdWxkbid0IGZpbmQgc3RhcnRpbmcgdGVzdCAoJXMpLCB1c2luZyBhbGwgdGVzdHMiCisgICAgICAgICAgICAgICAgICAgICAgJSBzZWxmLm5zLnN0YXJ0LCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICAgICAgaWYgc2VsZi5ucy5yYW5kb21pemU6CisgICAgICAgICAgICBpZiBzZWxmLm5zLnJhbmRvbV9zZWVkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5ucy5yYW5kb21fc2VlZCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwMDApCisgICAgICAgICAgICByYW5kb20uc2VlZChzZWxmLm5zLnJhbmRvbV9zZWVkKQorICAgICAgICAgICAgcmFuZG9tLnNodWZmbGUoc2VsZi5zZWxlY3RlZCkKKworICAgIGRlZiBsaXN0X3Rlc3RzKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLnNlbGVjdGVkOgorICAgICAgICAgICAgcHJpbnQobmFtZSkKKworICAgIGRlZiByZXJ1bl9mYWlsZWRfdGVzdHMoc2VsZik6CisgICAgICAgIHNlbGYubnMudmVyYm9zZSA9IFRydWUKKyAgICAgICAgc2VsZi5ucy5mYWlsZmFzdCA9IEZhbHNlCisgICAgICAgIHNlbGYubnMudmVyYm9zZTMgPSBGYWxzZQorICAgICAgICBzZWxmLm5zLm1hdGNoX3Rlc3RzID0gTm9uZQorCisgICAgICAgIHByaW50KCJSZS1ydW5uaW5nIGZhaWxlZCB0ZXN0cyBpbiB2ZXJib3NlIG1vZGUiKQorICAgICAgICBmb3IgdGVzdCBpbiBzZWxmLmJhZFs6XToKKyAgICAgICAgICAgIHByaW50KCJSZS1ydW5uaW5nIHRlc3QgJXIgaW4gdmVyYm9zZSBtb2RlIiAlIHRlc3QsIGZsdXNoPVRydWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5ucy52ZXJib3NlID0gVHJ1ZQorICAgICAgICAgICAgICAgIG9rID0gcnVudGVzdChzZWxmLm5zLCB0ZXN0KQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgIHNlbGYuaW50ZXJydXB0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgIyBwcmludCBhIG5ld2xpbmUgc2VwYXJhdGUgZnJvbSB0aGUgXkMKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgb2tbMF0gaW4ge1BBU1NFRCwgRU5WX0NIQU5HRUQsIFNLSVBQRUQsIFJFU09VUkNFX0RFTklFRH06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFkLnJlbW92ZSh0ZXN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5iYWQ6CisgICAgICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuYmFkKSwgJ3Rlc3QnKSwgImZhaWxlZCBhZ2FpbjoiKQorICAgICAgICAgICAgICAgIHByaW50bGlzdChzZWxmLmJhZCkKKworICAgIGRlZiBkaXNwbGF5X3Jlc3VsdChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pbnRlcnJ1cHRlZDoKKyAgICAgICAgICAgICMgcHJpbnQgYSBuZXdsaW5lIGFmdGVyIF5DCisgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludCgiVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULiIpCisgICAgICAgICAgICBleGVjdXRlZCA9IHNldChzZWxmLmdvb2QpIHwgc2V0KHNlbGYuYmFkKSB8IHNldChzZWxmLnNraXBwZWQpCisgICAgICAgICAgICBvbWl0dGVkID0gc2V0KHNlbGYuc2VsZWN0ZWQpIC0gZXhlY3V0ZWQKKyAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihvbWl0dGVkKSwgInRlc3QiKSwgIm9taXR0ZWQ6IikKKyAgICAgICAgICAgIHByaW50bGlzdChvbWl0dGVkKQorCisgICAgICAgICMgSWYgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgUEdPIHRoZW4gbm8gb25lIGNhcmVzIGFib3V0CisgICAgICAgICMgcmVzdWx0cy4KKyAgICAgICAgaWYgc2VsZi5ucy5wZ286CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLmdvb2QgYW5kIG5vdCBzZWxmLm5zLnF1aWV0OgorICAgICAgICAgICAgaWYgKG5vdCBzZWxmLmJhZAorICAgICAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5za2lwcGVkCisgICAgICAgICAgICAgICAgYW5kIG5vdCBzZWxmLmludGVycnVwdGVkCisgICAgICAgICAgICAgICAgYW5kIGxlbihzZWxmLmdvb2QpID4gMSk6CisgICAgICAgICAgICAgICAgcHJpbnQoIkFsbCIsIGVuZD0nICcpCisgICAgICAgICAgICBwcmludChjb3VudChsZW4oc2VsZi5nb29kKSwgInRlc3QiKSwgIk9LLiIpCisKKyAgICAgICAgaWYgc2VsZi5ucy5wcmludF9zbG93OgorICAgICAgICAgICAgc2VsZi50ZXN0X3RpbWVzLnNvcnQocmV2ZXJzZT1UcnVlKQorICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQoIjEwIHNsb3dlc3QgdGVzdHM6IikKKyAgICAgICAgICAgIGZvciB0aW1lLCB0ZXN0IGluIHNlbGYudGVzdF90aW1lc1s6MTBdOgorICAgICAgICAgICAgICAgIHByaW50KCItICVzOiAlcyIgJSAodGVzdCwgZm9ybWF0X2R1cmF0aW9uKHRpbWUpKSkKKworICAgICAgICBpZiBzZWxmLmJhZDoKKyAgICAgICAgICAgIHByaW50KCkKKyAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihzZWxmLmJhZCksICJ0ZXN0IiksICJmYWlsZWQ6IikKKyAgICAgICAgICAgIHByaW50bGlzdChzZWxmLmJhZCkKKworICAgICAgICBpZiBzZWxmLmVudmlyb25tZW50X2NoYW5nZWQ6CisgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludCgie30gYWx0ZXJlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50OiIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgY291bnQobGVuKHNlbGYuZW52aXJvbm1lbnRfY2hhbmdlZCksICJ0ZXN0IikpKQorICAgICAgICAgICAgcHJpbnRsaXN0KHNlbGYuZW52aXJvbm1lbnRfY2hhbmdlZCkKKworICAgICAgICBpZiBzZWxmLnNraXBwZWQgYW5kIG5vdCBzZWxmLm5zLnF1aWV0OgorICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuc2tpcHBlZCksICJ0ZXN0IiksICJza2lwcGVkOiIpCisgICAgICAgICAgICBwcmludGxpc3Qoc2VsZi5za2lwcGVkKQorCisgICAgZGVmIHJ1bl90ZXN0c19zZXF1ZW50aWFsKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm5zLnRyYWNlOgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlCisgICAgICAgICAgICBzZWxmLnRyYWNlciA9IHRyYWNlLlRyYWNlKHRyYWNlPUZhbHNlLCBjb3VudD1UcnVlKQorCisgICAgICAgIHNhdmVfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmtleXMoKQorCisgICAgICAgIHByaW50KCJSdW4gdGVzdHMgc2VxdWVudGlhbGx5IikKKworICAgICAgICBwcmV2aW91c190ZXN0ID0gTm9uZQorICAgICAgICBmb3IgdGVzdF9pbmRleCwgdGVzdCBpbiBlbnVtZXJhdGUoc2VsZi50ZXN0cywgMSk6CisgICAgICAgICAgICBzdGFydF90aW1lID0gdGltZS5tb25vdG9uaWMoKQorCisgICAgICAgICAgICB0ZXh0ID0gdGVzdAorICAgICAgICAgICAgaWYgcHJldmlvdXNfdGVzdDoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gJyVzIC0tICVzJyAlICh0ZXh0LCBwcmV2aW91c190ZXN0KQorICAgICAgICAgICAgc2VsZi5kaXNwbGF5X3Byb2dyZXNzKHRlc3RfaW5kZXgsIHRleHQpCisKKyAgICAgICAgICAgIGlmIHNlbGYudHJhY2VyOgorICAgICAgICAgICAgICAgICMgSWYgd2UncmUgdHJhY2luZyBjb2RlIGNvdmVyYWdlLCB0aGVuIHdlIGRvbid0IGV4aXQgd2l0aCBzdGF0dXMKKyAgICAgICAgICAgICAgICAjIGlmIG9uIGEgZmFsc2UgcmV0dXJuIHZhbHVlIGZyb20gbWFpbi4KKyAgICAgICAgICAgICAgICBjbWQgPSAoJ3Jlc3VsdCA9IHJ1bnRlc3Qoc2VsZi5ucywgdGVzdCk7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGYuYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KScpCisgICAgICAgICAgICAgICAgbnMgPSBkaWN0KGxvY2FscygpKQorICAgICAgICAgICAgICAgIHNlbGYudHJhY2VyLnJ1bmN0eChjbWQsIGdsb2JhbHM9Z2xvYmFscygpLCBsb2NhbHM9bnMpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbnNbJ3Jlc3VsdCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdChzZWxmLm5zLCB0ZXN0KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnRlcnJ1cHRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCAoSU5URVJSVVBURUQsIE5vbmUpKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQorCisgICAgICAgICAgICBwcmV2aW91c190ZXN0ID0gZm9ybWF0X3Rlc3RfcmVzdWx0KHRlc3QsIHJlc3VsdFswXSkKKyAgICAgICAgICAgIHRlc3RfdGltZSA9IHRpbWUubW9ub3RvbmljKCkgLSBzdGFydF90aW1lCisgICAgICAgICAgICBpZiB0ZXN0X3RpbWUgPj0gUFJPR1JFU1NfTUlOX1RJTUU6CisgICAgICAgICAgICAgICAgcHJldmlvdXNfdGVzdCA9ICIlcyBpbiAlcyIgJSAocHJldmlvdXNfdGVzdCwgZm9ybWF0X2R1cmF0aW9uKHRlc3RfdGltZSkpCisgICAgICAgICAgICBlbGlmIHJlc3VsdFswXSA9PSBQQVNTRUQ6CisgICAgICAgICAgICAgICAgIyBiZSBxdWlldDogc2F5IG5vdGhpbmcgaWYgdGhlIHRlc3QgcGFzc2VkIHNob3J0bHkKKyAgICAgICAgICAgICAgICBwcmV2aW91c190ZXN0ID0gTm9uZQorCisgICAgICAgICAgICBpZiBzZWxmLm5zLmZpbmRsZWFrczoKKyAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgICAgICBpZiBnYy5nYXJiYWdlOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiV2FybmluZzogdGVzdCBjcmVhdGVkIiwgbGVuKGdjLmdhcmJhZ2UpLCBlbmQ9JyAnKQorICAgICAgICAgICAgICAgICAgICBwcmludCgidW5jb2xsZWN0YWJsZSBvYmplY3QocykuIikKKyAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSB1bmNvbGxlY3RhYmxlIG9iamVjdHMgc29tZXdoZXJlIHNvIHdlIGRvbid0IHNlZQorICAgICAgICAgICAgICAgICAgICAjIHRoZW0gYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3VuZF9nYXJiYWdlLmV4dGVuZChnYy5nYXJiYWdlKQorICAgICAgICAgICAgICAgICAgICBkZWwgZ2MuZ2FyYmFnZVs6XQorCisgICAgICAgICAgICAjIFVubG9hZCB0aGUgbmV3bHkgaW1wb3J0ZWQgbW9kdWxlcyAoYmVzdCBlZmZvcnQgZmluYWxpemF0aW9uKQorICAgICAgICAgICAgZm9yIG1vZHVsZSBpbiBzeXMubW9kdWxlcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgbW9kdWxlIG5vdCBpbiBzYXZlX21vZHVsZXMgYW5kIG1vZHVsZS5zdGFydHN3aXRoKCJ0ZXN0LiIpOgorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LnVubG9hZChtb2R1bGUpCisKKyAgICAgICAgaWYgcHJldmlvdXNfdGVzdDoKKyAgICAgICAgICAgIHByaW50KHByZXZpb3VzX3Rlc3QpCisKKyAgICBkZWYgX3Rlc3RfZm9yZXZlcihzZWxmLCB0ZXN0cyk6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBmb3IgdGVzdCBpbiB0ZXN0czoKKyAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0CisgICAgICAgICAgICAgICAgaWYgc2VsZi5iYWQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIHJ1bl90ZXN0cyhzZWxmKToKKyAgICAgICAgIyBGb3IgYSBwYXJ0aWFsIHJ1biwgd2UgZG8gbm90IG5lZWQgdG8gY2x1dHRlciB0aGUgb3V0cHV0LgorICAgICAgICBpZiAoc2VsZi5ucy52ZXJib3NlCisgICAgICAgICAgICBvciBzZWxmLm5zLmhlYWRlcgorICAgICAgICAgICAgb3Igbm90IChzZWxmLm5zLnBnbyBvciBzZWxmLm5zLnF1aWV0IG9yIHNlbGYubnMuc2luZ2xlCisgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYudGVzdHMgb3Igc2VsZi5ucy5hcmdzKSk6CisgICAgICAgICAgICAjIFByaW50IGJhc2ljIHBsYXRmb3JtIGluZm9ybWF0aW9uCisgICAgICAgICAgICBwcmludCgiPT0iLCBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwgKnN5cy52ZXJzaW9uLnNwbGl0KCkpCisgICAgICAgICAgICBwcmludCgiPT0gICIsIHBsYXRmb3JtLnBsYXRmb3JtKGFsaWFzZWQ9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlcy1lbmRpYW4iICUgc3lzLmJ5dGVvcmRlcikKKyAgICAgICAgICAgIHByaW50KCI9PSAgIiwgImhhc2ggYWxnb3JpdGhtOiIsIHN5cy5oYXNoX2luZm8uYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgIjY0Yml0IiBpZiBzeXMubWF4c2l6ZSA+IDIqKjMyIGVsc2UgIjMyYml0IikKKyAgICAgICAgICAgIHByaW50KCI9PSAgY3dkOiIsIG9zLmdldGN3ZCgpKQorICAgICAgICAgICAgcHJpbnQoIj09ICBlbmNvZGluZ3M6IGxvY2FsZT0lcywgRlM9JXMiCisgICAgICAgICAgICAgICAgICAlIChsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKSkKKyAgICAgICAgICAgIHByaW50KCJUZXN0aW5nIHdpdGggZmxhZ3M6Iiwgc3lzLmZsYWdzKQorCisgICAgICAgIGlmIHNlbGYubnMucmFuZG9taXplOgorICAgICAgICAgICAgcHJpbnQoIlVzaW5nIHJhbmRvbSBzZWVkIiwgc2VsZi5ucy5yYW5kb21fc2VlZCkKKworICAgICAgICBpZiBzZWxmLm5zLmZvcmV2ZXI6CisgICAgICAgICAgICBzZWxmLnRlc3RzID0gc2VsZi5fdGVzdF9mb3JldmVyKGxpc3Qoc2VsZi5zZWxlY3RlZCkpCisgICAgICAgICAgICBzZWxmLnRlc3RfY291bnQgPSAnJworICAgICAgICAgICAgc2VsZi50ZXN0X2NvdW50X3dpZHRoID0gMworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ZXN0cyA9IGl0ZXIoc2VsZi5zZWxlY3RlZCkKKyAgICAgICAgICAgIHNlbGYudGVzdF9jb3VudCA9ICcve30nLmZvcm1hdChsZW4oc2VsZi5zZWxlY3RlZCkpCisgICAgICAgICAgICBzZWxmLnRlc3RfY291bnRfd2lkdGggPSBsZW4oc2VsZi50ZXN0X2NvdW50KSAtIDEKKworICAgICAgICBpZiBzZWxmLm5zLnVzZV9tcDoKKyAgICAgICAgICAgIGZyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0X21wIGltcG9ydCBydW5fdGVzdHNfbXVsdGlwcm9jZXNzCisgICAgICAgICAgICBydW5fdGVzdHNfbXVsdGlwcm9jZXNzKHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJ1bl90ZXN0c19zZXF1ZW50aWFsKCkKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5uZXh0X3NpbmdsZV9maWxlbmFtZToKKyAgICAgICAgICAgIGlmIHNlbGYubmV4dF9zaW5nbGVfdGVzdDoKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5uZXh0X3NpbmdsZV9maWxlbmFtZSwgJ3cnKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5uZXh0X3NpbmdsZV90ZXN0ICsgJ1xuJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUpCisKKyAgICAgICAgaWYgc2VsZi50cmFjZXI6CisgICAgICAgICAgICByID0gc2VsZi50cmFjZXIucmVzdWx0cygpCisgICAgICAgICAgICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmRpcj1zZWxmLm5zLmNvdmVyZGlyKQorCisgICAgICAgIHByaW50KCkKKyAgICAgICAgZHVyYXRpb24gPSB0aW1lLm1vbm90b25pYygpIC0gc2VsZi5zdGFydF90aW1lCisgICAgICAgIHByaW50KCJUb3RhbCBkdXJhdGlvbjogJXMiICUgZm9ybWF0X2R1cmF0aW9uKGR1cmF0aW9uKSkKKworICAgICAgICBpZiBzZWxmLmJhZDoKKyAgICAgICAgICAgIHJlc3VsdCA9ICJGQUlMVVJFIgorICAgICAgICBlbGlmIHNlbGYuaW50ZXJydXB0ZWQ6CisgICAgICAgICAgICByZXN1bHQgPSAiSU5URVJSVVBURUQiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXN1bHQgPSAiU1VDQ0VTUyIKKyAgICAgICAgcHJpbnQoIlRlc3RzIHJlc3VsdDogJXMiICUgcmVzdWx0KQorCisgICAgICAgIGlmIHNlbGYubnMucnVubGVha3M6CisgICAgICAgICAgICBvcy5zeXN0ZW0oImxlYWtzICVkIiAlIG9zLmdldHBpZCgpKQorCisgICAgZGVmIG1haW4oc2VsZiwgdGVzdHM9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICBnbG9iYWwgVEVNUERJUgorCisgICAgICAgIGlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihURU1QRElSKQorICAgICAgICAgICAgZXhjZXB0IEZpbGVFeGlzdHNFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBEZWZpbmUgYSB3cml0YWJsZSB0ZW1wIGRpciB0aGF0IHdpbGwgYmUgdXNlZCBhcyBjd2Qgd2hpbGUgcnVubmluZworICAgICAgICAjIHRoZSB0ZXN0cy4gVGhlIG5hbWUgb2YgdGhlIGRpciBpbmNsdWRlcyB0aGUgcGlkIHRvIGFsbG93IHBhcmFsbGVsCisgICAgICAgICMgdGVzdGluZyAoc2VlIHRoZSAtaiBvcHRpb24pLgorICAgICAgICB0ZXN0X2N3ZCA9ICd0ZXN0X3B5dGhvbl97fScuZm9ybWF0KG9zLmdldHBpZCgpKQorICAgICAgICB0ZXN0X2N3ZCA9IG9zLnBhdGguam9pbihURU1QRElSLCB0ZXN0X2N3ZCkKKworICAgICAgICAjIFJ1biB0aGUgdGVzdHMgaW4gYSBjb250ZXh0IG1hbmFnZXIgdGhhdCB0ZW1wb3JhcmlseSBjaGFuZ2VzIHRoZSBDV0QgdG8gYQorICAgICAgICAjIHRlbXBvcmFyeSBhbmQgd3JpdGFibGUgZGlyZWN0b3J5LiAgSWYgaXQncyBub3QgcG9zc2libGUgdG8gY3JlYXRlIG9yCisgICAgICAgICMgY2hhbmdlIHRoZSBDV0QsIHRoZSBvcmlnaW5hbCBDV0Qgd2lsbCBiZSB1c2VkLiAgVGhlIG9yaWdpbmFsIENXRCBpcworICAgICAgICAjIGF2YWlsYWJsZSBmcm9tIHN1cHBvcnQuU0FWRURDV0QuCisgICAgICAgIHdpdGggc3VwcG9ydC50ZW1wX2N3ZCh0ZXN0X2N3ZCwgcXVpZXQ9VHJ1ZSk6CisgICAgICAgICAgICBzZWxmLl9tYWluKHRlc3RzLCBrd2FyZ3MpCisKKyAgICBkZWYgX21haW4oc2VsZiwgdGVzdHMsIGt3YXJncyk6CisgICAgICAgIHNlbGYubnMgPSBzZWxmLnBhcnNlX2FyZ3Moa3dhcmdzKQorCisgICAgICAgIGlmIHNlbGYubnMuc2xhdmVhcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnJ1bnRlc3RfbXAgaW1wb3J0IHJ1bl90ZXN0c19zbGF2ZQorICAgICAgICAgICAgcnVuX3Rlc3RzX3NsYXZlKHNlbGYubnMuc2xhdmVhcmdzKQorCisgICAgICAgIGlmIHNlbGYubnMud2FpdDoKKyAgICAgICAgICAgIGlucHV0KCJQcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlLi4uIikKKworICAgICAgICBzdXBwb3J0LlBHTyA9IHNlbGYubnMucGdvCisKKyAgICAgICAgc2V0dXBfdGVzdHMoc2VsZi5ucykKKworICAgICAgICBzZWxmLmZpbmRfdGVzdHModGVzdHMpCisKKyAgICAgICAgaWYgc2VsZi5ucy5saXN0X3Rlc3RzOgorICAgICAgICAgICAgc2VsZi5saXN0X3Rlc3RzKCkKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoKQorICAgICAgICBzZWxmLmRpc3BsYXlfcmVzdWx0KCkKKworICAgICAgICBpZiBzZWxmLm5zLnZlcmJvc2UyIGFuZCBzZWxmLmJhZDoKKyAgICAgICAgICAgIHNlbGYucmVydW5fZmFpbGVkX3Rlc3RzKCkKKworICAgICAgICBzZWxmLmZpbmFsaXplKCkKKyAgICAgICAgc3lzLmV4aXQobGVuKHNlbGYuYmFkKSA+IDAgb3Igc2VsZi5pbnRlcnJ1cHRlZCkKKworCitkZWYgcmVtb3ZlcHkobmFtZXMpOgorICAgIGlmIG5vdCBuYW1lczoKKyAgICAgICAgcmV0dXJuCisgICAgZm9yIGlkeCwgbmFtZSBpbiBlbnVtZXJhdGUobmFtZXMpOgorICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQorICAgICAgICBpZiBleHQgPT0gJy5weSc6CisgICAgICAgICAgICBuYW1lc1tpZHhdID0gYmFzZW5hbWUKKworCitkZWYgY291bnQobiwgd29yZCk6CisgICAgaWYgbiA9PSAxOgorICAgICAgICByZXR1cm4gIiVkICVzIiAlIChuLCB3b3JkKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAiJWQgJXNzIiAlIChuLCB3b3JkKQorCisKK2RlZiBwcmludGxpc3QoeCwgd2lkdGg9NzAsIGluZGVudD00KToKKyAgICAiIiJQcmludCB0aGUgZWxlbWVudHMgb2YgaXRlcmFibGUgeCB0byBzdGRvdXQuCisKKyAgICBPcHRpb25hbCBhcmcgd2lkdGggKGRlZmF1bHQgNzApIGlzIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoLgorICAgIE9wdGlvbmFsIGFyZyBpbmRlbnQgKGRlZmF1bHQgNCkgaXMgdGhlIG51bWJlciBvZiBibGFua3Mgd2l0aCB3aGljaCB0bworICAgIGJlZ2luIGVhY2ggbGluZS4KKyAgICAiIiIKKworICAgIGJsYW5rcyA9ICcgJyAqIGluZGVudAorICAgICMgUHJpbnQgdGhlIHNvcnRlZCBsaXN0OiAneCcgbWF5IGJlIGEgJy0tcmFuZG9tJyBsaXN0IG9yIGEgc2V0KCkKKyAgICBwcmludCh0ZXh0d3JhcC5maWxsKCcgJy5qb2luKHN0cihlbHQpIGZvciBlbHQgaW4gc29ydGVkKHgpKSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1ibGFua3MsIHN1YnNlcXVlbnRfaW5kZW50PWJsYW5rcykpCisKKworZGVmIG1haW4odGVzdHM9Tm9uZSwgKiprd2FyZ3MpOgorICAgICIiIlJ1biB0aGUgUHl0aG9uIHN1aXRlLiIiIgorICAgIFJlZ3J0ZXN0KCkubWFpbih0ZXN0cz10ZXN0cywgKiprd2FyZ3MpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9yZWZsZWFrLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcmVmbGVhay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRjNDlmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcmVmbGVhay5weQpAQCAtMCwwICsxLDIwMiBAQAoraW1wb3J0IGVycm5vCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCitmcm9tIGluc3BlY3QgaW1wb3J0IGlzYWJzdHJhY3QKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisKK3RyeToKKyAgICBNQVhGRCA9IG9zLnN5c2NvbmYoIlNDX09QRU5fTUFYIikKK2V4Y2VwdCBFeGNlcHRpb246CisgICAgTUFYRkQgPSAyNTYKKworCitkZWYgZmRfY291bnQoKToKKyAgICAiIiJDb3VudCB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyIiIgorICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCgnbGludXgnLCAnZnJlZWJzZCcpKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKCIvcHJvYy9zZWxmL2ZkIikKKyAgICAgICAgICAgIHJldHVybiBsZW4obmFtZXMpCisgICAgICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGNvdW50ID0gMAorICAgIGZvciBmZCBpbiByYW5nZShNQVhGRCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgUHJlZmVyIGR1cCgpIG92ZXIgZnN0YXQoKS4gZnN0YXQoKSBjYW4gcmVxdWlyZSBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgICMgd2hlcmVhcyBkdXAoKSBkb2Vzbid0LgorICAgICAgICAgICAgZmQyID0gb3MuZHVwKGZkKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQkFERjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3MuY2xvc2UoZmQyKQorICAgICAgICAgICAgY291bnQgKz0gMQorICAgIHJldHVybiBjb3VudAorCisKK2RlZiBkYXNoX1IodGhlX21vZHVsZSwgdGVzdCwgaW5kaXJlY3RfdGVzdCwgaHVudHJsZWFrcyk6CisgICAgIiIiUnVuIGEgdGVzdCBtdWx0aXBsZSB0aW1lcywgbG9va2luZyBmb3IgcmVmZXJlbmNlIGxlYWtzLgorCisgICAgUmV0dXJuczoKKyAgICAgICAgRmFsc2UgaWYgdGhlIHRlc3QgZGlkbid0IGxlYWsgcmVmZXJlbmNlczsgVHJ1ZSBpZiB3ZSBkZXRlY3RlZCByZWZsZWFrcy4KKyAgICAiIiIKKyAgICAjIFRoaXMgY29kZSBpcyBoYWNraXNoIGFuZCBpbmVsZWdhbnQsIGJ1dCBpdCBzZWVtcyB0byBkbyB0aGUgam9iLgorICAgIGltcG9ydCBjb3B5cmVnCisgICAgaW1wb3J0IGNvbGxlY3Rpb25zLmFiYworCisgICAgaWYgbm90IGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIlRyYWNraW5nIHJlZmVyZW5jZSBsZWFrcyByZXF1aXJlcyBhIGRlYnVnIGJ1aWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZiBQeXRob24iKQorCisgICAgIyBTYXZlIGN1cnJlbnQgdmFsdWVzIGZvciBkYXNoX1JfY2xlYW51cCgpIHRvIHJlc3RvcmUuCisgICAgZnMgPSB3YXJuaW5ncy5maWx0ZXJzWzpdCisgICAgcHMgPSBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLmNvcHkoKQorICAgIHBpYyA9IHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmNvcHkoKQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHppcGltcG9ydAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgemRjID0gTm9uZSAjIFJ1biB1bm1vZGlmaWVkIG9uIHBsYXRmb3JtcyB3aXRob3V0IHppcGltcG9ydCBzdXBwb3J0CisgICAgZWxzZToKKyAgICAgICAgemRjID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLmNvcHkoKQorICAgIGFiY3MgPSB7fQorICAgIGZvciBhYmMgaW4gW2dldGF0dHIoY29sbGVjdGlvbnMuYWJjLCBhKSBmb3IgYSBpbiBjb2xsZWN0aW9ucy5hYmMuX19hbGxfX106CisgICAgICAgIGlmIG5vdCBpc2Fic3RyYWN0KGFiYyk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3Igb2JqIGluIGFiYy5fX3N1YmNsYXNzZXNfXygpICsgW2FiY106CisgICAgICAgICAgICBhYmNzW29ial0gPSBvYmouX2FiY19yZWdpc3RyeS5jb3B5KCkKKworICAgIG53YXJtdXAsIG50cmFja2VkLCBmbmFtZSA9IGh1bnRybGVha3MKKyAgICBmbmFtZSA9IG9zLnBhdGguam9pbihzdXBwb3J0LlNBVkVEQ1dELCBmbmFtZSkKKyAgICByZXBjb3VudCA9IG53YXJtdXAgKyBudHJhY2tlZAorICAgIHJjX2RlbHRhcyA9IFswXSAqIHJlcGNvdW50CisgICAgYWxsb2NfZGVsdGFzID0gWzBdICogcmVwY291bnQKKyAgICBmZF9kZWx0YXMgPSBbMF0gKiByZXBjb3VudAorCisgICAgcHJpbnQoImJlZ2lubmluZyIsIHJlcGNvdW50LCAicmVwZXRpdGlvbnMiLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgcHJpbnQoKCIxMjM0NTY3ODkwIioocmVwY291bnQvLzEwICsgMSkpWzpyZXBjb3VudF0sIGZpbGU9c3lzLnN0ZGVyciwKKyAgICAgICAgICBmbHVzaD1UcnVlKQorICAgICMgaW5pdGlhbGl6ZSB2YXJpYWJsZXMgdG8gbWFrZSBweWZsYWtlcyBxdWlldAorICAgIHJjX2JlZm9yZSA9IGFsbG9jX2JlZm9yZSA9IGZkX2JlZm9yZSA9IDAKKyAgICBmb3IgaSBpbiByYW5nZShyZXBjb3VudCk6CisgICAgICAgIGluZGlyZWN0X3Rlc3QoKQorICAgICAgICBhbGxvY19hZnRlciwgcmNfYWZ0ZXIsIGZkX2FmdGVyID0gZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiY3MpCisgICAgICAgIHByaW50KCcuJywgZW5kPScnLCBmbHVzaD1UcnVlKQorICAgICAgICBpZiBpID49IG53YXJtdXA6CisgICAgICAgICAgICByY19kZWx0YXNbaV0gPSByY19hZnRlciAtIHJjX2JlZm9yZQorICAgICAgICAgICAgYWxsb2NfZGVsdGFzW2ldID0gYWxsb2NfYWZ0ZXIgLSBhbGxvY19iZWZvcmUKKyAgICAgICAgICAgIGZkX2RlbHRhc1tpXSA9IGZkX2FmdGVyIC0gZmRfYmVmb3JlCisgICAgICAgIGFsbG9jX2JlZm9yZSA9IGFsbG9jX2FmdGVyCisgICAgICAgIHJjX2JlZm9yZSA9IHJjX2FmdGVyCisgICAgICAgIGZkX2JlZm9yZSA9IGZkX2FmdGVyCisgICAgcHJpbnQoZmlsZT1zeXMuc3RkZXJyKQorICAgICMgVGhlc2UgY2hlY2tlcnMgcmV0dXJuIEZhbHNlIG9uIHN1Y2Nlc3MsIFRydWUgb24gZmFpbHVyZQorICAgIGRlZiBjaGVja19yY19kZWx0YXMoZGVsdGFzKToKKyAgICAgICAgcmV0dXJuIGFueShkZWx0YXMpCisgICAgZGVmIGNoZWNrX2FsbG9jX2RlbHRhcyhkZWx0YXMpOgorICAgICAgICAjIEF0IGxlYXN0IDEvM3JkIG9mIDBzCisgICAgICAgIGlmIDMgKiBkZWx0YXMuY291bnQoMCkgPCBsZW4oZGVsdGFzKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgTm90aGluZyBlbHNlIHRoYW4gMXMsIDBzIGFuZCAtMXMKKyAgICAgICAgaWYgbm90IHNldChkZWx0YXMpIDw9IHsxLDAsLTF9OgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZmFpbGVkID0gRmFsc2UKKyAgICBmb3IgZGVsdGFzLCBpdGVtX25hbWUsIGNoZWNrZXIgaW4gWworICAgICAgICAocmNfZGVsdGFzLCAncmVmZXJlbmNlcycsIGNoZWNrX3JjX2RlbHRhcyksCisgICAgICAgIChhbGxvY19kZWx0YXMsICdtZW1vcnkgYmxvY2tzJywgY2hlY2tfYWxsb2NfZGVsdGFzKSwKKyAgICAgICAgKGZkX2RlbHRhcywgJ2ZpbGUgZGVzY3JpcHRvcnMnLCBjaGVja19yY19kZWx0YXMpXToKKyAgICAgICAgaWYgY2hlY2tlcihkZWx0YXMpOgorICAgICAgICAgICAgbXNnID0gJyVzIGxlYWtlZCAlcyAlcywgc3VtPSVzJyAlICgKKyAgICAgICAgICAgICAgICB0ZXN0LCBkZWx0YXNbbndhcm11cDpdLCBpdGVtX25hbWUsIHN1bShkZWx0YXMpKQorICAgICAgICAgICAgcHJpbnQobXNnLCBmaWxlPXN5cy5zdGRlcnIsIGZsdXNoPVRydWUpCisgICAgICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICJhIikgYXMgcmVmcmVwOgorICAgICAgICAgICAgICAgIHByaW50KG1zZywgZmlsZT1yZWZyZXApCisgICAgICAgICAgICAgICAgcmVmcmVwLmZsdXNoKCkKKyAgICAgICAgICAgIGZhaWxlZCA9IFRydWUKKyAgICByZXR1cm4gZmFpbGVkCisKKworZGVmIGRhc2hfUl9jbGVhbnVwKGZzLCBwcywgcGljLCB6ZGMsIGFiY3MpOgorICAgIGltcG9ydCBnYywgY29weXJlZworICAgIGltcG9ydCBfc3RycHRpbWUsIGxpbmVjYWNoZQorICAgIGltcG9ydCB1cmxsaWIucGFyc2UsIHVybGxpYi5yZXF1ZXN0LCBtaW1ldHlwZXMsIGRvY3Rlc3QKKyAgICBpbXBvcnQgc3RydWN0LCBmaWxlY21wLCBjb2xsZWN0aW9ucy5hYmMKKyAgICBmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgX3BhdGhfY3JlYXRlZAorICAgIGZyb20gd2Vha3JlZiBpbXBvcnQgV2Vha1NldAorCisgICAgIyBDbGVhciB0aGUgd2FybmluZ3MgcmVnaXN0cnksIHNvIHRoZXkgY2FuIGJlIGRpc3BsYXllZCBhZ2FpbgorICAgIGZvciBtb2QgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6CisgICAgICAgIGlmIGhhc2F0dHIobW9kLCAnX193YXJuaW5ncmVnaXN0cnlfXycpOgorICAgICAgICAgICAgZGVsIG1vZC5fX3dhcm5pbmdyZWdpc3RyeV9fCisKKyAgICAjIFJlc3RvcmUgc29tZSBvcmlnaW5hbCB2YWx1ZXMuCisgICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IGZzCisgICAgY29weXJlZy5kaXNwYXRjaF90YWJsZS5jbGVhcigpCisgICAgY29weXJlZy5kaXNwYXRjaF90YWJsZS51cGRhdGUocHMpCisgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY2xlYXIoKQorICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLnVwZGF0ZShwaWMpCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgemlwaW1wb3J0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzICMgUnVuIHVubW9kaWZpZWQgb24gcGxhdGZvcm1zIHdpdGhvdXQgemlwaW1wb3J0IHN1cHBvcnQKKyAgICBlbHNlOgorICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY2xlYXIoKQorICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUudXBkYXRlKHpkYykKKworICAgICMgY2xlYXIgdHlwZSBjYWNoZQorICAgIHN5cy5fY2xlYXJfdHlwZV9jYWNoZSgpCisKKyAgICAjIENsZWFyIEFCQyByZWdpc3RyaWVzLCByZXN0b3JpbmcgcHJldmlvdXNseSBzYXZlZCBBQkMgcmVnaXN0cmllcy4KKyAgICBmb3IgYWJjIGluIFtnZXRhdHRyKGNvbGxlY3Rpb25zLmFiYywgYSkgZm9yIGEgaW4gY29sbGVjdGlvbnMuYWJjLl9fYWxsX19dOgorICAgICAgICBpZiBub3QgaXNhYnN0cmFjdChhYmMpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZm9yIG9iaiBpbiBhYmMuX19zdWJjbGFzc2VzX18oKSArIFthYmNdOgorICAgICAgICAgICAgb2JqLl9hYmNfcmVnaXN0cnkgPSBhYmNzLmdldChvYmosIFdlYWtTZXQoKSkuY29weSgpCisgICAgICAgICAgICBvYmouX2FiY19jYWNoZS5jbGVhcigpCisgICAgICAgICAgICBvYmouX2FiY19uZWdhdGl2ZV9jYWNoZS5jbGVhcigpCisKKyAgICAjIEZsdXNoIHN0YW5kYXJkIG91dHB1dCwgc28gdGhhdCBidWZmZXJlZCBkYXRhIGlzIHNlbnQgdG8gdGhlIE9TIGFuZAorICAgICMgYXNzb2NpYXRlZCBQeXRob24gb2JqZWN0cyBhcmUgcmVjbGFpbWVkLgorICAgIGZvciBzdHJlYW0gaW4gKHN5cy5zdGRvdXQsIHN5cy5zdGRlcnIsIHN5cy5fX3N0ZG91dF9fLCBzeXMuX19zdGRlcnJfXyk6CisgICAgICAgIGlmIHN0cmVhbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN0cmVhbS5mbHVzaCgpCisKKyAgICAjIENsZWFyIGFzc29ydGVkIG1vZHVsZSBjYWNoZXMuCisgICAgX3BhdGhfY3JlYXRlZC5jbGVhcigpCisgICAgcmUucHVyZ2UoKQorICAgIF9zdHJwdGltZS5fcmVnZXhfY2FjaGUuY2xlYXIoKQorICAgIHVybGxpYi5wYXJzZS5jbGVhcl9jYWNoZSgpCisgICAgdXJsbGliLnJlcXVlc3QudXJsY2xlYW51cCgpCisgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgIG1pbWV0eXBlcy5fZGVmYXVsdF9taW1lX3R5cGVzKCkKKyAgICBmaWxlY21wLl9jYWNoZS5jbGVhcigpCisgICAgc3RydWN0Ll9jbGVhcmNhY2hlKCkKKyAgICBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBjdHlwZXMKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICMgRG9uJ3Qgd29ycnkgYWJvdXQgcmVzZXR0aW5nIHRoZSBjYWNoZSBpZiBjdHlwZXMgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgY3R5cGVzLl9yZXNldF9jYWNoZSgpCisKKyAgICAjIENvbGxlY3QgY3ljbGljIHRyYXNoIGFuZCByZWFkIG1lbW9yeSBzdGF0aXN0aWNzIGltbWVkaWF0ZWx5IGFmdGVyLgorICAgIGZ1bmMxID0gc3lzLmdldGFsbG9jYXRlZGJsb2NrcworICAgIGZ1bmMyID0gc3lzLmdldHRvdGFscmVmY291bnQKKyAgICBnYy5jb2xsZWN0KCkKKyAgICByZXR1cm4gZnVuYzEoKSwgZnVuYzIoKSwgZmRfY291bnQoKQorCisKK2RlZiB3YXJtX2NhY2hlcygpOgorICAgICMgY2hhciBjYWNoZQorICAgIHMgPSBieXRlcyhyYW5nZSgyNTYpKQorICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgICAgIHNbaTppKzFdCisgICAgIyB1bmljb2RlIGNhY2hlCisgICAgW2NocihpKSBmb3IgaSBpbiByYW5nZSgyNTYpXQorICAgICMgaW50IGNhY2hlCisgICAgbGlzdChyYW5nZSgtNSwgMjU3KSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3QucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9ydW50ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTI5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9ydW50ZXN0LnB5CkBAIC0wLDAgKzEsMjQ0IEBACitpbXBvcnQgZmF1bHRoYW5kbGVyCitpbXBvcnQgaW1wb3J0bGliCitpbXBvcnQgaW8KK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QubGlicmVncnRlc3QucmVmbGVhayBpbXBvcnQgZGFzaF9SCitmcm9tIHRlc3QubGlicmVncnRlc3Quc2F2ZV9lbnYgaW1wb3J0IHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQKKworCisjIFRlc3QgcmVzdWx0IGNvbnN0YW50cy4KK1BBU1NFRCA9IDEKK0ZBSUxFRCA9IDAKK0VOVl9DSEFOR0VEID0gLTEKK1NLSVBQRUQgPSAtMgorUkVTT1VSQ0VfREVOSUVEID0gLTMKK0lOVEVSUlVQVEVEID0gLTQKK0NISUxEX0VSUk9SID0gLTUgICAjIGVycm9yIGluIGEgY2hpbGQgcHJvY2VzcworCitfRk9STUFUX1RFU1RfUkVTVUxUID0geworICAgIFBBU1NFRDogJyVzIHBhc3NlZCcsCisgICAgRkFJTEVEOiAnJXMgZmFpbGVkJywKKyAgICBFTlZfQ0hBTkdFRDogJyVzIGZhaWxlZCAoZW52IGNoYW5nZWQpJywKKyAgICBTS0lQUEVEOiAnJXMgc2tpcHBlZCcsCisgICAgUkVTT1VSQ0VfREVOSUVEOiAnJXMgc2tpcHBlZCAocmVzb3VyY2UgZGVuaWVkKScsCisgICAgSU5URVJSVVBURUQ6ICclcyBpbnRlcnJ1cHRlZCcsCisgICAgQ0hJTERfRVJST1I6ICclcyBjcmFzaGVkJywKK30KKworIyBNaW5pbXVtIGR1cmF0aW9uIG9mIGEgdGVzdCB0byBkaXNwbGF5IGl0cyBkdXJhdGlvbiBvciB0byBtZW50aW9uIHRoYXQKKyMgdGhlIHRlc3QgaXMgcnVubmluZyBpbiBiYWNrZ3JvdW5kCitQUk9HUkVTU19NSU5fVElNRSA9IDMwLjAgICAjIHNlY29uZHMKKworIyBzbWFsbCBzZXQgb2YgdGVzdHMgdG8gZGV0ZXJtaW5lIGlmIHdlIGhhdmUgYSBiYXNpY2FsbHkgZnVuY3Rpb25pbmcgaW50ZXJwcmV0ZXIKKyMgKGkuZS4gaWYgYW55IG9mIHRoZXNlIGZhaWwsIHRoZW4gYW55dGhpbmcgZWxzZSBpcyBsaWtlbHkgdG8gZm9sbG93KQorU1REVEVTVFMgPSBbCisgICAgJ3Rlc3RfZ3JhbW1hcicsCisgICAgJ3Rlc3Rfb3Bjb2RlcycsCisgICAgJ3Rlc3RfZGljdCcsCisgICAgJ3Rlc3RfYnVpbHRpbicsCisgICAgJ3Rlc3RfZXhjZXB0aW9ucycsCisgICAgJ3Rlc3RfdHlwZXMnLAorICAgICd0ZXN0X3VuaXR0ZXN0JywKKyAgICAndGVzdF9kb2N0ZXN0JywKKyAgICAndGVzdF9kb2N0ZXN0MicsCisgICAgJ3Rlc3Rfc3VwcG9ydCcKK10KKworIyBzZXQgb2YgdGVzdHMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdXNpbmcgcmVncnRlc3QKK05PVFRFU1RTID0gc2V0KCkKKworCitkZWYgZm9ybWF0X3Rlc3RfcmVzdWx0KHRlc3RfbmFtZSwgcmVzdWx0KToKKyAgICBmbXQgPSBfRk9STUFUX1RFU1RfUkVTVUxULmdldChyZXN1bHQsICIlcyIpCisgICAgcmV0dXJuIGZtdCAlIHRlc3RfbmFtZQorCisKK2RlZiBmaW5kdGVzdHModGVzdGRpcj1Ob25lLCBzdGR0ZXN0cz1TVERURVNUUywgbm90dGVzdHM9Tk9UVEVTVFMpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIGFwcGxpY2FibGUgdGVzdCBtb2R1bGVzLiIiIgorICAgIHRlc3RkaXIgPSBmaW5kdGVzdGRpcih0ZXN0ZGlyKQorICAgIG5hbWVzID0gb3MubGlzdGRpcih0ZXN0ZGlyKQorICAgIHRlc3RzID0gW10KKyAgICBvdGhlcnMgPSBzZXQoc3RkdGVzdHMpIHwgbm90dGVzdHMKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgbW9kLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCisgICAgICAgIGlmIG1vZFs6NV0gPT0gInRlc3RfIiBhbmQgZXh0IGluICgiLnB5IiwgIiIpIGFuZCBtb2Qgbm90IGluIG90aGVyczoKKyAgICAgICAgICAgIHRlc3RzLmFwcGVuZChtb2QpCisgICAgcmV0dXJuIHN0ZHRlc3RzICsgc29ydGVkKHRlc3RzKQorCisKK2RlZiBydW50ZXN0KG5zLCB0ZXN0KToKKyAgICAiIiJSdW4gYSBzaW5nbGUgdGVzdC4KKworICAgIG5zIC0tIHJlZ3J0ZXN0IG5hbWVzcGFjZSBvZiBvcHRpb25zCisgICAgdGVzdCAtLSB0aGUgbmFtZSBvZiB0aGUgdGVzdAorCisgICAgUmV0dXJucyB0aGUgdHVwbGUgKHJlc3VsdCwgdGVzdF90aW1lKSwgd2hlcmUgcmVzdWx0IGlzIG9uZSBvZiB0aGUKKyAgICBjb25zdGFudHM6CisKKyAgICAgICAgSU5URVJSVVBURUQgICAgICBLZXlib2FyZEludGVycnVwdCB3aGVuIHJ1biB1bmRlciAtagorICAgICAgICBSRVNPVVJDRV9ERU5JRUQgIHRlc3Qgc2tpcHBlZCBiZWNhdXNlIHJlc291cmNlIGRlbmllZAorICAgICAgICBTS0lQUEVEICAgICAgICAgIHRlc3Qgc2tpcHBlZCBmb3Igc29tZSBvdGhlciByZWFzb24KKyAgICAgICAgRU5WX0NIQU5HRUQgICAgICB0ZXN0IGZhaWxlZCBiZWNhdXNlIGl0IGNoYW5nZWQgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudAorICAgICAgICBGQUlMRUQgICAgICAgICAgIHRlc3QgZmFpbGVkCisgICAgICAgIFBBU1NFRCAgICAgICAgICAgdGVzdCBwYXNzZWQKKyAgICAiIiIKKworICAgIG91dHB1dF9vbl9mYWlsdXJlID0gbnMudmVyYm9zZTMKKworICAgIHVzZV90aW1lb3V0ID0gKG5zLnRpbWVvdXQgaXMgbm90IE5vbmUpCisgICAgaWYgdXNlX3RpbWVvdXQ6CisgICAgICAgIGZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcihucy50aW1lb3V0LCBleGl0PVRydWUpCisgICAgdHJ5OgorICAgICAgICBzdXBwb3J0Lm1hdGNoX3Rlc3RzID0gbnMubWF0Y2hfdGVzdHMKKyAgICAgICAgaWYgbnMuZmFpbGZhc3Q6CisgICAgICAgICAgICBzdXBwb3J0LmZhaWxmYXN0ID0gVHJ1ZQorICAgICAgICBpZiBvdXRwdXRfb25fZmFpbHVyZToKKyAgICAgICAgICAgIHN1cHBvcnQudmVyYm9zZSA9IFRydWUKKworICAgICAgICAgICAgIyBSZXVzZSB0aGUgc2FtZSBpbnN0YW5jZSB0byBhbGwgY2FsbHMgdG8gcnVudGVzdCgpLiBTb21lCisgICAgICAgICAgICAjIHRlc3RzIGtlZXAgYSByZWZlcmVuY2UgdG8gc3lzLnN0ZG91dCBvciBzeXMuc3RkZXJyCisgICAgICAgICAgICAjIChlZy4gdGVzdF9hcmdwYXJzZSkuCisgICAgICAgICAgICBpZiBydW50ZXN0LnN0cmluZ2lvIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc3RyZWFtID0gaW8uU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIHJ1bnRlc3Quc3RyaW5naW8gPSBzdHJlYW0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RyZWFtID0gcnVudGVzdC5zdHJpbmdpbworICAgICAgICAgICAgICAgIHN0cmVhbS5zZWVrKDApCisgICAgICAgICAgICAgICAgc3RyZWFtLnRydW5jYXRlKCkKKworICAgICAgICAgICAgb3JpZ19zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBvcmlnX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3RyZWFtCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHN0cmVhbQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3RfaW5uZXIobnMsIHRlc3QsIGRpc3BsYXlfZmFpbHVyZT1GYWxzZSkKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICAgICAgICAgICAgICBvcmlnX3N0ZGVyci53cml0ZShvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgIG9yaWdfc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IG9yaWdfc3Rkb3V0CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyciA9IG9yaWdfc3RkZXJyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSBucy52ZXJib3NlICAjIFRlbGwgdGVzdHMgdG8gYmUgbW9kZXJhdGVseSBxdWlldAorICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdF9pbm5lcihucywgdGVzdCwgZGlzcGxheV9mYWlsdXJlPW5vdCBucy52ZXJib3NlKQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgZmluYWxseToKKyAgICAgICAgaWYgdXNlX3RpbWVvdXQ6CisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyKCkKKyAgICAgICAgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0LCBucy52ZXJib3NlKQorcnVudGVzdC5zdHJpbmdpbyA9IE5vbmUKKworCitkZWYgcnVudGVzdF9pbm5lcihucywgdGVzdCwgZGlzcGxheV9mYWlsdXJlPVRydWUpOgorICAgIHN1cHBvcnQudW5sb2FkKHRlc3QpCisKKyAgICB0ZXN0X3RpbWUgPSAwLjAKKyAgICByZWZsZWFrID0gRmFsc2UgICMgVHJ1ZSBpZiB0aGUgdGVzdCBsZWFrZWQgcmVmZXJlbmNlcy4KKyAgICB0cnk6CisgICAgICAgIGlmIHRlc3Quc3RhcnRzd2l0aCgndGVzdC4nKSBvciBucy50ZXN0ZGlyOgorICAgICAgICAgICAgYWJzdGVzdCA9IHRlc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQWx3YXlzIGltcG9ydCBpdCBmcm9tIHRoZSB0ZXN0IHBhY2thZ2UKKyAgICAgICAgICAgIGFic3Rlc3QgPSAndGVzdC4nICsgdGVzdAorICAgICAgICB3aXRoIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQodGVzdCwgbnMudmVyYm9zZSwgbnMucXVpZXQsIHBnbz1ucy5wZ28pIGFzIGVudmlyb25tZW50OgorICAgICAgICAgICAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgICAgICB0aGVfbW9kdWxlID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoYWJzdGVzdCkKKyAgICAgICAgICAgICMgSWYgdGhlIHRlc3QgaGFzIGEgdGVzdF9tYWluLCB0aGF0IHdpbGwgcnVuIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgICAgIyB0ZXN0cy4gIElmIG5vdCwgdXNlIG5vcm1hbCB1bml0dGVzdCB0ZXN0IGxvYWRpbmcuCisgICAgICAgICAgICB0ZXN0X3J1bm5lciA9IGdldGF0dHIodGhlX21vZHVsZSwgInRlc3RfbWFpbiIsIE5vbmUpCisgICAgICAgICAgICBpZiB0ZXN0X3J1bm5lciBpcyBOb25lOgorICAgICAgICAgICAgICAgIGRlZiB0ZXN0X3J1bm5lcigpOgorICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgdGVzdHMgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZSh0aGVfbW9kdWxlKQorICAgICAgICAgICAgICAgICAgICBmb3IgZXJyb3IgaW4gbG9hZGVyLmVycm9yczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGVycm9yLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICAgICAgICAgIGlmIGxvYWRlci5lcnJvcnM6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oImVycm9ycyB3aGlsZSBsb2FkaW5nIHRlc3RzIikKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QodGVzdHMpCisgICAgICAgICAgICB0ZXN0X3J1bm5lcigpCisgICAgICAgICAgICBpZiBucy5odW50cmxlYWtzOgorICAgICAgICAgICAgICAgIHJlZmxlYWsgPSBkYXNoX1IodGhlX21vZHVsZSwgdGVzdCwgdGVzdF9ydW5uZXIsIG5zLmh1bnRybGVha3MpCisgICAgICAgICAgICB0ZXN0X3RpbWUgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUKKyAgICBleGNlcHQgc3VwcG9ydC5SZXNvdXJjZURlbmllZCBhcyBtc2c6CisgICAgICAgIGlmIG5vdCBucy5xdWlldCBhbmQgbm90IG5zLnBnbzoKKyAgICAgICAgICAgIHByaW50KHRlc3QsICJza2lwcGVkIC0tIiwgbXNnLCBmbHVzaD1UcnVlKQorICAgICAgICByZXR1cm4gUkVTT1VSQ0VfREVOSUVELCB0ZXN0X3RpbWUKKyAgICBleGNlcHQgdW5pdHRlc3QuU2tpcFRlc3QgYXMgbXNnOgorICAgICAgICBpZiBub3QgbnMucXVpZXQgYW5kIG5vdCBucy5wZ286CisgICAgICAgICAgICBwcmludCh0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZywgZmx1c2g9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIFNLSVBQRUQsIHRlc3RfdGltZQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcmFpc2UKKyAgICBleGNlcHQgc3VwcG9ydC5UZXN0RmFpbGVkIGFzIG1zZzoKKyAgICAgICAgaWYgbm90IG5zLnBnbzoKKyAgICAgICAgICAgIGlmIGRpc3BsYXlfZmFpbHVyZToKKyAgICAgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJmYWlsZWQgLS0iLCBtc2csIGZpbGU9c3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICBmbHVzaD1UcnVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJmYWlsZWQiLCBmaWxlPXN5cy5zdGRlcnIsIGZsdXNoPVRydWUpCisgICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQorICAgIGV4Y2VwdDoKKyAgICAgICAgbXNnID0gdHJhY2ViYWNrLmZvcm1hdF9leGMoKQorICAgICAgICBpZiBub3QgbnMucGdvOgorICAgICAgICAgICAgcHJpbnQoInRlc3QiLCB0ZXN0LCAiY3Jhc2hlZCAtLSIsIG1zZywgZmlsZT1zeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICAgZmx1c2g9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgZWxzZToKKyAgICAgICAgaWYgcmVmbGVhazoKKyAgICAgICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQorICAgICAgICBpZiBlbnZpcm9ubWVudC5jaGFuZ2VkOgorICAgICAgICAgICAgcmV0dXJuIEVOVl9DSEFOR0VELCB0ZXN0X3RpbWUKKyAgICAgICAgcmV0dXJuIFBBU1NFRCwgdGVzdF90aW1lCisKKworZGVmIGNsZWFudXBfdGVzdF9kcm9wcGluZ3ModGVzdG5hbWUsIHZlcmJvc2UpOgorICAgIGltcG9ydCBzaHV0aWwKKyAgICBpbXBvcnQgc3RhdAorICAgIGltcG9ydCBnYworCisgICAgIyBGaXJzdCBraWxsIGFueSBkYW5nbGluZyByZWZlcmVuY2VzIHRvIG9wZW4gZmlsZXMgZXRjLgorICAgICMgVGhpcyBjYW4gYWxzbyBpc3N1ZSBzb21lIFJlc291cmNlV2FybmluZ3Mgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGdldAorICAgICMgdHJpZ2dlcmVkIGR1cmluZyB0aGUgZm9sbG93aW5nIHRlc3QgcnVuLCBhbmQgcG9zc2libHkgcHJvZHVjZSBmYWlsdXJlcy4KKyAgICBnYy5jb2xsZWN0KCkKKworICAgICMgVHJ5IHRvIGNsZWFuIHVwIGp1bmsgY29tbW9ubHkgbGVmdCBiZWhpbmQuICBXaGlsZSB0ZXN0cyBzaG91bGRuJ3QgbGVhdmUKKyAgICAjIGFueSBmaWxlcyBvciBkaXJlY3RvcmllcyBiZWhpbmQsIHdoZW4gYSB0ZXN0IGZhaWxzIHRoYXQgY2FuIGJlIHRlZGlvdXMKKyAgICAjIGZvciBpdCB0byBhcnJhbmdlLiAgVGhlIGNvbnNlcXVlbmNlcyBjYW4gYmUgZXNwZWNpYWxseSBuYXN0eSBvbiBXaW5kb3dzLAorICAgICMgc2luY2UgaWYgYSB0ZXN0IGxlYXZlcyBhIGZpbGUgb3BlbiwgaXQgY2Fubm90IGJlIGRlbGV0ZWQgYnkgbmFtZSAod2hpbGUKKyAgICAjIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCBoZXJlIGVpdGhlciwgd2UgY2FuIGRpc3BsYXkgdGhlCisgICAgIyBuYW1lIG9mIHRoZSBvZmZlbmRpbmcgdGVzdCwgd2hpY2ggaXMgYSByZWFsIGhlbHApLgorICAgIGZvciBuYW1lIGluIChzdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgImRiX2hvbWUiLAorICAgICAgICAgICAgICAgICk6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhuYW1lKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihuYW1lKToKKyAgICAgICAgICAgIGtpbmQsIG51a2VyID0gImRpcmVjdG9yeSIsIHNodXRpbC5ybXRyZWUKKyAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShuYW1lKToKKyAgICAgICAgICAgIGtpbmQsIG51a2VyID0gImZpbGUiLCBvcy51bmxpbmsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUVycm9yKCJvcy5wYXRoIHNheXMgJXIgZXhpc3RzIGJ1dCBpcyBuZWl0aGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3Rvcnkgbm9yIGZpbGUiICUgbmFtZSkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIiVyIGxlZnQgYmVoaW5kICVzICVyIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBjaG1vZCwgZml4IHBvc3NpYmxlIHBlcm1pc3Npb25zIHByb2JsZW1zCisgICAgICAgICAgICAjIHRoYXQgbWlnaHQgcHJldmVudCBjbGVhbnVwCisgICAgICAgICAgICBpZiAoaGFzYXR0cihvcywgJ2NobW9kJykpOgorICAgICAgICAgICAgICAgIG9zLmNobW9kKG5hbWUsIHN0YXQuU19JUldYVSB8IHN0YXQuU19JUldYRyB8IHN0YXQuU19JUldYTykKKyAgICAgICAgICAgIG51a2VyKG5hbWUpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgbXNnOgorICAgICAgICAgICAgcHJpbnQoKCIlciBsZWZ0IGJlaGluZCAlcyAlciBhbmQgaXQgY291bGRuJ3QgYmUgIgorICAgICAgICAgICAgICAgICJyZW1vdmVkOiAlcyIgJSAodGVzdG5hbWUsIGtpbmQsIG5hbWUsIG1zZykpLCBmaWxlPXN5cy5zdGRlcnIpCisKKworZGVmIGZpbmR0ZXN0ZGlyKHBhdGg9Tm9uZSk6CisgICAgcmV0dXJuIHBhdGggb3Igb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpIG9yIG9zLmN1cmRpcgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdF9tcC5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3RfbXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwNGMxNgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3RfbXAucHkKQEAgLTAsMCArMSwyNDUgQEAKK2ltcG9ydCBmYXVsdGhhbmRsZXIKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCBxdWV1ZQoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB0eXBlcworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHByaW50KCJNdWx0aXByb2Nlc3Mgb3B0aW9uIHJlcXVpcmVzIHRocmVhZCBzdXBwb3J0IikKKyAgICBzeXMuZXhpdCgyKQorCitmcm9tIHRlc3QubGlicmVncnRlc3QucnVudGVzdCBpbXBvcnQgKAorICAgIHJ1bnRlc3QsIElOVEVSUlVQVEVELCBDSElMRF9FUlJPUiwgUFJPR1JFU1NfTUlOX1RJTUUsCisgICAgZm9ybWF0X3Rlc3RfcmVzdWx0KQorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnNldHVwIGltcG9ydCBzZXR1cF90ZXN0cworCisKKyMgRGlzcGxheSB0aGUgcnVubmluZyB0ZXN0cyBpZiBub3RoaW5nIGhhcHBlbmVkIGxhc3QgTiBzZWNvbmRzCitQUk9HUkVTU19VUERBVEUgPSAzMC4wICAgIyBzZWNvbmRzCisKKyMgSWYgaW50ZXJydXB0ZWQsIGRpc3BsYXkgdGhlIHdhaXQgcHJvZ3Jlc3MgZXZlcnkgTiBzZWNvbmRzCitXQUlUX1BST0dSRVNTID0gMi4wICAgIyBzZWNvbmRzCisKKworZGVmIHJ1bl90ZXN0X2luX3N1YnByb2Nlc3ModGVzdG5hbWUsIG5zKToKKyAgICAiIiJSdW4gdGhlIGdpdmVuIHRlc3QgaW4gYSBzdWJwcm9jZXNzIHdpdGggLS1zbGF2ZWFyZ3MuCisKKyAgICBucyBpcyB0aGUgb3B0aW9uIE5hbWVzcGFjZSBwYXJzZWQgZnJvbSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiByZWdydGVzdAorICAgIGlzIGludm9rZWQgaW4gYSBzdWJwcm9jZXNzIHdpdGggdGhlIC0tc2xhdmVhcmdzIGFyZ3VtZW50OyB3aGVuIHRoZQorICAgIHN1YnByb2Nlc3MgZXhpdHMsIGl0cyByZXR1cm4gY29kZSwgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIHJldHVybmVkIGFzIGEKKyAgICAzLXR1cGxlLgorICAgICIiIgorICAgIGZyb20gc3VicHJvY2VzcyBpbXBvcnQgUG9wZW4sIFBJUEUKKworICAgIG5zX2RpY3QgPSB2YXJzKG5zKQorICAgIHNsYXZlYXJncyA9IChuc19kaWN0LCB0ZXN0bmFtZSkKKyAgICBzbGF2ZWFyZ3MgPSBqc29uLmR1bXBzKHNsYXZlYXJncykKKworICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgKnN1cHBvcnQuYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCksCisgICAgICAgICAgICctWCcsICdmYXVsdGhhbmRsZXInLAorICAgICAgICAgICAnLW0nLCAndGVzdC5yZWdydGVzdCcsCisgICAgICAgICAgICctLXNsYXZlYXJncycsIHNsYXZlYXJnc10KKyAgICBpZiBucy5wZ286CisgICAgICAgIGNtZCArPSBbJy0tcGdvJ10KKworICAgICMgUnVubmluZyB0aGUgY2hpbGQgZnJvbSB0aGUgc2FtZSB3b3JraW5nIGRpcmVjdG9yeSBhcyByZWdydGVzdCdzIG9yaWdpbmFsCisgICAgIyBpbnZvY2F0aW9uIGVuc3VyZXMgdGhhdCBURU1QRElSIGZvciB0aGUgY2hpbGQgaXMgdGhlIHNhbWUgd2hlbgorICAgICMgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpIGlzIHRydWUuIFNlZSBpc3N1ZSAxNTMwMC4KKyAgICBwb3BlbiA9IFBvcGVuKGNtZCwKKyAgICAgICAgICAgICAgICAgIHN0ZG91dD1QSVBFLCBzdGRlcnI9UElQRSwKKyAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAorICAgICAgICAgICAgICAgICAgY2xvc2VfZmRzPShvcy5uYW1lICE9ICdudCcpLAorICAgICAgICAgICAgICAgICAgY3dkPXN1cHBvcnQuU0FWRURDV0QpCisgICAgd2l0aCBwb3BlbjoKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwb3Blbi5jb21tdW5pY2F0ZSgpCisgICAgICAgIHJldGNvZGUgPSBwb3Blbi53YWl0KCkKKyAgICByZXR1cm4gcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIKKworCitkZWYgcnVuX3Rlc3RzX3NsYXZlKHNsYXZlYXJncyk6CisgICAgbnNfZGljdCwgdGVzdG5hbWUgPSBqc29uLmxvYWRzKHNsYXZlYXJncykKKyAgICBucyA9IHR5cGVzLlNpbXBsZU5hbWVzcGFjZSgqKm5zX2RpY3QpCisKKyAgICBzZXR1cF90ZXN0cyhucykKKworICAgIHRyeToKKyAgICAgICAgcmVzdWx0ID0gcnVudGVzdChucywgdGVzdG5hbWUpCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICByZXN1bHQgPSBJTlRFUlJVUFRFRCwgJycKKyAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgcmVzdWx0ID0gQ0hJTERfRVJST1IsIHN0cihlKQorCisgICAgcHJpbnQoKSAgICMgRm9yY2UgYSBuZXdsaW5lIChqdXN0IGluIGNhc2UpCisgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQpLCBmbHVzaD1UcnVlKQorICAgIHN5cy5leGl0KDApCisKKworIyBXZSBkbyBub3QgdXNlIGEgZ2VuZXJhdG9yIHNvIG11bHRpcGxlIHRocmVhZHMgY2FuIGNhbGwgbmV4dCgpLgorY2xhc3MgTXVsdGlwcm9jZXNzSXRlcmF0b3I6CisKKyAgICAiIiJBIHRocmVhZC1zYWZlIGl0ZXJhdG9yIG92ZXIgdGVzdHMgZm9yIG11bHRpcHJvY2VzcyBtb2RlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RzKToKKyAgICAgICAgc2VsZi5pbnRlcnJ1cHRlZCA9IEZhbHNlCisgICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKyAgICAgICAgc2VsZi50ZXN0cyA9IHRlc3RzCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5sb2NrOgorICAgICAgICAgICAgaWYgc2VsZi5pbnRlcnJ1cHRlZDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCd0ZXN0cyBpbnRlcnJ1cHRlZCcpCisgICAgICAgICAgICByZXR1cm4gbmV4dChzZWxmLnRlc3RzKQorCisKK2NsYXNzIE11bHRpcHJvY2Vzc1RocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGVuZGluZywgb3V0cHV0LCBucyk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18oKQorICAgICAgICBzZWxmLnBlbmRpbmcgPSBwZW5kaW5nCisgICAgICAgIHNlbGYub3V0cHV0ID0gb3V0cHV0CisgICAgICAgIHNlbGYubnMgPSBucworICAgICAgICBzZWxmLmN1cnJlbnRfdGVzdCA9IE5vbmUKKyAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQorCisgICAgZGVmIF9ydW50ZXN0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0ID0gbmV4dChzZWxmLnBlbmRpbmcpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zdGFydF90aW1lID0gdGltZS5tb25vdG9uaWMoKQorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Rlc3QgPSB0ZXN0CisKKyAgICAgICAgICAgIHJldGNvZGUsIHN0ZG91dCwgc3RkZXJyID0gcnVuX3Rlc3RfaW5fc3VicHJvY2Vzcyh0ZXN0LCBzZWxmLm5zKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Rlc3QgPSBOb25lCisKKyAgICAgICAgc3Rkb3V0LCBfLCByZXN1bHQgPSBzdGRvdXQuc3RyaXAoKS5ycGFydGl0aW9uKCJcbiIpCisgICAgICAgIGlmIHJldGNvZGUgIT0gMDoKKyAgICAgICAgICAgIHJlc3VsdCA9IChDSElMRF9FUlJPUiwgIkV4aXQgY29kZSAlcyIgJSByZXRjb2RlKQorICAgICAgICAgICAgc2VsZi5vdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgaWYgbm90IHJlc3VsdDoKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHJlc3VsdCA9IGpzb24ubG9hZHMocmVzdWx0KQorICAgICAgICBzZWxmLm91dHB1dC5wdXQoKHRlc3QsIHN0ZG91dC5yc3RyaXAoKSwgc3RkZXJyLnJzdHJpcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3RvcCA9IEZhbHNlCisgICAgICAgICAgICB3aGlsZSBub3Qgc3RvcDoKKyAgICAgICAgICAgICAgICBzdG9wID0gc2VsZi5fcnVudGVzdCgpCisgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgIHJhaXNlCisKKworZGVmIHJ1bl90ZXN0c19tdWx0aXByb2Nlc3MocmVncnRlc3QpOgorICAgIG91dHB1dCA9IHF1ZXVlLlF1ZXVlKCkKKyAgICBwZW5kaW5nID0gTXVsdGlwcm9jZXNzSXRlcmF0b3IocmVncnRlc3QudGVzdHMpCisgICAgdGVzdF90aW1lb3V0ID0gcmVncnRlc3QubnMudGltZW91dAorICAgIHVzZV90aW1lb3V0ID0gKHRlc3RfdGltZW91dCBpcyBub3QgTm9uZSkKKworICAgIHdvcmtlcnMgPSBbTXVsdGlwcm9jZXNzVGhyZWFkKHBlbmRpbmcsIG91dHB1dCwgcmVncnRlc3QubnMpCisgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShyZWdydGVzdC5ucy51c2VfbXApXQorICAgIHByaW50KCJSdW4gdGVzdHMgaW4gcGFyYWxsZWwgdXNpbmcgJXMgY2hpbGQgcHJvY2Vzc2VzIgorICAgICAgICAgICUgbGVuKHdvcmtlcnMpKQorICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKKyAgICAgICAgd29ya2VyLnN0YXJ0KCkKKworICAgIGRlZiBnZXRfcnVubmluZyh3b3JrZXJzKToKKyAgICAgICAgcnVubmluZyA9IFtdCisgICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKKyAgICAgICAgICAgIGN1cnJlbnRfdGVzdCA9IHdvcmtlci5jdXJyZW50X3Rlc3QKKyAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50X3Rlc3Q6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGR0ID0gdGltZS5tb25vdG9uaWMoKSAtIHdvcmtlci5zdGFydF90aW1lCisgICAgICAgICAgICBpZiBkdCA+PSBQUk9HUkVTU19NSU5fVElNRToKKyAgICAgICAgICAgICAgICBydW5uaW5nLmFwcGVuZCgnJXMgKCUuMGYgc2VjKScgJSAoY3VycmVudF90ZXN0LCBkdCkpCisgICAgICAgIHJldHVybiBydW5uaW5nCisKKyAgICBmaW5pc2hlZCA9IDAKKyAgICB0ZXN0X2luZGV4ID0gMQorICAgIGdldF90aW1lb3V0ID0gbWF4KFBST0dSRVNTX1VQREFURSwgUFJPR1JFU1NfTUlOX1RJTUUpCisgICAgdHJ5OgorICAgICAgICB3aGlsZSBmaW5pc2hlZCA8IHJlZ3J0ZXN0Lm5zLnVzZV9tcDoKKyAgICAgICAgICAgIGlmIHVzZV90aW1lb3V0OgorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcih0ZXN0X3RpbWVvdXQsIGV4aXQ9VHJ1ZSkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGl0ZW0gPSBvdXRwdXQuZ2V0KHRpbWVvdXQ9Z2V0X3RpbWVvdXQpCisgICAgICAgICAgICBleGNlcHQgcXVldWUuRW1wdHk6CisgICAgICAgICAgICAgICAgcnVubmluZyA9IGdldF9ydW5uaW5nKHdvcmtlcnMpCisgICAgICAgICAgICAgICAgaWYgcnVubmluZyBhbmQgbm90IHJlZ3J0ZXN0Lm5zLnBnbzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ3J1bm5pbmc6ICVzJyAlICcsICcuam9pbihydW5uaW5nKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB0ZXN0LCBzdGRvdXQsIHN0ZGVyciwgcmVzdWx0ID0gaXRlbQorICAgICAgICAgICAgaWYgdGVzdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGZpbmlzaGVkICs9IDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcmVncnRlc3QuYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQorCisgICAgICAgICAgICAjIERpc3BsYXkgcHJvZ3Jlc3MKKyAgICAgICAgICAgIG9rLCB0ZXN0X3RpbWUgPSByZXN1bHQKKyAgICAgICAgICAgIHRleHQgPSBmb3JtYXRfdGVzdF9yZXN1bHQodGVzdCwgb2spCisgICAgICAgICAgICBpZiAob2sgbm90IGluIChDSElMRF9FUlJPUiwgSU5URVJSVVBURUQpCisgICAgICAgICAgICAgICAgYW5kIHRlc3RfdGltZSA+PSBQUk9HUkVTU19NSU5fVElNRQorICAgICAgICAgICAgICAgIGFuZCBub3QgcmVncnRlc3QubnMucGdvKToKKyAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgKCUuMGYgc2VjKScgJSB0ZXN0X3RpbWUKKyAgICAgICAgICAgIHJ1bm5pbmcgPSBnZXRfcnVubmluZyh3b3JrZXJzKQorICAgICAgICAgICAgaWYgcnVubmluZyBhbmQgbm90IHJlZ3J0ZXN0Lm5zLnBnbzoKKyAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgLS0gcnVubmluZzogJXMnICUgJywgJy5qb2luKHJ1bm5pbmcpCisgICAgICAgICAgICByZWdydGVzdC5kaXNwbGF5X3Byb2dyZXNzKHRlc3RfaW5kZXgsIHRleHQpCisKKyAgICAgICAgICAgICMgQ29weSBzdGRvdXQgYW5kIHN0ZGVyciBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzCisgICAgICAgICAgICBpZiBzdGRvdXQ6CisgICAgICAgICAgICAgICAgcHJpbnQoc3Rkb3V0LCBmbHVzaD1UcnVlKQorICAgICAgICAgICAgaWYgc3RkZXJyIGFuZCBub3QgcmVncnRlc3QubnMucGdvOgorICAgICAgICAgICAgICAgIHByaW50KHN0ZGVyciwgZmlsZT1zeXMuc3RkZXJyLCBmbHVzaD1UcnVlKQorCisgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gSU5URVJSVVBURUQ6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKyAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBDSElMRF9FUlJPUjoKKyAgICAgICAgICAgICAgICBtc2cgPSAiQ2hpbGQgZXJyb3Igb24ge306IHt9Ii5mb3JtYXQodGVzdCwgcmVzdWx0WzFdKQorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihtc2cpCisgICAgICAgICAgICB0ZXN0X2luZGV4ICs9IDEKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHJlZ3J0ZXN0LmludGVycnVwdGVkID0gVHJ1ZQorICAgICAgICBwZW5kaW5nLmludGVycnVwdGVkID0gVHJ1ZQorICAgICAgICBwcmludCgpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdXNlX3RpbWVvdXQ6CisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyKCkKKworICAgICMgSWYgdGVzdHMgYXJlIGludGVycnVwdGVkLCB3YWl0IHVudGlsIHRlc3RzIGNvbXBsZXRlCisgICAgd2FpdF9zdGFydCA9IHRpbWUubW9ub3RvbmljKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBydW5uaW5nID0gW3dvcmtlci5jdXJyZW50X3Rlc3QgZm9yIHdvcmtlciBpbiB3b3JrZXJzXQorICAgICAgICBydW5uaW5nID0gbGlzdChmaWx0ZXIoYm9vbCwgcnVubmluZykpCisgICAgICAgIGlmIG5vdCBydW5uaW5nOgorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBkdCA9IHRpbWUubW9ub3RvbmljKCkgLSB3YWl0X3N0YXJ0CisgICAgICAgIGxpbmUgPSAiV2FpdGluZyBmb3IgJXMgKCVzIHRlc3RzKSIgJSAoJywgJy5qb2luKHJ1bm5pbmcpLCBsZW4ocnVubmluZykpCisgICAgICAgIGlmIGR0ID49IFdBSVRfUFJPR1JFU1M6CisgICAgICAgICAgICBsaW5lID0gIiVzIHNpbmNlICUuMGYgc2VjIiAlIChsaW5lLCBkdCkKKyAgICAgICAgcHJpbnQobGluZSkKKyAgICAgICAgZm9yIHdvcmtlciBpbiB3b3JrZXJzOgorICAgICAgICAgICAgd29ya2VyLmpvaW4oV0FJVF9QUk9HUkVTUykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NhdmVfZW52LnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2F2ZV9lbnYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmYmMxNAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NhdmVfZW52LnB5CkBAIC0wLDAgKzEsMjg1IEBACitpbXBvcnQgYnVpbHRpbnMKK2ltcG9ydCBsb2NhbGUKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzeXMKK2ltcG9ydCBzeXNjb25maWcKK2ltcG9ydCB3YXJuaW5ncworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKK3RyeToKKyAgICBpbXBvcnQgX211bHRpcHJvY2Vzc2luZywgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBtdWx0aXByb2Nlc3NpbmcgPSBOb25lCisKKworIyBVbml0IHRlc3RzIGFyZSBzdXBwb3NlZCB0byBsZWF2ZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IHVuY2hhbmdlZAorIyBvbmNlIHRoZXkgY29tcGxldGUuICBCdXQgc29tZXRpbWVzIHRlc3RzIGhhdmUgYnVncywgZXNwZWNpYWxseSB3aGVuCisjIHRlc3RzIGZhaWwsIGFuZCB0aGUgY2hhbmdlcyB0byBlbnZpcm9ubWVudCBnbyBvbiB0byBtZXNzIHVwIG90aGVyCisjIHRlc3RzLiAgVGhpcyBjYW4gY2F1c2UgaXNzdWVzIHdpdGggYnVpbGRib3Qgc3RhYmlsaXR5LCBzaW5jZSB0ZXN0cworIyBhcmUgcnVuIGluIHJhbmRvbSBvcmRlciBhbmQgc28gcHJvYmxlbXMgbWF5IGFwcGVhciB0byBjb21lIGFuZCBnby4KKyMgVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB3ZSBjYW4gc2F2ZSBhbmQgcmVzdG9yZSB0byBtaXRpZ2F0ZSB0aGlzLCBhbmQKKyMgdGhlIGZvbGxvd2luZyBjb250ZXh0IG1hbmFnZXIgaGFuZGxlcyB0aGlzIHRhc2suCisKK2NsYXNzIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQ6CisgICAgIiIiU2F2ZSBiaXRzIG9mIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCByZXN0b3JlIHRoZW0gYXQgYmxvY2sgZXhpdC4KKworICAgICAgICB3aXRoIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQodGVzdG5hbWUsIHZlcmJvc2UsIHF1aWV0KToKKyAgICAgICAgICAgICNzdHVmZgorCisgICAgVW5sZXNzIHF1aWV0IGlzIFRydWUsIGEgd2FybmluZyBpcyBwcmludGVkIHRvIHN0ZGVyciBpZiBhbnkgb2YKKyAgICB0aGUgc2F2ZWQgaXRlbXMgd2FzIGNoYW5nZWQgYnkgdGhlIHRlc3QuICBUaGUgYXR0cmlidXRlICdjaGFuZ2VkJworICAgIGlzIGluaXRpYWxseSBGYWxzZSwgYnV0IGlzIHNldCB0byBUcnVlIGlmIGEgY2hhbmdlIGlzIGRldGVjdGVkLgorCisgICAgSWYgdmVyYm9zZSBpcyBtb3JlIHRoYW4gMSwgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgc3RhdGUgb2YgY2hhbmdlZAorICAgIGl0ZW1zIGlzIGFsc28gcHJpbnRlZC4KKyAgICAiIiIKKworICAgIGNoYW5nZWQgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RuYW1lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLCAqLCBwZ289RmFsc2UpOgorICAgICAgICBzZWxmLnRlc3RuYW1lID0gdGVzdG5hbWUKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLnF1aWV0ID0gcXVpZXQKKyAgICAgICAgc2VsZi5wZ28gPSBwZ28KKworICAgICMgVG8gYWRkIHRoaW5ncyB0byBzYXZlIGFuZCByZXN0b3JlLCBhZGQgYSBuYW1lIFhYWCB0byB0aGUgcmVzb3VyY2VzIGxpc3QKKyAgICAjIGFuZCBhZGQgY29ycmVzcG9uZGluZyBnZXRfWFhYL3Jlc3RvcmVfWFhYIGZ1bmN0aW9ucy4gIGdldF9YWFggc2hvdWxkCisgICAgIyByZXR1cm4gdGhlIHZhbHVlIHRvIGJlIHNhdmVkIGFuZCBjb21wYXJlZCBhZ2FpbnN0IGEgc2Vjb25kIGNhbGwgdG8gdGhlCisgICAgIyBnZXQgZnVuY3Rpb24gd2hlbiB0ZXN0IGV4ZWN1dGlvbiBjb21wbGV0ZXMuICByZXN0b3JlX1hYWCBzaG91bGQgYWNjZXB0CisgICAgIyB0aGUgc2F2ZWQgdmFsdWUgYW5kIHJlc3RvcmUgdGhlIHJlc291cmNlIHVzaW5nIGl0LiAgSXQgd2lsbCBiZSBjYWxsZWQgaWYKKyAgICAjIGFuZCBvbmx5IGlmIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSBpcyBkZXRlY3RlZC4KKyAgICAjCisgICAgIyBOb3RlOiBYWFggd2lsbCBoYXZlIGFueSAnLicgcmVwbGFjZWQgd2l0aCAnXycgY2hhcmFjdGVycyB3aGVuIGRldGVybWluaW5nCisgICAgIyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgbmFtZXMuCisKKyAgICByZXNvdXJjZXMgPSAoJ3N5cy5hcmd2JywgJ2N3ZCcsICdzeXMuc3RkaW4nLCAnc3lzLnN0ZG91dCcsICdzeXMuc3RkZXJyJywKKyAgICAgICAgICAgICAgICAgJ29zLmVudmlyb24nLCAnc3lzLnBhdGgnLCAnc3lzLnBhdGhfaG9va3MnLCAnX19pbXBvcnRfXycsCisgICAgICAgICAgICAgICAgICd3YXJuaW5ncy5maWx0ZXJzJywgJ2FzeW5jb3JlLnNvY2tldF9tYXAnLAorICAgICAgICAgICAgICAgICAnbG9nZ2luZy5faGFuZGxlcnMnLCAnbG9nZ2luZy5faGFuZGxlckxpc3QnLCAnc3lzLmdldHRyYWNlJywKKyAgICAgICAgICAgICAgICAgJ3N5cy53YXJub3B0aW9ucycsCisgICAgICAgICAgICAgICAgICMgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2NsZWFudXAoKSBtYXkgcmVsZWFzZSByZWYKKyAgICAgICAgICAgICAgICAgIyB0byBhIHRocmVhZCwgc28gY2hlY2sgcHJvY2Vzc2VzIGZpcnN0LgorICAgICAgICAgICAgICAgICAnbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2RhbmdsaW5nJywgJ3RocmVhZGluZy5fZGFuZ2xpbmcnLAorICAgICAgICAgICAgICAgICAnc3lzY29uZmlnLl9DT05GSUdfVkFSUycsICdzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUycsCisgICAgICAgICAgICAgICAgICdmaWxlcycsICdsb2NhbGUnLCAnd2FybmluZ3Muc2hvd3dhcm5pbmcnLAorICAgICAgICAgICAgICAgICAnc2h1dGlsX2FyY2hpdmVfZm9ybWF0cycsICdzaHV0aWxfdW5wYWNrX2Zvcm1hdHMnLAorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBnZXRfc3lzX2FyZ3Yoc2VsZik6CisgICAgICAgIHJldHVybiBpZChzeXMuYXJndiksIHN5cy5hcmd2LCBzeXMuYXJndls6XQorICAgIGRlZiByZXN0b3JlX3N5c19hcmd2KHNlbGYsIHNhdmVkX2FyZ3YpOgorICAgICAgICBzeXMuYXJndiA9IHNhdmVkX2FyZ3ZbMV0KKyAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlZF9hcmd2WzJdCisKKyAgICBkZWYgZ2V0X2N3ZChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLmdldGN3ZCgpCisgICAgZGVmIHJlc3RvcmVfY3dkKHNlbGYsIHNhdmVkX2N3ZCk6CisgICAgICAgIG9zLmNoZGlyKHNhdmVkX2N3ZCkKKworICAgIGRlZiBnZXRfc3lzX3N0ZG91dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRvdXQKKyAgICBkZWYgcmVzdG9yZV9zeXNfc3Rkb3V0KHNlbGYsIHNhdmVkX3N0ZG91dCk6CisgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlZF9zdGRvdXQKKworICAgIGRlZiBnZXRfc3lzX3N0ZGVycihzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRlcnIKKyAgICBkZWYgcmVzdG9yZV9zeXNfc3RkZXJyKHNlbGYsIHNhdmVkX3N0ZGVycik6CisgICAgICAgIHN5cy5zdGRlcnIgPSBzYXZlZF9zdGRlcnIKKworICAgIGRlZiBnZXRfc3lzX3N0ZGluKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGluCisgICAgZGVmIHJlc3RvcmVfc3lzX3N0ZGluKHNlbGYsIHNhdmVkX3N0ZGluKToKKyAgICAgICAgc3lzLnN0ZGluID0gc2F2ZWRfc3RkaW4KKworICAgIGRlZiBnZXRfb3NfZW52aXJvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKG9zLmVudmlyb24pLCBvcy5lbnZpcm9uLCBkaWN0KG9zLmVudmlyb24pCisgICAgZGVmIHJlc3RvcmVfb3NfZW52aXJvbihzZWxmLCBzYXZlZF9lbnZpcm9uKToKKyAgICAgICAgb3MuZW52aXJvbiA9IHNhdmVkX2Vudmlyb25bMV0KKyAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCisgICAgICAgIG9zLmVudmlyb24udXBkYXRlKHNhdmVkX2Vudmlyb25bMl0pCisKKyAgICBkZWYgZ2V0X3N5c19wYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGgpLCBzeXMucGF0aCwgc3lzLnBhdGhbOl0KKyAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aChzZWxmLCBzYXZlZF9wYXRoKToKKyAgICAgICAgc3lzLnBhdGggPSBzYXZlZF9wYXRoWzFdCisgICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZWRfcGF0aFsyXQorCisgICAgZGVmIGdldF9zeXNfcGF0aF9ob29rcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHN5cy5wYXRoX2hvb2tzKSwgc3lzLnBhdGhfaG9va3MsIHN5cy5wYXRoX2hvb2tzWzpdCisgICAgZGVmIHJlc3RvcmVfc3lzX3BhdGhfaG9va3Moc2VsZiwgc2F2ZWRfaG9va3MpOgorICAgICAgICBzeXMucGF0aF9ob29rcyA9IHNhdmVkX2hvb2tzWzFdCisgICAgICAgIHN5cy5wYXRoX2hvb2tzWzpdID0gc2F2ZWRfaG9va3NbMl0KKworICAgIGRlZiBnZXRfc3lzX2dldHRyYWNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLmdldHRyYWNlKCkKKyAgICBkZWYgcmVzdG9yZV9zeXNfZ2V0dHJhY2Uoc2VsZiwgdHJhY2VfZnhuKToKKyAgICAgICAgc3lzLnNldHRyYWNlKHRyYWNlX2Z4bikKKworICAgIGRlZiBnZXRfX19pbXBvcnRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGJ1aWx0aW5zLl9faW1wb3J0X18KKyAgICBkZWYgcmVzdG9yZV9fX2ltcG9ydF9fKHNlbGYsIGltcG9ydF8pOgorICAgICAgICBidWlsdGlucy5fX2ltcG9ydF9fID0gaW1wb3J0XworCisgICAgZGVmIGdldF93YXJuaW5nc19maWx0ZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQod2FybmluZ3MuZmlsdGVycyksIHdhcm5pbmdzLmZpbHRlcnMsIHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19maWx0ZXJzKHNlbGYsIHNhdmVkX2ZpbHRlcnMpOgorICAgICAgICB3YXJuaW5ncy5maWx0ZXJzID0gc2F2ZWRfZmlsdGVyc1sxXQorICAgICAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gc2F2ZWRfZmlsdGVyc1syXQorCisgICAgZGVmIGdldF9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYpOgorICAgICAgICBhc3luY29yZSA9IHN5cy5tb2R1bGVzLmdldCgnYXN5bmNvcmUnKQorICAgICAgICAjIFhYWCBNYWtpbmcgYSBjb3B5IGtlZXBzIG9iamVjdHMgYWxpdmUgdW50aWwgX19leGl0X18gZ2V0cyBjYWxsZWQuCisgICAgICAgIHJldHVybiBhc3luY29yZSBhbmQgYXN5bmNvcmUuc29ja2V0X21hcC5jb3B5KCkgb3Ige30KKyAgICBkZWYgcmVzdG9yZV9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYsIHNhdmVkX21hcCk6CisgICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCisgICAgICAgIGlmIGFzeW5jb3JlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKGlnbm9yZV9hbGw9VHJ1ZSkKKyAgICAgICAgICAgIGFzeW5jb3JlLnNvY2tldF9tYXAudXBkYXRlKHNhdmVkX21hcCkKKworICAgIGRlZiBnZXRfc2h1dGlsX2FyY2hpdmVfZm9ybWF0cyhzZWxmKToKKyAgICAgICAgIyB3ZSBjb3VsZCBjYWxsIGdldF9hcmNoaXZlc19mb3JtYXRzKCkgYnV0IHRoYXQgb25seSByZXR1cm5zIHRoZQorICAgICAgICAjIHJlZ2lzdHJ5IGtleXM7IHdlIHdhbnQgdG8gY2hlY2sgdGhlIHZhbHVlcyB0b28gKHRoZSBmdW5jdGlvbnMgdGhhdAorICAgICAgICAjIGFyZSByZWdpc3RlcmVkKQorICAgICAgICByZXR1cm4gc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMsIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX3NodXRpbF9hcmNoaXZlX2Zvcm1hdHMoc2VsZiwgc2F2ZWQpOgorICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUyA9IHNhdmVkWzBdCisgICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNsZWFyKCkKKyAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMudXBkYXRlKHNhdmVkWzFdKQorCisgICAgZGVmIGdldF9zaHV0aWxfdW5wYWNrX2Zvcm1hdHMoc2VsZik6CisgICAgICAgIHJldHVybiBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLCBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX3NodXRpbF91bnBhY2tfZm9ybWF0cyhzZWxmLCBzYXZlZCk6CisgICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMgPSBzYXZlZFswXQorICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNsZWFyKCkKKyAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUy51cGRhdGUoc2F2ZWRbMV0pCisKKyAgICBkZWYgZ2V0X2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYpOgorICAgICAgICAjIF9oYW5kbGVycyBpcyBhIFdlYWtWYWx1ZURpY3Rpb25hcnkKKyAgICAgICAgcmV0dXJuIGlkKGxvZ2dpbmcuX2hhbmRsZXJzKSwgbG9nZ2luZy5faGFuZGxlcnMsIGxvZ2dpbmcuX2hhbmRsZXJzLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYsIHNhdmVkX2hhbmRsZXJzKToKKyAgICAgICAgIyBDYW4ndCBlYXNpbHkgcmV2ZXJ0IHRoZSBsb2dnaW5nIHN0YXRlCisgICAgICAgIHBhc3MKKworICAgIGRlZiBnZXRfbG9nZ2luZ19faGFuZGxlckxpc3Qoc2VsZik6CisgICAgICAgICMgX2hhbmRsZXJMaXN0IGlzIGEgbGlzdCBvZiB3ZWFrcmVmcyB0byBoYW5kbGVycworICAgICAgICByZXR1cm4gaWQobG9nZ2luZy5faGFuZGxlckxpc3QpLCBsb2dnaW5nLl9oYW5kbGVyTGlzdCwgbG9nZ2luZy5faGFuZGxlckxpc3RbOl0KKyAgICBkZWYgcmVzdG9yZV9sb2dnaW5nX19oYW5kbGVyTGlzdChzZWxmLCBzYXZlZF9oYW5kbGVyTGlzdCk6CisgICAgICAgICMgQ2FuJ3QgZWFzaWx5IHJldmVydCB0aGUgbG9nZ2luZyBzdGF0ZQorICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2V0X3N5c193YXJub3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHN5cy53YXJub3B0aW9ucyksIHN5cy53YXJub3B0aW9ucywgc3lzLndhcm5vcHRpb25zWzpdCisgICAgZGVmIHJlc3RvcmVfc3lzX3dhcm5vcHRpb25zKHNlbGYsIHNhdmVkX29wdGlvbnMpOgorICAgICAgICBzeXMud2Fybm9wdGlvbnMgPSBzYXZlZF9vcHRpb25zWzFdCisgICAgICAgIHN5cy53YXJub3B0aW9uc1s6XSA9IHNhdmVkX29wdGlvbnNbMl0KKworICAgICMgQ29udHJvbGxpbmcgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byBUaHJlYWQgb2JqZWN0cyBjYW4gbWFrZSBpdCBlYXNpZXIKKyAgICAjIHRvIHRyYWNrIHJlZmVyZW5jZSBsZWFrcy4KKyAgICBkZWYgZ2V0X3RocmVhZGluZ19fZGFuZ2xpbmcoc2VsZik6CisgICAgICAgIGlmIG5vdCB0aHJlYWRpbmc6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAjIFRoaXMgY29waWVzIHRoZSB3ZWFrcmVmcyB3aXRob3V0IG1ha2luZyBhbnkgc3Ryb25nIHJlZmVyZW5jZQorICAgICAgICByZXR1cm4gdGhyZWFkaW5nLl9kYW5nbGluZy5jb3B5KCkKKyAgICBkZWYgcmVzdG9yZV90aHJlYWRpbmdfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKKyAgICAgICAgaWYgbm90IHRocmVhZGluZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0aHJlYWRpbmcuX2RhbmdsaW5nLmNsZWFyKCkKKyAgICAgICAgdGhyZWFkaW5nLl9kYW5nbGluZy51cGRhdGUoc2F2ZWQpCisKKyAgICAjIFNhbWUgZm9yIFByb2Nlc3Mgb2JqZWN0cworICAgIGRlZiBnZXRfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYpOgorICAgICAgICBpZiBub3QgbXVsdGlwcm9jZXNzaW5nOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgIyBVbmpvaW5lZCBwcm9jZXNzIG9iamVjdHMgY2FuIHN1cnZpdmUgYWZ0ZXIgcHJvY2VzcyBleGl0cworICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fY2xlYW51cCgpCisgICAgICAgICMgVGhpcyBjb3BpZXMgdGhlIHdlYWtyZWZzIHdpdGhvdXQgbWFraW5nIGFueSBzdHJvbmcgcmVmZXJlbmNlCisgICAgICAgIHJldHVybiBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY29weSgpCisgICAgZGVmIHJlc3RvcmVfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKKyAgICAgICAgaWYgbm90IG11bHRpcHJvY2Vzc2luZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY2xlYXIoKQorICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcudXBkYXRlKHNhdmVkKQorCisgICAgZGVmIGdldF9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgZGljdCBpcyBpbml0aWFsaXplZAorICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3ByZWZpeCcpCisgICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9DT05GSUdfVkFSUyksIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMsCisgICAgICAgICAgICAgICAgZGljdChzeXNjb25maWcuX0NPTkZJR19WQVJTKSkKKyAgICBkZWYgcmVzdG9yZV9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYsIHNhdmVkKToKKyAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUyA9IHNhdmVkWzFdCisgICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMuY2xlYXIoKQorICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTLnVwZGF0ZShzYXZlZFsyXSkKKworICAgIGRlZiBnZXRfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZik6CisgICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMpLCBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUywKKyAgICAgICAgICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy5jb3B5KCkpCisgICAgZGVmIHJlc3RvcmVfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZiwgc2F2ZWQpOgorICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUyA9IHNhdmVkWzFdCisgICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLmNsZWFyKCkKKyAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMudXBkYXRlKHNhdmVkWzJdKQorCisgICAgZGVmIGdldF9maWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNvcnRlZChmbiArICgnLycgaWYgb3MucGF0aC5pc2RpcihmbikgZWxzZSAnJykKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gb3MubGlzdGRpcigpKQorICAgIGRlZiByZXN0b3JlX2ZpbGVzKHNlbGYsIHNhdmVkX3ZhbHVlKToKKyAgICAgICAgZm4gPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBpZiBmbiBub3QgaW4gc2F2ZWRfdmFsdWUgYW5kIChmbiArICcvJykgbm90IGluIHNhdmVkX3ZhbHVlOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm4pOgorICAgICAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKGZuKQorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGZuKToKKyAgICAgICAgICAgICAgICBzdXBwb3J0LnJtdHJlZShmbikKKworICAgIF9sYyA9IFtnZXRhdHRyKGxvY2FsZSwgbGMpIGZvciBsYyBpbiBkaXIobG9jYWxlKQorICAgICAgICAgICBpZiBsYy5zdGFydHN3aXRoKCdMQ18nKV0KKyAgICBkZWYgZ2V0X2xvY2FsZShzZWxmKToKKyAgICAgICAgcGFpcmluZ3MgPSBbXQorICAgICAgICBmb3IgbGMgaW4gc2VsZi5fbGM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFpcmluZ3MuYXBwZW5kKChsYywgbG9jYWxlLnNldGxvY2FsZShsYywgTm9uZSkpKQorICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHJldHVybiBwYWlyaW5ncworICAgIGRlZiByZXN0b3JlX2xvY2FsZShzZWxmLCBzYXZlZCk6CisgICAgICAgIGZvciBsYywgc2V0dGluZyBpbiBzYXZlZDoKKyAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobGMsIHNldHRpbmcpCisKKyAgICBkZWYgZ2V0X3dhcm5pbmdzX3Nob3d3YXJuaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gd2FybmluZ3Muc2hvd3dhcm5pbmcKKyAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19zaG93d2FybmluZyhzZWxmLCBmeG4pOgorICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZyA9IGZ4bgorCisgICAgZGVmIHJlc291cmNlX2luZm8oc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIHNlbGYucmVzb3VyY2VzOgorICAgICAgICAgICAgbWV0aG9kX3N1ZmZpeCA9IG5hbWUucmVwbGFjZSgnLicsICdfJykKKyAgICAgICAgICAgIGdldF9uYW1lID0gJ2dldF8nICsgbWV0aG9kX3N1ZmZpeAorICAgICAgICAgICAgcmVzdG9yZV9uYW1lID0gJ3Jlc3RvcmVfJyArIG1ldGhvZF9zdWZmaXgKKyAgICAgICAgICAgIHlpZWxkIG5hbWUsIGdldGF0dHIoc2VsZiwgZ2V0X25hbWUpLCBnZXRhdHRyKHNlbGYsIHJlc3RvcmVfbmFtZSkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuc2F2ZWRfdmFsdWVzID0gZGljdCgobmFtZSwgZ2V0KCkpIGZvciBuYW1lLCBnZXQsIHJlc3RvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHNlbGYucmVzb3VyY2VfaW5mbygpKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgorICAgICAgICBzYXZlZF92YWx1ZXMgPSBzZWxmLnNhdmVkX3ZhbHVlcworICAgICAgICBkZWwgc2VsZi5zYXZlZF92YWx1ZXMKKyAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkgICMgU29tZSByZXNvdXJjZXMgdXNlIHdlYWsgcmVmZXJlbmNlcworICAgICAgICBmb3IgbmFtZSwgZ2V0LCByZXN0b3JlIGluIHNlbGYucmVzb3VyY2VfaW5mbygpOgorICAgICAgICAgICAgY3VycmVudCA9IGdldCgpCisgICAgICAgICAgICBvcmlnaW5hbCA9IHNhdmVkX3ZhbHVlcy5wb3AobmFtZSkKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlJ3MgdmFsdWUKKyAgICAgICAgICAgIGlmIGN1cnJlbnQgIT0gb3JpZ2luYWw6CisgICAgICAgICAgICAgICAgc2VsZi5jaGFuZ2VkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHJlc3RvcmUob3JpZ2luYWwpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucXVpZXQgYW5kIG5vdCBzZWxmLnBnbzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiJXYXJuaW5nIC0tIHtuYW1lfSB3YXMgbW9kaWZpZWQgYnkge3NlbGYudGVzdG5hbWV9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyLCBmbHVzaD1UcnVlKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiIgIEJlZm9yZToge29yaWdpbmFsfSIiXG4iZiIgIEFmdGVyOiAge2N1cnJlbnR9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIsIGZsdXNoPVRydWUpCisgICAgICAgIHJldHVybiBGYWxzZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2V0dXAucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI0NTMxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2V0dXAucHkKQEAgLTAsMCArMSwxMjEgQEAKK2ltcG9ydCBhdGV4aXQKK2ltcG9ydCBmYXVsdGhhbmRsZXIKK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgZ2MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnYyA9IE5vbmUKKworZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnJlZmxlYWsgaW1wb3J0IHdhcm1fY2FjaGVzCisKKworZGVmIHNldHVwX3Rlc3RzKG5zKToKKyAgICAjIERpc3BsYXkgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gZmF0YWwgZXJyb3JzIChlLmcuIHNlZ2ZhdWx0KQorICAgIGZhdWx0aGFuZGxlci5lbmFibGUoYWxsX3RocmVhZHM9VHJ1ZSkKKworICAgICMgRGlzcGxheSB0aGUgUHl0aG9uIHRyYWNlYmFjayBvbiBTSUdBTFJNIG9yIFNJR1VTUjEgc2lnbmFsCisgICAgc2lnbmFscyA9IFtdCisgICAgaWYgaGFzYXR0cihzaWduYWwsICdTSUdBTFJNJyk6CisgICAgICAgIHNpZ25hbHMuYXBwZW5kKHNpZ25hbC5TSUdBTFJNKQorICAgIGlmIGhhc2F0dHIoc2lnbmFsLCAnU0lHVVNSMScpOgorICAgICAgICBzaWduYWxzLmFwcGVuZChzaWduYWwuU0lHVVNSMSkKKyAgICBmb3Igc2lnbnVtIGluIHNpZ25hbHM6CisgICAgICAgIGZhdWx0aGFuZGxlci5yZWdpc3RlcihzaWdudW0sIGNoYWluPVRydWUpCisKKyAgICByZXBsYWNlX3N0ZG91dCgpCisgICAgc3VwcG9ydC5yZWNvcmRfb3JpZ2luYWxfc3Rkb3V0KHN5cy5zdGRvdXQpCisKKyAgICBpZiBucy50ZXN0ZGlyOgorICAgICAgICAjIFByZXBlbmQgdGVzdCBkaXJlY3RvcnkgdG8gc3lzLnBhdGgsIHNvIHJ1bnRlc3QoKSB3aWxsIGJlIGFibGUKKyAgICAgICAgIyB0byBsb2NhdGUgdGVzdHMKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguYWJzcGF0aChucy50ZXN0ZGlyKSkKKworICAgICMgU29tZSB0aW1lcyBfX3BhdGhfXyBhbmQgX19maWxlX18gYXJlIG5vdCBhYnNvbHV0ZSAoZS5nLiB3aGlsZSBydW5uaW5nIGZyb20KKyAgICAjIExpYi8pIGFuZCwgaWYgd2UgY2hhbmdlIHRoZSBDV0QgdG8gcnVuIHRoZSB0ZXN0cyBpbiBhIHRlbXBvcmFyeSBkaXIsIHNvbWUKKyAgICAjIGltcG9ydHMgbWlnaHQgZmFpbC4gIFRoaXMgYWZmZWN0cyBvbmx5IHRoZSBtb2R1bGVzIGltcG9ydGVkIGJlZm9yZSBvcy5jaGRpcigpLgorICAgICMgVGhlc2UgbW9kdWxlcyBhcmUgc2VhcmNoZWQgZmlyc3QgaW4gc3lzLnBhdGhbMF0gKHNvICcnIC0tIHRoZSBDV0QpIGFuZCBpZgorICAgICMgdGhleSBhcmUgZm91bmQgaW4gdGhlIENXRCB0aGVpciBfX2ZpbGVfXyBhbmQgX19wYXRoX18gd2lsbCBiZSByZWxhdGl2ZSAodGhpcworICAgICMgaGFwcGVucyBiZWZvcmUgdGhlIGNoZGlyKS4gIEFsbCB0aGUgbW9kdWxlcyBpbXBvcnRlZCBhZnRlciB0aGUgY2hkaXIsIGFyZQorICAgICMgbm90IGZvdW5kIGluIHRoZSBDV0QsIGFuZCBzaW5jZSB0aGUgb3RoZXIgcGF0aHMgaW4gc3lzLnBhdGhbMTpdIGFyZSBhYnNvbHV0ZQorICAgICMgKHNpdGUucHkgYWJzb2x1dGl6ZSB0aGVtKSwgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyB3aWxsIGJlIGFic29sdXRlIHRvby4KKyAgICAjIFRoZXJlZm9yZSBpdCBpcyBuZWNlc3NhcnkgdG8gYWJzb2x1dGl6ZSBtYW51YWxseSB0aGUgX19maWxlX18gYW5kIF9fcGF0aF9fIG9mCisgICAgIyB0aGUgcGFja2FnZXMgdG8gcHJldmVudCBsYXRlciBpbXBvcnRzIHRvIGZhaWwgd2hlbiB0aGUgQ1dEIGlzIGRpZmZlcmVudC4KKyAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgorICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CisgICAgICAgICAgICBmb3IgaW5kZXgsIHBhdGggaW4gZW51bWVyYXRlKG1vZHVsZS5fX3BhdGhfXyk6CisgICAgICAgICAgICAgICAgbW9kdWxlLl9fcGF0aF9fW2luZGV4XSA9IG9zLnBhdGguYWJzcGF0aChwYXRoKQorICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6CisgICAgICAgICAgICBtb2R1bGUuX19maWxlX18gPSBvcy5wYXRoLmFic3BhdGgobW9kdWxlLl9fZmlsZV9fKQorCisgICAgIyBNYWNPU1ggKGEuay5hLiBEYXJ3aW4pIGhhcyBhIGRlZmF1bHQgc3RhY2sgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbAorICAgICMgZm9yIGRlZXBseSByZWN1cnNpdmUgcmVndWxhciBleHByZXNzaW9ucy4gIFdlIHNlZSB0aGlzIGFzIGNyYXNoZXMgaW4KKyAgICAjIHRoZSBQeXRob24gdGVzdCBzdWl0ZSB3aGVuIHJ1bm5pbmcgdGVzdF9yZS5weSBhbmQgdGVzdF9zcmUucHkuICBUaGUKKyAgICAjIGZpeCBpcyB0byBzZXQgdGhlIHN0YWNrIGxpbWl0IHRvIDIwNDguCisgICAgIyBUaGlzIGFwcHJvYWNoIG1heSBhbHNvIGJlIHVzZWZ1bCBmb3Igb3RoZXIgVW5peHkgcGxhdGZvcm1zIHRoYXQKKyAgICAjIHN1ZmZlciBmcm9tIHNtYWxsIGRlZmF1bHQgc3RhY2sgbGltaXRzLgorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHJlc291cmNlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNvZnQsIGhhcmQgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLKQorICAgICAgICAgICAgbmV3c29mdCA9IG1pbihoYXJkLCBtYXgoc29mdCwgMTAyNCoyMDQ4KSkKKyAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfU1RBQ0ssIChuZXdzb2Z0LCBoYXJkKSkKKworICAgIGlmIG5zLmh1bnRybGVha3M6CisgICAgICAgIHVuaXR0ZXN0LkJhc2VUZXN0U3VpdGUuX2NsZWFudXAgPSBGYWxzZQorCisgICAgICAgICMgQXZvaWQgZmFsc2UgcG9zaXRpdmVzIGR1ZSB0byB2YXJpb3VzIGNhY2hlcworICAgICAgICAjIGZpbGxpbmcgc2xvd2x5IHdpdGggcmFuZG9tIGRhdGE6CisgICAgICAgIHdhcm1fY2FjaGVzKCkKKworICAgIGlmIG5zLm1lbWxpbWl0IGlzIG5vdCBOb25lOgorICAgICAgICBzdXBwb3J0LnNldF9tZW1saW1pdChucy5tZW1saW1pdCkKKworICAgIGlmIG5zLnRocmVzaG9sZCBpcyBub3QgTm9uZToKKyAgICAgICAgZ2Muc2V0X3RocmVzaG9sZChucy50aHJlc2hvbGQpCisKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBtc3ZjcnQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBtc3ZjcnQuU2V0RXJyb3JNb2RlKG1zdmNydC5TRU1fRkFJTENSSVRJQ0FMRVJST1JTfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9BTElHTk1FTlRGQVVMVEVYQ0VQVHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PR1BGQVVMVEVSUk9SQk9YfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9PUEVORklMRUVSUk9SQk9YKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAjIHJlbGVhc2UgYnVpbGQKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBtIGluIFttc3ZjcnQuQ1JUX1dBUk4sIG1zdmNydC5DUlRfRVJST1IsIG1zdmNydC5DUlRfQVNTRVJUXToKKyAgICAgICAgICAgICAgICBpZiBucy52ZXJib3NlIGFuZCBucy52ZXJib3NlID49IDI6CisgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIG1zdmNydC5DUlREQkdfTU9ERV9GSUxFKQorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0RmlsZShtLCBtc3ZjcnQuQ1JUREJHX0ZJTEVfU1RERVJSKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIDApCisKKyAgICBzdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBucy51c2VfcmVzb3VyY2VzCisKKworZGVmIHJlcGxhY2Vfc3Rkb3V0KCk6CisgICAgIiIiU2V0IHN0ZG91dCBlbmNvZGVyIGVycm9yIGhhbmRsZXIgdG8gYmFja3NsYXNocmVwbGFjZSAoYXMgc3RkZXJyIGVycm9yCisgICAgaGFuZGxlcikgdG8gYXZvaWQgVW5pY29kZUVuY29kZUVycm9yIHdoZW4gcHJpbnRpbmcgYSB0cmFjZWJhY2siIiIKKyAgICBzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgc3lzLnN0ZG91dCA9IG9wZW4oc3Rkb3V0LmZpbGVubygpLCAndycsCisgICAgICAgIGVuY29kaW5nPXN0ZG91dC5lbmNvZGluZywKKyAgICAgICAgZXJyb3JzPSJiYWNrc2xhc2hyZXBsYWNlIiwKKyAgICAgICAgY2xvc2VmZD1GYWxzZSwKKyAgICAgICAgbmV3bGluZT0nXG4nKQorCisgICAgZGVmIHJlc3RvcmVfc3Rkb3V0KCk6CisgICAgICAgIHN5cy5zdGRvdXQuY2xvc2UoKQorICAgICAgICBzeXMuc3Rkb3V0ID0gc3Rkb3V0CisgICAgYXRleGl0LnJlZ2lzdGVyKHJlc3RvcmVfc3Rkb3V0KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlzdF90ZXN0cy5weSBiL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkKaW5kZXggZjIwZmRjMC4uMjZlOTM2OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvbGlzdF90ZXN0cy5weQorKysgYi9MaWIvdGVzdC9saXN0X3Rlc3RzLnB5CkBAIC0yNjYsOSArMjY2LDIxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgbGlzdCgic3BhbWVnZ3MiKSkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuZXh0ZW5kLCBOb25lKQotCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5leHRlbmQpCiAKKyAgICAgICAgIyBvdmVyZmxvdyB0ZXN0LiBpc3N1ZTE2MjEKKyAgICAgICAgY2xhc3MgQ3VzdG9tSXRlcjoKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIF9fbmV4dF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIGRlZiBfX2xlbmd0aF9oaW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN5cy5tYXhzaXplCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMSwyLDMsNF0pCisgICAgICAgIGEuZXh0ZW5kKEN1c3RvbUl0ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMSwyLDMsNF0pCisKKwogICAgIGRlZiB0ZXN0X2luc2VydChzZWxmKToKICAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAyXSkKICAgICAgICAgYS5pbnNlcnQoMCwgLTIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9sb2NrX3Rlc3RzLnB5IGIvTGliL3Rlc3QvbG9ja190ZXN0cy5weQppbmRleCBhNjRhYTE4Li5hNmNiM2IxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9sb2NrX3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L2xvY2tfdGVzdHMucHkKQEAgLTcsNiArNyw3IEBACiBmcm9tIF90aHJlYWQgaW1wb3J0IHN0YXJ0X25ld190aHJlYWQsIFRJTUVPVVRfTUFYCiBpbXBvcnQgdGhyZWFkaW5nCiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3ZWFrcmVmCiAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCkBAIC0xOTgsNiArMTk5LDE3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0c1swXSkKICAgICAgICAgc2VsZi5hc3NlcnRUaW1lb3V0KHJlc3VsdHNbMV0sIDAuNSkKIAorICAgIGRlZiB0ZXN0X3dlYWtyZWZfZXhpc3RzKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKGxvY2spCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHJlZigpKQorCisgICAgZGVmIHRlc3Rfd2Vha3JlZl9kZWxldGVkKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKGxvY2spCisgICAgICAgIGRlbCBsb2NrCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlZigpKQorCiAKIGNsYXNzIExvY2tUZXN0cyhCYXNlTG9ja1Rlc3RzKToKICAgICAiIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L21ha2Vfc3NsX2NlcnRzLnB5IGIvTGliL3Rlc3QvbWFrZV9zc2xfY2VydHMucHkKaW5kZXggYTFmMjk4ZC4uNGQ5ZjAxYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvbWFrZV9zc2xfY2VydHMucHkKKysrIGIvTGliL3Rlc3QvbWFrZV9zc2xfY2VydHMucHkKQEAgLTMsNyArMyw2IEBACiAKIGltcG9ydCBvcwogaW1wb3J0IHNodXRpbAotaW1wb3J0IHN5cwogaW1wb3J0IHRlbXBmaWxlCiBmcm9tIHN1YnByb2Nlc3MgaW1wb3J0ICoKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5IGIvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CmluZGV4IDc5MjJiNTQuLjVjODMzNjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQorKysgYi9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAgICAgICAgICAgICBiJzAnLCAgICAgICAgICAgICAgICAgICAgICAgIyBQT1AKICAgICAgICAgICAgIGInMScsICAgICAgICAgICAgICAgICAgICAgICAjIFBPUF9NQVJLCiAgICAgICAgICAgICBiJzInLCAgICAgICAgICAgICAgICAgICAgICAgIyBEVVAKLSAgICAgICAgICAgICMgYicoMicsICAgICAgICAgICAgICAgICAgICAjIFB5VW5waWNrbGVyIGRvZXNuJ3QgcmFpc2UKKyAgICAgICAgICAgIGInKDInLAogICAgICAgICAgICAgYidSJywgICAgICAgICAgICAgICAgICAgICAgICMgUkVEVUNFCiAgICAgICAgICAgICBiJylSJywKICAgICAgICAgICAgIGInYScsICAgICAgICAgICAgICAgICAgICAgICAjIEFQUEVORApAQCAtMTAwOSw3ICsxMDA5LDcgQEAKICAgICAgICAgICAgIGInTmInLAogICAgICAgICAgICAgYidkJywgICAgICAgICAgICAgICAgICAgICAgICMgRElDVAogICAgICAgICAgICAgYidlJywgICAgICAgICAgICAgICAgICAgICAgICMgQVBQRU5EUwotICAgICAgICAgICAgIyBiJyhlJywgICAgICAgICAgICAgICAgICAgICMgUHlVbnBpY2tsZXIgcmFpc2VzIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICBiJyhlJywKICAgICAgICAgICAgIGInaWJ1aWx0aW5zXG5saXN0XG4nLCAgICAgICAjIElOU1QKICAgICAgICAgICAgIGInbCcsICAgICAgICAgICAgICAgICAgICAgICAjIExJU1QKICAgICAgICAgICAgIGInbycsICAgICAgICAgICAgICAgICAgICAgICAjIE9CSgpAQCAtMTAyMiw3ICsxMDIyLDcgQEAKICAgICAgICAgICAgIGInTk5zJywKICAgICAgICAgICAgIGIndCcsICAgICAgICAgICAgICAgICAgICAgICAjIFRVUExFCiAgICAgICAgICAgICBiJ3UnLCAgICAgICAgICAgICAgICAgICAgICAgIyBTRVRJVEVNUwotICAgICAgICAgICAgIyBiJyh1JywgICAgICAgICAgICAgICAgICAgICMgUHlVbnBpY2tsZXIgZG9lc24ndCByYWlzZQorICAgICAgICAgICAgYicodScsCiAgICAgICAgICAgICBiJ30oTnUnLAogICAgICAgICAgICAgYidceDgxJywgICAgICAgICAgICAgICAgICAgICMgTkVXT0JKCiAgICAgICAgICAgICBiJylceDgxJywKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAgICAgICAgICAgICBiJ05ceDg3JywKICAgICAgICAgICAgIGInTk5ceDg3JywKICAgICAgICAgICAgIGInXHg5MCcsICAgICAgICAgICAgICAgICAgICAjIEFERElURU1TCi0gICAgICAgICAgICAjIGInKFx4OTAnLCAgICAgICAgICAgICAgICAgIyBQeVVucGlja2xlciByYWlzZXMgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgIGInKFx4OTAnLAogICAgICAgICAgICAgYidceDkxJywgICAgICAgICAgICAgICAgICAgICMgRlJPWkVOU0VUCiAgICAgICAgICAgICBiJ1x4OTInLCAgICAgICAgICAgICAgICAgICAgIyBORVdPQkpfRVgKICAgICAgICAgICAgIGInKX1ceDkyJywKQEAgLTEwNDYsNyArMTA0Niw3IEBACiAKICAgICBkZWYgdGVzdF9iYWRfbWFyayhzZWxmKToKICAgICAgICAgYmFkcGlja2xlcyA9IFsKLSAgICAgICAgICAgICMgYidOKC4nLCAgICAgICAgICAgICAgICAgICAgICMgU1RPUAorICAgICAgICAgICAgYidOKC4nLCAgICAgICAgICAgICAgICAgICAgICMgU1RPUAogICAgICAgICAgICAgYidOKDInLCAgICAgICAgICAgICAgICAgICAgICMgRFVQCiAgICAgICAgICAgICBiJ2NidWlsdGluc1xubGlzdFxuKShSJywgICAgIyBSRURVQ0UKICAgICAgICAgICAgIGInY2J1aWx0aW5zXG5saXN0XG4oKVInLApAQCAtMTA4MSw3ICsxMDgxLDcgQEAKICAgICAgICAgICAgIGInTihceDk0JywgICAgICAgICAgICAgICAgICAjIE1FTU9JWkUKICAgICAgICAgXQogICAgICAgICBmb3IgcCBpbiBiYWRwaWNrbGVzOgotICAgICAgICAgICAgc2VsZi5jaGVja191bnBpY2tsaW5nX2Vycm9yKHNlbGYuYmFkX21hcmtfZXJyb3JzLCBwKQorICAgICAgICAgICAgc2VsZi5jaGVja191bnBpY2tsaW5nX2Vycm9yKHNlbGYuYmFkX3N0YWNrX2Vycm9ycywgcCkKIAogICAgIGRlZiB0ZXN0X3RydW5jYXRlZF9kYXRhKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3VucGlja2xpbmdfZXJyb3IoRU9GRXJyb3IsIGInJykKQEAgLTE4NTUsMTYgKzE4NTUsMTQgQEAKICAgICAgICAgeC5hYmMgPSA2NjYKICAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHByb3RvPXByb3RvKToKLSAgICAgICAgICAgICAgICBpZiAyIDw9IHByb3RvIDwgNDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5kdW1wcywgeCwgcHJvdG8pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCiAgICAgICAgICAgICAgICAgaWYgcHJvdG8gPCAxOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInXG5MNjQyMDYnLCBzKSAgIyBMT05HCiAgICAgICAgICAgICAgICAgZWxpZiBwcm90byA8IDI6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidNXHhjZVx4ZmEnLCBzKSAgIyBCSU5JTlQyCisgICAgICAgICAgICAgICAgZWxpZiBwcm90byA8IDQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidYXHgwNFx4MDBceDAwXHgwMEZBQ0UnLCBzKSAgIyBCSU5VTklDT0RFCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHByb3RvID49IDQKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1x4OGNceDA0RkFDRScsIHMpICAjIFNIT1JUX0JJTlVOSUNPREUKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wY29kZV9pbl9waWNrbGUocGlja2xlLk5FV09CSiwgcykpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGNvZGVfaW5fcGlja2xlKHBpY2tsZS5ORVdPQkpfRVgsIHMpLApAQCAtMjU4MywxMSArMjU4MSw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBpY2tsZS5QaWNrbGluZ0Vycm9yLCBCYWRQaWNrbGVyKCkuZHVtcCwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocGlja2xlLlVucGlja2xpbmdFcnJvciwgQmFkVW5waWNrbGVyKCkubG9hZCkKIAotICAgIGRlZiB0ZXN0X2JhZF9pbnB1dChzZWxmKToKLSAgICAgICAgIyBUZXN0IGlzc3VlNDI5OAotICAgICAgICBzID0gYnl0ZXMoWzB4NTgsIDAsIDAsIDAsIDB4NTRdKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgcGlja2xlLmxvYWRzLCBzKQotCiAKIGNsYXNzIEFic3RyYWN0UGVyc2lzdGVudFBpY2tsZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3B5ZG9jX21vZC5weSBiL0xpYi90ZXN0L3B5ZG9jX21vZC5weQppbmRleCBjZGExYzllLi45YzFmZmY1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9weWRvY19tb2QucHkKKysrIGIvTGliL3Rlc3QvcHlkb2NfbW9kLnB5CkBAIC0xMiw3ICsxMiw3IEBACiAgICAgICAgIHBhc3MKIAogY2xhc3MgQihvYmplY3QpOgotICAgIE5PX01FQU5JTkcgPSAiZWdncyIKKyAgICBOT19NRUFOSU5HOiBzdHIgPSAiZWdncyIKICAgICBwYXNzCiAKIGNsYXNzIEMob2JqZWN0KToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3JlX3Rlc3RzLnB5IGIvTGliL3Rlc3QvcmVfdGVzdHMucHkKaW5kZXggOGMxNThmOC4uZDM2OTJmOCAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvcmVfdGVzdHMucHkKKysrIGIvTGliL3Rlc3QvcmVfdGVzdHMucHkKQEAgLTE1OCw3ICsxNTgsNyBAQAogICAgICgnKGFiYycsICctJywgU1lOVEFYX0VSUk9SKSwKICAgICAoJ2FdJywgJ2FdJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FdJyksCiAgICAgKCdhW11dYicsICdhXWInLCBTVUNDRUVELCAnZm91bmQnLCAnYV1iJyksCi0gICAgKCdhW1xdXWInLCAnYV1iJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FdYicpLAorICAgICgnYVtcXF1dYicsICdhXWInLCBTVUNDRUVELCAnZm91bmQnLCAnYV1iJyksCiAgICAgKCdhW15iY11kJywgJ2FlZCcsIFNVQ0NFRUQsICdmb3VuZCcsICdhZWQnKSwKICAgICAoJ2FbXmJjXWQnLCAnYWJkJywgRkFJTCksCiAgICAgKCdhW14tYl1jJywgJ2FkYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhZGMnKSwKQEAgLTU1MSw3ICs1NTEsNyBAQAogICAgICMgbG9va2JlaGluZDogc3BsaXQgYnkgOiBidXQgbm90IGlmIGl0IGlzIGVzY2FwZWQgYnkgLS4KICAgICAoJyg/PCEtKTooLio/KSg/PCEtKTonLCAnYTpiYy06ZGU6ZicsIFNVQ0NFRUQsICdnMScsICdiYy06ZGUnICksCiAgICAgIyBlc2NhcGluZyB3aXRoIFwgYXMgd2Uga25vdyBpdAotICAgICgnKD88IVxcXCk6KC4qPykoPzwhXFxcKTonLCAnYTpiY1xcOmRlOmYnLCBTVUNDRUVELCAnZzEnLCAnYmNcXDpkZScgKSwKKyAgICAoJyg/PCFcXFxcKTooLio/KSg/PCFcXFxcKTonLCAnYTpiY1xcOmRlOmYnLCBTVUNDRUVELCAnZzEnLCAnYmNcXDpkZScgKSwKICAgICAjIHRlcm1pbmF0aW5nIHdpdGggJyBhbmQgZXNjYXBpbmcgd2l0aCA/IGFzIGluIGVkaWZhY3QKICAgICAoIig/PCFcXD8pJyguKj8pKD88IVxcPyknIiwgImEnYmM/J2RlJ2YiLCBTVUNDRUVELCAnZzEnLCAiYmM/J2RlIiApLAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9yZWdydGVzdC5weSBiL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYmE4YTc4MC4uMjFiMGVkZgotLS0gYS9MaWIvdGVzdC9yZWdydGVzdC5weQorKysgYi9MaWIvdGVzdC9yZWdydGVzdC5weQpAQCAtNiwxNjA1ICs2LDMzIEBACiBSdW4gdGhpcyBzY3JpcHQgd2l0aCAtaCBvciAtLWhlbHAgZm9yIGRvY3VtZW50YXRpb24uCiAiIiIKIAotVVNBR0UgPSAiIiJcCi1weXRob24gLW0gdGVzdCBbb3B0aW9uc10gW3Rlc3RfbmFtZTEgW3Rlc3RfbmFtZTIgLi4uXV0KLXB5dGhvbiBwYXRoL3RvL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IFtvcHRpb25zXSBbdGVzdF9uYW1lMSBbdGVzdF9uYW1lMiAuLi5dXQotIiIiCi0KLURFU0NSSVBUSU9OID0gIiIiXAotUnVuIFB5dGhvbiByZWdyZXNzaW9uIHRlc3RzLgotCi1JZiBubyBhcmd1bWVudHMgb3Igb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGZpbmRzIGFsbCBmaWxlcyBtYXRjaGluZwotdGhlIHBhdHRlcm4gInRlc3RfKiIgaW4gdGhlIExpYi90ZXN0IHN1YmRpcmVjdG9yeSBhbmQgcnVucwotdGhlbSBpbiBhbHBoYWJldGljYWwgb3JkZXIgKGJ1dCBzZWUgLU0gYW5kIC11LCBiZWxvdywgZm9yIGV4Y2VwdGlvbnMpLgotCi1Gb3IgbW9yZSByaWdvcm91cyB0ZXN0aW5nLCBpdCBpcyB1c2VmdWwgdG8gdXNlIHRoZSBmb2xsb3dpbmcKLWNvbW1hbmQgbGluZToKLQotcHl0aG9uIC1FIC1XZCAtbSB0ZXN0IFtvcHRpb25zXSBbdGVzdF9uYW1lMSAuLi5dCi0iIiIKLQotRVBJTE9HID0gIiIiXAotQWRkaXRpb25hbCBvcHRpb24gZGV0YWlsczoKLQotLXIgcmFuZG9taXplcyB0ZXN0IGV4ZWN1dGlvbiBvcmRlci4gWW91IGNhbiB1c2UgLS1yYW5kc2VlZD1pbnQgdG8gcHJvdmlkZSBhbgotaW50IHNlZWQgdmFsdWUgZm9yIHRoZSByYW5kb21pemVyOyB0aGlzIGlzIHVzZWZ1bCBmb3IgcmVwcm9kdWNpbmcgdHJvdWJsZXNvbWUKLXRlc3Qgb3JkZXJzLgotCi0tcyBPbiB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiByZWdydGVzdCB1c2luZyAtcywgdGhlIGZpcnN0IHRlc3QgZmlsZSBmb3VuZAotb3IgdGhlIGZpcnN0IHRlc3QgZmlsZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIHJ1biwgYW5kIHRoZSBuYW1lIG9mCi10aGUgbmV4dCB0ZXN0IGlzIHJlY29yZGVkIGluIGEgZmlsZSBuYW1lZCBweW5leHR0ZXN0LiAgSWYgcnVuIGZyb20gdGhlCi1QeXRob24gYnVpbGQgZGlyZWN0b3J5LCBweW5leHR0ZXN0IGlzIGxvY2F0ZWQgaW4gdGhlICdidWlsZCcgc3ViZGlyZWN0b3J5LAotb3RoZXJ3aXNlIGl0IGlzIGxvY2F0ZWQgaW4gdGVtcGZpbGUuZ2V0dGVtcGRpcigpLiAgT24gc3Vic2VxdWVudCBydW5zLAotdGhlIHRlc3QgaW4gcHluZXh0dGVzdCBpcyBydW4sIGFuZCB0aGUgbmV4dCB0ZXN0IGlzIHdyaXR0ZW4gdG8gcHluZXh0dGVzdC4KLVdoZW4gdGhlIGxhc3QgdGVzdCBoYXMgYmVlbiBydW4sIHB5bmV4dHRlc3QgaXMgZGVsZXRlZC4gIEluIHRoaXMgd2F5IGl0Ci1pcyBwb3NzaWJsZSB0byBzaW5nbGUgc3RlcCB0aHJvdWdoIHRoZSB0ZXN0IGZpbGVzLiAgVGhpcyBpcyB1c2VmdWwgd2hlbgotZG9pbmcgbWVtb3J5IGFuYWx5c2lzIG9uIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIHdoaWNoIHByb2Nlc3MgdGVuZHMgdG8KLWNvbnN1bWUgdG9vIG1hbnkgcmVzb3VyY2VzIHRvIHJ1biB0aGUgZnVsbCByZWdyZXNzaW9uIHRlc3Qgbm9uLXN0b3AuCi0KLS1TIGlzIHVzZWQgdG8gY29udGludWUgcnVubmluZyB0ZXN0cyBhZnRlciBhbiBhYm9ydGVkIHJ1bi4gIEl0IHdpbGwKLW1haW50YWluIHRoZSBvcmRlciBhIHN0YW5kYXJkIHJ1biAoaWUsIHRoaXMgYXNzdW1lcyAtciBpcyBub3QgdXNlZCkuCi1UaGlzIGlzIHVzZWZ1bCBhZnRlciB0aGUgdGVzdHMgaGF2ZSBwcmVtYXR1cmVseSBzdG9wcGVkIGZvciBzb21lIGV4dGVybmFsCi1yZWFzb24gYW5kIHlvdSB3YW50IHRvIHN0YXJ0IHJ1bm5pbmcgZnJvbSB3aGVyZSB5b3UgbGVmdCBvZmYgcmF0aGVyCi10aGFuIHN0YXJ0aW5nIGZyb20gdGhlIGJlZ2lubmluZy4KLQotLWYgcmVhZHMgdGhlIG5hbWVzIG9mIHRlc3RzIGZyb20gdGhlIGZpbGUgZ2l2ZW4gYXMgZidzIGFyZ3VtZW50LCBvbmUKLW9yIG1vcmUgdGVzdCBuYW1lcyBwZXIgbGluZS4gIFdoaXRlc3BhY2UgaXMgaWdub3JlZC4gIEJsYW5rIGxpbmVzIGFuZAotbGluZXMgYmVnaW5uaW5nIHdpdGggJyMnIGFyZSBpZ25vcmVkLiAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IKLXdoaXR0bGluZyBkb3duIGZhaWx1cmVzIGludm9sdmluZyBpbnRlcmFjdGlvbnMgYW1vbmcgdGVzdHMuCi0KLS1MIGNhdXNlcyB0aGUgbGVha3MoMSkgY29tbWFuZCB0byBiZSBydW4ganVzdCBiZWZvcmUgZXhpdCBpZiBpdCBleGlzdHMuCi1sZWFrcygxKSBpcyBhdmFpbGFibGUgb24gTWFjIE9TIFggYW5kIHByZXN1bWFibHkgb24gc29tZSBvdGhlcgotRnJlZUJTRC1kZXJpdmVkIHN5c3RlbXMuCi0KLS1SIHJ1bnMgZWFjaCB0ZXN0IHNldmVyYWwgdGltZXMgYW5kIGV4YW1pbmVzIHN5cy5nZXR0b3RhbHJlZmNvdW50KCkgdG8KLXNlZSBpZiB0aGUgdGVzdCBhcHBlYXJzIHRvIGJlIGxlYWtpbmcgcmVmZXJlbmNlcy4gIFRoZSBhcmd1bWVudCBzaG91bGQKLWJlIG9mIHRoZSBmb3JtIHN0YWI6cnVuOmZuYW1lIHdoZXJlICdzdGFiJyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZQotdGVzdCBpcyBydW4gdG8gbGV0IGdldHRvdGFscmVmY291bnQgc2V0dGxlIGRvd24sICdydW4nIGlzIHRoZSBudW1iZXIKLW9mIHRpbWVzIGZ1cnRoZXIgaXQgaXMgcnVuIGFuZCAnZm5hbWUnIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoZQotcmVwb3J0cyBhcmUgd3JpdHRlbiB0by4gIFRoZXNlIHBhcmFtZXRlcnMgYWxsIGhhdmUgZGVmYXVsdHMgKDUsIDQgYW5kCi0icmVmbG9nLnR4dCIgcmVzcGVjdGl2ZWx5KSwgYW5kIHRoZSBtaW5pbWFsIGludm9jYXRpb24gaXMgJy1SIDonLgotCi0tTSBydW5zIHRlc3RzIHRoYXQgcmVxdWlyZSBhbiBleG9yYml0YW50IGFtb3VudCBvZiBtZW1vcnkuIFRoZXNlIHRlc3RzCi10eXBpY2FsbHkgdHJ5IHRvIGFzY2VydGFpbiBjb250YWluZXJzIGtlZXAgd29ya2luZyB3aGVuIGNvbnRhaW5pbmcgbW9yZSB0aGFuCi0yIGJpbGxpb24gb2JqZWN0cywgd2hpY2ggb25seSB3b3JrcyBvbiA2NC1iaXQgc3lzdGVtcy4gVGhlcmUgYXJlIGFsc28gc29tZQotdGVzdHMgdGhhdCB0cnkgdG8gZXhoYXVzdCB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcHJvY2Vzcywgd2hpY2ggb25seSBtYWtlcwotc2Vuc2Ugb24gMzItYml0IHN5c3RlbXMgd2l0aCBhdCBsZWFzdCAyR2Igb2YgbWVtb3J5LiBUaGUgcGFzc2VkLWluIG1lbWxpbWl0LAotd2hpY2ggaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm0gb2YgJzIuNUdiJywgZGV0ZXJtaW5lcyBob3dtdWNoIG1lbW9yeSB0aGUKLXRlc3RzIHdpbGwgbGltaXQgdGhlbXNlbHZlcyB0byAoYnV0IHRoZXkgbWF5IGdvIHNsaWdodGx5IG92ZXIuKSBUaGUgbnVtYmVyCi1zaG91bGRuJ3QgYmUgbW9yZSBtZW1vcnkgdGhhbiB0aGUgbWFjaGluZSBoYXMgKGluY2x1ZGluZyBzd2FwIG1lbW9yeSkuIFlvdQotc2hvdWxkIGFsc28ga2VlcCBpbiBtaW5kIHRoYXQgc3dhcCBtZW1vcnkgaXMgZ2VuZXJhbGx5IG11Y2gsIG11Y2ggc2xvd2VyCi10aGFuIFJBTSwgYW5kIHNldHRpbmcgbWVtbGltaXQgdG8gYWxsIGF2YWlsYWJsZSBSQU0gb3IgaGlnaGVyIHdpbGwgaGVhdmlseQotdGF4IHRoZSBtYWNoaW5lLiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgaXMgbm8gdXNlIHJ1bm5pbmcgdGhlc2UgdGVzdHMgd2l0aCBhCi1saW1pdCBvZiBsZXNzIHRoYW4gMi41R2IsIGFuZCBtYW55IHJlcXVpcmUgbW9yZSB0aGFuIDIwR2IuIFRlc3RzIHRoYXQgZXhwZWN0Ci10byB1c2UgbW9yZSB0aGFuIG1lbWxpbWl0IG1lbW9yeSB3aWxsIGJlIHNraXBwZWQuIFRoZSBiaWctbWVtb3J5IHRlc3RzCi1nZW5lcmFsbHkgcnVuIHZlcnksIHZlcnkgbG9uZy4KLQotLXUgaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzIHRvIHJ1biwKLXN1Y2ggYXMgdGhvc2UgcmVxdWlyaW5nIGxhcmdlIGZpbGUgc3VwcG9ydCBvciBuZXR3b3JrIGNvbm5lY3Rpdml0eS4KLVRoZSBhcmd1bWVudCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmRzIGluZGljYXRpbmcgdGhlCi1yZXNvdXJjZXMgdG8gdGVzdC4gIEN1cnJlbnRseSBvbmx5IHRoZSBmb2xsb3dpbmcgYXJlIGRlZmluZWQ6Ci0KLSAgICBhbGwgLSAgICAgICBFbmFibGUgYWxsIHNwZWNpYWwgcmVzb3VyY2VzLgotCi0gICAgbm9uZSAtICAgICAgRGlzYWJsZSBhbGwgc3BlY2lhbCByZXNvdXJjZXMgKHRoaXMgaXMgdGhlIGRlZmF1bHQpLgotCi0gICAgYXVkaW8gLSAgICAgVGVzdHMgdGhhdCB1c2UgdGhlIGF1ZGlvIGRldmljZS4gIChUaGVyZSBhcmUga25vd24KLSAgICAgICAgICAgICAgICBjYXNlcyBvZiBicm9rZW4gYXVkaW8gZHJpdmVycyB0aGF0IGNhbiBjcmFzaCBQeXRob24gb3IKLSAgICAgICAgICAgICAgICBldmVuIHRoZSBMaW51eCBrZXJuZWwuKQotCi0gICAgY3Vyc2VzIC0gICAgVGVzdHMgdGhhdCB1c2UgY3Vyc2VzIGFuZCB3aWxsIG1vZGlmeSB0aGUgdGVybWluYWwncwotICAgICAgICAgICAgICAgIHN0YXRlIGFuZCBvdXRwdXQgbW9kZXMuCi0KLSAgICBsYXJnZWZpbGUgLSBJdCBpcyBva2F5IHRvIHJ1biBzb21lIHRlc3QgdGhhdCBtYXkgY3JlYXRlIGh1Z2UKLSAgICAgICAgICAgICAgICBmaWxlcy4gIFRoZXNlIHRlc3RzIGNhbiB0YWtlIGEgbG9uZyB0aW1lIGFuZCBtYXkKLSAgICAgICAgICAgICAgICBjb25zdW1lID4yR0Igb2YgZGlzayBzcGFjZSB0ZW1wb3JhcmlseS4KLQotICAgIG5ldHdvcmsgLSAgIEl0IGlzIG9rYXkgdG8gcnVuIHRlc3RzIHRoYXQgdXNlIGV4dGVybmFsIG5ldHdvcmsKLSAgICAgICAgICAgICAgICByZXNvdXJjZSwgZS5nLiB0ZXN0aW5nIFNTTCBzdXBwb3J0IGZvciBzb2NrZXRzLgotCi0gICAgZGVjaW1hbCAtICAgVGVzdCB0aGUgZGVjaW1hbCBtb2R1bGUgYWdhaW5zdCBhIGxhcmdlIHN1aXRlIHRoYXQKLSAgICAgICAgICAgICAgICB2ZXJpZmllcyBjb21wbGlhbmNlIHdpdGggc3RhbmRhcmRzLgotCi0gICAgY3B1IC0gICAgICAgVXNlZCBmb3IgY2VydGFpbiBDUFUtaGVhdnkgdGVzdHMuCi0KLSAgICBzdWJwcm9jZXNzICBSdW4gYWxsIHRlc3RzIGZvciB0aGUgc3VicHJvY2VzcyBtb2R1bGUuCi0KLSAgICB1cmxmZXRjaCAtICBJdCBpcyBva2F5IHRvIGRvd25sb2FkIGZpbGVzIHJlcXVpcmVkIG9uIHRlc3RpbmcuCi0KLSAgICBndWkgLSAgICAgICBSdW4gdGVzdHMgdGhhdCByZXF1aXJlIGEgcnVubmluZyBHVUkuCi0KLVRvIGVuYWJsZSBhbGwgcmVzb3VyY2VzIGV4Y2VwdCBvbmUsIHVzZSAnLXVhbGwsLTxyZXNvdXJjZT4nLiAgRm9yCi1leGFtcGxlLCB0byBydW4gYWxsIHRoZSB0ZXN0cyBleGNlcHQgZm9yIHRoZSBndWkgdGVzdHMsIGdpdmUgdGhlCi1vcHRpb24gJy11YWxsLC1ndWknLgotIiIiCi0KICMgV2UgaW1wb3J0IGltcG9ydGxpYiAqQVNBUCogaW4gb3JkZXIgdG8gdGVzdCAjMTUzODYKIGltcG9ydCBpbXBvcnRsaWIKIAotaW1wb3J0IGFyZ3BhcnNlCi1pbXBvcnQgYnVpbHRpbnMKLWltcG9ydCBmYXVsdGhhbmRsZXIKLWltcG9ydCBpbwotaW1wb3J0IGpzb24KLWltcG9ydCBsb2NhbGUKLWltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKLWltcG9ydCBwbGF0Zm9ybQotaW1wb3J0IHJhbmRvbQotaW1wb3J0IHJlCi1pbXBvcnQgc2h1dGlsCi1pbXBvcnQgc2lnbmFsCiBpbXBvcnQgc3lzCi1pbXBvcnQgc3lzY29uZmlnCi1pbXBvcnQgdGVtcGZpbGUKLWltcG9ydCB0aW1lCi1pbXBvcnQgdHJhY2ViYWNrCi1pbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB3YXJuaW5ncwotZnJvbSBpbnNwZWN0IGltcG9ydCBpc2Fic3RyYWN0Citmcm9tIHRlc3QubGlicmVncnRlc3QgaW1wb3J0IG1haW4KIAotdHJ5OgotICAgIGltcG9ydCB0aHJlYWRpbmcKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICB0aHJlYWRpbmcgPSBOb25lCi10cnk6Ci0gICAgaW1wb3J0IF9tdWx0aXByb2Nlc3NpbmcsIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgbXVsdGlwcm9jZXNzaW5nID0gTm9uZQogCisjIEFsaWFzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IChqdXN0IGluIGNhc2UpCittYWluX2luX3RlbXBfY3dkID0gbWFpbgogCi0jIFNvbWUgdGltZXMgX19wYXRoX18gYW5kIF9fZmlsZV9fIGFyZSBub3QgYWJzb2x1dGUgKGUuZy4gd2hpbGUgcnVubmluZyBmcm9tCi0jIExpYi8pIGFuZCwgaWYgd2UgY2hhbmdlIHRoZSBDV0QgdG8gcnVuIHRoZSB0ZXN0cyBpbiBhIHRlbXBvcmFyeSBkaXIsIHNvbWUKLSMgaW1wb3J0cyBtaWdodCBmYWlsLiAgVGhpcyBhZmZlY3RzIG9ubHkgdGhlIG1vZHVsZXMgaW1wb3J0ZWQgYmVmb3JlIG9zLmNoZGlyKCkuCi0jIFRoZXNlIG1vZHVsZXMgYXJlIHNlYXJjaGVkIGZpcnN0IGluIHN5cy5wYXRoWzBdIChzbyAnJyAtLSB0aGUgQ1dEKSBhbmQgaWYKLSMgdGhleSBhcmUgZm91bmQgaW4gdGhlIENXRCB0aGVpciBfX2ZpbGVfXyBhbmQgX19wYXRoX18gd2lsbCBiZSByZWxhdGl2ZSAodGhpcwotIyBoYXBwZW5zIGJlZm9yZSB0aGUgY2hkaXIpLiAgQWxsIHRoZSBtb2R1bGVzIGltcG9ydGVkIGFmdGVyIHRoZSBjaGRpciwgYXJlCi0jIG5vdCBmb3VuZCBpbiB0aGUgQ1dELCBhbmQgc2luY2UgdGhlIG90aGVyIHBhdGhzIGluIHN5cy5wYXRoWzE6XSBhcmUgYWJzb2x1dGUKLSMgKHNpdGUucHkgYWJzb2x1dGl6ZSB0aGVtKSwgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyB3aWxsIGJlIGFic29sdXRlIHRvby4KLSMgVGhlcmVmb3JlIGl0IGlzIG5lY2Vzc2FyeSB0byBhYnNvbHV0aXplIG1hbnVhbGx5IHRoZSBfX2ZpbGVfXyBhbmQgX19wYXRoX18gb2YKLSMgdGhlIHBhY2thZ2VzIHRvIHByZXZlbnQgbGF0ZXIgaW1wb3J0cyB0byBmYWlsIHdoZW4gdGhlIENXRCBpcyBkaWZmZXJlbnQuCi1mb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgotICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKLSAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gW29zLnBhdGguYWJzcGF0aChwYXRoKSBmb3IgcGF0aCBpbiBtb2R1bGUuX19wYXRoX19dCi0gICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgotICAgICAgICBtb2R1bGUuX19maWxlX18gPSBvcy5wYXRoLmFic3BhdGgobW9kdWxlLl9fZmlsZV9fKQogCi0KLSMgTWFjT1NYIChhLmsuYS4gRGFyd2luKSBoYXMgYSBkZWZhdWx0IHN0YWNrIHNpemUgdGhhdCBpcyB0b28gc21hbGwKLSMgZm9yIGRlZXBseSByZWN1cnNpdmUgcmVndWxhciBleHByZXNzaW9ucy4gIFdlIHNlZSB0aGlzIGFzIGNyYXNoZXMgaW4KLSMgdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdoZW4gcnVubmluZyB0ZXN0X3JlLnB5IGFuZCB0ZXN0X3NyZS5weS4gIFRoZQotIyBmaXggaXMgdG8gc2V0IHRoZSBzdGFjayBsaW1pdCB0byAyMDQ4LgotIyBUaGlzIGFwcHJvYWNoIG1heSBhbHNvIGJlIHVzZWZ1bCBmb3Igb3RoZXIgVW5peHkgcGxhdGZvcm1zIHRoYXQKLSMgc3VmZmVyIGZyb20gc21hbGwgZGVmYXVsdCBzdGFjayBsaW1pdHMuCi1pZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6Ci0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgcmVzb3VyY2UKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBzb2Z0LCBoYXJkID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9TVEFDSykKLSAgICAgICAgbmV3c29mdCA9IG1pbihoYXJkLCBtYXgoc29mdCwgMTAyNCoyMDQ4KSkKLSAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9TVEFDSywgKG5ld3NvZnQsIGhhcmQpKQotCi0jIFRlc3QgcmVzdWx0IGNvbnN0YW50cy4KLVBBU1NFRCA9IDEKLUZBSUxFRCA9IDAKLUVOVl9DSEFOR0VEID0gLTEKLVNLSVBQRUQgPSAtMgotUkVTT1VSQ0VfREVOSUVEID0gLTMKLUlOVEVSUlVQVEVEID0gLTQKLUNISUxEX0VSUk9SID0gLTUgICAjIGVycm9yIGluIGEgY2hpbGQgcHJvY2VzcwotCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKLQotUkVTT1VSQ0VfTkFNRVMgPSAoJ2F1ZGlvJywgJ2N1cnNlcycsICdsYXJnZWZpbGUnLCAnbmV0d29yaycsCi0gICAgICAgICAgICAgICAgICAnZGVjaW1hbCcsICdjcHUnLCAnc3VicHJvY2VzcycsICd1cmxmZXRjaCcsICdndWknKQotCi0jIFdoZW4gdGVzdHMgYXJlIHJ1biBmcm9tIHRoZSBQeXRob24gYnVpbGQgZGlyZWN0b3J5LCBpdCBpcyBiZXN0IHByYWN0aWNlCi0jIHRvIGtlZXAgdGhlIHRlc3QgZmlsZXMgaW4gYSBzdWJmb2xkZXIuICBUaGlzIGVhc2VzIHRoZSBjbGVhbnVwIG9mIGxlZnRvdmVyCi0jIGZpbGVzIHVzaW5nIHRoZSAibWFrZSBkaXN0Y2xlYW4iIGNvbW1hbmQuCi1pZiBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6Ci0gICAgVEVNUERJUiA9IG9zLnBhdGguam9pbihzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3NyY2RpcicpLCAnYnVpbGQnKQotZWxzZToKLSAgICBURU1QRElSID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCi1URU1QRElSID0gb3MucGF0aC5hYnNwYXRoKFRFTVBESVIpCi0KLWNsYXNzIF9BcmdQYXJzZXIoYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgotCi0gICAgZGVmIGVycm9yKHNlbGYsIG1lc3NhZ2UpOgotICAgICAgICBzdXBlcigpLmVycm9yKG1lc3NhZ2UgKyAiXG5QYXNzIC1oIG9yIC0taGVscCBmb3IgY29tcGxldGUgaGVscC4iKQotCi1kZWYgX2NyZWF0ZV9wYXJzZXIoKToKLSAgICAjIFNldCBwcm9nIHRvIHByZXZlbnQgdGhlIHVuaW5mb3JtYXRpdmUgIl9fbWFpbl9fLnB5IiBmcm9tIGRpc3BsYXlpbmcgaW4KLSAgICAjIGVycm9yIG1lc3NhZ2VzIHdoZW4gdXNpbmcgInB5dGhvbiAtbSB0ZXN0IC4uLiIuCi0gICAgcGFyc2VyID0gX0FyZ1BhcnNlcihwcm9nPSdyZWdydGVzdC5weScsCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZT1VU0FHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPURFU0NSSVBUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgZXBpbG9nPUVQSUxPRywKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9oZWxwPUZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlcikKLQotICAgICMgQXJndW1lbnRzIHdpdGggdGhpcyBjbGF1c2UgYWRkZWQgdG8gaXRzIGhlbHAgYXJlIGRlc2NyaWJlZCBmdXJ0aGVyIGluCi0gICAgIyB0aGUgZXBpbG9nJ3MgIkFkZGl0aW9uYWwgb3B0aW9uIGRldGFpbHMiIHNlY3Rpb24uCi0gICAgbW9yZV9kZXRhaWxzID0gJyAgU2VlIHRoZSBzZWN0aW9uIGF0IGJvdHRvbSBmb3IgbW9yZSBkZXRhaWxzLicKLQotICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnR2VuZXJhbCBvcHRpb25zJykKLSAgICAjIFdlIGFkZCBoZWxwIGV4cGxpY2l0bHkgdG8gY29udHJvbCB3aGF0IGFyZ3VtZW50IGdyb3VwIGl0IHJlbmRlcnMgdW5kZXIuCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaCcsICctLWhlbHAnLCBhY3Rpb249J2hlbHAnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0JykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tdGltZW91dCcsIG1ldGF2YXI9J1RJTUVPVVQnLCB0eXBlPWZsb2F0LAotICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZHVtcCB0aGUgdHJhY2ViYWNrIGFuZCBleGl0IGlmIGEgdGVzdCB0YWtlcyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb3JlIHRoYW4gVElNRU9VVCBzZWNvbmRzOyBkaXNhYmxlZCBpZiBUSU1FT1VUICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIG5lZ2F0aXZlIG9yIGVxdWFscyB0byB6ZXJvJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0td2FpdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3dhaXQgZm9yIHVzZXIgaW5wdXQsIGUuZy4sIGFsbG93IGEgZGVidWdnZXIgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0byBiZSBhdHRhY2hlZCcpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXNsYXZlYXJncycsIG1ldGF2YXI9J0FSR1MnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLVMnLCAnLS1zdGFydCcsIG1ldGF2YXI9J1NUQVJUJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ndGhlIG5hbWUgb2YgdGhlIHRlc3QgYXQgd2hpY2ggdG8gc3RhcnQuJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQotCi0gICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdWZXJib3NpdHknKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSdjb3VudCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0ZXN0cyBpbiB2ZXJib3NlIG1vZGUgd2l0aCBvdXRwdXQgdG8gc3Rkb3V0JykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy13JywgJy0tdmVyYm9zZTInLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZS1ydW4gZmFpbGVkIHRlc3RzIGluIHZlcmJvc2UgbW9kZScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctVycsICctLXZlcmJvc2UzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlzcGxheSB0ZXN0IG91dHB1dCBvbiBmYWlsdXJlJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdubyBvdXRwdXQgdW5sZXNzIG9uZSBvciBtb3JlIHRlc3RzIGZhaWwnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW8nLCAnLS1zbG93JywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0ncHJpbnRfc2xvdycsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3ByaW50IHRoZSBzbG93ZXN0IDEwIHRlc3RzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0taGVhZGVyJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHJpbnQgaGVhZGVyIHdpdGggaW50ZXJwcmV0ZXIgaW5mbycpCi0KLSAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1NlbGVjdGluZyB0ZXN0cycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcicsICctLXJhbmRvbWl6ZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JhbmRvbWl6ZSB0ZXN0IGV4ZWN1dGlvbiBvcmRlci4nICsgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1yYW5kc2VlZCcsIG1ldGF2YXI9J1NFRUQnLAotICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSdyYW5kb21fc2VlZCcsIHR5cGU9aW50LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwYXNzIGEgcmFuZG9tIHNlZWQgdG8gcmVwcm9kdWNlIGEgcHJldmlvdXMgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyYW5kb20gcnVuJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1mJywgJy0tZnJvbWZpbGUnLCBtZXRhdmFyPSdGSUxFJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmVhZCBuYW1lcyBvZiB0ZXN0cyB0byBydW4gZnJvbSBhIGZpbGUuJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXgnLCAnLS1leGNsdWRlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nYXJndW1lbnRzIGFyZSB0ZXN0cyB0byAqZXhjbHVkZSonKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1zaW5nbGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzaW5nbGUgc3RlcCB0aHJvdWdoIGEgc2V0IG9mIHRlc3RzLicgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1tJywgJy0tbWF0Y2gnLCBtZXRhdmFyPSdQQVQnLAotICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSdtYXRjaF90ZXN0cycsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J21hdGNoIHRlc3QgY2FzZXMgYW5kIG1ldGhvZHMgd2l0aCBnbG9iIHBhdHRlcm4gUEFUJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1HJywgJy0tZmFpbGZhc3QnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdmYWlsIGFzIHNvb24gYXMgYSB0ZXN0IGZhaWxzIChvbmx5IHdpdGggLXYgb3IgLVcpJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy11JywgJy0tdXNlJywgbWV0YXZhcj0nUkVTMSxSRVMyLC4uLicsCi0gICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nYXBwZW5kJywgdHlwZT1yZXNvdXJjZXNfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3BlY2lmeSB3aGljaCBzcGVjaWFsIHJlc291cmNlIGludGVuc2l2ZSB0ZXN0cyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIHJ1bi4nICsgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLU0nLCAnLS1tZW1saW1pdCcsIG1ldGF2YXI9J0xJTUlUJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHZlcnkgbGFyZ2UgbWVtb3J5LWNvbnN1bWluZyB0ZXN0cy4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXRlc3RkaXInLCBtZXRhdmFyPSdESVInLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXJlbGF0aXZlX2ZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdleGVjdXRlIHRlc3QgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoaW5zdGVhZCBvZiB0aGUgUHl0aG9uIHN0ZGxpYiB0ZXN0IHN1aXRlKScpCi0KLSAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1NwZWNpYWwgcnVucycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbCcsICctLWZpbmRsZWFrcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2lmIEdDIGlzIGF2YWlsYWJsZSBkZXRlY3QgdGVzdHMgdGhhdCBsZWFrIG1lbW9yeScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTCcsICctLXJ1bmxlYWtzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRoZSBsZWFrcygxKSBjb21tYW5kIGp1c3QgYmVmb3JlIGV4aXQuJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLVInLCAnLS1odW50cmxlYWtzJywgbWV0YXZhcj0nUlVOQ09VTlRTJywKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1odW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzZWFyY2ggZm9yIHJlZmVyZW5jZSBsZWFrcyAobmVlZHMgZGVidWcgYnVpbGQsICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyeSBzbG93KS4nICsgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWonLCAnLS1tdWx0aXByb2Nlc3MnLCBtZXRhdmFyPSdQUk9DRVNTRVMnLAotICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd1c2VfbXAnLCB0eXBlPWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIFBST0NFU1NFUyBwcm9jZXNzZXMgYXQgb25jZScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctVCcsICctLWNvdmVyYWdlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0ndHJhY2UnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd0dXJuIG9uIGNvZGUgY292ZXJhZ2UgdHJhY2luZyB1c2luZyB0aGUgdHJhY2UgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGUnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUQnLCAnLS1jb3ZlcmRpcicsIG1ldGF2YXI9J0RJUicsCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cmVsYXRpdmVfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2RpcmVjdG9yeSB3aGVyZSBjb3ZlcmFnZSBmaWxlcyBhcmUgcHV0JykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1OJywgJy0tbm9jb3ZlcmRpcicsCi0gICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfY29uc3QnLCBjb25zdD1Ob25lLCBkZXN0PSdjb3ZlcmRpcicsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3B1dCBjb3ZlcmFnZSBmaWxlcyBhbG9uZ3NpZGUgbW9kdWxlcycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdCcsICctLXRocmVzaG9sZCcsIG1ldGF2YXI9J1RIUkVTSE9MRCcsCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9aW50LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdjYWxsIGdjLnNldF90aHJlc2hvbGQoVEhSRVNIT0xEKScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbicsICctLW5vd2luZG93cycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3N1cHByZXNzIGVycm9yIG1lc3NhZ2UgYm94ZXMgb24gV2luZG93cycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRicsICctLWZvcmV2ZXInLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGhlIHNwZWNpZmllZCB0ZXN0cyBpbiBhIGxvb3AsIHVudGlsIGFuICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3IgaGFwcGVucycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUCcsICctLXBnbycsIGRlc3Q9J3BnbycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2VuYWJsZSBQcm9maWxlIEd1aWRlZCBPcHRpbWl6YXRpb24gdHJhaW5pbmcnKQotCi0gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnYXJncycsIG5hcmdzPWFyZ3BhcnNlLlJFTUFJTkRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9YXJncGFyc2UuU1VQUFJFU1MpCi0KLSAgICByZXR1cm4gcGFyc2VyCi0KLWRlZiByZWxhdGl2ZV9maWxlbmFtZShzdHJpbmcpOgotICAgICMgQ1dEIGlzIHJlcGxhY2VkIHdpdGggYSB0ZW1wb3JhcnkgZGlyIGJlZm9yZSBjYWxsaW5nIG1haW4oKSwgc28gd2UKLSAgICAjIGpvaW4gaXQgd2l0aCB0aGUgc2F2ZWQgQ1dEIHNvIGl0IGVuZHMgdXAgd2hlcmUgdGhlIHVzZXIgZXhwZWN0cy4KLSAgICByZXR1cm4gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIHN0cmluZykKLQotZGVmIGh1bnRybGVha3Moc3RyaW5nKToKLSAgICBhcmdzID0gc3RyaW5nLnNwbGl0KCc6JykKLSAgICBpZiBsZW4oYXJncykgbm90IGluICgyLCAzKToKLSAgICAgICAgcmFpc2UgYXJncGFyc2UuQXJndW1lbnRUeXBlRXJyb3IoCi0gICAgICAgICAgICAnbmVlZHMgMiBvciAzIGNvbG9uLXNlcGFyYXRlZCBhcmd1bWVudHMnKQotICAgIG53YXJtdXAgPSBpbnQoYXJnc1swXSkgaWYgYXJnc1swXSBlbHNlIDUKLSAgICBudHJhY2tlZCA9IGludChhcmdzWzFdKSBpZiBhcmdzWzFdIGVsc2UgNAotICAgIGZuYW1lID0gYXJnc1syXSBpZiBsZW4oYXJncykgPiAyIGFuZCBhcmdzWzJdIGVsc2UgJ3JlZmxvZy50eHQnCi0gICAgcmV0dXJuIG53YXJtdXAsIG50cmFja2VkLCBmbmFtZQotCi1kZWYgcmVzb3VyY2VzX2xpc3Qoc3RyaW5nKToKLSAgICB1ID0gW3gubG93ZXIoKSBmb3IgeCBpbiBzdHJpbmcuc3BsaXQoJywnKV0KLSAgICBmb3IgciBpbiB1OgotICAgICAgICBpZiByID09ICdhbGwnIG9yIHIgPT0gJ25vbmUnOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgaWYgclswXSA9PSAnLSc6Ci0gICAgICAgICAgICByID0gclsxOl0KLSAgICAgICAgaWYgciBub3QgaW4gUkVTT1VSQ0VfTkFNRVM6Ci0gICAgICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcignaW52YWxpZCByZXNvdXJjZTogJyArIHIpCi0gICAgcmV0dXJuIHUKLQotZGVmIF9wYXJzZV9hcmdzKGFyZ3MsICoqa3dhcmdzKToKLSAgICAjIERlZmF1bHRzCi0gICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UodGVzdGRpcj1Ob25lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLAotICAgICAgICAgZXhjbHVkZT1GYWxzZSwgc2luZ2xlPUZhbHNlLCByYW5kb21pemU9RmFsc2UsIGZyb21maWxlPU5vbmUsCi0gICAgICAgICBmaW5kbGVha3M9RmFsc2UsIHVzZV9yZXNvdXJjZXM9Tm9uZSwgdHJhY2U9RmFsc2UsIGNvdmVyZGlyPSdjb3ZlcmFnZScsCi0gICAgICAgICBydW5sZWFrcz1GYWxzZSwgaHVudHJsZWFrcz1GYWxzZSwgdmVyYm9zZTI9RmFsc2UsIHByaW50X3Nsb3c9RmFsc2UsCi0gICAgICAgICByYW5kb21fc2VlZD1Ob25lLCB1c2VfbXA9Tm9uZSwgdmVyYm9zZTM9RmFsc2UsIGZvcmV2ZXI9RmFsc2UsCi0gICAgICAgICBoZWFkZXI9RmFsc2UsIGZhaWxmYXN0PUZhbHNlLCBtYXRjaF90ZXN0cz1Ob25lLCBwZ289RmFsc2UpCi0gICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZW1zKCk6Ci0gICAgICAgIGlmIG5vdCBoYXNhdHRyKG5zLCBrKToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXIgaXMgYW4gaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50ICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIHRoaXMgZnVuY3Rpb24nICUgaykKLSAgICAgICAgc2V0YXR0cihucywgaywgdikKLSAgICBpZiBucy51c2VfcmVzb3VyY2VzIGlzIE5vbmU6Ci0gICAgICAgIG5zLnVzZV9yZXNvdXJjZXMgPSBbXQotCi0gICAgcGFyc2VyID0gX2NyZWF0ZV9wYXJzZXIoKQotICAgIHBhcnNlci5wYXJzZV9hcmdzKGFyZ3M9YXJncywgbmFtZXNwYWNlPW5zKQotCi0gICAgaWYgbnMuc2luZ2xlIGFuZCBucy5mcm9tZmlsZToKLSAgICAgICAgcGFyc2VyLmVycm9yKCItcyBhbmQgLWYgZG9uJ3QgZ28gdG9nZXRoZXIhIikKLSAgICBpZiBucy51c2VfbXAgYW5kIG5zLnRyYWNlOgotICAgICAgICBwYXJzZXIuZXJyb3IoIi1UIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQotICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMuZmluZGxlYWtzOgotICAgICAgICBwYXJzZXIuZXJyb3IoIi1sIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQotICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMubWVtbGltaXQ6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLU0gYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCi0gICAgaWYgbnMuZmFpbGZhc3QgYW5kIG5vdCAobnMudmVyYm9zZSBvciBucy52ZXJib3NlMyk6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLUcvLS1mYWlsZmFzdCBuZWVkcyBlaXRoZXIgLXYgb3IgLVciKQotCi0gICAgaWYgbnMucXVpZXQ6Ci0gICAgICAgIG5zLnZlcmJvc2UgPSAwCi0gICAgaWYgbnMudGltZW91dCBpcyBub3QgTm9uZToKLSAgICAgICAgaWYgaGFzYXR0cihmYXVsdGhhbmRsZXIsICdkdW1wX3RyYWNlYmFja19sYXRlcicpOgotICAgICAgICAgICAgaWYgbnMudGltZW91dCA8PSAwOgotICAgICAgICAgICAgICAgIG5zLnRpbWVvdXQgPSBOb25lCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCgiV2FybmluZzogVGhlIHRpbWVvdXQgb3B0aW9uIHJlcXVpcmVzICIKLSAgICAgICAgICAgICAgICAgICJmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIiKQotICAgICAgICAgICAgbnMudGltZW91dCA9IE5vbmUKLSAgICBpZiBucy51c2VfbXAgaXMgbm90IE5vbmU6Ci0gICAgICAgIGlmIG5zLnVzZV9tcCA8PSAwOgotICAgICAgICAgICAgIyBVc2UgYWxsIGNvcmVzICsgZXh0cmFzIGZvciB0ZXN0cyB0aGF0IGxpa2UgdG8gc2xlZXAKLSAgICAgICAgICAgIG5zLnVzZV9tcCA9IDIgKyAob3MuY3B1X2NvdW50KCkgb3IgMSkKLSAgICAgICAgaWYgbnMudXNlX21wID09IDE6Ci0gICAgICAgICAgICBucy51c2VfbXAgPSBOb25lCi0gICAgaWYgbnMudXNlOgotICAgICAgICBmb3IgYSBpbiBucy51c2U6Ci0gICAgICAgICAgICBmb3IgciBpbiBhOgotICAgICAgICAgICAgICAgIGlmIHIgPT0gJ2FsbCc6Ci0gICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXNbOl0gPSBSRVNPVVJDRV9OQU1FUwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIGlmIHIgPT0gJ25vbmUnOgotICAgICAgICAgICAgICAgICAgICBkZWwgbnMudXNlX3Jlc291cmNlc1s6XQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIHJlbW92ZSA9IEZhbHNlCi0gICAgICAgICAgICAgICAgaWYgclswXSA9PSAnLSc6Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgciA9IHJbMTpdCi0gICAgICAgICAgICAgICAgaWYgcmVtb3ZlOgotICAgICAgICAgICAgICAgICAgICBpZiByIGluIG5zLnVzZV9yZXNvdXJjZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzLnJlbW92ZShyKQotICAgICAgICAgICAgICAgIGVsaWYgciBub3QgaW4gbnMudXNlX3Jlc291cmNlczoKLSAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlcy5hcHBlbmQocikKLSAgICBpZiBucy5yYW5kb21fc2VlZCBpcyBub3QgTm9uZToKLSAgICAgICAgbnMucmFuZG9taXplID0gVHJ1ZQotCi0gICAgcmV0dXJuIG5zCi0KLQotZGVmIHJ1bl90ZXN0X2luX3N1YnByb2Nlc3ModGVzdG5hbWUsIG5zKToKLSAgICAiIiJSdW4gdGhlIGdpdmVuIHRlc3QgaW4gYSBzdWJwcm9jZXNzIHdpdGggLS1zbGF2ZWFyZ3MuCi0KLSAgICBucyBpcyB0aGUgb3B0aW9uIE5hbWVzcGFjZSBwYXJzZWQgZnJvbSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiByZWdydGVzdAotICAgIGlzIGludm9rZWQgaW4gYSBzdWJwcm9jZXNzIHdpdGggdGhlIC0tc2xhdmVhcmdzIGFyZ3VtZW50OyB3aGVuIHRoZQotICAgIHN1YnByb2Nlc3MgZXhpdHMsIGl0cyByZXR1cm4gY29kZSwgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIHJldHVybmVkIGFzIGEKLSAgICAzLXR1cGxlLgotICAgICIiIgotICAgIGZyb20gc3VicHJvY2VzcyBpbXBvcnQgUG9wZW4sIFBJUEUKLSAgICBiYXNlX2NtZCA9IChbc3lzLmV4ZWN1dGFibGVdICsgc3VwcG9ydC5hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSArCi0gICAgICAgICAgICAgICAgWyctWCcsICdmYXVsdGhhbmRsZXInLCAnLW0nLCAndGVzdC5yZWdydGVzdCddKQotICAgICMgcmVxdWlyZWQgdG8gc3Bhd24gYSBuZXcgcHJvY2VzcyB3aXRoIFBHTyBmbGFnIG9uL29mZgotICAgIGlmIG5zLnBnbzoKLSAgICAgICAgYmFzZV9jbWQgPSBiYXNlX2NtZCArIFsnLS1wZ28nXQotICAgIHNsYXZlYXJncyA9ICgKLSAgICAgICAgICAgICh0ZXN0bmFtZSwgbnMudmVyYm9zZSwgbnMucXVpZXQpLAotICAgICAgICAgICAgZGljdChodW50cmxlYWtzPW5zLmh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgIHVzZV9yZXNvdXJjZXM9bnMudXNlX3Jlc291cmNlcywKLSAgICAgICAgICAgICAgICAgb3V0cHV0X29uX2ZhaWx1cmU9bnMudmVyYm9zZTMsCi0gICAgICAgICAgICAgICAgIHRpbWVvdXQ9bnMudGltZW91dCwgZmFpbGZhc3Q9bnMuZmFpbGZhc3QsCi0gICAgICAgICAgICAgICAgIG1hdGNoX3Rlc3RzPW5zLm1hdGNoX3Rlc3RzLCBwZ289bnMucGdvKSkKLSAgICAjIFJ1bm5pbmcgdGhlIGNoaWxkIGZyb20gdGhlIHNhbWUgd29ya2luZyBkaXJlY3RvcnkgYXMgcmVncnRlc3QncyBvcmlnaW5hbAotICAgICMgaW52b2NhdGlvbiBlbnN1cmVzIHRoYXQgVEVNUERJUiBmb3IgdGhlIGNoaWxkIGlzIHRoZSBzYW1lIHdoZW4KLSAgICAjIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKSBpcyB0cnVlLiBTZWUgaXNzdWUgMTUzMDAuCi0gICAgcG9wZW4gPSBQb3BlbihiYXNlX2NtZCArIFsnLS1zbGF2ZWFyZ3MnLCBqc29uLmR1bXBzKHNsYXZlYXJncyldLAotICAgICAgICAgICAgICAgICAgc3Rkb3V0PVBJUEUsIHN0ZGVycj1QSVBFLAotICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCi0gICAgICAgICAgICAgICAgICBjbG9zZV9mZHM9KG9zLm5hbWUgIT0gJ250JyksCi0gICAgICAgICAgICAgICAgICBjd2Q9c3VwcG9ydC5TQVZFRENXRCkKLSAgICBzdGRvdXQsIHN0ZGVyciA9IHBvcGVuLmNvbW11bmljYXRlKCkKLSAgICByZXRjb2RlID0gcG9wZW4ud2FpdCgpCi0gICAgcmV0dXJuIHJldGNvZGUsIHN0ZG91dCwgc3RkZXJyCi0KLQotZGVmIG1haW4odGVzdHM9Tm9uZSwgKiprd2FyZ3MpOgotICAgICIiIkV4ZWN1dGUgYSB0ZXN0IHN1aXRlLgotCi0gICAgVGhpcyBhbHNvIHBhcnNlcyBjb21tYW5kLWxpbmUgb3B0aW9ucyBhbmQgbW9kaWZpZXMgaXRzIGJlaGF2aW9yCi0gICAgYWNjb3JkaW5nbHkuCi0KLSAgICB0ZXN0cyAtLSBhIGxpc3Qgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRlc3QgbmFtZXMgKG9wdGlvbmFsKQotICAgIHRlc3RkaXIgLS0gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBsb29rIGZvciB0ZXN0cyAob3B0aW9uYWwpCi0KLSAgICBVc2VycyBvdGhlciB0aGFuIHRoZSBQeXRob24gdGVzdCBzdWl0ZSB3aWxsIGNlcnRhaW5seSB3YW50IHRvCi0gICAgc3BlY2lmeSB0ZXN0ZGlyOyBpZiBpdCdzIG9taXR0ZWQsIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUKLSAgICBQeXRob24gdGVzdCBzdWl0ZSBpcyBzZWFyY2hlZCBmb3IuCi0KLSAgICBJZiB0aGUgdGVzdHMgYXJndW1lbnQgaXMgb21pdHRlZCwgdGhlIHRlc3RzIGxpc3RlZCBvbiB0aGUKLSAgICBjb21tYW5kLWxpbmUgd2lsbCBiZSB1c2VkLiAgSWYgdGhhdCdzIGVtcHR5LCB0b28sIHRoZW4gYWxsICoucHkKLSAgICBmaWxlcyBiZWdpbm5pbmcgd2l0aCB0ZXN0XyB3aWxsIGJlIHVzZWQuCi0KLSAgICBUaGUgb3RoZXIgZGVmYXVsdCBhcmd1bWVudHMgKHZlcmJvc2UsIHF1aWV0LCBleGNsdWRlLAotICAgIHNpbmdsZSwgcmFuZG9taXplLCBmaW5kbGVha3MsIHVzZV9yZXNvdXJjZXMsIHRyYWNlLCBjb3ZlcmRpciwKLSAgICBwcmludF9zbG93LCBhbmQgcmFuZG9tX3NlZWQpIGFsbG93IHByb2dyYW1tZXJzIGNhbGxpbmcgbWFpbigpCi0gICAgZGlyZWN0bHkgdG8gc2V0IHRoZSB2YWx1ZXMgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBzZXQgYnkgZmxhZ3MKLSAgICBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAgICIiIgotICAgICMgRGlzcGxheSB0aGUgUHl0aG9uIHRyYWNlYmFjayBvbiBmYXRhbCBlcnJvcnMgKGUuZy4gc2VnZmF1bHQpCi0gICAgZmF1bHRoYW5kbGVyLmVuYWJsZShhbGxfdGhyZWFkcz1UcnVlKQotCi0gICAgIyBEaXNwbGF5IHRoZSBQeXRob24gdHJhY2ViYWNrIG9uIFNJR0FMUk0gb3IgU0lHVVNSMSBzaWduYWwKLSAgICBzaWduYWxzID0gW10KLSAgICBpZiBoYXNhdHRyKHNpZ25hbCwgJ1NJR0FMUk0nKToKLSAgICAgICAgc2lnbmFscy5hcHBlbmQoc2lnbmFsLlNJR0FMUk0pCi0gICAgaWYgaGFzYXR0cihzaWduYWwsICdTSUdVU1IxJyk6Ci0gICAgICAgIHNpZ25hbHMuYXBwZW5kKHNpZ25hbC5TSUdVU1IxKQotICAgIGZvciBzaWdudW0gaW4gc2lnbmFsczoKLSAgICAgICAgZmF1bHRoYW5kbGVyLnJlZ2lzdGVyKHNpZ251bSwgY2hhaW49VHJ1ZSkKLQotICAgIHJlcGxhY2Vfc3Rkb3V0KCkKLQotICAgIHN1cHBvcnQucmVjb3JkX29yaWdpbmFsX3N0ZG91dChzeXMuc3Rkb3V0KQotCi0gICAgbnMgPSBfcGFyc2VfYXJncyhzeXMuYXJndlsxOl0sICoqa3dhcmdzKQotCi0gICAgaWYgbnMuaHVudHJsZWFrczoKLSAgICAgICAgIyBBdm9pZCBmYWxzZSBwb3NpdGl2ZXMgZHVlIHRvIHZhcmlvdXMgY2FjaGVzCi0gICAgICAgICMgZmlsbGluZyBzbG93bHkgd2l0aCByYW5kb20gZGF0YToKLSAgICAgICAgd2FybV9jYWNoZXMoKQotICAgIGlmIG5zLm1lbWxpbWl0IGlzIG5vdCBOb25lOgotICAgICAgICBzdXBwb3J0LnNldF9tZW1saW1pdChucy5tZW1saW1pdCkKLSAgICBpZiBucy50aHJlc2hvbGQgaXMgbm90IE5vbmU6Ci0gICAgICAgIGltcG9ydCBnYwotICAgICAgICBnYy5zZXRfdGhyZXNob2xkKG5zLnRocmVzaG9sZCkKLSAgICBpZiBucy5ub3dpbmRvd3M6Ci0gICAgICAgIHByaW50KCdUaGUgLS1ub3dpbmRvd3MgKC1uKSBvcHRpb24gaXMgZGVwcmVjYXRlZC4gJwotICAgICAgICAgICAgICAnVXNlIC12diB0byBkaXNwbGF5IGFzc2VydGlvbnMgaW4gc3RkZXJyLicpCi0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgbXN2Y3J0Ci0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgbXN2Y3J0LlNldEVycm9yTW9kZShtc3ZjcnQuU0VNX0ZBSUxDUklUSUNBTEVSUk9SU3wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PQUxJR05NRU5URkFVTFRFWENFUFR8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LlNFTV9OT0dQRkFVTFRFUlJPUkJPWHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PT1BFTkZJTEVFUlJPUkJPWCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydE1vZGUKLSAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgIyByZWxlYXNlIGJ1aWxkCi0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmb3IgbSBpbiBbbXN2Y3J0LkNSVF9XQVJOLCBtc3ZjcnQuQ1JUX0VSUk9SLCBtc3ZjcnQuQ1JUX0FTU0VSVF06Ci0gICAgICAgICAgICAgICAgaWYgbnMudmVyYm9zZSBhbmQgbnMudmVyYm9zZSA+PSAyOgotICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCBtc3ZjcnQuQ1JUREJHX01PREVfRklMRSkKLSAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydEZpbGUobSwgbXN2Y3J0LkNSVERCR19GSUxFX1NUREVSUikKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCAwKQotICAgIGlmIG5zLndhaXQ6Ci0gICAgICAgIGlucHV0KCJQcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlLi4uIikKLQotICAgIGlmIG5zLnNsYXZlYXJncyBpcyBub3QgTm9uZToKLSAgICAgICAgYXJncywga3dhcmdzID0ganNvbi5sb2Fkcyhucy5zbGF2ZWFyZ3MpCi0gICAgICAgIGlmIGt3YXJncy5nZXQoJ2h1bnRybGVha3MnKToKLSAgICAgICAgICAgIHVuaXR0ZXN0LkJhc2VUZXN0U3VpdGUuX2NsZWFudXAgPSBGYWxzZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0KCphcmdzLCAqKmt3YXJncykKLSAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgcmVzdWx0ID0gSU5URVJSVVBURUQsICcnCi0gICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKLSAgICAgICAgICAgIHJlc3VsdCA9IENISUxEX0VSUk9SLCBzdHIoZSkKLSAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgIHByaW50KCkgICAjIEZvcmNlIGEgbmV3bGluZSAoanVzdCBpbiBjYXNlKQotICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdCkpCi0gICAgICAgIHN5cy5leGl0KDApCi0KLSAgICBnb29kID0gW10KLSAgICBiYWQgPSBbXQotICAgIHNraXBwZWQgPSBbXQotICAgIHJlc291cmNlX2RlbmllZHMgPSBbXQotICAgIGVudmlyb25tZW50X2NoYW5nZWQgPSBbXQotICAgIGludGVycnVwdGVkID0gRmFsc2UKLQotICAgIGlmIG5zLmZpbmRsZWFrczoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaW1wb3J0IGdjCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHByaW50KCdObyBHQyBhdmFpbGFibGUsIGRpc2FibGluZyBmaW5kbGVha3MuJykKLSAgICAgICAgICAgIG5zLmZpbmRsZWFrcyA9IEZhbHNlCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byByZXBvcnQgZ2FyYmFnZSB0aGF0IGlzIG5vdAotICAgICAgICAgICAgIyBmcmVlYWJsZSBieSByZWZlcmVuY2UgY291bnRpbmcgYWxvbmUuICBCeSBkZWZhdWx0IG9ubHkKLSAgICAgICAgICAgICMgZ2FyYmFnZSB0aGF0IGlzIG5vdCBjb2xsZWN0YWJsZSBieSB0aGUgR0MgaXMgcmVwb3J0ZWQuCi0gICAgICAgICAgICAjZ2Muc2V0X2RlYnVnKGdjLkRFQlVHX1NBVkVBTEwpCi0gICAgICAgICAgICBmb3VuZF9nYXJiYWdlID0gW10KLQotICAgIGlmIG5zLmh1bnRybGVha3M6Ci0gICAgICAgIHVuaXR0ZXN0LkJhc2VUZXN0U3VpdGUuX2NsZWFudXAgPSBGYWxzZQotCi0gICAgaWYgbnMuc2luZ2xlOgotICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAncHluZXh0dGVzdCcpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3InKSBhcyBmcDoKLSAgICAgICAgICAgICAgICBuZXh0X3Rlc3QgPSBmcC5yZWFkKCkuc3RyaXAoKQotICAgICAgICAgICAgICAgIHRlc3RzID0gW25leHRfdGVzdF0KLSAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICBpZiBucy5mcm9tZmlsZToKLSAgICAgICAgdGVzdHMgPSBbXQotICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIG5zLmZyb21maWxlKSkgYXMgZnA6Ci0gICAgICAgICAgICBjb3VudF9wYXQgPSByZS5jb21waWxlKHInXFtccypcZCsvXHMqXGQrXF0nKQotICAgICAgICAgICAgZm9yIGxpbmUgaW4gZnA6Ci0gICAgICAgICAgICAgICAgbGluZSA9IGNvdW50X3BhdC5zdWIoJycsIGxpbmUpCi0gICAgICAgICAgICAgICAgZ3V0cyA9IGxpbmUuc3BsaXQoKSAjIGFzc3VtaW5nIG5vIHRlc3QgaGFzIHdoaXRlc3BhY2UgaW4gaXRzIG5hbWUKLSAgICAgICAgICAgICAgICBpZiBndXRzIGFuZCBub3QgZ3V0c1swXS5zdGFydHN3aXRoKCcjJyk6Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RzLmV4dGVuZChndXRzKQotCi0gICAgIyBTdHJpcCAucHkgZXh0ZW5zaW9ucy4KLSAgICByZW1vdmVweShucy5hcmdzKQotICAgIHJlbW92ZXB5KHRlc3RzKQotCi0gICAgc3RkdGVzdHMgPSBTVERURVNUU1s6XQotICAgIG5vdHRlc3RzID0gTk9UVEVTVFMuY29weSgpCi0gICAgaWYgbnMuZXhjbHVkZToKLSAgICAgICAgZm9yIGFyZyBpbiBucy5hcmdzOgotICAgICAgICAgICAgaWYgYXJnIGluIHN0ZHRlc3RzOgotICAgICAgICAgICAgICAgIHN0ZHRlc3RzLnJlbW92ZShhcmcpCi0gICAgICAgICAgICBub3R0ZXN0cy5hZGQoYXJnKQotICAgICAgICBucy5hcmdzID0gW10KLQotICAgICMgRm9yIGEgcGFydGlhbCBydW4sIHdlIGRvIG5vdCBuZWVkIHRvIGNsdXR0ZXIgdGhlIG91dHB1dC4KLSAgICBpZiAobnMudmVyYm9zZSBvciBucy5oZWFkZXIgb3IKLSAgICAgICAgICAgIG5vdCAobnMucGdvIG9yIG5zLnF1aWV0IG9yIG5zLnNpbmdsZSBvciB0ZXN0cyBvciBucy5hcmdzKSk6Ci0gICAgICAgICMgUHJpbnQgYmFzaWMgcGxhdGZvcm0gaW5mb3JtYXRpb24KLSAgICAgICAgcHJpbnQoIj09IiwgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksICpzeXMudmVyc2lvbi5zcGxpdCgpKQotICAgICAgICBwcmludCgiPT0gICIsIHBsYXRmb3JtLnBsYXRmb3JtKGFsaWFzZWQ9VHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXMtZW5kaWFuIiAlIHN5cy5ieXRlb3JkZXIpCi0gICAgICAgIHByaW50KCI9PSAgIiwgImhhc2ggYWxnb3JpdGhtOiIsIHN5cy5oYXNoX2luZm8uYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICI2NGJpdCIgaWYgc3lzLm1heHNpemUgPiAyKiozMiBlbHNlICIzMmJpdCIpCi0gICAgICAgIHByaW50KCI9PSAgIiwgb3MuZ2V0Y3dkKCkpCi0gICAgICAgIHByaW50KCJUZXN0aW5nIHdpdGggZmxhZ3M6Iiwgc3lzLmZsYWdzKQotCi0gICAgIyBpZiB0ZXN0ZGlyIGlzIHNldCwgdGhlbiB3ZSBhcmUgbm90IHJ1bm5pbmcgdGhlIHB5dGhvbiB0ZXN0cyBzdWl0ZSwgc28KLSAgICAjIGRvbid0IGFkZCBkZWZhdWx0IHRlc3RzIHRvIGJlIGV4ZWN1dGVkIG9yIHNraXBwZWQgKHBhc3MgZW1wdHkgdmFsdWVzKQotICAgIGlmIG5zLnRlc3RkaXI6Ci0gICAgICAgIGFsbHRlc3RzID0gZmluZHRlc3RzKG5zLnRlc3RkaXIsIGxpc3QoKSwgc2V0KCkpCi0gICAgZWxzZToKLSAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMobnMudGVzdGRpciwgc3RkdGVzdHMsIG5vdHRlc3RzKQotCi0gICAgc2VsZWN0ZWQgPSB0ZXN0cyBvciBucy5hcmdzIG9yIGFsbHRlc3RzCi0gICAgaWYgbnMuc2luZ2xlOgotICAgICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkWzoxXQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBuZXh0X3NpbmdsZV90ZXN0ID0gYWxsdGVzdHNbYWxsdGVzdHMuaW5kZXgoc2VsZWN0ZWRbMF0pKzFdCi0gICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICAgICAgbmV4dF9zaW5nbGVfdGVzdCA9IE5vbmUKLSAgICAjIFJlbW92ZSBhbGwgdGhlIHNlbGVjdGVkIHRlc3RzIHRoYXQgcHJlY2VkZSBzdGFydCBpZiBpdCdzIHNldC4KLSAgICBpZiBucy5zdGFydDoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZGVsIHNlbGVjdGVkWzpzZWxlY3RlZC5pbmRleChucy5zdGFydCldCi0gICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcHJpbnQoIkNvdWxkbid0IGZpbmQgc3RhcnRpbmcgdGVzdCAoJXMpLCB1c2luZyBhbGwgdGVzdHMiICUgbnMuc3RhcnQpCi0gICAgaWYgbnMucmFuZG9taXplOgotICAgICAgICBpZiBucy5yYW5kb21fc2VlZCBpcyBOb25lOgotICAgICAgICAgICAgbnMucmFuZG9tX3NlZWQgPSByYW5kb20ucmFuZHJhbmdlKDEwMDAwMDAwKQotICAgICAgICByYW5kb20uc2VlZChucy5yYW5kb21fc2VlZCkKLSAgICAgICAgcHJpbnQoIlVzaW5nIHJhbmRvbSBzZWVkIiwgbnMucmFuZG9tX3NlZWQpCi0gICAgICAgIHJhbmRvbS5zaHVmZmxlKHNlbGVjdGVkKQotICAgIGlmIG5zLnRyYWNlOgotICAgICAgICBpbXBvcnQgdHJhY2UsIHRlbXBmaWxlCi0gICAgICAgIHRyYWNlciA9IHRyYWNlLlRyYWNlKGlnbm9yZWRpcnM9W3N5cy5iYXNlX3ByZWZpeCwgc3lzLmJhc2VfZXhlY19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBmaWxlLmdldHRlbXBkaXIoKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlPUZhbHNlLCBjb3VudD1UcnVlKQotCi0gICAgdGVzdF90aW1lcyA9IFtdCi0gICAgc3VwcG9ydC52ZXJib3NlID0gbnMudmVyYm9zZSAgICAgICMgVGVsbCB0ZXN0cyB0byBiZSBtb2RlcmF0ZWx5IHF1aWV0Ci0gICAgc3VwcG9ydC51c2VfcmVzb3VyY2VzID0gbnMudXNlX3Jlc291cmNlcwotICAgIHNhdmVfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmtleXMoKQotCi0gICAgZGVmIGFjY3VtdWxhdGVfcmVzdWx0KHRlc3QsIHJlc3VsdCk6Ci0gICAgICAgIG9rLCB0ZXN0X3RpbWUgPSByZXN1bHQKLSAgICAgICAgaWYgb2sgbm90IGluIChDSElMRF9FUlJPUiwgSU5URVJSVVBURUQpOgotICAgICAgICAgICAgdGVzdF90aW1lcy5hcHBlbmQoKHRlc3RfdGltZSwgdGVzdCkpCi0gICAgICAgIGlmIG9rID09IFBBU1NFRDoKLSAgICAgICAgICAgIGdvb2QuYXBwZW5kKHRlc3QpCi0gICAgICAgIGVsaWYgb2sgPT0gRkFJTEVEOgotICAgICAgICAgICAgYmFkLmFwcGVuZCh0ZXN0KQotICAgICAgICBlbGlmIG9rID09IEVOVl9DSEFOR0VEOgotICAgICAgICAgICAgZW52aXJvbm1lbnRfY2hhbmdlZC5hcHBlbmQodGVzdCkKLSAgICAgICAgZWxpZiBvayA9PSBTS0lQUEVEOgotICAgICAgICAgICAgc2tpcHBlZC5hcHBlbmQodGVzdCkKLSAgICAgICAgZWxpZiBvayA9PSBSRVNPVVJDRV9ERU5JRUQ6Ci0gICAgICAgICAgICBza2lwcGVkLmFwcGVuZCh0ZXN0KQotICAgICAgICAgICAgcmVzb3VyY2VfZGVuaWVkcy5hcHBlbmQodGVzdCkKLQotICAgIGlmIG5zLmZvcmV2ZXI6Ci0gICAgICAgIGRlZiB0ZXN0X2ZvcmV2ZXIodGVzdHM9bGlzdChzZWxlY3RlZCkpOgotICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICBmb3IgdGVzdCBpbiB0ZXN0czoKLSAgICAgICAgICAgICAgICAgICAgeWllbGQgdGVzdAotICAgICAgICAgICAgICAgICAgICBpZiBiYWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgdGVzdHMgPSB0ZXN0X2ZvcmV2ZXIoKQotICAgICAgICB0ZXN0X2NvdW50ID0gJycKLSAgICAgICAgdGVzdF9jb3VudF93aWR0aCA9IDMKLSAgICBlbHNlOgotICAgICAgICB0ZXN0cyA9IGl0ZXIoc2VsZWN0ZWQpCi0gICAgICAgIHRlc3RfY291bnQgPSAnL3t9Jy5mb3JtYXQobGVuKHNlbGVjdGVkKSkKLSAgICAgICAgdGVzdF9jb3VudF93aWR0aCA9IGxlbih0ZXN0X2NvdW50KSAtIDEKLQotICAgIGlmIG5zLnVzZV9tcDoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZAotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICBwcmludCgiTXVsdGlwcm9jZXNzIG9wdGlvbiByZXF1aXJlcyB0aHJlYWQgc3VwcG9ydCIpCi0gICAgICAgICAgICBzeXMuZXhpdCgyKQotICAgICAgICBmcm9tIHF1ZXVlIGltcG9ydCBRdWV1ZQotICAgICAgICBkZWJ1Z19vdXRwdXRfcGF0ID0gcmUuY29tcGlsZShyIlxbXGQrIHJlZnMsIFxkKyBibG9ja3NcXSQiKQotICAgICAgICBvdXRwdXQgPSBRdWV1ZSgpCi0gICAgICAgIHBlbmRpbmcgPSBNdWx0aXByb2Nlc3NUZXN0cyh0ZXN0cykKLSAgICAgICAgZGVmIHdvcmsoKToKLSAgICAgICAgICAgICMgQSB3b3JrZXIgdGhyZWFkLgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgPSBuZXh0KHBlbmRpbmcpCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIgPSBydW5fdGVzdF9pbl9zdWJwcm9jZXNzKHRlc3QsIG5zKQotICAgICAgICAgICAgICAgICAgICAjIFN0cmlwIGxhc3QgcmVmY291bnQgb3V0cHV0IGxpbmUgaWYgaXQgZXhpc3RzLCBzaW5jZSBpdAotICAgICAgICAgICAgICAgICAgICAjIGNvbWVzIGZyb20gdGhlIHNodXRkb3duIG9mIHRoZSBpbnRlcnByZXRlciBpbiB0aGUgc3ViY29tbWFuZC4KLSAgICAgICAgICAgICAgICAgICAgc3RkZXJyID0gZGVidWdfb3V0cHV0X3BhdC5zdWIoIiIsIHN0ZGVycikKLSAgICAgICAgICAgICAgICAgICAgc3Rkb3V0LCBfLCByZXN1bHQgPSBzdGRvdXQuc3RyaXAoKS5ycGFydGl0aW9uKCJcbiIpCi0gICAgICAgICAgICAgICAgICAgIGlmIHJldGNvZGUgIT0gMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChDSElMRF9FUlJPUiwgIkV4aXQgY29kZSAlcyIgJSByZXRjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgodGVzdCwgc3Rkb3V0LnJzdHJpcCgpLCBzdGRlcnIucnN0cmlwKCksIHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlc3VsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXQoKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpzb24ubG9hZHMocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwgcmVzdWx0KSkKLSAgICAgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgotICAgICAgICAgICAgICAgIG91dHB1dC5wdXQoKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpKQotICAgICAgICAgICAgICAgIHJhaXNlCi0gICAgICAgIHdvcmtlcnMgPSBbVGhyZWFkKHRhcmdldD13b3JrKSBmb3IgaSBpbiByYW5nZShucy51c2VfbXApXQotICAgICAgICBmb3Igd29ya2VyIGluIHdvcmtlcnM6Ci0gICAgICAgICAgICB3b3JrZXIuc3RhcnQoKQotICAgICAgICBmaW5pc2hlZCA9IDAKLSAgICAgICAgdGVzdF9pbmRleCA9IDEKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2hpbGUgZmluaXNoZWQgPCBucy51c2VfbXA6Ci0gICAgICAgICAgICAgICAgdGVzdCwgc3Rkb3V0LCBzdGRlcnIsIHJlc3VsdCA9IG91dHB1dC5nZXQoKQotICAgICAgICAgICAgICAgIGlmIHRlc3QgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgKz0gMQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVfcmVzdWx0KHRlc3QsIHJlc3VsdCkKLSAgICAgICAgICAgICAgICBpZiBub3QgbnMucXVpZXQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIGJhZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtdCA9ICJbezE6ezB9fXsyfS97M31dIHs0fSIKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtdCA9ICJbezE6ezB9fXsyfV0gezR9IgotICAgICAgICAgICAgICAgICAgICBwcmludChmbXQuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jb3VudF93aWR0aCwgdGVzdF9pbmRleCwgdGVzdF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbihiYWQpLCB0ZXN0KSkKLSAgICAgICAgICAgICAgICBpZiBzdGRvdXQ6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KHN0ZG91dCkKLSAgICAgICAgICAgICAgICBpZiBzdGRlcnIgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KHN0ZGVyciwgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBJTlRFUlJVUFRFRDoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKLSAgICAgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gQ0hJTERfRVJST1I6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQ2hpbGQgZXJyb3Igb24ge306IHt9Ii5mb3JtYXQodGVzdCwgcmVzdWx0WzFdKSkKLSAgICAgICAgICAgICAgICB0ZXN0X2luZGV4ICs9IDEKLSAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSBUcnVlCi0gICAgICAgICAgICBwZW5kaW5nLmludGVycnVwdGVkID0gVHJ1ZQotICAgICAgICBmb3Igd29ya2VyIGluIHdvcmtlcnM6Ci0gICAgICAgICAgICB3b3JrZXIuam9pbigpCi0gICAgZWxzZToKLSAgICAgICAgZm9yIHRlc3RfaW5kZXgsIHRlc3QgaW4gZW51bWVyYXRlKHRlc3RzLCAxKToKLSAgICAgICAgICAgIGlmIG5vdCBucy5xdWlldDoKLSAgICAgICAgICAgICAgICBpZiBiYWQgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgICAgICAgICAgICAgIGZtdCA9ICJbezE6ezB9fXsyfS97M31dIHs0fSIKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBmbXQgPSAiW3sxOnswfX17Mn1dIHs0fSIKLSAgICAgICAgICAgICAgICBwcmludChmbXQuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvdW50X3dpZHRoLCB0ZXN0X2luZGV4LCB0ZXN0X2NvdW50LCBsZW4oYmFkKSwgdGVzdCkpCi0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgICAgICBpZiBucy50cmFjZToKLSAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIHRyYWNpbmcgY29kZSBjb3ZlcmFnZSwgdGhlbiB3ZSBkb24ndCBleGl0IHdpdGggc3RhdHVzCi0gICAgICAgICAgICAgICAgIyBpZiBvbiBhIGZhbHNlIHJldHVybiB2YWx1ZSBmcm9tIG1haW4uCi0gICAgICAgICAgICAgICAgdHJhY2VyLnJ1bmN0eCgncnVudGVzdCh0ZXN0LCBucy52ZXJib3NlLCBucy5xdWlldCwgdGltZW91dD1ucy50aW1lb3V0KScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzPWdsb2JhbHMoKSwgbG9jYWxzPXZhcnMoKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0KHRlc3QsIG5zLnZlcmJvc2UsIG5zLnF1aWV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zLmh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X29uX2ZhaWx1cmU9bnMudmVyYm9zZTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1ucy50aW1lb3V0LCBmYWlsZmFzdD1ucy5mYWlsZmFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF90ZXN0cz1ucy5tYXRjaF90ZXN0cywgcGdvPW5zLnBnbykKLSAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQotICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSBUcnVlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBpZiBucy5maW5kbGVha3M6Ci0gICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgICAgICAgICAgaWYgZ2MuZ2FyYmFnZToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoIldhcm5pbmc6IHRlc3QgY3JlYXRlZCIsIGxlbihnYy5nYXJiYWdlKSwgZW5kPScgJykKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoInVuY29sbGVjdGFibGUgb2JqZWN0KHMpLiIpCi0gICAgICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgdW5jb2xsZWN0YWJsZSBvYmplY3RzIHNvbWV3aGVyZSBzbyB3ZSBkb24ndCBzZWUKLSAgICAgICAgICAgICAgICAgICAgIyB0aGVtIGFnYWluCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kX2dhcmJhZ2UuZXh0ZW5kKGdjLmdhcmJhZ2UpCi0gICAgICAgICAgICAgICAgICAgIGRlbCBnYy5nYXJiYWdlWzpdCi0gICAgICAgICAgICAjIFVubG9hZCB0aGUgbmV3bHkgaW1wb3J0ZWQgbW9kdWxlcyAoYmVzdCBlZmZvcnQgZmluYWxpemF0aW9uKQotICAgICAgICAgICAgZm9yIG1vZHVsZSBpbiBzeXMubW9kdWxlcy5rZXlzKCk6Ci0gICAgICAgICAgICAgICAgaWYgbW9kdWxlIG5vdCBpbiBzYXZlX21vZHVsZXMgYW5kIG1vZHVsZS5zdGFydHN3aXRoKCJ0ZXN0LiIpOgotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LnVubG9hZChtb2R1bGUpCi0KLSAgICBpZiBpbnRlcnJ1cHRlZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgIyBwcmludCBhIG5ld2xpbmUgYWZ0ZXIgXkMKLSAgICAgICAgcHJpbnQoKQotICAgICAgICBwcmludCgiVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULiIpCi0gICAgICAgIG9taXR0ZWQgPSBzZXQoc2VsZWN0ZWQpIC0gc2V0KGdvb2QpIC0gc2V0KGJhZCkgLSBzZXQoc2tpcHBlZCkKLSAgICAgICAgcHJpbnQoY291bnQobGVuKG9taXR0ZWQpLCAidGVzdCIpLCAib21pdHRlZDoiKQotICAgICAgICBwcmludGxpc3Qob21pdHRlZCkKLSAgICBpZiBnb29kIGFuZCBub3QgbnMucXVpZXQgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgIGlmIG5vdCBiYWQgYW5kIG5vdCBza2lwcGVkIGFuZCBub3QgaW50ZXJydXB0ZWQgYW5kIGxlbihnb29kKSA+IDE6Ci0gICAgICAgICAgICBwcmludCgiQWxsIiwgZW5kPScgJykKLSAgICAgICAgcHJpbnQoY291bnQobGVuKGdvb2QpLCAidGVzdCIpLCAiT0suIikKLSAgICBpZiBucy5wcmludF9zbG93OgotICAgICAgICB0ZXN0X3RpbWVzLnNvcnQocmV2ZXJzZT1UcnVlKQotICAgICAgICBwcmludCgiMTAgc2xvd2VzdCB0ZXN0czoiKQotICAgICAgICBmb3IgdGltZSwgdGVzdCBpbiB0ZXN0X3RpbWVzWzoxMF06Ci0gICAgICAgICAgICBwcmludCgiJXM6ICUuMWZzIiAlICh0ZXN0LCB0aW1lKSkKLSAgICBpZiBiYWQgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgIHByaW50KGNvdW50KGxlbihiYWQpLCAidGVzdCIpLCAiZmFpbGVkOiIpCi0gICAgICAgIHByaW50bGlzdChiYWQpCi0gICAgaWYgZW52aXJvbm1lbnRfY2hhbmdlZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgcHJpbnQoInt9IGFsdGVyZWQgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudDoiLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgY291bnQobGVuKGVudmlyb25tZW50X2NoYW5nZWQpLCAidGVzdCIpKSkKLSAgICAgICAgcHJpbnRsaXN0KGVudmlyb25tZW50X2NoYW5nZWQpCi0gICAgaWYgc2tpcHBlZCBhbmQgbm90IG5zLnF1aWV0IGFuZCBub3QgbnMucGdvOgotICAgICAgICBwcmludChjb3VudChsZW4oc2tpcHBlZCksICJ0ZXN0IiksICJza2lwcGVkOiIpCi0gICAgICAgIHByaW50bGlzdChza2lwcGVkKQotCi0gICAgaWYgbnMudmVyYm9zZTIgYW5kIGJhZDoKLSAgICAgICAgcHJpbnQoIlJlLXJ1bm5pbmcgZmFpbGVkIHRlc3RzIGluIHZlcmJvc2UgbW9kZSIpCi0gICAgICAgIGZvciB0ZXN0IGluIGJhZFs6XToKLSAgICAgICAgICAgIGlmIG5vdCBucy5wZ286Ci0gICAgICAgICAgICAgICAgcHJpbnQoIlJlLXJ1bm5pbmcgdGVzdCAlciBpbiB2ZXJib3NlIG1vZGUiICUgdGVzdCkKLSAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG5zLnZlcmJvc2UgPSBUcnVlCi0gICAgICAgICAgICAgICAgb2sgPSBydW50ZXN0KHRlc3QsIFRydWUsIG5zLnF1aWV0LCBucy5odW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PW5zLnRpbWVvdXQsIHBnbz1ucy5wZ28pCi0gICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICAgICAgIyBwcmludCBhIG5ld2xpbmUgc2VwYXJhdGUgZnJvbSB0aGUgXkMKLSAgICAgICAgICAgICAgICBwcmludCgpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgb2tbMF0gaW4ge1BBU1NFRCwgRU5WX0NIQU5HRUQsIFNLSVBQRUQsIFJFU09VUkNFX0RFTklFRH06Ci0gICAgICAgICAgICAgICAgICAgIGJhZC5yZW1vdmUodGVzdCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGlmIGJhZDoKLSAgICAgICAgICAgICAgICBwcmludChjb3VudChsZW4oYmFkKSwgJ3Rlc3QnKSwgImZhaWxlZCBhZ2FpbjoiKQotICAgICAgICAgICAgICAgIHByaW50bGlzdChiYWQpCi0KLSAgICBpZiBucy5zaW5nbGU6Ci0gICAgICAgIGlmIG5leHRfc2luZ2xlX3Rlc3Q6Ci0gICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3JykgYXMgZnA6Ci0gICAgICAgICAgICAgICAgZnAud3JpdGUobmV4dF9zaW5nbGVfdGVzdCArICdcbicpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCi0KLSAgICBpZiBucy50cmFjZToKLSAgICAgICAgciA9IHRyYWNlci5yZXN1bHRzKCkKLSAgICAgICAgci53cml0ZV9yZXN1bHRzKHNob3dfbWlzc2luZz1UcnVlLCBzdW1tYXJ5PVRydWUsIGNvdmVyZGlyPW5zLmNvdmVyZGlyKQotCi0gICAgaWYgbnMucnVubGVha3M6Ci0gICAgICAgIG9zLnN5c3RlbSgibGVha3MgJWQiICUgb3MuZ2V0cGlkKCkpCi0KLSAgICBzeXMuZXhpdChsZW4oYmFkKSA+IDAgb3IgaW50ZXJydXB0ZWQpCi0KLQotIyBzbWFsbCBzZXQgb2YgdGVzdHMgdG8gZGV0ZXJtaW5lIGlmIHdlIGhhdmUgYSBiYXNpY2FsbHkgZnVuY3Rpb25pbmcgaW50ZXJwcmV0ZXIKLSMgKGkuZS4gaWYgYW55IG9mIHRoZXNlIGZhaWwsIHRoZW4gYW55dGhpbmcgZWxzZSBpcyBsaWtlbHkgdG8gZm9sbG93KQotU1REVEVTVFMgPSBbCi0gICAgJ3Rlc3RfZ3JhbW1hcicsCi0gICAgJ3Rlc3Rfb3Bjb2RlcycsCi0gICAgJ3Rlc3RfZGljdCcsCi0gICAgJ3Rlc3RfYnVpbHRpbicsCi0gICAgJ3Rlc3RfZXhjZXB0aW9ucycsCi0gICAgJ3Rlc3RfdHlwZXMnLAotICAgICd0ZXN0X3VuaXR0ZXN0JywKLSAgICAndGVzdF9kb2N0ZXN0JywKLSAgICAndGVzdF9kb2N0ZXN0MicsCi0gICAgJ3Rlc3Rfc3VwcG9ydCcKLV0KLQotIyBzZXQgb2YgdGVzdHMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdXNpbmcgcmVncnRlc3QKLU5PVFRFU1RTID0gc2V0KCkKLQotZGVmIGZpbmR0ZXN0cyh0ZXN0ZGlyPU5vbmUsIHN0ZHRlc3RzPVNURFRFU1RTLCBub3R0ZXN0cz1OT1RURVNUUyk6Ci0gICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgYXBwbGljYWJsZSB0ZXN0IG1vZHVsZXMuIiIiCi0gICAgdGVzdGRpciA9IGZpbmR0ZXN0ZGlyKHRlc3RkaXIpCi0gICAgbmFtZXMgPSBvcy5saXN0ZGlyKHRlc3RkaXIpCi0gICAgdGVzdHMgPSBbXQotICAgIG90aGVycyA9IHNldChzdGR0ZXN0cykgfCBub3R0ZXN0cwotICAgIGZvciBuYW1lIGluIG5hbWVzOgotICAgICAgICBtb2QsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKLSAgICAgICAgaWYgbW9kWzo1XSA9PSAidGVzdF8iIGFuZCBleHQgaW4gKCIucHkiLCAiIikgYW5kIG1vZCBub3QgaW4gb3RoZXJzOgotICAgICAgICAgICAgdGVzdHMuYXBwZW5kKG1vZCkKLSAgICByZXR1cm4gc3RkdGVzdHMgKyBzb3J0ZWQodGVzdHMpCi0KLSMgV2UgZG8gbm90IHVzZSBhIGdlbmVyYXRvciBzbyBtdWx0aXBsZSB0aHJlYWRzIGNhbiBjYWxsIG5leHQoKS4KLWNsYXNzIE11bHRpcHJvY2Vzc1Rlc3RzKG9iamVjdCk6Ci0KLSAgICAiIiJBIHRocmVhZC1zYWZlIGl0ZXJhdG9yIG92ZXIgdGVzdHMgZm9yIG11bHRpcHJvY2VzcyBtb2RlLiIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RzKToKLSAgICAgICAgc2VsZi5pbnRlcnJ1cHRlZCA9IEZhbHNlCi0gICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKLSAgICAgICAgc2VsZi50ZXN0cyA9IHRlc3RzCi0KLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgX19uZXh0X18oc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5sb2NrOgotICAgICAgICAgICAgaWYgc2VsZi5pbnRlcnJ1cHRlZDoKLSAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCd0ZXN0cyBpbnRlcnJ1cHRlZCcpCi0gICAgICAgICAgICByZXR1cm4gbmV4dChzZWxmLnRlc3RzKQotCi1kZWYgcmVwbGFjZV9zdGRvdXQoKToKLSAgICAiIiJTZXQgc3Rkb3V0IGVuY29kZXIgZXJyb3IgaGFuZGxlciB0byBiYWNrc2xhc2hyZXBsYWNlIChhcyBzdGRlcnIgZXJyb3IKLSAgICBoYW5kbGVyKSB0byBhdm9pZCBVbmljb2RlRW5jb2RlRXJyb3Igd2hlbiBwcmludGluZyBhIHRyYWNlYmFjayIiIgotICAgIGltcG9ydCBhdGV4aXQKLQotICAgIHN0ZG91dCA9IHN5cy5zdGRvdXQKLSAgICBzeXMuc3Rkb3V0ID0gb3BlbihzdGRvdXQuZmlsZW5vKCksICd3JywKLSAgICAgICAgZW5jb2Rpbmc9c3Rkb3V0LmVuY29kaW5nLAotICAgICAgICBlcnJvcnM9ImJhY2tzbGFzaHJlcGxhY2UiLAotICAgICAgICBjbG9zZWZkPUZhbHNlLAotICAgICAgICBuZXdsaW5lPSdcbicpCi0KLSAgICBkZWYgcmVzdG9yZV9zdGRvdXQoKToKLSAgICAgICAgc3lzLnN0ZG91dC5jbG9zZSgpCi0gICAgICAgIHN5cy5zdGRvdXQgPSBzdGRvdXQKLSAgICBhdGV4aXQucmVnaXN0ZXIocmVzdG9yZV9zdGRvdXQpCi0KLWRlZiBydW50ZXN0KHRlc3QsIHZlcmJvc2UsIHF1aWV0LAotICAgICAgICAgICAgaHVudHJsZWFrcz1GYWxzZSwgdXNlX3Jlc291cmNlcz1Ob25lLAotICAgICAgICAgICAgb3V0cHV0X29uX2ZhaWx1cmU9RmFsc2UsIGZhaWxmYXN0PUZhbHNlLCBtYXRjaF90ZXN0cz1Ob25lLAotICAgICAgICAgICAgdGltZW91dD1Ob25lLCAqLCBwZ289RmFsc2UpOgotICAgICIiIlJ1biBhIHNpbmdsZSB0ZXN0LgotCi0gICAgdGVzdCAtLSB0aGUgbmFtZSBvZiB0aGUgdGVzdAotICAgIHZlcmJvc2UgLS0gaWYgdHJ1ZSwgcHJpbnQgbW9yZSBtZXNzYWdlcwotICAgIHF1aWV0IC0tIGlmIHRydWUsIGRvbid0IHByaW50ICdza2lwcGVkJyBtZXNzYWdlcyAocHJvYmFibHkgcmVkdW5kYW50KQotICAgIGh1bnRybGVha3MgLS0gcnVuIG11bHRpcGxlIHRpbWVzIHRvIHRlc3QgZm9yIGxlYWtzOyByZXF1aXJlcyBhIGRlYnVnCi0gICAgICAgICAgICAgICAgICBidWlsZDsgYSB0cmlwbGUgY29ycmVzcG9uZGluZyB0byAtUidzIHRocmVlIGFyZ3VtZW50cwotICAgIHVzZV9yZXNvdXJjZXMgLS0gbGlzdCBvZiBleHRyYSByZXNvdXJjZXMgdG8gdXNlCi0gICAgb3V0cHV0X29uX2ZhaWx1cmUgLS0gaWYgdHJ1ZSwgZGlzcGxheSB0ZXN0IG91dHB1dCBvbiBmYWlsdXJlCi0gICAgdGltZW91dCAtLSBkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzIG1vcmUgdGhhbgotICAgICAgICAgICAgICAgdGltZW91dCBzZWNvbmRzCi0gICAgZmFpbGZhc3QsIG1hdGNoX3Rlc3RzIC0tIFNlZSByZWdydGVzdCBjb21tYW5kLWxpbmUgZmxhZ3MgZm9yIHRoZXNlLgotICAgIHBnbyAtLSBpZiB0cnVlLCBkbyBub3QgcHJpbnQgdW5uZWNlc3NhcnkgaW5mbyB3aGVuIHJ1bm5pbmcgdGhlIHRlc3QKLSAgICAgICAgICAgZm9yIFByb2ZpbGUgR3VpZGVkIE9wdGltaXphdGlvbiBidWlsZAotCi0gICAgUmV0dXJucyB0aGUgdHVwbGUgcmVzdWx0LCB0ZXN0X3RpbWUsIHdoZXJlIHJlc3VsdCBpcyBvbmUgb2YgdGhlIGNvbnN0YW50czoKLSAgICAgICAgSU5URVJSVVBURUQgICAgICBLZXlib2FyZEludGVycnVwdCB3aGVuIHJ1biB1bmRlciAtagotICAgICAgICBSRVNPVVJDRV9ERU5JRUQgIHRlc3Qgc2tpcHBlZCBiZWNhdXNlIHJlc291cmNlIGRlbmllZAotICAgICAgICBTS0lQUEVEICAgICAgICAgIHRlc3Qgc2tpcHBlZCBmb3Igc29tZSBvdGhlciByZWFzb24KLSAgICAgICAgRU5WX0NIQU5HRUQgICAgICB0ZXN0IGZhaWxlZCBiZWNhdXNlIGl0IGNoYW5nZWQgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudAotICAgICAgICBGQUlMRUQgICAgICAgICAgIHRlc3QgZmFpbGVkCi0gICAgICAgIFBBU1NFRCAgICAgICAgICAgdGVzdCBwYXNzZWQKLSAgICAiIiIKLSAgICBpZiB1c2VfcmVzb3VyY2VzIGlzIG5vdCBOb25lOgotICAgICAgICBzdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSB1c2VfcmVzb3VyY2VzCi0gICAgdXNlX3RpbWVvdXQgPSAodGltZW91dCBpcyBub3QgTm9uZSkKLSAgICBpZiB1c2VfdGltZW91dDoKLSAgICAgICAgZmF1bHRoYW5kbGVyLmR1bXBfdHJhY2ViYWNrX2xhdGVyKHRpbWVvdXQsIGV4aXQ9VHJ1ZSkKLSAgICB0cnk6Ci0gICAgICAgIHN1cHBvcnQubWF0Y2hfdGVzdHMgPSBtYXRjaF90ZXN0cwotICAgICAgICBpZiBmYWlsZmFzdDoKLSAgICAgICAgICAgIHN1cHBvcnQuZmFpbGZhc3QgPSBUcnVlCi0gICAgICAgIGlmIG91dHB1dF9vbl9mYWlsdXJlOgotICAgICAgICAgICAgc3VwcG9ydC52ZXJib3NlID0gVHJ1ZQotCi0gICAgICAgICAgICAjIFJldXNlIHRoZSBzYW1lIGluc3RhbmNlIHRvIGFsbCBjYWxscyB0byBydW50ZXN0KCkuIFNvbWUKLSAgICAgICAgICAgICMgdGVzdHMga2VlcCBhIHJlZmVyZW5jZSB0byBzeXMuc3Rkb3V0IG9yIHN5cy5zdGRlcnIKLSAgICAgICAgICAgICMgKGVnLiB0ZXN0X2FyZ3BhcnNlKS4KLSAgICAgICAgICAgIGlmIHJ1bnRlc3Quc3RyaW5naW8gaXMgTm9uZToKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBpby5TdHJpbmdJTygpCi0gICAgICAgICAgICAgICAgcnVudGVzdC5zdHJpbmdpbyA9IHN0cmVhbQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBydW50ZXN0LnN0cmluZ2lvCi0gICAgICAgICAgICAgICAgc3RyZWFtLnNlZWsoMCkKLSAgICAgICAgICAgICAgICBzdHJlYW0udHJ1bmNhdGUoKQotCi0gICAgICAgICAgICBvcmlnX3N0ZG91dCA9IHN5cy5zdGRvdXQKLSAgICAgICAgICAgIG9yaWdfc3RkZXJyID0gc3lzLnN0ZGVycgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzdHJlYW0KLSAgICAgICAgICAgICAgICBzeXMuc3RkZXJyID0gc3RyZWFtCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdF9pbm5lcih0ZXN0LCB2ZXJib3NlLCBxdWlldCwgaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZmFpbHVyZT1GYWxzZSwgcGdvPXBnbykKLSAgICAgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gRkFJTEVEIGFuZCBub3QgcGdvOgotICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzdHJlYW0uZ2V0dmFsdWUoKQotICAgICAgICAgICAgICAgICAgICBvcmlnX3N0ZGVyci53cml0ZShvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgIG9yaWdfc3RkZXJyLmZsdXNoKCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IG9yaWdfc3Rkb3V0Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyciA9IG9yaWdfc3RkZXJyCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSB2ZXJib3NlICAjIFRlbGwgdGVzdHMgdG8gYmUgbW9kZXJhdGVseSBxdWlldAotICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdF9pbm5lcih0ZXN0LCB2ZXJib3NlLCBxdWlldCwgaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9mYWlsdXJlPW5vdCB2ZXJib3NlLCBwZ289cGdvKQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0gICAgZmluYWxseToKLSAgICAgICAgaWYgdXNlX3RpbWVvdXQ6Ci0gICAgICAgICAgICBmYXVsdGhhbmRsZXIuY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyKCkKLSAgICAgICAgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0LCB2ZXJib3NlKQotcnVudGVzdC5zdHJpbmdpbyA9IE5vbmUKLQotIyBVbml0IHRlc3RzIGFyZSBzdXBwb3NlZCB0byBsZWF2ZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IHVuY2hhbmdlZAotIyBvbmNlIHRoZXkgY29tcGxldGUuICBCdXQgc29tZXRpbWVzIHRlc3RzIGhhdmUgYnVncywgZXNwZWNpYWxseSB3aGVuCi0jIHRlc3RzIGZhaWwsIGFuZCB0aGUgY2hhbmdlcyB0byBlbnZpcm9ubWVudCBnbyBvbiB0byBtZXNzIHVwIG90aGVyCi0jIHRlc3RzLiAgVGhpcyBjYW4gY2F1c2UgaXNzdWVzIHdpdGggYnVpbGRib3Qgc3RhYmlsaXR5LCBzaW5jZSB0ZXN0cwotIyBhcmUgcnVuIGluIHJhbmRvbSBvcmRlciBhbmQgc28gcHJvYmxlbXMgbWF5IGFwcGVhciB0byBjb21lIGFuZCBnby4KLSMgVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB3ZSBjYW4gc2F2ZSBhbmQgcmVzdG9yZSB0byBtaXRpZ2F0ZSB0aGlzLCBhbmQKLSMgdGhlIGZvbGxvd2luZyBjb250ZXh0IG1hbmFnZXIgaGFuZGxlcyB0aGlzIHRhc2suCi0KLWNsYXNzIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQ6Ci0gICAgIiIiU2F2ZSBiaXRzIG9mIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCByZXN0b3JlIHRoZW0gYXQgYmxvY2sgZXhpdC4KLQotICAgICAgICB3aXRoIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQodGVzdG5hbWUsIHZlcmJvc2UsIHF1aWV0KToKLSAgICAgICAgICAgICNzdHVmZgotCi0gICAgVW5sZXNzIHF1aWV0IGlzIFRydWUsIGEgd2FybmluZyBpcyBwcmludGVkIHRvIHN0ZGVyciBpZiBhbnkgb2YKLSAgICB0aGUgc2F2ZWQgaXRlbXMgd2FzIGNoYW5nZWQgYnkgdGhlIHRlc3QuICBUaGUgYXR0cmlidXRlICdjaGFuZ2VkJwotICAgIGlzIGluaXRpYWxseSBGYWxzZSwgYnV0IGlzIHNldCB0byBUcnVlIGlmIGEgY2hhbmdlIGlzIGRldGVjdGVkLgotCi0gICAgSWYgdmVyYm9zZSBpcyBtb3JlIHRoYW4gMSwgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgc3RhdGUgb2YgY2hhbmdlZAotICAgIGl0ZW1zIGlzIGFsc28gcHJpbnRlZC4KLSAgICAiIiIKLQotICAgIGNoYW5nZWQgPSBGYWxzZQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RuYW1lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLCAqLCBwZ289RmFsc2UpOgotICAgICAgICBzZWxmLnRlc3RuYW1lID0gdGVzdG5hbWUKLSAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQotICAgICAgICBzZWxmLnF1aWV0ID0gcXVpZXQKLSAgICAgICAgc2VsZi5wZ28gPSBwZ28KLQotICAgICMgVG8gYWRkIHRoaW5ncyB0byBzYXZlIGFuZCByZXN0b3JlLCBhZGQgYSBuYW1lIFhYWCB0byB0aGUgcmVzb3VyY2VzIGxpc3QKLSAgICAjIGFuZCBhZGQgY29ycmVzcG9uZGluZyBnZXRfWFhYL3Jlc3RvcmVfWFhYIGZ1bmN0aW9ucy4gIGdldF9YWFggc2hvdWxkCi0gICAgIyByZXR1cm4gdGhlIHZhbHVlIHRvIGJlIHNhdmVkIGFuZCBjb21wYXJlZCBhZ2FpbnN0IGEgc2Vjb25kIGNhbGwgdG8gdGhlCi0gICAgIyBnZXQgZnVuY3Rpb24gd2hlbiB0ZXN0IGV4ZWN1dGlvbiBjb21wbGV0ZXMuICByZXN0b3JlX1hYWCBzaG91bGQgYWNjZXB0Ci0gICAgIyB0aGUgc2F2ZWQgdmFsdWUgYW5kIHJlc3RvcmUgdGhlIHJlc291cmNlIHVzaW5nIGl0LiAgSXQgd2lsbCBiZSBjYWxsZWQgaWYKLSAgICAjIGFuZCBvbmx5IGlmIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSBpcyBkZXRlY3RlZC4KLSAgICAjCi0gICAgIyBOb3RlOiBYWFggd2lsbCBoYXZlIGFueSAnLicgcmVwbGFjZWQgd2l0aCAnXycgY2hhcmFjdGVycyB3aGVuIGRldGVybWluaW5nCi0gICAgIyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgbmFtZXMuCi0KLSAgICByZXNvdXJjZXMgPSAoJ3N5cy5hcmd2JywgJ2N3ZCcsICdzeXMuc3RkaW4nLCAnc3lzLnN0ZG91dCcsICdzeXMuc3RkZXJyJywKLSAgICAgICAgICAgICAgICAgJ29zLmVudmlyb24nLCAnc3lzLnBhdGgnLCAnc3lzLnBhdGhfaG9va3MnLCAnX19pbXBvcnRfXycsCi0gICAgICAgICAgICAgICAgICd3YXJuaW5ncy5maWx0ZXJzJywgJ2FzeW5jb3JlLnNvY2tldF9tYXAnLAotICAgICAgICAgICAgICAgICAnbG9nZ2luZy5faGFuZGxlcnMnLCAnbG9nZ2luZy5faGFuZGxlckxpc3QnLCAnc3lzLmdldHRyYWNlJywKLSAgICAgICAgICAgICAgICAgJ3N5cy53YXJub3B0aW9ucycsCi0gICAgICAgICAgICAgICAgICMgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2NsZWFudXAoKSBtYXkgcmVsZWFzZSByZWYKLSAgICAgICAgICAgICAgICAgIyB0byBhIHRocmVhZCwgc28gY2hlY2sgcHJvY2Vzc2VzIGZpcnN0LgotICAgICAgICAgICAgICAgICAnbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2RhbmdsaW5nJywgJ3RocmVhZGluZy5fZGFuZ2xpbmcnLAotICAgICAgICAgICAgICAgICAnc3lzY29uZmlnLl9DT05GSUdfVkFSUycsICdzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUycsCi0gICAgICAgICAgICAgICAgICdmaWxlcycsICdsb2NhbGUnLCAnd2FybmluZ3Muc2hvd3dhcm5pbmcnLAotICAgICAgICAgICAgICAgICAnc2h1dGlsX2FyY2hpdmVfZm9ybWF0cycsICdzaHV0aWxfdW5wYWNrX2Zvcm1hdHMnLAotICAgICAgICAgICAgICAgICkKLQotICAgIGRlZiBnZXRfc3lzX2FyZ3Yoc2VsZik6Ci0gICAgICAgIHJldHVybiBpZChzeXMuYXJndiksIHN5cy5hcmd2LCBzeXMuYXJndls6XQotICAgIGRlZiByZXN0b3JlX3N5c19hcmd2KHNlbGYsIHNhdmVkX2FyZ3YpOgotICAgICAgICBzeXMuYXJndiA9IHNhdmVkX2FyZ3ZbMV0KLSAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlZF9hcmd2WzJdCi0KLSAgICBkZWYgZ2V0X2N3ZChzZWxmKToKLSAgICAgICAgcmV0dXJuIG9zLmdldGN3ZCgpCi0gICAgZGVmIHJlc3RvcmVfY3dkKHNlbGYsIHNhdmVkX2N3ZCk6Ci0gICAgICAgIG9zLmNoZGlyKHNhdmVkX2N3ZCkKLQotICAgIGRlZiBnZXRfc3lzX3N0ZG91dChzZWxmKToKLSAgICAgICAgcmV0dXJuIHN5cy5zdGRvdXQKLSAgICBkZWYgcmVzdG9yZV9zeXNfc3Rkb3V0KHNlbGYsIHNhdmVkX3N0ZG91dCk6Ci0gICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlZF9zdGRvdXQKLQotICAgIGRlZiBnZXRfc3lzX3N0ZGVycihzZWxmKToKLSAgICAgICAgcmV0dXJuIHN5cy5zdGRlcnIKLSAgICBkZWYgcmVzdG9yZV9zeXNfc3RkZXJyKHNlbGYsIHNhdmVkX3N0ZGVycik6Ci0gICAgICAgIHN5cy5zdGRlcnIgPSBzYXZlZF9zdGRlcnIKLQotICAgIGRlZiBnZXRfc3lzX3N0ZGluKHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLnN0ZGluCi0gICAgZGVmIHJlc3RvcmVfc3lzX3N0ZGluKHNlbGYsIHNhdmVkX3N0ZGluKToKLSAgICAgICAgc3lzLnN0ZGluID0gc2F2ZWRfc3RkaW4KLQotICAgIGRlZiBnZXRfb3NfZW52aXJvbihzZWxmKToKLSAgICAgICAgcmV0dXJuIGlkKG9zLmVudmlyb24pLCBvcy5lbnZpcm9uLCBkaWN0KG9zLmVudmlyb24pCi0gICAgZGVmIHJlc3RvcmVfb3NfZW52aXJvbihzZWxmLCBzYXZlZF9lbnZpcm9uKToKLSAgICAgICAgb3MuZW52aXJvbiA9IHNhdmVkX2Vudmlyb25bMV0KLSAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCi0gICAgICAgIG9zLmVudmlyb24udXBkYXRlKHNhdmVkX2Vudmlyb25bMl0pCi0KLSAgICBkZWYgZ2V0X3N5c19wYXRoKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGgpLCBzeXMucGF0aCwgc3lzLnBhdGhbOl0KLSAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aChzZWxmLCBzYXZlZF9wYXRoKToKLSAgICAgICAgc3lzLnBhdGggPSBzYXZlZF9wYXRoWzFdCi0gICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZWRfcGF0aFsyXQotCi0gICAgZGVmIGdldF9zeXNfcGF0aF9ob29rcyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGlkKHN5cy5wYXRoX2hvb2tzKSwgc3lzLnBhdGhfaG9va3MsIHN5cy5wYXRoX2hvb2tzWzpdCi0gICAgZGVmIHJlc3RvcmVfc3lzX3BhdGhfaG9va3Moc2VsZiwgc2F2ZWRfaG9va3MpOgotICAgICAgICBzeXMucGF0aF9ob29rcyA9IHNhdmVkX2hvb2tzWzFdCi0gICAgICAgIHN5cy5wYXRoX2hvb2tzWzpdID0gc2F2ZWRfaG9va3NbMl0KLQotICAgIGRlZiBnZXRfc3lzX2dldHRyYWNlKHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLmdldHRyYWNlKCkKLSAgICBkZWYgcmVzdG9yZV9zeXNfZ2V0dHJhY2Uoc2VsZiwgdHJhY2VfZnhuKToKLSAgICAgICAgc3lzLnNldHRyYWNlKHRyYWNlX2Z4bikKLQotICAgIGRlZiBnZXRfX19pbXBvcnRfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGJ1aWx0aW5zLl9faW1wb3J0X18KLSAgICBkZWYgcmVzdG9yZV9fX2ltcG9ydF9fKHNlbGYsIGltcG9ydF8pOgotICAgICAgICBidWlsdGlucy5fX2ltcG9ydF9fID0gaW1wb3J0XwotCi0gICAgZGVmIGdldF93YXJuaW5nc19maWx0ZXJzKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQod2FybmluZ3MuZmlsdGVycyksIHdhcm5pbmdzLmZpbHRlcnMsIHdhcm5pbmdzLmZpbHRlcnNbOl0KLSAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19maWx0ZXJzKHNlbGYsIHNhdmVkX2ZpbHRlcnMpOgotICAgICAgICB3YXJuaW5ncy5maWx0ZXJzID0gc2F2ZWRfZmlsdGVyc1sxXQotICAgICAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gc2F2ZWRfZmlsdGVyc1syXQotCi0gICAgZGVmIGdldF9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYpOgotICAgICAgICBhc3luY29yZSA9IHN5cy5tb2R1bGVzLmdldCgnYXN5bmNvcmUnKQotICAgICAgICAjIFhYWCBNYWtpbmcgYSBjb3B5IGtlZXBzIG9iamVjdHMgYWxpdmUgdW50aWwgX19leGl0X18gZ2V0cyBjYWxsZWQuCi0gICAgICAgIHJldHVybiBhc3luY29yZSBhbmQgYXN5bmNvcmUuc29ja2V0X21hcC5jb3B5KCkgb3Ige30KLSAgICBkZWYgcmVzdG9yZV9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYsIHNhdmVkX21hcCk6Ci0gICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCi0gICAgICAgIGlmIGFzeW5jb3JlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKGlnbm9yZV9hbGw9VHJ1ZSkKLSAgICAgICAgICAgIGFzeW5jb3JlLnNvY2tldF9tYXAudXBkYXRlKHNhdmVkX21hcCkKLQotICAgIGRlZiBnZXRfc2h1dGlsX2FyY2hpdmVfZm9ybWF0cyhzZWxmKToKLSAgICAgICAgIyB3ZSBjb3VsZCBjYWxsIGdldF9hcmNoaXZlc19mb3JtYXRzKCkgYnV0IHRoYXQgb25seSByZXR1cm5zIHRoZQotICAgICAgICAjIHJlZ2lzdHJ5IGtleXM7IHdlIHdhbnQgdG8gY2hlY2sgdGhlIHZhbHVlcyB0b28gKHRoZSBmdW5jdGlvbnMgdGhhdAotICAgICAgICAjIGFyZSByZWdpc3RlcmVkKQotICAgICAgICByZXR1cm4gc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMsIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNvcHkoKQotICAgIGRlZiByZXN0b3JlX3NodXRpbF9hcmNoaXZlX2Zvcm1hdHMoc2VsZiwgc2F2ZWQpOgotICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUyA9IHNhdmVkWzBdCi0gICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNsZWFyKCkKLSAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMudXBkYXRlKHNhdmVkWzFdKQotCi0gICAgZGVmIGdldF9zaHV0aWxfdW5wYWNrX2Zvcm1hdHMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLCBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNvcHkoKQotICAgIGRlZiByZXN0b3JlX3NodXRpbF91bnBhY2tfZm9ybWF0cyhzZWxmLCBzYXZlZCk6Ci0gICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMgPSBzYXZlZFswXQotICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNsZWFyKCkKLSAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUy51cGRhdGUoc2F2ZWRbMV0pCi0KLSAgICBkZWYgZ2V0X2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYpOgotICAgICAgICAjIF9oYW5kbGVycyBpcyBhIFdlYWtWYWx1ZURpY3Rpb25hcnkKLSAgICAgICAgcmV0dXJuIGlkKGxvZ2dpbmcuX2hhbmRsZXJzKSwgbG9nZ2luZy5faGFuZGxlcnMsIGxvZ2dpbmcuX2hhbmRsZXJzLmNvcHkoKQotICAgIGRlZiByZXN0b3JlX2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYsIHNhdmVkX2hhbmRsZXJzKToKLSAgICAgICAgIyBDYW4ndCBlYXNpbHkgcmV2ZXJ0IHRoZSBsb2dnaW5nIHN0YXRlCi0gICAgICAgIHBhc3MKLQotICAgIGRlZiBnZXRfbG9nZ2luZ19faGFuZGxlckxpc3Qoc2VsZik6Ci0gICAgICAgICMgX2hhbmRsZXJMaXN0IGlzIGEgbGlzdCBvZiB3ZWFrcmVmcyB0byBoYW5kbGVycwotICAgICAgICByZXR1cm4gaWQobG9nZ2luZy5faGFuZGxlckxpc3QpLCBsb2dnaW5nLl9oYW5kbGVyTGlzdCwgbG9nZ2luZy5faGFuZGxlckxpc3RbOl0KLSAgICBkZWYgcmVzdG9yZV9sb2dnaW5nX19oYW5kbGVyTGlzdChzZWxmLCBzYXZlZF9oYW5kbGVyTGlzdCk6Ci0gICAgICAgICMgQ2FuJ3QgZWFzaWx5IHJldmVydCB0aGUgbG9nZ2luZyBzdGF0ZQotICAgICAgICBwYXNzCi0KLSAgICBkZWYgZ2V0X3N5c193YXJub3B0aW9ucyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGlkKHN5cy53YXJub3B0aW9ucyksIHN5cy53YXJub3B0aW9ucywgc3lzLndhcm5vcHRpb25zWzpdCi0gICAgZGVmIHJlc3RvcmVfc3lzX3dhcm5vcHRpb25zKHNlbGYsIHNhdmVkX29wdGlvbnMpOgotICAgICAgICBzeXMud2Fybm9wdGlvbnMgPSBzYXZlZF9vcHRpb25zWzFdCi0gICAgICAgIHN5cy53YXJub3B0aW9uc1s6XSA9IHNhdmVkX29wdGlvbnNbMl0KLQotICAgICMgQ29udHJvbGxpbmcgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byBUaHJlYWQgb2JqZWN0cyBjYW4gbWFrZSBpdCBlYXNpZXIKLSAgICAjIHRvIHRyYWNrIHJlZmVyZW5jZSBsZWFrcy4KLSAgICBkZWYgZ2V0X3RocmVhZGluZ19fZGFuZ2xpbmcoc2VsZik6Ci0gICAgICAgIGlmIG5vdCB0aHJlYWRpbmc6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAjIFRoaXMgY29waWVzIHRoZSB3ZWFrcmVmcyB3aXRob3V0IG1ha2luZyBhbnkgc3Ryb25nIHJlZmVyZW5jZQotICAgICAgICByZXR1cm4gdGhyZWFkaW5nLl9kYW5nbGluZy5jb3B5KCkKLSAgICBkZWYgcmVzdG9yZV90aHJlYWRpbmdfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKLSAgICAgICAgaWYgbm90IHRocmVhZGluZzoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICB0aHJlYWRpbmcuX2RhbmdsaW5nLmNsZWFyKCkKLSAgICAgICAgdGhyZWFkaW5nLl9kYW5nbGluZy51cGRhdGUoc2F2ZWQpCi0KLSAgICAjIFNhbWUgZm9yIFByb2Nlc3Mgb2JqZWN0cwotICAgIGRlZiBnZXRfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYpOgotICAgICAgICBpZiBub3QgbXVsdGlwcm9jZXNzaW5nOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgIyBVbmpvaW5lZCBwcm9jZXNzIG9iamVjdHMgY2FuIHN1cnZpdmUgYWZ0ZXIgcHJvY2VzcyBleGl0cwotICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fY2xlYW51cCgpCi0gICAgICAgICMgVGhpcyBjb3BpZXMgdGhlIHdlYWtyZWZzIHdpdGhvdXQgbWFraW5nIGFueSBzdHJvbmcgcmVmZXJlbmNlCi0gICAgICAgIHJldHVybiBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKLSAgICAgICAgaWYgbm90IG11bHRpcHJvY2Vzc2luZzoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY2xlYXIoKQotICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcudXBkYXRlKHNhdmVkKQotCi0gICAgZGVmIGdldF9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYpOgotICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgZGljdCBpcyBpbml0aWFsaXplZAotICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3ByZWZpeCcpCi0gICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9DT05GSUdfVkFSUyksIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMsCi0gICAgICAgICAgICAgICAgZGljdChzeXNjb25maWcuX0NPTkZJR19WQVJTKSkKLSAgICBkZWYgcmVzdG9yZV9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYsIHNhdmVkKToKLSAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUyA9IHNhdmVkWzFdCi0gICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMuY2xlYXIoKQotICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTLnVwZGF0ZShzYXZlZFsyXSkKLQotICAgIGRlZiBnZXRfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZik6Ci0gICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMpLCBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUywKLSAgICAgICAgICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy5jb3B5KCkpCi0gICAgZGVmIHJlc3RvcmVfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZiwgc2F2ZWQpOgotICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUyA9IHNhdmVkWzFdCi0gICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLmNsZWFyKCkKLSAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMudXBkYXRlKHNhdmVkWzJdKQotCi0gICAgZGVmIGdldF9maWxlcyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNvcnRlZChmbiArICgnLycgaWYgb3MucGF0aC5pc2RpcihmbikgZWxzZSAnJykKLSAgICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gb3MubGlzdGRpcigpKQotICAgIGRlZiByZXN0b3JlX2ZpbGVzKHNlbGYsIHNhdmVkX3ZhbHVlKToKLSAgICAgICAgZm4gPSBzdXBwb3J0LlRFU1RGTgotICAgICAgICBpZiBmbiBub3QgaW4gc2F2ZWRfdmFsdWUgYW5kIChmbiArICcvJykgbm90IGluIHNhdmVkX3ZhbHVlOgotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm4pOgotICAgICAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKGZuKQotICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGZuKToKLSAgICAgICAgICAgICAgICBzdXBwb3J0LnJtdHJlZShmbikKLQotICAgIF9sYyA9IFtnZXRhdHRyKGxvY2FsZSwgbGMpIGZvciBsYyBpbiBkaXIobG9jYWxlKQotICAgICAgICAgICBpZiBsYy5zdGFydHN3aXRoKCdMQ18nKV0KLSAgICBkZWYgZ2V0X2xvY2FsZShzZWxmKToKLSAgICAgICAgcGFpcmluZ3MgPSBbXQotICAgICAgICBmb3IgbGMgaW4gc2VsZi5fbGM6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcGFpcmluZ3MuYXBwZW5kKChsYywgbG9jYWxlLnNldGxvY2FsZShsYywgTm9uZSkpKQotICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIHJldHVybiBwYWlyaW5ncwotICAgIGRlZiByZXN0b3JlX2xvY2FsZShzZWxmLCBzYXZlZCk6Ci0gICAgICAgIGZvciBsYywgc2V0dGluZyBpbiBzYXZlZDoKLSAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobGMsIHNldHRpbmcpCi0KLSAgICBkZWYgZ2V0X3dhcm5pbmdzX3Nob3d3YXJuaW5nKHNlbGYpOgotICAgICAgICByZXR1cm4gd2FybmluZ3Muc2hvd3dhcm5pbmcKLSAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19zaG93d2FybmluZyhzZWxmLCBmeG4pOgotICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZyA9IGZ4bgotCi0gICAgZGVmIHJlc291cmNlX2luZm8oc2VsZik6Ci0gICAgICAgIGZvciBuYW1lIGluIHNlbGYucmVzb3VyY2VzOgotICAgICAgICAgICAgbWV0aG9kX3N1ZmZpeCA9IG5hbWUucmVwbGFjZSgnLicsICdfJykKLSAgICAgICAgICAgIGdldF9uYW1lID0gJ2dldF8nICsgbWV0aG9kX3N1ZmZpeAotICAgICAgICAgICAgcmVzdG9yZV9uYW1lID0gJ3Jlc3RvcmVfJyArIG1ldGhvZF9zdWZmaXgKLSAgICAgICAgICAgIHlpZWxkIG5hbWUsIGdldGF0dHIoc2VsZiwgZ2V0X25hbWUpLCBnZXRhdHRyKHNlbGYsIHJlc3RvcmVfbmFtZSkKLQotICAgIGRlZiBfX2VudGVyX18oc2VsZik6Ci0gICAgICAgIHNlbGYuc2F2ZWRfdmFsdWVzID0gZGljdCgobmFtZSwgZ2V0KCkpIGZvciBuYW1lLCBnZXQsIHJlc3RvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHNlbGYucmVzb3VyY2VfaW5mbygpKQotICAgICAgICByZXR1cm4gc2VsZgotCi0gICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgotICAgICAgICBzYXZlZF92YWx1ZXMgPSBzZWxmLnNhdmVkX3ZhbHVlcwotICAgICAgICBkZWwgc2VsZi5zYXZlZF92YWx1ZXMKLSAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkgICMgU29tZSByZXNvdXJjZXMgdXNlIHdlYWsgcmVmZXJlbmNlcwotICAgICAgICBmb3IgbmFtZSwgZ2V0LCByZXN0b3JlIGluIHNlbGYucmVzb3VyY2VfaW5mbygpOgotICAgICAgICAgICAgY3VycmVudCA9IGdldCgpCi0gICAgICAgICAgICBvcmlnaW5hbCA9IHNhdmVkX3ZhbHVlcy5wb3AobmFtZSkKLSAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlJ3MgdmFsdWUKLSAgICAgICAgICAgIGlmIGN1cnJlbnQgIT0gb3JpZ2luYWw6Ci0gICAgICAgICAgICAgICAgc2VsZi5jaGFuZ2VkID0gVHJ1ZQotICAgICAgICAgICAgICAgIHJlc3RvcmUob3JpZ2luYWwpCi0gICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucXVpZXQgYW5kIG5vdCBzZWxmLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoIldhcm5pbmcgLS0ge30gd2FzIG1vZGlmaWVkIGJ5IHt9Ii5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgc2VsZi50ZXN0bmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAxIGFuZCBub3Qgc2VsZi5wZ286Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiICBCZWZvcmU6IHt9XG4gIEFmdGVyOiAge30gIi5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLCBjdXJyZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotCi1kZWYgcnVudGVzdF9pbm5lcih0ZXN0LCB2ZXJib3NlLCBxdWlldCwKLSAgICAgICAgICAgICAgICAgIGh1bnRybGVha3M9RmFsc2UsIGRpc3BsYXlfZmFpbHVyZT1UcnVlLCBwZ289RmFsc2UpOgotICAgIHN1cHBvcnQudW5sb2FkKHRlc3QpCi0KLSAgICB0ZXN0X3RpbWUgPSAwLjAKLSAgICByZWZsZWFrID0gRmFsc2UgICMgVHJ1ZSBpZiB0aGUgdGVzdCBsZWFrZWQgcmVmZXJlbmNlcy4KLSAgICB0cnk6Ci0gICAgICAgIGlmIHRlc3Quc3RhcnRzd2l0aCgndGVzdC4nKToKLSAgICAgICAgICAgIGFic3Rlc3QgPSB0ZXN0Ci0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIEFsd2F5cyBpbXBvcnQgaXQgZnJvbSB0aGUgdGVzdCBwYWNrYWdlCi0gICAgICAgICAgICBhYnN0ZXN0ID0gJ3Rlc3QuJyArIHRlc3QKLSAgICAgICAgd2l0aCBzYXZlZF90ZXN0X2Vudmlyb25tZW50KHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBwZ289cGdvKSBhcyBlbnZpcm9ubWVudDoKLSAgICAgICAgICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQotICAgICAgICAgICAgdGhlX21vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKGFic3Rlc3QpCi0gICAgICAgICAgICAjIElmIHRoZSB0ZXN0IGhhcyBhIHRlc3RfbWFpbiwgdGhhdCB3aWxsIHJ1biB0aGUgYXBwcm9wcmlhdGUKLSAgICAgICAgICAgICMgdGVzdHMuICBJZiBub3QsIHVzZSBub3JtYWwgdW5pdHRlc3QgdGVzdCBsb2FkaW5nLgotICAgICAgICAgICAgdGVzdF9ydW5uZXIgPSBnZXRhdHRyKHRoZV9tb2R1bGUsICJ0ZXN0X21haW4iLCBOb25lKQotICAgICAgICAgICAgaWYgdGVzdF9ydW5uZXIgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBkZWYgdGVzdF9ydW5uZXIoKToKLSAgICAgICAgICAgICAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCi0gICAgICAgICAgICAgICAgICAgIHRlc3RzID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUodGhlX21vZHVsZSkKLSAgICAgICAgICAgICAgICAgICAgZm9yIGVycm9yIGluIGxvYWRlci5lcnJvcnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludChlcnJvciwgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBpZiBsb2FkZXIuZXJyb3JzOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJlcnJvcnMgd2hpbGUgbG9hZGluZyB0ZXN0cyIpCi0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KHRlc3RzKQotICAgICAgICAgICAgdGVzdF9ydW5uZXIoKQotICAgICAgICAgICAgaWYgaHVudHJsZWFrczoKLSAgICAgICAgICAgICAgICByZWZsZWFrID0gZGFzaF9SKHRoZV9tb2R1bGUsIHRlc3QsIHRlc3RfcnVubmVyLCBodW50cmxlYWtzKQotICAgICAgICAgICAgdGVzdF90aW1lID0gdGltZS50aW1lKCkgLSBzdGFydF90aW1lCi0gICAgZXhjZXB0IHN1cHBvcnQuUmVzb3VyY2VEZW5pZWQgYXMgbXNnOgotICAgICAgICBpZiBub3QgcXVpZXQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICBwcmludCh0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZykKLSAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICByZXR1cm4gUkVTT1VSQ0VfREVOSUVELCB0ZXN0X3RpbWUKLSAgICBleGNlcHQgdW5pdHRlc3QuU2tpcFRlc3QgYXMgbXNnOgotICAgICAgICBpZiBub3QgcXVpZXQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICBwcmludCh0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZykKLSAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICByZXR1cm4gU0tJUFBFRCwgdGVzdF90aW1lCi0gICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICByYWlzZQotICAgIGV4Y2VwdCBzdXBwb3J0LlRlc3RGYWlsZWQgYXMgbXNnOgotICAgICAgICBpZiBub3QgcGdvOgotICAgICAgICAgICAgaWYgZGlzcGxheV9mYWlsdXJlOgotICAgICAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImZhaWxlZCAtLSIsIG1zZywgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJmYWlsZWQiLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKLSAgICBleGNlcHQ6Ci0gICAgICAgIG1zZyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjKCkKLSAgICAgICAgaWYgbm90IHBnbzoKLSAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImNyYXNoZWQgLS0iLCBtc2csIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQotICAgIGVsc2U6Ci0gICAgICAgIGlmIHJlZmxlYWs6Ci0gICAgICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKLSAgICAgICAgaWYgZW52aXJvbm1lbnQuY2hhbmdlZDoKLSAgICAgICAgICAgIHJldHVybiBFTlZfQ0hBTkdFRCwgdGVzdF90aW1lCi0gICAgICAgIHJldHVybiBQQVNTRUQsIHRlc3RfdGltZQotCi1kZWYgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0bmFtZSwgdmVyYm9zZSk6Ci0gICAgaW1wb3J0IHNodXRpbAotICAgIGltcG9ydCBzdGF0Ci0gICAgaW1wb3J0IGdjCi0KLSAgICAjIEZpcnN0IGtpbGwgYW55IGRhbmdsaW5nIHJlZmVyZW5jZXMgdG8gb3BlbiBmaWxlcyBldGMuCi0gICAgIyBUaGlzIGNhbiBhbHNvIGlzc3VlIHNvbWUgUmVzb3VyY2VXYXJuaW5ncyB3aGljaCB3b3VsZCBvdGhlcndpc2UgZ2V0Ci0gICAgIyB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgdGVzdCBydW4sIGFuZCBwb3NzaWJseSBwcm9kdWNlIGZhaWx1cmVzLgotICAgIGdjLmNvbGxlY3QoKQotCi0gICAgIyBUcnkgdG8gY2xlYW4gdXAganVuayBjb21tb25seSBsZWZ0IGJlaGluZC4gIFdoaWxlIHRlc3RzIHNob3VsZG4ndCBsZWF2ZQotICAgICMgYW55IGZpbGVzIG9yIGRpcmVjdG9yaWVzIGJlaGluZCwgd2hlbiBhIHRlc3QgZmFpbHMgdGhhdCBjYW4gYmUgdGVkaW91cwotICAgICMgZm9yIGl0IHRvIGFycmFuZ2UuICBUaGUgY29uc2VxdWVuY2VzIGNhbiBiZSBlc3BlY2lhbGx5IG5hc3R5IG9uIFdpbmRvd3MsCi0gICAgIyBzaW5jZSBpZiBhIHRlc3QgbGVhdmVzIGEgZmlsZSBvcGVuLCBpdCBjYW5ub3QgYmUgZGVsZXRlZCBieSBuYW1lICh3aGlsZQotICAgICMgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGF0IGhlcmUgZWl0aGVyLCB3ZSBjYW4gZGlzcGxheSB0aGUKLSAgICAjIG5hbWUgb2YgdGhlIG9mZmVuZGluZyB0ZXN0LCB3aGljaCBpcyBhIHJlYWwgaGVscCkuCi0gICAgZm9yIG5hbWUgaW4gKHN1cHBvcnQuVEVTVEZOLAotICAgICAgICAgICAgICAgICAiZGJfaG9tZSIsCi0gICAgICAgICAgICAgICAgKToKLSAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOgotICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZGlyZWN0b3J5Iiwgc2h1dGlsLnJtdHJlZQotICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hbWUpOgotICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZmlsZSIsIG9zLnVubGluawotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoIm9zLnBhdGggc2F5cyAlciBleGlzdHMgYnV0IGlzIG5laXRoZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSBub3IgZmlsZSIgJSBuYW1lKQotCi0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCgiJXIgbGVmdCBiZWhpbmQgJXMgJXIiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGNobW9kLCBmaXggcG9zc2libGUgcGVybWlzc2lvbnMgcHJvYmxlbXMKLSAgICAgICAgICAgICMgdGhhdCBtaWdodCBwcmV2ZW50IGNsZWFudXAKLSAgICAgICAgICAgIGlmIChoYXNhdHRyKG9zLCAnY2htb2QnKSk6Ci0gICAgICAgICAgICAgICAgb3MuY2htb2QobmFtZSwgc3RhdC5TX0lSV1hVIHwgc3RhdC5TX0lSV1hHIHwgc3RhdC5TX0lSV1hPKQotICAgICAgICAgICAgbnVrZXIobmFtZSkKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBtc2c6Ci0gICAgICAgICAgICBwcmludCgoIiVyIGxlZnQgYmVoaW5kICVzICVyIGFuZCBpdCBjb3VsZG4ndCBiZSAiCi0gICAgICAgICAgICAgICAgInJlbW92ZWQ6ICVzIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSwgbXNnKSksIGZpbGU9c3lzLnN0ZGVycikKLQotZGVmIGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCBpbmRpcmVjdF90ZXN0LCBodW50cmxlYWtzKToKLSAgICAiIiJSdW4gYSB0ZXN0IG11bHRpcGxlIHRpbWVzLCBsb29raW5nIGZvciByZWZlcmVuY2UgbGVha3MuCi0KLSAgICBSZXR1cm5zOgotICAgICAgICBGYWxzZSBpZiB0aGUgdGVzdCBkaWRuJ3QgbGVhayByZWZlcmVuY2VzOyBUcnVlIGlmIHdlIGRldGVjdGVkIHJlZmxlYWtzLgotICAgICIiIgotICAgICMgVGhpcyBjb2RlIGlzIGhhY2tpc2ggYW5kIGluZWxlZ2FudCwgYnV0IGl0IHNlZW1zIHRvIGRvIHRoZSBqb2IuCi0gICAgaW1wb3J0IGNvcHlyZWcKLSAgICBpbXBvcnQgY29sbGVjdGlvbnMuYWJjCi0KLSAgICBpZiBub3QgaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50Jyk6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVHJhY2tpbmcgcmVmZXJlbmNlIGxlYWtzIHJlcXVpcmVzIGEgZGVidWcgYnVpbGQgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9mIFB5dGhvbiIpCi0KLSAgICAjIFNhdmUgY3VycmVudCB2YWx1ZXMgZm9yIGRhc2hfUl9jbGVhbnVwKCkgdG8gcmVzdG9yZS4KLSAgICBmcyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KLSAgICBwcyA9IGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUuY29weSgpCi0gICAgcGljID0gc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY29weSgpCi0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgemlwaW1wb3J0Ci0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICB6ZGMgPSBOb25lICMgUnVuIHVubW9kaWZpZWQgb24gcGxhdGZvcm1zIHdpdGhvdXQgemlwaW1wb3J0IHN1cHBvcnQKLSAgICBlbHNlOgotICAgICAgICB6ZGMgPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY29weSgpCi0gICAgYWJjcyA9IHt9Ci0gICAgZm9yIGFiYyBpbiBbZ2V0YXR0cihjb2xsZWN0aW9ucy5hYmMsIGEpIGZvciBhIGluIGNvbGxlY3Rpb25zLmFiYy5fX2FsbF9fXToKLSAgICAgICAgaWYgbm90IGlzYWJzdHJhY3QoYWJjKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZvciBvYmogaW4gYWJjLl9fc3ViY2xhc3Nlc19fKCkgKyBbYWJjXToKLSAgICAgICAgICAgIGFiY3Nbb2JqXSA9IG9iai5fYWJjX3JlZ2lzdHJ5LmNvcHkoKQotCi0gICAgbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lID0gaHVudHJsZWFrcwotICAgIGZuYW1lID0gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIGZuYW1lKQotICAgIHJlcGNvdW50ID0gbndhcm11cCArIG50cmFja2VkCi0gICAgcmNfZGVsdGFzID0gWzBdICogcmVwY291bnQKLSAgICBhbGxvY19kZWx0YXMgPSBbMF0gKiByZXBjb3VudAotCi0gICAgcHJpbnQoImJlZ2lubmluZyIsIHJlcGNvdW50LCAicmVwZXRpdGlvbnMiLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgcHJpbnQoKCIxMjM0NTY3ODkwIioocmVwY291bnQvLzEwICsgMSkpWzpyZXBjb3VudF0sIGZpbGU9c3lzLnN0ZGVycikKLSAgICBzeXMuc3RkZXJyLmZsdXNoKCkKLSAgICBmb3IgaSBpbiByYW5nZShyZXBjb3VudCk6Ci0gICAgICAgIGluZGlyZWN0X3Rlc3QoKQotICAgICAgICBhbGxvY19hZnRlciwgcmNfYWZ0ZXIgPSBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYywgemRjLCBhYmNzKQotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCcuJykKLSAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgIGlmIGkgPj0gbndhcm11cDoKLSAgICAgICAgICAgIHJjX2RlbHRhc1tpXSA9IHJjX2FmdGVyIC0gcmNfYmVmb3JlCi0gICAgICAgICAgICBhbGxvY19kZWx0YXNbaV0gPSBhbGxvY19hZnRlciAtIGFsbG9jX2JlZm9yZQotICAgICAgICBhbGxvY19iZWZvcmUsIHJjX2JlZm9yZSA9IGFsbG9jX2FmdGVyLCByY19hZnRlcgotICAgIHByaW50KGZpbGU9c3lzLnN0ZGVycikKLSAgICAjIFRoZXNlIGNoZWNrZXJzIHJldHVybiBGYWxzZSBvbiBzdWNjZXNzLCBUcnVlIG9uIGZhaWx1cmUKLSAgICBkZWYgY2hlY2tfcmNfZGVsdGFzKGRlbHRhcyk6Ci0gICAgICAgIHJldHVybiBhbnkoZGVsdGFzKQotICAgIGRlZiBjaGVja19hbGxvY19kZWx0YXMoZGVsdGFzKToKLSAgICAgICAgIyBBdCBsZWFzdCAxLzNyZCBvZiAwcwotICAgICAgICBpZiAzICogZGVsdGFzLmNvdW50KDApIDwgbGVuKGRlbHRhcyk6Ci0gICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAjIE5vdGhpbmcgZWxzZSB0aGFuIDFzLCAwcyBhbmQgLTFzCi0gICAgICAgIGlmIG5vdCBzZXQoZGVsdGFzKSA8PSB7MSwwLC0xfToKLSAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgIHJldHVybiBGYWxzZQotICAgIGZhaWxlZCA9IEZhbHNlCi0gICAgZm9yIGRlbHRhcywgaXRlbV9uYW1lLCBjaGVja2VyIGluIFsKLSAgICAgICAgKHJjX2RlbHRhcywgJ3JlZmVyZW5jZXMnLCBjaGVja19yY19kZWx0YXMpLAotICAgICAgICAoYWxsb2NfZGVsdGFzLCAnbWVtb3J5IGJsb2NrcycsIGNoZWNrX2FsbG9jX2RlbHRhcyldOgotICAgICAgICBpZiBjaGVja2VyKGRlbHRhcyk6Ci0gICAgICAgICAgICBtc2cgPSAnJXMgbGVha2VkICVzICVzLCBzdW09JXMnICUgKAotICAgICAgICAgICAgICAgIHRlc3QsIGRlbHRhc1tud2FybXVwOl0sIGl0ZW1fbmFtZSwgc3VtKGRlbHRhcykpCi0gICAgICAgICAgICBwcmludChtc2csIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAiYSIpIGFzIHJlZnJlcDoKLSAgICAgICAgICAgICAgICBwcmludChtc2csIGZpbGU9cmVmcmVwKQotICAgICAgICAgICAgICAgIHJlZnJlcC5mbHVzaCgpCi0gICAgICAgICAgICBmYWlsZWQgPSBUcnVlCi0gICAgcmV0dXJuIGZhaWxlZAotCi1kZWYgZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywgYWJjcyk6Ci0gICAgaW1wb3J0IGdjLCBjb3B5cmVnCi0gICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlCi0gICAgaW1wb3J0IHVybGxpYi5wYXJzZSwgdXJsbGliLnJlcXVlc3QsIG1pbWV0eXBlcywgZG9jdGVzdAotICAgIGltcG9ydCBzdHJ1Y3QsIGZpbGVjbXAsIGNvbGxlY3Rpb25zLmFiYwotICAgIGZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCBfcGF0aF9jcmVhdGVkCi0gICAgZnJvbSB3ZWFrcmVmIGltcG9ydCBXZWFrU2V0Ci0KLSAgICAjIENsZWFyIHRoZSB3YXJuaW5ncyByZWdpc3RyeSwgc28gdGhleSBjYW4gYmUgZGlzcGxheWVkIGFnYWluCi0gICAgZm9yIG1vZCBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKLSAgICAgICAgaWYgaGFzYXR0cihtb2QsICdfX3dhcm5pbmdyZWdpc3RyeV9fJyk6Ci0gICAgICAgICAgICBkZWwgbW9kLl9fd2FybmluZ3JlZ2lzdHJ5X18KLQotICAgICMgUmVzdG9yZSBzb21lIG9yaWdpbmFsIHZhbHVlcy4KLSAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gZnMKLSAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLmNsZWFyKCkKLSAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLnVwZGF0ZShwcykKLSAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5jbGVhcigpCi0gICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUudXBkYXRlKHBpYykKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCB6aXBpbXBvcnQKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MgIyBSdW4gdW5tb2RpZmllZCBvbiBwbGF0Zm9ybXMgd2l0aG91dCB6aXBpbXBvcnQgc3VwcG9ydAotICAgIGVsc2U6Ci0gICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jbGVhcigpCi0gICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS51cGRhdGUoemRjKQotCi0gICAgIyBjbGVhciB0eXBlIGNhY2hlCi0gICAgc3lzLl9jbGVhcl90eXBlX2NhY2hlKCkKLQotICAgICMgQ2xlYXIgQUJDIHJlZ2lzdHJpZXMsIHJlc3RvcmluZyBwcmV2aW91c2x5IHNhdmVkIEFCQyByZWdpc3RyaWVzLgotICAgIGZvciBhYmMgaW4gW2dldGF0dHIoY29sbGVjdGlvbnMuYWJjLCBhKSBmb3IgYSBpbiBjb2xsZWN0aW9ucy5hYmMuX19hbGxfX106Ci0gICAgICAgIGlmIG5vdCBpc2Fic3RyYWN0KGFiYyk6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBmb3Igb2JqIGluIGFiYy5fX3N1YmNsYXNzZXNfXygpICsgW2FiY106Ci0gICAgICAgICAgICBvYmouX2FiY19yZWdpc3RyeSA9IGFiY3MuZ2V0KG9iaiwgV2Vha1NldCgpKS5jb3B5KCkKLSAgICAgICAgICAgIG9iai5fYWJjX2NhY2hlLmNsZWFyKCkKLSAgICAgICAgICAgIG9iai5fYWJjX25lZ2F0aXZlX2NhY2hlLmNsZWFyKCkKLQotICAgICMgRmx1c2ggc3RhbmRhcmQgb3V0cHV0LCBzbyB0aGF0IGJ1ZmZlcmVkIGRhdGEgaXMgc2VudCB0byB0aGUgT1MgYW5kCi0gICAgIyBhc3NvY2lhdGVkIFB5dGhvbiBvYmplY3RzIGFyZSByZWNsYWltZWQuCi0gICAgZm9yIHN0cmVhbSBpbiAoc3lzLnN0ZG91dCwgc3lzLnN0ZGVyciwgc3lzLl9fc3Rkb3V0X18sIHN5cy5fX3N0ZGVycl9fKToKLSAgICAgICAgaWYgc3RyZWFtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCkKLQotICAgICMgQ2xlYXIgYXNzb3J0ZWQgbW9kdWxlIGNhY2hlcy4KLSAgICBfcGF0aF9jcmVhdGVkLmNsZWFyKCkKLSAgICByZS5wdXJnZSgpCi0gICAgX3N0cnB0aW1lLl9yZWdleF9jYWNoZS5jbGVhcigpCi0gICAgdXJsbGliLnBhcnNlLmNsZWFyX2NhY2hlKCkKLSAgICB1cmxsaWIucmVxdWVzdC51cmxjbGVhbnVwKCkKLSAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCi0gICAgbWltZXR5cGVzLl9kZWZhdWx0X21pbWVfdHlwZXMoKQotICAgIGZpbGVjbXAuX2NhY2hlLmNsZWFyKCkKLSAgICBzdHJ1Y3QuX2NsZWFyY2FjaGUoKQotICAgIGRvY3Rlc3QubWFzdGVyID0gTm9uZQotICAgIHRyeToKLSAgICAgICAgaW1wb3J0IGN0eXBlcwotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgIyBEb24ndCB3b3JyeSBhYm91dCByZXNldHRpbmcgdGhlIGNhY2hlIGlmIGN0eXBlcyBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBjdHlwZXMuX3Jlc2V0X2NhY2hlKCkKLQotICAgICMgQ29sbGVjdCBjeWNsaWMgdHJhc2ggYW5kIHJlYWQgbWVtb3J5IHN0YXRpc3RpY3MgaW1tZWRpYXRlbHkgYWZ0ZXIuCi0gICAgZnVuYzEgPSBzeXMuZ2V0YWxsb2NhdGVkYmxvY2tzCi0gICAgZnVuYzIgPSBzeXMuZ2V0dG90YWxyZWZjb3VudAotICAgIGdjLmNvbGxlY3QoKQotICAgIHJldHVybiBmdW5jMSgpLCBmdW5jMigpCi0KLWRlZiB3YXJtX2NhY2hlcygpOgotICAgICMgY2hhciBjYWNoZQotICAgIHMgPSBieXRlcyhyYW5nZSgyNTYpKQotICAgIGZvciBpIGluIHJhbmdlKDI1Nik6Ci0gICAgICAgIHNbaTppKzFdCi0gICAgIyB1bmljb2RlIGNhY2hlCi0gICAgeCA9IFtjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMjU2KV0KLSAgICAjIGludCBjYWNoZQotICAgIHggPSBsaXN0KHJhbmdlKC01LCAyNTcpKQotCi1kZWYgZmluZHRlc3RkaXIocGF0aD1Ob25lKToKLSAgICByZXR1cm4gcGF0aCBvciBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpcgotCi1kZWYgcmVtb3ZlcHkobmFtZXMpOgotICAgIGlmIG5vdCBuYW1lczoKLSAgICAgICAgcmV0dXJuCi0gICAgZm9yIGlkeCwgbmFtZSBpbiBlbnVtZXJhdGUobmFtZXMpOgotICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQotICAgICAgICBpZiBleHQgPT0gJy5weSc6Ci0gICAgICAgICAgICBuYW1lc1tpZHhdID0gYmFzZW5hbWUKLQotZGVmIGNvdW50KG4sIHdvcmQpOgotICAgIGlmIG4gPT0gMToKLSAgICAgICAgcmV0dXJuICIlZCAlcyIgJSAobiwgd29yZCkKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gIiVkICVzcyIgJSAobiwgd29yZCkKLQotZGVmIHByaW50bGlzdCh4LCB3aWR0aD03MCwgaW5kZW50PTQpOgotICAgICIiIlByaW50IHRoZSBlbGVtZW50cyBvZiBpdGVyYWJsZSB4IHRvIHN0ZG91dC4KLQotICAgIE9wdGlvbmFsIGFyZyB3aWR0aCAoZGVmYXVsdCA3MCkgaXMgdGhlIG1heGltdW0gbGluZSBsZW5ndGguCi0gICAgT3B0aW9uYWwgYXJnIGluZGVudCAoZGVmYXVsdCA0KSBpcyB0aGUgbnVtYmVyIG9mIGJsYW5rcyB3aXRoIHdoaWNoIHRvCi0gICAgYmVnaW4gZWFjaCBsaW5lLgotICAgICIiIgotCi0gICAgZnJvbSB0ZXh0d3JhcCBpbXBvcnQgZmlsbAotICAgIGJsYW5rcyA9ICcgJyAqIGluZGVudAotICAgICMgUHJpbnQgdGhlIHNvcnRlZCBsaXN0OiAneCcgbWF5IGJlIGEgJy0tcmFuZG9tJyBsaXN0IG9yIGEgc2V0KCkKLSAgICBwcmludChmaWxsKCcgJy5qb2luKHN0cihlbHQpIGZvciBlbHQgaW4gc29ydGVkKHgpKSwgd2lkdGgsCi0gICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1ibGFua3MsIHN1YnNlcXVlbnRfaW5kZW50PWJsYW5rcykpCi0KLQotZGVmIG1haW5faW5fdGVtcF9jd2QoKToKLSAgICAiIiJSdW4gbWFpbigpIGluIGEgdGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5LiIiIgotICAgIGlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3MubWtkaXIoVEVNUERJUikKLSAgICAgICAgZXhjZXB0IEZpbGVFeGlzdHNFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLQotICAgICMgRGVmaW5lIGEgd3JpdGFibGUgdGVtcCBkaXIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgY3dkIHdoaWxlIHJ1bm5pbmcKLSAgICAjIHRoZSB0ZXN0cy4gVGhlIG5hbWUgb2YgdGhlIGRpciBpbmNsdWRlcyB0aGUgcGlkIHRvIGFsbG93IHBhcmFsbGVsCi0gICAgIyB0ZXN0aW5nIChzZWUgdGhlIC1qIG9wdGlvbikuCi0gICAgdGVzdF9jd2QgPSAndGVzdF9weXRob25fe30nLmZvcm1hdChvcy5nZXRwaWQoKSkKLSAgICB0ZXN0X2N3ZCA9IG9zLnBhdGguam9pbihURU1QRElSLCB0ZXN0X2N3ZCkKLQotICAgICMgUnVuIHRoZSB0ZXN0cyBpbiBhIGNvbnRleHQgbWFuYWdlciB0aGF0IHRlbXBvcmFyaWx5IGNoYW5nZXMgdGhlIENXRCB0byBhCi0gICAgIyB0ZW1wb3JhcnkgYW5kIHdyaXRhYmxlIGRpcmVjdG9yeS4gIElmIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBvcgotICAgICMgY2hhbmdlIHRoZSBDV0QsIHRoZSBvcmlnaW5hbCBDV0Qgd2lsbCBiZSB1c2VkLiAgVGhlIG9yaWdpbmFsIENXRCBpcwotICAgICMgYXZhaWxhYmxlIGZyb20gc3VwcG9ydC5TQVZFRENXRC4KLSAgICB3aXRoIHN1cHBvcnQudGVtcF9jd2QodGVzdF9jd2QsIHF1aWV0PVRydWUpOgotICAgICAgICBtYWluKCkKLQorZGVmIF9tYWluKCk6CisgICAgZ2xvYmFsIF9fZmlsZV9fCiAKLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgIyBSZW1vdmUgcmVncnRlc3QucHkncyBvd24gZGlyZWN0b3J5IGZyb20gdGhlIG1vZHVsZSBzZWFyY2ggcGF0aC4gRGVzcGl0ZQogICAgICMgdGhlIGVsaW1pbmF0aW9uIG9mIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydHMsIHRoaXMgaXMgc3RpbGwgbmVlZGVkIHRvCiAgICAgIyBlbnN1cmUgdGhhdCBzdWJtb2R1bGVzIG9mIHRoZSB0ZXN0IHBhY2thZ2UgZG8gbm90IGluYXBwcm9wcmlhdGVseSBhcHBlYXIKICAgICAjIGFzIHRvcC1sZXZlbCBtb2R1bGVzIGV2ZW4gd2hlbiBwZW9wbGUgKG9yIGJ1aWxkYm90cyEpIGludm9rZSByZWdydGVzdC5weQogICAgICMgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyB0aGUgLW0gc3dpdGNoCiAgICAgbXlkaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKSkKLSAgICBpID0gbGVuKHN5cy5wYXRoKQorICAgIGkgPSBsZW4oc3lzLnBhdGgpIC0gMQogICAgIHdoaWxlIGkgPj0gMDoKLSAgICAgICAgaSAtPSAxCiAgICAgICAgIGlmIG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKHN5cy5wYXRoW2ldKSkgPT0gbXlkaXI6CiAgICAgICAgICAgICBkZWwgc3lzLnBhdGhbaV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGkgLT0gMQogCiAgICAgIyBmaW5kdGVzdGRpcigpIGdldHMgdGhlIGRpcm5hbWUgb3V0IG9mIF9fZmlsZV9fLCBzbyB3ZSBoYXZlIHRvIG1ha2UgaXQKICAgICAjIGFic29sdXRlIGJlZm9yZSBjaGFuZ2luZyB0aGUgd29ya2luZyBkaXJlY3RvcnkuCkBAIC0xNjE1LDQgKzQzLDggQEAKICAgICAjIHNhbml0eSBjaGVjawogICAgIGFzc2VydCBfX2ZpbGVfXyA9PSBvcy5wYXRoLmFic3BhdGgoc3lzLmFyZ3ZbMF0pCiAKLSAgICBtYWluX2luX3RlbXBfY3dkKCkKKyAgICBtYWluKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3NlcV90ZXN0cy5weSBiL0xpYi90ZXN0L3NlcV90ZXN0cy5weQppbmRleCA3MmY0ODQ1Li4xZTdhNmY2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9zZXFfdGVzdHMucHkKKysrIGIvTGliL3Rlc3Qvc2VxX3Rlc3RzLnB5CkBAIC0zMTgsNyArMzE4LDYgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQocyksIGlkKHMqMSkpCiAKICAgICBkZWYgdGVzdF9iaWdyZXBlYXQoc2VsZik6Ci0gICAgICAgIGltcG9ydCBzeXMKICAgICAgICAgaWYgc3lzLm1heHNpemUgPD0gMjE0NzQ4MzY0NzoKICAgICAgICAgICAgIHggPSBzZWxmLnR5cGUydGVzdChbMF0pCiAgICAgICAgICAgICB4ICo9IDIqKjE2CmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zaWduYWxpbnRlcnByb2N0ZXN0ZXIucHkgYi9MaWIvdGVzdC9zaWduYWxpbnRlcnByb2N0ZXN0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhZTE3MAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3NpZ25hbGludGVycHJvY3Rlc3Rlci5weQpAQCAtMCwwICsxLDg0IEBACitpbXBvcnQgb3MKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgU0lHVVNSMUV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBJbnRlclByb2Nlc3NTaWduYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmdvdF9zaWduYWxzID0geydTSUdIVVAnOiAwLCAnU0lHVVNSMSc6IDAsICdTSUdBTFJNJzogMH0KKworICAgIGRlZiBzaWdodXBfaGFuZGxlcihzZWxmLCBzaWdudW0sIGZyYW1lKToKKyAgICAgICAgc2VsZi5nb3Rfc2lnbmFsc1snU0lHSFVQJ10gKz0gMQorCisgICAgZGVmIHNpZ3VzcjFfaGFuZGxlcihzZWxmLCBzaWdudW0sIGZyYW1lKToKKyAgICAgICAgc2VsZi5nb3Rfc2lnbmFsc1snU0lHVVNSMSddICs9IDEKKyAgICAgICAgcmFpc2UgU0lHVVNSMUV4Y2VwdGlvbgorCisgICAgZGVmIHdhaXRfc2lnbmFsKHNlbGYsIGNoaWxkLCBzaWduYW1lLCBleGNfY2xhc3M9Tm9uZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGNoaWxkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgVGhpcyB3YWl0IHNob3VsZCBiZSBpbnRlcnJ1cHRlZCBieSBleGNfY2xhc3MKKyAgICAgICAgICAgICAgICAjIChpZiBzZXQpCisgICAgICAgICAgICAgICAgY2hpbGQud2FpdCgpCisKKyAgICAgICAgICAgIHRpbWVvdXQgPSAxMC4wCisgICAgICAgICAgICBkZWFkbGluZSA9IHRpbWUubW9ub3RvbmljKCkgKyB0aW1lb3V0CisKKyAgICAgICAgICAgIHdoaWxlIHRpbWUubW9ub3RvbmljKCkgPCBkZWFkbGluZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmdvdF9zaWduYWxzW3NpZ25hbWVdOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBzaWduYWwucGF1c2UoKQorICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBpZiBleGNfY2xhc3MgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2UoZXhjLCBleGNfY2xhc3MpOgorICAgICAgICAgICAgICAgICMgZ290IHRoZSBleHBlY3RlZCBleGNlcHRpb24KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgc2VsZi5mYWlsKCdzaWduYWwgJXMgbm90IHJlY2VpdmVkIGFmdGVyICVzIHNlY29uZHMnCisgICAgICAgICAgICAgICAgICAlIChzaWduYW1lLCB0aW1lb3V0KSkKKworICAgIGRlZiBzdWJwcm9jZXNzX3NlbmRfc2lnbmFsKHNlbGYsIHBpZCwgc2lnbmFtZSk6CisgICAgICAgIGNvZGUgPSAnaW1wb3J0IG9zLCBzaWduYWw7IG9zLmtpbGwoJXMsIHNpZ25hbC4lcyknICUgKHBpZCwgc2lnbmFtZSkKKyAgICAgICAgYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgJy1JJywgJy1jJywgY29kZV0KKyAgICAgICAgcmV0dXJuIHN1YnByb2Nlc3MuUG9wZW4oYXJncykKKworICAgIGRlZiB0ZXN0X2ludGVycHJvY2Vzc19zaWduYWwoc2VsZik6CisgICAgICAgICMgSW5zdGFsbCBoYW5kbGVycy4gVGhpcyBmdW5jdGlvbiBydW5zIGluIGEgc3ViLXByb2Nlc3MsIHNvIHdlCisgICAgICAgICMgZG9uJ3Qgd29ycnkgYWJvdXQgcmUtc2V0dGluZyB0aGUgZGVmYXVsdCBoYW5kbGVycy4KKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSFVQLCBzZWxmLnNpZ2h1cF9oYW5kbGVyKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCBzZWxmLnNpZ3VzcjFfaGFuZGxlcikKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMiwgc2lnbmFsLlNJR19JR04pCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIHNpZ25hbC5kZWZhdWx0X2ludF9oYW5kbGVyKQorCisgICAgICAgICMgTGV0IHRoZSBzdWItcHJvY2Vzc2VzIGtub3cgd2hvIHRvIHNlbmQgc2lnbmFscyB0by4KKyAgICAgICAgcGlkID0gc3RyKG9zLmdldHBpZCgpKQorCisgICAgICAgIHdpdGggc2VsZi5zdWJwcm9jZXNzX3NlbmRfc2lnbmFsKHBpZCwgIlNJR0hVUCIpIGFzIGNoaWxkOgorICAgICAgICAgICAgc2VsZi53YWl0X3NpZ25hbChjaGlsZCwgJ1NJR0hVUCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nb3Rfc2lnbmFscywgeydTSUdIVVAnOiAxLCAnU0lHVVNSMSc6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTSUdBTFJNJzogMH0pCisKKyAgICAgICAgd2l0aCBzZWxmLnN1YnByb2Nlc3Nfc2VuZF9zaWduYWwocGlkLCAiU0lHVVNSMSIpIGFzIGNoaWxkOgorICAgICAgICAgICAgc2VsZi53YWl0X3NpZ25hbChjaGlsZCwgJ1NJR1VTUjEnLCBTSUdVU1IxRXhjZXB0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ290X3NpZ25hbHMsIHsnU0lHSFVQJzogMSwgJ1NJR1VTUjEnOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0lHQUxSTSc6IDB9KQorCisgICAgICAgIHdpdGggc2VsZi5zdWJwcm9jZXNzX3NlbmRfc2lnbmFsKHBpZCwgIlNJR1VTUjIiKSBhcyBjaGlsZDoKKyAgICAgICAgICAgICMgTm90aGluZyBzaG91bGQgaGFwcGVuOiBTSUdVU1IyIGlzIGlnbm9yZWQKKyAgICAgICAgICAgIGNoaWxkLndhaXQoKQorCisgICAgICAgIHNpZ25hbC5hbGFybSgxKQorICAgICAgICBzZWxmLndhaXRfc2lnbmFsKE5vbmUsICdTSUdBTFJNJywgS2V5Ym9hcmRJbnRlcnJ1cHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nb3Rfc2lnbmFscywgeydTSUdIVVAnOiAxLCAnU0lHVVNSMSc6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTSUdBTFJNJzogMH0pCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3NvcnRwZXJmLnB5IGIvTGliL3Rlc3Qvc29ydHBlcmYucHkKaW5kZXggOTA3MjJmNy4uMTcxZTVjZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvc29ydHBlcmYucHkKKysrIGIvTGliL3Rlc3Qvc29ydHBlcmYucHkKQEAgLTY0LDcgKzY0LDcgQEAKICAgICBmbHVzaCgpCiAKIGRlZiB0YWJ1bGF0ZShyKToKLSAgICAiIiJUYWJ1bGF0ZSBzb3J0IHNwZWVkIGZvciBsaXN0cyBvZiB2YXJpb3VzIHNpemVzLgorICAgIHIiIiJUYWJ1bGF0ZSBzb3J0IHNwZWVkIGZvciBsaXN0cyBvZiB2YXJpb3VzIHNpemVzLgogCiAgICAgVGhlIHNpemVzIGFyZSAyKippIGZvciBpIGluIHIgKHRoZSBhcmd1bWVudCwgYSBsaXN0KS4KIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc3VwcG9ydC9fX2luaXRfXy5weSBiL0xpYi90ZXN0L3N1cHBvcnQvX19pbml0X18ucHkKaW5kZXggMDA3ZjNiYy4uOGI2NmY5NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvc3VwcG9ydC9fX2luaXRfXy5weQorKysgYi9MaWIvdGVzdC9zdXBwb3J0L19faW5pdF9fLnB5CkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgc3lzY29uZmlnCiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB0aW1lCitpbXBvcnQgdHlwZXMKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHVybGxpYi5lcnJvcgogaW1wb3J0IHdhcm5pbmdzCkBAIC04OSw4ICs5MCw5IEBACiAgICAgImJpZ21lbXRlc3QiLCAiYmlnYWRkcnNwYWNldGVzdCIsICJjcHl0aG9uX29ubHkiLCAiZ2V0X2F0dHJpYnV0ZSIsCiAgICAgInJlcXVpcmVzX0lFRUVfNzU0IiwgInNraXBfdW5sZXNzX3hhdHRyIiwgInJlcXVpcmVzX3psaWIiLAogICAgICJhbnRpY2lwYXRlX2ZhaWx1cmUiLCAibG9hZF9wYWNrYWdlX3Rlc3RzIiwgImRldGVjdF9hcGlfbWlzbWF0Y2giLAorICAgICJjaGVja19fYWxsX18iLAogICAgICMgc3lzCi0gICAgImlzX2p5dGhvbiIsICJjaGVja19pbXBsX2RldGFpbCIsCisgICAgImlzX2p5dGhvbiIsICJpc19hbmRyb2lkIiwgImNoZWNrX2ltcGxfZGV0YWlsIiwgInVuaXhfc2hlbGwiLAogICAgICMgbmV0d29yawogICAgICJIT1NUIiwgIklQVjZfRU5BQkxFRCIsICJmaW5kX3VudXNlZF9wb3J0IiwgImJpbmRfcG9ydCIsICJvcGVuX3VybHJlc291cmNlIiwKICAgICAjIHByb2Nlc3NlcwpAQCAtMTAzLDcgKzEwNSw3IEBACiAgICAgImNoZWNrX3dhcm5pbmdzIiwgImNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmciLCAiRW52aXJvbm1lbnRWYXJHdWFyZCIsCiAgICAgInJ1bl93aXRoX2xvY2FsZSIsICJzd2FwX2l0ZW0iLAogICAgICJzd2FwX2F0dHIiLCAiTWF0Y2hlciIsICJzZXRfbWVtbGltaXQiLCAiU3VwcHJlc3NDcmFzaFJlcG9ydCIsICJzb3J0ZGljdCIsCi0gICAgInJ1bl93aXRoX3R6IiwKKyAgICAicnVuX3dpdGhfdHoiLCAiUEdPIiwKICAgICBdCiAKIGNsYXNzIEVycm9yKEV4Y2VwdGlvbik6CkBAIC03MzMsNiArNzM1LDEzIEBACiAKIGlzX2p5dGhvbiA9IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJykKIAoraXNfYW5kcm9pZCA9IGJvb2woc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdBTkRST0lEX0FQSV9MRVZFTCcpKQorCitpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzoKKyAgICB1bml4X3NoZWxsID0gJy9zeXN0ZW0vYmluL3NoJyBpZiBpc19hbmRyb2lkIGVsc2UgJy9iaW4vc2gnCitlbHNlOgorICAgIHVuaXhfc2hlbGwgPSBOb25lCisKICMgRmlsZW5hbWUgdXNlZCBmb3IgdGVzdGluZwogaWYgb3MubmFtZSA9PSAnamF2YSc6CiAgICAgIyBKeXRob24gZGlzYWxsb3dzIEAgaW4gbW9kdWxlIG5hbWVzCkBAIC04MDIsNyArODExLDcgQEAKICMgZW5jb2RlZCBieSB0aGUgZmlsZXN5c3RlbSBlbmNvZGluZyAoaW4gc3RyaWN0IG1vZGUpLiBJdCBjYW4gYmUgTm9uZSBpZiB3ZQogIyBjYW5ub3QgZ2VuZXJhdGUgc3VjaCBmaWxlbmFtZS4KIFRFU1RGTl9VTkVOQ09EQUJMRSA9IE5vbmUKLWlmIG9zLm5hbWUgaW4gKCdudCcsICdjZScpOgoraWYgb3MubmFtZSA9PSAnbnQnOgogICAgICMgc2tpcCB3aW4zMnMgKDApIG9yIFdpbmRvd3MgOXgvTUUgKDEpCiAgICAgaWYgc3lzLmdldHdpbmRvd3N2ZXJzaW9uKCkucGxhdGZvcm0gPj0gMjoKICAgICAgICAgIyBEaWZmZXJlbnQga2luZHMgb2YgY2hhcmFjdGVycyBmcm9tIHZhcmlvdXMgbGFuZ3VhZ2VzIHRvIG1pbmltaXplIHRoZQpAQCAtODY5LDYgKzg3OCwxMCBAQAogIyBTYXZlIHRoZSBpbml0aWFsIGN3ZAogU0FWRURDV0QgPSBvcy5nZXRjd2QoKQogCisjIFNldCBieSBsaWJyZWdydGVzdC9tYWluLnB5IHNvIHdlIGNhbiBza2lwIHRlc3RzIHRoYXQgYXJlIG5vdAorIyB1c2VmdWwgZm9yIFBHTworUEdPID0gRmFsc2UKKwogQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKIGRlZiB0ZW1wX2RpcihwYXRoPU5vbmUsIHF1aWV0PUZhbHNlKToKICAgICAiIiJSZXR1cm4gYSBjb250ZXh0IG1hbmFnZXIgdGhhdCBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KQEAgLTkwMSw3ICs5MTQsNyBAQAogICAgICAgICB5aWVsZCBwYXRoCiAgICAgZmluYWxseToKICAgICAgICAgaWYgZGlyX2NyZWF0ZWQ6Ci0gICAgICAgICAgICBzaHV0aWwucm10cmVlKHBhdGgpCisgICAgICAgICAgICBybXRyZWUocGF0aCkKIAogQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKIGRlZiBjaGFuZ2VfY3dkKHBhdGgsIHF1aWV0PUZhbHNlKToKQEAgLTIwNzgsNiArMjA5MSwxMSBAQAogICAgIHNldHRpbmdzIGluIHN5cy5mbGFncyBhbmQgc3lzLndhcm5vcHRpb25zLiIiIgogICAgIHJldHVybiBzdWJwcm9jZXNzLl9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKQogCitkZWYgb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHJlcHJvZHVjaW5nIHRoZSBjdXJyZW50CisgICAgb3B0aW1pemF0aW9uIHNldHRpbmdzIGluIHN5cy5mbGFncy4iIiIKKyAgICByZXR1cm4gc3VicHJvY2Vzcy5fb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKKwogIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyBTdXBwb3J0IGZvciBhc3NlcnRpb25zIGFib3V0IGxvZ2dpbmcuCiAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0yMTg0LDcgKzIyMDIsNyBAQAogICAgICAgICAgICAgICAgICAgICBvcy5zZXR4YXR0cihmcC5maWxlbm8oKSwgYiJ1c2VyLnRlc3QiLCBiIiIpCiAgICAgICAgICAgICAgICAgICAgICMgS2VybmVscyA8IDIuNi4zOSBkb24ndCByZXNwZWN0IHNldHhhdHRyIGZsYWdzLgogICAgICAgICAgICAgICAgICAgICBrZXJuZWxfdmVyc2lvbiA9IHBsYXRmb3JtLnJlbGVhc2UoKQotICAgICAgICAgICAgICAgICAgICBtID0gcmUubWF0Y2goIjIuNi4oXGR7MSwyfSkiLCBrZXJuZWxfdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHIiMi42LihcZHsxLDJ9KSIsIGtlcm5lbF92ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICBjYW4gPSBtIGlzIE5vbmUgb3IgaW50KG0uZ3JvdXAoMSkpID49IDM5CiAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIGNhbiA9IEZhbHNlCkBAIC0yMjI5LDYgKzIyNDcsNjUgQEAKICAgICByZXR1cm4gbWlzc2luZ19pdGVtcwogCiAKK2RlZiBjaGVja19fYWxsX18odGVzdF9jYXNlLCBtb2R1bGUsIG5hbWVfb2ZfbW9kdWxlPU5vbmUsIGV4dHJhPSgpLAorICAgICAgICAgICAgICAgICBibGFja2xpc3Q9KCkpOgorICAgICIiIkFzc2VydCB0aGF0IHRoZSBfX2FsbF9fIHZhcmlhYmxlIG9mICdtb2R1bGUnIGNvbnRhaW5zIGFsbCBwdWJsaWMgbmFtZXMuCisKKyAgICBUaGUgbW9kdWxlJ3MgcHVibGljIG5hbWVzIChpdHMgQVBJKSBhcmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbgorICAgIHdoZXRoZXIgdGhleSBtYXRjaCB0aGUgcHVibGljIG5hbWUgY29udmVudGlvbiBhbmQgd2VyZSBkZWZpbmVkIGluCisgICAgJ21vZHVsZScuCisKKyAgICBUaGUgJ25hbWVfb2ZfbW9kdWxlJyBhcmd1bWVudCBjYW4gc3BlY2lmeSAoYXMgYSBzdHJpbmcgb3IgdHVwbGUgdGhlcmVvZikKKyAgICB3aGF0IG1vZHVsZShzKSBhbiBBUEkgY291bGQgYmUgZGVmaW5lZCBpbiBpbiBvcmRlciB0byBiZSBkZXRlY3RlZCBhcyBhCisgICAgcHVibGljIEFQSS4gT25lIGNhc2UgZm9yIHRoaXMgaXMgd2hlbiAnbW9kdWxlJyBpbXBvcnRzIHBhcnQgb2YgaXRzIHB1YmxpYworICAgIEFQSSBmcm9tIG90aGVyIG1vZHVsZXMsIHBvc3NpYmx5IGEgQyBiYWNrZW5kIChsaWtlICdjc3YnIGFuZCBpdHMgJ19jc3YnKS4KKworICAgIFRoZSAnZXh0cmEnIGFyZ3VtZW50IGNhbiBiZSBhIHNldCBvZiBuYW1lcyB0aGF0IHdvdWxkbid0IG90aGVyd2lzZSBiZQorICAgIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYXMgInB1YmxpYyIsIGxpa2Ugb2JqZWN0cyB3aXRob3V0IGEgcHJvcGVyCisgICAgJ19fbW9kdWxlX18nIGF0dHJpdWJ1dGUuIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQorICAgIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgb25lcy4KKworICAgIFRoZSAnYmxhY2tsaXN0JyBhcmd1bWVudCBjYW4gYmUgYSBzZXQgb2YgbmFtZXMgdGhhdCBtdXN0IG5vdCBiZSB0cmVhdGVkCisgICAgYXMgcGFydCBvZiB0aGUgcHVibGljIEFQSSBldmVuIHRob3VnaCB0aGVpciBuYW1lcyBpbmRpY2F0ZSBvdGhlcndpc2UuCisKKyAgICBVc2FnZToKKyAgICAgICAgaW1wb3J0IGJhcgorICAgICAgICBpbXBvcnQgZm9vCisgICAgICAgIGltcG9ydCB1bml0dGVzdAorICAgICAgICBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKKworICAgICAgICBjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGZvbykKKworICAgICAgICBjbGFzcyBPdGhlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBleHRyYSA9IHsnQkFSX0NPTlNUJywgJ0ZPT19DT05TVCd9CisgICAgICAgICAgICAgICAgYmxhY2tsaXN0ID0geydiYXonfSAgIyBVbmRvY3VtZW50ZWQgbmFtZS4KKyAgICAgICAgICAgICAgICAjIGJhciBpbXBvcnRzIHBhcnQgb2YgaXRzIEFQSSBmcm9tIF9iYXIuCisgICAgICAgICAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgYmFyLCAoJ2JhcicsICdfYmFyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE9ZXh0cmEsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKyAgICAiIiIKKworICAgIGlmIG5hbWVfb2ZfbW9kdWxlIGlzIE5vbmU6CisgICAgICAgIG5hbWVfb2ZfbW9kdWxlID0gKG1vZHVsZS5fX25hbWVfXywgKQorICAgIGVsaWYgaXNpbnN0YW5jZShuYW1lX29mX21vZHVsZSwgc3RyKToKKyAgICAgICAgbmFtZV9vZl9tb2R1bGUgPSAobmFtZV9vZl9tb2R1bGUsICkKKworICAgIGV4cGVjdGVkID0gc2V0KGV4dHJhKQorCisgICAgZm9yIG5hbWUgaW4gZGlyKG1vZHVsZSk6CisgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnXycpIG9yIG5hbWUgaW4gYmxhY2tsaXN0OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgb2JqID0gZ2V0YXR0cihtb2R1bGUsIG5hbWUpCisgICAgICAgIGlmIChnZXRhdHRyKG9iaiwgJ19fbW9kdWxlX18nLCBOb25lKSBpbiBuYW1lX29mX21vZHVsZSBvcgorICAgICAgICAgICAgICAgIChub3QgaGFzYXR0cihvYmosICdfX21vZHVsZV9fJykgYW5kCisgICAgICAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKG9iaiwgdHlwZXMuTW9kdWxlVHlwZSkpKToKKyAgICAgICAgICAgIGV4cGVjdGVkLmFkZChuYW1lKQorICAgIHRlc3RfY2FzZS5hc3NlcnRDb3VudEVxdWFsKG1vZHVsZS5fX2FsbF9fLCBleHBlY3RlZCkKKworCiBjbGFzcyBTdXBwcmVzc0NyYXNoUmVwb3J0OgogICAgICIiIlRyeSB0byBwcmV2ZW50IGEgY3Jhc2ggcmVwb3J0IGZyb20gcG9wcGluZyB1cC4KIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9fX2FsbF9fLnB5IGIvTGliL3Rlc3QvdGVzdF9fX2FsbF9fLnB5CmluZGV4IGU5NGQ5ODQuLmFlOTExNGUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfX19hbGxfXy5weQorKysgYi9MaWIvdGVzdC90ZXN0X19fYWxsX18ucHkKQEAgLTM4LDYgKzM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSwgZS5fX2NsYXNzX18uX19uYW1lX18sIGUpKQogICAgICAgICAgICAgaWYgIl9fYnVpbHRpbnNfXyIgaW4gbmFtZXM6CiAgICAgICAgICAgICAgICAgZGVsIG5hbWVzWyJfX2J1aWx0aW5zX18iXQorICAgICAgICAgICAgaWYgJ19fYW5ub3RhdGlvbnNfXycgaW4gbmFtZXM6CisgICAgICAgICAgICAgICAgZGVsIG5hbWVzWydfX2Fubm90YXRpb25zX18nXQogICAgICAgICAgICAga2V5cyA9IHNldChuYW1lcykKICAgICAgICAgICAgIGFsbF9saXN0ID0gc3lzLm1vZHVsZXNbbW9kbmFtZV0uX19hbGxfXwogICAgICAgICAgICAgYWxsX3NldCA9IHNldChhbGxfbGlzdCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weSBiL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weQppbmRleCA1OGYyZjA0Li5hYjRlMjQ3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X19sb2NhbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9fbG9jYWxlLnB5CkBAIC00LDcgKzQsNiBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIG5sX2xhbmdpbmZvID0gTm9uZQogCi1pbXBvcnQgY29kZWNzCiBpbXBvcnQgbG9jYWxlCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9fb3N4X3N1cHBvcnQucHkKaW5kZXggYWM2MzI1YS4uYmNiYThjYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9fb3N4X3N1cHBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9fb3N4X3N1cHBvcnQucHkKQEAgLTQsNyArNCw2IEBACiAKIGltcG9ydCBvcwogaW1wb3J0IHBsYXRmb3JtCi1pbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3RhdAogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FpZmMucHkgYi9MaWIvdGVzdC90ZXN0X2FpZmMucHkKaW5kZXggYWI1MTQzNy4uMWJkMWY4OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9haWZjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYWlmYy5weQpAQCAtMiw3ICsyLDYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBhdWRpb3Rlc3RzCiBmcm9tIGF1ZGlvb3AgaW1wb3J0IGJ5dGVzd2FwCi1pbXBvcnQgb3MKIGltcG9ydCBpbwogaW1wb3J0IHN5cwogaW1wb3J0IHN0cnVjdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hcmdwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkKaW5kZXggZjllZTM5OC4uNTJjNjI0NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hcmdwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5CkBAIC00NTEyLDYgKzQ1MTIsMjEgQEAKICAgICAgICAgc3RyaW5nID0gIk5hbWVzcGFjZShiYXI9J3NwYW0nLCBmb289NDIpIgogICAgICAgICBzZWxmLmFzc2VydFN0cmluZ0VxdWFsKG5zLCBzdHJpbmcpCiAKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2Vfc3Rhcmt3YXJnc19ub3RpZGVudGlmaWVyKHNlbGYpOgorICAgICAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZSgqKnsnIic6ICdxdW90ZSd9KQorICAgICAgICBzdHJpbmcgPSAiIiJOYW1lc3BhY2UoKip7JyInOiAncXVvdGUnfSkiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRTdHJpbmdFcXVhbChucywgc3RyaW5nKQorCisgICAgZGVmIHRlc3RfbmFtZXNwYWNlX2t3YXJnc19hbmRfc3Rhcmt3YXJnc19ub3RpZGVudGlmaWVyKHNlbGYpOgorICAgICAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZShhPTEsICoqeyciJzogJ3F1b3RlJ30pCisgICAgICAgIHN0cmluZyA9ICIiIk5hbWVzcGFjZShhPTEsICoqeyciJzogJ3F1b3RlJ30pIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyaW5nRXF1YWwobnMsIHN0cmluZykKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZV9zdGFya3dhcmdzX2lkZW50aWZpZXIoc2VsZik6CisgICAgICAgIG5zID0gYXJncGFyc2UuTmFtZXNwYWNlKCoqeyd2YWxpZCc6IFRydWV9KQorICAgICAgICBzdHJpbmcgPSAiTmFtZXNwYWNlKHZhbGlkPVRydWUpIgorICAgICAgICBzZWxmLmFzc2VydFN0cmluZ0VxdWFsKG5zLCBzdHJpbmcpCisKICAgICBkZWYgdGVzdF9wYXJzZXIoc2VsZik6CiAgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnKQogICAgICAgICBzdHJpbmcgPSAoCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FycmF5LnB5IGIvTGliL3Rlc3QvdGVzdF9hcnJheS5weQppbmRleCAyYTIxZTc0Li4xZjg5NjdjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKQEAgLTcsOCArNyw2IEBACiBpbXBvcnQgd2Vha3JlZgogaW1wb3J0IHBpY2tsZQogaW1wb3J0IG9wZXJhdG9yCi1pbXBvcnQgaW8KLWltcG9ydCBtYXRoCiBpbXBvcnQgc3RydWN0CiBpbXBvcnQgc3lzCiBpbXBvcnQgd2FybmluZ3MKQEAgLTMyOCw4ICszMjYsMTkgQEAKICAgICAgICAgICAgIGQgPSBwaWNrbGUuZHVtcHMoKGl0b3JpZywgb3JpZyksIHByb3RvKQogICAgICAgICAgICAgaXQsIGEgPSBwaWNrbGUubG9hZHMoZCkKICAgICAgICAgICAgIGEuZnJvbWxpc3QoZGF0YTIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoaXQpLCB0eXBlKGl0b3JpZykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXQpLCBkYXRhMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdCksIFtdKQorCisgICAgZGVmIHRlc3RfZXhoYXVzdGVkX2l0ZXJhdG9yKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYSksIGxpc3Qoc2VsZi5leGFtcGxlKSkKKyAgICAgICAgZXhoaXQgPSBpdGVyKGEpCisgICAgICAgIGVtcGl0ID0gaXRlcihhKQorICAgICAgICBmb3IgeCBpbiBleGhpdDogICMgZXhoYXVzdCB0aGUgaXRlcmF0b3IKKyAgICAgICAgICAgIG5leHQoZW1waXQpICAjIG5vdCBleGhhdXN0ZWQKKyAgICAgICAgYS5hcHBlbmQoc2VsZi5vdXRzaWRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZXhoaXQpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGVtcGl0KSwgW3NlbGYub3V0c2lkZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChhKSwgbGlzdChzZWxmLmV4YW1wbGUpICsgW3NlbGYub3V0c2lkZV0pCiAKICAgICBkZWYgdGVzdF9pbnNlcnQoc2VsZik6CiAgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCkBAIC0xMDgwLDYgKzEwODksMTIgQEAKICAgICAgICAgYSA9IGFycmF5LmFycmF5KCdCJywgYiIiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhCdWZmZXJFcnJvciwgZ2V0YnVmZmVyX3dpdGhfbnVsbF92aWV3LCBhKQogCisgICAgZGVmIHRlc3RfZnJlZV9hZnRlcl9pdGVyYXRpbmcoc2VsZik6CisgICAgICAgIHN1cHBvcnQuY2hlY2tfZnJlZV9hZnRlcl9pdGVyYXRpbmcoc2VsZiwgaXRlciwgYXJyYXkuYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudHlwZWNvZGUsKSkKKyAgICAgICAgc3VwcG9ydC5jaGVja19mcmVlX2FmdGVyX2l0ZXJhdGluZyhzZWxmLCByZXZlcnNlZCwgYXJyYXkuYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudHlwZWNvZGUsKSkKKwogY2xhc3MgU3RyaW5nVGVzdChCYXNlVGVzdCk6CiAKICAgICBkZWYgdGVzdF9zZXRpdGVtKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hc3QucHkgYi9MaWIvdGVzdC90ZXN0X2FzdC5weQppbmRleCBkM2U2ZDM1Li44YzYyNDA4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FzdC5weQpAQCAtMSw3ICsxLDggQEAKK2ltcG9ydCBhc3QKK2ltcG9ydCBkaXMKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgYXN0CiBpbXBvcnQgd2Vha3JlZgogCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKQEAgLTExNSw2ICsxMTYsOCBAQAogICAgICMgUEVQIDQ0ODogQWRkaXRpb25hbCBVbnBhY2tpbmcgR2VuZXJhbGl6YXRpb25zCiAgICAgInsqKnsxOjJ9LCAyOjN9IiwKICAgICAieyp7MSwgMn0sIDN9IiwKKyAgICAjIEFzeW5jaHJvbm91cyBjb21wcmVoZW5zaW9ucworICAgICJhc3luYyBkZWYgZigpOlxuIFtpIGFzeW5jIGZvciBiIGluIGNdIiwKIF0KIAogIyBUaGVzZSBhcmUgY29tcGlsZWQgdGhyb3VnaCAic2luZ2xlIgpAQCAtMjM4LDcgKzI0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFzdF90cmVlID0gY29tcGlsZShpLCAiPyIsIGtpbmQsIGFzdC5QeUNGX09OTFlfQVNUKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRvX3R1cGxlKGFzdF90cmVlKSwgbykKICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZW9yZGVyKGFzdF90cmVlLCAoMCwgMCkpCi0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoYWN0aW9uPSJjb21waWxpbmciLCBpbnB1dD1pKToKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChhY3Rpb249ImNvbXBpbGluZyIsIGlucHV0PWksIGtpbmQ9a2luZCk6CiAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUoYXN0X3RyZWUsICI/Iiwga2luZCkKIAogICAgIGRlZiB0ZXN0X3NsaWNlKHNlbGYpOgpAQCAtNTQ3LDYgKzU1MCwxNyBAQAogICAgICAgICAgICAgY29tcGlsZShtb2QsICd0ZXN0JywgJ2V4ZWMnKQogICAgICAgICBzZWxmLmFzc2VydEluKCJpbnZhbGlkIGludGVnZXIgdmFsdWU6IE5vbmUiLCBzdHIoY20uZXhjZXB0aW9uKSkKIAorICAgIGRlZiB0ZXN0X2xldmVsX2FzX25vbmUoc2VsZik6CisgICAgICAgIGJvZHkgPSBbYXN0LkltcG9ydEZyb20obW9kdWxlPSd0aW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcz1bYXN0LmFsaWFzKG5hbWU9J3NsZWVwJyldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPTAsIGNvbF9vZmZzZXQ9MCldCisgICAgICAgIG1vZCA9IGFzdC5Nb2R1bGUoYm9keSkKKyAgICAgICAgY29kZSA9IGNvbXBpbGUobW9kLCAndGVzdCcsICdleGVjJykKKyAgICAgICAgbnMgPSB7fQorICAgICAgICBleGVjKGNvZGUsIG5zKQorICAgICAgICBzZWxmLmFzc2VydEluKCdzbGVlcCcsIG5zKQorCiAKIGNsYXNzIEFTVFZhbGlkYXRvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtNzQyLDcgKzc1Niw3IEBACiAKICAgICBkZWYgdGVzdF9pbXBvcnRmcm9tKHNlbGYpOgogICAgICAgICBpbXAgPSBhc3QuSW1wb3J0RnJvbShOb25lLCBbYXN0LmFsaWFzKCJ4IiwgTm9uZSldLCAtNDIpCi0gICAgICAgIHNlbGYuc3RtdChpbXAsICJsZXZlbCBsZXNzIHRoYW4gLTEiKQorICAgICAgICBzZWxmLnN0bXQoaW1wLCAiTmVnYXRpdmUgSW1wb3J0RnJvbSBsZXZlbCIpCiAgICAgICAgIHNlbGYuc3RtdChhc3QuSW1wb3J0RnJvbShOb25lLCBbXSwgMCksICJlbXB0eSBuYW1lcyBvbiBJbXBvcnRGcm9tIikKIAogICAgIGRlZiB0ZXN0X2dsb2JhbChzZWxmKToKQEAgLTc5NywyMSArODExLDIxIEBACiAgICAgZGVmIF9jaGVja19jb21wcmVoZW5zaW9uKHNlbGYsIGZhYyk6CiAgICAgICAgIHNlbGYuZXhwcihmYWMoW10pLCAiY29tcHJlaGVuc2lvbiB3aXRoIG5vIGdlbmVyYXRvcnMiKQogICAgICAgICBnID0gYXN0LmNvbXByZWhlbnNpb24oYXN0Lk5hbWUoIngiLCBhc3QuTG9hZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC5OYW1lKCJ4IiwgYXN0LkxvYWQoKSksIFtdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0Lk5hbWUoIngiLCBhc3QuTG9hZCgpKSwgW10sIDApCiAgICAgICAgIHNlbGYuZXhwcihmYWMoW2ddKSwgIm11c3QgaGF2ZSBTdG9yZSBjb250ZXh0IikKICAgICAgICAgZyA9IGFzdC5jb21wcmVoZW5zaW9uKGFzdC5OYW1lKCJ4IiwgYXN0LlN0b3JlKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0Lk5hbWUoIngiLCBhc3QuU3RvcmUoKSksIFtdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0Lk5hbWUoIngiLCBhc3QuU3RvcmUoKSksIFtdLCAwKQogICAgICAgICBzZWxmLmV4cHIoZmFjKFtnXSksICJtdXN0IGhhdmUgTG9hZCBjb250ZXh0IikKICAgICAgICAgeCA9IGFzdC5OYW1lKCJ4IiwgYXN0LlN0b3JlKCkpCiAgICAgICAgIHkgPSBhc3QuTmFtZSgieSIsIGFzdC5Mb2FkKCkpCi0gICAgICAgIGcgPSBhc3QuY29tcHJlaGVuc2lvbih4LCB5LCBbTm9uZV0pCisgICAgICAgIGcgPSBhc3QuY29tcHJlaGVuc2lvbih4LCB5LCBbTm9uZV0sIDApCiAgICAgICAgIHNlbGYuZXhwcihmYWMoW2ddKSwgIk5vbmUgZGlzYWxsb3dlZCIpCi0gICAgICAgIGcgPSBhc3QuY29tcHJlaGVuc2lvbih4LCB5LCBbYXN0Lk5hbWUoIngiLCBhc3QuU3RvcmUoKSldKQorICAgICAgICBnID0gYXN0LmNvbXByZWhlbnNpb24oeCwgeSwgW2FzdC5OYW1lKCJ4IiwgYXN0LlN0b3JlKCkpXSwgMCkKICAgICAgICAgc2VsZi5leHByKGZhYyhbZ10pLCAibXVzdCBoYXZlIExvYWQgY29udGV4dCIpCiAKICAgICBkZWYgX3NpbXBsZV9jb21wKHNlbGYsIGZhYyk6CiAgICAgICAgIGcgPSBhc3QuY29tcHJlaGVuc2lvbihhc3QuTmFtZSgieCIsIGFzdC5TdG9yZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC5OYW1lKCJ4IiwgYXN0LkxvYWQoKSksIFtdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0Lk5hbWUoIngiLCBhc3QuTG9hZCgpKSwgW10sIDApCiAgICAgICAgIHNlbGYuZXhwcihmYWMoYXN0Lk5hbWUoIngiLCBhc3QuU3RvcmUoKSksIFtnXSksCiAgICAgICAgICAgICAgICAgICAibXVzdCBoYXZlIExvYWQgY29udGV4dCIpCiAgICAgICAgIGRlZiB3cmFwKGdlbnMpOgpAQCAtODI5LDcgKzg0Myw3IEBACiAKICAgICBkZWYgdGVzdF9kaWN0Y29tcChzZWxmKToKICAgICAgICAgZyA9IGFzdC5jb21wcmVoZW5zaW9uKGFzdC5OYW1lKCJ5IiwgYXN0LlN0b3JlKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0Lk5hbWUoInAiLCBhc3QuTG9hZCgpKSwgW10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3QuTmFtZSgicCIsIGFzdC5Mb2FkKCkpLCBbXSwgMCkKICAgICAgICAgYyA9IGFzdC5EaWN0Q29tcChhc3QuTmFtZSgieCIsIGFzdC5TdG9yZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBhc3QuTmFtZSgieSIsIGFzdC5Mb2FkKCkpLCBbZ10pCiAgICAgICAgIHNlbGYuZXhwcihjLCAibXVzdCBoYXZlIExvYWQgY29udGV4dCIpCkBAIC05MzMsNiArOTQ3LDEyNSBAQAogICAgICAgICAgICAgY29tcGlsZShtb2QsIGZuLCAiZXhlYyIpCiAKIAorY2xhc3MgQ29uc3RhbnRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgb24gdGhlIGFzdC5Db25zdGFudCBub2RlIHR5cGUuIiIiCisKKyAgICBkZWYgY29tcGlsZV9jb25zdGFudChzZWxmLCB2YWx1ZSk6CisgICAgICAgIHRyZWUgPSBhc3QucGFyc2UoInggPSAxMjMiKQorCisgICAgICAgIG5vZGUgPSB0cmVlLmJvZHlbMF0udmFsdWUKKyAgICAgICAgbmV3X25vZGUgPSBhc3QuQ29uc3RhbnQodmFsdWU9dmFsdWUpCisgICAgICAgIGFzdC5jb3B5X2xvY2F0aW9uKG5ld19ub2RlLCBub2RlKQorICAgICAgICB0cmVlLmJvZHlbMF0udmFsdWUgPSBuZXdfbm9kZQorCisgICAgICAgIGNvZGUgPSBjb21waWxlKHRyZWUsICI8c3RyaW5nPiIsICJleGVjIikKKworICAgICAgICBucyA9IHt9CisgICAgICAgIGV4ZWMoY29kZSwgbnMpCisgICAgICAgIHJldHVybiBuc1sneCddCisKKyAgICBkZWYgdGVzdF92YWxpZGF0aW9uKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcikgYXMgY206CisgICAgICAgICAgICBzZWxmLmNvbXBpbGVfY29uc3RhbnQoWzEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnb3QgYW4gaW52YWxpZCB0eXBlIGluIENvbnN0YW50OiBsaXN0IikKKworICAgIGRlZiB0ZXN0X3NpbmdsZXRvbnMoc2VsZik6CisgICAgICAgIGZvciBjb25zdCBpbiAoTm9uZSwgRmFsc2UsIFRydWUsIEVsbGlwc2lzLCBiJycsIGZyb3plbnNldCgpKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGNvbnN0PWNvbnN0KToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY29tcGlsZV9jb25zdGFudChjb25zdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHZhbHVlLCBjb25zdCkKKworICAgIGRlZiB0ZXN0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgbmVzdGVkX3R1cGxlID0gKDEsKQorICAgICAgICBuZXN0ZWRfZnJvemVuc2V0ID0gZnJvemVuc2V0KHsxfSkKKyAgICAgICAgZm9yIGxldmVsIGluIHJhbmdlKDMpOgorICAgICAgICAgICAgbmVzdGVkX3R1cGxlID0gKG5lc3RlZF90dXBsZSwgMikKKyAgICAgICAgICAgIG5lc3RlZF9mcm96ZW5zZXQgPSBmcm96ZW5zZXQoe25lc3RlZF9mcm96ZW5zZXQsIDJ9KQorICAgICAgICB2YWx1ZXMgPSAoMTIzLCAxMjMuMCwgMTIzaiwKKyAgICAgICAgICAgICAgICAgICJ1bmljb2RlIiwgYidieXRlcycsCisgICAgICAgICAgICAgICAgICB0dXBsZSgidHVwbGUiKSwgZnJvemVuc2V0KCJmcm96ZW5zZXQiKSwKKyAgICAgICAgICAgICAgICAgIG5lc3RlZF90dXBsZSwgbmVzdGVkX2Zyb3plbnNldCkKKyAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlczoKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHZhbHVlPXZhbHVlKToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbXBpbGVfY29uc3RhbnQodmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHZhbHVlKQorCisgICAgZGVmIHRlc3RfYXNzaWduX3RvX2NvbnN0YW50KHNlbGYpOgorICAgICAgICB0cmVlID0gYXN0LnBhcnNlKCJ4ID0gMSIpCisKKyAgICAgICAgdGFyZ2V0ID0gdHJlZS5ib2R5WzBdLnRhcmdldHNbMF0KKyAgICAgICAgbmV3X3RhcmdldCA9IGFzdC5Db25zdGFudCh2YWx1ZT0xKQorICAgICAgICBhc3QuY29weV9sb2NhdGlvbihuZXdfdGFyZ2V0LCB0YXJnZXQpCisgICAgICAgIHRyZWUuYm9keVswXS50YXJnZXRzWzBdID0gbmV3X3RhcmdldAorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgY206CisgICAgICAgICAgICBjb21waWxlKHRyZWUsICJzdHJpbmciLCAiZXhlYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4cHJlc3Npb24gd2hpY2ggY2FuJ3QgYmUgYXNzaWduZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBpbiBTdG9yZSBjb250ZXh0IikKKworICAgIGRlZiB0ZXN0X2dldF9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgIHRyZWUgPSBhc3QucGFyc2UoIidkb2NzdHJpbmcnXG54ID0gMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmdldF9kb2NzdHJpbmcodHJlZSksICdkb2NzdHJpbmcnKQorCisgICAgICAgIHRyZWUuYm9keVswXS52YWx1ZSA9IGFzdC5Db25zdGFudCh2YWx1ZT0nY29uc3RhbnQgZG9jc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QuZ2V0X2RvY3N0cmluZyh0cmVlKSwgJ2NvbnN0YW50IGRvY3N0cmluZycpCisKKyAgICBkZWYgZ2V0X2xvYWRfY29uc3Qoc2VsZiwgdHJlZSk6CisgICAgICAgICMgQ29tcGlsZSB0byBieXRlY29kZSwgZGlzYXNzZW1ibGUgYW5kIGdldCBwYXJhbWV0ZXIgb2YgTE9BRF9DT05TVAorICAgICAgICAjIGluc3RydWN0aW9ucworICAgICAgICBjbyA9IGNvbXBpbGUodHJlZSwgJzxzdHJpbmc+JywgJ2V4ZWMnKQorICAgICAgICBjb25zdHMgPSBbXQorICAgICAgICBmb3IgaW5zdHIgaW4gZGlzLmdldF9pbnN0cnVjdGlvbnMoY28pOgorICAgICAgICAgICAgaWYgaW5zdHIub3BuYW1lID09ICdMT0FEX0NPTlNUJzoKKyAgICAgICAgICAgICAgICBjb25zdHMuYXBwZW5kKGluc3RyLmFyZ3ZhbCkKKyAgICAgICAgcmV0dXJuIGNvbnN0cworCisgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfbG9hZF9jb25zdChzZWxmKToKKyAgICAgICAgY29uc3RzID0gW05vbmUsCisgICAgICAgICAgICAgICAgICBUcnVlLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgIDEyNCwKKyAgICAgICAgICAgICAgICAgIDIuMCwKKyAgICAgICAgICAgICAgICAgIDNqLAorICAgICAgICAgICAgICAgICAgInVuaWNvZGUiLAorICAgICAgICAgICAgICAgICAgYidieXRlcycsCisgICAgICAgICAgICAgICAgICAoMSwgMiwgMyldCisKKyAgICAgICAgY29kZSA9ICdcbicuam9pbihbJ3g9eyFyfScuZm9ybWF0KGNvbnN0KSBmb3IgY29uc3QgaW4gY29uc3RzXSkKKyAgICAgICAgY29kZSArPSAnXG54ID0gLi4uJworICAgICAgICBjb25zdHMuZXh0ZW5kKChFbGxpcHNpcywgTm9uZSkpCisKKyAgICAgICAgdHJlZSA9IGFzdC5wYXJzZShjb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X2xvYWRfY29uc3QodHJlZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RzKQorCisgICAgICAgICMgUmVwbGFjZSBleHByZXNzaW9uIG5vZGVzIHdpdGggY29uc3RhbnRzCisgICAgICAgIGZvciBhc3NpZ24sIGNvbnN0IGluIHppcCh0cmVlLmJvZHksIGNvbnN0cyk6CisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShhc3NpZ24sIGFzdC5Bc3NpZ24pLCBhc3QuZHVtcChhc3NpZ24pCisgICAgICAgICAgICBuZXdfbm9kZSA9IGFzdC5Db25zdGFudCh2YWx1ZT1jb25zdCkKKyAgICAgICAgICAgIGFzdC5jb3B5X2xvY2F0aW9uKG5ld19ub2RlLCBhc3NpZ24udmFsdWUpCisgICAgICAgICAgICBhc3NpZ24udmFsdWUgPSBuZXdfbm9kZQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfbG9hZF9jb25zdCh0cmVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHMpCisKKyAgICBkZWYgdGVzdF9saXRlcmFsX2V2YWwoc2VsZik6CisgICAgICAgIHRyZWUgPSBhc3QucGFyc2UoIjEgKyAyIikKKyAgICAgICAgYmlub3AgPSB0cmVlLmJvZHlbMF0udmFsdWUKKworICAgICAgICBuZXdfbGVmdCA9IGFzdC5Db25zdGFudCh2YWx1ZT0xMCkKKyAgICAgICAgYXN0LmNvcHlfbG9jYXRpb24obmV3X2xlZnQsIGJpbm9wLmxlZnQpCisgICAgICAgIGJpbm9wLmxlZnQgPSBuZXdfbGVmdAorCisgICAgICAgIG5ld19yaWdodCA9IGFzdC5Db25zdGFudCh2YWx1ZT0yMCkKKyAgICAgICAgYXN0LmNvcHlfbG9jYXRpb24obmV3X3JpZ2h0LCBiaW5vcC5yaWdodCkKKyAgICAgICAgYmlub3AucmlnaHQgPSBuZXdfcmlnaHQKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5saXRlcmFsX2V2YWwoYmlub3ApLCAzMCkKKworCiBkZWYgbWFpbigpOgogICAgIGlmIF9fbmFtZV9fICE9ICdfX21haW5fXyc6CiAgICAgICAgIHJldHVybgpAQCAtOTQwLDggKzEwNzMsOSBAQAogICAgICAgICBmb3Igc3RhdGVtZW50cywga2luZCBpbiAoKGV4ZWNfdGVzdHMsICJleGVjIiksIChzaW5nbGVfdGVzdHMsICJzaW5nbGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmFsX3Rlc3RzLCAiZXZhbCIpKToKICAgICAgICAgICAgIHByaW50KGtpbmQrIl9yZXN1bHRzID0gWyIpCi0gICAgICAgICAgICBmb3IgcyBpbiBzdGF0ZW1lbnRzOgotICAgICAgICAgICAgICAgIHByaW50KHJlcHIodG9fdHVwbGUoY29tcGlsZShzLCAiPyIsIGtpbmQsIDB4NDAwKSkpKyIsIikKKyAgICAgICAgICAgIGZvciBzdGF0ZW1lbnQgaW4gc3RhdGVtZW50czoKKyAgICAgICAgICAgICAgICB0cmVlID0gYXN0LnBhcnNlKHN0YXRlbWVudCwgIj8iLCBraW5kKQorICAgICAgICAgICAgICAgIHByaW50KCIlciwiICUgKHRvX3R1cGxlKHRyZWUpLCkpCiAgICAgICAgICAgICBwcmludCgiXSIpCiAgICAgICAgIHByaW50KCJtYWluKCkiKQogICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CkBAIC05NzksMTkgKzExMTMsMjAgQEAKICgnTW9kdWxlJywgWygnRm9yJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgNCksICd2JywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCA5KSwgJ3YnLCAoJ0xvYWQnLCkpLCBbKCdCcmVhaycsICgxLCAxMSkpXSwgW10pXSksCiAoJ01vZHVsZScsIFsoJ0ZvcicsICgxLCAwKSwgKCdOYW1lJywgKDEsIDQpLCAndicsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgOSksICd2JywgKCdMb2FkJywpKSwgWygnQ29udGludWUnLCAoMSwgMTEpKV0sIFtdKV0pLAogKCdNb2R1bGUnLCBbKCdGb3InLCAoMSwgMCksICgnVHVwbGUnLCAoMSwgNCksIFsoJ05hbWUnLCAoMSwgNCksICdhJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCA2KSwgJ2InLCAoJ1N0b3JlJywpKV0sICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTEpLCAnYycsICgnTG9hZCcsKSksIFsoJ1Bhc3MnLCAoMSwgMTQpKV0sIFtdKV0pLAotKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ0xpc3RDb21wJywgKDEsIDEpLCAoJ1R1cGxlJywgKDEsIDIpLCBbKCdOYW1lJywgKDEsIDIpLCAnYScsICgnTG9hZCcsKSksICgnTmFtZScsICgxLCA0KSwgJ2InLCAoJ0xvYWQnLCkpXSwgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnVHVwbGUnLCAoMSwgMTEpLCBbKCdOYW1lJywgKDEsIDExKSwgJ2EnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDEzKSwgJ2InLCAoJ1N0b3JlJywpKV0sICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTgpLCAnYycsICgnTG9hZCcsKSksIFtdKV0pKV0pLAotKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ0dlbmVyYXRvckV4cCcsICgxLCAxKSwgKCdUdXBsZScsICgxLCAyKSwgWygnTmFtZScsICgxLCAyKSwgJ2EnLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoMSwgNCksICdiJywgKCdMb2FkJywpKV0sICgnTG9hZCcsKSksIFsoJ2NvbXByZWhlbnNpb24nLCAoJ1R1cGxlJywgKDEsIDExKSwgWygnTmFtZScsICgxLCAxMSksICdhJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxMyksICdiJywgKCdTdG9yZScsKSldLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDE4KSwgJ2MnLCAoJ0xvYWQnLCkpLCBbXSldKSldKSwKLSgnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdHZW5lcmF0b3JFeHAnLCAoMSwgMSksICgnVHVwbGUnLCAoMSwgMiksIFsoJ05hbWUnLCAoMSwgMiksICdhJywgKCdMb2FkJywpKSwgKCdOYW1lJywgKDEsIDQpLCAnYicsICgnTG9hZCcsKSldLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdUdXBsZScsICgxLCAxMiksIFsoJ05hbWUnLCAoMSwgMTIpLCAnYScsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTQpLCAnYicsICgnU3RvcmUnLCkpXSwgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAyMCksICdjJywgKCdMb2FkJywpKSwgW10pXSkpXSksCi0oJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnR2VuZXJhdG9yRXhwJywgKDIsIDQpLCAoJ1R1cGxlJywgKDMsIDQpLCBbKCdOYW1lJywgKDMsIDQpLCAnQWEnLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoNSwgNyksICdCYicsICgnTG9hZCcsKSldLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdUdXBsZScsICg4LCA0KSwgWygnTmFtZScsICg4LCA0KSwgJ0FhJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxMCwgNCksICdCYicsICgnU3RvcmUnLCkpXSwgKCdTdG9yZScsKSksICgnTmFtZScsICgxMCwgMTApLCAnQ2MnLCAoJ0xvYWQnLCkpLCBbXSldKSldKSwKLSgnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdEaWN0Q29tcCcsICgxLCAwKSwgKCdOYW1lJywgKDEsIDEpLCAnYScsICgnTG9hZCcsKSksICgnTmFtZScsICgxLCA1KSwgJ2InLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdOYW1lJywgKDEsIDExKSwgJ3cnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDE2KSwgJ3gnLCAoJ0xvYWQnLCkpLCBbXSksICgnY29tcHJlaGVuc2lvbicsICgnTmFtZScsICgxLCAyMiksICdtJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAyNyksICdwJywgKCdMb2FkJywpKSwgWygnTmFtZScsICgxLCAzMiksICdnJywgKCdMb2FkJywpKV0pXSkpXSksCi0oJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnRGljdENvbXAnLCAoMSwgMCksICgnTmFtZScsICgxLCAxKSwgJ2EnLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoMSwgNSksICdiJywgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnVHVwbGUnLCAoMSwgMTEpLCBbKCdOYW1lJywgKDEsIDExKSwgJ3YnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDEzKSwgJ3cnLCAoJ1N0b3JlJywpKV0sICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTgpLCAneCcsICgnTG9hZCcsKSksIFtdKV0pKV0pLAotKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ1NldENvbXAnLCAoMSwgMCksICgnTmFtZScsICgxLCAxKSwgJ3InLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdOYW1lJywgKDEsIDcpLCAnbCcsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTIpLCAneCcsICgnTG9hZCcsKSksIFsoJ05hbWUnLCAoMSwgMTcpLCAnZycsICgnTG9hZCcsKSldKV0pKV0pLAotKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ1NldENvbXAnLCAoMSwgMCksICgnTmFtZScsICgxLCAxKSwgJ3InLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdUdXBsZScsICgxLCA3KSwgWygnTmFtZScsICgxLCA3KSwgJ2wnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDkpLCAnbScsICgnU3RvcmUnLCkpXSwgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxNCksICd4JywgKCdMb2FkJywpKSwgW10pXSkpXSksCisoJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnTGlzdENvbXAnLCAoMSwgMSksICgnVHVwbGUnLCAoMSwgMiksIFsoJ05hbWUnLCAoMSwgMiksICdhJywgKCdMb2FkJywpKSwgKCdOYW1lJywgKDEsIDQpLCAnYicsICgnTG9hZCcsKSldLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdUdXBsZScsICgxLCAxMSksIFsoJ05hbWUnLCAoMSwgMTEpLCAnYScsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTMpLCAnYicsICgnU3RvcmUnLCkpXSwgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxOCksICdjJywgKCdMb2FkJywpKSwgW10sIDApXSkpXSksCisoJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnR2VuZXJhdG9yRXhwJywgKDEsIDEpLCAoJ1R1cGxlJywgKDEsIDIpLCBbKCdOYW1lJywgKDEsIDIpLCAnYScsICgnTG9hZCcsKSksICgnTmFtZScsICgxLCA0KSwgJ2InLCAoJ0xvYWQnLCkpXSwgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnVHVwbGUnLCAoMSwgMTEpLCBbKCdOYW1lJywgKDEsIDExKSwgJ2EnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDEzKSwgJ2InLCAoJ1N0b3JlJywpKV0sICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTgpLCAnYycsICgnTG9hZCcsKSksIFtdLCAwKV0pKV0pLAorKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ0dlbmVyYXRvckV4cCcsICgxLCAxKSwgKCdUdXBsZScsICgxLCAyKSwgWygnTmFtZScsICgxLCAyKSwgJ2EnLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoMSwgNCksICdiJywgKCdMb2FkJywpKV0sICgnTG9hZCcsKSksIFsoJ2NvbXByZWhlbnNpb24nLCAoJ1R1cGxlJywgKDEsIDEyKSwgWygnTmFtZScsICgxLCAxMiksICdhJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxNCksICdiJywgKCdTdG9yZScsKSldLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDIwKSwgJ2MnLCAoJ0xvYWQnLCkpLCBbXSwgMCldKSldKSwKKygnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdHZW5lcmF0b3JFeHAnLCAoMiwgNCksICgnVHVwbGUnLCAoMywgNCksIFsoJ05hbWUnLCAoMywgNCksICdBYScsICgnTG9hZCcsKSksICgnTmFtZScsICg1LCA3KSwgJ0JiJywgKCdMb2FkJywpKV0sICgnTG9hZCcsKSksIFsoJ2NvbXByZWhlbnNpb24nLCAoJ1R1cGxlJywgKDgsIDQpLCBbKCdOYW1lJywgKDgsIDQpLCAnQWEnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEwLCA0KSwgJ0JiJywgKCdTdG9yZScsKSldLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEwLCAxMCksICdDYycsICgnTG9hZCcsKSksIFtdLCAwKV0pKV0pLAorKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ0RpY3RDb21wJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgMSksICdhJywgKCdMb2FkJywpKSwgKCdOYW1lJywgKDEsIDUpLCAnYicsICgnTG9hZCcsKSksIFsoJ2NvbXByZWhlbnNpb24nLCAoJ05hbWUnLCAoMSwgMTEpLCAndycsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTYpLCAneCcsICgnTG9hZCcsKSksIFtdLCAwKSwgKCdjb21wcmVoZW5zaW9uJywgKCdOYW1lJywgKDEsIDIyKSwgJ20nLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDI3KSwgJ3AnLCAoJ0xvYWQnLCkpLCBbKCdOYW1lJywgKDEsIDMyKSwgJ2cnLCAoJ0xvYWQnLCkpXSwgMCldKSldKSwKKygnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdEaWN0Q29tcCcsICgxLCAwKSwgKCdOYW1lJywgKDEsIDEpLCAnYScsICgnTG9hZCcsKSksICgnTmFtZScsICgxLCA1KSwgJ2InLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdUdXBsZScsICgxLCAxMSksIFsoJ05hbWUnLCAoMSwgMTEpLCAndicsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTMpLCAndycsICgnU3RvcmUnLCkpXSwgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxOCksICd4JywgKCdMb2FkJywpKSwgW10sIDApXSkpXSksCisoJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnU2V0Q29tcCcsICgxLCAwKSwgKCdOYW1lJywgKDEsIDEpLCAncicsICgnTG9hZCcsKSksIFsoJ2NvbXByZWhlbnNpb24nLCAoJ05hbWUnLCAoMSwgNyksICdsJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxMiksICd4JywgKCdMb2FkJywpKSwgWygnTmFtZScsICgxLCAxNyksICdnJywgKCdMb2FkJywpKV0sIDApXSkpXSksCisoJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnU2V0Q29tcCcsICgxLCAwKSwgKCdOYW1lJywgKDEsIDEpLCAncicsICgnTG9hZCcsKSksIFsoJ2NvbXByZWhlbnNpb24nLCAoJ1R1cGxlJywgKDEsIDcpLCBbKCdOYW1lJywgKDEsIDcpLCAnbCcsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgOSksICdtJywgKCdTdG9yZScsKSldLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDE0KSwgJ3gnLCAoJ0xvYWQnLCkpLCBbXSwgMCldKSldKSwKICgnTW9kdWxlJywgWygnQXN5bmNGdW5jdGlvbkRlZicsICgxLCA2KSwgJ2YnLCAoJ2FyZ3VtZW50cycsIFtdLCBOb25lLCBbXSwgW10sIE5vbmUsIFtdKSwgWygnRXhwcicsICgyLCAxKSwgKCdBd2FpdCcsICgyLCAxKSwgKCdDYWxsJywgKDIsIDcpLCAoJ05hbWUnLCAoMiwgNyksICdzb21ldGhpbmcnLCAoJ0xvYWQnLCkpLCBbXSwgW10pKSldLCBbXSwgTm9uZSldKSwKICgnTW9kdWxlJywgWygnQXN5bmNGdW5jdGlvbkRlZicsICgxLCA2KSwgJ2YnLCAoJ2FyZ3VtZW50cycsIFtdLCBOb25lLCBbXSwgW10sIE5vbmUsIFtdKSwgWygnQXN5bmNGb3InLCAoMiwgNyksICgnTmFtZScsICgyLCAxMSksICdlJywgKCdTdG9yZScsKSksICgnTmFtZScsICgyLCAxNiksICdpJywgKCdMb2FkJywpKSwgWygnRXhwcicsICgyLCAxOSksICgnTnVtJywgKDIsIDE5KSwgMSkpXSwgWygnRXhwcicsICgzLCA3KSwgKCdOdW0nLCAoMywgNyksIDIpKV0pXSwgW10sIE5vbmUpXSksCiAoJ01vZHVsZScsIFsoJ0FzeW5jRnVuY3Rpb25EZWYnLCAoMSwgNiksICdmJywgKCdhcmd1bWVudHMnLCBbXSwgTm9uZSwgW10sIFtdLCBOb25lLCBbXSksIFsoJ0FzeW5jV2l0aCcsICgyLCA3KSwgWygnd2l0aGl0ZW0nLCAoJ05hbWUnLCAoMiwgMTIpLCAnYScsICgnTG9hZCcsKSksICgnTmFtZScsICgyLCAxNyksICdiJywgKCdTdG9yZScsKSkpXSwgWygnRXhwcicsICgyLCAyMCksICgnTnVtJywgKDIsIDIwKSwgMSkpXSldLCBbXSwgTm9uZSldKSwKICgnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdEaWN0JywgKDEsIDApLCBbTm9uZSwgKCdOdW0nLCAoMSwgMTApLCAyKV0sIFsoJ0RpY3QnLCAoMSwgMyksIFsoJ051bScsICgxLCA0KSwgMSldLCBbKCdOdW0nLCAoMSwgNiksIDIpXSksICgnTnVtJywgKDEsIDEyKSwgMyldKSldKSwKICgnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdTZXQnLCAoMSwgMCksIFsoJ1N0YXJyZWQnLCAoMSwgMSksICgnU2V0JywgKDEsIDIpLCBbKCdOdW0nLCAoMSwgMyksIDEpLCAoJ051bScsICgxLCA2KSwgMildKSwgKCdMb2FkJywpKSwgKCdOdW0nLCAoMSwgMTApLCAzKV0pKV0pLAorKCdNb2R1bGUnLCBbKCdBc3luY0Z1bmN0aW9uRGVmJywgKDEsIDYpLCAnZicsICgnYXJndW1lbnRzJywgW10sIE5vbmUsIFtdLCBbXSwgTm9uZSwgW10pLCBbKCdFeHByJywgKDIsIDEpLCAoJ0xpc3RDb21wJywgKDIsIDIpLCAoJ05hbWUnLCAoMiwgMiksICdpJywgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnTmFtZScsICgyLCAxNCksICdiJywgKCdTdG9yZScsKSksICgnTmFtZScsICgyLCAxOSksICdjJywgKCdMb2FkJywpKSwgW10sIDEpXSkpXSwgW10sIE5vbmUpXSksCiBdCiBzaW5nbGVfcmVzdWx0cyA9IFsKICgnSW50ZXJhY3RpdmUnLCBbKCdFeHByJywgKDEsIDApLCAoJ0Jpbk9wJywgKDEsIDApLCAoJ051bScsICgxLCAwKSwgMSksICgnQWRkJywpLCAoJ051bScsICgxLCAyKSwgMikpKV0pLApAQCAtMTAwNiw4ICsxMTQxLDggQEAKICgnRXhwcmVzc2lvbicsICgnRGljdCcsICgxLCAwKSwgW10sIFtdKSksCiAoJ0V4cHJlc3Npb24nLCAoJ1NldCcsICgxLCAwKSwgWygnTmFtZUNvbnN0YW50JywgKDEsIDEpLCBOb25lKV0pKSwKICgnRXhwcmVzc2lvbicsICgnRGljdCcsICgxLCAwKSwgWygnTnVtJywgKDIsIDYpLCAxKV0sIFsoJ051bScsICg0LCAxMCksIDIpXSkpLAotKCdFeHByZXNzaW9uJywgKCdMaXN0Q29tcCcsICgxLCAxKSwgKCdOYW1lJywgKDEsIDEpLCAnYScsICgnTG9hZCcsKSksIFsoJ2NvbXByZWhlbnNpb24nLCAoJ05hbWUnLCAoMSwgNyksICdiJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxMiksICdjJywgKCdMb2FkJywpKSwgWygnTmFtZScsICgxLCAxNyksICdkJywgKCdMb2FkJywpKV0pXSkpLAotKCdFeHByZXNzaW9uJywgKCdHZW5lcmF0b3JFeHAnLCAoMSwgMSksICgnTmFtZScsICgxLCAxKSwgJ2EnLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdOYW1lJywgKDEsIDcpLCAnYicsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTIpLCAnYycsICgnTG9hZCcsKSksIFsoJ05hbWUnLCAoMSwgMTcpLCAnZCcsICgnTG9hZCcsKSldKV0pKSwKKygnRXhwcmVzc2lvbicsICgnTGlzdENvbXAnLCAoMSwgMSksICgnTmFtZScsICgxLCAxKSwgJ2EnLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdOYW1lJywgKDEsIDcpLCAnYicsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTIpLCAnYycsICgnTG9hZCcsKSksIFsoJ05hbWUnLCAoMSwgMTcpLCAnZCcsICgnTG9hZCcsKSldLCAwKV0pKSwKKygnRXhwcmVzc2lvbicsICgnR2VuZXJhdG9yRXhwJywgKDEsIDEpLCAoJ05hbWUnLCAoMSwgMSksICdhJywgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnTmFtZScsICgxLCA3KSwgJ2InLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDEyKSwgJ2MnLCAoJ0xvYWQnLCkpLCBbKCdOYW1lJywgKDEsIDE3KSwgJ2QnLCAoJ0xvYWQnLCkpXSwgMCldKSksCiAoJ0V4cHJlc3Npb24nLCAoJ0NvbXBhcmUnLCAoMSwgMCksICgnTnVtJywgKDEsIDApLCAxKSwgWygnTHQnLCksICgnTHQnLCldLCBbKCdOdW0nLCAoMSwgNCksIDIpLCAoJ051bScsICgxLCA4KSwgMyldKSksCiAoJ0V4cHJlc3Npb24nLCAoJ0NhbGwnLCAoMSwgMCksICgnTmFtZScsICgxLCAwKSwgJ2YnLCAoJ0xvYWQnLCkpLCBbKCdOdW0nLCAoMSwgMiksIDEpLCAoJ051bScsICgxLCA0KSwgMiksICgnU3RhcnJlZCcsICgxLCAxMCksICgnTmFtZScsICgxLCAxMSksICdkJywgKCdMb2FkJywpKSwgKCdMb2FkJywpKV0sIFsoJ2tleXdvcmQnLCAnYycsICgnTnVtJywgKDEsIDgpLCAzKSksICgna2V5d29yZCcsIE5vbmUsICgnTmFtZScsICgxLCAxNSksICdlJywgKCdMb2FkJywpKSldKSksCiAoJ0V4cHJlc3Npb24nLCAoJ051bScsICgxLCAwKSwgMTApKSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNnZW4ucHkgYi9MaWIvdGVzdC90ZXN0X2FzeW5jZ2VuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjFiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X2FzeW5jZ2VuLnB5CkBAIC0wLDAgKzEsODIzIEBACitpbXBvcnQgYXN5bmNpbworaW1wb3J0IGluc3BlY3QKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKKworCitjbGFzcyBBd2FpdEV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitAdHlwZXMuY29yb3V0aW5lCitkZWYgYXdhaXRhYmxlKCosIHRocm93PUZhbHNlKToKKyAgICBpZiB0aHJvdzoKKyAgICAgICAgeWllbGQgKCd0aHJvdycsKQorICAgIGVsc2U6CisgICAgICAgIHlpZWxkICgncmVzdWx0JywpCisKKworZGVmIHJ1bl91bnRpbF9jb21wbGV0ZShjb3JvKToKKyAgICBleGMgPSBGYWxzZQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGV4YzoKKyAgICAgICAgICAgICAgICBleGMgPSBGYWxzZQorICAgICAgICAgICAgICAgIGZ1dCA9IGNvcm8udGhyb3coQXdhaXRFeGNlcHRpb24pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1dCA9IGNvcm8uc2VuZChOb25lKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbiBhcyBleDoKKyAgICAgICAgICAgIHJldHVybiBleC5hcmdzWzBdCisKKyAgICAgICAgaWYgZnV0ID09ICgndGhyb3cnLCk6CisgICAgICAgICAgICBleGMgPSBUcnVlCisKKworZGVmIHRvX2xpc3QoZ2VuKToKKyAgICBhc3luYyBkZWYgaXRlcmF0ZSgpOgorICAgICAgICByZXMgPSBbXQorICAgICAgICBhc3luYyBmb3IgaSBpbiBnZW46CisgICAgICAgICAgICByZXMuYXBwZW5kKGkpCisgICAgICAgIHJldHVybiByZXMKKworICAgIHJldHVybiBydW5fdW50aWxfY29tcGxldGUoaXRlcmF0ZSgpKQorCisKK2NsYXNzIEFzeW5jR2VuU3ludGF4VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5fc3ludGF4XzAxKHNlbGYpOgorICAgICAgICBjb2RlID0gJycnYXN5bmMgZGVmIGZvbygpOgorICAgICAgICAgICAgYXdhaXQgYWJjCisgICAgICAgICAgICB5aWVsZCBmcm9tIDEyMworICAgICAgICAnJycKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3ludGF4RXJyb3IsICd5aWVsZCBmcm9tLippbnNpZGUgYXN5bmMnKToKKyAgICAgICAgICAgIGV4ZWMoY29kZSwge30sIHt9KQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX3N5bnRheF8wMihzZWxmKToKKyAgICAgICAgY29kZSA9ICcnJ2FzeW5jIGRlZiBmb28oKToKKyAgICAgICAgICAgIHlpZWxkIGZyb20gMTIzCisgICAgICAgICcnJworCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeW50YXhFcnJvciwgJ3lpZWxkIGZyb20uKmluc2lkZSBhc3luYycpOgorICAgICAgICAgICAgZXhlYyhjb2RlLCB7fSwge30pCisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5fc3ludGF4XzAzKHNlbGYpOgorICAgICAgICBjb2RlID0gJycnYXN5bmMgZGVmIGZvbygpOgorICAgICAgICAgICAgYXdhaXQgYWJjCisgICAgICAgICAgICB5aWVsZAorICAgICAgICAgICAgcmV0dXJuIDEyMworICAgICAgICAnJycKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3ludGF4RXJyb3IsICdyZXR1cm4uKnZhbHVlLiphc3luYyBnZW4nKToKKyAgICAgICAgICAgIGV4ZWMoY29kZSwge30sIHt9KQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX3N5bnRheF8wNChzZWxmKToKKyAgICAgICAgY29kZSA9ICcnJ2FzeW5jIGRlZiBmb28oKToKKyAgICAgICAgICAgIHlpZWxkCisgICAgICAgICAgICByZXR1cm4gMTIzCisgICAgICAgICcnJworCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeW50YXhFcnJvciwgJ3JldHVybi4qdmFsdWUuKmFzeW5jIGdlbicpOgorICAgICAgICAgICAgZXhlYyhjb2RlLCB7fSwge30pCisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5fc3ludGF4XzA1KHNlbGYpOgorICAgICAgICBjb2RlID0gJycnYXN5bmMgZGVmIGZvbygpOgorICAgICAgICAgICAgaWYgMDoKKyAgICAgICAgICAgICAgICB5aWVsZAorICAgICAgICAgICAgcmV0dXJuIDEyCisgICAgICAgICcnJworCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeW50YXhFcnJvciwgJ3JldHVybi4qdmFsdWUuKmFzeW5jIGdlbicpOgorICAgICAgICAgICAgZXhlYyhjb2RlLCB7fSwge30pCisKKworY2xhc3MgQXN5bmNHZW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBjb21wYXJlX2dlbmVyYXRvcnMoc2VsZiwgc3luY19nZW4sIGFzeW5jX2dlbik6CisgICAgICAgIGRlZiBzeW5jX2l0ZXJhdGUoZyk6CisgICAgICAgICAgICByZXMgPSBbXQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoZy5fX25leHRfXygpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICByZXMuYXBwZW5kKCdTVE9QJykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgICAgICAgICByZXMuYXBwZW5kKHN0cih0eXBlKGV4KSkpCisgICAgICAgICAgICByZXR1cm4gcmVzCisKKyAgICAgICAgZGVmIGFzeW5jX2l0ZXJhdGUoZyk6CisgICAgICAgICAgICByZXMgPSBbXQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGcuX19hbmV4dF9fKCkuX19uZXh0X18oKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wQXN5bmNJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoJ1NUT1AnKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uIGFzIGV4OgorICAgICAgICAgICAgICAgICAgICBpZiBleC5hcmdzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmFwcGVuZChleC5hcmdzWzBdKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmFwcGVuZCgnRU1QVFkgU3RvcEl0ZXJhdGlvbicpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoc3RyKHR5cGUoZXgpKSkKKyAgICAgICAgICAgIHJldHVybiByZXMKKworICAgICAgICBzeW5jX2dlbl9yZXN1bHQgPSBzeW5jX2l0ZXJhdGUoc3luY19nZW4pCisgICAgICAgIGFzeW5jX2dlbl9yZXN1bHQgPSBhc3luY19pdGVyYXRlKGFzeW5jX2dlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeW5jX2dlbl9yZXN1bHQsIGFzeW5jX2dlbl9yZXN1bHQpCisgICAgICAgIHJldHVybiBhc3luY19nZW5fcmVzdWx0CisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5faXRlcmF0aW9uXzAxKHNlbGYpOgorICAgICAgICBhc3luYyBkZWYgZ2VuKCk6CisgICAgICAgICAgICBhd2FpdCBhd2FpdGFibGUoKQorICAgICAgICAgICAgYSA9IHlpZWxkIDEyMworICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhhLCBOb25lKQorICAgICAgICAgICAgYXdhaXQgYXdhaXRhYmxlKCkKKyAgICAgICAgICAgIHlpZWxkIDQ1NgorICAgICAgICAgICAgYXdhaXQgYXdhaXRhYmxlKCkKKyAgICAgICAgICAgIHlpZWxkIDc4OQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG9fbGlzdChnZW4oKSksIFsxMjMsIDQ1NiwgNzg5XSkKKworICAgIGRlZiB0ZXN0X2FzeW5jX2dlbl9pdGVyYXRpb25fMDIoc2VsZik6CisgICAgICAgIGFzeW5jIGRlZiBnZW4oKToKKyAgICAgICAgICAgIGF3YWl0IGF3YWl0YWJsZSgpCisgICAgICAgICAgICB5aWVsZCAxMjMKKyAgICAgICAgICAgIGF3YWl0IGF3YWl0YWJsZSgpCisKKyAgICAgICAgZyA9IGdlbigpCisgICAgICAgIGFpID0gZy5fX2FpdGVyX18oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFpLl9fYW5leHRfXygpLl9fbmV4dF9fKCksICgncmVzdWx0JywpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFpLl9fYW5leHRfXygpLl9fbmV4dF9fKCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmFyZ3NbMF0sIDEyMykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnU3RvcEl0ZXJhdGlvbiB3YXMgbm90IHJhaXNlZCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhaS5fX2FuZXh0X18oKS5fX25leHRfXygpLCAoJ3Jlc3VsdCcsKSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBhaS5fX2FuZXh0X18oKS5fX25leHRfXygpCisgICAgICAgIGV4Y2VwdCBTdG9wQXN5bmNJdGVyYXRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGV4LmFyZ3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ1N0b3BBc3luY0l0ZXJhdGlvbiB3YXMgbm90IHJhaXNlZCcpCisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5fZXhjZXB0aW9uXzAzKHNlbGYpOgorICAgICAgICBhc3luYyBkZWYgZ2VuKCk6CisgICAgICAgICAgICBhd2FpdCBhd2FpdGFibGUoKQorICAgICAgICAgICAgeWllbGQgMTIzCisgICAgICAgICAgICBhd2FpdCBhd2FpdGFibGUodGhyb3c9VHJ1ZSkKKyAgICAgICAgICAgIHlpZWxkIDQ1NgorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXdhaXRFeGNlcHRpb24pOgorICAgICAgICAgICAgdG9fbGlzdChnZW4oKSkKKworICAgIGRlZiB0ZXN0X2FzeW5jX2dlbl9leGNlcHRpb25fMDQoc2VsZik6CisgICAgICAgIGFzeW5jIGRlZiBnZW4oKToKKyAgICAgICAgICAgIGF3YWl0IGF3YWl0YWJsZSgpCisgICAgICAgICAgICB5aWVsZCAxMjMKKyAgICAgICAgICAgIDEgLyAwCisKKyAgICAgICAgZyA9IGdlbigpCisgICAgICAgIGFpID0gZy5fX2FpdGVyX18oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFpLl9fYW5leHRfXygpLl9fbmV4dF9fKCksICgncmVzdWx0JywpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFpLl9fYW5leHRfXygpLl9fbmV4dF9fKCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmFyZ3NbMF0sIDEyMykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnU3RvcEl0ZXJhdGlvbiB3YXMgbm90IHJhaXNlZCcpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICBhaS5fX2FuZXh0X18oKS5fX25leHRfXygpCisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5fZXhjZXB0aW9uXzA1KHNlbGYpOgorICAgICAgICBhc3luYyBkZWYgZ2VuKCk6CisgICAgICAgICAgICB5aWVsZCAxMjMKKyAgICAgICAgICAgIHJhaXNlIFN0b3BBc3luY0l0ZXJhdGlvbgorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXN5bmMgZ2VuZXJhdG9yLipTdG9wQXN5bmNJdGVyYXRpb24nKToKKyAgICAgICAgICAgIHRvX2xpc3QoZ2VuKCkpCisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5fZXhjZXB0aW9uXzA2KHNlbGYpOgorICAgICAgICBhc3luYyBkZWYgZ2VuKCk6CisgICAgICAgICAgICB5aWVsZCAxMjMKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzeW5jIGdlbmVyYXRvci4qU3RvcEl0ZXJhdGlvbicpOgorICAgICAgICAgICAgdG9fbGlzdChnZW4oKSkKKworICAgIGRlZiB0ZXN0X2FzeW5jX2dlbl9leGNlcHRpb25fMDcoc2VsZik6CisgICAgICAgIGRlZiBzeW5jX2dlbigpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgICAgICAgICAxIC8gMAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB5aWVsZCAyCisgICAgICAgICAgICAgICAgeWllbGQgMworCisgICAgICAgICAgICB5aWVsZCAxMDAKKworICAgICAgICBhc3luYyBkZWYgYXN5bmNfZ2VuKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQgMQorICAgICAgICAgICAgICAgIDEgLyAwCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHlpZWxkIDIKKyAgICAgICAgICAgICAgICB5aWVsZCAzCisKKyAgICAgICAgICAgIHlpZWxkIDEwMAorCisgICAgICAgIHNlbGYuY29tcGFyZV9nZW5lcmF0b3JzKHN5bmNfZ2VuKCksIGFzeW5jX2dlbigpKQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2V4Y2VwdGlvbl8wOChzZWxmKToKKyAgICAgICAgZGVmIHN5bmNfZ2VuKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQgMQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB5aWVsZCAyCisgICAgICAgICAgICAgICAgMSAvIDAKKyAgICAgICAgICAgICAgICB5aWVsZCAzCisKKyAgICAgICAgICAgIHlpZWxkIDEwMAorCisgICAgICAgIGFzeW5jIGRlZiBhc3luY19nZW4oKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRhYmxlKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRhYmxlKCkKKyAgICAgICAgICAgICAgICB5aWVsZCAyCisgICAgICAgICAgICAgICAgMSAvIDAKKyAgICAgICAgICAgICAgICB5aWVsZCAzCisKKyAgICAgICAgICAgIHlpZWxkIDEwMAorCisgICAgICAgIHNlbGYuY29tcGFyZV9nZW5lcmF0b3JzKHN5bmNfZ2VuKCksIGFzeW5jX2dlbigpKQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2V4Y2VwdGlvbl8wOShzZWxmKToKKyAgICAgICAgZGVmIHN5bmNfZ2VuKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQgMQorICAgICAgICAgICAgICAgIDEgLyAwCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHlpZWxkIDIKKyAgICAgICAgICAgICAgICB5aWVsZCAzCisKKyAgICAgICAgICAgIHlpZWxkIDEwMAorCisgICAgICAgIGFzeW5jIGRlZiBhc3luY19nZW4oKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdGFibGUoKQorICAgICAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgICAgICAgICAxIC8gMAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB5aWVsZCAyCisgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRhYmxlKCkKKyAgICAgICAgICAgICAgICB5aWVsZCAzCisKKyAgICAgICAgICAgIHlpZWxkIDEwMAorCisgICAgICAgIHNlbGYuY29tcGFyZV9nZW5lcmF0b3JzKHN5bmNfZ2VuKCksIGFzeW5jX2dlbigpKQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2V4Y2VwdGlvbl8xMChzZWxmKToKKyAgICAgICAgYXN5bmMgZGVmIGdlbigpOgorICAgICAgICAgICAgeWllbGQgMTIzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uLU5vbmUgdmFsdWUgLiogYXN5bmMgZ2VuZXJhdG9yIik6CisgICAgICAgICAgICBnZW4oKS5fX2FuZXh0X18oKS5zZW5kKDEwMCkKKworICAgIGRlZiB0ZXN0X2FzeW5jX2dlbl9hcGlfMDEoc2VsZik6CisgICAgICAgIGFzeW5jIGRlZiBnZW4oKToKKyAgICAgICAgICAgIHlpZWxkIDEyMworCisgICAgICAgIGcgPSBnZW4oKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZy5fX25hbWVfXywgJ2dlbicpCisgICAgICAgIGcuX19uYW1lX18gPSAnMTIzJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcuX19uYW1lX18sICcxMjMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJy5nZW4nLCBnLl9fcXVhbG5hbWVfXykKKyAgICAgICAgZy5fX3F1YWxuYW1lX18gPSAnMTIzJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcuX19xdWFsbmFtZV9fLCAnMTIzJykKKworICAgICAgICBzZWxmLmFzc2VydElzTm9uZShnLmFnX2F3YWl0KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZy5hZ19mcmFtZSwgdHlwZXMuRnJhbWVUeXBlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGcuYWdfcnVubmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGcuYWdfY29kZSwgdHlwZXMuQ29kZVR5cGUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluc3BlY3QuaXNhd2FpdGFibGUoZy5hY2xvc2UoKSkpCisKKworY2xhc3MgQXN5bmNHZW5Bc3luY2lvVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubG9vcCA9IGFzeW5jaW8ubmV3X2V2ZW50X2xvb3AoKQorICAgICAgICBhc3luY2lvLnNldF9ldmVudF9sb29wKE5vbmUpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYubG9vcC5jbG9zZSgpCisgICAgICAgIHNlbGYubG9vcCA9IE5vbmUKKworICAgIGFzeW5jIGRlZiB0b19saXN0KHNlbGYsIGdlbik6CisgICAgICAgIHJlcyA9IFtdCisgICAgICAgIGFzeW5jIGZvciBpIGluIGdlbjoKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoaSkKKyAgICAgICAgcmV0dXJuIHJlcworCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2FzeW5jaW9fMDEoc2VsZik6CisgICAgICAgIGFzeW5jIGRlZiBnZW4oKToKKyAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICB5aWVsZCAyCisgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB5aWVsZCAzCisKKyAgICAgICAgcmVzID0gc2VsZi5sb29wLnJ1bl91bnRpbF9jb21wbGV0ZShzZWxmLnRvX2xpc3QoZ2VuKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgWzEsIDJdKQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2FzeW5jaW9fMDIoc2VsZik6CisgICAgICAgIGFzeW5jIGRlZiBnZW4oKToKKyAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICB5aWVsZCAyCisgICAgICAgICAgICAxIC8gMAorICAgICAgICAgICAgeWllbGQgMworCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5sb29wLnJ1bl91bnRpbF9jb21wbGV0ZShzZWxmLnRvX2xpc3QoZ2VuKCkpKQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2FzeW5jaW9fMDMoc2VsZik6CisgICAgICAgIGxvb3AgPSBzZWxmLmxvb3AKKworICAgICAgICBjbGFzcyBHZW46CisgICAgICAgICAgICBhc3luYyBkZWYgX19haXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9bG9vcCkKKyAgICAgICAgICAgICAgICB5aWVsZCAyCisKKyAgICAgICAgcmVzID0gbG9vcC5ydW5fdW50aWxfY29tcGxldGUoc2VsZi50b19saXN0KEdlbigpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFsxLCAyXSkKKworICAgIGRlZiB0ZXN0X2FzeW5jX2dlbl9hc3luY2lvX2FuZXh0XzA0KHNlbGYpOgorICAgICAgICBhc3luYyBkZWYgZm9vKCk6CisgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHlpZWxkIDIKKyAgICAgICAgICAgICAgICB5aWVsZCAzCisgICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICAgICAgeWllbGQgMTAwMAorICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjAxLCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgIHlpZWxkIDQKKworICAgICAgICBhc3luYyBkZWYgcnVuMSgpOgorICAgICAgICAgICAgaXQgPSBmb28oKS5fX2FpdGVyX18oKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF3YWl0IGl0Ll9fYW5leHRfXygpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhd2FpdCBpdC5fX2FuZXh0X18oKSwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXdhaXQgaXQuX19hbmV4dF9fKCksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF3YWl0IGl0Ll9fYW5leHRfXygpLCA0KQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTdG9wQXN5bmNJdGVyYXRpb24pOgorICAgICAgICAgICAgICAgIGF3YWl0IGl0Ll9fYW5leHRfXygpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BBc3luY0l0ZXJhdGlvbik6CisgICAgICAgICAgICAgICAgYXdhaXQgaXQuX19hbmV4dF9fKCkKKworICAgICAgICBhc3luYyBkZWYgcnVuMigpOgorICAgICAgICAgICAgaXQgPSBmb28oKS5fX2FpdGVyX18oKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF3YWl0IGl0Ll9fYW5leHRfXygpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhd2FpdCBpdC5fX2FuZXh0X18oKSwgMikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpdC5fX2FuZXh0X18oKS50aHJvdyhaZXJvRGl2aXNpb25FcnJvcikKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uIGFzIGV4OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXguYXJnc1swXSwgMTAwMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdTdG9wSXRlcmF0aW9uIHdhcyBub3QgcmFpc2VkJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXdhaXQgaXQuX19hbmV4dF9fKCksIDQpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BBc3luY0l0ZXJhdGlvbik6CisgICAgICAgICAgICAgICAgYXdhaXQgaXQuX19hbmV4dF9fKCkKKworICAgICAgICBzZWxmLmxvb3AucnVuX3VudGlsX2NvbXBsZXRlKHJ1bjEoKSkKKyAgICAgICAgc2VsZi5sb29wLnJ1bl91bnRpbF9jb21wbGV0ZShydW4yKCkpCisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5fYXN5bmNpb19hbmV4dF8wNShzZWxmKToKKyAgICAgICAgYXN5bmMgZGVmIGZvbygpOgorICAgICAgICAgICAgdiA9IHlpZWxkIDEKKyAgICAgICAgICAgIHYgPSB5aWVsZCB2CisgICAgICAgICAgICB5aWVsZCB2ICogMTAwCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bigpOgorICAgICAgICAgICAgaXQgPSBmb28oKS5fX2FpdGVyX18oKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXQuX19hbmV4dF9fKCkuc2VuZChOb25lKQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb24gYXMgZXg6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5hcmdzWzBdLCAxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ1N0b3BJdGVyYXRpb24gd2FzIG5vdCByYWlzZWQnKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXQuX19hbmV4dF9fKCkuc2VuZCgxMCkKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uIGFzIGV4OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXguYXJnc1swXSwgMTApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnU3RvcEl0ZXJhdGlvbiB3YXMgbm90IHJhaXNlZCcpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpdC5fX2FuZXh0X18oKS5zZW5kKDEyKQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb24gYXMgZXg6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5hcmdzWzBdLCAxMjAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ1N0b3BJdGVyYXRpb24gd2FzIG5vdCByYWlzZWQnKQorCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BBc3luY0l0ZXJhdGlvbik6CisgICAgICAgICAgICAgICAgYXdhaXQgaXQuX19hbmV4dF9fKCkKKworICAgICAgICBzZWxmLmxvb3AucnVuX3VudGlsX2NvbXBsZXRlKHJ1bigpKQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2FzeW5jaW9fYWNsb3NlXzA2KHNlbGYpOgorICAgICAgICBhc3luYyBkZWYgZm9vKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQgMQorICAgICAgICAgICAgICAgIDEgLyAwCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICAgICAgeWllbGQgMTIKKworICAgICAgICBhc3luYyBkZWYgcnVuKCk6CisgICAgICAgICAgICBnZW4gPSBmb28oKQorICAgICAgICAgICAgaXQgPSBnZW4uX19haXRlcl9fKCkKKyAgICAgICAgICAgIGF3YWl0IGl0Ll9fYW5leHRfXygpCisgICAgICAgICAgICBhd2FpdCBnZW4uYWNsb3NlKCkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICJhc3luYyBnZW5lcmF0b3IgaWdub3JlZCBHZW5lcmF0b3JFeGl0Iik6CisgICAgICAgICAgICBzZWxmLmxvb3AucnVuX3VudGlsX2NvbXBsZXRlKHJ1bigpKQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2FzeW5jaW9fYWNsb3NlXzA3KHNlbGYpOgorICAgICAgICBET05FID0gMAorCisgICAgICAgIGFzeW5jIGRlZiBmb28oKToKKyAgICAgICAgICAgIG5vbmxvY2FsIERPTkUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgICAgICAgICAgMSAvIDAKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjAxLCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgICAgIERPTkUgKz0gMQorICAgICAgICAgICAgRE9ORSArPSAxMDAwCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bigpOgorICAgICAgICAgICAgZ2VuID0gZm9vKCkKKyAgICAgICAgICAgIGl0ID0gZ2VuLl9fYWl0ZXJfXygpCisgICAgICAgICAgICBhd2FpdCBpdC5fX2FuZXh0X18oKQorICAgICAgICAgICAgYXdhaXQgZ2VuLmFjbG9zZSgpCisKKyAgICAgICAgc2VsZi5sb29wLnJ1bl91bnRpbF9jb21wbGV0ZShydW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChET05FLCAxKQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2FzeW5jaW9fYWNsb3NlXzA4KHNlbGYpOgorICAgICAgICBET05FID0gMAorCisgICAgICAgIGZ1dCA9IGFzeW5jaW8uRnV0dXJlKGxvb3A9c2VsZi5sb29wKQorCisgICAgICAgIGFzeW5jIGRlZiBmb28oKToKKyAgICAgICAgICAgIG5vbmxvY2FsIERPTkUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgICAgICAgICAgYXdhaXQgZnV0CisgICAgICAgICAgICAgICAgRE9ORSArPSAxMDAwCisgICAgICAgICAgICAgICAgeWllbGQgMgorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICAgICAgRE9ORSArPSAxCisgICAgICAgICAgICBET05FICs9IDEwMDAKKworICAgICAgICBhc3luYyBkZWYgcnVuKCk6CisgICAgICAgICAgICBnZW4gPSBmb28oKQorICAgICAgICAgICAgaXQgPSBnZW4uX19haXRlcl9fKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXdhaXQgaXQuX19hbmV4dF9fKCksIDEpCisgICAgICAgICAgICB0ID0gc2VsZi5sb29wLmNyZWF0ZV90YXNrKGl0Ll9fYW5leHRfXygpKQorICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjAxLCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgIGF3YWl0IGdlbi5hY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuIHQKKworICAgICAgICB0ID0gc2VsZi5sb29wLnJ1bl91bnRpbF9jb21wbGV0ZShydW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChET05FLCAxKQorCisgICAgICAgICMgU2lsZW5jZSBSZXNvdXJjZVdhcm5pbmdzCisgICAgICAgIGZ1dC5jYW5jZWwoKQorICAgICAgICB0LmNhbmNlbCgpCisgICAgICAgIHNlbGYubG9vcC5ydW5fdW50aWxfY29tcGxldGUoYXN5bmNpby5zbGVlcCgwLjAxLCBsb29wPXNlbGYubG9vcCkpCisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5fYXN5bmNpb19nY19hY2xvc2VfMDkoc2VsZik6CisgICAgICAgIERPTkUgPSAwCisKKyAgICAgICAgYXN5bmMgZGVmIGdlbigpOgorICAgICAgICAgICAgbm9ubG9jYWwgRE9ORQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjAxLCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgICAgIERPTkUgPSAxCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bigpOgorICAgICAgICAgICAgZyA9IGdlbigpCisgICAgICAgICAgICBhd2FpdCBnLl9fYW5leHRfXygpCisgICAgICAgICAgICBhd2FpdCBnLl9fYW5leHRfXygpCisgICAgICAgICAgICBkZWwgZworCisgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMSwgbG9vcD1zZWxmLmxvb3ApCisKKyAgICAgICAgc2VsZi5sb29wLnJ1bl91bnRpbF9jb21wbGV0ZShydW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChET05FLCAxKQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2FzeW5jaW9fYXNlbmRfMDEoc2VsZik6CisgICAgICAgIERPTkUgPSAwCisKKyAgICAgICAgIyBTYW5pdHkgY2hlY2s6CisgICAgICAgIGRlZiBzZ2VuKCk6CisgICAgICAgICAgICB2ID0geWllbGQgMQorICAgICAgICAgICAgeWllbGQgdiAqIDIKKyAgICAgICAgc2cgPSBzZ2VuKCkKKyAgICAgICAgdiA9IHNnLnNlbmQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCAxKQorICAgICAgICB2ID0gc2cuc2VuZCgxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgMjAwKQorCisgICAgICAgIGFzeW5jIGRlZiBnZW4oKToKKyAgICAgICAgICAgIG5vbmxvY2FsIERPTkUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgICAgIHYgPSB5aWVsZCAxCisgICAgICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjAxLCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgICAgICB5aWVsZCB2ICogMgorICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjAxLCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgICAgICBET05FID0gMQorCisgICAgICAgIGFzeW5jIGRlZiBydW4oKToKKyAgICAgICAgICAgIGcgPSBnZW4oKQorCisgICAgICAgICAgICB2ID0gYXdhaXQgZy5hc2VuZChOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCAxKQorCisgICAgICAgICAgICB2ID0gYXdhaXQgZy5hc2VuZCgxMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIDIwMCkKKworICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTdG9wQXN5bmNJdGVyYXRpb24pOgorICAgICAgICAgICAgICAgIGF3YWl0IGcuYXNlbmQoTm9uZSkKKworICAgICAgICBzZWxmLmxvb3AucnVuX3VudGlsX2NvbXBsZXRlKHJ1bigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERPTkUsIDEpCisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5fYXN5bmNpb19hc2VuZF8wMihzZWxmKToKKyAgICAgICAgRE9ORSA9IDAKKworICAgICAgICBhc3luYyBkZWYgc2xlZXBfbl9jcmFzaChkZWxheSk6CisgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKGRlbGF5LCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgIDEgLyAwCisKKyAgICAgICAgYXN5bmMgZGVmIGdlbigpOgorICAgICAgICAgICAgbm9ubG9jYWwgRE9ORQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICAgICAgdiA9IHlpZWxkIDEKKyAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcF9uX2NyYXNoKDAuMDEpCisgICAgICAgICAgICAgICAgRE9ORSArPSAxMDAwCisgICAgICAgICAgICAgICAgeWllbGQgdiAqIDIKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjAxLCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgICAgIERPTkUgPSAxCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bigpOgorICAgICAgICAgICAgZyA9IGdlbigpCisKKyAgICAgICAgICAgIHYgPSBhd2FpdCBnLmFzZW5kKE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIDEpCisKKyAgICAgICAgICAgIGF3YWl0IGcuYXNlbmQoMTAwKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5sb29wLnJ1bl91bnRpbF9jb21wbGV0ZShydW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChET05FLCAxKQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2FzeW5jaW9fYXNlbmRfMDMoc2VsZik6CisgICAgICAgIERPTkUgPSAwCisKKyAgICAgICAgYXN5bmMgZGVmIHNsZWVwX25fY3Jhc2goZGVsYXkpOgorICAgICAgICAgICAgZnV0ID0gYXN5bmNpby5lbnN1cmVfZnV0dXJlKGFzeW5jaW8uc2xlZXAoZGVsYXksIGxvb3A9c2VsZi5sb29wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgIHNlbGYubG9vcC5jYWxsX2xhdGVyKGRlbGF5IC8gMiwgbGFtYmRhOiBmdXQuY2FuY2VsKCkpCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgZnV0CisKKyAgICAgICAgYXN5bmMgZGVmIGdlbigpOgorICAgICAgICAgICAgbm9ubG9jYWwgRE9ORQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICAgICAgdiA9IHlpZWxkIDEKKyAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcF9uX2NyYXNoKDAuMDEpCisgICAgICAgICAgICAgICAgRE9ORSArPSAxMDAwCisgICAgICAgICAgICAgICAgeWllbGQgdiAqIDIKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjAxLCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgICAgIERPTkUgPSAxCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bigpOgorICAgICAgICAgICAgZyA9IGdlbigpCisKKyAgICAgICAgICAgIHYgPSBhd2FpdCBnLmFzZW5kKE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIDEpCisKKyAgICAgICAgICAgIGF3YWl0IGcuYXNlbmQoMTAwKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoYXN5bmNpby5DYW5jZWxsZWRFcnJvcik6CisgICAgICAgICAgICBzZWxmLmxvb3AucnVuX3VudGlsX2NvbXBsZXRlKHJ1bigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERPTkUsIDEpCisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5fYXN5bmNpb19hdGhyb3dfMDEoc2VsZik6CisgICAgICAgIERPTkUgPSAwCisKKyAgICAgICAgY2xhc3MgRm9vRXIoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIFNhbml0eSBjaGVjazoKKyAgICAgICAgZGVmIHNnZW4oKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2ID0geWllbGQgMQorICAgICAgICAgICAgZXhjZXB0IEZvb0VyOgorICAgICAgICAgICAgICAgIHYgPSAxMDAwCisgICAgICAgICAgICB5aWVsZCB2ICogMgorICAgICAgICBzZyA9IHNnZW4oKQorICAgICAgICB2ID0gc2cuc2VuZChOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIDEpCisgICAgICAgIHYgPSBzZy50aHJvdyhGb29FcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCAyMDAwKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24pOgorICAgICAgICAgICAgc2cuc2VuZChOb25lKQorCisgICAgICAgIGFzeW5jIGRlZiBnZW4oKToKKyAgICAgICAgICAgIG5vbmxvY2FsIERPTkUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdiA9IHlpZWxkIDEKKyAgICAgICAgICAgICAgICBleGNlcHQgRm9vRXI6CisgICAgICAgICAgICAgICAgICAgIHYgPSAxMDAwCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICAgICAgeWllbGQgdiAqIDIKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgICAgICMgcmV0dXJuCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjAxLCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgICAgICBET05FID0gMQorCisgICAgICAgIGFzeW5jIGRlZiBydW4oKToKKyAgICAgICAgICAgIGcgPSBnZW4oKQorCisgICAgICAgICAgICB2ID0gYXdhaXQgZy5hc2VuZChOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCAxKQorCisgICAgICAgICAgICB2ID0gYXdhaXQgZy5hdGhyb3coRm9vRXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIDIwMDApCisKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEFzeW5jSXRlcmF0aW9uKToKKyAgICAgICAgICAgICAgICBhd2FpdCBnLmFzZW5kKE5vbmUpCisKKyAgICAgICAgc2VsZi5sb29wLnJ1bl91bnRpbF9jb21wbGV0ZShydW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChET05FLCAxKQorCisgICAgZGVmIHRlc3RfYXN5bmNfZ2VuX2FzeW5jaW9fYXRocm93XzAyKHNlbGYpOgorICAgICAgICBET05FID0gMAorCisgICAgICAgIGNsYXNzIEZvb0VyKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYXN5bmMgZGVmIHNsZWVwX25fY3Jhc2goZGVsYXkpOgorICAgICAgICAgICAgZnV0ID0gYXN5bmNpby5lbnN1cmVfZnV0dXJlKGFzeW5jaW8uc2xlZXAoZGVsYXksIGxvb3A9c2VsZi5sb29wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgIHNlbGYubG9vcC5jYWxsX2xhdGVyKGRlbGF5IC8gMiwgbGFtYmRhOiBmdXQuY2FuY2VsKCkpCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgZnV0CisKKyAgICAgICAgYXN5bmMgZGVmIGdlbigpOgorICAgICAgICAgICAgbm9ubG9jYWwgRE9ORQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB2ID0geWllbGQgMQorICAgICAgICAgICAgICAgIGV4Y2VwdCBGb29FcjoKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXBfbl9jcmFzaCgwLjAxKQorICAgICAgICAgICAgICAgIHlpZWxkIHYgKiAyCisgICAgICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjAxLCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgICAgICAjIHJldHVybgorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMDEsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4wMSwgbG9vcD1zZWxmLmxvb3ApCisgICAgICAgICAgICAgICAgRE9ORSA9IDEKKworICAgICAgICBhc3luYyBkZWYgcnVuKCk6CisgICAgICAgICAgICBnID0gZ2VuKCkKKworICAgICAgICAgICAgdiA9IGF3YWl0IGcuYXNlbmQoTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgMSkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGF3YWl0IGcuYXRocm93KEZvb0VyKQorICAgICAgICAgICAgZXhjZXB0IGFzeW5jaW8uQ2FuY2VsbGVkRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChET05FLCAxKQorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnQ2FuY2VsbGVkRXJyb3Igd2FzIG5vdCByYWlzZWQnKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoYXN5bmNpby5DYW5jZWxsZWRFcnJvcik6CisgICAgICAgICAgICBzZWxmLmxvb3AucnVuX3VudGlsX2NvbXBsZXRlKHJ1bigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERPTkUsIDEpCisKKyAgICBkZWYgdGVzdF9hc3luY19nZW5fYXN5bmNpb19zaHV0ZG93bl8wMShzZWxmKToKKyAgICAgICAgZmluYWxpemVkID0gMAorCisgICAgICAgIGFzeW5jIGRlZiB3YWl0ZXIodGltZW91dCk6CisgICAgICAgICAgICBub25sb2NhbCBmaW5hbGl6ZWQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKHRpbWVvdXQsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLCBsb29wPXNlbGYubG9vcCkKKyAgICAgICAgICAgICAgICBmaW5hbGl6ZWQgKz0gMQorCisgICAgICAgIGFzeW5jIGRlZiB3YWl0KCk6CisgICAgICAgICAgICBhc3luYyBmb3IgXyBpbiB3YWl0ZXIoMSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHQxID0gc2VsZi5sb29wLmNyZWF0ZV90YXNrKHdhaXQoKSkKKyAgICAgICAgdDIgPSBzZWxmLmxvb3AuY3JlYXRlX3Rhc2sod2FpdCgpKQorCisgICAgICAgIHNlbGYubG9vcC5ydW5fdW50aWxfY29tcGxldGUoYXN5bmNpby5zbGVlcCgwLjEsIGxvb3A9c2VsZi5sb29wKSkKKworICAgICAgICBzZWxmLmxvb3AucnVuX3VudGlsX2NvbXBsZXRlKHNlbGYubG9vcC5zaHV0ZG93bl9hc3luY2dlbnMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaW5hbGl6ZWQsIDIpCisKKyAgICAgICAgIyBTaWxlbmNlIHdhcm5pbmdzCisgICAgICAgIHQxLmNhbmNlbCgpCisgICAgICAgIHQyLmNhbmNlbCgpCisgICAgICAgIHNlbGYubG9vcC5ydW5fdW50aWxfY29tcGxldGUoYXN5bmNpby5zbGVlcCgwLjEsIGxvb3A9c2VsZi5sb29wKSkKKworICAgIGRlZiB0ZXN0X2FzeW5jX2dlbl9hc3luY2lvX3NodXRkb3duXzAyKHNlbGYpOgorICAgICAgICBsb2dnZWQgPSAwCisKKyAgICAgICAgZGVmIGxvZ2dlcihsb29wLCBjb250ZXh0KToKKyAgICAgICAgICAgIG5vbmxvY2FsIGxvZ2dlZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignYXN5bmNnZW4nLCBjb250ZXh0KQorICAgICAgICAgICAgZXhwZWN0ZWQgPSAnYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNsb3Npbmcgb2YgYXN5bmNocm9ub3VzJworICAgICAgICAgICAgaWYgZXhwZWN0ZWQgaW4gY29udGV4dFsnbWVzc2FnZSddOgorICAgICAgICAgICAgICAgIGxvZ2dlZCArPSAxCisKKyAgICAgICAgYXN5bmMgZGVmIHdhaXRlcih0aW1lb3V0KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKHRpbWVvdXQsIGxvb3A9c2VsZi5sb29wKQorICAgICAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgMSAvIDAKKworICAgICAgICBhc3luYyBkZWYgd2FpdCgpOgorICAgICAgICAgICAgYXN5bmMgZm9yIF8gaW4gd2FpdGVyKDEpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0ID0gc2VsZi5sb29wLmNyZWF0ZV90YXNrKHdhaXQoKSkKKyAgICAgICAgc2VsZi5sb29wLnJ1bl91bnRpbF9jb21wbGV0ZShhc3luY2lvLnNsZWVwKDAuMSwgbG9vcD1zZWxmLmxvb3ApKQorCisgICAgICAgIHNlbGYubG9vcC5zZXRfZXhjZXB0aW9uX2hhbmRsZXIobG9nZ2VyKQorICAgICAgICBzZWxmLmxvb3AucnVuX3VudGlsX2NvbXBsZXRlKHNlbGYubG9vcC5zaHV0ZG93bl9hc3luY2dlbnMoKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZ2dlZCwgMSkKKworICAgICAgICAjIFNpbGVuY2Ugd2FybmluZ3MKKyAgICAgICAgdC5jYW5jZWwoKQorICAgICAgICBzZWxmLmxvb3AucnVuX3VudGlsX2NvbXBsZXRlKGFzeW5jaW8uc2xlZXAoMC4xLCBsb29wPXNlbGYubG9vcCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FzeW5jaGF0LnB5IGIvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weQppbmRleCAzYTMzZmM4Li4wZWJhNzZkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FzeW5jaGF0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXN5bmNoYXQucHkKQEAgLTEyLDcgKzEyLDYgQEAKIGltcG9ydCBzeXMKIGltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB3YXJuaW5ncwogaW1wb3J0IHVuaXR0ZXN0Lm1vY2sKIHRyeToKICAgICBpbXBvcnQgdGhyZWFkaW5nCkBAIC0yOTcsMzcgKzI5Niw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN5bmNoYXQuZmluZF9wcmVmaXhfYXRfZW5kKCJxd2VydHlka2pmIiwgIlxyXG4iKSwgMCkKIAogCi1jbGFzcyBUZXN0Rmlmbyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpIGFzIGNtOgotICAgICAgICAgICAgZiA9IGFzeW5jaGF0LmZpZm8oKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS53YXJuaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZmlmbyBjbGFzcyB3aWxsIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuNiIpCi0gICAgICAgIGYucHVzaCg3KQotICAgICAgICBmLnB1c2goYidhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZiksIDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5maXJzdCgpLCA3KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgxLCA3KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZiksIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5maXJzdCgpLCBiJ2EnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuaXNfZW1wdHkoKSwgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDEsIGInYScpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmKSwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmlzX2VtcHR5KCksIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDAsIE5vbmUpKQotCi0gICAgZGVmIHRlc3RfZ2l2ZW5fbGlzdChzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZykgYXMgY206Ci0gICAgICAgICAgICBmID0gYXN5bmNoYXQuZmlmbyhbYid4JywgMTcsIDNdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS53YXJuaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZmlmbyBjbGFzcyB3aWxsIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuNiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGYpLCAzKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgxLCBiJ3gnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgMTcpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgxLCAzKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMCwgTm9uZSkpCi0KLQogY2xhc3MgVGVzdE5vdENvbm5lY3RlZCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZGlzYWxsb3dfbmVnYXRpdmVfdGVybWluYXRvcihzZWxmKToKICAgICAgICAgIyBJc3N1ZSAjMTEyNTkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNpby90ZXN0X3N0cmVhbXMucHkgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaW8vdGVzdF9zdHJlYW1zLnB5CmluZGV4IDE3ODNkNWYuLjM1NTU3YzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNpby90ZXN0X3N0cmVhbXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3luY2lvL3Rlc3Rfc3RyZWFtcy5weQpAQCAtODMxLDcgKzgzMSw3IEBACiAgICAgICAgIHN0cmVhbS5fd2FpdGVyID0gYXN5bmNpby5GdXR1cmUobG9vcD1zZWxmLmxvb3ApCiAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgoCiAgICAgICAgICAgICByZXByKHN0cmVhbSksCi0gICAgICAgICAgICAiPFN0cmVhbVJlYWRlciB3PTxGdXR1cmUgcGVuZGluZ1tcUyBdKj4+IikKKyAgICAgICAgICAgIHIiPFN0cmVhbVJlYWRlciB3PTxGdXR1cmUgcGVuZGluZ1tcUyBdKj4+IikKICAgICAgICAgc3RyZWFtLl93YWl0ZXIuc2V0X3Jlc3VsdChOb25lKQogICAgICAgICBzZWxmLmxvb3AucnVuX3VudGlsX2NvbXBsZXRlKHN0cmVhbS5fd2FpdGVyKQogICAgICAgICBzdHJlYW0uX3dhaXRlciA9IE5vbmUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNvcmUucHkgYi9MaWIvdGVzdC90ZXN0X2FzeW5jb3JlLnB5CmluZGV4IDM4NTc5MTYuLmRiZWU1OTMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNvcmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3luY29yZS5weQpAQCAtMTEsNiArMTEsOSBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCiAKK2lmIHN1cHBvcnQuUEdPOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJ0ZXN0IGlzIG5vdCBoZWxwZnVsIGZvciBQR08iKQorCiB0cnk6CiAgICAgaW1wb3J0IHRocmVhZGluZwogZXhjZXB0IEltcG9ydEVycm9yOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkgYi9MaWIvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weQppbmRleCA1MDkzZTlkLi41OTMwZDllIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weQpAQCAtODMsNiArODMsMTAgQEAKICAgICAgICAgICAgIGRlZiBfX2lhZGRfXyhzZWxmLCB2YWwpOgogICAgICAgICAgICAgICAgIHJldHVybiBhdWdfdGVzdDMoc2VsZi52YWwgKyB2YWwpCiAKKyAgICAgICAgY2xhc3MgYXVnX3Rlc3Q0KGF1Z190ZXN0Myk6CisgICAgICAgICAgICAiIiJCbG9ja3MgaW5oZXJpdGFuY2UsIGFuZCBmYWxsYmFjayB0byBfX2FkZF9fIiIiCisgICAgICAgICAgICBfX2lhZGRfXyA9IE5vbmUKKwogICAgICAgICB4ID0gYXVnX3Rlc3QoMSkKICAgICAgICAgeSA9IHgKICAgICAgICAgeCArPSAxMApAQCAtMTA2LDYgKzExMCwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnZhbCwgMTMpCiAKKyAgICAgICAgeCA9IGF1Z190ZXN0NCg0KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICB4ICs9IDEwCisKIAogICAgIGRlZiB0ZXN0Q3VzdG9tTWV0aG9kczIodGVzdF9zZWxmKToKICAgICAgICAgb3V0cHV0ID0gW10KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwMzUyLnB5IGIvTGliL3Rlc3QvdGVzdF9iYXNlZXhjZXB0aW9uLnB5CnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIExpYi90ZXN0L3Rlc3RfcGVwMzUyLnB5CnJlbmFtZSB0byBMaWIvdGVzdC90ZXN0X2Jhc2VleGNlcHRpb24ucHkKaW5kZXggN2M5OGM0Ni4uMjdkNTE0ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAzNTIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iYXNlZXhjZXB0aW9uLnB5CkBAIC0xLDYgKzEsNSBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgYnVpbHRpbnMKLWltcG9ydCB3YXJuaW5ncwogaW1wb3J0IG9zCiBmcm9tIHBsYXRmb3JtIGltcG9ydCBzeXN0ZW0gYXMgcGxhdGZvcm1fc3lzdGVtCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5IGIvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkKaW5kZXggNDBhYzliZi4uNjEzM2JiYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkKQEAgLTE0LDcgKzE0LDYgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9wZXJhdG9yCiBpbXBvcnQgc3lzCi1pbXBvcnQgZnVuY3Rvb2xzCiAKICMgVGhlc2UgdGVzdHMgYWxsIHVzZSBvbmUgb2YgdGhlIGJpZ21lbXRlc3QgZGVjb3JhdG9ycyB0byBpbmRpY2F0ZSBob3cgbXVjaAogIyBtZW1vcnkgdGhleSB1c2UgYW5kIGhvdyBtdWNoIG1lbW9yeSB0aGV5IG5lZWQgdG8gYmUgZXZlbiBtZWFuaW5nZnVsLiAgVGhlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5IGIvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQppbmRleCA4MzY3YWZlLi5mYmM5MzNlNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5CkBAIC0xNTksMTEgKzE1OSwyNSBAQAogICAgICAgICAjIFRoZW4gY2FsY3VsYXRlIHRoZSBoZXhiaW40IGJpbmFyeS10by1BU0NJSSB0cmFuc2xhdGlvbgogICAgICAgICBybGUgPSBiaW5hc2NpaS5ybGVjb2RlX2hxeChzZWxmLmRhdGEpCiAgICAgICAgIGEgPSBiaW5hc2NpaS5iMmFfaHF4KHNlbGYudHlwZTJ0ZXN0KHJsZSkpCisKICAgICAgICAgYiwgXyA9IGJpbmFzY2lpLmEyYl9ocXgoc2VsZi50eXBlMnRlc3QoYSkpCiAgICAgICAgIHJlcyA9IGJpbmFzY2lpLnJsZWRlY29kZV9ocXgoYikKLQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgc2VsZi5yYXdkYXRhKQogCisgICAgZGVmIHRlc3RfcmxlKHNlbGYpOgorICAgICAgICAjIHRlc3QgcmVwZXRpdGlvbiB3aXRoIGEgcmVwZXRpdGlvbiBsb25nZXIgdGhhbiB0aGUgbGltaXQgb2YgMjU1CisgICAgICAgIGRhdGEgPSAoYidhJyAqIDEwMCArIGInYicgKyBiJ2MnICogMzAwKQorCisgICAgICAgIGVuY29kZWQgPSBiaW5hc2NpaS5ybGVjb2RlX2hxeChkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGInYVx4OTBkJyAgICAgICMgJ2EnICogMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGInYicgICAgICAgICAgICMgJ2InCisgICAgICAgICAgICAgICAgICAgICAgICAgIGInY1x4OTBceGZmJyAgICMgJ2MnICogMjU1CisgICAgICAgICAgICAgICAgICAgICAgICAgIGInY1x4OTAtJykpICAgICMgJ2MnICogNDUKKworICAgICAgICBkZWNvZGVkID0gYmluYXNjaWkucmxlZGVjb2RlX2hxeChlbmNvZGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWQsIGRhdGEpCisKICAgICBkZWYgdGVzdF9oZXgoc2VsZik6CiAgICAgICAgICMgdGVzdCBoZXhsaWZpY2F0aW9uCiAgICAgICAgIHMgPSBiJ3tzXDAwNVwwMDBcMDAwXDAwMHdvcmxkaVwwMDJcMDAwXDAwMFwwMDBzXDAwNVwwMDBcMDAwXDAwMGhlbGxvaVwwMDFcMDAwXDAwMFwwMDAwJwpAQCAtMjYyLDYgKzI3NiwxNiBAQAogICAgICAgICAgICAgIyBub24tQVNDSUkgc3RyaW5nCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhMmIsICJceDgwIikKIAorICAgIGRlZiB0ZXN0X2IyYV9iYXNlNjRfbmV3bGluZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMjUzNTc6IHRlc3QgbmV3bGluZSBwYXJhbWV0ZXIKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmIyYV9iYXNlNjQoYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidhR1ZzYkc4PVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfYmFzZTY0KGIsIG5ld2xpbmU9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidhR1ZzYkc4PVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfYmFzZTY0KGIsIG5ld2xpbmU9RmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYUdWc2JHOD0nKQorCiAKIGNsYXNzIEFycmF5QmluQVNDSUlUZXN0KEJpbkFTQ0lJVGVzdCk6CiAgICAgZGVmIHR5cGUydGVzdChzZWxmLCBzKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5IGIvTGliL3Rlc3QvdGVzdF9iaW5oZXgucHkKaW5kZXggOWQ0Yzg1YS4uMjFmNDQ2MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9iaW5oZXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaW5oZXgucHkKQEAgLTQsNyArNCw2IEBACiAgICBCYXNlZCBvbiBhbiBvcmlnaW5hbCB0ZXN0IGJ5IFJvZ2VyIEUuIE1hc3NlLgogIiIiCiBpbXBvcnQgYmluaGV4Ci1pbXBvcnQgb3MKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmlub3AucHkgYi9MaWIvdGVzdC90ZXN0X2Jpbm9wLnB5CmluZGV4IGU5ZGJkZGMuLjNlZDAxOGUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmlub3AucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaW5vcC5weQpAQCAtMiw3ICsyLDcgQEAKIAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKLWZyb20gb3BlcmF0b3IgaW1wb3J0IGVxLCBuZSwgbHQsIGd0LCBsZSwgZ2UKK2Zyb20gb3BlcmF0b3IgaW1wb3J0IGVxLCBsZSwgbmUKIGZyb20gYWJjIGltcG9ydCBBQkNNZXRhCiAKIGRlZiBnY2QoYSwgYik6CkBAIC0zODgsNiArMzg4LDU0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Bfc2VxdWVuY2UoZXEsIEIsIFYpLCBbJ0IuX19lcV9fJywgJ1YuX19lcV9fJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Bfc2VxdWVuY2UobGUsIEIsIFYpLCBbJ0IuX19sZV9fJywgJ1YuX19nZV9fJ10pCiAKK2NsYXNzIFN1cEVxKG9iamVjdCk6CisgICAgIiIiQ2xhc3MgdGhhdCBjYW4gdGVzdCBlcXVhbGl0eSIiIgorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCitjbGFzcyBTKFN1cEVxKToKKyAgICAiIiJTdWJjbGFzcyBvZiBTdXBFcSB0aGF0IHNob3VsZCBmYWlsIiIiCisgICAgX19lcV9fID0gTm9uZQorCitjbGFzcyBGKG9iamVjdCk6CisgICAgIiIiSW5kZXBlbmRlbnQgY2xhc3MgdGhhdCBzaG91bGQgZmFsbCBiYWNrIiIiCisKK2NsYXNzIFgob2JqZWN0KToKKyAgICAiIiJJbmRlcGVuZGVudCBjbGFzcyB0aGF0IHNob3VsZCBmYWlsIiIiCisgICAgX19lcV9fID0gTm9uZQorCitjbGFzcyBTTihTdXBFcSk6CisgICAgIiIiU3ViY2xhc3Mgb2YgU3VwRXEgdGhhdCBjYW4gdGVzdCBlcXVhbGl0eSwgYnV0IG5vdCBub24tZXF1YWxpdHkiIiIKKyAgICBfX25lX18gPSBOb25lCisKK2NsYXNzIFhOOgorICAgICIiIkluZGVwZW5kZW50IGNsYXNzIHRoYXQgY2FuIHRlc3QgZXF1YWxpdHksIGJ1dCBub3Qgbm9uLWVxdWFsaXR5IiIiCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgX19uZV9fID0gTm9uZQorCitjbGFzcyBGYWxsYmFja0Jsb2NraW5nVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlVuaXQgdGVzdHMgZm9yIE5vbmUgbWV0aG9kIGJsb2NraW5nIiIiCisKKyAgICBkZWYgdGVzdF9mYWxsYmFja19ybWV0aG9kX2Jsb2NraW5nKHNlbGYpOgorICAgICAgICBlLCBmLCBzLCB4ID0gU3VwRXEoKSwgRigpLCBTKCksIFgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUsIGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZSwgZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBlKQorICAgICAgICAjIGxlZnQgb3BlcmFuZCBpcyBjaGVja2VkIGZpcnN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBlcSwgeCwgZSkKKyAgICAgICAgIyBTIGlzIGEgc3ViY2xhc3MsIHNvIGl0J3MgYWx3YXlzIGNoZWNrZWQgZmlyc3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBlcSwgZSwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBlcSwgcywgZSkKKworICAgIGRlZiB0ZXN0X2ZhbGxiYWNrX25lX2Jsb2NraW5nKHNlbGYpOgorICAgICAgICBlLCBzbiwgeG4gPSBTdXBFcSgpLCBTTigpLCBYTigpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZSAhPSBlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG5lLCBlLCBzbikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBuZSwgc24sIGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZSAhPSB4bikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBuZSwgeG4sIGUpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Jvb2wucHkgYi9MaWIvdGVzdC90ZXN0X2Jvb2wucHkKaW5kZXggZDMwYTNiOS4uOWY4ZjBlMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ib29sLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYm9vbC5weQpAQCAtOTYsNiArOTYsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZS8xLCAwKQogICAgICAgICBzZWxmLmFzc2VydElzTm90KEZhbHNlLzEsIEZhbHNlKQogCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSUxLCAwKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KFRydWUlMSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSUyLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KFRydWUlMiwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSUxLCAwKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KEZhbHNlJTEsIEZhbHNlKQorCiAgICAgICAgIGZvciBiIGluIEZhbHNlLCBUcnVlOgogICAgICAgICAgICAgZm9yIGkgaW4gMCwgMSwgMjoKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIqKmksIGludChiKSoqaSkKQEAgLTMzMyw2ICszNDAsMTcgQEAKICAgICAgICAgICAgICAgICBleGNlcHQgKEV4Y2VwdGlvbikgYXMgZV9sZW46CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGVfYm9vbCksIHN0cihlX2xlbikpCiAKKyAgICBkZWYgdGVzdF9ibG9ja2VkKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgX19ib29sX18gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYm9vbCwgQSgpKQorCisgICAgICAgIGNsYXNzIEI6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAKKyAgICAgICAgICAgIF9fYm9vbF9fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJvb2wsIEIoKSkKKwogICAgIGRlZiB0ZXN0X3JlYWxfYW5kX2ltYWcoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZS5yZWFsLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUuaW1hZywgMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5IGIvTGliL3Rlc3QvdGVzdF9idWZmZXIucHkKaW5kZXggMmVlZjlmYy4uYjgzZjJmMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9idWZmZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9idWZmZXIucHkKQEAgLTE2LDcgKzE2LDYgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSBpdGVydG9vbHMgaW1wb3J0IHBlcm11dGF0aW9ucywgcHJvZHVjdAogZnJvbSByYW5kb20gaW1wb3J0IHJhbmRyYW5nZSwgc2FtcGxlLCBjaG9pY2UKLWZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfY29uZmlnX3ZhcgogaW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgc3lzLCBhcnJheSwgaW8KIGZyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5IGIvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CmluZGV4IDM5YzgwYjAuLmUwY2ZmZTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgICAgKCcnLCBWYWx1ZUVycm9yKSwKICAgICAgICAgKCcgJywgVmFsdWVFcnJvciksCiAgICAgICAgICgnICBcdFx0ICAnLCBWYWx1ZUVycm9yKSwKLSAgICAgICAgKHN0cihiJ1x1MDY2M1x1MDY2MVx1MDY2NCAnLCdyYXctdW5pY29kZS1lc2NhcGUnKSwgMzE0KSwKKyAgICAgICAgKHN0cihicidcdTA2NjNcdTA2NjFcdTA2NjQgJywncmF3LXVuaWNvZGUtZXNjYXBlJyksIDMxNCksCiAgICAgICAgIChjaHIoMHgyMDApLCBWYWx1ZUVycm9yKSwKIF0KIApAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgICAgICgnJywgVmFsdWVFcnJvciksCiAgICAgICAgICgnICcsIFZhbHVlRXJyb3IpLAogICAgICAgICAoJyAgXHRcdCAgJywgVmFsdWVFcnJvciksCi0gICAgICAgIChzdHIoYidcdTA2NjNcdTA2NjFcdTA2NjQgJywncmF3LXVuaWNvZGUtZXNjYXBlJyksIDMxNCksCisgICAgICAgIChzdHIoYnInXHUwNjYzXHUwNjYxXHUwNjY0ICcsJ3Jhdy11bmljb2RlLWVzY2FwZScpLCAzMTQpLAogICAgICAgICAoY2hyKDB4MjAwKSwgVmFsdWVFcnJvciksCiBdCiAKQEAgLTE3MTAsMjEgKzE3MTAsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnNwYW0oKSwgJ3NwYW00MicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC50b19ieXRlcygyLCAnbGl0dGxlJyksIGInXHgyYVx4MDAnKQogCi0gICAgZGVmIHRlc3RfdHlwZV9uZXdfa2V5d29yZHMoc2VsZik6Ci0gICAgICAgIGNsYXNzIEI6Ci0gICAgICAgICAgICBkZWYgaGFtKHNlbGYpOgotICAgICAgICAgICAgICAgIHJldHVybiAnaGFtJWQnICUgc2VsZgotICAgICAgICBDID0gdHlwZS5fX25ld19fKHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nQycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZXM9KEIsIGludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGljdD17J3NwYW0nOiBsYW1iZGEgc2VsZjogJ3NwYW0lcycgJSBzZWxmfSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fbmFtZV9fLCAnQycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5fX3F1YWxuYW1lX18sICdDJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fbW9kdWxlX18sIF9fbmFtZV9fKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuX19iYXNlc19fLCAoQiwgaW50KSkKLSAgICAgICAgc2VsZi5hc3NlcnRJcyhDLl9fYmFzZV9fLCBpbnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3NwYW0nLCBDLl9fZGljdF9fKQotICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdoYW0nLCBDLl9fZGljdF9fKQorICAgIGRlZiB0ZXN0X3R5cGVfbm9rd2FyZ3Moc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHR5cGUoJ2EnLCAoKSwge30sIHg9NSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgdHlwZSgnYScsICgpLCBkaWN0PXt9KQogCiAgICAgZGVmIHRlc3RfdHlwZV9uYW1lKHNlbGYpOgogICAgICAgICBmb3IgbmFtZSBpbiAnQScsICdceGM0JywgJ1xVMDAwMWY0MGQnLCAnQi5BJywgJzQyJywgJyc6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J5dGVzLnB5IGIvTGliL3Rlc3QvdGVzdF9ieXRlcy5weQppbmRleCBjYzMxMmIxLi4yMjI0NDI0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2J5dGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHNlbGYudHlwZTJ0ZXN0KHNhbXBsZVs6LTNdLCAidXRmLTgiKSkKIAogICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKLSAgICAgICAgc2FtcGxlID0gIkhlbGxvIHdvcmxkXG5cdTEyMzRcdTU2NzhcdTlhYmNcZGVmMFxkZWYwIgorICAgICAgICBzYW1wbGUgPSAiSGVsbG8gd29ybGRcblx1MTIzNFx1NTY3OFx1OWFiYyIKICAgICAgICAgZm9yIGVuYyBpbiAoInV0Zi04IiwgInV0Zi0xNiIpOgogICAgICAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KHNhbXBsZSwgZW5jKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmRlY29kZShlbmMpLCBzYW1wbGUpCkBAIC0yNjksNiArMjY5LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RJbigyMDAsIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogMzAwIGluIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogLTEgaW4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBzeXMubWF4c2l6ZSsxIGluIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBOb25lIGluIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBmbG9hdChvcmQoJ2EnKSkgaW4gYikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6ICJhIiBpbiBiKQpAQCAtMzAwLDYgKzMwMSwyMCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdC5mcm9taGV4LCAnXHgwMCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgsICcxMiAgIFx4MDAgICAzNCcpCiAKKyAgICAgICAgZm9yIGRhdGEsIHBvcyBpbiAoCisgICAgICAgICAgICAjIGludmFsaWQgZmlyc3QgaGV4YWRlY2ltYWwgY2hhcmFjdGVyCisgICAgICAgICAgICAoJzEyIHg0IDU2JywgMyksCisgICAgICAgICAgICAjIGludmFsaWQgc2Vjb25kIGhleGFkZWNpbWFsIGNoYXJhY3RlcgorICAgICAgICAgICAgKCcxMiAzeCA1NicsIDQpLAorICAgICAgICAgICAgIyB0d28gaW52YWxpZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAoJzEyIHh5IDU2JywgMyksCisgICAgICAgICAgICAjIHRlc3Qgbm9uLUFTQ0lJIHN0cmluZworICAgICAgICAgICAgKCcxMiAzXHhmZiA1NicsIDQpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgICAgICBzZWxmLnR5cGUydGVzdC5mcm9taGV4KGRhdGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdhdCBwb3NpdGlvbiAlcycgJSBwb3MsIHN0cihjbS5leGNlcHRpb24pKQorCiAgICAgZGVmIHRlc3RfaGV4KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmhleCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdC5oZXgsIDEpCkBAIC02NzQsNiArNjg5LDM3IEBACiAgICAgICAgIHRlc3Quc3VwcG9ydC5jaGVja19mcmVlX2FmdGVyX2l0ZXJhdGluZyhzZWxmLCBpdGVyLCBzZWxmLnR5cGUydGVzdCkKICAgICAgICAgdGVzdC5zdXBwb3J0LmNoZWNrX2ZyZWVfYWZ0ZXJfaXRlcmF0aW5nKHNlbGYsIHJldmVyc2VkLCBzZWxmLnR5cGUydGVzdCkKIAorICAgIGRlZiB0ZXN0X3RyYW5zbGF0ZShzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInaGVsbG8nKQorICAgICAgICByb3NldHRhID0gYnl0ZWFycmF5KHJhbmdlKDI1NikpCisgICAgICAgIHJvc2V0dGFbb3JkKCdvJyldID0gb3JkKCdlJykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGIudHJhbnNsYXRlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGIudHJhbnNsYXRlLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiLnRyYW5zbGF0ZSwgYnl0ZXMocmFuZ2UoMjU1KSkpCisKKyAgICAgICAgYyA9IGIudHJhbnNsYXRlKHJvc2V0dGEsIGInaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYywgc2VsZi50eXBlMnRlc3QpCisKKyAgICAgICAgYyA9IGIudHJhbnNsYXRlKHJvc2V0dGEpCisgICAgICAgIGQgPSBiLnRyYW5zbGF0ZShyb3NldHRhLCBiJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiJ2hlbGxlJykKKworICAgICAgICBjID0gYi50cmFuc2xhdGUocm9zZXR0YSwgYidsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiJ2hlZScpCisgICAgICAgIGMgPSBiLnRyYW5zbGF0ZShOb25lLCBiJ2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIGInaGxsbycpCisKKyAgICAgICAgIyB0ZXN0IGRlbGV0ZSBhcyBhIGtleXdvcmQgYXJndW1lbnQKKyAgICAgICAgYyA9IGIudHJhbnNsYXRlKHJvc2V0dGEsIGRlbGV0ZT1iJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidoZWxsZScpCisgICAgICAgIGMgPSBiLnRyYW5zbGF0ZShyb3NldHRhLCBkZWxldGU9YidsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiJ2hlZScpCisgICAgICAgIGMgPSBiLnRyYW5zbGF0ZShOb25lLCBkZWxldGU9YidlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiJ2hsbG8nKQorCiAKIGNsYXNzIEJ5dGVzVGVzdChCYXNlQnl0ZXNUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgdHlwZTJ0ZXN0ID0gYnl0ZXMKQEAgLTcyMiwzMSArNzY4LDE0MiBAQAogCiAgICAgIyBUZXN0IFB5Qnl0ZXNfRnJvbUZvcm1hdCgpCiAgICAgZGVmIHRlc3RfZnJvbV9mb3JtYXQoc2VsZik6Ci0gICAgICAgIHRlc3Quc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdjdHlwZXMnKQotICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgcHl0aG9uYXBpLCBweV9vYmplY3QsIGNfaW50LCBjX2NoYXJfcAorICAgICAgICBjdHlwZXMgPSB0ZXN0LnN1cHBvcnQuaW1wb3J0X21vZHVsZSgnY3R5cGVzJykKKyAgICAgICAgX3Rlc3RjYXBpID0gdGVzdC5zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ190ZXN0Y2FwaScpCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBweXRob25hcGksIHB5X29iamVjdAorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgKAorICAgICAgICAgICAgY19pbnQsIGNfdWludCwKKyAgICAgICAgICAgIGNfbG9uZywgY191bG9uZywKKyAgICAgICAgICAgIGNfc2l6ZV90LCBjX3NzaXplX3QsCisgICAgICAgICAgICBjX2NoYXJfcCkKKwogICAgICAgICBQeUJ5dGVzX0Zyb21Gb3JtYXQgPSBweXRob25hcGkuUHlCeXRlc19Gcm9tRm9ybWF0CiAgICAgICAgIFB5Qnl0ZXNfRnJvbUZvcm1hdC5yZXN0eXBlID0gcHlfb2JqZWN0CiAKKyAgICAgICAgIyBiYXNpYyB0ZXN0cwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2Zvcm1hdCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGInZm9ybWF0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidIZWxsbyAlcyAhJywgYid3b3JsZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInSGVsbG8gd29ybGQgIScpCiAKKyAgICAgICAgIyB0ZXN0IGZvcm1hdHRlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidjPSVjJywgY19pbnQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYz1cMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInYz0lYycsIGNfaW50KG9yZCgnQCcpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidjPUAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2M9JWMnLCBjX2ludCgyNTUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2M9XHhmZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInZD0lZCBsZD0lbGQgemQ9JXpkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19pbnQoMSksIGNfbG9uZygyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19zaXplX3QoMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInZD0xIGxkPTIgemQ9MycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInZD0lZCBsZD0lbGQgemQ9JXpkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19pbnQoLTEpLCBjX2xvbmcoLTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3NpemVfdCgtMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInZD0tMSBsZD0tMiB6ZD0tMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGIndT0ldSBsdT0lbHUgenU9JXp1JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY191aW50KDEyMyksIGNfdWxvbmcoNDU2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19zaXplX3QoNzg5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYid1PTEyMyBsdT00NTYgenU9Nzg5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidpPSVpJywgY19pbnQoMTIzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidpPTEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInaT0laScsIGNfaW50KC0xMjMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2k9LTEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGIneD0leCcsIGNfaW50KDB4YWJjKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYid4PWFiYycpCisKKyAgICAgICAgc2l6ZW9mX3B0ciA9IGN0eXBlcy5zaXplb2YoY19jaGFyX3ApCisKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAgICAgIyBXaW5kb3dzIChNU0NSVCkKKyAgICAgICAgICAgIHB0cl9mb3JtYXQgPSAnMHglMHt9WCcuZm9ybWF0KDIgKiBzaXplb2ZfcHRyKQorICAgICAgICAgICAgZGVmIHB0cl9mb3JtYXR0ZXIocHRyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKHB0cl9mb3JtYXQgJSBwdHIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFVOSVggKGdsaWJjKQorICAgICAgICAgICAgZGVmIHB0cl9mb3JtYXR0ZXIocHRyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJyUjeCcgJSBwdHIKKworICAgICAgICBwdHIgPSAweGFiY2RlZgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3B0cj0lcCcsIGNfY2hhcl9wKHB0cikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgncHRyPScgKyBwdHJfZm9ybWF0dGVyKHB0cikpLmVuY29kZSgnYXNjaWknKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidzPSVzJywgY19jaGFyX3AoYidjc3RyJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGIncz1jc3RyJykKKworICAgICAgICAjIHRlc3QgbWluaW11bSBhbmQgbWF4aW11bSBpbnRlZ2VyIHZhbHVlcworICAgICAgICBzaXplX21heCA9IGNfc2l6ZV90KC0xKS52YWx1ZQorICAgICAgICBmb3IgZm9ybWF0c3RyLCBjdHlwZXNfdHlwZSwgdmFsdWUsIHB5X2Zvcm1hdHRlciBpbiAoCisgICAgICAgICAgICAoYiclZCcsIGNfaW50LCBfdGVzdGNhcGkuSU5UX01JTiwgc3RyKSwKKyAgICAgICAgICAgIChiJyVkJywgY19pbnQsIF90ZXN0Y2FwaS5JTlRfTUFYLCBzdHIpLAorICAgICAgICAgICAgKGInJWxkJywgY19sb25nLCBfdGVzdGNhcGkuTE9OR19NSU4sIHN0ciksCisgICAgICAgICAgICAoYiclbGQnLCBjX2xvbmcsIF90ZXN0Y2FwaS5MT05HX01BWCwgc3RyKSwKKyAgICAgICAgICAgIChiJyVsdScsIGNfdWxvbmcsIF90ZXN0Y2FwaS5VTE9OR19NQVgsIHN0ciksCisgICAgICAgICAgICAoYiclemQnLCBjX3NzaXplX3QsIF90ZXN0Y2FwaS5QWV9TU0laRV9UX01JTiwgc3RyKSwKKyAgICAgICAgICAgIChiJyV6ZCcsIGNfc3NpemVfdCwgX3Rlc3RjYXBpLlBZX1NTSVpFX1RfTUFYLCBzdHIpLAorICAgICAgICAgICAgKGInJXp1JywgY19zaXplX3QsIHNpemVfbWF4LCBzdHIpLAorICAgICAgICAgICAgKGInJXAnLCBjX2NoYXJfcCwgc2l6ZV9tYXgsIHB0cl9mb3JtYXR0ZXIpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoZm9ybWF0c3RyLCBjdHlwZXNfdHlwZSh2YWx1ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweV9mb3JtYXR0ZXIodmFsdWUpLmVuY29kZSgnYXNjaWknKSksCisKKyAgICAgICAgIyB3aWR0aCBhbmQgcHJlY2lzaW9uICh3aWR0aCBpcyBjdXJyZW50bHkgaWdub3JlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclNXMnLCBiJ2EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUuM3MnLCBiJ2FiY2RlZicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYWJjJykKKworICAgICAgICAjICclJScgZm9ybWF0dGVyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJyUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ1slJV0nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1slXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSUlYycsIGNfaW50KG9yZCgnXycpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYiclXycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSVzJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYiclcycpCisKKyAgICAgICAgIyBJbnZhbGlkIGZvcm1hdHMgYW5kIHBhcnRpYWwgZm9ybWF0dGluZwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUnKSwgYiclJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJScpLCBiJyUnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlcycpLCBiJyVzJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidbJSVdJyksIGInWyVdJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJSVjJywgY19pbnQob3JkKCdfJykpKSwgYiclXycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGIneD0laSB5PSUnLCBjX2ludCgyKSwgY19pbnQoMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGIneD0yIHk9JScpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidjOiVjJywgY19pbnQoMjU1KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYidjOlx4ZmYnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3M6JXMnLCBjX2NoYXJfcChiJ2NzdHInKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYidzOmNzdHInKQotCi0gICAgICAgICMgSXNzdWUgIzE5OTY5CisgICAgICAgICMgSXNzdWUgIzE5OTY5OiAlYyBtdXN0IHJhaXNlIE92ZXJmbG93RXJyb3IgZm9yIHZhbHVlcworICAgICAgICAjIG5vdCBpbiB0aGUgcmFuZ2UgWzA7IDI1NV0KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19Gcm9tRm9ybWF0LCBiJyVjJywgY19pbnQoLTEpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0Zyb21Gb3JtYXQsIGInJWMnLCBjX2ludCgyNTYpKQogCisgICAgZGVmIHRlc3RfYnl0ZXNfYmxvY2tpbmcoc2VsZik6CisgICAgICAgIGNsYXNzIEl0ZXJhdGlvbkJsb2NrZWQobGlzdCk6CisgICAgICAgICAgICBfX2J5dGVzX18gPSBOb25lCisgICAgICAgIGkgPSBbMCwgMSwgMiwgM10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhpKSwgYidceDAwXHgwMVx4MDJceDAzJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBieXRlcywgSXRlcmF0aW9uQmxvY2tlZChpKSkKKworICAgICAgICAjIEF0IGxlYXN0IGluIENQeXRob24sIGJlY2F1c2UgYnl0ZXMuX19uZXdfXyBhbmQgdGhlIEMgQVBJCisgICAgICAgICMgUHlCeXRlc19Gcm9tT2JqZWN0IGhhdmUgZGlmZmVyZW50IGZhbGxiYWNrIHJ1bGVzLCBpbnRlZ2VyCisgICAgICAgICMgZmFsbGJhY2sgaXMgaGFuZGxlZCBzcGVjaWFsbHksIHNvIHRlc3Qgc2VwYXJhdGVseS4KKyAgICAgICAgY2xhc3MgSW50QmxvY2tlZChpbnQpOgorICAgICAgICAgICAgX19ieXRlc19fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKDMpLCBiJ1wwXDBcMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnl0ZXMsIEludEJsb2NrZWQoMykpCisKKyAgICAgICAgIyBXaGlsZSB0aGVyZSBpcyBubyBzZXBhcmF0ZWx5LWRlZmluZWQgcnVsZSBmb3IgaGFuZGxpbmcgYnl0ZXMKKyAgICAgICAgIyBzdWJjbGFzc2VzIGRpZmZlcmVudGx5IGZyb20gb3RoZXIgYnVmZmVyLWludGVyZmFjZSBjbGFzc2VzLAorICAgICAgICAjIGFuIGltcGxlbWVudGF0aW9uIG1heSB3ZWxsIHNwZWNpYWwtY2FzZSB0aGVtIChhcyBDUHl0aG9uIDIueAorICAgICAgICAjIHN0ciBkaWQpLCBzbyB0ZXN0IHRoZW0gc2VwYXJhdGVseS4KKyAgICAgICAgY2xhc3MgQnl0ZXNTdWJjbGFzc0Jsb2NrZWQoYnl0ZXMpOgorICAgICAgICAgICAgX19ieXRlc19fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGInYWInKSwgYidhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnl0ZXMsIEJ5dGVzU3ViY2xhc3NCbG9ja2VkKGInYWInKSkKKworICAgICAgICBjbGFzcyBCdWZmZXJCbG9ja2VkKGJ5dGVhcnJheSk6CisgICAgICAgICAgICBfX2J5dGVzX18gPSBOb25lCisgICAgICAgIGJhLCBiYiA9IGJ5dGVhcnJheShiJ2FiJyksIEJ1ZmZlckJsb2NrZWQoYidhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYmEpLCBiJ2FiJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBieXRlcywgYmIpCisKIAogY2xhc3MgQnl0ZUFycmF5VGVzdChCYXNlQnl0ZXNUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgdHlwZTJ0ZXN0ID0gYnl0ZWFycmF5CkBAIC0xMzIzLDI0ICsxNDgwLDYgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2IiJXMiJyAlIGNocihjKSkKIAotICAgIGRlZiB0ZXN0X3RyYW5zbGF0ZShzZWxmKToKLSAgICAgICAgYiA9IGInaGVsbG8nCi0gICAgICAgIGJhID0gYnl0ZWFycmF5KGIpCi0gICAgICAgIHJvc2V0dGEgPSBieXRlYXJyYXkocmFuZ2UoMCwgMjU2KSkKLSAgICAgICAgcm9zZXR0YVtvcmQoJ28nKV0gPSBvcmQoJ2UnKQotICAgICAgICBjID0gYi50cmFuc2xhdGUocm9zZXR0YSwgYidsJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiJ2hlbGxvJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiJ2hlZScpCi0gICAgICAgIGMgPSBiYS50cmFuc2xhdGUocm9zZXR0YSwgYidsJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYSwgYidoZWxsbycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidoZWUnKQotICAgICAgICBjID0gYi50cmFuc2xhdGUoTm9uZSwgYidlJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiJ2hsbG8nKQotICAgICAgICBjID0gYmEudHJhbnNsYXRlKE5vbmUsIGInZScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidobGxvJykKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiLnRyYW5zbGF0ZSwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiYS50cmFuc2xhdGUsIE5vbmUsIE5vbmUpCi0KICAgICBkZWYgdGVzdF9zcGxpdF9ieXRlYXJyYXkoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhIGInLnNwbGl0KG1lbW9yeXZpZXcoYicgJykpLCBbYidhJywgYidiJ10pCiAKQEAgLTE1MDQsNyArMTY0MywzMiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGEpLCB0eXBlKGIpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGEueSksIHR5cGUoYi55KSkKIAotICAgIHRlc3RfZnJvbWhleCA9IEJhc2VCeXRlc1Rlc3QudGVzdF9mcm9taGV4CisgICAgZGVmIHRlc3RfZnJvbWhleChzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgoJzFhMkIzMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYidceDFhXHgyYlx4MzAnKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoYiksIHNlbGYudHlwZTJ0ZXN0KQorCisgICAgICAgIGNsYXNzIEIxKHNlbGYuYmFzZXR5cGUpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgbWUgPSBzZWxmLmJhc2V0eXBlLl9fbmV3X18oY2xzLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBtZS5mb28gPSAnYmFyJworICAgICAgICAgICAgICAgIHJldHVybiBtZQorCisgICAgICAgIGIgPSBCMS5mcm9taGV4KCcxYTJCMzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInXHgxYVx4MmJceDMwJykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGIpLCBCMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmZvbywgJ2JhcicpCisKKyAgICAgICAgY2xhc3MgQjIoc2VsZi5iYXNldHlwZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18obWUsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5iYXNldHlwZSBpcyBub3QgYnl0ZXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFzZXR5cGUuX19pbml0X18obWUsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICBtZS5mb28gPSAnYmFyJworCisgICAgICAgIGIgPSBCMi5mcm9taGV4KCcxYTJCMzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInXHgxYVx4MmJceDMwJykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGIpLCBCMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmZvbywgJ2JhcicpCiAKIAogY2xhc3MgQnl0ZUFycmF5U3ViY2xhc3MoYnl0ZWFycmF5KToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkgYi9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5CmluZGV4IDgwZWQ2MzIuLjZkYWQwNTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weQpAQCAtNzAyLDE5ICs3MDIsMTkgQEAKIAogICAgIGRlZiBhc3NlcnRGYWlsdXJlKHNlbGYsICphcmdzKToKICAgICAgICAgcmMsIHN0ZG91dCwgc3RkZXJyID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCctbScsICdjYWxlbmRhcicsICphcmdzKQotICAgICAgICBzZWxmLmFzc2VydEluKGInVXNhZ2U6Jywgc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydEluKGIndXNhZ2U6Jywgc3RkZXJyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCAyKQogCiAgICAgZGVmIHRlc3RfaGVscChzZWxmKToKICAgICAgICAgc3Rkb3V0ID0gc2VsZi5ydW5fb2soJy1oJykKLSAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1VzYWdlOicsIHN0ZG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiJ3VzYWdlOicsIHN0ZG91dCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ2NhbGVuZGFyLnB5Jywgc3Rkb3V0KQogICAgICAgICBzZWxmLmFzc2VydEluKGInLS1oZWxwJywgc3Rkb3V0KQogCiAgICAgZGVmIHRlc3RfaWxsZWdhbF9hcmd1bWVudHMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbHVyZSgnLXonKQotICAgICAgICAjc2VsZi5hc3NlcnRGYWlsdXJlKCdzcGFtJykKLSAgICAgICAgI3NlbGYuYXNzZXJ0RmFpbHVyZSgnMjAwNCcsICdzcGFtJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWlsdXJlKCdzcGFtJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWlsdXJlKCcyMDA0JywgJ3NwYW0nKQogICAgICAgICBzZWxmLmFzc2VydEZhaWx1cmUoJy10JywgJ2h0bWwnLCAnMjAwNCcsICcxJykKIAogICAgIGRlZiB0ZXN0X291dHB1dF9jdXJyZW50X3llYXIoc2VsZik6CkBAIC04MTUsNSArODE1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgYidocmVmPSJjdXN0b20uY3NzIiAvPicsIHN0ZG91dCkKIAogCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydtZGF5cycsICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ0VQT0NIJywKKyAgICAgICAgICAgICAgICAgICAgICdNT05EQVknLCAnVFVFU0RBWScsICdXRURORVNEQVknLCAnVEhVUlNEQVknLCAnRlJJREFZJywKKyAgICAgICAgICAgICAgICAgICAgICdTQVRVUkRBWScsICdTVU5EQVknLCAnZGlmZmVyZW50X2xvY2FsZScsICdjJywKKyAgICAgICAgICAgICAgICAgICAgICdwcndlZWsnLCAnd2VlaycsICdmb3JtYXQnLCAnZm9ybWF0c3RyaW5nJywgJ21haW4nfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBjYWxlbmRhciwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jYXBpLnB5IGIvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CmluZGV4IDFlYWRkMjIuLjU1MjFlNzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NhcGkucHkKQEAgLTQsOCArNCwxMCBAQAogaW1wb3J0IG9zCiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgcmFuZG9tCitpbXBvcnQgcmUKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCitpbXBvcnQgc3lzY29uZmlnCiBpbXBvcnQgdGV4dHdyYXAKIGltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKQEAgLTQ0Miw2ICs0NDQsNyBAQAogICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnN0cmlwKCksIGV4cGVjdGVkX291dHB1dCkKIAorCiBjbGFzcyBTa2lwaXRlbVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3Rfc2tpcGl0ZW0oc2VsZik6CkBAIC00OTEsMTAgKzQ5NCwxMCBAQAogICAgICAgICAgICAgICAgIF90ZXN0Y2FwaS5wYXJzZV90dXBsZV9hbmRfa2V5d29yZHModHVwbGVfMSwgZGljdF9iLAogICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZW5jb2RlKCJhc2NpaSIpLCBrZXl3b3JkcykKICAgICAgICAgICAgICAgICB3aGVuX25vdF9za2lwcGVkID0gRmFsc2UKLSAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIHMgPSAiYXJndW1lbnQgMSAoaW1wb3NzaWJsZTxiYWQgZm9ybWF0IGNoYXI+KSIKICAgICAgICAgICAgICAgICB3aGVuX25vdF9za2lwcGVkID0gKHN0cihlKSA9PSBzKQotICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBlOgorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICB3aGVuX25vdF9za2lwcGVkID0gRmFsc2UKIAogICAgICAgICAgICAgIyB0ZXN0IHRoZSBmb3JtYXQgdW5pdCB3aGVuIHNraXBwZWQKQEAgLTUwMyw3ICs1MDYsNyBAQAogICAgICAgICAgICAgICAgIF90ZXN0Y2FwaS5wYXJzZV90dXBsZV9hbmRfa2V5d29yZHMoZW1wdHlfdHVwbGUsIGRpY3RfYiwKICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfZm9ybWF0LmVuY29kZSgiYXNjaWkiKSwga2V5d29yZHMpCiAgICAgICAgICAgICAgICAgd2hlbl9za2lwcGVkID0gRmFsc2UKLSAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIHMgPSAiaW1wb3NzaWJsZTxiYWQgZm9ybWF0IGNoYXI+OiAne30nIi5mb3JtYXQoZm9ybWF0KQogICAgICAgICAgICAgICAgIHdoZW5fc2tpcHBlZCA9IChzdHIoZSkgPT0gcykKIApAQCAtNTI0LDYgKzUyNywzMiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBfdGVzdGNhcGkucGFyc2VfdHVwbGVfYW5kX2tleXdvcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoKSwge30sIGInJywgWzQyXSkKIAorICAgIGRlZiB0ZXN0X3Bvc2l0aW9uYWxfb25seShzZWxmKToKKyAgICAgICAgcGFyc2UgPSBfdGVzdGNhcGkucGFyc2VfdHVwbGVfYW5kX2tleXdvcmRzCisKKyAgICAgICAgcGFyc2UoKDEsIDIsIDMpLCB7fSwgYidPT08nLCBbJycsICcnLCAnYSddKQorICAgICAgICBwYXJzZSgoMSwgMiksIHsnYSc6IDN9LCBiJ09PTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAgICByJ0Z1bmN0aW9uIHRha2VzIGF0IGxlYXN0IDIgcG9zaXRpb25hbCBhcmd1bWVudHMgXCgxIGdpdmVuXCknKToKKyAgICAgICAgICAgIHBhcnNlKCgxLCksIHsnYSc6IDN9LCBiJ09PTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHBhcnNlKCgxLCksIHt9LCBiJ098T08nLCBbJycsICcnLCAnYSddKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgcidGdW5jdGlvbiB0YWtlcyBhdCBsZWFzdCAxIHBvc2l0aW9uYWwgYXJndW1lbnRzIFwoMCBnaXZlblwpJyk6CisgICAgICAgICAgICBwYXJzZSgoKSwge30sIGInT3xPTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHBhcnNlKCgxLCAyKSwgeydhJzogM30sIGInT08kTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAgICByJ0Z1bmN0aW9uIHRha2VzIGV4YWN0bHkgMiBwb3NpdGlvbmFsIGFyZ3VtZW50cyBcKDEgZ2l2ZW5cKScpOgorICAgICAgICAgICAgcGFyc2UoKDEsKSwgeydhJzogM30sIGInT08kTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHBhcnNlKCgxLCksIHt9LCBiJ098TyRPJywgWycnLCAnJywgJ2EnXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgIHInRnVuY3Rpb24gdGFrZXMgYXQgbGVhc3QgMSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBcKDAgZ2l2ZW5cKScpOgorICAgICAgICAgICAgcGFyc2UoKCksIHt9LCBiJ098TyRPJywgWycnLCAnJywgJ2EnXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFN5c3RlbUVycm9yLCByJ0VtcHR5IHBhcmFtZXRlciBuYW1lIGFmdGVyIFwkJyk6CisgICAgICAgICAgICBwYXJzZSgoMSwpLCB7fSwgYidPfCRPTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeXN0ZW1FcnJvciwgJ0VtcHR5IGtleXdvcmQnKToKKyAgICAgICAgICAgIHBhcnNlKCgxLCksIHt9LCBiJ098T08nLCBbJycsICdhJywgJyddKQorCisKIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCiBjbGFzcyBUZXN0VGhyZWFkU3RhdGUodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC01NDgsNiArNTc3LDcgQEAKICAgICAgICAgdC5zdGFydCgpCiAgICAgICAgIHQuam9pbigpCiAKKwogY2xhc3MgVGVzdF90ZXN0Y2FwaSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfX3Rlc3RjYXBpKHNlbGYpOgogICAgICAgICBmb3IgbmFtZSBpbiBkaXIoX3Rlc3RjYXBpKToKQEAgLTU1Niw1ICs1ODYsODQgQEAKICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IGdldGF0dHIoX3Rlc3RjYXBpLCBuYW1lKQogICAgICAgICAgICAgICAgICAgICB0ZXN0KCkKIAorCitjbGFzcyBQeU1lbURlYnVnVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIFBZVEhPTk1BTExPQyA9ICdkZWJ1ZycKKyAgICAjICcweDA0YzA2ZTAnIG9yICcwNEMwNkUwJworICAgIFBUUl9SRUdFWCA9IHInKD86MHgpP1swLTlhLWZBLUZdKycKKworICAgIGRlZiBjaGVjayhzZWxmLCBjb2RlKToKKyAgICAgICAgd2l0aCBzdXBwb3J0LlN1cHByZXNzQ3Jhc2hSZXBvcnQoKToKKyAgICAgICAgICAgIG91dCA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLWMnLCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZVEhPTk1BTExPQz1zZWxmLlBZVEhPTk1BTExPQykKKyAgICAgICAgc3RkZXJyID0gb3V0LmVycgorICAgICAgICByZXR1cm4gc3RkZXJyLmRlY29kZSgnYXNjaWknLCAncmVwbGFjZScpCisKKyAgICBkZWYgdGVzdF9idWZmZXJfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIG91dCA9IHNlbGYuY2hlY2soJ2ltcG9ydCBfdGVzdGNhcGk7IF90ZXN0Y2FwaS5weW1lbV9idWZmZXJfb3ZlcmZsb3coKScpCisgICAgICAgIHJlZ2V4ID0gKHIiRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD17cHRyfTogQVBJICdtJ1xuIgorICAgICAgICAgICAgICAgICByIiAgICAxNiBieXRlcyBvcmlnaW5hbGx5IHJlcXVlc3RlZFxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHAtWzAtOV0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHRhaWw9e3B0cn0gYXJlIG5vdCBhbGwgRk9SQklEREVOQllURSBcKDB4WzAtOWEtZl17ezJ9fVwpOlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMDogMHg3OCBcKlwqXCogT1VDSFxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMTogMHhmYlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMjogMHhmYlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgLipcbiIKKyAgICAgICAgICAgICAgICAgciIgICAgVGhlIGJsb2NrIHdhcyBtYWRlIGJ5IGNhbGwgI1swLTldKyB0byBkZWJ1ZyBtYWxsb2MvcmVhbGxvYy5cbiIKKyAgICAgICAgICAgICAgICAgciIgICAgRGF0YSBhdCBwOiBjYiBjYiBjYiAuKlxuIgorICAgICAgICAgICAgICAgICByIlxuIgorICAgICAgICAgICAgICAgICByIkZhdGFsIFB5dGhvbiBlcnJvcjogYmFkIHRyYWlsaW5nIHBhZCBieXRlIikKKyAgICAgICAgcmVnZXggPSByZWdleC5mb3JtYXQocHRyPXNlbGYuUFRSX1JFR0VYKQorICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUocmVnZXgsIGZsYWdzPXJlLkRPVEFMTCkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleChvdXQsIHJlZ2V4KQorCisgICAgZGVmIHRlc3RfYXBpX21pc3VzZShzZWxmKToKKyAgICAgICAgb3V0ID0gc2VsZi5jaGVjaygnaW1wb3J0IF90ZXN0Y2FwaTsgX3Rlc3RjYXBpLnB5bWVtX2FwaV9taXN1c2UoKScpCisgICAgICAgIHJlZ2V4ID0gKHIiRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD17cHRyfTogQVBJICdtJ1xuIgorICAgICAgICAgICAgICAgICByIiAgICAxNiBieXRlcyBvcmlnaW5hbGx5IHJlcXVlc3RlZFxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHAtWzAtOV0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHRhaWw9e3B0cn0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgYmxvY2sgd2FzIG1hZGUgYnkgY2FsbCAjWzAtOV0rIHRvIGRlYnVnIG1hbGxvYy9yZWFsbG9jLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBEYXRhIGF0IHA6IGNiIGNiIGNiIC4qXG4iCisgICAgICAgICAgICAgICAgIHIiXG4iCisgICAgICAgICAgICAgICAgIHIiRmF0YWwgUHl0aG9uIGVycm9yOiBiYWQgSUQ6IEFsbG9jYXRlZCB1c2luZyBBUEkgJ20nLCB2ZXJpZmllZCB1c2luZyBBUEkgJ3InXG4iKQorICAgICAgICByZWdleCA9IHJlZ2V4LmZvcm1hdChwdHI9c2VsZi5QVFJfUkVHRVgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgob3V0LCByZWdleCkKKworICAgIGRlZiBjaGVja19tYWxsb2Nfd2l0aG91dF9naWwoc2VsZiwgY29kZSk6CisgICAgICAgIG91dCA9IHNlbGYuY2hlY2soY29kZSkKKyAgICAgICAgZXhwZWN0ZWQgPSAoJ0ZhdGFsIFB5dGhvbiBlcnJvcjogUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IgY2FsbGVkICcKKyAgICAgICAgICAgICAgICAgICAgJ3dpdGhvdXQgaG9sZGluZyB0aGUgR0lMJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihleHBlY3RlZCwgb3V0KQorCisgICAgZGVmIHRlc3RfcHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsKHNlbGYpOgorICAgICAgICAjIERlYnVnIGhvb2tzIG11c3QgcmFpc2UgYW4gZXJyb3IgaWYgUHlNZW1fTWFsbG9jKCkgaXMgY2FsbGVkCisgICAgICAgICMgd2l0aG91dCBob2xkaW5nIHRoZSBHSUwKKyAgICAgICAgY29kZSA9ICdpbXBvcnQgX3Rlc3RjYXBpOyBfdGVzdGNhcGkucHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsKCknCisgICAgICAgIHNlbGYuY2hlY2tfbWFsbG9jX3dpdGhvdXRfZ2lsKGNvZGUpCisKKyAgICBkZWYgdGVzdF9weW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwoc2VsZik6CisgICAgICAgICMgRGVidWcgaG9va3MgbXVzdCByYWlzZSBhbiBlcnJvciBpZiBQeU9iamVjdF9NYWxsb2MoKSBpcyBjYWxsZWQKKyAgICAgICAgIyB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTAorICAgICAgICBjb2RlID0gJ2ltcG9ydCBfdGVzdGNhcGk7IF90ZXN0Y2FwaS5weW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwoKScKKyAgICAgICAgc2VsZi5jaGVja19tYWxsb2Nfd2l0aG91dF9naWwoY29kZSkKKworCitjbGFzcyBQeU1lbU1hbGxvY0RlYnVnVGVzdHMoUHlNZW1EZWJ1Z1Rlc3RzKToKKyAgICBQWVRIT05NQUxMT0MgPSAnbWFsbG9jX2RlYnVnJworCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignV0lUSF9QWU1BTExPQycpID09IDEsCisgICAgICAgICAgICAgICAgICAgICAnbmVlZCBweW1hbGxvYycpCitjbGFzcyBQeU1lbVB5bWFsbG9jRGVidWdUZXN0cyhQeU1lbURlYnVnVGVzdHMpOgorICAgIFBZVEhPTk1BTExPQyA9ICdweW1hbGxvY19kZWJ1ZycKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhQeV9ERUJVRywgJ25lZWQgUHlfREVCVUcnKQorY2xhc3MgUHlNZW1EZWZhdWx0VGVzdHMoUHlNZW1EZWJ1Z1Rlc3RzKToKKyAgICAjIHRlc3QgZGVmYXVsdCBhbGxvY2F0b3Igb2YgUHl0aG9uIGNvbXBpbGVkIGluIGRlYnVnIG1vZGUKKyAgICBQWVRIT05NQUxMT0MgPSAnJworCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NnaS5weSBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CmluZGV4IGFiOWY2YWIuLjYzNzMyMjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CkBAIC03LDYgKzcsNyBAQAogaW1wb3J0IHdhcm5pbmdzCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCiBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTywgQnl0ZXNJTworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIGNsYXNzIEhhY2tlZFN5c01vZHVsZToKICAgICAjIFRoZSByZWdyZXNzaW9uIHRlc3Qgd2lsbCBoYXZlIHJlYWwgdmFsdWVzIGluIHN5cy5hcmd2LCB3aGljaApAQCAtMTQ3LDcgKzE0OCw3IEBACiAgICAgZGVmIHRlc3RfZXNjYXBlKHNlbGYpOgogICAgICAgICAjIGNnaS5lc2NhcGUoKSBpcyBkZXByZWNhdGVkLgogICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJywgJ2NnaVwuZXNjYXBlJywKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnLCByJ2NnaVwuZXNjYXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ0ZXN0ICZhbXA7IHN0cmluZyIsIGNnaS5lc2NhcGUoInRlc3QgJiBzdHJpbmciKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiZsdDt0ZXN0IHN0cmluZyZndDsiLCBjZ2kuZXNjYXBlKCI8dGVzdCBzdHJpbmc+IikpCkBAIC00NzMsNiArNDc0LDExIEBACiAgICAgICAgICAgICBjZ2kucGFyc2VfaGVhZGVyKCdmb3JtLWRhdGE7IG5hbWU9ImZpbGVzIjsgZmlsZW5hbWU9ImZvXFwibztiYXIiJyksCiAgICAgICAgICAgICAoImZvcm0tZGF0YSIsIHsibmFtZSI6ICJmaWxlcyIsICJmaWxlbmFtZSI6ICdmbyJvO2Jhcid9KSkKIAorICAgIGRlZiB0ZXN0X2FsbChzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geyJsb2dmaWxlIiwgImxvZ2ZwIiwgImluaXRsb2ciLCAiZG9sb2ciLCAibm9sb2ciLAorICAgICAgICAgICAgICAgICAgICAgImNsb3NlbG9nIiwgImxvZyIsICJtYXhsZW4iLCAidmFsaWRfYm91bmRhcnkifQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBjZ2ksIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKIAogQk9VTkRBUlkgPSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tNzIxODM3MzczMzUwNzA1NTI2Njg4MTY0Njg0IgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weSBiL0xpYi90ZXN0L3Rlc3RfY2hhcm1hcGNvZGVjLnB5CmluZGV4IDQwNjRhZWYuLjBkNDU5NGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2hhcm1hcGNvZGVjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2hhcm1hcGNvZGVjLnB5CkBAIC05LDcgKzksNyBAQAogCiAiIiIjIgogCi1pbXBvcnQgdGVzdC5zdXBwb3J0LCB1bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CiAKIGltcG9ydCBjb2RlY3MKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jbWF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfY21hdGgucHkKaW5kZXggMWY4ODRlNS4uMDQ1MWZiMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jbWF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NtYXRoLnB5CkBAIC00LDYgKzQsOCBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgY21hdGgsIG1hdGgKIGZyb20gY21hdGggaW1wb3J0IHBoYXNlLCBwb2xhciwgcmVjdCwgcGkKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHN5cwogaW1wb3J0IHN5c2NvbmZpZwogCiBJTkYgPSBmbG9hdCgnaW5mJykKQEAgLTE1NCw2ICsxNTYsMjMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjbWF0aC5lLCBlX2V4cGVjdGVkLCBwbGFjZXM9OSwKICAgICAgICAgICAgIG1zZz0iY21hdGguZSBpcyB7fTsgc2hvdWxkIGJlIHt9Ii5mb3JtYXQoY21hdGguZSwgZV9leHBlY3RlZCkpCiAKKyAgICBkZWYgdGVzdF9pbmZpbml0eV9hbmRfbmFuX2NvbnN0YW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWF0aC5pbmYucmVhbCwgbWF0aC5pbmYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21hdGguaW5mLmltYWcsIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWF0aC5pbmZqLnJlYWwsIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWF0aC5pbmZqLmltYWcsIG1hdGguaW5mKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGNtYXRoLm5hbi5yZWFsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWF0aC5uYW4uaW1hZywgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtYXRoLm5hbmoucmVhbCwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihjbWF0aC5uYW5qLmltYWcpKQorCisgICAgICAgICMgQ2hlY2sgY29uc2lzdGVuY3kgd2l0aCByZXBycy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNtYXRoLmluZiksICJpbmYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY21hdGguaW5maiksICJpbmZqIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNtYXRoLm5hbiksICJuYW4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY21hdGgubmFuaiksICJuYW5qIikKKwogICAgIGRlZiB0ZXN0X3VzZXJfb2JqZWN0KHNlbGYpOgogICAgICAgICAjIFRlc3QgYXV0b21hdGljIGNhbGxpbmcgb2YgX19jb21wbGV4X18gYW5kIF9fZmxvYXRfXyBieSBjbWF0aAogICAgICAgICAjIGZ1bmN0aW9ucwpAQCAtMzE1LDYgKzMzNCwxOCBAQAogCiAgICAgQHJlcXVpcmVzX0lFRUVfNzU0CiAgICAgZGVmIHRlc3Rfc3BlY2lmaWNfdmFsdWVzKHNlbGYpOgorICAgICAgICAjIFNvbWUgdGVzdHMgbmVlZCB0byBiZSBza2lwcGVkIG9uIGFuY2llbnQgT1MgWCB2ZXJzaW9ucy4KKyAgICAgICAgIyBTZWUgaXNzdWUgIzI3OTUzLgorICAgICAgICBTS0lQX09OX1RJR0VSID0geyd0YW4wMDY0J30KKworICAgICAgICBvc3hfdmVyc2lvbiA9IE5vbmUKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgdmVyc2lvbl90eHQgPSBwbGF0Zm9ybS5tYWNfdmVyKClbMF0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvc3hfdmVyc2lvbiA9IHR1cGxlKG1hcChpbnQsIHZlcnNpb25fdHh0LnNwbGl0KCcuJykpKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCiAgICAgICAgIGRlZiByZWN0X2NvbXBsZXgoeik6CiAgICAgICAgICAgICAiIiJXcmFwcGVkIHZlcnNpb24gb2YgcmVjdCB0aGF0IGFjY2VwdHMgYSBjb21wbGV4IG51bWJlciBpbnN0ZWFkIG9mCiAgICAgICAgICAgICB0d28gZmxvYXQgYXJndW1lbnRzLiIiIgpAQCAtMzI4LDYgKzM1OSwxMiBAQAogICAgICAgICBmb3IgaWQsIGZuLCBhciwgYWksIGVyLCBlaSwgZmxhZ3MgaW4gcGFyc2VfdGVzdGZpbGUodGVzdF9maWxlKToKICAgICAgICAgICAgIGFyZyA9IGNvbXBsZXgoYXIsIGFpKQogICAgICAgICAgICAgZXhwZWN0ZWQgPSBjb21wbGV4KGVyLCBlaSkKKworICAgICAgICAgICAgIyBTa2lwIGNlcnRhaW4gdGVzdHMgb24gT1MgWCAxMC40LgorICAgICAgICAgICAgaWYgb3N4X3ZlcnNpb24gaXMgbm90IE5vbmUgYW5kIG9zeF92ZXJzaW9uIDwgKDEwLCA1KToKKyAgICAgICAgICAgICAgICBpZiBpZCBpbiBTS0lQX09OX1RJR0VSOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCiAgICAgICAgICAgICBpZiBmbiA9PSAncmVjdCc6CiAgICAgICAgICAgICAgICAgZnVuY3Rpb24gPSByZWN0X2NvbXBsZXgKICAgICAgICAgICAgIGVsaWYgZm4gPT0gJ3BvbGFyJzoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CmluZGV4IDNkMmY3NjkuLjg3NTcxZDMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQpAQCAtMzQ4LDggKzM0OCw5IEBACiAgICAgICAgICAgICB0ZXN0LnN1cHBvcnQuU3VwcHJlc3NDcmFzaFJlcG9ydCgpLl9fZW50ZXJfXygpCiAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCd4JykKICAgICAgICAgICAgIG9zLmNsb3NlKHN5cy5zdGRvdXQuZmlsZW5vKCkpIiIiCi0gICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soJy1jJywgY29kZSkKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCctYycsIGNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIwLCByYykKICAgICAgICAgc2VsZi5hc3NlcnRSZWdleChlcnIuZGVjb2RlKCdhc2NpaScsICdpZ25vcmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAnRXhjZXB0aW9uIGlnbm9yZWQgaW4uKlxuT1NFcnJvcjogLionKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weSBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5CmluZGV4IGJlZmUwZTQuLjM4Y2IyZTIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5CkBAIC0xMzgsOSArMTM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9hcmd2MCwgZXhwZWN0ZWRfcGF0aDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcGFja2FnZSwgZXhwZWN0ZWRfbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjbWRfbGluZV9zd2l0Y2hlcyk6Ci0gICAgICAgIGlmIG5vdCBfX2RlYnVnX186Ci0gICAgICAgICAgICBjbWRfbGluZV9zd2l0Y2hlcyArPSAoJy0nICsgJ08nICogc3lzLmZsYWdzLm9wdGltaXplLCkKLSAgICAgICAgcnVuX2FyZ3MgPSBjbWRfbGluZV9zd2l0Y2hlcyArIChzY3JpcHRfbmFtZSwpICsgdHVwbGUoZXhhbXBsZV9hcmdzKQorICAgICAgICBydW5fYXJncyA9IFsqc3VwcG9ydC5vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgKmNtZF9saW5lX3N3aXRjaGVzLCBzY3JpcHRfbmFtZSwgKmV4YW1wbGVfYXJnc10KICAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygqcnVuX2FyZ3MsIF9faXNvbGF0ZWQ9RmFsc2UpCiAgICAgICAgIHNlbGYuX2NoZWNrX291dHB1dChzY3JpcHRfbmFtZSwgcmMsIG91dCArIGVyciwgZXhwZWN0ZWRfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2FyZ3YwLCBleHBlY3RlZF9wYXRoMCwKQEAgLTQyOSw3ICs0MjgsNyBAQAogICAgICAgICAgICAgKCdidWlsdGlucy54JywgYnInRXJyb3Igd2hpbGUgZmluZGluZyBtb2R1bGUgc3BlY2lmaWNhdGlvbi4qJwogICAgICAgICAgICAgICAgIGJyJ0F0dHJpYnV0ZUVycm9yJyksCiAgICAgICAgICAgICAoJ2J1aWx0aW5zLngueScsIGJyJ0Vycm9yIHdoaWxlIGZpbmRpbmcgbW9kdWxlIHNwZWNpZmljYXRpb24uKicKLSAgICAgICAgICAgICAgICBicidJbXBvcnRFcnJvci4qTm8gbW9kdWxlIG5hbWVkLipub3QgYSBwYWNrYWdlJyksCisgICAgICAgICAgICAgICAgYnInTW9kdWxlTm90Rm91bmRFcnJvci4qTm8gbW9kdWxlIG5hbWVkLipub3QgYSBwYWNrYWdlJyksCiAgICAgICAgICAgICAoJ29zLnBhdGgnLCBicidsb2FkZXIuKmNhbm5vdCBoYW5kbGUnKSwKICAgICAgICAgICAgICgnaW1wb3J0bGliJywgYnInTm8gbW9kdWxlIG5hbWVkLionCiAgICAgICAgICAgICAgICAgYnInaXMgYSBwYWNrYWdlIGFuZCBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQnKSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZV9tb2R1bGUucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVfbW9kdWxlLnB5CmluZGV4IDMzOTRiMzkuLjFhOGY2OTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZV9tb2R1bGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlX21vZHVsZS5weQpAQCAtNjksNyArNjksNyBAQAogICAgICAgICAjIHdpdGggYmFubmVyCiAgICAgICAgIHNlbGYuaW5mdW5jLnNpZGVfZWZmZWN0ID0gRU9GRXJyb3IoJ0ZpbmlzaGVkJykKICAgICAgICAgc2VsZi5jb25zb2xlLmludGVyYWN0KGJhbm5lcj0nRm9vJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zdGRlcnIubWV0aG9kX2NhbGxzKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zdGRlcnIubWV0aG9kX2NhbGxzKSwgMykKICAgICAgICAgYmFubmVyX2NhbGwgPSBzZWxmLnN0ZGVyci5tZXRob2RfY2FsbHNbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYW5uZXJfY2FsbCwgWyd3cml0ZScsICgnRm9vXG4nLCksIHt9XSkKIApAQCAtNzcsOCArNzcsMzYgQEAKICAgICAgICAgc2VsZi5zdGRlcnIucmVzZXRfbW9jaygpCiAgICAgICAgIHNlbGYuaW5mdW5jLnNpZGVfZWZmZWN0ID0gRU9GRXJyb3IoJ0ZpbmlzaGVkJykKICAgICAgICAgc2VsZi5jb25zb2xlLmludGVyYWN0KGJhbm5lcj0nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zdGRlcnIubWV0aG9kX2NhbGxzKSwgMikKKworICAgIGRlZiB0ZXN0X2V4aXRfbXNnKHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQgZXhpdCBtZXNzYWdlCisgICAgICAgIHNlbGYuaW5mdW5jLnNpZGVfZWZmZWN0ID0gRU9GRXJyb3IoJ0ZpbmlzaGVkJykKKyAgICAgICAgc2VsZi5jb25zb2xlLmludGVyYWN0KGJhbm5lcj0nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zdGRlcnIubWV0aG9kX2NhbGxzKSwgMikKKyAgICAgICAgZXJyX21zZyA9IHNlbGYuc3RkZXJyLm1ldGhvZF9jYWxsc1sxXQorICAgICAgICBleHBlY3RlZCA9ICdub3cgZXhpdGluZyBJbnRlcmFjdGl2ZUNvbnNvbGUuLi5cbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJfbXNnLCBbJ3dyaXRlJywgKGV4cGVjdGVkLCksIHt9XSkKKworICAgICAgICAjIG5vIGV4aXQgbWVzc2FnZQorICAgICAgICBzZWxmLnN0ZGVyci5yZXNldF9tb2NrKCkKKyAgICAgICAgc2VsZi5pbmZ1bmMuc2lkZV9lZmZlY3QgPSBFT0ZFcnJvcignRmluaXNoZWQnKQorICAgICAgICBzZWxmLmNvbnNvbGUuaW50ZXJhY3QoYmFubmVyPScnLCBleGl0bXNnPScnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnN0ZGVyci5tZXRob2RfY2FsbHMpLCAxKQogCisgICAgICAgICMgY3VzdG9tIGV4aXQgbWVzc2FnZQorICAgICAgICBzZWxmLnN0ZGVyci5yZXNldF9tb2NrKCkKKyAgICAgICAgbWVzc2FnZSA9ICgKKyAgICAgICAgICAgICdieWUhIFxOe0dSRUVLIFNNQUxMIExFVFRFUiBaRVRBfVxOe0NZUklMTElDIFNNQUxMIExFVFRFUiBaSEV9JworICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmluZnVuYy5zaWRlX2VmZmVjdCA9IEVPRkVycm9yKCdGaW5pc2hlZCcpCisgICAgICAgIHNlbGYuY29uc29sZS5pbnRlcmFjdChiYW5uZXI9JycsIGV4aXRtc2c9bWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zdGRlcnIubWV0aG9kX2NhbGxzKSwgMikKKyAgICAgICAgZXJyX21zZyA9IHNlbGYuc3RkZXJyLm1ldGhvZF9jYWxsc1sxXQorICAgICAgICBleHBlY3RlZCA9IG1lc3NhZ2UgKyAnXG4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyX21zZywgWyd3cml0ZScsIChleHBlY3RlZCwpLCB7fV0pCisKKwogICAgIGRlZiB0ZXN0X2NhdXNlX3RiKHNlbGYpOgogICAgICAgICBzZWxmLmluZnVuYy5zaWRlX2VmZmVjdCA9IFsicmFpc2UgVmFsdWVFcnJvcignJykgZnJvbSBBdHRyaWJ1dGVFcnJvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFT0ZFcnJvcignRmluaXNoZWQnKV0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5CmluZGV4IGVlMWUyOGEuLjZhM2U5OTMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weQpAQCAtNCw3ICs0LDYgQEAKIGltcG9ydCB0ZXN0LnN1cHBvcnQKIGltcG9ydCB1bmljb2RlZGF0YQogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgd2FybmluZ3MKIAogY2xhc3MgUG9zUmV0dXJuOgogICAgICMgdGhpcyBjYW4gYmUgdXNlZCBmb3IgY29uZmlndXJhYmxlIGNhbGxiYWNrcwpAQCAtMjgxLDEyICsyODAsMTIgQEAKICAgICAgICAgKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICAgICBiIlxcdTMwNDJcdTN4eHgiLmRlY29kZSgidW5pY29kZS1lc2NhcGUiLCAidGVzdC5oYW5kbGVyMSIpLAorICAgICAgICAgICAgYiJcXHUzMDQyXFx1M3h4eCIuZGVjb2RlKCJ1bmljb2RlLWVzY2FwZSIsICJ0ZXN0LmhhbmRsZXIxIiksCiAgICAgICAgICAgICAiXHUzMDQyWzw5Mj48MTE3Pjw1MT5deHh4IgogICAgICAgICApCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICAgIGIiXFx1MzA0Mlx1M3h4Ii5kZWNvZGUoInVuaWNvZGUtZXNjYXBlIiwgInRlc3QuaGFuZGxlcjEiKSwKKyAgICAgICAgICAgIGIiXFx1MzA0MlxcdTN4eCIuZGVjb2RlKCJ1bmljb2RlLWVzY2FwZSIsICJ0ZXN0LmhhbmRsZXIxIiksCiAgICAgICAgICAgICAiXHUzMDQyWzw5Mj48MTE3Pjw1MT5deHgiCiAgICAgICAgICkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkKaW5kZXggZDBlM2ExNS4uM2JkZjdkMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5CkBAIC0zLDcgKzMsNiBAQAogIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBQUkMgZW5jb2RpbmdzLgogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5CmluZGV4IGJiOWJlMTEuLmM1ZTJmOTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19oay5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSG9uZ0tvbmcgZW5jb2RpbmdzLgogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaXNvMjAyMi5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaXNvMjAyMi5weQppbmRleCA4YTNjYTcwLi4wMGVhMWMzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19pc28yMDIyLnB5CkBAIC0xLDYgKzEsNSBAQAogIyBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSVNPIDIwMjIgZW5jb2RpbmdzLgogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5CmluZGV4IDQ0YjYzYTAuLjk0Mzc4ZDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSmFwYW5lc2UgZW5jb2RpbmdzLgogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5CmluZGV4IGI2YTc0ZmIuLjg2M2QxNmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19rci5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgUk9LIGVuY29kaW5ncy4KICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weQppbmRleCA5MTc0Mjk2Li5iYjFkMTMzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIFJPQyBlbmNvZGluZ3MuCiAjCiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCBtdWx0aWJ5dGVjb2RlY19zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQppbmRleCBmMWJkMzg0Li44OWU1MWM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBQUkMgZW5jb2RpbmdzCiAjCiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCBtdWx0aWJ5dGVjb2RlY19zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQppbmRleCA0YzBjNDE1Li43YTQ4ZDI0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBIb25nS29uZyBlbmNvZGluZ3MKICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5CmluZGV4IDU3NzM4MjMuLmZkZmVjODAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5CkBAIC0zLDcgKzMsNiBAQAogIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIEphcGFuZXNlIGVuY29kaW5ncwogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKaW5kZXggNmNiNDFjOC4uNDcxY2Q3NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgUk9LIGVuY29kaW5ncwogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKaW5kZXggMmVhNDRiNS4uMTQ1YTk3ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgUk9DIGVuY29kaW5ncwogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKaW5kZXggMDQ3OTU0Mi4uNGQ5MWEwNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKQEAgLTQsMTYgKzQsMTAgQEAKIGltcG9ydCBsb2NhbGUKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgZW5jb2RpbmdzCiAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCi1pZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKLSAgICBWSVNUQV9PUl9MQVRFUiA9IChzeXMuZ2V0d2luZG93c3ZlcnNpb24oKS5tYWpvciA+PSA2KQotZWxzZToKLSAgICBWSVNUQV9PUl9MQVRFUiA9IEZhbHNlCi0KIHRyeToKICAgICBpbXBvcnQgY3R5cGVzCiBleGNlcHQgSW1wb3J0RXJyb3I6CkBAIC0yNyw2ICsyMSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZXIoaW5wdXQpLCAoZXhwZWN0LCBsZW4oaW5wdXQpKSkKICAgICByZXR1cm4gY2hlY2sKIAorCiBjbGFzcyBRdWV1ZShvYmplY3QpOgogICAgICIiIgogICAgIHF1ZXVlOiB3cml0ZSBieXRlcyBhdCBvbmUgZW5kLCByZWFkIGJ5dGVzIGZyb20gdGhlIG90aGVyIGVuZApAQCAtNDcsNiArNDIsNyBAQAogICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gc2VsZi5fYnVmZmVyW3NpemU6XQogICAgICAgICAgICAgcmV0dXJuIHMKIAorCiBjbGFzcyBNaXhJbkNoZWNrU3RhdGVIYW5kbGluZzoKICAgICBkZWYgY2hlY2tfc3RhdGVfaGFuZGxpbmdfZGVjb2RlKHNlbGYsIGVuY29kaW5nLCB1LCBzKToKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHMpKzEpOgpAQCAtODAsNiArNzYsNyBAQAogICAgICAgICAgICAgcGFydDIgPSBkLmVuY29kZSh1W2k6XSwgVHJ1ZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgcGFydDErcGFydDIpCiAKKwogY2xhc3MgUmVhZFRlc3QoTWl4SW5DaGVja1N0YXRlSGFuZGxpbmcpOgogICAgIGRlZiBjaGVja19wYXJ0aWFsKHNlbGYsIGlucHV0LCBwYXJ0aWFscmVzdWx0cyk6CiAgICAgICAgICMgZ2V0IGEgU3RyZWFtUmVhZGVyIGZvciB0aGUgZW5jb2RpbmcgYW5kIGZlZWQgdGhlIGJ5dGVzdHJpbmcgdmVyc2lvbgpAQCAtMzU4LDYgKzM1NSwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJyZXBsYWNlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIls/XSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcpKQogCisgICAgICAgICMgc2VxdWVudGlhbCBzdXJyb2dhdGUgY2hhcmFjdGVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEODAwXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJpZ25vcmUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiW10iLmVuY29kZShzZWxmLmVuY29kaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiW1x1RDgwMFx1REM4MF0iLmVuY29kZShzZWxmLmVuY29kaW5nLCAicmVwbGFjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbPz9dIi5lbmNvZGUoc2VsZi5lbmNvZGluZykpCisKICAgICAgICAgYm9tID0gIiIuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCiAgICAgICAgIGZvciBiZWZvcmUsIGFmdGVyIGluIFsoIlxVMDAwMTBmZmYiLCAiQSIpLCAoIlsiLCAiXSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJBIiwgIlxVMDAwMTBmZmYiKV06CkBAIC0zODMsNiArMzg2LDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9zZXF1ZW5jZS5kZWNvZGUoc2VsZi5lbmNvZGluZywgImJhY2tzbGFzaHJlcGxhY2UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlICsgYmFja3NsYXNocmVwbGFjZSArIGFmdGVyKQogCisKIGNsYXNzIFVURjMyVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMiIKICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgpAQCAtNDc4LDYgKzQ4Miw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1xVMDAwMTAwMDAnICogMTAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2RlY29kZShlbmNvZGVkX2JlKVswXSkKIAorCiBjbGFzcyBVVEYzMkxFVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMi1sZSIKICAgICBpbGxfZm9ybWVkX3NlcXVlbmNlID0gYiJceDgwXHhkY1x4MDBceDAwIgpAQCAtNTIzLDYgKzUyOCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1xVMDAwMTAwMDAnICogMTAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2xlX2RlY29kZShlbmNvZGVkKVswXSkKIAorCiBjbGFzcyBVVEYzMkJFVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMi1iZSIKICAgICBpbGxfZm9ybWVkX3NlcXVlbmNlID0gYiJceDAwXHgwMFx4ZGNceDgwIgpAQCAtNzQ3LDYgKzc1Myw3IEBACiAgICAgZW5jb2RpbmcgPSAidXRmLTgiCiAgICAgaWxsX2Zvcm1lZF9zZXF1ZW5jZSA9IGIiXHhlZFx4YjJceDgwIgogICAgIGlsbF9mb3JtZWRfc2VxdWVuY2VfcmVwbGFjZSA9ICJcdWZmZmQiICogMworICAgIEJPTSA9IGInJwogCiAgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKApAQCAtNzc1LDI3ICs3ODIsNDkgQEAKICAgICAgICAgc2VsZi5jaGVja19zdGF0ZV9oYW5kbGluZ19kZWNvZGUoc2VsZi5lbmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSwgdS5lbmNvZGUoc2VsZi5lbmNvZGluZykpCiAKKyAgICBkZWYgdGVzdF9kZWNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ2lnbm9yZScsICdbXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdyZXBsYWNlJywgJ1tcdWZmZmRcdWZmZmRdJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsICdbXHVkYzgwXHVkY2ZmXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdiYWNrc2xhc2hyZXBsYWNlJywgJ1tcXHg4MFxceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmRlY29kZShzZWxmLmVuY29kaW5nLCBlcnJvcl9oYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQorCiAgICAgZGVmIHRlc3RfbG9uZV9zdXJyb2dhdGVzKHNlbGYpOgogICAgICAgICBzdXBlcigpLnRlc3RfbG9uZV9zdXJyb2dhdGVzKCkKICAgICAgICAgIyBub3Qgc3VyZSBpZiB0aGlzIGlzIG1ha2luZyBzZW5zZSBmb3IKICAgICAgICAgIyBVVEYtMTYgYW5kIFVURi0zMgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEQzgwXSIuZW5jb2RlKCd1dGYtOCcsICJzdXJyb2dhdGVlc2NhcGUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiJ1tceDgwXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdURDODBdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZWVzY2FwZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQk9NICsgYidbXHg4MF0nKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgICJbXHVEQzgwXHVEODAwXHVERkZGXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVlc2NhcGUiKQorICAgICAgICBleGMgPSBjbS5leGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXSwgJ1x1RDgwMFx1REZGRicpCiAKICAgICBkZWYgdGVzdF9zdXJyb2dhdGVwYXNzX2hhbmRsZXIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImFiY1x1ZDgwMGRlZiIuZW5jb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYiJhYmNceGVkXHhhMFx4ODBkZWYiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjXHhlZFx4YTBceDgwZGVmIi5kZWNvZGUoInV0Zi04IiwgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYWJjXHVkODAwZGVmIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkJPTSArIGIiYWJjXHhlZFx4YTBceDgwZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXFUwMDAxMGZmZlx1RDgwMCIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CT00gKyBiIlx4ZjBceDkwXHhiZlx4YmZceGVkXHhhMFx4ODAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEODAwXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CT00gKyBiJ1tceGVkXHhhMFx4ODBceGVkXHhiMlx4ODBdJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjXHhlZFx4YTBceDgwZGVmIi5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjXHVkODAwZGVmIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXFUwMDAxMGZmZlx1RDgwMCIuZW5jb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYiJceGYwXHg5MFx4YmZceGJmXHhlZFx4YTBceDgwIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIlx4ZjBceDkwXHhiZlx4YmZceGVkXHhhMFx4ODAiLmRlY29kZSgidXRmLTgiLCAic3Vycm9nYXRlcGFzcyIpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiXHhmMFx4OTBceGJmXHhiZlx4ZWRceGEwXHg4MCIuZGVjb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlxVMDAwMTBmZmZcdUQ4MDAiKQorCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2RlY3MubG9va3VwX2Vycm9yKCJzdXJyb2dhdGVwYXNzIikpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKToKLSAgICAgICAgICAgIGIiYWJjXHhlZFx4YTAiLmRlY29kZSgidXRmLTgiLCAic3Vycm9nYXRlcGFzcyIpCisgICAgICAgICAgICBiImFiY1x4ZWRceGEwIi5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvcik6Ci0gICAgICAgICAgICBiImFiY1x4ZWRceGEweiIuZGVjb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIikKKyAgICAgICAgICAgIGIiYWJjXHhlZFx4YTB6Ii5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKQorCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLAogICAgICAgICAgICAgICAgICAgICAgJ2NwNjUwMDEgaXMgYSBXaW5kb3dzLW9ubHkgY29kZWMnKQpAQCAtODA3LDE4ICs4MzYsMTMgQEAKICAgICAgICAgICAgICgnYWJjJywgJ3N0cmljdCcsIGInYWJjJyksCiAgICAgICAgICAgICAoJ1x4ZTlcdTIwYWMnLCAnc3RyaWN0JywgIGInXHhjM1x4YTlceGUyXHg4Mlx4YWMnKSwKICAgICAgICAgICAgICgnXFUwMDEwZmZmZicsICdzdHJpY3QnLCBiJ1x4ZjRceDhmXHhiZlx4YmYnKSwKKyAgICAgICAgICAgICgnXHVkYzgwJywgJ3N0cmljdCcsIE5vbmUpLAorICAgICAgICAgICAgKCdcdWRjODAnLCAnaWdub3JlJywgYicnKSwKKyAgICAgICAgICAgICgnXHVkYzgwJywgJ3JlcGxhY2UnLCBiJz8nKSwKKyAgICAgICAgICAgICgnXHVkYzgwJywgJ2JhY2tzbGFzaHJlcGxhY2UnLCBiJ1xcdWRjODAnKSwKKyAgICAgICAgICAgICgnXHVkYzgwJywgJ25hbWVyZXBsYWNlJywgYidcXHVkYzgwJyksCisgICAgICAgICAgICAoJ1x1ZGM4MCcsICdzdXJyb2dhdGVwYXNzJywgYidceGVkXHhiMlx4ODAnKSwKICAgICAgICAgXQotICAgICAgICBpZiBWSVNUQV9PUl9MQVRFUjoKLSAgICAgICAgICAgIHRlc3RzLmV4dGVuZCgoCi0gICAgICAgICAgICAgICAgKCdcdWRjODAnLCAnc3RyaWN0JywgTm9uZSksCi0gICAgICAgICAgICAgICAgKCdcdWRjODAnLCAnaWdub3JlJywgYicnKSwKLSAgICAgICAgICAgICAgICAoJ1x1ZGM4MCcsICdyZXBsYWNlJywgYic/JyksCi0gICAgICAgICAgICAgICAgKCdcdWRjODAnLCAnYmFja3NsYXNocmVwbGFjZScsIGInXFx1ZGM4MCcpLAotICAgICAgICAgICAgICAgICgnXHVkYzgwJywgJ25hbWVyZXBsYWNlJywgYidcXHVkYzgwJyksCi0gICAgICAgICAgICAgICAgKCdcdWRjODAnLCAnc3Vycm9nYXRlcGFzcycsIGInXHhlZFx4YjJceDgwJyksCi0gICAgICAgICAgICApKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdGVzdHMuYXBwZW5kKCgnXHVkYzgwJywgJ3N0cmljdCcsIGInXHhlZFx4YjJceDgwJykpCiAgICAgICAgIGZvciB0ZXh0LCBlcnJvcnMsIGV4cGVjdGVkIGluIHRlc3RzOgogICAgICAgICAgICAgaWYgZXhwZWN0ZWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgdHJ5OgpAQCAtODQ1LDE3ICs4NjksMTAgQEAKICAgICAgICAgICAgIChiJ1tceGZmXScsICdpZ25vcmUnLCAnW10nKSwKICAgICAgICAgICAgIChiJ1tceGZmXScsICdyZXBsYWNlJywgJ1tcdWZmZmRdJyksCiAgICAgICAgICAgICAoYidbXHhmZl0nLCAnc3Vycm9nYXRlZXNjYXBlJywgJ1tcdWRjZmZdJyksCisgICAgICAgICAgICAoYidbXHhlZFx4YjJceDgwXScsICdzdHJpY3QnLCBOb25lKSwKKyAgICAgICAgICAgIChiJ1tceGVkXHhiMlx4ODBdJywgJ2lnbm9yZScsICdbXScpLAorICAgICAgICAgICAgKGInW1x4ZWRceGIyXHg4MF0nLCAncmVwbGFjZScsICdbXHVmZmZkXHVmZmZkXHVmZmZkXScpLAogICAgICAgICBdCi0gICAgICAgIGlmIFZJU1RBX09SX0xBVEVSOgotICAgICAgICAgICAgdGVzdHMuZXh0ZW5kKCgKLSAgICAgICAgICAgICAgICAoYidbXHhlZFx4YjJceDgwXScsICdzdHJpY3QnLCBOb25lKSwKLSAgICAgICAgICAgICAgICAoYidbXHhlZFx4YjJceDgwXScsICdpZ25vcmUnLCAnW10nKSwKLSAgICAgICAgICAgICAgICAoYidbXHhlZFx4YjJceDgwXScsICdyZXBsYWNlJywgJ1tcdWZmZmRcdWZmZmRcdWZmZmRdJyksCi0gICAgICAgICAgICApKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdGVzdHMuZXh0ZW5kKCgKLSAgICAgICAgICAgICAgICAoYidbXHhlZFx4YjJceDgwXScsICdzdHJpY3QnLCAnW1x1ZGM4MF0nKSwKLSAgICAgICAgICAgICkpCiAgICAgICAgIGZvciByYXcsIGVycm9ycywgZXhwZWN0ZWQgaW4gdGVzdHM6CiAgICAgICAgICAgICBpZiBleHBlY3RlZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICB0cnk6CkBAIC04NzAsNyArODg3LDYgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgIHJhdy5kZWNvZGUsICdjcDY1MDAxJywgZXJyb3JzKQogCi0gICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoVklTVEFfT1JfTEFURVIsICdyZXF1aXJlIFdpbmRvd3MgVmlzdGEgb3IgbGF0ZXInKQogICAgIGRlZiB0ZXN0X2xvbmVfc3Vycm9nYXRlcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCAiXHVkODAwIi5lbmNvZGUsICJjcDY1MDAxIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBiIlx4ZWRceGEwXHg4MCIuZGVjb2RlLCAiY3A2NTAwMSIpCkBAIC04ODcsNyArOTAzLDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiW1x1REM4MF0iLmVuY29kZSgiY3A2NTAwMSIsICJyZXBsYWNlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYidbP10nKQogCi0gICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoVklTVEFfT1JfTEFURVIsICdyZXF1aXJlIFdpbmRvd3MgVmlzdGEgb3IgbGF0ZXInKQogICAgIGRlZiB0ZXN0X3N1cnJvZ2F0ZXBhc3NfaGFuZGxlcihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYWJjXHVkODAwZGVmIi5lbmNvZGUoImNwNjUwMDEiLCAic3Vycm9nYXRlcGFzcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGIiYWJjXHhlZFx4YTBceDgwZGVmIikKQEAgLTEwNTksNiArMTA3NCw3IEBACiAKIGNsYXNzIFVURjhTaWdUZXN0KFVURjhUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZW5jb2RpbmcgPSAidXRmLTgtc2lnIgorICAgIEJPTSA9IGNvZGVjcy5CT01fVVRGOAogCiAgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKApAQCAtMTE1OSw3ICsxMTc1LDcgQEAKICAgICAgICAgY2hlY2soYiJbXFxcbl0iLCBiIltdIikKICAgICAgICAgY2hlY2soYnInW1wiXScsIGInWyJdJykKICAgICAgICAgY2hlY2soYnIiW1wnXSIsIGIiWyddIikKLSAgICAgICAgY2hlY2soYnIiW1xcXSIsIGJyIltcXSIpCisgICAgICAgIGNoZWNrKGJyIltcXF0iLCBiIltcXF0iKQogICAgICAgICBjaGVjayhiciJbXGFdIiwgYiJbXHgwN10iKQogICAgICAgICBjaGVjayhiciJbXGJdIiwgYiJbXHgwOF0iKQogICAgICAgICBjaGVjayhiciJbXHRdIiwgYiJbXHgwOV0iKQpAQCAtMTE2OCw3ICsxMTg0LDYgQEAKICAgICAgICAgY2hlY2soYnIiW1xmXSIsIGIiW1x4MGNdIikKICAgICAgICAgY2hlY2soYnIiW1xyXSIsIGIiW1x4MGRdIikKICAgICAgICAgY2hlY2soYnIiW1w3XSIsIGIiW1x4MDddIikKLSAgICAgICAgY2hlY2soYnIiW1w4XSIsIGJyIltcOF0iKQogICAgICAgICBjaGVjayhiciJbXDc4XSIsIGIiW1x4MDc4XSIpCiAgICAgICAgIGNoZWNrKGJyIltcNDFdIiwgYiJbIV0iKQogICAgICAgICBjaGVjayhiciJbXDQxOF0iLCBiIlshOF0iKQpAQCAtMTE3NiwxMiArMTE5MSwxOCBAQAogICAgICAgICBjaGVjayhiciJbXDEwMTBdIiwgYiJbQTBdIikKICAgICAgICAgY2hlY2soYnIiW1w1MDFdIiwgYiJbQV0iKQogICAgICAgICBjaGVjayhiciJbXHg0MV0iLCBiIltBXSIpCi0gICAgICAgIGNoZWNrKGJyIltcWDQxXSIsIGJyIltcWDQxXSIpCiAgICAgICAgIGNoZWNrKGJyIltceDQxMF0iLCBiIltBMF0iKQotICAgICAgICBmb3IgYiBpbiByYW5nZSgyNTYpOgotICAgICAgICAgICAgaWYgYiBub3QgaW4gYidcbiJcJ1xcYWJ0bnZmcjAxMjM0NTY3eCc6Ci0gICAgICAgICAgICAgICAgYiA9IGJ5dGVzKFtiXSkKLSAgICAgICAgICAgICAgICBjaGVjayhiJ1xcJyArIGIsIGInXFwnICsgYikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOTcsIDEyMyk6CisgICAgICAgICAgICBiID0gYnl0ZXMoW2ldKQorICAgICAgICAgICAgaWYgYiBub3QgaW4gYidhYmZucnR2eCc6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICAgICAgICAgIGNoZWNrKGIiXFwiICsgYiwgYiJcXCIgKyBiKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICAgICAgY2hlY2soYiJcXCIgKyBiLnVwcGVyKCksIGIiXFwiICsgYi51cHBlcigpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIGNoZWNrKGJyIlw4IiwgYiJcXDgiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIGNoZWNrKGJyIlw5IiwgYiJcXDkiKQogCiAgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgogICAgICAgICBkZWNvZGUgPSBjb2RlY3MuZXNjYXBlX2RlY29kZQpAQCAtMTE5NCw2ICsxMjE1LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoYnIiW1x4MF1ceDAiLCAiaWdub3JlIiksIChiIltdIiwgOCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGJyIltceDBdXHgwIiwgInJlcGxhY2UiKSwgKGIiWz9dPyIsIDgpKQogCisKIGNsYXNzIFJlY29kaW5nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfcmVjb2Rpbmcoc2VsZik6CiAgICAgICAgIGYgPSBpby5CeXRlc0lPKCkKQEAgLTEzMTMsNiArMTMzNSw3IEBACiAgICAgaWYgbGVuKGkpIT0yOgogICAgICAgICBwcmludChyZXByKGkpKQogCisKIGNsYXNzIFB1bnljb2RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgogICAgICAgICBmb3IgdW5pLCBwdW55IGluIHB1bnljb2RlX3Rlc3RjYXNlczoKQEAgLTEzMzIsNiArMTM1NSw3IEBACiAgICAgICAgICAgICBwdW55ID0gcHVueS5kZWNvZGUoImFzY2lpIikuZW5jb2RlKCJhc2NpaSIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaSwgcHVueS5kZWNvZGUoInB1bnljb2RlIikpCiAKKwogY2xhc3MgVW5pY29kZUludGVybmFsVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoU0laRU9GX1dDSEFSX1QgPT0gNCwgJ3NwZWNpZmljIHRvIDMyLWJpdCB3Y2hhcl90JykKICAgICBkZWYgdGVzdF9idWcxMjUxMzAwKHNlbGYpOgpAQCAtMTU4Niw2ICsxNjEwLDcgQEAKICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHN1cHBvcnQuVGVzdEZhaWxlZCgiVGVzdCAzLiVkOiAlcyIgJSAocG9zKzEsIHN0cihlKSkpCiAKKwogY2xhc3MgSUROQUNvZGVjVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfYnVpbHRpbl9kZWNvZGUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGIicHl0aG9uLm9yZyIsICJpZG5hIiksICJweXRob24ub3JnIikKQEAgLTE2NzIsNiArMTY5Nyw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sCiAgICAgICAgICAgICAgICAgYiJweXRob24ub3JnIi5kZWNvZGUsICJpZG5hIiwgZXJyb3JzKQogCisKIGNsYXNzIENvZGVjc01vZHVsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgpAQCAtMTc4MCw2ICsxODA2LDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwKICAgICAgICAgICAgICAgICBjb2RlY3MuZGVjb2RlLCBiJ2FiYycsICd1bmRlZmluZWQnLCBlcnJvcnMpCiAKKwogY2xhc3MgU3RyZWFtUmVhZGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgc2V0VXAoc2VsZik6CkBAIC0xNzkwLDYgKzE4MTcsNyBAQAogICAgICAgICBmID0gc2VsZi5yZWFkZXIoc2VsZi5zdHJlYW0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZXMoKSwgWydcdWQ1NWNcbicsICdcdWFlMDAnXSkKIAorCiBjbGFzcyBFbmNvZGVkRmlsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CkBAIC0xOTA5LDYgKzE5MzcsOCBAQAogCiBpZiBoYXNhdHRyKGNvZGVjcywgIm1iY3NfZW5jb2RlIik6CiAgICAgYWxsX3VuaWNvZGVfZW5jb2RpbmdzLmFwcGVuZCgibWJjcyIpCitpZiBoYXNhdHRyKGNvZGVjcywgIm9lbV9lbmNvZGUiKToKKyAgICBhbGxfdW5pY29kZV9lbmNvZGluZ3MuYXBwZW5kKCJvZW0iKQogCiAjIFRoZSBmb2xsb3dpbmcgZW5jb2RpbmcgaXMgbm90IHRlc3RlZCwgYmVjYXVzZSBpdCdzIG5vdCBzdXBwb3NlZAogIyB0byB3b3JrOgpAQCAtMTkyMCw2ICsxOTUwLDcgQEAKICAgICAidW5pY29kZV9pbnRlcm5hbCIKIF0KIAorCiBjbGFzcyBCYXNpY1VuaWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLCBNaXhJbkNoZWNrU3RhdGVIYW5kbGluZyk6CiAgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgogICAgICAgICBzID0gImFiYzEyMyIgICMgYWxsIGNvZGVjcyBzaG91bGQgYmUgYWJsZSB0byBlbmNvZGUgdGhlc2UKQEAgLTIwODIsNiArMjExMyw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0ZV9oYW5kbGluZ19kZWNvZGUoZW5jb2RpbmcsIHUsIHUuZW5jb2RlKGVuY29kaW5nKSkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0YXRlX2hhbmRsaW5nX2VuY29kZShlbmNvZGluZywgdSwgdS5lbmNvZGUoZW5jb2RpbmcpKQogCisKIGNsYXNzIENoYXJtYXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9kZWNvZGVfd2l0aF9zdHJpbmdfbWFwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKApAQCAtMjMzMiw2ICsyMzY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc3RyZWFtd3JpdGVyLCAnc3RyaWN0JykgYXMgc3J3OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcncucmVhZCgpLCAiXHhmYyIpCiAKKwogY2xhc3MgVHlwZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9kZWNvZGVfdW5pY29kZShzZWxmKToKICAgICAgICAgIyBNb3N0IGRlY29kZXJzIGRvbid0IGFjY2VwdCB1bmljb2RlIGlucHV0CkBAIC0yNDIwLDcgKzI0NTMsNiBAQAogICAgICAgICBjaGVjayhiciJbXGZdIiwgIltceDBjXSIpCiAgICAgICAgIGNoZWNrKGJyIltccl0iLCAiW1x4MGRdIikKICAgICAgICAgY2hlY2soYnIiW1w3XSIsICJbXHgwN10iKQotICAgICAgICBjaGVjayhiciJbXDhdIiwgciJbXDhdIikKICAgICAgICAgY2hlY2soYnIiW1w3OF0iLCAiW1x4MDc4XSIpCiAgICAgICAgIGNoZWNrKGJyIltcNDFdIiwgIlshXSIpCiAgICAgICAgIGNoZWNrKGJyIltcNDE4XSIsICJbIThdIikKQEAgLTI0MzAsOSArMjQ2MiwxOCBAQAogICAgICAgICBjaGVjayhiciJbXHg0MTBdIiwgIltBMF0iKQogICAgICAgICBjaGVjayhiciJcdTIwYWMiLCAiXHUyMGFjIikKICAgICAgICAgY2hlY2soYnIiXFUwMDAxZDEyMCIsICJcVTAwMDFkMTIwIikKLSAgICAgICAgZm9yIGIgaW4gcmFuZ2UoMjU2KToKLSAgICAgICAgICAgIGlmIGIgbm90IGluIGInXG4iXCdcXGFidG52ZnIwMTIzNDU2N3h1VU4nOgotICAgICAgICAgICAgICAgIGNoZWNrKGInXFwnICsgYnl0ZXMoW2JdKSwgJ1xcJyArIGNocihiKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOTcsIDEyMyk6CisgICAgICAgICAgICBiID0gYnl0ZXMoW2ldKQorICAgICAgICAgICAgaWYgYiBub3QgaW4gYidhYmZucnR1dngnOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgICAgICAgICBjaGVjayhiIlxcIiArIGIsICJcXCIgKyBjaHIoaSkpCisgICAgICAgICAgICBpZiBiLnVwcGVyKCkgbm90IGluIGInVU4nOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgICAgICAgICBjaGVjayhiIlxcIiArIGIudXBwZXIoKSwgIlxcIiArIGNocihpLTMyKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBjaGVjayhiciJcOCIsICJcXDgiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIGNoZWNrKGJyIlw5IiwgIlxcOSIpCiAKICAgICBkZWYgdGVzdF9kZWNvZGVfZXJyb3JzKHNlbGYpOgogICAgICAgICBkZWNvZGUgPSBjb2RlY3MudW5pY29kZV9lc2NhcGVfZGVjb2RlCkBAIC0yNjIyLDYgKzI2NjMsNyBAQAogICAgIGJ5dGVzX3RyYW5zZm9ybV9lbmNvZGluZ3MuYXBwZW5kKCJiejJfY29kZWMiKQogICAgIHRyYW5zZm9ybV9hbGlhc2VzWyJiejJfY29kZWMiXSA9IFsiYnoyIl0KIAorCiBjbGFzcyBUcmFuc2Zvcm1Db2RlY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgpAQCAtMjY3NCw4ICsyNzE2LDggQEAKICAgICAgICAgYmFkX2lucHV0ID0gImJhZCBpbnB1dCB0eXBlIgogICAgICAgICBmb3IgZW5jb2RpbmcgaW4gYnl0ZXNfdHJhbnNmb3JtX2VuY29kaW5nczoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGVuY29kaW5nPWVuY29kaW5nKToKLSAgICAgICAgICAgICAgICBmbXQgPSAoICJ7IXJ9IGlzIG5vdCBhIHRleHQgZW5jb2Rpbmc7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgY29kZWNzLmVuY29kZVwoXCkgdG8gaGFuZGxlIGFyYml0cmFyeSBjb2RlY3MiKQorICAgICAgICAgICAgICAgIGZtdCA9IChyInshcn0gaXMgbm90IGEgdGV4dCBlbmNvZGluZzsgIgorICAgICAgICAgICAgICAgICAgICAgICByInVzZSBjb2RlY3MuZW5jb2RlXChcKSB0byBoYW5kbGUgYXJiaXRyYXJ5IGNvZGVjcyIpCiAgICAgICAgICAgICAgICAgbXNnID0gZm10LmZvcm1hdChlbmNvZGluZykKICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoTG9va3VwRXJyb3IsIG1zZykgYXMgZmFpbHVyZToKICAgICAgICAgICAgICAgICAgICAgYmFkX2lucHV0LmVuY29kZShlbmNvZGluZykKQEAgLTI2ODQsNyArMjcyNiw3IEBACiAgICAgZGVmIHRlc3RfdGV4dF90b19iaW5hcnlfYmxhY2tsaXN0c190ZXh0X3RyYW5zZm9ybXMoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgc3RyLmVuY29kZSBnaXZlcyBhIGdvb2QgZXJyb3IgbWVzc2FnZSBmb3Igc3RyIC0+IHN0ciBjb2RlY3MKICAgICAgICAgbXNnID0gKHIiXidyb3RfMTMnIGlzIG5vdCBhIHRleHQgZW5jb2Rpbmc7ICIKLSAgICAgICAgICAgICAgICAidXNlIGNvZGVjcy5lbmNvZGVcKFwpIHRvIGhhbmRsZSBhcmJpdHJhcnkgY29kZWNzIikKKyAgICAgICAgICAgICAgIHIidXNlIGNvZGVjcy5lbmNvZGVcKFwpIHRvIGhhbmRsZSBhcmJpdHJhcnkgY29kZWNzIikKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KExvb2t1cEVycm9yLCBtc2cpOgogICAgICAgICAgICAgImp1c3QgYW4gZXhhbXBsZSBtZXNzYWdlIi5lbmNvZGUoInJvdF8xMyIpCiAKQEAgLTI2OTYsNyArMjczOCw3IEBACiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChlbmNvZGluZz1lbmNvZGluZyk6CiAgICAgICAgICAgICAgICAgZW5jb2RlZF9kYXRhID0gY29kZWNzLmVuY29kZShkYXRhLCBlbmNvZGluZykKICAgICAgICAgICAgICAgICBmbXQgPSAociJ7IXJ9IGlzIG5vdCBhIHRleHQgZW5jb2Rpbmc7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgY29kZWNzLmRlY29kZVwoXCkgdG8gaGFuZGxlIGFyYml0cmFyeSBjb2RlY3MiKQorICAgICAgICAgICAgICAgICAgICAgICByInVzZSBjb2RlY3MuZGVjb2RlXChcKSB0byBoYW5kbGUgYXJiaXRyYXJ5IGNvZGVjcyIpCiAgICAgICAgICAgICAgICAgbXNnID0gZm10LmZvcm1hdChlbmNvZGluZykKICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoTG9va3VwRXJyb3IsIG1zZyk6CiAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfZGF0YS5kZWNvZGUoZW5jb2RpbmcpCkBAIC0yNzA4LDcgKzI3NTAsNyBAQAogICAgICAgICBmb3IgYmFkX2lucHV0IGluIChiImltbXV0YWJsZSIsIGJ5dGVhcnJheShiIm11dGFibGUiKSk6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChiYWRfaW5wdXQ9YmFkX2lucHV0KToKICAgICAgICAgICAgICAgICBtc2cgPSAociJeJ3JvdF8xMycgaXMgbm90IGEgdGV4dCBlbmNvZGluZzsgIgotICAgICAgICAgICAgICAgICAgICAgICAgInVzZSBjb2RlY3MuZGVjb2RlXChcKSB0byBoYW5kbGUgYXJiaXRyYXJ5IGNvZGVjcyIpCisgICAgICAgICAgICAgICAgICAgICAgIHIidXNlIGNvZGVjcy5kZWNvZGVcKFwpIHRvIGhhbmRsZSBhcmJpdHJhcnkgY29kZWNzIikKICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoTG9va3VwRXJyb3IsIG1zZykgYXMgZmFpbHVyZToKICAgICAgICAgICAgICAgICAgICAgYmFkX2lucHV0LmRlY29kZSgicm90XzEzIikKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShmYWlsdXJlLmV4Y2VwdGlvbi5fX2NhdXNlX18pCkBAIC0yOTI3LDEyICsyOTY5LDEyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZCwgYiJub3Qgc3RyISIpCiAgICAgICAgICMgVGV4dCBtb2RlbCBtZXRob2RzIHNob3VsZCBjb21wbGFpbgogICAgICAgICBmbXQgPSAociJeeyFyfSBlbmNvZGVyIHJldHVybmVkICdzdHInIGluc3RlYWQgb2YgJ2J5dGVzJzsgIgotICAgICAgICAgICAgICAgICJ1c2UgY29kZWNzLmVuY29kZVwoXCkgdG8gZW5jb2RlIHRvIGFyYml0cmFyeSB0eXBlcyQiKQorICAgICAgICAgICAgICAgciJ1c2UgY29kZWNzLmVuY29kZVwoXCkgdG8gZW5jb2RlIHRvIGFyYml0cmFyeSB0eXBlcyQiKQogICAgICAgICBtc2cgPSBmbXQuZm9ybWF0KHNlbGYuY29kZWNfbmFtZSkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgbXNnKToKICAgICAgICAgICAgICJzdHJfaW5wdXQiLmVuY29kZShzZWxmLmNvZGVjX25hbWUpCiAgICAgICAgIGZtdCA9IChyIl57IXJ9IGRlY29kZXIgcmV0dXJuZWQgJ2J5dGVzJyBpbnN0ZWFkIG9mICdzdHInOyAiCi0gICAgICAgICAgICAgICAgInVzZSBjb2RlY3MuZGVjb2RlXChcKSB0byBkZWNvZGUgdG8gYXJiaXRyYXJ5IHR5cGVzJCIpCisgICAgICAgICAgICAgICByInVzZSBjb2RlY3MuZGVjb2RlXChcKSB0byBkZWNvZGUgdG8gYXJiaXRyYXJ5IHR5cGVzJCIpCiAgICAgICAgIG1zZyA9IGZtdC5mb3JtYXQoc2VsZi5jb2RlY19uYW1lKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCBtc2cpOgogICAgICAgICAgICAgYiJieXRlcyBpbnB1dCIuZGVjb2RlKHNlbGYuY29kZWNfbmFtZSkKQEAgLTMwNzMsMTEgKzMxMTUsMTAgQEAKICAgICAgICAgICAgIChiJ1x4ZmZceGY0XHg4Zlx4YmZceGJmJywgJ2lnbm9yZScsICdcVTAwMTBmZmZmJyksCiAgICAgICAgICAgICAoYidceGZmXHhmNFx4OGZceGJmXHhiZicsICdyZXBsYWNlJywgJ1x1ZmZmZFxVMDAxMGZmZmYnKSwKICAgICAgICAgKSkKLSAgICAgICAgaWYgVklTVEFfT1JfTEFURVI6Ci0gICAgICAgICAgICBzZWxmLmNoZWNrX2VuY29kZShzZWxmLkNQX1VURjgsICgKLSAgICAgICAgICAgICAgICAoJ1tcVTAwMTBmZmZmXHVEQzgwXScsICdpZ25vcmUnLCBiJ1tceGY0XHg4Zlx4YmZceGJmXScpLAotICAgICAgICAgICAgICAgICgnW1xVMDAxMGZmZmZcdURDODBdJywgJ3JlcGxhY2UnLCBiJ1tceGY0XHg4Zlx4YmZceGJmP10nKSwKLSAgICAgICAgICAgICkpCisgICAgICAgIHNlbGYuY2hlY2tfZW5jb2RlKHNlbGYuQ1BfVVRGOCwgKAorICAgICAgICAgICAgKCdbXFUwMDEwZmZmZlx1REM4MF0nLCAnaWdub3JlJywgYidbXHhmNFx4OGZceGJmXHhiZl0nKSwKKyAgICAgICAgICAgICgnW1xVMDAxMGZmZmZcdURDODBdJywgJ3JlcGxhY2UnLCBiJ1tceGY0XHg4Zlx4YmZceGJmP10nKSwKKyAgICAgICAgKSkKIAogICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsKHNlbGYpOgogICAgICAgICBkZWNvZGVkID0gY29kZWNzLmNvZGVfcGFnZV9kZWNvZGUoOTMyLCBiJ1x4ODInLCAnc3RyaWN0JywgRmFsc2UpCkBAIC0zMDk4LDYgKzMxMzksOTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWQsICgnYWJjJywgMykpCiAKKyAgICBkZWYgdGVzdF9tYmNzX2FsaWFzKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgbG9va2luZyB1cCBvdXIgJ2RlZmF1bHQnIGNvZGVwYWdlIHdpbGwgcmV0dXJuCisgICAgICAgICMgbWJjcyB3aGVuIHdlIGRvbid0IGhhdmUgYSBtb3JlIHNwZWNpZmljIG9uZSBhdmFpbGFibGUKKyAgICAgICAgaW1wb3J0IF9ib290bG9jYWxlCisgICAgICAgIGRlZiBfZ2V0X2Zha2VfY29kZXBhZ2UoKmEpOgorICAgICAgICAgICAgcmV0dXJuICdjcDEyMycKKyAgICAgICAgb2xkX2dldHByZWZlcnJlZGVuY29kaW5nID0gX2Jvb3Rsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcKKyAgICAgICAgX2Jvb3Rsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcgPSBfZ2V0X2Zha2VfY29kZXBhZ2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29kZWMgPSBjb2RlY3MubG9va3VwKCdjcDEyMycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjLm5hbWUsICdtYmNzJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIF9ib290bG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nID0gb2xkX2dldHByZWZlcnJlZGVuY29kaW5nCisKKworY2xhc3MgQVNDSUlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYzEyMycuZW5jb2RlKCdhc2NpaScpLCBiJ2FiYzEyMycpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY10nLCAnaWdub3JlJywgYidbXScpLAorICAgICAgICAgICAgKCdbXHg4MFx4ZmZcdTIwYWNdJywgJ3JlcGxhY2UnLCBiJ1s/Pz9dJyksCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY10nLCAneG1sY2hhcnJlZnJlcGxhY2UnLCBiJ1smIzEyODsmIzI1NTsmIzgzNjQ7XScpLAorICAgICAgICAgICAgKCdbXHg4MFx4ZmZcdTIwYWNcVTAwMGFiY2RlXScsICdiYWNrc2xhc2hyZXBsYWNlJywKKyAgICAgICAgICAgICBiJ1tcXHg4MFxceGZmXFx1MjBhY1xcVTAwMGFiY2RlXScpLAorICAgICAgICAgICAgKCdbXHVkYzgwXHVkY2ZmXScsICdzdXJyb2dhdGVlc2NhcGUnLCBiJ1tceDgwXHhmZl0nKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXJyb3JfaGFuZGxlcj1lcnJvcl9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5lbmNvZGUoJ2FzY2lpJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9zdXJyb2dhdGVlc2NhcGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgICMgdGhlIGZpcnN0IGNoYXJhY3RlciBjYW4gYmUgZGVjb2RlZCwgYnV0IG5vdCB0aGUgc2Vjb25kCisgICAgICAgICAgICAnXHVkYzgwXHhmZicuZW5jb2RlKCdhc2NpaScsICdzdXJyb2dhdGVlc2NhcGUnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjJy5kZWNvZGUoJ2FzY2lpJyksICdhYmMnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlX2Vycm9yKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXJyb3JfaGFuZGxlciwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdpZ25vcmUnLCAnW10nKSwKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAncmVwbGFjZScsICdbXHVmZmZkXHVmZmZkXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdzdXJyb2dhdGVlc2NhcGUnLCAnW1x1ZGM4MFx1ZGNmZl0nKSwKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAnYmFja3NsYXNocmVwbGFjZScsICdbXFx4ODBcXHhmZl0nKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXJyb3JfaGFuZGxlcj1lcnJvcl9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5kZWNvZGUoJ2FzY2lpJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworCitjbGFzcyBMYXRpbjFUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoJ2FiYycsIGInYWJjJyksCisgICAgICAgICAgICAoJ1x4ODBceGU5XHhmZicsIGInXHg4MFx4ZTlceGZmJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZW5jb2RlKCdsYXRpbjEnKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfZXJyb3JzKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXJyb3JfaGFuZGxlciwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKCdbXHUyMGFjXHVkYzgwXScsICdpZ25vcmUnLCBiJ1tdJyksCisgICAgICAgICAgICAoJ1tcdTIwYWNcdWRjODBdJywgJ3JlcGxhY2UnLCBiJ1s/P10nKSwKKyAgICAgICAgICAgICgnW1x1MjBhY1xVMDAwYWJjZGVdJywgJ2JhY2tzbGFzaHJlcGxhY2UnLAorICAgICAgICAgICAgIGInW1xcdTIwYWNcXFUwMDBhYmNkZV0nKSwKKyAgICAgICAgICAgICgnW1x1MjBhY1x1ZGM4MF0nLCAneG1sY2hhcnJlZnJlcGxhY2UnLCBiJ1smIzgzNjQ7JiM1NjQ0ODtdJyksCisgICAgICAgICAgICAoJ1tcdWRjODBcdWRjZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsIGInW1x4ODBceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmVuY29kZSgnbGF0aW4xJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9zdXJyb2dhdGVlc2NhcGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgICMgdGhlIGZpcnN0IGNoYXJhY3RlciBjYW4gYmUgZGVjb2RlZCwgYnV0IG5vdCB0aGUgc2Vjb25kCisgICAgICAgICAgICAnXHVkYzgwXHUyMGFjJy5lbmNvZGUoJ2xhdGluMScsICdzdXJyb2dhdGVlc2NhcGUnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKGInYWJjJywgJ2FiYycpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdbXHg4MFx4ZmZdJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZGVjb2RlKCdsYXRpbjEnKSwgZXhwZWN0ZWQpCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZW9wLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2Rlb3AucHkKaW5kZXggNTA5YmY1ZC4uOThkYTI2ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2Rlb3AucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2Rlb3AucHkKQEAgLTI4Miw3ICsyODIsNiBAQAogICAgICAgICBhaSgiaWYgKGEgPT0gMSBhbmQgYiA9IDIpOiBwYXNzIikKIAogICAgICAgICBhaSgiZGVsIDEiKQotICAgICAgICBhaSgiZGVsICgpIikKICAgICAgICAgYWkoImRlbCAoMSwpIikKICAgICAgICAgYWkoImRlbCBbMV0iKQogICAgICAgICBhaSgiZGVsICcxJyIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weQppbmRleCA1MjM4MzgyLi5mMWZiMDExIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkKQEAgLTIwLDEwICsyMCwxMCBAQAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ2hhaW5NYXAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCiBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgQXdhaXRhYmxlLCBDb3JvdXRpbmUsIEFzeW5jSXRlcmF0b3IsIEFzeW5jSXRlcmFibGUKLWZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBHZW5lcmF0b3IKLWZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBTaXplZCwgQ29udGFpbmVyLCBDYWxsYWJsZQorZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIEdlbmVyYXRvciwgUmV2ZXJzaWJsZQorZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlLCBDb2xsZWN0aW9uCiBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgU2V0LCBNdXRhYmxlU2V0Ci1mcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgTWFwcGluZywgTXV0YWJsZU1hcHBpbmcsIEtleXNWaWV3LCBJdGVtc1ZpZXcKK2Zyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBNYXBwaW5nLCBNdXRhYmxlTWFwcGluZywgS2V5c1ZpZXcsIEl0ZW1zVmlldywgVmFsdWVzVmlldwogZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IFNlcXVlbmNlLCBNdXRhYmxlU2VxdWVuY2UKIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBCeXRlU3RyaW5nCiAKQEAgLTQxMiw2ICs0MTIsMTggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOVENvbG9yLl9maWVsZHMsICgncmVkJywgJ2dyZWVuJywgJ2JsdWUnKSkKICAgICAgICAgZ2xvYmFscygpLnBvcCgnTlRDb2xvcicsIE5vbmUpICAgICAgICAgICMgY2xlYW4tdXAgYWZ0ZXIgdGhpcyB0ZXN0CiAKKyAgICBkZWYgdGVzdF9rZXl3b3JkX29ubHlfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAyNTYyOAorICAgICAgICB3aXRoIHN1cHBvcnQuY2FwdHVyZWRfc3Rkb3V0KCkgYXMgdGVtcGxhdGU6CisgICAgICAgICAgICBOVCA9IG5hbWVkdHVwbGUoJ05UJywgWyd4JywgJ3knXSwgdmVyYm9zZT1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEluKCdjbGFzcyBOVCcsIE5ULl9zb3VyY2UpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIE5UID0gbmFtZWR0dXBsZSgnTlQnLCBbJ3gnLCAneSddLCBUcnVlKQorCisgICAgICAgIE5UID0gbmFtZWR0dXBsZSgnTlQnLCBbJ2FiYycsICdkZWYnXSwgcmVuYW1lPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlQuX2ZpZWxkcywgKCdhYmMnLCAnXzEnKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgTlQgPSBuYW1lZHR1cGxlKCdOVCcsIFsnYWJjJywgJ2RlZiddLCBGYWxzZSwgVHJ1ZSkKIAogICAgIGRlZiB0ZXN0X25hbWVkdHVwbGVfc3ViY2xhc3NfaXNzdWVfMjQ5MzEoc2VsZik6CiAgICAgICAgIGNsYXNzIFBvaW50KG5hbWVkdHVwbGUoJ19Qb2ludCcsIFsneCcsICd5J10pKToKQEAgLTQ4Nyw2ICs0OTksOSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG90aGVyLnJpZ2h0X3NpZGUsJ1JpZ2h0IHNpZGUgbm90IGNhbGxlZCBmb3IgJXMuJXMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodHlwZShpbnN0YW5jZSksIG5hbWUpKQogCitkZWYgX3Rlc3RfZ2VuKCk6CisgICAgeWllbGQKKwogY2xhc3MgVGVzdE9uZVRyaWNrUG9ueUFCQ3MoQUJDVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfQXdhaXRhYmxlKHNlbGYpOgpAQCAtNjc0LDcgKzY4OSw3IEBACiAgICAgICAgIHNhbXBsZXMgPSBbYnl0ZXMoKSwgc3RyKCksCiAgICAgICAgICAgICAgICAgICAgdHVwbGUoKSwgbGlzdCgpLCBzZXQoKSwgZnJvemVuc2V0KCksIGRpY3QoKSwKICAgICAgICAgICAgICAgICAgICBkaWN0KCkua2V5cygpLCBkaWN0KCkuaXRlbXMoKSwgZGljdCgpLnZhbHVlcygpLAotICAgICAgICAgICAgICAgICAgIChsYW1iZGE6ICh5aWVsZCkpKCksCisgICAgICAgICAgICAgICAgICAgX3Rlc3RfZ2VuKCksCiAgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKQEAgLTY4OCw2ICs3MDMsMTYxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhzdHIsIEkpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoSXRlcmFibGUsICdfX2l0ZXJfXycpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfaXNpbnN0YW5jZShJdGVyYWJsZSwgJ19faXRlcl9fJykKKyAgICAgICAgIyBDaGVjayBOb25lIGJsb2NraW5nCisgICAgICAgIGNsYXNzIEl0OgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOiByZXR1cm4gaXRlcihbXSkKKyAgICAgICAgY2xhc3MgSXRCbG9ja2VkKEl0KToKKyAgICAgICAgICAgIF9faXRlcl9fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhJdCwgSXRlcmFibGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShJdCgpLCBJdGVyYWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhJdEJsb2NrZWQsIEl0ZXJhYmxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKEl0QmxvY2tlZCgpLCBJdGVyYWJsZSkpCisKKyAgICBkZWYgdGVzdF9SZXZlcnNpYmxlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHNvbWUgbm9uLXJldmVyc2libGVzCisgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxaiwgZGljdCgpLCBzZXQoKSwgZnJvemVuc2V0KCldCisgICAgICAgIGZvciB4IGluIG5vbl9zYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHgsIFJldmVyc2libGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgUmV2ZXJzaWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICMgQ2hlY2sgc29tZSBub24tcmV2ZXJzaWJsZSBpdGVyYWJsZXMKKyAgICAgICAgbm9uX3JldmVyc2libGVzID0gW2RpY3QoKS5rZXlzKCksIGRpY3QoKS5pdGVtcygpLCBkaWN0KCkudmFsdWVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyKCksIENvdW50ZXIoKS5rZXlzKCksIENvdW50ZXIoKS5pdGVtcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlcigpLnZhbHVlcygpLCBfdGVzdF9nZW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh4IGZvciB4IGluIFtdKSwgaXRlcihbXSksIHJldmVyc2VkKFtdKV0KKyAgICAgICAgZm9yIHggaW4gbm9uX3JldmVyc2libGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHgsIFJldmVyc2libGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgUmV2ZXJzaWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICMgQ2hlY2sgc29tZSByZXZlcnNpYmxlIGl0ZXJhYmxlcworICAgICAgICBzYW1wbGVzID0gW2J5dGVzKCksIHN0cigpLCB0dXBsZSgpLCBsaXN0KCksIE9yZGVyZWREaWN0KCksCisgICAgICAgICAgICAgICAgICAgT3JkZXJlZERpY3QoKS5rZXlzKCksIE9yZGVyZWREaWN0KCkuaXRlbXMoKSwKKyAgICAgICAgICAgICAgICAgICBPcmRlcmVkRGljdCgpLnZhbHVlcygpXQorICAgICAgICBmb3IgeCBpbiBzYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIFJldmVyc2libGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyh0eXBlKHgpLCBSZXZlcnNpYmxlKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgIyBDaGVjayBhbHNvIE1hcHBpbmcsIE11dGFibGVNYXBwaW5nLCBhbmQgU2VxdWVuY2UKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoU2VxdWVuY2UsIFJldmVyc2libGUpLCByZXByKFNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKE1hcHBpbmcsIFJldmVyc2libGUpLCByZXByKE1hcHBpbmcpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoTXV0YWJsZU1hcHBpbmcsIFJldmVyc2libGUpLCByZXByKE11dGFibGVNYXBwaW5nKSkKKyAgICAgICAgIyBDaGVjayBkaXJlY3Qgc3ViY2xhc3NpbmcKKyAgICAgICAgY2xhc3MgUihSZXZlcnNpYmxlKToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihsaXN0KCkpCisgICAgICAgICAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVyKGxpc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJldmVyc2VkKFIoKSkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGZsb2F0LCBSKSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKFJldmVyc2libGUsICdfX3JldmVyc2VkX18nLCAnX19pdGVyX18nKQorICAgICAgICAjIENoZWNrIHJldmVyc2libGUgbm9uLWl0ZXJhYmxlICh3aGljaCBpcyBub3QgUmV2ZXJzaWJsZSkKKyAgICAgICAgY2xhc3MgUmV2Tm9JdGVyOgorICAgICAgICAgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKTogcmV0dXJuIHJldmVyc2VkKFtdKQorICAgICAgICBjbGFzcyBSZXZQbHVzSXRlcihSZXZOb0l0ZXIpOgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOiByZXR1cm4gaXRlcihbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKFJldk5vSXRlciwgUmV2ZXJzaWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShSZXZOb0l0ZXIoKSwgUmV2ZXJzaWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKFJldlBsdXNJdGVyLCBSZXZlcnNpYmxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoUmV2UGx1c0l0ZXIoKSwgUmV2ZXJzaWJsZSkpCisgICAgICAgICMgQ2hlY2sgTm9uZSBibG9ja2luZworICAgICAgICBjbGFzcyBSZXY6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6IHJldHVybiBpdGVyKFtdKQorICAgICAgICAgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKTogcmV0dXJuIHJldmVyc2VkKFtdKQorICAgICAgICBjbGFzcyBSZXZJdEJsb2NrZWQoUmV2KToKKyAgICAgICAgICAgIF9faXRlcl9fID0gTm9uZQorICAgICAgICBjbGFzcyBSZXZSZXZCbG9ja2VkKFJldik6CisgICAgICAgICAgICBfX3JldmVyc2VkX18gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKFJldiwgUmV2ZXJzaWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKFJldigpLCBSZXZlcnNpYmxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKFJldkl0QmxvY2tlZCwgUmV2ZXJzaWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShSZXZJdEJsb2NrZWQoKSwgUmV2ZXJzaWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhSZXZSZXZCbG9ja2VkLCBSZXZlcnNpYmxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKFJldlJldkJsb2NrZWQoKSwgUmV2ZXJzaWJsZSkpCisKKyAgICBkZWYgdGVzdF9Db2xsZWN0aW9uKHNlbGYpOgorICAgICAgICAjIENoZWNrIHNvbWUgbm9uLWNvbGxlY3Rpb25zCisgICAgICAgIG5vbl9jb2xsZWN0aW9ucyA9IFtOb25lLCA0MiwgMy4xNCwgMWosIGxhbWJkYSB4OiAyKnhdCisgICAgICAgIGZvciB4IGluIG5vbl9jb2xsZWN0aW9uczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZSh4LCBDb2xsZWN0aW9uKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIENvbGxlY3Rpb24pLCByZXByKHR5cGUoeCkpKQorICAgICAgICAjIENoZWNrIHNvbWUgbm9uLWNvbGxlY3Rpb24gaXRlcmFibGVzCisgICAgICAgIG5vbl9jb2xfaXRlcmFibGVzID0gW190ZXN0X2dlbigpLCBpdGVyKGInJyksIGl0ZXIoYnl0ZWFycmF5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeCBmb3IgeCBpbiBbXSksIGRpY3QoKS52YWx1ZXMoKV0KKyAgICAgICAgZm9yIHggaW4gbm9uX2NvbF9pdGVyYWJsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoeCwgQ29sbGVjdGlvbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyh0eXBlKHgpLCBDb2xsZWN0aW9uKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgIyBDaGVjayBzb21lIGNvbGxlY3Rpb25zCisgICAgICAgIHNhbXBsZXMgPSBbc2V0KCksIGZyb3plbnNldCgpLCBkaWN0KCksIGJ5dGVzKCksIHN0cigpLCB0dXBsZSgpLAorICAgICAgICAgICAgICAgICAgIGxpc3QoKSwgZGljdCgpLmtleXMoKSwgZGljdCgpLml0ZW1zKCldCisgICAgICAgIGZvciB4IGluIHNhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgQ29sbGVjdGlvbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIENvbGxlY3Rpb24pLCByZXByKHR5cGUoeCkpKQorICAgICAgICAjIENoZWNrIGFsc28gTWFwcGluZywgTXV0YWJsZU1hcHBpbmcsIGV0Yy4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoU2VxdWVuY2UsIENvbGxlY3Rpb24pLCByZXByKFNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoTWFwcGluZywgQ29sbGVjdGlvbiksIHJlcHIoTWFwcGluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE11dGFibGVNYXBwaW5nLCBDb2xsZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIoTXV0YWJsZU1hcHBpbmcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhTZXQsIENvbGxlY3Rpb24pLCByZXByKFNldCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE11dGFibGVTZXQsIENvbGxlY3Rpb24pLCByZXByKE11dGFibGVTZXQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhTZXF1ZW5jZSwgQ29sbGVjdGlvbiksIHJlcHIoTXV0YWJsZVNldCkpCisgICAgICAgICMgQ2hlY2sgZGlyZWN0IHN1YmNsYXNzaW5nCisgICAgICAgIGNsYXNzIENvbChDb2xsZWN0aW9uKToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihsaXN0KCkpCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgY2xhc3MgRGVyQ29sKENvbCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0ZXIoQ29sKCkpKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhsaXN0LCBDb2wpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3Moc2V0LCBDb2wpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoZmxvYXQsIENvbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdGVyKERlckNvbCgpKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MobGlzdCwgRGVyQ29sKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHNldCwgRGVyQ29sKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGZsb2F0LCBEZXJDb2wpKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoQ29sbGVjdGlvbiwgJ19fbGVuX18nLCAnX19pdGVyX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fY29udGFpbnNfXycpCisgICAgICAgICMgQ2hlY2sgc2l6ZWQgY29udGFpbmVyIG5vbi1pdGVyYWJsZSAod2hpY2ggaXMgbm90IENvbGxlY3Rpb24pIGV0Yy4KKyAgICAgICAgY2xhc3MgQ29sTm9JdGVyOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiAwCisgICAgICAgICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOiByZXR1cm4gRmFsc2UKKyAgICAgICAgY2xhc3MgQ29sTm9TaXplOgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOiByZXR1cm4gaXRlcihbXSkKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6IHJldHVybiBGYWxzZQorICAgICAgICBjbGFzcyBDb2xOb0NvbnQ6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6IHJldHVybiBpdGVyKFtdKQorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiAwCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDb2xOb0l0ZXIsIENvbGxlY3Rpb24pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoQ29sTm9JdGVyKCksIENvbGxlY3Rpb24pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQ29sTm9TaXplLCBDb2xsZWN0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKENvbE5vU2l6ZSgpLCBDb2xsZWN0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKENvbE5vQ29udCwgQ29sbGVjdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShDb2xOb0NvbnQoKSwgQ29sbGVjdGlvbikpCisgICAgICAgICMgQ2hlY2sgTm9uZSBibG9ja2luZworICAgICAgICBjbGFzcyBTaXplQmxvY2s6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6IHJldHVybiBpdGVyKFtdKQorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmKTogcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBfX2xlbl9fID0gTm9uZQorICAgICAgICBjbGFzcyBJdGVyQmxvY2s6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIDAKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZik6IHJldHVybiBUcnVlCisgICAgICAgICAgICBfX2l0ZXJfXyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKFNpemVCbG9jaywgQ29sbGVjdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShTaXplQmxvY2soKSwgQ29sbGVjdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhJdGVyQmxvY2ssIENvbGxlY3Rpb24pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoSXRlckJsb2NrKCksIENvbGxlY3Rpb24pKQorICAgICAgICAjIENoZWNrIE5vbmUgYmxvY2tpbmcgaW4gc3ViY2xhc3MKKyAgICAgICAgY2xhc3MgQ29sSW1wbDoKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihsaXN0KCkpCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgY2xhc3MgTm9uQ29sKENvbEltcGwpOgorICAgICAgICAgICAgX19jb250YWluc19fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoTm9uQ29sLCBDb2xsZWN0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKE5vbkNvbCgpLCBDb2xsZWN0aW9uKSkKKwogCiAgICAgZGVmIHRlc3RfSXRlcmF0b3Ioc2VsZik6CiAgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxaiwgYiIiLCAiIiwgKCksIFtdLCB7fSwgc2V0KCldCkBAIC02OTksNyArODY5LDcgQEAKICAgICAgICAgICAgICAgICAgICBpdGVyKHNldCgpKSwgaXRlcihmcm96ZW5zZXQoKSksCiAgICAgICAgICAgICAgICAgICAgaXRlcihkaWN0KCkua2V5cygpKSwgaXRlcihkaWN0KCkuaXRlbXMoKSksCiAgICAgICAgICAgICAgICAgICAgaXRlcihkaWN0KCkudmFsdWVzKCkpLAotICAgICAgICAgICAgICAgICAgIChsYW1iZGE6ICh5aWVsZCkpKCksCisgICAgICAgICAgICAgICAgICAgX3Rlc3RfZ2VuKCksCiAgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKQEAgLTc4Nyw3ICs5NTcsNyBAQAogCiAgICAgZGVmIHRlc3RfU2l6ZWQoc2VsZik6CiAgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxaiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYTogKHlpZWxkKSkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX3Rlc3RfZ2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICh4IGZvciB4IGluIFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKQEAgLTgwNSw3ICs5NzUsNyBAQAogCiAgICAgZGVmIHRlc3RfQ29udGFpbmVyKHNlbGYpOgogICAgICAgICBub25fc2FtcGxlcyA9IFtOb25lLCA0MiwgMy4xNCwgMWosCi0gICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGE6ICh5aWVsZCkpKCksCisgICAgICAgICAgICAgICAgICAgICAgIF90ZXN0X2dlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAoeCBmb3IgeCBpbiBbXSksCiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6CkBAIC04MjQsNyArOTk0LDcgQEAKICAgICBkZWYgdGVzdF9DYWxsYWJsZShzZWxmKToKICAgICAgICAgbm9uX3NhbXBsZXMgPSBbTm9uZSwgNDIsIDMuMTQsIDFqLAogICAgICAgICAgICAgICAgICAgICAgICAiIiwgYiIiLCAoKSwgW10sIHt9LCBzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYTogKHlpZWxkKSkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX3Rlc3RfZ2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICh4IGZvciB4IGluIFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKQEAgLTg0MiwxNCArMTAxMiwxNCBAQAogICAgICAgICBzZWxmLnZhbGlkYXRlX2lzaW5zdGFuY2UoQ2FsbGFibGUsICdfX2NhbGxfXycpCiAKICAgICBkZWYgdGVzdF9kaXJlY3Rfc3ViY2xhc3Npbmcoc2VsZik6Ci0gICAgICAgIGZvciBCIGluIEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlOgorICAgICAgICBmb3IgQiBpbiBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBSZXZlcnNpYmxlLCBTaXplZCwgQ29udGFpbmVyLCBDYWxsYWJsZToKICAgICAgICAgICAgIGNsYXNzIEMoQik6CiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgQikpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoaW50LCBDKSkKIAogICAgIGRlZiB0ZXN0X3JlZ2lzdHJhdGlvbihzZWxmKToKLSAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CisgICAgICAgIGZvciBCIGluIEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIFJldmVyc2libGUsIFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlOgogICAgICAgICAgICAgY2xhc3MgQzoKICAgICAgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgICMgTWFrZSBzdXJlIGl0IGlzbid0IGhhc2hhYmxlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCBCKSwgQi5fX25hbWVfXykKQEAgLTEwNDksNiArMTIxOSwyNiBAQAogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG5jcyA+IGNzKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobmNzID49IGNzKQogCisgICAgZGVmIHRlc3RfaXNzdWUyNjkxNShzZWxmKToKKyAgICAgICAgIyBDb250YWluZXIgbWVtYmVyc2hpcCB0ZXN0IHNob3VsZCBjaGVjayBpZGVudGl0eSBmaXJzdAorICAgICAgICBjbGFzcyBDdXN0b21FcXVhbE9iamVjdDoKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBjbGFzcyBDdXN0b21TZXF1ZW5jZShsaXN0KToKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBTZXF1ZW5jZS5fX2NvbnRhaW5zX18oc2VsZiwgdmFsdWUpCisKKyAgICAgICAgbmFuID0gZmxvYXQoJ25hbicpCisgICAgICAgIG9iaiA9IEN1c3RvbUVxdWFsT2JqZWN0KCkKKyAgICAgICAgY29udGFpbmVycyA9IFsKKyAgICAgICAgICAgIEN1c3RvbVNlcXVlbmNlKFtuYW4sIG9ial0pLAorICAgICAgICAgICAgSXRlbXNWaWV3KHsxOiBuYW4sIDI6IG9ian0pLAorICAgICAgICAgICAgVmFsdWVzVmlldyh7MTogbmFuLCAyOiBvYmp9KQorICAgICAgICBdCisgICAgICAgIGZvciBjb250YWluZXIgaW4gY29udGFpbmVyczoKKyAgICAgICAgICAgIGZvciBlbGVtIGluIGNvbnRhaW5lcjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVsZW0sIGNvbnRhaW5lcikKKwogICAgIGRlZiBhc3NlcnRTYW1lU2V0KHNlbGYsIHMxLCBzMik6CiAgICAgICAgICMgY29lcmNlIGJvdGggdG8gYSByZWFsIHNldCB0aGVuIGNoZWNrIGVxdWFsaXR5CiAgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoc2V0KHMxKSwgc2V0KHMyKSkKQEAgLTEyMTksNiArMTQwOSw3IEBACiAgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIoKCkpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfY29tcGFyaXNvbihNeU1hcHBpbmcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXZlcnNlZCwgTXlNYXBwaW5nKCkpCiAKICAgICBkZWYgdGVzdF9NdXRhYmxlTWFwcGluZyhzZWxmKToKICAgICAgICAgZm9yIHNhbXBsZSBpbiBbZGljdF06CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKaW5kZXggODI0ZTg0My4uNDA5ZWM4NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQpAQCAtNDczLDEwICs0NzMsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7MTogMiwgMzogNH0pCiAKICAgICBkZWYgdGVzdF9jb21waWxlX2ZpbGVuYW1lKHNlbGYpOgotICAgICAgICBmb3IgZmlsZW5hbWUgaW4gKCdmaWxlLnB5JywgYidmaWxlLnB5JywKLSAgICAgICAgICAgICAgICAgICAgICAgICBieXRlYXJyYXkoYidmaWxlLnB5JyksIG1lbW9yeXZpZXcoYidmaWxlLnB5JykpOgorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gJ2ZpbGUucHknLCBiJ2ZpbGUucHknOgogICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoJ3Bhc3MnLCBmaWxlbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlLmNvX2ZpbGVuYW1lLCAnZmlsZS5weScpCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBieXRlYXJyYXkoYidmaWxlLnB5JyksIG1lbW9yeXZpZXcoYidmaWxlLnB5Jyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgICAgICBjb2RlID0gY29tcGlsZSgncGFzcycsIGZpbGVuYW1lLCAnZXhlYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGUuY29fZmlsZW5hbWUsICdmaWxlLnB5JykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21waWxlLCAncGFzcycsIGxpc3QoYidmaWxlLnB5JyksICdleGVjJykKIAogICAgIEBzdXBwb3J0LmNweXRob25fb25seQpAQCAtNjYxLDYgKzY2NCwxNiBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUoZjEoMCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmMigwLjApKQogCisgICAgZGVmIHRlc3RfcGF0aF9saWtlX29iamVjdHMoc2VsZik6CisgICAgICAgICMgQW4gaW1wbGljaXQgdGVzdCBmb3IgUHlVbmljb2RlX0ZTRGVjb2RlcigpLgorICAgICAgICBjbGFzcyBQYXRoTGlrZToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKKyAgICAgICAgICAgICAgICBzZWxmLl9wYXRoID0gcGF0aAorICAgICAgICAgICAgZGVmIF9fZnNwYXRoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhdGgKKworICAgICAgICBjb21waWxlKCI0MiIsIFBhdGhMaWtlKCJ0ZXN0X2NvbXBpbGVfcGF0aGxpa2UiKSwgInNpbmdsZSIpCisKIAogY2xhc3MgVGVzdFN0YWNrU2l6ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIyBUaGVzZSB0ZXN0cyBjaGVjayB0aGF0IHRoZSBjb21wdXRlZCBzdGFjayBzaXplIGZvciBhIGNvZGUgb2JqZWN0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkKaW5kZXggMmNlOGE2MS4uOWI0MjRhNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weQpAQCAtMSw2ICsxLDcgQEAKIGltcG9ydCBzeXMKIGltcG9ydCBjb21waWxlYWxsCiBpbXBvcnQgaW1wb3J0bGliLnV0aWwKK2ltcG9ydCB0ZXN0LnRlc3RfaW1wb3J0bGliLnV0aWwKIGltcG9ydCBvcwogaW1wb3J0IHBhdGhsaWIKIGltcG9ydCBweV9jb21waWxlCkBAIC00MCw2ICs0MSwxMSBAQAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLmRpcmVjdG9yeSkKIAorICAgIGRlZiBhZGRfYmFkX3NvdXJjZV9maWxlKHNlbGYpOgorICAgICAgICBzZWxmLmJhZF9zb3VyY2VfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmRpcmVjdG9yeSwgJ190ZXN0X2JhZC5weScpCisgICAgICAgIHdpdGggb3BlbihzZWxmLmJhZF9zb3VyY2VfcGF0aCwgJ3cnKSBhcyBmaWxlOgorICAgICAgICAgICAgZmlsZS53cml0ZSgneCAoXG4nKQorCiAgICAgZGVmIGRhdGEoc2VsZik6CiAgICAgICAgIHdpdGggb3BlbihzZWxmLmJjX3BhdGgsICdyYicpIGFzIGZpbGU6CiAgICAgICAgICAgICBkYXRhID0gZmlsZS5yZWFkKDgpCkBAIC03OCwxNSArODQsNDMgQEAKICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZm4pCiAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICBjb21waWxlYWxsLmNvbXBpbGVfZmlsZShzZWxmLnNvdXJjZV9wYXRoLCBmb3JjZT1GYWxzZSwgcXVpZXQ9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbXBpbGVhbGwuY29tcGlsZV9maWxlKHNlbGYuc291cmNlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1GYWxzZSwgcXVpZXQ9VHJ1ZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgbm90IG9zLnBhdGguaXNmaWxlKHNlbGYuYmNfcGF0aDIpKQogICAgICAgICBvcy51bmxpbmsoc2VsZi5iY19wYXRoKQotICAgICAgICBjb21waWxlYWxsLmNvbXBpbGVfZGlyKHNlbGYuZGlyZWN0b3J5LCBmb3JjZT1GYWxzZSwgcXVpZXQ9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbXBpbGVhbGwuY29tcGlsZV9kaXIoc2VsZi5kaXJlY3RvcnksIGZvcmNlPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWlldD1UcnVlKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKHNlbGYuYmNfcGF0aCkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgyKSkKICAgICAgICAgb3MudW5saW5rKHNlbGYuYmNfcGF0aCkKICAgICAgICAgb3MudW5saW5rKHNlbGYuYmNfcGF0aDIpCisgICAgICAgICMgVGVzdCBhZ2FpbnN0IGJhZCBmaWxlcworICAgICAgICBzZWxmLmFkZF9iYWRfc291cmNlX2ZpbGUoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNvbXBpbGVhbGwuY29tcGlsZV9maWxlKHNlbGYuYmFkX3NvdXJjZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPUZhbHNlLCBxdWlldD0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjb21waWxlYWxsLmNvbXBpbGVfZGlyKHNlbGYuZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9RmFsc2UsIHF1aWV0PTIpKQorCisgICAgZGVmIHRlc3RfY29tcGlsZV9wYXRoKHNlbGYpOgorICAgICAgICAjIEV4Y2x1ZGUgTGliL3Rlc3QvIHdoaWNoIGNvbnRhaW5zIGludmFsaWQgUHl0aG9uIGZpbGVzIGxpa2UKKyAgICAgICAgIyBMaWIvdGVzdC9iYWRzeW50YXhfcGVwMzEyMC5weQorICAgICAgICB0ZXN0ZGlyID0gb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorICAgICAgICBpZiB0ZXN0ZGlyIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNldGF0dHIsIHN5cywgJ3BhdGgnLCBzeXMucGF0aCkKKworICAgICAgICAgICAgc3lzLnBhdGggPSBsaXN0KHN5cy5wYXRoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5cy5wYXRoLnJlbW92ZSh0ZXN0ZGlyKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21waWxlYWxsLmNvbXBpbGVfcGF0aChxdWlldD0yKSkKKworICAgICAgICB3aXRoIHRlc3QudGVzdF9pbXBvcnRsaWIudXRpbC5pbXBvcnRfc3RhdGUocGF0aD1bc2VsZi5kaXJlY3RvcnldKToKKyAgICAgICAgICAgIHNlbGYuYWRkX2JhZF9zb3VyY2VfZmlsZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNvbXBpbGVhbGwuY29tcGlsZV9wYXRoKHNraXBfY3VyZGlyPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1UcnVlLCBxdWlldD0yKSkKIAogICAgIGRlZiB0ZXN0X25vX3B5Y2FjaGVfaW5fbm9uX3BhY2thZ2Uoc2VsZik6CiAgICAgICAgICMgQnVnIDg1NjMgcmVwb3J0ZWQgdGhhdCBfX3B5Y2FjaGVfXyBkaXJlY3RvcmllcyBnb3QgY3JlYXRlZCBieQpAQCAtMTk3LDEwICsyMzEsOSBAQAogICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ25vdCBhbGwgZW50cmllcyBvbiBzeXMucGF0aCBhcmUgd3JpdGFibGUnKQogCiAgICAgZGVmIF9nZXRfcnVuX2FyZ3Moc2VsZiwgYXJncyk6Ci0gICAgICAgIGludGVycF9hcmdzID0gWyctUyddCi0gICAgICAgIGlmIHN5cy5mbGFncy5vcHRpbWl6ZToKLSAgICAgICAgICAgIGludGVycF9hcmdzLmFwcGVuZCh7MSA6ICctTycsIDIgOiAnLU9PJ31bc3lzLmZsYWdzLm9wdGltaXplXSkKLSAgICAgICAgcmV0dXJuIGludGVycF9hcmdzICsgWyctbScsICdjb21waWxlYWxsJ10gKyBsaXN0KGFyZ3MpCisgICAgICAgIHJldHVybiBbKnN1cHBvcnQub3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCksCisgICAgICAgICAgICAgICAgJy1TJywgJy1tJywgJ2NvbXBpbGVhbGwnLAorICAgICAgICAgICAgICAgICphcmdzXQogCiAgICAgZGVmIGFzc2VydFJ1bk9LKHNlbGYsICphcmdzLCAqKmVudl92YXJzKToKICAgICAgICAgcmMsIG91dCwgZXJyID0gc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX29rKApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb25jdXJyZW50X2Z1dHVyZXMucHkgYi9MaWIvdGVzdC90ZXN0X2NvbmN1cnJlbnRfZnV0dXJlcy5weQppbmRleCA3NTEzODE1Li4yM2U5NWIyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbmN1cnJlbnRfZnV0dXJlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbmN1cnJlbnRfZnV0dXJlcy5weQpAQCAtMTU0LDYgKzE1NCwzMCBAQAogICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgogICAgICAgICAgICAgdC5qb2luKCkKIAorICAgIGRlZiB0ZXN0X3RocmVhZF9uYW1lc19hc3NpZ25lZChzZWxmKToKKyAgICAgICAgZXhlY3V0b3IgPSBmdXR1cmVzLlRocmVhZFBvb2xFeGVjdXRvcigKKyAgICAgICAgICAgIG1heF93b3JrZXJzPTUsIHRocmVhZF9uYW1lX3ByZWZpeD0nU3BlY2lhbFBvb2wnKQorICAgICAgICBleGVjdXRvci5tYXAoYWJzLCByYW5nZSgtNSwgNSkpCisgICAgICAgIHRocmVhZHMgPSBleGVjdXRvci5fdGhyZWFkcworICAgICAgICBkZWwgZXhlY3V0b3IKKworICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSZWdleCh0Lm5hbWUsIHInXlNwZWNpYWxQb29sX1swLTRdJCcpCisgICAgICAgICAgICB0LmpvaW4oKQorCisgICAgZGVmIHRlc3RfdGhyZWFkX25hbWVzX2RlZmF1bHQoc2VsZik6CisgICAgICAgIGV4ZWN1dG9yID0gZnV0dXJlcy5UaHJlYWRQb29sRXhlY3V0b3IobWF4X3dvcmtlcnM9NSkKKyAgICAgICAgZXhlY3V0b3IubWFwKGFicywgcmFuZ2UoLTUsIDUpKQorICAgICAgICB0aHJlYWRzID0gZXhlY3V0b3IuX3RocmVhZHMKKyAgICAgICAgZGVsIGV4ZWN1dG9yCisKKyAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgICMgV2UgZG9uJ3QgcGFydGljdWxhcmx5IGNhcmUgd2hhdCB0aGUgZGVmYXVsdCBuYW1lIGlzLCBqdXN0IHRoYXQKKyAgICAgICAgICAgICMgaXQgaGFzIGEgZGVmYXVsdCBuYW1lIGltcGx5aW5nIHRoYXQgaXQgaXMgYSBUaHJlYWRQb29sRXhlY3V0b3IKKyAgICAgICAgICAgICMgZm9sbG93ZWQgYnkgd2hhdCBsb29rcyBsaWtlIGEgdGhyZWFkIG51bWJlci4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgodC5uYW1lLCByJ14uKlRocmVhZFBvb2xFeGVjdXRvci4qX1swLTRdJCcpCisgICAgICAgICAgICB0LmpvaW4oKQorCiAKIGNsYXNzIFByb2Nlc3NQb29sU2h1dGRvd25UZXN0KFByb2Nlc3NQb29sTWl4aW4sIEV4ZWN1dG9yU2h1dGRvd25UZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIF9wcmltZV9leGVjdXRvcihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29uZmlncGFyc2VyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb25maWdwYXJzZXIucHkKaW5kZXggNzFhOGYzZi4uMmIwODE5OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb25maWdwYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb25maWdwYXJzZXIucHkKQEAgLTIwNTIsNSArMjA1MiwxMSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZmdbJ3R3byddLmdldGxlbignb25lJyksIDUpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsiRXJyb3IifQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBjb25maWdwYXJzZXIsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29udGFpbnMucHkgYi9MaWIvdGVzdC90ZXN0X2NvbnRhaW5zLnB5CmluZGV4IDNjNmJkZWYuLjAzNmExZDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29udGFpbnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb250YWlucy5weQpAQCAtODQsNiArODQsMzEgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb250YWluZXIgPT0gY29uc3RydWN0b3IodmFsdWVzKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb250YWluZXIgPT0gY29udGFpbmVyKQogCisgICAgZGVmIHRlc3RfYmxvY2tfZmFsbGJhY2soc2VsZik6CisgICAgICAgICMgYmxvY2tpbmcgZmFsbGJhY2sgd2l0aCBfX2NvbnRhaW5zX18gPSBOb25lCisgICAgICAgIGNsYXNzIEJ5Q29udGFpbnMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBjID0gQnlDb250YWlucygpCisgICAgICAgIGNsYXNzIEJsb2NrQ29udGFpbnMoQnlDb250YWlucyk6CisgICAgICAgICAgICAiIiJJcyBub3QgYSBjb250YWluZXIKKworICAgICAgICAgICAgVGhpcyBjbGFzcyBpcyBhIHBlcmZlY3RseSBnb29kIGl0ZXJhYmxlIChhcyB0ZXN0ZWQgYnkKKyAgICAgICAgICAgIGxpc3QoYmMpKSwgYXMgd2VsbCBhcyBpbmhlcml0aW5nIGZyb20gYSBwZXJmZWN0bHkgZ29vZAorICAgICAgICAgICAgY29udGFpbmVyLCBidXQgX19jb250YWluc19fID0gTm9uZSBwcmV2ZW50cyB0aGUgdXN1YWwKKyAgICAgICAgICAgIGZhbGxiYWNrIHRvIGl0ZXJhdGlvbiBpbiB0aGUgY29udGFpbmVyIHByb3RvY29sLiBUaGF0CisgICAgICAgICAgICBpcywgbm9ybWFsbHksIDAgaW4gYmMgd291bGQgZmFsbCBiYWNrIHRvIHRoZSBlcXVpdmFsZW50CisgICAgICAgICAgICBvZiBhbnkoeD09MCBmb3IgeCBpbiBiYyksIGJ1dCBoZXJlIGl0J3MgYmxvY2tlZCBmcm9tCisgICAgICAgICAgICBkb2luZyBzby4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHdoaWxlIEZhbHNlOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBOb25lCisgICAgICAgICAgICBfX2NvbnRhaW5zX18gPSBOb25lCisgICAgICAgIGJjID0gQmxvY2tDb250YWlucygpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoMCBpbiBjKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDAgaW4gbGlzdChiYykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAwIGluIGJjKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5IGIvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CmluZGV4IDUxNjQwM2UuLmMwNGM4MDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKQEAgLTEyLDYgKzEyLDM5IEBACiAgICAgdGhyZWFkaW5nID0gTm9uZQogCiAKK2NsYXNzIFRlc3RBYnN0cmFjdENvbnRleHRNYW5hZ2VyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2VudGVyKHNlbGYpOgorICAgICAgICBjbGFzcyBEZWZhdWx0RW50ZXIoQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHN1cGVyKCkuX19leGl0X18oKmFyZ3MpCisKKyAgICAgICAgbWFuYWdlciA9IERlZmF1bHRFbnRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobWFuYWdlci5fX2VudGVyX18oKSwgbWFuYWdlcikKKworICAgIGRlZiB0ZXN0X2V4aXRfaXNfYWJzdHJhY3Qoc2VsZik6CisgICAgICAgIGNsYXNzIE1pc3NpbmdFeGl0KEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIE1pc3NpbmdFeGl0KCkKKworICAgIGRlZiB0ZXN0X3N0cnVjdHVyYWxfc3ViY2xhc3Npbmcoc2VsZik6CisgICAgICAgIGNsYXNzIE1hbmFnZXJGcm9tU2NyYXRjaDoKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoTWFuYWdlckZyb21TY3JhdGNoLCBBYnN0cmFjdENvbnRleHRNYW5hZ2VyKSkKKworICAgICAgICBjbGFzcyBEZWZhdWx0RW50ZXIoQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHN1cGVyKCkuX19leGl0X18oKmFyZ3MpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoRGVmYXVsdEVudGVyLCBBYnN0cmFjdENvbnRleHRNYW5hZ2VyKSkKKworCiBjbGFzcyBDb250ZXh0TWFuYWdlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2NvbnRleHRtYW5hZ2VyX3BsYWluKHNlbGYpOgpAQCAtODksNyArMTIyLDcgQEAKICAgICAgICAgZGVmIHdvb2hvbygpOgogICAgICAgICAgICAgeWllbGQKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdG9wSXRlcmF0aW9uIik6CiAgICAgICAgICAgICAgICAgd2l0aCB3b29ob28oKToKICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc3RvcF9leGMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29weS5weSBiL0xpYi90ZXN0L3Rlc3RfY29weS5weQppbmRleCAwZTFmNjcwLi40NWE2OTIwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvcHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb3B5LnB5CkBAIC05OCw3ICs5OCw3IEBACiAgICAgICAgIHRlc3RzID0gW05vbmUsIC4uLiwgTm90SW1wbGVtZW50ZWQsCiAgICAgICAgICAgICAgICAgIDQyLCAyKioxMDAsIDMuMTQsIFRydWUsIEZhbHNlLCAxaiwKICAgICAgICAgICAgICAgICAgImhlbGxvIiwgImhlbGxvXHUxMjM0IiwgZi5fX2NvZGVfXywKLSAgICAgICAgICAgICAgICAgYiJ3b3JsZCIsIGJ5dGVzKHJhbmdlKDI1NikpLCByYW5nZSgxMCksCisgICAgICAgICAgICAgICAgIGIid29ybGQiLCBieXRlcyhyYW5nZSgyNTYpKSwgcmFuZ2UoMTApLCBzbGljZSgxLCAxMCwgMiksCiAgICAgICAgICAgICAgICAgIE5ld1N0eWxlLCBDbGFzc2ljLCBtYXgsIFdpdGhNZXRhY2xhc3NdCiAgICAgICAgIGZvciB4IGluIHRlc3RzOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjb3B5LmNvcHkoeCksIHgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Nvcm91dGluZXMucHkgYi9MaWIvdGVzdC90ZXN0X2Nvcm91dGluZXMucHkKaW5kZXggZTUyNjU0Yy4uMTU0Y2U3ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb3JvdXRpbmVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29yb3V0aW5lcy5weQpAQCAtNjksNTUgKzY5LDEzMCBAQAogY2xhc3MgQXN5bmNCYWRTeW50YXhUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2JhZHN5bnRheF8xKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3ludGF4RXJyb3IsICInYXdhaXQnIG91dHNpZGUiKToKLSAgICAgICAgICAgIGltcG9ydCB0ZXN0LmJhZHN5bnRheF9hc3luYzEKLQotICAgIGRlZiB0ZXN0X2JhZHN5bnRheF8yKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3ludGF4RXJyb3IsICInYXdhaXQnIG91dHNpZGUiKToKLSAgICAgICAgICAgIGltcG9ydCB0ZXN0LmJhZHN5bnRheF9hc3luYzIKLQotICAgIGRlZiB0ZXN0X2JhZHN5bnRheF8zKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3ludGF4RXJyb3IsICdpbnZhbGlkIHN5bnRheCcpOgotICAgICAgICAgICAgaW1wb3J0IHRlc3QuYmFkc3ludGF4X2FzeW5jMwotCi0gICAgZGVmIHRlc3RfYmFkc3ludGF4XzQoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4Jyk6Ci0gICAgICAgICAgICBpbXBvcnQgdGVzdC5iYWRzeW50YXhfYXN5bmM0Ci0KLSAgICBkZWYgdGVzdF9iYWRzeW50YXhfNShzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFN5bnRheEVycm9yLCAnaW52YWxpZCBzeW50YXgnKToKLSAgICAgICAgICAgIGltcG9ydCB0ZXN0LmJhZHN5bnRheF9hc3luYzUKLQotICAgIGRlZiB0ZXN0X2JhZHN5bnRheF82KHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCi0gICAgICAgICAgICBTeW50YXhFcnJvciwgIid5aWVsZCcgaW5zaWRlIGFzeW5jIGZ1bmN0aW9uIik6Ci0KLSAgICAgICAgICAgIGltcG9ydCB0ZXN0LmJhZHN5bnRheF9hc3luYzYKLQotICAgIGRlZiB0ZXN0X2JhZHN5bnRheF83KHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCi0gICAgICAgICAgICBTeW50YXhFcnJvciwgIid5aWVsZCBmcm9tJyBpbnNpZGUgYXN5bmMgZnVuY3Rpb24iKToKLQotICAgICAgICAgICAgaW1wb3J0IHRlc3QuYmFkc3ludGF4X2FzeW5jNwotCi0gICAgZGVmIHRlc3RfYmFkc3ludGF4Xzgoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4Jyk6Ci0gICAgICAgICAgICBpbXBvcnQgdGVzdC5iYWRzeW50YXhfYXN5bmM4Ci0KLSAgICBkZWYgdGVzdF9iYWRzeW50YXhfOShzZWxmKToKLSAgICAgICAgbnMgPSB7fQotICAgICAgICBmb3IgY29tcCBpbiB7Jyhhd2FpdCBhIGZvciBhIGluIGIpJywKLSAgICAgICAgICAgICAgICAgICAgICdbYXdhaXQgYSBmb3IgYSBpbiBiXScsCi0gICAgICAgICAgICAgICAgICAgICAne2F3YWl0IGEgZm9yIGEgaW4gYn0nLAotICAgICAgICAgICAgICAgICAgICAgJ3thd2FpdCBhOiBjIGZvciBhIGluIGJ9J306Ci0KLSAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeW50YXhFcnJvciwgJ2F3YWl0LippbiBjb21wcmVoZW4nKToKLSAgICAgICAgICAgICAgICBleGVjKCdhc3luYyBkZWYgZigpOlxuXHR7fScuZm9ybWF0KGNvbXApLCBucywgbnMpCi0KLSAgICBkZWYgdGVzdF9iYWRzeW50YXhfMTAoc2VsZik6Ci0gICAgICAgICMgVGVzdHMgZm9yIGlzc3VlIDI0NjE5Ci0KICAgICAgICAgc2FtcGxlcyA9IFsKKyAgICAgICAgICAgICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICBhd2FpdCBzb21ldGhpbmcoKQorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiIiJhd2FpdCBzb21ldGhpbmcoKSIiIiwKKworICAgICAgICAgICAgIiIiYXN5bmMgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gW10KKyAgICAgICAgICAgICIiIiwKKworICAgICAgICAgICAgIiIiYXN5bmMgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0IGZ1dAorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiIiJhc3luYyBkZWYgZm9vKGE9YXdhaXQgc29tZXRoaW5nKCkpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIiwKKworICAgICAgICAgICAgIiIiYXN5bmMgZGVmIGZvbyhhOmF3YWl0IHNvbWV0aGluZygpKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIsCisKKyAgICAgICAgICAgICIiImFzeW5jIGRlZiBmb28oKToKKyAgICAgICAgICAgICAgICBkZWYgYmFyKCk6CisgICAgICAgICAgICAgICAgIFtpIGFzeW5jIGZvciBpIGluIGVsc10KKyAgICAgICAgICAgICIiIiwKKworICAgICAgICAgICAgIiIiYXN5bmMgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIGRlZiBiYXIoKToKKyAgICAgICAgICAgICAgICAgW2F3YWl0IGkgZm9yIGkgaW4gZWxzXQorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiIiJhc3luYyBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgZGVmIGJhcigpOgorICAgICAgICAgICAgICAgICBbaSBmb3IgaSBpbiBlbHMKKyAgICAgICAgICAgICAgICAgICAgYXN5bmMgZm9yIGIgaW4gZWxzXQorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiIiJhc3luYyBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgZGVmIGJhcigpOgorICAgICAgICAgICAgICAgICBbaSBmb3IgaSBpbiBlbHMKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gYgorICAgICAgICAgICAgICAgICAgICBhc3luYyBmb3IgYiBpbiBlbHNdCisgICAgICAgICAgICAiIiIsCisKKyAgICAgICAgICAgICIiImFzeW5jIGRlZiBmb28oKToKKyAgICAgICAgICAgICAgICBkZWYgYmFyKCk6CisgICAgICAgICAgICAgICAgIFtpIGZvciBpIGluIGVscworICAgICAgICAgICAgICAgICAgICBhc3luYyBmb3IgYiBpbiBlbHMKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gYl0KKyAgICAgICAgICAgICIiIiwKKworICAgICAgICAgICAgIiIiYXN5bmMgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIGRlZiBiYXIoKToKKyAgICAgICAgICAgICAgICAgW2kgZm9yIGkgaW4gZWxzCisgICAgICAgICAgICAgICAgICAgIGZvciBiIGluIGF3YWl0IGVsc10KKyAgICAgICAgICAgICIiIiwKKworICAgICAgICAgICAgIiIiYXN5bmMgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIGRlZiBiYXIoKToKKyAgICAgICAgICAgICAgICAgW2kgZm9yIGkgaW4gZWxzCisgICAgICAgICAgICAgICAgICAgIGZvciBiIGluIGVscworICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXdhaXQgYl0KKyAgICAgICAgICAgICIiIiwKKworICAgICAgICAgICAgIiIiYXN5bmMgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIGRlZiBiYXIoKToKKyAgICAgICAgICAgICAgICAgW2kgZm9yIGkgaW4gYXdhaXQgZWxzXQorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiIiJhc3luYyBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgZGVmIGJhcigpOgorICAgICAgICAgICAgICAgICBbaSBmb3IgaSBpbiBlbHMgaWYgYXdhaXQgaV0KKyAgICAgICAgICAgICIiIiwKKworICAgICAgICAgICAgIiIiZGVmIGJhcigpOgorICAgICAgICAgICAgICAgICBbaSBhc3luYyBmb3IgaSBpbiBlbHNdCisgICAgICAgICAgICAiIiIsCisKKyAgICAgICAgICAgICIiImRlZiBiYXIoKToKKyAgICAgICAgICAgICAgICAgW2F3YWl0IGkgZm9yIGkgaW4gZWxzXQorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiIiJkZWYgYmFyKCk6CisgICAgICAgICAgICAgICAgIFtpIGZvciBpIGluIGVscworICAgICAgICAgICAgICAgICAgICBhc3luYyBmb3IgYiBpbiBlbHNdCisgICAgICAgICAgICAiIiIsCisKKyAgICAgICAgICAgICIiImRlZiBiYXIoKToKKyAgICAgICAgICAgICAgICAgW2kgZm9yIGkgaW4gZWxzCisgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIGIKKyAgICAgICAgICAgICAgICAgICAgYXN5bmMgZm9yIGIgaW4gZWxzXQorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiIiJkZWYgYmFyKCk6CisgICAgICAgICAgICAgICAgIFtpIGZvciBpIGluIGVscworICAgICAgICAgICAgICAgICAgICBhc3luYyBmb3IgYiBpbiBlbHMKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gYl0KKyAgICAgICAgICAgICIiIiwKKworICAgICAgICAgICAgIiIiZGVmIGJhcigpOgorICAgICAgICAgICAgICAgICBbaSBmb3IgaSBpbiBlbHMKKyAgICAgICAgICAgICAgICAgICAgZm9yIGIgaW4gYXdhaXQgZWxzXQorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiIiJkZWYgYmFyKCk6CisgICAgICAgICAgICAgICAgIFtpIGZvciBpIGluIGVscworICAgICAgICAgICAgICAgICAgICBmb3IgYiBpbiBlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGF3YWl0IGJdCisgICAgICAgICAgICAiIiIsCisKKyAgICAgICAgICAgICIiImRlZiBiYXIoKToKKyAgICAgICAgICAgICAgICAgW2kgZm9yIGkgaW4gYXdhaXQgZWxzXQorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiIiJkZWYgYmFyKCk6CisgICAgICAgICAgICAgICAgIFtpIGZvciBpIGluIGVscyBpZiBhd2FpdCBpXQorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiIiJhc3luYyBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICIiIiwKKwogICAgICAgICAgICAgIiIiYXN5bmMgZGVmIGZvbygpOgogICAgICAgICAgICAgICAgICAgIGRlZiBiYXIoKTogcGFzcwogICAgICAgICAgICAgICAgICAgIGF3YWl0ID0gMQpAQCAtODkxLDcgKzk2Niw3IEBACiAgICAgICAgICAgICByZXR1cm4gYXdhaXQgQXdhaXRhYmxlKCkKIAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCi0gICAgICAgICAgICBUeXBlRXJyb3IsICJfX2F3YWl0X19cKFwpIHJldHVybmVkIGEgY29yb3V0aW5lIik6CisgICAgICAgICAgICBUeXBlRXJyb3IsIHIiX19hd2FpdF9fXChcKSByZXR1cm5lZCBhIGNvcm91dGluZSIpOgogCiAgICAgICAgICAgICBydW5fYXN5bmMoZm9vKCkpCiAKQEAgLTEzMzMsNyArMTQwOCw3IEBACiAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAogICAgICAgICAgICAgICAgIFR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAiYXN5bmMgZm9yJyByZWNlaXZlZCBhbiBpbnZhbGlkIG9iamVjdC4qX19haXRlci4qXDogSSIpOgorICAgICAgICAgICAgICAgIHIiYXN5bmMgZm9yJyByZWNlaXZlZCBhbiBpbnZhbGlkIG9iamVjdC4qX19haXRlci4qXDogSSIpOgogCiAgICAgICAgICAgICBydW5fYXN5bmMoZm9vKCkpCiAKQEAgLTE1MzcsNiArMTYxMiwxODUgQEAKICAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImVycm9yIikKICAgICAgICAgICAgICAgICBydW5fYXN5bmMoZm9vKCkpCiAKKyAgICBkZWYgdGVzdF9jb21wXzEoc2VsZik6CisgICAgICAgIGFzeW5jIGRlZiBmKGkpOgorICAgICAgICAgICAgcmV0dXJuIGkKKworICAgICAgICBhc3luYyBkZWYgcnVuX2xpc3QoKToKKyAgICAgICAgICAgIHJldHVybiBbYXdhaXQgYyBmb3IgYyBpbiBbZigxKSwgZig0MSldXQorCisgICAgICAgIGFzeW5jIGRlZiBydW5fc2V0KCk6CisgICAgICAgICAgICByZXR1cm4ge2F3YWl0IGMgZm9yIGMgaW4gW2YoMSksIGYoNDEpXX0KKworICAgICAgICBhc3luYyBkZWYgcnVuX2RpY3QxKCk6CisgICAgICAgICAgICByZXR1cm4ge2F3YWl0IGM6ICdhJyBmb3IgYyBpbiBbZigxKSwgZig0MSldfQorCisgICAgICAgIGFzeW5jIGRlZiBydW5fZGljdDIoKToKKyAgICAgICAgICAgIHJldHVybiB7aTogYXdhaXQgYyBmb3IgaSwgYyBpbiBlbnVtZXJhdGUoW2YoMSksIGYoNDEpXSl9CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW5fYXN5bmMocnVuX2xpc3QoKSksIChbXSwgWzEsIDQxXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuX2FzeW5jKHJ1bl9zZXQoKSksIChbXSwgezEsIDQxfSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuX2FzeW5jKHJ1bl9kaWN0MSgpKSwgKFtdLCB7MTogJ2EnLCA0MTogJ2EnfSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuX2FzeW5jKHJ1bl9kaWN0MigpKSwgKFtdLCB7MDogMSwgMTogNDF9KSkKKworICAgIGRlZiB0ZXN0X2NvbXBfMihzZWxmKToKKyAgICAgICAgYXN5bmMgZGVmIGYoaSk6CisgICAgICAgICAgICByZXR1cm4gaQorCisgICAgICAgIGFzeW5jIGRlZiBydW5fbGlzdCgpOgorICAgICAgICAgICAgcmV0dXJuIFtzIGZvciBjIGluIFtmKCcnKSwgZignYWJjJyksIGYoJycpLCBmKFsnZGUnLCAnZmcnXSldCisgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIGF3YWl0IGNdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHJ1bl9hc3luYyhydW5fbGlzdCgpKSwKKyAgICAgICAgICAgIChbXSwgWydhJywgJ2InLCAnYycsICdkZScsICdmZyddKSkKKworICAgICAgICBhc3luYyBkZWYgcnVuX3NldCgpOgorICAgICAgICAgICAgcmV0dXJuIHtkCisgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIFtmKFtmKFsxMCwgMzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYoWzIwXSldKV0KKyAgICAgICAgICAgICAgICAgICAgZm9yIHMgaW4gYXdhaXQgYworICAgICAgICAgICAgICAgICAgICBmb3IgZCBpbiBhd2FpdCBzfQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBydW5fYXN5bmMocnVuX3NldCgpKSwKKyAgICAgICAgICAgIChbXSwgezEwLCAyMCwgMzB9KSkKKworICAgICAgICBhc3luYyBkZWYgcnVuX3NldDIoKToKKyAgICAgICAgICAgIHJldHVybiB7YXdhaXQgcworICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBbZihbZigxMCksIGYoMjApXSldCisgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIGF3YWl0IGN9CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHJ1bl9hc3luYyhydW5fc2V0MigpKSwKKyAgICAgICAgICAgIChbXSwgezEwLCAyMH0pKQorCisgICAgZGVmIHRlc3RfY29tcF8zKHNlbGYpOgorICAgICAgICBhc3luYyBkZWYgZihpdCk6CisgICAgICAgICAgICBmb3IgaSBpbiBpdDoKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bl9saXN0KCk6CisgICAgICAgICAgICByZXR1cm4gW2kgKyAxIGFzeW5jIGZvciBpIGluIGYoWzEwLCAyMF0pXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcnVuX2FzeW5jKHJ1bl9saXN0KCkpLAorICAgICAgICAgICAgKFtdLCBbMTEsIDIxXSkpCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bl9zZXQoKToKKyAgICAgICAgICAgIHJldHVybiB7aSArIDEgYXN5bmMgZm9yIGkgaW4gZihbMTAsIDIwXSl9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBydW5fYXN5bmMocnVuX3NldCgpKSwKKyAgICAgICAgICAgIChbXSwgezExLCAyMX0pKQorCisgICAgICAgIGFzeW5jIGRlZiBydW5fZGljdCgpOgorICAgICAgICAgICAgcmV0dXJuIHtpICsgMTogaSArIDIgYXN5bmMgZm9yIGkgaW4gZihbMTAsIDIwXSl9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBydW5fYXN5bmMocnVuX2RpY3QoKSksCisgICAgICAgICAgICAoW10sIHsxMTogMTIsIDIxOiAyMn0pKQorCisgICAgICAgIGFzeW5jIGRlZiBydW5fZ2VuKCk6CisgICAgICAgICAgICBnZW4gPSAoaSArIDEgYXN5bmMgZm9yIGkgaW4gZihbMTAsIDIwXSkpCisgICAgICAgICAgICByZXR1cm4gW2cgKyAxMDAgYXN5bmMgZm9yIGcgaW4gZ2VuXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcnVuX2FzeW5jKHJ1bl9nZW4oKSksCisgICAgICAgICAgICAoW10sIFsxMTEsIDEyMV0pKQorCisgICAgZGVmIHRlc3RfY29tcF80KHNlbGYpOgorICAgICAgICBhc3luYyBkZWYgZihpdCk6CisgICAgICAgICAgICBmb3IgaSBpbiBpdDoKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bl9saXN0KCk6CisgICAgICAgICAgICByZXR1cm4gW2kgKyAxIGFzeW5jIGZvciBpIGluIGYoWzEwLCAyMF0pIGlmIGkgPiAxMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHJ1bl9hc3luYyhydW5fbGlzdCgpKSwKKyAgICAgICAgICAgIChbXSwgWzIxXSkpCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bl9zZXQoKToKKyAgICAgICAgICAgIHJldHVybiB7aSArIDEgYXN5bmMgZm9yIGkgaW4gZihbMTAsIDIwXSkgaWYgaSA+IDEwfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcnVuX2FzeW5jKHJ1bl9zZXQoKSksCisgICAgICAgICAgICAoW10sIHsyMX0pKQorCisgICAgICAgIGFzeW5jIGRlZiBydW5fZGljdCgpOgorICAgICAgICAgICAgcmV0dXJuIHtpICsgMTogaSArIDIgYXN5bmMgZm9yIGkgaW4gZihbMTAsIDIwXSkgaWYgaSA+IDEwfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcnVuX2FzeW5jKHJ1bl9kaWN0KCkpLAorICAgICAgICAgICAgKFtdLCB7MjE6IDIyfSkpCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bl9nZW4oKToKKyAgICAgICAgICAgIGdlbiA9IChpICsgMSBhc3luYyBmb3IgaSBpbiBmKFsxMCwgMjBdKSBpZiBpID4gMTApCisgICAgICAgICAgICByZXR1cm4gW2cgKyAxMDAgYXN5bmMgZm9yIGcgaW4gZ2VuXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcnVuX2FzeW5jKHJ1bl9nZW4oKSksCisgICAgICAgICAgICAoW10sIFsxMjFdKSkKKworICAgIGRlZiB0ZXN0X2NvbXBfNShzZWxmKToKKyAgICAgICAgYXN5bmMgZGVmIGYoaXQpOgorICAgICAgICAgICAgZm9yIGkgaW4gaXQ6CisgICAgICAgICAgICAgICAgeWllbGQgaQorCisgICAgICAgIGFzeW5jIGRlZiBydW5fbGlzdCgpOgorICAgICAgICAgICAgcmV0dXJuIFtpICsgMSBmb3IgcGFpciBpbiAoWzEwLCAyMF0sIFszMCwgNDBdKSBpZiBwYWlyWzBdID4gMTAKKyAgICAgICAgICAgICAgICAgICAgYXN5bmMgZm9yIGkgaW4gZihwYWlyKSBpZiBpID4gMzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBydW5fYXN5bmMocnVuX2xpc3QoKSksCisgICAgICAgICAgICAoW10sIFs0MV0pKQorCisgICAgZGVmIHRlc3RfY29tcF82KHNlbGYpOgorICAgICAgICBhc3luYyBkZWYgZihpdCk6CisgICAgICAgICAgICBmb3IgaSBpbiBpdDoKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bl9saXN0KCk6CisgICAgICAgICAgICByZXR1cm4gW2kgKyAxIGFzeW5jIGZvciBzZXEgaW4gZihbKDEwLCAyMCksICgzMCwpXSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gc2VxXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBydW5fYXN5bmMocnVuX2xpc3QoKSksCisgICAgICAgICAgICAoW10sIFsxMSwgMjEsIDMxXSkpCisKKyAgICBkZWYgdGVzdF9jb21wXzcoc2VsZik6CisgICAgICAgIGFzeW5jIGRlZiBmKCk6CisgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgICAgICB5aWVsZCAyCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ2FhYScpCisKKyAgICAgICAgYXN5bmMgZGVmIHJ1bl9saXN0KCk6CisgICAgICAgICAgICByZXR1cm4gW2kgYXN5bmMgZm9yIGkgaW4gZigpXQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChFeGNlcHRpb24sICdhYWEnKToKKyAgICAgICAgICAgIHJ1bl9hc3luYyhydW5fbGlzdCgpKQorCisgICAgZGVmIHRlc3RfY29tcF84KHNlbGYpOgorICAgICAgICBhc3luYyBkZWYgZigpOgorICAgICAgICAgICAgcmV0dXJuIFtpIGZvciBpIGluIFsxLCAyLCAzXV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcnVuX2FzeW5jKGYoKSksCisgICAgICAgICAgICAoW10sIFsxLCAyLCAzXSkpCisKKyAgICBkZWYgdGVzdF9jb21wXzkoc2VsZik6CisgICAgICAgIGFzeW5jIGRlZiBnZW4oKToKKyAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgICAgIHlpZWxkIDIKKyAgICAgICAgYXN5bmMgZGVmIGYoKToKKyAgICAgICAgICAgIGwgPSBbaSBhc3luYyBmb3IgaSBpbiBnZW4oKV0KKyAgICAgICAgICAgIHJldHVybiBbaSBmb3IgaSBpbiBsXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBydW5fYXN5bmMoZigpKSwKKyAgICAgICAgICAgIChbXSwgWzEsIDJdKSkKKworICAgIGRlZiB0ZXN0X2NvbXBfMTAoc2VsZik6CisgICAgICAgIGFzeW5jIGRlZiBmKCk6CisgICAgICAgICAgICB4eCA9IHtpIGZvciBpIGluIFsxLCAyLCAzXX0KKyAgICAgICAgICAgIHJldHVybiB7eDogeCBmb3IgeCBpbiB4eH0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcnVuX2FzeW5jKGYoKSksCisgICAgICAgICAgICAoW10sIHsxOiAxLCAyOiAyLCAzOiAzfSkpCisKICAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgogICAgICAgICBhc3luYyBkZWYgZnVuYygpOiBwYXNzCiAgICAgICAgIGNvcm8gPSBmdW5jKCkKQEAgLTE2NjcsOCArMTkyMSw4IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdpdGggc2lsZW5jZV9jb3JvX2djKCksIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCiAgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAotICAgICAgICAgICAgICAgICJjb3JvdXRpbmUgd3JhcHBlci4qXC53cmFwcGVyIGF0IDB4LiphdHRlbXB0ZWQgdG8gIgotICAgICAgICAgICAgICAgICJyZWN1cnNpdmVseSB3cmFwIC4qIHdyYXAgLioiKToKKyAgICAgICAgICAgICAgICByImNvcm91dGluZSB3cmFwcGVyLipcLndyYXBwZXIgYXQgMHguKmF0dGVtcHRlZCB0byAiCisgICAgICAgICAgICAgICAgciJyZWN1cnNpdmVseSB3cmFwIC4qIHdyYXAgLioiKToKIAogICAgICAgICAgICAgICAgIGZvbygpCiAgICAgICAgIGZpbmFsbHk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Nwcm9maWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9jcHJvZmlsZS5weQppbmRleCBmMTg5ODNmLi41M2Y4OTE3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Nwcm9maWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY3Byb2ZpbGUucHkKQEAgLTYsNyArNiw3IEBACiAjIHJpcCBvZmYgYWxsIGludGVyZXN0aW5nIHN0dWZmIGZyb20gdGVzdF9wcm9maWxlCiBpbXBvcnQgY1Byb2ZpbGUKIGZyb20gdGVzdC50ZXN0X3Byb2ZpbGUgaW1wb3J0IFByb2ZpbGVUZXN0LCByZWdlbmVyYXRlX2V4cGVjdGVkX291dHB1dAotZnJvbSB0ZXN0LnByb2ZpbGVlIGltcG9ydCB0ZXN0ZnVuYworCiAKIGNsYXNzIENQcm9maWxlVGVzdChQcm9maWxlVGVzdCk6CiAgICAgcHJvZmlsZXJjbGFzcyA9IGNQcm9maWxlLlByb2ZpbGUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY3N2LnB5IGIvTGliL3Rlc3QvdGVzdF9jc3YucHkKaW5kZXggNzdjMzE1ZS4uN2RjZWE5YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jc3YucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jc3YucHkKQEAgLTIsOSArMiw3IEBACiAjIGNzdiBwYWNrYWdlIHVuaXQgdGVzdHMKIAogaW1wb3J0IGNvcHkKLWltcG9ydCBpbwogaW1wb3J0IHN5cwotaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHRlbXBmaWxlIGltcG9ydCBUZW1wb3JhcnlGaWxlCkBAIC0xMiw2ICsxMCw5IEBACiBpbXBvcnQgZ2MKIGltcG9ydCBwaWNrbGUKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorZnJvbSBpdGVydG9vbHMgaW1wb3J0IHBlcm11dGF0aW9ucworZnJvbSB0ZXh0d3JhcCBpbXBvcnQgZGVkZW50Citmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAogCiBjbGFzcyBUZXN0X0Nzdih1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiCkBAIC00MjYsMTcgKzQyNywxNiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWFkZXIsIFtdLCBxdW90aW5nID0gLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIHF1b3RpbmcgPSAxMDApCiAKLSAgICAjIFNlZSBpc3N1ZSAjMjI5OTUKLSAgICAjIyBkZWYgdGVzdF9jb3B5KHNlbGYpOgotICAgICMjICAgICBmb3IgbmFtZSBpbiBjc3YubGlzdF9kaWFsZWN0cygpOgotICAgICMjICAgICAgICAgZGlhbGVjdCA9IGNzdi5nZXRfZGlhbGVjdChuYW1lKQotICAgICMjICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb3B5LmNvcHksIGRpYWxlY3QpCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gY3N2Lmxpc3RfZGlhbGVjdHMoKToKKyAgICAgICAgICAgIGRpYWxlY3QgPSBjc3YuZ2V0X2RpYWxlY3QobmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29weS5jb3B5LCBkaWFsZWN0KQogCi0gICAgIyMgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgotICAgICMjICAgICBmb3IgbmFtZSBpbiBjc3YubGlzdF9kaWFsZWN0cygpOgotICAgICMjICAgICAgICAgZGlhbGVjdCA9IGNzdi5nZXRfZGlhbGVjdChuYW1lKQotICAgICMjICAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6Ci0gICAgIyMgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwaWNrbGUuZHVtcHMsIGRpYWxlY3QsIHByb3RvKQorICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gY3N2Lmxpc3RfZGlhbGVjdHMoKToKKyAgICAgICAgICAgIGRpYWxlY3QgPSBjc3YuZ2V0X2RpYWxlY3QobmFtZSkKKyAgICAgICAgICAgIGZvciBwcm90byBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcGlja2xlLmR1bXBzLCBkaWFsZWN0LCBwcm90bykKIAogY2xhc3MgVGVzdENzdkJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiByZWFkZXJBc3NlcnRFcXVhbChzZWxmLCBpbnB1dCwgZXhwZWN0ZWRfcmVzdWx0KToKQEAgLTEwODAsNyArMTA4MCw2IEBACiAgICAgICAgICAgICAgIkZyYW7Dp29pcyBQaW5hcmQiXQogCiAgICAgZGVmIHRlc3RfdW5pY29kZV9yZWFkKHNlbGYpOgotICAgICAgICBpbXBvcnQgaW8KICAgICAgICAgd2l0aCBUZW1wb3JhcnlGaWxlKCJ3KyIsIG5ld2xpbmU9JycsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGZpbGVvYmo6CiAgICAgICAgICAgICBmaWxlb2JqLndyaXRlKCIsIi5qb2luKHNlbGYubmFtZXMpICsgIlxyXG4iKQogICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCkBAIC0xMDg5LDcgKzEwODgsNiBAQAogCiAKICAgICBkZWYgdGVzdF91bmljb2RlX3dyaXRlKHNlbGYpOgotICAgICAgICBpbXBvcnQgaW8KICAgICAgICAgd2l0aCBUZW1wb3JhcnlGaWxlKCJ3KyIsIG5ld2xpbmU9JycsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGZpbGVvYmo6CiAgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmopCiAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coc2VsZi5uYW1lcykKQEAgLTEwOTcsNiArMTA5NSw2MyBAQAogICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkKIAorY2xhc3MgS2V5T3JkZXJpbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X29yZGVyaW5nX2Zvcl90aGVfZGljdF9yZWFkZXJfYW5kX3dyaXRlcihzZWxmKToKKyAgICAgICAgcmVzdWx0c2V0ID0gc2V0KCkKKyAgICAgICAgZm9yIGtleXMgaW4gcGVybXV0YXRpb25zKCJhYmNkZSIpOgorICAgICAgICAgICAgd2l0aCBUZW1wb3JhcnlGaWxlKCd3KycsIG5ld2xpbmU9JycsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGZpbGVvYmplY3Q6CisgICAgICAgICAgICAgICAgZHcgPSBjc3YuRGljdFdyaXRlcihmaWxlb2JqZWN0LCBrZXlzKQorICAgICAgICAgICAgICAgIGR3LndyaXRlaGVhZGVyKCkKKyAgICAgICAgICAgICAgICBmaWxlb2JqZWN0LnNlZWsoMCkKKyAgICAgICAgICAgICAgICBkciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmplY3QpCisgICAgICAgICAgICAgICAga3QgPSB0dXBsZShkci5maWVsZG5hbWVzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5cywga3QpCisgICAgICAgICAgICAgICAgcmVzdWx0c2V0LmFkZChrdCkKKyAgICAgICAgIyBGaW5hbCBzYW5pdHkgY2hlY2s6IHdlcmUgYWxsIHBlcm11dGF0aW9ucyB1bmlxdWU/CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdHNldCksIDEyMCwgIktleSBvcmRlcmluZzogc29tZSBrZXkgcGVybXV0YXRpb25zIG5vdCBjb2xsZWN0ZWQgKGV4cGVjdGVkIDEyMCkiKQorCisgICAgZGVmIHRlc3Rfb3JkZXJlZF9kaWN0X3JlYWRlcihzZWxmKToKKyAgICAgICAgZGF0YSA9IGRlZGVudCgnJydcCisgICAgICAgICAgICBGaXJzdE5hbWUsTGFzdE5hbWUKKyAgICAgICAgICAgIEVyaWMsSWRsZQorICAgICAgICAgICAgR3JhaGFtLENoYXBtYW4sT3ZlcjEsT3ZlcjIKKworICAgICAgICAgICAgVW5kZXIxCisgICAgICAgICAgICBKb2huLENsZWVzZQorICAgICAgICAnJycpLnNwbGl0bGluZXMoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjc3YuRGljdFJlYWRlcihkYXRhKSksCisgICAgICAgICAgICBbT3JkZXJlZERpY3QoWygnRmlyc3ROYW1lJywgJ0VyaWMnKSwgKCdMYXN0TmFtZScsICdJZGxlJyldKSwKKyAgICAgICAgICAgICBPcmRlcmVkRGljdChbKCdGaXJzdE5hbWUnLCAnR3JhaGFtJyksICgnTGFzdE5hbWUnLCAnQ2hhcG1hbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgWydPdmVyMScsICdPdmVyMiddKV0pLAorICAgICAgICAgICAgIE9yZGVyZWREaWN0KFsoJ0ZpcnN0TmFtZScsICdVbmRlcjEnKSwgKCdMYXN0TmFtZScsIE5vbmUpXSksCisgICAgICAgICAgICAgT3JkZXJlZERpY3QoWygnRmlyc3ROYW1lJywgJ0pvaG4nKSwgKCdMYXN0TmFtZScsICdDbGVlc2UnKV0pLAorICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY3N2LkRpY3RSZWFkZXIoZGF0YSwgcmVzdGtleT0nT3RoZXJJbmZvJykpLAorICAgICAgICAgICAgW09yZGVyZWREaWN0KFsoJ0ZpcnN0TmFtZScsICdFcmljJyksICgnTGFzdE5hbWUnLCAnSWRsZScpXSksCisgICAgICAgICAgICAgT3JkZXJlZERpY3QoWygnRmlyc3ROYW1lJywgJ0dyYWhhbScpLCAoJ0xhc3ROYW1lJywgJ0NoYXBtYW4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdPdGhlckluZm8nLCBbJ092ZXIxJywgJ092ZXIyJ10pXSksCisgICAgICAgICAgICAgT3JkZXJlZERpY3QoWygnRmlyc3ROYW1lJywgJ1VuZGVyMScpLCAoJ0xhc3ROYW1lJywgTm9uZSldKSwKKyAgICAgICAgICAgICBPcmRlcmVkRGljdChbKCdGaXJzdE5hbWUnLCAnSm9obicpLCAoJ0xhc3ROYW1lJywgJ0NsZWVzZScpXSksCisgICAgICAgICAgICBdKQorCisgICAgICAgIGRlbCBkYXRhWzBdICAgICAgICAgICAgIyBSZW1vdmUgdGhlIGhlYWRlciByb3cKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNzdi5EaWN0UmVhZGVyKGRhdGEsIGZpZWxkbmFtZXM9WydmbmFtZScsICdsbmFtZSddKSksCisgICAgICAgICAgICBbT3JkZXJlZERpY3QoWygnZm5hbWUnLCAnRXJpYycpLCAoJ2xuYW1lJywgJ0lkbGUnKV0pLAorICAgICAgICAgICAgIE9yZGVyZWREaWN0KFsoJ2ZuYW1lJywgJ0dyYWhhbScpLCAoJ2xuYW1lJywgJ0NoYXBtYW4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsIFsnT3ZlcjEnLCAnT3ZlcjInXSldKSwKKyAgICAgICAgICAgICBPcmRlcmVkRGljdChbKCdmbmFtZScsICdVbmRlcjEnKSwgKCdsbmFtZScsIE5vbmUpXSksCisgICAgICAgICAgICAgT3JkZXJlZERpY3QoWygnZm5hbWUnLCAnSm9obicpLCAoJ2xuYW1lJywgJ0NsZWVzZScpXSksCisgICAgICAgICAgICBdKQorCisKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBleHRyYSA9IHsnX19kb2NfXycsICdfX3ZlcnNpb25fXyd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGNzdiwgKCdjc3YnLCAnX2NzdicpLCBleHRyYT1leHRyYSkKKwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKaW5kZXggMmQ0ZWI1Mi4uMjQyZTFiYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CkBAIC0yMyw5ICsyMywxNiBAQAogdGVzdF9jbGFzc2VzID0gW10KIAogZm9yIG1vZHVsZSwgc3VmZml4IGluIHppcCh0ZXN0X21vZHVsZXMsIHRlc3Rfc3VmZml4ZXMpOgorICAgIHRlc3RfY2xhc3NlcyA9IFtdCiAgICAgZm9yIG5hbWUsIGNscyBpbiBtb2R1bGUuX19kaWN0X18uaXRlbXMoKToKLSAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKGNscywgdHlwZSkgYW5kIGlzc3ViY2xhc3MoY2xzLCB1bml0dGVzdC5UZXN0Q2FzZSkpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjbHMsIHR5cGUpOgogICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgaXNzdWJjbGFzcyhjbHMsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHRlc3RfY2xhc3Nlcy5hcHBlbmQoY2xzKQorICAgICAgICBlbGlmIGlzc3ViY2xhc3MoY2xzLCB1bml0dGVzdC5UZXN0U3VpdGUpOgorICAgICAgICAgICAgc3VpdCA9IGNscygpCisgICAgICAgICAgICB0ZXN0X2NsYXNzZXMuZXh0ZW5kKHR5cGUodGVzdCkgZm9yIHRlc3QgaW4gc3VpdCkKKyAgICBmb3IgY2xzIGluIHRlc3RfY2xhc3NlczoKICAgICAgICAgY2xzLl9fbmFtZV9fID0gbmFtZSArIHN1ZmZpeAogICAgICAgICBAY2xhc3NtZXRob2QKICAgICAgICAgZGVmIHNldFVwQ2xhc3MoY2xzXywgbW9kdWxlPW1vZHVsZSk6CkBAIC0zOSw3ICs0Niw2IEBACiAgICAgICAgICAgICBzeXMubW9kdWxlcy51cGRhdGUoY2xzXy5fc2F2ZV9zeXNfbW9kdWxlcykKICAgICAgICAgY2xzLnNldFVwQ2xhc3MgPSBzZXRVcENsYXNzCiAgICAgICAgIGNscy50ZWFyRG93bkNsYXNzID0gdGVhckRvd25DbGFzcwotICAgICAgICB0ZXN0X2NsYXNzZXMuYXBwZW5kKGNscykKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYm0ucHkgYi9MaWIvdGVzdC90ZXN0X2RibS5weQppbmRleCA2MjNkOTkyLi5mMGE0MjhkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RibS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RibS5weQpAQCAtMSw2ICsxLDUgQEAKICIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgZGJtLm9wZW4gZnVuY3Rpb24gYmFzZWQgb24gdGVzdGR1bWJkYm0ucHkiIiIKIAotaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBnbG9iCiBpbXBvcnQgdGVzdC5zdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RibV9kdW1iLnB5IGIvTGliL3Rlc3QvdGVzdF9kYm1fZHVtYi5weQppbmRleCBmZjYzYzg4Li4yZDc3ZjA3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RibV9kdW1iLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGJtX2R1bWIucHkKQEAgLTYsNiArNiw3IEBACiBpbXBvcnQgb3BlcmF0b3IKIGltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKIGltcG9ydCBkYm0uZHVtYiBhcyBkdW1iZGJtCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCkBAIC03OCw2ICs3OSwxMiBAQAogICAgICAgICBzZWxmLmluaXRfZGIoKQogICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgJ3InKQogICAgICAgICBzZWxmLnJlYWRfaGVscGVyKGYpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBkYXRhYmFzZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcgb25seScpOgorICAgICAgICAgICAgZltiJ2cnXSA9IGIneCcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGRhdGFiYXNlIGlzIG9wZW5lZCBmb3IgcmVhZGluZyBvbmx5Jyk6CisgICAgICAgICAgICBkZWwgZltiJ2EnXQogICAgICAgICBmLmNsb3NlKCkKIAogICAgIGRlZiB0ZXN0X2R1bWJkYm1fa2V5cyhzZWxmKToKQEAgLTE0OCw3ICsxNTUsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kaWN0W2tleV0sIGZba2V5XSkKIAogICAgIGRlZiBpbml0X2RiKHNlbGYpOgotICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgJ3cnKQorICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgJ24nKQogICAgICAgICBmb3IgayBpbiBzZWxmLl9kaWN0OgogICAgICAgICAgICAgZltrXSA9IHNlbGYuX2RpY3Rba10KICAgICAgICAgZi5jbG9zZSgpCkBAIC0yMzQsNiArMjQxLDI0IEBACiAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LmdldHZhbHVlKCksICcnKQogCisgICAgZGVmIHRlc3Rfd2Fybl9vbl9pZ25vcmVkX2ZsYWdzKHNlbGYpOgorICAgICAgICBmb3IgdmFsdWUgaW4gKCdyJywgJ3cnKToKKyAgICAgICAgICAgIF9kZWxldGVfZmlsZXMoKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkYXRhYmFzZSBmaWxlIGlzIG1pc3NpbmcsIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VtYW50aWNzIG9mIHRoZSAnYycgZmxhZyB3aWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSB1c2VkLiIpOgorICAgICAgICAgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lLCB2YWx1ZSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9mbGFnKHNlbGYpOgorICAgICAgICBmb3IgZmxhZyBpbiAoJ3gnLCAncmYnLCBOb25lKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGbGFnIG11c3QgYmUgb25lIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIncicsICd3JywgJ2MnLCBvciAnbiciKToKKyAgICAgICAgICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgZmxhZykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBfZGVsZXRlX2ZpbGVzKCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYm1fZ251LnB5IGIvTGliL3Rlc3QvdGVzdF9kYm1fZ251LnB5CmluZGV4IGE3ODA4ZjUuLjMwNGIzMzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGJtX2dudS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RibV9nbnUucHkKQEAgLTIsNyArMiw3IEBACiBnZGJtID0gc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCJkYm0uZ251IikgI3NraXAgaWYgbm90IHN1cHBvcnRlZAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKLWZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBURVNURk4sIHVubGluaworZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgdW5saW5rCiAKIAogZmlsZW5hbWUgPSBURVNURk4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGJtX25kYm0ucHkgYi9MaWIvdGVzdC90ZXN0X2RibV9uZGJtLnB5CmluZGV4IDIyOTE1NjEuLjQ5ZjQ0MjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGJtX25kYm0ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kYm1fbmRibS5weQpAQCAtMSw4ICsxLDYgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCJkYm0ubmRibSIpICNza2lwIGlmIG5vdCBzdXBwb3J0ZWQKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IG9zCi1pbXBvcnQgcmFuZG9tCiBpbXBvcnQgZGJtLm5kYm0KIGZyb20gZGJtLm5kYm0gaW1wb3J0IGVycm9yCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weSBiL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQppbmRleCAxYWEwYmY4Li43NDkyZjU0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CkBAIC0yMDQ3LDYgKzIwNDcsMzkgQEAKICAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoMCwgMiwgNywgMSksICdGJykgKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDEsICgwLCksICdGJykpCiAKKyAgICBkZWYgdGVzdF9hc19pbnRlZ2VyX3JhdGlvKHNlbGYpOgorICAgICAgICBEZWNpbWFsID0gc2VsZi5kZWNpbWFsLkRlY2ltYWwKKworICAgICAgICAjIGV4Y2VwdGlvbmFsIGNhc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbywgRGVjaW1hbCgnaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbywgRGVjaW1hbCgnLWluZicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsLmFzX2ludGVnZXJfcmF0aW8sIERlY2ltYWwoJy1uYW4nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvLCBEZWNpbWFsKCdzbmFuMTIzJykpCisKKyAgICAgICAgZm9yIGV4cCBpbiByYW5nZSgtNCwgMik6CisgICAgICAgICAgICBmb3IgY29lZmYgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICAgICAgZm9yIHNpZ24gaW4gJysnLCAnLSc6CisgICAgICAgICAgICAgICAgICAgIGQgPSBEZWNpbWFsKCclcyVkRSVkJyAlIChzaWduLCBjb2VmZiwgZXhwKSkKKyAgICAgICAgICAgICAgICAgICAgcHEgPSBkLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAgICAgICAgICAgICBwLCBxID0gcHEKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHJldHVybiB0eXBlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwcSwgdHVwbGUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwLCBpbnQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShxLCBpbnQpCisKKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBub3JtYWxpemF0aW9uOiAgcSBzaG91bGQgYmUgcG9zaXRpdmU7CisgICAgICAgICAgICAgICAgICAgICMgcCBzaG91bGQgYmUgcmVsYXRpdmVseSBwcmltZSB0byBxLgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIocSwgMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmdjZChwLCBxKSwgMSkKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHRoYXQgcC9xIGFjdHVhbGx5IGdpdmVzIHRoZSBjb3JyZWN0IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbChwKSAvIERlY2ltYWwocSksIGQpCisKICAgICBkZWYgdGVzdF9zdWJjbGFzc2luZyhzZWxmKToKICAgICAgICAgIyBEaWZmZXJlbnQgYmVoYXZpb3VycyB3aGVuIHN1YmNsYXNzaW5nIERlY2ltYWwKICAgICAgICAgRGVjaW1hbCA9IHNlbGYuZGVjaW1hbC5EZWNpbWFsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQppbmRleCAxOGUxZGYwLi5jZTUxN2I1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKQEAgLTI4OSw3ICsyODksNyBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmluZGV4KGVsZW1lbnQsIHN0YXJ0LCBzdG9wKSwgdGFyZ2V0KQogCi0gICAgZGVmIHRlc3RfaW5zZXJ0X2J1Z18yNDkxMyhzZWxmKToKKyAgICBkZWYgdGVzdF9pbmRleF9idWdfMjQ5MTMoc2VsZik6CiAgICAgICAgIGQgPSBkZXF1ZSgnQScgKiAzKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgogICAgICAgICAgICAgaSA9IGQuaW5kZXgoIkhlbGxvIHdvcmxkIiwgMCwgNCkKQEAgLTYyMiwyMCArNjIyLDIyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKIAogICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKLSAgICAgICAgZCA9IGRlcXVlKHJhbmdlKDIwMCkpCi0gICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6Ci0gICAgICAgICAgICBzID0gcGlja2xlLmR1bXBzKGQsIGkpCi0gICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKyAgICAgICAgZm9yIGQgaW4gZGVxdWUocmFuZ2UoMjAwKSksIGRlcXVlKHJhbmdlKDIwMCksIDEwMCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgICAgIHMgPSBwaWNrbGUuZHVtcHMoZCwgaSkKKyAgICAgICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChlKSwgaWQoZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGUpLCBsaXN0KGQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5tYXhsZW4sIGQubWF4bGVuKQogCi0jIyAgICBkZWYgdGVzdF9waWNrbGVfcmVjdXJzaXZlKHNlbGYpOgotIyMgICAgICAgIGQgPSBkZXF1ZSgnYWJjJykKLSMjICAgICAgICBkLmFwcGVuZChkKQotIyMgICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6Ci0jIyAgICAgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGQsIGkpKQotIyMgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKLSMjICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChlKSwgaWQoZVstMV0pKQorICAgIGRlZiB0ZXN0X3BpY2tsZV9yZWN1cnNpdmUoc2VsZik6CisgICAgICAgIGZvciBkIGluIGRlcXVlKCdhYmMnKSwgZGVxdWUoJ2FiYycsIDMpOgorICAgICAgICAgICAgZC5hcHBlbmQoZCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCwgaSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChlKSwgaWQoZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChlWy0xXSksIGlkKGUpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5tYXhsZW4sIGQubWF4bGVuKQogCiAgICAgZGVmIHRlc3RfaXRlcmF0b3JfcGlja2xlKHNlbGYpOgogICAgICAgICBvcmlnID0gZGVxdWUocmFuZ2UoMjAwKSkKQEAgLTY5Niw2ICs2OTgsMTUgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKIAorICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIGZvciBtYXhsZW4gaW4gcmFuZ2UoLTEsIDYpOgorICAgICAgICAgICAgICAgIHMgPSBbcmFuZG9tLnJhbmRvbSgpIGZvciBqIGluIHJhbmdlKGkpXQorICAgICAgICAgICAgICAgIGQgPSBkZXF1ZShzKSBpZiBtYXhsZW4gPT0gLTEgZWxzZSBkZXF1ZShzLCBtYXhsZW4pCisgICAgICAgICAgICAgICAgZSA9IGQuY29weSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5tYXhsZW4sIGUubWF4bGVuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGwoeCBpcyB5IGZvciB4LCB5IGluIHppcChkLCBlKSkpCisKICAgICBkZWYgdGVzdF9jb3B5X21ldGhvZChzZWxmKToKICAgICAgICAgbXV0ID0gWzEwXQogICAgICAgICBkID0gZGVxdWUoW211dF0pCkBAIC04NDUsMjQgKzg1NiwyNiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGQpLCB0eXBlKGUpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQogCi0jIyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6Ci0jIyAgICAgICAgZCA9IERlcXVlKCdhYmMnKQotIyMgICAgICAgIGQuYXBwZW5kKGQpCi0jIwotIyMgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGQpKQotIyMgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQotIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShkKSwgdHlwZShlKSkKLSMjICAgICAgICBkZCA9IGQucG9wKCkKLSMjICAgICAgICBlZSA9IGUucG9wKCkKLSMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUpLCBpZChlZSkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBlKQotIyMKLSMjICAgICAgICBkLnggPSBkCi0jIyAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChlKSwgaWQoZS54KSkKLSMjCi0jIyAgICAgICAgZCA9IERlcXVlV2l0aEJhZEl0ZXIoJ2FiYycpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwaWNrbGUuZHVtcHMsIGQpCisgICAgZGVmIHRlc3RfcGlja2xlX3JlY3Vyc2l2ZShzZWxmKToKKyAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBmb3IgZCBpbiBEZXF1ZSgnYWJjJyksIERlcXVlKCdhYmMnLCAzKToKKyAgICAgICAgICAgICAgICBkLmFwcGVuZChkKQorCisgICAgICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCwgcHJvdG8pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZSksIGlkKGQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShlKSwgdHlwZShkKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUubWF4bGVuLCBkLm1heGxlbikKKyAgICAgICAgICAgICAgICBkZCA9IGQucG9wKCkKKyAgICAgICAgICAgICAgICBlZSA9IGUucG9wKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGVlKSwgaWQoZSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLCBkKQorCisgICAgICAgICAgICAgICAgZC54ID0gZAorICAgICAgICAgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGQsIHByb3RvKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUueCksIGlkKGUpKQorCisgICAgICAgICAgICBmb3IgZCBpbiBEZXF1ZVdpdGhCYWRJdGVyKCdhYmMnKSwgRGVxdWVXaXRoQmFkSXRlcignYWJjJywgMik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwaWNrbGUuZHVtcHMsIGQsIHByb3RvKQogCiAgICAgZGVmIHRlc3Rfd2Vha3JlZihzZWxmKToKICAgICAgICAgZCA9IGRlcXVlKCdnYWxsYWhhZCcpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQppbmRleCA0MThmOGQyLi4xZTA4ZWQ5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKQEAgLTQ3MzgsMTEgKzQ3MzgsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAoYXJncywga3dhcmdzKQogICAgICAgICBvYmogPSBDMygpCiAgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6Ci0gICAgICAgICAgICBpZiBwcm90byA+PSA0OgorICAgICAgICAgICAgaWYgcHJvdG8gPj0gMjoKICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19yZWR1Y2UocHJvdG8sIG9iaiwgYXJncywga3dhcmdzKQotICAgICAgICAgICAgZWxpZiBwcm90byA+PSAyOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgIG9iai5fX3JlZHVjZV9leF9fKHByb3RvKQogCiAgICAgICAgIGNsYXNzIEM0OgogICAgICAgICAgICAgZGVmIF9fZ2V0bmV3YXJnc19leF9fKHNlbGYpOgpAQCAtNTA2MSwxMCArNTA1OCw2IEBACiAgICAgICAgICAgICAgICAga3dhcmdzID0gZ2V0YXR0cihjbHMsICdLV0FSR1MnLCB7fSkKICAgICAgICAgICAgICAgICBvYmogPSBjbHMoKmNscy5BUkdTLCAqKmt3YXJncykKICAgICAgICAgICAgICAgICBwcm90byA9IHBpY2tsZV9jb3BpZXIucHJvdG8KLSAgICAgICAgICAgICAgICBpZiAyIDw9IHByb3RvIDwgNCBhbmQgaGFzYXR0cihjbHMsICdfX2dldG5ld2FyZ3NfZXhfXycpOgotICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgotICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlX2NvcGllci5kdW1wcyhvYmosIHByb3RvKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIG9iamNvcHkgPSBwaWNrbGVfY29waWVyLmNvcHkob2JqKQogICAgICAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9pc19jb3B5KG9iaiwgb2JqY29weSkKICAgICAgICAgICAgICAgICAjIEZvciB0ZXN0IGNsYXNzZXMgdGhhdCBzdXBwb3J0cyB0aGlzLCBtYWtlIHN1cmUgd2UgZGlkbid0IGdvCkBAIC01MTIzLDEyICs1MTE2LDE0IEBACiAgICAgICAgIGEsIGIgPSBBKCksIEIoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRzaXplb2YodmFycyhhKSksIHN5cy5nZXRzaXplb2YodmFycyhiKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhzeXMuZ2V0c2l6ZW9mKHZhcnMoYSkpLCBzeXMuZ2V0c2l6ZW9mKHt9KSkKLSAgICAgICAgYS54LCBhLnksIGEueiwgYS53ID0gcmFuZ2UoNCkKKyAgICAgICAgIyBJbml0aWFsIGhhc2ggdGFibGUgY2FuIGNvbnRhaW4gYXQgbW9zdCA1IGVsZW1lbnRzLgorICAgICAgICAjIFNldCA2IGF0dHJpYnV0ZXMgdG8gY2F1c2UgaW50ZXJuYWwgcmVzaXppbmcuCisgICAgICAgIGEueCwgYS55LCBhLnosIGEudywgYS52LCBhLnUgPSByYW5nZSg2KQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHN5cy5nZXRzaXplb2YodmFycyhhKSksIHN5cy5nZXRzaXplb2YodmFycyhiKSkpCiAgICAgICAgIGEyID0gQSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHNpemVvZih2YXJzKGEpKSwgc3lzLmdldHNpemVvZih2YXJzKGEyKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhzeXMuZ2V0c2l6ZW9mKHZhcnMoYSkpLCBzeXMuZ2V0c2l6ZW9mKHt9KSkKLSAgICAgICAgYi51LCBiLnYsIGIudywgYi50ID0gcmFuZ2UoNCkKKyAgICAgICAgYi51LCBiLnYsIGIudywgYi50LCBiLnMsIGIuciA9IHJhbmdlKDYpCiAgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhzeXMuZ2V0c2l6ZW9mKHZhcnMoYikpLCBzeXMuZ2V0c2l6ZW9mKHt9KSkKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rlc2NydHV0LnB5IGIvTGliL3Rlc3QvdGVzdF9kZXNjcnR1dC5weQppbmRleCA1MDZkMWFiLi5iODRkNjQ0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rlc2NydHV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVzY3J0dXQucHkKQEAgLTE4Miw2ICsxODIsNyBAQAogICAgICAnX19pYWRkX18nLAogICAgICAnX19pbXVsX18nLAogICAgICAnX19pbml0X18nLAorICAgICAnX19pbml0X3N1YmNsYXNzX18nLAogICAgICAnX19pdGVyX18nLAogICAgICAnX19sZV9fJywKICAgICAgJ19fbGVuX18nLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXZwb2xsLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXZwb2xsLnB5CmluZGV4IDk1NTYxOGEuLmMxMzNjODEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGV2cG9sbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RldnBvbGwucHkKQEAgLTUsOSArNSw4IEBACiBpbXBvcnQgb3MKIGltcG9ydCByYW5kb20KIGltcG9ydCBzZWxlY3QKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0LCBjcHl0aG9uX29ubHkKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNweXRob25fb25seQogCiBpZiBub3QgaGFzYXR0cihzZWxlY3QsICdkZXZwb2xsJykgOgogICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCd0ZXN0IHdvcmtzIG9ubHkgb24gU29sYXJpcyBPUyBmYW1pbHknKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CmluZGV4IDZkNjhlNzYuLjZjNDcwNjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RpY3QucHkKQEAgLTEsMTAgKzEsMTIgQEAKLWltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Ci0KLWltcG9ydCBjb2xsZWN0aW9ucywgcmFuZG9tLCBzdHJpbmcKK2ltcG9ydCBjb2xsZWN0aW9ucwogaW1wb3J0IGNvbGxlY3Rpb25zLmFiYwotaW1wb3J0IGdjLCB3ZWFrcmVmCitpbXBvcnQgZ2MKIGltcG9ydCBwaWNrbGUKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdlYWtyZWYKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKIGNsYXNzIERpY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTk2OSw1ICs5NzEsNiBAQAogY2xhc3MgU3ViY2xhc3NNYXBwaW5nVGVzdHMobWFwcGluZ190ZXN0cy5CYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wpOgogICAgIHR5cGUydGVzdCA9IERpY3QKIAorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaWN0X3ZlcnNpb24ucHkgYi9MaWIvdGVzdC90ZXN0X2RpY3RfdmVyc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjcxZjlmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWN0X3ZlcnNpb24ucHkKQEAgLTAsMCArMSwxODYgQEAKKyIiIgorVGVzdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUEVQIDUwOTogZGljdGlvbmFyeSB2ZXJzaW9ubmluZy4KKyIiIgoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKKworIyBQRVAgNTA5IGlzIGltcGxlbWVudGVkIGluIENQeXRob24gYnV0IG90aGVyIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMKKyMgZG9uJ3QgcmVxdWlyZSB0byBpbXBsZW1lbnQgaXQKK190ZXN0Y2FwaSA9IHN1cHBvcnQuaW1wb3J0X21vZHVsZSgnX3Rlc3RjYXBpJykKKworCitjbGFzcyBEaWN0VmVyc2lvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICB0eXBlMnRlc3QgPSBkaWN0CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2Vlbl92ZXJzaW9ucyA9IHNldCgpCisgICAgICAgIHNlbGYuZGljdCA9IE5vbmUKKworICAgIGRlZiBjaGVja192ZXJzaW9uX3VuaXF1ZShzZWxmLCBteWRpY3QpOgorICAgICAgICB2ZXJzaW9uID0gX3Rlc3RjYXBpLmRpY3RfZ2V0X3ZlcnNpb24obXlkaWN0KQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHZlcnNpb24sIHNlbGYuc2Vlbl92ZXJzaW9ucykKKyAgICAgICAgc2VsZi5zZWVuX3ZlcnNpb25zLmFkZCh2ZXJzaW9uKQorCisgICAgZGVmIGNoZWNrX3ZlcnNpb25fY2hhbmdlZChzZWxmLCBteWRpY3QsIG1ldGhvZCwgKmFyZ3MsICoqa3cpOgorICAgICAgICByZXN1bHQgPSBtZXRob2QoKmFyZ3MsICoqa3cpCisgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl91bmlxdWUobXlkaWN0KQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgY2hlY2tfdmVyc2lvbl9kb250X2NoYW5nZShzZWxmLCBteWRpY3QsIG1ldGhvZCwgKmFyZ3MsICoqa3cpOgorICAgICAgICB2ZXJzaW9uMSA9IF90ZXN0Y2FwaS5kaWN0X2dldF92ZXJzaW9uKG15ZGljdCkKKyAgICAgICAgc2VsZi5zZWVuX3ZlcnNpb25zLmFkZCh2ZXJzaW9uMSkKKworICAgICAgICByZXN1bHQgPSBtZXRob2QoKmFyZ3MsICoqa3cpCisKKyAgICAgICAgdmVyc2lvbjIgPSBfdGVzdGNhcGkuZGljdF9nZXRfdmVyc2lvbihteWRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmVyc2lvbjIsIHZlcnNpb24xLCAidmVyc2lvbiBjaGFuZ2VkIikKKworICAgICAgICByZXR1cm4gIHJlc3VsdAorCisgICAgZGVmIG5ld19kaWN0KHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgZCA9IHNlbGYudHlwZTJ0ZXN0KCphcmdzLCAqKmt3KQorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fdW5pcXVlKGQpCisgICAgICAgIHJldHVybiBkCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgIyBuZXcgZW1wdHkgZGljdGlvbmFyaWVzIG11c3QgYWxsIGhhdmUgYW4gdW5pcXVlIHZlcnNpb24KKyAgICAgICAgZW1wdHkxID0gc2VsZi5uZXdfZGljdCgpCisgICAgICAgIGVtcHR5MiA9IHNlbGYubmV3X2RpY3QoKQorICAgICAgICBlbXB0eTMgPSBzZWxmLm5ld19kaWN0KCkKKworICAgICAgICAjIG5vbi1lbXB0eSBkaWN0aW9uYXJpZXMgbXVzdCBhbHNvIGhhdmUgYW4gdW5pcXVlIHZlcnNpb24KKyAgICAgICAgbm9uZW1wdHkxID0gc2VsZi5uZXdfZGljdCh4PSd4JykKKyAgICAgICAgbm9uZW1wdHkyID0gc2VsZi5uZXdfZGljdCh4PSd4JywgeT0neScpCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBkID0gc2VsZi5uZXdfZGljdChhPTEsIGI9MikKKworICAgICAgICBkMiA9IHNlbGYuY2hlY2tfdmVyc2lvbl9kb250X2NoYW5nZShkLCBkLmNvcHkpCisKKyAgICAgICAgIyBkaWN0LmNvcHkoKSBtdXN0IGNyZWF0ZSBhIGRpY3Rpb25hcnkgd2l0aCBhIG5ldyB1bmlxdWUgdmVyc2lvbgorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fdW5pcXVlKGQyKQorCisgICAgZGVmIHRlc3Rfc2V0aXRlbShzZWxmKToKKyAgICAgICAgZCA9IHNlbGYubmV3X2RpY3QoKQorCisgICAgICAgICMgY3JlYXRpbmcgbmV3IGtleXMgbXVzdCBjaGFuZ2UgdGhlIHZlcnNpb24KKyAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NoYW5nZWQoZCwgZC5fX3NldGl0ZW1fXywgJ3gnLCAneCcpCisgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jaGFuZ2VkKGQsIGQuX19zZXRpdGVtX18sICd5JywgJ3knKQorCisgICAgICAgICMgY2hhbmdpbmcgdmFsdWVzIG11c3QgY2hhbmdlIHRoZSB2ZXJzaW9uCisgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jaGFuZ2VkKGQsIGQuX19zZXRpdGVtX18sICd4JywgMSkKKyAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NoYW5nZWQoZCwgZC5fX3NldGl0ZW1fXywgJ3knLCAyKQorCisgICAgZGVmIHRlc3Rfc2V0aXRlbV9zYW1lX3ZhbHVlKHNlbGYpOgorICAgICAgICB2YWx1ZSA9IG9iamVjdCgpCisgICAgICAgIGQgPSBzZWxmLm5ld19kaWN0KCkKKworICAgICAgICAjIHNldHRpbmcgYSBrZXkgbXVzdCBjaGFuZ2UgdGhlIHZlcnNpb24KKyAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NoYW5nZWQoZCwgZC5fX3NldGl0ZW1fXywgJ2tleScsIHZhbHVlKQorCisgICAgICAgICMgc2V0dGluZyBhIGtleSB0byB0aGUgc2FtZSB2YWx1ZSB3aXRoIGRpY3QuX19zZXRpdGVtX18KKyAgICAgICAgIyBtdXN0IGNoYW5nZSB0aGUgdmVyc2lvbgorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY2hhbmdlZChkLCBkLl9fc2V0aXRlbV9fLCAna2V5JywgdmFsdWUpCisKKyAgICAgICAgIyBzZXR0aW5nIGEga2V5IHRvIHRoZSBzYW1lIHZhbHVlIHdpdGggZGljdC51cGRhdGUKKyAgICAgICAgIyBtdXN0IGNoYW5nZSB0aGUgdmVyc2lvbgorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY2hhbmdlZChkLCBkLnVwZGF0ZSwga2V5PXZhbHVlKQorCisgICAgICAgIGQyID0gc2VsZi5uZXdfZGljdChrZXk9dmFsdWUpCisgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jaGFuZ2VkKGQsIGQudXBkYXRlLCBkMikKKworICAgIGRlZiB0ZXN0X3NldGl0ZW1fZXF1YWwoc2VsZik6CisgICAgICAgIGNsYXNzIEFsd2F5c0VxdWFsOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICB2YWx1ZTEgPSBBbHdheXNFcXVhbCgpCisgICAgICAgIHZhbHVlMiA9IEFsd2F5c0VxdWFsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlMSA9PSB2YWx1ZTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodmFsdWUxICE9IHZhbHVlMikKKworICAgICAgICBkID0gc2VsZi5uZXdfZGljdCgpCisgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jaGFuZ2VkKGQsIGQuX19zZXRpdGVtX18sICdrZXknLCB2YWx1ZTEpCisKKyAgICAgICAgIyBzZXR0aW5nIGEga2V5IHRvIGEgdmFsdWUgZXF1YWwgdG8gdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgIyB3aXRoIGRpY3QuX19zZXRpdGVtX18oKSBtdXN0IGNoYW5nZSB0aGUgdmVyc2lvbgorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY2hhbmdlZChkLCBkLl9fc2V0aXRlbV9fLCAna2V5JywgdmFsdWUyKQorCisgICAgICAgICMgc2V0dGluZyBhIGtleSB0byBhIHZhbHVlIGVxdWFsIHRvIHRoZSBjdXJyZW50IHZhbHVlCisgICAgICAgICMgd2l0aCBkaWN0LnVwZGF0ZSgpIG11c3QgY2hhbmdlIHRoZSB2ZXJzaW9uCisgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jaGFuZ2VkKGQsIGQudXBkYXRlLCBrZXk9dmFsdWUxKQorCisgICAgICAgIGQyID0gc2VsZi5uZXdfZGljdChrZXk9dmFsdWUyKQorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY2hhbmdlZChkLCBkLnVwZGF0ZSwgZDIpCisKKyAgICBkZWYgdGVzdF9zZXRkZWZhdWx0KHNlbGYpOgorICAgICAgICBkID0gc2VsZi5uZXdfZGljdCgpCisKKyAgICAgICAgIyBzZXR0aW5nIGEga2V5IHdpdGggZGljdC5zZXRkZWZhdWx0KCkgbXVzdCBjaGFuZ2UgdGhlIHZlcnNpb24KKyAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NoYW5nZWQoZCwgZC5zZXRkZWZhdWx0LCAna2V5JywgJ3ZhbHVlMScpCisKKyAgICAgICAgIyBkb24ndCBjaGFuZ2UgdGhlIHZlcnNpb24gaWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0cworICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fZG9udF9jaGFuZ2UoZCwgZC5zZXRkZWZhdWx0LCAna2V5JywgJ3ZhbHVlMicpCisKKyAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5uZXdfZGljdChrZXk9J3ZhbHVlJykKKworICAgICAgICAjIGRlbGV0aW5nIGEga2V5IHdpdGggZGljdC5fX2RlbGl0ZW1fXygpIG11c3QgY2hhbmdlIHRoZSB2ZXJzaW9uCisgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jaGFuZ2VkKGQsIGQuX19kZWxpdGVtX18sICdrZXknKQorCisgICAgICAgICMgZG9uJ3QgY2hhbmdlIHRoZSB2ZXJzaW9uIGlmIHRoZSBrZXkgZG9lc24ndCBleGlzdAorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fZG9udF9jaGFuZ2UoZCwgc2VsZi5hc3NlcnRSYWlzZXMsIEtleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5fX2RlbGl0ZW1fXywgJ2tleScpCisKKyAgICBkZWYgdGVzdF9wb3Aoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLm5ld19kaWN0KGtleT0ndmFsdWUnKQorCisgICAgICAgICMgcG9wKCkgbXVzdCBjaGFuZ2UgdGhlIHZlcnNpb24gaWYgdGhlIGtleSBleGlzdHMKKyAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NoYW5nZWQoZCwgZC5wb3AsICdrZXknKQorCisgICAgICAgICMgcG9wKCkgbXVzdCBub3QgY2hhbmdlIHRoZSB2ZXJzaW9uIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2RvbnRfY2hhbmdlKGQsIHNlbGYuYXNzZXJ0UmFpc2VzLCBLZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucG9wLCAna2V5JykKKworICAgIGRlZiB0ZXN0X3BvcGl0ZW0oc2VsZik6CisgICAgICAgIGQgPSBzZWxmLm5ld19kaWN0KGtleT0ndmFsdWUnKQorCisgICAgICAgICMgcG9waXRlbSgpIG11c3QgY2hhbmdlIHRoZSB2ZXJzaW9uIGlmIHRoZSBkaWN0IGlzIG5vdCBlbXB0eQorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY2hhbmdlZChkLCBkLnBvcGl0ZW0pCisKKyAgICAgICAgIyBwb3BpdGVtKCkgbXVzdCBub3QgY2hhbmdlIHRoZSB2ZXJzaW9uIGlmIHRoZSBkaWN0IGlzIGVtcHR5CisgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9kb250X2NoYW5nZShkLCBzZWxmLmFzc2VydFJhaXNlcywgS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnBvcGl0ZW0pCisKKyAgICBkZWYgdGVzdF91cGRhdGUoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLm5ld19kaWN0KGtleT0ndmFsdWUnKQorCisgICAgICAgICMgdXBkYXRlKCkgY2FsbGluZyB3aXRoIG5vIGFyZ3VtZW50IG11c3Qgbm90IGNoYW5nZSB0aGUgdmVyc2lvbgorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fZG9udF9jaGFuZ2UoZCwgZC51cGRhdGUpCisKKyAgICAgICAgIyB1cGRhdGUoKSBtdXN0IGNoYW5nZSB0aGUgdmVyc2lvbgorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY2hhbmdlZChkLCBkLnVwZGF0ZSwga2V5PSduZXcgdmFsdWUnKQorCisgICAgICAgIGQyID0gc2VsZi5uZXdfZGljdChrZXk9J3ZhbHVlIDMnKQorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY2hhbmdlZChkLCBkLnVwZGF0ZSwgZDIpCisKKyAgICBkZWYgdGVzdF9jbGVhcihzZWxmKToKKyAgICAgICAgZCA9IHNlbGYubmV3X2RpY3Qoa2V5PSd2YWx1ZScpCisKKyAgICAgICAgIyBjbGVhcigpIG11c3QgY2hhbmdlIHRoZSB2ZXJzaW9uIGlmIHRoZSBkaWN0IGlzIG5vdCBlbXB0eQorICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY2hhbmdlZChkLCBkLmNsZWFyKQorCisgICAgICAgICMgY2xlYXIoKSBtdXN0IG5vdCBjaGFuZ2UgdGhlIHZlcnNpb24gaWYgdGhlIGRpY3QgaXMgZW1wdHkKKyAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2RvbnRfY2hhbmdlKGQsIGQuY2xlYXIpCisKKworY2xhc3MgRGljdChkaWN0KToKKyAgICBwYXNzCisKKworY2xhc3MgRGljdFN1YnR5cGVWZXJzaW9uVGVzdHMoRGljdFZlcnNpb25UZXN0cyk6CisgICAgdHlwZTJ0ZXN0ID0gRGljdAorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpY3Rjb21wcy5weSBiL0xpYi90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5CmluZGV4IDNjOGI5NWMuLjA4NzMwNzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5CkBAIC0xLDcgKzEsNSBAQAogaW1wb3J0IHVuaXR0ZXN0CiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAotCiAjIEZvciBzY29wZSB0ZXN0aW5nLgogZyA9ICJHbG9iYWwgdmFyaWFibGUiCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5IGIvTGliL3Rlc3QvdGVzdF9kaWN0dmlld3MucHkKaW5kZXggYWIyM2NhMS4uNGMyOTBmZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaWN0dmlld3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWN0dmlld3MucHkKQEAgLTEsMyArMSw0IEBACitpbXBvcnQgY29sbGVjdGlvbnMKIGltcG9ydCBjb3B5CiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgdW5pdHRlc3QKQEAgLTIxOSw2ICsyMjAsMjcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIHBpY2tsZS5QaWNrbGluZ0Vycm9yKSwKICAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcHMsIGQuaXRlbXMoKSwgcHJvdG8pCiAKKyAgICBkZWYgdGVzdF9hYmNfcmVnaXN0cnkoc2VsZik6CisgICAgICAgIGQgPSBkaWN0KGE9MSkKKworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5rZXlzKCksIGNvbGxlY3Rpb25zLktleXNWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5rZXlzKCksIGNvbGxlY3Rpb25zLk1hcHBpbmdWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5rZXlzKCksIGNvbGxlY3Rpb25zLlNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5TaXplZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5Db250YWluZXIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQudmFsdWVzKCksIGNvbGxlY3Rpb25zLlZhbHVlc1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLnZhbHVlcygpLCBjb2xsZWN0aW9ucy5NYXBwaW5nVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQudmFsdWVzKCksIGNvbGxlY3Rpb25zLlNpemVkKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLkl0ZW1zVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQuaXRlbXMoKSwgY29sbGVjdGlvbnMuTWFwcGluZ1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLlNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQuaXRlbXMoKSwgY29sbGVjdGlvbnMuU2l6ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLkl0ZXJhYmxlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5Db250YWluZXIpCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYi5weQppbmRleCBhYjlkZWJmLi4xNTZiNTIzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RpZmZsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWZmbGliLnB5CkBAIC0xMjIsMTcgKzEyMiwxNyBAQAogIiIiCiAKIHBhdGNoOTE0NTc1X2Zyb20yID0gIiIiCi1cdFx0TGluZSAxOiBwcmVjZWVkZWQgYnkgZnJvbTpbdHRdIHRvOltzc3NzXQotICBcdFx0TGluZSAyOiBwcmVjZWVkZWQgYnkgZnJvbTpbc3N0dF0gdG86W3Nzc3N0XQotICBcdCBcdExpbmUgMzogcHJlY2VlZGVkIGJ5IGZyb206W3NzdHN0XSB0bzpbc3Nzc3NzXQorXHRcdExpbmUgMTogcHJlY2VkZWQgYnkgZnJvbTpbdHRdIHRvOltzc3NzXQorICBcdFx0TGluZSAyOiBwcmVjZWRlZCBieSBmcm9tOltzc3R0XSB0bzpbc3Nzc3RdCisgIFx0IFx0TGluZSAzOiBwcmVjZWRlZCBieSBmcm9tOltzc3RzdF0gdG86W3Nzc3Nzc10KIExpbmUgNDogIFx0aGFzIGZyb206W3NzdF0gdG86W3Nzc10gYWZ0ZXIgOgogTGluZSA1OiBoYXMgZnJvbTpbdF0gdG86W3NzXSBhdCBlbmRcdAogIiIiCiAKIHBhdGNoOTE0NTc1X3RvMiA9ICIiIgotICAgIExpbmUgMTogcHJlY2VlZGVkIGJ5IGZyb206W3R0XSB0bzpbc3Nzc10KLSAgICBcdExpbmUgMjogcHJlY2VlZGVkIGJ5IGZyb206W3NzdHRdIHRvOltzc3NzdF0KLSAgICAgIExpbmUgMzogcHJlY2VlZGVkIGJ5IGZyb206W3NzdHN0XSB0bzpbc3Nzc3NzXQorICAgIExpbmUgMTogcHJlY2VkZWQgYnkgZnJvbTpbdHRdIHRvOltzc3NzXQorICAgIFx0TGluZSAyOiBwcmVjZWRlZCBieSBmcm9tOltzc3R0XSB0bzpbc3Nzc3RdCisgICAgICBMaW5lIDM6IHByZWNlZGVkIGJ5IGZyb206W3NzdHN0XSB0bzpbc3Nzc3NzXQogTGluZSA0OiAgIGhhcyBmcm9tOltzc3RdIHRvOltzc3NdIGFmdGVyIDoKIExpbmUgNTogaGFzIGZyb206W3RdIHRvOltzc10gYXQgZW5kCiAiIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYl9leHBlY3QuaHRtbCBiL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYl9leHBlY3QuaHRtbAppbmRleCBlYTdhMjRlLi4zZTZhN2I3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RpZmZsaWJfZXhwZWN0Lmh0bWwKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWZmbGliX2V4cGVjdC5odG1sCkBAIC0zODcsOSArMzg3LDkgQEAKICAgICAgICAgCiAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvOV9fMCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvOV9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tOV8xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzlfXzAiPmY8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG85XzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgotICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG85X190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTlfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MTombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3R0XSZuYnNwO3RvOltzc3NzXTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzlfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzlfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MTombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3R0XSZuYnNwO3RvOltzc3NzXTwvdGQ+PC90cj4KLSAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTlfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDsmbmJzcDtMaW5lJm5ic3A7MjombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHRdJm5ic3A7dG86W3Nzc3N0XTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwO0xpbmUmbmJzcDsyOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0dF0mbmJzcDt0bzpbc3Nzc3RdPC90ZD48L3RyPgotICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tOV80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDszOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0c3RdJm5ic3A7dG86W3Nzc3Nzc108L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzlfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MzombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG85X190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTlfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MTombmJzcDtwcmVjZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbdHRdJm5ic3A7dG86W3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvOV9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDsxOiZuYnNwO3ByZWNlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOlt0dF0mbmJzcDt0bzpbc3Nzc108L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb205XzMiPjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7TGluZSZuYnNwOzI6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHRdJm5ic3A7dG86W3Nzc3N0XTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwO0xpbmUmbmJzcDsyOiZuYnNwO3ByZWNlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3R0XSZuYnNwO3RvOltzc3NzdF08L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb205XzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzM6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG85XzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzM6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48L3RyPgogICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tOV81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPkxpbmUmbmJzcDs0OiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPmhhcyZuYnNwO2Zyb206W3NzdF0mbmJzcDt0bzpbc3NzXSZuYnNwO2FmdGVyJm5ic3A7OjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPkxpbmUmbmJzcDs0OiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPmhhcyZuYnNwO2Zyb206W3NzdF0mbmJzcDt0bzpbc3NzXSZuYnNwO2FmdGVyJm5ic3A7OjwvdGQ+PC90cj4KICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTlfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5MaW5lJm5ic3A7NTombmJzcDtoYXMmbmJzcDtmcm9tOlt0XSZuYnNwO3RvOltzc10mbmJzcDthdCZuYnNwO2VuZDxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV82Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPkxpbmUmbmJzcDs1OiZuYnNwO2hhcyZuYnNwO2Zyb206W3RdJm5ic3A7dG86W3NzXSZuYnNwO2F0Jm5ic3A7ZW5kPC90ZD48L3RyPgogICAgICAgICA8L3Rib2R5PgpAQCAtNDAzLDkgKzQwMyw5IEBACiAgICAgICAgIAogICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzEwX18wIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMF9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTBfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMF9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgotICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMF9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMF8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDsxOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbdHRdJm5ic3A7dG86W3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTBfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzE6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOlt0dF0mbmJzcDt0bzpbc3Nzc108L3RkPjwvdHI+Ci0gICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMF8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0xpbmUmbmJzcDsyOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0dF0mbmJzcDt0bzpbc3Nzc3RdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0xpbmUmbmJzcDsyOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0dF0mbmJzcDt0bzpbc3Nzc3RdPC90ZD48L3RyPgotICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTBfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MzombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDszOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0c3RdJm5ic3A7dG86W3Nzc3Nzc108L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEwX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzE6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3R0XSZuYnNwO3RvOltzc3NzXTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEwX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDsxOiZuYnNwO3ByZWNlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOlt0dF0mbmJzcDt0bzpbc3Nzc108L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMF8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0xpbmUmbmJzcDsyOiZuYnNwO3ByZWNlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3R0XSZuYnNwO3RvOltzc3NzdF08L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzMiPjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TGluZSZuYnNwOzI6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHRdJm5ic3A7dG86W3Nzc3N0XTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzM6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDszOiZuYnNwO3ByZWNlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3RzdF0mbmJzcDt0bzpbc3Nzc3NzXTwvdGQ+PC90cj4KICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzQ6Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+aGFzJm5ic3A7ZnJvbTpbc3N0XSZuYnNwO3RvOltzc3NdJm5ic3A7YWZ0ZXImbmJzcDs6PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPkxpbmUmbmJzcDs0OiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPmhhcyZuYnNwO2Zyb206W3NzdF0mbmJzcDt0bzpbc3NzXSZuYnNwO2FmdGVyJm5ic3A7OjwvdGQ+PC90cj4KICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzU6Jm5ic3A7aGFzJm5ic3A7ZnJvbTpbdF0mbmJzcDt0bzpbc3NdJm5ic3A7YXQmbmJzcDtlbmQ8c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzU6Jm5ic3A7aGFzJm5ic3A7ZnJvbTpbdF0mbmJzcDt0bzpbc3NdJm5ic3A7YXQmbmJzcDtlbmQ8L3RkPjwvdHI+CiAgICAgICAgIDwvdGJvZHk+CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rpcy5weSBiL0xpYi90ZXN0L3Rlc3RfZGlzLnB5CmluZGV4IDBmZDEzNDguLmYzMTkzMzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGlzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGlzLnB5CkBAIC00MCw0MSArNDAsNDEgQEAKIAogZGlzX2NfaW5zdGFuY2VfbWV0aG9kID0gIiIiXAogJTNkICAgICAgICAgICAwIExPQURfRkFTVCAgICAgICAgICAgICAgICAxICh4KQotICAgICAgICAgICAgICAzIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgICAgICA2IENPTVBBUkVfT1AgICAgICAgICAgICAgICAyICg9PSkKLSAgICAgICAgICAgICAgOSBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoc2VsZikKLSAgICAgICAgICAgICAxMiBTVE9SRV9BVFRSICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAxNSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAxOCBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyAgICAgICAgICAgICAgNCBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCisgICAgICAgICAgICAgIDYgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKHNlbGYpCisgICAgICAgICAgICAgIDggU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKHgpCisgICAgICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgMTIgUkVUVVJOX1ZBTFVFCiAiIiIgJSAoX0MuX19pbml0X18uX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLCkKIAogZGlzX2NfaW5zdGFuY2VfbWV0aG9kX2J5dGVzID0gIiIiXAogICAgICAgICAgIDAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICA2IENPTVBBUkVfT1AgICAgICAgICAgICAgICAyICg9PSkKLSAgICAgICAgICA5IExPQURfRkFTVCAgICAgICAgICAgICAgICAwICgwKQotICAgICAgICAgMTIgU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKDApCi0gICAgICAgICAxNSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMCkKLSAgICAgICAgIDE4IFJFVFVSTl9WQUxVRQorICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgNCBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCisgICAgICAgICAgNiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoMCkKKyAgICAgICAgICA4IFNUT1JFX0FUVFIgICAgICAgICAgICAgICAwICgwKQorICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKDApCisgICAgICAgICAxMiBSRVRVUk5fVkFMVUUKICIiIgogCiBkaXNfY19jbGFzc19tZXRob2QgPSAiIiJcCiAlM2QgICAgICAgICAgIDAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDEgKHgpCi0gICAgICAgICAgICAgIDMgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgICAgIDYgQ09NUEFSRV9PUCAgICAgICAgICAgICAgIDIgKD09KQotICAgICAgICAgICAgICA5IExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChjbHMpCi0gICAgICAgICAgICAgMTIgU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgMTUgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMTggUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgIDQgQ09NUEFSRV9PUCAgICAgICAgICAgICAgIDIgKD09KQorICAgICAgICAgICAgICA2IExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChjbHMpCisgICAgICAgICAgICAgIDggU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKHgpCisgICAgICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgMTIgUkVUVVJOX1ZBTFVFCiAiIiIgJSAoX0MuY20uX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAyLCkKIAogZGlzX2Nfc3RhdGljX21ldGhvZCA9ICIiIlwKICUzZCAgICAgICAgICAgMCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICAgICAgNiBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCi0gICAgICAgICAgICAgIDkgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgMTIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMTUgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgIDQgQ09NUEFSRV9PUCAgICAgICAgICAgICAgIDIgKD09KQorICAgICAgICAgICAgICA2IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAwICh4KQorICAgICAgICAgICAgICA4IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorICAgICAgICAgICAgIDEwIFJFVFVSTl9WQUxVRQogIiIiICUgKF9DLnNtLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vICsgMiwpCiAKICMgQ2xhc3MgZGlzYXNzZW1ibGluZyBpbmZvIGhhcyBhbiBleHRyYSBuZXdsaW5lIGF0IGVuZC4KQEAgLTk1LDIzICs5NSwyMyBAQAogCiBkaXNfZiA9ICIiIlwKICUzZCAgICAgICAgICAgMCBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAocHJpbnQpCi0gICAgICAgICAgICAgIDMgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGEpCi0gICAgICAgICAgICAgIDYgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEgKDEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCi0gICAgICAgICAgICAgIDkgUE9QX1RPUAorICAgICAgICAgICAgICAyIExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChhKQorICAgICAgICAgICAgICA0IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxCisgICAgICAgICAgICAgIDYgUE9QX1RPUAogCi0lM2QgICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgICAgMTMgUkVUVVJOX1ZBTFVFCislM2QgICAgICAgICAgIDggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgMTAgUkVUVVJOX1ZBTFVFCiAiIiIgJSAoX2YuX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLAogICAgICAgIF9mLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vICsgMikKIAogCiBkaXNfZl9jb19jb2RlID0gIiIiXAogICAgICAgICAgIDAgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKDApCi0gICAgICAgICAgMyBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoMCkKLSAgICAgICAgICA2IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxICgxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQotICAgICAgICAgIDkgUE9QX1RPUAotICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAxMyBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAyIExPQURfRkFTVCAgICAgICAgICAgICAgICAwICgwKQorICAgICAgICAgIDQgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEKKyAgICAgICAgICA2IFBPUF9UT1AKKyAgICAgICAgICA4IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQorICAgICAgICAgMTAgUkVUVVJOX1ZBTFVFCiAiIiIKIAogCkBAIC0xMjEsMjAgKzEyMSwyMCBAQAogICAgICAgICBwYXNzCiAKIGRpc19idWc3MDg5MDEgPSAiIiJcCi0lM2QgICAgICAgICAgIDAgU0VUVVBfTE9PUCAgICAgICAgICAgICAgMjMgKHRvIDI2KQotICAgICAgICAgICAgICAzIExPQURfR0xPQkFMICAgICAgICAgICAgICAwIChyYW5nZSkKLSAgICAgICAgICAgICAgNiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyUzZCAgICAgICAgICAgMCBTRVRVUF9MT09QICAgICAgICAgICAgICAxOCAodG8gMjApCisgICAgICAgICAgICAgIDIgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKHJhbmdlKQorICAgICAgICAgICAgICA0IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQogCi0lM2QgICAgICAgICAgIDkgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDEwKQotICAgICAgICAgICAgIDEyIENBTExfRlVOQ1RJT04gICAgICAgICAgICAyICgyIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQotICAgICAgICAgICAgIDE1IEdFVF9JVEVSCi0gICAgICAgID4+ICAgMTYgRk9SX0lURVIgICAgICAgICAgICAgICAgIDYgKHRvIDI1KQotICAgICAgICAgICAgIDE5IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAwIChyZXMpCislM2QgICAgICAgICAgIDYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDEwKQorICAgICAgICAgICAgICA4IENBTExfRlVOQ1RJT04gICAgICAgICAgICAyCisgICAgICAgICAgICAgMTAgR0VUX0lURVIKKyAgICAgICAgPj4gICAxMiBGT1JfSVRFUiAgICAgICAgICAgICAgICAgNCAodG8gMTgpCisgICAgICAgICAgICAgMTQgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKHJlcykKIAotJTNkICAgICAgICAgIDIyIEpVTVBfQUJTT0xVVEUgICAgICAgICAgIDE2Ci0gICAgICAgID4+ICAgMjUgUE9QX0JMT0NLCi0gICAgICAgID4+ICAgMjYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMjkgUkVUVVJOX1ZBTFVFCislM2QgICAgICAgICAgMTYgSlVNUF9BQlNPTFVURSAgICAgICAgICAgMTIKKyAgICAgICAgPj4gICAxOCBQT1BfQkxPQ0sKKyAgICAgICAgPj4gICAyMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKKyAgICAgICAgICAgICAyMiBSRVRVUk5fVkFMVUUKICIiIiAlIChidWc3MDg5MDEuX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLAogICAgICAgIGJ1ZzcwODkwMS5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDIsCiAgICAgICAgYnVnNzA4OTAxLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vICsgMykKQEAgLTE0NywyMiArMTQ3LDIyIEBACiAKIGRpc19idWcxMzMzOTgyID0gIiIiXAogJTNkICAgICAgICAgICAwIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgwKQotICAgICAgICAgICAgICAzIFBPUF9KVU1QX0lGX1RSVUUgICAgICAgIDM1Ci0gICAgICAgICAgICAgIDYgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKEFzc2VydGlvbkVycm9yKQotICAgICAgICAgICAgICA5IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICg8Y29kZSBvYmplY3QgPGxpc3Rjb21wPiBhdCAweC4uLiwgZmlsZSAiJXMiLCBsaW5lICVkPikKLSAgICAgICAgICAgICAxMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMyAoJ2J1ZzEzMzM5ODIuPGxvY2Fscz4uPGxpc3Rjb21wPicpCi0gICAgICAgICAgICAgMTUgTUFLRV9GVU5DVElPTiAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAxOCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAyMSBHRVRfSVRFUgotICAgICAgICAgICAgIDIyIENBTExfRlVOQ1RJT04gICAgICAgICAgICAxICgxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQorICAgICAgICAgICAgICAyIFBPUF9KVU1QX0lGX1RSVUUgICAgICAgIDI2CisgICAgICAgICAgICAgIDQgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKEFzc2VydGlvbkVycm9yKQorICAgICAgICAgICAgICA2IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICg8Y29kZSBvYmplY3QgPGxpc3Rjb21wPiBhdCAweC4uLiwgZmlsZSAiJXMiLCBsaW5lICVkPikKKyAgICAgICAgICAgICAgOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMyAoJ2J1ZzEzMzM5ODIuPGxvY2Fscz4uPGxpc3Rjb21wPicpCisgICAgICAgICAgICAgMTAgTUFLRV9GVU5DVElPTiAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAxMiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAxNCBHRVRfSVRFUgorICAgICAgICAgICAgIDE2IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxCiAKLSUzZCAgICAgICAgICAyNSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgNCAoMSkKLSAgICAgICAgICAgICAyOCBCSU5BUllfQURECi0gICAgICAgICAgICAgMjkgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEgKDEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCi0gICAgICAgICAgICAgMzIgUkFJU0VfVkFSQVJHUyAgICAgICAgICAgIDEKKyUzZCAgICAgICAgICAxOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgNCAoMSkKKyAgICAgICAgICAgICAyMCBCSU5BUllfQURECisgICAgICAgICAgICAgMjIgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAyNCBSQUlTRV9WQVJBUkdTICAgICAgICAgICAgMQogCi0lM2QgICAgID4+ICAgMzUgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMzggUkVUVVJOX1ZBTFVFCislM2QgICAgID4+ICAgMjYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgMjggUkVUVVJOX1ZBTFVFCiAiIiIgJSAoYnVnMTMzMzk4Mi5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDEsCiAgICAgICAgX19maWxlX18sCiAgICAgICAgYnVnMTMzMzk4Mi5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDEsCkBAIC0xNzEsMTkgKzE3MSwxOSBAQAogCiBfQklHX0xJTkVOT19GT1JNQVQgPSAiIiJcCiAlM2QgICAgICAgICAgIDAgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKHNwYW0pCi0gICAgICAgICAgICAgIDMgUE9QX1RPUAorICAgICAgICAgICAgICAyIFBPUF9UT1AKICAgICAgICAgICAgICAgNCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAgNyBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgNiBSRVRVUk5fVkFMVUUKICIiIgogCiBkaXNfbW9kdWxlX2V4cGVjdGVkX3Jlc3VsdHMgPSAiIiJcCiBEaXNhc3NlbWJseSBvZiBmOgogICA0ICAgICAgICAgICAwIExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQotICAgICAgICAgICAgICAzIFJFVFVSTl9WQUxVRQorICAgICAgICAgICAgICAyIFJFVFVSTl9WQUxVRQogCiBEaXNhc3NlbWJseSBvZiBnOgogICA1ICAgICAgICAgICAwIExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQotICAgICAgICAgICAgICAzIFJFVFVSTl9WQUxVRQorICAgICAgICAgICAgICAyIFJFVFVSTl9WQUxVRQogCiAiIiIKIApAQCAtMTkxLDIwICsxOTEsNTIgQEAKIAogZGlzX2V4cHJfc3RyID0gIiIiXAogICAxICAgICAgICAgICAwIExPQURfTkFNRSAgICAgICAgICAgICAgICAwICh4KQotICAgICAgICAgICAgICAzIExPQURfQ09OU1QgICAgICAgICAgICAgICAwICgxKQotICAgICAgICAgICAgICA2IEJJTkFSWV9BREQKLSAgICAgICAgICAgICAgNyBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMSkKKyAgICAgICAgICAgICAgNCBCSU5BUllfQURECisgICAgICAgICAgICAgIDYgUkVUVVJOX1ZBTFVFCiAiIiIKIAogc2ltcGxlX3N0bXRfc3RyID0gInggPSB4ICsgMSIKIAogZGlzX3NpbXBsZV9zdG10X3N0ciA9ICIiIlwKICAgMSAgICAgICAgICAgMCBMT0FEX05BTUUgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMSkKLSAgICAgICAgICAgICAgNiBCSU5BUllfQURECi0gICAgICAgICAgICAgIDcgU1RPUkVfTkFNRSAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKE5vbmUpCi0gICAgICAgICAgICAgMTMgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKDEpCisgICAgICAgICAgICAgIDQgQklOQVJZX0FERAorICAgICAgICAgICAgICA2IFNUT1JFX05BTUUgICAgICAgICAgICAgICAwICh4KQorICAgICAgICAgICAgICA4IExPQURfQ09OU1QgICAgICAgICAgICAgICAxIChOb25lKQorICAgICAgICAgICAgIDEwIFJFVFVSTl9WQUxVRQorIiIiCisKK2Fubm90X3N0bXRfc3RyID0gIiIiXAorCit4OiBpbnQgPSAxCit5OiBmdW4oMSkKK2xzdFtmdW4oMCldOiBpbnQgPSAxCisiIiIKKyMgbGVhZGluZyBuZXdsaW5lIGlzIGZvciBhIHJlYXNvbiAodGVzdHMgbGluZW5vKQorCitkaXNfYW5ub3Rfc3RtdF9zdHIgPSAiIiJcCisgIDIgICAgICAgICAgIDAgU0VUVVBfQU5OT1RBVElPTlMKKyAgICAgICAgICAgICAgMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMSkKKyAgICAgICAgICAgICAgNCBTVE9SRV9OQU1FICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAgNiBMT0FEX05BTUUgICAgICAgICAgICAgICAgMSAoaW50KQorICAgICAgICAgICAgICA4IFNUT1JFX0FOTk9UQVRJT04gICAgICAgICAwICh4KQorCisgIDMgICAgICAgICAgMTAgTE9BRF9OQU1FICAgICAgICAgICAgICAgIDIgKGZ1bikKKyAgICAgICAgICAgICAxMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMSkKKyAgICAgICAgICAgICAxNCBDQUxMX0ZVTkNUSU9OICAgICAgICAgICAgMQorICAgICAgICAgICAgIDE2IFNUT1JFX0FOTk9UQVRJT04gICAgICAgICAzICh5KQorCisgIDQgICAgICAgICAgMTggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKDEpCisgICAgICAgICAgICAgMjAgTE9BRF9OQU1FICAgICAgICAgICAgICAgIDQgKGxzdCkKKyAgICAgICAgICAgICAyMiBMT0FEX05BTUUgICAgICAgICAgICAgICAgMiAoZnVuKQorICAgICAgICAgICAgIDI0IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgwKQorICAgICAgICAgICAgIDI2IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxCisgICAgICAgICAgICAgMjggU1RPUkVfU1VCU0NSCisgICAgICAgICAgICAgMzAgTE9BRF9OQU1FICAgICAgICAgICAgICAgIDEgKGludCkKKyAgICAgICAgICAgICAzMiBQT1BfVE9QCisgICAgICAgICAgICAgMzQgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKE5vbmUpCisgICAgICAgICAgICAgMzYgUkVUVVJOX1ZBTFVFCiAiIiIKIAogY29tcG91bmRfc3RtdF9zdHIgPSAiIiJcCkBAIC0yMTUsNTQgKzI0Nyw1NCBAQAogCiBkaXNfY29tcG91bmRfc3RtdF9zdHIgPSAiIiJcCiAgIDEgICAgICAgICAgIDAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKDApCi0gICAgICAgICAgICAgIDMgU1RPUkVfTkFNRSAgICAgICAgICAgICAgIDAgKHgpCisgICAgICAgICAgICAgIDIgU1RPUkVfTkFNRSAgICAgICAgICAgICAgIDAgKHgpCiAKLSAgMiAgICAgICAgICAgNiBTRVRVUF9MT09QICAgICAgICAgICAgICAxNCAodG8gMjMpCisgIDIgICAgICAgICAgIDQgU0VUVVBfTE9PUCAgICAgICAgICAgICAgMTIgKHRvIDE4KQogCi0gIDMgICAgID4+ICAgIDkgTE9BRF9OQU1FICAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgMTIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgICAgMTUgSU5QTEFDRV9BREQKLSAgICAgICAgICAgICAxNiBTVE9SRV9OQU1FICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAxOSBKVU1QX0FCU09MVVRFICAgICAgICAgICAgOQotICAgICAgICAgICAgIDIyIFBPUF9CTE9DSwotICAgICAgICA+PiAgIDIzIExPQURfQ09OU1QgICAgICAgICAgICAgICAyIChOb25lKQotICAgICAgICAgICAgIDI2IFJFVFVSTl9WQUxVRQorICAzICAgICA+PiAgICA2IExPQURfTkFNRSAgICAgICAgICAgICAgICAwICh4KQorICAgICAgICAgICAgICA4IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQorICAgICAgICAgICAgIDEwIElOUExBQ0VfQURECisgICAgICAgICAgICAgMTIgU1RPUkVfTkFNRSAgICAgICAgICAgICAgIDAgKHgpCisgICAgICAgICAgICAgMTQgSlVNUF9BQlNPTFVURSAgICAgICAgICAgIDYKKyAgICAgICAgICAgICAxNiBQT1BfQkxPQ0sKKyAgICAgICAgPj4gICAxOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoTm9uZSkKKyAgICAgICAgICAgICAyMCBSRVRVUk5fVkFMVUUKICIiIgogCiBkaXNfdHJhY2ViYWNrID0gIiIiXAotJTNkICAgICAgICAgICAwIFNFVFVQX0VYQ0VQVCAgICAgICAgICAgIDEyICh0byAxNSkKKyUzZCAgICAgICAgICAgMCBTRVRVUF9FWENFUFQgICAgICAgICAgICAxMiAodG8gMTQpCiAKLSUzZCAgICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICAgICAgNiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMCkKLSAgICAtLT4gICAgICAgOSBCSU5BUllfVFJVRV9ESVZJREUKLSAgICAgICAgICAgICAxMCBQT1BfVE9QCi0gICAgICAgICAgICAgMTEgUE9QX0JMT0NLCi0gICAgICAgICAgICAgMTIgSlVNUF9GT1JXQVJEICAgICAgICAgICAgNDYgKHRvIDYxKQorJTNkICAgICAgICAgICAyIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQorICAgICAgICAgICAgICA0IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICgwKQorICAgIC0tPiAgICAgICA2IEJJTkFSWV9UUlVFX0RJVklERQorICAgICAgICAgICAgICA4IFBPUF9UT1AKKyAgICAgICAgICAgICAxMCBQT1BfQkxPQ0sKKyAgICAgICAgICAgICAxMiBKVU1QX0ZPUldBUkQgICAgICAgICAgICA0MCAodG8gNTQpCiAKLSUzZCAgICAgPj4gICAxNSBEVVBfVE9QCislM2QgICAgID4+ICAgMTQgRFVQX1RPUAogICAgICAgICAgICAgIDE2IExPQURfR0xPQkFMICAgICAgICAgICAgICAwIChFeGNlcHRpb24pCi0gICAgICAgICAgICAgMTkgQ09NUEFSRV9PUCAgICAgICAgICAgICAgMTAgKGV4Y2VwdGlvbiBtYXRjaCkKLSAgICAgICAgICAgICAyMiBQT1BfSlVNUF9JRl9GQUxTRSAgICAgICA2MAotICAgICAgICAgICAgIDI1IFBPUF9UT1AKLSAgICAgICAgICAgICAyNiBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMCAoZSkKLSAgICAgICAgICAgICAyOSBQT1BfVE9QCi0gICAgICAgICAgICAgMzAgU0VUVVBfRklOQUxMWSAgICAgICAgICAgMTQgKHRvIDQ3KQorICAgICAgICAgICAgIDE4IENPTVBBUkVfT1AgICAgICAgICAgICAgIDEwIChleGNlcHRpb24gbWF0Y2gpCisgICAgICAgICAgICAgMjAgUE9QX0pVTVBfSUZfRkFMU0UgICAgICAgNTIKKyAgICAgICAgICAgICAyMiBQT1BfVE9QCisgICAgICAgICAgICAgMjQgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKGUpCisgICAgICAgICAgICAgMjYgUE9QX1RPUAorICAgICAgICAgICAgIDI4IFNFVFVQX0ZJTkFMTFkgICAgICAgICAgIDEyICh0byA0MikKIAotJTNkICAgICAgICAgIDMzIExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChlKQotICAgICAgICAgICAgIDM2IExPQURfQVRUUiAgICAgICAgICAgICAgICAxIChfX3RyYWNlYmFja19fKQotICAgICAgICAgICAgIDM5IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAxICh0YikKLSAgICAgICAgICAgICA0MiBQT1BfQkxPQ0sKLSAgICAgICAgICAgICA0MyBQT1BfRVhDRVBUCi0gICAgICAgICAgICAgNDQgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgID4+ICAgNDcgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgNTAgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKGUpCi0gICAgICAgICAgICAgNTMgREVMRVRFX0ZBU1QgICAgICAgICAgICAgIDAgKGUpCi0gICAgICAgICAgICAgNTYgRU5EX0ZJTkFMTFkKLSAgICAgICAgICAgICA1NyBKVU1QX0ZPUldBUkQgICAgICAgICAgICAgMSAodG8gNjEpCi0gICAgICAgID4+ICAgNjAgRU5EX0ZJTkFMTFkKKyUzZCAgICAgICAgICAzMCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoZSkKKyAgICAgICAgICAgICAzMiBMT0FEX0FUVFIgICAgICAgICAgICAgICAgMSAoX190cmFjZWJhY2tfXykKKyAgICAgICAgICAgICAzNCBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMSAodGIpCisgICAgICAgICAgICAgMzYgUE9QX0JMT0NLCisgICAgICAgICAgICAgMzggUE9QX0VYQ0VQVAorICAgICAgICAgICAgIDQwIExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorICAgICAgICA+PiAgIDQyIExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorICAgICAgICAgICAgIDQ0IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAwIChlKQorICAgICAgICAgICAgIDQ2IERFTEVURV9GQVNUICAgICAgICAgICAgICAwIChlKQorICAgICAgICAgICAgIDQ4IEVORF9GSU5BTExZCisgICAgICAgICAgICAgNTAgSlVNUF9GT1JXQVJEICAgICAgICAgICAgIDIgKHRvIDU0KQorICAgICAgICA+PiAgIDUyIEVORF9GSU5BTExZCiAKLSUzZCAgICAgPj4gICA2MSBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMSAodGIpCi0gICAgICAgICAgICAgNjQgUkVUVVJOX1ZBTFVFCislM2QgICAgID4+ICAgNTQgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDEgKHRiKQorICAgICAgICAgICAgIDU2IFJFVFVSTl9WQUxVRQogIiIiICUgKFRSQUNFQkFDS19DT0RFLmNvX2ZpcnN0bGluZW5vICsgMSwKICAgICAgICBUUkFDRUJBQ0tfQ09ERS5jb19maXJzdGxpbmVubyArIDIsCiAgICAgICAgVFJBQ0VCQUNLX0NPREUuY29fZmlyc3RsaW5lbm8gKyAzLApAQCAtMzQ1LDYgKzM3Nyw3IEBACiAgICAgZGVmIHRlc3RfZGlzYXNzZW1ibGVfc3RyKHNlbGYpOgogICAgICAgICBzZWxmLmRvX2Rpc2Fzc2VtYmx5X3Rlc3QoZXhwcl9zdHIsIGRpc19leHByX3N0cikKICAgICAgICAgc2VsZi5kb19kaXNhc3NlbWJseV90ZXN0KHNpbXBsZV9zdG10X3N0ciwgZGlzX3NpbXBsZV9zdG10X3N0cikKKyAgICAgICAgc2VsZi5kb19kaXNhc3NlbWJseV90ZXN0KGFubm90X3N0bXRfc3RyLCBkaXNfYW5ub3Rfc3RtdF9zdHIpCiAgICAgICAgIHNlbGYuZG9fZGlzYXNzZW1ibHlfdGVzdChjb21wb3VuZF9zdG10X3N0ciwgZGlzX2NvbXBvdW5kX3N0bXRfc3RyKQogCiAgICAgZGVmIHRlc3RfZGlzYXNzZW1ibGVfYnl0ZXMoc2VsZik6CkBAIC01NDEsNyArNTc0LDcgQEAKIEt3LW9ubHkgYXJndW1lbnRzOiAwCiBOdW1iZXIgb2YgbG9jYWxzOiAgMgogU3RhY2sgc2l6ZTogICAgICAgIDE3Ci1GbGFnczogICAgICAgICAgICAgT1BUSU1JWkVELCBORVdMT0NBTFMsIEdFTkVSQVRPUiwgTk9GUkVFLCBDT1JPVVRJTkUKK0ZsYWdzOiAgICAgICAgICAgICBPUFRJTUlaRUQsIE5FV0xPQ0FMUywgTk9GUkVFLCBDT1JPVVRJTkUKIENvbnN0YW50czoKICAgIDA6IE5vbmUKICAgIDE6IDEiIiIKQEAgLTY0OSwxNzEgKzY4MiwxNjkgQEAKIAogSW5zdHJ1Y3Rpb24gPSBkaXMuSW5zdHJ1Y3Rpb24KIGV4cGVjdGVkX29waW5mb19vdXRlciA9IFsKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTEsIGFyZ3ZhbD0zLCBhcmdyZXByPSczJywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTIsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD00LCBhcmdyZXByPSc0Jywgb2Zmc2V0PTMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MCwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD02LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTEsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9OSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0JVSUxEX1RVUExFJywgb3Bjb2RlPTEwMiwgYXJnPTIsIGFyZ3ZhbD0yLCBhcmdyZXByPScnLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTMsIGFyZ3ZhbD1jb2RlX29iamVjdF9mLCBhcmdyZXByPXJlcHIoY29kZV9vYmplY3RfZiksIG9mZnNldD0xNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NCwgYXJndmFsPSdvdXRlci48bG9jYWxzPi5mJywgYXJncmVwcj0iJ291dGVyLjxsb2NhbHM+LmYnIiwgb2Zmc2V0PTE4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTUFLRV9DTE9TVVJFJywgb3Bjb2RlPTEzNCwgYXJnPTIsIGFyZ3ZhbD0yLCBhcmdyZXByPScnLCBvZmZzZXQ9MjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTIsIGFyZ3ZhbD0nZicsIGFyZ3JlcHI9J2YnLCBvZmZzZXQ9MjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0wLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MjcsIHN0YXJ0c19saW5lPTcsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9MzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTEsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9MzMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTUsIGFyZ3ZhbD0nJywgYXJncmVwcj0iJyciLCBvZmZzZXQ9MzYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTYsIGFyZ3ZhbD0xLCBhcmdyZXByPScxJywgb2Zmc2V0PTM5LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQlVJTERfTElTVCcsIG9wY29kZT0xMDMsIGFyZz0wLCBhcmd2YWw9MCwgYXJncmVwcj0nJywgb2Zmc2V0PTQyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQlVJTERfTUFQJywgb3Bjb2RlPTEwNSwgYXJnPTAsIGFyZ3ZhbD0wLCBhcmdyZXByPScnLCBvZmZzZXQ9NDUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTcsIGFyZ3ZhbD0nSGVsbG8gd29ybGQhJywgYXJncmVwcj0iJ0hlbGxvIHdvcmxkISciLCBvZmZzZXQ9NDgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTcsIGFyZ3ZhbD03LCBhcmdyZXByPSc3IHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTUxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD01NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0yLCBhcmd2YWw9J2YnLCBhcmdyZXByPSdmJywgb2Zmc2V0PTU1LCBzdGFydHNfbGluZT04LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD01OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9OCwgYXJndmFsPSgzLCA0KSwgYXJncmVwcj0nKDMsIDQpJywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTIsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MCwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD0yLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTEsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0JVSUxEX1RVUExFJywgb3Bjb2RlPTEwMiwgYXJnPTIsIGFyZ3ZhbD0yLCBhcmdyZXByPScnLCBvZmZzZXQ9Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MywgYXJndmFsPWNvZGVfb2JqZWN0X2YsIGFyZ3JlcHI9cmVwcihjb2RlX29iamVjdF9mKSwgb2Zmc2V0PTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTQsIGFyZ3ZhbD0nb3V0ZXIuPGxvY2Fscz4uZicsIGFyZ3JlcHI9IidvdXRlci48bG9jYWxzPi5mJyIsIG9mZnNldD0xMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J01BS0VfRlVOQ1RJT04nLCBvcGNvZGU9MTMyLCBhcmc9OSwgYXJndmFsPTksIGFyZ3JlcHI9JycsIG9mZnNldD0xMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MiwgYXJndmFsPSdmJywgYXJncmVwcj0nZicsIG9mZnNldD0xNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xNiwgc3RhcnRzX2xpbmU9NywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MCwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MSwgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD0yMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NSwgYXJndmFsPScnLCBhcmdyZXByPSInJyIsIG9mZnNldD0yMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NiwgYXJndmFsPTEsIGFyZ3JlcHI9JzEnLCBvZmZzZXQ9MjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCVUlMRF9MSVNUJywgb3Bjb2RlPTEwMywgYXJnPTAsIGFyZ3ZhbD0wLCBhcmdyZXByPScnLCBvZmZzZXQ9MjYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCVUlMRF9NQVAnLCBvcGNvZGU9MTA1LCBhcmc9MCwgYXJndmFsPTAsIGFyZ3JlcHI9JycsIG9mZnNldD0yOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NywgYXJndmFsPSdIZWxsbyB3b3JsZCEnLCBhcmdyZXByPSInSGVsbG8gd29ybGQhJyIsIG9mZnNldD0zMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9NywgYXJndmFsPTcsIGFyZ3JlcHI9JycsIG9mZnNldD0zMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MzQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MiwgYXJndmFsPSdmJywgYXJncmVwcj0nZicsIG9mZnNldD0zNiwgc3RhcnRzX2xpbmU9OCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MzgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKIF0KIAogZXhwZWN0ZWRfb3BpbmZvX2YgPSBbCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0xLCBhcmd2YWw9NSwgYXJncmVwcj0nNScsIG9mZnNldD0wLCBzdGFydHNfbGluZT0zLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0yLCBhcmd2YWw9NiwgYXJncmVwcj0nNicsIG9mZnNldD0zLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTIsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0zLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTksIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MCwgYXJndmFsPSdjJywgYXJncmVwcj0nYycsIG9mZnNldD0xMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0xLCBhcmd2YWw9J2QnLCBhcmdyZXByPSdkJywgb2Zmc2V0PTE1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQlVJTERfVFVQTEUnLCBvcGNvZGU9MTAyLCBhcmc9NCwgYXJndmFsPTQsIGFyZ3JlcHI9JycsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MywgYXJndmFsPWNvZGVfb2JqZWN0X2lubmVyLCBhcmdyZXByPXJlcHIoY29kZV9vYmplY3RfaW5uZXIpLCBvZmZzZXQ9MjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTQsIGFyZ3ZhbD0nb3V0ZXIuPGxvY2Fscz4uZi48bG9jYWxzPi5pbm5lcicsIGFyZ3JlcHI9IidvdXRlci48bG9jYWxzPi5mLjxsb2NhbHM+LmlubmVyJyIsIG9mZnNldD0yNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J01BS0VfQ0xPU1VSRScsIG9wY29kZT0xMzQsIGFyZz0yLCBhcmd2YWw9MiwgYXJncmVwcj0nJywgb2Zmc2V0PTI3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0yLCBhcmd2YWw9J2lubmVyJywgYXJncmVwcj0naW5uZXInLCBvZmZzZXQ9MzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0wLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MzMsIHN0YXJ0c19saW5lPTUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTIsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9MzYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTMsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9MzksIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTAsIGFyZ3ZhbD0nYycsIGFyZ3JlcHI9J2MnLCBvZmZzZXQ9NDIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTEsIGFyZ3ZhbD0nZCcsIGFyZ3JlcHI9J2QnLCBvZmZzZXQ9NDUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTQsIGFyZ3ZhbD00LCBhcmdyZXByPSc0IHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTQ4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD01MSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0yLCBhcmd2YWw9J2lubmVyJywgYXJncmVwcj0naW5uZXInLCBvZmZzZXQ9NTIsIHN0YXJ0c19saW5lPTYsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdSRVRVUk5fVkFMVUUnLCBvcGNvZGU9ODMsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTU1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz01LCBhcmd2YWw9KDUsIDYpLCBhcmdyZXByPScoNSwgNiknLCBvZmZzZXQ9MCwgc3RhcnRzX2xpbmU9MywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0yLCBhcmd2YWw9J2EnLCBhcmdyZXByPSdhJywgb2Zmc2V0PTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MywgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD00LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTAsIGFyZ3ZhbD0nYycsIGFyZ3JlcHI9J2MnLCBvZmZzZXQ9Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0xLCBhcmd2YWw9J2QnLCBhcmdyZXByPSdkJywgb2Zmc2V0PTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCVUlMRF9UVVBMRScsIG9wY29kZT0xMDIsIGFyZz00LCBhcmd2YWw9NCwgYXJncmVwcj0nJywgb2Zmc2V0PTEwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0zLCBhcmd2YWw9Y29kZV9vYmplY3RfaW5uZXIsIGFyZ3JlcHI9cmVwcihjb2RlX29iamVjdF9pbm5lciksIG9mZnNldD0xMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NCwgYXJndmFsPSdvdXRlci48bG9jYWxzPi5mLjxsb2NhbHM+LmlubmVyJywgYXJncmVwcj0iJ291dGVyLjxsb2NhbHM+LmYuPGxvY2Fscz4uaW5uZXInIiwgb2Zmc2V0PTE0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTUFLRV9GVU5DVElPTicsIG9wY29kZT0xMzIsIGFyZz05LCBhcmd2YWw9OSwgYXJncmVwcj0nJywgb2Zmc2V0PTE2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0yLCBhcmd2YWw9J2lubmVyJywgYXJncmVwcj0naW5uZXInLCBvZmZzZXQ9MTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0wLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MjAsIHN0YXJ0c19saW5lPTUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTIsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9MjIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTMsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9MjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTAsIGFyZ3ZhbD0nYycsIGFyZ3JlcHI9J2MnLCBvZmZzZXQ9MjYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTEsIGFyZ3ZhbD0nZCcsIGFyZ3JlcHI9J2QnLCBvZmZzZXQ9MjgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTQsIGFyZ3ZhbD00LCBhcmdyZXByPScnLCBvZmZzZXQ9MzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTMyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTIsIGFyZ3ZhbD0naW5uZXInLCBhcmdyZXByPSdpbm5lcicsIG9mZnNldD0zNCwgc3RhcnRzX2xpbmU9NiwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MzYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKIF0KIAogZXhwZWN0ZWRfb3BpbmZvX2lubmVyID0gWwogICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0wLCBzdGFydHNfbGluZT00LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0wLCBhcmd2YWw9J2EnLCBhcmdyZXByPSdhJywgb2Zmc2V0PTMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTEsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MiwgYXJndmFsPSdjJywgYXJncmVwcj0nYycsIG9mZnNldD05LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0zLCBhcmd2YWw9J2QnLCBhcmdyZXByPSdkJywgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0nZScsIGFyZ3JlcHI9J2UnLCBvZmZzZXQ9MTUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MSwgYXJndmFsPSdmJywgYXJncmVwcj0nZicsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9NiwgYXJndmFsPTYsIGFyZ3JlcHI9JzYgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0yNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MSwgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD00LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0yLCBhcmd2YWw9J2MnLCBhcmdyZXByPSdjJywgb2Zmc2V0PTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTMsIGFyZ3ZhbD0nZCcsIGFyZ3JlcHI9J2QnLCBvZmZzZXQ9OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2UnLCBhcmdyZXByPSdlJywgb2Zmc2V0PTEwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTEsIGFyZ3ZhbD0nZicsIGFyZ3JlcHI9J2YnLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTYsIGFyZ3ZhbD02LCBhcmdyZXByPScnLCBvZmZzZXQ9MTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKIF0KIAogZXhwZWN0ZWRfb3BpbmZvX2p1bXB5ID0gWwotICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0xPT1AnLCBvcGNvZGU9MTIwLCBhcmc9NjgsIGFyZ3ZhbD03MSwgYXJncmVwcj0ndG8gNzEnLCBvZmZzZXQ9MCwgc3RhcnRzX2xpbmU9MywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncmFuZ2UnLCBhcmdyZXByPSdyYW5nZScsIG9mZnNldD0zLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0xLCBhcmd2YWw9MTAsIGFyZ3JlcHI9JzEwJywgb2Zmc2V0PTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTksIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdHRVRfSVRFUicsIG9wY29kZT02OCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdGT1JfSVRFUicsIG9wY29kZT05MywgYXJnPTQ0LCBhcmd2YWw9NjAsIGFyZ3JlcHI9J3RvIDYwJywgb2Zmc2V0PTEzLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTksIHN0YXJ0c19saW5lPTQsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0yMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MjUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTI4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MjksIHN0YXJ0c19saW5lPTUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD00LCBhcmdyZXByPSc0Jywgb2Zmc2V0PTMyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz0wLCBhcmd2YWw9JzwnLCBhcmdyZXByPSc8Jywgb2Zmc2V0PTM1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9NDQsIGFyZ3ZhbD00NCwgYXJncmVwcj0nJywgb2Zmc2V0PTM4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz0xMywgYXJndmFsPTEzLCBhcmdyZXByPScnLCBvZmZzZXQ9NDEsIHN0YXJ0c19saW5lPTYsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD00NCwgc3RhcnRzX2xpbmU9NywgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0zLCBhcmd2YWw9NiwgYXJncmVwcj0nNicsIG9mZnNldD00Nywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9NCwgYXJndmFsPSc+JywgYXJncmVwcj0nPicsIG9mZnNldD01MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTEzLCBhcmd2YWw9MTMsIGFyZ3JlcHI9JycsIG9mZnNldD01Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0JSRUFLX0xPT1AnLCBvcGNvZGU9ODAsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTU2LCBzdGFydHNfbGluZT04LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz0xMywgYXJndmFsPTEzLCBhcmdyZXByPScnLCBvZmZzZXQ9NTcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTYwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9NjEsIHN0YXJ0c19saW5lPTEwLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz00LCBhcmd2YWw9J0kgY2FuIGhheiBlbHNlIGNsYXVzZT8nLCBhcmdyZXByPSInSSBjYW4gaGF6IGVsc2UgY2xhdXNlPyciLCBvZmZzZXQ9NjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTY3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD03MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0xPT1AnLCBvcGNvZGU9MTIwLCBhcmc9NjgsIGFyZ3ZhbD0xNDIsIGFyZ3JlcHI9J3RvIDE0MicsIG9mZnNldD03MSwgc3RhcnRzX2xpbmU9MTEsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTc0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz0xMzEsIGFyZ3ZhbD0xMzEsIGFyZ3JlcHI9JycsIG9mZnNldD03Nywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD04MCwgc3RhcnRzX2xpbmU9MTIsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD04Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9ODYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTg5LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9OTAsIHN0YXJ0c19saW5lPTEzLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz01LCBhcmd2YWw9MSwgYXJncmVwcj0nMScsIG9mZnNldD05Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0lOUExBQ0VfU1VCVFJBQ1QnLCBvcGNvZGU9NTYsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTk2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTk3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTAwLCBzdGFydHNfbGluZT0xNCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MywgYXJndmFsPTYsIGFyZ3JlcHI9JzYnLCBvZmZzZXQ9MTAzLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz00LCBhcmd2YWw9Jz4nLCBhcmdyZXByPSc+Jywgb2Zmc2V0PTEwNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTExNSwgYXJndmFsPTExNSwgYXJncmVwcj0nJywgb2Zmc2V0PTEwOSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfQUJTT0xVVEUnLCBvcGNvZGU9MTEzLCBhcmc9NzQsIGFyZ3ZhbD03NCwgYXJncmVwcj0nJywgb2Zmc2V0PTExMiwgc3RhcnRzX2xpbmU9MTUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0xMTUsIHN0YXJ0c19saW5lPTE2LCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD00LCBhcmdyZXByPSc0Jywgb2Zmc2V0PTExOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9MCwgYXJndmFsPSc8JywgYXJncmVwcj0nPCcsIG9mZnNldD0xMjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz03NCwgYXJndmFsPTc0LCBhcmdyZXByPScnLCBvZmZzZXQ9MTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQlJFQUtfTE9PUCcsIG9wY29kZT04MCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTI3LCBzdGFydHNfbGluZT0xNywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfQUJTT0xVVEUnLCBvcGNvZGU9MTEzLCBhcmc9NzQsIGFyZ3ZhbD03NCwgYXJncmVwcj0nJywgb2Zmc2V0PTEyOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTMxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTMyLCBzdGFydHNfbGluZT0xOSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NiwgYXJndmFsPSdXaG8gbGV0IGxvbGNhdHogaW50byB0aGlzIHRlc3Qgc3VpdGU/JywgYXJncmVwcj0iJ1dobyBsZXQgbG9sY2F0eiBpbnRvIHRoaXMgdGVzdCBzdWl0ZT8nIiwgb2Zmc2V0PTEzNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MTM4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNDEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9GSU5BTExZJywgb3Bjb2RlPTEyMiwgYXJnPTczLCBhcmd2YWw9MjE4LCBhcmdyZXByPSd0byAyMTgnLCBvZmZzZXQ9MTQyLCBzdGFydHNfbGluZT0yMCwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU0VUVVBfRVhDRVBUJywgb3Bjb2RlPTEyMSwgYXJnPTEyLCBhcmd2YWw9MTYwLCBhcmdyZXByPSd0byAxNjAnLCBvZmZzZXQ9MTQ1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz01LCBhcmd2YWw9MSwgYXJncmVwcj0nMScsIG9mZnNldD0xNDgsIHN0YXJ0c19saW5lPTIxLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz03LCBhcmd2YWw9MCwgYXJncmVwcj0nMCcsIG9mZnNldD0xNTEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCSU5BUllfVFJVRV9ESVZJREUnLCBvcGNvZGU9MjcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE1NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTU1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0JMT0NLJywgb3Bjb2RlPTg3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0ZPUldBUkQnLCBvcGNvZGU9MTEwLCBhcmc9MjgsIGFyZ3ZhbD0xODgsIGFyZ3JlcHI9J3RvIDE4OCcsIG9mZnNldD0xNTcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdEVVBfVE9QJywgb3Bjb2RlPTQsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE2MCwgc3RhcnRzX2xpbmU9MjIsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTIsIGFyZ3ZhbD0nWmVyb0RpdmlzaW9uRXJyb3InLCBhcmdyZXByPSdaZXJvRGl2aXNpb25FcnJvcicsIG9mZnNldD0xNjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDT01QQVJFX09QJywgb3Bjb2RlPTEwNywgYXJnPTEwLCBhcmd2YWw9J2V4Y2VwdGlvbiBtYXRjaCcsIGFyZ3JlcHI9J2V4Y2VwdGlvbiBtYXRjaCcsIG9mZnNldD0xNjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz0xODcsIGFyZ3ZhbD0xODcsIGFyZ3JlcHI9JycsIG9mZnNldD0xNjcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE3MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTcxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNzIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTczLCBzdGFydHNfbGluZT0yMywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9OCwgYXJndmFsPSdIZXJlIHdlIGdvLCBoZXJlIHdlIGdvLCBoZXJlIHdlIGdvLi4uJywgYXJncmVwcj0iJ0hlcmUgd2UgZ28sIGhlcmUgd2UgZ28sIGhlcmUgd2UgZ28uLi4nIiwgb2Zmc2V0PTE3Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MTc5LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xODIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfRVhDRVBUJywgb3Bjb2RlPTg5LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xODMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0ZPUldBUkQnLCBvcGNvZGU9MTEwLCBhcmc9MjcsIGFyZ3ZhbD0yMTQsIGFyZ3JlcHI9J3RvIDIxNCcsIG9mZnNldD0xODQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdFTkRfRklOQUxMWScsIG9wY29kZT04OCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTg3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0xODgsIHN0YXJ0c19saW5lPTI1LCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9XSVRIJywgb3Bjb2RlPTE0MywgYXJnPTE3LCBhcmd2YWw9MjExLCBhcmdyZXByPSd0byAyMTEnLCBvZmZzZXQ9MTkxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0xLCBhcmd2YWw9J2RvZGd5JywgYXJncmVwcj0nZG9kZ3knLCBvZmZzZXQ9MTk0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTE5Nywgc3RhcnRzX2xpbmU9MjYsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTksIGFyZ3ZhbD0nTmV2ZXIgcmVhY2ggdGhpcycsIGFyZ3JlcHI9IidOZXZlciByZWFjaCB0aGlzJyIsIG9mZnNldD0yMDAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTIwMywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjA2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0JMT0NLJywgb3Bjb2RlPTg3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yMDcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTIwOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1dJVEhfQ0xFQU5VUF9TVEFSVCcsIG9wY29kZT04MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjExLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdXSVRIX0NMRUFOVVBfRklOSVNIJywgb3Bjb2RlPTgyLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yMTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdFTkRfRklOQUxMWScsIG9wY29kZT04OCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjEzLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0JMT0NLJywgb3Bjb2RlPTg3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yMTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MCwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9J05vbmUnLCBvZmZzZXQ9MjE1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTIxOCwgc3RhcnRzX2xpbmU9MjgsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MTAsIGFyZ3ZhbD0iT0ssIG5vdyB3ZSdyZSBkb25lIiwgYXJncmVwcj0nIk9LLCBub3cgd2VcJ3JlIGRvbmUiJywgb2Zmc2V0PTIyMSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MjI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yMjcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdFTkRfRklOQUxMWScsIG9wY29kZT04OCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjI4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0yMjksIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdSRVRVUk5fVkFMVUUnLCBvcGNvZGU9ODMsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIzMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0xPT1AnLCBvcGNvZGU9MTIwLCBhcmc9NTIsIGFyZ3ZhbD01NCwgYXJncmVwcj0ndG8gNTQnLCBvZmZzZXQ9MCwgc3RhcnRzX2xpbmU9MywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncmFuZ2UnLCBhcmdyZXByPSdyYW5nZScsIG9mZnNldD0yLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0xLCBhcmd2YWw9MTAsIGFyZ3JlcHI9JzEwJywgb2Zmc2V0PTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScnLCBvZmZzZXQ9Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0dFVF9JVEVSJywgb3Bjb2RlPTY4LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD04LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nRk9SX0lURVInLCBvcGNvZGU9OTMsIGFyZz0zMiwgYXJndmFsPTQ0LCBhcmdyZXByPSd0byA0NCcsIG9mZnNldD0xMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTE0LCBzdGFydHNfbGluZT00LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScnLCBvZmZzZXQ9MTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MjIsIHN0YXJ0c19saW5lPTUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD00LCBhcmdyZXByPSc0Jywgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz0wLCBhcmd2YWw9JzwnLCBhcmdyZXByPSc8Jywgb2Zmc2V0PTI2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9MzIsIGFyZ3ZhbD0zMiwgYXJncmVwcj0nJywgb2Zmc2V0PTI4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz0xMCwgYXJndmFsPTEwLCBhcmdyZXByPScnLCBvZmZzZXQ9MzAsIHN0YXJ0c19saW5lPTYsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0zMiwgc3RhcnRzX2xpbmU9NywgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0zLCBhcmd2YWw9NiwgYXJncmVwcj0nNicsIG9mZnNldD0zNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9NCwgYXJndmFsPSc+JywgYXJncmVwcj0nPicsIG9mZnNldD0zNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTEwLCBhcmd2YWw9MTAsIGFyZ3JlcHI9JycsIG9mZnNldD0zOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0JSRUFLX0xPT1AnLCBvcGNvZGU9ODAsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTQwLCBzdGFydHNfbGluZT04LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz0xMCwgYXJndmFsPTEwLCBhcmdyZXByPScnLCBvZmZzZXQ9NDIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTQ0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9NDYsIHN0YXJ0c19saW5lPTEwLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz00LCBhcmd2YWw9J0kgY2FuIGhheiBlbHNlIGNsYXVzZT8nLCBhcmdyZXByPSInSSBjYW4gaGF6IGVsc2UgY2xhdXNlPyciLCBvZmZzZXQ9NDgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScnLCBvZmZzZXQ9NTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTUyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nU0VUVVBfTE9PUCcsIG9wY29kZT0xMjAsIGFyZz01MiwgYXJndmFsPTEwOCwgYXJncmVwcj0ndG8gMTA4Jywgb2Zmc2V0PTU0LCBzdGFydHNfbGluZT0xMSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9NTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTk4LCBhcmd2YWw9OTgsIGFyZ3JlcHI9JycsIG9mZnNldD01OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD02MCwgc3RhcnRzX2xpbmU9MTIsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD02Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JycsIG9mZnNldD02NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NjYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD02OCwgc3RhcnRzX2xpbmU9MTMsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTUsIGFyZ3ZhbD0xLCBhcmdyZXByPScxJywgb2Zmc2V0PTcwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSU5QTEFDRV9TVUJUUkFDVCcsIG9wY29kZT01NiwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NzIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9NzQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD03Niwgc3RhcnRzX2xpbmU9MTQsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTMsIGFyZ3ZhbD02LCBhcmdyZXByPSc2Jywgb2Zmc2V0PTc4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz00LCBhcmd2YWw9Jz4nLCBhcmdyZXByPSc+Jywgb2Zmc2V0PTgwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9ODYsIGFyZ3ZhbD04NiwgYXJncmVwcj0nJywgb2Zmc2V0PTgyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz01NiwgYXJndmFsPTU2LCBhcmdyZXByPScnLCBvZmZzZXQ9ODQsIHN0YXJ0c19saW5lPTE1LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9ODYsIHN0YXJ0c19saW5lPTE2LCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD00LCBhcmdyZXByPSc0Jywgb2Zmc2V0PTg4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz0wLCBhcmd2YWw9JzwnLCBhcmdyZXByPSc8Jywgb2Zmc2V0PTkwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9NTYsIGFyZ3ZhbD01NiwgYXJncmVwcj0nJywgb2Zmc2V0PTkyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQlJFQUtfTE9PUCcsIG9wY29kZT04MCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9OTQsIHN0YXJ0c19saW5lPTE3LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz01NiwgYXJndmFsPTU2LCBhcmdyZXByPScnLCBvZmZzZXQ9OTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTk4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTAwLCBzdGFydHNfbGluZT0xOSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NiwgYXJndmFsPSdXaG8gbGV0IGxvbGNhdHogaW50byB0aGlzIHRlc3Qgc3VpdGU/JywgYXJncmVwcj0iJ1dobyBsZXQgbG9sY2F0eiBpbnRvIHRoaXMgdGVzdCBzdWl0ZT8nIiwgb2Zmc2V0PTEwMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JycsIG9mZnNldD0xMDQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEwNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0ZJTkFMTFknLCBvcGNvZGU9MTIyLCBhcmc9NzAsIGFyZ3ZhbD0xODAsIGFyZ3JlcHI9J3RvIDE4MCcsIG9mZnNldD0xMDgsIHN0YXJ0c19saW5lPTIwLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9FWENFUFQnLCBvcGNvZGU9MTIxLCBhcmc9MTIsIGFyZ3ZhbD0xMjQsIGFyZ3JlcHI9J3RvIDEyNCcsIG9mZnNldD0xMTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTUsIGFyZ3ZhbD0xLCBhcmdyZXByPScxJywgb2Zmc2V0PTExMiwgc3RhcnRzX2xpbmU9MjEsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTcsIGFyZ3ZhbD0wLCBhcmdyZXByPScwJywgb2Zmc2V0PTExNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0JJTkFSWV9UUlVFX0RJVklERScsIG9wY29kZT0yNywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTE2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xMTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEyMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfRk9SV0FSRCcsIG9wY29kZT0xMTAsIGFyZz0yOCwgYXJndmFsPTE1MiwgYXJncmVwcj0ndG8gMTUyJywgb2Zmc2V0PTEyMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0RVUF9UT1AnLCBvcGNvZGU9NCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTI0LCBzdGFydHNfbGluZT0yMiwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MiwgYXJndmFsPSdaZXJvRGl2aXNpb25FcnJvcicsIGFyZ3JlcHI9J1plcm9EaXZpc2lvbkVycm9yJywgb2Zmc2V0PTEyNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9MTAsIGFyZ3ZhbD0nZXhjZXB0aW9uIG1hdGNoJywgYXJncmVwcj0nZXhjZXB0aW9uIG1hdGNoJywgb2Zmc2V0PTEyOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTE1MCwgYXJndmFsPTE1MCwgYXJncmVwcj0nJywgb2Zmc2V0PTEzMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTMyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xMzQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEzNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xMzgsIHN0YXJ0c19saW5lPTIzLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz04LCBhcmd2YWw9J0hlcmUgd2UgZ28sIGhlcmUgd2UgZ28sIGhlcmUgd2UgZ28uLi4nLCBhcmdyZXByPSInSGVyZSB3ZSBnbywgaGVyZSB3ZSBnbywgaGVyZSB3ZSBnby4uLiciLCBvZmZzZXQ9MTQwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nJywgb2Zmc2V0PTE0Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTQ0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0VYQ0VQVCcsIG9wY29kZT04OSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTQ2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9GT1JXQVJEJywgb3Bjb2RlPTExMCwgYXJnPTI2LCBhcmd2YWw9MTc2LCBhcmdyZXByPSd0byAxNzYnLCBvZmZzZXQ9MTQ4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nRU5EX0ZJTkFMTFknLCBvcGNvZGU9ODgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE1MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTUyLCBzdGFydHNfbGluZT0yNSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nU0VUVVBfV0lUSCcsIG9wY29kZT0xNDMsIGFyZz0xNCwgYXJndmFsPTE3MCwgYXJncmVwcj0ndG8gMTcwJywgb2Zmc2V0PTE1NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MSwgYXJndmFsPSdkb2RneScsIGFyZ3JlcHI9J2RvZGd5Jywgb2Zmc2V0PTE1Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xNTgsIHN0YXJ0c19saW5lPTI2LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz05LCBhcmd2YWw9J05ldmVyIHJlYWNoIHRoaXMnLCBhcmdyZXByPSInTmV2ZXIgcmVhY2ggdGhpcyciLCBvZmZzZXQ9MTYwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nJywgb2Zmc2V0PTE2Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTY0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0JMT0NLJywgb3Bjb2RlPTg3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNjYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTE2OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1dJVEhfQ0xFQU5VUF9TVEFSVCcsIG9wY29kZT04MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTcwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdXSVRIX0NMRUFOVVBfRklOSVNIJywgb3Bjb2RlPTgyLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNzIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdFTkRfRklOQUxMWScsIG9wY29kZT04OCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTc0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0JMT0NLJywgb3Bjb2RlPTg3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNzYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MCwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9J05vbmUnLCBvZmZzZXQ9MTc4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTE4MCwgc3RhcnRzX2xpbmU9MjgsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MTAsIGFyZ3ZhbD0iT0ssIG5vdyB3ZSdyZSBkb25lIiwgYXJncmVwcj0nIk9LLCBub3cgd2VcJ3JlIGRvbmUiJywgb2Zmc2V0PTE4Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JycsIG9mZnNldD0xODQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE4Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0VORF9GSU5BTExZJywgb3Bjb2RlPTg4LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xODgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTE5MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTkyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCiBdCiAKICMgT25lIGxhc3QgcGllY2Ugb2YgaW5zcGVjdCBmb2RkZXIgdG8gY2hlY2sgdGhlIGRlZmF1bHQgbGluZSBudW1iZXIgaGFuZGxpbmcKIGRlZiBzaW1wbGUoKTogcGFzcwogZXhwZWN0ZWRfb3BpbmZvX3NpbXBsZSA9IFsKICAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPXNpbXBsZS5fX2NvZGVfXy5jb19maXJzdGxpbmVubywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSkKIF0KIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKaW5kZXggMzMxNjNiOS4uMjI1OGM2YiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQpAQCAtMjkxLDcgKzI5MSw3IEBACiAgICAgLi4uCiAgICAgLi4uIE5vbi1leGFtcGxlIHRleHQuCiAgICAgLi4uCi0gICAgLi4uICAgICA+Pj4gcHJpbnQoJ2Fub3RoZXJcZXhhbXBsZScpCisgICAgLi4uICAgICA+Pj4gcHJpbnQoJ2Fub3RoZXJcXGV4YW1wbGUnKQogICAgIC4uLiAgICAgYW5vdGhlcgogICAgIC4uLiAgICAgZXhhbXBsZQogICAgIC4uLiAnJycKQEAgLTE4NzYsNyArMTg3Niw2IEBACiAgICAgICAgIFRvIGRlbW9uc3RyYXRlIHRoaXMsIHdlJ2xsIGNyZWF0ZSBhIGZha2Ugc3RhbmRhcmQgaW5wdXQgdGhhdAogICAgICAgICBjYXB0dXJlcyBvdXIgZGVidWdnZXIgaW5wdXQ6CiAKLSAgICAgICAgICA+Pj4gaW1wb3J0IHRlbXBmaWxlCiAgICAgICAgICAgPj4+IHJlYWxfc3RkaW4gPSBzeXMuc3RkaW4KICAgICAgICAgICA+Pj4gc3lzLnN0ZGluID0gX0Zha2VJbnB1dChbCiAgICAgICAgICAgLi4uICAgICdwcmludCh4KScsICAjIHByaW50IGRhdGEgZGVmaW5lZCBieSB0aGUgZXhhbXBsZQpAQCAtMTkxNyw3ICsxOTE2LDcgQEAKICAgICAgICAgICAuLi4gZmluYWxseToKICAgICAgICAgICAuLi4gICAgIHN5cy5zdGRpbiA9IHJlYWxfc3RkaW4KICAgICAgICAgICAtLVJldHVybi0tCi0gICAgICAgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VbOF0+KDMpY2FsbHNfc2V0X3RyYWNlKCktPk5vbmUKKyAgICAgICAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZVs3XT4oMyljYWxsc19zZXRfdHJhY2UoKS0+Tm9uZQogICAgICAgICAgIC0+IGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgICAgICAgIChQZGIpIHByaW50KHkpCiAgICAgICAgICAgMgpAQCAtMjc5OCw3ICsyNzk3LDYgQEAKICAgICAuLi4gICAgICAgICBfID0gZi53cml0ZSgiICAgICAgICdhYmMgZGVmJ1xuIikKICAgICAuLi4gICAgICAgICBfID0gZi53cml0ZSgiXG4iKQogICAgIC4uLiAgICAgICAgIF8gPSBmLndyaXRlKCcgICBcIlwiXCJcbicpCi0gICAgLi4uICAgICBpbXBvcnQgc2h1dGlsCiAgICAgLi4uICAgICByYzEsIG91dDEsIGVycjEgPSBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fZmFpbHVyZSgKICAgICAuLi4gICAgICAgICAgICAgJy1tJywgJ2RvY3Rlc3QnLCBmbiwgZm4yKQogICAgIC4uLiAgICAgcmMyLCBvdXQyLCBlcnIyID0gc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX29rKApAQCAtMjk0MiwxMiArMjk0MCwxMSBAQAogZGVmIHRlc3RfbWFpbigpOgogICAgICMgQ2hlY2sgdGhlIGRvY3Rlc3QgY2FzZXMgaW4gZG9jdGVzdCBpdHNlbGY6CiAgICAgcmV0ID0gc3VwcG9ydC5ydW5fZG9jdGVzdChkb2N0ZXN0LCB2ZXJib3NpdHk9VHJ1ZSkKKwogICAgICMgQ2hlY2sgdGhlIGRvY3Rlc3QgY2FzZXMgZGVmaW5lZCBoZXJlOgogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9kb2N0ZXN0CiAgICAgc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X2RvY3Rlc3QsIHZlcmJvc2l0eT1UcnVlKQogCi1pbXBvcnQgc3lzLCByZSwgaW8KLQogZGVmIHRlc3RfY292ZXJhZ2UoY292ZXJkaXIpOgogICAgIHRyYWNlID0gc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0cmFjZScpCiAgICAgdHJhY2VyID0gdHJhY2UuVHJhY2UoaWdub3JlZGlycz1bc3lzLmJhc2VfcHJlZml4LCBzeXMuYmFzZV9leGVjX3ByZWZpeCxdLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9keW5hbWljLnB5IGIvTGliL3Rlc3QvdGVzdF9keW5hbWljLnB5CmluZGV4IDUwODBlYzkuLjNhZTA5MGYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZHluYW1pYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2R5bmFtaWMucHkKQEAgLTEsNyArMSw2IEBACiAjIFRlc3QgdGhlIG1vc3QgZHluYW1pYyBjb3JuZXIgY2FzZXMgb2YgUHl0aG9uJ3MgcnVudGltZSBzZW1hbnRpY3MuCiAKIGltcG9ydCBidWlsdGlucwotaW1wb3J0IGNvbnRleHRsaWIKIGltcG9ydCB1bml0dGVzdAogCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgc3dhcF9pdGVtLCBzd2FwX2F0dHIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZWludHIucHkgYi9MaWIvdGVzdC90ZXN0X2VpbnRyLnB5CmluZGV4IGFhYmFkODMuLjI1Zjg2ZDMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZWludHIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9laW50ci5weQpAQCAtMSw3ICsxLDUgQEAKIGltcG9ydCBvcwogaW1wb3J0IHNpZ25hbAotaW1wb3J0IHN1YnByb2Nlc3MKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKQEAgLTE2LDE0ICsxNCw4IEBACiAgICAgICAgICMgUnVuIHRoZSB0ZXN0ZXIgaW4gYSBzdWItcHJvY2VzcywgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG9ubHkgb25lCiAgICAgICAgICMgdGhyZWFkIChmb3IgcmVsaWFibGUgc2lnbmFsIGRlbGl2ZXJ5KS4KICAgICAgICAgdGVzdGVyID0gc3VwcG9ydC5maW5kZmlsZSgiZWludHJfdGVzdGVyLnB5Iiwgc3ViZGlyPSJlaW50cmRhdGEiKQotCi0gICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgIGFyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHRlc3Rlcl0KLSAgICAgICAgICAgIHdpdGggc3VicHJvY2Vzcy5Qb3BlbihhcmdzKSBhcyBwcm9jOgotICAgICAgICAgICAgICAgIGV4aXRjb2RlID0gcHJvYy53YWl0KCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhpdGNvZGUsIDApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2sodGVzdGVyKQorICAgICAgICAjIHVzZSAtdSB0byB0cnkgdG8gZ2V0IHRoZSBmdWxsIG91dHB1dCBpZiB0aGUgdGVzdCBoYW5ncyBvciBjcmFzaAorICAgICAgICBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2soIi11IiwgdGVzdGVyKQogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VtYWlsL19faW5pdF9fLnB5IGIvTGliL3Rlc3QvdGVzdF9lbWFpbC9fX2luaXRfXy5weQppbmRleCBkNGEwM2VlLi44ODg3NTFlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VtYWlsL19faW5pdF9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvX19pbml0X18ucHkKQEAgLTEsNSArMSw0IEBACiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgZW1haWwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9faGVhZGVyX3ZhbHVlX3BhcnNlci5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9faGVhZGVyX3ZhbHVlX3BhcnNlci5weQppbmRleCBmN2FjMGUzLi4yNmVjZTY5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfX2hlYWRlcl92YWx1ZV9wYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X19oZWFkZXJfdmFsdWVfcGFyc2VyLnB5CkBAIC01ODEsNyArNTgxLDcgQEAKIAogICAgIGRlZiB0ZXN0X2dldF9jb21tZW50X3F1b3RlZF9wYXJlbnMoc2VsZik6CiAgICAgICAgIHNlbGYuX3Rlc3RfZ2V0X3gocGFyc2VyLmdldF9jb21tZW50LAotICAgICAgICAgICAgJyhmb29cKSBcKFwpYmFyKScsICcoZm9vXCkgXChcKWJhciknLCAnICcsIFtdLCAnJywgWydmb28pICgpYmFyJ10pCisgICAgICAgICAgICByJyhmb29cKSBcKFwpYmFyKScsIHInKGZvb1wpIFwoXCliYXIpJywgJyAnLCBbXSwgJycsIFsnZm9vKSAoKWJhciddKQogCiAgICAgZGVmIHRlc3RfZ2V0X2NvbW1lbnRfbm9uX3ByaW50YWJsZShzZWxmKToKICAgICAgICAgc2VsZi5fdGVzdF9nZXRfeChwYXJzZXIuZ2V0X2NvbW1lbnQsCkBAIC02MjUsNyArNjI1LDcgQEAKIAogICAgIGRlZiB0ZXN0X2dldF9jb21tZW50X3FzX2luX25lc3RlZF9jb21tZW50KHNlbGYpOgogICAgICAgICBjb21tZW50ID0gc2VsZi5fdGVzdF9nZXRfeChwYXJzZXIuZ2V0X2NvbW1lbnQsCi0gICAgICAgICAgICAnKGZvbyAoYlwpKSknLCAnKGZvbyAoYlwpKSknLCAnICcsIFtdLCAnJywgWydmb28gKGJcKSknXSkKKyAgICAgICAgICAgIHInKGZvbyAoYlwpKSknLCByJyhmb28gKGJcKSkpJywgJyAnLCBbXSwgJycsIFtyJ2ZvbyAoYlwpKSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbW1lbnRbMl0uY29udGVudCwgJ2IpJykKIAogICAgICMgZ2V0X2Nmd3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9hc2lhbl9jb2RlY3MucHkgYi9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfYXNpYW5fY29kZWNzLnB5CmluZGV4IGY5Y2Q3ZDkuLjFlMGNhZWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9hc2lhbl9jb2RlY3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2FzaWFuX2NvZGVjcy5weQpAQCAtMyw3ICszLDYgQEAKICMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzIGZvciAob3B0aW9uYWwpIEFzaWFuIGNvZGVjcwogCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKIAogZnJvbSB0ZXN0LnRlc3RfZW1haWwgaW1wb3J0IFRlc3RFbWFpbEJhc2UKIGZyb20gZW1haWwuY2hhcnNldCBpbXBvcnQgQ2hhcnNldApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2VtYWlsLnB5IGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2VtYWlsLnB5CmluZGV4IDFkNTBmZWIuLmU5NWYwOGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9lbWFpbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfZW1haWwucHkKQEAgLTMxLDYgKzMxLDcgQEAKIGZyb20gZW1haWwubWltZS5iYXNlIGltcG9ydCBNSU1FQmFzZQogZnJvbSBlbWFpbC5taW1lLm1lc3NhZ2UgaW1wb3J0IE1JTUVNZXNzYWdlCiBmcm9tIGVtYWlsLm1pbWUubXVsdGlwYXJ0IGltcG9ydCBNSU1FTXVsdGlwYXJ0Citmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CiBmcm9tIGVtYWlsIGltcG9ydCB1dGlscwogZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCiBmcm9tIGVtYWlsIGltcG9ydCBlbmNvZGVycwpAQCAtMjA2NSw3ICsyMDY2LDEzIEBACiAtLT09PT09PT09PT09PT09PTAwMTIzOTQxNjQ9PS0tIiIiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ2V0X3BheWxvYWQoMCkuZ2V0X3BheWxvYWQoKSwgJ1lYTmtaZz09JykKIAorICAgIGRlZiB0ZXN0X21pbWViYXNlX2RlZmF1bHRfcG9saWN5KHNlbGYpOgorICAgICAgICBtID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobS5wb2xpY3ksIGVtYWlsLnBvbGljeS5jb21wYXQzMikKIAorICAgIGRlZiB0ZXN0X21pbWViYXNlX2N1c3RvbV9wb2xpY3koc2VsZik6CisgICAgICAgIG0gPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJywgcG9saWN5PWVtYWlsLnBvbGljeS5kZWZhdWx0KQorICAgICAgICBzZWxmLmFzc2VydElzKG0ucG9saWN5LCBlbWFpbC5wb2xpY3kuZGVmYXVsdCkKIAogIyBUZXN0IHNvbWUgYmFkbHkgZm9ybWF0dGVkIG1lc3NhZ2VzCiBjbGFzcyBUZXN0Tm9uQ29uZm9ybWFudChUZXN0RW1haWxCYXNlKToKQEAgLTI2NjcsNiArMjY3NCwxOSBAQAogICAgICAgICBtc2cgPSBNSU1FTXVsdGlwYXJ0KCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5pc19tdWx0aXBhcnQoKSkKIAorICAgIGRlZiB0ZXN0X211bHRpcGFydF9kZWZhdWx0X3BvbGljeShzZWxmKToKKyAgICAgICAgbXNnID0gTUlNRU11bHRpcGFydCgpCisgICAgICAgIG1zZ1snVG8nXSA9ICdhQGIuY29tJworICAgICAgICBtc2dbJ1RvJ10gPSAnY0BkLmNvbScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2FsbCgndG8nKSwgWydhQGIuY29tJywgJ2NAZC5jb20nXSkKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9jdXN0b21fcG9saWN5KHNlbGYpOgorICAgICAgICBtc2cgPSBNSU1FTXVsdGlwYXJ0KHBvbGljeT1lbWFpbC5wb2xpY3kuZGVmYXVsdCkKKyAgICAgICAgbXNnWydUbyddID0gJ2FAYi5jb20nCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgY206CisgICAgICAgICAgICBtc2dbJ1RvJ10gPSAnY0BkLmNvbScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlcmUgbWF5IGJlIGF0IG1vc3QgMSBUbyBoZWFkZXJzIGluIGEgbWVzc2FnZScpCiAKICMgQSBnZW5lcmFsIHRlc3Qgb2YgcGFyc2VyLT5tb2RlbC0+Z2VuZXJhdG9yIGlkZW1wb3RlbmN5LiAgSU9XLCByZWFkIGEgbWVzc2FnZQogIyBpbiwgcGFyc2UgaXQgaW50byBhIG1lc3NhZ2Ugb2JqZWN0IHRyZWUsIHRoZW4gd2l0aG91dCB0b3VjaGluZyB0aGUgdHJlZSwKQEAgLTMwMjAsNyArMzA0MCw3IEBACiAKICAgICBkZWYgdGVzdF9lc2NhcGVfYmFja3NsYXNoZXMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICAgICB1dGlscy5mb3JtYXRhZGRyKCgnQXJ0aHVyIFxCYWNrc2xhc2hcIEZvb2JhcicsICdwZXJzb25AZG9tLmFpbicpKSwKKyAgICAgICAgICAgIHV0aWxzLmZvcm1hdGFkZHIoKHInQXJ0aHVyIFxCYWNrc2xhc2hcIEZvb2JhcicsICdwZXJzb25AZG9tLmFpbicpKSwKICAgICAgICAgICAgIHInIkFydGh1ciBcXEJhY2tzbGFzaFxcIEZvb2JhciIgPHBlcnNvbkBkb20uYWluPicpCiAgICAgICAgIGEgPSByJ0FydGh1ciBcQmFja3NsYXNoXCBGb29iYXInCiAgICAgICAgIGIgPSAncGVyc29uQGRvbS5haW4nCkBAIC0zMzE2LDYgKzMzMzYsMjcgQEAKICAgICAgICAgZy5mbGF0dGVuKG1zZywgbGluZXNlcD0nXHJcbicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCBtc2d0eHQpCiAKKyAgICBkZWYgdGVzdF9taW1lX2NsYXNzZXNfcG9saWN5X2FyZ3VtZW50KHNlbGYpOgorICAgICAgICB3aXRoIG9wZW5maWxlKCdhdWRpb3Rlc3QuYXUnLCAncmInKSBhcyBmcDoKKyAgICAgICAgICAgIGF1ZGlvZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICB3aXRoIG9wZW5maWxlKCdQeUJhbm5lcjA0OC5naWYnLCAncmInKSBhcyBmcDoKKyAgICAgICAgICAgIGJpbmRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgY2xhc3NlcyA9IFsKKyAgICAgICAgICAgIChNSU1FQXBwbGljYXRpb24sICgnJywpKSwKKyAgICAgICAgICAgIChNSU1FQXVkaW8sIChhdWRpb2RhdGEsKSksCisgICAgICAgICAgICAoTUlNRUltYWdlLCAoYmluZGF0YSwpKSwKKyAgICAgICAgICAgIChNSU1FTWVzc2FnZSwgKE1lc3NhZ2UoKSwpKSwKKyAgICAgICAgICAgIChNSU1FTm9uTXVsdGlwYXJ0LCAoJ211bHRpcGFydCcsICdtaXhlZCcpKSwKKyAgICAgICAgICAgIChNSU1FVGV4dCwgKCcnLCkpLAorICAgICAgICBdCisgICAgICAgIGZvciBjbHMsIGNvbnN0cnVjdG9yIGluIGNsYXNzZXM6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChjbHM9Y2xzLl9fbmFtZV9fLCBwb2xpY3k9J2NvbXBhdDMyJyk6CisgICAgICAgICAgICAgICAgbSA9IGNscygqY29uc3RydWN0b3IpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhtLnBvbGljeSwgZW1haWwucG9saWN5LmNvbXBhdDMyKQorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoY2xzPWNscy5fX25hbWVfXywgcG9saWN5PSdkZWZhdWx0Jyk6CisgICAgICAgICAgICAgICAgbSA9IGNscygqY29uc3RydWN0b3IsIHBvbGljeT1lbWFpbC5wb2xpY3kuZGVmYXVsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKG0ucG9saWN5LCBlbWFpbC5wb2xpY3kuZGVmYXVsdCkKKwogCiAjIFRlc3QgdGhlIGl0ZXJhdG9yL2dlbmVyYXRvcnMKIGNsYXNzIFRlc3RJdGVyYXRvcnMoVGVzdEVtYWlsQmFzZSk6CkBAIC0zNDI0LDcgKzM0NjUsNiBAQAogY2xhc3MgVGVzdEZlZWRQYXJzZXJzKFRlc3RFbWFpbEJhc2UpOgogCiAgICAgZGVmIHBhcnNlKHNlbGYsIGNodW5rcyk6Ci0gICAgICAgIGZyb20gZW1haWwuZmVlZHBhcnNlciBpbXBvcnQgRmVlZFBhcnNlcgogICAgICAgICBmZWVkcGFyc2VyID0gRmVlZFBhcnNlcigpCiAgICAgICAgIGZvciBjaHVuayBpbiBjaHVua3M6CiAgICAgICAgICAgICBmZWVkcGFyc2VyLmZlZWQoY2h1bmspCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfZ2VuZXJhdG9yLnB5IGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2dlbmVyYXRvci5weQppbmRleCBiMWNiY2UyLi43Yzg4NzdmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfZ2VuZXJhdG9yLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9nZW5lcmF0b3IucHkKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgIGRlZiB0ZXN0X3NldF9tYW5nbGVfZnJvbV92aWFfcG9saWN5KHNlbGYpOgogICAgICAgICBzb3VyY2UgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAogICAgICAgICAgICAgU3ViamVjdDogdGVzdCB0aGF0Ci0gICAgICAgICAgICAgZnJvbSBpcyBtYW5nZWxkIGluIHRoZSBib2R5IQorICAgICAgICAgICAgIGZyb20gaXMgbWFuZ2xlZCBpbiB0aGUgYm9keSEKIAogICAgICAgICAgICAgRnJvbSB0aW1lIHRvIHRpbWUgSSB3cml0ZSBhIHJoeW1lLgogICAgICAgICAgICAgIiIiKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2hlYWRlcnJlZ2lzdHJ5LnB5IGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2hlYWRlcnJlZ2lzdHJ5LnB5CmluZGV4IDU1ZWNkZWEuLmFmODM2ZGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9oZWFkZXJyZWdpc3RyeS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfaGVhZGVycmVnaXN0cnkucHkKQEAgLTEsNyArMSw2IEBACiBpbXBvcnQgZGF0ZXRpbWUKIGltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdHlwZXMKIGZyb20gZW1haWwgaW1wb3J0IGVycm9ycwogZnJvbSBlbWFpbCBpbXBvcnQgcG9saWN5CiBmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9tZXNzYWdlLnB5IGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X21lc3NhZ2UucHkKaW5kZXggNDM0NTE2Mi4uZjNhNTdkZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X21lc3NhZ2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X21lc3NhZ2UucHkKQEAgLTc2NCw2ICs3NjQsMjYgQEAKICAgICAgICAgbS5zZXRfY29udGVudChjb250ZW50X21hbmFnZXI9Y20pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVsnTUlNRS1WZXJzaW9uJ10sICcxLjAnKQogCisgICAgZGVmIHRlc3RfYXNfc3RyaW5nX3VzZXNfbWF4X2hlYWRlcl9sZW5ndGhfYnlfZGVmYXVsdChzZWxmKToKKyAgICAgICAgbSA9IHNlbGYuX3N0cl9tc2coJ1N1YmplY3Q6IGxvbmcgbGluZScgKyAnIGFiJyo1MCArICdcblxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obS5hc19zdHJpbmcoKS5zdHJpcCgpLnNwbGl0bGluZXMoKSksIDMpCisKKyAgICBkZWYgdGVzdF9hc19zdHJpbmdfYWxsb3dzX21heGhlYWRlcmxlbihzZWxmKToKKyAgICAgICAgbSA9IHNlbGYuX3N0cl9tc2coJ1N1YmplY3Q6IGxvbmcgbGluZScgKyAnIGFiJyo1MCArICdcblxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obS5hc19zdHJpbmcobWF4aGVhZGVybGVuPTApLnN0cmlwKCkuc3BsaXRsaW5lcygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtLmFzX3N0cmluZyhtYXhoZWFkZXJsZW49MzQpLnN0cmlwKCkuc3BsaXRsaW5lcygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA2KQorCisgICAgZGVmIHRlc3Rfc3RyX2RlZmF1bHRzX3RvX3BvbGljeV9tYXhfbGluZV9sZW5ndGgoc2VsZik6CisgICAgICAgIG0gPSBzZWxmLl9zdHJfbXNnKCdTdWJqZWN0OiBsb25nIGxpbmUnICsgJyBhYicqNTAgKyAnXG5cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN0cihtKS5zdHJpcCgpLnNwbGl0bGluZXMoKSksIDMpCisKKyAgICBkZWYgdGVzdF9zdHJfZGVmYXVsdHNfdG9fdXRmOChzZWxmKToKKyAgICAgICAgbSA9IEVtYWlsTWVzc2FnZSgpCisgICAgICAgIG1bJ1N1YmplY3QnXSA9ICd1bmljw7ZkZScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobSksICdTdWJqZWN0OiB1bmljw7ZkZVxuXG4nKQorCiAKIGNsYXNzIFRlc3RNSU1FUGFydChUZXN0RW1haWxNZXNzYWdlQmFzZSwgVGVzdEVtYWlsQmFzZSk6CiAgICAgIyBEb2luZyB0aGUgZnVsbCB0ZXN0IHJ1biBoZXJlIG1heSBzZWVtIGEgYml0IHJlZHVuZGFudCwgc2luY2UgdGhlIHR3bwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbnVtLnB5IGIvTGliL3Rlc3QvdGVzdF9lbnVtLnB5CmluZGV4IDYzMGIxNTUuLjY5OGZkMzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZW51bS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VudW0ucHkKQEAgLTMsOSArMywxMCBAQAogaW1wb3J0IHB5ZG9jCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0Ci1mcm9tIGVudW0gaW1wb3J0IEVudW0sIEludEVudW0sIEVudW1NZXRhLCB1bmlxdWUKK2Zyb20gZW51bSBpbXBvcnQgRW51bSwgSW50RW51bSwgRW51bU1ldGEsIEZsYWcsIEludEZsYWcsIHVuaXF1ZQogZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KIGZyb20gcGlja2xlIGltcG9ydCBkdW1wcywgbG9hZHMsIFBpY2tsaW5nRXJyb3IsIEhJR0hFU1RfUFJPVE9DT0wKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAjIGZvciBwaWNrbGUgdGVzdHMKIHRyeToKQEAgLTMyLDYgKzMzLDE0IEBACiBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICBGbG9hdFN0b29nZXMgPSBleGMKIAordHJ5OgorICAgIGNsYXNzIEZsYWdTdG9vZ2VzKEZsYWcpOgorICAgICAgICBMQVJSWSA9IDEKKyAgICAgICAgQ1VSTFkgPSAyCisgICAgICAgIE1PRSA9IDMKK2V4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgorICAgIEZsYWdTdG9vZ2VzID0gZXhjCisKICMgZm9yIHBpY2tsZSB0ZXN0IGFuZCBzdWJjbGFzcyB0ZXN0cwogdHJ5OgogICAgIGNsYXNzIFN0ckVudW0oc3RyLCBFbnVtKToKQEAgLTI4Myw2ICsyOTIsMjggQEAKICAgICAgICAgICAgIGNsYXNzIFdyb25nKEVudW0pOgogICAgICAgICAgICAgICAgIF9hbnlfbmFtZV8gPSA5CiAKKyAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgorICAgICAgICAjIHBsYWluIEVudW0gbWVtYmVycyBhcmUgYWx3YXlzIFRydWUKKyAgICAgICAgY2xhc3MgTG9naWMoRW51bSk6CisgICAgICAgICAgICB0cnVlID0gVHJ1ZQorICAgICAgICAgICAgZmFsc2UgPSBGYWxzZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoTG9naWMudHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKExvZ2ljLmZhbHNlKQorICAgICAgICAjIHVubGVzcyBvdmVycmlkZGVuCisgICAgICAgIGNsYXNzIFJlYWxMb2dpYyhFbnVtKToKKyAgICAgICAgICAgIHRydWUgPSBUcnVlCisgICAgICAgICAgICBmYWxzZSA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX19ib29sX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdmFsdWVfKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoUmVhbExvZ2ljLnRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoUmVhbExvZ2ljLmZhbHNlKQorICAgICAgICAjIG1peGVkIEVudW1zIGRlcGVuZCBvbiBtaXhlZC1pbiB0eXBlCisgICAgICAgIGNsYXNzIEludExvZ2ljKGludCwgRW51bSk6CisgICAgICAgICAgICB0cnVlID0gMQorICAgICAgICAgICAgZmFsc2UgPSAwCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShJbnRMb2dpYy50cnVlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEludExvZ2ljLmZhbHNlKQorCiAgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CiAgICAgICAgIFNlYXNvbiA9IHNlbGYuU2Vhc29uCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oU2Vhc29uLkFVVFVNTiwgU2Vhc29uKQpAQCAtMTU0OCw2ICsxNTc5LDU4MCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExhYmVsbGVkTGlzdCgxKSwgTGFiZWxsZWRMaXN0LnVucHJvY2Vzc2VkKQogCiAKK2NsYXNzIFRlc3RPcmRlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zYW1lX21lbWJlcnMoc2VsZik6CisgICAgICAgIGNsYXNzIENvbG9yKEVudW0pOgorICAgICAgICAgICAgX29yZGVyXyA9ICdyZWQgZ3JlZW4gYmx1ZScKKyAgICAgICAgICAgIHJlZCA9IDEKKyAgICAgICAgICAgIGdyZWVuID0gMgorICAgICAgICAgICAgYmx1ZSA9IDMKKworICAgIGRlZiB0ZXN0X3NhbWVfbWVtYmVyc193aXRoX2FsaWFzZXMoc2VsZik6CisgICAgICAgIGNsYXNzIENvbG9yKEVudW0pOgorICAgICAgICAgICAgX29yZGVyXyA9ICdyZWQgZ3JlZW4gYmx1ZScKKyAgICAgICAgICAgIHJlZCA9IDEKKyAgICAgICAgICAgIGdyZWVuID0gMgorICAgICAgICAgICAgYmx1ZSA9IDMKKyAgICAgICAgICAgIHZlcmRlID0gZ3JlZW4KKworICAgIGRlZiB0ZXN0X3NhbWVfbWVtYmVyc193cm9uZ19vcmRlcihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ21lbWJlciBvcmRlciBkb2VzIG5vdCBtYXRjaCBfb3JkZXJfJyk6CisgICAgICAgICAgICBjbGFzcyBDb2xvcihFbnVtKToKKyAgICAgICAgICAgICAgICBfb3JkZXJfID0gJ3JlZCBncmVlbiBibHVlJworICAgICAgICAgICAgICAgIHJlZCA9IDEKKyAgICAgICAgICAgICAgICBibHVlID0gMworICAgICAgICAgICAgICAgIGdyZWVuID0gMgorCisgICAgZGVmIHRlc3Rfb3JkZXJfaGFzX2V4dHJhX21lbWJlcnMoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdtZW1iZXIgb3JkZXIgZG9lcyBub3QgbWF0Y2ggX29yZGVyXycpOgorICAgICAgICAgICAgY2xhc3MgQ29sb3IoRW51bSk6CisgICAgICAgICAgICAgICAgX29yZGVyXyA9ICdyZWQgZ3JlZW4gYmx1ZSBwdXJwbGUnCisgICAgICAgICAgICAgICAgcmVkID0gMQorICAgICAgICAgICAgICAgIGdyZWVuID0gMgorICAgICAgICAgICAgICAgIGJsdWUgPSAzCisKKyAgICBkZWYgdGVzdF9vcmRlcl9oYXNfZXh0cmFfbWVtYmVyc193aXRoX2FsaWFzZXMoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdtZW1iZXIgb3JkZXIgZG9lcyBub3QgbWF0Y2ggX29yZGVyXycpOgorICAgICAgICAgICAgY2xhc3MgQ29sb3IoRW51bSk6CisgICAgICAgICAgICAgICAgX29yZGVyXyA9ICdyZWQgZ3JlZW4gYmx1ZSBwdXJwbGUnCisgICAgICAgICAgICAgICAgcmVkID0gMQorICAgICAgICAgICAgICAgIGdyZWVuID0gMgorICAgICAgICAgICAgICAgIGJsdWUgPSAzCisgICAgICAgICAgICAgICAgdmVyZGUgPSBncmVlbgorCisgICAgZGVmIHRlc3RfZW51bV9oYXNfZXh0cmFfbWVtYmVycyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ21lbWJlciBvcmRlciBkb2VzIG5vdCBtYXRjaCBfb3JkZXJfJyk6CisgICAgICAgICAgICBjbGFzcyBDb2xvcihFbnVtKToKKyAgICAgICAgICAgICAgICBfb3JkZXJfID0gJ3JlZCBncmVlbiBibHVlJworICAgICAgICAgICAgICAgIHJlZCA9IDEKKyAgICAgICAgICAgICAgICBncmVlbiA9IDIKKyAgICAgICAgICAgICAgICBibHVlID0gMworICAgICAgICAgICAgICAgIHB1cnBsZSA9IDQKKworICAgIGRlZiB0ZXN0X2VudW1faGFzX2V4dHJhX21lbWJlcnNfd2l0aF9hbGlhc2VzKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnbWVtYmVyIG9yZGVyIGRvZXMgbm90IG1hdGNoIF9vcmRlcl8nKToKKyAgICAgICAgICAgIGNsYXNzIENvbG9yKEVudW0pOgorICAgICAgICAgICAgICAgIF9vcmRlcl8gPSAncmVkIGdyZWVuIGJsdWUnCisgICAgICAgICAgICAgICAgcmVkID0gMQorICAgICAgICAgICAgICAgIGdyZWVuID0gMgorICAgICAgICAgICAgICAgIGJsdWUgPSAzCisgICAgICAgICAgICAgICAgcHVycGxlID0gNAorICAgICAgICAgICAgICAgIHZlcmRlID0gZ3JlZW4KKworCitjbGFzcyBUZXN0RmxhZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgb2YgdGhlIEZsYWdzLiIiIgorCisgICAgY2xhc3MgUGVybShGbGFnKToKKyAgICAgICAgUiwgVywgWCA9IDQsIDIsIDEKKworICAgIGNsYXNzIE9wZW4oRmxhZyk6CisgICAgICAgIFJPID0gMAorICAgICAgICBXTyA9IDEKKyAgICAgICAgUlcgPSAyCisgICAgICAgIEFDID0gMworICAgICAgICBDRSA9IDE8PDE5CisKKyAgICBkZWYgdGVzdF9zdHIoc2VsZik6CisgICAgICAgIFBlcm0gPSBzZWxmLlBlcm0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoUGVybS5SKSwgJ1Blcm0uUicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFBlcm0uVyksICdQZXJtLlcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtLlgpLCAnUGVybS5YJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoUGVybS5SIHwgUGVybS5XKSwgJ1Blcm0uUnxXJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoUGVybS5SIHwgUGVybS5XIHwgUGVybS5YKSwgJ1Blcm0uUnxXfFgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtKDApKSwgJ1Blcm0uMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH5QZXJtLlIpLCAnUGVybS5XfFgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih+UGVybS5XKSwgJ1Blcm0uUnxYJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoflBlcm0uWCksICdQZXJtLlJ8VycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH4oUGVybS5SIHwgUGVybS5XKSksICdQZXJtLlgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih+KFBlcm0uUiB8IFBlcm0uVyB8IFBlcm0uWCkpLCAnUGVybS4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoUGVybSh+MCkpLCAnUGVybS5SfFd8WCcpCisKKyAgICAgICAgT3BlbiA9IHNlbGYuT3BlbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihPcGVuLlJPKSwgJ09wZW4uUk8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihPcGVuLldPKSwgJ09wZW4uV08nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihPcGVuLkFDKSwgJ09wZW4uQUMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihPcGVuLlJPIHwgT3Blbi5DRSksICdPcGVuLkNFJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoT3Blbi5XTyB8IE9wZW4uQ0UpLCAnT3Blbi5DRXxXTycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH5PcGVuLlJPKSwgJ09wZW4uQ0V8QUMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih+T3Blbi5XTyksICdPcGVuLkNFfFJXJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofk9wZW4uQUMpLCAnT3Blbi5DRScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH4oT3Blbi5STyB8IE9wZW4uQ0UpKSwgJ09wZW4uQUMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih+KE9wZW4uV08gfCBPcGVuLkNFKSksICdPcGVuLlJXJykKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIFBlcm0gPSBzZWxmLlBlcm0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0uUiksICc8UGVybS5SOiA0PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihQZXJtLlcpLCAnPFBlcm0uVzogMj4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybS5YKSwgJzxQZXJtLlg6IDE+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0uUiB8IFBlcm0uVyksICc8UGVybS5SfFc6IDY+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0uUiB8IFBlcm0uVyB8IFBlcm0uWCksICc8UGVybS5SfFd8WDogNz4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybSgwKSksICc8UGVybS4wOiAwPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+UGVybS5SKSwgJzxQZXJtLld8WDogMz4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoflBlcm0uVyksICc8UGVybS5SfFg6IDU+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKH5QZXJtLlgpLCAnPFBlcm0uUnxXOiA2PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+KFBlcm0uUiB8IFBlcm0uVykpLCAnPFBlcm0uWDogMT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofihQZXJtLlIgfCBQZXJtLlcgfCBQZXJtLlgpKSwgJzxQZXJtLjA6IDA+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0ofjApKSwgJzxQZXJtLlJ8V3xYOiA3PicpCisKKyAgICAgICAgT3BlbiA9IHNlbGYuT3BlbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbi5STyksICc8T3Blbi5STzogMD4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbi5XTyksICc8T3Blbi5XTzogMT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbi5BQyksICc8T3Blbi5BQzogMz4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbi5STyB8IE9wZW4uQ0UpLCAnPE9wZW4uQ0U6IDUyNDI4OD4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbi5XTyB8IE9wZW4uQ0UpLCAnPE9wZW4uQ0V8V086IDUyNDI4OT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofk9wZW4uUk8pLCAnPE9wZW4uQ0V8QUM6IDUyNDI5MT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofk9wZW4uV08pLCAnPE9wZW4uQ0V8Ulc6IDUyNDI5MD4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofk9wZW4uQUMpLCAnPE9wZW4uQ0U6IDUyNDI4OD4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofihPcGVuLlJPIHwgT3Blbi5DRSkpLCAnPE9wZW4uQUM6IDM+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKH4oT3Blbi5XTyB8IE9wZW4uQ0UpKSwgJzxPcGVuLlJXOiAyPicpCisKKyAgICBkZWYgdGVzdF9vcihzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBmb3IgaSBpbiBQZXJtOgorICAgICAgICAgICAgZm9yIGogaW4gUGVybToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChpIHwgaiksIFBlcm0oaS52YWx1ZSB8IGoudmFsdWUpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGkgfCBqKS52YWx1ZSwgaS52YWx1ZSB8IGoudmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGkgfCBqKSwgUGVybSkKKyAgICAgICAgZm9yIGkgaW4gUGVybToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaSB8IGksIGkpCisgICAgICAgIE9wZW4gPSBzZWxmLk9wZW4KKyAgICAgICAgc2VsZi5hc3NlcnRJcyhPcGVuLlJPIHwgT3Blbi5DRSwgT3Blbi5DRSkKKworICAgIGRlZiB0ZXN0X2FuZChzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBSVyA9IFBlcm0uUiB8IFBlcm0uVworICAgICAgICBSWCA9IFBlcm0uUiB8IFBlcm0uWAorICAgICAgICBXWCA9IFBlcm0uVyB8IFBlcm0uWAorICAgICAgICBSV1ggPSBQZXJtLlIgfCBQZXJtLlcgfCBQZXJtLlgKKyAgICAgICAgdmFsdWVzID0gbGlzdChQZXJtKSArIFtSVywgUlgsIFdYLCBSV1gsIFBlcm0oMCldCisgICAgICAgIGZvciBpIGluIHZhbHVlczoKKyAgICAgICAgICAgIGZvciBqIGluIHZhbHVlczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChpICYgaikudmFsdWUsIGkudmFsdWUgJiBqLnZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShpICYgaiksIFBlcm0pCisgICAgICAgIGZvciBpIGluIFBlcm06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGkgJiBpLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhpICYgUldYLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhSV1ggJiBpLCBpKQorICAgICAgICBPcGVuID0gc2VsZi5PcGVuCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoT3Blbi5STyAmIE9wZW4uQ0UsIE9wZW4uUk8pCisKKyAgICBkZWYgdGVzdF94b3Ioc2VsZik6CisgICAgICAgIFBlcm0gPSBzZWxmLlBlcm0KKyAgICAgICAgZm9yIGkgaW4gUGVybToKKyAgICAgICAgICAgIGZvciBqIGluIFBlcm06CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaSBeIGopLnZhbHVlLCBpLnZhbHVlIF4gai52YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoaSBeIGopLCBQZXJtKQorICAgICAgICBmb3IgaSBpbiBQZXJtOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhpIF4gUGVybSgwKSwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoUGVybSgwKSBeIGksIGkpCisgICAgICAgIE9wZW4gPSBzZWxmLk9wZW4KKyAgICAgICAgc2VsZi5hc3NlcnRJcyhPcGVuLlJPIF4gT3Blbi5DRSwgT3Blbi5DRSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhPcGVuLkNFIF4gT3Blbi5DRSwgT3Blbi5STykKKworICAgIGRlZiB0ZXN0X2ludmVydChzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBSVyA9IFBlcm0uUiB8IFBlcm0uVworICAgICAgICBSWCA9IFBlcm0uUiB8IFBlcm0uWAorICAgICAgICBXWCA9IFBlcm0uVyB8IFBlcm0uWAorICAgICAgICBSV1ggPSBQZXJtLlIgfCBQZXJtLlcgfCBQZXJtLlgKKyAgICAgICAgdmFsdWVzID0gbGlzdChQZXJtKSArIFtSVywgUlgsIFdYLCBSV1gsIFBlcm0oMCldCisgICAgICAgIGZvciBpIGluIHZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZSh+aSksIFBlcm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKH5+aSwgaSkKKyAgICAgICAgZm9yIGkgaW4gUGVybToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMofn5pLCBpKQorICAgICAgICBPcGVuID0gc2VsZi5PcGVuCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoT3Blbi5XTyAmIH5PcGVuLldPLCBPcGVuLlJPKQorICAgICAgICBzZWxmLmFzc2VydElzKChPcGVuLldPfE9wZW4uQ0UpICYgfk9wZW4uV08sIE9wZW4uQ0UpCisKKyAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgorICAgICAgICBQZXJtID0gc2VsZi5QZXJtCisgICAgICAgIGZvciBmIGluIFBlcm06CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZikKKyAgICAgICAgT3BlbiA9IHNlbGYuT3BlbgorICAgICAgICBmb3IgZiBpbiBPcGVuOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib29sKGYudmFsdWUpLCBib29sKGYpKQorCisgICAgZGVmIHRlc3RfcHJvZ3JhbWF0aWNfZnVuY3Rpb25fc3RyaW5nKHNlbGYpOgorICAgICAgICBQZXJtID0gRmxhZygnUGVybScsICdSIFcgWCcpCisgICAgICAgIGxzdCA9IGxpc3QoUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obHN0KSwgbGVuKFBlcm0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihQZXJtKSwgMywgUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFtQZXJtLlIsIFBlcm0uVywgUGVybS5YXSkKKyAgICAgICAgZm9yIGksIG4gaW4gZW51bWVyYXRlKCdSIFcgWCcuc3BsaXQoKSk6CisgICAgICAgICAgICB2ID0gMTw8aQorICAgICAgICAgICAgZSA9IFBlcm0odikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS52YWx1ZSwgdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShlLnZhbHVlKSwgaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm5hbWUsIG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGUsIFBlcm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZSksIFBlcm0pCisKKyAgICBkZWYgdGVzdF9wcm9ncmFtYXRpY19mdW5jdGlvbl9zdHJpbmdfd2l0aF9zdGFydChzZWxmKToKKyAgICAgICAgUGVybSA9IEZsYWcoJ1Blcm0nLCAnUiBXIFgnLCBzdGFydD04KQorICAgICAgICBsc3QgPSBsaXN0KFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxzdCksIGxlbihQZXJtKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oUGVybSksIDMsIFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBbUGVybS5SLCBQZXJtLlcsIFBlcm0uWF0pCisgICAgICAgIGZvciBpLCBuIGluIGVudW1lcmF0ZSgnUiBXIFgnLnNwbGl0KCkpOgorICAgICAgICAgICAgdiA9IDg8PGkKKyAgICAgICAgICAgIGUgPSBQZXJtKHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUudmFsdWUsIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZS52YWx1ZSksIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5uYW1lLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlLCBQZXJtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGUpLCBQZXJtKQorCisgICAgZGVmIHRlc3RfcHJvZ3JhbWF0aWNfZnVuY3Rpb25fc3RyaW5nX2xpc3Qoc2VsZik6CisgICAgICAgIFBlcm0gPSBGbGFnKCdQZXJtJywgWydSJywgJ1cnLCAnWCddKQorICAgICAgICBsc3QgPSBsaXN0KFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxzdCksIGxlbihQZXJtKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oUGVybSksIDMsIFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBbUGVybS5SLCBQZXJtLlcsIFBlcm0uWF0pCisgICAgICAgIGZvciBpLCBuIGluIGVudW1lcmF0ZSgnUiBXIFgnLnNwbGl0KCkpOgorICAgICAgICAgICAgdiA9IDE8PGkKKyAgICAgICAgICAgIGUgPSBQZXJtKHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUudmFsdWUsIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZS52YWx1ZSksIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5uYW1lLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlLCBQZXJtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGUpLCBQZXJtKQorCisgICAgZGVmIHRlc3RfcHJvZ3JhbWF0aWNfZnVuY3Rpb25faXRlcmFibGUoc2VsZik6CisgICAgICAgIFBlcm0gPSBGbGFnKCdQZXJtJywgKCgnUicsIDIpLCAoJ1cnLCA4KSwgKCdYJywgMzIpKSkKKyAgICAgICAgbHN0ID0gbGlzdChQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsc3QpLCBsZW4oUGVybSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFBlcm0pLCAzLCBQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgW1Blcm0uUiwgUGVybS5XLCBQZXJtLlhdKQorICAgICAgICBmb3IgaSwgbiBpbiBlbnVtZXJhdGUoJ1IgVyBYJy5zcGxpdCgpKToKKyAgICAgICAgICAgIHYgPSAxPDwoMippKzEpCisgICAgICAgICAgICBlID0gUGVybSh2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLnZhbHVlLCB2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGUudmFsdWUpLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUubmFtZSwgbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZSwgUGVybSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShlKSwgUGVybSkKKworICAgIGRlZiB0ZXN0X3Byb2dyYW1hdGljX2Z1bmN0aW9uX2Zyb21fZGljdChzZWxmKToKKyAgICAgICAgUGVybSA9IEZsYWcoJ1Blcm0nLCBPcmRlcmVkRGljdCgoKCdSJywgMiksICgnVycsIDgpLCAoJ1gnLCAzMikpKSkKKyAgICAgICAgbHN0ID0gbGlzdChQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsc3QpLCBsZW4oUGVybSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFBlcm0pLCAzLCBQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgW1Blcm0uUiwgUGVybS5XLCBQZXJtLlhdKQorICAgICAgICBmb3IgaSwgbiBpbiBlbnVtZXJhdGUoJ1IgVyBYJy5zcGxpdCgpKToKKyAgICAgICAgICAgIHYgPSAxPDwoMippKzEpCisgICAgICAgICAgICBlID0gUGVybSh2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLnZhbHVlLCB2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGUudmFsdWUpLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUubmFtZSwgbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZSwgUGVybSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShlKSwgUGVybSkKKworICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShGbGFnU3Rvb2dlcywgRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHJhaXNlIEZsYWdTdG9vZ2VzCisgICAgICAgIHRlc3RfcGlja2xlX2R1bXBfbG9hZChzZWxmLmFzc2VydElzLCBGbGFnU3Rvb2dlcy5DVVJMWXxGbGFnU3Rvb2dlcy5NT0UpCisgICAgICAgIHRlc3RfcGlja2xlX2R1bXBfbG9hZChzZWxmLmFzc2VydElzLCBGbGFnU3Rvb2dlcykKKworCisgICAgZGVmIHRlc3RfY29udGFpbm1lbnQoc2VsZik6CisgICAgICAgIFBlcm0gPSBzZWxmLlBlcm0KKyAgICAgICAgUiwgVywgWCA9IFBlcm0KKyAgICAgICAgUlcgPSBSIHwgVworICAgICAgICBSWCA9IFIgfCBYCisgICAgICAgIFdYID0gVyB8IFgKKyAgICAgICAgUldYID0gUiB8IFcgfCBYCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShSIGluIFJXKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoUiBpbiBSWCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFIgaW4gUldYKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoVyBpbiBSVykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFcgaW4gV1gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShXIGluIFJXWCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFggaW4gUlgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShYIGluIFdYKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoWCBpbiBSV1gpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoUiBpbiBXWCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShXIGluIFJYKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFggaW4gUlcpCisKK2NsYXNzIFRlc3RJbnRGbGFnKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBvZiB0aGUgSW50RmxhZ3MuIiIiCisKKyAgICBjbGFzcyBQZXJtKEludEZsYWcpOgorICAgICAgICBYID0gMSA8PCAwCisgICAgICAgIFcgPSAxIDw8IDEKKyAgICAgICAgUiA9IDEgPDwgMgorCisgICAgY2xhc3MgT3BlbihJbnRGbGFnKToKKyAgICAgICAgUk8gPSAwCisgICAgICAgIFdPID0gMQorICAgICAgICBSVyA9IDIKKyAgICAgICAgQUMgPSAzCisgICAgICAgIENFID0gMTw8MTkKKworICAgIGRlZiB0ZXN0X3N0cihzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtLlIpLCAnUGVybS5SJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoUGVybS5XKSwgJ1Blcm0uVycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFBlcm0uWCksICdQZXJtLlgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtLlIgfCBQZXJtLlcpLCAnUGVybS5SfFcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtLlIgfCBQZXJtLlcgfCBQZXJtLlgpLCAnUGVybS5SfFd8WCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFBlcm0uUiB8IDgpLCAnUGVybS44fFInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtKDApKSwgJ1Blcm0uMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFBlcm0oOCkpLCAnUGVybS44JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoflBlcm0uUiksICdQZXJtLld8WHwtOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH5QZXJtLlcpLCAnUGVybS5SfFh8LTgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih+UGVybS5YKSwgJ1Blcm0uUnxXfC04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofihQZXJtLlIgfCBQZXJtLlcpKSwgJ1Blcm0uWHwtOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH4oUGVybS5SIHwgUGVybS5XIHwgUGVybS5YKSksICdQZXJtLi04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofihQZXJtLlIgfCA4KSksICdQZXJtLld8WHwtMTYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtKH4wKSksICdQZXJtLlJ8V3xYfC04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoUGVybSh+OCkpLCAnUGVybS5SfFd8WHwtMTYnKQorCisgICAgICAgIE9wZW4gPSBzZWxmLk9wZW4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoT3Blbi5STyksICdPcGVuLlJPJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoT3Blbi5XTyksICdPcGVuLldPJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoT3Blbi5BQyksICdPcGVuLkFDJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoT3Blbi5STyB8IE9wZW4uQ0UpLCAnT3Blbi5DRScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE9wZW4uV08gfCBPcGVuLkNFKSwgJ09wZW4uQ0V8V08nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihPcGVuKDQpKSwgJ09wZW4uNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH5PcGVuLlJPKSwgJ09wZW4uQ0V8QUN8LTUyNDI5MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH5PcGVuLldPKSwgJ09wZW4uQ0V8Uld8LTUyNDI5MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH5PcGVuLkFDKSwgJ09wZW4uQ0V8LTUyNDI5MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH4oT3Blbi5STyB8IE9wZW4uQ0UpKSwgJ09wZW4uQUN8LTUyNDI5MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH4oT3Blbi5XTyB8IE9wZW4uQ0UpKSwgJ09wZW4uUld8LTUyNDI5MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE9wZW4ofjQpKSwgJ09wZW4uQ0V8QUN8LTUyNDI5NicpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBQZXJtID0gc2VsZi5QZXJtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihQZXJtLlIpLCAnPFBlcm0uUjogND4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybS5XKSwgJzxQZXJtLlc6IDI+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0uWCksICc8UGVybS5YOiAxPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihQZXJtLlIgfCBQZXJtLlcpLCAnPFBlcm0uUnxXOiA2PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihQZXJtLlIgfCBQZXJtLlcgfCBQZXJtLlgpLCAnPFBlcm0uUnxXfFg6IDc+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0uUiB8IDgpLCAnPFBlcm0uOHxSOiAxMj4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybSgwKSksICc8UGVybS4wOiAwPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihQZXJtKDgpKSwgJzxQZXJtLjg6IDg+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKH5QZXJtLlIpLCAnPFBlcm0uV3xYfC04OiAtNT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoflBlcm0uVyksICc8UGVybS5SfFh8LTg6IC0zPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+UGVybS5YKSwgJzxQZXJtLlJ8V3wtODogLTI+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKH4oUGVybS5SIHwgUGVybS5XKSksICc8UGVybS5YfC04OiAtNz4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofihQZXJtLlIgfCBQZXJtLlcgfCBQZXJtLlgpKSwgJzxQZXJtLi04OiAtOD4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofihQZXJtLlIgfCA4KSksICc8UGVybS5XfFh8LTE2OiAtMTM+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0ofjApKSwgJzxQZXJtLlJ8V3xYfC04OiAtMT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybSh+OCkpLCAnPFBlcm0uUnxXfFh8LTE2OiAtOT4nKQorCisgICAgICAgIE9wZW4gPSBzZWxmLk9wZW4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKE9wZW4uUk8pLCAnPE9wZW4uUk86IDA+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKE9wZW4uV08pLCAnPE9wZW4uV086IDE+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKE9wZW4uQUMpLCAnPE9wZW4uQUM6IDM+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKE9wZW4uUk8gfCBPcGVuLkNFKSwgJzxPcGVuLkNFOiA1MjQyODg+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKE9wZW4uV08gfCBPcGVuLkNFKSwgJzxPcGVuLkNFfFdPOiA1MjQyODk+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKE9wZW4oNCkpLCAnPE9wZW4uNDogND4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofk9wZW4uUk8pLCAnPE9wZW4uQ0V8QUN8LTUyNDI5MjogLTE+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKH5PcGVuLldPKSwgJzxPcGVuLkNFfFJXfC01MjQyOTI6IC0yPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+T3Blbi5BQyksICc8T3Blbi5DRXwtNTI0MjkyOiAtND4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofihPcGVuLlJPIHwgT3Blbi5DRSkpLCAnPE9wZW4uQUN8LTUyNDI5MjogLTUyNDI4OT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofihPcGVuLldPIHwgT3Blbi5DRSkpLCAnPE9wZW4uUld8LTUyNDI5MjogLTUyNDI5MD4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbih+NCkpLCAnPE9wZW4uQ0V8QUN8LTUyNDI5NjogLTU+JykKKworICAgIGRlZiB0ZXN0X29yKHNlbGYpOgorICAgICAgICBQZXJtID0gc2VsZi5QZXJtCisgICAgICAgIGZvciBpIGluIFBlcm06CisgICAgICAgICAgICBmb3IgaiBpbiBQZXJtOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSB8IGosIGkudmFsdWUgfCBqLnZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGkgfCBqKS52YWx1ZSwgaS52YWx1ZSB8IGoudmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGkgfCBqKSwgUGVybSkKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKDgpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSB8IGosIGkudmFsdWUgfCBqKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGkgfCBqKS52YWx1ZSwgaS52YWx1ZSB8IGopCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGkgfCBqKSwgUGVybSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGogfCBpLCBqIHwgaS52YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChqIHwgaSkudmFsdWUsIGogfCBpLnZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShqIHwgaSksIFBlcm0pCisgICAgICAgIGZvciBpIGluIFBlcm06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGkgfCBpLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhpIHwgMCwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoMCB8IGksIGkpCisgICAgICAgIE9wZW4gPSBzZWxmLk9wZW4KKyAgICAgICAgc2VsZi5hc3NlcnRJcyhPcGVuLlJPIHwgT3Blbi5DRSwgT3Blbi5DRSkKKworICAgIGRlZiB0ZXN0X2FuZChzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBSVyA9IFBlcm0uUiB8IFBlcm0uVworICAgICAgICBSWCA9IFBlcm0uUiB8IFBlcm0uWAorICAgICAgICBXWCA9IFBlcm0uVyB8IFBlcm0uWAorICAgICAgICBSV1ggPSBQZXJtLlIgfCBQZXJtLlcgfCBQZXJtLlgKKyAgICAgICAgdmFsdWVzID0gbGlzdChQZXJtKSArIFtSVywgUlgsIFdYLCBSV1gsIFBlcm0oMCldCisgICAgICAgIGZvciBpIGluIHZhbHVlczoKKyAgICAgICAgICAgIGZvciBqIGluIHZhbHVlczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkgJiBqLCBpLnZhbHVlICYgai52YWx1ZSwgJ2kgaXMgJXIsIGogaXMgJXInICUgKGksIGopKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGkgJiBqKS52YWx1ZSwgaS52YWx1ZSAmIGoudmFsdWUsICdpIGlzICVyLCBqIGlzICVyJyAlIChpLCBqKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoaSAmIGopLCBQZXJtLCAnaSBpcyAlciwgaiBpcyAlcicgJSAoaSwgaikpCisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZSg4KToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkgJiBqLCBpLnZhbHVlICYgaikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChpICYgaikudmFsdWUsIGkudmFsdWUgJiBqKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShpICYgaiksIFBlcm0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqICYgaSwgaiAmIGkudmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaiAmIGkpLnZhbHVlLCBqICYgaS52YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoaiAmIGkpLCBQZXJtKQorICAgICAgICBmb3IgaSBpbiBQZXJtOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhpICYgaSwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaSAmIDcsIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKDcgJiBpLCBpKQorICAgICAgICBPcGVuID0gc2VsZi5PcGVuCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoT3Blbi5STyAmIE9wZW4uQ0UsIE9wZW4uUk8pCisKKyAgICBkZWYgdGVzdF94b3Ioc2VsZik6CisgICAgICAgIFBlcm0gPSBzZWxmLlBlcm0KKyAgICAgICAgZm9yIGkgaW4gUGVybToKKyAgICAgICAgICAgIGZvciBqIGluIFBlcm06CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpIF4gaiwgaS52YWx1ZSBeIGoudmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaSBeIGopLnZhbHVlLCBpLnZhbHVlIF4gai52YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoaSBeIGopLCBQZXJtKQorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoOCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpIF4gaiwgaS52YWx1ZSBeIGopCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaSBeIGopLnZhbHVlLCBpLnZhbHVlIF4gaikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoaSBeIGopLCBQZXJtKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaiBeIGksIGogXiBpLnZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGogXiBpKS52YWx1ZSwgaiBeIGkudmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGogXiBpKSwgUGVybSkKKyAgICAgICAgZm9yIGkgaW4gUGVybToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaSBeIDAsIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKDAgXiBpLCBpKQorICAgICAgICBPcGVuID0gc2VsZi5PcGVuCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoT3Blbi5STyBeIE9wZW4uQ0UsIE9wZW4uQ0UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoT3Blbi5DRSBeIE9wZW4uQ0UsIE9wZW4uUk8pCisKKyAgICBkZWYgdGVzdF9pbnZlcnQoc2VsZik6CisgICAgICAgIFBlcm0gPSBzZWxmLlBlcm0KKyAgICAgICAgUlcgPSBQZXJtLlIgfCBQZXJtLlcKKyAgICAgICAgUlggPSBQZXJtLlIgfCBQZXJtLlgKKyAgICAgICAgV1ggPSBQZXJtLlcgfCBQZXJtLlgKKyAgICAgICAgUldYID0gUGVybS5SIHwgUGVybS5XIHwgUGVybS5YCisgICAgICAgIHZhbHVlcyA9IGxpc3QoUGVybSkgKyBbUlcsIFJYLCBXWCwgUldYLCBQZXJtKDApXQorICAgICAgICBmb3IgaSBpbiB2YWx1ZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKH5pLCB+aS52YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKH5pKS52YWx1ZSwgfmkudmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUofmkpLCBQZXJtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh+fmksIGkpCisgICAgICAgIGZvciBpIGluIFBlcm06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKH5+aSwgaSkKKyAgICAgICAgT3BlbiA9IHNlbGYuT3BlbgorICAgICAgICBzZWxmLmFzc2VydElzKE9wZW4uV08gJiB+T3Blbi5XTywgT3Blbi5STykKKyAgICAgICAgc2VsZi5hc3NlcnRJcygoT3Blbi5XT3xPcGVuLkNFKSAmIH5PcGVuLldPLCBPcGVuLkNFKQorCisgICAgZGVmIHRlc3RfcHJvZ3JhbWF0aWNfZnVuY3Rpb25fc3RyaW5nKHNlbGYpOgorICAgICAgICBQZXJtID0gSW50RmxhZygnUGVybScsICdSIFcgWCcpCisgICAgICAgIGxzdCA9IGxpc3QoUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obHN0KSwgbGVuKFBlcm0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihQZXJtKSwgMywgUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFtQZXJtLlIsIFBlcm0uVywgUGVybS5YXSkKKyAgICAgICAgZm9yIGksIG4gaW4gZW51bWVyYXRlKCdSIFcgWCcuc3BsaXQoKSk6CisgICAgICAgICAgICB2ID0gMTw8aQorICAgICAgICAgICAgZSA9IFBlcm0odikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS52YWx1ZSwgdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShlLnZhbHVlKSwgaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLCB2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm5hbWUsIG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGUsIFBlcm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZSksIFBlcm0pCisKKyAgICBkZWYgdGVzdF9wcm9ncmFtYXRpY19mdW5jdGlvbl9zdHJpbmdfd2l0aF9zdGFydChzZWxmKToKKyAgICAgICAgUGVybSA9IEludEZsYWcoJ1Blcm0nLCAnUiBXIFgnLCBzdGFydD04KQorICAgICAgICBsc3QgPSBsaXN0KFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxzdCksIGxlbihQZXJtKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oUGVybSksIDMsIFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBbUGVybS5SLCBQZXJtLlcsIFBlcm0uWF0pCisgICAgICAgIGZvciBpLCBuIGluIGVudW1lcmF0ZSgnUiBXIFgnLnNwbGl0KCkpOgorICAgICAgICAgICAgdiA9IDg8PGkKKyAgICAgICAgICAgIGUgPSBQZXJtKHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUudmFsdWUsIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZS52YWx1ZSksIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZSwgdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5uYW1lLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlLCBQZXJtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGUpLCBQZXJtKQorCisgICAgZGVmIHRlc3RfcHJvZ3JhbWF0aWNfZnVuY3Rpb25fc3RyaW5nX2xpc3Qoc2VsZik6CisgICAgICAgIFBlcm0gPSBJbnRGbGFnKCdQZXJtJywgWydSJywgJ1cnLCAnWCddKQorICAgICAgICBsc3QgPSBsaXN0KFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxzdCksIGxlbihQZXJtKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oUGVybSksIDMsIFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBbUGVybS5SLCBQZXJtLlcsIFBlcm0uWF0pCisgICAgICAgIGZvciBpLCBuIGluIGVudW1lcmF0ZSgnUiBXIFgnLnNwbGl0KCkpOgorICAgICAgICAgICAgdiA9IDE8PGkKKyAgICAgICAgICAgIGUgPSBQZXJtKHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUudmFsdWUsIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZS52YWx1ZSksIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZSwgdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5uYW1lLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlLCBQZXJtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGUpLCBQZXJtKQorCisgICAgZGVmIHRlc3RfcHJvZ3JhbWF0aWNfZnVuY3Rpb25faXRlcmFibGUoc2VsZik6CisgICAgICAgIFBlcm0gPSBJbnRGbGFnKCdQZXJtJywgKCgnUicsIDIpLCAoJ1cnLCA4KSwgKCdYJywgMzIpKSkKKyAgICAgICAgbHN0ID0gbGlzdChQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsc3QpLCBsZW4oUGVybSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFBlcm0pLCAzLCBQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgW1Blcm0uUiwgUGVybS5XLCBQZXJtLlhdKQorICAgICAgICBmb3IgaSwgbiBpbiBlbnVtZXJhdGUoJ1IgVyBYJy5zcGxpdCgpKToKKyAgICAgICAgICAgIHYgPSAxPDwoMippKzEpCisgICAgICAgICAgICBlID0gUGVybSh2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLnZhbHVlLCB2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGUudmFsdWUpLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUsIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUubmFtZSwgbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZSwgUGVybSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShlKSwgUGVybSkKKworICAgIGRlZiB0ZXN0X3Byb2dyYW1hdGljX2Z1bmN0aW9uX2Zyb21fZGljdChzZWxmKToKKyAgICAgICAgUGVybSA9IEludEZsYWcoJ1Blcm0nLCBPcmRlcmVkRGljdCgoKCdSJywgMiksICgnVycsIDgpLCAoJ1gnLCAzMikpKSkKKyAgICAgICAgbHN0ID0gbGlzdChQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsc3QpLCBsZW4oUGVybSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFBlcm0pLCAzLCBQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgW1Blcm0uUiwgUGVybS5XLCBQZXJtLlhdKQorICAgICAgICBmb3IgaSwgbiBpbiBlbnVtZXJhdGUoJ1IgVyBYJy5zcGxpdCgpKToKKyAgICAgICAgICAgIHYgPSAxPDwoMippKzEpCisgICAgICAgICAgICBlID0gUGVybSh2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLnZhbHVlLCB2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGUudmFsdWUpLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUsIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUubmFtZSwgbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZSwgUGVybSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShlKSwgUGVybSkKKworCisgICAgZGVmIHRlc3RfY29udGFpbm1lbnQoc2VsZik6CisgICAgICAgIFBlcm0gPSBzZWxmLlBlcm0KKyAgICAgICAgUiwgVywgWCA9IFBlcm0KKyAgICAgICAgUlcgPSBSIHwgVworICAgICAgICBSWCA9IFIgfCBYCisgICAgICAgIFdYID0gVyB8IFgKKyAgICAgICAgUldYID0gUiB8IFcgfCBYCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShSIGluIFJXKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoUiBpbiBSWCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFIgaW4gUldYKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoVyBpbiBSVykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFcgaW4gV1gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShXIGluIFJXWCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFggaW4gUlgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShYIGluIFdYKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoWCBpbiBSV1gpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoUiBpbiBXWCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShXIGluIFJYKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFggaW4gUlcpCisKKyAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgorICAgICAgICBQZXJtID0gc2VsZi5QZXJtCisgICAgICAgIGZvciBmIGluIFBlcm06CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZikKKyAgICAgICAgT3BlbiA9IHNlbGYuT3BlbgorICAgICAgICBmb3IgZiBpbiBPcGVuOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib29sKGYudmFsdWUpLCBib29sKGYpKQorCiBjbGFzcyBUZXN0VW5pcXVlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X3VuaXF1ZV9jbGVhbihzZWxmKToKQEAgLTE3MzksNSArMjM0NCw0NyBAQAogICAgICAgICBpZiBmYWlsZWQ6CiAgICAgICAgICAgICBzZWxmLmZhaWwoInJlc3VsdCBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCwgc2VlIHByaW50IGFib3ZlIikKIAorCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgZW51bSkKKworCisjIFRoZXNlIGFyZSB1bm9yZGVyZWQgaGVyZSBvbiBwdXJwb3NlIHRvIGVuc3VyZSB0aGF0IGRlY2xhcmF0aW9uIG9yZGVyCisjIG1ha2VzIG5vIGRpZmZlcmVuY2UuCitDT05WRVJUX1RFU1RfTkFNRV9EID0gNQorQ09OVkVSVF9URVNUX05BTUVfQyA9IDUKK0NPTlZFUlRfVEVTVF9OQU1FX0IgPSA1CitDT05WRVJUX1RFU1RfTkFNRV9BID0gNSAgIyBUaGlzIG9uZSBzaG91bGQgc29ydCBmaXJzdC4KK0NPTlZFUlRfVEVTVF9OQU1FX0UgPSA1CitDT05WRVJUX1RFU1RfTkFNRV9GID0gNQorCitjbGFzcyBUZXN0SW50RW51bUNvbnZlcnQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NvbnZlcnRfdmFsdWVfbG9va3VwX3ByaW9yaXR5KHNlbGYpOgorICAgICAgICB0ZXN0X3R5cGUgPSBlbnVtLkludEVudW0uX2NvbnZlcnQoCisgICAgICAgICAgICAgICAgJ1VuaXR0ZXN0Q29udmVydCcsICd0ZXN0LnRlc3RfZW51bScsCisgICAgICAgICAgICAgICAgZmlsdGVyPWxhbWJkYSB4OiB4LnN0YXJ0c3dpdGgoJ0NPTlZFUlRfVEVTVF8nKSkKKyAgICAgICAgIyBXZSBkb24ndCB3YW50IHRoZSByZXZlcnNlIGxvb2t1cCB2YWx1ZSB0byB2YXJ5IHdoZW4gdGhlcmUgYXJlCisgICAgICAgICMgbXVsdGlwbGUgcG9zc2libGUgbmFtZXMgZm9yIGEgZ2l2ZW4gdmFsdWUuICBJdCBzaG91bGQgYWx3YXlzCisgICAgICAgICMgcmVwb3J0IHRoZSBmaXJzdCBsZXhpZ3JhcGhpY2FsIG5hbWUgaW4gdGhhdCBjYXNlLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZSg1KS5uYW1lLCAnQ09OVkVSVF9URVNUX05BTUVfQScpCisKKyAgICBkZWYgdGVzdF9jb252ZXJ0KHNlbGYpOgorICAgICAgICB0ZXN0X3R5cGUgPSBlbnVtLkludEVudW0uX2NvbnZlcnQoCisgICAgICAgICAgICAgICAgJ1VuaXR0ZXN0Q29udmVydCcsICd0ZXN0LnRlc3RfZW51bScsCisgICAgICAgICAgICAgICAgZmlsdGVyPWxhbWJkYSB4OiB4LnN0YXJ0c3dpdGgoJ0NPTlZFUlRfVEVTVF8nKSkKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB0ZXN0X3R5cGUgaGFzIGFsbCBvZiB0aGUgZGVzaXJlZCBuYW1lcyBhbmQgdmFsdWVzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9GLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9BKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9CLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9DLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9ELCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9FLCA1KQorICAgICAgICAjIEVuc3VyZSB0aGF0IHRlc3RfdHlwZSBvbmx5IHBpY2tlZCB1cCBuYW1lcyBtYXRjaGluZyB0aGUgZmlsdGVyLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtuYW1lIGZvciBuYW1lIGluIGRpcih0ZXN0X3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWVbMDoyXSBub3QgaW4gKCdDTycsICdfXycpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgbXNnPSdOYW1lcyBvdGhlciB0aGFuIENPTlZFUlRfVEVTVF8qIGZvdW5kLicpCisKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZW51bWVyYXRlLnB5IGIvTGliL3Rlc3QvdGVzdF9lbnVtZXJhdGUucHkKaW5kZXggMjYzMGNmMi4uZTQ1NWFkZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbnVtZXJhdGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lbnVtZXJhdGUucHkKQEAgLTIyMyw3ICsyMjMsNyBAQAogICAgIGRlZiB0ZXN0X29iam1ldGhvZHMoc2VsZik6CiAgICAgICAgICMgT2JqZWN0cyBtdXN0IGhhdmUgX19sZW5fXygpIGFuZCBfX2dldGl0ZW1fXygpIGltcGxlbWVudGVkLgogICAgICAgICBjbGFzcyBOb0xlbihvYmplY3QpOgotICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYpOiByZXR1cm4gMQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOiByZXR1cm4gMQogICAgICAgICBubCA9IE5vTGVuKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXZlcnNlZCwgbmwpCiAKQEAgLTIzMiw2ICsyMzIsMTMgQEAKICAgICAgICAgbmdpID0gTm9HZXRJdGVtKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXZlcnNlZCwgbmdpKQogCisgICAgICAgIGNsYXNzIEJsb2NrZWQob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKTogcmV0dXJuIDEKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gMgorICAgICAgICAgICAgX19yZXZlcnNlZF9fID0gTm9uZQorICAgICAgICBiID0gQmxvY2tlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmV2ZXJzZWQsIGIpCisKICAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CiAgICAgICAgIGZvciBkYXRhIGluICdhYmMnLCByYW5nZSg1KSwgdHVwbGUoZW51bWVyYXRlKCdhYmMnKSksIHJhbmdlKDEsMTcsNSk6CiAgICAgICAgICAgICBzZWxmLmNoZWNrX3BpY2tsZShyZXZlcnNlZChkYXRhKSwgbGlzdChkYXRhKVs6Oi0xXSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZXBvbGwucHkgYi9MaWIvdGVzdC90ZXN0X2Vwb2xsLnB5CmluZGV4IGE3MzU5ZTkuLmE3YWZmOGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZXBvbGwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lcG9sbC5weQpAQCAtMjgsNyArMjgsNiBAQAogaW1wb3J0IHRpbWUKIGltcG9ydCB1bml0dGVzdAogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGlmIG5vdCBoYXNhdHRyKHNlbGVjdCwgImVwb2xsIik6CiAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoInRlc3Qgd29ya3Mgb25seSBvbiBMaW51eCAyLjYiKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlcDMxNTEucHkgYi9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbl9oaWVyYXJjaHkucHkKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTGliL3Rlc3QvdGVzdF9wZXAzMTUxLnB5CnJlbmFtZSB0byBMaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbl9oaWVyYXJjaHkucHkKaW5kZXggN2IwZDQ2NS4uODY0OTU5NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAzMTUxLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9uX2hpZXJhcmNoeS5weQpAQCAtMiw3ICsyLDYgQEAKIGltcG9ydCBvcwogaW1wb3J0IHNlbGVjdAogaW1wb3J0IHNvY2tldAotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgZXJybm8KIGZyb20gZXJybm8gaW1wb3J0IEVFWElTVApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9leHRjYWxsLnB5IGIvTGliL3Rlc3QvdGVzdF9leHRjYWxsLnB5CmluZGV4IDVlZWEzNzkuLjU1ZjEzOTMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZXh0Y2FsbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2V4dGNhbGwucHkKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgID4+PiBnKCpOb3RoaW5nKCkpCiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgLi4uCi0gICAgVHlwZUVycm9yOiBnKCkgYXJndW1lbnQgYWZ0ZXIgKiBtdXN0IGJlIGFuIGl0ZXJhYmxlLCBub3QgTm90aGluZworICAgIFR5cGVFcnJvcjogJ05vdGhpbmcnIG9iamVjdCBpcyBub3QgaXRlcmFibGUKIAogICAgID4+PiBjbGFzcyBOb3RoaW5nOgogICAgIC4uLiAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiA1CkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICA+Pj4gZygqTm90aGluZygpKQogICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgIC4uLgotICAgIFR5cGVFcnJvcjogZygpIGFyZ3VtZW50IGFmdGVyICogbXVzdCBiZSBhbiBpdGVyYWJsZSwgbm90IE5vdGhpbmcKKyAgICBUeXBlRXJyb3I6ICdOb3RoaW5nJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlCiAKICAgICA+Pj4gY2xhc3MgTm90aGluZygpOgogICAgIC4uLiAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiA1CkBAIC0yMzEsMzQgKzIzMSwzMiBAQAogICAgID4+PiBoKCpoKQogICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgIC4uLgotICAgIFR5cGVFcnJvcjogaCgpIGFyZ3VtZW50IGFmdGVyICogbXVzdCBiZSBhbiBpdGVyYWJsZSwgbm90IGZ1bmN0aW9uCisgICAgVHlwZUVycm9yOiAnZnVuY3Rpb24nIG9iamVjdCBpcyBub3QgaXRlcmFibGUKIAogICAgID4+PiBkaXIoKmgpCiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgLi4uCi0gICAgVHlwZUVycm9yOiBkaXIoKSBhcmd1bWVudCBhZnRlciAqIG11c3QgYmUgYW4gaXRlcmFibGUsIG5vdCBmdW5jdGlvbgorICAgIFR5cGVFcnJvcjogJ2Z1bmN0aW9uJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlCiAKICAgICA+Pj4gTm9uZSgqaCkKICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAuLi4KLSAgICBUeXBlRXJyb3I6IE5vbmVUeXBlIG9iamVjdCBhcmd1bWVudCBhZnRlciAqIG11c3QgYmUgYW4gaXRlcmFibGUsIFwKLW5vdCBmdW5jdGlvbgorICAgIFR5cGVFcnJvcjogJ2Z1bmN0aW9uJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlCiAKICAgICA+Pj4gaCgqKmgpCiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgLi4uCi0gICAgVHlwZUVycm9yOiBoKCkgYXJndW1lbnQgYWZ0ZXIgKiogbXVzdCBiZSBhIG1hcHBpbmcsIG5vdCBmdW5jdGlvbgorICAgIFR5cGVFcnJvcjogJ2Z1bmN0aW9uJyBvYmplY3QgaXMgbm90IGEgbWFwcGluZwogCiAgICAgPj4+IGRpcigqKmgpCiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgLi4uCi0gICAgVHlwZUVycm9yOiBkaXIoKSBhcmd1bWVudCBhZnRlciAqKiBtdXN0IGJlIGEgbWFwcGluZywgbm90IGZ1bmN0aW9uCisgICAgVHlwZUVycm9yOiAnZnVuY3Rpb24nIG9iamVjdCBpcyBub3QgYSBtYXBwaW5nCiAKICAgICA+Pj4gTm9uZSgqKmgpCiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgLi4uCi0gICAgVHlwZUVycm9yOiBOb25lVHlwZSBvYmplY3QgYXJndW1lbnQgYWZ0ZXIgKiogbXVzdCBiZSBhIG1hcHBpbmcsIFwKLW5vdCBmdW5jdGlvbgorICAgIFR5cGVFcnJvcjogJ2Z1bmN0aW9uJyBvYmplY3QgaXMgbm90IGEgbWFwcGluZwogCiAgICAgPj4+IGRpcihiPTEsICoqeydiJzogMX0pCiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mYXVsdGhhbmRsZXIucHkgYi9MaWIvdGVzdC90ZXN0X2ZhdWx0aGFuZGxlci5weQppbmRleCAxNTYyZWVjLi5kMmJkMmQyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZhdWx0aGFuZGxlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZhdWx0aGFuZGxlci5weQpAQCAtMjMsNiArMjMsNyBAQAogICAgIF90ZXN0Y2FwaSA9IE5vbmUKIAogVElNRU9VVCA9IDAuNQorTVNfV0lORE9XUyA9IChvcy5uYW1lID09ICdudCcpCiAKIGRlZiBleHBlY3RlZF90cmFjZWJhY2sobGluZW5vMSwgbGluZW5vMiwgaGVhZGVyLCBtaW5fY291bnQ9MSk6CiAgICAgcmVnZXggPSBoZWFkZXIKQEAgLTU4LDggKzU5LDkgQEAKICAgICAgICAgICAgIHBhc3NfZmRzLmFwcGVuZChmZCkKICAgICAgICAgd2l0aCBzdXBwb3J0LlN1cHByZXNzQ3Jhc2hSZXBvcnQoKToKICAgICAgICAgICAgIHByb2Nlc3MgPSBzY3JpcHRfaGVscGVyLnNwYXduX3B5dGhvbignLWMnLCBjb2RlLCBwYXNzX2Zkcz1wYXNzX2ZkcykKLSAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKLSAgICAgICAgZXhpdGNvZGUgPSBwcm9jZXNzLndhaXQoKQorICAgICAgICAgICAgd2l0aCBwcm9jZXNzOgorICAgICAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICAgICAgZXhpdGNvZGUgPSBwcm9jZXNzLndhaXQoKQogICAgICAgICBvdXRwdXQgPSBzdXBwb3J0LnN0cmlwX3B5dGhvbl9zdGRlcnIoc3Rkb3V0KQogICAgICAgICBvdXRwdXQgPSBvdXRwdXQuZGVjb2RlKCdhc2NpaScsICdiYWNrc2xhc2hyZXBsYWNlJykKICAgICAgICAgaWYgZmlsZW5hbWU6CkBAIC03MywxNCArNzUsMTEgQEAKICAgICAgICAgICAgIHdpdGggb3BlbihmZCwgInJiIiwgY2xvc2VmZD1GYWxzZSkgYXMgZnA6CiAgICAgICAgICAgICAgICAgb3V0cHV0ID0gZnAucmVhZCgpCiAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQuZGVjb2RlKCdhc2NpaScsICdiYWNrc2xhc2hyZXBsYWNlJykKLSAgICAgICAgb3V0cHV0ID0gcmUuc3ViKCdDdXJyZW50IHRocmVhZCAweFswLTlhLWZdKycsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQ3VycmVudCB0aHJlYWQgWFhYJywKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCkKICAgICAgICAgcmV0dXJuIG91dHB1dC5zcGxpdGxpbmVzKCksIGV4aXRjb2RlCiAKLSAgICBkZWYgY2hlY2tfZmF0YWxfZXJyb3Ioc2VsZiwgY29kZSwgbGluZV9udW1iZXIsIG5hbWVfcmVnZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPU5vbmUsIGFsbF90aHJlYWRzPVRydWUsIG90aGVyX3JlZ2V4PU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZkPU5vbmUpOgorICAgIGRlZiBjaGVja19lcnJvcihzZWxmLCBjb2RlLCBsaW5lX251bWJlciwgZmF0YWxfZXJyb3IsICosCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPU5vbmUsIGFsbF90aHJlYWRzPVRydWUsIG90aGVyX3JlZ2V4PU5vbmUsCisgICAgICAgICAgICAgICAgICAgIGZkPU5vbmUsIGtub3dfY3VycmVudF90aHJlYWQ9VHJ1ZSk6CiAgICAgICAgICIiIgogICAgICAgICBDaGVjayB0aGF0IHRoZSBmYXVsdCBoYW5kbGVyIGZvciBmYXRhbCBlcnJvcnMgaXMgZW5hYmxlZCBhbmQgY2hlY2sgdGhlCiAgICAgICAgIHRyYWNlYmFjayBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzIG91dHB1dC4KQEAgLTg4LDE5ICs4NywyMiBAQAogICAgICAgICBSYWlzZSBhbiBlcnJvciBpZiB0aGUgb3V0cHV0IGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGZvcm1hdC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIGFsbF90aHJlYWRzOgotICAgICAgICAgICAgaGVhZGVyID0gJ0N1cnJlbnQgdGhyZWFkIFhYWCAobW9zdCByZWNlbnQgY2FsbCBmaXJzdCknCisgICAgICAgICAgICBpZiBrbm93X2N1cnJlbnRfdGhyZWFkOgorICAgICAgICAgICAgICAgIGhlYWRlciA9ICdDdXJyZW50IHRocmVhZCAweFswLTlhLWZdKycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaGVhZGVyID0gJ1RocmVhZCAweFswLTlhLWZdKycKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGhlYWRlciA9ICdTdGFjayAobW9zdCByZWNlbnQgY2FsbCBmaXJzdCknCi0gICAgICAgIHJlZ2V4ID0gIiIiCi0gICAgICAgICAgICBeRmF0YWwgUHl0aG9uIGVycm9yOiB7bmFtZX0KKyAgICAgICAgICAgIGhlYWRlciA9ICdTdGFjaycKKyAgICAgICAgcmVnZXggPSByIiIiCisgICAgICAgICAgICBee2ZhdGFsX2Vycm9yfQogCi0gICAgICAgICAgICB7aGVhZGVyfToKKyAgICAgICAgICAgIHtoZWFkZXJ9IFwobW9zdCByZWNlbnQgY2FsbCBmaXJzdFwpOgogICAgICAgICAgICAgICBGaWxlICI8c3RyaW5nPiIsIGxpbmUge2xpbmVub30gaW4gPG1vZHVsZT4KICAgICAgICAgICAgICIiIgogICAgICAgICByZWdleCA9IGRlZGVudChyZWdleC5mb3JtYXQoCiAgICAgICAgICAgICBsaW5lbm89bGluZV9udW1iZXIsCi0gICAgICAgICAgICBuYW1lPW5hbWVfcmVnZXgsCi0gICAgICAgICAgICBoZWFkZXI9cmUuZXNjYXBlKGhlYWRlcikpKS5zdHJpcCgpCisgICAgICAgICAgICBmYXRhbF9lcnJvcj1mYXRhbF9lcnJvciwKKyAgICAgICAgICAgIGhlYWRlcj1oZWFkZXIpKS5zdHJpcCgpCiAgICAgICAgIGlmIG90aGVyX3JlZ2V4OgogICAgICAgICAgICAgcmVnZXggKz0gJ3wnICsgb3RoZXJfcmVnZXgKICAgICAgICAgb3V0cHV0LCBleGl0Y29kZSA9IHNlbGYuZ2V0X291dHB1dChjb2RlLCBmaWxlbmFtZT1maWxlbmFtZSwgZmQ9ZmQpCkBAIC0xMDgsMTcgKzExMCwzNiBAQAogICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KG91dHB1dCwgcmVnZXgpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZXhpdGNvZGUsIDApCiAKKyAgICBkZWYgY2hlY2tfZmF0YWxfZXJyb3Ioc2VsZiwgY29kZSwgbGluZV9udW1iZXIsIG5hbWVfcmVnZXgsICoqa3cpOgorICAgICAgICBmYXRhbF9lcnJvciA9ICdGYXRhbCBQeXRob24gZXJyb3I6ICVzJyAlIG5hbWVfcmVnZXgKKyAgICAgICAgc2VsZi5jaGVja19lcnJvcihjb2RlLCBsaW5lX251bWJlciwgZmF0YWxfZXJyb3IsICoqa3cpCisKKyAgICBkZWYgY2hlY2tfd2luZG93c19leGNlcHRpb24oc2VsZiwgY29kZSwgbGluZV9udW1iZXIsIG5hbWVfcmVnZXgsICoqa3cpOgorICAgICAgICBmYXRhbF9lcnJvciA9ICdXaW5kb3dzIGZhdGFsIGV4Y2VwdGlvbjogJXMnICUgbmFtZV9yZWdleAorICAgICAgICBzZWxmLmNoZWNrX2Vycm9yKGNvZGUsIGxpbmVfbnVtYmVyLCBmYXRhbF9lcnJvciwgKiprdykKKwogICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2FpeCcpLAogICAgICAgICAgICAgICAgICAgICAgInRoZSBmaXJzdCBwYWdlIG9mIG1lbW9yeSBpcyBhIG1hcHBlZCByZWFkLW9ubHkgb24gQUlYIikKICAgICBkZWYgdGVzdF9yZWFkX251bGwoc2VsZik6Ci0gICAgICAgIHNlbGYuY2hlY2tfZmF0YWxfZXJyb3IoIiIiCi0gICAgICAgICAgICBpbXBvcnQgZmF1bHRoYW5kbGVyCi0gICAgICAgICAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKCkKLSAgICAgICAgICAgIGZhdWx0aGFuZGxlci5fcmVhZF9udWxsKCkKLSAgICAgICAgICAgICIiIiwKLSAgICAgICAgICAgIDMsCi0gICAgICAgICAgICAjIElzc3VlICMxMjcwMDogUmVhZCBOVUxMIHJhaXNlcyBTSUdJTEwgb24gTWFjIE9TIFggTGlvbgotICAgICAgICAgICAgJyg/OlNlZ21lbnRhdGlvbiBmYXVsdHxCdXMgZXJyb3J8SWxsZWdhbCBpbnN0cnVjdGlvbiknKQorICAgICAgICBpZiBub3QgTVNfV0lORE9XUzoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZmF0YWxfZXJyb3IoIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0IGZhdWx0aGFuZGxlcgorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5lbmFibGUoKQorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5fcmVhZF9udWxsKCkKKyAgICAgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAjIElzc3VlICMxMjcwMDogUmVhZCBOVUxMIHJhaXNlcyBTSUdJTEwgb24gTWFjIE9TIFggTGlvbgorICAgICAgICAgICAgICAgICcoPzpTZWdtZW50YXRpb24gZmF1bHQnCisgICAgICAgICAgICAgICAgICAgICd8QnVzIGVycm9yJworICAgICAgICAgICAgICAgICAgICAnfElsbGVnYWwgaW5zdHJ1Y3Rpb24pJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfd2luZG93c19leGNlcHRpb24oIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0IGZhdWx0aGFuZGxlcgorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5lbmFibGUoKQorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5fcmVhZF9udWxsKCkKKyAgICAgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAnYWNjZXNzIHZpb2xhdGlvbicpCiAKICAgICBkZWYgdGVzdF9zaWdzZWd2KHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX2ZhdGFsX2Vycm9yKCIiIgpAQCAtMTI5LDYgKzE1MCwxNyBAQAogICAgICAgICAgICAgMywKICAgICAgICAgICAgICdTZWdtZW50YXRpb24gZmF1bHQnKQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihub3QgSEFWRV9USFJFQURTLCAnbmVlZCB0aHJlYWRzJykKKyAgICBkZWYgdGVzdF9mYXRhbF9lcnJvcl9jX3RocmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19mYXRhbF9lcnJvcigiIiIKKyAgICAgICAgICAgIGltcG9ydCBmYXVsdGhhbmRsZXIKKyAgICAgICAgICAgIGZhdWx0aGFuZGxlci5lbmFibGUoKQorICAgICAgICAgICAgZmF1bHRoYW5kbGVyLl9mYXRhbF9lcnJvcl9jX3RocmVhZCgpCisgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICAzLAorICAgICAgICAgICAgJ2luIG5ldyB0aHJlYWQnLAorICAgICAgICAgICAga25vd19jdXJyZW50X3RocmVhZD1GYWxzZSkKKwogICAgIGRlZiB0ZXN0X3NpZ2FicnQoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfZmF0YWxfZXJyb3IoIiIiCiAgICAgICAgICAgICBpbXBvcnQgZmF1bHRoYW5kbGVyCkBAIC00NTgsMTQgKzQ5MCwxNCBAQAogICAgICAgICAgICAgbGluZW5vID0gOAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgbGluZW5vID0gMTAKLSAgICAgICAgcmVnZXggPSAiIiIKKyAgICAgICAgcmVnZXggPSByIiIiCiAgICAgICAgICAgICBeVGhyZWFkIDB4WzAtOWEtZl0rIFwobW9zdCByZWNlbnQgY2FsbCBmaXJzdFwpOgogICAgICAgICAgICAgKD86ICBGaWxlICIuKnRocmVhZGluZy5weSIsIGxpbmUgWzAtOV0rIGluIFtfYS16XSsKICAgICAgICAgICAgICl7ezEsM319ICBGaWxlICI8c3RyaW5nPiIsIGxpbmUgMjMgaW4gcnVuCiAgICAgICAgICAgICAgIEZpbGUgIi4qdGhyZWFkaW5nLnB5IiwgbGluZSBbMC05XSsgaW4gX2Jvb3RzdHJhcF9pbm5lcgogICAgICAgICAgICAgICBGaWxlICIuKnRocmVhZGluZy5weSIsIGxpbmUgWzAtOV0rIGluIF9ib290c3RyYXAKIAotICAgICAgICAgICAgQ3VycmVudCB0aHJlYWQgWFhYIFwobW9zdCByZWNlbnQgY2FsbCBmaXJzdFwpOgorICAgICAgICAgICAgQ3VycmVudCB0aHJlYWQgMHhbMC05YS1mXSsgXChtb3N0IHJlY2VudCBjYWxsIGZpcnN0XCk6CiAgICAgICAgICAgICAgIEZpbGUgIjxzdHJpbmc+IiwgbGluZSB7bGluZW5vfSBpbiBkdW1wCiAgICAgICAgICAgICAgIEZpbGUgIjxzdHJpbmc+IiwgbGluZSAyOCBpbiA8bW9kdWxlPiQKICAgICAgICAgICAgICIiIgpAQCAtNjM3LDkgKzY2OSw5IEBACiAgICAgICAgIHRyYWNlID0gJ1xuJy5qb2luKHRyYWNlKQogICAgICAgICBpZiBub3QgdW5yZWdpc3RlcjoKICAgICAgICAgICAgIGlmIGFsbF90aHJlYWRzOgotICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ0N1cnJlbnQgdGhyZWFkIFhYWCBcKG1vc3QgcmVjZW50IGNhbGwgZmlyc3RcKTpcbicKKyAgICAgICAgICAgICAgICByZWdleCA9IHInQ3VycmVudCB0aHJlYWQgMHhbMC05YS1mXSsgXChtb3N0IHJlY2VudCBjYWxsIGZpcnN0XCk6XG4nCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ1N0YWNrIFwobW9zdCByZWNlbnQgY2FsbCBmaXJzdFwpOlxuJworICAgICAgICAgICAgICAgIHJlZ2V4ID0gcidTdGFjayBcKG1vc3QgcmVjZW50IGNhbGwgZmlyc3RcKTpcbicKICAgICAgICAgICAgIHJlZ2V4ID0gZXhwZWN0ZWRfdHJhY2ViYWNrKDE0LCAzMiwgcmVnZXgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KHRyYWNlLCByZWdleCkKICAgICAgICAgZWxzZToKQEAgLTY5Niw2ICs3MjgsMjIgQEAKICAgICAgICAgICAgIHdpdGggc2VsZi5jaGVja19zdGRlcnJfbm9uZSgpOgogICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5yZWdpc3RlcihzaWduYWwuU0lHVVNSMSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKE1TX1dJTkRPV1MsICdzcGVjaWZpYyB0byBXaW5kb3dzJykKKyAgICBkZWYgdGVzdF9yYWlzZV9leGNlcHRpb24oc2VsZik6CisgICAgICAgIGZvciBleGMsIG5hbWUgaW4gKAorICAgICAgICAgICAgKCdFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTicsICdhY2Nlc3MgdmlvbGF0aW9uJyksCisgICAgICAgICAgICAoJ0VYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk8nLCAnaW50IGRpdmlkZSBieSB6ZXJvJyksCisgICAgICAgICAgICAoJ0VYQ0VQVElPTl9TVEFDS19PVkVSRkxPVycsICdzdGFjayBvdmVyZmxvdycpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja193aW5kb3dzX2V4Y2VwdGlvbigiIiIKKyAgICAgICAgICAgICAgICBpbXBvcnQgZmF1bHRoYW5kbGVyCisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmVuYWJsZSgpCisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLl9yYWlzZV9leGNlcHRpb24oZmF1bHRoYW5kbGVyLl97ZXhjfSkKKyAgICAgICAgICAgICAgICAiIiIuZm9ybWF0KGV4Yz1leGMpLAorICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgbmFtZSkKKworCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKaW5kZXggNGUzOTJiNy4uNjViZTMwZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQpAQCAtNyw3ICs3LDcgQEAKIGltcG9ydCBpbwogaW1wb3J0IF9weWlvIGFzIHB5aW8KIAotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0Citmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBVc2VyTGlzdAogCiBjbGFzcyBBdXRvRmlsZVRlc3RzOgpAQCAtMTM5LDcgKzEzOSw3IEBACiAKICAgICBkZWYgdGVzdE1vZGVTdHJpbmdzKHNlbGYpOgogICAgICAgICAjIGNoZWNrIGludmFsaWQgbW9kZSBzdHJpbmdzCi0gICAgICAgIGZvciBtb2RlIGluICgiIiwgImFVIiwgIndVKyIpOgorICAgICAgICBmb3IgbW9kZSBpbiAoIiIsICJhVSIsICJ3VSsiLCAiVSsiLCAiK1UiLCAiclUrIik6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZiA9IHNlbGYub3BlbihURVNURk4sIG1vZGUpCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlaW5wdXQucHkKaW5kZXggNzg0YmM5Mi4uNTY1NjMzZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlaW5wdXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlaW5wdXQucHkKQEAgLTIyLDggKzIyLDkgQEAKIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8sIFN0cmluZ0lPCiBmcm9tIGZpbGVpbnB1dCBpbXBvcnQgRmlsZUlucHV0LCBob29rX2VuY29kZWQKIAotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIFRFU1RGTiwgcnVuX3VuaXR0ZXN0LCBjaGVja193YXJuaW5ncworZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIFRFU1RGTiwgY2hlY2tfd2FybmluZ3MKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCB1bmxpbmsgYXMgc2FmZV91bmxpbmsKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB1bml0dGVzdCBpbXBvcnQgbW9jawogCiAKQEAgLTkyLDcgKzkzLDExIEBACiAgICAgICAgICAgICAgICAgdDIgPSB3cml0ZVRtcCgyLCBbIkxpbmUgJXMgb2YgZmlsZSAyXG4iICUgKGkrMSkgZm9yIGkgaW4gcmFuZ2UoMTApXSkKICAgICAgICAgICAgICAgICB0MyA9IHdyaXRlVG1wKDMsIFsiTGluZSAlcyBvZiBmaWxlIDNcbiIgJSAoaSsxKSBmb3IgaSBpbiByYW5nZSg1KV0pCiAgICAgICAgICAgICAgICAgdDQgPSB3cml0ZVRtcCg0LCBbIkxpbmUgJXMgb2YgZmlsZSA0XG4iICUgKGkrMSkgZm9yIGkgaW4gcmFuZ2UoMSldKQotICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyX3NpemVfdGVzdCh0MSwgdDIsIHQzLCB0NCwgYnMsIHJvdW5kKQorICAgICAgICAgICAgICAgIGlmIGJzOgorICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyX3NpemVfdGVzdCh0MSwgdDIsIHQzLCB0NCwgYnMsIHJvdW5kKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyX3NpemVfdGVzdCh0MSwgdDIsIHQzLCB0NCwgYnMsIHJvdW5kKQogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICByZW1vdmVfdGVtcGZpbGVzKHQxLCB0MiwgdDMsIHQ0KQogCkBAIC05NDAsNyArOTQ1LDggQEAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogICAgICAgICBlbmNvZGluZyA9IG9iamVjdCgpCi0gICAgICAgIHJlc3VsdCA9IGZpbGVpbnB1dC5ob29rX2VuY29kZWQoZW5jb2RpbmcpCisgICAgICAgIGVycm9ycyA9IG9iamVjdCgpCisgICAgICAgIHJlc3VsdCA9IGZpbGVpbnB1dC5ob29rX2VuY29kZWQoZW5jb2RpbmcsIGVycm9ycz1lcnJvcnMpCiAKICAgICAgICAgZmFrZV9vcGVuID0gSW52b2NhdGlvblJlY29yZGVyKCkKICAgICAgICAgb3JpZ2luYWxfb3BlbiA9IGJ1aWx0aW5zLm9wZW4KQEAgLTk1OCw4ICs5NjQsMjYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRJcyhhcmdzWzBdLCBmaWxlbmFtZSkKICAgICAgICAgc2VsZi5hc3NlcnRJcyhhcmdzWzFdLCBtb2RlKQogICAgICAgICBzZWxmLmFzc2VydElzKGt3YXJncy5wb3AoJ2VuY29kaW5nJyksIGVuY29kaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzKGt3YXJncy5wb3AoJ2Vycm9ycycpLCBlcnJvcnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoa3dhcmdzKQogCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAnd2InKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShiJ1x4ODBhYmMnKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2FmZV91bmxpbmssIFRFU1RGTikKKworICAgICAgICBkZWYgY2hlY2soZXJyb3JzLCBleHBlY3RlZF9saW5lcyk6CisgICAgICAgICAgICB3aXRoIEZpbGVJbnB1dChmaWxlcz1URVNURk4sIG1vZGU9J3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbmhvb2s9aG9va19lbmNvZGVkKCd1dGYtOCcsIGVycm9ycz1lcnJvcnMpKSBhcyBmaToKKyAgICAgICAgICAgICAgICBsaW5lcyA9IGxpc3QoZmkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBleHBlY3RlZF9saW5lcykKKworICAgICAgICBjaGVjaygnaWdub3JlJywgWydhYmMnXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IpOgorICAgICAgICAgICAgY2hlY2soJ3N0cmljdCcsIFsnYWJjJ10pCisgICAgICAgIGNoZWNrKCdyZXBsYWNlJywgWydcdWZmZmRhYmMnXSkKKyAgICAgICAgY2hlY2soJ2JhY2tzbGFzaHJlcGxhY2UnLCBbJ1xceDgwYWJjJ10pCisKICAgICBkZWYgdGVzdF9tb2RlcyhzZWxmKToKICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3diJykgYXMgZjoKICAgICAgICAgICAgICMgVVRGLTcgaXMgYSBjb252ZW5pZW50LCBzZWxkb20gdXNlZCBlbmNvZGluZwpAQCAtOTgxLDUgKzEwMDUsMTEgQEAKICAgICAgICAgICAgIGNoZWNrKCdyYicsIFsnQVxuJywgJ0JcclxuJywgJ0NccicsICdEXHUyMGFjJ10pCiAKIAorY2xhc3MgTWlzY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYWxsKHNlbGYpOgorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBmaWxlaW5wdXQpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkgYi9MaWIvdGVzdC90ZXN0X2Zsb2F0LnB5CmluZGV4IGNiMWY2ZGIuLjY4YjIxMmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mbG9hdC5weQpAQCAtMSw2ICsxLDUgQEAKIAogaW1wb3J0IGZyYWN0aW9ucwotaW1wb3J0IG1hdGgKIGltcG9ydCBvcGVyYXRvcgogaW1wb3J0IG9zCiBpbXBvcnQgcmFuZG9tCkBAIC0xNjIsMTEgKzE2MSwxMiBAQAogICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQoc3RyKHNlbGYpKSArIDEKIAotICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvbzEoKSksIDQyLikKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGb28yKCkpLCA0Mi4pCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoRm9vMygyMSkpLCA0Mi4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoRm9vMSgpKSwgNDIuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KEZvbzIoKSksIDQyLikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KEZvbzMoMjEpKSwgNDIuKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZsb2F0LCBGb280KDQyKSkKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGb29TdHIoJzgnKSksIDkuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KEZvb1N0cignOCcpKSwgOS4pCiAKICAgICAgICAgY2xhc3MgRm9vNToKICAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CkBAIC0xNzcsMTAgKzE3NywxNCBAQAogICAgICAgICBjbGFzcyBGOgogICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gT3RoZXJGbG9hdFN1YmNsYXNzKDQyLikKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGKCkpLCA0Mi4pCi0gICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShmbG9hdChGKCkpKSwgT3RoZXJGbG9hdFN1YmNsYXNzKQotICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKEZsb2F0U3ViY2xhc3MoRigpKSwgNDIuKQotICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoRmxvYXRTdWJjbGFzcyhGKCkpKSwgRmxvYXRTdWJjbGFzcykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KEYoKSksIDQyLikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZmxvYXQoRigpKSksIGZsb2F0KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmxvYXRTdWJjbGFzcyhGKCkpLCA0Mi4pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKEZsb2F0U3ViY2xhc3MoRigpKSksIEZsb2F0U3ViY2xhc3MpCiAKICAgICBkZWYgdGVzdF9pc19pbnRlZ2VyKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCgxLjEpLmlzX2ludGVnZXIoKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZm5tYXRjaC5weSBiL0xpYi90ZXN0L3Rlc3RfZm5tYXRjaC5weQppbmRleCBmYTM3ZjkwLi5hNWY1ODMyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZubWF0Y2gucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mbm1hdGNoLnB5CkBAIC02MiwxNCArNjIsMTQgQEAKIGNsYXNzIFRyYW5zbGF0ZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X3RyYW5zbGF0ZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFuc2xhdGUoJyonKSwgJy4qXFooP21zKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhbnNsYXRlKCc/JyksICcuXFooP21zKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhbnNsYXRlKCdhP2IqJyksICdhLmIuKlxaKD9tcyknKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYW5zbGF0ZSgnW2FiY10nKSwgJ1thYmNdXFooP21zKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhbnNsYXRlKCdbXV0nKSwgJ1tdXVxaKD9tcyknKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYW5zbGF0ZSgnWyF4XScpLCAnW154XVxaKD9tcyknKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYW5zbGF0ZSgnW154XScpLCAnW1xcXnhdXFooP21zKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhbnNsYXRlKCdbeCcpLCAnXFxbeFxaKD9tcyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYW5zbGF0ZSgnKicpLCByJy4qXFooP21zKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhbnNsYXRlKCc/JyksIHInLlxaKD9tcyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYW5zbGF0ZSgnYT9iKicpLCByJ2EuYi4qXFooP21zKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhbnNsYXRlKCdbYWJjXScpLCByJ1thYmNdXFooP21zKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhbnNsYXRlKCdbXV0nKSwgcidbXV1cWig/bXMpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFuc2xhdGUoJ1sheF0nKSwgcidbXnhdXFooP21zKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhbnNsYXRlKCdbXnhdJyksIHInW1xeeF1cWig/bXMpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFuc2xhdGUoJ1t4JyksIHInXFt4XFooP21zKScpCiAKIAogY2xhc3MgRmlsdGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkgYi9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQppbmRleCA5YjEzNjMyLi44YWZkNWI4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQpAQCAtMjc0LDcgKzI3NCw3IEBACiAgICAgICAgIHRlc3RfZXhjKCclZCcsICcxJywgVHlwZUVycm9yLCAiJWQgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgbm90IHN0ciIpCiAgICAgICAgIHRlc3RfZXhjKCcleCcsICcxJywgVHlwZUVycm9yLCAiJXggZm9ybWF0OiBhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBub3Qgc3RyIikKICAgICAgICAgdGVzdF9leGMoJyV4JywgMy4xNCwgVHlwZUVycm9yLCAiJXggZm9ybWF0OiBhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBub3QgZmxvYXQiKQotICAgICAgICB0ZXN0X2V4YygnJWcnLCAnMScsIFR5cGVFcnJvciwgImEgZmxvYXQgaXMgcmVxdWlyZWQiKQorICAgICAgICB0ZXN0X2V4YygnJWcnLCAnMScsIFR5cGVFcnJvciwgIm11c3QgYmUgcmVhbCBudW1iZXIsIG5vdCBzdHIiKQogICAgICAgICB0ZXN0X2V4Yygnbm8gZm9ybWF0JywgJzEnLCBUeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICJub3QgYWxsIGFyZ3VtZW50cyBjb252ZXJ0ZWQgZHVyaW5nIHN0cmluZyBmb3JtYXR0aW5nIikKICAgICAgICAgdGVzdF9leGMoJyVjJywgLTEsIE92ZXJmbG93RXJyb3IsICIlYyBhcmcgbm90IGluIHJhbmdlKDB4MTEwMDAwKSIpCkBAIC0zMDAsNiArMzAwLDggQEAKICAgICAgICAgdGVzdGNvbW1vbihiIiVjIiwgNywgYiJceDA3IikKICAgICAgICAgdGVzdGNvbW1vbihiIiVjIiwgYiJaIiwgYiJaIikKICAgICAgICAgdGVzdGNvbW1vbihiIiVjIiwgYnl0ZWFycmF5KGIiWiIpLCBiIloiKQorICAgICAgICB0ZXN0Y29tbW9uKGIiJTVjIiwgNjUsIGIiICAgIEEiKQorICAgICAgICB0ZXN0Y29tbW9uKGIiJS01YyIsIDY1LCBiIkEgICAgIikKICAgICAgICAgIyAlYiB3aWxsIGluc2VydCBhIHNlcmllcyBvZiBieXRlcywgZWl0aGVyIGZyb20gYSB0eXBlIHRoYXQgc3VwcG9ydHMKICAgICAgICAgIyB0aGUgUHlfYnVmZmVyIHByb3RvY29sLCBvciBzb21ldGhpbmcgdGhhdCBoYXMgYSBfX2J5dGVzX18gbWV0aG9kCiAgICAgICAgIGNsYXNzIEZha2VCeXRlcyhvYmplY3QpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mcmFjdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQppbmRleCA5ZGY0YTU0Li43OTA1YzM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQpAQCAtMTUwLDYgKzE1MCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgIjMvMiIsIDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgMywgMGopCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgMywgMWopCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgMSwgMiwgMykKIAogICAgIEByZXF1aXJlc19JRUVFXzc1NAogICAgIGRlZiB0ZXN0SW5pdEZyb21GbG9hdChzZWxmKToKQEAgLTI2MywxMyArMjY0LDEzIEBACiAgICAgICAgIG5hbiA9IGluZiAtIGluZgogICAgICAgICAjIGJ1ZyAxNjQ2OTogZXJyb3IgdHlwZXMgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBmbG9hdCAtPiBpbnQKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgIkNhbm5vdCBjb252ZXJ0IGluZiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgImNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2Zsb2F0LCBpbmYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJDYW5ub3QgY29udmVydCAtaW5mIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZmxvYXQsIC1pbmYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIFZhbHVlRXJyb3IsICJDYW5ub3QgY29udmVydCBuYW4gdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJjYW5ub3QgY29udmVydCBOYU4gdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZmxvYXQsIG5hbikKIAogICAgIGRlZiB0ZXN0RnJvbURlY2ltYWwoc2VsZik6CkBAIC0yODQsMTYgKzI4NSwxNiBAQAogCiAgICAgICAgICMgYnVnIDE2NDY5OiBlcnJvciB0eXBlcyBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIGRlY2ltYWwgLT4gaW50CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJDYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgImNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2RlY2ltYWwsIERlY2ltYWwoImluZiIpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiQ2Fubm90IGNvbnZlcnQgLUluZmluaXR5IHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgiLWluZiIpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBWYWx1ZUVycm9yLCAiQ2Fubm90IGNvbnZlcnQgTmFOIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2RlY2ltYWwsIERlY2ltYWwoIm5hbiIpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBWYWx1ZUVycm9yLCAiQ2Fubm90IGNvbnZlcnQgc05hTiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgVmFsdWVFcnJvciwgImNhbm5vdCBjb252ZXJ0IE5hTiB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9kZWNpbWFsLCBEZWNpbWFsKCJzbmFuIikpCiAKICAgICBkZWYgdGVzdExpbWl0RGVub21pbmF0b3Ioc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZzdHJpbmcucHkgYi9MaWIvdGVzdC90ZXN0X2ZzdHJpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhMWIyMQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3RfZnN0cmluZy5weQpAQCAtMCwwICsxLDcwNSBAQAoraW1wb3J0IGFzdAoraW1wb3J0IHR5cGVzCitpbXBvcnQgZGVjaW1hbAoraW1wb3J0IHVuaXR0ZXN0CisKK2FfZ2xvYmFsID0gJ2dsb2JhbCB2YXJpYWJsZScKKworIyBZb3UgY291bGQgYXJndWUgdGhhdCBJJ20gdG9vIHN0cmljdCBpbiBsb29raW5nIGZvciBzcGVjaWZpYyBlcnJvcgorIyAgdmFsdWVzIHdpdGggYXNzZXJ0UmFpc2VzUmVnZXgsIGJ1dCB3aXRob3V0IGl0IGl0J3Mgd2F5IHRvbyBlYXN5IHRvCisjICBtYWtlIGEgc3ludGF4IGVycm9yIGluIHRoZSB0ZXN0IHN0cmluZ3MuIEVzcGVjaWFsbHkgd2l0aCBhbGwgb2YgdGhlCisjICB0cmlwbGUgcXVvdGVzLCByYXcgc3RyaW5ncywgYmFja3NsYXNoZXMsIGV0Yy4gSSB0aGluayBpdCdzIGEKKyMgIHdvcnRod2hpbGUgdHJhZGVvZmYuIFdoZW4gSSBzd2l0Y2hlZCB0byB0aGlzIG1ldGhvZCwgSSBmb3VuZCBtYW55CisjICBleGFtcGxlcyB3aGVyZSBJIHdhc24ndCB0ZXN0aW5nIHdoYXQgSSB0aG91Z2h0IEkgd2FzLgorCitjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGFzc2VydEFsbFJhaXNlKHNlbGYsIGV4Y2VwdGlvbl90eXBlLCByZWdleCwgZXJyb3Jfc3RyaW5ncyk6CisgICAgICAgIGZvciBzdHIgaW4gZXJyb3Jfc3RyaW5nczoKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHN0cj1zdHIpOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChleGNlcHRpb25fdHlwZSwgcmVnZXgpOgorICAgICAgICAgICAgICAgICAgICBldmFsKHN0cikKKworICAgIGRlZiB0ZXN0X19mb3JtYXRfX2xvb2t1cChzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgX19mb3JtYXRfXyBpcyBsb29rZWQgdXAgb24gdGhlIHR5cGUsIG5vdCB0aGUgaW5zdGFuY2UuCisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBzcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2NsYXNzJworCisgICAgICAgIHggPSBYKCkKKworICAgICAgICAjIEFkZCBhIGJvdW5kIF9fZm9ybWF0X18gbWV0aG9kIHRvIHRoZSAneScgaW5zdGFuY2UsIGJ1dCBub3QKKyAgICAgICAgIyAgdGhlICd4JyBpbnN0YW5jZS4KKyAgICAgICAgeSA9IFgoKQorICAgICAgICB5Ll9fZm9ybWF0X18gPSB0eXBlcy5NZXRob2RUeXBlKGxhbWJkYSBzZWxmLCBzcGVjOiAnaW5zdGFuY2UnLCB5KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eX0nLCBmb3JtYXQoeSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eX0nLCAnY2xhc3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh4KSwgZm9ybWF0KHkpKQorCisgICAgICAgICMgX19mb3JtYXRfXyBpcyBub3QgY2FsbGVkIHRoaXMgd2F5LCBidXQgc3RpbGwgbWFrZSBzdXJlIGl0CisgICAgICAgICMgIHJldHVybnMgd2hhdCB3ZSBleHBlY3QgKHNvIHdlIGNhbiBtYWtlIHN1cmUgd2UncmUgYnlwYXNzaW5nCisgICAgICAgICMgIGl0KS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9fZm9ybWF0X18oJycpLCAnY2xhc3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX19mb3JtYXRfXygnJyksICdpbnN0YW5jZScpCisKKyAgICAgICAgIyBUaGlzIGlzIGhvdyBfX2Zvcm1hdF9fIGlzIGFjdHVhbGx5IGNhbGxlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHgpLl9fZm9ybWF0X18oeCwgJycpLCAnY2xhc3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoeSkuX19mb3JtYXRfXyh5LCAnJyksICdjbGFzcycpCisKKyAgICBkZWYgdGVzdF9hc3Qoc2VsZik6CisgICAgICAgICMgSW5zcGlyZWQgYnkgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI0OTc1CisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQorICAgICAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuY2FsbGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHJldHVybiA0CisgICAgICAgIHggPSBYKCkKKyAgICAgICAgZXhwciA9ICIiIgorYSA9IDEwCitmJ3thICogeCgpfSciIiIKKyAgICAgICAgdCA9IGFzdC5wYXJzZShleHByKQorICAgICAgICBjID0gY29tcGlsZSh0LCAnJywgJ2V4ZWMnKQorCisgICAgICAgICMgTWFrZSBzdXJlIHggd2FzIG5vdCBjYWxsZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoeC5jYWxsZWQpCisKKyAgICAgICAgIyBBY3R1YWxseSBydW4gdGhlIGNvZGUuCisgICAgICAgIGV4ZWMoYykKKworICAgICAgICAjIE1ha2Ugc3VyZSB4IHdhcyBjYWxsZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LmNhbGxlZCkKKworICAgIGRlZiB0ZXN0X2xpdGVyYWxfZXZhbChzZWxmKToKKyAgICAgICAgIyBXaXRoIG5vIGV4cHJlc3Npb25zLCBhbiBmLXN0cmluZyBpcyBva2F5LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5saXRlcmFsX2V2YWwoImYneCciKSwgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5saXRlcmFsX2V2YWwoImYneCcgJ3knIiksICd4eScpCisKKyAgICAgICAgIyBCdXQgdGhpcyBzaG91bGQgcmFpc2UgYW4gZXJyb3IuCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAnbWFsZm9ybWVkIG5vZGUgb3Igc3RyaW5nJyk6CisgICAgICAgICAgICBhc3QubGl0ZXJhbF9ldmFsKCJmJ3h7M30nIikKKworICAgICAgICAjIEFzIHNob3VsZCB0aGlzLCB3aGljaCB1c2VzIGEgZGlmZmVyZW50IGFzdCBub2RlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAnbWFsZm9ybWVkIG5vZGUgb3Igc3RyaW5nJyk6CisgICAgICAgICAgICBhc3QubGl0ZXJhbF9ldmFsKCJmJ3szfSciKQorCisgICAgZGVmIHRlc3RfYXN0X2NvbXBpbGVfdGltZV9jb25jYXQoc2VsZik6CisgICAgICAgIHggPSBbJyddCisKKyAgICAgICAgZXhwciA9ICIiInhbMF0gPSAnZm9vJyBmJ3szfSciIiIKKyAgICAgICAgdCA9IGFzdC5wYXJzZShleHByKQorICAgICAgICBjID0gY29tcGlsZSh0LCAnJywgJ2V4ZWMnKQorICAgICAgICBleGVjKGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFswXSwgJ2ZvbzMnKQorCisgICAgZGVmIHRlc3RfbGl0ZXJhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnYScsICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJyAnLCAnICcpCisKKyAgICBkZWYgdGVzdF91bnRlcm1pbmF0ZWRfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IHVudGVybWluYXRlZCBzdHJpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyIiIiZid7IngnIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIiIiZid7Inh9JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciIiImYneygieCciIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiIiJmJ3soInh9JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X21pc21hdGNoZWRfcGFyZW5zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IG1pc21hdGNoZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7KCh9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9kb3VibGVfYnJhY2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3snLCAneycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhe3snLCAnYXsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3tiJywgJ3tiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2F7e2InLCAnYXtiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319JywgJ30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnYX19JywgJ2F9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319YicsICd9YicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhfX1iJywgJ2F9YicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t7ezEwfScsICd7MTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX17MTB9JywgJ30xMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid9fXt7ezEwfScsICd9ezEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319YXt7ezEwfScsICd9YXsxMCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMH17eycsICcxMHsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwfX19JywgJzEwfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTB9fX17eycsICcxMH17JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMH19fWF7eycgJ30nLCAnMTB9YXt9JykKKworICAgICAgICAjIEluc2lkZSBvZiBzdHJpbmdzLCBkb24ndCBpbnRlcnByZXQgZG91YmxlZCBicmFja2V0cy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sie3t9fSJ9JywgJ3t7fX0nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoVHlwZUVycm9yLCAndW5oYXNoYWJsZSB0eXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYneyB7e319IH0nIiwgIyBkaWN0IGluIGEgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jb21waWxlX3RpbWVfY29uY2F0KHNlbGYpOgorICAgICAgICB4ID0gJ2RlZicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjJyBmJyMjIHt4fWdoaScsICdhYmMjIyBkZWZnaGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmMnIGYne3h9JyAnZ2hpJywgJ2FiY2RlZmdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYycgZid7eH0nICdnaCcgZidpe3g6NH0nLCAnYWJjZGVmZ2hpZGVmICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t4fScgZid7eH0nLCAne3h9ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3gnIGYne3h9JywgJ3t4ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3h9JyBmJ3t4fScsICd7eH1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7e3h9fScgZid7eH0nLCAne3t4fX1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7e3gnIGYne3h9JywgJ3t7eGRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3h9fScgZid7eH0nLCAneH19ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fScgJ3h9fScsICdkZWZ4fX0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JyAnJywgJ2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycgZid7eH0nICcnLCAnZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJ3t4fScsICdkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JyAnMicsICdkZWYyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMScgZid7eH0nICcyJywgJzFkZWYyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMScgZid7eH0nLCAnMWRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH0nIGYnLXt4fScsICdkZWYtZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnIGYnJyAnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycgZicnICcnIGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycgJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyAnJyBmJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyAnJyBmJycgJycsICcnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3szJyBmJ30nIiwgICMgY2FuJ3QgY29uY2F0IHRvIGdldCBhIHZhbGlkIGYtc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jb21tZW50cyhzZWxmKToKKyAgICAgICAgIyBUaGVzZSBhcmVuJ3QgY29tbWVudHMsIHNpbmNlIHRoZXkncmUgaW4gc3RyaW5ncy4KKyAgICAgICAgZCA9IHsnIyc6ICdoYXNoJ30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIyJ9JywgJyMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbIiMiXX0nLCAnaGFzaCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nIGNhbm5vdCBpbmNsdWRlICcjJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3sxI30nIiwgICAjIGVycm9yIGJlY2F1c2UgdGhlIGV4cHJlc3Npb24gYmVjb21lcyAiKDEjKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMoIyl9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9tYW55X2V4cHJlc3Npb25zKHNlbGYpOgorICAgICAgICAjIENyZWF0ZSBhIHN0cmluZyB3aXRoIG1hbnkgZXhwcmVzc2lvbnMgaW4gaXQuIE5vdGUgdGhhdAorICAgICAgICAjICBiZWNhdXNlIHdlIGhhdmUgYSBzcGFjZSBpbiBoZXJlIGFzIGEgbGl0ZXJhbCwgd2UncmUgYWN0dWFsbHkKKyAgICAgICAgIyAgZ29pbmcgdG8gdXNlIHR3aWNlIGFzIG1hbnkgYXN0IG5vZGVzOiBvbmUgZm9yIGVhY2ggbGl0ZXJhbAorICAgICAgICAjICBwbHVzIG9uZSBmb3IgZWFjaCBleHByZXNzaW9uLgorICAgICAgICBkZWYgYnVpbGRfZnN0cihuLCBleHRyYT0nJyk6CisgICAgICAgICAgICByZXR1cm4gImYnIiArICgne3h9ICcgKiBuKSArIGV4dHJhICsgIiciCisKKyAgICAgICAgeCA9ICdYJworICAgICAgICB3aWR0aCA9IDEKKworICAgICAgICAjIFRlc3QgYXJvdW5kIDI1Ni4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjUwLCAyNjApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGJ1aWxkX2ZzdHIoaSkpLCAoeCsnICcpKmkpCisKKyAgICAgICAgIyBUZXN0IGNvbmNhdGVuYXRpbmcgMiBsYXJncyBmc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGJ1aWxkX2ZzdHIoMjU1KSoyNTYpLCAoeCsnICcpKigyNTUqMjU2KSkKKworICAgICAgICBzID0gYnVpbGRfZnN0cigyNTMsICd7eDp7d2lkdGh9fSAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwocyksICh4KycgJykqMjU0KQorCisgICAgICAgICMgVGVzdCBsb3RzIG9mIGV4cHJlc3Npb25zIGFuZCBjb25zdGFudHMsIGNvbmNhdGVuYXRlZC4KKyAgICAgICAgcyA9ICJmJ3sxfScgJ3gnICd5JyIgKiAxMDI0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChzKSwgJzF4eScgKiAxMDI0KQorCisgICAgZGVmIHRlc3RfZm9ybWF0X3NwZWNpZmllcl9leHByZXNzaW9ucyhzZWxmKToKKyAgICAgICAgd2lkdGggPSAxMAorICAgICAgICBwcmVjaXNpb24gPSA0CisgICAgICAgIHZhbHVlID0gZGVjaW1hbC5EZWNpbWFsKCcxMi4zNDU2NycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7d2lkdGh9LntwcmVjaXNpb259fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYncmVzdWx0OiB7dmFsdWU6e3dpZHRoIXJ9LntwcmVjaXNpb259fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYncmVzdWx0OiB7dmFsdWU6e3dpZHRoOjB9LntwcmVjaXNpb246MX19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7MX17MDowfS57cHJlY2lzaW9uOjF9fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYncmVzdWx0OiB7dmFsdWU6eyAxfXsgMDowfS57IHByZWNpc2lvbjoxfX0nLCAncmVzdWx0OiAgICAgIDEyLjM1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMDojezF9MHh9JywgJyAgICAgICAweGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwOnsiIyJ9MXswfXsieCJ9fScsICcgICAgICAgMHhhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3stMTA6LXsiIyJ9MXswfXh9JywgJyAgICAgIC0weGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYney0xMDp7Ii0ifSN7MX0weyJ4In19JywgJyAgICAgIC0weGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwOiN7MyAhPSB7NDo1fSBhbmQgd2lkdGh9eH0nLCAnICAgICAgIDB4YScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIiIiZid7InMiIXJ7IjoxMCJ9fSciIiIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGxvb2tzIGxpa2UgYSBuZXN0ZWQgZm9ybWF0IHNwZWMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImludmFsaWQgc3ludGF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIyBJbnZhbGlkIHN5bnRheCBpbnNpZGUgYSBuZXN0ZWQgc3BlYy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezQ6ey81fX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IGV4cHJlc3Npb25zIG5lc3RlZCB0b28gZGVlcGx5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIyBDYW4ndCBuZXN0IGZvcm1hdCBzcGVjaWZpZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZidyZXN1bHQ6IHt2YWx1ZTp7d2lkdGg6ezB9fS57cHJlY2lzaW9uOjF9fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogaW52YWxpZCBjb252ZXJzaW9uIGNoYXJhY3RlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyMgTm8gZXhwYW5zaW9uIGluc2lkZSBjb252ZXJzaW9uIG9yIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICB0aGUgOiBvciAhIGl0c2VsZi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiZid7InMiIXsiciJ9fSciIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9zaWRlX2VmZmVjdF9vcmRlcihzZWxmKToKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmkgPSAwCisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBzcGVjKToKKyAgICAgICAgICAgICAgICBzZWxmLmkgKz0gMQorICAgICAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZi5pKQorCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fSB7eH0nLCAnMSAyJykKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfZXhwcmVzc2lvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2Ytc3RyaW5nOiBlbXB0eSBleHByZXNzaW9uIG5vdCBhbGxvd2VkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYne30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyB9JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnIHt9ICciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IXJ9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sgIXJ9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sxMDp7IH19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJyB7IH0gJyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYXRjaCB0aGUgZW1wdHkgZXhwcmVzc2lvbiBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIGludmFsaWQgY29udmVyc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyF4fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7ICF4cn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyF4On0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyF4OmF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sgIXhyOn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyAheHI6YX0nIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezp9JyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXZSBmaW5kIHRoZSBlbXB0eSBleHByZXNzaW9uIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgbWlzc2luZyBjbG9zaW5nIGJyYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7ISciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IXM6JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3s6JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3s6eCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfcGFyZW5zX2luX2V4cHJlc3Npb25zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMsfScsICcoMywpJykKKworICAgICAgICAjIEFkZCB0aGVzZSBiZWNhdXNlIHdoZW4gYW4gZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIHBhcmVucworICAgICAgICAjICBhcmUgYWRkZWQgYXJvdW5kIGl0LiBCdXQgd2Ugc2hvdWxkbid0IGdvIGZyb20gYW4gaW52YWxpZAorICAgICAgICAjICBleHByZXNzaW9uIHRvIGEgdmFsaWQgb25lLiBUaGUgYWRkZWQgcGFyZW5zIGFyZSBqdXN0CisgICAgICAgICMgIHN1cHBvc2VkIHRvIGFsbG93IHdoaXRlc3BhY2UgKGluY2x1ZGluZyBuZXdsaW5lcykuCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdpbnZhbGlkIHN5bnRheCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3ssfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7LH0nIiwgICMgdGhpcyBpcyAoLCksIHdoaWNoIGlzIGFuIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnezMpKyg0fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdFT0wgd2hpbGUgc2Nhbm5pbmcgc3RyaW5nIGxpdGVyYWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7XG59JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9ub19iYWNrc2xhc2hlcyhzZWxmKToKKyAgICAgICAgIyBTZWUgaXNzdWUgMjc5MjEKKworICAgICAgICAjIFRoZXNlIHNob3VsZCB3b3JrLCBidXQgY3VycmVudGx5IGRvbid0CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdiYWNrc2xhc2hlcyBub3QgYWxsb3dlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZidcdCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezJ9XHQnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3syfVx0ezN9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZidcdHszfSciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZidcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3syfVxOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezJ9XE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9ezN9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZidcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX17M30nIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnXHUwMzk0JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7Mn1cdTAzOTQnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3syfVx1MDM5NHszfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnXHUwMzk0ezN9JyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ1xVMDAwMDAzOTQnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3syfVxVMDAwMDAzOTQnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3syfVxVMDAwMDAzOTR7M30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ1xVMDAwMDAzOTR7M30nIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnXHgyMCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezJ9XHgyMCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezJ9XHgyMHszfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnXHgyMHszfSciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZicyXHgyMCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnMlx4MjAzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZicyXHgyMDMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICAjIEFuZCB0aGVzZSBkb24ndCB3b3JrIG5vdywgYW5kIHNob3VsZG4ndCB3b3JrIGluIHRoZSBmdXR1cmUuCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdiYWNrc2xhc2hlcyBub3QgYWxsb3dlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZid7XCdhXCd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7XHQzfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgIyBhZGQgdGhpcyB3aGVuIGJhY2tzbGFzaGVzIGFyZSBhbGxvd2VkIGFnYWluLiBzZWUgaXNzdWUgMjc5MjEKKyAgICAjIHRoZXNlIHRlc3Qgd2lsbCBiZSBuZWVkZWQgYmVjYXVzZSB1bmljb2RlIG5hbWVzIHdpbGwgYmUgcGFyc2VkCisgICAgIyBkaWZmZXJlbnRseSBvbmNlIGJhY2tzbGFzaGVzIGFyZSBhbGxvd2VkIGluc2lkZSBleHByZXNzaW9ucworICAgICMjIGRlZiB0ZXN0X21pc2Zvcm1lZF91bmljb2RlX2NoYXJhY3Rlcl9uYW1lKHNlbGYpOgorICAgICMjICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAneHgnLAorICAgICMjICAgICAgICAgICAgICAgICAgICAgICAgIFtyImYnXE4nIiwKKyAgICAjIyAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ1xOeyciLAorICAgICMjICAgICAgICAgICAgICAgICAgICAgICAgIFtyImYnXE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEnIiwKKyAgICAjIyAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X25ld2xpbmVzX2luX2V4cHJlc3Npb25zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezB9JywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJmJycnezMrCis0fScnJywgJzcnKQorCisgICAgZGVmIHRlc3RfbGFtYmRhKHNlbGYpOgorICAgICAgICB4ID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyhsYW1iZGEgeTp4KnkpKCI4Iikhcn0nLCAiJzg4ODg4JyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7KGxhbWJkYSB5OngqeSkoIjgiKSFyOjEwfScsICInODg4ODgnICAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sobGFtYmRhIHk6eCp5KSgiOCIpOjEwfScsICI4ODg4OCAgICAgIikKKworICAgICAgICAjIGxhbWJkYSBkb2Vzbid0IHdvcmsgd2l0aG91dCBwYXJlbnMsIGJlY2F1c2UgdGhlIGNvbG9uCisgICAgICAgICMgIG1ha2VzIHRoZSBwYXJzZXIgdGhpbmsgaXQncyBhIGZvcm1hdF9zcGVjCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICd1bmV4cGVjdGVkIEVPRiB3aGlsZSBwYXJzaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYne2xhbWJkYSB4Onh9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF95aWVsZChzZWxmKToKKyAgICAgICAgIyBOb3QgdGVycmlibHkgdXNlZnVsLCBidXQgbWFrZSBzdXJlIHRoZSB5aWVsZCB0dXJucworICAgICAgICAjICBhIGZ1bmN0aW9uIGludG8gYSBnZW5lcmF0b3IKKyAgICAgICAgZGVmIGZuKHkpOgorICAgICAgICAgICAgZid5Ont5aWVsZCB5KjJ9JworCisgICAgICAgIGcgPSBmbig0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoZyksIDgpCisKKyAgICBkZWYgdGVzdF95aWVsZF9zZW5kKHNlbGYpOgorICAgICAgICBkZWYgZm4oeCk6CisgICAgICAgICAgICB5aWVsZCBmJ3g6e3lpZWxkIChsYW1iZGEgaTogeCAqIGkpfScKKworICAgICAgICBnID0gZm4oMTApCisgICAgICAgIHRoZV9sYW1iZGEgPSBuZXh0KGcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhlX2xhbWJkYSg0KSwgNDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZy5zZW5kKCdzdHJpbmcnKSwgJ3g6c3RyaW5nJykKKworICAgIGRlZiB0ZXN0X2V4cHJlc3Npb25zX3dpdGhfdHJpcGxlX3F1b3RlZF9zdHJpbmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYieycnJ3gnJyd9IiwgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYieycnJ2VyaWMncycnJ30iLCAiZXJpYydzIikKKworICAgICAgICAjIFRlc3QgY29uY2F0ZW5hdGlvbiB3aXRoaW4gYW4gZXhwcmVzc2lvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJ4IiAiIiJlcmljInMiIiIgInkifScsICd4ZXJpYyJzeScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IngiICIiImVyaWMicyIiIn0nLCAneGVyaWMicycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IiIiZXJpYyJzIiIiICJ5In0nLCAnZXJpYyJzeScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IiIieCIiIiAiIiJlcmljInMiIiIgInkifScsICd4ZXJpYyJzeScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IiIieCIiIiAiIiJlcmljInMiIiIgIiIieSIiIn0nLCAneGVyaWMic3knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3IiIiJ4IiIiICIiImVyaWMicyIiIiAiIiJ5IiIifScsICd4ZXJpYyJzeScpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV92YXJzKHNlbGYpOgorICAgICAgICB4ID0gOTgKKyAgICAgICAgeSA9ICdhYmMnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH17eX0nLCAnOThhYmMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidYe3h9e3l9JywgJ1g5OGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH1Ye3l9JywgJzk4WGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH17eX1YJywgJzk4YWJjWCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1h7eH1Ze3l9JywgJ1g5OFlhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnWHt4fXt5fVknLCAnWDk4YWJjWScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH1Ye3l9WScsICc5OFhhYmNZJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnWHt4fVl7eX1aJywgJ1g5OFlhYmNaJykKKworICAgIGRlZiB0ZXN0X2Nsb3N1cmUoc2VsZik6CisgICAgICAgIGRlZiBvdXRlcih4KToKKyAgICAgICAgICAgIGRlZiBpbm5lcigpOgorICAgICAgICAgICAgICAgIHJldHVybiBmJ3g6e3h9JworICAgICAgICAgICAgcmV0dXJuIGlubmVyCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRlcignOTg3JykoKSwgJ3g6OTg3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRlcig3KSgpLCAneDo3JykKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgeSA9IDIKKyAgICAgICAgZGVmIGYoeCwgd2lkdGgpOgorICAgICAgICAgICAgcmV0dXJuIGYneD17eCp5Ont3aWR0aH19JworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZignZm9vJywgMTApLCAneD1mb29mb28gICAgJykKKyAgICAgICAgeCA9ICdiYXInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigxMCwgMTApLCAneD0gICAgICAgIDIwJykKKworICAgIGRlZiB0ZXN0X2xvY2FscyhzZWxmKToKKyAgICAgICAgdmFsdWUgPSAxMjMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3Y6e3ZhbHVlfScsICd2OjEyMycpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX3ZhcmlhYmxlKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE5hbWVFcnJvcik6CisgICAgICAgICAgICBmJ3Y6e3ZhbHVlfScKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfZm9ybWF0X3NwZWMoc2VsZik6CisgICAgICAgIGNsYXNzIE86CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBzcGVjKToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc3BlYzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcqJworICAgICAgICAgICAgICAgIHJldHVybiBzcGVjCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tPKCk6eH0nLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7TygpfScsICcqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tPKCk6fScsICcqJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezM6fScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIXM6fScsICczJykKKworICAgIGRlZiB0ZXN0X2dsb2JhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsfScsICdnOmdsb2JhbCB2YXJpYWJsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbCFyfScsICJnOidnbG9iYWwgdmFyaWFibGUnIikKKworICAgICAgICBhX2xvY2FsID0gJ2xvY2FsIHZhcmlhYmxlJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9IGw6e2FfbG9jYWx9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZzpnbG9iYWwgdmFyaWFibGUgbDpsb2NhbCB2YXJpYWJsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbCFyfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgImc6J2dsb2JhbCB2YXJpYWJsZSciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9IGw6e2FfbG9jYWwhcn0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnOmdsb2JhbCB2YXJpYWJsZSBsOidsb2NhbCB2YXJpYWJsZSciKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm1vZHVsZSAndW5pdHRlc3QnIGZyb20iLCBmJ3t1bml0dGVzdH0nKQorCisgICAgZGVmIHRlc3Rfc2hhZG93ZWRfZ2xvYmFsKHNlbGYpOgorICAgICAgICBhX2dsb2JhbCA9ICdyZWFsbHkgYSBsb2NhbCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsfScsICdnOnJlYWxseSBhIGxvY2FsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsIXJ9JywgImc6J3JlYWxseSBhIGxvY2FsJyIpCisKKyAgICAgICAgYV9sb2NhbCA9ICdsb2NhbCB2YXJpYWJsZScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsfSBsOnthX2xvY2FsfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2c6cmVhbGx5IGEgbG9jYWwgbDpsb2NhbCB2YXJpYWJsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbCFyfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgImc6J3JlYWxseSBhIGxvY2FsJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0gbDp7YV9sb2NhbCFyfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgImc6cmVhbGx5IGEgbG9jYWwgbDonbG9jYWwgdmFyaWFibGUnIikKKworICAgIGRlZiB0ZXN0X2NhbGwoc2VsZik6CisgICAgICAgIGRlZiBmb28oeCk6CisgICAgICAgICAgICByZXR1cm4gJ3g9JyArIHN0cih4KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Zm9vKDEwKX0nLCAneD0xMCcpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfZnN0cmluZ3Moc2VsZik6CisgICAgICAgIHkgPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZiJ7MH0iKjN9JywgJzAwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZiJ7eX0iKjN9JywgJzU1NScpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX3N0cmluZ19wcmVmaXhlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ3VuZXhwZWN0ZWQgRU9GIHdoaWxlIHBhcnNpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZnUnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1ZicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1JyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZlUnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVZicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVGJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidWZyJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJmJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVyJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJ1JyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmZ1JyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVmJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRlVSJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVyJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbGVhZGluZ190cmFpbGluZ19zcGFjZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IDN9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyAgM30nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyB9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMgIH0nLCAnMycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2V4cHI9eyB7eDogeSBmb3IgeCwgeSBpbiBbKDEsIDIpLCBdfX0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICdleHByPXsxOiAyfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidleHByPXsge3g6IHkgZm9yIHgsIHkgaW4gWygxLCAyKSwgXX0gfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cHI9ezE6IDJ9JykKKworICAgIGRlZiB0ZXN0X25vdF9lcXVhbChzZWxmKToKKyAgICAgICAgIyBUaGVyZSdzIGEgc3BlY2lhbCB0ZXN0IGZvciB0aGlzIGJlY2F1c2UgdGhlcmUncyBhIHNwZWNpYWwKKyAgICAgICAgIyAgY2FzZSBpbiB0aGUgZi1zdHJpbmcgcGFyc2VyIHRvIGxvb2sgZm9yICE9IGFzIG5vdCBlbmRpbmcgYW4KKyAgICAgICAgIyAgZXhwcmVzc2lvbi4gTm9ybWFsbHkgaXQgd291bGQsIHdoaWxlIGxvb2tpbmcgZm9yICFzIG9yICFyLgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NH0nLCAnVHJ1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NDp9JywgJ1RydWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMhPTQhc30nLCAnVHJ1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NCFzOi4zfScsICdUcnUnKQorCisgICAgZGVmIHRlc3RfY29udmVyc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNDoxMC4xMH0nLCAnICAgICAgMy4xNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNCFzOjEwLjEwfScsICczLjE0ICAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0IXI6MTAuMTB9JywgJzMuMTQgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMuMTQhYToxMC4xMH0nLCAnMy4xNCAgICAgICcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siYSJ9JywgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIiFyfScsICInYSciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIiFhfScsICInYSciKQorCisgICAgICAgICMgTm90IGEgY29udmVyc2lvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siYSFyIn0nLCAiYSFyIikKKworICAgICAgICAjIE5vdCBhIGNvbnZlcnNpb24sIGJ1dCBzaG93IHRoYXQgISBpcyBhbGxvd2VkIGluIGEgZm9ybWF0IHNwZWMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNDohPDEwLjEwfScsICczLjE0ISEhISEhJykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IGludmFsaWQgY29udmVyc2lvbiBjaGFyYWN0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7MyFnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFBfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFBfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFBfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyEhfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyE6fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyEgc30nIiwgICMgbm8gc3BhY2UgYmVmb3JlIGNvbnZlcnNpb24gY2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3t4IXN7eX19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXNzfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFzczp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXNzOnN9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9hc3NpZ25tZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnaW52YWxpZCBzeW50YXgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZicnID0gMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3swfScgPSB4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYne3h9JyA9IHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZGVsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnaW52YWxpZCBzeW50YXgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZGVsIGYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWwgJycgZicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X21pc21hdGNoZWRfYnJhY2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IHNpbmdsZSAnfScgaXMgbm90IGFsbG93ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7e30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYne3t9fX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid4fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid4fXgnIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbid0IGhhdmUgeyBvciB9IGluIGEgZm9ybWF0IHNwZWMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szOn0+MTB9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szOn19PjEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3szOnt7PjEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyEnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezM6JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhczonIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhczozJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3h7JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3h7eCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MzpzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3t7eyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7e319eyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgIyBCdXQgdGhlc2UgYXJlIGp1c3Qgbm9ybWFsIHN0cmluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7InsifScsICd7JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sifSJ9JywgJ30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezM6eyJ9In0+MTB9JywgJ319fX19fX19fTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezI6eyJ7In0+MTB9JywgJ3t7e3t7e3t7ezInKQorCisgICAgZGVmIHRlc3RfaWZfY29uZGl0aW9uYWwoc2VsZik6CisgICAgICAgICMgVGhlcmUncyBzcGVjaWFsIGxvZ2ljIGluIGNvbXBpbGUuYyB0byB0ZXN0IGlmIHRoZQorICAgICAgICAjICBjb25kaXRpb25hbCBmb3IgYW4gaWYgKGFuZCB3aGlsZSkgYXJlIGNvbnN0YW50cy4gRXhlcmNpc2UKKyAgICAgICAgIyAgdGhhdCBjb2RlLgorCisgICAgICAgIGRlZiB0ZXN0X2ZzdHJpbmcoeCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZmxhZyA9IDAKKyAgICAgICAgICAgIGlmIGYne3h9JzoKKyAgICAgICAgICAgICAgICBmbGFnID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmbGFnID0gMgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbGFnLCBleHBlY3RlZCkKKworICAgICAgICBkZWYgdGVzdF9jb25jYXRfZW1wdHkoeCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZmxhZyA9IDAKKyAgICAgICAgICAgIGlmICcnIGYne3h9JzoKKyAgICAgICAgICAgICAgICBmbGFnID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmbGFnID0gMgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbGFnLCBleHBlY3RlZCkKKworICAgICAgICBkZWYgdGVzdF9jb25jYXRfbm9uX2VtcHR5KHgsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIGZsYWcgPSAwCisgICAgICAgICAgICBpZiAnICcgZid7eH0nOgorICAgICAgICAgICAgICAgIGZsYWcgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYWcgPSAyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWcsIGV4cGVjdGVkKQorCisgICAgICAgIHRlc3RfZnN0cmluZygnJywgMikKKyAgICAgICAgdGVzdF9mc3RyaW5nKCcgJywgMSkKKworICAgICAgICB0ZXN0X2NvbmNhdF9lbXB0eSgnJywgMikKKyAgICAgICAgdGVzdF9jb25jYXRfZW1wdHkoJyAnLCAxKQorCisgICAgICAgIHRlc3RfY29uY2F0X25vbl9lbXB0eSgnJywgMSkKKyAgICAgICAgdGVzdF9jb25jYXRfbm9uX2VtcHR5KCcgJywgMSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2Zvcm1hdF9zcGVjaWZpZXIoc2VsZik6CisgICAgICAgIHggPSAndGVzdCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fScsICd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4On0nLCAndGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eCFzOn0nLCAndGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eCFyOn0nLCAiJ3Rlc3QnIikKKworICAgIGRlZiB0ZXN0X3N0cl9mb3JtYXRfZGlmZmVyZW5jZXMoc2VsZik6CisgICAgICAgIGQgPSB7J2EnOiAnc3RyaW5nJywKKyAgICAgICAgICAgICAwOiAnaW50ZWdlcicsCisgICAgICAgICAgICAgfQorICAgICAgICBhID0gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbMF19JywgJ2ludGVnZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbImEiXX0nLCAnc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tkW2FdfScsICdpbnRlZ2VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne2RbYV19Jy5mb3JtYXQoZD1kKSwgJ3N0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3tkWzBdfScuZm9ybWF0KGQ9ZCksICdpbnRlZ2VyJykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdpbnZhbGlkIHN5bnRheCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZid7YVs0KX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3thKDRdfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgICMgc2VlIGlzc3VlIDI2Mjg3CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoVHlwZUVycm9yLCAnbm9uLWVtcHR5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ3sobGFtYmRhOiAwKTp4fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYneygwLCk6eH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShWYWx1ZUVycm9yLCAnVW5rbm93biBmb3JtYXQgY29kZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZid7MTAwMDpqfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezEwMDA6an0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbG9vcChzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnaTp7aX0nLCAnaTonICsgc3RyKGkpKQorCisgICAgZGVmIHRlc3RfZGljdChzZWxmKToKKyAgICAgICAgZCA9IHsnIic6ICdkcXVvdGUnLAorICAgICAgICAgICAgICInIjogJ3NxdW90ZScsCisgICAgICAgICAgICAgJ2Zvbyc6ICdiYXInLAorICAgICAgICAgICAgIH0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycne2RbIiciXX0nJycsICdzcXVvdGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYiIiJ7ZFsnIiddfSIiIiwgJ2RxdW90ZScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tkWyJmb28iXX0nLCAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmIntkWydmb28nXX0iLCAnYmFyJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKaW5kZXggYWVmNjZkYS4uOWQ4ZGUyMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKQEAgLTEwNDksMTAgKzEwNDksMTkgQEAKICAgICAgICAgZnRwLmNsb3NlKCkKIAogCitjbGFzcyBNaXNjVGVzdENhc2UoVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydNU0dfT09CJywgJ0ZUUF9QT1JUJywgJ01BWExJTkUnLCAnQ1JMRicsICdCX0NSTEYnLAorICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yJywgJ3BhcnNlMTUwJywgJ3BhcnNlMjI3JywgJ3BhcnNlMjI5JywgJ3BhcnNlMjU3JywKKyAgICAgICAgICAgICAgICAgICAgICdwcmludF9saW5lJywgJ2Z0cGNwJywgJ3Rlc3QnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBmdHBsaWIsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3RzID0gW1Rlc3RGVFBDbGFzcywgVGVzdFRpbWVvdXRzLAogICAgICAgICAgICAgIFRlc3RJUHY2RW52aXJvbm1lbnQsCi0gICAgICAgICAgICAgVGVzdFRMU19GVFBDbGFzc01peGluLCBUZXN0VExTX0ZUUENsYXNzXQorICAgICAgICAgICAgIFRlc3RUTFNfRlRQQ2xhc3NNaXhpbiwgVGVzdFRMU19GVFBDbGFzcywKKyAgICAgICAgICAgICBNaXNjVGVzdENhc2VdCiAKICAgICB0aHJlYWRfaW5mbyA9IHN1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weSBiL0xpYi90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5CmluZGV4IGFiNTFhMzUuLjQwZjIyMzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5CkBAIC0xNTQ4LDEzICsxNTQ4LDE1IEBACiAgICAgICAgIGJhc2VzID0gW2MuU2VxdWVuY2UsIGMuTXV0YWJsZU1hcHBpbmcsIGMuTWFwcGluZywgYy5TZXRdCiAgICAgICAgIGZvciBoYXlzdGFjayBpbiBwZXJtdXRhdGlvbnMoYmFzZXMpOgogICAgICAgICAgICAgbSA9IG1ybyhkaWN0LCBoYXlzdGFjaykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobSwgW2RpY3QsIGMuTXV0YWJsZU1hcHBpbmcsIGMuTWFwcGluZywgYy5TaXplZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuSXRlcmFibGUsIGMuQ29udGFpbmVyLCBvYmplY3RdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLCBbZGljdCwgYy5NdXRhYmxlTWFwcGluZywgYy5NYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5Db2xsZWN0aW9uLCBjLlNpemVkLCBjLkl0ZXJhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5Db250YWluZXIsIG9iamVjdF0pCiAgICAgICAgIGJhc2VzID0gW2MuQ29udGFpbmVyLCBjLk1hcHBpbmcsIGMuTXV0YWJsZU1hcHBpbmcsIGMuT3JkZXJlZERpY3RdCiAgICAgICAgIGZvciBoYXlzdGFjayBpbiBwZXJtdXRhdGlvbnMoYmFzZXMpOgogICAgICAgICAgICAgbSA9IG1ybyhjLkNoYWluTWFwLCBoYXlzdGFjaykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobSwgW2MuQ2hhaW5NYXAsIGMuTXV0YWJsZU1hcHBpbmcsIGMuTWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuU2l6ZWQsIGMuSXRlcmFibGUsIGMuQ29udGFpbmVyLCBvYmplY3RdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5Db2xsZWN0aW9uLCBjLlNpemVkLCBjLkl0ZXJhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5Db250YWluZXIsIG9iamVjdF0pCiAKICAgICAgICAgIyBJZiB0aGVyZSdzIGEgZ2VuZXJpYyBmdW5jdGlvbiB3aXRoIGltcGxlbWVudGF0aW9ucyByZWdpc3RlcmVkIGZvcgogICAgICAgICAjIGJvdGggU2l6ZWQgYW5kIENvbnRhaW5lciwgcGFzc2luZyBhIGRlZmF1bHRkaWN0IHRvIGl0IHJlc3VsdHMgaW4gYW4KQEAgLTE1NzUsOSArMTU3Nyw5IEBACiAgICAgICAgIGJhc2VzID0gW2MuTXV0YWJsZVNlcXVlbmNlLCBjLk11dGFibGVNYXBwaW5nXQogICAgICAgICBmb3IgaGF5c3RhY2sgaW4gcGVybXV0YXRpb25zKGJhc2VzKToKICAgICAgICAgICAgIG0gPSBtcm8oRCwgYmFzZXMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0sIFtELCBjLk11dGFibGVTZXF1ZW5jZSwgYy5TZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuZGVmYXVsdGRpY3QsIGRpY3QsIGMuTXV0YWJsZU1hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLk1hcHBpbmcsIGMuU2l6ZWQsIGMuSXRlcmFibGUsIGMuQ29udGFpbmVyLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLCBbRCwgYy5NdXRhYmxlU2VxdWVuY2UsIGMuU2VxdWVuY2UsIGMuUmV2ZXJzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuZGVmYXVsdGRpY3QsIGRpY3QsIGMuTXV0YWJsZU1hcHBpbmcsIGMuTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuQ29sbGVjdGlvbiwgYy5TaXplZCwgYy5JdGVyYWJsZSwgYy5Db250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RdKQogCiAgICAgICAgICMgQ29udGFpbmVyIGFuZCBDYWxsYWJsZSBhcmUgcmVnaXN0ZXJlZCBvbiBkaWZmZXJlbnQgYmFzZSBjbGFzc2VzIGFuZApAQCAtMTU5MCw3ICsxNTkyLDggQEAKICAgICAgICAgZm9yIGhheXN0YWNrIGluIHBlcm11dGF0aW9ucyhiYXNlcyk6CiAgICAgICAgICAgICBtID0gbXJvKEMsIGhheXN0YWNrKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLCBbQywgYy5DYWxsYWJsZSwgYy5kZWZhdWx0ZGljdCwgZGljdCwgYy5NYXBwaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5TaXplZCwgYy5JdGVyYWJsZSwgYy5Db250YWluZXIsIG9iamVjdF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLkNvbGxlY3Rpb24sIGMuU2l6ZWQsIGMuSXRlcmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLkNvbnRhaW5lciwgb2JqZWN0XSkKIAogICAgIGRlZiB0ZXN0X3JlZ2lzdGVyX2FiYyhzZWxmKToKICAgICAgICAgYyA9IGNvbGxlY3Rpb25zCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Z1dHVyZS5weSBiL0xpYi90ZXN0L3Rlc3RfZnV0dXJlLnB5CmluZGV4IGJlYWM5OTMuLjIxM2IyYmEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZnV0dXJlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZnV0dXJlLnB5CkBAIC00LDcgKzQsNyBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBpbXBvcnQgcmUKIAotcnggPSByZS5jb21waWxlKCdcKChcUyspLnB5LCBsaW5lIChcZCspJykKK3J4ID0gcmUuY29tcGlsZShyJ1woKFxTKykucHksIGxpbmUgKFxkKyknKQogCiBkZWYgZ2V0X2Vycm9yX2xvY2F0aW9uKG1zZyk6CiAgICAgbW8gPSByeC5zZWFyY2goc3RyKG1zZykpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2djLnB5IGIvTGliL3Rlc3QvdGVzdF9nYy5weQppbmRleCBhNGQ2ODRiLi5lNzI3NDk5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2djLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2MucHkKQEAgLTY4NCw3ICs2ODQsNiBAQAogICAgICAgICAjIENyZWF0ZSBhIHJlZmVyZW5jZSBjeWNsZSB0aHJvdWdoIHRoZSBfX21haW5fXyBtb2R1bGUgYW5kIGNoZWNrCiAgICAgICAgICMgaXQgZ2V0cyBjb2xsZWN0ZWQgYXQgaW50ZXJwcmV0ZXIgc2h1dGRvd24uCiAgICAgICAgIGNvZGUgPSAiIiJpZiAxOgotICAgICAgICAgICAgaW1wb3J0IHdlYWtyZWYKICAgICAgICAgICAgIGNsYXNzIEM6CiAgICAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICAgICAgICAgIHByaW50KCdfX2RlbF9fIGNhbGxlZCcpCkBAIC02OTksNyArNjk4LDYgQEAKICAgICAgICAgIyBTYW1lIGFzIGFib3ZlLCBidXQgd2l0aCBhIG5vbi1fX21haW5fXyBtb2R1bGUuCiAgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgogICAgICAgICAgICAgbW9kdWxlID0gIiIiaWYgMToKLSAgICAgICAgICAgICAgICBpbXBvcnQgd2Vha3JlZgogICAgICAgICAgICAgICAgIGNsYXNzIEM6CiAgICAgICAgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ19fZGVsX18gY2FsbGVkJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2RiLnB5IGIvTGliL3Rlc3QvdGVzdF9nZGIucHkKaW5kZXggM2RiMTBiNi4uNWZiZjE1NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZGIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZGIucHkKQEAgLTUsMTMgKzUsMTUgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgcmUKLWltcG9ydCBwcHJpbnQKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCiBpbXBvcnQgc3lzY29uZmlnCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBsb2NhbGUKIAorIyBGSVhNRTogaXNzdWUgIzI4MDIzCityYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiRklYTUU6IGlzc3VlICMyODAyMywgY29tcGFjdCBkaWN0IChpc3N1ZSAjMjczNTApIGJyb2tlIHB5dGhvbi1nZGIucHkiKQorCiAjIElzIHRoaXMgUHl0aG9uIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCB0aHJlYWRzPwogdHJ5OgogICAgIGltcG9ydCBfdGhyZWFkCkBAIC0xMTEsNiArMTEzLDcgQEAKIAogQlJFQUtQT0lOVF9GTj0nYnVpbHRpbl9pZCcKIAorQHVuaXR0ZXN0LnNraXBJZihzdXBwb3J0LlBHTywgIm5vdCB1c2VmdWwgZm9yIFBHTyIpCiBjbGFzcyBEZWJ1Z2dlclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgICIiIlRlc3QgdGhhdCB0aGUgZGVidWdnZXIgY2FuIGRlYnVnIFB5dGhvbi4iIiIKQEAgLTE3Nyw2ICsxODAsNyBAQAogICAgICAgICBhcmdzID0gWyctLWV2YWwtY29tbWFuZD0lcycgJSBjbWQgZm9yIGNtZCBpbiBjb21tYW5kc10KICAgICAgICAgYXJncyArPSBbIi0tYXJncyIsCiAgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlXQorICAgICAgICBhcmdzLmV4dGVuZChzdWJwcm9jZXNzLl9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSkKIAogICAgICAgICBpZiBub3QgaW1wb3J0X3NpdGU6CiAgICAgICAgICAgICAjIC1TIHN1cHByZXNzZXMgdGhlIGRlZmF1bHQgJ2ltcG9ydCBzaXRlJwpAQCAtMjQwLDcgKzI0NCw3IEBACiAgICAgICAgICMgZ2RiIGNhbiBpbnNlcnQgYWRkaXRpb25hbCAnXG4nIGFuZCBzcGFjZSBjaGFyYWN0ZXJzIGluIHZhcmlvdXMgcGxhY2VzCiAgICAgICAgICMgaW4gaXRzIG91dHB1dCwgZGVwZW5kaW5nIG9uIHRoZSB3aWR0aCBvZiB0aGUgdGVybWluYWwgaXQncyBjb25uZWN0ZWQKICAgICAgICAgIyB0byAodXNpbmcgaXRzICJ3cmFwX2hlcmUiIGZ1bmN0aW9uKQotICAgICAgICBtID0gcmUubWF0Y2goJy4qIzBccytidWlsdGluX2lkXHMrXChzZWxmXD0uKixccyt2PVxzKiguKj8pXClccythdFxzK1xTKlB5dGhvbi9ibHRpbm1vZHVsZS5jLionLAorICAgICAgICBtID0gcmUubWF0Y2gocicuKiMwXHMrYnVpbHRpbl9pZFxzK1woc2VsZlw9LiosXHMrdj1ccyooLio/KVwpXHMrYXRccytcUypQeXRob24vYmx0aW5tb2R1bGUuYy4qJywKICAgICAgICAgICAgICAgICAgICAgIGdkYl9vdXRwdXQsIHJlLkRPVEFMTCkKICAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgICBzZWxmLmZhaWwoJ1VuZXhwZWN0ZWQgZ2RiIG91dHB1dDogJXJcbiVzJyAlIChnZGJfb3V0cHV0LCBnZGJfb3V0cHV0KSkKQEAgLTI5Miw3ICsyOTYsOSBAQAogICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgZGljdGlvbmFyaWVzJwogICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoe30pCiAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih7J2Zvbyc6ICdiYXInfSwgInsnZm9vJzogJ2Jhcid9IikKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHsnZm9vJzogJ2JhcicsICdkb3VnbGFzJzogNDJ9LCAieydkb3VnbGFzJzogNDIsICdmb28nOiAnYmFyJ30iKQorICAgICAgICAjIFBZVEhPTkhBU0hTRUVEIGlzIG5lZWQgdG8gZ2V0IHRoZSBleGFjdCBpdGVtIG9yZGVyCisgICAgICAgIGlmIG5vdCBzeXMuZmxhZ3MuaWdub3JlX2Vudmlyb25tZW50OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHsnZm9vJzogJ2JhcicsICdkb3VnbGFzJzogNDJ9LCAieydkb3VnbGFzJzogNDIsICdmb28nOiAnYmFyJ30iKQogCiAgICAgZGVmIHRlc3RfbGlzdHMoc2VsZik6CiAgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBsaXN0cycKQEAgLTM1NSw5ICszNjEsMTIgQEAKICAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIHNldHMnCiAgICAgICAgIGlmIChnZGJfbWFqb3JfdmVyc2lvbiwgZ2RiX21pbm9yX3ZlcnNpb24pIDwgKDcsIDMpOgogICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgicHJldHR5LXByaW50aW5nIG9mIHNldHMgbmVlZHMgZ2RiIDcuMyBvciBsYXRlciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoKSwgJ3NldCgpJykKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHNldChbJ2EnLCAnYiddKSwgInsnYScsICdiJ30iKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KFs0LCA1LCA2XSksICJ7NCwgNSwgNn0iKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KCksICJzZXQoKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoWydhJ10pLCAieydhJ30iKQorICAgICAgICAjIFBZVEhPTkhBU0hTRUVEIGlzIG5lZWQgdG8gZ2V0IHRoZSBleGFjdCBmcm96ZW5zZXQgaXRlbSBvcmRlcgorICAgICAgICBpZiBub3Qgc3lzLmZsYWdzLmlnbm9yZV9lbnZpcm9ubWVudDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoWydhJywgJ2InXSksICJ7J2EnLCAnYid9IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoWzQsIDUsIDZdKSwgIns0LCA1LCA2fSIpCiAKICAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBoYW5kbGUgc2V0cyBjb250YWluaW5nIHRoZSAiZHVtbXkiIGtleSB2YWx1ZSwKICAgICAgICAgIyB3aGljaCBoYXBwZW5zIG9uIGRlbGV0aW9uOgpAQCAtMzcwLDkgKzM3OSwxMiBAQAogICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgZnJvemVuc2V0cycKICAgICAgICAgaWYgKGdkYl9tYWpvcl92ZXJzaW9uLCBnZGJfbWlub3JfdmVyc2lvbikgPCAoNywgMyk6CiAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJwcmV0dHktcHJpbnRpbmcgb2YgZnJvemVuc2V0cyBuZWVkcyBnZGIgNy4zIG9yIGxhdGVyIikKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldCgpLCAnZnJvemVuc2V0KCknKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KFsnYScsICdiJ10pLCAiZnJvemVuc2V0KHsnYScsICdiJ30pIikKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldChbNCwgNSwgNl0pLCAiZnJvemVuc2V0KHs0LCA1LCA2fSkiKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KCksICJmcm96ZW5zZXQoKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoWydhJ10pLCAiZnJvemVuc2V0KHsnYSd9KSIpCisgICAgICAgICMgUFlUSE9OSEFTSFNFRUQgaXMgbmVlZCB0byBnZXQgdGhlIGV4YWN0IGZyb3plbnNldCBpdGVtIG9yZGVyCisgICAgICAgIGlmIG5vdCBzeXMuZmxhZ3MuaWdub3JlX2Vudmlyb25tZW50OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldChbJ2EnLCAnYiddKSwgImZyb3plbnNldCh7J2EnLCAnYid9KSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KFs0LCA1LCA2XSksICJmcm96ZW5zZXQoezQsIDUsIDZ9KSIpCiAKICAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgogICAgICAgICAjIFRlc3QgYSBSdW50aW1lRXJyb3IKQEAgLTUwMSw2ICs1MTMsMTAgQEAKIAogICAgIGRlZiB0ZXN0X2J1aWx0aW5zX2hlbHAoc2VsZik6CiAgICAgICAgICdFbnN1cmUgdGhhdCB0aGUgbmV3LXN0eWxlIGNsYXNzIF9IZWxwZXIgaW4gc2l0ZS5weSBjYW4gYmUgaGFuZGxlZCcKKworICAgICAgICBpZiBzeXMuZmxhZ3Mubm9fc2l0ZToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIm5lZWQgc2l0ZSBtb2R1bGUsIGJ1dCAtUyBvcHRpb24gd2FzIHVzZWQiKQorCiAgICAgICAgICMgKHRoaXMgd2FzIHRoZSBpc3N1ZSBjYXVzaW5nIHRyYWNlYmFja3MgaW4KICAgICAgICAgIyAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTgwMzIjbXNnMTAwNTM3ICkKICAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcignaWQoX19idWlsdGluc19fLmhlbHApJywgaW1wb3J0X3NpdGU9VHJ1ZSkKQEAgLTUzNiw3ICs1NTIsNyBAQAogZm9vID0gRm9vKCkKIGZvby5hbl9hdHRyID0gZm9vCiBpZChmb28pJycnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goJzxGb29cKGFuX2F0dHI9PFwuXC5cLj5cKSBhdCByZW1vdGUgMHgtP1swLTlhLWZdKz4nLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gocic8Rm9vXChhbl9hdHRyPTxcLlwuXC4+XCkgYXQgcmVtb3RlIDB4LT9bMC05YS1mXSs+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkYl9yZXByKSwKICAgICAgICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIGdkYiByZXByZXNlbnRhdGlvbjogJXJcbiVzJyAlIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2RiX3JlcHIsIGdkYl9vdXRwdXQpKQpAQCAtNTQ5LDcgKzU2NSw3IEBACiBmb28gPSBGb28oKQogZm9vLmFuX2F0dHIgPSBmb28KIGlkKGZvbyknJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgnPEZvb1woYW5fYXR0cj08XC5cLlwuPlwpIGF0IHJlbW90ZSAweC0/WzAtOWEtZl0rPicsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyJzxGb29cKGFuX2F0dHI9PFwuXC5cLj5cKSBhdCByZW1vdGUgMHgtP1swLTlhLWZdKz4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RiX3JlcHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgZ2RiIHJlcHJlc2VudGF0aW9uOiAlclxuJXMnICUgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZGJfcmVwciwgZ2RiX291dHB1dCkpCkBAIC01NjMsNyArNTc5LDcgQEAKIGEuYW5fYXR0ciA9IGIKIGIuYW5fYXR0ciA9IGEKIGlkKGEpJycnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goJzxGb29cKGFuX2F0dHI9PEZvb1woYW5fYXR0cj08XC5cLlwuPlwpIGF0IHJlbW90ZSAweC0/WzAtOWEtZl0rPlwpIGF0IHJlbW90ZSAweC0/WzAtOWEtZl0rPicsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyJzxGb29cKGFuX2F0dHI9PEZvb1woYW5fYXR0cj08XC5cLlwuPlwpIGF0IHJlbW90ZSAweC0/WzAtOWEtZl0rPlwpIGF0IHJlbW90ZSAweC0/WzAtOWEtZl0rPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZGJfcmVwciksCiAgICAgICAgICAgICAgICAgICAgICAgICAnVW5leHBlY3RlZCBnZGIgcmVwcmVzZW50YXRpb246ICVyXG4lcycgJSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdkYl9yZXByLCBnZGJfb3V0cHV0KSkKQEAgLTU5OCw3ICs2MTQsNyBAQAogCiAgICAgZGVmIHRlc3RfYnVpbHRpbl9tZXRob2Qoc2VsZik6CiAgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfZ2RiX3JlcHIoJ2ltcG9ydCBzeXM7IGlkKHN5cy5zdGRvdXQucmVhZGxpbmVzKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgnPGJ1aWx0LWluIG1ldGhvZCByZWFkbGluZXMgb2YgX2lvLlRleHRJT1dyYXBwZXIgb2JqZWN0IGF0IHJlbW90ZSAweC0/WzAtOWEtZl0rPicsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyJzxidWlsdC1pbiBtZXRob2QgcmVhZGxpbmVzIG9mIF9pby5UZXh0SU9XcmFwcGVyIG9iamVjdCBhdCByZW1vdGUgMHgtP1swLTlhLWZdKz4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RiX3JlcHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgZ2RiIHJlcHJlc2VudGF0aW9uOiAlclxuJXMnICUgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZGJfcmVwciwgZ2RiX291dHB1dCkpCkBAIC02MTMsNyArNjI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQ9J2J1aWx0aW5faWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsncHJpbnQgKFB5RnJhbWVPYmplY3QqKSgoKFB5Q29kZU9iamVjdCopdiktPmNvX3pvbWJpZWZyYW1lKSddCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgnLipccytcJDEgPVxzK0ZyYW1lIDB4LT9bMC05YS1mXSssIGZvciBmaWxlIDxzdHJpbmc+LCBsaW5lIDMsIGluIGZvbyBcKFwpXHMrLionLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gocicuKlxzK1wkMSA9XHMrRnJhbWUgMHgtP1swLTlhLWZdKywgZm9yIGZpbGUgPHN0cmluZz4sIGxpbmUgMywgaW4gZm9vIFwoXClccysuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZGJfb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuRE9UQUxMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIGdkYiByZXByZXNlbnRhdGlvbjogJXJcbiVzJyAlIChnZGJfb3V0cHV0LCBnZGJfb3V0cHV0KSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwNDc5LnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3Jfc3RvcC5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3Rlc3QvdGVzdF9wZXA0NzkucHkKcmVuYW1lIHRvIExpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9yX3N0b3AucHkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weSBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQppbmRleCAzZjgyNDYyLi5mNGIzM2FmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CkBAIC0yNDUsMTEgKzI0NSwxMSBAQAogICAgICAgICAgICAgeWllbGQKIAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24pLCBcCi0gICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CisgICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKIAogICAgICAgICAgICAgbmV4dChnZW4oKSkKIAotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0b3IgLiogcmFpc2VkIFN0b3BJdGVyYXRpb24iKSwgXAogICAgICAgICAgICAgIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CiAKQEAgLTI2OCw3ICsyNjgsNyBAQAogICAgICAgICBnID0gZigpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChnKSwgMSkKIAotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CiAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24pOgogICAgICAgICAgICAgICAgIG5leHQoZykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKaW5kZXggYjc3ZDFkNy4uYWU1ZGQ2YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5CkBAIC0xMCwxMSArMTAsOSBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAotZGVmIHNhZmVfcm1kaXIoZGlybmFtZSk6Ci0gICAgdHJ5OgotICAgICAgICBvcy5ybWRpcihkaXJuYW1lKQotICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICBwYXNzCitkZWYgY3JlYXRlX2ZpbGUoZmlsZW5hbWUsIGRhdGE9Yidmb28nKToKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd4YicsIDApIGFzIGZwOgorICAgICAgICBmcC53cml0ZShkYXRhKQogCiAKIGNsYXNzIEdlbmVyaWNUZXN0OgpAQCAtOTcsNTIgKzk1LDQ3IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoczFbbjpuKzFdLCBzMltuOm4rMV0pCiAKICAgICBkZWYgdGVzdF9nZXRzaXplKHNlbGYpOgotICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZi53cml0ZShiImZvbyIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXRobW9kdWxlLmdldHNpemUoc3VwcG9ydC5URVNURk4pLCAzKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaWYgbm90IGYuY2xvc2VkOgotICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKIAotICAgIGRlZiB0ZXN0X3RpbWUoc2VsZik6Ci0gICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmLndyaXRlKGIiZm9vIikKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJhYiIpCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBiJ0hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhdGhtb2R1bGUuZ2V0c2l6ZShmaWxlbmFtZSksIDUpCisgICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKKworICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSwgYidIZWxsbyBXb3JsZCEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGF0aG1vZHVsZS5nZXRzaXplKGZpbGVuYW1lKSwgMTIpCisKKyAgICBkZWYgdGVzdF9maWxldGltZShzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBiJ2ZvbycpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAiYWIiLCAwKSBhcyBmOgogICAgICAgICAgICAgZi53cml0ZShiImJhciIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKQotICAgICAgICAgICAgZCA9IGYucmVhZCgpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgYiJmb29iYXIiKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgKLSAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuZ2V0Y3RpbWUoc3VwcG9ydC5URVNURk4pLAotICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5nZXRtdGltZShzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgICkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlZDoKLSAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIsIDApIGFzIGY6CisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBiImZvb2JhciIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoCisgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuZ2V0Y3RpbWUoZmlsZW5hbWUpLAorICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmdldG10aW1lKGZpbGVuYW1lKQorICAgICAgICApCiAKICAgICBkZWYgdGVzdF9leGlzdHMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmV4aXN0cyhzdXBwb3J0LlRFU1RGTiksIEZhbHNlKQotICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikKLSAgICAgICAgdHJ5OgorICAgICAgICBmaWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuZXhpc3RzKGZpbGVuYW1lKSwgRmFsc2UpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAieGIiKSBhcyBmOgogICAgICAgICAgICAgZi53cml0ZShiImZvbyIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmV4aXN0cyhzdXBwb3J0LlRFU1RGTiksIFRydWUpCi0gICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXRobW9kdWxlID09IGdlbmVyaWNwYXRoOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmxleGlzdHMoc3VwcG9ydC5URVNURk4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKKworICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5leGlzdHMoZmlsZW5hbWUpLCBUcnVlKQorCisgICAgICAgIGlmIG5vdCBzZWxmLnBhdGhtb2R1bGUgPT0gZ2VuZXJpY3BhdGg6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5sZXhpc3RzKGZpbGVuYW1lKSwgVHJ1ZSkKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICJwaXBlIiksICJyZXF1aXJlcyBvcy5waXBlKCkiKQogICAgIGRlZiB0ZXN0X2V4aXN0c19mZChzZWxmKToKQEAgLTE1NCw1MyArMTQ3LDY2IEBACiAgICAgICAgICAgICBvcy5jbG9zZSh3KQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGF0aG1vZHVsZS5leGlzdHMocikpCiAKLSAgICBkZWYgdGVzdF9pc2RpcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYud3JpdGUoYiJmb28iKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihzdXBwb3J0LlRFU1RGTiksIEZhbHNlKQotICAgICAgICAgICAgb3MucmVtb3ZlKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgb3MubWtkaXIoc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihzdXBwb3J0LlRFU1RGTiksIFRydWUpCi0gICAgICAgICAgICBvcy5ybWRpcihzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgIHNhZmVfcm1kaXIoc3VwcG9ydC5URVNURk4pCisgICAgZGVmIHRlc3RfaXNkaXJfZmlsZShzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihmaWxlbmFtZSksIEZhbHNlKQogCi0gICAgZGVmIHRlc3RfaXNmaWxlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYud3JpdGUoYiJmb28iKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoc3VwcG9ydC5URVNURk4pLCBUcnVlKQotICAgICAgICAgICAgb3MucmVtb3ZlKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgb3MubWtkaXIoc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgICAgIG9zLnJtZGlyKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaWYgbm90IGYuY2xvc2UoKToKLSAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgc2FmZV9ybWRpcihzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKGZpbGVuYW1lKSwgRmFsc2UpCiAKLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9jcmVhdGVfZmlsZShmaWxlbmFtZSk6Ci0gICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3diJykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoYidmb28nKQorICAgIGRlZiB0ZXN0X2lzZGlyX2RpcihzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybWRpciwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKGZpbGVuYW1lKSwgRmFsc2UpCisKKyAgICAgICAgb3MubWtkaXIoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKGZpbGVuYW1lKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2lzZmlsZV9maWxlKHNlbGYpOgorICAgICAgICBmaWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZmlsZShmaWxlbmFtZSksIEZhbHNlKQorCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoZmlsZW5hbWUpLCBUcnVlKQorCisgICAgZGVmIHRlc3RfaXNmaWxlX2RpcihzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybWRpciwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZmlsZShmaWxlbmFtZSksIEZhbHNlKQorCisgICAgICAgIG9zLm1rZGlyKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoZmlsZW5hbWUpLCBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X3NhbWVmaWxlKHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0ZXN0X2ZuID0gc3VwcG9ydC5URVNURk4gKyAiMSIKLSAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKHRlc3RfZm4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKHRlc3RfZm4sIHRlc3RfZm4pKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbikKKyAgICAgICAgZmlsZTEgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBmaWxlMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZTEpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZTIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUoZmlsZTEsIGZpbGUxKSkKKworICAgICAgICBjcmVhdGVfZmlsZShmaWxlMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUoZmlsZTEsIGZpbGUyKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSkKKworICAgIGRlZiBfdGVzdF9zYW1lZmlsZV9vbl9saW5rX2Z1bmMoc2VsZiwgZnVuYyk6CisgICAgICAgIHRlc3RfZm4xID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgdGVzdF9mbjIgPSBzdXBwb3J0LlRFU1RGTiArICIyIgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHRlc3RfZm4xKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHRlc3RfZm4yKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHRlc3RfZm4xKQorCisgICAgICAgIGZ1bmModGVzdF9mbjEsIHRlc3RfZm4yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKHRlc3RfZm4xLCB0ZXN0X2ZuMikpCisgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMikKKworICAgICAgICBjcmVhdGVfZmlsZSh0ZXN0X2ZuMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUodGVzdF9mbjEsIHRlc3RfZm4yKSkKIAogICAgIEBzdXBwb3J0LnNraXBfdW5sZXNzX3N5bWxpbmsKICAgICBkZWYgdGVzdF9zYW1lZmlsZV9vbl9zeW1saW5rKHNlbGYpOgpAQCAtMjA5LDMxICsyMTUsMzcgQEAKICAgICBkZWYgdGVzdF9zYW1lZmlsZV9vbl9saW5rKHNlbGYpOgogICAgICAgICBzZWxmLl90ZXN0X3NhbWVmaWxlX29uX2xpbmtfZnVuYyhvcy5saW5rKQogCi0gICAgZGVmIF90ZXN0X3NhbWVmaWxlX29uX2xpbmtfZnVuYyhzZWxmLCBmdW5jKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVzdF9mbjEgPSBzdXBwb3J0LlRFU1RGTiArICIxIgotICAgICAgICAgICAgdGVzdF9mbjIgPSBzdXBwb3J0LlRFU1RGTiArICIyIgotICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2ZpbGUodGVzdF9mbjEpCi0KLSAgICAgICAgICAgIGZ1bmModGVzdF9mbjEsIHRlc3RfZm4yKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSh0ZXN0X2ZuMSwgdGVzdF9mbjIpKQotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4yKQotCi0gICAgICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSh0ZXN0X2ZuMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKHRlc3RfZm4xLCB0ZXN0X2ZuMikpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjEpCi0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjIpCi0KICAgICBkZWYgdGVzdF9zYW1lc3RhdChzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVzdF9mbiA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCi0gICAgICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSh0ZXN0X2ZuKQotICAgICAgICAgICAgdGVzdF9mbnMgPSBbdGVzdF9mbl0qMgotICAgICAgICAgICAgc3RhdHMgPSBtYXAob3Muc3RhdCwgdGVzdF9mbnMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KCpzdGF0cykpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbikKKyAgICAgICAgdGVzdF9mbjEgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICB0ZXN0X2ZuMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgdGVzdF9mbjEpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgdGVzdF9mbjIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUodGVzdF9mbjEpCisgICAgICAgIHN0YXQxID0gb3Muc3RhdCh0ZXN0X2ZuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdChzdGF0MSwgb3Muc3RhdCh0ZXN0X2ZuMSkpKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHRlc3RfZm4yKQorICAgICAgICBzdGF0MiA9IG9zLnN0YXQodGVzdF9mbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KHN0YXQxLCBzdGF0MikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnBhdGhtb2R1bGUuc2FtZXN0YXQpCisKKyAgICBkZWYgX3Rlc3Rfc2FtZXN0YXRfb25fbGlua19mdW5jKHNlbGYsIGZ1bmMpOgorICAgICAgICB0ZXN0X2ZuMSA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCisgICAgICAgIHRlc3RfZm4yID0gc3VwcG9ydC5URVNURk4gKyAiMiIKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCB0ZXN0X2ZuMSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCB0ZXN0X2ZuMikKKworICAgICAgICBjcmVhdGVfZmlsZSh0ZXN0X2ZuMSkKKyAgICAgICAgZnVuYyh0ZXN0X2ZuMSwgdGVzdF9mbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZXN0YXQob3Muc3RhdCh0ZXN0X2ZuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdCh0ZXN0X2ZuMikpKQorICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUodGVzdF9mbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KG9zLnN0YXQodGVzdF9mbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KHRlc3RfZm4yKSkpCiAKICAgICBAc3VwcG9ydC5za2lwX3VubGVzc19zeW1saW5rCiAgICAgZGVmIHRlc3Rfc2FtZXN0YXRfb25fc3ltbGluayhzZWxmKToKQEAgLTI0MiwzMSArMjU0LDE3IEBACiAgICAgZGVmIHRlc3Rfc2FtZXN0YXRfb25fbGluayhzZWxmKToKICAgICAgICAgc2VsZi5fdGVzdF9zYW1lc3RhdF9vbl9saW5rX2Z1bmMob3MubGluaykKIAotICAgIGRlZiBfdGVzdF9zYW1lc3RhdF9vbl9saW5rX2Z1bmMoc2VsZiwgZnVuYyk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRlc3RfZm4xID0gc3VwcG9ydC5URVNURk4gKyAiMSIKLSAgICAgICAgICAgIHRlc3RfZm4yID0gc3VwcG9ydC5URVNURk4gKyAiMiIKLSAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKHRlc3RfZm4xKQotICAgICAgICAgICAgdGVzdF9mbnMgPSAodGVzdF9mbjEsIHRlc3RfZm4yKQotICAgICAgICAgICAgZnVuYygqdGVzdF9mbnMpCi0gICAgICAgICAgICBzdGF0cyA9IG1hcChvcy5zdGF0LCB0ZXN0X2ZucykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZXN0YXQoKnN0YXRzKSkKLSAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMikKLQotICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2ZpbGUodGVzdF9mbjIpCi0gICAgICAgICAgICBzdGF0cyA9IG1hcChvcy5zdGF0LCB0ZXN0X2ZucykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KCpzdGF0cykpCi0KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4xKQotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4yKQotCiAgICAgZGVmIHRlc3Rfc2FtZW9wZW5maWxlKHNlbGYpOgotICAgICAgICBmbmFtZSA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCi0gICAgICAgIHdpdGggb3BlbihmbmFtZSwgIndiIikgYXMgYSwgb3BlbihmbmFtZSwgIndiIikgYXMgYjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZW9wZW5maWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmZpbGVubygpLCBiLmZpbGVubygpKSkKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSkKKworICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIsIDApIGFzIGZwMToKKyAgICAgICAgICAgIGZkMSA9IGZwMS5maWxlbm8oKQorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiLCAwKSBhcyBmcDI6CisgICAgICAgICAgICAgICAgZmQyID0gZnAyLmZpbGVubygpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lb3BlbmZpbGUoZmQxLCBmZDIpKQorCiAKIGNsYXNzIFRlc3RHZW5lcmljVGVzdChHZW5lcmljVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgICMgSXNzdWUgMTY4NTI6IEdlbmVyaWNUZXN0IGNhbid0IGluaGVyaXQgZnJvbSB1bml0dGVzdC5UZXN0Q2FzZQpAQCAtMzkwLDEwICszODgsMTMgQEAKICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiImZvbyIsIHNlbGYucGF0aG1vZHVsZS5hYnNwYXRoKGIiZm9vIikpCiAKKyAgICAgICAgIyBhdm9pZCBVbmljb2RlRGVjb2RlRXJyb3Igb24gV2luZG93cworICAgICAgICB1bmRlY29kYWJsZV9wYXRoID0gYicnIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInIGVsc2UgYidmXHhmMlx4ZjInCisKICAgICAgICAgIyBBYnNwYXRoIHJldHVybnMgYnl0ZXMgd2hlbiB0aGUgYXJnIGlzIGJ5dGVzCiAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICAgICAgZm9yIHBhdGggaW4gKGInJywgYidmb28nLCBiJ2ZceGYyXHhmMicsIGInL2ZvbycsIGInQzpcXCcpOgorICAgICAgICAgICAgZm9yIHBhdGggaW4gKGInJywgYidmb28nLCB1bmRlY29kYWJsZV9wYXRoLCBiJy9mb28nLCBiJ0M6XFwnKToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5wYXRobW9kdWxlLmFic3BhdGgocGF0aCksIGJ5dGVzKQogCiAgICAgZGVmIHRlc3RfcmVhbHBhdGgoc2VsZik6CkBAIC00NTIsMTYgKzQ1MywxNSBAQAogICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgZXJybXNnKToKICAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuam9pbignc3RyJywgYidieXRlcycpCiAgICAgICAgICAgICAjIHJlZ3Jlc3Npb24sIHNlZSAjMTUzNzcKLSAgICAgICAgICAgIGVycm1zZyA9IHInam9pblwoXCkgYXJndW1lbnQgbXVzdCBiZSBzdHIgb3IgYnl0ZXMsIG5vdCAlcicKLSAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsIGVycm1zZyAlICdpbnQnKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdpbnQnKToKICAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuam9pbig0MiwgJ3N0cicpCi0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCBlcnJtc2cgJSAnaW50Jyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnaW50Jyk6CiAgICAgICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmpvaW4oJ3N0cicsIDQyKQotICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgZXJybXNnICUgJ2ludCcpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ2ludCcpOgogICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5qb2luKDQyKQotICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgZXJybXNnICUgJ2xpc3QnKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdsaXN0Jyk6CiAgICAgICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmpvaW4oW10pCi0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCBlcnJtc2cgJSAnYnl0ZWFycmF5Jyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnYnl0ZWFycmF5Jyk6CiAgICAgICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmpvaW4oYnl0ZWFycmF5KGInZm9vJyksIGJ5dGVhcnJheShiJ2JhcicpKQogCiAgICAgZGVmIHRlc3RfcmVscGF0aF9lcnJvcnMoc2VsZik6CkBAIC00NzMsMTQgKzQ3Myw1OSBAQAogICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5yZWxwYXRoKGInYnl0ZXMnLCAnc3RyJykKICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsIGVycm1zZyk6CiAgICAgICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLnJlbHBhdGgoJ3N0cicsIGInYnl0ZXMnKQotICAgICAgICAgICAgZXJybXNnID0gcidyZWxwYXRoXChcKSBhcmd1bWVudCBtdXN0IGJlIHN0ciBvciBieXRlcywgbm90ICVyJwotICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgZXJybXNnICUgJ2ludCcpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ2ludCcpOgogICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5yZWxwYXRoKDQyLCAnc3RyJykKLSAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsIGVycm1zZyAlICdpbnQnKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdpbnQnKToKICAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUucmVscGF0aCgnc3RyJywgNDIpCi0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCBlcnJtc2cgJSAnYnl0ZWFycmF5Jyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnYnl0ZWFycmF5Jyk6CiAgICAgICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLnJlbHBhdGgoYnl0ZWFycmF5KGInZm9vJyksIGJ5dGVhcnJheShiJ2JhcicpKQogCiAKK2NsYXNzIFBhdGhMaWtlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgY2xhc3MgUGF0aExpa2U6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPScnKToKKyAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgZGVmIF9fZnNwYXRoX18oc2VsZik6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYucGF0aCwgQmFzZUV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgcmFpc2Ugc2VsZi5wYXRoCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhdGgKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlX25hbWUgPSBzdXBwb3J0LlRFU1RGTi5sb3dlcigpCisgICAgICAgIHNlbGYuZmlsZV9wYXRoID0gc2VsZi5QYXRoTGlrZShzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzZWxmLmZpbGVfbmFtZSkKKyAgICAgICAgY3JlYXRlX2ZpbGUoc2VsZi5maWxlX25hbWUsIGIidGVzdF9nZW5lcmljcGF0aC5QYXRoTGlrZVRlc3RzIikKKworICAgIGRlZiBhc3NlcnRQYXRoRXF1YWwoc2VsZiwgZnVuYyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyhzZWxmLmZpbGVfcGF0aCksIGZ1bmMoc2VsZi5maWxlX25hbWUpKQorCisgICAgZGVmIHRlc3RfcGF0aF9leGlzdHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKG9zLnBhdGguZXhpc3RzKQorCisgICAgZGVmIHRlc3RfcGF0aF9pc2ZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKG9zLnBhdGguaXNmaWxlKQorCisgICAgZGVmIHRlc3RfcGF0aF9pc2RpcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwob3MucGF0aC5pc2RpcikKKworICAgIGRlZiB0ZXN0X3BhdGhfY29tbW9ucHJlZml4KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguY29tbW9ucHJlZml4KFtzZWxmLmZpbGVfcGF0aCwgc2VsZi5maWxlX25hbWVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVfbmFtZSkKKworICAgIGRlZiB0ZXN0X3BhdGhfZ2V0c2l6ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwob3MucGF0aC5nZXRzaXplKQorCisgICAgZGVmIHRlc3RfcGF0aF9nZXRtdGltZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwob3MucGF0aC5nZXRhdGltZSkKKworICAgIGRlZiB0ZXN0X3BhdGhfZ2V0Y3RpbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKG9zLnBhdGguZ2V0Y3RpbWUpCisKKyAgICBkZWYgdGVzdF9wYXRoX3NhbWVmaWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5zYW1lZmlsZShzZWxmLmZpbGVfcGF0aCwgc2VsZi5maWxlX25hbWUpKQorCisKIGlmIF9fbmFtZV9fPT0iX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weSBiL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKaW5kZXggOTg0YWFjNy4uOGExOTRhYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CkBAIC01LDEwICs1LDYgQEAKICMgU2tpcCB0aGlzIHRlc3QgaWYgdGhlIF90ZXN0Y2FwaSBtb2R1bGUgaXNuJ3QgYXZhaWxhYmxlLgogc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdfdGVzdGNhcGknKQogZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3Nfa2V5d29yZHMsIGdldGFyZ3Nfa2V5d29yZF9vbmx5Ci10cnk6Ci0gICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfTCwgZ2V0YXJnc19LCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgZ2V0YXJnc19MID0gTm9uZSAjIFBZX0xPTkdfTE9ORyBub3QgYXZhaWxhYmxlCiAKICMgPiBIb3cgYWJvdXQgdGhlIGZvbGxvd2luZyBjb3VudGVycHJvcG9zYWwuIFRoaXMgYWxzbyBjaGFuZ2VzIHNvbWUgb2YKICMgPiB0aGUgb3RoZXIgZm9ybWF0IGNvZGVzIHRvIGJlIGEgbGl0dGxlIG1vcmUgcmVndWxhci4KQEAgLTMwOSw3ICszMDUsNiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX24sIFZFUllfTEFSR0UpCiAKIAotQHVuaXR0ZXN0LnNraXBJZihnZXRhcmdzX0wgaXMgTm9uZSwgJ1BZX0xPTkdfTE9ORyBpcyBub3QgYXZhaWxhYmxlJykKIGNsYXNzIExvbmdMb25nX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9MKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19MCkBAIC0zNjUsNyArMzYwLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2YoRmxvYXRTdWJjbGFzcyg3LjUpKSwgNy41KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZihGbG9hdFN1YmNsYXNzMig3LjUpKSwgNy41KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZiwgQmFkRmxvYXQoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2YoQmFkRmxvYXQyKCkpLCA0LjI1KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19mKEJhZEZsb2F0MigpKSwgNC4yNSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2YoQmFkRmxvYXQzKDcuNSkpLCA3LjUpCiAKICAgICAgICAgZm9yIHggaW4gKEZMVF9NSU4sIC1GTFRfTUlOLCBGTFRfTUFYLCAtRkxUX01BWCwgSU5GLCAtSU5GKToKQEAgLTM5MCw3ICszODYsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZChGbG9hdFN1YmNsYXNzKDcuNSkpLCA3LjUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19kKEZsb2F0U3ViY2xhc3MyKDcuNSkpLCA3LjUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19kLCBCYWRGbG9hdCgpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZChCYWRGbG9hdDIoKSksIDQuMjUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2QoQmFkRmxvYXQyKCkpLCA0LjI1KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZChCYWRGbG9hdDMoNy41KSksIDcuNSkKIAogICAgICAgICBmb3IgeCBpbiAoREJMX01JTiwgLURCTF9NSU4sIERCTF9NQVgsIC1EQkxfTUFYLCBJTkYsIC1JTkYpOgpAQCAtNDc0LDcgKzQ3MSw3IEBACiAKICAgICAgICAgcmV0ID0gZ2V0X2FyZ3MoKlR1cGxlU3ViY2xhc3MoWzEsIDJdKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXQsICgxLCAyKSkKLSAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJldCwgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyZXQpLCB0dXBsZSkKIAogICAgICAgICByZXQgPSBnZXRfYXJncygpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmV0LCAoKCksIE5vbmUpKQpAQCAtNTEyLDcgKzUwOSw3IEBACiAKICAgICAgICAgcmV0ID0gZ2V0X2t3YXJncygqKkRpY3RTdWJjbGFzcyh7J2EnOiAxLCAnYic6IDJ9KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXQsIHsnYSc6IDEsICdiJzogMn0pCi0gICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyZXQsIGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyZXQpLCBkaWN0KQogCiAgICAgICAgIHJldCA9IGdldF9rd2FyZ3MoKQogICAgICAgICBzZWxmLmFzc2VydEluKHJldCwgKHt9LCBOb25lKSkKQEAgLTYyOCwyMCArNjI1LDIwIEBACiAgICAgICAgICAgICApCiAgICAgICAgICMgcmVxdWlyZWQgYXJnIG1pc3NpbmcKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKLSAgICAgICAgICAgICJSZXF1aXJlZCBhcmd1bWVudCAncmVxdWlyZWQnIFwocG9zIDFcKSBub3QgZm91bmQiKToKKyAgICAgICAgICAgIHIiUmVxdWlyZWQgYXJndW1lbnQgJ3JlcXVpcmVkJyBcKHBvcyAxXCkgbm90IGZvdW5kIik6CiAgICAgICAgICAgICBnZXRhcmdzX2tleXdvcmRfb25seShvcHRpb25hbD0yKQogCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCi0gICAgICAgICAgICAiUmVxdWlyZWQgYXJndW1lbnQgJ3JlcXVpcmVkJyBcKHBvcyAxXCkgbm90IGZvdW5kIik6CisgICAgICAgICAgICByIlJlcXVpcmVkIGFyZ3VtZW50ICdyZXF1aXJlZCcgXChwb3MgMVwpIG5vdCBmb3VuZCIpOgogICAgICAgICAgICAgZ2V0YXJnc19rZXl3b3JkX29ubHkoa2V5d29yZF9vbmx5PTMpCiAKICAgICBkZWYgdGVzdF90b29fbWFueV9hcmdzKHNlbGYpOgogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAotICAgICAgICAgICAgIkZ1bmN0aW9uIHRha2VzIGF0IG1vc3QgMiBwb3NpdGlvbmFsIGFyZ3VtZW50cyBcKDMgZ2l2ZW5cKSIpOgorICAgICAgICAgICAgciJGdW5jdGlvbiB0YWtlcyBhdCBtb3N0IDIgcG9zaXRpb25hbCBhcmd1bWVudHMgXCgzIGdpdmVuXCkiKToKICAgICAgICAgICAgIGdldGFyZ3Nfa2V5d29yZF9vbmx5KDEsIDIsIDMpCiAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKLSAgICAgICAgICAgICJmdW5jdGlvbiB0YWtlcyBhdCBtb3N0IDMgYXJndW1lbnRzIFwoNCBnaXZlblwpIik6CisgICAgICAgICAgICByImZ1bmN0aW9uIHRha2VzIGF0IG1vc3QgMyBhcmd1bWVudHMgXCg0IGdpdmVuXCkiKToKICAgICAgICAgICAgIGdldGFyZ3Nfa2V5d29yZF9vbmx5KDEsIDIsIDMsIGtleXdvcmRfb25seT01KQogCiAgICAgZGVmIHRlc3RfaW52YWxpZF9rZXl3b3JkKHNlbGYpOgpAQCAtNjU2LDYgKzY1MywzOSBAQAogICAgICAgICAgICAgZ2V0YXJnc19rZXl3b3JkX29ubHkoMSwgMiwgKip7J1x1REM4MCc6IDEwfSkKIAogCitjbGFzcyBQb3NpdGlvbmFsT25seUFuZEtleXdvcmRzX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19wb3NpdGlvbmFsX29ubHlfYW5kX2tleXdvcmRzIGFzIGdldGFyZ3MKKworICAgIGRlZiB0ZXN0X3Bvc2l0aW9uYWxfYXJncyhzZWxmKToKKyAgICAgICAgIyB1c2luZyBhbGwgcG9zc2libGUgcG9zaXRpb25hbCBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRhcmdzKDEsIDIsIDMpLCAoMSwgMiwgMykpCisKKyAgICBkZWYgdGVzdF9taXhlZF9hcmdzKHNlbGYpOgorICAgICAgICAjIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0YXJncygxLCAyLCBrZXl3b3JkPTMpLCAoMSwgMiwgMykpCisKKyAgICBkZWYgdGVzdF9vcHRpb25hbF9hcmdzKHNlbGYpOgorICAgICAgICAjIG1pc3Npbmcgb3B0aW9uYWwgYXJncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0YXJncygxLCAyKSwgKDEsIDIsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldGFyZ3MoMSwga2V5d29yZD0zKSwgKDEsIC0xLCAzKSkKKworICAgIGRlZiB0ZXN0X3JlcXVpcmVkX2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRhcmdzKDEpLCAoMSwgLTEsIC0xKSkKKyAgICAgICAgIyByZXF1aXJlZCBwb3NpdGlvbmFsIGFyZyBtaXNzaW5nCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICByIkZ1bmN0aW9uIHRha2VzIGF0IGxlYXN0IDEgcG9zaXRpb25hbCBhcmd1bWVudHMgXCgwIGdpdmVuXCkiKToKKyAgICAgICAgICAgIHNlbGYuZ2V0YXJncygpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKKyAgICAgICAgICAgIHIiRnVuY3Rpb24gdGFrZXMgYXQgbGVhc3QgMSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBcKDAgZ2l2ZW5cKSIpOgorICAgICAgICAgICAgc2VsZi5nZXRhcmdzKGtleXdvcmQ9MykKKworICAgIGRlZiB0ZXN0X2VtcHR5X2tleXdvcmQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAiJycgaXMgYW4gaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50IGZvciB0aGlzIGZ1bmN0aW9uIik6CisgICAgICAgICAgICBzZWxmLmdldGFyZ3MoMSwgMiwgKip7Jyc6IDY2Nn0pCisKKwogY2xhc3MgQnl0ZXNfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2Moc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2MKQEAgLTgyMiwxMCArODUyLDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19lc19oYXNoKCdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZiksIGInYWJjXHhlOScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBieXRlYXJyYXkoYidhYmNceGU5XHgwMCcpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoYid4Jyo0KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXNfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2VzX2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVhcnJheShiJ3gnKjQpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXNfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2VzX2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKIAogICAgIGRlZiB0ZXN0X2V0X2hhc2goc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2V0X2hhc2gKQEAgLTg0OCwxMCArODc4LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19ldF9oYXNoKCdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZiksIGInYWJjXHhlOScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBieXRlYXJyYXkoYidhYmNceGU5XHgwMCcpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoYid4Jyo0KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXRfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2V0X2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVhcnJheShiJ3gnKjQpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXRfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2V0X2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKIAogICAgIGRlZiB0ZXN0X3Uoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX3UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weSBiL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weQppbmRleCBkZTYxMGM3Li5kMzQ1YmFhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dldHRleHQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXR0ZXh0LnB5CkBAIC0xLDYgKzEsNSBAQAogaW1wb3J0IG9zCiBpbXBvcnQgYmFzZTY0Ci1pbXBvcnQgc2h1dGlsCiBpbXBvcnQgZ2V0dGV4dAogaW1wb3J0IHVuaXR0ZXN0CiAKQEAgLTQ0MCw2ICs0MzksMTIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Ll9fY2xhc3NfXywgRHVtbXlHTlVUcmFuc2xhdGlvbnMpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnYzJweScsICdFTk9FTlQnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBnZXR0ZXh0LCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5IGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CmluZGV4IDE1NGUzYjYuLjEwOTAxM2YgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKQEAgLTgsNiArOCwxNCBAQAogIyB0ZXN0aW5nIGltcG9ydCAqCiBmcm9tIHN5cyBpbXBvcnQgKgogCisjIGRpZmZlcmVudCBpbXBvcnQgcGF0dGVybnMgdG8gY2hlY2sgdGhhdCBfX2Fubm90YXRpb25zX18gZG9lcyBub3QgaW50ZXJmZXJlCisjIHdpdGggaW1wb3J0IG1hY2hpbmVyeQoraW1wb3J0IHRlc3QuYW5uX21vZHVsZSBhcyBhbm5fbW9kdWxlCitpbXBvcnQgdHlwaW5nCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDaGFpbk1hcAorZnJvbSB0ZXN0IGltcG9ydCBhbm5fbW9kdWxlMgoraW1wb3J0IHRlc3QKKwogCiBjbGFzcyBUb2tlblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMTM5LDYgKzE0NywxOSBAQAogICAgICAgICAgICAgICAgIGNvbXBpbGUocywgIjx0ZXN0PiIsICJleGVjIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInVuZXhwZWN0ZWQgRU9GIiwgc3RyKGNtLmV4Y2VwdGlvbikpCiAKK3Zhcl9hbm5vdF9nbG9iYWw6IGludCAjIGEgZ2xvYmFsIGFubm90YXRlZCBpcyBuZWNlc3NhcnkgZm9yIHRlc3RfdmFyX2Fubm90CisKKyMgY3VzdG9tIG5hbWVzcGFjZSBmb3IgdGVzdGluZyBfX2Fubm90YXRpb25zX18KKworY2xhc3MgQ05TOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGN0ID0ge30KKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaXRlbSwgdmFsdWUpOgorICAgICAgICBzZWxmLl9kY3RbaXRlbS5sb3dlcigpXSA9IHZhbHVlCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGl0ZW0pOgorICAgICAgICByZXR1cm4gc2VsZi5fZGN0W2l0ZW1dCisKKwogY2xhc3MgR3JhbW1hclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgICMgc2luZ2xlX2lucHV0OiBORVdMSU5FIHwgc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10IE5FV0xJTkUKQEAgLTE1NCw2ICsxNzUsMTYzIEBACiAgICAgICAgICMgdGVzdGxpc3QgRU5ETUFSS0VSCiAgICAgICAgIHggPSBldmFsKCcxLCAwIG9yIDEnKQogCisgICAgZGVmIHRlc3RfdmFyX2Fubm90X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgIyBhbGwgdGhlc2Ugc2hvdWxkIGJlIGFsbG93ZWQKKyAgICAgICAgdmFyMTogaW50ID0gNQorICAgICAgICB2YXIyOiBbaW50LCBzdHJdCisgICAgICAgIG15X2xzdCA9IFs0Ml0KKyAgICAgICAgZGVmIG9uZSgpOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgaW50Lm5ld19hdHRyOiBpbnQKKyAgICAgICAgW2xpc3RdWzBdOiB0eXBlCisgICAgICAgIG15X2xzdFtvbmUoKS0xXTogaW50ID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG15X2xzdCwgWzVdKQorCisgICAgZGVmIHRlc3RfdmFyX2Fubm90X3N5bnRheF9lcnJvcnMoc2VsZik6CisgICAgICAgICMgcGFyc2VyIHBhc3MKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJkZWYgZjogaW50IikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJ4OiBpbnQ6IHN0ciIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZGVmIGYoKTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgbm9ubG9jYWwgeDogaW50XG4iKQorICAgICAgICAjIEFTVCBwYXNzCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiW3gsIDBdOiBpbnRcbiIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZigpOiBpbnRcbiIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiKHgsKTogaW50IikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJkZWYgZigpOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAoeCwgeSk6IGludCA9ICgxLCAyKVxuIikKKyAgICAgICAgIyBzeW10YWJsZSBwYXNzCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZGVmIGYoKTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgeDogaW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGdsb2JhbCB4XG4iKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImRlZiBmKCk6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGdsb2JhbCB4XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHg6IGludFxuIikKKworICAgIGRlZiB0ZXN0X3Zhcl9hbm5vdF9iYXNpY19zZW1hbnRpY3Moc2VsZik6CisgICAgICAgICMgZXhlY3V0aW9uIG9yZGVyCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgbm9fbmFtZVtkb2VzX25vdF9leGlzdF06IG5vX25hbWVfYWdhaW4gPSAxLzAKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhOYW1lRXJyb3IpOgorICAgICAgICAgICAgbm9fbmFtZVtkb2VzX25vdF9leGlzdF06IDEvMCA9IDAKKyAgICAgICAgZ2xvYmFsIHZhcl9hbm5vdF9nbG9iYWwKKworICAgICAgICAjIGZ1bmN0aW9uIHNlbWFudGljcworICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgc3Q6IHN0ciA9ICJIZWxsbyIKKyAgICAgICAgICAgIGEuYjogaW50ID0gKDEsIDIpCisgICAgICAgICAgICByZXR1cm4gc3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLl9fYW5ub3RhdGlvbnNfXywge30pCisgICAgICAgIGRlZiBmX09LKCk6CisgICAgICAgICAgICB4OiAxLzAKKyAgICAgICAgZl9PSygpCisgICAgICAgIGRlZiBmYmFkKCk6CisgICAgICAgICAgICB4OiBpbnQKKyAgICAgICAgICAgIHByaW50KHgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5ib3VuZExvY2FsRXJyb3IpOgorICAgICAgICAgICAgZmJhZCgpCisgICAgICAgIGRlZiBmMmJhZCgpOgorICAgICAgICAgICAgKG5vX3N1Y2hfZ2xvYmFsKTogaW50CisgICAgICAgICAgICBwcmludChub19zdWNoX2dsb2JhbCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZjJiYWQoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZSksIE5hbWVFcnJvcikKKworICAgICAgICAjIGNsYXNzIHNlbWFudGljcworICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgeDogaW50CisgICAgICAgICAgICBzOiBzdHIgPSAiYXR0ciIKKyAgICAgICAgICAgIHogPSAyCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54OiBpbnQgPSB4CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5fX2Fubm90YXRpb25zX18sIHsneCc6IGludCwgJ3MnOiBzdHJ9KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE5hbWVFcnJvcik6CisgICAgICAgICAgICBjbGFzcyBDQmFkOgorICAgICAgICAgICAgICAgIG5vX3N1Y2hfbmFtZV9kZWZpbmVkLmF0dHI6IGludCA9IDAKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhOYW1lRXJyb3IpOgorICAgICAgICAgICAgY2xhc3MgQ2JhZDIoQyk6CisgICAgICAgICAgICAgICAgeDogaW50CisgICAgICAgICAgICAgICAgeC55OiBsaXN0ID0gW10KKworICAgIGRlZiB0ZXN0X3Zhcl9hbm5vdF9tZXRhY2xhc3Nfc2VtYW50aWNzKHNlbGYpOgorICAgICAgICBjbGFzcyBDTWV0YSh0eXBlKToKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIF9fcHJlcGFyZV9fKG1ldGFjbHMsIG5hbWUsIGJhc2VzLCAqKmt3ZHMpOgorICAgICAgICAgICAgICAgIHJldHVybiB7J19fYW5ub3RhdGlvbnNfXyc6IENOUygpfQorICAgICAgICBjbGFzcyBDQyhtZXRhY2xhc3M9Q01ldGEpOgorICAgICAgICAgICAgWFg6ICdBTk5PVCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDQy5fX2Fubm90YXRpb25zX19bJ3h4J10sICdBTk5PVCcpCisKKyAgICBkZWYgdGVzdF92YXJfYW5ub3RfbW9kdWxlX3NlbWFudGljcyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBwcmludCh0ZXN0Ll9fYW5ub3RhdGlvbnNfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbm5fbW9kdWxlLl9fYW5ub3RhdGlvbnNfXywKKyAgICAgICAgICAgICAgICAgICAgIHsxOiAyLCAneCc6IGludCwgJ3knOiBzdHIsICdmJzogdHlwaW5nLlR1cGxlW2ludCwgaW50XX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW5uX21vZHVsZS5NLl9fYW5ub3RhdGlvbnNfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnMTIzJzogMTIzLCAnbyc6IHR5cGV9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFubl9tb2R1bGUyLl9fYW5ub3RhdGlvbnNfXywge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwaW5nLmdldF90eXBlX2hpbnRzKGFubl9tb2R1bGUyLkNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5fbW9kdWxlMi5fX2RpY3RfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhaW5NYXAoeyd2YXInOiB0eXBpbmcuQ2xhc3NWYXJbYW5uX21vZHVsZTIuQ1ZdfSwge30pKQorCisgICAgZGVmIHRlc3RfdmFyX2Fubm90X2luX21vZHVsZShzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aGF0IGZ1bmN0aW9ucyBmYWlsIHRoZSBzYW1lIHdheSB3aGVuIGV4ZWN1dGVkCisgICAgICAgICMgb3V0c2lkZSBvZiBtb2R1bGUgd2hlcmUgdGhleSB3ZXJlIGRlZmluZWQKKyAgICAgICAgZnJvbSB0ZXN0LmFubl9tb2R1bGUzIGltcG9ydCBmX2JhZF9hbm4sIGdfYmFkX2FubiwgRF9iYWRfYW5uCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yKToKKyAgICAgICAgICAgIGZfYmFkX2FubigpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yKToKKyAgICAgICAgICAgIGdfYmFkX2FubigpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yKToKKyAgICAgICAgICAgIERfYmFkX2Fubig1KQorCisgICAgZGVmIHRlc3RfdmFyX2Fubm90X3NpbXBsZV9leGVjKHNlbGYpOgorICAgICAgICBnbnMgPSB7fTsgbG5zPSB7fQorICAgICAgICBleGVjKCInZG9jc3RyaW5nJ1xuIgorICAgICAgICAgICAgICJfX2Fubm90YXRpb25zX19bMV0gPSAyXG4iCisgICAgICAgICAgICAgIng6IGludCA9IDVcbiIsIGducywgbG5zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxuc1siX19hbm5vdGF0aW9uc19fIl0sIHsxOiAyLCAneCc6IGludH0pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgICAgICAgZ25zWydfX2Fubm90YXRpb25zX18nXQorCisgICAgZGVmIHRlc3RfdmFyX2Fubm90X2N1c3RvbV9tYXBzKHNlbGYpOgorICAgICAgICAjIHRlc3RzIHdpdGggY3VzdG9tIGxvY2FscygpIGFuZCBfX2Fubm90YXRpb25zX18KKyAgICAgICAgbnMgPSB7J19fYW5ub3RhdGlvbnNfXyc6IENOUygpfQorICAgICAgICBleGVjKCdYOiBpbnQ7IFo6IHN0ciA9ICJaIjsgKHcpOiBjb21wbGV4ID0gMWonLCBucykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuc1snX19hbm5vdGF0aW9uc19fJ11bJ3gnXSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zWydfX2Fubm90YXRpb25zX18nXVsneiddLCBzdHIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgICAgICAgbnNbJ19fYW5ub3RhdGlvbnNfXyddWyd3J10KKyAgICAgICAgbm9ubG9jX25zID0ge30KKyAgICAgICAgY2xhc3MgQ05TMjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLl9kY3QgPSB7fQorICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGl0ZW0sIHZhbHVlKToKKyAgICAgICAgICAgICAgICBub25sb2NhbCBub25sb2NfbnMKKyAgICAgICAgICAgICAgICBzZWxmLl9kY3RbaXRlbV0gPSB2YWx1ZQorICAgICAgICAgICAgICAgIG5vbmxvY19uc1tpdGVtXSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaXRlbSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RjdFtpdGVtXQorICAgICAgICBleGVjKCd4OiBpbnQgPSAxJywge30sIENOUzIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub25sb2NfbnNbJ19fYW5ub3RhdGlvbnNfXyddWyd4J10sIGludCkKKworICAgIGRlZiB0ZXN0X3Zhcl9hbm5vdF9yZWZsZWFrKHNlbGYpOgorICAgICAgICAjIGNvbXBsZXggY2FzZTogY3VzdG9tIGxvY2FscyBwbHVzIGN1c3RvbSBfX2Fubm90YXRpb25zX18KKyAgICAgICAgIyB0aGlzIHdhcyBjYXVzaW5nIHJlZmxlYWsKKyAgICAgICAgY25zID0gQ05TKCkKKyAgICAgICAgbm9ubG9jX25zID0geydfX2Fubm90YXRpb25zX18nOiBjbnN9CisgICAgICAgIGNsYXNzIENOUzI6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5fZGN0ID0geydfX2Fubm90YXRpb25zX18nOiBjbnN9CisgICAgICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaXRlbSwgdmFsdWUpOgorICAgICAgICAgICAgICAgIG5vbmxvY2FsIG5vbmxvY19ucworICAgICAgICAgICAgICAgIHNlbGYuX2RjdFtpdGVtXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgbm9ubG9jX25zW2l0ZW1dID0gdmFsdWUKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpdGVtKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGN0W2l0ZW1dCisgICAgICAgIGV4ZWMoJ1g6IHN0cicsIHt9LCBDTlMyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ubG9jX25zWydfX2Fubm90YXRpb25zX18nXVsneCddLCBzdHIpCisKICAgICBkZWYgdGVzdF9mdW5jZGVmKHNlbGYpOgogICAgICAgICAjIyMgW2RlY29yYXRvcnNdICdkZWYnIE5BTUUgcGFyYW1ldGVycyBbJy0+JyB0ZXN0XSAnOicgc3VpdGUKICAgICAgICAgIyMjIGRlY29yYXRvcjogJ0AnIGRvdHRlZF9uYW1lIFsgJygnIFthcmdsaXN0XSAnKScgXSBORVdMSU5FCkBAIC0yOTUsNiArNDczLDEwIEBACiAgICAgICAgIHBvczJrZXkyZGljdCgxLDIsazI9MTAwLHRva3dhcmcxPTEwMCx0b2t3YXJnMj0yMDApCiAgICAgICAgIHBvczJrZXkyZGljdCgxLDIsdG9rd2FyZzE9MTAwLHRva3dhcmcyPTIwMCwgazI9MTAwKQogCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiZGVmIGYoKik6IHBhc3MiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgImRlZiBmKCosKTogcGFzcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiZGVmIGYoKiwgKiprd2RzKTogcGFzcyIpCisKICAgICAgICAgIyBrZXl3b3JkIGFyZ3VtZW50cyBhZnRlciAqYXJnbGlzdAogICAgICAgICBkZWYgZigqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICAgcmV0dXJuIGFyZ3MsIGt3YXJncwpAQCAtMzQxLDcgKzUyMyw3IEBACiAgICAgICAgIGRlZiBmKHgpIC0+IGxpc3Q6IHBhc3MKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLl9fYW5ub3RhdGlvbnNfXywgeydyZXR1cm4nOiBsaXN0fSkKIAotICAgICAgICAjIHRlc3QgTUFLRV9DTE9TVVJFIHdpdGggYSB2YXJpZXR5IG9mIG9wYXJnJ3MKKyAgICAgICAgIyB0ZXN0IGNsb3N1cmVzIHdpdGggYSB2YXJpZXR5IG9mIG9wYXJncwogICAgICAgICBjbG9zdXJlID0gMQogICAgICAgICBkZWYgZigpOiByZXR1cm4gY2xvc3VyZQogICAgICAgICBkZWYgZih4PTEpOiByZXR1cm4gY2xvc3VyZQpAQCAtMzUyLDYgKzUzNCwyMyBAQAogICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImYoKmcoMT0yKSkiKQogICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImYoKipnKDE9MikpIikKIAorICAgICAgICAjIENoZWNrIHRyYWlsaW5nIGNvbW1hcyBhcmUgcGVybWl0dGVkIGluIGZ1bmNkZWYgYXJndW1lbnQgbGlzdAorICAgICAgICBkZWYgZihhLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKmFyZ3MsKTogcGFzcworICAgICAgICBkZWYgZigqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZihhLCAqYXJncywpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKCphcmdzLCBiLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKiwgYiwpOiBwYXNzCisgICAgICAgIGRlZiBmKCphcmdzLCAqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZihhLCAqYXJncywgYiwpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICosIGIsKTogcGFzcworICAgICAgICBkZWYgZihhLCAqYXJncywgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKmFyZ3MsIGIsICoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKCosIGIsICoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICphcmdzLCBiLCAqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZihhLCAqLCBiLCAqKmt3ZHMsKTogcGFzcworCiAgICAgZGVmIHRlc3RfbGFtYmRlZihzZWxmKToKICAgICAgICAgIyMjIGxhbWJkZWY6ICdsYW1iZGEnIFt2YXJhcmdzbGlzdF0gJzonIHRlc3QKICAgICAgICAgbDEgPSBsYW1iZGEgOiAwCkBAIC0zNzAsNiArNTY5LDIzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDYoMSwyKSwgMSsyKzIwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGw2KDEsMixrPTEwKSwgMSsyKzEwKQogCisgICAgICAgICMgY2hlY2sgdGhhdCB0cmFpbGluZyBjb21tYXMgYXJlIHBlcm1pdHRlZAorICAgICAgICBsMTAgPSBsYW1iZGEgYSw6IDAKKyAgICAgICAgbDExID0gbGFtYmRhICphcmdzLDogMAorICAgICAgICBsMTIgPSBsYW1iZGEgKiprd2RzLDogMAorICAgICAgICBsMTMgPSBsYW1iZGEgYSwgKmFyZ3MsOiAwCisgICAgICAgIGwxNCA9IGxhbWJkYSBhLCAqKmt3ZHMsOiAwCisgICAgICAgIGwxNSA9IGxhbWJkYSAqYXJncywgYiw6IDAKKyAgICAgICAgbDE2ID0gbGFtYmRhICosIGIsOiAwCisgICAgICAgIGwxNyA9IGxhbWJkYSAqYXJncywgKiprd2RzLDogMAorICAgICAgICBsMTggPSBsYW1iZGEgYSwgKmFyZ3MsIGIsOiAwCisgICAgICAgIGwxOSA9IGxhbWJkYSBhLCAqLCBiLDogMAorICAgICAgICBsMjAgPSBsYW1iZGEgYSwgKmFyZ3MsICoqa3dkcyw6IDAKKyAgICAgICAgbDIxID0gbGFtYmRhICphcmdzLCBiLCAqKmt3ZHMsOiAwCisgICAgICAgIGwyMiA9IGxhbWJkYSAqLCBiLCAqKmt3ZHMsOiAwCisgICAgICAgIGwyMyA9IGxhbWJkYSBhLCAqYXJncywgYiwgKiprd2RzLDogMAorICAgICAgICBsMjQgPSBsYW1iZGEgYSwgKiwgYiwgKiprd2RzLDogMAorCiAKICAgICAjIyMgc3RtdDogc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10CiAgICAgIyBUZXN0ZWQgYmVsb3cKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5IGIvTGliL3Rlc3QvdGVzdF9ncnAucHkKaW5kZXggMjcyYjA4Ni4uNjkwOTVhMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ncnAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ncnAucHkKQEAgLTkyLDUgKzkyLDE1IEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGdycC5nZXRncmdpZCwgZmFrZWdpZCkKIAorICAgIGRlZiB0ZXN0X25vbmludGVnZXJfZ2lkKHNlbGYpOgorICAgICAgICBlbnRyaWVzID0gZ3JwLmdldGdyYWxsKCkKKyAgICAgICAgaWYgbm90IGVudHJpZXM6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdubyBncm91cHMnKQorICAgICAgICAjIENob29zZSBhbiBleGlzdGVudCBnaWQuCisgICAgICAgIGdpZCA9IGVudHJpZXNbMF1bMl0KKyAgICAgICAgc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcsIGdycC5nZXRncmdpZCwgZmxvYXQoZ2lkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcsIGdycC5nZXRncmdpZCwgc3RyKGdpZCkpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaGFzaGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfaGFzaGxpYi5weQppbmRleCBjOWIxMTNlLi41YWU4YzA3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2hhc2hsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9oYXNobGliLnB5CkBAIC03LDYgKzcsNyBAQAogIwogCiBpbXBvcnQgYXJyYXkKK2Zyb20gYmluYXNjaWkgaW1wb3J0IHVuaGV4bGlmeQogaW1wb3J0IGhhc2hsaWIKIGltcG9ydCBpdGVydG9vbHMKIGltcG9ydCBvcwpAQCAtMTksNiArMjAsNyBAQAogaW1wb3J0IHdhcm5pbmdzCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBfNEcsIGJpZ21lbXRlc3QsIGltcG9ydF9mcmVzaF9tb2R1bGUKK2Zyb20gaHR0cC5jbGllbnQgaW1wb3J0IEhUVFBFeGNlcHRpb24KIAogIyBXZXJlIHdlIGNvbXBpbGVkIC0td2l0aC1weWRlYnVnIG9yIHdpdGggI2RlZmluZSBQeV9ERUJVRz8KIENPTVBJTEVEX1dJVEhfUFlERUJVRyA9IGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpCkBAIC0yNiw2ICsyOCwyMSBAQAogY19oYXNobGliID0gaW1wb3J0X2ZyZXNoX21vZHVsZSgnaGFzaGxpYicsIGZyZXNoPVsnX2hhc2hsaWInXSkKIHB5X2hhc2hsaWIgPSBpbXBvcnRfZnJlc2hfbW9kdWxlKCdoYXNobGliJywgYmxvY2tlZD1bJ19oYXNobGliJ10pCiAKK3RyeToKKyAgICBpbXBvcnQgX2JsYWtlMgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF9ibGFrZTIgPSBOb25lCisKK3JlcXVpcmVzX2JsYWtlMiA9IHVuaXR0ZXN0LnNraXBVbmxlc3MoX2JsYWtlMiwgJ3JlcXVpcmVzIF9ibGFrZTInKQorCit0cnk6CisgICAgaW1wb3J0IF9zaGEzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX3NoYTMgPSBOb25lCisKK3JlcXVpcmVzX3NoYTMgPSB1bml0dGVzdC5za2lwVW5sZXNzKF9zaGEzLCAncmVxdWlyZXMgX3NoYTMnKQorCisKIGRlZiBoZXhzdHIocyk6CiAgICAgYXNzZXJ0IGlzaW5zdGFuY2UocywgYnl0ZXMpLCByZXByKHMpCiAgICAgaCA9ICIwMTIzNDU2Nzg5YWJjZGVmIgpAQCAtMzUsMTAgKzUyLDMzIEBACiAgICAgcmV0dXJuIHIKIAogCitVUkwgPSAiaHR0cDovL3d3dy5weXRob250ZXN0Lm5ldC9oYXNobGliL3t9LnR4dCIKKworZGVmIHJlYWRfdmVjdG9ycyhoYXNoX25hbWUpOgorICAgIHVybCA9IFVSTC5mb3JtYXQoaGFzaF9uYW1lKQorICAgIHRyeToKKyAgICAgICAgdGVzdGRhdGEgPSBzdXBwb3J0Lm9wZW5fdXJscmVzb3VyY2UodXJsKQorICAgIGV4Y2VwdCAoT1NFcnJvciwgSFRUUEV4Y2VwdGlvbik6CisgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJDb3VsZCBub3QgcmV0cmlldmUge30iLmZvcm1hdCh1cmwpKQorICAgIHdpdGggdGVzdGRhdGE6CisgICAgICAgIGZvciBsaW5lIGluIHRlc3RkYXRhOgorICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCcjJykgb3Igbm90IGxpbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHBhcnRzID0gbGluZS5zcGxpdCgnLCcpCisgICAgICAgICAgICBwYXJ0c1swXSA9IGJ5dGVzLmZyb21oZXgocGFydHNbMF0pCisgICAgICAgICAgICB5aWVsZCBwYXJ0cworCisKIGNsYXNzIEhhc2hMaWJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgc3VwcG9ydGVkX2hhc2hfbmFtZXMgPSAoICdtZDUnLCAnTUQ1JywgJ3NoYTEnLCAnU0hBMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGEyMjQnLCAnU0hBMjI0JywgJ3NoYTI1NicsICdTSEEyNTYnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hhMzg0JywgJ1NIQTM4NCcsICdzaGE1MTInLCAnU0hBNTEyJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYTM4NCcsICdTSEEzODQnLCAnc2hhNTEyJywgJ1NIQTUxMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdibGFrZTJiJywgJ2JsYWtlMnMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hhM18yMjQnLCAnc2hhM18yNTYnLCAnc2hhM18zODQnLCAnc2hhM181MTInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hha2VfMTI4JywgJ3NoYWtlXzI1NicpCisKKyAgICBzaGFrZXMgPSB7J3NoYWtlXzEyOCcsICdzaGFrZV8yNTYnfQogCiAgICAgIyBJc3N1ZSAjMTQ2OTM6IGZhbGxiYWNrIG1vZHVsZXMgYXJlIGFsd2F5cyBjb21waWxlZCB1bmRlciBQT1NJWAogICAgIF93YXJuX29uX2V4dGVuc2lvbl9pbXBvcnQgPSBvcy5uYW1lID09ICdwb3NpeCcgb3IgQ09NUElMRURfV0lUSF9QWURFQlVHCkBAIC01Niw2ICs5NiwxMSBAQAogICAgICAgICBhbGdvcml0aG1zID0gc2V0KCkKICAgICAgICAgZm9yIGFsZ29yaXRobSBpbiBzZWxmLnN1cHBvcnRlZF9oYXNoX25hbWVzOgogICAgICAgICAgICAgYWxnb3JpdGhtcy5hZGQoYWxnb3JpdGhtLmxvd2VyKCkpCisKKyAgICAgICAgX2JsYWtlMiA9IHNlbGYuX2NvbmRpdGlvbmFsX2ltcG9ydF9tb2R1bGUoJ19ibGFrZTInKQorICAgICAgICBpZiBfYmxha2UyOgorICAgICAgICAgICAgYWxnb3JpdGhtcy51cGRhdGUoeydibGFrZTJiJywgJ2JsYWtlMnMnfSkKKwogICAgICAgICBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0ID0ge30KICAgICAgICAgZm9yIGFsZ29yaXRobSBpbiBhbGdvcml0aG1zOgogICAgICAgICAgICAgc2VsZi5jb25zdHJ1Y3RvcnNfdG9fdGVzdFthbGdvcml0aG1dID0gc2V0KCkKQEAgLTY0LDEwICsxMDksMTAgQEAKICAgICAgICAgIyBvZiBoYXNobGliLm5ldyBnaXZlbiB0aGUgYWxnb3JpdGhtIG5hbWUuCiAgICAgICAgIGZvciBhbGdvcml0aG0sIGNvbnN0cnVjdG9ycyBpbiBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0Lml0ZW1zKCk6CiAgICAgICAgICAgICBjb25zdHJ1Y3RvcnMuYWRkKGdldGF0dHIoaGFzaGxpYiwgYWxnb3JpdGhtKSkKLSAgICAgICAgICAgIGRlZiBfdGVzdF9hbGdvcml0aG1fdmlhX2hhc2hsaWJfbmV3KGRhdGE9Tm9uZSwgX2FsZz1hbGdvcml0aG0pOgorICAgICAgICAgICAgZGVmIF90ZXN0X2FsZ29yaXRobV92aWFfaGFzaGxpYl9uZXcoZGF0YT1Ob25lLCBfYWxnPWFsZ29yaXRobSwgKiprd2FyZ3MpOgogICAgICAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hsaWIubmV3KF9hbGcpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hsaWIubmV3KF9hbGcsIGRhdGEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNobGliLm5ldyhfYWxnLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaGxpYi5uZXcoX2FsZywgZGF0YSwgKiprd2FyZ3MpCiAgICAgICAgICAgICBjb25zdHJ1Y3RvcnMuYWRkKF90ZXN0X2FsZ29yaXRobV92aWFfaGFzaGxpYl9uZXcpCiAKICAgICAgICAgX2hhc2hsaWIgPSBzZWxmLl9jb25kaXRpb25hbF9pbXBvcnRfbW9kdWxlKCdfaGFzaGxpYicpCkBAIC05OSw2ICsxNDQsMTggQEAKICAgICAgICAgaWYgX3NoYTUxMjoKICAgICAgICAgICAgIGFkZF9idWlsdGluX2NvbnN0cnVjdG9yKCdzaGEzODQnKQogICAgICAgICAgICAgYWRkX2J1aWx0aW5fY29uc3RydWN0b3IoJ3NoYTUxMicpCisgICAgICAgIGlmIF9ibGFrZTI6CisgICAgICAgICAgICBhZGRfYnVpbHRpbl9jb25zdHJ1Y3RvcignYmxha2UycycpCisgICAgICAgICAgICBhZGRfYnVpbHRpbl9jb25zdHJ1Y3RvcignYmxha2UyYicpCisKKyAgICAgICAgX3NoYTMgPSBzZWxmLl9jb25kaXRpb25hbF9pbXBvcnRfbW9kdWxlKCdfc2hhMycpCisgICAgICAgIGlmIF9zaGEzOgorICAgICAgICAgICAgYWRkX2J1aWx0aW5fY29uc3RydWN0b3IoJ3NoYTNfMjI0JykKKyAgICAgICAgICAgIGFkZF9idWlsdGluX2NvbnN0cnVjdG9yKCdzaGEzXzI1NicpCisgICAgICAgICAgICBhZGRfYnVpbHRpbl9jb25zdHJ1Y3Rvcignc2hhM18zODQnKQorICAgICAgICAgICAgYWRkX2J1aWx0aW5fY29uc3RydWN0b3IoJ3NoYTNfNTEyJykKKyAgICAgICAgICAgIGFkZF9idWlsdGluX2NvbnN0cnVjdG9yKCdzaGFrZV8xMjgnKQorICAgICAgICAgICAgYWRkX2J1aWx0aW5fY29uc3RydWN0b3IoJ3NoYWtlXzI1NicpCiAKICAgICAgICAgc3VwZXIoSGFzaExpYlRlc3RDYXNlLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAKQEAgLTExMSw3ICsxNjgsMTAgQEAKICAgICAgICAgYSA9IGFycmF5LmFycmF5KCJiIiwgcmFuZ2UoMTApKQogICAgICAgICBmb3IgY29ucyBpbiBzZWxmLmhhc2hfY29uc3RydWN0b3JzOgogICAgICAgICAgICAgYyA9IGNvbnMoYSkKLSAgICAgICAgICAgIGMuaGV4ZGlnZXN0KCkKKyAgICAgICAgICAgIGlmIGMubmFtZSBpbiBzZWxmLnNoYWtlczoKKyAgICAgICAgICAgICAgICBjLmhleGRpZ2VzdCgxNikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYy5oZXhkaWdlc3QoKQogCiAgICAgZGVmIHRlc3RfYWxnb3JpdGhtc19ndWFyYW50ZWVkKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2hsaWIuYWxnb3JpdGhtc19ndWFyYW50ZWVkLApAQCAtMTU1LDE0ICsyMTUsMjEgQEAKICAgICBkZWYgdGVzdF9oZXhkaWdlc3Qoc2VsZik6CiAgICAgICAgIGZvciBjb25zIGluIHNlbGYuaGFzaF9jb25zdHJ1Y3RvcnM6CiAgICAgICAgICAgICBoID0gY29ucygpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaC5kaWdlc3QoKSwgYnl0ZXMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleHN0cihoLmRpZ2VzdCgpKSwgaC5oZXhkaWdlc3QoKSkKKyAgICAgICAgICAgIGlmIGgubmFtZSBpbiBzZWxmLnNoYWtlczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaC5kaWdlc3QoMTYpLCBieXRlcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleHN0cihoLmRpZ2VzdCgxNikpLCBoLmhleGRpZ2VzdCgxNikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShoLmRpZ2VzdCgpLCBieXRlcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleHN0cihoLmRpZ2VzdCgpKSwgaC5oZXhkaWdlc3QoKSkKIAogICAgIGRlZiB0ZXN0X25hbWVfYXR0cmlidXRlKHNlbGYpOgogICAgICAgICBmb3IgY29ucyBpbiBzZWxmLmhhc2hfY29uc3RydWN0b3JzOgogICAgICAgICAgICAgaCA9IGNvbnMoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGgubmFtZSwgc3RyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihoLm5hbWUsIHNlbGYuc3VwcG9ydGVkX2hhc2hfbmFtZXMpCisgICAgICAgICAgICBpZiBoLm5hbWUgaW4gc2VsZi5zdXBwb3J0ZWRfaGFzaF9uYW1lczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGgubmFtZSwgc2VsZi5zdXBwb3J0ZWRfaGFzaF9uYW1lcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihoLm5hbWUsIHNlbGYuc3VwcG9ydGVkX2hhc2hfbmFtZXMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgubmFtZSwgaGFzaGxpYi5uZXcoaC5uYW1lKS5uYW1lKQogCiAgICAgZGVmIHRlc3RfbGFyZ2VfdXBkYXRlKHNlbGYpOgpAQCAtMTc3LDQwICsyNDQsNDYgQEAKICAgICAgICAgICAgIG0xLnVwZGF0ZShiZWVzKQogICAgICAgICAgICAgbTEudXBkYXRlKGNlZXMpCiAgICAgICAgICAgICBtMS51cGRhdGUoZGVlcykKKyAgICAgICAgICAgIGlmIG0xLm5hbWUgaW4gc2VsZi5zaGFrZXM6CisgICAgICAgICAgICAgICAgYXJncyA9ICgxNiwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFyZ3MgPSAoKQogCiAgICAgICAgICAgICBtMiA9IGNvbnMoKQogICAgICAgICAgICAgbTIudXBkYXRlKGFhcyArIGJlZXMgKyBjZWVzICsgZGVlcykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEuZGlnZXN0KCksIG0yLmRpZ2VzdCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5kaWdlc3QoKmFyZ3MpLCBtMi5kaWdlc3QoKmFyZ3MpKQogCiAgICAgICAgICAgICBtMyA9IGNvbnMoYWFzICsgYmVlcyArIGNlZXMgKyBkZWVzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5kaWdlc3QoKSwgbTMuZGlnZXN0KCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0xLmRpZ2VzdCgqYXJncyksIG0zLmRpZ2VzdCgqYXJncykpCiAKICAgICAgICAgICAgICMgdmVyaWZ5IGNvcHkoKSBkb2Vzbid0IHRvdWNoIG9yaWdpbmFsCiAgICAgICAgICAgICBtNCA9IGNvbnMoYWFzICsgYmVlcyArIGNlZXMpCi0gICAgICAgICAgICBtNF9kaWdlc3QgPSBtNC5kaWdlc3QoKQorICAgICAgICAgICAgbTRfZGlnZXN0ID0gbTQuZGlnZXN0KCphcmdzKQogICAgICAgICAgICAgbTRfY29weSA9IG00LmNvcHkoKQogICAgICAgICAgICAgbTRfY29weS51cGRhdGUoZGVlcykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEuZGlnZXN0KCksIG00X2NvcHkuZGlnZXN0KCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG00LmRpZ2VzdCgpLCBtNF9kaWdlc3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0xLmRpZ2VzdCgqYXJncyksIG00X2NvcHkuZGlnZXN0KCphcmdzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTQuZGlnZXN0KCphcmdzKSwgbTRfZGlnZXN0KQogCi0gICAgZGVmIGNoZWNrKHNlbGYsIG5hbWUsIGRhdGEsIGhleGRpZ2VzdCk6CisgICAgZGVmIGNoZWNrKHNlbGYsIG5hbWUsIGRhdGEsIGhleGRpZ2VzdCwgc2hha2U9RmFsc2UsICoqa3dhcmdzKToKKyAgICAgICAgbGVuZ3RoID0gbGVuKGhleGRpZ2VzdCkvLzIKICAgICAgICAgaGV4ZGlnZXN0ID0gaGV4ZGlnZXN0Lmxvd2VyKCkKICAgICAgICAgY29uc3RydWN0b3JzID0gc2VsZi5jb25zdHJ1Y3RvcnNfdG9fdGVzdFtuYW1lXQogICAgICAgICAjIDIgaXMgZm9yIGhhc2hsaWIubmFtZSguLi4pIGFuZCBoYXNobGliLm5ldyhuYW1lLCAuLi4pCiAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGxlbihjb25zdHJ1Y3RvcnMpLCAyKQogICAgICAgICBmb3IgaGFzaF9vYmplY3RfY29uc3RydWN0b3IgaW4gY29uc3RydWN0b3JzOgotICAgICAgICAgICAgbSA9IGhhc2hfb2JqZWN0X2NvbnN0cnVjdG9yKGRhdGEpCi0gICAgICAgICAgICBjb21wdXRlZCA9IG0uaGV4ZGlnZXN0KCkKKyAgICAgICAgICAgIG0gPSBoYXNoX29iamVjdF9jb25zdHJ1Y3RvcihkYXRhLCAqKmt3YXJncykKKyAgICAgICAgICAgIGNvbXB1dGVkID0gbS5oZXhkaWdlc3QoKSBpZiBub3Qgc2hha2UgZWxzZSBtLmhleGRpZ2VzdChsZW5ndGgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCwgaGV4ZGlnZXN0LAogICAgICAgICAgICAgICAgICAgICAiSGFzaCBhbGdvcml0aG0gJXMgY29uc3RydWN0ZWQgdXNpbmcgJXMgcmV0dXJuZWQgaGV4ZGlnZXN0IgogICAgICAgICAgICAgICAgICAgICAiICVyIGZvciAlZCBieXRlIGlucHV0IGRhdGEgdGhhdCBzaG91bGQgaGF2ZSBoYXNoZWQgdG8gJXIuIgogICAgICAgICAgICAgICAgICAgICAlIChuYW1lLCBoYXNoX29iamVjdF9jb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQsIGxlbihkYXRhKSwgaGV4ZGlnZXN0KSkKLSAgICAgICAgICAgIGNvbXB1dGVkID0gbS5kaWdlc3QoKQorICAgICAgICAgICAgY29tcHV0ZWQgPSBtLmRpZ2VzdCgpIGlmIG5vdCBzaGFrZSBlbHNlIG0uZGlnZXN0KGxlbmd0aCkKICAgICAgICAgICAgIGRpZ2VzdCA9IGJ5dGVzLmZyb21oZXgoaGV4ZGlnZXN0KQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wdXRlZCwgZGlnZXN0KQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGlnZXN0KSwgbS5kaWdlc3Rfc2l6ZSkKKyAgICAgICAgICAgIGlmIG5vdCBzaGFrZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaWdlc3QpLCBtLmRpZ2VzdF9zaXplKQogCiAgICAgZGVmIGNoZWNrX25vX3VuaWNvZGUoc2VsZiwgYWxnb3JpdGhtX25hbWUpOgogICAgICAgICAjIFVuaWNvZGUgb2JqZWN0cyBhcmUgbm90IGFsbG93ZWQgYXMgaW5wdXQuCkBAIC0yMjYsMTMgKzI5OSwzNSBAQAogICAgICAgICBzZWxmLmNoZWNrX25vX3VuaWNvZGUoJ3NoYTM4NCcpCiAgICAgICAgIHNlbGYuY2hlY2tfbm9fdW5pY29kZSgnc2hhNTEyJykKIAotICAgIGRlZiBjaGVja19ibG9ja3NpemVfbmFtZShzZWxmLCBuYW1lLCBibG9ja19zaXplPTAsIGRpZ2VzdF9zaXplPTApOgorICAgIEByZXF1aXJlc19ibGFrZTIKKyAgICBkZWYgdGVzdF9ub191bmljb2RlX2JsYWtlMihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19ub191bmljb2RlKCdibGFrZTJiJykKKyAgICAgICAgc2VsZi5jaGVja19ub191bmljb2RlKCdibGFrZTJzJykKKworICAgIEByZXF1aXJlc19zaGEzCisgICAgZGVmIHRlc3Rfbm9fdW5pY29kZV9zaGEzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX25vX3VuaWNvZGUoJ3NoYTNfMjI0JykKKyAgICAgICAgc2VsZi5jaGVja19ub191bmljb2RlKCdzaGEzXzI1NicpCisgICAgICAgIHNlbGYuY2hlY2tfbm9fdW5pY29kZSgnc2hhM18zODQnKQorICAgICAgICBzZWxmLmNoZWNrX25vX3VuaWNvZGUoJ3NoYTNfNTEyJykKKyAgICAgICAgc2VsZi5jaGVja19ub191bmljb2RlKCdzaGFrZV8xMjgnKQorICAgICAgICBzZWxmLmNoZWNrX25vX3VuaWNvZGUoJ3NoYWtlXzI1NicpCisKKyAgICBkZWYgY2hlY2tfYmxvY2tzaXplX25hbWUoc2VsZiwgbmFtZSwgYmxvY2tfc2l6ZT0wLCBkaWdlc3Rfc2l6ZT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3RfbGVuZ3RoPU5vbmUpOgogICAgICAgICBjb25zdHJ1Y3RvcnMgPSBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0W25hbWVdCiAgICAgICAgIGZvciBoYXNoX29iamVjdF9jb25zdHJ1Y3RvciBpbiBjb25zdHJ1Y3RvcnM6CiAgICAgICAgICAgICBtID0gaGFzaF9vYmplY3RfY29uc3RydWN0b3IoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmJsb2NrX3NpemUsIGJsb2NrX3NpemUpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZGlnZXN0X3NpemUsIGRpZ2VzdF9zaXplKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obS5kaWdlc3QoKSksIGRpZ2VzdF9zaXplKQorICAgICAgICAgICAgaWYgZGlnZXN0X2xlbmd0aDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtLmRpZ2VzdChkaWdlc3RfbGVuZ3RoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3RfbGVuZ3RoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG0uaGV4ZGlnZXN0KGRpZ2VzdF9sZW5ndGgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIqZGlnZXN0X2xlbmd0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obS5kaWdlc3QoKSksIGRpZ2VzdF9zaXplKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG0uaGV4ZGlnZXN0KCkpLCAyKmRpZ2VzdF9zaXplKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLm5hbWUsIG5hbWUpCiAgICAgICAgICAgICAjIHNwbGl0IGZvciBzaGEzXzUxMiAvIF9zaGEzLnNoYTMgb2JqZWN0CiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKG5hbWUuc3BsaXQoIl8iKVswXSwgcmVwcihtKSkKQEAgLTI0NCw2ICszMzksMTcgQEAKICAgICAgICAgc2VsZi5jaGVja19ibG9ja3NpemVfbmFtZSgnc2hhMjU2JywgNjQsIDMyKQogICAgICAgICBzZWxmLmNoZWNrX2Jsb2Nrc2l6ZV9uYW1lKCdzaGEzODQnLCAxMjgsIDQ4KQogICAgICAgICBzZWxmLmNoZWNrX2Jsb2Nrc2l6ZV9uYW1lKCdzaGE1MTInLCAxMjgsIDY0KQorICAgICAgICBzZWxmLmNoZWNrX2Jsb2Nrc2l6ZV9uYW1lKCdzaGEzXzIyNCcsIDE0NCwgMjgpCisgICAgICAgIHNlbGYuY2hlY2tfYmxvY2tzaXplX25hbWUoJ3NoYTNfMjU2JywgMTM2LCAzMikKKyAgICAgICAgc2VsZi5jaGVja19ibG9ja3NpemVfbmFtZSgnc2hhM18zODQnLCAxMDQsIDQ4KQorICAgICAgICBzZWxmLmNoZWNrX2Jsb2Nrc2l6ZV9uYW1lKCdzaGEzXzUxMicsIDcyLCA2NCkKKyAgICAgICAgc2VsZi5jaGVja19ibG9ja3NpemVfbmFtZSgnc2hha2VfMTI4JywgMTY4LCAwLCAzMikKKyAgICAgICAgc2VsZi5jaGVja19ibG9ja3NpemVfbmFtZSgnc2hha2VfMjU2JywgMTM2LCAwLCA2NCkKKworICAgIEByZXF1aXJlc19ibGFrZTIKKyAgICBkZWYgdGVzdF9ibG9ja3NpemVfbmFtZV9ibGFrZTIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfYmxvY2tzaXplX25hbWUoJ2JsYWtlMmInLCAxMjgsIDY0KQorICAgICAgICBzZWxmLmNoZWNrX2Jsb2Nrc2l6ZV9uYW1lKCdibGFrZTJzJywgNjQsIDMyKQogCiAgICAgZGVmIHRlc3RfY2FzZV9tZDVfMChzZWxmKToKICAgICAgICAgc2VsZi5jaGVjaygnbWQ1JywgYicnLCAnZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2UnKQpAQCAtMzczLDYgKzQ3OSwyMjEgQEAKICAgICAgICAgICAiZTcxODQ4M2QwY2U3Njk2NDRlMmU0MmM3YmMxNWI0NjM4ZTFmOThiMTNiMjA0NDI4NTYzMmE4MDNhZmE5NzNlYiIrCiAgICAgICAgICAgImRlMGZmMjQ0ODc3ZWE2MGE0Y2IwNDMyY2U1NzdjMzFiZWIwMDljNWMyYzQ5YWEyZTRlYWRiMjE3YWQ4Y2MwOWIiKQogCisgICAgZGVmIGNoZWNrX2JsYWtlMihzZWxmLCBjb25zdHJ1Y3Rvciwgc2FsdF9zaXplLCBwZXJzb25fc2l6ZSwga2V5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICBkaWdlc3Rfc2l6ZSwgbWF4X29mZnNldCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uc3RydWN0b3IuU0FMVF9TSVpFLCBzYWx0X3NpemUpCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNhbHRfc2l6ZSArIDEpOgorICAgICAgICAgICAgY29uc3RydWN0b3Ioc2FsdD1iJ2EnICogaSkKKyAgICAgICAgc2FsdCA9IGInYScgKiAoc2FsdF9zaXplICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29uc3RydWN0b3IsIHNhbHQ9c2FsdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnN0cnVjdG9yLlBFUlNPTl9TSVpFLCBwZXJzb25fc2l6ZSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGVyc29uX3NpemUrMSk6CisgICAgICAgICAgICBjb25zdHJ1Y3RvcihwZXJzb249YidhJyAqIGkpCisgICAgICAgIHBlcnNvbiA9IGInYScgKiAocGVyc29uX3NpemUgKyAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3RvciwgcGVyc29uPXBlcnNvbikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnN0cnVjdG9yLk1BWF9ESUdFU1RfU0laRSwgZGlnZXN0X3NpemUpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGRpZ2VzdF9zaXplICsgMSk6CisgICAgICAgICAgICBjb25zdHJ1Y3RvcihkaWdlc3Rfc2l6ZT1pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3RvciwgZGlnZXN0X3NpemU9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBkaWdlc3Rfc2l6ZT0wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3RvciwgZGlnZXN0X3NpemU9ZGlnZXN0X3NpemUrMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnN0cnVjdG9yLk1BWF9LRVlfU0laRSwga2V5X3NpemUpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGtleV9zaXplKzEpOgorICAgICAgICAgICAgY29uc3RydWN0b3Ioa2V5PWInYScgKiBpKQorICAgICAgICBrZXkgPSBiJ2EnICogKGtleV9zaXplICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29uc3RydWN0b3IsIGtleT1rZXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uc3RydWN0b3IoKS5oZXhkaWdlc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcihrZXk9YicnKS5oZXhkaWdlc3QoKSkKKworICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCAyNTYpOgorICAgICAgICAgICAgY29uc3RydWN0b3IoZmFub3V0PWkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBmYW5vdXQ9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBmYW5vdXQ9MjU2KQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDI1Nik6CisgICAgICAgICAgICBjb25zdHJ1Y3RvcihkZXB0aD1pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3RvciwgZGVwdGg9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBkZXB0aD0wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3RvciwgZGVwdGg9MjU2KQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIDI1Nik6CisgICAgICAgICAgICBjb25zdHJ1Y3Rvcihub2RlX2RlcHRoPWkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBub2RlX2RlcHRoPS0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3Rvciwgbm9kZV9kZXB0aD0yNTYpCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgZGlnZXN0X3NpemUgKyAxKToKKyAgICAgICAgICAgIGNvbnN0cnVjdG9yKGlubmVyX3NpemU9aSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29uc3RydWN0b3IsIGlubmVyX3NpemU9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBpbm5lcl9zaXplPWRpZ2VzdF9zaXplKzEpCisKKyAgICAgICAgY29uc3RydWN0b3IobGVhZl9zaXplPTApCisgICAgICAgIGNvbnN0cnVjdG9yKGxlYWZfc2l6ZT0oMTw8MzIpLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGNvbnN0cnVjdG9yLCBsZWFmX3NpemU9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGNvbnN0cnVjdG9yLCBsZWFmX3NpemU9MTw8MzIpCisKKyAgICAgICAgY29uc3RydWN0b3Iobm9kZV9vZmZzZXQ9MCkKKyAgICAgICAgY29uc3RydWN0b3Iobm9kZV9vZmZzZXQ9bWF4X29mZnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgY29uc3RydWN0b3IsIG5vZGVfb2Zmc2V0PS0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBjb25zdHJ1Y3Rvciwgbm9kZV9vZmZzZXQ9bWF4X29mZnNldCsxKQorCisgICAgICAgIGNvbnN0cnVjdG9yKAorICAgICAgICAgICAgc3RyaW5nPWInJywKKyAgICAgICAgICAgIGtleT1iJycsCisgICAgICAgICAgICBzYWx0PWInJywKKyAgICAgICAgICAgIHBlcnNvbj1iJycsCisgICAgICAgICAgICBkaWdlc3Rfc2l6ZT0xNywKKyAgICAgICAgICAgIGZhbm91dD0xLAorICAgICAgICAgICAgZGVwdGg9MSwKKyAgICAgICAgICAgIGxlYWZfc2l6ZT0yNTYsCisgICAgICAgICAgICBub2RlX29mZnNldD01MTIsCisgICAgICAgICAgICBub2RlX2RlcHRoPTEsCisgICAgICAgICAgICBpbm5lcl9zaXplPTcsCisgICAgICAgICAgICBsYXN0X25vZGU9VHJ1ZQorICAgICAgICApCisKKyAgICBkZWYgYmxha2UyX3JmYzc2OTMoc2VsZiwgY29uc3RydWN0b3IsIG1kX2xlbiwgaW5fbGVuKToKKyAgICAgICAgZGVmIHNlbGZ0ZXN0X3NlcShsZW5ndGgsIHNlZWQpOgorICAgICAgICAgICAgbWFzayA9ICgxPDwzMiktMQorICAgICAgICAgICAgYSA9ICgweERFQUQ0QkFEICogc2VlZCkgJiBtYXNrCisgICAgICAgICAgICBiID0gMQorICAgICAgICAgICAgb3V0ID0gYnl0ZWFycmF5KGxlbmd0aCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbmd0aCk6CisgICAgICAgICAgICAgICAgdCA9IChhICsgYikgJiBtYXNrCisgICAgICAgICAgICAgICAgYSwgYiA9IGIsIHQKKyAgICAgICAgICAgICAgICBvdXRbaV0gPSAodCA+PiAyNCkgJiAweEZGCisgICAgICAgICAgICByZXR1cm4gb3V0CisgICAgICAgIG91dGVyID0gY29uc3RydWN0b3IoZGlnZXN0X3NpemU9MzIpCisgICAgICAgIGZvciBvdXRsZW4gaW4gbWRfbGVuOgorICAgICAgICAgICAgZm9yIGlubGVuIGluIGluX2xlbjoKKyAgICAgICAgICAgICAgICBpbmRhdGEgPSBzZWxmdGVzdF9zZXEoaW5sZW4sIGlubGVuKQorICAgICAgICAgICAgICAgIGtleSA9IHNlbGZ0ZXN0X3NlcShvdXRsZW4sIG91dGxlbikKKyAgICAgICAgICAgICAgICB1bmtleWVkID0gY29uc3RydWN0b3IoaW5kYXRhLCBkaWdlc3Rfc2l6ZT1vdXRsZW4pCisgICAgICAgICAgICAgICAgb3V0ZXIudXBkYXRlKHVua2V5ZWQuZGlnZXN0KCkpCisgICAgICAgICAgICAgICAga2V5ZWQgPSBjb25zdHJ1Y3RvcihpbmRhdGEsIGtleT1rZXksIGRpZ2VzdF9zaXplPW91dGxlbikKKyAgICAgICAgICAgICAgICBvdXRlci51cGRhdGUoa2V5ZWQuZGlnZXN0KCkpCisgICAgICAgIHJldHVybiBvdXRlci5oZXhkaWdlc3QoKQorCisgICAgQHJlcXVpcmVzX2JsYWtlMgorICAgIGRlZiB0ZXN0X2JsYWtlMmIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfYmxha2UyKGhhc2hsaWIuYmxha2UyYiwgMTYsIDE2LCA2NCwgNjQsICgxPDw2NCktMSkKKyAgICAgICAgYjJiX21kX2xlbiA9IFsyMCwgMzIsIDQ4LCA2NF0KKyAgICAgICAgYjJiX2luX2xlbiA9IFswLCAzLCAxMjgsIDEyOSwgMjU1LCAxMDI0XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5ibGFrZTJfcmZjNzY5MyhoYXNobGliLmJsYWtlMmIsIGIyYl9tZF9sZW4sIGIyYl9pbl9sZW4pLAorICAgICAgICAgICAgImMyM2E3ODAwZDk4MTIzYmQxMGY1MDZjNjFlMjlkYTU2MDNkNzYzYjhiYmFkMmU3MzdmNWU3NjVhN2JjY2Q0NzUiKQorCisgICAgQHJlcXVpcmVzX2JsYWtlMgorICAgIGRlZiB0ZXN0X2Nhc2VfYmxha2UyYl8wKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdibGFrZTJiJywgYiIiLAorICAgICAgICAgICI3ODZhMDJmNzQyMDE1OTAzYzZjNmZkODUyNTUyZDI3MjkxMmY0NzQwZTE1ODQ3NjE4YTg2ZTIxN2Y3MWY1NDE5IisKKyAgICAgICAgICAiZDI1ZTEwMzFhZmVlNTg1MzEzODk2NDQ0OTM0ZWIwNGI5MDNhNjg1YjE0NDhiNzU1ZDU2ZjcwMWFmZTliZTJjZSIpCisKKyAgICBAcmVxdWlyZXNfYmxha2UyCisgICAgZGVmIHRlc3RfY2FzZV9ibGFrZTJiXzEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ2JsYWtlMmInLCBiImFiYyIsCisgICAgICAgICAgImJhODBhNTNmOTgxYzRkMGQ2YTI3OTdiNjlmMTJmNmU5NGMyMTJmMTQ2ODVhYzRiNzRiMTJiYjZmZGJmZmEyZDEiKworICAgICAgICAgICI3ZDg3YzUzOTJhYWI3OTJkYzI1MmQ1ZGU0NTMzY2M5NTE4ZDM4YWE4ZGJmMTkyNWFiOTIzODZlZGQ0MDA5OTIzIikKKworICAgIEByZXF1aXJlc19ibGFrZTIKKyAgICBkZWYgdGVzdF9ibGFrZTJiX3ZlY3RvcnMoc2VsZik6CisgICAgICAgIGZvciBtc2csIGtleSwgbWQgaW4gcmVhZF92ZWN0b3JzKCdibGFrZTJiJyk6CisgICAgICAgICAgICBrZXkgPSBieXRlcy5mcm9taGV4KGtleSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2soJ2JsYWtlMmInLCBtc2csIG1kLCBrZXk9a2V5KQorCisgICAgQHJlcXVpcmVzX2JsYWtlMgorICAgIGRlZiB0ZXN0X2JsYWtlMnMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfYmxha2UyKGhhc2hsaWIuYmxha2UycywgOCwgOCwgMzIsIDMyLCAoMTw8NDgpLTEpCisgICAgICAgIGIyc19tZF9sZW4gPSBbMTYsIDIwLCAyOCwgMzJdCisgICAgICAgIGIyc19pbl9sZW4gPSBbMCwgMywgNjQsIDY1LCAyNTUsIDEwMjRdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLmJsYWtlMl9yZmM3NjkzKGhhc2hsaWIuYmxha2UycywgYjJzX21kX2xlbiwgYjJzX2luX2xlbiksCisgICAgICAgICAgICAiNmE0MTFmMDhjZTI1YWRjZGZiMDJhYmE2NDE0NTFjZWM1M2M1OThiMjRmNGZjNzg3ZmJkYzg4Nzk3ZjRjMWRmZSIpCisKKyAgICBAcmVxdWlyZXNfYmxha2UyCisgICAgZGVmIHRlc3RfY2FzZV9ibGFrZTJzXzAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ2JsYWtlMnMnLCBiIiIsCisgICAgICAgICAgIjY5MjE3YTMwNzk5MDgwOTRlMTExMjFkMDQyMzU0YTdjMWY1NWI2NDgyY2ExYTUxZTFiMjUwZGZkMWVkMGVlZjkiKQorCisgICAgQHJlcXVpcmVzX2JsYWtlMgorICAgIGRlZiB0ZXN0X2Nhc2VfYmxha2Uyc18xKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdibGFrZTJzJywgYiJhYmMiLAorICAgICAgICAgICI1MDhjNWU4YzMyN2MxNGUyZTFhNzJiYTM0ZWViNDUyZjM3NDU4YjIwOWVkNjNhMjk0ZDk5OWI0Yzg2Njc1OTgyIikKKworICAgIEByZXF1aXJlc19ibGFrZTIKKyAgICBkZWYgdGVzdF9ibGFrZTJzX3ZlY3RvcnMoc2VsZik6CisgICAgICAgIGZvciBtc2csIGtleSwgbWQgaW4gcmVhZF92ZWN0b3JzKCdibGFrZTJzJyk6CisgICAgICAgICAgICBrZXkgPSBieXRlcy5mcm9taGV4KGtleSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2soJ2JsYWtlMnMnLCBtc2csIG1kLCBrZXk9a2V5KQorCisgICAgQHJlcXVpcmVzX3NoYTMKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTNfMjI0XzAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTNfMjI0JywgYiIiLAorICAgICAgICAgICI2YjRlMDM0MjM2NjdkYmI3M2I2ZTE1NDU0ZjBlYjFhYmQ0NTk3ZjlhMWIwNzhlM2Y1YjVhNmJjNyIpCisKKyAgICBAcmVxdWlyZXNfc2hhMworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhM18yMjRfdmVjdG9yKHNlbGYpOgorICAgICAgICBmb3IgbXNnLCBtZCBpbiByZWFkX3ZlY3RvcnMoJ3NoYTNfMjI0Jyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrKCdzaGEzXzIyNCcsIG1zZywgbWQpCisKKyAgICBAcmVxdWlyZXNfc2hhMworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhM18yNTZfMChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhM18yNTYnLCBiIiIsCisgICAgICAgICAgImE3ZmZjNmY4YmYxZWQ3NjY1MWMxNDc1NmEwNjFkNjYyZjU4MGZmNGRlNDNiNDlmYTgyZDgwYTRiODBmODQzNGEiKQorCisgICAgQHJlcXVpcmVzX3NoYTMKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTNfMjU2X3ZlY3RvcihzZWxmKToKKyAgICAgICAgZm9yIG1zZywgbWQgaW4gcmVhZF92ZWN0b3JzKCdzaGEzXzI1NicpOgorICAgICAgICAgICAgc2VsZi5jaGVjaygnc2hhM18yNTYnLCBtc2csIG1kKQorCisgICAgQHJlcXVpcmVzX3NoYTMKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTNfMzg0XzAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTNfMzg0JywgYiIiLAorICAgICAgICAgICIwYzYzYTc1Yjg0NWU0ZjdkMDExMDdkODUyZTRjMjQ4NWM1MWE1MGFhYWE5NGZjNjE5OTVlNzFiYmVlOTgzYTJhIisKKyAgICAgICAgICAiYzM3MTM4MzEyNjRhZGI0N2ZiNmJkMWUwNThkNWYwMDQiKQorCisgICAgQHJlcXVpcmVzX3NoYTMKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTNfMzg0X3ZlY3RvcihzZWxmKToKKyAgICAgICAgZm9yIG1zZywgbWQgaW4gcmVhZF92ZWN0b3JzKCdzaGEzXzM4NCcpOgorICAgICAgICAgICAgc2VsZi5jaGVjaygnc2hhM18zODQnLCBtc2csIG1kKQorCisgICAgQHJlcXVpcmVzX3NoYTMKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTNfNTEyXzAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTNfNTEyJywgYiIiLAorICAgICAgICAgICJhNjlmNzNjY2EyM2E5YWM1YzhiNTY3ZGMxODVhNzU2ZTk3Yzk4MjE2NGZlMjU4NTllMGQxZGNjMTQ3NWM4MGE2IisKKyAgICAgICAgICAiMTViMjEyM2FmMWY1Zjk0YzExZTNlOTQwMmMzYWM1NThmNTAwMTk5ZDk1YjZkM2UzMDE3NTg1ODYyODFkY2QyNiIpCisKKyAgICBAcmVxdWlyZXNfc2hhMworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhM181MTJfdmVjdG9yKHNlbGYpOgorICAgICAgICBmb3IgbXNnLCBtZCBpbiByZWFkX3ZlY3RvcnMoJ3NoYTNfNTEyJyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrKCdzaGEzXzUxMicsIG1zZywgbWQpCisKKyAgICBAcmVxdWlyZXNfc2hhMworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hha2VfMTI4XzAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYWtlXzEyOCcsIGIiIiwKKyAgICAgICAgICAiN2Y5YzJiYTRlODhmODI3ZDYxNjA0NTUwNzYwNTg1M2VkNzNiODA5M2Y2ZWZiYzg4ZWIxYTZlYWNmYTY2ZWYyNiIsCisgICAgICAgICAgVHJ1ZSkKKyAgICAgICAgc2VsZi5jaGVjaygnc2hha2VfMTI4JywgYiIiLCAiN2Y5YyIsIFRydWUpCisKKyAgICBAcmVxdWlyZXNfc2hhMworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hha2UxMjhfdmVjdG9yKHNlbGYpOgorICAgICAgICBmb3IgbXNnLCBtZCBpbiByZWFkX3ZlY3RvcnMoJ3NoYWtlXzEyOCcpOgorICAgICAgICAgICAgc2VsZi5jaGVjaygnc2hha2VfMTI4JywgbXNnLCBtZCwgVHJ1ZSkKKworICAgIEByZXF1aXJlc19zaGEzCisgICAgZGVmIHRlc3RfY2FzZV9zaGFrZV8yNTZfMChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hha2VfMjU2JywgYiIiLAorICAgICAgICAgICI0NmI5ZGQyYjBiYTg4ZDEzMjMzYjNmZWI3NDNlZWIyNDNmY2Q1MmVhNjJiODFiODJiNTBjMjc2NDZlZDU3NjJmIiwKKyAgICAgICAgICBUcnVlKQorICAgICAgICBzZWxmLmNoZWNrKCdzaGFrZV8yNTYnLCBiIiIsICI0NmI5IiwgVHJ1ZSkKKworICAgIEByZXF1aXJlc19zaGEzCisgICAgZGVmIHRlc3RfY2FzZV9zaGFrZTI1Nl92ZWN0b3Ioc2VsZik6CisgICAgICAgIGZvciBtc2csIG1kIGluIHJlYWRfdmVjdG9ycygnc2hha2VfMjU2Jyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrKCdzaGFrZV8yNTYnLCBtc2csIG1kLCBUcnVlKQorCiAgICAgZGVmIHRlc3RfZ2lsKHNlbGYpOgogICAgICAgICAjIENoZWNrIHRoaW5ncyB3b3JrIGZpbmUgd2l0aCBhbiBpbnB1dCBsYXJnZXIgdGhhbiB0aGUgc2l6ZSByZXF1aXJlZAogICAgICAgICAjIGZvciBtdWx0aXRocmVhZGVkIG9wZXJhdGlvbiAod2hpY2ggaXMgaGFyZHdpcmVkIHRvIDIwNDgpLgpAQCAtNDQ3LDYgKzc2OCwxMiBAQAogICAgICAgICAoYidwYXNzXDB3b3JkJywgYidzYVwwbHQnLCA0MDk2LCAxNiksCiAgICAgXQogCisgICAgc2NyeXB0X3Rlc3RfdmVjdG9ycyA9IFsKKyAgICAgICAgKGInJywgYicnLCAxNiwgMSwgMSwgdW5oZXhsaWZ5KCc3N2Q2NTc2MjM4NjU3YjIwM2IxOWNhNDJjMThhMDQ5N2YxNmI0ODQ0ZTMwNzRhZThkZmRmZmEzZmVkZTIxNDQyZmNkMDA2OWRlZDA5NDhmODMyNmE3NTNhMGZjODFmMTdlOGQzZTBmYjJlMGQzNjI4Y2YzNWUyMGMzOGQxODkwNicpKSwKKyAgICAgICAgKGIncGFzc3dvcmQnLCBiJ05hQ2wnLCAxMDI0LCA4LCAxNiwgdW5oZXhsaWZ5KCdmZGJhYmUxYzlkMzQ3MjAwNzg1NmU3MTkwZDAxZTlmZTdjNmFkN2NiYzgyMzc4MzBlNzczNzY2MzRiMzczMTYyMmVhZjMwZDkyZTIyYTM4ODZmZjEwOTI3OWQ5ODMwZGFjNzI3YWZiOTRhODNlZTZkODM2MGNiZGZhMmNjMDY0MCcpKSwKKyAgICAgICAgKGIncGxlYXNlbGV0bWVpbicsIGInU29kaXVtQ2hsb3JpZGUnLCAxNjM4NCwgOCwgMSwgdW5oZXhsaWZ5KCc3MDIzYmRjYjNhZmQ3MzQ4NDYxYzA2Y2Q4MWZkMzhlYmZkYThmYmJhOTA0ZjhlM2VhOWI1NDNmNjU0NWRhMWYyZDU0MzI5NTU2MTNmMGZjZjYyZDQ5NzA1MjQyYTlhZjllNjFlODVkYzBkNjUxZTQwZGZjZjAxN2I0NTU3NTg4NycpKSwKKyAgIF0KKwogICAgIHBia2RmMl9yZXN1bHRzID0gewogICAgICAgICAic2hhMSI6IFsKICAgICAgICAgICAgICMgb2ZmaWNpYWwgdGVzdCB2ZWN0b3JzIGZyb20gUkZDIDYwNzAKQEAgLTUyNiw1ICs4NTMsNDUgQEAKICAgICAgICAgc2VsZi5fdGVzdF9wYmtkZjJfaG1hYyhjX2hhc2hsaWIucGJrZGYyX2htYWMpCiAKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoY19oYXNobGliLCAnc2NyeXB0JyksCisgICAgICAgICAgICAgICAgICAgICAnICAgdGVzdCByZXF1aXJlcyBPcGVuU1NMID4gMS4xJykKKyAgICBkZWYgdGVzdF9zY3J5cHQoc2VsZik6CisgICAgICAgIGZvciBwYXNzd29yZCwgc2FsdCwgbiwgciwgcCwgZXhwZWN0ZWQgaW4gc2VsZi5zY3J5cHRfdGVzdF92ZWN0b3JzOgorICAgICAgICAgICAgcmVzdWx0ID0gaGFzaGxpYi5zY3J5cHQocGFzc3dvcmQsIHNhbHQ9c2FsdCwgbj1uLCByPXIsIHA9cCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKworICAgICAgICAjIHRoaXMgdmFsdWVzIHNob3VsZCB3b3JrCisgICAgICAgIGhhc2hsaWIuc2NyeXB0KGIncGFzc3dvcmQnLCBzYWx0PWInc2FsdCcsIG49Miwgcj04LCBwPTEpCisgICAgICAgICMgcGFzc3dvcmQgYW5kIHNhbHQgbXVzdCBiZSBieXRlcy1saWtlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGhhc2hsaWIuc2NyeXB0KCdwYXNzd29yZCcsIHNhbHQ9YidzYWx0Jywgbj0yLCByPTgsIHA9MSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgaGFzaGxpYi5zY3J5cHQoYidwYXNzd29yZCcsIHNhbHQ9J3NhbHQnLCBuPTIsIHI9OCwgcD0xKQorICAgICAgICAjIHJlcXVpcmUga2V5d29yZCBhcmdzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGhhc2hsaWIuc2NyeXB0KGIncGFzc3dvcmQnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBoYXNobGliLnNjcnlwdChiJ3Bhc3N3b3JkJywgYidzYWx0JykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgaGFzaGxpYi5zY3J5cHQoYidwYXNzd29yZCcsIDIsIDgsIDEsIHNhbHQ9YidzYWx0JykKKyAgICAgICAgZm9yIG4gaW4gWy0xLCAwLCAxLCBOb25lXToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IsIFR5cGVFcnJvcikpOgorICAgICAgICAgICAgICAgIGhhc2hsaWIuc2NyeXB0KGIncGFzc3dvcmQnLCBzYWx0PWInc2FsdCcsIG49biwgcj04LCBwPTEpCisgICAgICAgIGZvciByIGluIFstMSwgMCwgTm9uZV06CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yLCBUeXBlRXJyb3IpKToKKyAgICAgICAgICAgICAgICBoYXNobGliLnNjcnlwdChiJ3Bhc3N3b3JkJywgc2FsdD1iJ3NhbHQnLCBuPTIsIHI9ciwgcD0xKQorICAgICAgICBmb3IgcCBpbiBbLTEsIDAsIE5vbmVdOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcygoVmFsdWVFcnJvciwgT3ZlcmZsb3dFcnJvciwgVHlwZUVycm9yKSk6CisgICAgICAgICAgICAgICAgaGFzaGxpYi5zY3J5cHQoYidwYXNzd29yZCcsIHNhbHQ9YidzYWx0Jywgbj0yLCByPTgsIHA9cCkKKyAgICAgICAgZm9yIG1heG1lbSBpbiBbLTEsIE5vbmVdOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcygoVmFsdWVFcnJvciwgT3ZlcmZsb3dFcnJvciwgVHlwZUVycm9yKSk6CisgICAgICAgICAgICAgICAgaGFzaGxpYi5zY3J5cHQoYidwYXNzd29yZCcsIHNhbHQ9YidzYWx0Jywgbj0yLCByPTgsIHA9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhtZW09bWF4bWVtKQorICAgICAgICBmb3IgZGtsZW4gaW4gWy0xLCBOb25lXToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IsIFR5cGVFcnJvcikpOgorICAgICAgICAgICAgICAgIGhhc2hsaWIuc2NyeXB0KGIncGFzc3dvcmQnLCBzYWx0PWInc2FsdCcsIG49Miwgcj04LCBwPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGtsZW49ZGtsZW4pCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkgYi9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CmluZGV4IGI3ZTgyNTkuLjJmOGM2NDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQpAQCAtMSw2ICsxLDUgQEAKICIiIlVuaXR0ZXN0cyBmb3IgaGVhcHEuIiIiCiAKLWltcG9ydCBzeXMKIGltcG9ydCByYW5kb20KIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2htYWMucHkgYi9MaWIvdGVzdC90ZXN0X2htYWMucHkKaW5kZXggOTg4MjZiNS4uMDY3ZTEzZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9obWFjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaG1hYy5weQpAQCAtMyw3ICszLDYgQEAKIGltcG9ydCBoYXNobGliCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncwotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAogZGVmIGlnbm9yZV93YXJuaW5nKGZ1bmMpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9odG1scGFyc2VyLnB5IGIvTGliL3Rlc3QvdGVzdF9odG1scGFyc2VyLnB5CmluZGV4IDExNDIwYjIuLjMyNmUzNDIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHkKQEAgLTMsNyArMyw2IEBACiBpbXBvcnQgaHRtbC5wYXJzZXIKIGltcG9ydCBwcHJpbnQKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAogY2xhc3MgRXZlbnRDb2xsZWN0b3IoaHRtbC5wYXJzZXIuSFRNTFBhcnNlcik6CkBAIC03MDIsNyArNzAxLDcgQEAKIAogICAgIGRlZiB0ZXN0X2F0dHJfZnVua3lfbmFtZXMyKHNlbGYpOgogICAgICAgICBzZWxmLl9ydW5fY2hlY2soCi0gICAgICAgICAgICAiPGEgJD48YiAkPSU+PGMgXD0vPiIsCisgICAgICAgICAgICByIjxhICQ+PGIgJD0lPjxjIFw9Lz4iLAogICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoIiQiLCBOb25lKV0pLAogICAgICAgICAgICAgICgic3RhcnR0YWciLCAiYiIsIFsoIiQiLCAiJSIpXSksCiAgICAgICAgICAgICAgKCJzdGFydHRhZyIsICJjIiwgWygiXFwiLCAiLyIpXSldKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9odHRwX2Nvb2tpZWphci5weSBiL0xpYi90ZXN0L3Rlc3RfaHR0cF9jb29raWVqYXIucHkKaW5kZXggNDljMDFhZS4uNmZlZTRkZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odHRwX2Nvb2tpZWphci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2h0dHBfY29va2llamFyLnB5CkBAIC0xMDUxLDcgKzEwNTEsNyBAQAogICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MTsgUG9ydCIpCiAgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRSZWdleChoLCAiXCRQb3J0KFtePV18JCkiLAorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KGgsIHIiXCRQb3J0KFtePV18JCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IHdpdGggbm8gdmFsdWUgbm90IHJldHVybmVkIHdpdGggbm8gdmFsdWUiKQogCiAgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQpAQCAtMTM5Niw5ICsxMzk2LDkgQEAKIAogICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KGNvb2tpZSwgcideXCRWZXJzaW9uPSI/MSI/OycpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgoY29va2llLCByJ1BhcnRfTnVtYmVyPSI/Um9ja2V0X0xhdW5jaGVyXzAwMDEiPzsnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xzKlwkUGF0aD0iXC9hY21lIicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1xzKlwkUGF0aD0iXC9hY21lIicpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgoY29va2llLCByJ0N1c3RvbWVyPSI/V0lMRV9FX0NPWU9URSI/OycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHMqXCRQYXRoPSJcL2FjbWUiJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInXHMqXCRQYXRoPSJcL2FjbWUiJykKIAogICAgICAgICAjCiAgICAgICAgICMgICA3LiAgVXNlciBBZ2VudCAtPiBTZXJ2ZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weQppbmRleCAxNTVhYjBmLi4zZmMwMmVhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9odHRwbGliLnB5CkBAIC0zNDQsNiArMzQ0LDEzNCBAQAogICAgICAgICAgICAgICAgICAgICBjb25uLnB1dGhlYWRlcihuYW1lLCB2YWx1ZSkKIAogCitjbGFzcyBUcmFuc2ZlckVuY29kaW5nVGVzdChUZXN0Q2FzZSk6CisgICAgZXhwZWN0ZWRfYm9keSA9IGIiSXQncyBqdXN0IGEgZmxlc2ggd291bmQiCisKKyAgICBkZWYgdGVzdF9lbmRoZWFkZXJzX2NodW5rZWQoc2VsZik6CisgICAgICAgIGNvbm4gPSBjbGllbnQuSFRUUENvbm5lY3Rpb24oJ2V4YW1wbGUuY29tJykKKyAgICAgICAgY29ubi5zb2NrID0gRmFrZVNvY2tldChiJycpCisgICAgICAgIGNvbm4ucHV0cmVxdWVzdCgnUE9TVCcsICcvJykKKyAgICAgICAgY29ubi5lbmRoZWFkZXJzKHNlbGYuX21ha2VfYm9keSgpLCBlbmNvZGVfY2h1bmtlZD1UcnVlKQorCisgICAgICAgIF8sIF8sIGJvZHkgPSBzZWxmLl9wYXJzZV9yZXF1ZXN0KGNvbm4uc29jay5kYXRhKQorICAgICAgICBib2R5ID0gc2VsZi5fcGFyc2VfY2h1bmtlZChib2R5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvZHksIHNlbGYuZXhwZWN0ZWRfYm9keSkKKworICAgIGRlZiB0ZXN0X2V4cGxpY2l0X2hlYWRlcnMoc2VsZik6CisgICAgICAgICMgZXhwbGljaXQgY2h1bmtlZAorICAgICAgICBjb25uID0gY2xpZW50LkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgIGNvbm4uc29jayA9IEZha2VTb2NrZXQoYicnKQorICAgICAgICAjIHRoaXMgc2hvdWxkbid0IGFjdHVhbGx5IGJlIGF1dG9tYXRpY2FsbHkgY2h1bmstZW5jb2RlZCBiZWNhdXNlIHRoZQorICAgICAgICAjIGNhbGxpbmcgY29kZSBoYXMgZXhwbGljaXRseSBzdGF0ZWQgdGhhdCBpdCdzIHRha2luZyBjYXJlIG9mIGl0CisgICAgICAgIGNvbm4ucmVxdWVzdCgKKyAgICAgICAgICAgICdQT1NUJywgJy8nLCBzZWxmLl9tYWtlX2JvZHkoKSwgeydUcmFuc2Zlci1FbmNvZGluZyc6ICdjaHVua2VkJ30pCisKKyAgICAgICAgXywgaGVhZGVycywgYm9keSA9IHNlbGYuX3BhcnNlX3JlcXVlc3QoY29ubi5zb2NrLmRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2NvbnRlbnQtbGVuZ3RoJywgW2subG93ZXIoKSBmb3IgayBpbiBoZWFkZXJzLmtleXMoKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGVhZGVyc1snVHJhbnNmZXItRW5jb2RpbmcnXSwgJ2NodW5rZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvZHksIHNlbGYuZXhwZWN0ZWRfYm9keSkKKworICAgICAgICAjIGV4cGxpY2l0IGNodW5rZWQsIHN0cmluZyBib2R5CisgICAgICAgIGNvbm4gPSBjbGllbnQuSFRUUENvbm5lY3Rpb24oJ2V4YW1wbGUuY29tJykKKyAgICAgICAgY29ubi5zb2NrID0gRmFrZVNvY2tldChiJycpCisgICAgICAgIGNvbm4ucmVxdWVzdCgKKyAgICAgICAgICAgICdQT1NUJywgJy8nLCBzZWxmLmV4cGVjdGVkX2JvZHkuZGVjb2RlKCdsYXRpbi0xJyksCisgICAgICAgICAgICB7J1RyYW5zZmVyLUVuY29kaW5nJzogJ2NodW5rZWQnfSkKKworICAgICAgICBfLCBoZWFkZXJzLCBib2R5ID0gc2VsZi5fcGFyc2VfcmVxdWVzdChjb25uLnNvY2suZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignY29udGVudC1sZW5ndGgnLCBbay5sb3dlcigpIGZvciBrIGluIGhlYWRlcnMua2V5cygpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFkZXJzWydUcmFuc2Zlci1FbmNvZGluZyddLCAnY2h1bmtlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9keSwgc2VsZi5leHBlY3RlZF9ib2R5KQorCisgICAgICAgICMgVXNlci1zcGVjaWZpZWQgVEUsIGJ1dCByZXF1ZXN0KCkgZG9lcyB0aGUgY2h1bmsgZW5jb2RpbmcKKyAgICAgICAgY29ubiA9IGNsaWVudC5IVFRQQ29ubmVjdGlvbignZXhhbXBsZS5jb20nKQorICAgICAgICBjb25uLnNvY2sgPSBGYWtlU29ja2V0KGInJykKKyAgICAgICAgY29ubi5yZXF1ZXN0KCdQT1NUJywgJy8nLAorICAgICAgICAgICAgaGVhZGVycz17J1RyYW5zZmVyLUVuY29kaW5nJzogJ2d6aXAsIGNodW5rZWQnfSwKKyAgICAgICAgICAgIGVuY29kZV9jaHVua2VkPVRydWUsCisgICAgICAgICAgICBib2R5PXNlbGYuX21ha2VfYm9keSgpKQorICAgICAgICBfLCBoZWFkZXJzLCBib2R5ID0gc2VsZi5fcGFyc2VfcmVxdWVzdChjb25uLnNvY2suZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignY29udGVudC1sZW5ndGgnLCBbay5sb3dlcigpIGZvciBrIGluIGhlYWRlcnNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYWRlcnNbJ1RyYW5zZmVyLUVuY29kaW5nJ10sICdnemlwLCBjaHVua2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9wYXJzZV9jaHVua2VkKGJvZHkpLCBzZWxmLmV4cGVjdGVkX2JvZHkpCisKKyAgICBkZWYgdGVzdF9yZXF1ZXN0KHNlbGYpOgorICAgICAgICBmb3IgZW1wdHlfbGluZXMgaW4gKEZhbHNlLCBUcnVlLCk6CisgICAgICAgICAgICBjb25uID0gY2xpZW50LkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgICAgICBjb25uLnNvY2sgPSBGYWtlU29ja2V0KGInJykKKyAgICAgICAgICAgIGNvbm4ucmVxdWVzdCgKKyAgICAgICAgICAgICAgICAnUE9TVCcsICcvJywgc2VsZi5fbWFrZV9ib2R5KGVtcHR5X2xpbmVzPWVtcHR5X2xpbmVzKSkKKworICAgICAgICAgICAgXywgaGVhZGVycywgYm9keSA9IHNlbGYuX3BhcnNlX3JlcXVlc3QoY29ubi5zb2NrLmRhdGEpCisgICAgICAgICAgICBib2R5ID0gc2VsZi5fcGFyc2VfY2h1bmtlZChib2R5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib2R5LCBzZWxmLmV4cGVjdGVkX2JvZHkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYWRlcnNbJ1RyYW5zZmVyLUVuY29kaW5nJ10sICdjaHVua2VkJykKKworICAgICAgICAgICAgIyBDb250ZW50LUxlbmd0aCBhbmQgVHJhbnNmZXItRW5jb2RpbmcgU0hPVUxEIG5vdCBiZSBzZW50IGluIHRoZQorICAgICAgICAgICAgIyBzYW1lIHJlcXVlc3QKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2NvbnRlbnQtbGVuZ3RoJywgW2subG93ZXIoKSBmb3IgayBpbiBoZWFkZXJzXSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2JvZHkoc2VsZik6CisgICAgICAgICMgWmVyby1sZW5ndGggaXRlcmFibGUgc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSBhbnkgb3RoZXIgaXRlcmFibGUKKyAgICAgICAgY29ubiA9IGNsaWVudC5IVFRQQ29ubmVjdGlvbignZXhhbXBsZS5jb20nKQorICAgICAgICBjb25uLnNvY2sgPSBGYWtlU29ja2V0KGInJykKKyAgICAgICAgY29ubi5yZXF1ZXN0KCdQT1NUJywgJy8nLCAoKSkKKyAgICAgICAgXywgaGVhZGVycywgYm9keSA9IHNlbGYuX3BhcnNlX3JlcXVlc3QoY29ubi5zb2NrLmRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGVhZGVyc1snVHJhbnNmZXItRW5jb2RpbmcnXSwgJ2NodW5rZWQnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdjb250ZW50LWxlbmd0aCcsIFtrLmxvd2VyKCkgZm9yIGsgaW4gaGVhZGVyc10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9keSwgYiIwXHJcblxyXG4iKQorCisgICAgZGVmIF9tYWtlX2JvZHkoc2VsZiwgZW1wdHlfbGluZXM9RmFsc2UpOgorICAgICAgICBsaW5lcyA9IHNlbGYuZXhwZWN0ZWRfYm9keS5zcGxpdChiJyAnKQorICAgICAgICBmb3IgaWR4LCBsaW5lIGluIGVudW1lcmF0ZShsaW5lcyk6CisgICAgICAgICAgICAjIGZvciB0ZXN0aW5nIGhhbmRsaW5nIGVtcHR5IGxpbmVzCisgICAgICAgICAgICBpZiBlbXB0eV9saW5lcyBhbmQgaWR4ICUgMjoKKyAgICAgICAgICAgICAgICB5aWVsZCBiJycKKyAgICAgICAgICAgIGlmIGlkeCA8IGxlbihsaW5lcykgLSAxOgorICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUgKyBiJyAnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKKworICAgIGRlZiBfcGFyc2VfcmVxdWVzdChzZWxmLCBkYXRhKToKKyAgICAgICAgbGluZXMgPSBkYXRhLnNwbGl0KGInXHJcbicpCisgICAgICAgIHJlcXVlc3QgPSBsaW5lc1swXQorICAgICAgICBoZWFkZXJzID0ge30KKyAgICAgICAgbiA9IDEKKyAgICAgICAgd2hpbGUgbiA8IGxlbihsaW5lcykgYW5kIGxlbihsaW5lc1tuXSkgPiAwOgorICAgICAgICAgICAga2V5LCB2YWwgPSBsaW5lc1tuXS5zcGxpdChiJzonKQorICAgICAgICAgICAga2V5ID0ga2V5LmRlY29kZSgnbGF0aW4tMScpLnN0cmlwKCkKKyAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbC5kZWNvZGUoJ2xhdGluLTEnKS5zdHJpcCgpCisgICAgICAgICAgICBuICs9IDEKKworICAgICAgICByZXR1cm4gcmVxdWVzdCwgaGVhZGVycywgYidcclxuJy5qb2luKGxpbmVzW24gKyAxOl0pCisKKyAgICBkZWYgX3BhcnNlX2NodW5rZWQoc2VsZiwgZGF0YSk6CisgICAgICAgIGJvZHkgPSBbXQorICAgICAgICB0cmFpbGVycyA9IHt9CisgICAgICAgIG4gPSAwCisgICAgICAgIGxpbmVzID0gZGF0YS5zcGxpdChiJ1xyXG4nKQorICAgICAgICAjIHBhcnNlIGJvZHkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNpemUsIGNodW5rID0gbGluZXNbbjpuKzJdCisgICAgICAgICAgICBzaXplID0gaW50KHNpemUsIDE2KQorCisgICAgICAgICAgICBpZiBzaXplID09IDA6CisgICAgICAgICAgICAgICAgbiArPSAxCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplLCBsZW4oY2h1bmspKQorICAgICAgICAgICAgYm9keS5hcHBlbmQoY2h1bmspCisKKyAgICAgICAgICAgIG4gKz0gMgorICAgICAgICAgICAgIyB3ZSAvc2hvdWxkLyBoaXQgdGhlIGVuZCBjaHVuaywgYnV0IGNoZWNrIGFnYWluc3QgdGhlIHNpemUgb2YKKyAgICAgICAgICAgICMgbGluZXMgc28gd2UncmUgbm90IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3Agc2hvdWxkIHdlIGdldAorICAgICAgICAgICAgIyBtYWxmb3JtZWQgZGF0YQorICAgICAgICAgICAgaWYgbiA+IGxlbihsaW5lcyk6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICByZXR1cm4gYicnLmpvaW4oYm9keSkKKworCiBjbGFzcyBCYXNpY1Rlc3QoVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3N0YXR1c19saW5lcyhzZWxmKToKICAgICAgICAgIyBUZXN0IEhUVFAgc3RhdHVzIGxpbmVzCkBAIC01NjQsNyArNjkyLDkgQEAKIAogICAgIGRlZiB0ZXN0X3NlbmRfZmlsZShzZWxmKToKICAgICAgICAgZXhwZWN0ZWQgPSAoYidHRVQgL2ZvbyBIVFRQLzEuMVxyXG5Ib3N0OiBleGFtcGxlLmNvbVxyXG4nCi0gICAgICAgICAgICAgICAgICAgIGInQWNjZXB0LUVuY29kaW5nOiBpZGVudGl0eVxyXG5Db250ZW50LUxlbmd0aDonKQorICAgICAgICAgICAgICAgICAgICBiJ0FjY2VwdC1FbmNvZGluZzogaWRlbnRpdHlcclxuJworICAgICAgICAgICAgICAgICAgICBiJ1RyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXHJcbicKKyAgICAgICAgICAgICAgICAgICAgYidcclxuJykKIAogICAgICAgICB3aXRoIG9wZW4oX19maWxlX18sICdyYicpIGFzIGJvZHk6CiAgICAgICAgICAgICBjb25uID0gY2xpZW50LkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCkBAIC01OTQsMTEgKzcyNCwxMSBAQAogICAgICAgICAgICAgeWllbGQgTm9uZQogICAgICAgICAgICAgeWllbGQgJ2RhdGFfdHdvJwogCi0gICAgICAgIGNsYXNzIFVwZGF0aW5nRmlsZSgpOgorICAgICAgICBjbGFzcyBVcGRhdGluZ0ZpbGUoaW8uVGV4dElPQmFzZSk6CiAgICAgICAgICAgICBtb2RlID0gJ3InCiAgICAgICAgICAgICBkID0gZGF0YSgpCiAgICAgICAgICAgICBkZWYgcmVhZChzZWxmLCBibG9ja3NpemU9LTEpOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmQuX19uZXh0X18oKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KHNlbGYuZCkKIAogICAgICAgICBleHBlY3RlZCA9IGInZGF0YScKIApAQCAtOTcwLDYgKzExMDAsNyBAQAogCiAgICAgICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1bl9zZXJ2ZXIpCiAgICAgICAgIHRocmVhZC5zdGFydCgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0aHJlYWQuam9pbiwgZmxvYXQoMSkpCiAgICAgICAgIGNvbm4gPSBjbGllbnQuSFRUUENvbm5lY3Rpb24oKnNlcnYuZ2V0c29ja25hbWUoKSkKICAgICAgICAgY29ubi5yZXF1ZXN0KCJDT05ORUNUIiwgImR1bW15OjEyMzQiKQogICAgICAgICByZXNwb25zZSA9IGNvbm4uZ2V0cmVzcG9uc2UoKQpAQCAtOTgzLDcgKzExMTQsNyBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgcmVzcG9uc2UuY2xvc2UoKQogICAgICAgICAgICAgY29ubi5jbG9zZSgpCi0gICAgICAgICAgICB0aHJlYWQuam9pbigpCisgICAgICAgIHRocmVhZC5qb2luKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGIicHJveGllZCBkYXRhXG4iKQogCiBjbGFzcyBFeHRlbmRlZFJlYWRUZXN0KFRlc3RDYXNlKToKQEAgLTE1NzUsNiArMTcwNiwyNiBAQAogICAgICAgICBtZXNzYWdlID0gY2xpZW50LnBhcnNlX2hlYWRlcnMoZikKICAgICAgICAgcmV0dXJuIG1lc3NhZ2UsIGYKIAorICAgIGRlZiB0ZXN0X2xpc3RfYm9keShzZWxmKToKKyAgICAgICAgIyBOb3RlIHRoYXQgbm8gY29udGVudC1sZW5ndGggaXMgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZvcgorICAgICAgICAjIGFuIGl0ZXJhYmxlLiAgVGhlIHJlcXVlc3Qgd2lsbCBmYWxsIGJhY2sgdG8gc2VuZCBjaHVua2VkCisgICAgICAgICMgdHJhbnNmZXIgZW5jb2RpbmcuCisgICAgICAgIGNhc2VzID0gKAorICAgICAgICAgICAgKFtiJ2ZvbycsIGInYmFyJ10sIGInM1xyXG5mb29cclxuM1xyXG5iYXJcclxuMFxyXG5cclxuJyksCisgICAgICAgICAgICAoKGInZm9vJywgYidiYXInKSwgYiczXHJcbmZvb1xyXG4zXHJcbmJhclxyXG4wXHJcblxyXG4nKSwKKyAgICAgICAgKQorICAgICAgICBmb3IgYm9keSwgZXhwZWN0ZWQgaW4gY2FzZXM6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChib2R5KToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbm4gPSBjbGllbnQuSFRUUENvbm5lY3Rpb24oJ2V4YW1wbGUuY29tJykKKyAgICAgICAgICAgICAgICBzZWxmLmNvbm4uc29jayA9IHNlbGYuc29jayA9IEZha2VTb2NrZXQoJycpCisKKyAgICAgICAgICAgICAgICBzZWxmLmNvbm4ucmVxdWVzdCgnUFVUJywgJy91cmwnLCBib2R5KQorICAgICAgICAgICAgICAgIG1zZywgZiA9IHNlbGYuZ2V0X2hlYWRlcnNfYW5kX2ZwKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdDb250ZW50LVR5cGUnLCBtc2cpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbignQ29udGVudC1MZW5ndGgnLCBtc2cpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0KCdUcmFuc2Zlci1FbmNvZGluZycpLCAnY2h1bmtlZCcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZi5yZWFkKCkpCisKICAgICBkZWYgdGVzdF9tYW51YWxfY29udGVudF9sZW5ndGgoc2VsZik6CiAgICAgICAgICMgU2V0IGFuIGluY29ycmVjdCBjb250ZW50LWxlbmd0aCBzbyB0aGF0IHdlIGNhbiB2ZXJpZnkgdGhhdAogICAgICAgICAjIGl0IHdpbGwgbm90IGJlIG92ZXItcmlkZGVuIGJ5IHRoZSBsaWJyYXJ5LgpAQCAtMTYwOCw3ICsxNzU5LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiNSIsIG1lc3NhZ2UuZ2V0KCJjb250ZW50LWxlbmd0aCIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYm9keVx4YzEnLCBmLnJlYWQoKSkKIAotICAgIGRlZiB0ZXN0X2ZpbGVfYm9keShzZWxmKToKKyAgICBkZWYgdGVzdF90ZXh0X2ZpbGVfYm9keShzZWxmKToKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKICAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAidyIpIGFzIGY6CiAgICAgICAgICAgICBmLndyaXRlKCJib2R5IikKQEAgLTE2MTcsOCArMTc2OCwxMSBAQAogICAgICAgICAgICAgbWVzc2FnZSwgZiA9IHNlbGYuZ2V0X2hlYWRlcnNfYW5kX2ZwKCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInRleHQvcGxhaW4iLCBtZXNzYWdlLmdldF9jb250ZW50X3R5cGUoKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKG1lc3NhZ2UuZ2V0X2NoYXJzZXQoKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjQiLCBtZXNzYWdlLmdldCgiY29udGVudC1sZW5ndGgiKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidib2R5JywgZi5yZWFkKCkpCisgICAgICAgICAgICAjIE5vIGNvbnRlbnQtbGVuZ3RoIHdpbGwgYmUgZGV0ZXJtaW5lZCBmb3IgZmlsZXM7IHRoZSBib2R5CisgICAgICAgICAgICAjIHdpbGwgYmUgc2VudCB1c2luZyBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nIGluc3RlYWQuCisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShtZXNzYWdlLmdldCgiY29udGVudC1sZW5ndGgiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImNodW5rZWQiLCBtZXNzYWdlLmdldCgidHJhbnNmZXItZW5jb2RpbmciKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYic0XHJcbmJvZHlcclxuMFxyXG5cclxuJywgZi5yZWFkKCkpCiAKICAgICBkZWYgdGVzdF9iaW5hcnlfZmlsZV9ib2R5KHNlbGYpOgogICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQpAQCAtMTYyOSw4ICsxNzgzLDkgQEAKICAgICAgICAgICAgIG1lc3NhZ2UsIGYgPSBzZWxmLmdldF9oZWFkZXJzX2FuZF9mcCgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ0ZXh0L3BsYWluIiwgbWVzc2FnZS5nZXRfY29udGVudF90eXBlKCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShtZXNzYWdlLmdldF9jaGFyc2V0KCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCI1IiwgbWVzc2FnZS5nZXQoImNvbnRlbnQtbGVuZ3RoIikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYm9keVx4YzEnLCBmLnJlYWQoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImNodW5rZWQiLCBtZXNzYWdlLmdldCgiVHJhbnNmZXItRW5jb2RpbmciKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIkNvbnRlbnQtTGVuZ3RoIiwgbWVzc2FnZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYic1XHJcbmJvZHlceGMxXHJcbjBcclxuXHJcbicsIGYucmVhZCgpKQogCiAKIGNsYXNzIEhUVFBSZXNwb25zZVRlc3QoVGVzdENhc2UpOgpAQCAtMTc0MSwxMyArMTg5Niw1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2hlYWRlcjoge30nLmZvcm1hdChleHBlY3RlZF9oZWFkZXIpLCBsaW5lcykKIAogCi1Ac3VwcG9ydC5yZWFwX3RocmVhZHMKLWRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKLSAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChIZWFkZXJUZXN0cywgT2ZmbGluZVRlc3QsIEJhc2ljVGVzdCwgVGltZW91dFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGVuY2VUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBTVGVzdCwgUmVxdWVzdEJvZHlUZXN0LCBTb3VyY2VBZGRyZXNzVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQUmVzcG9uc2VUZXN0LCBFeHRlbmRlZFJlYWRUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkUmVhZFRlc3RDaHVua2VkLCBUdW5uZWxUZXN0cykKLQogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0X21haW4oKQorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5IGIvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weQppbmRleCA3MmU2ZTA4Li40ZTkzMTQ0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBodG1sCiBpbXBvcnQgaHR0cC5jbGllbnQKIGltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KIAogaW1wb3J0IHVuaXR0ZXN0CkBAIC0xODksNyArMTkwLDcgQEAKICAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIEhUVFBTdGF0dXMuTk9UX0lNUExFTUVOVEVEKQogCi0gICAgZGVmIHRlc3RfaGVhZF9rZWVwX2FsaXZlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2hlYWRlcl9rZWVwX2FsaXZlKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5faHR0cF92c25fc3RyID0gJ0hUVFAvMS4xJwogICAgICAgICBzZWxmLmNvbi5wdXRyZXF1ZXN0KCdHRVQnLCAnLycpCiAgICAgICAgIHNlbGYuY29uLnB1dGhlYWRlcignQ29ubmVjdGlvbicsICdrZWVwLWFsaXZlJykKQEAgLTM2OSw2ICszNzAsOCBAQAogICAgICAgICByZXR1cm4gYm9keQogCiAgICAgQHN1cHBvcnQucmVxdWlyZXNfbWFjX3ZlcigxMCwgNSkKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLAorICAgICAgICAgICAgICAgICAgICAgJ3VuZGVjb2RhYmxlIG5hbWUgY2Fubm90IGJlIGRlY29kZWQgb24gd2luMzInKQogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN1cHBvcnQuVEVTVEZOX1VOREVDT0RBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICduZWVkIHN1cHBvcnQuVEVTVEZOX1VOREVDT0RBQkxFJykKICAgICBkZWYgdGVzdF91bmRlY29kYWJsZV9maWxlbmFtZShzZWxmKToKQEAgLTM4OCw3ICszOTEsNyBAQAogICAgICAgICBxdW90ZWRuYW1lID0gdXJsbGliLnBhcnNlLnF1b3RlKGZpbGVuYW1lLCBlcnJvcnM9J3N1cnJvZ2F0ZXBhc3MnKQogICAgICAgICBzZWxmLmFzc2VydEluKCgnaHJlZj0iJXMiJyAlIHF1b3RlZG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgLmVuY29kZShlbmMsICdzdXJyb2dhdGVlc2NhcGUnKSwgYm9keSkKLSAgICAgICAgc2VsZi5hc3NlcnRJbigoJz4lczwnICUgaHRtbC5lc2NhcGUoZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnPiVzPCcgJSBodG1sLmVzY2FwZShmaWxlbmFtZSwgcXVvdGU9RmFsc2UpKQogICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGUoZW5jLCAnc3Vycm9nYXRlZXNjYXBlJyksIGJvZHkpCiAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KHNlbGYuYmFzZV91cmwgKyAnLycgKyBxdW90ZWRuYW1lKQogICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCBIVFRQU3RhdHVzLk9LLApAQCAtNDY2LDYgKzQ2OSwyNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLmdldGhlYWRlcigiTG9jYXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlbXBkaXJfbmFtZSArICIvP2hpPTEiKQogCisgICAgZGVmIHRlc3RfaHRtbF9lc2NhcGVfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gJzx0ZXN0Jj4udHh0JworICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnRlbXBkaXIsIGZpbGVuYW1lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wZW4oZnVsbHBhdGgsICd3JykuY2xvc2UoKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdDYW4gbm90IGNyZWF0ZSBmaWxlICVzIG9uIGN1cnJlbnQgZmlsZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzdGVtJyAlIGZpbGVuYW1lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KHNlbGYuYmFzZV91cmwgKyAnLycpCisgICAgICAgICAgICBib2R5ID0gc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgSFRUUFN0YXR1cy5PSykKKyAgICAgICAgICAgIGVuYyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0X2NvbnRlbnRfY2hhcnNldCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsoZnVsbHBhdGgpICAjIGF2b2lkIGFmZmVjdGluZyB0ZXN0X3VuZGVjb2RhYmxlX2ZpbGVuYW1lCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoZW5jKQorICAgICAgICBodG1sX3RleHQgPSAnPiVzPCcgJSBodG1sLmVzY2FwZShmaWxlbmFtZSwgcXVvdGU9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oaHRtbF90ZXh0LmVuY29kZShlbmMpLCBib2R5KQorCiAKIGNnaV9maWxlMSA9ICIiIlwKICMhJXMKQEAgLTkxNiw3ICs5NDAsNyBAQAogICAgICAgICAjIElzc3VlICM2NzkxOiBzYW1lIGZvciBoZWFkZXJzCiAgICAgICAgIHJlc3VsdCA9IHNlbGYuc2VuZF90eXBpY2FsX3JlcXVlc3QoCiAgICAgICAgICAgICBiJ0dFVCAvIEhUVFAvMS4xXHJcblgtRm9vOiBiYXInICsgYidyJyAqIDY1NTM3ICsgYidcclxuXHJcbicpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdLCBiJ0hUVFAvMS4xIDQwMCBMaW5lIHRvbyBsb25nXHJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdLCBiJ0hUVFAvMS4xIDQzMSBMaW5lIHRvbyBsb25nXHJcbicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5oYW5kbGVyLmdldF9jYWxsZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oYW5kbGVyLnJlcXVlc3RsaW5lLCAnR0VUIC8gSFRUUC8xLjEnKQogCkBAIC05MjcsNiArOTUxLDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5oYW5kbGVyLmdldF9jYWxsZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oYW5kbGVyLnJlcXVlc3RsaW5lLCAnR0VUIC8gSFRUUC8xLjEnKQogCisgICAgZGVmIHRlc3RfaHRtbF9lc2NhcGVfb25fZXJyb3Ioc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2VuZF90eXBpY2FsX3JlcXVlc3QoCisgICAgICAgICAgICBiJzxzY3JpcHQ+YWxlcnQoImhlbGxvIik8L3NjcmlwdD4gLyBIVFRQLzEuMScpCisgICAgICAgIHJlc3VsdCA9IGInJy5qb2luKHJlc3VsdCkKKyAgICAgICAgdGV4dCA9ICc8c2NyaXB0PmFsZXJ0KCJoZWxsbyIpPC9zY3JpcHQ+JworICAgICAgICBzZWxmLmFzc2VydEluKGh0bWwuZXNjYXBlKHRleHQsIHF1b3RlPUZhbHNlKS5lbmNvZGUoJ2FzY2lpJyksIHJlc3VsdCkKKwogICAgIGRlZiB0ZXN0X2Nsb3NlX2Nvbm5lY3Rpb24oc2VsZik6CiAgICAgICAgICMgaGFuZGxlX29uZV9yZXF1ZXN0KCkgc2hvdWxkIGJlIHJlcGVhdGVkbHkgY2FsbGVkIHVudGlsCiAgICAgICAgICMgaXQgc2V0cyBjbG9zZV9jb25uZWN0aW9uCkBAIC05NDIsNiArOTczLDE5IEBACiAgICAgICAgIHNlbGYuaGFuZGxlci5oYW5kbGUoKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBuZXh0LCBjbG9zZV92YWx1ZXMpCiAKKyAgICBkZWYgdGVzdF9kYXRlX3RpbWVfc3RyaW5nKHNlbGYpOgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICAjIHRoaXMgaXMgdGhlIG9sZCBjb2RlIHRoYXQgZm9ybWF0cyB0aGUgdGltZXN0YW1wCisgICAgICAgIHllYXIsIG1vbnRoLCBkYXksIGhoLCBtbSwgc3MsIHdkLCB5LCB6ID0gdGltZS5nbXRpbWUobm93KQorICAgICAgICBleHBlY3RlZCA9ICIlcywgJTAyZCAlM3MgJTRkICUwMmQ6JTAyZDolMDJkIEdNVCIgJSAoCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIud2Vla2RheW5hbWVbd2RdLAorICAgICAgICAgICAgZGF5LAorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLm1vbnRobmFtZVttb250aF0sCisgICAgICAgICAgICB5ZWFyLCBoaCwgbW0sIHNzCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIuZGF0ZV90aW1lX3N0cmluZyh0aW1lc3RhbXA9bm93KSwgZXhwZWN0ZWQpCisKKwogY2xhc3MgU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIiBUZXN0IHVybCBwYXJzaW5nICIiIgogICAgIGRlZiBzZXRVcChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaWRsZS5weSBiL0xpYi90ZXN0L3Rlc3RfaWRsZS5weQppbmRleCAxNDFlODllLi5kYTA1ZGE1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2lkbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pZGxlLnB5CkBAIC0xLDE2ICsxLDIzIEBACiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGltcG9ydF9tb2R1bGUKIAotIyBTa2lwIHRlc3QgaWYgX3RocmVhZCBvciBfdGtpbnRlciB3YXNuJ3QgYnVpbHQgb3IgaWRsZWxpYiB3YXMgZGVsZXRlZC4KKyMgU2tpcCB0ZXN0IGlmIF90aHJlYWQgb3IgX3RraW50ZXIgd2Fzbid0IGJ1aWx0LCBpZiBpZGxlbGliIGlzIG1pc3NpbmcsCisjIG9yIGlmIHRjbC90ayBpcyBub3QgdGhlIDguNSsgbmVlZGVkIGZvciB0dGsgd2lkZ2V0cy4KIGltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpICAjIGltcG9ydGVkIGJ5IFB5U2hlbGwsIGltcG9ydHMgX3RocmVhZAogdGsgPSBpbXBvcnRfbW9kdWxlKCd0a2ludGVyJykgICMgaW1wb3J0cyBfdGtpbnRlcgotaWRsZXRlc3QgPSBpbXBvcnRfbW9kdWxlKCdpZGxlbGliLmlkbGVfdGVzdCcpCitpZiB0ay5Ua1ZlcnNpb24gPCA4LjU6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIklETEUgcmVxdWlyZXMgdGsgOC41IG9yIGxhdGVyLiIpCitpZGxlbGliID0gaW1wb3J0X21vZHVsZSgnaWRsZWxpYicpCiAKLSMgV2l0aG91dCB0ZXN0X21haW4gcHJlc2VudCwgcmVncnRlc3QucnVudGVzdF9pbm5lciAobGluZTEyMTkpIGNhbGxzCi0jIHVuaXR0ZXN0LlRlc3RMb2FkZXIoKS5sb2FkVGVzdHNGcm9tTW9kdWxlKHRoaXNfbW9kdWxlKSB3aGljaCBjYWxscwotIyBsb2FkX3Rlc3RzKCkgaWYgaXQgZmluZHMgaXQuIChVbml0dGVzdC5tYWluIGRvZXMgdGhlIHNhbWUuKQotbG9hZF90ZXN0cyA9IGlkbGV0ZXN0LmxvYWRfdGVzdHMKKyMgQmVmb3JlIHRlc3QgaW1wb3J0cywgdGVsbCBJRExFIHRvIGF2b2lkIGNoYW5naW5nIHRoZSBlbnZpcm9ubWVudC4KK2lkbGVsaWIudGVzdGluZyA9IFRydWUKKworIyB1bml0dGVzdC5tYWluIGFuZCB0ZXN0LmxpYnJlZ3J0ZXN0LnJ1bnRlc3QucnVudGVzdF9pbm5lcgorIyBjYWxsIGxvYWRfdGVzdHMsIHdoZW4gcHJlc2VudCwgdG8gZGlzY292ZXIgdGVzdHMgdG8gcnVuLgorZnJvbSBpZGxlbGliLmlkbGVfdGVzdCBpbXBvcnQgbG9hZF90ZXN0cwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisgICAgdGsuTm9EZWZhdWx0Um9vdCgpCisgICAgdW5pdHRlc3QubWFpbihleGl0PUZhbHNlKQorICAgIHRrLl9zdXBwb3J0X2RlZmF1bHRfcm9vdCA9IDEKKyAgICB0ay5fZGVmYXVsdF9yb290ID0gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbWFwbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9pbWFwbGliLnB5CmluZGV4IDA3MTU3ZjUuLjhlNDk5MGIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1hcGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltYXBsaWIucHkKQEAgLTI0Myw2ICsyNDMsNTUgQEAKICAgICAgICAgICAgIGNsaWVudC5zaHV0ZG93bigpCiAKICAgICBAcmVhcF90aHJlYWRzCisgICAgZGVmIHRlc3RfYnJhY2tldF9mbGFncyhzZWxmKToKKworICAgICAgICAjIFRoaXMgdmlvbGF0ZXMgUkZDIDM1MDEsIHdoaWNoIGRpc2FsbG93cyAnXScgY2hhcmFjdGVycyBpbiB0YWcgbmFtZXMsCisgICAgICAgICMgYnV0IGltYXBsaWIgaGFzIGFsbG93ZWQgcHJvZHVjaW5nIHN1Y2ggdGFncyBmb3JldmVyLCBvdGhlciBwcm9ncmFtcworICAgICAgICAjIGFsc28gcHJvZHVjZSB0aGVtIChlZzogT3RoZXJJbmJveCdzIE9yZ2FuaXplciBhcHAgYXMgb2YgMjAxNDA3MTYpLAorICAgICAgICAjIGFuZCBHbWFpbCwgZm9yIGV4YW1wbGUsIGFjY2VwdHMgdGhlbSBhbmQgcHJvZHVjZXMgdGhlbS4gIFNvIHdlCisgICAgICAgICMgc3VwcG9ydCB0aGVtLiAgU2VlIGlzc3VlICMyMTgxNS4KKworICAgICAgICBjbGFzcyBCcmFja2V0RmxhZ0hhbmRsZXIoU2ltcGxlSU1BUEhhbmRsZXIpOgorCisgICAgICAgICAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBbJ0Fuc3dlcmVkJywgJ0ZsYWdnZWQnLCAnRGVsZXRlZCcsICdTZWVuJywgJ0RyYWZ0J10KKyAgICAgICAgICAgICAgICBzdXBlcigpLmhhbmRsZSgpCisKKyAgICAgICAgICAgIGRlZiBjbWRfQVVUSEVOVElDQVRFKHNlbGYsIHRhZywgYXJncyk6CisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF90ZXh0bGluZSgnKycpCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucmVzcG9uc2UgPSB5aWVsZAorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfdGFnZ2VkKHRhZywgJ09LJywgJ0ZBS0VBVVRIIHN1Y2Nlc3NmdWwnKQorCisgICAgICAgICAgICBkZWYgY21kX1NFTEVDVChzZWxmLCB0YWcsIGFyZ3MpOgorICAgICAgICAgICAgICAgIGZsYWdfbXNnID0gJyBcXCcuam9pbihzZWxmLmZsYWdzKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfbGluZSgoJyogRkxBR1MgKCVzKScgJSBmbGFnX21zZykuZW5jb2RlKCdhc2NpaScpKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfbGluZShiJyogMiBFWElTVFMnKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfbGluZShiJyogMCBSRUNFTlQnKQorICAgICAgICAgICAgICAgIG1zZyA9ICgnKiBPSyBbUEVSTUFORU5URkxBR1MgJXMgXFwqKV0gRmxhZ3MgcGVybWl0dGVkLicKKyAgICAgICAgICAgICAgICAgICAgICAgICUgZmxhZ19tc2cpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF9saW5lKG1zZy5lbmNvZGUoJ2FzY2lpJykpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF90YWdnZWQodGFnLCAnT0snLCAnW1JFQUQtV1JJVEVdIFNFTEVDVCBjb21wbGV0ZWQuJykKKworICAgICAgICAgICAgZGVmIGNtZF9TVE9SRShzZWxmLCB0YWcsIGFyZ3MpOgorICAgICAgICAgICAgICAgIG5ld19mbGFncyA9IGFyZ3NbMl0uc3RyaXAoJygnKS5zdHJpcCgnKScpLnNwbGl0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmZsYWdzLmV4dGVuZChuZXdfZmxhZ3MpCisgICAgICAgICAgICAgICAgZmxhZ3NfbXNnID0gJyhGTEFHUyAoJXMpKScgJSAnIFxcJy5qb2luKHNlbGYuZmxhZ3MpCisgICAgICAgICAgICAgICAgbXNnID0gJyogJXMgRkVUQ0ggJXMnICUgKGFyZ3NbMF0sIGZsYWdzX21zZykKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX2xpbmUobXNnLmVuY29kZSgnYXNjaWknKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX3RhZ2dlZCh0YWcsICdPSycsICdTVE9SRSBjb21wbGV0ZWQuJykKKworICAgICAgICB3aXRoIHNlbGYucmVhcGVkX3BhaXIoQnJhY2tldEZsYWdIYW5kbGVyKSBhcyAoc2VydmVyLCBjbGllbnQpOgorICAgICAgICAgICAgY29kZSwgZGF0YSA9IGNsaWVudC5hdXRoZW50aWNhdGUoJ01ZQVVUSCcsIGxhbWJkYSB4OiBiJ2Zha2UnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlLCAnT0snKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2ZXIucmVzcG9uc2UsIGInWm1GclpRPT1cclxuJykKKyAgICAgICAgICAgIGNsaWVudC5zZWxlY3QoJ3Rlc3QnKQorICAgICAgICAgICAgdHlwLCBbZGF0YV0gPSBjbGllbnQuc3RvcmUoYicxJywgIitGTEFHUyIsICJbdGVzdF0iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1t0ZXN0XScsIGRhdGEpCisgICAgICAgICAgICBjbGllbnQuc2VsZWN0KCd0ZXN0JykKKyAgICAgICAgICAgIHR5cCwgW2RhdGFdID0gY2xpZW50LnJlc3BvbnNlKCdQRVJNQU5FTlRGTEFHUycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInW3Rlc3RdJywgZGF0YSkKKworICAgIEByZWFwX3RocmVhZHMKICAgICBkZWYgdGVzdF9pc3N1ZTU5NDkoc2VsZik6CiAKICAgICAgICAgY2xhc3MgRU9GSGFuZGxlcihzb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXAucHkgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQppbmRleCBlZTllZTFhLi40ZWNlMzY1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQpAQCAtNiwxMyArNiwxMiBAQAogaW1wb3J0IGltcG9ydGxpYi51dGlsCiBpbXBvcnQgb3MKIGltcG9ydCBvcy5wYXRoCi1pbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3lzCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHdhcm5pbmdzCiB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQorICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgIGltcG9ydCBpbXAKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydC9fX2luaXRfXy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0L19faW5pdF9fLnB5CmluZGV4IDFlMzMyNzQuLjc2MDkwOGUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0L19faW5pdF9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0L19faW5pdF9fLnB5CkBAIC02OSw2ICs2OSwxOCBAQAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgdW5sb2FkKFRFU1RGTikKIAorICAgIGRlZiB0ZXN0X2ltcG9ydF9yYWlzZXNfTW9kdWxlTm90Rm91bmRFcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhNb2R1bGVOb3RGb3VuZEVycm9yKToKKyAgICAgICAgICAgIGltcG9ydCBzb21ldGhpbmdfdGhhdF9zaG91bGRfbm90X2V4aXN0X2FueXdoZXJlCisKKyAgICBkZWYgdGVzdF9mcm9tX2ltcG9ydF9taXNzaW5nX21vZHVsZV9yYWlzZXNfTW9kdWxlTm90Rm91bmRFcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhNb2R1bGVOb3RGb3VuZEVycm9yKToKKyAgICAgICAgICAgIGZyb20gc29tZXRoaW5nX3RoYXRfc2hvdWxkX25vdF9leGlzdF9hbnl3aGVyZSBpbXBvcnQgYmxhaAorCisgICAgZGVmIHRlc3RfZnJvbV9pbXBvcnRfbWlzc2luZ19hdHRyX3JhaXNlc19JbXBvcnRFcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcik6CisgICAgICAgICAgICBmcm9tIGltcG9ydGxpYiBpbXBvcnQgc29tZXRoaW5nX3RoYXRfc2hvdWxkX25vdF9leGlzdF9hbnl3aGVyZQorCiAgICAgZGVmIHRlc3RfY2FzZV9zZW5zaXRpdml0eShzZWxmKToKICAgICAgICAgIyBCcmllZiBkaWdyZXNzaW9uIHRvIHRlc3QgdGhhdCBpbXBvcnQgaXMgY2FzZS1zZW5zaXRpdmU6ICBpZiB3ZSBnb3QKICAgICAgICAgIyB0aGlzIGZhciwgd2Uga25vdyBmb3Igc3VyZSB0aGF0ICJyYW5kb20iIGV4aXN0cy4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9jYXNlX3NlbnNpdGl2aXR5LnB5CmluZGV4IGMxMTJjYTcuLjBkZDljODYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weQpAQCAtMSw1ICsxLDQgQEAKIGZyb20gaW1wb3J0bGliIGltcG9ydCBfYm9vdHN0cmFwX2V4dGVybmFsCi1pbXBvcnQgc3lzCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCkBAIC05LDggKzgsNiBAQAogbWFjaGluZXJ5ID0gdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWIubWFjaGluZXJ5JykKIAogCi0jIFhYWCBmaW5kX3NwZWMgdGVzdHMKLQogQHVuaXR0ZXN0LnNraXBJZih1dGlsLkVYVEVOU0lPTlMuZmlsZW5hbWUgaXMgTm9uZSwgJ190ZXN0Y2FwaSBub3QgYXZhaWxhYmxlJykKIEB1dGlsLmNhc2VfaW5zZW5zaXRpdmVfdGVzdHMKIGNsYXNzIEV4dGVuc2lvbk1vZHVsZUNhc2VTZW5zaXRpdml0eVRlc3QodXRpbC5DQVNFT0tUZXN0QmFzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9maW5kZXIucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9maW5kZXIucHkKaW5kZXggNzFiZjY3Zi4uYzliNGEzNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfZmluZGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2ZpbmRlci5weQpAQCAtNiw3ICs2LDYgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHdhcm5pbmdzCiAKLSMgWFhYIGZpbmRfc3BlYyB0ZXN0cwogCiBjbGFzcyBGaW5kZXJUZXN0cyhhYmMuRmluZGVyVGVzdHMpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9wYXRoX2hvb2sucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9wYXRoX2hvb2sucHkKaW5kZXggOGY0YjhiYi4uYTRiNWE2NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfcGF0aF9ob29rLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X3BhdGhfaG9vay5weQpAQCAtMiw4ICsyLDYgQEAKIAogbWFjaGluZXJ5ID0gdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWIubWFjaGluZXJ5JykKIAotaW1wb3J0IGNvbGxlY3Rpb25zCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9mcm96ZW4vdGVzdF9sb2FkZXIucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9mcm96ZW4vdGVzdF9sb2FkZXIucHkKaW5kZXggNjAzYzdkNy4uMjllY2ZmMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZnJvemVuL3Rlc3RfbG9hZGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2Zyb3plbi90ZXN0X2xvYWRlci5weQpAQCAtMyw4ICszLDYgQEAKIAogbWFjaGluZXJ5ID0gdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWIubWFjaGluZXJ5JykKIAotCi1pbXBvcnQgc3lzCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0CiBpbXBvcnQgdHlwZXMKIGltcG9ydCB1bml0dGVzdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X19fcGFja2FnZV9fLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X19fcGFja2FnZV9fLnB5CmluZGV4IGM3ZDNhMmEuLjdmNjQ1NDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9fX3BhY2thZ2VfXy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfX19wYWNrYWdlX18ucHkKQEAgLTUsNiArNSw3IEBACiAKICIiIgogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKIGZyb20gLi4gaW1wb3J0IHV0aWwKIAogCkBAIC0zMywzMSArMzQsNTAgQEAKIAogICAgICIiIgogCi0gICAgZGVmIHRlc3RfdXNpbmdfX19wYWNrYWdlX18oc2VsZik6Ci0gICAgICAgICMgW19fcGFja2FnZV9fXQorICAgIGRlZiBpbXBvcnRfbW9kdWxlKHNlbGYsIGdsb2JhbHNfKToKICAgICAgICAgd2l0aCBzZWxmLm1vY2tfbW9kdWxlcygncGtnLl9faW5pdF9fJywgJ3BrZy5mYWtlJykgYXMgaW1wb3J0ZXI6CiAgICAgICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKG1ldGFfcGF0aD1baW1wb3J0ZXJdKToKICAgICAgICAgICAgICAgICBzZWxmLl9faW1wb3J0X18oJ3BrZy5mYWtlJykKICAgICAgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLl9faW1wb3J0X18oJycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHM9eydfX3BhY2thZ2VfXyc6ICdwa2cuZmFrZSd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGlzdD1bJ2F0dHInXSwgbGV2ZWw9MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFscz1nbG9iYWxzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbWxpc3Q9WydhdHRyJ10sIGxldmVsPTIpCisgICAgICAgIHJldHVybiBtb2R1bGUKKworICAgIGRlZiB0ZXN0X3VzaW5nX19fcGFja2FnZV9fKHNlbGYpOgorICAgICAgICAjIFtfX3BhY2thZ2VfX10KKyAgICAgICAgbW9kdWxlID0gc2VsZi5pbXBvcnRfbW9kdWxlKHsnX19wYWNrYWdlX18nOiAncGtnLmZha2UnfSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICdwa2cnKQogCi0gICAgZGVmIHRlc3RfdXNpbmdfX19uYW1lX18oc2VsZiwgcGFja2FnZV9hc19Ob25lPUZhbHNlKToKKyAgICBkZWYgdGVzdF91c2luZ19fX25hbWVfXyhzZWxmKToKICAgICAgICAgIyBbX19uYW1lX19dCi0gICAgICAgIGdsb2JhbHNfID0geydfX25hbWVfXyc6ICdwa2cuZmFrZScsICdfX3BhdGhfXyc6IFtdfQotICAgICAgICBpZiBwYWNrYWdlX2FzX05vbmU6Ci0gICAgICAgICAgICBnbG9iYWxzX1snX19wYWNrYWdlX18nXSA9IE5vbmUKLSAgICAgICAgd2l0aCBzZWxmLm1vY2tfbW9kdWxlcygncGtnLl9faW5pdF9fJywgJ3BrZy5mYWtlJykgYXMgaW1wb3J0ZXI6Ci0gICAgICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKG1ldGFfcGF0aD1baW1wb3J0ZXJdKToKLSAgICAgICAgICAgICAgICBzZWxmLl9faW1wb3J0X18oJ3BrZy5mYWtlJykKLSAgICAgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLl9faW1wb3J0X18oJycsIGdsb2JhbHM9IGdsb2JhbHNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbWxpc3Q9WydhdHRyJ10sIGxldmVsPTIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZS5fX25hbWVfXywgJ3BrZycpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYuaW1wb3J0X21vZHVsZSh7J19fbmFtZV9fJzogJ3BrZy5mYWtlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fcGF0aF9fJzogW119KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZS5fX25hbWVfXywgJ3BrZycpCisKKyAgICBkZWYgdGVzdF93YXJuX3doZW5fdXNpbmdfX19uYW1lX18oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhJbXBvcnRXYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuaW1wb3J0X21vZHVsZSh7J19fbmFtZV9fJzogJ3BrZy5mYWtlJywgJ19fcGF0aF9fJzogW119KQogCiAgICAgZGVmIHRlc3RfTm9uZV9hc19fX3BhY2thZ2VfXyhzZWxmKToKICAgICAgICAgIyBbTm9uZV0KLSAgICAgICAgc2VsZi50ZXN0X3VzaW5nX19fbmFtZV9fKHBhY2thZ2VfYXNfTm9uZT1UcnVlKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIpCisgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLmltcG9ydF9tb2R1bGUoeworICAgICAgICAgICAgICAgICdfX25hbWVfXyc6ICdwa2cuZmFrZScsICdfX3BhdGhfXyc6IFtdLCAnX19wYWNrYWdlX18nOiBOb25lIH0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAncGtnJykKKworICAgIGRlZiB0ZXN0X3NwZWNfZmFsbGJhY2soc2VsZik6CisgICAgICAgICMgSWYgX19wYWNrYWdlX18gaXNuJ3QgZGVmaW5lZCwgZmFsbCBiYWNrIG9uIF9fc3BlY19fLnBhcmVudC4KKyAgICAgICAgbW9kdWxlID0gc2VsZi5pbXBvcnRfbW9kdWxlKHsnX19zcGVjX18nOiBGYWtlU3BlYygncGtnLmZha2UnKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAncGtnJykKKworICAgIGRlZiB0ZXN0X3dhcm5fd2hlbl9wYWNrYWdlX2FuZF9zcGVjX2Rpc2FncmVlKHNlbGYpOgorICAgICAgICAjIFJhaXNlIGFuIEltcG9ydFdhcm5pbmcgaWYgX19wYWNrYWdlX18gIT0gX19zcGVjX18ucGFyZW50LgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoSW1wb3J0V2FybmluZyk6CisgICAgICAgICAgICBzZWxmLmltcG9ydF9tb2R1bGUoeydfX3BhY2thZ2VfXyc6ICdwa2cuZmFrZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfX3NwZWNfXyc6IEZha2VTcGVjKCdwa2cuZmFrZWZha2UnKX0pCiAKICAgICBkZWYgdGVzdF9iYWRfX3BhY2thZ2VfXyhzZWxmKToKICAgICAgICAgZ2xvYmFscyA9IHsnX19wYWNrYWdlX18nOiAnPG5vdCByZWFsPid9CkBAIC03MCw2ICs5MCwxMSBAQAogICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCcnLCBnbG9iYWxzLCB7fSwgWydyZWxpbXBvcnQnXSwgMSkKIAogCitjbGFzcyBGYWtlU3BlYzoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50KToKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKworCiBjbGFzcyBVc2luZ19fcGFja2FnZV9fUEVQMzAyKFVzaW5nX19wYWNrYWdlX18pOgogICAgIG1vY2tfbW9kdWxlcyA9IHV0aWwubW9ja19tb2R1bGVzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9hcGkucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfYXBpLnB5CmluZGV4IDcwNjlkOWUuLmE3YmYyNzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9hcGkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X2FwaS5weQpAQCAtNDMsNiArNDMsMTAgQEAKICAgICAiIiJUZXN0IEFQSS1zcGVjaWZpYyBkZXRhaWxzIGZvciBfX2ltcG9ydF9fIChlLmcuIHJhaXNpbmcgdGhlIHJpZ2h0CiAgICAgZXhjZXB0aW9uIHdoZW4gcGFzc2luZyBpbiBhbiBpbnQgZm9yIHRoZSBtb2R1bGUgbmFtZSkuIiIiCiAKKyAgICBkZWYgdGVzdF9yYWlzZXNfTW9kdWxlTm90Rm91bmRFcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhNb2R1bGVOb3RGb3VuZEVycm9yKToKKyAgICAgICAgICAgIHV0aWwuaW1wb3J0X2ltcG9ydGxpYignc29tZSBtb2R1bGUgdGhhdCBkb2VzIG5vdCBleGlzdCcpCisKICAgICBkZWYgdGVzdF9uYW1lX3JlcXVpcmVzX3JwYXJpdGlvbihzZWxmKToKICAgICAgICAgIyBSYWlzZSBUeXBlRXJyb3IgaWYgYSBub24tc3RyaW5nIGlzIHBhc3NlZCBpbiBmb3IgdGhlIG1vZHVsZSBuYW1lLgogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfZnJvbWxpc3QucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfZnJvbWxpc3QucHkKaW5kZXggODA0NTQ2NS4uMTQ2NDAwMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X2Zyb21saXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9mcm9tbGlzdC5weQpAQCAtNzMsMTYgKzczLDE2IEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIobW9kdWxlLCAnbW9kdWxlJykpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUubW9kdWxlLl9fbmFtZV9fLCAncGtnLm1vZHVsZScpCiAKLSAgICBkZWYgdGVzdF9tb2R1bGVfZnJvbV9wYWNrYWdlX3RyaWdnZXJzX0ltcG9ydEVycm9yKHNlbGYpOgotICAgICAgICAjIElmIGEgc3VibW9kdWxlIGNhdXNlcyBhbiBJbXBvcnRFcnJvciBiZWNhdXNlIGl0IHRyaWVzIHRvIGltcG9ydAotICAgICAgICAjIGEgbW9kdWxlIHdoaWNoIGRvZXNuJ3QgZXhpc3QsIHRoYXQgc2hvdWxkIGxldCB0aGUgSW1wb3J0RXJyb3IKLSAgICAgICAgIyBwcm9wYWdhdGUuCisgICAgZGVmIHRlc3RfbW9kdWxlX2Zyb21fcGFja2FnZV90cmlnZ2Vyc19Nb2R1bGVOb3RGb3VuZEVycm9yKHNlbGYpOgorICAgICAgICAjIElmIGEgc3VibW9kdWxlIGNhdXNlcyBhbiBNb2R1bGVOb3RGb3VuZEVycm9yIGJlY2F1c2UgaXQgdHJpZXMKKyAgICAgICAgIyB0byBpbXBvcnQgYSBtb2R1bGUgd2hpY2ggZG9lc24ndCBleGlzdCwgdGhhdCBzaG91bGQgbGV0IHRoZQorICAgICAgICAjIE1vZHVsZU5vdEZvdW5kRXJyb3IgcHJvcGFnYXRlLgogICAgICAgICBkZWYgbW9kdWxlX2NvZGUoKToKICAgICAgICAgICAgIGltcG9ydCBpX2RvX25vdF9leGlzdAogICAgICAgICB3aXRoIHV0aWwubW9ja19tb2R1bGVzKCdwa2cuX19pbml0X18nLCAncGtnLm1vZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX2NvZGU9eydwa2cubW9kJzogbW9kdWxlX2NvZGV9KSBhcyBpbXBvcnRlcjoKICAgICAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUobWV0YV9wYXRoPVtpbXBvcnRlcl0pOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpIGFzIGV4YzoKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE1vZHVsZU5vdEZvdW5kRXJyb3IpIGFzIGV4YzoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCdwa2cnLCBmcm9tbGlzdD1bJ21vZCddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2lfZG9fbm90X2V4aXN0JywgZXhjLmV4Y2VwdGlvbi5uYW1lKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGFja2FnZXMucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGFja2FnZXMucHkKaW5kZXggMzc1NWI4NC4uMjQzOTYwNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhY2thZ2VzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9wYWNrYWdlcy5weQpAQCAtMSw3ICsxLDYgQEAKIGZyb20gLi4gaW1wb3J0IHV0aWwKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IGltcG9ydGxpYgogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhdGgucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGF0aC5weQppbmRleCBiMzJhODc2Li43YWEyNmIwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGF0aC5weQpAQCAtMTYsMTEgKzE2LDE0IEBACiAKICAgICAiIiJUZXN0cyBmb3IgUGF0aEZpbmRlci4iIiIKIAorICAgIGZpbmQgPSBOb25lCisgICAgY2hlY2tfZm91bmQgPSBOb25lCisKICAgICBkZWYgdGVzdF9mYWlsdXJlKHNlbGYpOgogICAgICAgICAjIFRlc3QgTm9uZSByZXR1cm5lZCB1cG9uIG5vdCBmaW5kaW5nIGEgc3VpdGFibGUgbG9hZGVyLgogICAgICAgICBtb2R1bGUgPSAnPHRlc3QgbW9kdWxlPicKICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZSgpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZShtb2R1bGUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5maW5kKG1vZHVsZSkpCiAKICAgICBkZWYgdGVzdF9zeXNfcGF0aChzZWxmKToKICAgICAgICAgIyBUZXN0IHRoYXQgc3lzLnBhdGggaXMgdXNlZCB3aGVuICdwYXRoJyBpcyBOb25lLgpAQCAtMzAsOCArMzMsOCBAQAogICAgICAgICBpbXBvcnRlciA9IHV0aWwubW9ja19zcGVjKG1vZHVsZSkKICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShwYXRoX2ltcG9ydGVyX2NhY2hlPXtwYXRoOiBpbXBvcnRlcn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aD1bcGF0aF0pOgotICAgICAgICAgICAgbG9hZGVyID0gc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZShtb2R1bGUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKGxvYWRlciwgaW1wb3J0ZXIpCisgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZmluZChtb2R1bGUpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2ZvdW5kKGZvdW5kLCBpbXBvcnRlcikKIAogICAgIGRlZiB0ZXN0X3BhdGgoc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0ICdwYXRoJyBpcyB1c2VkIHdoZW4gc2V0LgpAQCAtNDAsOCArNDMsOCBAQAogICAgICAgICBwYXRoID0gJzx0ZXN0IHBhdGg+JwogICAgICAgICBpbXBvcnRlciA9IHV0aWwubW9ja19zcGVjKG1vZHVsZSkKICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShwYXRoX2ltcG9ydGVyX2NhY2hlPXtwYXRoOiBpbXBvcnRlcn0pOgotICAgICAgICAgICAgbG9hZGVyID0gc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZShtb2R1bGUsIFtwYXRoXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMobG9hZGVyLCBpbXBvcnRlcikKKyAgICAgICAgICAgIGZvdW5kID0gc2VsZi5maW5kKG1vZHVsZSwgW3BhdGhdKQorICAgICAgICAgICAgc2VsZi5jaGVja19mb3VuZChmb3VuZCwgaW1wb3J0ZXIpCiAKICAgICBkZWYgdGVzdF9lbXB0eV9saXN0KHNlbGYpOgogICAgICAgICAjIEFuIGVtcHR5IGxpc3Qgc2hvdWxkIG5vdCBjb3VudCBhcyBhc2tpbmcgZm9yIHN5cy5wYXRoLgpAQCAtNTAsNyArNTMsNyBAQAogICAgICAgICBpbXBvcnRlciA9IHV0aWwubW9ja19zcGVjKG1vZHVsZSkKICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShwYXRoX2ltcG9ydGVyX2NhY2hlPXtwYXRoOiBpbXBvcnRlcn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aD1bcGF0aF0pOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZSgnbW9kdWxlJywgW10pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5maW5kKCdtb2R1bGUnLCBbXSkpCiAKICAgICBkZWYgdGVzdF9wYXRoX2hvb2tzKHNlbGYpOgogICAgICAgICAjIFRlc3QgdGhhdCBzeXMucGF0aF9ob29rcyBpcyB1c2VkLgpAQCAtNjAsOCArNjMsOCBAQAogICAgICAgICBpbXBvcnRlciA9IHV0aWwubW9ja19zcGVjKG1vZHVsZSkKICAgICAgICAgaG9vayA9IHV0aWwubW9ja19wYXRoX2hvb2socGF0aCwgaW1wb3J0ZXI9aW1wb3J0ZXIpCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aF9ob29rcz1baG9va10pOgotICAgICAgICAgICAgbG9hZGVyID0gc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZShtb2R1bGUsIFtwYXRoXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMobG9hZGVyLCBpbXBvcnRlcikKKyAgICAgICAgICAgIGZvdW5kID0gc2VsZi5maW5kKG1vZHVsZSwgW3BhdGhdKQorICAgICAgICAgICAgc2VsZi5jaGVja19mb3VuZChmb3VuZCwgaW1wb3J0ZXIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHBhdGgsIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzeXMucGF0aF9pbXBvcnRlcl9jYWNoZVtwYXRoXSwgaW1wb3J0ZXIpCiAKQEAgLTczLDcgKzc2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoPVtwYXRoX2VudHJ5XSk6CiAgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgogICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignYWx3YXlzJykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLm1hY2hpbmVyeS5QYXRoRmluZGVyLmZpbmRfbW9kdWxlKCdvcycpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuZmluZCgnb3MnKSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzeXMucGF0aF9pbXBvcnRlcl9jYWNoZVtwYXRoX2VudHJ5XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyh3Wy0xXS5jYXRlZ29yeSwgSW1wb3J0V2FybmluZykpCkBAIC04NSw4ICs4OCw4IEBACiAgICAgICAgIGltcG9ydGVyID0gdXRpbC5tb2NrX3NwZWMobW9kdWxlKQogICAgICAgICBob29rID0gdXRpbC5tb2NrX3BhdGhfaG9vayhvcy5nZXRjd2QoKSwgaW1wb3J0ZXI9aW1wb3J0ZXIpCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aD1bcGF0aF0sIHBhdGhfaG9va3M9W2hvb2tdKToKLSAgICAgICAgICAgIGxvYWRlciA9IHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUobW9kdWxlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhsb2FkZXIsIGltcG9ydGVyKQorICAgICAgICAgICAgZm91bmQgPSBzZWxmLmZpbmQobW9kdWxlKQorICAgICAgICAgICAgc2VsZi5jaGVja19mb3VuZChmb3VuZCwgaW1wb3J0ZXIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKG9zLmdldGN3ZCgpLCBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSkKIAogICAgIGRlZiB0ZXN0X05vbmVfb25fc3lzX3BhdGgoc2VsZik6CkBAIC0xODIsMTUgKzE4NSw1MCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX3NwZWMoJ3doYXRldmVyJykpCiAKIAorY2xhc3MgRmluZE1vZHVsZVRlc3RzKEZpbmRlclRlc3RzKToKKyAgICBkZWYgZmluZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGNoZWNrX2ZvdW5kKHNlbGYsIGZvdW5kLCBpbXBvcnRlcik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZm91bmQsIGltcG9ydGVyKQogCiAKLShGcm96ZW5fRmluZGVyVGVzdHMsCi0gU291cmNlX0ZpbmRlclRlc3RzCi0gKSA9IHV0aWwudGVzdF9ib3RoKEZpbmRlclRlc3RzLCBpbXBvcnRsaWI9aW1wb3J0bGliLCBtYWNoaW5lcnk9bWFjaGluZXJ5KQorKEZyb3plbl9GaW5kTW9kdWxlVGVzdHMsCisgU291cmNlX0ZpbmRNb2R1bGVUZXN0cworKSA9IHV0aWwudGVzdF9ib3RoKEZpbmRNb2R1bGVUZXN0cywgaW1wb3J0bGliPWltcG9ydGxpYiwgbWFjaGluZXJ5PW1hY2hpbmVyeSkKKworCitjbGFzcyBGaW5kU3BlY1Rlc3RzKEZpbmRlclRlc3RzKToKKyAgICBkZWYgZmluZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX3NwZWMoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBjaGVja19mb3VuZChzZWxmLCBmb3VuZCwgaW1wb3J0ZXIpOgorICAgICAgICBzZWxmLmFzc2VydElzKGZvdW5kLmxvYWRlciwgaW1wb3J0ZXIpCisKKworKEZyb3plbl9GaW5kU3BlY1Rlc3RzLAorIFNvdXJjZV9GaW5kU3BlY1Rlc3RzCisgKSA9IHV0aWwudGVzdF9ib3RoKEZpbmRTcGVjVGVzdHMsIGltcG9ydGxpYj1pbXBvcnRsaWIsIG1hY2hpbmVyeT1tYWNoaW5lcnkpCiAKIAogY2xhc3MgUGF0aEVudHJ5RmluZGVyVGVzdHM6CiAKKyAgICBkZWYgdGVzdF9maW5kZXJfd2l0aF9mYWlsaW5nX2ZpbmRfc3BlYyhzZWxmKToKKyAgICAgICAgIyBQYXRoRW50cnlGaW5kZXIgd2l0aCBmaW5kX21vZHVsZSgpIGRlZmluZWQgc2hvdWxkIHdvcmsuCisgICAgICAgICMgSXNzdWUgIzIwNzYzLgorICAgICAgICBjbGFzcyBGaW5kZXI6CisgICAgICAgICAgICBwYXRoX2xvY2F0aW9uID0gJ3Rlc3RfZmluZGVyX3dpdGhfZmluZF9tb2R1bGUnCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CisgICAgICAgICAgICAgICAgaWYgcGF0aCAhPSBzZWxmLnBhdGhfbG9jYXRpb246CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yCisKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiBmaW5kX21vZHVsZShmdWxsbmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworCisgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aD1bRmluZGVyLnBhdGhfbG9jYXRpb25dK3N5cy5wYXRoWzpdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfaG9va3M9W0ZpbmRlcl0pOgorICAgICAgICAgICAgc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX3NwZWMoJ2ltcG9ydGxpYicpCisKICAgICBkZWYgdGVzdF9maW5kZXJfd2l0aF9mYWlsaW5nX2ZpbmRfbW9kdWxlKHNlbGYpOgogICAgICAgICAjIFBhdGhFbnRyeUZpbmRlciB3aXRoIGZpbmRfbW9kdWxlKCkgZGVmaW5lZCBzaG91bGQgd29yay4KICAgICAgICAgIyBJc3N1ZSAjMjA3NjMuCkBAIC0yMDcsNyArMjQ1LDcgQEAKIAogICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKHBhdGg9W0ZpbmRlci5wYXRoX2xvY2F0aW9uXStzeXMucGF0aFs6XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2hvb2tzPVtGaW5kZXJdKToKLSAgICAgICAgICAgIHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCdpbXBvcnRsaWInKQorICAgICAgICAgICAgc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZSgnaW1wb3J0bGliJykKIAogCiAoRnJvemVuX1BFRlRlc3RzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3JlbGF0aXZlX2ltcG9ydHMucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcmVsYXRpdmVfaW1wb3J0cy5weQppbmRleCAzYmI4MTlmLi44YTk1YTMyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcmVsYXRpdmVfaW1wb3J0cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcmVsYXRpdmVfaW1wb3J0cy5weQpAQCAtMSw3ICsxLDggQEAKICIiIlRlc3QgcmVsYXRpdmUgaW1wb3J0cyAoUEVQIDMyOCkuIiIiCiBmcm9tIC4uIGltcG9ydCB1dGlsCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworCiAKIGNsYXNzIFJlbGF0aXZlSW1wb3J0czoKIApAQCAtNjUsOSArNjYsMTEgQEAKICAgICAgICAgICAgICAgICB1bmNhY2hlX25hbWVzLmFwcGVuZChuYW1lWzotbGVuKCcuX19pbml0X18nKV0pCiAgICAgICAgIHdpdGggdXRpbC5tb2NrX3NwZWMoKmNyZWF0ZSkgYXMgaW1wb3J0ZXI6CiAgICAgICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKG1ldGFfcGF0aD1baW1wb3J0ZXJdKToKLSAgICAgICAgICAgICAgICBmb3IgZ2xvYmFsXyBpbiBnbG9iYWxzXzoKLSAgICAgICAgICAgICAgICAgICAgd2l0aCB1dGlsLnVuY2FjaGUoKnVuY2FjaGVfbmFtZXMpOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZ2xvYmFsXykKKyAgICAgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgICAgICAgICAgZm9yIGdsb2JhbF8gaW4gZ2xvYmFsc186CisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHV0aWwudW5jYWNoZSgqdW5jYWNoZV9uYW1lcyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZ2xvYmFsXykKIAogCiAgICAgZGVmIHRlc3RfbW9kdWxlX2Zyb21fbW9kdWxlKHNlbGYpOgpAQCAtMjA0LDExICsyMDcsMTggQEAKIAogICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydF9ub19nbG9iYWxzKHNlbGYpOgogICAgICAgICAjIE5vIGdsb2JhbHMgZm9yIGEgcmVsYXRpdmUgaW1wb3J0IGlzIGFuIGVycm9yLgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKLSAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygnc3lzJywgbGV2ZWw9MSkKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCdzeXMnLCBsZXZlbD0xKQorCisgICAgZGVmIHRlc3RfcmVsYXRpdmVfaW1wb3J0X25vX3BhY2thZ2Uoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgorICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCdhJywgeydfX3BhY2thZ2VfXyc6ICcnLCAnX19zcGVjX18nOiBOb25lfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbD0xKQogCiAgICAgZGVmIHRlc3RfcmVsYXRpdmVfaW1wb3J0X25vX3BhY2thZ2VfZXhpc3RzX2Fic29sdXRlKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUVycm9yKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcik6CiAgICAgICAgICAgICBzZWxmLl9faW1wb3J0X18oJ3N5cycsIHsnX19wYWNrYWdlX18nOiAnJywgJ19fc3BlY19fJzogTm9uZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9MSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvcmVncnRlc3QucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9yZWdydGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViZTExZi4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9yZWdydGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSIiIlJ1biBQeXRob24ncyBzdGFuZGFyZCB0ZXN0IHN1aXRlIHVzaW5nIGltcG9ydGxpYi5fX2ltcG9ydF9fLgotCi1UZXN0cyBrbm93biB0byBmYWlsIGJlY2F1c2Ugb2YgYXNzdW1wdGlvbnMgdGhhdCBpbXBvcnRsaWIgKHByb3Blcmx5KQotaW52YWxpZGF0ZXMgYXJlIGF1dG9tYXRpY2FsbHkgc2tpcHBlZCBpZiB0aGUgZW50aXJlIHRlc3Qgc3VpdGUgaXMgcnVuLgotT3RoZXJ3aXNlIGFsbCBjb21tYW5kLWxpbmUgb3B0aW9ucyB2YWxpZCBmb3IgdGVzdC5yZWdydGVzdCBhcmUgYWxzbyB2YWxpZCBmb3IKLXRoaXMgc2NyaXB0LgotCi0iIiIKLWltcG9ydCBpbXBvcnRsaWIKLWltcG9ydCBzeXMKLWZyb20gdGVzdCBpbXBvcnQgcmVncnRlc3QKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBfX2J1aWx0aW5zX18uX19pbXBvcnRfXyA9IGltcG9ydGxpYi5fX2ltcG9ydF9fCi0gICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY2xlYXIoKQotCi0gICAgcmVncnRlc3QubWFpbihxdWlldD1UcnVlLCB2ZXJib3NlMj1UcnVlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkKaW5kZXggMzRiODZjZC4uMTJjZTBjYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9jYXNlX3NlbnNpdGl2aXR5LnB5CkBAIC01LDcgKzUsNiBAQAogbWFjaGluZXJ5ID0gdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWIubWFjaGluZXJ5JykKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQgYXMgdGVzdF9zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfZmlsZV9sb2FkZXIucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9maWxlX2xvYWRlci5weQppbmRleCA3M2Y0YzYyLi5hMTUxMTQ5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9maWxlX2xvYWRlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9maWxlX2xvYWRlci5weQpAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgICAgICAjIFBFUCAzMDIKICAgICAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKICAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgICAgICBtb2QgPSBsb2FkZXIubG9hZF9tb2R1bGUoJ190ZW1wJykgIyBYWFgKKyAgICAgICAgICAgICAgICBtb2QgPSBsb2FkZXIubG9hZF9tb2R1bGUoJ190ZW1wJykKICAgICAgICAgICAgICMgU2FuaXR5IGNoZWNrcy4KICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLl9fY2FjaGVkX18sIGNvbXBpbGVkKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QueCwgNSkKQEAgLTI0NSwxMiArMjQ1LDcgQEAKIGNsYXNzIEJhZEJ5dGVjb2RlVGVzdDoKIAogICAgIGRlZiBpbXBvcnRfKHNlbGYsIGZpbGUsIG1vZHVsZV9uYW1lKToKLSAgICAgICAgbG9hZGVyID0gc2VsZi5sb2FkZXIobW9kdWxlX25hbWUsIGZpbGUpCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICAgICAgIyBYWFggQ2hhbmdlIHRvIHVzZSBleGVjX21vZHVsZSgpLgotICAgICAgICAgICAgbW9kdWxlID0gbG9hZGVyLmxvYWRfbW9kdWxlKG1vZHVsZV9uYW1lKQotICAgICAgICBzZWxmLmFzc2VydEluKG1vZHVsZV9uYW1lLCBzeXMubW9kdWxlcykKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogCiAgICAgZGVmIG1hbmlwdWxhdGVfYnl0ZWNvZGUoc2VsZiwgbmFtZSwgbWFwcGluZywgbWFuaXB1bGF0b3IsICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsX3NvdXJjZT1GYWxzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9wYXRoX2hvb2sucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9wYXRoX2hvb2sucHkKaW5kZXggZTZhMjQxNS4uNzk1ZDQzNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfcGF0aF9ob29rLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X3BhdGhfaG9vay5weQpAQCAtMTYsMTAgKzE2LDE5IEBACiAgICAgZGVmIHRlc3Rfc3VjY2VzcyhzZWxmKToKICAgICAgICAgd2l0aCB1dGlsLmNyZWF0ZV9tb2R1bGVzKCdkdW1teScpIGFzIG1hcHBpbmc6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzZWxmLnBhdGhfaG9vaygpKG1hcHBpbmdbJy5yb290J10pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmRfbW9kdWxlJykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluZF9zcGVjJykpCisKKyAgICBkZWYgdGVzdF9zdWNjZXNzX2xlZ2FjeShzZWxmKToKKyAgICAgICAgd2l0aCB1dGlsLmNyZWF0ZV9tb2R1bGVzKCdkdW1teScpIGFzIG1hcHBpbmc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzZWxmLnBhdGhfaG9vaygpKG1hcHBpbmdbJy5yb290J10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmRfbW9kdWxlJykpCiAKICAgICBkZWYgdGVzdF9lbXB0eV9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgVGhlIGVtcHR5IHN0cmluZyByZXByZXNlbnRzIHRoZSBjd2QuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNlbGYucGF0aF9ob29rKCkoJycpLCAnZmluZF9zcGVjJykpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zdHJpbmdfbGVnYWN5KHNlbGYpOgorICAgICAgICAjIFRoZSBlbXB0eSBzdHJpbmcgcmVwcmVzZW50cyB0aGUgY3dkLgogICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzZWxmLnBhdGhfaG9vaygpKCcnKSwgJ2ZpbmRfbW9kdWxlJykpCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3Rfc291cmNlX2VuY29kaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3Rfc291cmNlX2VuY29kaW5nLnB5CmluZGV4IDFlMDc3MWIuLjk4MDg1NWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X3NvdXJjZV9lbmNvZGluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9zb3VyY2VfZW5jb2RpbmcucHkKQEAgLTUsNyArNSw2IEBACiBpbXBvcnQgY29kZWNzCiBpbXBvcnQgaW1wb3J0bGliLnV0aWwKIGltcG9ydCByZQotaW1wb3J0IHN5cwogaW1wb3J0IHR5cGVzCiAjIEJlY2F1c2Ugc3lzLnBhdGggZ2V0cyBlc3NlbnRpYWxseSBibGFua2VkLCBuZWVkIHRvIGhhdmUgdW5pY29kZWRhdGEgYWxyZWFkeQogIyBpbXBvcnRlZCBmb3IgdGhlIHBhcnNlciB0byB1c2UuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FiYy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfYWJjLnB5CmluZGV4IGQ0YmY5MTUuLmM4NjI0ODAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfYWJjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfYWJjLnB5CkBAIC0yMDcsNiArMjA3LDEwIEBACiAKICAgICBTUExJVCA9IG1ha2VfYWJjX3N1YmNsYXNzZXMoTG9hZGVyKQogCisgICAgZGVmIHRlc3RfY3JlYXRlX21vZHVsZShzZWxmKToKKyAgICAgICAgc3BlYyA9ICdhIHNwZWMnCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuaW5zLmNyZWF0ZV9tb2R1bGUoc3BlYykpCisKICAgICBkZWYgdGVzdF9sb2FkX21vZHVsZShzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcik6CiAgICAgICAgICAgICBzZWxmLmlucy5sb2FkX21vZHVsZSgnc29tZXRoaW5nJykKQEAgLTUxOSw2ICs1MjMsMTIgQEAKICAgICAgICAgc3VwcG9ydC51bmxvYWQoc2VsZi5tb2R1bGVfbmFtZSkKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5sb2FkLCBzZWxmLm1vZHVsZV9uYW1lKQogCisgICAgZGVmIGxvYWQoc2VsZiwgbG9hZGVyKToKKyAgICAgICAgc3BlYyA9IHNlbGYudXRpbC5zcGVjX2Zyb21fbG9hZGVyKHNlbGYubW9kdWxlX25hbWUsIGxvYWRlcikKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5pbml0Ll9ib290c3RyYXAuX2xvYWRfdW5sb2NrZWQoc3BlYykKKwogICAgIGRlZiBtb2NrX2dldF9jb2RlKHNlbGYpOgogICAgICAgICByZXR1cm4gbW9jay5wYXRjaC5vYmplY3Qoc2VsZi5JbnNwZWN0TG9hZGVyU3ViY2xhc3MsICdnZXRfY29kZScpCiAKQEAgLTUyOCw5ICs1MzgsNyBAQAogICAgICAgICAgICAgbW9ja2VkX2dldF9jb2RlLnNpZGVfZWZmZWN0ID0gSW1wb3J0RXJyb3IKICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgogICAgICAgICAgICAgICAgIGxvYWRlciA9IHNlbGYuSW5zcGVjdExvYWRlclN1YmNsYXNzKCkKLSAgICAgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICAgICAgICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUoc2VsZi5tb2R1bGVfbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxvYWQobG9hZGVyKQogCiAgICAgZGVmIHRlc3RfZ2V0X2NvZGVfTm9uZShzZWxmKToKICAgICAgICAgIyBJZiBnZXRfY29kZSgpIHJldHVybnMgTm9uZSwgcmFpc2UgSW1wb3J0RXJyb3IuCkBAIC01MzgsNyArNTQ2LDcgQEAKICAgICAgICAgICAgIG1vY2tlZF9nZXRfY29kZS5yZXR1cm5fdmFsdWUgPSBOb25lCiAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKICAgICAgICAgICAgICAgICBsb2FkZXIgPSBzZWxmLkluc3BlY3RMb2FkZXJTdWJjbGFzcygpCi0gICAgICAgICAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKHNlbGYubW9kdWxlX25hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5sb2FkKGxvYWRlcikKIAogICAgIGRlZiB0ZXN0X21vZHVsZV9yZXR1cm5lZChzZWxmKToKICAgICAgICAgIyBUaGUgbG9hZGVkIG1vZHVsZSBzaG91bGQgYmUgcmV0dXJuZWQuCkBAIC01NDYsMTQgKzU1NCwxNiBAQAogICAgICAgICB3aXRoIHNlbGYubW9ja19nZXRfY29kZSgpIGFzIG1vY2tlZF9nZXRfY29kZToKICAgICAgICAgICAgIG1vY2tlZF9nZXRfY29kZS5yZXR1cm5fdmFsdWUgPSBjb2RlCiAgICAgICAgICAgICBsb2FkZXIgPSBzZWxmLkluc3BlY3RMb2FkZXJTdWJjbGFzcygpCi0gICAgICAgICAgICBtb2R1bGUgPSBsb2FkZXIubG9hZF9tb2R1bGUoc2VsZi5tb2R1bGVfbmFtZSkKKyAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYubG9hZChsb2FkZXIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZSwgc3lzLm1vZHVsZXNbc2VsZi5tb2R1bGVfbmFtZV0pCiAKIAogKEZyb3plbl9JTExvYWRNb2R1bGVUZXN0cywKICBTb3VyY2VfSUxMb2FkTW9kdWxlVGVzdHMKICApID0gdGVzdF91dGlsLnRlc3RfYm90aChJbnNwZWN0TG9hZGVyTG9hZE1vZHVsZVRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEluc3BlY3RMb2FkZXJTdWJjbGFzcz1TUExJVF9JTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnNwZWN0TG9hZGVyU3ViY2xhc3M9U1BMSVRfSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdD1pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWw9dXRpbCkKIAogCiAjIyMjIyBFeGVjdXRpb25Mb2FkZXIgY29uY3JldGUgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9hcGkucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FwaS5weQppbmRleCA2YmMzYzU2Li5iMGE5NGFhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FwaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FwaS5weQpAQCAtOTksOSArOTksNyBAQAogCiBjbGFzcyBGaW5kTG9hZGVyVGVzdHM6CiAKLSAgICBjbGFzcyBGYWtlTWV0YUZpbmRlcjoKLSAgICAgICAgQHN0YXRpY21ldGhvZAotICAgICAgICBkZWYgZmluZF9tb2R1bGUobmFtZSwgcGF0aD1Ob25lKTogcmV0dXJuIG5hbWUsIHBhdGgKKyAgICBGYWtlTWV0YUZpbmRlciA9IE5vbmUKIAogICAgIGRlZiB0ZXN0X3N5c19tb2R1bGVzKHNlbGYpOgogICAgICAgICAjIElmIGEgbW9kdWxlIHdpdGggX19sb2FkZXJfXyBpcyBpbiBzeXMubW9kdWxlcywgdGhlbiByZXR1cm4gaXQuCkBAIC0xNzEsOSArMTY5LDMwIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLmluaXQuZmluZF9sb2FkZXIoJ25ldmVyZ29pbmd0b2ZpbmR0aGlzbW9kdWxlJykpCiAKIAotKEZyb3plbl9GaW5kTG9hZGVyVGVzdHMsCi0gU291cmNlX0ZpbmRMb2FkZXJUZXN0cwotICkgPSB0ZXN0X3V0aWwudGVzdF9ib3RoKEZpbmRMb2FkZXJUZXN0cywgaW5pdD1pbml0KQorY2xhc3MgRmluZExvYWRlclBFUDQ1MVRlc3RzKEZpbmRMb2FkZXJUZXN0cyk6CisKKyAgICBjbGFzcyBGYWtlTWV0YUZpbmRlcjoKKyAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICBkZWYgZmluZF9zcGVjKG5hbWUsIHBhdGg9Tm9uZSwgdGFyZ2V0PU5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmVyeVsnU291cmNlJ10uTW9kdWxlU3BlYyhuYW1lLCAobmFtZSwgcGF0aCkpCisKKworKEZyb3plbl9GaW5kTG9hZGVyUEVQNDUxVGVzdHMsCisgU291cmNlX0ZpbmRMb2FkZXJQRVA0NTFUZXN0cworICkgPSB0ZXN0X3V0aWwudGVzdF9ib3RoKEZpbmRMb2FkZXJQRVA0NTFUZXN0cywgaW5pdD1pbml0KQorCisKK2NsYXNzIEZpbmRMb2FkZXJQRVAzMDJUZXN0cyhGaW5kTG9hZGVyVGVzdHMpOgorCisgICAgY2xhc3MgRmFrZU1ldGFGaW5kZXI6CisgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgZGVmIGZpbmRfbW9kdWxlKG5hbWUsIHBhdGg9Tm9uZSk6CisgICAgICAgICAgICByZXR1cm4gbmFtZSwgcGF0aAorCisKKyhGcm96ZW5fRmluZExvYWRlclBFUDMwMlRlc3RzLAorIFNvdXJjZV9GaW5kTG9hZGVyUEVQMzAyVGVzdHMKKyApID0gdGVzdF91dGlsLnRlc3RfYm90aChGaW5kTG9hZGVyUEVQMzAyVGVzdHMsIGluaXQ9aW5pdCkKIAogCiBjbGFzcyBSZWxvYWRUZXN0czoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbGF6eS5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbGF6eS5weQppbmRleCBjYzM4M2MyLi5mZmQ4ZGM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xhenkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9sYXp5LnB5CkBAIC02Niw2ICs2Niw4IEBACiAgICAgICAgIHNwZWMgPSB1dGlsLnNwZWNfZnJvbV9sb2FkZXIoVGVzdGluZ0ltcG9ydGVyLm1vZHVsZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuTGF6eUxvYWRlcihsb2FkZXIpKQogICAgICAgICBtb2R1bGUgPSBzcGVjLmxvYWRlci5jcmVhdGVfbW9kdWxlKHNwZWMpCisgICAgICAgIGlmIG1vZHVsZSBpcyBOb25lOgorICAgICAgICAgICAgbW9kdWxlID0gdHlwZXMuTW9kdWxlVHlwZShUZXN0aW5nSW1wb3J0ZXIubW9kdWxlX25hbWUpCiAgICAgICAgIG1vZHVsZS5fX3NwZWNfXyA9IHNwZWMKICAgICAgICAgbW9kdWxlLl9fbG9hZGVyX18gPSBzcGVjLmxvYWRlcgogICAgICAgICBzcGVjLmxvYWRlci5leGVjX21vZHVsZShtb2R1bGUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xvY2tzLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9sb2Nrcy5weQppbmRleCBkZjBhZjEyLi5iMmFhZGZmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xvY2tzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbG9ja3MucHkKQEAgLTMsNyArMyw2IEBACiBpbml0ID0gdGVzdF91dGlsLmltcG9ydF9pbXBvcnRsaWIoJ2ltcG9ydGxpYicpCiAKIGltcG9ydCBzeXMKLWltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3ZWFrcmVmCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbmFtZXNwYWNlX3BrZ3MucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X25hbWVzcGFjZV9wa2dzLnB5CmluZGV4IDY2Mzk2MTIuLmUzN2Q4YTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbmFtZXNwYWNlX3BrZ3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9uYW1lc3BhY2VfcGtncy5weQpAQCAtMSwxMyArMSwxMCBAQAogaW1wb3J0IGNvbnRleHRsaWIKLWltcG9ydCBpbXBvcnRsaWIuYWJjCi1pbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeQoraW1wb3J0IGltcG9ydGxpYgogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1pbXBvcnQgdHlwZXMKIGltcG9ydCB1bml0dGVzdAogCiBmcm9tIHRlc3QudGVzdF9pbXBvcnRsaWIgaW1wb3J0IHV0aWwKLWZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKIAogIyBuZWVkZWQgdGVzdHM6CiAjCkBAIC03MSw2ICs2OCw3IEBACiAgICAgICAgICMgVE9ETzogd2lsbCB3ZSBldmVyIHdhbnQgdG8gcGFzcyBleGNfaW5mbyB0byBfX2V4aXRfXz8KICAgICAgICAgc2VsZi5jdHguX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSkKIAorCiBjbGFzcyBTaW5nbGVOYW1lc3BhY2VQYWNrYWdlKE5hbWVzcGFjZVBhY2thZ2VUZXN0KToKICAgICBwYXRocyA9IFsncG9ydGlvbjEnXQogCkBAIC04Nyw3ICs4NSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmb28pLCAiPG1vZHVsZSAnZm9vJyAobmFtZXNwYWNlKT4iKQogCiAKLWNsYXNzIER5bmFtaWNQYXRoZU5hbWVzcGFjZVBhY2thZ2UoTmFtZXNwYWNlUGFja2FnZVRlc3QpOgorY2xhc3MgRHluYW1pY1BhdGhOYW1lc3BhY2VQYWNrYWdlKE5hbWVzcGFjZVBhY2thZ2VUZXN0KToKICAgICBwYXRocyA9IFsncG9ydGlvbjEnXQogCiAgICAgZGVmIHRlc3RfZHluYW1pY19wYXRoKHNlbGYpOgpAQCAtMjg5LDUgKzI4NywzNSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFfdGVzdC5hdHRyLCAnaW4gbW9kdWxlJykKIAogCitjbGFzcyBSZWxvYWRUZXN0cyhOYW1lc3BhY2VQYWNrYWdlVGVzdCk6CisgICAgcGF0aHMgPSBbJ3BvcnRpb24xJ10KKworICAgIGRlZiB0ZXN0X3NpbXBsZV9wYWNrYWdlKHNlbGYpOgorICAgICAgICBpbXBvcnQgZm9vLm9uZQorICAgICAgICBmb28gPSBpbXBvcnRsaWIucmVsb2FkKGZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28ub25lLmF0dHIsICdwb3J0aW9uMSBmb28gb25lJykKKworICAgIGRlZiB0ZXN0X2NhbnRfaW1wb3J0X290aGVyKHNlbGYpOgorICAgICAgICBpbXBvcnQgZm9vCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgorICAgICAgICAgICAgaW1wb3J0IGZvby50d28KKyAgICAgICAgZm9vID0gaW1wb3J0bGliLnJlbG9hZChmb28pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgorICAgICAgICAgICAgaW1wb3J0IGZvby50d28KKworICAgIGRlZiB0ZXN0X2R5bmFtaWNfcGF0aChzZWxmKToKKyAgICAgICAgaW1wb3J0IGZvby5vbmUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcik6CisgICAgICAgICAgICBpbXBvcnQgZm9vLnR3bworCisgICAgICAgICMgTm93IG1vZGlmeSBzeXMucGF0aCBhbmQgcmVsb2FkLgorICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHNlbGYucm9vdCwgJ3BvcnRpb24yJykpCisgICAgICAgIGZvbyA9IGltcG9ydGxpYi5yZWxvYWQoZm9vKQorCisgICAgICAgICMgQW5kIG1ha2Ugc3VyZSBmb28udHdvIGlzIG5vdyBpbXBvcnRhYmxlCisgICAgICAgIGltcG9ydCBmb28udHdvCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLnR3by5hdHRyLCAncG9ydGlvbjIgZm9vIHR3bycpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3Rfc3BlYy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3Rfc3BlYy5weQppbmRleCA4YjMzM2U4Li41YTE2YTAzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X3NwZWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9zcGVjLnB5CkBAIC01LDYgKzUsNyBAQAogdXRpbCA9IHRlc3RfdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWIudXRpbCcpCiAKIGltcG9ydCBvcy5wYXRoCitpbXBvcnQgcGF0aGxpYgogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IENsZWFuSW1wb3J0CiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzeXMKQEAgLTY1OSw2ICs2NjAsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGVjLmNhY2hlZCwgc2VsZi5jYWNoZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGVjLmhhc19sb2NhdGlvbikKIAorICAgIGRlZiB0ZXN0X3NwZWNfZnJvbV9maWxlX2xvY2F0aW9uX3BhdGhfbGlrZV9hcmcoc2VsZik6CisgICAgICAgIHNwZWMgPSBzZWxmLnV0aWwuc3BlY19mcm9tX2ZpbGVfbG9jYXRpb24oc2VsZi5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhsaWIuUHVyZVBhdGgoc2VsZi5wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGVjLm9yaWdpbiwgc2VsZi5wYXRoKQorCiAgICAgZGVmIHRlc3Rfc3BlY19mcm9tX2ZpbGVfbG9jYXRpb25fZGVmYXVsdF93aXRob3V0X2xvY2F0aW9uKHNlbGYpOgogICAgICAgICBzcGVjID0gc2VsZi51dGlsLnNwZWNfZnJvbV9maWxlX2xvY2F0aW9uKHNlbGYubmFtZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF91dGlsLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF91dGlsLnB5CmluZGV4IDQxY2EzMzMuLmQ2MTUzNzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfdXRpbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X3V0aWwucHkKQEAgLTUsNiArNSw3IEBACiBpbXBvcnRsaWJfdXRpbCA9IHV0aWwuaW1wb3J0X2ltcG9ydGxpYignaW1wb3J0bGliLnV0aWwnKQogCiBpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCiBpbXBvcnQgc3RyaW5nCiBpbXBvcnQgc3lzCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKQEAgLTQ2LDE0ICs0Nyw4IEBACiAgICAgICAgICAgICBkZWYgZXhlY19tb2R1bGUoc2VsZiwgbW9kdWxlKToKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIHNwZWMgPSBzZWxmLm1hY2hpbmVyeS5Nb2R1bGVTcGVjKCd0ZXN0JywgTG9hZGVyKCkpCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Fsd2F5cycpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgogICAgICAgICAgICAgbW9kdWxlID0gc2VsZi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoc3BlYykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4odykpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHdbMF0uY2F0ZWdvcnksIERlcHJlY2F0aW9uV2FybmluZykpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2NyZWF0ZV9tb2R1bGUnLCBzdHIod1swXS5tZXNzYWdlKSkKLSAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1vZHVsZSwgdHlwZXMuTW9kdWxlVHlwZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sIHNwZWMubmFtZSkKIAogICAgIGRlZiB0ZXN0X2NyZWF0ZV9tb2R1bGVfcmV0dXJuc19Ob25lKHNlbGYpOgogICAgICAgICBjbGFzcyBMb2FkZXIoc2VsZi5hYmMuTG9hZGVyKToKQEAgLTY3Nyw2ICs2NzIsMTUgQEAKICAgICAgICAgICAgICdcXGZvb1xcYmFyXFxiYXpcXF9fcHljYWNoZV9fXFxxdXgue30ucHljJy5mb3JtYXQoc2VsZi50YWcpKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLmltcGxlbWVudGF0aW9uLmNhY2hlX3RhZyBpcyBub3QgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAncmVxdWlyZXMgc3lzLmltcGxlbWVudGF0aW9uLmNhY2hlX3RhZyBub3QgYmUgTm9uZScpCisgICAgZGVmIHRlc3Rfc291cmNlX2Zyb21fY2FjaGVfcGF0aF9saWtlX2FyZyhzZWxmKToKKyAgICAgICAgcGF0aCA9IHBhdGhsaWIuUHVyZVBhdGgoJ2ZvbycsICdiYXInLCAnYmF6JywgJ3F1eC5weScpCisgICAgICAgIGV4cGVjdCA9IG9zLnBhdGguam9pbignZm9vJywgJ2JhcicsICdiYXonLCAnX19weWNhY2hlX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1eC57fS5weWMnLmZvcm1hdChzZWxmLnRhZykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi51dGlsLmNhY2hlX2Zyb21fc291cmNlKHBhdGgsIG9wdGltaXphdGlvbj0nJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLmltcGxlbWVudGF0aW9uLmNhY2hlX3RhZyBpcyBub3QgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAncmVxdWlyZXMgc3lzLmltcGxlbWVudGF0aW9uLmNhY2hlX3RhZyB0byBub3QgYmUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICdOb25lJykKICAgICBkZWYgdGVzdF9zb3VyY2VfZnJvbV9jYWNoZShzZWxmKToKQEAgLTczOCw2ICs3NDIsMTUgQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKICAgICAgICAgICAgIHNlbGYudXRpbC5zb3VyY2VfZnJvbV9jYWNoZShwYXRoKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLmltcGxlbWVudGF0aW9uLmNhY2hlX3RhZyBpcyBub3QgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAncmVxdWlyZXMgc3lzLmltcGxlbWVudGF0aW9uLmNhY2hlX3RhZyB0byBub3QgYmUgJworICAgICAgICAgICAgICAgICAgICAgICAgICdOb25lJykKKyAgICBkZWYgdGVzdF9zb3VyY2VfZnJvbV9jYWNoZV9wYXRoX2xpa2VfYXJnKHNlbGYpOgorICAgICAgICBwYXRoID0gcGF0aGxpYi5QdXJlUGF0aCgnZm9vJywgJ2JhcicsICdiYXonLCAnX19weWNhY2hlX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXV4Lnt9LnB5YycuZm9ybWF0KHNlbGYudGFnKSkKKyAgICAgICAgZXhwZWN0ID0gb3MucGF0aC5qb2luKCdmb28nLCAnYmFyJywgJ2JheicsICdxdXgucHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudXRpbC5zb3VyY2VfZnJvbV9jYWNoZShwYXRoKSwgZXhwZWN0KQorCiAKIChGcm96ZW5fUEVQMzE0N1Rlc3RzLAogIFNvdXJjZV9QRVAzMTQ3VGVzdHMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3Rfd2luZG93cy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3Rfd2luZG93cy5weQppbmRleCBjODkzYmNmLi4wMDViNjg1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X3dpbmRvd3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF93aW5kb3dzLnB5CkBAIC00MCw3ICs0MCw3IEBACiAgICAgZWxzZToKICAgICAgICAgcm9vdCA9IG1hY2hpbmVyeS5XaW5kb3dzUmVnaXN0cnlGaW5kZXIuUkVHSVNUUllfS0VZCiAgICAga2V5ID0gcm9vdC5mb3JtYXQoZnVsbG5hbWU9bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBzeXNfdmVyc2lvbj1zeXMudmVyc2lvbls6M10pCisgICAgICAgICAgICAgICAgICAgICAgc3lzX3ZlcnNpb249JyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKQogICAgIHRyeToKICAgICAgICAgd2l0aCB0ZW1wX21vZHVsZShuYW1lLCAiYSA9IDEiKSBhcyBsb2NhdGlvbjoKICAgICAgICAgICAgIHN1YmtleSA9IENyZWF0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwga2V5KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CmluZGV4IDY3MWUwNWEuLjk3NjM0ZTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKQEAgLTMwLDYgKzMwLDcgQEAKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZQogZnJvbSB0ZXN0IGltcG9ydCBpbnNwZWN0X2ZvZGRlciBhcyBtb2QKIGZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIyIGFzIG1vZDIKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiBmcm9tIHRlc3QudGVzdF9pbXBvcnQgaW1wb3J0IF9yZWFkeV90b19pbXBvcnQKIApAQCAtMzgsNyArMzksNyBAQAogIyBpc21vZHVsZSwgaXNjbGFzcywgaXNtZXRob2QsIGlzZnVuY3Rpb24sIGlzdHJhY2ViYWNrLCBpc2ZyYW1lLCBpc2NvZGUsCiAjIGlzYnVpbHRpbiwgaXNyb3V0aW5lLCBpc2dlbmVyYXRvciwgaXNnZW5lcmF0b3JmdW5jdGlvbiwgZ2V0bWVtYmVycywKICMgZ2V0ZG9jLCBnZXRmaWxlLCBnZXRtb2R1bGUsIGdldHNvdXJjZWZpbGUsIGdldGNvbW1lbnRzLCBnZXRzb3VyY2UsCi0jIGdldGNsYXNzdHJlZSwgZ2V0YXJnc3BlYywgZ2V0YXJndmFsdWVzLCBmb3JtYXRhcmdzcGVjLCBmb3JtYXRhcmd2YWx1ZXMsCisjIGdldGNsYXNzdHJlZSwgZ2V0YXJndmFsdWVzLCBmb3JtYXRhcmdzcGVjLCBmb3JtYXRhcmd2YWx1ZXMsCiAjIGN1cnJlbnRmcmFtZSwgc3RhY2ssIHRyYWNlLCBpc2RhdGFkZXNjcmlwdG9yCiAKICMgTk9URTogVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCB0ZXN0cyByZWxhdGluZyB0byBpbnRlcmFjdGlvbiB3aXRoCkBAIC02NCw3ICs2NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2ZyYW1lLCBpbnNwZWN0LmlzZnVuY3Rpb24sIGluc3BlY3QuaXNtZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgaW5zcGVjdC5pc21vZHVsZSwgaW5zcGVjdC5pc3RyYWNlYmFjaywKICAgICAgICAgICAgICAgICAgICAgICBpbnNwZWN0LmlzZ2VuZXJhdG9yLCBpbnNwZWN0LmlzZ2VuZXJhdG9yZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2Nvcm91dGluZSwgaW5zcGVjdC5pc2Nvcm91dGluZWZ1bmN0aW9uXSkKKyAgICAgICAgICAgICAgICAgICAgICBpbnNwZWN0LmlzY29yb3V0aW5lLCBpbnNwZWN0LmlzY29yb3V0aW5lZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2FzeW5jZ2VuLCBpbnNwZWN0LmlzYXN5bmNnZW5mdW5jdGlvbl0pCiAKICAgICBkZWYgaXN0ZXN0KHNlbGYsIHByZWRpY2F0ZSwgZXhwKToKICAgICAgICAgb2JqID0gZXZhbChleHApCkBAIC03Miw2ICs3NCw3IEBACiAKICAgICAgICAgZm9yIG90aGVyIGluIHNlbGYucHJlZGljYXRlcyAtIHNldChbcHJlZGljYXRlXSk6CiAgICAgICAgICAgICBpZiAocHJlZGljYXRlID09IGluc3BlY3QuaXNnZW5lcmF0b3JmdW5jdGlvbiBvciBcCisgICAgICAgICAgICAgICBwcmVkaWNhdGUgPT0gaW5zcGVjdC5pc2FzeW5jZ2VuZnVuY3Rpb24gb3IgXAogICAgICAgICAgICAgICAgcHJlZGljYXRlID09IGluc3BlY3QuaXNjb3JvdXRpbmVmdW5jdGlvbikgYW5kIFwKICAgICAgICAgICAgICAgIG90aGVyID09IGluc3BlY3QuaXNmdW5jdGlvbjoKICAgICAgICAgICAgICAgICBjb250aW51ZQpAQCAtODEsNiArODQsMTAgQEAKICAgICBmb3IgaSBpbiByYW5nZSgyKToKICAgICAgICAgeWllbGQgaQogCithc3luYyBkZWYgYXN5bmNfZ2VuZXJhdG9yX2Z1bmN0aW9uX2V4YW1wbGUoc2VsZik6CisgICAgYXN5bmMgZm9yIGkgaW4gcmFuZ2UoMik6CisgICAgICAgIHlpZWxkIGkKKwogYXN5bmMgZGVmIGNvcm91dGluZV9mdW5jdGlvbl9leGFtcGxlKHNlbGYpOgogICAgIHJldHVybiAnc3BhbScKIApAQCAtMTIxLDYgKzEyOCwxMCBAQAogICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzZGF0YWRlc2NyaXB0b3IsICdjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdC5kZWZhdWx0X2ZhY3RvcnknKQogICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzZ2VuZXJhdG9yLCAnKHggZm9yIHggaW4gcmFuZ2UoMikpJykKICAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2dlbmVyYXRvcmZ1bmN0aW9uLCAnZ2VuZXJhdG9yX2Z1bmN0aW9uX2V4YW1wbGUnKQorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzYXN5bmNnZW4sCisgICAgICAgICAgICAgICAgICAgICdhc3luY19nZW5lcmF0b3JfZnVuY3Rpb25fZXhhbXBsZSgxKScpCisgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNhc3luY2dlbmZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAnYXN5bmNfZ2VuZXJhdG9yX2Z1bmN0aW9uX2V4YW1wbGUnKQogCiAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKQEAgLTQwMCw3ICs0MTEsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vcm1jYXNlKGluc3BlY3QuZ2V0c291cmNlZmlsZShtb2Quc3BhbSkpLCBtb2RmaWxlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vcm1jYXNlKGluc3BlY3QuZ2V0c291cmNlZmlsZShnaXQuYWJ1c2UpKSwgbW9kZmlsZSkKICAgICAgICAgZm4gPSAiX25vbl9leGlzdGluZ19maWxlbmFtZV91c2VkX2Zvcl9zb3VyY2VmaWxlX3Rlc3QucHkiCi0gICAgICAgIGNvID0gY29tcGlsZSgiTm9uZSIsIGZuLCAiZXhlYyIpCisgICAgICAgIGNvID0gY29tcGlsZSgieD0xIiwgZm4sICJleGVjIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldHNvdXJjZWZpbGUoY28pLCBOb25lKQogICAgICAgICBsaW5lY2FjaGUuY2FjaGVbY28uY29fZmlsZW5hbWVdID0gKDEsIE5vbmUsICJOb25lIiwgY28uY29fZmlsZW5hbWUpCiAgICAgICAgIHRyeToKQEAgLTI5MDIsNiArMjkxMywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIG5vdCBhIHZhbGlkIHBhcmFtZXRlciBuYW1lJyk6CiAgICAgICAgICAgICBpbnNwZWN0LlBhcmFtZXRlcignJCcsIGtpbmQ9aW5zcGVjdC5QYXJhbWV0ZXIuVkFSX0tFWVdPUkQpCiAKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbm90IGEgdmFsaWQgcGFyYW1ldGVyIG5hbWUnKToKKyAgICAgICAgICAgIGluc3BlY3QuUGFyYW1ldGVyKCcuYScsIGtpbmQ9aW5zcGVjdC5QYXJhbWV0ZXIuVkFSX0tFWVdPUkQpCisKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICdjYW5ub3QgaGF2ZSBkZWZhdWx0IHZhbHVlcycpOgogICAgICAgICAgICAgaW5zcGVjdC5QYXJhbWV0ZXIoJ2EnLCBkZWZhdWx0PTQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZD1pbnNwZWN0LlBhcmFtZXRlci5WQVJfS0VZV09SRCkKQEAgLTI5ODUsNiArMzAwMCwxNyBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnbmFtZSBtdXN0IGJlIGEgc3RyJyk6CiAgICAgICAgICAgICBpbnNwZWN0LlBhcmFtZXRlcihOb25lLCBraW5kPWluc3BlY3QuUGFyYW1ldGVyLlBPU0lUSU9OQUxfT05MWSkKIAorICAgIEBjcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9zaWduYXR1cmVfcGFyYW1ldGVyX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBsaWNpdCBhcmd1bWVudHMgbXVzdCBiZSBwYXNzZWQgaW4gYXMnKToKKyAgICAgICAgICAgIGluc3BlY3QuUGFyYW1ldGVyKCcuMCcsIGtpbmQ9aW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PTkxZKQorCisgICAgICAgIHBhcmFtID0gaW5zcGVjdC5QYXJhbWV0ZXIoCisgICAgICAgICAgICAnLjAnLCBraW5kPWluc3BlY3QuUGFyYW1ldGVyLlBPU0lUSU9OQUxfT1JfS0VZV09SRCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbS5raW5kLCBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyYW0ubmFtZSwgJ2ltcGxpY2l0MCcpCisKICAgICBkZWYgdGVzdF9zaWduYXR1cmVfcGFyYW1ldGVyX2ltbXV0YWJpbGl0eShzZWxmKToKICAgICAgICAgcCA9IGluc3BlY3QuUGFyYW1ldGVyKCdzcGFtJywga2luZD1pbnNwZWN0LlBhcmFtZXRlci5LRVlXT1JEX09OTFkpCiAKQEAgLTMyMzMsNiArMzI1OSwxNyBAQAogICAgICAgICBiYSA9IHNpZy5iaW5kKGFyZ3M9MSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYS5hcmd1bWVudHMsIHsna3dhcmdzJzogeydhcmdzJzogMX19KQogCisgICAgQGNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3NpZ25hdHVyZV9iaW5kX2ltcGxpY2l0X2FyZyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTk2MTE6IGdldGNhbGxhcmdzIHNob3VsZCB3b3JrIHdpdGggc2V0IGNvbXByZWhlbnNpb25zCisgICAgICAgIGRlZiBtYWtlX3NldCgpOgorICAgICAgICAgICAgcmV0dXJuIHt6ICogeiBmb3IgeiBpbiByYW5nZSg1KX0KKyAgICAgICAgc2V0Y29tcF9jb2RlID0gbWFrZV9zZXQuX19jb2RlX18uY29fY29uc3RzWzFdCisgICAgICAgIHNldGNvbXBfZnVuYyA9IHR5cGVzLkZ1bmN0aW9uVHlwZShzZXRjb21wX2NvZGUsIHt9KQorCisgICAgICAgIGl0ZXJhdG9yID0gaXRlcihyYW5nZSg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNhbGwoc2V0Y29tcF9mdW5jLCBpdGVyYXRvciksIHswLCAxLCA0LCA5LCAxNn0pCisKIAogY2xhc3MgVGVzdEJvdW5kQXJndW1lbnRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9zaWduYXR1cmVfYm91bmRfYXJndW1lbnRzX3VuaGFzaGFibGUoc2VsZik6CkBAIC0zNTQzLDE0ICszNTgwLDE0IEBACiAKICAgICBkZWYgdGVzdF9kZXRhaWxzKHNlbGYpOgogICAgICAgICBtb2R1bGUgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgndW5pdHRlc3QnKQotICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCctbScsICdpbnNwZWN0JywKKyAgICAgICAgYXJncyA9IHN1cHBvcnQub3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygqYXJncywgJy1tJywgJ2luc3BlY3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bml0dGVzdCcsICctLWRldGFpbHMnKQogICAgICAgICBvdXRwdXQgPSBvdXQuZGVjb2RlKCkKICAgICAgICAgIyBKdXN0IGEgcXVpY2sgc2FuaXR5IGNoZWNrIG9uIHRoZSBvdXRwdXQKICAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGUuX19uYW1lX18sIG91dHB1dCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGUuX19maWxlX18sIG91dHB1dCkKLSAgICAgICAgaWYgbm90IHN5cy5mbGFncy5vcHRpbWl6ZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4obW9kdWxlLl9fY2FjaGVkX18sIG91dHB1dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGUuX19jYWNoZWRfXywgb3V0cHV0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgYicnKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW50LnB5IGIvTGliL3Rlc3QvdGVzdF9pbnQucHkKaW5kZXggYjY2YzVkNi4uODg0N2Y0YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbnQucHkKQEAgLTQzMCwyMSArNDMwLDI0IEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgogICAgICAgICAgICAgbiA9IGludChiYWRfaW50KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShuKSwgaW50KQogCiAgICAgICAgIGJhZF9pbnQgPSBCYWRJbnQyKCkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CiAgICAgICAgICAgICBuID0gaW50KGJhZF9pbnQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKG4pLCBpbnQpCiAKICAgICAgICAgYmFkX2ludCA9IFRydW5jUmV0dXJuc0JhZEludCgpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgogICAgICAgICAgICAgbiA9IGludChiYWRfaW50KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShuKSwgaW50KQogCiAgICAgICAgIGdvb2RfaW50ID0gVHJ1bmNSZXR1cm5zSW50U3ViY2xhc3MoKQogICAgICAgICBuID0gaW50KGdvb2RfaW50KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4sIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShuKSwgYm9vbCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKG4pLCBpbnQpCiAgICAgICAgIG4gPSBJbnRTdWJjbGFzcyhnb29kX2ludCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCAxKQogICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUobiksIEludFN1YmNsYXNzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pby5weSBiL0xpYi90ZXN0L3Rlc3RfaW8ucHkKaW5kZXggNTExMTg4Mi4uYzQ4ZWMzYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pby5weQorKysgYi9MaWIvdGVzdC90ZXN0X2lvLnB5CkBAIC00OTYsNyArNDk2LDExIEBACiAgICAgZGVmIHRlc3Rfb3Blbl9oYW5kbGVzX05VTF9jaGFycyhzZWxmKToKICAgICAgICAgZm5fd2l0aF9OVUwgPSAnZm9vXDBiYXInCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYub3BlbiwgZm5fd2l0aF9OVUwsICd3JykKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5vcGVuLCBieXRlcyhmbl93aXRoX05VTCwgJ2FzY2lpJyksICd3JykKKworICAgICAgICBieXRlc19mbiA9IGJ5dGVzKGZuX3dpdGhfTlVMLCAnYXNjaWknKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYub3BlbiwgYnl0ZXNfZm4sICd3JykKIAogICAgIGRlZiB0ZXN0X3Jhd19maWxlX2lvKHNlbGYpOgogICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIiwgYnVmZmVyaW5nPTApIGFzIGY6CkBAIC04NTYsNiArODYwLDMyIEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKHN0cmVhbSwgbWV0aG9kKShidWZmZXIpLCA1KQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYnVmZmVyKSwgYiIxMjM0NSIpCiAKKyAgICBkZWYgdGVzdF9mc3BhdGhfc3VwcG9ydChzZWxmKToKKyAgICAgICAgY2xhc3MgUGF0aExpa2U6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CisgICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorCisgICAgICAgICAgICBkZWYgX19mc3BhdGhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXRoCisKKyAgICAgICAgZGVmIGNoZWNrX3BhdGhfc3VjY2VlZHMocGF0aCk6CisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihwYXRoLCAidyIpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiZWdnXG4iKQorCisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihwYXRoLCAiciIpIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgImVnZ1xuIikKKworICAgICAgICBjaGVja19wYXRoX3N1Y2NlZWRzKFBhdGhMaWtlKHN1cHBvcnQuVEVTVEZOKSkKKyAgICAgICAgY2hlY2tfcGF0aF9zdWNjZWVkcyhQYXRoTGlrZShzdXBwb3J0LlRFU1RGTi5lbmNvZGUoJ3V0Zi04JykpKQorCisgICAgICAgIGJhZF9wYXRoID0gUGF0aExpa2UoVHlwZUVycm9yKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBzZWxmLm9wZW4oYmFkX3BhdGgsICd3JykKKworICAgICAgICAjIGVuc3VyZSB0aGF0IHJlZmNvdW50aW5nIGlzIGNvcnJlY3Qgd2l0aCBzb21lIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICdyZWFkL3dyaXRlL2FwcGVuZCBtb2RlJyk6CisgICAgICAgICAgICBzZWxmLm9wZW4oUGF0aExpa2Uoc3VwcG9ydC5URVNURk4pLCAncnd4YScpCisKIAogY2xhc3MgQ0lPVGVzdChJT1Rlc3QpOgogCkBAIC0zMjQ2LDggKzMyNzYsNyBAQAogCiBjbGFzcyBQeVRleHRJT1dyYXBwZXJUZXN0KFRleHRJT1dyYXBwZXJUZXN0KToKICAgICBpbyA9IHB5aW8KLSAgICAjc2h1dGRvd25fZXJyb3IgPSAiTG9va3VwRXJyb3I6IHVua25vd24gZW5jb2Rpbmc6IGFzY2lpIgotICAgIHNodXRkb3duX2Vycm9yID0gIlR5cGVFcnJvcjogJ05vbmVUeXBlJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlIgorICAgIHNodXRkb3duX2Vycm9yID0gIkxvb2t1cEVycm9yOiB1bmtub3duIGVuY29kaW5nOiBhc2NpaSIKIAogCiBjbGFzcyBJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2lwYWRkcmVzcy5weSBiL0xpYi90ZXN0L3Rlc3RfaXBhZGRyZXNzLnB5CmluZGV4IDkxYWU4ZDguLjVmMDhmMGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaXBhZGRyZXNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXBhZGRyZXNzLnB5CkBAIC0xMTc2LDYgKzExNzYsNyBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHNlbGYuaXB2Nl9uZXR3b3JrWzVdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAnMjAwMTo2NTg6MjJhOmNhZmU6OjUnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBzZWxmLmlwdjZfbmV0d29yay5fX2dldGl0ZW1fXywgMSA8PCA2NCkKIAogICAgIGRlZiB0ZXN0R2V0aXRlbShzZWxmKToKICAgICAgICAgIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvaXBhZGRyLXB5L2lzc3Vlcy9kZXRhaWw/aWQ9MTUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaXRlci5weSBiL0xpYi90ZXN0L3Rlc3RfaXRlci5weQppbmRleCBhOTE2NzBiLi41NDJiMjg0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2l0ZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pdGVyLnB5CkBAIC01NCw2ICs1NCwxNCBAQAogICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKICAgICAgICAgcmV0dXJuIGkKIAorY2xhc3MgRGVmYXVsdEl0ZXJDbGFzczoKKyAgICBwYXNzCisKK2NsYXNzIE5vSXRlckNsYXNzOgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgcmV0dXJuIGkKKyAgICBfX2l0ZXJfXyA9IE5vbmUKKwogIyBNYWluIHRlc3Qgc3VpdGUKIAogY2xhc3MgVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtOTk1LDYgKzEwMDMsMTAgQEAKICAgICBkZWYgdGVzdF9mcmVlX2FmdGVyX2l0ZXJhdGluZyhzZWxmKToKICAgICAgICAgY2hlY2tfZnJlZV9hZnRlcl9pdGVyYXRpbmcoc2VsZiwgaXRlciwgU2VxdWVuY2VDbGFzcywgKDAsKSkKIAorICAgIGRlZiB0ZXN0X2Vycm9yX2l0ZXIoc2VsZik6CisgICAgICAgIGZvciB0eXAgaW4gKERlZmF1bHRJdGVyQ2xhc3MsIE5vSXRlckNsYXNzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXRlciwgdHlwKCkpCisKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChUZXN0Q2FzZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaXRlcmxlbi5weSBiL0xpYi90ZXN0L3Rlc3RfaXRlcmxlbi5weQppbmRleCAxNTJmNWZjLi40MWM5NzUyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2l0ZXJsZW4ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pdGVybGVuLnB5CkBAIC00Miw3ICs0Miw2IEBACiAiIiIKIAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gaXRlcnRvb2xzIGltcG9ydCByZXBlYXQKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCiBmcm9tIG9wZXJhdG9yIGltcG9ydCBsZW5ndGhfaGludApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQppbmRleCBmOTQwODUyLi45NDVjNThkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQpAQCAtNCw3ICs0LDYgQEAKIGltcG9ydCB3ZWFrcmVmCiBmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKIGZyb20gZnJhY3Rpb25zIGltcG9ydCBGcmFjdGlvbgotaW1wb3J0IHN5cwogaW1wb3J0IG9wZXJhdG9yCiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgY29weQpAQCAtNjEzLDYgKzYxMiw1NiBAQAogICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKICAgICAgICAgICAgIHNlbGYucGlja2xldGVzdChwcm90bywgY3ljbGUoJ2FiYycpKQogCisgICAgICAgIGZvciBwcm90byBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgIyB0ZXN0IHdpdGggcGFydGlhbCBjb25zdW1lZCBpbnB1dCBpdGVyYWJsZQorICAgICAgICAgICAgaXQgPSBpdGVyKCdhYmNkZScpCisgICAgICAgICAgICBjID0gY3ljbGUoaXQpCisgICAgICAgICAgICBfID0gW25leHQoYykgZm9yIGkgaW4gcmFuZ2UoMildICAgICAgIyBjb25zdW1lIDIgb2YgNSBpbnB1dHMKKyAgICAgICAgICAgIHAgPSBwaWNrbGUuZHVtcHMoYywgcHJvdG8pCisgICAgICAgICAgICBkID0gcGlja2xlLmxvYWRzKHApICAgICAgICAgICAgICAgICAgIyByZWJ1aWxkIHRoZSBjeWNsZSBvYmplY3QKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgyMCwgZCksIGxpc3QoJ2NkZWFiY2RlYWJjZGVhYmNkZWFiJykpCisKKyAgICAgICAgICAgICMgdGVzdCB3aXRoIGNvbXBsZXRlbHkgY29uc3VtZWQgaW5wdXQgaXRlcmFibGUKKyAgICAgICAgICAgIGl0ID0gaXRlcignYWJjZGUnKQorICAgICAgICAgICAgYyA9IGN5Y2xlKGl0KQorICAgICAgICAgICAgXyA9IFtuZXh0KGMpIGZvciBpIGluIHJhbmdlKDcpXSAgICAgICMgY29uc3VtZSA3IG9mIDUgaW5wdXRzCisgICAgICAgICAgICBwID0gcGlja2xlLmR1bXBzKGMsIHByb3RvKQorICAgICAgICAgICAgZCA9IHBpY2tsZS5sb2FkcyhwKSAgICAgICAgICAgICAgICAgICMgcmVidWlsZCB0aGUgY3ljbGUgb2JqZWN0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMjAsIGQpLCBsaXN0KCdjZGVhYmNkZWFiY2RlYWJjZGVhYicpKQorCisgICAgZGVmIHRlc3RfY3ljbGVfc2V0c3RhdGUoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IGJvdGggbW9kZXMgZm9yIHJlc3RvcmluZyBzdGF0ZQorCisgICAgICAgICMgTW9kZSAwIGlzIGVmZmljaWVudC4gIEl0IHVzZXMgYW4gaW5jb21wbGV0ZWx5IGNvbnN1bWVkIGlucHV0CisgICAgICAgICMgaXRlcmF0b3IgdG8gYnVpbGQgYSBjeWNsZSBvYmplY3QgYW5kIHRoZW4gcGFzc2VzIGluIHN0YXRlIHdpdGgKKyAgICAgICAgIyBhIGxpc3Qgb2YgcHJldmlvdXNseSBjb25zdW1lZCB2YWx1ZXMuICBUaGVyZSBpcyBubyBkYXRhCisgICAgICAgICMgb3ZlcmxhcCBiZXR3ZWVuIHRoZSB0d28uCisgICAgICAgIGMgPSBjeWNsZSgnZGVmZycpCisgICAgICAgIGMuX19zZXRzdGF0ZV9fKChsaXN0KCdhYmMnKSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgyMCwgYyksIGxpc3QoJ2RlZmdhYmNkZWZnYWJjZGVmZ2FiJykpCisKKyAgICAgICAgIyBNb2RlIDEgaXMgaW5lZmZpY2llbnQuICBJdCBzdGFydHMgd2l0aCBhIGN5Y2xlIG9iamVjdCBidWlsdAorICAgICAgICAjIGZyb20gYW4gaXRlcmF0b3Igb3ZlciB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGluIGEgcGFydGlhbAorICAgICAgICAjIGN5Y2xlIGFuZCB0aGVuIHBhc3NlcyBpbiBzdGF0ZSB3aXRoIGFsbCBvZiB0aGUgcHJldmlvdXNseQorICAgICAgICAjIHNlZW4gdmFsdWVzICh0aGlzIG92ZXJsYXBzIHZhbHVlcyBpbmNsdWRlZCBpbiB0aGUgaXRlcmF0b3IpLgorICAgICAgICBjID0gY3ljbGUoJ2RlZmcnKQorICAgICAgICBjLl9fc2V0c3RhdGVfXygobGlzdCgnYWJjZGVmZycpLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIwLCBjKSwgbGlzdCgnZGVmZ2FiY2RlZmdhYmNkZWZnYWInKSkKKworICAgICAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRzdGF0ZSBuZWVkcyB0byBiZSBhIHR1cGxlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXJyb3IpOgorICAgICAgICAgICAgY3ljbGUoJ2RlZmcnKS5fX3NldHN0YXRlX18oW2xpc3QoJ2FiY2RlZmcnKSwgMF0pCisKKyAgICAgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaW4gdGhlIHNldHN0YXRlIHR1cGxlIG11c3QgYmUgYSBsaXN0CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGMgPSBjeWNsZSgnZGVmZycpCisgICAgICAgICAgICBjLl9fc2V0c3RhdGVfXygoZGljdC5mcm9ta2V5cygnZGVmZycpLCAwKSkKKyAgICAgICAgICAgIHRha2UoMjAsIGMpCisKKyAgICAgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaW4gdGhlIHNldHN0YXRlIHR1cGxlIG11c3QgYmUgYSBsaXN0CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGN5Y2xlKCdkZWZnJykuX19zZXRzdGF0ZV9fKChsaXN0KCdhYmNkZWZnJyksICd4JykpCisKICAgICBkZWYgdGVzdF9ncm91cGJ5KHNlbGYpOgogICAgICAgICAjIENoZWNrIHdoZXRoZXIgaXQgYWNjZXB0cyBhcmd1bWVudHMgY29ycmVjdGx5CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIGxpc3QoZ3JvdXBieShbXSkpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9qc29uL19faW5pdF9fLnB5IGIvTGliL3Rlc3QvdGVzdF9qc29uL19faW5pdF9fLnB5CmluZGV4IDA4MDdlNmYuLmJhYzM3MGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfanNvbi9fX2luaXRfXy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2pzb24vX19pbml0X18ucHkKQEAgLTEsNSArMSw0IEBACiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCBqc29uCiBpbXBvcnQgZG9jdGVzdAogaW1wb3J0IHVuaXR0ZXN0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2pzb24vdGVzdF9mYWlsLnB5IGIvTGliL3Rlc3QvdGVzdF9qc29uL3Rlc3RfZmFpbC5weQppbmRleCA5NWZmNWI4Li43OTEwNTIxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2pzb24vdGVzdF9mYWlsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfanNvbi90ZXN0X2ZhaWwucHkKQEAgLTEsNSArMSw0IEBACiBmcm9tIHRlc3QudGVzdF9qc29uIGltcG9ydCBQeVRlc3QsIENUZXN0Ci1pbXBvcnQgcmUKIAogIyAyMDA3LTEwLTA1CiBKU09ORE9DUyA9IFsKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfa3F1ZXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKaW5kZXggZjgyMjAyNC4uOWY0OTg4NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKQEAgLTUsNyArNSw2IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzZWxlY3QKIGltcG9ydCBzb2NrZXQKLWltcG9ydCBzeXMKIGltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9saW5lY2FjaGUucHkgYi9MaWIvdGVzdC90ZXN0X2xpbmVjYWNoZS5weQppbmRleCA0N2UyZWRkLi4zNzVkOWM0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xpbmVjYWNoZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xpbmVjYWNoZS5weQpAQCAtMyw2ICszLDggQEAKIGltcG9ydCBsaW5lY2FjaGUKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRva2VuaXplCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogCkBAIC0xMCw4ICsxMiw2IEBACiBOT05FWElTVEVOVF9GSUxFTkFNRSA9IEZJTEVOQU1FICsgJy5taXNzaW5nJwogSU5WQUxJRF9OQU1FID0gJyFAJCkoIUAjXzEnCiBFTVBUWSA9ICcnCi1URVNUUyA9ICdpbnNwZWN0X2ZvZGRlciBpbnNwZWN0X2ZvZGRlcjIgbWFwcGluZ190ZXN0cycKLVRFU1RTID0gVEVTVFMuc3BsaXQoKQogVEVTVF9QQVRIID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQogTU9EVUxFUyA9ICJsaW5lY2FjaGUgYWJjIi5zcGxpdCgpCiBNT0RVTEVfUEFUSCA9IG9zLnBhdGguZGlybmFtZShGSUxFTkFNRSkKQEAgLTM3LDYgKzM3LDY1IEBACiAgICAgcmV0dXJuIDMnJycgIyBObyBlbmRpbmcgbmV3bGluZQogCiAKK2NsYXNzIFRlbXBGaWxlOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcigpLnNldFVwKCkKKyAgICAgICAgd2l0aCB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoZGVsZXRlPUZhbHNlKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuZmlsZV9uYW1lID0gZnAubmFtZQorICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5maWxlX2J5dGVfc3RyaW5nKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHNlbGYuZmlsZV9uYW1lKQorCisKK2NsYXNzIEdldExpbmVUZXN0c0dvb2REYXRhKFRlbXBGaWxlKToKKyAgICAjIGZpbGVfbGlzdCAgID0gWydsaXN0XG4nLCAnb2ZcbicsICdnb29kXG4nLCAnc3RyaW5nc1xuJ10KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlX2J5dGVfc3RyaW5nID0gJycuam9pbihzZWxmLmZpbGVfbGlzdCkuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIHN1cGVyKCkuc2V0VXAoKQorCisgICAgZGVmIHRlc3RfZ2V0bGluZShzZWxmKToKKyAgICAgICAgd2l0aCB0b2tlbml6ZS5vcGVuKHNlbGYuZmlsZV9uYW1lKSBhcyBmcDoKKyAgICAgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUoZnApOgorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgICAgICAgICBsaW5lICs9ICdcbicKKworICAgICAgICAgICAgICAgIGNhY2hlZF9saW5lID0gbGluZWNhY2hlLmdldGxpbmUoc2VsZi5maWxlX25hbWUsIGluZGV4ICsgMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGNhY2hlZF9saW5lKQorCisgICAgZGVmIHRlc3RfZ2V0bGluZXMoc2VsZik6CisgICAgICAgIGxpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzKHNlbGYuZmlsZV9uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBzZWxmLmZpbGVfbGlzdCkKKworCitjbGFzcyBHZXRMaW5lVGVzdHNCYWREYXRhKFRlbXBGaWxlKToKKyAgICAjIGZpbGVfYnl0ZV9zdHJpbmcgPSBiJ0JhZCBkYXRhIGdvZXMgaGVyZScKKworICAgIGRlZiB0ZXN0X2dldGxpbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChTeW50YXhFcnJvciwgVW5pY29kZURlY29kZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmUsIHNlbGYuZmlsZV9uYW1lLCAxKQorCisgICAgZGVmIHRlc3RfZ2V0bGluZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChTeW50YXhFcnJvciwgVW5pY29kZURlY29kZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmVzLCBzZWxmLmZpbGVfbmFtZSkKKworCitjbGFzcyBFbXB0eUZpbGUoR2V0TGluZVRlc3RzR29vZERhdGEsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmaWxlX2xpc3QgPSBbXQorCisKK2NsYXNzIFNpbmdsZUVtcHR5TGluZShHZXRMaW5lVGVzdHNHb29kRGF0YSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZpbGVfbGlzdCA9IFsnXG4nXQorCisKK2NsYXNzIEdvb2RVbmljb2RlKEdldExpbmVUZXN0c0dvb2REYXRhLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZmlsZV9saXN0ID0gWyfDoVxuJywgJ2JcbicsICdhYmNkZWZcbicsICfDocOhw6HDocOhXG4nXQorCisKK2NsYXNzIEJhZFVuaWNvZGUoR2V0TGluZVRlc3RzQmFkRGF0YSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZpbGVfYnl0ZV9zdHJpbmcgPSBiJ1x4ODBhYmMnCisKKwogY2xhc3MgTGluZUNhY2hlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfZ2V0bGluZShzZWxmKToKQEAgLTUzLDEzICsxMTIsNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGxpbmUoRU1QVFksIDEpLCBFTVBUWSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRsaW5lKElOVkFMSURfTkFNRSwgMSksIEVNUFRZKQogCi0gICAgICAgICMgQ2hlY2sgd2hldGhlciBsaW5lcyBjb3JyZXNwb25kIHRvIHRob3NlIGZyb20gZmlsZSBpdGVyYXRpb24KLSAgICAgICAgZm9yIGVudHJ5IGluIFRFU1RTOgotICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oVEVTVF9QQVRILCBlbnRyeSkgKyAnLnB5JwotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmaWxlOgotICAgICAgICAgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUoZmlsZSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgZ2V0bGluZShmaWxlbmFtZSwgaW5kZXggKyAxKSkKLQogICAgICAgICAjIENoZWNrIG1vZHVsZSBsb2FkaW5nCiAgICAgICAgIGZvciBlbnRyeSBpbiBNT0RVTEVTOgogICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oTU9EVUxFX1BBVEgsIGVudHJ5KSArICcucHknCkBAIC04MCwxMiArMTMyLDEzIEBACiAKICAgICBkZWYgdGVzdF9jbGVhcmNhY2hlKHNlbGYpOgogICAgICAgICBjYWNoZWQgPSBbXQotICAgICAgICBmb3IgZW50cnkgaW4gVEVTVFM6Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihURVNUX1BBVEgsIGVudHJ5KSArICcucHknCisgICAgICAgIGZvciBlbnRyeSBpbiBNT0RVTEVTOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oTU9EVUxFX1BBVEgsIGVudHJ5KSArICcucHknCiAgICAgICAgICAgICBjYWNoZWQuYXBwZW5kKGZpbGVuYW1lKQogICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIDEpCiAKICAgICAgICAgIyBBcmUgYWxsIGZpbGVzIGNhY2hlZD8KKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChjYWNoZWQsIFtdKQogICAgICAgICBjYWNoZWRfZW1wdHkgPSBbZm4gZm9yIGZuIGluIGNhY2hlZCBpZiBmbiBub3QgaW4gbGluZWNhY2hlLmNhY2hlXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhY2hlZF9lbXB0eSwgW10pCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbGlzdC5weSBiL0xpYi90ZXN0L3Rlc3RfbGlzdC5weQppbmRleCA4ZjgyYWI1Li5hZWU2MmRjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xpc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9saXN0LnB5CkBAIC0xLDUgKzEsNSBAQAogaW1wb3J0IHN5cwotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0LCBsaXN0X3Rlc3RzCitmcm9tIHRlc3QgaW1wb3J0IGxpc3RfdGVzdHMKIGltcG9ydCBwaWNrbGUKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkgYi9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKaW5kZXggODUzNDRkZS4uZTQ1YTk4MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IGNvZGVjcwogaW1wb3J0IGNvbmZpZ3BhcnNlcgogaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgcGF0aGxpYgogaW1wb3J0IHBpY2tsZQogaW1wb3J0IGlvCiBpbXBvcnQgZ2MKQEAgLTMwOCw2ICszMDksMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2dnaW5nLmdldExldmVsTmFtZSgnSU5GTycpLCBsb2dnaW5nLklORk8pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nZ2luZy5nZXRMZXZlbE5hbWUobG9nZ2luZy5JTkZPKSwgJ0lORk8nKQogCisgICAgZGVmIHRlc3RfaXNzdWUyNzkzNShzZWxmKToKKyAgICAgICAgZmF0YWwgPSBsb2dnaW5nLmdldExldmVsTmFtZSgnRkFUQUwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZhdGFsLCBsb2dnaW5nLkZBVEFMKQorCiBjbGFzcyBCYXNpY0ZpbHRlclRlc3QoQmFzZVRlc3QpOgogCiAgICAgIiIiVGVzdCB0aGUgYnVuZGxlZCBGaWx0ZXIgY2xhc3MuIiIiCkBAIC01NzUsNiArNTgwLDI5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaC5zaG91bGRGbHVzaChyKSkKICAgICAgICAgaC5jbG9zZSgpCiAKKyAgICBkZWYgdGVzdF9wYXRoX29iamVjdHMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0IHRoYXQgUGF0aCBvYmplY3RzIGFyZSBhY2NlcHRlZCBhcyBmaWxlbmFtZSBhcmd1bWVudHMgdG8gaGFuZGxlcnMuCisKKyAgICAgICAgU2VlIElzc3VlICMyNzQ5My4KKyAgICAgICAgIiIiCisgICAgICAgIGZkLCBmbiA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgb3MudW5saW5rKGZuKQorICAgICAgICBwZm4gPSBwYXRobGliLlBhdGgoZm4pCisgICAgICAgIGNhc2VzID0gKAorICAgICAgICAgICAgICAgICAgICAobG9nZ2luZy5GaWxlSGFuZGxlciwgKHBmbiwgJ3cnKSksCisgICAgICAgICAgICAgICAgICAgIChsb2dnaW5nLmhhbmRsZXJzLlJvdGF0aW5nRmlsZUhhbmRsZXIsIChwZm4sICdhJykpLAorICAgICAgICAgICAgICAgICAgICAobG9nZ2luZy5oYW5kbGVycy5UaW1lZFJvdGF0aW5nRmlsZUhhbmRsZXIsIChwZm4sICdoJykpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnbGludXgnLCAnZGFyd2luJyk6CisgICAgICAgICAgICBjYXNlcyArPSAoKGxvZ2dpbmcuaGFuZGxlcnMuV2F0Y2hlZEZpbGVIYW5kbGVyLCAocGZuLCAndycpKSwpCisgICAgICAgIGZvciBjbHMsIGFyZ3MgaW4gY2FzZXM6CisgICAgICAgICAgICBoID0gY2xzKCphcmdzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZuKSkKKyAgICAgICAgICAgIGguY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKGZuKQorCiAgICAgQHVuaXR0ZXN0LnNraXBJZihvcy5uYW1lID09ICdudCcsICdXYXRjaGVkRmlsZUhhbmRsZXIgbm90IGFwcHJvcHJpYXRlIGZvciBXaW5kb3dzLicpCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKICAgICBkZWYgdGVzdF9yYWNlKHNlbGYpOgpAQCAtOTU4LDcgKzk4Niw3IEBACiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBCYXNlVGVzdC5zZXRVcChzZWxmKQogICAgICAgICBzZWxmLm1lbV9oZGxyID0gbG9nZ2luZy5oYW5kbGVycy5NZW1vcnlIYW5kbGVyKDEwLCBsb2dnaW5nLldBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucm9vdF9oZGxyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucm9vdF9oZGxyKQogICAgICAgICBzZWxmLm1lbV9sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignbWVtJykKICAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLnByb3BhZ2F0ZSA9IDAKICAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLmFkZEhhbmRsZXIoc2VsZi5tZW1faGRscikKQEAgLTk5NSw2ICsxMDIzLDM2IEBACiAgICAgICAgIHNlbGYubWVtX2xvZ2dlci5kZWJ1ZyhzZWxmLm5leHRfbWVzc2FnZSgpKQogICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMobGluZXMpCiAKKyAgICBkZWYgdGVzdF9mbHVzaF9vbl9jbG9zZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRlc3QgdGhhdCB0aGUgZmx1c2gtb24tY2xvc2UgY29uZmlndXJhdGlvbiB3b3JrcyBhcyBleHBlY3RlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubWVtX2xvZ2dlci5kZWJ1ZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisgICAgICAgIHNlbGYubWVtX2xvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSkKKyAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLnJlbW92ZUhhbmRsZXIoc2VsZi5tZW1faGRscikKKyAgICAgICAgIyBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBmbHVzaCBvbiBjbG9zZS4gQ2hlY2sgdGhhdCBpdCBoYXBwZW5zLgorICAgICAgICBzZWxmLm1lbV9oZGxyLmNsb3NlKCkKKyAgICAgICAgbGluZXMgPSBbCisgICAgICAgICAgICAoJ0RFQlVHJywgJzEnKSwKKyAgICAgICAgICAgICgnSU5GTycsICcyJyksCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGxpbmVzKQorICAgICAgICAjIE5vdyBjb25maWd1cmUgZm9yIGZsdXNoaW5nIG5vdCB0byBiZSBkb25lIG9uIGNsb3NlLgorICAgICAgICBzZWxmLm1lbV9oZGxyID0gbG9nZ2luZy5oYW5kbGVycy5NZW1vcnlIYW5kbGVyKDEwLCBsb2dnaW5nLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yb290X2hkbHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpCisgICAgICAgIHNlbGYubWVtX2xvZ2dlci5hZGRIYW5kbGVyKHNlbGYubWVtX2hkbHIpCisgICAgICAgIHNlbGYubWVtX2xvZ2dlci5kZWJ1ZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMobGluZXMpICAjIG5vIGNoYW5nZQorICAgICAgICBzZWxmLm1lbV9sb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMobGluZXMpICAjIG5vIGNoYW5nZQorICAgICAgICBzZWxmLm1lbV9sb2dnZXIucmVtb3ZlSGFuZGxlcihzZWxmLm1lbV9oZGxyKQorICAgICAgICBzZWxmLm1lbV9oZGxyLmNsb3NlKCkKKyAgICAgICAgIyBhc3NlcnQgdGhhdCBubyBuZXcgbGluZXMgaGF2ZSBiZWVuIGFkZGVkCisgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhsaW5lcykgICMgbm8gY2hhbmdlCisKIAogY2xhc3MgRXhjZXB0aW9uRm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKToKICAgICAiIiJBIHNwZWNpYWwgZXhjZXB0aW9uIGZvcm1hdHRlci4iIiIKQEAgLTQyMzksNiArNDI5NywxNyBAQAogICAgICAgICBtc2cgPSAnUmVjb3JkIG5vdCBmb3VuZCBpbiBldmVudCBsb2csIHdlbnQgYmFjayAlZCByZWNvcmRzJyAlIEdPX0JBQ0sKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLCBtc2c9bXNnKQogCisKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J2xvZ1RocmVhZHMnLCAnbG9nTXVsdGlwcm9jZXNzaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICdsb2dQcm9jZXNzZXMnLCAnY3VycmVudGZyYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICdQZXJjZW50U3R5bGUnLCAnU3RyRm9ybWF0U3R5bGUnLCAnU3RyaW5nVGVtcGxhdGVTdHlsZScsCisgICAgICAgICAgICAgICAgICAgICAnRmlsdGVyZXInLCAnUGxhY2VIb2xkZXInLCAnTWFuYWdlcicsICdSb290TG9nZ2VyJywKKyAgICAgICAgICAgICAgICAgICAgICdyb290J30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgbG9nZ2luZywgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiAjIFNldCB0aGUgbG9jYWxlIHRvIHRoZSBwbGF0Zm9ybS1kZXBlbmRlbnQgZGVmYXVsdC4gIEkgaGF2ZSBubyBpZGVhCiAjIHdoeSB0aGUgdGVzdCBkb2VzIHRoaXMsIGJ1dCBpbiBhbnkgY2FzZSB3ZSBzYXZlIHRoZSBjdXJyZW50IGxvY2FsZQogIyBmaXJzdCBhbmQgcmVzdG9yZSBpdCBhdCB0aGUgZW5kLgpAQCAtNDI1Niw2ICs0MzI1LDcgQEAKICAgICAgICAgRXhjZXB0aW9uVGVzdCwgU3lzTG9nSGFuZGxlclRlc3QsIEhUVFBIYW5kbGVyVGVzdCwKICAgICAgICAgTlRFdmVudExvZ0hhbmRsZXJUZXN0LCBUaW1lZFJvdGF0aW5nRmlsZUhhbmRsZXJUZXN0LAogICAgICAgICBVbml4U29ja2V0SGFuZGxlclRlc3QsIFVuaXhEYXRhZ3JhbUhhbmRsZXJUZXN0LCBVbml4U3lzTG9nSGFuZGxlclRlc3QsCisgICAgICAgIE1pc2NUZXN0Q2FzZQogICAgIF0KICAgICBpZiBoYXNhdHRyKGxvZ2dpbmcuaGFuZGxlcnMsICdRdWV1ZUxpc3RlbmVyJyk6CiAgICAgICAgIHRlc3RzLmFwcGVuZChRdWV1ZUxpc3RlbmVyVGVzdCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQppbmRleCA0YjJkODFjLi40Y2M0YjA1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CkBAIC02ODksNiArNjg5LDIwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGludCwgZmxvYXQoJy1pbmYnKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCBmbG9hdCgnbmFuJykpCiAKKyAgICBkZWYgdGVzdF9tb2RfZGl2aXNpb24oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgXyA9IDEgJSAwCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMyAlIDEwLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMyAlIDEwLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEzICUgLTEwLCAtNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTMgJSAtMTAsIC0zKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIgJSA0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMiAlIDQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIgJSAtNCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTIgJSAtNCwgMCkKKwogICAgIGRlZiB0ZXN0X3RydWVfZGl2aXNpb24oc2VsZik6CiAgICAgICAgIGh1Z2UgPSAxIDw8IDQwMDAwCiAgICAgICAgIG1odWdlID0gLWh1Z2UKQEAgLTcyMyw2ICs3MzcsMjUgQEAKICAgICAgICAgZm9yIHplcm8gaW4gWyJodWdlIC8gMCIsICJtaHVnZSAvIDAiXToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBldmFsLCB6ZXJvLCBuYW1lc3BhY2UpCiAKKyAgICBkZWYgdGVzdF9mbG9vcmRpdihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICBfID0gMSAvLyAwCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyIC8vIDMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiAvLyAtMywgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIgLy8gMywgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIgLy8gLTMsIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTEgLy8gLTMsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTExIC8vIDMsIC00KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDExIC8vIC0zLCAtNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMSAvLyAzLCAzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEyIC8vIC0zLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMiAvLyAzLCAtNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiAvLyAtMywgLTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIgLy8gMywgNCkKKwogICAgIGRlZiBjaGVja190cnVlZGl2KHNlbGYsIGEsIGIsIHNraXBfc21hbGw9VHJ1ZSk6CiAgICAgICAgICIiIlZlcmlmeSB0aGF0IHRoZSByZXN1bHQgb2YgYS9iIGlzIGNvcnJlY3RseSByb3VuZGVkLCBieQogICAgICAgICBjb21wYXJpbmcgaXQgd2l0aCBhIHB1cmUgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIGNvcnJlY3RseQpAQCAtODQ1LDYgKzg3OCwyMSBAQAogICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KC14LCB5KQogICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KC14LCAteSkKIAorICAgIGRlZiB0ZXN0X2xzaGlmdF9vZl96ZXJvKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAgPDwgMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwIDw8IDEwLCAwKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgMCA8PCAtMQorCisgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfaHVnZV9sc2hpZnRfb2ZfemVybyhzZWxmKToKKyAgICAgICAgIyBTaG91bGRuJ3QgdHJ5IHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBodWdlIHNoaWZ0LiBTZWUgaXNzdWUgIzI3ODcwLgorICAgICAgICAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgaGF2ZSBhIGRpZmZlcmVudCBib3VuZGFyeSBmb3Igb3ZlcmZsb3csCisgICAgICAgICMgb3Igbm90IHJhaXNlIGF0IGFsbC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwIDw8IHN5cy5tYXhzaXplLCAwKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgMCA8PCAoc3lzLm1heHNpemUgKyAxKQorCiAgICAgZGVmIHRlc3Rfc21hbGxfaW50cyhzZWxmKToKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoLTUsIDI1Nyk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydElzKGksIGkgKyAwKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYWNwYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9tYWNwYXRoLnB5CmluZGV4IDgwYmVjN2EuLjA2OThmZjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFjcGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21hY3BhdGgucHkKQEAgLTEsNSArMSw1IEBACiBpbXBvcnQgbWFjcGF0aAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0LCB0ZXN0X2dlbmVyaWNwYXRoCitmcm9tIHRlc3QgaW1wb3J0IHRlc3RfZ2VuZXJpY3BhdGgKIGltcG9ydCB1bml0dGVzdAogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQppbmRleCAwOTkxZjc0Li5hZWFiZGJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CkBAIC03LDE3ICs3LDEyIEBACiBpbXBvcnQgZW1haWwubWVzc2FnZQogaW1wb3J0IHJlCiBpbXBvcnQgaW8KLWltcG9ydCBzaHV0aWwKIGltcG9ydCB0ZW1wZmlsZQogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IG1haWxib3gKIGltcG9ydCBnbG9iCi10cnk6Ci0gICAgaW1wb3J0IGZjbnRsCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgcGFzcwogCiAKIGNsYXNzIFRlc3RCYXNlOgpAQCAtMjI3MywxMiArMjI2OCwxOCBAQAogIiIiKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7ImxpbmVzZXAiLCAiZmNudGwifQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBtYWlsYm94LCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0cyA9IChUZXN0TWFpbGJveFN1cGVyY2xhc3MsIFRlc3RNYWlsZGlyLCBUZXN0TWJveCwgVGVzdE1NREYsIFRlc3RNSCwKICAgICAgICAgICAgICBUZXN0QmFieWwsIFRlc3RNZXNzYWdlLCBUZXN0TWFpbGRpck1lc3NhZ2UsIFRlc3RNYm94TWVzc2FnZSwKICAgICAgICAgICAgICBUZXN0TUhNZXNzYWdlLCBUZXN0QmFieWxNZXNzYWdlLCBUZXN0TU1ERk1lc3NhZ2UsCiAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VDb252ZXJzaW9uLCBUZXN0UHJveHlGaWxlLCBUZXN0UGFydGlhbEZpbGUsCi0gICAgICAgICAgICAgTWFpbGRpclRlc3RDYXNlLCBUZXN0RmFrZU1haWxCb3gpCisgICAgICAgICAgICAgTWFpbGRpclRlc3RDYXNlLCBUZXN0RmFrZU1haWxCb3gsIE1pc2NUZXN0Q2FzZSkKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCiAgICAgc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYWlsY2FwLnB5IGIvTGliL3Rlc3QvdGVzdF9tYWlsY2FwLnB5CmluZGV4IDIyYjJmY2MuLjVjN2Q2Y2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFpbGNhcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21haWxjYXAucHkKQEAgLTEsNiArMSw1IEBACiBpbXBvcnQgbWFpbGNhcAogaW1wb3J0IG9zCi1pbXBvcnQgc2h1dGlsCiBpbXBvcnQgdGVzdC5zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApAQCAtMTAyLDcgKzEwMSw3IEBACiAgICAgICAgICAgICAoWyJlY2hvIGZvbyIsICJhdWRpby8qIiwgImZvby50eHQiXSwgImVjaG8gZm9vIiksCiAgICAgICAgICAgICAoWyJlY2hvICVzIiwgImF1ZGlvLyoiLCAiZm9vLnR4dCJdLCAiZWNobyBmb28udHh0IiksCiAgICAgICAgICAgICAoWyJlY2hvICV0IiwgImF1ZGlvLyoiLCAiZm9vLnR4dCJdLCAiZWNobyBhdWRpby8qIiksCi0gICAgICAgICAgICAoWyJlY2hvIFwldCIsICJhdWRpby8qIiwgImZvby50eHQiXSwgImVjaG8gJXQiKSwKKyAgICAgICAgICAgIChbImVjaG8gXFwldCIsICJhdWRpby8qIiwgImZvby50eHQiXSwgImVjaG8gJXQiKSwKICAgICAgICAgICAgIChbImVjaG8gZm9vIiwgImF1ZGlvLyoiLCAiZm9vLnR4dCIsIHBsaXN0XSwgImVjaG8gZm9vIiksCiAgICAgICAgICAgICAoWyJlY2hvICV7dG90YWx9IiwgImF1ZGlvLyoiLCAiZm9vLnR4dCIsIHBsaXN0XSwgImVjaG8gMyIpCiAgICAgICAgIF0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQppbmRleCBjN2RlZjlhLi5iMzc4ZmZlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CkBAIC0xMzUsNiArMTM1LDEzIEBACiAgICAgICAgIGZvciBjb25zdHJ1Y3RvciBpbiAoc2V0LCBmcm96ZW5zZXQpOgogICAgICAgICAgICAgc2VsZi5oZWxwZXIoY29uc3RydWN0b3Ioc2VsZi5kLmtleXMoKSkpCiAKKyAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9lbXB0eV9mcm96ZW5zZXRfc2luZ2xldG9uKHNlbGYpOgorICAgICAgICAjIG1hcnNoYWwubG9hZHMoKSBtdXN0IHJldXNlIHRoZSBlbXB0eSBmcm96ZW5zZXQgc2luZ2xldG9uCisgICAgICAgIG9iaiA9IGZyb3plbnNldCgpCisgICAgICAgIG9iajIgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMob2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvYmoyLCBvYmopCisKIAogY2xhc3MgQnVmZmVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UsIEhlbHBlck1peGluKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9tYXRoLnB5CmluZGV4IGEzNzlhNmEuLmVhYTQxYmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21hdGgucHkKQEAgLTcsMTQgKzcsMTUgQEAKIGltcG9ydCBtYXRoCiBpbXBvcnQgb3MKIGltcG9ydCBwbGF0Zm9ybQotaW1wb3J0IHN5cwogaW1wb3J0IHN0cnVjdAoraW1wb3J0IHN5cwogaW1wb3J0IHN5c2NvbmZpZwogCiBlcHMgPSAxRS0wNQogTkFOID0gZmxvYXQoJ25hbicpCiBJTkYgPSBmbG9hdCgnaW5mJykKIE5JTkYgPSBmbG9hdCgnLWluZicpCitGTE9BVF9NQVggPSBzeXMuZmxvYXRfaW5mby5tYXgKIAogIyBkZXRlY3QgZXZpZGVuY2Ugb2YgZG91YmxlLXJvdW5kaW5nOiBmc3VtIGlzIG5vdCBhbHdheXMgY29ycmVjdGx5CiAjIHJvdW5kZWQgb24gbWFjaGluZXMgdGhhdCBzdWZmZXIgZnJvbSBkb3VibGUgcm91bmRpbmcuCkBAIC0zMCw2ICszMSw3IEBACiBtYXRoX3Rlc3RjYXNlcyA9IG9zLnBhdGguam9pbih0ZXN0X2RpciwgJ21hdGhfdGVzdGNhc2VzLnR4dCcpCiB0ZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVzdF9kaXIsICdjbWF0aF90ZXN0Y2FzZXMudHh0JykKIAorCiBkZWYgdG9fdWxwcyh4KToKICAgICAiIiJDb252ZXJ0IGEgbm9uLU5hTiBmbG9hdCB4IHRvIGFuIGludGVnZXIsIGluIHN1Y2ggYSB3YXkgdGhhdAogICAgIGFkamFjZW50IGZsb2F0cyBhcmUgY29udmVydGVkIHRvIGFkamFjZW50IGludGVnZXJzLiAgVGhlbgpAQCAtMzcsMjUgKzM5LDM5IEBACiAgICAgZmxvYXRzLgogCiAgICAgVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGZ1bmN0aW9uIHdpbGwgb25seSBtYWtlIHNlbnNlIG9uIHBsYXRmb3JtcwotICAgIHdoZXJlIEMgZG91YmxlcyBhcmUgcmVwcmVzZW50ZWQgaW4gSUVFRSA3NTQgYmluYXJ5NjQgZm9ybWF0LgorICAgIHdoZXJlIG5hdGl2ZSBkb3VibGVzIGFyZSByZXByZXNlbnRlZCBpbiBJRUVFIDc1NCBiaW5hcnk2NCBmb3JtYXQuCiAKKyAgICBOb3RlOiAwLjAgYW5kIC0wLjAgYXJlIGNvbnZlcnRlZCB0byAwIGFuZCAtMSwgcmVzcGVjdGl2ZWx5LgogICAgICIiIgogICAgIG4gPSBzdHJ1Y3QudW5wYWNrKCc8cScsIHN0cnVjdC5wYWNrKCc8ZCcsIHgpKVswXQogICAgIGlmIG4gPCAwOgogICAgICAgICBuID0gfihuKzIqKjYzKQogICAgIHJldHVybiBuCiAKLWRlZiB1bHBzX2NoZWNrKGV4cGVjdGVkLCBnb3QsIHVscHM9MjApOgotICAgICIiIkdpdmVuIG5vbi1OYU4gZmxvYXRzIGBleHBlY3RlZGAgYW5kIGBnb3RgLAotICAgIGNoZWNrIHRoYXQgdGhleSdyZSBlcXVhbCB0byB3aXRoaW4gdGhlIGdpdmVuIG51bWJlciBvZiB1bHBzLgogCi0gICAgUmV0dXJucyBOb25lIG9uIHN1Y2Nlc3MgYW5kIGFuIGVycm9yIG1lc3NhZ2Ugb24gZmFpbHVyZS4iIiIKK2RlZiB1bHAoeCk6CisgICAgIiIiUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGEKKyAgICBmbG9hdCB4LCBzdWNoIHRoYXQgdGhlIGZpcnN0IGZsb2F0IGJpZ2dlciB0aGFuIHggaXMgeCt1bHAoeCkuCisgICAgVGhlbiwgZ2l2ZW4gYW4gZXhwZWN0ZWQgcmVzdWx0IHggYW5kIGEgdG9sZXJhbmNlIG9mIG4gdWxwcywKKyAgICB0aGUgcmVzdWx0IHkgc2hvdWxkIGJlIHN1Y2ggdGhhdCBhYnMoeS14KSA8PSBuICogdWxwKHgpLgorICAgIFRoZSByZXN1bHRzIGZyb20gdGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgbWFrZSBzZW5zZSBvbiBwbGF0Zm9ybXMKKyAgICB3aGVyZSBuYXRpdmUgZG91YmxlcyBhcmUgcmVwcmVzZW50ZWQgaW4gSUVFRSA3NTQgYmluYXJ5NjQgZm9ybWF0LgorICAgICIiIgorICAgIHggPSBhYnMoZmxvYXQoeCkpCisgICAgaWYgbWF0aC5pc25hbih4KSBvciBtYXRoLmlzaW5mKHgpOgorICAgICAgICByZXR1cm4geAogCi0gICAgdWxwc19lcnJvciA9IHRvX3VscHMoZ290KSAtIHRvX3VscHMoZXhwZWN0ZWQpCi0gICAgaWYgYWJzKHVscHNfZXJyb3IpIDw9IHVscHM6Ci0gICAgICAgIHJldHVybiBOb25lCi0gICAgcmV0dXJuICJlcnJvciA9IHt9IHVscHM7IHBlcm1pdHRlZCBlcnJvciA9IHt9IHVscHMiLmZvcm1hdCh1bHBzX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxwcykKKyAgICAjIEZpbmQgbmV4dCBmbG9hdCB1cCBmcm9tIHguCisgICAgbiA9IHN0cnVjdC51bnBhY2soJzxxJywgc3RydWN0LnBhY2soJzxkJywgeCkpWzBdCisgICAgeF9uZXh0ID0gc3RydWN0LnVucGFjaygnPGQnLCBzdHJ1Y3QucGFjaygnPHEnLCBuICsgMSkpWzBdCisgICAgaWYgbWF0aC5pc2luZih4X25leHQpOgorICAgICAgICAjIENvcm5lciBjYXNlOiB4IHdhcyB0aGUgbGFyZ2VzdCBmaW5pdGUgZmxvYXQuIFRoZW4gaXQncworICAgICAgICAjIG5vdCBhbiBleGFjdCBwb3dlciBvZiB0d28sIHNvIHdlIGNhbiB0YWtlIHRoZSBkaWZmZXJlbmNlCisgICAgICAgICMgYmV0d2VlbiB4IGFuZCB0aGUgcHJldmlvdXMgZmxvYXQuCisgICAgICAgIHhfcHJldiA9IHN0cnVjdC51bnBhY2soJzxkJywgc3RydWN0LnBhY2soJzxxJywgbiAtIDEpKVswXQorICAgICAgICByZXR1cm4geCAtIHhfcHJldgorICAgIGVsc2U6CisgICAgICAgIHJldHVybiB4X25leHQgLSB4CiAKICMgSGVyZSdzIGEgcHVyZSBQeXRob24gdmVyc2lvbiBvZiB0aGUgbWF0aC5mYWN0b3JpYWwgYWxnb3JpdGhtLCBmb3IKICMgZG9jdW1lbnRhdGlvbiBhbmQgY29tcGFyaXNvbiBwdXJwb3Nlcy4KQEAgLTEwNywyNCArMTIzLDIzIEBACiAgICAgICAgIG91dGVyICo9IGlubmVyCiAgICAgcmV0dXJuIG91dGVyIDw8IChuIC0gY291bnRfc2V0X2JpdHMobikpCiAKLWRlZiBhY2NfY2hlY2soZXhwZWN0ZWQsIGdvdCwgcmVsX2Vycj0yZS0xNSwgYWJzX2VyciA9IDVlLTMyMyk6Ci0gICAgIiIiRGV0ZXJtaW5lIHdoZXRoZXIgbm9uLU5hTiBmbG9hdHMgYSBhbmQgYiBhcmUgZXF1YWwgdG8gd2l0aGluIGEKLSAgICAoc21hbGwpIHJvdW5kaW5nIGVycm9yLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGZvciByZWxfZXJyIGFuZAotICAgIGFic19lcnIgYXJlIGNob3NlbiB0byBiZSBzdWl0YWJsZSBmb3IgcGxhdGZvcm1zIHdoZXJlIGEgZmxvYXQgaXMKLSAgICByZXByZXNlbnRlZCBieSBhbiBJRUVFIDc1NCBkb3VibGUuICBUaGV5IGFsbG93IGFuIGVycm9yIG9mIGJldHdlZW4KLSAgICA5IGFuZCAxOSB1bHBzLiIiIgorZGVmIHVscF9hYnNfY2hlY2soZXhwZWN0ZWQsIGdvdCwgdWxwX3RvbCwgYWJzX3RvbCk6CisgICAgIiIiR2l2ZW4gZmluaXRlIGZsb2F0cyBgZXhwZWN0ZWRgIGFuZCBgZ290YCwgY2hlY2sgdGhhdCB0aGV5J3JlCisgICAgYXBwcm94aW1hdGVseSBlcXVhbCB0byB3aXRoaW4gdGhlIGdpdmVuIG51bWJlciBvZiB1bHBzIG9yIHRoZQorICAgIGdpdmVuIGFic29sdXRlIHRvbGVyYW5jZSwgd2hpY2hldmVyIGlzIGJpZ2dlci4KIAotICAgICMgbmVlZCB0byBzcGVjaWFsIGNhc2UgaW5maW5pdGllcywgc2luY2UgaW5mIC0gaW5mIGdpdmVzIG5hbgotICAgIGlmIG1hdGguaXNpbmYoZXhwZWN0ZWQpIGFuZCBnb3QgPT0gZXhwZWN0ZWQ6CisgICAgUmV0dXJucyBOb25lIG9uIHN1Y2Nlc3MgYW5kIGFuIGVycm9yIG1lc3NhZ2Ugb24gZmFpbHVyZS4KKyAgICAiIiIKKyAgICB1bHBfZXJyb3IgPSBhYnModG9fdWxwcyhleHBlY3RlZCkgLSB0b191bHBzKGdvdCkpCisgICAgYWJzX2Vycm9yID0gYWJzKGV4cGVjdGVkIC0gZ290KQorCisgICAgIyBTdWNjZWVkIGlmIGVpdGhlciBhYnNfZXJyb3IgPD0gYWJzX3RvbCBvciB1bHBfZXJyb3IgPD0gdWxwX3RvbC4KKyAgICBpZiBhYnNfZXJyb3IgPD0gYWJzX3RvbCBvciB1bHBfZXJyb3IgPD0gdWxwX3RvbDoKICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGVycm9yID0gZ290IC0gZXhwZWN0ZWQKLQotICAgIHBlcm1pdHRlZF9lcnJvciA9IG1heChhYnNfZXJyLCByZWxfZXJyICogYWJzKGV4cGVjdGVkKSkKLSAgICBpZiBhYnMoZXJyb3IpIDwgcGVybWl0dGVkX2Vycm9yOgotICAgICAgICByZXR1cm4gTm9uZQotICAgIHJldHVybiAiZXJyb3IgPSB7fTsgcGVybWl0dGVkIGVycm9yID0ge30iLmZvcm1hdChlcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWl0dGVkX2Vycm9yKQorICAgIGVsc2U6CisgICAgICAgIGZtdCA9ICgiZXJyb3IgPSB7Oi4zZ30gKHs6ZH0gdWxwcyk7ICIKKyAgICAgICAgICAgICAgICJwZXJtaXR0ZWQgZXJyb3IgPSB7Oi4zZ30gb3IgezpkfSB1bHBzIikKKyAgICAgICAgcmV0dXJuIGZtdC5mb3JtYXQoYWJzX2Vycm9yLCB1bHBfZXJyb3IsIGFic190b2wsIHVscF90b2wpCiAKIGRlZiBwYXJzZV9tdGVzdGZpbGUoZm5hbWUpOgogICAgICIiIlBhcnNlIGEgZmlsZSB3aXRoIHRlc3QgdmFsdWVzCkBAIC0xNTEsNiArMTY2LDcgQEAKIAogICAgICAgICAgICAgeWllbGQgKGlkLCBmbiwgZmxvYXQoYXJnKSwgZmxvYXQoZXhwKSwgZmxhZ3MpCiAKKwogZGVmIHBhcnNlX3Rlc3RmaWxlKGZuYW1lKToKICAgICAiIiJQYXJzZSBhIGZpbGUgd2l0aCB0ZXN0IHZhbHVlcwogCkBAIC0xNzIsOCArMTg4LDUzIEBACiAgICAgICAgICAgICB5aWVsZCAoaWQsIGZuLAogICAgICAgICAgICAgICAgICAgIGZsb2F0KGFyZ19yZWFsKSwgZmxvYXQoYXJnX2ltYWcpLAogICAgICAgICAgICAgICAgICAgIGZsb2F0KGV4cF9yZWFsKSwgZmxvYXQoZXhwX2ltYWcpLAotICAgICAgICAgICAgICAgICAgIGZsYWdzCi0gICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgZmxhZ3MpCisKKworZGVmIHJlc3VsdF9jaGVjayhleHBlY3RlZCwgZ290LCB1bHBfdG9sPTUsIGFic190b2w9MC4wKToKKyAgICAjIENvbW1vbiBsb2dpYyBvZiBNYXRoVGVzdHMuKGZ0ZXN0LCB0ZXN0X3Rlc3RjYXNlcywgdGVzdF9tdGVzdGNhc2VzKQorICAgICIiIkNvbXBhcmUgYXJndW1lbnRzIGV4cGVjdGVkIGFuZCBnb3QsIGFzIGZsb2F0cywgaWYgZWl0aGVyCisgICAgaXMgYSBmbG9hdCwgdXNpbmcgYSB0b2xlcmFuY2UgZXhwcmVzc2VkIGluIG11bHRpcGxlcyBvZgorICAgIHVscChleHBlY3RlZCkgb3IgYWJzb2x1dGVseSAoaWYgZ2l2ZW4gYW5kIGdyZWF0ZXIpLgorCisgICAgQXMgYSBjb252ZW5pZW5jZSwgd2hlbiBuZWl0aGVyIGFyZ3VtZW50IGlzIGEgZmxvYXQsIGFuZCBmb3IKKyAgICBub24tZmluaXRlIGZsb2F0cywgZXhhY3QgZXF1YWxpdHkgaXMgZGVtYW5kZWQuIEFsc28sIG5hbj09bmFuCisgICAgYXMgZmFyIGFzIHRoaXMgZnVuY3Rpb24gaXMgY29uY2VybmVkLgorCisgICAgUmV0dXJucyBOb25lIG9uIHN1Y2Nlc3MgYW5kIGFuIGVycm9yIG1lc3NhZ2Ugb24gZmFpbHVyZS4KKyAgICAiIiIKKworICAgICMgQ2hlY2sgZXhhY3RseSBlcXVhbCAoYXBwbGllcyBhbHNvIHRvIHN0cmluZ3MgcmVwcmVzZW50aW5nIGV4Y2VwdGlvbnMpCisgICAgaWYgZ290ID09IGV4cGVjdGVkOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZmFpbHVyZSA9ICJub3QgZXF1YWwiCisKKyAgICAjIFR1cm4gbWl4ZWQgZmxvYXQgYW5kIGludCBjb21wYXJpc29uIChlLmcuIGZsb29yKCkpIHRvIGFsbC1mbG9hdAorICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIGZsb2F0KSBhbmQgaXNpbnN0YW5jZShnb3QsIGludCk6CisgICAgICAgIGdvdCA9IGZsb2F0KGdvdCkKKyAgICBlbGlmIGlzaW5zdGFuY2UoZ290LCBmbG9hdCkgYW5kIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIGludCk6CisgICAgICAgIGV4cGVjdGVkID0gZmxvYXQoZXhwZWN0ZWQpCisKKyAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkLCBmbG9hdCkgYW5kIGlzaW5zdGFuY2UoZ290LCBmbG9hdCk6CisgICAgICAgIGlmIG1hdGguaXNuYW4oZXhwZWN0ZWQpIGFuZCBtYXRoLmlzbmFuKGdvdCk6CisgICAgICAgICAgICAjIFBhc3MsIHNpbmNlIGJvdGggbmFuCisgICAgICAgICAgICBmYWlsdXJlID0gTm9uZQorICAgICAgICBlbGlmIG1hdGguaXNpbmYoZXhwZWN0ZWQpIG9yIG1hdGguaXNpbmYoZ290KToKKyAgICAgICAgICAgICMgV2UgYWxyZWFkeSBrbm93IHRoZXkncmUgbm90IGVxdWFsLCBkcm9wIHRocm91Z2ggdG8gZmFpbHVyZQorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBCb3RoIGFyZSBmaW5pdGUgZmxvYXRzIChub3cpLiBBcmUgdGhleSBjbG9zZSBlbm91Z2g/CisgICAgICAgICAgICBmYWlsdXJlID0gdWxwX2Fic19jaGVjayhleHBlY3RlZCwgZ290LCB1bHBfdG9sLCBhYnNfdG9sKQorCisgICAgIyBhcmd1bWVudHMgYXJlIG5vdCBlcXVhbCwgYW5kIGlmIG51bWVyaWMsIGFyZSB0b28gZmFyIGFwYXJ0CisgICAgaWYgZmFpbHVyZSBpcyBub3QgTm9uZToKKyAgICAgICAgZmFpbF9mbXQgPSAiZXhwZWN0ZWQgeyFyfSwgZ290IHshcn0iCisgICAgICAgIGZhaWxfbXNnID0gZmFpbF9mbXQuZm9ybWF0KGV4cGVjdGVkLCBnb3QpCisgICAgICAgIGZhaWxfbXNnICs9ICcgKHt9KScuZm9ybWF0KGZhaWx1cmUpCisgICAgICAgIHJldHVybiBmYWlsX21zZworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCiAKICMgQ2xhc3MgcHJvdmlkaW5nIGFuIF9faW5kZXhfXyBtZXRob2QuCiBjbGFzcyBNeUluZGV4YWJsZShvYmplY3QpOgpAQCAtMTg1LDE4ICsyNDYsMjQgQEAKIAogY2xhc3MgTWF0aFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICAgIGRlZiBmdGVzdChzZWxmLCBuYW1lLCB2YWx1ZSwgZXhwZWN0ZWQpOgotICAgICAgICBpZiBhYnModmFsdWUtZXhwZWN0ZWQpID4gZXBzOgotICAgICAgICAgICAgIyBVc2UgJXIgaW5zdGVhZCBvZiAlZiBzbyB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAgICAgICAgIyBkaXNwbGF5cyBmdWxsIHByZWNpc2lvbi4gT3RoZXJ3aXNlIGRpc2NyZXBhbmNpZXMKLSAgICAgICAgICAgICMgaW4gdGhlIGxhc3QgZmV3IGJpdHMgd2lsbCBsZWFkIHRvIHZlcnkgY29uZnVzaW5nCi0gICAgICAgICAgICAjIGVycm9yIG1lc3NhZ2VzCi0gICAgICAgICAgICBzZWxmLmZhaWwoJyVzIHJldHVybmVkICVyLCBleHBlY3RlZCAlcicgJQotICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCB2YWx1ZSwgZXhwZWN0ZWQpKQorICAgIGRlZiBmdGVzdChzZWxmLCBuYW1lLCBnb3QsIGV4cGVjdGVkLCB1bHBfdG9sPTUsIGFic190b2w9MC4wKToKKyAgICAgICAgIiIiQ29tcGFyZSBhcmd1bWVudHMgZXhwZWN0ZWQgYW5kIGdvdCwgYXMgZmxvYXRzLCBpZiBlaXRoZXIKKyAgICAgICAgaXMgYSBmbG9hdCwgdXNpbmcgYSB0b2xlcmFuY2UgZXhwcmVzc2VkIGluIG11bHRpcGxlcyBvZgorICAgICAgICB1bHAoZXhwZWN0ZWQpIG9yIGFic29sdXRlbHksIHdoaWNoZXZlciBpcyBncmVhdGVyLgorCisgICAgICAgIEFzIGEgY29udmVuaWVuY2UsIHdoZW4gbmVpdGhlciBhcmd1bWVudCBpcyBhIGZsb2F0LCBhbmQgZm9yCisgICAgICAgIG5vbi1maW5pdGUgZmxvYXRzLCBleGFjdCBlcXVhbGl0eSBpcyBkZW1hbmRlZC4gQWxzbywgbmFuPT1uYW4KKyAgICAgICAgaW4gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIGZhaWx1cmUgPSByZXN1bHRfY2hlY2soZXhwZWN0ZWQsIGdvdCwgdWxwX3RvbCwgYWJzX3RvbCkKKyAgICAgICAgaWYgZmFpbHVyZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgie306IHt9Ii5mb3JtYXQobmFtZSwgZmFpbHVyZSkpCiAKICAgICBkZWYgdGVzdENvbnN0YW50cyhzZWxmKToKLSAgICAgICAgc2VsZi5mdGVzdCgncGknLCBtYXRoLnBpLCAzLjE0MTU5MjYpCi0gICAgICAgIHNlbGYuZnRlc3QoJ2UnLCBtYXRoLmUsIDIuNzE4MjgxOCkKKyAgICAgICAgIyBSZWY6IEFicmFtb3dpdHogJiBTdGVndW4gKERvdmVyLCAxOTY1KQorICAgICAgICBzZWxmLmZ0ZXN0KCdwaScsIG1hdGgucGksIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzKQorICAgICAgICBzZWxmLmZ0ZXN0KCdlJywgbWF0aC5lLCAyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnRhdSwgMiptYXRoLnBpKQogCiAgICAgZGVmIHRlc3RBY29zKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYWNvcykKQEAgLTIwNSw2ICsyNzIsOCBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdhY29zKDEpJywgbWF0aC5hY29zKDEpLCAwKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3MsIElORikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3MsIDEgKyBlcHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYWNvcywgLTEgLSBlcHMpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYWNvcyhOQU4pKSkKIAogICAgIGRlZiB0ZXN0QWNvc2goc2VsZik6CkBAIC0yMjQsNiArMjkzLDggQEAKICAgICAgICAgc2VsZi5mdGVzdCgnYXNpbigxKScsIG1hdGguYXNpbigxKSwgbWF0aC5waS8yKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFzaW4sIElORikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hc2luLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFzaW4sIDEgKyBlcHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYXNpbiwgLTEgLSBlcHMpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXNpbihOQU4pKSkKIAogICAgIGRlZiB0ZXN0QXNpbmgoc2VsZik6CkBAIC0zNzgsOSArNDQ5LDkgQEAKIAogICAgIGRlZiB0ZXN0Q29zKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguY29zKQotICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MoLXBpLzIpJywgbWF0aC5jb3MoLW1hdGgucGkvMiksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2NvcygtcGkvMiknLCBtYXRoLmNvcygtbWF0aC5waS8yKSwgMCwgYWJzX3RvbD11bHAoMSkpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2NvcygwKScsIG1hdGguY29zKDApLCAxKQotICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MocGkvMiknLCBtYXRoLmNvcyhtYXRoLnBpLzIpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MocGkvMiknLCBtYXRoLmNvcyhtYXRoLnBpLzIpLCAwLCBhYnNfdG9sPXVscCgxKSkKICAgICAgICAgc2VsZi5mdGVzdCgnY29zKHBpKScsIG1hdGguY29zKG1hdGgucGkpLCAtMSkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5jb3MoSU5GKSkpCkBAIC00MDMsNiArNDc0LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnZGVncmVlcyhwaSknLCBtYXRoLmRlZ3JlZXMobWF0aC5waSksIDE4MC4wKQogICAgICAgICBzZWxmLmZ0ZXN0KCdkZWdyZWVzKHBpLzIpJywgbWF0aC5kZWdyZWVzKG1hdGgucGkvMiksIDkwLjApCiAgICAgICAgIHNlbGYuZnRlc3QoJ2RlZ3JlZXMoLXBpLzQpJywgbWF0aC5kZWdyZWVzKC1tYXRoLnBpLzQpLCAtNDUuMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZGVncmVlcygwKScsIG1hdGguZGVncmVlcygwKSwgMCkKIAogICAgIGRlZiB0ZXN0RXhwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZXhwKQpAQCAtNDEyLDYgKzQ4NCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5leHAoSU5GKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZXhwKE5JTkYpLCAwLikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5leHAoTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG1hdGguZXhwLCAxMDAwMDAwKQogCiAgICAgZGVmIHRlc3RGYWJzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZmFicykKQEAgLTY1NCw2ICs3MjcsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguaHlwb3QoSU5GLCBOQU4pLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5oeXBvdChOQU4sIE5JTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5oeXBvdChOSU5GLCBOQU4pLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG1hdGguaHlwb3QsIEZMT0FUX01BWCwgRkxPQVRfTUFYKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmh5cG90KDEuMCwgTkFOKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguaHlwb3QoTkFOLCAtMi4wKSkpCiAKQEAgLTcwNyw4ICs3ODEsMTAgQEAKIAogICAgIGRlZiB0ZXN0TG9nMXAoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5sb2cxcCkKLSAgICAgICAgbj0gMioqOTAKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChtYXRoLmxvZzFwKG4pLCBtYXRoLmxvZzFwKGZsb2F0KG4pKSkKKyAgICAgICAgZm9yIG4gaW4gWzIsIDIqKjkwLCAyKiozMDBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChtYXRoLmxvZzFwKG4pLCBtYXRoLmxvZzFwKGZsb2F0KG4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5sb2cxcCwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sb2cxcChJTkYpLCBJTkYpCiAKICAgICBAcmVxdWlyZXNfSUVFRV83NTQKICAgICBkZWYgdGVzdExvZzIoc2VsZik6CkBAIC05MjIsNiArOTk4LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgncmFkaWFucygxODApJywgbWF0aC5yYWRpYW5zKDE4MCksIG1hdGgucGkpCiAgICAgICAgIHNlbGYuZnRlc3QoJ3JhZGlhbnMoOTApJywgbWF0aC5yYWRpYW5zKDkwKSwgbWF0aC5waS8yKQogICAgICAgICBzZWxmLmZ0ZXN0KCdyYWRpYW5zKC00NSknLCBtYXRoLnJhZGlhbnMoLTQ1KSwgLW1hdGgucGkvNCkKKyAgICAgICAgc2VsZi5mdGVzdCgncmFkaWFucygwKScsIG1hdGgucmFkaWFucygwKSwgMCkKIAogICAgIGRlZiB0ZXN0U2luKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguc2luKQpAQCAtOTUxLDYgKzEwMjgsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdzcXJ0KDEpJywgbWF0aC5zcXJ0KDEpLCAxKQogICAgICAgICBzZWxmLmZ0ZXN0KCdzcXJ0KDQpJywgbWF0aC5zcXJ0KDQpLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguc3FydChJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguc3FydCwgLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguc3FydCwgTklORikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5zcXJ0KE5BTikpKQogCkBAIC05NzAsNyArMTA0OCw4IEBACiAgICAgZGVmIHRlc3RUYW5oKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgudGFuaCkKICAgICAgICAgc2VsZi5mdGVzdCgndGFuaCgwKScsIG1hdGgudGFuaCgwKSwgMCkKLSAgICAgICAgc2VsZi5mdGVzdCgndGFuaCgxKSt0YW5oKC0xKScsIG1hdGgudGFuaCgxKSttYXRoLnRhbmgoLTEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKDEpK3RhbmgoLTEpJywgbWF0aC50YW5oKDEpK21hdGgudGFuaCgtMSksIDAsCisgICAgICAgICAgICAgICAgICAgYWJzX3RvbD11bHAoMSkpCiAgICAgICAgIHNlbGYuZnRlc3QoJ3RhbmgoaW5mKScsIG1hdGgudGFuaChJTkYpLCAxKQogICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKC1pbmYpJywgbWF0aC50YW5oKE5JTkYpLCAtMSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC50YW5oKE5BTikpKQpAQCAtMTAyMCw3ICsxMDk5LDggQEAKIAogICAgIGRlZiB0ZXN0SXNuYW4oc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGZsb2F0KCJuYW4iKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGZsb2F0KCJpbmYiKSogMC4pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihmbG9hdCgiLW5hbiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oZmxvYXQoImluZiIpICogMC4pKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1hdGguaXNuYW4oZmxvYXQoImluZiIpKSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtYXRoLmlzbmFuKDAuKSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtYXRoLmlzbmFuKDEuKSkKQEAgLTEwODQsMzAgKzExNjQsNjQgQEAKIAogICAgIEByZXF1aXJlc19JRUVFXzc1NAogICAgIGRlZiB0ZXN0X3Rlc3RmaWxlKHNlbGYpOgorICAgICAgICAjIFNvbWUgdGVzdHMgbmVlZCB0byBiZSBza2lwcGVkIG9uIGFuY2llbnQgT1MgWCB2ZXJzaW9ucy4KKyAgICAgICAgIyBTZWUgaXNzdWUgIzI3OTUzLgorICAgICAgICBTS0lQX09OX1RJR0VSID0geyd0YW4wMDY0J30KKworICAgICAgICBvc3hfdmVyc2lvbiA9IE5vbmUKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgdmVyc2lvbl90eHQgPSBwbGF0Zm9ybS5tYWNfdmVyKClbMF0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvc3hfdmVyc2lvbiA9IHR1cGxlKG1hcChpbnQsIHZlcnNpb25fdHh0LnNwbGl0KCcuJykpKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGZhaWxfZm10ID0gInt9OiB7fSh7IXJ9KToge30iCisKKyAgICAgICAgZmFpbHVyZXMgPSBbXQogICAgICAgICBmb3IgaWQsIGZuLCBhciwgYWksIGVyLCBlaSwgZmxhZ3MgaW4gcGFyc2VfdGVzdGZpbGUodGVzdF9maWxlKToKLSAgICAgICAgICAgICMgU2tpcCBpZiBlaXRoZXIgdGhlIGlucHV0IG9yIHJlc3VsdCBpcyBjb21wbGV4LCBvciBpZgotICAgICAgICAgICAgIyBmbGFncyBpcyBub25lbXB0eQotICAgICAgICAgICAgaWYgYWkgIT0gMC4gb3IgZWkgIT0gMC4gb3IgZmxhZ3M6CisgICAgICAgICAgICAjIFNraXAgaWYgZWl0aGVyIHRoZSBpbnB1dCBvciByZXN1bHQgaXMgY29tcGxleAorICAgICAgICAgICAgaWYgYWkgIT0gMC4wIG9yIGVpICE9IDAuMDoKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgaWYgZm4gaW4gWydyZWN0JywgJ3BvbGFyJ106CiAgICAgICAgICAgICAgICAgIyBubyByZWFsIHZlcnNpb25zIG9mIHJlY3QsIHBvbGFyCiAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgU2tpcCBjZXJ0YWluIHRlc3RzIG9uIE9TIFggMTAuNC4KKyAgICAgICAgICAgIGlmIG9zeF92ZXJzaW9uIGlzIG5vdCBOb25lIGFuZCBvc3hfdmVyc2lvbiA8ICgxMCwgNSk6CisgICAgICAgICAgICAgICAgaWYgaWQgaW4gU0tJUF9PTl9USUdFUjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKwogICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIobWF0aCwgZm4pCisKKyAgICAgICAgICAgIGlmICdpbnZhbGlkJyBpbiBmbGFncyBvciAnZGl2aWRlLWJ5LXplcm8nIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIGVyID0gJ1ZhbHVlRXJyb3InCisgICAgICAgICAgICBlbGlmICdvdmVyZmxvdycgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgZXIgPSAnT3ZlcmZsb3dFcnJvcicKKwogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMoYXIpCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBleGM6Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICgoIlVuZXhwZWN0ZWQgVmFsdWVFcnJvcjogJXNcbiAgICAgICAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gdGVzdCAlczolcyglcilcbiIpICUgKGV4Yy5hcmdzWzBdLCBpZCwgZm4sIGFyKSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwobWVzc2FnZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdWYWx1ZUVycm9yJwogICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICgiVW5leHBlY3RlZCBPdmVyZmxvd0Vycm9yIGluICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgJXM6JXMoJXIpXG4iICUgKGlkLCBmbiwgYXIpKQotICAgICAgICAgICAgICAgIHNlbGYuZmFpbChtZXNzYWdlKQotICAgICAgICAgICAgc2VsZi5mdGVzdCgiJXM6JXMoJXIpIiAlIChpZCwgZm4sIGFyKSwgcmVzdWx0LCBlcikKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAnT3ZlcmZsb3dFcnJvcicKKworICAgICAgICAgICAgIyBEZWZhdWx0IHRvbGVyYW5jZXMKKyAgICAgICAgICAgIHVscF90b2wsIGFic190b2wgPSA1LCAwLjAKKworICAgICAgICAgICAgZmFpbHVyZSA9IHJlc3VsdF9jaGVjayhlciwgcmVzdWx0LCB1bHBfdG9sLCBhYnNfdG9sKQorICAgICAgICAgICAgaWYgZmFpbHVyZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIG1zZyA9IGZhaWxfZm10LmZvcm1hdChpZCwgZm4sIGFyLCBmYWlsdXJlKQorICAgICAgICAgICAgZmFpbHVyZXMuYXBwZW5kKG1zZykKKworICAgICAgICBpZiBmYWlsdXJlczoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnRmFpbHVyZXMgaW4gdGVzdF90ZXN0ZmlsZTpcbiAgJyArCisgICAgICAgICAgICAgICAgICAgICAgJ1xuICAnLmpvaW4oZmFpbHVyZXMpKQogCiAgICAgQHJlcXVpcmVzX0lFRUVfNzU0CiAgICAgZGVmIHRlc3RfbXRlc3RmaWxlKHNlbGYpOgotICAgICAgICBmYWlsX2ZtdCA9ICJ7fTp7fSh7IXJ9KTogZXhwZWN0ZWQgeyFyfSwgZ290IHshcn0iCisgICAgICAgIGZhaWxfZm10ID0gInt9OiB7fSh7IXJ9KToge30iCiAKICAgICAgICAgZmFpbHVyZXMgPSBbXQogICAgICAgICBmb3IgaWQsIGZuLCBhcmcsIGV4cGVjdGVkLCBmbGFncyBpbiBwYXJzZV9tdGVzdGZpbGUobWF0aF90ZXN0Y2FzZXMpOgpAQCAtMTEyNSw0MSArMTIzOSw0OCBAQAogICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CiAgICAgICAgICAgICAgICAgZ290ID0gJ092ZXJmbG93RXJyb3InCiAKLSAgICAgICAgICAgIGFjY3VyYWN5X2ZhaWx1cmUgPSBOb25lCi0gICAgICAgICAgICBpZiBpc2luc3RhbmNlKGdvdCwgZmxvYXQpIGFuZCBpc2luc3RhbmNlKGV4cGVjdGVkLCBmbG9hdCk6Ci0gICAgICAgICAgICAgICAgaWYgbWF0aC5pc25hbihleHBlY3RlZCkgYW5kIG1hdGguaXNuYW4oZ290KToKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICBpZiBub3QgbWF0aC5pc25hbihleHBlY3RlZCkgYW5kIG5vdCBtYXRoLmlzbmFuKGdvdCk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIGZuID09ICdsZ2FtbWEnOgotICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSB1c2UgYSB3ZWFrZXIgYWNjdXJhY3kgdGVzdCBmb3IgbGdhbW1hOwotICAgICAgICAgICAgICAgICAgICAgICAgIyBsZ2FtbWEgb25seSBhY2hpZXZlcyBhbiBhYnNvbHV0ZSBlcnJvciBvZgotICAgICAgICAgICAgICAgICAgICAgICAgIyBhIGZldyBtdWx0aXBsZXMgb2YgdGhlIG1hY2hpbmUgYWNjdXJhY3ksIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYWwuCi0gICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeV9mYWlsdXJlID0gYWNjX2NoZWNrKGV4cGVjdGVkLCBnb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9lcnIgPSA1ZS0xNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzX2VyciA9IDVlLTE1KQotICAgICAgICAgICAgICAgICAgICBlbGlmIGZuID09ICdlcmZjJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICMgZXJmYyBoYXMgbGVzcy10aGFuLWlkZWFsIGFjY3VyYWN5IGZvciBsYXJnZQotICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgKHggfiAyNSBvciBzbyksIG1haW5seSBkdWUgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAjIGVycm9yIGludm9sdmVkIGluIGNvbXB1dGluZyBleHAoLXgqeCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAjCi0gICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCBXb3VsZCBiZSBiZXR0ZXIgdG8gd2Vha2VuIHRoaXMgdGVzdCBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIGZvciBsYXJnZSB4LCBpbnN0ZWFkIG9mIGZvciBhbGwgeC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VyYWN5X2ZhaWx1cmUgPSB1bHBzX2NoZWNrKGV4cGVjdGVkLCBnb3QsIDIwMDApCisgICAgICAgICAgICAjIERlZmF1bHQgdG9sZXJhbmNlcworICAgICAgICAgICAgdWxwX3RvbCwgYWJzX3RvbCA9IDUsIDAuMAogCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeV9mYWlsdXJlID0gdWxwc19jaGVjayhleHBlY3RlZCwgZ290LCAyMCkKLSAgICAgICAgICAgICAgICAgICAgaWYgYWNjdXJhY3lfZmFpbHVyZSBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgRXhjZXB0aW9ucyB0byB0aGUgZGVmYXVsdHMKKyAgICAgICAgICAgIGlmIGZuID09ICdnYW1tYSc6CisgICAgICAgICAgICAgICAgIyBFeHBlcmltZW50YWwgcmVzdWx0cyBvbiBvbmUgcGxhdGZvcm0gZ2F2ZQorICAgICAgICAgICAgICAgICMgYW4gYWNjdXJhY3kgb2YgPD0gMTAgdWxwcyBhY3Jvc3MgdGhlIGVudGlyZSBmbG9hdAorICAgICAgICAgICAgICAgICMgZG9tYWluLiBXZSB3ZWFrZW4gdGhhdCB0byByZXF1aXJlIDIwIHVscCBhY2N1cmFjeS4KKyAgICAgICAgICAgICAgICB1bHBfdG9sID0gMjAKIAotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShnb3QsIHN0cikgYW5kIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIHN0cik6Ci0gICAgICAgICAgICAgICAgaWYgZ290ID09IGV4cGVjdGVkOgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBmbiA9PSAnbGdhbW1hJzoKKyAgICAgICAgICAgICAgICAjIHdlIHVzZSBhIHdlYWtlciBhY2N1cmFjeSB0ZXN0IGZvciBsZ2FtbWE7CisgICAgICAgICAgICAgICAgIyBsZ2FtbWEgb25seSBhY2hpZXZlcyBhbiBhYnNvbHV0ZSBlcnJvciBvZgorICAgICAgICAgICAgICAgICMgYSBmZXcgbXVsdGlwbGVzIG9mIHRoZSBtYWNoaW5lIGFjY3VyYWN5LCBpbgorICAgICAgICAgICAgICAgICMgZ2VuZXJhbC4KKyAgICAgICAgICAgICAgICBhYnNfdG9sID0gMWUtMTUKIAotICAgICAgICAgICAgZmFpbF9tc2cgPSBmYWlsX2ZtdC5mb3JtYXQoaWQsIGZuLCBhcmcsIGV4cGVjdGVkLCBnb3QpCi0gICAgICAgICAgICBpZiBhY2N1cmFjeV9mYWlsdXJlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIGZhaWxfbXNnICs9ICcgKHt9KScuZm9ybWF0KGFjY3VyYWN5X2ZhaWx1cmUpCi0gICAgICAgICAgICBmYWlsdXJlcy5hcHBlbmQoZmFpbF9tc2cpCisgICAgICAgICAgICBlbGlmIGZuID09ICdlcmZjJyBhbmQgYXJnID49IDAuMDoKKyAgICAgICAgICAgICAgICAjIGVyZmMgaGFzIGxlc3MtdGhhbi1pZGVhbCBhY2N1cmFjeSBmb3IgbGFyZ2UKKyAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyAoeCB+IDI1IG9yIHNvKSwgbWFpbmx5IGR1ZSB0byB0aGUKKyAgICAgICAgICAgICAgICAjIGVycm9yIGludm9sdmVkIGluIGNvbXB1dGluZyBleHAoLXgqeCkuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgT2JzZXJ2ZWQgYmV0d2VlbiBDUHl0aG9uIGFuZCBtcG1hdGggYXQgMjUgZHA6CisgICAgICAgICAgICAgICAgIyAgICAgICB4IDwgIDAgOiBlcnIgPD0gMiB1bHAKKyAgICAgICAgICAgICAgICAjICAwIDw9IHggPCAgMSA6IGVyciA8PSAxMCB1bHAKKyAgICAgICAgICAgICAgICAjICAxIDw9IHggPCAxMCA6IGVyciA8PSAxMDAgdWxwCisgICAgICAgICAgICAgICAgIyAxMCA8PSB4IDwgMjAgOiBlcnIgPD0gMzAwIHVscAorICAgICAgICAgICAgICAgICMgMjAgPD0geCAgICAgIDogPCA2MDAgdWxwCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgIGlmIGFyZyA8IDEuMDoKKyAgICAgICAgICAgICAgICAgICAgdWxwX3RvbCA9IDEwCisgICAgICAgICAgICAgICAgZWxpZiBhcmcgPCAxMC4wOgorICAgICAgICAgICAgICAgICAgICB1bHBfdG9sID0gMTAwCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdWxwX3RvbCA9IDEwMDAKKworICAgICAgICAgICAgZmFpbHVyZSA9IHJlc3VsdF9jaGVjayhleHBlY3RlZCwgZ290LCB1bHBfdG9sLCBhYnNfdG9sKQorICAgICAgICAgICAgaWYgZmFpbHVyZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIG1zZyA9IGZhaWxfZm10LmZvcm1hdChpZCwgZm4sIGFyZywgZmFpbHVyZSkKKyAgICAgICAgICAgIGZhaWx1cmVzLmFwcGVuZChtc2cpCiAKICAgICAgICAgaWYgZmFpbHVyZXM6CiAgICAgICAgICAgICBzZWxmLmZhaWwoJ0ZhaWx1cmVzIGluIHRlc3RfbXRlc3RmaWxlOlxuICAnICsKQEAgLTEyNzIsNyArMTM5Myw4IEBACiAKICAgICAgICAgZGVjaW1hbF9leGFtcGxlcyA9IFsoRGVjaW1hbCgnMS4wMDAwMDAwMScpLCBEZWNpbWFsKCcxLjAnKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERlY2ltYWwoJzEuMDAwMDAwMDFlLTIwJyksIERlY2ltYWwoJzEuMGUtMjAnKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKERlY2ltYWwoJzEuMDAwMDAwMDFlLTEwMCcpLCBEZWNpbWFsKCcxLjBlLTEwMCcpKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGVjaW1hbCgnMS4wMDAwMDAwMWUtMTAwJyksIERlY2ltYWwoJzEuMGUtMTAwJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWNpbWFsKCcxLjAwMDAwMDAxZTIwJyksIERlY2ltYWwoJzEuMGUyMCcpKV0KICAgICAgICAgc2VsZi5hc3NlcnRBbGxDbG9zZShkZWNpbWFsX2V4YW1wbGVzLCByZWxfdG9sPTFlLTgpCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxsTm90Q2xvc2UoZGVjaW1hbF9leGFtcGxlcywgcmVsX3RvbD0xZS05KQogCkBAIC0xMjgwLDggKzE0MDIsMTAgQEAKICAgICAgICAgIyB0ZXN0IHdpdGggRnJhY3Rpb24gdmFsdWVzCiAgICAgICAgIGZyb20gZnJhY3Rpb25zIGltcG9ydCBGcmFjdGlvbgogCi0gICAgICAgICMgY291bGQgdXNlIHNvbWUgbW9yZSBleGFtcGxlcyBoZXJlIQotICAgICAgICBmcmFjdGlvbl9leGFtcGxlcyA9IFsoRnJhY3Rpb24oMSwgMTAwMDAwMDAwKSArIDEsIEZyYWN0aW9uKDEpKV0KKyAgICAgICAgZnJhY3Rpb25fZXhhbXBsZXMgPSBbCisgICAgICAgICAgICAoRnJhY3Rpb24oMSwgMTAwMDAwMDAwKSArIDEsIEZyYWN0aW9uKDEpKSwKKyAgICAgICAgICAgIChGcmFjdGlvbigxMDAwMDAwMDEpLCBGcmFjdGlvbigxMDAwMDAwMDApKSwKKyAgICAgICAgICAgIChGcmFjdGlvbigxMCoqOCArIDEsIDEwKioyOCksIEZyYWN0aW9uKDEsIDEwKioyMCkpXQogICAgICAgICBzZWxmLmFzc2VydEFsbENsb3NlKGZyYWN0aW9uX2V4YW1wbGVzLCByZWxfdG9sPTFlLTgpCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxsTm90Q2xvc2UoZnJhY3Rpb25fZXhhbXBsZXMsIHJlbF90b2w9MWUtOSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQppbmRleCA2ODU2NTkzLi40ZTJjOTA4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQpAQCAtMTAxLDUgKzEwMSwxMSBAQAogICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoImltYWdlLmpwZyIpLCAoImltYWdlL2pwZWciLCBOb25lKSkKICAgICAgICAgZXEoc2VsZi5kYi5ndWVzc190eXBlKCJpbWFnZS5wbmciKSwgKCJpbWFnZS9wbmciLCBOb25lKSkKIAorCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgbWltZXR5cGVzKQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21tYXAucHkgYi9MaWIvdGVzdC90ZXN0X21tYXAucHkKaW5kZXggYjM2NWQ4NC4uYmJiNDA3MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tbWFwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbW1hcC5weQpAQCAtNzEzLDYgKzcxMywxNCBAQAogICAgICAgICBnY19jb2xsZWN0KCkKICAgICAgICAgc2VsZi5hc3NlcnRJcyh3cigpLCBOb25lKQogCisgICAgZGVmIHRlc3Rfd3JpdGVfcmV0dXJuaW5nX3RoZV9udW1iZXJfb2ZfYnl0ZXNfd3JpdHRlbihzZWxmKToKKyAgICAgICAgbW0gPSBtbWFwLm1tYXAoLTEsIDE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1tLndyaXRlKGIiIiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW0ud3JpdGUoYiJ4IiksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW0ud3JpdGUoYiJ5eiIpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1tLndyaXRlKGIicHl0aG9uIiksIDYpCisKKwogY2xhc3MgTGFyZ2VNbWFwVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHNldFVwKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tc2lsaWIucHkgYi9MaWIvdGVzdC90ZXN0X21zaWxpYi5weQppbmRleCA4ZWYzMzRmLi5mNjU2ZjcyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21zaWxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X21zaWxpYi5weQpAQCAtMSw2ICsxLDUgQEAKICIiIiBUZXN0IHN1aXRlIGZvciB0aGUgY29kZSBpbiBtc2lsaWIgIiIiCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBvcwogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGltcG9ydF9tb2R1bGUKIG1zaWxpYiA9IGltcG9ydF9tb2R1bGUoJ21zaWxpYicpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CmluZGV4IDhkN2EyMTMuLjAxYTFjZDMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQpAQCAtNSw3ICs1LDcgQEAKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOCi1pbXBvcnQgdW5pdHRlc3QsIGlvLCBjb2RlY3MsIHN5cywgb3MKK2ltcG9ydCB1bml0dGVzdCwgaW8sIGNvZGVjcywgc3lzCiBpbXBvcnQgX211bHRpYnl0ZWNvZGVjCiAKIEFMTF9DSktFTkNPRElOR1MgPSBbCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZ19mb3JrLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmdfZm9yay5weQppbmRleCAyYmY0ZTc1Li45ZjIyNTAwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZ19mb3JrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nX2ZvcmsucHkKQEAgLTEsNiArMSwxMiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdGVzdC5fdGVzdF9tdWx0aXByb2Nlc3NpbmcKIAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CisKK2lmIHN1cHBvcnQuUEdPOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJ0ZXN0IGlzIG5vdCBoZWxwZnVsIGZvciBQR08iKQorCisKIHRlc3QuX3Rlc3RfbXVsdGlwcm9jZXNzaW5nLmluc3RhbGxfdGVzdHNfaW5fbW9kdWxlX2RpY3QoZ2xvYmFscygpLCAnZm9yaycpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZ19mb3Jrc2VydmVyLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmdfZm9ya3NlcnZlci5weQppbmRleCAxOTNhMDRhLi40MDdiYjNmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZ19mb3Jrc2VydmVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nX2ZvcmtzZXJ2ZXIucHkKQEAgLTEsNiArMSwxMSBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdGVzdC5fdGVzdF9tdWx0aXByb2Nlc3NpbmcKIAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CisKK2lmIHN1cHBvcnQuUEdPOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJ0ZXN0IGlzIG5vdCBoZWxwZnVsIGZvciBQR08iKQorCiB0ZXN0Ll90ZXN0X211bHRpcHJvY2Vzc2luZy5pbnN0YWxsX3Rlc3RzX2luX21vZHVsZV9kaWN0KGdsb2JhbHMoKSwgJ2ZvcmtzZXJ2ZXInKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmdfbWFpbl9oYW5kbGluZy5weSBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nX21haW5faGFuZGxpbmcucHkKaW5kZXggNTIyNzNlYS4uMzI1OTNkYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmdfbWFpbl9oYW5kbGluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZ19tYWluX2hhbmRsaW5nLnB5CkBAIC02LDcgKzYsNiBAQAogCiBpbXBvcnQgaW1wb3J0bGliCiBpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeQotaW1wb3J0IHppcGltcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKQEAgLTE1LDcgKzE0LDEwIEBACiAKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0ICgKICAgICBtYWtlX3BrZywgbWFrZV9zY3JpcHQsIG1ha2VfemlwX3BrZywgbWFrZV96aXBfc2NyaXB0LAotICAgIGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZSwgc3Bhd25fcHl0aG9uLCBraWxsX3B5dGhvbikKKyAgICBhc3NlcnRfcHl0aG9uX29rKQorCitpZiBzdXBwb3J0LlBHTzoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgidGVzdCBpcyBub3QgaGVscGZ1bCBmb3IgUEdPIikKIAogIyBMb29rIHVwIHdoaWNoIHN0YXJ0IG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byB0ZXN0CiBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZ19zcGF3bi5weSBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nX3NwYXduLnB5CmluZGV4IDMzNGFlOWUuLjY1NTg5NTIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nX3NwYXduLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nX3NwYXduLnB5CkBAIC0xLDYgKzEsMTEgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHRlc3QuX3Rlc3RfbXVsdGlwcm9jZXNzaW5nCiAKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCitpZiBzdXBwb3J0LlBHTzoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgidGVzdCBpcyBub3QgaGVscGZ1bCBmb3IgUEdPIikKKwogdGVzdC5fdGVzdF9tdWx0aXByb2Nlc3NpbmcuaW5zdGFsbF90ZXN0c19pbl9tb2R1bGVfZGljdChnbG9iYWxzKCksICdzcGF3bicpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X25pcy5weSBiL0xpYi90ZXN0L3Rlc3RfbmlzLnB5CmluZGV4IDM4N2E0ZTcuLjIxMDc0YzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbmlzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbmlzLnB5CkBAIC0xLDYgKzEsNSBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBzeXMKIAogIyBTa2lwIHRlc3QgaWYgbmlzIG1vZHVsZSBkb2VzIG5vdCBleGlzdC4KIG5pcyA9IHN1cHBvcnQuaW1wb3J0X21vZHVsZSgnbmlzJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weSBiL0xpYi90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weQppbmRleCAzMGZhNjEyLi41YjU5MGUxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5CkBAIC0zLDcgKzMsNiBAQAogCiBmcm9tIGh0dHAuY2xpZW50IGltcG9ydCBIVFRQRXhjZXB0aW9uCiBpbXBvcnQgc3lzCi1pbXBvcnQgb3MKIGZyb20gdW5pY29kZWRhdGEgaW1wb3J0IG5vcm1hbGl6ZSwgdW5pZGF0YV92ZXJzaW9uCiAKIFRFU1REQVRBRklMRSA9ICJOb3JtYWxpemF0aW9uVGVzdC50eHQiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X250cGF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfbnRwYXRoLnB5CmluZGV4IDU4MGYyMDMuLjkwZWRiNmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbnRwYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbnRwYXRoLnB5CkBAIC00NTIsNSArNDUyLDg4IEBACiAgICAgYXR0cmlidXRlcyA9IFsncmVscGF0aCcsICdzcGxpdHVuYyddCiAKIAorY2xhc3MgUGF0aExpa2VUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBwYXRoID0gbnRwYXRoCisKKyAgICBjbGFzcyBQYXRoTGlrZToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9JycpOgorICAgICAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBkZWYgX19mc3BhdGhfXyhzZWxmKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5wYXRoLCBCYXNlRXhjZXB0aW9uKToKKyAgICAgICAgICAgICAgICByYWlzZSBzZWxmLnBhdGgKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGF0aAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVfbmFtZSA9IHN1cHBvcnQuVEVTVEZOLmxvd2VyKCkKKyAgICAgICAgc2VsZi5maWxlX3BhdGggPSBzZWxmLlBhdGhMaWtlKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHNlbGYuZmlsZV9uYW1lKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlX25hbWUsICd4YicsIDApIGFzIGZpbGU6CisgICAgICAgICAgICBmaWxlLndyaXRlKGIidGVzdF9udHBhdGguUGF0aExpa2VUZXN0cyIpCisKKyAgICBkZWYgYXNzZXJ0UGF0aEVxdWFsKHNlbGYsIGZ1bmMpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoc2VsZi5maWxlX3BhdGgpLCBmdW5jKHNlbGYuZmlsZV9uYW1lKSkKKworICAgIGRlZiB0ZXN0X3BhdGhfbm9ybWNhc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5ub3JtY2FzZSkKKworICAgIGRlZiB0ZXN0X3BhdGhfaXNhYnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5pc2FicykKKworICAgIGRlZiB0ZXN0X3BhdGhfam9pbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhdGguam9pbignYScsIHNlbGYuUGF0aExpa2UoJ2InKSwgJ2MnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGguam9pbignYScsICdiJywgJ2MnKSkKKworICAgIGRlZiB0ZXN0X3BhdGhfc3BsaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5zcGxpdCkKKworICAgIGRlZiB0ZXN0X3BhdGhfc3BsaXRleHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5zcGxpdGV4dCkKKworICAgIGRlZiB0ZXN0X3BhdGhfc3BsaXRkcml2ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLnNwbGl0ZHJpdmUpCisKKyAgICBkZWYgdGVzdF9wYXRoX2Jhc2VuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguYmFzZW5hbWUpCisKKyAgICBkZWYgdGVzdF9wYXRoX2Rpcm5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5kaXJuYW1lKQorCisgICAgZGVmIHRlc3RfcGF0aF9pc2xpbmsoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5pc2xpbmspCisKKyAgICBkZWYgdGVzdF9wYXRoX2xleGlzdHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5sZXhpc3RzKQorCisgICAgZGVmIHRlc3RfcGF0aF9pc21vdW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguaXNtb3VudCkKKworICAgIGRlZiB0ZXN0X3BhdGhfZXhwYW5kdXNlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmV4cGFuZHVzZXIpCisKKyAgICBkZWYgdGVzdF9wYXRoX2V4cGFuZHZhcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5leHBhbmR2YXJzKQorCisgICAgZGVmIHRlc3RfcGF0aF9ub3JtcGF0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLm5vcm1wYXRoKQorCisgICAgZGVmIHRlc3RfcGF0aF9hYnNwYXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguYWJzcGF0aCkKKworICAgIGRlZiB0ZXN0X3BhdGhfcmVhbHBhdGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5yZWFscGF0aCkKKworICAgIGRlZiB0ZXN0X3BhdGhfcmVscGF0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLnJlbHBhdGgpCisKKyAgICBkZWYgdGVzdF9wYXRoX2NvbW1vbnBhdGgoc2VsZik6CisgICAgICAgIGNvbW1vbl9wYXRoID0gc2VsZi5wYXRoLmNvbW1vbnBhdGgoW3NlbGYuZmlsZV9wYXRoLCBzZWxmLmZpbGVfbmFtZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tbW9uX3BhdGgsIHNlbGYuZmlsZV9uYW1lKQorCisgICAgZGVmIHRlc3RfcGF0aF9pc2RpcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmlzZGlyKQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29wY29kZXMucHkgYi9MaWIvdGVzdC90ZXN0X29wY29kZXMucHkKaW5kZXggNmVmOTNkOS4uNjgwNmM2MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcGNvZGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weQpAQCAtMSw2ICsxLDcgQEAKICMgUHl0aG9uIHRlc3Qgc2V0IC0tIHBhcnQgMiwgb3Bjb2RlcwogCiBpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgYW5uX21vZHVsZQogCiBjbGFzcyBPcGNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMjAsNiArMjEsMzIgQEAKICAgICAgICAgaWYgbiAhPSA5MDoKICAgICAgICAgICAgIHNlbGYuZmFpbCgndHJ5IGluc2lkZSBmb3InKQogCisgICAgZGVmIHRlc3Rfc2V0dXBfYW5ub3RhdGlvbnNfbGluZShzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aGF0IFNFVFVQX0FOTk9UQVRJT05TIGRvZXMgbm90IGNyZWF0ZSBzcHVyaW91cyBsaW5lIG51bWJlcnMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKGFubl9tb2R1bGUuX19maWxlX18pIGFzIGY6CisgICAgICAgICAgICAgICAgdHh0ID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGNvID0gY29tcGlsZSh0eHQsIGFubl9tb2R1bGUuX19maWxlX18sICdleGVjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28uY29fZmlyc3RsaW5lbm8sIDYpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3Rfbm9fYW5ub3RhdGlvbnNfaWZfbm90X25lZWRlZChzZWxmKToKKyAgICAgICAgY2xhc3MgQzogcGFzcworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIEMuX19hbm5vdGF0aW9uc19fCisKKyAgICBkZWYgdGVzdF91c2VfZXhpc3RpbmdfYW5ub3RhdGlvbnMoc2VsZik6CisgICAgICAgIG5zID0geydfX2Fubm90YXRpb25zX18nOiB7MTogMn19CisgICAgICAgIGV4ZWMoJ3g6IGludCcsIG5zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zWydfX2Fubm90YXRpb25zX18nXSwgeyd4JzogaW50LCAxOiAyfSkKKworICAgIGRlZiB0ZXN0X2RvX25vdF9yZWNyZWF0ZV9hbm5vdGF0aW9ucyhzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlbCBfX2Fubm90YXRpb25zX18KKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yKToKKyAgICAgICAgICAgICAgICB4OiBpbnQKKwogICAgIGRlZiB0ZXN0X3JhaXNlX2NsYXNzX2V4Y2VwdGlvbnMoc2VsZik6CiAKICAgICAgICAgY2xhc3MgQUNsYXNzKEV4Y2VwdGlvbik6IHBhc3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkgYi9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5CmluZGV4IGI1YmE5NzYuLjYyNTQwOTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weQpAQCAtMTIwLDYzICsxMjAsNjMgQEAKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFkZCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hZGQsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hZGQoMywgNCkgPT0gNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5hZGQoMywgNCksIDcpCiAKICAgICBkZWYgdGVzdF9iaXR3aXNlX2FuZChzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFuZF8pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYW5kXywgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmFuZF8oMHhmLCAweGEpID09IDB4YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5hbmRfKDB4ZiwgMHhhKSwgMHhhKQogCiAgICAgZGVmIHRlc3RfY29uY2F0KHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29uY2F0KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdCgncHknLCAndGhvbicpID09ICdweXRob24nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KFsxLCAyXSwgWzMsIDRdKSA9PSBbMSwgMiwgMywgNF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoU2VxMShbNSwgNl0pLCBTZXExKFs3XSkpID09IFs1LCA2LCA3XSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdChTZXEyKFs1LCA2XSksIFNlcTIoWzddKSkgPT0gWzUsIDYsIDddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvbmNhdCgncHknLCAndGhvbicpLCAncHl0aG9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5jb25jYXQoWzEsIDJdLCBbMywgNF0pLCBbMSwgMiwgMywgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuY29uY2F0KFNlcTEoWzUsIDZdKSwgU2VxMShbN10pKSwgWzUsIDYsIDddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvbmNhdChTZXEyKFs1LCA2XSksIFNlcTIoWzddKSksIFs1LCA2LCA3XSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQsIDEzLCAyOSkKIAogICAgIGRlZiB0ZXN0X2NvdW50T2Yoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb3VudE9mKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgMykgPT0gMSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCA1KSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCAzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgNSksIDApCiAKICAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIGEgPSBbNCwgMywgMiwgMV0KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxpdGVtLCBhKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5kZWxpdGVtKGEsIDEpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFs0LCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUob3BlcmF0b3IuZGVsaXRlbShhLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbNCwgMiwgMV0pCiAKICAgICBkZWYgdGVzdF9mbG9vcmRpdihzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZmxvb3JkaXYoNSwgMikgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5mbG9vcmRpdig1LCAyKSwgMikKIAogICAgIGRlZiB0ZXN0X3RydWVkaXYoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci50cnVlZGl2LCA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci50cnVlZGl2KDUsIDIpID09IDIuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci50cnVlZGl2KDUsIDIpLCAyLjUpCiAKICAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIGEgPSByYW5nZSgxMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIGEsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZXRpdGVtKGEsIDIpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuZ2V0aXRlbShhLCAyKSwgMikKIAogICAgIGRlZiB0ZXN0X2luZGV4T2Yoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleE9mKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pbmRleE9mKFs0LCAzLCAyLCAxXSwgMykgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pbmRleE9mKFs0LCAzLCAyLCAxXSwgMyksIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YsIFs0LCAzLCAyLCAxXSwgMCkKIAogICAgIGRlZiB0ZXN0X2ludmVydChzZWxmKToKQEAgLTE4OSwyMSArMTg5LDIxIEBACiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sc2hpZnQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubHNoaWZ0LCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxzaGlmdCg1LCAxKSA9PSAxMCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxzaGlmdCg1LCAwKSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmxzaGlmdCg1LCAxKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IubHNoaWZ0KDUsIDApLCA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5sc2hpZnQsIDIsIC0xKQogCiAgICAgZGVmIHRlc3RfbW9kKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubW9kKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm1vZCwgTm9uZSwgNDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5tb2QoNSwgMikgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5tb2QoNSwgMiksIDEpCiAKICAgICBkZWYgdGVzdF9tdWwoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tdWwpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubXVsLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubXVsKDUsIDIpID09IDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLm11bCg1LCAyKSwgMTApCiAKICAgICBkZWYgdGVzdF9tYXRtdWwoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iub3JfKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm9yXywgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm9yXygweGEsIDB4NSkgPT0gMHhmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLm9yXygweGEsIDB4NSksIDB4ZikKIAogICAgIGRlZiB0ZXN0X3BvcyhzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQpAQCAtMjUwLDggKzI1MCw4IEBACiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yc2hpZnQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucnNoaWZ0LCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJzaGlmdCg1LCAxKSA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucnNoaWZ0KDUsIDApID09IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IucnNoaWZ0KDUsIDEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLnJzaGlmdCg1LCAwKSwgNSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3BlcmF0b3IucnNoaWZ0LCAyLCAtMSkKIAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgpAQCAtMjY2LDE1ICsyNjYsMTUgQEAKICAgICAgICAgYSA9IGxpc3QocmFuZ2UoMykpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgYSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2V0aXRlbShhLCAwLCAyKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbMiwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKG9wZXJhdG9yLnNldGl0ZW0oYSwgMCwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgWzIsIDEsIDJdKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCA0LCAyKQogCiAgICAgZGVmIHRlc3Rfc3ViKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc3ViKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnN1YiwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnN1Yig1LCAyKSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLnN1Yig1LCAyKSwgMykKIAogICAgIGRlZiB0ZXN0X3RydXRoKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCkBAIC0yOTIsNyArMjkyLDcgQEAKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnhvcikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci54b3IsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci54b3IoMHhiLCAweGMpID09IDB4NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci54b3IoMHhiLCAweGMpLCAweDcpCiAKICAgICBkZWYgdGVzdF9pcyhzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKaW5kZXggNzYyMWMyNC4uOTFhMDMxOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CkBAIC0xNiw2ICsxNiw3IEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogCitpbXBvcnQgb3B0cGFyc2UKIGZyb20gb3B0cGFyc2UgaW1wb3J0IG1ha2Vfb3B0aW9uLCBPcHRpb24sIFwKICAgICAgVGl0bGVkSGVscEZvcm1hdHRlciwgT3B0aW9uUGFyc2VyLCBPcHRpb25Hcm91cCwgXAogICAgICBTVVBQUkVTU19VU0FHRSwgT3B0aW9uRXJyb3IsIE9wdGlvbkNvbmZsaWN0RXJyb3IsIFwKQEAgLTE2NTAsNiArMTY1MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIC1sOiBpbnZhbGlkIGludGVnZXIgdmFsdWU6ICcweDEyeCciKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J2NoZWNrX2J1aWx0aW4nLCAnQW1iaWd1b3VzT3B0aW9uRXJyb3InLCAnTk9fREVGQVVMVCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIG9wdHBhcnNlLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcmRlcmVkX2RpY3QucHkgYi9MaWIvdGVzdC90ZXN0X29yZGVyZWRfZGljdC5weQppbmRleCA5MDFkNGIyLi4yZGEzNmQzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29yZGVyZWRfZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X29yZGVyZWRfZGljdC5weQpAQCAtMSwzICsxLDQgQEAKK2ltcG9ydCBidWlsdGlucwogaW1wb3J0IGNvbnRleHRsaWIKIGltcG9ydCBjb3B5CiBpbXBvcnQgZ2MKQEAgLTk3LDYgKzk4LDE5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgT3JkZXJlZERpY3QoKS51cGRhdGUsICgpLCAoKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBPcmRlcmVkRGljdC51cGRhdGUpCiAKKyAgICBkZWYgdGVzdF9pbml0X2NhbGxzKHNlbGYpOgorICAgICAgICBjYWxscyA9IFtdCisgICAgICAgIGNsYXNzIFNwYW06CisgICAgICAgICAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgICAgICAgICBjYWxscy5hcHBlbmQoJ2tleXMnKQorICAgICAgICAgICAgICAgIHJldHVybiAoKQorICAgICAgICAgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICAgICAgICAgIGNhbGxzLmFwcGVuZCgnaXRlbXMnKQorICAgICAgICAgICAgICAgIHJldHVybiAoKQorCisgICAgICAgIHNlbGYuT3JkZXJlZERpY3QoU3BhbSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGxzLCBbJ2tleXMnXSkKKwogICAgIGRlZiB0ZXN0X2Zyb21rZXlzKHNlbGYpOgogICAgICAgICBPcmRlcmVkRGljdCA9IHNlbGYuT3JkZXJlZERpY3QKICAgICAgICAgb2QgPSBPcmRlcmVkRGljdC5mcm9ta2V5cygnYWJjJykKQEAgLTI5OCw5ICszMTIsMTEgQEAKICAgICAgICAgIyBkbyBub3Qgc2F2ZSBpbnN0YW5jZSBkaWN0aW9uYXJ5IGlmIG5vdCBuZWVkZWQKICAgICAgICAgcGFpcnMgPSBbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0KICAgICAgICAgb2QgPSBPcmRlcmVkRGljdChwYWlycykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG9kLl9fZGljdF9fLCBkaWN0KQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShvZC5fX3JlZHVjZV9fKClbMl0pCiAgICAgICAgIG9kLnggPSAxMAotICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShvZC5fX3JlZHVjZV9fKClbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QuX19kaWN0X19bJ3gnXSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QuX19yZWR1Y2VfXygpWzJdLCB7J3gnOiAxMH0pCiAKICAgICBkZWYgdGVzdF9waWNrbGVfcmVjdXJzaXZlKHNlbGYpOgogICAgICAgICBPcmRlcmVkRGljdCA9IHNlbGYuT3JkZXJlZERpY3QKQEAgLTQwMyw2ICs0MTksMTQgQEAKICAgICAgICAgb2QgPSBPcmRlcmVkRGljdCgqKmQpCiAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihzeXMuZ2V0c2l6ZW9mKG9kKSwgc3lzLmdldHNpemVvZihkKSkKIAorICAgIGRlZiB0ZXN0X3ZpZXdzKHNlbGYpOgorICAgICAgICBPcmRlcmVkRGljdCA9IHNlbGYuT3JkZXJlZERpY3QKKyAgICAgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI0Mjg2CisgICAgICAgIHMgPSAndGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciBhIGxhenkgZG9nIHllc3RlcmRheSBiZWZvcmUgZGF3bicuc3BsaXQoKQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0LmZyb21rZXlzKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2Qua2V5cygpLCBkaWN0KG9kKS5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QuaXRlbXMoKSwgZGljdChvZCkuaXRlbXMoKSkKKwogICAgIGRlZiB0ZXN0X292ZXJyaWRlX3VwZGF0ZShzZWxmKToKICAgICAgICAgT3JkZXJlZERpY3QgPSBzZWxmLk9yZGVyZWREaWN0CiAgICAgICAgICMgVmVyaWZ5IHRoYXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdXBkYXRlKCkgd2l0aG91dCBicmVha2luZyBfX2luaXRfXygpCkBAIC02MTEsNiArNjM1LDI1IEBACiAgICAgT3JkZXJlZERpY3QgPSBweV9jb2xsLk9yZGVyZWREaWN0CiAKIAorY2xhc3MgQ1B5dGhvbkJ1aWx0aW5EaWN0VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIkJ1aWx0aW4gZGljdCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyLgorCisgICAgUmV1c2Ugc29tZSBvZiB0ZXN0cyBpbiBPcmRlcmVkRGljdCBzZWxlY3RpdmVseS4KKyAgICAiIiIKKworICAgIG1vZHVsZSA9IGJ1aWx0aW5zCisgICAgT3JkZXJlZERpY3QgPSBkaWN0CisKK2ZvciBtZXRob2QgaW4gKAorICAgICJ0ZXN0X2luaXQgdGVzdF91cGRhdGUgdGVzdF9hYmMgdGVzdF9jbGVhciB0ZXN0X2RlbGl0ZW0gIiArCisgICAgInRlc3Rfc2V0aXRlbSB0ZXN0X2RldGVjdF9kZWxldGlvbl9kdXJpbmdfaXRlcmF0aW9uICIgKworICAgICJ0ZXN0X3BvcGl0ZW0gdGVzdF9yZWluc2VydCB0ZXN0X292ZXJyaWRlX3VwZGF0ZSAiICsKKyAgICAidGVzdF9oaWdobHlfbmVzdGVkIHRlc3RfaGlnaGx5X25lc3RlZF9zdWJjbGFzcyAiICsKKyAgICAidGVzdF9kZWxpdGVtX2hhc2hfY29sbGlzaW9uICIpLnNwbGl0KCk6CisgICAgc2V0YXR0cihDUHl0aG9uQnVpbHRpbkRpY3RUZXN0cywgbWV0aG9kLCBnZXRhdHRyKE9yZGVyZWREaWN0VGVzdHMsIG1ldGhvZCkpCitkZWwgbWV0aG9kCisKKwogQHVuaXR0ZXN0LnNraXBVbmxlc3MoY19jb2xsLCAncmVxdWlyZXMgdGhlIEMgdmVyc2lvbiBvZiB0aGUgY29sbGVjdGlvbnMgbW9kdWxlJykKIGNsYXNzIENQeXRob25PcmRlcmVkRGljdFRlc3RzKE9yZGVyZWREaWN0VGVzdHMsIHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtNjI1LDE4ICs2NjgsMTkgQEAKICAgICAgICAgc2l6ZSA9IHN1cHBvcnQuY2FsY29ianNpemUKICAgICAgICAgY2hlY2sgPSBzZWxmLmNoZWNrX3NpemVvZgogCi0gICAgICAgIGJhc2ljc2l6ZSA9IHNpemUoJ24yUCcgKyAnM1BuUG4yUCcpICsgY2FsY3NpemUoJzJuUG4nKQotICAgICAgICBlbnRyeXNpemUgPSBjYWxjc2l6ZSgnbjJQJykgKyBjYWxjc2l6ZSgnUCcpCisgICAgICAgIGJhc2ljc2l6ZSA9IHNpemUoJ24yUDNQblBuMlAnKSArIDggKyBjYWxjc2l6ZSgnMm5QMm4nKQorICAgICAgICBlbnRyeXNpemUgPSBjYWxjc2l6ZSgnbjJQJykKKyAgICAgICAgcCA9IGNhbGNzaXplKCdQJykKICAgICAgICAgbm9kZXNpemUgPSBjYWxjc2l6ZSgnUG4yUCcpCiAKICAgICAgICAgb2QgPSBPcmRlcmVkRGljdCgpCi0gICAgICAgIGNoZWNrKG9kLCBiYXNpY3NpemUgKyA4KmVudHJ5c2l6ZSkKKyAgICAgICAgY2hlY2sob2QsIGJhc2ljc2l6ZSArIDgqcCArIDggKyA1KmVudHJ5c2l6ZSkgICMgOGJ5dGUgaW5kaWNpZXMgKyA4KjIvLzMgKiBlbnRyeSB0YWJsZQogICAgICAgICBvZC54ID0gMQotICAgICAgICBjaGVjayhvZCwgYmFzaWNzaXplICsgOCplbnRyeXNpemUpCisgICAgICAgIGNoZWNrKG9kLCBiYXNpY3NpemUgKyA4KnAgKyA4ICsgNSplbnRyeXNpemUpCiAgICAgICAgIG9kLnVwZGF0ZShbKGksIGkpIGZvciBpIGluIHJhbmdlKDMpXSkKLSAgICAgICAgY2hlY2sob2QsIGJhc2ljc2l6ZSArIDgqZW50cnlzaXplICsgMypub2Rlc2l6ZSkKKyAgICAgICAgY2hlY2sob2QsIGJhc2ljc2l6ZSArIDgqcCArIDggKyA1KmVudHJ5c2l6ZSArIDMqbm9kZXNpemUpCiAgICAgICAgIG9kLnVwZGF0ZShbKGksIGkpIGZvciBpIGluIHJhbmdlKDMsIDEwKV0pCi0gICAgICAgIGNoZWNrKG9kLCBiYXNpY3NpemUgKyAxNiplbnRyeXNpemUgKyAxMCpub2Rlc2l6ZSkKKyAgICAgICAgY2hlY2sob2QsIGJhc2ljc2l6ZSArIDE2KnAgKyAxNiArIDEwKmVudHJ5c2l6ZSArIDEwKm5vZGVzaXplKQogCiAgICAgICAgIGNoZWNrKG9kLmtleXMoKSwgc2l6ZSgnUCcpKQogICAgICAgICBjaGVjayhvZC5pdGVtcygpLCBzaXplKCdQJykpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29zLnB5IGIvTGliL3Rlc3QvdGVzdF9vcy5weQppbmRleCA4NzRmOWU0Li45NWM3NDgyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3MucHkKQEAgLTE1LDcgKzE1LDYgQEAKIGltcG9ydCBtbWFwCiBpbXBvcnQgb3MKIGltcG9ydCBwaWNrbGUKLWltcG9ydCBwbGF0Zm9ybQogaW1wb3J0IHJlCiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc2lnbmFsCkBAIC02NSw2ICs2NCw4IEBACiAgICAgSU5UX01BWCA9IFBZX1NTSVpFX1RfTUFYID0gc3lzLm1heHNpemUKIAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaworZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHVuaXhfc2hlbGwKKwogCiByb290X2luX3Bvc2l4ID0gRmFsc2UKIGlmIGhhc2F0dHIob3MsICdnZXRldWlkJyk6CkBAIC04Miw2ICs4MywzMyBAQAogIyBJc3N1ZSAjMTQxMTA6IFNvbWUgdGVzdHMgZmFpbCBvbiBGcmVlQlNEIGlmIHRoZSB1c2VyIGlzIGluIHRoZSB3aGVlbCBncm91cC4KIEhBVkVfV0hFRUxfR1JPVVAgPSBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnZnJlZWJzZCcpIGFuZCBvcy5nZXRnaWQoKSA9PSAwCiAKKworQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKK2RlZiBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MobXNnX3JlZ2V4LCBxdWlldD1GYWxzZSk6CisgICAgd2l0aCBzdXBwb3J0LmNoZWNrX3dhcm5pbmdzKChtc2dfcmVnZXgsIERlcHJlY2F0aW9uV2FybmluZyksIHF1aWV0PXF1aWV0KToKKyAgICAgICAgeWllbGQKKworCitjbGFzcyBfUGF0aExpa2Uob3MuUGF0aExpa2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9IiIpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLnBhdGgpCisKKyAgICBkZWYgX19mc3BhdGhfXyhzZWxmKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnBhdGgsIEJhc2VFeGNlcHRpb24pOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5wYXRoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXRoCisKKworZGVmIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBjb250ZW50PWInY29udGVudCcpOgorICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInhiIiwgMCkgYXMgZnA6CisgICAgICAgIGZwLndyaXRlKGNvbnRlbnQpCisKKwogIyBUZXN0cyBjcmVhdGluZyBURVNURk4KIGNsYXNzIEZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMTQwLDkgKzE2OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWRzIElOVF9NQVggPCBQWV9TU0laRV9UX01BWCIpCiAgICAgQHN1cHBvcnQuYmlnbWVtdGVzdChzaXplPUlOVF9NQVggKyAxMCwgbWVtdXNlPTEsIGRyeV9ydW49RmFsc2UpCiAgICAgZGVmIHRlc3RfbGFyZ2VfcmVhZChzZWxmLCBzaXplKToKLSAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmcDoKLSAgICAgICAgICAgIGZwLndyaXRlKGIndGVzdCcpCiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisgICAgICAgIGNyZWF0ZV9maWxlKHN1cHBvcnQuVEVTVEZOLCBiJ3Rlc3QnKQogCiAgICAgICAgICMgSXNzdWUgIzIxOTMyOiBNYWtlIHN1cmUgdGhhdCBvcy5yZWFkKCkgZG9lcyBub3QgcmFpc2UgYW4KICAgICAgICAgIyBPdmVyZmxvd0Vycm9yIGZvciBzaXplIGxhcmdlciB0aGFuIElOVF9NQVgKQEAgLTE5OSwxMSArMjI2LDEyIEBACiAKICAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgogICAgICAgICBURVNURk4yID0gc3VwcG9ydC5URVNURk4gKyAiLjIiCi0gICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgJ3cnKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZSgiMSIpCi0gICAgICAgIHdpdGggb3BlbihURVNURk4yLCAndycpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKCIyIikKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnVubGluaywgVEVTVEZOMikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBURVNURk4yKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHN1cHBvcnQuVEVTVEZOLCBiIjEiKQorICAgICAgICBjcmVhdGVfZmlsZShURVNURk4yLCBiIjIiKQorCiAgICAgICAgIG9zLnJlcGxhY2Uoc3VwcG9ydC5URVNURk4sIFRFU1RGTjIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEZpbGVOb3RGb3VuZEVycm9yLCBvcy5zdGF0LCBzdXBwb3J0LlRFU1RGTikKICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIsICdyJykgYXMgZjoKQEAgLTIyNiwxNSArMjU0LDkgQEAKICMgVGVzdCBhdHRyaWJ1dGVzIG9uIHJldHVybiB2YWx1ZXMgZnJvbSBvcy4qc3RhdCogZmFtaWx5LgogY2xhc3MgU3RhdEF0dHJpYnV0ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIG9zLm1rZGlyKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLmZuYW1lID0gb3MucGF0aC5qb2luKHN1cHBvcnQuVEVTVEZOLCAiZjEiKQotICAgICAgICBmID0gb3BlbihzZWxmLmZuYW1lLCAnd2InKQotICAgICAgICBmLndyaXRlKGIiQUJDIikKLSAgICAgICAgZi5jbG9zZSgpCi0KLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIG9zLnVubGluayhzZWxmLmZuYW1lKQotICAgICAgICBvcy5ybWRpcihzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5mbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc2VsZi5mbmFtZSkKKyAgICAgICAgY3JlYXRlX2ZpbGUoc2VsZi5mbmFtZSwgYiJBQkMiKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3N0YXQnKSwgJ3Rlc3QgbmVlZHMgb3Muc3RhdCgpJykKICAgICBkZWYgY2hlY2tfc3RhdF9hdHRyaWJ1dGVzKHNlbGYsIGZuYW1lKToKQEAgLTMxMCw5ICszMzIsNyBAQAogICAgICAgICAgICAgZm5hbWUgPSBzZWxmLmZuYW1lLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJjYW5ub3QgZW5jb2RlICVhIGZvciB0aGUgZmlsZXN5c3RlbSIgJSBzZWxmLmZuYW1lKQotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RhdF9hdHRyaWJ1dGVzKGZuYW1lKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXRfYXR0cmlidXRlcyhmbmFtZSkKIAogICAgIGRlZiB0ZXN0X3N0YXRfcmVzdWx0X3BpY2tsZShzZWxmKToKICAgICAgICAgcmVzdWx0ID0gb3Muc3RhdChzZWxmLmZuYW1lKQpAQCAtNDI2LDcgKzQ0NiwxMSBAQAogICAgICAgICAgICAgMCkKIAogICAgICAgICAjIHRlc3QgZGlyZWN0b3J5IHN0X2ZpbGVfYXR0cmlidXRlcyAoRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZIHNldCkKLSAgICAgICAgcmVzdWx0ID0gb3Muc3RhdChzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZGlybmFtZSA9IHN1cHBvcnQuVEVTVEZOICsgImRpciIKKyAgICAgICAgb3MubWtkaXIoZGlybmFtZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJtZGlyLCBkaXJuYW1lKQorCisgICAgICAgIHJlc3VsdCA9IG9zLnN0YXQoZGlybmFtZSkKICAgICAgICAgc2VsZi5jaGVja19maWxlX2F0dHJpYnV0ZXMocmVzdWx0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgcmVzdWx0LnN0X2ZpbGVfYXR0cmlidXRlcyAmIHN0YXQuRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZLApAQCAtNDQwLDE5ICs0NjQsMTQgQEAKIAogICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIHNlbGYuZGlybmFtZSkKICAgICAgICAgb3MubWtkaXIoc2VsZi5kaXJuYW1lKQotICAgICAgICB3aXRoIG9wZW4oc2VsZi5mbmFtZSwgJ3diJykgYXMgZnA6Ci0gICAgICAgICAgICBmcC53cml0ZShiIkFCQyIpCisgICAgICAgIGNyZWF0ZV9maWxlKHNlbGYuZm5hbWUpCiAKICAgICAgICAgZGVmIHJlc3RvcmVfZmxvYXRfdGltZXMoc3RhdGUpOgotICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotCisgICAgICAgICAgICB3aXRoIGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncygnc3RhdF9mbG9hdF90aW1lcycpOgogICAgICAgICAgICAgICAgIG9zLnN0YXRfZmxvYXRfdGltZXMoc3RhdGUpCiAKICAgICAgICAgIyBlbnN1cmUgdGhhdCBzdF9hdGltZSBhbmQgc3RfbXRpbWUgYXJlIGZsb2F0Ci0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotCisgICAgICAgIHdpdGggaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzKCdzdGF0X2Zsb2F0X3RpbWVzJyk6CiAgICAgICAgICAgICBvbGRfZmxvYXRfdGltZXMgPSBvcy5zdGF0X2Zsb2F0X3RpbWVzKC0xKQogICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfZmxvYXRfdGltZXMsIG9sZF9mbG9hdF90aW1lcykKIApAQCAtNTQ0LDcgKzU2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIHN1cHBvcnQgZm9yIHV0aW1lIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuIikKICAgICBkZWYgdGVzdF91dGltZV9mZChzZWxmKToKICAgICAgICAgZGVmIHNldF90aW1lKGZpbGVuYW1lLCBucyk6Ci0gICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3YicpIGFzIGZwOgorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAnd2InLCAwKSBhcyBmcDoKICAgICAgICAgICAgICAgICAjIHVzZSBhIGZpbGUgZGVzY3JpcHRvciB0byB0ZXN0IGZ1dGltZW5zKHRpbWVzcGVjKQogICAgICAgICAgICAgICAgICMgb3IgZnV0aW1lcyh0aW1ldmFsKQogICAgICAgICAgICAgICAgIG9zLnV0aW1lKGZwLmZpbGVubygpLCBucz1ucykKQEAgLTY1NiwxOCArNjc1LDIwIEBACiAgICAgICAgIHJldHVybiBvcy5lbnZpcm9uCiAKICAgICAjIEJ1ZyAxMTEwNDc4Ci0gICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MucGF0aC5leGlzdHMoJy9iaW4vc2gnKSwgJ3JlcXVpcmVzIC9iaW4vc2gnKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHVuaXhfc2hlbGwgYW5kIG9zLnBhdGguZXhpc3RzKHVuaXhfc2hlbGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcyBhIHNoZWxsJykKICAgICBkZWYgdGVzdF91cGRhdGUyKHNlbGYpOgogICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKICAgICAgICAgb3MuZW52aXJvbi51cGRhdGUoSEVMTE89IldvcmxkIikKLSAgICAgICAgd2l0aCBvcy5wb3BlbigiL2Jpbi9zaCAtYyAnZWNobyAkSEVMTE8nIikgYXMgcG9wZW46CisgICAgICAgIHdpdGggb3MucG9wZW4oIiVzIC1jICdlY2hvICRIRUxMTyciICUgdW5peF9zaGVsbCkgYXMgcG9wZW46CiAgICAgICAgICAgICB2YWx1ZSA9IHBvcGVuLnJlYWQoKS5zdHJpcCgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCAiV29ybGQiKQogCi0gICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MucGF0aC5leGlzdHMoJy9iaW4vc2gnKSwgJ3JlcXVpcmVzIC9iaW4vc2gnKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHVuaXhfc2hlbGwgYW5kIG9zLnBhdGguZXhpc3RzKHVuaXhfc2hlbGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcyBhIHNoZWxsJykKICAgICBkZWYgdGVzdF9vc19wb3Blbl9pdGVyKHNlbGYpOgotICAgICAgICB3aXRoIG9zLnBvcGVuKAotICAgICAgICAgICAgIi9iaW4vc2ggLWMgJ2VjaG8gXCJsaW5lMVxubGluZTJcbmxpbmUzXCInIikgYXMgcG9wZW46CisgICAgICAgIHdpdGggb3MucG9wZW4oIiVzIC1jICdlY2hvIFwibGluZTFcbmxpbmUyXG5saW5lM1wiJyIKKyAgICAgICAgICAgICAgICAgICAgICAlIHVuaXhfc2hlbGwpIGFzIHBvcGVuOgogICAgICAgICAgICAgaXQgPSBpdGVyKHBvcGVuKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0KSwgImxpbmUxXG4iKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0KSwgImxpbmUyXG4iKQpAQCAtNzk4LDYgKzgxOSw3IEBACiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIGpvaW4gPSBvcy5wYXRoLmpvaW4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm10cmVlLCBzdXBwb3J0LlRFU1RGTikKIAogICAgICAgICAjIEJ1aWxkOgogICAgICAgICAjICAgICBURVNURk4vCkBAIC04MzAsOSArODUyLDggQEAKICAgICAgICAgb3MubWFrZWRpcnModDJfcGF0aCkKIAogICAgICAgICBmb3IgcGF0aCBpbiB0bXAxX3BhdGgsIHRtcDJfcGF0aCwgdG1wM19wYXRoLCB0bXA0X3BhdGg6Ci0gICAgICAgICAgICBmID0gb3BlbihwYXRoLCAidyIpCi0gICAgICAgICAgICBmLndyaXRlKCJJJ20gIiArIHBhdGggKyAiIGFuZCBwcm91ZCBvZiBpdC4gIEJsYW1lIHRlc3Rfb3MuXG4iKQotICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgIngiKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoIkknbSAiICsgcGF0aCArICIgYW5kIHByb3VkIG9mIGl0LiAgQmxhbWUgdGVzdF9vcy5cbiIpCiAKICAgICAgICAgaWYgc3VwcG9ydC5jYW5fc3ltbGluaygpOgogICAgICAgICAgICAgb3Muc3ltbGluayhvcy5wYXRoLmFic3BhdGgodDJfcGF0aCksIHNlbGYubGlua19wYXRoKQpAQCAtODU3LDEwICs4NzgsMTIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbMiArIGZsaXBwZWRdLCAoc2VsZi5zdWIxMV9wYXRoLCBbXSwgW10pKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbFszIC0gMiAqIGZsaXBwZWRdLCBzZWxmLnN1YjJfdHJlZSkKIAotICAgIGRlZiB0ZXN0X3dhbGtfcHJ1bmUoc2VsZik6CisgICAgZGVmIHRlc3Rfd2Fsa19wcnVuZShzZWxmLCB3YWxrX3BhdGg9Tm9uZSk6CisgICAgICAgIGlmIHdhbGtfcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgd2Fsa19wYXRoID0gc2VsZi53YWxrX3BhdGgKICAgICAgICAgIyBQcnVuZSB0aGUgc2VhcmNoLgogICAgICAgICBhbGwgPSBbXQotICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gc2VsZi53YWxrKHNlbGYud2Fsa19wYXRoKToKKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIHNlbGYud2Fsayh3YWxrX3BhdGgpOgogICAgICAgICAgICAgYWxsLmFwcGVuZCgocm9vdCwgZGlycywgZmlsZXMpKQogICAgICAgICAgICAgIyBEb24ndCBkZXNjZW5kIGludG8gU1VCMS4KICAgICAgICAgICAgIGlmICdTVUIxJyBpbiBkaXJzOgpAQCAtODY5LDE2ICs4OTIsMTkgQEAKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhbGwpLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi53YWxrX3BhdGgsIFsiU1VCMiJdLCBbInRtcDEiXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cih3YWxrX3BhdGgpLCBbIlNVQjIiXSwgWyJ0bXAxIl0pKQogCiAgICAgICAgIGFsbFsxXVstMV0uc29ydCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsWzFdLCBzZWxmLnN1YjJfdHJlZSkKIAorICAgIGRlZiB0ZXN0X2ZpbGVfbGlrZV9wYXRoKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3Rfd2Fsa19wcnVuZShfUGF0aExpa2Uoc2VsZi53YWxrX3BhdGgpKQorCiAgICAgZGVmIHRlc3Rfd2Fsa19ib3R0b21fdXAoc2VsZik6CiAgICAgICAgICMgV2FsayBib3R0b20tdXAuCiAgICAgICAgIGFsbCA9IGxpc3Qoc2VsZi53YWxrKHNlbGYud2Fsa19wYXRoLCB0b3Bkb3duPUZhbHNlKSkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhbGwpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhbGwpLCA0LCBhbGwpCiAgICAgICAgICMgV2UgY2FuJ3Qga25vdyB3aGljaCBvcmRlciBTVUIxIGFuZCBTVUIyIHdpbGwgYXBwZWFyIGluLgogICAgICAgICAjIE5vdCBmbGlwcGVkOiAgU1VCMTEsIFNVQjEsIFNVQjIsIFRFU1RGTgogICAgICAgICAjICAgICBmbGlwcGVkOiAgU1VCMiwgU1VCMTEsIFNVQjEsIFRFU1RGTgpAQCAtOTA4LDIyICs5MzQsNiBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgZm9sbG93IHN5bWxpbmsgd2l0aCBmb2xsb3dsaW5rcz1UcnVlIikKIAotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgIyBUZWFyIGV2ZXJ5dGhpbmcgZG93bi4gIFRoaXMgaXMgYSBkZWNlbnQgdXNlIGZvciBib3R0b20tdXAgb24KLSAgICAgICAgIyBXaW5kb3dzLCB3aGljaCBkb2Vzbid0IGhhdmUgYSByZWN1cnNpdmUgZGVsZXRlIGNvbW1hbmQuICBUaGUKLSAgICAgICAgIyAobm90IHNvKSBzdWJ0bGV0eSBpcyB0aGF0IHJtZGlyIHdpbGwgZmFpbCB1bmxlc3MgdGhlIGRpcidzCi0gICAgICAgICMga2lkcyBhcmUgcmVtb3ZlZCBmaXJzdCwgc28gYm90dG9tIHVwIGlzIGVzc2VudGlhbC4KLSAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc3VwcG9ydC5URVNURk4sIHRvcGRvd249RmFsc2UpOgotICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6Ci0gICAgICAgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihyb290LCBuYW1lKSkKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGRpcnM6Ci0gICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQotICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzbGluayhkaXJuYW1lKToKLSAgICAgICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZGlybmFtZSkKLSAgICAgICAgb3Mucm1kaXIoc3VwcG9ydC5URVNURk4pCi0KICAgICBkZWYgdGVzdF93YWxrX2JhZF9kaXIoc2VsZik6CiAgICAgICAgICMgV2FsayB0b3AtZG93bi4KICAgICAgICAgZXJyb3JzID0gW10KQEAgLTEwMDYsMjcgKzEwMTYsMTEgQEAKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLmNsb3NlLCBuZXdmZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdmZCwgbWluZmQpCiAKLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgICMgY2xlYW51cAotICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMsIHJvb3RmZCBpbiBvcy5md2FsayhzdXBwb3J0LlRFU1RGTiwgdG9wZG93bj1GYWxzZSk6Ci0gICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKLSAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSwgZGlyX2ZkPXJvb3RmZCkKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGRpcnM6Ci0gICAgICAgICAgICAgICAgc3QgPSBvcy5zdGF0KG5hbWUsIGRpcl9mZD1yb290ZmQsIGZvbGxvd19zeW1saW5rcz1GYWxzZSkKLSAgICAgICAgICAgICAgICBpZiBzdGF0LlNfSVNESVIoc3Quc3RfbW9kZSk6Ci0gICAgICAgICAgICAgICAgICAgIG9zLnJtZGlyKG5hbWUsIGRpcl9mZD1yb290ZmQpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUsIGRpcl9mZD1yb290ZmQpCi0gICAgICAgIG9zLnJtZGlyKHN1cHBvcnQuVEVTVEZOKQotCiBjbGFzcyBCeXRlc1dhbGtUZXN0cyhXYWxrVGVzdHMpOgogICAgICIiIlRlc3RzIGZvciBvcy53YWxrKCkgd2l0aCBieXRlcy4iIiIKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHN1cGVyKCkuc2V0VXAoKQogICAgICAgICBzZWxmLnN0YWNrID0gY29udGV4dGxpYi5FeGl0U3RhY2soKQotICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6Ci0gICAgICAgICAgICBzZWxmLnN0YWNrLmVudGVyX2NvbnRleHQod2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKSkKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLnN0YWNrLmNsb3NlKCkKQEAgLTEyMDMsOCArMTE5Nyw3IEBACiAgICAgICAgIG9zLm1rZGlyKGRpcmEpCiAgICAgICAgIGRpcmIgPSBvcy5wYXRoLmpvaW4oZGlyYSwgJ2RpcmInKQogICAgICAgICBvcy5ta2RpcihkaXJiKQotICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRpcmEsICdmaWxlLnR4dCcpLCAndycpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKCd0ZXh0JykKKyAgICAgICAgY3JlYXRlX2ZpbGUob3MucGF0aC5qb2luKGRpcmEsICdmaWxlLnR4dCcpKQogICAgICAgICBvcy5yZW1vdmVkaXJzKGRpcmIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoZGlyYikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhkaXJhKSkKQEAgLTEyMTUsOCArMTIwOCw3IEBACiAgICAgICAgIG9zLm1rZGlyKGRpcmEpCiAgICAgICAgIGRpcmIgPSBvcy5wYXRoLmpvaW4oZGlyYSwgJ2RpcmInKQogICAgICAgICBvcy5ta2RpcihkaXJiKQotICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRpcmIsICdmaWxlLnR4dCcpLCAndycpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKCd0ZXh0JykKKyAgICAgICAgY3JlYXRlX2ZpbGUob3MucGF0aC5qb2luKGRpcmIsICdmaWxlLnR4dCcpKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpOgogICAgICAgICAgICAgb3MucmVtb3ZlZGlycyhkaXJiKQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZGlyYikpCkBAIC0xMjI2LDcgKzEyMTgsNyBAQAogCiBjbGFzcyBEZXZOdWxsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2Rldm51bGwoc2VsZik6Ci0gICAgICAgIHdpdGggb3Blbihvcy5kZXZudWxsLCAnd2InKSBhcyBmOgorICAgICAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgJ3diJywgMCkgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoYidoZWxsbycpCiAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICdyYicpIGFzIGY6CkBAIC0xMjQzLDYgKzEyMzUsNyBAQAogCiAgICAgZGVmIHRlc3RfdXJhbmRvbV92YWx1ZShzZWxmKToKICAgICAgICAgZGF0YTEgPSBvcy51cmFuZG9tKDE2KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZGF0YTEsIGJ5dGVzKQogICAgICAgICBkYXRhMiA9IG9zLnVyYW5kb20oMTYpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGF0YTEsIGRhdGEyKQogCkBAIC0xMjYzLDYgKzEyNTYsNDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYXRhMSwgZGF0YTIpCiAKIAorQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2dldHJhbmRvbScpLCAnbmVlZCBvcy5nZXRyYW5kb20oKScpCitjbGFzcyBHZXRSYW5kb21UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MuZ2V0cmFuZG9tKDEpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGlmIGV4Yy5lcnJubyA9PSBlcnJuby5FTk9TWVM6CisgICAgICAgICAgICAgICAgIyBQeXRob24gY29tcGlsZWQgb24gYSBtb3JlIHJlY2VudCBMaW51eCB2ZXJzaW9uCisgICAgICAgICAgICAgICAgIyB0aGFuIHRoZSBjdXJyZW50IExpbnV4IGtlcm5lbAorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJnZXRyYW5kb20oKSBzeXNjYWxsIGZhaWxzIHdpdGggRU5PU1lTIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiB0ZXN0X2dldHJhbmRvbV90eXBlKHNlbGYpOgorICAgICAgICBkYXRhID0gb3MuZ2V0cmFuZG9tKDE2KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZGF0YSwgYnl0ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRhdGEpLCAxNikKKworICAgIGRlZiB0ZXN0X2dldHJhbmRvbTAoc2VsZik6CisgICAgICAgIGVtcHR5ID0gb3MuZ2V0cmFuZG9tKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW1wdHksIGInJykKKworICAgIGRlZiB0ZXN0X2dldHJhbmRvbV9yYW5kb20oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG9zLCAnR1JORF9SQU5ET00nKSkKKworICAgICAgICAjIERvbid0IHRlc3Qgb3MuZ2V0cmFuZG9tKDEsIG9zLkdSTkRfUkFORE9NKSB0byBub3QgY29uc3VtZSB0aGUgcmFyZQorICAgICAgICAjIHJlc291cmNlIC9kZXYvcmFuZG9tCisKKyAgICBkZWYgdGVzdF9nZXRyYW5kb21fbm9uYmxvY2soc2VsZik6CisgICAgICAgICMgVGhlIGNhbGwgbXVzdCBub3QgZmFpbC4gQ2hlY2sgYWxzbyB0aGF0IHRoZSBmbGFnIGV4aXN0cworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5nZXRyYW5kb20oMSwgb3MuR1JORF9OT05CTE9DSykKKyAgICAgICAgZXhjZXB0IEJsb2NraW5nSU9FcnJvcjoKKyAgICAgICAgICAgICMgU3lzdGVtIHVyYW5kb20gaXMgbm90IGluaXRpYWxpemVkIHlldAorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfZ2V0cmFuZG9tX3ZhbHVlKHNlbGYpOgorICAgICAgICBkYXRhMSA9IG9zLmdldHJhbmRvbSgxNikKKyAgICAgICAgZGF0YTIgPSBvcy5nZXRyYW5kb20oMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGF0YTEsIGRhdGEyKQorCisKICMgb3MudXJhbmRvbSgpIGRvZXNuJ3QgdXNlIGEgZmlsZSBkZXNjcmlwdG9yIHdoZW4gaXQgaXMgaW1wbGVtZW50ZWQgd2l0aCB0aGUKICMgZ2V0ZW50cm9weSgpIGZ1bmN0aW9uLCB0aGUgZ2V0cmFuZG9tKCkgZnVuY3Rpb24gb3IgdGhlIGdldHJhbmRvbSgpIHN5c2NhbGwKIE9TX1VSQU5ET01fRE9OVF9VU0VfRkQgPSAoCkBAIC0xMzEzLDkgKzEzNDksOSBAQAogICAgIGRlZiB0ZXN0X3VyYW5kb21fZmRfcmVvcGVuZWQoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzIxMjA3OiB1cmFuZG9tKCkgc2hvdWxkIGRldGVjdCBpdHMgZmQgdG8gL2Rldi91cmFuZG9tCiAgICAgICAgICMgY2hhbmdlZCB0byBzb21ldGhpbmcgZWxzZSwgYW5kIHJlb3BlbiBpdC4KLSAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAnd2InKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZShiIngiICogMjU2KQotICAgICAgICBzZWxmLmFkZENsZWFudXAob3MudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgY3JlYXRlX2ZpbGUoc3VwcG9ydC5URVNURk4sIGIieCIgKiAyNTYpCisKICAgICAgICAgY29kZSA9ICIiImlmIDE6CiAgICAgICAgICAgICBpbXBvcnQgb3MKICAgICAgICAgICAgIGltcG9ydCBzeXMKQEAgLTE0NDQsNiArMTQ4MCwxOCBAQAogCiBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbjMyIHNwZWNpZmljIHRlc3RzIikKIGNsYXNzIFdpbjMyRXJyb3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5zdGF0KHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICBleGlzdHMgPSBGYWxzZQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CisgICAgICAgICAgICBleGlzdHMgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmZhaWwoImZpbGUgJXMgbXVzdCBub3QgZXhpc3Q7IG9zLnN0YXQgZmFpbGVkIHdpdGggJXMiCisgICAgICAgICAgICAgICAgICAgICAgJSAoc3VwcG9ydC5URVNURk4sIGV4YykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImZpbGUgJXMgbXVzdCBub3QgZXhpc3QiICUgc3VwcG9ydC5URVNURk4pCisKICAgICBkZWYgdGVzdF9yZW5hbWUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLnJlbmFtZSwgc3VwcG9ydC5URVNURk4sIHN1cHBvcnQuVEVTVEZOKyIuYmFrIikKIApAQCAtMTQ1NCwxMiArMTUwMiwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5jaGRpciwgc3VwcG9ydC5URVNURk4pCiAKICAgICBkZWYgdGVzdF9ta2RpcihzZWxmKToKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3IikKLSAgICAgICAgdHJ5OgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorCisgICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgIngiKSBhcyBmOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MubWtkaXIsIHN1cHBvcnQuVEVTVEZOKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBvcy51bmxpbmsoc3VwcG9ydC5URVNURk4pCiAKICAgICBkZWYgdGVzdF91dGltZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MudXRpbWUsIHN1cHBvcnQuVEVTVEZOLCBOb25lKQpAQCAtMTQ2NywxMSArMTUxMywxMiBAQAogICAgIGRlZiB0ZXN0X2NobW9kKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5jaG1vZCwgc3VwcG9ydC5URVNURk4sIDApCiAKKwogY2xhc3MgVGVzdEludmFsaWRGRCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgc2luZ2xlcyA9IFsiZmNoZGlyIiwgImR1cCIsICJmZG9wZW4iLCAiZmRhdGFzeW5jIiwgImZzdGF0IiwKICAgICAgICAgICAgICAgICJmc3RhdHZmcyIsICJmc3luYyIsICJ0Y2dldHBncnAiLCAidHR5bmFtZSJdCiAgICAgI3NpbmdsZXMuYXBwZW5kKCJjbG9zZSIpCi0gICAgI1dlIG9taXQgY2xvc2UgYmVjYXVzZSBpdCBkb2VzbidyIHJhaXNlIGFuIGV4Y2VwdGlvbiBvbiBzb21lIHBsYXRmb3JtcworICAgICNXZSBvbWl0IGNsb3NlIGJlY2F1c2UgaXQgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24gb24gc29tZSBwbGF0Zm9ybXMKICAgICBkZWYgZ2V0X3NpbmdsZShmKToKICAgICAgICAgZGVmIGhlbHBlcihzZWxmKToKICAgICAgICAgICAgIGlmICBoYXNhdHRyKG9zLCBmKToKQEAgLTE1NzgsMTIgKzE2MjUsOSBAQAogICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlKQogCiAgICAgZGVmIF90ZXN0X2xpbmsoc2VsZiwgZmlsZTEsIGZpbGUyKToKLSAgICAgICAgd2l0aCBvcGVuKGZpbGUxLCAidyIpIGFzIGYxOgotICAgICAgICAgICAgZjEud3JpdGUoInRlc3QiKQorICAgICAgICBjcmVhdGVfZmlsZShmaWxlMSkKIAotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgIG9zLmxpbmsoZmlsZTEsIGZpbGUyKQorICAgICAgICBvcy5saW5rKGZpbGUxLCBmaWxlMikKICAgICAgICAgd2l0aCBvcGVuKGZpbGUxLCAiciIpIGFzIGYxLCBvcGVuKGZpbGUyLCAiciIpIGFzIGYyOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguc2FtZW9wZW5maWxlKGYxLmZpbGVubygpLCBmMi5maWxlbm8oKSkpCiAKQEAgLTE4NzQsNiArMTkxOCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICAgc29ydGVkKG9zLmxpc3RkaXIoc3VwcG9ydC5URVNURk4pKSwKICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZWRfcGF0aHMpCisKICAgICAgICAgIyBieXRlcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgIHNvcnRlZChvcy5saXN0ZGlyKG9zLmZzZW5jb2RlKHN1cHBvcnQuVEVTVEZOKSkpLApAQCAtMTg4Nyw2ICsxOTMyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgICBzb3J0ZWQob3MubGlzdGRpcihwYXRoKSksCiAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVkX3BhdGhzKQorCiAgICAgICAgICMgYnl0ZXMKICAgICAgICAgcGF0aCA9IGInXFxcXD9cXCcgKyBvcy5mc2VuY29kZShvcy5wYXRoLmFic3BhdGgoc3VwcG9ydC5URVNURk4pKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKApAQCAtMTk2Niw1MSArMjAxMiw0MyBAQAogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG9zLmxzdGF0KGxpbmspLCBvcy5zdGF0KGxpbmspKQogCiAgICAgICAgIGJ5dGVzX2xpbmsgPSBvcy5mc2VuY29kZShsaW5rKQotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChieXRlc19saW5rKSwgb3Muc3RhdCh0YXJnZXQpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvcy5sc3RhdChieXRlc19saW5rKSwgb3Muc3RhdChieXRlc19saW5rKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGJ5dGVzX2xpbmspLCBvcy5zdGF0KHRhcmdldCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob3MubHN0YXQoYnl0ZXNfbGluayksIG9zLnN0YXQoYnl0ZXNfbGluaykpCiAKICAgICBkZWYgdGVzdF8xMjA4NChzZWxmKToKICAgICAgICAgbGV2ZWwxID0gb3MucGF0aC5hYnNwYXRoKHN1cHBvcnQuVEVTVEZOKQogICAgICAgICBsZXZlbDIgPSBvcy5wYXRoLmpvaW4obGV2ZWwxLCAibGV2ZWwyIikKICAgICAgICAgbGV2ZWwzID0gb3MucGF0aC5qb2luKGxldmVsMiwgImxldmVsMyIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnJtdHJlZSwgbGV2ZWwxKQorCisgICAgICAgIG9zLm1rZGlyKGxldmVsMSkKKyAgICAgICAgb3MubWtkaXIobGV2ZWwyKQorICAgICAgICBvcy5ta2RpcihsZXZlbDMpCisKKyAgICAgICAgZmlsZTEgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKGxldmVsMSwgImZpbGUxIikpCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGUxKQorCisgICAgICAgIG9yaWdfZGlyID0gb3MuZ2V0Y3dkKCkKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3MubWtkaXIobGV2ZWwxKQotICAgICAgICAgICAgb3MubWtkaXIobGV2ZWwyKQotICAgICAgICAgICAgb3MubWtkaXIobGV2ZWwzKQorICAgICAgICAgICAgb3MuY2hkaXIobGV2ZWwyKQorICAgICAgICAgICAgbGluayA9IG9zLnBhdGguam9pbihsZXZlbDIsICJsaW5rIikKKyAgICAgICAgICAgIG9zLnN5bWxpbmsob3MucGF0aC5yZWxwYXRoKGZpbGUxKSwgImxpbmsiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigibGluayIsIG9zLmxpc3RkaXIob3MuZ2V0Y3dkKCkpKQogCi0gICAgICAgICAgICBmaWxlMSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4obGV2ZWwxLCAiZmlsZTEiKSkKKyAgICAgICAgICAgICMgQ2hlY2sgb3Muc3RhdCBjYWxscyBmcm9tIHRoZSBzYW1lIGRpciBhcyB0aGUgbGluaworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGZpbGUxKSwgb3Muc3RhdCgibGluayIpKQogCi0gICAgICAgICAgICB3aXRoIG9wZW4oZmlsZTEsICJ3IikgYXMgZjoKLSAgICAgICAgICAgICAgICBmLndyaXRlKCJmaWxlMSIpCisgICAgICAgICAgICAjIENoZWNrIG9zLnN0YXQgY2FsbHMgZnJvbSBhIGRpciBiZWxvdyB0aGUgbGluaworICAgICAgICAgICAgb3MuY2hkaXIobGV2ZWwxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGZpbGUxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdChvcy5wYXRoLnJlbHBhdGgobGluaykpKQogCi0gICAgICAgICAgICBvcmlnX2RpciA9IG9zLmdldGN3ZCgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3MuY2hkaXIobGV2ZWwyKQotICAgICAgICAgICAgICAgIGxpbmsgPSBvcy5wYXRoLmpvaW4obGV2ZWwyLCAibGluayIpCi0gICAgICAgICAgICAgICAgb3Muc3ltbGluayhvcy5wYXRoLnJlbHBhdGgoZmlsZTEpLCAibGluayIpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigibGluayIsIG9zLmxpc3RkaXIob3MuZ2V0Y3dkKCkpKQotCi0gICAgICAgICAgICAgICAgIyBDaGVjayBvcy5zdGF0IGNhbGxzIGZyb20gdGhlIHNhbWUgZGlyIGFzIHRoZSBsaW5rCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGZpbGUxKSwgb3Muc3RhdCgibGluayIpKQotCi0gICAgICAgICAgICAgICAgIyBDaGVjayBvcy5zdGF0IGNhbGxzIGZyb20gYSBkaXIgYmVsb3cgdGhlIGxpbmsKLSAgICAgICAgICAgICAgICBvcy5jaGRpcihsZXZlbDEpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGZpbGUxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQob3MucGF0aC5yZWxwYXRoKGxpbmspKSkKLQotICAgICAgICAgICAgICAgICMgQ2hlY2sgb3Muc3RhdCBjYWxscyBmcm9tIGEgZGlyIGFib3ZlIHRoZSBsaW5rCi0gICAgICAgICAgICAgICAgb3MuY2hkaXIobGV2ZWwzKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KG9zLnBhdGgucmVscGF0aChsaW5rKSkpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIG9zLmNoZGlyKG9yaWdfZGlyKQotICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoZXJyKQorICAgICAgICAgICAgIyBDaGVjayBvcy5zdGF0IGNhbGxzIGZyb20gYSBkaXIgYWJvdmUgdGhlIGxpbmsKKyAgICAgICAgICAgIG9zLmNoZGlyKGxldmVsMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQob3MucGF0aC5yZWxwYXRoKGxpbmspKSkKICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIG9zLnJlbW92ZShmaWxlMSkKLSAgICAgICAgICAgIHNodXRpbC5ybXRyZWUobGV2ZWwxKQorICAgICAgICAgICAgb3MuY2hkaXIob3JpZ19kaXIpCiAKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW4zMiBzcGVjaWZpYyB0ZXN0cyIpCkBAIC0yMDQ4LDcgKzIwODYsNyBAQAogY2xhc3MgTm9uTG9jYWxTeW1saW5rVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICAiIiIKKyAgICAgICAgciIiIgogICAgICAgICBDcmVhdGUgdGhpcyBzdHJ1Y3R1cmU6CiAKICAgICAgICAgYmFzZQpAQCAtMjExOSw3ICsyMTU3LDggQEAKIAogICAgIGRlZiB0ZXN0X3dhaXRwaWQoc2VsZik6CiAgICAgICAgIGFyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsICctYycsICdwYXNzJ10KLSAgICAgICAgcGlkID0gb3Muc3Bhd252KG9zLlBfTk9XQUlULCBhcmdzWzBdLCBhcmdzKQorICAgICAgICAjIEFkZCBhbiBpbXBsaWNpdCB0ZXN0IGZvciBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIoKS4KKyAgICAgICAgcGlkID0gb3Muc3Bhd252KG9zLlBfTk9XQUlULCBfUGF0aExpa2UoYXJnc1swXSksIGFyZ3MpCiAgICAgICAgIHN0YXR1cyA9IG9zLndhaXRwaWQocGlkLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXR1cywgKHBpZCwgMCkpCiAKQEAgLTIxNDYsOCArMjE4NSw4IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG5ld19wcmlvID0gb3MuZ2V0cHJpb3JpdHkob3MuUFJJT19QUk9DRVNTLCBvcy5nZXRwaWQoKSkKICAgICAgICAgICAgIGlmIGJhc2UgPj0gMTkgYW5kIG5ld19wcmlvIDw9IDE5OgotICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KAotICAgICAgInVuYWJsZSB0byByZWxpYWJseSB0ZXN0IHNldHByaW9yaXR5IGF0IGN1cnJlbnQgbmljZSBsZXZlbCBvZiAlcyIgJSBiYXNlKQorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJ1bmFibGUgdG8gcmVsaWFibHkgdGVzdCBzZXRwcmlvcml0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IGN1cnJlbnQgbmljZSBsZXZlbCBvZiAlcyIgJSBiYXNlKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19wcmlvLCBiYXNlICsgMSkKICAgICAgICAgZmluYWxseToKQEAgLTIyNTcsOCArMjI5Niw3IEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICAgY2xzLmtleSA9IHN1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKLSAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZShjbHMuREFUQSkKKyAgICAgICAgY3JlYXRlX2ZpbGUoc3VwcG9ydC5URVNURk4sIGNscy5EQVRBKQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKQEAgLTI0MDgsMTAgKzI0NDYsMTEgQEAKICAgICBkZWYgdGVzdF90cmFpbGVycyhzZWxmKToKICAgICAgICAgVEVTVEZOMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCiAgICAgICAgIGZpbGVfZGF0YSA9IGIiYWJjZGVmIgotICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3diJykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoZmlsZV9kYXRhKQotICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3JiJylhcyBmOgotICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJlbW92ZSwgVEVTVEZOMikKKworICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIFRFU1RGTjIpCisgICAgICAgIGNyZWF0ZV9maWxlKFRFU1RGTjIsIGZpbGVfZGF0YSkKKworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgIG9zLnNlbmRmaWxlKHNlbGYuc29ja25vLCBmLmZpbGVubygpLCAwLCBsZW4oZmlsZV9kYXRhKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsZXJzPVtiIjEyMzQiXSkKICAgICAgICAgICAgIHNlbGYuY2xpZW50LmNsb3NlKCkKQEAgLTI0MzQsMzUgKzI0NzMsMzcgQEAKIGRlZiBzdXBwb3J0c19leHRlbmRlZF9hdHRyaWJ1dGVzKCk6CiAgICAgaWYgbm90IGhhc2F0dHIob3MsICJzZXR4YXR0ciIpOgogICAgICAgICByZXR1cm4gRmFsc2UKKwogICAgIHRyeToKLSAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmcDoKKyAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAieGIiLCAwKSBhcyBmcDoKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBvcy5zZXR4YXR0cihmcC5maWxlbm8oKSwgYiJ1c2VyLnRlc3QiLCBiIiIpCiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICBmaW5hbGx5OgogICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLSAgICAjIEtlcm5lbHMgPCAyLjYuMzkgZG9uJ3QgcmVzcGVjdCBzZXR4YXR0ciBmbGFncy4KLSAgICBrZXJuZWxfdmVyc2lvbiA9IHBsYXRmb3JtLnJlbGVhc2UoKQotICAgIG0gPSByZS5tYXRjaCgiMi42LihcZHsxLDJ9KSIsIGtlcm5lbF92ZXJzaW9uKQotICAgIHJldHVybiBtIGlzIE5vbmUgb3IgaW50KG0uZ3JvdXAoMSkpID49IDM5CisKKyAgICByZXR1cm4gVHJ1ZQogCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN1cHBvcnRzX2V4dGVuZGVkX2F0dHJpYnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICJubyBub24tYnJva2VuIGV4dGVuZGVkIGF0dHJpYnV0ZSBzdXBwb3J0IikKKyMgS2VybmVscyA8IDIuNi4zOSBkb24ndCByZXNwZWN0IHNldHhhdHRyIGZsYWdzLgorQHN1cHBvcnQucmVxdWlyZXNfbGludXhfdmVyc2lvbigyLCA2LCAzOSkKIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLQogICAgIGRlZiBfY2hlY2tfeGF0dHJzX3N0cihzZWxmLCBzLCBnZXR4YXR0ciwgc2V0eGF0dHIsIHJlbW92ZXhhdHRyLCBsaXN0eGF0dHIsICoqa3dhcmdzKToKICAgICAgICAgZm4gPSBzdXBwb3J0LlRFU1RGTgotICAgICAgICBvcGVuKGZuLCAid2IiKS5jbG9zZSgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZm4pCisgICAgICAgIGNyZWF0ZV9maWxlKGZuKQorCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgY206CiAgICAgICAgICAgICBnZXR4YXR0cihmbiwgcygidXNlci50ZXN0IiksICoqa3dhcmdzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRU5PREFUQSkKKwogICAgICAgICBpbml0X3hhdHRyID0gbGlzdHhhdHRyKGZuKQogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaW5pdF94YXR0ciwgbGlzdCkKKwogICAgICAgICBzZXR4YXR0cihmbiwgcygidXNlci50ZXN0IiksIGIiIiwgKiprd2FyZ3MpCiAgICAgICAgIHhhdHRyID0gc2V0KGluaXRfeGF0dHIpCiAgICAgICAgIHhhdHRyLmFkZCgidXNlci50ZXN0IikKQEAgLTI0NzAsMTkgKzI1MTEsMjQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXR4YXR0cihmbiwgYiJ1c2VyLnRlc3QiLCAqKmt3YXJncyksIGIiIikKICAgICAgICAgc2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdCIpLCBiImhlbGxvIiwgb3MuWEFUVFJfUkVQTEFDRSwgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0eGF0dHIoZm4sIGIidXNlci50ZXN0IiwgKiprd2FyZ3MpLCBiImhlbGxvIikKKwogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpIGFzIGNtOgogICAgICAgICAgICAgc2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdCIpLCBiImJ5ZSIsIG9zLlhBVFRSX0NSRUFURSwgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FRVhJU1QpCisKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBjbToKICAgICAgICAgICAgIHNldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QyIiksIGIiYnllIiwgb3MuWEFUVFJfUkVQTEFDRSwgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FTk9EQVRBKQorCiAgICAgICAgIHNldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QyIiksIGIiZm9vIiwgb3MuWEFUVFJfQ1JFQVRFLCAqKmt3YXJncykKICAgICAgICAgeGF0dHIuYWRkKCJ1c2VyLnRlc3QyIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobGlzdHhhdHRyKGZuKSksIHhhdHRyKQogICAgICAgICByZW1vdmV4YXR0cihmbiwgcygidXNlci50ZXN0IiksICoqa3dhcmdzKQorCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgY206CiAgICAgICAgICAgICBnZXR4YXR0cihmbiwgcygidXNlci50ZXN0IiksICoqa3dhcmdzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRU5PREFUQSkKKwogICAgICAgICB4YXR0ci5yZW1vdmUoInVzZXIudGVzdCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGxpc3R4YXR0cihmbikpLCB4YXR0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXR4YXR0cihmbiwgcygidXNlci50ZXN0MiIpLCAqKmt3YXJncyksIGIiZm9vIikKQEAgLTI0OTUsMTEgKzI1NDEsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobGlzdHhhdHRyKGZuKSksIHNldChpbml0X3hhdHRyKSB8IHNldChtYW55KSkKIAogICAgIGRlZiBfY2hlY2tfeGF0dHJzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgIGRlZiBtYWtlX2J5dGVzKHMpOgotICAgICAgICAgICAgcmV0dXJuIGJ5dGVzKHMsICJhc2NpaSIpCiAgICAgICAgIHNlbGYuX2NoZWNrX3hhdHRyc19zdHIoc3RyLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLl9jaGVja194YXR0cnNfc3RyKG1ha2VfYnl0ZXMsICphcmdzLCAqKmt3YXJncykKKworICAgICAgICBzZWxmLl9jaGVja194YXR0cnNfc3RyKG9zLmZzZW5jb2RlLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQogCiAgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgogICAgICAgICBzZWxmLl9jaGVja194YXR0cnMob3MuZ2V0eGF0dHIsIG9zLnNldHhhdHRyLCBvcy5yZW1vdmV4YXR0ciwKQEAgLTI1MTQsMTAgKzI1NjAsMTAgQEAKICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAicmIiKSBhcyBmcDoKICAgICAgICAgICAgICAgICByZXR1cm4gb3MuZ2V0eGF0dHIoZnAuZmlsZW5vKCksICphcmdzKQogICAgICAgICBkZWYgc2V0eGF0dHIocGF0aCwgKmFyZ3MpOgotICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3YiIpIGFzIGZwOgorICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3YiIsIDApIGFzIGZwOgogICAgICAgICAgICAgICAgIG9zLnNldHhhdHRyKGZwLmZpbGVubygpLCAqYXJncykKICAgICAgICAgZGVmIHJlbW92ZXhhdHRyKHBhdGgsICphcmdzKToKLSAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAid2IiLCAwKSBhcyBmcDoKICAgICAgICAgICAgICAgICBvcy5yZW1vdmV4YXR0cihmcC5maWxlbm8oKSwgKmFyZ3MpCiAgICAgICAgIGRlZiBsaXN0eGF0dHIocGF0aCwgKmFyZ3MpOgogICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyYiIpIGFzIGZwOgpAQCAtMjUyNSw0MyArMjU3MSw2IEBACiAgICAgICAgIHNlbGYuX2NoZWNrX3hhdHRycyhnZXR4YXR0ciwgc2V0eGF0dHIsIHJlbW92ZXhhdHRyLCBsaXN0eGF0dHIpCiAKIAotQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW4zMiBzcGVjaWZpYyB0ZXN0cyIpCi1jbGFzcyBXaW4zMkRlcHJlY2F0ZWRCeXRlc0FQSSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZChzZWxmKToKLSAgICAgICAgaW1wb3J0IG50Ci0gICAgICAgIGZpbGVuYW1lID0gb3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiZXJyb3IiLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICBmb3IgZnVuYywgKmFyZ3MgaW4gKAotICAgICAgICAgICAgICAgIChudC5fZ2V0ZnVsbHBhdGhuYW1lLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG50Ll9pc2RpciwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5hY2Nlc3MsIGZpbGVuYW1lLCBvcy5SX09LKSwKLSAgICAgICAgICAgICAgICAob3MuY2hkaXIsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MuY2htb2QsIGZpbGVuYW1lLCAwbzc3NyksCi0gICAgICAgICAgICAgICAgKG9zLmdldGN3ZGIsKSwKLSAgICAgICAgICAgICAgICAob3MubGluaywgZmlsZW5hbWUsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MubGlzdGRpciwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5sc3RhdCwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5ta2RpciwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5vcGVuLCBmaWxlbmFtZSwgb3MuT19SRE9OTFkpLAotICAgICAgICAgICAgICAgIChvcy5yZW5hbWUsIGZpbGVuYW1lLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLnJtZGlyLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLnN0YXJ0ZmlsZSwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5zdGF0LCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLnVubGluaywgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy51dGltZSwgZmlsZW5hbWUpLAotICAgICAgICAgICAgKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEZXByZWNhdGlvbldhcm5pbmcsIGZ1bmMsICphcmdzKQotCi0gICAgQHN1cHBvcnQuc2tpcF91bmxlc3Nfc3ltbGluawotICAgIGRlZiB0ZXN0X3N5bWxpbmsoc2VsZik6Ci0gICAgICAgIGZpbGVuYW1lID0gb3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiZXJyb3IiLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEZXByZWNhdGlvbldhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zeW1saW5rLCBmaWxlbmFtZSwgZmlsZW5hbWUpCi0KLQogQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2dldF90ZXJtaW5hbF9zaXplJyksICJyZXF1aXJlcyBvcy5nZXRfdGVybWluYWxfc2l6ZSIpCiBjbGFzcyBUZXJtc2l6ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9kb2VzX25vdF9jcmFzaChzZWxmKToKQEAgLTI2MjQsNiArMjYzMyw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBlbmNvZGVkID0gb3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pCiAgICAgICAgIHNlbGYuYnl0ZXNfZmlsZW5hbWVzLmFwcGVuZChlbmNvZGVkKQorICAgICAgICBzZWxmLmJ5dGVzX2ZpbGVuYW1lcy5hcHBlbmQoYnl0ZWFycmF5KGVuY29kZWQpKQogICAgICAgICBzZWxmLmJ5dGVzX2ZpbGVuYW1lcy5hcHBlbmQobWVtb3J5dmlldyhlbmNvZGVkKSkKIAogICAgICAgICBzZWxmLmZpbGVuYW1lcyA9IHNlbGYuYnl0ZXNfZmlsZW5hbWVzICsgc2VsZi51bmljb2RlX2ZpbGVuYW1lcwpAQCAtMjY0NCwxNiArMjY1NCw3IEBACiAgICAgICAgICAgICAgICAgKHNlbGYuYnl0ZXNfZmlsZW5hbWVzLCBvcy5yZXBsYWNlLCBiImRzdCIpLAogICAgICAgICAgICAgICAgIChzZWxmLnVuaWNvZGVfZmlsZW5hbWVzLCBvcy5yZW5hbWUsICJkc3QiKSwKICAgICAgICAgICAgICAgICAoc2VsZi51bmljb2RlX2ZpbGVuYW1lcywgb3MucmVwbGFjZSwgImRzdCIpLAotICAgICAgICAgICAgICAgICMgSXNzdWUgIzE2NDE0OiBEb24ndCB0ZXN0IHVuZGVjb2RhYmxlIG5hbWVzIHdpdGggbGlzdGRpcigpCi0gICAgICAgICAgICAgICAgIyBiZWNhdXNlIG9mIGEgV2luZG93cyBidWcuCi0gICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgICMgV2l0aCB0aGUgQU5TSSBjb2RlIHBhZ2UgOTMyLCBvcy5saXN0ZGlyKGInXHhlNycpIHJldHVybiBhbgotICAgICAgICAgICAgICAgICMgZW1wdHkgbGlzdCAoaW5zdGVhZCBvZiBmYWlsaW5nKSwgd2hlcmVhcyBvcy5saXN0ZGlyKGInXHhmZicpCi0gICAgICAgICAgICAgICAgIyByYWlzZXMgYSBGaWxlTm90Rm91bmRFcnJvci4gSXQgbG9va3MgbGlrZSBhIFdpbmRvd3MgYnVnOgotICAgICAgICAgICAgICAgICMgYidceGU3JyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsIEZpbmRGaXJzdEZpbGVBKGInXHhlNycpCi0gICAgICAgICAgICAgICAgIyBmYWlscyB3aXRoIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EICgyKSwgaW5zdGVhZCBvZgotICAgICAgICAgICAgICAgICMgRVJST1JfUEFUSF9OT1RfRk9VTkQgKDMpLgotICAgICAgICAgICAgICAgIChzZWxmLnVuaWNvZGVfZmlsZW5hbWVzLCBvcy5saXN0ZGlyLCksCisgICAgICAgICAgICAgICAgKHNlbGYudW5pY29kZV9maWxlbmFtZXMsIG9zLmxpc3RkaXIsICksCiAgICAgICAgICAgICApKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgZnVuY3MuZXh0ZW5kKCgKQEAgLTI2OTQsMTIgKzI2OTUsMjQgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgZnVuY3MuYXBwZW5kKChzZWxmLmZpbGVuYW1lcywgb3MucmVhZGxpbmssKSkKIAorCiAgICAgICAgIGZvciBmaWxlbmFtZXMsIGZ1bmMsICpmdW5jX2FyZ3MgaW4gZnVuY3M6CiAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBmdW5jKG5hbWUsICpmdW5jX2FyZ3MpCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgKHN0ciwgYnl0ZXMpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMobmFtZSwgKmZ1bmNfYXJncykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgJ3Nob3VsZCBiZScpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMobmFtZSwgKmZ1bmNfYXJncykKICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZXJyLmZpbGVuYW1lLCBuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKGVyci5maWxlbmFtZSwgbmFtZSwgc3RyKGZ1bmMpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgICAgICAgICAgICAgIyBpc3N1ZTI3NzgxOiB1bmRlY29kYWJsZSBieXRlcyBjdXJyZW50bHkgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICAgICAgICAgICMgYnkgMy42LjBiNCB0aGlzIHdpbGwgYmVjb21lIFVuaWNvZGVEZWNvZGVFcnJvciBvciBub3RoaW5nCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlcnIuX19jb250ZXh0X18sIFVuaWNvZGVEZWNvZGVFcnJvcikKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gYnkge30iLmZvcm1hdChmdW5jKSkKIApAQCAtMjc5Nyw2ICsyODEwLDYzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MuZ2V0X2luaGVyaXRhYmxlKHNsYXZlX2ZkKSwgRmFsc2UpCiAKIAorY2xhc3MgUGF0aFRDb252ZXJ0ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyB0dXBsZXMgb2YgKGZ1bmN0aW9uIG5hbWUsIGFsbG93cyBmZCBhcmd1bWVudHMsIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvCisgICAgIyBmdW5jdGlvbiwgY2xlYW51cCBmdW5jdGlvbikKKyAgICBmdW5jdGlvbnMgPSBbCisgICAgICAgICgnc3RhdCcsIFRydWUsICgpLCBOb25lKSwKKyAgICAgICAgKCdsc3RhdCcsIEZhbHNlLCAoKSwgTm9uZSksCisgICAgICAgICgnYWNjZXNzJywgRmFsc2UsIChvcy5GX09LLCksIE5vbmUpLAorICAgICAgICAoJ2NoZmxhZ3MnLCBGYWxzZSwgKDAsKSwgTm9uZSksCisgICAgICAgICgnbGNoZmxhZ3MnLCBGYWxzZSwgKDAsKSwgTm9uZSksCisgICAgICAgICgnb3BlbicsIEZhbHNlLCAoMCwpLCBnZXRhdHRyKG9zLCAnY2xvc2UnLCBOb25lKSksCisgICAgXQorCisgICAgZGVmIHRlc3RfcGF0aF90X2NvbnZlcnRlcihzZWxmKToKKyAgICAgICAgc3RyX2ZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAgICAgYnl0ZXNfZnNwYXRoID0gYnl0ZXNfZmlsZW5hbWUgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBieXRlc19maWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOLmVuY29kZSgnYXNjaWknKQorICAgICAgICAgICAgYnl0ZXNfZnNwYXRoID0gX1BhdGhMaWtlKGJ5dGVzX2ZpbGVuYW1lKQorICAgICAgICBmZCA9IG9zLm9wZW4oX1BhdGhMaWtlKHN0cl9maWxlbmFtZSksIG9zLk9fV1JPTkxZfG9zLk9fQ1JFQVQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5jbG9zZSwgZmQpCisKKyAgICAgICAgaW50X2ZzcGF0aCA9IF9QYXRoTGlrZShmZCkKKyAgICAgICAgc3RyX2ZzcGF0aCA9IF9QYXRoTGlrZShzdHJfZmlsZW5hbWUpCisKKyAgICAgICAgZm9yIG5hbWUsIGFsbG93X2ZkLCBleHRyYV9hcmdzLCBjbGVhbnVwX2ZuIGluIHNlbGYuZnVuY3Rpb25zOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFtZT1uYW1lKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZuID0gZ2V0YXR0cihvcywgbmFtZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBmb3IgcGF0aCBpbiAoc3RyX2ZpbGVuYW1lLCBieXRlc19maWxlbmFtZSwgc3RyX2ZzcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfZnNwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFtZT1uYW1lLCBwYXRoPXBhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZm4ocGF0aCwgKmV4dHJhX2FyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjbGVhbnVwX2ZuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBfZm4ocmVzdWx0KQorCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUVycm9yLCAnc2hvdWxkIGJlIHN0cmluZywgYnl0ZXMnKToKKyAgICAgICAgICAgICAgICAgICAgZm4oaW50X2ZzcGF0aCwgKmV4dHJhX2FyZ3MpCisKKyAgICAgICAgICAgICAgICBpZiBhbGxvd19mZDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZm4oZmQsICpleHRyYV9hcmdzKSAgIyBzaG91bGQgbm90IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgaWYgY2xlYW51cF9mbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBfZm4ocmVzdWx0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29zLlBhdGhMaWtlJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBmbihmZCwgKmV4dHJhX2FyZ3MpCisKKwogQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2dldF9ibG9ja2luZycpLAogICAgICAgICAgICAgICAgICAgICAgJ25lZWRzIG9zLmdldF9ibG9ja2luZygpIGFuZCBvcy5zZXRfYmxvY2tpbmcoKScpCiBjbGFzcyBCbG9ja2luZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTI4MjAsMTUgKzI4OTAsMTggQEAKIAogCiBjbGFzcyBUZXN0U2NhbmRpcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZyA9IHN1cHBvcnQuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZworCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmJ5dGVzX3BhdGggPSBvcy5mc2VuY29kZShzZWxmLnBhdGgpCiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnJtdHJlZSwgc2VsZi5wYXRoKQogICAgICAgICBvcy5ta2RpcihzZWxmLnBhdGgpCiAKICAgICBkZWYgY3JlYXRlX2ZpbGUoc2VsZiwgbmFtZT0iZmlsZS50eHQiKToKLSAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBuYW1lKQotICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3YiIpIGFzIGZwOgotICAgICAgICAgICAgZnAud3JpdGUoYidweXRob24nKQorICAgICAgICBwYXRoID0gc2VsZi5ieXRlc19wYXRoIGlmIGlzaW5zdGFuY2UobmFtZSwgYnl0ZXMpIGVsc2Ugc2VsZi5wYXRoCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHBhdGgsIG5hbWUpCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBiJ3B5dGhvbicpCiAgICAgICAgIHJldHVybiBmaWxlbmFtZQogCiAgICAgZGVmIGdldF9lbnRyaWVzKHNlbGYsIG5hbWVzKToKQEAgLTI4NTEsNiArMjkyNCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXQxLCBzdGF0MikKIAogICAgIGRlZiBjaGVja19lbnRyeShzZWxmLCBlbnRyeSwgbmFtZSwgaXNfZGlyLCBpc19maWxlLCBpc19zeW1saW5rKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGVudHJ5LCBvcy5EaXJFbnRyeSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5uYW1lLCBuYW1lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LnBhdGgsIG9zLnBhdGguam9pbihzZWxmLnBhdGgsIG5hbWUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5Lmlub2RlKCksCkBAIC0yOTE2LDE1ICsyOTkwLDE2IEBACiAgICAgICAgICAgICBzZWxmLmNoZWNrX2VudHJ5KGVudHJ5LCAnc3ltbGlua19maWxlLnR4dCcsIEZhbHNlLCBUcnVlLCBUcnVlKQogCiAgICAgZGVmIGdldF9lbnRyeShzZWxmLCBuYW1lKToKLSAgICAgICAgZW50cmllcyA9IGxpc3Qob3Muc2NhbmRpcihzZWxmLnBhdGgpKQorICAgICAgICBwYXRoID0gc2VsZi5ieXRlc19wYXRoIGlmIGlzaW5zdGFuY2UobmFtZSwgYnl0ZXMpIGVsc2Ugc2VsZi5wYXRoCisgICAgICAgIGVudHJpZXMgPSBsaXN0KG9zLnNjYW5kaXIocGF0aCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVudHJpZXMpLCAxKQogCiAgICAgICAgIGVudHJ5ID0gZW50cmllc1swXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5Lm5hbWUsIG5hbWUpCiAgICAgICAgIHJldHVybiBlbnRyeQogCi0gICAgZGVmIGNyZWF0ZV9maWxlX2VudHJ5KHNlbGYpOgotICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY3JlYXRlX2ZpbGUoKQorICAgIGRlZiBjcmVhdGVfZmlsZV9lbnRyeShzZWxmLCBuYW1lPSdmaWxlLnR4dCcpOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY3JlYXRlX2ZpbGUobmFtZT1uYW1lKQogICAgICAgICByZXR1cm4gc2VsZi5nZXRfZW50cnkob3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpCiAKICAgICBkZWYgdGVzdF9jdXJyZW50X2RpcmVjdG9yeShzZWxmKToKQEAgLTI5NDUsNiArMzAyMCwxOCBAQAogICAgICAgICBlbnRyeSA9IHNlbGYuY3JlYXRlX2ZpbGVfZW50cnkoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZW50cnkpLCAiPERpckVudHJ5ICdmaWxlLnR4dCc+IikKIAorICAgIGRlZiB0ZXN0X2ZzcGF0aF9wcm90b2NvbChzZWxmKToKKyAgICAgICAgZW50cnkgPSBzZWxmLmNyZWF0ZV9maWxlX2VudHJ5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5mc3BhdGgoZW50cnkpLCBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnZmlsZS50eHQnKSkKKworICAgIGRlZiB0ZXN0X2ZzcGF0aF9wcm90b2NvbF9ieXRlcyhzZWxmKToKKyAgICAgICAgYnl0ZXNfZmlsZW5hbWUgPSBvcy5mc2VuY29kZSgnYnl0ZXNmaWxlLnR4dCcpCisgICAgICAgIGJ5dGVzX2VudHJ5ID0gc2VsZi5jcmVhdGVfZmlsZV9lbnRyeShuYW1lPWJ5dGVzX2ZpbGVuYW1lKQorICAgICAgICBmc3BhdGggPSBvcy5mc3BhdGgoYnl0ZXNfZW50cnkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmc3BhdGgsIGJ5dGVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZzcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ob3MuZnNlbmNvZGUoc2VsZi5wYXRoKSxieXRlc19maWxlbmFtZSkpCisKICAgICBkZWYgdGVzdF9yZW1vdmVkX2RpcihzZWxmKToKICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdkaXInKQogCkBAIC0zMDA4LDExICszMDk1LDYgQEAKICAgICAgICAgZW50cnkuc3RhdChmb2xsb3dfc3ltbGlua3M9RmFsc2UpCiAKICAgICBkZWYgdGVzdF9ieXRlcyhzZWxmKToKLSAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgotICAgICAgICAgICAgIyBPbiBXaW5kb3dzLCBvcy5zY2FuZGlyKGJ5dGVzKSBtdXN0IHJhaXNlIGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcy5zY2FuZGlyLCBiJy4nKQotICAgICAgICAgICAgcmV0dXJuCi0KICAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQogCiAgICAgICAgIHBhdGhfYnl0ZXMgPSBvcy5mc2VuY29kZShzZWxmLnBhdGgpCkBAIC0zMDQyLDYgKzMxMjQsMTEyIEBACiAgICAgICAgIGZvciBvYmogaW4gWzEyMzQsIDEuMjM0LCB7fSwgW11dOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcy5zY2FuZGlyLCBvYmopCiAKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlMi50eHQiKQorICAgICAgICBpdGVyYXRvciA9IG9zLnNjYW5kaXIoc2VsZi5wYXRoKQorICAgICAgICBuZXh0KGl0ZXJhdG9yKQorICAgICAgICBpdGVyYXRvci5jbG9zZSgpCisgICAgICAgICMgbXVsdGlwbGUgY2xvc2VzCisgICAgICAgIGl0ZXJhdG9yLmNsb3NlKCkKKyAgICAgICAgd2l0aCBzZWxmLmNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmcoKToKKyAgICAgICAgICAgIGRlbCBpdGVyYXRvcgorCisgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyKHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlLnR4dCIpCisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUyLnR4dCIpCisgICAgICAgIHdpdGggb3Muc2NhbmRpcihzZWxmLnBhdGgpIGFzIGl0ZXJhdG9yOgorICAgICAgICAgICAgbmV4dChpdGVyYXRvcikKKyAgICAgICAgd2l0aCBzZWxmLmNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmcoKToKKyAgICAgICAgICAgIGRlbCBpdGVyYXRvcgorCisgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyX2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlLnR4dCIpCisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUyLnR4dCIpCisgICAgICAgIHdpdGggb3Muc2NhbmRpcihzZWxmLnBhdGgpIGFzIGl0ZXJhdG9yOgorICAgICAgICAgICAgbmV4dChpdGVyYXRvcikKKyAgICAgICAgICAgIGl0ZXJhdG9yLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcl9leGNlcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUudHh0IikKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZTIudHh0IikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICB3aXRoIG9zLnNjYW5kaXIoc2VsZi5wYXRoKSBhcyBpdGVyYXRvcjoKKyAgICAgICAgICAgICAgICBuZXh0KGl0ZXJhdG9yKQorICAgICAgICAgICAgICAgIDEvMAorICAgICAgICB3aXRoIHNlbGYuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZygpOgorICAgICAgICAgICAgZGVsIGl0ZXJhdG9yCisKKyAgICBkZWYgdGVzdF9yZXNvdXJjZV93YXJuaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlLnR4dCIpCisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUyLnR4dCIpCisgICAgICAgIGl0ZXJhdG9yID0gb3Muc2NhbmRpcihzZWxmLnBhdGgpCisgICAgICAgIG5leHQoaXRlcmF0b3IpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhSZXNvdXJjZVdhcm5pbmcpOgorICAgICAgICAgICAgZGVsIGl0ZXJhdG9yCisgICAgICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICAjIGV4aGF1c3RlZCBpdGVyYXRvcgorICAgICAgICBpdGVyYXRvciA9IG9zLnNjYW5kaXIoc2VsZi5wYXRoKQorICAgICAgICBsaXN0KGl0ZXJhdG9yKQorICAgICAgICB3aXRoIHNlbGYuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZygpOgorICAgICAgICAgICAgZGVsIGl0ZXJhdG9yCisKKworY2xhc3MgVGVzdFBFUDUxOSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIEFic3RyYWN0ZWQgc28gaXQgY2FuIGJlIG92ZXJyaWRkZW4gdG8gdGVzdCBwdXJlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgorICAgICMgaWYgYSBDIHZlcnNpb24gaXMgcHJvdmlkZWQuCisgICAgZnNwYXRoID0gc3RhdGljbWV0aG9kKG9zLmZzcGF0aCkKKworICAgIGRlZiB0ZXN0X3JldHVybl9ieXRlcyhzZWxmKToKKyAgICAgICAgZm9yIGIgaW4gYidoZWxsbycsIGInZ29vZGJ5ZScsIGInc29tZS9wYXRoL2FuZC9maWxlJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgc2VsZi5mc3BhdGgoYikpCisKKyAgICBkZWYgdGVzdF9yZXR1cm5fc3RyaW5nKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAnaGVsbG8nLCAnZ29vZGJ5ZScsICdzb21lL3BhdGgvYW5kL2ZpbGUnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBzZWxmLmZzcGF0aChzKSkKKworICAgIGRlZiB0ZXN0X2ZzZW5jb2RlX2ZzZGVjb2RlKHNlbGYpOgorICAgICAgICBmb3IgcCBpbiAicGF0aC9saWtlL29iamVjdCIsIGIicGF0aC9saWtlL29iamVjdCI6CisgICAgICAgICAgICBwYXRobGlrZSA9IF9QYXRoTGlrZShwKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIHNlbGYuZnNwYXRoKHBhdGhsaWtlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJwYXRoL2xpa2Uvb2JqZWN0Iiwgb3MuZnNlbmNvZGUocGF0aGxpa2UpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgicGF0aC9saWtlL29iamVjdCIsIG9zLmZzZGVjb2RlKHBhdGhsaWtlKSkKKworICAgIGRlZiB0ZXN0X3BhdGhsaWtlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcjZmVlbHRoZWdpbCcsIHNlbGYuZnNwYXRoKF9QYXRoTGlrZSgnI2ZlZWx0aGVnaWwnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKF9QYXRoTGlrZSwgb3MuUGF0aExpa2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShfUGF0aExpa2UoKSwgb3MuUGF0aExpa2UpKQorCisgICAgZGVmIHRlc3RfZ2FyYmFnZV9pbl9leGNlcHRpb25fb3V0KHNlbGYpOgorICAgICAgICB2YXBvciA9IHR5cGUoJ2JsYWgnLCAoKSwge30pCisgICAgICAgIGZvciBvIGluIGludCwgdHlwZSwgb3MsIHZhcG9yKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZnNwYXRoLCBvKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRfcmVxdWlyZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mc3BhdGgpCisKKyAgICBkZWYgdGVzdF9iYWRfcGF0aGxpa2Uoc2VsZik6CisgICAgICAgICMgX19mc3BhdGhfXyByZXR1cm5zIGEgdmFsdWUgb3RoZXIgdGhhbiBzdHIgb3IgYnl0ZXMuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mc3BhdGgsIF9QYXRoTGlrZSg0MikpCisgICAgICAgICMgX19mc3BhdGhfXyBhdHRyaWJ1dGUgdGhhdCBpcyBub3QgY2FsbGFibGUuCisgICAgICAgIGMgPSB0eXBlKCdmb28nLCAoKSwge30pCisgICAgICAgIGMuX19mc3BhdGhfXyA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmZzcGF0aCwgYygpKQorICAgICAgICAjIF9fZnNwYXRoX18gcmFpc2VzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIHNlbGYuZnNwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfUGF0aExpa2UoWmVyb0RpdmlzaW9uRXJyb3IoKSkpCisKKyMgT25seSB0ZXN0IGlmIHRoZSBDIHZlcnNpb24gaXMgcHJvdmlkZWQsIG90aGVyd2lzZSBUZXN0UEVQNTE5IGFscmVhZHkgdGVzdGVkCisjIHRoZSBwdXJlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbi4KK2lmIGhhc2F0dHIob3MsICJfZnNwYXRoIik6CisgICAgY2xhc3MgVGVzdFBFUDUxOVB1cmVQeXRob24oVGVzdFBFUDUxOSk6CisKKyAgICAgICAgIiIiRXhwbGljaXRseSB0ZXN0IHRoZSBwdXJlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiBvcy5mc3BhdGgoKS4iIiIKKworICAgICAgICBmc3BhdGggPSBzdGF0aWNtZXRob2Qob3MuX2ZzcGF0aCkKKwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkgYi9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQppbmRleCBhYjY1NzdmLi5kNmU2ZjcxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQpAQCAtMSw2ICsxLDUgQEAKIGltcG9ydCBwYXJzZXIKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHN5cwogaW1wb3J0IG9wZXJhdG9yCiBpbXBvcnQgc3RydWN0CiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKQEAgLTEzOSw2ICsxMzgsNDUgQEAKICAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSA9IGIiKQogICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJhID0gYiA9IGMgPSBkID0gZSIpCiAKKyAgICBkZWYgdGVzdF92YXJfYW5ub3Qoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoIng6IGludCA9IDUiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ5OiBMaXN0W1RdID0gW107IHo6IFtsaXN0XSA9IGZ1bigpIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgieDogdHVwbGUgPSAoMSwgMikiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkW2YoKV06IGludCA9IDQyIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZihkW3hdKTogc3RyID0gJ2FiYyciKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ4Lnkuei53OiBjb21wbGV4ID0gNDJqIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgieDogaW50IikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHg6IHN0clxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgeTogaW50ID0gNVxuIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiY2xhc3MgQzpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHg6IHN0clxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgeTogaW50ID0gNVxuIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiY2xhc3MgQzpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4OiBpbnQpIC0+IE5vbmU6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgc2VsZi54OiBpbnQgPSB4XG4iKQorICAgICAgICAjIGRvdWJsZSBjaGVjayBmb3Igbm9uc2Vuc2UKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcik6CisgICAgICAgICAgICBleGVjKCIyKzI6IGludCIsIHt9LCB7fSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcik6CisgICAgICAgICAgICBleGVjKCJbXTogaW50ID0gNSIsIHt9LCB7fSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcik6CisgICAgICAgICAgICBleGVjKCJ4LCAqeSwgejogaW50ID0gcmFuZ2UoNSkiLCB7fSwge30pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IpOgorICAgICAgICAgICAgZXhlYygidDogdHVwbGUgPSAxLCAyIiwge30sIHt9KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yKToKKyAgICAgICAgICAgIGV4ZWMoInUgPSB2OiBpbnQiLCB7fSwge30pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IpOgorICAgICAgICAgICAgZXhlYygiRmFsc2U6IGludCIsIHt9LCB7fSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcik6CisgICAgICAgICAgICBleGVjKCJ4LkZhbHNlOiBpbnQiLCB7fSwge30pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IpOgorICAgICAgICAgICAgZXhlYygieC55LDogaW50Iiwge30sIHt9KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yKToKKyAgICAgICAgICAgIGV4ZWMoIlswXTogaW50Iiwge30sIHt9KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yKToKKyAgICAgICAgICAgIGV4ZWMoImYoKTogaW50Iiwge30sIHt9KQorCiAgICAgZGVmIHRlc3Rfc2ltcGxlX2F1Z21lbnRlZF9hc3NpZ25tZW50cyhzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSArPSBiIikKICAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSAtPSBiIikKQEAgLTYzMywxMiArNjcxLDE4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZS5jb19maWxlbmFtZSwgJzxzeW50YXgtdHJlZT4nKQogICAgICAgICBjb2RlID0gc3QuY29tcGlsZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZS5jb19maWxlbmFtZSwgJzxzeW50YXgtdHJlZT4nKQotICAgICAgICBmb3IgZmlsZW5hbWUgaW4gKCdmaWxlLnB5JywgYidmaWxlLnB5JywKLSAgICAgICAgICAgICAgICAgICAgICAgICBieXRlYXJyYXkoYidmaWxlLnB5JyksIG1lbW9yeXZpZXcoYidmaWxlLnB5JykpOgorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gJ2ZpbGUucHknLCBiJ2ZpbGUucHknOgogICAgICAgICAgICAgY29kZSA9IHBhcnNlci5jb21waWxlc3Qoc3QsIGZpbGVuYW1lKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlLmNvX2ZpbGVuYW1lLCAnZmlsZS5weScpCiAgICAgICAgICAgICBjb2RlID0gc3QuY29tcGlsZShmaWxlbmFtZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZS5jb19maWxlbmFtZSwgJ2ZpbGUucHknKQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gYnl0ZWFycmF5KGInZmlsZS5weScpLCBtZW1vcnl2aWV3KGInZmlsZS5weScpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICAgICAgY29kZSA9IHBhcnNlci5jb21waWxlc3Qoc3QsIGZpbGVuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlLmNvX2ZpbGVuYW1lLCAnZmlsZS5weScpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgICAgICBjb2RlID0gc3QuY29tcGlsZShmaWxlbmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZS5jb19maWxlbmFtZSwgJ2ZpbGUucHknKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBhcnNlci5jb21waWxlc3QsIHN0LCBsaXN0KGInZmlsZS5weScpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0LmNvbXBpbGUsIGxpc3QoYidmaWxlLnB5JykpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGF0aGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfcGF0aGxpYi5weQppbmRleCBmYTk2ZDlmLi4yZjJiYTNjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BhdGhsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wYXRobGliLnB5CkBAIC0xOTAsMTMgKzE5MCwxOCBAQAogICAgICAgICBQID0gc2VsZi5jbHMKICAgICAgICAgcCA9IFAoJ2EnKQogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocCwgUCkKKyAgICAgICAgY2xhc3MgUGF0aExpa2U6CisgICAgICAgICAgICBkZWYgX19mc3BhdGhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImEvYi9jIgogICAgICAgICBQKCdhJywgJ2InLCAnYycpCiAgICAgICAgIFAoJy9hJywgJ2InLCAnYycpCiAgICAgICAgIFAoJ2EvYi9jJykKICAgICAgICAgUCgnL2EvYi9jJykKKyAgICAgICAgUChQYXRoTGlrZSgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFAoUCgnYScpKSwgUCgnYScpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFAoUCgnYScpLCAnYicpLCBQKCdhL2InKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQKFAoJ2EnKSwgUCgnYicpKSwgUCgnYS9iJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUChQKCdhJyksIFAoJ2InKSwgUCgnYycpKSwgUChQYXRoTGlrZSgpKSkKIAogICAgIGRlZiBfY2hlY2tfc3RyX3N1YmNsYXNzKHNlbGYsICphcmdzKToKICAgICAgICAgIyBJc3N1ZSAjMjExMjc6IGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgYSBQdXJlUGF0aCBvYmplY3QKQEAgLTM4NCw2ICszODksMTIgQEAKICAgICAgICAgcGFydHMgPSBwLnBhcnRzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFydHMsIChzZXAsICdhJywgJ2InKSkKIAorICAgIGRlZiB0ZXN0X2ZzcGF0aF9jb21tb24oc2VsZik6CisgICAgICAgIFAgPSBzZWxmLmNscworICAgICAgICBwID0gUCgnYS9iJykKKyAgICAgICAgc2VsZi5fY2hlY2tfc3RyKHAuX19mc3BhdGhfXygpLCAoJ2EvYicsKSkKKyAgICAgICAgc2VsZi5fY2hlY2tfc3RyKG9zLmZzcGF0aChwKSwgKCdhL2InLCkpCisKICAgICBkZWYgdGVzdF9lcXVpdmFsZW5jZXMoc2VsZik6CiAgICAgICAgIGZvciBrLCB0dXBsZXMgaW4gc2VsZi5lcXVpdmFsZW5jZXMuaXRlbXMoKToKICAgICAgICAgICAgIGNhbm9uID0gay5yZXBsYWNlKCcvJywgc2VsZi5zZXApCkBAIC0xNDc0LDEzICsxNDg1LDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHAuZ2xvYigiZGlyQS8uLi9maWxlKiIpKSwgeyBQKEJBU0UsICJkaXJBLy4uL2ZpbGVBIikgfSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQocC5nbG9iKCIuLi94eXp6eSIpKSwgc2V0KCkpCiAKLSAgICBkZWYgX2NoZWNrX3Jlc29sdmVfcmVsYXRpdmUoc2VsZiwgcCwgZXhwZWN0ZWQpOgorCisgICAgZGVmIF9jaGVja19yZXNvbHZlKHNlbGYsIHAsIGV4cGVjdGVkKToKICAgICAgICAgcSA9IHAucmVzb2x2ZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocSwgZXhwZWN0ZWQpCiAKLSAgICBkZWYgX2NoZWNrX3Jlc29sdmVfYWJzb2x1dGUoc2VsZiwgcCwgZXhwZWN0ZWQpOgotICAgICAgICBxID0gcC5yZXNvbHZlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLCBleHBlY3RlZCkKKyAgICAjIHRoaXMgY2FuIGJlIHVzZWQgdG8gY2hlY2sgYm90aCByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcmVzb2x1dGlvbnMKKyAgICBfY2hlY2tfcmVzb2x2ZV9yZWxhdGl2ZSA9IF9jaGVja19yZXNvbHZlX2Fic29sdXRlID0gX2NoZWNrX3Jlc29sdmUKIAogICAgIEB3aXRoX3N5bWxpbmtzCiAgICAgZGVmIHRlc3RfcmVzb2x2ZV9jb21tb24oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BkYi5weSBiL0xpYi90ZXN0L3Rlc3RfcGRiLnB5CmluZGV4IDQ1YmE1YTkuLmE2M2NjZDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGRiLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGRiLnB5CkBAIC01NTgsNyArNTU4LDYgQEAKIAogZGVmIHBkYl9pbnZva2UobWV0aG9kLCBhcmcpOgogICAgICIiIlJ1biBwZGIubWV0aG9kKGFyZykuIiIiCi0gICAgaW1wb3J0IHBkYgogICAgIGdldGF0dHIocGRiLlBkYihub3NpZ2ludD1UcnVlKSwgbWV0aG9kKShhcmcpCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkgYi9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQppbmRleCA0MWU1MDkxLi5iMDMzNjQwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQpAQCAtMSw5ICsxLDggQEAKIGltcG9ydCBkaXMKIGltcG9ydCByZQogaW1wb3J0IHN5cwotZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIG1hdGggaW1wb3J0IGNvcHlzaWduCiAKIGZyb20gdGVzdC5ieXRlY29kZV9oZWxwZXIgaW1wb3J0IEJ5dGVjb2RlVGVzdENhc2UKIApAQCAtMzAsMjIgKzI5LDI1IEBACiAKICAgICBkZWYgdGVzdF9nbG9iYWxfYXNfY29uc3RhbnQoc2VsZik6CiAgICAgICAgICMgTE9BRF9HTE9CQUwgTm9uZS9UcnVlL0ZhbHNlICAtLT4gIExPQURfQ09OU1QgTm9uZS9UcnVlL0ZhbHNlCi0gICAgICAgIGRlZiBmKHgpOgotICAgICAgICAgICAgTm9uZQotICAgICAgICAgICAgTm9uZQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgeCA9IE5vbmUKKyAgICAgICAgICAgIHggPSBOb25lCiAgICAgICAgICAgICByZXR1cm4geAotICAgICAgICBkZWYgZyh4KToKLSAgICAgICAgICAgIFRydWUKKyAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgIHggPSBUcnVlCiAgICAgICAgICAgICByZXR1cm4geAotICAgICAgICBkZWYgaCh4KToKLSAgICAgICAgICAgIEZhbHNlCisgICAgICAgIGRlZiBoKCk6CisgICAgICAgICAgICB4ID0gRmFsc2UKICAgICAgICAgICAgIHJldHVybiB4CisKICAgICAgICAgZm9yIGZ1bmMsIGVsZW0gaW4gKChmLCBOb25lKSwgKGcsIFRydWUpLCAoaCwgRmFsc2UpKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW5CeXRlY29kZShmdW5jLCAnTE9BRF9HTE9CQUwnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbkJ5dGVjb2RlKGZ1bmMsICdMT0FEX0NPTlNUJywgZWxlbSkKKwogICAgICAgICBkZWYgZigpOgogICAgICAgICAgICAgJ0FkZGluZyBhIGRvY3N0cmluZyBtYWRlIHRoaXMgdGVzdCBmYWlsIGluIFB5Mi41LjAnCiAgICAgICAgICAgICByZXR1cm4gTm9uZQorCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW5CeXRlY29kZShmLCAnTE9BRF9HTE9CQUwnKQogICAgICAgICBzZWxmLmFzc2VydEluQnl0ZWNvZGUoZiwgJ0xPQURfQ09OU1QnLCBOb25lKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlcDI0Ny5weSBiL0xpYi90ZXN0L3Rlc3RfcGVwMjQ3LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTdjZWVkLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L3Rlc3RfcGVwMjQ3LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIiIiCi1UZXN0IHN1aXRlIHRvIGNoZWNrIGNvbXBsaWFuY2Ugd2l0aCBQRVAgMjQ3LCB0aGUgc3RhbmRhcmQgQVBJCi1mb3IgaGFzaGluZyBhbGdvcml0aG1zCi0iIiIKLQotaW1wb3J0IGhtYWMKLWltcG9ydCB1bml0dGVzdAotZnJvbSBoYXNobGliIGltcG9ydCBtZDUsIHNoYTEsIHNoYTIyNCwgc2hhMjU2LCBzaGEzODQsIHNoYTUxMgotCi1jbGFzcyBQZXAyNDdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICAgIGRlZiBjaGVja19tb2R1bGUoc2VsZiwgbW9kdWxlLCBrZXk9Tm9uZSk6Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG1vZHVsZSwgJ2RpZ2VzdF9zaXplJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2R1bGUuZGlnZXN0X3NpemUgaXMgTm9uZSBvciBtb2R1bGUuZGlnZXN0X3NpemUgPiAwKQotICAgICAgICBzZWxmLmNoZWNrX29iamVjdChtb2R1bGUubmV3LCBtb2R1bGUuZGlnZXN0X3NpemUsIGtleSkKLQotICAgIGRlZiBjaGVja19vYmplY3Qoc2VsZiwgY2xzLCBkaWdlc3Rfc2l6ZSwga2V5LCBkaWdlc3Rtb2Q9Tm9uZSk6Ci0gICAgICAgIGlmIGtleSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGlmIGRpZ2VzdG1vZCBpcyBOb25lOgotICAgICAgICAgICAgICAgIGRpZ2VzdG1vZCA9IG1kNQotICAgICAgICAgICAgb2JqMSA9IGNscyhrZXksIGRpZ2VzdG1vZD1kaWdlc3Rtb2QpCi0gICAgICAgICAgICBvYmoyID0gY2xzKGtleSwgYidzdHJpbmcnLCBkaWdlc3Rtb2Q9ZGlnZXN0bW9kKQotICAgICAgICAgICAgaDEgPSBjbHMoa2V5LCBiJ3N0cmluZycsIGRpZ2VzdG1vZD1kaWdlc3Rtb2QpLmRpZ2VzdCgpCi0gICAgICAgICAgICBvYmozID0gY2xzKGtleSwgZGlnZXN0bW9kPWRpZ2VzdG1vZCkKLSAgICAgICAgICAgIG9iajMudXBkYXRlKGInc3RyaW5nJykKLSAgICAgICAgICAgIGgyID0gb2JqMy5kaWdlc3QoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgb2JqMSA9IGNscygpCi0gICAgICAgICAgICBvYmoyID0gY2xzKGInc3RyaW5nJykKLSAgICAgICAgICAgIGgxID0gY2xzKGInc3RyaW5nJykuZGlnZXN0KCkKLSAgICAgICAgICAgIG9iajMgPSBjbHMoKQotICAgICAgICAgICAgb2JqMy51cGRhdGUoYidzdHJpbmcnKQotICAgICAgICAgICAgaDIgPSBvYmozLmRpZ2VzdCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaDEsIGgyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihvYmoxLCAnZGlnZXN0X3NpemUnKSkKLQotICAgICAgICBpZiBkaWdlc3Rfc2l6ZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqMS5kaWdlc3Rfc2l6ZSwgZGlnZXN0X3NpemUpCi0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmoxLmRpZ2VzdF9zaXplLCBsZW4oaDEpKQotICAgICAgICBvYmoxLnVwZGF0ZShiJ3N0cmluZycpCi0gICAgICAgIG9ial9jb3B5ID0gb2JqMS5jb3B5KCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmoxLmRpZ2VzdCgpLCBvYmpfY29weS5kaWdlc3QoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmoxLmhleGRpZ2VzdCgpLCBvYmpfY29weS5oZXhkaWdlc3QoKSkKLQotICAgICAgICBkaWdlc3QsIGhleGRpZ2VzdCA9IG9iajEuZGlnZXN0KCksIG9iajEuaGV4ZGlnZXN0KCkKLSAgICAgICAgaGQyID0gIiIKLSAgICAgICAgZm9yIGJ5dGUgaW4gZGlnZXN0OgotICAgICAgICAgICAgaGQyICs9ICclMDJ4JyAlIGJ5dGUKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZDIsIGhleGRpZ2VzdCkKLQotICAgIGRlZiB0ZXN0X21kNShzZWxmKToKLSAgICAgICAgc2VsZi5jaGVja19vYmplY3QobWQ1LCBOb25lLCBOb25lKQotCi0gICAgZGVmIHRlc3Rfc2hhKHNlbGYpOgotICAgICAgICBzZWxmLmNoZWNrX29iamVjdChzaGExLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmNoZWNrX29iamVjdChzaGEyMjQsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuY2hlY2tfb2JqZWN0KHNoYTI1NiwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5jaGVja19vYmplY3Qoc2hhMzg0LCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmNoZWNrX29iamVjdChzaGE1MTIsIE5vbmUsIE5vbmUpCi0KLSAgICBkZWYgdGVzdF9obWFjKHNlbGYpOgotICAgICAgICBzZWxmLmNoZWNrX21vZHVsZShobWFjLCBrZXk9YidhYmMnKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9waWNrbGUucHkgYi9MaWIvdGVzdC90ZXN0X3BpY2tsZS5weQppbmRleCBkNDY3ZDUyLi5lNmM1ZDA4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BpY2tsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BpY2tsZS5weQpAQCAtMzQsOCArMzQsNiBAQAogCiAgICAgdW5waWNrbGVyID0gcGlja2xlLl9VbnBpY2tsZXIKICAgICBiYWRfc3RhY2tfZXJyb3JzID0gKEluZGV4RXJyb3IsKQotICAgIGJhZF9tYXJrX2Vycm9ycyA9IChJbmRleEVycm9yLCBwaWNrbGUuVW5waWNrbGluZ0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBFT0ZFcnJvcikKICAgICB0cnVuY2F0ZWRfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEVPRkVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRXJyb3IsIFZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXJyb3IsIEluZGV4RXJyb3IsIEltcG9ydEVycm9yKQpAQCAtNzAsOCArNjgsNiBAQAogICAgIHBpY2tsZXIgPSBwaWNrbGUuX1BpY2tsZXIKICAgICB1bnBpY2tsZXIgPSBwaWNrbGUuX1VucGlja2xlcgogICAgIGJhZF9zdGFja19lcnJvcnMgPSAocGlja2xlLlVucGlja2xpbmdFcnJvciwgSW5kZXhFcnJvcikKLSAgICBiYWRfbWFya19lcnJvcnMgPSAocGlja2xlLlVucGlja2xpbmdFcnJvciwgSW5kZXhFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgRU9GRXJyb3IpCiAgICAgdHJ1bmNhdGVkX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCBFT0ZFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLCBWYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LmVycm9yLCBJbmRleEVycm9yLCBJbXBvcnRFcnJvcikKQEAgLTE0Myw5ICsxMzksNyBAQAogICAgIGNsYXNzIENVbnBpY2tsZXJUZXN0cyhQeVVucGlja2xlclRlc3RzKToKICAgICAgICAgdW5waWNrbGVyID0gX3BpY2tsZS5VbnBpY2tsZXIKICAgICAgICAgYmFkX3N0YWNrX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCkKLSAgICAgICAgYmFkX21hcmtfZXJyb3JzID0gKEVPRkVycm9yLCkKLSAgICAgICAgdHJ1bmNhdGVkX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCBFT0ZFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvcikKKyAgICAgICAgdHJ1bmNhdGVkX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCkKIAogICAgIGNsYXNzIENQaWNrbGVyVGVzdHMoUHlQaWNrbGVyVGVzdHMpOgogICAgICAgICBwaWNrbGVyID0gX3BpY2tsZS5QaWNrbGVyCkBAIC0zNDEsNiArMzM1LDkgQEAKICAgICAgICAgICAgICAgICBpZiAobW9kdWxlMiwgbmFtZTIpID09ICgnZXhjZXB0aW9ucycsICdPU0Vycm9yJyk6CiAgICAgICAgICAgICAgICAgICAgIGF0dHIgPSBnZXRhdHRyaWJ1dGUobW9kdWxlMywgbmFtZTMpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGF0dHIsIE9TRXJyb3IpKQorICAgICAgICAgICAgICAgIGVsaWYgKG1vZHVsZTIsIG5hbWUyKSA9PSAoJ2V4Y2VwdGlvbnMnLCAnSW1wb3J0RXJyb3InKToKKyAgICAgICAgICAgICAgICAgICAgYXR0ciA9IGdldGF0dHJpYnV0ZShtb2R1bGUzLCBuYW1lMykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoYXR0ciwgSW1wb3J0RXJyb3IpKQogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSwgbmFtZSA9IG1hcHBpbmcobW9kdWxlMiwgbmFtZTIpCiAgICAgICAgICAgICAgICAgICAgIGlmIG1vZHVsZTNbOjFdICE9ICdfJzoKQEAgLTQwNyw2ICs0MDQsMTEgQEAKICAgICAgICAgICAgICAgICBpZiBleGMgaXMgbm90IE9TRXJyb3IgYW5kIGlzc3ViY2xhc3MoZXhjLCBPU0Vycm9yKToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXZlcnNlX21hcHBpbmcoJ2J1aWx0aW5zJywgbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdleGNlcHRpb25zJywgJ09TRXJyb3InKSkKKyAgICAgICAgICAgICAgICBlbGlmIGV4YyBpcyBub3QgSW1wb3J0RXJyb3IgYW5kIGlzc3ViY2xhc3MoZXhjLCBJbXBvcnRFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV2ZXJzZV9tYXBwaW5nKCdidWlsdGlucycsIG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZXhjZXB0aW9ucycsICdJbXBvcnRFcnJvcicpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcHBpbmcoJ2V4Y2VwdGlvbnMnLCBuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2V4Y2VwdGlvbnMnLCBuYW1lKSkKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldmVyc2VfbWFwcGluZygnYnVpbHRpbnMnLCBuYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2V4Y2VwdGlvbnMnLCBuYW1lKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5CmluZGV4IGJiZTY4NzUuLjg2YmViZmEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9waWNrbGV0b29scy5weQpAQCAtMSw5ICsxLDkgQEAKLWltcG9ydCBzdHJ1Y3QKIGltcG9ydCBwaWNrbGUKIGltcG9ydCBwaWNrbGV0b29scwogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCBBYnN0cmFjdFBpY2tsZVRlc3RzCiBmcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzCitpbXBvcnQgdW5pdHRlc3QKIAogY2xhc3MgT3B0aW1pemVkUGlja2xlVGVzdHMoQWJzdHJhY3RQaWNrbGVUZXN0cywgQWJzdHJhY3RQaWNrbGVNb2R1bGVUZXN0cyk6CiAKQEAgLTU5LDggKzU5LDQwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ocGlja2xlLkJJTlBVVCwgcGlja2xlZDIpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnYnl0ZXNfdHlwZXMnLAorICAgICAgICAgICAgICAgICAgICAgJ1VQX1RPX05FV0xJTkUnLCAnVEFLRU5fRlJPTV9BUkdVTUVOVDEnLAorICAgICAgICAgICAgICAgICAgICAgJ1RBS0VOX0ZST01fQVJHVU1FTlQ0JywgJ1RBS0VOX0ZST01fQVJHVU1FTlQ0VScsCisgICAgICAgICAgICAgICAgICAgICAnVEFLRU5fRlJPTV9BUkdVTUVOVDhVJywgJ0FyZ3VtZW50RGVzY3JpcHRvcicsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF91aW50MScsICdyZWFkX3VpbnQyJywgJ3JlYWRfaW50NCcsICdyZWFkX3VpbnQ0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX3VpbnQ4JywgJ3JlYWRfc3RyaW5nbmwnLCAncmVhZF9zdHJpbmdubF9ub2VzY2FwZScsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9zdHJpbmdubF9ub2VzY2FwZV9wYWlyJywgJ3JlYWRfc3RyaW5nMScsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9zdHJpbmc0JywgJ3JlYWRfYnl0ZXMxJywgJ3JlYWRfYnl0ZXM0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX2J5dGVzOCcsICdyZWFkX3VuaWNvZGVzdHJpbmdubCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF91bmljb2Rlc3RyaW5nMScsICdyZWFkX3VuaWNvZGVzdHJpbmc0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX3VuaWNvZGVzdHJpbmc4JywgJ3JlYWRfZGVjaW1hbG5sX3Nob3J0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX2RlY2ltYWxubF9sb25nJywgJ3JlYWRfZmxvYXRubCcsICdyZWFkX2Zsb2F0OCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9sb25nMScsICdyZWFkX2xvbmc0JywKKyAgICAgICAgICAgICAgICAgICAgICd1aW50MScsICd1aW50MicsICdpbnQ0JywgJ3VpbnQ0JywgJ3VpbnQ4JywgJ3N0cmluZ25sJywKKyAgICAgICAgICAgICAgICAgICAgICdzdHJpbmdubF9ub2VzY2FwZScsICdzdHJpbmdubF9ub2VzY2FwZV9wYWlyJywgJ3N0cmluZzEnLAorICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZzQnLCAnYnl0ZXMxJywgJ2J5dGVzNCcsICdieXRlczgnLAorICAgICAgICAgICAgICAgICAgICAgJ3VuaWNvZGVzdHJpbmdubCcsICd1bmljb2Rlc3RyaW5nMScsICd1bmljb2Rlc3RyaW5nNCcsCisgICAgICAgICAgICAgICAgICAgICAndW5pY29kZXN0cmluZzgnLCAnZGVjaW1hbG5sX3Nob3J0JywgJ2RlY2ltYWxubF9sb25nJywKKyAgICAgICAgICAgICAgICAgICAgICdmbG9hdG5sJywgJ2Zsb2F0OCcsICdsb25nMScsICdsb25nNCcsCisgICAgICAgICAgICAgICAgICAgICAnU3RhY2tPYmplY3QnLAorICAgICAgICAgICAgICAgICAgICAgJ3B5aW50JywgJ3B5bG9uZycsICdweWludGVnZXJfb3JfYm9vbCcsICdweWJvb2wnLCAncHlmbG9hdCcsCisgICAgICAgICAgICAgICAgICAgICAncHlieXRlc19vcl9zdHInLCAncHlzdHJpbmcnLCAncHlieXRlcycsICdweXVuaWNvZGUnLAorICAgICAgICAgICAgICAgICAgICAgJ3B5bm9uZScsICdweXR1cGxlJywgJ3B5bGlzdCcsICdweWRpY3QnLCAncHlzZXQnLAorICAgICAgICAgICAgICAgICAgICAgJ3B5ZnJvemVuc2V0JywgJ2FueW9iamVjdCcsICdtYXJrb2JqZWN0JywgJ3N0YWNrc2xpY2UnLAorICAgICAgICAgICAgICAgICAgICAgJ09wY29kZUluZm8nLCAnb3Bjb2RlcycsICdjb2RlMm9wJywKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgcGlja2xldG9vbHMsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KE9wdGltaXplZFBpY2tsZVRlc3RzKQorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KE1pc2NUZXN0Q2FzZSkKICAgICBzdXBwb3J0LnJ1bl9kb2N0ZXN0KHBpY2tsZXRvb2xzKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X3BpcGVzLnB5CmluZGV4IDZhN2I0NWYuLmFkMDFkMDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGlwZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9waXBlcy5weQpAQCAtMiw2ICsyLDcgQEAKIGltcG9ydCBvcwogaW1wb3J0IHN0cmluZwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc2h1dGlsCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QsIHVubGluaywgcmVhcF9jaGlsZHJlbgogCiBpZiBvcy5uYW1lICE9ICdwb3NpeCc6CkBAIC0xOCw2ICsxOSw4IEBACiAgICAgICAgICAgICB1bmxpbmsoZikKIAogICAgIGRlZiB0ZXN0U2ltcGxlUGlwZTEoc2VsZik6CisgICAgICAgIGlmIHNodXRpbC53aGljaCgndHInKSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndHIgaXMgbm90IGF2YWlsYWJsZScpCiAgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCiAgICAgICAgIHQuYXBwZW5kKHNfY29tbWFuZCwgcGlwZXMuU1RESU5fU1RET1VUKQogICAgICAgICBmID0gdC5vcGVuKFRFU1RGTiwgJ3cnKQpAQCAtMjcsNiArMzAsOCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgJ0hFTExPIFdPUkxEICMxJykKIAogICAgIGRlZiB0ZXN0U2ltcGxlUGlwZTIoc2VsZik6CisgICAgICAgIGlmIHNodXRpbC53aGljaCgndHInKSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndHIgaXMgbm90IGF2YWlsYWJsZScpCiAgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3JykgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoJ2hlbGxvIHdvcmxkICMyJykKICAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKQEAgLTM2LDYgKzQxLDggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICdIRUxMTyBXT1JMRCAjMicpCiAKICAgICBkZWYgdGVzdFNpbXBsZVBpcGUzKHNlbGYpOgorICAgICAgICBpZiBzaHV0aWwud2hpY2goJ3RyJykgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3RyIGlzIG5vdCBhdmFpbGFibGUnKQogICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGY6CiAgICAgICAgICAgICBmLndyaXRlKCdoZWxsbyB3b3JsZCAjMicpCiAgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BrZ3V0aWwucHkgYi9MaWIvdGVzdC90ZXN0X3BrZ3V0aWwucHkKaW5kZXggYTgyMDU4Ny4uZmMwNGRjZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wa2d1dGlsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGtndXRpbC5weQpAQCAtODEsOCArODEsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlczIsIFJFU09VUkNFX0RBVEEpCiAKICAgICAgICAgbmFtZXMgPSBbXQotICAgICAgICBmb3IgbG9hZGVyLCBuYW1lLCBpc3BrZyBpbiBwa2d1dGlsLml0ZXJfbW9kdWxlcyhbemlwX2ZpbGVdKToKLSAgICAgICAgICAgIG5hbWVzLmFwcGVuZChuYW1lKQorICAgICAgICBmb3IgbW9kdWxlaW5mbyBpbiBwa2d1dGlsLml0ZXJfbW9kdWxlcyhbemlwX2ZpbGVdKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtb2R1bGVpbmZvLCBwa2d1dGlsLk1vZHVsZUluZm8pCisgICAgICAgICAgICBuYW1lcy5hcHBlbmQobW9kdWxlaW5mby5uYW1lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVzLCBbJ3Rlc3RfZ2V0ZGF0YV96aXBmaWxlJ10pCiAKICAgICAgICAgZGVsIHN5cy5wYXRoWzBdCkBAIC00MTMsNiArNDE0LDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHBrZ3V0aWwuZ2V0X2xvYWRlcigidGVzdC5zdXBwb3J0IikpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMCkKIAorICAgIEB1bml0dGVzdC5za2lwSWYoX19uYW1lX18gPT0gJ19fbWFpbl9fJywgJ25vdCBjb21wYXRpYmxlIHdpdGggX19tYWluX18nKQogICAgIGRlZiB0ZXN0X2dldF9sb2FkZXJfaGFuZGxlc19taXNzaW5nX2xvYWRlcl9hdHRyaWJ1dGUoc2VsZik6CiAgICAgICAgIGdsb2JhbCBfX2xvYWRlcl9fCiAgICAgICAgIHRoaXNfbG9hZGVyID0gX19sb2FkZXJfXwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weSBiL0xpYi90ZXN0L3Rlc3RfcGxhdGZvcm0ucHkKaW5kZXggZWQxODc3My4uOGVlZDdjMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BsYXRmb3JtLnB5CkBAIC0yNTUsNyArMjU1LDcgQEAKICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgogICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoCiAgICAgICAgICAgICAgICAgJ2lnbm9yZScsCi0gICAgICAgICAgICAgICAgJ2Rpc3RcKFwpIGFuZCBsaW51eF9kaXN0cmlidXRpb25cKFwpICcKKyAgICAgICAgICAgICAgICByJ2Rpc3RcKFwpIGFuZCBsaW51eF9kaXN0cmlidXRpb25cKFwpICcKICAgICAgICAgICAgICAgICAnZnVuY3Rpb25zIGFyZSBkZXByZWNhdGVkIC4qJywKICAgICAgICAgICAgICAgICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgKQpAQCAtMzMxLDcgKzMzMSw3IEBACiAgICAgICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgogICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygKICAgICAgICAgICAgICAgICAgICAgICAgICdpZ25vcmUnLAotICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3RcKFwpIGFuZCBsaW51eF9kaXN0cmlidXRpb25cKFwpICcKKyAgICAgICAgICAgICAgICAgICAgICAgIHInZGlzdFwoXCkgYW5kIGxpbnV4X2Rpc3RyaWJ1dGlvblwoXCkgJwogICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9ucyBhcmUgZGVwcmVjYXRlZCAuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgICAgICAgICApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BsaXN0bGliLnB5IGIvTGliL3Rlc3QvdGVzdF9wbGlzdGxpYi5weQppbmRleCAxNjExNGY5Li42MGZmOTE4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BsaXN0bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGxpc3RsaWIucHkKQEAgLTcsNyArNyw2IEBACiBpbXBvcnQgY29kZWNzCiBpbXBvcnQgYmluYXNjaWkKIGltcG9ydCBjb2xsZWN0aW9ucwotaW1wb3J0IHN0cnVjdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCiAKQEAgLTUyNyw4ICs1MjYsMTQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdXIsIGluX2RhdGEpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsiUGxpc3RGb3JtYXQiLCAiUExJU1RIRUFERVIifQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBwbGlzdGxpYiwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdFBsaXN0bGliLCBUZXN0UGxpc3RsaWJEZXByZWNhdGVkKQorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RQbGlzdGxpYiwgVGVzdFBsaXN0bGliRGVwcmVjYXRlZCwgTWlzY1Rlc3RDYXNlKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CmluZGV4IGJjZWViOTMuLjdiOTYwNmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CkBAIC04LDcgKzgsNiBAQAogaW1wb3J0IGFzeW5jaGF0CiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgb3MKLWltcG9ydCB0aW1lCiBpbXBvcnQgZXJybm8KIAogZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UsIHNraXBVbmxlc3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5CmluZGV4IDJhNTljMzguLmQyZjU4YmEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3NpeC5weQpAQCAtMTEsNyArMTEsNiBAQAogaW1wb3J0IG9zCiBpbXBvcnQgcGxhdGZvcm0KIGltcG9ydCBwd2QKLWltcG9ydCBzaHV0aWwKIGltcG9ydCBzdGF0CiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB1bml0dGVzdApAQCAtMzk4LDcgKzM5Nyw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXguc3RhdChmcC5maWxlbm8oKSkpCiAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAnc2hvdWxkIGJlIHN0cmluZywgYnl0ZXMgb3IgaW50ZWdlciwgbm90JywKKyAgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBzdHJpbmcsIGJ5dGVzLCBvcy5QYXRoTGlrZSBvciBpbnRlZ2VyLCBub3QnLAogICAgICAgICAgICAgICAgICAgICBwb3NpeC5zdGF0LCBmbG9hdChmcC5maWxlbm8oKSkpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBmcC5jbG9zZSgpCkBAIC00MDgsMTYgKzQwNywxOCBAQAogICAgIGRlZiB0ZXN0X3N0YXQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5zdGF0KHN1cHBvcnQuVEVTVEZOKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0YXQob3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0YXQoYnl0ZWFycmF5KG9zLmZzZW5jb2RlKHN1cHBvcnQuVEVTVEZOKSkpKQogCisgICAgICAgIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBzdHJpbmcsIGJ5dGVzLCBvcy5QYXRoTGlrZSBvciBpbnRlZ2VyLCBub3QnLAorICAgICAgICAgICAgICAgIHBvc2l4LnN0YXQsIGJ5dGVhcnJheShvcy5mc2VuY29kZShzdXBwb3J0LlRFU1RGTikpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAnY2FuXCd0IHNwZWNpZnkgTm9uZSBmb3IgcGF0aCBhcmd1bWVudCcsCisgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBzdHJpbmcsIGJ5dGVzLCBvcy5QYXRoTGlrZSBvciBpbnRlZ2VyLCBub3QnLAogICAgICAgICAgICAgICAgIHBvc2l4LnN0YXQsIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICdzaG91bGQgYmUgc3RyaW5nLCBieXRlcyBvciBpbnRlZ2VyLCBub3QnLAorICAgICAgICAgICAgICAgICdzaG91bGQgYmUgc3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2Ugb3IgaW50ZWdlciwgbm90JywKICAgICAgICAgICAgICAgICBwb3NpeC5zdGF0LCBsaXN0KHN1cHBvcnQuVEVTVEZOKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBzdHJpbmcsIGJ5dGVzIG9yIGludGVnZXIsIG5vdCcsCisgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBzdHJpbmcsIGJ5dGVzLCBvcy5QYXRoTGlrZSBvciBpbnRlZ2VyLCBub3QnLAogICAgICAgICAgICAgICAgIHBvc2l4LnN0YXQsIGxpc3Qob3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pKSkKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdta2ZpZm8nKSwgImRvbid0IGhhdmUgbWtmaWZvKCkiKQpAQCAtODYzLDkgKzg2NCw5IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMxLCBzMikKICAgICAgICAgICAgIHMyID0gcG9zaXguc3RhdChzdXBwb3J0LlRFU1RGTiwgZGlyX2ZkPU5vbmUpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMxLCBzMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnc2hvdWxkIGJlIGludGVnZXIsIG5vdCcsCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ3Nob3VsZCBiZSBpbnRlZ2VyIG9yIE5vbmUsIG5vdCcsCiAgICAgICAgICAgICAgICAgICAgIHBvc2l4LnN0YXQsIHN1cHBvcnQuVEVTVEZOLCBkaXJfZmQ9cG9zaXguZ2V0Y3dkKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ3Nob3VsZCBiZSBpbnRlZ2VyLCBub3QnLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdzaG91bGQgYmUgaW50ZWdlciBvciBOb25lLCBub3QnLAogICAgICAgICAgICAgICAgICAgICBwb3NpeC5zdGF0LCBzdXBwb3J0LlRFU1RGTiwgZGlyX2ZkPWZsb2F0KGYpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKICAgICAgICAgICAgICAgICAgICAgcG9zaXguc3RhdCwgc3VwcG9ydC5URVNURk4sIGRpcl9mZD0xMCoqMjApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5CmluZGV4IDA3ODNjMzYuLjhhMWUzM2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5CkBAIC01OTYsNSArNTk2LDg1IEBACiAgICAgYXR0cmlidXRlcyA9IFsncmVscGF0aCcsICdzYW1lZmlsZScsICdzYW1lb3BlbmZpbGUnLCAnc2FtZXN0YXQnXQogCiAKK2NsYXNzIFBhdGhMaWtlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgcGF0aCA9IHBvc2l4cGF0aAorCisgICAgY2xhc3MgUGF0aExpa2U6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPScnKToKKyAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgZGVmIF9fZnNwYXRoX18oc2VsZik6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYucGF0aCwgQmFzZUV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgcmFpc2Ugc2VsZi5wYXRoCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhdGgKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlX25hbWUgPSBzdXBwb3J0LlRFU1RGTi5sb3dlcigpCisgICAgICAgIHNlbGYuZmlsZV9wYXRoID0gc2VsZi5QYXRoTGlrZShzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzZWxmLmZpbGVfbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZV9uYW1lLCAneGInLCAwKSBhcyBmaWxlOgorICAgICAgICAgICAgZmlsZS53cml0ZShiInRlc3RfcG9zaXhwYXRoLlBhdGhMaWtlVGVzdHMiKQorCisgICAgZGVmIGFzc2VydFBhdGhFcXVhbChzZWxmLCBmdW5jKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHNlbGYuZmlsZV9wYXRoKSwgZnVuYyhzZWxmLmZpbGVfbmFtZSkpCisKKyAgICBkZWYgdGVzdF9wYXRoX25vcm1jYXNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGgubm9ybWNhc2UpCisKKyAgICBkZWYgdGVzdF9wYXRoX2lzYWJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguaXNhYnMpCisKKyAgICBkZWYgdGVzdF9wYXRoX2pvaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXRoLmpvaW4oJ2EnLCBzZWxmLlBhdGhMaWtlKCdiJyksICdjJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoLmpvaW4oJ2EnLCAnYicsICdjJykpCisKKyAgICBkZWYgdGVzdF9wYXRoX3NwbGl0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguc3BsaXQpCisKKyAgICBkZWYgdGVzdF9wYXRoX3NwbGl0ZXh0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguc3BsaXRleHQpCisKKyAgICBkZWYgdGVzdF9wYXRoX3NwbGl0ZHJpdmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5zcGxpdGRyaXZlKQorCisgICAgZGVmIHRlc3RfcGF0aF9iYXNlbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmJhc2VuYW1lKQorCisgICAgZGVmIHRlc3RfcGF0aF9kaXJuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguZGlybmFtZSkKKworICAgIGRlZiB0ZXN0X3BhdGhfaXNsaW5rKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguaXNsaW5rKQorCisgICAgZGVmIHRlc3RfcGF0aF9sZXhpc3RzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGgubGV4aXN0cykKKworICAgIGRlZiB0ZXN0X3BhdGhfaXNtb3VudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmlzbW91bnQpCisKKyAgICBkZWYgdGVzdF9wYXRoX2V4cGFuZHVzZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5leHBhbmR1c2VyKQorCisgICAgZGVmIHRlc3RfcGF0aF9leHBhbmR2YXJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguZXhwYW5kdmFycykKKworICAgIGRlZiB0ZXN0X3BhdGhfbm9ybXBhdGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5ub3JtcGF0aCkKKworICAgIGRlZiB0ZXN0X3BhdGhfYWJzcGF0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmFic3BhdGgpCisKKyAgICBkZWYgdGVzdF9wYXRoX3JlYWxwYXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGgucmVhbHBhdGgpCisKKyAgICBkZWYgdGVzdF9wYXRoX3JlbHBhdGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5yZWxwYXRoKQorCisgICAgZGVmIHRlc3RfcGF0aF9jb21tb25wYXRoKHNlbGYpOgorICAgICAgICBjb21tb25fcGF0aCA9IHNlbGYucGF0aC5jb21tb25wYXRoKFtzZWxmLmZpbGVfcGF0aCwgc2VsZi5maWxlX25hbWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbW1vbl9wYXRoLCBzZWxmLmZpbGVfbmFtZSkKKworCiBpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG93LnB5IGIvTGliL3Rlc3QvdGVzdF9wb3cucHkKaW5kZXggNmZlYWM0MC4uY2U5OWZlNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb3cucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3cucHkKQEAgLTEsNCArMSw0IEBACi1pbXBvcnQgdGVzdC5zdXBwb3J0LCB1bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CiAKIGNsYXNzIFBvd1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B0eS5weSBiL0xpYi90ZXN0L3Rlc3RfcHR5LnB5CmluZGV4IGVmNWU5OWUuLjE1Zjg4ZTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHR5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHR5LnB5CkBAIC0yNzcsNyArMjc3LDYgQEAKICAgICAgICAgc29ja2V0cGFpciA9IHNlbGYuX3NvY2tldHBhaXIoKQogICAgICAgICBtYXN0ZXJzID0gW3MuZmlsZW5vKCkgZm9yIHMgaW4gc29ja2V0cGFpcl0KIAotICAgICAgICBvcy5jbG9zZShtYXN0ZXJzWzFdKQogICAgICAgICBzb2NrZXRwYWlyWzFdLmNsb3NlKCkKICAgICAgICAgb3MuY2xvc2Uod3JpdGVfdG9fc3RkaW5fZmQpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHVsbGRvbS5weSBiL0xpYi90ZXN0L3Rlc3RfcHVsbGRvbS5weQppbmRleCAxOTMyYzZiLi4zZDg5ZTNhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B1bGxkb20ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wdWxsZG9tLnB5CkBAIC0xLDYgKzEsNSBAQAogaW1wb3J0IGlvCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBzeXMKIGltcG9ydCB4bWwuc2F4CiAKIGZyb20geG1sLnNheC54bWxyZWFkZXIgaW1wb3J0IEF0dHJpYnV0ZXNJbXBsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5Y2xici5weSBiL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CmluZGV4IDZmZmJiYmQuLjA2YzEwYzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICAgICAgIyBUaGVzZSB3ZXJlIG9uY2UgYWJvdXQgdGhlIDEwIGxvbmdlc3QgbW9kdWxlcwogICAgICAgICBjbSgncmFuZG9tJywgaWdub3JlPSgnUmFuZG9tJywpKSAgIyBmcm9tIF9yYW5kb20gaW1wb3J0IFJhbmRvbSBhcyBDb3JlR2VuZXJhdG9yCiAgICAgICAgIGNtKCdjZ2knLCBpZ25vcmU9KCdsb2cnLCkpICAgICAgIyBzZXQgd2l0aCA9IGluIG1vZHVsZQotICAgICAgICBjbSgncGlja2xlJykKKyAgICAgICAgY20oJ3BpY2tsZScsIGlnbm9yZT0oJ3BhcnRpYWwnLCkpCiAgICAgICAgIGNtKCdhaWZjJywgaWdub3JlPSgnb3BlbmZwJywgJ19haWZjX3BhcmFtcycpKSAgIyBzZXQgd2l0aCA9IGluIG1vZHVsZQogICAgICAgICBjbSgnc3JlX3BhcnNlJywgaWdub3JlPSgnZHVtcCcsICdncm91cHMnKSkgIyBmcm9tIHNyZV9jb25zdGFudHMgaW1wb3J0ICo7IHByb3BlcnR5CiAgICAgICAgIGNtKCdwZGInKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9weWRvYy5weSBiL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkKaW5kZXggYWVlOTc5Yi4uNTE3NGQ1NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWRvYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5CkBAIC04Myw2ICs4Myw4IEBACiAgICAgIHwgIERhdGEgYW5kIG90aGVyIGF0dHJpYnV0ZXMgZGVmaW5lZCBoZXJlOgogICAgICB8XHgyMFx4MjAKICAgICAgfCAgTk9fTUVBTklORyA9ICdlZ2dzJworICAgICB8XHgyMFx4MjAKKyAgICAgfCAgX19hbm5vdGF0aW9uc19fID0geydOT19NRUFOSU5HJzogPGNsYXNzICdzdHInPn0KIFx4MjBceDIwXHgyMFx4MjAKICAgICBjbGFzcyBDKGJ1aWx0aW5zLm9iamVjdCkKICAgICAgfCAgTWV0aG9kcyBkZWZpbmVkIGhlcmU6CkBAIC0xOTUsNiArMTk3LDggQEAKIERhdGEgYW5kIG90aGVyIGF0dHJpYnV0ZXMgZGVmaW5lZCBoZXJlOjxicj4KIDxkbD48ZHQ+PHN0cm9uZz5OT19NRUFOSU5HPC9zdHJvbmc+ID0gJ2VnZ3MnPC9kbD4KIAorPGRsPjxkdD48c3Ryb25nPl9fYW5ub3RhdGlvbnNfXzwvc3Ryb25nPiA9IHsnTk9fTUVBTklORyc6ICZsdDtjbGFzcyAnc3RyJyZndDt9PC9kbD4KKwogPC90ZD48L3RyPjwvdGFibGU+IDxwPgogPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGJvcmRlcj0wIHN1bW1hcnk9InNlY3Rpb24iPgogPHRyIGJnY29sb3I9IiNmZmM4ZDgiPgpAQCAtMjYzLDcgKzI2Nyw3IEBACiBVc2UgaGVscChzdHIpIGZvciBoZWxwIG9uIHRoZSBzdHIgY2xhc3MuJycnLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkKIAogIyBvdXRwdXQgcGF0dGVybiBmb3IgbW9kdWxlIHdpdGggYmFkIGltcG9ydHMKLWJhZGltcG9ydF9wYXR0ZXJuID0gInByb2JsZW0gaW4gJXMgLSBJbXBvcnRFcnJvcjogTm8gbW9kdWxlIG5hbWVkICVyIgorYmFkaW1wb3J0X3BhdHRlcm4gPSAicHJvYmxlbSBpbiAlcyAtIE1vZHVsZU5vdEZvdW5kRXJyb3I6IE5vIG1vZHVsZSBuYW1lZCAlciIKIAogZXhwZWN0ZWRfZHluYW1pY2F0dHJpYnV0ZV9wYXR0ZXJuID0gIiIiCiBIZWxwIG9uIGNsYXNzIERBIGluIG1vZHVsZSAlczoKQEAgLTYzOCw4ICs2NDIsOSBAQAogICAgICAgICBkZWwgZXhwZWN0ZWRbJ19fZG9jX18nXQogICAgICAgICBkZWwgZXhwZWN0ZWRbJ19fY2xhc3NfXyddCiAgICAgICAgICMgaW5zcGVjdCByZXNvbHZlcyBkZXNjcmlwdG9ycyBvbiB0eXBlIGludG8gbWV0aG9kcywgYnV0IHZhcnMgZG9lc24ndCwKLSAgICAgICAgIyBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSBfX3N1YmNsYXNzaG9va19fLgorICAgICAgICAjIHNvIHdlIG5lZWQgdG8gdXBkYXRlIF9fc3ViY2xhc3Nob29rX18gYW5kIF9faW5pdF9zdWJjbGFzc19fLgogICAgICAgICBleHBlY3RlZFsnX19zdWJjbGFzc2hvb2tfXyddID0gVGVzdENsYXNzLl9fc3ViY2xhc3Nob29rX18KKyAgICAgICAgZXhwZWN0ZWRbJ19faW5pdF9zdWJjbGFzc19fJ10gPSBUZXN0Q2xhc3MuX19pbml0X3N1YmNsYXNzX18KIAogICAgICAgICBtZXRob2RzID0gcHlkb2MuYWxsbWV0aG9kcyhUZXN0Q2xhc3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKG1ldGhvZHMsIGV4cGVjdGVkKQpAQCAtODU1LDYgKzg2MCwyMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2dldF9zdW1tYXJ5X2xpbmUodC53cmFwKSwKICAgICAgICAgICAgICJ3cmFwKHRleHQpIG1ldGhvZCBvZiB0ZXh0d3JhcC5UZXh0V3JhcHBlciBpbnN0YW5jZSIpCiAKKyAgICBkZWYgdGVzdF9maWVsZF9vcmRlcl9mb3JfbmFtZWRfdHVwbGVzKHNlbGYpOgorICAgICAgICBQZXJzb24gPSBuYW1lZHR1cGxlKCdQZXJzb24nLCBbJ25pY2tuYW1lJywgJ2ZpcnN0bmFtZScsICdhZ2Vncm91cCddKQorICAgICAgICBzID0gcHlkb2MucmVuZGVyX2RvYyhQZXJzb24pCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhzLmluZGV4KCduaWNrbmFtZScpLCBzLmluZGV4KCdmaXJzdG5hbWUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKHMuaW5kZXgoJ2ZpcnN0bmFtZScpLCBzLmluZGV4KCdhZ2Vncm91cCcpKQorCisgICAgICAgIGNsYXNzIE5vbkl0ZXJhYmxlRmllbGRzOgorICAgICAgICAgICAgX2ZpZWxkcyA9IE5vbmUKKworICAgICAgICBjbGFzcyBOb25IYXNoYWJsZUZpZWxkczoKKyAgICAgICAgICAgIF9maWVsZHMgPSBbW11dCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlc2UgZG9lc24ndCBmYWlsCisgICAgICAgIHB5ZG9jLnJlbmRlcl9kb2MoTm9uSXRlcmFibGVGaWVsZHMpCisgICAgICAgIHB5ZG9jLnJlbmRlcl9kb2MoTm9uSGFzaGFibGVGaWVsZHMpCisKICAgICBAcmVxdWlyZXNfZG9jc3RyaW5ncwogICAgIGRlZiB0ZXN0X2JvdW5kX2J1aWx0aW5fbWV0aG9kKHNlbGYpOgogICAgICAgICBzID0gU3RyaW5nSU8oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9xdW9wcmkucHkgYi9MaWIvdGVzdC90ZXN0X3F1b3ByaS5weQppbmRleCA3Y2FjMDEzLi43MTU1NDRjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3F1b3ByaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3F1b3ByaS5weQpAQCAtMSw2ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogCi1pbXBvcnQgc3lzLCBvcywgaW8sIHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMsIGlvLCBzdWJwcm9jZXNzCiBpbXBvcnQgcXVvcHJpCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkgYi9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQppbmRleCBlODBlZDE3Li45YzEzODNkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQpAQCAtNyw2ICs3LDcgQEAKIGZyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCiBmcm9tIG1hdGggaW1wb3J0IGxvZywgZXhwLCBwaSwgZnN1bSwgc2luCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK2Zyb20gZnJhY3Rpb25zIGltcG9ydCBGcmFjdGlvbgogCiBjbGFzcyBUZXN0QmFzaWNPcHM6CiAgICAgIyBTdXBlcmNsYXNzIHdpdGggdGVzdHMgY29tbW9uIHRvIGFsbCBnZW5lcmF0b3JzLgpAQCAtMTQxLDYgKzE0Miw3MyBAQAogICAgIGRlZiB0ZXN0X3NhbXBsZV9vbl9kaWN0cyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmdlbi5zYW1wbGUsIGRpY3QuZnJvbWtleXMoJ2FiY2RlZicpLCAyKQogCisgICAgZGVmIHRlc3RfY2hvaWNlcyhzZWxmKToKKyAgICAgICAgY2hvaWNlcyA9IHNlbGYuZ2VuLmNob2ljZXMKKyAgICAgICAgZGF0YSA9IFsncmVkJywgJ2dyZWVuJywgJ2JsdWUnLCAneWVsbG93J10KKyAgICAgICAgc3RyX2RhdGEgPSAnYWJjZCcKKyAgICAgICAgcmFuZ2VfZGF0YSA9IHJhbmdlKDQpCisgICAgICAgIHNldF9kYXRhID0gc2V0KHJhbmdlKDQpKQorCisgICAgICAgICMgYmFzaWMgZnVuY3Rpb25hbGl0eQorICAgICAgICBmb3Igc2FtcGxlIGluIFsKKyAgICAgICAgICAgIGNob2ljZXMoNSwgZGF0YSksCisgICAgICAgICAgICBjaG9pY2VzKDUsIGRhdGEsIHJhbmdlKDQpKSwKKyAgICAgICAgICAgIGNob2ljZXMoaz01LCBwb3B1bGF0aW9uPWRhdGEsIHdlaWdodHM9cmFuZ2UoNCkpLAorICAgICAgICAgICAgY2hvaWNlcyhrPTUsIHBvcHVsYXRpb249ZGF0YSwgY3VtX3dlaWdodHM9cmFuZ2UoNCkpLAorICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2FtcGxlKSwgNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzYW1wbGUpLCBsaXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzYW1wbGUpIDw9IHNldChkYXRhKSkKKworICAgICAgICAjIHRlc3QgYXJndW1lbnQgaGFuZGxpbmcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1pc3NpbmcgYXJndW1lbnRzCisgICAgICAgICAgICBjaG9pY2VzKDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaG9pY2VzKDAsIGRhdGEpLCBbXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGsgPT0gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNob2ljZXMoLTEsIGRhdGEpLCBbXSkgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmVnYXRpdmUgayBiZWhhdmVzIGxpa2UgYGBbMF0gKiAtMWBgCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGNob2ljZXMoMi41LCBkYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGsgaXMgYSBmbG9hdAorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoY2hvaWNlcyg1LCBzdHJfZGF0YSkpIDw9IHNldChzdHJfZGF0YSkpICAgICAgIyBwb3B1bGF0aW9uIGlzIGEgc3RyaW5nIHNlcXVlbmNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoY2hvaWNlcyg1LCByYW5nZV9kYXRhKSkgPD0gc2V0KHJhbmdlX2RhdGEpKSAgIyBwb3B1bGF0aW9uIGlzIGEgcmFuZ2UKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgY2hvaWNlcygyLjUsIHNldF9kYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9wdWxhdGlvbiBpcyBub3QgYSBzZXF1ZW5jZQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoY2hvaWNlcyg1LCBkYXRhLCBOb25lKSkgPD0gc2V0KGRhdGEpKSAgICAgICAgIyB3ZWlnaHRzIGlzIE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChjaG9pY2VzKDUsIGRhdGEsIHdlaWdodHM9Tm9uZSkpIDw9IHNldChkYXRhKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIGNob2ljZXMoNSwgZGF0YSwgWzEsMl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxlbih3ZWlnaHRzKSAhPSBsZW4ocG9wdWxhdGlvbikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKToKKyAgICAgICAgICAgIGNob2ljZXMoNSwgZGF0YSwgWzBdKjQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdlaWdodHMgc3VtIHRvIHplcm8KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgY2hvaWNlcyg1LCBkYXRhLCAxMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm9uLWl0ZXJhYmxlIHdlaWdodHMKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgY2hvaWNlcyg1LCBkYXRhLCBbTm9uZV0qNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm9uLW51bWVyaWMgd2VpZ2h0cworICAgICAgICBmb3Igd2VpZ2h0cyBpbiBbCisgICAgICAgICAgICAgICAgWzE1LCAxMCwgMjUsIDMwXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbnRlZ2VyIHdlaWdodHMKKyAgICAgICAgICAgICAgICBbMTUuMSwgMTAuMiwgMjUuMiwgMzAuM10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZsb2F0IHdlaWdodHMKKyAgICAgICAgICAgICAgICBbRnJhY3Rpb24oMSwgMyksIEZyYWN0aW9uKDIsIDYpLCBGcmFjdGlvbigzLCA2KSwgRnJhY3Rpb24oNCwgNildLCAjIGZyYWN0aW9uYWwgd2VpZ2h0cworICAgICAgICAgICAgICAgIFtUcnVlLCBGYWxzZSwgVHJ1ZSwgRmFsc2VdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYm9vbGVhbnMgKGluY2x1ZGUgLyBleGNsdWRlKQorICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChjaG9pY2VzKDUsIGRhdGEsIHdlaWdodHMpKSA8PSBzZXQoZGF0YSkpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIGNob2ljZXMoNSwgZGF0YSwgY3VtX3dlaWdodHM9WzEsMl0pICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxlbih3ZWlnaHRzKSAhPSBsZW4ocG9wdWxhdGlvbikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKToKKyAgICAgICAgICAgIGNob2ljZXMoNSwgZGF0YSwgY3VtX3dlaWdodHM9WzBdKjQpICAgICAgICAgICAgICAgICAgICAgICAgICAjIGN1bV93ZWlnaHRzIHN1bSB0byB6ZXJvCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGNob2ljZXMoNSwgZGF0YSwgY3VtX3dlaWdodHM9MTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vbi1pdGVyYWJsZSBjdW1fd2VpZ2h0cworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjaG9pY2VzKDUsIGRhdGEsIGN1bV93ZWlnaHRzPVtOb25lXSo0KSAgICAgICAgICAgICAgICAgICAgICAgIyBub24tbnVtZXJpYyBjdW1fd2VpZ2h0cworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjaG9pY2VzKDUsIGRhdGEsIHJhbmdlKDQpLCBjdW1fd2VpZ2h0cz1yYW5nZSg0KSkgICAgICAgICAgICAgIyBib3RoIHdlaWdodHMgYW5kIGN1bV93ZWlnaHRzCisgICAgICAgIGZvciB3ZWlnaHRzIGluIFsKKyAgICAgICAgICAgICAgICBbMTUsIDEwLCAyNSwgMzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGludGVnZXIgY3VtX3dlaWdodHMKKyAgICAgICAgICAgICAgICBbMTUuMSwgMTAuMiwgMjUuMiwgMzAuM10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZsb2F0IGN1bV93ZWlnaHRzCisgICAgICAgICAgICAgICAgW0ZyYWN0aW9uKDEsIDMpLCBGcmFjdGlvbigyLCA2KSwgRnJhY3Rpb24oMywgNiksIEZyYWN0aW9uKDQsIDYpXSwgIyBmcmFjdGlvbmFsIGN1bV93ZWlnaHRzCisgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KGNob2ljZXMoNSwgZGF0YSwgY3VtX3dlaWdodHM9d2VpZ2h0cykpIDw9IHNldChkYXRhKSkKKwogICAgIGRlZiB0ZXN0X2dhdXNzKHNlbGYpOgogICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBzZWVkKCkgbWV0aG9kIGluaXRpYWxpemVzIGFsbCB0aGUgaGlkZGVuIHN0YXRlLiAgSW4KICAgICAgICAgIyBwYXJ0aWN1bGFyLCB0aHJvdWdoIDIuMi4xIGl0IGZhaWxlZCB0byByZXNldCBhIHBpZWNlIG9mIHN0YXRlIHVzZWQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmFuZ2UucHkgYi9MaWIvdGVzdC90ZXN0X3JhbmdlLnB5CmluZGV4IDEwNmM3MzIuLmUwM2I1NzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmFuZ2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yYW5nZS5weQpAQCAtMSw2ICsxLDYgQEAKICMgUHl0aG9uIHRlc3Qgc2V0IC0tIGJ1aWx0LWluIGZ1bmN0aW9ucwogCi1pbXBvcnQgdGVzdC5zdXBwb3J0LCB1bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgaXRlcnRvb2xzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JlLnB5IGIvTGliL3Rlc3QvdGVzdF9yZS5weQppbmRleCA3YTc0MTQxLi4wMmZlZDIxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcmUucHkKQEAgLTExMywxMCArMTEzLDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcoLiknLCByZS5lc2NhcGUocyksICd4JyksIHMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcoLiknLCBsYW1iZGEgbTogcywgJ3gnKSwgcykKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignKD9QPGE+eCknLCAnXGc8YT5cZzxhPicsICd4eCcpLCAneHh4eCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcoP1A8YT54KScsICdcZzxhPlxnPDE+JywgJ3h4JyksICd4eHh4JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyg/UDx1bms+eCknLCAnXGc8dW5rPlxnPHVuaz4nLCAneHgnKSwgJ3h4eHgnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignKD9QPHVuaz54KScsICdcZzwxPlxnPDE+JywgJ3h4JyksICd4eHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyg/UDxhPngpJywgcidcZzxhPlxnPGE+JywgJ3h4JyksICd4eHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyg/UDxhPngpJywgcidcZzxhPlxnPDE+JywgJ3h4JyksICd4eHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyg/UDx1bms+eCknLCByJ1xnPHVuaz5cZzx1bms+JywgJ3h4JyksICd4eHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyg/UDx1bms+eCknLCByJ1xnPDE+XGc8MT4nLCAneHgnKSwgJ3h4eHgnKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdhJywgcidcdFxuXHZcclxmXGFcYicsICdhJyksICdcdFxuXHZcclxmXGFcYicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdhJywgJ1x0XG5cdlxyXGZcYVxiJywgJ2EnKSwgJ1x0XG5cdlxyXGZcYVxiJykKQEAgLTEyNCwxNCArMTI0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNocig5KStjaHIoMTApK2NocigxMSkrY2hyKDEzKStjaHIoMTIpK2Nocig3KStjaHIoOCkpKQogICAgICAgICBmb3IgYyBpbiAnY2RlaGlqa2xtb3Bxc3V3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoYyk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvcik6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdhJywgJ1xcJyArIGMsICdhJyksICdcXCcgKyBjKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdeXHMqJywgJ1gnLCAndGVzdCcpLCAnWHRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YihyJ15ccyonLCAnWCcsICd0ZXN0JyksICdYdGVzdCcpCiAKICAgICBkZWYgdGVzdF9idWdfNDQ5OTY0KHNlbGYpOgogICAgICAgICAjIGZhaWxzIGZvciBncm91cCBmb2xsb3dlZCBieSBvdGhlciBlc2NhcGUKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIocicoP1A8dW5rPngpJywgJ1xnPDE+XGc8MT5cXGInLCAneHgnKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIocicoP1A8dW5rPngpJywgcidcZzwxPlxnPDE+XGInLCAneHgnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAneHhcYnh4XGInKQogCiAgICAgZGVmIHRlc3RfYnVnXzQ0OTAwMChzZWxmKToKQEAgLTIxOCwyNiArMjE4LDI2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4KycsICctJywgJ2FieGQnKSwgJ2FiLWQnKQogCiAgICAgZGVmIHRlc3Rfc3ltYm9saWNfZ3JvdXBzKHNlbGYpOgotICAgICAgICByZS5jb21waWxlKCcoP1A8YT54KSg/UD1hKSg/KGEpeSknKQotICAgICAgICByZS5jb21waWxlKCcoP1A8YTE+eCkoP1A9YTEpKD8oYTEpeSknKQotICAgICAgICByZS5jb21waWxlKCcoP1A8YTE+eClcMSg/KDEpeSknKQotICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKCcoP1A8YT4pKD9QPGE+KScsCisgICAgICAgIHJlLmNvbXBpbGUocicoP1A8YT54KSg/UD1hKSg/KGEpeSknKQorICAgICAgICByZS5jb21waWxlKHInKD9QPGExPngpKD9QPWExKSg/KGExKXkpJykKKyAgICAgICAgcmUuY29tcGlsZShyJyg/UDxhMT54KVwxKD8oMSl5KScpCisgICAgICAgIHNlbGYuY2hlY2tQYXR0ZXJuRXJyb3IocicoP1A8YT4pKD9QPGE+KScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZGVmaW5pdGlvbiBvZiBncm91cCBuYW1lICdhJyBhcyBncm91cCAyOyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcyBncm91cCAxIikKLSAgICAgICAgc2VsZi5jaGVja1BhdHRlcm5FcnJvcignKD9QPGE+KD9QPWEpKScsCisgICAgICAgIHNlbGYuY2hlY2tQYXR0ZXJuRXJyb3IocicoP1A8YT4oP1A9YSkpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHJlZmVyIHRvIGFuIG9wZW4gZ3JvdXAiLCAxMCkKLSAgICAgICAgc2VsZi5jaGVja1BhdHRlcm5FcnJvcignKD9QeHkpJywgJ3Vua25vd24gZXh0ZW5zaW9uID9QeCcpCi0gICAgICAgIHNlbGYuY2hlY2tQYXR0ZXJuRXJyb3IoJyg/UDxhPikoP1A9YScsICdtaXNzaW5nICksIHVudGVybWluYXRlZCBuYW1lJywgMTEpCi0gICAgICAgIHNlbGYuY2hlY2tQYXR0ZXJuRXJyb3IoJyg/UD0nLCAnbWlzc2luZyBncm91cCBuYW1lJywgNCkKLSAgICAgICAgc2VsZi5jaGVja1BhdHRlcm5FcnJvcignKD9QPSknLCAnbWlzc2luZyBncm91cCBuYW1lJywgNCkKLSAgICAgICAgc2VsZi5jaGVja1BhdHRlcm5FcnJvcignKD9QPTEpJywgImJhZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSAnMSciLCA0KQotICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKCcoP1A9YSknLCAidW5rbm93biBncm91cCBuYW1lICdhJyIpCi0gICAgICAgIHNlbGYuY2hlY2tQYXR0ZXJuRXJyb3IoJyg/UD1hMSknLCAidW5rbm93biBncm91cCBuYW1lICdhMSciKQotICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKCcoP1A9YS4pJywgImJhZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSAnYS4nIiwgNCkKLSAgICAgICAgc2VsZi5jaGVja1BhdHRlcm5FcnJvcignKD9QPCknLCAnbWlzc2luZyA+LCB1bnRlcm1pbmF0ZWQgbmFtZScsIDQpCi0gICAgICAgIHNlbGYuY2hlY2tQYXR0ZXJuRXJyb3IoJyg/UDxhJywgJ21pc3NpbmcgPiwgdW50ZXJtaW5hdGVkIG5hbWUnLCA0KQotICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKCcoP1A8JywgJ21pc3NpbmcgZ3JvdXAgbmFtZScsIDQpCi0gICAgICAgIHNlbGYuY2hlY2tQYXR0ZXJuRXJyb3IoJyg/UDw+KScsICdtaXNzaW5nIGdyb3VwIG5hbWUnLCA0KQorICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKHInKD9QeHkpJywgJ3Vua25vd24gZXh0ZW5zaW9uID9QeCcpCisgICAgICAgIHNlbGYuY2hlY2tQYXR0ZXJuRXJyb3IocicoP1A8YT4pKD9QPWEnLCAnbWlzc2luZyApLCB1bnRlcm1pbmF0ZWQgbmFtZScsIDExKQorICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKHInKD9QPScsICdtaXNzaW5nIGdyb3VwIG5hbWUnLCA0KQorICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKHInKD9QPSknLCAnbWlzc2luZyBncm91cCBuYW1lJywgNCkKKyAgICAgICAgc2VsZi5jaGVja1BhdHRlcm5FcnJvcihyJyg/UD0xKScsICJiYWQgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUgJzEnIiwgNCkKKyAgICAgICAgc2VsZi5jaGVja1BhdHRlcm5FcnJvcihyJyg/UD1hKScsICJ1bmtub3duIGdyb3VwIG5hbWUgJ2EnIikKKyAgICAgICAgc2VsZi5jaGVja1BhdHRlcm5FcnJvcihyJyg/UD1hMSknLCAidW5rbm93biBncm91cCBuYW1lICdhMSciKQorICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKHInKD9QPWEuKScsICJiYWQgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUgJ2EuJyIsIDQpCisgICAgICAgIHNlbGYuY2hlY2tQYXR0ZXJuRXJyb3IocicoP1A8KScsICdtaXNzaW5nID4sIHVudGVybWluYXRlZCBuYW1lJywgNCkKKyAgICAgICAgc2VsZi5jaGVja1BhdHRlcm5FcnJvcihyJyg/UDxhJywgJ21pc3NpbmcgPiwgdW50ZXJtaW5hdGVkIG5hbWUnLCA0KQorICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKHInKD9QPCcsICdtaXNzaW5nIGdyb3VwIG5hbWUnLCA0KQorICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKHInKD9QPD4pJywgJ21pc3NpbmcgZ3JvdXAgbmFtZScsIDQpCiAgICAgICAgIHNlbGYuY2hlY2tQYXR0ZXJuRXJyb3IocicoP1A8MT4pJywgImJhZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSAnMSciLCA0KQogICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKHInKD9QPGEuPiknLCAiYmFkIGNoYXJhY3RlciBpbiBncm91cCBuYW1lICdhLiciLCA0KQogICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKHInKD8oJywgJ21pc3NpbmcgZ3JvdXAgbmFtZScsIDMpCkBAIC0yNTYsMzUgKzI1NiwzNSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHBhdCwgJ3hjOHl6Jykuc3BhbigpLCAoMCwgNSkpCiAKICAgICBkZWYgdGVzdF9zeW1ib2xpY19yZWZzKHNlbGYpOgotICAgICAgICBzZWxmLmNoZWNrVGVtcGxhdGVFcnJvcignKD9QPGE+eCknLCAnXGc8YScsICd4eCcsCisgICAgICAgIHNlbGYuY2hlY2tUZW1wbGF0ZUVycm9yKCcoP1A8YT54KScsIHInXGc8YScsICd4eCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaXNzaW5nID4sIHVudGVybWluYXRlZCBuYW1lJywgMykKLSAgICAgICAgc2VsZi5jaGVja1RlbXBsYXRlRXJyb3IoJyg/UDxhPngpJywgJ1xnPCcsICd4eCcsCisgICAgICAgIHNlbGYuY2hlY2tUZW1wbGF0ZUVycm9yKCcoP1A8YT54KScsIHInXGc8JywgJ3h4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pc3NpbmcgZ3JvdXAgbmFtZScsIDMpCi0gICAgICAgIHNlbGYuY2hlY2tUZW1wbGF0ZUVycm9yKCcoP1A8YT54KScsICdcZycsICd4eCcsICdtaXNzaW5nIDwnLCAyKQotICAgICAgICBzZWxmLmNoZWNrVGVtcGxhdGVFcnJvcignKD9QPGE+eCknLCAnXGc8YSBhPicsICd4eCcsCisgICAgICAgIHNlbGYuY2hlY2tUZW1wbGF0ZUVycm9yKCcoP1A8YT54KScsIHInXGcnLCAneHgnLCAnbWlzc2luZyA8JywgMikKKyAgICAgICAgc2VsZi5jaGVja1RlbXBsYXRlRXJyb3IoJyg/UDxhPngpJywgcidcZzxhIGE+JywgJ3h4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSAnYSBhJyIsIDMpCi0gICAgICAgIHNlbGYuY2hlY2tUZW1wbGF0ZUVycm9yKCcoP1A8YT54KScsICdcZzw+JywgJ3h4JywKKyAgICAgICAgc2VsZi5jaGVja1RlbXBsYXRlRXJyb3IoJyg/UDxhPngpJywgcidcZzw+JywgJ3h4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pc3NpbmcgZ3JvdXAgbmFtZScsIDMpCi0gICAgICAgIHNlbGYuY2hlY2tUZW1wbGF0ZUVycm9yKCcoP1A8YT54KScsICdcZzwxYTE+JywgJ3h4JywKKyAgICAgICAgc2VsZi5jaGVja1RlbXBsYXRlRXJyb3IoJyg/UDxhPngpJywgcidcZzwxYTE+JywgJ3h4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSAnMWExJyIsIDMpCiAgICAgICAgIHNlbGYuY2hlY2tUZW1wbGF0ZUVycm9yKCcoP1A8YT54KScsIHInXGc8Mj4nLCAneHgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW52YWxpZCBncm91cCByZWZlcmVuY2UnKQogICAgICAgICBzZWxmLmNoZWNrVGVtcGxhdGVFcnJvcignKD9QPGE+eCknLCByJ1wyJywgJ3h4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgZ3JvdXAgcmVmZXJlbmNlJykKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KEluZGV4RXJyb3IsICJ1bmtub3duIGdyb3VwIG5hbWUgJ2FiJyIpOgotICAgICAgICAgICAgcmUuc3ViKCcoP1A8YT54KScsICdcZzxhYj4nLCAneHgnKQorICAgICAgICAgICAgcmUuc3ViKCcoP1A8YT54KScsIHInXGc8YWI+JywgJ3h4JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyg/UDxhPngpfCg/UDxiPnkpJywgcidcZzxiPicsICd4eCcpLCAnJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyg/UDxhPngpfCg/UDxiPnkpJywgcidcMicsICd4eCcpLCAnJykKLSAgICAgICAgc2VsZi5jaGVja1RlbXBsYXRlRXJyb3IoJyg/UDxhPngpJywgJ1xnPC0xPicsICd4eCcsCisgICAgICAgIHNlbGYuY2hlY2tUZW1wbGF0ZUVycm9yKCcoP1A8YT54KScsIHInXGc8LTE+JywgJ3h4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSAnLTEnIiwgMykKICAgICAgICAgIyBOZXcgdmFsaWQvaW52YWxpZCBpZGVudGlmaWVycyBpbiBQeXRob24gMwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignKD9QPMK1PngpJywgcidcZzzCtT4nLCAneHgnKSwgJ3h4JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyg/UDzwnZSY8J2Uq/CdlKbwnZSg8J2UrPCdlKHwnZSiPngpJywgcidcZzzwnZSY8J2Uq/CdlKbwnZSg8J2UrPCdlKHwnZSiPicsICd4eCcpLCAneHgnKQotICAgICAgICBzZWxmLmNoZWNrVGVtcGxhdGVFcnJvcignKD9QPGE+eCknLCAnXGc8wqk+JywgJ3h4JywKKyAgICAgICAgc2VsZi5jaGVja1RlbXBsYXRlRXJyb3IoJyg/UDxhPngpJywgcidcZzzCqT4nLCAneHgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIGNoYXJhY3RlciBpbiBncm91cCBuYW1lICfCqSciLCAzKQogICAgICAgICAjIFN1cHBvcnQgPiAxMDAgZ3JvdXBzLgogICAgICAgICBwYXQgPSAnfCcuam9pbigneCg/UDxhJWQ+JXgpeScgJSAoaSwgaSkgZm9yIGkgaW4gcmFuZ2UoMSwgMjAwICsgMSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKHBhdCwgJ1xnPDIwMD4nLCAneGM4eXp4Yzh5JyksICdjOHpjOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKHBhdCwgcidcZzwyMDA+JywgJ3hjOHl6eGM4eScpLCAnYzh6YzgnKQogCiAgICAgZGVmIHRlc3RfcmVfc3VibihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWJuKCIoP2kpYisiLCAieCIsICJiYmJiIEJCQkIiKSwgKCd4IHgnLCAyKSkKQEAgLTQxNCwxOSArNDE0LDMzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdiYycpLmdyb3VwcygpLCAoJ2InLCBOb25lLCAnYicsICdjJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdiYycpLmdyb3VwcygiIiksICgnYicsICIiLCAnYicsICdjJykpCiAKLSAgICAgICAgIyBBIHNpbmdsZSBncm91cAotICAgICAgICBtID0gcmUubWF0Y2goJyhhKScsICdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDApLCAnYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgwKSwgJ2EnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMSksICdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDEsIDEpLCAoJ2EnLCAnYScpKQotCiAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoJyg/Oig/UDxhMT5hKXwoP1A8YjI+YikpKD9QPGMzPmMpPycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdhJykuZ3JvdXAoMSwgMiwgMyksICgnYScsIE5vbmUsIE5vbmUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYicpLmdyb3VwKCdhMScsICdiMicsICdjMycpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAnYicsIE5vbmUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYWMnKS5ncm91cCgxLCAnYjInLCAzKSwgKCdhJywgTm9uZSwgJ2MnKSkKIAorICAgIGRlZiB0ZXN0X2dyb3VwKHNlbGYpOgorICAgICAgICBjbGFzcyBJbmRleDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCisgICAgICAgICMgQSBzaW5nbGUgZ3JvdXAKKyAgICAgICAgbSA9IHJlLm1hdGNoKCcoYSkoYiknLCAnYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoKSwgJ2FiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDApLCAnYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMSksICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKEluZGV4KDEpKSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBtLmdyb3VwLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbS5ncm91cCwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbS5ncm91cCwgMTw8MTAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbS5ncm91cCwgSW5kZXgoMTw8MTAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG0uZ3JvdXAsICd4JykKKyAgICAgICAgIyBNdWx0aXBsZSBncm91cHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDIsIDEpLCAoJ2InLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoSW5kZXgoMiksIEluZGV4KDEpKSwgKCdiJywgJ2EnKSkKKwogICAgIGRlZiB0ZXN0X3JlX2Z1bGxtYXRjaChzZWxmKToKICAgICAgICAgIyBJc3N1ZSAxNjIwMzogUHJvcG9zYWw6IGFkZCByZS5mdWxsbWF0Y2goKSBtZXRob2QuCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZnVsbG1hdGNoKHIiYSIsICJhIikuc3BhbigpLCAoMCwgMSkpCkBAIC00NTgsMTkgKzQ3MiwxOSBAQAogICAgICAgICAgICAgcmUuY29tcGlsZShyIi4qPyIpLmZ1bGxtYXRjaCgiYWJjZCIsIHBvcz0xLCBlbmRwb3M9Mykuc3BhbigpLCAoMSwgMykpCiAKICAgICBkZWYgdGVzdF9yZV9ncm91cHJlZl9leGlzdHMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ14oXCgpPyhbXigpXSspKD8oMSlcKSkkJywgJyhhKScpLmdyb3VwcygpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInXihcKCk/KFteKCldKykoPygxKVwpKSQnLCAnKGEpJykuZ3JvdXBzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCcoJywgJ2EnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXihcKCk/KFteKCldKykoPygxKVwpKSQnLCAnYScpLmdyb3VwcygpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInXihcKCk/KFteKCldKykoPygxKVwpKSQnLCAnYScpLmdyb3VwcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAnYScpKQotICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaCgnXihcKCk/KFteKCldKykoPygxKVwpKSQnLCAnYSknKSkKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2goJ14oXCgpPyhbXigpXSspKD8oMSlcKSkkJywgJyhhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHInXihcKCk/KFteKCldKykoPygxKVwpKSQnLCAnYSknKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gocideKFwoKT8oW14oKV0rKSg/KDEpXCkpJCcsICcoYScpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKD86KGEpfGMpKCg/KDEpYnxkKSkkJywgJ2FiJykuZ3JvdXBzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhJywgJ2InKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXig/OihhKXxjKSgoPygxKWJ8ZCkpJCcsICdjZCcpLmdyb3VwcygpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInXig/OihhKXxjKSgoPygxKWJ8ZCkpJCcsICdjZCcpLmdyb3VwcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAnZCcpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKD86KGEpfGMpKCg/KDEpfGQpKSQnLCAnY2QnKS5ncm91cHMoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJ14oPzooYSl8YykoKD8oMSl8ZCkpJCcsICdjZCcpLmdyb3VwcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAnZCcpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKD86KGEpfGMpKCg/KDEpfGQpKSQnLCAnYScpLmdyb3VwcygpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInXig/OihhKXxjKSgoPygxKXxkKSkkJywgJ2EnKS5ncm91cHMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EnLCAnJykpCiAKICAgICAgICAgIyBUZXN0cyBmb3IgYnVnICMxMTc3ODMxOiBleGVyY2lzZSBncm91cHMgb3RoZXIgdGhhbiB0aGUgZmlyc3QgZ3JvdXAKQEAgLTQ5NSw3ICs1MDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0d28gYnJhbmNoZXMnLCAxMCkKIAogICAgIGRlZiB0ZXN0X3JlX2dyb3VwcmVmX292ZXJmbG93KHNlbGYpOgotICAgICAgICBzZWxmLmNoZWNrVGVtcGxhdGVFcnJvcignKCknLCAnXGc8JXM+JyAlIHNyZV9jb25zdGFudHMuTUFYR1JPVVBTLCAneHgnLAorICAgICAgICBzZWxmLmNoZWNrVGVtcGxhdGVFcnJvcignKCknLCByJ1xnPCVzPicgJSBzcmVfY29uc3RhbnRzLk1BWEdST1VQUywgJ3h4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgZ3JvdXAgcmVmZXJlbmNlJywgMykKICAgICAgICAgc2VsZi5jaGVja1BhdHRlcm5FcnJvcihyJyg/UDxhPikoPyglZCkpJyAlIHNyZV9jb25zdGFudHMuTUFYR1JPVVBTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnZhbGlkIGdyb3VwIHJlZmVyZW5jZScsIDEwKQpAQCAtNTMwLDM3ICs1NDQsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAiICIpCiAKICAgICBkZWYgdGVzdF9yZXBlYXRfbWlubWF4KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaCgiXihcdyl7MX0kIiwgImFiYyIpKQotICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaCgiXihcdyl7MX0/JCIsICJhYmMiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2goIl4oXHcpezEsMn0kIiwgImFiYyIpKQotICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaCgiXihcdyl7MSwyfT8kIiwgImFiYyIpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyIl4oXHcpezF9JCIsICJhYmMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gociJeKFx3KXsxfT8kIiwgImFiYyIpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyIl4oXHcpezEsMn0kIiwgImFiYyIpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyIl4oXHcpezEsMn0/JCIsICJhYmMiKSkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXszfSQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXihcdyl7MSwzfSQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXihcdyl7MSw0fSQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXihcdyl7Myw0fT8kIiwgImFiYyIpLmdyb3VwKDEpLCAiYyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl4oXHcpezN9PyQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXihcdyl7MSwzfT8kIiwgImFiYyIpLmdyb3VwKDEpLCAiYyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl4oXHcpezEsNH0/JCIsICJhYmMiKS5ncm91cCgxKSwgImMiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXszLDR9PyQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIl4oXHcpezN9JCIsICJhYmMiKS5ncm91cCgxKSwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiXihcdyl7MSwzfSQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIl4oXHcpezEsNH0kIiwgImFiYyIpLmdyb3VwKDEpLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociJeKFx3KXszLDR9PyQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIl4oXHcpezN9PyQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIl4oXHcpezEsM30/JCIsICJhYmMiKS5ncm91cCgxKSwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiXihcdyl7MSw0fT8kIiwgImFiYyIpLmdyb3VwKDEpLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociJeKFx3KXszLDR9PyQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKIAotICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaCgiXnh7MX0kIiwgInh4eCIpKQotICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaCgiXnh7MX0/JCIsICJ4eHgiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2goIl54ezEsMn0kIiwgInh4eCIpKQotICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaCgiXnh7MSwyfT8kIiwgInh4eCIpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyIl54ezF9JCIsICJ4eHgiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gociJeeHsxfT8kIiwgInh4eCIpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyIl54ezEsMn0kIiwgInh4eCIpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyIl54ezEsMn0/JCIsICJ4eHgiKSkKIAotICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goIl54ezN9JCIsICJ4eHgiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKCJeeHsxLDN9JCIsICJ4eHgiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKCJeeHszLDN9JCIsICJ4eHgiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKCJeeHsxLDR9JCIsICJ4eHgiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKCJeeHszLDR9PyQiLCAieHh4IikpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgiXnh7M30/JCIsICJ4eHgiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKCJeeHsxLDN9PyQiLCAieHh4IikpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgiXnh7MSw0fT8kIiwgInh4eCIpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goIl54ezMsNH0/JCIsICJ4eHgiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHIiXnh7M30kIiwgInh4eCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gociJeeHsxLDN9JCIsICJ4eHgiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHIiXnh7MywzfSQiLCAieHh4IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyIl54ezEsNH0kIiwgInh4eCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gociJeeHszLDR9PyQiLCAieHh4IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyIl54ezN9PyQiLCAieHh4IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyIl54ezEsM30/JCIsICJ4eHgiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHIiXnh7MSw0fT8kIiwgInh4eCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gociJeeHszLDR9PyQiLCAieHh4IikpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2goIl54e30kIiwgInh4eCIpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goIl54e30kIiwgInh7fSIpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyIl54e30kIiwgInh4eCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gociJeeHt9JCIsICJ4e30iKSkKIAogICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKHIneHsyLDF9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWluIHJlcGVhdCBncmVhdGVyIHRoYW4gbWF4IHJlcGVhdCcsIDIpCkBAIC02MzMsMTQgKzY0NywxMCBAQAogICAgICAgICByZS5wdXJnZSgpICAjIGZvciB3YXJuaW5ncwogICAgICAgICBmb3IgYyBpbiAnY2VnaGlqa2xtb3BxeXpDRUZHSElKS0xNTk9QUVJUVlhZJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGMpOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZ1bGxtYXRjaCgnXFwlYycgJSBjLCBjKS5ncm91cCgpLCBjKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaCgnXFwlYycgJSBjLCAnYScpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnXFwlYycgJSBjKQogICAgICAgICBmb3IgYyBpbiAnY2VnaGlqa2xtb3BxeXpBQkNFRkdISUpLTE1OT1BRUlRWWFlaJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGMpOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZ1bGxtYXRjaCgnW1xcJWNdJyAlIGMsIGMpLmdyb3VwKCksIGMpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKCdbXFwlY10nICUgYywgJ2EnKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJ1tcXCVjXScgJSBjKQogCiAgICAgZGVmIHRlc3Rfc3RyaW5nX2JvdW5kYXJpZXMoc2VsZik6CiAgICAgICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMDcxMwpAQCAtNjg3LDEwICs2OTcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAiYVxuXG5iIikKIAogICAgIGRlZiB0ZXN0X2xvb2thaGVhZChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiKGEoPz1cc1teYV0pKSIsICJhIGIiKS5ncm91cCgxKSwgImEiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoYSg/PVxzW15hXSopKSIsICJhIGIiKS5ncm91cCgxKSwgImEiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoYSg/PVxzW2FiY10pKSIsICJhIGIiKS5ncm91cCgxKSwgImEiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoYSg/PVxzW2FiY10qKSkiLCAiYSBiYyIpLmdyb3VwKDEpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYSg/PVxzW15hXSkpIiwgImEgYiIpLmdyb3VwKDEpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYSg/PVxzW15hXSopKSIsICJhIGIiKS5ncm91cCgxKSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiKGEoPz1cc1thYmNdKSkiLCAiYSBiIikuZ3JvdXAoMSksICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIihhKD89XHNbYWJjXSopKSIsICJhIGJjIikuZ3JvdXAoMSksICJhIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIihhKSg/PVxzXDEpIiwgImEgYSIpLmdyb3VwKDEpLCAiYSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYSkoPz1cc1wxKikiLCAiYSBhYSIpLmdyb3VwKDEpLCAiYSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYSkoPz1ccyhhYmN8YSkpIiwgImEgYSIpLmdyb3VwKDEpLCAiYSIpCkBAIC04MzgsMTIgKzg0OCwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKGIiYWJjIiwgYiJBQkMiLCByZS5JfHJlLkwpLmdyb3VwKDApLCBiIkFCQyIpCiAKICAgICBkZWYgdGVzdF9ub3RfbGl0ZXJhbChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2goIlxzKFteYV0pIiwgIiBiIikuZ3JvdXAoMSksICJiIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2goIlxzKFteYV0qKSIsICIgYmIiKS5ncm91cCgxKSwgImJiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJccyhbXmFdKSIsICIgYiIpLmdyb3VwKDEpLCAiYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXHMoW15hXSopIiwgIiBiYiIpLmdyb3VwKDEpLCAiYmIiKQogCiAgICAgZGVmIHRlc3Rfc2VhcmNoX2NvdmVyYWdlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaCgiXHMoYikiLCAiIGIiKS5ncm91cCgxKSwgImIiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaCgiYVxzIiwgImEgIikuZ3JvdXAoMCksICJhICIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXHMoYikiLCAiIGIiKS5ncm91cCgxKSwgImIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyImFccyIsICJhICIpLmdyb3VwKDApLCAiYSAiKQogCiAgICAgZGVmIGFzc2VydE1hdGNoKHNlbGYsIHBhdHRlcm4sIHRleHQsIG1hdGNoPU5vbmUsIHNwYW49Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcj1yZS5tYXRjaCk6CkBAIC05OTMsMTAgKzEwMDMsOCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKChyIlx4JTAyeCIgJSBpKS5lbmNvZGUoKSwgYnl0ZXMoW2ldKSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goKHIiXHglMDJ4MCIgJSBpKS5lbmNvZGUoKSwgYnl0ZXMoW2ldKStiIjAiKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgociJceCUwMnh6IiAlIGkpLmVuY29kZSgpLCBieXRlcyhbaV0pK2IieiIpKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChiciJcdTEyMzQiLCBiJ3UxMjM0JykpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKGJyIlxVMDAwMTIzNDUiLCBiJ1UwMDAxMjM0NScpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgYnIiXHUxMjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsIGJyIlxVMDAwMTIzNDUiKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goYnIiXDAiLCBiIlwwMDAiKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKGJyIlwwOCIsIGIiXDAwMDgiKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKGJyIlwwMSIsIGIiXDAwMSIpKQpAQCAtMTAxOCwxMCArMTAyNiw4IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goKHIiW1x4JTAyeF0iICUgaSkuZW5jb2RlKCksIGJ5dGVzKFtpXSkpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKChyIltceCUwMngwXSIgJSBpKS5lbmNvZGUoKSwgYnl0ZXMoW2ldKSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goKHIiW1x4JTAyeHpdIiAlIGkpLmVuY29kZSgpLCBieXRlcyhbaV0pKSkKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goYnIiW1x1MTIzNF0iLCBiJ3UnKSkKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goYnIiW1xVMDAwMTIzNDVdIiwgYidVJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCBiciJbXHUxMjM0XSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCBiciJbXFUwMDAxMjM0NV0iKQogICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKGJyIltcNTY3XSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidvY3RhbCBlc2NhcGUgdmFsdWUgXDU2NyBvdXRzaWRlIG9mICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ3JhbmdlIDAtMG8zNzcnLCAxKQpAQCAtMTA0OSw4ICsxMDU1LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gocicoYSk/YScsJ2EnKS5sYXN0aW5kZXgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoYSkoYik/YicsJ2FiJykubGFzdGluZGV4LCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInKD9QPGE+YSkoP1A8Yj5iKT9iJywnYWInKS5sYXN0Z3JvdXAsICdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiKD9QPGE+YShiKSkiLCAiYWIiKS5sYXN0Z3JvdXAsICdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiKChhKSkiLCAiYSIpLmxhc3RpbmRleCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIig/UDxhPmEoYikpIiwgImFiIikubGFzdGdyb3VwLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoKGEpKSIsICJhIikubGFzdGluZGV4LCAxKQogCiAgICAgZGVmIHRlc3RfYnVnXzQxODYyNihzZWxmKToKICAgICAgICAgIyBidWdzIDQxODYyNiBhdCBhbC4gLS0gVGVzdGluZyBHcmVnIENoYXBtYW4ncyBhZGRpdGlvbiBvZiBvcCBjb2RlCkBAIC0xMjIyLDcgKzEyMjgsNyBAQAogICAgICAgICAgICAgJ1x1ZmYxMCcsICMgJ1xOe0ZVTExXSURUSCBESUdJVCBaRVJPfScsIGNhdGVnb3J5ICdOZCcKICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gZGVjaW1hbF9kaWdpdHM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeXGQkJywgeCkuZ3JvdXAoMCksIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInXlxkJCcsIHgpLmdyb3VwKDApLCB4KQogCiAgICAgICAgIG5vdF9kZWNpbWFsX2RpZ2l0cyA9IFsKICAgICAgICAgICAgICdcdTIxNjUnLCAjICdcTntST01BTiBOVU1FUkFMIFNJWH0nLCBjYXRlZ29yeSAnTmwnCkBAIC0xMjMxLDcgKzEyMzcsNyBAQAogICAgICAgICAgICAgJ1x1MzJiNCcsICMgJ1xOe0NJUkNMRUQgTlVNQkVSIFRISVJUWSBOSU5FfScsIGNhdGVnb3J5ICdObycKICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gbm90X2RlY2ltYWxfZGlnaXRzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2goJ15cZCQnLCB4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHInXlxkJCcsIHgpKQogCiAgICAgZGVmIHRlc3RfZW1wdHlfYXJyYXkoc2VsZik6CiAgICAgICAgICMgU0YgYnVmIDE2NDc1NDEKQEAgLTEzMDAsMjkgKzEzMDYsMjkgQEAKICAgICAgICAgZm9yIGZsYWdzIGluICgwLCByZS5VTklDT0RFKToKICAgICAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoJ1x4YzAnLCBmbGFncyB8IHJlLklHTk9SRUNBU0UpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocGF0Lm1hdGNoKCdceGUwJykpCi0gICAgICAgICAgICBwYXQgPSByZS5jb21waWxlKCdcdycsIGZsYWdzKQorICAgICAgICAgICAgcGF0ID0gcmUuY29tcGlsZShyJ1x3JywgZmxhZ3MpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocGF0Lm1hdGNoKCdceGUwJykpCiAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoJ1x4YzAnLCByZS5BU0NJSSB8IHJlLklHTk9SRUNBU0UpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHBhdC5tYXRjaCgnXHhlMCcpKQogICAgICAgICBwYXQgPSByZS5jb21waWxlKCcoP2EpXHhjMCcsIHJlLklHTk9SRUNBU0UpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHBhdC5tYXRjaCgnXHhlMCcpKQotICAgICAgICBwYXQgPSByZS5jb21waWxlKCdcdycsIHJlLkFTQ0lJKQorICAgICAgICBwYXQgPSByZS5jb21waWxlKHInXHcnLCByZS5BU0NJSSkKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocGF0Lm1hdGNoKCdceGUwJykpCi0gICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoJyg/YSlcdycpCisgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUocicoP2EpXHcnKQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwYXQubWF0Y2goJ1x4ZTAnKSkKICAgICAgICAgIyBCeXRlcyBwYXR0ZXJucwogICAgICAgICBmb3IgZmxhZ3MgaW4gKDAsIHJlLkFTQ0lJKToKICAgICAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoYidceGMwJywgZmxhZ3MgfCByZS5JR05PUkVDQVNFKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocGF0Lm1hdGNoKGInXHhlMCcpKQotICAgICAgICAgICAgcGF0ID0gcmUuY29tcGlsZShiJ1x3JywgZmxhZ3MpCisgICAgICAgICAgICBwYXQgPSByZS5jb21waWxlKGJyJ1x3JywgZmxhZ3MpCiAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwYXQubWF0Y2goYidceGUwJykpCiAgICAgICAgICMgSW5jb21wYXRpYmlsaXRpZXMKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgYidcdycsIHJlLlVOSUNPREUpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLmNvbXBpbGUsIGInKD91KVx3JykKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgJ1x3JywgcmUuVU5JQ09ERSB8IHJlLkFTQ0lJKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCAnKD91KVx3JywgcmUuQVNDSUkpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLmNvbXBpbGUsICcoP2EpXHcnLCByZS5VTklDT0RFKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCAnKD9hdSlcdycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLmNvbXBpbGUsIGJyJ1x3JywgcmUuVU5JQ09ERSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgYnInKD91KVx3JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgcidcdycsIHJlLlVOSUNPREUgfCByZS5BU0NJSSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgcicoP3UpXHcnLCByZS5BU0NJSSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgcicoP2EpXHcnLCByZS5VTklDT0RFKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCByJyg/YXUpXHcnKQogCiAgICAgZGVmIHRlc3RfbG9jYWxlX2ZsYWcoc2VsZik6CiAgICAgICAgIGltcG9ydCBsb2NhbGUKQEAgLTEzNTMsMjcgKzEzNTksMjcgQEAKICAgICAgICAgcGF0ID0gcmUuY29tcGlsZShicGF0LCByZS5JR05PUkVDQVNFKQogICAgICAgICBpZiBibGV0dGVyOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocGF0Lm1hdGNoKGJsZXR0ZXIpKQotICAgICAgICBwYXQgPSByZS5jb21waWxlKGInXHcnLCByZS5MT0NBTEUpCisgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoYnInXHcnLCByZS5MT0NBTEUpCiAgICAgICAgIGlmIGJsZXR0ZXI6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocGF0Lm1hdGNoKGJsZXR0ZXIpKQotICAgICAgICBwYXQgPSByZS5jb21waWxlKGInKD9MKVx3JykKKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZShicicoP0wpXHcnKQogICAgICAgICBpZiBibGV0dGVyOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhdC5tYXRjaChibGV0dGVyKSkKLSAgICAgICAgcGF0ID0gcmUuY29tcGlsZShiJ1x3JykKKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZShicidcdycpCiAgICAgICAgIGlmIGJsZXR0ZXI6CiAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwYXQubWF0Y2goYmxldHRlcikpCiAgICAgICAgICMgSW5jb21wYXRpYmlsaXRpZXMKLSAgICAgICAgc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcsIHJlLmNvbXBpbGUsICcnLCByZS5MT0NBTEUpCi0gICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCByZS5jb21waWxlLCAnKD9MKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCByZS5jb21waWxlLCBiJycsIHJlLkxPQ0FMRSB8IHJlLkFTQ0lJKQotICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgcmUuY29tcGlsZSwgYicoP0wpJywgcmUuQVNDSUkpCi0gICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCByZS5jb21waWxlLCBiJyg/YSknLCByZS5MT0NBTEUpCi0gICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCByZS5jb21waWxlLCBiJyg/YUwpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgJycsIHJlLkxPQ0FMRSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgJyg/TCknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCBiJycsIHJlLkxPQ0FMRSB8IHJlLkFTQ0lJKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCBiJyg/TCknLCByZS5BU0NJSSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgYicoP2EpJywgcmUuTE9DQUxFKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCBiJyg/YUwpJykKIAogICAgIGRlZiB0ZXN0X2J1Z182NTA5KHNlbGYpOgogICAgICAgICAjIFJlcGxhY2VtZW50IHN0cmluZ3Mgb2YgYm90aCB0eXBlcyBtdXN0IHBhcnNlIHByb3Blcmx5LgogICAgICAgICAjIGFsbCBzdHJpbmdzCi0gICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoJ2EoXHcpJykKKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZShyJ2EoXHcpJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXQuc3ViKCdiXFwxJywgJ2FjJyksICdiYycpCiAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoJ2EoLiknKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5zdWIoJ2JcXDEnLCAnYVx1MTIzNCcpLCAnYlx1MTIzNCcpCkBAIC0xMzgxLDcgKzEzODcsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5zdWIobGFtYmRhIG06ICdzdHInLCAnYTUnKSwgJ3N0cicpCiAKICAgICAgICAgIyBhbGwgYnl0ZXMKLSAgICAgICAgcGF0ID0gcmUuY29tcGlsZShiJ2EoXHcpJykKKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZShicidhKFx3KScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0LnN1YihiJ2JcXDEnLCBiJ2FjJyksIGInYmMnKQogICAgICAgICBwYXQgPSByZS5jb21waWxlKGInYSguKScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0LnN1YihiJ2JcXDEnLCBiJ2FceENEJyksIGInYlx4Q0QnKQpAQCAtMTQxOSwxMyArMTQyNSw2IEBACiAgICAgICAgICMgVGVzdCBiZWhhdmlvdXIgd2hlbiBub3QgZ2l2ZW4gYSBzdHJpbmcgb3IgcGF0dGVybiBhcyBwYXJhbWV0ZXIKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZS5jb21waWxlLCAwKQogCi0gICAgZGVmIHRlc3RfYnVnXzEzODk5KHNlbGYpOgotICAgICAgICAjIElzc3VlICMxMzg5OTogcmUgcGF0dGVybiByIltcQV0iIHNob3VsZCB3b3JrIGxpa2UgIkEiIGJ1dCBtYXRjaGVzCi0gICAgICAgICMgbm90aGluZy4gRGl0dG8gQiBhbmQgWi4KLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZpbmRhbGwocidbXEFcQlxiXENcWl0nLCAnQUJcYkNaJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnQScsICdCJywgJ1xiJywgJ0MnLCAnWiddKQotCiAgICAgQGJpZ21lbXRlc3Qoc2l6ZT1fMkcsIG1lbXVzZT0xKQogICAgIGRlZiB0ZXN0X2xhcmdlX3NlYXJjaChzZWxmLCBzaXplKToKICAgICAgICAgIyBJc3N1ZSAjMTAxODI6IGluZGljZXMgd2VyZSAzMi1iaXQtdHJ1bmNhdGVkLgpAQCAtMTUxMCw3ICsxNTA5LDcgQEAKICAgICAgICAgZm9yIHN0cmluZyBpbiAoYidbYWJyYWNhZGFicmFdJywgQihiJ1thYnJhY2FkYWJyYV0nKSwKICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZWFycmF5KGInW2FicmFjYWRhYnJhXScpLAogICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnl2aWV3KGInW2FicmFjYWRhYnJhXScpKToKLSAgICAgICAgICAgIG0gPSByZS5zZWFyY2gocmInKC4rKSguKj8pXDEnLCBzdHJpbmcpCisgICAgICAgICAgICBtID0gcmUuc2VhcmNoKGJyJyguKykoLio/KVwxJywgc3RyaW5nKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKG0pLCAiPCVzLiVzIG9iamVjdDsgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Bhbj0oMSwgMTIpLCBtYXRjaD1iJ2FicmFjYWRhYnJhJz4iICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUobSkuX19tb2R1bGVfXywgdHlwZShtKS5fX3F1YWxuYW1lX18pKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZWFkbGluZS5weSBiL0xpYi90ZXN0L3Rlc3RfcmVhZGxpbmUucHkKaW5kZXggMmM3M2RmMi4uMDZhOTE0OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZWFkbGluZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JlYWRsaW5lLnB5CkBAIC0xMjEsNiArMTIxLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVSTT0neHRlcm0tMjU2Y29sb3InKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwgYicnKQogCisgICAgYXV0b19oaXN0b3J5X3NjcmlwdCA9ICIiIlwKK2ltcG9ydCByZWFkbGluZQorcmVhZGxpbmUuc2V0X2F1dG9faGlzdG9yeSh7fSkKK2lucHV0KCkKK3ByaW50KCJIaXN0b3J5IGxlbmd0aDoiLCByZWFkbGluZS5nZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aCgpKQorIiIiCisKKyAgICBkZWYgdGVzdF9hdXRvX2hpc3RvcnlfZW5hYmxlZChzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gcnVuX3B0eShzZWxmLmF1dG9faGlzdG9yeV9zY3JpcHQuZm9ybWF0KFRydWUpKQorICAgICAgICBzZWxmLmFzc2VydEluKGIiSGlzdG9yeSBsZW5ndGg6IDFcclxuIiwgb3V0cHV0KQorCisgICAgZGVmIHRlc3RfYXV0b19oaXN0b3J5X2Rpc2FibGVkKHNlbGYpOgorICAgICAgICBvdXRwdXQgPSBydW5fcHR5KHNlbGYuYXV0b19oaXN0b3J5X3NjcmlwdC5mb3JtYXQoRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEluKGIiSGlzdG9yeSBsZW5ndGg6IDBcclxuIiwgb3V0cHV0KQorCiAgICAgZGVmIHRlc3Rfbm9uYXNjaWkoc2VsZik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlYWRsaW5lLmFkZF9oaXN0b3J5KCJceEVCXHhFRiIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9yZWdydGVzdC5weQppbmRleCBhMzk4YTRmLi43Yzk1YjY0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JlZ3J0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcmVncnRlc3QucHkKQEAgLTEsMjEgKzEsNDggQEAKICIiIgogVGVzdHMgb2YgcmVncnRlc3QucHkuCisKK05vdGU6IHRlc3RfcmVncnRlc3QgY2Fubm90IGJlIHJ1biB0d2ljZSBpbiBwYXJhbGxlbC4KICIiIgogCi1pbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBjb250ZXh0bGliCiBpbXBvcnQgZmF1bHRoYW5kbGVyCi1pbXBvcnQgZ2V0b3B0CitpbXBvcnQgaW8KIGltcG9ydCBvcy5wYXRoCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzeXNjb25maWcKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgcmVncnRlc3QsIHN1cHBvcnQKK2Zyb20gdGVzdCBpbXBvcnQgbGlicmVncnRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisKK1B5X0RFQlVHID0gaGFzYXR0cihzeXMsICdnZXRvYmplY3RzJykKK1JPT1RfRElSID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICcuLicsICcuLicpCitST09UX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKFJPT1RfRElSKSkKKworVEVTVF9JTlRFUlJVUFRFRCA9IHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICBmcm9tIHNpZ25hbCBpbXBvcnQgU0lHSU5UCisgICAgdHJ5OgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcmFpc2Vfc2lnbmFsCisgICAgICAgIHJhaXNlX3NpZ25hbChTSUdJTlQpCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgb3Mua2lsbChvcy5nZXRwaWQoKSwgU0lHSU5UKQorICAgICIiIikKKwogCiBjbGFzcyBQYXJzZUFyZ3NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgICAiIiJUZXN0IHJlZ3J0ZXN0J3MgYXJndW1lbnQgcGFyc2luZy4iIiIKKyAgICAiIiIKKyAgICBUZXN0IHJlZ3J0ZXN0J3MgYXJndW1lbnQgcGFyc2luZywgZnVuY3Rpb24gX3BhcnNlX2FyZ3MoKS4KKyAgICAiIiIKIAogICAgIGRlZiBjaGVja0Vycm9yKHNlbGYsIGFyZ3MsIG1zZyk6CiAgICAgICAgIHdpdGggc3VwcG9ydC5jYXB0dXJlZF9zdGRlcnIoKSBhcyBlcnIsIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpOgotICAgICAgICAgICAgcmVncnRlc3QuX3BhcnNlX2FyZ3MoYXJncykKKyAgICAgICAgICAgIGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKGFyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4obXNnLCBlcnIuZ2V0dmFsdWUoKSkKIAogICAgIGRlZiB0ZXN0X2hlbHAoc2VsZik6CkBAIC0yMyw4MiArNTAsODIgQEAKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgogICAgICAgICAgICAgICAgIHdpdGggc3VwcG9ydC5jYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXQsIFwKICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpOgotICAgICAgICAgICAgICAgICAgICByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICAgICAgbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignUnVuIFB5dGhvbiByZWdyZXNzaW9uIHRlc3RzLicsIG91dC5nZXR2YWx1ZSgpKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihmYXVsdGhhbmRsZXIsICdkdW1wX3RyYWNlYmFja19sYXRlcicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIoKSByZXF1aXJlZCIpCiAgICAgZGVmIHRlc3RfdGltZW91dChzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdGltZW91dCcsICc0LjInXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdGltZW91dCcsICc0LjInXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy50aW1lb3V0LCA0LjIpCiAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbJy0tdGltZW91dCddLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS10aW1lb3V0JywgJ2ZvbyddLCAnaW52YWxpZCBmbG9hdCB2YWx1ZScpCiAKICAgICBkZWYgdGVzdF93YWl0KHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS13YWl0J10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXdhaXQnXSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLndhaXQpCiAKICAgICBkZWYgdGVzdF9zbGF2ZWFyZ3Moc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXNsYXZlYXJncycsICdbW10sIHt9XSddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1zbGF2ZWFyZ3MnLCAnW1tdLCB7fV0nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5zbGF2ZWFyZ3MsICdbW10sIHt9XScpCiAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbJy0tc2xhdmVhcmdzJ10sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3Rfc3RhcnQoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1TJywgJy0tc3RhcnQnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZm9vJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZm9vJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5zdGFydCwgJ2ZvbycpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKIAogICAgIGRlZiB0ZXN0X3ZlcmJvc2Uoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctdiddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLXYnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAxKQotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLXZ2diddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLXZ2diddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDMpCi0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXZlcmJvc2UnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdmVyYm9zZSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDEpCi0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXZlcmJvc2UnXSAqIDMpCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXZlcmJvc2UnXSAqIDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMykKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogCiAgICAgZGVmIHRlc3RfdmVyYm9zZTIoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy13JywgJy0tdmVyYm9zZTInOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy52ZXJib3NlMikKIAogICAgIGRlZiB0ZXN0X3ZlcmJvc2UzKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctVycsICctLXZlcmJvc2UzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMudmVyYm9zZTMpCiAKICAgICBkZWYgdGVzdF9xdWlldChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXEnLCAnLS1xdWlldCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnF1aWV0KQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMCkKIAogICAgIGRlZiB0ZXN0X3Nsb3coc2VsZik6Ci0gICAgICAgIGZvciBvcHQgaW4gJy1vJywgJy0tc2xvdyc6CisgICAgICAgIGZvciBvcHQgaW4gJy1vJywgJy0tc2xvd2VzdCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnByaW50X3Nsb3cpCiAKICAgICBkZWYgdGVzdF9oZWFkZXIoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLWhlYWRlciddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1oZWFkZXInXSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmhlYWRlcikKIAogICAgIGRlZiB0ZXN0X3JhbmRvbWl6ZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXInLCAnLS1yYW5kb21pemUnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5yYW5kb21pemUpCiAKICAgICBkZWYgdGVzdF9yYW5kc2VlZChzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcmFuZHNlZWQnLCAnMTIzNDUnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcmFuZHNlZWQnLCAnMTIzNDUnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5yYW5kb21fc2VlZCwgMTIzNDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5yYW5kb21pemUpCiAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbJy0tcmFuZHNlZWQnXSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCkBAIC0xMDcsNyArMTM0LDcgQEAKICAgICBkZWYgdGVzdF9mcm9tZmlsZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLWYnLCAnLS1mcm9tZmlsZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmZyb21maWxlLCAnZm9vJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnZm9vJywgJy1zJ10sICJkb24ndCBnbyB0b2dldGhlciIpCkBAIC0xMTUsNDIgKzE0Miw0MiBAQAogICAgIGRlZiB0ZXN0X2V4Y2x1ZGUoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy14JywgJy0tZXhjbHVkZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmV4Y2x1ZGUpCiAKICAgICBkZWYgdGVzdF9zaW5nbGUoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1zJywgJy0tc2luZ2xlJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuc2luZ2xlKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnLWYnLCAnZm9vJ10sICJkb24ndCBnbyB0b2dldGhlciIpCiAKICAgICBkZWYgdGVzdF9tYXRjaChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLW0nLCAnLS1tYXRjaCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdwYXR0ZXJuJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAncGF0dGVybiddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMubWF0Y2hfdGVzdHMsICdwYXR0ZXJuJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3RfZmFpbGZhc3Qoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1HJywgJy0tZmFpbGZhc3QnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnLXYnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICctdiddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5mYWlsZmFzdCkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICctVyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJy1XJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmZhaWxmYXN0KQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJy1HLy0tZmFpbGZhc3QgbmVlZHMgZWl0aGVyIC12IG9yIC1XJykKIAogICAgIGRlZiB0ZXN0X3VzZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXUnLCAnLS11c2UnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZ3VpLG5ldHdvcmsnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdndWksbmV0d29yayddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudXNlX3Jlc291cmNlcywgWydndWknLCAnbmV0d29yayddKQotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2d1aSxub25lLG5ldHdvcmsnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdndWksbm9uZSxuZXR3b3JrJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy51c2VfcmVzb3VyY2VzLCBbJ25ldHdvcmsnXSkKLSAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxpc3QocmVncnRlc3QuUkVTT1VSQ0VfTkFNRVMpCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsaXN0KGxpYnJlZ3J0ZXN0LlJFU09VUkNFX05BTUVTKQogICAgICAgICAgICAgICAgIGV4cGVjdGVkLnJlbW92ZSgnZ3VpJykKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdhbGwsLWd1aSddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2FsbCwtZ3VpJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy51c2VfcmVzb3VyY2VzLCBleHBlY3RlZCkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnZm9vJ10sICdpbnZhbGlkIHJlc291cmNlJykKQEAgLTE1OCwzMSArMTg1LDMxIEBACiAgICAgZGVmIHRlc3RfbWVtbGltaXQoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1NJywgJy0tbWVtbGltaXQnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnNEcnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc0RyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMubWVtbGltaXQsICc0RycpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKIAogICAgIGRlZiB0ZXN0X3Rlc3RkaXIoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXRlc3RkaXInLCAnZm9vJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXRlc3RkaXInLCAnZm9vJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudGVzdGRpciwgb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsICdmb28nKSkKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS10ZXN0ZGlyJ10sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3RfcnVubGVha3Moc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1MJywgJy0tcnVubGVha3MnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5ydW5sZWFrcykKIAogICAgIGRlZiB0ZXN0X2h1bnRybGVha3Moc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1SJywgJy0taHVudHJsZWFrcyc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc6J10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnOiddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuaHVudHJsZWFrcywgKDUsIDQsICdyZWZsb2cudHh0JykpCi0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnNjonXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc2OiddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuaHVudHJsZWFrcywgKDYsIDQsICdyZWZsb2cudHh0JykpCi0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnOjMnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc6MyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuaHVudHJsZWFrcywgKDUsIDMsICdyZWZsb2cudHh0JykpCi0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnNjozOmxlYWtzLmxvZyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzY6MzpsZWFrcy5sb2cnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmh1bnRybGVha3MsICg2LCAzLCAnbGVha3MubG9nJykpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJzYnXSwKQEAgLTE5MywyNCArMjIwLDIzIEBACiAgICAgZGVmIHRlc3RfbXVsdGlwcm9jZXNzKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctaicsICctLW11bHRpcHJvY2Vzcyc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICcyJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnMiddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudXNlX21wLCAyKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICdmb28nXSwgJ2ludmFsaWQgaW50IHZhbHVlJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJzInLCAnLVQnXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJzInLCAnLWwnXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKLSAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJzInLCAnLU0nLCAnNEcnXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKIAogICAgIGRlZiB0ZXN0X2NvdmVyYWdlKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctVCcsICctLWNvdmVyYWdlJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMudHJhY2UpCiAKICAgICBkZWYgdGVzdF9jb3ZlcmRpcihzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLUQnLCAnLS1jb3ZlcmRpcic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmNvdmVyZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsICdmb28nKSkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQpAQCAtMjE4LDEzICsyNDQsMTMgQEAKICAgICBkZWYgdGVzdF9ub2NvdmVyZGlyKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctTicsICctLW5vY292ZXJkaXInOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKG5zLmNvdmVyZGlyKQogCiAgICAgZGVmIHRlc3RfdGhyZXNob2xkKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctdCcsICctLXRocmVzaG9sZCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICcxMDAwJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnMTAwMCddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudGhyZXNob2xkLCAxMDAwKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICdmb28nXSwgJ2ludmFsaWQgaW50IHZhbHVlJykKQEAgLTIzMiwxMyArMjU4LDE2IEBACiAgICAgZGVmIHRlc3Rfbm93aW5kb3dzKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctbicsICctLW5vd2luZG93cyc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRlcnIoaW8uU3RyaW5nSU8oKSkgYXMgc3RkZXJyOgorICAgICAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5ub3dpbmRvd3MpCisgICAgICAgICAgICAgICAgZXJyID0gc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCd0aGUgLS1ub3dpbmRvd3MgKC1uKSBvcHRpb24gaXMgZGVwcmVjYXRlZCcsIGVycikKIAogICAgIGRlZiB0ZXN0X2ZvcmV2ZXIoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1GJywgJy0tZm9yZXZlcic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmZvcmV2ZXIpCiAKIApAQCAtMjQ2LDMwICsyNzUsNTE5IEBACiAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbJy0teHh4J10sICd1c2FnZTonKQogCiAgICAgZGVmIHRlc3RfbG9uZ19vcHRpb25fX3BhcnRpYWwoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXF1aSddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1xdWknXSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnF1aWV0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDApCiAKICAgICBkZWYgdGVzdF90d29fb3B0aW9ucyhzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpZXQnLCAnLS1leGNsdWRlJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXF1aWV0JywgJy0tZXhjbHVkZSddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucXVpZXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmV4Y2x1ZGUpCiAKICAgICBkZWYgdGVzdF9vcHRpb25fd2l0aF9lbXB0eV9zdHJpbmdfdmFsdWUoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXN0YXJ0JywgJyddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1zdGFydCcsICcnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5zdGFydCwgJycpCiAKICAgICBkZWYgdGVzdF9hcmcoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWydmb28nXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJ2ZvbyddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmFyZ3MsIFsnZm9vJ10pCiAKICAgICBkZWYgdGVzdF9vcHRpb25fYW5kX2FyZyhzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpZXQnLCAnZm9vJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXF1aWV0JywgJ2ZvbyddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucXVpZXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5hcmdzLCBbJ2ZvbyddKQogCiAKK2NsYXNzIEJhc2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgVEVTVF9VTklRVUVfSUQgPSAxCisgICAgVEVTVE5BTUVfUFJFRklYID0gJ3Rlc3RfcmVncnRlc3RfJworICAgIFRFU1ROQU1FX1JFR0VYID0gcid0ZXN0X1thLXpBLVowLTlfXSsnCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGVzdGRpciA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKKworICAgICAgICBzZWxmLnRtcHRlc3RkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm10cmVlLCBzZWxmLnRtcHRlc3RkaXIpCisKKyAgICBkZWYgY3JlYXRlX3Rlc3Qoc2VsZiwgbmFtZT1Ob25lLCBjb2RlPScnKToKKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICBuYW1lID0gJ25vb3AlcycgJSBCYXNlVGVzdENhc2UuVEVTVF9VTklRVUVfSUQKKyAgICAgICAgICAgIEJhc2VUZXN0Q2FzZS5URVNUX1VOSVFVRV9JRCArPSAxCisKKyAgICAgICAgIyB0ZXN0X3JlZ3J0ZXN0IGNhbm5vdCBiZSBydW4gdHdpY2UgaW4gcGFyYWxsZWwgYmVjYXVzZQorICAgICAgICAjIG9mIHNldFVwKCkgYW5kIGNyZWF0ZV90ZXN0KCkKKyAgICAgICAgbmFtZSA9IHNlbGYuVEVTVE5BTUVfUFJFRklYICsgbmFtZQorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYudG1wdGVzdGRpciwgbmFtZSArICcucHknKQorCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgcGF0aCkKKyAgICAgICAgIyBVc2UgJ3gnIG1vZGUgdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90IG92ZXJyaWRlIGV4aXN0aW5nIHRlc3RzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAneCcsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKGNvZGUpCisgICAgICAgIGV4Y2VwdCBQZXJtaXNzaW9uRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgaWYgbm90IHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJjYW5ub3Qgd3JpdGUgJXM6ICVzIiAlIChwYXRoLCBleGMpKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIG5hbWUKKworICAgIGRlZiByZWdleF9zZWFyY2goc2VsZiwgcmVnZXgsIG91dHB1dCk6CisgICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKHJlZ2V4LCBvdXRwdXQsIHJlLk1VTFRJTElORSkKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgc2VsZi5mYWlsKCIlciBub3QgZm91bmQgaW4gJXIiICUgKHJlZ2V4LCBvdXRwdXQpKQorICAgICAgICByZXR1cm4gbWF0Y2gKKworICAgIGRlZiBjaGVja19saW5lKHNlbGYsIG91dHB1dCwgcmVnZXgpOgorICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUocideJyArIHJlZ2V4LCByZS5NVUxUSUxJTkUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgob3V0cHV0LCByZWdleCkKKworICAgIGRlZiBwYXJzZV9leGVjdXRlZF90ZXN0cyhzZWxmLCBvdXRwdXQpOgorICAgICAgICByZWdleCA9IChyJ15bMC05XSs6WzAtOV0rOlswLTldKyBcWyAqWzAtOV0rKD86LyAqWzAtOV0rKT9cXSAoJXMpJworICAgICAgICAgICAgICAgICAlIHNlbGYuVEVTVE5BTUVfUkVHRVgpCisgICAgICAgIHBhcnNlciA9IHJlLmZpbmRpdGVyKHJlZ2V4LCBvdXRwdXQsIHJlLk1VTFRJTElORSkKKyAgICAgICAgcmV0dXJuIGxpc3QobWF0Y2guZ3JvdXAoMSkgZm9yIG1hdGNoIGluIHBhcnNlcikKKworICAgIGRlZiBjaGVja19leGVjdXRlZF90ZXN0cyhzZWxmLCBvdXRwdXQsIHRlc3RzLCBza2lwcGVkPSgpLCBmYWlsZWQ9KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQ9KCksIHJhbmRvbWl6ZT1GYWxzZSwgaW50ZXJydXB0ZWQ9RmFsc2UpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHRlc3RzLCBzdHIpOgorICAgICAgICAgICAgdGVzdHMgPSBbdGVzdHNdCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2tpcHBlZCwgc3RyKToKKyAgICAgICAgICAgIHNraXBwZWQgPSBbc2tpcHBlZF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShmYWlsZWQsIHN0cik6CisgICAgICAgICAgICBmYWlsZWQgPSBbZmFpbGVkXQorICAgICAgICBpZiBpc2luc3RhbmNlKG9taXR0ZWQsIHN0cik6CisgICAgICAgICAgICBvbWl0dGVkID0gW29taXR0ZWRdCisgICAgICAgIG50ZXN0ID0gbGVuKHRlc3RzKQorICAgICAgICBuc2tpcHBlZCA9IGxlbihza2lwcGVkKQorICAgICAgICBuZmFpbGVkID0gbGVuKGZhaWxlZCkKKyAgICAgICAgbm9taXR0ZWQgPSBsZW4ob21pdHRlZCkKKworICAgICAgICBleGVjdXRlZCA9IHNlbGYucGFyc2VfZXhlY3V0ZWRfdGVzdHMob3V0cHV0KQorICAgICAgICBpZiByYW5kb21pemU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChleGVjdXRlZCksIHNldCh0ZXN0cyksIG91dHB1dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhlY3V0ZWQsIHRlc3RzLCBvdXRwdXQpCisKKyAgICAgICAgZGVmIHBsdXJhbChjb3VudCk6CisgICAgICAgICAgICByZXR1cm4gJ3MnIGlmIGNvdW50ICE9IDEgZWxzZSAnJworCisgICAgICAgIGRlZiBsaXN0X3JlZ2V4KGxpbmVfZm9ybWF0LCB0ZXN0cyk6CisgICAgICAgICAgICBjb3VudCA9IGxlbih0ZXN0cykKKyAgICAgICAgICAgIG5hbWVzID0gJyAnLmpvaW4oc29ydGVkKHRlc3RzKSkKKyAgICAgICAgICAgIHJlZ2V4ID0gbGluZV9mb3JtYXQgJSAoY291bnQsIHBsdXJhbChjb3VudCkpCisgICAgICAgICAgICByZWdleCA9IHInJXM6XG4gICAgJXMkJyAlIChyZWdleCwgbmFtZXMpCisgICAgICAgICAgICByZXR1cm4gcmVnZXgKKworICAgICAgICBpZiBza2lwcGVkOgorICAgICAgICAgICAgcmVnZXggPSBsaXN0X3JlZ2V4KCclcyB0ZXN0JXMgc2tpcHBlZCcsIHNraXBwZWQpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZWdleCkKKworICAgICAgICBpZiBmYWlsZWQ6CisgICAgICAgICAgICByZWdleCA9IGxpc3RfcmVnZXgoJyVzIHRlc3QlcyBmYWlsZWQnLCBmYWlsZWQpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZWdleCkKKworICAgICAgICBpZiBvbWl0dGVkOgorICAgICAgICAgICAgcmVnZXggPSBsaXN0X3JlZ2V4KCclcyB0ZXN0JXMgb21pdHRlZCcsIG9taXR0ZWQpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZWdleCkKKworICAgICAgICBnb29kID0gbnRlc3QgLSBuc2tpcHBlZCAtIG5mYWlsZWQgLSBub21pdHRlZAorICAgICAgICBpZiBnb29kOgorICAgICAgICAgICAgcmVnZXggPSByJyVzIHRlc3QlcyBPS1wuJCcgJSAoZ29vZCwgcGx1cmFsKGdvb2QpKQorICAgICAgICAgICAgaWYgbm90IHNraXBwZWQgYW5kIG5vdCBmYWlsZWQgYW5kIGdvb2QgPiAxOgorICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ0FsbCAlcycgJSByZWdleAorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICAgICAgaWYgaW50ZXJydXB0ZWQ6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCAnVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULicpCisKKyAgICAgICAgaWYgbmZhaWxlZDoKKyAgICAgICAgICAgIHJlc3VsdCA9ICdGQUlMVVJFJworICAgICAgICBlbGlmIGludGVycnVwdGVkOgorICAgICAgICAgICAgcmVzdWx0ID0gJ0lOVEVSUlVQVEVEJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gJ1NVQ0NFU1MnCisgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsICdUZXN0cyByZXN1bHQ6ICVzJyAlIHJlc3VsdCkKKworICAgIGRlZiBwYXJzZV9yYW5kb21fc2VlZChzZWxmLCBvdXRwdXQpOgorICAgICAgICBtYXRjaCA9IHNlbGYucmVnZXhfc2VhcmNoKHInVXNpbmcgcmFuZG9tIHNlZWQgKFswLTldKyknLCBvdXRwdXQpCisgICAgICAgIHJhbmRzZWVkID0gaW50KG1hdGNoLmdyb3VwKDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSByYW5kc2VlZCA8PSAxMDAwMDAwMCwgcmFuZHNlZWQpCisgICAgICAgIHJldHVybiByYW5kc2VlZAorCisgICAgZGVmIHJ1bl9jb21tYW5kKHNlbGYsIGFyZ3MsIGlucHV0PU5vbmUsIGV4aXRjb2RlPTAsICoqa3cpOgorICAgICAgICBpZiBub3QgaW5wdXQ6CisgICAgICAgICAgICBpbnB1dCA9ICcnCisgICAgICAgIGlmICdzdGRlcnInIG5vdCBpbiBrdzoKKyAgICAgICAgICAgIGt3WydzdGRlcnInXSA9IHN1YnByb2Nlc3MuUElQRQorICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5ydW4oYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ9aW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprdykKKyAgICAgICAgaWYgcHJvYy5yZXR1cm5jb2RlICE9IGV4aXRjb2RlOgorICAgICAgICAgICAgbXNnID0gKCJDb21tYW5kICVzIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAlc1xuIgorICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAic3Rkb3V0OlxuIgorICAgICAgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAiJXNcbiIKKyAgICAgICAgICAgICAgICAgICAiLS0tXG4iCisgICAgICAgICAgICAgICAgICAgJSAoc3RyKGFyZ3MpLCBwcm9jLnJldHVybmNvZGUsIHByb2Muc3Rkb3V0KSkKKyAgICAgICAgICAgIGlmIHByb2Muc3RkZXJyOgorICAgICAgICAgICAgICAgIG1zZyArPSAoIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0ZGVycjpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgcHJvYy5zdGRlcnIpCisgICAgICAgICAgICBzZWxmLmZhaWwobXNnKQorICAgICAgICByZXR1cm4gcHJvYworCisKKyAgICBkZWYgcnVuX3B5dGhvbihzZWxmLCBhcmdzLCAqKmt3KToKKyAgICAgICAgYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgJy1YJywgJ2ZhdWx0aGFuZGxlcicsICctSScsICphcmdzXQorICAgICAgICBwcm9jID0gc2VsZi5ydW5fY29tbWFuZChhcmdzLCAqKmt3KQorICAgICAgICByZXR1cm4gcHJvYy5zdGRvdXQKKworCitjbGFzcyBQcm9ncmFtc1Rlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdCB2YXJpb3VzIHdheXMgdG8gcnVuIHRoZSBQeXRob24gdGVzdCBzdWl0ZS4gVXNlIG9wdGlvbnMgY2xvc2UKKyAgICB0byBvcHRpb25zIHVzZWQgb24gdGhlIGJ1aWxkYm90LgorICAgICIiIgorCisgICAgTlRFU1QgPSA0CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKCkuc2V0VXAoKQorCisgICAgICAgICMgQ3JlYXRlIE5URVNUIHRlc3RzIGRvaW5nIG5vdGhpbmcKKyAgICAgICAgc2VsZi50ZXN0cyA9IFtzZWxmLmNyZWF0ZV90ZXN0KCkgZm9yIGluZGV4IGluIHJhbmdlKHNlbGYuTlRFU1QpXQorCisgICAgICAgIHNlbGYucHl0aG9uX2FyZ3MgPSBbJy1XZCcsICctRScsICctYmInXQorICAgICAgICBzZWxmLnJlZ3J0ZXN0X2FyZ3MgPSBbJy11YWxsJywgJy1yd1cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tdGVzdGRpcj0lcycgJSBzZWxmLnRtcHRlc3RkaXJdCisgICAgICAgIGlmIGhhc2F0dHIoZmF1bHRoYW5kbGVyLCAnZHVtcF90cmFjZWJhY2tfbGF0ZXInKToKKyAgICAgICAgICAgIHNlbGYucmVncnRlc3RfYXJncy5leHRlbmQoKCctLXRpbWVvdXQnLCAnMzYwMCcsICctajQnKSkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICBzZWxmLnJlZ3J0ZXN0X2FyZ3MuYXBwZW5kKCctbicpCisKKyAgICBkZWYgY2hlY2tfb3V0cHV0KHNlbGYsIG91dHB1dCk6CisgICAgICAgIHNlbGYucGFyc2VfcmFuZG9tX3NlZWQob3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgc2VsZi50ZXN0cywgcmFuZG9taXplPVRydWUpCisKKyAgICBkZWYgcnVuX3Rlc3RzKHNlbGYsIGFyZ3MpOgorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl9weXRob24oYXJncykKKyAgICAgICAgc2VsZi5jaGVja19vdXRwdXQob3V0cHV0KQorCisgICAgZGVmIHRlc3Rfc2NyaXB0X3JlZ3J0ZXN0KHNlbGYpOgorICAgICAgICAjIExpYi90ZXN0L3JlZ3J0ZXN0LnB5CisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkaXIsICdyZWdydGVzdC5weScpCisKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgc2NyaXB0LCAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIGRlZiB0ZXN0X21vZHVsZV90ZXN0KHNlbGYpOgorICAgICAgICAjIC1tIHRlc3QKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1tJywgJ3Rlc3QnLAorICAgICAgICAgICAgICAgICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX3JlZ3J0ZXN0KHNlbGYpOgorICAgICAgICAjIC1tIHRlc3QucmVncnRlc3QKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1tJywgJ3Rlc3QucmVncnRlc3QnLAorICAgICAgICAgICAgICAgICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX2F1dG90ZXN0KHNlbGYpOgorICAgICAgICAjIC1tIHRlc3QuYXV0b3Rlc3QKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1tJywgJ3Rlc3QuYXV0b3Rlc3QnLAorICAgICAgICAgICAgICAgICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX2Zyb21fdGVzdF9hdXRvdGVzdChzZWxmKToKKyAgICAgICAgIyBmcm9tIHRlc3QgaW1wb3J0IGF1dG90ZXN0CisgICAgICAgIGNvZGUgPSAnZnJvbSB0ZXN0IGltcG9ydCBhdXRvdGVzdCcKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1jJywgY29kZSwKKyAgICAgICAgICAgICAgICAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIGRlZiB0ZXN0X3NjcmlwdF9hdXRvdGVzdChzZWxmKToKKyAgICAgICAgIyBMaWIvdGVzdC9hdXRvdGVzdC5weQorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGlyLCAnYXV0b3Rlc3QucHknKQorICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCBzY3JpcHQsICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdydW5fdGVzdHMucHkgc2NyaXB0IGlzIG5vdCBpbnN0YWxsZWQnKQorICAgIGRlZiB0ZXN0X3Rvb2xzX3NjcmlwdF9ydW5fdGVzdHMoc2VsZik6CisgICAgICAgICMgVG9vbHMvc2NyaXB0cy9ydW5fdGVzdHMucHkKKyAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAnVG9vbHMnLCAnc2NyaXB0cycsICdydW5fdGVzdHMucHknKQorICAgICAgICBhcmdzID0gW3NjcmlwdCwgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBkZWYgcnVuX2JhdGNoKHNlbGYsICphcmdzKToKKyAgICAgICAgcHJvYyA9IHNlbGYucnVuX2NvbW1hbmQoYXJncykKKyAgICAgICAgc2VsZi5jaGVja19vdXRwdXQocHJvYy5zdGRvdXQpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuYmF0IHNjcmlwdCBpcyBub3QgaW5zdGFsbGVkJykKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJywgJ1dpbmRvd3Mgb25seScpCisgICAgZGVmIHRlc3RfdG9vbHNfYnVpbGRib3RfdGVzdChzZWxmKToKKyAgICAgICAgIyBUb29sc1xidWlsZGJvdFx0ZXN0LmJhdAorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICdUb29scycsICdidWlsZGJvdCcsICd0ZXN0LmJhdCcpCisgICAgICAgIHRlc3RfYXJncyA9IFsnLS10ZXN0ZGlyPSVzJyAlIHNlbGYudG1wdGVzdGRpcl0KKyAgICAgICAgaWYgcGxhdGZvcm0uYXJjaGl0ZWN0dXJlKClbMF0gPT0gJzY0Yml0JzoKKyAgICAgICAgICAgIHRlc3RfYXJncy5hcHBlbmQoJy14NjQnKSAgICMgNjQtYml0IGJ1aWxkCisgICAgICAgIGlmIG5vdCBQeV9ERUJVRzoKKyAgICAgICAgICAgIHRlc3RfYXJncy5hcHBlbmQoJytkJykgICAgICMgUmVsZWFzZSBidWlsZCwgdXNlIHB5dGhvbi5leGUKKyAgICAgICAgc2VsZi5ydW5fYmF0Y2goc2NyaXB0LCAqdGVzdF9hcmdzLCAqc2VsZi50ZXN0cykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLCAnV2luZG93cyBvbmx5JykKKyAgICBkZWYgdGVzdF9wY2J1aWxkX3J0KHNlbGYpOgorICAgICAgICAjIFBDYnVpbGRccnQuYmF0CisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgcidQQ2J1aWxkXHJ0LmJhdCcpCisgICAgICAgIHJ0X2FyZ3MgPSBbIi1xIl0gICAgICAgICAgICAgIyBRdWljaywgZG9uJ3QgcnVuIHRlc3RzIHR3aWNlCisgICAgICAgIGlmIHBsYXRmb3JtLmFyY2hpdGVjdHVyZSgpWzBdID09ICc2NGJpdCc6CisgICAgICAgICAgICBydF9hcmdzLmFwcGVuZCgnLXg2NCcpICAgIyA2NC1iaXQgYnVpbGQKKyAgICAgICAgaWYgUHlfREVCVUc6CisgICAgICAgICAgICBydF9hcmdzLmFwcGVuZCgnLWQnKSAgICAgIyBEZWJ1ZyBidWlsZCwgdXNlIHB5dGhvbl9kLmV4ZQorICAgICAgICBzZWxmLnJ1bl9iYXRjaChzY3JpcHQsICpydF9hcmdzLCAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0cykKKworCitjbGFzcyBBcmdzVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0IGFyZ3VtZW50cyBvZiB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUuCisgICAgIiIiCisKKyAgICBkZWYgcnVuX3Rlc3RzKHNlbGYsICp0ZXN0YXJncywgKiprdyk6CisgICAgICAgIGNtZGFyZ3MgPSBbJy1tJywgJ3Rlc3QnLCAnLS10ZXN0ZGlyPSVzJyAlIHNlbGYudG1wdGVzdGRpciwgKnRlc3RhcmdzXQorICAgICAgICByZXR1cm4gc2VsZi5ydW5fcHl0aG9uKGNtZGFyZ3MsICoqa3cpCisKKyAgICBkZWYgdGVzdF9mYWlsaW5nX3Rlc3Qoc2VsZik6CisgICAgICAgICMgdGVzdCBhIGZhaWxpbmcgdGVzdAorICAgICAgICBjb2RlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgaW1wb3J0IHVuaXR0ZXN0CisKKyAgICAgICAgICAgIGNsYXNzIEZhaWxpbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgdGVzdF9mYWlsaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImJ1ZyIpCisgICAgICAgICIiIikKKyAgICAgICAgdGVzdF9vayA9IHNlbGYuY3JlYXRlX3Rlc3QoJ29rJykKKyAgICAgICAgdGVzdF9mYWlsaW5nID0gc2VsZi5jcmVhdGVfdGVzdCgnZmFpbGluZycsIGNvZGU9Y29kZSkKKyAgICAgICAgdGVzdHMgPSBbdGVzdF9vaywgdGVzdF9mYWlsaW5nXQorCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCp0ZXN0cywgZXhpdGNvZGU9MSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzLCBmYWlsZWQ9dGVzdF9mYWlsaW5nKQorCisgICAgZGVmIHRlc3RfcmVzb3VyY2VzKHNlbGYpOgorICAgICAgICAjIHRlc3QgLXUgY29tbWFuZCBsaW5lIG9wdGlvbgorICAgICAgICB0ZXN0cyA9IHt9CisgICAgICAgIGZvciByZXNvdXJjZSBpbiAoJ2F1ZGlvJywgJ25ldHdvcmsnKToKKyAgICAgICAgICAgIGNvZGUgPSAnZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0XG5zdXBwb3J0LnJlcXVpcmVzKCVyKScgJSByZXNvdXJjZQorICAgICAgICAgICAgdGVzdHNbcmVzb3VyY2VdID0gc2VsZi5jcmVhdGVfdGVzdChyZXNvdXJjZSwgY29kZSkKKyAgICAgICAgdGVzdF9uYW1lcyA9IHNvcnRlZCh0ZXN0cy52YWx1ZXMoKSkKKworICAgICAgICAjIC11IGFsbDogMiByZXNvdXJjZXMgZW5hYmxlZAorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLXUnLCAnYWxsJywgKnRlc3RfbmFtZXMpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0X25hbWVzKQorCisgICAgICAgICMgLXUgYXVkaW86IDEgcmVzb3VyY2UgZW5hYmxlZAorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLXVhdWRpbycsICp0ZXN0X25hbWVzKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdF9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkPXRlc3RzWyduZXR3b3JrJ10pCisKKyAgICAgICAgIyBubyBvcHRpb246IDAgcmVzb3VyY2VzIGVuYWJsZWQKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoKnRlc3RfbmFtZXMpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0X25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQ9dGVzdF9uYW1lcykKKworICAgIGRlZiB0ZXN0X3JhbmRvbShzZWxmKToKKyAgICAgICAgIyB0ZXN0IC1yIGFuZCAtLXJhbmRzZWVkIGNvbW1hbmQgbGluZSBvcHRpb24KKyAgICAgICAgY29kZSA9IHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgICAgIGltcG9ydCByYW5kb20KKyAgICAgICAgICAgIHByaW50KCJURVNUUkFORE9NOiAlcyIgJSByYW5kb20ucmFuZGludCgxLCAxMDAwKSkKKyAgICAgICAgIiIiKQorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgncmFuZG9tJywgY29kZSkKKworICAgICAgICAjIGZpcnN0IHJ1biB0byBnZXQgdGhlIG91dHB1dCB3aXRoIHRoZSByYW5kb20gc2VlZAorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLXInLCB0ZXN0KQorICAgICAgICByYW5kc2VlZCA9IHNlbGYucGFyc2VfcmFuZG9tX3NlZWQob3V0cHV0KQorICAgICAgICBtYXRjaCA9IHNlbGYucmVnZXhfc2VhcmNoKHInVEVTVFJBTkRPTTogKFswLTldKyknLCBvdXRwdXQpCisgICAgICAgIHRlc3RfcmFuZG9tID0gaW50KG1hdGNoLmdyb3VwKDEpKQorCisgICAgICAgICMgdHJ5IHRvIHJlcHJvZHVjZSB3aXRoIHRoZSByYW5kb20gc2VlZAorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLXInLCAnLS1yYW5kc2VlZD0lcycgJSByYW5kc2VlZCwgdGVzdCkKKyAgICAgICAgcmFuZHNlZWQyID0gc2VsZi5wYXJzZV9yYW5kb21fc2VlZChvdXRwdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZHNlZWQyLCByYW5kc2VlZCkKKworICAgICAgICBtYXRjaCA9IHNlbGYucmVnZXhfc2VhcmNoKHInVEVTVFJBTkRPTTogKFswLTldKyknLCBvdXRwdXQpCisgICAgICAgIHRlc3RfcmFuZG9tMiA9IGludChtYXRjaC5ncm91cCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X3JhbmRvbTIsIHRlc3RfcmFuZG9tKQorCisgICAgZGVmIHRlc3RfZnJvbWZpbGUoc2VsZik6CisgICAgICAgICMgdGVzdCAtLWZyb21maWxlCisgICAgICAgIHRlc3RzID0gW3NlbGYuY3JlYXRlX3Rlc3QoKSBmb3IgaW5kZXggaW4gcmFuZ2UoNSldCisKKyAgICAgICAgIyBXcml0ZSB0aGUgbGlzdCBvZiBmaWxlcyB1c2luZyBhIGZvcm1hdCBzaW1pbGFyIHRvIHJlZ3J0ZXN0IG91dHB1dDoKKyAgICAgICAgIyBbMS8yXSB0ZXN0XzEKKyAgICAgICAgIyBbMi8yXSB0ZXN0XzIKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorCisgICAgICAgICMgdGVzdCBmb3JtYXQgJzA6MDA6MDAgWzIvN10gdGVzdF9vcGNvZGVzIC0tIHRlc3RfZ3JhbW1hciB0b29rIDAgc2VjJworICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3IikgYXMgZnA6CisgICAgICAgICAgICBwcmV2aW91cyA9IE5vbmUKKyAgICAgICAgICAgIGZvciBpbmRleCwgbmFtZSBpbiBlbnVtZXJhdGUodGVzdHMsIDEpOgorICAgICAgICAgICAgICAgIGxpbmUgPSAoIjAwOjAwOiUwMmkgWyVzLyVzXSAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKGluZGV4LCBpbmRleCwgbGVuKHRlc3RzKSwgbmFtZSkpCisgICAgICAgICAgICAgICAgaWYgcHJldmlvdXM6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gIiAtLSAlcyB0b29rIDAgc2VjIiAlIHByZXZpb3VzCisgICAgICAgICAgICAgICAgcHJpbnQobGluZSwgZmlsZT1mcCkKKyAgICAgICAgICAgICAgICBwcmV2aW91cyA9IG5hbWUKKworICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1mcm9tZmlsZScsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdHMpCisKKyAgICAgICAgIyB0ZXN0IGZvcm1hdCAnWzIvN10gdGVzdF9vcGNvZGVzJworICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3IikgYXMgZnA6CisgICAgICAgICAgICBmb3IgaW5kZXgsIG5hbWUgaW4gZW51bWVyYXRlKHRlc3RzLCAxKToKKyAgICAgICAgICAgICAgICBwcmludCgiWyVzLyVzXSAlcyIgJSAoaW5kZXgsIGxlbih0ZXN0cyksIG5hbWUpLCBmaWxlPWZwKQorCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctLWZyb21maWxlJywgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0cykKKworICAgICAgICAjIHRlc3QgZm9ybWF0ICd0ZXN0X29wY29kZXMnCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIGZvciBuYW1lIGluIHRlc3RzOgorICAgICAgICAgICAgICAgIHByaW50KG5hbWUsIGZpbGU9ZnApCisKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy0tZnJvbWZpbGUnLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzKQorCisgICAgZGVmIHRlc3RfaW50ZXJydXB0ZWQoc2VsZik6CisgICAgICAgIGNvZGUgPSBURVNUX0lOVEVSUlVQVEVECisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCdzaWdpbnQnLCBjb2RlPWNvZGUpCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKHRlc3QsIGV4aXRjb2RlPTEpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0LCBvbWl0dGVkPXRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQ9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3Nsb3dlc3Qoc2VsZik6CisgICAgICAgICMgdGVzdCAtLXNsb3dlc3QKKyAgICAgICAgdGVzdHMgPSBbc2VsZi5jcmVhdGVfdGVzdCgpIGZvciBpbmRleCBpbiByYW5nZSgzKV0KKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0tc2xvd2VzdCIsICp0ZXN0cykKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzKQorICAgICAgICByZWdleCA9ICgnMTAgc2xvd2VzdCB0ZXN0czpcbicKKyAgICAgICAgICAgICAgICAgJyg/Oi0gJXM6IC4qXG4peyVzfScKKyAgICAgICAgICAgICAgICAgJSAoc2VsZi5URVNUTkFNRV9SRUdFWCwgbGVuKHRlc3RzKSkpCisgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlZ2V4KQorCisgICAgZGVmIHRlc3Rfc2xvd19pbnRlcnJ1cHRlZChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMjUzNzM6IHRlc3QgLS1zbG93ZXN0IHdpdGggYW4gaW50ZXJydXB0ZWQgdGVzdAorICAgICAgICBjb2RlID0gVEVTVF9JTlRFUlJVUFRFRAorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgic2lnaW50IiwgY29kZT1jb2RlKQorCisgICAgICAgIGZvciBtdWx0aXByb2Nlc3NpbmcgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgIGlmIG11bHRpcHJvY2Vzc2luZzoKKyAgICAgICAgICAgICAgICBhcmdzID0gKCItLXNsb3dlc3QiLCAiLWoyIiwgdGVzdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXJncyA9ICgiLS1zbG93ZXN0IiwgdGVzdCkKKyAgICAgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCphcmdzLCBleGl0Y29kZT0xKQorICAgICAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQ9dGVzdCwgaW50ZXJydXB0ZWQ9VHJ1ZSkKKworICAgICAgICAgICAgcmVnZXggPSAoJzEwIHNsb3dlc3QgdGVzdHM6XG4nKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICBkZWYgdGVzdF9jb3ZlcmFnZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tY292ZXJhZ2UKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoJ2NvdmVyYWdlJykKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0tY292ZXJhZ2UiLCB0ZXN0KQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgW3Rlc3RdKQorICAgICAgICByZWdleCA9IChyJ2xpbmVzICtjb3YlICttb2R1bGUgK1wocGF0aFwpXG4nCisgICAgICAgICAgICAgICAgIHInKD86ICpbMC05XSsgKlswLTldezEsMn0lICpbXiBdKyArXChbXildK1wpKykrJykKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICBkZWYgdGVzdF93YWl0KHNlbGYpOgorICAgICAgICAjIHRlc3QgLS13YWl0CisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCd3YWl0JykKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0td2FpdCIsIHRlc3QsIGlucHV0PSdrZXknKQorICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCAnUHJlc3MgYW55IGtleSB0byBjb250aW51ZScpCisKKyAgICBkZWYgdGVzdF9mb3JldmVyKHNlbGYpOgorICAgICAgICAjIHRlc3QgLS1mb3JldmVyCisgICAgICAgIGNvZGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgICAgICBpbXBvcnQgYnVpbHRpbnMKKyAgICAgICAgICAgIGltcG9ydCB1bml0dGVzdAorCisgICAgICAgICAgICBjbGFzcyBGb3JldmVyVGVzdGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgdGVzdF9ydW4oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICMgU3RvcmUgdGhlIHN0YXRlIGluIHRoZSBidWlsdGlucyBtb2R1bGUsIGJlY2F1c2UgdGhlIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgIyBtb2R1bGUgaXMgcmVsb2FkIGF0IGVhY2ggcnVuCisgICAgICAgICAgICAgICAgICAgIGlmICdSVU4nIGluIGJ1aWx0aW5zLl9fZGljdF9fOgorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbnMuX19kaWN0X19bJ1JVTiddICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJ1aWx0aW5zLl9fZGljdF9fWydSVU4nXSA+PSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZmFpbCBhdCB0aGUgM3JkIHJ1bnMiKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbnMuX19kaWN0X19bJ1JVTiddID0gMQorICAgICAgICAiIiIpCisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCdmb3JldmVyJywgY29kZT1jb2RlKQorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1mb3JldmVyJywgdGVzdCwgZXhpdGNvZGU9MSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIFt0ZXN0XSozLCBmYWlsZWQ9dGVzdCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFB5X0RFQlVHLCAnbmVlZCBhIGRlYnVnIGJ1aWxkJykKKyAgICBkZWYgdGVzdF9odW50cmxlYWtzX2ZkX2xlYWsoc2VsZik6CisgICAgICAgICMgdGVzdCAtLWh1bnRybGVha3MgZm9yIGZpbGUgZGVzY3JpcHRvciBsZWFrCisgICAgICAgIGNvZGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCB1bml0dGVzdAorCisgICAgICAgICAgICAjIElzc3VlICMyNTMwNjogRGlzYWJsZSBwb3B1cHMgYW5kIGxvZ3MgdG8gc3RkZXJyIG9uIGFzc2VydGlvbgorICAgICAgICAgICAgIyBmYWlsdXJlcyBpbiBNU0NSVAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBtc3ZjcnQKKyAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZQorICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgICAgICMgbm8gV2luZG93cywgbyByZWxlYXNlIGJ1aWxkCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgbSBpbiBbbXN2Y3J0LkNSVF9XQVJOLCBtc3ZjcnQuQ1JUX0VSUk9SLCBtc3ZjcnQuQ1JUX0FTU0VSVF06CisgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIDApCisKKyAgICAgICAgICAgIGNsYXNzIEZETGVha1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgICAgIGRlZiB0ZXN0X2xlYWsoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIGZkID0gb3Mub3BlbihfX2ZpbGVfXywgb3MuT19SRE9OTFkpCisgICAgICAgICAgICAgICAgICAgICMgYnVnOiBuZXZlciBjbG9lcyB0aGUgZmlsZSBkZXNjcmlwdG9yCisgICAgICAgICIiIikKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoJ2h1bnRybGVha3MnLCBjb2RlPWNvZGUpCisKKyAgICAgICAgZmlsZW5hbWUgPSAncmVmbG9nLnR4dCcKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy0taHVudHJsZWFrcycsICczOjM6JywgdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdGNvZGU9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgW3Rlc3RdLCBmYWlsZWQ9dGVzdCkKKworICAgICAgICBsaW5lID0gJ2JlZ2lubmluZyA2IHJlcGV0aXRpb25zXG4xMjM0NTZcbi4uLi4uLlxuJworICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZS5lc2NhcGUobGluZSkpCisKKyAgICAgICAgbGluZTIgPSAnJXMgbGVha2VkIFsxLCAxLCAxXSBmaWxlIGRlc2NyaXB0b3JzLCBzdW09M1xuJyAlIHRlc3QKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmUuZXNjYXBlKGxpbmUyKSkKKworICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGZwOgorICAgICAgICAgICAgcmVmbG9nID0gZnAucmVhZCgpCisgICAgICAgICAgICBpZiBoYXNhdHRyKHN5cywgJ2dldGNvdW50cycpOgorICAgICAgICAgICAgICAgICMgVHlwZXMgYXJlIGltbXBvcnRhbCBpZiBDT1VOVF9BTExPQ1MgaXMgZGVmaW5lZAorICAgICAgICAgICAgICAgIHJlZmxvZyA9IHJlZmxvZy5zcGxpdGxpbmVzKFRydWUpWy0xXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWZsb2csIGxpbmUyKQorCisgICAgZGVmIHRlc3RfbGlzdF90ZXN0cyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tbGlzdC10ZXN0cworICAgICAgICB0ZXN0cyA9IFtzZWxmLmNyZWF0ZV90ZXN0KCkgZm9yIGkgaW4gcmFuZ2UoNSldCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctLWxpc3QtdGVzdHMnLCAqdGVzdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LnJzdHJpcCgpLnNwbGl0bGluZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cykKKworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5IGIvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5CmluZGV4IDE1ODJjYWEuLjU4NzI5YTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkKQEAgLTI1Myw2ICsyNTMsMzEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgIT0gYikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPCBiKQogCisgICAgZGVmIHRlc3RfZXhjZXB0aW9uX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGNsYXNzIFNwYW06CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8IE5vbmUsIHIiJzwnIC4qIG9mICdpbnQnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiBOb25lIDwgNDIsIHIiJzwnIC4qIG9mICdOb25lVHlwZScgYW5kICdpbnQnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA+IE5vbmUsIHIiJz4nIC4qIG9mICdpbnQnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiAiZm9vIiA8IE5vbmUsIHIiJzwnIC4qIG9mICdzdHInIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiAiZm9vIiA+PSA2NjYsIHIiJz49JyAuKiBvZiAnc3RyJyBhbmQgJ2ludCciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IDQyIDw9IE5vbmUsIHIiJzw9JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPj0gTm9uZSwgciInPj0nIC4qIG9mICdpbnQnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8IFtdLCByIic8JyAuKiBvZiAnaW50JyBhbmQgJ2xpc3QnIiksCisgICAgICAgICAgICAobGFtYmRhOiAoKSA+IFtdLCByIic+JyAuKiBvZiAndHVwbGUnIGFuZCAnbGlzdCciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IE5vbmUgPj0gTm9uZSwgciInPj0nIC4qIG9mICdOb25lVHlwZScgYW5kICdOb25lVHlwZSciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IFNwYW0oKSA8IDQyLCByIic8JyAuKiBvZiAnU3BhbScgYW5kICdpbnQnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8IFNwYW0oKSwgciInPCcgLiogb2YgJ2ludCcgYW5kICdTcGFtJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogU3BhbSgpIDw9IFNwYW0oKSwgciInPD0nIC4qIG9mICdTcGFtJyBhbmQgJ1NwYW0nIiksCisgICAgICAgIF0KKyAgICAgICAgZm9yIGksIHRlc3QgaW4gZW51bWVyYXRlKHRlc3RzKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHRlc3Q9aSk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgdGVzdFsxXSk6CisgICAgICAgICAgICAgICAgICAgIHRlc3RbMF0oKQorCisKIGNsYXNzIERpY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2RpY3RzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weSBiL0xpYi90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkKaW5kZXggODUzZTc3My4uMGRjMTA4MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JsY29tcGxldGVyLnB5CkBAIC0xLDExICsxLDEyIEBACiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB1bml0dGVzdC5tb2NrCitmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IHBhdGNoCiBpbXBvcnQgYnVpbHRpbnMKIGltcG9ydCBybGNvbXBsZXRlcgogCiBjbGFzcyBDb21wbGV0ZU1lOgogICAgICIiIiBUcml2aWFsIGNsYXNzIHVzZWQgaW4gdGVzdGluZyBybGNvbXBsZXRlci5Db21wbGV0ZXIuICIiIgogICAgIHNwYW0gPSAxCisgICAgX2hhbSA9IDIKIAogCiBjbGFzcyBUZXN0Umxjb21wbGV0ZXIodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNTIsMTggKzUzLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgWydzdHIue30oJy5mb3JtYXQoeCkgZm9yIHggaW4gZGlyKHN0cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeC5zdGFydHN3aXRoKCdzJyldKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygndHVwbGUuZm9vc3BhbWVnZycpLCBbXSkKKyAgICAgICAgZXhwZWN0ZWQgPSBzb3J0ZWQoeydOb25lLiVzJXMnICUgKHgsICcoJyBpZiB4ICE9ICdfX2RvY19fJyBlbHNlICcnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gZGlyKE5vbmUpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ05vbmUuJyksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnTm9uZS5fJyksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnTm9uZS5fXycpLCBleHBlY3RlZCkKIAogICAgICAgICAjIHRlc3Qgd2l0aCBhIGN1c3RvbWl6ZWQgbmFtZXNwYWNlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLnNwJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydDb21wbGV0ZU1lLnNwYW0nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlbWUuZWdnJyksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnQ29tcGxldGVNZS4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUubXJvKCcsICdDb21wbGV0ZU1lLnNwYW0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUuXycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5faGFtJ10pCisgICAgICAgIG1hdGNoZXMgPSBzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUuX18nKQorICAgICAgICBmb3IgeCBpbiBtYXRjaGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguc3RhcnRzd2l0aCgnQ29tcGxldGVNZS5fXycpLCB4KQorICAgICAgICBzZWxmLmFzc2VydEluKCdDb21wbGV0ZU1lLl9fbmFtZV9fJywgbWF0Y2hlcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQ29tcGxldGVNZS5fX25ld19fKCcsIG1hdGNoZXMpCiAKLSAgICAgICAgQ29tcGxldGVNZS5tZSA9IENvbXBsZXRlTWUKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUubWUubWUuc3AnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUubWUubWUuc3BhbSddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnZWdnLnMnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJ2VnZy57fSgnLmZvcm1hdCh4KSBmb3IgeCBpbiBkaXIoc3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB4LnN0YXJ0c3dpdGgoJ3MnKV0pCisgICAgICAgIHdpdGggcGF0Y2gub2JqZWN0KENvbXBsZXRlTWUsICJtZSIsIENvbXBsZXRlTWUsIGNyZWF0ZT1UcnVlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLm1lLm1lLnNwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5tZS5tZS5zcGFtJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnZWdnLnMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydlZ2cue30oJy5mb3JtYXQoeCkgZm9yIHggaW4gZGlyKHN0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHguc3RhcnRzd2l0aCgncycpXSkKIAogICAgIGRlZiB0ZXN0X2V4Y2Vzc2l2ZV9nZXRhdHRyKHNlbGYpOgogICAgICAgICAjIEVuc3VyZSBnZXRhdHRyKCkgaXMgaW52b2tlZCBubyBtb3JlIHRoYW4gb25jZSBwZXIgYXR0cmlidXRlCkBAIC03OCwxNCArOTMsMjcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2YuYicsIDApLCAnZi5iYXInKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuY2FsbHMsIDEpCiAKKyAgICBkZWYgdGVzdF91bmNyZWF0ZWRfYXR0cihzZWxmKToKKyAgICAgICAgIyBBdHRyaWJ1dGVzIGxpa2UgcHJvcGVydGllcyBhbmQgc2xvdHMgc2hvdWxkIGJlIGNvbXBsZXRlZCBldmVuIHdoZW4KKyAgICAgICAgIyB0aGV5IGhhdmVuJ3QgYmVlbiBjcmVhdGVkIG9uIGFuIGluc3RhbmNlCisgICAgICAgIGNsYXNzIEZvbzoKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9ICgiYmFyIiwpCisgICAgICAgIGNvbXBsZXRlciA9IHJsY29tcGxldGVyLkNvbXBsZXRlcihkaWN0KGY9Rm9vKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnZi4nLCAwKSwgJ2YuYmFyJykKKwogICAgIEB1bml0dGVzdC5tb2NrLnBhdGNoKCdybGNvbXBsZXRlci5fcmVhZGxpbmVfYXZhaWxhYmxlJywgRmFsc2UpCiAgICAgZGVmIHRlc3RfY29tcGxldGUoc2VsZik6CiAgICAgICAgIGNvbXBsZXRlciA9IHJsY29tcGxldGVyLkNvbXBsZXRlcigpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCcnLCAwKSwgJ1x0JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2EnLCAwKSwgJ2FuZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhJywgMSksICdhcycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhcycsIDIpLCAnYXNzZXJ0JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2FuJywgMCksICdhbmQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYScsIDApLCAnYW5kICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhJywgMSksICdhcyAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYXMnLCAyKSwgJ2Fzc2VydCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYW4nLCAwKSwgJ2FuZCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgncGEnLCAwKSwgJ3Bhc3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnRmEnLCAwKSwgJ0ZhbHNlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2VsJywgMCksICdlbGlmICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdlbCcsIDEpLCAnZWxzZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCd0cicsIDApLCAndHJ5OicpCiAKICAgICBkZWYgdGVzdF9kdXBsaWNhdGVfZ2xvYmFscyhzZWxmKToKICAgICAgICAgbmFtZXNwYWNlID0gewpAQCAtOTgsOSArMTI2LDEwIEBACiAgICAgICAgIGNvbXBsZXRlciA9IHJsY29tcGxldGVyLkNvbXBsZXRlcihuYW1lc3BhY2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdGYWxzZScsIDApLCAnRmFsc2UnKQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShjb21wbGV0ZXIuY29tcGxldGUoJ0ZhbHNlJywgMSkpICAjIE5vIGR1cGxpY2F0ZXMKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2Fzc2VydCcsIDApLCAnYXNzZXJ0JykKKyAgICAgICAgIyBTcGFjZSBvciBjb2xvbiBhZGRlZCBkdWUgdG8gYmVpbmcgYSByZXNlcnZlZCBrZXl3b3JkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhc3NlcnQnLCAwKSwgJ2Fzc2VydCAnKQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShjb21wbGV0ZXIuY29tcGxldGUoJ2Fzc2VydCcsIDEpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgndHJ5JywgMCksICd0cnknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgndHJ5JywgMCksICd0cnk6JykKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY29tcGxldGVyLmNvbXBsZXRlKCd0cnknLCAxKSkKICAgICAgICAgIyBObyBvcGVuaW5nIGJyYWNrZXQgIigiIGJlY2F1c2Ugd2Ugb3ZlcnJvZGUgdGhlIGJ1aWx0LWluIGNsYXNzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdtZW1vcnl2aWV3JywgMCksICdtZW1vcnl2aWV3JykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkgYi9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5CmluZGV4IGQwMTI2NmYuLjc2ZjRmN2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weQpAQCAtMSw4ICsxLDcgQEAKIGltcG9ydCBpbwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdXJsbGliLnJvYm90cGFyc2VyCi1mcm9tIHVybGxpYi5lcnJvciBpbXBvcnQgVVJMRXJyb3IsIEhUVFBFcnJvcgotZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGh0dHAuc2VydmVyIGltcG9ydCBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyLCBIVFRQU2VydmVyCiB0cnk6CkBAIC0xMiw3ICsxMSw4IEBACiAKIAogY2xhc3MgUm9ib3RUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGV4PU5vbmUsIHBhcnNlcj1Ob25lLCB1cmw9Tm9uZSwgZ29vZD1Ob25lLCBhZ2VudD1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXg9Tm9uZSwgcGFyc2VyPU5vbmUsIHVybD1Ob25lLCBnb29kPU5vbmUsCisgICAgICAgICAgICAgICAgIGFnZW50PU5vbmUsIHJlcXVlc3RfcmF0ZT1Ob25lLCBjcmF3bF9kZWxheT1Ob25lKToKICAgICAgICAgIyB3b3JrYXJvdW5kIHRvIG1ha2UgdW5pdHRlc3QgZGlzY292ZXJ5IHdvcmsgKHNlZSAjMTcwNjYpCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGluZGV4LCBpbnQpOgogICAgICAgICAgICAgcmV0dXJuCkBAIC0yNSw2ICsyNSw4IEBACiAgICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgIHNlbGYuZ29vZCA9IGdvb2QKICAgICAgICAgc2VsZi5hZ2VudCA9IGFnZW50CisgICAgICAgIHNlbGYucmVxdWVzdF9yYXRlID0gcmVxdWVzdF9yYXRlCisgICAgICAgIHNlbGYuY3Jhd2xfZGVsYXkgPSBjcmF3bF9kZWxheQogCiAgICAgZGVmIHJ1blRlc3Qoc2VsZik6CiAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi51cmwsIHR1cGxlKToKQEAgLTM0LDYgKzM2LDE4IEBACiAgICAgICAgICAgICBhZ2VudCA9IHNlbGYuYWdlbnQKICAgICAgICAgaWYgc2VsZi5nb29kOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmNhbl9mZXRjaChhZ2VudCwgdXJsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuY3Jhd2xfZGVsYXkoYWdlbnQpLCBzZWxmLmNyYXdsX2RlbGF5KQorICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGFjdHVhbCB2YWx1ZXMgZm9yIHJlcXVlc3QgcmF0ZQorICAgICAgICAgICAgaWYgc2VsZi5yZXF1ZXN0X3JhdGUgYW5kIHNlbGYucGFyc2VyLnJlcXVlc3RfcmF0ZShhZ2VudCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVxdWVzdF9yYXRlKGFnZW50KS5yZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1ZXN0X3JhdGUucmVxdWVzdHMKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVxdWVzdF9yYXRlKGFnZW50KS5zZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcXVlc3RfcmF0ZS5zZWNvbmRzCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5yZXF1ZXN0X3JhdGUoYWdlbnQpLCBzZWxmLnJlcXVlc3RfcmF0ZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXJzZXIuY2FuX2ZldGNoKGFnZW50LCB1cmwpKQogCkBAIC00MywxNSArNTcsMTcgQEAKIHRlc3RzID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKIAogZGVmIFJvYm90VGVzdChpbmRleCwgcm9ib3RzX3R4dCwgZ29vZF91cmxzLCBiYWRfdXJscywKLSAgICAgICAgICAgICAgYWdlbnQ9InRlc3Rfcm9ib3RwYXJzZXIiKToKKyAgICAgICAgICAgICAgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSwgYWdlbnQ9InRlc3Rfcm9ib3RwYXJzZXIiKToKIAogICAgIGxpbmVzID0gaW8uU3RyaW5nSU8ocm9ib3RzX3R4dCkucmVhZGxpbmVzKCkKICAgICBwYXJzZXIgPSB1cmxsaWIucm9ib3RwYXJzZXIuUm9ib3RGaWxlUGFyc2VyKCkKICAgICBwYXJzZXIucGFyc2UobGluZXMpCiAgICAgZm9yIHVybCBpbiBnb29kX3VybHM6Ci0gICAgICAgIHRlc3RzLmFkZFRlc3QoUm9ib3RUZXN0Q2FzZShpbmRleCwgcGFyc2VyLCB1cmwsIDEsIGFnZW50KSkKKyAgICAgICAgdGVzdHMuYWRkVGVzdChSb2JvdFRlc3RDYXNlKGluZGV4LCBwYXJzZXIsIHVybCwgMSwgYWdlbnQsCisgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkpCiAgICAgZm9yIHVybCBpbiBiYWRfdXJsczoKLSAgICAgICAgdGVzdHMuYWRkVGVzdChSb2JvdFRlc3RDYXNlKGluZGV4LCBwYXJzZXIsIHVybCwgMCwgYWdlbnQpKQorICAgICAgICB0ZXN0cy5hZGRUZXN0KFJvYm90VGVzdENhc2UoaW5kZXgsIHBhcnNlciwgdXJsLCAwLCBhZ2VudCwKKyAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JhdGUsIGNyYXdsX2RlbGF5KSkKIAogIyBFeGFtcGxlcyBmcm9tIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy93Yy9ub3JvYm90cy5odG1sIChmZXRjaGVkIDIwMDIpCiAKQEAgLTY1LDE0ICs4MSwxOCBAQAogCiBnb29kID0gWycvJywnL3Rlc3QuaHRtbCddCiBiYWQgPSBbJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJywnL3RtcC94eHgnLCcvZm9vLmh0bWwnXQorcmVxdWVzdF9yYXRlID0gTm9uZQorY3Jhd2xfZGVsYXkgPSBOb25lCiAKLVJvYm90VGVzdCgxLCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgxLCBkb2MsIGdvb2QsIGJhZCwgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkKIAogIyAyLgogZG9jID0gIiIiCiAjIHJvYm90cy50eHQgZm9yIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vCiAKIFVzZXItYWdlbnQ6ICoKK0NyYXdsLWRlbGF5OiAxCitSZXF1ZXN0LXJhdGU6IDMvMTUKIERpc2FsbG93OiAvY3liZXJ3b3JsZC9tYXAvICMgVGhpcyBpcyBhbiBpbmZpbml0ZSB2aXJ0dWFsIFVSTCBzcGFjZQogCiAjIEN5YmVybWFwcGVyIGtub3dzIHdoZXJlIHRvIGdvLgpAQCAtODMsOCArMTAzLDEwIEBACiAKIGdvb2QgPSBbJy8nLCcvdGVzdC5odG1sJywoJ2N5YmVybWFwcGVyJywnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnKV0KIGJhZCA9IFsnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnXQorcmVxdWVzdF9yYXRlID0gTm9uZSAgIyBUaGUgcGFyYW1ldGVycyBzaG91bGQgYmUgZXF1YWwgdG8gTm9uZSBzaW5jZSB0aGV5CitjcmF3bF9kZWxheSA9IE5vbmUgICAjIGRvbid0IGFwcGx5IHRvIHRoZSBjeWJlcm1hcHBlciB1c2VyIGFnZW50CiAKLVJvYm90VGVzdCgyLCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgyLCBkb2MsIGdvb2QsIGJhZCwgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkKIAogIyAzLgogZG9jID0gIiIiCkBAIC05NSwxNCArMTE3LDE4IEBACiAKIGdvb2QgPSBbXQogYmFkID0gWycvY3liZXJ3b3JsZC9tYXAvaW5kZXguaHRtbCcsJy8nLCcvdG1wLyddCityZXF1ZXN0X3JhdGUgPSBOb25lCitjcmF3bF9kZWxheSA9IE5vbmUKIAotUm9ib3RUZXN0KDMsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDMsIGRvYywgZ29vZCwgYmFkLCByZXF1ZXN0X3JhdGUsIGNyYXdsX2RlbGF5KQogCiAjIEV4YW1wbGVzIGZyb20gaHR0cDovL3d3dy5yb2JvdHN0eHQub3JnL3djL25vcm9ib3RzLXJmYy5odG1sIChmZXRjaGVkIDIwMDIpCiAKICMgNC4KIGRvYyA9ICIiIgogVXNlci1hZ2VudDogZmlndHJlZQorQ3Jhd2wtZGVsYXk6IDMKK1JlcXVlc3QtcmF0ZTogOS8zMAogRGlzYWxsb3c6IC90bXAKIERpc2FsbG93OiAvYSUzY2QuaHRtbAogRGlzYWxsb3c6IC9hJTJmYi5odG1sCkBAIC0xMTUsOCArMTQxLDE3IEBACiAgICAgICAgJy9+am9lL2luZGV4Lmh0bWwnCiAgICAgICAgXQogCi1Sb2JvdFRlc3QoNCwgZG9jLCBnb29kLCBiYWQsICdmaWd0cmVlJykKLVJvYm90VGVzdCg1LCBkb2MsIGdvb2QsIGJhZCwgJ0ZpZ1RyZWUgUm9ib3QgbGlid3d3LXBlcmwvNS4wNCcpCityZXF1ZXN0X3JhdGUgPSBuYW1lZHR1cGxlKCdyZXFfcmF0ZScsICdyZXF1ZXN0cyBzZWNvbmRzJykKK3JlcXVlc3RfcmF0ZS5yZXF1ZXN0cyA9IDkKK3JlcXVlc3RfcmF0ZS5zZWNvbmRzID0gMzAKK2NyYXdsX2RlbGF5ID0gMworcmVxdWVzdF9yYXRlX2JhZCA9IE5vbmUgICMgbm90IGFjdHVhbGx5IHRlc3RlZCwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcGFyc2UgaXQKK2NyYXdsX2RlbGF5X2JhZCA9IE5vbmUgICMgaW4gb3JkZXIgdG8gYWNjb21tb2RhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMKKworCitSb2JvdFRlc3QoNCwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXksICdmaWd0cmVlJyApCitSb2JvdFRlc3QoNSwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZV9iYWQsIGNyYXdsX2RlbGF5X2JhZCwKKyAgICAgICAgICAnRmlnVHJlZSBSb2JvdCBsaWJ3d3ctcGVybC81LjA0JykKIAogIyA2LgogZG9jID0gIiIiCkBAIC0xMjUsMTQgKzE2MCwxOCBAQAogRGlzYWxsb3c6IC9hJTNDZC5odG1sCiBEaXNhbGxvdzogL2EvYi5odG1sCiBEaXNhbGxvdzogLyU3ZWpvZS9pbmRleC5odG1sCitDcmF3bC1kZWxheTogMworUmVxdWVzdC1yYXRlOiA5L2JhbmFuYQogIiIiCiAKIGdvb2QgPSBbJy90bXAnLF0gIyBYRkFJTDogJy9hJTJmYi5odG1sJwogYmFkID0gWycvdG1wLycsJy90bXAvYS5odG1sJywKICAgICAgICAnL2ElM2NkLmh0bWwnLCcvYSUzQ2QuaHRtbCcsIi9hL2IuaHRtbCIsCiAgICAgICAgJy8lN0Vqb2UvaW5kZXguaHRtbCddCitjcmF3bF9kZWxheSA9IDMKK3JlcXVlc3RfcmF0ZSA9IE5vbmUgICMgc2luY2UgcmVxdWVzdCByYXRlIGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIE5vbmUKIAotUm9ib3RUZXN0KDYsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDYsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lKQogCiAjIEZyb20gYnVnIHJlcG9ydCAjNTIzMDQxCiAKQEAgLTE0MCwxMiArMTc5LDE2IEBACiBkb2MgPSAiIiIKIFVzZXItQWdlbnQ6ICoKIERpc2FsbG93OiAvLgorQ3Jhd2wtZGVsYXk6IHBlYXJzCiAiIiIKIAogZ29vZCA9IFsnL2Zvby5odG1sJ10KLWJhZCA9IFtdICMgQnVnIHJlcG9ydCBzYXlzICIvIiBzaG91bGQgYmUgZGVuaWVkLCBidXQgdGhhdCBpcyBub3QgaW4gdGhlIFJGQworYmFkID0gW10gICMgYnVnIHJlcG9ydCBzYXlzICIvIiBzaG91bGQgYmUgZGVuaWVkLCBidXQgdGhhdCBpcyBub3QgaW4gdGhlIFJGQwogCi1Sb2JvdFRlc3QoNywgZG9jLCBnb29kLCBiYWQpCitjcmF3bF9kZWxheSA9IE5vbmUgICMgc2luY2UgY3Jhd2wgZGVsYXkgaGFzIGludmFsaWQgc3ludGF4LCByZXR1cm4gTm9uZQorcmVxdWVzdF9yYXRlID0gTm9uZQorCitSb2JvdFRlc3QoNywgZG9jLCBnb29kLCBiYWQsIGNyYXdsX2RlbGF5LCByZXF1ZXN0X3JhdGUpCiAKICMgRnJvbSBHb29nbGU6IGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L3dlYm1hc3RlcnMvYmluL2Fuc3dlci5weT9obD1lbiZhbnN3ZXI9NDAzNjQKIApAQCAtMTU0LDEyICsxOTcsMTUgQEAKIFVzZXItYWdlbnQ6IEdvb2dsZWJvdAogQWxsb3c6IC9mb2xkZXIxL215ZmlsZS5odG1sCiBEaXNhbGxvdzogL2ZvbGRlcjEvCitSZXF1ZXN0LXJhdGU6IHdoYWxlL2JhbmFuYQogIiIiCiAKIGdvb2QgPSBbJy9mb2xkZXIxL215ZmlsZS5odG1sJ10KIGJhZCA9IFsnL2ZvbGRlcjEvYW5vdGhlcmZpbGUuaHRtbCddCitjcmF3bF9kZWxheSA9IE5vbmUKK3JlcXVlc3RfcmF0ZSA9IE5vbmUgICMgaW52YWxpZCBzeW50YXgsIHJldHVybiBub25lCiAKLVJvYm90VGVzdCg4LCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdCIpCitSb2JvdFRlc3QoOCwgZG9jLCBnb29kLCBiYWQsIGNyYXdsX2RlbGF5LCByZXF1ZXN0X3JhdGUsIGFnZW50PSJHb29nbGVib3QiKQogCiAjIDkuICBUaGlzIGZpbGUgaXMgaW5jb3JyZWN0IGJlY2F1c2UgIkdvb2dsZWJvdCIgaXMgYSBzdWJzdHJpbmcgb2YKICMgICAgICJHb29nbGVib3QtTW9iaWxlIiwgc28gdGVzdCAxMCB3b3JrcyBqdXN0IGxpa2UgdGVzdCA5LgpAQCAtMTc0LDEyICsyMjAsMTIgQEAKIGdvb2QgPSBbXQogYmFkID0gWycvc29tZXRoaW5nLmpwZyddCiAKLVJvYm90VGVzdCg5LCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdCIpCitSb2JvdFRlc3QoOSwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUsIGFnZW50PSJHb29nbGVib3QiKQogCiBnb29kID0gW10KIGJhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogCi1Sb2JvdFRlc3QoMTAsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCitSb2JvdFRlc3QoMTAsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCiAKICMgMTEuICBHZXQgdGhlIG9yZGVyIGNvcnJlY3QuCiBkb2MgPSAiIiIKQEAgLTE5MywxMiArMjM5LDEyIEBACiBnb29kID0gW10KIGJhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogCi1Sb2JvdFRlc3QoMTEsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90IikKK1JvYm90VGVzdCgxMSwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUsIGFnZW50PSJHb29nbGVib3QiKQogCiBnb29kID0gWycvc29tZXRoaW5nLmpwZyddCiBiYWQgPSBbXQogCi1Sb2JvdFRlc3QoMTIsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCitSb2JvdFRlc3QoMTIsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCiAKIAogIyAxMy4gIEdvb2dsZSBhbHNvIGdvdCB0aGUgb3JkZXIgd3JvbmcgaW4gIzguICBZb3UgbmVlZCB0byBzcGVjaWZ5IHRoZQpAQCAtMjEyLDcgKzI1OCw3IEBACiBnb29kID0gWycvZm9sZGVyMS9teWZpbGUuaHRtbCddCiBiYWQgPSBbJy9mb2xkZXIxL2Fub3RoZXJmaWxlLmh0bWwnXQogCi1Sb2JvdFRlc3QoMTMsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iZ29vZ2xlYm90IikKK1JvYm90VGVzdCgxMywgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUsIGFnZW50PSJnb29nbGVib3QiKQogCiAKICMgMTQuIEZvciBpc3N1ZSAjNjMyNSAocXVlcnkgc3RyaW5nIHN1cHBvcnQpCkBAIC0yMjQsNyArMjcwLDcgQEAKIGdvb2QgPSBbJy9zb21lL3BhdGgnXQogYmFkID0gWycvc29tZS9wYXRoP25hbWU9dmFsdWUnXQogCi1Sb2JvdFRlc3QoMTQsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDE0LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogIyAxNS4gRm9yIGlzc3VlICM0MTA4IChvYmV5IGZpcnN0ICogZW50cnkpCiBkb2MgPSAiIiIKQEAgLTIzOCw3ICsyODQsNyBAQAogZ29vZCA9IFsnL2Fub3RoZXIvcGF0aCddCiBiYWQgPSBbJy9zb21lL3BhdGgnXQogCi1Sb2JvdFRlc3QoMTUsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDE1LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogIyAxNi4gRW1wdHkgcXVlcnkgKGlzc3VlICMxNzQwMykuIE5vcm1hbGl6aW5nIHRoZSB1cmwgZmlyc3QuCiBkb2MgPSAiIiIKQEAgLTI1MCw3ICsyOTYsNyBAQAogZ29vZCA9IFsnL3NvbWUvcGF0aD8nXQogYmFkID0gWycvYW5vdGhlci9wYXRoPyddCiAKLVJvYm90VGVzdCgxNiwgZG9jLCBnb29kLCBiYWQpCitSb2JvdFRlc3QoMTYsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lKQogCiAKIGNsYXNzIFJvYm90SGFuZGxlcihCYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcnVucHkucHkgYi9MaWIvdGVzdC90ZXN0X3J1bnB5LnB5CmluZGV4IGRiNTVkYjcuLjAyYjRkNjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcnVucHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ydW5weS5weQpAQCAtNTc3LDEzICs1NzcsMTQgQEAKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYuX2RlbF9wa2csIHBrZ19kaXIpCiAgICAgICAgIGZvciBkZXB0aCBpbiByYW5nZSgyLCBtYXhfZGVwdGgrMSk6CiAgICAgICAgICAgICBzZWxmLl9hZGRfcmVsYXRpdmVfbW9kdWxlcyhwa2dfZGlyLCAiIiwgZGVwdGgpCi0gICAgICAgIGZvciBmaW5kZXIsIG1vZF9uYW1lLCBpc3BrZyBpbiBwa2d1dGlsLndhbGtfcGFja2FnZXMoW3BrZ19kaXJdKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmaW5kZXIsCisgICAgICAgIGZvciBtb2R1bGVpbmZvIGluIHBrZ3V0aWwud2Fsa19wYWNrYWdlcyhbcGtnX2Rpcl0pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1vZHVsZWluZm8sIHBrZ3V0aWwuTW9kdWxlSW5mbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtb2R1bGVpbmZvLm1vZHVsZV9maW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLm1hY2hpbmVyeS5GaWxlRmluZGVyKQotICAgICAgICAgICAgaWYgaXNwa2c6Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWRfcGFja2FnZXMucmVtb3ZlKG1vZF9uYW1lKQorICAgICAgICAgICAgaWYgbW9kdWxlaW5mby5pc3BrZzoKKyAgICAgICAgICAgICAgICBleHBlY3RlZF9wYWNrYWdlcy5yZW1vdmUobW9kdWxlaW5mby5uYW1lKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBleHBlY3RlZF9tb2R1bGVzLnJlbW92ZShtb2RfbmFtZSkKKyAgICAgICAgICAgICAgICBleHBlY3RlZF9tb2R1bGVzLnJlbW92ZShtb2R1bGVpbmZvLm5hbWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGV4cGVjdGVkX3BhY2thZ2VzKSwgMCwgZXhwZWN0ZWRfcGFja2FnZXMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGV4cGVjdGVkX21vZHVsZXMpLCAwLCBleHBlY3RlZF9tb2R1bGVzKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NjaGVkLnB5IGIvTGliL3Rlc3QvdGVzdF9zY2hlZC5weQppbmRleCBmZThlNzg1Li5mODZmNTk5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NjaGVkLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2NoZWQucHkKQEAgLTIsNyArMiw2IEBACiBpbXBvcnQgc2NoZWQKIGltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogdHJ5OgogICAgIGltcG9ydCB0aHJlYWRpbmcKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2VjcmV0cy5weSBiL0xpYi90ZXN0L3Rlc3Rfc2VjcmV0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzY1Y2YwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zZWNyZXRzLnB5CkBAIC0wLDAgKzEsMTIzIEBACisiIiJUZXN0IHRoZSBzZWNyZXRzIG1vZHVsZS4KKworQXMgbW9zdCBvZiB0aGUgZnVuY3Rpb25zIGluIHNlY3JldHMgYXJlIHRoaW4gd3JhcHBlcnMgYXJvdW5kIGZ1bmN0aW9ucworZGVmaW5lZCBlbHNld2hlcmUsIHdlIGRvbid0IG5lZWQgdG8gdGVzdCB0aGVtIGV4aGF1c3RpdmVseS4KKyIiIgorCisKK2ltcG9ydCBzZWNyZXRzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzdHJpbmcKKworCisjID09PSBVbml0IHRlc3RzID09PQorCitjbGFzcyBDb21wYXJlX0RpZ2VzdF9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBzZWNyZXRzLmNvbXBhcmVfZGlnZXN0IGZ1bmN0aW9uLiIiIgorCisgICAgZGVmIHRlc3RfZXF1YWwoc2VsZik6CisgICAgICAgICMgVGVzdCBjb21wYXJlX2RpZ2VzdCBmdW5jdGlvbmFsaXR5IHdpdGggZXF1YWwgKGJ5dGUvdGV4dCkgc3RyaW5ncy4KKyAgICAgICAgZm9yIHMgaW4gKCJhIiwgImJjZCIsICJ4eXoxMjMiKToKKyAgICAgICAgICAgIGEgPSBzKjEwMAorICAgICAgICAgICAgYiA9IHMqMTAwCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KGEuZW5jb2RlKCd1dGYtOCcpLCBiLmVuY29kZSgndXRmLTgnKSkpCisKKyAgICBkZWYgdGVzdF91bmVxdWFsKHNlbGYpOgorICAgICAgICAjIFRlc3QgY29tcGFyZV9kaWdlc3QgZnVuY3Rpb25hbGl0eSB3aXRoIHVuZXF1YWwgKGJ5dGUvdGV4dCkgc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAiYWJjZCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlY3JldHMuY29tcGFyZV9kaWdlc3QoYiJhYmMiLCBiImFiY2QiKSkKKyAgICAgICAgZm9yIHMgaW4gKCJ4IiwgIm1uIiwgImExYjJjMyIpOgorICAgICAgICAgICAgYSA9IHMqMTAwICsgInEiCisgICAgICAgICAgICBiID0gcyoxMDAgKyAiayIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLmVuY29kZSgndXRmLTgnKSwgYi5lbmNvZGUoJ3V0Zi04JykpKQorCisgICAgZGVmIHRlc3RfYmFkX3R5cGVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBjb21wYXJlX2RpZ2VzdCByYWlzZXMgd2l0aCBtaXhlZCB0eXBlcy4KKyAgICAgICAgYSA9ICdhYmNkZScKKyAgICAgICAgYiA9IGEuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGEsIHN0cikKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYiwgYnl0ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VjcmV0cy5jb21wYXJlX2RpZ2VzdCwgYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWNyZXRzLmNvbXBhcmVfZGlnZXN0LCBiLCBhKQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgY29tcGFyZV9kaWdlc3QgcmV0dXJucyBhIGJvb2wuCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAiYWJjIiksIGJvb2wpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAieHl6IiksIGJvb2wpCisKKworY2xhc3MgUmFuZG9tX1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHdyYXBwZXJzIGFyb3VuZCBTeXN0ZW1SYW5kb20gbWV0aG9kcy4iIiIKKworICAgIGRlZiB0ZXN0X3JhbmRiaXRzKHNlbGYpOgorICAgICAgICAjIFRlc3QgcmFuZGJpdHMuCisgICAgICAgIGVycm1zZyA9ICJyYW5kYml0cyglZCkgcmV0dXJuZWQgJWQiCisgICAgICAgIGZvciBudW1iaXRzIGluICgzLCAxMiwgMzApOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNik6CisgICAgICAgICAgICAgICAgbiA9IHNlY3JldHMucmFuZGJpdHMobnVtYml0cykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSBuIDwgMioqbnVtYml0cywgZXJybXNnICUgKG51bWJpdHMsIG4pKQorCisgICAgZGVmIHRlc3RfY2hvaWNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2hvaWNlLgorICAgICAgICBpdGVtcyA9IFsxLCAyLCA0LCA4LCAxNiwgMzIsIDY0XQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VjcmV0cy5jaG9pY2UoaXRlbXMpIGluIGl0ZW1zKQorCisgICAgZGVmIHRlc3RfcmFuZGJlbG93KHNlbGYpOgorICAgICAgICAjIFRlc3QgcmFuZGJlbG93LgorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCAxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHNlY3JldHMucmFuZGJlbG93KGkpLCByYW5nZShpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VjcmV0cy5yYW5kYmVsb3csIDApCisKKworY2xhc3MgVG9rZW5fVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdG9rZW4gZnVuY3Rpb25zLiIiIgorCisgICAgZGVmIHRlc3RfdG9rZW5fZGVmYXVsdHMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRva2VuXyogZnVuY3Rpb25zIGhhbmRsZSBkZWZhdWx0IHNpemUgY29ycmVjdGx5LgorICAgICAgICBmb3IgZnVuYyBpbiAoc2VjcmV0cy50b2tlbl9ieXRlcywgc2VjcmV0cy50b2tlbl9oZXgsCisgICAgICAgICAgICAgICAgICAgICBzZWNyZXRzLnRva2VuX3VybHNhZmUpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZnVuYz1mdW5jKToKKyAgICAgICAgICAgICAgICBuYW1lID0gZnVuYy5fX25hbWVfXworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVuYygpCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlcyBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbm8gYXJndW1lbnQiICUgbmFtZSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMoTm9uZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBOb25lIiAlIG5hbWUpCisgICAgICAgIHNpemUgPSBzZWNyZXRzLkRFRkFVTFRfRU5UUk9QWQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWNyZXRzLnRva2VuX2J5dGVzKE5vbmUpKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VjcmV0cy50b2tlbl9oZXgoTm9uZSkpLCAyKnNpemUpCisKKyAgICBkZWYgdGVzdF90b2tlbl9ieXRlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRva2VuX2J5dGVzLgorICAgICAgICBmb3IgbiBpbiAoMSwgOCwgMTcsIDEwMCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuPW4pOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLnRva2VuX2J5dGVzKG4pLCBieXRlcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWNyZXRzLnRva2VuX2J5dGVzKG4pKSwgbikKKworICAgIGRlZiB0ZXN0X3Rva2VuX2hleChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRva2VuX2hleC4KKyAgICAgICAgZm9yIG4gaW4gKDEsIDEyLCAyNSwgOTApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qobj1uKToKKyAgICAgICAgICAgICAgICBzID0gc2VjcmV0cy50b2tlbl9oZXgobikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocywgc3RyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCAyKm4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChjIGluIHN0cmluZy5oZXhkaWdpdHMgZm9yIGMgaW4gcykpCisKKyAgICBkZWYgdGVzdF90b2tlbl91cmxzYWZlKHNlbGYpOgorICAgICAgICAjIFRlc3QgdG9rZW5fdXJsc2FmZS4KKyAgICAgICAgbGVnYWwgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAnLV8nCisgICAgICAgIGZvciBuIGluICgxLCAxMSwgMjgsIDc2KToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49bik6CisgICAgICAgICAgICAgICAgcyA9IHNlY3JldHMudG9rZW5fdXJsc2FmZShuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzLCBzdHIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChjIGluIGxlZ2FsIGZvciBjIGluIHMpKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CmluZGV4IDc1OTQzMDMuLmFmYTZlN2YgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CkBAIC02LDEwICs2LDExIEBACiBpbXBvcnQgY29weQogaW1wb3J0IHBpY2tsZQogZnJvbSByYW5kb20gaW1wb3J0IHJhbmRyYW5nZSwgc2h1ZmZsZQotaW1wb3J0IHN5cwogaW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgY29sbGVjdGlvbnMKIGltcG9ydCBjb2xsZWN0aW9ucy5hYmMKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCBzdHJpbmcKIAogY2xhc3MgUGFzc1RocnUoRXhjZXB0aW9uKToKICAgICBwYXNzCkBAIC03MjksNiArNzMwLDI4IEBACiAgICAgICAgICAgICBhZGRoYXNodmFsdWUoaGFzaChmcm96ZW5zZXQoW2UgZm9yIGUsIG0gaW4gZWxlbW1hc2tzIGlmIG0maV0pKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaGFzaHZhbHVlcyksIDIqKm4pCiAKKyAgICAgICAgZGVmIGxldHRlcl9yYW5nZShuKToKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcuYXNjaWlfbGV0dGVyc1s6bl0KKworICAgICAgICBkZWYgemZfcmFuZ2Uobik6CisgICAgICAgICAgICAjIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NldC10aGVvcmV0aWNfZGVmaW5pdGlvbl9vZl9uYXR1cmFsX251bWJlcnMKKyAgICAgICAgICAgIG51bXMgPSBbZnJvemVuc2V0KCldCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShuLTEpOgorICAgICAgICAgICAgICAgIG51bSA9IGZyb3plbnNldChudW1zKQorICAgICAgICAgICAgICAgIG51bXMuYXBwZW5kKG51bSkKKyAgICAgICAgICAgIHJldHVybiBudW1zWzpuXQorCisgICAgICAgIGRlZiBwb3dlcnNldChzKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzKSsxKToKKyAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIG1hcChmcm96ZW5zZXQsIGl0ZXJ0b29scy5jb21iaW5hdGlvbnMocywgaSkpCisKKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoMTgpOgorICAgICAgICAgICAgdCA9IDIgKiogbgorICAgICAgICAgICAgbWFzayA9IHQgLSAxCisgICAgICAgICAgICBmb3IgbnVtcyBpbiAocmFuZ2UsIGxldHRlcl9yYW5nZSwgemZfcmFuZ2UpOgorICAgICAgICAgICAgICAgIHUgPSBsZW4oe2ggJiBtYXNrIGZvciBoIGluIG1hcChoYXNoLCBwb3dlcnNldChudW1zKG4pKSl9KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcig0KnUsIHQpCisKIGNsYXNzIEZyb3plblNldFN1YmNsYXNzKGZyb3plbnNldCk6CiAgICAgcGFzcwogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NobGV4LnB5IGIvTGliL3Rlc3QvdGVzdF9zaGxleC5weQppbmRleCA1NWI1MzNkLi4zOTM2Yzk3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NobGV4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2hsZXgucHkKQEAgLTE3MywxNiArMTczLDExNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzICE9ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmRhdGFbaV1bMF0sIGwsIHNlbGYuZGF0YVtpXVsxOl0pKQogCisgICAgZGVmIHRlc3RTeW50YXhTcGxpdEFtcGVyc2FuZEFuZFBpcGUoc2VsZik6CisgICAgICAgICIiIlRlc3QgaGFuZGxpbmcgb2Ygc3ludGF4IHNwbGl0dGluZyBvZiAmLCB8IiIiCisgICAgICAgICMgQ291bGQgdGFrZSB0aGVzZSBmb3JtczogJiYsICYsIHwmLCA7JiwgOzsmCisgICAgICAgICMgb2YgY291cnNlLCB0aGUgc2FtZSBhcHBsaWVzIHRvIHwgYW5kIHx8CisgICAgICAgICMgdGhlc2Ugc2hvdWxkIGFsbCBwYXJzZSB0byB0aGUgc2FtZSBvdXRwdXQKKyAgICAgICAgZm9yIGRlbGltaXRlciBpbiAoJyYmJywgJyYnLCAnfCYnLCAnOyYnLCAnOzsmJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3x8JywgJ3wnLCAnJnwnLCAnO3wnLCAnOzt8Jyk6CisgICAgICAgICAgICBzcmMgPSBbJ2VjaG8gaGkgJXMgZWNobyBieWUnICUgZGVsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICdlY2hvIGhpJXNlY2hvIGJ5ZScgJSBkZWxpbWl0ZXJdCisgICAgICAgICAgICByZWYgPSBbJ2VjaG8nLCAnaGknLCBkZWxpbWl0ZXIsICdlY2hvJywgJ2J5ZSddCisgICAgICAgICAgICBmb3Igc3MgaW4gc3JjOgorICAgICAgICAgICAgICAgIHMgPSBzaGxleC5zaGxleChzcywgcHVuY3R1YXRpb25fY2hhcnM9VHJ1ZSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXN0KHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWYsIHJlc3VsdCwgIldoaWxlIHNwbGl0dGluZyAnJXMnIiAlIHNzKQorCisgICAgZGVmIHRlc3RTeW50YXhTcGxpdFNlbWljb2xvbihzZWxmKToKKyAgICAgICAgIiIiVGVzdCBoYW5kbGluZyBvZiBzeW50YXggc3BsaXR0aW5nIG9mIDsiIiIKKyAgICAgICAgIyBDb3VsZCB0YWtlIHRoZXNlIGZvcm1zOiA7LCA7OywgOyYsIDs7JgorICAgICAgICAjIHRoZXNlIHNob3VsZCBhbGwgcGFyc2UgdG8gdGhlIHNhbWUgb3V0cHV0CisgICAgICAgIGZvciBkZWxpbWl0ZXIgaW4gKCc7JywgJzs7JywgJzsmJywgJzs7JicpOgorICAgICAgICAgICAgc3JjID0gWydlY2hvIGhpICVzIGVjaG8gYnllJyAlIGRlbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAnZWNobyBoaSVzIGVjaG8gYnllJyAlIGRlbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAnZWNobyBoaSVzZWNobyBieWUnICUgZGVsaW1pdGVyXQorICAgICAgICAgICAgcmVmID0gWydlY2hvJywgJ2hpJywgZGVsaW1pdGVyLCAnZWNobycsICdieWUnXQorICAgICAgICAgICAgZm9yIHNzIGluIHNyYzoKKyAgICAgICAgICAgICAgICBzID0gc2hsZXguc2hsZXgoc3MsIHB1bmN0dWF0aW9uX2NoYXJzPVRydWUpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdChzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmLCByZXN1bHQsICJXaGlsZSBzcGxpdHRpbmcgJyVzJyIgJSBzcykKKworICAgIGRlZiB0ZXN0U3ludGF4U3BsaXRSZWRpcmVjdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCBoYW5kbGluZyBvZiBzeW50YXggc3BsaXR0aW5nIG9mID4iIiIKKyAgICAgICAgIyBvZiBjb3Vyc2UsIHRoZSBzYW1lIGFwcGxpZXMgdG8gPCwgfAorICAgICAgICAjIHRoZXNlIHNob3VsZCBhbGwgcGFyc2UgdG8gdGhlIHNhbWUgb3V0cHV0CisgICAgICAgIGZvciBkZWxpbWl0ZXIgaW4gKCc8JywgJ3wnKToKKyAgICAgICAgICAgIHNyYyA9IFsnZWNobyBoaSAlcyBvdXQnICUgZGVsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICdlY2hvIGhpJXMgb3V0JyAlIGRlbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAnZWNobyBoaSVzb3V0JyAlIGRlbGltaXRlcl0KKyAgICAgICAgICAgIHJlZiA9IFsnZWNobycsICdoaScsIGRlbGltaXRlciwgJ291dCddCisgICAgICAgICAgICBmb3Igc3MgaW4gc3JjOgorICAgICAgICAgICAgICAgIHMgPSBzaGxleC5zaGxleChzcywgcHVuY3R1YXRpb25fY2hhcnM9VHJ1ZSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXN0KHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWYsIHJlc3VsdCwgIldoaWxlIHNwbGl0dGluZyAnJXMnIiAlIHNzKQorCisgICAgZGVmIHRlc3RTeW50YXhTcGxpdFBhcmVuKHNlbGYpOgorICAgICAgICAiIiJUZXN0IGhhbmRsaW5nIG9mIHN5bnRheCBzcGxpdHRpbmcgb2YgKCkiIiIKKyAgICAgICAgIyB0aGVzZSBzaG91bGQgYWxsIHBhcnNlIHRvIHRoZSBzYW1lIG91dHB1dAorICAgICAgICBzcmMgPSBbJyggZWNobyBoaSApJywKKyAgICAgICAgICAgICAgICcoZWNobyBoaSknXQorICAgICAgICByZWYgPSBbJygnLCAnZWNobycsICdoaScsICcpJ10KKyAgICAgICAgZm9yIHNzIGluIHNyYzoKKyAgICAgICAgICAgIHMgPSBzaGxleC5zaGxleChzcywgcHVuY3R1YXRpb25fY2hhcnM9VHJ1ZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IGxpc3QocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmLCByZXN1bHQsICJXaGlsZSBzcGxpdHRpbmcgJyVzJyIgJSBzcykKKworICAgIGRlZiB0ZXN0U3ludGF4U3BsaXRDdXN0b20oc2VsZik6CisgICAgICAgICIiIlRlc3QgaGFuZGxpbmcgb2Ygc3ludGF4IHNwbGl0dGluZyB3aXRoIGN1c3RvbSBjaGFycyIiIgorICAgICAgICByZWYgPSBbJ34vYScsICcmJywgJyYnLCAnYi1jJywgJy0tY29sb3I9YXV0bycsICd8fCcsICdkJywgJyoucHk/J10KKyAgICAgICAgc3MgPSAifi9hICYmIGItYyAtLWNvbG9yPWF1dG8gfHwgZCAqLnB5PyIKKyAgICAgICAgcyA9IHNobGV4LnNobGV4KHNzLCBwdW5jdHVhdGlvbl9jaGFycz0ifCIpCisgICAgICAgIHJlc3VsdCA9IGxpc3QocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWYsIHJlc3VsdCwgIldoaWxlIHNwbGl0dGluZyAnJXMnIiAlIHNzKQorCisgICAgZGVmIHRlc3RUb2tlblR5cGVzKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgdG9rZW5zIGFyZSBzcGxpdCB3aXRoIHR5cGVzIGFzIGV4cGVjdGVkLiIiIgorICAgICAgICBmb3Igc291cmNlLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYSAmJiBiIHx8IGMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsICdhJyksICgnJiYnLCAnYycpLCAoJ2InLCAnYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnfHwnLCAnYycpLCAoJ2MnLCAnYScpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgcyA9IHNobGV4LnNobGV4KHNvdXJjZSwgcHVuY3R1YXRpb25fY2hhcnM9VHJ1ZSkKKyAgICAgICAgICAgIG9ic2VydmVkID0gW10KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdCA9IHMuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgICAgICBpZiB0ID09IHMuZW9mOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIHRbMF0gaW4gcy5wdW5jdHVhdGlvbl9jaGFyczoKKyAgICAgICAgICAgICAgICAgICAgdHQgPSAnYycKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0dCA9ICdhJworICAgICAgICAgICAgICAgIG9ic2VydmVkLmFwcGVuZCgodCwgdHQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYnNlcnZlZCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdFB1bmN0dWF0aW9uSW5Xb3JkQ2hhcnMoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbnkgcHVuY3R1YXRpb24gY2hhcnMgYXJlIHJlbW92ZWQgZnJvbSB3b3JkY2hhcnMiIiIKKyAgICAgICAgcyA9IHNobGV4LnNobGV4KCdhX2JfX2MnLCBwdW5jdHVhdGlvbl9jaGFycz0nXycpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ18nLCBzLndvcmRjaGFycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHMpLCBbJ2EnLCAnXycsICdiJywgJ19fJywgJ2MnXSkKKworICAgIGRlZiB0ZXN0UHVuY3R1YXRpb25XaXRoV2hpdGVzcGFjZVNwbGl0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgd2l0aCB3aGl0ZXNwYWNlX3NwbGl0LCBiZWhhdmlvdXIgaXMgYXMgZXhwZWN0ZWQiIiIKKyAgICAgICAgcyA9IHNobGV4LnNobGV4KCdhICAmJiBiICB8fCAgYycsIHB1bmN0dWF0aW9uX2NoYXJzPScmJykKKyAgICAgICAgIyB3aGl0ZXNwYWNlX3NwbGl0IGlzIEZhbHNlLCBzbyBzcGxpdHRpbmcgd2lsbCBiZSBiYXNlZCBvbgorICAgICAgICAjIHB1bmN0dWF0aW9uX2NoYXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzKSwgWydhJywgJyYmJywgJ2InLCAnfCcsICd8JywgJ2MnXSkKKyAgICAgICAgcyA9IHNobGV4LnNobGV4KCdhICAmJiBiICB8fCAgYycsIHB1bmN0dWF0aW9uX2NoYXJzPScmJykKKyAgICAgICAgcy53aGl0ZXNwYWNlX3NwbGl0ID0gVHJ1ZQorICAgICAgICAjIHdoaXRlc3BhY2Vfc3BsaXQgaXMgVHJ1ZSwgc28gc3BsaXR0aW5nIHdpbGwgYmUgYmFzZWQgb24KKyAgICAgICAgIyB3aGl0ZSBzcGFjZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocyksIFsnYScsICcmJicsICdiJywgJ3x8JywgJ2MnXSkKKwogICAgIGRlZiB0ZXN0RW1wdHlTdHJpbmdIYW5kbGluZyhzZWxmKToKICAgICAgICAgIiIiVGVzdCB0aGF0IHBhcnNpbmcgb2YgZW1wdHkgc3RyaW5ncyBpcyBjb3JyZWN0bHkgaGFuZGxlZC4iIiIKICAgICAgICAgIyBzZWUgSXNzdWUgIzIxOTk5CiAgICAgICAgIGV4cGVjdGVkID0gWycnLCAnKScsICdhYmMnXQotCi0gICAgICAgIHMgPSBzaGxleC5zaGxleCgiJycpYWJjIiwgcG9zaXg9VHJ1ZSkKLSAgICAgICAgc2xpc3QgPSBsaXN0KHMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpc3QsIGV4cGVjdGVkKQorICAgICAgICBmb3IgcHVuY3QgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgIHMgPSBzaGxleC5zaGxleCgiJycpYWJjIiwgcG9zaXg9VHJ1ZSwgcHVuY3R1YXRpb25fY2hhcnM9cHVuY3QpCisgICAgICAgICAgICBzbGlzdCA9IGxpc3QocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpc3QsIGV4cGVjdGVkKQogICAgICAgICBleHBlY3RlZCA9IFsiJyciLCAnKScsICdhYmMnXQotICAgICAgICBzID0gc2hsZXguc2hsZXgoIicnKWFiYyIpCisgICAgICAgIHMgPSBzaGxleC5zaGxleCgiJycpYWJjIiwgcHVuY3R1YXRpb25fY2hhcnM9VHJ1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHMpLCBleHBlY3RlZCkKIAogICAgIGRlZiB0ZXN0UXVvdGUoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NodXRpbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5CmluZGV4IDFkNWUwMWEuLjk5MGZhZTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5CkBAIC0xMzIsOSArMTMyLDcgQEAKICAgICAgICAgd3JpdGVfZmlsZShvcy5wYXRoLmpvaW4odmljdGltLCAnc29tZWZpbGUnKSwgJ2ZvbycpCiAgICAgICAgIHZpY3RpbSA9IG9zLmZzZW5jb2RlKHZpY3RpbSkKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZpY3RpbSwgYnl0ZXMpCi0gICAgICAgIHdpbiA9IChvcy5uYW1lID09ICdudCcpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpIGlmIHdpbiBlbHNlIEV4aXRTdGFjaygpOgotICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh2aWN0aW0pCisgICAgICAgIHNodXRpbC5ybXRyZWUodmljdGltKQogCiAgICAgQHN1cHBvcnQuc2tpcF91bmxlc3Nfc3ltbGluawogICAgIGRlZiB0ZXN0X3JtdHJlZV9mYWlsc19vbl9zeW1saW5rKHNlbGYpOgpAQCAtMTMwNiwxMCArMTMwNCwxMCBAQAogICAgICAgICAgICAgc2h1dGlsLmNob3duKGZpbGVuYW1lKQogCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoTG9va3VwRXJyb3IpOgotICAgICAgICAgICAgc2h1dGlsLmNob3duKGZpbGVuYW1lLCB1c2VyPSdub24tZXhpc2luZyB1c2VybmFtZScpCisgICAgICAgICAgICBzaHV0aWwuY2hvd24oZmlsZW5hbWUsIHVzZXI9J25vbi1leGlzdGluZyB1c2VybmFtZScpCiAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhMb29rdXBFcnJvcik6Ci0gICAgICAgICAgICBzaHV0aWwuY2hvd24oZmlsZW5hbWUsIGdyb3VwPSdub24tZXhpc2luZyBncm91cG5hbWUnKQorICAgICAgICAgICAgc2h1dGlsLmNob3duKGZpbGVuYW1lLCBncm91cD0nbm9uLWV4aXN0aW5nIGdyb3VwbmFtZScpCiAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICAgc2h1dGlsLmNob3duKGZpbGVuYW1lLCBiJ3NwYW0nKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkgYi9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weQppbmRleCAxYjgwZmYwLi5hYjQyZWQ3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weQpAQCAtMjIsMjkgKzIyLDYgQEAKICAgICBfdGVzdGNhcGkgPSBOb25lCiAKIAotY2xhc3MgSGFuZGxlckJDYWxsZWQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotZGVmIGV4aXRfc3VicHJvY2VzcygpOgotICAgICIiIlVzZSBvcy5fZXhpdCgwKSB0byBleGl0IHRoZSBjdXJyZW50IHN1YnByb2Nlc3MuCi0KLSAgICBPdGhlcndpc2UsIHRoZSB0ZXN0IGNhdGNoZXMgdGhlIFN5c3RlbUV4aXQgYW5kIGNvbnRpbnVlcyBleGVjdXRpbmcKLSAgICBpbiBwYXJhbGxlbCB3aXRoIHRoZSBvcmlnaW5hbCB0ZXN0LCBzbyB5b3Ugd2luZCB1cCB3aXRoIGFuCi0gICAgZXhwb25lbnRpYWwgbnVtYmVyIG9mIHRlc3RzIHJ1bm5pbmcgY29uY3VycmVudGx5LgotICAgICIiIgotICAgIG9zLl9leGl0KDApCi0KLQotZGVmIGlnbm9yaW5nX2VpbnRyKF9fZnVuYywgKmFyZ3MsICoqa3dhcmdzKToKLSAgICB0cnk6Ci0gICAgICAgIHJldHVybiBfX2Z1bmMoKmFyZ3MsICoqa3dhcmdzKQotICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6Ci0gICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUlOVFI6Ci0gICAgICAgICAgICByYWlzZQotICAgICAgICByZXR1cm4gTm9uZQotCi0KIGNsYXNzIEdlbmVyaWNUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBAdW5pdHRlc3Quc2tpcElmKHRocmVhZGluZyBpcyBOb25lLCAidGVzdCBuZWVkcyB0aHJlYWRpbmcgbW9kdWxlIikKQEAgLTYzLDE0NSArNDAsNiBAQAogCiAKIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJOb3QgdmFsaWQgb24gV2luZG93cyIpCi1jbGFzcyBJbnRlclByb2Nlc3NTaWduYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgTUFYX0RVUkFUSU9OID0gMjAgICAjIEVudGlyZSB0ZXN0IHNob3VsZCBsYXN0IGF0IG1vc3QgMjAgc2VjLgotCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnVzaW5nX2djID0gZ2MuaXNlbmFibGVkKCkKLSAgICAgICAgZ2MuZGlzYWJsZSgpCi0KLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIGlmIHNlbGYudXNpbmdfZ2M6Ci0gICAgICAgICAgICBnYy5lbmFibGUoKQotCi0gICAgZGVmIGZvcm1hdF9mcmFtZShzZWxmLCBmcmFtZSwgbGltaXQ9Tm9uZSk6Ci0gICAgICAgIHJldHVybiAnJy5qb2luKHRyYWNlYmFjay5mb3JtYXRfc3RhY2soZnJhbWUsIGxpbWl0PWxpbWl0KSkKLQotICAgIGRlZiBoYW5kbGVyQShzZWxmLCBzaWdudW0sIGZyYW1lKToKLSAgICAgICAgc2VsZi5hX2NhbGxlZCA9IFRydWUKLQotICAgIGRlZiBoYW5kbGVyQihzZWxmLCBzaWdudW0sIGZyYW1lKToKLSAgICAgICAgc2VsZi5iX2NhbGxlZCA9IFRydWUKLSAgICAgICAgcmFpc2UgSGFuZGxlckJDYWxsZWQoc2lnbnVtLCBzZWxmLmZvcm1hdF9mcmFtZShmcmFtZSkpCi0KLSAgICBkZWYgd2FpdChzZWxmLCBjaGlsZCk6Ci0gICAgICAgICIiIldhaXQgZm9yIGNoaWxkIHRvIGZpbmlzaCwgaWdub3JpbmcgRUlOVFIuIiIiCi0gICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY2hpbGQud2FpdCgpCi0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgotICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUlOVFI6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlCi0KLSAgICBkZWYgcnVuX3Rlc3Qoc2VsZik6Ci0gICAgICAgICMgSW5zdGFsbCBoYW5kbGVycy4gVGhpcyBmdW5jdGlvbiBydW5zIGluIGEgc3ViLXByb2Nlc3MsIHNvIHdlCi0gICAgICAgICMgZG9uJ3Qgd29ycnkgYWJvdXQgcmUtc2V0dGluZyB0aGUgZGVmYXVsdCBoYW5kbGVycy4KLSAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSFVQLCBzZWxmLmhhbmRsZXJBKQotICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCBzZWxmLmhhbmRsZXJCKQotICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IyLCBzaWduYWwuU0lHX0lHTikKLSAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgc2lnbmFsLmRlZmF1bHRfaW50X2hhbmRsZXIpCi0KLSAgICAgICAgIyBWYXJpYWJsZXMgdGhlIHNpZ25hbHMgd2lsbCBtb2RpZnk6Ci0gICAgICAgIHNlbGYuYV9jYWxsZWQgPSBGYWxzZQotICAgICAgICBzZWxmLmJfY2FsbGVkID0gRmFsc2UKLQotICAgICAgICAjIExldCB0aGUgc3ViLXByb2Nlc3NlcyBrbm93IHdobyB0byBzZW5kIHNpZ25hbHMgdG8uCi0gICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCi0KLSAgICAgICAgY2hpbGQgPSBpZ25vcmluZ19laW50cihzdWJwcm9jZXNzLlBvcGVuLCBbJ2tpbGwnLCAnLUhVUCcsIHN0cihwaWQpXSkKLSAgICAgICAgaWYgY2hpbGQ6Ci0gICAgICAgICAgICBzZWxmLndhaXQoY2hpbGQpCi0gICAgICAgICAgICBpZiBub3Qgc2VsZi5hX2NhbGxlZDoKLSAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDEpICAjIEdpdmUgdGhlIHNpZ25hbCB0aW1lIHRvIGJlIGRlbGl2ZXJlZC4KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuYV9jYWxsZWQpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5iX2NhbGxlZCkKLSAgICAgICAgc2VsZi5hX2NhbGxlZCA9IEZhbHNlCi0KLSAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHNpZ25hbCBpc24ndCBkZWxpdmVyZWQgd2hpbGUgdGhlIHByZXZpb3VzCi0gICAgICAgICMgUG9wZW4gb2JqZWN0IGlzIGJlaW5nIGRlc3Ryb3llZCwgYmVjYXVzZSBfX2RlbF9fIHN3YWxsb3dzCi0gICAgICAgICMgZXhjZXB0aW9ucy4KLSAgICAgICAgZGVsIGNoaWxkCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGNoaWxkID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2tpbGwnLCAnLVVTUjEnLCBzdHIocGlkKV0pCi0gICAgICAgICAgICAjIFRoaXMgd2FpdCBzaG91bGQgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIHNpZ25hbCdzIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgIHNlbGYud2FpdChjaGlsZCkKLSAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkgICMgR2l2ZSB0aGUgc2lnbmFsIHRpbWUgdG8gYmUgZGVsaXZlcmVkLgotICAgICAgICAgICAgc2VsZi5mYWlsKCdIYW5kbGVyQkNhbGxlZCBleGNlcHRpb24gbm90IHJhaXNlZCcpCi0gICAgICAgIGV4Y2VwdCBIYW5kbGVyQkNhbGxlZDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmJfY2FsbGVkKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmFfY2FsbGVkKQotCi0gICAgICAgIGNoaWxkID0gaWdub3JpbmdfZWludHIoc3VicHJvY2Vzcy5Qb3BlbiwgWydraWxsJywgJy1VU1IyJywgc3RyKHBpZCldKQotICAgICAgICBpZiBjaGlsZDoKLSAgICAgICAgICAgIHNlbGYud2FpdChjaGlsZCkgICMgTm90aGluZyBzaG91bGQgaGFwcGVuLgotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNpZ25hbC5hbGFybSgxKQotICAgICAgICAgICAgIyBUaGUgcmFjZSBjb25kaXRpb24gaW4gcGF1c2UgZG9lc24ndCBtYXR0ZXIgaW4gdGhpcyBjYXNlLAotICAgICAgICAgICAgIyBzaW5jZSBhbGFybSBpcyBnb2luZyB0byByYWlzZSBhIEtleWJvYXJkRXhjZXB0aW9uLCB3aGljaAotICAgICAgICAgICAgIyB3aWxsIHNraXAgdGhlIGNhbGwuCi0gICAgICAgICAgICBzaWduYWwucGF1c2UoKQotICAgICAgICAgICAgIyBCdXQgaWYgYW5vdGhlciBzaWduYWwgYXJyaXZlcyBiZWZvcmUgdGhlIGFsYXJtLCBwYXVzZQotICAgICAgICAgICAgIyBtYXkgcmV0dXJuIGVhcmx5LgotICAgICAgICAgICAgdGltZS5zbGVlcCgxKQotICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiU29tZSBvdGhlciBleGNlcHRpb24gd29rZSB1cyBmcm9tIHBhdXNlOiAlcyIgJQotICAgICAgICAgICAgICAgICAgICAgIHRyYWNlYmFjay5mb3JtYXRfZXhjKCkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoInBhdXNlIHJldHVybmVkIG9mIGl0cyBvd24gYWNjb3JkLCBhbmQgdGhlIHNpZ25hbCIKLSAgICAgICAgICAgICAgICAgICAgICAiIGRpZG4ndCBhcnJpdmUgYWZ0ZXIgYW5vdGhlciBzZWNvbmQuIikKLQotICAgICMgSXNzdWUgMzg2NCwgdW5rbm93biBpZiB0aGlzIGFmZmVjdHMgZWFybGllciB2ZXJzaW9ucyBvZiBmcmVlYnNkIGFsc28KLSAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybT09J2ZyZWVic2Q2JywKLSAgICAgICAgJ2ludGVyIHByb2Nlc3Mgc2lnbmFscyBub3QgcmVsaWFibGUgKGRvIG5vdCBtaXggd2VsbCB3aXRoIHRocmVhZGluZykgJwotICAgICAgICAnb24gZnJlZWJzZDYnKQotICAgIGRlZiB0ZXN0X21haW4oc2VsZik6Ci0gICAgICAgICMgVGhpcyBmdW5jdGlvbiBzcGF3bnMgYSBjaGlsZCBwcm9jZXNzIHRvIGluc3VsYXRlIHRoZSBtYWluCi0gICAgICAgICMgdGVzdC1ydW5uaW5nIHByb2Nlc3MgZnJvbSBhbGwgdGhlIHNpZ25hbHMuIEl0IHRoZW4KLSAgICAgICAgIyBjb21tdW5pY2F0ZXMgd2l0aCB0aGF0IGNoaWxkIHByb2Nlc3Mgb3ZlciBhIHBpcGUgYW5kCi0gICAgICAgICMgcmUtcmFpc2VzIGluZm9ybWF0aW9uIGFib3V0IGFueSBleGNlcHRpb25zIHRoZSBjaGlsZAotICAgICAgICAjIHJhaXNlcy4gVGhlIHJlYWwgd29yayBoYXBwZW5zIGluIHNlbGYucnVuX3Rlc3QoKS4KLSAgICAgICAgb3NfZG9uZV9yLCBvc19kb25lX3cgPSBvcy5waXBlKCkKLSAgICAgICAgd2l0aCBjbG9zaW5nKG9zLmZkb3Blbihvc19kb25lX3IsICdyYicpKSBhcyBkb25lX3IsIFwKLSAgICAgICAgICAgICBjbG9zaW5nKG9zLmZkb3Blbihvc19kb25lX3csICd3YicpKSBhcyBkb25lX3c6Ci0gICAgICAgICAgICBjaGlsZCA9IG9zLmZvcmsoKQotICAgICAgICAgICAgaWYgY2hpbGQgPT0gMDoKLSAgICAgICAgICAgICAgICAjIEluIHRoZSBjaGlsZCBwcm9jZXNzOyBydW4gdGhlIHRlc3QgYW5kIHJlcG9ydCByZXN1bHRzCi0gICAgICAgICAgICAgICAgIyB0aHJvdWdoIHRoZSBwaXBlLgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgZG9uZV9yLmNsb3NlKCkKLSAgICAgICAgICAgICAgICAgICAgIyBIYXZlIHRvIGNsb3NlIGRvbmVfdyBhZ2FpbiBoZXJlIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgIyBleGl0X3N1YnByb2Nlc3MoKSB3aWxsIHNraXAgdGhlIGVuY2xvc2luZyB3aXRoIGJsb2NrLgotICAgICAgICAgICAgICAgICAgICB3aXRoIGNsb3NpbmcoZG9uZV93KToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJ1bl90ZXN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcCh0cmFjZWJhY2suZm9ybWF0X2V4YygpLCBkb25lX3cpCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKE5vbmUsIGRvbmVfdykKLSAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KCdVaCBvaCwgcmFpc2VkIGZyb20gcGlja2xlLicpCi0gICAgICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQotICAgICAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgICAgIGV4aXRfc3VicHJvY2VzcygpCi0KLSAgICAgICAgICAgIGRvbmVfdy5jbG9zZSgpCi0gICAgICAgICAgICAjIEJsb2NrIGZvciB1cCB0byBNQVhfRFVSQVRJT04gc2Vjb25kcyBmb3IgdGhlIHRlc3QgdG8gZmluaXNoLgotICAgICAgICAgICAgciwgdywgeCA9IHNlbGVjdC5zZWxlY3QoW2RvbmVfcl0sIFtdLCBbXSwgc2VsZi5NQVhfRFVSQVRJT04pCi0gICAgICAgICAgICBpZiBkb25lX3IgaW4gcjoKLSAgICAgICAgICAgICAgICB0YiA9IHBpY2tsZS5sb2FkKGRvbmVfcikKLSAgICAgICAgICAgICAgICBpZiB0YjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKHRiKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBvcy5raWxsKGNoaWxkLCBzaWduYWwuU0lHS0lMTCkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ1Rlc3QgZGVhZGxvY2tlZCBhZnRlciAlZCBzZWNvbmRzLicgJQotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk1BWF9EVVJBVElPTikKLQotCi1AdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiTm90IHZhbGlkIG9uIFdpbmRvd3MiKQogY2xhc3MgUG9zaXhUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRyaXZpYWxfc2lnbmFsX2hhbmRsZXIoc2VsZiwgKmFyZ3MpOgogICAgICAgICBwYXNzCkBAIC0yMjQsNiArNjIsMTUgQEAKICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSFVQLCBodXApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSFVQKSwgaHVwKQogCisgICAgIyBJc3N1ZSAzODY0LCB1bmtub3duIGlmIHRoaXMgYWZmZWN0cyBlYXJsaWVyIHZlcnNpb25zIG9mIGZyZWVic2QgYWxzbworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtPT0nZnJlZWJzZDYnLAorICAgICAgICAnaW50ZXIgcHJvY2VzcyBzaWduYWxzIG5vdCByZWxpYWJsZSAoZG8gbm90IG1peCB3ZWxsIHdpdGggdGhyZWFkaW5nKSAnCisgICAgICAgICdvbiBmcmVlYnNkNicpCisgICAgZGVmIHRlc3RfaW50ZXJwcm9jZXNzX3NpZ25hbChzZWxmKToKKyAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKyAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKGRpcm5hbWUsICdzaWduYWxpbnRlcnByb2N0ZXN0ZXIucHknKQorICAgICAgICBhc3NlcnRfcHl0aG9uX29rKHNjcmlwdCkKKwogCiBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbmRvd3Mgc3BlY2lmaWMiKQogY2xhc3MgV2luZG93c1NpZ25hbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weQppbmRleCBkYTIwYTNkLi4wNzIwMjMwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NpdGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaXRlLnB5CkBAIC03NSw3ICs3NSw3IEBACiAgICAgZGVmIHRlc3RfaW5pdF9wYXRoaW5mbyhzZWxmKToKICAgICAgICAgZGlyX3NldCA9IHNpdGUuX2luaXRfcGF0aGluZm8oKQogICAgICAgICBmb3IgZW50cnkgaW4gW3NpdGUubWFrZXBhdGgocGF0aClbMV0gZm9yIHBhdGggaW4gc3lzLnBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhdGggYW5kIG9zLnBhdGguaXNkaXIocGF0aCldOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBhbmQgb3MucGF0aC5leGlzdHMocGF0aCldOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlbnRyeSwgZGlyX3NldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGZyb20gc3lzLnBhdGggbm90IGZvdW5kIGluIHNldCByZXR1cm5lZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJieSBfaW5pdF9wYXRoaW5mbygpOiAlcyIgJSAoZW50cnksIGRpcl9zZXQpKQpAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgICAgICAgICByZS5lc2NhcGUob3MucGF0aC5qb2luKHB0aF9kaXIsIHB0aF9mbikpKQogICAgICAgICAjIFhYWDogZGl0dG8gcHJldmlvdXMgWFhYIGNvbW1lbnQuCiAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgoZXJyX291dC5nZXR2YWx1ZSgpLCAnVHJhY2ViYWNrJykKLSAgICAgICAgc2VsZi5hc3NlcnRSZWdleChlcnJfb3V0LmdldHZhbHVlKCksICdJbXBvcnRFcnJvcicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgoZXJyX291dC5nZXR2YWx1ZSgpLCAnTW9kdWxlTm90Rm91bmRFcnJvcicpCiAKICAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luZG93cyBkb2VzIG5vdCByYWlzZSBhbiAiCiAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIGZvciBmaWxlIHBhdGhzIGNvbnRhaW5pbmcgbnVsbCBjaGFyYWN0ZXJzIikKQEAgLTI0MywxMyArMjQzLDE0IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaXJzKSwgMikKICAgICAgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbignL0xpYnJhcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiUFlUSE9ORlJBTUVXT1JLIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcnNbMV0sIHdhbnRlZCkKICAgICAgICAgZWxpZiBvcy5zZXAgPT0gJy8nOgogICAgICAgICAgICAgIyBPUyBYIG5vbi1mcmFtd2V3b3JrIGJ1aWxkcywgTGludXgsIEZyZWVCU0QsIGV0YwogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGlycyksIDEpCi0gICAgICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oJ3hveG8nLCAnbGliJywgJ3B5dGhvbicgKyBzeXMudmVyc2lvbls6M10sCisgICAgICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oJ3hveG8nLCAnbGliJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHl0aG9uJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUtcGFja2FnZXMnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXJzWzBdLCB3YW50ZWQpCiAgICAgICAgIGVsc2U6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NtdHBkLnB5IGIvTGliL3Rlc3QvdGVzdF9zbXRwZC5weQppbmRleCA4OGRiZmRmLi4zZWViZTk0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NtdHBkLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc210cGQucHkKQEAgLTUzLDEwICs1Myw2IEBACiAgICAgICAgIHdyaXRlX2xpbmUoYidEQVRBJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgd3JpdGVfbGluZSwgYidzcGFtXHJcbi5cclxuJykKIAotICAgIGRlZiB0ZXN0X2RlY29kZV9kYXRhX2RlZmF1bHRfd2FybnMoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc210cGQuU01UUFNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCkpCi0KICAgICBkZWYgdGVzdF9kZWNvZGVfZGF0YV9hbmRfZW5hYmxlX1NNVFBVVEY4X3JhaXNlcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgICBWYWx1ZUVycm9yLApAQCAtMTA4LDEwICsxMDQsOSBAQAogICAgICAgICAgICAgICIiIikpCiAKICAgICBkZWYgdGVzdF9wcm9jZXNzX21lc3NhZ2Vfd2l0aF9kZWNvZGVfZGF0YV9mYWxzZShzZWxmKToKLSAgICAgICAgc2VydmVyID0gc210cGQuRGVidWdnaW5nU2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoJ2InLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBzbXRwZC5EZWJ1Z2dpbmdTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQogICAgICAgICBjb25uLCBhZGRyID0gc2VydmVyLmFjY2VwdCgpCi0gICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIsIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBjaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyKQogICAgICAgICB3aXRoIHN1cHBvcnQuY2FwdHVyZWRfc3Rkb3V0KCkgYXMgczoKICAgICAgICAgICAgIHNlbGYuc2VuZF9kYXRhKGNoYW5uZWwsIGInRnJvbTogdGVzdFxuXG5oXHhjM1x4YTlsbG9ceGZmXG4nKQogICAgICAgICBzdGRvdXQgPSBzLmdldHZhbHVlKCkKQEAgLTE3NSwxMyArMTcwLDExIEBACiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzdXBwb3J0LklQVjZfRU5BQkxFRCwgIklQdjYgbm90IGVuYWJsZWQiKQogICAgIGRlZiB0ZXN0X3NvY2tldF91c2VzX0lQdjYoc2VsZik6Ci0gICAgICAgIHNlcnZlciA9IHNtdHBkLlNNVFBTZXJ2ZXIoKHN1cHBvcnQuSE9TVHY2LCAwKSwgKHN1cHBvcnQuSE9TVCwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIHNlcnZlciA9IHNtdHBkLlNNVFBTZXJ2ZXIoKHN1cHBvcnQuSE9TVHY2LCAwKSwgKHN1cHBvcnQuSE9TVCwgMCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLnNvY2tldC5mYW1pbHksIHNvY2tldC5BRl9JTkVUNikKIAogICAgIGRlZiB0ZXN0X3NvY2tldF91c2VzX0lQdjQoc2VsZik6Ci0gICAgICAgIHNlcnZlciA9IHNtdHBkLlNNVFBTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksIChzdXBwb3J0LkhPU1R2NiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIHNlcnZlciA9IHNtdHBkLlNNVFBTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksIChzdXBwb3J0LkhPU1R2NiwgMCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLnNvY2tldC5mYW1pbHksIHNvY2tldC5BRl9JTkVUKQogCiAKQEAgLTIwNCwxOCArMTk3LDE4IEBACiAgICAgICAgIGNoYW5uZWwuaGFuZGxlX3JlYWQoKQogCiAgICAgZGVmIHRlc3RfcGFyYW1zX3JlamVjdGVkKHNlbGYpOgotICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCksIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCkpCiAgICAgICAgIGNvbm4sIGFkZHIgPSBzZXJ2ZXIuYWNjZXB0KCkKLSAgICAgICAgY2hhbm5lbCA9IHNtdHBkLlNNVFBDaGFubmVsKHNlcnZlciwgY29ubiwgYWRkciwgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ0VITE8gZXhhbXBsZScpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ01BSUwgZnJvbTogPGZvb0BleGFtcGxlLmNvbT4gc2l6ZT0yMCcpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ1JDUFQgdG86IDxmb29AZXhhbXBsZS5jb20+IGZvbz1iYXInKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoYW5uZWwuc29ja2V0Lmxhc3QsIHNlbGYuZXJyb3JfcmVzcG9uc2UpCiAKICAgICBkZWYgdGVzdF9ub3RoaW5nX2FjY2VwdGVkKHNlbGYpOgotICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCksIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCkpCiAgICAgICAgIGNvbm4sIGFkZHIgPSBzZXJ2ZXIuYWNjZXB0KCkKLSAgICAgICAgY2hhbm5lbCA9IHNtdHBkLlNNVFBDaGFubmVsKHNlcnZlciwgY29ubiwgYWRkciwgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ0VITE8gZXhhbXBsZScpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ01BSUwgZnJvbTogPGZvb0BleGFtcGxlLmNvbT4gc2l6ZT0yMCcpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ1JDUFQgdG86IDxmb29AZXhhbXBsZS5jb20+JykKQEAgLTI1Nyw5ICsyNTAsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoYW5uZWwuc29ja2V0Lmxhc3QsIGInMjUwIE9LXHJcbicpCiAKICAgICBkZWYgdGVzdF93aXRoX2RlY29kZV9kYXRhX2ZhbHNlKHNlbGYpOgotICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCksIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCkpCiAgICAgICAgIGNvbm4sIGFkZHIgPSBzZXJ2ZXIuYWNjZXB0KCkKLSAgICAgICAgY2hhbm5lbCA9IHNtdHBkLlNNVFBDaGFubmVsKHNlcnZlciwgY29ubiwgYWRkciwgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ0VITE8gZXhhbXBsZScpCiAgICAgICAgIGZvciBsaW5lIGluIFsKICAgICAgICAgICAgIGInTUFJTCBmcm9tOiA8Zm9vQGV4YW1wbGUuY29tPiBzaXplPTIwIFNNVFBVVEY4JywKQEAgLTc2NSwxMyArNzU4LDYgQEAKICAgICAgICAgd2l0aCBzdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnJywgRGVwcmVjYXRpb25XYXJuaW5nKSk6CiAgICAgICAgICAgICBzZWxmLmNoYW5uZWwuX1NNVFBDaGFubmVsX19hZGRyID0gJ3NwYW0nCiAKLSAgICBkZWYgdGVzdF9kZWNvZGVfZGF0YV9kZWZhdWx0X3dhcm5pbmcoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQotICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2ZXIuYWNjZXB0KCkKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIpCi0KIEB1bml0dGVzdC5za2lwVW5sZXNzKHN1cHBvcnQuSVBWNl9FTkFCTEVELCAiSVB2NiBub3QgZW5hYmxlZCIpCiBjbGFzcyBTTVRQRENoYW5uZWxJUHY2VGVzdChTTVRQRENoYW5uZWxUZXN0KToKICAgICBkZWYgc2V0VXAoc2VsZik6CkBAIC04NDUsMTIgKzgzMSw5IEBACiAgICAgICAgIHNtdHBkLnNvY2tldCA9IGFzeW5jb3JlLnNvY2tldCA9IG1vY2tfc29ja2V0CiAgICAgICAgIHNlbGYub2xkX2RlYnVnc3RyZWFtID0gc210cGQuREVCVUdTVFJFQU0KICAgICAgICAgc2VsZi5kZWJ1ZyA9IHNtdHBkLkRFQlVHU1RSRUFNID0gaW8uU3RyaW5nSU8oKQotICAgICAgICBzZWxmLnNlcnZlciA9IER1bW15U2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoJ2InLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCkpCiAgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLnNlcnZlci5hY2NlcHQoKQotICAgICAgICAjIFNldCBkZWNvZGVfZGF0YSB0byBGYWxzZQotICAgICAgICBzZWxmLmNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZWxmLnNlcnZlciwgY29ubiwgYWRkciwKLSAgICAgICAgICAgICAgICBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VsZi5jaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VsZi5zZXJ2ZXIsIGNvbm4sIGFkZHIpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIGFzeW5jb3JlLmNsb3NlX2FsbCgpCkBAIC0xMDE1LDUgKzk5OCwxNiBAQAogICAgICAgICAgICAgc2VsZi53cml0ZV9saW5lKGIndGVzdFxyXG4uJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jaGFubmVsLnNvY2tldC5sYXN0WzA6M10sIGInMjUwJykKIAorCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geworICAgICAgICAgICAgInByb2dyYW0iLCAiRGV2bnVsbCIsICJERUJVR1NUUkVBTSIsICJORVdMSU5FIiwgIkNPTU1BU1BBQ0UiLAorICAgICAgICAgICAgIkRBVEFfU0laRV9ERUZBVUxUIiwgInVzYWdlIiwgIk9wdGlvbnMiLCAicGFyc2VhcmdzIiwKKworICAgICAgICB9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIHNtdHBkLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CmluZGV4IDRiMDQ3ZWUuLmIzNjMyZTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CkBAIC0xMyw3ICsxMyw2IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCBhcnJheQotaW1wb3J0IHBsYXRmb3JtCiBpbXBvcnQgY29udGV4dGxpYgogZnJvbSB3ZWFrcmVmIGltcG9ydCBwcm94eQogaW1wb3J0IHNpZ25hbApAQCAtNjYsMTAgKzY1LDIyIEBACiAgICAgICAgIHMuY2xvc2UoKQogICAgIHJldHVybiBUcnVlCiAKK2RlZiBfaGF2ZV9zb2NrZXRfYWxnKCk6CisgICAgIiIiQ2hlY2sgd2hldGhlciBBRl9BTEcgc29ja2V0cyBhcmUgc3VwcG9ydGVkIG9uIHRoaXMgaG9zdC4iIiIKKyAgICB0cnk6CisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9BTEcsIHNvY2tldC5TT0NLX1NFUVBBQ0tFVCwgMCkKKyAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBPU0Vycm9yKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZWxzZToKKyAgICAgICAgcy5jbG9zZSgpCisgICAgcmV0dXJuIFRydWUKKwogSEFWRV9TT0NLRVRfQ0FOID0gX2hhdmVfc29ja2V0X2NhbigpCiAKIEhBVkVfU09DS0VUX1JEUyA9IF9oYXZlX3NvY2tldF9yZHMoKQogCitIQVZFX1NPQ0tFVF9BTEcgPSBfaGF2ZV9zb2NrZXRfYWxnKCkKKwogIyBTaXplIGluIGJ5dGVzIG9mIHRoZSBpbnQgdHlwZQogU0laRU9GX0lOVCA9IGFycmF5LmFycmF5KCJpIikuaXRlbXNpemUKIApAQCAtMTE2MSw2ICsxMTcyLDE3IEBACiAgICAgICAgIHNvY2suY2xvc2UoKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBzb2NrLnNlbmQsIGIic3BhbSIpCiAKKyAgICBkZWYgdGVzdENsb3NlRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHNvY2tldC5zb2NrZXQoZmlsZW5vPXNvY2suZmlsZW5vKCkpLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycjoKKyAgICAgICAgICAgICMgV2luc29jayBhcHBhcmVudGx5IHJhaXNlcyBFTk9UU09DSworICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlcnIuZXJybm8sIChlcnJuby5FQkFERiwgZXJybm8uRU5PVFNPQ0spKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJjbG9zZSgpIHNob3VsZCByYWlzZSBFQkFERi9FTk9UU09DSyIpCisKICAgICBkZWYgdGVzdE5ld0F0dHJpYnV0ZXMoc2VsZik6CiAgICAgICAgICMgdGVzdGluZyAuZmFtaWx5LCAudHlwZSBhbmQgLnByb3RvY29sCiAKQEAgLTEyMDcsNiArMTIyOSwyMiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzLmlvY3RsLCAtMSwgTm9uZSkKICAgICAgICAgcy5pb2N0bChzb2NrZXQuU0lPX0tFRVBBTElWRV9WQUxTLCAoMSwgMTAwLCAxMDApKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSA9PSAibnQiLCAiV2luZG93cyBzcGVjaWZpYyIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzb2NrZXQsICdTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0xvb3BiYWNrIGZhc3QgcGF0aCBzdXBwb3J0IHJlcXVpcmVkIGZvciB0aGlzIHRlc3QnKQorICAgIGRlZiB0ZXN0X3Npb19sb29wYmFja19mYXN0X3BhdGgoc2VsZik6CisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHMuY2xvc2UpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMuaW9jdGwoc29ja2V0LlNJT19MT09QQkFDS19GQVNUX1BBVEgsIFRydWUpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIFdTQUVPUE5PVFNVUFAgPSAxMDA0NQorICAgICAgICAgICAgaWYgZXhjLndpbmVycm9yID09IFdTQUVPUE5PVFNVUFA6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCBpcyBkZWZpbmVkIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG9lc24ndCBpbXBsZW1lbnRlZCBpbiB0aGlzIFdpbmRvd3MgdmVyc2lvbiIpCisgICAgICAgICAgICByYWlzZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHMuaW9jdGwsIHNvY2tldC5TSU9fTE9PUEJBQ0tfRkFTVF9QQVRILCBOb25lKQorCiAgICAgZGVmIHRlc3RHZXRhZGRyaW5mbyhzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc29ja2V0LmdldGFkZHJpbmZvKCdsb2NhbGhvc3QnLCA4MCkKQEAgLTI4MjMsNiArMjg2MSw3IEBACiAgICAgICAgICAgICBuYnl0ZXMgPSBzZWxmLnNlbmRtc2dUb1NlcnZlcihbbXNnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYnl0ZXMsIGxlbihtc2cpKQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gImRhcndpbiIsICJzZWUgaXNzdWUgIzI0NzI1IikKICAgICBkZWYgdGVzdEZEUGFzc0VtcHR5KHNlbGYpOgogICAgICAgICAjIFRyeSB0byBwYXNzIGFuIGVtcHR5IEZEIGFycmF5LiAgQ2FuIHJlY2VpdmUgZWl0aGVyIG5vIGFycmF5CiAgICAgICAgICMgb3IgYW4gZW1wdHkgYXJyYXkuCkBAIC01Mjk5LDYgKzUzMzgsMTc3IEBACiAgICAgICAgIHJldHVybiBnZXRhdHRyKHNvY2ssICJfc2VuZGZpbGVfdXNlX3NlbmRmaWxlIikKIAogCitAdW5pdHRlc3Quc2tpcFVubGVzcyhIQVZFX1NPQ0tFVF9BTEcsICdBRl9BTEcgcmVxdWlyZWQnKQorY2xhc3MgTGludXhLZXJuZWxDcnlwdG9BUEkodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgdGVzdHMgZm9yIEFGX0FMRworICAgIGRlZiBjcmVhdGVfYWxnKHNlbGYsIHR5cCwgbmFtZSk6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9BTEcsIHNvY2tldC5TT0NLX1NFUVBBQ0tFVCwgMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc29jay5iaW5kKCh0eXAsIG5hbWUpKQorICAgICAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3IgYXMgZToKKyAgICAgICAgICAgICMgdHlwZSAvIGFsZ29yaXRobSBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdChzdHIoZSksIHR5cCwgbmFtZSkKKyAgICAgICAgcmV0dXJuIHNvY2sKKworICAgIGRlZiB0ZXN0X3NoYTI1NihzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSBieXRlcy5mcm9taGV4KCJiYTc4MTZiZjhmMDFjZmVhNDE0MTQwZGU1ZGFlMjIyM2IwMDM2MWEzOTYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTc3YTljYjQxMGZmNjFmMjAwMTVhZCIpCisgICAgICAgIHdpdGggc2VsZi5jcmVhdGVfYWxnKCdoYXNoJywgJ3NoYTI1NicpIGFzIGFsZ286CisgICAgICAgICAgICBvcCwgXyA9IGFsZ28uYWNjZXB0KCkKKyAgICAgICAgICAgIHdpdGggb3A6CisgICAgICAgICAgICAgICAgb3Auc2VuZGFsbChiImFiYyIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcC5yZWN2KDUxMiksIGV4cGVjdGVkKQorCisgICAgICAgICAgICBvcCwgXyA9IGFsZ28uYWNjZXB0KCkKKyAgICAgICAgICAgIHdpdGggb3A6CisgICAgICAgICAgICAgICAgb3Auc2VuZChiJ2EnLCBzb2NrZXQuTVNHX01PUkUpCisgICAgICAgICAgICAgICAgb3Auc2VuZChiJ2InLCBzb2NrZXQuTVNHX01PUkUpCisgICAgICAgICAgICAgICAgb3Auc2VuZChiJ2MnLCBzb2NrZXQuTVNHX01PUkUpCisgICAgICAgICAgICAgICAgb3Auc2VuZChiJycpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcC5yZWN2KDUxMiksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfaG1hY19zaGExKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9IGJ5dGVzLmZyb21oZXgoImVmZmNkZjZhZTVlYjJmYTJkMjc0MTZkNWYxODRkZjljMjU5YTdjNzkiKQorICAgICAgICB3aXRoIHNlbGYuY3JlYXRlX2FsZygnaGFzaCcsICdobWFjKHNoYTEpJykgYXMgYWxnbzoKKyAgICAgICAgICAgIGFsZ28uc2V0c29ja29wdChzb2NrZXQuU09MX0FMRywgc29ja2V0LkFMR19TRVRfS0VZLCBiIkplZmUiKQorICAgICAgICAgICAgb3AsIF8gPSBhbGdvLmFjY2VwdCgpCisgICAgICAgICAgICB3aXRoIG9wOgorICAgICAgICAgICAgICAgIG9wLnNlbmRhbGwoYiJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wLnJlY3YoNTEyKSwgZXhwZWN0ZWQpCisKKyAgICBAc3VwcG9ydC5yZXF1aXJlc19saW51eF92ZXJzaW9uKDMsIDE5KQorICAgIGRlZiB0ZXN0X2Flc19jYmMoc2VsZik6CisgICAgICAgIGtleSA9IGJ5dGVzLmZyb21oZXgoJzA2YTkyMTQwMzZiOGExNWI1MTJlMDNkNTM0MTIwMDA2JykKKyAgICAgICAgaXYgPSBieXRlcy5mcm9taGV4KCczZGFmYmE0MjlkOWViNDMwYjQyMmRhODAyYzlmYWM0MScpCisgICAgICAgIG1zZyA9IGIiU2luZ2xlIGJsb2NrIG1zZyIKKyAgICAgICAgY2lwaGVydGV4dCA9IGJ5dGVzLmZyb21oZXgoJ2UzNTM3NzljMTA3OWFlYjgyNzA4OTQyZGJlNzcxODFhJykKKyAgICAgICAgbXNnbGVuID0gbGVuKG1zZykKKyAgICAgICAgd2l0aCBzZWxmLmNyZWF0ZV9hbGcoJ3NrY2lwaGVyJywgJ2NiYyhhZXMpJykgYXMgYWxnbzoKKyAgICAgICAgICAgIGFsZ28uc2V0c29ja29wdChzb2NrZXQuU09MX0FMRywgc29ja2V0LkFMR19TRVRfS0VZLCBrZXkpCisgICAgICAgICAgICBvcCwgXyA9IGFsZ28uYWNjZXB0KCkKKyAgICAgICAgICAgIHdpdGggb3A6CisgICAgICAgICAgICAgICAgb3Auc2VuZG1zZ19hZmFsZyhvcD1zb2NrZXQuQUxHX09QX0VOQ1JZUFQsIGl2PWl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M9c29ja2V0Lk1TR19NT1JFKQorICAgICAgICAgICAgICAgIG9wLnNlbmRhbGwobXNnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3AucmVjdihtc2dsZW4pLCBjaXBoZXJ0ZXh0KQorCisgICAgICAgICAgICBvcCwgXyA9IGFsZ28uYWNjZXB0KCkKKyAgICAgICAgICAgIHdpdGggb3A6CisgICAgICAgICAgICAgICAgb3Auc2VuZG1zZ19hZmFsZyhbY2lwaGVydGV4dF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcD1zb2NrZXQuQUxHX09QX0RFQ1JZUFQsIGl2PWl2KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3AucmVjdihtc2dsZW4pLCBtc2cpCisKKyAgICAgICAgICAgICMgbG9uZyBtZXNzYWdlCisgICAgICAgICAgICBtdWx0aXBsaWVyID0gMTAyNAorICAgICAgICAgICAgbG9uZ21zZyA9IFttc2ddICogbXVsdGlwbGllcgorICAgICAgICAgICAgb3AsIF8gPSBhbGdvLmFjY2VwdCgpCisgICAgICAgICAgICB3aXRoIG9wOgorICAgICAgICAgICAgICAgIG9wLnNlbmRtc2dfYWZhbGcobG9uZ21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wPXNvY2tldC5BTEdfT1BfRU5DUllQVCwgaXY9aXYpCisgICAgICAgICAgICAgICAgZW5jID0gb3AucmVjdihtc2dsZW4gKiBtdWx0aXBsaWVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZW5jKSwgbXNnbGVuICogbXVsdGlwbGllcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbmNbOm1zZ2xlbl0sIGNpcGhlcnRleHQpCisKKyAgICAgICAgICAgIG9wLCBfID0gYWxnby5hY2NlcHQoKQorICAgICAgICAgICAgd2l0aCBvcDoKKyAgICAgICAgICAgICAgICBvcC5zZW5kbXNnX2FmYWxnKFtlbmNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3A9c29ja2V0LkFMR19PUF9ERUNSWVBULCBpdj1pdikKKyAgICAgICAgICAgICAgICBkZWMgPSBvcC5yZWN2KG1zZ2xlbiAqIG11bHRpcGxpZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkZWMpLCBtc2dsZW4gKiBtdWx0aXBsaWVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWMsIG1zZyAqIG11bHRpcGxpZXIpCisKKyAgICBAc3VwcG9ydC5yZXF1aXJlc19saW51eF92ZXJzaW9uKDMsIDE5KQorICAgIGRlZiB0ZXN0X2FlYWRfYWVzX2djbShzZWxmKToKKyAgICAgICAga2V5ID0gYnl0ZXMuZnJvbWhleCgnYzkzOWNjMTMzOTdjMWQzN2RlNmFlMGUxY2I3YzQyM2MnKQorICAgICAgICBpdiA9IGJ5dGVzLmZyb21oZXgoJ2IzZDhjYzAxN2NiYjg5YjM5ZTBmNjdlMicpCisgICAgICAgIHBsYWluID0gYnl0ZXMuZnJvbWhleCgnYzNiM2M0MWYxMTNhMzFiNzNkOWE1Y2Q0MzIxMDMwNjknKQorICAgICAgICBhc3NvYyA9IGJ5dGVzLmZyb21oZXgoJzI0ODI1NjAyYmQxMmE5ODRlMDA5MmQzZTQ0OGVkYTVmJykKKyAgICAgICAgZXhwZWN0ZWRfY3QgPSBieXRlcy5mcm9taGV4KCc5M2ZlN2Q5ZTliZmQxMDM0OGE1NjA2ZTVjYWZhNzM1NCcpCisgICAgICAgIGV4cGVjdGVkX3RhZyA9IGJ5dGVzLmZyb21oZXgoJzAwMzJhMWRjODVmMWM5Nzg2OTI1YTJlNzFkODI3MmRkJykKKworICAgICAgICB0YWdsZW4gPSBsZW4oZXhwZWN0ZWRfdGFnKQorICAgICAgICBhc3NvY2xlbiA9IGxlbihhc3NvYykKKworICAgICAgICB3aXRoIHNlbGYuY3JlYXRlX2FsZygnYWVhZCcsICdnY20oYWVzKScpIGFzIGFsZ286CisgICAgICAgICAgICBhbGdvLnNldHNvY2tvcHQoc29ja2V0LlNPTF9BTEcsIHNvY2tldC5BTEdfU0VUX0tFWSwga2V5KQorICAgICAgICAgICAgYWxnby5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfQUxHLCBzb2NrZXQuQUxHX1NFVF9BRUFEX0FVVEhTSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIHRhZ2xlbikKKworICAgICAgICAgICAgIyBzZW5kIGFzc29jLCBwbGFpbiBhbmQgdGFnIGJ1ZmZlciBpbiBzZXBhcmF0ZSBzdGVwcworICAgICAgICAgICAgb3AsIF8gPSBhbGdvLmFjY2VwdCgpCisgICAgICAgICAgICB3aXRoIG9wOgorICAgICAgICAgICAgICAgIG9wLnNlbmRtc2dfYWZhbGcob3A9c29ja2V0LkFMR19PUF9FTkNSWVBULCBpdj1pdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jbGVuPWFzc29jbGVuLCBmbGFncz1zb2NrZXQuTVNHX01PUkUpCisgICAgICAgICAgICAgICAgb3Auc2VuZGFsbChhc3NvYywgc29ja2V0Lk1TR19NT1JFKQorICAgICAgICAgICAgICAgIG9wLnNlbmRhbGwocGxhaW4sIHNvY2tldC5NU0dfTU9SRSkKKyAgICAgICAgICAgICAgICBvcC5zZW5kYWxsKGInXHgwMCcgKiB0YWdsZW4pCisgICAgICAgICAgICAgICAgcmVzID0gb3AucmVjdihhc3NvY2xlbiArIGxlbihwbGFpbikgKyB0YWdsZW4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9jdCwgcmVzW2Fzc29jbGVuOi10YWdsZW5dKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdGFnLCByZXNbLXRhZ2xlbjpdKQorCisgICAgICAgICAgICAjIG5vdyB3aXRoIG1zZworICAgICAgICAgICAgb3AsIF8gPSBhbGdvLmFjY2VwdCgpCisgICAgICAgICAgICB3aXRoIG9wOgorICAgICAgICAgICAgICAgIG1zZyA9IGFzc29jICsgcGxhaW4gKyBiJ1x4MDAnICogdGFnbGVuCisgICAgICAgICAgICAgICAgb3Auc2VuZG1zZ19hZmFsZyhbbXNnXSwgb3A9c29ja2V0LkFMR19PUF9FTkNSWVBULCBpdj1pdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jbGVuPWFzc29jbGVuKQorICAgICAgICAgICAgICAgIHJlcyA9IG9wLnJlY3YoYXNzb2NsZW4gKyBsZW4ocGxhaW4pICsgdGFnbGVuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfY3QsIHJlc1thc3NvY2xlbjotdGFnbGVuXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3RhZywgcmVzWy10YWdsZW46XSkKKworICAgICAgICAgICAgIyBjcmVhdGUgYW5jIGRhdGEgbWFudWFsbHkKKyAgICAgICAgICAgIHBhY2tfdWludDMyID0gc3RydWN0LlN0cnVjdCgnSScpLnBhY2sKKyAgICAgICAgICAgIG9wLCBfID0gYWxnby5hY2NlcHQoKQorICAgICAgICAgICAgd2l0aCBvcDoKKyAgICAgICAgICAgICAgICBtc2cgPSBhc3NvYyArIHBsYWluICsgYidceDAwJyAqIHRhZ2xlbgorICAgICAgICAgICAgICAgIG9wLnNlbmRtc2coCisgICAgICAgICAgICAgICAgICAgIFttc2ddLAorICAgICAgICAgICAgICAgICAgICAoW3NvY2tldC5TT0xfQUxHLCBzb2NrZXQuQUxHX1NFVF9PUCwgcGFja191aW50MzIoc29ja2V0LkFMR19PUF9FTkNSWVBUKV0sCisgICAgICAgICAgICAgICAgICAgICBbc29ja2V0LlNPTF9BTEcsIHNvY2tldC5BTEdfU0VUX0lWLCBwYWNrX3VpbnQzMihsZW4oaXYpKSArIGl2XSwKKyAgICAgICAgICAgICAgICAgICAgIFtzb2NrZXQuU09MX0FMRywgc29ja2V0LkFMR19TRVRfQUVBRF9BU1NPQ0xFTiwgcGFja191aW50MzIoYXNzb2NsZW4pXSwKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICByZXMgPSBvcC5yZWN2KGxlbihtc2cpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfY3QsIHJlc1thc3NvY2xlbjotdGFnbGVuXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3RhZywgcmVzWy10YWdsZW46XSkKKworICAgICAgICAgICAgIyBkZWNyeXB0IGFuZCB2ZXJpZnkKKyAgICAgICAgICAgIG9wLCBfID0gYWxnby5hY2NlcHQoKQorICAgICAgICAgICAgd2l0aCBvcDoKKyAgICAgICAgICAgICAgICBtc2cgPSBhc3NvYyArIGV4cGVjdGVkX2N0ICsgZXhwZWN0ZWRfdGFnCisgICAgICAgICAgICAgICAgb3Auc2VuZG1zZ19hZmFsZyhbbXNnXSwgb3A9c29ja2V0LkFMR19PUF9ERUNSWVBULCBpdj1pdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jbGVuPWFzc29jbGVuKQorICAgICAgICAgICAgICAgIHJlcyA9IG9wLnJlY3YobGVuKG1zZykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGFpbiwgcmVzW2Fzc29jbGVuOi10YWdsZW5dKQorCisgICAgQHN1cHBvcnQucmVxdWlyZXNfbGludXhfdmVyc2lvbigzLCAxOSkKKyAgICBkZWYgdGVzdF9kcmJnX3ByX3NoYTI1NihzZWxmKToKKyAgICAgICAgIyBkZXRlcm1pbmlzdGljIHJhbmRvbSBiaXQgZ2VuZXJhdG9yLCBwcmVkaWN0aW9uIHJlc2lzdGFuY2UsIHNoYTI1NgorICAgICAgICB3aXRoIHNlbGYuY3JlYXRlX2FsZygncm5nJywgJ2RyYmdfcHJfc2hhMjU2JykgYXMgYWxnbzoKKyAgICAgICAgICAgIGV4dHJhX3NlZWQgPSBvcy51cmFuZG9tKDMyKQorICAgICAgICAgICAgYWxnby5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfQUxHLCBzb2NrZXQuQUxHX1NFVF9LRVksIGV4dHJhX3NlZWQpCisgICAgICAgICAgICBvcCwgXyA9IGFsZ28uYWNjZXB0KCkKKyAgICAgICAgICAgIHdpdGggb3A6CisgICAgICAgICAgICAgICAgcm4gPSBvcC5yZWN2KDMyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJuKSwgMzIpCisKKyAgICBkZWYgdGVzdF9zZW5kbXNnX2FmYWxnX2FyZ3Moc2VsZik6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9BTEcsIHNvY2tldC5TT0NLX1NFUVBBQ0tFVCwgMCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc29jay5zZW5kbXNnX2FmYWxnKCkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBzb2NrLnNlbmRtc2dfYWZhbGcob3A9Tm9uZSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBzb2NrLnNlbmRtc2dfYWZhbGcoMSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBzb2NrLnNlbmRtc2dfYWZhbGcob3A9c29ja2V0LkFMR19PUF9FTkNSWVBULCBhc3NvY2xlbj1Ob25lKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNvY2suc2VuZG1zZ19hZmFsZyhvcD1zb2NrZXQuQUxHX09QX0VOQ1JZUFQsIGFzc29jbGVuPS0xKQorCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdHMgPSBbR2VuZXJhbE1vZHVsZVRlc3RzLCBCYXNpY1RDUFRlc3QsIFRDUENsb3NlclRlc3QsIFRDUFRpbWVvdXRUZXN0LAogICAgICAgICAgICAgIFRlc3RFeGNlcHRpb25zLCBCdWZmZXJJT1Rlc3QsIEJhc2ljVENQVGVzdDIsIEJhc2ljVURQVGVzdCwgVURQVGltZW91dFRlc3QgXQpAQCAtNTMyNSw2ICs1NTM1LDcgQEAKICAgICB0ZXN0cy5leHRlbmQoW1RJUENUZXN0LCBUSVBDVGhyZWFkYWJsZVRlc3RdKQogICAgIHRlc3RzLmV4dGVuZChbQmFzaWNDQU5UZXN0LCBDQU5UZXN0XSkKICAgICB0ZXN0cy5leHRlbmQoW0Jhc2ljUkRTVGVzdCwgUkRTVGVzdF0pCisgICAgdGVzdHMuYXBwZW5kKExpbnV4S2VybmVsQ3J5cHRvQVBJKQogICAgIHRlc3RzLmV4dGVuZChbCiAgICAgICAgIENtc2dNYWNyb1Rlc3RzLAogICAgICAgICBTZW5kbXNnVURQVGVzdCwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKaW5kZXggMGQwZjg2Zi4uM2Y0ZGZhMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKQEAgLTMsMTIgKzMsMTEgQEAKICIiIgogCiBpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IGlvCiBpbXBvcnQgb3MKIGltcG9ydCBzZWxlY3QKIGltcG9ydCBzaWduYWwKIGltcG9ydCBzb2NrZXQKLWltcG9ydCBzZWxlY3QKLWltcG9ydCBlcnJubwogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzb2NrZXRzZXJ2ZXIKQEAgLTQ2LDcgKzQ1LDcgQEAKICAgICBlbHNlOgogICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoInRpbWVkIG91dCBvbiAlciIgJSAoc29jaywpKQogCi1pZiBIQVZFX1VOSVhfU09DS0VUUzoKK2lmIEhBVkVfVU5JWF9TT0NLRVRTIGFuZCBIQVZFX0ZPUktJTkc6CiAgICAgY2xhc3MgRm9ya2luZ1VuaXhTdHJlYW1TZXJ2ZXIoc29ja2V0c2VydmVyLkZvcmtpbmdNaXhJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRzZXJ2ZXIuVW5peFN0cmVhbVNlcnZlcik6CiAgICAgICAgIHBhc3MKQEAgLTU4LDYgKzU3LDcgQEAKIAogQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKIGRlZiBzaW1wbGVfc3VicHJvY2Vzcyh0ZXN0Y2FzZSk6CisgICAgIiIiVGVzdHMgdGhhdCBhIGN1c3RvbSBjaGlsZCBwcm9jZXNzIGlzIG5vdCB3YWl0ZWQgb24gKElzc3VlIDE1NDAzODYpIiIiCiAgICAgcGlkID0gb3MuZm9yaygpCiAgICAgaWYgcGlkID09IDA6CiAgICAgICAgICMgRG9uJ3QgcmFpc2UgYW4gZXhjZXB0aW9uOyBpdCB3b3VsZCBiZSBjYXVnaHQgYnkgdGhlIHRlc3QgaGFybmVzcy4KQEAgLTEwMyw3ICsxMDMsNiBAQAogICAgICAgICBjbGFzcyBNeVNlcnZlcihzdnJjbHMpOgogICAgICAgICAgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CiAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZV9yZXF1ZXN0KHJlcXVlc3QpCi0gICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfY2xvc2UoKQogICAgICAgICAgICAgICAgIHJhaXNlCiAKICAgICAgICAgY2xhc3MgTXlIYW5kbGVyKGhkbHJiYXNlKToKQEAgLTI3OSw2ICsyNzgsMTgyIEBACiAgICAgICAgICAgICAgICAgc29ja2V0c2VydmVyLlRDUFNlcnZlcigoSE9TVCwgLTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKQogCisgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyKHNlbGYpOgorICAgICAgICB3aXRoIHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKEhPU1QsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKSBhcyBzZXJ2ZXI6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIHNlcnZlci5zb2NrZXQuZmlsZW5vKCkpCisKKworY2xhc3MgRXJyb3JIYW5kbGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IHRoZSBzZXJ2ZXJzIHBhc3Mgbm9ybWFsIGV4Y2VwdGlvbnMgZnJvbSB0aGUgaGFuZGxlciB0bworICAgIGhhbmRsZV9lcnJvcigpLCBhbmQgdGhhdCBleGl0aW5nIGV4Y2VwdGlvbnMgbGlrZSBTeXN0ZW1FeGl0IGFuZAorICAgIEtleWJvYXJkSW50ZXJydXB0IGFyZSBub3QgcGFzc2VkLiIiIgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0LnN1cHBvcnQudW5saW5rKHRlc3Quc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9zeW5jX2hhbmRsZWQoc2VsZik6CisgICAgICAgIEJhc2VFcnJvclRlc3RTZXJ2ZXIoVmFsdWVFcnJvcikKKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHQoaGFuZGxlZD1UcnVlKQorCisgICAgZGVmIHRlc3Rfc3luY19ub3RfaGFuZGxlZChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIEJhc2VFcnJvclRlc3RTZXJ2ZXIoU3lzdGVtRXhpdCkKKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHQoaGFuZGxlZD1GYWxzZSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCisgICAgZGVmIHRlc3RfdGhyZWFkaW5nX2hhbmRsZWQoc2VsZik6CisgICAgICAgIFRocmVhZGluZ0Vycm9yVGVzdFNlcnZlcihWYWx1ZUVycm9yKQorICAgICAgICBzZWxmLmNoZWNrX3Jlc3VsdChoYW5kbGVkPVRydWUpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIGRlZiB0ZXN0X3RocmVhZGluZ19ub3RfaGFuZGxlZChzZWxmKToKKyAgICAgICAgVGhyZWFkaW5nRXJyb3JUZXN0U2VydmVyKFN5c3RlbUV4aXQpCisgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0KGhhbmRsZWQ9RmFsc2UpCisKKyAgICBAcmVxdWlyZXNfZm9ya2luZworICAgIGRlZiB0ZXN0X2ZvcmtpbmdfaGFuZGxlZChzZWxmKToKKyAgICAgICAgRm9ya2luZ0Vycm9yVGVzdFNlcnZlcihWYWx1ZUVycm9yKQorICAgICAgICBzZWxmLmNoZWNrX3Jlc3VsdChoYW5kbGVkPVRydWUpCisKKyAgICBAcmVxdWlyZXNfZm9ya2luZworICAgIGRlZiB0ZXN0X2Zvcmtpbmdfbm90X2hhbmRsZWQoc2VsZik6CisgICAgICAgIEZvcmtpbmdFcnJvclRlc3RTZXJ2ZXIoU3lzdGVtRXhpdCkKKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHQoaGFuZGxlZD1GYWxzZSkKKworICAgIGRlZiBjaGVja19yZXN1bHQoc2VsZiwgaGFuZGxlZCk6CisgICAgICAgIHdpdGggb3Blbih0ZXN0LnN1cHBvcnQuVEVTVEZOKSBhcyBsb2c6CisgICAgICAgICAgICBleHBlY3RlZCA9ICdIYW5kbGVyIGNhbGxlZFxuJyArICdFcnJvciBoYW5kbGVkXG4nICogaGFuZGxlZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2cucmVhZCgpLCBleHBlY3RlZCkKKworCitjbGFzcyBCYXNlRXJyb3JUZXN0U2VydmVyKHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleGNlcHRpb24pOgorICAgICAgICBzZWxmLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKChIT1NULCAwKSwgQmFkSGFuZGxlcikKKyAgICAgICAgd2l0aCBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oc2VsZi5zZXJ2ZXJfYWRkcmVzcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfY2xvc2UoKQorICAgICAgICBzZWxmLndhaXRfZG9uZSgpCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Quc3VwcG9ydC5URVNURk4sICdhJykgYXMgbG9nOgorICAgICAgICAgICAgbG9nLndyaXRlKCdFcnJvciBoYW5kbGVkXG4nKQorCisgICAgZGVmIHdhaXRfZG9uZShzZWxmKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIEJhZEhhbmRsZXIoc29ja2V0c2VydmVyLkJhc2VSZXF1ZXN0SGFuZGxlcik6CisgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Quc3VwcG9ydC5URVNURk4sICdhJykgYXMgbG9nOgorICAgICAgICAgICAgbG9nLndyaXRlKCdIYW5kbGVyIGNhbGxlZFxuJykKKyAgICAgICAgcmFpc2Ugc2VsZi5zZXJ2ZXIuZXhjZXB0aW9uKCdUZXN0IGVycm9yJykKKworCitjbGFzcyBUaHJlYWRpbmdFcnJvclRlc3RTZXJ2ZXIoc29ja2V0c2VydmVyLlRocmVhZGluZ01peEluLAorICAgICAgICBCYXNlRXJyb3JUZXN0U2VydmVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKnBvcywgKiprdyk6CisgICAgICAgIHNlbGYuZG9uZSA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHN1cGVyKCkuX19pbml0X18oKnBvcywgKiprdykKKworICAgIGRlZiBzaHV0ZG93bl9yZXF1ZXN0KHNlbGYsICpwb3MsICoqa3cpOgorICAgICAgICBzdXBlcigpLnNodXRkb3duX3JlcXVlc3QoKnBvcywgKiprdykKKyAgICAgICAgc2VsZi5kb25lLnNldCgpCisKKyAgICBkZWYgd2FpdF9kb25lKHNlbGYpOgorICAgICAgICBzZWxmLmRvbmUud2FpdCgpCisKKworaWYgSEFWRV9GT1JLSU5HOgorICAgIGNsYXNzIEZvcmtpbmdFcnJvclRlc3RTZXJ2ZXIoc29ja2V0c2VydmVyLkZvcmtpbmdNaXhJbiwgQmFzZUVycm9yVGVzdFNlcnZlcik6CisgICAgICAgIGRlZiB3YWl0X2RvbmUoc2VsZik6CisgICAgICAgICAgICBbY2hpbGRdID0gc2VsZi5hY3RpdmVfY2hpbGRyZW4KKyAgICAgICAgICAgIG9zLndhaXRwaWQoY2hpbGQsIDApCisgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5jbGVhcigpCisKKworY2xhc3MgU29ja2V0V3JpdGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgorICAgICAgICBjbGFzcyBIYW5kbGVyKHNvY2tldHNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlcik6CisgICAgICAgICAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLndmaWxlID0gc2VsZi53ZmlsZQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLndmaWxlX2ZpbGVubyA9IHNlbGYud2ZpbGUuZmlsZW5vKCkKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5yZXF1ZXN0X2ZpbGVubyA9IHNlbGYucmVxdWVzdC5maWxlbm8oKQorCisgICAgICAgIHNlcnZlciA9IHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKEhPU1QsIDApLCBIYW5kbGVyKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VydmVyLnNlcnZlcl9jbG9zZSkKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoCisgICAgICAgICAgICBzZXJ2ZXIuYWRkcmVzc19mYW1pbHksIHNvY2tldC5TT0NLX1NUUkVBTSwgc29ja2V0LklQUFJPVE9fVENQKQorICAgICAgICB3aXRoIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VydmVyLnNlcnZlcl9hZGRyZXNzKQorICAgICAgICBzZXJ2ZXIuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VydmVyLndmaWxlLCBpby5CdWZmZXJlZElPQmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2ZXIud2ZpbGVfZmlsZW5vLCBzZXJ2ZXIucmVxdWVzdF9maWxlbm8pCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIGRlZiB0ZXN0X3dyaXRlKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB3ZmlsZS53cml0ZSgpIHNlbmRzIGRhdGEgaW1tZWRpYXRlbHksIGFuZCB0aGF0IGl0IGRvZXMKKyAgICAgICAgIyBub3QgdHJ1bmNhdGUgc2VuZHMgd2hlbiBpbnRlcnJ1cHRlZCBieSBhIFVuaXggc2lnbmFsCisgICAgICAgIHB0aHJlYWRfa2lsbCA9IHRlc3Quc3VwcG9ydC5nZXRfYXR0cmlidXRlKHNpZ25hbCwgJ3B0aHJlYWRfa2lsbCcpCisKKyAgICAgICAgY2xhc3MgSGFuZGxlcihzb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5zZW50MSA9IHNlbGYud2ZpbGUud3JpdGUoYid3cml0ZSBkYXRhXG4nKQorICAgICAgICAgICAgICAgICMgU2hvdWxkIGJlIHNlbnQgaW1tZWRpYXRlbHksIHdpdGhvdXQgcmVxdWlyaW5nIGZsdXNoKCkKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5yZWNlaXZlZCA9IHNlbGYucmZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGJpZ19jaHVuayA9IGJ5dGVzKHRlc3Quc3VwcG9ydC5TT0NLX01BWF9TSVpFKQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLnNlbnQyID0gc2VsZi53ZmlsZS53cml0ZShiaWdfY2h1bmspCisKKyAgICAgICAgc2VydmVyID0gc29ja2V0c2VydmVyLlRDUFNlcnZlcigoSE9TVCwgMCksIEhhbmRsZXIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXJ2ZXIuc2VydmVyX2Nsb3NlKQorICAgICAgICBpbnRlcnJ1cHRlZCA9IHRocmVhZGluZy5FdmVudCgpCisKKyAgICAgICAgZGVmIHNpZ25hbF9oYW5kbGVyKHNpZ251bSwgZnJhbWUpOgorICAgICAgICAgICAgaW50ZXJydXB0ZWQuc2V0KCkKKworICAgICAgICBvcmlnaW5hbCA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIHNpZ25hbF9oYW5kbGVyKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2lnbmFsLnNpZ25hbCwgc2lnbmFsLlNJR1VTUjEsIG9yaWdpbmFsKQorICAgICAgICByZXNwb25zZTEgPSBOb25lCisgICAgICAgIHJlY2VpdmVkMiA9IE5vbmUKKyAgICAgICAgbWFpbl90aHJlYWQgPSB0aHJlYWRpbmcuZ2V0X2lkZW50KCkKKworICAgICAgICBkZWYgcnVuX2NsaWVudCgpOgorICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc2VydmVyLmFkZHJlc3NfZmFtaWx5LCBzb2NrZXQuU09DS19TVFJFQU0sCisgICAgICAgICAgICAgICAgc29ja2V0LklQUFJPVE9fVENQKQorICAgICAgICAgICAgd2l0aCBzLCBzLm1ha2VmaWxlKCdyYicpIGFzIHJlYWRlcjoKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3Qoc2VydmVyLnNlcnZlcl9hZGRyZXNzKQorICAgICAgICAgICAgICAgIG5vbmxvY2FsIHJlc3BvbnNlMQorICAgICAgICAgICAgICAgIHJlc3BvbnNlMSA9IHJlYWRlci5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgcy5zZW5kYWxsKGInY2xpZW50IHJlc3BvbnNlXG4nKQorCisgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWQoMTAwKQorICAgICAgICAgICAgICAgICMgVGhlIG1haW4gdGhyZWFkIHNob3VsZCBub3cgYmUgYmxvY2tpbmcgaW4gYSBzZW5kKCkgc3lzY2FsbC4KKyAgICAgICAgICAgICAgICAjIEJ1dCBpbiB0aGVvcnksIGl0IGNvdWxkIGdldCBpbnRlcnJ1cHRlZCBieSBvdGhlciBzaWduYWxzLAorICAgICAgICAgICAgICAgICMgYW5kIHRoZW4gcmV0cmllZC4gU28ga2VlcCBzZW5kaW5nIHRoZSBzaWduYWwgaW4gYSBsb29wLCBpbgorICAgICAgICAgICAgICAgICMgY2FzZSBhbiBlYXJsaWVyIHNpZ25hbCBoYXBwZW5zIHRvIGJlIGRlbGl2ZXJlZCBhdCBhbgorICAgICAgICAgICAgICAgICMgaW5jb252ZW5pZW50IG1vbWVudC4KKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2tpbGwobWFpbl90aHJlYWQsIHNpZ25hbC5TSUdVU1IxKQorICAgICAgICAgICAgICAgICAgICBpZiBpbnRlcnJ1cHRlZC53YWl0KHRpbWVvdXQ9ZmxvYXQoMSkpOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBub25sb2NhbCByZWNlaXZlZDIKKyAgICAgICAgICAgICAgICByZWNlaXZlZDIgPSBsZW4ocmVhZGVyLnJlYWQoKSkKKworICAgICAgICBiYWNrZ3JvdW5kID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuX2NsaWVudCkKKyAgICAgICAgYmFja2dyb3VuZC5zdGFydCgpCisgICAgICAgIHNlcnZlci5oYW5kbGVfcmVxdWVzdCgpCisgICAgICAgIGJhY2tncm91bmQuam9pbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLnNlbnQxLCBsZW4ocmVzcG9uc2UxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZTEsIGInd3JpdGUgZGF0YVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2ZXIucmVjZWl2ZWQsIGInY2xpZW50IHJlc3BvbnNlXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci5zZW50MiwgdGVzdC5zdXBwb3J0LlNPQ0tfTUFYX1NJWkUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjZWl2ZWQyLCB0ZXN0LnN1cHBvcnQuU09DS19NQVhfU0laRSAtIDEwMCkKKwogCiBjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3NvcnQucHkKaW5kZXggYTVkMGViZi4uOThjY2FiNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ydC5weQpAQCAtMSw2ICsxLDUgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogaW1wb3J0IHJhbmRvbQotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGZ1bmN0b29scyBpbXBvcnQgY21wX3RvX2tleQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Nwd2QucHkgYi9MaWIvdGVzdC90ZXN0X3Nwd2QucHkKaW5kZXggYmVhN2FiMS4uZTg5M2YzYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zcHdkLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3B3ZC5weQpAQCAtNTYsNSArNTYsMjAgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3B3ZC5nZXRzcG5hbSwgYnl0ZXNfbmFtZSkKIAogCitAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnZ2V0ZXVpZCcpIGFuZCBvcy5nZXRldWlkKCkgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICdub24tcm9vdCB1c2VyIHJlcXVpcmVkJykKK2NsYXNzIFRlc3RTcHdkTm9uUm9vdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9nZXRzcG5hbV9leGNlcHRpb24oc2VsZik6CisgICAgICAgIG5hbWUgPSAnYmluJworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFBlcm1pc3Npb25FcnJvcikgYXMgY206CisgICAgICAgICAgICAgICAgc3B3ZC5nZXRzcG5hbShuYW1lKQorICAgICAgICBleGNlcHQgS2V5RXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgic3B3ZCBlbnRyeSAlciBkb2Vzbid0IGV4aXN0OiAlcyIgJSAobmFtZSwgZXhjKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICdbRXJybm8gMTNdIFBlcm1pc3Npb24gZGVuaWVkJykKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zc2wucHkgYi9MaWIvdGVzdC90ZXN0X3NzbC5weQppbmRleCAwZjRmYWEwLi4wYmRiODZkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NzbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NzbC5weQpAQCAtMjEsNiArMjEsMTMgQEAKIAogc3NsID0gc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCJzc2wiKQogCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF9oYXZlX3RocmVhZHMgPSBGYWxzZQorZWxzZToKKyAgICBfaGF2ZV90aHJlYWRzID0gVHJ1ZQorCiBQUk9UT0NPTFMgPSBzb3J0ZWQoc3NsLl9QUk9UT0NPTF9OQU1FUykKIEhPU1QgPSBzdXBwb3J0LkhPU1QKIElTX0xJQlJFU1NMID0gc3NsLk9QRU5TU0xfVkVSU0lPTi5zdGFydHN3aXRoKCdMaWJyZVNTTCcpCkBAIC01NiwxMiArNjMsMTIgQEAKICMgVHdvIGtleXMgYW5kIGNlcnRzIHNpZ25lZCBieSB0aGUgc2FtZSBDQSAoZm9yIFNOSSB0ZXN0cykKIFNJR05FRF9DRVJURklMRSA9IGRhdGFfZmlsZSgia2V5Y2VydDMucGVtIikKIFNJR05FRF9DRVJURklMRTIgPSBkYXRhX2ZpbGUoImtleWNlcnQ0LnBlbSIpCi1TSUdOSU5HX0NBID0gZGF0YV9maWxlKCJweWNhY2VydC5wZW0iKQorIyBTYW1lIGNlcnRpZmljYXRlIGFzIHB5Y2FjZXJ0LnBlbSwgYnV0IHdpdGhvdXQgZXh0cmEgdGV4dCBpbiBmaWxlCitTSUdOSU5HX0NBID0gZGF0YV9maWxlKCJjYXBhdGgiLCAiY2VmZjE3MTAuMCIpCiAjIGNlcnQgd2l0aCBhbGwga2luZHMgb2Ygc3ViamVjdCBhbHQgbmFtZXMKIEFMTFNBTkZJTEUgPSBkYXRhX2ZpbGUoImFsbHNhbnMucGVtIikKIAogUkVNT1RFX0hPU1QgPSAic2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQiCi1SRU1PVEVfUk9PVF9DRVJUID0gZGF0YV9maWxlKCJzZWxmc2lnbmVkX3B5dGhvbnRlc3Rkb3RuZXQucGVtIikKIAogRU1QVFlDRVJUID0gZGF0YV9maWxlKCJudWxsY2VydC5wZW0iKQogQkFEQ0VSVCA9IGRhdGFfZmlsZSgiYmFkY2VydC5wZW0iKQpAQCAtMzU0LDcgKzM2MSw3IEBACiAgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoc3MpCiAgICAgICAgIHdpdGggc3VwcG9ydC5jaGVja193YXJuaW5ncygoIiIsIFJlc291cmNlV2FybmluZykpOgogICAgICAgICAgICAgZGVsIHNzCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3IoKSwgTm9uZSkKIAogICAgIGRlZiB0ZXN0X3dyYXBwZWRfdW5jb25uZWN0ZWQoc2VsZik6CiAgICAgICAgICMgTWV0aG9kcyBvbiBhbiB1bmNvbm5lY3RlZCBTU0xTb2NrZXQgcHJvcGFnYXRlIHRoZSBvcmlnaW5hbApAQCAtODA5LDYgKzgxNiwyMiBAQAogICAgICAgICBzZWxmLmNlcnRfdGltZV9vaygiRmViICA5IDAwOjAwOjAwIDIwMDcgR01UIiwgMTE3MDk3OTIwMC4wKQogICAgICAgICBzZWxmLmNlcnRfdGltZV9mYWlsKGxvY2FsX2ZlYnJ1YXJ5X25hbWUoKSArICIgIDkgMDA6MDA6MDAgMjAwNyBHTVQiKQogCisgICAgZGVmIHRlc3RfY29ubmVjdF9leF9lcnJvcihzZWxmKToKKyAgICAgICAgc2VydmVyID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlcnZlci5jbG9zZSkKKyAgICAgICAgcG9ydCA9IHN1cHBvcnQuYmluZF9wb3J0KHNlcnZlcikgICMgUmVzZXJ2ZSBwb3J0IGJ1dCBkb24ndCBsaXN0ZW4KKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoSE9TVCwgcG9ydCkpCisgICAgICAgICMgSXNzdWUgIzE5OTE5OiBXaW5kb3dzIG1hY2hpbmVzIG9yIFZNcyBob3N0ZWQgb24gV2luZG93cworICAgICAgICAjIG1hY2hpbmVzIHNvbWV0aW1lcyByZXR1cm4gRVdPVUxEQkxPQ0suCisgICAgICAgIGVycm9ycyA9ICgKKyAgICAgICAgICAgIGVycm5vLkVDT05OUkVGVVNFRCwgZXJybm8uRUhPU1RVTlJFQUNILCBlcnJuby5FVElNRURPVVQsCisgICAgICAgICAgICBlcnJuby5FV09VTERCTE9DSywKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEluKHJjLCBlcnJvcnMpCisKIAogY2xhc3MgQ29udGV4dFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtODM0LDYgKzg1NywxNCBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoc3NsLlNTTEVycm9yLCAiTm8gY2lwaGVyIGNhbiBiZSBzZWxlY3RlZCIpOgogICAgICAgICAgICAgY3R4LnNldF9jaXBoZXJzKCJeJDosOz8qJ2Rvcm90aHl4IikKIAorICAgIEB1bml0dGVzdC5za2lwSWYoc3NsLk9QRU5TU0xfVkVSU0lPTl9JTkZPIDwgKDEsIDAsIDIsIDAsIDApLCAnT3BlblNTTCB0b28gb2xkJykKKyAgICBkZWYgdGVzdF9nZXRfY2lwaGVycyhzZWxmKToKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1RMU3YxKQorICAgICAgICBjdHguc2V0X2NpcGhlcnMoJ0FFU0dDTScpCisgICAgICAgIG5hbWVzID0gc2V0KGRbJ25hbWUnXSBmb3IgZCBpbiBjdHguZ2V0X2NpcGhlcnMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQUVTMjU2LUdDTS1TSEEzODQnLCBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQUVTMTI4LUdDTS1TSEEyNTYnLCBuYW1lcykKKwogICAgIEBza2lwX2lmX2Jyb2tlbl91YnVudHVfc3NsCiAgICAgZGVmIHRlc3Rfb3B0aW9ucyhzZWxmKToKICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1RMU3YxKQpAQCAtMTM5NywxNDAgKzE0MjgsMTAzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmlvLndyaXRlLCAxKQogCiAKLWNsYXNzIE5ldHdvcmtlZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKK0B1bml0dGVzdC5za2lwVW5sZXNzKF9oYXZlX3RocmVhZHMsICJOZWVkcyB0aHJlYWRpbmcgbW9kdWxlIikKK2NsYXNzIFNpbXBsZUJhY2tncm91bmRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJUZXN0cyB0aGF0IGNvbm5lY3QgdG8gYSBzaW1wbGUgc2VydmVyIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VydmVyID0gVGhyZWFkZWRFY2hvU2VydmVyKFNJR05FRF9DRVJURklMRSkKKyAgICAgICAgc2VsZi5zZXJ2ZXJfYWRkciA9IChIT1NULCBzZXJ2ZXIucG9ydCkKKyAgICAgICAgc2VydmVyLl9fZW50ZXJfXygpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXJ2ZXIuX19leGl0X18sIE5vbmUsIE5vbmUsIE5vbmUpCiAKICAgICBkZWYgdGVzdF9jb25uZWN0KHNlbGYpOgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7fSwgcy5nZXRwZWVyY2VydCgpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgd2l0aCBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHMuZ2V0cGVlcmNlcnQoKSkKIAotICAgICAgICAgICAgIyB0aGlzIHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgaGF2ZSBubyB2ZXJpZmljYXRpb24gY2VydHMKLSAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoc3NsLlNTTEVycm9yLCAiY2VydGlmaWNhdGUgdmVyaWZ5IGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ubmVjdCwgKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgICMgdGhpcyBzaG91bGQgc3VjY2VlZCBiZWNhdXNlIHdlIHNwZWNpZnkgdGhlIHJvb3QgY2VydAorICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U0lHTklOR19DQSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKIAotICAgICAgICAgICAgIyB0aGlzIHNob3VsZCBzdWNjZWVkIGJlY2F1c2Ugd2Ugc3BlY2lmeSB0aGUgcm9vdCBjZXJ0Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVJFTU9URV9ST09UX0NFUlQpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICBkZWYgdGVzdF9jb25uZWN0X2ZhaWwoc2VsZik6CisgICAgICAgICMgVGhpcyBzaG91bGQgZmFpbCBiZWNhdXNlIHdlIGhhdmUgbm8gdmVyaWZpY2F0aW9uIGNlcnRzLiBDb25uZWN0aW9uCisgICAgICAgICMgZmFpbHVyZSBjcmFzaGVzIFRocmVhZGVkRWNob1NlcnZlciwgc28gcnVuIHRoaXMgaW4gYW4gaW5kZXBlbmRlbnQKKyAgICAgICAgIyB0ZXN0IG1ldGhvZC4KKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgImNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ubmVjdCwgc2VsZi5zZXJ2ZXJfYWRkcikKIAogICAgIGRlZiB0ZXN0X2Nvbm5lY3RfZXgoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzExMzI2OiBjaGVjayBjb25uZWN0X2V4KCkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVJFTU9URV9ST09UX0NFUlQpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzLmNvbm5lY3RfZXgoKFJFTU9URV9IT1NULCA0NDMpKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U0lHTklOR19DQSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHMuY2xvc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcy5jb25uZWN0X2V4KHNlbGYuc2VydmVyX2FkZHIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQogCiAgICAgZGVmIHRlc3Rfbm9uX2Jsb2NraW5nX2Nvbm5lY3RfZXgoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzExMzI2OiBub24tYmxvY2tpbmcgY29ubmVjdF9leCgpIHNob3VsZCBhbGxvdyBoYW5kc2hha2UKICAgICAgICAgIyB0byBwcm9jZWVkIGFmdGVyIHRoZSBzb2NrZXQgZ2V0cyByZWFkeS4KLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVJFTU9URV9ST09UX0NFUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1TSUdOSU5HX0NBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKKyAgICAgICAgcmMgPSBzLmNvbm5lY3RfZXgoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgIyBFV09VTERCTE9DSyB1bmRlciBXaW5kb3dzLCBFSU5QUk9HUkVTUyBlbHNld2hlcmUKKyAgICAgICAgc2VsZi5hc3NlcnRJbihyYywgKDAsIGVycm5vLkVJTlBST0dSRVNTLCBlcnJuby5FV09VTERCTE9DSykpCisgICAgICAgICMgV2FpdCBmb3IgY29ubmVjdCB0byBmaW5pc2gKKyAgICAgICAgc2VsZWN0LnNlbGVjdChbXSwgW3NdLCBbXSwgNS4wKQorICAgICAgICAjIE5vbi1ibG9ja2luZyBoYW5kc2hha2UKKyAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzLnNldGJsb2NraW5nKEZhbHNlKQotICAgICAgICAgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgICAgICAjIEVXT1VMREJMT0NLIHVuZGVyIFdpbmRvd3MsIEVJTlBST0dSRVNTIGVsc2V3aGVyZQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsICgwLCBlcnJuby5FSU5QUk9HUkVTUywgZXJybm8uRVdPVUxEQkxPQ0spKQotICAgICAgICAgICAgICAgICMgV2FpdCBmb3IgY29ubmVjdCB0byBmaW5pc2gKKyAgICAgICAgICAgICAgICBzLmRvX2hhbmRzaGFrZSgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMV2FudFJlYWRFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtzXSwgW10sIFtdLCA1LjApCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRXcml0ZUVycm9yOgogICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW10sIFtzXSwgW10sIDUuMCkKLSAgICAgICAgICAgICAgICAjIE5vbi1ibG9ja2luZyBoYW5kc2hha2UKLSAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLmRvX2hhbmRzaGFrZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRSZWFkRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtzXSwgW10sIFtdLCA1LjApCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMV2FudFdyaXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtdLCBbc10sIFtdLCA1LjApCi0gICAgICAgICAgICAgICAgIyBTU0wgZXN0YWJsaXNoZWQKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKLQotICAgIGRlZiB0ZXN0X3RpbWVvdXRfY29ubmVjdF9leChzZWxmKToKLSAgICAgICAgIyBJc3N1ZSAjMTIwNjU6IG9uIGEgdGltZW91dCwgY29ubmVjdF9leCgpIHNob3VsZCByZXR1cm4gdGhlIG9yaWdpbmFsCi0gICAgICAgICMgZXJybm8gKG1pbWlja2luZyB0aGUgYmVoYXZpb3VyIG9mIG5vbi1TU0wgc29ja2V0cykuCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1SRU1PVEVfUk9PVF9DRVJULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzLnNldHRpbWVvdXQoMC4wMDAwMDAxKQotICAgICAgICAgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgICAgICBpZiByYyA9PSAwOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJSRU1PVEVfSE9TVCByZXNwb25kZWQgdG9vIHF1aWNrbHkiKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsIChlcnJuby5FQUdBSU4sIGVycm5vLkVXT1VMREJMT0NLKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF9jb25uZWN0X2V4X2Vycm9yKHNlbGYpOgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9UkVNT1RFX1JPT1RfQ0VSVCkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoUkVNT1RFX0hPU1QsIDQ0NCkpCi0gICAgICAgICAgICAgICAgIyBJc3N1ZSAjMTk5MTk6IFdpbmRvd3MgbWFjaGluZXMgb3IgVk1zIGhvc3RlZCBvbiBXaW5kb3dzCi0gICAgICAgICAgICAgICAgIyBtYWNoaW5lcyBzb21ldGltZXMgcmV0dXJuIEVXT1VMREJMT0NLLgotICAgICAgICAgICAgICAgIGVycm9ycyA9ICgKLSAgICAgICAgICAgICAgICAgICAgZXJybm8uRUNPTk5SRUZVU0VELCBlcnJuby5FSE9TVFVOUkVBQ0gsIGVycm5vLkVUSU1FRE9VVCwKLSAgICAgICAgICAgICAgICAgICAgZXJybm8uRVdPVUxEQkxPQ0ssCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsIGVycm9ycykKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgICMgU1NMIGVzdGFibGlzaGVkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmdldHBlZXJjZXJ0KCkpCiAKICAgICBkZWYgdGVzdF9jb25uZWN0X3dpdGhfY29udGV4dChzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICAjIFNhbWUgYXMgdGVzdF9jb25uZWN0LCBidXQgd2l0aCBhIHNlcGFyYXRlbHkgY3JlYXRlZCBjb250ZXh0Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkKLSAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7fSwgcy5nZXRwZWVyY2VydCgpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKLSAgICAgICAgICAgICMgU2FtZSB3aXRoIGEgc2VydmVyIGhvc3RuYW1lCi0gICAgICAgICAgICBzID0gY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9UkVNT1RFX0hPU1QpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGZhaWwgYmVjYXVzZSB3ZSBoYXZlIG5vIHZlcmlmaWNhdGlvbiBjZXJ0cwotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgImNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0LCAoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICBzLmNsb3NlKCkKLSAgICAgICAgICAgICMgVGhpcyBzaG91bGQgc3VjY2VlZCBiZWNhdXNlIHdlIHNwZWNpZnkgdGhlIHJvb3QgY2VydAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhSRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkKLSAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgIyBTYW1lIGFzIHRlc3RfY29ubmVjdCwgYnV0IHdpdGggYSBzZXBhcmF0ZWx5IGNyZWF0ZWQgY29udGV4dAorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7fSwgcy5nZXRwZWVyY2VydCgpKQorICAgICAgICAjIFNhbWUgd2l0aCBhIHNlcnZlciBob3N0bmFtZQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9ImR1bW15IikgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICAjIFRoaXMgc2hvdWxkIHN1Y2NlZWQgYmVjYXVzZSB3ZSBzcGVjaWZ5IHRoZSByb290IGNlcnQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhTSUdOSU5HX0NBKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCisKKyAgICBkZWYgdGVzdF9jb25uZWN0X3dpdGhfY29udGV4dF9mYWlsKHNlbGYpOgorICAgICAgICAjIFRoaXMgc2hvdWxkIGZhaWwgYmVjYXVzZSB3ZSBoYXZlIG5vIHZlcmlmaWNhdGlvbiBjZXJ0cy4gQ29ubmVjdGlvbgorICAgICAgICAjIGZhaWx1cmUgY3Jhc2hlcyBUaHJlYWRlZEVjaG9TZXJ2ZXIsIHNvIHJ1biB0aGlzIGluIGFuIGluZGVwZW5kZW50CisgICAgICAgICMgdGVzdCBtZXRob2QuCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgImNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvbm5lY3QsIHNlbGYuc2VydmVyX2FkZHIpCiAKICAgICBkZWYgdGVzdF9jb25uZWN0X2NhcGF0aChzZWxmKToKICAgICAgICAgIyBWZXJpZnkgc2VydmVyIGNlcnRpZmljYXRlcyB1c2luZyB0aGUgYGNhcGF0aGAgYXJndW1lbnQKQEAgLTE1MzgsMTk4ICsxNTMyLDEzMCBAQAogICAgICAgICAjIE9wZW5TU0wgMC45LjhuIGFuZCAxLjAuMCwgYXMgYSByZXN1bHQgdGhlIGNhcGF0aCBkaXJlY3RvcnkgbXVzdAogICAgICAgICAjIGNvbnRhaW4gYm90aCB2ZXJzaW9ucyBvZiBlYWNoIGNlcnRpZmljYXRlIChzYW1lIGNvbnRlbnQsIGRpZmZlcmVudAogICAgICAgICAjIGZpbGVuYW1lKSBmb3IgdGhpcyB0ZXN0IHRvIGJlIHBvcnRhYmxlIGFjcm9zcyBPcGVuU1NMIHJlbGVhc2VzLgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYXBhdGg9Q0FQQVRIKQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkKLSAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKLSAgICAgICAgICAgICMgU2FtZSB3aXRoIGEgYnl0ZXMgYGNhcGF0aGAgYXJndW1lbnQKLSAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYXBhdGg9QllURVNfQ0FQQVRIKQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkKLSAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYXBhdGg9Q0FQQVRIKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCisgICAgICAgICMgU2FtZSB3aXRoIGEgYnl0ZXMgYGNhcGF0aGAgYXJndW1lbnQKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYXBhdGg9QllURVNfQ0FQQVRIKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCiAKICAgICBkZWYgdGVzdF9jb25uZWN0X2NhZGF0YShzZWxmKToKLSAgICAgICAgd2l0aCBvcGVuKFJFTU9URV9ST09UX0NFUlQpIGFzIGY6CisgICAgICAgIHdpdGggb3BlbihTSUdOSU5HX0NBKSBhcyBmOgogICAgICAgICAgICAgcGVtID0gZi5yZWFkKCkKICAgICAgICAgZGVyID0gc3NsLlBFTV9jZXJ0X3RvX0RFUl9jZXJ0KHBlbSkKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FkYXRhPXBlbSkKLSAgICAgICAgICAgIHdpdGggY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKSBhcyBzOgotICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhZGF0YT1wZW0pCisgICAgICAgIHdpdGggY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKSBhcyBzOgorICAgICAgICAgICAgcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgICAgICBjZXJ0ID0gcy5nZXRwZWVyY2VydCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKIAotICAgICAgICAgICAgIyBzYW1lIHdpdGggREVSCi0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FkYXRhPWRlcikKLSAgICAgICAgICAgIHdpdGggY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKSBhcyBzOgotICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorICAgICAgICAjIHNhbWUgd2l0aCBERVIKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYWRhdGE9ZGVyKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCiAKICAgICBAdW5pdHRlc3Quc2tpcElmKG9zLm5hbWUgPT0gIm50IiwgIkNhbid0IHVzZSBhIHNvY2tldCBhcyBhIGZpbGUgdW5kZXIgV2luZG93cyIpCiAgICAgZGVmIHRlc3RfbWFrZWZpbGVfY2xvc2Uoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzUyMzg6IGNyZWF0aW5nIGEgZmlsZS1saWtlIG9iamVjdCB3aXRoIG1ha2VmaWxlKCkgc2hvdWxkbid0CiAgICAgICAgICMgZGVsYXkgY2xvc2luZyB0aGUgdW5kZXJseWluZyAicmVhbCBzb2NrZXQiIChoZXJlIHRlc3RlZCB3aXRoIGl0cwogICAgICAgICAjIGZpbGUgZGVzY3JpcHRvciwgaGVuY2Ugc2tpcHBpbmcgdGhlIHRlc3QgdW5kZXIgV2luZG93cykuCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgc3MgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIGZkID0gc3MuZmlsZW5vKCkKLSAgICAgICAgICAgIGYgPSBzcy5tYWtlZmlsZSgpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgICMgVGhlIGZkIGlzIHN0aWxsIG9wZW4KKyAgICAgICAgc3MgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCisgICAgICAgIHNzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgZmQgPSBzcy5maWxlbm8oKQorICAgICAgICBmID0gc3MubWFrZWZpbGUoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgIyBUaGUgZmQgaXMgc3RpbGwgb3BlbgorICAgICAgICBvcy5yZWFkKGZkLCAwKQorICAgICAgICAjIENsb3NpbmcgdGhlIFNTTCBzb2NrZXQgc2hvdWxkIGNsb3NlIHRoZSBmZCB0b28KKyAgICAgICAgc3MuY2xvc2UoKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBlOgogICAgICAgICAgICAgb3MucmVhZChmZCwgMCkKLSAgICAgICAgICAgICMgQ2xvc2luZyB0aGUgU1NMIHNvY2tldCBzaG91bGQgY2xvc2UgdGhlIGZkIHRvbwotICAgICAgICAgICAgc3MuY2xvc2UoKQotICAgICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpIGFzIGU6Ci0gICAgICAgICAgICAgICAgb3MucmVhZChmZCwgMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5leGNlcHRpb24uZXJybm8sIGVycm5vLkVCQURGKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FQkFERikKIAogICAgIGRlZiB0ZXN0X25vbl9ibG9ja2luZ19oYW5kc2hha2Uoc2VsZik6Ci0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKLSAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQotICAgICAgICAgICAgY291bnQgPSAwCi0gICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMQotICAgICAgICAgICAgICAgICAgICBzLmRvX2hhbmRzaGFrZSgpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xXYW50UmVhZEVycm9yOgotICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtzXSwgW10sIFtdKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMV2FudFdyaXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW10sIFtzXSwgW10pCi0gICAgICAgICAgICBzLmNsb3NlKCkKLSAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbk5lZWRlZCAlZCBjYWxscyB0byBkb19oYW5kc2hha2UoKSB0byBlc3RhYmxpc2ggc2Vzc2lvbi5cbiIgJSBjb3VudCkKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICBzLnNldGJsb2NraW5nKEZhbHNlKQorICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9RmFsc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRSZWFkRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSkKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMV2FudFdyaXRlRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbXSwgW3NdLCBbXSkKKyAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5OZWVkZWQgJWQgY2FsbHMgdG8gZG9faGFuZHNoYWtlKCkgdG8gZXN0YWJsaXNoIHNlc3Npb24uXG4iICUgY291bnQpCiAKICAgICBkZWYgdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlKHNlbGYpOgotICAgICAgICBkZWYgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShob3N0LCBwb3J0LCBjZXJ0PU5vbmUpOgotICAgICAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChob3N0KToKLSAgICAgICAgICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCkpCi0gICAgICAgICAgICAgICAgaWYgbm90IHBlbToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBzZXJ2ZXIgY2VydGlmaWNhdGUgb24gJXM6JXMhIiAlIChob3N0LCBwb3J0KSkKKyAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShzZWxmLCAqc2VsZi5zZXJ2ZXJfYWRkciwgY2VydD1TSUdOSU5HX0NBKQogCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPUNFUlRGSUxFKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IgYXMgeDoKLSAgICAgICAgICAgICAgICAgICAgI3Nob3VsZCBmYWlsCi0gICAgICAgICAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiVzXG4iICUgeCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkdvdCBzZXJ2ZXIgY2VydGlmaWNhdGUgJXMgZm9yICVzOiVzISIgJSAocGVtLCBob3N0LCBwb3J0KSkKLQotICAgICAgICAgICAgICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKChob3N0LCBwb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1jZXJ0KQotICAgICAgICAgICAgICAgIGlmIG5vdCBwZW06Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gc2VydmVyIGNlcnRpZmljYXRlIG9uICVzOiVzISIgJSAoaG9zdCwgcG9ydCkpCi0gICAgICAgICAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgotICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcblZlcmlmaWVkIGNlcnRpZmljYXRlIGZvciAlczolcyBpc1xuJXNcbiIgJSAoaG9zdCwgcG9ydCAscGVtKSkKLQotICAgICAgICBfdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlKFJFTU9URV9IT1NULCA0NDMsIFJFTU9URV9ST09UX0NFUlQpCi0gICAgICAgIGlmIHN1cHBvcnQuSVBWNl9FTkFCTEVEOgotICAgICAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgnaXB2Ni5nb29nbGUuY29tJywgNDQzKQorICAgIGRlZiB0ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGVfZmFpbChzZWxmKToKKyAgICAgICAgIyBDb25uZWN0aW9uIGZhaWx1cmUgY3Jhc2hlcyBUaHJlYWRlZEVjaG9TZXJ2ZXIsIHNvIHJ1biB0aGlzIGluIGFuCisgICAgICAgICMgaW5kZXBlbmRlbnQgdGVzdCBtZXRob2QKKyAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZV9mYWlsKHNlbGYsICpzZWxmLnNlcnZlcl9hZGRyKQogCiAgICAgZGVmIHRlc3RfY2lwaGVycyhzZWxmKToKLSAgICAgICAgcmVtb3RlID0gKFJFTU9URV9IT1NULCA0NDMpCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQocmVtb3RlWzBdKToKLSAgICAgICAgICAgIHdpdGggc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9IkFMTCIpIGFzIHM6Ci0gICAgICAgICAgICAgICAgcy5jb25uZWN0KHJlbW90ZSkKLSAgICAgICAgICAgIHdpdGggc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9IkRFRkFVTFQiKSBhcyBzOgotICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCi0gICAgICAgICAgICAjIEVycm9yIGNoZWNraW5nIGNhbiBoYXBwZW4gYXQgaW5zdGFudGlhdGlvbiBvciB3aGVuIGNvbm5lY3RpbmcKLSAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChzc2wuU1NMRXJyb3IsICJObyBjaXBoZXIgY2FuIGJlIHNlbGVjdGVkIik6Ci0gICAgICAgICAgICAgICAgd2l0aCBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSBhcyBzb2NrOgotICAgICAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9Il4kOiw7PyonZG9yb3RoeXgiKQotICAgICAgICAgICAgICAgICAgICBzLmNvbm5lY3QocmVtb3RlKQotCi0gICAgZGVmIHRlc3RfYWxnb3JpdGhtcyhzZWxmKToKLSAgICAgICAgIyBJc3N1ZSAjODQ4NDogYWxsIGFsZ29yaXRobXMgc2hvdWxkIGJlIGF2YWlsYWJsZSB3aGVuIHZlcmlmeWluZyBhCi0gICAgICAgICMgY2VydGlmaWNhdGUuCi0gICAgICAgICMgU0hBMjU2IHdhcyBhZGRlZCBpbiBPcGVuU1NMIDAuOS44Ci0gICAgICAgIGlmIHNzbC5PUEVOU1NMX1ZFUlNJT05fSU5GTyA8ICgwLCA5LCA4LCAwLCAxNSk6Ci0gICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJTSEEyNTYgbm90IGF2YWlsYWJsZSBvbiAlciIgJSBzc2wuT1BFTlNTTF9WRVJTSU9OKQotICAgICAgICAjIHNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIG5lZWRzIFNOSSB0byB1c2UgdGhlIGNvcnJlY3QgY2VydGlmaWNhdGUKLSAgICAgICAgaWYgbm90IHNzbC5IQVNfU05JOgotICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU05JIG5lZWRlZCBmb3IgdGhpcyB0ZXN0IikKLSAgICAgICAgIyBodHRwczovL3NoYTIuaGJvZWNrLmRlLyB3YXMgdXNlZCB1bnRpbCAyMDExLTAxLTA4IChubyByb3V0ZSB0byBob3N0KQotICAgICAgICByZW1vdGUgPSAoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIiwgNDQzKQotICAgICAgICBzaGEyNTZfY2VydCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAic2hhMjU2LnBlbSIpCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIik6Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfVExTdjEpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzaGEyNTZfY2VydCkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT0ic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCi0gICAgICAgICAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgotICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbkNpcGhlciB3aXRoICVyIGlzICVyXG4iICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3RlLCBzLmNpcGhlcigpKSkKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiQ2VydGlmaWNhdGUgaXM6XG4lc1xuIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHByaW50LnBmb3JtYXQocy5nZXRwZWVyY2VydCgpKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIHdpdGggc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2lwaGVycz0iQUxMIikgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9IkRFRkFVTFQiKSBhcyBzOgorICAgICAgICAgICAgcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgICMgRXJyb3IgY2hlY2tpbmcgY2FuIGhhcHBlbiBhdCBpbnN0YW50aWF0aW9uIG9yIHdoZW4gY29ubmVjdGluZworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoc3NsLlNTTEVycm9yLCAiTm8gY2lwaGVyIGNhbiBiZSBzZWxlY3RlZCIpOgorICAgICAgICAgICAgd2l0aCBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSBhcyBzb2NrOgorICAgICAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJeJDosOz8qJ2Rvcm90aHl4IikKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKIAogICAgIGRlZiB0ZXN0X2dldF9jYV9jZXJ0c19jYXBhdGgoc2VsZik6CiAgICAgICAgICMgY2FwYXRoIGNlcnRzIGFyZSBsb2FkZWQgb24gcmVxdWVzdAotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYXBhdGg9Q0FQQVRIKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdHguZ2V0X2NhX2NlcnRzKCksIFtdKQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkKLSAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGN0eC5nZXRfY2FfY2VydHMoKSksIDEpCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUNBUEFUSCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdHguZ2V0X2NhX2NlcnRzKCksIFtdKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGN0eC5nZXRfY2FfY2VydHMoKSksIDEpCiAKICAgICBAbmVlZHNfc25pCiAgICAgZGVmIHRlc3RfY29udGV4dF9zZXRnZXQoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgY29udGV4dCBvZiBhIGNvbm5lY3RlZCBzb2NrZXQgY2FuIGJlIHJlcGxhY2VkLgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIGN0eDEgPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfVExTdjEpCi0gICAgICAgICAgICBjdHgyID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQotICAgICAgICAgICAgd2l0aCBjdHgxLndyYXBfc29ja2V0KHMpIGFzIHNzOgotICAgICAgICAgICAgICAgIHNzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuY29udGV4dCwgY3R4MSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzLl9zc2xvYmouY29udGV4dCwgY3R4MSkKLSAgICAgICAgICAgICAgICBzcy5jb250ZXh0ID0gY3R4MgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuY29udGV4dCwgY3R4MikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzLl9zc2xvYmouY29udGV4dCwgY3R4MikKLQotCi1jbGFzcyBOZXR3b3JrZWRCSU9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgIGN0eDEgPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfVExTdjEpCisgICAgICAgIGN0eDIgPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgd2l0aCBjdHgxLndyYXBfc29ja2V0KHMpIGFzIHNzOgorICAgICAgICAgICAgc3MuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5jb250ZXh0LCBjdHgxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5fc3Nsb2JqLmNvbnRleHQsIGN0eDEpCisgICAgICAgICAgICBzcy5jb250ZXh0ID0gY3R4MgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5jb250ZXh0LCBjdHgyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5fc3Nsb2JqLmNvbnRleHQsIGN0eDIpCiAKICAgICBkZWYgc3NsX2lvX2xvb3Aoc2VsZiwgc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBmdW5jLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAjIEEgc2ltcGxlIElPIGxvb3AuIENhbGwgZnVuYygqYXJncykgZGVwZW5kaW5nIG9uIHRoZSBlcnJvciB3ZSBnZXQKQEAgLTE3NjUsNjQgKzE2OTEsMTI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGNvdW50LCBmdW5jLl9fbmFtZV9fKSkKICAgICAgICAgcmV0dXJuIHJldAogCi0gICAgZGVmIHRlc3RfaGFuZHNoYWtlKHNlbGYpOgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQotICAgICAgICAgICAgc29jay5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIGluY29taW5nID0gc3NsLk1lbW9yeUJJTygpCi0gICAgICAgICAgICBvdXRnb2luZyA9IHNzbC5NZW1vcnlCSU8oKQotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKFJFTU9URV9ST09UX0NFUlQpCi0gICAgICAgICAgICBjdHguY2hlY2tfaG9zdG5hbWUgPSBUcnVlCi0gICAgICAgICAgICBzc2xvYmogPSBjdHgud3JhcF9iaW8oaW5jb21pbmcsIG91dGdvaW5nLCBGYWxzZSwgUkVNT1RFX0hPU1QpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzbG9iai5fc3Nsb2JqLm93bmVyLCBzc2xvYmopCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouY2lwaGVyKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShzc2xvYmouc2hhcmVkX2NpcGhlcnMoKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNzbG9iai5nZXRwZWVyY2VydCkKLSAgICAgICAgICAgIGlmICd0bHMtdW5pcXVlJyBpbiBzc2wuQ0hBTk5FTF9CSU5ESU5HX1RZUEVTOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNzbG9iai5nZXRfY2hhbm5lbF9iaW5kaW5nKCd0bHMtdW5pcXVlJykpCi0gICAgICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLmRvX2hhbmRzaGFrZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzc2xvYmouY2lwaGVyKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShzc2xvYmouc2hhcmVkX2NpcGhlcnMoKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzc2xvYmouZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGlmICd0bHMtdW5pcXVlJyBpbiBzc2wuQ0hBTk5FTF9CSU5ESU5HX1RZUEVTOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzc2xvYmouZ2V0X2NoYW5uZWxfYmluZGluZygndGxzLXVuaXF1ZScpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoudW53cmFwKQotICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xTeXNjYWxsRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyBzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldCBwcm9iYWJseSBzaHV0cyBkb3duIHRoZSBUQ1AKLSAgICAgICAgICAgICAgICAjIGNvbm5lY3Rpb24gd2l0aG91dCBzZW5kaW5nIGEgc2VjdXJlIHNodXRkb3duIG1lc3NhZ2UsIGFuZAotICAgICAgICAgICAgICAgICMgdGhpcyBpcyByZXBvcnRlZCBhcyBTU0xfRVJST1JfU1lTQ0FMTAotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNzbC5TU0xFcnJvciwgc3Nsb2JqLndyaXRlLCBiJ2ZvbycpCi0gICAgICAgICAgICBzb2NrLmNsb3NlKCkKLQotICAgIGRlZiB0ZXN0X3JlYWRfd3JpdGVfZGF0YShzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKLSAgICAgICAgICAgIHNvY2suY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICBpbmNvbWluZyA9IHNzbC5NZW1vcnlCSU8oKQotICAgICAgICAgICAgb3V0Z29pbmcgPSBzc2wuTWVtb3J5QklPKCkKLSAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9OT05FCi0gICAgICAgICAgICBzc2xvYmogPSBjdHgud3JhcF9iaW8oaW5jb21pbmcsIG91dGdvaW5nLCBGYWxzZSkKLSAgICAgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmouZG9faGFuZHNoYWtlKQotICAgICAgICAgICAgcmVxID0gYidHRVQgLyBIVFRQLzEuMFxyXG5cclxuJwotICAgICAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai53cml0ZSwgcmVxKQotICAgICAgICAgICAgYnVmID0gc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai5yZWFkLCAxMDI0KQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjVdLCBiJ0hUVFAvJykKKyAgICBkZWYgdGVzdF9iaW9faGFuZHNoYWtlKHNlbGYpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNvY2suY2xvc2UpCisgICAgICAgIHNvY2suY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICBpbmNvbWluZyA9IHNzbC5NZW1vcnlCSU8oKQorICAgICAgICBvdXRnb2luZyA9IHNzbC5NZW1vcnlCSU8oKQorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKFNJR05JTkdfQ0EpCisgICAgICAgIGN0eC5jaGVja19ob3N0bmFtZSA9IFRydWUKKyAgICAgICAgc3Nsb2JqID0gY3R4LndyYXBfYmlvKGluY29taW5nLCBvdXRnb2luZywgRmFsc2UsICdsb2NhbGhvc3QnKQorICAgICAgICBzZWxmLmFzc2VydElzKHNzbG9iai5fc3Nsb2JqLm93bmVyLCBzc2xvYmopCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNzbG9iai5jaXBoZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoc3Nsb2JqLnNoYXJlZF9jaXBoZXJzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNzbG9iai5nZXRwZWVyY2VydCkKKyAgICAgICAgaWYgJ3Rscy11bmlxdWUnIGluIHNzbC5DSEFOTkVMX0JJTkRJTkdfVFlQRVM6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouZ2V0X2NoYW5uZWxfYmluZGluZygndGxzLXVuaXF1ZScpKQorICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLmRvX2hhbmRzaGFrZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNzbG9iai5jaXBoZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoc3Nsb2JqLnNoYXJlZF9jaXBoZXJzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzc2xvYmouZ2V0cGVlcmNlcnQoKSkKKyAgICAgICAgaWYgJ3Rscy11bmlxdWUnIGluIHNzbC5DSEFOTkVMX0JJTkRJTkdfVFlQRVM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmdldF9jaGFubmVsX2JpbmRpbmcoJ3Rscy11bmlxdWUnKSkKKyAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai51bndyYXApCi0gICAgICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IHNzbC5TU0xTeXNjYWxsRXJyb3I6CisgICAgICAgICAgICAjIElmIHRoZSBzZXJ2ZXIgc2h1dHMgZG93biB0aGUgVENQIGNvbm5lY3Rpb24gd2l0aG91dCBzZW5kaW5nIGEKKyAgICAgICAgICAgICMgc2VjdXJlIHNodXRkb3duIG1lc3NhZ2UsIHRoaXMgaXMgcmVwb3J0ZWQgYXMgU1NMX0VSUk9SX1NZU0NBTEwKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3NsLlNTTEVycm9yLCBzc2xvYmoud3JpdGUsIGInZm9vJykKKworICAgIGRlZiB0ZXN0X2Jpb19yZWFkX3dyaXRlX2RhdGEoc2VsZik6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc29jay5jbG9zZSkKKyAgICAgICAgc29jay5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgIGluY29taW5nID0gc3NsLk1lbW9yeUJJTygpCisgICAgICAgIG91dGdvaW5nID0gc3NsLk1lbW9yeUJJTygpCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX05PTkUKKyAgICAgICAgc3Nsb2JqID0gY3R4LndyYXBfYmlvKGluY29taW5nLCBvdXRnb2luZywgRmFsc2UpCisgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmouZG9faGFuZHNoYWtlKQorICAgICAgICByZXEgPSBiJ0ZPT1xuJworICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLndyaXRlLCByZXEpCisgICAgICAgIGJ1ZiA9IHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoucmVhZCwgMTAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGInZm9vXG4nKQorICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLnVud3JhcCkKIAogCi10cnk6Ci0gICAgaW1wb3J0IHRocmVhZGluZwotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIF9oYXZlX3RocmVhZHMgPSBGYWxzZQotZWxzZToKLSAgICBfaGF2ZV90aHJlYWRzID0gVHJ1ZQorY2xhc3MgTmV0d29ya2VkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCisgICAgZGVmIHRlc3RfdGltZW91dF9jb25uZWN0X2V4KHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMjA2NTogb24gYSB0aW1lb3V0LCBjb25uZWN0X2V4KCkgc2hvdWxkIHJldHVybiB0aGUgb3JpZ2luYWwKKyAgICAgICAgIyBlcnJubyAobWltaWNraW5nIHRoZSBiZWhhdmlvdXIgb2Ygbm9uLVNTTCBzb2NrZXRzKS4KKyAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6CisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHMuY2xvc2UpCisgICAgICAgICAgICBzLnNldHRpbWVvdXQoMC4wMDAwMDAxKQorICAgICAgICAgICAgcmMgPSBzLmNvbm5lY3RfZXgoKFJFTU9URV9IT1NULCA0NDMpKQorICAgICAgICAgICAgaWYgcmMgPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJSRU1PVEVfSE9TVCByZXNwb25kZWQgdG9vIHF1aWNrbHkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihyYywgKGVycm5vLkVBR0FJTiwgZXJybm8uRVdPVUxEQkxPQ0spKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3VwcG9ydC5JUFY2X0VOQUJMRUQsICdOZWVkcyBJUHY2JykKKyAgICBkZWYgdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlX2lwdjYoc2VsZik6CisgICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoJ2lwdjYuZ29vZ2xlLmNvbScpOgorICAgICAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShzZWxmLCAnaXB2Ni5nb29nbGUuY29tJywgNDQzKQorICAgICAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZV9mYWlsKHNlbGYsICdpcHY2Lmdvb2dsZS5jb20nLCA0NDMpCisKKyAgICBkZWYgdGVzdF9hbGdvcml0aG1zKHNlbGYpOgorICAgICAgICAjIElzc3VlICM4NDg0OiBhbGwgYWxnb3JpdGhtcyBzaG91bGQgYmUgYXZhaWxhYmxlIHdoZW4gdmVyaWZ5aW5nIGEKKyAgICAgICAgIyBjZXJ0aWZpY2F0ZS4KKyAgICAgICAgIyBTSEEyNTYgd2FzIGFkZGVkIGluIE9wZW5TU0wgMC45LjgKKyAgICAgICAgaWYgc3NsLk9QRU5TU0xfVkVSU0lPTl9JTkZPIDwgKDAsIDksIDgsIDAsIDE1KToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIlNIQTI1NiBub3QgYXZhaWxhYmxlIG9uICVyIiAlIHNzbC5PUEVOU1NMX1ZFUlNJT04pCisgICAgICAgICMgc2hhMjU2LnRicy1pbnRlcm5ldC5jb20gbmVlZHMgU05JIHRvIHVzZSB0aGUgY29ycmVjdCBjZXJ0aWZpY2F0ZQorICAgICAgICBpZiBub3Qgc3NsLkhBU19TTkk6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJTTkkgbmVlZGVkIGZvciB0aGlzIHRlc3QiKQorICAgICAgICAjIGh0dHBzOi8vc2hhMi5oYm9lY2suZGUvIHdhcyB1c2VkIHVudGlsIDIwMTEtMDEtMDggKG5vIHJvdXRlIHRvIGhvc3QpCisgICAgICAgIHJlbW90ZSA9ICgic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iLCA0NDMpCisgICAgICAgIHNoYTI1Nl9jZXJ0ID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJzaGEyNTYucGVtIikKKyAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iKToKKyAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9UTFN2MSkKKyAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKHNoYTI1Nl9jZXJ0KQorICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPSJzaGEyNTYudGJzLWludGVybmV0LmNvbSIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcy5jb25uZWN0KHJlbW90ZSkKKyAgICAgICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuQ2lwaGVyIHdpdGggJXIgaXMgJXJcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdGUsIHMuY2lwaGVyKCkpKQorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJDZXJ0aWZpY2F0ZSBpczpcbiVzXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHJpbnQucGZvcm1hdChzLmdldHBlZXJjZXJ0KCkpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworCitkZWYgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSh0ZXN0LCBob3N0LCBwb3J0LCBjZXJ0PU5vbmUpOgorICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKChob3N0LCBwb3J0KSkKKyAgICBpZiBub3QgcGVtOgorICAgICAgICB0ZXN0LmZhaWwoIk5vIHNlcnZlciBjZXJ0aWZpY2F0ZSBvbiAlczolcyEiICUgKGhvc3QsIHBvcnQpKQorCisgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKGhvc3QsIHBvcnQpLCBjYV9jZXJ0cz1jZXJ0KQorICAgIGlmIG5vdCBwZW06CisgICAgICAgIHRlc3QuZmFpbCgiTm8gc2VydmVyIGNlcnRpZmljYXRlIG9uICVzOiVzISIgJSAoaG9zdCwgcG9ydCkpCisgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcblZlcmlmaWVkIGNlcnRpZmljYXRlIGZvciAlczolcyBpc1xuJXNcbiIgJSAoaG9zdCwgcG9ydCAscGVtKSkKKworZGVmIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGVfZmFpbCh0ZXN0LCBob3N0LCBwb3J0KToKKyAgICB0cnk6CisgICAgICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKChob3N0LCBwb3J0KSwgY2FfY2VydHM9Q0VSVEZJTEUpCisgICAgZXhjZXB0IHNzbC5TU0xFcnJvciBhcyB4OgorICAgICAgICAjc2hvdWxkIGZhaWwKKyAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiJXNcbiIgJSB4KQorICAgIGVsc2U6CisgICAgICAgIHRlc3QuZmFpbCgiR290IHNlcnZlciBjZXJ0aWZpY2F0ZSAlcyBmb3IgJXM6JXMhIiAlIChwZW0sIGhvc3QsIHBvcnQpKQorCisKK2lmIF9oYXZlX3RocmVhZHM6CiAgICAgZnJvbSB0ZXN0LnNzbF9zZXJ2ZXJzIGltcG9ydCBtYWtlX2h0dHBzX3NlcnZlcgogCiAgICAgY2xhc3MgVGhyZWFkZWRFY2hvU2VydmVyKHRocmVhZGluZy5UaHJlYWQpOgpAQCAtMTkxMCw2ICsxOTAwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RyaXBwZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlb2YsIHNvIHF1aXQgdGhpcyBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IHNlbGYuc3NsY29ubi51bndyYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1hbnkgdGVzdHMgc2h1dCB0aGUgVENQIGNvbm5lY3Rpb24gZG93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdpdGhvdXQgYW4gU1NMIHNodXRkb3duLiBUaGlzIGNhdXNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVud3JhcCgpIHRvIHJhaXNlIE9TRXJyb3Igd2l0aCBlcnJubz0wIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xjb25uID0gTm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBzdHJpcHBlZCA9PSBiJ292ZXInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZSBhbmQgc2VsZi5zZXJ2ZXIuY29ubmVjdGlvbmNoYXR0eToKQEAgLTI3NDcsMTIgKzI3NDYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgY291bnQsIGFkZHIgPSBzLnJlY3Zmcm9tX2ludG8oYikKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJbOmNvdW50XQogCi0gICAgICAgICAgICAgICAgIyAobmFtZSwgbWV0aG9kLCB3aGV0aGVyIHRvIGV4cGVjdCBzdWNjZXNzLCAqYXJncykKKyAgICAgICAgICAgICAgICAjIChuYW1lLCBtZXRob2QsIGV4cGVjdCBzdWNjZXNzPywgKmFyZ3MsIHJldHVybiB2YWx1ZSBmdW5jKQogICAgICAgICAgICAgICAgIHNlbmRfbWV0aG9kcyA9IFsKLSAgICAgICAgICAgICAgICAgICAgKCdzZW5kJywgcy5zZW5kLCBUcnVlLCBbXSksCi0gICAgICAgICAgICAgICAgICAgICgnc2VuZHRvJywgcy5zZW5kdG8sIEZhbHNlLCBbInNvbWUuYWRkcmVzcyJdKSwKLSAgICAgICAgICAgICAgICAgICAgKCdzZW5kYWxsJywgcy5zZW5kYWxsLCBUcnVlLCBbXSksCisgICAgICAgICAgICAgICAgICAgICgnc2VuZCcsIHMuc2VuZCwgVHJ1ZSwgW10sIGxlbiksCisgICAgICAgICAgICAgICAgICAgICgnc2VuZHRvJywgcy5zZW5kdG8sIEZhbHNlLCBbInNvbWUuYWRkcmVzcyJdLCBsZW4pLAorICAgICAgICAgICAgICAgICAgICAoJ3NlbmRhbGwnLCBzLnNlbmRhbGwsIFRydWUsIFtdLCBsYW1iZGEgeDogTm9uZSksCiAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgICMgKG5hbWUsIG1ldGhvZCwgd2hldGhlciB0byBleHBlY3Qgc3VjY2VzcywgKmFyZ3MpCiAgICAgICAgICAgICAgICAgcmVjdl9tZXRob2RzID0gWwogICAgICAgICAgICAgICAgICAgICAoJ3JlY3YnLCBzLnJlY3YsIFRydWUsIFtdKSwKICAgICAgICAgICAgICAgICAgICAgKCdyZWN2ZnJvbScsIHMucmVjdmZyb20sIEZhbHNlLCBbInNvbWUuYWRkcmVzcyJdKSwKQEAgLTI3NjEsMTAgKzI3NjEsMTMgQEAKICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgZGF0YV9wcmVmaXggPSAiUFJFRklYXyIKIAotICAgICAgICAgICAgICAgIGZvciBtZXRoX25hbWUsIHNlbmRfbWV0aCwgZXhwZWN0X3N1Y2Nlc3MsIGFyZ3MgaW4gc2VuZF9tZXRob2RzOgorICAgICAgICAgICAgICAgIGZvciAobWV0aF9uYW1lLCBzZW5kX21ldGgsIGV4cGVjdF9zdWNjZXNzLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbF9tZXRoKSBpbiBzZW5kX21ldGhvZHM6CiAgICAgICAgICAgICAgICAgICAgIGluZGF0YSA9IChkYXRhX3ByZWZpeCArIG1ldGhfbmFtZSkuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbWV0aChpbmRhdGEsICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2VuZF9tZXRoKGluZGF0YSwgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAic2VuZGluZyB3aXRoIHt9Ii5mb3JtYXQobWV0aF9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXQsIHJldF92YWxfbWV0aChpbmRhdGEpLCBtc2c9bXNnKQogICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YSA9IHMucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvdXRkYXRhICE9IGluZGF0YS5sb3dlcigpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgKQEAgLTM0MDIsNyArMzQwNSw3IEBACiAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKAogICAgICAgICAgICAgICAgICdpZ25vcmUnLAotICAgICAgICAgICAgICAgICdkaXN0XChcKSBhbmQgbGludXhfZGlzdHJpYnV0aW9uXChcKSAnCisgICAgICAgICAgICAgICAgcidkaXN0XChcKSBhbmQgbGludXhfZGlzdHJpYnV0aW9uXChcKSAnCiAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9ucyBhcmUgZGVwcmVjYXRlZCAuKicsCiAgICAgICAgICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICkKQEAgLTM0MjQsMTggKzM0MjcsMjAgQEAKICAgICAgICAgICAgIHBhc3MKIAogICAgIGZvciBmaWxlbmFtZSBpbiBbCi0gICAgICAgIENFUlRGSUxFLCBSRU1PVEVfUk9PVF9DRVJULCBCWVRFU19DRVJURklMRSwKKyAgICAgICAgQ0VSVEZJTEUsIEJZVEVTX0NFUlRGSUxFLAogICAgICAgICBPTkxZQ0VSVCwgT05MWUtFWSwgQllURVNfT05MWUNFUlQsIEJZVEVTX09OTFlLRVksCiAgICAgICAgIFNJR05FRF9DRVJURklMRSwgU0lHTkVEX0NFUlRGSUxFMiwgU0lHTklOR19DQSwKICAgICAgICAgQkFEQ0VSVCwgQkFES0VZLCBFTVBUWUNFUlRdOgogICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICAgcmFpc2Ugc3VwcG9ydC5UZXN0RmFpbGVkKCJDYW4ndCByZWFkIGNlcnRpZmljYXRlIGZpbGUgJXIiICUgZmlsZW5hbWUpCiAKLSAgICB0ZXN0cyA9IFtDb250ZXh0VGVzdHMsIEJhc2ljU29ja2V0VGVzdHMsIFNTTEVycm9yVGVzdHMsIE1lbW9yeUJJT1Rlc3RzXQorICAgIHRlc3RzID0gWworICAgICAgICBDb250ZXh0VGVzdHMsIEJhc2ljU29ja2V0VGVzdHMsIFNTTEVycm9yVGVzdHMsIE1lbW9yeUJJT1Rlc3RzLAorICAgICAgICBTaW1wbGVCYWNrZ3JvdW5kVGVzdHMsCisgICAgXQogCiAgICAgaWYgc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCduZXR3b3JrJyk6CiAgICAgICAgIHRlc3RzLmFwcGVuZChOZXR3b3JrZWRUZXN0cykKLSAgICAgICAgdGVzdHMuYXBwZW5kKE5ldHdvcmtlZEJJT1Rlc3RzKQogCiAgICAgaWYgX2hhdmVfdGhyZWFkczoKICAgICAgICAgdGhyZWFkX2luZm8gPSBzdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0YXRpc3RpY3MucHkgYi9MaWIvdGVzdC90ZXN0X3N0YXRpc3RpY3MucHkKaW5kZXggMDA4OWFlOC4uNmNhYzcwOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdGF0aXN0aWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RhdGlzdGljcy5weQpAQCAtMjEsNiArMjEsMTAgQEAKIAogIyA9PT0gSGVscGVyIGZ1bmN0aW9ucyBhbmQgY2xhc3MgPT09CiAKK2RlZiBzaWduKHgpOgorICAgICIiIlJldHVybiAtMS4wIGZvciBuZWdhdGl2ZXMsIGluY2x1ZGluZyAtMC4wLCBvdGhlcndpc2UgKzEuMC4iIiIKKyAgICByZXR1cm4gbWF0aC5jb3B5c2lnbigxLCB4KQorCiBkZWYgX25hbl9lcXVhbChhLCBiKToKICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBhIGFuZCBiIGFyZSBib3RoIHRoZSBzYW1lIGtpbmQgb2YgTkFOLgogCkBAIC0yNjQsNiArMjY4LDEzIEBACiAjID09PSBUZXN0IHRoZSBoZWxwZXJzID09PQogIyA9PT09PT09PT09PT09PT09PT09PT09PT0KIAorY2xhc3MgVGVzdFNpZ24odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCB0aGUgaGVscGVyIGZ1bmN0aW9uIHNpZ24oKSB3b3JrcyBjb3JyZWN0bHkuIiIiCisgICAgZGVmIHRlc3RaZXJvZXMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHNpZ25lZCB6ZXJvZXMgcmVwb3J0IHRoZWlyIHNpZ24gY29ycmVjdGx5LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ24oMC4wKSwgKzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbigtMC4wKSwgLTEpCisKIAogIyAtLS0gVGVzdHMgZm9yIGFwcHJveF9lcXVhbCAtLS0KIApAQCAtNjU5LDcgKzY3MCw3IEBACiAgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKICAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU9PIGFuZCBhYm92ZSIpCiAgICAgZGVmIHRlc3RfZG9jX3Rlc3RzKHNlbGYpOgotICAgICAgICBmYWlsZWQsIHRyaWVkID0gZG9jdGVzdC50ZXN0bW9kKHN0YXRpc3RpY3MpCisgICAgICAgIGZhaWxlZCwgdHJpZWQgPSBkb2N0ZXN0LnRlc3Rtb2Qoc3RhdGlzdGljcywgb3B0aW9uZmxhZ3M9ZG9jdGVzdC5FTExJUFNJUykKICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKHRyaWVkLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZhaWxlZCwgMCkKIApAQCAtNzAyLDkgKzcxMyw5IEBACiAgICAgZGVmIHRlc3RfZGVjaW1hbChzZWxmKToKICAgICAgICAgRCA9IERlY2ltYWwKICAgICAgICAgX2V4YWN0X3JhdGlvID0gc3RhdGlzdGljcy5fZXhhY3RfcmF0aW8KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfZXhhY3RfcmF0aW8oRCgiMC4xMjUiKSksICgxMjUsIDEwMDApKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9leGFjdF9yYXRpbyhEKCIxMi4zNDUiKSksICgxMjM0NSwgMTAwMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX2V4YWN0X3JhdGlvKEQoIi0xLjk4IikpLCAoLTE5OCwgMTAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfZXhhY3RfcmF0aW8oRCgiMC4xMjUiKSksICgxLCA4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfZXhhY3RfcmF0aW8oRCgiMTIuMzQ1IikpLCAoMjQ2OSwgMjAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfZXhhY3RfcmF0aW8oRCgiLTEuOTgiKSksICgtOTksIDUwKSkKIAogICAgIGRlZiB0ZXN0X2luZihzZWxmKToKICAgICAgICAgSU5GID0gZmxvYXQoIklORiIpCkBAIC03NDMsMTggKzc1NCwxOCBAQAogCiAKIGNsYXNzIERlY2ltYWxUb1JhdGlvVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIyBUZXN0IF9kZWNpbWFsX3RvX3JhdGlvIHByaXZhdGUgZnVuY3Rpb24uCisgICAgIyBUZXN0IF9leGFjdF9yYXRpbyBwcml2YXRlIGZ1bmN0aW9uLgogCiAgICAgZGVmIHRlc3RfaW5maW5pdHkoc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IElORnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgogICAgICAgICBpbmYgPSBEZWNpbWFsKCdJTkYnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oaW5mKSwgKGluZiwgTm9uZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbygtaW5mKSwgKC1pbmYsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKGluZiksIChpbmYsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKC1pbmYpLCAoLWluZiwgTm9uZSkpCiAKICAgICBkZWYgdGVzdF9uYW4oc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IE5BTnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgogICAgICAgICBmb3IgbmFuIGluIChEZWNpbWFsKCdOQU4nKSwgRGVjaW1hbCgnc05BTicpKToKLSAgICAgICAgICAgIG51bSwgZGVuID0gc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbyhuYW4pCisgICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKG5hbikKICAgICAgICAgICAgICMgQmVjYXVzZSBOQU5zIGFsd2F5cyBjb21wYXJlIG5vbi1lcXVhbCwgd2UgY2Fubm90IHVzZSBhc3NlcnRFcXVhbC4KICAgICAgICAgICAgICMgTm9yIGNhbiB3ZSB1c2UgYW4gaWRlbnRpdHkgdGVzdCwgYXMgd2UgZG9uJ3QgZ3VhcmFudGVlIGFueXRoaW5nCiAgICAgICAgICAgICAjIGFib3V0IHRoZSBvYmplY3QgaWRlbnRpdHkuCkBAIC03NjcsMzAgKzc3OCwzMCBAQAogICAgICAgICBmb3IgZCBpbiBudW1iZXJzOgogICAgICAgICAgICAgIyBGaXJzdCB0ZXN0IHBvc2l0aXZlIGRlY2ltYWxzLgogICAgICAgICAgICAgYXNzZXJ0IGQgPiAwCi0gICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oZCkKKyAgICAgICAgICAgIG51bSwgZGVuID0gc3RhdGlzdGljcy5fZXhhY3RfcmF0aW8oZCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKG51bSwgMCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihkZW4sIDApCiAgICAgICAgICAgICAjIFRoZW4gdGVzdCBuZWdhdGl2ZSBkZWNpbWFscy4KLSAgICAgICAgICAgIG51bSwgZGVuID0gc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbygtZCkKKyAgICAgICAgICAgIG51bSwgZGVuID0gc3RhdGlzdGljcy5fZXhhY3RfcmF0aW8oLWQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChudW0sIDApCiAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZGVuLCAwKQogCiAgICAgZGVmIHRlc3RfbmVnYXRpdmVfZXhwb25lbnQoc2VsZik6CiAgICAgICAgICMgVGVzdCByZXN1bHQgd2hlbiB0aGUgZXhwb25lbnQgaXMgbmVnYXRpdmUuCi0gICAgICAgIHQgPSBzdGF0aXN0aWNzLl9kZWNpbWFsX3RvX3JhdGlvKERlY2ltYWwoIjAuMTIzNCIpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsICgxMjM0LCAxMDAwMCkpCisgICAgICAgIHQgPSBzdGF0aXN0aWNzLl9leGFjdF9yYXRpbyhEZWNpbWFsKCIwLjEyMzQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoNjE3LCA1MDAwKSkKIAogICAgIGRlZiB0ZXN0X3Bvc2l0aXZlX2V4cG9uZW50KHNlbGYpOgogICAgICAgICAjIFRlc3QgcmVzdWx0cyB3aGVuIHRoZSBleHBvbmVudCBpcyBwb3NpdGl2ZS4KLSAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oRGVjaW1hbCgiMS4yMzRlNyIpKQorICAgICAgICB0ID0gc3RhdGlzdGljcy5fZXhhY3RfcmF0aW8oRGVjaW1hbCgiMS4yMzRlNyIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsICgxMjM0MDAwMCwgMSkpCiAKICAgICBkZWYgdGVzdF9yZWdyZXNzaW9uXzIwNTM2KHNlbGYpOgogICAgICAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaXNzdWUgMjA1MzYuCiAgICAgICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDUzNgotICAgICAgICB0ID0gc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbyhEZWNpbWFsKCIxZTIiKSkKKyAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKERlY2ltYWwoIjFlMiIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsICgxMDAsIDEpKQotICAgICAgICB0ID0gc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbyhEZWNpbWFsKCIxLjQ3ZTUiKSkKKyAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKERlY2ltYWwoIjEuNDdlNSIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsICgxNDcwMDAsIDEpKQogCiAKQEAgLTk3MSw2ICs5ODIsMzAxIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoX25hbl9lcXVhbCh4LCBuYW4pKQogCiAKK2NsYXNzIEZhaWxOZWdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IF9mYWlsX25lZyBwcml2YXRlIGZ1bmN0aW9uLiIiIgorCisgICAgZGVmIHRlc3RfcGFzc190aHJvdWdoKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB2YWx1ZXMgYXJlIHBhc3NlZCB0aHJvdWdoIHVuY2hhbmdlZC4KKyAgICAgICAgdmFsdWVzID0gWzEsIDIuMCwgRnJhY3Rpb24oMyksIERlY2ltYWwoNCldCisgICAgICAgIG5ldyA9IGxpc3Qoc3RhdGlzdGljcy5fZmFpbF9uZWcodmFsdWVzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsIG5ldykKKworICAgIGRlZiB0ZXN0X25lZ2F0aXZlc19yYWlzZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgbmVnYXRpdmVzIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgZm9yIHggaW4gWzEsIDIuMCwgRnJhY3Rpb24oMyksIERlY2ltYWwoNCldOgorICAgICAgICAgICAgc2VxID0gWy14XQorICAgICAgICAgICAgaXQgPSBzdGF0aXN0aWNzLl9mYWlsX25lZyhzZXEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzdGF0aXN0aWNzLlN0YXRpc3RpY3NFcnJvciwgbmV4dCwgaXQpCisKKyAgICBkZWYgdGVzdF9lcnJvcl9tc2coc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGEgZ2l2ZW4gZXJyb3IgbWVzc2FnZSBpcyB1c2VkLgorICAgICAgICBtc2cgPSAiYmFkbmVzcyAjJWQiICUgcmFuZG9tLnJhbmRpbnQoMTAwMDAsIDk5OTk5KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXh0KHN0YXRpc3RpY3MuX2ZhaWxfbmVnKFstMV0sIG1zZykpCisgICAgICAgIGV4Y2VwdCBzdGF0aXN0aWNzLlN0YXRpc3RpY3NFcnJvciBhcyBlOgorICAgICAgICAgICAgZXJybXNnID0gZS5hcmdzWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiwgYnV0IGl0IGRpZG4ndCBoYXBwZW4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVycm1zZywgbXNnKQorCisKK2NsYXNzIFRlc3RfUHJvZHVjdChOdW1lcmljVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIHByaXZhdGUgX3Byb2R1Y3QgZnVuY3Rpb24uIiIiCisKKyAgICBkZWYgdGVzdF9pbnRzKHNlbGYpOgorICAgICAgICBkYXRhID0gWzEsIDIsIDUsIDcsIDldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGlzdGljcy5fcHJvZHVjdChkYXRhKSwgKDAsIDYzMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGlzdGljcy5fcHJvZHVjdChkYXRhKjEwMCksICgwLCA2MzAqKjEwMCkpCisKKyAgICBkZWYgdGVzdF9mbG9hdHMoc2VsZik6CisgICAgICAgIGRhdGEgPSBbMS4wLCAyLjAsIDQuMCwgOC4wXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX3Byb2R1Y3QoZGF0YSksICg4LCAwLjI1KSkKKworICAgIGRlZiB0ZXN0X292ZXJmbG93KHNlbGYpOgorICAgICAgICAjIFRlc3Qgd2l0aCBmbG9hdHMgdGhhdCBvdmVyZmxvdy4KKyAgICAgICAgZGF0YSA9IFsxZTMwMF0qNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX3Byb2R1Y3QoZGF0YSksICg1OTgwLCAwLjY5MjgyODc5NTEyODMxOTMpKQorCisgICAgZGVmIHRlc3RfZnJhY3Rpb25zKHNlbGYpOgorICAgICAgICBGID0gRnJhY3Rpb24KKyAgICAgICAgZGF0YSA9IFtGKDE0LCAyMyksIEYoNjksIDEpLCBGKDY2NSwgNTI5KSwgRigyOTksIDEwNSksIEYoMTY4MywgMzkpXQorICAgICAgICBleHAsIG1hbnQgPSBzdGF0aXN0aWNzLl9wcm9kdWN0KGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hbnQsIEYoMiozKjcqMTEqMTcqMTksIDIzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobWFudCwgRikpCisgICAgICAgICMgTWl4ZWQgRnJhY3Rpb24gYW5kIGludC4KKyAgICAgICAgZGF0YSA9IFszLCAyNSwgRigyLCAxNSldCisgICAgICAgIGV4cCwgbWFudCA9IHN0YXRpc3RpY3MuX3Byb2R1Y3QoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFudCwgRigxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1hbnQsIEYpKQorCisgICAgZGVmIHRlc3RfZGVjaW1hbChzZWxmKToKKyAgICAgICAgRCA9IERlY2ltYWwKKyAgICAgICAgZGF0YSA9IFtEKCcyNC41JyksIEQoJzE3LjYnKSwgRCgnMC4wMjUnKSwgRCgnMS4zJyldCisgICAgICAgIGV4cGVjdGVkID0gRCgnMTQuMDE0MDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0aXN0aWNzLl9wcm9kdWN0KGRhdGEpLCAoMCwgZXhwZWN0ZWQpKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfZGVjaW1hbF9mbG9hdChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgbWl4ZWQgRGVjaW1hbCBhbmQgZmxvYXQgcmFpc2VzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0YXRpc3RpY3MuX3Byb2R1Y3QsIFsxLjAsIERlY2ltYWwoMSldKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0YXRpc3RpY3MuX3Byb2R1Y3QsIFtEZWNpbWFsKDEpLCAxLjBdKQorCisKK0B1bml0dGVzdC5za2lwSWYoVHJ1ZSwgIkZJWE1FOiB0ZXN0cyBrbm93biB0byBmYWlsLCBzZWUgaXNzdWUgIzI3MTgxIikKK2NsYXNzIFRlc3RfTnRoX1Jvb3QoTnVtZXJpY1Rlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBwcml2YXRlIF9udGhfcm9vdCBmdW5jdGlvbi4iIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5ucm9vdCA9IHN0YXRpc3RpY3MuX250aF9yb290CisKKyAgICAjIC0tLSBTcGVjaWFsIHZhbHVlcyAoaW5maW5pdGllcywgTkFOcywgemVyb2VzKSAtLS0KKworICAgIGRlZiB0ZXN0X2Zsb2F0X05BTihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdGhlIHJvb3Qgb2YgYSBmbG9hdCBOQU4gaXMgYSBmbG9hdCBOQU4uCisgICAgICAgIE5BTiA9IGZsb2F0KCduYW4nKQorICAgICAgICBmb3IgbiBpbiByYW5nZSgyLCA5KToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49bik6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5ucm9vdChOQU4sIG4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4ocmVzdWx0KSkKKworICAgIGRlZiB0ZXN0X2RlY2ltYWxfUU5BTihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoZSAgYmVoYXZpb3VyIHdoZW4gdGFraW5nIHRoZSByb290IG9mIGEgRGVjaW1hbCBxdWlldCBOQU4uCisgICAgICAgIE5BTiA9IGRlY2ltYWwuRGVjaW1hbCgnbmFuJykKKyAgICAgICAgd2l0aCBkZWNpbWFsLmxvY2FsY29udGV4dCgpIGFzIGN0eDoKKyAgICAgICAgICAgIGN0eC50cmFwc1tkZWNpbWFsLkludmFsaWRPcGVyYXRpb25dID0gMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGVjaW1hbC5JbnZhbGlkT3BlcmF0aW9uLCBzZWxmLm5yb290LCBOQU4sIDUpCisgICAgICAgICAgICBjdHgudHJhcHNbZGVjaW1hbC5JbnZhbGlkT3BlcmF0aW9uXSA9IDAKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm5yb290KE5BTiwgNSkuaXNfcW5hbigpKQorCisgICAgZGVmIHRlc3RfZGVjaW1hbF9TTkFOKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB0YWtpbmcgdGhlIHJvb3Qgb2YgYSBEZWNpbWFsIHNOQU4gYWx3YXlzIHJhaXNlcy4KKyAgICAgICAgc05BTiA9IGRlY2ltYWwuRGVjaW1hbCgnc25hbicpCisgICAgICAgIHdpdGggZGVjaW1hbC5sb2NhbGNvbnRleHQoKSBhcyBjdHg6CisgICAgICAgICAgICBjdHgudHJhcHNbZGVjaW1hbC5JbnZhbGlkT3BlcmF0aW9uXSA9IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRlY2ltYWwuSW52YWxpZE9wZXJhdGlvbiwgc2VsZi5ucm9vdCwgc05BTiwgNSkKKyAgICAgICAgICAgIGN0eC50cmFwc1tkZWNpbWFsLkludmFsaWRPcGVyYXRpb25dID0gMAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGVjaW1hbC5JbnZhbGlkT3BlcmF0aW9uLCBzZWxmLm5yb290LCBzTkFOLCA1KQorCisgICAgZGVmIHRlc3RfaW5mKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB0aGUgcm9vdCBvZiBpbmZpbml0eSBpcyBpbmZpbml0eS4KKyAgICAgICAgZm9yIElORiBpbiAoZmxvYXQoJ2luZicpLCBkZWNpbWFsLkRlY2ltYWwoJ2luZicpKToKKyAgICAgICAgICAgIGZvciBuIGluIHJhbmdlKDIsIDkpOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49biwgaW5mPUlORik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5ucm9vdChJTkYsIG4pLCBJTkYpCisKKyAgICAjIEZJWE1FOiBuZWVkIHRvIGNoZWNrIERlY2ltYWwgemVyb2VzIHRvby4KKyAgICBkZWYgdGVzdF96ZXJvKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB0aGUgcm9vdCBvZiArMC4wIGlzICswLjAuCisgICAgICAgIGZvciBuIGluIHJhbmdlKDIsIDExKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49bik6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5ucm9vdCgrMC4wLCBuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAwLjApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduKHJlc3VsdCksICsxKQorCisgICAgIyBGSVhNRTogbmVlZCB0byBjaGVjayBEZWNpbWFsIHplcm9lcyB0b28uCisgICAgZGVmIHRlc3RfbmVnX3plcm8oc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSByb290IG9mIC0wLjAgaXMgLTAuMC4KKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoMiwgMTEpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qobj1uKToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLm5yb290KC0wLjAsIG4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDAuMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ24ocmVzdWx0KSwgLTEpCisKKyAgICAjIC0tLSBUZXN0IHJldHVybiB0eXBlcyAtLS0KKworICAgIGRlZiBjaGVja19yZXN1bHRfdHlwZShzZWxmLCB4LCBuLCBvdXR0eXBlKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYubnJvb3QoeCwgbiksIG91dHR5cGUpCisgICAgICAgIGNsYXNzIE15U3ViY2xhc3ModHlwZSh4KSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLm5yb290KE15U3ViY2xhc3MoeCksIG4pLCBvdXR0eXBlKQorCisgICAgZGVmIHRlc3REZWNpbWFsKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBEZWNpbWFsIGFyZ3VtZW50cyByZXR1cm4gRGVjaW1hbCByZXN1bHRzLgorICAgICAgICBzZWxmLmNoZWNrX3Jlc3VsdF90eXBlKGRlY2ltYWwuRGVjaW1hbCgnMzMuMycpLCAzLCBkZWNpbWFsLkRlY2ltYWwpCisKKyAgICBkZWYgdGVzdEZsb2F0KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBvdGhlciBhcmd1bWVudHMgcmV0dXJuIGZsb2F0IHJlc3VsdHMuCisgICAgICAgIGZvciB4IGluICgwLjIsIEZyYWN0aW9uKDExLCA3KSwgOTEpOgorICAgICAgICAgICAgc2VsZi5jaGVja19yZXN1bHRfdHlwZSh4LCA2LCBmbG9hdCkKKworICAgICMgLS0tIFRlc3QgYmFkIGlucHV0IC0tLQorCisgICAgZGVmIHRlc3RCYWRPcmRlclR5cGVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBucm9vdCByYWlzZXMgY29ycmVjdGx5IHdoZW4gbiBoYXMgdGhlIHdyb25nIHR5cGUuCisgICAgICAgIGZvciBuIGluICg1LjAsIDJqLCBOb25lLCAneCcsIGIneCcsIFtdLCB7fSwgc2V0KCksIHNpZ24pOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qobj1uKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubnJvb3QsIDIuNSwgbikKKworICAgIGRlZiB0ZXN0QmFkT3JkZXJWYWx1ZXMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IG5yb290IHJhaXNlcyBjb3JyZWN0bHkgd2hlbiBuIGhhcyBhIHdyb25nIHZhbHVlLgorICAgICAgICBmb3IgbiBpbiAoMSwgMCwgLTEsIC0yLCAtODcpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qobj1uKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm5yb290LCAyLjUsIG4pCisKKyAgICBkZWYgdGVzdEJhZFR5cGVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBucm9vdCByYWlzZXMgY29ycmVjdGx5IHdoZW4geCBoYXMgdGhlIHdyb25nIHR5cGUuCisgICAgICAgIGZvciB4IGluIChOb25lLCAneCcsIGIneCcsIFtdLCB7fSwgc2V0KCksIHNpZ24pOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoeD14KToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubnJvb3QsIHgsIDMpCisKKyAgICBkZWYgdGVzdE5lZ2F0aXZlRXJyb3Ioc2VsZik6CisgICAgICAgICMgVGVzdCBuZWdhdGl2ZSB4IHJhaXNlcyBjb3JyZWN0bHkuCisgICAgICAgIHggPSByYW5kb20udW5pZm9ybSgtMjAuMCwgLTAuMSkKKyAgICAgICAgYXNzZXJ0IHggPCAwCisgICAgICAgIGZvciBuIGluIHJhbmdlKDMsIDcpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoeD14LCBuPW4pOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYubnJvb3QsIHgsIG4pCisgICAgICAgICMgQW5kIERlY2ltYWwuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYubnJvb3QsIERlY2ltYWwoLTI3KSwgMykKKworICAgICMgLS0tIFRlc3QgdGhhdCBucm9vdCBpcyBuZXZlciB3b3JzZSB0aGFuIGNhbGxpbmcgbWF0aC5wb3coKSAtLS0KKworICAgIGRlZiBjaGVja19lcnJvcl9pc19ub193b3JzZShzZWxmLCB4LCBuKToKKyAgICAgICAgeSA9IG1hdGgucG93KHgsIG4pCisgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHg9eCwgbj1uLCB5PXkpOgorICAgICAgICAgICAgZXJyMSA9IGFicyhzZWxmLm5yb290KHksIG4pIC0geCkKKyAgICAgICAgICAgIGVycjIgPSBhYnMobWF0aC5wb3coeSwgMS4wL24pIC0geCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKGVycjEsIGVycjIpCisKKyAgICBkZWYgdGVzdENvbXBhcmVXaXRoUG93U21hbGwoc2VsZik6CisgICAgICAgICMgQ29tcGFyZSBucm9vdCB3aXRoIHBvdyBmb3Igc21hbGwgdmFsdWVzIG9mIHguCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIwMCk6CisgICAgICAgICAgICB4ID0gcmFuZG9tLnVuaWZvcm0oMWUtOSwgMS4wLTFlLTkpCisgICAgICAgICAgICBuID0gcmFuZG9tLmNob2ljZShyYW5nZSgyLCAxNikpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2Vycm9yX2lzX25vX3dvcnNlKHgsIG4pCisKKyAgICBkZWYgdGVzdENvbXBhcmVXaXRoUG93TWVkaXVtKHNlbGYpOgorICAgICAgICAjIENvbXBhcmUgbnJvb3Qgd2l0aCBwb3cgZm9yIG1lZGl1bS1zaXplZCB2YWx1ZXMgb2YgeC4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjAwKToKKyAgICAgICAgICAgIHggPSByYW5kb20udW5pZm9ybSgxLjAsIDEwMC4wKQorICAgICAgICAgICAgbiA9IHJhbmRvbS5jaG9pY2UocmFuZ2UoMiwgMTYpKQorICAgICAgICAgICAgc2VsZi5jaGVja19lcnJvcl9pc19ub193b3JzZSh4LCBuKQorCisgICAgZGVmIHRlc3RDb21wYXJlV2l0aFBvd0xhcmdlKHNlbGYpOgorICAgICAgICAjIENvbXBhcmUgbnJvb3Qgd2l0aCBwb3cgZm9yIGxhcmdpc2ggdmFsdWVzIG9mIHguCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIwMCk6CisgICAgICAgICAgICB4ID0gcmFuZG9tLnVuaWZvcm0oMTAwLjAsIDEwMDAwLjApCisgICAgICAgICAgICBuID0gcmFuZG9tLmNob2ljZShyYW5nZSgyLCAxNikpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2Vycm9yX2lzX25vX3dvcnNlKHgsIG4pCisKKyAgICBkZWYgdGVzdENvbXBhcmVXaXRoUG93SHVnZShzZWxmKToKKyAgICAgICAgIyBDb21wYXJlIG5yb290IHdpdGggcG93IGZvciBodWdlIHZhbHVlcyBvZiB4LgorICAgICAgICBmb3IgaSBpbiByYW5nZSgyMDApOgorICAgICAgICAgICAgeCA9IHJhbmRvbS51bmlmb3JtKDFlMjAsIDFlNTApCisgICAgICAgICAgICAjIFdlIHJlc3RyaWN0IHRoZSBvcmRlciBoZXJlIHRvIGF2b2lkIGFuIE92ZXJmbG93IGVycm9yLgorICAgICAgICAgICAgbiA9IHJhbmRvbS5jaG9pY2UocmFuZ2UoMiwgNykpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2Vycm9yX2lzX25vX3dvcnNlKHgsIG4pCisKKyAgICAjIC0tLSBUZXN0IGZvciBudW1lcmljYWxseSBjb3JyZWN0IGFuc3dlcnMgLS0tCisKKyAgICBkZWYgdGVzdEV4YWN0UG93ZXJzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBzbWFsbCBpbnRlZ2VyIHBvd2VycyBhcmUgY2FsY3VsYXRlZCBleGFjdGx5LgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCA1MSk6CisgICAgICAgICAgICBmb3IgbiBpbiByYW5nZSgyLCAxNik6CisgICAgICAgICAgICAgICAgaWYgKGksIG4pID09ICgzNSwgMTMpOgorICAgICAgICAgICAgICAgICAgICAjIFNlZSB0ZXN0RXhwZWN0ZWRGYWlsdXJlMzVwMTMKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChpPWksIG49bik6CisgICAgICAgICAgICAgICAgICAgIHggPSBpKipuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5ucm9vdCh4LCBuKSwgaSkKKworICAgIGRlZiB0ZXN0RXhwZWN0ZWRGYWlsdXJlMzVwMTMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGUgZXhwZWN0ZWQgZmFpbHVyZSAzNSoqMTMgaXMgYWxtb3N0IGV4YWN0LgorICAgICAgICB4ID0gMzUqKjEzCisgICAgICAgIGVyciA9IGFicyhzZWxmLm5yb290KHgsIDEzKSAtIDM1KQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChlcnIsIDAuMDAwMDAwMDAxKQorCisgICAgZGVmIHRlc3RPbmUoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSByb290IG9mIDEuMCBpcyAxLjAuCisgICAgICAgIGZvciBuIGluIHJhbmdlKDIsIDExKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49bik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5yb290KDEuMCwgbiksIDEuMCkKKworICAgIGRlZiB0ZXN0RnJhY3Rpb24oc2VsZik6CisgICAgICAgICMgVGVzdCBGcmFjdGlvbiByZXN1bHRzLgorICAgICAgICB4ID0gRnJhY3Rpb24oODksIDc1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnJvb3QoeCoqMTIsIDEyKSwgZmxvYXQoeCkpCisKKyAgICBkZWYgdGVzdEludChzZWxmKToKKyAgICAgICAgIyBUZXN0IGludCByZXN1bHRzLgorICAgICAgICB4ID0gMjc2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5ucm9vdCh4KioyNCwgMjQpLCB4KQorCisgICAgZGVmIHRlc3RCaWdJbnQoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGludHMgdG9vIGJpZyB0byBjb252ZXJ0IHRvIGZsb2F0cyB3b3JrLgorICAgICAgICBiaWdudW0gPSAxMCoqMjAgICMgVGhhdCdzIG5vdCB0aGF0IGJpZy4uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnJvb3QoYmlnbnVtKioyODAsIDI4MCksIGJpZ251bSkKKyAgICAgICAgIyBDYW4gd2UgbWFrZSBpdCBiaWdnZXI/CisgICAgICAgIGh1Z2VudW0gPSBiaWdudW0qKjUwCisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgaXQgaXMgdG9vIGJpZyB0byBjb252ZXJ0IHRvIGEgZmxvYXQuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHkgPSBmbG9hdChodWdlbnVtKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdodWdlbnVtIGlzIG5vdCBiaWcgZW5vdWdoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5yb290KGh1Z2VudW0sIDUwKSwgZmxvYXQoYmlnbnVtKSkKKworICAgIGRlZiB0ZXN0RGVjaW1hbChzZWxmKToKKyAgICAgICAgIyBUZXN0IERlY2ltYWwgcmVzdWx0cy4KKyAgICAgICAgZm9yIHMgaW4gJzMuNzU5IDY0LjAyNyA1MjM0LjMzOCcuc3BsaXQoKToKKyAgICAgICAgICAgIHggPSBkZWNpbWFsLkRlY2ltYWwocykKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHg9eCk6CisgICAgICAgICAgICAgICAgYSA9IHNlbGYubnJvb3QoeCoqNSwgNSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHgpCisgICAgICAgICAgICAgICAgYSA9IHNlbGYubnJvb3QoeCoqMTcsIDE3KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgeCkKKworICAgIGRlZiB0ZXN0RmxvYXQoc2VsZik6CisgICAgICAgICMgVGVzdCBmbG9hdCByZXN1bHRzLgorICAgICAgICBmb3IgeCBpbiAoMy4wNGUtMTYsIDE4LjI1LCA0NjEuMywgMS45ZTE3KToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHg9eCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5yb290KHgqKjMsIDMpLCB4KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5ucm9vdCh4Kio4LCA4KSwgeCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnJvb3QoeCoqMTEsIDExKSwgeCkKKworCitjbGFzcyBUZXN0X050aFJvb3RfTlModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgaW50ZXJuYWxzIG9mIHRoZSBudGhfcm9vdCBmdW5jdGlvbiwgaGlkZGVuIGluIF9ucm9vdF9OUy4iIiIKKworICAgIGRlZiB0ZXN0X2NsYXNzX2Nhbm5vdF9iZV9pbnN0YW50aWF0ZWQoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IF9ucm9vdF9OUyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgorICAgICAgICAjIEl0IHNob3VsZCBiZSBhIG5hbWVzcGFjZSwgbGlrZSBpbiBDKysgb3IgQyMsIGJ1dCBQeXRob24KKyAgICAgICAgIyBsYWNrcyB0aGF0IGZlYXR1cmUgYW5kIHNvIHdlIGhhdmUgdG8gbWFrZSBkbyB3aXRoIGEgY2xhc3MuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3RhdGlzdGljcy5fbnJvb3RfTlMpCisKKwogIyA9PT0gVGVzdHMgZm9yIHB1YmxpYyBmdW5jdGlvbnMgPT09CiAKIGNsYXNzIFVuaXZhcmlhdGVDb21tb25NaXhpbjoKQEAgLTEwODIsMTMgKzEzODgsMTMgQEAKICAgICBOb3QgYWxsIHRlc3RzIHRvIGRvIHdpdGggdHlwZXMgbmVlZCBnbyBpbiB0aGlzIGNsYXNzLiBPbmx5IHRob3NlIHRoYXQKICAgICByZWx5IG9uIHRoZSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNhbWUgdHlwZSBhcyBpdHMgaW5wdXQgZGF0YS4KICAgICAiIiIKLSAgICBkZWYgdGVzdF90eXBlc19jb25zZXJ2ZWQoc2VsZik6Ci0gICAgICAgICMgVGVzdCB0aGF0IGZ1bmN0aW9ucyBrZWVwcyB0aGUgc2FtZSB0eXBlIGFzIHRoZWlyIGRhdGEgcG9pbnRzLgotICAgICAgICAjIChFeGNsdWRlcyBtaXhlZCBkYXRhIHR5cGVzLikgVGhpcyBvbmx5IHRlc3RzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4KLSAgICAgICAgIyByZXN1bHQsIG5vdCB0aGUgdmFsdWUuCisgICAgZGVmIHByZXBhcmVfdHlwZXNfZm9yX2NvbnNlcnZhdGlvbl90ZXN0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHR5cGVzIHdoaWNoIGFyZSBleHBlY3RlZCB0byBiZSBjb25zZXJ2ZWQuIiIiCiAgICAgICAgIGNsYXNzIE15RmxvYXQoZmxvYXQpOgogICAgICAgICAgICAgZGVmIF9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKToKICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKShzdXBlcigpLl9fdHJ1ZWRpdl9fKG90aGVyKSkKKyAgICAgICAgICAgIGRlZiBfX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiB0eXBlKHNlbGYpKHN1cGVyKCkuX19ydHJ1ZWRpdl9fKG90aGVyKSkKICAgICAgICAgICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToKICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKShzdXBlcigpLl9fc3ViX18ob3RoZXIpKQogICAgICAgICAgICAgZGVmIF9fcnN1Yl9fKHNlbGYsIG90aGVyKToKQEAgLTEwOTgsOSArMTQwNCwxNCBAQAogICAgICAgICAgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAgICAgICAgIHJldHVybiB0eXBlKHNlbGYpKHN1cGVyKCkuX19hZGRfXyhvdGhlcikpCiAgICAgICAgICAgICBfX3JhZGRfXyA9IF9fYWRkX18KKyAgICAgICAgcmV0dXJuIChmbG9hdCwgRGVjaW1hbCwgRnJhY3Rpb24sIE15RmxvYXQpCiAKKyAgICBkZWYgdGVzdF90eXBlc19jb25zZXJ2ZWQoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGZ1bmN0aW9ucyBrZWVwcyB0aGUgc2FtZSB0eXBlIGFzIHRoZWlyIGRhdGEgcG9pbnRzLgorICAgICAgICAjIChFeGNsdWRlcyBtaXhlZCBkYXRhIHR5cGVzLikgVGhpcyBvbmx5IHRlc3RzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4KKyAgICAgICAgIyByZXN1bHQsIG5vdCB0aGUgdmFsdWUuCiAgICAgICAgIGRhdGEgPSBzZWxmLnByZXBhcmVfZGF0YSgpCi0gICAgICAgIGZvciBraW5kIGluIChmbG9hdCwgRGVjaW1hbCwgRnJhY3Rpb24sIE15RmxvYXQpOgorICAgICAgICBmb3Iga2luZCBpbiBzZWxmLnByZXBhcmVfdHlwZXNfZm9yX2NvbnNlcnZhdGlvbl90ZXN0KCk6CiAgICAgICAgICAgICBkID0gW2tpbmQoeCkgZm9yIHggaW4gZGF0YV0KICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZnVuYyhkKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHJlc3VsdCksIGtpbmQpCkBAIC0xMjc1LDEyICsxNTg2LDE2IEBACiAgICAgICAgIGZvciB4IGluICgyMywgNDIuNSwgMS4zZTE1LCBGcmFjdGlvbigxNSwgMTkpLCBEZWNpbWFsKCcwLjI4JykpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZ1bmMoW3hdKSwgeCkKIAorICAgIGRlZiBwcmVwYXJlX3ZhbHVlc19mb3JfcmVwZWF0ZWRfc2luZ2xlX3Rlc3Qoc2VsZik6CisgICAgICAgIHJldHVybiAoMy41LCAxNywgMi41ZTE1LCBGcmFjdGlvbig2MSwgNjcpLCBEZWNpbWFsKCc0Ljk3MTInKSkKKwogICAgIGRlZiB0ZXN0X3JlcGVhdGVkX3NpbmdsZV92YWx1ZShzZWxmKToKICAgICAgICAgIyBUaGUgYXZlcmFnZSBvZiBhIHNpbmdsZSByZXBlYXRlZCB2YWx1ZSBpcyB0aGUgdmFsdWUgaXRzZWxmLgotICAgICAgICBmb3IgeCBpbiAoMy41LCAxNywgMi41ZTE1LCBGcmFjdGlvbig2MSwgNjcpLCBEZWNpbWFsKCc0Ljk3MTInKSk6CisgICAgICAgIGZvciB4IGluIHNlbGYucHJlcGFyZV92YWx1ZXNfZm9yX3JlcGVhdGVkX3NpbmdsZV90ZXN0KCk6CiAgICAgICAgICAgICBmb3IgY291bnQgaW4gKDIsIDUsIDEwLCAyMCk6Ci0gICAgICAgICAgICAgICAgZGF0YSA9IFt4XSpjb3VudAotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mdW5jKGRhdGEpLCB4KQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHg9eCwgY291bnQ9Y291bnQpOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gW3hdKmNvdW50CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mdW5jKGRhdGEpLCB4KQogCiAKIGNsYXNzIFRlc3RNZWFuKE51bWVyaWNUZXN0Q2FzZSwgQXZlcmFnZU1peGluLCBVbml2YXJpYXRlVHlwZU1peGluKToKQEAgLTEzMDQsNyArMTYxOSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mdW5jKGRhdGEpLCAyMi4wMTU2MjUpCiAKICAgICBkZWYgdGVzdF9kZWNpbWFscyhzZWxmKToKLSAgICAgICAgIyBUZXN0IG1lYW4gd2l0aCBpbnRzLgorICAgICAgICAjIFRlc3QgbWVhbiB3aXRoIERlY2ltYWxzLgogICAgICAgICBEID0gRGVjaW1hbAogICAgICAgICBkYXRhID0gW0QoIjEuNjM0IiksIEQoIjIuNTE3IiksIEQoIjMuOTEyIiksIEQoIjQuMDcyIiksIEQoIjUuODEzIildCiAgICAgICAgIHJhbmRvbS5zaHVmZmxlKGRhdGEpCkBAIC0xMzc5LDYgKzE2OTQsOTQgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGlzdGljcy5tZWFuKFt0aW55XSpuKSwgdGlueSkKIAogCitjbGFzcyBUZXN0SGFybW9uaWNNZWFuKE51bWVyaWNUZXN0Q2FzZSwgQXZlcmFnZU1peGluLCBVbml2YXJpYXRlVHlwZU1peGluKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZnVuYyA9IHN0YXRpc3RpY3MuaGFybW9uaWNfbWVhbgorCisgICAgZGVmIHByZXBhcmVfZGF0YShzZWxmKToKKyAgICAgICAgIyBPdmVycmlkZSBtaXhpbiBtZXRob2QuCisgICAgICAgIHZhbHVlcyA9IHN1cGVyKCkucHJlcGFyZV9kYXRhKCkKKyAgICAgICAgdmFsdWVzLnJlbW92ZSgwKQorICAgICAgICByZXR1cm4gdmFsdWVzCisKKyAgICBkZWYgcHJlcGFyZV92YWx1ZXNfZm9yX3JlcGVhdGVkX3NpbmdsZV90ZXN0KHNlbGYpOgorICAgICAgICAjIE92ZXJyaWRlIG1peGluIG1ldGhvZC4KKyAgICAgICAgcmV0dXJuICgzLjUsIDE3LCAyLjVlMTUsIEZyYWN0aW9uKDYxLCA2NyksIERlY2ltYWwoJzQuMTI1JykpCisKKyAgICBkZWYgdGVzdF96ZXJvKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBoYXJtb25pYyBtZWFuIHJldHVybnMgemVybyB3aGVuIGdpdmVuIHplcm8uCisgICAgICAgIHZhbHVlcyA9IFsxLCAwLCAyXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZnVuYyh2YWx1ZXMpLCAwKQorCisgICAgZGVmIHRlc3RfbmVnYXRpdmVfZXJyb3Ioc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGhhcm1vbmljIG1lYW4gcmFpc2VzIHdoZW4gZ2l2ZW4gYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgICAgICAgZXhjID0gc3RhdGlzdGljcy5TdGF0aXN0aWNzRXJyb3IKKyAgICAgICAgZm9yIHZhbHVlcyBpbiAoWy0xXSwgWzEsIC0yLCAzXSk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh2YWx1ZXM9dmFsdWVzKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhleGMsIHNlbGYuZnVuYywgdmFsdWVzKQorCisgICAgZGVmIHRlc3RfaW50cyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGhhcm1vbmljIG1lYW4gd2l0aCBpbnRzLgorICAgICAgICBkYXRhID0gWzIsIDQsIDQsIDgsIDE2LCAxNl0KKyAgICAgICAgcmFuZG9tLnNodWZmbGUoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZ1bmMoZGF0YSksIDYqNC81KQorCisgICAgZGVmIHRlc3RfZmxvYXRzX2V4YWN0KHNlbGYpOgorICAgICAgICAjIFRlc3QgaGFybW9uaWMgbWVhbiB3aXRoIHNvbWUgY2FyZWZ1bGx5IGNob3NlbiBmbG9hdHMuCisgICAgICAgIGRhdGEgPSBbMS84LCAxLzQsIDEvNCwgMS8yLCAxLzJdCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mdW5jKGRhdGEpLCAxLzQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mdW5jKFswLjI1LCAwLjUsIDEuMCwgMS4wXSksIDAuNSkKKworICAgIGRlZiB0ZXN0X3NpbmdsZXRvbl9saXN0cyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgaGFybW9uaWMgbWVhbihbeF0pIHJldHVybnMgKGFwcHJveGltYXRlbHkpIHguCisgICAgICAgIGZvciB4IGluIHJhbmdlKDEsIDEwMSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZnVuYyhbeF0pLCB4KQorCisgICAgZGVmIHRlc3RfZGVjaW1hbHNfZXhhY3Qoc2VsZik6CisgICAgICAgICMgVGVzdCBoYXJtb25pYyBtZWFuIHdpdGggc29tZSBjYXJlZnVsbHkgY2hvc2VuIERlY2ltYWxzLgorICAgICAgICBEID0gRGVjaW1hbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZnVuYyhbRCgxNSksIEQoMzApLCBEKDYwKSwgRCg2MCldKSwgRCgzMCkpCisgICAgICAgIGRhdGEgPSBbRCgiMC4wNSIpLCBEKCIwLjEwIiksIEQoIjAuMjAiKSwgRCgiMC4yMCIpXQorICAgICAgICByYW5kb20uc2h1ZmZsZShkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZnVuYyhkYXRhKSwgRCgiMC4xMCIpKQorICAgICAgICBkYXRhID0gW0QoIjEuNjgiKSwgRCgiMC4zMiIpLCBEKCI1Ljk0IiksIEQoIjIuNzUiKV0KKyAgICAgICAgcmFuZG9tLnNodWZmbGUoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZ1bmMoZGF0YSksIEQoNjY1MjgpLzcwNzIzKQorCisgICAgZGVmIHRlc3RfZnJhY3Rpb25zKHNlbGYpOgorICAgICAgICAjIFRlc3QgaGFybW9uaWMgbWVhbiB3aXRoIEZyYWN0aW9ucy4KKyAgICAgICAgRiA9IEZyYWN0aW9uCisgICAgICAgIGRhdGEgPSBbRigxLCAyKSwgRigyLCAzKSwgRigzLCA0KSwgRig0LCA1KSwgRig1LCA2KSwgRig2LCA3KSwgRig3LCA4KV0KKyAgICAgICAgcmFuZG9tLnNodWZmbGUoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZ1bmMoZGF0YSksIEYoNyo0MjAsIDQwMjkpKQorCisgICAgZGVmIHRlc3RfaW5mKHNlbGYpOgorICAgICAgICAjIFRlc3QgaGFybW9uaWMgbWVhbiB3aXRoIGluZmluaXR5LgorICAgICAgICB2YWx1ZXMgPSBbMi4wLCBmbG9hdCgnaW5mJyksIDEuMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZ1bmModmFsdWVzKSwgMi4wKQorCisgICAgZGVmIHRlc3RfbmFuKHNlbGYpOgorICAgICAgICAjIFRlc3QgaGFybW9uaWMgbWVhbiB3aXRoIE5BTnMuCisgICAgICAgIHZhbHVlcyA9IFsyLjAsIGZsb2F0KCduYW4nKSwgMS4wXQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihzZWxmLmZ1bmModmFsdWVzKSkpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBseV9kYXRhX3BvaW50cyhzZWxmKToKKyAgICAgICAgIyBUZXN0IG11bHRpcGx5aW5nIGV2ZXJ5IGRhdGEgcG9pbnQgYnkgYSBjb25zdGFudC4KKyAgICAgICAgYyA9IDExMQorICAgICAgICBkYXRhID0gWzMuNCwgNC41LCA0LjksIDYuNywgNi44LCA3LjIsIDguMCwgOC4xLCA5LjRdCisgICAgICAgIGV4cGVjdGVkID0gc2VsZi5mdW5jKGRhdGEpKmMKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5mdW5jKFt4KmMgZm9yIHggaW4gZGF0YV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2RvdWJsZWRfZGF0YShzZWxmKToKKyAgICAgICAgIyBIYXJtb25pYyBtZWFuIG9mIFthLGIuLi56XSBzaG91bGQgYmUgc2FtZSBhcyBmb3IgW2EsYSxiLGIuLi56LHpdLgorICAgICAgICBkYXRhID0gW3JhbmRvbS51bmlmb3JtKDEsIDUpIGZvciBfIGluIHJhbmdlKDEwMDApXQorICAgICAgICBleHBlY3RlZCA9IHNlbGYuZnVuYyhkYXRhKQorICAgICAgICBhY3R1YWwgPSBzZWxmLmZ1bmMoZGF0YSoyKQorICAgICAgICBzZWxmLmFzc2VydEFwcHJveEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisKKwogY2xhc3MgVGVzdE1lZGlhbihOdW1lcmljVGVzdENhc2UsIEF2ZXJhZ2VNaXhpbik6CiAgICAgIyBDb21tb24gdGVzdHMgZm9yIG1lZGlhbiBhbmQgYWxsIG1lZGlhbi4qIGZ1bmN0aW9ucy4KICAgICBkZWYgc2V0VXAoc2VsZik6CkBAIC0xNjAwLDYgKzIwMDMsMjIgQEAKICAgICAgICAgZGF0YSA9IFsyMjAsIDIyMCwgMjQwLCAyNjAsIDI2MCwgMjYwLCAyNjAsIDI4MCwgMjgwLCAzMDAsIDMyMCwgMzQwXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZnVuYyhkYXRhLCAyMCksIDI2NS4wKQogCisgICAgZGVmIHRlc3RfZGF0YV90eXBlX2Vycm9yKHNlbGYpOgorICAgICAgICAjIFRlc3QgbWVkaWFuX2dyb3VwZWQgd2l0aCBzdHIsIGJ5dGVzIGRhdGEgdHlwZXMgZm9yIGRhdGEgYW5kIGludGVydmFsCisgICAgICAgIGRhdGEgPSBbIiIsICIiLCAiIl0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmZ1bmMsIGRhdGEpCisgICAgICAgICMtLS0KKyAgICAgICAgZGF0YSA9IFtiIiIsIGIiIiwgYiIiXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZnVuYywgZGF0YSkKKyAgICAgICAgIy0tLQorICAgICAgICBkYXRhID0gWzEsIDIsIDNdCisgICAgICAgIGludGVydmFsID0gIiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmZ1bmMsIGRhdGEsIGludGVydmFsKQorICAgICAgICAjLS0tCisgICAgICAgIGRhdGEgPSBbMSwgMiwgM10KKyAgICAgICAgaW50ZXJ2YWwgPSBiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmZ1bmMsIGRhdGEsIGludGVydmFsKQorCiAKIGNsYXNzIFRlc3RNb2RlKE51bWVyaWNUZXN0Q2FzZSwgQXZlcmFnZU1peGluLCBVbml2YXJpYXRlVHlwZU1peGluKToKICAgICAjIFRlc3QgY2FzZXMgZm9yIHRoZSBkaXNjcmV0ZSB2ZXJzaW9uIG9mIG1vZGUuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cmZ0aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF9zdHJmdGltZS5weQppbmRleCA3NzJjZDA2Li43MmIxOTEwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cmZ0aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RyZnRpbWUucHkKQEAgLTIzLDkgKzIzLDkgQEAKICAgICAiIiIKICAgICBuZXdfdGV4dCA9IHJlLmVzY2FwZSh0ZXh0KQogICAgIG5ld190ZXh0ID0gbmV3X3RleHQucmVwbGFjZShyZS5lc2NhcGUoYW1wbSksIGFtcG0pCi0gICAgbmV3X3RleHQgPSBuZXdfdGV4dC5yZXBsYWNlKCdcJScsICclJykKLSAgICBuZXdfdGV4dCA9IG5ld190ZXh0LnJlcGxhY2UoJ1w6JywgJzonKQotICAgIG5ld190ZXh0ID0gbmV3X3RleHQucmVwbGFjZSgnXD8nLCAnPycpCisgICAgbmV3X3RleHQgPSBuZXdfdGV4dC5yZXBsYWNlKHInXCUnLCAnJScpCisgICAgbmV3X3RleHQgPSBuZXdfdGV4dC5yZXBsYWNlKHInXDonLCAnOicpCisgICAgbmV3X3RleHQgPSBuZXdfdGV4dC5yZXBsYWNlKHInXD8nLCAnPycpCiAgICAgcmV0dXJuIG5ld190ZXh0CiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJsaXQucHkgYi9MaWIvdGVzdC90ZXN0X3N0cmxpdC5weQppbmRleCA4N2NmZmU4Li4zN2FjZTIzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cmxpdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cmxpdC5weQpAQCAtMTIxLDkgKzEyMSw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiIiIgYidceDAxJyAiIiIpLCBieXRlKDEpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwociIiIiBiJ1x4ODEnICIiIiksIGJ5dGUoMHg4MSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiIiIgYidceDgxJyAiIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyIiIiIGInXHUxODgxJyAiIiIpLCBiJ1xcJyArIGIndTE4ODEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwociIiIiBicidcdTE4ODEnICIiIiksIGInXFwnICsgYid1MTg4MScpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiIiIgYidcdTE4ODEnICIiIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHIiIiIgYidcVTAwMDFkMTIwJyAiIiIpLCBiJ1xcJyArIGInVTAwMDFkMTIwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHIiIiIgYnInXFUwMDAxZDEyMCcgIiIiKSwgYidcXCcgKyBiJ1UwMDAxZDEyMCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiIiIgYidcVTAwMDFkMTIwJyAiIiIpCiAKICAgICBkZWYgdGVzdF9ldmFsX2J5dGVzX2luY29tcGxldGUoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weQppbmRleCA4NTEyNmU2Li4yMmVhYzMyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkKQEAgLTUsNyArNSw2IEBACiBpbXBvcnQgbG9jYWxlCiBpbXBvcnQgcmUKIGltcG9ydCBvcwotaW1wb3J0IHN5cwogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRlIGFzIGRhdGV0aW1lX2RhdGUKIApAQCAtMTMwLDcgKzEyOSw3IEBACiAgICAgZGVmIHRlc3RfcGF0dGVybl9lc2NhcGluZyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgYW55IGNoYXJhY3RlcnMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdGhhdCBtaWdodCBiZSB0YWtlbiBhcwogICAgICAgICAjIHJlZ2V4IHN5bnRheCBpcyBlc2NhcGVkLgotICAgICAgICBwYXR0ZXJuX3N0cmluZyA9IHNlbGYudGltZV9yZS5wYXR0ZXJuKCJcZCsiKQorICAgICAgICBwYXR0ZXJuX3N0cmluZyA9IHNlbGYudGltZV9yZS5wYXR0ZXJuKHIiXGQrIikKICAgICAgICAgc2VsZi5hc3NlcnRJbihyIlxcZFwrIiwgcGF0dGVybl9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIiVzIGRvZXMgbm90IGhhdmUgcmUgY2hhcmFjdGVycyBlc2NhcGVkIHByb3Blcmx5IiAlCiAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9zdHJpbmcpCkBAIC0xNTMsOCArMTUyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyB1c2luZyAnJXMnOyBncm91cCAnYScgPSAnJXMnLCBncm91cCAnYicgPSAlcyciICUKICAgICAgICAgICAgICAgICAgICAgICAgICAoZm91bmQuc3RyaW5nLCBmb3VuZC5yZS5wYXR0ZXJuLCBmb3VuZC5ncm91cCgnYScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5ncm91cCgnYicpKSkKLSAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ2EnLCdBJywnYicsJ0InLCdjJywnZCcsJ0gnLCdJJywnaicsJ20nLCdNJywncCcsJ1MnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnVScsJ3cnLCdXJywneCcsJ1gnLCd5JywnWScsJ1onLCclJyk6CisgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdhJywnQScsJ2InLCdCJywnYycsJ2QnLCdHJywnSCcsJ0knLCdqJywnbScsJ00nLCdwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnLCd1JywnVScsJ1YnLCd3JywnVycsJ3gnLCdYJywneScsJ1knLCdaJywnJScpOgogICAgICAgICAgICAgY29tcGlsZWQgPSBzZWxmLnRpbWVfcmUuY29tcGlsZSgiJSIgKyBkaXJlY3RpdmUpCiAgICAgICAgICAgICBmb3VuZCA9IGNvbXBpbGVkLm1hdGNoKHRpbWUuc3RyZnRpbWUoIiUiICsgZGlyZWN0aXZlKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZCwgIk1hdGNoaW5nIGZhaWxlZCBvbiAnJXMnIHVzaW5nICclcycgcmVnZXgiICUKQEAgLTE3MSw5ICsxNzAsOSBAQAogCiAgICAgZGVmIHRlc3RfbWF0Y2hpbmdfd2l0aF9lc2NhcGVzKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSBhIGZvcm1hdCB0aGF0IHJlcXVpcmVzIGVzY2FwaW5nIG9mIGNoYXJhY3RlcnMgd29ya3MKLSAgICAgICAgY29tcGlsZWRfcmUgPSBzZWxmLnRpbWVfcmUuY29tcGlsZSgiXHcrICVtIikKLSAgICAgICAgZm91bmQgPSBjb21waWxlZF9yZS5tYXRjaCgiXHcrIDEwIikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLCAiRXNjYXBpbmcgZmFpbGVkIG9mIGZvcm1hdCAnXHcrIDEwJyIpCisgICAgICAgIGNvbXBpbGVkX3JlID0gc2VsZi50aW1lX3JlLmNvbXBpbGUociJcdysgJW0iKQorICAgICAgICBmb3VuZCA9IGNvbXBpbGVkX3JlLm1hdGNoKHIiXHcrIDEwIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLCByIkVzY2FwaW5nIGZhaWxlZCBvZiBmb3JtYXQgJ1x3KyAxMCciKQogCiAgICAgZGVmIHRlc3RfbG9jYWxlX2RhdGFfd19yZWdleF9tZXRhY2hhcmFjdGVycyhzZWxmKToKICAgICAgICAgIyBDaGVjayB0aGF0IGlmIGxvY2FsZSBkYXRhIGNvbnRhaW5zIHJlZ2V4IG1ldGFjaGFyYWN0ZXJzIHRoZXkgYXJlCkBAIC0yMTksNiArMjE4LDI2IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJyVzJyBkaWQgbm90IHJhaXNlIFZhbHVlRXJyb3IiICUgYmFkX2Zvcm1hdCkKIAorICAgICAgICAjIEFtYmlndW91cyBvciBpbmNvbXBsZXRlIGNhc2VzIHVzaW5nIElTTyB5ZWFyL3dlZWsvd2Vla2RheSBkaXJlY3RpdmVzCisgICAgICAgICMgMS4gSVNPIHdlZWsgKCVWKSBpcyBzcGVjaWZpZWQsIGJ1dCB0aGUgeWVhciBpcyBzcGVjaWZpZWQgd2l0aCAlWQorICAgICAgICAjIGluc3RlYWQgb2YgJUcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWUoIjE5OTkgNTAiLCAiJVkgJVYiKQorICAgICAgICAjIDIuIElTTyB5ZWFyICglRykgYW5kIElTTyB3ZWVrICglVikgYXJlIHNwZWNpZmllZCwgYnV0IHdlZWtkYXkgaXMgbm90CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lKCIxOTk5IDUxIiwgIiVHICVWIikKKyAgICAgICAgIyAzLiBJU08geWVhciAoJUcpIGFuZCB3ZWVrZGF5IGFyZSBzcGVjaWZpZWQsIGJ1dCBJU08gd2VlayAoJVYpIGlzIG5vdAorICAgICAgICBmb3IgdyBpbiAoJ0EnLCAnYScsICd3JywgJ3UnKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZSgiMTk5OSA1MSIsIiVHICV7fSIuZm9ybWF0KHcpKQorICAgICAgICAjIDQuIElTTyB5ZWFyIGlzIHNwZWNpZmllZCBhbG9uZSAoZS5nLiB0aW1lLnN0cnB0aW1lKCcyMDE1JywgJyVHJykpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lKCIyMDE1IiwgIiVHIikKKyAgICAgICAgIyA1LiBKdWxpYW4vb3JkaW5hbCBkYXkgKCVqKSBpcyBzcGVjaWZpZWQgd2l0aCAlRywgYnV0IG5vdCAlWQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZSgiMTk5OSAyNTYiLCAiJUcgJWoiKQorCisKICAgICBkZWYgdGVzdF9zdHJwdGltZV9leGNlcHRpb25fY29udGV4dChzZWxmKToKICAgICAgICAgIyBjaGVjayB0aGF0IHRoaXMgZG9lc24ndCBjaGFpbiBleGNlcHRpb25zIG5lZWRsZXNzbHkgKHNlZSAjMTc1NzIpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgZToKQEAgLTI5MCw3ICszMDksNyBAQAogCiAgICAgZGVmIHRlc3Rfd2Vla2RheShzZWxmKToKICAgICAgICAgIyBUZXN0IHdlZWtkYXkgZGlyZWN0aXZlcwotICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnQScsICdhJywgJ3cnKToKKyAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ0EnLCAnYScsICd3JywgJ3UnKToKICAgICAgICAgICAgIHNlbGYuaGVscGVyKGRpcmVjdGl2ZSw2KQogCiAgICAgZGVmIHRlc3RfanVsaWFuKHNlbGYpOgpAQCAtMzg0LDcgKzQwMyw3IEBACiAgICAgICAgICMgdW5iYWxhbmNlZCBwYXJlbnRoZXNlcyB3aGVuIHRoZSByZWdleCBpcyBjb21waWxlZCBpZiB0aGV5IGFyZSBub3QKICAgICAgICAgIyBlc2NhcGVkLgogICAgICAgICAjIFRlc3QgaW5zdGlnYXRlZCBieSBidWcgIzc5NjE0OSAuCi0gICAgICAgIG5lZWRfZXNjYXBpbmcgPSAiLl4kKis/e31cW118KSgiCisgICAgICAgIG5lZWRfZXNjYXBpbmcgPSByIi5eJCorP3t9XFtdfCkoIgogICAgICAgICBzZWxmLmFzc2VydFRydWUoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKG5lZWRfZXNjYXBpbmcsIG5lZWRfZXNjYXBpbmcpKQogCiAgICAgZGVmIHRlc3RfZmViMjlfb25fbGVhcF95ZWFyX3dpdGhvdXRfeWVhcihzZWxmKToKQEAgLTQ1NywxNiArNDc2LDIwIEBACiAgICAgICAgICMgU2hvdWxkIGJlIGFibGUgdG8gaW5mZXIgZGF0ZSBpZiBnaXZlbiB5ZWFyLCB3ZWVrIG9mIHllYXIgKCVVIG9yICVXKQogICAgICAgICAjIGFuZCBkYXkgb2YgdGhlIHdlZWsKICAgICAgICAgZGVmIHRlc3RfaGVscGVyKHltZF90dXBsZSwgdGVzdF9yZWFzb24pOgotICAgICAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ1cnLCAnVScpOgotICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcgPSAiJSVZICUlJXMgJSV3IiAlIGRpcmVjdGl2ZQotICAgICAgICAgICAgICAgIGR0X2RhdGUgPSBkYXRldGltZV9kYXRlKCp5bWRfdHVwbGUpCi0gICAgICAgICAgICAgICAgc3RycF9pbnB1dCA9IGR0X2RhdGUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZykKLSAgICAgICAgICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJwX2lucHV0LCBmb3JtYXRfc3RyaW5nKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFs6M10gPT0geW1kX3R1cGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVzKSB0ZXN0IGZhaWxlZCB3LyAnJXMnOiAlcyAhPSAlcyAoJXMgIT0gJXMpIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfcmVhc29uLCBkaXJlY3RpdmUsIHN0cnBfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0WzozXSwgeW1kX3R1cGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX291dHB1dFs3XSwgZHRfZGF0ZS50aW1ldHVwbGUoKVs3XSkpCisgICAgICAgICAgICBmb3IgeWVhcl93ZWVrX2Zvcm1hdCBpbiAoJyVZICVXJywgJyVZICVVJywgJyVHICVWJyk6CisgICAgICAgICAgICAgICAgZm9yIHdlZWtkYXlfZm9ybWF0IGluICgnJXcnLCAnJXUnLCAnJWEnLCAnJUEnKToKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZyA9IHllYXJfd2Vla19mb3JtYXQgKyAnICcgKyB3ZWVrZGF5X2Zvcm1hdAorICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh0ZXN0X3JlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT15bWRfdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdD1mb3JtYXRfc3RyaW5nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGR0X2RhdGUgPSBkYXRldGltZV9kYXRlKCp5bWRfdHVwbGUpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX2lucHV0ID0gZHRfZGF0ZS5zdHJmdGltZShmb3JtYXRfc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RycF9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAiJXI6ICVzICE9ICVzIiAlIChzdHJwX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXRbN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdF9kYXRlLnRpbWV0dXBsZSgpWzddKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJwX291dHB1dFs6M10sIHltZF90dXBsZSwgbXNnKQogICAgICAgICB0ZXN0X2hlbHBlcigoMTkwMSwgMSwgMyksICJ3ZWVrIDAiKQogICAgICAgICB0ZXN0X2hlbHBlcigoMTkwMSwgMSwgOCksICJjb21tb24gY2FzZSIpCiAgICAgICAgIHRlc3RfaGVscGVyKCgxOTAxLCAxLCAxMyksICJkYXkgb24gU3VuZGF5IikKQEAgLTQ5OCwzMyArNTIxLDQ4IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSh2YWx1ZSwgZm9ybWF0KVs6LTFdLCBleHBlY3RlZCkKICAgICAgICAgY2hlY2soJzIwMTUgMCAwJywgJyVZICVVICV3JywgMjAxNCwgMTIsIDI4LCAwLCAwLCAwLCA2LCAzNjIpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMCcsICclWSAlVyAldycsIDIwMTUsIDEsIDQsIDAsIDAsIDAsIDYsIDQpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgMScsICclRyAlViAldScsIDIwMTQsIDEyLCAyOSwgMCwgMCwgMCwgMCwgMzYzKQogICAgICAgICBjaGVjaygnMjAxNSAwIDEnLCAnJVkgJVUgJXcnLCAyMDE0LCAxMiwgMjksIDAsIDAsIDAsIDAsIDM2MykKICAgICAgICAgY2hlY2soJzIwMTUgMCAxJywgJyVZICVXICV3JywgMjAxNCwgMTIsIDI5LCAwLCAwLCAwLCAwLCAzNjMpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgMicsICclRyAlViAldScsIDIwMTQsIDEyLCAzMCwgMCwgMCwgMCwgMSwgMzY0KQogICAgICAgICBjaGVjaygnMjAxNSAwIDInLCAnJVkgJVUgJXcnLCAyMDE0LCAxMiwgMzAsIDAsIDAsIDAsIDEsIDM2NCkKICAgICAgICAgY2hlY2soJzIwMTUgMCAyJywgJyVZICVXICV3JywgMjAxNCwgMTIsIDMwLCAwLCAwLCAwLCAxLCAzNjQpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgMycsICclRyAlViAldScsIDIwMTQsIDEyLCAzMSwgMCwgMCwgMCwgMiwgMzY1KQogICAgICAgICBjaGVjaygnMjAxNSAwIDMnLCAnJVkgJVUgJXcnLCAyMDE0LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDM2NSkKICAgICAgICAgY2hlY2soJzIwMTUgMCAzJywgJyVZICVXICV3JywgMjAxNCwgMTIsIDMxLCAwLCAwLCAwLCAyLCAzNjUpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNCcsICclRyAlViAldScsIDIwMTUsIDEsIDEsIDAsIDAsIDAsIDMsIDEpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNCcsICclWSAlVSAldycsIDIwMTUsIDEsIDEsIDAsIDAsIDAsIDMsIDEpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNCcsICclWSAlVyAldycsIDIwMTUsIDEsIDEsIDAsIDAsIDAsIDMsIDEpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNScsICclRyAlViAldScsIDIwMTUsIDEsIDIsIDAsIDAsIDAsIDQsIDIpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNScsICclWSAlVSAldycsIDIwMTUsIDEsIDIsIDAsIDAsIDAsIDQsIDIpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNScsICclWSAlVyAldycsIDIwMTUsIDEsIDIsIDAsIDAsIDAsIDQsIDIpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNicsICclRyAlViAldScsIDIwMTUsIDEsIDMsIDAsIDAsIDAsIDUsIDMpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNicsICclWSAlVSAldycsIDIwMTUsIDEsIDMsIDAsIDAsIDAsIDUsIDMpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNicsICclWSAlVyAldycsIDIwMTUsIDEsIDMsIDAsIDAsIDAsIDUsIDMpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNycsICclRyAlViAldScsIDIwMTUsIDEsIDQsIDAsIDAsIDAsIDYsIDQpCiAKICAgICAgICAgY2hlY2soJzIwMDkgMCAwJywgJyVZICVVICV3JywgMjAwOCwgMTIsIDI4LCAwLCAwLCAwLCA2LCAzNjMpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMCcsICclWSAlVyAldycsIDIwMDksIDEsIDQsIDAsIDAsIDAsIDYsIDQpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgMScsICclRyAlViAldScsIDIwMDgsIDEyLCAyOSwgMCwgMCwgMCwgMCwgMzY0KQogICAgICAgICBjaGVjaygnMjAwOSAwIDEnLCAnJVkgJVUgJXcnLCAyMDA4LCAxMiwgMjksIDAsIDAsIDAsIDAsIDM2NCkKICAgICAgICAgY2hlY2soJzIwMDkgMCAxJywgJyVZICVXICV3JywgMjAwOCwgMTIsIDI5LCAwLCAwLCAwLCAwLCAzNjQpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgMicsICclRyAlViAldScsIDIwMDgsIDEyLCAzMCwgMCwgMCwgMCwgMSwgMzY1KQogICAgICAgICBjaGVjaygnMjAwOSAwIDInLCAnJVkgJVUgJXcnLCAyMDA4LCAxMiwgMzAsIDAsIDAsIDAsIDEsIDM2NSkKICAgICAgICAgY2hlY2soJzIwMDkgMCAyJywgJyVZICVXICV3JywgMjAwOCwgMTIsIDMwLCAwLCAwLCAwLCAxLCAzNjUpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgMycsICclRyAlViAldScsIDIwMDgsIDEyLCAzMSwgMCwgMCwgMCwgMiwgMzY2KQogICAgICAgICBjaGVjaygnMjAwOSAwIDMnLCAnJVkgJVUgJXcnLCAyMDA4LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDM2NikKICAgICAgICAgY2hlY2soJzIwMDkgMCAzJywgJyVZICVXICV3JywgMjAwOCwgMTIsIDMxLCAwLCAwLCAwLCAyLCAzNjYpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgNCcsICclRyAlViAldScsIDIwMDksIDEsIDEsIDAsIDAsIDAsIDMsIDEpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNCcsICclWSAlVSAldycsIDIwMDksIDEsIDEsIDAsIDAsIDAsIDMsIDEpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNCcsICclWSAlVyAldycsIDIwMDksIDEsIDEsIDAsIDAsIDAsIDMsIDEpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgNScsICclRyAlViAldScsIDIwMDksIDEsIDIsIDAsIDAsIDAsIDQsIDIpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNScsICclWSAlVSAldycsIDIwMDksIDEsIDIsIDAsIDAsIDAsIDQsIDIpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNScsICclWSAlVyAldycsIDIwMDksIDEsIDIsIDAsIDAsIDAsIDQsIDIpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgNicsICclRyAlViAldScsIDIwMDksIDEsIDMsIDAsIDAsIDAsIDUsIDMpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNicsICclWSAlVSAldycsIDIwMDksIDEsIDMsIDAsIDAsIDAsIDUsIDMpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNicsICclWSAlVyAldycsIDIwMDksIDEsIDMsIDAsIDAsIDAsIDUsIDMpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgNycsICclRyAlViAldScsIDIwMDksIDEsIDQsIDAsIDAsIDAsIDYsIDQpCisKIAogY2xhc3MgQ2FjaGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiVGVzdCB0aGF0IGNhY2hpbmcgd29ya3MgcHJvcGVybHkuIiIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RydWN0LnB5CmluZGV4IGVmYmRiZmMuLjRkOWQ2MDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RydWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RydWN0LnB5CkBAIC0xLDUgKzEsNiBAQAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgYWJjCiBpbXBvcnQgYXJyYXkKK2ltcG9ydCBtYXRoCiBpbXBvcnQgb3BlcmF0b3IKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN0cnVjdApAQCAtMTUsMjIgKzE2LDEwIEBACiBkZWYgaXRlcl9pbnRlZ2VyX2Zvcm1hdHMoYnl0ZW9yZGVycz1ieXRlb3JkZXJzKToKICAgICBmb3IgY29kZSBpbiBpbnRlZ2VyX2NvZGVzOgogICAgICAgICBmb3IgYnl0ZW9yZGVyIGluIGJ5dGVvcmRlcnM6Ci0gICAgICAgICAgICBpZiAoYnl0ZW9yZGVyIGluICgnJywgJ0AnKSBhbmQgY29kZSBpbiAoJ3EnLCAnUScpIGFuZAotICAgICAgICAgICAgICAgIG5vdCBIQVZFX0xPTkdfTE9ORyk6Ci0gICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIGlmIChieXRlb3JkZXIgbm90IGluICgnJywgJ0AnKSBhbmQgY29kZSBpbiAoJ24nLCAnTicpKToKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgeWllbGQgY29kZSwgYnl0ZW9yZGVyCiAKLSMgTmF0aXZlICdxJyBwYWNraW5nIGlzbid0IGF2YWlsYWJsZSBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGUgQwotIyBsb25nIGxvbmcgdHlwZS4KLXRyeToKLSAgICBzdHJ1Y3QucGFjaygncScsIDUpCi1leGNlcHQgc3RydWN0LmVycm9yOgotICAgIEhBVkVfTE9OR19MT05HID0gRmFsc2UKLWVsc2U6Ci0gICAgSEFWRV9MT05HX0xPTkcgPSBUcnVlCi0KIGRlZiBzdHJpbmdfcmV2ZXJzZShzKToKICAgICByZXR1cm4gc1s6Oi0xXQogCkBAIC0xNTgsOSArMTQ3LDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZSwgZXhwZWN0ZWRfc2l6ZVtjb2RlXSkKIAogICAgICAgICAjIG5hdGl2ZSBpbnRlZ2VyIHNpemVzCi0gICAgICAgIG5hdGl2ZV9wYWlycyA9ICdiQicsICdoSCcsICdpSScsICdsTCcsICduTicKLSAgICAgICAgaWYgSEFWRV9MT05HX0xPTkc6Ci0gICAgICAgICAgICBuYXRpdmVfcGFpcnMgKz0gJ3FRJywKKyAgICAgICAgbmF0aXZlX3BhaXJzID0gJ2JCJywgJ2hIJywgJ2lJJywgJ2xMJywgJ25OJywgJ3FRJwogICAgICAgICBmb3IgZm9ybWF0X3BhaXIgaW4gbmF0aXZlX3BhaXJzOgogICAgICAgICAgICAgZm9yIGJ5dGVvcmRlciBpbiAnJywgJ0AnOgogICAgICAgICAgICAgICAgIHNpZ25lZF9zaXplID0gc3RydWN0LmNhbGNzaXplKGJ5dGVvcmRlciArIGZvcm1hdF9wYWlyWzBdKQpAQCAtMTczLDkgKzE2MCw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKDQsIHN0cnVjdC5jYWxjc2l6ZSgnbCcpKQogICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChzdHJ1Y3QuY2FsY3NpemUoJ2gnKSwgc3RydWN0LmNhbGNzaXplKCdpJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHN0cnVjdC5jYWxjc2l6ZSgnaScpLCBzdHJ1Y3QuY2FsY3NpemUoJ2wnKSkKLSAgICAgICAgaWYgSEFWRV9MT05HX0xPTkc6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCg4LCBzdHJ1Y3QuY2FsY3NpemUoJ3EnKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHN0cnVjdC5jYWxjc2l6ZSgnbCcpLCBzdHJ1Y3QuY2FsY3NpemUoJ3EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoOCwgc3RydWN0LmNhbGNzaXplKCdxJykpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHN0cnVjdC5jYWxjc2l6ZSgnbCcpLCBzdHJ1Y3QuY2FsY3NpemUoJ3EnKSkKICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoc3RydWN0LmNhbGNzaXplKCduJyksIHN0cnVjdC5jYWxjc2l6ZSgnaScpKQogICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChzdHJ1Y3QuY2FsY3NpemUoJ24nKSwgc3RydWN0LmNhbGNzaXplKCdQJykpCiAKQEAgLTM2Niw4ICszNTIsNiBAQAogICAgICAgICAjIFNGIGJ1ZyA3MDU4MzYuICAiPGYiIGFuZCAiPmYiIGhhZCBhIHNldmVyZSByb3VuZGluZyBidWcsIHdoZXJlIGEgY2FycnkKICAgICAgICAgIyBmcm9tIHRoZSBsb3ctb3JkZXIgZGlzY2FyZGVkIGJpdHMgY291bGQgcHJvcGFnYXRlIGludG8gdGhlIGV4cG9uZW50CiAgICAgICAgICMgZmllbGQsIGNhdXNpbmcgdGhlIHJlc3VsdCB0byBiZSB3cm9uZyBieSBhIGZhY3RvciBvZiAyLgotICAgICAgICBpbXBvcnQgbWF0aAotCiAgICAgICAgIGZvciBiYXNlIGluIHJhbmdlKDEsIDMzKToKICAgICAgICAgICAgICMgc21hbGxlciA8LSBsYXJnZXN0IHJlcHJlc2VudGFibGUgZmxvYXQgbGVzcyB0aGFuIGJhc2UuCiAgICAgICAgICAgICBkZWx0YSA9IDAuNQpAQCAtNjU5LDYgKzY0MywxMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgbmV4dCwgaXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIG5leHQsIGl0KQogCisgICAgZGVmIHRlc3RfaGFsZl9mbG9hdChzZWxmKToKKyAgICAgICAgIyBMaXR0bGUtZW5kaWFuIGV4YW1wbGVzIGZyb206CisgICAgICAgICMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYWxmX3ByZWNpc2lvbl9mbG9hdGluZy1wb2ludF9mb3JtYXQKKyAgICAgICAgZm9ybWF0X2JpdHNfZmxvYXRfX2NsZWFuUm91bmR0cmlwX2xpc3QgPSBbCisgICAgICAgICAgICAoYidceDAwXHgzYycsIDEuMCksCisgICAgICAgICAgICAoYidceDAwXHhjMCcsIC0yLjApLAorICAgICAgICAgICAgKGInXHhmZlx4N2InLCA2NTUwNC4wKSwgIyAgKG1heCBoYWxmIHByZWNpc2lvbikKKyAgICAgICAgICAgIChiJ1x4MDBceDA0JywgMioqLTE0KSwgIyB+PSA2LjEwMzUyICogMTAqKi01IChtaW4gcG9zIG5vcm1hbCkKKyAgICAgICAgICAgIChiJ1x4MDFceDAwJywgMioqLTI0KSwgIyB+PSA1Ljk2MDQ2ICogMTAqKi04IChtaW4gcG9zIHN1Ym5vcm1hbCkKKyAgICAgICAgICAgIChiJ1x4MDBceDAwJywgMC4wKSwKKyAgICAgICAgICAgIChiJ1x4MDBceDgwJywgLTAuMCksCisgICAgICAgICAgICAoYidceDAwXHg3YycsIGZsb2F0KCcraW5mJykpLAorICAgICAgICAgICAgKGInXHgwMFx4ZmMnLCBmbG9hdCgnLWluZicpKSwKKyAgICAgICAgICAgIChiJ1x4NTVceDM1JywgMC4zMzMyNTE5NTMxMjUpLCAjIH49IDEvMworICAgICAgICBdCisKKyAgICAgICAgZm9yIGxlX2JpdHMsIGYgaW4gZm9ybWF0X2JpdHNfZmxvYXRfX2NsZWFuUm91bmR0cmlwX2xpc3Q6CisgICAgICAgICAgICBiZV9iaXRzID0gbGVfYml0c1s6Oi0xXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBzdHJ1Y3QudW5wYWNrKCc8ZScsIGxlX2JpdHMpWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZV9iaXRzLCBzdHJ1Y3QucGFjaygnPGUnLCBmKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgc3RydWN0LnVucGFjaygnPmUnLCBiZV9iaXRzKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmVfYml0cywgc3RydWN0LnBhY2soJz5lJywgZikpCisgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgc3RydWN0LnVucGFjaygnZScsIGxlX2JpdHMpWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVfYml0cywgc3RydWN0LnBhY2soJ2UnLCBmKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBzdHJ1Y3QudW5wYWNrKCdlJywgYmVfYml0cylbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiZV9iaXRzLCBzdHJ1Y3QucGFjaygnZScsIGYpKQorCisgICAgICAgICMgQ2hlY2sgZm9yIE5hTiBoYW5kbGluZzoKKyAgICAgICAgZm9ybWF0X2JpdHNfX25hbl9saXN0ID0gWworICAgICAgICAgICAgKCc8ZScsIGInXHgwMVx4ZmMnKSwKKyAgICAgICAgICAgICgnPGUnLCBiJ1x4MDBceGZlJyksCisgICAgICAgICAgICAoJzxlJywgYidceGZmXHhmZicpLAorICAgICAgICAgICAgKCc8ZScsIGInXHgwMVx4N2MnKSwKKyAgICAgICAgICAgICgnPGUnLCBiJ1x4MDBceDdlJyksCisgICAgICAgICAgICAoJzxlJywgYidceGZmXHg3ZicpLAorICAgICAgICBdCisKKyAgICAgICAgZm9yIGZvcm1hdGNvZGUsIGJpdHMgaW4gZm9ybWF0X2JpdHNfX25hbl9saXN0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oc3RydWN0LnVucGFjaygnPGUnLCBiaXRzKVswXSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihzdHJ1Y3QudW5wYWNrKCc+ZScsIGJpdHNbOjotMV0pWzBdKSkKKworICAgICAgICAjIENoZWNrIHRoYXQgcGFja2luZyBwcm9kdWNlcyBhIGJpdCBwYXR0ZXJuIHJlcHJlc2VudGluZyBhIHF1aWV0IE5hTjoKKyAgICAgICAgIyBhbGwgZXhwb25lbnQgYml0cyBhbmQgdGhlIG1zYiBvZiB0aGUgZnJhY3Rpb24gc2hvdWxkIGFsbCBiZSAxLgorICAgICAgICBwYWNrZWQgPSBzdHJ1Y3QucGFjaygnPGUnLCBtYXRoLm5hbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWNrZWRbMV0gJiAweDdlLCAweDdlKQorICAgICAgICBwYWNrZWQgPSBzdHJ1Y3QucGFjaygnPGUnLCAtbWF0aC5uYW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFja2VkWzFdICYgMHg3ZSwgMHg3ZSkKKworICAgICAgICAjIENoZWNrcyBmb3Igcm91bmQtdG8tZXZlbiBiZWhhdmlvcgorICAgICAgICBmb3JtYXRfYml0c19mbG9hdF9fcm91bmRpbmdfbGlzdCA9IFsKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4MDBceDAxJywgMi4wKiotMjUgKyAyLjAqKi0zNSksICMgUm91bmRzIHRvIG1pbmltdW0gc3Vibm9ybWFsCisgICAgICAgICAgICAoJz5lJywgYidceDAwXHgwMCcsIDIuMCoqLTI1KSwgIyBVbmRlcmZsb3dzIHRvIHplcm8gKG5lYXJlc3QgZXZlbiBtb2RlKQorICAgICAgICAgICAgKCc+ZScsIGInXHgwMFx4MDAnLCAyLjAqKi0yNiksICMgVW5kZXJmbG93cyB0byB6ZXJvCisgICAgICAgICAgICAoJz5lJywgYidceDAzXHhmZicsIDIuMCoqLTE0IC0gMi4wKiotMjQpLCAjIExhcmdlc3Qgc3Vibm9ybWFsLgorICAgICAgICAgICAgKCc+ZScsIGInXHgwM1x4ZmYnLCAyLjAqKi0xNCAtIDIuMCoqLTI1IC0gMi4wKiotNjUpLAorICAgICAgICAgICAgKCc+ZScsIGInXHgwNFx4MDAnLCAyLjAqKi0xNCAtIDIuMCoqLTI1KSwKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4MDRceDAwJywgMi4wKiotMTQpLCAjIFNtYWxsZXN0IG5vcm1hbC4KKyAgICAgICAgICAgICgnPmUnLCBiJ1x4M2NceDAxJywgMS4wKzIuMCoqLTExICsgMi4wKiotMTYpLCAjIHJvdW5kcyB0byAxLjArMioqKC0xMCkKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4M2NceDAwJywgMS4wKzIuMCoqLTExKSwgIyByb3VuZHMgdG8gMS4wIChuZWFyZXN0IGV2ZW4gbW9kZSkKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4M2NceDAwJywgMS4wKzIuMCoqLTEyKSwgIyByb3VuZHMgdG8gMS4wCisgICAgICAgICAgICAoJz5lJywgYidceDdiXHhmZicsIDY1NTA0KSwgIyBsYXJnZXN0IG5vcm1hbAorICAgICAgICAgICAgKCc+ZScsIGInXHg3Ylx4ZmYnLCA2NTUxOSksICMgcm91bmRzIHRvIDY1NTA0CisgICAgICAgICAgICAoJz5lJywgYidceDgwXHgwMScsIC0yLjAqKi0yNSAtIDIuMCoqLTM1KSwgIyBSb3VuZHMgdG8gbWluaW11bSBzdWJub3JtYWwKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4ODBceDAwJywgLTIuMCoqLTI1KSwgIyBVbmRlcmZsb3dzIHRvIHplcm8gKG5lYXJlc3QgZXZlbiBtb2RlKQorICAgICAgICAgICAgKCc+ZScsIGInXHg4MFx4MDAnLCAtMi4wKiotMjYpLCAjIFVuZGVyZmxvd3MgdG8gemVybworICAgICAgICAgICAgKCc+ZScsIGInXHhiY1x4MDEnLCAtMS4wLTIuMCoqLTExIC0gMi4wKiotMTYpLCAjIHJvdW5kcyB0byAxLjArMioqKC0xMCkKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4YmNceDAwJywgLTEuMC0yLjAqKi0xMSksICMgcm91bmRzIHRvIDEuMCAobmVhcmVzdCBldmVuIG1vZGUpCisgICAgICAgICAgICAoJz5lJywgYidceGJjXHgwMCcsIC0xLjAtMi4wKiotMTIpLCAjIHJvdW5kcyB0byAxLjAKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4ZmJceGZmJywgLTY1NTE5KSwgIyByb3VuZHMgdG8gNjU1MDQKKyAgICAgICAgXQorCisgICAgICAgIGZvciBmb3JtYXRjb2RlLCBiaXRzLCBmIGluIGZvcm1hdF9iaXRzX2Zsb2F0X19yb3VuZGluZ19saXN0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaXRzLCBzdHJ1Y3QucGFjayhmb3JtYXRjb2RlLCBmKSkKKworICAgICAgICAjIFRoaXMgb3ZlcmZsb3dzLCBhbmQgc28gcmFpc2VzIGFuIGVycm9yCisgICAgICAgIGZvcm1hdF9iaXRzX2Zsb2F0X19yb3VuZGluZ0Vycm9yX2xpc3QgPSBbCisgICAgICAgICAgICAjIFZhbHVlcyB0aGF0IHJvdW5kIHRvIGluZmluaXR5LgorICAgICAgICAgICAgKCc+ZScsIDY1NTIwLjApLAorICAgICAgICAgICAgKCc+ZScsIDY1NTM2LjApLAorICAgICAgICAgICAgKCc+ZScsIDFlMzAwKSwKKyAgICAgICAgICAgICgnPmUnLCAtNjU1MjAuMCksCisgICAgICAgICAgICAoJz5lJywgLTY1NTM2LjApLAorICAgICAgICAgICAgKCc+ZScsIC0xZTMwMCksCisgICAgICAgICAgICAoJzxlJywgNjU1MjAuMCksCisgICAgICAgICAgICAoJzxlJywgNjU1MzYuMCksCisgICAgICAgICAgICAoJzxlJywgMWUzMDApLAorICAgICAgICAgICAgKCc8ZScsIC02NTUyMC4wKSwKKyAgICAgICAgICAgICgnPGUnLCAtNjU1MzYuMCksCisgICAgICAgICAgICAoJzxlJywgLTFlMzAwKSwKKyAgICAgICAgXQorCisgICAgICAgIGZvciBmb3JtYXRjb2RlLCBmIGluIGZvcm1hdF9iaXRzX2Zsb2F0X19yb3VuZGluZ0Vycm9yX2xpc3Q6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzdHJ1Y3QucGFjaywgZm9ybWF0Y29kZSwgZikKKworICAgICAgICAjIERvdWJsZSByb3VuZGluZworICAgICAgICBmb3JtYXRfYml0c19mbG9hdF9fZG91YmxlUm91bmRpbmdFcnJvcl9saXN0ID0gWworICAgICAgICAgICAgKCc+ZScsIGInXHg2N1x4ZmYnLCAweDFmZmRmZmZmZmYgKiAyKiotMjYpLCAjIHNob3VsZCBiZSAyMDQ3LCBpZiBkb3VibGUtcm91bmRlZCA2ND4zMj4xNiwgYmVjb21lcyAyMDQ4CisgICAgICAgIF0KKworICAgICAgICBmb3IgZm9ybWF0Y29kZSwgYml0cywgZiBpbiBmb3JtYXRfYml0c19mbG9hdF9fZG91YmxlUm91bmRpbmdFcnJvcl9saXN0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaXRzLCBzdHJ1Y3QucGFjayhmb3JtYXRjb2RlLCBmKSkKKwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdWJjbGFzc2luaXQucHkgYi9MaWIvdGVzdC90ZXN0X3N1YmNsYXNzaW5pdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTZkZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zdWJjbGFzc2luaXQucHkKQEAgLTAsMCArMSwyNDQgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworaW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfaW5pdF9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gRmFsc2UKKworICAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2luaXRfc3ViY2xhc3NfXygpCisgICAgICAgICAgICAgICAgY2xzLmluaXRpYWxpemVkID0gVHJ1ZQorCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShBLmluaXRpYWxpemVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQi5pbml0aWFsaXplZCkKKworICAgIGRlZiB0ZXN0X2luaXRfc3ViY2xhc3NfZGljdChzZWxmKToKKyAgICAgICAgY2xhc3MgQShkaWN0KToKKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gRmFsc2UKKworICAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2luaXRfc3ViY2xhc3NfXygpCisgICAgICAgICAgICAgICAgY2xzLmluaXRpYWxpemVkID0gVHJ1ZQorCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShBLmluaXRpYWxpemVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQi5pbml0aWFsaXplZCkKKworICAgIGRlZiB0ZXN0X2luaXRfc3ViY2xhc3Nfa3dhcmdzKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGNscy5rd2FyZ3MgPSBrd2FyZ3MKKworICAgICAgICBjbGFzcyBCKEEsIHg9Myk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChCLmt3YXJncywgZGljdCh4PTMpKQorCisgICAgZGVmIHRlc3RfaW5pdF9zdWJjbGFzc19lcnJvcihzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfaW5pdF9zdWJjbGFzc193cm9uZyhzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMsIHdoYXRldmVyKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgY2xhc3MgQihBKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9pbml0X3N1YmNsYXNzX3NraXBwZWQoc2VsZik6CisgICAgICAgIGNsYXNzIEJhc2VXaXRoSW5pdDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBzdXBlcigpLl9faW5pdF9zdWJjbGFzc19fKCoqa3dhcmdzKQorICAgICAgICAgICAgICAgIGNscy5pbml0aWFsaXplZCA9IGNscworCisgICAgICAgIGNsYXNzIEJhc2VXaXRob3V0SW5pdChCYXNlV2l0aEluaXQpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEEoQmFzZVdpdGhvdXRJbml0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydElzKEEuaW5pdGlhbGl6ZWQsIEEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoQmFzZVdpdGhvdXRJbml0LmluaXRpYWxpemVkLCBCYXNlV2l0aG91dEluaXQpCisKKyAgICBkZWYgdGVzdF9pbml0X3N1YmNsYXNzX2RpYW1vbmQoc2VsZik6CisgICAgICAgIGNsYXNzIEJhc2U6CisgICAgICAgICAgICBkZWYgX19pbml0X3N1YmNsYXNzX18oY2xzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2luaXRfc3ViY2xhc3NfXygqKmt3YXJncykKKyAgICAgICAgICAgICAgICBjbHMuY2FsbHMgPSBbXQorCisgICAgICAgIGNsYXNzIExlZnQoQmFzZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgTWlkZGxlOgorICAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscywgbWlkZGxlLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2luaXRfc3ViY2xhc3NfXygqKmt3YXJncykKKyAgICAgICAgICAgICAgICBjbHMuY2FsbHMgKz0gW21pZGRsZV0KKworICAgICAgICBjbGFzcyBSaWdodChCYXNlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMsIHJpZ2h0PSJyaWdodCIsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBzdXBlcigpLl9faW5pdF9zdWJjbGFzc19fKCoqa3dhcmdzKQorICAgICAgICAgICAgICAgIGNscy5jYWxscyArPSBbcmlnaHRdCisKKyAgICAgICAgY2xhc3MgQShMZWZ0LCBNaWRkbGUsIFJpZ2h0LCBtaWRkbGU9Im1pZGRsZSIpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQS5jYWxscywgWyJyaWdodCIsICJtaWRkbGUiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMZWZ0LmNhbGxzLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSaWdodC5jYWxscywgW10pCisKKyAgICBkZWYgdGVzdF9zZXRfbmFtZShzZWxmKToKKyAgICAgICAgY2xhc3MgRGVzY3JpcHRvcjoKKyAgICAgICAgICAgIGRlZiBfX3NldF9uYW1lX18oc2VsZiwgb3duZXIsIG5hbWUpOgorICAgICAgICAgICAgICAgIHNlbGYub3duZXIgPSBvd25lcgorICAgICAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZCA9IERlc2NyaXB0b3IoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQS5kLm5hbWUsICJkIikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhBLmQub3duZXIsIEEpCisKKyAgICBkZWYgdGVzdF9zZXRfbmFtZV9tZXRhY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIE1ldGEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBucyk6CisgICAgICAgICAgICAgICAgcmV0ID0gc3VwZXIoKS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LmQubmFtZSwgImQiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMocmV0LmQub3duZXIsIHJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGNsYXNzIERlc2NyaXB0b3I6CisgICAgICAgICAgICBkZWYgX19zZXRfbmFtZV9fKHNlbGYsIG93bmVyLCBuYW1lKToKKyAgICAgICAgICAgICAgICBzZWxmLm93bmVyID0gb3duZXIKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICAgICAgY2xhc3MgQShtZXRhY2xhc3M9TWV0YSk6CisgICAgICAgICAgICBkID0gRGVzY3JpcHRvcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQSwgMCkKKworICAgIGRlZiB0ZXN0X3NldF9uYW1lX2Vycm9yKHNlbGYpOgorICAgICAgICBjbGFzcyBEZXNjcmlwdG9yOgorICAgICAgICAgICAgZGVmIF9fc2V0X25hbWVfXyhzZWxmLCBvd25lciwgbmFtZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkID0gRGVzY3JpcHRvcigpCisKKyAgICBkZWYgdGVzdF9zZXRfbmFtZV93cm9uZyhzZWxmKToKKyAgICAgICAgY2xhc3MgRGVzY3JpcHRvcjoKKyAgICAgICAgICAgIGRlZiBfX3NldF9uYW1lX18oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZCA9IERlc2NyaXB0b3IoKQorCisgICAgZGVmIHRlc3Rfc2V0X25hbWVfaW5pdF9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgRGVzY3JpcHRvcjoKKyAgICAgICAgICAgIGRlZiBfX3NldF9uYW1lX18oc2VsZiwgb3duZXIsIG5hbWUpOgorICAgICAgICAgICAgICAgIHNlbGYub3duZXIgPSBvd25lcgorICAgICAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgICAgICBjbGFzcyBNZXRhKHR5cGUpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgbnMpOgorICAgICAgICAgICAgICAgIHNlbGYgPSBzdXBlcigpLl9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgbnMpCisgICAgICAgICAgICAgICAgc2VsZi5tZXRhX293bmVyID0gc2VsZi5vd25lcgorICAgICAgICAgICAgICAgIHNlbGYubWV0YV9uYW1lID0gc2VsZi5uYW1lCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscyk6CisgICAgICAgICAgICAgICAgY2xzLm93bmVyID0gY2xzLmQub3duZXIKKyAgICAgICAgICAgICAgICBjbHMubmFtZSA9IGNscy5kLm5hbWUKKworICAgICAgICBjbGFzcyBCKEEsIG1ldGFjbGFzcz1NZXRhKToKKyAgICAgICAgICAgIGQgPSBEZXNjcmlwdG9yKCkKKworICAgICAgICBzZWxmLmFzc2VydElzKEIub3duZXIsIEIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQi5uYW1lLCAnZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoQi5tZXRhX293bmVyLCBCKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEIubmFtZSwgJ2QnKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBjbGFzcyBNeU1ldGEodHlwZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgY2xhc3MgTXlDbGFzcyhtZXRhY2xhc3M9TXlNZXRhLCBvdGhlcmFyZz0xKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgdHlwZXMubmV3X2NsYXNzKCJNeUNsYXNzIiwgKG9iamVjdCwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QobWV0YWNsYXNzPU15TWV0YSwgb3RoZXJhcmc9MSkpCisgICAgICAgIHR5cGVzLnByZXBhcmVfY2xhc3MoIk15Q2xhc3MiLCAob2JqZWN0LCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdChtZXRhY2xhc3M9TXlNZXRhLCBvdGhlcmFyZz0xKSkKKworICAgICAgICBjbGFzcyBNeU1ldGEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSwgb3RoZXJhcmcpOgorICAgICAgICAgICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjbGFzcyBNeUNsYXNzKG1ldGFjbGFzcz1NeU1ldGEsIG90aGVyYXJnPTEpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBNeU1ldGEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UsIG90aGVyYXJnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoKS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UsIG90aGVyYXJnKToKKyAgICAgICAgICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpCisgICAgICAgICAgICAgICAgc2VsZi5vdGhlcmFyZyA9IG90aGVyYXJnCisKKyAgICAgICAgY2xhc3MgTXlDbGFzcyhtZXRhY2xhc3M9TXlNZXRhLCBvdGhlcmFyZz0xKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE15Q2xhc3Mub3RoZXJhcmcsIDEpCisKKyAgICBkZWYgdGVzdF9lcnJvcnNfY2hhbmdlZF9wZXA0ODcoc2VsZik6CisgICAgICAgICMgVGhlc2UgdGVzdHMgZmFpbGVkIGJlZm9yZSBQeXRob24gMy42LCBQRVAgNDg3CisgICAgICAgIGNsYXNzIE15TWV0YSh0eXBlKToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKCkuX19uZXdfXyhjbHMsIG5hbWU9bmFtZSwgYmFzZXM9YmFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0PW5hbWVzcGFjZSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjbGFzcyBNeUNsYXNzKG1ldGFjbGFzcz1NeU1ldGEpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBNeU1ldGEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UsIG90aGVyYXJnKToKKyAgICAgICAgICAgICAgICBzZWxmID0gc3VwZXIoKS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkKKyAgICAgICAgICAgICAgICBzZWxmLm90aGVyYXJnID0gb3RoZXJhcmcKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGNsYXNzIE15Q2xhc3MobWV0YWNsYXNzPU15TWV0YSwgb3RoZXJhcmc9MSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNeUNsYXNzLm90aGVyYXJnLCAxKQorCisgICAgZGVmIHRlc3RfdHlwZShzZWxmKToKKyAgICAgICAgdCA9IHR5cGUoJ05ld0NsYXNzJywgKG9iamVjdCwpLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHQsIHR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5fX25hbWVfXywgJ05ld0NsYXNzJykKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICB0eXBlKG5hbWU9J05ld0NsYXNzJywgYmFzZXM9KG9iamVjdCwpLCBkaWN0PXt9KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKaW5kZXggNzU4ZTA5NC4uMmQ5MjM5YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQpAQCAtMSwyMCArMSwxNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgc2NyaXB0X2hlbHBlcgogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cwogaW1wb3J0IHNpZ25hbAogaW1wb3J0IGlvCi1pbXBvcnQgbG9jYWxlCiBpbXBvcnQgb3MKIGltcG9ydCBlcnJubwogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdGltZQotaW1wb3J0IHJlCiBpbXBvcnQgc2VsZWN0b3JzCiBpbXBvcnQgc3lzY29uZmlnCi1pbXBvcnQgd2FybmluZ3MKIGltcG9ydCBzZWxlY3QKIGltcG9ydCBzaHV0aWwKIGltcG9ydCBnYwpAQCAtMjUsNiArMjEsOSBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIHRocmVhZGluZyA9IE5vbmUKIAoraWYgc3VwcG9ydC5QR086CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoInRlc3QgaXMgbm90IGhlbHBmdWwgZm9yIFBHTyIpCisKIG1zd2luZG93cyA9IChzeXMucGxhdGZvcm0gPT0gIndpbjMyIikKIAogIwpAQCAtNDQ4LDggKzQ0Nyw4IEBACiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5zdGRvdXQud3JpdGUoIm9yYW5nZSIpJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgYiJvcmFuZ2UiKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgYiJvcmFuZ2UiKQogCiAgICAgZGVmIHRlc3Rfc3Rkb3V0X2ZpbGVkZXMoc2VsZik6CiAgICAgICAgICMgc3Rkb3V0IGlzIHNldCB0byBvcGVuIGZpbGUgZGVzY3JpcHRvcgpAQCAtNDc5LDggKzQ3OCw4IEBACiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5zdGRlcnIud3JpdGUoInN0cmF3YmVycnkiKSddLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChwLnN0ZGVyci5yZWFkKCksIGIic3RyYXdiZXJyeSIpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwocC5zdGRlcnIucmVhZCgpLCBiInN0cmF3YmVycnkiKQogCiAgICAgZGVmIHRlc3Rfc3RkZXJyX2ZpbGVkZXMoc2VsZik6CiAgICAgICAgICMgc3RkZXJyIGlzIHNldCB0byBvcGVuIGZpbGUgZGVzY3JpcHRvcgpAQCAtNTM1LDggKzUzNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZGVyci53cml0ZSgib3JhbmdlIiknXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwocC5zdGRvdXQucmVhZCgpLCBiImFwcGxlb3JhbmdlIikKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChwLnN0ZG91dC5yZWFkKCksIGIiYXBwbGVvcmFuZ2UiKQogCiAgICAgZGVmIHRlc3Rfc3Rkb3V0X3N0ZGVycl9maWxlKHNlbGYpOgogICAgICAgICAjIGNhcHR1cmUgc3Rkb3V0IGFuZCBzdGRlcnIgdG8gdGhlIHNhbWUgb3BlbiBmaWxlCkBAIC03OTQsMTggKzc5MywxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz0xKQotICAgICAgICBwLnN0ZGluLndyaXRlKCJsaW5lMVxuIikKLSAgICAgICAgcC5zdGRpbi5mbHVzaCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZGxpbmUoKSwgImxpbmUxXG4iKQotICAgICAgICBwLnN0ZGluLndyaXRlKCJsaW5lM1xuIikKLSAgICAgICAgcC5zdGRpbi5jbG9zZSgpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkbGluZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lMlxuIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKDYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lM1xuIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgImxpbmU0XG5saW5lNVxubGluZTZcbmxpbmU3XG5saW5lOCIpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHAuc3RkaW4ud3JpdGUoImxpbmUxXG4iKQorICAgICAgICAgICAgcC5zdGRpbi5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWRsaW5lKCksICJsaW5lMVxuIikKKyAgICAgICAgICAgIHAuc3RkaW4ud3JpdGUoImxpbmUzXG4iKQorICAgICAgICAgICAgcC5zdGRpbi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWRsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lMlxuIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCg2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUzXG4iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lNFxubGluZTVcbmxpbmU2XG5saW5lN1xubGluZTgiKQogCiAgICAgZGVmIHRlc3RfdW5pdmVyc2FsX25ld2xpbmVzX2NvbW11bmljYXRlKHNlbGYpOgogICAgICAgICAjIHVuaXZlcnNhbCBuZXdsaW5lcyB0aHJvdWdoIGNvbW11bmljYXRlKCkKQEAgLTg5NCwzMSArODk0LDQyIEBACiAgICAgICAgICMKICAgICAgICAgIyBVVEYtMTYgYW5kIFVURi0zMi1CRSBhcmUgc3VmZmljaWVudCB0byBjaGVjayBib3RoIHdpdGggQk9NIGFuZAogICAgICAgICAjIHdpdGhvdXQsIGFuZCBVVEYtMTYgYW5kIFVURi0zMi4KLSAgICAgICAgaW1wb3J0IF9ib290bG9jYWxlCiAgICAgICAgIGZvciBlbmNvZGluZyBpbiBbJ3V0Zi0xNicsICd1dGYtMzItYmUnXToKLSAgICAgICAgICAgIG9sZF9nZXRwcmVmZXJyZWRlbmNvZGluZyA9IF9ib290bG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nCi0gICAgICAgICAgICAjIEluZGlyZWN0bHkgdmlhIGlvLlRleHRJT1dyYXBwZXIsIFBvcGVuKCkgZGVmYXVsdHMgdG8KLSAgICAgICAgICAgICMgbG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKEZhbHNlKSBhbmQgZWFybGllciBpbiBQeXRob24gMy4yIHRvCi0gICAgICAgICAgICAjIGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZygpLgotICAgICAgICAgICAgZGVmIGdldHByZWZlcnJlZGVuY29kaW5nKGRvX3NldGxvY2FsZT1UcnVlKToKLSAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RpbmcKICAgICAgICAgICAgIGNvZGUgPSAoImltcG9ydCBzeXM7ICIKICAgICAgICAgICAgICAgICAgICAgciJzeXMuc3Rkb3V0LmJ1ZmZlci53cml0ZSgnMVxyXG4yXHIzXG40Jy5lbmNvZGUoJyVzJykpIiAlCiAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKQogICAgICAgICAgICAgYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgY29kZV0KLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBfYm9vdGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZyA9IGdldHByZWZlcnJlZGVuY29kaW5nCi0gICAgICAgICAgICAgICAgIyBXZSBzZXQgc3RkaW4gdG8gYmUgbm9uLU5vbmUgYmVjYXVzZSwgYXMgb2YgdGhpcyB3cml0aW5nLAotICAgICAgICAgICAgICAgICMgYSBkaWZmZXJlbnQgY29kZSBwYXRoIGlzIHVzZWQgd2hlbiB0aGUgbnVtYmVyIG9mIHBpcGVzIGlzCi0gICAgICAgICAgICAgICAgIyB6ZXJvIG9yIG9uZS4KLSAgICAgICAgICAgICAgICBwb3BlbiA9IHN1YnByb2Nlc3MuUG9wZW4oYXJncywgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICAgICAgICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHBvcGVuLmNvbW11bmljYXRlKGlucHV0PScnKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBfYm9vdGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZyA9IG9sZF9nZXRwcmVmZXJyZWRlbmNvZGluZworICAgICAgICAgICAgIyBXZSBzZXQgc3RkaW4gdG8gYmUgbm9uLU5vbmUgYmVjYXVzZSwgYXMgb2YgdGhpcyB3cml0aW5nLAorICAgICAgICAgICAgIyBhIGRpZmZlcmVudCBjb2RlIHBhdGggaXMgdXNlZCB3aGVuIHRoZSBudW1iZXIgb2YgcGlwZXMgaXMKKyAgICAgICAgICAgICMgemVybyBvciBvbmUuCisgICAgICAgICAgICBwb3BlbiA9IHN1YnByb2Nlc3MuUG9wZW4oYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz1lbmNvZGluZykKKyAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcG9wZW4uY29tbXVuaWNhdGUoaW5wdXQ9JycpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwgJzFcbjJcbjNcbjQnKQogCisgICAgZGVmIHRlc3RfY29tbXVuaWNhdGVfZXJyb3JzKHNlbGYpOgorICAgICAgICBmb3IgZXJyb3JzLCBleHBlY3RlZCBpbiBbCisgICAgICAgICAgICAoJ2lnbm9yZScsICcnKSwKKyAgICAgICAgICAgICgncmVwbGFjZScsICdcdWZmZmRcdWZmZmQnKSwKKyAgICAgICAgICAgICgnc3Vycm9nYXRlZXNjYXBlJywgJ1x1ZGM4MFx1ZGM4MCcpLAorICAgICAgICAgICAgKCdiYWNrc2xhc2hyZXBsYWNlJywgJ1xceDgwXFx4ODAnKSwKKyAgICAgICAgXToKKyAgICAgICAgICAgIGNvZGUgPSAoImltcG9ydCBzeXM7ICIKKyAgICAgICAgICAgICAgICAgICAgciJzeXMuc3Rkb3V0LmJ1ZmZlci53cml0ZShiJ1tceDgwXHg4MF0nKSIpCisgICAgICAgICAgICBhcmdzID0gW3N5cy5leGVjdXRhYmxlLCAnLWMnLCBjb2RlXQorICAgICAgICAgICAgIyBXZSBzZXQgc3RkaW4gdG8gYmUgbm9uLU5vbmUgYmVjYXVzZSwgYXMgb2YgdGhpcyB3cml0aW5nLAorICAgICAgICAgICAgIyBhIGRpZmZlcmVudCBjb2RlIHBhdGggaXMgdXNlZCB3aGVuIHRoZSBudW1iZXIgb2YgcGlwZXMgaXMKKyAgICAgICAgICAgICMgemVybyBvciBvbmUuCisgICAgICAgICAgICBwb3BlbiA9IHN1YnByb2Nlc3MuUG9wZW4oYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz0ndXRmLTgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycz1lcnJvcnMpCisgICAgICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHBvcGVuLmNvbW11bmljYXRlKGlucHV0PScnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsICdbe31dJy5mb3JtYXQoZXhwZWN0ZWQpKQorCiAgICAgZGVmIHRlc3Rfbm9fbGVha2luZyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgd2UgbGVhayBubyByZXNvdXJjZXMKICAgICAgICAgaWYgbm90IG1zd2luZG93czoKQEAgLTE0MzEsNiArMTQ0MiwyNyBAQAogICAgICAgICAgICAgcC53YWl0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtcC5yZXR1cm5jb2RlLCBzaWduYWwuU0lHQUJSVCkKIAorICAgIGRlZiB0ZXN0X0NhbGxlZFByb2Nlc3NFcnJvcl9zdHJfc2lnbmFsKHNlbGYpOgorICAgICAgICBlcnIgPSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcigtaW50KHNpZ25hbC5TSUdBQlJUKSwgImZha2UgY21kIikKKyAgICAgICAgZXJyb3Jfc3RyaW5nID0gc3RyKGVycikKKyAgICAgICAgIyBXZSdyZSByZWx5aW5nIG9uIHRoZSByZXByKCkgb2YgdGhlIHNpZ25hbC5TaWduYWxzIGludGVudW0gdG8gcHJvdmlkZQorICAgICAgICAjIHRoZSB3b3JkIHNpZ25hbCwgdGhlIHNpZ25hbCBuYW1lIGFuZCB0aGUgbnVtZXJpYyB2YWx1ZS4KKyAgICAgICAgc2VsZi5hc3NlcnRJbigic2lnbmFsIiwgZXJyb3Jfc3RyaW5nLmxvd2VyKCkpCisgICAgICAgICMgV2UncmUgbm90IGJlaW5nIHNwZWNpZmljIGFib3V0IHRoZSBzaWduYWwgbmFtZSBhcyBzb21lIHNpZ25hbHMgaGF2ZQorICAgICAgICAjIG11bHRpcGxlIG5hbWVzIGFuZCB3aGljaCBuYW1lIGlzIHJldmVhbGVkIGNhbiB2YXJ5LgorICAgICAgICBzZWxmLmFzc2VydEluKCJTSUciLCBlcnJvcl9zdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oc3RyKHNpZ25hbC5TSUdBQlJUKSwgZXJyb3Jfc3RyaW5nKQorCisgICAgZGVmIHRlc3RfQ2FsbGVkUHJvY2Vzc0Vycm9yX3N0cl91bmtub3duX3NpZ25hbChzZWxmKToKKyAgICAgICAgZXJyID0gc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IoLTk4NzY1NDMsICJmYWtlIGNtZCIpCisgICAgICAgIGVycm9yX3N0cmluZyA9IHN0cihlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oInVua25vd24gc2lnbmFsIDk4NzY1NDMuIiwgZXJyb3Jfc3RyaW5nKQorCisgICAgZGVmIHRlc3RfQ2FsbGVkUHJvY2Vzc0Vycm9yX3N0cl9ub25femVybyhzZWxmKToKKyAgICAgICAgZXJyID0gc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IoMiwgImZha2UgY21kIikKKyAgICAgICAgZXJyb3Jfc3RyaW5nID0gc3RyKGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigibm9uLXplcm8gZXhpdCBzdGF0dXMgMi4iLCBlcnJvcl9zdHJpbmcpCisKICAgICBkZWYgdGVzdF9wcmVleGVjKHNlbGYpOgogICAgICAgICAjIERJU0NMQUlNRVI6IFNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGlzICpub3QqIGEgZ29vZCB1c2UKICAgICAgICAgIyBvZiBhIHByZWV4ZWNfZm4uICBUaGlzIGlzIG1lcmVseSBhIHRlc3QuCkBAIC0xNDM5LDggKzE0NzEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQud3JpdGUob3MuZ2V0ZW52KCJGUlVJVCIpKSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVleGVjX2ZuPWxhbWJkYTogb3MucHV0ZW52KCJGUlVJVCIsICJhcHBsZSIpKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLCBiImFwcGxlIikKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCksIGIiYXBwbGUiKQogCiAgICAgZGVmIHRlc3RfcHJlZXhlY19leGNlcHRpb24oc2VsZik6CiAgICAgICAgIGRlZiByYWlzZV9pdCgpOgpAQCAtMTU2MSw3ICsxNTkzLDcgQEAKICAgICAgICAgZmQsIGZuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgICMgcmVvcGVuIGluIHRleHQgbW9kZQogICAgICAgICB3aXRoIG9wZW4oZmQsICJ3IiwgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiKSBhcyBmb2JqOgotICAgICAgICAgICAgZm9iai53cml0ZSgiIyEvYmluL3NoXG4iKQorICAgICAgICAgICAgZm9iai53cml0ZSgiIyElc1xuIiAlIHN1cHBvcnQudW5peF9zaGVsbCkKICAgICAgICAgICAgIGZvYmoud3JpdGUoImV4ZWMgJyVzJyAtYyAnaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpJ1xuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlKQogICAgICAgICBvcy5jaG1vZChmbmFtZSwgMG83MDApCkBAIC0xNTg4LDggKzE2MjAsOCBAQAogICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbImVjaG8gJEZSVUlUIl0sIHNoZWxsPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1uZXdlbnYpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCkuc3RyaXAoYiIgXHRcclxuXGYiKSwgYiJhcHBsZSIpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKGIiIFx0XHJcblxmIiksIGIiYXBwbGUiKQogCiAgICAgZGVmIHRlc3Rfc2hlbGxfc3RyaW5nKHNlbGYpOgogICAgICAgICAjIFJ1biBjb21tYW5kIHRocm91Z2ggdGhlIHNoZWxsIChzdHJpbmcpCkBAIC0xNTk4LDE1ICsxNjMwLDE1IEBACiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKCJlY2hvICRGUlVJVCIsIHNoZWxsPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1uZXdlbnYpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCkuc3RyaXAoYiIgXHRcclxuXGYiKSwgYiJhcHBsZSIpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKGIiIFx0XHJcblxmIiksIGIiYXBwbGUiKQogCiAgICAgZGVmIHRlc3RfY2FsbF9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgY2FsbCgpIGZ1bmN0aW9uIHdpdGggc3RyaW5nIGFyZ3VtZW50IG9uIFVOSVgKICAgICAgICAgZmQsIGZuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgICMgcmVvcGVuIGluIHRleHQgbW9kZQogICAgICAgICB3aXRoIG9wZW4oZmQsICJ3IiwgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiKSBhcyBmb2JqOgotICAgICAgICAgICAgZm9iai53cml0ZSgiIyEvYmluL3NoXG4iKQorICAgICAgICAgICAgZm9iai53cml0ZSgiIyElc1xuIiAlIHN1cHBvcnQudW5peF9zaGVsbCkKICAgICAgICAgICAgIGZvYmoud3JpdGUoImV4ZWMgJyVzJyAtYyAnaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpJ1xuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlKQogICAgICAgICBvcy5jaG1vZChmbmFtZSwgMG83MDApCkBAIC0xNjMxLDggKzE2NjMsOCBAQAogICAgICAgICBmb3Igc2ggaW4gc2hlbGxzOgogICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oImVjaG8gJDAiLCBleGVjdXRhYmxlPXNoLCBzaGVsbD1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKCksIGJ5dGVzKHNoLCAnYXNjaWknKSkKKyAgICAgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKS5zdHJpcCgpLCBieXRlcyhzaCwgJ2FzY2lpJykpCiAKICAgICBkZWYgX2tpbGxfcHJvY2VzcyhzZWxmLCBtZXRob2QsICphcmdzKToKICAgICAgICAgIyBEbyBub3QgaW5oZXJpdCBmaWxlIGhhbmRsZXMgZnJvbSB0aGUgcGFyZW50LgpAQCAtMjI5MCw3ICsyMzIyLDkgQEAKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQogICAgICAgICBpZGVudCA9IGlkKHApCiAgICAgICAgIHBpZCA9IHAucGlkCi0gICAgICAgIGRlbCBwCisgICAgICAgIHdpdGggc3VwcG9ydC5jaGVja193YXJuaW5ncygoJycsIFJlc291cmNlV2FybmluZykpOgorICAgICAgICAgICAgcCA9IE5vbmUKKwogICAgICAgICAjIGNoZWNrIHRoYXQgcCBpcyBpbiB0aGUgYWN0aXZlIHByb2Nlc3NlcyBsaXN0CiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaWRlbnQsIFtpZChvKSBmb3IgbyBpbiBzdWJwcm9jZXNzLl9hY3RpdmVdKQogCkBAIC0yMzA5LDcgKzIzNDMsOSBAQAogICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCiAgICAgICAgIGlkZW50ID0gaWQocCkKICAgICAgICAgcGlkID0gcC5waWQKLSAgICAgICAgZGVsIHAKKyAgICAgICAgd2l0aCBzdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnJywgUmVzb3VyY2VXYXJuaW5nKSk6CisgICAgICAgICAgICBwID0gTm9uZQorCiAgICAgICAgIG9zLmtpbGwocGlkLCBzaWduYWwuU0lHS0lMTCkKICAgICAgICAgIyBjaGVjayB0aGF0IHAgaXMgaW4gdGhlIGFjdGl2ZSBwcm9jZXNzZXMgbGlzdAogICAgICAgICBzZWxmLmFzc2VydEluKGlkZW50LCBbaWQobykgZm9yIG8gaW4gc3VicHJvY2Vzcy5fYWN0aXZlXSkKQEAgLTI1MDEsOCArMjUzNyw4IEBACiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsic2V0Il0sIHNoZWxsPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1uZXdlbnYpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRJbihiInBoeXNhbGlzIiwgcC5zdGRvdXQucmVhZCgpKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGIicGh5c2FsaXMiLCBwLnN0ZG91dC5yZWFkKCkpCiAKICAgICBkZWYgdGVzdF9zaGVsbF9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgUnVuIGNvbW1hbmQgdGhyb3VnaCB0aGUgc2hlbGwgKHN0cmluZykKQEAgLTI1MTEsOCArMjU0NywyMCBAQAogICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbigic2V0Iiwgc2hlbGw9MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PW5ld2VudikKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydEluKGIicGh5c2FsaXMiLCBwLnN0ZG91dC5yZWFkKCkpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJwaHlzYWxpcyIsIHAuc3Rkb3V0LnJlYWQoKSkKKworICAgIGRlZiB0ZXN0X3NoZWxsX2VuY29kaW5ncyhzZWxmKToKKyAgICAgICAgIyBSdW4gY29tbWFuZCB0aHJvdWdoIHRoZSBzaGVsbCAoc3RyaW5nKQorICAgICAgICBmb3IgZW5jIGluIFsnYW5zaScsICdvZW0nXToKKyAgICAgICAgICAgIG5ld2VudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgICAgICBuZXdlbnZbIkZSVUlUIl0gPSAicGh5c2FsaXMiCisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbigic2V0Iiwgc2hlbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9bmV3ZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9ZW5jKQorICAgICAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInBoeXNhbGlzIiwgcC5zdGRvdXQucmVhZCgpLCBlbmMpCiAKICAgICBkZWYgdGVzdF9jYWxsX3N0cmluZyhzZWxmKToKICAgICAgICAgIyBjYWxsKCkgZnVuY3Rpb24gd2l0aCBzdHJpbmcgYXJndW1lbnQgb24gV2luZG93cwpAQCAtMjUzMSwxNiArMjU3OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRpbi5jbG9zZSkKLSAgICAgICAgIyBXYWl0IGZvciB0aGUgaW50ZXJwcmV0ZXIgdG8gYmUgY29tcGxldGVseSBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgIyBzZW5kaW5nIGFueSBzaWduYWwuCi0gICAgICAgIHAuc3Rkb3V0LnJlYWQoMSkKLSAgICAgICAgZ2V0YXR0cihwLCBtZXRob2QpKCphcmdzKQotICAgICAgICBfLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChzdGRlcnIsIGInJykKLSAgICAgICAgcmV0dXJuY29kZSA9IHAud2FpdCgpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgICMgV2FpdCBmb3IgdGhlIGludGVycHJldGVyIHRvIGJlIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYmVmb3JlCisgICAgICAgICAgICAjIHNlbmRpbmcgYW55IHNpZ25hbC4KKyAgICAgICAgICAgIHAuc3Rkb3V0LnJlYWQoMSkKKyAgICAgICAgICAgIGdldGF0dHIocCwgbWV0aG9kKSgqYXJncykKKyAgICAgICAgICAgIF8sIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChzdGRlcnIsIGInJykKKyAgICAgICAgICAgIHJldHVybmNvZGUgPSBwLndhaXQoKQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJldHVybmNvZGUsIDApCiAKICAgICBkZWYgX2tpbGxfZGVhZF9wcm9jZXNzKHNlbGYsIG1ldGhvZCwgKmFyZ3MpOgpAQCAtMjU1MywxOSArMjU5OSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRpbi5jbG9zZSkKLSAgICAgICAgIyBXYWl0IGZvciB0aGUgaW50ZXJwcmV0ZXIgdG8gYmUgY29tcGxldGVseSBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgIyBzZW5kaW5nIGFueSBzaWduYWwuCi0gICAgICAgIHAuc3Rkb3V0LnJlYWQoMSkKLSAgICAgICAgIyBUaGUgcHJvY2VzcyBzaG91bGQgZW5kIGFmdGVyIHRoaXMKLSAgICAgICAgdGltZS5zbGVlcCgxKQotICAgICAgICAjIFRoaXMgc2hvdWxkbid0IHJhaXNlIGV2ZW4gdGhvdWdoIHRoZSBjaGlsZCBpcyBub3cgZGVhZAotICAgICAgICBnZXRhdHRyKHAsIG1ldGhvZCkoKmFyZ3MpCi0gICAgICAgIF8sIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQotICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgYicnKQotICAgICAgICByYyA9IHAud2FpdCgpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgICMgV2FpdCBmb3IgdGhlIGludGVycHJldGVyIHRvIGJlIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYmVmb3JlCisgICAgICAgICAgICAjIHNlbmRpbmcgYW55IHNpZ25hbC4KKyAgICAgICAgICAgIHAuc3Rkb3V0LnJlYWQoMSkKKyAgICAgICAgICAgICMgVGhlIHByb2Nlc3Mgc2hvdWxkIGVuZCBhZnRlciB0aGlzCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgICAgICAjIFRoaXMgc2hvdWxkbid0IHJhaXNlIGV2ZW4gdGhvdWdoIHRoZSBjaGlsZCBpcyBub3cgZGVhZAorICAgICAgICAgICAgZ2V0YXR0cihwLCBtZXRob2QpKCphcmdzKQorICAgICAgICAgICAgXywgc3RkZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgYicnKQorICAgICAgICAgICAgcmMgPSBwLndhaXQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCA0MikKIAogICAgIGRlZiB0ZXN0X3NlbmRfc2lnbmFsKHNlbGYpOgpAQCAtMjYwOCw4ICsyNjUyLDcgQEAKIAogICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKICAgICAgICAgIiIiRW5zdXJlIHRoYXQgX19hbGxfXyBpcyBwb3B1bGF0ZWQgcHJvcGVybHkuIiIiCi0gICAgICAgICMgU1RBUlRVUElORk8gYWRkZWQgdG8gX19hbGxfXyBpbiAzLjYKLSAgICAgICAgaW50ZW50aW9uYWxseV9leGNsdWRlZCA9IHsibGlzdDJjbWRsaW5lIiwgIlNUQVJUVVBJTkZPIiwgIkhhbmRsZSJ9CisgICAgICAgIGludGVudGlvbmFsbHlfZXhjbHVkZWQgPSB7Imxpc3QyY21kbGluZSIsICJIYW5kbGUifQogICAgICAgICBleHBvcnRlZCA9IHNldChzdWJwcm9jZXNzLl9fYWxsX18pCiAgICAgICAgIHBvc3NpYmxlX2V4cG9ydHMgPSBzZXQoKQogICAgICAgICBpbXBvcnQgdHlwZXMKQEAgLTI2NTQsMTEgKzI2OTcsMTEgQEAKICAgICBkZWYgd2l0aF9zcGFjZXMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAga3dhcmdzWydzdGRvdXQnXSA9IHN1YnByb2Nlc3MuUElQRQogICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbigqYXJncywgKiprd2FyZ3MpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICBwLnN0ZG91dC5yZWFkICgpLmRlY29kZSgibWJjcyIpLAotICAgICAgICAgICIyIFslciwgJ2FiIGNkJ10iICUgc2VsZi5mbmFtZQotICAgICAgICApCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgIHAuc3Rkb3V0LnJlYWQgKCkuZGVjb2RlKCJtYmNzIiksCisgICAgICAgICAgICAgICIyIFslciwgJ2FiIGNkJ10iICUgc2VsZi5mbmFtZQorICAgICAgICAgICAgKQogCiAgICAgZGVmIHRlc3Rfc2hlbGxfc3RyaW5nX3dpdGhfc3BhY2VzKHNlbGYpOgogICAgICAgICAjIGNhbGwoKSBmdW5jdGlvbiB3aXRoIHN0cmluZyBhcmd1bWVudCB3aXRoIHNwYWNlcyBvbiBXaW5kb3dzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1bmF1LnB5IGIvTGliL3Rlc3QvdGVzdF9zdW5hdS5weQppbmRleCAwZjQxMzRlLi5iYzFmNDZjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N1bmF1LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VuYXUucHkKQEAgLTEsNCArMSwzIEBACi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgYXVkaW90ZXN0cwogZnJvbSBhdWRpb29wIGltcG9ydCBieXRlc3dhcApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CmluZGV4IDJjMDA0MTcuLjI2OWQ5YmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKQEAgLTksMTMgKzksMTEgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiBURVNURk4gPSBzdXBwb3J0LlRFU1RGTgotVEVTVERJUk4gPSBvcy5wYXRoLmJhc2VuYW1lKHRlbXBmaWxlLm1rZHRlbXAoZGlyPScuJykpCiAKIAogY2xhc3MgVGVzdFN1cHBvcnQodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc3VwcG9ydC51bmxpbmsoVEVTVEZOKQotICAgICAgICBzdXBwb3J0LnJtdHJlZShURVNURElSTikKICAgICB0ZWFyRG93biA9IHNldFVwCiAKICAgICBkZWYgdGVzdF9pbXBvcnRfbW9kdWxlKHNlbGYpOgpAQCAtNDgsNiArNDYsMTAgQEAKICAgICAgICAgc3VwcG9ydC51bmxpbmsoVEVTVEZOKQogCiAgICAgZGVmIHRlc3Rfcm10cmVlKHNlbGYpOgorICAgICAgICBURVNURElSTiA9IG9zLnBhdGguYmFzZW5hbWUodGVtcGZpbGUubWtkdGVtcChkaXI9Jy4nKSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm10cmVlLCBURVNURElSTikKKyAgICAgICAgc3VwcG9ydC5ybXRyZWUoVEVTVERJUk4pCisKICAgICAgICAgb3MubWtkaXIoVEVTVERJUk4pCiAgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihURVNURElSTiwgVEVTVERJUk4pKQogICAgICAgICBzdXBwb3J0LnJtdHJlZShURVNURElSTikKQEAgLTIyOCw3ICsyMzAsOCBAQAogCiAgICAgZGVmIHRlc3RfY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYpOgogICAgICAgICBzdXBwb3J0LmNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZGVmIGNsYXNzIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIHN1cHBvcnQuY2hlY2tfc3ludGF4X2Vycm9yLCBzZWxmLCAiMSIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgc3VwcG9ydC5jaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIng9MSIpCiAKICAgICBkZWYgdGVzdF9DbGVhbkltcG9ydChzZWxmKToKICAgICAgICAgaW1wb3J0IGltcG9ydGxpYgpAQCAtMzEyLDYgKzMxNSwyOCBAQAogICAgICAgICAgICAgICAgIHNlbGYuT3RoZXJDbGFzcywgc2VsZi5SZWZDbGFzcywgaWdub3JlPWlnbm9yZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoKSwgbWlzc2luZ19pdGVtcykKIAorICAgIGRlZiB0ZXN0X2NoZWNrX19hbGxfXyhzZWxmKToKKyAgICAgICAgZXh0cmEgPSB7J3RlbXBkaXInfQorICAgICAgICBibGFja2xpc3QgPSB7J3RlbXBsYXRlJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhPWV4dHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisgICAgICAgIGV4dHJhID0geydUZXh0VGVzdFJlc3VsdCcsICdpbnN0YWxsSGFuZGxlcid9CisgICAgICAgIGJsYWNrbGlzdCA9IHsnbG9hZF90ZXN0cycsICJUZXN0UHJvZ3JhbSIsICJCYXNlVGVzdFN1aXRlIn0KKworICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ1bml0dGVzdC5yZXN1bHQiLCAidW5pdHRlc3QuY2FzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5pdHRlc3Quc3VpdGUiLCAidW5pdHRlc3QubG9hZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bml0dGVzdC5tYWluIiwgInVuaXR0ZXN0LnJ1bm5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5pdHRlc3Quc2lnbmFscyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgc3VwcG9ydC5jaGVja19fYWxsX18sIHNlbGYsIHVuaXR0ZXN0KQorCiAgICAgIyBYWFggLWZvbGxvd3MgYSBsaXN0IG9mIHVudGVzdGVkIEFQSQogICAgICMgbWFrZV9sZWdhY3lfcHljCiAgICAgIyBpc19yZXNvdXJjZV9lbmFibGVkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N5bWJvbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3ltYm9sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzA2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3N5bWJvbC5weQpAQCAtMCwwICsxLDU0IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc3VicHJvY2VzcworCisKK1NZTUJPTF9GSUxFICAgICAgICAgICAgICA9IHN1cHBvcnQuZmluZGZpbGUoJ3N5bWJvbC5weScpCitHUkFNTUFSX0ZJTEUgICAgICAgICAgICAgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLi4nLCAnLi4nLCAnSW5jbHVkZScsICdncmFtaW5pdC5oJykKK1RFU1RfUFlfRklMRSAgICAgICAgICAgICA9ICdzeW1ib2xfdGVzdC5weScKKworCitjbGFzcyBUZXN0U3ltYm9sR2VuZXJhdGlvbih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX2NvcHlfZmlsZV93aXRob3V0X2dlbmVyYXRlZF9zeW1ib2xzKHNlbGYsIHNvdXJjZV9maWxlLCBkZXN0X2ZpbGUpOgorICAgICAgICB3aXRoIG9wZW4oc291cmNlX2ZpbGUpIGFzIGZwOgorICAgICAgICAgICAgbGluZXMgPSBmcC5yZWFkbGluZXMoKQorICAgICAgICB3aXRoIG9wZW4oZGVzdF9maWxlLCAndycpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGVsaW5lcyhsaW5lc1s6bGluZXMuaW5kZXgoIiMtLXN0YXJ0IGNvbnN0YW50cy0tXG4iKSArIDFdKQorICAgICAgICAgICAgZnAud3JpdGVsaW5lcyhsaW5lc1tsaW5lcy5pbmRleCgiIy0tZW5kIGNvbnN0YW50cy0tXG4iKTpdKQorCisgICAgZGVmIF9nZW5lcmF0ZV9zeW1ib2xzKHNlbGYsIGdyYW1tYXJfZmlsZSwgdGFyZ2V0X3N5bWJvbF9weV9maWxlKToKKyAgICAgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lNQk9MX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfc3ltYm9sX3B5X2ZpbGVdLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzdGRlcnIgPSBwcm9jLmNvbW11bmljYXRlKClbMV0KKyAgICAgICAgcmV0dXJuIHByb2MucmV0dXJuY29kZSwgc3RkZXJyCisKKyAgICBkZWYgY29tcGFyZV9maWxlcyhzZWxmLCBmaWxlMSwgZmlsZTIpOgorICAgICAgICB3aXRoIG9wZW4oZmlsZTEpIGFzIGZwOgorICAgICAgICAgICAgbGluZXMxID0gZnAucmVhZGxpbmVzKCkKKyAgICAgICAgd2l0aCBvcGVuKGZpbGUyKSBhcyBmcDoKKyAgICAgICAgICAgIGxpbmVzMiA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMxLCBsaW5lczIpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKG5vdCBvcy5wYXRoLmV4aXN0cyhHUkFNTUFSX0ZJTEUpLAorICAgICAgICAgICAgICAgICAgICAgJ3Rlc3Qgb25seSB3b3JrcyBmcm9tIHNvdXJjZSBidWlsZCBkaXJlY3RvcnknKQorICAgIGRlZiB0ZXN0X3JlYWxfZ3JhbW1hcl9hbmRfc3ltYm9sX2ZpbGUoc2VsZik6CisgICAgICAgIG91dHB1dCA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgb3V0cHV0KQorCisgICAgICAgIHNlbGYuX2NvcHlfZmlsZV93aXRob3V0X2dlbmVyYXRlZF9zeW1ib2xzKFNZTUJPTF9GSUxFLCBvdXRwdXQpCisKKyAgICAgICAgZXhpdGNvZGUsIHN0ZGVyciA9IHNlbGYuX2dlbmVyYXRlX3N5bWJvbHMoR1JBTU1BUl9GSUxFLCBvdXRwdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBzdGRlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZXhpdGNvZGUpCisKKyAgICAgICAgc2VsZi5jb21wYXJlX2ZpbGVzKFNZTUJPTF9GSUxFLCBvdXRwdXQpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3ltdGFibGUucHkgYi9MaWIvdGVzdC90ZXN0X3N5bXRhYmxlLnB5CmluZGV4IGM1ZDdmYWMuLjMwNDcxNjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3ltdGFibGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeW10YWJsZS5weQpAQCAtMTMzLDYgKzEzMywxNyBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5NaW5lLmxvb2t1cCgiYV9tZXRob2QiKS5pc19hc3NpZ25lZCgpKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuaW50ZXJuYWwubG9va3VwKCJ4IikuaXNfYXNzaWduZWQoKSkKIAorICAgIGRlZiB0ZXN0X2Fubm90YXRlZChzZWxmKToKKyAgICAgICAgc3QxID0gc3ltdGFibGUuc3ltdGFibGUoJ2RlZiBmKCk6XG4gICAgeDogaW50XG4nLCAndGVzdCcsICdleGVjJykKKyAgICAgICAgc3QyID0gc3QxLmdldF9jaGlsZHJlbigpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdDIubG9va3VwKCd4JykuaXNfbG9jYWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0Mi5sb29rdXAoJ3gnKS5pc19hbm5vdGF0ZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdDIubG9va3VwKCd4JykuaXNfZ2xvYmFsKCkpCisgICAgICAgIHN0MyA9IHN5bXRhYmxlLnN5bXRhYmxlKCdkZWYgZigpOlxuICAgIHggPSAxXG4nLCAndGVzdCcsICdleGVjJykKKyAgICAgICAgc3Q0ID0gc3QzLmdldF9jaGlsZHJlbigpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdDQubG9va3VwKCd4JykuaXNfbG9jYWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdDQubG9va3VwKCd4JykuaXNfYW5ub3RhdGVkKCkpCisKICAgICBkZWYgdGVzdF9pbXBvcnRlZChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudG9wLmxvb2t1cCgic3lzIikuaXNfaW1wb3J0ZWQoKSkKIApAQCAtMTU4LDkgKzE2OSwxMSBAQAogICAgICAgICBjaGVja2ZpbGVuYW1lKCJkZWYgZih4KTogZm9vKSgiKSAgIyBwYXJzZS10aW1lCiAgICAgICAgIGNoZWNrZmlsZW5hbWUoImRlZiBmKHgpOiBnbG9iYWwgeCIpICAjIHN5bXRhYmxlLWJ1aWxkLXRpbWUKICAgICAgICAgc3ltdGFibGUuc3ltdGFibGUoInBhc3MiLCBiInNwYW0iLCAiZXhlYyIpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyksIFwKKyAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICAgc3ltdGFibGUuc3ltdGFibGUoInBhc3MiLCBieXRlYXJyYXkoYiJzcGFtIiksICJleGVjIikKLSAgICAgICAgc3ltdGFibGUuc3ltdGFibGUoInBhc3MiLCBtZW1vcnl2aWV3KGIic3BhbSIpLCAiZXhlYyIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc3ltdGFibGUuc3ltdGFibGUoInBhc3MiLCBtZW1vcnl2aWV3KGIic3BhbSIpLCAiZXhlYyIpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKICAgICAgICAgICAgIHN5bXRhYmxlLnN5bXRhYmxlKCJwYXNzIiwgbGlzdChiInNwYW0iKSwgImV4ZWMiKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N5bnRheC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CmluZGV4IDgzZjQ5ZjYuLjgwZTM2ZmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CkBAIC0zNSwxNCArMzUsNiBAQAogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBrZXl3b3JkCiAKLUl0J3MgYSBzeW50YXggZXJyb3IgdG8gYXNzaWduIHRvIHRoZSBlbXB0eSB0dXBsZS4gIFdoeSBpc24ndCBpdCBhbgotZXJyb3IgdG8gYXNzaWduIHRvIHRoZSBlbXB0eSBsaXN0PyAgSXQgd2lsbCBhbHdheXMgcmFpc2Ugc29tZSBlcnJvciBhdAotcnVudGltZS4KLQotPj4+ICgpID0gMQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byAoKQotCiA+Pj4gZigpID0gMQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBmdW5jdGlvbiBjYWxsCkBAIC0zNzQsNyArMzY2LDIzIEBACiAgICAgIC4uLgogICAgU3ludGF4RXJyb3I6IHRvbyBtYW55IHN0YXRpY2FsbHkgbmVzdGVkIGJsb2NrcwogCi1NaXN1c2Ugb2YgdGhlIG5vbmxvY2FsIHN0YXRlbWVudCBjYW4gbGVhZCB0byBhIGZldyB1bmlxdWUgc3ludGF4IGVycm9ycy4KK01pc3VzZSBvZiB0aGUgbm9ubG9jYWwgYW5kIGdsb2JhbCBzdGF0ZW1lbnQgY2FuIGxlYWQgdG8gYSBmZXcgdW5pcXVlIHN5bnRheCBlcnJvcnMuCisKKyAgID4+PiBkZWYgZigpOgorICAgLi4uICAgICB4ID0gMQorICAgLi4uICAgICBnbG9iYWwgeAorICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgIFN5bnRheEVycm9yOiBuYW1lICd4JyBpcyBhc3NpZ25lZCB0byBiZWZvcmUgZ2xvYmFsIGRlY2xhcmF0aW9uCisKKyAgID4+PiBkZWYgZigpOgorICAgLi4uICAgICB4ID0gMQorICAgLi4uICAgICBkZWYgZygpOgorICAgLi4uICAgICAgICAgcHJpbnQoeCkKKyAgIC4uLiAgICAgICAgIG5vbmxvY2FsIHgKKyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgLi4uCisgICBTeW50YXhFcnJvcjogbmFtZSAneCcgaXMgdXNlZCBwcmlvciB0byBub25sb2NhbCBkZWNsYXJhdGlvbgogCiAgICA+Pj4gZGVmIGYoeCk6CiAgICAuLi4gICAgIG5vbmxvY2FsIHgKQEAgLTQ5MywxMCArNTAxLDYgQEAKICAgIC4uLgogU3ludGF4RXJyb3I6IGtleXdvcmQgYXJndW1lbnQgcmVwZWF0ZWQKIAotPj4+IGRlbCAoKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IGNhbid0IGRlbGV0ZSAoKQotCiA+Pj4gezEsIDIsIDN9ID0gNDIKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKIFN5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gbGl0ZXJhbApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeXMucHkgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQppbmRleCA0NDM1ZDY5Li4zN2VlMGIwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N5cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQpAQCAtMTAsNiArMTAsNyBAQAogaW1wb3J0IGdjCiBpbXBvcnQgc3lzY29uZmlnCiBpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBsb2NhbGUKIAogIyBjb3VudCB0aGUgbnVtYmVyIG9mIHRlc3QgcnVucywgdXNlZCB0byBjcmVhdGUgdW5pcXVlCiAjIHN0cmluZ3MgdG8gaW50ZXJuIGluIHRlc3RfaW50ZXJuKCkKQEAgLTYyNyw2ICs2MjgsOCBAQAogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGVzdC5zdXBwb3J0LkZTX05PTkFTQ0lJLAogICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcyBPUyBzdXBwb3J0IG9mIG5vbi1BU0NJSSBlbmNvZGluZ3MnKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSA9PSBsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcyBGUyBlbmNvZGluZyB0byBtYXRjaCBsb2NhbGUnKQogICAgIGRlZiB0ZXN0X2lvZW5jb2Rpbmdfbm9uYXNjaWkoc2VsZik6CiAgICAgICAgIGVudiA9IGRpY3Qob3MuZW52aXJvbikKIApAQCAtNjY5LDggKzY3Miw2IEBACiAgICAgICAgIGZzX2VuY29kaW5nID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgIGV4cGVjdGVkID0gJ3V0Zi04JwotICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgotICAgICAgICAgICAgZXhwZWN0ZWQgPSAnbWJjcycKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGV4cGVjdGVkID0gTm9uZQogICAgICAgICBzZWxmLmNoZWNrX2ZzZW5jb2RpbmcoZnNfZW5jb2RpbmcsIGV4cGVjdGVkKQpAQCAtOTEyLDEzICs5MTMsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBpbm5lcgogICAgICAgICBjaGVjayhnZXRfY2VsbCgpLl9fY2xvc3VyZV9fWzBdLCBzaXplKCdQJykpCiAgICAgICAgICMgY29kZQotICAgICAgICBjaGVjayhnZXRfY2VsbCgpLl9fY29kZV9fLCBzaXplKCc1aTlQaTNQJykpCi0gICAgICAgIGNoZWNrKGdldF9jZWxsLl9fY29kZV9fLCBzaXplKCc1aTlQaTNQJykpCisgICAgICAgIGNoZWNrKGdldF9jZWxsKCkuX19jb2RlX18sIHNpemUoJzZpMTNQJykpCisgICAgICAgIGNoZWNrKGdldF9jZWxsLl9fY29kZV9fLCBzaXplKCc2aTEzUCcpKQogICAgICAgICBkZWYgZ2V0X2NlbGwyKHgpOgogICAgICAgICAgICAgZGVmIGlubmVyKCk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHgKICAgICAgICAgICAgIHJldHVybiBpbm5lcgotICAgICAgICBjaGVjayhnZXRfY2VsbDIuX19jb2RlX18sIHNpemUoJzVpOVBpM1AnKSArIDEpCisgICAgICAgIGNoZWNrKGdldF9jZWxsMi5fX2NvZGVfXywgc2l6ZSgnNmkxM1AnKSArIDEpCiAgICAgICAgICMgY29tcGxleAogICAgICAgICBjaGVjayhjb21wbGV4KDAsMSksIHNpemUoJzJkJykpCiAgICAgICAgICMgbWV0aG9kX2Rlc2NyaXB0b3IgKGRlc2NyaXB0b3Igb2JqZWN0KQpAQCAtOTM2LDkgKzkzNyw5IEBACiAgICAgICAgICMgbWV0aG9kLXdyYXBwZXIgKGRlc2NyaXB0b3Igb2JqZWN0KQogICAgICAgICBjaGVjayh7fS5fX2l0ZXJfXywgc2l6ZSgnMlAnKSkKICAgICAgICAgIyBkaWN0Ci0gICAgICAgIGNoZWNrKHt9LCBzaXplKCduMlAnKSArIGNhbGNzaXplKCcyblBuJykgKyA4KmNhbGNzaXplKCduMlAnKSkKKyAgICAgICAgY2hlY2soe30sIHNpemUoJ24yUCcpICsgOCArIGNhbGNzaXplKCcyblAybicpICsgOCArICg4KjIvLzMpKmNhbGNzaXplKCduMlAnKSkKICAgICAgICAgbG9uZ2RpY3QgPSB7MToxLCAyOjIsIDM6MywgNDo0LCA1OjUsIDY6NiwgNzo3LCA4Ojh9Ci0gICAgICAgIGNoZWNrKGxvbmdkaWN0LCBzaXplKCduMlAnKSArIGNhbGNzaXplKCcyblBuJykgKyAxNipjYWxjc2l6ZSgnbjJQJykpCisgICAgICAgIGNoZWNrKGxvbmdkaWN0LCBzaXplKCduMlAnKSArIDggKyBjYWxjc2l6ZSgnMm5QMm4nKSArIDE2ICsgKDE2KjIvLzMpKmNhbGNzaXplKCduMlAnKSkKICAgICAgICAgIyBkaWN0aW9uYXJ5LWtleXZpZXcKICAgICAgICAgY2hlY2soe30ua2V5cygpLCBzaXplKCdQJykpCiAgICAgICAgICMgZGljdGlvbmFyeS12YWx1ZXZpZXcKQEAgLTEwOTYsMTMgKzEwOTcsMTMgQEAKICAgICAgICAgICAgICAgICAgICcxMFAnICAgICAgICAgICAgICAgICAjIFB5U2VxdWVuY2VNZXRob2RzCiAgICAgICAgICAgICAgICAgICAnMlAnICAgICAgICAgICAgICAgICAgIyBQeUJ1ZmZlclByb2NzCiAgICAgICAgICAgICAgICAgICAnNFAnKQotICAgICAgICAjIFNlcGFyYXRlIGJsb2NrIGZvciBQeURpY3RLZXlzT2JqZWN0IHdpdGggNCBlbnRyaWVzCi0gICAgICAgIHMgKz0gY2FsY3NpemUoIjJuUG4iKSArIDQqY2FsY3NpemUoIm4yUCIpCisgICAgICAgICMgU2VwYXJhdGUgYmxvY2sgZm9yIFB5RGljdEtleXNPYmplY3Qgd2l0aCA4IGtleXMgYW5kIDUgZW50cmllcworICAgICAgICBzICs9IGNhbGNzaXplKCIyblAybiIpICsgOCArIDUqY2FsY3NpemUoIm4yUCIpCiAgICAgICAgICMgY2xhc3MKICAgICAgICAgY2xhc3MgbmV3c3R5bGVjbGFzcyhvYmplY3QpOiBwYXNzCiAgICAgICAgIGNoZWNrKG5ld3N0eWxlY2xhc3MsIHMpCiAgICAgICAgICMgZGljdCB3aXRoIHNoYXJlZCBrZXlzCi0gICAgICAgIGNoZWNrKG5ld3N0eWxlY2xhc3MoKS5fX2RpY3RfXywgc2l6ZSgnbjJQJyArICcyblBuJykpCisgICAgICAgIGNoZWNrKG5ld3N0eWxlY2xhc3MoKS5fX2RpY3RfXywgc2l6ZSgnbjJQJyArICcyblAybicpICsgOCkKICAgICAgICAgIyB1bmljb2RlCiAgICAgICAgICMgZWFjaCB0dXBsZSBjb250YWlucyBhIHN0cmluZyBhbmQgaXRzIGV4cGVjdGVkIGNoYXJhY3RlciBzaXplCiAgICAgICAgICMgZG9uJ3QgcHV0IGFueSBzdGF0aWMgc3RyaW5ncyBoZXJlLCBhcyB0aGV5IG1heSBjb250YWluCkBAIC0xMTkxLDYgKzExOTIsMzIgQEAKICAgICAgICAgIyBzeXMuZmxhZ3MKICAgICAgICAgY2hlY2soc3lzLmZsYWdzLCB2c2l6ZSgnJykgKyBzZWxmLlAgKiBsZW4oc3lzLmZsYWdzKSkKIAorICAgIGRlZiB0ZXN0X2FzeW5jZ2VuX2hvb2tzKHNlbGYpOgorICAgICAgICBvbGQgPSBzeXMuZ2V0X2FzeW5jZ2VuX2hvb2tzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUob2xkLmZpcnN0aXRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUob2xkLmZpbmFsaXplcikKKworICAgICAgICBmaXJzdGl0ZXIgPSBsYW1iZGEgKmE6IE5vbmUKKyAgICAgICAgc3lzLnNldF9hc3luY2dlbl9ob29rcyhmaXJzdGl0ZXI9Zmlyc3RpdGVyKQorICAgICAgICBob29rcyA9IHN5cy5nZXRfYXN5bmNnZW5faG9va3MoKQorICAgICAgICBzZWxmLmFzc2VydElzKGhvb2tzLmZpcnN0aXRlciwgZmlyc3RpdGVyKQorICAgICAgICBzZWxmLmFzc2VydElzKGhvb2tzWzBdLCBmaXJzdGl0ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoaG9va3MuZmluYWxpemVyLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzKGhvb2tzWzFdLCBOb25lKQorCisgICAgICAgIGZpbmFsaXplciA9IGxhbWJkYSAqYTogTm9uZQorICAgICAgICBzeXMuc2V0X2FzeW5jZ2VuX2hvb2tzKGZpbmFsaXplcj1maW5hbGl6ZXIpCisgICAgICAgIGhvb2tzID0gc3lzLmdldF9hc3luY2dlbl9ob29rcygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoaG9va3MuZmlyc3RpdGVyLCBmaXJzdGl0ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoaG9va3NbMF0sIGZpcnN0aXRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhob29rcy5maW5hbGl6ZXIsIGZpbmFsaXplcikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhob29rc1sxXSwgZmluYWxpemVyKQorCisgICAgICAgIHN5cy5zZXRfYXN5bmNnZW5faG9va3MoKm9sZCkKKyAgICAgICAgY3VyID0gc3lzLmdldF9hc3luY2dlbl9ob29rcygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGN1ci5maXJzdGl0ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGN1ci5maW5hbGl6ZXIpCisKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Quc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3lzTW9kdWxlVGVzdCwgU2l6ZW9mVGVzdCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3lzX3NldHRyYWNlLnB5IGIvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKaW5kZXggNTA5YmMzZS4uMjVjNTgzNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKQEAgLTMzOCw4ICszMzgsOCBAQAogCiAgICAgZGVmIHRlc3RfMTRfb25saW5lcl9pZihzZWxmKToKICAgICAgICAgZGVmIG9ubGluZXJzKCk6Ci0gICAgICAgICAgICBpZiBUcnVlOiBGYWxzZQotICAgICAgICAgICAgZWxzZTogVHJ1ZQorICAgICAgICAgICAgaWYgVHJ1ZTogeD1GYWxzZQorICAgICAgICAgICAgZWxzZTogeD1UcnVlCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBzZWxmLnJ1bl9hbmRfY29tcGFyZSgKICAgICAgICAgICAgIG9ubGluZXJzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CmluZGV4IGFiZmIzNGQuLmQ3Nzg1Y2UgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKQEAgLTIwNzQsNiArMjA3NCwyNCBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgogICAgICAgICAgICAgdGFyZmlsZS5pdG4oMHgxMDAwMDAwMDAwMCwgNiwgdGFyZmlsZS5HTlVfRk9STUFUKQogCisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J3ZlcnNpb24nLCAnZ3JwJywgJ3B3ZCcsICdzeW1saW5rX2V4Y2VwdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAnTlVMJywgJ0JMT0NLU0laRScsICdSRUNPUkRTSVpFJywgJ0dOVV9NQUdJQycsCisgICAgICAgICAgICAgICAgICAgICAnUE9TSVhfTUFHSUMnLCAnTEVOR1RIX05BTUUnLCAnTEVOR1RIX0xJTksnLAorICAgICAgICAgICAgICAgICAgICAgJ0xFTkdUSF9QUkVGSVgnLCAnUkVHVFlQRScsICdBUkVHVFlQRScsICdMTktUWVBFJywKKyAgICAgICAgICAgICAgICAgICAgICdTWU1UWVBFJywgJ0NIUlRZUEUnLCAnQkxLVFlQRScsICdESVJUWVBFJywgJ0ZJRk9UWVBFJywKKyAgICAgICAgICAgICAgICAgICAgICdDT05UVFlQRScsICdHTlVUWVBFX0xPTkdOQU1FJywgJ0dOVVRZUEVfTE9OR0xJTksnLAorICAgICAgICAgICAgICAgICAgICAgJ0dOVVRZUEVfU1BBUlNFJywgJ1hIRFRZUEUnLCAnWEdMVFlQRScsICdTT0xBUklTX1hIRFRZUEUnLAorICAgICAgICAgICAgICAgICAgICAgJ1NVUFBPUlRFRF9UWVBFUycsICdSRUdVTEFSX1RZUEVTJywgJ0dOVV9UWVBFUycsCisgICAgICAgICAgICAgICAgICAgICAnUEFYX0ZJRUxEUycsICdQQVhfTkFNRV9GSUVMRFMnLCAnUEFYX05VTUJFUl9GSUVMRFMnLAorICAgICAgICAgICAgICAgICAgICAgJ3N0bicsICdudHMnLCAnbnRpJywgJ2l0bicsICdjYWxjX2Noa3N1bXMnLCAnY29weWZpbGVvYmonLAorICAgICAgICAgICAgICAgICAgICAgJ2ZpbGVtb2RlJywKKyAgICAgICAgICAgICAgICAgICAgICdFbXB0eUhlYWRlckVycm9yJywgJ1RydW5jYXRlZEhlYWRlckVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgICdFT0ZIZWFkZXJFcnJvcicsICdJbnZhbGlkSGVhZGVyRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAgJ1N1YnNlcXVlbnRIZWFkZXJFcnJvcicsICdFeEZpbGVPYmplY3QnLAorICAgICAgICAgICAgICAgICAgICAgJ21haW4nfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCB0YXJmaWxlLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCiAKIGNsYXNzIENvbW1hbmRMaW5lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5IGIvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkKaW5kZXggOGUyMTlmNC4uNTFkODJlMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkKQEAgLTEsNyArMSw2IEBACiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgc2VsZWN0b3JzCiBpbXBvcnQgdGVsbmV0bGliCi1pbXBvcnQgdGltZQogaW1wb3J0IGNvbnRleHRsaWIKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC00Miw2ICs0MSwxMSBAQAogICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKICAgICAgICAgdGVsbmV0LnNvY2suY2xvc2UoKQogCisgICAgZGVmIHRlc3RDb250ZXh0TWFuYWdlcihzZWxmKToKKyAgICAgICAgd2l0aCB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkgYXMgdG46CisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZSh0bi5nZXRfc29ja2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHRuLmdldF9zb2NrZXQoKSkKKwogICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQogICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RocmVhZGluZy5weSBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CmluZGV4IGI2MzA1MDkuLjg0NWU3ZDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CkBAIC04LDcgKzgsNiBAQAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlCiAKIGltcG9ydCByYW5kb20KLWltcG9ydCByZQogaW1wb3J0IHN5cwogX3RocmVhZCA9IGltcG9ydF9tb2R1bGUoJ190aHJlYWQnKQogdGhyZWFkaW5nID0gaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykKQEAgLTE5LDYgKzE4LDcgQEAKIGltcG9ydCBzdWJwcm9jZXNzCiAKIGZyb20gdGVzdCBpbXBvcnQgbG9ja190ZXN0cworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAogIyBCZXR3ZWVuIGZvcmsoKSBhbmQgZXhlYygpLCBvbmx5IGFzeW5jLXNhZmUgZnVuY3Rpb25zIGFyZSBhbGxvd2VkIChpc3N1ZXMKQEAgLTExMTcsNSArMTExNywxMiBAQAogY2xhc3MgQmFycmllclRlc3RzKGxvY2tfdGVzdHMuQmFycmllclRlc3RzKToKICAgICBiYXJyaWVydHlwZSA9IHN0YXRpY21ldGhvZCh0aHJlYWRpbmcuQmFycmllcikKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGV4dHJhID0geyJUaHJlYWRFcnJvciJ9CisgICAgICAgIGJsYWNrbGlzdCA9IHsnY3VycmVudFRocmVhZCcsICdhY3RpdmVDb3VudCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIHRocmVhZGluZywgKCd0aHJlYWRpbmcnLCAnX3RocmVhZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGltZS5weQppbmRleCA3NmI4OTRlLi5mMjI0MjEyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RpbWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aW1lLnB5CkBAIC0xLDYgKzEsOCBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CitpbXBvcnQgZGVjaW1hbAogaW1wb3J0IGVudW0KIGltcG9ydCBsb2NhbGUKK2ltcG9ydCBtYXRoCiBpbXBvcnQgcGxhdGZvcm0KIGltcG9ydCBzeXMKIGltcG9ydCBzeXNjb25maWcKQEAgLTIxLDE3ICsyMywyNyBAQAogVElNRV9NQVhZRUFSID0gKDEgPDwgOCAqIFNJWkVPRl9JTlQgLSAxKSAtIDEKIFRJTUVfTUlOWUVBUiA9IC1USU1FX01BWFlFQVIgLSAxCiAKK1NFQ19UT19VUyA9IDEwICoqIDYKIFVTX1RPX05TID0gMTAgKiogMwogTVNfVE9fTlMgPSAxMCAqKiA2CiBTRUNfVE9fTlMgPSAxMCAqKiA5CitOU19UT19TRUMgPSAxMCAqKiA5CiAKIGNsYXNzIF9QeVRpbWUoZW51bS5JbnRFbnVtKToKICAgICAjIFJvdW5kIHRvd2FyZHMgbWludXMgaW5maW5pdHkgKC1pbmYpCiAgICAgUk9VTkRfRkxPT1IgPSAwCiAgICAgIyBSb3VuZCB0b3dhcmRzIGluZmluaXR5ICgraW5mKQogICAgIFJPVU5EX0NFSUxJTkcgPSAxCisgICAgIyBSb3VuZCB0byBuZWFyZXN0IHdpdGggdGllcyBnb2luZyB0byBuZWFyZXN0IGV2ZW4gaW50ZWdlcgorICAgIFJPVU5EX0hBTEZfRVZFTiA9IDIKIAotQUxMX1JPVU5ESU5HX01FVEhPRFMgPSAoX1B5VGltZS5ST1VORF9GTE9PUiwgX1B5VGltZS5ST1VORF9DRUlMSU5HKQorIyBSb3VuZGluZyBtb2RlcyBzdXBwb3J0ZWQgYnkgUHlUaW1lCitST1VORElOR19NT0RFUyA9ICgKKyAgICAjIChQeVRpbWUgcm91bmRpbmcgbWV0aG9kLCBkZWNpbWFsIHJvdW5kaW5nIG1ldGhvZCkKKyAgICAoX1B5VGltZS5ST1VORF9GTE9PUiwgZGVjaW1hbC5ST1VORF9GTE9PUiksCisgICAgKF9QeVRpbWUuUk9VTkRfQ0VJTElORywgZGVjaW1hbC5ST1VORF9DRUlMSU5HKSwKKyAgICAoX1B5VGltZS5ST1VORF9IQUxGX0VWRU4sIGRlY2ltYWwuUk9VTkRfSEFMRl9FVkVOKSwKKykKIAogCiBjbGFzcyBUaW1lVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNjA3LDc5ICs2MTksNiBAQAogCiAKIGNsYXNzIFRlc3RQeXRpbWUodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5pbnZhbGlkX3ZhbHVlcyA9ICgKLSAgICAgICAgICAgIC0oMiAqKiAxMDApLCAyICoqIDEwMCwKLSAgICAgICAgICAgIC0oMi4wICoqIDEwMC4wKSwgMi4wICoqIDEwMC4wLAotICAgICAgICApCi0KLSAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKLSAgICBkZWYgdGVzdF90aW1lX3Qoc2VsZik6Ci0gICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBweXRpbWVfb2JqZWN0X3RvX3RpbWVfdAotICAgICAgICBmb3Igb2JqLCB0aW1lX3QsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIFJvdW5kIHRvd2FyZHMgbWludXMgaW5maW5pdHkgKC1pbmYpCi0gICAgICAgICAgICAoMCwgMCwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEsIC0xLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4wLCAtMSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuOSwgLTIsIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDEuMCwgMSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoMS45LCAxLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICMgUm91bmQgdG93YXJkcyBpbmZpbml0eSAoK2luZikKLSAgICAgICAgICAgICgwLCAwLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLCAtMSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS4wLCAtMSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS45LCAtMSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxLjAsIDEsIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMS45LCAyLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweXRpbWVfb2JqZWN0X3RvX3RpbWVfdChvYmosIHJuZCksIHRpbWVfdCkKLQotICAgICAgICBybmQgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIGZvciBpbnZhbGlkIGluIHNlbGYuaW52YWxpZF92YWx1ZXM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0aW1lX29iamVjdF90b190aW1lX3QsIGludmFsaWQsIHJuZCkKLQotICAgIEBzdXBwb3J0LmNweXRob25fb25seQotICAgIGRlZiB0ZXN0X3RpbWVzcGVjKHNlbGYpOgotICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcHl0aW1lX29iamVjdF90b190aW1lc3BlYwotICAgICAgICBmb3Igb2JqLCB0aW1lc3BlYywgcm5kIGluICgKLSAgICAgICAgICAgICMgUm91bmQgdG93YXJkcyBtaW51cyBpbmZpbml0eSAoLWluZikKLSAgICAgICAgICAgICgwLCAoMCwgMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLCAoLTEsIDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4wLCAoLTEsIDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxZS05LCAoMCwgMSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDFlLTEwLCAoMCwgMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xZS05LCAoLTEsIDk5OTk5OTk5OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xZS0xMCwgKC0xLCA5OTk5OTk5OTkpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4yLCAoLTIsIDgwMDAwMDAwMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDAuOTk5OTk5OTk5OSwgKDAsIDk5OTk5OTk5OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDEuMTIzNDU2Nzg5MCwgKDEsIDEyMzQ1Njc4OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDEuMTIzNDU2Nzg5OSwgKDEsIDEyMzQ1Njc4OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTAsICgtMiwgODc2NTQzMjExKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5MSwgKC0yLCA4NzY1NDMyMTApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICMgUm91bmQgdG93YXJkcyBpbmZpbml0eSAoK2luZikKLSAgICAgICAgICAgICgwLCAoMCwgMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEsICgtMSwgMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMCwgKC0xLCAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxZS05LCAoMCwgMSksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMWUtMTAsICgwLCAxKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMWUtOSwgKC0xLCA5OTk5OTk5OTkpLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xZS0xMCwgKDAsIDApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjIsICgtMiwgODAwMDAwMDAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgwLjk5OTk5OTk5OTksICgxLCAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxLjEyMzQ1Njc4OTAsICgxLCAxMjM0NTY3OTApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKDEuMTIzNDU2Nzg5OSwgKDEsIDEyMzQ1Njc5MCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5MCwgKC0yLCA4NzY1NDMyMTEpLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTEsICgtMiwgODc2NTQzMjExKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9iaj1vYmosIHJvdW5kPXJuZCwgdGltZXNwZWM9dGltZXNwZWMpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHl0aW1lX29iamVjdF90b190aW1lc3BlYyhvYmosIHJuZCksIHRpbWVzcGVjKQotCi0gICAgICAgIHJuZCA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgZm9yIGludmFsaWQgaW4gc2VsZi5pbnZhbGlkX3ZhbHVlczoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweXRpbWVfb2JqZWN0X3RvX3RpbWVzcGVjLCBpbnZhbGlkLCBybmQpCi0KICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aW1lLl9TVFJVQ1RfVE1fSVRFTVMgPT0gMTEsICJuZWVkcyB0bV96b25lIHN1cHBvcnQiKQogICAgIGRlZiB0ZXN0X2xvY2FsdGltZV90aW1lem9uZShzZWxmKToKIApAQCAtNzM0LDI2NiArNjczLDI5MSBAQAogICAgICAgICBzZWxmLmFzc2VydElzKGx0LnRtX3pvbmUsIE5vbmUpCiAKIAotQHVuaXR0ZXN0LnNraXBVbmxlc3MoX3Rlc3RjYXBpIGlzIG5vdCBOb25lLAotICAgICAgICAgICAgICAgICAgICAgJ25lZWQgdGhlIF90ZXN0Y2FwaSBtb2R1bGUnKQotY2xhc3MgVGVzdFB5VGltZV90KHVuaXR0ZXN0LlRlc3RDYXNlKToKK0B1bml0dGVzdC5za2lwSWYoX3Rlc3RjYXBpIGlzIE5vbmUsICduZWVkIHRoZSBfdGVzdGNhcGkgbW9kdWxlJykKK2NsYXNzIENQeVRpbWVUZXN0Q2FzZToKKyAgICAiIiIKKyAgICBCYXNlIGNsYXNzIHRvIHRlc3QgdGhlIEMgX1B5VGltZV90IEFQSS4KKyAgICAiIiIKKyAgICBPVkVSRkxPV19TRUNPTkRTID0gTm9uZQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgU0laRU9GX1RJTUVfVAorICAgICAgICBiaXRzID0gU0laRU9GX1RJTUVfVCAqIDggLSAxCisgICAgICAgIHNlbGYudGltZV90X21pbiA9IC0yICoqIGJpdHMKKyAgICAgICAgc2VsZi50aW1lX3RfbWF4ID0gMiAqKiBiaXRzIC0gMQorCisgICAgZGVmIHRpbWVfdF9maWx0ZXIoc2VsZiwgc2Vjb25kcyk6CisgICAgICAgIHJldHVybiAoc2VsZi50aW1lX3RfbWluIDw9IHNlY29uZHMgPD0gc2VsZi50aW1lX3RfbWF4KQorCisgICAgZGVmIF9yb3VuZGluZ192YWx1ZXMoc2VsZiwgdXNlX2Zsb2F0KToKKyAgICAgICAgIkJ1aWxkIHRpbWVzdGFtcHMgdXNlZCB0byB0ZXN0IHJvdW5kaW5nLiIKKworICAgICAgICB1bml0cyA9IFsxLCBVU19UT19OUywgTVNfVE9fTlMsIFNFQ19UT19OU10KKyAgICAgICAgaWYgdXNlX2Zsb2F0OgorICAgICAgICAgICAgIyBwaWNvc2Vjb25kcyBhcmUgb25seSB0ZXN0ZWQgdG8gcHl0aW1lX2NvbnZlcnRlciBhY2NlcHRpbmcgZmxvYXRzCisgICAgICAgICAgICB1bml0cy5hcHBlbmQoMWUtMykKKworICAgICAgICB2YWx1ZXMgPSAoCisgICAgICAgICAgICAjIHNtYWxsIHZhbHVlcworICAgICAgICAgICAgMSwgMiwgNSwgNywgMTIzLCA0NTYsIDEyMzQsCisgICAgICAgICAgICAjIDEwXmsgLSAxCisgICAgICAgICAgICA5LAorICAgICAgICAgICAgOTksCisgICAgICAgICAgICA5OTksCisgICAgICAgICAgICA5OTk5LAorICAgICAgICAgICAgOTk5OTksCisgICAgICAgICAgICA5OTk5OTksCisgICAgICAgICAgICAjIHRlc3QgaGFsZiBldmVuIHJvdW5kaW5nIG5lYXIgMC41LCAxLjUsIDIuNSwgMy41LCA0LjUKKyAgICAgICAgICAgIDQ5OSwgNTAwLCA1MDEsCisgICAgICAgICAgICAxNDk5LCAxNTAwLCAxNTAxLAorICAgICAgICAgICAgMjUwMCwKKyAgICAgICAgICAgIDM1MDAsCisgICAgICAgICAgICA0NTAwLAorICAgICAgICApCisKKyAgICAgICAgbnNfdGltZXN0YW1wcyA9IFswXQorICAgICAgICBmb3IgdW5pdCBpbiB1bml0czoKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgbnMgPSB2YWx1ZSAqIHVuaXQKKyAgICAgICAgICAgICAgICBuc190aW1lc3RhbXBzLmV4dGVuZCgoLW5zLCBucykpCisgICAgICAgIGZvciBwb3cyIGluICgwLCA1LCAxMCwgMTUsIDIyLCAyMywgMjQsIDMwLCAzMyk6CisgICAgICAgICAgICBucyA9ICgyICoqIHBvdzIpICogU0VDX1RPX05TCisgICAgICAgICAgICBuc190aW1lc3RhbXBzLmV4dGVuZCgoCisgICAgICAgICAgICAgICAgLW5zLTEsIC1ucywgLW5zKzEsCisgICAgICAgICAgICAgICAgbnMtMSwgbnMsIG5zKzEKKyAgICAgICAgICAgICkpCisgICAgICAgIGZvciBzZWNvbmRzIGluIChfdGVzdGNhcGkuSU5UX01JTiwgX3Rlc3RjYXBpLklOVF9NQVgpOgorICAgICAgICAgICAgbnNfdGltZXN0YW1wcy5hcHBlbmQoc2Vjb25kcyAqIFNFQ19UT19OUykKKyAgICAgICAgaWYgdXNlX2Zsb2F0OgorICAgICAgICAgICAgIyBudW1iZXJzIHdpdGggYW4gZXhhY3QgcmVwcmVzZW50YXRpb24gaW4gSUVFRSA3NTQgKGJhc2UgMikKKyAgICAgICAgICAgIGZvciBwb3cyIGluICgzLCA3LCAxMCwgMTUpOgorICAgICAgICAgICAgICAgIG5zID0gMi4wICoqICgtcG93MikKKyAgICAgICAgICAgICAgICBuc190aW1lc3RhbXBzLmV4dGVuZCgoLW5zLCBucykpCisKKyAgICAgICAgIyBzZWNvbmRzIGNsb3NlIHRvIF9QeVRpbWVfdCB0eXBlIGxpbWl0CisgICAgICAgIG5zID0gKDIgKiogNjMgLy8gU0VDX1RPX05TKSAqIFNFQ19UT19OUworICAgICAgICBuc190aW1lc3RhbXBzLmV4dGVuZCgoLW5zLCBucykpCisKKyAgICAgICAgcmV0dXJuIG5zX3RpbWVzdGFtcHMKKworICAgIGRlZiBfY2hlY2tfcm91bmRpbmcoc2VsZiwgcHl0aW1lX2NvbnZlcnRlciwgZXhwZWN0ZWRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9mbG9hdCwgdW5pdF90b19zZWMsIHZhbHVlX2ZpbHRlcj1Ob25lKToKKworICAgICAgICBkZWYgY29udmVydF92YWx1ZXMobnNfdGltZXN0YW1wcyk6CisgICAgICAgICAgICBpZiB1c2VfZmxvYXQ6CisgICAgICAgICAgICAgICAgdW5pdF90b19ucyA9IFNFQ19UT19OUyAvIGZsb2F0KHVuaXRfdG9fc2VjKQorICAgICAgICAgICAgICAgIHZhbHVlcyA9IFtucyAvIHVuaXRfdG9fbnMgZm9yIG5zIGluIG5zX3RpbWVzdGFtcHNdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHVuaXRfdG9fbnMgPSBTRUNfVE9fTlMgLy8gdW5pdF90b19zZWMKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbbnMgLy8gdW5pdF90b19ucyBmb3IgbnMgaW4gbnNfdGltZXN0YW1wc10KKworICAgICAgICAgICAgaWYgdmFsdWVfZmlsdGVyOgorICAgICAgICAgICAgICAgIHZhbHVlcyA9IGZpbHRlcih2YWx1ZV9maWx0ZXIsIHZhbHVlcykKKworICAgICAgICAgICAgIyByZW1vdmUgZHVwbGljYXRlcyBhbmQgc29ydAorICAgICAgICAgICAgcmV0dXJuIHNvcnRlZChzZXQodmFsdWVzKSkKKworICAgICAgICAjIHRlc3Qgcm91bmRpbmcKKyAgICAgICAgbnNfdGltZXN0YW1wcyA9IHNlbGYuX3JvdW5kaW5nX3ZhbHVlcyh1c2VfZmxvYXQpCisgICAgICAgIHZhbGlkX3ZhbHVlcyA9IGNvbnZlcnRfdmFsdWVzKG5zX3RpbWVzdGFtcHMpCisgICAgICAgIGZvciB0aW1lX3JuZCwgZGVjaW1hbF9ybmQgaW4gUk9VTkRJTkdfTU9ERVMgOgorICAgICAgICAgICAgY29udGV4dCA9IGRlY2ltYWwuZ2V0Y29udGV4dCgpCisgICAgICAgICAgICBjb250ZXh0LnJvdW5kaW5nID0gZGVjaW1hbF9ybmQKKworICAgICAgICAgICAgZm9yIHZhbHVlIGluIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgICAgICAgICBkZWJ1Z19pbmZvID0geyd2YWx1ZSc6IHZhbHVlLCAncm91bmRpbmcnOiBkZWNpbWFsX3JuZH0KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHB5dGltZV9jb252ZXJ0ZXIodmFsdWUsIHRpbWVfcm5kKQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGV4cGVjdGVkX2Z1bmModmFsdWUpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRXJyb3Igb24gdGltZXN0YW1wIGNvbnZlcnNpb246ICVzIiAlIGRlYnVnX2luZm8pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2luZm8pCisKKyAgICAgICAgIyB0ZXN0IG92ZXJmbG93CisgICAgICAgIG5zID0gc2VsZi5PVkVSRkxPV19TRUNPTkRTICogU0VDX1RPX05TCisgICAgICAgIG5zX3RpbWVzdGFtcHMgPSAoLW5zLCBucykKKyAgICAgICAgb3ZlcmZsb3dfdmFsdWVzID0gY29udmVydF92YWx1ZXMobnNfdGltZXN0YW1wcykKKyAgICAgICAgZm9yIHRpbWVfcm5kLCBfIGluIFJPVU5ESU5HX01PREVTIDoKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiBvdmVyZmxvd192YWx1ZXM6CisgICAgICAgICAgICAgICAgZGVidWdfaW5mbyA9IHsndmFsdWUnOiB2YWx1ZSwgJ3JvdW5kaW5nJzogdGltZV9ybmR9CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBtc2c9ZGVidWdfaW5mbyk6CisgICAgICAgICAgICAgICAgICAgIHB5dGltZV9jb252ZXJ0ZXIodmFsdWUsIHRpbWVfcm5kKQorCisgICAgZGVmIGNoZWNrX2ludF9yb3VuZGluZyhzZWxmLCBweXRpbWVfY29udmVydGVyLCBleHBlY3RlZF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdF90b19zZWM9MSwgdmFsdWVfZmlsdGVyPU5vbmUpOgorICAgICAgICBzZWxmLl9jaGVja19yb3VuZGluZyhweXRpbWVfY29udmVydGVyLCBleHBlY3RlZF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSwgdW5pdF90b19zZWMsIHZhbHVlX2ZpbHRlcikKKworICAgIGRlZiBjaGVja19mbG9hdF9yb3VuZGluZyhzZWxmLCBweXRpbWVfY29udmVydGVyLCBleHBlY3RlZF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0X3RvX3NlYz0xLCB2YWx1ZV9maWx0ZXI9Tm9uZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX3JvdW5kaW5nKHB5dGltZV9jb252ZXJ0ZXIsIGV4cGVjdGVkX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUsIHVuaXRfdG9fc2VjLCB2YWx1ZV9maWx0ZXIpCisKKyAgICBkZWYgZGVjaW1hbF9yb3VuZChzZWxmLCB4KToKKyAgICAgICAgZCA9IGRlY2ltYWwuRGVjaW1hbCh4KQorICAgICAgICBkID0gZC5xdWFudGl6ZSgxKQorICAgICAgICByZXR1cm4gaW50KGQpCisKKworY2xhc3MgVGVzdENQeVRpbWUoQ1B5VGltZVRlc3RDYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdCB0aGUgQyBfUHlUaW1lX3QgQVBJLgorICAgICIiIgorICAgICMgX1B5VGltZV90IGlzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgT1ZFUkZMT1dfU0VDT05EUyA9IG1hdGguY2VpbCgoMioqNjMgKyAxKSAvIFNFQ19UT19OUykKKwogICAgIGRlZiB0ZXN0X0Zyb21TZWNvbmRzKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0Zyb21TZWNvbmRzCi0gICAgICAgIGZvciBzZWNvbmRzIGluICgwLCAzLCAtNDU2LCBfdGVzdGNhcGkuSU5UX01BWCwgX3Rlc3RjYXBpLklOVF9NSU4pOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qoc2Vjb25kcz1zZWNvbmRzKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Gcm9tU2Vjb25kcyhzZWNvbmRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgKiBTRUNfVE9fTlMpCisKKyAgICAgICAgIyBQeVRpbWVfRnJvbVNlY29uZHMoKSBleHBlY3RzIGEgQyBpbnQsIHJlamVjdCB2YWx1ZXMgb3V0IG9mIHJhbmdlCisgICAgICAgIGRlZiBjX2ludF9maWx0ZXIoc2Vjcyk6CisgICAgICAgICAgICByZXR1cm4gKF90ZXN0Y2FwaS5JTlRfTUlOIDw9IHNlY3MgPD0gX3Rlc3RjYXBpLklOVF9NQVgpCisKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcobGFtYmRhIHNlY3MsIHJuZDogUHlUaW1lX0Zyb21TZWNvbmRzKHNlY3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgc2Vjczogc2VjcyAqIFNFQ19UT19OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPWNfaW50X2ZpbHRlcikKIAogICAgIGRlZiB0ZXN0X0Zyb21TZWNvbmRzT2JqZWN0KHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0CiAKLSAgICAgICAgIyBDb252ZXJzaW9uIGdpdmluZyB0aGUgc2FtZSByZXN1bHQgZm9yIGFsbCByb3VuZGluZyBtZXRob2RzCi0gICAgICAgIGZvciBybmQgaW4gQUxMX1JPVU5ESU5HX01FVEhPRFM6Ci0gICAgICAgICAgICBmb3Igb2JqLCB0cyBpbiAoCi0gICAgICAgICAgICAgICAgIyBpbnRlZ2VycwotICAgICAgICAgICAgICAgICgwLCAwKSwKLSAgICAgICAgICAgICAgICAoMSwgU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoLTMsIC0zICogU0VDX1RPX05TKSwKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcoCisgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QsCisgICAgICAgICAgICBsYW1iZGEgc2Vjczogc2VjcyAqIFNFQ19UT19OUykKIAotICAgICAgICAgICAgICAgICMgZmxvYXQ6IHN1YnNlY29uZHMKLSAgICAgICAgICAgICAgICAoMC4wLCAwKSwKLSAgICAgICAgICAgICAgICAoMWUtOSwgMSksCi0gICAgICAgICAgICAgICAgKDFlLTYsIDEwICoqIDMpLAotICAgICAgICAgICAgICAgICgxZS0zLCAxMCAqKiA2KSwKLQotICAgICAgICAgICAgICAgICMgZmxvYXQ6IHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMi4wLCAyICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoMTIzLjAsIDEyMyAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKC03LjAsIC03ICogU0VDX1RPX05TKSwKLQotICAgICAgICAgICAgICAgICMgbmFub3NlY29uZCBhcmUga2VwdCBmb3IgdmFsdWUgPD0gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIqKjIyIC0gMWUtOSwgIDQxOTQzMDM5OTk5OTk5OTkpLAotICAgICAgICAgICAgICAgICgyKioyMiwgICAgICAgICA0MTk0MzA0MDAwMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoMioqMjIgKyAxZS05LCAgNDE5NDMwNDAwMDAwMDAwMSksCi0gICAgICAgICAgICAgICAgKDIqKjIzIC0gMWUtOSwgIDgzODg2MDc5OTk5OTk5OTkpLAotICAgICAgICAgICAgICAgICgyKioyMywgICAgICAgICA4Mzg4NjA4MDAwMDAwMDAwKSwKLQotICAgICAgICAgICAgICAgICMgc3RhcnQgbG9zaW5nIHByZWNpc2lvbiBmb3IgdmFsdWUgPiAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMioqMjMgKyAxZS05LCAgODM4ODYwODAwMDAwMDAwMiksCi0KLSAgICAgICAgICAgICAgICAjIG5hbm9zZWNvbmRzIGFyZSBsb3N0IGZvciB2YWx1ZSA+IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyKioyNCAtIDFlLTksIDE2Nzc3MjE1OTk5OTk5OTk4KSwKLSAgICAgICAgICAgICAgICAoMioqMjQsICAgICAgICAxNjc3NzIxNjAwMDAwMDAwMCksCi0gICAgICAgICAgICAgICAgKDIqKjI0ICsgMWUtOSwgMTY3NzcyMTYwMDAwMDAwMDApLAotICAgICAgICAgICAgICAgICgyKioyNSAtIDFlLTksIDMzNTU0NDMyMDAwMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoMioqMjUgICAgICAgLCAzMzU1NDQzMjAwMDAwMDAwMCksCi0gICAgICAgICAgICAgICAgKDIqKjI1ICsgMWUtOSwgMzM1NTQ0MzIwMDAwMDAwMDApLAotCi0gICAgICAgICAgICAgICAgIyBjbG9zZSB0byAyXjYzIG5hbm9zZWNvbmRzIChfUHlUaW1lX3QgbGltaXQpCi0gICAgICAgICAgICAgICAgKDkyMjMzNzIwMzYsIDkyMjMzNzIwMzYgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICg5MjIzMzcyMDM2LjAsIDkyMjMzNzIwMzYgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICgtOTIyMzM3MjAzNiwgLTkyMjMzNzIwMzYgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICgtOTIyMzM3MjAzNi4wLCAtOTIyMzM3MjAzNiAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9iaj1vYmosIHJvdW5kPXJuZCwgdGltZXN0YW1wPXRzKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfRnJvbVNlY29uZHNPYmplY3Qob2JqLCBybmQpLCB0cykKLQotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qocm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IpOgotICAgICAgICAgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QoOTIyMzM3MjAzNywgcm5kKQotICAgICAgICAgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QoOTIyMzM3MjAzNy4wLCBybmQpCi0gICAgICAgICAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCgtOTIyMzM3MjAzNywgcm5kKQotICAgICAgICAgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QoLTkyMjMzNzIwMzcuMCwgcm5kKQotCi0gICAgICAgICMgQ29udmVyc2lvbiBnaXZpbmcgZGlmZmVyZW50IHJlc3VsdHMgZGVwZW5kaW5nIG9uIHRoZSByb3VuZGluZyBtZXRob2QKLSAgICAgICAgRkxPT1IgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIENFSUxJTkcgPSBfUHlUaW1lLlJPVU5EX0NFSUxJTkcKLSAgICAgICAgZm9yIG9iaiwgdHMsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIGNsb3NlIHRvIHplcm8KLSAgICAgICAgICAgICggMWUtMTAsICAwLCBGTE9PUiksCi0gICAgICAgICAgICAoIDFlLTEwLCAgMSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTFlLTEwLCAtMSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xZS0xMCwgIDAsIENFSUxJTkcpLAotCi0gICAgICAgICAgICAjIHRlc3Qgcm91bmRpbmcgb2YgdGhlIGxhc3QgbmFub3NlY29uZAotICAgICAgICAgICAgKCAxLjEyMzQ1Njc4OTksICAxMTIzNDU2Nzg5LCBGTE9PUiksCi0gICAgICAgICAgICAoIDEuMTIzNDU2Nzg5OSwgIDExMjM0NTY3OTAsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTksIC0xMTIzNDU2NzkwLCBGTE9PUiksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5OSwgLTExMjM0NTY3ODksIENFSUxJTkcpLAotCi0gICAgICAgICAgICAjIGNsb3NlIHRvIDEgc2Vjb25kCi0gICAgICAgICAgICAoIDAuOTk5OTk5OTk5OSwgICA5OTk5OTk5OTksIEZMT09SKSwKLSAgICAgICAgICAgICggMC45OTk5OTk5OTk5LCAgMTAwMDAwMDAwMCwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTAuOTk5OTk5OTk5OSwgLTEwMDAwMDAwMDAsIEZMT09SKSwKLSAgICAgICAgICAgICgtMC45OTk5OTk5OTk5LCAgLTk5OTk5OTk5OSwgQ0VJTElORyksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvYmo9b2JqLCByb3VuZD1ybmQsIHRpbWVzdGFtcD10cyk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfRnJvbVNlY29uZHNPYmplY3Qob2JqLCBybmQpLCB0cykKKyAgICAgICAgc2VsZi5jaGVja19mbG9hdF9yb3VuZGluZygKKyAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCwKKyAgICAgICAgICAgIGxhbWJkYSBuczogc2VsZi5kZWNpbWFsX3JvdW5kKG5zICogU0VDX1RPX05TKSkKIAogICAgIGRlZiB0ZXN0X0FzU2Vjb25kc0RvdWJsZShzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Bc1NlY29uZHNEb3VibGUKIAotICAgICAgICBmb3IgbmFub3NlY29uZHMsIHNlY29uZHMgaW4gKAotICAgICAgICAgICAgIyBuZWFyIDEgbmFub3NlY29uZAotICAgICAgICAgICAgKCAwLCAgMC4wKSwKLSAgICAgICAgICAgICggMSwgIDFlLTkpLAotICAgICAgICAgICAgKC0xLCAtMWUtOSksCisgICAgICAgIGRlZiBmbG9hdF9jb252ZXJ0ZXIobnMpOgorICAgICAgICAgICAgaWYgYWJzKG5zKSAlIFNFQ19UT19OUyA9PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdChucyAvLyBTRUNfVE9fTlMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdChucykgLyBTRUNfVE9fTlMKIAotICAgICAgICAgICAgIyBuZWFyIDEgc2Vjb25kCi0gICAgICAgICAgICAoU0VDX1RPX05TICsgMSwgMS4wICsgMWUtOSksCi0gICAgICAgICAgICAoU0VDX1RPX05TLCAgICAgMS4wKSwKLSAgICAgICAgICAgIChTRUNfVE9fTlMgLSAxLCAxLjAgLSAxZS05KSwKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcobGFtYmRhIG5zLCBybmQ6IFB5VGltZV9Bc1NlY29uZHNEb3VibGUobnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdF9jb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX1RPX1NFQykKIAotICAgICAgICAgICAgIyBhIGZldyBzZWNvbmRzCi0gICAgICAgICAgICAoMTIzICogU0VDX1RPX05TLCAxMjMuMCksCi0gICAgICAgICAgICAoLTU2NyAqIFNFQ19UT19OUywgLTU2Ny4wKSwKKyAgICBkZWYgY3JlYXRlX2RlY2ltYWxfY29udmVydGVyKHNlbGYsIGRlbm9taW5hdG9yKToKKyAgICAgICAgZGVub20gPSBkZWNpbWFsLkRlY2ltYWwoZGVub21pbmF0b3IpCiAKLSAgICAgICAgICAgICMgbmFub3NlY29uZCBhcmUga2VwdCBmb3IgdmFsdWUgPD0gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAoNDE5NDMwMzk5OTk5OTk5OSwgMioqMjIgLSAxZS05KSwKLSAgICAgICAgICAgICg0MTk0MzA0MDAwMDAwMDAwLCAyKioyMiksCi0gICAgICAgICAgICAoNDE5NDMwNDAwMDAwMDAwMSwgMioqMjIgKyAxZS05KSwKKyAgICAgICAgZGVmIGNvbnZlcnRlcih2YWx1ZSk6CisgICAgICAgICAgICBkID0gZGVjaW1hbC5EZWNpbWFsKHZhbHVlKSAvIGRlbm9tCisgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWNpbWFsX3JvdW5kKGQpCiAKLSAgICAgICAgICAgICMgc3RhcnQgbG9zaW5nIHByZWNpc2lvbiBmb3IgdmFsdWUgPiAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICg4Mzg4NjA4MDAwMDAwMDAyLCAyKioyMyArIDFlLTkpLAorICAgICAgICByZXR1cm4gY29udmVydGVyCiAKLSAgICAgICAgICAgICMgbmFub3NlY29uZHMgYXJlIGxvc3QgZm9yIHZhbHVlID4gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAoMTY3NzcyMTU5OTk5OTk5OTgsIDIqKjI0IC0gMWUtOSksCi0gICAgICAgICAgICAoMTY3NzcyMTU5OTk5OTk5OTksIDIqKjI0IC0gMWUtOSksCi0gICAgICAgICAgICAoMTY3NzcyMTYwMDAwMDAwMDAsIDIqKjI0ICAgICAgICksCi0gICAgICAgICAgICAoMTY3NzcyMTYwMDAwMDAwMDEsIDIqKjI0ICAgICAgICksCi0gICAgICAgICAgICAoMTY3NzcyMTYwMDAwMDAwMDIsIDIqKjI0ICsgMmUtOSksCi0KLSAgICAgICAgICAgICgzMzU1NDQzMjAwMDAwMDAwMCwgMioqMjUgICAgICAgKSwKLSAgICAgICAgICAgICgzMzU1NDQzMjAwMDAwMDAwMiwgMioqMjUgICAgICAgKSwKLSAgICAgICAgICAgICgzMzU1NDQzMjAwMDAwMDAwNCwgMioqMjUgKyA0ZS05KSwKLQotICAgICAgICAgICAgIyBjbG9zZSB0byAyXjYzIG5hbm9zZWNvbmRzIChfUHlUaW1lX3QgbGltaXQpCi0gICAgICAgICAgICAoOTIyMzM3MjAzNiAqIFNFQ19UT19OUywgOTIyMzM3MjAzNi4wKSwKLSAgICAgICAgICAgICgtOTIyMzM3MjAzNiAqIFNFQ19UT19OUywgLTkyMjMzNzIwMzYuMCksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1uYW5vc2Vjb25kcywgc2Vjb25kcz1zZWNvbmRzKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc1NlY29uZHNEb3VibGUobmFub3NlY29uZHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcykKLQotICAgIGRlZiB0ZXN0X3RpbWV2YWwoc2VsZik6CisgICAgZGVmIHRlc3RfQXNUaW1ldmFsKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0FzVGltZXZhbAotICAgICAgICBmb3Igcm5kIGluIEFMTF9ST1VORElOR19NRVRIT0RTOgotICAgICAgICAgICAgZm9yIG5zLCB0diBpbiAoCi0gICAgICAgICAgICAgICAgIyBtaWNyb3NlY29uZHMKLSAgICAgICAgICAgICAgICAoMCwgKDAsIDApKSwKLSAgICAgICAgICAgICAgICAoMTAwMCwgKDAsIDEpKSwKLSAgICAgICAgICAgICAgICAoLTEwMDAsICgtMSwgOTk5OTk5KSksCiAKLSAgICAgICAgICAgICAgICAjIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMiAqIFNFQ19UT19OUywgKDIsIDApKSwKLSAgICAgICAgICAgICAgICAoLTMgKiBTRUNfVE9fTlMsICgtMywgMCkpLAotICAgICAgICAgICAgKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgdGltZXZhbD10diwgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNUaW1ldmFsKG5zLCBybmQpLCB0dikKKyAgICAgICAgdXNfY29udmVydGVyID0gc2VsZi5jcmVhdGVfZGVjaW1hbF9jb252ZXJ0ZXIoVVNfVE9fTlMpCiAKLSAgICAgICAgRkxPT1IgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIENFSUxJTkcgPSBfUHlUaW1lLlJPVU5EX0NFSUxJTkcKLSAgICAgICAgZm9yIG5zLCB0diwgcm5kIGluICgKLSAgICAgICAgICAgICMgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxLCAoMCwgMCksIEZMT09SKSwKLSAgICAgICAgICAgICgxLCAoMCwgMSksIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xLCAoLTEsIDk5OTk5OSksIEZMT09SKSwKLSAgICAgICAgICAgICgtMSwgKDAsIDApLCBDRUlMSU5HKSwKKyAgICAgICAgZGVmIHRpbWV2YWxfY29udmVydGVyKG5zKToKKyAgICAgICAgICAgIHVzID0gdXNfY29udmVydGVyKG5zKQorICAgICAgICAgICAgcmV0dXJuIGRpdm1vZCh1cywgU0VDX1RPX1VTKQogCi0gICAgICAgICAgICAjIHNlY29uZHMgKyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEyMzQ1NjcwMDEsICgxLCAyMzQ1NjcpLCBGTE9PUiksCi0gICAgICAgICAgICAoMTIzNDU2NzAwMSwgKDEsIDIzNDU2OCksIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xMjM0NTY3MDAxLCAoLTIsIDc2NTQzMiksIEZMT09SKSwKLSAgICAgICAgICAgICgtMTIzNDU2NzAwMSwgKC0yLCA3NjU0MzMpLCBDRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCB0aW1ldmFsPXR2LCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzVGltZXZhbChucywgcm5kKSwgdHYpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IExPTkdfTUlOLCBMT05HX01BWAorCisgICAgICAgICAgICAjIE9uIFdpbmRvd3MsIHRpbWV2YWwudHZfc2VjIHR5cGUgaXMgYSBDIGxvbmcKKyAgICAgICAgICAgIGRlZiBzZWNvbmRzX2ZpbHRlcihzZWNzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTE9OR19NSU4gPD0gc2VjcyA8PSBMT05HX01BWAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2Vjb25kc19maWx0ZXIgPSBzZWxmLnRpbWVfdF9maWx0ZXIKKworICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhQeVRpbWVfQXNUaW1ldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFsX2NvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfVE9fU0VDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2Vjb25kc19maWx0ZXIpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKF90ZXN0Y2FwaSwgJ1B5VGltZV9Bc1RpbWVzcGVjJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ25lZWQgX3Rlc3RjYXBpLlB5VGltZV9Bc1RpbWVzcGVjJykKLSAgICBkZWYgdGVzdF90aW1lc3BlYyhzZWxmKToKKyAgICBkZWYgdGVzdF9Bc1RpbWVzcGVjKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0FzVGltZXNwZWMKLSAgICAgICAgZm9yIG5zLCB0cyBpbiAoCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMCwgKDAsIDApKSwKLSAgICAgICAgICAgICgxLCAoMCwgMSkpLAotICAgICAgICAgICAgKC0xLCAoLTEsIDk5OTk5OTk5OSkpLAogCi0gICAgICAgICAgICAjIHNlY29uZHMKLSAgICAgICAgICAgICgyICogU0VDX1RPX05TLCAoMiwgMCkpLAotICAgICAgICAgICAgKC0zICogU0VDX1RPX05TLCAoLTMsIDApKSwKKyAgICAgICAgZGVmIHRpbWVzcGVjX2NvbnZlcnRlcihucyk6CisgICAgICAgICAgICByZXR1cm4gZGl2bW9kKG5zLCBTRUNfVE9fTlMpCiAKLSAgICAgICAgICAgICMgc2Vjb25kcyArIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMTIzNDU2Nzg5MCwgKDEsIDIzNDU2Nzg5MCkpLAotICAgICAgICAgICAgKC0xMjM0NTY3ODkwLCAoLTIsIDc2NTQzMjExMCkpLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIHRpbWVzcGVjPXRzKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc1RpbWVzcGVjKG5zKSwgdHMpCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKGxhbWJkYSBucywgcm5kOiBQeVRpbWVfQXNUaW1lc3BlYyhucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzcGVjX2NvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfVE9fU0VDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQogCi0gICAgZGVmIHRlc3RfbWlsbGlzZWNvbmRzKHNlbGYpOgorICAgIGRlZiB0ZXN0X0FzTWlsbGlzZWNvbmRzKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0FzTWlsbGlzZWNvbmRzCi0gICAgICAgIGZvciBybmQgaW4gQUxMX1JPVU5ESU5HX01FVEhPRFM6Ci0gICAgICAgICAgICBmb3IgbnMsIHR2IGluICgKLSAgICAgICAgICAgICAgICAjIG1pbGxpc2Vjb25kcwotICAgICAgICAgICAgICAgICgxICogTVNfVE9fTlMsIDEpLAotICAgICAgICAgICAgICAgICgtMiAqIE1TX1RPX05TLCAtMiksCiAKLSAgICAgICAgICAgICAgICAjIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMiAqIFNFQ19UT19OUywgMjAwMCksCi0gICAgICAgICAgICAgICAgKC0zICogU0VDX1RPX05TLCAtMzAwMCksCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCB0aW1ldmFsPXR2LCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc01pbGxpc2Vjb25kcyhucywgcm5kKSwgdHYpCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKFB5VGltZV9Bc01pbGxpc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfZGVjaW1hbF9jb252ZXJ0ZXIoTVNfVE9fTlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU19UT19TRUMpCiAKLSAgICAgICAgRkxPT1IgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIENFSUxJTkcgPSBfUHlUaW1lLlJPVU5EX0NFSUxJTkcKLSAgICAgICAgZm9yIG5zLCBtcywgcm5kIGluICgKLSAgICAgICAgICAgICMgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxLCAwLCBGTE9PUiksCi0gICAgICAgICAgICAoMSwgMSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEsIC0xLCBGTE9PUiksCi0gICAgICAgICAgICAoLTEsIDAsIENFSUxJTkcpLAotCi0gICAgICAgICAgICAjIHNlY29uZHMgKyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEyMzQgKiBNU19UT19OUyArIDEsIDEyMzQsIEZMT09SKSwKLSAgICAgICAgICAgICgxMjM0ICogTVNfVE9fTlMgKyAxLCAxMjM1LCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMTIzNCAqIE1TX1RPX05TIC0gMSwgLTEyMzUsIEZMT09SKSwKLSAgICAgICAgICAgICgtMTIzNCAqIE1TX1RPX05TIC0gMSwgLTEyMzQsIENFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIG1pbGxpc2Vjb25kcz1tcywgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc01pbGxpc2Vjb25kcyhucywgcm5kKSwgbXMpCi0KLSAgICBkZWYgdGVzdF9taWNyb3NlY29uZHMoc2VsZik6CisgICAgZGVmIHRlc3RfQXNNaWNyb3NlY29uZHMoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfQXNNaWNyb3NlY29uZHMKLSAgICAgICAgZm9yIHJuZCBpbiBBTExfUk9VTkRJTkdfTUVUSE9EUzoKLSAgICAgICAgICAgIGZvciBucywgdHYgaW4gKAotICAgICAgICAgICAgICAgICMgbWljcm9zZWNvbmRzCi0gICAgICAgICAgICAgICAgKDEgKiBVU19UT19OUywgMSksCi0gICAgICAgICAgICAgICAgKC0yICogVVNfVE9fTlMsIC0yKSwKIAotICAgICAgICAgICAgICAgICMgbWlsbGlzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDEgKiBNU19UT19OUywgMTAwMCksCi0gICAgICAgICAgICAgICAgKC0yICogTVNfVE9fTlMsIC0yMDAwKSwKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcoUHlUaW1lX0FzTWljcm9zZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9kZWNpbWFsX2NvbnZlcnRlcihVU19UT19OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX1RPX1NFQykKIAotICAgICAgICAgICAgICAgICMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyICogU0VDX1RPX05TLCAyMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoLTMgKiBTRUNfVE9fTlMsIC0zMDAwMDAwKSwKLSAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIHRpbWV2YWw9dHYsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzTWljcm9zZWNvbmRzKG5zLCBybmQpLCB0dikKIAotICAgICAgICBGTE9PUiA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgQ0VJTElORyA9IF9QeVRpbWUuUk9VTkRfQ0VJTElORwotICAgICAgICBmb3IgbnMsIG1zLCBybmQgaW4gKAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEsIDAsIEZMT09SKSwKLSAgICAgICAgICAgICgxLCAxLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMSwgLTEsIEZMT09SKSwKLSAgICAgICAgICAgICgtMSwgMCwgQ0VJTElORyksCitjbGFzcyBUZXN0T2xkUHlUaW1lKENQeVRpbWVUZXN0Q2FzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIgorICAgIFRlc3QgdGhlIG9sZCBDIF9QeVRpbWVfdCBBUEk6IF9QeVRpbWVfT2JqZWN0VG9YWFgoKSBmdW5jdGlvbnMuCisgICAgIiIiCiAKLSAgICAgICAgICAgICMgc2Vjb25kcyArIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMTIzNCAqIFVTX1RPX05TICsgMSwgMTIzNCwgRkxPT1IpLAotICAgICAgICAgICAgKDEyMzQgKiBVU19UT19OUyArIDEsIDEyMzUsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xMjM0ICogVVNfVE9fTlMgLSAxLCAtMTIzNSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xMjM0ICogVVNfVE9fTlMgLSAxLCAtMTIzNCwgQ0VJTElORyksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgbWlsbGlzZWNvbmRzPW1zLCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzTWljcm9zZWNvbmRzKG5zLCBybmQpLCBtcykKKyAgICAjIHRpbWVfdCBpcyBhIDMyLWJpdCBvciA2NC1iaXQgc2lnbmVkIGludGVnZXIKKyAgICBPVkVSRkxPV19TRUNPTkRTID0gMiAqKiA2NAorCisgICAgZGVmIHRlc3Rfb2JqZWN0X3RvX3RpbWVfdChzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHB5dGltZV9vYmplY3RfdG9fdGltZV90CisKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1lX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBzZWNzOiBzZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQorCisgICAgICAgIHNlbGYuY2hlY2tfZmxvYXRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1lX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWNpbWFsX3JvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCisKKyAgICBkZWYgY3JlYXRlX2NvbnZlcnRlcihzZWxmLCBzZWNfdG9fdW5pdCk6CisgICAgICAgIGRlZiBjb252ZXJ0ZXIoc2Vjcyk6CisgICAgICAgICAgICBmbG9hdHBhcnQsIGludHBhcnQgPSBtYXRoLm1vZGYoc2VjcykKKyAgICAgICAgICAgIGludHBhcnQgPSBpbnQoaW50cGFydCkKKyAgICAgICAgICAgIGZsb2F0cGFydCAqPSBzZWNfdG9fdW5pdAorICAgICAgICAgICAgZmxvYXRwYXJ0ID0gc2VsZi5kZWNpbWFsX3JvdW5kKGZsb2F0cGFydCkKKyAgICAgICAgICAgIGlmIGZsb2F0cGFydCA8IDA6CisgICAgICAgICAgICAgICAgZmxvYXRwYXJ0ICs9IHNlY190b191bml0CisgICAgICAgICAgICAgICAgaW50cGFydCAtPSAxCisgICAgICAgICAgICBlbGlmIGZsb2F0cGFydCA+PSBzZWNfdG9fdW5pdDoKKyAgICAgICAgICAgICAgICBmbG9hdHBhcnQgLT0gc2VjX3RvX3VuaXQKKyAgICAgICAgICAgICAgICBpbnRwYXJ0ICs9IDEKKyAgICAgICAgICAgIHJldHVybiAoaW50cGFydCwgZmxvYXRwYXJ0KQorICAgICAgICByZXR1cm4gY29udmVydGVyCisKKyAgICBkZWYgdGVzdF9vYmplY3RfdG9fdGltZXZhbChzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHB5dGltZV9vYmplY3RfdG9fdGltZXZhbAorCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHNlY3M6IChzZWNzLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKKworICAgICAgICBzZWxmLmNoZWNrX2Zsb2F0X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9jb252ZXJ0ZXIoU0VDX1RPX1VTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQorCisgICAgZGVmIHRlc3Rfb2JqZWN0X3RvX3RpbWVzcGVjKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcHl0aW1lX29iamVjdF90b190aW1lc3BlYworCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZXNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBzZWNzOiAoc2VjcywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCisKKyAgICAgICAgc2VsZi5jaGVja19mbG9hdF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWVzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX2NvbnZlcnRlcihTRUNfVE9fTlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGltZWl0LnB5IGIvTGliL3Rlc3QvdGVzdF90aW1laXQucHkKaW5kZXggMmRiM2MxYi4uMWE5NWUyOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aW1laXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aW1laXQucHkKQEAgLTM1NCw2ICszNTQsMjggQEAKICAgICAgICAgICAgIHMgPSBzZWxmLnJ1bl9tYWluKHN3aXRjaGVzPVsnLW4xJywgJzEvMCddKQogICAgICAgICBzZWxmLmFzc2VydF9leGNfc3RyaW5nKGVycm9yX3N0cmluZ2lvLmdldHZhbHVlKCksICdaZXJvRGl2aXNpb25FcnJvcicpCiAKKyAgICBkZWYgYXV0b3JhbmdlKHNlbGYsIGNhbGxiYWNrPU5vbmUpOgorICAgICAgICB0aW1lciA9IEZha2VUaW1lcihzZWNvbmRzX3Blcl9pbmNyZW1lbnQ9MC4wMDEpCisgICAgICAgIHQgPSB0aW1laXQuVGltZXIoc3RtdD1zZWxmLmZha2Vfc3RtdCwgc2V0dXA9c2VsZi5mYWtlX3NldHVwLCB0aW1lcj10aW1lcikKKyAgICAgICAgcmV0dXJuIHQuYXV0b3JhbmdlKGNhbGxiYWNrKQorCisgICAgZGVmIHRlc3RfYXV0b3JhbmdlKHNlbGYpOgorICAgICAgICBudW1fbG9vcHMsIHRpbWVfdGFrZW4gPSBzZWxmLmF1dG9yYW5nZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtX2xvb3BzLCAxMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWVfdGFrZW4sIDEuMCkKKworICAgIGRlZiB0ZXN0X2F1dG9yYW5nZV93aXRoX2NhbGxiYWNrKHNlbGYpOgorICAgICAgICBkZWYgY2FsbGJhY2soYSwgYik6CisgICAgICAgICAgICBwcmludCgie30gezouM2Z9Ii5mb3JtYXQoYSwgYikpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgczoKKyAgICAgICAgICAgIG51bV9sb29wcywgdGltZV90YWtlbiA9IHNlbGYuYXV0b3JhbmdlKGNhbGxiYWNrKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG51bV9sb29wcywgMTAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lX3Rha2VuLCAxLjApCisgICAgICAgIGV4cGVjdGVkID0gKCcxMCAwLjAxMFxuJworICAgICAgICAgICAgICAgICAgICAnMTAwIDAuMTAwXG4nCisgICAgICAgICAgICAgICAgICAgICcxMDAwIDEuMDAwXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgZXhwZWN0ZWQpCisKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkgYi9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CmluZGV4IDNiMTdjYTYuLjRjNDY5YTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQpAQCAtMyw3ICszLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIFNUUklORywgRU5ETUFSS0VSLCBFTkNPRElORywgdG9rX25hbWUsIGRldGVjdF9lbmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgIG9wZW4gYXMgdG9rZW5pemVfb3BlbiwgVW50b2tlbml6ZXIpCiBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCi1mcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZSwgbW9jaworZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UsIG1vY2ssIG1haW4KIGltcG9ydCBvcwogaW1wb3J0IHRva2VuCiAKQEAgLTI0LDggKzI0LDcgQEAKICAgICAgICAgICAgIGlmIHR5cGUgPT0gRU5ETUFSS0VSOgogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICB0eXBlID0gdG9rX25hbWVbdHlwZV0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAlKHR5cGUpLTEwLjEwcyAlKHRva2VuKS0xMy4xM3IgJShzdGFydClzICUoZW5kKXMiICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxzKCkpCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGYiICAgIHt0eXBlOjEwfSB7dG9rZW4hcjoxM30ge3N0YXJ0fSB7ZW5kfSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgIFsiICAgIEVOQ09ESU5HICAgJ3V0Zi04JyAgICAgICAoMCwgMCkgKDAsIDApIl0gKwogICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnJzdHJpcCgpLnNwbGl0bGluZXMoKSkKQEAgLTEzMiwxOCArMTMxLDE4IEBACiAgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoInggPSAweGZmZmZmZmZmZmZmIiwgIiIiXAogICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCiAgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKLSAgICBOVU1CRVIgICAgICcweGZmZmZmZmZmZmYgKDEsIDQpICgxLCAxNykKKyAgICBOVU1CRVIgICAgICcweGZmZmZmZmZmZmZmJyAoMSwgNCkgKDEsIDE3KQogICAgICIiIikKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgieCA9IDEyMzE0MTI0MjE1MTI1MTYxNjExMCIsICIiIlwKICAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQogICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCi0gICAgTlVNQkVSICAgICAnMTIzMTQxMjQyMTUxICgxLCA0KSAoMSwgMjUpCisgICAgTlVNQkVSICAgICAnMTIzMTQxMjQyMTUxMjUxNjE2MTEwJyAoMSwgNCkgKDEsIDI1KQogICAgICIiIikKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgieCA9IC0xNTkyMTU5MDIxNTAxMjU5MSIsICIiIlwKICAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQogICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCiAgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCA0KSAoMSwgNSkKLSAgICBOVU1CRVIgICAgICcxNTkyMTU5MDIxNTAgKDEsIDUpICgxLCAyMikKKyAgICBOVU1CRVIgICAgICcxNTkyMTU5MDIxNTAxMjU5MScgKDEsIDUpICgxLCAyMikKICAgICAiIiIpCiAKICAgICBkZWYgdGVzdF9mbG9hdChzZWxmKToKQEAgLTMwNyw2ICszMDYsNTAgQEAKICAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDI4KSAoMSwgMjkpCiAgICAgU1RSSU5HICAgICAnUkIiYWJjIicgICAgICgxLCAzMCkgKDEsIDM3KQogICAgICIiIikKKyAgICAgICAgIyBDaGVjayAwLCAxLCBhbmQgMiBjaGFyYWN0ZXIgc3RyaW5nIHByZWZpeGVzLgorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHInImFcCitkZVwKK2ZnIicsICIiIlwKKyAgICBTVFJJTkcgICAgICciYVxcXFxcXG5kZVxcXFxcXG5mZyJcJyAoMSwgMCkgKDMsIDMpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHIndSJhXAorZGUiJywgIiIiXAorICAgIFNUUklORyAgICAgJ3UiYVxcXFxcXG5kZSJcJyAgKDEsIDApICgyLCAzKQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ3JiImFcCitkIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdyYiJhXFxcXFxcbmQiXCcgICgxLCAwKSAoMiwgMikKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUociciIiJhXAorYiIiIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdcIlwiImFcXFxcXFxuYlwiXCIiJyAoMSwgMCkgKDIsIDQpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHIndSIiImFcCitiIiIiJywgIiIiXAorICAgIFNUUklORyAgICAgJ3VcIlwiImFcXFxcXFxuYlwiXCIiJyAoMSwgMCkgKDIsIDQpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHIncmIiIiJhXAorYlwKK2MiIiInLCAiIiJcCisgICAgU1RSSU5HICAgICAncmIiXCIiYVxcXFxcXG5iXFxcXFxcbmMiXCIiJyAoMSwgMCkgKDMsIDQpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCdmImFiYyInLCAiIiJcCisgICAgU1RSSU5HICAgICAnZiJhYmMiJyAgICAgICgxLCAwKSAoMSwgNikKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoJ2ZSImF7Yn1jIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdmUiJhe2J9YyInICAgKDEsIDApICgxLCA5KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgnZiIiImFiYyIiIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdmXCJcIlwiYWJjXCJcIlwiJyAgKDEsIDApICgxLCAxMCkKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUocidmImFiY1wKK2RlZiInLCAiIiJcCisgICAgU1RSSU5HICAgICAnZiJhYmNcXFxcXFxuZGVmIicgKDEsIDApICgyLCA0KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ1JmImFiY1wKK2RlZiInLCAiIiJcCisgICAgU1RSSU5HICAgICAnUmYiYWJjXFxcXFxcbmRlZiInICgxLCAwKSAoMiwgNCkKKyAgICAiIiIpCiAKICAgICBkZWYgdGVzdF9mdW5jdGlvbihzZWxmKToKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgiZGVmIGQyMihhLCBiLCBjPTIsIGQ9MiwgKmspOiBwYXNzIiwgIiIiXApAQCAtNTA1LDcgKzU0OCw3IEBACiAgICAgICAgICMgTWV0aG9kcwogICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCJAc3RhdGljbWV0aG9kXG5kZWYgZm9vKHgseSk6IHBhc3MiLCAiIiJcCiAgICAgT1AgICAgICAgICAnQCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKLSAgICBOQU1FICAgICAgICdzdGF0aWNtZXRob2QgKDEsIDEpICgxLCAxMykKKyAgICBOQU1FICAgICAgICdzdGF0aWNtZXRob2QnICgxLCAxKSAoMSwgMTMpCiAgICAgTkVXTElORSAgICAnXFxuJyAgICAgICAgICAoMSwgMTMpICgxLCAxNCkKICAgICBOQU1FICAgICAgICdkZWYnICAgICAgICAgKDIsIDApICgyLCAzKQogICAgIE5BTUUgICAgICAgJ2ZvbycgICAgICAgICAoMiwgNCkgKDIsIDcpCkBAIC0xNDg2LDEyICsxNTI5LDEzIEBACiAgICAgICAgIHRlbXBkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZm4pIG9yIG9zLmN1cmRpcgogICAgICAgICB0ZXN0ZmlsZXMgPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKHRlbXBkaXIsICJ0ZXN0Ki5weSIpKQogCi0gICAgICAgICMgVG9rZW5pemUgaXMgYnJva2VuIG9uIHRlc3RfcGVwMzEzMS5weSBiZWNhdXNlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlCi0gICAgICAgICMgYnJva2VuIG9uIHRoZSBvYnNjdXJlIHVuaWNvZGUgaWRlbnRpZmllcnMgaW4gaXQuICpzaWdoKgotICAgICAgICAjIFdpdGggcm91bmR0cmlwIGV4dGVuZGVkIHRvIHRlc3QgdGhlIDUtdHVwbGUgbW9kZSBvZiAgdW50b2tlbml6ZSwKLSAgICAgICAgIyA3IG1vcmUgdGVzdGZpbGVzIGZhaWwuICBSZW1vdmUgdGhlbSBhbHNvIHVudGlsIHRoZSBmYWlsdXJlIGlzIGRpYWdub3NlZC4KKyAgICAgICAgIyBUb2tlbml6ZSBpcyBicm9rZW4gb24gdGVzdF91bmljb2RlX2lkZW50aWZpZXJzLnB5IGJlY2F1c2UgcmVndWxhcgorICAgICAgICAjIGV4cHJlc3Npb25zIGFyZSBicm9rZW4gb24gdGhlIG9ic2N1cmUgdW5pY29kZSBpZGVudGlmaWVycyBpbiBpdC4KKyAgICAgICAgIyAqc2lnaCogV2l0aCByb3VuZHRyaXAgZXh0ZW5kZWQgdG8gdGVzdCB0aGUgNS10dXBsZSBtb2RlIG9mCisgICAgICAgICMgdW50b2tlbml6ZSwgNyBtb3JlIHRlc3RmaWxlcyBmYWlsLiAgUmVtb3ZlIHRoZW0gYWxzbyB1bnRpbCB0aGUKKyAgICAgICAgIyBmYWlsdXJlIGlzIGRpYWdub3NlZC4KIAotICAgICAgICB0ZXN0ZmlsZXMucmVtb3ZlKG9zLnBhdGguam9pbih0ZW1wZGlyLCAidGVzdF9wZXAzMTMxLnB5IikpCisgICAgICAgIHRlc3RmaWxlcy5yZW1vdmUob3MucGF0aC5qb2luKHRlbXBkaXIsICJ0ZXN0X3VuaWNvZGVfaWRlbnRpZmllcnMucHkiKSkKICAgICAgICAgZm9yIGYgaW4gKCdidWZmZXInLCAnYnVpbHRpbicsICdmaWxlaW8nLCAnaW5zcGVjdCcsICdvcycsICdwbGF0Zm9ybScsICdzeXMnKToKICAgICAgICAgICAgIHRlc3RmaWxlcy5yZW1vdmUob3MucGF0aC5qb2luKHRlbXBkaXIsICJ0ZXN0XyVzLnB5IikgJSBmKQogCkBAIC0xNTIxLDQgKzE1NjUsNCBAQAogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgdW5pdHRlc3QubWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL19faW5pdF9fLnB5IGIvTGliL3Rlc3QvdGVzdF90b29scy9fX2luaXRfXy5weQppbmRleCAwNGM4NzI2Li40ZDBmY2EzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL19faW5pdF9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvX19pbml0X18ucHkKQEAgLTMsNyArMyw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBpbXBvcnRsaWIKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAotZnJvbSBmbm1hdGNoIGltcG9ydCBmbm1hdGNoCiAKIGJhc2VwYXRoID0gb3MucGF0aC5kaXJuYW1lKCAgICAgICAgICAgICAgICAgIyA8c3JjL2luc3RhbGwgZGlyPgogICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZSggICAgICAgICAgICAgICAgIyBMaWIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9ncHJvZjJodG1sLnB5IGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X2dwcm9mMmh0bWwucHkKaW5kZXggMGMyOTRlYy4uOTQ4OWVkOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X2dwcm9mMmh0bWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X2dwcm9mMmh0bWwucHkKQEAgLTIsMTIgKzIsMTEgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1pbXBvcnQgaW1wb3J0bGliCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKIGltcG9ydCB0ZW1wZmlsZQogCi1mcm9tIHRlc3QudGVzdF90b29scyBpbXBvcnQgc2NyaXB0c2Rpciwgc2tpcF9pZl9taXNzaW5nLCBpbXBvcnRfdG9vbAorZnJvbSB0ZXN0LnRlc3RfdG9vbHMgaW1wb3J0IHNraXBfaWZfbWlzc2luZywgaW1wb3J0X3Rvb2wKIAogc2tpcF9pZl9taXNzaW5nKCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X21kNXN1bS5weSBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9tZDVzdW0ucHkKaW5kZXggMTMwNTI5NS4uZmI1NjViNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X21kNXN1bS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfbWQ1c3VtLnB5CkBAIC0xLDEyICsxLDExIEBACiAiIiJUZXN0cyBmb3IgdGhlIG1kNXN1bSBzY3JpcHQgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeS4iIiIKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlCiAKLWZyb20gdGVzdC50ZXN0X3Rvb2xzIGltcG9ydCBzY3JpcHRzZGlyLCBpbXBvcnRfdG9vbCwgc2tpcF9pZl9taXNzaW5nCitmcm9tIHRlc3QudGVzdF90b29scyBpbXBvcnQgc2NyaXB0c2Rpciwgc2tpcF9pZl9taXNzaW5nCiAKIHNraXBfaWZfbWlzc2luZygpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9wZGVwcy5weSBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9wZGVwcy5weQppbmRleCAwOTFmYTZhLi4yN2NiZmUyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfcGRlcHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3BkZXBzLnB5CkBAIC0xLDEyICsxLDEwIEBACiAiIiJUZXN0cyBmb3IgdGhlIHBkZXBzIHNjcmlwdCBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5LiIiIgogCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHRlbXBmaWxlCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAotZnJvbSB0ZXN0LnRlc3RfdG9vbHMgaW1wb3J0IHNjcmlwdHNkaXIsIHNraXBfaWZfbWlzc2luZywgaW1wb3J0X3Rvb2wKK2Zyb20gdGVzdC50ZXN0X3Rvb2xzIGltcG9ydCBza2lwX2lmX21pc3NpbmcsIGltcG9ydF90b29sCiAKIHNraXBfaWZfbWlzc2luZygpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF91bnBhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKaW5kZXggNzM0YmJjMi4uZWQwMDAxYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKQEAgLTEzNCw2ICsxMzQsMTEgQEAKIGNsYXNzIFVucGFyc2VUZXN0Q2FzZShBU1RUZXN0Q2FzZSk6CiAgICAgIyBUZXN0cyBmb3Igc3BlY2lmaWMgYnVncyBmb3VuZCBpbiBlYXJsaWVyIHZlcnNpb25zIG9mIHVucGFyc2UKIAorICAgIGRlZiB0ZXN0X2ZzdHJpbmdzKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAyNTE4MAorICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcChyIiIiZid7ZiJ7MH0iKjN9JyIiIikKKyAgICAgICAgc2VsZi5jaGVja19yb3VuZHRyaXAociIiImYne2Yie3l9IiozfSciIiIpCisKICAgICBkZWYgdGVzdF9kZWxfc3RhdGVtZW50KHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcCgiZGVsIHgsIHksIHoiKQogCkBAIC0yNzksOCArMjg0LDE4IEBACiAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBuYW1lczoKICAgICAgICAgICAgIGlmIHRlc3Quc3VwcG9ydC52ZXJib3NlOgogICAgICAgICAgICAgICAgIHByaW50KCdUZXN0aW5nICVzJyAlIGZpbGVuYW1lKQotICAgICAgICAgICAgc291cmNlID0gcmVhZF9weWZpbGUoZmlsZW5hbWUpCi0gICAgICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcChzb3VyY2UpCisKKyAgICAgICAgICAgICMgaXQncyB2ZXJ5IG11Y2ggYSBoYWNrIHRoYXQgSSdtIHNraXBwaW5nIHRoZXNlIGZpbGVzLCBidXQKKyAgICAgICAgICAgICMgIEkgY2FuJ3QgZmlndXJlIG91dCB3aHkgdGhleSBmYWlsLiBJJ2xsIGZpeCBpdCB3aGVuIEkKKyAgICAgICAgICAgICMgIGFkZHJlc3MgaXNzdWUgIzI3OTQ4LgorICAgICAgICAgICAgaWYgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkgaW4gKCd0ZXN0X2ZzdHJpbmcucHknLCAndGVzdF90cmFjZWJhY2sucHknKToKKyAgICAgICAgICAgICAgICBpZiB0ZXN0LnN1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoZidTa2lwcGluZyB7ZmlsZW5hbWV9OiBzZWUgaXNzdWUgMjc5MjEnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGZpbGVuYW1lPWZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBzb3VyY2UgPSByZWFkX3B5ZmlsZShmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcChzb3VyY2UpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkgYi9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CmluZGV4IDAzZGZmODQuLjFkODk0YWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFjZS5weQpAQCAtMSwxMSArMSwxMSBAQAogaW1wb3J0IG9zCi1pbXBvcnQgaW8KIGltcG9ydCBzeXMKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBURVNURk4sIHJtdHJlZSwgdW5saW5rLCBjYXB0dXJlZF9zdGRvdXQKK2Zyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZQogaW1wb3J0IHVuaXR0ZXN0CiAKIGltcG9ydCB0cmFjZQotZnJvbSB0cmFjZSBpbXBvcnQgQ292ZXJhZ2VSZXN1bHRzLCBUcmFjZQorZnJvbSB0cmFjZSBpbXBvcnQgVHJhY2UKIAogZnJvbSB0ZXN0LnRyYWNlZG1vZHVsZXMgaW1wb3J0IHRlc3Rtb2QKIApAQCAtMzY1LDUxICszNjUsMjcgQEAKICAgICAgICAgIyBNYXRjaGVkIGJlZm9yZS4KICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlnbm9yZS5uYW1lcyhqbignYmFyJywgJ2Jhei5weScpLCAnYmF6JykpCiAKK2NsYXNzIFRlc3RDb21tYW5kTGluZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLWNsYXNzIFRlc3REZXByZWNhdGVkTWV0aG9kcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZmFpbHVyZXMoc2VsZik6CisgICAgICAgIF9lcnJvcnMgPSAoCisgICAgICAgICAgICAoYidmaWxlbmFtZSBpcyBtaXNzaW5nOiByZXF1aXJlZCB3aXRoIHRoZSBtYWluIG9wdGlvbnMnLCAnLWwnLCAnLVQnKSwKKyAgICAgICAgICAgIChiJ2Nhbm5vdCBzcGVjaWZ5IGJvdGggLS1saXN0ZnVuY3MgYW5kICgtLXRyYWNlIG9yIC0tY291bnQpJywgJy1sYycpLAorICAgICAgICAgICAgKGInYXJndW1lbnQgLVIvLS1uby1yZXBvcnQ6IG5vdCBhbGxvd2VkIHdpdGggYXJndW1lbnQgLXIvLS1yZXBvcnQnLCAnLXJSJyksCisgICAgICAgICAgICAoYidtdXN0IHNwZWNpZnkgb25lIG9mIC0tdHJhY2UsIC0tY291bnQsIC0tcmVwb3J0LCAtLWxpc3RmdW5jcywgb3IgLS10cmFja2NhbGxzJywgJy1nJyksCisgICAgICAgICAgICAoYictci8tLXJlcG9ydCByZXF1aXJlcyAtZi8tLWZpbGUnLCAnLXInKSwKKyAgICAgICAgICAgIChiJy0tc3VtbWFyeSBjYW4gb25seSBiZSB1c2VkIHdpdGggLS1jb3VudCBvciAtLXJlcG9ydCcsICctc1QnKSwKKyAgICAgICAgICAgIChiJ3VucmVjb2duaXplZCBhcmd1bWVudHM6IC15JywgJy15JykpCisgICAgICAgIGZvciBtZXNzYWdlLCAqYXJncyBpbiBfZXJyb3JzOgorICAgICAgICAgICAgKl8sIHN0ZGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLW0nLCAndHJhY2UnLCAqYXJncykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4obWVzc2FnZSwgc3RkZXJyKQogCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF91c2FnZShzZWxmKToKLSAgICAgICAgc2lvID0gaW8uU3RyaW5nSU8oKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHRyYWNlLnVzYWdlKHNpbykKLSAgICAgICAgc2VsZi5hc3NlcnRJbignVXNhZ2U6Jywgc2lvLmdldHZhbHVlKCkpCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX0lnbm9yZShzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICB0cmFjZS5JZ25vcmUoKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9tb2RuYW1lKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInNwYW0iLCB0cmFjZS5tb2RuYW1lKCJzcGFtIikpCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2Z1bGxtb2RuYW1lKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInNwYW0iLCB0cmFjZS5mdWxsbW9kbmFtZSgic3BhbSIpKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9maW5kX2xpbmVzX2Zyb21fY29kZShzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBkZWYgZm9vKCk6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgdHJhY2UuZmluZF9saW5lc19mcm9tX2NvZGUoZm9vLl9fY29kZV9fLCBbImVnZ3MiXSkKLQotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfZmluZF9saW5lcyhzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBkZWYgZm9vKCk6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgdHJhY2UuZmluZF9saW5lcyhmb28uX19jb2RlX18sIFsiZWdncyJdKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9maW5kX3N0cmluZ3Moc2VsZik6CisgICAgZGVmIHRlc3RfbGlzdGZ1bmNzX2ZsYWdfc3VjY2VzcyhzZWxmKToKICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmZDoKICAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh1bmxpbmssIFRFU1RGTikKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICB0cmFjZS5maW5kX3N0cmluZ3MoZmQubmFtZSkKLQotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfZmluZF9leGVjdXRhYmxlX2xpbmVub3Moc2VsZik6Ci0gICAgICAgIHdpdGggb3BlbihURVNURk4sICd3JykgYXMgZmQ6Ci0gICAgICAgICAgICBzZWxmLmFkZENsZWFudXAodW5saW5rLCBURVNURk4pCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgdHJhY2UuZmluZF9leGVjdXRhYmxlX2xpbmVub3MoZmQubmFtZSkKLQorICAgICAgICAgICAgZmQud3JpdGUoImEgPSAxXG4iKQorICAgICAgICAgICAgc3RhdHVzLCBzdGRvdXQsIHN0ZGVyciA9IGFzc2VydF9weXRob25fb2soJy1tJywgJ3RyYWNlJywgJy1sJywgVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ2Z1bmN0aW9ucyBjYWxsZWQ6Jywgc3Rkb3V0KQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQppbmRleCA1NDlkOGQxLi40NDZiOTFlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQpAQCAtMTI5LDEyICsxMjksMTIgQEAKICAgICAgICAgZGVmIGRvX3Rlc3QoZmlyc3RsaW5lcywgbWVzc2FnZSwgY2hhcnNldCwgbGluZW5vKToKICAgICAgICAgICAgICMgUmFpc2UgdGhlIG1lc3NhZ2UgaW4gYSBzdWJwcm9jZXNzLCBhbmQgY2F0Y2ggdGhlIG91dHB1dAogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG91dHB1dCA9IG9wZW4oVEVTVEZOLCAidyIsIGVuY29kaW5nPWNoYXJzZXQpCi0gICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKCIiInswfWlmIDE6Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignezF9JykKLSAgICAgICAgICAgICAgICAgICAgIiIiLmZvcm1hdChmaXJzdGxpbmVzLCBtZXNzYWdlKSkKLSAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3IiwgZW5jb2Rpbmc9Y2hhcnNldCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoIiIiezB9aWYgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2s7CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3sxfScpCisgICAgICAgICAgICAgICAgICAgICAgICAiIiIuZm9ybWF0KGZpcnN0bGluZXMsIG1lc3NhZ2UpKQorCiAgICAgICAgICAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCBURVNURk5dLAogICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCiAgICAgICAgICAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKQEAgLTE3NSw4ICsxNzUsOCBAQAogICAgICAgICAgICAgICAgICAgICB0ZXh0LCBjaGFyc2V0LCA1KQogICAgICAgICAgICAgZG9fdGVzdCgiIFx0XGZcbiMgY29kaW5nOiB7MH1cbiIuZm9ybWF0KGNoYXJzZXQpLAogICAgICAgICAgICAgICAgICAgICB0ZXh0LCBjaGFyc2V0LCA1KQotICAgICAgICAjIElzc3VlICMxODk2MDogY29kaW5nIHNwZWMgc2hvdWxkIGhhcyBubyBlZmZlY3QKLSAgICAgICAgZG9fdGVzdCgiMFxuIyBjb2Rpbmc6IEdCS1xuIiwgImhceGU5IGhvIiwgJ3V0Zi04JywgNSkKKyAgICAgICAgIyBJc3N1ZSAjMTg5NjA6IGNvZGluZyBzcGVjIHNob3VsZCBoYXZlIG5vIGVmZmVjdAorICAgICAgICBkb190ZXN0KCJ4PTBcbiMgY29kaW5nOiBHQktcbiIsICJoXHhlOSBobyIsICd1dGYtOCcsIDUpCiAKICAgICBAc3VwcG9ydC5yZXF1aXJlc190eXBlX2NvbGxlY3RpbmcKICAgICBkZWYgdGVzdF9wcmludF90cmFjZWJhY2tfYXRfZXhpdChzZWxmKToKQEAgLTMwMyw2ICszMDMsMTM4IEBACiAgICAgICAgICAgICAnICAgIHRyYWNlYmFjay5wcmludF9zdGFjaygpJywKICAgICAgICAgXSkKIAorICAgICMgaXNzdWUgMjY4MjMgLSBTaHJpbmsgcmVjdXJzaXZlIHRyYWNlYmFja3MKKyAgICBAdW5pdHRlc3Quc2tpcElmKFRydWUsICJGSVhNRTogdGVzdCBicm9rZW4sIHNlZSBpc3N1ZSAjMjgwNTAiKQorICAgIGRlZiBfY2hlY2tfcmVjdXJzaXZlX3RyYWNlYmFja19kaXNwbGF5KHNlbGYsIHJlbmRlcl9leGMpOgorICAgICAgICAjIEFsd2F5cyBzaG93IGZ1bGwgZGlmZnMgd2hlbiB0aGlzIHRlc3QgZmFpbHMKKyAgICAgICAgIyBOb3RlIHRoYXQgcmVhcnJhbmdpbmcgdGhpbmdzIG1heSByZXF1aXJlIGFkanVzdGluZworICAgICAgICAjIHRoZSByZWxhdGl2ZSBsaW5lIG51bWJlcnMgaW4gdGhlIGV4cGVjdGVkIHRyYWNlYmFja3MKKyAgICAgICAgc2VsZi5tYXhEaWZmID0gTm9uZQorCisgICAgICAgICMgQ2hlY2sgaGl0dGluZyB0aGUgcmVjdXJzaW9uIGxpbWl0CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBmKCkKKworICAgICAgICB3aXRoIGNhcHR1cmVkX291dHB1dCgic3RkZXJyIikgYXMgc3RkZXJyX2Y6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZigpCisgICAgICAgICAgICBleGNlcHQgUmVjdXJzaW9uRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgIHJlbmRlcl9leGMoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIHJlY3Vyc2lvbiBvY2N1cnJlZCIpCisKKyAgICAgICAgbGluZW5vX2YgPSBmLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vCisgICAgICAgIHJlc3VsdF9mID0gKAorICAgICAgICAgICAgJ1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2YrNX0sIGluIF9jaGVja19yZWN1cnNpdmVfdHJhY2ViYWNrX2Rpc3BsYXknJ1xuJworICAgICAgICAgICAgJyAgICBmKClcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2YrMX0sIGluIGYnJ1xuJworICAgICAgICAgICAgJyAgICBmKClcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2YrMX0sIGluIGYnJ1xuJworICAgICAgICAgICAgJyAgICBmKClcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2YrMX0sIGluIGYnJ1xuJworICAgICAgICAgICAgJyAgICBmKClcbicKKyAgICAgICAgICAgICMgWFhYOiBUaGUgZm9sbG93aW5nIGxpbmUgY2hhbmdlcyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdGVzdHMKKyAgICAgICAgICAgICMgYXJlIHJ1biB0aHJvdWdoIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciBvciB3aXRoIC1tCisgICAgICAgICAgICAjIEl0IGFsc28gdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gKHN0YWNrIHNpemUpCisgICAgICAgICAgICAjIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBjYXJlIGFib3V0IGV4YWN0bmVzcyBoZXJlLCBzbyB3ZSB1c2UgcmVnZXgKKyAgICAgICAgICAgIHInICBcW1ByZXZpb3VzIGxpbmUgcmVwZWF0ZWQgKFxkKykgbW9yZSB0aW1lc1xdJyAnXG4nCisgICAgICAgICAgICAnUmVjdXJzaW9uRXJyb3I6IG1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkXG4nCisgICAgICAgICkKKworICAgICAgICBleHBlY3RlZCA9IHJlc3VsdF9mLnNwbGl0bGluZXMoKQorICAgICAgICBhY3R1YWwgPSBzdGRlcnJfZi5nZXR2YWx1ZSgpLnNwbGl0bGluZXMoKQorCisgICAgICAgICMgQ2hlY2sgdGhlIG91dHB1dCB0ZXh0IG1hdGNoZXMgZXhwZWN0YXRpb25zCisgICAgICAgICMgMm5kIGxhc3QgbGluZSBjb250YWlucyB0aGUgcmVwZXRpdGlvbiBjb3VudAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbFs6LTJdLCBleHBlY3RlZFs6LTJdKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KGFjdHVhbFstMl0sIGV4cGVjdGVkWy0yXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWxbLTFdLCBleHBlY3RlZFstMV0pCisKKyAgICAgICAgIyBDaGVjayB0aGUgcmVjdXJzaW9uIGNvdW50IGlzIHJvdWdobHkgYXMgZXhwZWN0ZWQKKyAgICAgICAgcmVjX2xpbWl0ID0gc3lzLmdldHJlY3Vyc2lvbmxpbWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihpbnQocmUuc2VhcmNoKHIiXGQrIiwgYWN0dWFsWy0yXSkuZ3JvdXAoKSksIHJhbmdlKHJlY19saW1pdC01MCwgcmVjX2xpbWl0KSkKKworICAgICAgICAjIENoZWNrIGEga25vd24gKGxpbWl0ZWQpIG51bWJlciBvZiByZWN1cnNpdmUgaW52b2NhdGlvbnMKKyAgICAgICAgZGVmIGcoY291bnQ9MTApOgorICAgICAgICAgICAgaWYgY291bnQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGcoY291bnQtMSkKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKworICAgICAgICB3aXRoIGNhcHR1cmVkX291dHB1dCgic3RkZXJyIikgYXMgc3RkZXJyX2c6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZygpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgcmVuZGVyX2V4YygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gdmFsdWUgZXJyb3Igd2FzIHJhaXNlZCIpCisKKyAgICAgICAgbGluZW5vX2cgPSBnLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vCisgICAgICAgIHJlc3VsdF9nID0gKAorICAgICAgICAgICAgZicgIEZpbGUgIntfX2ZpbGVfX30iLCBsaW5lIHtsaW5lbm9fZysyfSwgaW4gZycnXG4nCisgICAgICAgICAgICAnICAgIHJldHVybiBnKGNvdW50LTEpXG4nCisgICAgICAgICAgICBmJyAgRmlsZSAie19fZmlsZV9ffSIsIGxpbmUge2xpbmVub19nKzJ9LCBpbiBnJydcbicKKyAgICAgICAgICAgICcgICAgcmV0dXJuIGcoY291bnQtMSlcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2crMn0sIGluIGcnJ1xuJworICAgICAgICAgICAgJyAgICByZXR1cm4gZyhjb3VudC0xKVxuJworICAgICAgICAgICAgJyAgW1ByZXZpb3VzIGxpbmUgcmVwZWF0ZWQgNiBtb3JlIHRpbWVzXVxuJworICAgICAgICAgICAgZicgIEZpbGUgIntfX2ZpbGVfX30iLCBsaW5lIHtsaW5lbm9fZyszfSwgaW4gZycnXG4nCisgICAgICAgICAgICAnICAgIHJhaXNlIFZhbHVlRXJyb3JcbicKKyAgICAgICAgICAgICdWYWx1ZUVycm9yXG4nCisgICAgICAgICkKKyAgICAgICAgdGJfbGluZSA9ICgKKyAgICAgICAgICAgICdUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICBmJyAgRmlsZSAie19fZmlsZV9ffSIsIGxpbmUge2xpbmVub19nKzd9LCBpbiBfY2hlY2tfcmVjdXJzaXZlX3RyYWNlYmFja19kaXNwbGF5JydcbicKKyAgICAgICAgICAgICcgICAgZygpXG4nCisgICAgICAgICkKKyAgICAgICAgZXhwZWN0ZWQgPSAodGJfbGluZSArIHJlc3VsdF9nKS5zcGxpdGxpbmVzKCkKKyAgICAgICAgYWN0dWFsID0gc3RkZXJyX2cuZ2V0dmFsdWUoKS5zcGxpdGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorCisgICAgICAgICMgQ2hlY2sgMiBkaWZmZXJlbnQgcmVwZXRpdGl2ZSBzZWN0aW9ucworICAgICAgICBkZWYgaChjb3VudD0xMCk6CisgICAgICAgICAgICBpZiBjb3VudDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaChjb3VudC0xKQorICAgICAgICAgICAgZygpCisKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9vdXRwdXQoInN0ZGVyciIpIGFzIHN0ZGVycl9oOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGgoKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgIHJlbmRlcl9leGMoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIHZhbHVlIGVycm9yIHdhcyByYWlzZWQiKQorCisgICAgICAgIGxpbmVub19oID0gaC5fX2NvZGVfXy5jb19maXJzdGxpbmVubworICAgICAgICByZXN1bHRfaCA9ICgKKyAgICAgICAgICAgICdUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICBmJyAgRmlsZSAie19fZmlsZV9ffSIsIGxpbmUge2xpbmVub19oKzd9LCBpbiBfY2hlY2tfcmVjdXJzaXZlX3RyYWNlYmFja19kaXNwbGF5JydcbicKKyAgICAgICAgICAgICcgICAgaCgpXG4nCisgICAgICAgICAgICBmJyAgRmlsZSAie19fZmlsZV9ffSIsIGxpbmUge2xpbmVub19oKzJ9LCBpbiBoJydcbicKKyAgICAgICAgICAgICcgICAgcmV0dXJuIGgoY291bnQtMSlcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2grMn0sIGluIGgnJ1xuJworICAgICAgICAgICAgJyAgICByZXR1cm4gaChjb3VudC0xKVxuJworICAgICAgICAgICAgZicgIEZpbGUgIntfX2ZpbGVfX30iLCBsaW5lIHtsaW5lbm9faCsyfSwgaW4gaCcnXG4nCisgICAgICAgICAgICAnICAgIHJldHVybiBoKGNvdW50LTEpXG4nCisgICAgICAgICAgICAnICBbUHJldmlvdXMgbGluZSByZXBlYXRlZCA2IG1vcmUgdGltZXNdXG4nCisgICAgICAgICAgICBmJyAgRmlsZSAie19fZmlsZV9ffSIsIGxpbmUge2xpbmVub19oKzN9LCBpbiBoJydcbicKKyAgICAgICAgICAgICcgICAgZygpXG4nCisgICAgICAgICkKKyAgICAgICAgZXhwZWN0ZWQgPSAocmVzdWx0X2ggKyByZXN1bHRfZykuc3BsaXRsaW5lcygpCisgICAgICAgIGFjdHVhbCA9IHN0ZGVycl9oLmdldHZhbHVlKCkuc3BsaXRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV90cmFjZWJhY2tfcHl0aG9uKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19yZWN1cnNpdmVfdHJhY2ViYWNrX2Rpc3BsYXkodHJhY2ViYWNrLnByaW50X2V4YykKKworICAgIEBjcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfdHJhY2ViYWNrX2NweXRob25faW50ZXJuYWwoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBleGNlcHRpb25fcHJpbnQKKyAgICAgICAgZGVmIHJlbmRlcl9leGMoKToKKyAgICAgICAgICAgIGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBleGNlcHRpb25fcHJpbnQoZXhjX3ZhbHVlKQorICAgICAgICBzZWxmLl9jaGVja19yZWN1cnNpdmVfdHJhY2ViYWNrX2Rpc3BsYXkocmVuZGVyX2V4YykKKwogICAgIGRlZiB0ZXN0X2Zvcm1hdF9zdGFjayhzZWxmKToKICAgICAgICAgZGVmIGZtdCgpOgogICAgICAgICAgICAgcmV0dXJuIHRyYWNlYmFjay5mb3JtYXRfc3RhY2soKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZW1hbGxvYy5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2VtYWxsb2MucHkKaW5kZXggZGE4OWE5YS4uNzkwYWI3ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZW1hbGxvYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlbWFsbG9jLnB5CkBAIC0xMSw5ICsxMSwxNSBAQAogICAgIGltcG9ydCB0aHJlYWRpbmcKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICB0aHJlYWRpbmcgPSBOb25lCit0cnk6CisgICAgaW1wb3J0IF90ZXN0Y2FwaQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF90ZXN0Y2FwaSA9IE5vbmUKKwogCiBFTVBUWV9TVFJJTkdfU0laRSA9IHN5cy5nZXRzaXplb2YoYicnKQogCisKIGRlZiBnZXRfZnJhbWVzKG5mcmFtZSwgbGluZW5vX2RlbHRhKToKICAgICBmcmFtZXMgPSBbXQogICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgxKQpAQCAtMzcsMjggKzQzLDMxIEBACiBkZWYgY3JlYXRlX3NuYXBzaG90cygpOgogICAgIHRyYWNlYmFja19saW1pdCA9IDIKIAorICAgICMgX3RyYWNlbWFsbG9jLl9nZXRfdHJhY2VzKCkgcmV0dXJucyBhIGxpc3Qgb2YgKGRvbWFpbiwgc2l6ZSwKKyAgICAjIHRyYWNlYmFja19mcmFtZXMpIHR1cGxlcy4gdHJhY2ViYWNrX2ZyYW1lcyBpcyBhIHR1cGxlIG9mIChmaWxlbmFtZSwKKyAgICAjIGxpbmVfbnVtYmVyKSB0dXBsZXMuCiAgICAgcmF3X3RyYWNlcyA9IFsKLSAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKIAotICAgICAgICAoMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMSwgMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAogCi0gICAgICAgICg2NiwgKCgnYi5weScsIDEpLCkpLAorICAgICAgICAoMiwgNjYsICgoJ2IucHknLCAxKSwpKSwKIAotICAgICAgICAoNywgKCgnPHVua25vd24+JywgMCksKSksCisgICAgICAgICgzLCA3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKICAgICBdCiAgICAgc25hcHNob3QgPSB0cmFjZW1hbGxvYy5TbmFwc2hvdChyYXdfdHJhY2VzLCB0cmFjZWJhY2tfbGltaXQpCiAKICAgICByYXdfdHJhY2VzMiA9IFsKLSAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKIAotICAgICAgICAoMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAoNTAwMCwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMiwgMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMiwgNTAwMCwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAogCi0gICAgICAgICg0MDAsICgoJ2MucHknLCA1NzgpLCkpLAorICAgICAgICAoNCwgNDAwLCAoKCdjLnB5JywgNTc4KSwpKSwKICAgICBdCiAgICAgc25hcHNob3QyID0gdHJhY2VtYWxsb2MuU25hcHNob3QocmF3X3RyYWNlczIsIHRyYWNlYmFja19saW1pdCkKIApAQCAtMTI2LDcgKzEzNSw3IEBACiAKICAgICBkZWYgZmluZF90cmFjZShzZWxmLCB0cmFjZXMsIHRyYWNlYmFjayk6CiAgICAgICAgIGZvciB0cmFjZSBpbiB0cmFjZXM6Ci0gICAgICAgICAgICBpZiB0cmFjZVsxXSA9PSB0cmFjZWJhY2suX2ZyYW1lczoKKyAgICAgICAgICAgIGlmIHRyYWNlWzJdID09IHRyYWNlYmFjay5fZnJhbWVzOgogICAgICAgICAgICAgICAgIHJldHVybiB0cmFjZQogCiAgICAgICAgIHNlbGYuZmFpbCgidHJhY2Ugbm90IGZvdW5kIikKQEAgLTE0MCw3ICsxNDksNyBAQAogICAgICAgICB0cmFjZSA9IHNlbGYuZmluZF90cmFjZSh0cmFjZXMsIG9ial90cmFjZWJhY2spCiAKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHRyYWNlLCB0dXBsZSkKLSAgICAgICAgc2l6ZSwgdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgZG9tYWluLCBzaXplLCB0cmFjZWJhY2sgPSB0cmFjZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemUsIG9ial9zaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlYmFjaywgb2JqX3RyYWNlYmFjay5fZnJhbWVzKQogCkBAIC0xNjcsOSArMTc2LDggQEAKIAogICAgICAgICB0cmFjZTEgPSBzZWxmLmZpbmRfdHJhY2UodHJhY2VzLCBvYmoxX3RyYWNlYmFjaykKICAgICAgICAgdHJhY2UyID0gc2VsZi5maW5kX3RyYWNlKHRyYWNlcywgb2JqMl90cmFjZWJhY2spCi0gICAgICAgIHNpemUxLCB0cmFjZWJhY2sxID0gdHJhY2UxCi0gICAgICAgIHNpemUyLCB0cmFjZWJhY2syID0gdHJhY2UyCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2ViYWNrMiwgdHJhY2ViYWNrMSkKKyAgICAgICAgZG9tYWluMSwgc2l6ZTEsIHRyYWNlYmFjazEgPSB0cmFjZTEKKyAgICAgICAgZG9tYWluMiwgc2l6ZTIsIHRyYWNlYmFjazIgPSB0cmFjZTIKICAgICAgICAgc2VsZi5hc3NlcnRJcyh0cmFjZWJhY2syLCB0cmFjZWJhY2sxKQogCiAgICAgZGVmIHRlc3RfZ2V0X3RyYWNlZF9tZW1vcnkoc2VsZik6CkBAIC0yOTIsNyArMzAwLDcgQEAKICAgICBtYXhEaWZmID0gNDAwMAogCiAgICAgZGVmIHRlc3RfY3JlYXRlX3NuYXBzaG90KHNlbGYpOgotICAgICAgICByYXdfdHJhY2VzID0gWyg1LCAoKCdhLnB5JywgMiksKSldCisgICAgICAgIHJhd190cmFjZXMgPSBbKDAsIDUsICgoJ2EucHknLCAyKSwpKV0KIAogICAgICAgICB3aXRoIGNvbnRleHRsaWIuRXhpdFN0YWNrKCkgYXMgc3RhY2s6CiAgICAgICAgICAgICBzdGFjay5lbnRlcl9jb250ZXh0KHBhdGNoLm9iamVjdCh0cmFjZW1hbGxvYywgJ2lzX3RyYWNpbmcnLApAQCAtMzIyLDExICszMzAsMTEgQEAKICAgICAgICAgIyBleGNsdWRlIGIucHkKICAgICAgICAgc25hcHNob3QzID0gc25hcHNob3QuZmlsdGVyX3RyYWNlcygoZmlsdGVyMSwpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuYXBzaG90My50cmFjZXMuX3RyYWNlcywgWwotICAgICAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAgICAgKDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICg3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgxLCAyLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMywgNywgKCgnPHVua25vd24+JywgMCksKSksCiAgICAgICAgIF0pCiAKICAgICAgICAgIyBmaWx0ZXJfdHJhY2VzKCkgbXVzdCBub3QgdG91Y2ggdGhlIG9yaWdpbmFsIHNuYXBzaG90CkBAIC0zMzUsMTAgKzM0MywxMCBAQAogICAgICAgICAjIG9ubHkgaW5jbHVkZSB0d28gbGluZXMgb2YgYS5weQogICAgICAgICBzbmFwc2hvdDQgPSBzbmFwc2hvdDMuZmlsdGVyX3RyYWNlcygoZmlsdGVyMiwgZmlsdGVyMykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25hcHNob3Q0LnRyYWNlcy5fdHJhY2VzLCBbCi0gICAgICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICAgICAoMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDEsIDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKICAgICAgICAgXSkKIAogICAgICAgICAjIE5vIGZpbHRlcjoganVzdCBkdXBsaWNhdGUgdGhlIHNuYXBzaG90CkBAIC0zNDksNiArMzU3LDU0IEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzbmFwc2hvdC5maWx0ZXJfdHJhY2VzLCBmaWx0ZXIxKQogCisgICAgZGVmIHRlc3RfZmlsdGVyX3RyYWNlc19kb21haW4oc2VsZik6CisgICAgICAgIHNuYXBzaG90LCBzbmFwc2hvdDIgPSBjcmVhdGVfc25hcHNob3RzKCkKKyAgICAgICAgZmlsdGVyMSA9IHRyYWNlbWFsbG9jLkZpbHRlcihGYWxzZSwgImEucHkiLCBkb21haW49MSkKKyAgICAgICAgZmlsdGVyMiA9IHRyYWNlbWFsbG9jLkZpbHRlcihUcnVlLCAiYS5weSIsIGRvbWFpbj0xKQorCisgICAgICAgIG9yaWdpbmFsX3RyYWNlcyA9IGxpc3Qoc25hcHNob3QudHJhY2VzLl90cmFjZXMpCisKKyAgICAgICAgIyBleGNsdWRlIGEucHkgb2YgZG9tYWluIDEKKyAgICAgICAgc25hcHNob3QzID0gc25hcHNob3QuZmlsdGVyX3RyYWNlcygoZmlsdGVyMSwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuYXBzaG90My50cmFjZXMuX3RyYWNlcywgWworICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDIsIDY2LCAoKCdiLnB5JywgMSksKSksCisgICAgICAgICAgICAoMywgNywgKCgnPHVua25vd24+JywgMCksKSksCisgICAgICAgIF0pCisKKyAgICAgICAgIyBpbmNsdWRlIGRvbWFpbiAxCisgICAgICAgIHNuYXBzaG90MyA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoKGZpbHRlcjEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmFwc2hvdDMudHJhY2VzLl90cmFjZXMsIFsKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgyLCA2NiwgKCgnYi5weScsIDEpLCkpLAorICAgICAgICAgICAgKDMsIDcsICgoJzx1bmtub3duPicsIDApLCkpLAorICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZmlsdGVyX3RyYWNlc19kb21haW5fZmlsdGVyKHNlbGYpOgorICAgICAgICBzbmFwc2hvdCwgc25hcHNob3QyID0gY3JlYXRlX3NuYXBzaG90cygpCisgICAgICAgIGZpbHRlcjEgPSB0cmFjZW1hbGxvYy5Eb21haW5GaWx0ZXIoRmFsc2UsIGRvbWFpbj0zKQorICAgICAgICBmaWx0ZXIyID0gdHJhY2VtYWxsb2MuRG9tYWluRmlsdGVyKFRydWUsIGRvbWFpbj0zKQorCisgICAgICAgICMgZXhjbHVkZSBkb21haW4gMgorICAgICAgICBzbmFwc2hvdDMgPSBzbmFwc2hvdC5maWx0ZXJfdHJhY2VzKChmaWx0ZXIxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25hcHNob3QzLnRyYWNlcy5fdHJhY2VzLCBbCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMSwgMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDIsIDY2LCAoKCdiLnB5JywgMSksKSksCisgICAgICAgIF0pCisKKyAgICAgICAgIyBpbmNsdWRlIGRvbWFpbiAyCisgICAgICAgIHNuYXBzaG90MyA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoKGZpbHRlcjIsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmFwc2hvdDMudHJhY2VzLl90cmFjZXMsIFsKKyAgICAgICAgICAgICgzLCA3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKKyAgICAgICAgXSkKKwogICAgIGRlZiB0ZXN0X3NuYXBzaG90X2dyb3VwX2J5X2xpbmUoc2VsZik6CiAgICAgICAgIHNuYXBzaG90LCBzbmFwc2hvdDIgPSBjcmVhdGVfc25hcHNob3RzKCkKICAgICAgICAgdGJfMCA9IHRyYWNlYmFja19saW5lbm8oJzx1bmtub3duPicsIDApCkBAIC04MTYsMTIgKzg3MiwxMjEgQEAKICAgICAgICAgYXNzZXJ0X3B5dGhvbl9vaygnLVgnLCAndHJhY2VtYWxsb2MnLCAnLWMnLCBjb2RlKQogCiAKK0B1bml0dGVzdC5za2lwSWYoX3Rlc3RjYXBpIGlzIE5vbmUsICduZWVkIF90ZXN0Y2FwaScpCitjbGFzcyBUZXN0Q0FQSSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgbWF4RGlmZiA9IDgwICogMjAKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgdHJhY2VtYWxsb2MuaXNfdHJhY2luZygpOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgidHJhY2VtYWxsb2MgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB0aGUgdGVzdCIpCisKKyAgICAgICAgc2VsZi5kb21haW4gPSA1CisgICAgICAgIHNlbGYuc2l6ZSA9IDEyMworICAgICAgICBzZWxmLm9iaiA9IGFsbG9jYXRlX2J5dGVzKHNlbGYuc2l6ZSlbMF0KKworICAgICAgICAjIGZvciB0aGUgdHlwZSAib2JqZWN0IiwgaWQob2JqKSBpcyB0aGUgYWRkcmVzcyBvZiBpdHMgbWVtb3J5IGJsb2NrLgorICAgICAgICAjIFRoaXMgdHlwZSBpcyBub3QgdHJhY2tlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IKKyAgICAgICAgc2VsZi5wdHIgPSBpZChzZWxmLm9iaikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RvcCgpCisKKyAgICBkZWYgZ2V0X3RyYWNlYmFjayhzZWxmKToKKyAgICAgICAgZnJhbWVzID0gX3Rlc3RjYXBpLnRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soc2VsZi5kb21haW4sIHNlbGYucHRyKQorICAgICAgICBpZiBmcmFtZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdHJhY2VtYWxsb2MuVHJhY2ViYWNrKGZyYW1lcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgdHJhY2soc2VsZiwgcmVsZWFzZV9naWw9RmFsc2UsIG5mcmFtZT0xKToKKyAgICAgICAgZnJhbWVzID0gZ2V0X2ZyYW1lcyhuZnJhbWUsIDIpCisgICAgICAgIF90ZXN0Y2FwaS50cmFjZW1hbGxvY190cmFjayhzZWxmLmRvbWFpbiwgc2VsZi5wdHIsIHNlbGYuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfZ2lsKQorICAgICAgICByZXR1cm4gZnJhbWVzCisKKyAgICBkZWYgdW50cmFjayhzZWxmKToKKyAgICAgICAgX3Rlc3RjYXBpLnRyYWNlbWFsbG9jX3VudHJhY2soc2VsZi5kb21haW4sIHNlbGYucHRyKQorCisgICAgZGVmIGdldF90cmFjZWRfbWVtb3J5KHNlbGYpOgorICAgICAgICAjIEdldCB0aGUgdHJhY2VkIHNpemUgaW4gdGhlIGRvbWFpbgorICAgICAgICBzbmFwc2hvdCA9IHRyYWNlbWFsbG9jLnRha2Vfc25hcHNob3QoKQorICAgICAgICBkb21haW5fZmlsdGVyID0gdHJhY2VtYWxsb2MuRG9tYWluRmlsdGVyKFRydWUsIHNlbGYuZG9tYWluKQorICAgICAgICBzbmFwc2hvdCA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoW2RvbWFpbl9maWx0ZXJdKQorICAgICAgICByZXR1cm4gc3VtKHRyYWNlLnNpemUgZm9yIHRyYWNlIGluIHNuYXBzaG90LnRyYWNlcykKKworICAgIGRlZiBjaGVja190cmFjayhzZWxmLCByZWxlYXNlX2dpbCk6CisgICAgICAgIG5mcmFtZSA9IDUKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RhcnQobmZyYW1lKQorCisgICAgICAgIHNpemUgPSB0cmFjZW1hbGxvYy5nZXRfdHJhY2VkX21lbW9yeSgpWzBdCisKKyAgICAgICAgZnJhbWVzID0gc2VsZi50cmFjayhyZWxlYXNlX2dpbCwgbmZyYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X3RyYWNlYmFjaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlbWFsbG9jLlRyYWNlYmFjayhmcmFtZXMpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdHJhY2VkX21lbW9yeSgpLCBzZWxmLnNpemUpCisKKyAgICBkZWYgdGVzdF90cmFjayhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190cmFjayhGYWxzZSkKKworICAgIGRlZiB0ZXN0X3RyYWNrX3dpdGhvdXRfZ2lsKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgY2FsbGluZyBfUHlUcmFjZU1hbGxvY19UcmFjaygpIHdpdGhvdXQgaG9sZGluZyB0aGUgR0lMCisgICAgICAgICMgd29ya3MgdG9vCisgICAgICAgIHNlbGYuY2hlY2tfdHJhY2soVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3RyYWNrX2FscmVhZHlfdHJhY2tlZChzZWxmKToKKyAgICAgICAgbmZyYW1lID0gNQorICAgICAgICB0cmFjZW1hbGxvYy5zdGFydChuZnJhbWUpCisKKyAgICAgICAgIyB0cmFjayBhIGZpcnN0IHRpbWUKKyAgICAgICAgc2VsZi50cmFjaygpCisKKyAgICAgICAgIyBjYWxsaW5nIF9QeVRyYWNlTWFsbG9jX1RyYWNrKCkgbXVzdCByZW1vdmUgdGhlIG9sZCB0cmFjZSBhbmQgYWRkCisgICAgICAgICMgYSBuZXcgdHJhY2Ugd2l0aCB0aGUgbmV3IHRyYWNlYmFjaworICAgICAgICBmcmFtZXMgPSBzZWxmLnRyYWNrKG5mcmFtZT1uZnJhbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdHJhY2ViYWNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VtYWxsb2MuVHJhY2ViYWNrKGZyYW1lcykpCisKKyAgICBkZWYgdGVzdF91bnRyYWNrKHNlbGYpOgorICAgICAgICB0cmFjZW1hbGxvYy5zdGFydCgpCisKKyAgICAgICAgc2VsZi50cmFjaygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHNlbGYuZ2V0X3RyYWNlYmFjaygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X3RyYWNlZF9tZW1vcnkoKSwgc2VsZi5zaXplKQorCisgICAgICAgICMgdW50cmFjayBtdXN0IHJlbW92ZSB0aGUgdHJhY2UKKyAgICAgICAgc2VsZi51bnRyYWNrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5nZXRfdHJhY2ViYWNrKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdHJhY2VkX21lbW9yeSgpLCAwKQorCisgICAgICAgICMgY2FsbGluZyBfUHlUcmFjZU1hbGxvY19VbnRyYWNrKCkgbXVsdGlwbGUgdGltZXMgbXVzdCBub3QgY3Jhc2gKKyAgICAgICAgc2VsZi51bnRyYWNrKCkKKyAgICAgICAgc2VsZi51bnRyYWNrKCkKKworICAgIGRlZiB0ZXN0X3N0b3BfdHJhY2soc2VsZik6CisgICAgICAgIHRyYWNlbWFsbG9jLnN0YXJ0KCkKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RvcCgpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgc2VsZi50cmFjaygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuZ2V0X3RyYWNlYmFjaygpKQorCisgICAgZGVmIHRlc3Rfc3RvcF91bnRyYWNrKHNlbGYpOgorICAgICAgICB0cmFjZW1hbGxvYy5zdGFydCgpCisgICAgICAgIHNlbGYudHJhY2soKQorCisgICAgICAgIHRyYWNlbWFsbG9jLnN0b3AoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLnVudHJhY2soKQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgKICAgICAgICAgVGVzdFRyYWNlbWFsbG9jRW5hYmxlZCwKICAgICAgICAgVGVzdFNuYXBzaG90LAogICAgICAgICBUZXN0RmlsdGVycywKICAgICAgICAgVGVzdENvbW1hbmRMaW5lLAorICAgICAgICBUZXN0Q0FQSSwKICAgICApCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5IGIvTGliL3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weQppbmRleCA0OTBlNzIzLi40NjI2NjVkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHRrX2d1aW9ubHkucHkKQEAgLTEsNCArMSwzIEBACi1pbXBvcnQgb3MKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5IGIvTGliL3Rlc3QvdGVzdF90dGtfdGV4dG9ubHkucHkKaW5kZXggNTY2ZmM5ZC4uNzU0MGE0MzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5CkBAIC0xLDQgKzEsMyBAQAotaW1wb3J0IG9zCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogIyBTa2lwIHRoaXMgdGVzdCBpZiBfdGtpbnRlciBkb2VzIG5vdCBleGlzdC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CmluZGV4IDVlNzQxMTUuLmEyMDIxOTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90eXBlcy5weQpAQCAtMTAwMCw2ICsxMDAwLDI0IEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKICAgICAgICAgICAgIFggPSB0eXBlcy5uZXdfY2xhc3MoIlgiLCAoaW50KCksIEMpKQogCisgICAgZGVmIHRlc3Rfb25lX2FyZ3VtZW50X3R5cGUoc2VsZik6CisgICAgICAgIGV4cGVjdGVkX21lc3NhZ2UgPSAndHlwZS5fX25ld19fKCkgdGFrZXMgZXhhY3RseSAzIGFyZ3VtZW50cyAoMSBnaXZlbiknCisKKyAgICAgICAgIyBPbmx5IHR5cGUgaXRzZWxmIGNhbiB1c2UgdGhlIG9uZS1hcmd1bWVudCBmb3JtICgjMjcxNTcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZSg1KSwgaW50KQorCisgICAgICAgIGNsYXNzIE0odHlwZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIE0oNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgZXhwZWN0ZWRfbWVzc2FnZSkKKworICAgICAgICBjbGFzcyBOKHR5cGUsIG1ldGFjbGFzcz1NKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgTig1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCBleHBlY3RlZF9tZXNzYWdlKQorCiAKIGNsYXNzIFNpbXBsZU5hbWVzcGFjZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90eXBpbmcucHkgYi9MaWIvdGVzdC90ZXN0X3R5cGluZy5weQppbmRleCA3MmFmZTY3Li5lMzkwNGIxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3R5cGluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3R5cGluZy5weQpAQCAtNCwxNCArNCwxNiBAQAogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCiBmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZSwgbWFpbiwgc2tpcFVubGVzcywgU2tpcFRlc3QKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IENoYWluTWFwCitmcm9tIHRlc3QgaW1wb3J0IGFubl9tb2R1bGUsIGFubl9tb2R1bGUyLCBhbm5fbW9kdWxlMwogCiBmcm9tIHR5cGluZyBpbXBvcnQgQW55CiBmcm9tIHR5cGluZyBpbXBvcnQgVHlwZVZhciwgQW55U3RyCiBmcm9tIHR5cGluZyBpbXBvcnQgVCwgS1QsIFZUICAjIE5vdCBpbiBfX2FsbF9fLgogZnJvbSB0eXBpbmcgaW1wb3J0IFVuaW9uLCBPcHRpb25hbAotZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCitmcm9tIHR5cGluZyBpbXBvcnQgVHVwbGUsIExpc3QKIGZyb20gdHlwaW5nIGltcG9ydCBDYWxsYWJsZQotZnJvbSB0eXBpbmcgaW1wb3J0IEdlbmVyaWMKK2Zyb20gdHlwaW5nIGltcG9ydCBHZW5lcmljLCBDbGFzc1ZhcgogZnJvbSB0eXBpbmcgaW1wb3J0IGNhc3QKIGZyb20gdHlwaW5nIGltcG9ydCBnZXRfdHlwZV9oaW50cwogZnJvbSB0eXBpbmcgaW1wb3J0IG5vX3R5cGVfY2hlY2ssIG5vX3R5cGVfY2hlY2tfZGVjb3JhdG9yCkBAIC04MjcsNiArODI5LDQzIEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uKToKICAgICAgICAgICAgIERbVF0KIAorY2xhc3MgQ2xhc3NWYXJUZXN0cyhCYXNlVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBDbGFzc1ZhclsxXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBDbGFzc1ZhcltpbnQsIHN0cl0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgQ2xhc3NWYXJbaW50XVtzdHJdCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoQ2xhc3NWYXIpLCAndHlwaW5nLkNsYXNzVmFyJykKKyAgICAgICAgY3YgPSBDbGFzc1ZhcltpbnRdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjdiksICd0eXBpbmcuQ2xhc3NWYXJbaW50XScpCisgICAgICAgIGN2ID0gQ2xhc3NWYXJbRW1wbG95ZWVdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjdiksICd0eXBpbmcuQ2xhc3NWYXJbJXMuRW1wbG95ZWVdJyAlIF9fbmFtZV9fKQorCisgICAgZGVmIHRlc3RfY2Fubm90X3N1YmNsYXNzKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjbGFzcyBDKHR5cGUoQ2xhc3NWYXIpKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGNsYXNzIEModHlwZShDbGFzc1ZhcltpbnRdKSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfY2Fubm90X2luaXQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHR5cGUoQ2xhc3NWYXIpKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgdHlwZShDbGFzc1ZhcltPcHRpb25hbFtpbnRdXSkoKQorCisgICAgZGVmIHRlc3Rfbm9faXNpbnN0YW5jZShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgaXNpbnN0YW5jZSgxLCBDbGFzc1ZhcltpbnRdKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBpc3N1YmNsYXNzKGludCwgQ2xhc3NWYXIpCisKIAogY2xhc3MgVmFyaWFuY2VUZXN0cyhCYXNlVGVzdENhc2UpOgogCkBAIC05MzAsNiArOTY5LDQ2IEBACiAgICAgICAgIHJpZ2h0X2hpbnRzID0gZ2V0X3R5cGVfaGludHModC5hZGRfcmlnaHQsIGdsb2JhbHMoKSwgbG9jYWxzKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmlnaHRfaGludHNbJ25vZGUnXSwgT3B0aW9uYWxbTm9kZVtUXV0pCiAKKyAgICBkZWYgdGVzdF9nZXRfdHlwZV9oaW50cyhzZWxmKToKKyAgICAgICAgZ3RoID0gZ2V0X3R5cGVfaGludHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChndGgoYW5uX21vZHVsZSksIHsneCc6IGludCwgJ3knOiBzdHJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGd0aChhbm5fbW9kdWxlLkMsIGFubl9tb2R1bGUuX19kaWN0X18pLAorICAgICAgICAgICAgICAgICAgICAgICAgIENoYWluTWFwKHsneSc6IE9wdGlvbmFsW2Fubl9tb2R1bGUuQ119LCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3RoKGFubl9tb2R1bGUyKSwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3RoKGFubl9tb2R1bGUzKSwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihndGgoYW5uX21vZHVsZS5qX2NsYXNzKSksICdDaGFpbk1hcCh7fSwge30pJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChndGgoYW5uX21vZHVsZS5NKSwgQ2hhaW5NYXAoeycxMjMnOiAxMjMsICdvJzogdHlwZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3RoKGFubl9tb2R1bGUuRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhaW5NYXAoeydqJzogc3RyLCAnayc6IHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knOiBPcHRpb25hbFthbm5fbW9kdWxlLkNdfSwge30pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGd0aChhbm5fbW9kdWxlLlkpLCBDaGFpbk1hcCh7J3onOiBpbnR9LCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3RoKGFubl9tb2R1bGUuaF9jbGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhaW5NYXAoe30sIHsneSc6IE9wdGlvbmFsW2Fubl9tb2R1bGUuQ119LCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3RoKGFubl9tb2R1bGUuUyksIENoYWluTWFwKHsneCc6IHN0ciwgJ3knOiBzdHJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChndGgoYW5uX21vZHVsZS5mb28pLCB7J3gnOiBpbnR9KQorCisgICAgICAgIGRlZiB0ZXN0Zih4LCB5KTogLi4uCisgICAgICAgIHRlc3RmLl9fYW5ub3RhdGlvbnNfX1sneCddID0gJ2ludCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChndGgodGVzdGYpLCB7J3gnOiBpbnR9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGd0aChhbm5fbW9kdWxlMi5OVEMubWV0aCksIHt9KQorCisgICAgICAgICMgaW50ZXJhY3Rpb25zIHdpdGggQ2xhc3NWYXIKKyAgICAgICAgY2xhc3MgQjoKKyAgICAgICAgICAgIHg6IENsYXNzVmFyW09wdGlvbmFsWydCJ11dID0gTm9uZQorICAgICAgICAgICAgeTogaW50CisgICAgICAgIGNsYXNzIEMoQik6CisgICAgICAgICAgICB6OiBDbGFzc1ZhclsnQyddID0gQigpCisgICAgICAgIGNsYXNzIEcoR2VuZXJpY1tUXSk6CisgICAgICAgICAgICBsc3Q6IENsYXNzVmFyW0xpc3RbVF1dID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChndGgoQiwgbG9jYWxzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIENoYWluTWFwKHsneSc6IGludCwgJ3gnOiBDbGFzc1ZhcltPcHRpb25hbFtCXV19LCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3RoKEMsIGxvY2FscygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENoYWluTWFwKHsneic6IENsYXNzVmFyW0NdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsneSc6IGludCwgJ3gnOiBDbGFzc1ZhcltPcHRpb25hbFtCXV19LCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3RoKEcpLCBDaGFpbk1hcCh7J2xzdCc6IENsYXNzVmFyW0xpc3RbVF1dfSx7fSx7fSkpCisKICAgICBkZWYgdGVzdF9mb3J3YXJkcmVmX2luc3RhbmNlX3R5cGVfZXJyb3Ioc2VsZik6CiAgICAgICAgIGZyID0gdHlwaW5nLl9Gb3J3YXJkUmVmKCdpbnQnKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkgYi9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKaW5kZXggYTM4ZTdiMS4uMjY4NGI5NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQpAQCAtMTAsNiArMTAsNyBAQAogaW1wb3J0IGl0ZXJ0b29scwogaW1wb3J0IG9wZXJhdG9yCiBpbXBvcnQgc3RydWN0CitpbXBvcnQgc3RyaW5nCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncwpAQCAtOTg2LDYgKzk4NywxOSBAQAogICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgogICAgICAgICAgICAgICAgIHJldHVybiBpbnQuX19mb3JtYXRfXyhzZWxmICogMiwgZm9ybWF0X3NwZWMpCiAKKyAgICAgICAgY2xhc3MgTToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdNKCcgKyBzZWxmLnggKyAnKScKKyAgICAgICAgICAgIF9fc3RyX18gPSBOb25lCisKKyAgICAgICAgY2xhc3MgTjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdOKCcgKyBzZWxmLnggKyAnKScKKyAgICAgICAgICAgIF9fZm9ybWF0X18gPSBOb25lCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5mb3JtYXQoKSwgJycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYycuZm9ybWF0KCksICdhYmMnKQpAQCAtMTIwMCw2ICsxMjE0LDE2IEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMHh7OjB7OmR9WH0iLmZvcm1hdCgweDAsMTYpLCAiMHgwMDAwMDAwMDAwMDAwMDAwIikKIAorICAgICAgICAjIEJsb2NraW5nIGZhbGxiYWNrCisgICAgICAgIG0gPSBNKCdkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgieyFyfSIuZm9ybWF0KG0pLCAnTShkYXRhKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgInshc30iLmZvcm1hdCwgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCAie30iLmZvcm1hdCwgbSkKKyAgICAgICAgbiA9IE4oJ2RhdGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ7IXJ9Ii5mb3JtYXQobiksICdOKGRhdGEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgieyFzfSIuZm9ybWF0KG4pLCAnTihkYXRhKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgInt9Ii5mb3JtYXQsIG4pCisKICAgICBkZWYgdGVzdF9mb3JtYXRfbWFwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmZvcm1hdF9tYXAoe30pLCAnJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYScuZm9ybWF0X21hcCh7fSksICdhJykKQEAgLTE1NDEsNyArMTU2NSw3IEBACiAgICAgICAgICAgICAoJysnLCBiJystJyksCiAgICAgICAgICAgICAoJystJywgYicrLS0nKSwKICAgICAgICAgICAgICgnKz8nLCBiJystPycpLAotICAgICAgICAgICAgKCdcPycsIGInK0FGdz8nKSwKKyAgICAgICAgICAgIChyJ1w/JywgYicrQUZ3PycpLAogICAgICAgICAgICAgKCcrPycsIGInKy0/JyksCiAgICAgICAgICAgICAocidcXD8nLCBiJytBRndBWEE/JyksCiAgICAgICAgICAgICAocidcXFw/JywgYicrQUZ3QVhBQmM/JyksCkBAIC0yMzAzLDcgKzIzMjcsNyBAQAogICAgICAgICAjIG5vbi1hc2NpaSBmb3JtYXQsIGFzY2lpIGFyZ3VtZW50OiBlbnN1cmUgdGhhdCBQeVVuaWNvZGVfRnJvbUZvcm1hdFYoKQogICAgICAgICAjIHJhaXNlcyBhbiBlcnJvcgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsCi0gICAgICAgICAgICAnXlB5VW5pY29kZV9Gcm9tRm9ybWF0VlwoXCkgZXhwZWN0cyBhbiBBU0NJSS1lbmNvZGVkIGZvcm1hdCAnCisgICAgICAgICAgICByJ15QeVVuaWNvZGVfRnJvbUZvcm1hdFZcKFwpIGV4cGVjdHMgYW4gQVNDSUktZW5jb2RlZCBmb3JtYXQgJwogICAgICAgICAgICAgJ3N0cmluZywgZ290IGEgbm9uLUFTQ0lJIGJ5dGU6IDB4ZTkkJywKICAgICAgICAgICAgIFB5VW5pY29kZV9Gcm9tRm9ybWF0LCBiJ3VuaWNvZGVceGU5PSVzJywgJ2FzY2lpJykKIApAQCAtMjcyOSw2ICsyNzUzLDEyIEBACiAgICAgICAgIHN1cHBvcnQuY2hlY2tfZnJlZV9hZnRlcl9pdGVyYXRpbmcoc2VsZiwgaXRlciwgc3RyKQogICAgICAgICBzdXBwb3J0LmNoZWNrX2ZyZWVfYWZ0ZXJfaXRlcmF0aW5nKHNlbGYsIHJldmVyc2VkLCBzdHIpCiAKKyAgICBkZWYgdGVzdF9pbnZhbGlkX3NlcXVlbmNlcyhzZWxmKToKKyAgICAgICAgZm9yIGxldHRlciBpbiBzdHJpbmcuYXNjaWlfbGV0dGVycyArICI4OSI6ICMgMC03IGFyZSBvY3RhbCBlc2NhcGVzCisgICAgICAgICAgICBpZiBsZXR0ZXIgaW4gImFiZm5ydHV2eE5VIjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICAgICAgZXZhbChyIidcJXMnIiAlIGxldHRlcikKIAogY2xhc3MgU3RyaW5nTW9kdWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZm9ybWF0dGVyX3BhcnNlcihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwMjc3LnB5IGIvTGliL3Rlc3QvdGVzdF91bmljb2RlX2ZpbGVfZnVuY3Rpb25zLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIvdGVzdC90ZXN0X3BlcDI3Ny5weQpyZW5hbWUgdG8gTGliL3Rlc3QvdGVzdF91bmljb2RlX2ZpbGVfZnVuY3Rpb25zLnB5CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlcDMxMzEucHkgYi9MaWIvdGVzdC90ZXN0X3VuaWNvZGVfaWRlbnRpZmllcnMucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi90ZXN0L3Rlc3RfcGVwMzEzMS5weQpyZW5hbWUgdG8gTGliL3Rlc3QvdGVzdF91bmljb2RlX2lkZW50aWZpZXJzLnB5CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VucGFjay5weSBiL0xpYi90ZXN0L3Rlc3RfdW5wYWNrLnB5CmluZGV4IGQxY2NiMzguLjNmY2IxOGYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdW5wYWNrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdW5wYWNrLnB5CkBAIC0xMTcsNiArMTE3LDI3IEBACiAgICAgICAuLi4KICAgICB0ZXN0LnRlc3RfdW5wYWNrLkJvem9FcnJvcgogCitBbGxvdyB1bnBhY2tpbmcgZW1wdHkgaXRlcmFibGVzCisKKyAgICA+Pj4gKCkgPSBbXQorICAgID4+PiBbXSA9ICgpCisgICAgPj4+IFtdID0gW10KKyAgICA+Pj4gKCkgPSAoKQorCitVbnBhY2tpbmcgbm9uLWl0ZXJhYmxlcyBzaG91bGQgcmFpc2UgVHlwZUVycm9yCisKKyAgICA+Pj4gKCkgPSA0MgorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogJ2ludCcgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZQorCitVbnBhY2tpbmcgdG8gYW4gZW1wdHkgaXRlcmFibGUgc2hvdWxkIHJhaXNlIFZhbHVlRXJyb3IKKworICAgID4+PiAoKSA9IFs0Ml0KKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBWYWx1ZUVycm9yOiB0b28gbWFueSB2YWx1ZXMgdG8gdW5wYWNrIChleHBlY3RlZCAwKQorCiAiIiIKIAogX190ZXN0X18gPSB7J2RvY3Rlc3RzJyA6IGRvY3Rlc3RzfQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bnBhY2tfZXgucHkgYi9MaWIvdGVzdC90ZXN0X3VucGFja19leC5weQppbmRleCA3NDM0NmI0Li42YmU4ZjU1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VucGFja19leC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VucGFja19leC5weQpAQCAtMzU3LDcgKzM1Nyw2IEBACiBfX3Rlc3RfXyA9IHsnZG9jdGVzdHMnIDogZG9jdGVzdHN9CiAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1GYWxzZSk6Ci0gICAgaW1wb3J0IHN5cwogICAgIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF91bnBhY2tfZXgKICAgICBzdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfdW5wYWNrX2V4LCB2ZXJib3NlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYi5weQppbmRleCAyNDc1OThhLi44ZjA2YjA4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYi5weQpAQCAtNzI5LDcgKzcyOSw3IEBACiAKIAogY2xhc3MgUXVvdGluZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAiIiJUZXN0cyBmb3IgdXJsbGliLnF1b3RlKCkgYW5kIHVybGxpYi5xdW90ZV9wbHVzKCkKKyAgICByIiIiVGVzdHMgZm9yIHVybGxpYi5xdW90ZSgpIGFuZCB1cmxsaWIucXVvdGVfcGx1cygpCiAKICAgICBBY2NvcmRpbmcgdG8gUkZDIDIzOTYgKFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMpLCB0byBlc2NhcGUgYQogICAgIGNoYXJhY3RlciB5b3Ugd3JpdGUgaXQgYXMgJyUnICsgPDIgY2hhcmFjdGVyIFVTLUFTQ0lJIGhleCB2YWx1ZT4uCkBAIC04MDQsNyArODA0LDcgQEAKICAgICAgICAgIyBNYWtlIHN1cmUgYWxsIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgYmUgcXVvdGVkIGFyZSBieSBkZWZhdWx0IHNhbnMKICAgICAgICAgIyBzcGFjZSAoc2VwYXJhdGUgdGVzdCBmb3IgdGhhdCkuCiAgICAgICAgIHNob3VsZF9xdW90ZSA9IFtjaHIobnVtKSBmb3IgbnVtIGluIHJhbmdlKDMyKV0gIyBGb3IgMHgwMCAtIDB4MUYKLSAgICAgICAgc2hvdWxkX3F1b3RlLmFwcGVuZCgnPD4jJSJ7fXxcXltdYCcpCisgICAgICAgIHNob3VsZF9xdW90ZS5hcHBlbmQocic8PiMlInt9fFxeW11gJykKICAgICAgICAgc2hvdWxkX3F1b3RlLmFwcGVuZChjaHIoMTI3KSkgIyBGb3IgMHg3RgogICAgICAgICBzaG91bGRfcXVvdGUgPSAnJy5qb2luKHNob3VsZF9xdW90ZSkKICAgICAgICAgZm9yIGNoYXIgaW4gc2hvdWxkX3F1b3RlOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CmluZGV4IGVkYTdjY2MuLjM0MzI5ZjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKQEAgLTcsNiArNyw4IEBACiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgYXJyYXkKIGltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHN1YnByb2Nlc3MKIAogaW1wb3J0IHVybGxpYi5yZXF1ZXN0CiAjIFRoZSBwcm94eSBieXBhc3MgbWV0aG9kIGltcG9ydGVkIGJlbG93IGhhcyBsb2dpYyBzcGVjaWZpYyB0byB0aGUgT1NYCkBAIC0zMzUsNyArMzM3LDggQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuX3R1bm5lbF9oZWFkZXJzLmNsZWFyKCkKIAotICAgIGRlZiByZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSk6CisgICAgZGVmIHJlcXVlc3Qoc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz1Ob25lLCAqLAorICAgICAgICAgICAgICAgIGVuY29kZV9jaHVua2VkPUZhbHNlKToKICAgICAgICAgc2VsZi5tZXRob2QgPSBtZXRob2QKICAgICAgICAgc2VsZi5zZWxlY3RvciA9IHVybAogICAgICAgICBpZiBoZWFkZXJzIGlzIG5vdCBOb25lOgpAQCAtMzQzLDYgKzM0Niw3IEBACiAgICAgICAgIHNlbGYucmVxX2hlYWRlcnMuc29ydCgpCiAgICAgICAgIGlmIGJvZHk6CiAgICAgICAgICAgICBzZWxmLmRhdGEgPSBib2R5CisgICAgICAgIHNlbGYuZW5jb2RlX2NodW5rZWQgPSBlbmNvZGVfY2h1bmtlZAogICAgICAgICBpZiBzZWxmLnJhaXNlX29uX2VuZGhlYWRlcnM6CiAgICAgICAgICAgICByYWlzZSBPU0Vycm9yKCkKIApAQCAtOTA4LDQxICs5MTIsMTEwIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siSG9zdCJdLCAiYmF6IikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJTcGFtIl0sICJmb28iKQogCi0gICAgICAgICMgQ2hlY2sgaXRlcmFibGUgYm9keSBzdXBwb3J0Ci0gICAgICAgIGRlZiBpdGVyYWJsZV9ib2R5KCk6Ci0gICAgICAgICAgICB5aWVsZCBiIm9uZSIKLSAgICAgICAgICAgIHlpZWxkIGIidHdvIgotICAgICAgICAgICAgeWllbGQgYiJ0aHJlZSIKKyAgICBkZWYgdGVzdF9odHRwX2JvZHlfZmlsZShzZWxmKToKKyAgICAgICAgIyBBIHJlZ3VsYXIgZmlsZSAtIGNodW5rZWQgZW5jb2RpbmcgaXMgdXNlZCB1bmxlc3MgQ29udGVudCBMZW5ndGggaXMKKyAgICAgICAgIyBhbHJlYWR5IHNldC4KIAotICAgICAgICBmb3IgaGVhZGVycyBpbiB7fSwgeyJDb250ZW50LUxlbmd0aCI6IDExfToKLSAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCBpdGVyYWJsZV9ib2R5KCksIGhlYWRlcnMpCi0gICAgICAgICAgICBpZiBub3QgaGVhZGVyczoKLSAgICAgICAgICAgICAgICAjIEhhdmluZyBhbiBpdGVyYWJsZSBib2R5IHdpdGhvdXQgYSBDb250ZW50LUxlbmd0aCBzaG91bGQKLSAgICAgICAgICAgICAgICAjIHJhaXNlIGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGguZG9fcmVxdWVzdF8sIHJlcSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCisgICAgICAgIGggPSB1cmxsaWIucmVxdWVzdC5BYnN0cmFjdEhUVFBIYW5kbGVyKCkKKyAgICAgICAgbyA9IGgucGFyZW50ID0gTW9ja09wZW5lcigpCiAKLSAgICAgICAgIyBBIGZpbGUgb2JqZWN0LgotICAgICAgICAjIFRlc3Qgb25seSBDb250ZW50LUxlbmd0aCBhdHRyaWJ1dGUgb2YgcmVxdWVzdC4KKyAgICAgICAgZmlsZV9vYmogPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUobW9kZT0ndytiJywgZGVsZXRlPUZhbHNlKQorICAgICAgICBmaWxlX3BhdGggPSBmaWxlX29iai5uYW1lCisgICAgICAgIGZpbGVfb2JqLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnVubGluaywgZmlsZV9wYXRoKQogCisgICAgICAgIHdpdGggb3BlbihmaWxlX3BhdGgsICJyYiIpIGFzIGY6CisgICAgICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIiwgZiwge30pCisgICAgICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKKyAgICAgICAgICAgIHRlID0gbmV3cmVxLmdldF9oZWFkZXIoJ1RyYW5zZmVyLWVuY29kaW5nJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGUsICJjaHVua2VkIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobmV3cmVxLmhhc19oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJykpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgInJiIikgYXMgZjoKKyAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCBmLCB7IkNvbnRlbnQtTGVuZ3RoIjogMzB9KQorICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChuZXdyZXEuZ2V0X2hlYWRlcignQ29udGVudC1sZW5ndGgnKSksIDMwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuZXdyZXEuaGFzX2hlYWRlcigiVHJhbnNmZXItZW5jb2RpbmciKSkKKworICAgIGRlZiB0ZXN0X2h0dHBfYm9keV9maWxlb2JqKHNlbGYpOgorICAgICAgICAjIEEgZmlsZSBvYmplY3QgLSBjaHVua2VkIGVuY29kaW5nIGlzIHVzZWQKKyAgICAgICAgIyB1bmxlc3MgQ29udGVudCBMZW5ndGggaXMgYWxyZWFkeSBzZXQuCisgICAgICAgICMgKE5vdGUgdGhhdCB0aGVyZSBhcmUgc29tZSBzdWJ0bGUgZGlmZmVyZW5jZXMgdG8gYSByZWd1bGFyCisgICAgICAgICMgZmlsZSwgdGhhdCBpcyB3aHkgd2UgYXJlIHRlc3RpbmcgYm90aCBjYXNlcy4pCisKKyAgICAgICAgaCA9IHVybGxpYi5yZXF1ZXN0LkFic3RyYWN0SFRUUEhhbmRsZXIoKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKICAgICAgICAgZmlsZV9vYmogPSBpby5CeXRlc0lPKCkKLSAgICAgICAgZmlsZV9vYmoud3JpdGUoYiJTb21ldGhpbmdcblNvbWV0aGluZ1xuU29tZXRoaW5nXG4iKQogCi0gICAgICAgIGZvciBoZWFkZXJzIGluIHt9LCB7IkNvbnRlbnQtTGVuZ3RoIjogMzB9OgotICAgICAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2V4YW1wbGUuY29tLyIsIGZpbGVfb2JqLCBoZWFkZXJzKQotICAgICAgICAgICAgaWYgbm90IGhlYWRlcnM6Ci0gICAgICAgICAgICAgICAgIyBIYXZpbmcgYW4gaXRlcmFibGUgYm9keSB3aXRob3V0IGEgQ29udGVudC1MZW5ndGggc2hvdWxkCi0gICAgICAgICAgICAgICAgIyByYWlzZSBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBoLmRvX3JlcXVlc3RfLCByZXEpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdF8ocmVxKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KG5ld3JlcS5nZXRfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcpKSwgMzApCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCBmaWxlX29iaiwge30pCisgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdF8ocmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld3JlcS5nZXRfaGVhZGVyKCdUcmFuc2Zlci1lbmNvZGluZycpLCAnY2h1bmtlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobmV3cmVxLmhhc19oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJykpCisKKyAgICAgICAgaGVhZGVycyA9IHsiQ29udGVudC1MZW5ndGgiOiAzMH0KKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2V4YW1wbGUuY29tLyIsIGZpbGVfb2JqLCBoZWFkZXJzKQorICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQobmV3cmVxLmdldF9oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJykpLCAzMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuZXdyZXEuaGFzX2hlYWRlcigiVHJhbnNmZXItZW5jb2RpbmciKSkKIAogICAgICAgICBmaWxlX29iai5jbG9zZSgpCiAKKyAgICBkZWYgdGVzdF9odHRwX2JvZHlfcGlwZShzZWxmKToKKyAgICAgICAgIyBBIGZpbGUgcmVhZGluZyBmcm9tIGEgcGlwZS4KKyAgICAgICAgIyBBIHBpcGUgY2Fubm90IGJlIHNlZWsnZWQuICBUaGVyZSBpcyBubyB3YXkgdG8gZGV0ZXJtaW5lIHRoZQorICAgICAgICAjIGNvbnRlbnQgbGVuZ3RoIHVwIGZyb250LiAgVGh1cywgZG9fcmVxdWVzdF8oKSBzaG91bGQgZmFsbAorICAgICAgICAjIGJhY2sgdG8gVHJhbnNmZXItZW5jb2RpbmcgY2h1bmtlZC4KKworICAgICAgICBoID0gdXJsbGliLnJlcXVlc3QuQWJzdHJhY3RIVFRQSGFuZGxlcigpCisgICAgICAgIG8gPSBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorCisgICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgciJwYXNzIl0KKyAgICAgICAgZm9yIGhlYWRlcnMgaW4ge30sIHsiQ29udGVudC1MZW5ndGgiOiAzMH06CisgICAgICAgICAgICB3aXRoIHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKSBhcyBwcm9jOgorICAgICAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCBwcm9jLnN0ZG91dCwgaGVhZGVycykKKyAgICAgICAgICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKKyAgICAgICAgICAgICAgICBpZiBub3QgaGVhZGVyczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdyZXEuZ2V0X2hlYWRlcignQ29udGVudC1sZW5ndGgnKSwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdyZXEuZ2V0X2hlYWRlcignVHJhbnNmZXItZW5jb2RpbmcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2h1bmtlZCcpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQobmV3cmVxLmdldF9oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwKQorCisgICAgZGVmIHRlc3RfaHR0cF9ib2R5X2l0ZXJhYmxlKHNlbGYpOgorICAgICAgICAjIEdlbmVyaWMgaXRlcmFibGUuICBUaGVyZSBpcyBubyB3YXkgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZW50CisgICAgICAgICMgbGVuZ3RoIHVwIGZyb250LiAgRmFsbCBiYWNrIHRvIFRyYW5zZmVyLWVuY29kaW5nIGNodW5rZWQuCisKKyAgICAgICAgaCA9IHVybGxpYi5yZXF1ZXN0LkFic3RyYWN0SFRUUEhhbmRsZXIoKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKKworICAgICAgICBkZWYgaXRlcmFibGVfYm9keSgpOgorICAgICAgICAgICAgeWllbGQgYiJvbmUiCisKKyAgICAgICAgZm9yIGhlYWRlcnMgaW4ge30sIHsiQ29udGVudC1MZW5ndGgiOiAxMX06CisgICAgICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIiwgaXRlcmFibGVfYm9keSgpLCBoZWFkZXJzKQorICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCisgICAgICAgICAgICBpZiBub3QgaGVhZGVyczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld3JlcS5nZXRfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcpLCBOb25lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3cmVxLmdldF9oZWFkZXIoJ1RyYW5zZmVyLWVuY29kaW5nJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2h1bmtlZCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KG5ld3JlcS5nZXRfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcpKSwgMTEpCisKKyAgICBkZWYgdGVzdF9odHRwX2JvZHlfZW1wdHlfc2VxKHNlbGYpOgorICAgICAgICAjIFplcm8tbGVuZ3RoIGl0ZXJhYmxlIGJvZHkgc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSBhbnkgb3RoZXIgaXRlcmFibGUKKyAgICAgICAgaCA9IHVybGxpYi5yZXF1ZXN0LkFic3RyYWN0SFRUUEhhbmRsZXIoKQorICAgICAgICBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorICAgICAgICByZXEgPSBoLmRvX3JlcXVlc3RfKFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCAoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9oZWFkZXIoIlRyYW5zZmVyLWVuY29kaW5nIiksICJjaHVua2VkIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXEuaGFzX2hlYWRlcigiQ29udGVudC1sZW5ndGgiKSkKKworICAgIGRlZiB0ZXN0X2h0dHBfYm9keV9hcnJheShzZWxmKToKICAgICAgICAgIyBhcnJheS5hcnJheSBJdGVyYWJsZSAtIENvbnRlbnQgTGVuZ3RoIGlzIGNhbGN1bGF0ZWQKIAorICAgICAgICBoID0gdXJsbGliLnJlcXVlc3QuQWJzdHJhY3RIVFRQSGFuZGxlcigpCisgICAgICAgIG8gPSBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorCiAgICAgICAgIGl0ZXJhYmxlX2FycmF5ID0gYXJyYXkuYXJyYXkoIkkiLFsxLDIsMyw0XSkKIAogICAgICAgICBmb3IgaGVhZGVycyBpbiB7fSwgeyJDb250ZW50LUxlbmd0aCI6IDE2fToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQppbmRleCBjOGIzN2VlLi5lOTU2NGZkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5CkBAIC0yODksMTIgKzI4OSwxMiBAQAogICAgICAgICBkZWYgaHR0cF9zZXJ2ZXJfd2l0aF9iYXNpY19hdXRoX2hhbmRsZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgIHJldHVybiBCYXNpY0F1dGhIYW5kbGVyKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgc2VsZi5zZXJ2ZXIgPSBMb29wYmFja0h0dHBTZXJ2ZXJUaHJlYWQoaHR0cF9zZXJ2ZXJfd2l0aF9iYXNpY19hdXRoX2hhbmRsZXIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZWxmLnNlcnZlci5zdG9wKQogICAgICAgICBzZWxmLnNlcnZlcl91cmwgPSAnaHR0cDovLzEyNy4wLjAuMTolcycgJSBzZWxmLnNlcnZlci5wb3J0CiAgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KCkKICAgICAgICAgc2VsZi5zZXJ2ZXIucmVhZHkud2FpdCgpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQogICAgICAgICBzdXBlcihCYXNpY0F1dGhUZXN0cywgc2VsZikudGVhckRvd24oKQogCiAgICAgZGVmIHRlc3RfYmFzaWNfYXV0aF9zdWNjZXNzKHNlbGYpOgpAQCAtNDM4LDE3ICs0MzgsMTMgQEAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc3VwZXIoVGVzdFVybG9wZW4sIHNlbGYpLnNldFVwKCkKLSAgICAgICAgIyBJZ25vcmUgcHJveGllcyBmb3IgbG9jYWxob3N0IHRlc3RzLgotICAgICAgICBzZWxmLm9sZF9lbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKLSAgICAgICAgb3MuZW52aXJvblsnTk9fUFJPWFknXSA9ICcqJwotICAgICAgICBzZWxmLnNlcnZlciA9IE5vbmUKIAotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgaWYgc2VsZi5zZXJ2ZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKLSAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCi0gICAgICAgIG9zLmVudmlyb24udXBkYXRlKHNlbGYub2xkX2Vudmlyb24pCi0gICAgICAgIHN1cGVyKFRlc3RVcmxvcGVuLCBzZWxmKS50ZWFyRG93bigpCisgICAgICAgICMgSWdub3JlIHByb3hpZXMgZm9yIGxvY2FsaG9zdCB0ZXN0cy4KKyAgICAgICAgZGVmIHJlc3RvcmVfZW52aXJvbihvbGRfZW52aXJvbik6CisgICAgICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKKyAgICAgICAgICAgIG9zLmVudmlyb24udXBkYXRlKG9sZF9lbnZpcm9uKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZV9lbnZpcm9uLCBvcy5lbnZpcm9uLmNvcHkoKSkKKyAgICAgICAgb3MuZW52aXJvblsnTk9fUFJPWFknXSA9ICcqJwogCiAgICAgZGVmIHVybG9wZW4oc2VsZiwgdXJsLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAgbCA9IFtdCkBAIC00NjksNiArNDY1LDcgQEAKICAgICAgICAgaGFuZGxlciA9IEdldFJlcXVlc3RIYW5kbGVyKHJlc3BvbnNlcykKIAogICAgICAgICBzZWxmLnNlcnZlciA9IExvb3BiYWNrSHR0cFNlcnZlclRocmVhZChoYW5kbGVyKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VsZi5zZXJ2ZXIuc3RvcCkKICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RhcnQoKQogICAgICAgICBzZWxmLnNlcnZlci5yZWFkeS53YWl0KCkKICAgICAgICAgcG9ydCA9IHNlbGYuc2VydmVyLnBvcnQKQEAgLTU5Miw3ICs1ODksOCBAQAogICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoKQogICAgICAgICByZXEgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KCJodHRwOi8vbG9jYWxob3N0OiVzLyIgJSBoYW5kbGVyLnBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17IlJhbmdlIjogImJ5dGVzPTIwLTM5In0pCi0gICAgICAgIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4ocmVxKQorICAgICAgICB3aXRoIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4ocmVxKToKKyAgICAgICAgICAgIHBhc3MKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyLmhlYWRlcnNfcmVjZWl2ZWRbIlJhbmdlIl0sICJieXRlcz0yMC0zOSIpCiAKICAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKQEAgLTYwOCwyMiArNjA2LDIxIEBACiAKICAgICBkZWYgdGVzdF9pbmZvKHNlbGYpOgogICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcGVuX3VybCA9IHVybGxpYi5yZXF1ZXN0LnVybG9wZW4oCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6JXMiICUgaGFuZGxlci5wb3J0KQorICAgICAgICBvcGVuX3VybCA9IHVybGxpYi5yZXF1ZXN0LnVybG9wZW4oCisgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgIHdpdGggb3Blbl91cmw6CiAgICAgICAgICAgICBpbmZvX29iaiA9IG9wZW5fdXJsLmluZm8oKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGluZm9fb2JqLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCByZXR1cm5lZCBieSAnaW5mbycgaXMgbm90IGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2Ugb2YgZW1haWwubWVzc2FnZS5NZXNzYWdlIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb19vYmouZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAicGxhaW4iKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShpbmZvX29iaiwgZW1haWwubWVzc2FnZS5NZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCByZXR1cm5lZCBieSAnaW5mbycgaXMgbm90IGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZSBvZiBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9fb2JqLmdldF9jb250ZW50X3N1YnR5cGUoKSwgInBsYWluIikKIAogICAgIGRlZiB0ZXN0X2dldHVybChzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgc2FtZSBVUkwgYXMgb3BlbmVkIGlzIHJldHVybmVkIGJ5IGdldHVybC4KICAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKCkKICAgICAgICAgb3Blbl91cmwgPSB1cmxsaWIucmVxdWVzdC51cmxvcGVuKCJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKLSAgICAgICAgdXJsID0gb3Blbl91cmwuZ2V0dXJsKCkKKyAgICAgICAgd2l0aCBvcGVuX3VybDoKKyAgICAgICAgICAgIHVybCA9IG9wZW5fdXJsLmdldHVybCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJsLCAiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCiAKICAgICBkZWYgdGVzdF9pdGVyYXRpb24oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CmluZGV4IGI4MTE5MzAuLjk0OTcxNmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CkBAIC00LDcgKzQsNiBAQAogaW1wb3J0IGNvbnRleHRsaWIKIGltcG9ydCBzb2NrZXQKIGltcG9ydCB1cmxsaWIucmVxdWVzdAotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgZW1haWwubWVzc2FnZQogaW1wb3J0IHRpbWUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5CmluZGV4IDgyOTk5N2YuLjkxNjVkNzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weQpAQCAtNjA1LDI5ICs2MDUsMjcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIDgwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVybCkKIAotICAgICAgICAjIFZlcmlmeSBhbiBpbGxlZ2FsIHBvcnQgaXMgcmV0dXJuZWQgYXMgTm9uZQorICAgICAgICAjIFZlcmlmeSBhbiBpbGxlZ2FsIHBvcnQgcmFpc2VzIFZhbHVlRXJyb3IKICAgICAgICAgdXJsID0gYiJIVFRQOi8vV1dXLlBZVEhPTi5PUkc6NjU1MzYvZG9jLyNmcmFnIgogICAgICAgICBwID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIE5vbmUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAib3V0IG9mIHJhbmdlIik6CisgICAgICAgICAgICBwLnBvcnQKIAogICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfYmFkX3BvcnQoc2VsZik6Ci0gICAgICAgICIiIkNoZWNrIGhhbmRsaW5nIG9mIG5vbi1pbnRlZ2VyIHBvcnRzLiIiIgotICAgICAgICBwID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KCJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCi0KLSAgICAgICAgcCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSgiaHR0cDovL3d3dy5leGFtcGxlLm5ldDpmb28iKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQotCi0gICAgICAgICMgT25jZSBhZ2FpbiwgcmVwZWF0IG91cnNlbHZlcyB0byB0ZXN0IGJ5dGVzCi0gICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJsc3BsaXQoYiJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsIGIid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQotCi0gICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJscGFyc2UoYiJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsIGIid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQorICAgICAgICAiIiJDaGVjayBoYW5kbGluZyBvZiBpbnZhbGlkIHBvcnRzLiIiIgorICAgICAgICBmb3IgYnl0ZXMgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgIGZvciBwYXJzZSBpbiAodXJsbGliLnBhcnNlLnVybHNwbGl0LCB1cmxsaWIucGFyc2UudXJscGFyc2UpOgorICAgICAgICAgICAgICAgIGZvciBwb3J0IGluICgiZm9vIiwgIjEuNSIsICItMSIsICIweDEwIik6CisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGJ5dGVzPWJ5dGVzLCBwYXJzZT1wYXJzZSwgcG9ydD1wb3J0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldGxvYyA9ICJ3d3cuZXhhbXBsZS5uZXQ6IiArIHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9ICJodHRwOi8vIiArIG5ldGxvYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgYnl0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0bG9jID0gbmV0bG9jLmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybC5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwYXJzZSh1cmwpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCBuZXRsb2MpCisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAucG9ydAogCiAgICAgZGVmIHRlc3RfYXR0cmlidXRlc193aXRob3V0X25ldGxvYyhzZWxmKToKICAgICAgICAgIyBUaGlzIGV4YW1wbGUgaXMgc3RyYWlnaHQgZnJvbSBSRkMgMzI2MS4gIEl0IGxvb2tzIGxpa2UgaXQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkgYi9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CmluZGV4IDgzNTdmOGIuLjY2MmM3ZjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQpAQCAtMSw2ICsxLDYgQEAKICMgQ2hlY2sgZXZlcnkgcGF0aCB0aHJvdWdoIGV2ZXJ5IG1ldGhvZCBvZiBVc2VyRGljdAogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQsIG1hcHBpbmdfdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgbWFwcGluZ190ZXN0cwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgY29sbGVjdGlvbnMKIApAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KG9uZT0xLCB0d289MiksIGQyKQogICAgICAgICAjIGl0ZW0gc2VxdWVuY2UgY29uc3RydWN0b3IKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2xsZWN0aW9ucy5Vc2VyRGljdChbKCdvbmUnLDEpLCAoJ3R3bycsMildKSwgZDIpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICInZGljdCciKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiJ2RpY3QnIik6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KGRpY3Q9Wygnb25lJywxKSwgKCd0d28nLDIpXSksIGQyKQogICAgICAgICAjIGJvdGggdG9nZXRoZXIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2xsZWN0aW9ucy5Vc2VyRGljdChbKCdvbmUnLDEpLCAoJ3R3bycsMildLCB0d289MywgdGhyZWU9NSksIGQzKQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgWygnZGljdCcsIDQyKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb2xsZWN0aW9ucy5Vc2VyRGljdCh7fSwgZGljdD1Ob25lKS5pdGVtcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbKCdkaWN0JywgTm9uZSldKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAiJ2RpY3QnIik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgIidkaWN0JyIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbGxlY3Rpb25zLlVzZXJEaWN0KGRpY3Q9eydhJzogNDJ9KS5pdGVtcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsIDQyKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29sbGVjdGlvbnMuVXNlckRpY3QsIDQyKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2VybGlzdC5weSBiL0xpYi90ZXN0L3Rlc3RfdXNlcmxpc3QucHkKaW5kZXggZjkyZTRkMy4uOGRlNmMxNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2VybGlzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJsaXN0LnB5CkBAIC0xLDcgKzEsNyBAQAogIyBDaGVjayBldmVyeSBwYXRoIHRocm91Z2ggZXZlcnkgbWV0aG9kIG9mIFVzZXJMaXN0CiAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IFVzZXJMaXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQsIGxpc3RfdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgbGlzdF90ZXN0cwogaW1wb3J0IHVuaXR0ZXN0CiAKIGNsYXNzIFVzZXJMaXN0VGVzdChsaXN0X3Rlc3RzLkNvbW1vblRlc3QpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5CmluZGV4IDliYzhlZGQuLjcxNTI4MjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHkKQEAgLTEsOSArMSw4IEBACiAjIFVzZXJTdHJpbmcgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGJ1aWx0aW4gc3RyaW5nIHR5cGUuCiAjIFVzZXJTdHJpbmcgaW5zdGFuY2VzIHNob3VsZCBiZWhhdmUgc2ltaWxhciB0byBidWlsdGluIHN0cmluZyBvYmplY3RzLgogCi1pbXBvcnQgc3RyaW5nCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydCwgc3RyaW5nX3Rlc3RzCitmcm9tIHRlc3QgaW1wb3J0IHN0cmluZ190ZXN0cwogCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBVc2VyU3RyaW5nCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwMzEyMC5weSBiL0xpYi90ZXN0L3Rlc3RfdXRmOHNvdXJjZS5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3Rlc3QvdGVzdF9wZXAzMTIwLnB5CnJlbmFtZSB0byBMaWIvdGVzdC90ZXN0X3V0Zjhzb3VyY2UucHkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXUucHkgYi9MaWIvdGVzdC90ZXN0X3V1LnB5CmluZGV4IDI1ZmZmYmYuLmFkMmYyYzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91dS5weQpAQCAtOCw3ICs4LDYgQEAKIAogaW1wb3J0IHN5cywgb3MKIGltcG9ydCB1dQotZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwogaW1wb3J0IGlvCiAKIHBsYWludGV4dCA9IGIiVGhlIHNtb290aC1zY2FsZWQgcHl0aG9uIGNyZXB0IG92ZXIgdGhlIHNsZWVwaW5nIGRvZ1xuIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF92ZW52LnB5IGIvTGliL3Rlc3QvdGVzdF92ZW52LnB5CmluZGV4IGQyYzk4NmUuLmY0YWQ3YzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdmVudi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ZlbnYucHkKQEAgLTE1LDcgKzE1LDYgQEAKIGltcG9ydCB0ZW1wZmlsZQogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IChjYXB0dXJlZF9zdGRvdXQsIGNhcHR1cmVkX3N0ZGVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuX3N5bWxpbmssIEVudmlyb25tZW50VmFyR3VhcmQsIHJtdHJlZSkKLWltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdmVudgogCkBAIC0zMSwxOCArMzAsMTcgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICB0aHJlYWRpbmcgPSBOb25lCiAKK3RyeToKKyAgICBpbXBvcnQgY3R5cGVzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgY3R5cGVzID0gTm9uZQorCiBza2lwSW5WZW52ID0gdW5pdHRlc3Quc2tpcElmKHN5cy5wcmVmaXggIT0gc3lzLmJhc2VfcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGVzdCBub3QgYXBwcm9wcmlhdGUgaW4gYSB2ZW52JykKIAotIyBvcy5wYXRoLmV4aXN0cygnbnVsJykgaXMgRmFsc2U6IGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDU0MQotaWYgb3MuZGV2bnVsbC5sb3dlcigpID09ICdudWwnOgotICAgIGZhaWxzT25XaW5kb3dzID0gdW5pdHRlc3QuZXhwZWN0ZWRGYWlsdXJlCi1lbHNlOgotICAgIGRlZiBmYWlsc09uV2luZG93cyhmKToKLSAgICAgICAgcmV0dXJuIGYKLQogY2xhc3MgQmFzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIkJhc2UgY2xhc3MgZm9yIHZlbnYgdGVzdHMuIiIiCisgICAgbWF4RGlmZiA9IDgwICogNTAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5lbnZfZGlyID0gb3MucGF0aC5yZWFscGF0aCh0ZW1wZmlsZS5ta2R0ZW1wKCkpCkBAIC01Miw3ICs1MCw3IEBACiAgICAgICAgICAgICBzZWxmLmluY2x1ZGUgPSAnSW5jbHVkZScKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuYmluZGlyID0gJ2JpbicKLSAgICAgICAgICAgIHNlbGYubGliID0gKCdsaWInLCAncHl0aG9uJXMnICUgc3lzLnZlcnNpb25bOjNdKQorICAgICAgICAgICAgc2VsZi5saWIgPSAoJ2xpYicsICdweXRob24lZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICAgICAgICAgIHNlbGYuaW5jbHVkZSA9ICdpbmNsdWRlJwogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICdfX1BZVkVOVl9MQVVOQ0hFUl9fJyBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICAgZXhlY3V0YWJsZSA9IG9zLmVudmlyb25bJ19fUFlWRU5WX0xBVU5DSEVSX18nXQpAQCAtMTE2LDYgKzExNCwxNyBAQAogICAgICAgICAgICAgcHJpbnQoJyAgICAlcicgJSBvcy5saXN0ZGlyKGJkKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZuKSwgJ0ZpbGUgJXIgc2hvdWxkIGV4aXN0LicgJSBmbikKIAorICAgIGRlZiB0ZXN0X3Byb21wdChzZWxmKToKKyAgICAgICAgZW52X25hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYuZW52X2RpcilbMV0KKworICAgICAgICBidWlsZGVyID0gdmVudi5FbnZCdWlsZGVyKCkKKyAgICAgICAgY29udGV4dCA9IGJ1aWxkZXIuZW5zdXJlX2RpcmVjdG9yaWVzKHNlbGYuZW52X2RpcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZXh0LnByb21wdCwgJyglcykgJyAlIGVudl9uYW1lKQorCisgICAgICAgIGJ1aWxkZXIgPSB2ZW52LkVudkJ1aWxkZXIocHJvbXB0PSdNeSBwcm9tcHQnKQorICAgICAgICBjb250ZXh0ID0gYnVpbGRlci5lbnN1cmVfZGlyZWN0b3JpZXMoc2VsZi5lbnZfZGlyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRleHQucHJvbXB0LCAnKE15IHByb21wdCkgJykKKwogICAgIEBza2lwSW5WZW52CiAgICAgZGVmIHRlc3RfcHJlZml4ZXMoc2VsZik6CiAgICAgICAgICIiIgpAQCAtMzEzLDIwICszMjIsMjcgQEAKICAgICAgICAgc2VsZi5ydW5fd2l0aF9jYXB0dXJlKHZlbnYuY3JlYXRlLCBzZWxmLmVudl9kaXIsIHdpdGhfcGlwPUZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydF9waXBfbm90X2luc3RhbGxlZCgpCiAKLSAgICBAZmFpbHNPbldpbmRvd3MKLSAgICBkZWYgdGVzdF9kZXZudWxsX2V4aXN0c19hbmRfaXNfZW1wdHkoc2VsZik6CisgICAgZGVmIHRlc3RfZGV2bnVsbChzZWxmKToKICAgICAgICAgIyBGaXggZm9yIGlzc3VlICMyMDA1MyB1c2VzIG9zLmRldm51bGwgdG8gZm9yY2UgYSBjb25maWcgZmlsZSB0bwogICAgICAgICAjIGFwcGVhciBlbXB0eS4gSG93ZXZlciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjA1NDEgbWVhbnMKICAgICAgICAgIyB0aGF0IGRvZXNuJ3QgY3VycmVudGx5IHdvcmsgcHJvcGVybHkgb24gV2luZG93cy4gT25jZSB0aGF0IGlzCiAgICAgICAgICMgZml4ZWQsIHRoZSAid2luX2xvY2F0aW9uIiBwYXJ0IG9mIHRlc3Rfd2l0aF9waXAgc2hvdWxkIGJlIHJlc3RvcmVkCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5kZXZudWxsKSkKICAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICJyYiIpIGFzIGY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiIiIpCiAKKyAgICAgICAgIyBJc3N1ZSAjMjA1NDE6IG9zLnBhdGguZXhpc3RzKCdudWwnKSBpcyBGYWxzZSBvbiBXaW5kb3dzCisgICAgICAgIGlmIG9zLmRldm51bGwubG93ZXIoKSA9PSAnbnVsJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMob3MuZGV2bnVsbCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MuZGV2bnVsbCkpCisKKwogICAgICMgUmVxdWVzdGluZyBwaXAgZmFpbHMgd2l0aG91dCBTU0wgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxOTc0NCkKICAgICBAdW5pdHRlc3Quc2tpcElmKHNzbCBpcyBOb25lLCBlbnN1cmVwaXAuX01JU1NJTkdfU1NMX01FU1NBR0UpCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnc29tZSBkZXBlbmRlbmNpZXMgb2YgcGlwIGltcG9ydCB0aHJlYWRpbmcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIG1vZHVsZSB1bmNvbmRpdGlvbmFsbHknKQorICAgICMgSXNzdWUgIzI2NjEwOiBwaXAvcGVwNDI1dGFncy5weSByZXF1aXJlcyBjdHlwZXMKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhjdHlwZXMsICdwaXAgcmVxdWlyZXMgY3R5cGVzJykKICAgICBkZWYgdGVzdF93aXRoX3BpcChzZWxmKToKICAgICAgICAgcm10cmVlKHNlbGYuZW52X2RpcikKICAgICAgICAgd2l0aCBFbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52dmFyczoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MvX19pbml0X18ucHkgYi9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzL19faW5pdF9fLnB5CmluZGV4IDg0YTZmYjUuLmMxMWVlNDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MvX19pbml0X18ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy9fX2luaXRfXy5weQpAQCAtMiw3ICsyLDkgQEAKIGltcG9ydCBsaW5lY2FjaGUKIGltcG9ydCBvcwogZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCByZQogaW1wb3J0IHN5cworaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlCkBAIC03MjAsNiArNzIyLDE3IEBACiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RyZWFtLmdldHZhbHVlKCkKICAgICAgICAgc2VsZi5hc3NlcnRJbih0ZXh0LCByZXN1bHQpCiAKKyAgICBkZWYgdGVzdF9zaG93d2Fybm1zZ19taXNzaW5nKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBfc2hvd3dhcm5tc2coKSBtaXNzaW5nIGlzIG9rYXkuCisgICAgICAgIHRleHQgPSAnZGVsIF9zaG93d2Fybm1zZyB0ZXN0JworICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSk6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBkZWwgc2VsZi5tb2R1bGUuX3Nob3d3YXJubXNnCisgICAgICAgICAgICB3aXRoIHN1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCdzdGRlcnInKSBhcyBzdHJlYW06CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybih0ZXh0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmVhbS5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odGV4dCwgcmVzdWx0KQorCiAgICAgZGVmIHRlc3Rfc2hvd3dhcm5pbmdfbm90X2NhbGxhYmxlKHNlbGYpOgogICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSk6CiAgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCkBAIC04MjEsMTIgKzgzNCw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX29iamVjdCwgZXhwZWN0ZWRfZmlsZV9saW5lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZmlsZV9vYmplY3QuZ2V0dmFsdWUoKSkKIAorCiBjbGFzcyBDV2FybmluZ3NEaXNwbGF5VGVzdHMoV2FybmluZ3NEaXNwbGF5VGVzdHMsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBtb2R1bGUgPSBjX3dhcm5pbmdzCiAKIGNsYXNzIFB5V2FybmluZ3NEaXNwbGF5VGVzdHMoV2FybmluZ3NEaXNwbGF5VGVzdHMsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBtb2R1bGUgPSBweV93YXJuaW5ncwogCisgICAgZGVmIHRlc3RfdHJhY2VtYWxsb2Moc2VsZik6CisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisKKyAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAndycpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUodGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgICAgIGRlZiBmdW5jKCk6CisgICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKF9fZmlsZV9fKQorICAgICAgICAgICAgICAgICAgICAjIEVtaXQgUmVzb3VyY2VXYXJuaW5nCisgICAgICAgICAgICAgICAgICAgIGYgPSBOb25lCisKKyAgICAgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgICAgICIiIikpCisKKyAgICAgICAgcmVzID0gYXNzZXJ0X3B5dGhvbl9vaygnLVdkJywgJy1YJywgJ3RyYWNlbWFsbG9jPTInLCBzdXBwb3J0LlRFU1RGTikKKworICAgICAgICBzdGRlcnIgPSByZXMuZXJyLmRlY29kZSgnYXNjaWknLCAncmVwbGFjZScpCisgICAgICAgICMgbm9ybWFsaXplIG5ld2xpbmVzCisgICAgICAgIHN0ZGVyciA9ICdcbicuam9pbihzdGRlcnIuc3BsaXRsaW5lcygpKQorICAgICAgICBzdGRlcnIgPSByZS5zdWIoJzwuKj4nLCAnPC4uLj4nLCBzdGRlcnIpCisgICAgICAgIGV4cGVjdGVkID0gdGV4dHdyYXAuZGVkZW50KCcnJworICAgICAgICAgICAge2ZuYW1lfTo1OiBSZXNvdXJjZVdhcm5pbmc6IHVuY2xvc2VkIGZpbGUgPC4uLj4KKyAgICAgICAgICAgICAgZiA9IE5vbmUKKyAgICAgICAgICAgIE9iamVjdCBhbGxvY2F0ZWQgYXQgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOgorICAgICAgICAgICAgICBGaWxlICJ7Zm5hbWV9IiwgbGluZW5vIDMKKyAgICAgICAgICAgICAgICBmID0gb3BlbihfX2ZpbGVfXykKKyAgICAgICAgICAgICAgRmlsZSAie2ZuYW1lfSIsIGxpbmVubyA3CisgICAgICAgICAgICAgICAgZnVuYygpCisgICAgICAgICcnJykKKyAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5mb3JtYXQoZm5hbWU9c3VwcG9ydC5URVNURk4pLnN0cmlwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRlcnIsIGV4cGVjdGVkKQorCiAKIGNsYXNzIENhdGNoV2FybmluZ1Rlc3RzKEJhc2VUZXN0KToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YXZlLnB5IGIvTGliL3Rlc3QvdGVzdF93YXZlLnB5CmluZGV4IDNlZmY3NzMuLjg2NjZmNzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2F2ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhdmUucHkKQEAgLTEsNiArMSw2IEBACi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgYXVkaW90ZXN0cworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGF1ZGlvb3AgaW1wb3J0IGJ5dGVzd2FwCiBpbXBvcnQgc3lzCiBpbXBvcnQgd2F2ZQpAQCAtMTAzLDUgKzEwMywxMSBAQAogICAgICAgICBmcmFtZXMgPSBieXRlc3dhcChmcmFtZXMsIDQpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnV0FWRV9GT1JNQVRfUENNJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgd2F2ZSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5IGIvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5CmluZGV4IDZkNTBhNjYuLjZlNjk5MGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dlYWtyZWYucHkKQEAgLTkxMSw3ICs5MTEsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIociwgIl9fZGljdF9fIikpCiAKICAgICBkZWYgdGVzdF9zdWJjbGFzc19yZWZzX3dpdGhfY3ljbGUoc2VsZik6Ci0gICAgICAgICMgQnVnICMzMTEwCisgICAgICAgICIiIkNvbmZpcm0gaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUzMTAwIGlzIGZpeGVkLiIiIgogICAgICAgICAjIEFuIGluc3RhbmNlIG9mIGEgd2Vha3JlZiBzdWJjbGFzcyBjYW4gaGF2ZSBhdHRyaWJ1dGVzLgogICAgICAgICAjIElmIHN1Y2ggYSB3ZWFrcmVmIGhvbGRzIHRoZSBvbmx5IHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCwKICAgICAgICAgIyBkZWxldGluZyB0aGUgd2Vha3JlZiB3aWxsIGRlbGV0ZSB0aGUgb2JqZWN0LiBJbiB0aGlzIGNhc2UsCkBAIC0xMzI1LDEzICsxMzI1LDE2IEBACiAgICAgICAgIG8gPSBPYmplY3QoMTIzNDU2KQogICAgICAgICB3aXRoIHRlc3Rjb250ZXh0KCk6CiAgICAgICAgICAgICBuID0gbGVuKGRpY3QpCi0gICAgICAgICAgICBkaWN0LnBvcGl0ZW0oKQorICAgICAgICAgICAgIyBTaW5jZSB1bmRlcmxheWluZyBkaWN0IGlzIG9yZGVyZWQsIGZpcnN0IGl0ZW0gaXMgcG9wcGVkCisgICAgICAgICAgICBkaWN0LnBvcChuZXh0KGRpY3Qua2V5cygpKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpY3QpLCBuIC0gMSkKICAgICAgICAgICAgIGRpY3Rbb10gPSBvCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaWN0KSwgbikKKyAgICAgICAgIyBsYXN0IGl0ZW0gaW4gb2JqZWN0cyBpcyByZW1vdmVkIGZyb20gZGljdCBpbiBjb250ZXh0IHNodXRkb3duCiAgICAgICAgIHdpdGggdGVzdGNvbnRleHQoKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpY3QpLCBuIC0gMSkKLSAgICAgICAgICAgIGRpY3QucG9wKG5leHQoZGljdC5rZXlzKCkpKQorICAgICAgICAgICAgIyBUaGVuLCAobywgbykgaXMgcG9wcGVkCisgICAgICAgICAgICBkaWN0LnBvcGl0ZW0oKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGljdCksIG4gLSAyKQogICAgICAgICB3aXRoIHRlc3Rjb250ZXh0KCk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaWN0KSwgbiAtIDMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dlYWtzZXQucHkgYi9MaWIvdGVzdC90ZXN0X3dlYWtzZXQucHkKaW5kZXggOWNlNjcyYi4uNjkxYjk1ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93ZWFrc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2Vha3NldC5weQpAQCAtMSwxMyArMSw2IEBACiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gd2Vha3JlZiBpbXBvcnQgcHJveHksIHJlZiwgV2Vha1NldAotaW1wb3J0IG9wZXJhdG9yCi1pbXBvcnQgY29weQorZnJvbSB3ZWFrcmVmIGltcG9ydCBXZWFrU2V0CiBpbXBvcnQgc3RyaW5nCi1pbXBvcnQgb3MKLWZyb20gcmFuZG9tIGltcG9ydCByYW5kcmFuZ2UsIHNodWZmbGUKLWltcG9ydCBzeXMKLWltcG9ydCB3YXJuaW5ncwotaW1wb3J0IGNvbGxlY3Rpb25zCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBVc2VyU3RyaW5nIGFzIHVzdHIKIGltcG9ydCBnYwogaW1wb3J0IGNvbnRleHRsaWIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2luY29uc29sZWlvLnB5IGIvTGliL3Rlc3QvdGVzdF93aW5jb25zb2xlaW8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyNmYwNgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2luY29uc29sZWlvLnB5CkBAIC0wLDAgKzEsODcgQEAKKycnJ1Rlc3RzIGZvciBXaW5kb3dzQ29uc29sZUlPCisKK1VuZm9ydHVuYXRlbHksIG1vc3QgdGVzdGluZyByZXF1aXJlcyBpbnRlcmFjdGl2ZSB1c2UsIHNpbmNlIHdlIGhhdmUgbm8KK0FQSSB0byByZWFkIGJhY2sgZnJvbSBhIHJlYWwgY29uc29sZSwgYW5kIHRoaXMgY2xhc3MgaXMgb25seSBmb3IgdXNlCit3aXRoIHJlYWwgY29uc29sZXMuCisKK0luc3RlYWQsIHdlIHZhbGlkYXRlIHRoYXQgYmFzaWMgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIG9wZW5pbmcsIGNsb3NpbmcKK2FuZCBpbiBwYXJ0aWN1bGFyIGZpbGVubygpIHdvcmssIGJ1dCBhcmUgZm9yY2VkIHRvIGxlYXZlIHJlYWwgdGVzdGluZwordG8gcmVhbCBwZW9wbGUgd2l0aCByZWFsIGtleWJvcmFkcy4KKycnJworCitpbXBvcnQgaW8KK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworCitpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgidGVzdCBvbmx5IHJlbGV2YW50IG9uIHdpbjMyIikKKworQ29uSU8gPSBpby5fV2luZG93c0NvbnNvbGVJTworCitjbGFzcyBXaW5kb3dzQ29uc29sZUlPVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2FiYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQ29uSU8sIGlvLlJhd0lPQmFzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDb25JTywgaW8uQnVmZmVyZWRJT0Jhc2UpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQ29uSU8sIGlvLlRleHRJT0Jhc2UpKQorCisgICAgZGVmIHRlc3Rfb3Blbl9mZChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IENvbklPKDApCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgIyBjYW5ub3Qgb3BlbiBjb25zb2xlIGJlY2F1c2UgaXQncyBub3QgYSByZWFsIGNvbnNvbGUKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLnJlYWRhYmxlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYud3JpdGFibGUoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZi5maWxlbm8oKSkKKyAgICAgICAgICAgIGYuY2xvc2UoKSAgICMgbXVsdGlwbGUgY2xvc2Ugc2hvdWxkIG5vdCBjcmFzaAorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IENvbklPKDEsICd3JykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAjIGNhbm5vdCBvcGVuIGNvbnNvbGUgYmVjYXVzZSBpdCdzIG5vdCBhIHJlYWwgY29uc29sZQorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLnJlYWRhYmxlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZi53cml0YWJsZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBmLmZpbGVubygpKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gQ29uSU8oMiwgJ3cnKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICMgY2Fubm90IG9wZW4gY29uc29sZSBiZWNhdXNlIGl0J3Mgbm90IGEgcmVhbCBjb25zb2xlCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYucmVhZGFibGUoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLndyaXRhYmxlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGYuZmlsZW5vKCkpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3Rfb3Blbl9uYW1lKHNlbGYpOgorICAgICAgICBmID0gQ29uSU8oIkNPTiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLnJlYWRhYmxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi53cml0YWJsZSgpKQorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShmLmZpbGVubygpKQorICAgICAgICBmLmNsb3NlKCkgICAjIG11bHRpcGxlIGNsb3NlIHNob3VsZCBub3QgY3Jhc2gKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZiA9IENvbklPKCdDT05JTiQnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5yZWFkYWJsZSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYud3JpdGFibGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoZi5maWxlbm8oKSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGYgPSBDb25JTygnQ09OT1VUJCcsICd3JykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLnJlYWRhYmxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLndyaXRhYmxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGYuZmlsZW5vKCkpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmLmNsb3NlKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5IGIvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKaW5kZXggNjAyMDdmYi4uZDY0MmIxMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKQEAgLTM3LDYgKzM3LDcgQEAKIAogdGVzdF9kYXRhID0gWwogICAgICgiSW50IFZhbHVlIiwgICAgIDQ1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX0RXT1JEKSwKKyAgICAoIlF3b3JkIFZhbHVlIiwgICAweDExMjIzMzQ0NTU2Njc3ODgsICAgICAgICAgICAgICAgICAgICAgIFJFR19RV09SRCksCiAgICAgKCJTdHJpbmcgVmFsIiwgICAgIkEgc3RyaW5nIHZhbHVlIiwgICAgICAgICAgICAgICAgICAgICAgICBSRUdfU1opLAogICAgICgiU3RyaW5nRXhwYW5kIiwgICJUaGUgcGF0aCBpcyAlcGF0aCUiLCAgICAgICAgICAgICAgICAgICAgUkVHX0VYUEFORF9TWiksCiAgICAgKCJNdWx0aS1zdHJpbmciLCAgWyJMb3RzIiwgIm9mIiwgInN0cmluZyIsICJ2YWx1ZXMiXSwgICAgICBSRUdfTVVMVElfU1opLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93aW5zb3VuZC5weSBiL0xpYi90ZXN0L3Rlc3Rfd2luc291bmQucHkKaW5kZXggNGE4YWI3ZC4uMTc5ZTA2OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93aW5zb3VuZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dpbnNvdW5kLnB5CkBAIC01MSw2ICs1MSwxMCBAQAogICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDAsIDIwMDAsIDEwMCk6CiAgICAgICAgICAgICBzYWZlX0JlZXAoaSwgNzUpCiAKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3Moc2VsZik6CisgICAgICAgIHNhZmVfQmVlcChkdXJhdGlvbj03NSwgZnJlcXVlbmN5PTIwMDApCisKKwogY2xhc3MgTWVzc2FnZUJlZXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKQEAgLTc2LDYgKzgwLDkgQEAKICAgICBkZWYgdGVzdF9xdWVzdGlvbihzZWxmKToKICAgICAgICAgc2FmZV9NZXNzYWdlQmVlcCh3aW5zb3VuZC5NQl9JQ09OUVVFU1RJT04pCiAKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3Moc2VsZik6CisgICAgICAgIHNhZmVfTWVzc2FnZUJlZXAodHlwZT13aW5zb3VuZC5NQl9PSykKKwogCiBjbGFzcyBQbGF5U291bmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtODcsNiArOTQsMjUgQEAKICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKICAgICAgICAgICAgICJub25lIiwgd2luc291bmQuU05EX0FTWU5DIHwgd2luc291bmQuU05EX01FTU9SWQogICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2luc291bmQuUGxheVNvdW5kLCBiImJhZCIsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2luc291bmQuUGxheVNvdW5kLCAiYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2luc291bmQuU05EX01FTU9SWSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aW5zb3VuZC5QbGF5U291bmQsIDEsIDApCisKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3Moc2VsZik6CisgICAgICAgIHNhZmVfUGxheVNvdW5kKGZsYWdzPXdpbnNvdW5kLlNORF9BTElBUywgc291bmQ9IlN5c3RlbUV4aXQiKQorCisgICAgZGVmIHRlc3Rfc25kX21lbW9yeShzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuZmluZGZpbGUoJ3BsdWNrLXBjbTgud2F2JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZGlyPSdhdWRpb2RhdGEnKSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIGF1ZGlvX2RhdGEgPSBmLnJlYWQoKQorICAgICAgICBzYWZlX1BsYXlTb3VuZChhdWRpb19kYXRhLCB3aW5zb3VuZC5TTkRfTUVNT1JZKQorICAgICAgICBhdWRpb19kYXRhID0gYnl0ZWFycmF5KGF1ZGlvX2RhdGEpCisgICAgICAgIHNhZmVfUGxheVNvdW5kKGF1ZGlvX2RhdGEsIHdpbnNvdW5kLlNORF9NRU1PUlkpCisKKyAgICBkZWYgdGVzdF9zbmRfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGZuID0gc3VwcG9ydC5maW5kZmlsZSgncGx1Y2stcGNtOC53YXYnLCBzdWJkaXI9J2F1ZGlvZGF0YScpCisgICAgICAgIHNhZmVfUGxheVNvdW5kKGZuLCB3aW5zb3VuZC5TTkRfRklMRU5BTUUgfCB3aW5zb3VuZC5TTkRfTk9ERUZBVUxUKQogCiAgICAgZGVmIHRlc3RfYWxpYXNlcyhzZWxmKToKICAgICAgICAgYWxpYXNlcyA9IFsKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weSBiL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weQppbmRleCBlOGQ3ODliLi5lMjQ3ZmY2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dpdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93aXRoLnB5CkBAIC0xNDAsMTEgKzE0MCw2IEBACiAgICAgICAgICAgICAnd2l0aCBtb2NrIGFzIChOb25lKTpcbicKICAgICAgICAgICAgICcgIHBhc3MnKQogCi0gICAgZGVmIHRlc3RBc3NpZ25tZW50VG9FbXB0eVR1cGxlRXJyb3Ioc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoCi0gICAgICAgICAgICAnd2l0aCBtb2NrIGFzICgpOlxuJwotICAgICAgICAgICAgJyAgcGFzcycpCi0KICAgICBkZWYgdGVzdEFzc2lnbm1lbnRUb1R1cGxlT25seUNvbnRhaW5pbmdOb25lRXJyb3Ioc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoJ3dpdGggbW9jayBhcyBOb25lLDpcbiAgcGFzcycpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoCkBAIC00NTQsNyArNDQ5LDcgQEAKICAgICAgICAgICAgIHdpdGggY20oKToKICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCJmcm9tIHdpdGgiKQogCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHNob3VsZFRocm93KQogCiAgICAgZGVmIHRlc3RSYWlzZWRTdG9wSXRlcmF0aW9uMihzZWxmKToKQEAgLTQ4Miw3ICs0NzcsNyBAQAogICAgICAgICAgICAgd2l0aCBjbSgpOgogICAgICAgICAgICAgICAgIHJhaXNlIG5leHQoaXRlcihbXSkpCiAKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgc2hvdWxkVGhyb3cpCiAKICAgICBkZWYgdGVzdFJhaXNlZEdlbmVyYXRvckV4aXQxKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQppbmRleCBiYzFkZDE0Li42ZTU0NjI4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQpAQCAtOTEsOCArOTEsNiBAQAogCiAKIGNsYXNzIE1vZHVsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICMgVE9ETzogdGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHdlIGdldCByaWQgb2YgdGhlIGdsb2JhbCBtb2R1bGUgdmFycwotCiAgICAgZGVmIHRlc3Rfc2FuaXR5KHNlbGYpOgogICAgICAgICAjIEltcG9ydCBzYW5pdHkuCiAKQEAgLTEwMCw2ICs5OCwxMCBAQAogICAgICAgICBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudEluY2x1ZGUKICAgICAgICAgZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRQYXRoCiAKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgIG5hbWVzID0gKCJ4bWwuZXRyZWUuRWxlbWVudFRyZWUiLCAiX2VsZW1lbnR0cmVlIikKKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgRVQsIG5hbWVzLCBibGFja2xpc3Q9KCJIVE1MX0VNUFRZIiwpKQorCiAKIGRlZiBzZXJpYWxpemUoZWxlbSwgdG9fc3RyaW5nPVRydWUsIGVuY29kaW5nPSd1bmljb2RlJywgKipvcHRpb25zKToKICAgICBpZiBlbmNvZGluZyAhPSAndW5pY29kZSc6CkBAIC0xODIsMTAgKzE4NCwxMiBAQAogCiAgICAgICAgIGRlZiBjaGVja19lbGVtZW50KGVsZW1lbnQpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEVULmlzZWxlbWVudChlbGVtZW50KSwgbXNnPSJub3QgYW4gZWxlbWVudCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAidGFnIiksIG1zZz0ibm8gdGFnIG1lbWJlciIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIiksIG1zZz0ibm8gYXR0cmliIG1lbWJlciIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAidGV4dCIpLCBtc2c9Im5vIHRleHQgbWVtYmVyIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVsZW1lbnQsICJ0YWlsIiksIG1zZz0ibm8gdGFpbCBtZW1iZXIiKQorICAgICAgICAgICAgZGlyZWxlbSA9IGRpcihlbGVtZW50KQorICAgICAgICAgICAgZm9yIGF0dHIgaW4gJ3RhZycsICdhdHRyaWInLCAndGV4dCcsICd0YWlsJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCBhdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nbm8gJXMgbWVtYmVyJyAlIGF0dHIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihhdHRyLCBkaXJlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdubyAlcyB2aXNpYmxlIGJ5IGRpcicgJSBhdHRyKQogCiAgICAgICAgICAgICBjaGVja19zdHJpbmcoZWxlbWVudC50YWcpCiAgICAgICAgICAgICBjaGVja19tYXBwaW5nKGVsZW1lbnQuYXR0cmliKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weSBiL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkKaW5kZXggOTZiNDQ2ZS4uODdmM2YyNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5CkBAIC0xLDUgKzEsNSBAQAogIyB4bWwuZXRyZWUgdGVzdCBmb3IgY0VsZW1lbnRUcmVlCi1pbXBvcnQgc3lzLCBzdHJ1Y3QKK2ltcG9ydCBzdHJ1Y3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGltcG9ydF9mcmVzaF9tb2R1bGUKIGltcG9ydCB0eXBlcwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5jYWxjc2l6ZSgnOFAnKSkKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF94bWxfZXRyZWUsIHRlc3RfeG1sX2V0cmVlX2MKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfeG1sX2V0cmVlCiAKICAgICAjIFJ1biB0aGUgdGVzdHMgc3BlY2lmaWMgdG8gdGhlIEMgaW1wbGVtZW50YXRpb24KICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5IGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKaW5kZXggMDJkOWY1Yy4uMjlhOTg3OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKQEAgLTksNyArOSw2IEBACiBpbXBvcnQgaHR0cC5jbGllbnQKIGltcG9ydCBodHRwLCBodHRwLnNlcnZlcgogaW1wb3J0IHNvY2tldAotaW1wb3J0IG9zCiBpbXBvcnQgcmUKIGltcG9ydCBpbwogaW1wb3J0IGNvbnRleHRsaWIKQEAgLTExNDcsNyArMTE0Niw2IEBACiAgICAgIiIiQSB2YXJpYXRpb24gb24gc3VwcG9ydC5jYXB0dXJlZF9zdGRvdXQoKSB3aGljaCBnaXZlcyBhIHRleHQgc3RyZWFtCiAgICAgaGF2aW5nIGEgYGJ1ZmZlcmAgYXR0cmlidXRlLgogICAgICIiIgotICAgIGltcG9ydCBpbwogICAgIG9yaWdfc3Rkb3V0ID0gc3lzLnN0ZG91dAogICAgIHN5cy5zdGRvdXQgPSBpby5UZXh0SU9XcmFwcGVyKGlvLkJ5dGVzSU8oKSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCiAgICAgdHJ5OgpAQCAtMTIyMCw3ICsxMjE4LDcgQEAKICAgICAgICAgY29udGVudCA9IGhhbmRsZVtoYW5kbGUuZmluZCgiPD94bWwiKTpdCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICAgIGludChyZS5zZWFyY2goJ0NvbnRlbnQtTGVuZ3RoOiAoXGQrKScsIGhhbmRsZSkuZ3JvdXAoMSkpLAorICAgICAgICAgICAgaW50KHJlLnNlYXJjaChyJ0NvbnRlbnQtTGVuZ3RoOiAoXGQrKScsIGhhbmRsZSkuZ3JvdXAoMSkpLAogICAgICAgICAgICAgbGVuKGNvbnRlbnQpKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjX25ldC5weSBiL0xpYi90ZXN0L3Rlc3RfeG1scnBjX25ldC5weQppbmRleCBiNjBiODJmLi5hZTBhMjhlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3htbHJwY19uZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxycGNfbmV0LnB5CkBAIC0xLDcgKzEsNCBAQAogaW1wb3J0IGNvbGxlY3Rpb25zLmFiYwotaW1wb3J0IGVycm5vCi1pbXBvcnQgc29ja2V0Ci1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlcDM4MC5weSBiL0xpYi90ZXN0L3Rlc3RfeWllbGRfZnJvbS5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3Rlc3QvdGVzdF9wZXAzODAucHkKcmVuYW1lIHRvIExpYi90ZXN0L3Rlc3RfeWllbGRfZnJvbS5weQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CmluZGV4IGQyNzhlMDYuLmVmM2MzZDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKQEAgLTEsOCArMSw4IEBACiBpbXBvcnQgY29udGV4dGxpYgogaW1wb3J0IGlvCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCBpbXBvcnRsaWIudXRpbAoraW1wb3J0IHBvc2l4cGF0aAogaW1wb3J0IHRpbWUKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCB6aXBmaWxlCkBAIC0zOCwxMCArMzgsNiBAQAogICAgICAgICB5aWVsZCBmCiAgICAgICAgIHRlc3QuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCiAKLWRlZiBvcGVuVSh6aXBmcCwgZm4pOgotICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCcnLCBEZXByZWNhdGlvbldhcm5pbmcpKToKLSAgICAgICAgcmV0dXJuIHppcGZwLm9wZW4oZm4sICdyVScpCi0KIGNsYXNzIEFic3RyYWN0VGVzdHNXaXRoU291cmNlRmlsZToKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgpAQCAtNjEsNiArNTcsOSBAQAogICAgICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCAiYW5vdGhlci5uYW1lIikKICAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgVEVTVEZOKQogICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoInN0cmZpbGUiLCBzZWxmLmRhdGEpCisgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oJ3dyaXR0ZW4tb3Blbi13JywgbW9kZT0ndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5saW5lX2dlbjoKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZShsaW5lKQogCiAgICAgZGVmIHppcF90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKICAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKQEAgLTc2LDcgKzc1LDcgQEAKICAgICAgICAgICAgIHppcGZwLnByaW50ZGlyKGZpbGU9ZnApCiAgICAgICAgICAgICBkaXJlY3RvcnkgPSBmcC5nZXR2YWx1ZSgpCiAgICAgICAgICAgICBsaW5lcyA9IGRpcmVjdG9yeS5zcGxpdGxpbmVzKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgNCkgIyBOdW1iZXIgb2YgZmlsZXMgKyBoZWFkZXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgNSkgIyBOdW1iZXIgb2YgZmlsZXMgKyBoZWFkZXIKIAogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignRmlsZSBOYW1lJywgbGluZXNbMF0pCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdNb2RpZmllZCcsIGxpbmVzWzBdKQpAQCAtOTAsMjMgKzg5LDI1IEBACiAKICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG5hbWVsaXN0CiAgICAgICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgNCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oVEVTVEZOLCBuYW1lcykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImFub3RoZXIubmFtZSIsIG5hbWVzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigic3RyZmlsZSIsIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigid3JpdHRlbi1vcGVuLXciLCBuYW1lcykKIAogICAgICAgICAgICAgIyBDaGVjayBpbmZvbGlzdAogICAgICAgICAgICAgaW5mb3MgPSB6aXBmcC5pbmZvbGlzdCgpCiAgICAgICAgICAgICBuYW1lcyA9IFtpLmZpbGVuYW1lIGZvciBpIGluIGluZm9zXQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmFtZXMpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmFtZXMpLCA0KQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihURVNURk4sIG5hbWVzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigiYW5vdGhlci5uYW1lIiwgbmFtZXMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJzdHJmaWxlIiwgbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJ3cml0dGVuLW9wZW4tdyIsIG5hbWVzKQogICAgICAgICAgICAgZm9yIGkgaW4gaW5mb3M6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLmZpbGVfc2l6ZSwgbGVuKHNlbGYuZGF0YSkpCiAKICAgICAgICAgICAgICMgY2hlY2sgZ2V0aW5mbwotICAgICAgICAgICAgZm9yIG5tIGluIChURVNURk4sICJhbm90aGVyLm5hbWUiLCAic3RyZmlsZSIpOgorICAgICAgICAgICAgZm9yIG5tIGluIChURVNURk4sICJhbm90aGVyLm5hbWUiLCAic3RyZmlsZSIsICJ3cml0dGVuLW9wZW4tdyIpOgogICAgICAgICAgICAgICAgIGluZm8gPSB6aXBmcC5nZXRpbmZvKG5tKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mby5maWxlbmFtZSwgbm0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvLmZpbGVfc2l6ZSwgbGVuKHNlbGYuZGF0YSkpCkBAIC0zNzIsMTQgKzM3MywxOCBAQAogICAgIHRlc3RfbG93X2NvbXByZXNzaW9uID0gTm9uZQogCiAgICAgZGVmIHppcF90ZXN0X3dyaXRlc3RyX3Blcm1pc3Npb25zKHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3cml0ZXN0ciBjcmVhdGVzIGZpbGVzIHdpdGggbW9kZSAwNjAwLAotICAgICAgICAjIHdoZW4gaXQgaXMgcGFzc2VkIGEgbmFtZSByYXRoZXIgdGhhbiBhIFppcEluZm8gaW5zdGFuY2UuCisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgd3JpdGVzdHIgYW5kIG9wZW4oLi4uIG1vZGU9J3cnKSBjcmVhdGUgZmlsZXMgd2l0aAorICAgICAgICAjIG1vZGUgMDYwMCwgd2hlbiB0aGV5IGFyZSBwYXNzZWQgYSBuYW1lIHJhdGhlciB0aGFuIGEgWmlwSW5mbworICAgICAgICAjIGluc3RhbmNlLgogCiAgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCiAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6CiAgICAgICAgICAgICB6aW5mbyA9IHppcGZwLmdldGluZm8oJ3N0cmZpbGUnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aW5mby5leHRlcm5hbF9hdHRyLCAwbzYwMCA8PCAxNikKIAorICAgICAgICAgICAgemluZm8yID0gemlwZnAuZ2V0aW5mbygnd3JpdHRlbi1vcGVuLXcnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aW5mbzIuZXh0ZXJuYWxfYXR0ciwgMG82MDAgPDwgMTYpCisKICAgICBkZWYgdGVzdF93cml0ZXN0cl9wZXJtaXNzaW9ucyhzZWxmKToKICAgICAgICAgZm9yIGYgaW4gZ2V0X2ZpbGVzKHNlbGYpOgogICAgICAgICAgICAgc2VsZi56aXBfdGVzdF93cml0ZXN0cl9wZXJtaXNzaW9ucyhmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCkBAIC00NTEsNiArNDU2LDEwIEBACiAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsIG1vZGU9InIiKSBhcyB6aXBmcDoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZnAud3JpdGUsIFRFU1RGTikKIAorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCBtb2RlPSJyIikgYXMgemlwZnA6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICAgICAgemlwZnAub3BlbihURVNURk4sIG1vZGU9J3cnKQorCiAgICAgZGVmIHRlc3RfYWRkX2ZpbGVfYmVmb3JlXzE5ODAoc2VsZik6CiAgICAgICAgICMgU2V0IGF0aW1lIGFuZCBtdGltZSB0byAxOTcwLTAxLTAxCiAgICAgICAgIG9zLnV0aW1lKFRFU1RGTiwgKDAsIDApKQpAQCAtMTAyMiwzMiArMTAzMSw2IEBACiAgICAgICAgICAgICAgICAgZGF0YSArPSB6aXBmcC5yZWFkKGluZm8pCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGRhdGEsIHtiImZvb2JhciIsIGIiYmFyZm9vIn0pCiAKLSAgICBkZWYgdGVzdF91bml2ZXJzYWxfZGVwcmVjYXRpb24oc2VsZik6Ci0gICAgICAgIGYgPSBpby5CeXRlc0lPKCkKLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInciKSBhcyB6aXBmcDoKLSAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCdzcGFtLnR4dCcsIGInYWJhYmFnYWxhbWFnYScpCi0KLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKLSAgICAgICAgICAgIGZvciBtb2RlIGluICdVJywgJ3JVJzoKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgICAgICAgICAgemlwb3BlbiA9IHppcGZwLm9wZW4oJ3NwYW0udHh0JywgbW9kZSkKLSAgICAgICAgICAgICAgICB6aXBvcGVuLmNsb3NlKCkKLQotICAgIGRlZiB0ZXN0X3VuaXZlcnNhbF9yZWFkYWhlYWRzKHNlbGYpOgotICAgICAgICBmID0gaW8uQnl0ZXNJTygpCi0KLSAgICAgICAgZGF0YSA9IGInYVxyXG4nICogMTYgKiAxMDI0Ci0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICd3JywgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKLSAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKFRFU1RGTiwgZGF0YSkKLQotICAgICAgICBkYXRhMiA9IGInJwotICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAncicpIGFzIHppcGZwLCBcCi0gICAgICAgICAgICAgb3BlblUoemlwZnAsIFRFU1RGTikgYXMgemlwb3BlbjoKLSAgICAgICAgICAgIGZvciBsaW5lIGluIHppcG9wZW46Ci0gICAgICAgICAgICAgICAgZGF0YTIgKz0gbGluZQotCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZGF0YTIucmVwbGFjZShiJ1xuJywgYidcclxuJykpCi0KICAgICBkZWYgdGVzdF93cml0ZXN0cl9leHRlbmRlZF9sb2NhbF9oZWFkZXJfaXNzdWUxMjAyKHNlbGYpOgogICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAndycpIGFzIG9yaWdfemlwOgogICAgICAgICAgICAgZm9yIGRhdGEgaW4gJ2FiY2RlZmdoaWprbG1ub3AnOgpAQCAtMTI1NSw5ICsxMjM4LDEyIEBACiAgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQogCiAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0iciIpIGFzIHppcGY6Ci0gICAgICAgICMgcmVhZCB0aGUgZGF0YSB0byBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgdGhlcmUKKyAgICAgICAgICAgICMgcmVhZCB0aGUgZGF0YSB0byBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgdGhlcmUKICAgICAgICAgICAgIHppcGYucmVhZCgiZm9vLnR4dCIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYub3BlbiwgImZvby50eHQiLCAicSIpCisgICAgICAgICAgICAjIHVuaXZlcnNhbCBuZXdsaW5lcyBzdXBwb3J0IGlzIHJlbW92ZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZi5vcGVuLCAiZm9vLnR4dCIsICJVIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZi5vcGVuLCAiZm9vLnR4dCIsICJyVSIpCiAKICAgICBkZWYgdGVzdF9yZWFkMChzZWxmKToKICAgICAgICAgIiIiQ2hlY2sgdGhhdCBjYWxsaW5nIHJlYWQoMCkgb24gYSBaaXBFeHRGaWxlIG9iamVjdCByZXR1cm5zIGFuIGVtcHR5CkBAIC0xNDI4LDYgKzE0MTQsMzUgQEAKICAgICAgICAgICAgICMgdGVzdHppcCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBjb3JydXB0IGZpbGUsIG9yIE5vbmUKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHppcGYudGVzdHppcCgpKQogCisgICAgZGVmIHRlc3Rfb3Blbl9jb25mbGljdGluZ19oYW5kbGVzKHNlbGYpOgorICAgICAgICAjIEl0J3Mgb25seSBwb3NzaWJsZSB0byBvcGVuIG9uZSB3cml0YWJsZSBmaWxlIGhhbmRsZSBhdCBhIHRpbWUKKyAgICAgICAgbXNnMSA9IGIiSXQncyBmdW4gdG8gY2hhcnRlciBhbiBhY2NvdW50YW50ISIKKyAgICAgICAgbXNnMiA9IGIiQW5kIHNhaWwgdGhlIHdpZGUgYWNjb3VudGFudCBzZWEiCisgICAgICAgIG1zZzMgPSBiIlRvIGZpbmQsIGV4cGxvcmUgdGhlIGZ1bmRzIG9mZnNob3JlIgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAndycsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZjoKKyAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCdmb28nLCBtb2RlPSd3JykgYXMgdzI6CisgICAgICAgICAgICAgICAgdzIud3JpdGUobXNnMSkKKyAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCdiYXInLCBtb2RlPSd3JykgYXMgdzE6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICB6aXBmLm9wZW4oJ2hhbmRsZScsIG1vZGU9J3cnKQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgemlwZi5vcGVuKCdmb28nLCBtb2RlPSdyJykKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHppcGYud3JpdGVzdHIoJ3N0cicsICdhYmNkZScpCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICB6aXBmLndyaXRlKF9fZmlsZV9fLCAnZmlsZScpCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICB6aXBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICB3MS53cml0ZShtc2cyKQorICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ2JheicsIG1vZGU9J3cnKSBhcyB3MjoKKyAgICAgICAgICAgICAgICB3Mi53cml0ZShtc2czKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICdyJykgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5yZWFkKCdmb28nKSwgbXNnMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5yZWFkKCdiYXInKSwgbXNnMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5yZWFkKCdiYXonKSwgbXNnMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5uYW1lbGlzdCgpLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pCisKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHVubGluayhURVNURk4pCiAgICAgICAgIHVubGluayhURVNURk4yKQpAQCAtMTc2MSw2ICsxNzc2LDIyIEBACiAgICAgICAgICAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCd0d29zJykgYXMgem9wZW46CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpvcGVuLnJlYWQoKSwgYicyMjInKQogCisgICAgZGVmIHRlc3Rfb3Blbl93cml0ZShzZWxmKToKKyAgICAgICAgZm9yIHdyYXBwZXIgaW4gKGxhbWJkYSBmOiBmKSwgVGVsbGFibGUsIFVuc2Vla2FibGU6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh3cmFwcGVyPXdyYXBwZXIpOgorICAgICAgICAgICAgICAgIGYgPSBpby5CeXRlc0lPKCkKKyAgICAgICAgICAgICAgICBmLndyaXRlKGInYWJjJykKKyAgICAgICAgICAgICAgICBiZiA9IGlvLkJ1ZmZlcmVkV3JpdGVyKGYpCisgICAgICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUod3JhcHBlcihiZiksICd3JywgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmOgorICAgICAgICAgICAgICAgICAgICB3aXRoIHppcGYub3Blbignb25lcycsICd3JykgYXMgem9wZW46CisgICAgICAgICAgICAgICAgICAgICAgICB6b3Blbi53cml0ZShiJzExMScpCisgICAgICAgICAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCd0d29zJywgJ3cnKSBhcyB6b3BlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHpvcGVuLndyaXRlKGInMjIyJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0dmFsdWUoKVs6NV0sIGInYWJjUEsnKQorICAgICAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYpIGFzIHppcGY6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5yZWFkKCdvbmVzJyksIGInMTExJykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmLnJlYWQoJ3R3b3MnKSwgYicyMjInKQorCiAKIEByZXF1aXJlc196bGliCiBjbGFzcyBUZXN0c1dpdGhNdWx0aXBsZU9wZW5zKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTE4NzEsNiArMTkwMiwxOSBAQAogICAgICAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCkgYXMgZjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhmLmZpbGVubygpLCAxMDApCiAKKyAgICBkZWYgdGVzdF93cml0ZV93aGlsZV9yZWFkaW5nKHNlbGYpOgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAndycsIHppcGZpbGUuWklQX0RFRkxBVEVEKSBhcyB6aXBmOgorICAgICAgICAgICAgemlwZi53cml0ZXN0cignb25lcycsIHNlbGYuZGF0YTEpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICdhJywgemlwZmlsZS5aSVBfREVGTEFURUQpIGFzIHppcGY6CisgICAgICAgICAgICB3aXRoIHppcGYub3Blbignb25lcycsICdyJykgYXMgcjE6CisgICAgICAgICAgICAgICAgZGF0YTEgPSByMS5yZWFkKDUwMCkKKyAgICAgICAgICAgICAgICB3aXRoIHppcGYub3BlbigndHdvcycsICd3JykgYXMgdzE6CisgICAgICAgICAgICAgICAgICAgIHcxLndyaXRlKHNlbGYuZGF0YTIpCisgICAgICAgICAgICAgICAgZGF0YTEgKz0gcjEucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YTEsIHNlbGYuZGF0YTEpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYucmVhZCgndHdvcycpLCBzZWxmLmRhdGEyKQorCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICB1bmxpbmsoVEVTVEZOMikKIApAQCAtMTk0MCwxMzcgKzE5ODQsMTkgQEAKICAgICAgICAgICAgIHVubGluayhURVNURk4pCiAKIAotY2xhc3MgQWJzdHJhY3RVbml2ZXJzYWxOZXdsaW5lVGVzdHM6Ci0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKLSAgICAgICAgY2xzLmxpbmVfZ2VuID0gW2J5dGVzKCJUZXN0IG9mIHppcGZpbGUgbGluZSAlZC4iICUgaSwgImFzY2lpIikKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKEZJWEVEVEVTVF9TSVpFKV0KLSAgICAgICAgY2xzLnNlcHMgPSAoYidccicsIGInXHJcbicsIGInXG4nKQotICAgICAgICBjbHMuYXJjZGF0YSA9IHt9Ci0gICAgICAgIGZvciBuLCBzIGluIGVudW1lcmF0ZShjbHMuc2Vwcyk6Ci0gICAgICAgICAgICBjbHMuYXJjZGF0YVtzXSA9IHMuam9pbihjbHMubGluZV9nZW4pICsgcworY2xhc3MgWmlwSW5mb1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9mcm9tX2ZpbGUoc2VsZik6CisgICAgICAgIHppID0gemlwZmlsZS5aaXBJbmZvLmZyb21fZmlsZShfX2ZpbGVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguYmFzZW5hbWUoemkuZmlsZW5hbWUpLCAndGVzdF96aXBmaWxlLnB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh6aS5pc19kaXIoKSkKIAotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5hcmNmaWxlcyA9IHt9Ci0gICAgICAgIGZvciBuLCBzIGluIGVudW1lcmF0ZShzZWxmLnNlcHMpOgotICAgICAgICAgICAgc2VsZi5hcmNmaWxlc1tzXSA9ICclcy0lZCcgJSAoVEVTVEZOLCBuKQotICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuYXJjZmlsZXNbc10sICJ3YiIpIGFzIGY6Ci0gICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLmFyY2RhdGFbc10pCi0KLSAgICBkZWYgbWFrZV90ZXN0X2FyY2hpdmUoc2VsZiwgZiwgY29tcHJlc3Npb24pOgotICAgICAgICAjIENyZWF0ZSB0aGUgWklQIGFyY2hpdmUKLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5hcmNmaWxlcy52YWx1ZXMoKToKLSAgICAgICAgICAgICAgICB6aXBmcC53cml0ZShmbiwgZm4pCi0KLSAgICBkZWYgcmVhZF90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKLQotICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBvcGVuVSh6aXBmcCwgZm4pIGFzIGZwOgotICAgICAgICAgICAgICAgICAgICB6aXBkYXRhID0gZnAucmVhZCgpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmFyY2RhdGFbc2VwXSwgemlwZGF0YSkKLQotICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6Ci0gICAgICAgIGZvciBmIGluIGdldF9maWxlcyhzZWxmKToKLSAgICAgICAgICAgIHNlbGYucmVhZF90ZXN0KGYsIHNlbGYuY29tcHJlc3Npb24pCi0KLSAgICBkZWYgcmVhZGxpbmVfcmVhZF90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKLQotICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBvcGVuVSh6aXBmcCwgZm4pIGFzIHppcG9wZW46Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBiJycKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgPSB6aXBvcGVuLnJlYWRsaW5lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHJlYWQKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCA9IHppcG9wZW4ucmVhZCg1KQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gcmVhZAotCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNlbGYuYXJjZGF0YVtiJ1xuJ10pCi0KLSAgICBkZWYgdGVzdF9yZWFkbGluZV9yZWFkKHNlbGYpOgotICAgICAgICBmb3IgZiBpbiBnZXRfZmlsZXMoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLnJlYWRsaW5lX3JlYWRfdGVzdChmLCBzZWxmLmNvbXByZXNzaW9uKQotCi0gICAgZGVmIHJlYWRsaW5lX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgotICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQotCi0gICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKLSAgICAgICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKLSAgICAgICAgICAgICAgICB3aXRoIG9wZW5VKHppcGZwLCBmbikgYXMgemlwb3BlbjoKLSAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5saW5lX2dlbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVkYXRhID0gemlwb3Blbi5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVkYXRhLCBsaW5lICsgYidcbicpCi0KLSAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKLSAgICAgICAgZm9yIGYgaW4gZ2V0X2ZpbGVzKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5yZWFkbGluZV90ZXN0KGYsIHNlbGYuY29tcHJlc3Npb24pCi0KLSAgICBkZWYgcmVhZGxpbmVzX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgotICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQotCi0gICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKLSAgICAgICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKLSAgICAgICAgICAgICAgICB3aXRoIG9wZW5VKHppcGZwLCBmbikgYXMgZnA6Ci0gICAgICAgICAgICAgICAgICAgIHppcGxpbmVzID0gZnAucmVhZGxpbmVzKCkKLSAgICAgICAgICAgICAgICBmb3IgbGluZSwgemlwbGluZSBpbiB6aXAoc2VsZi5saW5lX2dlbiwgemlwbGluZXMpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGxpbmUsIGxpbmUgKyBiJ1xuJykKLQotICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmKToKLSAgICAgICAgZm9yIGYgaW4gZ2V0X2ZpbGVzKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5yZWFkbGluZXNfdGVzdChmLCBzZWxmLmNvbXByZXNzaW9uKQotCi0gICAgZGVmIGl0ZXJsaW5lc190ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKLQotICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBvcGVuVSh6aXBmcCwgZm4pIGFzIGZwOgotICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSwgemlwbGluZSBpbiB6aXAoc2VsZi5saW5lX2dlbiwgZnApOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBsaW5lLCBsaW5lICsgYidcbicpCi0KLSAgICBkZWYgdGVzdF9pdGVybGluZXMoc2VsZik6Ci0gICAgICAgIGZvciBmIGluIGdldF9maWxlcyhzZWxmKToKLSAgICAgICAgICAgIHNlbGYuaXRlcmxpbmVzX3Rlc3QoZiwgc2VsZi5jb21wcmVzc2lvbikKLQotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgZm9yIHNlcCwgZm4gaW4gc2VsZi5hcmNmaWxlcy5pdGVtcygpOgotICAgICAgICAgICAgdW5saW5rKGZuKQotICAgICAgICB1bmxpbmsoVEVTVEZOKQotICAgICAgICB1bmxpbmsoVEVTVEZOMikKLQotCi1jbGFzcyBTdG9yZWRVbml2ZXJzYWxOZXdsaW5lVGVzdHMoQWJzdHJhY3RVbml2ZXJzYWxOZXdsaW5lVGVzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGNvbXByZXNzaW9uID0gemlwZmlsZS5aSVBfU1RPUkVECi0KLUByZXF1aXJlc196bGliCi1jbGFzcyBEZWZsYXRlVW5pdmVyc2FsTmV3bGluZVRlc3RzKEFic3RyYWN0VW5pdmVyc2FsTmV3bGluZVRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgY29tcHJlc3Npb24gPSB6aXBmaWxlLlpJUF9ERUZMQVRFRAotCi1AcmVxdWlyZXNfYnoyCi1jbGFzcyBCemlwMlVuaXZlcnNhbE5ld2xpbmVUZXN0cyhBYnN0cmFjdFVuaXZlcnNhbE5ld2xpbmVUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBjb21wcmVzc2lvbiA9IHppcGZpbGUuWklQX0JaSVAyCi0KLUByZXF1aXJlc19sem1hCi1jbGFzcyBMem1hVW5pdmVyc2FsTmV3bGluZVRlc3RzKEFic3RyYWN0VW5pdmVyc2FsTmV3bGluZVRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgY29tcHJlc3Npb24gPSB6aXBmaWxlLlpJUF9MWk1BCisgICAgZGVmIHRlc3RfZnJvbV9kaXIoc2VsZik6CisgICAgICAgIGRpcnBhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKKyAgICAgICAgemkgPSB6aXBmaWxlLlppcEluZm8uZnJvbV9maWxlKGRpcnBhdGgsICdzdGRsaWJfdGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmZpbGVuYW1lLCAnc3RkbGliX3Rlc3RzLycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh6aS5pc19kaXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5jb21wcmVzc190eXBlLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuZmlsZV9zaXplLCAwKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQppbmRleCA4ZTVlMTJkLi5hMjQ4MmQ0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQpAQCAtMzk4LDcgKzM5OCw4IEBACiAgICAgICAgIHBhY2tkaXIyID0gcGFja2RpciArIFRFU1RQQUNLMiArIG9zLnNlcAogICAgICAgICBmaWxlcyA9IHtwYWNrZGlyICsgIl9faW5pdF9fIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKICAgICAgICAgICAgICAgICAgcGFja2RpcjIgKyAiX19pbml0X18iICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpLAotICAgICAgICAgICAgICAgICBwYWNrZGlyMiArIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5Yyl9CisgICAgICAgICAgICAgICAgIHBhY2tkaXIyICsgVEVTVE1PRCArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKKyAgICAgICAgICAgICAgICAgInNwYW0iICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpfQogCiAgICAgICAgIHogPSBaaXBGaWxlKFRFTVBfWklQLCAidyIpCiAgICAgICAgIHRyeToKQEAgLTQxMiw2ICs0MTMsMTQgQEAKICAgICAgICAgICAgIHppID0gemlwaW1wb3J0LnppcGltcG9ydGVyKFRFTVBfWklQKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5hcmNoaXZlLCBURU1QX1pJUCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuaXNfcGFja2FnZShURVNUUEFDSyksIFRydWUpCisKKyAgICAgICAgICAgIGZpbmRfbW9kID0gemkuZmluZF9tb2R1bGUoJ3NwYW0nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoZmluZF9tb2QpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmluZF9tb2QsIHppcGltcG9ydC56aXBpbXBvcnRlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmluZF9tb2QuaXNfcGFja2FnZSgnc3BhbScpKQorICAgICAgICAgICAgbG9hZF9tb2QgPSBmaW5kX21vZC5sb2FkX21vZHVsZSgnc3BhbScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbmRfbW9kLmdldF9maWxlbmFtZSgnc3BhbScpLCBsb2FkX21vZC5fX2ZpbGVfXykKKwogICAgICAgICAgICAgbW9kID0gemkubG9hZF9tb2R1bGUoVEVTVFBBQ0spCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmdldF9maWxlbmFtZShURVNUUEFDSyksIG1vZC5fX2ZpbGVfXykKIApAQCAtNDcxLDYgKzQ4MCwxNiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgICB6aS5pc19wYWNrYWdlKFRFU1RQQUNLMiArIG9zLnNlcCArIFRFU1RNT0QpLCBGYWxzZSkKIAorICAgICAgICAgICAgcGtnX3BhdGggPSBURU1QX1pJUCArIG9zLnNlcCArIHBhY2tkaXIgKyBURVNUUEFDSzIKKyAgICAgICAgICAgIHppMiA9IHppcGltcG9ydC56aXBpbXBvcnRlcihwa2dfcGF0aCkKKyAgICAgICAgICAgIGZpbmRfbW9kX2RvdHRlZCA9IHppMi5maW5kX21vZHVsZShURVNUTU9EKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoZmluZF9tb2RfZG90dGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbmRfbW9kX2RvdHRlZCwgemlwaW1wb3J0LnppcGltcG9ydGVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh6aTIuaXNfcGFja2FnZShURVNUTU9EKSkKKyAgICAgICAgICAgIGxvYWRfbW9kID0gZmluZF9tb2RfZG90dGVkLmxvYWRfbW9kdWxlKFRFU1RNT0QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIGZpbmRfbW9kX2RvdHRlZC5nZXRfZmlsZW5hbWUoVEVTVE1PRCksIGxvYWRfbW9kLl9fZmlsZV9fKQorCiAgICAgICAgICAgICBtb2RfcGF0aCA9IFRFU1RQQUNLMiArIG9zLnNlcCArIFRFU1RNT0QKICAgICAgICAgICAgIG1vZF9uYW1lID0gbW9kdWxlX3BhdGhfdG9fZG90dGVkX25hbWUobW9kX3BhdGgpCiAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShtb2RfbmFtZSkKQEAgLTYxMCw4ICs2MjksMTAgQEAKIAogICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIoZmlsZW5hbWUpCiAgICAgICAgIHppcGltcG9ydC56aXBpbXBvcnRlcihvcy5mc2VuY29kZShmaWxlbmFtZSkpCi0gICAgICAgIHppcGltcG9ydC56aXBpbXBvcnRlcihieXRlYXJyYXkob3MuZnNlbmNvZGUoZmlsZW5hbWUpKSkKLSAgICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyKG1lbW9yeXZpZXcob3MuZnNlbmNvZGUoZmlsZW5hbWUpKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIoYnl0ZWFycmF5KG9zLmZzZW5jb2RlKGZpbGVuYW1lKSkpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyKG1lbW9yeXZpZXcob3MuZnNlbmNvZGUoZmlsZW5hbWUpKSkKIAogCiBAc3VwcG9ydC5yZXF1aXJlc196bGliCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weQppbmRleCA1OTEzNjIyLi44NGQ1MjZjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkKQEAgLTEyLDcgKzEyLDYgQEAKIGltcG9ydCBkb2N0ZXN0CiBpbXBvcnQgaW5zcGVjdAogaW1wb3J0IGxpbmVjYWNoZQotaW1wb3J0IHBkYgogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3Quc3VwcG9ydC5zY3JpcHRfaGVscGVyIGltcG9ydCAoc3Bhd25fcHl0aG9uLCBraWxsX3B5dGhvbiwgYXNzZXJ0X3B5dGhvbl9vaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3NjcmlwdCwgbWFrZV96aXBfc2NyaXB0KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96bGliLnB5IGIvTGliL3Rlc3QvdGVzdF96bGliLnB5CmluZGV4IDZmZWE4OTMuLjIwMTc0ZDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3psaWIucHkKQEAgLTE2NCw2ICsxNjQsMTYgQEAKICAgICAgICAgeCA9IHpsaWIuY29tcHJlc3MoSEFNTEVUX1NDRU5FKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuZGVjb21wcmVzcyh4KSwgSEFNTEVUX1NDRU5FKQogCisgICAgZGVmIHRlc3Rfa2V5d29yZHMoc2VsZik6CisgICAgICAgIHggPSB6bGliLmNvbXByZXNzKEhBTUxFVF9TQ0VORSwgbGV2ZWw9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoeCksIEhBTUxFVF9TQ0VORSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgemxpYi5jb21wcmVzcyhkYXRhPUhBTUxFVF9TQ0VORSwgbGV2ZWw9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2JpdHM9emxpYi5NQVhfV0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemU9emxpYi5ERUZfQlVGX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTUxFVF9TQ0VORSkKKwogICAgIGRlZiB0ZXN0X3NwZWVjaDEyOChzZWxmKToKICAgICAgICAgIyBjb21wcmVzcyBtb3JlIGRhdGEKICAgICAgICAgZGF0YSA9IEhBTUxFVF9TQ0VORSAqIDEyOApAQCAtMjM0LDYgKzI0NCwyNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGRjby51bmNvbnN1bWVkX3RhaWwsIGJ5dGVzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGRjby51bnVzZWRfZGF0YSwgYnl0ZXMpCiAKKyAgICBkZWYgdGVzdF9rZXl3b3JkcyhzZWxmKToKKyAgICAgICAgbGV2ZWwgPSAyCisgICAgICAgIG1ldGhvZCA9IHpsaWIuREVGTEFURUQKKyAgICAgICAgd2JpdHMgPSAtMTIKKyAgICAgICAgbWVtTGV2ZWwgPSA5CisgICAgICAgIHN0cmF0ZWd5ID0gemxpYi5aX0ZJTFRFUkVECisgICAgICAgIGNvID0gemxpYi5jb21wcmVzc29iaihsZXZlbD1sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZD1tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Yml0cz13Yml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbUxldmVsPW1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3k9c3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZGljdD1iIiIpCisgICAgICAgIGRvID0gemxpYi5kZWNvbXByZXNzb2JqKHdiaXRzPXdiaXRzLCB6ZGljdD1iIiIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGNvLmNvbXByZXNzKGRhdGE9SEFNTEVUX1NDRU5FKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBkby5kZWNvbXByZXNzKGRhdGE9emxpYi5jb21wcmVzcyhIQU1MRVRfU0NFTkUpKQorICAgICAgICB4ID0gY28uY29tcHJlc3MoSEFNTEVUX1NDRU5FKSArIGNvLmZsdXNoKCkKKyAgICAgICAgeSA9IGRvLmRlY29tcHJlc3MoeCwgbWF4X2xlbmd0aD1sZW4oSEFNTEVUX1NDRU5FKSkgKyBkby5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSEFNTEVUX1NDRU5FLCB5KQorCiAgICAgZGVmIHRlc3RfY29tcHJlc3NvcHRpb25zKHNlbGYpOgogICAgICAgICAjIHNwZWNpZnkgbG90cyBvZiBvcHRpb25zIHRvIGNvbXByZXNzb2JqKCkKICAgICAgICAgbGV2ZWwgPSAyCkBAIC0yNDksMTAgKzI4MCw2IEBACiAgICAgICAgIHkyID0gZGNvLmZsdXNoKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChIQU1MRVRfU0NFTkUsIHkxICsgeTIpCiAKLSAgICAgICAgIyBrZXl3b3JkIGFyZ3VtZW50cyBzaG91bGQgYWxzbyBiZSBzdXBwb3J0ZWQKLSAgICAgICAgemxpYi5jb21wcmVzc29iaihsZXZlbD1sZXZlbCwgbWV0aG9kPW1ldGhvZCwgd2JpdHM9d2JpdHMsCi0gICAgICAgICAgICBtZW1MZXZlbD1tZW1MZXZlbCwgc3RyYXRlZ3k9c3RyYXRlZ3ksIHpkaWN0PWIiIikKLQogICAgIGRlZiB0ZXN0X2NvbXByZXNzaW5jcmVtZW50YWwoc2VsZik6CiAgICAgICAgICMgY29tcHJlc3Mgb2JqZWN0IGluIHN0ZXBzLCBkZWNvbXByZXNzIG9iamVjdCBhcyBvbmUtc2hvdAogICAgICAgICBkYXRhID0gSEFNTEVUX1NDRU5FICogMTI4CmRpZmYgLS1naXQgYS9MaWIvdGhyZWFkaW5nLnB5IGIvTGliL3RocmVhZGluZy5weQppbmRleCAwNmI3YjliLi40ODI5ZmY0IDEwMDY0NAotLS0gYS9MaWIvdGhyZWFkaW5nLnB5CisrKyBiL0xpYi90aHJlYWRpbmcucHkKQEAgLTIyLDkgKzIyLDExIEBACiAjIHdpdGggdGhlIG11bHRpcHJvY2Vzc2luZyBtb2R1bGUsIHdoaWNoIGRvZXNuJ3QgcHJvdmlkZSB0aGUgb2xkCiAjIEphdmEgaW5zcGlyZWQgbmFtZXMuCiAKLV9fYWxsX18gPSBbJ2FjdGl2ZV9jb3VudCcsICdDb25kaXRpb24nLCAnY3VycmVudF90aHJlYWQnLCAnZW51bWVyYXRlJywgJ0V2ZW50JywKLSAgICAgICAgICAgJ0xvY2snLCAnUkxvY2snLCAnU2VtYXBob3JlJywgJ0JvdW5kZWRTZW1hcGhvcmUnLCAnVGhyZWFkJywgJ0JhcnJpZXInLAotICAgICAgICAgICAnVGltZXInLCAnVGhyZWFkRXJyb3InLCAnc2V0cHJvZmlsZScsICdzZXR0cmFjZScsICdsb2NhbCcsICdzdGFja19zaXplJ10KK19fYWxsX18gPSBbJ2dldF9pZGVudCcsICdhY3RpdmVfY291bnQnLCAnQ29uZGl0aW9uJywgJ2N1cnJlbnRfdGhyZWFkJywKKyAgICAgICAgICAgJ2VudW1lcmF0ZScsICdtYWluX3RocmVhZCcsICdUSU1FT1VUX01BWCcsCisgICAgICAgICAgICdFdmVudCcsICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywgJ1RocmVhZCcsCisgICAgICAgICAgICdCYXJyaWVyJywgJ0Jyb2tlbkJhcnJpZXJFcnJvcicsICdUaW1lcicsICdUaHJlYWRFcnJvcicsCisgICAgICAgICAgICdzZXRwcm9maWxlJywgJ3NldHRyYWNlJywgJ2xvY2FsJywgJ3N0YWNrX3NpemUnXQogCiAjIFJlbmFtZSBzb21lIHN0dWZmIHNvICJmcm9tIHRocmVhZGluZyBpbXBvcnQgKiIgaXMgc2FmZQogX3N0YXJ0X25ld190aHJlYWQgPSBfdGhyZWFkLnN0YXJ0X25ld190aHJlYWQKZGlmZiAtLWdpdCBhL0xpYi90aW1laXQucHkgYi9MaWIvdGltZWl0LnB5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMmRlODhmNy4uMjc3MGVmYQotLS0gYS9MaWIvdGltZWl0LnB5CisrKyBiL0xpYi90aW1laXQucHkKQEAgLTIwNyw2ICsyMDcsMjYgQEAKICAgICAgICAgICAgIHIuYXBwZW5kKHQpCiAgICAgICAgIHJldHVybiByCiAKKyAgICBkZWYgYXV0b3JhbmdlKHNlbGYsIGNhbGxiYWNrPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG51bWJlciBvZiBsb29wcyBzbyB0aGF0IHRvdGFsIHRpbWUgPj0gMC4yLgorCisgICAgICAgIENhbGxzIHRoZSB0aW1laXQgbWV0aG9kIHdpdGggKm51bWJlciogc2V0IHRvIHN1Y2Nlc3NpdmUgcG93ZXJzIG9mCisgICAgICAgIHRlbiAoMTAsIDEwMCwgMTAwMCwgLi4uKSB1cCB0byBhIG1heGltdW0gb2Ygb25lIGJpbGxpb24sIHVudGlsCisgICAgICAgIHRoZSB0aW1lIHRha2VuIGlzIGF0IGxlYXN0IDAuMiBzZWNvbmQsIG9yIHRoZSBtYXhpbXVtIGlzIHJlYWNoZWQuCisgICAgICAgIFJldHVybnMgYGAobnVtYmVyLCB0aW1lX3Rha2VuKWBgLgorCisgICAgICAgIElmICpjYWxsYmFjayogaXMgZ2l2ZW4gYW5kIGlzIG5vdCBOb25lLCBpdCB3aWxsIGJlIGNhbGxlZCBhZnRlcgorICAgICAgICBlYWNoIHRyaWFsIHdpdGggdHdvIGFyZ3VtZW50czogYGBjYWxsYmFjayhudW1iZXIsIHRpbWVfdGFrZW4pYGAuCisgICAgICAgICIiIgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCAxMCk6CisgICAgICAgICAgICBudW1iZXIgPSAxMCoqaQorICAgICAgICAgICAgdGltZV90YWtlbiA9IHNlbGYudGltZWl0KG51bWJlcikKKyAgICAgICAgICAgIGlmIGNhbGxiYWNrOgorICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bWJlciwgdGltZV90YWtlbikKKyAgICAgICAgICAgIGlmIHRpbWVfdGFrZW4gPj0gMC4yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiAobnVtYmVyLCB0aW1lX3Rha2VuKQorCiBkZWYgdGltZWl0KHN0bXQ9InBhc3MiLCBzZXR1cD0icGFzcyIsIHRpbWVyPWRlZmF1bHRfdGltZXIsCiAgICAgICAgICAgIG51bWJlcj1kZWZhdWx0X251bWJlciwgZ2xvYmFscz1Ob25lKToKICAgICAiIiJDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgVGltZXIgb2JqZWN0IGFuZCBjYWxsIHRpbWVpdCBtZXRob2QuIiIiCkBAIC0yOTUsMTcgKzMxNSwxNiBAQAogICAgIHQgPSBUaW1lcihzdG10LCBzZXR1cCwgdGltZXIpCiAgICAgaWYgbnVtYmVyID09IDA6CiAgICAgICAgICMgZGV0ZXJtaW5lIG51bWJlciBzbyB0aGF0IDAuMiA8PSB0b3RhbCB0aW1lIDwgMi4wCi0gICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDEwKToKLSAgICAgICAgICAgIG51bWJlciA9IDEwKippCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgeCA9IHQudGltZWl0KG51bWJlcikKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICB0LnByaW50X2V4YygpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQoIiVkIGxvb3BzIC0+ICUuKmcgc2VjcyIgJSAobnVtYmVyLCBwcmVjaXNpb24sIHgpKQotICAgICAgICAgICAgaWYgeCA+PSAwLjI6Ci0gICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgY2FsbGJhY2sgPSBOb25lCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBkZWYgY2FsbGJhY2sobnVtYmVyLCB0aW1lX3Rha2VuKToKKyAgICAgICAgICAgICAgICBtc2cgPSAie251bX0gbG9vcHMgLT4ge3NlY3M6LntwcmVjfWd9IHNlY3MiCisgICAgICAgICAgICAgICAgcHJpbnQobXNnLmZvcm1hdChudW09bnVtYmVyLCBzZWNzPXRpbWVfdGFrZW4sIHByZWM9cHJlY2lzaW9uKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbnVtYmVyLCBfID0gdC5hdXRvcmFuZ2UoY2FsbGJhY2spCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHQucHJpbnRfZXhjKCkKKyAgICAgICAgICAgIHJldHVybiAxCiAgICAgdHJ5OgogICAgICAgICByID0gdC5yZXBlYXQocmVwZWF0LCBudW1iZXIpCiAgICAgZXhjZXB0OgpAQCAtMzE3LDIwICszMzYsMjYgQEAKICAgICBwcmludCgiJWQgbG9vcHMsIiAlIG51bWJlciwgZW5kPScgJykKICAgICB1c2VjID0gYmVzdCAqIDFlNiAvIG51bWJlcgogICAgIGlmIHRpbWVfdW5pdCBpcyBub3QgTm9uZToKLSAgICAgICAgcHJpbnQoImJlc3Qgb2YgJWQ6ICUuKmcgJXMgcGVyIGxvb3AiICUgKHJlcGVhdCwgcHJlY2lzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlYy91bml0c1t0aW1lX3VuaXRdLCB0aW1lX3VuaXQpKQorICAgICAgICBzY2FsZSA9IHVuaXRzW3RpbWVfdW5pdF0KICAgICBlbHNlOgotICAgICAgICBpZiB1c2VjIDwgMTAwMDoKLSAgICAgICAgICAgIHByaW50KCJiZXN0IG9mICVkOiAlLipnIHVzZWMgcGVyIGxvb3AiICUgKHJlcGVhdCwgcHJlY2lzaW9uLCB1c2VjKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG1zZWMgPSB1c2VjIC8gMTAwMAotICAgICAgICAgICAgaWYgbXNlYyA8IDEwMDA6Ci0gICAgICAgICAgICAgICAgcHJpbnQoImJlc3Qgb2YgJWQ6ICUuKmcgbXNlYyBwZXIgbG9vcCIgJSAocmVwZWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiwgbXNlYykpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlYyA9IG1zZWMgLyAxMDAwCi0gICAgICAgICAgICAgICAgcHJpbnQoImJlc3Qgb2YgJWQ6ICUuKmcgc2VjIHBlciBsb29wIiAlIChyZXBlYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24sIHNlYykpCisgICAgICAgIHNjYWxlcyA9IFsoc2NhbGUsIHVuaXQpIGZvciB1bml0LCBzY2FsZSBpbiB1bml0cy5pdGVtcygpXQorICAgICAgICBzY2FsZXMuc29ydChyZXZlcnNlPVRydWUpCisgICAgICAgIGZvciBzY2FsZSwgdGltZV91bml0IGluIHNjYWxlczoKKyAgICAgICAgICAgIGlmIHVzZWMgPj0gc2NhbGU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBwcmludCgiYmVzdCBvZiAlZDogJS4qZyAlcyBwZXIgbG9vcCIgJSAocmVwZWF0LCBwcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWMvc2NhbGUsIHRpbWVfdW5pdCkpCisgICAgYmVzdCA9IG1pbihyKQorICAgIHVzZWMgPSBiZXN0ICogMWU2IC8gbnVtYmVyCisgICAgd29yc3QgPSBtYXgocikKKyAgICBpZiB3b3JzdCA+PSBiZXN0ICogNDoKKyAgICAgICAgdXNlYyA9IHdvcnN0ICogMWU2IC8gbnVtYmVyCisgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICB3YXJuaW5ncy53YXJuX2V4cGxpY2l0KAorICAgICAgICAgICAgIlRoZSB0ZXN0IHJlc3VsdHMgYXJlIGxpa2VseSB1bnJlbGlhYmxlLiBUaGUgd29yc3RcbiIKKyAgICAgICAgICAgICJ0aW1lICglLipnICVzKSB3YXMgbW9yZSB0aGFuIGZvdXIgdGltZXMgc2xvd2VyIHRoYW4gdGhlIGJlc3QgdGltZS4iICUKKyAgICAgICAgICAgIChwcmVjaXNpb24sIHVzZWMvc2NhbGUsIHRpbWVfdW5pdCksCisgICAgICAgICAgICAgVXNlcldhcm5pbmcsICcnLCAwKQogICAgIHJldHVybiBOb25lCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci9fX2luaXRfXy5weSBiL0xpYi90a2ludGVyL19faW5pdF9fLnB5CmluZGV4IDU1YmZiN2YuLjk5YWQyYTcgMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL19faW5pdF9fLnB5CisrKyBiL0xpYi90a2ludGVyL19faW5pdF9fLnB5CkBAIC0zMCw2ICszMCw3IEBACiB0ay5tYWlubG9vcCgpCiAiIiIKIAoraW1wb3J0IGVudW0KIGltcG9ydCBzeXMKIAogaW1wb3J0IF90a2ludGVyICMgSWYgdGhpcyBmYWlscyB5b3VyIFB5dGhvbiBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yIFRrCkBAIC0xMzIsNiArMTMzLDUwIEBACiAgICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlCiAgICAgcmV0dXJuIGRpY3QKIAorCitjbGFzcyBFdmVudFR5cGUoc3RyLCBlbnVtLkVudW0pOgorICAgIEtleVByZXNzID0gJzInCisgICAgS2V5ID0gS2V5UHJlc3MsCisgICAgS2V5UmVsZWFzZSA9ICczJworICAgIEJ1dHRvblByZXNzID0gJzQnCisgICAgQnV0dG9uID0gQnV0dG9uUHJlc3MsCisgICAgQnV0dG9uUmVsZWFzZSA9ICc1JworICAgIE1vdGlvbiA9ICc2JworICAgIEVudGVyID0gJzcnCisgICAgTGVhdmUgPSAnOCcKKyAgICBGb2N1c0luID0gJzknCisgICAgRm9jdXNPdXQgPSAnMTAnCisgICAgS2V5bWFwID0gJzExJyAgICAgICAgICAgIyB1bmRvY3VtZW50ZWQKKyAgICBFeHBvc2UgPSAnMTInCisgICAgR3JhcGhpY3NFeHBvc2UgPSAnMTMnICAgIyB1bmRvY3VtZW50ZWQKKyAgICBOb0V4cG9zZSA9ICcxNCcgICAgICAgICAjIHVuZG9jdW1lbnRlZAorICAgIFZpc2liaWxpdHkgPSAnMTUnCisgICAgQ3JlYXRlID0gJzE2JworICAgIERlc3Ryb3kgPSAnMTcnCisgICAgVW5tYXAgPSAnMTgnCisgICAgTWFwID0gJzE5JworICAgIE1hcFJlcXVlc3QgPSAnMjAnCisgICAgUmVwYXJlbnQgPSAnMjEnCisgICAgQ29uZmlndXJlID0gJzIyJworICAgIENvbmZpZ3VyZVJlcXVlc3QgPSAnMjMnCisgICAgR3Jhdml0eSA9ICcyNCcKKyAgICBSZXNpemVSZXF1ZXN0ID0gJzI1JworICAgIENpcmN1bGF0ZSA9ICcyNicKKyAgICBDaXJjdWxhdGVSZXF1ZXN0ID0gJzI3JworICAgIFByb3BlcnR5ID0gJzI4JworICAgIFNlbGVjdGlvbkNsZWFyID0gJzI5JyAgICMgdW5kb2N1bWVudGVkCisgICAgU2VsZWN0aW9uUmVxdWVzdCA9ICczMCcgIyB1bmRvY3VtZW50ZWQKKyAgICBTZWxlY3Rpb24gPSAnMzEnICAgICAgICAjIHVuZG9jdW1lbnRlZAorICAgIENvbG9ybWFwID0gJzMyJworICAgIENsaWVudE1lc3NhZ2UgPSAnMzMnICAgICMgdW5kb2N1bWVudGVkCisgICAgTWFwcGluZyA9ICczNCcgICAgICAgICAgIyB1bmRvY3VtZW50ZWQKKyAgICBWaXJ0dWFsRXZlbnQgPSAnMzUnLCAgICAjIHVuZG9jdW1lbnRlZAorICAgIEFjdGl2YXRlID0gJzM2JywKKyAgICBEZWFjdGl2YXRlID0gJzM3JywKKyAgICBNb3VzZVdoZWVsID0gJzM4JywKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorCiBjbGFzcyBFdmVudDoKICAgICAiIiJDb250YWluZXIgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIGV2ZW50LgogCkBAIC0xNzQsNyArMjE5LDQzIEBACiAgICAgd2lkZ2V0IC0gd2lkZ2V0IGluIHdoaWNoIHRoZSBldmVudCBvY2N1cnJlZAogICAgIGRlbHRhIC0gZGVsdGEgb2Ygd2hlZWwgbW92ZW1lbnQgKE1vdXNlV2hlZWwpCiAgICAgIiIiCi0gICAgcGFzcworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgYXR0cnMgPSB7azogdiBmb3IgaywgdiBpbiBzZWxmLl9fZGljdF9fLml0ZW1zKCkgaWYgdiAhPSAnPz8nfQorICAgICAgICBpZiBub3Qgc2VsZi5jaGFyOgorICAgICAgICAgICAgZGVsIGF0dHJzWydjaGFyJ10KKyAgICAgICAgZWxpZiBzZWxmLmNoYXIgIT0gJz8/JzoKKyAgICAgICAgICAgIGF0dHJzWydjaGFyJ10gPSByZXByKHNlbGYuY2hhcikKKyAgICAgICAgaWYgbm90IGdldGF0dHIoc2VsZiwgJ3NlbmRfZXZlbnQnLCBUcnVlKToKKyAgICAgICAgICAgIGRlbCBhdHRyc1snc2VuZF9ldmVudCddCisgICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gMDoKKyAgICAgICAgICAgIGRlbCBhdHRyc1snc3RhdGUnXQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc2VsZi5zdGF0ZSwgaW50KToKKyAgICAgICAgICAgIHN0YXRlID0gc2VsZi5zdGF0ZQorICAgICAgICAgICAgbW9kcyA9ICgnU2hpZnQnLCAnTG9jaycsICdDb250cm9sJywKKyAgICAgICAgICAgICAgICAgICAgJ01vZDEnLCAnTW9kMicsICdNb2QzJywgJ01vZDQnLCAnTW9kNScsCisgICAgICAgICAgICAgICAgICAgICdCdXR0b24xJywgJ0J1dHRvbjInLCAnQnV0dG9uMycsICdCdXR0b240JywgJ0J1dHRvbjUnKQorICAgICAgICAgICAgcyA9IFtdCisgICAgICAgICAgICBmb3IgaSwgbiBpbiBlbnVtZXJhdGUobW9kcyk6CisgICAgICAgICAgICAgICAgaWYgc3RhdGUgJiAoMSA8PCBpKToKKyAgICAgICAgICAgICAgICAgICAgcy5hcHBlbmQobikKKyAgICAgICAgICAgIHN0YXRlID0gc3RhdGUgJiB+KCgxPDwgbGVuKG1vZHMpKSAtIDEpCisgICAgICAgICAgICBpZiBzdGF0ZSBvciBub3QgczoKKyAgICAgICAgICAgICAgICBzLmFwcGVuZChoZXgoc3RhdGUpKQorICAgICAgICAgICAgYXR0cnNbJ3N0YXRlJ10gPSAnfCcuam9pbihzKQorICAgICAgICBpZiBzZWxmLmRlbHRhID09IDA6CisgICAgICAgICAgICBkZWwgYXR0cnNbJ2RlbHRhJ10KKyAgICAgICAgIyB3aWRnZXQgdXN1YWxseSBpcyBrbm93bgorICAgICAgICAjIHNlcmlhbCBhbmQgdGltZSBhcmUgbm90IHZlcnkgaW50ZXJlc3RpbmcKKyAgICAgICAgIyBrZXlzeW1fbnVtIGR1cGxpY2F0ZXMga2V5c3ltCisgICAgICAgICMgeF9yb290IGFuZCB5X3Jvb3QgbW9zdGx5IGR1cGxpY2F0ZSB4IGFuZCB5CisgICAgICAgIGtleXMgPSAoJ3NlbmRfZXZlbnQnLAorICAgICAgICAgICAgICAgICdzdGF0ZScsICdrZXlzeW0nLCAna2V5Y29kZScsICdjaGFyJywKKyAgICAgICAgICAgICAgICAnbnVtJywgJ2RlbHRhJywgJ2ZvY3VzJywKKyAgICAgICAgICAgICAgICAneCcsICd5JywgJ3dpZHRoJywgJ2hlaWdodCcpCisgICAgICAgIHJldHVybiAnPCVzIGV2ZW50JXM+JyAlICgKKyAgICAgICAgICAgIHNlbGYudHlwZSwKKyAgICAgICAgICAgICcnLmpvaW4oJyAlcz0lcycgJSAoaywgYXR0cnNba10pIGZvciBrIGluIGtleXMgaWYgayBpbiBhdHRycykKKyAgICAgICAgKQogCiBfc3VwcG9ydF9kZWZhdWx0X3Jvb3QgPSAxCiBfZGVmYXVsdF9yb290ID0gTm9uZQpAQCAtMjYyLDE1ICszNDMsOCBAQAogICAgIGRlZiBnZXQoc2VsZik6CiAgICAgICAgICIiIlJldHVybiB2YWx1ZSBvZiB2YXJpYWJsZS4iIiIKICAgICAgICAgcmV0dXJuIHNlbGYuX3RrLmdsb2JhbGdldHZhcihzZWxmLl9uYW1lKQotICAgIGRlZiB0cmFjZV92YXJpYWJsZShzZWxmLCBtb2RlLCBjYWxsYmFjayk6Ci0gICAgICAgICIiIkRlZmluZSBhIHRyYWNlIGNhbGxiYWNrIGZvciB0aGUgdmFyaWFibGUuCiAKLSAgICAgICAgTU9ERSBpcyBvbmUgb2YgInIiLCAidyIsICJ1IiBmb3IgcmVhZCwgd3JpdGUsIHVuZGVmaW5lLgotICAgICAgICBDQUxMQkFDSyBtdXN0IGJlIGEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4KLSAgICAgICAgdGhlIHZhcmlhYmxlIGlzIHJlYWQsIHdyaXR0ZW4gb3IgdW5kZWZpbmVkLgotCi0gICAgICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2FsbGJhY2suCi0gICAgICAgICIiIgorICAgIGRlZiBfcmVnaXN0ZXIoc2VsZiwgY2FsbGJhY2spOgogICAgICAgICBmID0gQ2FsbFdyYXBwZXIoY2FsbGJhY2ssIE5vbmUsIHNlbGYuX3Jvb3QpLl9fY2FsbF9fCiAgICAgICAgIGNibmFtZSA9IHJlcHIoaWQoZikpCiAgICAgICAgIHRyeToKQEAgLTI4NSwxOCArMzU5LDMzIEBACiAgICAgICAgIGlmIHNlbGYuX3RjbENvbW1hbmRzIGlzIE5vbmU6CiAgICAgICAgICAgICBzZWxmLl90Y2xDb21tYW5kcyA9IFtdCiAgICAgICAgIHNlbGYuX3RjbENvbW1hbmRzLmFwcGVuZChjYm5hbWUpCi0gICAgICAgIHNlbGYuX3RrLmNhbGwoInRyYWNlIiwgInZhcmlhYmxlIiwgc2VsZi5fbmFtZSwgbW9kZSwgY2JuYW1lKQogICAgICAgICByZXR1cm4gY2JuYW1lCi0gICAgdHJhY2UgPSB0cmFjZV92YXJpYWJsZQotICAgIGRlZiB0cmFjZV92ZGVsZXRlKHNlbGYsIG1vZGUsIGNibmFtZSk6CisKKyAgICBkZWYgdHJhY2VfYWRkKHNlbGYsIG1vZGUsIGNhbGxiYWNrKToKKyAgICAgICAgIiIiRGVmaW5lIGEgdHJhY2UgY2FsbGJhY2sgZm9yIHRoZSB2YXJpYWJsZS4KKworICAgICAgICBNb2RlIGlzIG9uZSBvZiAicmVhZCIsICJ3cml0ZSIsICJ1bnNldCIsIG9yIGEgbGlzdCBvciB0dXBsZSBvZgorICAgICAgICBzdWNoIHN0cmluZ3MuCisgICAgICAgIENhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFyaWFibGUgaXMKKyAgICAgICAgcmVhZCwgd3JpdHRlbiBvciB1bnNldC4KKworICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrLgorICAgICAgICAiIiIKKyAgICAgICAgY2JuYW1lID0gc2VsZi5fcmVnaXN0ZXIoY2FsbGJhY2spCisgICAgICAgIHNlbGYuX3RrLmNhbGwoJ3RyYWNlJywgJ2FkZCcsICd2YXJpYWJsZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbmFtZSwgbW9kZSwgKGNibmFtZSwpKQorICAgICAgICByZXR1cm4gY2JuYW1lCisKKyAgICBkZWYgdHJhY2VfcmVtb3ZlKHNlbGYsIG1vZGUsIGNibmFtZSk6CiAgICAgICAgICIiIkRlbGV0ZSB0aGUgdHJhY2UgY2FsbGJhY2sgZm9yIGEgdmFyaWFibGUuCiAKLSAgICAgICAgTU9ERSBpcyBvbmUgb2YgInIiLCAidyIsICJ1IiBmb3IgcmVhZCwgd3JpdGUsIHVuZGVmaW5lLgotICAgICAgICBDQk5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrIHJldHVybmVkIGZyb20gdHJhY2VfdmFyaWFibGUgb3IgdHJhY2UuCisgICAgICAgIE1vZGUgaXMgb25lIG9mICJyZWFkIiwgIndyaXRlIiwgInVuc2V0IiBvciBhIGxpc3Qgb3IgdHVwbGUgb2YKKyAgICAgICAgc3VjaCBzdHJpbmdzLiAgTXVzdCBiZSBzYW1lIGFzIHdlcmUgc3BlY2lmaWVkIGluIHRyYWNlX2FkZCgpLgorICAgICAgICBjYm5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrIHJldHVybmVkIGZyb20gdHJhY2VfYWRkKCkuCiAgICAgICAgICIiIgotICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2ZGVsZXRlIiwgc2VsZi5fbmFtZSwgbW9kZSwgY2JuYW1lKQotICAgICAgICBjYm5hbWUgPSBzZWxmLl90ay5zcGxpdGxpc3QoY2JuYW1lKVswXQotICAgICAgICBmb3IgbSwgY2EgaW4gc2VsZi50cmFjZV92aW5mbygpOgorICAgICAgICBzZWxmLl90ay5jYWxsKCd0cmFjZScsICdyZW1vdmUnLCAndmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX25hbWUsIG1vZGUsIGNibmFtZSkKKyAgICAgICAgZm9yIG0sIGNhIGluIHNlbGYudHJhY2VfaW5mbygpOgogICAgICAgICAgICAgaWYgc2VsZi5fdGsuc3BsaXRsaXN0KGNhKVswXSA9PSBjYm5hbWU6CiAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgZWxzZToKQEAgLTMwNSwxMCArMzk0LDY0IEBACiAgICAgICAgICAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMucmVtb3ZlKGNibmFtZSkKICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgIHBhc3MKLSAgICBkZWYgdHJhY2VfdmluZm8oc2VsZik6CisKKyAgICBkZWYgdHJhY2VfaW5mbyhzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIGFsbCB0cmFjZSBjYWxsYmFjayBpbmZvcm1hdGlvbi4iIiIKKyAgICAgICAgc3BsaXRsaXN0ID0gc2VsZi5fdGsuc3BsaXRsaXN0CisgICAgICAgIHJldHVybiBbKHNwbGl0bGlzdChrKSwgdikgZm9yIGssIHYgaW4gbWFwKHNwbGl0bGlzdCwKKyAgICAgICAgICAgIHNwbGl0bGlzdChzZWxmLl90ay5jYWxsKCd0cmFjZScsICdpbmZvJywgJ3ZhcmlhYmxlJywgc2VsZi5fbmFtZSkpKV0KKworICAgIGRlZiB0cmFjZV92YXJpYWJsZShzZWxmLCBtb2RlLCBjYWxsYmFjayk6CisgICAgICAgICIiIkRlZmluZSBhIHRyYWNlIGNhbGxiYWNrIGZvciB0aGUgdmFyaWFibGUuCisKKyAgICAgICAgTU9ERSBpcyBvbmUgb2YgInIiLCAidyIsICJ1IiBmb3IgcmVhZCwgd3JpdGUsIHVuZGVmaW5lLgorICAgICAgICBDQUxMQkFDSyBtdXN0IGJlIGEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4KKyAgICAgICAgdGhlIHZhcmlhYmxlIGlzIHJlYWQsIHdyaXR0ZW4gb3IgdW5kZWZpbmVkLgorCisgICAgICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2FsbGJhY2suCisKKyAgICAgICAgVGhpcyBkZXByZWNhdGVkIG1ldGhvZCB3cmFwcyBhIGRlcHJlY2F0ZWQgVGNsIG1ldGhvZCB0aGF0IHdpbGwKKyAgICAgICAgbGlrZWx5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIFVzZSB0cmFjZV9hZGQoKSBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBUT0RPOiBBZGQgZGVwcmVjYXRpb24gd2FybmluZworICAgICAgICBjYm5hbWUgPSBzZWxmLl9yZWdpc3RlcihjYWxsYmFjaykKKyAgICAgICAgc2VsZi5fdGsuY2FsbCgidHJhY2UiLCAidmFyaWFibGUiLCBzZWxmLl9uYW1lLCBtb2RlLCBjYm5hbWUpCisgICAgICAgIHJldHVybiBjYm5hbWUKKworICAgIHRyYWNlID0gdHJhY2VfdmFyaWFibGUKKworICAgIGRlZiB0cmFjZV92ZGVsZXRlKHNlbGYsIG1vZGUsIGNibmFtZSk6CisgICAgICAgICIiIkRlbGV0ZSB0aGUgdHJhY2UgY2FsbGJhY2sgZm9yIGEgdmFyaWFibGUuCisKKyAgICAgICAgTU9ERSBpcyBvbmUgb2YgInIiLCAidyIsICJ1IiBmb3IgcmVhZCwgd3JpdGUsIHVuZGVmaW5lLgorICAgICAgICBDQk5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrIHJldHVybmVkIGZyb20gdHJhY2VfdmFyaWFibGUgb3IgdHJhY2UuCisKKyAgICAgICAgVGhpcyBkZXByZWNhdGVkIG1ldGhvZCB3cmFwcyBhIGRlcHJlY2F0ZWQgVGNsIG1ldGhvZCB0aGF0IHdpbGwKKyAgICAgICAgbGlrZWx5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIFVzZSB0cmFjZV9yZW1vdmUoKSBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBUT0RPOiBBZGQgZGVwcmVjYXRpb24gd2FybmluZworICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2ZGVsZXRlIiwgc2VsZi5fbmFtZSwgbW9kZSwgY2JuYW1lKQorICAgICAgICBjYm5hbWUgPSBzZWxmLl90ay5zcGxpdGxpc3QoY2JuYW1lKVswXQorICAgICAgICBmb3IgbSwgY2EgaW4gc2VsZi50cmFjZV9pbmZvKCk6CisgICAgICAgICAgICBpZiBzZWxmLl90ay5zcGxpdGxpc3QoY2EpWzBdID09IGNibmFtZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fdGsuZGVsZXRlY29tbWFuZChjYm5hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMucmVtb3ZlKGNibmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0cmFjZV92aW5mbyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFsbCB0cmFjZSBjYWxsYmFjayBpbmZvcm1hdGlvbi4KKworICAgICAgICBUaGlzIGRlcHJlY2F0ZWQgbWV0aG9kIHdyYXBzIGEgZGVwcmVjYXRlZCBUY2wgbWV0aG9kIHRoYXQgd2lsbAorICAgICAgICBsaWtlbHkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiAgVXNlIHRyYWNlX2luZm8oKSBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBUT0RPOiBBZGQgZGVwcmVjYXRpb24gd2FybmluZwogICAgICAgICByZXR1cm4gW3NlbGYuX3RrLnNwbGl0bGlzdCh4KSBmb3IgeCBpbiBzZWxmLl90ay5zcGxpdGxpc3QoCiAgICAgICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2aW5mbyIsIHNlbGYuX25hbWUpKV0KKwogICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAiIiJDb21wYXJpc29uIGZvciBlcXVhbGl0eSAoPT0pLgogCkBAIC00MjYsNiArNTY5LDkgQEAKIAogICAgIEJhc2UgY2xhc3Mgd2hpY2ggZGVmaW5lcyBtZXRob2RzIGNvbW1vbiBmb3IgaW50ZXJpb3Igd2lkZ2V0cy4iIiIKIAorICAgICMgdXNlZCBmb3IgZ2VuZXJhdGluZyBjaGlsZCB3aWRnZXQgbmFtZXMKKyAgICBfbGFzdF9jaGlsZF9pZHMgPSBOb25lCisKICAgICAjIFhYWCBmb250IGNvbW1hbmQ/CiAgICAgX3RjbENvbW1hbmRzID0gTm9uZQogICAgIGRlZiBkZXN0cm95KHNlbGYpOgpAQCAtNDczLDEyICs2MTksNiBAQAogICAgICAgICBkaXNhYmxlZEZvcmVncm91bmQsIGluc2VydEJhY2tncm91bmQsIHRyb3VnaENvbG9yLiIiIgogICAgICAgICBzZWxmLnRrLmNhbGwoKCd0a19zZXRQYWxldHRlJywpCiAgICAgICAgICAgICAgICsgX2ZsYXR0ZW4oYXJncykgKyBfZmxhdHRlbihsaXN0KGt3Lml0ZW1zKCkpKSkKLSAgICBkZWYgdGtfbWVudUJhcihzZWxmLCAqYXJncyk6Ci0gICAgICAgICIiIkRvIG5vdCB1c2UuIE5lZWRlZCBpbiBUayAzLjYgYW5kIGVhcmxpZXIuIiIiCi0gICAgICAgICMgb2Jzb2xldGUgc2luY2UgVGsgNC4wCi0gICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICB3YXJuaW5ncy53YXJuKCd0a19tZW51QmFyKCkgZG9lcyBub3RoaW5nIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMy42JywKLSAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICBkZWYgd2FpdF92YXJpYWJsZShzZWxmLCBuYW1lPSdQWV9WQVInKToKICAgICAgICAgIiIiV2FpdCB1bnRpbCB0aGUgdmFyaWFibGUgaXMgbW9kaWZpZWQuCiAKQEAgLTg1MCw4ICs5OTAsNyBAQAogICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdoZWlnaHQnLCBzZWxmLl93KSkKICAgICBkZWYgd2luZm9faWQoc2VsZik6CiAgICAgICAgICIiIlJldHVybiBpZGVudGlmaWVyIElEIGZvciB0aGlzIHdpZGdldC4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0aW50KAotICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdpZCcsIHNlbGYuX3cpKQorICAgICAgICByZXR1cm4gaW50KHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaWQnLCBzZWxmLl93KSwgMCkKICAgICBkZWYgd2luZm9faW50ZXJwcyhzZWxmLCBkaXNwbGF5b2Y9MCk6CiAgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSBvZiBhbGwgVGNsIGludGVycHJldGVycyBmb3IgdGhpcyBkaXNwbGF5LiIiIgogICAgICAgICBhcmdzID0gKCd3aW5mbycsICdpbnRlcnBzJykgKyBzZWxmLl9kaXNwbGF5b2YoZGlzcGxheW9mKQpAQCAtOTcxLDE4ICsxMTEwLDE2IEBACiAgICAgZGVmIHdpbmZvX3Zpc3VhbGlkKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIFggaWRlbnRpZmllciBmb3IgdGhlIHZpc3VhbCBmb3IgdGhpcyB3aWRnZXQuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3Zpc3VhbGlkJywgc2VsZi5fdykKLSAgICBkZWYgd2luZm9fdmlzdWFsc2F2YWlsYWJsZShzZWxmLCBpbmNsdWRlaWRzPTApOgorICAgIGRlZiB3aW5mb192aXN1YWxzYXZhaWxhYmxlKHNlbGYsIGluY2x1ZGVpZHM9RmFsc2UpOgogICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCB2aXN1YWxzIGF2YWlsYWJsZSBmb3IgdGhlIHNjcmVlbgogICAgICAgICBvZiB0aGlzIHdpZGdldC4KIAogICAgICAgICBFYWNoIGl0ZW0gaW4gdGhlIGxpc3QgY29uc2lzdHMgb2YgYSB2aXN1YWwgbmFtZSAoc2VlIHdpbmZvX3Zpc3VhbCksIGEKLSAgICAgICAgZGVwdGggYW5kIGlmIElOQ0xVREVJRFM9MSBpcyBnaXZlbiBhbHNvIHRoZSBYIGlkZW50aWZpZXIuIiIiCi0gICAgICAgIGRhdGEgPSBzZWxmLnRrLnNwbGl0KAotICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICd2aXN1YWxzYXZhaWxhYmxlJywgc2VsZi5fdywKLSAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVpZHMgYW5kICdpbmNsdWRlaWRzJyBvciBOb25lKSkKLSAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBzdHIpOgotICAgICAgICAgICAgZGF0YSA9IFtzZWxmLnRrLnNwbGl0KGRhdGEpXQotICAgICAgICByZXR1cm4gW3NlbGYuX193aW5mb19wYXJzZWl0ZW0oeCkgZm9yIHggaW4gIGRhdGFdCisgICAgICAgIGRlcHRoIGFuZCBpZiBpbmNsdWRlaWRzIGlzIHRydWUgaXMgZ2l2ZW4gYWxzbyB0aGUgWCBpZGVudGlmaWVyLiIiIgorICAgICAgICBkYXRhID0gc2VsZi50ay5jYWxsKCd3aW5mbycsICd2aXN1YWxzYXZhaWxhYmxlJywgc2VsZi5fdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZWlkcycgaWYgaW5jbHVkZWlkcyBlbHNlIE5vbmUpCisgICAgICAgIGRhdGEgPSBbc2VsZi50ay5zcGxpdGxpc3QoeCkgZm9yIHggaW4gc2VsZi50ay5zcGxpdGxpc3QoZGF0YSldCisgICAgICAgIHJldHVybiBbc2VsZi5fX3dpbmZvX3BhcnNlaXRlbSh4KSBmb3IgeCBpbiBkYXRhXQogICAgIGRlZiBfX3dpbmZvX3BhcnNlaXRlbShzZWxmLCB0KToKICAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCiAgICAgICAgIHJldHVybiB0WzoxXSArIHR1cGxlKG1hcChzZWxmLl9fd2luZm9fZ2V0aW50LCB0WzE6XSkpCkBAIC0xMjgzLDcgKzE0MjAsMTAgQEAKICAgICAgICAgZXhjZXB0IFRjbEVycm9yOiBwYXNzCiAgICAgICAgIGUua2V5c3ltID0gSwogICAgICAgICBlLmtleXN5bV9udW0gPSBnZXRpbnRfZXZlbnQoTikKLSAgICAgICAgZS50eXBlID0gVAorICAgICAgICB0cnk6CisgICAgICAgICAgICBlLnR5cGUgPSBFdmVudFR5cGUoVCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBlLnR5cGUgPSBUCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGUud2lkZ2V0ID0gc2VsZi5fbmFtZXRvd2lkZ2V0KFcpCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKQEAgLTE4OTMsOSArMjAzMyw2IEBACiAgICAgICAgIGlmIHRjbF92ZXJzaW9uICE9IF90a2ludGVyLlRDTF9WRVJTSU9OOgogICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ0Y2wuaCB2ZXJzaW9uICglcykgZG9lc24ndCBtYXRjaCBsaWJ0Y2wuYSB2ZXJzaW9uICglcykiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChfdGtpbnRlci5UQ0xfVkVSU0lPTiwgdGNsX3ZlcnNpb24pKQotICAgICAgICBpZiBUa1ZlcnNpb24gPCA0LjA6Ci0gICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlRrIDQuMCBvciBoaWdoZXIgaXMgcmVxdWlyZWQ7IGZvdW5kIFRrICVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc3RyKFRrVmVyc2lvbikpCiAgICAgICAgICMgQ3JlYXRlIGFuZCByZWdpc3RlciB0aGUgdGtlcnJvciBhbmQgZXhpdCBjb21tYW5kcwogICAgICAgICAjIFdlIG5lZWQgdG8gaW5saW5lIHBhcnRzIG9mIF9yZWdpc3RlciBoZXJlLCBfIHJlZ2lzdGVyCiAgICAgICAgICMgd291bGQgcmVnaXN0ZXIgZGlmZmVyZW50bHktbmFtZWQgY29tbWFuZHMuCkBAIC0yMTE4LDcgKzIyNTUsMTUgQEAKICAgICAgICAgICAgIG5hbWUgPSBjbmZbJ25hbWUnXQogICAgICAgICAgICAgZGVsIGNuZlsnbmFtZSddCiAgICAgICAgIGlmIG5vdCBuYW1lOgotICAgICAgICAgICAgbmFtZSA9IHJlcHIoaWQoc2VsZikpCisgICAgICAgICAgICBuYW1lID0gc2VsZi5fX2NsYXNzX18uX19uYW1lX18ubG93ZXIoKQorICAgICAgICAgICAgaWYgbWFzdGVyLl9sYXN0X2NoaWxkX2lkcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIG1hc3Rlci5fbGFzdF9jaGlsZF9pZHMgPSB7fQorICAgICAgICAgICAgY291bnQgPSBtYXN0ZXIuX2xhc3RfY2hpbGRfaWRzLmdldChuYW1lLCAwKSArIDEKKyAgICAgICAgICAgIG1hc3Rlci5fbGFzdF9jaGlsZF9pZHNbbmFtZV0gPSBjb3VudAorICAgICAgICAgICAgaWYgY291bnQgPT0gMToKKyAgICAgICAgICAgICAgICBuYW1lID0gJ2AlcycgJSAobmFtZSwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWUgPSAnYCVzJWQnICUgKG5hbWUsIGNvdW50KQogICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQogICAgICAgICBpZiBtYXN0ZXIuX3c9PScuJzoKICAgICAgICAgICAgIHNlbGYuX3cgPSAnLicgKyBuYW1lCkBAIC0yNzE0LDEyICsyODU5LDYgQEAKICAgICBkZWYgdGtfcG9wdXAoc2VsZiwgeCwgeSwgZW50cnk9IiIpOgogICAgICAgICAiIiJQb3N0IHRoZSBtZW51IGF0IHBvc2l0aW9uIFgsWSB3aXRoIGVudHJ5IEVOVFJZLiIiIgogICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX3BvcHVwJywgc2VsZi5fdywgeCwgeSwgZW50cnkpCi0gICAgZGVmIHRrX2JpbmRGb3JUcmF2ZXJzYWwoc2VsZik6Ci0gICAgICAgICMgb2Jzb2xldGUgc2luY2UgVGsgNC4wCi0gICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICB3YXJuaW5ncy53YXJuKCd0a19iaW5kRm9yVHJhdmVyc2FsKCkgZG9lcyBub3RoaW5nIGFuZCAnCi0gICAgICAgICAgICAgICAgICAgICAgJ3dpbGwgYmUgcmVtb3ZlZCBpbiAzLjYnLAotICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBpbmRleCk6CiAgICAgICAgICIiIkFjdGl2YXRlIGVudHJ5IGF0IElOREVYLiIiIgogICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FjdGl2YXRlJywgaW5kZXgpCkBAIC0zMzQyLDkgKzM0ODEsNiBAQAogICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgIEltYWdlLl9sYXN0X2lkICs9IDEKICAgICAgICAgICAgIG5hbWUgPSAicHlpbWFnZSVyIiAlIChJbWFnZS5fbGFzdF9pZCwpICMgdGsgaXRzZWxmIHdvdWxkIHVzZSBpbWFnZTx4PgotICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIGlzIG5lZWRlZCBmb3Igc3lzdGVtcyB3aGVyZSBpZCh4KQotICAgICAgICAgICAgIyBjYW4gcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyLCBzdWNoIGFzIExpbnV4L202OGs6Ci0gICAgICAgICAgICBpZiBuYW1lWzBdID09ICctJzogbmFtZSA9ICdfJyArIG5hbWVbMTpdCiAgICAgICAgIGlmIGt3IGFuZCBjbmY6IGNuZiA9IF9jbmZtZXJnZSgoY25mLCBrdykpCiAgICAgICAgIGVsaWYga3c6IGNuZiA9IGt3CiAgICAgICAgIG9wdGlvbnMgPSAoKQpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvY29tbW9uZGlhbG9nLnB5IGIvTGliL3RraW50ZXIvY29tbW9uZGlhbG9nLnB5CmluZGV4IGQyNjg4ZGIuLjFlNzVjYWUgMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL2NvbW1vbmRpYWxvZy5weQorKysgYi9MaWIvdGtpbnRlci9jb21tb25kaWFsb2cucHkKQEAgLTE1LDExICsxNSw2IEBACiAgICAgY29tbWFuZCAgPSBOb25lCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqb3B0aW9ucyk6Ci0KLSAgICAgICAgIyBGSVhNRTogc2hvdWxkIHRoaXMgYmUgcGxhY2VkIG9uIHRoZSBtb2R1bGUgbGV2ZWwgaW5zdGVhZD8KLSAgICAgICAgaWYgVGtWZXJzaW9uIDwgNC4yOgotICAgICAgICAgICAgcmFpc2UgVGNsRXJyb3IoInRoaXMgbW9kdWxlIHJlcXVpcmVzIFRrIDQuMiBvciBuZXdlciIpCi0KICAgICAgICAgc2VsZi5tYXN0ZXIgID0gbWFzdGVyCiAgICAgICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMKICAgICAgICAgaWYgbm90IG1hc3RlciBhbmQgb3B0aW9ucy5nZXQoJ3BhcmVudCcpOgpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvZGlhbG9nLnB5IGIvTGliL3RraW50ZXIvZGlhbG9nLnB5CmluZGV4IGJlMDg1YWIuLmY2MWM1ZjcgMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL2RpYWxvZy5weQorKysgYi9MaWIvdGtpbnRlci9kaWFsb2cucHkKQEAgLTMsMTAgKzMsNyBAQAogZnJvbSB0a2ludGVyIGltcG9ydCAqCiBmcm9tIHRraW50ZXIgaW1wb3J0IF9jbmZtZXJnZQogCi1pZiBUa1ZlcnNpb24gPD0gMy42OgotICAgIERJQUxPR19JQ09OID0gJ3dhcm5pbmcnCi1lbHNlOgotICAgIERJQUxPR19JQ09OID0gJ3F1ZXN0aGVhZCcKK0RJQUxPR19JQ09OID0gJ3F1ZXN0aGVhZCcKIAogCiBjbGFzcyBEaWFsb2coV2lkZ2V0KToKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3Rlc3QvcnVudGt0ZXN0cy5weSBiL0xpYi90a2ludGVyL3Rlc3QvcnVudGt0ZXN0cy5weQppbmRleCBkYmU1ZTg4Li4zM2RjNTRhIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90ZXN0L3J1bnRrdGVzdHMucHkKKysrIGIvTGliL3RraW50ZXIvdGVzdC9ydW50a3Rlc3RzLnB5CkBAIC03LDggKzcsNiBAQAogIiIiCiAKIGltcG9ydCBvcwotaW1wb3J0IHN5cwotaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgaW1wb3J0bGliCiBpbXBvcnQgdGVzdC5zdXBwb3J0CiAKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfbWlzYy5weSBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfbWlzYy5weQppbmRleCA4NWVlMmM3Li45ZGMxZTM3IDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X21pc2MucHkKKysrIGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9taXNjLnB5CkBAIC0xMiw2ICsxMiwxNCBAQAogICAgICAgICBmID0gdGtpbnRlci5GcmFtZSh0LCBuYW1lPSdjaGlsZCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmKSwgJzx0a2ludGVyLkZyYW1lIG9iamVjdCAudG9wLmNoaWxkPicpCiAKKyAgICBkZWYgdGVzdF9nZW5lcmF0ZWRfbmFtZXMoc2VsZik6CisgICAgICAgIHQgPSB0a2ludGVyLlRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgZiA9IHRraW50ZXIuRnJhbWUodCkKKyAgICAgICAgZjIgPSB0a2ludGVyLkZyYW1lKHQpCisgICAgICAgIGIgPSB0a2ludGVyLkJ1dHRvbihmMikKKyAgICAgICAgZm9yIG5hbWUgaW4gc3RyKGIpLnNwbGl0KCcuJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG5hbWUuaXNpZGVudGlmaWVyKCksIG1zZz1yZXByKG5hbWUpKQorCiAgICAgZGVmIHRlc3RfdGtfc2V0UGFsZXR0ZShzZWxmKToKICAgICAgICAgcm9vdCA9IHNlbGYucm9vdAogICAgICAgICByb290LnRrX3NldFBhbGV0dGUoJ2JsYWNrJykKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdmFyaWFibGVzLnB5IGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF92YXJpYWJsZXMucHkKaW5kZXggMWY3NDQ1My4uNDQ4NTgxNyAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF92YXJpYWJsZXMucHkKKysrIGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF92YXJpYWJsZXMucHkKQEAgLTg3LDcgKzg3LDggQEAKICAgICAgICAgdi5zZXQoInZhbHVlIikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYuc2lkZV9lZmZlY3QpCiAKLSAgICBkZWYgdGVzdF90cmFjZShzZWxmKToKKyAgICBkZWYgdGVzdF90cmFjZV9vbGQoc2VsZik6CisgICAgICAgICMgT2xkIGludGVyZmFjZQogICAgICAgICB2ID0gVmFyaWFibGUoc2VsZi5yb290KQogICAgICAgICB2bmFtZSA9IHN0cih2KQogICAgICAgICB0cmFjZSA9IFtdCkBAIC0xMzYsNiArMTM3LDU1IEBACiAgICAgICAgIGdjLmNvbGxlY3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbKCd3cml0ZScsIHZuYW1lLCAnJywgJ3UnKV0pCiAKKyAgICBkZWYgdGVzdF90cmFjZShzZWxmKToKKyAgICAgICAgdiA9IFZhcmlhYmxlKHNlbGYucm9vdCkKKyAgICAgICAgdm5hbWUgPSBzdHIodikKKyAgICAgICAgdHJhY2UgPSBbXQorICAgICAgICBkZWYgcmVhZF90cmFjZXIoKmFyZ3MpOgorICAgICAgICAgICAgdHJhY2UuYXBwZW5kKCgncmVhZCcsKSArIGFyZ3MpCisgICAgICAgIGRlZiB3cml0ZV90cmFjZXIoKmFyZ3MpOgorICAgICAgICAgICAgdHJhY2UuYXBwZW5kKCgnd3JpdGUnLCkgKyBhcmdzKQorICAgICAgICB0cjEgPSB2LnRyYWNlX2FkZCgncmVhZCcsIHJlYWRfdHJhY2VyKQorICAgICAgICB0cjIgPSB2LnRyYWNlX2FkZChbJ3dyaXRlJywgJ3Vuc2V0J10sIHdyaXRlX3RyYWNlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQodi50cmFjZV9pbmZvKCkpLCBbCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgncmVhZCcsKSwgdHIxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCd3cml0ZScsICd1bnNldCcpLCB0cjIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgW10pCisKKyAgICAgICAgdi5zZXQoJ3NwYW0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbKCd3cml0ZScsIHZuYW1lLCAnJywgJ3dyaXRlJyldKQorCisgICAgICAgIHRyYWNlID0gW10KKyAgICAgICAgdi5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbKCdyZWFkJywgdm5hbWUsICcnLCAncmVhZCcpXSkKKworICAgICAgICB0cmFjZSA9IFtdCisgICAgICAgIGluZm8gPSBzb3J0ZWQodi50cmFjZV9pbmZvKCkpCisgICAgICAgIHYudHJhY2VfcmVtb3ZlKCd3cml0ZScsIHRyMSkgICMgV3JvbmcgbW9kZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZCh2LnRyYWNlX2luZm8oKSksIGluZm8pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IpOgorICAgICAgICAgICAgdi50cmFjZV9yZW1vdmUoJ3JlYWQnLCAnc3BhbScpICAjIFdyb25nIGNvbW1hbmQgbmFtZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZCh2LnRyYWNlX2luZm8oKSksIGluZm8pCisgICAgICAgIHYuZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgWygncmVhZCcsIHZuYW1lLCAnJywgJ3JlYWQnKV0pCisKKyAgICAgICAgdHJhY2UgPSBbXQorICAgICAgICB2LnRyYWNlX3JlbW92ZSgncmVhZCcsIHRyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnRyYWNlX2luZm8oKSwgWygoJ3dyaXRlJywgJ3Vuc2V0JyksIHRyMildKQorICAgICAgICB2LmdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2UsIFtdKQorCisgICAgICAgIHRyYWNlID0gW10KKyAgICAgICAgZGVsIHdyaXRlX3RyYWNlcgorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgdi5zZXQoJ2VnZ3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbKCd3cml0ZScsIHZuYW1lLCAnJywgJ3dyaXRlJyldKQorCisgICAgICAgIHRyYWNlID0gW10KKyAgICAgICAgZGVsIHYKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2UsIFsoJ3dyaXRlJywgdm5hbWUsICcnLCAndW5zZXQnKV0pCisKIAogY2xhc3MgVGVzdFN0cmluZ1ZhcihUZXN0QmFzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3Rfd2lkZ2V0cy5weSBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3Rfd2lkZ2V0cy5weQppbmRleCBjOTI0ZDU1Li44MWI1MmVhIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3dpZGdldHMucHkKKysrIGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF93aWRnZXRzLnB5CkBAIC05MSw5ICs5MSwxMCBAQAogICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0Wyd1c2UnXSwgJycpCiAgICAgICAgIHBhcmVudCA9IHNlbGYuY3JlYXRlKGNvbnRhaW5lcj1UcnVlKQotICAgICAgICB3aWQgPSBwYXJlbnQud2luZm9faWQoKQotICAgICAgICB3aWRnZXQyID0gc2VsZi5jcmVhdGUodXNlPXdpZCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQod2lkZ2V0MlsndXNlJ10pLCB3aWQpCisgICAgICAgIHdpZCA9IGhleChwYXJlbnQud2luZm9faWQoKSkKKyAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qod2lkPXdpZCk6CisgICAgICAgICAgICB3aWRnZXQyID0gc2VsZi5jcmVhdGUodXNlPXdpZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0MlsndXNlJ10sIHdpZCkKIAogCiBAYWRkX3N0YW5kYXJkX29wdGlvbnMoU3RhbmRhcmRPcHRpb25zVGVzdHMpCmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5IGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weQppbmRleCBjNjhhNjUwLi5hMWI3Y2RmIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHkKQEAgLTEsNiArMSw1IEBACiAjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB0a2ludGVyCiBmcm9tIHRraW50ZXIgaW1wb3J0IHR0awogCiBjbGFzcyBNb2NrVGtBcHA6CmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weSBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5CmluZGV4IDhiZDIyZDAuLjI2NzY2YTggMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5CkBAIC0xNDg3LDYgKzE0ODcsNyBAQAogCiAKICAgICBkZWYgdGVzdF9zZWxlY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50di5zZWxlY3Rpb24sICdzcGFtJykKICAgICAgICAgIyBpdGVtICdub25lJyBkb2Vzbid0IGV4aXN0CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2VsZWN0aW9uX3NldCwgJ25vbmUnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0a2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LnNlbGVjdGlvbl9hZGQsICdub25lJykKQEAgLTE1MDAsMjUgKzE1MDEsMzEgQEAKICAgICAgICAgYzMgPSBzZWxmLnR2Lmluc2VydChpdGVtMSwgJ2VuZCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKCkpCiAKLSAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoYzEsIGl0ZW0yKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQogICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoYzIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMyLCkpCiAKLSAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fYWRkKChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9hZGQoYzEsIGl0ZW0yKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgYzIsIGl0ZW0yKSkKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fYWRkKGl0ZW0xKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChpdGVtMSwgYzEsIGMyLCBpdGVtMikpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX2FkZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGl0ZW0xLCBjMSwgYzIsIGl0ZW0yKSkKIAotICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9yZW1vdmUoKGl0ZW0xLCBjMykpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3JlbW92ZShpdGVtMSwgYzMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMxLCBjMiwgaXRlbTIpKQogICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9yZW1vdmUoYzIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMxLCBpdGVtMikpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3JlbW92ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMxLCBpdGVtMikpCiAKLSAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fdG9nZ2xlKChjMSwgYzMpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl90b2dnbGUoYzEsIGMzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMywgaXRlbTIpKQogICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl90b2dnbGUoaXRlbTIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMzLCkpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3RvZ2dsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMzLCkpCiAKICAgICAgICAgc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCBpZD0nd2l0aCBzcGFjZXMnKQogICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoJ3dpdGggc3BhY2VzJykKQEAgLTE1MzYsNiArMTU0Myw0MCBAQAogICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoYidieXRlc1x4ZTJceDgyXHhhYycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKCdieXRlc1x4ZTJceDgyXHhhYycsKSkKIAorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksICgpKQorCisgICAgICAgICMgT2xkIGludGVyZmFjZQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoKGMxLCBpdGVtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMxLCBpdGVtMikpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX2FkZCgoYzEsIGl0ZW0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoaXRlbTEsIGMxLCBpdGVtMikpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3JlbW92ZSgoaXRlbTEsIGMzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzEsIGl0ZW0yKSkKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fdG9nZ2xlKChjMSwgYzMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMywgaXRlbTIpKQorCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsIDcpOgorICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICdEZXByZWNhdGVkIEFQSSBvZiBUcmVldmlldy5zZWxlY3Rpb24oKSBzaG91bGQgYmUgcmVtb3ZlZCcpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3NldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKCkpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi50di5zZWxlY3Rpb24oJ3NldCcsIChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uKCdhZGQnLCAoYzEsIGl0ZW0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoaXRlbTEsIGMxLCBpdGVtMikpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi50di5zZWxlY3Rpb24oJ3JlbW92ZScsIChpdGVtMSwgYzMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uKCd0b2dnbGUnLCAoYzEsIGMzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzMsIGl0ZW0yKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLnR2LnNlbGVjdGlvbihOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGVjdGlvbiwgKGMzLCBpdGVtMikpCiAKICAgICBkZWYgdGVzdF9zZXQoc2VsZik6CiAgICAgICAgIHNlbGYudHZbJ2NvbHVtbnMnXSA9IFsnQScsICdCJ10KZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3RpeC5weSBiL0xpYi90a2ludGVyL3RpeC5weQppbmRleCA4OTExM2ZkLi4wNDQ2NWFhIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90aXgucHkKKysrIGIvTGliL3RraW50ZXIvdGl4LnB5CkBAIC0zMSwxMCArMzEsNiBAQAogZnJvbSB0a2ludGVyIGltcG9ydCAqCiBmcm9tIHRraW50ZXIgaW1wb3J0IF9jbmZtZXJnZQogCi0jIFdBUk5JTkcgLSBUa1ZlcnNpb24gaXMgYSBsaW1pdGVkIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXIKLWlmIFRrVmVyc2lvbiA8IDMuOTk5OgotICAgIHJhaXNlIEltcG9ydEVycm9yKCJUaGlzIHZlcnNpb24gb2YgVGl4LnB5IHJlcXVpcmVzIFRrIDQuMCBvciBoaWdoZXIiKQotCiBpbXBvcnQgX3RraW50ZXIgIyBJZiB0aGlzIGZhaWxzIHlvdXIgUHl0aG9uIG1heSBub3QgYmUgY29uZmlndXJlZCBmb3IgVGsKIAogIyBTb21lIG1vcmUgY29uc3RhbnRzIChmb3IgY29uc2lzdGVuY3kgd2l0aCBUa2ludGVyKQpAQCAtMTExMSw3ICsxMTA3LDcgQEAKIAogICAgIGRlZiBwYWdlcyhzZWxmKToKICAgICAgICAgIyBDYW4ndCBjYWxsIHN1YndpZGdldHNfYWxsIGRpcmVjdGx5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCAubmJmcmFtZQotICAgICAgICBuYW1lcyA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYWdlcycpKQorICAgICAgICBuYW1lcyA9IHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFnZXMnKSkKICAgICAgICAgcmV0ID0gW10KICAgICAgICAgZm9yIHggaW4gbmFtZXM6CiAgICAgICAgICAgICByZXQuYXBwZW5kKHNlbGYuc3Vid2lkZ2V0KHgpKQpAQCAtMTE1Nyw3ICsxMTUzLDcgQEAKIAogICAgIGRlZiBwYWdlcyhzZWxmKToKICAgICAgICAgIyBDYW4ndCBjYWxsIHN1YndpZGdldHNfYWxsIGRpcmVjdGx5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCAubmJmcmFtZQotICAgICAgICBuYW1lcyA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYWdlcycpKQorICAgICAgICBuYW1lcyA9IHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFnZXMnKSkKICAgICAgICAgcmV0ID0gW10KICAgICAgICAgZm9yIHggaW4gbmFtZXM6CiAgICAgICAgICAgICByZXQuYXBwZW5kKHNlbGYuc3Vid2lkZ2V0KHgpKQpAQCAtMTU4MCw4ICsxNTc2LDcgQEAKICAgICAgICAgJycnUmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2hvc2Ugc3RhdHVzIG1hdGNoZXMgc3RhdHVzLiBJZiBzdGF0dXMgaXMKICAgICAgbm90IHNwZWNpZmllZCwgdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlICJvbiIgc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQuCiAgICAgIE1vZGUgY2FuIGJlIG9uLCBvZmYsIGRlZmF1bHQnJycKLSAgICAgICAgYyA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXRzZWxlY3Rpb24nLCBtb2RlKSkKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KGMpCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2dldHNlbGVjdGlvbicsIG1vZGUpKQogCiAgICAgZGVmIGdldHN0YXR1cyhzZWxmLCBlbnRyeXBhdGgpOgogICAgICAgICAnJydSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBlbnRyeVBhdGguJycnCkBAIC0xOTAyLDcgKzE4OTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgb3IgYSByZWFsIG51bWJlciBmb2xsb3dpbmcgYnkgdGhlIHdvcmQgY2hhcnMKICAgICAgICAgICAgICAgICAgICAgIChlLmcuIDMuNGNoYXJzKSB0aGF0IHNldHMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4gdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBudW1iZXIgb2YgY2hhcmFjdGVycy4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdzaXplJywgJ2NvbHVtbicsIGluZGV4LAorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX3csICdzaXplJywgJ2NvbHVtbicsIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VsZi5fb3B0aW9ucyh7fSwga3cpKSkKIAogICAgIGRlZiBzaXplX3JvdyhzZWxmLCBpbmRleCwgKiprdyk6CkBAIC0xOTI3LDcgKzE5MjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgb3IgYSByZWFsIG51bWJlciBmb2xsb3dpbmcgYnkgdGhlIHdvcmQgY2hhcnMKICAgICAgICAgICAgICAgICAgICAgIChlLmcuIDMuNGNoYXJzKSB0aGF0IHNldHMgdGhlIGhlaWdodCBvZiB0aGUgcm93IHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbCgKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbCgKICAgICAgICAgICAgICAgICAgICAgc2VsZiwgJ3NpemUnLCAncm93JywgaW5kZXgsICpzZWxmLl9vcHRpb25zKHt9LCBrdykpKQogCiAgICAgZGVmIHVuc2V0KHNlbGYsIHgsIHkpOgpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvdHRrLnB5IGIvTGliL3RraW50ZXIvdHRrLnB5CmluZGV4IGY0YTZkOGMuLmM0NzRlNjAgMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL3R0ay5weQorKysgYi9MaWIvdGtpbnRlci90dGsucHkKQEAgLTI4LDYgKzI4LDggQEAKIGltcG9ydCB0a2ludGVyCiBmcm9tIHRraW50ZXIgaW1wb3J0IF9mbGF0dGVuLCBfam9pbiwgX3N0cmluZ2lmeSwgX3NwbGl0ZGljdAogCitfc2VudGluZWwgPSBvYmplY3QoKQorCiAjIFZlcmlmeSBpZiBUayBpcyBuZXcgZW5vdWdoIHRvIG5vdCBuZWVkIHRoZSBUaWxlIHBhY2thZ2UKIF9SRVFVSVJFX1RJTEUgPSBUcnVlIGlmIHRraW50ZXIuVGtWZXJzaW9uIDwgOC41IGVsc2UgRmFsc2UKIApAQCAtMzgxLDcgKzM4Myw5IEBACiAgICAgICAgIGEgc2VxdWVuY2UgaWRlbnRpZnlpbmcgdGhlIHZhbHVlIGZvciB0aGF0IG9wdGlvbi4iIiIKICAgICAgICAgaWYgcXVlcnlfb3B0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAga3dbcXVlcnlfb3B0XSA9IE5vbmUKLSAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChzZWxmLnRrLCBrdywgc2VsZi5fbmFtZSwgImNvbmZpZ3VyZSIsIHN0eWxlKQorICAgICAgICByZXN1bHQgPSBfdmFsX29yX2RpY3Qoc2VsZi50aywga3csIHNlbGYuX25hbWUsICJjb25maWd1cmUiLCBzdHlsZSkKKyAgICAgICAgaWYgcmVzdWx0IG9yIHF1ZXJ5X29wdDoKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKIAogCiAgICAgZGVmIG1hcChzZWxmLCBzdHlsZSwgcXVlcnlfb3B0PU5vbmUsICoqa3cpOgpAQCAtNDY2LDEyICs0NzAsMTQgQEAKIAogICAgIGRlZiBlbGVtZW50X25hbWVzKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm5zIHRoZSBsaXN0IG9mIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgdGhlbWUuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAibmFtZXMiKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG4ubHN0cmlwKCctJykgZm9yIG4gaW4gc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAibmFtZXMiKSkpCiAKIAogICAgIGRlZiBlbGVtZW50X29wdGlvbnMoc2VsZiwgZWxlbWVudG5hbWUpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGxpc3Qgb2YgZWxlbWVudG5hbWUncyBvcHRpb25zLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm9wdGlvbnMiLCBlbGVtZW50bmFtZSkpCisgICAgICAgIHJldHVybiB0dXBsZShvLmxzdHJpcCgnLScpIGZvciBvIGluIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm9wdGlvbnMiLCBlbGVtZW50bmFtZSkpKQogCiAKICAgICBkZWYgdGhlbWVfY3JlYXRlKHNlbGYsIHRoZW1lbmFtZSwgcGFyZW50PU5vbmUsIHNldHRpbmdzPU5vbmUpOgpAQCAtMTM5MCwzMSArMTM5Niw1MyBAQAogICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInNlZSIsIGl0ZW0pCiAKIAotICAgIGRlZiBzZWxlY3Rpb24oc2VsZiwgc2Vsb3A9Tm9uZSwgaXRlbXM9Tm9uZSk6Ci0gICAgICAgICIiIklmIHNlbG9wIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgc2VsZWN0ZWQgaXRlbXMuIiIiCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbXMsIChzdHIsIGJ5dGVzKSk6Ci0gICAgICAgICAgICBpdGVtcyA9IChpdGVtcywpCisgICAgZGVmIHNlbGVjdGlvbihzZWxmLCBzZWxvcD1fc2VudGluZWwsIGl0ZW1zPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSB0dXBsZSBvZiBzZWxlY3RlZCBpdGVtcy4iIiIKKyAgICAgICAgaWYgc2Vsb3AgaXMgX3NlbnRpbmVsOgorICAgICAgICAgICAgc2Vsb3AgPSBOb25lCisgICAgICAgIGVsaWYgc2Vsb3AgaXMgTm9uZToKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAiVGhlIHNlbG9wPU5vbmUgYXJndW1lbnQgb2Ygc2VsZWN0aW9uKCkgaXMgZGVwcmVjYXRlZCAiCisgICAgICAgICAgICAgICAgImFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuNyIsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAzKQorICAgICAgICBlbGlmIHNlbG9wIGluICgnc2V0JywgJ2FkZCcsICdyZW1vdmUnLCAndG9nZ2xlJyk6CisgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIlRoZSBzZWxvcCBhcmd1bWVudCBvZiBzZWxlY3Rpb24oKSBpcyBkZXByZWNhdGVkICIKKyAgICAgICAgICAgICAgICAiYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBQeXRob24gMy43LCAiCisgICAgICAgICAgICAgICAgInVzZSBzZWxlY3Rpb25fJXMoKSBpbnN0ZWFkIiAlIChzZWxvcCwpLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVW5zdXBwb3J0ZWQgb3BlcmF0aW9uJykKICAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl93LCAic2VsZWN0aW9uIiwgc2Vsb3AsIGl0ZW1zKSkKIAogCi0gICAgZGVmIHNlbGVjdGlvbl9zZXQoc2VsZiwgaXRlbXMpOgotICAgICAgICAiIiJpdGVtcyBiZWNvbWVzIHRoZSBuZXcgc2VsZWN0aW9uLiIiIgotICAgICAgICBzZWxmLnNlbGVjdGlvbigic2V0IiwgaXRlbXMpCisgICAgZGVmIF9zZWxlY3Rpb24oc2VsZiwgc2Vsb3AsIGl0ZW1zKToKKyAgICAgICAgaWYgbGVuKGl0ZW1zKSA9PSAxIGFuZCBpc2luc3RhbmNlKGl0ZW1zWzBdLCAodHVwbGUsIGxpc3QpKToKKyAgICAgICAgICAgIGl0ZW1zID0gaXRlbXNbMF0KKworICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInNlbGVjdGlvbiIsIHNlbG9wLCBpdGVtcykKIAogCi0gICAgZGVmIHNlbGVjdGlvbl9hZGQoc2VsZiwgaXRlbXMpOgotICAgICAgICAiIiJBZGQgaXRlbXMgdG8gdGhlIHNlbGVjdGlvbi4iIiIKLSAgICAgICAgc2VsZi5zZWxlY3Rpb24oImFkZCIsIGl0ZW1zKQorICAgIGRlZiBzZWxlY3Rpb25fc2V0KHNlbGYsICppdGVtcyk6CisgICAgICAgICIiIlRoZSBzcGVjaWZpZWQgaXRlbXMgYmVjb21lcyB0aGUgbmV3IHNlbGVjdGlvbi4iIiIKKyAgICAgICAgc2VsZi5fc2VsZWN0aW9uKCJzZXQiLCBpdGVtcykKIAogCi0gICAgZGVmIHNlbGVjdGlvbl9yZW1vdmUoc2VsZiwgaXRlbXMpOgotICAgICAgICAiIiJSZW1vdmUgaXRlbXMgZnJvbSB0aGUgc2VsZWN0aW9uLiIiIgotICAgICAgICBzZWxmLnNlbGVjdGlvbigicmVtb3ZlIiwgaXRlbXMpCisgICAgZGVmIHNlbGVjdGlvbl9hZGQoc2VsZiwgKml0ZW1zKToKKyAgICAgICAgIiIiQWRkIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzZWxlY3Rpb24uIiIiCisgICAgICAgIHNlbGYuX3NlbGVjdGlvbigiYWRkIiwgaXRlbXMpCiAKIAotICAgIGRlZiBzZWxlY3Rpb25fdG9nZ2xlKHNlbGYsIGl0ZW1zKToKLSAgICAgICAgIiIiVG9nZ2xlIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgZWFjaCBpdGVtIGluIGl0ZW1zLiIiIgotICAgICAgICBzZWxmLnNlbGVjdGlvbigidG9nZ2xlIiwgaXRlbXMpCisgICAgZGVmIHNlbGVjdGlvbl9yZW1vdmUoc2VsZiwgKml0ZW1zKToKKyAgICAgICAgIiIiUmVtb3ZlIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNlbGVjdGlvbi4iIiIKKyAgICAgICAgc2VsZi5fc2VsZWN0aW9uKCJyZW1vdmUiLCBpdGVtcykKKworCisgICAgZGVmIHNlbGVjdGlvbl90b2dnbGUoc2VsZiwgKml0ZW1zKToKKyAgICAgICAgIiIiVG9nZ2xlIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgZWFjaCBzcGVjaWZpZWQgaXRlbS4iIiIKKyAgICAgICAgc2VsZi5fc2VsZWN0aW9uKCJ0b2dnbGUiLCBpdGVtcykKIAogCiAgICAgZGVmIHNldChzZWxmLCBpdGVtLCBjb2x1bW49Tm9uZSwgdmFsdWU9Tm9uZSk6CmRpZmYgLS1naXQgYS9MaWIvdG9rZW5pemUucHkgYi9MaWIvdG9rZW5pemUucHkKaW5kZXggYjFkMGM4My4uZWM3OWVjOCAxMDA2NDQKLS0tIGEvTGliL3Rva2VuaXplLnB5CisrKyBiL0xpYi90b2tlbml6ZS5weQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGNvbGxlY3Rpb25zCiBmcm9tIGlvIGltcG9ydCBUZXh0SU9XcmFwcGVyCiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KK2ltcG9ydCBpdGVydG9vbHMgYXMgX2l0ZXJ0b29scwogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCiBmcm9tIHRva2VuIGltcG9ydCAqCkBAIC0xMzEsNyArMTMyLDI4IEBACiBJbWFnbnVtYmVyID0gZ3JvdXAocidbMC05XStbakpdJywgRmxvYXRudW1iZXIgKyByJ1tqSl0nKQogTnVtYmVyID0gZ3JvdXAoSW1hZ251bWJlciwgRmxvYXRudW1iZXIsIEludG51bWJlcikKIAotU3RyaW5nUHJlZml4ID0gcicoPzpbYkJdW3JSXT98W3JSXVtiQl0/fFt1VV0pPycKKyMgUmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcsIHBsdXMgYWxsIG9mIHRoZSB2YWxpZCBzdHJpbmcgcHJlZml4ZXMuCitkZWYgX2FsbF9zdHJpbmdfcHJlZml4ZXMoKToKKyAgICAjIFRoZSB2YWxpZCBzdHJpbmcgcHJlZml4ZXMuIE9ubHkgY29udGFpbiB0aGUgbG93ZXIgY2FzZSB2ZXJzaW9ucywKKyAgICAjICBhbmQgZG9uJ3QgY29udGFpbiBhbnkgcGVybXVhdGlvbnMgKGluY2x1ZGUgJ2ZyJywgYnV0IG5vdAorICAgICMgICdyZicpLiBUaGUgdmFyaW91cyBwZXJtdXRhdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICAgX3ZhbGlkX3N0cmluZ19wcmVmaXhlcyA9IFsnYicsICdyJywgJ3UnLCAnZicsICdicicsICdmciddCisgICAgIyBpZiB3ZSBhZGQgYmluYXJ5IGYtc3RyaW5ncywgYWRkOiBbJ2ZiJywgJ2ZiciddCisgICAgcmVzdWx0ID0gc2V0KFsnJ10pCisgICAgZm9yIHByZWZpeCBpbiBfdmFsaWRfc3RyaW5nX3ByZWZpeGVzOgorICAgICAgICBmb3IgdCBpbiBfaXRlcnRvb2xzLnBlcm11dGF0aW9ucyhwcmVmaXgpOgorICAgICAgICAgICAgIyBjcmVhdGUgYSBsaXN0IHdpdGggdXBwZXIgYW5kIGxvd2VyIHZlcnNpb25zIG9mIGVhY2gKKyAgICAgICAgICAgICMgIGNoYXJhY3RlcgorICAgICAgICAgICAgZm9yIHUgaW4gX2l0ZXJ0b29scy5wcm9kdWN0KCpbKGMsIGMudXBwZXIoKSkgZm9yIGMgaW4gdF0pOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoJycuam9pbih1KSkKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBfY29tcGlsZShleHByKToKKyAgICByZXR1cm4gcmUuY29tcGlsZShleHByLCByZS5VTklDT0RFKQorCisjIE5vdGUgdGhhdCBzaW5jZSBfYWxsX3N0cmluZ19wcmVmaXhlcyBpbmNsdWRlcyB0aGUgZW1wdHkgc3RyaW5nLAorIyAgU3RyaW5nUHJlZml4IGNhbiBiZSB0aGUgZW1wdHkgc3RyaW5nIChtYWtpbmcgaXQgb3B0aW9uYWwpLgorU3RyaW5nUHJlZml4ID0gZ3JvdXAoKl9hbGxfc3RyaW5nX3ByZWZpeGVzKCkpCiAKICMgVGFpbCBlbmQgb2YgJyBzdHJpbmcuCiBTaW5nbGUgPSByIlteJ1xcXSooPzpcXC5bXidcXF0qKSonIgpAQCAtMTY5LDUwICsxOTEsMjUgQEAKIFBzZXVkb0V4dHJhcyA9IGdyb3VwKHInXFxccj9cbnxcWicsIENvbW1lbnQsIFRyaXBsZSkKIFBzZXVkb1Rva2VuID0gV2hpdGVzcGFjZSArIGdyb3VwKFBzZXVkb0V4dHJhcywgTnVtYmVyLCBGdW5ueSwgQ29udFN0ciwgTmFtZSkKIAotZGVmIF9jb21waWxlKGV4cHIpOgotICAgIHJldHVybiByZS5jb21waWxlKGV4cHIsIHJlLlVOSUNPREUpCisjIEZvciBhIGdpdmVuIHN0cmluZyBwcmVmaXggcGx1cyBxdW90ZXMsIGVuZHBhdHMgbWFwcyBpdCB0byBhIHJlZ2V4CisjICB0byBtYXRjaCB0aGUgcmVtYWluZGVyIG9mIHRoYXQgc3RyaW5nLiBfcHJlZml4IGNhbiBiZSBlbXB0eSwgZm9yCisjICBhIG5vcm1hbCBzaW5nbGUgb3IgdHJpcGxlIHF1b3RlZCBzdHJpbmcgKHdpdGggbm8gcHJlZml4KS4KK2VuZHBhdHMgPSB7fQorZm9yIF9wcmVmaXggaW4gX2FsbF9zdHJpbmdfcHJlZml4ZXMoKToKKyAgICBlbmRwYXRzW19wcmVmaXggKyAiJyJdID0gU2luZ2xlCisgICAgZW5kcGF0c1tfcHJlZml4ICsgJyInXSA9IERvdWJsZQorICAgIGVuZHBhdHNbX3ByZWZpeCArICInJyciXSA9IFNpbmdsZTMKKyAgICBlbmRwYXRzW19wcmVmaXggKyAnIiIiJ10gPSBEb3VibGUzCiAKLWVuZHBhdHMgPSB7IiciOiBTaW5nbGUsICciJzogRG91YmxlLAotICAgICAgICAgICAiJycnIjogU2luZ2xlMywgJyIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJyJycnIjogU2luZ2xlMywgJ3IiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiYicnJyI6IFNpbmdsZTMsICdiIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlInJyciOiBTaW5nbGUzLCAnUiIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJCJycnIjogU2luZ2xlMywgJ0IiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiYnInJyciOiBTaW5nbGUzLCAnYnIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiYlInJyciOiBTaW5nbGUzLCAnYlIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiQnInJyciOiBTaW5nbGUzLCAnQnIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiQlInJyciOiBTaW5nbGUzLCAnQlIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAicmInJyciOiBTaW5nbGUzLCAncmIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiUmInJyciOiBTaW5nbGUzLCAnUmIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAickInJyciOiBTaW5nbGUzLCAnckIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiUkInJyciOiBTaW5nbGUzLCAnUkIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAidScnJyI6IFNpbmdsZTMsICd1IiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlUnJyciOiBTaW5nbGUzLCAnVSIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICdyJzogTm9uZSwgJ1InOiBOb25lLCAnYic6IE5vbmUsICdCJzogTm9uZSwKLSAgICAgICAgICAgJ3UnOiBOb25lLCAnVSc6IE5vbmV9Ci0KLXRyaXBsZV9xdW90ZWQgPSB7fQotZm9yIHQgaW4gKCInJyciLCAnIiIiJywKLSAgICAgICAgICAicicnJyIsICdyIiIiJywgIlInJyciLCAnUiIiIicsCi0gICAgICAgICAgImInJyciLCAnYiIiIicsICJCJycnIiwgJ0IiIiInLAotICAgICAgICAgICJicicnJyIsICdiciIiIicsICJCcicnJyIsICdCciIiIicsCi0gICAgICAgICAgImJSJycnIiwgJ2JSIiIiJywgIkJSJycnIiwgJ0JSIiIiJywKLSAgICAgICAgICAicmInJyciLCAncmIiIiInLCAickInJyciLCAnckIiIiInLAotICAgICAgICAgICJSYicnJyIsICdSYiIiIicsICJSQicnJyIsICdSQiIiIicsCi0gICAgICAgICAgInUnJyciLCAndSIiIicsICJVJycnIiwgJ1UiIiInLAotICAgICAgICAgICk6Ci0gICAgdHJpcGxlX3F1b3RlZFt0XSA9IHQKLXNpbmdsZV9xdW90ZWQgPSB7fQotZm9yIHQgaW4gKCInIiwgJyInLAotICAgICAgICAgICJyJyIsICdyIicsICJSJyIsICdSIicsCi0gICAgICAgICAgImInIiwgJ2IiJywgIkInIiwgJ0IiJywKLSAgICAgICAgICAiYnInIiwgJ2JyIicsICJCciciLCAnQnIiJywKLSAgICAgICAgICAiYlInIiwgJ2JSIicsICJCUiciLCAnQlIiJyAsCi0gICAgICAgICAgInJiJyIsICdyYiInLCAickInIiwgJ3JCIicsCi0gICAgICAgICAgIlJiJyIsICdSYiInLCAiUkInIiwgJ1JCIicgLAotICAgICAgICAgICJ1JyIsICd1IicsICJVJyIsICdVIicsCi0gICAgICAgICAgKToKLSAgICBzaW5nbGVfcXVvdGVkW3RdID0gdAorIyBBIHNldCBvZiBhbGwgb2YgdGhlIHNpbmdsZSBhbmQgdHJpcGxlIHF1b3RlZCBzdHJpbmcgcHJlZml4ZXMsCisjICBpbmNsdWRpbmcgdGhlIG9wZW5pbmcgcXVvdGVzLgorc2luZ2xlX3F1b3RlZCA9IHNldCgpCit0cmlwbGVfcXVvdGVkID0gc2V0KCkKK2ZvciB0IGluIF9hbGxfc3RyaW5nX3ByZWZpeGVzKCk6CisgICAgZm9yIHUgaW4gKHQgKyAnIicsIHQgKyAiJyIpOgorICAgICAgICBzaW5nbGVfcXVvdGVkLmFkZCh1KQorICAgIGZvciB1IGluICh0ICsgJyIiIicsIHQgKyAiJycnIik6CisgICAgICAgIHRyaXBsZV9xdW90ZWQuYWRkKHUpCiAKIHRhYnNpemUgPSA4CiAKQEAgLTYyNiw2ICs2MjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc3Rhc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgc3Rhc2hlZCA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgeWllbGQgVG9rZW5JbmZvKENPTU1FTlQsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorCiAgICAgICAgICAgICAgICAgZWxpZiB0b2tlbiBpbiB0cmlwbGVfcXVvdGVkOgogICAgICAgICAgICAgICAgICAgICBlbmRwcm9nID0gX2NvbXBpbGUoZW5kcGF0c1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgIGVuZG1hdGNoID0gZW5kcHJvZy5tYXRjaChsaW5lLCBwb3MpCkBAIC02MzgsMTkgKzYzNiwzNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHN0ciA9IGxpbmVbc3RhcnQ6XQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGxpbmUgPSBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCBpbiBzaW5nbGVfcXVvdGVkIG9yIFwKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5bOjJdIGluIHNpbmdsZV9xdW90ZWQgb3IgXAotICAgICAgICAgICAgICAgICAgICB0b2tlbls6M10gaW4gc2luZ2xlX3F1b3RlZDoKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgdXAgdG8gdGhlIGZpcnN0IDMgY2hhcnMgb2YgdGhlIHRva2VuIHRvIHNlZSBpZgorICAgICAgICAgICAgICAgICMgIHRoZXkncmUgaW4gdGhlIHNpbmdsZV9xdW90ZWQgc2V0LiBJZiBzbywgdGhleSBzdGFydAorICAgICAgICAgICAgICAgICMgIGEgc3RyaW5nLgorICAgICAgICAgICAgICAgICMgV2UncmUgdXNpbmcgdGhlIGZpcnN0IDMsIGJlY2F1c2Ugd2UncmUgbG9va2luZyBmb3IKKyAgICAgICAgICAgICAgICAjICAicmInIiAoZm9yIGV4YW1wbGUpIGF0IHRoZSBzdGFydCBvZiB0aGUgdG9rZW4uIElmCisgICAgICAgICAgICAgICAgIyAgd2Ugc3dpdGNoIHRvIGxvbmdlciBwcmVmaXhlcywgdGhpcyBuZWVkcyB0byBiZQorICAgICAgICAgICAgICAgICMgIGFkanVzdGVkLgorICAgICAgICAgICAgICAgICMgTm90ZSB0aGF0IGluaXRpYWwgPT0gdG9rZW5bOjFdLgorICAgICAgICAgICAgICAgICMgQWxzbyBub3RlIHRoYXQgc2luZ2xlIHF1b3RlIGNoZWNraW5nIG11c3QgY29tZSBhZnRlcgorICAgICAgICAgICAgICAgICMgIHRyaXBsZSBxdW90ZSBjaGVja2luZyAoYWJvdmUpLgorICAgICAgICAgICAgICAgIGVsaWYgKGluaXRpYWwgaW4gc2luZ2xlX3F1b3RlZCBvcgorICAgICAgICAgICAgICAgICAgICAgIHRva2VuWzoyXSBpbiBzaW5nbGVfcXVvdGVkIG9yCisgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bOjNdIGluIHNpbmdsZV9xdW90ZWQpOgogICAgICAgICAgICAgICAgICAgICBpZiB0b2tlblstMV0gPT0gJ1xuJzogICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlZCBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0ID0gKGxudW0sIHN0YXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IF9jb21waWxlKGVuZHBhdHNbaW5pdGlhbF0gb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwYXRzW3Rva2VuWzFdXSBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBhdHNbdG9rZW5bMl1dKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBBZ2FpbiwgdXNpbmcgdGhlIGZpcnN0IDMgY2hhcnMgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAjICB0b2tlbi4gVGhpcyBpcyBsb29raW5nIGZvciB0aGUgbWF0Y2hpbmcgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAjICByZWdleCBmb3IgdGhlIGNvcnJlY3QgdHlwZSBvZiBxdW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAgY2hhcmFjdGVyLiBTbyBpdCdzIHJlYWxseSBsb29raW5nIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgIyAgZW5kcGF0c1siJyJdIG9yIGVuZHBhdHNbJyInXSwgYnkgdHJ5aW5nIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAjICBza2lwIHN0cmluZyBwcmVmaXggY2hhcmFjdGVycywgaWYgYW55LgorICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IF9jb21waWxlKGVuZHBhdHMuZ2V0KGluaXRpYWwpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcGF0cy5nZXQodG9rZW5bMV0pIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcGF0cy5nZXQodG9rZW5bMl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgY29udHN0ciwgbmVlZGNvbnQgPSBsaW5lW3N0YXJ0Ol0sIDEKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gbGluZQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcmRpbmFyeSBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIFRva2VuSW5mbyhTVFJJTkcsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorCiAgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsLmlzaWRlbnRpZmllcigpOiAgICAgICAgICAgICAgICMgb3JkaW5hcnkgbmFtZQogICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbiBpbiAoJ2FzeW5jJywgJ2F3YWl0Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhc3luY19kZWY6CmRpZmYgLS1naXQgYS9MaWIvdHJhY2UucHkgYi9MaWIvdHJhY2UucHkKaW5kZXggZjEwODI2Ni4uYWUxNTQ2MSAxMDA3NTUKLS0tIGEvTGliL3RyYWNlLnB5CisrKyBiL0xpYi90cmFjZS5weQpAQCAtNDgsNiArNDgsNyBAQAogICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIGNvdmVyZGlyPSIvdG1wIikKICIiIgogX19hbGxfXyA9IFsnVHJhY2UnLCAnQ292ZXJhZ2VSZXN1bHRzJ10KK2ltcG9ydCBhcmdwYXJzZQogaW1wb3J0IGxpbmVjYWNoZQogaW1wb3J0IG9zCiBpbXBvcnQgcmUKQEAgLTU4LDcgKzU5LDYgQEAKIGltcG9ydCBnYwogaW1wb3J0IGRpcwogaW1wb3J0IHBpY2tsZQotZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybiBhcyBfd2FybgogZnJvbSB0aW1lIGltcG9ydCBtb25vdG9uaWMgYXMgX3RpbWUKIAogdHJ5OgpAQCAtNzcsNTEgKzc3LDYgQEAKICAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCiAgICAgICAgIHRocmVhZGluZy5zZXR0cmFjZShOb25lKQogCi1kZWYgX3VzYWdlKG91dGZpbGUpOgotICAgIG91dGZpbGUud3JpdGUoIiIiVXNhZ2U6ICVzIFtPUFRJT05TXSA8ZmlsZT4gW0FSR1NdCi0KLU1ldGEtb3B0aW9uczoKLS0taGVscCAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscCB0aGVuIGV4aXQuCi0tLXZlcnNpb24gICAgICAgICAgICAgT3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gdGhlbiBleGl0LgotCi1PdGhlcndpc2UsIGV4YWN0bHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhyZWUgb3B0aW9ucyBtdXN0IGJlIGdpdmVuOgotLXQsIC0tdHJhY2UgICAgICAgICAgIFByaW50IGVhY2ggbGluZSB0byBzeXMuc3Rkb3V0IGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KLS1jLCAtLWNvdW50ICAgICAgICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbGluZSBpcyBleGVjdXRlZAotICAgICAgICAgICAgICAgICAgICAgIGFuZCB3cml0ZSB0aGUgY291bnRzIHRvIDxtb2R1bGU+LmNvdmVyIGZvciBlYWNoCi0gICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGV4ZWN1dGVkLCBpbiB0aGUgbW9kdWxlJ3MgZGlyZWN0b3J5LgotICAgICAgICAgICAgICAgICAgICAgIFNlZSBhbHNvIGAtLWNvdmVyZGlyJywgYC0tZmlsZScsIGAtLW5vLXJlcG9ydCcgYmVsb3cuCi0tbCwgLS1saXN0ZnVuY3MgICAgICAgS2VlcCB0cmFjayBvZiB3aGljaCBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkIGF0IGxlYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgb25jZSBhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gc3lzLnN0ZG91dCBhZnRlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGV4aXRzLgotLVQsIC0tdHJhY2tjYWxscyAgICAgIEtlZXAgdHJhY2sgb2YgY2FsbGVyL2NhbGxlZCBwYWlycyBhbmQgd3JpdGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyB0byBzeXMuc3Rkb3V0IGFmdGVyIHRoZSBwcm9ncmFtIGV4aXRzLgotLXIsIC0tcmVwb3J0ICAgICAgICAgIEdlbmVyYXRlIGEgcmVwb3J0IGZyb20gYSBjb3VudHMgZmlsZTsgZG8gbm90IGV4ZWN1dGUKLSAgICAgICAgICAgICAgICAgICAgICBhbnkgY29kZS4gIGAtLWZpbGUnIG11c3Qgc3BlY2lmeSB0aGUgcmVzdWx0cyBmaWxlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgcmVhZCwgd2hpY2ggbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBpbiBhIHByZXZpb3VzIHJ1bgotICAgICAgICAgICAgICAgICAgICAgIHdpdGggYC0tY291bnQgLS1maWxlPUZJTEUnLgotCi1Nb2RpZmllcnM6Ci0tZiwgLS1maWxlPTxmaWxlPiAgICAgRmlsZSB0byBhY2N1bXVsYXRlIGNvdW50cyBvdmVyIHNldmVyYWwgcnVucy4KLS1SLCAtLW5vLXJlcG9ydCAgICAgICBEbyBub3QgZ2VuZXJhdGUgdGhlIGNvdmVyYWdlIHJlcG9ydCBmaWxlcy4KLSAgICAgICAgICAgICAgICAgICAgICBVc2VmdWwgaWYgeW91IHdhbnQgdG8gYWNjdW11bGF0ZSBvdmVyIHNldmVyYWwgcnVucy4KLS1DLCAtLWNvdmVyZGlyPTxkaXI+ICBEaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9ydCBmaWxlcy4gIFRoZSBjb3ZlcmFnZQotICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydCBmb3IgPHBhY2thZ2U+Ljxtb2R1bGU+IGlzIHdyaXR0ZW4gdG8gZmlsZQotICAgICAgICAgICAgICAgICAgICAgIDxkaXI+LzxwYWNrYWdlPi88bW9kdWxlPi5jb3Zlci4KLS1tLCAtLW1pc3NpbmcgICAgICAgICBBbm5vdGF0ZSBleGVjdXRhYmxlIGxpbmVzIHRoYXQgd2VyZSBub3QgZXhlY3V0ZWQKLSAgICAgICAgICAgICAgICAgICAgICB3aXRoICc+Pj4+Pj4gJy4KLS1zLCAtLXN1bW1hcnkgICAgICAgICBXcml0ZSBhIGJyaWVmIHN1bW1hcnkgb24gc3Rkb3V0IGZvciBlYWNoIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgICAgKENhbiBvbmx5IGJlIHVzZWQgd2l0aCAtLWNvdW50IG9yIC0tcmVwb3J0LikKLS1nLCAtLXRpbWluZyAgICAgICAgICBQcmVmaXggZWFjaCBsaW5lIHdpdGggdGhlIHRpbWUgc2luY2UgdGhlIHByb2dyYW0gc3RhcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICBPbmx5IHVzZWQgd2hpbGUgdHJhY2luZy4KLQotRmlsdGVycywgbWF5IGJlIHJlcGVhdGVkIG11bHRpcGxlIHRpbWVzOgotLS1pZ25vcmUtbW9kdWxlPTxtb2Q+IElnbm9yZSB0aGUgZ2l2ZW4gbW9kdWxlKHMpIGFuZCBpdHMgc3VibW9kdWxlcwotICAgICAgICAgICAgICAgICAgICAgIChpZiBpdCBpcyBhIHBhY2thZ2UpLiAgQWNjZXB0cyBjb21tYSBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICBsaXN0IG9mIG1vZHVsZSBuYW1lcwotLS1pZ25vcmUtZGlyPTxkaXI+ICAgIElnbm9yZSBmaWxlcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IChtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIGNhbiBiZSBqb2luZWQgYnkgb3MucGF0aHNlcCkuCi0iIiIgJSBzeXMuYXJndlswXSkKLQogUFJBR01BX05PQ09WRVIgPSAiI3ByYWdtYSBOTyBDT1ZFUiIKIAogIyBTaW1wbGUgcnggdG8gZmluZCBsaW5lcyB3aXRoIG5vIGNvZGUuCkBAIC0yNjUsNyArMjIwLDEzIEBACiAKICAgICBkZWYgd3JpdGVfcmVzdWx0cyhzZWxmLCBzaG93X21pc3Npbmc9VHJ1ZSwgc3VtbWFyeT1GYWxzZSwgY292ZXJkaXI9Tm9uZSk6CiAgICAgICAgICIiIgotICAgICAgICBAcGFyYW0gY292ZXJkaXIKKyAgICAgICAgV3JpdGUgdGhlIGNvdmVyYWdlIHJlc3VsdHMuCisKKyAgICAgICAgOnBhcmFtIHNob3dfbWlzc2luZzogU2hvdyBsaW5lcyB0aGF0IGhhZCBubyBoaXRzLgorICAgICAgICA6cGFyYW0gc3VtbWFyeTogSW5jbHVkZSBjb3ZlcmFnZSBzdW1tYXJ5IHBlciBtb2R1bGUuCisgICAgICAgIDpwYXJhbSBjb3ZlcmRpcjogSWYgTm9uZSwgdGhlIHJlc3VsdHMgb2YgZWFjaCBtb2R1bGUgYXJlIHBsYWNlZCBpbiBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnksIG90aGVyd2lzZSBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLgogICAgICAgICAiIiIKICAgICAgICAgaWYgc2VsZi5jYWxsZWRmdW5jczoKICAgICAgICAgICAgIHByaW50KCkKQEAgLTY0NywyMTAgKzYwOCwxMzUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWRmdW5jcz1zZWxmLl9jYWxsZWRmdW5jcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJzPXNlbGYuX2NhbGxlcnMpCiAKLWRlZiBfZXJyX2V4aXQobXNnKToKLSAgICBzeXMuc3RkZXJyLndyaXRlKCIlczogJXNcbiIgJSAoc3lzLmFyZ3ZbMF0sIG1zZykpCi0gICAgc3lzLmV4aXQoMSkKK2RlZiBtYWluKCk6CiAKLWRlZiBtYWluKGFyZ3Y9Tm9uZSk6Ci0gICAgaW1wb3J0IGdldG9wdAorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcnNpb24nLCBhY3Rpb249J3ZlcnNpb24nLCB2ZXJzaW9uPSd0cmFjZSAyLjAnKQogCi0gICAgaWYgYXJndiBpcyBOb25lOgotICAgICAgICBhcmd2ID0gc3lzLmFyZ3YKKyAgICBncnAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdNYWluIG9wdGlvbnMnLAorICAgICAgICAgICAgJ09uZSBvZiB0aGVzZSAob3IgLS1yZXBvcnQpIG11c3QgYmUgZ2l2ZW4nKQorCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLWMnLCAnLS1jb3VudCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbGluZSBpcyBleGVjdXRlZCBhbmQgd3JpdGUgJworICAgICAgICAgICAgICAgICAndGhlIGNvdW50cyB0byA8bW9kdWxlPi5jb3ZlciBmb3IgZWFjaCBtb2R1bGUgZXhlY3V0ZWQsIGluICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBtb2R1bGVcJ3MgZGlyZWN0b3J5LiBTZWUgYWxzbyAtLWNvdmVyZGlyLCAtLWZpbGUsICcKKyAgICAgICAgICAgICAgICAgJy0tbm8tcmVwb3J0IGJlbG93LicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLXQnLCAnLS10cmFjZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdQcmludCBlYWNoIGxpbmUgdG8gc3lzLnN0ZG91dCBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQnKQorICAgIGdycC5hZGRfYXJndW1lbnQoJy1sJywgJy0tbGlzdGZ1bmNzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J0tlZXAgdHJhY2sgb2Ygd2hpY2ggZnVuY3Rpb25zIGFyZSBleGVjdXRlZCBhdCBsZWFzdCBvbmNlICcKKyAgICAgICAgICAgICAgICAgJ2FuZCB3cml0ZSB0aGUgcmVzdWx0cyB0byBzeXMuc3Rkb3V0IGFmdGVyIHRoZSBwcm9ncmFtIGV4aXRzLiAnCisgICAgICAgICAgICAgICAgICdDYW5ub3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSAtLXRyYWNlIG9yIC0tY291bnQuJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctVCcsICctLXRyYWNrY2FsbHMnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nS2VlcCB0cmFjayBvZiBjYWxsZXIvY2FsbGVkIHBhaXJzIGFuZCB3cml0ZSB0aGUgcmVzdWx0cyB0byAnCisgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0IGFmdGVyIHRoZSBwcm9ncmFtIGV4aXRzLicpCisKKyAgICBncnAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdNb2RpZmllcnMnKQorCisgICAgX2dycCA9IGdycC5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKCkKKyAgICBfZ3JwLmFkZF9hcmd1bWVudCgnLXInLCAnLS1yZXBvcnQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nR2VuZXJhdGUgYSByZXBvcnQgZnJvbSBhIGNvdW50cyBmaWxlOyBkb2VzIG5vdCBleGVjdXRlIGFueSAnCisgICAgICAgICAgICAgICAgICdjb2RlLiAtLWZpbGUgbXVzdCBzcGVjaWZ5IHRoZSByZXN1bHRzIGZpbGUgdG8gcmVhZCwgd2hpY2ggJworICAgICAgICAgICAgICAgICAnbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBpbiBhIHByZXZpb3VzIHJ1biB3aXRoIC0tY291bnQgJworICAgICAgICAgICAgICAgICAnLS1maWxlPUZJTEUnKQorICAgIF9ncnAuYWRkX2FyZ3VtZW50KCctUicsICctLW5vLXJlcG9ydCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdEbyBub3QgZ2VuZXJhdGUgdGhlIGNvdmVyYWdlIHJlcG9ydCBmaWxlcy4gJworICAgICAgICAgICAgICAgICAnVXNlZnVsIGlmIHlvdSB3YW50IHRvIGFjY3VtdWxhdGUgb3ZlciBzZXZlcmFsIHJ1bnMuJykKKworICAgIGdycC5hZGRfYXJndW1lbnQoJy1mJywgJy0tZmlsZScsCisgICAgICAgICAgICBoZWxwPSdGaWxlIHRvIGFjY3VtdWxhdGUgY291bnRzIG92ZXIgc2V2ZXJhbCBydW5zJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctQycsICctLWNvdmVyZGlyJywKKyAgICAgICAgICAgIGhlbHA9J0RpcmVjdG9yeSB3aGVyZSB0aGUgcmVwb3J0IGZpbGVzIGdvLiBUaGUgY292ZXJhZ2UgcmVwb3J0ICcKKyAgICAgICAgICAgICAgICAgJ2ZvciA8cGFja2FnZT4uPG1vZHVsZT4gd2lsbCBiZSB3cml0dGVuIHRvIGZpbGUgJworICAgICAgICAgICAgICAgICAnPGRpcj4vPHBhY2thZ2U+Lzxtb2R1bGU+LmNvdmVyJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctbScsICctLW1pc3NpbmcnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nQW5ub3RhdGUgZXhlY3V0YWJsZSBsaW5lcyB0aGF0IHdlcmUgbm90IGV4ZWN1dGVkIHdpdGggJworICAgICAgICAgICAgICAgICAnIj4+Pj4+PiAiJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctcycsICctLXN1bW1hcnknLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nV3JpdGUgYSBicmllZiBzdW1tYXJ5IGZvciBlYWNoIGZpbGUgdG8gc3lzLnN0ZG91dC4gJworICAgICAgICAgICAgICAgICAnQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIC0tY291bnQgb3IgLS1yZXBvcnQnKQorICAgIGdycC5hZGRfYXJndW1lbnQoJy1nJywgJy0tdGltaW5nJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J1ByZWZpeCBlYWNoIGxpbmUgd2l0aCB0aGUgdGltZSBzaW5jZSB0aGUgcHJvZ3JhbSBzdGFydGVkLiAnCisgICAgICAgICAgICAgICAgICdPbmx5IHVzZWQgd2hpbGUgdHJhY2luZycpCisKKyAgICBncnAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdGaWx0ZXJzJywKKyAgICAgICAgICAgICdDYW4gYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctLWlnbm9yZS1tb2R1bGUnLCBhY3Rpb249J2FwcGVuZCcsIGRlZmF1bHQ9W10sCisgICAgICAgICAgICBoZWxwPSdJZ25vcmUgdGhlIGdpdmVuIG1vZHVsZShzKSBhbmQgaXRzIHN1Ym1vZHVsZXMnCisgICAgICAgICAgICAgICAgICcoaWYgaXQgaXMgYSBwYWNrYWdlKS4gQWNjZXB0cyBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiAnCisgICAgICAgICAgICAgICAgICdtb2R1bGUgbmFtZXMuJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctLWlnbm9yZS1kaXInLCBhY3Rpb249J2FwcGVuZCcsIGRlZmF1bHQ9W10sCisgICAgICAgICAgICBoZWxwPSdJZ25vcmUgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSAnCisgICAgICAgICAgICAgICAgICcobXVsdGlwbGUgZGlyZWN0b3JpZXMgY2FuIGJlIGpvaW5lZCBieSBvcy5wYXRoc2VwKS4nKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnZmlsZW5hbWUnLCBuYXJncz0nPycsCisgICAgICAgICAgICBoZWxwPSdmaWxlIHRvIHJ1biBhcyBtYWluIHByb2dyYW0nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2FyZ3VtZW50cycsIG5hcmdzPWFyZ3BhcnNlLlJFTUFJTkRFUiwKKyAgICAgICAgICAgIGhlbHA9J2FyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbScpCisKKyAgICBvcHRzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgaWYgb3B0cy5pZ25vcmVfZGlyOgorICAgICAgICByZWxfcGF0aCA9ICdsaWInLCAncHl0aG9uezAubWFqb3J9LnswLm1pbm9yfScuZm9ybWF0KHN5cy52ZXJzaW9uX2luZm8pCisgICAgICAgIF9wcmVmaXggPSBvcy5wYXRoLmpvaW4oc3lzLmJhc2VfcHJlZml4LCAqcmVsX3BhdGgpCisgICAgICAgIF9leGVjX3ByZWZpeCA9IG9zLnBhdGguam9pbihzeXMuYmFzZV9leGVjX3ByZWZpeCwgKnJlbF9wYXRoKQorCisgICAgZGVmIHBhcnNlX2lnbm9yZV9kaXIocyk6CisgICAgICAgIHMgPSBvcy5wYXRoLmV4cGFuZHVzZXIob3MucGF0aC5leHBhbmR2YXJzKHMpKQorICAgICAgICBzID0gcy5yZXBsYWNlKCckcHJlZml4JywgX3ByZWZpeCkucmVwbGFjZSgnJGV4ZWNfcHJlZml4JywgX2V4ZWNfcHJlZml4KQorICAgICAgICByZXR1cm4gb3MucGF0aC5ub3JtcGF0aChzKQorCisgICAgb3B0cy5pZ25vcmVfbW9kdWxlID0gW21vZC5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIG9wdHMuaWdub3JlX21vZHVsZSBmb3IgbW9kIGluIGkuc3BsaXQoJywnKV0KKyAgICBvcHRzLmlnbm9yZV9kaXIgPSBbcGFyc2VfaWdub3JlX2RpcihzKQorICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBvcHRzLmlnbm9yZV9kaXIgZm9yIHMgaW4gaS5zcGxpdChvcy5wYXRoc2VwKV0KKworICAgIGlmIG9wdHMucmVwb3J0OgorICAgICAgICBpZiBub3Qgb3B0cy5maWxlOgorICAgICAgICAgICAgcGFyc2VyLmVycm9yKCctci8tLXJlcG9ydCByZXF1aXJlcyAtZi8tLWZpbGUnKQorICAgICAgICByZXN1bHRzID0gQ292ZXJhZ2VSZXN1bHRzKGluZmlsZT1vcHRzLmZpbGUsIG91dGZpbGU9b3B0cy5maWxlKQorICAgICAgICByZXR1cm4gcmVzdWx0cy53cml0ZV9yZXN1bHRzKG9wdHMubWlzc2luZywgb3B0cy5zdW1tYXJ5LCBvcHRzLmNvdmVyZGlyKQorCisgICAgaWYgbm90IGFueShbb3B0cy50cmFjZSwgb3B0cy5jb3VudCwgb3B0cy5saXN0ZnVuY3MsIG9wdHMudHJhY2tjYWxsc10pOgorICAgICAgICBwYXJzZXIuZXJyb3IoJ211c3Qgc3BlY2lmeSBvbmUgb2YgLS10cmFjZSwgLS1jb3VudCwgLS1yZXBvcnQsICcKKyAgICAgICAgICAgICAgICAgICAgICctLWxpc3RmdW5jcywgb3IgLS10cmFja2NhbGxzJykKKworICAgIGlmIG9wdHMubGlzdGZ1bmNzIGFuZCAob3B0cy5jb3VudCBvciBvcHRzLnRyYWNlKToKKyAgICAgICAgcGFyc2VyLmVycm9yKCdjYW5ub3Qgc3BlY2lmeSBib3RoIC0tbGlzdGZ1bmNzIGFuZCAoLS10cmFjZSBvciAtLWNvdW50KScpCisKKyAgICBpZiBvcHRzLnN1bW1hcnkgYW5kIG5vdCBvcHRzLmNvdW50OgorICAgICAgICBwYXJzZXIuZXJyb3IoJy0tc3VtbWFyeSBjYW4gb25seSBiZSB1c2VkIHdpdGggLS1jb3VudCBvciAtLXJlcG9ydCcpCisKKyAgICBpZiBvcHRzLmZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgIHBhcnNlci5lcnJvcignZmlsZW5hbWUgaXMgbWlzc2luZzogcmVxdWlyZWQgd2l0aCB0aGUgbWFpbiBvcHRpb25zJykKKworICAgIHN5cy5hcmd2ID0gb3B0cy5maWxlbmFtZSwgKm9wdHMuYXJndW1lbnRzCisgICAgc3lzLnBhdGhbMF0gPSBvcy5wYXRoLmRpcm5hbWUob3B0cy5maWxlbmFtZSkKKworICAgIHQgPSBUcmFjZShvcHRzLmNvdW50LCBvcHRzLnRyYWNlLCBjb3VudGZ1bmNzPW9wdHMubGlzdGZ1bmNzLAorICAgICAgICAgICAgICBjb3VudGNhbGxlcnM9b3B0cy50cmFja2NhbGxzLCBpZ25vcmVtb2RzPW9wdHMuaWdub3JlX21vZHVsZSwKKyAgICAgICAgICAgICAgaWdub3JlZGlycz1vcHRzLmlnbm9yZV9kaXIsIGluZmlsZT1vcHRzLmZpbGUsCisgICAgICAgICAgICAgIG91dGZpbGU9b3B0cy5maWxlLCB0aW1pbmc9b3B0cy50aW1pbmcpCiAgICAgdHJ5OgotICAgICAgICBvcHRzLCBwcm9nX2FyZ3YgPSBnZXRvcHQuZ2V0b3B0KGFyZ3ZbMTpdLCAidGNyUmY6ZDptc0M6bFRnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImhlbHAiLCAidmVyc2lvbiIsICJ0cmFjZSIsICJjb3VudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBvcnQiLCAibm8tcmVwb3J0IiwgInN1bW1hcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZT0iLCAibWlzc2luZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmUtbW9kdWxlPSIsICJpZ25vcmUtZGlyPSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3ZlcmRpcj0iLCAibGlzdGZ1bmNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNrY2FsbHMiLCAidGltaW5nIl0pCisgICAgICAgIHdpdGggb3BlbihvcHRzLmZpbGVuYW1lKSBhcyBmcDoKKyAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGZwLnJlYWQoKSwgb3B0cy5maWxlbmFtZSwgJ2V4ZWMnKQorICAgICAgICAjIHRyeSB0byBlbXVsYXRlIF9fbWFpbl9fIG5hbWVzcGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlCisgICAgICAgIGdsb2JzID0geworICAgICAgICAgICAgJ19fZmlsZV9fJzogb3B0cy5maWxlbmFtZSwKKyAgICAgICAgICAgICdfX25hbWVfXyc6ICdfX21haW5fXycsCisgICAgICAgICAgICAnX19wYWNrYWdlX18nOiBOb25lLAorICAgICAgICAgICAgJ19fY2FjaGVkX18nOiBOb25lLAorICAgICAgICB9CisgICAgICAgIHQucnVuY3R4KGNvZGUsIGdsb2JzLCBnbG9icykKKyAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6CisgICAgICAgIHN5cy5leGl0KCJDYW5ub3QgcnVuIGZpbGUgJXIgYmVjYXVzZTogJXMiICUgKHN5cy5hcmd2WzBdLCBlcnIpKQorICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICBwYXNzCiAKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yIGFzIG1zZzoKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiJXM6ICVzXG4iICUgKHN5cy5hcmd2WzBdLCBtc2cpKQotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJUcnkgYCVzIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAlIHN5cy5hcmd2WzBdKQotICAgICAgICBzeXMuZXhpdCgxKQorICAgIHJlc3VsdHMgPSB0LnJlc3VsdHMoKQogCi0gICAgdHJhY2UgPSAwCi0gICAgY291bnQgPSAwCi0gICAgcmVwb3J0ID0gMAotICAgIG5vX3JlcG9ydCA9IDAKLSAgICBjb3VudHNfZmlsZSA9IE5vbmUKLSAgICBtaXNzaW5nID0gMAotICAgIGlnbm9yZV9tb2R1bGVzID0gW10KLSAgICBpZ25vcmVfZGlycyA9IFtdCi0gICAgY292ZXJkaXIgPSBOb25lCi0gICAgc3VtbWFyeSA9IDAKLSAgICBsaXN0ZnVuY3MgPSBGYWxzZQotICAgIGNvdW50Y2FsbGVycyA9IEZhbHNlCi0gICAgdGltaW5nID0gRmFsc2UKLQotICAgIGZvciBvcHQsIHZhbCBpbiBvcHRzOgotICAgICAgICBpZiBvcHQgPT0gIi0taGVscCI6Ci0gICAgICAgICAgICBfdXNhZ2Uoc3lzLnN0ZG91dCkKLSAgICAgICAgICAgIHN5cy5leGl0KDApCi0KLSAgICAgICAgaWYgb3B0ID09ICItLXZlcnNpb24iOgotICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgidHJhY2UgMi4wXG4iKQotICAgICAgICAgICAgc3lzLmV4aXQoMCkKLQotICAgICAgICBpZiBvcHQgPT0gIi1UIiBvciBvcHQgPT0gIi0tdHJhY2tjYWxscyI6Ci0gICAgICAgICAgICBjb3VudGNhbGxlcnMgPSBUcnVlCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLWwiIG9yIG9wdCA9PSAiLS1saXN0ZnVuY3MiOgotICAgICAgICAgICAgbGlzdGZ1bmNzID0gVHJ1ZQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1nIiBvciBvcHQgPT0gIi0tdGltaW5nIjoKLSAgICAgICAgICAgIHRpbWluZyA9IFRydWUKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItdCIgb3Igb3B0ID09ICItLXRyYWNlIjoKLSAgICAgICAgICAgIHRyYWNlID0gMQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1jIiBvciBvcHQgPT0gIi0tY291bnQiOgotICAgICAgICAgICAgY291bnQgPSAxCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLXIiIG9yIG9wdCA9PSAiLS1yZXBvcnQiOgotICAgICAgICAgICAgcmVwb3J0ID0gMQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1SIiBvciBvcHQgPT0gIi0tbm8tcmVwb3J0IjoKLSAgICAgICAgICAgIG5vX3JlcG9ydCA9IDEKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItZiIgb3Igb3B0ID09ICItLWZpbGUiOgotICAgICAgICAgICAgY291bnRzX2ZpbGUgPSB2YWwKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItbSIgb3Igb3B0ID09ICItLW1pc3NpbmciOgotICAgICAgICAgICAgbWlzc2luZyA9IDEKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItQyIgb3Igb3B0ID09ICItLWNvdmVyZGlyIjoKLSAgICAgICAgICAgIGNvdmVyZGlyID0gdmFsCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLXMiIG9yIG9wdCA9PSAiLS1zdW1tYXJ5IjoKLSAgICAgICAgICAgIHN1bW1hcnkgPSAxCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLS1pZ25vcmUtbW9kdWxlIjoKLSAgICAgICAgICAgIGZvciBtb2QgaW4gdmFsLnNwbGl0KCIsIik6Ci0gICAgICAgICAgICAgICAgaWdub3JlX21vZHVsZXMuYXBwZW5kKG1vZC5zdHJpcCgpKQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi0taWdub3JlLWRpciI6Ci0gICAgICAgICAgICBmb3IgcyBpbiB2YWwuc3BsaXQob3MucGF0aHNlcCk6Ci0gICAgICAgICAgICAgICAgcyA9IG9zLnBhdGguZXhwYW5kdmFycyhzKQotICAgICAgICAgICAgICAgICMgc2hvdWxkIEkgYWxzbyBjYWxsIGV4cGFuZHVzZXI/IChhZnRlciBhbGwsIGNvdWxkIHVzZSAkSE9NRSkKLQotICAgICAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoIiRwcmVmaXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHN5cy5iYXNlX3ByZWZpeCwgImxpYiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiIgKyBzeXMudmVyc2lvbls6M10pKQotICAgICAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoIiRleGVjX3ByZWZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3lzLmJhc2VfZXhlY19wcmVmaXgsICJsaWIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzLnZlcnNpb25bOjNdKSkKLSAgICAgICAgICAgICAgICBzID0gb3MucGF0aC5ub3JtcGF0aChzKQotICAgICAgICAgICAgICAgIGlnbm9yZV9kaXJzLmFwcGVuZChzKQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBhc3NlcnQgMCwgIlNob3VsZCBuZXZlciBnZXQgaGVyZSIKLQotICAgIGlmIGxpc3RmdW5jcyBhbmQgKGNvdW50IG9yIHRyYWNlKToKLSAgICAgICAgX2Vycl9leGl0KCJjYW5ub3Qgc3BlY2lmeSBib3RoIC0tbGlzdGZ1bmNzIGFuZCAoLS10cmFjZSBvciAtLWNvdW50KSIpCi0KLSAgICBpZiBub3QgKGNvdW50IG9yIHRyYWNlIG9yIHJlcG9ydCBvciBsaXN0ZnVuY3Mgb3IgY291bnRjYWxsZXJzKToKLSAgICAgICAgX2Vycl9leGl0KCJtdXN0IHNwZWNpZnkgb25lIG9mIC0tdHJhY2UsIC0tY291bnQsIC0tcmVwb3J0LCAiCi0gICAgICAgICAgICAgICAgICAiLS1saXN0ZnVuY3MsIG9yIC0tdHJhY2tjYWxscyIpCi0KLSAgICBpZiByZXBvcnQgYW5kIG5vX3JlcG9ydDoKLSAgICAgICAgX2Vycl9leGl0KCJjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVwb3J0IGFuZCAtLW5vLXJlcG9ydCIpCi0KLSAgICBpZiByZXBvcnQgYW5kIG5vdCBjb3VudHNfZmlsZToKLSAgICAgICAgX2Vycl9leGl0KCItLXJlcG9ydCByZXF1aXJlcyBhIC0tZmlsZSIpCi0KLSAgICBpZiBub19yZXBvcnQgYW5kIGxlbihwcm9nX2FyZ3YpID09IDA6Ci0gICAgICAgIF9lcnJfZXhpdCgibWlzc2luZyBuYW1lIG9mIGZpbGUgdG8gcnVuIikKLQotICAgICMgZXZlcnl0aGluZyBpcyByZWFkeQotICAgIGlmIHJlcG9ydDoKLSAgICAgICAgcmVzdWx0cyA9IENvdmVyYWdlUmVzdWx0cyhpbmZpbGU9Y291bnRzX2ZpbGUsIG91dGZpbGU9Y291bnRzX2ZpbGUpCi0gICAgICAgIHJlc3VsdHMud3JpdGVfcmVzdWx0cyhtaXNzaW5nLCBzdW1tYXJ5PXN1bW1hcnksIGNvdmVyZGlyPWNvdmVyZGlyKQotICAgIGVsc2U6Ci0gICAgICAgIHN5cy5hcmd2ID0gcHJvZ19hcmd2Ci0gICAgICAgIHByb2duYW1lID0gcHJvZ19hcmd2WzBdCi0gICAgICAgIHN5cy5wYXRoWzBdID0gb3MucGF0aC5zcGxpdChwcm9nbmFtZSlbMF0KLQotICAgICAgICB0ID0gVHJhY2UoY291bnQsIHRyYWNlLCBjb3VudGZ1bmNzPWxpc3RmdW5jcywKLSAgICAgICAgICAgICAgICAgIGNvdW50Y2FsbGVycz1jb3VudGNhbGxlcnMsIGlnbm9yZW1vZHM9aWdub3JlX21vZHVsZXMsCi0gICAgICAgICAgICAgICAgICBpZ25vcmVkaXJzPWlnbm9yZV9kaXJzLCBpbmZpbGU9Y291bnRzX2ZpbGUsCi0gICAgICAgICAgICAgICAgICBvdXRmaWxlPWNvdW50c19maWxlLCB0aW1pbmc9dGltaW5nKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aXRoIG9wZW4ocHJvZ25hbWUpIGFzIGZwOgotICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGZwLnJlYWQoKSwgcHJvZ25hbWUsICdleGVjJykKLSAgICAgICAgICAgICMgdHJ5IHRvIGVtdWxhdGUgX19tYWluX18gbmFtZXNwYWNlIGFzIG11Y2ggYXMgcG9zc2libGUKLSAgICAgICAgICAgIGdsb2JzID0gewotICAgICAgICAgICAgICAgICdfX2ZpbGVfXyc6IHByb2duYW1lLAotICAgICAgICAgICAgICAgICdfX25hbWVfXyc6ICdfX21haW5fXycsCi0gICAgICAgICAgICAgICAgJ19fcGFja2FnZV9fJzogTm9uZSwKLSAgICAgICAgICAgICAgICAnX19jYWNoZWRfXyc6IE5vbmUsCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0LnJ1bmN0eChjb2RlLCBnbG9icywgZ2xvYnMpCi0gICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycjoKLSAgICAgICAgICAgIF9lcnJfZXhpdCgiQ2Fubm90IHJ1biBmaWxlICVyIGJlY2F1c2U6ICVzIiAlIChzeXMuYXJndlswXSwgZXJyKSkKLSAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQ6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICAgICAgcmVzdWx0cyA9IHQucmVzdWx0cygpCi0KLSAgICAgICAgaWYgbm90IG5vX3JlcG9ydDoKLSAgICAgICAgICAgIHJlc3VsdHMud3JpdGVfcmVzdWx0cyhtaXNzaW5nLCBzdW1tYXJ5PXN1bW1hcnksIGNvdmVyZGlyPWNvdmVyZGlyKQotCi0jICBEZXByZWNhdGVkIEFQSQotZGVmIHVzYWdlKG91dGZpbGUpOgotICAgIF93YXJuKCJUaGUgdHJhY2UudXNhZ2UoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICBfdXNhZ2Uob3V0ZmlsZSkKLQotY2xhc3MgSWdub3JlKF9JZ25vcmUpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGVzPU5vbmUsIGRpcnM9Tm9uZSk6Ci0gICAgICAgIF93YXJuKCJUaGUgY2xhc3MgdHJhY2UuSWdub3JlIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICAgICAgX0lnbm9yZS5fX2luaXRfXyhzZWxmLCBtb2R1bGVzLCBkaXJzKQotCi1kZWYgbW9kbmFtZShwYXRoKToKLSAgICBfd2FybigiVGhlIHRyYWNlLm1vZG5hbWUoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICByZXR1cm4gX21vZG5hbWUocGF0aCkKLQotZGVmIGZ1bGxtb2RuYW1lKHBhdGgpOgotICAgIF93YXJuKCJUaGUgdHJhY2UuZnVsbG1vZG5hbWUoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICByZXR1cm4gX2Z1bGxtb2RuYW1lKHBhdGgpCi0KLWRlZiBmaW5kX2xpbmVzX2Zyb21fY29kZShjb2RlLCBzdHJzKToKLSAgICBfd2FybigiVGhlIHRyYWNlLmZpbmRfbGluZXNfZnJvbV9jb2RlKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9maW5kX2xpbmVzX2Zyb21fY29kZShjb2RlLCBzdHJzKQotCi1kZWYgZmluZF9saW5lcyhjb2RlLCBzdHJzKToKLSAgICBfd2FybigiVGhlIHRyYWNlLmZpbmRfbGluZXMoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICByZXR1cm4gX2ZpbmRfbGluZXMoY29kZSwgc3RycykKLQotZGVmIGZpbmRfc3RyaW5ncyhmaWxlbmFtZSwgZW5jb2Rpbmc9Tm9uZSk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5maW5kX3N0cmluZ3MoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICByZXR1cm4gX2ZpbmRfc3RyaW5ncyhmaWxlbmFtZSwgZW5jb2Rpbmc9Tm9uZSkKLQotZGVmIGZpbmRfZXhlY3V0YWJsZV9saW5lbm9zKGZpbGVuYW1lKToKLSAgICBfd2FybigiVGhlIHRyYWNlLmZpbmRfZXhlY3V0YWJsZV9saW5lbm9zKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9maW5kX2V4ZWN1dGFibGVfbGluZW5vcyhmaWxlbmFtZSkKKyAgICBpZiBub3Qgb3B0cy5ub19yZXBvcnQ6CisgICAgICAgIHJlc3VsdHMud3JpdGVfcmVzdWx0cyhvcHRzLm1pc3NpbmcsIG9wdHMuc3VtbWFyeSwgb3B0cy5jb3ZlcmRpcikKIAogaWYgX19uYW1lX189PSdfX21haW5fXyc6CiAgICAgbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdHJhY2ViYWNrLnB5IGIvTGliL3RyYWNlYmFjay5weQppbmRleCBhMmViNTM5Li5hMTViODE4IDEwMDY0NAotLS0gYS9MaWIvdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90cmFjZWJhY2sucHkKQEAgLTM4NSw5ICszODUsMzAgQEAKICAgICAgICAgcmVzdWx0aW5nIGxpc3QgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgZnJhbWUgZnJvbSB0aGUgc3RhY2suCiAgICAgICAgIEVhY2ggc3RyaW5nIGVuZHMgaW4gYSBuZXdsaW5lOyB0aGUgc3RyaW5ncyBtYXkgY29udGFpbiBpbnRlcm5hbAogICAgICAgICBuZXdsaW5lcyBhcyB3ZWxsLCBmb3IgdGhvc2UgaXRlbXMgd2l0aCBzb3VyY2UgdGV4dCBsaW5lcy4KKworICAgICAgICBGb3IgbG9uZyBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgZnJhbWUgYW5kIGxpbmUsIHRoZSBmaXJzdCBmZXcKKyAgICAgICAgcmVwZXRpdGlvbnMgYXJlIHNob3duLCBmb2xsb3dlZCBieSBhIHN1bW1hcnkgbGluZSBzdGF0aW5nIHRoZSBleGFjdAorICAgICAgICBudW1iZXIgb2YgZnVydGhlciByZXBldGl0aW9ucy4KICAgICAgICAgIiIiCiAgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGxhc3RfZmlsZSA9IE5vbmUKKyAgICAgICAgbGFzdF9saW5lID0gTm9uZQorICAgICAgICBsYXN0X25hbWUgPSBOb25lCisgICAgICAgIGNvdW50ID0gMAogICAgICAgICBmb3IgZnJhbWUgaW4gc2VsZjoKKyAgICAgICAgICAgIGlmIChsYXN0X2ZpbGUgaXMgbm90IE5vbmUgYW5kIGxhc3RfZmlsZSA9PSBmcmFtZS5maWxlbmFtZSBhbmQKKyAgICAgICAgICAgICAgICBsYXN0X2xpbmUgaXMgbm90IE5vbmUgYW5kIGxhc3RfbGluZSA9PSBmcmFtZS5saW5lbm8gYW5kCisgICAgICAgICAgICAgICAgbGFzdF9uYW1lIGlzIG5vdCBOb25lIGFuZCBsYXN0X25hbWUgPT0gZnJhbWUubmFtZSk6CisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBjb3VudCA+IDM6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZicgIFtQcmV2aW91cyBsaW5lIHJlcGVhdGVkIHtjb3VudC0zfSBtb3JlIHRpbWVzXScrJ1xuJykKKyAgICAgICAgICAgICAgICBsYXN0X2ZpbGUgPSBmcmFtZS5maWxlbmFtZQorICAgICAgICAgICAgICAgIGxhc3RfbGluZSA9IGZyYW1lLmxpbmVubworICAgICAgICAgICAgICAgIGxhc3RfbmFtZSA9IGZyYW1lLm5hbWUKKyAgICAgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgIGlmIGNvdW50ID49IDM6CisgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIHJvdyA9IFtdCiAgICAgICAgICAgICByb3cuYXBwZW5kKCcgIEZpbGUgInt9IiwgbGluZSB7fSwgaW4ge31cbicuZm9ybWF0KAogICAgICAgICAgICAgICAgIGZyYW1lLmZpbGVuYW1lLCBmcmFtZS5saW5lbm8sIGZyYW1lLm5hbWUpKQpAQCAtMzk3LDYgKzQxOCw4IEBACiAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNvcnRlZChmcmFtZS5sb2NhbHMuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICAgICAgIHJvdy5hcHBlbmQoJyAgICB7bmFtZX0gPSB7dmFsdWV9XG4nLmZvcm1hdChuYW1lPW5hbWUsIHZhbHVlPXZhbHVlKSkKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJycuam9pbihyb3cpKQorICAgICAgICBpZiBjb3VudCA+IDM6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGYnICBbUHJldmlvdXMgbGluZSByZXBlYXRlZCB7Y291bnQtM30gbW9yZSB0aW1lc10nKydcbicpCiAgICAgICAgIHJldHVybiByZXN1bHQKIAogCkBAIC00ODcsMTAgKzUxMCw5IEBACiAgICAgICAgICAgICBzZWxmLl9sb2FkX2xpbmVzKCkKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBmcm9tX2V4Y2VwdGlvbihzZWxmLCBleGMsICphcmdzLCAqKmt3YXJncyk6CisgICAgZGVmIGZyb21fZXhjZXB0aW9uKGNscywgZXhjLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAiIiJDcmVhdGUgYSBUcmFjZWJhY2tFeGNlcHRpb24gZnJvbSBhbiBleGNlcHRpb24uIiIiCi0gICAgICAgIHJldHVybiBUcmFjZWJhY2tFeGNlcHRpb24oCi0gICAgICAgICAgICB0eXBlKGV4YyksIGV4YywgZXhjLl9fdHJhY2ViYWNrX18sICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgcmV0dXJuIGNscyh0eXBlKGV4YyksIGV4YywgZXhjLl9fdHJhY2ViYWNrX18sICphcmdzLCAqKmt3YXJncykKIAogICAgIGRlZiBfbG9hZF9saW5lcyhzZWxmKToKICAgICAgICAgIiIiUHJpdmF0ZSBBUEkuIGZvcmNlIGFsbCBsaW5lcyBpbiB0aGUgc3RhY2sgdG8gYmUgbG9hZGVkLiIiIgpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlbWFsbG9jLnB5IGIvTGliL3RyYWNlbWFsbG9jLnB5CmluZGV4IDYyODhkYTguLjc1YjM5MTggMTAwNjQ0Ci0tLSBhL0xpYi90cmFjZW1hbGxvYy5weQorKysgYi9MaWIvdHJhY2VtYWxsb2MucHkKQEAgLTI0NCwxNyArMjQ0LDIxIEBACiAgICAgX19zbG90c19fID0gKCJfdHJhY2UiLCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFjZSk6Ci0gICAgICAgICMgdHJhY2UgaXMgYSB0dXBsZTogKHNpemUsIHRyYWNlYmFjayksIHNlZSBUcmFjZWJhY2sgY29uc3RydWN0b3IKLSAgICAgICAgIyBmb3IgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2ViYWNrIHR1cGxlCisgICAgICAgICMgdHJhY2UgaXMgYSB0dXBsZTogKGRvbWFpbjogaW50LCBzaXplOiBpbnQsIHRyYWNlYmFjazogdHVwbGUpLgorICAgICAgICAjIFNlZSBUcmFjZWJhY2sgY29uc3RydWN0b3IgZm9yIHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNlYmFjayB0dXBsZS4KICAgICAgICAgc2VsZi5fdHJhY2UgPSB0cmFjZQogCiAgICAgQHByb3BlcnR5Ci0gICAgZGVmIHNpemUoc2VsZik6CisgICAgZGVmIGRvbWFpbihzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuX3RyYWNlWzBdCiAKICAgICBAcHJvcGVydHkKKyAgICBkZWYgc2l6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYWNlWzFdCisKKyAgICBAcHJvcGVydHkKICAgICBkZWYgdHJhY2ViYWNrKHNlbGYpOgotICAgICAgICByZXR1cm4gVHJhY2ViYWNrKHNlbGYuX3RyYWNlWzFdKQorICAgICAgICByZXR1cm4gVHJhY2ViYWNrKHNlbGYuX3RyYWNlWzJdKQogCiAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIHJldHVybiAoc2VsZi5fdHJhY2UgPT0gb3RoZXIuX3RyYWNlKQpAQCAtMjY2LDggKzI3MCw4IEBACiAgICAgICAgIHJldHVybiAiJXM6ICVzIiAlIChzZWxmLnRyYWNlYmFjaywgX2Zvcm1hdF9zaXplKHNlbGYuc2l6ZSwgRmFsc2UpKQogCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gKCI8VHJhY2Ugc2l6ZT0lcywgdHJhY2ViYWNrPSVyPiIKLSAgICAgICAgICAgICAgICAlIChfZm9ybWF0X3NpemUoc2VsZi5zaXplLCBGYWxzZSksIHNlbGYudHJhY2ViYWNrKSkKKyAgICAgICAgcmV0dXJuICgiPFRyYWNlIGRvbWFpbj0lcyBzaXplPSVzLCB0cmFjZWJhY2s9JXI+IgorICAgICAgICAgICAgICAgICUgKHNlbGYuZG9tYWluLCBfZm9ybWF0X3NpemUoc2VsZi5zaXplLCBGYWxzZSksIHNlbGYudHJhY2ViYWNrKSkKIAogCiBjbGFzcyBfVHJhY2VzKFNlcXVlbmNlKToKQEAgLTMwMiwxOSArMzA2LDI5IEBACiAgICAgcmV0dXJuIGZpbGVuYW1lCiAKIAotY2xhc3MgRmlsdGVyOgorY2xhc3MgQmFzZUZpbHRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5jbHVzaXZlKToKKyAgICAgICAgc2VsZi5pbmNsdXNpdmUgPSBpbmNsdXNpdmUKKworICAgIGRlZiBfbWF0Y2goc2VsZiwgdHJhY2UpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworY2xhc3MgRmlsdGVyKEJhc2VGaWx0ZXIpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmNsdXNpdmUsIGZpbGVuYW1lX3BhdHRlcm4sCi0gICAgICAgICAgICAgICAgIGxpbmVubz1Ob25lLCBhbGxfZnJhbWVzPUZhbHNlKToKKyAgICAgICAgICAgICAgICAgbGluZW5vPU5vbmUsIGFsbF9mcmFtZXM9RmFsc2UsIGRvbWFpbj1Ob25lKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhpbmNsdXNpdmUpCiAgICAgICAgIHNlbGYuaW5jbHVzaXZlID0gaW5jbHVzaXZlCiAgICAgICAgIHNlbGYuX2ZpbGVuYW1lX3BhdHRlcm4gPSBfbm9ybWFsaXplX2ZpbGVuYW1lKGZpbGVuYW1lX3BhdHRlcm4pCiAgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCiAgICAgICAgIHNlbGYuYWxsX2ZyYW1lcyA9IGFsbF9mcmFtZXMKKyAgICAgICAgc2VsZi5kb21haW4gPSBkb21haW4KIAogICAgIEBwcm9wZXJ0eQogICAgIGRlZiBmaWxlbmFtZV9wYXR0ZXJuKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW5hbWVfcGF0dGVybgogCi0gICAgZGVmIF9fbWF0Y2hfZnJhbWUoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgZGVmIF9tYXRjaF9mcmFtZV9pbXBsKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgogICAgICAgICBmaWxlbmFtZSA9IF9ub3JtYWxpemVfZmlsZW5hbWUoZmlsZW5hbWUpCiAgICAgICAgIGlmIG5vdCBmbm1hdGNoLmZubWF0Y2goZmlsZW5hbWUsIHNlbGYuX2ZpbGVuYW1lX3BhdHRlcm4pOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCkBAIC0zMjQsMTEgKzMzOCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIChsaW5lbm8gPT0gc2VsZi5saW5lbm8pCiAKICAgICBkZWYgX21hdGNoX2ZyYW1lKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgotICAgICAgICByZXR1cm4gc2VsZi5fX21hdGNoX2ZyYW1lKGZpbGVuYW1lLCBsaW5lbm8pIF4gKG5vdCBzZWxmLmluY2x1c2l2ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX21hdGNoX2ZyYW1lX2ltcGwoZmlsZW5hbWUsIGxpbmVubykgXiAobm90IHNlbGYuaW5jbHVzaXZlKQogCiAgICAgZGVmIF9tYXRjaF90cmFjZWJhY2soc2VsZiwgdHJhY2ViYWNrKToKICAgICAgICAgaWYgc2VsZi5hbGxfZnJhbWVzOgotICAgICAgICAgICAgaWYgYW55KHNlbGYuX19tYXRjaF9mcmFtZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgaWYgYW55KHNlbGYuX21hdGNoX2ZyYW1lX2ltcGwoZmlsZW5hbWUsIGxpbmVubykKICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUsIGxpbmVubyBpbiB0cmFjZWJhY2spOgogICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluY2x1c2l2ZQogICAgICAgICAgICAgZWxzZToKQEAgLTMzNyw2ICszNTEsMzAgQEAKICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm8gPSB0cmFjZWJhY2tbMF0KICAgICAgICAgICAgIHJldHVybiBzZWxmLl9tYXRjaF9mcmFtZShmaWxlbmFtZSwgbGluZW5vKQogCisgICAgZGVmIF9tYXRjaChzZWxmLCB0cmFjZSk6CisgICAgICAgIGRvbWFpbiwgc2l6ZSwgdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgcmVzID0gc2VsZi5fbWF0Y2hfdHJhY2ViYWNrKHRyYWNlYmFjaykKKyAgICAgICAgaWYgc2VsZi5kb21haW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmluY2x1c2l2ZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzIGFuZCAoZG9tYWluID09IHNlbGYuZG9tYWluKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzIG9yIChkb21haW4gIT0gc2VsZi5kb21haW4pCisgICAgICAgIHJldHVybiByZXMKKworCitjbGFzcyBEb21haW5GaWx0ZXIoQmFzZUZpbHRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluY2x1c2l2ZSwgZG9tYWluKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhpbmNsdXNpdmUpCisgICAgICAgIHNlbGYuX2RvbWFpbiA9IGRvbWFpbgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRvbWFpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvbWFpbgorCisgICAgZGVmIF9tYXRjaChzZWxmLCB0cmFjZSk6CisgICAgICAgIGRvbWFpbiwgc2l6ZSwgdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgcmV0dXJuIChkb21haW4gPT0gc2VsZi5kb21haW4pIF4gKG5vdCBzZWxmLmluY2x1c2l2ZSkKKwogCiBjbGFzcyBTbmFwc2hvdDoKICAgICAiIiIKQEAgLTM2NSwxMyArNDAzLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gcGlja2xlLmxvYWQoZnApCiAKICAgICBkZWYgX2ZpbHRlcl90cmFjZShzZWxmLCBpbmNsdWRlX2ZpbHRlcnMsIGV4Y2x1ZGVfZmlsdGVycywgdHJhY2UpOgotICAgICAgICB0cmFjZWJhY2sgPSB0cmFjZVsxXQogICAgICAgICBpZiBpbmNsdWRlX2ZpbHRlcnM6Ci0gICAgICAgICAgICBpZiBub3QgYW55KHRyYWNlX2ZpbHRlci5fbWF0Y2hfdHJhY2ViYWNrKHRyYWNlYmFjaykKKyAgICAgICAgICAgIGlmIG5vdCBhbnkodHJhY2VfZmlsdGVyLl9tYXRjaCh0cmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRyYWNlX2ZpbHRlciBpbiBpbmNsdWRlX2ZpbHRlcnMpOgogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBpZiBleGNsdWRlX2ZpbHRlcnM6Ci0gICAgICAgICAgICBpZiBhbnkobm90IHRyYWNlX2ZpbHRlci5fbWF0Y2hfdHJhY2ViYWNrKHRyYWNlYmFjaykKKyAgICAgICAgICAgIGlmIGFueShub3QgdHJhY2VfZmlsdGVyLl9tYXRjaCh0cmFjZSkKICAgICAgICAgICAgICAgICAgICBmb3IgdHJhY2VfZmlsdGVyIGluIGV4Y2x1ZGVfZmlsdGVycyk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIHJldHVybiBUcnVlCkBAIC0zNzksOCArNDE2LDggQEAKICAgICBkZWYgZmlsdGVyX3RyYWNlcyhzZWxmLCBmaWx0ZXJzKToKICAgICAgICAgIiIiCiAgICAgICAgIENyZWF0ZSBhIG5ldyBTbmFwc2hvdCBpbnN0YW5jZSB3aXRoIGEgZmlsdGVyZWQgdHJhY2VzIHNlcXVlbmNlLCBmaWx0ZXJzCi0gICAgICAgIGlzIGEgbGlzdCBvZiBGaWx0ZXIgaW5zdGFuY2VzLiAgSWYgZmlsdGVycyBpcyBhbiBlbXB0eSBsaXN0LCByZXR1cm4gYQotICAgICAgICBuZXcgU25hcHNob3QgaW5zdGFuY2Ugd2l0aCBhIGNvcHkgb2YgdGhlIHRyYWNlcy4KKyAgICAgICAgaXMgYSBsaXN0IG9mIEZpbHRlciBvciBEb21haW5GaWx0ZXIgaW5zdGFuY2VzLiAgSWYgZmlsdGVycyBpcyBhbiBlbXB0eQorICAgICAgICBsaXN0LCByZXR1cm4gYSBuZXcgU25hcHNob3QgaW5zdGFuY2Ugd2l0aCBhIGNvcHkgb2YgdGhlIHRyYWNlcy4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpbHRlcnMsIEl0ZXJhYmxlKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZmlsdGVycyBtdXN0IGJlIGEgbGlzdCBvZiBmaWx0ZXJzLCBub3QgJXMiCkBAIC00MTIsNyArNDQ5LDcgQEAKICAgICAgICAgdHJhY2ViYWNrcyA9IHt9CiAgICAgICAgIGlmIG5vdCBjdW11bGF0aXZlOgogICAgICAgICAgICAgZm9yIHRyYWNlIGluIHNlbGYudHJhY2VzLl90cmFjZXM6Ci0gICAgICAgICAgICAgICAgc2l6ZSwgdHJhY2VfdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgICAgICAgICBkb21haW4sIHNpemUsIHRyYWNlX3RyYWNlYmFjayA9IHRyYWNlCiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2tzW3RyYWNlX3RyYWNlYmFja10KICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CkBAIC00MzMsNyArNDcwLDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgY3VtdWxhdGl2ZSBzdGF0aXN0aWNzCiAgICAgICAgICAgICBmb3IgdHJhY2UgaW4gc2VsZi50cmFjZXMuX3RyYWNlczoKLSAgICAgICAgICAgICAgICBzaXplLCB0cmFjZV90cmFjZWJhY2sgPSB0cmFjZQorICAgICAgICAgICAgICAgIGRvbWFpbiwgc2l6ZSwgdHJhY2VfdHJhY2ViYWNrID0gdHJhY2UKICAgICAgICAgICAgICAgICBmb3IgZnJhbWUgaW4gdHJhY2VfdHJhY2ViYWNrOgogICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2tzW2ZyYW1lXQpkaWZmIC0tZ2l0IGEvTGliL3R1cnRsZWRlbW8vX19tYWluX18ucHkgYi9MaWIvdHVydGxlZGVtby9fX21haW5fXy5weQppbmRleCA3MTFkMGFiLi4wYTU4MzMyIDEwMDY0NAotLS0gYS9MaWIvdHVydGxlZGVtby9fX21haW5fXy5weQorKysgYi9MaWIvdHVydGxlZGVtby9fX21haW5fXy5weQpAQCAtODksMTMgKzg5LDEyIEBACiBpbXBvcnQgb3MKIAogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1mcm9tIGlkbGVsaWIuQ29sb3JEZWxlZ2F0b3IgaW1wb3J0IENvbG9yRGVsZWdhdG9yLCBjb2xvcl9jb25maWcKLWZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCi1mcm9tIGlkbGVsaWIudGV4dFZpZXcgaW1wb3J0IHZpZXdfdGV4dAorZnJvbSBpZGxlbGliLmNvbG9yaXplciBpbXBvcnQgQ29sb3JEZWxlZ2F0b3IsIGNvbG9yX2NvbmZpZworZnJvbSBpZGxlbGliLnBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKK2Zyb20gaWRsZWxpYi50ZXh0dmlldyBpbXBvcnQgdmlld190ZXh0CiBmcm9tIHR1cnRsZWRlbW8gaW1wb3J0IF9fZG9jX18gYXMgYWJvdXRfdHVydGxlZGVtbwogCiBpbXBvcnQgdHVydGxlCi1pbXBvcnQgdGltZQogCiBkZW1vX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKQogZGFyd2luID0gc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nCmRpZmYgLS1naXQgYS9MaWIvdHVydGxlZGVtby9ieXRlZGVzaWduLnB5IGIvTGliL3R1cnRsZWRlbW8vYnl0ZWRlc2lnbi5weQppbmRleCA2NGIxZDdkLi5iM2IwOTViIDEwMDc1NQotLS0gYS9MaWIvdHVydGxlZGVtby9ieXRlZGVzaWduLnB5CisrKyBiL0xpYi90dXJ0bGVkZW1vL2J5dGVkZXNpZ24ucHkKQEAgLTIyLDcgKzIyLDYgQEAKIG1vZGUgYXMgZmFzdCBhcyBwb3NzaWJsZS4KICIiIgogCi1pbXBvcnQgbWF0aAogZnJvbSB0dXJ0bGUgaW1wb3J0IFR1cnRsZSwgbWFpbmxvb3AKIGZyb20gdGltZSBpbXBvcnQgY2xvY2sKIApkaWZmIC0tZ2l0IGEvTGliL3R1cnRsZWRlbW8vcGxhbmV0X2FuZF9tb29uLnB5IGIvTGliL3R1cnRsZWRlbW8vcGxhbmV0X2FuZF9tb29uLnB5CmluZGV4IDI2YWJmZGIuLjAyMWZmOTkgMTAwNzU1Ci0tLSBhL0xpYi90dXJ0bGVkZW1vL3BsYW5ldF9hbmRfbW9vbi5weQorKysgYi9MaWIvdHVydGxlZGVtby9wbGFuZXRfYW5kX21vb24ucHkKQEAgLTE4LDcgKzE4LDYgQEAKIAogIiIiCiBmcm9tIHR1cnRsZSBpbXBvcnQgU2hhcGUsIFR1cnRsZSwgbWFpbmxvb3AsIFZlYzJEIGFzIFZlYwotZnJvbSB0aW1lIGltcG9ydCBzbGVlcAogCiBHID0gOAogCmRpZmYgLS1naXQgYS9MaWIvdHlwZXMucHkgYi9MaWIvdHlwZXMucHkKaW5kZXggNDg4OTFjZC4uZDhkODQ3MCAxMDA2NDQKLS0tIGEvTGliL3R5cGVzLnB5CisrKyBiL0xpYi90eXBlcy5weQpAQCAtMjQsNiArMjQsMTEgQEAKIENvcm91dGluZVR5cGUgPSB0eXBlKF9jKQogX2MuY2xvc2UoKSAgIyBQcmV2ZW50IFJlc291cmNlV2FybmluZwogCithc3luYyBkZWYgX2FnKCk6CisgICAgeWllbGQKK19hZyA9IF9hZygpCitBc3luY0dlbmVyYXRvclR5cGUgPSB0eXBlKF9hZykKKwogY2xhc3MgX0M6CiAgICAgZGVmIF9tKHNlbGYpOiBwYXNzCiBNZXRob2RUeXBlID0gdHlwZShfQygpLl9tKQpkaWZmIC0tZ2l0IGEvTGliL3R5cGluZy5weSBiL0xpYi90eXBpbmcucHkKaW5kZXggNTU3M2ExZi4uNmNlNzRmYyAxMDA2NDQKLS0tIGEvTGliL3R5cGluZy5weQorKysgYi9MaWIvdHlwaW5nLnB5CkBAIC02LDYgKzYsNyBAQAogaW1wb3J0IHJlIGFzIHN0ZGxpYl9yZSAgIyBBdm9pZCBjb25mdXNpb24gd2l0aCB0aGUgcmUgd2UgZXhwb3J0LgogaW1wb3J0IHN5cwogaW1wb3J0IHR5cGVzCisKIHRyeToKICAgICBpbXBvcnQgY29sbGVjdGlvbnMuYWJjIGFzIGNvbGxlY3Rpb25zX2FiYwogZXhjZXB0IEltcG9ydEVycm9yOgpAQCAtMTcsNiArMTgsNyBAQAogICAgICMgU3VwZXItc3BlY2lhbCB0eXBpbmcgcHJpbWl0aXZlcy4KICAgICAnQW55JywKICAgICAnQ2FsbGFibGUnLAorICAgICdDbGFzc1ZhcicsCiAgICAgJ0dlbmVyaWMnLAogICAgICdPcHRpb25hbCcsCiAgICAgJ1R1cGxlJywKQEAgLTI3MCw3ICsyNzIsNyBAQAogCiBkZWYgX2dldF90eXBlX3ZhcnModHlwZXMsIHR2YXJzKToKICAgICBmb3IgdCBpbiB0eXBlczoKLSAgICAgICAgaWYgaXNpbnN0YW5jZSh0LCBUeXBpbmdNZXRhKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0LCBUeXBpbmdNZXRhKSBvciBpc2luc3RhbmNlKHQsIF9DbGFzc1Zhcik6CiAgICAgICAgICAgICB0Ll9nZXRfdHlwZV92YXJzKHR2YXJzKQogCiAKQEAgLTI4MSw3ICsyODMsNyBAQAogCiAKIGRlZiBfZXZhbF90eXBlKHQsIGdsb2JhbG5zLCBsb2NhbG5zKToKLSAgICBpZiBpc2luc3RhbmNlKHQsIFR5cGluZ01ldGEpOgorICAgIGlmIGlzaW5zdGFuY2UodCwgVHlwaW5nTWV0YSkgb3IgaXNpbnN0YW5jZSh0LCBfQ2xhc3NWYXIpOgogICAgICAgICByZXR1cm4gdC5fZXZhbF90eXBlKGdsb2JhbG5zLCBsb2NhbG5zKQogICAgIGVsc2U6CiAgICAgICAgIHJldHVybiB0CkBAIC0xMTE0LDYgKzExMTYsNjcgQEAKICAgICAgICAgICAgIHJldHVybiBvYmoKIAogCitjbGFzcyBfQ2xhc3NWYXIobWV0YWNsYXNzPVR5cGluZ01ldGEsIF9yb290PVRydWUpOgorICAgICIiIlNwZWNpYWwgdHlwZSBjb25zdHJ1Y3QgdG8gbWFyayBjbGFzcyB2YXJpYWJsZXMuCisKKyAgICBBbiBhbm5vdGF0aW9uIHdyYXBwZWQgaW4gQ2xhc3NWYXIgaW5kaWNhdGVzIHRoYXQgYSBnaXZlbgorICAgIGF0dHJpYnV0ZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgY2xhc3MgdmFyaWFibGUgYW5kCisgICAgc2hvdWxkIG5vdCBiZSBzZXQgb24gaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MuIFVzYWdlOjoKKworICAgICAgY2xhc3MgU3RhcnNoaXA6CisgICAgICAgICAgc3RhdHM6IENsYXNzVmFyW0RpY3Rbc3RyLCBpbnRdXSA9IHt9ICMgY2xhc3MgdmFyaWFibGUKKyAgICAgICAgICBkYW1hZ2U6IGludCA9IDEwICAgICAgICAgICAgICAgICAgICAgIyBpbnN0YW5jZSB2YXJpYWJsZQorCisgICAgQ2xhc3NWYXIgYWNjZXB0cyBvbmx5IHR5cGVzIGFuZCBjYW5ub3QgYmUgZnVydGhlciBzdWJzY3JpYmVkLgorCisgICAgTm90ZSB0aGF0IENsYXNzVmFyIGlzIG5vdCBhIGNsYXNzIGl0c2VsZiwgYW5kIHNob3VsZCBub3QKKyAgICBiZSB1c2VkIHdpdGggaXNpbnN0YW5jZSgpIG9yIGlzc3ViY2xhc3MoKS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cD1Ob25lLCBfcm9vdD1GYWxzZSk6CisgICAgICAgIGNscyA9IHR5cGUoc2VsZikKKyAgICAgICAgaWYgX3Jvb3Q6CisgICAgICAgICAgICBzZWxmLl9fdHlwZV9fID0gdHAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2Fubm90IGluaXRpYWxpemUge30nLmZvcm1hdChjbHMuX19uYW1lX19bMTpdKSkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpdGVtKToKKyAgICAgICAgY2xzID0gdHlwZShzZWxmKQorICAgICAgICBpZiBzZWxmLl9fdHlwZV9fIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gY2xzKF90eXBlX2NoZWNrKGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICd7fSBhY2NlcHRzIG9ubHkgdHlwZXMuJy5mb3JtYXQoY2xzLl9fbmFtZV9fWzE6XSkpLAorICAgICAgICAgICAgICAgICAgICAgICBfcm9vdD1UcnVlKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3t9IGNhbm5vdCBiZSBmdXJ0aGVyIHN1YnNjcmlwdGVkJworICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChjbHMuX19uYW1lX19bMTpdKSkKKworICAgIGRlZiBfZXZhbF90eXBlKHNlbGYsIGdsb2JhbG5zLCBsb2NhbG5zKToKKyAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikoX2V2YWxfdHlwZShzZWxmLl9fdHlwZV9fLCBnbG9iYWxucywgbG9jYWxucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9yb290PVRydWUpCisKKyAgICBkZWYgX2dldF90eXBlX3ZhcnMoc2VsZiwgdHZhcnMpOgorICAgICAgICBpZiBzZWxmLl9fdHlwZV9fOgorICAgICAgICAgICAgX2dldF90eXBlX3ZhcnMoc2VsZi5fX3R5cGVfXywgdHZhcnMpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGNscyA9IHR5cGUoc2VsZikKKyAgICAgICAgaWYgbm90IHNlbGYuX190eXBlX186CisgICAgICAgICAgICByZXR1cm4gJ3t9Lnt9Jy5mb3JtYXQoY2xzLl9fbW9kdWxlX18sIGNscy5fX25hbWVfX1sxOl0pCisgICAgICAgIHJldHVybiAne30ue31be31dJy5mb3JtYXQoY2xzLl9fbW9kdWxlX18sIGNscy5fX25hbWVfX1sxOl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3R5cGVfcmVwcihzZWxmLl9fdHlwZV9fKSkKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goKHR5cGUoc2VsZikuX19uYW1lX18sIHNlbGYuX190eXBlX18pKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQ2xhc3NWYXIpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIGlmIHNlbGYuX190eXBlX18gaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3R5cGVfXyA9PSBvdGhlci5fX3R5cGVfXworICAgICAgICByZXR1cm4gc2VsZiBpcyBvdGhlcgorCitDbGFzc1ZhciA9IF9DbGFzc1Zhcihfcm9vdD1UcnVlKQorCisKIGRlZiBjYXN0KHR5cCwgdmFsKToKICAgICAiIiJDYXN0IGEgdmFsdWUgdG8gYSB0eXBlLgogCkBAIC0xMTQyLDEyICsxMjA1LDIwIEBACiAKIAogZGVmIGdldF90eXBlX2hpbnRzKG9iaiwgZ2xvYmFsbnM9Tm9uZSwgbG9jYWxucz1Ob25lKToKLSAgICAiIiJSZXR1cm4gdHlwZSBoaW50cyBmb3IgYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LgorICAgICIiIlJldHVybiB0eXBlIGhpbnRzIGZvciBhbiBvYmplY3QuCiAKICAgICBUaGlzIGlzIG9mdGVuIHRoZSBzYW1lIGFzIG9iai5fX2Fubm90YXRpb25zX18sIGJ1dCBpdCBoYW5kbGVzCiAgICAgZm9yd2FyZCByZWZlcmVuY2VzIGVuY29kZWQgYXMgc3RyaW5nIGxpdGVyYWxzLCBhbmQgaWYgbmVjZXNzYXJ5CiAgICAgYWRkcyBPcHRpb25hbFt0XSBpZiBhIGRlZmF1bHQgdmFsdWUgZXF1YWwgdG8gTm9uZSBpcyBzZXQuCiAKKyAgICBUaGUgYXJndW1lbnQgbWF5IGJlIGEgbW9kdWxlLCBjbGFzcywgbWV0aG9kLCBvciBmdW5jdGlvbi4gVGhlIGFubm90YXRpb25zCisgICAgYXJlIHJldHVybmVkIGFzIGEgZGljdGlvbmFyeSwgb3IgaW4gdGhlIGNhc2Ugb2YgYSBjbGFzcywgYSBDaGFpbk1hcCBvZgorICAgIGRpY3Rpb25hcmllcy4KKworICAgIFR5cGVFcnJvciBpcyByYWlzZWQgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBvZiBhIHR5cGUgdGhhdCBjYW4gY29udGFpbgorICAgIGFubm90YXRpb25zLCBhbmQgYW4gZW1wdHkgZGljdGlvbmFyeSBpcyByZXR1cm5lZCBpZiBubyBhbm5vdGF0aW9ucyBhcmUKKyAgICBwcmVzZW50LgorCiAgICAgQkVXQVJFIC0tIHRoZSBiZWhhdmlvciBvZiBnbG9iYWxucyBhbmQgbG9jYWxucyBpcyBjb3VudGVyaW50dWl0aXZlCiAgICAgKHVubGVzcyB5b3UgYXJlIGZhbWlsaWFyIHdpdGggaG93IGV2YWwoKSBhbmQgZXhlYygpIHdvcmspLiAgVGhlCiAgICAgc2VhcmNoIG9yZGVyIGlzIGxvY2FscyBmaXJzdCwgdGhlbiBnbG9iYWxzLgpAQCAtMTE2Miw2ICsxMjMzLDcgQEAKICAgICAtIElmIHR3byBkaWN0IGFyZ3VtZW50cyBhcmUgcGFzc2VkLCB0aGV5IHNwZWNpZnkgZ2xvYmFscyBhbmQKICAgICAgIGxvY2FscywgcmVzcGVjdGl2ZWx5LgogICAgICIiIgorCiAgICAgaWYgZ2V0YXR0cihvYmosICdfX25vX3R5cGVfY2hlY2tfXycsIE5vbmUpOgogICAgICAgICByZXR1cm4ge30KICAgICBpZiBnbG9iYWxucyBpcyBOb25lOgpAQCAtMTE3MCwxNiArMTI0Miw2MiBAQAogICAgICAgICAgICAgbG9jYWxucyA9IGdsb2JhbG5zCiAgICAgZWxpZiBsb2NhbG5zIGlzIE5vbmU6CiAgICAgICAgIGxvY2FsbnMgPSBnbG9iYWxucwotICAgIGRlZmF1bHRzID0gX2dldF9kZWZhdWx0cyhvYmopCi0gICAgaGludHMgPSBkaWN0KG9iai5fX2Fubm90YXRpb25zX18pCi0gICAgZm9yIG5hbWUsIHZhbHVlIGluIGhpbnRzLml0ZW1zKCk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cik6Ci0gICAgICAgICAgICB2YWx1ZSA9IF9Gb3J3YXJkUmVmKHZhbHVlKQotICAgICAgICB2YWx1ZSA9IF9ldmFsX3R5cGUodmFsdWUsIGdsb2JhbG5zLCBsb2NhbG5zKQotICAgICAgICBpZiBuYW1lIGluIGRlZmF1bHRzIGFuZCBkZWZhdWx0c1tuYW1lXSBpcyBOb25lOgotICAgICAgICAgICAgdmFsdWUgPSBPcHRpb25hbFt2YWx1ZV0KLSAgICAgICAgaGludHNbbmFtZV0gPSB2YWx1ZQotICAgIHJldHVybiBoaW50cworCisgICAgaWYgKGlzaW5zdGFuY2Uob2JqLCB0eXBlcy5GdW5jdGlvblR5cGUpIG9yCisgICAgICAgIGlzaW5zdGFuY2Uob2JqLCB0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlKSBvcgorICAgICAgICBpc2luc3RhbmNlKG9iaiwgdHlwZXMuTWV0aG9kVHlwZSkpOgorICAgICAgICBkZWZhdWx0cyA9IF9nZXRfZGVmYXVsdHMob2JqKQorICAgICAgICBoaW50cyA9IG9iai5fX2Fubm90YXRpb25zX18KKyAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGhpbnRzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdHlwZShOb25lKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IF9Gb3J3YXJkUmVmKHZhbHVlKQorICAgICAgICAgICAgdmFsdWUgPSBfZXZhbF90eXBlKHZhbHVlLCBnbG9iYWxucywgbG9jYWxucykKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gZGVmYXVsdHMgYW5kIGRlZmF1bHRzW25hbWVdIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBPcHRpb25hbFt2YWx1ZV0KKyAgICAgICAgICAgIGhpbnRzW25hbWVdID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIGhpbnRzCisKKyAgICBpZiBpc2luc3RhbmNlKG9iaiwgdHlwZXMuTW9kdWxlVHlwZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhpbnRzID0gb2JqLl9fYW5ub3RhdGlvbnNfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4ge30KKyAgICAgICAgIyB3ZSBrZWVwIG9ubHkgdGhvc2UgYW5ub3RhdGlvbnMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgb24gbW9kdWxlCisgICAgICAgIG1lbWJlcnMgPSBvYmouX19kaWN0X18KKyAgICAgICAgaGludHMgPSB7bmFtZTogdmFsdWUgZm9yIG5hbWUsIHZhbHVlIGluIGhpbnRzLml0ZW1zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gbWVtYmVyc30KKyAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGhpbnRzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdHlwZShOb25lKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IF9Gb3J3YXJkUmVmKHZhbHVlKQorICAgICAgICAgICAgdmFsdWUgPSBfZXZhbF90eXBlKHZhbHVlLCBnbG9iYWxucywgbG9jYWxucykKKyAgICAgICAgICAgIGhpbnRzW25hbWVdID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIGhpbnRzCisKKyAgICBpZiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZSk6CisgICAgICAgIGNtYXAgPSBOb25lCisgICAgICAgIGZvciBiYXNlIGluIHJldmVyc2VkKG9iai5fX21yb19fKToKKyAgICAgICAgICAgIG5ld19tYXAgPSBjb2xsZWN0aW9ucy5DaGFpbk1hcCBpZiBjbWFwIGlzIE5vbmUgZWxzZSBjbWFwLm5ld19jaGlsZAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGhpbnRzID0gYmFzZS5fX2RpY3RfX1snX19hbm5vdGF0aW9uc19fJ10KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjbWFwID0gbmV3X21hcCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBoaW50cy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0eXBlKE5vbmUpCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cik6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9Gb3J3YXJkUmVmKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9ldmFsX3R5cGUodmFsdWUsIGdsb2JhbG5zLCBsb2NhbG5zKQorICAgICAgICAgICAgICAgICAgICBoaW50c1tuYW1lXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgY21hcCA9IG5ld19tYXAoaGludHMpCisgICAgICAgIHJldHVybiBjbWFwCisKKyAgICByYWlzZSBUeXBlRXJyb3IoJ3shcn0gaXMgbm90IGEgbW9kdWxlLCBjbGFzcywgbWV0aG9kLCAnCisgICAgICAgICAgICAgICAgICAgICdvciBmdW5jdGlvbi4nLmZvcm1hdChvYmopKQogCiAKIGRlZiBub190eXBlX2NoZWNrKGFyZyk6CkBAIC0xMzAwLDYgKzE0MTgsOCBAQAogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIGlmIChub3QgYXR0ci5zdGFydHN3aXRoKCdfYWJjXycpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgIT0gJ19fYWJzdHJhY3RtZXRob2RzX18nIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgIT0gJ19fYW5ub3RhdGlvbnNfXycgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ciAhPSAnX193ZWFrcmVmX18nIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgIT0gJ19pc19wcm90b2NvbCcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ciAhPSAnX19kaWN0X18nIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgIT0gJ19fYXJnc19fJyBhbmQKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC9tb2NrLnB5IGIvTGliL3VuaXR0ZXN0L21vY2sucHkKaW5kZXggNjY5ODkwYS4uZWFhOWMzZCAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L21vY2sucHkKKysrIGIvTGliL3VuaXR0ZXN0L21vY2sucHkKQEAgLTYwLDE4ICs2MCw2IEBACiAgICAgKQogCiAKLWNsYXNzIF9zbG90dGVkKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydhJ10KLQotCi0jIERvIG5vdCB1c2UgdGhpcyB0dXBsZS4gIEl0IHdhcyBuZXZlciBkb2N1bWVudGVkIGFzIGEgcHVibGljIEFQSS4KLSMgSXQgd2lsbCBiZSByZW1vdmVkLiAgSXQgaGFzIG5vIG9idmlvdXMgc2lnbnMgb2YgdXNlcnMgb24gZ2l0aHViLgotRGVzY3JpcHRvclR5cGVzID0gKAotICAgIHR5cGUoX3Nsb3R0ZWQuYSksCi0gICAgcHJvcGVydHksCi0pCi0KLQogZGVmIF9nZXRfc2lnbmF0dXJlX29iamVjdChmdW5jLCBhc19pbnN0YW5jZSwgZWF0X3NlbGYpOgogICAgICIiIgogICAgIEdpdmVuIGFuIGFyYml0cmFyeSwgcG9zc2libHkgY2FsbGFibGUgb2JqZWN0LCB0cnkgdG8gY3JlYXRlIGEgc3VpdGFibGUKQEAgLTUyNSw3ICs1MTMsNyBAQAogICAgIHNpZGVfZWZmZWN0ID0gcHJvcGVydHkoX19nZXRfc2lkZV9lZmZlY3QsIF9fc2V0X3NpZGVfZWZmZWN0KQogCiAKLSAgICBkZWYgcmVzZXRfbW9jayhzZWxmLCB2aXNpdGVkPU5vbmUpOgorICAgIGRlZiByZXNldF9tb2NrKHNlbGYsICB2aXNpdGVkPU5vbmUsKiwgcmV0dXJuX3ZhbHVlPUZhbHNlLCBzaWRlX2VmZmVjdD1GYWxzZSk6CiAgICAgICAgICJSZXN0b3JlIHRoZSBtb2NrIG9iamVjdCB0byBpdHMgaW5pdGlhbCBzdGF0ZS4iCiAgICAgICAgIGlmIHZpc2l0ZWQgaXMgTm9uZToKICAgICAgICAgICAgIHZpc2l0ZWQgPSBbXQpAQCAtNTQwLDYgKzUyOCwxMSBAQAogICAgICAgICBzZWxmLmNhbGxfYXJnc19saXN0ID0gX0NhbGxMaXN0KCkKICAgICAgICAgc2VsZi5tZXRob2RfY2FsbHMgPSBfQ2FsbExpc3QoKQogCisgICAgICAgIGlmIHJldHVybl92YWx1ZToKKyAgICAgICAgICAgIHNlbGYuX21vY2tfcmV0dXJuX3ZhbHVlID0gREVGQVVMVAorICAgICAgICBpZiBzaWRlX2VmZmVjdDoKKyAgICAgICAgICAgIHNlbGYuX21vY2tfc2lkZV9lZmZlY3QgPSBOb25lCisKICAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuX21vY2tfY2hpbGRyZW4udmFsdWVzKCk6CiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNoaWxkLCBfU3BlY1N0YXRlKToKICAgICAgICAgICAgICAgICBjb250aW51ZQpAQCAtNzc0LDYgKzc2NywyNCBAQAogICAgICAgICAgICAgICAgICAgIChzZWxmLl9tb2NrX25hbWUgb3IgJ21vY2snLCBzZWxmLmNhbGxfY291bnQpKQogICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IobXNnKQogCisgICAgZGVmIGFzc2VydF9jYWxsZWQoX21vY2tfc2VsZik6CisgICAgICAgICIiImFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgYXQgbGVhc3Qgb25jZQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZiA9IF9tb2NrX3NlbGYKKyAgICAgICAgaWYgc2VsZi5jYWxsX2NvdW50ID09IDA6CisgICAgICAgICAgICBtc2cgPSAoIkV4cGVjdGVkICclcycgdG8gaGF2ZSBiZWVuIGNhbGxlZC4iICUKKyAgICAgICAgICAgICAgICAgICBzZWxmLl9tb2NrX25hbWUgb3IgJ21vY2snKQorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IobXNnKQorCisgICAgZGVmIGFzc2VydF9jYWxsZWRfb25jZShfbW9ja19zZWxmKToKKyAgICAgICAgIiIiYXNzZXJ0IHRoYXQgdGhlIG1vY2sgd2FzIGNhbGxlZCBvbmx5IG9uY2UuCisgICAgICAgICIiIgorICAgICAgICBzZWxmID0gX21vY2tfc2VsZgorICAgICAgICBpZiBub3Qgc2VsZi5jYWxsX2NvdW50ID09IDE6CisgICAgICAgICAgICBtc2cgPSAoIkV4cGVjdGVkICclcycgdG8gaGF2ZSBiZWVuIGNhbGxlZCBvbmNlLiBDYWxsZWQgJXMgdGltZXMuIiAlCisgICAgICAgICAgICAgICAgICAgKHNlbGYuX21vY2tfbmFtZSBvciAnbW9jaycsIHNlbGYuY2FsbF9jb3VudCkpCisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcihtc2cpCisKICAgICBkZWYgYXNzZXJ0X2NhbGxlZF93aXRoKF9tb2NrX3NlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICIiImFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy4KIApAQCAtODIyLDcgKzgzMyw3IEBACiAgICAgICAgICAgICBpZiBleHBlY3RlZCBub3QgaW4gYWxsX2NhbGxzOgogICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAnQ2FsbHMgbm90IGZvdW5kLlxuRXhwZWN0ZWQ6ICVyXG4nCi0gICAgICAgICAgICAgICAgICAgICdBY3R1YWw6ICVyJyAlIChjYWxscywgc2VsZi5tb2NrX2NhbGxzKQorICAgICAgICAgICAgICAgICAgICAnQWN0dWFsOiAlcicgJSAoX0NhbGxMaXN0KGNhbGxzKSwgc2VsZi5tb2NrX2NhbGxzKQogICAgICAgICAgICAgICAgICkgZnJvbSBjYXVzZQogICAgICAgICAgICAgcmV0dXJuCiAKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC9ydW5uZXIucHkgYi9MaWIvdW5pdHRlc3QvcnVubmVyLnB5CmluZGV4IDIxMTIyNjIuLjJjNWVhNGEgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC9ydW5uZXIucHkKKysrIGIvTGliL3VuaXR0ZXN0L3J1bm5lci5weQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAgICAgICAgICAgICAgICAgaWYgc2VsZi53YXJuaW5ncyBpbiBbJ2RlZmF1bHQnLCAnYWx3YXlzJ106CiAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdtb2R1bGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdQbGVhc2UgdXNlIGFzc2VydFx3KyBpbnN0ZWFkLicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT1yJ1BsZWFzZSB1c2UgYXNzZXJ0XHcrIGluc3RlYWQuJykKICAgICAgICAgICAgIHN0YXJ0VGltZSA9IHRpbWUudGltZSgpCiAgICAgICAgICAgICBzdGFydFRlc3RSdW4gPSBnZXRhdHRyKHJlc3VsdCwgJ3N0YXJ0VGVzdFJ1bicsIE5vbmUpCiAgICAgICAgICAgICBpZiBzdGFydFRlc3RSdW4gaXMgbm90IE5vbmU6CmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X2Fzc2VydGlvbnMucHkgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X2Fzc2VydGlvbnMucHkKaW5kZXggZTZlMmJjMi4uMWIwZTgzMyAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9hc3NlcnRpb25zLnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfYXNzZXJ0aW9ucy5weQpAQCAtMjQwLDcgKzI0MCw3IEBACiAgICAgICAgICMgRXJyb3IgbWVzc2FnZXMgYXJlIG11bHRpbGluZSBzbyBub3QgdGVzdGluZyBvbiBmdWxsIG1lc3NhZ2UKICAgICAgICAgIyBhc3NlcnRUdXBsZUVxdWFsIGFuZCBhc3NlcnRMaXN0RXF1YWwgZGVsZWdhdGUgdG8gdGhpcyBtZXRob2QKICAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0U2VxdWVuY2VFcXVhbCcsIChbXSwgW05vbmVdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIlwrIFxbTm9uZVxdJCIsICJeb29wcyQiLCByIlwrIFxbTm9uZVxdJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiXCsgXFtOb25lXF0kIiwgIl5vb3BzJCIsIHIiXCsgXFtOb25lXF0kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJcKyBcW05vbmVcXSA6IG9vcHMkIl0pCiAKICAgICBkZWYgdGVzdEFzc2VydFNldEVxdWFsKHNlbGYpOgpAQCAtMjUwLDIxICsyNTAsMjEgQEAKIAogICAgIGRlZiB0ZXN0QXNzZXJ0SW4oc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydEluJywgKE5vbmUsIFtdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ15Ob25lIG5vdCBmb3VuZCBpbiBcW1xdJCcsICJeb29wcyQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXk5vbmUgbm90IGZvdW5kIGluIFxbXF0kJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ15Ob25lIG5vdCBmb3VuZCBpbiBcW1xdIDogb29wcyQnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcideTm9uZSBub3QgZm91bmQgaW4gXFtcXSQnLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcideTm9uZSBub3QgZm91bmQgaW4gXFtcXSQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ15Ob25lIG5vdCBmb3VuZCBpbiBcW1xdIDogb29wcyQnXSkKIAogICAgIGRlZiB0ZXN0QXNzZXJ0Tm90SW4oc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydE5vdEluJywgKE5vbmUsIFtOb25lXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydeTm9uZSB1bmV4cGVjdGVkbHkgZm91bmQgaW4gXFtOb25lXF0kJywgIl5vb3BzJCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeTm9uZSB1bmV4cGVjdGVkbHkgZm91bmQgaW4gXFtOb25lXF0kJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ15Ob25lIHVuZXhwZWN0ZWRseSBmb3VuZCBpbiBcW05vbmVcXSA6IG9vcHMkJ10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3InXk5vbmUgdW5leHBlY3RlZGx5IGZvdW5kIGluIFxbTm9uZVxdJCcsICJeb29wcyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ15Ob25lIHVuZXhwZWN0ZWRseSBmb3VuZCBpbiBcW05vbmVcXSQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ15Ob25lIHVuZXhwZWN0ZWRseSBmb3VuZCBpbiBcW05vbmVcXSA6IG9vcHMkJ10pCiAKICAgICBkZWYgdGVzdEFzc2VydERpY3RFcXVhbChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0RGljdEVxdWFsJywgKHt9LCB7J2tleSc6ICd2YWx1ZSd9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJcKyBceydrZXknOiAndmFsdWUnXH0kIiwgIl5vb3BzJCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcKyBceydrZXknOiAndmFsdWUnXH0kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwrIFx7J2tleSc6ICd2YWx1ZSdcfSA6IG9vcHMkIl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiXCsgXHsna2V5JzogJ3ZhbHVlJ1x9JCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiXCsgXHsna2V5JzogJ3ZhbHVlJ1x9IDogb29wcyQiXSkKIAogICAgIGRlZiB0ZXN0QXNzZXJ0RGljdENvbnRhaW5zU3Vic2V0KHNlbGYpOgogICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X2xvYWRlci5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5CmluZGV4IDRiOTc4ODIuLmIyZjljODggMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5CkBAIC0zOTAsNyArMzkwLDcgQEAKICAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ2FiYyAoKSAvLycpCiAgICAgICAgIGVycm9yLCB0ZXN0ID0gc2VsZi5jaGVja19kZWZlcnJlZF9lcnJvcihsb2FkZXIsIHN1aXRlKQogICAgICAgICBleHBlY3RlZCA9ICJGYWlsZWQgdG8gaW1wb3J0IHRlc3QgbW9kdWxlOiBhYmMgKCkgLy8iCi0gICAgICAgIGV4cGVjdGVkX3JlZ2V4ID0gIkZhaWxlZCB0byBpbXBvcnQgdGVzdCBtb2R1bGU6IGFiYyBcKFwpIC8vIgorICAgICAgICBleHBlY3RlZF9yZWdleCA9IHIiRmFpbGVkIHRvIGltcG9ydCB0ZXN0IG1vZHVsZTogYWJjIFwoXCkgLy8iCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgICBleHBlY3RlZCwgZXJyb3IsCiAgICAgICAgICAgICAnbWlzc2luZyBlcnJvciBzdHJpbmcgaW4gJXInICUgZXJyb3IpCkBAIC01MDIsNyArNTAyLDcgQEAKICAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ2FiYyAoKSAvLycsIHVuaXR0ZXN0KQogICAgICAgICBlcnJvciwgdGVzdCA9IHNlbGYuY2hlY2tfZGVmZXJyZWRfZXJyb3IobG9hZGVyLCBzdWl0ZSkKICAgICAgICAgZXhwZWN0ZWQgPSAibW9kdWxlICd1bml0dGVzdCcgaGFzIG5vIGF0dHJpYnV0ZSAnYWJjICgpIC8vJyIKLSAgICAgICAgZXhwZWN0ZWRfcmVnZXggPSAibW9kdWxlICd1bml0dGVzdCcgaGFzIG5vIGF0dHJpYnV0ZSAnYWJjIFwoXCkgLy8nIgorICAgICAgICBleHBlY3RlZF9yZWdleCA9IHIibW9kdWxlICd1bml0dGVzdCcgaGFzIG5vIGF0dHJpYnV0ZSAnYWJjIFwoXCkgLy8nIgogICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAgZXhwZWN0ZWQsIGVycm9yLAogICAgICAgICAgICAgJ21pc3NpbmcgZXJyb3Igc3RyaW5nIGluICVyJyAlIGVycm9yKQpAQCAtODA5LDcgKzgwOSw3IEBACiAgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ2FiYyAoKSAvLyddKQogICAgICAgICBlcnJvciwgdGVzdCA9IHNlbGYuY2hlY2tfZGVmZXJyZWRfZXJyb3IobG9hZGVyLCBsaXN0KHN1aXRlKVswXSkKICAgICAgICAgZXhwZWN0ZWQgPSAiRmFpbGVkIHRvIGltcG9ydCB0ZXN0IG1vZHVsZTogYWJjICgpIC8vIgotICAgICAgICBleHBlY3RlZF9yZWdleCA9ICJGYWlsZWQgdG8gaW1wb3J0IHRlc3QgbW9kdWxlOiBhYmMgXChcKSAvLyIKKyAgICAgICAgZXhwZWN0ZWRfcmVnZXggPSByIkZhaWxlZCB0byBpbXBvcnQgdGVzdCBtb2R1bGU6IGFiYyBcKFwpIC8vIgogICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAgZXhwZWN0ZWQsICBlcnJvciwKICAgICAgICAgICAgICdtaXNzaW5nIGVycm9yIHN0cmluZyBpbiAlcicgJSBlcnJvcikKQEAgLTkyOCw3ICs5MjgsNyBAQAogICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWydhYmMgKCkgLy8nXSwgdW5pdHRlc3QpCiAgICAgICAgIGVycm9yLCB0ZXN0ID0gc2VsZi5jaGVja19kZWZlcnJlZF9lcnJvcihsb2FkZXIsIGxpc3Qoc3VpdGUpWzBdKQogICAgICAgICBleHBlY3RlZCA9ICJtb2R1bGUgJ3VuaXR0ZXN0JyBoYXMgbm8gYXR0cmlidXRlICdhYmMgKCkgLy8nIgotICAgICAgICBleHBlY3RlZF9yZWdleCA9ICJtb2R1bGUgJ3VuaXR0ZXN0JyBoYXMgbm8gYXR0cmlidXRlICdhYmMgXChcKSAvLyciCisgICAgICAgIGV4cGVjdGVkX3JlZ2V4ID0gciJtb2R1bGUgJ3VuaXR0ZXN0JyBoYXMgbm8gYXR0cmlidXRlICdhYmMgXChcKSAvLyciCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgICBleHBlY3RlZCwgZXJyb3IsCiAgICAgICAgICAgICAnbWlzc2luZyBlcnJvciBzdHJpbmcgaW4gJXInICUgZXJyb3IpCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay9zdXBwb3J0LnB5IGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svc3VwcG9ydC5weQppbmRleCBmNDczODc5Li4yMDU0MzFhIDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay9zdXBwb3J0LnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3N1cHBvcnQucHkKQEAgLTEsNSArMSwzIEBACi1pbXBvcnQgc3lzCi0KIGRlZiBpc19pbnN0YW5jZShvYmosIGtsYXNzKToKICAgICAiIiJWZXJzaW9uIG9mIGlzX2luc3RhbmNlIHRoYXQgZG9lc24ndCBhY2Nlc3MgX19jbGFzc19fIiIiCiAgICAgcmV0dXJuIGlzc3ViY2xhc3ModHlwZShvYmopLCBrbGFzcykKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RtYWdpY21ldGhvZHMucHkgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0bWFnaWNtZXRob2RzLnB5CmluZGV4IGJiOWI5NTYuLjI0NTY5YjUgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RtYWdpY21ldGhvZHMucHkKKysrIGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1hZ2ljbWV0aG9kcy5weQpAQCAtMSw1ICsxLDQgQEAKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IGluc3BlY3QKIGltcG9ydCBzeXMKIGZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgTW9jaywgTWFnaWNNb2NrLCBfbWFnaWNzCiAKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3Rtb2NrLnB5IGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1vY2sucHkKaW5kZXggNWY4MmI4Mi4uYjA3YTdjYyAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1vY2sucHkKKysrIGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1vY2sucHkKQEAgLTEyMzksNiArMTIzOSwyNyBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKICAgICAgICAgICAgIG0uaGVsbG8uYXNzZXJ0X25vdF9jYWxsZWQoKQogCisgICAgZGVmIHRlc3RfYXNzZXJ0X2NhbGxlZChzZWxmKToKKyAgICAgICAgbSA9IE1vY2soKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgIG0uaGVsbG8uYXNzZXJ0X2NhbGxlZCgpCisgICAgICAgIG0uaGVsbG8oKQorICAgICAgICBtLmhlbGxvLmFzc2VydF9jYWxsZWQoKQorCisgICAgICAgIG0uaGVsbG8oKQorICAgICAgICBtLmhlbGxvLmFzc2VydF9jYWxsZWQoKQorCisgICAgZGVmIHRlc3RfYXNzZXJ0X2NhbGxlZF9vbmNlKHNlbGYpOgorICAgICAgICBtID0gTW9jaygpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgbS5oZWxsby5hc3NlcnRfY2FsbGVkX29uY2UoKQorICAgICAgICBtLmhlbGxvKCkKKyAgICAgICAgbS5oZWxsby5hc3NlcnRfY2FsbGVkX29uY2UoKQorCisgICAgICAgIG0uaGVsbG8oKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgIG0uaGVsbG8uYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKwogICAgICNJc3N1ZTIxMjU2IHByaW50b3V0IG9mIGtleXdvcmQgYXJncyBzaG91bGQgYmUgaW4gZGV0ZXJtaW5pc3RpYyBvcmRlcgogICAgIGRlZiB0ZXN0X3NvcnRlZF9jYWxsX3NpZ25hdHVyZShzZWxmKToKICAgICAgICAgbSA9IE1vY2soKQpAQCAtMTI1Niw2ICsxMjc3LDI0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5tZXRob2RfY2FsbHNbMF0sIGMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5tZXRob2RfY2FsbHNbMV0sIGkpCiAKKyAgICBkZWYgdGVzdF9yZXNldF9yZXR1cm5fc2lkZWVmZmVjdChzZWxmKToKKyAgICAgICAgbSA9IE1vY2socmV0dXJuX3ZhbHVlPTEwLCBzaWRlX2VmZmVjdD1bMiwzXSkKKyAgICAgICAgbS5yZXNldF9tb2NrKHJldHVybl92YWx1ZT1UcnVlLCBzaWRlX2VmZmVjdD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobS5yZXR1cm5fdmFsdWUsIE1vY2spCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5zaWRlX2VmZmVjdCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3Jlc2V0X3JldHVybihzZWxmKToKKyAgICAgICAgbSA9IE1vY2socmV0dXJuX3ZhbHVlPTEwLCBzaWRlX2VmZmVjdD1bMiwzXSkKKyAgICAgICAgbS5yZXNldF9tb2NrKHJldHVybl92YWx1ZT1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobS5yZXR1cm5fdmFsdWUsIE1vY2spCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobS5zaWRlX2VmZmVjdCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3Jlc2V0X3NpZGVlZmZlY3Qoc2VsZik6CisgICAgICAgIG0gPSBNb2NrKHJldHVybl92YWx1ZT0xMCwgc2lkZV9lZmZlY3Q9WzIsM10pCisgICAgICAgIG0ucmVzZXRfbW9jayhzaWRlX2VmZmVjdD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmV0dXJuX3ZhbHVlLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnNpZGVfZWZmZWN0LCBOb25lKQorCiAgICAgZGVmIHRlc3RfbW9ja19hZGRfc3BlYyhzZWxmKToKICAgICAgICAgY2xhc3MgX09uZShvYmplY3QpOgogICAgICAgICAgICAgb25lID0gMQpkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdHBhdGNoLnB5IGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdHBhdGNoLnB5CmluZGV4IGRmY2UzNjkuLjJlMGMwOGYgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RwYXRjaC5weQorKysgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0cGF0Y2gucHkKQEAgLTEwLDkgKzEwLDkgQEAKIGZyb20gdW5pdHRlc3QudGVzdC50ZXN0bW9jay5zdXBwb3J0IGltcG9ydCBTb21lQ2xhc3MsIGlzX2luc3RhbmNlCiAKIGZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgKAotICAgIE5vbkNhbGxhYmxlTW9jaywgQ2FsbGFibGVNaXhpbiwgcGF0Y2gsIHNlbnRpbmVsLAorICAgIE5vbkNhbGxhYmxlTW9jaywgQ2FsbGFibGVNaXhpbiwgc2VudGluZWwsCiAgICAgTWFnaWNNb2NrLCBNb2NrLCBOb25DYWxsYWJsZU1hZ2ljTW9jaywgcGF0Y2gsIF9wYXRjaCwKLSAgICBERUZBVUxULCBjYWxsLCBfZ2V0X3RhcmdldCwgX3BhdGNoCisgICAgREVGQVVMVCwgY2FsbCwgX2dldF90YXJnZXQKICkKIAogCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliL3BhcnNlLnB5IGIvTGliL3VybGxpYi9wYXJzZS5weQppbmRleCA0ZDdmY2VjLi45OWE2OTc3IDEwMDY0NAotLS0gYS9MaWIvdXJsbGliL3BhcnNlLnB5CisrKyBiL0xpYi91cmxsaWIvcGFyc2UucHkKQEAgLTE1Niw5ICsxNTYsOCBAQAogICAgICAgICBwb3J0ID0gc2VsZi5faG9zdGluZm9bMV0KICAgICAgICAgaWYgcG9ydCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHBvcnQgPSBpbnQocG9ydCwgMTApCi0gICAgICAgICAgICAjIFJldHVybiBOb25lIG9uIGFuIGlsbGVnYWwgcG9ydAogICAgICAgICAgICAgaWYgbm90ICggMCA8PSBwb3J0IDw9IDY1NTM1KToKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlBvcnQgb3V0IG9mIHJhbmdlIDAtNjU1MzUiKQogICAgICAgICByZXR1cm4gcG9ydAogCiAKQEAgLTIyNSw4ICsyMjQsNzEgQEAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKIAogX0RlZnJhZ1Jlc3VsdEJhc2UgPSBuYW1lZHR1cGxlKCdEZWZyYWdSZXN1bHQnLCAndXJsIGZyYWdtZW50JykKLV9TcGxpdFJlc3VsdEJhc2UgPSBuYW1lZHR1cGxlKCdTcGxpdFJlc3VsdCcsICdzY2hlbWUgbmV0bG9jIHBhdGggcXVlcnkgZnJhZ21lbnQnKQotX1BhcnNlUmVzdWx0QmFzZSA9IG5hbWVkdHVwbGUoJ1BhcnNlUmVzdWx0JywgJ3NjaGVtZSBuZXRsb2MgcGF0aCBwYXJhbXMgcXVlcnkgZnJhZ21lbnQnKQorX1NwbGl0UmVzdWx0QmFzZSA9IG5hbWVkdHVwbGUoCisgICAgJ1NwbGl0UmVzdWx0JywgJ3NjaGVtZSBuZXRsb2MgcGF0aCBxdWVyeSBmcmFnbWVudCcpCitfUGFyc2VSZXN1bHRCYXNlID0gbmFtZWR0dXBsZSgKKyAgICAnUGFyc2VSZXN1bHQnLCAnc2NoZW1lIG5ldGxvYyBwYXRoIHBhcmFtcyBxdWVyeSBmcmFnbWVudCcpCisKK19EZWZyYWdSZXN1bHRCYXNlLl9fZG9jX18gPSAiIiIKK0RlZnJhZ1Jlc3VsdCh1cmwsIGZyYWdtZW50KQorCitBIDItdHVwbGUgdGhhdCBjb250YWlucyB0aGUgdXJsIHdpdGhvdXQgZnJhZ21lbnQgaWRlbnRpZmllciBhbmQgdGhlIGZyYWdtZW50CitpZGVudGlmaWVyIGFzIGEgc2VwYXJhdGUgYXJndW1lbnQuCisiIiIKKworX0RlZnJhZ1Jlc3VsdEJhc2UudXJsLl9fZG9jX18gPSAiIiJUaGUgVVJMIHdpdGggbm8gZnJhZ21lbnQgaWRlbnRpZmllci4iIiIKKworX0RlZnJhZ1Jlc3VsdEJhc2UuZnJhZ21lbnQuX19kb2NfXyA9ICIiIgorRnJhZ21lbnQgaWRlbnRpZmllciBzZXBhcmF0ZWQgZnJvbSBVUkwsIHRoYXQgYWxsb3dzIGluZGlyZWN0IGlkZW50aWZpY2F0aW9uIG9mIGEKK3NlY29uZGFyeSByZXNvdXJjZSBieSByZWZlcmVuY2UgdG8gYSBwcmltYXJ5IHJlc291cmNlIGFuZCBhZGRpdGlvbmFsIGlkZW50aWZ5aW5nCitpbmZvcm1hdGlvbi4KKyIiIgorCitfU3BsaXRSZXN1bHRCYXNlLl9fZG9jX18gPSAiIiIKK1NwbGl0UmVzdWx0KHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpCisKK0EgNS10dXBsZSB0aGF0IGNvbnRhaW5zIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cyBvZiBhIFVSTC4gU2ltaWxhciB0bworUGFyc2VSZXN1bHQsIGJ1dCBkb2VzIG5vdCBzcGxpdCBwYXJhbXMuCisiIiIKKworX1NwbGl0UmVzdWx0QmFzZS5zY2hlbWUuX19kb2NfXyA9ICIiIlNwZWNpZmllcyBVUkwgc2NoZW1lIGZvciB0aGUgcmVxdWVzdC4iIiIKKworX1NwbGl0UmVzdWx0QmFzZS5uZXRsb2MuX19kb2NfXyA9ICIiIgorTmV0d29yayBsb2NhdGlvbiB3aGVyZSB0aGUgcmVxdWVzdCBpcyBtYWRlIHRvLgorIiIiCisKK19TcGxpdFJlc3VsdEJhc2UucGF0aC5fX2RvY19fID0gIiIiCitUaGUgaGllcmFyY2hpY2FsIHBhdGgsIHN1Y2ggYXMgdGhlIHBhdGggdG8gYSBmaWxlIHRvIGRvd25sb2FkLgorIiIiCisKK19TcGxpdFJlc3VsdEJhc2UucXVlcnkuX19kb2NfXyA9ICIiIgorVGhlIHF1ZXJ5IGNvbXBvbmVudCwgdGhhdCBjb250YWlucyBub24taGllcmFyY2hpY2FsIGRhdGEsIHRoYXQgYWxvbmcgd2l0aCBkYXRhCitpbiBwYXRoIGNvbXBvbmVudCwgaWRlbnRpZmllcyBhIHJlc291cmNlIGluIHRoZSBzY29wZSBvZiBVUkkncyBzY2hlbWUgYW5kCituZXR3b3JrIGxvY2F0aW9uLgorIiIiCisKK19TcGxpdFJlc3VsdEJhc2UuZnJhZ21lbnQuX19kb2NfXyA9ICIiIgorRnJhZ21lbnQgaWRlbnRpZmllciwgdGhhdCBhbGxvd3MgaW5kaXJlY3QgaWRlbnRpZmljYXRpb24gb2YgYSBzZWNvbmRhcnkgcmVzb3VyY2UKK2J5IHJlZmVyZW5jZSB0byBhIHByaW1hcnkgcmVzb3VyY2UgYW5kIGFkZGl0aW9uYWwgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uCisiIiIKKworX1BhcnNlUmVzdWx0QmFzZS5fX2RvY19fID0gIiIiCitQYXJzZVJlc3VsdChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCAgcXVlcnksIGZyYWdtZW50KQorCitBIDYtdHVwbGUgdGhhdCBjb250YWlucyBjb21wb25lbnRzIG9mIGEgcGFyc2VkIFVSTC4KKyIiIgorCitfUGFyc2VSZXN1bHRCYXNlLnNjaGVtZS5fX2RvY19fID0gX1NwbGl0UmVzdWx0QmFzZS5zY2hlbWUuX19kb2NfXworX1BhcnNlUmVzdWx0QmFzZS5uZXRsb2MuX19kb2NfXyA9IF9TcGxpdFJlc3VsdEJhc2UubmV0bG9jLl9fZG9jX18KK19QYXJzZVJlc3VsdEJhc2UucGF0aC5fX2RvY19fID0gX1NwbGl0UmVzdWx0QmFzZS5wYXRoLl9fZG9jX18KK19QYXJzZVJlc3VsdEJhc2UucGFyYW1zLl9fZG9jX18gPSAiIiIKK1BhcmFtZXRlcnMgZm9yIGxhc3QgcGF0aCBlbGVtZW50IHVzZWQgdG8gZGVyZWZlcmVuY2UgdGhlIFVSSSBpbiBvcmRlciB0byBwcm92aWRlCithY2Nlc3MgdG8gcGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvbiB0aGUgcmVzb3VyY2UuCisiIiIKKworX1BhcnNlUmVzdWx0QmFzZS5xdWVyeS5fX2RvY19fID0gX1NwbGl0UmVzdWx0QmFzZS5xdWVyeS5fX2RvY19fCitfUGFyc2VSZXN1bHRCYXNlLmZyYWdtZW50Ll9fZG9jX18gPSBfU3BsaXRSZXN1bHRCYXNlLmZyYWdtZW50Ll9fZG9jX18KKwogCiAjIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYWxpYXMgX05ldGxvY1Jlc3VsdE1peGluU3RyCiAjIFJlc3VsdEJhc2UgaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGRvY3VtZW50ZWQgQVBJLCBidXQgaXQgaXMKZGlmZiAtLWdpdCBhL0xpYi91cmxsaWIvcmVxdWVzdC5weSBiL0xpYi91cmxsaWIvcmVxdWVzdC5weQppbmRleCAzYmUzMjdkLi4zMGJmNmUwIDEwMDY0NAotLS0gYS9MaWIvdXJsbGliL3JlcXVlc3QucHkKKysrIGIvTGliL3VybGxpYi9yZXF1ZXN0LnB5CkBAIC0xMzQsMTEgKzEzNCw2OCBAQAogXQogCiAjIHVzZWQgaW4gVXNlci1BZ2VudCBoZWFkZXIgc2VudAotX192ZXJzaW9uX18gPSBzeXMudmVyc2lvbls6M10KK19fdmVyc2lvbl9fID0gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiAKIF9vcGVuZXIgPSBOb25lCiBkZWYgdXJsb3Blbih1cmwsIGRhdGE9Tm9uZSwgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQsCiAgICAgICAgICAgICAqLCBjYWZpbGU9Tm9uZSwgY2FwYXRoPU5vbmUsIGNhZGVmYXVsdD1GYWxzZSwgY29udGV4dD1Ob25lKToKKyAgICAnJydPcGVuIHRoZSBVUkwgdXJsLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgUmVxdWVzdCBvYmplY3QuCisKKyAgICAqZGF0YSogbXVzdCBiZSBhbiBvYmplY3Qgc3BlY2lmeWluZyBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgc2VudCB0bworICAgIHRoZSBzZXJ2ZXIsIG9yIE5vbmUgaWYgbm8gc3VjaCBkYXRhIGlzIG5lZWRlZC4gIFNlZSBSZXF1ZXN0IGZvcgorICAgIGRldGFpbHMuCisKKyAgICB1cmxsaWIucmVxdWVzdCBtb2R1bGUgdXNlcyBIVFRQLzEuMSBhbmQgaW5jbHVkZXMgYSAiQ29ubmVjdGlvbjpjbG9zZSIKKyAgICBoZWFkZXIgaW4gaXRzIEhUVFAgcmVxdWVzdHMuCisKKyAgICBUaGUgb3B0aW9uYWwgKnRpbWVvdXQqIHBhcmFtZXRlciBzcGVjaWZpZXMgYSB0aW1lb3V0IGluIHNlY29uZHMgZm9yCisgICAgYmxvY2tpbmcgb3BlcmF0aW9ucyBsaWtlIHRoZSBjb25uZWN0aW9uIGF0dGVtcHQgKGlmIG5vdCBzcGVjaWZpZWQsIHRoZQorICAgIGdsb2JhbCBkZWZhdWx0IHRpbWVvdXQgc2V0dGluZyB3aWxsIGJlIHVzZWQpLiBUaGlzIG9ubHkgd29ya3MgZm9yIEhUVFAsCisgICAgSFRUUFMgYW5kIEZUUCBjb25uZWN0aW9ucy4KKworICAgIElmICpjb250ZXh0KiBpcyBzcGVjaWZpZWQsIGl0IG11c3QgYmUgYSBzc2wuU1NMQ29udGV4dCBpbnN0YW5jZSBkZXNjcmliaW5nCisgICAgdGhlIHZhcmlvdXMgU1NMIG9wdGlvbnMuIFNlZSBIVFRQU0Nvbm5lY3Rpb24gZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFRoZSBvcHRpb25hbCAqY2FmaWxlKiBhbmQgKmNhcGF0aCogcGFyYW1ldGVycyBzcGVjaWZ5IGEgc2V0IG9mIHRydXN0ZWQgQ0EKKyAgICBjZXJ0aWZpY2F0ZXMgZm9yIEhUVFBTIHJlcXVlc3RzLiBjYWZpbGUgc2hvdWxkIHBvaW50IHRvIGEgc2luZ2xlIGZpbGUKKyAgICBjb250YWluaW5nIGEgYnVuZGxlIG9mIENBIGNlcnRpZmljYXRlcywgd2hlcmVhcyBjYXBhdGggc2hvdWxkIHBvaW50IHRvIGEKKyAgICBkaXJlY3Rvcnkgb2YgaGFzaGVkIGNlcnRpZmljYXRlIGZpbGVzLiBNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbgorICAgIHNzbC5TU0xDb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucygpLgorCisgICAgVGhlICpjYWRlZmF1bHQqIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorCisgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggY2FuIHdvcmsgYXMgYSBjb250ZXh0CisgICAgbWFuYWdlciBhbmQgaGFzIG1ldGhvZHMgc3VjaCBhcworCisgICAgKiBnZXR1cmwoKSAtIHJldHVybiB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSByZXRyaWV2ZWQsIGNvbW1vbmx5IHVzZWQgdG8KKyAgICAgIGRldGVybWluZSBpZiBhIHJlZGlyZWN0IHdhcyBmb2xsb3dlZAorCisgICAgKiBpbmZvKCkgLSByZXR1cm4gdGhlIG1ldGEtaW5mb3JtYXRpb24gb2YgdGhlIHBhZ2UsIHN1Y2ggYXMgaGVhZGVycywgaW4gdGhlCisgICAgICBmb3JtIG9mIGFuIGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoKSBpbnN0YW5jZSAoc2VlIFF1aWNrIFJlZmVyZW5jZSB0bworICAgICAgSFRUUCBIZWFkZXJzKQorCisgICAgKiBnZXRjb2RlKCkgLSByZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlLiAgUmFpc2VzIFVSTEVycm9yCisgICAgICBvbiBlcnJvcnMuCisKKyAgICBGb3IgSFRUUCBhbmQgSFRUUFMgVVJMcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgaHR0cC5jbGllbnQuSFRUUFJlc3BvbnNlCisgICAgb2JqZWN0IHNsaWdodGx5IG1vZGlmaWVkLiBJbiBhZGRpdGlvbiB0byB0aGUgdGhyZWUgbmV3IG1ldGhvZHMgYWJvdmUsIHRoZQorICAgIG1zZyBhdHRyaWJ1dGUgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHJlYXNvbiBhdHRyaWJ1dGUgLS0tCisgICAgdGhlIHJlYXNvbiBwaHJhc2UgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciAtLS0gaW5zdGVhZCBvZiB0aGUgcmVzcG9uc2UKKyAgICBoZWFkZXJzIGFzIGl0IGlzIHNwZWNpZmllZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgSFRUUFJlc3BvbnNlLgorCisgICAgRm9yIEZUUCwgZmlsZSwgYW5kIGRhdGEgVVJMcyBhbmQgcmVxdWVzdHMgZXhwbGljaXRseSBoYW5kbGVkIGJ5IGxlZ2FjeQorICAgIFVSTG9wZW5lciBhbmQgRmFuY3lVUkxvcGVuZXIgY2xhc3NlcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEKKyAgICB1cmxsaWIucmVzcG9uc2UuYWRkaW5mb3VybCBvYmplY3QuCisKKyAgICBOb3RlIHRoYXQgTm9uZSBtYXkgYmUgcmV0dXJuZWQgaWYgbm8gaGFuZGxlciBoYW5kbGVzIHRoZSByZXF1ZXN0ICh0aG91Z2gKKyAgICB0aGUgZGVmYXVsdCBpbnN0YWxsZWQgZ2xvYmFsIE9wZW5lckRpcmVjdG9yIHVzZXMgVW5rbm93bkhhbmRsZXIgdG8gZW5zdXJlCisgICAgdGhpcyBuZXZlciBoYXBwZW5zKS4KKworICAgIEluIGFkZGl0aW9uLCBpZiBwcm94eSBzZXR0aW5ncyBhcmUgZGV0ZWN0ZWQgKGZvciBleGFtcGxlLCB3aGVuIGEgKl9wcm94eQorICAgIGVudmlyb25tZW50IHZhcmlhYmxlIGxpa2UgaHR0cF9wcm94eSBpcyBzZXQpLCBQcm94eUhhbmRsZXIgaXMgZGVmYXVsdAorICAgIGluc3RhbGxlZCBhbmQgbWFrZXMgc3VyZSB0aGUgcmVxdWVzdHMgYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgcHJveHkuCisKKyAgICAnJycKICAgICBnbG9iYWwgX29wZW5lcgogICAgIGlmIGNhZmlsZSBvciBjYXBhdGggb3IgY2FkZWZhdWx0OgogICAgICAgICBpZiBjb250ZXh0IGlzIG5vdCBOb25lOgpAQCAtMTE3MCw2ICsxMjI3LDExIEBACiAgICAgZGVmIHNldF9odHRwX2RlYnVnbGV2ZWwoc2VsZiwgbGV2ZWwpOgogICAgICAgICBzZWxmLl9kZWJ1Z2xldmVsID0gbGV2ZWwKIAorICAgIGRlZiBfZ2V0X2NvbnRlbnRfbGVuZ3RoKHNlbGYsIHJlcXVlc3QpOgorICAgICAgICByZXR1cm4gaHR0cC5jbGllbnQuSFRUUENvbm5lY3Rpb24uX2dldF9jb250ZW50X2xlbmd0aCgKKyAgICAgICAgICAgIHJlcXVlc3QuZGF0YSwKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0X21ldGhvZCgpKQorCiAgICAgZGVmIGRvX3JlcXVlc3RfKHNlbGYsIHJlcXVlc3QpOgogICAgICAgICBob3N0ID0gcmVxdWVzdC5ob3N0CiAgICAgICAgIGlmIG5vdCBob3N0OgpAQCAtMTE3OCwyNCArMTI0MCwyMiBAQAogICAgICAgICBpZiByZXF1ZXN0LmRhdGEgaXMgbm90IE5vbmU6ICAjIFBPU1QKICAgICAgICAgICAgIGRhdGEgPSByZXF1ZXN0LmRhdGEKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgc3RyKToKLSAgICAgICAgICAgICAgICBtc2cgPSAiUE9TVCBkYXRhIHNob3VsZCBiZSBieXRlcyBvciBhbiBpdGVyYWJsZSBvZiBieXRlcy4gIiBcCi0gICAgICAgICAgICAgICAgICAgICAgIkl0IGNhbm5vdCBiZSBvZiB0eXBlIHN0ci4iCisgICAgICAgICAgICAgICAgbXNnID0gIlBPU1QgZGF0YSBzaG91bGQgYmUgYnl0ZXMsIGFuIGl0ZXJhYmxlIG9mIGJ5dGVzLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAib3IgYSBmaWxlIG9iamVjdC4gSXQgY2Fubm90IGJlIG9mIHR5cGUgc3RyLiIKICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IobXNnKQogICAgICAgICAgICAgaWYgbm90IHJlcXVlc3QuaGFzX2hlYWRlcignQ29udGVudC10eXBlJyk6CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigKICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZScsCiAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKQotICAgICAgICAgICAgaWYgbm90IHJlcXVlc3QuaGFzX2hlYWRlcignQ29udGVudC1sZW5ndGgnKToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIG12ID0gbWVtb3J5dmlldyhkYXRhKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgY29sbGVjdGlvbnMuSXRlcmFibGUpOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ29udGVudC1MZW5ndGggc2hvdWxkIGJlIHNwZWNpZmllZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgaXRlcmFibGUgZGF0YSBvZiB0eXBlICVyICVyIiAlICh0eXBlKGRhdGEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKSkKKyAgICAgICAgICAgIGlmIChub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcpCisgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCdUcmFuc2Zlci1lbmNvZGluZycpKToKKyAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aCA9IHNlbGYuX2dldF9jb250ZW50X2xlbmd0aChyZXF1ZXN0KQorICAgICAgICAgICAgICAgIGlmIGNvbnRlbnRfbGVuZ3RoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LWxlbmd0aCcsIHN0cihjb250ZW50X2xlbmd0aCkpCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1sZW5ndGgnLCAnJWQnICUgKGxlbihtdikgKiBtdi5pdGVtc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyYW5zZmVyLWVuY29kaW5nJywgJ2NodW5rZWQnKQogCiAgICAgICAgIHNlbF9ob3N0ID0gaG9zdAogICAgICAgICBpZiByZXF1ZXN0Lmhhc19wcm94eSgpOgpAQCAtMTI1MSw3ICsxMzExLDggQEAKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgaC5yZXF1ZXN0KHJlcS5nZXRfbWV0aG9kKCksIHJlcS5zZWxlY3RvciwgcmVxLmRhdGEsIGhlYWRlcnMpCisgICAgICAgICAgICAgICAgaC5yZXF1ZXN0KHJlcS5nZXRfbWV0aG9kKCksIHJlcS5zZWxlY3RvciwgcmVxLmRhdGEsIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9jaHVua2VkPXJlcS5oYXNfaGVhZGVyKCdUcmFuc2Zlci1lbmNvZGluZycpKQogICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOiAjIHRpbWVvdXQgZXJyb3IKICAgICAgICAgICAgICAgICByYWlzZSBVUkxFcnJvcihlcnIpCiAgICAgICAgICAgICByID0gaC5nZXRyZXNwb25zZSgpCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliL3JvYm90cGFyc2VyLnB5IGIvTGliL3VybGxpYi9yb2JvdHBhcnNlci5weQppbmRleCA4YjY5ZmQ5Li44NWFkZDE2IDEwMDY0NAotLS0gYS9MaWIvdXJsbGliL3JvYm90cGFyc2VyLnB5CisrKyBiL0xpYi91cmxsaWIvcm9ib3RwYXJzZXIucHkKQEAgLTEwLDcgKzEwLDkgQEAKICAgICBodHRwOi8vd3d3LnJvYm90c3R4dC5vcmcvbm9yb2JvdHMtcmZjLnR4dAogIiIiCiAKLWltcG9ydCB1cmxsaWIucGFyc2UsIHVybGxpYi5yZXF1ZXN0CitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCB1cmxsaWIucGFyc2UKK2ltcG9ydCB1cmxsaWIucmVxdWVzdAogCiBfX2FsbF9fID0gWyJSb2JvdEZpbGVQYXJzZXIiXQogCkBAIC0xMjAsMTAgKzEyMiwyOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZSAhPSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucnVsZWxpbmVzLmFwcGVuZChSdWxlTGluZShsaW5lWzFdLCBUcnVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMgorICAgICAgICAgICAgICAgIGVsaWYgbGluZVswXSA9PSAiY3Jhd2wtZGVsYXkiOgorICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZSAhPSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWZvcmUgdHJ5aW5nIHRvIGNvbnZlcnQgdG8gaW50IHdlIG5lZWQgdG8gbWFrZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBzdXJlIHRoYXQgcm9ib3RzLnR4dCBoYXMgdmFsaWQgc3ludGF4IG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBpdCB3aWxsIGNyYXNoCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lWzFdLnN0cmlwKCkuaXNkaWdpdCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRlbGF5ID0gaW50KGxpbmVbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmVbMF0gPT0gInJlcXVlc3QtcmF0ZSI6CisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXRlICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJzID0gbGluZVsxXS5zcGxpdCgnLycpCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGFsbCB2YWx1ZXMgYXJlIHNhbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4obnVtYmVycykgPT0gMiBhbmQgbnVtYmVyc1swXS5zdHJpcCgpLmlzZGlnaXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBudW1iZXJzWzFdLnN0cmlwKCkuaXNkaWdpdCgpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfcmF0ZSA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ3JlcV9yYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVlc3RzIHNlY29uZHMnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlcV9yYXRlID0gcmVxX3JhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZXFfcmF0ZS5yZXF1ZXN0cyA9IGludChudW1iZXJzWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlcV9yYXRlLnNlY29uZHMgPSBpbnQobnVtYmVyc1sxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMgogICAgICAgICBpZiBzdGF0ZSA9PSAyOgogICAgICAgICAgICAgc2VsZi5fYWRkX2VudHJ5KGVudHJ5KQogCi0KICAgICBkZWYgY2FuX2ZldGNoKHNlbGYsIHVzZXJhZ2VudCwgdXJsKToKICAgICAgICAgIiIidXNpbmcgdGhlIHBhcnNlZCByb2JvdHMudHh0IGRlY2lkZSBpZiB1c2VyYWdlbnQgY2FuIGZldGNoIHVybCIiIgogICAgICAgICBpZiBzZWxmLmRpc2FsbG93X2FsbDoKQEAgLTE1Myw2ICsxNzQsMTggQEAKICAgICAgICAgIyBhZ2VudCBub3QgZm91bmQgPT0+IGFjY2VzcyBncmFudGVkCiAgICAgICAgIHJldHVybiBUcnVlCiAKKyAgICBkZWYgY3Jhd2xfZGVsYXkoc2VsZiwgdXNlcmFnZW50KToKKyAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllczoKKyAgICAgICAgICAgIGlmIGVudHJ5LmFwcGxpZXNfdG8odXNlcmFnZW50KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZGVsYXkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiByZXF1ZXN0X3JhdGUoc2VsZiwgdXNlcmFnZW50KToKKyAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllczoKKyAgICAgICAgICAgIGlmIGVudHJ5LmFwcGxpZXNfdG8odXNlcmFnZW50KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkucmVxX3JhdGUKKyAgICAgICAgcmV0dXJuIE5vbmUKKwogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gJycuam9pbihbc3RyKGVudHJ5KSArICJcbiIgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllc10pCiAKQEAgLTE4MCw2ICsyMTMsOCBAQAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi51c2VyYWdlbnRzID0gW10KICAgICAgICAgc2VsZi5ydWxlbGluZXMgPSBbXQorICAgICAgICBzZWxmLmRlbGF5ID0gTm9uZQorICAgICAgICBzZWxmLnJlcV9yYXRlID0gTm9uZQogCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIHJldCA9IFtdCmRpZmYgLS1naXQgYS9MaWIvdXVpZC5weSBiL0xpYi91dWlkLnB5CmluZGV4IGU5NmU3ZTAuLjIwMGM4MDAgMTAwNjQ0Ci0tLSBhL0xpYi91dWlkLnB5CisrKyBiL0xpYi91dWlkLnB5CkBAIC00ODcsNyArNDg3LDYgQEAKICAgICAjIEFzc3VtZSB0aGF0IHRoZSB1dWlkX2dlbmVyYXRlIGZ1bmN0aW9ucyBhcmUgYnJva2VuIGZyb20gMTAuNSBvbndhcmQsCiAgICAgIyB0aGUgdGVzdCBjYW4gYmUgYWRqdXN0ZWQgd2hlbiBhIGxhdGVyIHZlcnNpb24gaXMgZml4ZWQuCiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgotICAgICAgICBpbXBvcnQgb3MKICAgICAgICAgaWYgaW50KG9zLnVuYW1lKCkucmVsZWFzZS5zcGxpdCgnLicpWzBdKSA+PSA5OgogICAgICAgICAgICAgX3V1aWRfZ2VuZXJhdGVfdGltZSA9IE5vbmUKIApkaWZmIC0tZ2l0IGEvTGliL3ZlbnYvX19pbml0X18ucHkgYi9MaWIvdmVudi9fX2luaXRfXy5weQppbmRleCA3NDI0NWFiLi4wYTA5NGUzIDEwMDY0NAotLS0gYS9MaWIvdmVudi9fX2luaXRfXy5weQorKysgYi9MaWIvdmVudi9fX2luaXRfXy5weQpAQCAtMywyOCArMyw2IEBACiAKIENvcHlyaWdodCAoQykgMjAxMS0yMDE0IFZpbmF5IFNhamlwLgogTGljZW5zZWQgdG8gdGhlIFBTRiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KLQotdXNhZ2U6IHB5dGhvbiAtbSB2ZW52IFstaF0gWy0tc3lzdGVtLXNpdGUtcGFja2FnZXNdIFstLXN5bWxpbmtzXSBbLS1jbGVhcl0KLSAgICAgICAgICAgIFstLXVwZ3JhZGVdCi0gICAgICAgICAgICBFTlZfRElSIFtFTlZfRElSIC4uLl0KLQotQ3JlYXRlcyB2aXJ0dWFsIFB5dGhvbiBlbnZpcm9ubWVudHMgaW4gb25lIG9yIG1vcmUgdGFyZ2V0IGRpcmVjdG9yaWVzLgotCi1wb3NpdGlvbmFsIGFyZ3VtZW50czoKLSAgRU5WX0RJUiAgICAgICAgICAgICAgIEEgZGlyZWN0b3J5IHRvIGNyZWF0ZSB0aGUgZW52aXJvbm1lbnQgaW4uCi0KLW9wdGlvbmFsIGFyZ3VtZW50czoKLSAgLWgsIC0taGVscCAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgLS1zeXN0ZW0tc2l0ZS1wYWNrYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgR2l2ZSB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCBhY2Nlc3MgdG8gdGhlIHN5c3RlbQotICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZS1wYWNrYWdlcyBkaXIuCi0gIC0tc3ltbGlua3MgICAgICAgICAgICBBdHRlbXB0IHRvIHN5bWxpbmsgcmF0aGVyIHRoYW4gY29weS4KLSAgLS1jbGVhciAgICAgICAgICAgICAgIERlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IGRpcmVjdG9yeSBpZiBpdAotICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBleGlzdHMsIGJlZm9yZSBlbnZpcm9ubWVudCBjcmVhdGlvbi4KLSAgLS11cGdyYWRlICAgICAgICAgICAgIFVwZ3JhZGUgdGhlIGVudmlyb25tZW50IGRpcmVjdG9yeSB0byB1c2UgdGhpcyB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiBQeXRob24sIGFzc3VtaW5nIFB5dGhvbiBoYXMgYmVlbiB1cGdyYWRlZCBpbi1wbGFjZS4KLSAgLS13aXRob3V0LXBpcCAgICAgICAgIFNraXBzIGluc3RhbGxpbmcgb3IgdXBncmFkaW5nIHBpcCBpbiB0aGUgdmlydHVhbAotICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgKHBpcCBpcyBib290c3RyYXBwZWQgYnkgZGVmYXVsdCkKICIiIgogaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcwpAQCAtNTgsMTUgKzM2LDE3IEBACiAgICAgOnBhcmFtIHVwZ3JhZGU6IElmIFRydWUsIHVwZ3JhZGUgYW4gZXhpc3RpbmcgdmlydHVhbCBlbnZpcm9ubWVudC4KICAgICA6cGFyYW0gd2l0aF9waXA6IElmIFRydWUsIGVuc3VyZSBwaXAgaXMgaW5zdGFsbGVkIGluIHRoZSB2aXJ0dWFsCiAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudAorICAgIDpwYXJhbSBwcm9tcHQ6IEFsdGVybmF0aXZlIHRlcm1pbmFsIHByZWZpeCBmb3IgdGhlIGVudmlyb25tZW50LgogICAgICIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN5c3RlbV9zaXRlX3BhY2thZ2VzPUZhbHNlLCBjbGVhcj1GYWxzZSwKLSAgICAgICAgICAgICAgICAgc3ltbGlua3M9RmFsc2UsIHVwZ3JhZGU9RmFsc2UsIHdpdGhfcGlwPUZhbHNlKToKKyAgICAgICAgICAgICAgICAgc3ltbGlua3M9RmFsc2UsIHVwZ3JhZGU9RmFsc2UsIHdpdGhfcGlwPUZhbHNlLCBwcm9tcHQ9Tm9uZSk6CiAgICAgICAgIHNlbGYuc3lzdGVtX3NpdGVfcGFja2FnZXMgPSBzeXN0ZW1fc2l0ZV9wYWNrYWdlcwogICAgICAgICBzZWxmLmNsZWFyID0gY2xlYXIKICAgICAgICAgc2VsZi5zeW1saW5rcyA9IHN5bWxpbmtzCiAgICAgICAgIHNlbGYudXBncmFkZSA9IHVwZ3JhZGUKICAgICAgICAgc2VsZi53aXRoX3BpcCA9IHdpdGhfcGlwCisgICAgICAgIHNlbGYucHJvbXB0ID0gcHJvbXB0CiAKICAgICBkZWYgY3JlYXRlKHNlbGYsIGVudl9kaXIpOgogICAgICAgICAiIiIKQEAgLTExMiw3ICs5Miw4IEBACiAgICAgICAgIGNvbnRleHQgPSB0eXBlcy5TaW1wbGVOYW1lc3BhY2UoKQogICAgICAgICBjb250ZXh0LmVudl9kaXIgPSBlbnZfZGlyCiAgICAgICAgIGNvbnRleHQuZW52X25hbWUgPSBvcy5wYXRoLnNwbGl0KGVudl9kaXIpWzFdCi0gICAgICAgIGNvbnRleHQucHJvbXB0ID0gJyglcykgJyAlIGNvbnRleHQuZW52X25hbWUKKyAgICAgICAgcHJvbXB0ID0gc2VsZi5wcm9tcHQgaWYgc2VsZi5wcm9tcHQgaXMgbm90IE5vbmUgZWxzZSBjb250ZXh0LmVudl9uYW1lCisgICAgICAgIGNvbnRleHQucHJvbXB0ID0gJyglcykgJyAlIHByb21wdAogICAgICAgICBjcmVhdGVfaWZfbmVlZGVkKGVudl9kaXIpCiAgICAgICAgIGVudiA9IG9zLmVudmlyb24KICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCAnX19QWVZFTlZfTEFVTkNIRVJfXycgaW4gZW52OgpAQCAtMzQ4LDI2ICszMjksMTEgQEAKIAogCiBkZWYgY3JlYXRlKGVudl9kaXIsIHN5c3RlbV9zaXRlX3BhY2thZ2VzPUZhbHNlLCBjbGVhcj1GYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgc3ltbGlua3M9RmFsc2UsIHdpdGhfcGlwPUZhbHNlKToKLSAgICAiIiIKLSAgICBDcmVhdGUgYSB2aXJ0dWFsIGVudmlyb25tZW50IGluIGEgZGlyZWN0b3J5LgotCi0gICAgQnkgZGVmYXVsdCwgbWFrZXMgdGhlIHN5c3RlbSAoZ2xvYmFsKSBzaXRlLXBhY2thZ2VzIGRpciAqdW4qYXZhaWxhYmxlIHRvCi0gICAgdGhlIGNyZWF0ZWQgZW52aXJvbm1lbnQsIGFuZCB1c2VzIGNvcHlpbmcgcmF0aGVyIHRoYW4gc3ltbGlua2luZyBmb3IgZmlsZXMKLSAgICBvYnRhaW5lZCBmcm9tIHRoZSBzb3VyY2UgUHl0aG9uIGluc3RhbGxhdGlvbi4KLQotICAgIDpwYXJhbSBlbnZfZGlyOiBUaGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBjcmVhdGUgYW4gZW52aXJvbm1lbnQgaW4uCi0gICAgOnBhcmFtIHN5c3RlbV9zaXRlX3BhY2thZ2VzOiBJZiBUcnVlLCB0aGUgc3lzdGVtIChnbG9iYWwpIHNpdGUtcGFja2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciBpcyBhdmFpbGFibGUgdG8gdGhlIGVudmlyb25tZW50LgotICAgIDpwYXJhbSBjbGVhcjogSWYgVHJ1ZSwgZGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgZGlyZWN0b3J5IGlmCi0gICAgICAgICAgICAgICAgICBpdCBhbHJlYWR5IGV4aXN0cywgYmVmb3JlIGVudmlyb25tZW50IGNyZWF0aW9uLgotICAgIDpwYXJhbSBzeW1saW5rczogSWYgVHJ1ZSwgYXR0ZW1wdCB0byBzeW1saW5rIHJhdGhlciB0aGFuIGNvcHkgZmlsZXMgaW50bwotICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBlbnZpcm9ubWVudC4KLSAgICA6cGFyYW0gd2l0aF9waXA6IElmIFRydWUsIGVuc3VyZSBwaXAgaXMgaW5zdGFsbGVkIGluIHRoZSB2aXJ0dWFsCi0gICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudAotICAgICIiIgorICAgICAgICAgICAgICAgICAgICBzeW1saW5rcz1GYWxzZSwgd2l0aF9waXA9RmFsc2UsIHByb21wdD1Ob25lKToKKyAgICAiIiJDcmVhdGUgYSB2aXJ0dWFsIGVudmlyb25tZW50IGluIGEgZGlyZWN0b3J5LiIiIgogICAgIGJ1aWxkZXIgPSBFbnZCdWlsZGVyKHN5c3RlbV9zaXRlX3BhY2thZ2VzPXN5c3RlbV9zaXRlX3BhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyPWNsZWFyLCBzeW1saW5rcz1zeW1saW5rcywgd2l0aF9waXA9d2l0aF9waXApCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXI9Y2xlYXIsIHN5bWxpbmtzPXN5bWxpbmtzLCB3aXRoX3BpcD13aXRoX3BpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQ9cHJvbXB0KQogICAgIGJ1aWxkZXIuY3JlYXRlKGVudl9kaXIpCiAKIGRlZiBtYWluKGFyZ3M9Tm9uZSk6CkBAIC00MjcsNiArMzkzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTa2lwcyBpbnN0YWxsaW5nIG9yIHVwZ3JhZGluZyBwaXAgaW4gdGhlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aXJ0dWFsIGVudmlyb25tZW50IChwaXAgaXMgYm9vdHN0cmFwcGVkICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdieSBkZWZhdWx0KScpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcHJvbXB0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSBwcm9tcHQgcHJlZml4IGZvciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhpcyBlbnZpcm9ubWVudC4nKQogICAgICAgICBvcHRpb25zID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKICAgICAgICAgaWYgb3B0aW9ucy51cGdyYWRlIGFuZCBvcHRpb25zLmNsZWFyOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigneW91IGNhbm5vdCBzdXBwbHkgLS11cGdyYWRlIGFuZCAtLWNsZWFyIHRvZ2V0aGVyLicpCkBAIC00MzQsNyArNDAzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXI9b3B0aW9ucy5jbGVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbGlua3M9b3B0aW9ucy5zeW1saW5rcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBncmFkZT1vcHRpb25zLnVwZ3JhZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhfcGlwPW9wdGlvbnMud2l0aF9waXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhfcGlwPW9wdGlvbnMud2l0aF9waXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdD1vcHRpb25zLnByb21wdCkKICAgICAgICAgZm9yIGQgaW4gb3B0aW9ucy5kaXJzOgogICAgICAgICAgICAgYnVpbGRlci5jcmVhdGUoZCkKIApkaWZmIC0tZ2l0IGEvTGliL3dhcm5pbmdzLnB5IGIvTGliL3dhcm5pbmdzLnB5CmluZGV4IGM2NjMxZmMuLjJiNDA3ZmYgMTAwNjQ0Ci0tLSBhL0xpYi93YXJuaW5ncy5weQorKysgYi9MaWIvd2FybmluZ3MucHkKQEAgLTIsMzkgKzIsMTEyIEBACiAKIGltcG9ydCBzeXMKIAorCiBfX2FsbF9fID0gWyJ3YXJuIiwgIndhcm5fZXhwbGljaXQiLCAic2hvd3dhcm5pbmciLAogICAgICAgICAgICAiZm9ybWF0d2FybmluZyIsICJmaWx0ZXJ3YXJuaW5ncyIsICJzaW1wbGVmaWx0ZXIiLAogICAgICAgICAgICAicmVzZXR3YXJuaW5ncyIsICJjYXRjaF93YXJuaW5ncyJdCiAKLQogZGVmIHNob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlPU5vbmUsIGxpbmU9Tm9uZSk6CiAgICAgIiIiSG9vayB0byB3cml0ZSBhIHdhcm5pbmcgdG8gYSBmaWxlOyByZXBsYWNlIGlmIHlvdSBsaWtlLiIiIgotICAgIGlmIGZpbGUgaXMgTm9uZToKLSAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKLSAgICAgICAgaWYgZmlsZSBpcyBOb25lOgotICAgICAgICAgICAgIyBzeXMuc3RkZXJyIGlzIE5vbmUgd2hlbiBydW4gd2l0aCBweXRob253LmV4ZSAtIHdhcm5pbmdzIGdldCBsb3N0Ci0gICAgICAgICAgICByZXR1cm4KLSAgICB0cnk6Ci0gICAgICAgIGZpbGUud3JpdGUoZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZSkpCi0gICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgIHBhc3MgIyB0aGUgZmlsZSAocHJvYmFibHkgc3RkZXJyKSBpcyBpbnZhbGlkIC0gdGhpcyB3YXJuaW5nIGdldHMgbG9zdC4KKyAgICBtc2cgPSBXYXJuaW5nTWVzc2FnZShtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZSwgbGluZSkKKyAgICBfc2hvd3dhcm5tc2dfaW1wbChtc2cpCiAKIGRlZiBmb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lPU5vbmUpOgogICAgICIiIkZ1bmN0aW9uIHRvIGZvcm1hdCBhIHdhcm5pbmcgdGhlIHN0YW5kYXJkIHdheS4iIiIKLSAgICBzID0gICIlczolczogJXM6ICVzXG4iICUgKGZpbGVuYW1lLCBsaW5lbm8sIGNhdGVnb3J5Ll9fbmFtZV9fLCBtZXNzYWdlKQotICAgIGlmIGxpbmUgaXMgTm9uZToKKyAgICBtc2cgPSBXYXJuaW5nTWVzc2FnZShtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgTm9uZSwgbGluZSkKKyAgICByZXR1cm4gX2Zvcm1hdHdhcm5tc2dfaW1wbChtc2cpCisKK2RlZiBfc2hvd3dhcm5tc2dfaW1wbChtc2cpOgorICAgIGZpbGUgPSBtc2cuZmlsZQorICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKKyAgICAgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgIyBzeXMuc3RkZXJyIGlzIE5vbmUgd2hlbiBydW4gd2l0aCBweXRob253LmV4ZToKKyAgICAgICAgICAgICMgd2FybmluZ3MgZ2V0IGxvc3QKKyAgICAgICAgICAgIHJldHVybgorICAgIHRleHQgPSBfZm9ybWF0d2Fybm1zZyhtc2cpCisgICAgdHJ5OgorICAgICAgICBmaWxlLndyaXRlKHRleHQpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICMgdGhlIGZpbGUgKHByb2JhYmx5IHN0ZGVycikgaXMgaW52YWxpZCAtIHRoaXMgd2FybmluZyBnZXRzIGxvc3QuCisgICAgICAgIHBhc3MKKworZGVmIF9mb3JtYXR3YXJubXNnX2ltcGwobXNnKToKKyAgICBzID0gICgiJXM6JXM6ICVzOiAlc1xuIgorICAgICAgICAgICUgKG1zZy5maWxlbmFtZSwgbXNnLmxpbmVubywgbXNnLmNhdGVnb3J5Ll9fbmFtZV9fLAorICAgICAgICAgICAgIG1zZy5tZXNzYWdlKSkKKworICAgIGlmIG1zZy5saW5lIGlzIE5vbmU6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGltcG9ydCBsaW5lY2FjaGUKLSAgICAgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKG1zZy5maWxlbmFtZSwgbXNnLmxpbmVubykKICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICMgV2hlbiBhIHdhcm5pbmcgaXMgbG9nZ2VkIGR1cmluZyBQeXRob24gc2h1dGRvd24sIGxpbmVjYWNoZQogICAgICAgICAgICAgIyBhbmQgdGhlIGltcG9ydCBtYWNoaW5lcnkgZG9uJ3Qgd29yayBhbnltb3JlCiAgICAgICAgICAgICBsaW5lID0gTm9uZQorICAgICAgICAgICAgbGluZWNhY2hlID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIGxpbmUgPSBtc2cubGluZQogICAgIGlmIGxpbmU6CiAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgcyArPSAiICAlc1xuIiAlIGxpbmUKKworICAgIGlmIG1zZy5zb3VyY2UgaXMgbm90IE5vbmU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCB0cmFjZW1hbGxvYworICAgICAgICAgICAgdGIgPSB0cmFjZW1hbGxvYy5nZXRfb2JqZWN0X3RyYWNlYmFjayhtc2cuc291cmNlKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgIyBXaGVuIGEgd2FybmluZyBpcyBsb2dnZWQgZHVyaW5nIFB5dGhvbiBzaHV0ZG93biwgdHJhY2VtYWxsb2MKKyAgICAgICAgICAgICMgYW5kIHRoZSBpbXBvcnQgbWFjaGluZXJ5IGRvbid0IHdvcmsgYW55bW9yZQorICAgICAgICAgICAgdGIgPSBOb25lCisKKyAgICAgICAgaWYgdGIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzICs9ICdPYmplY3QgYWxsb2NhdGVkIGF0IChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KTpcbicKKyAgICAgICAgICAgIGZvciBmcmFtZSBpbiB0YjoKKyAgICAgICAgICAgICAgICBzICs9ICgnICBGaWxlICIlcyIsIGxpbmVubyAlc1xuJworICAgICAgICAgICAgICAgICAgICAgICUgKGZyYW1lLmZpbGVuYW1lLCBmcmFtZS5saW5lbm8pKQorCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lY2FjaGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZnJhbWUuZmlsZW5hbWUsIGZyYW1lLmxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBOb25lCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIHMgKz0gJyAgICAlc1xuJyAlIGxpbmUKICAgICByZXR1cm4gcwogCisjIEtlZXAgYSByZWZlcmVuY2UgdG8gY2hlY2sgaWYgdGhlIGZ1bmN0aW9uIHdhcyByZXBsYWNlZAorX3Nob3d3YXJuaW5nID0gc2hvd3dhcm5pbmcKKworZGVmIF9zaG93d2Fybm1zZyhtc2cpOgorICAgICIiIkhvb2sgdG8gd3JpdGUgYSB3YXJuaW5nIHRvIGEgZmlsZTsgcmVwbGFjZSBpZiB5b3UgbGlrZS4iIiIKKyAgICBzaG93d2FybmluZyA9IGdsb2JhbHMoKS5nZXQoJ3Nob3d3YXJuaW5nJywgX3Nob3d3YXJuaW5nKQorICAgIGlmIHNob3d3YXJuaW5nIGlzIG5vdCBfc2hvd3dhcm5pbmc6CisgICAgICAgICMgd2FybmluZ3Muc2hvd3dhcm5pbmcoKSB3YXMgcmVwbGFjZWQKKyAgICAgICAgaWYgbm90IGNhbGxhYmxlKHNob3d3YXJuaW5nKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigid2FybmluZ3Muc2hvd3dhcm5pbmcoKSBtdXN0IGJlIHNldCB0byBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gb3IgbWV0aG9kIikKKworICAgICAgICBzaG93d2FybmluZyhtc2cubWVzc2FnZSwgbXNnLmNhdGVnb3J5LCBtc2cuZmlsZW5hbWUsIG1zZy5saW5lbm8sCisgICAgICAgICAgICAgICAgICAgIG1zZy5maWxlLCBtc2cubGluZSkKKyAgICAgICAgcmV0dXJuCisgICAgX3Nob3d3YXJubXNnX2ltcGwobXNnKQorCisjIEtlZXAgYSByZWZlcmVuY2UgdG8gY2hlY2sgaWYgdGhlIGZ1bmN0aW9uIHdhcyByZXBsYWNlZAorX2Zvcm1hdHdhcm5pbmcgPSBmb3JtYXR3YXJuaW5nCisKK2RlZiBfZm9ybWF0d2Fybm1zZyhtc2cpOgorICAgICIiIkZ1bmN0aW9uIHRvIGZvcm1hdCBhIHdhcm5pbmcgdGhlIHN0YW5kYXJkIHdheS4iIiIKKyAgICBmb3JtYXR3YXJuaW5nID0gZ2xvYmFscygpLmdldCgnZm9ybWF0d2FybmluZycsIF9mb3JtYXR3YXJuaW5nKQorICAgIGlmIGZvcm1hdHdhcm5pbmcgaXMgbm90IF9mb3JtYXR3YXJuaW5nOgorICAgICAgICAjIHdhcm5pbmdzLmZvcm1hdHdhcm5pbmcoKSB3YXMgcmVwbGFjZWQKKyAgICAgICAgcmV0dXJuIGZvcm1hdHdhcm5pbmcobXNnLm1lc3NhZ2UsIG1zZy5jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmZpbGVuYW1lLCBtc2cubGluZW5vLCBsaW5lPW1zZy5saW5lKQorICAgIHJldHVybiBfZm9ybWF0d2Fybm1zZ19pbXBsKG1zZykKKwogZGVmIGZpbHRlcndhcm5pbmdzKGFjdGlvbiwgbWVzc2FnZT0iIiwgY2F0ZWdvcnk9V2FybmluZywgbW9kdWxlPSIiLCBsaW5lbm89MCwKICAgICAgICAgICAgICAgICAgICBhcHBlbmQ9RmFsc2UpOgogICAgICIiIkluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSBsaXN0IG9mIHdhcm5pbmdzIGZpbHRlcnMgKGF0IHRoZSBmcm9udCkuCkBAIC0xODUsNyArMjU4LDcgQEAKIAogCiAjIENvZGUgdHlwaWNhbGx5IHJlcGxhY2VkIGJ5IF93YXJuaW5ncwotZGVmIHdhcm4obWVzc2FnZSwgY2F0ZWdvcnk9Tm9uZSwgc3RhY2tsZXZlbD0xKToKK2RlZiB3YXJuKG1lc3NhZ2UsIGNhdGVnb3J5PU5vbmUsIHN0YWNrbGV2ZWw9MSwgc291cmNlPU5vbmUpOgogICAgICIiIklzc3VlIGEgd2FybmluZywgb3IgbWF5YmUgaWdub3JlIGl0IG9yIHJhaXNlIGFuIGV4Y2VwdGlvbi4iIiIKICAgICAjIENoZWNrIGlmIG1lc3NhZ2UgaXMgYWxyZWFkeSBhIFdhcm5pbmcgb2JqZWN0CiAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBXYXJuaW5nKToKQEAgLTIzNSwxMCArMzA4LDExIEBACiAgICAgICAgICAgICBmaWxlbmFtZSA9IG1vZHVsZQogICAgIHJlZ2lzdHJ5ID0gZ2xvYmFscy5zZXRkZWZhdWx0KCJfX3dhcm5pbmdyZWdpc3RyeV9fIiwge30pCiAgICAgd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLCByZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgIGdsb2JhbHMpCisgICAgICAgICAgICAgICAgICBnbG9iYWxzLCBzb3VyY2UpCiAKIGRlZiB3YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLAotICAgICAgICAgICAgICAgICAgbW9kdWxlPU5vbmUsIHJlZ2lzdHJ5PU5vbmUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgorICAgICAgICAgICAgICAgICAgbW9kdWxlPU5vbmUsIHJlZ2lzdHJ5PU5vbmUsIG1vZHVsZV9nbG9iYWxzPU5vbmUsCisgICAgICAgICAgICAgICAgICBzb3VyY2U9Tm9uZSk6CiAgICAgbGluZW5vID0gaW50KGxpbmVubykKICAgICBpZiBtb2R1bGUgaXMgTm9uZToKICAgICAgICAgbW9kdWxlID0gZmlsZW5hbWUgb3IgIjx1bmtub3duPiIKQEAgLTMwMywyMiArMzc3LDE4IEBACiAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBhY3Rpb24gKCVyKSBpbiB3YXJuaW5ncy5maWx0ZXJzOlxuICVzIiAlCiAgICAgICAgICAgICAgIChhY3Rpb24sIGl0ZW0pKQotICAgIGlmIG5vdCBjYWxsYWJsZShzaG93d2FybmluZyk6Ci0gICAgICAgIHJhaXNlIFR5cGVFcnJvcigid2FybmluZ3Muc2hvd3dhcm5pbmcoKSBtdXN0IGJlIHNldCB0byBhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBvciBtZXRob2QiKQogICAgICMgUHJpbnQgbWVzc2FnZSBhbmQgY29udGV4dAotICAgIHNob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vKQorICAgIG1zZyA9IFdhcm5pbmdNZXNzYWdlKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBzb3VyY2UpCisgICAgX3Nob3d3YXJubXNnKG1zZykKIAogCiBjbGFzcyBXYXJuaW5nTWVzc2FnZShvYmplY3QpOgogCi0gICAgIiIiSG9sZHMgdGhlIHJlc3VsdCBvZiBhIHNpbmdsZSBzaG93d2FybmluZygpIGNhbGwuIiIiCi0KICAgICBfV0FSTklOR19ERVRBSUxTID0gKCJtZXNzYWdlIiwgImNhdGVnb3J5IiwgImZpbGVuYW1lIiwgImxpbmVubyIsICJmaWxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lIikKKyAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lIiwgInNvdXJjZSIpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgbGluZT1Ob25lKToKKyAgICAgICAgICAgICAgICAgbGluZT1Ob25lLCBzb3VyY2U9Tm9uZSk6CiAgICAgICAgIGxvY2FsX3ZhbHVlcyA9IGxvY2FscygpCiAgICAgICAgIGZvciBhdHRyIGluIHNlbGYuX1dBUk5JTkdfREVUQUlMUzoKICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgbG9jYWxfdmFsdWVzW2F0dHJdKQpAQCAtMzc2LDExICs0NDYsMTIgQEAKICAgICAgICAgc2VsZi5fbW9kdWxlLmZpbHRlcnMgPSBzZWxmLl9maWx0ZXJzWzpdCiAgICAgICAgIHNlbGYuX21vZHVsZS5fZmlsdGVyc19tdXRhdGVkKCkKICAgICAgICAgc2VsZi5fc2hvd3dhcm5pbmcgPSBzZWxmLl9tb2R1bGUuc2hvd3dhcm5pbmcKKyAgICAgICAgc2VsZi5fc2hvd3dhcm5tc2cgPSBzZWxmLl9tb2R1bGUuX3Nob3d3YXJubXNnCiAgICAgICAgIGlmIHNlbGYuX3JlY29yZDoKICAgICAgICAgICAgIGxvZyA9IFtdCi0gICAgICAgICAgICBkZWYgc2hvd3dhcm5pbmcoKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgICAgICAgICAgICBsb2cuYXBwZW5kKFdhcm5pbmdNZXNzYWdlKCphcmdzLCAqKmt3YXJncykpCi0gICAgICAgICAgICBzZWxmLl9tb2R1bGUuc2hvd3dhcm5pbmcgPSBzaG93d2FybmluZworICAgICAgICAgICAgZGVmIHNob3dhcm5tc2cobXNnKToKKyAgICAgICAgICAgICAgICBsb2cuYXBwZW5kKG1zZykKKyAgICAgICAgICAgIHNlbGYuX21vZHVsZS5fc2hvd3dhcm5tc2cgPSBzaG93YXJubXNnCiAgICAgICAgICAgICByZXR1cm4gbG9nCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gTm9uZQpAQCAtMzkxLDYgKzQ2Miw3IEBACiAgICAgICAgIHNlbGYuX21vZHVsZS5maWx0ZXJzID0gc2VsZi5fZmlsdGVycwogICAgICAgICBzZWxmLl9tb2R1bGUuX2ZpbHRlcnNfbXV0YXRlZCgpCiAgICAgICAgIHNlbGYuX21vZHVsZS5zaG93d2FybmluZyA9IHNlbGYuX3Nob3d3YXJuaW5nCisgICAgICAgIHNlbGYuX21vZHVsZS5fc2hvd3dhcm5tc2cgPSBzZWxmLl9zaG93d2Fybm1zZwogCiAKICMgZmlsdGVycyBjb250YWlucyBhIHNlcXVlbmNlIG9mIGZpbHRlciA1LXR1cGxlcwpkaWZmIC0tZ2l0IGEvTGliL3dhdmUucHkgYi9MaWIvd2F2ZS5weQppbmRleCA4YTEwMWUzLi5mNzFmN2U1IDEwMDY0NAotLS0gYS9MaWIvd2F2ZS5weQorKysgYi9MaWIvd2F2ZS5weQpAQCAtNzMsNyArNzMsNyBAQAogCiBpbXBvcnQgYnVpbHRpbnMKIAotX19hbGxfXyA9IFsib3BlbiIsICJvcGVuZnAiLCAiRXJyb3IiXQorX19hbGxfXyA9IFsib3BlbiIsICJvcGVuZnAiLCAiRXJyb3IiLCAiV2F2ZV9yZWFkIiwgIldhdmVfd3JpdGUiXQogCiBjbGFzcyBFcnJvcihFeGNlcHRpb24pOgogICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkgYi9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5CmluZGV4IDdmZGRiZTguLmY3MTU2M2EgMTAwNjQ0Ci0tLSBhL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkKKysrIGIvTGliL3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weQpAQCAtMTEsNyArMTEsNiBAQAogIiIiCiAKIGZyb20gaHR0cC5zZXJ2ZXIgaW1wb3J0IEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIsIEhUVFBTZXJ2ZXIKLWZyb20gaW8gaW1wb3J0IEJ1ZmZlcmVkV3JpdGVyCiBpbXBvcnQgc3lzCiBpbXBvcnQgdXJsbGliLnBhcnNlCiBmcm9tIHdzZ2lyZWYuaGFuZGxlcnMgaW1wb3J0IFNpbXBsZUhhbmRsZXIKQEAgLTEyNywxNyArMTI2LDExIEBACiAgICAgICAgIGlmIG5vdCBzZWxmLnBhcnNlX3JlcXVlc3QoKTogIyBBbiBlcnJvciBjb2RlIGhhcyBiZWVuIHNlbnQsIGp1c3QgZXhpdAogICAgICAgICAgICAgcmV0dXJuCiAKLSAgICAgICAgIyBBdm9pZCBwYXNzaW5nIHRoZSByYXcgZmlsZSBvYmplY3Qgd2ZpbGUsIHdoaWNoIGNhbiBkbyBwYXJ0aWFsCi0gICAgICAgICMgd3JpdGVzIChJc3N1ZSAyNDI5MSkKLSAgICAgICAgc3Rkb3V0ID0gQnVmZmVyZWRXcml0ZXIoc2VsZi53ZmlsZSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaGFuZGxlciA9IFNlcnZlckhhbmRsZXIoCi0gICAgICAgICAgICAgICAgc2VsZi5yZmlsZSwgc3Rkb3V0LCBzZWxmLmdldF9zdGRlcnIoKSwgc2VsZi5nZXRfZW52aXJvbigpCi0gICAgICAgICAgICApCi0gICAgICAgICAgICBoYW5kbGVyLnJlcXVlc3RfaGFuZGxlciA9IHNlbGYgICAgICAjIGJhY2twb2ludGVyIGZvciBsb2dnaW5nCi0gICAgICAgICAgICBoYW5kbGVyLnJ1bihzZWxmLnNlcnZlci5nZXRfYXBwKCkpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBzdGRvdXQuZGV0YWNoKCkKKyAgICAgICAgaGFuZGxlciA9IFNlcnZlckhhbmRsZXIoCisgICAgICAgICAgICBzZWxmLnJmaWxlLCBzZWxmLndmaWxlLCBzZWxmLmdldF9zdGRlcnIoKSwgc2VsZi5nZXRfZW52aXJvbigpCisgICAgICAgICkKKyAgICAgICAgaGFuZGxlci5yZXF1ZXN0X2hhbmRsZXIgPSBzZWxmICAgICAgIyBiYWNrcG9pbnRlciBmb3IgbG9nZ2luZworICAgICAgICBoYW5kbGVyLnJ1bihzZWxmLnNlcnZlci5nZXRfYXBwKCkpCiAKIAogCkBAIC0xNjMsMTAgKzE1Niw5IEBACiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBodHRwZCA9IG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBkZW1vX2FwcCkKLSAgICBzYSA9IGh0dHBkLnNvY2tldC5nZXRzb2NrbmFtZSgpCi0gICAgcHJpbnQoIlNlcnZpbmcgSFRUUCBvbiIsIHNhWzBdLCAicG9ydCIsIHNhWzFdLCAiLi4uIikKLSAgICBpbXBvcnQgd2ViYnJvd3NlcgotICAgIHdlYmJyb3dzZXIub3BlbignaHR0cDovL2xvY2FsaG9zdDo4MDAwL3h5ej9hYmMnKQotICAgIGh0dHBkLmhhbmRsZV9yZXF1ZXN0KCkgICMgc2VydmUgb25lIHJlcXVlc3QsIHRoZW4gZXhpdAotICAgIGh0dHBkLnNlcnZlcl9jbG9zZSgpCisgICAgd2l0aCBtYWtlX3NlcnZlcignJywgODAwMCwgZGVtb19hcHApIGFzIGh0dHBkOgorICAgICAgICBzYSA9IGh0dHBkLnNvY2tldC5nZXRzb2NrbmFtZSgpCisgICAgICAgIHByaW50KCJTZXJ2aW5nIEhUVFAgb24iLCBzYVswXSwgInBvcnQiLCBzYVsxXSwgIi4uLiIpCisgICAgICAgIGltcG9ydCB3ZWJicm93c2VyCisgICAgICAgIHdlYmJyb3dzZXIub3BlbignaHR0cDovL2xvY2FsaG9zdDo4MDAwL3h5ej9hYmMnKQorICAgICAgICBodHRwZC5oYW5kbGVfcmVxdWVzdCgpICAjIHNlcnZlIG9uZSByZXF1ZXN0LCB0aGVuIGV4aXQKZGlmZiAtLWdpdCBhL0xpYi94bWwvZXRyZWUvRWxlbWVudFBhdGgucHkgYi9MaWIveG1sL2V0cmVlL0VsZW1lbnRQYXRoLnB5CmluZGV4IDVkZTQyMzIuLmFiNmI3OWEgMTAwNjQ0Ci0tLSBhL0xpYi94bWwvZXRyZWUvRWxlbWVudFBhdGgucHkKKysrIGIvTGliL3htbC9ldHJlZS9FbGVtZW50UGF0aC5weQpAQCAtNTksMTUgKzU5LDE1IEBACiBpbXBvcnQgcmUKIAogeHBhdGhfdG9rZW5pemVyX3JlID0gcmUuY29tcGlsZSgKLSAgICAiKCIKLSAgICAiJ1teJ10qJ3xcIlteXCJdKlwifCIKLSAgICAiOjp8IgotICAgICIvLz98IgotICAgICJcLlwufCIKLSAgICAiXChcKXwiCi0gICAgIlsvLio6XFtcXVwoXClAPV0pfCIKLSAgICAiKCg/Olx7W159XStcfSk/W14vXFtcXVwoXClAPVxzXSspfCIKLSAgICAiXHMrIgorICAgIHIiKCIKKyAgICByIidbXiddKid8XCJbXlwiXSpcInwiCisgICAgciI6OnwiCisgICAgciIvLz98IgorICAgIHIiXC5cLnwiCisgICAgciJcKFwpfCIKKyAgICByIlsvLio6XFtcXVwoXClAPV0pfCIKKyAgICByIigoPzpce1tefV0rXH0pP1teL1xbXF1cKFwpQD1cc10rKXwiCisgICAgciJccysiCiAgICAgKQogCiBkZWYgeHBhdGhfdG9rZW5pemVyKHBhdHRlcm4sIG5hbWVzcGFjZXM9Tm9uZSk6CkBAIC0xODAsNyArMTgwLDcgQEAKICAgICAgICAgICAgICAgICBpZiBlbGVtLmdldChrZXkpID09IHZhbHVlOgogICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtCiAgICAgICAgIHJldHVybiBzZWxlY3QKLSAgICBpZiBzaWduYXR1cmUgPT0gIi0iIGFuZCBub3QgcmUubWF0Y2goIlwtP1xkKyQiLCBwcmVkaWNhdGVbMF0pOgorICAgIGlmIHNpZ25hdHVyZSA9PSAiLSIgYW5kIG5vdCByZS5tYXRjaChyIlwtP1xkKyQiLCBwcmVkaWNhdGVbMF0pOgogICAgICAgICAjIFt0YWddCiAgICAgICAgIHRhZyA9IHByZWRpY2F0ZVswXQogICAgICAgICBkZWYgc2VsZWN0KGNvbnRleHQsIHJlc3VsdCk6CkBAIC0xODgsNyArMTg4LDcgQEAKICAgICAgICAgICAgICAgICBpZiBlbGVtLmZpbmQodGFnKSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbQogICAgICAgICByZXR1cm4gc2VsZWN0Ci0gICAgaWYgc2lnbmF0dXJlID09ICItPSciIGFuZCBub3QgcmUubWF0Y2goIlwtP1xkKyQiLCBwcmVkaWNhdGVbMF0pOgorICAgIGlmIHNpZ25hdHVyZSA9PSAiLT0nIiBhbmQgbm90IHJlLm1hdGNoKHIiXC0/XGQrJCIsIHByZWRpY2F0ZVswXSk6CiAgICAgICAgICMgW3RhZz0ndmFsdWUnXQogICAgICAgICB0YWcgPSBwcmVkaWNhdGVbMF0KICAgICAgICAgdmFsdWUgPSBwcmVkaWNhdGVbLTFdCmRpZmYgLS1naXQgYS9MaWIveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5IGIvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQppbmRleCA2ZDFiMGFiLi40YjBjNjYxIDEwMDY0NAotLS0gYS9MaWIveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5CisrKyBiL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKQEAgLTg1LDcgKzg1LDcgQEAKICAgICAiVHJlZUJ1aWxkZXIiLAogICAgICJWRVJTSU9OIiwKICAgICAiWE1MIiwgIlhNTElEIiwKLSAgICAiWE1MUGFyc2VyIiwKKyAgICAiWE1MUGFyc2VyIiwgIlhNTFB1bGxQYXJzZXIiLAogICAgICJyZWdpc3Rlcl9uYW1lc3BhY2UiLAogICAgIF0KIApAQCAtOTUsNiArOTUsNyBAQAogaW1wb3J0IHJlCiBpbXBvcnQgd2FybmluZ3MKIGltcG9ydCBpbworaW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgY29udGV4dGxpYgogCiBmcm9tIC4gaW1wb3J0IEVsZW1lbnRQYXRoCkBAIC0xMDI5LDcgKzEwMzAsNyBAQAogICAgIFZhbHVlRXJyb3IgaXMgcmFpc2VkIGlmIHByZWZpeCBpcyByZXNlcnZlZCBvciBpcyBpbnZhbGlkLgogCiAgICAgIiIiCi0gICAgaWYgcmUubWF0Y2goIm5zXGQrJCIsIHByZWZpeCk6CisgICAgaWYgcmUubWF0Y2gociJuc1xkKyQiLCBwcmVmaXgpOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJQcmVmaXggZm9ybWF0IHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UiKQogICAgIGZvciBrLCB2IGluIGxpc3QoX25hbWVzcGFjZV9tYXAuaXRlbXMoKSk6CiAgICAgICAgIGlmIGsgPT0gdXJpIG9yIHYgPT0gcHJlZml4OgpAQCAtMTIwMCwxNiArMTIwMSwzNyBAQAogICAgIFJldHVybnMgYW4gaXRlcmF0b3IgcHJvdmlkaW5nIChldmVudCwgZWxlbSkgcGFpcnMuCiAKICAgICAiIiIKKyAgICAjIFVzZSB0aGUgaW50ZXJuYWwsIHVuZG9jdW1lbnRlZCBfcGFyc2VyIGFyZ3VtZW50IGZvciBub3c7IFdoZW4gdGhlCisgICAgIyBwYXJzZXIgYXJndW1lbnQgb2YgaXRlcnBhcnNlIGlzIHJlbW92ZWQsIHRoaXMgY2FuIGJlIGtpbGxlZC4KKyAgICBwdWxscGFyc2VyID0gWE1MUHVsbFBhcnNlcihldmVudHM9ZXZlbnRzLCBfcGFyc2VyPXBhcnNlcikKKyAgICBkZWYgaXRlcmF0b3IoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIHB1bGxwYXJzZXIucmVhZF9ldmVudHMoKQorICAgICAgICAgICAgICAgICMgbG9hZCBldmVudCBidWZmZXIKKyAgICAgICAgICAgICAgICBkYXRhID0gc291cmNlLnJlYWQoMTYgKiAxMDI0KQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHB1bGxwYXJzZXIuZmVlZChkYXRhKQorICAgICAgICAgICAgcm9vdCA9IHB1bGxwYXJzZXIuX2Nsb3NlX2FuZF9yZXR1cm5fcm9vdCgpCisgICAgICAgICAgICB5aWVsZCBmcm9tIHB1bGxwYXJzZXIucmVhZF9ldmVudHMoKQorICAgICAgICAgICAgaXQucm9vdCA9IHJvb3QKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGNsb3NlX3NvdXJjZToKKyAgICAgICAgICAgICAgICBzb3VyY2UuY2xvc2UoKQorCisgICAgY2xhc3MgSXRlclBhcnNlSXRlcmF0b3IoY29sbGVjdGlvbnMuSXRlcmF0b3IpOgorICAgICAgICBfX25leHRfXyA9IGl0ZXJhdG9yKCkuX19uZXh0X18KKyAgICBpdCA9IEl0ZXJQYXJzZUl0ZXJhdG9yKCkKKyAgICBpdC5yb290ID0gTm9uZQorICAgIGRlbCBpdGVyYXRvciwgSXRlclBhcnNlSXRlcmF0b3IKKwogICAgIGNsb3NlX3NvdXJjZSA9IEZhbHNlCiAgICAgaWYgbm90IGhhc2F0dHIoc291cmNlLCAicmVhZCIpOgogICAgICAgICBzb3VyY2UgPSBvcGVuKHNvdXJjZSwgInJiIikKICAgICAgICAgY2xvc2Vfc291cmNlID0gVHJ1ZQotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIF9JdGVyUGFyc2VJdGVyYXRvcihzb3VyY2UsIGV2ZW50cywgcGFyc2VyLCBjbG9zZV9zb3VyY2UpCi0gICAgZXhjZXB0OgotICAgICAgICBpZiBjbG9zZV9zb3VyY2U6Ci0gICAgICAgICAgICBzb3VyY2UuY2xvc2UoKQotICAgICAgICByYWlzZQorCisgICAgcmV0dXJuIGl0CiAKIAogY2xhc3MgWE1MUHVsbFBhcnNlcjoKQEAgLTEyMTksOSArMTI0MSw3IEBACiAgICAgICAgICMgdXBvbiBpbiB1c2VyIGNvZGUuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgogICAgICAgICAjIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTc3NDEgZm9yIG1vcmUgZGV0YWlscy4KIAotICAgICAgICAjIF9lbGVtZW50dHJlZS5jIGV4cGVjdHMgYSBsaXN0LCBub3QgYSBkZXF1ZQotICAgICAgICBzZWxmLl9ldmVudHNfcXVldWUgPSBbXQotICAgICAgICBzZWxmLl9pbmRleCA9IDAKKyAgICAgICAgc2VsZi5fZXZlbnRzX3F1ZXVlID0gY29sbGVjdGlvbnMuZGVxdWUoKQogICAgICAgICBzZWxmLl9wYXJzZXIgPSBfcGFyc2VyIG9yIFhNTFBhcnNlcih0YXJnZXQ9VHJlZUJ1aWxkZXIoKSkKICAgICAgICAgIyB3aXJlIHVwIHRoZSBwYXJzZXIgZm9yIGV2ZW50IHJlcG9ydGluZwogICAgICAgICBpZiBldmVudHMgaXMgTm9uZToKQEAgLTEyNTksNjQgKzEyNzksMTQgQEAKICAgICAgICAgcmV0cmlldmVkIGZyb20gdGhlIGl0ZXJhdG9yLgogICAgICAgICAiIiIKICAgICAgICAgZXZlbnRzID0gc2VsZi5fZXZlbnRzX3F1ZXVlCi0gICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICBpbmRleCA9IHNlbGYuX2luZGV4Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSBldmVudHNbc2VsZi5faW5kZXhdCi0gICAgICAgICAgICAgICAgIyBBdm9pZCByZXRhaW5pbmcgcmVmZXJlbmNlcyB0byBwYXN0IGV2ZW50cwotICAgICAgICAgICAgICAgIGV2ZW50c1tzZWxmLl9pbmRleF0gPSBOb25lCi0gICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgaW5kZXggKz0gMQotICAgICAgICAgICAgIyBDb21wYWN0IHRoZSBsaXN0IGluIGEgTygxKSBhbW9ydGl6ZWQgZmFzaGlvbgotICAgICAgICAgICAgIyBBcyBub3RlZCBhYm92ZSwgX2VsZW1lbnRyZWUuYyBuZWVkcyBhIGxpc3QsIG5vdCBhIGRlcXVlCi0gICAgICAgICAgICBpZiBpbmRleCAqIDIgPj0gbGVuKGV2ZW50cyk6Ci0gICAgICAgICAgICAgICAgZXZlbnRzWzppbmRleF0gPSBbXQotICAgICAgICAgICAgICAgIHNlbGYuX2luZGV4ID0gMAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLl9pbmRleCA9IGluZGV4CisgICAgICAgIHdoaWxlIGV2ZW50czoKKyAgICAgICAgICAgIGV2ZW50ID0gZXZlbnRzLnBvcGxlZnQoKQogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgRXhjZXB0aW9uKToKICAgICAgICAgICAgICAgICByYWlzZSBldmVudAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB5aWVsZCBldmVudAogCiAKLWNsYXNzIF9JdGVyUGFyc2VJdGVyYXRvcjoKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIGV2ZW50cywgcGFyc2VyLCBjbG9zZV9zb3VyY2U9RmFsc2UpOgotICAgICAgICAjIFVzZSB0aGUgaW50ZXJuYWwsIHVuZG9jdW1lbnRlZCBfcGFyc2VyIGFyZ3VtZW50IGZvciBub3c7IFdoZW4gdGhlCi0gICAgICAgICMgcGFyc2VyIGFyZ3VtZW50IG9mIGl0ZXJwYXJzZSBpcyByZW1vdmVkLCB0aGlzIGNhbiBiZSBraWxsZWQuCi0gICAgICAgIHNlbGYuX3BhcnNlciA9IFhNTFB1bGxQYXJzZXIoZXZlbnRzPWV2ZW50cywgX3BhcnNlcj1wYXJzZXIpCi0gICAgICAgIHNlbGYuX2ZpbGUgPSBzb3VyY2UKLSAgICAgICAgc2VsZi5fY2xvc2VfZmlsZSA9IGNsb3NlX3NvdXJjZQotICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLl9yb290ID0gTm9uZQotCi0gICAgZGVmIF9fbmV4dF9fKHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgICAgIGZvciBldmVudCBpbiBzZWxmLl9wYXJzZXIucmVhZF9ldmVudHMoKToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50Ci0gICAgICAgICAgICAgICAgaWYgc2VsZi5fcGFyc2VyLl9wYXJzZXIgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAjIGxvYWQgZXZlbnQgYnVmZmVyCi0gICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2ZpbGUucmVhZCgxNiAqIDEwMjQpCi0gICAgICAgICAgICAgICAgaWYgZGF0YToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyc2VyLmZlZWQoZGF0YSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLl9yb290ID0gc2VsZi5fcGFyc2VyLl9jbG9zZV9hbmRfcmV0dXJuX3Jvb3QoKQotICAgICAgICAgICAgc2VsZi5yb290ID0gc2VsZi5fcm9vdAotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBpZiBzZWxmLl9jbG9zZV9maWxlOgotICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKQotICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgaWYgc2VsZi5fY2xvc2VfZmlsZToKLSAgICAgICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKQotICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCi0KLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmCi0KLQogZGVmIFhNTCh0ZXh0LCBwYXJzZXI9Tm9uZSk6CiAgICAgIiIiUGFyc2UgWE1MIGRvY3VtZW50IGZyb20gc3RyaW5nIGNvbnN0YW50LgogCmRpZmYgLS1naXQgYS9MaWIveG1scnBjL2NsaWVudC5weSBiL0xpYi94bWxycGMvY2xpZW50LnB5CmluZGV4IGJiZjllZTYuLjU4MWEzYjkgMTAwNjQ0Ci0tLSBhL0xpYi94bWxycGMvY2xpZW50LnB5CisrKyBiL0xpYi94bWxycGMvY2xpZW50LnB5CkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICByZXR1cm4gcy5yZXBsYWNlKCI+IiwgIiZndDsiLCkKIAogIyB1c2VkIGluIFVzZXItQWdlbnQgaGVhZGVyIHNlbnQKLV9fdmVyc2lvbl9fID0gc3lzLnZlcnNpb25bOjNdCitfX3ZlcnNpb25fXyA9ICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQogCiAjIHhtbHJwYyBpbnRlZ2VyIGxpbWl0cwogTUFYSU5UID0gIDIqKjMxLTEKZGlmZiAtLWdpdCBhL0xpYi94bWxycGMvc2VydmVyLnB5IGIvTGliL3htbHJwYy9zZXJ2ZXIucHkKaW5kZXggNzgxNzY5My4uODQ5YmZkZCAxMDA2NDQKLS0tIGEvTGliL3htbHJwYy9zZXJ2ZXIucHkKKysrIGIvTGliL3htbHJwYy9zZXJ2ZXIucHkKQEAgLTk3MSwxNiArOTcxLDE1IEBACiAgICAgICAgICAgICBkZWYgZ2V0Q3VycmVudFRpbWUoKToKICAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKIAotICAgIHNlcnZlciA9IFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKQotICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCi0gICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCi0gICAgc2VydmVyLnJlZ2lzdGVyX2luc3RhbmNlKEV4YW1wbGVTZXJ2aWNlKCksIGFsbG93X2RvdHRlZF9uYW1lcz1UcnVlKQotICAgIHNlcnZlci5yZWdpc3Rlcl9tdWx0aWNhbGxfZnVuY3Rpb25zKCkKLSAgICBwcmludCgnU2VydmluZyBYTUwtUlBDIG9uIGxvY2FsaG9zdCBwb3J0IDgwMDAnKQotICAgIHByaW50KCdJdCBpcyBhZHZpc2FibGUgdG8gcnVuIHRoaXMgZXhhbXBsZSBzZXJ2ZXIgd2l0aGluIGEgc2VjdXJlLCBjbG9zZWQgbmV0d29yay4nKQotICAgIHRyeToKLSAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQotICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgaW50ZXJydXB0IHJlY2VpdmVkLCBleGl0aW5nLiIpCi0gICAgICAgIHNlcnZlci5zZXJ2ZXJfY2xvc2UoKQotICAgICAgICBzeXMuZXhpdCgwKQorICAgIHdpdGggU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCkpIGFzIHNlcnZlcjoKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShFeGFtcGxlU2VydmljZSgpLCBhbGxvd19kb3R0ZWRfbmFtZXM9VHJ1ZSkKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX211bHRpY2FsbF9mdW5jdGlvbnMoKQorICAgICAgICBwcmludCgnU2VydmluZyBYTUwtUlBDIG9uIGxvY2FsaG9zdCBwb3J0IDgwMDAnKQorICAgICAgICBwcmludCgnSXQgaXMgYWR2aXNhYmxlIHRvIHJ1biB0aGlzIGV4YW1wbGUgc2VydmVyIHdpdGhpbiBhIHNlY3VyZSwgY2xvc2VkIG5ldHdvcmsuJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwcmludCgiXG5LZXlib2FyZCBpbnRlcnJ1cHQgcmVjZWl2ZWQsIGV4aXRpbmcuIikKKyAgICAgICAgICAgIHN5cy5leGl0KDApCmRpZmYgLS1naXQgYS9MaWIvemlwZmlsZS5weSBiL0xpYi96aXBmaWxlLnB5CmluZGV4IDU2YTI0NzkuLjhkZDA2NGEgMTAwNjQ0Ci0tLSBhL0xpYi96aXBmaWxlLnB5CisrKyBiL0xpYi96aXBmaWxlLnB5CkBAIC0zNzEsNyArMzcxLDcgQEAKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyBmaWxlbW9kZT0lcicgJSBzdGF0LmZpbGVtb2RlKGhpKSkKICAgICAgICAgaWYgbG86CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgZXh0ZXJuYWxfYXR0cj0lI3gnICUgbG8pCi0gICAgICAgIGlzZGlyID0gc2VsZi5maWxlbmFtZVstMTpdID09ICcvJworICAgICAgICBpc2RpciA9IHNlbGYuaXNfZGlyKCkKICAgICAgICAgaWYgbm90IGlzZGlyIG9yIHNlbGYuZmlsZV9zaXplOgogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnIGZpbGVfc2l6ZT0lcicgJSBzZWxmLmZpbGVfc2l6ZSkKICAgICAgICAgaWYgKChub3QgaXNkaXIgb3Igc2VsZi5jb21wcmVzc19zaXplKSBhbmQKQEAgLTQ2OSw2ICs0NjksNDIgQEAKIAogICAgICAgICAgICAgZXh0cmEgPSBleHRyYVtsbis0Ol0KIAorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX2ZpbGUoY2xzLCBmaWxlbmFtZSwgYXJjbmFtZT1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGFuIGFwcHJvcHJpYXRlIFppcEluZm8gZm9yIGEgZmlsZSBvbiB0aGUgZmlsZXN5c3RlbS4KKworICAgICAgICBmaWxlbmFtZSBzaG91bGQgYmUgdGhlIHBhdGggdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSBvbiB0aGUgZmlsZXN5c3RlbS4KKworICAgICAgICBhcmNuYW1lIGlzIHRoZSBuYW1lIHdoaWNoIGl0IHdpbGwgaGF2ZSB3aXRoaW4gdGhlIGFyY2hpdmUgKGJ5IGRlZmF1bHQsCisgICAgICAgIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyBmaWxlbmFtZSwgYnV0IHdpdGhvdXQgYSBkcml2ZSBsZXR0ZXIgYW5kIHdpdGgKKyAgICAgICAgbGVhZGluZyBwYXRoIHNlcGFyYXRvcnMgcmVtb3ZlZCkuCisgICAgICAgICIiIgorICAgICAgICBzdCA9IG9zLnN0YXQoZmlsZW5hbWUpCisgICAgICAgIGlzZGlyID0gc3RhdC5TX0lTRElSKHN0LnN0X21vZGUpCisgICAgICAgIG10aW1lID0gdGltZS5sb2NhbHRpbWUoc3Quc3RfbXRpbWUpCisgICAgICAgIGRhdGVfdGltZSA9IG10aW1lWzA6Nl0KKyAgICAgICAgIyBDcmVhdGUgWmlwSW5mbyBpbnN0YW5jZSB0byBzdG9yZSBmaWxlIGluZm9ybWF0aW9uCisgICAgICAgIGlmIGFyY25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGFyY25hbWUgPSBmaWxlbmFtZQorICAgICAgICBhcmNuYW1lID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLnNwbGl0ZHJpdmUoYXJjbmFtZSlbMV0pCisgICAgICAgIHdoaWxlIGFyY25hbWVbMF0gaW4gKG9zLnNlcCwgb3MuYWx0c2VwKToKKyAgICAgICAgICAgIGFyY25hbWUgPSBhcmNuYW1lWzE6XQorICAgICAgICBpZiBpc2RpcjoKKyAgICAgICAgICAgIGFyY25hbWUgKz0gJy8nCisgICAgICAgIHppbmZvID0gY2xzKGFyY25hbWUsIGRhdGVfdGltZSkKKyAgICAgICAgemluZm8uZXh0ZXJuYWxfYXR0ciA9IChzdC5zdF9tb2RlICYgMHhGRkZGKSA8PCAxNiAgIyBVbml4IGF0dHJpYnV0ZXMKKyAgICAgICAgaWYgaXNkaXI6CisgICAgICAgICAgICB6aW5mby5maWxlX3NpemUgPSAwCisgICAgICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyIHw9IDB4MTAgICMgTVMtRE9TIGRpcmVjdG9yeSBmbGFnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB6aW5mby5maWxlX3NpemUgPSBzdC5zdF9zaXplCisKKyAgICAgICAgcmV0dXJuIHppbmZvCisKKyAgICBkZWYgaXNfZGlyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGlzIGFyY2hpdmUgbWVtYmVyIGlzIGEgZGlyZWN0b3J5LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZVstMV0gPT0gJy8nCisKIAogY2xhc3MgX1ppcERlY3J5cHRlcjoKICAgICAiIiJDbGFzcyB0byBoYW5kbGUgZGVjcnlwdGlvbiBvZiBmaWxlcyBzdG9yZWQgd2l0aGluIGEgWklQIGFyY2hpdmUuCkBAIC02NTEsMTQgKzY4NywxOSBAQAogCiAKIGNsYXNzIF9TaGFyZWRGaWxlOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBwb3MsIGNsb3NlLCBsb2NrKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgcG9zLCBjbG9zZSwgbG9jaywgd3JpdGluZyk6CiAgICAgICAgIHNlbGYuX2ZpbGUgPSBmaWxlCiAgICAgICAgIHNlbGYuX3BvcyA9IHBvcwogICAgICAgICBzZWxmLl9jbG9zZSA9IGNsb3NlCiAgICAgICAgIHNlbGYuX2xvY2sgPSBsb2NrCisgICAgICAgIHNlbGYuX3dyaXRpbmcgPSB3cml0aW5nCiAKICAgICBkZWYgcmVhZChzZWxmLCBuPS0xKToKICAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgorICAgICAgICAgICAgaWYgc2VsZi5fd3JpdGluZygpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2FuJ3QgcmVhZCBmcm9tIHRoZSBaSVAgZmlsZSB3aGlsZSB0aGVyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaXMgYW4gb3BlbiB3cml0aW5nIGhhbmRsZSBvbiBpdC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIkNsb3NlIHRoZSB3cml0aW5nIGhhbmRsZSBiZWZvcmUgdHJ5aW5nIHRvIHJlYWQuIikKICAgICAgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzZWxmLl9wb3MpCiAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZmlsZS5yZWFkKG4pCiAgICAgICAgICAgICBzZWxmLl9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQpAQCAtNzAyLDkgKzc0Myw2IEBACiAgICAgIyBSZWFkIGZyb20gY29tcHJlc3NlZCBmaWxlcyBpbiA0ayBibG9ja3MuCiAgICAgTUlOX1JFQURfU0laRSA9IDQwOTYKIAotICAgICMgU2VhcmNoIGZvciB1bml2ZXJzYWwgbmV3bGluZXMgb3IgbGluZSBjaHVua3MuCi0gICAgUEFUVEVSTiA9IHJlLmNvbXBpbGUoYnInXig/UDxjaHVuaz5bXlxyXG5dKyl8KD9QPG5ld2xpbmU+XG58XHJcbj8pJykKLQogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqLCBtb2RlLCB6aXBpbmZvLCBkZWNyeXB0ZXI9Tm9uZSwKICAgICAgICAgICAgICAgICAgY2xvc2VfZmlsZW9iaj1GYWxzZSk6CiAgICAgICAgIHNlbGYuX2ZpbGVvYmogPSBmaWxlb2JqCkBAIC03MjEsNyArNzU5LDYgQEAKICAgICAgICAgc2VsZi5fcmVhZGJ1ZmZlciA9IGInJwogICAgICAgICBzZWxmLl9vZmZzZXQgPSAwCiAKLSAgICAgICAgc2VsZi5fdW5pdmVyc2FsID0gJ1UnIGluIG1vZGUKICAgICAgICAgc2VsZi5uZXdsaW5lcyA9IE5vbmUKIAogICAgICAgICAjIEFkanVzdCByZWFkIHNpemUgZm9yIGVuY3J5cHRlZCBmaWxlcyBzaW5jZSB0aGUgZmlyc3QgMTIgYnl0ZXMKQEAgLTc1OCw3ICs3OTUsNyBAQAogICAgICAgICBJZiBsaW1pdCBpcyBzcGVjaWZpZWQsIGF0IG1vc3QgbGltaXQgYnl0ZXMgd2lsbCBiZSByZWFkLgogICAgICAgICAiIiIKIAotICAgICAgICBpZiBub3Qgc2VsZi5fdW5pdmVyc2FsIGFuZCBsaW1pdCA8IDA6CisgICAgICAgIGlmIGxpbWl0IDwgMDoKICAgICAgICAgICAgICMgU2hvcnRjdXQgY29tbW9uIGNhc2UgLSBuZXdsaW5lIGZvdW5kIGluIGJ1ZmZlci4KICAgICAgICAgICAgIGkgPSBzZWxmLl9yZWFkYnVmZmVyLmZpbmQoYidcbicsIHNlbGYuX29mZnNldCkgKyAxCiAgICAgICAgICAgICBpZiBpID4gMDoKQEAgLTc2Niw0MSArODAzLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLl9vZmZzZXQgPSBpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUKIAotICAgICAgICBpZiBub3Qgc2VsZi5fdW5pdmVyc2FsOgotICAgICAgICAgICAgcmV0dXJuIGlvLkJ1ZmZlcmVkSU9CYXNlLnJlYWRsaW5lKHNlbGYsIGxpbWl0KQotCi0gICAgICAgIGxpbmUgPSBiJycKLSAgICAgICAgd2hpbGUgbGltaXQgPCAwIG9yIGxlbihsaW5lKSA8IGxpbWl0OgotICAgICAgICAgICAgcmVhZGFoZWFkID0gc2VsZi5wZWVrKDIpCi0gICAgICAgICAgICBpZiByZWFkYWhlYWQgPT0gYicnOgotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lCi0KLSAgICAgICAgICAgICMKLSAgICAgICAgICAgICMgU2VhcmNoIGZvciB1bml2ZXJzYWwgbmV3bGluZXMgb3IgbGluZSBjaHVua3MuCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIFRoZSBwYXR0ZXJuIHJldHVybnMgZWl0aGVyIGEgbGluZSBjaHVuayBvciBhIG5ld2xpbmUsIGJ1dCBub3QKLSAgICAgICAgICAgICMgYm90aC4gQ29tYmluZWQgd2l0aCBwZWVrKDIpLCB3ZSBhcmUgYXNzdXJlZCB0aGF0IHRoZSBzZXF1ZW5jZQotICAgICAgICAgICAgIyAnXHJcbicgaXMgYWx3YXlzIHJldHJpZXZlZCBjb21wbGV0ZWx5IGFuZCBuZXZlciBzcGxpdCBpbnRvCi0gICAgICAgICAgICAjIHNlcGFyYXRlIG5ld2xpbmVzIC0gJ1xyJywgJ1xuJyBkdWUgdG8gY29pbmNpZGVudGFsIHJlYWRhaGVhZHMuCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICBtYXRjaCA9IHNlbGYuUEFUVEVSTi5zZWFyY2gocmVhZGFoZWFkKQotICAgICAgICAgICAgbmV3bGluZSA9IG1hdGNoLmdyb3VwKCduZXdsaW5lJykKLSAgICAgICAgICAgIGlmIG5ld2xpbmUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgaWYgc2VsZi5uZXdsaW5lcyBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmVzID0gW10KLSAgICAgICAgICAgICAgICBpZiBuZXdsaW5lIG5vdCBpbiBzZWxmLm5ld2xpbmVzOgotICAgICAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmVzLmFwcGVuZChuZXdsaW5lKQotICAgICAgICAgICAgICAgIHNlbGYuX29mZnNldCArPSBsZW4obmV3bGluZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGluZSArIGInXG4nCi0KLSAgICAgICAgICAgIGNodW5rID0gbWF0Y2guZ3JvdXAoJ2NodW5rJykKLSAgICAgICAgICAgIGlmIGxpbWl0ID49IDA6Ci0gICAgICAgICAgICAgICAgY2h1bmsgPSBjaHVua1s6IGxpbWl0IC0gbGVuKGxpbmUpXQotCi0gICAgICAgICAgICBzZWxmLl9vZmZzZXQgKz0gbGVuKGNodW5rKQotICAgICAgICAgICAgbGluZSArPSBjaHVuawotCi0gICAgICAgIHJldHVybiBsaW5lCisgICAgICAgIHJldHVybiBpby5CdWZmZXJlZElPQmFzZS5yZWFkbGluZShzZWxmLCBsaW1pdCkKIAogICAgIGRlZiBwZWVrKHNlbGYsIG49MSk6CiAgICAgICAgICIiIlJldHVybnMgYnVmZmVyZWQgYnl0ZXMgd2l0aG91dCBhZHZhbmNpbmcgdGhlIHBvc2l0aW9uLiIiIgpAQCAtOTU4LDYgKzk2MSw3NiBAQAogICAgICAgICAgICAgc3VwZXIoKS5jbG9zZSgpCiAKIAorY2xhc3MgX1ppcFdyaXRlRmlsZShpby5CdWZmZXJlZElPQmFzZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHpmLCB6aW5mbywgemlwNjQpOgorICAgICAgICBzZWxmLl96aW5mbyA9IHppbmZvCisgICAgICAgIHNlbGYuX3ppcDY0ID0gemlwNjQKKyAgICAgICAgc2VsZi5femlwZmlsZSA9IHpmCisgICAgICAgIHNlbGYuX2NvbXByZXNzb3IgPSBfZ2V0X2NvbXByZXNzb3IoemluZm8uY29tcHJlc3NfdHlwZSkKKyAgICAgICAgc2VsZi5fZmlsZV9zaXplID0gMAorICAgICAgICBzZWxmLl9jb21wcmVzc19zaXplID0gMAorICAgICAgICBzZWxmLl9jcmMgPSAwCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX2ZpbGVvYmooc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl96aXBmaWxlLmZwCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgIG5ieXRlcyA9IGxlbihkYXRhKQorICAgICAgICBzZWxmLl9maWxlX3NpemUgKz0gbmJ5dGVzCisgICAgICAgIHNlbGYuX2NyYyA9IGNyYzMyKGRhdGEsIHNlbGYuX2NyYykKKyAgICAgICAgaWYgc2VsZi5fY29tcHJlc3NvcjoKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9jb21wcmVzc29yLmNvbXByZXNzKGRhdGEpCisgICAgICAgICAgICBzZWxmLl9jb21wcmVzc19zaXplICs9IGxlbihkYXRhKQorICAgICAgICBzZWxmLl9maWxlb2JqLndyaXRlKGRhdGEpCisgICAgICAgIHJldHVybiBuYnl0ZXMKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc3VwZXIoKS5jbG9zZSgpCisgICAgICAgICMgRmx1c2ggYW55IGRhdGEgZnJvbSB0aGUgY29tcHJlc3NvciwgYW5kIHVwZGF0ZSBoZWFkZXIgaW5mbworICAgICAgICBpZiBzZWxmLl9jb21wcmVzc29yOgorICAgICAgICAgICAgYnVmID0gc2VsZi5fY29tcHJlc3Nvci5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLl9jb21wcmVzc19zaXplICs9IGxlbihidWYpCisgICAgICAgICAgICBzZWxmLl9maWxlb2JqLndyaXRlKGJ1ZikKKyAgICAgICAgICAgIHNlbGYuX3ppbmZvLmNvbXByZXNzX3NpemUgPSBzZWxmLl9jb21wcmVzc19zaXplCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl96aW5mby5jb21wcmVzc19zaXplID0gc2VsZi5fZmlsZV9zaXplCisgICAgICAgIHNlbGYuX3ppbmZvLkNSQyA9IHNlbGYuX2NyYworICAgICAgICBzZWxmLl96aW5mby5maWxlX3NpemUgPSBzZWxmLl9maWxlX3NpemUKKworICAgICAgICAjIFdyaXRlIHVwZGF0ZWQgaGVhZGVyIGluZm8KKyAgICAgICAgaWYgc2VsZi5femluZm8uZmxhZ19iaXRzICYgMHgwODoKKyAgICAgICAgICAgICMgV3JpdGUgQ1JDIGFuZCBmaWxlIHNpemVzIGFmdGVyIHRoZSBmaWxlIGRhdGEKKyAgICAgICAgICAgIGZtdCA9ICc8TFFRJyBpZiBzZWxmLl96aXA2NCBlbHNlICc8TExMJworICAgICAgICAgICAgc2VsZi5fZmlsZW9iai53cml0ZShzdHJ1Y3QucGFjayhmbXQsIHNlbGYuX3ppbmZvLkNSQywKKyAgICAgICAgICAgICAgICBzZWxmLl96aW5mby5jb21wcmVzc19zaXplLCBzZWxmLl96aW5mby5maWxlX3NpemUpKQorICAgICAgICAgICAgc2VsZi5femlwZmlsZS5zdGFydF9kaXIgPSBzZWxmLl9maWxlb2JqLnRlbGwoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3ppcDY0OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2ZpbGVfc2l6ZSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0ZpbGUgc2l6ZSB1bmV4cGVjdGVkbHkgZXhjZWVkZWQgWklQNjQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbWl0JykKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9jb21wcmVzc19zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignQ29tcHJlc3NlZCBzaXplIHVuZXhwZWN0ZWRseSBleGNlZWRlZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWklQNjQgbGltaXQnKQorICAgICAgICAgICAgIyBTZWVrIGJhY2t3YXJkcyBhbmQgd3JpdGUgZmlsZSBoZWFkZXIgKHdoaWNoIHdpbGwgbm93IGluY2x1ZGUKKyAgICAgICAgICAgICMgY29ycmVjdCBDUkMgYW5kIGZpbGUgc2l6ZXMpCisKKyAgICAgICAgICAgICMgUHJlc2VydmUgY3VycmVudCBwb3NpdGlvbiBpbiBmaWxlCisgICAgICAgICAgICBzZWxmLl96aXBmaWxlLnN0YXJ0X2RpciA9IHNlbGYuX2ZpbGVvYmoudGVsbCgpCisgICAgICAgICAgICBzZWxmLl9maWxlb2JqLnNlZWsoc2VsZi5femluZm8uaGVhZGVyX29mZnNldCkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVvYmoud3JpdGUoc2VsZi5femluZm8uRmlsZUhlYWRlcihzZWxmLl96aXA2NCkpCisgICAgICAgICAgICBzZWxmLl9maWxlb2JqLnNlZWsoc2VsZi5femlwZmlsZS5zdGFydF9kaXIpCisKKyAgICAgICAgc2VsZi5femlwZmlsZS5fd3JpdGluZyA9IEZhbHNlCisKKyAgICAgICAgIyBTdWNjZXNzZnVsbHkgd3JpdHRlbjogQWRkIGZpbGUgdG8gb3VyIGNhY2hlcworICAgICAgICBzZWxmLl96aXBmaWxlLmZpbGVsaXN0LmFwcGVuZChzZWxmLl96aW5mbykKKyAgICAgICAgc2VsZi5femlwZmlsZS5OYW1lVG9JbmZvW3NlbGYuX3ppbmZvLmZpbGVuYW1lXSA9IHNlbGYuX3ppbmZvCisKIGNsYXNzIFppcEZpbGU6CiAgICAgIiIiIENsYXNzIHdpdGggbWV0aG9kcyB0byBvcGVuLCByZWFkLCB3cml0ZSwgY2xvc2UsIGxpc3QgemlwIGZpbGVzLgogCkBAIC0xMDIwLDYgKzEwOTMsNyBAQAogICAgICAgICBzZWxmLl9maWxlUmVmQ250ID0gMQogICAgICAgICBzZWxmLl9sb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKICAgICAgICAgc2VsZi5fc2Vla2FibGUgPSBUcnVlCisgICAgICAgIHNlbGYuX3dyaXRpbmcgPSBGYWxzZQogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGlmIG1vZGUgPT0gJ3InOgpAQCAtMTIzMiwzMCArMTMwNiw1NSBAQAogICAgICAgICB3aXRoIHNlbGYub3BlbihuYW1lLCAiciIsIHB3ZCkgYXMgZnA6CiAgICAgICAgICAgICByZXR1cm4gZnAucmVhZCgpCiAKLSAgICBkZWYgb3BlbihzZWxmLCBuYW1lLCBtb2RlPSJyIiwgcHdkPU5vbmUpOgotICAgICAgICAiIiJSZXR1cm4gZmlsZS1saWtlIG9iamVjdCBmb3IgJ25hbWUnLiIiIgotICAgICAgICBpZiBtb2RlIG5vdCBpbiAoInIiLCAiVSIsICJyVSIpOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdvcGVuKCkgcmVxdWlyZXMgbW9kZSAiciIsICJVIiwgb3IgInJVIicpCi0gICAgICAgIGlmICdVJyBpbiBtb2RlOgotICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgICAgICB3YXJuaW5ncy53YXJuKCInVScgbW9kZSBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgIGRlZiBvcGVuKHNlbGYsIG5hbWUsIG1vZGU9InIiLCBwd2Q9Tm9uZSwgKiwgZm9yY2VfemlwNjQ9RmFsc2UpOgorICAgICAgICAiIiJSZXR1cm4gZmlsZS1saWtlIG9iamVjdCBmb3IgJ25hbWUnLgorCisgICAgICAgIG5hbWUgaXMgYSBzdHJpbmcgZm9yIHRoZSBmaWxlIG5hbWUgd2l0aGluIHRoZSBaSVAgZmlsZSwgb3IgYSBaaXBJbmZvCisgICAgICAgIG9iamVjdC4KKworICAgICAgICBtb2RlIHNob3VsZCBiZSAncicgdG8gcmVhZCBhIGZpbGUgYWxyZWFkeSBpbiB0aGUgWklQIGZpbGUsIG9yICd3JyB0bworICAgICAgICB3cml0ZSB0byBhIGZpbGUgbmV3bHkgYWRkZWQgdG8gdGhlIGFyY2hpdmUuCisKKyAgICAgICAgcHdkIGlzIHRoZSBwYXNzd29yZCB0byBkZWNyeXB0IGZpbGVzIChvbmx5IHVzZWQgZm9yIHJlYWRpbmcpLgorCisgICAgICAgIFdoZW4gd3JpdGluZywgaWYgdGhlIGZpbGUgc2l6ZSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSBidXQgbWF5IGV4Y2VlZAorICAgICAgICAyIEdpQiwgcGFzcyBmb3JjZV96aXA2NCB0byB1c2UgdGhlIFpJUDY0IGZvcm1hdCwgd2hpY2ggY2FuIGhhbmRsZSBsYXJnZQorICAgICAgICBmaWxlcy4gIElmIHRoZSBzaXplIGlzIGtub3duIGluIGFkdmFuY2UsIGl0IGlzIGJlc3QgdG8gcGFzcyBhIFppcEluZm8KKyAgICAgICAgaW5zdGFuY2UgZm9yIG5hbWUsIHdpdGggemluZm8uZmlsZV9zaXplIHNldC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG1vZGUgbm90IGluIHsiciIsICJ3In06CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ29wZW4oKSByZXF1aXJlcyBtb2RlICJyIiBvciAidyInKQogICAgICAgICBpZiBwd2QgYW5kIG5vdCBpc2luc3RhbmNlKHB3ZCwgYnl0ZXMpOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJwd2Q6IGV4cGVjdGVkIGJ5dGVzLCBnb3QgJXMiICUgdHlwZShwd2QpKQorICAgICAgICBpZiBwd2QgYW5kIChtb2RlID09ICJ3Iik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwd2QgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHJlYWRpbmcgZmlsZXMiKQogICAgICAgICBpZiBub3Qgc2VsZi5mcDoKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKLSAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byByZWFkIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIikKKyAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byB1c2UgWklQIGFyY2hpdmUgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQiKQogCiAgICAgICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gaW5mbyBvYmplY3QKICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCBaaXBJbmZvKToKICAgICAgICAgICAgICMgJ25hbWUnIGlzIGFscmVhZHkgYW4gaW5mbyBvYmplY3QKICAgICAgICAgICAgIHppbmZvID0gbmFtZQorICAgICAgICBlbGlmIG1vZGUgPT0gJ3cnOgorICAgICAgICAgICAgemluZm8gPSBaaXBJbmZvKG5hbWUpCisgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gc2VsZi5jb21wcmVzc2lvbgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyBHZXQgaW5mbyBvYmplY3QgZm9yIG5hbWUKICAgICAgICAgICAgIHppbmZvID0gc2VsZi5nZXRpbmZvKG5hbWUpCiAKKyAgICAgICAgaWYgbW9kZSA9PSAndyc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fb3Blbl90b193cml0ZSh6aW5mbywgZm9yY2VfemlwNjQ9Zm9yY2VfemlwNjQpCisKKyAgICAgICAgaWYgc2VsZi5fd3JpdGluZzoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2FuJ3QgcmVhZCBmcm9tIHRoZSBaSVAgZmlsZSB3aGlsZSB0aGVyZSAiCisgICAgICAgICAgICAgICAgICAgICJpcyBhbiBvcGVuIHdyaXRpbmcgaGFuZGxlIG9uIGl0LiAiCisgICAgICAgICAgICAgICAgICAgICJDbG9zZSB0aGUgd3JpdGluZyBoYW5kbGUgYmVmb3JlIHRyeWluZyB0byByZWFkLiIpCisKKyAgICAgICAgIyBPcGVuIGZvciByZWFkaW5nOgogICAgICAgICBzZWxmLl9maWxlUmVmQ250ICs9IDEKLSAgICAgICAgemVmX2ZpbGUgPSBfU2hhcmVkRmlsZShzZWxmLmZwLCB6aW5mby5oZWFkZXJfb2Zmc2V0LCBzZWxmLl9mcGNsb3NlLCBzZWxmLl9sb2NrKQorICAgICAgICB6ZWZfZmlsZSA9IF9TaGFyZWRGaWxlKHNlbGYuZnAsIHppbmZvLmhlYWRlcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnBjbG9zZSwgc2VsZi5fbG9jaywgbGFtYmRhOiBzZWxmLl93cml0aW5nKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICAjIFNraXAgdGhlIGZpbGUgaGVhZGVyOgogICAgICAgICAgICAgZmhlYWRlciA9IHplZl9maWxlLnJlYWQoc2l6ZUZpbGVIZWFkZXIpCkBAIC0xMzIwLDYgKzE0MTksNDkgQEAKICAgICAgICAgICAgIHplZl9maWxlLmNsb3NlKCkKICAgICAgICAgICAgIHJhaXNlCiAKKyAgICBkZWYgX29wZW5fdG9fd3JpdGUoc2VsZiwgemluZm8sIGZvcmNlX3ppcDY0PUZhbHNlKToKKyAgICAgICAgaWYgZm9yY2VfemlwNjQgYW5kIG5vdCBzZWxmLl9hbGxvd1ppcDY0OgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAiZm9yY2VfemlwNjQgaXMgVHJ1ZSwgYnV0IGFsbG93WmlwNjQgd2FzIEZhbHNlIHdoZW4gb3BlbmluZyAiCisgICAgICAgICAgICAgICAgInRoZSBaSVAgZmlsZS4iCisgICAgICAgICAgICApCisgICAgICAgIGlmIHNlbGYuX3dyaXRpbmc6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbid0IHdyaXRlIHRvIHRoZSBaSVAgZmlsZSB3aGlsZSB0aGVyZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFub3RoZXIgd3JpdGUgaGFuZGxlIG9wZW4gb24gaXQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xvc2UgdGhlIGZpcnN0IGhhbmRsZSBiZWZvcmUgb3BlbmluZyBhbm90aGVyLiIpCisKKyAgICAgICAgIyBTaXplcyBhbmQgQ1JDIGFyZSBvdmVyd3JpdHRlbiB3aXRoIGNvcnJlY3QgZGF0YSBhZnRlciBwcm9jZXNzaW5nIHRoZSBmaWxlCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHppbmZvLCAnZmlsZV9zaXplJyk6CisgICAgICAgICAgICB6aW5mby5maWxlX3NpemUgPSAwCisgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSAwCisgICAgICAgIHppbmZvLkNSQyA9IDAKKworICAgICAgICB6aW5mby5mbGFnX2JpdHMgPSAweDAwCisgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0xaTUE6CisgICAgICAgICAgICAjIENvbXByZXNzZWQgZGF0YSBpbmNsdWRlcyBhbiBlbmQtb2Ytc3RyZWFtIChFT1MpIG1hcmtlcgorICAgICAgICAgICAgemluZm8uZmxhZ19iaXRzIHw9IDB4MDIKKyAgICAgICAgaWYgbm90IHNlbGYuX3NlZWthYmxlOgorICAgICAgICAgICAgemluZm8uZmxhZ19iaXRzIHw9IDB4MDgKKworICAgICAgICBpZiBub3QgemluZm8uZXh0ZXJuYWxfYXR0cjoKKyAgICAgICAgICAgIHppbmZvLmV4dGVybmFsX2F0dHIgPSAwbzYwMCA8PCAxNiAgIyBwZXJtaXNzaW9uczogP3J3LS0tLS0tLQorCisgICAgICAgICMgQ29tcHJlc3NlZCBzaXplIGNhbiBiZSBsYXJnZXIgdGhhbiB1bmNvbXByZXNzZWQgc2l6ZQorICAgICAgICB6aXA2NCA9IHNlbGYuX2FsbG93WmlwNjQgYW5kIFwKKyAgICAgICAgICAgICAgICAoZm9yY2VfemlwNjQgb3IgemluZm8uZmlsZV9zaXplICogMS4wNSA+IFpJUDY0X0xJTUlUKQorCisgICAgICAgIGlmIHNlbGYuX3NlZWthYmxlOgorICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc3RhcnRfZGlyKQorICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkKKworICAgICAgICBzZWxmLl93cml0ZWNoZWNrKHppbmZvKQorICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCisKKyAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5GaWxlSGVhZGVyKHppcDY0KSkKKworICAgICAgICBzZWxmLl93cml0aW5nID0gVHJ1ZQorICAgICAgICByZXR1cm4gX1ppcFdyaXRlRmlsZShzZWxmLCB6aW5mbywgemlwNjQpCisKICAgICBkZWYgZXh0cmFjdChzZWxmLCBtZW1iZXIsIHBhdGg9Tm9uZSwgcHdkPU5vbmUpOgogICAgICAgICAiIiJFeHRyYWN0IGEgbWVtYmVyIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksCiAgICAgICAgICAgIHVzaW5nIGl0cyBmdWxsIG5hbWUuIEl0cyBmaWxlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBhcyBhY2N1cmF0ZWx5CkBAIC0xMzg5LDcgKzE1MzEsNyBAQAogICAgICAgICBpZiB1cHBlcmRpcnMgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyh1cHBlcmRpcnMpOgogICAgICAgICAgICAgb3MubWFrZWRpcnModXBwZXJkaXJzKQogCi0gICAgICAgIGlmIG1lbWJlci5maWxlbmFtZVstMV0gPT0gJy8nOgorICAgICAgICBpZiBtZW1iZXIuaXNfZGlyKCk6CiAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcih0YXJnZXRwYXRoKToKICAgICAgICAgICAgICAgICBvcy5ta2Rpcih0YXJnZXRwYXRoKQogICAgICAgICAgICAgcmV0dXJuIHRhcmdldHBhdGgKQEAgLTE0MjksMTAzICsxNTcxLDQxIEBACiAgICAgICAgIGlmIG5vdCBzZWxmLmZwOgogICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHdyaXRlIHRvIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIikKKyAgICAgICAgaWYgc2VsZi5fd3JpdGluZzoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICAgICAiQ2FuJ3Qgd3JpdGUgdG8gWklQIGFyY2hpdmUgd2hpbGUgYW4gb3BlbiB3cml0aW5nIGhhbmRsZSBleGlzdHMiCisgICAgICAgICAgICApCiAKLSAgICAgICAgc3QgPSBvcy5zdGF0KGZpbGVuYW1lKQotICAgICAgICBpc2RpciA9IHN0YXQuU19JU0RJUihzdC5zdF9tb2RlKQotICAgICAgICBtdGltZSA9IHRpbWUubG9jYWx0aW1lKHN0LnN0X210aW1lKQotICAgICAgICBkYXRlX3RpbWUgPSBtdGltZVswOjZdCi0gICAgICAgICMgQ3JlYXRlIFppcEluZm8gaW5zdGFuY2UgdG8gc3RvcmUgZmlsZSBpbmZvcm1hdGlvbgotICAgICAgICBpZiBhcmNuYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICBhcmNuYW1lID0gZmlsZW5hbWUKLSAgICAgICAgYXJjbmFtZSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5zcGxpdGRyaXZlKGFyY25hbWUpWzFdKQotICAgICAgICB3aGlsZSBhcmNuYW1lWzBdIGluIChvcy5zZXAsIG9zLmFsdHNlcCk6Ci0gICAgICAgICAgICBhcmNuYW1lID0gYXJjbmFtZVsxOl0KLSAgICAgICAgaWYgaXNkaXI6Ci0gICAgICAgICAgICBhcmNuYW1lICs9ICcvJwotICAgICAgICB6aW5mbyA9IFppcEluZm8oYXJjbmFtZSwgZGF0ZV90aW1lKQotICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyID0gKHN0WzBdICYgMHhGRkZGKSA8PCAxNiAgICAgICMgVW5peCBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIGlzZGlyOgotICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IFpJUF9TVE9SRUQKLSAgICAgICAgZWxpZiBjb21wcmVzc190eXBlIGlzIE5vbmU6Ci0gICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gc2VsZi5jb21wcmVzc2lvbgorICAgICAgICB6aW5mbyA9IFppcEluZm8uZnJvbV9maWxlKGZpbGVuYW1lLCBhcmNuYW1lKQorCisgICAgICAgIGlmIHppbmZvLmlzX2RpcigpOgorICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IDAKKyAgICAgICAgICAgIHppbmZvLkNSQyA9IDAKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCisgICAgICAgICAgICBpZiBjb21wcmVzc190eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBzZWxmLmNvbXByZXNzaW9uCiAKLSAgICAgICAgemluZm8uZmlsZV9zaXplID0gc3Quc3Rfc2l6ZQotICAgICAgICB6aW5mby5mbGFnX2JpdHMgPSAweDAwCi0gICAgICAgIHdpdGggc2VsZi5fbG9jazoKLSAgICAgICAgICAgIGlmIHNlbGYuX3NlZWthYmxlOgotICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnN0YXJ0X2RpcikKLSAgICAgICAgICAgIHppbmZvLmhlYWRlcl9vZmZzZXQgPSBzZWxmLmZwLnRlbGwoKSAgICAjIFN0YXJ0IG9mIGhlYWRlciBieXRlcwotICAgICAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfTFpNQToKKyAgICAgICAgaWYgemluZm8uaXNfZGlyKCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fc2Vla2FibGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnN0YXJ0X2RpcikKKyAgICAgICAgICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICMgU3RhcnQgb2YgaGVhZGVyIGJ5dGVzCisgICAgICAgICAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfTFpNQToKICAgICAgICAgICAgICAgICAjIENvbXByZXNzZWQgZGF0YSBpbmNsdWRlcyBhbiBlbmQtb2Ytc3RyZWFtIChFT1MpIG1hcmtlcgotICAgICAgICAgICAgICAgIHppbmZvLmZsYWdfYml0cyB8PSAweDAyCisgICAgICAgICAgICAgICAgICAgIHppbmZvLmZsYWdfYml0cyB8PSAweDAyCiAKLSAgICAgICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCi0gICAgICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCisgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKKyAgICAgICAgICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCiAKLSAgICAgICAgICAgIGlmIGlzZGlyOgotICAgICAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IDAKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gMAotICAgICAgICAgICAgICAgIHppbmZvLkNSQyA9IDAKLSAgICAgICAgICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyIHw9IDB4MTAgICMgTVMtRE9TIGRpcmVjdG9yeSBmbGFnCiAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoemluZm8pCiAgICAgICAgICAgICAgICAgc2VsZi5OYW1lVG9JbmZvW3ppbmZvLmZpbGVuYW1lXSA9IHppbmZvCiAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5GaWxlSGVhZGVyKEZhbHNlKSkKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0X2RpciA9IHNlbGYuZnAudGVsbCgpCi0gICAgICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgICAgIGNtcHIgPSBfZ2V0X2NvbXByZXNzb3IoemluZm8uY29tcHJlc3NfdHlwZSkKLSAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zZWVrYWJsZToKLSAgICAgICAgICAgICAgICB6aW5mby5mbGFnX2JpdHMgfD0gMHgwOAotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiKSBhcyBmcDoKLSAgICAgICAgICAgICAgICAjIE11c3Qgb3ZlcndyaXRlIENSQyBhbmQgc2l6ZXMgd2l0aCBjb3JyZWN0IGRhdGEgbGF0ZXIKLSAgICAgICAgICAgICAgICB6aW5mby5DUkMgPSBDUkMgPSAwCi0gICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IGNvbXByZXNzX3NpemUgPSAwCi0gICAgICAgICAgICAgICAgIyBDb21wcmVzc2VkIHNpemUgY2FuIGJlIGxhcmdlciB0aGFuIHVuY29tcHJlc3NlZCBzaXplCi0gICAgICAgICAgICAgICAgemlwNjQgPSBzZWxmLl9hbGxvd1ppcDY0IGFuZCBcCi0gICAgICAgICAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSAqIDEuMDUgPiBaSVA2NF9MSU1JVAotICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcih6aXA2NCkpCi0gICAgICAgICAgICAgICAgZmlsZV9zaXplID0gMAotICAgICAgICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGZwLnJlYWQoMTAyNCAqIDgpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBidWY6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemUgPSBmaWxlX3NpemUgKyBsZW4oYnVmKQotICAgICAgICAgICAgICAgICAgICBDUkMgPSBjcmMzMihidWYsIENSQykKLSAgICAgICAgICAgICAgICAgICAgaWYgY21wcjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGNtcHIuY29tcHJlc3MoYnVmKQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IGNvbXByZXNzX3NpemUgKyBsZW4oYnVmKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGJ1ZikKLSAgICAgICAgICAgIGlmIGNtcHI6Ci0gICAgICAgICAgICAgICAgYnVmID0gY21wci5mbHVzaCgpCi0gICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IGNvbXByZXNzX3NpemUgKyBsZW4oYnVmKQotICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoYnVmKQotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSBjb21wcmVzc19zaXplCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSBmaWxlX3NpemUKLSAgICAgICAgICAgIHppbmZvLkNSQyA9IENSQwotICAgICAgICAgICAgemluZm8uZmlsZV9zaXplID0gZmlsZV9zaXplCi0gICAgICAgICAgICBpZiB6aW5mby5mbGFnX2JpdHMgJiAweDA4OgotICAgICAgICAgICAgICAgICMgV3JpdGUgQ1JDIGFuZCBmaWxlIHNpemVzIGFmdGVyIHRoZSBmaWxlIGRhdGEKLSAgICAgICAgICAgICAgICBmbXQgPSAnPExRUScgaWYgemlwNjQgZWxzZSAnPExMTCcKLSAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHN0cnVjdC5wYWNrKGZtdCwgemluZm8uQ1JDLCB6aW5mby5jb21wcmVzc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemluZm8uZmlsZV9zaXplKSkKLSAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0X2RpciA9IHNlbGYuZnAudGVsbCgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGlmIG5vdCB6aXA2NCBhbmQgc2VsZi5fYWxsb3daaXA2NDoKLSAgICAgICAgICAgICAgICAgICAgaWYgZmlsZV9zaXplID4gWklQNjRfTElNSVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0ZpbGUgc2l6ZSBoYXMgaW5jcmVhc2VkIGR1cmluZyBjb21wcmVzc2luZycpCi0gICAgICAgICAgICAgICAgICAgIGlmIGNvbXByZXNzX3NpemUgPiBaSVA2NF9MSU1JVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignQ29tcHJlc3NlZCBzaXplIGxhcmdlciB0aGFuIHVuY29tcHJlc3NlZCBzaXplJykKLSAgICAgICAgICAgICAgICAjIFNlZWsgYmFja3dhcmRzIGFuZCB3cml0ZSBmaWxlIGhlYWRlciAod2hpY2ggd2lsbCBub3cgaW5jbHVkZQotICAgICAgICAgICAgICAgICMgY29ycmVjdCBDUkMgYW5kIGZpbGUgc2l6ZXMpCi0gICAgICAgICAgICAgICAgc2VsZi5zdGFydF9kaXIgPSBzZWxmLmZwLnRlbGwoKSAjIFByZXNlcnZlIGN1cnJlbnQgcG9zaXRpb24gaW4gZmlsZQotICAgICAgICAgICAgICAgIHNlbGYuZnAuc2Vlayh6aW5mby5oZWFkZXJfb2Zmc2V0KQotICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcih6aXA2NCkpCi0gICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc3RhcnRfZGlyKQotICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoemluZm8pCi0gICAgICAgICAgICBzZWxmLk5hbWVUb0luZm9bemluZm8uZmlsZW5hbWVdID0gemluZm8KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInJiIikgYXMgc3JjLCBzZWxmLm9wZW4oemluZm8sICd3JykgYXMgZGVzdDoKKyAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooc3JjLCBkZXN0LCAxMDI0KjgpCiAKICAgICBkZWYgd3JpdGVzdHIoc2VsZiwgemluZm9fb3JfYXJjbmFtZSwgZGF0YSwgY29tcHJlc3NfdHlwZT1Ob25lKToKICAgICAgICAgIiIiV3JpdGUgYSBmaWxlIGludG8gdGhlIGFyY2hpdmUuICBUaGUgY29udGVudHMgaXMgJ2RhdGEnLCB3aGljaApAQCAtMTU1MCw0NSArMTYzMCwxOCBAQAogICAgICAgICBpZiBub3Qgc2VsZi5mcDoKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byB3cml0ZSB0byBaSVAgYXJjaGl2ZSB0aGF0IHdhcyBhbHJlYWR5IGNsb3NlZCIpCisgICAgICAgIGlmIHNlbGYuX3dyaXRpbmc6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgICAgICAgIkNhbid0IHdyaXRlIHRvIFpJUCBhcmNoaXZlIHdoaWxlIGFuIG9wZW4gd3JpdGluZyBoYW5kbGUgZXhpc3RzLiIKKyAgICAgICAgICAgICkKKworICAgICAgICBpZiBjb21wcmVzc190eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IGNvbXByZXNzX3R5cGUKIAogICAgICAgICB6aW5mby5maWxlX3NpemUgPSBsZW4oZGF0YSkgICAgICAgICAgICAjIFVuY29tcHJlc3NlZCBzaXplCiAgICAgICAgIHdpdGggc2VsZi5fbG9jazoKLSAgICAgICAgICAgIGlmIHNlbGYuX3NlZWthYmxlOgotICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnN0YXJ0X2RpcikKLSAgICAgICAgICAgIHppbmZvLmhlYWRlcl9vZmZzZXQgPSBzZWxmLmZwLnRlbGwoKSAgICAjIFN0YXJ0IG9mIGhlYWRlciBkYXRhCi0gICAgICAgICAgICBpZiBjb21wcmVzc190eXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCi0gICAgICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICAgIyBTdGFydCBvZiBoZWFkZXIgZGF0YQotICAgICAgICAgICAgaWYgY29tcHJlc3NfdHlwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gY29tcHJlc3NfdHlwZQotICAgICAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfTFpNQToKLSAgICAgICAgICAgICAgICAjIENvbXByZXNzZWQgZGF0YSBpbmNsdWRlcyBhbiBlbmQtb2Ytc3RyZWFtIChFT1MpIG1hcmtlcgotICAgICAgICAgICAgICAgIHppbmZvLmZsYWdfYml0cyB8PSAweDAyCi0KLSAgICAgICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCi0gICAgICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCi0gICAgICAgICAgICB6aW5mby5DUkMgPSBjcmMzMihkYXRhKSAgICAgICAjIENSQy0zMiBjaGVja3N1bQotICAgICAgICAgICAgY28gPSBfZ2V0X2NvbXByZXNzb3IoemluZm8uY29tcHJlc3NfdHlwZSkKLSAgICAgICAgICAgIGlmIGNvOgotICAgICAgICAgICAgICAgIGRhdGEgPSBjby5jb21wcmVzcyhkYXRhKSArIGNvLmZsdXNoKCkKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gbGVuKGRhdGEpICAgICMgQ29tcHJlc3NlZCBzaXplCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSB6aW5mby5maWxlX3NpemUKLSAgICAgICAgICAgIHppcDY0ID0gemluZm8uZmlsZV9zaXplID4gWklQNjRfTElNSVQgb3IgXAotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPiBaSVA2NF9MSU1JVAotICAgICAgICAgICAgaWYgemlwNjQgYW5kIG5vdCBzZWxmLl9hbGxvd1ppcDY0OgotICAgICAgICAgICAgICAgIHJhaXNlIExhcmdlWmlwRmlsZSgiRmlsZXNpemUgd291bGQgcmVxdWlyZSBaSVA2NCBleHRlbnNpb25zIikKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcih6aXA2NCkpCi0gICAgICAgICAgICBzZWxmLmZwLndyaXRlKGRhdGEpCi0gICAgICAgICAgICBpZiB6aW5mby5mbGFnX2JpdHMgJiAweDA4OgotICAgICAgICAgICAgICAgICMgV3JpdGUgQ1JDIGFuZCBmaWxlIHNpemVzIGFmdGVyIHRoZSBmaWxlIGRhdGEKLSAgICAgICAgICAgICAgICBmbXQgPSAnPExRUScgaWYgemlwNjQgZWxzZSAnPExMTCcKLSAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHN0cnVjdC5wYWNrKGZtdCwgemluZm8uQ1JDLCB6aW5mby5jb21wcmVzc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemluZm8uZmlsZV9zaXplKSkKLSAgICAgICAgICAgIHNlbGYuZnAuZmx1c2goKQotICAgICAgICAgICAgc2VsZi5zdGFydF9kaXIgPSBzZWxmLmZwLnRlbGwoKQotICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoemluZm8pCi0gICAgICAgICAgICBzZWxmLk5hbWVUb0luZm9bemluZm8uZmlsZW5hbWVdID0gemluZm8KKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKHppbmZvLCBtb2RlPSd3JykgYXMgZGVzdDoKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlKGRhdGEpCiAKICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgIiIiQ2FsbCB0aGUgImNsb3NlKCkiIG1ldGhvZCBpbiBjYXNlIHRoZSB1c2VyIGZvcmdvdC4iIiIKQEAgLTE2MDAsNiArMTY1MywxMSBAQAogICAgICAgICBpZiBzZWxmLmZwIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4KIAorICAgICAgICBpZiBzZWxmLl93cml0aW5nOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW4ndCBjbG9zZSB0aGUgWklQIGZpbGUgd2hpbGUgdGhlcmUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbiBvcGVuIHdyaXRpbmcgaGFuZGxlIG9uIGl0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsb3NlIHRoZSB3cml0aW5nIGhhbmRsZSBiZWZvcmUgY2xvc2luZyB0aGUgemlwLiIpCisKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgc2VsZi5tb2RlIGluICgndycsICd4JywgJ2EnKSBhbmQgc2VsZi5fZGlkTW9kaWZ5OiAjIHdyaXRlIGVuZGluZyByZWNvcmRzCiAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgpkaWZmIC0tZ2l0IGEvTWFjL0J1aWxkU2NyaXB0L2J1aWxkLWluc3RhbGxlci5weSBiL01hYy9CdWlsZFNjcmlwdC9idWlsZC1pbnN0YWxsZXIucHkKaW5kZXggZDA5ZGEyZi4uYjBkNDQ0NCAxMDA3NTUKLS0tIGEvTWFjL0J1aWxkU2NyaXB0L2J1aWxkLWluc3RhbGxlci5weQorKysgYi9NYWMvQnVpbGRTY3JpcHQvYnVpbGQtaW5zdGFsbGVyLnB5CkBAIC0yOTksOSArMjk5LDkgQEAKICAgICBpZiBQWVRIT05fMzoKICAgICAgICAgcmVzdWx0LmV4dGVuZChbCiAgICAgICAgICAgZGljdCgKLSAgICAgICAgICAgICAgbmFtZT0iWFogNS4wLjUiLAotICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly90dWthYW5pLm9yZy94ei94ei01LjAuNS50YXIuZ3oiLAotICAgICAgICAgICAgICBjaGVja3N1bT0nMTlkOTI0ZTA2NmI2ZmZmMGJjOWQxOTgxYjRlNTMxOTYnLAorICAgICAgICAgICAgICBuYW1lPSJYWiA1LjIuMiIsCisgICAgICAgICAgICAgIHVybD0iaHR0cDovL3R1a2Fhbmkub3JnL3h6L3h6LTUuMi4yLnRhci5neiIsCisgICAgICAgICAgICAgIGNoZWNrc3VtPSc3Y2Y2YTg1NDRhN2RhZThlODEwNmZkZjdhZGRmYTI4YycsCiAgICAgICAgICAgICAgIGNvbmZpZ3VyZV9wcmU9WwogICAgICAgICAgICAgICAgICAgICAnLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcnLAogICAgICAgICAgICAgICBdCkBAIC0zNDQsMTAgKzM0NCwxMSBAQAogICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICApLAogICAgICAgICAgIGRpY3QoCi0gICAgICAgICAgICAgIG5hbWU9IlNRTGl0ZSAzLjguMTEiLAotICAgICAgICAgICAgICB1cmw9Imh0dHBzOi8vd3d3LnNxbGl0ZS5vcmcvMjAxNS9zcWxpdGUtYXV0b2NvbmYtMzA4MTEwMC50YXIuZ3oiLAotICAgICAgICAgICAgICBjaGVja3N1bT0nNzdiNDUxOTI1MTIxMDI4YmVmYmRkYmY0NWVhMmJjNDknLAorICAgICAgICAgICAgICBuYW1lPSJTUUxpdGUgMy4xNC4xIiwKKyAgICAgICAgICAgICAgdXJsPSJodHRwczovL3d3dy5zcWxpdGUub3JnLzIwMTYvc3FsaXRlLWF1dG9jb25mLTMxNDAxMDAudGFyLmd6IiwKKyAgICAgICAgICAgICAgY2hlY2tzdW09JzM2MzRhOTBhM2Y0OTU0MTQ2MmJjYWVkMzQ3NGIyNjg0JywKICAgICAgICAgICAgICAgZXh0cmFfY2ZsYWdzPSgnLU9zICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLURTUUxJVEVfRU5BQkxFX0ZUUzUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICctRFNRTElURV9FTkFCTEVfRlRTNCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1EU1FMSVRFX0VOQUJMRV9GVFMzX1BBUkVOVEhFU0lTICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLURTUUxJVEVfRU5BQkxFX1JUUkVFICcKQEAgLTEyNDksNiArMTI1MCw4IEBACiAgICAgICAgIExEVkVSU0lPTiA9IExEVkVSU0lPTi5yZXBsYWNlKCckKFZFUlNJT04pJywgVkVSU0lPTikKICAgICAgICAgTERWRVJTSU9OID0gTERWRVJTSU9OLnJlcGxhY2UoJyQoQUJJRkxBR1MpJywgQUJJRkxBR1MpCiAgICAgICAgIGNvbmZpZ19zdWZmaXggPSAnLScgKyBMRFZFUlNJT04KKyAgICAgICAgaWYgZ2V0VmVyc2lvbk1ham9yTWlub3IoKSA+PSAoMywgNik6CisgICAgICAgICAgICBjb25maWdfc3VmZml4ID0gY29uZmlnX3N1ZmZpeCArICctZGFyd2luJwogICAgIGVsc2U6CiAgICAgICAgIGNvbmZpZ19zdWZmaXggPSAnJyAgICAgICMgUHl0aG9uIDIueAogCkBAIC0xMjc0LDcgKzEyNzcsNyBAQAogICAgIGZwLndyaXRlKGRhdGEpCiAgICAgZnAuY2xvc2UoKQogCi0gICAgIyBmaXggX3N5c2NvbmZpZ2RhdGEgaWYgaXQgZXhpc3RzCisgICAgIyBmaXggX3N5c2NvbmZpZ2RhdGEKICAgICAjCiAgICAgIyBUT0RPOiBtYWtlIHRoaXMgbW9yZSByb2J1c3QhICB0ZXN0X3N5c2NvbmZpZ19tb2R1bGUgb2YKICAgICAjIGRpc3R1dGlscy50ZXN0cy50ZXN0X3N5c2NvbmZpZy5TeXNjb25maWdUZXN0Q2FzZSB0ZXN0cyB0aGF0CkBAIC0xMjg4LDI4ICsxMjkxLDMwIEBACiAgICAgIyBfc3lzY29uZmlnZGF0YS5weSkuCiAKICAgICBpbXBvcnQgcHByaW50Ci0gICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoX3RvX2xpYiwgJ19zeXNjb25maWdkYXRhLnB5JykKLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLSAgICAgICAgZnAgPSBvcGVuKHBhdGgsICdyJykKLSAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQotICAgICAgICBmcC5jbG9zZSgpCi0gICAgICAgICMgY3JlYXRlIGJ1aWxkX3RpbWVfdmFycyBkaWN0Ci0gICAgICAgIGV4ZWMoZGF0YSkKLSAgICAgICAgdmFycyA9IHt9Ci0gICAgICAgIGZvciBrLCB2IGluIGJ1aWxkX3RpbWVfdmFycy5pdGVtcygpOgotICAgICAgICAgICAgaWYgdHlwZSh2KSA9PSB0eXBlKCcnKToKLSAgICAgICAgICAgICAgICBmb3IgcCBpbiAoaW5jbHVkZV9wYXRoLCBsaWJfcGF0aCk6Ci0gICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJyAnICsgcCwgJycpCi0gICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UocCArICcgJywgJycpCi0gICAgICAgICAgICB2YXJzW2tdID0gdgorICAgIGlmIGdldFZlcnNpb25NYWpvck1pbm9yKCkgPj0gKDMsIDYpOgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfdG9fbGliLCAncGxhdC1kYXJ3aW4nLCAnX3N5c2NvbmZpZ2RhdGFfbS5weScpCisgICAgZWxzZToKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoX3RvX2xpYiwgJ19zeXNjb25maWdkYXRhLnB5JykKKyAgICBmcCA9IG9wZW4ocGF0aCwgJ3InKQorICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICBmcC5jbG9zZSgpCisgICAgIyBjcmVhdGUgYnVpbGRfdGltZV92YXJzIGRpY3QKKyAgICBleGVjKGRhdGEpCisgICAgdmFycyA9IHt9CisgICAgZm9yIGssIHYgaW4gYnVpbGRfdGltZV92YXJzLml0ZW1zKCk6CisgICAgICAgIGlmIHR5cGUodikgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICBmb3IgcCBpbiAoaW5jbHVkZV9wYXRoLCBsaWJfcGF0aCk6CisgICAgICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnICcgKyBwLCAnJykKKyAgICAgICAgICAgICAgICB2ID0gdi5yZXBsYWNlKHAgKyAnICcsICcnKQorICAgICAgICB2YXJzW2tdID0gdgogCi0gICAgICAgIGZwID0gb3BlbihwYXRoLCAndycpCi0gICAgICAgICMgZHVwbGljYXRlZCBmcm9tIHN5c2NvbmZpZy5fZ2VuZXJhdGVfcG9zaXhfdmFycygpCi0gICAgICAgIGZwLndyaXRlKCcjIHN5c3RlbSBjb25maWd1cmF0aW9uIGdlbmVyYXRlZCBhbmQgdXNlZCBieScKLSAgICAgICAgICAgICAgICAgICAgJyB0aGUgc3lzY29uZmlnIG1vZHVsZVxuJykKLSAgICAgICAgZnAud3JpdGUoJ2J1aWxkX3RpbWVfdmFycyA9ICcpCi0gICAgICAgIHBwcmludC5wcHJpbnQodmFycywgc3RyZWFtPWZwKQotICAgICAgICBmcC5jbG9zZSgpCisgICAgZnAgPSBvcGVuKHBhdGgsICd3JykKKyAgICAjIGR1cGxpY2F0ZWQgZnJvbSBzeXNjb25maWcuX2dlbmVyYXRlX3Bvc2l4X3ZhcnMoKQorICAgIGZwLndyaXRlKCcjIHN5c3RlbSBjb25maWd1cmF0aW9uIGdlbmVyYXRlZCBhbmQgdXNlZCBieScKKyAgICAgICAgICAgICAgICAnIHRoZSBzeXNjb25maWcgbW9kdWxlXG4nKQorICAgIGZwLndyaXRlKCdidWlsZF90aW1lX3ZhcnMgPSAnKQorICAgIHBwcmludC5wcHJpbnQodmFycywgc3RyZWFtPWZwKQorICAgIGZwLmNsb3NlKCkKIAogICAgICMgQWRkIHN5bWxpbmtzIGluIC91c3IvbG9jYWwvYmluLCB1c2luZyByZWxhdGl2ZSBsaW5rcwogICAgIHVzcl9sb2NhbF9iaW4gPSBvcy5wYXRoLmpvaW4ocm9vdERpciwgJ3VzcicsICdsb2NhbCcsICdiaW4nKQpkaWZmIC0tZ2l0IGEvTWFjL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9SZWFkTWUucnRmIGIvTWFjL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9SZWFkTWUucnRmCmluZGV4IDY1ZTNmMTQuLjFhZjI0NTEgMTAwNjQ0Ci0tLSBhL01hYy9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvUmVhZE1lLnJ0ZgorKysgYi9NYWMvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1JlYWRNZS5ydGYKQEAgLTEsMjkgKzEsMjUgQEAKLXtccnRmMVxhbnNpXGFuc2ljcGcxMjUyXGNvY29hcnRmMTM0OFxjb2NvYXN1YnJ0ZjE3MAore1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcY29jb2FydGYxNDA0XGNvY29hc3VicnRmNDYwCiB7XGZvbnR0YmxcZjBcZnN3aXNzXGZjaGFyc2V0MCBIZWx2ZXRpY2E7XGYxXGZtb2Rlcm5cZmNoYXJzZXQwIENvdXJpZXJOZXdQU01UO30KIHtcY29sb3J0Ymw7XHJlZDI1NVxncmVlbjI1NVxibHVlMjU1O30KIFxtYXJnbDE0NDBcbWFyZ3IxNDQwXHZpZXd3MTMzODBcdmlld2gxNDYwMFx2aWV3a2luZDAKLVxwYXJkXHR4NzIwXHR4MTQ0MFx0eDIxNjBcdHgyODgwXHR4MzYwMFx0eDQzMjBcdHg1MDQwXHR4NTc2MFx0eDY0ODBcdHg3MjAwXHR4NzkyMFx0eDg2NDBccGFyZGlybmF0dXJhbAorXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxwYXJkaXJuYXR1cmFsXHBhcnRpZ2h0ZW5mYWN0b3IwCiAKIFxmMFxmczI0IFxjZjAgVGhpcyBwYWNrYWdlIHdpbGwgaW5zdGFsbCBQeXRob24gJEZVTExfVkVSU0lPTiBmb3IgTWFjIE9TIFggJE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBmb3IgdGhlIGZvbGxvd2luZyBhcmNoaXRlY3R1cmUocyk6ICRBUkNISVRFQ1RVUkVTLlwKIFwKLVxwYXJkXHR4NzIwXHR4MTQ0MFx0eDIxNjBcdHgyODgwXHR4MzYwMFx0eDQzMjBcdHg1MDQwXHR4NTc2MFx0eDY0ODBcdHg3MjAwXHR4NzkyMFx0eDg2NDBccGFyZGlybmF0dXJhbAorXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxwYXJkaXJuYXR1cmFsXHBhcnRpZ2h0ZW5mYWN0b3IwCiAKIFxiIFxjZjAgXHVsIFx1bGMwIFdoaWNoIGluc3RhbGxlciB2YXJpYW50IHNob3VsZCBJIHVzZT8KIFxiMCBcdWxub25lIFwKIFwKLVB5dGhvbi5vcmcgcHJvdmlkZXMgdHdvIGluc3RhbGxlciB2YXJpYW50cyBmb3IgZG93bmxvYWQ6IG9uZSB0aGF0IGluc3RhbGxzIGEgCitGb3IgdGhlIGluaXRpYWwgYWxwaGEgcmVsZWFzZXMgb2YgUHl0aG9uIDMuNiwgUHl0aG9uLm9yZyBwcm92aWRlcyBvbmx5IG9uZSBpbnN0YWxsZXIgdmFyaWFudCBmb3IgZG93bmxvYWQ6IG9uZSB0aGF0IGluc3RhbGxzIGEgCiBcaSA2NC1iaXQvMzItYml0IEludGVsCiBcaTAgIFB5dGhvbiBjYXBhYmxlIG9mIHJ1bm5pbmcgb24gCiBcaSBNYWMgT1MgWCAxMC42IChTbm93IExlb3BhcmQpCi1caTAgIG9yIGxhdGVyOyBhbmQgb25lIHRoYXQgaW5zdGFsbHMgYSAKLVxpIDMyLWJpdC1vbmx5IChJbnRlbCBhbmQgUFBDKQotXGkwICBQeXRob24gY2FwYWJsZSBvZiBydW5uaW5nIG9uIAotXGkgTWFjIE9TIFggMTAuNSAoTGVvcGFyZCkKLVxpMCAgb3IgbGF0ZXIuICBUaGlzIFJlYWRNZSB3YXMgaW5zdGFsbGVkIHdpdGggdGhlIAorXGkwICBvciBsYXRlci4gIFRoaXMgd2lsbCBjaGFuZ2UgcHJpb3IgdG8gdGhlIGJldGEgcmVsZWFzZXMgb2YgMy42LjAuICBUaGlzIFJlYWRNZSB3YXMgaW5zdGFsbGVkIHdpdGggdGhlIAogXGkgJE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVAotXGkwICB2YXJpYW50LiAgVW5sZXNzIHlvdSBhcmUgaW5zdGFsbGluZyB0byBhbiAxMC41IHN5c3RlbSBvciB5b3UgbmVlZCB0byBidWlsZCBhcHBsaWNhdGlvbnMgdGhhdCBjYW4gcnVuIG9uIDEwLjUgc3lzdGVtcywgdXNlIHRoZSAxMC42IHZhcmlhbnQgaWYgcG9zc2libGUuICBUaGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIG9wZXJhdGluZyBzeXN0ZW0gZnVuY3Rpb25zIHRoYXQgYXJlIHN1cHBvcnRlZCBzdGFydGluZyB3aXRoIDEwLjYgYW5kIHlvdSBtYXkgc2VlIGJldHRlciBwZXJmb3JtYW5jZSB1c2luZyA2NC1iaXQgbW9kZS4gIEJ5IGRlZmF1bHQsIFB5dGhvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcnVuIGluIDY0LWJpdCBtb2RlIGlmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIGl0LiAgQWxzbyBzZWUgCitcaTAgIHZhcmlhbnQuICBCeSBkZWZhdWx0LCBQeXRob24gd2lsbCBhdXRvbWF0aWNhbGx5IHJ1biBpbiA2NC1iaXQgbW9kZSBpZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyBpdC4gIEFsc28gc2VlIAogXGkgQ2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGFuZCBPcGVuU1NMCi1caTAgIGJlbG93LiAgVGhlIFB5dGhvbnMgaW5zdGFsbGVkIGJ5IHRoZXNlIGluc3RhbGxlcnMgYXJlIGJ1aWx0IHdpdGggcHJpdmF0ZSBjb3BpZXMgb2Ygc29tZSB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIHdpdGggb3IgbmV3ZXIgdGhhbiB0aG9zZSBpbiBPUyBYIGl0c2VsZi4gIFRoZSBsaXN0IG9mIHRoZXNlIGxpYnJhcmllcyB2YXJpZXMgYnkgaW5zdGFsbGVyIHZhcmlhbnQgYW5kIGlzIGluY2x1ZGVkIGF0IHRoZSBlbmQgb2YgdGhlIExpY2Vuc2UucnRmIGZpbGUuCitcaTAgIGJlbG93LiAgVGhlIFB5dGhvbnMgaW5zdGFsbGVkIGJ5IHRoaXMgaW5zdGFsbGVyIGlzIGJ1aWx0IHdpdGggcHJpdmF0ZSBjb3BpZXMgb2Ygc29tZSB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIHdpdGggb3IgbmV3ZXIgdGhhbiB0aG9zZSBpbiBPUyBYIGl0c2VsZi4gIFRoZSBsaXN0IG9mIHRoZXNlIGxpYnJhcmllcyB2YXJpZXMgYnkgaW5zdGFsbGVyIHZhcmlhbnQgYW5kIGlzIGluY2x1ZGVkIGF0IHRoZSBlbmQgb2YgdGhlIExpY2Vuc2UucnRmIGZpbGUuCiBcYiBcdWwgXAogXAogVXBkYXRlIHlvdXIgdmVyc2lvbiBvZiBUY2wvVGsgdG8gdXNlIElETEUgb3Igb3RoZXIgVGsgYXBwbGljYXRpb25zCkBAIC0zMywxMyArMjksMTMgQEAKIFxpIFRjbC9UawogXGkwICBmcmFtZXdvcmtzLiAgVmlzaXQge1xmaWVsZHtcKlxmbGRpbnN0e0hZUEVSTElOSyAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC9tYWMvdGNsdGsvIn19e1xmbGRyc2x0IGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvbWFjL3RjbHRrL319IGZvciBjdXJyZW50IGluZm9ybWF0aW9uIGFib3V0IHN1cHBvcnRlZCBhbmQgcmVjb21tZW5kZWQgdmVyc2lvbnMgb2YgCiBcaSBUY2wvVGsKLVxpMCAgZm9yIHRoaXMgdmVyc2lvbiBvZiBQeXRob24gYW5kIG9mIE1hYyBPUyBYLlwKK1xpMCAgZm9yIHRoaXMgdmVyc2lvbiBvZiBQeXRob24gYW5kIG9mIE1hYyBPUyBYLiAgRm9yIHRoZSBpbml0aWFsIGFscGhhIHJlbGVhc2VzIG9mIFB5dGhvbiAzLjYsIHRoZSBpbnN0YWxsZXIgaXMgbGlua2VkIHdpdGggVGNsL1RrIDguNTsgdGhpcyB3aWxsIGNoYW5nZSBwcmlvciB0byB0aGUgYmV0YSByZWxlYXNlcyBvZiAzLjYuMC5cCiAKIFxiIFx1bCBcCiBDZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYW5kIE9wZW5TU0xcCiAKIFxiMCBcdWxub25lIFwKLVB5dGhvbiAzLjUgaW5jbHVkZXMgYSBudW1iZXIgb2YgbmV0d29yayBzZWN1cml0eSBlbmhhbmNlbWVudHMgdGhhdCB3ZXJlIHJlbGVhc2VkIGluIFB5dGhvbiAzLjQuMyBhbmQgUHl0aG9uIDIuNy4xMC4gIHtcZmllbGR7XCpcZmxkaW5zdHtIWVBFUkxJTksgImh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0NzYvIn19e1xmbGRyc2x0IFBFUCA0NzZ9fSBjaGFuZ2VzIHNldmVyYWwgc3RhbmRhcmQgbGlicmFyeSBtb2R1bGVzLCBsaWtlIAorUHl0aG9uIDMuNiBpbmNsdWRlcyBhIG51bWJlciBvZiBuZXR3b3JrIHNlY3VyaXR5IGVuaGFuY2VtZW50cyB0aGF0IHdlcmUgcmVsZWFzZWQgaW4gUHl0aG9uIDMuNC4zIGFuZCBQeXRob24gMi43LjEwLiAge1xmaWVsZHtcKlxmbGRpbnN0e0hZUEVSTElOSyAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ3Ni8ifX17XGZsZHJzbHQgUEVQIDQ3Nn19IGNoYW5nZXMgc2V2ZXJhbCBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZXMsIGxpa2UgCiBcaSBodHRwbGliCiBcaTAgLCAKIFxpIHVybGxpYgpAQCAtNTEsNTYgKzQ3LDMzIEBACiBcaSBzZWN1cml0eQogXGkwICBjb21tYW5kIGxpbmUgdXRpbGl0eS5cCiBcCi1Gb3IgT1MgWCAxMC41LCBBcHBsZSBwcm92aWRlcyAKLVxpIE9wZW5TU0wgMC45LjcKLVxpMCAgbGlicmFyaWVzLiAgVGhpcyB2ZXJzaW9uIG9mIEFwcGxlJ3MgT3BlblNTTCAKLVxiIGRvZXMgbm90Ci1cYjAgIHVzZSB0aGUgY2VydGlmaWNhdGVzIGZyb20gdGhlIHN5c3RlbSBzZWN1cml0eSBmcmFtZXdvcmssIGV2ZW4gd2hlbiB1c2VkIG9uIG5ld2VyIHZlcnNpb25zIG9mIE9TIFguICBJbnN0ZWFkIGl0IGNvbnN1bHRzIGEgdHJhZGl0aW9uYWwgT3BlblNTTCBjb25jYXRlbmF0ZWQgY2VydGlmaWNhdGUgZmlsZSAoCi1caSBjYWZpbGUKLVxpMCApIG9yIGNlcnRpZmljYXRlIGRpcmVjdG9yeSAoCi1caSBjYXBhdGgKLVxpMCApLCBsb2NhdGVkIGluIAotXGYxIC9TeXN0ZW0vTGlicmFyeS9PcGVuU1NMCi1cZjAgLiAgVGhlc2UgZGlyZWN0b3JpZXMgYXJlIHR5cGljYWxseSBlbXB0eSBhbmQgbm90IG1hbmFnZWQgYnkgT1MgWDsgeW91IG11c3QgbWFuYWdlIHRoZW0geW91cnNlbGYgb3Igc3VwcGx5IHlvdXIgb3duIFNTTCBjb250ZXh0cy4gIE9wZW5TU0wgMC45LjcgaXMgb2Jzb2xldGUgYnkgY3VycmVudCBzZWN1cml0eSBzdGFuZGFyZHMsIGxhY2tpbmcgYSBudW1iZXIgb2YgaW1wb3J0YW50IGZlYXR1cmVzIGZvdW5kIGluIGxhdGVyIHZlcnNpb25zLiAgQW1vbmcgdGhlIHByb2JsZW1zIHRoaXMgY2F1c2VzIGlzIHRoZSBpbmFiaWxpdHkgdG8gdmVyaWZ5IGhpZ2hlci1zZWN1cml0eSBjZXJ0aWZpY2F0ZXMgbm93IHVzZWQgYnkgcHl0aG9uLm9yZyBzZXJ2aWNlcywgaW5jbHVkaW5nIAotXGkgdHtcZmllbGR7XCpcZmxkaW5zdHtIWVBFUkxJTksgImh0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGkifX17XGZsZHJzbHQgaGUgUHl0aG9uIFBhY2thZ2UgSW5kZXgsIFB5UEl9fQotXGkwIC4gIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgdGhlIAotXGkgMTAuNSsgMzItYml0LW9ubHkgcHl0aG9uLm9yZyB2YXJpYW50Ci1caTAgIGlzIGxpbmtlZCB3aXRoIGEgcHJpdmF0ZSBjb3B5IG9mIAotXGkgT3BlblNTTCAxLjAuMgotXGkwIDsgaXQgY29uc3VsdHMgdGhlIHNhbWUgZGVmYXVsdCBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnksIAotXGYxIC9TeXN0ZW0vTGlicmFyeS9PcGVuU1NMCi1cZjAgLiAgIEFzIGJlZm9yZSwgaXQgaXMgc3RpbGwgbmVjZXNzYXJ5IHRvIG1hbmFnZSBjZXJ0aWZpY2F0ZXMgeW91cnNlbGYgd2hlbiB5b3UgdXNlIHRoaXMgUHl0aG9uIHZhcmlhbnQgYW5kLCB3aXRoIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBub3cgZW5hYmxlZCBieSBkZWZhdWx0LCB5b3UgbWF5IG5vdyBuZWVkIHRvIHRha2UgYWRkaXRpb25hbCBzdGVwcyB0byBlbnN1cmUgeW91ciBQeXRob24gcHJvZ3JhbXMgaGF2ZSBhY2Nlc3MgdG8gQ0EgY2VydGlmaWNhdGVzIHlvdSB0cnVzdC4gIElmIHlvdSB1c2UgdGhpcyBQeXRob24gdmFyaWFudCB0byBidWlsZCBzdGFuZGFsb25lIGFwcGxpY2F0aW9ucyB3aXRoIHRoaXJkLXBhcnR5IHRvb2xzIGxpa2Uge1xmaWVsZHtcKlxmbGRpbnN0e0hZUEVSTElOSyAiaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9weTJhcHAvIn19e1xmbGRyc2x0IAotXGYxIHB5MmFwcH19LCB5b3UgbWF5IG5vdyBuZWVkIHRvIGJ1bmRsZSBDQSBjZXJ0aWZpY2F0ZXMgaW4gdGhlbSBvciBvdGhlcndpc2Ugc3VwcGx5IG5vbi1kZWZhdWx0IFNTTCBjb250ZXh0cy5cCi1cCiBGb3IgT1MgWCAxMC42KywgQXBwbGUgYWxzbyBwcm92aWRlcyAKIFxpIE9wZW5TU0wKIFxpMCAgCiBcaSAwLjkuOCBsaWJyYXJpZXMKIFxpMCAuICBBcHBsZSdzIDAuOS44IHZlcnNpb24gaW5jbHVkZXMgYW4gaW1wb3J0YW50IGFkZGl0aW9uYWwgZmVhdHVyZTogaWYgYSBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmUgdmVyaWZpZWQgdXNpbmcgdGhlIG1hbnVhbGx5IGFkbWluaXN0ZXJlZCBjZXJ0aWZpY2F0ZXMgaW4gCiBcZjEgL1N5c3RlbS9MaWJyYXJ5L09wZW5TU0wKLVxmMCAsIHRoZSBjZXJ0aWZpY2F0ZXMgbWFuYWdlZCBieSB0aGUgc3lzdGVtIHNlY3VyaXR5IGZyYW1ld29yayBJbiB0aGUgdXNlciBhbmQgc3lzdGVtIGtleWNoYWlucyBhcmUgYWxzbyBjb25zdWx0ZWQgKHVzaW5nIEFwcGxlIHByaXZhdGUgQVBJcykuICBGb3IgdGhpcyByZWFzb24sIHRoZSAKK1xmMCAsIHRoZSBjZXJ0aWZpY2F0ZXMgbWFuYWdlZCBieSB0aGUgc3lzdGVtIHNlY3VyaXR5IGZyYW1ld29yayBJbiB0aGUgdXNlciBhbmQgc3lzdGVtIGtleWNoYWlucyBhcmUgYWxzbyBjb25zdWx0ZWQgKHVzaW5nIEFwcGxlIHByaXZhdGUgQVBJcykuICBGb3IgdGhlIGluaXRpYWwgYWxwaGEgcmVsZWFzZXMgb2YgUHl0aG9uIDMuNiwgdGhlIAogXGkgNjQtYml0LzMyLWJpdCAxMC42KyBweXRob24ub3JnIHZhcmlhbnQKLVxpMCAgY29udGludWVzIHRvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoIEFwcGxlJ3MgT3BlblNTTCAwLjkuOCBzaW5jZSBpdCB3YXMgZmVsdCB0aGF0IHRoZSBsb3NzIG9mIHRoZSBzeXN0ZW0tcHJvdmlkZWQgY2VydGlmaWNhdGVzIGFuZCBtYW5hZ2VtZW50IHRvb2xzIG91dHdlaWdocyB0aGUgYWRkaXRpb25hbCBzZWN1cml0eSBmZWF0dXJlcyBwcm92aWRlZCBieSBuZXdlciB2ZXJzaW9ucyBvZiBPcGVuU1NMLiAgVGhpcyB3aWxsIGxpa2VseSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzIG9mIHRoZSBweXRob24ub3JnIGluc3RhbGxlcnMgYXMgQXBwbGUgaGFzIGRlcHJlY2F0ZWQgdXNlIG9mIHRoZSBzeXN0ZW0tc3VwcGxpZWQgT3BlblNTTCBsaWJyYXJpZXMuICBJZiB5b3UgZG8gbmVlZCBmZWF0dXJlcyBmcm9tIG5ld2VyIHZlcnNpb25zIG9mIE9wZW5TU0wsIHRoZXJlIGFyZSB0aGlyZC1wYXJ0eSBPcGVuU1NMIHdyYXBwZXIgcGFja2FnZXMgYXZhaWxhYmxlIHRocm91Z2ggCitcaTAgIGNvbnRpbnVlcyB0byBiZSBkeW5hbWljYWxseSBsaW5rZWQgd2l0aCBBcHBsZSdzIE9wZW5TU0wgMC45Ljggc2luY2UgaXQgd2FzIGZlbHQgdGhhdCB0aGUgbG9zcyBvZiB0aGUgc3lzdGVtLXByb3ZpZGVkIGNlcnRpZmljYXRlcyBhbmQgbWFuYWdlbWVudCB0b29scyBvdXR3ZWlnaHMgdGhlIGFkZGl0aW9uYWwgc2VjdXJpdHkgZmVhdHVyZXMgcHJvdmlkZWQgYnkgbmV3ZXIgdmVyc2lvbnMgb2YgT3BlblNTTC4gIFRoaXMgd2lsbCBjaGFuZ2UgcHJpb3IgdG8gdGhlIGJldGEgcmVsZWFzZXMgb2YgMy42LjAgYXMgQXBwbGUgaGFzIGRlcHJlY2F0ZWQgdXNlIG9mIHRoZSBzeXN0ZW0tc3VwcGxpZWQgT3BlblNTTCBsaWJyYXJpZXMuICBJZiB5b3UgZG8gbmVlZCBmZWF0dXJlcyBmcm9tIG5ld2VyIHZlcnNpb25zIG9mIE9wZW5TU0wsIHRoZXJlIGFyZSB0aGlyZC1wYXJ0eSBPcGVuU1NMIHdyYXBwZXIgcGFja2FnZXMgYXZhaWxhYmxlIHRocm91Z2ggCiBcaSBQeVBJCiBcaTAgLlwKIFwKIFRoZSBidW5kbGVkIAogXGYxIHBpcAotXGYwICBpbmNsdWRlZCB3aXRoIHRoZSBQeXRob24gMy41IGluc3RhbGxlcnMgaGFzIGl0cyBvd24gZGVmYXVsdCBjZXJ0aWZpY2F0ZSBzdG9yZSBmb3IgdmVyaWZ5aW5nIGRvd25sb2FkIGNvbm5lY3Rpb25zLlwKK1xmMCAgaW5jbHVkZWQgd2l0aCB0aGUgUHl0aG9uIDMuNiBpbnN0YWxsZXJzIGhhcyBpdHMgb3duIGRlZmF1bHQgY2VydGlmaWNhdGUgc3RvcmUgZm9yIHZlcmlmeWluZyBkb3dubG9hZCBjb25uZWN0aW9ucy5cCiBcCiAKIFxiIFx1bCBPdGhlciBjaGFuZ2VzXAogCiBcYjAgXHVsbm9uZSBcCi1ccGFyZFx0eDcyMFx0eDE0NDBcdHgyMTYwXHR4Mjg4MFx0eDM2MDBcdHg0MzIwXHR4NTA0MFx0eDU3NjBcdHg2NDgwXHR4NzIwMFx0eDc5MjBcdHg4NjQwXHBhcmRpcm5hdHVyYWwKLVxjZjAgRm9yIG90aGVyIGNoYW5nZXMgaW4gdGhpcyByZWxlYXNlLCBzZWUgdGhlIAorRm9yIG90aGVyIGNoYW5nZXMgaW4gdGhpcyByZWxlYXNlLCBzZWUgdGhlIAogXGkgV2hhdCdzIG5ldwogXGkwICBzZWN0aW9uIGluIHRoZSB7XGZpZWxke1wqXGZsZGluc3R7SFlQRVJMSU5LICJodHRwczovL3d3dy5weXRob24ub3JnL2RvYy8ifX17XGZsZHJzbHQgRG9jdW1lbnRhdGlvbiBTZXR9fSBmb3IgdGhpcyByZWxlYXNlIGFuZCBpdHMgCiBcaSBSZWxlYXNlIE5vdGVzCiBcaTAgIGxpbmsgYXQge1xmaWVsZHtcKlxmbGRpbnN0e0hZUEVSTElOSyAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZHMvIn19e1xmbGRyc2x0IGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWRzL319LlwKLVxwYXJkXHR4NzIwXHR4MTQ0MFx0eDIxNjBcdHgyODgwXHR4MzYwMFx0eDQzMjBcdHg1MDQwXHR4NTc2MFx0eDY0ODBcdHg3MjAwXHR4NzkyMFx0eDg2NDBccGFyZGlybmF0dXJhbAogCi1cYiBcY2YwIFx1bCBcCitcYiBcdWwgXAogUHl0aG9uIDMgYW5kIFB5dGhvbiAyIENvLWV4aXN0ZW5jZVwKIAogXGIwIFx1bG5vbmUgXApkaWZmIC0tZ2l0IGEvTWFjL0lETEUvSURMRS5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2lkbGVtYWluLnB5IGIvTWFjL0lETEUvSURMRS5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2lkbGVtYWluLnB5CmluZGV4IDk4Njc2MGQuLjU5OTRjMTggMTAwNjQ0Ci0tLSBhL01hYy9JRExFL0lETEUuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9pZGxlbWFpbi5weQorKysgYi9NYWMvSURMRS9JRExFLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvaWRsZW1haW4ucHkKQEAgLTY4LDYgKzY4LDYgQEAKICAgICAgICAgYnJlYWsKIAogIyBOb3cgaXQgaXMgc2FmZSB0byBpbXBvcnQgaWRsZWxpYi4KLWZyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBtYWluCitmcm9tIGlkbGVsaWIucHlzaGVsbCBpbXBvcnQgbWFpbgogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01ha2VmaWxlLnByZS5pbiBiL01ha2VmaWxlLnByZS5pbgppbmRleCA1ODE0NGYzLi40NDQ1YjI0IDEwMDY0NAotLS0gYS9NYWtlZmlsZS5wcmUuaW4KKysrIGIvTWFrZWZpbGUucHJlLmluCkBAIC0xMDksNiArMTA5LDcgQEAKIAogIyBNdWx0aWFyY2ggZGlyZWN0b3J5IChtYXkgYmUgZW1wdHkpCiBNVUxUSUFSQ0g9CUBNVUxUSUFSQ0hACitNVUxUSUFSQ0hfQ1BQRkxBR1MgPSBATVVMVElBUkNIX0NQUEZMQUdTQAogCiAjIEluc3RhbGwgcHJlZml4IGZvciBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMKIHByZWZpeD0JCUBwcmVmaXhACkBAIC0yMzQsNyArMjM1LDcgQEAKICMgVGhlIHRhc2sgdG8gcnVuIHdoaWxlIGluc3RydW1lbnRlZCB3aGVuIGJ1aWxkaW5nIHRoZSBwcm9maWxlLW9wdCB0YXJnZXQuCiAjIFdlIGV4Y2x1ZGUgdW5pdHRlc3RzIHdpdGggLXggdGhhdCB0YWtlIGEgcmVkaWN1bGlvdXMgYW1vdW50IG9mIHRpbWUgdG8KICMgcnVuIGluIHRoZSBpbnN0cnVtZW50ZWQgdHJhaW5pbmcgYnVpbGQgb3IgZG8gbm90IHByb3ZpZGUgbXVjaCB2YWx1ZS4KLVBST0ZJTEVfVEFTSz0tbSB0ZXN0LnJlZ3J0ZXN0IC0tcGdvIC14IHRlc3RfYXN5bmNvcmUgdGVzdF9nZGIgdGVzdF9tdWx0aXByb2Nlc3NpbmdfZm9yayB0ZXN0X211bHRpcHJvY2Vzc2luZ19mb3Jrc2VydmVyIHRlc3RfbXVsdGlwcm9jZXNzaW5nX21haW5faGFuZGxpbmcgdGVzdF9tdWx0aXByb2Nlc3Npbmdfc3Bhd24gdGVzdF9zdWJwcm9jZXNzCitQUk9GSUxFX1RBU0s9LW0gdGVzdC5yZWdydGVzdCAtLXBnbwogCiAjIHJlcG9ydCBmaWxlcyBmb3IgZ2NvdiAvIGxjb3YgY292ZXJhZ2UgcmVwb3J0CiBDT1ZFUkFHRV9JTkZPPQkkKGFic19idWlsZGRpcikvY292ZXJhZ2UuaW5mbwpAQCAtMjUzLDkgKzI1NCw2IEBACiAJCU1vZHVsZXMvbWFpbi5vIFwKIAkJTW9kdWxlcy9nY21vZHVsZS5vCiAKLSMgVXNlZCBvZiBzaWduYWxtb2R1bGUubyBpcyBub3QgYXZhaWxhYmxlCi1TSUdOQUxfT0JKUz0JQFNJR05BTF9PQkpTQAotCiBJT19IPQkJTW9kdWxlcy9faW8vX2lvbW9kdWxlLmgKIAogSU9fT0JKUz0JXApAQCAtMjgwLDE4ICsyNzgsNiBAQAogIyBQYXJzZXIKIFBHRU49CQlQYXJzZXIvcGdlbiQoRVhFKQogCi1QU1JDUz0JCVwKLQkJUGFyc2VyL2FjY2VsZXIuYyBcCi0JCVBhcnNlci9ncmFtbWFyMS5jIFwKLQkJUGFyc2VyL2xpc3Rub2RlLmMgXAotCQlQYXJzZXIvbm9kZS5jIFwKLQkJUGFyc2VyL3BhcnNlci5jIFwKLQkJUGFyc2VyL2JpdHNldC5jIFwKLQkJUGFyc2VyL21ldGFncmFtbWFyLmMgXAotCQlQYXJzZXIvZmlyc3RzZXRzLmMgXAotCQlQYXJzZXIvZ3JhbW1hci5jIFwKLQkJUGFyc2VyL3BnZW4uYwotCiBQT0JKUz0JCVwKIAkJUGFyc2VyL2FjY2VsZXIubyBcCiAJCVBhcnNlci9ncmFtbWFyMS5vIFwKQEAgLTMwNiwxNiArMjkyLDYgQEAKIAogUEFSU0VSX09CSlM9CSQoUE9CSlMpIFBhcnNlci9teXJlYWRsaW5lLm8gUGFyc2VyL3BhcnNldG9rLm8gUGFyc2VyL3Rva2VuaXplci5vCiAKLVBHU1JDUz0JCVwKLQkJT2JqZWN0cy9vYm1hbGxvYy5jIFwKLQkJUHl0aG9uL2R5bmFtaWNfYW5ub3RhdGlvbnMuYyBcCi0JCVB5dGhvbi9teXNucHJpbnRmLmMgXAotCQlQeXRob24vcHljdHlwZS5jIFwKLQkJUGFyc2VyL3Rva2VuaXplcl9wZ2VuLmMgXAotCQlQYXJzZXIvcHJpbnRncmFtbWFyLmMgXAotCQlQYXJzZXIvcGFyc2V0b2tfcGdlbi5jIFwKLQkJUGFyc2VyL3BnZW5tYWluLmMKLQogUEdPQkpTPQkJXAogCQlPYmplY3RzL29ibWFsbG9jLm8gXAogCQlQeXRob24vZHluYW1pY19hbm5vdGF0aW9ucy5vIFwKQEAgLTMzMSw3ICszMDcsNiBAQAogCQkkKHNyY2RpcikvSW5jbHVkZS9wYXJzZXRvay5oIFwKIAkJJChzcmNkaXIpL1BhcnNlci90b2tlbml6ZXIuaAogCi1QR0VOU1JDUz0JJChQU1JDUykgJChQR1NSQ1MpCiBQR0VOT0JKUz0JJChQT0JKUykgJChQR09CSlMpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC00NzAsNyArNDQ1LDYgQEAKIAkJJChPQkpFQ1RfT0JKUykgXAogCQkkKFBZVEhPTl9PQkpTKSBcCiAJCSQoTU9EVUxFX09CSlMpIFwKLQkJJChTSUdOQUxfT0JKUykgXAogCQkkKE1PRE9CSlMpCiAKIExJQlJBUllfT0JKUz0JXApAQCAtNTYzLDcgKzUzNyw3IEBACiAjIFJ1biAiQXJndW1lbnQgQ2xpbmljIiBvdmVyIGFsbCBzb3VyY2UgZmlsZXMKICMgKGRlcGVuZHMgb24gcHl0aG9uIGhhdmluZyBhbHJlYWR5IGJlZW4gYnVpbHQpCiAuUEhPTlk9Y2xpbmljCi1jbGluaWM6ICQoQlVJTERQWVRIT04pCitjbGluaWM6ICQoQlVJTERQWVRIT04pICQoc3JjZGlyKS9Nb2R1bGVzL19ibGFrZTIvYmxha2Uyc19pbXBsLmMKIAkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAuL1Rvb2xzL2NsaW5pYy9jbGluaWMucHkgLS1tYWtlCiAKICMgQnVpbGQgdGhlIGludGVycHJldGVyCkBAIC01NzEsNyArNTQ1LDcgQEAKIAkkKExJTktDQykgJChQWV9MREZMQUdTKSAkKExJTktGT1JTSEFSRUQpIC1vICRAIFByb2dyYW1zL3B5dGhvbi5vICQoQkxETElCUkFSWSkgJChMSUJTKSAkKE1PRExJQlMpICQoU1lTTElCUykgJChMRExBU1QpCiAKIHBsYXRmb3JtOiAkKEJVSUxEUFlUSE9OKSBweWJ1aWxkZGlyLnR4dAotCSQoUlVOU0hBUkVEKSAkKFBZVEhPTl9GT1JfQlVJTEQpIC1jICdpbXBvcnQgc3lzIDsgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9wbGF0Zm9ybSA7IHByaW50KGdldF9wbGF0Zm9ybSgpKyItIitzeXMudmVyc2lvblswOjNdKScgPnBsYXRmb3JtCisJJChSVU5TSEFSRUQpICQoUFlUSE9OX0ZPUl9CVUlMRCkgLWMgJ2ltcG9ydCBzeXMgOyBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BsYXRmb3JtIDsgcHJpbnQoIiVzLSVkLiVkIiAlIChnZXRfcGxhdGZvcm0oKSwgKnN5cy52ZXJzaW9uX2luZm9bOjJdKSknID5wbGF0Zm9ybQogCiAjIENyZWF0ZSBidWlsZCBkaXJlY3RvcnkgYW5kIGdlbmVyYXRlIHRoZSBzeXNjb25maWcgYnVpbGQtdGltZSBkYXRhIHRoZXJlLgogIyBweWJ1aWxkZGlyLnR4dCBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgYnVpbGQgZGlyIGFuZCBpcyB1c2VkIGZvcgpAQCAtNTkzLDYgKzU2NywxMSBAQAogTW9kdWxlcy9fbWF0aC5vOiBNb2R1bGVzL19tYXRoLmMgTW9kdWxlcy9fbWF0aC5oCiAJJChDQykgLWMgJChDQ1NIQVJFRCkgJChQWV9DT1JFX0NGTEFHUykgLW8gJEAgJDwKIAorIyBibGFrZTJzIGlzIGF1dG8tZ2VuZXJhdGVkIGZyb20gYmxha2UyYgorJChzcmNkaXIpL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJzX2ltcGwuYzogJChCVUlMRFBZVEhPTikgJChzcmNkaXIpL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJiX2ltcGwuYyAkKHNyY2RpcikvTW9kdWxlcy9fYmxha2UyL2JsYWtlMmIycy5weQorCSQoUlVOU0hBUkVEKSAkKFBZVEhPTl9GT1JfQlVJTEQpICQoc3JjZGlyKS9Nb2R1bGVzL19ibGFrZTIvYmxha2UyYjJzLnB5CisJJChSVU5TSEFSRUQpICQoUFlUSE9OX0ZPUl9CVUlMRCkgJChzcmNkaXIpL1Rvb2xzL2NsaW5pYy9jbGluaWMucHkgLWYgJEAKKwogIyBCdWlsZCB0aGUgc2hhcmVkIG1vZHVsZXMKICMgVW5kZXIgR05VIG1ha2UsIE1BS0VGTEFHUyBhcmUgc29ydGVkIGFuZCBub3JtYWxpemVkOyB0aGUgJ3MnIGZvcgogIyAtcywgLS1zaWxlbnQgb3IgLS1xdWlldCBpcyBhbHdheXMgdGhlIGZpcnN0IGNoYXIuCkBAIC02MDYsNiArNTg1LDcgQEAKIAkJX1RDTFRLX0lOQ0xVREVTPSckKFRDTFRLX0lOQ0xVREVTKScgX1RDTFRLX0xJQlM9JyQoVENMVEtfTElCUyknIFwKIAkJJChQWVRIT05fRk9SX0JVSUxEKSAkKHNyY2Rpcikvc2V0dXAucHkgJCRxdWlldCBidWlsZAogCisKICMgQnVpbGQgc3RhdGljIGxpYnJhcnkKICMgYXZvaWQgbG9uZyBjb21tYW5kIGxpbmVzLCBzYW1lIGFzIExJQlJBUllfT0JKUwogJChMSUJSQVJZKTogJChMSUJSQVJZX09CSlMpCkBAIC02MTQsNyArNTk0LDcgQEAKIAkkKEFSKSAkKEFSRkxBR1MpICRAICQoUEFSU0VSX09CSlMpCiAJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSkVDVF9PQkpTKQogCSQoQVIpICQoQVJGTEFHUykgJEAgJChQWVRIT05fT0JKUykgUHl0aG9uL2Zyb3plbi5vCi0JJChBUikgJChBUkZMQUdTKSAkQCAkKE1PRFVMRV9PQkpTKSAkKFNJR05BTF9PQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChNT0RVTEVfT0JKUykKIAkkKEFSKSAkKEFSRkxBR1MpICRAICQoTU9ET0JKUykKIAkkKFJBTkxJQikgJEAKIApAQCAtNzE4LDExICs2OTgsMTEgQEAKIFByb2dyYW1zL19mcmVlemVfaW1wb3J0bGliOiBQcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYi5vICQoTElCUkFSWV9PQkpTX09NSVRfRlJPWkVOKQogCSQoTElOS0NDKSAkKFBZX0xERkxBR1MpIC1vICRAIFByb2dyYW1zL19mcmVlemVfaW1wb3J0bGliLm8gJChMSUJSQVJZX09CSlNfT01JVF9GUk9aRU4pICQoTElCUykgJChNT0RMSUJTKSAkKFNZU0xJQlMpICQoTERMQVNUKQogCi1QeXRob24vaW1wb3J0bGliX2V4dGVybmFsLmg6IEBHRU5FUkFURURfQ09NTUVOVEAgJChzcmNkaXIpL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcF9leHRlcm5hbC5weSBQcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYgorUHl0aG9uL2ltcG9ydGxpYl9leHRlcm5hbC5oOiBAR0VORVJBVEVEX0NPTU1FTlRAICQoc3JjZGlyKS9MaWIvaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHkgUHJvZ3JhbXMvX2ZyZWV6ZV9pbXBvcnRsaWIgUHl0aG9uL21hcnNoYWwuYwogCS4vUHJvZ3JhbXMvX2ZyZWV6ZV9pbXBvcnRsaWIgXAogCSAgICAkKHNyY2RpcikvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwX2V4dGVybmFsLnB5IFB5dGhvbi9pbXBvcnRsaWJfZXh0ZXJuYWwuaAogCi1QeXRob24vaW1wb3J0bGliLmg6IEBHRU5FUkFURURfQ09NTUVOVEAgJChzcmNkaXIpL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcC5weSBQcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYgorUHl0aG9uL2ltcG9ydGxpYi5oOiBAR0VORVJBVEVEX0NPTU1FTlRAICQoc3JjZGlyKS9MaWIvaW1wb3J0bGliL19ib290c3RyYXAucHkgUHJvZ3JhbXMvX2ZyZWV6ZV9pbXBvcnRsaWIgUHl0aG9uL21hcnNoYWwuYwogCS4vUHJvZ3JhbXMvX2ZyZWV6ZV9pbXBvcnRsaWIgXAogCSAgICAkKHNyY2RpcikvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwLnB5IFB5dGhvbi9pbXBvcnRsaWIuaAogCkBAIC03MzQsNyArNzE0LDYgQEAKIAkJJChPQkpFQ1RfT0JKUykgXAogCQkkKFBZVEhPTl9PQkpTKSBcCiAJCSQoTU9EVUxFX09CSlMpIFwKLQkJJChTSUdOQUxfT0JKUykgXAogCQkkKE1PRE9CSlMpIFwKIAkJJChzcmNkaXIpL01vZHVsZXMvZ2V0YnVpbGRpbmZvLmMKIAkkKENDKSAtYyAkKFBZX0NPUkVfQ0ZMQUdTKSBcCkBAIC03ODAsNiArNzU5LDcgQEAKIFB5dGhvbi9zeXNtb2R1bGUubzogJChzcmNkaXIpL1B5dGhvbi9zeXNtb2R1bGUuYyBNYWtlZmlsZQogCSQoQ0MpIC1jICQoUFlfQ09SRV9DRkxBR1MpIFwKIAkJLURBQklGTEFHUz0nIiQoQUJJRkxBR1MpIicgXAorCQkkKE1VTFRJQVJDSF9DUFBGTEFHUykgXAogCQktbyAkQCAkKHNyY2RpcikvUHl0aG9uL3N5c21vZHVsZS5jCiAKICQoSU9fT0JKUyk6ICQoSU9fSCkKQEAgLTg2MSw3ICs4NDEsOCBAQAogCiBPYmplY3RzL3VuaWNvZGVvYmplY3QubzogJChzcmNkaXIpL09iamVjdHMvdW5pY29kZW9iamVjdC5jICQoVU5JQ09ERV9ERVBTKQogCi1PYmplY3RzL2RpY3RvYmplY3QubzogJChzcmNkaXIpL09iamVjdHMvc3RyaW5nbGliL2VxLmgKK09iamVjdHMvb2RpY3RvYmplY3QubzogJChzcmNkaXIpL09iamVjdHMvZGljdC1jb21tb24uaAorT2JqZWN0cy9kaWN0b2JqZWN0Lm86ICQoc3JjZGlyKS9PYmplY3RzL3N0cmluZ2xpYi9lcS5oICQoc3JjZGlyKS9PYmplY3RzL2RpY3QtY29tbW9uLmgKIE9iamVjdHMvc2V0b2JqZWN0Lm86ICQoc3JjZGlyKS9PYmplY3RzL3N0cmluZ2xpYi9lcS5oCiAKICQoT1BDT0RFVEFSR0VUU19IKTogJChPUENPREVUQVJHRVRHRU5fRklMRVMpCkBAIC05MjgsNiArOTA5LDcgQEAKIAkJJChzcmNkaXIpL0luY2x1ZGUvb2JqaW1wbC5oIFwKIAkJJChPUENPREVfSCkgXAogCQkkKHNyY2RpcikvSW5jbHVkZS9vc2RlZnMuaCBcCisJCSQoc3JjZGlyKS9JbmNsdWRlL29zbW9kdWxlLmggXAogCQkkKHNyY2RpcikvSW5jbHVkZS9wYXRjaGxldmVsLmggXAogCQkkKHNyY2RpcikvSW5jbHVkZS9wZ2VuLmggXAogCQkkKHNyY2RpcikvSW5jbHVkZS9wZ2VuaGVhZGVycy5oIFwKQEAgLTk3Nyw3ICs5NTksNyBAQAogVEVTVE9QVFM9CSQoRVhUUkFURVNUT1BUUykKIFRFU1RQWVRIT049CSQoUlVOU0hBUkVEKSAuLyQoQlVJTERQWVRIT04pICQoVEVTVFBZVEhPTk9QVFMpCiBURVNUUlVOTkVSPQkkKFRFU1RQWVRIT04pICQoc3JjZGlyKS9Ub29scy9zY3JpcHRzL3J1bl90ZXN0cy5weQotVEVTVFRJTUVPVVQ9CTM2MDAKK1RFU1RUSU1FT1VUPQk5MDAKIAogIyBSdW4gYSBiYXNpYyBzZXQgb2YgcmVncmVzc2lvbiB0ZXN0cy4KICMgVGhpcyBleGNsdWRlcyBzb21lIHRlc3RzIHRoYXQgYXJlIHBhcnRpY3VsYXJseSByZXNvdXJjZS1pbnRlbnNpdmUuCkBAIC0xMDE1LDcgKzk5Nyw3IEBACiAJCS1AaWYgd2hpY2ggcHlidWlsZGJvdC5pZGVudGlmeSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAogCQkJcHlidWlsZGJvdC5pZGVudGlmeSAiQ0M9JyQoQ0MpJyIgIkNYWD0nJChDWFgpJyI7IFwKIAkJZmkKLQkJJChURVNUUlVOTkVSKSAtaiAxIC11IGFsbCAtVyAtLXRpbWVvdXQ9JChURVNUVElNRU9VVCkgJChURVNUT1BUUykKKwkJJChURVNUUlVOTkVSKSAtaiAxIC11IGFsbCAtVyAtLXNsb3dlc3QgLS10aW1lb3V0PSQoVEVTVFRJTUVPVVQpICQoVEVTVE9QVFMpCiAKIFFVSUNLVEVTVE9QVFM9CSQoVEVTVE9QVFMpIC14IHRlc3Rfc3VicHJvY2VzcyB0ZXN0X2lvIHRlc3RfbGliMnRvMyBcCiAJCXRlc3RfbXVsdGlieXRlY29kZWMgdGVzdF91cmxsaWIyX2xvY2FsbmV0IHRlc3RfaXRlcnRvb2xzIFwKQEAgLTExNzgsNiArMTE2MCw3IEBACiAJCXRlc3QvY2prZW5jb2RpbmdzIHRlc3QvZGVjaW1hbHRlc3RkYXRhIHRlc3QveG1sdGVzdGRhdGEgXAogCQl0ZXN0L2VpbnRyZGF0YSBcCiAJCXRlc3QvaW1naGRyZGF0YSBcCisJCXRlc3QvbGlicmVncnRlc3QgXAogCQl0ZXN0L3N1YnByb2Nlc3NkYXRhIHRlc3Qvc25kaGRyZGF0YSB0ZXN0L3N1cHBvcnQgXAogCQl0ZXN0L3RyYWNlZG1vZHVsZXMgdGVzdC9lbmNvZGVkX21vZHVsZXMgXAogCQl0ZXN0L3Rlc3RfaW1wb3J0IFwKQEAgLTEyNDcsNyArMTIzMCw3IEBACiAJCWVsc2UJdHJ1ZTsgXAogCQlmaTsgXAogCWRvbmUKLQlAZm9yIGkgaW4gJChzcmNkaXIpL0xpYi8qLnB5IGBjYXQgcHlidWlsZGRpci50eHRgL19zeXNjb25maWdkYXRhLnB5OyBcCisJQGZvciBpIGluICQoc3JjZGlyKS9MaWIvKi5weTsgXAogCWRvIFwKIAkJaWYgdGVzdCAteCAkJGk7IHRoZW4gXAogCQkJJChJTlNUQUxMX1NDUklQVCkgJCRpICQoREVTVERJUikkKExJQkRFU1QpOyBcCkBAIC0xMjgyLDYgKzEyNjUsMTAgQEAKIAkJCWVzYWM7IFwKIAkJZG9uZTsgXAogCWRvbmUKKwkkKElOU1RBTExfREFUQSkgYGNhdCBweWJ1aWxkZGlyLnR4dGAvX3N5c2NvbmZpZ2RhdGFfJChBQklGTEFHUykucHkgXAorCQkkKERFU1RESVIpJChMSUJERVNUKS8kKFBMQVRESVIpOyBcCisJZWNobyAkKElOU1RBTExfREFUQSkgYGNhdCBweWJ1aWxkZGlyLnR4dGAvX3N5c2NvbmZpZ2RhdGFfJChBQklGTEFHUykucHkgXAorCQkkKExJQkRFU1QpLyQoUExBVERJUikKIAkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL0xJQ0VOU0UgJChERVNURElSKSQoTElCREVTVCkvTElDRU5TRS50eHQKIAlpZiB0ZXN0IC1kICQoREVTVERJUikkKExJQkRFU1QpL2Rpc3R1dGlscy90ZXN0czsgdGhlbiBcCiAJCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTW9kdWxlcy94eG1vZHVsZS5jIFwKQEAgLTEzMTksMjIgKzEzMDYsOCBAQAogCS1QWVRIT05QQVRIPSQoREVTVERJUikkKExJQkRFU1QpICQoUlVOU0hBUkVEKSBcCiAJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgLW0gbGliMnRvMy5wZ2VuMi5kcml2ZXIgJChERVNURElSKSQoTElCREVTVCkvbGliMnRvMy9QYXR0ZXJuR3JhbW1hci50eHQKIAotIyBDcmVhdGUgdGhlIFBMQVRESVIgc291cmNlIGRpcmVjdG9yeSwgaWYgb25lIHdhc24ndCBkaXN0cmlidXRlZC4uCiAkKHNyY2RpcikvTGliLyQoUExBVERJUik6CiAJbWtkaXIgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpCi0JY3AgJChzcmNkaXIpL0xpYi9wbGF0LWdlbmVyaWMvcmVnZW4gJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpL3JlZ2VuCi0JZXhwb3J0IFBBVEg7IFBBVEg9ImBwd2RgOiQkUEFUSCI7IFwKLQlleHBvcnQgUFlUSE9OUEFUSDsgUFlUSE9OUEFUSD0iYHB3ZGAvTGliIjsgXAotCWV4cG9ydCBEWUxEX0ZSQU1FV09SS19QQVRIOyBEWUxEX0ZSQU1FV09SS19QQVRIPSJgcHdkYCI7IFwKLQlleHBvcnQgRVhFOyBFWEU9IiQoQlVJTERFWEUpIjsgXAotCWlmIFsgLW4gIiQoTVVMVElBUkNIKSIgXTsgdGhlbiBleHBvcnQgTVVMVElBUkNIOyBNVUxUSUFSQ0g9JChNVUxUSUFSQ0gpOyBmaTsgXAotCWV4cG9ydCBQWVRIT05fRk9SX0JVSUxEOyBcCi0JaWYgWyAiJChCVUlMRF9HTlVfVFlQRSkiID0gIiQoSE9TVF9HTlVfVFlQRSkiIF07IHRoZW4gXAotCSAgUFlUSE9OX0ZPUl9CVUlMRD0iJChCVUlMRFBZVEhPTikiOyBcCi0JZWxzZSBcCi0JICBQWVRIT05fRk9SX0JVSUxEPSIkKFBZVEhPTl9GT1JfQlVJTEQpIjsgXAotCWZpOyBcCi0JY2QgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpOyAkKFJVTlNIQVJFRCkgLi9yZWdlbgogCiBweXRob24tY29uZmlnOiAkKHNyY2RpcikvTWlzYy9weXRob24tY29uZmlnLmluIE1pc2MvcHl0aG9uLWNvbmZpZy5zaAogCSMgU3Vic3RpdHV0aW9uIGhhcHBlbnMgaGVyZSwgYXMgdGhlIGNvbXBsZXRlbHktZXhwYW5kZWQgQklORElSCkBAIC0xNDMyLDcgKzE0MDUsNyBAQAogCQktLWluc3RhbGwtc2NyaXB0cz0kKEJJTkRJUikgXAogCQktLWluc3RhbGwtcGxhdGxpYj0kKERFU1RTSEFSRUQpIFwKIAkJLS1yb290PSQoREVTVERJUikvCi0JLXJtICQoREVTVERJUikkKERFU1RTSEFSRUQpL19zeXNjb25maWdkYXRhLnB5CisJLXJtICQoREVTVERJUikkKERFU1RTSEFSRUQpL19zeXNjb25maWdkYXRhXyQoQUJJRkxBR1MpLnB5CiAJLXJtIC1yICQoREVTVERJUikkKERFU1RTSEFSRUQpL19fcHljYWNoZV9fCiAKICMgSGVyZSBhcmUgYSBjb3VwbGUgb2YgdGFyZ2V0cyBmb3IgTWFjT1NYIGFnYWluLCB0byBpbnN0YWxsIGEgZnVsbApAQCAtMTQ3OCwxMCArMTQ1MSwxMCBAQAogIyBJbnN0YWxsIGEgbnVtYmVyIG9mIHN5bWxpbmtzIHRvIGtlZXAgc29mdHdhcmUgdGhhdCBleHBlY3RzIGEgbm9ybWFsIHVuaXgKICMgaW5zdGFsbCAod2hpY2ggaW5jbHVkZXMgcHl0aG9uLWNvbmZpZykgaGFwcHkuCiBmcmFtZXdvcmtpbnN0YWxsbWFjbGliOgotCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQocHJlZml4KS9saWIvcHl0aG9uJChWRVJTSU9OKS9jb25maWctJChMRFZFUlNJT04pL2xpYnB5dGhvbiQoTERWRVJTSU9OKS5hIgotCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQocHJlZml4KS9saWIvcHl0aG9uJChWRVJTSU9OKS9jb25maWctJChMRFZFUlNJT04pL2xpYnB5dGhvbiQoTERWRVJTSU9OKS5keWxpYiIKLQkkKExOKSAtZnMgIi4uLy4uLy4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKHByZWZpeCkvbGliL3B5dGhvbiQoVkVSU0lPTikvY29uZmlnLSQoTERWRVJTSU9OKS9saWJweXRob24kKFZFUlNJT04pLmEiCi0JJChMTikgLWZzICIuLi8uLi8uLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChwcmVmaXgpL2xpYi9weXRob24kKFZFUlNJT04pL2NvbmZpZy0kKExEVkVSU0lPTikvbGlicHl0aG9uJChWRVJTSU9OKS5keWxpYiIKKwkkKExOKSAtZnMgIi4uLy4uLy4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKExJQlBMKS9saWJweXRob24kKExEVkVSU0lPTikuYSIKKwkkKExOKSAtZnMgIi4uLy4uLy4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKExJQlBMKS9saWJweXRob24kKExEVkVSU0lPTikuZHlsaWIiCisJJChMTikgLWZzICIuLi8uLi8uLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChMSUJQTCkvbGlicHl0aG9uJChWRVJTSU9OKS5hIgorCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQoTElCUEwpL2xpYnB5dGhvbiQoVkVSU0lPTikuZHlsaWIiCiAJJChMTikgLWZzICIuLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChwcmVmaXgpL2xpYi9saWJweXRob24kKExEVkVSU0lPTikuZHlsaWIiCiAJJChMTikgLWZzICIuLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChwcmVmaXgpL2xpYi9saWJweXRob24kKFZFUlNJT04pLmR5bGliIgogCkBAIC0xNjExLDYgKzE1ODQsOSBAQAogCS1ybSAtcmYgYnVpbGQgcGxhdGZvcm0KIAktcm0gLXJmICQoUFlUSE9ORlJBTUVXT1JLRElSKQogCS1ybSAtZiBweXRob24tY29uZmlnLnB5IHB5dGhvbi1jb25maWcKKwlpZiBbIC1uICIkKE1VTFRJQVJDSCkiIF07IHRoZW4gXAorCSAgcm0gLXJmICQoc3JjZGlyKS9MaWIvJChQTEFURElSKTsgXAorCWZpCiAKICMgTWFrZSB0aGluZ3MgZXh0cmEgY2xlYW4sIGJlZm9yZSBtYWtpbmcgYSBkaXN0cmlidXRpb246CiAjIHJlbW92ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzLCBldmVuIE1ha2VmaWxlWy5wcmVdCkBAIC0xNjU2LDcgKzE2MzIsNiBAQAogCQktbyAtbmFtZSAnKi50bVNuaXBwZXQnIFwKIAkJLW8gLW5hbWUgJ1NldHVwJyBcCiAJCS1vIC1uYW1lICdTZXR1cC4qJyBcCi0JCS1vIC1uYW1lIHJlZ2VuIFwKIAkJLW8gLW5hbWUgUkVBRE1FIFwKIAkJLW8gLW5hbWUgTkVXUyBcCiAJCS1vIC1uYW1lIEhJU1RPUlkgXApkaWZmIC0tZ2l0IGEvTWlzYy9BQ0tTIGIvTWlzYy9BQ0tTCmluZGV4IDIwYzQ3ZjYuLjA3ZmMxODMgMTAwNjQ0Ci0tLSBhL01pc2MvQUNLUworKysgYi9NaXNjL0FDS1MKQEAgLTE1NSw2ICsxNTUsNyBAQAogUGF1bCBCb2RkaWUKIE1hdHRoZXcgQm9lZGlja2VyCiBSb2JpbiBCb2VyZGlqaworTmlrb2xheSBCb2dveWNoZXYKIERhdmlkIEJvbGVuCiBXb3V0ZXIgQm9sc3RlcmxlZQogR2F3YWluIEJvbHRvbgpAQCAtMjQxLDYgKzI0Miw3IEBACiBNaWNoYWVsIENldHJ1bG8KIERhdmUgQ2hhbWJlcnMKIFBhc2NhbCBDaGFtYm9uCitOaWNob2xhcyBDaGFtbWFzCiBKb2huIENoYW5kbGVyCiBIeWUtU2hpayBDaGFuZwogSmVmZnJleSBDaGFuZwpAQCAtMzA1LDE1ICszMDcsMTggQEAKIERhdmlkIENvdXJuYXBlYXUKIEp1bGllbiBDb3VydGVhdQogU3RldmUgQ291c2lucworRnJhbmNpc2NvIENvdXpvCiBBbGV4IENvdmVudHJ5CiBNYXR0aGV3IERpeG9uIENvd2xlcwogUnlhbiBDb3luZXIKIENocmlzdG9waGVyIEEuIENyYWlnCiBKZXJlbXkgQ3JhdmVuCiBMYXVyYSBDcmVpZ2h0b24KK1R5bGVyIENyb21wdG9uCiBTaW1vbiBDcm9zcwogRmVsaXBlIENydXoKIERyZXcgQ3NpbGxhZworQWxlc3NhbmRybyBDdWNjaQogSm9hcXVpbiBDdWVuY2EgQWJlbGEKIEpvaG4gQ3VnaW5pCiBUb20gQ3VsbGl0b24KQEAgLTM1Nyw2ICszNjIsNyBAQAogWXZlcyBEaW9ubmUKIERhbmllbCBEaXR0bWFyCiBKb3NpcCBEam9sb25nYQorV2FsdGVyIETDtnJ3YWxkCiBKYXJvbWlyIERvbGVjZWsKIElzbWFpbCBEb25tZXoKIFJvYmVydCBEb25vaHVlCkBAIC0zODQsNyArMzkwLDYgQEAKIEthcm1lbiBEeWtzdHJhCiBKb3NpcCBEem9sb25nYQogTWF4aW0gRHp1bWFuZW5rbwotV2FsdGVyIETDtnJ3YWxkCiBIYW5zIEVja2FyZHQKIFJvZG9scGhvIEVja2hhcmR0CiBVbHJpY2ggRWNraGFyZHQKQEAgLTU0Miw4ICs1NDcsMTAgQEAKIExhcnMgR3VzdMOkYmVsCiBUaG9tYXMgR8O8dHRsZXIKIEpvbmFzIEguCitKb3NlcGggSGFja21hbgogQmFycnkgSGFkZG93CiBQaGlsaXBwIEhhZ2VtZWlzdGVyCitKb2huIEhhZ2VuCiBQYXVsIHRlbiBIYWdlbgogUmFzbXVzIEhhaG4KIFBldGVyIEhhaWdodApAQCAtNzc5LDYgKzc4Niw3IEBACiBNYXJrbyBLb2h0YWxhCiBWYWpyYXNreSBLb2sKIEd1aWRvIEtvbGxlcmllCitKYWNlayBLb8WCb2R6aWVqCiBKYWNlayBLb25pZWN6bnkKIEFya2FkeSBLb3BseWFyb3YKIFBldGVyIEEuIEtvcmVuCkBAIC03OTAsNiArNzk4LDcgQEAKIEplcnp5IEtvemVyYQogTWFrc2ltIEtvenlhcmNodWsKIFN0ZWZhbiBLcmFoCitSb2xmIEtyYWhsCiBCb2IgS3JhcwogU2ViYXN0aWFuIEtyZWZ0CiBIb2xnZXIgS3Jla2VsCkBAIC04MjIsNiArODMxLDcgQEAKIFRpbm8gTGFuZ2UKIEdsZW5uIExhbmdmb3JkCiBBbmRyZXcgTGFuZ21lYWQKK1dvbGZnYW5nIExhbmduZXIKIERldGxlZiBMYW5uZXJ0CiBTb3JlbiBMYXJzZW4KIEFtb3MgTGF0dGVpZXIKQEAgLTg4MywyNCArODkzLDI3IEBACiBHcmVnb3IgTGluZ2wKIEV2ZXJldHQgTGlwbWFuCiBNaXJrbyBMaXNzCitBbGV4YW5kZXIgTGl1CiBOaWNrIExvY2t3b29kCiBTdGVwaGFuaWUgTG9ja3dvb2QKK01hcnRpbiB2b24gTMO2d2lzCiBIdWdvIExvcGVzIFRhdmFyZXMKIEd1aWxsZXJtbyBMw7NwZXotQW5nbGFkYQogQW5uZSBMb3JkCitBbGV4IExvcmRUaG9yc2VuCiBUb20gTG9yZWRvCiBKdXN0aW4gTG92ZQogTmVkIEphY2tzb24gTG92ZWx5CiBQZXRlciBMb3ZldHQKIENoYWxtZXIgTG93ZQogSmFzb24gTG93ZQotTWFydGluIHZvbiBMw7Z3aXMKIFRvbnkgTG93bmRzCiBSYXkgTG95emFnYQogS2FuZy1IYW8gKEtlbm55KSBMdQogTHVrYXMgTHVlZwogTG9yZW4gTHVrZQogRnJlZHJpayBMdW5kaAorTWlrZSBMdW5keQogWmhvbmd5dWUgTHVvCiBNYXJrIEx1dHoKIFRhcmFzIEx5YXB1bgpAQCAtMTE0MSw5ICsxMTU0LDExIEBACiBHZW9mZiBQaGlsYnJpY2sKIEdhdnJpZSBQaGlsaXBzb24KIEFkcmlhbiBQaGlsbGlwcworRHVzdHkgUGhpbGxpcHMKIENocmlzdG9waGVyIEouIFBob2VuaXgKIEphbWVzIFBpY2tlcmluZwogTmVhbGUgUGlja2V0dAorU3RldmUgUGllcmN5CiBKaW0gU3QuIFBpZXJyZQogRGFuIFBpZXJzb24KIE1hcnRpam4gUGlldGVycwpAQCAtMTE5NCw2ICsxMjA5LDcgQEAKIEplZmYgUmFtbmFuaQogVmFycHUgUmFudGFsYQogQnJvZGllIFJhbworUsOpbWkgUmFtcGluCiBTZW5rbyBSYXNpYwogQW50dGkgUmFzaW5lbgogTmlrb2xhdXMgUmF0aApAQCAtMTI0NCw2ICsxMjYwLDcgQEAKIEtldmluIFJvZGdlcnMKIFNlYW4gUm9kbWFuCiBHaWFtcGFvbG8gUm9kb2xhCitNYXVybyBTLiBNLiBSb2RyaWd1ZXMKIEVsc29uIFJvZHJpZ3VlegogQWRpIFJvaWJhbgogTHVpcyBSb2phcwpAQCAtMTI4Niw2ICsxMzAzLDcgQEAKIENvbnN0YW50aW5hIFMuCiBQYXRyaWNrIFNhYmluCiBTw6liYXN0aWVuIFNhYmzDqQorQW1pdCBTYWhhCiBTdW1hbiBTYWhhCiBIYWppbWUgU2FpdG91CiBHZW9yZ2UgU2Fra2lzCkBAIC0xMzkyLDYgKzE0MTAsNyBAQAogUm95IFNtaXRoCiBSeWFuIFNtaXRoLVJvYmVydHMKIFJhZmFsIFNtb3RyenlrCitKb3NoIFNuaWRlcgogRXJpYyBTbm93CiBEaXJrIFNvZWRlCiBOaXIgU29mZmVyCkBAIC0xNDE5LDExICsxNDM4LDEzIEBACiBNYXJlayBTdGVwbmlvd3NraQogQmFydWNoIFN0ZXJpbgogQ2hyaXMgU3Rlcm4KK0VsaSBTdGV2ZW5zCiBBbGV4IFN0ZXdhcnQKIFZpY3RvciBTdGlubmVyCiBSaWNoYXJkIFN0b2FrbGV5CiBQZXRlciBTdG9laHIKIENhc3BlciBTdG9lbAorRGFuaWVsIFN0b2tlcwogTWljaGFlbCBTdG9uZQogU2VyaGl5IFN0b3JjaGFrYQogS2VuIFN0b3gKQEAgLTE0NDgsNiArMTQ2OSw3IEBACiBKb2huIFN6YWttZWlzdGVyCiBBbWlyIFN6ZWtlbHkKIE1hY2llaiBTenVsaWsKK0pvZWwgVGFkZGVpCiBBcmZyZXZlciBGcmVodGVzIFRhaWZlcnNhciBBcmFoZXNpcwogSGlkZWFraSBUYWthaGFzaGkKIFRha2FzZSBBcmloaXJvCkBAIC0xNDU5LDggKzE0ODEsMTAgQEAKIENocmlzdGlhbiBUYW56ZXIKIFN0ZXZlbiBUYXNjaHVrCiBBbXkgVGF5bG9yCitKdWxpYW4gVGF5bG9yCiBNb250eSBUYXlsb3IKIEFuYXRvbHkgVGVjaHRvbmlrCitNYXJ0aW4gVGVpY2htYW5uCiBHdXN0YXZvIFRlbXBsZQogTWlraGFpbCBUZXJla2hvdgogVmljdG9yIFRlcnLDs24KQEAgLTE2NDEsNiArMTY2NSw3IEBACiBBbGFrc2hlbmRyYSBZYWRhdgogSGlyb2thenUgWWFtYW1vdG8KIEthLVBpbmcgWWVlCitDaGkgSHN1YW4gWWVuCiBKYXNvbiBZZW8KIEV1bmdKdW4gWWkKIEJvYiBZb2Rsb3dza2kKQEAgLTE2NjksNCArMTY5NCwzIEBACiBEb3VnIFpvbmdrZXIKIFBldGVyIMOFc3RyYW5kCiBldmlsemVybwotQ2hpIEhzdWFuIFllbgpkaWZmIC0tZ2l0IGEvTWlzYy9ORVdTIGIvTWlzYy9ORVdTCmluZGV4IGUwNWU4ZTcuLjE5NDMyNTYgMTAwNjQ0Ci0tLSBhL01pc2MvTkVXUworKysgYi9NaXNjL05FV1MKQEAgLTIsMTQgKzIsNzEgQEAKIFB5dGhvbiBOZXdzCiArKysrKysrKysrKwogCi1XaGF0J3MgTmV3IGluIFB5dGhvbiAzLjUuMyByZWxlYXNlIGNhbmRpZGF0ZSAxPwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1doYXQncyBOZXcgaW4gUHl0aG9uIDMuNi4wIGJldGEgMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVJlbGVhc2UgZGF0ZTogVEJBCisqUmVsZWFzZSBkYXRlOiBYWFhYLVhYLVhYKgogCiBDb3JlIGFuZCBCdWlsdGlucwogLS0tLS0tLS0tLS0tLS0tLS0KIAorLSBJc3N1ZSAjMjcyMTM6IFJld29yayBDQUxMX0ZVTkNUSU9OKiBvcGNvZGVzIHRvIHByb2R1Y2Ugc2hvcnRlciBhbmQgbW9yZQorICBlZmZpY2llbnQgYnl0ZWNvZGUuIFBhdGNoIGJ5IERlbXVyIFJ1bWVkLCBkZXNpZ24gYnkgU2VyaGl5IFN0b3JjaGFrYSwKKyAgcmV2aWV3ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBhbmQgVmljdG9yIFN0aW5uZXIuCisKKy0gSXNzdWUgIzI3OTk5OiBNYWtlICJnbG9iYWwgYWZ0ZXIgdXNlIiBhIFN5bnRheEVycm9yLCBhbmQgZGl0dG8gZm9yIG5vbmxvY2FsLgorICBQYXRjaCBieSBJdmFuIExldmtpdnNreWkuCisKKy0gSXNzdWUgIzI4MDAzOiBJbXBsZW1lbnQgUEVQIDUyNSAtLSBBc3luY2hyb25vdXMgR2VuZXJhdG9ycy4KKworLSBJc3N1ZSAjMjc5ODU6IEltcGxlbWVudCBQRVAgNTI2IC0tIFN5bnRheCBmb3IgVmFyaWFibGUgQW5ub3RhdGlvbnMuCisgIFBhdGNoIGJ5IEl2YW4gTGV2a2l2c2t5aS4KKworLSBJc3N1ZSAjMjYwNTg6IEFkZCBhIG5ldyBwcml2YXRlIHZlcnNpb24gdG8gdGhlIGJ1aWx0aW4gZGljdCB0eXBlLCBpbmNyZW1lbnRlZAorICBhdCBlYWNoIGRpY3Rpb25hcnkgY3JlYXRpb24gYW5kIGF0IGVhY2ggZGljdGlvbmFyeSBjaGFuZ2UuIEltcGxlbWVudGF0aW9uIG9mCisgIHRoZSBQRVAgNTA5LgorCistIElzc3VlICMyNzM2NDogQSBiYWNrc2xhc2gtY2hhcmFjdGVyIHBhaXIgdGhhdCBpcyBub3QgYSB2YWxpZCBlc2NhcGUgc2VxdWVuY2UKKyAgbm93IGdlbmVyYXRlcyBhIERlcHJlY2F0aW9uV2FybmluZy4gIFBhdGNoIGJ5IEVtYW51ZWwgQmFycnkuCisKKy0gSXNzdWUgIzI3MzUwOiBgZGljdGAgaW1wbGVtZW50YXRpb24gaXMgY2hhbmdlZCBsaWtlIFB5UHkuIEl0IGlzIG1vcmUgY29tcGFjdAorICBhbmQgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlci4KKyAgKENvbmNlcHQgZGV2ZWxvcGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyIGFuZCBwYXRjaCBieSBJbmFkYSBOYW9raS4pCisKKy0gSXNzdWUgIzI3OTExOiBSZW1vdmUgdW5uZWNlc3NhcnkgZXJyb3IgY2hlY2tzIGluCisgIGBgZXhlY19idWlsdGluX29yX2R5bmFtaWMoKWBgLgorCistIElzc3VlICMyNzA3ODogQWRkZWQgQlVJTERfU1RSSU5HIG9wY29kZS4gIE9wdGltaXplZCBmLXN0cmluZ3MgZXZhbHVhdGlvbi4KKworLSBJc3N1ZSAjMTc4ODQ6IFB5dGhvbiBub3cgcmVxdWlyZXMgc3lzdGVtcyB3aXRoIGludHR5cGVzLmggYW5kIHN0ZGludC5oCisKKy0gSXNzdWUgIzI3OTYxOiBSZXF1aXJlIHBsYXRmb3JtcyB0byBzdXBwb3J0IGBgbG9uZyBsb25nYGAuIFB5dGhvbiBoYXNuJ3QKKyAgY29tcGlsZWQgd2l0aG91dCBgYGxvbmcgbG9uZ2BgIGZvciB5ZWFycywgc28gdGhpcyBpcyBiYXNpY2FsbHkgYSBmb3JtYWxpdHkuCisKKy0gSXNzdWUgIzI3MzU1OiBSZW1vdmVkIHN1cHBvcnQgZm9yIFdpbmRvd3MgQ0UuICBJdCB3YXMgbmV2ZXIgZmluaXNoZWQsCisgIGFuZCBXaW5kb3dzIENFIGlzIG5vIGxvbmdlciBhIHJlbGV2YW50IHBsYXRmb3JtIGZvciBQeXRob24uCisKKy0gSXNzdWUgIzI3OTIxOiBEaXNhbGxvdyBiYWNrc2xhc2hlcyBpbiBmLXN0cmluZ3MuIFRoaXMgaXMgYSB0ZW1wb3JhcnkKKyAgcmVzdHJpY3Rpb246IGluIGJldGEgMiwgYmFja3NsYXNoZXMgd2lsbCBvbmx5IGJlIGRpc2FsbG93ZWQgaW5zaWRlCisgIHRoZSBicmFjZXMgKHdoZXJlIHRoZSBleHByZXNzaW9ucyBhcmUpLiBUaGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdlCisgIGZyb20gdGhlIDMuNiBhbHBoYSByZWxlYXNlcy4KKworLSBJbXBsZW1lbnQgUEVQIDUyMy4KKworLSBJc3N1ZSAjMjc4NzA6IEEgbGVmdCBzaGlmdCBvZiB6ZXJvIGJ5IGEgbGFyZ2UgaW50ZWdlciBubyBsb25nZXIgYXR0ZW1wdHMKKyAgdG8gYWxsb2NhdGUgbGFyZ2UgYW1vdW50cyBvZiBtZW1vcnkuCisKKy0gSXNzdWUgIzI1NDAyOiBJbiBpbnQtdG8tZGVjaW1hbC1zdHJpbmcgY29udmVyc2lvbiwgaW1wcm92ZSB0aGUgZXN0aW1hdGUKKyAgb2YgdGhlIGludGVybWVkaWF0ZSBtZW1vcnkgcmVxdWlyZWQsIGFuZCByZW1vdmUgYW4gdW5uZWNlc3NhcmlseSBzdHJpY3QKKyAgb3ZlcmZsb3cgY2hlY2suIFBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EuCisKKy0gSXNzdWUgIzI3MjE0OiBJbiBsb25nX2ludmVydCwgYmUgbW9yZSBjYXJlZnVsIGFib3V0IG1vZGlmeWluZyBvYmplY3QKKyAgcmV0dXJuZWQgYnkgbG9uZ19hZGQsIGFuZCByZW1vdmUgYW4gdW5uZWNlc3NhcnkgY2hlY2sgZm9yIHNtYWxsIGxvbmdzLgorICBUaGFua3MgT3JlbiBNaWxtYW4gZm9yIGFuYWx5c2lzIGFuZCBwYXRjaC4KKworLSBJc3N1ZSAjMjc1MDY6IFN1cHBvcnQgcGFzc2luZyB0aGUgYnl0ZXMvYnl0ZWFycmF5LnRyYW5zbGF0ZSgpICJkZWxldGUiCisgIGFyZ3VtZW50IGJ5IGtleXdvcmQuCisKIC0gSXNzdWUgIzI3ODEyOiBQcm9wZXJseSBjbGVhciBvdXQgYSBnZW5lcmF0b3IncyBmcmFtZSdzIGJhY2tyZWZlcmVuY2UgdG8gdGhlCiAgIGdlbmVyYXRvciB0byBwcmV2ZW50IGNyYXNoZXMgaW4gZnJhbWUuY2xlYXIoKS4KIApAQCAtMjAsNyArNzcsMjEgQEAKICAgYWZ0ZXIgdXNlIG9mICdkZWYnIGluIF9QeVN0YXRlX0FkZE1vZHVsZSgpLgogICBJbml0aWFsIHBhdGNoIGJ5IENocmlzdGlhbiBIZWltZXMuCiAKLS0gSXNzdWUgIzI2MDIwOiBzZXQgbGl0ZXJhbCBldmFsdWF0aW9uIG9yZGVyIGRpZCBub3QgbWF0Y2ggZG9jdW1lbnRlZCBiZWhhdmlvdXIuCistIElzc3VlICMyNzc5MjogVGhlIG1vZHVsbyBvcGVyYXRpb24gYXBwbGllZCB0byBgYGJvb2xgYCBhbmQgb3RoZXIKKyAgYGBpbnRgYCBzdWJjbGFzc2VzIG5vdyBhbHdheXMgcmV0dXJucyBhbiBgYGludGBgLiBQcmV2aW91c2x5CisgIHRoZSByZXR1cm4gdHlwZSBkZXBlbmRlZCBvbiB0aGUgaW5wdXQgdmFsdWVzLiBQYXRjaCBieSBYaWFuZyBaaGFuZy4KKworLSBJc3N1ZSAjMjY5ODQ6IGludCgpIG5vdyBhbHdheXMgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBleGFjdCBpbnQuCisKKy0gSXNzdWUgIzI1NjA0OiBGaXggYSBtaW5vciBidWcgaW4gaW50ZWdlciB0cnVlIGRpdmlzaW9uOyB0aGlzIGJ1ZyBjb3VsZAorICBwb3RlbnRpYWxseSBoYXZlIGNhdXNlZCBvZmYtYnktb25lLXVscCByZXN1bHRzIG9uIHBsYXRmb3JtcyB3aXRoCisgIHVucmVsaWFibGUgbGRleHAgaW1wbGVtZW50YXRpb25zLgorCistIElzc3VlICMyNDI1NDogTWFrZSBjbGFzcyBkZWZpbml0aW9uIG5hbWVzcGFjZSBvcmRlcmVkIGJ5IGRlZmF1bHQuCisKKy0gSXNzdWUgIzI3NjYyOiBGaXggYW4gb3ZlcmZsb3cgY2hlY2sgaW4gYGBMaXN0X05ld2BgOiB0aGUgb3JpZ2luYWwgY29kZSB3YXMKKyAgY2hlY2tpbmcgYWdhaW5zdCBgYFB5X1NJWkVfTUFYYGAgaW5zdGVhZCBvZiB0aGUgY29ycmVjdCB1cHBlciBib3VuZCBvZgorICBgYFB5X1NTSVpFX1RfTUFYYGAuIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgogCiAtIElzc3VlICMyNzc4MjogTXVsdGktcGhhc2UgZXh0ZW5zaW9uIG1vZHVsZSBpbXBvcnQgbm93IGNvcnJlY3RseSBhbGxvd3MgdGhlCiAgIGBgbV9tZXRob2RzYGAgZmllbGQgdG8gYmUgdXNlZCB0byBhZGQgbW9kdWxlIGxldmVsIGZ1bmN0aW9ucyB0byBpbnN0YW5jZXMKQEAgLTM0LDMwICsxMDUsMTQgQEAKICAgcnVucHkucnVuX21vZHVsZSgpIGlzIGZvdW5kIGluIHN5cy5tb2R1bGVzIGFmdGVyIHBhcmVudCBwYWNrYWdlcyBhcmUKICAgaW1wb3J0ZWQsIGJ1dCBiZWZvcmUgdGhlIHN1Ym1vZHVsZSBpcyBleGVjdXRlZC4KIAorLSBJc3N1ZSAjMjcxNTc6IE1ha2Ugb25seSB0eXBlKCkgaXRzZWxmIGFjY2VwdCB0aGUgb25lLWFyZ3VtZW50IGZvcm0uCisgIFBhdGNoIGJ5IEVyeWsgU3VuIGFuZCBFbWFudWVsIEJhcnJ5LgorCiAtIElzc3VlICMyNzU1ODogRml4IGEgU3lzdGVtRXJyb3IgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mICJyYWlzZSIgc3RhdGVtZW50LgogICBJbiBhIGJyYW5kIG5ldyB0aHJlYWQsIHJhaXNlIGEgUnVudGltZUVycm9yIHNpbmNlIHRoZXJlIGlzIG5vIGFjdGl2ZQogICBleGNlcHRpb24gdG8gcmVyYWlzZS4gUGF0Y2ggd3JpdHRlbiBieSBYaWFuZyBaaGFuZy4KIAotLSBJc3N1ZSAjMjc0MTk6IFN0YW5kYXJkIF9faW1wb3J0X18oKSBubyBsb25nZXIgbG9vayB1cCAiX19pbXBvcnRfXyIgaW4gZ2xvYmFscwotICBvciBidWlsdGlucyBmb3IgaW1wb3J0aW5nIHN1Ym1vZHVsZXMgb3IgImZyb20gaW1wb3J0Ii4gIEZpeGVkIGhhbmRsaW5nIGFuCi0gIGVycm9yIG9mIG5vbi1zdHJpbmcgcGFja2FnZSBuYW1lLgotCi0tIElzc3VlICMyNzA4MzogUmVzcGVjdCB0aGUgUFlUSE9OQ0FTRU9LIGVudmlyb25tZW50IHZhcmlhYmxlIHVuZGVyIFdpbmRvd3MuCi0KLS0gSXNzdWUgIzI3NTE0OiBNYWtlIGhhdmluZyB0b28gbWFueSBzdGF0aWNhbGx5IG5lc3RlZCBibG9ja3MgYSBTeW50YXhFcnJvcgotICBpbnN0ZWFkIG9mIFN5c3RlbUVycm9yLgotCi0tIElzc3VlICMyNzQ3MzogRml4ZWQgcG9zc2libGUgaW50ZWdlciBvdmVyZmxvdyBpbiBieXRlcyBhbmQgYnl0ZWFycmF5Ci0gIGNvbmNhdGVuYXRpb25zLiAgUGF0Y2ggYnkgWGlhbmcgWmhhbmcuCi0KLS0gSXNzdWUgIzI3NTA3OiBBZGQgaW50ZWdlciBvdmVyZmxvdyBjaGVjayBpbiBieXRlYXJyYXkuZXh0ZW5kKCkuICBQYXRjaCBieQotICBYaWFuZyBaaGFuZy4KLQotLSBJc3N1ZSAjMjc1ODE6IERvbid0IHJlbHkgb24gd3JhcHBpbmcgZm9yIG92ZXJmbG93IGNoZWNrIGluCi0gIFB5U2VxdWVuY2VfVHVwbGUoKS4gIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgotCi0tIElzc3VlICMyNzQ0MzogX19sZW5ndGhfaGludF9fKCkgb2YgYnl0ZWFycmF5IGl0ZXJhdG9ycyBubyBsb25nZXIgcmV0dXJuIGEKLSAgbmVnYXRpdmUgaW50ZWdlciBmb3IgYSByZXNpemVkIGJ5dGVhcnJheS4KKy0gSXNzdWUgIzI4MDA4OiBJbXBsZW1lbnQgUEVQIDUzMCAtLSBhc3luY2hyb25vdXMgY29tcHJlaGVuc2lvbnMuCiAKIExpYnJhcnkKIC0tLS0tLS0KQEAgLTY3LDEzICsxMjIsMjcgQEAKIC0gSXNzdWUgIzI4MDQ3OiBGaXhlZCBjYWxjdWxhdGlvbiBvZiBsaW5lIGxlbmd0aCB1c2VkIGZvciB0aGUgYmFzZTY0IENURQogICBpbiB0aGUgbmV3IGVtYWlsIHBvbGljaWVzLgogCistIElzc3VlICMyNzU3NjogRml4IGNhbGwgb3JkZXIgaW4gT3JkZXJlZERpY3QuX19pbml0X18oKS4KKworLSBlbWFpbC5nZW5lcmF0b3IuRGVjb2RlZEdlbmVyYXRvciBub3cgc3VwcG9ydHMgdGhlIHBvbGljeSBrZXl3b3JkLgorCistIElzc3VlICMyODAyNzogUmVtb3ZlIHVuZG9jdW1lbnRlZCBtb2R1bGVzIGZyb20gYGBMaWIvcGxhdC0qYGA6IElOLCBDRFJPTSwKKyAgRExGQ04sIFRZUEVTLCBDRElPLCBhbmQgU1RST1BUUy4KKwogLSBJc3N1ZSAjMjc0NDU6IERvbid0IHBhc3Mgc3RyKF9jaGFyc2V0KSB0byBNSU1FVGV4dC5zZXRfcGF5bG9hZCgpLgogICBQYXRjaCBieSBDbGF1ZGUgUGFyb3ouCiAKKy0gSXNzdWUgIzI0Mjc3OiBUaGUgbmV3IGVtYWlsIEFQSSBpcyBubyBsb25nZXIgcHJvdmlzaW9uYWwsIGFuZCB0aGUgZG9jcworICBoYXZlIGJlZW4gcmVvcmdhbml6ZWQgYW5kIHJld3JpdHRlbiB0byBlbXBoYXNpemUgdGhlIG5ldyBBUEkuCisKIC0gbGliMnRvMy5wZ2VuMy5kcml2ZXIubG9hZF9ncmFtbWFyKCkgbm93IGNyZWF0ZXMgYSBzdGFibGUgY2FjaGUgZmlsZQogICBiZXR3ZWVuIHJ1bnMgZ2l2ZW4gdGhlIHNhbWUgR3JhbW1hci50eHQgaW5wdXQgcmVnYXJkbGVzcyBvZiB0aGUgaGFzaAogICByYW5kb21pemF0aW9uIHNldHRpbmcuCiAKKy0gSXNzdWUgIzI4MDA1OiBBbGxvdyBJbXBvcnRFcnJvcnMgaW4gZW5jb2RpbmcgaW1wbGVtZW50YXRpb24gdG8gcHJvcGFnYXRlLgorCistIElzc3VlICMyNjY2NzogU3VwcG9ydCBwYXRoLWxpa2Ugb2JqZWN0cyBpbiBpbXBvcnRsaWIudXRpbC4KKwogLSBJc3N1ZSAjMjc1NzA6IEF2b2lkIHplcm8tbGVuZ3RoIG1lbWNweSgpIGV0YyBjYWxscyB3aXRoIG51bGwgc291cmNlCiAgIHBvaW50ZXJzIGluIHRoZSAiY3R5cGVzIiBhbmQgImFycmF5IiBtb2R1bGVzLgogCkBAIC04MSwxOSArMTUwLDcyIEBACiAgIGNoYXJhY3RlcnMsIG5vdCBvbiBhcmJpdHJhcnkgdW5pY29kZSBsaW5lIGJyZWFrcy4gIFRoaXMgYWxzbyBmaXhlcyBhIGJ1ZyBpbgogICBIVFRQIGhlYWRlciBwYXJzaW5nLgogCistIElzc3VlIDI3MzMxOiBUaGUgZW1haWwubWltZSBjbGFzc2VzIG5vdyBhbGwgYWNjZXB0IGFuIG9wdGlvbmFsIHBvbGljeSBrZXl3b3JkLgorCiAtIElzc3VlIDI3OTg4OiBGaXggZW1haWwgaXRlcl9hdHRhY2htZW50cyBpbmNvcnJlY3QgbXV0YXRpb24gb2YgcGF5bG9hZCBsaXN0LgogCistIElzc3VlICMxNjExMzogQWRkIFNIQS0zIGFuZCBTSEFLRSBzdXBwb3J0IHRvIGhhc2hsaWIgbW9kdWxlLgorCistIEVsaW1pbmF0ZSBhIHRhdXRvbG9naWNhbC1wb2ludGVyLWNvbXBhcmUgd2FybmluZyBpbiBfc2Nwcm94eS5jLgorCistIElzc3VlICMyNzc3NjogVGhlIDpmdW5jOmBvcy51cmFuZG9tYCBmdW5jdGlvbiBkb2VzIG5vdyBibG9jayBvbiBMaW51eCAzLjE3CisgIGFuZCBuZXdlciB1bnRpbCB0aGUgc3lzdGVtIHVyYW5kb20gZW50cm9weSBwb29sIGlzIGluaXRpYWxpemVkIHRvIGluY3JlYXNlCisgIHRoZSBzZWN1cml0eS4gVGhpcyBjaGFuZ2UgaXMgcGFydCBvZiB0aGUgOnBlcDpgNTI0YC4KKworLSBJc3N1ZSAjMjc3Nzg6IEV4cG9zZSB0aGUgTGludXggYGBnZXRyYW5kb20oKWBgIHN5c2NhbGwgYXMgYSBuZXcKKyAgOmZ1bmM6YG9zLmdldHJhbmRvbWAgZnVuY3Rpb24uIFRoaXMgY2hhbmdlIGlzIHBhcnQgb2YgdGhlIDpwZXA6YDUyNGAuCisKIC0gSXNzdWUgIzI3NjkxOiBGaXggc3NsIG1vZHVsZSdzIHBhcnNpbmcgb2YgR0VOX1JJRCBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWUKICAgZmllbGRzIGluIFguNTA5IGNlcnRzLgogCistIElzc3VlICMxODg0NDogQWRkIHJhbmRvbS5jaG9pY2VzKCkuCisKKy0gSXNzdWUgIzI1NzYxOiBJbXByb3ZlZCBlcnJvciByZXBvcnRpbmcgYWJvdXQgdHJ1bmNhdGVkIHBpY2tsZSBkYXRhIGluCisgIEMgaW1wbGVtZW50YXRpb24gb2YgdW5waWNrbGVyLiAgVW5waWNrbGluZ0Vycm9yIGlzIG5vdyByYWlzZWQgaW5zdGVhZCBvZgorICBBdHRyaWJ1dGVFcnJvciBhbmQgVmFsdWVFcnJvciBpbiBzb21lIGNhc2VzLgorCistIElzc3VlICMyNjc5ODogQWRkIEJMQUtFMiAoYmxha2UyYiBhbmQgYmxha2UycykgdG8gaGFzaGxpYi4KKworLSBJc3N1ZSAjMjYwMzI6IE9wdGltaXplZCBnbG9iYmluZyBpbiBwYXRobGliIGJ5IHVzaW5nIG9zLnNjYW5kaXIoKTsgaXQgaXMgbm93CisgIGFib3V0IDEuNS0tNCB0aW1lcyBmYXN0ZXIuCisKKy0gSXNzdWUgIzI1NTk2OiBPcHRpbWl6ZWQgZ2xvYigpIGFuZCBpZ2xvYigpIGZ1bmN0aW9ucyBpbiB0aGUKKyAgZ2xvYiBtb2R1bGU7IHRoZXkgYXJlIG5vdyBhYm91dCAzLS02IHRpbWVzIGZhc3Rlci4KKworLSBJc3N1ZSAjMjc5Mjg6IEFkZCBzY3J5cHQgKHBhc3N3b3JkLWJhc2VkIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uKSB0bworICBoYXNobGliIG1vZHVsZSAocmVxdWlyZXMgT3BlblNTTCAxLjEuMCkuCisKIC0gSXNzdWUgIzI3ODUwOiBSZW1vdmUgM0RFUyBmcm9tIHNzbCBtb2R1bGUncyBkZWZhdWx0IGNpcGhlciBsaXN0IHRvIGNvdW50ZXIKICAgbWVhc3VyZSBzd2VldDMyIGF0dGFjayAoQ1ZFLTIwMTYtMjE4MykuCiAKIC0gSXNzdWUgIzI3NzY2OiBBZGQgQ2hhQ2hhMjAgUG9seTEzMDUgdG8gc3NsIG1vZHVsZSdzIGRlZmF1bHQgY2lwZXIgbGlzdC4KICAgKFJlcXVpcmVkIE9wZW5TU0wgMS4xLjAgb3IgTGlicmVTU0wpLgogCistIElzc3VlICMyNTM4NzogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIHdpbnNvdW5kLk1lc3NhZ2VCZWVwLgorCistIElzc3VlICMyNzg2NjogQWRkIFNTTENvbnRleHQuZ2V0X2NpcGhlcnMoKSBtZXRob2QgdG8gZ2V0IGEgbGlzdCBvZiBhbGwKKyAgZW5hYmxlZCBjaXBoZXJzLgorCistIElzc3VlICMyNzc0NDogQWRkIEFGX0FMRyAoTGludXggS2VybmVsIGNyeXB0bykgdG8gc29ja2V0IG1vZHVsZS4KKwogLSBJc3N1ZSAjMjY0NzA6IFBvcnQgc3NsIGFuZCBoYXNobGliIG1vZHVsZSB0byBPcGVuU1NMIDEuMS4wLgogCistIElzc3VlICMxMTYyMDogRml4IHN1cHBvcnQgZm9yIFNORF9NRU1PUlkgaW4gd2luc291bmQuUGxheVNvdW5kLiAgQmFzZWQgb24gYQorICBwYXRjaCBieSBUaW0gTGVzaGVyLgorCistIElzc3VlICMxMTczNDogQWRkIHN1cHBvcnQgZm9yIElFRUUgNzU0IGhhbGYtcHJlY2lzaW9uIGZsb2F0cyB0byB0aGUKKyAgc3RydWN0IG1vZHVsZS4gQmFzZWQgb24gYSBwYXRjaCBieSBFbGkgU3RldmVucy4KKworLSBJc3N1ZSAjMjc5MTk6IERlcHJlY2F0ZWQgYGBleHRyYV9wYXRoYGAgZGlzdHJpYnV0aW9uIG9wdGlvbiBpbiBkaXN0dXRpbHMKKyAgcGFja2FnaW5nLgorCistIElzc3VlICMyMzIyOTogQWRkIG5ldyBgYGNtYXRoYGAgY29uc3RhbnRzOiBgYGNtYXRoLmluZmBgIGFuZCBgYGNtYXRoLm5hbmBgIHRvCisgIG1hdGNoIGBgbWF0aC5pbmZgYCBhbmQgYGBtYXRoLm5hbmBgLCBhbmQgYWxzbyBgYGNtYXRoLmluZmpgYCBhbmQKKyAgYGBjbWF0aC5uYW5qYGAgdG8gbWF0Y2ggdGhlIGZvcm1hdCB1c2VkIGJ5IGNvbXBsZXggcmVwci4KKworLSBJc3N1ZSAjMjc4NDI6IFRoZSBjc3YuRGljdFJlYWRlciBub3cgcmV0dXJucyByb3dzIG9mIHR5cGUgT3JkZXJlZERpY3QuCisgIChDb250cmlidXRlZCBieSBTdGV2ZSBIb2xkZW4uKQorCiAtIFJlbW92ZSBzdXBwb3J0IGZvciBwYXNzaW5nIGEgZmlsZSBkZXNjcmlwdG9yIHRvIG9zLmFjY2Vzcy4gSXQgbmV2ZXIgd29ya2VkIGJ1dAogICBwcmV2aW91c2x5IGRpZG4ndCByYWlzZS4KIApAQCAtMTE1LDI1ICsyMzcsMjI1IEBACiAtIElzc3VlICMxMDUxMzogRml4IGEgcmVncmVzc2lvbiBpbiBDb25uZWN0aW9uLmNvbW1pdCgpLiAgU3RhdGVtZW50cyBzaG91bGQKICAgbm90IGJlIHJlc2V0IGFmdGVyIGEgY29tbWl0LgogCistIElzc3VlICMxMjMxOTogQ2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBzdXBwb3J0IGFkZGVkIHRvCisgIGh0dHAuY2xpZW50LkhUVFBDb25uZWN0aW9uIHJlcXVlc3RzLiAgVGhlCisgIHVybGxpYi5yZXF1ZXN0LkFic3RyYWN0SFRUUEhhbmRsZXIgY2xhc3MgZG9lcyBub3QgZW5mb3JjZSBhIENvbnRlbnQtTGVuZ3RoCisgIGhlYWRlciBhbnkgbW9yZS4gIElmIGEgSFRUUCByZXF1ZXN0IGhhcyBhIGZpbGUgb3IgaXRlcmFibGUgYm9keSwgYnV0IG5vCisgIENvbnRlbnQtTGVuZ3RoIGhlYWRlciwgdGhlIGxpYnJhcnkgbm93IGZhbGxzIGJhY2sgdG8gdXNlIGNodW5rZWQgdHJhbnNmZXItCisgIGVuY29kaW5nLgorCiAtIEEgbmV3IHZlcnNpb24gb2YgdHlwaW5nLnB5IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3B5dGhvbi90eXBpbmc6CiAgIC0gQ29sbGVjdGlvbiAob25seSBmb3IgMy42KSAoSXNzdWUgIzI3NTk4KQogICAtIEFkZCBGcm96ZW5TZXQgdG8gX19hbGxfXyAodXBzdHJlYW0gIzI2MSkKICAgLSBmaXggY3Jhc2ggaW4gX2dldF90eXBlX3ZhcnMoKSAodXBzdHJlYW0gIzI1OSkKICAgLSBSZW1vdmUgdGhlIGRpY3QgY29uc3RyYWludCBpbiBGb3J3YXJkUmVmLl9ldmFsX3R5cGUgKHVwc3RyZWFtICMyNTIpCiAKKy0gSXNzdWUgIzI3ODMyOiBNYWtlIGBgX25vcm1hbGl6ZWBgIHBhcmFtZXRlciB0byBgYEZyYWN0aW9uYGAgY29uc3R1Y3RvcgorICBrZXl3b3JkLW9ubHksIHNvIHRoYXQgYGBGcmFjdGlvbigyLCAzLCA0KWBgIG5vdyByYWlzZXMgYGBUeXBlRXJyb3JgYC4KKwogLSBJc3N1ZSAjMjc1Mzk6IEZpeCB1bm5vcm1hbGlzZWQgYGBGcmFjdGlvbi5fX3Bvd19fYGAgcmVzdWx0IGluIHRoZSBjYXNlCiAgIG9mIG5lZ2F0aXZlIGV4cG9uZW50IGFuZCBuZWdhdGl2ZSBiYXNlLgogCiAtIElzc3VlICMyMTcxODogY3Vyc29yLmRlc2NyaXB0aW9uIGlzIG5vdyBhdmFpbGFibGUgZm9yIHF1ZXJpZXMgdXNpbmcgQ1RFcy4KIAorLSBJc3N1ZSAjMjc4MTk6IEluIGRpc3R1dGlscyBzZGlzdHMsIHNpbXBseSBwcm9kdWNlIHRoZSAiZ3p0YXIiIChnemlwcGVkIHRhcgorICBmb3JtYXQpIGRpc3RyaWJ1dGlvbnMgb24gYWxsIHBsYXRmb3JtcyB1bmxlc3MgImZvcm1hdHMiIGlzIHN1cHBsaWVkLgorCiAtIElzc3VlICMyNDY2OiBwb3NpeHBhdGguaXNtb3VudCBub3cgY29ycmVjdGx5IHJlY29nbml6ZXMgbW91bnQgcG9pbnRzIHdoaWNoCiAgIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MuCiAKKy0gSXNzdWUgIzk5OTg6IE9uIExpbnV4LCBjdHlwZXMudXRpbC5maW5kX2xpYnJhcnkgbm93IGxvb2tzIGluIExEX0xJQlJBUllfUEFUSAorICBmb3Igc2hhcmVkIGxpYnJhcmllcy4KKworLSBJc3N1ZSAjMjc1NzM6IGV4aXQgbWVzc2FnZSBmb3IgY29kZS5pbnRlcmFjdCBpcyBub3cgY29uZmlndXJhYmxlLgorCistIElzc3VlICMyNzkzMDogSW1wcm92ZWQgYmVoYXZpb3VyIG9mIGxvZ2dpbmcuaGFuZGxlcnMuUXVldWVMaXN0ZW5lci4KKyAgVGhhbmtzIHRvIFBhdWxvIEFuZHJhZGUgYW5kIFBldHIgVmlrdG9yaW4gZm9yIHRoZSBhbmFseXNpcyBhbmQgcGF0Y2guCisKKy0gSXNzdWUgIzY3NjY6IERpc3RyaWJ1dGVkIHJlZmVyZW5jZSBjb3VudGluZyBhZGRlZCB0byBtdWx0aXByb2Nlc3NpbmcKKyAgdG8gc3VwcG9ydCBuZXN0aW5nIG9mIHNoYXJlZCB2YWx1ZXMgLyBwcm94eSBvYmplY3RzLgorCistIElzc3VlICMyMTIwMTogSW1wcm92ZXMgcmVhZGFiaWxpdHkgb2YgbXVsdGlwcm9jZXNzaW5nIGVycm9yIG1lc3NhZ2UuICBUaGFua3MKKyAgdG8gV29qY2llY2ggV2FsY3phayBmb3IgcGF0Y2guCisKK0MgQVBJCistLS0tLQorCistIElzc3VlICMyNjAyNzogQWRkIHN1cHBvcnQgZm9yIHBhdGgtbGlrZSBvYmplY3RzIGluIFB5VW5pY29kZV9GU0NvbnZlcnRlcigpICYKKyAgUHlVbmljb2RlX0ZTRGVjb2RlcigpLgorCitUZXN0cworLS0tLS0KKworLSBJc3N1ZSAjMjc0Mjc6IEFkZGl0aW9uYWwgdGVzdHMgZm9yIHRoZSBtYXRoIG1vZHVsZS4gUGF0Y2ggYnkgRnJhbmNpc2NvIENvdXpvLgorCistIElzc3VlICMyNzk1MzogU2tpcCBtYXRoIGFuZCBjbWF0aCB0ZXN0cyB0aGF0IGZhaWwgb24gT1MgWCAxMC40IGR1ZSB0byBhCisgIHBvb3IgbGlibSBpbXBsZW1lbnRhdGlvbiBvZiB0YW4uCisKKy0gSXNzdWUgIzI2MDQwOiBJbXByb3ZlIHRlc3RfbWF0aCBhbmQgdGVzdF9jbWF0aCBjb3ZlcmFnZSBhbmQgcmlnb3VyLiBQYXRjaCBieQorICBKZWZmIEFsbGVuLgorCistIElzc3VlICMyNzc4NzogQ2FsbCBnYy5jb2xsZWN0KCkgYmVmb3JlIGNoZWNraW5nIGVhY2ggdGVzdCBmb3IgImRhbmdsaW5nCisgIHRocmVhZHMiLCBzaW5jZSB0aGUgZGFuZ2xpbmcgdGhyZWFkcyBhcmUgd2VhayByZWZlcmVuY2VzLgorCitCdWlsZAorLS0tLS0KKworLSBJc3N1ZSAjMjc5ODM6IENhdXNlIGxhY2sgb2YgbGx2bS1wcm9mZGF0YSB0b29sIHdoZW4gdXNpbmcgY2xhbmcgYXMKKyAgcmVxdWlyZWQgZm9yIFBHTyBsaW5raW5nIHRvIGJlIGEgY29uZmlndXJlIHRpbWUgZXJyb3IgcmF0aGVyIHRoYW4KKyAgbWFrZSB0aW1lIHdoZW4gLS13aXRoLW9wdGltaXphdGlvbnMgaXMgZW5hYmxlZC4gIEFsc28gaW1wcm92ZSBvdXIKKyAgYWJpbGl0eSB0byBmaW5kIHRoZSBsbHZtLXByb2ZkYXRhIHRvb2wgb24gTWFjT1MgYW5kIHNvbWUgTGludXhlcy4KKworLSBJc3N1ZSAjMjYzMDc6IFRoZSBwcm9maWxlLW9wdCBidWlsZCBub3cgYXBwbHlzIFBHTyB0byB0aGUgYnVpbHQtaW4gbW9kdWxlcy4KKworLSBJc3N1ZSAjMjY1Mzk6IEFkZCB0aGUgLS13aXRoLW9wdGltaXphdGlvbnMgZmxhZyB0byB0dXJuIG9uIExUTyBhbmQgUEdPIGJ1aWxkCisgIHN1cHBvcnQgd2hlbiBhdmFpbGFibGUuCisKKy0gSXNzdWUgIzI3OTE3OiBTZXQgcGxhdGZvcm0gdHJpcGxldHMgZm9yIEFuZHJvaWQgYnVpbGRzLgorCistIElzc3VlICMyNTgyNTogVXBkYXRlIHJlZmVyZW5jZXMgdG8gdGhlICQoTElCUEwpIGluc3RhbGxhdGlvbiBwYXRoIG9uIEFJWC4KKyAgVGhpcyBwYXRoIHdhcyBjaGFuZ2VkIGluIDMuMmE0LgorCistIFVwZGF0ZSBPUyBYIGluc3RhbGxlciB0byB1c2UgU1FMaXRlIDMuMTQuMSBhbmQgWFogNS4yLjIuCisKKy0gSXNzdWUgIzIxMTIyOiBGaXggTFRPIGJ1aWxkcyBvbiBPUyBYLgorCitXaW5kb3dzCistLS0tLS0tCisKKy0gSXNzdWUgIzE2MDI6IFdpbmRvd3MgY29uc29sZSBkb2Vzbid0IGlucHV0IG9yIHByaW50IFVuaWNvZGUgKFBFUCA1MjgpCisKKy0gSXNzdWUgIzI3NzgxOiBDaGFuZ2UgZmlsZSBzeXN0ZW0gZW5jb2Rpbmcgb24gV2luZG93cyB0byBVVEYtOCAoUEVQIDUyOSkKKworLSBJc3N1ZSAjMjc3MzE6IE9wdC1vdXQgb2YgTUFYX1BBVEggb24gV2luZG93cyAxMAorCistIElzc3VlICM2MTM1OiBBZGRzIGVuY29kaW5nIGFuZCBlcnJvcnMgcGFyYW1ldGVycyB0byBzdWJwcm9jZXNzLgorCistIElzc3VlICMyNzk1OTogQWRkcyBvZW0gZW5jb2RpbmcsIGFsaWFzIGFuc2kgdG8gbWJjcywgbW92ZSBhbGlhc21iY3MgdG8KKyAgY29kZWMgbG9va3VwLgorCistIElzc3VlICMyNzk4MjogVGhlIGZ1bmN0aW9ucyBvZiB0aGUgd2luc291bmQgbW9kdWxlIG5vdyBhY2NlcHQga2V5d29yZAorICBhcmd1bWVudHMuCisKKy0gSXNzdWUgIzIwMzY2OiBCdWlsZCBmdWxsIHRleHQgc2VhcmNoIHN1cHBvcnQgaW50byBTUUxpdGUgb24gV2luZG93cy4KKworLSBJc3N1ZSAjMjc3NTY6IEFkZHMgbmV3IGljb25zIGZvciBQeXRob24gZmlsZXMgYW5kIHByb2Nlc3NlcyBvbiBXaW5kb3dzLgorICBEZXNpZ25zIGJ5IENoZXJyeSBXYW5nLgorCistIElzc3VlICMyNzg4MzogVXBkYXRlIHNxbGl0ZSB0byAzLjE0LjEuMCBvbiBXaW5kb3dzLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDMuNi4wIGFscGhhIDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjAxNi0wOC0xNSoKKworQ29yZSBhbmQgQnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gSXNzdWUgIzI3NzA0OiBPcHRpbWl6ZWQgY3JlYXRpbmcgYnl0ZXMgYW5kIGJ5dGVhcnJheSBmcm9tIGJ5dGUtbGlrZSBvYmplY3RzCisgIGFuZCBpdGVyYWJsZXMuICBTcGVlZCB1cCB0byAzIHRpbWVzIGZvciBzaG9ydCBvYmplY3RzLiAgT3JpZ2luYWwgcGF0Y2ggYnkKKyAgTmFva2kgSW5hZGEuCisKKy0gSXNzdWUgIzI2ODIzOiBMYXJnZSBzZWN0aW9ucyBvZiByZXBlYXRlZCBsaW5lcyBpbiB0cmFjZWJhY2tzIGFyZSBub3cKKyAgYWJicmV2aWF0ZWQgYXMgIltQcmV2aW91cyBsaW5lIHJlcGVhdGVkIHtjb3VudH0gbW9yZSB0aW1lc10iIGJ5IHRoZSBidWlsdGluCisgIHRyYWNlYmFjayByZW5kZXJpbmcuIFBhdGNoIGJ5IEVtYW51ZWwgQmFycnkuCisKKy0gSXNzdWUgIzI3NTc0OiBEZWNyZWFzZWQgYW4gb3ZlcmhlYWQgb2YgcGFyc2luZyBrZXl3b3JkIGFyZ3VtZW50cyBpbiBmdW5jdGlvbnMKKyAgaW1wbGVtZW50ZWQgd2l0aCB1c2luZyBBcmd1bWVudCBDbGluaWMuCisKKy0gSXNzdWUgIzIyNTU3OiBOb3cgaW1wb3J0aW5nIGFscmVhZHkgaW1wb3J0ZWQgbW9kdWxlcyBpcyB1cCB0byAyLjUgdGltZXMKKyAgZmFzdGVyLgorCistIElzc3VlICMxNzU5NjogSW5jbHVkZSA8d2luY3J5cHQuaD4gdG8gaGVscCB3aXRoIE1pbiBHVyBidWlsZGluZy4KKworLSBJc3N1ZSAjMTc1OTk6IE9uIFdpbmRvd3MsIHJlbmFtZSB0aGUgcHJpdmF0ZWx5IGRlZmluZWQgUkVQQVJTRV9EQVRBX0JVRkZFUgorICBzdHJ1Y3R1cmUgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgZGVmaW5pdGlvbiBmcm9tIE1pbiBHVy4KKworLSBJc3N1ZSAjMjc1MDc6IEFkZCBpbnRlZ2VyIG92ZXJmbG93IGNoZWNrIGluIGJ5dGVhcnJheS5leHRlbmQoKS4gIFBhdGNoIGJ5CisgIFhpYW5nIFpoYW5nLgorCistIElzc3VlICMyNzU4MTogRG9uJ3QgcmVseSBvbiB3cmFwcGluZyBmb3Igb3ZlcmZsb3cgY2hlY2sgaW4KKyAgUHlTZXF1ZW5jZV9UdXBsZSgpLiAgUGF0Y2ggYnkgWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzE2MjE6IEF2b2lkIHNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGluIGxpc3QgYW5kIHR1cGxlIG9wZXJhdGlvbnMuCisgIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgorCistIElzc3VlICMyNzQxOTogU3RhbmRhcmQgX19pbXBvcnRfXygpIG5vIGxvbmdlciBsb29rIHVwICJfX2ltcG9ydF9fIiBpbiBnbG9iYWxzCisgIG9yIGJ1aWx0aW5zIGZvciBpbXBvcnRpbmcgc3VibW9kdWxlcyBvciAiZnJvbSBpbXBvcnQiLiAgRml4ZWQgYSBjcmFzaCBpZgorICByYWlzZSBhIHdhcm5pbmcgYWJvdXQgdW5hYmxpbmcgdG8gcmVzb2x2ZSBwYWNrYWdlIGZyb20gX19zcGVjX18gb3IKKyAgX19wYWNrYWdlX18uCisKKy0gSXNzdWUgIzI3MDgzOiBSZXNwZWN0IHRoZSBQWVRIT05DQVNFT0sgZW52aXJvbm1lbnQgdmFyaWFibGUgdW5kZXIgV2luZG93cy4KKworLSBJc3N1ZSAjMjc1MTQ6IE1ha2UgaGF2aW5nIHRvbyBtYW55IHN0YXRpY2FsbHkgbmVzdGVkIGJsb2NrcyBhIFN5bnRheEVycm9yCisgIGluc3RlYWQgb2YgU3lzdGVtRXJyb3IuCisKKy0gSXNzdWUgIzI3MzY2OiBJbXBsZW1lbnRlZCBQRVAgNDg3IChTaW1wbGVyIGN1c3RvbWl6YXRpb24gb2YgY2xhc3MgY3JlYXRpb24pLgorICBVcG9uIHN1YmNsYXNzaW5nLCB0aGUgX19pbml0X3N1YmNsYXNzX18gY2xhc3NtZXRob2QgaXMgY2FsbGVkIG9uIHRoZSBiYXNlCisgIGNsYXNzLiBEZXNjcmlwdG9ycyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCBfX3NldF9uYW1lX18gYWZ0ZXIgY2xhc3MgY3JlYXRpb24uCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjYwMjcsICMyNzUyNDogQWRkIFBFUCA1MTkvX19mc3BhdGhfXygpIHN1cHBvcnQgdG8gdGhlIG9zIGFuZCBvcy5wYXRoCisgIG1vZHVsZXMuIEluY2x1ZGVzIGNvZGUgZnJvbSBKZWxsZSBaaWpsc3RyYS4KKworLSBJc3N1ZSAjMjc1OTg6IEFkZCBDb2xsZWN0aW9ucyB0byBjb2xsZWN0aW9ucy5hYmMuCisgIFBhdGNoIGJ5IEl2YW4gTGV2a2l2c2t5aSwgZG9jcyBieSBOZWlsIEdpcmRoYXIuCisKKy0gSXNzdWUgIzI1OTU4OiBTdXBwb3J0ICJhbnRpLXJlZ2lzdHJhdGlvbiIgb2Ygc3BlY2lhbCBtZXRob2RzIGZyb20KKyAgdmFyaW91cyBBQkNzLCBsaWtlIF9faGFzaF9fLCBfX2l0ZXJfXyBvciBfX2xlbl9fLiAgQWxsIHRoZXNlIChhbmQKKyAgc2V2ZXJhbCBtb3JlKSBjYW4gYmUgc2V0IHRvIE5vbmUgaW4gYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgYW5kIHRoZQorICBiZWhhdmlvciB3aWxsIGJlIGFzIGlmIHRoZSBtZXRob2QgaXMgbm90IGRlZmluZWQgYXQgYWxsLgorICAoUHJldmlvdXNseSwgdGhpcyBtZWNoYW5pc20gZXhpc3RlZCBvbmx5IGZvciBfX2hhc2hfXywgdG8gbWFrZQorICBtdXRhYmxlIGNsYXNzZXMgdW5oYXNoYWJsZS4pICBDb2RlIGNvbnRyaWJ1dGVkIGJ5IEFuZHJldyBCYXJuZXJ0IGFuZAorICBJdmFuIExldmtpdnNreWkuCisKKy0gSXNzdWUgIzE2NzY0OiBTdXBwb3J0IGtleXdvcmQgYXJndW1lbnRzIHRvIHpsaWIuZGVjb21wcmVzcygpLiAgUGF0Y2ggYnkKKyAgWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzI3NzM2OiBQcmV2ZW50IHNlZ2ZhdWx0IGFmdGVyIGludGVycHJldGVyIHJlLWluaXRpYWxpemF0aW9uIGR1ZQorICB0byByZWYgY291bnQgcHJvYmxlbSBpbnRyb2R1Y2VkIGluIGNvZGUgZm9yIElzc3VlICMyNzAzOCBpbiAzLjYuMGEzLgorICBQYXRjaCBieSBYaWFuZyBaaGFuZy4KKworLSBJc3N1ZSAjMjU2Mjg6ICBUaGUgKnZlcmJvc2UqIGFuZCAqcmVuYW1lKiBwYXJhbWV0ZXJzIGZvcgorICBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlIGFyZSBub3cga2V5d29yZC1vbmx5LgorCistIElzc3VlICMxMjM0NTogQWRkIG1hdGhlbWF0aWNhbCBjb25zdGFudCB0YXUgdG8gbWF0aCBhbmQgY21hdGguIFNlZSBhbHNvCisgIFBFUCA2MjguCisKKy0gSXNzdWUgIzI2ODIzOiB0cmFjZWJhY2suU3RhY2tTdW1tYXJ5LmZvcm1hdCBub3cgYWJicmV2aWF0ZXMgbGFyZ2Ugc2VjdGlvbnMgb2YKKyAgcmVwZWF0ZWQgbGluZXMgYXMgIltQcmV2aW91cyBsaW5lIHJlcGVhdGVkIHtjb3VudH0gbW9yZSB0aW1lc10iICh0aGlzIGNoYW5nZQorICB0aGVuIGZ1cnRoZXIgYWZmZWN0cyBvdGhlciB0cmFjZWJhY2sgZGlzcGxheSBvcGVyYXRpb25zIGluIHRoZSBtb2R1bGUpLiBQYXRjaAorICBieSBFbWFudWVsIEJhcnJ5LgorCistIElzc3VlICMyNzY2NDogQWRkIHRvIGNvbmN1cnJlbnQuZnV0dXJlcy50aHJlYWQuVGhyZWFkUG9vbEV4ZWN1dG9yKCkKKyAgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBhIHRocmVhZCBuYW1lIHByZWZpeC4KKworLSBJc3N1ZSAjMjcxODE6IEFkZCBnZW9tZXRyaWNfbWVhbiBhbmQgaGFybW9uaWNfbWVhbiB0byBzdGF0aXN0aWNzIG1vZHVsZS4KKworLSBJc3N1ZSAjMjc1NzM6IGNvZGUuaW50ZXJhY3Qgbm93IHByaW50cyBhbiBtZXNzYWdlIHdoZW4gZXhpdGluZy4KKworLSBJc3N1ZSAjNjQyMjogQWRkIGF1dG9yYW5nZSBtZXRob2QgdG8gdGltZWl0LlRpbWVyIG9iamVjdHMuCisKIC0gSXNzdWUgIzI3NzczOiBDb3JyZWN0IHNvbWUgbWVtb3J5IG1hbmFnZW1lbnQgZXJyb3JzIHNlcnZlcl9ob3N0bmFtZSBpbgogICBfc3NsLndyYXBfc29ja2V0KCkuCiAKIC0gSXNzdWUgIzI2NzUwOiB1bml0dGVzdC5tb2NrLmNyZWF0ZV9hdXRvc3BlYygpIG5vdyB3b3JrcyBwcm9wZXJseSBmb3IKLSAgc3ViY2xhc3NlcyBvZiBwcm9wZXJ0eSgpIGFuZCBvdGhlciBkYXRhIGRlc2NyaXB0b3JzLgorICBzdWJjbGFzc2VzIG9mIHByb3BlcnR5KCkgYW5kIG90aGVyIGRhdGEgZGVzY3JpcHRvcnMuICBSZW1vdmVzIHRoZSBuZXZlcgorICBwdWJsaWNseSB1c2VkLCBuZXZlciBkb2N1bWVudGVkIHVuaXR0ZXN0Lm1vY2suRGVzY3JpcHRvclR5cGVzIHR1cGxlLgorCistIElzc3VlICMyNjc1NDogVW5kb2N1bWVudGVkIHN1cHBvcnQgb2YgZ2VuZXJhbCBieXRlcy1saWtlIG9iamVjdHMKKyAgYXMgcGF0aCBpbiBjb21waWxlKCkgYW5kIHNpbWlsYXIgZnVuY3Rpb25zIGlzIG5vdyBkZXByZWNhdGVkLgorCistIElzc3VlICMyNjgwMDogVW5kb2N1bWVudGVkIHN1cHBvcnQgb2YgZ2VuZXJhbCBieXRlcy1saWtlIG9iamVjdHMKKyAgYXMgcGF0aHMgaW4gb3MgZnVuY3Rpb25zIGlzIG5vdyBkZXByZWNhdGVkLgorCistIElzc3VlICMyNjk4MTogQWRkIF9vcmRlcl8gY29tcGF0aWJpbGl0eSBzaGltIHRvIGVudW0uRW51bSBmb3IKKyAgUHl0aG9uIDIvMyBjb2RlIGJhc2VzLgorCistIElzc3VlICMyNzY2MTogQWRkZWQgdHppbmZvIGtleXdvcmQgYXJndW1lbnQgdG8gZGF0ZXRpbWUuY29tYmluZS4KIAogLSBJbiB0aGUgY3Vyc2VzIG1vZHVsZSwgcmFpc2UgYW4gZXJyb3IgaWYgd2luZG93LmdldHN0cigpIG9yIHdpbmRvdy5pbnN0cigpIGlzCiAgIHBhc3NlZCBhIG5lZ2F0aXZlIHZhbHVlLgpAQCAtMTUyLDYgKzQ3NCw5IEBACiAgIEhUVFBfUFJPWFkgdmFyaWFibGUgd2hlbiBSRVFVRVNUX01FVEhPRCBlbnZpcm9ubWVudCBpcyBzZXQsIHdoaWNoIGluZGljYXRlcwogICB0aGF0IHRoZSBzY3JpcHQgaXMgaW4gQ0dJIG1vZGUuCiAKKy0gSXNzdWUgIzcwNjM6IFJlbW92ZSBkZWFkIGNvZGUgZnJvbSB0aGUgImFycmF5IiBtb2R1bGUncyBzbGljZSBoYW5kbGluZy4KKyAgUGF0Y2ggYnkgQ2h1Y2suCisKIC0gSXNzdWUgIzI3NjU2OiBEbyBub3QgYXNzdW1lIHNjaGVkLmggZGVmaW5lcyBhbnkgU0NIRURfKiBjb25zdGFudHMuCiAKIC0gSXNzdWUgIzI3MTMwOiBJbiB0aGUgInpsaWIiIG1vZHVsZSwgZml4IGhhbmRsaW5nIG9mIGxhcmdlIGJ1ZmZlcnMKQEAgLTE1OSw2ICs0ODQsMTUgQEAKICAgd2VyZSBsaW1pdGVkIHRvIDQgR2lCLCBhbmQgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb3BlcmF0aW9ucyBkaWQgbm90CiAgIHByb3Blcmx5IGhhbmRsZSByZXN1bHRzIG9mIDQgR2lCLgogCistIElzc3VlICMyNDc3MzogSW1wbGVtZW50ZWQgUEVQIDQ5NSAoTG9jYWwgVGltZSBEaXNhbWJpZ3VhdGlvbikuCisKKy0gRXhwb3NlIHRoZSBFUE9MTEVYQ0xVU0lWRSBjb25zdGFudCAod2hlbiBpdCBpcyBkZWZpbmVkKSBpbiB0aGUgc2VsZWN0IG1vZHVsZS4KKworLSBJc3N1ZSAjMjc1Njc6IEV4cG9zZSB0aGUgRVBPTExSREhVUCBhbmQgUE9MTFJESFVQIGNvbnN0YW50cyBpbiB0aGUgc2VsZWN0CisgIG1vZHVsZS4KKworLSBJc3N1ZSAjMTYyMTogQXZvaWQgc2lnbmVkIGludCBuZWdhdGlvbiBvdmVyZmxvdyBpbiB0aGUgImF1ZGlvb3AiIG1vZHVsZS4KKwogLSBJc3N1ZSAjMjc1MzM6IFJlbGVhc2UgR0lMIGluIG50Ll9pc2RpcgogCiAtIElzc3VlICMxNzcxMTogRml4ZWQgdW5waWNrbGluZyBieSB0aGUgcGVyc2lzdGVudCBJRCB3aXRoIHByb3RvY29sIDAuCkBAIC0xNjYsNiArNTAwLDExMiBAQAogCiAtIElzc3VlICMyNzUyMjogQXZvaWQgYW4gdW5pbnRlbnRpb25hbCByZWZlcmVuY2UgY3ljbGUgaW4gZW1haWwuZmVlZHBhcnNlci4KIAorLSBJc3N1ZSAjMjc1MTI6IEZpeCBhIHNlZ2ZhdWx0IHdoZW4gb3MuZnNwYXRoKCkgY2FsbGVkIGFuIF9fZnNwYXRoX18oKSBtZXRob2QKKyAgdGhhdCByYWlzZWQgYW4gZXhjZXB0aW9uLiBQYXRjaCBieSBYaWFuZyBaaGFuZy4KKworSURMRQorLS0tLQorCistIElzc3VlICMyNzcxNDogdGV4dF90ZXh0dmlldyBhbmQgdGVzdF9hdXRvY29tcGxldGUgbm93IHBhc3Mgd2hlbiByZS1ydW4KKyAgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gIFRoaXMgb2NjdXJzIHdoZW4gdGVzdF9pZGxlIGZhaWxzIHdoZW4gcnVuIHdpdGggdGhlCisgIC13IG9wdGlvbiBidXQgd2l0aG91dCAtam4uICBGaXggd2FybmluZyBmcm9tIHRlc3RfY29uZmlnLgorCistIElzc3VlICMyNzYyMTogUHV0IHF1ZXJ5IHJlc3BvbnNlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgaW4gdGhlIHF1ZXJ5CisgIGJveCBpdHNlbGYgaW5zdGVhZCBvZiBpbiBhIHNlcGFyYXRlIG1hc3NhZ2Vib3guICBSZWRvIHRlc3RzIHRvIG1hdGNoLgorICBBZGQgTWFjIE9TWCByZWZpbmVtZW50cy4gIE9yaWdpbmFsIHBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjc2MjA6IEVzY2FwZSBrZXkgbm93IGNsb3NlcyBRdWVyeSBib3ggYXMgY2FuY2VsbGVkLgorCistIElzc3VlICMyNzYwOTogSURMRTogdGFiIGFmdGVyIGluaXRpYWwgd2hpdGVzcGFjZSBzaG91bGQgdGFiLCBub3QKKyAgYXV0b2NvbXBsZXRlLiBUaGlzIGZpeGVzIHByb2JsZW0gd2l0aCB3cml0aW5nIGRvY3N0cmluZ3MgYXQgbGVhc3QKKyAgdHdpY2UgaW5kZW50ZWQuCisKKy0gSXNzdWUgIzI3NjA5OiBFeHBsaWNpdGx5IHJldHVybiBOb25lIHdoZW4gdGhlcmUgYXJlIGFsc28gbm9uLU5vbmUKKyAgcmV0dXJucy4gSW4gYSBmZXcgY2FzZXMsIHJldmVyc2UgYSBjb25kaXRpb24gYW5kIGVsaW1pbmF0ZSBhIHJldHVybi4KKworLSBJc3N1ZSAjMjU1MDc6IElETEUgbm8gbG9uZ2VyIHJ1bnMgYnVnZ3kgY29kZSBiZWNhdXNlIG9mIGl0cyB0a2ludGVyIGltcG9ydHMuCisgIFVzZXJzIG11c3QgaW5jbHVkZSB0aGUgc2FtZSBpbXBvcnRzIHJlcXVpcmVkIHRvIHJ1biBkaXJlY3RseSBpbiBQeXRob24uCisKKy0gSXNzdWUgIzI3MTczOiBBZGQgJ0lETEUgTW9kZXJuIFVuaXgnIHRvIHRoZSBidWlsdC1pbiBrZXkgc2V0cy4KKyAgTWFrZSB0aGUgZGVmYXVsdCBrZXkgc2V0IGRlcGVuZCBvbiB0aGUgcGxhdGZvcm0uCisgIEFkZCB0ZXN0cyBmb3IgdGhlIGNoYW5nZXMgdG8gdGhlIGNvbmZpZyBtb2R1bGUuCisKKy0gSXNzdWUgIzI3NDUyOiBhZGQgbGluZSBjb3VudGVyIGFuZCBjcmMgdG8gSURMRSBjb25maWdIYW5kbGVyIHRlc3QgZHVtcC4KKworVGVzdHMKKy0tLS0tCisKKy0gSXNzdWUgIzI1ODA1OiBTa2lwIGEgdGVzdCBpbiB0ZXN0X3BrZ3V0aWwgYXMgbmVlZGVkIHRoYXQgZG9lc24ndCB3b3JrIHdoZW4KKyAgYGBfX25hbWVfXyA9PSBfX21haW5fX2BgLiBQYXRjaCBieSBTaWxlbnRHaG9zdC4KKworLSBJc3N1ZSAjMjc0NzI6IEFkZCB0ZXN0LnN1cHBvcnQudW5peF9zaGVsbCBhcyB0aGUgcGF0aCB0byB0aGUgZGVmYXVsdCBzaGVsbC4KKworLSBJc3N1ZSAjMjczNjk6IEluIHRlc3RfcHlleHBhdCwgYXZvaWQgdGVzdGluZyBhbiBlcnJvciBtZXNzYWdlIGRldGFpbCB0aGF0CisgIGNoYW5nZWQgaW4gRXhwYXQgMi4yLjAuCisKKy0gSXNzdWUgIzI3NTk0OiBQcmV2ZW50IGFzc2VydGlvbiBlcnJvciB3aGVuIHJ1bm5pbmcgdGVzdF9hc3Qgd2l0aCBjb3ZlcmFnZQorICBlbmFibGVkOiBlbnN1cmUgY29kZSBvYmplY3QgaGFzIGEgdmFsaWQgZmlyc3QgbGluZSBudW1iZXIuCisgIFBhdGNoIHN1Z2dlc3RlZCBieSBJdmFuIExldmtpdnNreWkuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjc2NDc6IFVwZGF0ZSBidW5kbGVkIFRjbC9UayB0byA4LjYuNi4KKworLSBJc3N1ZSAjMjc2MTA6IEFkZHMgUEVQIDUxNCBtZXRhZGF0YSB0byBXaW5kb3dzIGluc3RhbGxlcgorCistIElzc3VlICMyNzQ2OTogQWRkcyBhIHNoZWxsIGV4dGVuc2lvbiB0byB0aGUgbGF1bmNoZXIgc28gdGhhdCBkcmFnIGFuZCBkcm9wCisgIHdvcmtzIGNvcnJlY3RseS4KKworLSBJc3N1ZSAjMjczMDk6IEVuYWJsZXMgcHJvcGVyIFdpbmRvd3Mgc3R5bGVzIGluIHB5dGhvblt3XS5leGUgbWFuaWZlc3QuCisKK0J1aWxkCistLS0tLQorCistIElzc3VlICMyNzcxMzogU3VwcHJlc3Mgc3B1cmlvdXMgYnVpbGQgd2FybmluZ3Mgd2hlbiB1cGRhdGluZyBpbXBvcnRsaWIncworICBib290c3RyYXAgZmlsZXMuICBQYXRjaCBieSBYaWFuZyBaaGFuZworCistIElzc3VlICMyNTgyNTogQ29ycmVjdCB0aGUgcmVmZXJlbmNlcyB0byBNb2R1bGVzL3B5dGhvbi5leHAsIHdoaWNoIGlzCisgIHJlcXVpcmVkIG9uIEFJWC4gIFRoZSByZWZlcmVuY2VzIHdlcmUgYWNjaWRlbnRhbGx5IGNoYW5nZWQgaW4gMy41LjBhMS4KKworLSBJc3N1ZSAjMjc0NTM6IENQUCBpbnZvY2F0aW9uIGluIGNvbmZpZ3VyZSBtdXN0IHVzZSBDUFBGTEFHUy4gUGF0Y2ggYnkKKyAgQ2hpIEhzdWFuIFllbi4KKworLSBJc3N1ZSAjMjc2NDE6IFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBpbnNlcnRzIGNvbW1lbnRzIGludG8gdGhlIG1ha2VmaWxlCisgIHRvIHByZXZlbnQgdGhlIHBnZW4gYW5kIF9mcmVlemVfaW1wb3J0bGliIGV4ZWN1dGFibGVzIGZyb20gYmVpbmcgY3Jvc3MtCisgIGNvbXBpbGVkLgorCistIElzc3VlICMyNjY2MjogU2V0IFBZVEhPTl9GT1JfR0VOIGluIGNvbmZpZ3VyZSBhcyB0aGUgUHl0aG9uIHByb2dyYW0gdG8gYmUKKyAgdXNlZCBmb3IgZmlsZSBnZW5lcmF0aW9uIGR1cmluZyB0aGUgYnVpbGQuCisKKy0gSXNzdWUgIzEwOTEwOiBBdm9pZCBDKysgY29tcGlsYXRpb24gZXJyb3JzIG9uIEZyZWVCU0QgYW5kIE9TIFguCisgIEFsc28gdXBkYXRlIEZyZWVkQlNEIHZlcnNpb24gY2hlY2tzIGZvciB0aGUgb3JpZ2luYWwgY3R5cGUgVVRGLTggd29ya2Fyb3VuZC4KKworV2hhdCdzIE5ldyBpbiBQeXRob24gMy42LjAgYWxwaGEgMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyMDE2LTA3LTExKgorCitDb3JlIGFuZCBCdWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMjc0NzM6IEZpeGVkIHBvc3NpYmxlIGludGVnZXIgb3ZlcmZsb3cgaW4gYnl0ZXMgYW5kIGJ5dGVhcnJheQorICBjb25jYXRlbmF0aW9ucy4gIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgorCistIElzc3VlICMyMzAzNDogVGhlIG91dHB1dCBvZiBhIHNwZWNpYWwgUHl0aG9uIGJ1aWxkIHdpdGggZGVmaW5lZCBDT1VOVF9BTExPQ1MsCisgIFNIT1dfQUxMT0NfQ09VTlQgb3IgU0hPV19UUkFDS19DT1VOVCBtYWNyb3MgaXMgbm93IG9mZiBieSAgZGVmYXVsdC4gIEl0IGNhbgorICBiZSByZS1lbmFibGVkIHVzaW5nIHRoZSAiLVggc2hvd2FsbG9jY291bnQiIG9wdGlvbi4gIEl0IG5vdyBvdXRwdXRzIHRvIHN0ZGVycgorICBpbnN0ZWFkIG9mIHN0ZG91dC4KKworLSBJc3N1ZSAjMjc0NDM6IF9fbGVuZ3RoX2hpbnRfXygpIG9mIGJ5dGVhcnJheSBpdGVyYXRvcnMgbm8gbG9uZ2VyIHJldHVybiBhCisgIG5lZ2F0aXZlIGludGVnZXIgZm9yIGEgcmVzaXplZCBieXRlYXJyYXkuCisKKy0gSXNzdWUgIzI3MDA3OiBUaGUgZnJvbWhleCgpIGNsYXNzIG1ldGhvZHMgb2YgYnl0ZXMgYW5kIGJ5dGVhcnJheSBzdWJjbGFzc2VzCisgIG5vdyByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgY29ycmVzcG9uZGluZyBzdWJjbGFzcy4KKworTGlicmFyeQorLS0tLS0tLQorCiAtIElzc3VlICMyNjg0NDogRml4IGVycm9yIG1lc3NhZ2UgZm9yIGltcC5maW5kX21vZHVsZSgpIHRvIHJlZmVyIHRvICdwYXRoJwogICBpbnN0ZWFkIG9mICduYW1lJy4gUGF0Y2ggYnkgTGV2IE1heGltb3YuCiAKQEAgLTE3NiwyMiArNjE2LDU0IEBACiAgIGNvbmZpcm1pbmcgdGhlIG5ldHNjYXBlIGNvb2tpZSBmb3JtYXQgYW5kIG1ha2luZyBpdCBjb25zaXN0ZW50IHdpdGgKICAgZG9jdW1lbnRhdGlvbi4KIAotLSBJc3N1ZSAjMjY2NjQ6IEZpeCBhY3RpdmF0ZS5maXNoIGJ5IHJlbW92aW5nIG1pcy11c2Ugb2YgYGAkYGAuCistIElzc3VlICMyMTcwODogRGVwcmVjYXRlZCBkYm0uZHVtYiBiZWhhdmlvciB0aGF0IGRpZmZlcnMgZnJvbSBjb21tb24gZGJtCisgIGJlaGF2aW9yOiBjcmVhdGluZyBhIGRhdGFiYXNlIGluICdyJyBhbmQgJ3cnIG1vZGVzIGFuZCBtb2RpZnlpbmcgYSBkYXRhYmFzZQorICBpbiAncicgbW9kZS4KIAotLSBJc3N1ZSAjMjIxMTU6IEZpeGVkIHRyYWNpbmcgVGtpbnRlciB2YXJpYWJsZXM6IHRyYWNlX3ZkZWxldGUoKSB3aXRoIHdyb25nCi0gIG1vZGUgbm8gbG9uZ2VyIGJyZWFrIHRyYWNpbmcsIHRyYWNlX3ZpbmZvKCkgbm93IGFsd2F5cyByZXR1cm5zIGEgbGlzdCBvZgotICBwYWlycyBvZiBzdHJpbmdzLCB0cmFjaW5nIGluIHRoZSAidSIgbW9kZSBub3cgd29ya3MuCistIElzc3VlICMyNjcyMTogQ2hhbmdlIHRoZSBzb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIud2ZpbGUgYXR0cmlidXRlCisgIHRvIGltcGxlbWVudCBCdWZmZXJlZElPQmFzZS4gSW4gcGFydGljdWxhciwgdGhlIHdyaXRlKCkgbWV0aG9kIG5vIGxvbmdlcgorICBkb2VzIHBhcnRpYWwgd3JpdGVzLgogCi0tIEZpeCBhIHNjb3BpbmcgaXNzdWUgaW4gaW1wb3J0bGliLnV0aWwuTGF6eUxvYWRlciB3aGljaCB0cmlnZ2VyZWQgYW4KLSAgVW5ib3VuZExvY2FsRXJyb3Igd2hlbiBsYXp5LWxvYWRpbmcgYSBtb2R1bGUgdGhhdCB3YXMgYWxyZWFkeSBwdXQgaW50bwotICBzeXMubW9kdWxlcy4KKy0gSXNzdWUgIzIyMTE1OiBBZGRlZCBtZXRob2RzIHRyYWNlX2FkZCwgdHJhY2VfcmVtb3ZlIGFuZCB0cmFjZV9pbmZvIGluIHRoZQorICB0a2ludGVyLlZhcmlhYmxlIGNsYXNzLiAgVGhleSByZXBsYWNlIG9sZCBtZXRob2RzIHRyYWNlX3ZhcmlhYmxlLCB0cmFjZSwKKyAgdHJhY2VfdmRlbGV0ZSBhbmQgdHJhY2VfdmluZm8gdGhhdCB1c2Ugb2Jzb2xldGUgVGNsIGNvbW1hbmRzIGFuZCBtaWdodAorICBub3Qgd29yayBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgVGNsLiAgRml4ZWQgb2xkIHRyYWNpbmcgbWV0aG9kczoKKyAgdHJhY2VfdmRlbGV0ZSgpIHdpdGggd3JvbmcgbW9kZSBubyBsb25nZXIgYnJlYWsgdHJhY2luZywgdHJhY2VfdmluZm8oKSBub3cKKyAgYWx3YXlzIHJldHVybnMgYSBsaXN0IG9mIHBhaXJzIG9mIHN0cmluZ3MsIHRyYWNpbmcgaW4gdGhlICJ1IiBtb2RlIG5vdyB3b3Jrcy4KKworLSBJc3N1ZSAjMjYyNDM6IE9ubHkgdGhlIGxldmVsIGFyZ3VtZW50IHRvIHpsaWIuY29tcHJlc3MoKSBpcyBrZXl3b3JkIGFyZ3VtZW50CisgIG5vdy4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBwb3NpdGlvbmFsLW9ubHkuCisKKy0gSXNzdWUgIzI3MDM4OiBFeHBvc2UgdGhlIERpckVudHJ5IHR5cGUgYXMgb3MuRGlyRW50cnkuIENvZGUgcGF0Y2ggYnkKKyAgSmVsbGUgWmlqbHN0cmEuCisKKy0gSXNzdWUgIzI3MTg2OiBVcGRhdGUgb3MuZnNwYXRoKCkvUHlPU19GU1BhdGgoKSB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mCisgIF9fZnNwYXRoX18oKSB0byBiZSBlaXRoZXIgc3RyIG9yIGJ5dGVzLgorCistIElzc3VlICMxODcyNjogQWxsIG9wdGlvbmFsIHBhcmFtZXRlcnMgb2YgdGhlIGR1bXAoKSwgZHVtcHMoKSwKKyAgbG9hZCgpIGFuZCBsb2FkcygpIGZ1bmN0aW9ucyBhbmQgSlNPTkVuY29kZXIgYW5kIEpTT05EZWNvZGVyIGNsYXNzCisgIGNvbnN0cnVjdG9ycyBpbiB0aGUganNvbiBtb2R1bGUgYXJlIG5vdyBrZXl3b3JkLW9ubHkuCisKKy0gSXNzdWUgIzI3MzE5OiBNZXRob2RzIHNlbGVjdGlvbl9zZXQoKSwgc2VsZWN0aW9uX2FkZCgpLCBzZWxlY3Rpb25fcmVtb3ZlKCkKKyAgYW5kIHNlbGVjdGlvbl90b2dnbGUoKSBvZiB0dGsuVHJlZVZpZXcgbm93IGFsbG93IHBhc3NpbmcgbXVsdGlwbGUgaXRlbXMgYXMKKyAgbXVsdGlwbGUgYXJndW1lbnRzIGluc3RlYWQgb2YgcGFzc2luZyB0aGVtIGFzIGEgdHVwbGUuICBEZXByZWNhdGVkCisgIHVuZG9jdW1lbnRlZCBhYmlsaXR5IG9mIGNhbGxpbmcgdGhlIHNlbGVjdGlvbigpIG1ldGhvZCB3aXRoIGFyZ3VtZW50cy4KIAogLSBJc3N1ZSAjMjcwNzk6IEZpeGVkIGN1cnNlcy5hc2NpaSBmdW5jdGlvbnMgaXNibGFuaygpLCBpc2NudHJsKCkgYW5kIGlzcHVuY3QoKS4KIAorLSBJc3N1ZSAjMjcyOTQ6IE51bWVyaWNhbCBzdGF0ZSBpbiB0aGUgcmVwciBmb3IgVGtpbnRlciBldmVudCBvYmplY3RzIGlzIG5vdworICByZXByZXNlbnRlZCBhcyBhIGNvbWJpbmF0aW9uIG9mIGtub3duIGZsYWdzLgorCistIElzc3VlICMyNzE3NzogTWF0Y2ggb2JqZWN0cyBpbiB0aGUgcmUgbW9kdWxlIG5vdyBzdXBwb3J0IGluZGV4LWxpa2Ugb2JqZWN0cworICBhcyBncm91cCBpbmRpY2VzLiAgQmFzZWQgb24gcGF0Y2hlcyBieSBKZXJvZW4gRGVtZXllciBhbmQgWGlhbmcgWmhhbmcuCisKIC0gSXNzdWUgIzI2NzU0OiBTb21lIGZ1bmN0aW9ucyAoY29tcGlsZSgpIGV0YykgYWNjZXB0ZWQgYSBmaWxlbmFtZSBhcmd1bWVudAogICBlbmNvZGVkIGFzIGFuIGl0ZXJhYmxlIG9mIGludGVnZXJzLiBOb3cgb25seSBzdHJpbmdzIGFuZCBieXRlLWxpa2Ugb2JqZWN0cwogICBhcmUgYWNjZXB0ZWQuCiAKKy0gSXNzdWUgIzI2NTM2OiBzb2NrZXQuaW9jdGwgbm93IHN1cHBvcnRzIFNJT19MT09QQkFDS19GQVNUX1BBVEguIFBhdGNoIGJ5CisgIERhbmllbCBTdG9rZXMuCisKIC0gSXNzdWUgIzI3MDQ4OiBQcmV2ZW50cyBkaXN0dXRpbHMgZmFpbGluZyBvbiBXaW5kb3dzIHdoZW4gZW52aXJvbm1lbnQKICAgdmFyaWFibGVzIGNvbnRhaW4gbm9uLUFTQ0lJIGNoYXJhY3RlcnMKIApAQCAtMjEwLDkgKzY4MiwxNSBAQAogICBMaW51eC4gIFRydW5jYXRlIHNpemUgdG8gSU5UX01BWCBhbmQgbG9vcCB1bnRpbCB3ZSBjb2xsZWN0ZWQgZW5vdWdoIHJhbmRvbQogICBieXRlcywgaW5zdGVhZCBvZiBjYXN0aW5nIGEgZGlyZWN0bHkgUHlfc3NpemVfdCB0byBpbnQuCiAKKy0gSXNzdWUgIzE2ODY0OiBzcWxpdGUzLkN1cnNvci5sYXN0cm93aWQgbm93IHN1cHBvcnRzIFJFUExBQ0Ugc3RhdGVtZW50LgorICBJbml0aWFsIHBhdGNoIGJ5IEFsZXggTG9yZFRob3JzZW4uCisKIC0gSXNzdWUgIzI2Mzg2OiBGaXhlZCB0dGsuVHJlZVZpZXcgc2VsZWN0aW9uIG9wZXJhdGlvbnMgd2l0aCBpdGVtIGlkJ3MKICAgY29udGFpbmluZyBzcGFjZXMuCiAKKy0gSXNzdWUgIzg2Mzc6IEhvbm9yIGEgcGFnZXIgc2V0IGJ5IHRoZSBlbnYgdmFyIE1BTlBBR0VSIChpbiBwcmVmZXJlbmNlIHRvCisgIG9uZSBzZXQgYnkgdGhlIGVudiB2YXIgUEFHRVIpLgorCiAtIFtTZWN1cml0eV0gSXNzdWUgIzIyNjM2OiBBdm9pZCBzaGVsbCBpbmplY3Rpb24gcHJvYmxlbXMgd2l0aAogICBjdHlwZXMudXRpbC5maW5kX2xpYnJhcnkoKS4KIApAQCAtMjIwLDQ5ICs2OTgsNjkgQEAKICAgbG9jYWxlIGVuY29kaW5nLCBhbmQgZml4IGdldF9iZWdpZHgoKSBhbmQgZ2V0X2VuZGlkeCgpIHRvIHJldHVybiBjb2RlIHBvaW50CiAgIGluZGV4ZXMuCiAKLS0gSXNzdWUgIzI2OTMwOiBVcGRhdGUgV2luZG93cyBidWlsZHMgdG8gdXNlIE9wZW5TU0wgMS4wLjJoLgotCiAtIElzc3VlICMyNzM5MjogQWRkIGxvb3AuY29ubmVjdF9hY2NlcHRlZF9zb2NrZXQoKS4KICAgUGF0Y2ggYnkgSmltIEZ1bHRvbi4KIAotLSBJc3N1ZSAjMjc5MzA6IEltcHJvdmVkIGJlaGF2aW91ciBvZiBsb2dnaW5nLmhhbmRsZXJzLlF1ZXVlTGlzdGVuZXIuCi0gIFRoYW5rcyB0byBQYXVsbyBBbmRyYWRlIGFuZCBQZXRyIFZpa3RvcmluIGZvciB0aGUgYW5hbHlzaXMgYW5kIHBhdGNoLgotCi0tIElzc3VlICMyMTIwMTogSW1wcm92ZXMgcmVhZGFiaWxpdHkgb2YgbXVsdGlwcm9jZXNzaW5nIGVycm9yIG1lc3NhZ2UuICBUaGFua3MKLSAgdG8gV29qY2llY2ggV2FsY3phayBmb3IgcGF0Y2guCi0KIElETEUKIC0tLS0KIAotLSBJc3N1ZSAjMjc3MTQ6IHRleHRfdGV4dHZpZXcgYW5kIHRlc3RfYXV0b2NvbXBsZXRlIG5vdyBwYXNzIHdoZW4gcmUtcnVuCi0gIGluIHRoZSBzYW1lIHByb2Nlc3MuICBUaGlzIG9jY3VycyB3aGVuIHRlc3RfaWRsZSBmYWlscyB3aGVuIHJ1biB3aXRoIHRoZQotICAtdyBvcHRpb24gYnV0IHdpdGhvdXQgLWpuLiAgRml4IHdhcm5pbmcgZnJvbSB0ZXN0X2NvbmZpZy4KKy0gSXNzdWUgIzI3NDc3OiBJRExFIHNlYXJjaCBkaWFsb2dzIG5vdyB1c2UgdHRrIHdpZGdldHMuCiAKLS0gSXNzdWUgIzI1NTA3OiBJRExFIG5vIGxvbmdlciBydW5zIGJ1Z2d5IGNvZGUgYmVjYXVzZSBvZiBpdHMgdGtpbnRlciBpbXBvcnRzLgotICBVc2VycyBtdXN0IGluY2x1ZGUgdGhlIHNhbWUgaW1wb3J0cyByZXF1aXJlZCB0byBydW4gZGlyZWN0bHkgaW4gUHl0aG9uLgorLSBJc3N1ZSAjMjcxNzM6IEFkZCAnSURMRSBNb2Rlcm4gVW5peCcgdG8gdGhlIGJ1aWx0LWluIGtleSBzZXRzLgorICBNYWtlIHRoZSBkZWZhdWx0IGtleSBzZXQgZGVwZW5kIG9uIHRoZSBwbGF0Zm9ybS4KKyAgQWRkIHRlc3RzIGZvciB0aGUgY2hhbmdlcyB0byB0aGUgY29uZmlnIG1vZHVsZS4KKworLSBJc3N1ZSAjMjc0NTI6IG1ha2UgY29tbWFuZCBsaW5lICJpZGxlLXRlc3Q+IHB5dGhvbiB0ZXN0X2hlbHAucHkiIHdvcmsuCisgIF9fZmlsZV9fIGlzIHJlbGF0aXZlIHdoZW4gcHl0aG9uIGlzIHN0YXJ0ZWQgaW4gdGhlIGZpbGUncyBkaXJlY3RvcnkuCiAKIC0gSXNzdWUgIzI3NDUyOiBhZGQgbGluZSBjb3VudGVyIGFuZCBjcmMgdG8gSURMRSBjb25maWdIYW5kbGVyIHRlc3QgZHVtcC4KIAorLSBJc3N1ZSAjMjczODA6IElETEU6IGFkZCBxdWVyeS5weSB3aXRoIGJhc2UgUXVlcnkgZGlhbG9nIGFuZCB0dGsgd2lkZ2V0cy4KKyAgTW9kdWxlIGhhZCBzdWJjbGFzc2VzIFNlY3Rpb25OYW1lLCBNb2R1bGVOYW1lLCBhbmQgSGVscFNvdXJjZSwgd2hpY2ggYXJlCisgIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gdXNlcnMgYnkgY29uZmlnZGlhbG9nIGFuZCBmaWxlID0+TG9hZCBNb2R1bGUuCisgIEVhY2ggc3ViY2xhc3MgaGFzIGl0dyBvd24gdmFsaWRpdHkgY2hlY2tzLiAgVXNpbmcgTW9kdWxlTmFtZSBhbGxvd3MgdXNlcnMKKyAgdG8gZWRpdCBiYWQgbW9kdWxlIG5hbWVzIGluc3RlYWQgb2Ygc3RhcnRpbmcgb3Zlci4KKyAgQWRkIHRlc3RzIGFuZCBkZWxldGUgdGhlIHR3byBmaWxlcyBjb21iaW5lZCBpbnRvIHRoZSBuZXcgb25lLgorCistIElzc3VlICMyNzM3MjogVGVzdF9pZGxlIG5vIGxvbmdlciBjaGFuZ2VzIHRoZSBsb2NhbGUuCisKIC0gSXNzdWUgIzI3MzY1OiBBbGxvdyBub24tYXNjaWkgY2hhcnMgaW4gSURMRSBORVdTLnR4dCwgZm9yIGNvbnRyaWJ1dG9yIG5hbWVzLgogCiAtIElzc3VlICMyNzI0NTogSURMRTogQ2xlYW5seSBkZWxldGUgY3VzdG9tIHRoZW1lcyBhbmQga2V5IGJpbmRpbmdzLgogICBQcmV2aW91c2x5LCB3aGVuIElETEUgd2FzIHN0YXJ0ZWQgZnJvbSBhIGNvbnNvbGUgb3IgYnkgaW1wb3J0LCBhIGNhc2NhZGUKICAgb2Ygd2FybmluZ3Mgd2FzIGVtaXR0ZWQuICBQYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgogCistIElzc3VlICMyNDEzNzogUnVuIElETEUsIHRlc3RfaWRsZSwgYW5kIGh0ZXN0IHdpdGggdGtpbnRlciBkZWZhdWx0IHJvb3QKKyAgZGlzYWJsZWQuICBGaXggY29kZSBhbmQgdGVzdHMgdGhhdCBmYWlsIHdpdGggdGhpcyByZXN0cmljdGlvbi4gIEZpeCBodGVzdHMgdG8KKyAgbm90IGNyZWF0ZSBhIHNlY29uZCBhbmQgcmVkdW5kYW50IHJvb3QgYW5kIG1haW5sb29wLgorCistIElzc3VlICMyNzMxMDogRml4IElETEUuYXBwIGZhaWx1cmUgdG8gbGF1bmNoIG9uIE9TIFggZHVlIHRvIHZlc3RpZ2lhbCBpbXBvcnQuCisKIEMgQVBJCiAtLS0tLQogCiAtIElzc3VlICMyNjc1NDogUHlVbmljb2RlX0ZTRGVjb2RlcigpIGFjY2VwdGVkIGEgZmlsZW5hbWUgYXJndW1lbnQgZW5jb2RlZCBhcwotICBhbiBpdGVyYWJsZSBvZiBpbnRlZ2Vycy4gTm93IG9ubHkgc3RyaW5ncyBhbmQgYnl0ZXMtbGlrZSBvYmplY3RzIGFyZSBhY2NlcHRlZC4KKyAgYW4gaXRlcmFibGUgb2YgaW50ZWdlcnMuIE5vdyBvbmx5IHN0cmluZ3MgYW5kIGJ5dGUtbGlrZSBvYmplY3RzIGFyZSBhY2NlcHRlZC4KIAotVGVzdHMKK0J1aWxkCiAtLS0tLQogCi0tIElzc3VlICMyNzc4NzogQ2FsbCBnYy5jb2xsZWN0KCkgYmVmb3JlIGNoZWNraW5nIGVhY2ggdGVzdCBmb3IgImRhbmdsaW5nCi0gIHRocmVhZHMiLCBzaW5jZSB0aGUgZGFuZ2xpbmcgdGhyZWFkcyBhcmUgd2VhayByZWZlcmVuY2VzLgorLSBJc3N1ZSAjMjc0NDI6IEV4cG9zZSB0aGUgQW5kcm9pZCBBUEkgbGV2ZWwgdGhhdCBweXRob24gd2FzIGJ1aWx0IGFnYWluc3QsIGluCisgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoKSBhcyAnQU5EUk9JRF9BUElfTEVWRUwnLgogCi0tIElzc3VlICMyNzM2OTogSW4gdGVzdF9weWV4cGF0LCBhdm9pZCB0ZXN0aW5nIGFuIGVycm9yIG1lc3NhZ2UgZGV0YWlsIHRoYXQKLSAgY2hhbmdlZCBpbiBFeHBhdCAyLjIuMC4KKy0gSXNzdWUgIzI3NDM0OiBUaGUgaW50ZXJwcmV0ZXIgdGhhdCBydW5zIHRoZSBjcm9zcy1idWlsZCwgZm91bmQgaW4gUEFUSCwgbXVzdAorICBub3cgYmUgb2YgdGhlIHNhbWUgZmVhdHVyZSB2ZXJzaW9uIChlLmcuIDMuNikgYXMgdGhlIHNvdXJjZSBiZWluZyBidWlsdC4KKworLSBJc3N1ZSAjMjY5MzA6IFVwZGF0ZSBXaW5kb3dzIGJ1aWxkcyB0byB1c2UgT3BlblNTTCAxLjAuMmguCisKKy0gSXNzdWUgIzIzOTY4OiBSZW5hbWUgdGhlIHBsYXRmb3JtIGRpcmVjdG9yeSBmcm9tIHBsYXQtJChNQUNIREVQKSB0bworICBwbGF0LSQoUExBVEZPUk1fVFJJUExFVCkuCisgIFJlbmFtZSB0aGUgY29uZmlnIGRpcmVjdG9yeSAoTElCUEwpIGZyb20gY29uZmlnLSQoTERWRVJTSU9OKSB0bworICBjb25maWctJChMRFZFUlNJT04pLSQoUExBVEZPUk1fVFJJUExFVCkuCisgIEluc3RhbGwgdGhlIHBsYXRmb3JtIHNwZWNpZmMgX3N5c2NvbmZpZ2RhdGEgbW9kdWxlIGludG8gdGhlIHBsYXRmb3JtCisgIGRpcmVjdG9yeSBhbmQgcmVuYW1lIGl0IHRvIGluY2x1ZGUgdGhlIEFCSUZMQUdTLgorCistIERvbid0IHVzZSBsYXJnZWZpbGUgc3VwcG9ydCBmb3IgR05VL0h1cmQuCiAKIFRvb2xzL0RlbW9zCiAtLS0tLS0tLS0tLQpAQCAtMjcyLDgwICs3NzAsMzI1IEBACiAKIC0gSXNzdWUgIzI3NDE4OiBGaXhlZCBUb29scy9pbXBvcnRiZW5jaC9pbXBvcnRiZW5jaC5weS4KIAotV2luZG93cwotLS0tLS0tLQorRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQogCi0tIElzc3VlICMyNzQ2OTogQWRkcyBhIHNoZWxsIGV4dGVuc2lvbiB0byB0aGUgbGF1bmNoZXIgc28gdGhhdCBkcmFnIGFuZCBkcm9wCi0gIHdvcmtzIGNvcnJlY3RseS4KKy0gSXNzdWUgIzE5NDg5OiBNb3ZlZCB0aGUgc2VhcmNoIGJveCBmcm9tIHRoZSBzaWRlYmFyIHRvIHRoZSBoZWFkZXIgYW5kIGZvb3RlcgorICBvZiBlYWNoIHBhZ2UuICBQYXRjaCBieSBBbW1hciBBc2thci4KIAotLSBJc3N1ZSAjMjczMDk6IEVuYWJsZWQgcHJvcGVyIFdpbmRvd3Mgc3R5bGVzIGluIHB5dGhvblt3XS5leGUgbWFuaWZlc3QuCi0KLUJ1aWxkCi0tLS0tLQotCi0tIElzc3VlICMyNzk4MzogQ2F1c2UgbGFjayBvZiBsbHZtLXByb2ZkYXRhIHRvb2wgd2hlbiB1c2luZyBjbGFuZyBhcwotICByZXF1aXJlZCBmb3IgUEdPIGxpbmtpbmcgdG8gYmUgYSBjb25maWd1cmUgdGltZSBlcnJvciByYXRoZXIgdGhhbgotICBtYWtlIHRpbWUgd2hlbiAtLXdpdGgtb3B0aW1pemF0aW9ucyBpcyBlbmFibGVkLiAgQWxzbyBpbXByb3ZlIG91cgotICBhYmlsaXR5IHRvIGZpbmQgdGhlIGxsdm0tcHJvZmRhdGEgdG9vbCBvbiBNYWNPUyBhbmQgc29tZSBMaW51eGVzLgotCi0tIElzc3VlICMyNjMwNzogVGhlIHByb2ZpbGUtb3B0IGJ1aWxkIG5vdyBhcHBseXMgUEdPIHRvIHRoZSBidWlsdC1pbiBtb2R1bGVzLgotCi0tIElzc3VlICMyNjM1OTogQWRkIHRoZSAtLXdpdGgtb3B0aW1pemF0aW9ucyBjb25maWd1cmUgZmxhZy4KLQotLSBJc3N1ZSAjMjc3MTM6IFN1cHByZXNzIHNwdXJpb3VzIGJ1aWxkIHdhcm5pbmdzIHdoZW4gdXBkYXRpbmcgaW1wb3J0bGliJ3MKLSAgYm9vdHN0cmFwIGZpbGVzLiAgUGF0Y2ggYnkgWGlhbmcgWmhhbmcKLQotLSBJc3N1ZSAjMjU4MjU6IENvcnJlY3QgdGhlIHJlZmVyZW5jZXMgdG8gTW9kdWxlcy9weXRob24uZXhwIGFuZCBsZF9zb19haXgsCi0gIHdoaWNoIGFyZSByZXF1aXJlZCBvbiBBSVguICBUaGlzIHVwZGF0ZXMgcmVmZXJlbmNlcyB0byBhbiBpbnN0YWxsYXRpb24gcGF0aAotICB0aGF0IHdhcyBjaGFuZ2VkIGluIDMuMmE0LCBhbmQgdW5kb2VzIGNoYW5nZWQgcmVmZXJlbmNlcyB0byB0aGUgYnVpbGQgdHJlZQotICB0aGF0IHdlcmUgbWFkZSBpbiAzLjUuMGExLgotCi0tIElzc3VlICMyNzQ1MzogQ1BQIGludm9jYXRpb24gaW4gY29uZmlndXJlIG11c3QgdXNlIENQUEZMQUdTLiBQYXRjaCBieQotICBDaGkgSHN1YW4gWWVuLgotCi0tIElzc3VlICMyNzY0MTogVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGluc2VydHMgY29tbWVudHMgaW50byB0aGUgbWFrZWZpbGUKLSAgdG8gcHJldmVudCB0aGUgcGdlbiBhbmQgX2ZyZWV6ZV9pbXBvcnRsaWIgZXhlY3V0YWJsZXMgZnJvbSBiZWluZyBjcm9zcy0KLSAgY29tcGlsZWQuCi0KLS0gSXNzdWUgIzI2NjYyOiBTZXQgUFlUSE9OX0ZPUl9HRU4gaW4gY29uZmlndXJlIGFzIHRoZSBQeXRob24gcHJvZ3JhbSB0byBiZQotICB1c2VkIGZvciBmaWxlIGdlbmVyYXRpb24gZHVyaW5nIHRoZSBidWlsZC4KLQotLSBJc3N1ZSAjMTA5MTA6IEF2b2lkIEMrKyBjb21waWxhdGlvbiBlcnJvcnMgb24gRnJlZUJTRCBhbmQgT1MgWC4KLSAgQWxzbyB1cGRhdGUgRnJlZWRCU0QgdmVyc2lvbiBjaGVja3MgZm9yIHRoZSBvcmlnaW5hbCBjdHlwZSBVVEYtOCB3b3JrYXJvdW5kLgotCi0KLVdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4yPwotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVJlbGVhc2UgZGF0ZTogMjAxNi0wNi0yNgotCi1Db3JlIGFuZCBCdWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBJc3N1ZSAjMjY5MzA6IFVwZGF0ZSBXaW5kb3dzIGJ1aWxkcyB0byB1c2UgT3BlblNTTCAxLjAuMmguCistIElzc3VlICMyNzI4NTogVXBkYXRlIGRvY3VtZW50YXRpb24gdG8gcmVmbGVjdCB0aGUgZGVwcmVjYXRpb24gb2YgYGBweXZlbnZgYAorICBhbmQgbm9ybWFsaXplIG9uIHRoZSB0ZXJtICJ2aXJ0dWFsIGVudmlyb25tZW50Ii4gUGF0Y2ggYnkgU3RldmUgUGllcmN5LgogCiBUZXN0cwogLS0tLS0KIAotLSBJc3N1ZSAjMjY4Njc6IFVidW50dSdzIG9wZW5zc2wgT1BfTk9fU1NMdjMgaXMgZm9yY2VkIG9uIGJ5IGRlZmF1bHQ7IGZpeCB0ZXN0LgotCi1JRExFCi0tLS0tCi0KLS0gSXNzdWUgIzI3MzY1OiBBbGxvdyBub24tYXNjaWkgaW4gaWRsZWxpYi9ORVdTLnR4dCAtIG1pbmltYWwgcGFydCBmb3IgMy41LjIuCistIElzc3VlICMyNzAyNzogQWRkZWQgdGVzdC5zdXBwb3J0LmlzX2FuZHJvaWQgdGhhdCBpcyBUcnVlIHdoZW4gdGhpcyBpcyBhbgorICBBbmRyb2lkIGJ1aWxkLgogCiAKLVdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4yIHJlbGVhc2UgY2FuZGlkYXRlIDE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorV2hhdCdzIE5ldyBpbiBQeXRob24gMy42LjAgYWxwaGEgMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1SZWxlYXNlIGRhdGU6IDIwMTYtMDYtMTIKKypSZWxlYXNlIGRhdGU6IDIwMTYtMDYtMTMqCiAKIENvcmUgYW5kIEJ1aWx0aW5zCiAtLS0tLS0tLS0tLS0tLS0tLQogCistIElzc3VlICMyNzA5NTogU2ltcGxpZmllZCBNQUtFX0ZVTkNUSU9OIGFuZCByZW1vdmVkIE1BS0VfQ0xPU1VSRSBvcGNvZGVzLgorICBQYXRjaCBieSBEZW11ciBSdW1lZC4KKworLSBJc3N1ZSAjMjcxOTA6IFJhaXNlIE5vdFN1cHBvcnRlZEVycm9yIGlmIHNxbGl0ZTMgaXMgb2xkZXIgdGhhbiAzLjMuMS4KKyAgUGF0Y2ggYnkgRGF2ZSBTYXd5ZXIuCisKKy0gSXNzdWUgIzI3Mjg2OiBGaXhlZCBjb21waWxpbmcgQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEwgb3Bjb2RlLiAgQ2FsbGluZworICBmdW5jdGlvbiB3aXRoIGdlbmVyYWxpemVkIHVucGFja2luZyAoUEVQIDQ0OCkgYW5kIGNvbmZsaWN0aW5nIGtleXdvcmQgbmFtZXMKKyAgY291bGQgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yLgorCistIElzc3VlICMyNzE0MDogQWRkZWQgQlVJTERfQ09OU1RfS0VZX01BUCBvcGNvZGUuCisKKy0gSXNzdWUgIzI3MTg2OiBBZGQgc3VwcG9ydCBmb3Igb3MuUGF0aExpa2Ugb2JqZWN0cyB0byBvcGVuKCkgKHBhcnQgb2YgUEVQIDUxOSkuCisKIC0gSXNzdWUgIzI3MDY2OiBGaXhlZCBTeXN0ZW1FcnJvciBpZiBhIGN1c3RvbSBvcGVuZXIgKGZvciBvcGVuKCkpIHJldHVybnMgYQogICBuZWdhdGl2ZSBudW1iZXIgd2l0aG91dCBzZXR0aW5nIGFuIGV4Y2VwdGlvbi4KIAorLSBJc3N1ZSAjMjY5ODM6IGZsb2F0KCkgbm93IGFsd2F5cyByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgZXhhY3QgZmxvYXQuCisgIFRoZSBkZXByZWNhdGlvbiB3YXJuaW5nIGlzIGVtaXR0ZWQgaWYgX19mbG9hdF9fIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YKKyAgYSBzdHJpY3Qgc3ViY2xhc3Mgb2YgZmxvYXQuICBJbiBhIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob24gdGhpcyBjYW4KKyAgYmUgYW4gZXJyb3IuCisKKy0gSXNzdWUgIzI3MDk3OiBQeXRob24gaW50ZXJwcmV0ZXIgaXMgbm93IGFib3V0IDclIGZhc3RlciBkdWUgdG8gb3B0aW1pemVkCisgIGluc3RydWN0aW9uIGRlY29kaW5nLiAgQmFzZWQgb24gcGF0Y2ggYnkgRGVtdXIgUnVtZWQuCisKKy0gSXNzdWUgIzI2NjQ3OiBQeXRob24gaW50ZXJwcmV0ZXIgbm93IHVzZXMgMTYtYml0IHdvcmRjb2RlIGluc3RlYWQgb2YgYnl0ZWNvZGUuCisgIFBhdGNoIGJ5IERlbXVyIFJ1bWVkLgorCistIElzc3VlICMyMzI3NTogQWxsb3cgYXNzaWduaW5nIHRvIGFuIGVtcHR5IHRhcmdldCBsaXN0IGluIHJvdW5kIGJyYWNrZXRzOgorICAoKSA9IGl0ZXJhYmxlLgorCistIElzc3VlICMyNzI0MzogVXBkYXRlIHRoZSBfX2FpdGVyX18gcHJvdG9jb2w6IGluc3RlYWQgb2YgcmV0dXJuaW5nCisgIGFuIGF3YWl0YWJsZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFzeW5jaHJvbm91cyBpdGVyYXRvciwgdGhlIGFzeW5jaHJvbm91cworICBpdGVyYXRvciBzaG91bGQgYmUgcmV0dXJuZWQgZGlyZWN0bHkuICBEb2luZyB0aGUgZm9ybWVyIHdpbGwgdHJpZ2dlciBhCisgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcuCisKKworTGlicmFyeQorLS0tLS0tLQorCistIENvbW1lbnQgb3V0IHNvY2tldCAoU09fUkVVU0VQT1JUKSBhbmQgcG9zaXggKE9fU0hMT0NLLCBPX0VYTE9DSykgY29uc3RhbnRzCisgIGV4cG9zZWQgb24gdGhlIEFQSSB3aGljaCBhcmUgbm90IGltcGxlbWVudGVkIG9uIEdOVS9IdXJkLiBUaGV5IHdvdWxkIG5vdAorICB3b3JrIGF0IHJ1bnRpbWUgYW55d2F5LgorCistIElzc3VlICMyNTQ1NTogRml4ZWQgY3Jhc2hlcyBpbiByZXByIG9mIHJlY3Vyc2l2ZSBFbGVtZW50VHJlZS5FbGVtZW50IGFuZAorICBmdW5jdG9vbHMucGFydGlhbCBvYmplY3RzLgorCistIElzc3VlICMyNzI5NDogSW1wcm92ZWQgcmVwciBmb3IgVGtpbnRlciBldmVudCBvYmplY3RzLgorCistIElzc3VlICMyMDUwODogSW1wcm92ZSBleGNlcHRpb24gbWVzc2FnZSBvZiBJUHZ7NCw2fU5ldHdvcmsuX19nZXRpdGVtX18uCisgIFBhdGNoIGJ5IEdhcmV0aCBSZWVzLgorCistIFtTZWN1cml0eV0gSXNzdWUgIzI2NTU2OiBVcGRhdGUgZXhwYXQgdG8gMi4xLjEsIGZpeGVzIENWRS0yMDE1LTEyODMuCisKKy0gW1NlY3VyaXR5XSBGaXggVExTIHN0cmlwcGluZyB2dWxuZXJhYmlsaXR5IGluIHNtdHBsaWIsIENWRS0yMDE2LTA3NzIuCisgIFJlcG9ydGVkIGJ5IFRlYW0gT3N0c3Ryb20uCisKKy0gSXNzdWUgIzIxMzg2OiBJbXBsZW1lbnQgbWlzc2luZyBJUHY0QWRkcmVzcy5pc19nbG9iYWwgcHJvcGVydHkuICBJdCB3YXMKKyAgZG9jdW1lbnRlZCBzaW5jZSAwN2E1NjEwYmFlOWQuICBJbml0aWFsIHBhdGNoIGJ5IFJvZ2VyIEx1ZXRoaS4KKworLSBJc3N1ZSAjMjcwMjk6IFJlbW92ZWQgZGVwcmVjYXRlZCBzdXBwb3J0IG9mIHVuaXZlcnNhbCBuZXdsaW5lcyBtb2RlIGZyb20KKyAgWmlwRmlsZS5vcGVuKCkuCisKKy0gSXNzdWUgIzI3MDMwOiBVbmtub3duIGVzY2FwZXMgY29uc2lzdGluZyBvZiBgYCdcJ2BgIGFuZCBhbiBBU0NJSSBsZXR0ZXIgaW4KKyAgcmVndWxhciBleHByZXNzaW9ucyBub3cgYXJlIGVycm9ycy4gIFRoZSByZS5MT0NBTEUgZmxhZyBub3cgY2FuIGJlIHVzZWQKKyAgb25seSB3aXRoIGJ5dGVzIHBhdHRlcm5zLgorCistIElzc3VlICMyNzE4NjogQWRkIG9zLlBhdGhMaWtlIHN1cHBvcnQgdG8gRGlyRW50cnkgKHBhcnQgb2YgUEVQIDUxOSkuCisgIEluaXRpYWwgcGF0Y2ggYnkgSmVsbGUgWmlqbHN0cmEuCisKKy0gSXNzdWUgIzIwOTAwOiBkaXN0dXRpbHMgcmVnaXN0ZXIgY29tbWFuZCBub3cgZGVjb2RlcyBIVFRQIHJlc3BvbnNlcworICBjb3JyZWN0bHkuICBJbml0aWFsIHBhdGNoIGJ5IGluZ3JpZC4KKworLSBJc3N1ZSAjMjcxODY6IEFkZCBvcy5QYXRoTGlrZSBzdXBwb3J0IHRvIHBhdGhsaWIsIHJlbW92aW5nIGl0cyBwcm92aXNpb25hbAorICBzdGF0dXMgKHBhcnQgb2YgUEVQIDUxOSkuIEluaXRpYWwgcGF0Y2ggYnkgRHVzdHkgUGhpbGxpcHMuCisKKy0gSXNzdWUgIzI3MTg2OiBBZGQgc3VwcG9ydCBmb3Igb3MuUGF0aExpa2Ugb2JqZWN0cyB0byBvcy5mc2VuY29kZSgpIGFuZAorICBvcy5mc2RlY29kZSgpIChwYXJ0IG9mIFBFUCA1MTkpLgorCistIElzc3VlICMyNzE4NjogSW50cm9kdWNlIG9zLlBhdGhMaWtlIGFuZCBvcy5mc3BhdGgoKSAocGFydCBvZiBQRVAgNTE5KS4KKworLSBBIG5ldyB2ZXJzaW9uIG9mIHR5cGluZy5weSBwcm92aWRlcyBzZXZlcmFsIG5ldyBjbGFzc2VzIGFuZAorICBmZWF0dXJlczogQG92ZXJsb2FkIG91dHNpZGUgc3R1YnMsIFJldmVyc2libGUsIERlZmF1bHREaWN0LCBUZXh0LAorICBDb250ZXh0TWFuYWdlciwgVHlwZVtdLCBOZXdUeXBlKCksIFRZUEVfQ0hFQ0tJTkcsIGFuZCBudW1lcm91cyBidWcKKyAgZml4ZXMgKG5vdGUgdGhhdCBzb21lIG9mIHRoZSBuZXcgZmVhdHVyZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4KKyAgbXlweSBvciBvdGhlciBzdGF0aWMgYW5hbHl6ZXJzKS4gIEFsc28gY2xhc3NlcyBmb3IgUEVQIDQ5MgorICAoQXdhaXRhYmxlLCBBc3luY0l0ZXJhYmxlLCBBc3luY0l0ZXJhdG9yKSBoYXZlIGJlZW4gYWRkZWQgKGluIGZhY3QKKyAgdGhleSBtYWRlIGl0IGludG8gMy41LjEgYnV0IHdlcmUgbmV2ZXIgbWVudGlvbmVkKS4KKworLSBJc3N1ZSAjMjU3Mzg6IFN0b3AgaHR0cC5zZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlci5zZW5kX2Vycm9yKCkgZnJvbQorICBzZW5kaW5nIGEgbWVzc2FnZSBib2R5IGZvciAyMDUgUmVzZXQgQ29udGVudC4gIEFsc28sIGRvbid0IHNlbmQgQ29udGVudAorICBoZWFkZXIgZmllbGRzIGluIHJlc3BvbnNlcyB0aGF0IGRvbid0IGhhdmUgYSBib2R5LiAgUGF0Y2ggYnkgU3VzdW11CisgIEtvc2hpYmEuCisKKy0gSXNzdWUgIzIxMzEzOiBGaXggdGhlICJwbGF0Zm9ybSIgbW9kdWxlIHRvIHRvbGVyYXRlIHdoZW4gc3lzLnZlcnNpb24KKyAgY29udGFpbnMgdHJ1bmNhdGVkIGJ1aWxkIGluZm9ybWF0aW9uLgorCistIFtTZWN1cml0eV0gSXNzdWUgIzI2ODM5OiBPbiBMaW51eCwgOmZ1bmM6YG9zLnVyYW5kb21gIG5vdyBjYWxscworICBgYGdldHJhbmRvbSgpYGAgd2l0aCBgYEdSTkRfTk9OQkxPQ0tgYCB0byBmYWxsIGJhY2sgb24gcmVhZGluZworICBgYC9kZXYvdXJhbmRvbWBgIGlmIHRoZSB1cmFuZG9tIGVudHJvcHkgcG9vbCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiBQYXRjaAorICB3cml0dGVuIGJ5IENvbG0gQnVja2xleS4KKworLSBJc3N1ZSAjMjM4ODM6IEFkZGVkIG1pc3NpbmcgQVBJcyB0byBfX2FsbF9fIHRvIG1hdGNoIHRoZSBkb2N1bWVudGVkIEFQSXMKKyAgZm9yIHRoZSBmb2xsb3dpbmcgbW9kdWxlczogY2dpLCBtYWlsYm94LCBtaW1ldHlwZXMsIHBsaXN0bGliIGFuZCBzbXRwZC4KKyAgUGF0Y2hlcyBieSBKYWNlayBLb8WCb2R6aWVqLgorCistIElzc3VlICMyNzE2NDogSW4gdGhlIHpsaWIgbW9kdWxlLCBhbGxvdyBkZWNvbXByZXNzaW5nIHJhdyBEZWZsYXRlIHN0cmVhbXMKKyAgd2l0aCBhIHByZWRlZmluZWQgemRpY3QuICBCYXNlZCBvbiBwYXRjaCBieSBYaWFuZyBaaGFuZy4KKworLSBJc3N1ZSAjMjQyOTE6IEZpeCB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXIuV1NHSVJlcXVlc3RIYW5kbGVyIHRvIGNvbXBsZXRlbHkKKyAgd3JpdGUgZGF0YSB0byB0aGUgY2xpZW50LiAgUHJldmlvdXNseSBpdCBjb3VsZCBkbyBwYXJ0aWFsIHdyaXRlcyBhbmQKKyAgdHJ1bmNhdGUgZGF0YS4gIEFsc28sIHdzZ2lyZWYuaGFuZGxlci5TZXJ2ZXJIYW5kbGVyIGNhbiBub3cgaGFuZGxlIHN0ZG91dAorICBkb2luZyBwYXJ0aWFsIHdyaXRlcywgYnV0IHRoaXMgaXMgZGVwcmVjYXRlZC4KKworLSBJc3N1ZSAjMjEyNzI6IFVzZSBfc3lzY29uZmlnZGF0YS5weSB0byBpbml0aWFsaXplIGRpc3R1dGlscy5zeXNjb25maWcuCisKKy0gSXNzdWUgIzE5NjExOiA6bW9kOmBpbnNwZWN0YCBub3cgcmVwb3J0cyB0aGUgaW1wbGljaXQgYGAuMGBgIHBhcmFtZXRlcnMKKyAgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgY29tcHJlaGVuc2lvbiBhbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gc2NvcGVzCisgIGFzIGlmIHRoZXkgd2VyZSBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycyBjYWxsZWQgYGBpbXBsaWNpdDBgYC4KKyAgUGF0Y2ggYnkgSmVsbGUgWmlqbHN0cmEuCisKKy0gSXNzdWUgIzI2ODA5OiBBZGQgYGBfX2FsbF9fYGAgdG8gOm1vZDpgc3RyaW5nYC4gIFBhdGNoIGJ5IEVtYW51ZWwgQmFycnkuCisKKy0gSXNzdWUgIzI2MzczOiBzdWJwcm9jZXNzLlBvcGVuLmNvbW11bmljYXRlIG5vdyBjb3JyZWN0bHkgaWdub3JlcworICBCcm9rZW5QaXBlRXJyb3Igd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkaWVzIGJlZm9yZSAuY29tbXVuaWNhdGUoKQorICBpcyBjYWxsZWQgaW4gbW9yZS9hbGwgY2lyY3Vtc3RhbmNlcy4KKworLSBzaWduYWwsIHNvY2tldCwgYW5kIHNzbCBtb2R1bGUgSW50RW51bSBjb25zdGFudCBuYW1lIGxvb2t1cHMgbm93IHJldHVybiBhCisgIGNvbnNpc3RlbnQgbmFtZSBmb3IgdmFsdWVzIGhhdmluZyBtdWx0aXBsZSBuYW1lcy4gIEV4OiBzaWduYWwuU2lnbmFscyg2KQorICBub3cgcmVmZXJzIHRvIGl0c2VsZiBhcyBzaWduYWwuU0lHQUxSTSByYXRoZXIgdGhhbiBmbGlwcGluZyBiZXR3ZWVuIHRoYXQKKyAgYW5kIHNpZ25hbC5TSUdJT1QgYmFzZWQgb24gdGhlIGludGVycHJldGVyJ3MgaGFzaCByYW5kb21pemF0aW9uIHNlZWQuCisKKy0gSXNzdWUgIzI3MTY3OiBDbGFyaWZ5IHRoZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBlcnJvciBtZXNzYWdlIHRleHQKKyAgd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkaWVkIGR1ZSB0byBhIHNpZ25hbC4KKworLSBJc3N1ZSAjMjU5MzE6IERvbid0IGRlZmluZSBzb2NrZXRzZXJ2ZXIuRm9ya2luZyogbmFtZXMgb24gcGxhdGZvcm1zIHN1Y2gKKyAgYXMgV2luZG93cyB0aGF0IGRvIG5vdCBzdXBwb3J0IG9zLmZvcmsoKS4KKworLSBJc3N1ZSAjMjE3NzY6IGRpc3R1dGlscy51cGxvYWQgbm93IGNvcnJlY3RseSBoYW5kbGVzIEhUVFBFcnJvci4KKyAgSW5pdGlhbCBwYXRjaCBieSBDbGF1ZGl1IFBvcGEuCisKKy0gSXNzdWUgIzI2NTI2OiBSZXBsYWNlIGN1c3RvbSBwYXJzZSB0cmVlIHZhbGlkYXRpb24gaW4gdGhlIHBhcnNlcgorICBtb2R1bGUgd2l0aCBhIHNpbXBsZSBERkEgdmFsaWRhdG9yLgorCistIElzc3VlICMyNzExNDogRml4IFNTTENvbnRleHQuX2xvYWRfd2luZG93c19zdG9yZV9jZXJ0cyBmYWlscyB3aXRoCisgIFBlcm1pc3Npb25FcnJvcgorCistIElzc3VlICMxODM4MzogQXZvaWQgY3JlYXRpbmcgZHVwbGljYXRlIGZpbHRlcnMgd2hlbiB1c2luZyBmaWx0ZXJ3YXJuaW5ncworICBhbmQgc2ltcGxlZmlsdGVyLiAgQmFzZWQgb24gcGF0Y2ggYnkgQWxleCBTaGtvcC4KKworLSBJc3N1ZSAjMjMwMjY6IHdpbnJlZy5RdWVyeVZhbHVlRXgoKSBub3cgcmV0dXJuIGFuIGludGVnZXIgZm9yIFJFR19RV09SRCB0eXBlLgorCistIElzc3VlICMyNjc0MTogc3VicHJvY2Vzcy5Qb3BlbiBkZXN0cnVjdG9yIG5vdyBlbWl0cyBhIFJlc291cmNlV2FybmluZyB3YXJuaW5nCisgIGlmIHRoZSBjaGlsZCBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcuCisKKy0gSXNzdWUgIzI3MDU2OiBPcHRpbWl6ZSBwaWNrbGUubG9hZCgpIGFuZCBwaWNrbGUubG9hZHMoKSwgdXAgdG8gMTAlIGZhc3RlcgorICB0byBkZXNlcmlhbGl6ZSBhIGxvdCBvZiBzbWFsbCBvYmplY3RzLgorCistIElzc3VlICMyMTI3MTogTmV3IGtleXdvcmQgb25seSBwYXJhbWV0ZXJzIGluIHJlc2V0X21vY2sgY2FsbC4KKworSURMRQorLS0tLQorCistIElzc3VlICM1MTI0OiBQYXN0ZSB3aXRoIHRleHQgc2VsZWN0ZWQgbm93IHJlcGxhY2VzIHRoZSBzZWxlY3Rpb24gb24gWDExLgorICBUaGlzIG1hdGNoZXMgaG93IHBhc3RlIHdvcmtzIG9uIFdpbmRvd3MsIE1hYywgbW9zdCBtb2Rlcm4gTGludXggYXBwcywKKyAgYW5kIHR0ayB3aWRnZXRzLiAgT3JpZ2luYWwgcGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjQ3NTA6IFN3aXRjaCBhbGwgc2Nyb2xsYmFycyBpbiBJRExFIHRvIHR0ayB2ZXJzaW9ucy4KKyAgV2hlcmUgbmVlZGVkLCBtaW5pbWFsIHRlc3RzIGFyZSBhZGRlZCB0byBjb3ZlciBjaGFuZ2VzLgorCistIElzc3VlICMyNDc1OTogSURMRSByZXF1aXJlcyB0ayA4LjUgYW5kIGF2YWlsYWJpbGl0eSB0dGsgd2lkZ2V0cy4KKyAgRGVsZXRlIG5vdyB1bm5lZWRlZCB0ayB2ZXJzaW9uIHRlc3RzIGFuZCBjb2RlIGZvciBvbGRlciB2ZXJzaW9ucy4KKyAgQWRkIHRlc3QgZm9yIElETEUgc3ludGF4IGNvbG9yaXpvZXIuCisKKy0gSXNzdWUgIzI3MjM5OiBpZGxlbGliLm1hY29zeC5pc1h5elRrIGZ1bmN0aW9ucyBpbml0aWFsaXplIGFzIG5lZWRlZC4KKworLSBJc3N1ZSAjMjcyNjI6IG1vdmUgQXF1YSB1bmJpbmRpbmcgY29kZSwgd2hpY2ggZW5hYmxlIGNvbnRleHQgbWVudXMsIHRvIG1heG9zeC4KKworLSBJc3N1ZSAjMjQ3NTk6IE1ha2UgY2xlYXIgaW4gaWRsZWxpYi5pZGxlX3Rlc3QuX19pbml0X18gdGhhdCB0aGUgZGlyZWN0b3J5CisgIGlzIGEgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0ZXN0LnRlc3RfaWRsZSBhbmQgdG9vbCBmb3IgbWFpbnRhaW5lcnMuCisKKy0gSXNzdWUgIzI3MTk2OiBTdG9wICdUaGVtZUNoYW5nZWQnIHdhcm5pbmdzIHdoZW4gcnVubmluZyBJRExFIHRlc3RzLgorICBUaGVzZSBwZXJzaXN0ZWQgYWZ0ZXIgb3RoZXIgd2FybmluZ3Mgd2VyZSBzdXBwcmVzc2VkIGluICMyMDU2Ny4KKyAgQXBwbHkgU2VyaGl5IFN0b3JjaGFrYSdzIHVwZGF0ZV9pZGxldGFza3Mgc29sdXRpb24gdG8gZm91ciB0ZXN0IGZpbGVzLgorICBSZWNvcmQgdGhpcyBhZGRpdGlvbmFsIGFkdmljZSBpbiBpZGxlX3Rlc3QvUkVBRE1FLnR4dAorCistIElzc3VlICMyMDU2NzogUmV2aXNlIGlkbGVfdGVzdC9SRUFETUUudHh0IHdpdGggYWR2aWNlIGFib3V0IGF2b2lkaW5nCisgIHRrIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0ZXN0cy4gIEFwcGx5IGFkdmljZSB0byBzZXZlcmFsIElETEUgdGVzdHMuCisKKy0gSXNzdWUgIzI0MjI1OiBVcGRhdGUgaWRsZWxpYi9SRUFETUUudHh0IHdpdGggbmV3IGZpbGUgbmFtZXMKKyAgYW5kIGV2ZW50IGhhbmRsZXJzLgorCistIElzc3VlICMyNzE1NjogUmVtb3ZlIG9ic29sZXRlIGNvZGUgbm90IHVzZWQgYnkgSURMRS4gIFJlcGxhY2VtZW50czoKKyAgMS4gaGVscC50eHQsIHJlcGxhY2VkIGJ5IGhlbHAuaHRtbCwgaXMgb3V0LW9mLWRhdGUgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgSXRzIGRlZGljYXRlZCB2aWV3ZXIgaGFzIGJlIHJlcGxhY2VkIGJ5IHRoZSBodG1sIHZpZXdlciBpbiBoZWxwLnB5LgorICAyLiDigJhgaW1wb3J0IGlkbGV2ZXI7IEkgPSBpZGxldmVyLklETEVfVkVSU0lPTmDigJkgaXMgdGhlIHNhbWUgYXMKKyAg4oCYYGltcG9ydCBzeXM7IEkgPSB2ZXJzaW9uWzp2ZXJzaW9uLmluZGV4KCcgJyldYOKAmQorICAzLiBBZnRlciDigJhgb2IgPSBzdGFja3ZpZXdlci5WYXJpYWJsZXNUcmVlSXRlbSgqYXJncylg4oCZLAorICDigJhgb2Iua2V5cygpID09IGxpc3Qob2Iub2JqZWN0LmtleXMpYOKAmS4KKyAgNC4gSW4gbWFjb3NjLCBydW5uaW5nQXNPU1hBUFAgPT0gaXNBcXVhVGs7IGlkQ2FyYm9uQXF1YVRrID09IGlzQ2FyYm9uVGsKKworLSBJc3N1ZSAjMjcxMTc6IE1ha2UgY29sb3JpemVyIGh0ZXN0IGFuZCB0dXJ0bGVkZW1vIHdvcmsgd2l0aCBkYXJrIHRoZW1lcy4KKyAgTW92ZSBjb2RlIGZvciBjb25maWd1cmluZyB0ZXh0IHdpZGdldCBjb2xvcnMgdG8gYSBuZXcgZnVuY3Rpb24uCisKKy0gSXNzdWUgIzI0MjI1OiBSZW5hbWUgbWFueSBgaWRsZWxpYi8qLnB5YCBhbmQgYGlkbGVfdGVzdC90ZXN0XyoucHlgIGZpbGVzLgorICBFZGl0IGZpbGVzIHRvIHJlcGxhY2Ugb2xkIG5hbWVzIHdpdGggbmV3IG5hbWVzIHdoZW4gdGhlIG9sZCBuYW1lCisgIHJlZmVycmVkIHRvIHRoZSBtb2R1bGUgcmF0aGVyIHRoYW4gdGhlIGNsYXNzIGl0IGNvbnRhaW5lZC4KKyAgU2VlIHRoZSBpc3N1ZSBhbmQgSURMRSBzZWN0aW9uIGluIFdoYXQncyBOZXcgaW4gMy42IGZvciBtb3JlLgorCistIElzc3VlICMyNjY3MzogV2hlbiB0ayByZXBvcnRzIGZvbnQgc2l6ZSBhcyAwLCBjaGFuZ2UgdG8gc2l6ZSAxMC4KKyAgU3VjaCBmb250cyBvbiBMaW51eCBwcmV2ZW50ZWQgdGhlIGNvbmZpZ3VyYXRpb24gZGlhbG9nIGZyb20gb3BlbmluZy4KKworLSBJc3N1ZSAjMjE5Mzk6IEFkZCB0ZXN0IGZvciBJRExFJ3MgcGVyY29sYXRvci4KKyAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyLgorCistIElzc3VlICMyMTY3NjogQWRkIHRlc3QgZm9yIElETEUncyByZXBsYWNlIGRpYWxvZy4KKyAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyLgorCistIElzc3VlICMxODQxMDogQWRkIHRlc3QgZm9yIElETEUncyBzZWFyY2ggZGlhbG9nLgorICBPcmlnaW5hbCBwYXRjaCBieSBXZXN0bGV5IE1hcnTDrW5lei4KKworLSBJc3N1ZSAjMjE3MDM6IEFkZCB0ZXN0IGZvciB1bmRvIGRlbGVnYXRvci4gIFBhdGNoIG1vc3RseSBieQorICBTYWltYWRoYXYgSGVibGlrYXIgLgorCistIElzc3VlICMyNzA0NDogQWRkIENvbmZpZ0RpYWxvZy5yZW1vdmVfdmFyX2NhbGxiYWNrcyB0byBzdG9wIG1lbW9yeSBsZWFrcy4KKworLSBJc3N1ZSAjMjM5Nzc6IEFkZCBtb3JlIGFzc2VydHMgdG8gdGVzdF9kZWxlZ2F0b3IuCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMTY0ODQ6IENoYW5nZSB0aGUgZGVmYXVsdCBQWVRIT05ET0NTIFVSTCB0byAiaHR0cHM6IiwgYW5kIGZpeCB0aGUKKyAgcmVzdWx0aW5nIGxpbmtzIHRvIHVzZSBsb3dlcmNhc2UuICBQYXRjaCBieSBTZWFuIFJvZG1hbiwgdGVzdCBieSBLYXVzaGlrCisgIE5hZGlrdWRpdGkuCisKKy0gSXNzdWUgIzI0MTM2OiBEb2N1bWVudCB0aGUgbmV3IFBFUCA0NDggdW5wYWNraW5nIHN5bnRheCBvZiAzLjUuCisKKy0gSXNzdWUgIzIyNTU4OiBBZGQgcmVtYWluaW5nIGRvYyBsaW5rcyB0byBzb3VyY2UgY29kZSBmb3IgUHl0aG9uLWNvZGVkIG1vZHVsZXMuCisgIFBhdGNoIGJ5IFlvbmkgTGF2aS4KKworVGVzdHMKKy0tLS0tCisKKy0gSXNzdWUgIzI1Mjg1OiByZWdydGVzdCBub3cgdXNlcyBzdWJwcm9jZXNzZXMgd2hlbiB0aGUgLWoxIGNvbW1hbmQgbGluZSBvcHRpb24KKyAgaXMgdXNlZDogZWFjaCB0ZXN0IGZpbGUgcnVucyBpbiBhIGZyZXNoIGNoaWxkIHByb2Nlc3MuIEJlZm9yZSwgdGhlIC1qMSBvcHRpb24KKyAgd2FzIGlnbm9yZWQuCisKKy0gSXNzdWUgIzI1Mjg1OiBUb29scy9idWlsZGJvdC90ZXN0LmJhdCBzY3JpcHQgbm93IHVzZXMgLWoxIGJ5IGRlZmF1bHQgdG8gcnVuCisgIGVhY2ggdGVzdCBmaWxlIGluIGZyZXNoIGNoaWxkIHByb2Nlc3MuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjcwNjQ6IFRoZSBweS5leGUgbGF1bmNoZXIgbm93IGRlZmF1bHRzIHRvIFB5dGhvbiAzLgorICBUaGUgV2luZG93cyBsYXVuY2hlciBgYHB5LmV4ZWBgIG5vIGxvbmdlciBwcmVmZXJzIGFuIGluc3RhbGxlZAorICBQeXRob24gMiB2ZXJzaW9uIG92ZXIgUHl0aG9uIDMgYnkgZGVmYXVsdCB3aGVuIHVzZWQgaW50ZXJhY3RpdmVseS4KKworQnVpbGQKKy0tLS0tCisKKy0gSXNzdWUgIzI3MjI5OiBGaXggdGhlIGNyb3NzLWNvbXBpbGluZyBwZ2VuIHJ1bGUgZm9yIGluLXRyZWUgYnVpbGRzLiAgUGF0Y2gKKyAgYnkgWGF2aWVyIGRlIEdheWUuCisKKy0gSXNzdWUgIzI2OTMwOiBVcGRhdGUgT1MgWCAxMC41KyAzMi1iaXQtb25seSBpbnN0YWxsZXIgdG8gYnVpbGQKKyAgYW5kIGxpbmsgd2l0aCBPcGVuU1NMIDEuMC4yaC4KKworTWlzYworLS0tLQorCistIElzc3VlICMxNzUwMCwgYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9weXRob24vcHl0aG9uZG90b3JnL2lzc3Vlcy85NDU6IFJlbW92ZQorICB1bnVzZWQgYW5kIG91dGRhdGVkIGljb25zLgorCitDIEFQSQorLS0tLS0KKworLSBJc3N1ZSAjMjcxODY6IEFkZCB0aGUgUHlPU19GU1BhdGgoKSBmdW5jdGlvbiAocGFydCBvZiBQRVAgNTE5KS4KKworLSBJc3N1ZSAjMjYyODI6IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpIG5vdyBzdXBwb3J0cyBwb3NpdGlvbmFsLW9ubHkKKyAgcGFyYW1ldGVycy4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKKy0gSXNzdWUgIzI2MjgyOiBBcmd1bWVudCBDbGluaWMgbm93IHN1cHBvcnRzIHBvc2l0aW9uYWwtb25seSBhbmQga2V5d29yZAorICBwYXJhbWV0ZXJzIGluIHRoZSBzYW1lIGZ1bmN0aW9uLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDMuNi4wIGFscGhhIDE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTYtMDUtMTYKKworQ29yZSBhbmQgQnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKIC0gSXNzdWUgIzIwMDQxOiBGaXhlZCBUeXBlRXJyb3Igd2hlbiBmcmFtZS5mX3RyYWNlIGlzIHNldCB0byBOb25lLgogICBQYXRjaCBieSBYYXZpZXIgZGUgR2F5ZS4KIApAQCAtMzU0LDExICsxMDk3LDE3IEBACiAKIC0gSXNzdWUgIzI2OTkxOiBGaXggcG9zc2libGUgcmVmbGVhayB3aGVuIGNyZWF0aW5nIGEgZnVuY3Rpb24gd2l0aCBhbm5vdGF0aW9ucy4KIAotLSBJc3N1ZSAjMjcwMzk6IEZpeGVkIGJ5dGVhcnJheS5yZW1vdmUoKSBmb3IgdmFsdWVzIGdyZWF0ZXIgdGhhbiAxMjcuICBQYXRjaCBieQotICBKb2UgSmV2bmlrLgorLSBJc3N1ZSAjMjcwMzk6IEZpeGVkIGJ5dGVhcnJheS5yZW1vdmUoKSBmb3IgdmFsdWVzIGdyZWF0ZXIgdGhhbiAxMjcuICBCYXNlZCBvbgorICBwYXRjaCBieSBKb2UgSmV2bmlrLgogCiAtIElzc3VlICMyMzY0MDogaW50LmZyb21fYnl0ZXMoKSBubyBsb25nZXIgYnlwYXNzZXMgY29uc3RydWN0b3JzIGZvciBzdWJjbGFzc2VzLgogCistIElzc3VlICMyNzAwNTogT3B0aW1pemVkIHRoZSBmbG9hdC5mcm9taGV4KCkgY2xhc3MgbWV0aG9kIGZvciBleGFjdCBmbG9hdC4KKyAgSXQgaXMgbm93IDIgdGltZXMgZmFzdGVyLgorCistIElzc3VlICMxODUzMTogU2luZ2xlIHZhci1rZXl3b3JkIGFyZ3VtZW50IG9mIGRpY3Qgc3VidHlwZSB3YXMgcGFzc2VkCisgIHVuc2NhdGhlZCB0byB0aGUgQy1kZWZpbmVkIGZ1bmN0aW9uLiAgTm93IGl0IGlzIGNvbnZlcnRlZCB0byBleGFjdCBkaWN0LgorCiAtIElzc3VlICMyNjgxMTogZ2MuZ2V0X29iamVjdHMoKSBubyBsb25nZXIgY29udGFpbnMgYSBicm9rZW4gdHVwbGUgd2l0aCBOVUxMCiAgIHBvaW50ZXIuCiAKQEAgLTM2OCwxMSArMTExNywyNiBAQAogICBpbnRlcnBvbGF0aW9uIGluIC5weXBpcmMgZmlsZXMsIG1hdGNoaW5nIGJlaGF2aW9yIGluIFB5dGhvbgogICAyLjcgYW5kIFNldHVwdG9vbHMgMTkuMC4KIAorLSBJc3N1ZSAjMjYyNDk6IE1lbW9yeSBmdW5jdGlvbnMgb2YgdGhlIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AgZG9tYWluCisgICg6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCkgbm93IHVzZSB0aGUgOnJlZjpgcHltYWxsb2MgYWxsb2NhdG9yIDxweW1hbGxvYz5gCisgIHJhdGhlciB0aGFuIHN5c3RlbSA6YzpmdW5jOmBtYWxsb2NgLiBBcHBsaWNhdGlvbnMgY2FsbGluZworICA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgIHdpdGhvdXQgaG9sZGluZyB0aGUgR0lMIGNhbiBub3cgY3Jhc2g6IHVzZQorICBgYFBZVEhPTk1BTExPQz1kZWJ1Z2BgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHZhbGlkYXRlIHRoZSB1c2FnZSBvZiBtZW1vcnkKKyAgYWxsb2NhdG9ycyBpbiB5b3VyIGFwcGxpY2F0aW9uLgorCistIElzc3VlICMyNjgwMjogT3B0aW1pemUgZnVuY3Rpb24gY2FsbHMgb25seSB1c2luZyB1bnBhY2tpbmcgbGlrZQorICBgYGZ1bmMoKnR1cGxlKWBgIChubyBvdGhlciBwb3NpdGlvbmFsIGFyZ3VtZW50LCBubyBrZXl3b3JkKTogYXZvaWQgY29weWluZworICB0aGUgdHVwbGUuIFBhdGNoIHdyaXR0ZW4gYnkgSm9lIEpldm5pay4KKwogLSBJc3N1ZSAjMjY2NTk6IE1ha2UgdGhlIGJ1aWx0aW4gc2xpY2UgdHlwZSBzdXBwb3J0IGN5Y2xlIGNvbGxlY3Rpb24uCiAKIC0gSXNzdWUgIzI2NzE4OiBzdXBlci5fX2luaXRfXyBubyBsb25nZXIgbGVha3MgbWVtb3J5IGlmIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KICAgTk9URTogQSBkaXJlY3QgY2FsbCBvZiBzdXBlci5fX2luaXRfXyBpcyBub3QgZW5kb3JzZWQhCiAKKy0gSXNzdWUgIzI3MTM4OiBGaXggdGhlIGRvYyBjb21tZW50IGZvciBGaWxlRmluZGVyLmZpbmRfc3BlYygpLgorCistIElzc3VlICMyNzE0NzogTWVudGlvbiBQRVAgNDIwIGluIHRoZSBpbXBvcnRsaWIgZG9jcy4KKwogLSBJc3N1ZSAjMjUzMzk6IFBZVEhPTklPRU5DT0RJTkcgbm93IGhhcyBwcmlvcml0eSBvdmVyIGxvY2FsZSBpbiBzZXR0aW5nIHRoZQogICBlcnJvciBoYW5kbGVyIGZvciBzdGRpbiBhbmQgc3Rkb3V0LgogCkBAIC0zODEsOSArMTE0NSw0MSBAQAogICBieXRlYXJyYXksIGxpc3QsIHR1cGxlLCBzZXQsIGZyb3plbnNldCwgZGljdCwgT3JkZXJlZERpY3QsIGNvcnJlc3BvbmRpbmcKICAgdmlld3MgYW5kIG9zLnNjYW5kaXIoKSBpdGVyYXRvci4KIAorLSBJc3N1ZSAjMjY1NzQ6IE9wdGltaXplIGBgYnl0ZXMucmVwbGFjZShiJycsIGInLicpYGAgYW5kCisgIGBgYnl0ZWFycmF5LnJlcGxhY2UoYicnLCBiJy4nKWBgLiBQYXRjaCB3cml0dGVuIGJ5IEpvc2ggU25pZGVyLgorCiAtIElzc3VlICMyNjU4MTogSWYgY29kaW5nIGNvb2tpZSBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMgb24gYSBsaW5lIGluCiAgIFB5dGhvbiBzb3VyY2UgY29kZSBmaWxlLCBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgdGFrZW4gdG8gYWNjb3VudC4KIAorLSBJc3N1ZSAjMTk3MTE6IEFkZCB0ZXN0cyBmb3IgcmVsb2FkaW5nIG5hbWVzcGFjZSBwYWNrYWdlcy4KKworLSBJc3N1ZSAjMjEwOTk6IFN3aXRjaCBhcHBsaWNhYmxlIGltcG9ydGxpYiB0ZXN0cyB0byB1c2UgUEVQIDQ1MSBBUEkuCisKKy0gSXNzdWUgIzI2NTYzOiBEZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgbm93IHJhaXNlIGEgZmF0YWwKKyAgZXJyb3IgaWYgZnVuY3Rpb25zIG9mIHRoZSA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgIGZhbWlseSBhcmUgY2FsbGVkIHdpdGhvdXQKKyAgaG9sZGluZyB0aGUgR0lMLgorCistIElzc3VlICMyNjU2NDogT24gZXJyb3IsIHRoZSBkZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgbm93IHVzZQorICB0aGUgOm1vZDpgdHJhY2VtYWxsb2NgIG1vZHVsZSB0byBnZXQgdGhlIHRyYWNlYmFjayB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMKKyAgYWxsb2NhdGVkLgorCistIElzc3VlICMyNjU1ODogVGhlIGRlYnVnIGhvb2tzIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yCisgIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2Agbm93IGRldGVjdCB3aGVuIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdpdGhvdXQKKyAgaG9sZGluZyB0aGUgR0lMLgorCistIElzc3VlICMyNjUxNjogQWRkIDplbnZ2YXI6YFBZVEhPTk1BTExPQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc2V0IHRoZQorICBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgYW5kL29yIGluc3RhbGwgZGVidWcgaG9va3MuCisKKy0gSXNzdWUgIzI2NTE2OiBUaGUgOmM6ZnVuYzpgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzYCBmdW5jdGlvbiBjYW4gbm93IGFsc28gYmUKKyAgdXNlZCBvbiBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLgorCistIElzc3VlICMyNjUxNjogVGhlIDplbnZ2YXI6YFBZVEhPTk1BTExPQ1NUQVRTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gbm93CisgIGFsc28gYmUgdXNlZCBvbiBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLiBJdCBub3cgaGFzIG5vIGVmZmVjdCBpZgorICBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLgorCistIElzc3VlICMyNjUxNjogSW4gZGVidWcgbW9kZSwgZGVidWcgaG9va3MgYXJlIG5vdyBhbHNvIGluc3RhbGxlZCBvbiBQeXRob24KKyAgbWVtb3J5IGFsbG9jYXRvcnMgd2hlbiBQeXRob24gaXMgY29uZmlndXJlZCB3aXRob3V0IHB5bWFsbG9jLgorCiAtIElzc3VlICMyNjQ2NDogRml4IHN0ci50cmFuc2xhdGUoKSB3aGVuIHN0cmluZyBpcyBBU0NJSSBhbmQgZmlyc3QgcmVwbGFjZW1lbnRzCiAgIHJlbW92ZXMgY2hhcmFjdGVyLCBidXQgbmV4dCByZXBsYWNlbWVudCB1c2VzIGEgbm9uLUFTQ0lJIGNoYXJhY3RlciBvciBhCiAgIHN0cmluZyBsb25nZXIgdGhhbiAxIGNoYXJhY3Rlci4gUmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjUuMC4KQEAgLTM5NiwxMSArMTE5MiwzNyBAQAogLSBJc3N1ZSAjMjYzMDI6IENvcnJlY3QgYmVoYXZpb3IgdG8gcmVqZWN0IGNvbW1hIGFzIGEgbGVnYWwgY2hhcmFjdGVyIGZvcgogICBjb29raWUgbmFtZXMuCiAKKy0gSXNzdWUgIzI2MTM2OiBVcGdyYWRlIHRoZSB3YXJuaW5nIHdoZW4gYSBnZW5lcmF0b3IgcmFpc2VzIFN0b3BJdGVyYXRpb24KKyAgZnJvbSBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIHRvIERlcHJlY2F0aW9uV2FybmluZy4gIFBhdGNoIGJ5IEFuaXNoCisgIFNoYWguCisKKy0gSXNzdWUgIzI2MjA0OiBUaGUgY29tcGlsZXIgbm93IGlnbm9yZXMgYWxsIGNvbnN0YW50IHN0YXRlbWVudHM6IGJ5dGVzLCBzdHIsCisgIGludCwgZmxvYXQsIGNvbXBsZXgsIG5hbWUgY29uc3RhbnRzIChOb25lLCBGYWxzZSwgVHJ1ZSksIEVsbGlwc2lzCisgIGFuZCBhc3QuQ29uc3RhbnQ7IG5vdCBvbmx5IHN0ciBhbmQgaW50LiBGb3IgZXhhbXBsZSwgYGAxLjBgYCBpcyBub3cgaWdub3JlZAorICBpbiBgYGRlZiBmKCk6IDEuMGBgLgorCiAtIElzc3VlICM0ODA2OiBBdm9pZCBtYXNraW5nIHRoZSBvcmlnaW5hbCBUeXBlRXJyb3IgZXhjZXB0aW9uIHdoZW4gdXNpbmcgc3RhcgogICAoKikgdW5wYWNraW5nIGluIGZ1bmN0aW9uIGNhbGxzLiAgQmFzZWQgb24gcGF0Y2ggYnkgSGFnZW4gRsO8cnN0ZW5hdSBhbmQKICAgRGFuaWVsIFVyYmFuLgogCi0tIElzc3VlICMyNzEzODogRml4IHRoZSBkb2MgY29tbWVudCBmb3IgRmlsZUZpbmRlci5maW5kX3NwZWMoKS4KKy0gSXNzdWUgIzI2MTQ2OiBBZGQgYSBuZXcga2luZCBvZiBBU1Qgbm9kZTogYGBhc3QuQ29uc3RhbnRgYC4gSXQgY2FuIGJlIHVzZWQKKyAgYnkgZXh0ZXJuYWwgQVNUIG9wdGltaXplcnMsIGJ1dCB0aGUgY29tcGlsZXIgZG9lcyBub3QgZW1pdCBkaXJlY3RseSBzdWNoCisgIG5vZGUuCisKKy0gSXNzdWUgIzIzNjAxOiAgU3BlZC11cCBhbGxvY2F0aW9uIG9mIGRpY3Qga2V5IG9iamVjdHMgYnkgdXNpbmcgUHl0aG9uJ3MKKyAgc21hbGwgb2JqZWN0IGFsbG9jYXRvci4gIChDb250cmlidXRlZCBieSBKdWxpYW4gVGF5bG9yLikKKworLSBJc3N1ZSAjMTgwMTg6IEltcG9ydCByYWlzZXMgSW1wb3J0RXJyb3IgaW5zdGVhZCBvZiBTeXN0ZW1FcnJvciBpZiBhIHJlbGF0aXZlCisgIGltcG9ydCBpcyBhdHRlbXB0ZWQgd2l0aG91dCBhIGtub3duIHBhcmVudCBwYWNrYWdlLgorCistIElzc3VlICMyNTg0MzogV2hlbiBjb21waWxpbmcgY29kZSwgZG9uJ3QgbWVyZ2UgY29uc3RhbnRzIGlmIHRoZXkgYXJlIGVxdWFsCisgIGJ1dCBoYXZlIGEgZGlmZmVyZW50IHR5cGVzLiBGb3IgZXhhbXBsZSwgYGBmMSwgZjIgPSBsYW1iZGE6IDEsIGxhbWJkYTogMS4wYGAKKyAgaXMgbm93IGNvcnJlY3RseSBjb21waWxlZCB0byB0d28gZGlmZmVyZW50IGZ1bmN0aW9uczogYGBmMSgpYGAgcmV0dXJucyBgYDFgYAorICAoYGBpbnRgYCkgYW5kIGBgZjIoKWBgIHJldHVybnMgYGAxLjBgYCAoYGBmbG9hdGBgKSwgZXZlbiBpZiBgYDFgYCBhbmQgYGAxLjBgYAorICBhcmUgZXF1YWwuCisKKy0gSXNzdWUgIzI2MTA3OiBUaGUgZm9ybWF0IG9mIHRoZSBgYGNvX2xub3RhYmBgIGF0dHJpYnV0ZSBvZiBjb2RlIG9iamVjdHMKKyAgY2hhbmdlcyB0byBzdXBwb3J0IG5lZ2F0aXZlIGxpbmUgbnVtYmVyIGRlbHRhLgogCiAtIElzc3VlICMyNjE1NDogQWRkIGEgbmV3IHByaXZhdGUgX1B5VGhyZWFkU3RhdGVfVW5jaGVja2VkR2V0KCkgZnVuY3Rpb24gdG8gZ2V0CiAgIHRoZSBjdXJyZW50IFB5dGhvbiB0aHJlYWQgc3RhdGUsIGJ1dCBkb24ndCBpc3N1ZSBhIGZhdGFsIGVycm9yIGlmIGl0IGlzIE5VTEwuCkBAIC00MDksMTUgKzEyMzEsOCBAQAogICBQeXRob24gMy41LjEgdG8gaGlkZSB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb24gb2YgYXRvbWljIEMgdHlwZXMsIHRvIGF2b2lkCiAgIGNvbXBpbGVyIGlzc3Vlcy4KIAotLSBJc3N1ZSAjMjYxOTQ6ICBEZXF1ZS5pbnNlcnQoKSBnYXZlIG9kZCByZXN1bHRzIGZvciBib3VuZGVkIGRlcXVlcyB0aGF0IGhhZAotICByZWFjaGVkIHRoZWlyIG1heGltdW0gc2l6ZS4gIE5vdyBhbiBJbmRleEVycm9yIHdpbGwgYmUgcmFpc2VkIHdoZW4gYXR0ZW1wdGluZwotICB0byBpbnNlcnQgaW50byBhIGZ1bGwgZGVxdWUuCi0KLS0gSXNzdWUgIzI1ODQzOiBXaGVuIGNvbXBpbGluZyBjb2RlLCBkb24ndCBtZXJnZSBjb25zdGFudHMgaWYgdGhleSBhcmUgZXF1YWwKLSAgYnV0IGhhdmUgYSBkaWZmZXJlbnQgdHlwZXMuIEZvciBleGFtcGxlLCBgYGYxLCBmMiA9IGxhbWJkYTogMSwgbGFtYmRhOiAxLjBgYAotICBpcyBub3cgY29ycmVjdGx5IGNvbXBpbGVkIHRvIHR3byBkaWZmZXJlbnQgZnVuY3Rpb25zOiBgYGYxKClgYCByZXR1cm5zIGBgMWBgCi0gIChgYGludGBgKSBhbmQgYGBmMigpYGAgcmV0dXJucyBgYDEuMGBgIChgYGludGBgKSwgZXZlbiBpZiBgYDFgYCBhbmQgYGAxLjBgYAotICBhcmUgZXF1YWwuCistIElzc3VlICMyNTc5MTogSWYgX19wYWNrYWdlX18gIT0gX19zcGVjX18ucGFyZW50IG9yIGlmIG5laXRoZXIgX19wYWNrYWdlX18gb3IKKyAgX19zcGVjX18gYXJlIGRlZmluZWQgdGhlbiBJbXBvcnRXYXJuaW5nIGlzIHJhaXNlZC4KIAogLSBJc3N1ZSAjMjI5OTU6IFtVUERBVEVdIENvbW1lbnQgb3V0IHRoZSBvbmUgb2YgdGhlIHBpY2tsZWFiaWxpdHkgdGVzdHMgaW4KICAgX1B5T2JqZWN0X0dldFN0YXRlKCkgZHVlIHRvIHJlZ3Jlc3Npb25zIG9ic2VydmVkIGluIEN5dGhvbi1iYXNlZCBwcm9qZWN0cy4KQEAgLTQ0NCw3ICsxMjU5LDEwIEBACiAtIElzc3VlICMyNTcwOTogRml4ZWQgcHJvYmxlbSB3aXRoIGluLXBsYWNlIHN0cmluZyBjb25jYXRlbmF0aW9uIGFuZCB1dGYtOAogICBjYWNoZS4KIAotLSBJc3N1ZSAjMjcxNDc6IE1lbnRpb24gUEVQIDQyMCBpbiB0aGUgaW1wb3J0bGliIGRvY3MuCistIElzc3VlICM1MzE5OiBOZXcgUHlfRmluYWxpemVFeCgpIEFQSSBhbGxvd2luZyBQeXRob24gdG8gc2V0IGFuIGV4aXQgc3RhdHVzCisgIG9mIDEyMCBvbiBmYWlsdXJlIHRvIGZsdXNoIGJ1ZmZlcmVkIHN0cmVhbXMuCisKKy0gSXNzdWUgIzI1NDg1OiB0ZWxuZXRsaWIuVGVsbmV0IGlzIG5vdyBhIGNvbnRleHQgbWFuYWdlci4KIAogLSBJc3N1ZSAjMjQwOTc6IEZpeGVkIGNyYXNoIGluIG9iamVjdC5fX3JlZHVjZV9fKCkgaWYgc2xvdCBuYW1lIGlzIGZyZWVkIGluc2lkZQogICBfX2dldGF0dHJfXy4KQEAgLTQ1Myw2ICsxMjcxLDg4IEBACiAgIF9fYnl0ZXNfXywgX190cnVuY19fLCBhbmQgX19mbG9hdF9fIHJldHVybmluZyBpbnN0YW5jZXMgb2Ygc3ViY2xhc3NlcyBvZgogICBieXRlcywgaW50LCBhbmQgZmxvYXQgdG8gc3ViY2xhc3NlcyBvZiBieXRlcywgaW50LCBhbmQgZmxvYXQgY29ycmVzcG9uZGluZ2x5LgogCistIElzc3VlICMyNTYzMDogRml4IGEgcG9zc2libGUgc2VnZmF1bHQgZHVyaW5nIGFyZ3VtZW50IHBhcnNpbmcgaW4gZnVuY3Rpb25zCisgIHRoYXQgYWNjZXB0IGZpbGVzeXN0ZW0gcGF0aHMuCisKKy0gSXNzdWUgIzIzNTY0OiBGaXhlZCBhIHBhcnRpYWxseSBicm9rZW4gc2FuaXR5IGNoZWNrIGluIHRoZSBfcG9zaXhzdWJwcm9jZXNzCisgIGludGVybmFscyByZWdhcmRpbmcgaG93IGZkc190b19wYXNzIHdlcmUgcGFzc2VkIHRvIHRoZSBjaGlsZC4gIFRoZSBidWcgaGFkCisgIG5vIGFjdHVhbCBpbXBhY3QgYXMgc3VicHJvY2Vzcy5weSBhbHJlYWR5IGF2b2lkZWQgaXQuCisKKy0gSXNzdWUgIzI1Mzg4OiBGaXhlZCB0b2tlbml6ZXIgY3Jhc2ggd2hlbiBwcm9jZXNzaW5nIHVuZGVjb2RhYmxlIHNvdXJjZSBjb2RlCisgIHdpdGggYSBudWxsIGJ5dGUuCisKKy0gSXNzdWUgIzI1NDYyOiBUaGUgaGFzaCBvZiB0aGUga2V5IG5vdyBpcyBjYWxjdWxhdGVkIG9ubHkgb25jZSBpbiBtb3N0CisgIG9wZXJhdGlvbnMgaW4gQyBpbXBsZW1lbnRhdGlvbiBvZiBPcmRlcmVkRGljdC4KKworLSBJc3N1ZSAjMjI5OTU6IERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgX19yZWR1Y2VfXyBhbmQgX19yZWR1Y2VfZXhfXyBub3cKKyAgcmVqZWN0cyBidWlsdGluIHR5cGVzIHdpdGggbm90IGRlZmluZWQgX19uZXdfXy4KKworLSBJc3N1ZSAjMjQ4MDI6IEF2b2lkIGJ1ZmZlciBvdmVycmVhZHMgd2hlbiBpbnQoKSwgZmxvYXQoKSwgY29tcGlsZSgpLCBleGVjKCkKKyAgYW5kIGV2YWwoKSBhcmUgcGFzc2VkIGJ5dGVzLWxpa2Ugb2JqZWN0cy4gIFRoZXNlIG9iamVjdHMgYXJlIG5vdAorICBuZWNlc3NhcmlseSB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBieXRlLCBidXQgdGhlIGZ1bmN0aW9ucyBhc3N1bWVkIHRoZXkgd2VyZS4KKworLSBJc3N1ZSAjMjU1NTU6IEZpeCBwYXJzZXIgYW5kIEFTVDogZmlsbCBsaW5lbm8gYW5kIGNvbF9vZmZzZXQgb2YgImFyZyIgbm9kZQorICB3aGVuIGNvbXBpbGluZyBBU1QgZnJvbSBQeXRob24gb2JqZWN0cy4KKworLSBJc3N1ZSAjMjQ3MjY6IEZpeGVkIGEgY3Jhc2ggYW5kIGxlYWtpbmcgTlVMTCBpbiByZXByKCkgb2YgT3JkZXJlZERpY3QgdGhhdAorICB3YXMgbXV0YXRlZCBieSBkaXJlY3QgY2FsbHMgb2YgZGljdCBtZXRob2RzLgorCistIElzc3VlICMyNTQ0OTogSXRlcmF0aW5nIE9yZGVyZWREaWN0IHdpdGgga2V5cyB3aXRoIHVuc3RhYmxlIGhhc2ggbm93IHJhaXNlcworICBLZXlFcnJvciBpbiBDIGltcGxlbWVudGF0aW9ucyBhcyB3ZWxsIGFzIGluIFB5dGhvbiBpbXBsZW1lbnRhdGlvbi4KKworLSBJc3N1ZSAjMjUzOTU6IEZpeGVkIGNyYXNoIHdoZW4gaGlnaGx5IG5lc3RlZCBPcmRlcmVkRGljdCBzdHJ1Y3R1cmVzIHdlcmUKKyAgZ2FyYmFnZSBjb2xsZWN0ZWQuCisKKy0gSXNzdWUgIzI1NDAxOiBPcHRpbWl6ZSBieXRlcy5mcm9taGV4KCkgYW5kIGJ5dGVhcnJheS5mcm9taGV4KCk6IHRoZXkgYXJlIG5vdworICBiZXR3ZWVuIDJ4IGFuZCAzLjV4IGZhc3Rlci4KKworLSBJc3N1ZSAjMjUzOTk6IE9wdGltaXplIGJ5dGVhcnJheSAlIGFyZ3MgdXNpbmcgdGhlIG5ldyBwcml2YXRlIF9QeUJ5dGVzV3JpdGVyCisgIEFQSS4gRm9ybWF0dGluZyBpcyBub3cgYmV0d2VlbiAyLjUgYW5kIDUgdGltZXMgZmFzdGVyLgorCistIElzc3VlICMyNTI3NDogc3lzLnNldHJlY3Vyc2lvbmxpbWl0KCkgbm93IHJhaXNlcyBhIFJlY3Vyc2lvbkVycm9yIGlmIHRoZSBuZXcKKyAgcmVjdXJzaW9uIGxpbWl0IGlzIHRvbyBsb3cgZGVwZW5kaW5nIGF0IHRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aC4gTW9kaWZ5CisgIGFsc28gdGhlICJsb3dlci13YXRlciBtYXJrIiBmb3JtdWxhIHRvIG1ha2UgaXQgbW9ub3RvbmljLiBUaGlzIG1hcmsgaXMgdXNlZAorICB0byBkZWNpZGUgd2hlbiB0aGUgb3ZlcmZsb3dlZCBmbGFnIG9mIHRoZSB0aHJlYWQgc3RhdGUgaXMgcmVzZXQuCisKKy0gSXNzdWUgIzI0NDAyOiBGaXggaW5wdXQoKSB0byBwcm9tcHQgdG8gdGhlIHJlZGlyZWN0ZWQgc3Rkb3V0IHdoZW4KKyAgc3lzLnN0ZG91dC5maWxlbm8oKSBmYWlscy4KKworLSBJc3N1ZSAjMjUzNDk6IE9wdGltaXplIGJ5dGVzICUgYXJncyB1c2luZyB0aGUgbmV3IHByaXZhdGUgX1B5Qnl0ZXNXcml0ZXIgQVBJLgorICBGb3JtYXR0aW5nIGlzIG5vdyB1cCB0byAyIHRpbWVzIGZhc3Rlci4KKworLSBJc3N1ZSAjMjQ4MDY6IFByZXZlbnQgYnVpbHRpbiB0eXBlcyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBiZSBzdWJjbGFzc2VkIGZyb20KKyAgYmVpbmcgc3ViY2xhc3NlZCB0aHJvdWdoIG11bHRpcGxlIGluaGVyaXRhbmNlLgorCistIElzc3VlICMyNTMwMTogVGhlIFVURi04IGRlY29kZXIgaXMgbm93IHVwIHRvIDE1IHRpbWVzIGFzIGZhc3QgZm9yIGVycm9yCisgIGhhbmRsZXJzOiBgYGlnbm9yZWBgLCBgYHJlcGxhY2VgYCBhbmQgYGBzdXJyb2dhdGVlc2NhcGVgYC4KKworLSBJc3N1ZSAjMjQ4NDg6IEZpeGVkIGEgbnVtYmVyIG9mIGJ1Z3MgaW4gVVRGLTcgZGVjb2Rpbmcgb2YgbWlzZm9ybWVkIGRhdGEuCisKKy0gSXNzdWUgIzI1MjY3OiBUaGUgVVRGLTggZW5jb2RlciBpcyBub3cgdXAgdG8gNzUgdGltZXMgYXMgZmFzdCBmb3IgZXJyb3IKKyAgaGFuZGxlcnM6IGBgaWdub3JlYGAsIGBgcmVwbGFjZWBgLCBgYHN1cnJvZ2F0ZWVzY2FwZWBgLCBgYHN1cnJvZ2F0ZXBhc3NgYC4KKyAgUGF0Y2ggY28td3JpdHRlbiB3aXRoIFNlcmhpeSBTdG9yY2hha2EuCisKKy0gSXNzdWUgIzI1MjgwOiBJbXBvcnQgdHJhY2UgbWVzc2FnZXMgZW1pdHRlZCBpbiB2ZXJib3NlICgtdikgbW9kZSBhcmUgbm8KKyAgbG9uZ2VyIGZvcm1hdHRlZCB0d2ljZS4KKworLSBJc3N1ZSAjMjUyMjc6IE9wdGltaXplIEFTQ0lJIGFuZCBsYXRpbjEgZW5jb2RlcnMgd2l0aCB0aGUgYGBzdXJyb2dhdGVlc2NhcGVgYAorICBlcnJvciBoYW5kbGVyOiB0aGUgZW5jb2RlcnMgYXJlIG5vdyB1cCB0byAzIHRpbWVzIGFzIGZhc3QuIEluaXRpYWwgcGF0Y2gKKyAgd3JpdHRlbiBieSBTZXJoaXkgU3RvcmNoYWthLgorCistIElzc3VlICMyNTAwMzogT24gU29sYXJpcyAxMS4zIG9yIG5ld2VyLCBvcy51cmFuZG9tKCkgbm93IHVzZXMgdGhlCisgIGdldHJhbmRvbSgpIGZ1bmN0aW9uIGluc3RlYWQgb2YgdGhlIGdldGVudHJvcHkoKSBmdW5jdGlvbi4gVGhlIGdldGVudHJvcHkoKQorICBmdW5jdGlvbiBpcyBibG9ja2luZyB0byBnZW5lcmF0ZSB2ZXJ5IGdvb2QgcXVhbGl0eSBlbnRyb3B5LCBvcy51cmFuZG9tKCkKKyAgZG9lc24ndCBuZWVkIHN1Y2ggaGlnaC1xdWFsaXR5IGVudHJvcHkuCisKKy0gSXNzdWUgIzkyMzI6IE1vZGlmeSBQeXRob24ncyBncmFtbWFyIHRvIGFsbG93IHRyYWlsaW5nIGNvbW1hcyBpbiB0aGUKKyAgYXJndW1lbnQgbGlzdCBvZiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLiAgRm9yIGV4YW1wbGUsICJkZWYgZihcKiwgYSA9CisgIDMsKTogcGFzcyIgaXMgbm93IGxlZ2FsLiBQYXRjaCBmcm9tIE1hcmsgRGlja2luc29uLgorCistIElzc3VlICMyNDk2NTogSW1wbGVtZW50IFBFUCA0OTggIkxpdGVyYWwgU3RyaW5nIEludGVycG9sYXRpb24iLiBUaGlzCisgIGFsbG93cyB5b3UgdG8gZW1iZWQgZXhwcmVzc2lvbnMgaW5zaWRlIGYtc3RyaW5ncywgd2hpY2ggYXJlCisgIGNvbnZlcnRlZCB0byBub3JtYWwgc3RyaW5ncyBhdCBydW4gdGltZS4gR2l2ZW4geD0zLCB0aGVuCisgIGYndmFsdWU9e3h9JyA9PSAndmFsdWU9MycuIFBhdGNoIGJ5IEVyaWMgVi4gU21pdGguCisKIC0gSXNzdWUgIzI2NDc4OiBGaXggc2VtYW50aWMgYnVncyB3aGVuIHVzaW5nIGJpbmFyeSBvcGVyYXRvcnMgd2l0aCBkaWN0aW9uYXJ5CiAgIHZpZXdzIGFuZCB0dXBsZXMuCiAKQEAgLTQ2MSw3OSArMTM2MSwyNyBAQAogCiAtIElzc3VlICMyNTY2MDogRml4IFRBQiBrZXkgYmVoYXZpb3VyIGluIFJFUEwgd2l0aCByZWFkbGluZS4KIAorLSBJc3N1ZSAjMjYyODg6IE9wdGltaXplIFB5TG9uZ19Bc0RvdWJsZS4KKworLSBJc3N1ZXMgIzI2Mjg5IGFuZCAjMjYzMTU6IE9wdGltaXplIGZsb29yIGFuZCBtb2R1bG8gZGl2aXNpb24gZm9yCisgIHNpbmdsZS1kaWdpdCBsb25ncy4gIE1pY3JvYmVuY2htYXJrcyBzaG93IDItMi41eCBpbXByb3ZlbWVudC4gIEJ1aWx0LWluCisgICdkaXZtb2QnIGZ1bmN0aW9uIGlzIG5vdyBhbHNvIH4xMCUgZmFzdGVyLgorCiAtIElzc3VlICMyNTg4NzogUmFpc2UgYSBSdW50aW1lRXJyb3Igd2hlbiBhIGNvcm91dGluZSBvYmplY3QgaXMgYXdhaXRlZAogICBtb3JlIHRoYW4gb25jZS4KIAotLSBJc3N1ZSAjMjcyNDM6IFVwZGF0ZSB0aGUgX19haXRlcl9fIHByb3RvY29sOiBpbnN0ZWFkIG9mIHJldHVybmluZwotICBhbiBhd2FpdGFibGUgdGhhdCByZXNvbHZlcyB0byBhbiBhc3luY2hyb25vdXMgaXRlcmF0b3IsIHRoZSBhc3luY2hyb25vdXMKLSAgaXRlcmF0b3Igc2hvdWxkIGJlIHJldHVybmVkIGRpcmVjdGx5LiAgRG9pbmcgdGhlIGZvcm1lciB3aWxsIHRyaWdnZXIgYQotICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLgotCi0KIExpYnJhcnkKIC0tLS0tLS0KIAotLSBbU2VjdXJpdHldIElzc3VlICMyNjU1NjogVXBkYXRlIGV4cGF0IHRvIDIuMS4xLCBmaXhlcyBDVkUtMjAxNS0xMjgzLgotCi0tIFtTZWN1cml0eV0gRml4IFRMUyBzdHJpcHBpbmcgdnVsbmVyYWJpbGl0eSBpbiBzbXRwbGliLCBDVkUtMjAxNi0wNzcyLgotICBSZXBvcnRlZCBieSBUZWFtIE9zdHN0cm9tCi0KLS0gSXNzdWUgIzIxMzg2OiBJbXBsZW1lbnQgbWlzc2luZyBJUHY0QWRkcmVzcy5pc19nbG9iYWwgcHJvcGVydHkuICBJdCB3YXMKLSAgZG9jdW1lbnRlZCBzaW5jZSAwN2E1NjEwYmFlOWQuICBJbml0aWFsIHBhdGNoIGJ5IFJvZ2VyIEx1ZXRoaS4KLQotLSBJc3N1ZSAjMjA5MDA6IGRpc3R1dGlscyByZWdpc3RlciBjb21tYW5kIG5vdyBkZWNvZGVzIEhUVFAgcmVzcG9uc2VzCi0gIGNvcnJlY3RseS4gIEluaXRpYWwgcGF0Y2ggYnkgaW5ncmlkLgotCi0tIEEgbmV3IHZlcnNpb24gb2YgdHlwaW5nLnB5IHByb3ZpZGVzIHNldmVyYWwgbmV3IGNsYXNzZXMgYW5kCi0gIGZlYXR1cmVzOiBAb3ZlcmxvYWQgb3V0c2lkZSBzdHVicywgUmV2ZXJzaWJsZSwgRGVmYXVsdERpY3QsIFRleHQsCi0gIENvbnRleHRNYW5hZ2VyLCBUeXBlW10sIE5ld1R5cGUoKSwgVFlQRV9DSEVDS0lORywgYW5kIG51bWVyb3VzIGJ1ZwotICBmaXhlcyAobm90ZSB0aGF0IHNvbWUgb2YgdGhlIG5ldyBmZWF0dXJlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZCBpbgotICBteXB5IG9yIG90aGVyIHN0YXRpYyBhbmFseXplcnMpLiAgQWxzbyBjbGFzc2VzIGZvciBQRVAgNDkyCi0gIChBd2FpdGFibGUsIEFzeW5jSXRlcmFibGUsIEFzeW5jSXRlcmF0b3IpIGhhdmUgYmVlbiBhZGRlZCAoaW4gZmFjdAotICB0aGV5IG1hZGUgaXQgaW50byAzLjUuMSBidXQgd2VyZSBuZXZlciBtZW50aW9uZWQpLgotCi0tIElzc3VlICMyNTczODogU3RvcCBodHRwLnNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyLnNlbmRfZXJyb3IoKSBmcm9tCi0gIHNlbmRpbmcgYSBtZXNzYWdlIGJvZHkgZm9yIDIwNSBSZXNldCBDb250ZW50LiAgQWxzbywgZG9uJ3Qgc2VuZCBDb250ZW50Ci0gIGhlYWRlciBmaWVsZHMgaW4gcmVzcG9uc2VzIHRoYXQgZG9uJ3QgaGF2ZSBhIGJvZHkuICBQYXRjaCBieSBTdXN1bXUKLSAgS29zaGliYS4KLQotLSBJc3N1ZSAjMjEzMTM6IEZpeCB0aGUgInBsYXRmb3JtIiBtb2R1bGUgdG8gdG9sZXJhdGUgd2hlbiBzeXMudmVyc2lvbgotICBjb250YWlucyB0cnVuY2F0ZWQgYnVpbGQgaW5mb3JtYXRpb24uCi0KLS0gW1NlY3VyaXR5XSBJc3N1ZSAjMjY4Mzk6IE9uIExpbnV4LCA6ZnVuYzpgb3MudXJhbmRvbWAgbm93IGNhbGxzCi0gIGBgZ2V0cmFuZG9tKClgYCB3aXRoIGBgR1JORF9OT05CTE9DS2BgIHRvIGZhbGwgYmFjayBvbiByZWFkaW5nCi0gIGBgL2Rldi91cmFuZG9tYGAgaWYgdGhlIHVyYW5kb20gZW50cm9weSBwb29sIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuIFBhdGNoCi0gIHdyaXR0ZW4gYnkgQ29sbSBCdWNrbGV5LgotCi0tIElzc3VlICMyNzE2NDogSW4gdGhlIHpsaWIgbW9kdWxlLCBhbGxvdyBkZWNvbXByZXNzaW5nIHJhdyBEZWZsYXRlIHN0cmVhbXMKLSAgd2l0aCBhIHByZWRlZmluZWQgemRpY3QuICBCYXNlZCBvbiBwYXRjaCBieSBYaWFuZyBaaGFuZy4KLQotLSBJc3N1ZSAjMjQyOTE6IEZpeCB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXIuV1NHSVJlcXVlc3RIYW5kbGVyIHRvIGNvbXBsZXRlbHkKLSAgd3JpdGUgZGF0YSB0byB0aGUgY2xpZW50LiAgUHJldmlvdXNseSBpdCBjb3VsZCBkbyBwYXJ0aWFsIHdyaXRlcyBhbmQKLSAgdHJ1bmNhdGUgZGF0YS4gIEFsc28sIHdzZ2lyZWYuaGFuZGxlci5TZXJ2ZXJIYW5kbGVyIGNhbiBub3cgaGFuZGxlIHN0ZG91dAotICBkb2luZyBwYXJ0aWFsIHdyaXRlcywgYnV0IHRoaXMgaXMgZGVwcmVjYXRlZC4KLQotLSBJc3N1ZSAjMjY4MDk6IEFkZCBgYF9fYWxsX19gYCB0byA6bW9kOmBzdHJpbmdgLiAgUGF0Y2ggYnkgRW1hbnVlbCBCYXJyeS4KLQotLSBJc3N1ZSAjMjYzNzM6IHN1YnByb2Nlc3MuUG9wZW4uY29tbXVuaWNhdGUgbm93IGNvcnJlY3RseSBpZ25vcmVzCi0gIEJyb2tlblBpcGVFcnJvciB3aGVuIHRoZSBjaGlsZCBwcm9jZXNzIGRpZXMgYmVmb3JlIC5jb21tdW5pY2F0ZSgpCi0gIGlzIGNhbGxlZCBpbiBtb3JlL2FsbCBjaXJjdW1zdGFuY2VzLgotCi0tIElzc3VlICMyMTc3NjogZGlzdHV0aWxzLnVwbG9hZCBub3cgY29ycmVjdGx5IGhhbmRsZXMgSFRUUEVycm9yLgotICBJbml0aWFsIHBhdGNoIGJ5IENsYXVkaXUgUG9wYS4KLQotLSBJc3N1ZSAjMjcxMTQ6IEZpeCBTU0xDb250ZXh0Ll9sb2FkX3dpbmRvd3Nfc3RvcmVfY2VydHMgZmFpbHMgd2l0aAotICBQZXJtaXNzaW9uRXJyb3IKLQotLSBJc3N1ZSAjMTgzODM6IEF2b2lkIGNyZWF0aW5nIGR1cGxpY2F0ZSBmaWx0ZXJzIHdoZW4gdXNpbmcgZmlsdGVyd2FybmluZ3MKLSAgYW5kIHNpbXBsZWZpbHRlci4gIEJhc2VkIG9uIHBhdGNoIGJ5IEFsZXggU2hrb3AuCi0KIC0gSXNzdWUgIzI3MDU3OiBGaXggb3Muc2V0X2luaGVyaXRhYmxlKCkgb24gQW5kcm9pZCwgaW9jdGwoKSBpcyBibG9ja2VkIGJ5CiAgIFNFTGludXggYW5kIGZhaWxzIHdpdGggRUFDQ0VTUy4gVGhlIGZ1bmN0aW9uIG5vdyBmYWxscyBiYWNrIHRvIGZjbnRsKCkuCiAgIFBhdGNoIHdyaXR0ZW4gYnkgTWljaGHFgiBCZWRuYXJza2kuCiAKIC0gSXNzdWUgIzI3MDE0OiBGaXggaW5maW5pdGUgcmVjdXJzaW9uIHVzaW5nIHR5cGluZy5weS4gIFRoYW5rcyB0byBLYWxsZSBUdXVyZSEKIAorLSBJc3N1ZSAjMjcwMzE6IFJlbW92ZWQgZHVtbXkgbWV0aG9kcyBpbiBUa2ludGVyIHdpZGdldCBjbGFzc2VzOiB0a19tZW51QmFyKCkKKyAgYW5kIHRrX2JpbmRGb3JUcmF2ZXJzYWwoKS4KKwogLSBJc3N1ZSAjMTQxMzI6IEZpeCB1cmxsaWIucmVxdWVzdCByZWRpcmVjdCBoYW5kbGluZyB3aGVuIHRoZSB0YXJnZXQgb25seSBoYXMKICAgYSBxdWVyeSBzdHJpbmcuICBPcmlnaW5hbCBmaXggYnkgSsOhbiBKYW5lY2guCiAKQEAgLTU0Myw2ICsxMzkxLDE4IEBACiAgIHRvIGJlIEFTQ0lJLWVuY29kYWJsZSwgb3RoZXJ3aXNlIGEgVW5pY29kZUVuY29kZUVycm9yIGlzIHJhaXNlZC4gIEJhc2VkIG9uCiAgIHBhdGNoIGJ5IENocmlzdGlhbiBIZWltZXMuCiAKKy0gSXNzdWUgIzI3MDMzOiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZGVjb2RlX2RhdGEgcGFyYW1ldGVyIGZvcgorICBzbXRwZC5TTVRQQ2hhbm5lbCBhbmQgc210cGQuU01UUFNlcnZlciBjb25zdHJ1Y3RvcnMgaXMgY2hhbmdlZCB0byBGYWxzZS4KKworLSBJc3N1ZSAjMjcwMzQ6IFJlbW92ZWQgZGVwcmVjYXRlZCBjbGFzcyBhc3luY2hhdC5maWZvLgorCistIElzc3VlICMyNjg3MDogQWRkZWQgcmVhZGxpbmUuc2V0X2F1dG9faGlzdG9yeSgpLCB3aGljaCBjYW4gc3RvcCBlbnRyaWVzCisgIGJlaW5nIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4gIEJhc2VkIG9uIHBhdGNoIGJ5IFR5bGVyCisgIENyb21wdG9uLgorCistIElzc3VlICMyNjAzOTogemlwZmlsZS5aaXBGaWxlLm9wZW4oKSBjYW4gbm93IGJlIHVzZWQgdG8gd3JpdGUgZGF0YSBpbnRvIGEgWklQCisgIGZpbGUsIGFzIHdlbGwgYXMgZm9yIGV4dHJhY3RpbmcgZGF0YS4gIFBhdGNoIGJ5IFRob21hcyBLbHV5dmVyLgorCiAtIElzc3VlICMyNjg5MjogSG9ub3IgZGVidWdsZXZlbCBmbGFnIGluIHVybGxpYi5yZXF1ZXN0LkhUVFBIYW5kbGVyLiBQYXRjaAogICBjb250cmlidXRlZCBieSBDaGkgSHN1YW4gWWVuLgogCkBAIC01NTcsNiArMTQxNywxNCBAQAogLSBJc3N1ZSAjMjY5Nzc6IFJlbW92ZWQgdW5uZWNlc3NhcnksIGFuZCBpZ25vcmVkLCBjYWxsIHRvIHN1bSBvZiBzcXVhcmVzIGhlbHBlcgogICBpbiBzdGF0aXN0aWNzLnB2YXJpYW5jZS4KIAorLSBJc3N1ZSAjMjYwMDI6IFVzZSBiaXNlY3QgaW4gc3RhdGlzdGljcy5tZWRpYW4gaW5zdGVhZCBvZiBhIGxpbmVhciBzZWFyY2guCisgIFBhdGNoIGJ5IFVwZW5kcmEgS3VtYS4KKworLSBJc3N1ZSAjMjU5NzQ6IE1ha2UgdXNlIG9mIG5ldyBEZWNpbWFsLmFzX2ludGVnZXJfcmF0aW8oKSBtZXRob2QgaW4gc3RhdGlzdGljcworICBtb2R1bGUuIFBhdGNoIGJ5IFN0ZWZhbiBLcmFoLgorCistIElzc3VlICMyNjk5NjogQWRkIHNlY3JldHMgbW9kdWxlIGFzIGRlc2NyaWJlZCBpbiBQRVAgNTA2LgorCiAtIElzc3VlICMyNjg4MTogVGhlIG1vZHVsZWZpbmRlciBtb2R1bGUgbm93IHN1cHBvcnRzIGV4dGVuZGVkIG9wY29kZSBhcmd1bWVudHMuCiAKIC0gSXNzdWUgIzIzODE1OiBGaXhlZCBjcmFzaGVzIHJlbGF0ZWQgdG8gZGlyZWN0bHkgY3JlYXRlZCBpbnN0YW5jZXMgb2YgdHlwZXMgaW4KQEAgLTU2OCw2ICsxNDM2LDExIEBACiAtIElzc3VlICMyNjg3MzogeG1scnBjIG5vdyByYWlzZXMgUmVzcG9uc2VFcnJvciBvbiB1bnN1cHBvcnRlZCB0eXBlIHRhZ3MKICAgaW5zdGVhZCBvZiBzaWxlbnRseSByZXR1cm4gaW5jb3JyZWN0IHJlc3VsdC4KIAorLSBJc3N1ZSAjMjY5MTU6ICBUaGUgX19jb250YWluc19fIG1ldGhvZHMgaW4gdGhlIGNvbGxlY3Rpb25zIEFCQ3Mgbm93IGNoZWNrCisgIGZvciBpZGVudGl0eSBiZWZvcmUgY2hlY2tpbmcgZXF1YWxpdHkuICBUaGlzIGJldHRlciBtYXRjaGVzIHRoZSBiZWhhdmlvcgorICBvZiB0aGUgY29uY3JldGUgY2xhc3NlcywgYWxsb3dzIHNlbnNpYmxlIGhhbmRsaW5nIG9mIE5hTnMsIGFuZCBtYWtlcyBpdAorICBlYXNpZXIgdG8gcmVhc29uIGFib3V0IGNvbnRhaW5lciBpbnZhcmlhbnRzLgorCiAtIElzc3VlICMyNjcxMTogRml4ZWQgdGhlIGNvbXBhcmlzb24gb2YgcGxpc3RsaWIuRGF0YSB3aXRoIG90aGVyIHR5cGVzLgogCiAtIElzc3VlICMyNDExNDogRml4IGFuIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaW4gYGN0eXBlcy51dGlsYC4KQEAgLTU4MSw2ICsxNDU0LDEyIEBACiAgIG5hbWVzIHRoYXQgaGFwcGVuIHRvIGhhdmUgYSBieXBhc3NlZCBob3N0bmFtZSBhcyBhIHN1ZmZpeC4gIFBhdGNoIGJ5IFhpYW5nCiAgIFpoYW5nLgogCistIElzc3VlICMyNDkwMjogUHJpbnQgc2VydmVyIFVSTCBvbiBodHRwLnNlcnZlciBzdGFydHVwLiAgSW5pdGlhbCBwYXRjaCBieQorICBGZWxpeCBLYWlzZXIuCisKKy0gSXNzdWUgIzI1Nzg4OiBmaWxlaW5wdXQuaG9va19lbmNvZGVkKCkgbm93IHN1cHBvcnRzIGFuICJlcnJvcnMiIGFyZ3VtZW50CisgIGZvciBwYXNzaW5nIHRvIG9wZW4uICBPcmlnaW5hbCBwYXRjaCBieSBKb3NlcGggSGFja21hbi4KKwogLSBJc3N1ZSAjMjY2MzQ6IHJlY3Vyc2l2ZV9yZXByKCkgbm93IHNldHMgX19xdWFsbmFtZV9fIG9mIHdyYXBwZXIuICBQYXRjaCBieQogICBYaWFuZyBaaGFuZy4KIApAQCAtNjE2LDI2ICsxNDk1LDU0IEBACiAtIElzc3VlICMyNjcxNzogU3RvcCBlbmNvZGluZyBMYXRpbi0xLWl6ZWQgV1NHSSBwYXRocyB3aXRoIFVURi04LiAgUGF0Y2ggYnkKICAgQW50aG9ueSBTb3R0aWxlLgogCistIElzc3VlICMyNjc4MjogQWRkIFNUQVJUVVBJTkZPIHRvIHN1YnByb2Nlc3MuX19hbGxfXyBvbiBXaW5kb3dzLgorCistIElzc3VlICMyNjQwNDogQWRkIGNvbnRleHQgbWFuYWdlciB0byBzb2NrZXRzZXJ2ZXIuICBQYXRjaCBieSBBdml2IFBhbGl2b2RhLgorCiAtIElzc3VlICMyNjczNTogRml4IDpmdW5jOmBvcy51cmFuZG9tYCBvbiBTb2xhcmlzIDExLjMgYW5kIG5ld2VyIHdoZW4gcmVhZGluZwogICBtb3JlIHRoYW4gMSwwMjQgYnl0ZXM6IGNhbGwgYGBnZXRyYW5kb20oKWBgIG11bHRpcGxlIHRpbWVzIHdpdGggYSBsaW1pdCBvZgogICAxMDI0IGJ5dGVzIHBlciBjYWxsLgogCistIElzc3VlICMyNjU4NTogRWxpbWluYXRlIGh0dHAuc2VydmVyLl9xdW90ZV9odG1sKCkgYW5kIHVzZQorICBodG1sLmVzY2FwZShxdW90ZT1GYWxzZSkuICBQYXRjaCBieSBYaWFuZyBaaGFuZy4KKworLSBJc3N1ZSAjMjY2ODU6IFJhaXNlIE9TRXJyb3IgaWYgY2xvc2luZyBhIHNvY2tldCBmYWlscy4KKwogLSBJc3N1ZSAjMTYzMjk6IEFkZCAud2VibSB0byBtaW1ldHlwZXMudHlwZXNfbWFwLiAgUGF0Y2ggYnkgR2lhbXBhb2xvIFJvZG9sYScuCiAKIC0gSXNzdWUgIzEzOTUyOiBBZGQgLmNzdiB0byBtaW1ldHlwZXMudHlwZXNfbWFwLiAgUGF0Y2ggYnkgR2VvZmYgV2lsc29uLgogCistIElzc3VlICMyNjU4NzogdGhlIHNpdGUgbW9kdWxlIG5vdyBhbGxvd3MgLnB0aCBmaWxlcyB0byBzcGVjaWZ5IGZpbGVzIHRvIGJlCisgIGFkZGVkIHRvIHN5cy5wYXRoIChlLmcuIHppcCBmaWxlcykuCisKKy0gSXNzdWUgIzI1NjA5OiBJbnRyb2R1Y2UgY29udGV4dGxpYi5BYnN0cmFjdENvbnRleHRNYW5hZ2VyIGFuZAorICB0eXBpbmcuQ29udGV4dE1hbmFnZXIuCisKIC0gSXNzdWUgIzI2NzA5OiBGaXhlZCBZMjAzOCBwcm9ibGVtIGluIGxvYWRpbmcgYmluYXJ5IFBMaXN0cy4KIAogLSBJc3N1ZSAjMjM3MzU6IEhhbmRsZSB0ZXJtaW5hbCByZXNpemluZyB3aXRoIFJlYWRsaW5lIDYuMysgYnkgaW5zdGFsbGluZyBvdXIKICAgb3duIFNJR1dJTkNIIGhhbmRsZXIuICBQYXRjaCBieSBFcmljIFByaWNlLgogCistIElzc3VlICMyNTk1MTogQ2hhbmdlIFNTTFNvY2tldC5zZW5kYWxsKCkgdG8gcmV0dXJuIE5vbmUsIGFzIGV4cGxpY2l0bHkKKyAgZG9jdW1lbnRlZCBmb3IgcGxhaW4gc29ja2V0IG9iamVjdHMuICBQYXRjaCBieSBBdml2IFBhbGl2b2RhLgorCiAtIElzc3VlICMyNjU4NjogSW4gaHR0cC5zZXJ2ZXIsIHJlc3BvbmQgd2l0aCAiNDEzIFJlcXVlc3QgaGVhZGVyIGZpZWxkcyB0b28KICAgbGFyZ2UiIGlmIHRoZXJlIGFyZSB0b28gbWFueSBoZWFkZXIgZmllbGRzIHRvIHBhcnNlLCByYXRoZXIgdGhhbiBraWxsaW5nCiAgIHRoZSBjb25uZWN0aW9uIGFuZCByYWlzaW5nIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uICBQYXRjaCBieSBYaWFuZyBaaGFuZy4KIAorLSBJc3N1ZSAjMjY2NzY6IEFkZGVkIG1pc3NpbmcgWE1MUHVsbFBhcnNlciB0byBFbGVtZW50VHJlZS5fX2FsbF9fLgorCiAtIElzc3VlICMyMjg1NDogQ2hhbmdlIEJ1ZmZlcmVkUmVhZGVyLndyaXRhYmxlKCkgYW5kCiAgIEJ1ZmZlcmVkV3JpdGVyLnJlYWRhYmxlKCkgdG8gYWx3YXlzIHJldHVybiBGYWxzZS4KIAorLSBJc3N1ZSAjMjY0OTI6IEV4aGF1c3RlZCBpdGVyYXRvciBvZiBhcnJheS5hcnJheSBub3cgY29uZm9ybXMgd2l0aCB0aGUgYmVoYXZpb3IKKyAgb2YgaXRlcmF0b3JzIG9mIG90aGVyIG11dGFibGUgc2VxdWVuY2VzOiBpdCBsZWZ0cyBleGhhdXN0ZWQgZXZlbiBpZiBpdGVyYXRlZAorICBhcnJheSBpcyBleHRlbmRlZC4KKworLSBJc3N1ZSAjMjY2NDE6IGRvY3Rlc3QuRG9jRmlsZVRlc3QgYW5kIGRvY3Rlc3QudGVzdGZpbGUoKSBub3cgc3VwcG9ydAorICBwYWNrYWdlcyAobW9kdWxlIHNwbGl0dGVkIGludG8gbXVsdGlwbGUgZGlyZWN0b3JpZXMpIGZvciB0aGUgcGFja2FnZQorICBwYXJhbWV0ZXIuCisKIC0gSXNzdWUgIzI1MTk1OiBGaXggYSByZWdyZXNzaW9uIGluIG1vY2suTWFnaWNNb2NrLiBfQ2FsbCBpcyBhIHN1YmNsYXNzIG9mCiAgIHR1cGxlIChjaGFuZ2VzZXQgMzYwM2JhZTYzYzEzIG9ubHkgd29ya3MgZm9yIGNsYXNzZXMpIHNvIHdlIG5lZWQgdG8KICAgaW1wbGVtZW50IF9fbmVfXyBvdXJzZWx2ZXMuICBQYXRjaCBieSBBbmRyZXcgUGx1bW1lci4KQEAgLTY0OCwxNiArMTU1NSw0NSBAQAogCiAtIElzc3VlICMyNjYxNjogRml4ZWQgYSBidWcgaW4gZGF0ZXRpbWUuYXN0aW1lem9uZSgpIG1ldGhvZC4KIAotLSBJc3N1ZSAjMjE5MjU6IDpmdW5jOmB3YXJuaW5ncy5mb3JtYXR3YXJuaW5nYCBub3cgY2F0Y2hlcyBleGNlcHRpb25zIG9uCi0gIGBgbGluZWNhY2hlLmdldGxpbmUoLi4uKWBgIHRvIGJlIGFibGUgdG8gbG9nIDpleGM6YFJlc291cmNlV2FybmluZ2AgZW1pdHRlZAotICBsYXRlIGR1cmluZyB0aGUgUHl0aG9uIHNodXRkb3duIHByb2Nlc3MuCistIElzc3VlICMyNjYzNzogVGhlIDptb2Q6YGltcG9ydGxpYmAgbW9kdWxlIG5vdyBlbWl0cyBhbiA6ZXhjOmBJbXBvcnRFcnJvcmAKKyAgcmF0aGVyIHRoYW4gYSA6ZXhjOmBUeXBlRXJyb3JgIGlmIDpmdW5jOmBfX2ltcG9ydF9fYCBpcyB0cmllZCBkdXJpbmcgdGhlCisgIFB5dGhvbiBzaHV0ZG93biBwcm9jZXNzIGJ1dCA6ZGF0YTpgc3lzLnBhdGhgIGlzIGFscmVhZHkgY2xlYXJlZCAoc2V0IHRvCisgIGBgTm9uZWBgKS4KKworLSBJc3N1ZSAjMjE5MjU6IDpmdW5jOmB3YXJuaW5ncy5mb3JtYXR3YXJuaW5nYCBub3cgY2F0Y2hlcyBleGNlcHRpb25zIHdoZW4KKyAgY2FsbGluZyA6ZnVuYzpgbGluZWNhY2hlLmdldGxpbmVgIGFuZAorICA6ZnVuYzpgdHJhY2VtYWxsb2MuZ2V0X29iamVjdF90cmFjZWJhY2tgIHRvIGJlIGFibGUgdG8gbG9nCisgIDpleGM6YFJlc291cmNlV2FybmluZ2AgZW1pdHRlZCBsYXRlIGR1cmluZyB0aGUgUHl0aG9uIHNodXRkb3duIHByb2Nlc3MuCisKKy0gSXNzdWUgIzIzODQ4OiBPbiBXaW5kb3dzLCBmYXVsdGhhbmRsZXIuZW5hYmxlKCkgbm93IGFsc28gaW5zdGFsbHMgYW4KKyAgZXhjZXB0aW9uIGhhbmRsZXIgdG8gZHVtcCB0aGUgdHJhY2ViYWNrIG9mIGFsbCBQeXRob24gdGhyZWFkcyBvbiBhbnkgV2luZG93cworICBleGNlcHRpb24sIG5vdCBvbmx5IG9uIFVOSVggc2lnbmFscyAoU0lHU0VHViwgU0lHRlBFLCBTSUdBQlJUKS4KKworLSBJc3N1ZSAjMjY1MzA6IEFkZCBDIGZ1bmN0aW9ucyA6YzpmdW5jOmBfUHlUcmFjZU1hbGxvY19UcmFja2AgYW5kCisgIDpjOmZ1bmM6YF9QeVRyYWNlTWFsbG9jX1VudHJhY2tgIHRvIHRyYWNrIG1lbW9yeSBibG9ja3MgdXNpbmcgdGhlCisgIDptb2Q6YHRyYWNlbWFsbG9jYCBtb2R1bGUuIEFkZCA6YzpmdW5jOmBfUHlUcmFjZU1hbGxvY19HZXRUcmFjZWJhY2tgIHRvIGdldAorICB0aGUgdHJhY2ViYWNrIG9mIGFuIG9iamVjdC4KKworLSBJc3N1ZSAjMjY1ODg6IFRoZSBfdHJhY2VtYWxsb2Mgbm93IHN1cHBvcnRzIHRyYWNpbmcgbWVtb3J5IGFsbG9jYXRpb25zIG9mCisgIG11bHRpcGxlIGFkZHJlc3Mgc3BhY2VzIChkb21haW5zKS4KIAogLSBJc3N1ZSAjMjQyNjY6IEN0cmwrQyBkdXJpbmcgUmVhZGxpbmUgaGlzdG9yeSBzZWFyY2ggbm93IGNhbmNlbHMgdGhlIHNlYXJjaAogICBtb2RlIHdoZW4gY29tcGlsZWQgd2l0aCBSZWFkbGluZSA3LgogCistIElzc3VlICMyNjU5MDogSW1wbGVtZW50IGEgc2FmZSBmaW5hbGl6ZXIgZm9yIHRoZSBfc29ja2V0LnNvY2tldCB0eXBlLiBJdCBub3cKKyAgcmVsZWFzZXMgdGhlIEdJTCB0byBjbG9zZSB0aGUgc29ja2V0LgorCistIElzc3VlICMxODc4Nzogc3B3ZC5nZXRzcG5hbSgpIG5vdyByYWlzZXMgYSBQZXJtaXNzaW9uRXJyb3IgaWYgdGhlIHVzZXIKKyAgZG9lc24ndCBoYXZlIHByaXZpbGVnZXMuCisKIC0gSXNzdWUgIzI2NTYwOiBBdm9pZCBwb3RlbnRpYWwgVmFsdWVFcnJvciBpbiBCYXNlSGFuZGxlci5zdGFydF9yZXNwb25zZS4KICAgSW5pdGlhbCBwYXRjaCBieSBQZXRlciBJbmdsZXNieS4KIAorLSBJc3N1ZSAjMjY1Njc6IEFkZCBhIG5ldyBmdW5jdGlvbiA6YzpmdW5jOmBQeUVycl9SZXNvdXJjZVdhcm5pbmdgIGZ1bmN0aW9uIHRvCisgIHBhc3MgdGhlIGRlc3Ryb3llZCBvYmplY3QuIEFkZCBhICpzb3VyY2UqIGF0dHJpYnV0ZSB0bworICA6Y2xhc3M6YHdhcm5pbmdzLldhcm5pbmdNZXNzYWdlYC4gQWRkIHdhcm5pbmdzLl9zaG93d2Fybm1zZygpIHdoaWNoIHVzZXMKKyAgdHJhY2VtYWxsb2MgdG8gZ2V0IHRoZSB0cmFjZWJhY2sgd2hlcmUgc291cmNlIG9iamVjdCB3YXMgYWxsb2NhdGVkLgorCiAtIFtTZWN1cml0eV0gSXNzdWUgIzI2MzEzOiBzc2wucHkgX2xvYWRfd2luZG93c19zdG9yZV9jZXJ0cyBmYWlscyBpZiB3aW5kb3dzCiAgIGNlcnQgc3RvcmUgaXMgZW1wdHkuIFBhdGNoIGJ5IEJhamkuCiAKQEAgLTY3OSwyNCArMTYxNSwzOSBAQAogLSBJc3N1ZSAjMjM3MTg6IEZpeGVkIHBhcnNpbmcgdGltZSBpbiB3ZWVrIDAgYmVmb3JlIEphbiAxLiAgT3JpZ2luYWwgcGF0Y2ggYnkKICAgVGFtw6FzIEJlbmNlIEdlZGFpLgogCistIElzc3VlICMyNjMyMzogQWRkIE1vY2suYXNzZXJ0X2NhbGxlZCgpIGFuZCBNb2NrLmFzc2VydF9jYWxsZWRfb25jZSgpCisgIG1ldGhvZHMgdG8gdW5pdHRlc3QubW9jay4gUGF0Y2ggd3JpdHRlbiBieSBBbWl0IFNhaGEuCisKIC0gSXNzdWUgIzIwNTg5OiBJbnZva2luZyBQYXRoLm93bmVyKCkgYW5kIFBhdGguZ3JvdXAoKSBvbiBXaW5kb3dzIG5vdyByYWlzZQogICBOb3RJbXBsZW1lbnRlZEVycm9yIGluc3RlYWQgb2YgSW1wb3J0RXJyb3IuCiAKIC0gSXNzdWUgIzI2MTc3OiBGaXhlZCB0aGUga2V5cygpIG1ldGhvZCBmb3IgQ2FudmFzIGFuZCBTY3JvbGxiYXIgd2lkZ2V0cy4KIAotLSBJc3N1ZSAjMTUwNjg6IEdvdCByaWQgb2YgZXhjZXNzaXZlIGJ1ZmZlcmluZyBpbiB0aGUgZmlsZWlucHV0IG1vZHVsZS4KLSAgVGhlIGJ1ZnNpemUgcGFyYW1ldGVyIGlzIG5vIGxvbmdlciB1c2VkLgorLSBJc3N1ZSAjMTUwNjg6IEdvdCByaWQgb2YgZXhjZXNzaXZlIGJ1ZmZlcmluZyBpbiBmaWxlaW5wdXQuCisgIFRoZSBidWZzaXplIHBhcmFtZXRlciBpcyBub3cgZGVwcmVjYXRlZCBhbmQgaWdub3JlZC4KKworLSBJc3N1ZSAjMTk0NzU6IEFkZGVkIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRpbWVzcGVjIHRvIHRoZSBkYXRldGltZQorICBpc29mb3JtYXQoKSBtZXRob2QgdG8gY2hvb3NlIHRoZSBwcmVjaXNpb24gb2YgdGhlIHRpbWUgY29tcG9uZW50LgogCiAtIElzc3VlICMyMjAyOiBGaXggVW5ib3VuZExvY2FsRXJyb3IgaW4KICAgQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlci5nZXRfYWxnb3JpdGhtX2ltcGxzLiAgSW5pdGlhbCBwYXRjaCBieSBNYXRoaWV1CiAgIER1cHV5LgogCistIElzc3VlICMyNjE2NzogTWluaW1pemVkIG92ZXJoZWFkIGluIGNvcHkuY29weSgpIGFuZCBjb3B5LmRlZXBjb3B5KCkuCisgIE9wdGltaXplZCBjb3B5aW5nIGFuZCBkZWVwY29weWluZyBieXRlYXJyYXlzLCBOb3RJbXBsZW1lbnRlZCwgc2xpY2VzLAorICBzaG9ydCBsaXN0cywgdHVwbGVzLCBkaWN0cywgc2V0cy4KKwogLSBJc3N1ZSAjMjU3MTg6IEZpeGVkIHBpY2tsaW5nIGFuZCBjb3B5aW5nIHRoZSBhY2N1bXVsYXRlKCkgaXRlcmF0b3Igd2l0aAogICB0b3RhbCBpcyBOb25lLgogCiAtIElzc3VlICMyNjQ3NTogRml4ZWQgZGVidWdnaW5nIG91dHB1dCBmb3IgcmVndWxhciBleHByZXNzaW9ucyB3aXRoIHRoZSAoP3gpCiAgIGZsYWcuCiAKKy0gSXNzdWUgIzI2NDgyOiBBbGxvd2VkIHBpY2tsaW5nIHJlY3Vyc2l2ZSBkZXF1ZXVlcy4KKworLSBJc3N1ZSAjMjYzMzU6IE1ha2UgbW1hcC53cml0ZSgpIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gbGlrZQorICBvdGhlciB3cml0ZSBtZXRob2RzLiAgUGF0Y2ggYnkgSmFrdWIgU3Rhc2lhay4KKwogLSBJc3N1ZSAjMjY0NTc6IEZpeGVkIHRoZSBzdWJuZXRzKCkgbWV0aG9kcyBpbiBJUCBuZXR3b3JrIGNsYXNzZXMgZm9yIHRoZSBjYXNlCiAgIHdoZW4gcmVzdWx0aW5nIHByZWZpeCBsZW5ndGggaXMgZXF1YWwgdG8gbWF4aW1hbCBwcmVmaXggbGVuZ3RoLgogICBCYXNlZCBvbiBwYXRjaCBieSBYaWFuZyBaaGFuZy4KQEAgLTcxMyw3ICsxNjY0LDcgQEAKIAogLSBJc3N1ZSAjMjYxODY6IFJlbW92ZSBhbiBpbnZhbGlkIHR5cGUgY2hlY2sgaW4gaW1wb3J0bGliLnV0aWwuTGF6eUxvYWRlci4KIAotLSBJc3N1ZSAjMjYzNjc6IGltcG9ydGxpYi5fX2ltcG9ydF9fKCkgcmFpc2VzIFN5c3RlbUVycm9yIGxpa2UKKy0gSXNzdWUgIzI2MzY3OiBpbXBvcnRsaWIuX19pbXBvcnRfXygpIHJhaXNlcyBJbXBvcnRFcnJvciBsaWtlCiAgIGJ1aWx0aW5zLl9faW1wb3J0X18oKSB3aGVuIGBgbGV2ZWxgYCBpcyBzcGVjaWZpZWQgYnV0IHdpdGhvdXQgYW4gYWNjb21wYW55aW5nCiAgIHBhY2thZ2Ugc3BlY2lmaWVkLgogCkBAIC03MjEsMTkgKzE2NzIsMzkgQEAKICAgdGhlIGNvbm5lY3RlZCBzb2NrZXQpIHdoZW4gdmVyaWZ5X3JlcXVlc3QoKSByZXR1cm5zIGZhbHNlLiAgUGF0Y2ggYnkgQXZpdgogICBQYWxpdm9kYS4KIAorLSBJc3N1ZSAjMjM0MzA6IENoYW5nZSB0aGUgc29ja2V0c2VydmVyIG1vZHVsZSB0byBvbmx5IGNhdGNoIGV4Y2VwdGlvbnMKKyAgcmFpc2VkIGZyb20gYSByZXF1ZXN0IGhhbmRsZXIgdGhhdCBhcmUgZGVyaXZlZCBmcm9tIEV4Y2VwdGlvbiAoaW5zdGVhZCBvZgorICBCYXNlRXhjZXB0aW9uKS4gIFRoZXJlZm9yZSBTeXN0ZW1FeGl0IGFuZCBLZXlib2FyZEludGVycnVwdCBubyBsb25nZXIKKyAgdHJpZ2dlciB0aGUgaGFuZGxlX2Vycm9yKCkgbWV0aG9kLCBhbmQgd2lsbCBub3cgdG8gc3RvcCBhIHNpbmdsZS10aHJlYWRlZAorICBzZXJ2ZXIuCisKIC0gW1NlY3VyaXR5XSBJc3N1ZSAjMjU5Mzk6IE9uIFdpbmRvd3Mgb3BlbiB0aGUgY2VydCBzdG9yZSByZWFkb25seSBpbgogICBzc2wuZW51bV9jZXJ0aWZpY2F0ZXMuCiAKIC0gSXNzdWUgIzI1OTk1OiBvcy53YWxrKCkgbm8gbG9uZ2VyIHVzZXMgRkRzIHByb3BvcnRpb25hbCB0byB0aGUgdHJlZSBkZXB0aC4KIAorLSBJc3N1ZSAjMjU5OTQ6IEFkZGVkIHRoZSBjbG9zZSgpIG1ldGhvZCBhbmQgdGhlIHN1cHBvcnQgb2YgdGhlIGNvbnRleHQgbWFuYWdlcgorICBwcm90b2NvbCBmb3IgdGhlIG9zLnNjYW5kaXIoKSBpdGVyYXRvci4KKworLSBJc3N1ZSAjMjM5OTI6IG11bHRpcHJvY2Vzc2luZzogbWFrZSBNYXBSZXN1bHQgbm90IGZhaWwtZmFzdCB1cG9uIGV4Y2VwdGlvbi4KKworLSBJc3N1ZSAjMjYyNDM6IFN1cHBvcnQga2V5d29yZCBhcmd1bWVudHMgdG8gemxpYi5jb21wcmVzcygpLiAgUGF0Y2ggYnkgQXZpdgorICBQYWxpdm9kYS4KKwogLSBJc3N1ZSAjMjYxMTc6IFRoZSBvcy5zY2FuZGlyKCkgaXRlcmF0b3Igbm93IGNsb3NlcyBmaWxlIGRlc2NyaXB0b3Igbm90IG9ubHkKICAgd2hlbiB0aGUgaXRlcmF0aW9uIGlzIGZpbmlzaGVkLCBidXQgd2hlbiBpdCB3YXMgZmFpbGVkIHdpdGggZXJyb3IuCiAKKy0gSXNzdWUgIzI1OTQ5OiBfX2RpY3RfXyBmb3IgYW4gT3JkZXJlZERpY3QgaW5zdGFuY2UgaXMgbm93IGNyZWF0ZWQgb25seSB3aGVuCisgIG5lZWRlZC4KKwogLSBJc3N1ZSAjMjU5MTE6IFJlc3RvcmVkIHN1cHBvcnQgb2YgYnl0ZXMgcGF0aHMgaW4gb3Mud2FsaygpIG9uIFdpbmRvd3MuCiAKIC0gSXNzdWUgIzI2MDQ1OiBBZGQgVVRGLTggc3VnZ2VzdGlvbiB0byBlcnJvciBtZXNzYWdlIHdoZW4gcG9zdGluZyBhCiAgIG5vbi1MYXRpbi0xIHN0cmluZyB3aXRoIGh0dHAuY2xpZW50LgogCistIElzc3VlICMyNjAzOTogQWRkZWQgemlwZmlsZS5aaXBJbmZvLmZyb21fZmlsZSgpIGFuZCB6aXBpbmZvLlppcEluZm8uaXNfZGlyKCkuCisgIFBhdGNoIGJ5IFRob21hcyBLbHV5dmVyLgorCiAtIElzc3VlICMxMjkyMzogUmVzZXQgRmFuY3lVUkxvcGVuZXIncyByZWRpcmVjdCBjb3VudGVyIGV2ZW4gaWYgdGhlcmUgaXMgYW4KICAgZXhjZXB0aW9uLiAgQmFzZWQgb24gcGF0Y2hlcyBieSBCcmlhbiBCcmF6aWwgYW5kIERhbmllbCBSb2Njby4KIApAQCAtNzU0LDYgKzE3MjUsMTAgQEAKICAgZ2V0aG9zdGJ5bmFtZV9leCgpIGZ1bmN0aW9ucyBvZiB0aGUgc29ja2V0IG1vZHVsZSBub3cgZGVjb2RlIHRoZSBob3N0bmFtZQogICBmcm9tIHRoZSBBTlNJIGNvZGUgcGFnZSByYXRoZXIgdGhhbiBVVEYtOC4KIAorLSBJc3N1ZSAjMjYwOTk6IFRoZSBzaXRlIG1vZHVsZSBub3cgd3JpdGVzIGFuIGVycm9yIGludG8gc3RkZXJyIGlmCisgIHNpdGVjdXN0b21pemUgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBidXQgZXhlY3V0aW5nIHRoZSBtb2R1bGUgcmFpc2UgYW4KKyAgSW1wb3J0RXJyb3IuIFNhbWUgY2hhbmdlIGZvciB1c2VyY3VzdG9taXplLgorCiAtIElzc3VlICMyNjE0NzogeG1scnBjIG5vdyB3b3JrcyB3aXRoIHN0cmluZ3Mgbm90IGVuY29kYWJsZSB3aXRoIHVzZWQKICAgbm9uLVVURi04IGVuY29kaW5nLgogCkBAIC03NjQsMTMgKzE3MzksMjEgQEAKIC0gSXNzdWUgIzI2MDEzOiBBZGRlZCBjb21wYXRpYmlsaXR5IHdpdGggYnJva2VuIHByb3RvY29sIDIgcGlja2xlcyBjcmVhdGVkCiAgIGluIG9sZCBQeXRob24gMyB2ZXJzaW9ucyAoMy40LjMgYW5kIGxvd2VyKS4KIAorLSBJc3N1ZSAjMjYxMjk6IERlcHJlY2F0ZWQgYWNjZXB0aW5nIG5vbi1pbnRlZ2VycyBpbiBncnAuZ2V0Z3JnaWQoKS4KKwogLSBJc3N1ZSAjMjU4NTA6IFVzZSBjcm9zcy1jb21waWxhdGlvbiBieSBkZWZhdWx0IGZvciA2NC1iaXQgV2luZG93cy4KIAotLSBJc3N1ZSAjMTc2MzM6IEltcHJvdmUgemlwaW1wb3J0J3Mgc3VwcG9ydCBmb3IgbmFtZXNwYWNlIHBhY2thZ2VzLgorLSBJc3N1ZSAjMjU4MjI6IEFkZCBkb2NzdHJpbmdzIHRvIHRoZSBmaWVsZHMgb2YgdXJsbGliLnBhcnNlIHJlc3VsdHMuCisgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFN3YXRpIEphaXN3YWwuCisKKy0gSXNzdWUgIzIyNjQyOiBDb252ZXJ0IHRyYWNlIG1vZHVsZSBvcHRpb24gcGFyc2luZyBtZWNoYW5pc20gdG8gYXJncGFyc2UuCisgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNpbGVudEdob3N0LgogCiAtIElzc3VlICMyNDcwNTogRml4IHN5c2NvbmZpZy5fcGFyc2VfbWFrZWZpbGUgbm90IGV4cGFuZGluZyAke30gdmFycwogICBhcHBlYXJpbmcgYmVmb3JlICQoKSB2YXJzLgogCistIElzc3VlICMyNjA2OTogUmVtb3ZlIHRoZSBkZXByZWNhdGVkIGFwaXMgaW4gdGhlIHRyYWNlIG1vZHVsZS4KKwogLSBJc3N1ZSAjMjIxMzg6IEZpeCBtb2NrLnBhdGNoIGJlaGF2aW9yIHdoZW4gcGF0Y2hpbmcgZGVzY3JpcHRvcnMuIFJlc3RvcmUKICAgb3JpZ2luYWwgdmFsdWVzIGFmdGVyIHBhdGNoaW5nLiBQYXRjaCBjb250cmlidXRlZCBieSBTZWFuIE1jQ3VsbHkuCiAKQEAgLTc4MywxMyArMTc2NiwyOCBAQAogLSBJc3N1ZSAjMjQxMjA6IElnbm9yZSBQZXJtaXNzaW9uRXJyb3Igd2hlbiB0cmF2ZXJzaW5nIGEgdHJlZSB3aXRoCiAgIHBhdGhsaWIuUGF0aC5bcl1nbG9iKCkuICBQYXRjaCBieSBVbHJpY2ggUGV0cmkuCiAKKy0gSXNzdWUgIzIxODE1OiBBY2NlcHQgXSBjaGFyYWN0ZXJzIGluIHRoZSBkYXRhIHBvcnRpb24gb2YgaW1hcCByZXNwb25zZXMsCisgIGluIG9yZGVyIHRvIGhhbmRsZSB0aGUgZmxhZ3Mgd2l0aCBzcXVhcmUgYnJhY2tldHMgYWNjZXB0ZWQgYW5kIHByb2R1Y2VkCisgIGJ5IHNlcnZlcnMgc3VjaCBhcyBnbWFpbC4KKwogLSBJc3N1ZSAjMjU0NDc6IGZpbGVpbnB1dCBub3cgdXNlcyBzeXMuc3RkaW4gYXMtaXMgaWYgaXQgZG9lcyBub3QgaGF2ZSBhCiAgIGJ1ZmZlciBhdHRyaWJ1dGUgKHJlc3RvcmVzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgogCistIElzc3VlICMyNTk3MTogT3B0aW1pemVkIGNyZWF0aW5nIEZyYWN0aW9ucyBmcm9tIGZsb2F0cyBieSAyIHRpbWVzIGFuZCBmcm9tCisgIERlY2ltYWxzIGJ5IDMgdGltZXMuCisKKy0gSXNzdWUgIzI1ODAyOiBEb2N1bWVudCBhcyBkZXByZWNhdGVkIHRoZSByZW1haW5pbmcgaW1wbGVtZW50YXRpb25zIG9mCisgIGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlKCkuCisKKy0gSXNzdWUgIzI1OTI4OiBBZGQgRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvKCkuCisKIC0gSXNzdWUgIzI1NDQ3OiBDb3B5aW5nIHRoZSBscnVfY2FjaGUoKSB3cmFwcGVyIG9iamVjdCBub3cgYWx3YXlzIHdvcmtzLAotICBpbmRlcGVuZGVkbHkgZnJvbSB0aGUgdHlwZSBvZiB0aGUgd3JhcHBlZCBvYmplY3QgKGJ5IHJldHVybmluZyB0aGUgb3JpZ2luYWwKKyAgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG9iamVjdCAoYnkgcmV0dXJuaW5nIHRoZSBvcmlnaW5hbAogICBvYmplY3QgdW5jaGFuZ2VkKS4KIAorLSBJc3N1ZSAjMjU3Njg6IEhhdmUgdGhlIGZ1bmN0aW9ucyBpbiBjb21waWxlYWxsIHJldHVybiBib29sZWFucyBpbnN0ZWFkIG9mCisgIGludHMgYW5kIGFkZCBwcm9wZXIgZG9jdW1lbnRhdGlvbiBhbmQgdGVzdHMgZm9yIHRoZSByZXR1cm4gdmFsdWVzLgorCiAtIElzc3VlICMyNDEwMzogRml4ZWQgcG9zc2libGUgdXNlIGFmdGVyIGZyZWUgaW4gRWxlbWVudFRyZWUuWE1MUHVsbFBhcnNlci4KIAogLSBJc3N1ZSAjMjU4NjA6IG9zLmZ3YWxrKCkgbm8gbG9uZ2VyIHNraXBzIHJlbWFpbmluZyBkaXJlY3RvcmllcyB3aGVuIGVycm9yCkBAIC03OTcsOCArMTc5NSwyMiBAQAogCiAtIElzc3VlICMyNTkxNDogRml4ZWQgYW5kIHNpbXBsaWZpZWQgT3JkZXJlZERpY3QuX19zaXplb2ZfXy4KIAorLSBJc3N1ZSAjMjU4Njk6IE9wdGltaXplZCBkZWVwY29weWluZyBFbGVtZW50VHJlZTsgaXQgaXMgbm93IDIwIHRpbWVzIGZhc3Rlci4KKworLSBJc3N1ZSAjMjU4NzM6IE9wdGltaXplZCBpdGVyYXRpbmcgRWxlbWVudFRyZWUuICBJdGVyYXRpbmcgZWxlbWVudHMKKyAgRWxlbWVudC5pdGVyKCkgaXMgbm93IDQwJSBmYXN0ZXIsIGl0ZXJhdGluZyB0ZXh0IEVsZW1lbnQuaXRlcnRleHQoKQorICBpcyBub3cgdXAgdG8gMi41IHRpbWVzIGZhc3Rlci4KKwogLSBJc3N1ZSAjMjU5MDI6IEZpeGVkIHZhcmlvdXMgcmVmY291bnQgaXNzdWVzIGluIEVsZW1lbnRUcmVlIGl0ZXJhdGlvbi4KIAorLSBJc3N1ZSAjMjIyMjc6IFRoZSBUYXJGaWxlIGl0ZXJhdG9yIGlzIHJlaW1wbGVtZW50ZWQgdXNpbmcgZ2VuZXJhdG9yLgorICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHNpbXBsZXIgdGhhdCB1c2luZyBjbGFzcy4KKworLSBJc3N1ZSAjMjU2Mzg6IE9wdGltaXplZCBFbGVtZW50VHJlZS5pdGVycGFyc2UoKTsgaXQgaXMgbm93IDJ4IGZhc3Rlci4KKyAgT3B0aW1pemVkIEVsZW1lbnRUcmVlIHBhcnNpbmc7IGl0IGlzIG5vdyAxMCUgZmFzdGVyLgorCistIElzc3VlICMyNTc2MTogSW1wcm92ZWQgZGV0ZWN0aW5nIGVycm9ycyBpbiBicm9rZW4gcGlja2xlIGRhdGEuCisKIC0gSXNzdWUgIzI1NzE3OiBSZXN0b3JlIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIgb2YgdG9sZXJhdGluZyBtb3N0IGZzdGF0KCkKICAgZXJyb3JzIHdoZW4gb3BlbmluZyBmaWxlcy4gIFRoaXMgd2FzIGEgcmVncmVzc2lvbiBpbiAzLjVhMSwgYW5kIHN0b3BwZWQKICAgYW5vbnltb3VzIHRlbXBvcmFyeSBmaWxlcyBmcm9tIHdvcmtpbmcgaW4gc3BlY2lhbCBjYXNlcy4KQEAgLTgxMCw2ICsxODIyLDkgQEAKIC0gSXNzdWUgIzI1NzY0OiBJbiB0aGUgc3VicHJvY2VzcyBtb2R1bGUsIHByZXNlcnZlIGFueSBleGNlcHRpb24gY2F1c2VkIGJ5CiAgIGZvcmsoKSBmYWlsdXJlIHdoZW4gcHJlZXhlY19mbiBpcyB1c2VkLgogCistIElzc3VlICMyNTc3MTogVHdlYWsgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGZvciBpbXBvcnRsaWIudXRpbC5yZXNvbHZlX25hbWUoKQorICB3aGVuICdwYWNrYWdlJyBpc24ndCBzcGVjaWZpZWQgYnV0IG5lY2Vzc2FyeS4KKwogLSBJc3N1ZSAjNjQ3ODogX3N0cnB0aW1lJ3MgcmVnZXhwIGNhY2hlIG5vdyBpcyByZXNldCBhZnRlciBjaGFuZ2luZyB0aW1lem9uZQogICB3aXRoIHRpbWUudHpzZXQoKS4KIApAQCAtODMxLDYgKzE4NDYsOSBAQAogLSBJc3N1ZSAjMTAxMzE6IEZpeGVkIGRlZXAgY29weWluZyBvZiBtaW5pZG9tIGRvY3VtZW50cy4gIEJhc2VkIG9uIHBhdGNoCiAgIGJ5IE1hcmlhbiBHYW5pc2luLgogCistIElzc3VlICM3OTkwOiBkaXIoKSBvbiBFbGVtZW50VHJlZS5FbGVtZW50IG5vdyBsaXN0cyBwcm9wZXJ0aWVzOiAidGFnIiwKKyAgInRleHQiLCAidGFpbCIgYW5kICJhdHRyaWIiLiAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FudG9zbyBXaWpheWEuCisKIC0gSXNzdWUgIzI1NzI1OiBGaXhlZCBhIHJlZmVyZW5jZSBsZWFrIGluIHBpY2tsZS5sb2FkcygpIHdoZW4gdW5waWNrbGluZwogICBpbnZhbGlkIGRhdGEgaW5jbHVkaW5nIHR1cGxlIGluc3RydWN0aW9ucy4KIApAQCAtODQ2LDYgKzE4NjQsMjAzIEBACiAtIElzc3VlICMyNTYyNDogWmlwRmlsZSBub3cgYWx3YXlzIHdyaXRlcyBhIFpJUF9TVE9SRUQgaGVhZGVyIGZvciBkaXJlY3RvcnkKICAgZW50cmllcy4gIFBhdGNoIGJ5IERpbmd5dWFuIFdhbmcuCiAKKy0gSXNzdWUgIzI1NjI2OiBDaGFuZ2UgdGhyZWUgemxpYiBmdW5jdGlvbnMgdG8gYWNjZXB0IHNpemVzIHRoYXQgZml0IGluCisgIFB5X3NzaXplX3QsIGJ1dCBpbnRlcm5hbGx5IGNhcCB0aG9zZSBzaXplcyB0byBVSU5UX01BWC4gIFRoaXMgcmVzb2x2ZXMgYQorICByZWdyZXNzaW9uIGluIDMuNSB3aGVyZSBHemlwRmlsZS5yZWFkKCkgZmFpbGVkIHRvIHJlYWQgY2h1bmtzIGxhcmdlciB0aGFuIDIKKyAgb3IgNCBHaUIuICBUaGUgY2hhbmdlIGFmZmVjdHMgdGhlIHpsaWIuRGVjb21wcmVzcy5kZWNvbXByZXNzKCkgbWF4X2xlbmd0aAorICBwYXJhbWV0ZXIsIHRoZSB6bGliLmRlY29tcHJlc3MoKSBidWZzaXplIHBhcmFtZXRlciwgYW5kIHRoZQorICB6bGliLkRlY29tcHJlc3MuZmx1c2goKSBsZW5ndGggcGFyYW1ldGVyLgorCistIElzc3VlICMyNTU4MzogQXZvaWQgaW5jb3JyZWN0IGVycm9ycyByYWlzZWQgYnkgb3MubWFrZWRpcnMoZXhpc3Rfb2s9VHJ1ZSkKKyAgd2hlbiB0aGUgT1MgZ2l2ZXMgcHJpb3JpdHkgdG8gZXJyb3JzIHN1Y2ggYXMgRUFDQ0VTIG92ZXIgRUVYSVNULgorCistIElzc3VlICMyNTU5MzogQ2hhbmdlIHNlbWFudGljcyBvZiBFdmVudExvb3Auc3RvcCgpIGluIGFzeW5jaW8uCisKKy0gSXNzdWUgIzY5NzM6IFdoZW4gd2Uga25vdyBhIHN1YnByb2Nlc3MuUG9wZW4gcHJvY2VzcyBoYXMgZGllZCwgZG8KKyAgbm90IGFsbG93IHRoZSBzZW5kX3NpZ25hbCgpLCB0ZXJtaW5hdGUoKSwgb3Iga2lsbCgpIG1ldGhvZHMgdG8gZG8KKyAgYW55dGhpbmcgYXMgdGhleSBjb3VsZCBwb3RlbnRpYWxseSBzaWduYWwgYSBkaWZmZXJlbnQgcHJvY2Vzcy4KKworLSBJc3N1ZSAjMjM4ODM6IEFkZGVkIG1pc3NpbmcgQVBJcyB0byBfX2FsbF9fIHRvIG1hdGNoIHRoZSBkb2N1bWVudGVkIEFQSXMKKyAgZm9yIHRoZSBmb2xsb3dpbmcgbW9kdWxlczogY2FsZW5kYXIsIGNzdiwgZW51bSwgZmlsZWlucHV0LCBmdHBsaWIsIGxvZ2dpbmcsCisgIG9wdHBhcnNlLCB0YXJmaWxlLCB0aHJlYWRpbmcgYW5kIHdhdmUuICBBbHNvIGFkZGVkIGEKKyAgdGVzdC5zdXBwb3J0LmNoZWNrX19hbGxfXygpIGhlbHBlci4gIFBhdGNoZXMgYnkgSmFjZWsgS2/Fgm9kemllaiwgTWF1cm8KKyAgUy4gTS4gUm9kcmlndWVzIGFuZCBKb2VsIFRhZGRlaS4KKworLSBJc3N1ZSAjMjU1OTA6IEluIHRoZSBSZWFkbGluZSBjb21wbGV0ZXIsIG9ubHkgY2FsbCBnZXRhdHRyKCkgb25jZSBwZXIKKyAgYXR0cmlidXRlLiAgQWxzbyBjb21wbGV0ZSBuYW1lcyBvZiBhdHRyaWJ1dGVzIHN1Y2ggYXMgcHJvcGVydGllcyBhbmQgc2xvdHMKKyAgd2hpY2ggYXJlIGxpc3RlZCBieSBkaXIoKSBidXQgbm90IHlldCBjcmVhdGVkIG9uIGFuIGluc3RhbmNlLgorCistIElzc3VlICMyNTQ5ODogRml4IGEgY3Jhc2ggd2hlbiBnYXJiYWdlLWNvbGxlY3RpbmcgY3R5cGVzIG9iamVjdHMgY3JlYXRlZAorICBieSB3cmFwcGluZyBhIG1lbW9yeXZpZXcuICBUaGlzIHdhcyBhIHJlZ3Jlc3Npb24gbWFkZSBpbiAzLjVhMS4gIEJhc2VkCisgIG9uIHBhdGNoIGJ5IEVyeWtzdW4uCisKKy0gSXNzdWUgIzI1NTg0OiBBZGRlZCAiZXNjYXBlIiB0byB0aGUgX19hbGxfXyBsaXN0IGluIHRoZSBnbG9iIG1vZHVsZS4KKworLSBJc3N1ZSAjMjU1ODQ6IEZpeGVkIHJlY3Vyc2l2ZSBnbG9iKCkgd2l0aCBwYXR0ZXJucyBzdGFydGluZyB3aXRoICdcKlwqJy4KKworLSBJc3N1ZSAjMjU0NDY6IEZpeCByZWdyZXNzaW9uIGluIHNtdHBsaWIncyBBVVRIIExPR0lOIHN1cHBvcnQuCisKKy0gSXNzdWUgIzE4MDEwOiBGaXggdGhlIHB5ZG9jIHdlYiBzZXJ2ZXIncyBtb2R1bGUgc2VhcmNoIGZ1bmN0aW9uIHRvIGhhbmRsZQorICBleGNlcHRpb25zIGZyb20gaW1wb3J0aW5nIHBhY2thZ2VzLgorCistIElzc3VlICMyNTU1NDogR290IHJpZCBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXJzaW5nLgorCistIElzc3VlICMxODk3MzogQ29tbWFuZC1saW5lIGludGVyZmFjZSBvZiB0aGUgY2FsZW5kYXIgbW9kdWxlIG5vdyB1c2VzIGFyZ3BhcnNlCisgIGluc3RlYWQgb2Ygb3B0cGFyc2UuCisKKy0gSXNzdWUgIzI1NTEwOiBmaWxlaW5wdXQuRmlsZUlucHV0LnJlYWRsaW5lKCkgbm93IHJldHVybnMgYicnIGluc3RlYWQgb2YgJycKKyAgYXQgdGhlIGVuZCBpZiB0aGUgRmlsZUlucHV0IHdhcyBvcGVuZWQgd2l0aCBiaW5hcnkgbW9kZS4KKyAgUGF0Y2ggYnkgUnlvc3VrZSBJdG8uCisKKy0gSXNzdWUgIzI1NTAzOiBGaXhlZCBpbnNwZWN0LmdldGRvYygpIGZvciBpbmhlcml0ZWQgZG9jc3RyaW5ncyBvZiBwcm9wZXJ0aWVzLgorICBPcmlnaW5hbCBwYXRjaCBieSBKb2huIE1hcmsgVmFuZGVuYmVyZy4KKworLSBJc3N1ZSAjMjU1MTU6IEFsd2F5cyB1c2Ugb3MudXJhbmRvbSBhcyBhIHNvdXJjZSBvZiByYW5kb21uZXNzIGluIHV1aWQudXVpZDQuCisKKy0gSXNzdWUgIzIxODI3OiBGaXhlZCB0ZXh0d3JhcC5kZWRlbnQoKSBmb3IgdGhlIGNhc2Ugd2hlbiBsYXJnZXN0IGNvbW1vbgorICB3aGl0ZXNwYWNlIGlzIGEgc3Vic3RyaW5nIG9mIHNtYWxsZXN0IGxlYWRpbmcgd2hpdGVzcGFjZS4KKyAgQmFzZWQgb24gcGF0Y2ggYnkgUm9iZXJ0IExpLgorCistIElzc3VlICMyNTQ0NzogVGhlIGxydV9jYWNoZSgpIHdyYXBwZXIgb2JqZWN0cyBub3cgY2FuIGJlIGNvcGllZCBhbmQgcGlja2xlZAorICAoYnkgcmV0dXJuaW5nIHRoZSBvcmlnaW5hbCBvYmplY3QgdW5jaGFuZ2VkKS4KKworLSBJc3N1ZSAjMjUzOTA6IHR5cGluZzogRG9uJ3QgY3Jhc2ggb24gVW5pb25bc3RyLCBQYXR0ZXJuXS4KKworLSBJc3N1ZSAjMjU0NDE6IGFzeW5jaW86IFJhaXNlIGVycm9yIGZyb20gZHJhaW4oKSB3aGVuIHNvY2tldCBpcyBjbG9zZWQuCisKKy0gSXNzdWUgIzI1NDEwOiBDbGVhbmVkIHVwIGFuZCBmaXhlZCBtaW5vciBidWdzIGluIEMgaW1wbGVtZW50YXRpb24gb2YKKyAgT3JkZXJlZERpY3QuCisKKy0gSXNzdWUgIzI1NDExOiBJbXByb3ZlZCBVbmljb2RlIHN1cHBvcnQgaW4gU01UUEhhbmRsZXIgdGhyb3VnaCBiZXR0ZXIgdXNlIG9mCisgIHRoZSBlbWFpbCBwYWNrYWdlLiBUaGFua3MgdG8gdXNlciBzaW1vbjA0IGZvciB0aGUgcGF0Y2guCisKKy0gTW92ZSB0aGUgaW1wIG1vZHVsZSBmcm9tIGEgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyB0byBEZXByZWNhdGlvbldhcm5pbmcuCisKKy0gSXNzdWUgIzI1NDA3OiBSZW1vdmUgbWVudGlvbnMgb2YgdGhlIGZvcm1hdHRlciBtb2R1bGUgYmVpbmcgcmVtb3ZlZCBpbgorICBQeXRob24gMy42LgorCistIElzc3VlICMyNTQwNjogRml4ZWQgYSBidWcgaW4gQyBpbXBsZW1lbnRhdGlvbiBvZiBPcmRlcmVkRGljdC5tb3ZlX3RvX2VuZCgpCisgIHRoYXQgY2F1c2VkIHNlZ21lbnRhdGlvbiBmYXVsdCBvciBoYW5nIGluIGl0ZXJhdGluZyBhZnRlciBtb3Zpbmcgc2V2ZXJhbAorICBpdGVtcyB0byB0aGUgc3RhcnQgb2Ygb3JkZXJlZCBkaWN0LgorCistIElzc3VlICMyNTM4MjogcGlja2xldG9vbHMuZGlzKCkgbm93IG91dHB1dHMgaW1wbGljaXQgbWVtbyBpbmRleCBmb3IgdGhlCisgIE1FTU9JWkUgb3Bjb2RlLgorCistIElzc3VlICMyNTM1NzogQWRkIGFuIG9wdGlvbmFsIG5ld2xpbmUgcGFyYW1lciB0byBiaW5hc2NpaS5iMmFfYmFzZTY0KCkuCisgIGJhc2U2NC5iNjRlbmNvZGUoKSB1c2VzIGl0IHRvIGF2b2lkIGEgbWVtb3J5IGNvcHkuCisKKy0gSXNzdWUgIzI0MTY0OiBPYmplY3RzIHRoYXQgbmVlZCBjYWxsaW5nIGBgX19uZXdfX2BgIHdpdGgga2V5d29yZCBhcmd1bWVudHMsCisgIGNhbiBub3cgYmUgcGlja2xlZCB1c2luZyBwaWNrbGUgcHJvdG9jb2xzIG9sZGVyIHRoYW4gcHJvdG9jb2wgdmVyc2lvbiA0LgorCistIElzc3VlICMyNTM2NDogemlwZmlsZSBub3cgd29ya3MgaW4gdGhyZWFkcyBkaXNhYmxlZCBidWlsZHMuCisKKy0gSXNzdWUgIzI1MzI4OiBzbXRwZCdzIFNNVFBDaGFubmVsIG5vdyBjb3JyZWN0bHkgcmFpc2VzIGEgVmFsdWVFcnJvciBpZiBib3RoCisgIGRlY29kZV9kYXRhIGFuZCBlbmFibGVfU01UUFVURjggYXJlIHNldCB0byB0cnVlLgorCistIElzc3VlICMxNjA5OTogUm9ib3RGaWxlUGFyc2VyIG5vdyBzdXBwb3J0cyBDcmF3bC1kZWxheSBhbmQgUmVxdWVzdC1yYXRlCisgIGV4dGVuc2lvbnMuICBQYXRjaCBieSBOaWtvbGF5IEJvZ295Y2hldi4KKworLSBJc3N1ZSAjMjUzMTY6IGRpc3R1dGlscyByYWlzZXMgT1NFcnJvciBpbnN0ZWFkIG9mIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKKyAgd2hlbiBNU1ZDIGlzIG5vdCBpbnN0YWxsZWQuCisKKy0gSXNzdWUgIzI1MzgwOiBGaXhlZCBwcm90b2NvbCBmb3IgdGhlIFNUQUNLX0dMT0JBTCBvcGNvZGUgaW4KKyAgcGlja2xldG9vbHMub3Bjb2Rlcy4KKworLSBJc3N1ZSAjMjM5NzI6IFVwZGF0ZXMgYXN5bmNpbyBkYXRhZ3JhbSBjcmVhdGUgbWV0aG9kIGFsbG93aW5nIHJldXNlcG9ydAorICBhbmQgcmV1c2VhZGRyIHNvY2tldCBvcHRpb25zIHRvIGJlIHNldCBwcmlvciB0byBiaW5kaW5nIHRoZSBzb2NrZXQuCisgIE1pcnJvcmluZyB0aGUgZXhpc3RpbmcgYXN5bmNpbyBjcmVhdGVfc2VydmVyIG1ldGhvZCB0aGUgcmV1c2VhZGRyIG9wdGlvbgorICBmb3IgZGF0YWdyYW0gc29ja2V0cyBkZWZhdWx0cyB0byBUcnVlIGlmIHRoZSBPL1MgaXMgJ3Bvc2l4JyAoZXhjZXB0IGlmIHRoZQorICBwbGF0Zm9ybSBpcyBDeWd3aW4pLiBQYXRjaCBieSBDaHJpcyBMYXdzLgorCistIElzc3VlICMyNTMwNDogQWRkIGFzeW5jaW8ucnVuX2Nvcm91dGluZV90aHJlYWRzYWZlKCkuICBUaGlzIGxldHMgeW91CisgIHN1Ym1pdCBhIGNvcm91dGluZSB0byBhIGxvb3AgZnJvbSBhbm90aGVyIHRocmVhZCwgcmV0dXJuaW5nIGEKKyAgY29uY3VycmVudC5mdXR1cmVzLkZ1dHVyZS4gIEJ5IFZpbmNlbnQgTWljaGVsLgorCistIElzc3VlICMyNTIzMjogRml4IENHSVJlcXVlc3RIYW5kbGVyIHRvIHNwbGl0IHRoZSBxdWVyeSBmcm9tIHRoZSBVUkwgYXQgdGhlCisgIGZpcnN0IHF1ZXN0aW9uIG1hcmsgKD8pIHJhdGhlciB0aGFuIHRoZSBsYXN0LiBQYXRjaCBmcm9tIFhpYW5nIFpoYW5nLgorCistIElzc3VlICMyNDY1NzogUHJldmVudCBDR0lSZXF1ZXN0SGFuZGxlciBmcm9tIGNvbGxhcHNpbmcgc2xhc2hlcyBpbiB0aGUKKyAgcXVlcnkgcGFydCBvZiB0aGUgVVJMIGFzIGlmIGl0IHdlcmUgYSBwYXRoLiBQYXRjaCBmcm9tIFhpYW5nIFpoYW5nLgorCistIElzc3VlICMyNTI4NzogRG9uJ3QgYWRkIGNyeXB0Lk1FVEhPRF9DUllQVCB0byBjcnlwdC5tZXRob2RzIGlmIGl0J3Mgbm90CisgIHN1cHBvcnRlZC4gQ2hlY2sgaWYgaXQgaXMgc3VwcG9ydGVkLCBpdCBtYXkgbm90IGJlIHN1cHBvcnRlZCBvbiBPcGVuQlNEIGZvcgorICBleGFtcGxlLgorCistIElzc3VlICMyMzYwMDogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0emluZm8uZnJvbXV0YygpIHdhcyByZXR1cm5pbmcKKyAgd3JvbmcgcmVzdWx0cyBpbiBzb21lIGNhc2VzLgorCistIElzc3VlICMyNTIwMzogRmFpbGVkIHJlYWRsaW5lLnNldF9jb21wbGV0ZXJfZGVsaW1zKCkgbm8gbG9uZ2VyIGxlZnQgdGhlCisgIG1vZHVsZSBpbiBpbmNvbnNpc3RlbnQgc3RhdGUuCisKKy0gSXNzdWUgIzI1MDExOiBybGNvbXBsZXRlciBub3cgb21pdHMgcHJpdmF0ZSBhbmQgc3BlY2lhbCBhdHRyaWJ1dGUgbmFtZXMgdW5sZXNzCisgIHRoZSBwcmVmaXggc3RhcnRzIHdpdGggdW5kZXJzY29yZXMuCisKKy0gSXNzdWUgIzI1MjA5OiBybGNvbXBsZXRlciBub3cgY2FuIGFkZCBhIHNwYWNlIG9yIGEgY29sb24gYWZ0ZXIgY29tcGxldGVkCisgIGtleXdvcmQuCisKKy0gSXNzdWUgIzIyMjQxOiB0aW1lem9uZS51dGMgbmFtZSBpcyBub3cgcGxhaW4gJ1VUQycsIG5vdCAnVVRDLTAwOjAwJy4KKworLSBJc3N1ZSAjMjM1MTc6IGZyb210aW1lc3RhbXAoKSBhbmQgdXRjZnJvbXRpbWVzdGFtcCgpIG1ldGhvZHMgb2YKKyAgZGF0ZXRpbWUuZGF0ZXRpbWUgbm93IHJvdW5kIG1pY3Jvc2Vjb25kcyB0byBuZWFyZXN0IHdpdGggdGllcyBnb2luZyB0bworICBuZWFyZXN0IGV2ZW4gaW50ZWdlciAoUk9VTkRfSEFMRl9FVkVOKSwgYXMgcm91bmQoZmxvYXQpLCBpbnN0ZWFkIG9mIHJvdW5kaW5nCisgIHRvd2FyZHMgLUluZmluaXR5IChST1VORF9GTE9PUikuCisKKy0gSXNzdWUgIzIzNTUyOiBUaW1laXQgbm93IHdhcm5zIHdoZW4gdGhlcmUgaXMgc3Vic3RhbnRpYWwgKDR4KSB2YXJpYW5jZQorICBiZXR3ZWVuIGJlc3QgYW5kIHdvcnN0IHRpbWVzLiBQYXRjaCBmcm9tIFNlcmhpeSBTdG9yY2hha2EuCisKKy0gSXNzdWUgIzI0NjMzOiBzaXRlLXBhY2thZ2VzL1JFQURNRSAtPiBSRUFETUUudHh0LgorCistIElzc3VlICMyNDg3OTogaGVscCgpIGFuZCBweWRvYyBjYW4gbm93IGxpc3QgbmFtZWQgdHVwbGUgZmllbGRzIGluIHRoZQorICBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCByYXRoZXIgdGhhbiBhbHBoYWJldGljYWxseS4gIFRoZSBvcmRlcmluZyBpcworICBkZXRlcm1pbmVkIGJ5IHRoZSBfZmllbGRzIGF0dHJpYnV0ZSBpZiBwcmVzZW50LgorCistIElzc3VlICMyNDg3NDogSW1wcm92ZSBzcGVlZCBvZiBpdGVydG9vbHMuY3ljbGUoKSBhbmQgbWFrZSBpdHMKKyAgcGlja2xlIG1vcmUgY29tcGFjdC4KKworLSBGaXggY3Jhc2ggaW4gaXRlcnRvb2xzLmN5Y2xlLl9fc2V0c3RhdGVfXygpIHdoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IHdhc24ndAorICBhIGxpc3QuCisKKy0gSXNzdWUgIzIwMDU5OiB1cmxsaWIucGFyc2UgcmFpc2VzIFZhbHVlRXJyb3Igb24gYWxsIGludmFsaWQgcG9ydHMuCisgIFBhdGNoIGJ5IE1hcnRpbiBQYW50ZXIuCisKKy0gSXNzdWUgIzI0MzYwOiBJbXByb3ZlIF9fcmVwcl9fIG9mIGFyZ3BhcnNlLk5hbWVzcGFjZSgpIGZvciBpbnZhbGlkCisgIGlkZW50aWZpZXJzLiAgUGF0Y2ggYnkgTWF0dGhpYXMgQnVzc29ubmllci4KKworLSBJc3N1ZSAjMjM0MjY6IHJ1bl9zZXR1cCB3YXMgYnJva2VuIGluIGRpc3R1dGlscy4KKyAgUGF0Y2ggZnJvbSBBbGV4YW5kZXIgQmVsb3BvbHNreS4KKworLSBJc3N1ZSAjMTM5Mzg6IDJ0bzMgY29udmVydHMgU3RyaW5nVHlwZXMgdG8gYSB0dXBsZS4gUGF0Y2ggZnJvbSBNYXJrIEhhbW1vbmQuCisKKy0gSXNzdWUgIzIwOTE6IG9wZW4oKSBhY2NlcHRlZCBhICdVJyBtb2RlIHN0cmluZyBjb250YWluaW5nICcrJywgYnV0ICdVJyBjYW4KKyAgb25seSBiZSB1c2VkIHdpdGggJ3InLiBQYXRjaCBmcm9tIEplZmYgQmFsb2doIGFuZCBKb2huIE8nQ29ubm9yLgorCistIElzc3VlICM4NTg1OiBpbXByb3ZlZCB0ZXN0cyBmb3IgemlwaW1wb3J0ZXIyLiBQYXRjaCBmcm9tIE1hcmsgTGF3cmVuY2UuCisKKy0gSXNzdWUgIzE4NjIyOiB1bml0dGVzdC5tb2NrLm1vY2tfb3BlbigpLnJlc2V0X21vY2sgd291bGQgcmVjdXJzZSBpbmZpbml0ZWx5LgorICBQYXRjaCBmcm9tIE5pY29sYSBQYWx1bWJvIGFuZCBMYXVyZW50IERlIEJ1eXN0LgorCistIElzc3VlICMyNDQyNjogRmFzdCBzZWFyY2hpbmcgb3B0aW1pemF0aW9uIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMgbm93IHdvcmtzCisgIGZvciBwYXR0ZXJucyB0aGF0IHN0YXJ0cyB3aXRoIGNhcHR1cmluZyBncm91cHMuICBGYXN0IHNlYXJjaGluZyBvcHRpbWl6YXRpb24KKyAgbm93IGNhbid0IGJlIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZS4KKworLSBJc3N1ZSAjMjM2NjE6IHVuaXR0ZXN0Lm1vY2sgc2lkZV9lZmZlY3RzIGNhbiBub3cgYmUgZXhjZXB0aW9ucyBhZ2Fpbi4gVGhpcworICB3YXMgYSByZWdyZXNzaW9uIHZzIFB5dGhvbiAzLjQuIFBhdGNoIGZyb20gSWduYWNpbyBSb3NzaQorCistIElzc3VlICMxMzI0ODogUmVtb3ZlIGRlcHJlY2F0ZWQgaW5zcGVjdC5nZXRtb2R1bGVpbmZvIGZ1bmN0aW9uLgorCistIElzc3VlICMyNTU3ODogRml4IChhbm90aGVyKSBtZW1vcnkgbGVhayBpbiBTU0xTb2NrZXQuZ2V0cGVlcmNlcigpLgorCistIElzc3VlICMyNTUzMDogRGlzYWJsZSB0aGUgdnVsbmVyYWJsZSBTU0x2MyBwcm90b2NvbCBieSBkZWZhdWx0IHdoZW4gY3JlYXRpbmcKKyAgc3NsLlNTTENvbnRleHQuCisKKy0gSXNzdWUgIzI1NTY5OiBGaXggbWVtb3J5IGxlYWsgaW4gU1NMU29ja2V0LmdldHBlZXJjZXJ0KCkuCisKKy0gSXNzdWUgIzI1NDcxOiBTb2NrZXRzIHJldHVybmVkIGZyb20gYWNjZXB0KCkgc2hvdWxkbid0IGFwcGVhciB0byBiZQorICBub25ibG9ja2luZy4KKworLSBJc3N1ZSAjMjUzMTk6IFdoZW4gdGhyZWFkaW5nLkV2ZW50IGlzIHJlaW5pdGlhbGl6ZWQsIHRoZSB1bmRlcmx5aW5nIGNvbmRpdGlvbgorICBzaG91bGQgdXNlIGEgcmVndWxhciBsb2NrIHJhdGhlciB0aGFuIGEgcmVjdXJzaXZlIGxvY2suCisKIC0gU2tpcCBnZXRhZGRyaW5mbyBpZiBob3N0IGlzIGFscmVhZHkgcmVzb2x2ZWQuCiAgIFBhdGNoIGJ5IEEuIEplc3NlIEppcnl1IERhdmlzLgogCkBAIC04NjUsNTMgKzIwODAsOSBAQAogCiAtIElzc3VlICMyNzA0MTogYXN5bmNpbzogQWRkIGxvb3AuY3JlYXRlX2Z1dHVyZSBtZXRob2QKIAotLSBJc3N1ZSAjMjcyMjM6IGFzeW5jaW86IEZpeCBfcmVhZF9yZWFkeSBhbmQgX3dyaXRlX3JlYWR5IHRvIHJlc3BlY3QKLSAgX2Nvbm5fbG9zdC4KLSAgUGF0Y2ggYnkgxYF1a2FzeiBMYW5nYS4KLQotLSBJc3N1ZSAjMjI5NzA6IGFzeW5jaW86IEZpeCBpbmNvbnNpc3RlbmN5IGNhbmNlbGxpbmcgQ29uZGl0aW9uLndhaXQuCi0gIFBhdGNoIGJ5IERhdmlkIENvbGVzLgotCiBJRExFCiAtLS0tCiAKLS0gSXNzdWUgIzUxMjQ6IFBhc3RlIHdpdGggdGV4dCBzZWxlY3RlZCBub3cgcmVwbGFjZXMgdGhlIHNlbGVjdGlvbiBvbiBYMTEuCi0gIFRoaXMgbWF0Y2hlcyBob3cgcGFzdGUgd29ya3Mgb24gV2luZG93cywgTWFjLCBtb3N0IG1vZGVybiBMaW51eCBhcHBzLAotICBhbmQgdHRrIHdpZGdldHMuICBPcmlnaW5hbCBwYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgotCi0tIElzc3VlICMyNDc1OTogTWFrZSBjbGVhciBpbiBpZGxlbGliLmlkbGVfdGVzdC5fX2luaXRfXyB0aGF0IHRoZSBkaXJlY3RvcnkKLSAgaXMgYSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRlc3QudGVzdF9pZGxlIGFuZCB0b29sIGZvciBtYWludGFpbmVycy4KLQotLSBJc3N1ZSAjMjcxOTY6IFN0b3AgJ1RoZW1lQ2hhbmdlZCcgd2FybmluZ3Mgd2hlbiBydW5uaW5nIElETEUgdGVzdHMuCi0gIFRoZXNlIHBlcnNpc3RlZCBhZnRlciBvdGhlciB3YXJuaW5ncyB3ZXJlIHN1cHByZXNzZWQgaW4gIzIwNTY3LgotICBBcHBseSBTZXJoaXkgU3RvcmNoYWthJ3MgdXBkYXRlX2lkbGV0YXNrcyBzb2x1dGlvbiB0byBmb3VyIHRlc3QgZmlsZXMuCi0gIFJlY29yZCB0aGlzIGFkZGl0aW9uYWwgYWR2aWNlIGluIGlkbGVfdGVzdC9SRUFETUUudHh0Ci0KLS0gSXNzdWUgIzIwNTY3OiBSZXZpc2UgaWRsZV90ZXN0L1JFQURNRS50eHQgd2l0aCBhZHZpY2UgYWJvdXQgYXZvaWRpbmcKLSAgdGsgd2FybmluZyBtZXNzYWdlcyBmcm9tIHRlc3RzLiAgQXBwbHkgYWR2aWNlIHRvIHNldmVyYWwgSURMRSB0ZXN0cy4KLQotLSBJc3N1ZSAjMjcxMTc6IE1ha2UgY29sb3JpemVyIGh0ZXN0IGFuZCB0dXJ0bGVkZW1vIHdvcmsgd2l0aCBkYXJrIHRoZW1lcy4KLSAgTW92ZSBjb2RlIGZvciBjb25maWd1cmluZyB0ZXh0IHdpZGdldCBjb2xvcnMgdG8gYSBuZXcgZnVuY3Rpb24uCi0KLS0gSXNzdWUgIzI2NjczOiBXaGVuIHRrIHJlcG9ydHMgZm9udCBzaXplIGFzIDAsIGNoYW5nZSB0byBzaXplIDEwLgotICBTdWNoIGZvbnRzIG9uIExpbnV4IHByZXZlbnRlZCB0aGUgY29uZmlndXJhdGlvbiBkaWFsb2cgZnJvbSBvcGVuaW5nLgotCi0tIElzc3VlICMyMTkzOTogQWRkIHRlc3QgZm9yIElETEUncyBwZXJjb2xhdG9yLgotICBPcmlnaW5hbCBwYXRjaCBieSBTYWltYWRoYXYgSGVibGlrYXIuCi0KLS0gSXNzdWUgIzIxNjc2OiBBZGQgdGVzdCBmb3IgSURMRSdzIHJlcGxhY2UgZGlhbG9nLgotICBPcmlnaW5hbCBwYXRjaCBieSBTYWltYWRoYXYgSGVibGlrYXIuCi0KLS0gSXNzdWUgIzE4NDEwOiBBZGQgdGVzdCBmb3IgSURMRSdzIHNlYXJjaCBkaWFsb2cuCi0gIE9yaWdpbmFsIHBhdGNoIGJ5IFdlc3RsZXkgTWFydMOtbmV6LgotCi0tIElzc3VlICMyMTcwMzogQWRkIHRlc3QgZm9yIElETEUncyB1bmRvIGRlbGVnYXRvci4KLSAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyIC4KLQotLSBJc3N1ZSAjMjcwNDQ6IEFkZCBDb25maWdEaWFsb2cucmVtb3ZlX3Zhcl9jYWxsYmFja3MgdG8gc3RvcCBtZW1vcnkgbGVha3MuCi0KLS0gSXNzdWUgIzIzOTc3OiBBZGQgbW9yZSBhc3NlcnRzIHRvIHRlc3RfZGVsZWdhdG9yLgotCiAtIElzc3VlICMyMDY0MDogQWRkIHRlc3RzIGZvciBpZGxlbGliLmNvbmZpZ0hlbHBTb3VyY2VFZGl0LgogICBQYXRjaCBieSBTYWltYWRoYXYgSGVibGlrYXIuCiAKQEAgLTkyNSwxNCArMjA5NiwxMDMgQEAKICAgTUFSSyBpbiBSRUFETUUudHh0IGFuZCBvcGVuIHRoaXMgYW5kIE5FV1MudHh0IHdpdGggJ2FzY2lpJy4KICAgUmUtZW5jb2RlIENSRURJVFMudHh0IHRvIHV0Zi04IGFuZCBvcGVuIGl0IHdpdGggJ3V0Zi04Jy4KIAorLSBJc3N1ZSAjMTUzNDg6IFN0b3AgdGhlIGRlYnVnZ2VyIGVuZ2luZSAobm9ybWFsbHkgaW4gYSB1c2VyIHByb2Nlc3MpCisgIGJlZm9yZSBjbG9zaW5nIHRoZSBkZWJ1Z2dlciB3aW5kb3cgKHJ1bm5pbmcgaW4gdGhlIElETEUgcHJvY2VzcykuCisgIFRoaXMgcHJldmVudHMgdGhlIFJ1bnRpbWVFcnJvcnMgdGhhdCB3ZXJlIGJlaW5nIGNhdWdodCBhbmQgaWdub3JlZC4KKworLSBJc3N1ZSAjMjQ0NTU6IFByZXZlbnQgSURMRSBmcm9tIGhhbmdpbmcgd2hlbiBhKSBjbG9zaW5nIHRoZSBzaGVsbCB3aGlsZSB0aGUKKyAgZGVidWdnZXIgaXMgYWN0aXZlICgxNTM0Nyk7IGIpIGNsb3NpbmcgdGhlIGRlYnVnZ2VyIHdpdGggdGhlIFtYXSBidXR0b24KKyAgKDE1MzQ4KTsgYW5kIGMpIGFjdGl2YXRpbmcgdGhlIGRlYnVnZ2VyIHdoZW4gYWxyZWFkeSBhY3RpdmUgKDI0NDU1KS4KKyAgVGhlIHBhdGNoIGJ5IE1hcmsgUm9zZW1hbiBkb2VzIHRoaXMgYnkgbWFraW5nIHR3byBjaGFuZ2VzLgorICAxLiBTdXNwZW5kIGFuZCByZXN1bWUgdGhlIGd1aS5pbnRlcmFjdGlvbiBtZXRob2Qgd2l0aCB0aGUgdGNsIHZ3YWl0CisgIG1lY2hhbmlzbSBpbnRlbmRlZCBmb3IgdGhpcyBwdXJwb3NlIChpbnN0ZWFkIG9mIHJvb3QubWFpbmxvb3AgJiAucXVpdCkuCisgIDIuIEluIGd1aS5ydW4sIGFsbG93IGFueSBleGlzdGluZyBpbnRlcmFjdGlvbiB0byB0ZXJtaW5hdGUgZmlyc3QuCisKKy0gQ2hhbmdlICdUaGUgcHJvZ3JhbScgdG8gJ1lvdXIgcHJvZ3JhbScgaW4gYW4gSURMRSAna2lsbCBwcm9ncmFtPycgbWVzc2FnZQorICB0byBtYWtlIGl0IGNsZWFyZXIgdGhhdCB0aGUgcHJvZ3JhbSByZWZlcnJlZCB0byBpcyB0aGUgY3VycmVudGx5IHJ1bm5pbmcKKyAgdXNlciBwcm9ncmFtLCBub3QgSURMRSBpdHNlbGYuCisKKy0gSXNzdWUgIzI0NzUwOiBJbXByb3ZlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBJRExFIGVkaXRvciB3aW5kb3cgc3RhdHVzIGJhci4KKyAgUGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNTMxMzogQ2hhbmdlIHRoZSBoYW5kbGluZyBvZiBuZXcgYnVpbHQtaW4gdGV4dCBjb2xvciB0aGVtZXMgdG8gYmV0dGVyCisgIGFkZHJlc3MgdGhlIGNvbXBhdGliaWxpdHkgcHJvYmxlbSBpbnRyb2R1Y2VkIGJ5IHRoZSBhZGRpdGlvbiBvZiBJRExFIERhcmsuCisgIENvbnNpc3RlbnRseSB1c2UgdGhlIHJldmlzZWQgaWRsZUNvbmYuQ3VycmVudFRoZW1lIGV2ZXJ5d2hlcmUgaW4gaWRsZWxpYi4KKworLSBJc3N1ZSAjMjQ3ODI6IEV4dGVuc2lvbiBjb25maWd1cmF0aW9uIGlzIG5vdyBhIHRhYiBpbiB0aGUgSURMRSBQcmVmZXJlbmNlcworICBkaWFsb2cgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBkaWFsb2cuICBUaGUgZm9ybWVyIHRhYnMgYXJlIG5vdyBhIHNvcnRlZAorICBsaXN0LiAgUGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyMjcyNjogUmUtYWN0aXZhdGUgdGhlIGNvbmZpZyBkaWFsb2cgaGVscCBidXR0b24gd2l0aCBzb21lIGNvbnRlbnQKKyAgYWJvdXQgdGhlIG90aGVyIGJ1dHRvbnMgYW5kIHRoZSBuZXcgSURMRSBEYXJrIHRoZW1lLgorCistIElzc3VlICMyNDgyMDogSURMRSBub3cgaGFzIGFuICdJRExFIERhcmsnIGJ1aWx0LWluIHRleHQgY29sb3IgdGhlbWUuCisgIEl0IGlzIG1vcmUgb3IgbGVzcyBJRExFIENsYXNzaWMgaW52ZXJ0ZWQsIHdpdGggYSBjb2JhbHQgYmx1ZSBiYWNrZ3JvdW5kLgorICBTdHJpbmdzLCBjb21tZW50cywga2V5d29yZHMsIC4uLiBhcmUgc3RpbGwgZ3JlZW4sIHJlZCwgb3JhbmdlLCAuLi4gLgorICBUbyB1c2UgaXQgd2l0aCBJRExFcyByZWxlYXNlZCBiZWZvcmUgTm92ZW1iZXIgMjAxNSwgaGl0IHRoZQorICAnU2F2ZSBhcyBOZXcgQ3VzdG9tIFRoZW1lJyBidXR0b24gYW5kIGVudGVyIGEgbmV3IG5hbWUsCisgIHN1Y2ggYXMgJ0N1c3RvbSBEYXJrJy4gIFRoZSBjdXN0b20gdGhlbWUgd2lsbCB3b3JrIHdpdGggYW55IElETEUKKyAgcmVsZWFzZSwgYW5kIGNhbiBiZSBtb2RpZmllZC4KKworLSBJc3N1ZSAjMjUyMjQ6IFJFQURNRS50eHQgaXMgbm93IGFuIGlkbGVsaWIgaW5kZXggZm9yIElETEUgZGV2ZWxvcGVycyBhbmQKKyAgY3VyaW91cyB1c2Vycy4gIFRoZSBwcmV2aW91cyB1c2VyIGNvbnRlbnQgaXMgbm93IGluIHRoZSBJRExFIGRvYyBjaGFwdGVyLgorICAnSURMRScgbm93IG1lYW5zICdJbnRlZ3JhdGVkIERldmVsb3BtZW50IGFuZCBMZWFybmluZyBFbnZpcm9ubWVudCcuCisKKy0gSXNzdWUgIzI0ODIwOiBVc2VycyBjYW4gbm93IHNldCBicmVha3BvaW50IGNvbG9ycyBpbgorICBTZXR0aW5ncyAtPiBDdXN0b20gSGlnaGxpZ2h0aW5nLiAgT3JpZ2luYWwgcGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNDk3MjogSW5hY3RpdmUgc2VsZWN0aW9uIGJhY2tncm91bmQgbm93IG1hdGNoZXMgYWN0aXZlIHNlbGVjdGlvbgorICBiYWNrZ3JvdW5kLCBhcyBjb25maWd1cmVkIGJ5IHVzZXJzLCBvbiBhbGwgc3lzdGVtcy4gIEZvdW5kIGl0ZW1zIGFyZSBub3cKKyAgYWx3YXlzIGhpZ2hsaWdodGVkIG9uIFdpbmRvd3MuICBJbml0aWFsIHBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjQ1NzA6IElkbGU6IG1ha2UgY2FsbHRpcCBhbmQgY29tcGxldGlvbiBib3hlcyBhcHBlYXIgb24gTWFjcworICBhZmZlY3RlZCBieSBhIHRrIHJlZ3Jlc3Npb24uICBJbml0aWFsIHBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjQ5ODg6IElkbGUgU2Nyb2xsZWRMaXN0IGNvbnRleHQgbWVudXMgKHVzZWQgaW4gZGVidWdnZXIpCisgIG5vdyB3b3JrIG9uIE1hYyBBcXVhLiAgUGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNDgwMTogTWFrZSByaWdodC1jbGljayBmb3IgY29udGV4dCBtZW51IHdvcmsgb24gTWFjIEFxdWEuCisgIFBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjUxNzM6IEFzc29jaWF0ZSB0a2ludGVyIG1lc3NhZ2Vib3hlcyB3aXRoIGEgc3BlY2lmaWMgd2lkZ2V0LgorICBGb3IgTWFjIE9TWCwgbWFrZSB0aGVtIGEgJ3NoZWV0Jy4gIFBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjUxOTg6IEVuaGFuY2UgdGhlIGluaXRpYWwgaHRtbCB2aWV3ZXIgbm93IHVzZWQgZm9yIElkbGUgSGVscC4KKyAgKiBQcm9wZXJseSBpbmRlbnQgZml4ZWQtcGl0Y2ggdGV4dCAocGF0Y2ggYnkgTWFyayBSb3NlbWFuKS4KKyAgKiBHaXZlIGNvZGUgc25pcHBldCBhIHZlcnkgU3BoaW54LWxpa2UgbGlnaHQgYmx1ZWlzaC1ncmF5IGJhY2tncm91bmQuCisgICogUmUtdXNlIGluaXRpYWwgd2lkdGggYW5kIGhlaWdodCBzZXQgYnkgdXNlcnMgZm9yIHNoZWxsIGFuZCBlZGl0b3IuCisgICogV2hlbiB0aGUgVGFibGUgb2YgQ29udGVudHMgKFRPQykgbWVudSBpcyB1c2VkLCBwdXQgdGhlIHNlY3Rpb24gaGVhZGVyCisgIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbi4KKworLSBJc3N1ZSAjMjUyMjU6IENvbmRlbnNlIGFuZCByZXdyaXRlIElkbGUgZG9jIHNlY3Rpb24gb24gdGV4dCBjb2xvcnMuCisKKy0gSXNzdWUgIzIxOTk1OiBFeHBsYWluIHNvbWUgZGlmZmVyZW5jZXMgYmV0d2VlbiBJRExFIGFuZCBjb25zb2xlIFB5dGhvbi4KKworLSBJc3N1ZSAjMjI4MjA6IEV4cGxhaW4gbmVlZCBmb3IgKnByaW50KiB3aGVuIHJ1bm5pbmcgZmlsZSBmcm9tIElkbGUgZWRpdG9yLgorCistIElzc3VlICMyNTIyNDogRG9jOiBhdWdtZW50IElkbGUgZmVhdHVyZSBsaXN0IGFuZCBuby1zdWJwcm9jZXNzIHNlY3Rpb24uCisKKy0gSXNzdWUgIzI1MjE5OiBVcGRhdGUgZG9jIGZvciBJZGxlIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICBTb21lIHdlcmUgbWlzc2luZyBhbmQgbm90ZXMgd2VyZSBub3QgY29ycmVjdC4KKworLSBJc3N1ZSAjMjQ4NjE6IE1vc3Qgb2YgaWRsZWxpYiBpcyBwcml2YXRlIGFuZCBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgVXNlIGlkbGVpYi5pZGxlLiogdG8gc3RhcnQgSWRsZS4gU2VlIGlkbGVsaWIuX19pbml0X18uX19kb2NfXy4KKworLSBJc3N1ZSAjMjUxOTk6IElkbGU6IGFkZCBzeW5jaHJvbml6YXRpb24gY29tbWVudHMgZm9yIGZ1dHVyZSBtYWludGFpbmVycy4KKworLSBJc3N1ZSAjMTY4OTM6IFJlcGxhY2UgaGVscC50eHQgd2l0aCBoZWxwLmh0bWwgZm9yIElkbGUgZG9jIGRpc3BsYXkuCisgIFRoZSBuZXcgaWRsZWxpYi9oZWxwLmh0bWwgaXMgcnN0cmlwcGVkIERvYy9idWlsZC9odG1sL2xpYnJhcnkvaWRsZS5odG1sLgorICBJdCBsb29rcyBiZXR0ZXIgdGhhbiBoZWxwLnR4dCBhbmQgd2lsbCBiZXR0ZXIgZG9jdW1lbnQgSWRsZSBhcyByZWxlYXNlZC4KKyAgVGhlIHRraW50ZXIgaHRtbCB2aWV3ZXIgdGhhdCB3b3JrcyBmb3IgdGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvc2UgUm9zZW1hbi4KKyAgVGhlIG5vdyB1bnVzZWQgRWRpdG9yV2luZG93LkhlbHBEaWFsb2cgY2xhc3MgYW5kIGhlbHQudHh0IGZpbGUgYXJlIGRlcHJlY2F0ZWQuCisKKy0gSXNzdWUgIzI0MTk5OiBEZXByZWNhdGUgdW51c2VkIGlkbGVsaWIuaWRsZXZlciB3aXRoIHBvc3NpYmxlIHJlbW92YWwgaW4gMy42LgorCistIElzc3VlICMyNDc5MDogUmVtb3ZlIGV4dHJhbmVvdXMgY29kZSAod2hpY2ggYWxzbyBjcmVhdGUgMiAmIDMgY29uZmxpY3RzKS4KKwogRG9jdW1lbnRhdGlvbgogLS0tLS0tLS0tLS0tLQogCi0tIElzc3VlICMxOTQ4OTogTW92ZWQgdGhlIHNlYXJjaCBib3ggZnJvbSB0aGUgc2lkZWJhciB0byB0aGUgaGVhZGVyIGFuZCBmb290ZXIKLSAgb2YgZWFjaCBwYWdlLiAgUGF0Y2ggYnkgQW1tYXIgQXNrYXIuCi0KLS0gSXNzdWUgIzI0MTM2OiBEb2N1bWVudCB0aGUgbmV3IFBFUCA0NDggdW5wYWNraW5nIHN5bnRheCBvZiAzLjUuCi0KIC0gSXNzdWUgIzI2NzM2OiBVc2VkIEhUVFBTIGZvciBleHRlcm5hbCBsaW5rcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpZiBwb3NzaWJsZS4KIAogLSBJc3N1ZSAjNjk1MzogUmV3b3JrIHRoZSBSZWFkbGluZSBtb2R1bGUgZG9jdW1lbnRhdGlvbiB0byBncm91cCByZWxhdGVkCkBAIC05NDEsOCArMjIwMSw4IEBACiAKIC0gSXNzdWUgIzIzNjA2OiBBZGRzIG5vdGUgdG8gY3R5cGVzIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIGNkbGwubXN2Y3J0LgogCi0tIElzc3VlICMyNTUwMDogRml4IGRvY3VtZW50YXRpb24gdG8gbm90IGNsYWltIHRoYXQgX19pbXBvcnRfXyBpcyBzZWFyY2hlZCBmb3IKLSAgaW4gdGhlIGdsb2JhbCBzY29wZS4KKy0gSXNzdWUgIzI0OTUyOiBDbGFyaWZ5IHRoZSBkZWZhdWx0IHNpemUgYXJndW1lbnQgb2Ygc3RhY2tfc2l6ZSgpIGluCisgIHRoZSAidGhyZWFkaW5nIiBhbmQgIl90aHJlYWQiIG1vZHVsZXMuIFBhdGNoIGZyb20gTWF0dGlwLgogCiAtIElzc3VlICMyNjAxNDogVXBkYXRlIDMueCBwYWNrYWdpbmcgZG9jdW1lbnRhdGlvbjoKICAgKiAiU2VlIGFsc28iIGxpbmtzIHRvIHRoZSBuZXcgZG9jcyBhcmUgbm93IHByb3ZpZGVkIGluIHRoZSBsZWdhY3kgcGFnZXMKQEAgLTk1NCw2ICsyMjE0LDkgQEAKIC0gSXNzdWUgIzIxOTE2OiBBZGRlZCB0ZXN0cyBmb3IgdGhlIHR1cnRsZSBtb2R1bGUuICBQYXRjaCBieSBpbmdyaWQsCiAgIEdyZWdvcnkgTG95c2UgYW5kIEplbGxlIFppamxzdHJhLgogCistIElzc3VlICMyNjI5NTogV2hlbiB1c2luZyAicHl0aG9uMyAtbSB0ZXN0IC0tdGVzdGRpcj1URVNURElSIiwgcmVncnRlc3QKKyAgZG9lc24ndCBhZGQgInRlc3QuIiBwcmVmaXggdG8gdGVzdCBtb2R1bGUgbmFtZXMuCisKIC0gSXNzdWUgIzI2NTIzOiBUaGUgbXVsdGlwcm9jZXNzaW5nIHRocmVhZCBwb29sIChtdWx0aXByb2Nlc3NpbmcuZHVtbXkuUG9vbCkKICAgd2FzIHVudGVzdGVkLgogCkBAIC05NjIsMzEgKzIyMjUsNTAgQEAKIC0gSXNzdWUgIzI2MzI1OiBBZGRlZCB0ZXN0LnN1cHBvcnQuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZygpIHRvIGNoZWNrIHRoYXQKICAgbm8gUmVzb3VyY2VXYXJuaW5nIGlzIGVtaXR0ZWQuCiAKLS0gSXNzdWUgIzI1OTQwOiBDaGFuZ2VkIHRlc3Rfc3NsIHRvIHVzZSBzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldC4gIFRoaXMKKy0gSXNzdWUgIzI1OTQwOiBDaGFuZ2VkIHRlc3Rfc3NsIHRvIHVzZSBpdHMgaW50ZXJuYWwgbG9jYWwgc2VydmVyIG1vcmUuICBUaGlzCiAgIGF2b2lkcyByZWx5aW5nIG9uIHN2bi5weXRob24ub3JnLCB3aGljaCByZWNlbnRseSBjaGFuZ2VkIHJvb3QgY2VydGlmaWNhdGUuCiAKIC0gSXNzdWUgIzI1NjE2OiBUZXN0cyBmb3IgT3JkZXJlZERpY3QgYXJlIGV4dHJhY3RlZCBmcm9tIHRlc3RfY29sbGVjdGlvbnMKICAgaW50byBzZXBhcmF0ZSBmaWxlIHRlc3Rfb3JkZXJlZF9kaWN0LgogCistIElzc3VlICMyNTQ0OTogQWRkZWQgdGVzdHMgZm9yIE9yZGVyZWREaWN0IHN1YmNsYXNzZXMuCisKKy0gSXNzdWUgIzI1MTg4OiBBZGQgLVAvLS1wZ28gdG8gdGVzdC5yZWdydGVzdCB0byBzdXBwcmVzcyBlcnJvciBvdXRwdXQgd2hlbgorICBydW5uaW5nIHRoZSB0ZXN0IHN1aXRlIGZvciB0aGUgcHVycG9zZXMgb2YgYSBQR08gYnVpbGQuIEluaXRpYWwgcGF0Y2ggYnkKKyAgQWxlY3NhbmRydSBQYXRyYXNjdS4KKworLSBJc3N1ZSAjMjI4MDY6IEFkZCBgYHB5dGhvbiAtbSB0ZXN0IC0tbGlzdC10ZXN0c2BgIGNvbW1hbmQgdG8gbGlzdCB0ZXN0cy4KKworLSBJc3N1ZSAjMTgxNzQ6IGBgcHl0aG9uIC1tIHRlc3QgLS1odW50cmxlYWtzIC4uLmBgIG5vdyBhbHNvIGNoZWNrcyBmb3IgbGVhayBvZgorICBmaWxlIGRlc2NyaXB0b3JzLiBQYXRjaCB3cml0dGVuIGJ5IFJpY2hhcmQgT3Vka2Vyay4KKworLSBJc3N1ZSAjMjUyNjA6IEZpeCBgYHB5dGhvbiAtbSB0ZXN0IC0tY292ZXJhZ2VgYCBvbiBXaW5kb3dzLiBSZW1vdmUgdGhlCisgIGxpc3Qgb2YgaWdub3JlZCBkaXJlY3Rvcmllcy4KKworLSBgYFBDYnVpbGRccnQuYmF0YGAgbm93IGFjY2VwdHMgYW4gdW5saW1pdGVkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcGFzcyBhbG9uZworICB0byByZWdydGVzdC5weS4gIFByZXZpb3VzbHkgdGhlcmUgd2FzIGEgbGltaXQgb2YgOS4KKwogLSBJc3N1ZSAjMjY1ODM6IFNraXAgdGVzdF90aW1lc3RhbXBfb3ZlcmZsb3cgaW4gdGVzdF9pbXBvcnQgaWYgYnl0ZWNvZGUKICAgZmlsZXMgY2Fubm90IGJlIHdyaXR0ZW4uCiAKIEJ1aWxkCiAtLS0tLQogCistIElzc3VlICMyMTI3NzogRG9uJ3QgdHJ5IHRvIGxpbmsgX2N0eXBlcyB3aXRoIGEgZmZpX2NvbnZlbmllbmNlIGxpYnJhcnkuCisKIC0gSXNzdWUgIzI2ODg0OiBGaXggbGlua2luZyBleHRlbnNpb24gbW9kdWxlcyBmb3IgY3Jvc3MgYnVpbGRzLgogICBQYXRjaCBieSBYYXZpZXIgZGUgR2F5ZS4KIAorLSBJc3N1ZSAjMjY5MzI6IEZpeGVkIHN1cHBvcnQgb2YgUlRMRF8qIGNvbnN0YW50cyBkZWZpbmVkIGFzIGVudW0gdmFsdWVzLAorICBub3QgdmlhIG1hY3JvcyAoaW4gcGFydGljdWxhciBvbiBBbmRyb2lkKS4gIFBhdGNoIGJ5IENoaSBIc3VhbiBZZW4uCisKIC0gSXNzdWUgIzIyMzU5OiBEaXNhYmxlIHRoZSBydWxlcyBmb3IgcnVubmluZyBfZnJlZXplX2ltcG9ydGxpYiBhbmQgcGdlbiB3aGVuCiAgIGNyb3NzLWNvbXBpbGluZy4gIFRoZSBvdXRwdXQgb2YgdGhlc2UgcHJvZ3JhbXMgaXMgbm9ybWFsbHkgc2F2ZWQgd2l0aCB0aGUKICAgc291cmNlIGNvZGUgYW55d2F5LCBhbmQgaXMgc3RpbGwgcmVnZW5lcmF0ZWQgd2hlbiBkb2luZyBhIG5hdGl2ZSBidWlsZC4KICAgUGF0Y2ggYnkgWGF2aWVyIGRlIEdheWUuCiAKLS0gSXNzdWUgIzI3MjI5OiBGaXggdGhlIGNyb3NzLWNvbXBpbGluZyBwZ2VuIHJ1bGUgZm9yIGluLXRyZWUgYnVpbGRzLiAgUGF0Y2gKLSAgYnkgWGF2aWVyIGRlIEdheWUuCi0KIC0gSXNzdWUgIzIxNjY4OiBMaW5rIGF1ZGlvb3AsIF9kYXRldGltZSwgX2N0eXBlc190ZXN0IG1vZHVsZXMgdG8gbGlibSwKLSAgZXhjZXB0IG9uIE1hYyBPUyBYLiBQYXRjaCB3cml0dGVuIGJ5IFhhdmllciBkZSBHYXllLgorICBleGNlcHQgb24gTWFjIE9TIFguIFBhdGNoIHdyaXR0ZW4gYnkgQ2hpIEhzdWFuIFllbi4KIAogLSBJc3N1ZSAjMjU3MDI6IEEgLS13aXRoLWx0byBjb25maWd1cmUgb3B0aW9uIGhhcyBiZWVuIGFkZGVkIHRoYXQgd2lsbAogICBlbmFibGUgbGluayB0aW1lIG9wdGltaXphdGlvbnMgYXQgYnVpbGQgdGltZSBkdXJpbmcgYSBtYWtlIHByb2ZpbGUtb3B0LgpAQCAtMTAwNSwyMiArMjI4NywyNCBAQAogCiAtIElzc3VlICMyNjQ2NTogVXBkYXRlIFdpbmRvd3MgYnVpbGRzIHRvIHVzZSBPcGVuU1NMIDEuMC4yZy4KIAotLSBJc3N1ZSAjMjQ0MjE6IENvbXBpbGUgTW9kdWxlcy9fbWF0aC5jIG9uY2UsIGJlZm9yZSBidWlsZGluZyBleHRlbnNpb25zLgotICBQcmV2aW91c2x5IGl0IGNvdWxkIGZhaWwgdG8gY29tcGlsZSBwcm9wZXJseSBpZiB0aGUgbWF0aCBhbmQgY21hdGggYnVpbGRzCi0gIHdlcmUgY29uY3VycmVudC4KLQogLSBJc3N1ZSAjMjUzNDg6IEFkZGVkIGBgLS1wZ29gYCBhbmQgYGAtLXBnby1qb2JgYCBhcmd1bWVudHMgdG8KICAgYGBQQ2J1aWxkXGJ1aWxkLmJhdGBgIGZvciBidWlsZGluZyB3aXRoIFByb2ZpbGUtR3VpZGVkIE9wdGltaXphdGlvbi4gIFRoZQotICBvbGQgYGBQQ2J1aWxkXGJ1aWxkX3Bnby5iYXRgYCBzY3JpcHQgaXMgbm93IGRlcHJlY2F0ZWQsIGFuZCBzaW1wbHkgY2FsbHMKLSAgYGBQQ2J1aWxkXGJ1aWxkLmJhdCAtLXBnbyAlKmBgLgorICBvbGQgYGBQQ2J1aWxkXGJ1aWxkX3Bnby5iYXRgYCBzY3JpcHQgaXMgcmVtb3ZlZC4KIAogLSBJc3N1ZSAjMjU4Mjc6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyB3aXRoIElDQyB0byBgYGNvbmZpZ3VyZWBgLCBpbmNsdWRpbmcKICAgYSBuZXcgYGAtLXdpdGgtaWNjYGAgZmxhZy4KIAogLSBJc3N1ZSAjMjU2OTY6IEZpeCBpbnN0YWxsYXRpb24gb2YgUHl0aG9uIG9uIFVOSVggd2l0aCBtYWtlIC1qOS4KIAotLSBJc3N1ZSAjMjY5MzA6IFVwZGF0ZSBPUyBYIDEwLjUrIDMyLWJpdC1vbmx5IGluc3RhbGxlciB0byBidWlsZAotICBhbmQgbGluayB3aXRoIE9wZW5TU0wgMS4wLjJoLgorLSBJc3N1ZSAjMjQ5ODY6IEl0IGlzIG5vdyBwb3NzaWJsZSB0byBidWlsZCBQeXRob24gb24gV2luZG93cyB3aXRob3V0IGVycm9ycworICB3aGVuIGV4dGVybmFsIGxpYnJhcmllcyBhcmUgbm90IGF2YWlsYWJsZS4KKworLSBJc3N1ZSAjMjQ0MjE6IENvbXBpbGUgTW9kdWxlcy9fbWF0aC5jIG9uY2UsIGJlZm9yZSBidWlsZGluZyBleHRlbnNpb25zLgorICBQcmV2aW91c2x5IGl0IGNvdWxkIGZhaWwgdG8gY29tcGlsZSBwcm9wZXJseSBpZiB0aGUgbWF0aCBhbmQgY21hdGggYnVpbGRzCisgIHdlcmUgY29uY3VycmVudC4KKworLSBJc3N1ZSAjMjY0NjU6IFVwZGF0ZSBPUyBYIDEwLjUrIDMyLWJpdC1vbmx5IGluc3RhbGxlciB0byBidWlsZAorICBhbmQgbGluayB3aXRoIE9wZW5TU0wgMS4wLjJnLgogCiAtIElzc3VlICMyNjI2ODogVXBkYXRlIFdpbmRvd3MgYnVpbGRzIHRvIHVzZSBPcGVuU1NMIDEuMC4yZi4KIApAQCAtMTA0Nyw2ICsyMzMxLDggQEAKIC0gSXNzdWUgIzI2MDY1OiBFeGNsdWRlcyB2ZW52IGZyb20gbGlicmFyeSB3aGVuIGdlbmVyYXRpbmcgZW1iZWRkYWJsZQogICBkaXN0cm8uCiAKKy0gSXNzdWUgIzI1MDIyOiBSZW1vdmVkIHZlcnkgb3V0ZGF0ZWQgUEMvZXhhbXBsZV9udC8gZGlyZWN0b3J5LgorCiBUb29scy9EZW1vcwogLS0tLS0tLS0tLS0KIApAQCAtMTA2MywxMSArMjM0OSwyMSBAQAogCiAtIElzc3VlICMyNjMxNjogRml4IHZhcmlhYmxlIG5hbWUgdHlwbyBpbiBBcmd1bWVudCBDbGluaWMuCiAKLU1pc2MKLS0tLS0KKy0gSXNzdWUgIzI1NDQwOiBGaXggb3V0cHV0IG9mIHB5dGhvbi1jb25maWcgLS1leHRlbnNpb24tc3VmZml4LgogCi0tIElzc3VlICMxNzUwMCwgYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9weXRob24vcHl0aG9uZG90b3JnL2lzc3Vlcy85NDU6IFJlbW92ZQotICB1bnVzZWQgYW5kIG91dGRhdGVkIGljb25zLgorLSBJc3N1ZSAjMjUxNTQ6IFRoZSBweXZlbnYgc2NyaXB0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mCisgIGBweXRob24zIC1tIHZlbnZgLgorCitDIEFQSQorLS0tLS0KKworLSBJc3N1ZSAjMjYzMTI6IFN5c3RlbUVycm9yIGlzIG5vdyByYWlzZWQgaW4gYWxsIHByb2dyYW1taW5nIGJ1Z3Mgd2l0aCB1c2luZworICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKS4gIFJ1bnRpbWVFcnJvciBkaWQgcmFpc2VkIGJlZm9yZSBpbiBzb21lCisgIHByb2dyYW1taW5nIGJ1Z3MuCisKKy0gSXNzdWUgIzI2MTk4OiBWYWx1ZUVycm9yIGlzIG5vdyByYWlzZWQgaW5zdGVhZCBvZiBUeXBlRXJyb3Igb24gYnVmZmVyCisgIG92ZXJmbG93IGluIHBhcnNpbmcgImVzIyIgYW5kICJldCMiIGZvcm1hdCB1bml0cy4gIFN5c3RlbUVycm9yIGlzIG5vdyByYWlzZWQKKyAgaW5zdGVhZCBvZiBUeXBlRXJyb3Igb24gcHJvZ3JhbW1pY2FsIGVycm9yIGluIHBhcnNpbmcgZm9ybWF0IHN0cmluZy4KIAogCiBXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjUuMSBmaW5hbD8KQEAgLTEzNzksNyArMjY3NSw3IEBACiAtIElzc3VlICMyNDc3NDogRml4IGRvY3N0cmluZyBpbiBodHRwLnNlcnZlci50ZXN0LiBQYXRjaCBmcm9tIENoaXUtSHNpYW5nIEhzdS4KIAogLSBJc3N1ZSAjMjExNTk6IEltcHJvdmUgbWVzc2FnZSBpbiBjb25maWdwYXJzZXIuSW50ZXJwb2xhdGlvbk1pc3NpbmdPcHRpb25FcnJvci4KLSAgUGF0Y2ggZnJvbSDFgXVrYXN6IExhbmdhLgorICBQYXRjaCBmcm9tIMU/dWthc3ogTGFuZ2EuCiAKIC0gSXNzdWUgIzIwMzYyOiBIb25vdXIgVGVzdENhc2UubG9uZ01lc3NhZ2UgY29ycmVjdGx5IGluIGFzc2VydFJlZ2V4LgogICBQYXRjaCBmcm9tIElsaWEgS3VyZW5rb3YuCkBAIC0xNDg5LDkgKzI3ODUsNiBAQAogRG9jdW1lbnRhdGlvbgogLS0tLS0tLS0tLS0tLQogCi0tIElzc3VlICMyMjU1ODogQWRkIHJlbWFpbmluZyBkb2MgbGlua3MgdG8gc291cmNlIGNvZGUgZm9yIFB5dGhvbi1jb2RlZCBtb2R1bGVzLgotICBQYXRjaCBieSBZb25pIExhdmkuCi0KIC0gSXNzdWUgIzEyMDY3OiBSZXdyaXRlIENvbXBhcmlzb25zIHNlY3Rpb24gaW4gdGhlIEV4cHJlc3Npb25zIGNoYXB0ZXIgb2YgdGhlCiAgIGxhbmd1YWdlIHJlZmVyZW5jZS4gU29tZSBvZiB0aGUgZGV0YWlscyBvZiBjb21wYXJpbmcgbWl4ZWQgdHlwZXMgd2VyZQogICBpbmNvcnJlY3Qgb3IgYW1iaWd1b3VzLiBOb3RJbXBsZW1lbnRlZCBpcyBvbmx5IHJlbGV2YW50IGF0IGEgbG93ZXIgbGV2ZWwKQEAgLTE4MjEsMTIgKzMxMTQsNiBAQAogCiAtIElzc3VlICMyNDYzMTogRml4ZWQgcmVncmVzc2lvbiBpbiB0aGUgdGltZWl0IG1vZHVsZSB3aXRoIG11bHRpbGluZSBzZXR1cC4KIAotLSBJc3N1ZSAjMTg2MjI6IHVuaXR0ZXN0Lm1vY2subW9ja19vcGVuKCkucmVzZXRfbW9jayB3b3VsZCByZWN1cnNlIGluZmluaXRlbHkuCi0gIFBhdGNoIGZyb20gTmljb2xhIFBhbHVtYm8gYW5kIExhdXJlbnQgRGUgQnV5c3QuCi0KLS0gSXNzdWUgIzIzNjYxOiB1bml0dGVzdC5tb2NrIHNpZGVfZWZmZWN0cyBjYW4gbm93IGJlIGV4Y2VwdGlvbnMgYWdhaW4uIFRoaXMKLSAgd2FzIGEgcmVncmVzc2lvbiB2cyBQeXRob24gMy40LiBQYXRjaCBmcm9tIElnbmFjaW8gUm9zc2kKLQogLSBJc3N1ZSAjMjQ2MDg6IGNodW5rLkNodW5rLnJlYWQoKSBub3cgYWx3YXlzIHJldHVybnMgYnl0ZXMsIG5vdCBzdHIuCiAKIC0gSXNzdWUgIzE4Njg0OiBGaXhlZCByZWFkaW5nIG91dCBvZiB0aGUgYnVmZmVyIGluIHRoZSByZSBtb2R1bGUuCkBAIC0xODM3LDYgKzMxMjQsOSBAQAogLSBJc3N1ZSAjMTUwMTQ6IFNNVFAuYXV0aCgpIGFuZCBTTVRQLmxvZ2luKCkgbm93IHN1cHBvcnQgUkZDIDQ5NTQncyBvcHRpb25hbAogICBpbml0aWFsLXJlc3BvbnNlIGFyZ3VtZW50IHRvIHRoZSBTTVRQIEFVVEggY29tbWFuZC4KIAorLSBJc3N1ZSAjNjU0OTogUmVtb3ZlIGh5cGhlbiBmcm9tIHR0ay5TdHlsZSgpLmVsZW1lbnQgb3B0aW9ucy4gIE9ubHkgcmV0dXJuIHJlc3VsdAorICBmcm9tIHR0ay5TdHlsZSgpLmNvbmZpZ3VyZSBpZiBhIHJlc3VsdCB3YXMgZ2VuZXJhdGVkIG9yIGEgcXVlcnkgc3VibWl0dGVkLgorCiAtIElzc3VlICMyNDY2OTogRml4IGluc3BlY3QuZ2V0c291cmNlKCkgZm9yICdhc3luYyBkZWYnIGZ1bmN0aW9ucy4KICAgUGF0Y2ggYnkgS2FpIEdyb25lci4KIApAQCAtMTg0OCw3ICszMTM4LDYgQEAKIC0gSXNzdWUgIzI0NjAzOiBVcGRhdGUgV2luZG93cyBidWlsZHMgYW5kIE9TIFggMTAuNSBpbnN0YWxsZXIgdG8gdXNlIE9wZW5TU0wKICAgMS4wLjJkLgogCi0KIFdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4wIGJldGEgMz8KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMjAwOSw2ICszMjk4LDkgQEAKIC0gSXNzdWUgIzI0MjY4OiBQRVAgNDg5OiBNdWx0aS1waGFzZSBleHRlbnNpb24gbW9kdWxlIGluaXRpYWxpemF0aW9uLgogICBQYXRjaCBieSBQZXRyIFZpa3RvcmluLgogCistIElzc3VlICMyMzM1OTogT3B0aW1pemUgc2V0IG9iamVjdCBpbnRlcm5hbHMgYnkgc3BlY2lhbGl6aW5nIHRoZQorICBoYXNoIHRhYmxlIHNlYXJjaCBpbnRvIGEgbG9va3VwIGZ1bmN0aW9uIGFuZCBhbiBpbnNlcnQgZnVuY3Rpb24uCisKIC0gSXNzdWUgIzIzOTU1OiBBZGQgcHl2ZW52LmNmZyBvcHRpb24gdG8gc3VwcHJlc3MgcmVnaXN0cnkvZW52aXJvbm1lbnQKICAgbG9va3VwIGZvciBnZW5lcmF0aW5nIHN5cy5wYXRoIG9uIFdpbmRvd3MuCiAKQEAgLTIxMjksOCArMzQyMSw4IEBACiAtIElzc3VlICMxMzIyOiBwbGF0Zm9ybS5kaXN0KCkgYW5kIHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbigpIGZ1bmN0aW9ucyBhcmUKICAgbm93IGRlcHJlY2F0ZWQuICBJbml0aWFsIHBhdGNoIGJ5IFZhanJhc2t5IEtvay4KIAotLSBJc3N1ZSAjMjI0ODY6IEFkZGVkIHRoZSBtYXRoLmdjZCgpIGZ1bmN0aW9uLiAgVGhlIGZyYWN0aW9ucy5nY2QoKSBmdW5jdGlvbgotICBub3cgaXMgZGVwcmVjYXRlZC4gIEJhc2VkIG9uIHBhdGNoIGJ5IE1hcmsgRGlja2luc29uLgorLSBJc3N1ZSAjMjI0ODY6IEFkZGVkIHRoZSBtYXRoLmdjZCgpIGZ1bmN0aW9uLiAgVGhlIGZyYWN0aW9ucy5nY2QoKSBmdW5jdGlvbiBub3cgaXMKKyAgZGVwcmVjYXRlZC4gIEJhc2VkIG9uIHBhdGNoIGJ5IE1hcmsgRGlja2luc29uLgogCiAtIElzc3VlICMyNDA2NDogUHJvcGVydHkoKSBkb2NzdHJpbmdzIGFyZSBub3cgd3JpdGVhYmxlLgogICAoUGF0Y2ggYnkgQmVya2VyIFBla3NhZy4pCkBAIC0yNTUxLDggKzM4NDMsOCBAQAogICB3cml0ZXIgZmFpbGVkIGluIEJ1ZmZlcmVkUldQYWlyLmNsb3NlKCkuCiAKIC0gSXNzdWUgIzIzNjIyOiBVbmtub3duIGVzY2FwZXMgaW4gcmVndWxhciBleHByZXNzaW9ucyB0aGF0IGNvbnNpc3Qgb2YgYGAnXCdgYAotICBhbmQgQVNDSUkgbGV0dGVyIG5vdyByYWlzZSBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgYW5kIHdpbGwgYmUgZm9yYmlkZGVuIGluCi0gIFB5dGhvbiAzLjYuCisgIGFuZCBhbiBBU0NJSSBsZXR0ZXIgbm93IHJhaXNlIGEgZGVwcmVjYXRpb24gd2FybmluZyBhbmQgd2lsbCBiZSBmb3JiaWRkZW4KKyAgaW4gUHl0aG9uIDMuNi4KIAogLSBJc3N1ZSAjMjM2NzE6IHN0cmluZy5UZW1wbGF0ZSBub3cgYWxsb3dzIHNwZWNpZnlpbmcgdGhlICJzZWxmIiBwYXJhbWV0ZXIgYXMKICAgYSBrZXl3b3JkIGFyZ3VtZW50LiAgc3RyaW5nLkZvcm1hdHRlciBub3cgYWxsb3dzIHNwZWNpZnlpbmcgdGhlICJzZWxmIiBhbmQKQEAgLTMzMTEsNyArNDYwMyw3IEBACiAgIEJhc2VkIG9uIHBhdGNoIGJ5IE1hcnRpbiBQYW50ZXIuCiAKIC0gSXNzdWUgIzE3MjkzOiB1dWlkLmdldG5vZGUoKSBub3cgZGV0ZXJtaW5lcyBNQUMgYWRkcmVzcyBvbiBBSVggdXNpbmcgbmV0c3RhdC4KLSAgQmFzZWQgb24gcGF0Y2ggYnkgQWl2YXJzIEthbHbEgW5zLgorICBCYXNlZCBvbiBwYXRjaCBieSBBaXZhcnMgS2FsdsQ/bnMuCiAKIC0gSXNzdWUgIzIyNzY5OiBGaXhlZCB0dGsuVHJlZXZpZXcudGFnX2hhcygpIHdoZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLgogCkBAIC01NzE3LDYgKzcwMDksOSBAQAogCiAtIElzc3VlICMxOTM2OTogT3B0aW1pemVkIHRoZSB1c2FnZSBvZiBfX2xlbmd0aF9oaW50X18oKS4KIAorLSBJc3N1ZSAjMjgwMjY6IFJhaXNlIEltcG9ydEVycm9yIHdoZW4gZXhlY19tb2R1bGUoKSBleGlzdHMgYnV0CisgIGNyZWF0ZV9tb2R1bGUoKSBpcyBtaXNzaW5nLgorCiAtIElzc3VlICMxODYwMzogRW5zdXJlIHRoYXQgUHlPU19teXN0cmljbXAgYW5kIFB5T1NfbXlzdHJuaWNtcCBhcmUgaW4gdGhlCiAgIFB5dGhvbiBleGVjdXRhYmxlIGFuZCBub3QgcmVtb3ZlZCBieSB0aGUgbGlua2VyJ3Mgb3B0aW1pemVyLgogCkBAIC02NjA0LDYgKzc4OTksOSBAQAogLSBJc3N1ZSAjMTY4MDk6IFRraW50ZXIncyBzcGxpdGxpc3QoKSBhbmQgc3BsaXQoKSBtZXRob2RzIG5vdyBhY2NlcHQgVGNsX09iagogICBhcmd1bWVudC4KIAorLSBJc3N1ZSAjMTcyMTE6IFlpZWxkIGEgbmFtZWR0dXBsZSBpbiBwa2d1dGlsLgorICBQYXRjaCBieSBSYW1jaGFuZHJhIEFwdGUuCisKIC0gSXNzdWUgIzE4MzI0OiBzZXRfcGF5bG9hZCBub3cgY29ycmVjdGx5IGhhbmRsZXMgYmluYXJ5IGlucHV0LiAgVGhpcyBhbHNvCiAgIHN1cGVyc2VkZXMgdGhlIHByZXZpb3VzIGZpeGVzIGZvciAjMTQzNjAsICMxNzE3LCBhbmQgIzE2NTY0LgogCkBAIC02NjEzLDYgKzc5MTEsOCBAQAogLSBJc3N1ZSAjMTcxMTk6IEZpeGVkIGludGVnZXIgb3ZlcmZsb3dzIHdoZW4gcHJvY2Vzc2luZyBsYXJnZSBzdHJpbmdzIGFuZCB0dXBsZXMKICAgaW4gdGhlIHRraW50ZXIgbW9kdWxlLgogCistIElzc3VlICMxNTM1MjogUmVidWlsZCBmcm96ZW4gbW9kdWxlcyB3aGVuIG1hcnNoYWwuYyBpcyBjaGFuZ2VkLgorCiAtIElzc3VlICMxODc0NzogUmUtc2VlZCBPcGVuU1NMJ3MgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGFmdGVyIGZvcmsuCiAgIEEgcHRocmVhZF9hdGZvcmsoKSBwYXJlbnQgaGFuZGxlciBpcyB1c2VkIHRvIHNlZWQgdGhlIFBSTkcgd2l0aCBwaWQsIHRpbWUKICAgYW5kIHNvbWUgc3RhY2sgZGF0YS4KQEAgLTY4MjAsNiArODEyMCw5IEBACiAtIElzc3VlICMxODEzNzogRGV0ZWN0IGludGVnZXIgb3ZlcmZsb3cgb24gcHJlY2lzaW9uIGluIGZsb2F0Ll9fZm9ybWF0X18oKQogICBhbmQgY29tcGxleC5fX2Zvcm1hdF9fKCkuCiAKKy0gSXNzdWUgIzE1NzY3OiBJbnRyb2R1Y2UgTW9kdWxlTm90Rm91bmRFcnJvciB3aGljaCBpcyByYWlzZWQgd2hlbiBhIG1vZHVsZQorICBjb3VsZCBub3QgYmUgZm91bmQuCisKIC0gSXNzdWUgIzE4MTgzOiBGaXggdmFyaW91cyB1bmljb2RlIG9wZXJhdGlvbnMgb24gc3RyaW5ncyB3aXRoIGxhcmdlIHVuaWNvZGUKICAgY29kZXBvaW50cy4KIApAQCAtODc0MCw2ICsxMDA0MywxMCBAQAogICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZVdpdGhQYXRobmFtZXMoKSAoYW5kIHRodXMgYnkgZXh0ZW5zaW9uCiAgIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlKCkgYW5kIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgoKSkuCiAKKy0gSXNzdWUgIzE1NzY3OiBBZGRlZCBQeUVycl9TZXRJbXBvcnRFcnJvclN1YmNsYXNzKCkuCisKKy0gUHlFcnJfU2V0SW1wb3J0RXJyb3IoKSBub3cgc2V0cyBUeXBlRXJyb3Igd2hlbiBpdHMgbXNnIGFyZ3VtZW50IGlzIHNldC4KKwogLSBJc3N1ZSAjOTM2OTogVGhlIHR5cGVzIG9mIGBjaGFyKmAgYXJndW1lbnRzIG9mIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigpIGFuZAogICBQeU9iamVjdF9DYWxsTWV0aG9kKCkgbm93IGNoYW5nZWQgdG8gYGNvbnN0IGNoYXIqYC4gIEJhc2VkIG9uIHBhdGNoZXMgYnkKICAgSsO2cmcgTcO8bGxlciBhbmQgTGFycyBCdWl0aW5jay4KZGlmZiAtLWdpdCBhL01pc2MvUkVBRE1FLnZhbGdyaW5kIGIvTWlzYy9SRUFETUUudmFsZ3JpbmQKaW5kZXggYjVhOWEzMi4uOTA4ZjEzNyAxMDA2NDQKLS0tIGEvTWlzYy9SRUFETUUudmFsZ3JpbmQKKysrIGIvTWlzYy9SRUFETUUudmFsZ3JpbmQKQEAgLTIsNiArMiw5IEBACiBQeXRob24uICBWYWxncmluZCBpcyB1c2VkIHBlcmlvZGljYWxseSBieSBQeXRob24gZGV2ZWxvcGVycyB0byB0cnkKIHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gbWVtb3J5IGxlYWtzIG9yIGludmFsaWQgbWVtb3J5IHJlYWRzL3dyaXRlcy4KIAorVVBEQVRFOiBQeXRob24gMy42IG5vdyBzdXBwb3J0cyBQWVRIT05NQUxMT0M9bWFsbG9jIGVudmlyb25tZW50IHZhcmlhYmxlIHdoaWNoCitjYW4gYmUgdXNlZCB0byBmb3JjZSB0aGUgdXNhZ2Ugb2YgdGhlIG1hbGxvYygpIGFsbG9jYXRvciBvZiB0aGUgQyBsaWJyYXJ5LgorCiBJZiB5b3UgZG9uJ3Qgd2FudCB0byByZWFkIGFib3V0IHRoZSBkZXRhaWxzIG9mIHVzaW5nIFZhbGdyaW5kLCB0aGVyZQogYXJlIHN0aWxsIHR3byB0aGluZ3MgeW91IG11c3QgZG8gdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmdzLiAgRmlyc3QsCiB5b3UgbXVzdCB1c2UgYSBzdXBwcmVzc2lvbnMgZmlsZS4gIE9uZSBpcyBzdXBwbGllZCBpbgpkaWZmIC0tZ2l0IGEvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dCBiL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQKaW5kZXggMzAwNDE3NC4uNGI2NzNmZCAxMDA2NDQKLS0tIGEvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dAorKysgYi9NaXNjL1NwZWNpYWxCdWlsZHMudHh0CkBAIC02NSw5ICs2NSw5IEBACiAgICAgc2ltcGx5IGJ5IHZpcnR1ZSBvZiBiZWluZyBpbiB0aGUgbGlzdC4KIAogZW52dmFyIFBZVEhPTkRVTVBSRUZTCi0gICAgSWYgdGhpcyBlbnZ2YXIgZXhpc3RzLCBQeV9GaW5hbGl6ZSgpIGFycmFuZ2VzIHRvIHByaW50IGEgbGlzdCBvZiBhbGwKKyAgICBJZiB0aGlzIGVudnZhciBleGlzdHMsIFB5X0ZpbmFsaXplRXgoKSBhcnJhbmdlcyB0byBwcmludCBhIGxpc3Qgb2YgYWxsCiAgICAgc3RpbGwtbGl2ZSBoZWFwIG9iamVjdHMuICBUaGlzIGlzIHByaW50ZWQgdHdpY2UsIGluIGRpZmZlcmVudCBmb3JtYXRzLAotICAgIGJlZm9yZSBhbmQgYWZ0ZXIgUHlfRmluYWxpemUgaGFzIGNsZWFuZWQgdXAgZXZlcnl0aGluZyBpdCBjYW4gY2xlYW4gdXAuICBUaGUKKyAgICBiZWZvcmUgYW5kIGFmdGVyIFB5X0ZpbmFsaXplRXggaGFzIGNsZWFuZWQgdXAgZXZlcnl0aGluZyBpdCBjYW4gY2xlYW4gdXAuICBUaGUKICAgICBmaXJzdCBvdXRwdXQgYmxvY2sgcHJvZHVjZXMgdGhlIHJlcHIoKSBvZiBlYWNoIG9iamVjdCBzbyBpcyBtb3JlCiAgICAgaW5mb3JtYXRpdmU7IGhvd2V2ZXIsIGEgbG90IG9mIHN0dWZmIGRlc3RpbmVkIHRvIGRpZSBpcyBzdGlsbCBhbGl2ZSB0aGVuLgogICAgIFRoZSBzZWNvbmQgb3V0cHV0IGJsb2NrIGlzIG11Y2ggaGFyZGVyIHRvIHdvcmsgd2l0aCAocmVwcigpIGNhbid0IGJlIGludm9rZWQKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiBlbnZ2YXIgUFlUSE9OTUFMTE9DU1RBVFMKICAgICBJZiB0aGlzIGVudnZhciBleGlzdHMsIGEgcmVwb3J0IG9mIHB5bWFsbG9jIHN1bW1hcnkgc3RhdGlzdGljcyBpcyBwcmludGVkIHRvCi0gICAgc3RkZXJyIHdoZW5ldmVyIGEgbmV3IGFyZW5hIGlzIGFsbG9jYXRlZCwgYW5kIGFsc28gYnkgUHlfRmluYWxpemUoKS4KKyAgICBzdGRlcnIgd2hlbmV2ZXIgYSBuZXcgYXJlbmEgaXMgYWxsb2NhdGVkLCBhbmQgYWxzbyBieSBQeV9GaW5hbGl6ZUV4KCkuCiAKIENoYW5nZWQgaW4gMi41OiAgVGhlIG51bWJlciBvZiBleHRyYSBieXRlcyBhbGxvY2F0ZWQgaXMgNCpzaXplb2Yoc2l6ZV90KS4KIEJlZm9yZSBpdCB3YXMgMTYgb24gYWxsIGJveGVzLCByZWZsZWN0aW5nIHRoYXQgUHl0aG9uIGNvdWxkbid0IG1ha2UgdXNlIG9mCkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgKi8KICAgICBpbnQgdHBfbWF4YWxsb2M7CiAKLUFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBjb2RlIGtlZXBzIHRoZXNlIGNvdW50cyB1cCB0byBkYXRlLiAgUHlfRmluYWxpemUoKQorQWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGNvZGUga2VlcHMgdGhlc2UgY291bnRzIHVwIHRvIGRhdGUuICBQeV9GaW5hbGl6ZUV4KCkKIGRpc3BsYXlzIGEgc3VtbWFyeSBvZiB0aGUgaW5mbyByZXR1cm5lZCBieSBzeXMuZ2V0Y291bnRzKCkgKHNlZSBiZWxvdyksIGFsb25nCiB3aXRoIGFzc29ydGVkIG90aGVyIHNwZWNpYWwgYWxsb2NhdGlvbiBjb3VudHMgKGxpa2UgdGhlIG51bWJlciBvZiB0dXBsZQogYWxsb2NhdGlvbnMgc2F0aXNmaWVkIGJ5IGEgdHVwbGUgZnJlZS1saXN0LCB0aGUgbnVtYmVyIG9mIDEtY2hhcmFjdGVyIHN0cmluZ3MKZGlmZiAtLWdpdCBhL01pc2MvY292ZXJpdHlfbW9kZWwuYyBiL01pc2MvY292ZXJpdHlfbW9kZWwuYwppbmRleCA0ODg2MDRjLi5kMTdjNjA3IDEwMDY0NAotLS0gYS9NaXNjL2NvdmVyaXR5X21vZGVsLmMKKysrIGIvTWlzYy9jb3Zlcml0eV9tb2RlbC5jCkBAIC0yMiw3ICsyMiw2IEBACiAjZGVmaW5lIGFzc2VydChvcCkgLyogZW1wdHkgKi8KIHR5cGVkZWYgaW50IHNkaWdpdDsKIHR5cGVkZWYgbG9uZyBQeV9zc2l6ZV90OwotdHlwZWRlZiBsb25nIGxvbmcgUFlfTE9OR19MT05HOwogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB3Y2hhcl90OwogdHlwZWRlZiBzdHJ1Y3Qge30gUHlPYmplY3Q7CiB0eXBlZGVmIHN0cnVjdCB7fSBncmFtbWFyOwpAQCAtNjMsNyArNjIsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIH0KIAotUHlPYmplY3QgKlB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTE9OR19MT05HIGl2YWwpCitQeU9iamVjdCAqUHlMb25nX0Zyb21Mb25nTG9uZyhsb25nIGxvbmcgaXZhbCkKIHsKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKChsb25nKWl2YWwpOwogfQpAQCAtOTQsNyArOTMsNyBAQAogfQogCiAvKiBQYXJzZXIvcGdlbm1haW4uYyAqLwotZ3JhbW1hciAqZ2V0Z3JhbW1hcihjaGFyICpmaWxlbmFtZSkKK2dyYW1tYXIgKmdldGdyYW1tYXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7CiAgICAgZ3JhbW1hciAqZzsKICAgICBfX2NvdmVyaXR5X3RhaW50ZWRfZGF0YV9zaW5rX18oZmlsZW5hbWUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9TZXR1cC5jb25maWcuaW4gYi9Nb2R1bGVzL1NldHVwLmNvbmZpZy5pbgppbmRleCBhZGFjMDMwLi42NDUwNTI4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL1NldHVwLmNvbmZpZy5pbgorKysgYi9Nb2R1bGVzL1NldHVwLmNvbmZpZy5pbgpAQCAtNiw4ICs2LDUgQEAKICMgVGhyZWFkaW5nCiBAVVNFX1RIUkVBRF9NT0RVTEVAX3RocmVhZCBfdGhyZWFkbW9kdWxlLmMKIAotIyBUaGUgc2lnbmFsIG1vZHVsZQotQFVTRV9TSUdOQUxfTU9EVUxFQF9zaWduYWwgc2lnbmFsbW9kdWxlLmMKLQogIyBUaGUgcmVzdCBvZiB0aGUgbW9kdWxlcyBwcmV2aW91c2x5IGxpc3RlZCBpbiB0aGlzIGZpbGUgYXJlIGJ1aWx0CiAjIGJ5IHRoZSBzZXR1cC5weSBzY3JpcHQgaW4gUHl0aG9uIDIuMSBhbmQgbGF0ZXIuCmRpZmYgLS1naXQgYS9Nb2R1bGVzL1NldHVwLmRpc3QgYi9Nb2R1bGVzL1NldHVwLmRpc3QKaW5kZXggMDZiYTZhZC4uZTE3ZmYxMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9TZXR1cC5kaXN0CisrKyBiL01vZHVsZXMvU2V0dXAuZGlzdApAQCAtMTE3LDYgKzExNyw3IEBACiBfY29sbGVjdGlvbnMgX2NvbGxlY3Rpb25zbW9kdWxlLmMgIyBDb250YWluZXIgdHlwZXMKIGl0ZXJ0b29scyBpdGVydG9vbHNtb2R1bGUuYyAgICAjIEZ1bmN0aW9ucyBjcmVhdGluZyBpdGVyYXRvcnMgZm9yIGVmZmljaWVudCBsb29waW5nCiBhdGV4aXQgYXRleGl0bW9kdWxlLmMgICAgICAjIFJlZ2lzdGVyIGZ1bmN0aW9ucyB0byBiZSBydW4gYXQgaW50ZXJwcmV0ZXItc2h1dGRvd24KK19zaWduYWwgc2lnbmFsbW9kdWxlLmMKIF9zdGF0IF9zdGF0LmMJCQkjIHN0YXQuaCBpbnRlcmZhY2UKIHRpbWUgdGltZW1vZHVsZS5jCSMgLWxtICMgdGltZSBvcGVyYXRpb25zIGFuZCB2YXJpYWJsZXMKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmlzZWN0bW9kdWxlLmMgYi9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYwppbmRleCAwMmI1NWQxLi4yMmRkYmYyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYwpAQCAtMTIsNyArMTIsOCBAQAogaW50ZXJuYWxfYmlzZWN0X3JpZ2h0KFB5T2JqZWN0ICpsaXN0LCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBsbywgUHlfc3NpemVfdCBoaSkKIHsKICAgICBQeU9iamVjdCAqbGl0ZW07Ci0gICAgUHlfc3NpemVfdCBtaWQsIHJlczsKKyAgICBQeV9zc2l6ZV90IG1pZDsKKyAgICBpbnQgcmVzOwogCiAgICAgaWYgKGxvIDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CkBAIC0xMTUsNyArMTE2LDggQEAKIGludGVybmFsX2Jpc2VjdF9sZWZ0KFB5T2JqZWN0ICpsaXN0LCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBsbywgUHlfc3NpemVfdCBoaSkKIHsKICAgICBQeU9iamVjdCAqbGl0ZW07Ci0gICAgUHlfc3NpemVfdCBtaWQsIHJlczsKKyAgICBQeV9zc2l6ZV90IG1pZDsKKyAgICBpbnQgcmVzOwogCiAgICAgaWYgKGxvIDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ibGFrZTIvYmxha2UyYjJzLnB5IGIvTW9kdWxlcy9fYmxha2UyL2JsYWtlMmIycy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMWNmMjY1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2JsYWtlMmIycy5weQpAQCAtMCwwICsxLDQ5IEBACisjIS91c3IvYmluL3B5dGhvbjMKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKKworSEVSRSA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKQorQkxBS0UyID0gb3MucGF0aC5qb2luKEhFUkUsICdpbXBsJykKKworUFVCTElDX1NFQVJDSCA9IHJlLmNvbXBpbGUocidcIGludCAoYmxha2UyW2JzXXA/W2Etel9dKilcKCcpCisKKworZGVmIGdldGZpbGVzKCk6CisgICAgZm9yIG5hbWUgaW4gb3MubGlzdGRpcihCTEFLRTIpOgorICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKEJMQUtFMiwgbmFtZSkKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUobmFtZSk6CisgICAgICAgICAgICB5aWVsZCBuYW1lCisKKworZGVmIGZpbmRfcHVibGljKCk6CisgICAgcHVibGljX2Z1bmNzID0gc2V0KCkKKyAgICBmb3IgbmFtZSBpbiBnZXRmaWxlcygpOgorICAgICAgICB3aXRoIG9wZW4obmFtZSkgYXMgZjoKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgIyBmaW5kIHB1YmxpYyBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgICBtbyA9IFBVQkxJQ19TRUFSQ0guc2VhcmNoKGxpbmUpCisgICAgICAgICAgICAgICAgaWYgbW86CisgICAgICAgICAgICAgICAgICAgIHB1YmxpY19mdW5jcy5hZGQobW8uZ3JvdXAoMSkpCisKKyAgICBmb3IgZiBpbiBzb3J0ZWQocHVibGljX2Z1bmNzKToKKyAgICAgICAgcHJpbnQoJyNkZWZpbmUgezA6PDE4fSBQeUJsYWtlMl97MH0nLmZvcm1hdChmKSkKKworICAgIHJldHVybiBwdWJsaWNfZnVuY3MKKworCitkZWYgbWFpbigpOgorICAgIGxpbmVzID0gW10KKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKEhFUkUsICdibGFrZTJiX2ltcGwuYycpKSBhcyBmOgorICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgnYmxha2UyYicsICdibGFrZTJzJykKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoJ0JMQUtFMmInLCAnQkxBS0UycycpCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCdCTEFLRTJCJywgJ0JMQUtFMlMnKQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihIRVJFLCAnYmxha2Uyc19pbXBsLmMnKSwgJ3cnKSBhcyBmOgorICAgICAgICBmLndyaXRlKCcnLmpvaW4obGluZXMpKQorICAgICMgZmluZF9wdWJsaWMoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ibGFrZTIvYmxha2UyYl9pbXBsLmMgYi9Nb2R1bGVzL19ibGFrZTIvYmxha2UyYl9pbXBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiNTAyYgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJiX2ltcGwuYwpAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIFdyaXR0ZW4gaW4gMjAxMyBieSBEbWl0cnkgQ2hlc3RueWtoIDxkbWl0cnlAY29kaW5ncm9ib3RzLmNvbT4KKyAqIE1vZGlmaWVkIGZvciBDUHl0aG9uIGJ5IENocmlzdGlhbiBIZWltZXMgPGNocmlzdGlhbkBweXRob24ub3JnPgorICoKKyAqIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhdmUgZGVkaWNhdGVkIGFsbAorICogY29weXJpZ2h0IGFuZCByZWxhdGVkIGFuZCBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyBzb2Z0d2FyZSB0bworICogdGhlIHB1YmxpYyBkb21haW4gd29ybGR3aWRlLiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQKKyAqIGFueSB3YXJyYW50eS4gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworICovCisKKy8qIFdBUk5JTkc6IGF1dG9nZW5lcmF0ZWQgZmlsZSEKKyAqCisgKiBUaGUgYmxha2Uyc19pbXBsLmMgaXMgYXV0b2dlbmVyYXRlZCBmcm9tIGJsYWtlMmJfaW1wbC5jLgorICovCisKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJweXN0cmhleC5oIgorI2lmZGVmIFdJVEhfVEhSRUFECisjaW5jbHVkZSAicHl0aHJlYWQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vaGFzaGxpYi5oIgorI2luY2x1ZGUgImJsYWtlMm5zLmgiCisKKyNkZWZpbmUgSEFWRV9CTEFLRTJCIDEKKyNkZWZpbmUgQkxBS0UyX0xPQ0FMX0lOTElORSh0eXBlKSBQeV9MT0NBTF9JTkxJTkUodHlwZSkKKworI2luY2x1ZGUgImltcGwvYmxha2UyLmgiCisjaW5jbHVkZSAiaW1wbC9ibGFrZTItaW1wbC5oIiAvKiBmb3Igc2VjdXJlX3plcm9fbWVtb3J5KCkgYW5kIHN0b3JlNDgoKSAqLworCisjaWZkZWYgQkxBS0UyX1VTRV9TU0UKKyNpbmNsdWRlICJpbXBsL2JsYWtlMmIuYyIKKyNlbHNlCisjaW5jbHVkZSAiaW1wbC9ibGFrZTJiLXJlZi5jIgorI2VuZGlmCisKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUJsYWtlMl9CTEFLRTJiVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBibGFrZTJiX3BhcmFtICAgIHBhcmFtOworICAgIGJsYWtlMmJfc3RhdGUgICAgc3RhdGU7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBQeVRocmVhZF90eXBlX2xvY2sgbG9jazsKKyNlbmRpZgorfSBCTEFLRTJiT2JqZWN0OworCisjaW5jbHVkZSAiY2xpbmljL2JsYWtlMmJfaW1wbC5jLmgiCisKKy8qW2NsaW5pYyBpbnB1dF0KK21vZHVsZSBfYmxha2UyYgorY2xhc3MgX2JsYWtlMmIuYmxha2UyYiAiQkxBS0UyYk9iamVjdCAqIiAiJlB5Qmxha2UyX0JMQUtFMmJUeXBlIgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9Njg5MzM1OGM2NjIyYWVjZl0qLworCisKK3N0YXRpYyBCTEFLRTJiT2JqZWN0ICoKK25ld19CTEFLRTJiT2JqZWN0KFB5VHlwZU9iamVjdCAqdHlwZSkKK3sKKyAgICBCTEFLRTJiT2JqZWN0ICpzZWxmOworICAgIHNlbGYgPSAoQkxBS0UyYk9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5sb2NrID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gc2VsZjsKK30KKworLypbY2xpbmljIGlucHV0XQorQGNsYXNzbWV0aG9kCitfYmxha2UyYi5ibGFrZTJiLl9fbmV3X18gYXMgcHlfYmxha2UyYl9uZXcKKyAgICBzdHJpbmcgYXMgZGF0YTogb2JqZWN0ID0gTlVMTAorICAgICoKKyAgICBkaWdlc3Rfc2l6ZTogaW50KGNfZGVmYXVsdD0iQkxBS0UyQl9PVVRCWVRFUyIpID0gX2JsYWtlMmIuYmxha2UyYi5NQVhfRElHRVNUX1NJWkUKKyAgICBrZXk6IFB5X2J1ZmZlciA9IE5vbmUKKyAgICBzYWx0OiBQeV9idWZmZXIgPSBOb25lCisgICAgcGVyc29uOiBQeV9idWZmZXIgPSBOb25lCisgICAgZmFub3V0OiBpbnQgPSAxCisgICAgZGVwdGg6IGludCA9IDEKKyAgICBsZWFmX3NpemUgYXMgbGVhZl9zaXplX29iajogb2JqZWN0ID0gTlVMTAorICAgIG5vZGVfb2Zmc2V0IGFzIG5vZGVfb2Zmc2V0X29iajogb2JqZWN0ID0gTlVMTAorICAgIG5vZGVfZGVwdGg6IGludCA9IDAKKyAgICBpbm5lcl9zaXplOiBpbnQgPSAwCisgICAgbGFzdF9ub2RlOiBib29sID0gRmFsc2UKKworUmV0dXJuIGEgbmV3IEJMQUtFMmIgaGFzaCBvYmplY3QuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJiX25ld19pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmRhdGEsIGludCBkaWdlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgUHlfYnVmZmVyICprZXksIFB5X2J1ZmZlciAqc2FsdCwgUHlfYnVmZmVyICpwZXJzb24sCisgICAgICAgICAgICAgICAgICAgIGludCBmYW5vdXQsIGludCBkZXB0aCwgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmosCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmosIGludCBub2RlX2RlcHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5uZXJfc2l6ZSwgaW50IGxhc3Rfbm9kZSkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03NTA2ZDhkODkwZTVmMTNiIGlucHV0PWU0MTU0OGRmYTA4NjYwMzFdKi8KK3sKKyAgICBCTEFLRTJiT2JqZWN0ICpzZWxmID0gTlVMTDsKKyAgICBQeV9idWZmZXIgYnVmOworCisgICAgdW5zaWduZWQgbG9uZyBsZWFmX3NpemUgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBub2RlX29mZnNldCA9IDA7CisKKyAgICBzZWxmID0gbmV3X0JMQUtFMmJPYmplY3QodHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIFplcm8gcGFyYW1ldGVyIGJsb2NrLiAqLworICAgIG1lbXNldCgmc2VsZi0+cGFyYW0sIDAsIHNpemVvZihzZWxmLT5wYXJhbSkpOworCisgICAgLyogU2V0IGRpZ2VzdCBzaXplLiAqLworICAgIGlmIChkaWdlc3Rfc2l6ZSA8PSAwIHx8IGRpZ2VzdF9zaXplID4gQkxBS0UyQl9PVVRCWVRFUykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZGlnZXN0X3NpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJCX09VVEJZVEVTKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCA9IGRpZ2VzdF9zaXplOworCisgICAgLyogU2V0IHNhbHQgcGFyYW1ldGVyLiAqLworICAgIGlmICgoc2FsdC0+b2JqICE9IE5VTEwpICYmIHNhbHQtPmxlbikgeworICAgICAgICBpZiAoc2FsdC0+bGVuID4gQkxBS0UyQl9TQUxUQllURVMpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJtYXhpbXVtIHNhbHQgbGVuZ3RoIGlzICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJCX1NBTFRCWVRFUyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIG1lbWNweShzZWxmLT5wYXJhbS5zYWx0LCBzYWx0LT5idWYsIHNhbHQtPmxlbik7CisgICAgfQorCisgICAgLyogU2V0IHBlcnNvbmFsaXphdGlvbiBwYXJhbWV0ZXIuICovCisgICAgaWYgKChwZXJzb24tPm9iaiAhPSBOVUxMKSAmJiBwZXJzb24tPmxlbikgeworICAgICAgICBpZiAocGVyc29uLT5sZW4gPiBCTEFLRTJCX1BFUlNPTkFMQllURVMpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJtYXhpbXVtIHBlcnNvbiBsZW5ndGggaXMgJWQgYnl0ZXMiLAorICAgICAgICAgICAgICAgIEJMQUtFMkJfUEVSU09OQUxCWVRFUyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIG1lbWNweShzZWxmLT5wYXJhbS5wZXJzb25hbCwgcGVyc29uLT5idWYsIHBlcnNvbi0+bGVuKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdHJlZSBwYXJhbWV0ZXJzLiAqLworICAgIGlmIChmYW5vdXQgPCAwIHx8IGZhbm91dCA+IDI1NSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZmFub3V0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZmFub3V0ID0gKHVpbnQ4X3QpZmFub3V0OworCisgICAgaWYgKGRlcHRoIDw9IDAgfHwgZGVwdGggPiAyNTUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImRlcHRoIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyNTUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZGVwdGggPSAodWludDhfdClkZXB0aDsKKworICAgIGlmIChsZWFmX3NpemVfb2JqICE9IE5VTEwpIHsKKyAgICAgICAgbGVhZl9zaXplID0gUHlMb25nX0FzVW5zaWduZWRMb25nKGxlYWZfc2l6ZV9vYmopOworICAgICAgICBpZiAobGVhZl9zaXplID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChsZWFmX3NpemUgPiAweEZGRkZGRkZGVSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsZWFmX3NpemUgaXMgdG9vIGxhcmdlIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIHNlbGYtPnBhcmFtLmxlYWZfbGVuZ3RoID0gKHVuc2lnbmVkIGludClsZWFmX3NpemU7CisKKyAgICBpZiAobm9kZV9vZmZzZXRfb2JqICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZV9vZmZzZXQgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKG5vZGVfb2Zmc2V0X29iaik7CisgICAgICAgIGlmIChub2RlX29mZnNldCA9PSAodW5zaWduZWQgbG9uZyBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorI2lmZGVmIEhBVkVfQkxBS0UyUworICAgIGlmIChub2RlX29mZnNldCA+IDB4RkZGRkZGRkZGRkZGVUxMKSB7CisgICAgICAgIC8qIG1heGltdW0gMioqNDggLSAxICovCisgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5vZGVfb2Zmc2V0IGlzIHRvbyBsYXJnZSIpOworICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgfQorICAgIHN0b3JlNDgoJihzZWxmLT5wYXJhbS5ub2RlX29mZnNldCksIG5vZGVfb2Zmc2V0KTsKKyNlbHNlCisgICAgc2VsZi0+cGFyYW0ubm9kZV9vZmZzZXQgPSBub2RlX29mZnNldDsKKyNlbmRpZgorCisgICAgaWYgKG5vZGVfZGVwdGggPCAwIHx8IG5vZGVfZGVwdGggPiAyNTUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgIm5vZGVfZGVwdGggbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzZWxmLT5wYXJhbS5ub2RlX2RlcHRoID0gbm9kZV9kZXB0aDsKKworICAgIGlmIChpbm5lcl9zaXplIDwgMCB8fCBpbm5lcl9zaXplID4gQkxBS0UyQl9PVVRCWVRFUykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiaW5uZXJfc2l6ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgaXMgJWQiLAorICAgICAgICAgICAgICAgIEJMQUtFMkJfT1VUQllURVMpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzZWxmLT5wYXJhbS5pbm5lcl9sZW5ndGggPSBpbm5lcl9zaXplOworCisgICAgLyogU2V0IGtleSBsZW5ndGguICovCisgICAgaWYgKChrZXktPm9iaiAhPSBOVUxMKSAmJiBrZXktPmxlbikgeworICAgICAgICBpZiAoa2V5LT5sZW4gPiBCTEFLRTJCX0tFWUJZVEVTKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAibWF4aW11bSBrZXkgbGVuZ3RoIGlzICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJCX0tFWUJZVEVTKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+cGFyYW0ua2V5X2xlbmd0aCA9ICh1aW50OF90KWtleS0+bGVuOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgaGFzaCBzdGF0ZS4gKi8KKyAgICBpZiAoYmxha2UyYl9pbml0X3BhcmFtKCZzZWxmLT5zdGF0ZSwgJnNlbGYtPnBhcmFtKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZXJyb3IgaW5pdGlhbGl6aW5nIGhhc2ggc3RhdGUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBTZXQgbGFzdCBub2RlIGZsYWcgKG11c3QgY29tZSBhZnRlciBpbml0aWFsaXphdGlvbikuICovCisgICAgc2VsZi0+c3RhdGUubGFzdF9ub2RlID0gbGFzdF9ub2RlOworCisgICAgLyogUHJvY2VzcyBrZXkgYmxvY2sgaWYgYW55LiAqLworICAgIGlmIChzZWxmLT5wYXJhbS5rZXlfbGVuZ3RoKSB7CisgICAgICAgIHVpbnQ4X3QgYmxvY2tbQkxBS0UyQl9CTE9DS0JZVEVTXTsKKyAgICAgICAgbWVtc2V0KGJsb2NrLCAwLCBzaXplb2YoYmxvY2spKTsKKyAgICAgICAgbWVtY3B5KGJsb2NrLCBrZXktPmJ1Ziwga2V5LT5sZW4pOworICAgICAgICBibGFrZTJiX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJsb2NrLCBzaXplb2YoYmxvY2spKTsKKyAgICAgICAgc2VjdXJlX3plcm9fbWVtb3J5KGJsb2NrLCBzaXplb2YoYmxvY2spKTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIGluaXRpYWwgZGF0YSBpZiBhbnkuICovCisgICAgaWYgKGRhdGEgIT0gTlVMTCkgeworICAgICAgICBHRVRfQlVGRkVSX1ZJRVdfT1JfRVJST1IoZGF0YSwgJmJ1ZiwgZ290byBlcnJvcik7CisKKyAgICAgICAgaWYgKGJ1Zi5sZW4gPj0gSEFTSExJQl9HSUxfTUlOU0laRSkgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgYmxha2UyYl91cGRhdGUoJnNlbGYtPnN0YXRlLCBidWYuYnVmLCBidWYubGVuKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibGFrZTJiX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworICAgICAgICB9CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisKKyAgZXJyb3I6CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKltjbGluaWMgaW5wdXRdCitfYmxha2UyYi5ibGFrZTJiLmNvcHkKKworUmV0dXJuIGEgY29weSBvZiB0aGUgaGFzaCBvYmplY3QuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2UyYl9ibGFrZTJiX2NvcHlfaW1wbChCTEFLRTJiT2JqZWN0ICpzZWxmKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM4OWNkMzM1NTBhYjE1NDMgaW5wdXQ9NGM5YzMxOWYxOGYxMDc0N10qLworeworICAgIEJMQUtFMmJPYmplY3QgKmNweTsKKworICAgIGlmICgoY3B5ID0gbmV3X0JMQUtFMmJPYmplY3QoUHlfVFlQRShzZWxmKSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgRU5URVJfSEFTSExJQihzZWxmKTsKKyAgICBjcHktPnBhcmFtID0gc2VsZi0+cGFyYW07CisgICAgY3B5LT5zdGF0ZSA9IHNlbGYtPnN0YXRlOworICAgIExFQVZFX0hBU0hMSUIoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNweTsKK30KKworLypbY2xpbmljIGlucHV0XQorX2JsYWtlMmIuYmxha2UyYi51cGRhdGUKKworICAgIG9iajogb2JqZWN0CisgICAgLworCitVcGRhdGUgdGhpcyBoYXNoIG9iamVjdCdzIHN0YXRlIHdpdGggdGhlIHByb3ZpZGVkIHN0cmluZy4KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19ibGFrZTJiX2JsYWtlMmJfdXBkYXRlKEJMQUtFMmJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTg4OGYwN2M0Y2RkYmU5NCBpbnB1dD0zZWNiOGMxM2VlNDI2MGYyXSovCit7CisgICAgUHlfYnVmZmVyIGJ1ZjsKKworICAgIEdFVF9CVUZGRVJfVklFV19PUl9FUlJPVVQob2JqLCAmYnVmKTsKKworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgaWYgKHNlbGYtPmxvY2sgPT0gTlVMTCAmJiBidWYubGVuID49IEhBU0hMSUJfR0lMX01JTlNJWkUpCisgICAgICAgIHNlbGYtPmxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisKKyAgICBpZiAoc2VsZi0+bG9jayAhPSBOVUxMKSB7CisgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrLCAxKTsKKyAgICAgICBibGFrZTJiX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrKTsKKyAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0gZWxzZSB7CisgICAgICAgIGJsYWtlMmJfdXBkYXRlKCZzZWxmLT5zdGF0ZSwgYnVmLmJ1ZiwgYnVmLmxlbik7CisgICAgfQorI2Vsc2UKKyAgICBibGFrZTJiX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworI2VuZGlmIC8qICFXSVRIX1RIUkVBRCAqLworICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKKy8qW2NsaW5pYyBpbnB1dF0KK19ibGFrZTJiLmJsYWtlMmIuZGlnZXN0CisKK1JldHVybiB0aGUgZGlnZXN0IHZhbHVlIGFzIGEgc3RyaW5nIG9mIGJpbmFyeSBkYXRhLgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMmJfYmxha2UyYl9kaWdlc3RfaW1wbChCTEFLRTJiT2JqZWN0ICpzZWxmKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWIxM2E3OTM2MGQ5ODQ3NDAgaW5wdXQ9YWMyZmE0NjJlYmIxYjljN10qLworeworICAgIHVpbnQ4X3QgZGlnZXN0W0JMQUtFMkJfT1VUQllURVNdOworICAgIGJsYWtlMmJfc3RhdGUgc3RhdGVfY3B5OworCisgICAgRU5URVJfSEFTSExJQihzZWxmKTsKKyAgICBzdGF0ZV9jcHkgPSBzZWxmLT5zdGF0ZTsKKyAgICBibGFrZTJiX2ZpbmFsKCZzdGF0ZV9jcHksIGRpZ2VzdCwgc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCk7CisgICAgTEVBVkVfSEFTSExJQihzZWxmKTsKKyAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciAqKWRpZ2VzdCwKKyAgICAgICAgICAgIHNlbGYtPnBhcmFtLmRpZ2VzdF9sZW5ndGgpOworfQorCisvKltjbGluaWMgaW5wdXRdCitfYmxha2UyYi5ibGFrZTJiLmhleGRpZ2VzdAorCitSZXR1cm4gdGhlIGRpZ2VzdCB2YWx1ZSBhcyBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2UyYl9ibGFrZTJiX2hleGRpZ2VzdF9pbXBsKEJMQUtFMmJPYmplY3QgKnNlbGYpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NmE1MDM2MTE3MTViMjRiZCBpbnB1dD1kNThmMGIyZjM3ODEyZTMzXSovCit7CisgICAgdWludDhfdCBkaWdlc3RbQkxBS0UyQl9PVVRCWVRFU107CisgICAgYmxha2UyYl9zdGF0ZSBzdGF0ZV9jcHk7CisKKyAgICBFTlRFUl9IQVNITElCKHNlbGYpOworICAgIHN0YXRlX2NweSA9IHNlbGYtPnN0YXRlOworICAgIGJsYWtlMmJfZmluYWwoJnN0YXRlX2NweSwgZGlnZXN0LCBzZWxmLT5wYXJhbS5kaWdlc3RfbGVuZ3RoKTsKKyAgICBMRUFWRV9IQVNITElCKHNlbGYpOworICAgIHJldHVybiBfUHlfc3RyaGV4KChjb25zdCBjaGFyICopZGlnZXN0LCBzZWxmLT5wYXJhbS5kaWdlc3RfbGVuZ3RoKTsKK30KKworCitzdGF0aWMgUHlNZXRob2REZWYgcHlfYmxha2UyYl9tZXRob2RzW10gPSB7CisgICAgX0JMQUtFMkJfQkxBS0UyQl9DT1BZX01FVEhPRERFRgorICAgIF9CTEFLRTJCX0JMQUtFMkJfRElHRVNUX01FVEhPRERFRgorICAgIF9CTEFLRTJCX0JMQUtFMkJfSEVYRElHRVNUX01FVEhPRERFRgorICAgIF9CTEFLRTJCX0JMQUtFMkJfVVBEQVRFX01FVEhPRERFRgorICAgIHtOVUxMLCBOVUxMfQorfTsKKworCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJiX2dldF9uYW1lKEJMQUtFMmJPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJibGFrZTJiIik7Cit9CisKKworCitzdGF0aWMgUHlPYmplY3QgKgorcHlfYmxha2UyYl9nZXRfYmxvY2tfc2l6ZShCTEFLRTJiT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoQkxBS0UyQl9CTE9DS0JZVEVTKTsKK30KKworCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJiX2dldF9kaWdlc3Rfc2l6ZShCTEFLRTJiT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCk7Cit9CisKKworc3RhdGljIFB5R2V0U2V0RGVmIHB5X2JsYWtlMmJfZ2V0c2V0dGVyc1tdID0geworICAgIHsibmFtZSIsIChnZXR0ZXIpcHlfYmxha2UyYl9nZXRfbmFtZSwKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJibG9ja19zaXplIiwgKGdldHRlcilweV9ibGFrZTJiX2dldF9ibG9ja19zaXplLAorICAgICAgICBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7ImRpZ2VzdF9zaXplIiwgKGdldHRlcilweV9ibGFrZTJiX2dldF9kaWdlc3Rfc2l6ZSwKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAge05VTEx9Cit9OworCisKK3N0YXRpYyB2b2lkCitweV9ibGFrZTJiX2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCit7CisgICAgQkxBS0UyYk9iamVjdCAqb2JqID0gKEJMQUtFMmJPYmplY3QgKilzZWxmOworCisgICAgLyogVHJ5IG5vdCB0byBsZWF2ZSBzdGF0ZSBpbiBtZW1vcnkuICovCisgICAgc2VjdXJlX3plcm9fbWVtb3J5KCZvYmotPnBhcmFtLCBzaXplb2Yob2JqLT5wYXJhbSkpOworICAgIHNlY3VyZV96ZXJvX21lbW9yeSgmb2JqLT5zdGF0ZSwgc2l6ZW9mKG9iai0+c3RhdGUpKTsKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGlmIChvYmotPmxvY2spIHsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKG9iai0+bG9jayk7CisgICAgICAgIG9iai0+bG9jayA9IE5VTEw7CisgICAgfQorI2VuZGlmCisgICAgUHlPYmplY3RfRGVsKHNlbGYpOworfQorCisKK1B5VHlwZU9iamVjdCBQeUJsYWtlMl9CTEFLRTJiVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2JsYWtlMi5ibGFrZTJiIiwgICAgICAgIC8qIHRwX25hbWUgICAgICAgICAgICAqLworICAgIHNpemVvZihCTEFLRTJiT2JqZWN0KSwgICAgLyogdHBfc2l6ZSAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAgICAgICAgKi8KKyAgICBweV9ibGFrZTJiX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgICAgICAgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgIC8qIHRwX2ZsYWdzICAgICAgICAgICAqLworICAgIHB5X2JsYWtlMmJfbmV3X19kb2NfXywgICAgLyogdHBfZG9jICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgICAgICAgICovCisgICAgcHlfYmxha2UyYl9tZXRob2RzLCAgICAgICAvKiB0cF9tZXRob2RzICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgICAgICAgICAqLworICAgIHB5X2JsYWtlMmJfZ2V0c2V0dGVycywgICAgLyogdHBfZ2V0c2V0ICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAgICAgICAgICAgKi8KKyAgICBweV9ibGFrZTJiX25ldywgICAgICAgICAgIC8qIHRwX25ldyAgICAgICAgICAgICAqLworfTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJtb2R1bGUuYyBiL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJtb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmEzZDQyCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2JsYWtlMm1vZHVsZS5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogV3JpdHRlbiBpbiAyMDEzIGJ5IERtaXRyeSBDaGVzdG55a2ggPGRtaXRyeUBjb2Rpbmdyb2JvdHMuY29tPgorICogTW9kaWZpZWQgZm9yIENQeXRob24gYnkgQ2hyaXN0aWFuIEhlaW1lcyA8Y2hyaXN0aWFuQHB5dGhvbi5vcmc+CisgKgorICogVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGF2ZSBkZWRpY2F0ZWQgYWxsCisgKiBjb3B5cmlnaHQgYW5kIHJlbGF0ZWQgYW5kIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHNvZnR3YXJlIHRvCisgKiB0aGUgcHVibGljIGRvbWFpbiB3b3JsZHdpZGUuIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dAorICogYW55IHdhcnJhbnR5LiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvCisgKi8KKworI2luY2x1ZGUgIlB5dGhvbi5oIgorCisjaW5jbHVkZSAiaW1wbC9ibGFrZTIuaCIKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUJsYWtlMl9CTEFLRTJiVHlwZTsKK2V4dGVybiBQeVR5cGVPYmplY3QgUHlCbGFrZTJfQkxBS0Uyc1R5cGU7CisKKworUHlEb2NfU1RSVkFSKGJsYWtlMm1vZF9fZG9jX18sCisiX2JsYWtlMmIgcHJvdmlkZXMgQkxBS0UyYiBmb3IgaGFzaGxpYlxuIgorKTsKKworCitzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGJsYWtlMm1vZF9mdW5jdGlvbnNbXSA9IHsKKyAgICB7TlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgUHlNb2R1bGVEZWYgYmxha2UyX21vZHVsZSA9IHsKKyAgICBQeU1vZHVsZURlZl9IRUFEX0lOSVQsCisgICAgIl9ibGFrZTIiLAorICAgIGJsYWtlMm1vZF9fZG9jX18sCisgICAgLTEsCisgICAgYmxha2UybW9kX2Z1bmN0aW9ucywKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMCit9OworCisjZGVmaW5lIEFERF9JTlQoZCwgbmFtZSwgdmFsdWUpIGRvIHsgXAorICAgIFB5T2JqZWN0ICp4ID0gUHlMb25nX0Zyb21Mb25nKHZhbHVlKTsgXAorICAgIGlmICgheCkgeyBcCisgICAgICAgIFB5X0RFQ1JFRihtKTsgXAorICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIH0gXAorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB4KSA8IDApIHsgXAorICAgICAgICBQeV9ERUNSRUYobSk7IFwKKyAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICB9IFwKKyAgICBQeV9ERUNSRUYoeCk7IFwKK30gd2hpbGUoMCkKKworCitQeU1PRElOSVRfRlVOQworUHlJbml0X19ibGFrZTIodm9pZCkKK3sKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKKworICAgIG0gPSBQeU1vZHVsZV9DcmVhdGUoJmJsYWtlMl9tb2R1bGUpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogQkxBS0UyYiAqLworICAgIFB5X1RZUEUoJlB5Qmxha2UyX0JMQUtFMmJUeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUJsYWtlMl9CTEFLRTJiVHlwZSkgPCAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRigmUHlCbGFrZTJfQkxBS0UyYlR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiYmxha2UyYiIsIChQeU9iamVjdCAqKSZQeUJsYWtlMl9CTEFLRTJiVHlwZSk7CisKKyAgICBkID0gUHlCbGFrZTJfQkxBS0UyYlR5cGUudHBfZGljdDsKKyAgICBBRERfSU5UKGQsICJTQUxUX1NJWkUiLCBCTEFLRTJCX1NBTFRCWVRFUyk7CisgICAgQUREX0lOVChkLCAiUEVSU09OX1NJWkUiLCBCTEFLRTJCX1BFUlNPTkFMQllURVMpOworICAgIEFERF9JTlQoZCwgIk1BWF9LRVlfU0laRSIsIEJMQUtFMkJfS0VZQllURVMpOworICAgIEFERF9JTlQoZCwgIk1BWF9ESUdFU1RfU0laRSIsIEJMQUtFMkJfT1VUQllURVMpOworCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJMQUtFMkJfU0FMVF9TSVpFIiwgQkxBS0UyQl9TQUxUQllURVMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCTEFLRTJCX1BFUlNPTl9TSVpFIiwgQkxBS0UyQl9QRVJTT05BTEJZVEVTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQkxBS0UyQl9NQVhfS0VZX1NJWkUiLCBCTEFLRTJCX0tFWUJZVEVTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQkxBS0UyQl9NQVhfRElHRVNUX1NJWkUiLCBCTEFLRTJCX09VVEJZVEVTKTsKKworICAgIC8qIEJMQUtFMnMgKi8KKyAgICBQeV9UWVBFKCZQeUJsYWtlMl9CTEFLRTJzVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlCbGFrZTJfQkxBS0Uyc1R5cGUpIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoJlB5Qmxha2UyX0JMQUtFMnNUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImJsYWtlMnMiLCAoUHlPYmplY3QgKikmUHlCbGFrZTJfQkxBS0Uyc1R5cGUpOworCisgICAgZCA9IFB5Qmxha2UyX0JMQUtFMnNUeXBlLnRwX2RpY3Q7CisgICAgQUREX0lOVChkLCAiU0FMVF9TSVpFIiwgQkxBS0UyU19TQUxUQllURVMpOworICAgIEFERF9JTlQoZCwgIlBFUlNPTl9TSVpFIiwgQkxBS0UyU19QRVJTT05BTEJZVEVTKTsKKyAgICBBRERfSU5UKGQsICJNQVhfS0VZX1NJWkUiLCBCTEFLRTJTX0tFWUJZVEVTKTsKKyAgICBBRERfSU5UKGQsICJNQVhfRElHRVNUX1NJWkUiLCBCTEFLRTJTX09VVEJZVEVTKTsKKworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCTEFLRTJTX1NBTFRfU0laRSIsIEJMQUtFMlNfU0FMVEJZVEVTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQkxBS0UyU19QRVJTT05fU0laRSIsIEJMQUtFMlNfUEVSU09OQUxCWVRFUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJMQUtFMlNfTUFYX0tFWV9TSVpFIiwgQkxBS0UyU19LRVlCWVRFUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJMQUtFMlNfTUFYX0RJR0VTVF9TSVpFIiwgQkxBS0UyU19PVVRCWVRFUyk7CisKKyAgICByZXR1cm4gbTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJucy5oIGIvTW9kdWxlcy9fYmxha2UyL2JsYWtlMm5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiY2U4ZQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJucy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIFByZWZpeCBhbGwgcHVibGljIGJsYWtlMiBzeW1ib2xzIHdpdGggUHlCbGFrZTJfCisgKi8KKworI2lmbmRlZiBQeV9CTEFLRTJfTlMKKyNkZWZpbmUgUHlfQkxBS0UyX05TCisKKyNkZWZpbmUgYmxha2UyYiAgICAgICAgICAgIFB5Qmxha2UyX2JsYWtlMmIKKyNkZWZpbmUgYmxha2UyYl9jb21wcmVzcyAgIFB5Qmxha2UyX2JsYWtlMmJfY29tcHJlc3MKKyNkZWZpbmUgYmxha2UyYl9maW5hbCAgICAgIFB5Qmxha2UyX2JsYWtlMmJfZmluYWwKKyNkZWZpbmUgYmxha2UyYl9pbml0ICAgICAgIFB5Qmxha2UyX2JsYWtlMmJfaW5pdAorI2RlZmluZSBibGFrZTJiX2luaXRfa2V5ICAgUHlCbGFrZTJfYmxha2UyYl9pbml0X2tleQorI2RlZmluZSBibGFrZTJiX2luaXRfcGFyYW0gUHlCbGFrZTJfYmxha2UyYl9pbml0X3BhcmFtCisjZGVmaW5lIGJsYWtlMmJfdXBkYXRlICAgICBQeUJsYWtlMl9ibGFrZTJiX3VwZGF0ZQorI2RlZmluZSBibGFrZTJicCAgICAgICAgICAgUHlCbGFrZTJfYmxha2UyYnAKKyNkZWZpbmUgYmxha2UyYnBfZmluYWwgICAgIFB5Qmxha2UyX2JsYWtlMmJwX2ZpbmFsCisjZGVmaW5lIGJsYWtlMmJwX2luaXQgICAgICBQeUJsYWtlMl9ibGFrZTJicF9pbml0CisjZGVmaW5lIGJsYWtlMmJwX2luaXRfa2V5ICBQeUJsYWtlMl9ibGFrZTJicF9pbml0X2tleQorI2RlZmluZSBibGFrZTJicF91cGRhdGUgICAgUHlCbGFrZTJfYmxha2UyYnBfdXBkYXRlCisjZGVmaW5lIGJsYWtlMnMgICAgICAgICAgICBQeUJsYWtlMl9ibGFrZTJzCisjZGVmaW5lIGJsYWtlMnNfY29tcHJlc3MgICBQeUJsYWtlMl9ibGFrZTJzX2NvbXByZXNzCisjZGVmaW5lIGJsYWtlMnNfZmluYWwgICAgICBQeUJsYWtlMl9ibGFrZTJzX2ZpbmFsCisjZGVmaW5lIGJsYWtlMnNfaW5pdCAgICAgICBQeUJsYWtlMl9ibGFrZTJzX2luaXQKKyNkZWZpbmUgYmxha2Uyc19pbml0X2tleSAgIFB5Qmxha2UyX2JsYWtlMnNfaW5pdF9rZXkKKyNkZWZpbmUgYmxha2Uyc19pbml0X3BhcmFtIFB5Qmxha2UyX2JsYWtlMnNfaW5pdF9wYXJhbQorI2RlZmluZSBibGFrZTJzX3VwZGF0ZSAgICAgUHlCbGFrZTJfYmxha2Uyc191cGRhdGUKKyNkZWZpbmUgYmxha2Uyc3AgICAgICAgICAgIFB5Qmxha2UyX2JsYWtlMnNwCisjZGVmaW5lIGJsYWtlMnNwX2ZpbmFsICAgICBQeUJsYWtlMl9ibGFrZTJzcF9maW5hbAorI2RlZmluZSBibGFrZTJzcF9pbml0ICAgICAgUHlCbGFrZTJfYmxha2Uyc3BfaW5pdAorI2RlZmluZSBibGFrZTJzcF9pbml0X2tleSAgUHlCbGFrZTJfYmxha2Uyc3BfaW5pdF9rZXkKKyNkZWZpbmUgYmxha2Uyc3BfdXBkYXRlICAgIFB5Qmxha2UyX2JsYWtlMnNwX3VwZGF0ZQorCisjZW5kaWYgLyogUHlfQkxBS0UyX05TICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ibGFrZTIvYmxha2Uyc19pbXBsLmMgYi9Nb2R1bGVzL19ibGFrZTIvYmxha2Uyc19pbXBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkMmUwMgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJzX2ltcGwuYwpAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIFdyaXR0ZW4gaW4gMjAxMyBieSBEbWl0cnkgQ2hlc3RueWtoIDxkbWl0cnlAY29kaW5ncm9ib3RzLmNvbT4KKyAqIE1vZGlmaWVkIGZvciBDUHl0aG9uIGJ5IENocmlzdGlhbiBIZWltZXMgPGNocmlzdGlhbkBweXRob24ub3JnPgorICoKKyAqIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhdmUgZGVkaWNhdGVkIGFsbAorICogY29weXJpZ2h0IGFuZCByZWxhdGVkIGFuZCBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyBzb2Z0d2FyZSB0bworICogdGhlIHB1YmxpYyBkb21haW4gd29ybGR3aWRlLiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQKKyAqIGFueSB3YXJyYW50eS4gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworICovCisKKy8qIFdBUk5JTkc6IGF1dG9nZW5lcmF0ZWQgZmlsZSEKKyAqCisgKiBUaGUgYmxha2Uyc19pbXBsLmMgaXMgYXV0b2dlbmVyYXRlZCBmcm9tIGJsYWtlMnNfaW1wbC5jLgorICovCisKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJweXN0cmhleC5oIgorI2lmZGVmIFdJVEhfVEhSRUFECisjaW5jbHVkZSAicHl0aHJlYWQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vaGFzaGxpYi5oIgorI2luY2x1ZGUgImJsYWtlMm5zLmgiCisKKyNkZWZpbmUgSEFWRV9CTEFLRTJTIDEKKyNkZWZpbmUgQkxBS0UyX0xPQ0FMX0lOTElORSh0eXBlKSBQeV9MT0NBTF9JTkxJTkUodHlwZSkKKworI2luY2x1ZGUgImltcGwvYmxha2UyLmgiCisjaW5jbHVkZSAiaW1wbC9ibGFrZTItaW1wbC5oIiAvKiBmb3Igc2VjdXJlX3plcm9fbWVtb3J5KCkgYW5kIHN0b3JlNDgoKSAqLworCisjaWZkZWYgQkxBS0UyX1VTRV9TU0UKKyNpbmNsdWRlICJpbXBsL2JsYWtlMnMuYyIKKyNlbHNlCisjaW5jbHVkZSAiaW1wbC9ibGFrZTJzLXJlZi5jIgorI2VuZGlmCisKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUJsYWtlMl9CTEFLRTJzVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBibGFrZTJzX3BhcmFtICAgIHBhcmFtOworICAgIGJsYWtlMnNfc3RhdGUgICAgc3RhdGU7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBQeVRocmVhZF90eXBlX2xvY2sgbG9jazsKKyNlbmRpZgorfSBCTEFLRTJzT2JqZWN0OworCisjaW5jbHVkZSAiY2xpbmljL2JsYWtlMnNfaW1wbC5jLmgiCisKKy8qW2NsaW5pYyBpbnB1dF0KK21vZHVsZSBfYmxha2UycworY2xhc3MgX2JsYWtlMnMuYmxha2UycyAiQkxBS0Uyc09iamVjdCAqIiAiJlB5Qmxha2UyX0JMQUtFMnNUeXBlIgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9ZWRiZmNmNzU1N2E2ODVhN10qLworCisKK3N0YXRpYyBCTEFLRTJzT2JqZWN0ICoKK25ld19CTEFLRTJzT2JqZWN0KFB5VHlwZU9iamVjdCAqdHlwZSkKK3sKKyAgICBCTEFLRTJzT2JqZWN0ICpzZWxmOworICAgIHNlbGYgPSAoQkxBS0Uyc09iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5sb2NrID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gc2VsZjsKK30KKworLypbY2xpbmljIGlucHV0XQorQGNsYXNzbWV0aG9kCitfYmxha2Uycy5ibGFrZTJzLl9fbmV3X18gYXMgcHlfYmxha2Uyc19uZXcKKyAgICBzdHJpbmcgYXMgZGF0YTogb2JqZWN0ID0gTlVMTAorICAgICoKKyAgICBkaWdlc3Rfc2l6ZTogaW50KGNfZGVmYXVsdD0iQkxBS0UyU19PVVRCWVRFUyIpID0gX2JsYWtlMnMuYmxha2Uycy5NQVhfRElHRVNUX1NJWkUKKyAgICBrZXk6IFB5X2J1ZmZlciA9IE5vbmUKKyAgICBzYWx0OiBQeV9idWZmZXIgPSBOb25lCisgICAgcGVyc29uOiBQeV9idWZmZXIgPSBOb25lCisgICAgZmFub3V0OiBpbnQgPSAxCisgICAgZGVwdGg6IGludCA9IDEKKyAgICBsZWFmX3NpemUgYXMgbGVhZl9zaXplX29iajogb2JqZWN0ID0gTlVMTAorICAgIG5vZGVfb2Zmc2V0IGFzIG5vZGVfb2Zmc2V0X29iajogb2JqZWN0ID0gTlVMTAorICAgIG5vZGVfZGVwdGg6IGludCA9IDAKKyAgICBpbm5lcl9zaXplOiBpbnQgPSAwCisgICAgbGFzdF9ub2RlOiBib29sID0gRmFsc2UKKworUmV0dXJuIGEgbmV3IEJMQUtFMnMgaGFzaCBvYmplY3QuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJzX25ld19pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmRhdGEsIGludCBkaWdlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgUHlfYnVmZmVyICprZXksIFB5X2J1ZmZlciAqc2FsdCwgUHlfYnVmZmVyICpwZXJzb24sCisgICAgICAgICAgICAgICAgICAgIGludCBmYW5vdXQsIGludCBkZXB0aCwgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmosCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmosIGludCBub2RlX2RlcHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5uZXJfc2l6ZSwgaW50IGxhc3Rfbm9kZSkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mZTA2MGIyNThhOGNiZmM2IGlucHV0PTQ1OGNmZGNiM2QwZDQ3ZmZdKi8KK3sKKyAgICBCTEFLRTJzT2JqZWN0ICpzZWxmID0gTlVMTDsKKyAgICBQeV9idWZmZXIgYnVmOworCisgICAgdW5zaWduZWQgbG9uZyBsZWFmX3NpemUgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBub2RlX29mZnNldCA9IDA7CisKKyAgICBzZWxmID0gbmV3X0JMQUtFMnNPYmplY3QodHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIFplcm8gcGFyYW1ldGVyIGJsb2NrLiAqLworICAgIG1lbXNldCgmc2VsZi0+cGFyYW0sIDAsIHNpemVvZihzZWxmLT5wYXJhbSkpOworCisgICAgLyogU2V0IGRpZ2VzdCBzaXplLiAqLworICAgIGlmIChkaWdlc3Rfc2l6ZSA8PSAwIHx8IGRpZ2VzdF9zaXplID4gQkxBS0UyU19PVVRCWVRFUykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZGlnZXN0X3NpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJTX09VVEJZVEVTKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCA9IGRpZ2VzdF9zaXplOworCisgICAgLyogU2V0IHNhbHQgcGFyYW1ldGVyLiAqLworICAgIGlmICgoc2FsdC0+b2JqICE9IE5VTEwpICYmIHNhbHQtPmxlbikgeworICAgICAgICBpZiAoc2FsdC0+bGVuID4gQkxBS0UyU19TQUxUQllURVMpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJtYXhpbXVtIHNhbHQgbGVuZ3RoIGlzICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJTX1NBTFRCWVRFUyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIG1lbWNweShzZWxmLT5wYXJhbS5zYWx0LCBzYWx0LT5idWYsIHNhbHQtPmxlbik7CisgICAgfQorCisgICAgLyogU2V0IHBlcnNvbmFsaXphdGlvbiBwYXJhbWV0ZXIuICovCisgICAgaWYgKChwZXJzb24tPm9iaiAhPSBOVUxMKSAmJiBwZXJzb24tPmxlbikgeworICAgICAgICBpZiAocGVyc29uLT5sZW4gPiBCTEFLRTJTX1BFUlNPTkFMQllURVMpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJtYXhpbXVtIHBlcnNvbiBsZW5ndGggaXMgJWQgYnl0ZXMiLAorICAgICAgICAgICAgICAgIEJMQUtFMlNfUEVSU09OQUxCWVRFUyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIG1lbWNweShzZWxmLT5wYXJhbS5wZXJzb25hbCwgcGVyc29uLT5idWYsIHBlcnNvbi0+bGVuKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdHJlZSBwYXJhbWV0ZXJzLiAqLworICAgIGlmIChmYW5vdXQgPCAwIHx8IGZhbm91dCA+IDI1NSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZmFub3V0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZmFub3V0ID0gKHVpbnQ4X3QpZmFub3V0OworCisgICAgaWYgKGRlcHRoIDw9IDAgfHwgZGVwdGggPiAyNTUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImRlcHRoIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyNTUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZGVwdGggPSAodWludDhfdClkZXB0aDsKKworICAgIGlmIChsZWFmX3NpemVfb2JqICE9IE5VTEwpIHsKKyAgICAgICAgbGVhZl9zaXplID0gUHlMb25nX0FzVW5zaWduZWRMb25nKGxlYWZfc2l6ZV9vYmopOworICAgICAgICBpZiAobGVhZl9zaXplID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChsZWFmX3NpemUgPiAweEZGRkZGRkZGVSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsZWFmX3NpemUgaXMgdG9vIGxhcmdlIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIHNlbGYtPnBhcmFtLmxlYWZfbGVuZ3RoID0gKHVuc2lnbmVkIGludClsZWFmX3NpemU7CisKKyAgICBpZiAobm9kZV9vZmZzZXRfb2JqICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZV9vZmZzZXQgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKG5vZGVfb2Zmc2V0X29iaik7CisgICAgICAgIGlmIChub2RlX29mZnNldCA9PSAodW5zaWduZWQgbG9uZyBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorI2lmZGVmIEhBVkVfQkxBS0UyUworICAgIGlmIChub2RlX29mZnNldCA+IDB4RkZGRkZGRkZGRkZGVUxMKSB7CisgICAgICAgIC8qIG1heGltdW0gMioqNDggLSAxICovCisgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5vZGVfb2Zmc2V0IGlzIHRvbyBsYXJnZSIpOworICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgfQorICAgIHN0b3JlNDgoJihzZWxmLT5wYXJhbS5ub2RlX29mZnNldCksIG5vZGVfb2Zmc2V0KTsKKyNlbHNlCisgICAgc2VsZi0+cGFyYW0ubm9kZV9vZmZzZXQgPSBub2RlX29mZnNldDsKKyNlbmRpZgorCisgICAgaWYgKG5vZGVfZGVwdGggPCAwIHx8IG5vZGVfZGVwdGggPiAyNTUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgIm5vZGVfZGVwdGggbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzZWxmLT5wYXJhbS5ub2RlX2RlcHRoID0gbm9kZV9kZXB0aDsKKworICAgIGlmIChpbm5lcl9zaXplIDwgMCB8fCBpbm5lcl9zaXplID4gQkxBS0UyU19PVVRCWVRFUykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiaW5uZXJfc2l6ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgaXMgJWQiLAorICAgICAgICAgICAgICAgIEJMQUtFMlNfT1VUQllURVMpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzZWxmLT5wYXJhbS5pbm5lcl9sZW5ndGggPSBpbm5lcl9zaXplOworCisgICAgLyogU2V0IGtleSBsZW5ndGguICovCisgICAgaWYgKChrZXktPm9iaiAhPSBOVUxMKSAmJiBrZXktPmxlbikgeworICAgICAgICBpZiAoa2V5LT5sZW4gPiBCTEFLRTJTX0tFWUJZVEVTKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAibWF4aW11bSBrZXkgbGVuZ3RoIGlzICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJTX0tFWUJZVEVTKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+cGFyYW0ua2V5X2xlbmd0aCA9ICh1aW50OF90KWtleS0+bGVuOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgaGFzaCBzdGF0ZS4gKi8KKyAgICBpZiAoYmxha2Uyc19pbml0X3BhcmFtKCZzZWxmLT5zdGF0ZSwgJnNlbGYtPnBhcmFtKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZXJyb3IgaW5pdGlhbGl6aW5nIGhhc2ggc3RhdGUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBTZXQgbGFzdCBub2RlIGZsYWcgKG11c3QgY29tZSBhZnRlciBpbml0aWFsaXphdGlvbikuICovCisgICAgc2VsZi0+c3RhdGUubGFzdF9ub2RlID0gbGFzdF9ub2RlOworCisgICAgLyogUHJvY2VzcyBrZXkgYmxvY2sgaWYgYW55LiAqLworICAgIGlmIChzZWxmLT5wYXJhbS5rZXlfbGVuZ3RoKSB7CisgICAgICAgIHVpbnQ4X3QgYmxvY2tbQkxBS0UyU19CTE9DS0JZVEVTXTsKKyAgICAgICAgbWVtc2V0KGJsb2NrLCAwLCBzaXplb2YoYmxvY2spKTsKKyAgICAgICAgbWVtY3B5KGJsb2NrLCBrZXktPmJ1Ziwga2V5LT5sZW4pOworICAgICAgICBibGFrZTJzX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJsb2NrLCBzaXplb2YoYmxvY2spKTsKKyAgICAgICAgc2VjdXJlX3plcm9fbWVtb3J5KGJsb2NrLCBzaXplb2YoYmxvY2spKTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIGluaXRpYWwgZGF0YSBpZiBhbnkuICovCisgICAgaWYgKGRhdGEgIT0gTlVMTCkgeworICAgICAgICBHRVRfQlVGRkVSX1ZJRVdfT1JfRVJST1IoZGF0YSwgJmJ1ZiwgZ290byBlcnJvcik7CisKKyAgICAgICAgaWYgKGJ1Zi5sZW4gPj0gSEFTSExJQl9HSUxfTUlOU0laRSkgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgYmxha2Uyc191cGRhdGUoJnNlbGYtPnN0YXRlLCBidWYuYnVmLCBidWYubGVuKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibGFrZTJzX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworICAgICAgICB9CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisKKyAgZXJyb3I6CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKltjbGluaWMgaW5wdXRdCitfYmxha2Uycy5ibGFrZTJzLmNvcHkKKworUmV0dXJuIGEgY29weSBvZiB0aGUgaGFzaCBvYmplY3QuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2Uyc19ibGFrZTJzX2NvcHlfaW1wbChCTEFLRTJzT2JqZWN0ICpzZWxmKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTZjNWJhZGE0MDRiN2FlZDcgaW5wdXQ9Yzg4NThlODg3YWU0YTA3YV0qLworeworICAgIEJMQUtFMnNPYmplY3QgKmNweTsKKworICAgIGlmICgoY3B5ID0gbmV3X0JMQUtFMnNPYmplY3QoUHlfVFlQRShzZWxmKSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgRU5URVJfSEFTSExJQihzZWxmKTsKKyAgICBjcHktPnBhcmFtID0gc2VsZi0+cGFyYW07CisgICAgY3B5LT5zdGF0ZSA9IHNlbGYtPnN0YXRlOworICAgIExFQVZFX0hBU0hMSUIoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNweTsKK30KKworLypbY2xpbmljIGlucHV0XQorX2JsYWtlMnMuYmxha2Uycy51cGRhdGUKKworICAgIG9iajogb2JqZWN0CisgICAgLworCitVcGRhdGUgdGhpcyBoYXNoIG9iamVjdCdzIHN0YXRlIHdpdGggdGhlIHByb3ZpZGVkIHN0cmluZy4KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19ibGFrZTJzX2JsYWtlMnNfdXBkYXRlKEJMQUtFMnNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmU4NDM4YTFkM2NlZGU4NyBpbnB1dD00N2E0MDhiOWEzY2MwNWM1XSovCit7CisgICAgUHlfYnVmZmVyIGJ1ZjsKKworICAgIEdFVF9CVUZGRVJfVklFV19PUl9FUlJPVVQob2JqLCAmYnVmKTsKKworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgaWYgKHNlbGYtPmxvY2sgPT0gTlVMTCAmJiBidWYubGVuID49IEhBU0hMSUJfR0lMX01JTlNJWkUpCisgICAgICAgIHNlbGYtPmxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisKKyAgICBpZiAoc2VsZi0+bG9jayAhPSBOVUxMKSB7CisgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrLCAxKTsKKyAgICAgICBibGFrZTJzX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrKTsKKyAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0gZWxzZSB7CisgICAgICAgIGJsYWtlMnNfdXBkYXRlKCZzZWxmLT5zdGF0ZSwgYnVmLmJ1ZiwgYnVmLmxlbik7CisgICAgfQorI2Vsc2UKKyAgICBibGFrZTJzX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworI2VuZGlmIC8qICFXSVRIX1RIUkVBRCAqLworICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKKy8qW2NsaW5pYyBpbnB1dF0KK19ibGFrZTJzLmJsYWtlMnMuZGlnZXN0CisKK1JldHVybiB0aGUgZGlnZXN0IHZhbHVlIGFzIGEgc3RyaW5nIG9mIGJpbmFyeSBkYXRhLgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMnNfYmxha2Uyc19kaWdlc3RfaW1wbChCTEFLRTJzT2JqZWN0ICpzZWxmKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTgwZTgxYTQ4YzZmNzljZjkgaW5wdXQ9ZmViOWEyMjAxMzViZGViYV0qLworeworICAgIHVpbnQ4X3QgZGlnZXN0W0JMQUtFMlNfT1VUQllURVNdOworICAgIGJsYWtlMnNfc3RhdGUgc3RhdGVfY3B5OworCisgICAgRU5URVJfSEFTSExJQihzZWxmKTsKKyAgICBzdGF0ZV9jcHkgPSBzZWxmLT5zdGF0ZTsKKyAgICBibGFrZTJzX2ZpbmFsKCZzdGF0ZV9jcHksIGRpZ2VzdCwgc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCk7CisgICAgTEVBVkVfSEFTSExJQihzZWxmKTsKKyAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciAqKWRpZ2VzdCwKKyAgICAgICAgICAgIHNlbGYtPnBhcmFtLmRpZ2VzdF9sZW5ndGgpOworfQorCisvKltjbGluaWMgaW5wdXRdCitfYmxha2Uycy5ibGFrZTJzLmhleGRpZ2VzdAorCitSZXR1cm4gdGhlIGRpZ2VzdCB2YWx1ZSBhcyBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2Uyc19ibGFrZTJzX2hleGRpZ2VzdF9pbXBsKEJMQUtFMnNPYmplY3QgKnNlbGYpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGI2YzUwMjhjMGEzYzJlNSBpbnB1dD00ZTQ4NzdiOGJkN2FlYTkxXSovCit7CisgICAgdWludDhfdCBkaWdlc3RbQkxBS0UyU19PVVRCWVRFU107CisgICAgYmxha2Uyc19zdGF0ZSBzdGF0ZV9jcHk7CisKKyAgICBFTlRFUl9IQVNITElCKHNlbGYpOworICAgIHN0YXRlX2NweSA9IHNlbGYtPnN0YXRlOworICAgIGJsYWtlMnNfZmluYWwoJnN0YXRlX2NweSwgZGlnZXN0LCBzZWxmLT5wYXJhbS5kaWdlc3RfbGVuZ3RoKTsKKyAgICBMRUFWRV9IQVNITElCKHNlbGYpOworICAgIHJldHVybiBfUHlfc3RyaGV4KChjb25zdCBjaGFyICopZGlnZXN0LCBzZWxmLT5wYXJhbS5kaWdlc3RfbGVuZ3RoKTsKK30KKworCitzdGF0aWMgUHlNZXRob2REZWYgcHlfYmxha2Uyc19tZXRob2RzW10gPSB7CisgICAgX0JMQUtFMlNfQkxBS0UyU19DT1BZX01FVEhPRERFRgorICAgIF9CTEFLRTJTX0JMQUtFMlNfRElHRVNUX01FVEhPRERFRgorICAgIF9CTEFLRTJTX0JMQUtFMlNfSEVYRElHRVNUX01FVEhPRERFRgorICAgIF9CTEFLRTJTX0JMQUtFMlNfVVBEQVRFX01FVEhPRERFRgorICAgIHtOVUxMLCBOVUxMfQorfTsKKworCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJzX2dldF9uYW1lKEJMQUtFMnNPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJibGFrZTJzIik7Cit9CisKKworCitzdGF0aWMgUHlPYmplY3QgKgorcHlfYmxha2Uyc19nZXRfYmxvY2tfc2l6ZShCTEFLRTJzT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoQkxBS0UyU19CTE9DS0JZVEVTKTsKK30KKworCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJzX2dldF9kaWdlc3Rfc2l6ZShCTEFLRTJzT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCk7Cit9CisKKworc3RhdGljIFB5R2V0U2V0RGVmIHB5X2JsYWtlMnNfZ2V0c2V0dGVyc1tdID0geworICAgIHsibmFtZSIsIChnZXR0ZXIpcHlfYmxha2Uyc19nZXRfbmFtZSwKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJibG9ja19zaXplIiwgKGdldHRlcilweV9ibGFrZTJzX2dldF9ibG9ja19zaXplLAorICAgICAgICBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7ImRpZ2VzdF9zaXplIiwgKGdldHRlcilweV9ibGFrZTJzX2dldF9kaWdlc3Rfc2l6ZSwKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAge05VTEx9Cit9OworCisKK3N0YXRpYyB2b2lkCitweV9ibGFrZTJzX2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCit7CisgICAgQkxBS0Uyc09iamVjdCAqb2JqID0gKEJMQUtFMnNPYmplY3QgKilzZWxmOworCisgICAgLyogVHJ5IG5vdCB0byBsZWF2ZSBzdGF0ZSBpbiBtZW1vcnkuICovCisgICAgc2VjdXJlX3plcm9fbWVtb3J5KCZvYmotPnBhcmFtLCBzaXplb2Yob2JqLT5wYXJhbSkpOworICAgIHNlY3VyZV96ZXJvX21lbW9yeSgmb2JqLT5zdGF0ZSwgc2l6ZW9mKG9iai0+c3RhdGUpKTsKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGlmIChvYmotPmxvY2spIHsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKG9iai0+bG9jayk7CisgICAgICAgIG9iai0+bG9jayA9IE5VTEw7CisgICAgfQorI2VuZGlmCisgICAgUHlPYmplY3RfRGVsKHNlbGYpOworfQorCisKK1B5VHlwZU9iamVjdCBQeUJsYWtlMl9CTEFLRTJzVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2JsYWtlMi5ibGFrZTJzIiwgICAgICAgIC8qIHRwX25hbWUgICAgICAgICAgICAqLworICAgIHNpemVvZihCTEFLRTJzT2JqZWN0KSwgICAgLyogdHBfc2l6ZSAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAgICAgICAgKi8KKyAgICBweV9ibGFrZTJzX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgICAgICAgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgIC8qIHRwX2ZsYWdzICAgICAgICAgICAqLworICAgIHB5X2JsYWtlMnNfbmV3X19kb2NfXywgICAgLyogdHBfZG9jICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgICAgICAgICovCisgICAgcHlfYmxha2Uyc19tZXRob2RzLCAgICAgICAvKiB0cF9tZXRob2RzICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgICAgICAgICAqLworICAgIHB5X2JsYWtlMnNfZ2V0c2V0dGVycywgICAgLyogdHBfZ2V0c2V0ICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAgICAgICAgICAgKi8KKyAgICBweV9ibGFrZTJzX25ldywgICAgICAgICAgIC8qIHRwX25ldyAgICAgICAgICAgICAqLworfTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9jbGluaWMvYmxha2UyYl9pbXBsLmMuaCBiL01vZHVsZXMvX2JsYWtlMi9jbGluaWMvYmxha2UyYl9pbXBsLmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWMwNzNhCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2NsaW5pYy9ibGFrZTJiX2ltcGwuYy5oCkBAIC0wLDAgKzEsMTI1IEBACisvKltjbGluaWMgaW5wdXRdCitwcmVzZXJ2ZQorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitQeURvY19TVFJWQVIocHlfYmxha2UyYl9uZXdfX2RvY19fLAorImJsYWtlMmIoc3RyaW5nPU5vbmUsICosIGRpZ2VzdF9zaXplPV9ibGFrZTJiLmJsYWtlMmIuTUFYX0RJR0VTVF9TSVpFLFxuIgorIiAgICAgICAga2V5PU5vbmUsIHNhbHQ9Tm9uZSwgcGVyc29uPU5vbmUsIGZhbm91dD0xLCBkZXB0aD0xLFxuIgorIiAgICAgICAgbGVhZl9zaXplPU5vbmUsIG5vZGVfb2Zmc2V0PU5vbmUsIG5vZGVfZGVwdGg9MCwgaW5uZXJfc2l6ZT0wLFxuIgorIiAgICAgICAgbGFzdF9ub2RlPUZhbHNlKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIGEgbmV3IEJMQUtFMmIgaGFzaCBvYmplY3QuIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJiX25ld19pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmRhdGEsIGludCBkaWdlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgUHlfYnVmZmVyICprZXksIFB5X2J1ZmZlciAqc2FsdCwgUHlfYnVmZmVyICpwZXJzb24sCisgICAgICAgICAgICAgICAgICAgIGludCBmYW5vdXQsIGludCBkZXB0aCwgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmosCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmosIGludCBub2RlX2RlcHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5uZXJfc2l6ZSwgaW50IGxhc3Rfbm9kZSk7CisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJiX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJkaWdlc3Rfc2l6ZSIsICJrZXkiLCAic2FsdCIsICJwZXJzb24iLCAiZmFub3V0IiwgImRlcHRoIiwgImxlYWZfc2l6ZSIsICJub2RlX29mZnNldCIsICJub2RlX2RlcHRoIiwgImlubmVyX3NpemUiLCAibGFzdF9ub2RlIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE8kaXkqeSp5KmlpT09paXA6Ymxha2UyYiIsIF9rZXl3b3JkcywgMH07CisgICAgUHlPYmplY3QgKmRhdGEgPSBOVUxMOworICAgIGludCBkaWdlc3Rfc2l6ZSA9IEJMQUtFMkJfT1VUQllURVM7CisgICAgUHlfYnVmZmVyIGtleSA9IHtOVUxMLCBOVUxMfTsKKyAgICBQeV9idWZmZXIgc2FsdCA9IHtOVUxMLCBOVUxMfTsKKyAgICBQeV9idWZmZXIgcGVyc29uID0ge05VTEwsIE5VTEx9OworICAgIGludCBmYW5vdXQgPSAxOworICAgIGludCBkZXB0aCA9IDE7CisgICAgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmogPSBOVUxMOworICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmogPSBOVUxMOworICAgIGludCBub2RlX2RlcHRoID0gMDsKKyAgICBpbnQgaW5uZXJfc2l6ZSA9IDA7CisgICAgaW50IGxhc3Rfbm9kZSA9IDA7CisKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCAmZGlnZXN0X3NpemUsICZrZXksICZzYWx0LCAmcGVyc29uLCAmZmFub3V0LCAmZGVwdGgsICZsZWFmX3NpemVfb2JqLCAmbm9kZV9vZmZzZXRfb2JqLCAmbm9kZV9kZXB0aCwgJmlubmVyX3NpemUsICZsYXN0X25vZGUpKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gcHlfYmxha2UyYl9uZXdfaW1wbCh0eXBlLCBkYXRhLCBkaWdlc3Rfc2l6ZSwgJmtleSwgJnNhbHQsICZwZXJzb24sIGZhbm91dCwgZGVwdGgsIGxlYWZfc2l6ZV9vYmosIG5vZGVfb2Zmc2V0X29iaiwgbm9kZV9kZXB0aCwgaW5uZXJfc2l6ZSwgbGFzdF9ub2RlKTsKKworZXhpdDoKKyAgICAvKiBDbGVhbnVwIGZvciBrZXkgKi8KKyAgICBpZiAoa2V5Lm9iaikgeworICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmtleSk7CisgICAgfQorICAgIC8qIENsZWFudXAgZm9yIHNhbHQgKi8KKyAgICBpZiAoc2FsdC5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzYWx0KTsKKyAgICB9CisgICAgLyogQ2xlYW51cCBmb3IgcGVyc29uICovCisgICAgaWYgKHBlcnNvbi5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZXJzb24pOworICAgIH0KKworICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKK1B5RG9jX1NUUlZBUihfYmxha2UyYl9ibGFrZTJiX2NvcHlfX2RvY19fLAorImNvcHkoJHNlbGYsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJSZXR1cm4gYSBjb3B5IG9mIHRoZSBoYXNoIG9iamVjdC4iKTsKKworI2RlZmluZSBfQkxBS0UyQl9CTEFLRTJCX0NPUFlfTUVUSE9EREVGICAgIFwKKyAgICB7ImNvcHkiLCAoUHlDRnVuY3Rpb24pX2JsYWtlMmJfYmxha2UyYl9jb3B5LCBNRVRIX05PQVJHUywgX2JsYWtlMmJfYmxha2UyYl9jb3B5X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2UyYl9ibGFrZTJiX2NvcHlfaW1wbChCTEFLRTJiT2JqZWN0ICpzZWxmKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19ibGFrZTJiX2JsYWtlMmJfY29weShCTEFLRTJiT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqUHlfVU5VU0VEKGlnbm9yZWQpKQoreworICAgIHJldHVybiBfYmxha2UyYl9ibGFrZTJiX2NvcHlfaW1wbChzZWxmKTsKK30KKworUHlEb2NfU1RSVkFSKF9ibGFrZTJiX2JsYWtlMmJfdXBkYXRlX19kb2NfXywKKyJ1cGRhdGUoJHNlbGYsIG9iaiwgLylcbiIKKyItLVxuIgorIlxuIgorIlVwZGF0ZSB0aGlzIGhhc2ggb2JqZWN0XCdzIHN0YXRlIHdpdGggdGhlIHByb3ZpZGVkIHN0cmluZy4iKTsKKworI2RlZmluZSBfQkxBS0UyQl9CTEFLRTJCX1VQREFURV9NRVRIT0RERUYgICAgXAorICAgIHsidXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKV9ibGFrZTJiX2JsYWtlMmJfdXBkYXRlLCBNRVRIX08sIF9ibGFrZTJiX2JsYWtlMmJfdXBkYXRlX19kb2NfX30sCisKK1B5RG9jX1NUUlZBUihfYmxha2UyYl9ibGFrZTJiX2RpZ2VzdF9fZG9jX18sCisiZGlnZXN0KCRzZWxmLCAvKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgYXMgYSBzdHJpbmcgb2YgYmluYXJ5IGRhdGEuIik7CisKKyNkZWZpbmUgX0JMQUtFMkJfQkxBS0UyQl9ESUdFU1RfTUVUSE9EREVGICAgIFwKKyAgICB7ImRpZ2VzdCIsIChQeUNGdW5jdGlvbilfYmxha2UyYl9ibGFrZTJiX2RpZ2VzdCwgTUVUSF9OT0FSR1MsIF9ibGFrZTJiX2JsYWtlMmJfZGlnZXN0X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2UyYl9ibGFrZTJiX2RpZ2VzdF9pbXBsKEJMQUtFMmJPYmplY3QgKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMmJfYmxha2UyYl9kaWdlc3QoQkxBS0UyYk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKlB5X1VOVVNFRChpZ25vcmVkKSkKK3sKKyAgICByZXR1cm4gX2JsYWtlMmJfYmxha2UyYl9kaWdlc3RfaW1wbChzZWxmKTsKK30KKworUHlEb2NfU1RSVkFSKF9ibGFrZTJiX2JsYWtlMmJfaGV4ZGlnZXN0X19kb2NfXywKKyJoZXhkaWdlc3QoJHNlbGYsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJSZXR1cm4gdGhlIGRpZ2VzdCB2YWx1ZSBhcyBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMuIik7CisKKyNkZWZpbmUgX0JMQUtFMkJfQkxBS0UyQl9IRVhESUdFU1RfTUVUSE9EREVGICAgIFwKKyAgICB7ImhleGRpZ2VzdCIsIChQeUNGdW5jdGlvbilfYmxha2UyYl9ibGFrZTJiX2hleGRpZ2VzdCwgTUVUSF9OT0FSR1MsIF9ibGFrZTJiX2JsYWtlMmJfaGV4ZGlnZXN0X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2UyYl9ibGFrZTJiX2hleGRpZ2VzdF9pbXBsKEJMQUtFMmJPYmplY3QgKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMmJfYmxha2UyYl9oZXhkaWdlc3QoQkxBS0UyYk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKlB5X1VOVVNFRChpZ25vcmVkKSkKK3sKKyAgICByZXR1cm4gX2JsYWtlMmJfYmxha2UyYl9oZXhkaWdlc3RfaW1wbChzZWxmKTsKK30KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MzVhNTQ4NTJjOThlNTFjIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9jbGluaWMvYmxha2Uyc19pbXBsLmMuaCBiL01vZHVsZXMvX2JsYWtlMi9jbGluaWMvYmxha2Uyc19pbXBsLmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTkwOGQzCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2NsaW5pYy9ibGFrZTJzX2ltcGwuYy5oCkBAIC0wLDAgKzEsMTI1IEBACisvKltjbGluaWMgaW5wdXRdCitwcmVzZXJ2ZQorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitQeURvY19TVFJWQVIocHlfYmxha2Uyc19uZXdfX2RvY19fLAorImJsYWtlMnMoc3RyaW5nPU5vbmUsICosIGRpZ2VzdF9zaXplPV9ibGFrZTJzLmJsYWtlMnMuTUFYX0RJR0VTVF9TSVpFLFxuIgorIiAgICAgICAga2V5PU5vbmUsIHNhbHQ9Tm9uZSwgcGVyc29uPU5vbmUsIGZhbm91dD0xLCBkZXB0aD0xLFxuIgorIiAgICAgICAgbGVhZl9zaXplPU5vbmUsIG5vZGVfb2Zmc2V0PU5vbmUsIG5vZGVfZGVwdGg9MCwgaW5uZXJfc2l6ZT0wLFxuIgorIiAgICAgICAgbGFzdF9ub2RlPUZhbHNlKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIGEgbmV3IEJMQUtFMnMgaGFzaCBvYmplY3QuIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJzX25ld19pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmRhdGEsIGludCBkaWdlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgUHlfYnVmZmVyICprZXksIFB5X2J1ZmZlciAqc2FsdCwgUHlfYnVmZmVyICpwZXJzb24sCisgICAgICAgICAgICAgICAgICAgIGludCBmYW5vdXQsIGludCBkZXB0aCwgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmosCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmosIGludCBub2RlX2RlcHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5uZXJfc2l6ZSwgaW50IGxhc3Rfbm9kZSk7CisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJzX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJkaWdlc3Rfc2l6ZSIsICJrZXkiLCAic2FsdCIsICJwZXJzb24iLCAiZmFub3V0IiwgImRlcHRoIiwgImxlYWZfc2l6ZSIsICJub2RlX29mZnNldCIsICJub2RlX2RlcHRoIiwgImlubmVyX3NpemUiLCAibGFzdF9ub2RlIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE8kaXkqeSp5KmlpT09paXA6Ymxha2UycyIsIF9rZXl3b3JkcywgMH07CisgICAgUHlPYmplY3QgKmRhdGEgPSBOVUxMOworICAgIGludCBkaWdlc3Rfc2l6ZSA9IEJMQUtFMlNfT1VUQllURVM7CisgICAgUHlfYnVmZmVyIGtleSA9IHtOVUxMLCBOVUxMfTsKKyAgICBQeV9idWZmZXIgc2FsdCA9IHtOVUxMLCBOVUxMfTsKKyAgICBQeV9idWZmZXIgcGVyc29uID0ge05VTEwsIE5VTEx9OworICAgIGludCBmYW5vdXQgPSAxOworICAgIGludCBkZXB0aCA9IDE7CisgICAgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmogPSBOVUxMOworICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmogPSBOVUxMOworICAgIGludCBub2RlX2RlcHRoID0gMDsKKyAgICBpbnQgaW5uZXJfc2l6ZSA9IDA7CisgICAgaW50IGxhc3Rfbm9kZSA9IDA7CisKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCAmZGlnZXN0X3NpemUsICZrZXksICZzYWx0LCAmcGVyc29uLCAmZmFub3V0LCAmZGVwdGgsICZsZWFmX3NpemVfb2JqLCAmbm9kZV9vZmZzZXRfb2JqLCAmbm9kZV9kZXB0aCwgJmlubmVyX3NpemUsICZsYXN0X25vZGUpKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gcHlfYmxha2Uyc19uZXdfaW1wbCh0eXBlLCBkYXRhLCBkaWdlc3Rfc2l6ZSwgJmtleSwgJnNhbHQsICZwZXJzb24sIGZhbm91dCwgZGVwdGgsIGxlYWZfc2l6ZV9vYmosIG5vZGVfb2Zmc2V0X29iaiwgbm9kZV9kZXB0aCwgaW5uZXJfc2l6ZSwgbGFzdF9ub2RlKTsKKworZXhpdDoKKyAgICAvKiBDbGVhbnVwIGZvciBrZXkgKi8KKyAgICBpZiAoa2V5Lm9iaikgeworICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmtleSk7CisgICAgfQorICAgIC8qIENsZWFudXAgZm9yIHNhbHQgKi8KKyAgICBpZiAoc2FsdC5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzYWx0KTsKKyAgICB9CisgICAgLyogQ2xlYW51cCBmb3IgcGVyc29uICovCisgICAgaWYgKHBlcnNvbi5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZXJzb24pOworICAgIH0KKworICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKK1B5RG9jX1NUUlZBUihfYmxha2Uyc19ibGFrZTJzX2NvcHlfX2RvY19fLAorImNvcHkoJHNlbGYsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJSZXR1cm4gYSBjb3B5IG9mIHRoZSBoYXNoIG9iamVjdC4iKTsKKworI2RlZmluZSBfQkxBS0UyU19CTEFLRTJTX0NPUFlfTUVUSE9EREVGICAgIFwKKyAgICB7ImNvcHkiLCAoUHlDRnVuY3Rpb24pX2JsYWtlMnNfYmxha2Uyc19jb3B5LCBNRVRIX05PQVJHUywgX2JsYWtlMnNfYmxha2Uyc19jb3B5X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2Uyc19ibGFrZTJzX2NvcHlfaW1wbChCTEFLRTJzT2JqZWN0ICpzZWxmKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19ibGFrZTJzX2JsYWtlMnNfY29weShCTEFLRTJzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqUHlfVU5VU0VEKGlnbm9yZWQpKQoreworICAgIHJldHVybiBfYmxha2Uyc19ibGFrZTJzX2NvcHlfaW1wbChzZWxmKTsKK30KKworUHlEb2NfU1RSVkFSKF9ibGFrZTJzX2JsYWtlMnNfdXBkYXRlX19kb2NfXywKKyJ1cGRhdGUoJHNlbGYsIG9iaiwgLylcbiIKKyItLVxuIgorIlxuIgorIlVwZGF0ZSB0aGlzIGhhc2ggb2JqZWN0XCdzIHN0YXRlIHdpdGggdGhlIHByb3ZpZGVkIHN0cmluZy4iKTsKKworI2RlZmluZSBfQkxBS0UyU19CTEFLRTJTX1VQREFURV9NRVRIT0RERUYgICAgXAorICAgIHsidXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKV9ibGFrZTJzX2JsYWtlMnNfdXBkYXRlLCBNRVRIX08sIF9ibGFrZTJzX2JsYWtlMnNfdXBkYXRlX19kb2NfX30sCisKK1B5RG9jX1NUUlZBUihfYmxha2Uyc19ibGFrZTJzX2RpZ2VzdF9fZG9jX18sCisiZGlnZXN0KCRzZWxmLCAvKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgYXMgYSBzdHJpbmcgb2YgYmluYXJ5IGRhdGEuIik7CisKKyNkZWZpbmUgX0JMQUtFMlNfQkxBS0UyU19ESUdFU1RfTUVUSE9EREVGICAgIFwKKyAgICB7ImRpZ2VzdCIsIChQeUNGdW5jdGlvbilfYmxha2Uyc19ibGFrZTJzX2RpZ2VzdCwgTUVUSF9OT0FSR1MsIF9ibGFrZTJzX2JsYWtlMnNfZGlnZXN0X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2Uyc19ibGFrZTJzX2RpZ2VzdF9pbXBsKEJMQUtFMnNPYmplY3QgKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMnNfYmxha2Uyc19kaWdlc3QoQkxBS0Uyc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKlB5X1VOVVNFRChpZ25vcmVkKSkKK3sKKyAgICByZXR1cm4gX2JsYWtlMnNfYmxha2Uyc19kaWdlc3RfaW1wbChzZWxmKTsKK30KKworUHlEb2NfU1RSVkFSKF9ibGFrZTJzX2JsYWtlMnNfaGV4ZGlnZXN0X19kb2NfXywKKyJoZXhkaWdlc3QoJHNlbGYsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJSZXR1cm4gdGhlIGRpZ2VzdCB2YWx1ZSBhcyBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMuIik7CisKKyNkZWZpbmUgX0JMQUtFMlNfQkxBS0UyU19IRVhESUdFU1RfTUVUSE9EREVGICAgIFwKKyAgICB7ImhleGRpZ2VzdCIsIChQeUNGdW5jdGlvbilfYmxha2Uyc19ibGFrZTJzX2hleGRpZ2VzdCwgTUVUSF9OT0FSR1MsIF9ibGFrZTJzX2JsYWtlMnNfaGV4ZGlnZXN0X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2Uyc19ibGFrZTJzX2hleGRpZ2VzdF9pbXBsKEJMQUtFMnNPYmplY3QgKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMnNfYmxha2Uyc19oZXhkaWdlc3QoQkxBS0Uyc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKlB5X1VOVVNFRChpZ25vcmVkKSkKK3sKKyAgICByZXR1cm4gX2JsYWtlMnNfYmxha2Uyc19oZXhkaWdlc3RfaW1wbChzZWxmKTsKK30KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MzVlYTc5MDNmOWNjZjc2IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMi1jb25maWcuaCBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMi1jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ1NWIxCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyLWNvbmZpZy5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgICBCTEFLRTIgcmVmZXJlbmNlIHNvdXJjZSBjb2RlIHBhY2thZ2UgLSBvcHRpbWl6ZWQgQyBpbXBsZW1lbnRhdGlvbnMKKworICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisKKyAgIC0gQ0MwIDEuMCBVbml2ZXJzYWwgOiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAKKyAgIC0gT3BlblNTTCBsaWNlbnNlICAgOiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9zb3VyY2UvbGljZW5zZS5odG1sCisgICAtIEFwYWNoZSAyLjAgICAgICAgIDogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJMQUtFMiBoYXNoIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cHM6Ly9ibGFrZTIubmV0LgorKi8KKyNwcmFnbWEgb25jZQorI2lmbmRlZiBfX0JMQUtFMl9DT05GSUdfSF9fCisjZGVmaW5lIF9fQkxBS0UyX0NPTkZJR19IX18KKworLyogVGhlc2UgZG9uJ3Qgd29yayBldmVyeXdoZXJlICovCisjaWYgZGVmaW5lZChfX1NTRTJfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fYW1kNjRfXykKKyNkZWZpbmUgSEFWRV9TU0UyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19TU1NFM19fKQorI2RlZmluZSBIQVZFX1NTU0UzCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19TU0U0XzFfXykKKyNkZWZpbmUgSEFWRV9TU0U0MQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVZYX18pCisjZGVmaW5lIEhBVkVfQVZYCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19YT1BfXykKKyNkZWZpbmUgSEFWRV9YT1AKKyNlbmRpZgorCisKKyNpZmRlZiBIQVZFX0FWWDIKKyNpZm5kZWYgSEFWRV9BVlgKKyNkZWZpbmUgSEFWRV9BVlgKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1hPUAorI2lmbmRlZiBIQVZFX0FWWAorI2RlZmluZSBIQVZFX0FWWAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQVZYCisjaWZuZGVmIEhBVkVfU1NFNDEKKyNkZWZpbmUgSEFWRV9TU0U0MQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1NFNDEKKyNpZm5kZWYgSEFWRV9TU1NFMworI2RlZmluZSBIQVZFX1NTU0UzCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TU1NFMworI2RlZmluZSBIQVZFX1NTRTIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9TU0UyKQorI2Vycm9yICJUaGlzIGNvZGUgcmVxdWlyZXMgYXQgbGVhc3QgU1NFMi4iCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMi1pbXBsLmggYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTItaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTNjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTItaW1wbC5oCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gb3B0aW1pemVkIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgX19CTEFLRTJfSU1QTF9IX18KKyNkZWZpbmUgX19CTEFLRTJfSU1QTF9IX18KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitCTEFLRTJfTE9DQUxfSU5MSU5FKHVpbnQzMl90KSBsb2FkMzIoIGNvbnN0IHZvaWQgKnNyYyApCit7CisjaWYgZGVmaW5lZChOQVRJVkVfTElUVExFX0VORElBTikKKyAgdWludDMyX3QgdzsKKyAgbWVtY3B5KCZ3LCBzcmMsIHNpemVvZiB3KTsKKyAgcmV0dXJuIHc7CisjZWxzZQorICBjb25zdCB1aW50OF90ICpwID0gKCBjb25zdCB1aW50OF90ICogKXNyYzsKKyAgdWludDMyX3QgdyA9ICpwKys7CisgIHcgfD0gKCB1aW50MzJfdCApKCAqcCsrICkgPDwgIDg7CisgIHcgfD0gKCB1aW50MzJfdCApKCAqcCsrICkgPDwgMTY7CisgIHcgfD0gKCB1aW50MzJfdCApKCAqcCsrICkgPDwgMjQ7CisgIHJldHVybiB3OworI2VuZGlmCit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUodWludDY0X3QpIGxvYWQ2NCggY29uc3Qgdm9pZCAqc3JjICkKK3sKKyNpZiBkZWZpbmVkKE5BVElWRV9MSVRUTEVfRU5ESUFOKQorICB1aW50NjRfdCB3OworICBtZW1jcHkoJncsIHNyYywgc2l6ZW9mIHcpOworICByZXR1cm4gdzsKKyNlbHNlCisgIGNvbnN0IHVpbnQ4X3QgKnAgPSAoIGNvbnN0IHVpbnQ4X3QgKiApc3JjOworICB1aW50NjRfdCB3ID0gKnArKzsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCAgODsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCAxNjsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCAyNDsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCAzMjsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCA0MDsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCA0ODsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCA1NjsKKyAgcmV0dXJuIHc7CisjZW5kaWYKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORSh2b2lkKSBzdG9yZTMyKCB2b2lkICpkc3QsIHVpbnQzMl90IHcgKQoreworI2lmIGRlZmluZWQoTkFUSVZFX0xJVFRMRV9FTkRJQU4pCisgIG1lbWNweShkc3QsICZ3LCBzaXplb2Ygdyk7CisjZWxzZQorICB1aW50OF90ICpwID0gKCB1aW50OF90ICogKWRzdDsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsKKyNlbmRpZgorfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKHZvaWQpIHN0b3JlNjQoIHZvaWQgKmRzdCwgdWludDY0X3QgdyApCit7CisjaWYgZGVmaW5lZChOQVRJVkVfTElUVExFX0VORElBTikKKyAgbWVtY3B5KGRzdCwgJncsIHNpemVvZiB3KTsKKyNlbHNlCisgIHVpbnQ4X3QgKnAgPSAoIHVpbnQ4X3QgKiApZHN0OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OworI2VuZGlmCit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUodWludDY0X3QpIGxvYWQ0OCggY29uc3Qgdm9pZCAqc3JjICkKK3sKKyAgY29uc3QgdWludDhfdCAqcCA9ICggY29uc3QgdWludDhfdCAqIClzcmM7CisgIHVpbnQ2NF90IHcgPSAqcCsrOworICB3IHw9ICggdWludDY0X3QgKSggKnArKyApIDw8ICA4OworICB3IHw9ICggdWludDY0X3QgKSggKnArKyApIDw8IDE2OworICB3IHw9ICggdWludDY0X3QgKSggKnArKyApIDw8IDI0OworICB3IHw9ICggdWludDY0X3QgKSggKnArKyApIDw8IDMyOworICB3IHw9ICggdWludDY0X3QgKSggKnArKyApIDw8IDQwOworICByZXR1cm4gdzsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORSh2b2lkKSBzdG9yZTQ4KCB2b2lkICpkc3QsIHVpbnQ2NF90IHcgKQoreworICB1aW50OF90ICpwID0gKCB1aW50OF90ICogKWRzdDsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORSh1aW50MzJfdCkgcm90bDMyKCBjb25zdCB1aW50MzJfdCB3LCBjb25zdCB1bnNpZ25lZCBjICkKK3sKKyAgcmV0dXJuICggdyA8PCBjICkgfCAoIHcgPj4gKCAzMiAtIGMgKSApOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKHVpbnQ2NF90KSByb3RsNjQoIGNvbnN0IHVpbnQ2NF90IHcsIGNvbnN0IHVuc2lnbmVkIGMgKQoreworICByZXR1cm4gKCB3IDw8IGMgKSB8ICggdyA+PiAoIDY0IC0gYyApICk7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUodWludDMyX3QpIHJvdHIzMiggY29uc3QgdWludDMyX3QgdywgY29uc3QgdW5zaWduZWQgYyApCit7CisgIHJldHVybiAoIHcgPj4gYyApIHwgKCB3IDw8ICggMzIgLSBjICkgKTsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORSh1aW50NjRfdCkgcm90cjY0KCBjb25zdCB1aW50NjRfdCB3LCBjb25zdCB1bnNpZ25lZCBjICkKK3sKKyAgcmV0dXJuICggdyA+PiBjICkgfCAoIHcgPDwgKCA2NCAtIGMgKSApOworfQorCisvKiBwcmV2ZW50cyBjb21waWxlciBvcHRpbWl6aW5nIG91dCBtZW1zZXQoKSAqLworQkxBS0UyX0xPQ0FMX0lOTElORSh2b2lkKSBzZWN1cmVfemVyb19tZW1vcnkodm9pZCAqdiwgc2l6ZV90IG4pCit7CisgIHN0YXRpYyB2b2lkICooKmNvbnN0IHZvbGF0aWxlIG1lbXNldF92KSh2b2lkICosIGludCwgc2l6ZV90KSA9ICZtZW1zZXQ7CisgIG1lbXNldF92KHYsIDAsIG4pOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyLmggYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTlmZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgICBCTEFLRTIgcmVmZXJlbmNlIHNvdXJjZSBjb2RlIHBhY2thZ2UgLSByZWZlcmVuY2UgQyBpbXBsZW1lbnRhdGlvbnMKKyAgCisgICBDb3B5cmlnaHQgMjAxMiwgU2FtdWVsIE5ldmVzIDxzbmV2ZXNAZGVpLnVjLnB0Pi4gIFlvdSBtYXkgdXNlIHRoaXMgdW5kZXIgdGhlCisgICB0ZXJtcyBvZiB0aGUgQ0MwLCB0aGUgT3BlblNTTCBMaWNlbmNlLCBvciB0aGUgQXBhY2hlIFB1YmxpYyBMaWNlbnNlIDIuMCwgYXQKKyAgIHlvdXIgb3B0aW9uLiAgVGhlIHRlcm1zIG9mIHRoZXNlIGxpY2Vuc2VzIGNhbiBiZSBmb3VuZCBhdDoKKyAgCisgICAtIENDMCAxLjAgVW5pdmVyc2FsIDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wCisgICAtIE9wZW5TU0wgbGljZW5zZSAgIDogaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorICAgLSBBcGFjaGUgMi4wICAgICAgICA6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJMQUtFMiBoYXNoIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cHM6Ly9ibGFrZTIubmV0LgorKi8KKyNwcmFnbWEgb25jZQorI2lmbmRlZiBfX0JMQUtFMl9IX18KKyNkZWZpbmUgX19CTEFLRTJfSF9fCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmZGVmIEJMQUtFMl9OT19JTkxJTkUKKyNkZWZpbmUgQkxBS0UyX0xPQ0FMX0lOTElORSh0eXBlKSBzdGF0aWMgdHlwZQorI2VuZGlmCisKKyNpZm5kZWYgQkxBS0UyX0xPQ0FMX0lOTElORQorI2RlZmluZSBCTEFLRTJfTE9DQUxfSU5MSU5FKHR5cGUpIHN0YXRpYyBpbmxpbmUgdHlwZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworICBlbnVtIGJsYWtlMnNfY29uc3RhbnQKKyAgeworICAgIEJMQUtFMlNfQkxPQ0tCWVRFUyA9IDY0LAorICAgIEJMQUtFMlNfT1VUQllURVMgICA9IDMyLAorICAgIEJMQUtFMlNfS0VZQllURVMgICA9IDMyLAorICAgIEJMQUtFMlNfU0FMVEJZVEVTICA9IDgsCisgICAgQkxBS0UyU19QRVJTT05BTEJZVEVTID0gOAorICB9OworCisgIGVudW0gYmxha2UyYl9jb25zdGFudAorICB7CisgICAgQkxBS0UyQl9CTE9DS0JZVEVTID0gMTI4LAorICAgIEJMQUtFMkJfT1VUQllURVMgICA9IDY0LAorICAgIEJMQUtFMkJfS0VZQllURVMgICA9IDY0LAorICAgIEJMQUtFMkJfU0FMVEJZVEVTICA9IDE2LAorICAgIEJMQUtFMkJfUEVSU09OQUxCWVRFUyA9IDE2CisgIH07CisKKyAgdHlwZWRlZiBzdHJ1Y3QgX19ibGFrZTJzX3N0YXRlCisgIHsKKyAgICB1aW50MzJfdCBoWzhdOworICAgIHVpbnQzMl90IHRbMl07CisgICAgdWludDMyX3QgZlsyXTsKKyAgICB1aW50OF90ICBidWZbMiAqIEJMQUtFMlNfQkxPQ0tCWVRFU107CisgICAgc2l6ZV90ICAgYnVmbGVuOworICAgIHVpbnQ4X3QgIGxhc3Rfbm9kZTsKKyAgfSBibGFrZTJzX3N0YXRlOworCisgIHR5cGVkZWYgc3RydWN0IF9fYmxha2UyYl9zdGF0ZQorICB7CisgICAgdWludDY0X3QgaFs4XTsKKyAgICB1aW50NjRfdCB0WzJdOworICAgIHVpbnQ2NF90IGZbMl07CisgICAgdWludDhfdCAgYnVmWzIgKiBCTEFLRTJCX0JMT0NLQllURVNdOworICAgIHNpemVfdCAgIGJ1ZmxlbjsKKyAgICB1aW50OF90ICBsYXN0X25vZGU7CisgIH0gYmxha2UyYl9zdGF0ZTsKKworICB0eXBlZGVmIHN0cnVjdCBfX2JsYWtlMnNwX3N0YXRlCisgIHsKKyAgICBibGFrZTJzX3N0YXRlIFNbOF1bMV07CisgICAgYmxha2Uyc19zdGF0ZSBSWzFdOworICAgIHVpbnQ4X3QgYnVmWzggKiBCTEFLRTJTX0JMT0NLQllURVNdOworICAgIHNpemVfdCAgYnVmbGVuOworICB9IGJsYWtlMnNwX3N0YXRlOworCisgIHR5cGVkZWYgc3RydWN0IF9fYmxha2UyYnBfc3RhdGUKKyAgeworICAgIGJsYWtlMmJfc3RhdGUgU1s0XVsxXTsKKyAgICBibGFrZTJiX3N0YXRlIFJbMV07CisgICAgdWludDhfdCBidWZbNCAqIEJMQUtFMkJfQkxPQ0tCWVRFU107CisgICAgc2l6ZV90ICBidWZsZW47CisgIH0gYmxha2UyYnBfc3RhdGU7CisKKworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisgIHR5cGVkZWYgc3RydWN0IF9fYmxha2Uyc19wYXJhbQorICB7CisgICAgdWludDhfdCAgZGlnZXN0X2xlbmd0aDsgLyogMSAqLworICAgIHVpbnQ4X3QgIGtleV9sZW5ndGg7ICAgIC8qIDIgKi8KKyAgICB1aW50OF90ICBmYW5vdXQ7ICAgICAgICAvKiAzICovCisgICAgdWludDhfdCAgZGVwdGg7ICAgICAgICAgLyogNCAqLworICAgIHVpbnQzMl90IGxlYWZfbGVuZ3RoOyAgIC8qIDggKi8KKyAgICB1aW50OF90ICBub2RlX29mZnNldFs2XTsvLyAxNAorICAgIHVpbnQ4X3QgIG5vZGVfZGVwdGg7ICAgIC8qIDE1ICovCisgICAgdWludDhfdCAgaW5uZXJfbGVuZ3RoOyAgLyogMTYgKi8KKyAgICAvKiB1aW50OF90ICByZXNlcnZlZFswXTsgKi8KKyAgICB1aW50OF90ICBzYWx0W0JMQUtFMlNfU0FMVEJZVEVTXTsgLyogMjQgKi8KKyAgICB1aW50OF90ICBwZXJzb25hbFtCTEFLRTJTX1BFUlNPTkFMQllURVNdOyAgLyogMzIgKi8KKyAgfSBibGFrZTJzX3BhcmFtOworCisgIHR5cGVkZWYgc3RydWN0IF9fYmxha2UyYl9wYXJhbQorICB7CisgICAgdWludDhfdCAgZGlnZXN0X2xlbmd0aDsgLyogMSAqLworICAgIHVpbnQ4X3QgIGtleV9sZW5ndGg7ICAgIC8qIDIgKi8KKyAgICB1aW50OF90ICBmYW5vdXQ7ICAgICAgICAvKiAzICovCisgICAgdWludDhfdCAgZGVwdGg7ICAgICAgICAgLyogNCAqLworICAgIHVpbnQzMl90IGxlYWZfbGVuZ3RoOyAgIC8qIDggKi8KKyAgICB1aW50NjRfdCBub2RlX29mZnNldDsgICAvKiAxNiAqLworICAgIHVpbnQ4X3QgIG5vZGVfZGVwdGg7ICAgIC8qIDE3ICovCisgICAgdWludDhfdCAgaW5uZXJfbGVuZ3RoOyAgLyogMTggKi8KKyAgICB1aW50OF90ICByZXNlcnZlZFsxNF07ICAvKiAzMiAqLworICAgIHVpbnQ4X3QgIHNhbHRbQkxBS0UyQl9TQUxUQllURVNdOyAvKiA0OCAqLworICAgIHVpbnQ4X3QgIHBlcnNvbmFsW0JMQUtFMkJfUEVSU09OQUxCWVRFU107ICAvKiA2NCAqLworICB9IGJsYWtlMmJfcGFyYW07CisjcHJhZ21hIHBhY2socG9wKQorCisgIC8qIFN0cmVhbWluZyBBUEkgKi8KKyAgaW50IGJsYWtlMnNfaW5pdCggYmxha2Uyc19zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4gKTsKKyAgaW50IGJsYWtlMnNfaW5pdF9rZXkoIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qga2V5bGVuICk7CisgIGludCBibGFrZTJzX2luaXRfcGFyYW0oIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IGJsYWtlMnNfcGFyYW0gKlAgKTsKKyAgaW50IGJsYWtlMnNfdXBkYXRlKCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCB1aW50OF90ICppbiwgdWludDY0X3QgaW5sZW4gKTsKKyAgaW50IGJsYWtlMnNfZmluYWwoIGJsYWtlMnNfc3RhdGUgKlMsIHVpbnQ4X3QgKm91dCwgdWludDhfdCBvdXRsZW4gKTsKKworICBpbnQgYmxha2UyYl9pbml0KCBibGFrZTJiX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiApOworICBpbnQgYmxha2UyYl9pbml0X2tleSggYmxha2UyYl9zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4sIGNvbnN0IHZvaWQgKmtleSwgY29uc3QgdWludDhfdCBrZXlsZW4gKTsKKyAgaW50IGJsYWtlMmJfaW5pdF9wYXJhbSggYmxha2UyYl9zdGF0ZSAqUywgY29uc3QgYmxha2UyYl9wYXJhbSAqUCApOworICBpbnQgYmxha2UyYl91cGRhdGUoIGJsYWtlMmJfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50NjRfdCBpbmxlbiApOworICBpbnQgYmxha2UyYl9maW5hbCggYmxha2UyYl9zdGF0ZSAqUywgdWludDhfdCAqb3V0LCB1aW50OF90IG91dGxlbiApOworCisgIGludCBibGFrZTJzcF9pbml0KCBibGFrZTJzcF9zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4gKTsKKyAgaW50IGJsYWtlMnNwX2luaXRfa2V5KCBibGFrZTJzcF9zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4sIGNvbnN0IHZvaWQgKmtleSwgY29uc3QgdWludDhfdCBrZXlsZW4gKTsKKyAgaW50IGJsYWtlMnNwX3VwZGF0ZSggYmxha2Uyc3Bfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50NjRfdCBpbmxlbiApOworICBpbnQgYmxha2Uyc3BfZmluYWwoIGJsYWtlMnNwX3N0YXRlICpTLCB1aW50OF90ICpvdXQsIHVpbnQ4X3Qgb3V0bGVuICk7CisKKyAgaW50IGJsYWtlMmJwX2luaXQoIGJsYWtlMmJwX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiApOworICBpbnQgYmxha2UyYnBfaW5pdF9rZXkoIGJsYWtlMmJwX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IGtleWxlbiApOworICBpbnQgYmxha2UyYnBfdXBkYXRlKCBibGFrZTJicF9zdGF0ZSAqUywgY29uc3QgdWludDhfdCAqaW4sIHVpbnQ2NF90IGlubGVuICk7CisgIGludCBibGFrZTJicF9maW5hbCggYmxha2UyYnBfc3RhdGUgKlMsIHVpbnQ4X3QgKm91dCwgdWludDhfdCBvdXRsZW4gKTsKKworICAvKiBTaW1wbGUgQVBJICovCisgIGludCBibGFrZTJzKCB1aW50OF90ICpvdXQsIGNvbnN0IHZvaWQgKmluLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB1aW50NjRfdCBpbmxlbiwgdWludDhfdCBrZXlsZW4gKTsKKyAgaW50IGJsYWtlMmIoIHVpbnQ4X3QgKm91dCwgY29uc3Qgdm9pZCAqaW4sIGNvbnN0IHZvaWQgKmtleSwgY29uc3QgdWludDhfdCBvdXRsZW4sIGNvbnN0IHVpbnQ2NF90IGlubGVuLCB1aW50OF90IGtleWxlbiApOworCisgIGludCBibGFrZTJzcCggdWludDhfdCAqb3V0LCBjb25zdCB2b2lkICppbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3QgdWludDY0X3QgaW5sZW4sIHVpbnQ4X3Qga2V5bGVuICk7CisgIGludCBibGFrZTJicCggdWludDhfdCAqb3V0LCBjb25zdCB2b2lkICppbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3QgdWludDY0X3QgaW5sZW4sIHVpbnQ4X3Qga2V5bGVuICk7CisKKyAgc3RhdGljIGlubGluZSBpbnQgYmxha2UyKCB1aW50OF90ICpvdXQsIGNvbnN0IHZvaWQgKmluLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB1aW50NjRfdCBpbmxlbiwgdWludDhfdCBrZXlsZW4gKQorICB7CisgICAgcmV0dXJuIGJsYWtlMmIoIG91dCwgaW4sIGtleSwgb3V0bGVuLCBpbmxlbiwga2V5bGVuICk7CisgIH0KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMmItbG9hZC1zc2UyLmggYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLWxvYWQtc3NlMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDRhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLWxvYWQtc3NlMi5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgICBCTEFLRTIgcmVmZXJlbmNlIHNvdXJjZSBjb2RlIHBhY2thZ2UgLSBvcHRpbWl6ZWQgQyBpbXBsZW1lbnRhdGlvbnMKKyAgCisgICBDb3B5cmlnaHQgMjAxMiwgU2FtdWVsIE5ldmVzIDxzbmV2ZXNAZGVpLnVjLnB0Pi4gIFlvdSBtYXkgdXNlIHRoaXMgdW5kZXIgdGhlCisgICB0ZXJtcyBvZiB0aGUgQ0MwLCB0aGUgT3BlblNTTCBMaWNlbmNlLCBvciB0aGUgQXBhY2hlIFB1YmxpYyBMaWNlbnNlIDIuMCwgYXQKKyAgIHlvdXIgb3B0aW9uLiAgVGhlIHRlcm1zIG9mIHRoZXNlIGxpY2Vuc2VzIGNhbiBiZSBmb3VuZCBhdDoKKyAgCisgICAtIENDMCAxLjAgVW5pdmVyc2FsIDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wCisgICAtIE9wZW5TU0wgbGljZW5zZSAgIDogaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorICAgLSBBcGFjaGUgMi4wICAgICAgICA6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJMQUtFMiBoYXNoIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cHM6Ly9ibGFrZTIubmV0LgorKi8KKyNwcmFnbWEgb25jZQorI2lmbmRlZiBfX0JMQUtFMkJfTE9BRF9TU0UyX0hfXworI2RlZmluZSBfX0JMQUtFMkJfTE9BRF9TU0UyX0hfXworCisjZGVmaW5lIExPQURfTVNHXzBfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTIsIG0wKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNiwgbTQpCisjZGVmaW5lIExPQURfTVNHXzBfMihiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTMsIG0xKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNywgbTUpCisjZGVmaW5lIExPQURfTVNHXzBfMyhiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEwLCBtOCk7IGIxID0gX21tX3NldF9lcGk2NHgobTE0LCBtMTIpCisjZGVmaW5lIExPQURfTVNHXzBfNChiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTExLCBtOSk7IGIxID0gX21tX3NldF9lcGk2NHgobTE1LCBtMTMpCisjZGVmaW5lIExPQURfTVNHXzFfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTQsIG0xNCk7IGIxID0gX21tX3NldF9lcGk2NHgobTEzLCBtOSkKKyNkZWZpbmUgTE9BRF9NU0dfMV8yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtOCwgbTEwKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNiwgbTE1KQorI2RlZmluZSBMT0FEX01TR18xXzMoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0wLCBtMSk7IGIxID0gX21tX3NldF9lcGk2NHgobTUsIG0xMSkKKyNkZWZpbmUgTE9BRF9NU0dfMV80KGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMiwgbTEyKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMywgbTcpCisjZGVmaW5lIExPQURfTVNHXzJfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEyLCBtMTEpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xNSwgbTUpCisjZGVmaW5lIExPQURfTVNHXzJfMihiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTAsIG04KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMTMsIG0yKQorI2RlZmluZSBMT0FEX01TR18yXzMoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0zLCBtMTApOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG05LCBtNykKKyNkZWZpbmUgTE9BRF9NU0dfMl80KGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtNiwgbTE0KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNCwgbTEpCisjZGVmaW5lIExPQURfTVNHXzNfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTMsIG03KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMTEsIG0xMykKKyNkZWZpbmUgTE9BRF9NU0dfM18yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMSwgbTkpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xNCwgbTEyKQorI2RlZmluZSBMT0FEX01TR18zXzMoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG01LCBtMik7IGIxID0gX21tX3NldF9lcGk2NHgobTE1LCBtNCkKKyNkZWZpbmUgTE9BRF9NU0dfM180KGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMTAsIG02KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtOCwgbTApCisjZGVmaW5lIExPQURfTVNHXzRfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTUsIG05KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMTAsIG0yKQorI2RlZmluZSBMT0FEX01TR180XzIoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG03LCBtMCk7IGIxID0gX21tX3NldF9lcGk2NHgobTE1LCBtNCkKKyNkZWZpbmUgTE9BRF9NU0dfNF8zKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMTEsIG0xNCk7IGIxID0gX21tX3NldF9lcGk2NHgobTMsIG02KQorI2RlZmluZSBMT0FEX01TR180XzQoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0xMiwgbTEpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xMywgbTgpCisjZGVmaW5lIExPQURfTVNHXzVfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTYsIG0yKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtOCwgbTApCisjZGVmaW5lIExPQURfTVNHXzVfMihiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEwLCBtMTIpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0zLCBtMTEpCisjZGVmaW5lIExPQURfTVNHXzVfMyhiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTcsIG00KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMSwgbTE1KQorI2RlZmluZSBMT0FEX01TR181XzQoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG01LCBtMTMpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG05LCBtMTQpCisjZGVmaW5lIExPQURfTVNHXzZfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEsIG0xMik7IGIxID0gX21tX3NldF9lcGk2NHgobTQsIG0xNCkKKyNkZWZpbmUgTE9BRF9NU0dfNl8yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMTUsIG01KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMTAsIG0xMykKKyNkZWZpbmUgTE9BRF9NU0dfNl8zKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtNiwgbTApOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG04LCBtOSkKKyNkZWZpbmUgTE9BRF9NU0dfNl80KGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMywgbTcpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xMSwgbTIpCisjZGVmaW5lIExPQURfTVNHXzdfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTcsIG0xMyk7IGIxID0gX21tX3NldF9lcGk2NHgobTMsIG0xMikKKyNkZWZpbmUgTE9BRF9NU0dfN18yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMTQsIG0xMSk7IGIxID0gX21tX3NldF9lcGk2NHgobTksIG0xKQorI2RlZmluZSBMT0FEX01TR183XzMoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0xNSwgbTUpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0yLCBtOCkKKyNkZWZpbmUgTE9BRF9NU0dfN180KGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtNCwgbTApOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xMCwgbTYpCisjZGVmaW5lIExPQURfTVNHXzhfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTE0LCBtNik7IGIxID0gX21tX3NldF9lcGk2NHgobTAsIG0xMSkKKyNkZWZpbmUgTE9BRF9NU0dfOF8yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtOSwgbTE1KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtOCwgbTMpCisjZGVmaW5lIExPQURfTVNHXzhfMyhiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEzLCBtMTIpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xMCwgbTEpCisjZGVmaW5lIExPQURfTVNHXzhfNChiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTcsIG0yKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNSwgbTQpCisjZGVmaW5lIExPQURfTVNHXzlfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTgsIG0xMCk7IGIxID0gX21tX3NldF9lcGk2NHgobTEsIG03KQorI2RlZmluZSBMT0FEX01TR185XzIoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG00LCBtMik7IGIxID0gX21tX3NldF9lcGk2NHgobTUsIG02KQorI2RlZmluZSBMT0FEX01TR185XzMoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG05LCBtMTUpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xMywgbTMpCisjZGVmaW5lIExPQURfTVNHXzlfNChiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTE0LCBtMTEpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0wLCBtMTIpCisjZGVmaW5lIExPQURfTVNHXzEwXzEoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0yLCBtMCk7IGIxID0gX21tX3NldF9lcGk2NHgobTYsIG00KQorI2RlZmluZSBMT0FEX01TR18xMF8yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMywgbTEpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG03LCBtNSkKKyNkZWZpbmUgTE9BRF9NU0dfMTBfMyhiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEwLCBtOCk7IGIxID0gX21tX3NldF9lcGk2NHgobTE0LCBtMTIpCisjZGVmaW5lIExPQURfTVNHXzEwXzQoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0xMSwgbTkpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xNSwgbTEzKQorI2RlZmluZSBMT0FEX01TR18xMV8xKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtNCwgbTE0KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMTMsIG05KQorI2RlZmluZSBMT0FEX01TR18xMV8yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtOCwgbTEwKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNiwgbTE1KQorI2RlZmluZSBMT0FEX01TR18xMV8zKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMCwgbTEpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG01LCBtMTEpCisjZGVmaW5lIExPQURfTVNHXzExXzQoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0yLCBtMTIpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0zLCBtNykKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyYi1sb2FkLXNzZTQxLmggYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLWxvYWQtc3NlNDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmExMzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyYi1sb2FkLXNzZTQxLmgKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgICBCTEFLRTIgcmVmZXJlbmNlIHNvdXJjZSBjb2RlIHBhY2thZ2UgLSBvcHRpbWl6ZWQgQyBpbXBsZW1lbnRhdGlvbnMKKyAgCisgICBDb3B5cmlnaHQgMjAxMiwgU2FtdWVsIE5ldmVzIDxzbmV2ZXNAZGVpLnVjLnB0Pi4gIFlvdSBtYXkgdXNlIHRoaXMgdW5kZXIgdGhlCisgICB0ZXJtcyBvZiB0aGUgQ0MwLCB0aGUgT3BlblNTTCBMaWNlbmNlLCBvciB0aGUgQXBhY2hlIFB1YmxpYyBMaWNlbnNlIDIuMCwgYXQKKyAgIHlvdXIgb3B0aW9uLiAgVGhlIHRlcm1zIG9mIHRoZXNlIGxpY2Vuc2VzIGNhbiBiZSBmb3VuZCBhdDoKKyAgCisgICAtIENDMCAxLjAgVW5pdmVyc2FsIDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wCisgICAtIE9wZW5TU0wgbGljZW5zZSAgIDogaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorICAgLSBBcGFjaGUgMi4wICAgICAgICA6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJMQUtFMiBoYXNoIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cHM6Ly9ibGFrZTIubmV0LgorKi8KKyNwcmFnbWEgb25jZQorI2lmbmRlZiBfX0JMQUtFMkJfTE9BRF9TU0U0MV9IX18KKyNkZWZpbmUgX19CTEFLRTJCX0xPQURfU1NFNDFfSF9fCisKKyNkZWZpbmUgTE9BRF9NU0dfMF8xKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtMCwgbTEpOyBcCitiMSA9IF9tbV91bnBhY2tsb19lcGk2NChtMiwgbTMpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18wXzIoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2hpX2VwaTY0KG0wLCBtMSk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG0yLCBtMyk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzBfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTQsIG01KTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTYsIG03KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMF80KGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2toaV9lcGk2NChtNCwgbTUpOyBcCitiMSA9IF9tbV91bnBhY2toaV9lcGk2NChtNiwgbTcpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18xXzEoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2xvX2VwaTY0KG03LCBtMik7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG00LCBtNik7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzFfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTUsIG00KTsgXAorYjEgPSBfbW1fYWxpZ25yX2VwaTgobTMsIG03LCA4KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMV8zKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV9zaHVmZmxlX2VwaTMyKG0wLCBfTU1fU0hVRkZMRSgxLDAsMywyKSk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG01LCBtMik7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzFfNChiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTYsIG0xKTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTMsIG0xKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMl8xKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV9hbGlnbnJfZXBpOChtNiwgbTUsIDgpOyBcCitiMSA9IF9tbV91bnBhY2toaV9lcGk2NChtMiwgbTcpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18yXzIoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2xvX2VwaTY0KG00LCBtMCk7IFwKK2IxID0gX21tX2JsZW5kX2VwaTE2KG0xLCBtNiwgMHhGMCk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzJfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fYmxlbmRfZXBpMTYobTUsIG0xLCAweEYwKTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTMsIG00KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMl80KGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtNywgbTMpOyBcCitiMSA9IF9tbV9hbGlnbnJfZXBpOChtMiwgbTAsIDgpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18zXzEoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2hpX2VwaTY0KG0zLCBtMSk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG02LCBtNSk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzNfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTQsIG0wKTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTYsIG03KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfM18zKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV9ibGVuZF9lcGkxNihtMSwgbTIsIDB4RjApOyBcCitiMSA9IF9tbV9ibGVuZF9lcGkxNihtMiwgbTcsIDB4RjApOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18zXzQoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2xvX2VwaTY0KG0zLCBtNSk7IFwKK2IxID0gX21tX3VucGFja2xvX2VwaTY0KG0wLCBtNCk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzRfMShiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTQsIG0yKTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTEsIG01KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfNF8yKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV9ibGVuZF9lcGkxNihtMCwgbTMsIDB4RjApOyBcCitiMSA9IF9tbV9ibGVuZF9lcGkxNihtMiwgbTcsIDB4RjApOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR180XzMoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX2JsZW5kX2VwaTE2KG03LCBtNSwgMHhGMCk7IFwKK2IxID0gX21tX2JsZW5kX2VwaTE2KG0zLCBtMSwgMHhGMCk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzRfNChiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fYWxpZ25yX2VwaTgobTYsIG0wLCA4KTsgXAorYjEgPSBfbW1fYmxlbmRfZXBpMTYobTQsIG02LCAweEYwKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfNV8xKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtMSwgbTMpOyBcCitiMSA9IF9tbV91bnBhY2tsb19lcGk2NChtMCwgbTQpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR181XzIoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2xvX2VwaTY0KG02LCBtNSk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG01LCBtMSk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzVfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fYmxlbmRfZXBpMTYobTIsIG0zLCAweEYwKTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTcsIG0wKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfNV80KGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2toaV9lcGk2NChtNiwgbTIpOyBcCitiMSA9IF9tbV9ibGVuZF9lcGkxNihtNywgbTQsIDB4RjApOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR182XzEoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX2JsZW5kX2VwaTE2KG02LCBtMCwgMHhGMCk7IFwKK2IxID0gX21tX3VucGFja2xvX2VwaTY0KG03LCBtMik7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzZfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTIsIG03KTsgXAorYjEgPSBfbW1fYWxpZ25yX2VwaTgobTUsIG02LCA4KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfNl8zKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtMCwgbTMpOyBcCitiMSA9IF9tbV9zaHVmZmxlX2VwaTMyKG00LCBfTU1fU0hVRkZMRSgxLDAsMywyKSk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzZfNChiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTMsIG0xKTsgXAorYjEgPSBfbW1fYmxlbmRfZXBpMTYobTEsIG01LCAweEYwKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfN18xKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2toaV9lcGk2NChtNiwgbTMpOyBcCitiMSA9IF9tbV9ibGVuZF9lcGkxNihtNiwgbTEsIDB4RjApOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR183XzIoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX2FsaWducl9lcGk4KG03LCBtNSwgOCk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG0wLCBtNCk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzdfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTIsIG03KTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTQsIG0xKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfN180KGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtMCwgbTIpOyBcCitiMSA9IF9tbV91bnBhY2tsb19lcGk2NChtMywgbTUpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR184XzEoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2xvX2VwaTY0KG0zLCBtNyk7IFwKK2IxID0gX21tX2FsaWducl9lcGk4KG0wLCBtNSwgOCk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzhfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTcsIG00KTsgXAorYjEgPSBfbW1fYWxpZ25yX2VwaTgobTQsIG0xLCA4KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfOF8zKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IG02OyBcCitiMSA9IF9tbV9hbGlnbnJfZXBpOChtNSwgbTAsIDgpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR184XzQoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX2JsZW5kX2VwaTE2KG0xLCBtMywgMHhGMCk7IFwKK2IxID0gbTI7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzlfMShiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTUsIG00KTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTMsIG0wKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfOV8yKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtMSwgbTIpOyBcCitiMSA9IF9tbV9ibGVuZF9lcGkxNihtMywgbTIsIDB4RjApOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR185XzMoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2hpX2VwaTY0KG03LCBtNCk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG0xLCBtNik7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzlfNChiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fYWxpZ25yX2VwaTgobTcsIG01LCA4KTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTYsIG0wKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTBfMShiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTAsIG0xKTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTIsIG0zKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTBfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTAsIG0xKTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTIsIG0zKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTBfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTQsIG01KTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTYsIG03KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTBfNChiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTQsIG01KTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTYsIG03KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTFfMShiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTcsIG0yKTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTQsIG02KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTFfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTUsIG00KTsgXAorYjEgPSBfbW1fYWxpZ25yX2VwaTgobTMsIG03LCA4KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTFfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fc2h1ZmZsZV9lcGkzMihtMCwgX01NX1NIVUZGTEUoMSwwLDMsMikpOyBcCitiMSA9IF9tbV91bnBhY2toaV9lcGk2NChtNSwgbTIpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18xMV80KGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtNiwgbTEpOyBcCitiMSA9IF9tbV91bnBhY2toaV9lcGk2NChtMywgbTEpOyBcCit9IHdoaWxlKDApCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMmItcmVmLmMgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLXJlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzc1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLXJlZi5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gcmVmZXJlbmNlIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYmxha2UyLmgiCisjaW5jbHVkZSAiYmxha2UyLWltcGwuaCIKKworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGJsYWtlMmJfSVZbOF0gPQoreworICAweDZhMDllNjY3ZjNiY2M5MDhVTEwsIDB4YmI2N2FlODU4NGNhYTczYlVMTCwKKyAgMHgzYzZlZjM3MmZlOTRmODJiVUxMLCAweGE1NGZmNTNhNWYxZDM2ZjFVTEwsCisgIDB4NTEwZTUyN2ZhZGU2ODJkMVVMTCwgMHg5YjA1Njg4YzJiM2U2YzFmVUxMLAorICAweDFmODNkOWFiZmI0MWJkNmJVTEwsIDB4NWJlMGNkMTkxMzdlMjE3OVVMTAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmxha2UyYl9zaWdtYVsxMl1bMTZdID0KK3sKKyAgeyAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSB9ICwKKyAgeyAxNCwgMTAsICA0LCAgOCwgIDksIDE1LCAxMywgIDYsICAxLCAxMiwgIDAsICAyLCAxMSwgIDcsICA1LCAgMyB9ICwKKyAgeyAxMSwgIDgsIDEyLCAgMCwgIDUsICAyLCAxNSwgMTMsIDEwLCAxNCwgIDMsICA2LCAgNywgIDEsICA5LCAgNCB9ICwKKyAgeyAgNywgIDksICAzLCAgMSwgMTMsIDEyLCAxMSwgMTQsICAyLCAgNiwgIDUsIDEwLCAgNCwgIDAsIDE1LCAgOCB9ICwKKyAgeyAgOSwgIDAsICA1LCAgNywgIDIsICA0LCAxMCwgMTUsIDE0LCAgMSwgMTEsIDEyLCAgNiwgIDgsICAzLCAxMyB9ICwKKyAgeyAgMiwgMTIsICA2LCAxMCwgIDAsIDExLCAgOCwgIDMsICA0LCAxMywgIDcsICA1LCAxNSwgMTQsICAxLCAgOSB9ICwKKyAgeyAxMiwgIDUsICAxLCAxNSwgMTQsIDEzLCAgNCwgMTAsICAwLCAgNywgIDYsICAzLCAgOSwgIDIsICA4LCAxMSB9ICwKKyAgeyAxMywgMTEsICA3LCAxNCwgMTIsICAxLCAgMywgIDksICA1LCAgMCwgMTUsICA0LCAgOCwgIDYsICAyLCAxMCB9ICwKKyAgeyAgNiwgMTUsIDE0LCAgOSwgMTEsICAzLCAgMCwgIDgsIDEyLCAgMiwgMTMsICA3LCAgMSwgIDQsIDEwLCAgNSB9ICwKKyAgeyAxMCwgIDIsICA4LCAgNCwgIDcsICA2LCAgMSwgIDUsIDE1LCAxMSwgIDksIDE0LCAgMywgMTIsIDEzICwgMCB9ICwKKyAgeyAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSB9ICwKKyAgeyAxNCwgMTAsICA0LCAgOCwgIDksIDE1LCAxMywgIDYsICAxLCAxMiwgIDAsICAyLCAxMSwgIDcsICA1LCAgMyB9Cit9OworCisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3NldF9sYXN0bm9kZSggYmxha2UyYl9zdGF0ZSAqUyApCit7CisgIFMtPmZbMV0gPSAtMTsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX2NsZWFyX2xhc3Rub2RlKCBibGFrZTJiX3N0YXRlICpTICkKK3sKKyAgUy0+ZlsxXSA9IDA7CisgIHJldHVybiAwOworfQorCisvKiBTb21lIGhlbHBlciBmdW5jdGlvbnMsIG5vdCBuZWNlc3NhcmlseSB1c2VmdWwgKi8KK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX2lzX2xhc3RibG9jayggY29uc3QgYmxha2UyYl9zdGF0ZSAqUyApCit7CisgIHJldHVybiBTLT5mWzBdICE9IDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3NldF9sYXN0YmxvY2soIGJsYWtlMmJfc3RhdGUgKlMgKQoreworICBpZiggUy0+bGFzdF9ub2RlICkgYmxha2UyYl9zZXRfbGFzdG5vZGUoIFMgKTsKKworICBTLT5mWzBdID0gLTE7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9jbGVhcl9sYXN0YmxvY2soIGJsYWtlMmJfc3RhdGUgKlMgKQoreworICBpZiggUy0+bGFzdF9ub2RlICkgYmxha2UyYl9jbGVhcl9sYXN0bm9kZSggUyApOworCisgIFMtPmZbMF0gPSAwOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfaW5jcmVtZW50X2NvdW50ZXIoIGJsYWtlMmJfc3RhdGUgKlMsIGNvbnN0IHVpbnQ2NF90IGluYyApCit7CisgIFMtPnRbMF0gKz0gaW5jOworICBTLT50WzFdICs9ICggUy0+dFswXSA8IGluYyApOworICByZXR1cm4gMDsKK30KKworCisKKy8qIFBhcmFtZXRlci1yZWxhdGVkIGZ1bmN0aW9ucyAqLworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X2RpZ2VzdF9sZW5ndGgoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgZGlnZXN0X2xlbmd0aCApCit7CisgIFAtPmRpZ2VzdF9sZW5ndGggPSBkaWdlc3RfbGVuZ3RoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X2Zhbm91dCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDhfdCBmYW5vdXQgKQoreworICBQLT5mYW5vdXQgPSBmYW5vdXQ7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfbWF4X2RlcHRoKCBibGFrZTJiX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGRlcHRoICkKK3sKKyAgUC0+ZGVwdGggPSBkZXB0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3BhcmFtX3NldF9sZWFmX2xlbmd0aCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDMyX3QgbGVhZl9sZW5ndGggKQoreworICBzdG9yZTMyKCAmUC0+bGVhZl9sZW5ndGgsIGxlYWZfbGVuZ3RoICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfbm9kZV9vZmZzZXQoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ2NF90IG5vZGVfb2Zmc2V0ICkKK3sKKyAgc3RvcmU2NCggJlAtPm5vZGVfb2Zmc2V0LCBub2RlX29mZnNldCApOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X25vZGVfZGVwdGgoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3Qgbm9kZV9kZXB0aCApCit7CisgIFAtPm5vZGVfZGVwdGggPSBub2RlX2RlcHRoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X2lubmVyX2xlbmd0aCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDhfdCBpbm5lcl9sZW5ndGggKQoreworICBQLT5pbm5lcl9sZW5ndGggPSBpbm5lcl9sZW5ndGg7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfc2FsdCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDhfdCBzYWx0W0JMQUtFMkJfU0FMVEJZVEVTXSApCit7CisgIG1lbWNweSggUC0+c2FsdCwgc2FsdCwgQkxBS0UyQl9TQUxUQllURVMgKTsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3BhcmFtX3NldF9wZXJzb25hbCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDhfdCBwZXJzb25hbFtCTEFLRTJCX1BFUlNPTkFMQllURVNdICkKK3sKKyAgbWVtY3B5KCBQLT5wZXJzb25hbCwgcGVyc29uYWwsIEJMQUtFMkJfUEVSU09OQUxCWVRFUyApOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfaW5pdDAoIGJsYWtlMmJfc3RhdGUgKlMgKQoreworICBpbnQgaTsKKyAgbWVtc2V0KCBTLCAwLCBzaXplb2YoIGJsYWtlMmJfc3RhdGUgKSApOworCisgIGZvciggaSA9IDA7IGkgPCA4OyArK2kgKSBTLT5oW2ldID0gYmxha2UyYl9JVltpXTsKKworICByZXR1cm4gMDsKK30KKworLyogaW5pdCB4b3JzIElWIHdpdGggaW5wdXQgcGFyYW1ldGVyIGJsb2NrICovCitpbnQgYmxha2UyYl9pbml0X3BhcmFtKCBibGFrZTJiX3N0YXRlICpTLCBjb25zdCBibGFrZTJiX3BhcmFtICpQICkKK3sKKyAgY29uc3QgdWludDhfdCAqcCA9ICggY29uc3QgdWludDhfdCAqICkoIFAgKTsKKyAgc2l6ZV90IGk7CisKKyAgYmxha2UyYl9pbml0MCggUyApOworCisgIC8qIElWIFhPUiBQYXJhbUJsb2NrICovCisgIGZvciggaSA9IDA7IGkgPCA4OyArK2kgKQorICAgIFMtPmhbaV0gXj0gbG9hZDY0KCBwICsgc2l6ZW9mKCBTLT5oW2ldICkgKiBpICk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworCitpbnQgYmxha2UyYl9pbml0KCBibGFrZTJiX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiApCit7CisgIGJsYWtlMmJfcGFyYW0gUFsxXTsKKworICBpZiAoICggIW91dGxlbiApIHx8ICggb3V0bGVuID4gQkxBS0UyQl9PVVRCWVRFUyApICkgcmV0dXJuIC0xOworCisgIFAtPmRpZ2VzdF9sZW5ndGggPSBvdXRsZW47CisgIFAtPmtleV9sZW5ndGggICAgPSAwOworICBQLT5mYW5vdXQgICAgICAgID0gMTsKKyAgUC0+ZGVwdGggICAgICAgICA9IDE7CisgIHN0b3JlMzIoICZQLT5sZWFmX2xlbmd0aCwgMCApOworICBzdG9yZTY0KCAmUC0+bm9kZV9vZmZzZXQsIDAgKTsKKyAgUC0+bm9kZV9kZXB0aCAgICA9IDA7CisgIFAtPmlubmVyX2xlbmd0aCAgPSAwOworICBtZW1zZXQoIFAtPnJlc2VydmVkLCAwLCBzaXplb2YoIFAtPnJlc2VydmVkICkgKTsKKyAgbWVtc2V0KCBQLT5zYWx0LCAgICAgMCwgc2l6ZW9mKCBQLT5zYWx0ICkgKTsKKyAgbWVtc2V0KCBQLT5wZXJzb25hbCwgMCwgc2l6ZW9mKCBQLT5wZXJzb25hbCApICk7CisgIHJldHVybiBibGFrZTJiX2luaXRfcGFyYW0oIFMsIFAgKTsKK30KKworCitpbnQgYmxha2UyYl9pbml0X2tleSggYmxha2UyYl9zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4sIGNvbnN0IHZvaWQgKmtleSwgY29uc3QgdWludDhfdCBrZXlsZW4gKQoreworICBibGFrZTJiX3BhcmFtIFBbMV07CisKKyAgaWYgKCAoICFvdXRsZW4gKSB8fCAoIG91dGxlbiA+IEJMQUtFMkJfT1VUQllURVMgKSApIHJldHVybiAtMTsKKworICBpZiAoICFrZXkgfHwgIWtleWxlbiB8fCBrZXlsZW4gPiBCTEFLRTJCX0tFWUJZVEVTICkgcmV0dXJuIC0xOworCisgIFAtPmRpZ2VzdF9sZW5ndGggPSBvdXRsZW47CisgIFAtPmtleV9sZW5ndGggICAgPSBrZXlsZW47CisgIFAtPmZhbm91dCAgICAgICAgPSAxOworICBQLT5kZXB0aCAgICAgICAgID0gMTsKKyAgc3RvcmUzMiggJlAtPmxlYWZfbGVuZ3RoLCAwICk7CisgIHN0b3JlNjQoICZQLT5ub2RlX29mZnNldCwgMCApOworICBQLT5ub2RlX2RlcHRoICAgID0gMDsKKyAgUC0+aW5uZXJfbGVuZ3RoICA9IDA7CisgIG1lbXNldCggUC0+cmVzZXJ2ZWQsIDAsIHNpemVvZiggUC0+cmVzZXJ2ZWQgKSApOworICBtZW1zZXQoIFAtPnNhbHQsICAgICAwLCBzaXplb2YoIFAtPnNhbHQgKSApOworICBtZW1zZXQoIFAtPnBlcnNvbmFsLCAwLCBzaXplb2YoIFAtPnBlcnNvbmFsICkgKTsKKworICBpZiggYmxha2UyYl9pbml0X3BhcmFtKCBTLCBQICkgPCAwICkgcmV0dXJuIC0xOworCisgIHsKKyAgICB1aW50OF90IGJsb2NrW0JMQUtFMkJfQkxPQ0tCWVRFU107CisgICAgbWVtc2V0KCBibG9jaywgMCwgQkxBS0UyQl9CTE9DS0JZVEVTICk7CisgICAgbWVtY3B5KCBibG9jaywga2V5LCBrZXlsZW4gKTsKKyAgICBibGFrZTJiX3VwZGF0ZSggUywgYmxvY2ssIEJMQUtFMkJfQkxPQ0tCWVRFUyApOworICAgIHNlY3VyZV96ZXJvX21lbW9yeSggYmxvY2ssIEJMQUtFMkJfQkxPQ0tCWVRFUyApOyAvKiBCdXJuIHRoZSBrZXkgZnJvbSBzdGFjayAqLworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJsYWtlMmJfY29tcHJlc3MoIGJsYWtlMmJfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3QgYmxvY2tbQkxBS0UyQl9CTE9DS0JZVEVTXSApCit7CisgIHVpbnQ2NF90IG1bMTZdOworICB1aW50NjRfdCB2WzE2XTsKKyAgaW50IGk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDE2OyArK2kgKQorICAgIG1baV0gPSBsb2FkNjQoIGJsb2NrICsgaSAqIHNpemVvZiggbVtpXSApICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisgICAgdltpXSA9IFMtPmhbaV07CisKKyAgdlsgOF0gPSBibGFrZTJiX0lWWzBdOworICB2WyA5XSA9IGJsYWtlMmJfSVZbMV07CisgIHZbMTBdID0gYmxha2UyYl9JVlsyXTsKKyAgdlsxMV0gPSBibGFrZTJiX0lWWzNdOworICB2WzEyXSA9IFMtPnRbMF0gXiBibGFrZTJiX0lWWzRdOworICB2WzEzXSA9IFMtPnRbMV0gXiBibGFrZTJiX0lWWzVdOworICB2WzE0XSA9IFMtPmZbMF0gXiBibGFrZTJiX0lWWzZdOworICB2WzE1XSA9IFMtPmZbMV0gXiBibGFrZTJiX0lWWzddOworI2RlZmluZSBHKHIsaSxhLGIsYyxkKSBcCisgIGRvIHsgXAorICAgIGEgPSBhICsgYiArIG1bYmxha2UyYl9zaWdtYVtyXVsyKmkrMF1dOyBcCisgICAgZCA9IHJvdHI2NChkIF4gYSwgMzIpOyBcCisgICAgYyA9IGMgKyBkOyBcCisgICAgYiA9IHJvdHI2NChiIF4gYywgMjQpOyBcCisgICAgYSA9IGEgKyBiICsgbVtibGFrZTJiX3NpZ21hW3JdWzIqaSsxXV07IFwKKyAgICBkID0gcm90cjY0KGQgXiBhLCAxNik7IFwKKyAgICBjID0gYyArIGQ7IFwKKyAgICBiID0gcm90cjY0KGIgXiBjLCA2Myk7IFwKKyAgfSB3aGlsZSgwKQorI2RlZmluZSBST1VORChyKSAgXAorICBkbyB7IFwKKyAgICBHKHIsMCx2WyAwXSx2WyA0XSx2WyA4XSx2WzEyXSk7IFwKKyAgICBHKHIsMSx2WyAxXSx2WyA1XSx2WyA5XSx2WzEzXSk7IFwKKyAgICBHKHIsMix2WyAyXSx2WyA2XSx2WzEwXSx2WzE0XSk7IFwKKyAgICBHKHIsMyx2WyAzXSx2WyA3XSx2WzExXSx2WzE1XSk7IFwKKyAgICBHKHIsNCx2WyAwXSx2WyA1XSx2WzEwXSx2WzE1XSk7IFwKKyAgICBHKHIsNSx2WyAxXSx2WyA2XSx2WzExXSx2WzEyXSk7IFwKKyAgICBHKHIsNix2WyAyXSx2WyA3XSx2WyA4XSx2WzEzXSk7IFwKKyAgICBHKHIsNyx2WyAzXSx2WyA0XSx2WyA5XSx2WzE0XSk7IFwKKyAgfSB3aGlsZSgwKQorICBST1VORCggMCApOworICBST1VORCggMSApOworICBST1VORCggMiApOworICBST1VORCggMyApOworICBST1VORCggNCApOworICBST1VORCggNSApOworICBST1VORCggNiApOworICBST1VORCggNyApOworICBST1VORCggOCApOworICBST1VORCggOSApOworICBST1VORCggMTAgKTsKKyAgUk9VTkQoIDExICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisgICAgUy0+aFtpXSA9IFMtPmhbaV0gXiB2W2ldIF4gdltpICsgOF07CisKKyN1bmRlZiBHCisjdW5kZWYgUk9VTkQKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGlubGVuIG5vdyBpbiBieXRlcyAqLworaW50IGJsYWtlMmJfdXBkYXRlKCBibGFrZTJiX3N0YXRlICpTLCBjb25zdCB1aW50OF90ICppbiwgdWludDY0X3QgaW5sZW4gKQoreworICB3aGlsZSggaW5sZW4gPiAwICkKKyAgeworICAgIHNpemVfdCBsZWZ0ID0gUy0+YnVmbGVuOworICAgIHNpemVfdCBmaWxsID0gMiAqIEJMQUtFMkJfQkxPQ0tCWVRFUyAtIGxlZnQ7CisKKyAgICBpZiggaW5sZW4gPiBmaWxsICkKKyAgICB7CisgICAgICBtZW1jcHkoIFMtPmJ1ZiArIGxlZnQsIGluLCBmaWxsICk7IC8qIEZpbGwgYnVmZmVyICovCisgICAgICBTLT5idWZsZW4gKz0gZmlsbDsKKyAgICAgIGJsYWtlMmJfaW5jcmVtZW50X2NvdW50ZXIoIFMsIEJMQUtFMkJfQkxPQ0tCWVRFUyApOworICAgICAgYmxha2UyYl9jb21wcmVzcyggUywgUy0+YnVmICk7IC8qIENvbXByZXNzICovCisgICAgICBtZW1jcHkoIFMtPmJ1ZiwgUy0+YnVmICsgQkxBS0UyQl9CTE9DS0JZVEVTLCBCTEFLRTJCX0JMT0NLQllURVMgKTsgLyogU2hpZnQgYnVmZmVyIGxlZnQgKi8KKyAgICAgIFMtPmJ1ZmxlbiAtPSBCTEFLRTJCX0JMT0NLQllURVM7CisgICAgICBpbiArPSBmaWxsOworICAgICAgaW5sZW4gLT0gZmlsbDsKKyAgICB9CisgICAgZWxzZSAvKiBpbmxlbiA8PSBmaWxsICovCisgICAgeworICAgICAgbWVtY3B5KCBTLT5idWYgKyBsZWZ0LCBpbiwgKHNpemVfdClpbmxlbiApOworICAgICAgUy0+YnVmbGVuICs9IChzaXplX3QpaW5sZW47IC8qIEJlIGxhenksIGRvIG5vdCBjb21wcmVzcyAqLworICAgICAgaW4gKz0gaW5sZW47CisgICAgICBpbmxlbiAtPSBpbmxlbjsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyogSXMgdGhpcyBjb3JyZWN0PyAqLworaW50IGJsYWtlMmJfZmluYWwoIGJsYWtlMmJfc3RhdGUgKlMsIHVpbnQ4X3QgKm91dCwgdWludDhfdCBvdXRsZW4gKQoreworICB1aW50OF90IGJ1ZmZlcltCTEFLRTJCX09VVEJZVEVTXSA9IHswfTsKKyAgaW50IGk7CisKKyAgaWYoIG91dCA9PSBOVUxMIHx8IG91dGxlbiA9PSAwIHx8IG91dGxlbiA+IEJMQUtFMkJfT1VUQllURVMgKQorICAgIHJldHVybiAtMTsKKworICBpZiggYmxha2UyYl9pc19sYXN0YmxvY2soIFMgKSApCisgICAgcmV0dXJuIC0xOworCisgIGlmKCBTLT5idWZsZW4gPiBCTEFLRTJCX0JMT0NLQllURVMgKQorICB7CisgICAgYmxha2UyYl9pbmNyZW1lbnRfY291bnRlciggUywgQkxBS0UyQl9CTE9DS0JZVEVTICk7CisgICAgYmxha2UyYl9jb21wcmVzcyggUywgUy0+YnVmICk7CisgICAgUy0+YnVmbGVuIC09IEJMQUtFMkJfQkxPQ0tCWVRFUzsKKyAgICBtZW1tb3ZlKCBTLT5idWYsIFMtPmJ1ZiArIEJMQUtFMkJfQkxPQ0tCWVRFUywgUy0+YnVmbGVuICk7CisgIH0KKworICBibGFrZTJiX2luY3JlbWVudF9jb3VudGVyKCBTLCBTLT5idWZsZW4gKTsKKyAgYmxha2UyYl9zZXRfbGFzdGJsb2NrKCBTICk7CisgIG1lbXNldCggUy0+YnVmICsgUy0+YnVmbGVuLCAwLCAyICogQkxBS0UyQl9CTE9DS0JZVEVTIC0gUy0+YnVmbGVuICk7IC8qIFBhZGRpbmcgKi8KKyAgYmxha2UyYl9jb21wcmVzcyggUywgUy0+YnVmICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApIC8qIE91dHB1dCBmdWxsIGhhc2ggdG8gdGVtcCBidWZmZXIgKi8KKyAgICBzdG9yZTY0KCBidWZmZXIgKyBzaXplb2YoIFMtPmhbaV0gKSAqIGksIFMtPmhbaV0gKTsKKworICBtZW1jcHkoIG91dCwgYnVmZmVyLCBvdXRsZW4gKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGlubGVuLCBhdCBsZWFzdCwgc2hvdWxkIGJlIHVpbnQ2NF90LiBPdGhlcnMgY2FuIGJlIHNpemVfdC4gKi8KK2ludCBibGFrZTJiKCB1aW50OF90ICpvdXQsIGNvbnN0IHZvaWQgKmluLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB1aW50NjRfdCBpbmxlbiwgdWludDhfdCBrZXlsZW4gKQoreworICBibGFrZTJiX3N0YXRlIFNbMV07CisKKyAgLyogVmVyaWZ5IHBhcmFtZXRlcnMgKi8KKyAgaWYgKCBOVUxMID09IGluICYmIGlubGVuID4gMCApIHJldHVybiAtMTsKKworICBpZiAoIE5VTEwgPT0gb3V0ICkgcmV0dXJuIC0xOworCisgIGlmKCBOVUxMID09IGtleSAmJiBrZXlsZW4gPiAwICkgcmV0dXJuIC0xOworCisgIGlmKCAhb3V0bGVuIHx8IG91dGxlbiA+IEJMQUtFMkJfT1VUQllURVMgKSByZXR1cm4gLTE7CisKKyAgaWYoIGtleWxlbiA+IEJMQUtFMkJfS0VZQllURVMgKSByZXR1cm4gLTE7CisKKyAgaWYoIGtleWxlbiA+IDAgKQorICB7CisgICAgaWYoIGJsYWtlMmJfaW5pdF9rZXkoIFMsIG91dGxlbiwga2V5LCBrZXlsZW4gKSA8IDAgKSByZXR1cm4gLTE7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoIGJsYWtlMmJfaW5pdCggUywgb3V0bGVuICkgPCAwICkgcmV0dXJuIC0xOworICB9CisKKyAgYmxha2UyYl91cGRhdGUoIFMsICggY29uc3QgdWludDhfdCAqIClpbiwgaW5sZW4gKTsKKyAgYmxha2UyYl9maW5hbCggUywgb3V0LCBvdXRsZW4gKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKFNVUEVSQ09QKQoraW50IGNyeXB0b19oYXNoKCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGxvbmcgaW5sZW4gKQoreworICByZXR1cm4gYmxha2UyYiggb3V0LCBpbiwgTlVMTCwgQkxBS0UyQl9PVVRCWVRFUywgaW5sZW4sIDAgKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTEFLRTJCX1NFTEZURVNUKQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImJsYWtlMi1rYXQuaCIKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKQoreworICB1aW50OF90IGtleVtCTEFLRTJCX0tFWUJZVEVTXTsKKyAgdWludDhfdCBidWZbS0FUX0xFTkdUSF07CisgIHNpemVfdCBpOworCisgIGZvciggaSA9IDA7IGkgPCBCTEFLRTJCX0tFWUJZVEVTOyArK2kgKQorICAgIGtleVtpXSA9ICggdWludDhfdCApaTsKKworICBmb3IoIGkgPSAwOyBpIDwgS0FUX0xFTkdUSDsgKytpICkKKyAgICBidWZbaV0gPSAoIHVpbnQ4X3QgKWk7CisKKyAgZm9yKCBpID0gMDsgaSA8IEtBVF9MRU5HVEg7ICsraSApCisgIHsKKyAgICB1aW50OF90IGhhc2hbQkxBS0UyQl9PVVRCWVRFU107CisgICAgYmxha2UyYiggaGFzaCwgYnVmLCBrZXksIEJMQUtFMkJfT1VUQllURVMsIGksIEJMQUtFMkJfS0VZQllURVMgKTsKKworICAgIGlmKCAwICE9IG1lbWNtcCggaGFzaCwgYmxha2UyYl9rZXllZF9rYXRbaV0sIEJMQUtFMkJfT1VUQllURVMgKSApCisgICAgeworICAgICAgcHV0cyggImVycm9yIiApOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIHB1dHMoICJvayIgKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyYi1yb3VuZC5oIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyYi1yb3VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTIyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLXJvdW5kLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgICBCTEFLRTIgcmVmZXJlbmNlIHNvdXJjZSBjb2RlIHBhY2thZ2UgLSBvcHRpbWl6ZWQgQyBpbXBsZW1lbnRhdGlvbnMKKyAgCisgICBDb3B5cmlnaHQgMjAxMiwgU2FtdWVsIE5ldmVzIDxzbmV2ZXNAZGVpLnVjLnB0Pi4gIFlvdSBtYXkgdXNlIHRoaXMgdW5kZXIgdGhlCisgICB0ZXJtcyBvZiB0aGUgQ0MwLCB0aGUgT3BlblNTTCBMaWNlbmNlLCBvciB0aGUgQXBhY2hlIFB1YmxpYyBMaWNlbnNlIDIuMCwgYXQKKyAgIHlvdXIgb3B0aW9uLiAgVGhlIHRlcm1zIG9mIHRoZXNlIGxpY2Vuc2VzIGNhbiBiZSBmb3VuZCBhdDoKKyAgCisgICAtIENDMCAxLjAgVW5pdmVyc2FsIDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wCisgICAtIE9wZW5TU0wgbGljZW5zZSAgIDogaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorICAgLSBBcGFjaGUgMi4wICAgICAgICA6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJMQUtFMiBoYXNoIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cHM6Ly9ibGFrZTIubmV0LgorKi8KKyNwcmFnbWEgb25jZQorI2lmbmRlZiBfX0JMQUtFMkJfUk9VTkRfSF9fCisjZGVmaW5lIF9fQkxBS0UyQl9ST1VORF9IX18KKworI2RlZmluZSBMT0FEVShwKSAgX21tX2xvYWR1X3NpMTI4KCAoY29uc3QgX19tMTI4aSAqKShwKSApCisjZGVmaW5lIFNUT1JFVShwLHIpIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkgKikocCksIHIpCisKKyNkZWZpbmUgVE9GKHJlZykgX21tX2Nhc3RzaTEyOF9wcygocmVnKSkKKyNkZWZpbmUgVE9JKHJlZykgX21tX2Nhc3Rwc19zaTEyOCgocmVnKSkKKworI2RlZmluZSBMSUtFTFkoeCkgX19idWlsdGluX2V4cGVjdCgoeCksMSkKKworCisvKiBNaWNyb2FyY2hpdGVjdHVyZS1zcGVjaWZpYyBtYWNyb3MgKi8KKyNpZm5kZWYgSEFWRV9YT1AKKyNpZmRlZiBIQVZFX1NTU0UzCisjZGVmaW5lIF9tbV9yb3RpX2VwaTY0KHgsIGMpIFwKKyAgICAoLShjKSA9PSAzMikgPyBfbW1fc2h1ZmZsZV9lcGkzMigoeCksIF9NTV9TSFVGRkxFKDIsMywwLDEpKSAgXAorICAgIDogKC0oYykgPT0gMjQpID8gX21tX3NodWZmbGVfZXBpOCgoeCksIHIyNCkgXAorICAgIDogKC0oYykgPT0gMTYpID8gX21tX3NodWZmbGVfZXBpOCgoeCksIHIxNikgXAorICAgIDogKC0oYykgPT0gNjMpID8gX21tX3hvcl9zaTEyOChfbW1fc3JsaV9lcGk2NCgoeCksIC0oYykpLCBfbW1fYWRkX2VwaTY0KCh4KSwgKHgpKSkgIFwKKyAgICA6IF9tbV94b3Jfc2kxMjgoX21tX3NybGlfZXBpNjQoKHgpLCAtKGMpKSwgX21tX3NsbGlfZXBpNjQoKHgpLCA2NC0oLShjKSkpKQorI2Vsc2UKKyNkZWZpbmUgX21tX3JvdGlfZXBpNjQociwgYykgX21tX3hvcl9zaTEyOChfbW1fc3JsaV9lcGk2NCggKHIpLCAtKGMpICksX21tX3NsbGlfZXBpNjQoIChyKSwgNjQtKC0oYykpICkpCisjZW5kaWYKKyNlbHNlCisvKiAuLi4gKi8KKyNlbmRpZgorCisKKworI2RlZmluZSBHMShyb3cxbCxyb3cybCxyb3czbCxyb3c0bCxyb3cxaCxyb3cyaCxyb3czaCxyb3c0aCxiMCxiMSkgXAorICByb3cxbCA9IF9tbV9hZGRfZXBpNjQoX21tX2FkZF9lcGk2NChyb3cxbCwgYjApLCByb3cybCk7IFwKKyAgcm93MWggPSBfbW1fYWRkX2VwaTY0KF9tbV9hZGRfZXBpNjQocm93MWgsIGIxKSwgcm93MmgpOyBcCisgIFwKKyAgcm93NGwgPSBfbW1feG9yX3NpMTI4KHJvdzRsLCByb3cxbCk7IFwKKyAgcm93NGggPSBfbW1feG9yX3NpMTI4KHJvdzRoLCByb3cxaCk7IFwKKyAgXAorICByb3c0bCA9IF9tbV9yb3RpX2VwaTY0KHJvdzRsLCAtMzIpOyBcCisgIHJvdzRoID0gX21tX3JvdGlfZXBpNjQocm93NGgsIC0zMik7IFwKKyAgXAorICByb3czbCA9IF9tbV9hZGRfZXBpNjQocm93M2wsIHJvdzRsKTsgXAorICByb3czaCA9IF9tbV9hZGRfZXBpNjQocm93M2gsIHJvdzRoKTsgXAorICBcCisgIHJvdzJsID0gX21tX3hvcl9zaTEyOChyb3cybCwgcm93M2wpOyBcCisgIHJvdzJoID0gX21tX3hvcl9zaTEyOChyb3cyaCwgcm93M2gpOyBcCisgIFwKKyAgcm93MmwgPSBfbW1fcm90aV9lcGk2NChyb3cybCwgLTI0KTsgXAorICByb3cyaCA9IF9tbV9yb3RpX2VwaTY0KHJvdzJoLCAtMjQpOyBcCisgCisjZGVmaW5lIEcyKHJvdzFsLHJvdzJsLHJvdzNsLHJvdzRsLHJvdzFoLHJvdzJoLHJvdzNoLHJvdzRoLGIwLGIxKSBcCisgIHJvdzFsID0gX21tX2FkZF9lcGk2NChfbW1fYWRkX2VwaTY0KHJvdzFsLCBiMCksIHJvdzJsKTsgXAorICByb3cxaCA9IF9tbV9hZGRfZXBpNjQoX21tX2FkZF9lcGk2NChyb3cxaCwgYjEpLCByb3cyaCk7IFwKKyAgXAorICByb3c0bCA9IF9tbV94b3Jfc2kxMjgocm93NGwsIHJvdzFsKTsgXAorICByb3c0aCA9IF9tbV94b3Jfc2kxMjgocm93NGgsIHJvdzFoKTsgXAorICBcCisgIHJvdzRsID0gX21tX3JvdGlfZXBpNjQocm93NGwsIC0xNik7IFwKKyAgcm93NGggPSBfbW1fcm90aV9lcGk2NChyb3c0aCwgLTE2KTsgXAorICBcCisgIHJvdzNsID0gX21tX2FkZF9lcGk2NChyb3czbCwgcm93NGwpOyBcCisgIHJvdzNoID0gX21tX2FkZF9lcGk2NChyb3czaCwgcm93NGgpOyBcCisgIFwKKyAgcm93MmwgPSBfbW1feG9yX3NpMTI4KHJvdzJsLCByb3czbCk7IFwKKyAgcm93MmggPSBfbW1feG9yX3NpMTI4KHJvdzJoLCByb3czaCk7IFwKKyAgXAorICByb3cybCA9IF9tbV9yb3RpX2VwaTY0KHJvdzJsLCAtNjMpOyBcCisgIHJvdzJoID0gX21tX3JvdGlfZXBpNjQocm93MmgsIC02Myk7IFwKKyAKKyNpZiBkZWZpbmVkKEhBVkVfU1NTRTMpCisjZGVmaW5lIERJQUdPTkFMSVpFKHJvdzFsLHJvdzJsLHJvdzNsLHJvdzRsLHJvdzFoLHJvdzJoLHJvdzNoLHJvdzRoKSBcCisgIHQwID0gX21tX2FsaWducl9lcGk4KHJvdzJoLCByb3cybCwgOCk7IFwKKyAgdDEgPSBfbW1fYWxpZ25yX2VwaTgocm93MmwsIHJvdzJoLCA4KTsgXAorICByb3cybCA9IHQwOyBcCisgIHJvdzJoID0gdDE7IFwKKyAgXAorICB0MCA9IHJvdzNsOyBcCisgIHJvdzNsID0gcm93M2g7IFwKKyAgcm93M2ggPSB0MDsgICAgXAorICBcCisgIHQwID0gX21tX2FsaWducl9lcGk4KHJvdzRoLCByb3c0bCwgOCk7IFwKKyAgdDEgPSBfbW1fYWxpZ25yX2VwaTgocm93NGwsIHJvdzRoLCA4KTsgXAorICByb3c0bCA9IHQxOyBcCisgIHJvdzRoID0gdDA7CisKKyNkZWZpbmUgVU5ESUFHT05BTElaRShyb3cxbCxyb3cybCxyb3czbCxyb3c0bCxyb3cxaCxyb3cyaCxyb3czaCxyb3c0aCkgXAorICB0MCA9IF9tbV9hbGlnbnJfZXBpOChyb3cybCwgcm93MmgsIDgpOyBcCisgIHQxID0gX21tX2FsaWducl9lcGk4KHJvdzJoLCByb3cybCwgOCk7IFwKKyAgcm93MmwgPSB0MDsgXAorICByb3cyaCA9IHQxOyBcCisgIFwKKyAgdDAgPSByb3czbDsgXAorICByb3czbCA9IHJvdzNoOyBcCisgIHJvdzNoID0gdDA7IFwKKyAgXAorICB0MCA9IF9tbV9hbGlnbnJfZXBpOChyb3c0bCwgcm93NGgsIDgpOyBcCisgIHQxID0gX21tX2FsaWducl9lcGk4KHJvdzRoLCByb3c0bCwgOCk7IFwKKyAgcm93NGwgPSB0MTsgXAorICByb3c0aCA9IHQwOworI2Vsc2UKKworI2RlZmluZSBESUFHT05BTElaRShyb3cxbCxyb3cybCxyb3czbCxyb3c0bCxyb3cxaCxyb3cyaCxyb3czaCxyb3c0aCkgXAorICB0MCA9IHJvdzRsO1wKKyAgdDEgPSByb3cybDtcCisgIHJvdzRsID0gcm93M2w7XAorICByb3czbCA9IHJvdzNoO1wKKyAgcm93M2ggPSByb3c0bDtcCisgIHJvdzRsID0gX21tX3VucGFja2hpX2VwaTY0KHJvdzRoLCBfbW1fdW5wYWNrbG9fZXBpNjQodDAsIHQwKSk7IFwKKyAgcm93NGggPSBfbW1fdW5wYWNraGlfZXBpNjQodDAsIF9tbV91bnBhY2tsb19lcGk2NChyb3c0aCwgcm93NGgpKTsgXAorICByb3cybCA9IF9tbV91bnBhY2toaV9lcGk2NChyb3cybCwgX21tX3VucGFja2xvX2VwaTY0KHJvdzJoLCByb3cyaCkpOyBcCisgIHJvdzJoID0gX21tX3VucGFja2hpX2VwaTY0KHJvdzJoLCBfbW1fdW5wYWNrbG9fZXBpNjQodDEsIHQxKSkKKworI2RlZmluZSBVTkRJQUdPTkFMSVpFKHJvdzFsLHJvdzJsLHJvdzNsLHJvdzRsLHJvdzFoLHJvdzJoLHJvdzNoLHJvdzRoKSBcCisgIHQwID0gcm93M2w7XAorICByb3czbCA9IHJvdzNoO1wKKyAgcm93M2ggPSB0MDtcCisgIHQwID0gcm93Mmw7XAorICB0MSA9IHJvdzRsO1wKKyAgcm93MmwgPSBfbW1fdW5wYWNraGlfZXBpNjQocm93MmgsIF9tbV91bnBhY2tsb19lcGk2NChyb3cybCwgcm93MmwpKTsgXAorICByb3cyaCA9IF9tbV91bnBhY2toaV9lcGk2NCh0MCwgX21tX3VucGFja2xvX2VwaTY0KHJvdzJoLCByb3cyaCkpOyBcCisgIHJvdzRsID0gX21tX3VucGFja2hpX2VwaTY0KHJvdzRsLCBfbW1fdW5wYWNrbG9fZXBpNjQocm93NGgsIHJvdzRoKSk7IFwKKyAgcm93NGggPSBfbW1fdW5wYWNraGlfZXBpNjQocm93NGgsIF9tbV91bnBhY2tsb19lcGk2NCh0MSwgdDEpKQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9TU0U0MSkKKyNpbmNsdWRlICJibGFrZTJiLWxvYWQtc3NlNDEuaCIKKyNlbHNlCisjaW5jbHVkZSAiYmxha2UyYi1sb2FkLXNzZTIuaCIKKyNlbmRpZgorCisjZGVmaW5lIFJPVU5EKHIpIFwKKyAgTE9BRF9NU0dfICMjciAjI18xKGIwLCBiMSk7IFwKKyAgRzEocm93MWwscm93Mmwscm93M2wscm93NGwscm93MWgscm93Mmgscm93M2gscm93NGgsYjAsYjEpOyBcCisgIExPQURfTVNHXyAjI3IgIyNfMihiMCwgYjEpOyBcCisgIEcyKHJvdzFsLHJvdzJsLHJvdzNsLHJvdzRsLHJvdzFoLHJvdzJoLHJvdzNoLHJvdzRoLGIwLGIxKTsgXAorICBESUFHT05BTElaRShyb3cxbCxyb3cybCxyb3czbCxyb3c0bCxyb3cxaCxyb3cyaCxyb3czaCxyb3c0aCk7IFwKKyAgTE9BRF9NU0dfICMjciAjI18zKGIwLCBiMSk7IFwKKyAgRzEocm93MWwscm93Mmwscm93M2wscm93NGwscm93MWgscm93Mmgscm93M2gscm93NGgsYjAsYjEpOyBcCisgIExPQURfTVNHXyAjI3IgIyNfNChiMCwgYjEpOyBcCisgIEcyKHJvdzFsLHJvdzJsLHJvdzNsLHJvdzRsLHJvdzFoLHJvdzJoLHJvdzNoLHJvdzRoLGIwLGIxKTsgXAorICBVTkRJQUdPTkFMSVpFKHJvdzFsLHJvdzJsLHJvdzNsLHJvdzRsLHJvdzFoLHJvdzJoLHJvdzNoLHJvdzRoKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMmIuYyBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmI2NWJiCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyYi5jCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gb3B0aW1pemVkIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYmxha2UyLmgiCisjaW5jbHVkZSAiYmxha2UyLWltcGwuaCIKKworI2luY2x1ZGUgImJsYWtlMi1jb25maWcuaCIKKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW50cmluLmg+IC8qIGZvciBfbW1fc2V0X2VwaTY0eCAqLworI2VuZGlmCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjaWYgZGVmaW5lZChIQVZFX1NTU0UzKQorI2luY2x1ZGUgPHRtbWludHJpbi5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1NTRTQxKQorI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0FWWCkKKyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9YT1ApCisjaW5jbHVkZSA8eDg2aW50cmluLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImJsYWtlMmItcm91bmQuaCIKKworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGJsYWtlMmJfSVZbOF0gPQoreworICAweDZhMDllNjY3ZjNiY2M5MDhVTEwsIDB4YmI2N2FlODU4NGNhYTczYlVMTCwKKyAgMHgzYzZlZjM3MmZlOTRmODJiVUxMLCAweGE1NGZmNTNhNWYxZDM2ZjFVTEwsCisgIDB4NTEwZTUyN2ZhZGU2ODJkMVVMTCwgMHg5YjA1Njg4YzJiM2U2YzFmVUxMLAorICAweDFmODNkOWFiZmI0MWJkNmJVTEwsIDB4NWJlMGNkMTkxMzdlMjE3OVVMTAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmxha2UyYl9zaWdtYVsxMl1bMTZdID0KK3sKKyAgeyAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSB9ICwKKyAgeyAxNCwgMTAsICA0LCAgOCwgIDksIDE1LCAxMywgIDYsICAxLCAxMiwgIDAsICAyLCAxMSwgIDcsICA1LCAgMyB9ICwKKyAgeyAxMSwgIDgsIDEyLCAgMCwgIDUsICAyLCAxNSwgMTMsIDEwLCAxNCwgIDMsICA2LCAgNywgIDEsICA5LCAgNCB9ICwKKyAgeyAgNywgIDksICAzLCAgMSwgMTMsIDEyLCAxMSwgMTQsICAyLCAgNiwgIDUsIDEwLCAgNCwgIDAsIDE1LCAgOCB9ICwKKyAgeyAgOSwgIDAsICA1LCAgNywgIDIsICA0LCAxMCwgMTUsIDE0LCAgMSwgMTEsIDEyLCAgNiwgIDgsICAzLCAxMyB9ICwKKyAgeyAgMiwgMTIsICA2LCAxMCwgIDAsIDExLCAgOCwgIDMsICA0LCAxMywgIDcsICA1LCAxNSwgMTQsICAxLCAgOSB9ICwKKyAgeyAxMiwgIDUsICAxLCAxNSwgMTQsIDEzLCAgNCwgMTAsICAwLCAgNywgIDYsICAzLCAgOSwgIDIsICA4LCAxMSB9ICwKKyAgeyAxMywgMTEsICA3LCAxNCwgMTIsICAxLCAgMywgIDksICA1LCAgMCwgMTUsICA0LCAgOCwgIDYsICAyLCAxMCB9ICwKKyAgeyAgNiwgMTUsIDE0LCAgOSwgMTEsICAzLCAgMCwgIDgsIDEyLCAgMiwgMTMsICA3LCAgMSwgIDQsIDEwLCAgNSB9ICwKKyAgeyAxMCwgIDIsICA4LCAgNCwgIDcsICA2LCAgMSwgIDUsIDE1LCAxMSwgIDksIDE0LCAgMywgMTIsIDEzICwgMCB9ICwKKyAgeyAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSB9ICwKKyAgeyAxNCwgMTAsICA0LCAgOCwgIDksIDE1LCAxMywgIDYsICAxLCAxMiwgIDAsICAyLCAxMSwgIDcsICA1LCAgMyB9Cit9OworCisKKy8qIFNvbWUgaGVscGVyIGZ1bmN0aW9ucywgbm90IG5lY2Vzc2FyaWx5IHVzZWZ1bCAqLworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfc2V0X2xhc3Rub2RlKCBibGFrZTJiX3N0YXRlICpTICkKK3sKKyAgUy0+ZlsxXSA9IC0xOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfY2xlYXJfbGFzdG5vZGUoIGJsYWtlMmJfc3RhdGUgKlMgKQoreworICBTLT5mWzFdID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX2lzX2xhc3RibG9jayggY29uc3QgYmxha2UyYl9zdGF0ZSAqUyApCit7CisgIHJldHVybiBTLT5mWzBdICE9IDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3NldF9sYXN0YmxvY2soIGJsYWtlMmJfc3RhdGUgKlMgKQoreworICBpZiggUy0+bGFzdF9ub2RlICkgYmxha2UyYl9zZXRfbGFzdG5vZGUoIFMgKTsKKworICBTLT5mWzBdID0gLTE7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9jbGVhcl9sYXN0YmxvY2soIGJsYWtlMmJfc3RhdGUgKlMgKQoreworICBpZiggUy0+bGFzdF9ub2RlICkgYmxha2UyYl9jbGVhcl9sYXN0bm9kZSggUyApOworCisgIFMtPmZbMF0gPSAwOworICByZXR1cm4gMDsKK30KKworCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9pbmNyZW1lbnRfY291bnRlciggYmxha2UyYl9zdGF0ZSAqUywgY29uc3QgdWludDY0X3QgaW5jICkKK3sKKyNpZiBfX3g4Nl82NF9fCisgIC8qIEFERC9BREMgY2hhaW4gKi8KKyAgX191aW50MTI4X3QgdCA9ICggKCBfX3VpbnQxMjhfdCApUy0+dFsxXSA8PCA2NCApIHwgUy0+dFswXTsKKyAgdCArPSBpbmM7CisgIFMtPnRbMF0gPSAoIHVpbnQ2NF90ICkoIHQgPj4gIDAgKTsKKyAgUy0+dFsxXSA9ICggdWludDY0X3QgKSggdCA+PiA2NCApOworI2Vsc2UKKyAgUy0+dFswXSArPSBpbmM7CisgIFMtPnRbMV0gKz0gKCBTLT50WzBdIDwgaW5jICk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKworLyogUGFyYW1ldGVyLXJlbGF0ZWQgZnVuY3Rpb25zICovCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfZGlnZXN0X2xlbmd0aCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDhfdCBkaWdlc3RfbGVuZ3RoICkKK3sKKyAgUC0+ZGlnZXN0X2xlbmd0aCA9IGRpZ2VzdF9sZW5ndGg7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfZmFub3V0KCBibGFrZTJiX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGZhbm91dCApCit7CisgIFAtPmZhbm91dCA9IGZhbm91dDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3BhcmFtX3NldF9tYXhfZGVwdGgoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgZGVwdGggKQoreworICBQLT5kZXB0aCA9IGRlcHRoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X2xlYWZfbGVuZ3RoKCBibGFrZTJiX3BhcmFtICpQLCBjb25zdCB1aW50MzJfdCBsZWFmX2xlbmd0aCApCit7CisgIFAtPmxlYWZfbGVuZ3RoID0gbGVhZl9sZW5ndGg7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfbm9kZV9vZmZzZXQoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ2NF90IG5vZGVfb2Zmc2V0ICkKK3sKKyAgUC0+bm9kZV9vZmZzZXQgPSBub2RlX29mZnNldDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3BhcmFtX3NldF9ub2RlX2RlcHRoKCBibGFrZTJiX3BhcmFtICpQLCBjb25zdCB1aW50OF90IG5vZGVfZGVwdGggKQoreworICBQLT5ub2RlX2RlcHRoID0gbm9kZV9kZXB0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3BhcmFtX3NldF9pbm5lcl9sZW5ndGgoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgaW5uZXJfbGVuZ3RoICkKK3sKKyAgUC0+aW5uZXJfbGVuZ3RoID0gaW5uZXJfbGVuZ3RoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X3NhbHQoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3Qgc2FsdFtCTEFLRTJCX1NBTFRCWVRFU10gKQoreworICBtZW1jcHkoIFAtPnNhbHQsIHNhbHQsIEJMQUtFMkJfU0FMVEJZVEVTICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfcGVyc29uYWwoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgcGVyc29uYWxbQkxBS0UyQl9QRVJTT05BTEJZVEVTXSApCit7CisgIG1lbWNweSggUC0+cGVyc29uYWwsIHBlcnNvbmFsLCBCTEFLRTJCX1BFUlNPTkFMQllURVMgKTsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX2luaXQwKCBibGFrZTJiX3N0YXRlICpTICkKK3sKKyAgaW50IGk7CisgIG1lbXNldCggUywgMCwgc2l6ZW9mKCBibGFrZTJiX3N0YXRlICkgKTsKKworICBmb3IoIGkgPSAwOyBpIDwgODsgKytpICkgUy0+aFtpXSA9IGJsYWtlMmJfSVZbaV07CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGluaXQgeG9ycyBJViB3aXRoIGlucHV0IHBhcmFtZXRlciBibG9jayAqLworaW50IGJsYWtlMmJfaW5pdF9wYXJhbSggYmxha2UyYl9zdGF0ZSAqUywgY29uc3QgYmxha2UyYl9wYXJhbSAqUCApCit7CisgIC8qYmxha2UyYl9pbml0MCggUyApOyAqLworICBjb25zdCB1aW50OF90ICogdiA9ICggY29uc3QgdWludDhfdCAqICkoIGJsYWtlMmJfSVYgKTsKKyAgY29uc3QgdWludDhfdCAqIHAgPSAoIGNvbnN0IHVpbnQ4X3QgKiApKCBQICk7CisgIHVpbnQ4X3QgKiBoID0gKCB1aW50OF90ICogKSggUy0+aCApOworICBpbnQgaTsKKyAgLyogSVYgWE9SIFBhcmFtQmxvY2sgKi8KKyAgbWVtc2V0KCBTLCAwLCBzaXplb2YoIGJsYWtlMmJfc3RhdGUgKSApOworCisgIGZvciggaSA9IDA7IGkgPCBCTEFLRTJCX09VVEJZVEVTOyArK2kgKSBoW2ldID0gdltpXSBeIHBbaV07CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogU29tZSBzb3J0IG9mIGRlZmF1bHQgcGFyYW1ldGVyIGJsb2NrIGluaXRpYWxpemF0aW9uLCBmb3Igc2VxdWVudGlhbCBibGFrZTJiICovCitpbnQgYmxha2UyYl9pbml0KCBibGFrZTJiX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiApCit7CisgIGNvbnN0IGJsYWtlMmJfcGFyYW0gUCA9CisgIHsKKyAgICBvdXRsZW4sCisgICAgMCwKKyAgICAxLAorICAgIDEsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICB7MH0sCisgICAgezB9LAorICAgIHswfQorICB9OworCisgIGlmICggKCAhb3V0bGVuICkgfHwgKCBvdXRsZW4gPiBCTEFLRTJCX09VVEJZVEVTICkgKSByZXR1cm4gLTE7CisKKyAgcmV0dXJuIGJsYWtlMmJfaW5pdF9wYXJhbSggUywgJlAgKTsKK30KKworaW50IGJsYWtlMmJfaW5pdF9rZXkoIGJsYWtlMmJfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qga2V5bGVuICkKK3sKKyAgY29uc3QgYmxha2UyYl9wYXJhbSBQID0KKyAgeworICAgIG91dGxlbiwKKyAgICBrZXlsZW4sCisgICAgMSwKKyAgICAxLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgezB9LAorICAgIHswfSwKKyAgICB7MH0KKyAgfTsKKworICBpZiAoICggIW91dGxlbiApIHx8ICggb3V0bGVuID4gQkxBS0UyQl9PVVRCWVRFUyApICkgcmV0dXJuIC0xOworCisgIGlmICggKCAha2V5bGVuICkgfHwga2V5bGVuID4gQkxBS0UyQl9LRVlCWVRFUyApIHJldHVybiAtMTsKKworICBpZiggYmxha2UyYl9pbml0X3BhcmFtKCBTLCAmUCApIDwgMCApCisgICAgcmV0dXJuIDA7CisKKyAgeworICAgIHVpbnQ4X3QgYmxvY2tbQkxBS0UyQl9CTE9DS0JZVEVTXTsKKyAgICBtZW1zZXQoIGJsb2NrLCAwLCBCTEFLRTJCX0JMT0NLQllURVMgKTsKKyAgICBtZW1jcHkoIGJsb2NrLCBrZXksIGtleWxlbiApOworICAgIGJsYWtlMmJfdXBkYXRlKCBTLCBibG9jaywgQkxBS0UyQl9CTE9DS0JZVEVTICk7CisgICAgc2VjdXJlX3plcm9fbWVtb3J5KCBibG9jaywgQkxBS0UyQl9CTE9DS0JZVEVTICk7IC8qIEJ1cm4gdGhlIGtleSBmcm9tIHN0YWNrICovCisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX2NvbXByZXNzKCBibGFrZTJiX3N0YXRlICpTLCBjb25zdCB1aW50OF90IGJsb2NrW0JMQUtFMkJfQkxPQ0tCWVRFU10gKQoreworICBfX20xMjhpIHJvdzFsLCByb3cxaDsKKyAgX19tMTI4aSByb3cybCwgcm93Mmg7CisgIF9fbTEyOGkgcm93M2wsIHJvdzNoOworICBfX20xMjhpIHJvdzRsLCByb3c0aDsKKyAgX19tMTI4aSBiMCwgYjE7CisgIF9fbTEyOGkgdDAsIHQxOworI2lmIGRlZmluZWQoSEFWRV9TU1NFMykgJiYgIWRlZmluZWQoSEFWRV9YT1ApCisgIGNvbnN0IF9fbTEyOGkgcjE2ID0gX21tX3NldHJfZXBpOCggMiwgMywgNCwgNSwgNiwgNywgMCwgMSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgOCwgOSApOworICBjb25zdCBfX20xMjhpIHIyNCA9IF9tbV9zZXRyX2VwaTgoIDMsIDQsIDUsIDYsIDcsIDAsIDEsIDIsIDExLCAxMiwgMTMsIDE0LCAxNSwgOCwgOSwgMTAgKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9TU0U0MSkKKyAgY29uc3QgX19tMTI4aSBtMCA9IExPQURVKCBibG9jayArIDAwICk7CisgIGNvbnN0IF9fbTEyOGkgbTEgPSBMT0FEVSggYmxvY2sgKyAxNiApOworICBjb25zdCBfX20xMjhpIG0yID0gTE9BRFUoIGJsb2NrICsgMzIgKTsKKyAgY29uc3QgX19tMTI4aSBtMyA9IExPQURVKCBibG9jayArIDQ4ICk7CisgIGNvbnN0IF9fbTEyOGkgbTQgPSBMT0FEVSggYmxvY2sgKyA2NCApOworICBjb25zdCBfX20xMjhpIG01ID0gTE9BRFUoIGJsb2NrICsgODAgKTsKKyAgY29uc3QgX19tMTI4aSBtNiA9IExPQURVKCBibG9jayArIDk2ICk7CisgIGNvbnN0IF9fbTEyOGkgbTcgPSBMT0FEVSggYmxvY2sgKyAxMTIgKTsKKyNlbHNlCisgIGNvbnN0IHVpbnQ2NF90ICBtMCA9ICggKCB1aW50NjRfdCAqIClibG9jayApWyAwXTsKKyAgY29uc3QgdWludDY0X3QgIG0xID0gKCAoIHVpbnQ2NF90ICogKWJsb2NrIClbIDFdOworICBjb25zdCB1aW50NjRfdCAgbTIgPSAoICggdWludDY0X3QgKiApYmxvY2sgKVsgMl07CisgIGNvbnN0IHVpbnQ2NF90ICBtMyA9ICggKCB1aW50NjRfdCAqIClibG9jayApWyAzXTsKKyAgY29uc3QgdWludDY0X3QgIG00ID0gKCAoIHVpbnQ2NF90ICogKWJsb2NrIClbIDRdOworICBjb25zdCB1aW50NjRfdCAgbTUgPSAoICggdWludDY0X3QgKiApYmxvY2sgKVsgNV07CisgIGNvbnN0IHVpbnQ2NF90ICBtNiA9ICggKCB1aW50NjRfdCAqIClibG9jayApWyA2XTsKKyAgY29uc3QgdWludDY0X3QgIG03ID0gKCAoIHVpbnQ2NF90ICogKWJsb2NrIClbIDddOworICBjb25zdCB1aW50NjRfdCAgbTggPSAoICggdWludDY0X3QgKiApYmxvY2sgKVsgOF07CisgIGNvbnN0IHVpbnQ2NF90ICBtOSA9ICggKCB1aW50NjRfdCAqIClibG9jayApWyA5XTsKKyAgY29uc3QgdWludDY0X3QgbTEwID0gKCAoIHVpbnQ2NF90ICogKWJsb2NrIClbMTBdOworICBjb25zdCB1aW50NjRfdCBtMTEgPSAoICggdWludDY0X3QgKiApYmxvY2sgKVsxMV07CisgIGNvbnN0IHVpbnQ2NF90IG0xMiA9ICggKCB1aW50NjRfdCAqIClibG9jayApWzEyXTsKKyAgY29uc3QgdWludDY0X3QgbTEzID0gKCAoIHVpbnQ2NF90ICogKWJsb2NrIClbMTNdOworICBjb25zdCB1aW50NjRfdCBtMTQgPSAoICggdWludDY0X3QgKiApYmxvY2sgKVsxNF07CisgIGNvbnN0IHVpbnQ2NF90IG0xNSA9ICggKCB1aW50NjRfdCAqIClibG9jayApWzE1XTsKKyNlbmRpZgorICByb3cxbCA9IExPQURVKCAmUy0+aFswXSApOworICByb3cxaCA9IExPQURVKCAmUy0+aFsyXSApOworICByb3cybCA9IExPQURVKCAmUy0+aFs0XSApOworICByb3cyaCA9IExPQURVKCAmUy0+aFs2XSApOworICByb3czbCA9IExPQURVKCAmYmxha2UyYl9JVlswXSApOworICByb3czaCA9IExPQURVKCAmYmxha2UyYl9JVlsyXSApOworICByb3c0bCA9IF9tbV94b3Jfc2kxMjgoIExPQURVKCAmYmxha2UyYl9JVls0XSApLCBMT0FEVSggJlMtPnRbMF0gKSApOworICByb3c0aCA9IF9tbV94b3Jfc2kxMjgoIExPQURVKCAmYmxha2UyYl9JVls2XSApLCBMT0FEVSggJlMtPmZbMF0gKSApOworICBST1VORCggMCApOworICBST1VORCggMSApOworICBST1VORCggMiApOworICBST1VORCggMyApOworICBST1VORCggNCApOworICBST1VORCggNSApOworICBST1VORCggNiApOworICBST1VORCggNyApOworICBST1VORCggOCApOworICBST1VORCggOSApOworICBST1VORCggMTAgKTsKKyAgUk9VTkQoIDExICk7CisgIHJvdzFsID0gX21tX3hvcl9zaTEyOCggcm93M2wsIHJvdzFsICk7CisgIHJvdzFoID0gX21tX3hvcl9zaTEyOCggcm93M2gsIHJvdzFoICk7CisgIFNUT1JFVSggJlMtPmhbMF0sIF9tbV94b3Jfc2kxMjgoIExPQURVKCAmUy0+aFswXSApLCByb3cxbCApICk7CisgIFNUT1JFVSggJlMtPmhbMl0sIF9tbV94b3Jfc2kxMjgoIExPQURVKCAmUy0+aFsyXSApLCByb3cxaCApICk7CisgIHJvdzJsID0gX21tX3hvcl9zaTEyOCggcm93NGwsIHJvdzJsICk7CisgIHJvdzJoID0gX21tX3hvcl9zaTEyOCggcm93NGgsIHJvdzJoICk7CisgIFNUT1JFVSggJlMtPmhbNF0sIF9tbV94b3Jfc2kxMjgoIExPQURVKCAmUy0+aFs0XSApLCByb3cybCApICk7CisgIFNUT1JFVSggJlMtPmhbNl0sIF9tbV94b3Jfc2kxMjgoIExPQURVKCAmUy0+aFs2XSApLCByb3cyaCApICk7CisgIHJldHVybiAwOworfQorCisKK2ludCBibGFrZTJiX3VwZGF0ZSggYmxha2UyYl9zdGF0ZSAqUywgY29uc3QgdWludDhfdCAqaW4sIHVpbnQ2NF90IGlubGVuICkKK3sKKyAgd2hpbGUoIGlubGVuID4gMCApCisgIHsKKyAgICBzaXplX3QgbGVmdCA9IFMtPmJ1ZmxlbjsKKyAgICBzaXplX3QgZmlsbCA9IDIgKiBCTEFLRTJCX0JMT0NLQllURVMgLSBsZWZ0OworCisgICAgaWYoIGlubGVuID4gZmlsbCApCisgICAgeworICAgICAgbWVtY3B5KCBTLT5idWYgKyBsZWZ0LCBpbiwgZmlsbCApOyAvKiBGaWxsIGJ1ZmZlciAqLworICAgICAgUy0+YnVmbGVuICs9IGZpbGw7CisgICAgICBibGFrZTJiX2luY3JlbWVudF9jb3VudGVyKCBTLCBCTEFLRTJCX0JMT0NLQllURVMgKTsKKyAgICAgIGJsYWtlMmJfY29tcHJlc3MoIFMsIFMtPmJ1ZiApOyAvKiBDb21wcmVzcyAqLworICAgICAgbWVtY3B5KCBTLT5idWYsIFMtPmJ1ZiArIEJMQUtFMkJfQkxPQ0tCWVRFUywgQkxBS0UyQl9CTE9DS0JZVEVTICk7IC8qIFNoaWZ0IGJ1ZmZlciBsZWZ0ICovCisgICAgICBTLT5idWZsZW4gLT0gQkxBS0UyQl9CTE9DS0JZVEVTOworICAgICAgaW4gKz0gZmlsbDsKKyAgICAgIGlubGVuIC09IGZpbGw7CisgICAgfQorICAgIGVsc2UgLyogaW5sZW4gPD0gZmlsbCAqLworICAgIHsKKyAgICAgIG1lbWNweSggUy0+YnVmICsgbGVmdCwgaW4sIGlubGVuICk7CisgICAgICBTLT5idWZsZW4gKz0gaW5sZW47IC8qIEJlIGxhenksIGRvIG5vdCBjb21wcmVzcyAqLworICAgICAgaW4gKz0gaW5sZW47CisgICAgICBpbmxlbiAtPSBpbmxlbjsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworCitpbnQgYmxha2UyYl9maW5hbCggYmxha2UyYl9zdGF0ZSAqUywgdWludDhfdCAqb3V0LCB1aW50OF90IG91dGxlbiApCit7CisgIGlmKCBvdXRsZW4gPiBCTEFLRTJCX09VVEJZVEVTICkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYoIGJsYWtlMmJfaXNfbGFzdGJsb2NrKCBTICkgKQorICAgIHJldHVybiAtMTsKKworICBpZiggUy0+YnVmbGVuID4gQkxBS0UyQl9CTE9DS0JZVEVTICkKKyAgeworICAgIGJsYWtlMmJfaW5jcmVtZW50X2NvdW50ZXIoIFMsIEJMQUtFMkJfQkxPQ0tCWVRFUyApOworICAgIGJsYWtlMmJfY29tcHJlc3MoIFMsIFMtPmJ1ZiApOworICAgIFMtPmJ1ZmxlbiAtPSBCTEFLRTJCX0JMT0NLQllURVM7CisgICAgbWVtbW92ZSggUy0+YnVmLCBTLT5idWYgKyBCTEFLRTJCX0JMT0NLQllURVMsIFMtPmJ1ZmxlbiApOworICB9CisKKyAgYmxha2UyYl9pbmNyZW1lbnRfY291bnRlciggUywgUy0+YnVmbGVuICk7CisgIGJsYWtlMmJfc2V0X2xhc3RibG9jayggUyApOworICBtZW1zZXQoIFMtPmJ1ZiArIFMtPmJ1ZmxlbiwgMCwgMiAqIEJMQUtFMkJfQkxPQ0tCWVRFUyAtIFMtPmJ1ZmxlbiApOyAvKiBQYWRkaW5nICovCisgIGJsYWtlMmJfY29tcHJlc3MoIFMsIFMtPmJ1ZiApOworICBtZW1jcHkoIG91dCwgJlMtPmhbMF0sIG91dGxlbiApOworICByZXR1cm4gMDsKK30KKworCitpbnQgYmxha2UyYiggdWludDhfdCAqb3V0LCBjb25zdCB2b2lkICppbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3QgdWludDY0X3QgaW5sZW4sIHVpbnQ4X3Qga2V5bGVuICkKK3sKKyAgYmxha2UyYl9zdGF0ZSBTWzFdOworCisgIC8qIFZlcmlmeSBwYXJhbWV0ZXJzICovCisgIGlmICggTlVMTCA9PSBpbiAmJiBpbmxlbiA+IDAgKSByZXR1cm4gLTE7CisKKyAgaWYgKCBOVUxMID09IG91dCApIHJldHVybiAtMTsKKworICBpZiggTlVMTCA9PSBrZXkgJiYga2V5bGVuID4gMCApIHJldHVybiAtMTsKKworICBpZiggIW91dGxlbiB8fCBvdXRsZW4gPiBCTEFLRTJCX09VVEJZVEVTICkgcmV0dXJuIC0xOworCisgIGlmKCBrZXlsZW4gPiBCTEFLRTJCX0tFWUJZVEVTICkgcmV0dXJuIC0xOworCisgIGlmKCBrZXlsZW4gKQorICB7CisgICAgaWYoIGJsYWtlMmJfaW5pdF9rZXkoIFMsIG91dGxlbiwga2V5LCBrZXlsZW4gKSA8IDAgKSByZXR1cm4gLTE7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoIGJsYWtlMmJfaW5pdCggUywgb3V0bGVuICkgPCAwICkgcmV0dXJuIC0xOworICB9CisKKyAgYmxha2UyYl91cGRhdGUoIFMsICggY29uc3QgdWludDhfdCAqIClpbiwgaW5sZW4gKTsKKyAgYmxha2UyYl9maW5hbCggUywgb3V0LCBvdXRsZW4gKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKFNVUEVSQ09QKQoraW50IGNyeXB0b19oYXNoKCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGxvbmcgaW5sZW4gKQoreworICByZXR1cm4gYmxha2UyYiggb3V0LCBpbiwgTlVMTCwgQkxBS0UyQl9PVVRCWVRFUywgaW5sZW4sIDAgKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTEFLRTJCX1NFTEZURVNUKQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImJsYWtlMi1rYXQuaCIKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKQoreworICB1aW50OF90IGtleVtCTEFLRTJCX0tFWUJZVEVTXTsKKyAgdWludDhfdCBidWZbS0FUX0xFTkdUSF07CisgIHNpemVfdCBpOworCisgIGZvciggaSA9IDA7IGkgPCBCTEFLRTJCX0tFWUJZVEVTOyArK2kgKQorICAgIGtleVtpXSA9ICggdWludDhfdCApaTsKKworICBmb3IoIGkgPSAwOyBpIDwgS0FUX0xFTkdUSDsgKytpICkKKyAgICBidWZbaV0gPSAoIHVpbnQ4X3QgKWk7CisKKyAgZm9yKCBpID0gMDsgaSA8IEtBVF9MRU5HVEg7ICsraSApCisgIHsKKyAgICB1aW50OF90IGhhc2hbQkxBS0UyQl9PVVRCWVRFU107CisgICAgYmxha2UyYiggaGFzaCwgYnVmLCBrZXksIEJMQUtFMkJfT1VUQllURVMsIGksIEJMQUtFMkJfS0VZQllURVMgKTsKKworICAgIGlmKCAwICE9IG1lbWNtcCggaGFzaCwgYmxha2UyYl9rZXllZF9rYXRbaV0sIEJMQUtFMkJfT1VUQllURVMgKSApCisgICAgeworICAgICAgcHV0cyggImVycm9yIiApOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIHB1dHMoICJvayIgKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1sb2FkLXNzZTIuaCBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC1zc2UyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkZWZhNwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC1zc2UyLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAgIEJMQUtFMiByZWZlcmVuY2Ugc291cmNlIGNvZGUgcGFja2FnZSAtIG9wdGltaXplZCBDIGltcGxlbWVudGF0aW9ucworICAKKyAgIENvcHlyaWdodCAyMDEyLCBTYW11ZWwgTmV2ZXMgPHNuZXZlc0BkZWkudWMucHQ+LiAgWW91IG1heSB1c2UgdGhpcyB1bmRlciB0aGUKKyAgIHRlcm1zIG9mIHRoZSBDQzAsIHRoZSBPcGVuU1NMIExpY2VuY2UsIG9yIHRoZSBBcGFjaGUgUHVibGljIExpY2Vuc2UgMi4wLCBhdAorICAgeW91ciBvcHRpb24uICBUaGUgdGVybXMgb2YgdGhlc2UgbGljZW5zZXMgY2FuIGJlIGZvdW5kIGF0OgorICAKKyAgIC0gQ0MwIDEuMCBVbml2ZXJzYWwgOiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAKKyAgIC0gT3BlblNTTCBsaWNlbnNlICAgOiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9zb3VyY2UvbGljZW5zZS5odG1sCisgICAtIEFwYWNoZSAyLjAgICAgICAgIDogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQkxBS0UyIGhhc2ggZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGF0CisgICBodHRwczovL2JsYWtlMi5uZXQuCisqLworI3ByYWdtYSBvbmNlCisjaWZuZGVmIF9fQkxBS0UyU19MT0FEX1NTRTJfSF9fCisjZGVmaW5lIF9fQkxBS0UyU19MT0FEX1NTRTJfSF9fCisKKyNkZWZpbmUgTE9BRF9NU0dfMF8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtNixtNCxtMixtMCkKKyNkZWZpbmUgTE9BRF9NU0dfMF8yKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtNyxtNSxtMyxtMSkKKyNkZWZpbmUgTE9BRF9NU0dfMF8zKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTQsbTEyLG0xMCxtOCkKKyNkZWZpbmUgTE9BRF9NU0dfMF80KGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTUsbTEzLG0xMSxtOSkKKyNkZWZpbmUgTE9BRF9NU0dfMV8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTMsbTksbTQsbTE0KQorI2RlZmluZSBMT0FEX01TR18xXzIoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG02LG0xNSxtOCxtMTApCisjZGVmaW5lIExPQURfTVNHXzFfMyhidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTUsbTExLG0wLG0xKQorI2RlZmluZSBMT0FEX01TR18xXzQoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0zLG03LG0yLG0xMikKKyNkZWZpbmUgTE9BRF9NU0dfMl8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTUsbTUsbTEyLG0xMSkKKyNkZWZpbmUgTE9BRF9NU0dfMl8yKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTMsbTIsbTAsbTgpCisjZGVmaW5lIExPQURfTVNHXzJfMyhidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTksbTcsbTMsbTEwKQorI2RlZmluZSBMT0FEX01TR18yXzQoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG00LG0xLG02LG0xNCkKKyNkZWZpbmUgTE9BRF9NU0dfM18xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTEsbTEzLG0zLG03KQorI2RlZmluZSBMT0FEX01TR18zXzIoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0xNCxtMTIsbTEsbTkpCisjZGVmaW5lIExPQURfTVNHXzNfMyhidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTE1LG00LG01LG0yKQorI2RlZmluZSBMT0FEX01TR18zXzQoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG04LG0wLG0xMCxtNikKKyNkZWZpbmUgTE9BRF9NU0dfNF8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTAsbTIsbTUsbTkpCisjZGVmaW5lIExPQURfTVNHXzRfMihidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTE1LG00LG03LG0wKQorI2RlZmluZSBMT0FEX01TR180XzMoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0zLG02LG0xMSxtMTQpCisjZGVmaW5lIExPQURfTVNHXzRfNChidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTEzLG04LG0xMixtMSkKKyNkZWZpbmUgTE9BRF9NU0dfNV8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtOCxtMCxtNixtMikKKyNkZWZpbmUgTE9BRF9NU0dfNV8yKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMyxtMTEsbTEwLG0xMikKKyNkZWZpbmUgTE9BRF9NU0dfNV8zKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMSxtMTUsbTcsbTQpCisjZGVmaW5lIExPQURfTVNHXzVfNChidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTksbTE0LG01LG0xMykKKyNkZWZpbmUgTE9BRF9NU0dfNl8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtNCxtMTQsbTEsbTEyKQorI2RlZmluZSBMT0FEX01TR182XzIoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0xMCxtMTMsbTE1LG01KQorI2RlZmluZSBMT0FEX01TR182XzMoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG04LG05LG02LG0wKQorI2RlZmluZSBMT0FEX01TR182XzQoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0xMSxtMixtMyxtNykKKyNkZWZpbmUgTE9BRF9NU0dfN18xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMyxtMTIsbTcsbTEzKQorI2RlZmluZSBMT0FEX01TR183XzIoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG05LG0xLG0xNCxtMTEpCisjZGVmaW5lIExPQURfTVNHXzdfMyhidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTIsbTgsbTE1LG01KQorI2RlZmluZSBMT0FEX01TR183XzQoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0xMCxtNixtNCxtMCkKKyNkZWZpbmUgTE9BRF9NU0dfOF8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMCxtMTEsbTE0LG02KQorI2RlZmluZSBMT0FEX01TR184XzIoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG04LG0zLG05LG0xNSkKKyNkZWZpbmUgTE9BRF9NU0dfOF8zKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTAsbTEsbTEzLG0xMikKKyNkZWZpbmUgTE9BRF9NU0dfOF80KGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtNSxtNCxtNyxtMikKKyNkZWZpbmUgTE9BRF9NU0dfOV8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMSxtNyxtOCxtMTApCisjZGVmaW5lIExPQURfTVNHXzlfMihidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTUsbTYsbTQsbTIpCisjZGVmaW5lIExPQURfTVNHXzlfMyhidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTEzLG0zLG05LG0xNSkKKyNkZWZpbmUgTE9BRF9NU0dfOV80KGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMCxtMTIsbTE0LG0xMSkKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC1zc2U0MS5oIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1sb2FkLXNzZTQxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiZjBjZAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC1zc2U0MS5oCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gb3B0aW1pemVkIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgX19CTEFLRTJTX0xPQURfU1NFNDFfSF9fCisjZGVmaW5lIF9fQkxBS0UyU19MT0FEX1NTRTQxX0hfXworCisjZGVmaW5lIExPQURfTVNHXzBfMShidWYpIFwKK2J1ZiA9IFRPSShfbW1fc2h1ZmZsZV9wcyhUT0YobTApLCBUT0YobTEpLCBfTU1fU0hVRkZMRSgyLDAsMiwwKSkpOworCisjZGVmaW5lIExPQURfTVNHXzBfMihidWYpIFwKK2J1ZiA9IFRPSShfbW1fc2h1ZmZsZV9wcyhUT0YobTApLCBUT0YobTEpLCBfTU1fU0hVRkZMRSgzLDEsMywxKSkpOworCisjZGVmaW5lIExPQURfTVNHXzBfMyhidWYpIFwKK2J1ZiA9IFRPSShfbW1fc2h1ZmZsZV9wcyhUT0YobTIpLCBUT0YobTMpLCBfTU1fU0hVRkZMRSgyLDAsMiwwKSkpOworCisjZGVmaW5lIExPQURfTVNHXzBfNChidWYpIFwKK2J1ZiA9IFRPSShfbW1fc2h1ZmZsZV9wcyhUT0YobTIpLCBUT0YobTMpLCBfTU1fU0hVRkZMRSgzLDEsMywxKSkpOworCisjZGVmaW5lIExPQURfTVNHXzFfMShidWYpIFwKK3QwID0gX21tX2JsZW5kX2VwaTE2KG0xLCBtMiwgMHgwQyk7IFwKK3QxID0gX21tX3NsbGlfc2kxMjgobTMsIDQpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCwgdDEsIDB4RjApOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MiwgX01NX1NIVUZGTEUoMiwxLDAsMykpOworCisjZGVmaW5lIExPQURfTVNHXzFfMihidWYpIFwKK3QwID0gX21tX3NodWZmbGVfZXBpMzIobTIsX01NX1NIVUZGTEUoMCwwLDIsMCkpOyBcCit0MSA9IF9tbV9ibGVuZF9lcGkxNihtMSxtMywweEMwKTsgXAordDIgPSBfbW1fYmxlbmRfZXBpMTYodDAsIHQxLCAweEYwKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDIsMywwLDEpKTsKKworI2RlZmluZSBMT0FEX01TR18xXzMoYnVmKSBcCit0MCA9IF9tbV9zbGxpX3NpMTI4KG0xLCA0KTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTIsIHQwLCAweDMwKTsgXAordDIgPSBfbW1fYmxlbmRfZXBpMTYobTAsIHQxLCAweEYwKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDIsMywwLDEpKTsKKworI2RlZmluZSBMT0FEX01TR18xXzQoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMCxtMSk7IFwKK3QxID0gX21tX3NsbGlfc2kxMjgobTMsIDQpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCwgdDEsIDB4MEMpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MiwgX01NX1NIVUZGTEUoMiwzLDAsMSkpOworCisjZGVmaW5lIExPQURfTVNHXzJfMShidWYpIFwKK3QwID0gX21tX3VucGFja2hpX2VwaTMyKG0yLG0zKTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTMsbTEsMHgwQyk7IFwKK3QyID0gX21tX2JsZW5kX2VwaTE2KHQwLCB0MSwgMHgwRik7IFwKK2J1ZiA9IF9tbV9zaHVmZmxlX2VwaTMyKHQyLCBfTU1fU0hVRkZMRSgzLDEsMCwyKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMl8yKGJ1ZikgXAordDAgPSBfbW1fdW5wYWNrbG9fZXBpMzIobTIsbTApOyBcCit0MSA9IF9tbV9ibGVuZF9lcGkxNih0MCwgbTAsIDB4RjApOyBcCit0MiA9IF9tbV9zbGxpX3NpMTI4KG0zLCA4KTsgXAorYnVmID0gX21tX2JsZW5kX2VwaTE2KHQxLCB0MiwgMHhDMCk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMl8zKGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTAsIG0yLCAweDNDKTsgXAordDEgPSBfbW1fc3JsaV9zaTEyOChtMSwgMTIpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCx0MSwweDAzKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDEsMCwzLDIpKTsKKworI2RlZmluZSBMT0FEX01TR18yXzQoYnVmKSBcCit0MCA9IF9tbV9zbGxpX3NpMTI4KG0zLCA0KTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTAsIG0xLCAweDMzKTsgXAordDIgPSBfbW1fYmxlbmRfZXBpMTYodDEsIHQwLCAweEMwKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDAsMSwyLDMpKTsKKworI2RlZmluZSBMT0FEX01TR18zXzEoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMCxtMSk7IFwKK3QxID0gX21tX3VucGFja2hpX2VwaTMyKHQwLCBtMik7IFwKK3QyID0gX21tX2JsZW5kX2VwaTE2KHQxLCBtMywgMHgwQyk7IFwKK2J1ZiA9IF9tbV9zaHVmZmxlX2VwaTMyKHQyLCBfTU1fU0hVRkZMRSgzLDEsMCwyKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfM18yKGJ1ZikgXAordDAgPSBfbW1fc2xsaV9zaTEyOChtMiwgOCk7IFwKK3QxID0gX21tX2JsZW5kX2VwaTE2KG0zLG0wLDB4MEMpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MSwgdDAsIDB4QzApOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MiwgX01NX1NIVUZGTEUoMiwwLDEsMykpOworCisjZGVmaW5lIExPQURfTVNHXzNfMyhidWYpIFwKK3QwID0gX21tX2JsZW5kX2VwaTE2KG0wLG0xLDB4MEYpOyBcCit0MSA9IF9tbV9ibGVuZF9lcGkxNih0MCwgbTMsIDB4QzApOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MSwgX01NX1NIVUZGTEUoMywwLDEsMikpOworCisjZGVmaW5lIExPQURfTVNHXzNfNChidWYpIFwKK3QwID0gX21tX3VucGFja2xvX2VwaTMyKG0wLG0yKTsgXAordDEgPSBfbW1fdW5wYWNraGlfZXBpMzIobTEsbTIpOyBcCitidWYgPSBfbW1fdW5wYWNrbG9fZXBpNjQodDEsdDApOworCisjZGVmaW5lIExPQURfTVNHXzRfMShidWYpIFwKK3QwID0gX21tX3VucGFja2xvX2VwaTY0KG0xLG0yKTsgXAordDEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTAsbTIpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCx0MSwweDMzKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDIsMCwxLDMpKTsKKworI2RlZmluZSBMT0FEX01TR180XzIoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGk2NChtMSxtMyk7IFwKK3QxID0gX21tX3VucGFja2xvX2VwaTY0KG0wLG0xKTsgXAorYnVmID0gX21tX2JsZW5kX2VwaTE2KHQwLHQxLDB4MzMpOworCisjZGVmaW5lIExPQURfTVNHXzRfMyhidWYpIFwKK3QwID0gX21tX3VucGFja2hpX2VwaTY0KG0zLG0xKTsgXAordDEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTIsbTApOyBcCitidWYgPSBfbW1fYmxlbmRfZXBpMTYodDEsdDAsMHgzMyk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNF80KGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTAsbTIsMHgwMyk7IFwKK3QxID0gX21tX3NsbGlfc2kxMjgodDAsIDgpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MSxtMywweDBGKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDEsMiwwLDMpKTsKKworI2RlZmluZSBMT0FEX01TR181XzEoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMCxtMSk7IFwKK3QxID0gX21tX3VucGFja2xvX2VwaTMyKG0wLG0yKTsgXAorYnVmID0gX21tX3VucGFja2xvX2VwaTY0KHQwLHQxKTsKKworI2RlZmluZSBMT0FEX01TR181XzIoYnVmKSBcCit0MCA9IF9tbV9zcmxpX3NpMTI4KG0yLCA0KTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTAsbTMsMHgwMyk7IFwKK2J1ZiA9IF9tbV9ibGVuZF9lcGkxNih0MSx0MCwweDNDKTsKKworI2RlZmluZSBMT0FEX01TR181XzMoYnVmKSBcCit0MCA9IF9tbV9ibGVuZF9lcGkxNihtMSxtMCwweDBDKTsgXAordDEgPSBfbW1fc3JsaV9zaTEyOChtMywgNCk7IFwKK3QyID0gX21tX2JsZW5kX2VwaTE2KHQwLHQxLDB4MzApOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MiwgX01NX1NIVUZGTEUoMSwyLDMsMCkpOworCisjZGVmaW5lIExPQURfTVNHXzVfNChidWYpIFwKK3QwID0gX21tX3VucGFja2xvX2VwaTY0KG0xLG0yKTsgXAordDE9IF9tbV9zaHVmZmxlX2VwaTMyKG0zLCBfTU1fU0hVRkZMRSgwLDIsMCwxKSk7IFwKK2J1ZiA9IF9tbV9ibGVuZF9lcGkxNih0MCx0MSwweDMzKTsKKworI2RlZmluZSBMT0FEX01TR182XzEoYnVmKSBcCit0MCA9IF9tbV9zbGxpX3NpMTI4KG0xLCAxMik7IFwKK3QxID0gX21tX2JsZW5kX2VwaTE2KG0wLG0zLDB4MzMpOyBcCitidWYgPSBfbW1fYmxlbmRfZXBpMTYodDEsdDAsMHhDMCk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNl8yKGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTMsbTIsMHgzMCk7IFwKK3QxID0gX21tX3NybGlfc2kxMjgobTEsIDQpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCx0MSwweDAzKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDIsMSwzLDApKTsKKworI2RlZmluZSBMT0FEX01TR182XzMoYnVmKSBcCit0MCA9IF9tbV91bnBhY2tsb19lcGk2NChtMCxtMik7IFwKK3QxID0gX21tX3NybGlfc2kxMjgobTEsIDQpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMihfbW1fYmxlbmRfZXBpMTYodDAsdDEsMHgwQyksIF9NTV9TSFVGRkxFKDIsMywxLDApKTsKKworI2RlZmluZSBMT0FEX01TR182XzQoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMSxtMik7IFwKK3QxID0gX21tX3VucGFja2hpX2VwaTY0KG0wLHQwKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDEsIF9NTV9TSFVGRkxFKDMsMCwxLDIpKTsKKworI2RlZmluZSBMT0FEX01TR183XzEoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMCxtMSk7IFwKK3QxID0gX21tX2JsZW5kX2VwaTE2KHQwLG0zLDB4MEYpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MSxfTU1fU0hVRkZMRSgyLDAsMywxKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfN18yKGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTIsbTMsMHgzMCk7IFwKK3QxID0gX21tX3NybGlfc2kxMjgobTAsNCk7IFwKK3QyID0gX21tX2JsZW5kX2VwaTE2KHQwLHQxLDB4MDMpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MiwgX01NX1NIVUZGTEUoMSwwLDIsMykpOworCisjZGVmaW5lIExPQURfTVNHXzdfMyhidWYpIFwKK3QwID0gX21tX3VucGFja2hpX2VwaTY0KG0wLG0zKTsgXAordDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTEsbTIpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCx0MSwweDNDKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsX01NX1NIVUZGTEUoMCwyLDMsMSkpOworCisjZGVmaW5lIExPQURfTVNHXzdfNChidWYpIFwKK3QwID0gX21tX3VucGFja2xvX2VwaTMyKG0wLG0xKTsgXAordDEgPSBfbW1fdW5wYWNraGlfZXBpMzIobTEsbTIpOyBcCitidWYgPSBfbW1fdW5wYWNrbG9fZXBpNjQodDAsdDEpOworCisjZGVmaW5lIExPQURfTVNHXzhfMShidWYpIFwKK3QwID0gX21tX3VucGFja2hpX2VwaTMyKG0xLG0zKTsgXAordDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQodDAsbTApOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MSxtMiwweEMwKTsgXAorYnVmID0gX21tX3NodWZmbGVoaV9lcGkxNih0MixfTU1fU0hVRkZMRSgxLDAsMywyKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfOF8yKGJ1ZikgXAordDAgPSBfbW1fdW5wYWNraGlfZXBpMzIobTAsbTMpOyBcCit0MSA9IF9tbV9ibGVuZF9lcGkxNihtMix0MCwweEYwKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDEsX01NX1NIVUZGTEUoMCwyLDEsMykpOworCisjZGVmaW5lIExPQURfTVNHXzhfMyhidWYpIFwKK3QwID0gX21tX2JsZW5kX2VwaTE2KG0yLG0wLDB4MEMpOyBcCit0MSA9IF9tbV9zbGxpX3NpMTI4KHQwLDQpOyBcCitidWYgPSBfbW1fYmxlbmRfZXBpMTYodDEsbTMsMHgwRik7CisKKyNkZWZpbmUgTE9BRF9NU0dfOF80KGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTEsbTAsMHgzMCk7IFwKK2J1ZiA9IF9tbV9zaHVmZmxlX2VwaTMyKHQwLF9NTV9TSFVGRkxFKDEsMCwzLDIpKTsKKworI2RlZmluZSBMT0FEX01TR185XzEoYnVmKSBcCit0MCA9IF9tbV9ibGVuZF9lcGkxNihtMCxtMiwweDAzKTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTEsbTIsMHgzMCk7IFwKK3QyID0gX21tX2JsZW5kX2VwaTE2KHQxLHQwLDB4MEYpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MixfTU1fU0hVRkZMRSgxLDMsMCwyKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfOV8yKGJ1ZikgXAordDAgPSBfbW1fc2xsaV9zaTEyOChtMCw0KTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTEsdDAsMHhDMCk7IFwKK2J1ZiA9IF9tbV9zaHVmZmxlX2VwaTMyKHQxLF9NTV9TSFVGRkxFKDEsMiwwLDMpKTsKKworI2RlZmluZSBMT0FEX01TR185XzMoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMCxtMyk7IFwKK3QxID0gX21tX3VucGFja2xvX2VwaTMyKG0yLG0zKTsgXAordDIgPSBfbW1fdW5wYWNraGlfZXBpNjQodDAsdDEpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MixfTU1fU0hVRkZMRSgzLDAsMiwxKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfOV80KGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTMsbTIsMHhDMCk7IFwKK3QxID0gX21tX3VucGFja2xvX2VwaTMyKG0wLG0zKTsgXAordDIgPSBfbW1fYmxlbmRfZXBpMTYodDAsdDEsMHgwRik7IFwKK2J1ZiA9IF9tbV9zaHVmZmxlX2VwaTMyKHQyLF9NTV9TSFVGRkxFKDAsMSwyLDMpKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC14b3AuaCBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC14b3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2I1ZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1sb2FkLXhvcC5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gb3B0aW1pemVkIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgX19CTEFLRTJTX0xPQURfWE9QX0hfXworI2RlZmluZSBfX0JMQUtFMlNfTE9BRF9YT1BfSF9fCisKKyNkZWZpbmUgVE9CKHgpICgoeCkqNCoweDAxMDEwMTAxICsgMHgwMzAyMDEwMCkgLyogLi5vciBub3QgVE9CICovCisKKy8qIEJhc2ljIFZQUEVSTSBlbXVsYXRpb24sIGZvciB0ZXN0aW5nIHB1cnBvc2VzICovCisvKnN0YXRpYyBfX20xMjhpIF9tbV9wZXJtX2VwaTgoY29uc3QgX19tMTI4aSBzcmMxLCBjb25zdCBfX20xMjhpIHNyYzIsIGNvbnN0IF9fbTEyOGkgc2VsKQoreworICAgY29uc3QgX19tMTI4aSBzaXh0ZWVuID0gX21tX3NldDFfZXBpOCgxNik7CisgICBjb25zdCBfX20xMjhpIHQwID0gX21tX3NodWZmbGVfZXBpOChzcmMxLCBzZWwpOworICAgY29uc3QgX19tMTI4aSBzMSA9IF9tbV9zaHVmZmxlX2VwaTgoc3JjMiwgX21tX3N1Yl9lcGk4KHNlbCwgc2l4dGVlbikpOworICAgY29uc3QgX19tMTI4aSBtYXNrID0gX21tX29yX3NpMTI4KF9tbV9jbXBlcV9lcGk4KHNlbCwgc2l4dGVlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX2NtcGd0X2VwaTgoc2VsLCBzaXh0ZWVuKSk7IC8qICg+PTE2KSA9IDB4ZmYgOiAwMCAqLworICAgcmV0dXJuIF9tbV9ibGVuZHZfZXBpOCh0MCwgczEsIG1hc2spOworfSovCisKKyNkZWZpbmUgTE9BRF9NU0dfMF8xKGJ1ZikgXAorYnVmID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDYpLFRPQig0KSxUT0IoMiksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzBfMihidWYpIFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQig3KSxUT0IoNSksVE9CKDMpLFRPQigxKSkgKTsKKworI2RlZmluZSBMT0FEX01TR18wXzMoYnVmKSBcCitidWYgPSBfbW1fcGVybV9lcGk4KG0yLCBtMywgX21tX3NldF9lcGkzMihUT0IoNiksVE9CKDQpLFRPQigyKSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMF80KGJ1ZikgXAorYnVmID0gX21tX3Blcm1fZXBpOChtMiwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDcpLFRPQig1KSxUT0IoMyksVE9CKDEpKSApOworCisjZGVmaW5lIExPQURfTVNHXzFfMShidWYpIFwKK3QwID0gX21tX3Blcm1fZXBpOChtMSwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQig1KSxUT0IoMCksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMywgX21tX3NldF9lcGkzMihUT0IoNSksVE9CKDIpLFRPQigxKSxUT0IoNikpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMV8yKGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0xLCBtMiwgX21tX3NldF9lcGkzMihUT0IoMiksVE9CKDApLFRPQig0KSxUT0IoNikpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNyksVE9CKDEpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR18xXzMoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoMCksVE9CKDApLFRPQigxKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQig3KSxUT0IoMSksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzFfNChidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQig3KSxUT0IoMiksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDIpLFRPQigxKSxUT0IoNCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMl8xKGJ1ZikgXAordDAgPSBfbW1fcGVybV9lcGk4KG0xLCBtMiwgX21tX3NldF9lcGkzMihUT0IoMCksVE9CKDEpLFRPQigwKSxUT0IoNykpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDAsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQig3KSxUT0IoMiksVE9CKDQpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR18yXzIoYnVmKSBcCit0MSA9IF9tbV9wZXJtX2VwaTgobTAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMiksVE9CKDApLFRPQig0KSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MSwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDUpLFRPQigyKSxUT0IoMSksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzJfMyhidWYpIFwKK3QwID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQig3KSxUT0IoMyksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNSksVE9CKDIpLFRPQigxKSxUT0IoNikpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMl80KGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoNCksVE9CKDEpLFRPQig2KSxUT0IoMCkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoMiksVE9CKDEpLFRPQig2KSkgKTsKKworI2RlZmluZSBMT0FEX01TR18zXzEoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMCksVE9CKDMpLFRPQig3KSkgKTsgXAordDAgPSBfbW1fcGVybV9lcGk4KHQwLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNyksVE9CKDIpLFRPQigxKSxUT0IoMCkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDAsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNSksVE9CKDEpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR18zXzIoYnVmKSBcCit0MSA9IF9tbV9wZXJtX2VwaTgobTAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMCksVE9CKDEpLFRPQig1KSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MSwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDYpLFRPQig0KSxUT0IoMSksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzNfMyhidWYpIFwKK3QwID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQig0KSxUT0IoNSksVE9CKDIpKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMywgX21tX3NldF9lcGkzMihUT0IoNyksVE9CKDIpLFRPQigxKSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfM180KGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoMCksVE9CKDApLFRPQigwKSxUT0IoNikpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQig0KSxUT0IoMiksVE9CKDYpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR180XzEoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMiksVE9CKDUpLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDYpLFRPQigyKSxUT0IoMSksVE9CKDUpKSApOworCisjZGVmaW5lIExPQURfTVNHXzRfMihidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQig0KSxUT0IoNyksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMywgX21tX3NldF9lcGkzMihUT0IoNyksVE9CKDIpLFRPQigxKSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNF8zKGJ1ZikgXAordDAgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDYpLFRPQigwKSxUT0IoMCkpICk7IFwKK3QwID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQigyKSxUT0IoNyksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDIpLFRPQigxKSxUT0IoNikpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNF80KGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0wLCBtMiwgX21tX3NldF9lcGkzMihUT0IoMCksVE9CKDQpLFRPQigwKSxUT0IoMSkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoMiksVE9CKDQpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR181XzEoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMCksVE9CKDYpLFRPQigyKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDQpLFRPQigyKSxUT0IoMSksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzVfMihidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQig3KSxUT0IoNiksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDIpLFRPQigxKSxUT0IoNCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNV8zKGJ1ZikgXAordDAgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoMSksVE9CKDApLFRPQig3KSxUT0IoNCkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDAsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNyksVE9CKDEpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR181XzQoYnVmKSBcCit0MSA9IF9tbV9wZXJtX2VwaTgobTEsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoMCksVE9CKDEpLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MSwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQig2KSxUT0IoMSksVE9CKDUpKSApOworCisjZGVmaW5lIExPQURfTVNHXzZfMShidWYpIFwKK3QwID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDQpLFRPQigwKSxUT0IoMSksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDYpLFRPQigxKSxUT0IoNCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNl8yKGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0xLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNiksVE9CKDApLFRPQigwKSxUT0IoMSkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNSksVE9CKDcpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR182XzMoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMCksVE9CKDYpLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDQpLFRPQig1KSxUT0IoMSksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzZfNChidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQigyKSxUT0IoMyksVE9CKDcpKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNyksVE9CKDIpLFRPQigxKSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfN18xKGJ1ZikgXAordDAgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDApLFRPQig3KSxUT0IoMCkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDAsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNCksVE9CKDEpLFRPQig1KSkgKTsKKworI2RlZmluZSBMT0FEX01TR183XzIoYnVmKSBcCit0MSA9IF9tbV9wZXJtX2VwaTgobTAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoMSksVE9CKDApLFRPQig3KSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MSwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQigyKSxUT0IoNiksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzdfMyhidWYpIFwKK3QwID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDIpLFRPQigwKSxUT0IoMCksVE9CKDUpKSApOyBcCit0MCA9IF9tbV9wZXJtX2VwaTgodDAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNCksVE9CKDEpLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQigyKSxUT0IoNyksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzdfNChidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQig2KSxUT0IoNCksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNiksVE9CKDIpLFRPQigxKSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfOF8xKGJ1ZikgXAordDAgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoMCksVE9CKDApLFRPQigwKSxUT0IoNikpICk7IFwKK3QwID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQig3KSxUT0IoMSksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDIpLFRPQig2KSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfOF8yKGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0wLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNCksVE9CKDMpLFRPQig1KSxUT0IoMCkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoMiksVE9CKDEpLFRPQig3KSkgKTsKKworI2RlZmluZSBMT0FEX01TR184XzMoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQig2KSxUT0IoMSksVE9CKDApLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQigyKSxUT0IoNSksVE9CKDQpKSApOyBcCisgCisjZGVmaW5lIExPQURfTVNHXzhfNChidWYpIFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoNCksVE9CKDcpLFRPQigyKSkgKTsKKworI2RlZmluZSBMT0FEX01TR185XzEoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQigxKSxUT0IoNyksVE9CKDApLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQigyKSxUT0IoNCksVE9CKDYpKSApOworCisjZGVmaW5lIExPQURfTVNHXzlfMihidWYpIFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoNiksVE9CKDQpLFRPQigyKSkgKTsKKworI2RlZmluZSBMT0FEX01TR185XzMoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMyksVE9CKDUpLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDUpLFRPQigyKSxUT0IoMSksVE9CKDcpKSApOworCisjZGVmaW5lIExPQURfTVNHXzlfNChidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQigwKSxUT0IoMCksVE9CKDcpKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDQpLFRPQig2KSxUT0IoMCkpICk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJzLXJlZi5jIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1yZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjM2NzUzCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1yZWYuYwpAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAgIEJMQUtFMiByZWZlcmVuY2Ugc291cmNlIGNvZGUgcGFja2FnZSAtIHJlZmVyZW5jZSBDIGltcGxlbWVudGF0aW9ucworICAKKyAgIENvcHlyaWdodCAyMDEyLCBTYW11ZWwgTmV2ZXMgPHNuZXZlc0BkZWkudWMucHQ+LiAgWW91IG1heSB1c2UgdGhpcyB1bmRlciB0aGUKKyAgIHRlcm1zIG9mIHRoZSBDQzAsIHRoZSBPcGVuU1NMIExpY2VuY2UsIG9yIHRoZSBBcGFjaGUgUHVibGljIExpY2Vuc2UgMi4wLCBhdAorICAgeW91ciBvcHRpb24uICBUaGUgdGVybXMgb2YgdGhlc2UgbGljZW5zZXMgY2FuIGJlIGZvdW5kIGF0OgorICAKKyAgIC0gQ0MwIDEuMCBVbml2ZXJzYWwgOiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAKKyAgIC0gT3BlblNTTCBsaWNlbnNlICAgOiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9zb3VyY2UvbGljZW5zZS5odG1sCisgICAtIEFwYWNoZSAyLjAgICAgICAgIDogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQkxBS0UyIGhhc2ggZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGF0CisgICBodHRwczovL2JsYWtlMi5uZXQuCisqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImJsYWtlMi5oIgorI2luY2x1ZGUgImJsYWtlMi1pbXBsLmgiCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBibGFrZTJzX0lWWzhdID0KK3sKKyAgMHg2QTA5RTY2N1VMLCAweEJCNjdBRTg1VUwsIDB4M0M2RUYzNzJVTCwgMHhBNTRGRjUzQVVMLAorICAweDUxMEU1MjdGVUwsIDB4OUIwNTY4OENVTCwgMHgxRjgzRDlBQlVMLCAweDVCRTBDRDE5VUwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJsYWtlMnNfc2lnbWFbMTBdWzE2XSA9Cit7CisgIHsgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfSAsCisgIHsgMTQsIDEwLCAgNCwgIDgsICA5LCAxNSwgMTMsICA2LCAgMSwgMTIsICAwLCAgMiwgMTEsICA3LCAgNSwgIDMgfSAsCisgIHsgMTEsICA4LCAxMiwgIDAsICA1LCAgMiwgMTUsIDEzLCAxMCwgMTQsICAzLCAgNiwgIDcsICAxLCAgOSwgIDQgfSAsCisgIHsgIDcsICA5LCAgMywgIDEsIDEzLCAxMiwgMTEsIDE0LCAgMiwgIDYsICA1LCAxMCwgIDQsICAwLCAxNSwgIDggfSAsCisgIHsgIDksICAwLCAgNSwgIDcsICAyLCAgNCwgMTAsIDE1LCAxNCwgIDEsIDExLCAxMiwgIDYsICA4LCAgMywgMTMgfSAsCisgIHsgIDIsIDEyLCAgNiwgMTAsICAwLCAxMSwgIDgsICAzLCAgNCwgMTMsICA3LCAgNSwgMTUsIDE0LCAgMSwgIDkgfSAsCisgIHsgMTIsICA1LCAgMSwgMTUsIDE0LCAxMywgIDQsIDEwLCAgMCwgIDcsICA2LCAgMywgIDksICAyLCAgOCwgMTEgfSAsCisgIHsgMTMsIDExLCAgNywgMTQsIDEyLCAgMSwgIDMsICA5LCAgNSwgIDAsIDE1LCAgNCwgIDgsICA2LCAgMiwgMTAgfSAsCisgIHsgIDYsIDE1LCAxNCwgIDksIDExLCAgMywgIDAsICA4LCAxMiwgIDIsIDEzLCAgNywgIDEsICA0LCAxMCwgIDUgfSAsCisgIHsgMTAsICAyLCAgOCwgIDQsICA3LCAgNiwgIDEsICA1LCAxNSwgMTEsICA5LCAxNCwgIDMsIDEyLCAxMyAsIDAgfSAsCit9OworCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19zZXRfbGFzdG5vZGUoIGJsYWtlMnNfc3RhdGUgKlMgKQoreworICBTLT5mWzFdID0gLTE7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19jbGVhcl9sYXN0bm9kZSggYmxha2Uyc19zdGF0ZSAqUyApCit7CisgIFMtPmZbMV0gPSAwOworICByZXR1cm4gMDsKK30KKworLyogU29tZSBoZWxwZXIgZnVuY3Rpb25zLCBub3QgbmVjZXNzYXJpbHkgdXNlZnVsICovCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19pc19sYXN0YmxvY2soIGNvbnN0IGJsYWtlMnNfc3RhdGUgKlMgKQoreworICByZXR1cm4gUy0+ZlswXSAhPSAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19zZXRfbGFzdGJsb2NrKCBibGFrZTJzX3N0YXRlICpTICkKK3sKKyAgaWYoIFMtPmxhc3Rfbm9kZSApIGJsYWtlMnNfc2V0X2xhc3Rub2RlKCBTICk7CisKKyAgUy0+ZlswXSA9IC0xOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfY2xlYXJfbGFzdGJsb2NrKCBibGFrZTJzX3N0YXRlICpTICkKK3sKKyAgaWYoIFMtPmxhc3Rfbm9kZSApIGJsYWtlMnNfY2xlYXJfbGFzdG5vZGUoIFMgKTsKKworICBTLT5mWzBdID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX2luY3JlbWVudF9jb3VudGVyKCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCB1aW50MzJfdCBpbmMgKQoreworICBTLT50WzBdICs9IGluYzsKKyAgUy0+dFsxXSArPSAoIFMtPnRbMF0gPCBpbmMgKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFBhcmFtZXRlci1yZWxhdGVkIGZ1bmN0aW9ucyAqLworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfcGFyYW1fc2V0X2RpZ2VzdF9sZW5ndGgoIGJsYWtlMnNfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgZGlnZXN0X2xlbmd0aCApCit7CisgIFAtPmRpZ2VzdF9sZW5ndGggPSBkaWdlc3RfbGVuZ3RoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfcGFyYW1fc2V0X2Zhbm91dCggYmxha2Uyc19wYXJhbSAqUCwgY29uc3QgdWludDhfdCBmYW5vdXQgKQoreworICBQLT5mYW5vdXQgPSBmYW5vdXQ7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfbWF4X2RlcHRoKCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGRlcHRoICkKK3sKKyAgUC0+ZGVwdGggPSBkZXB0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3BhcmFtX3NldF9sZWFmX2xlbmd0aCggYmxha2Uyc19wYXJhbSAqUCwgY29uc3QgdWludDMyX3QgbGVhZl9sZW5ndGggKQoreworICBzdG9yZTMyKCAmUC0+bGVhZl9sZW5ndGgsIGxlYWZfbGVuZ3RoICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfbm9kZV9vZmZzZXQoIGJsYWtlMnNfcGFyYW0gKlAsIGNvbnN0IHVpbnQ2NF90IG5vZGVfb2Zmc2V0ICkKK3sKKyAgc3RvcmU0OCggUC0+bm9kZV9vZmZzZXQsIG5vZGVfb2Zmc2V0ICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfbm9kZV9kZXB0aCggYmxha2Uyc19wYXJhbSAqUCwgY29uc3QgdWludDhfdCBub2RlX2RlcHRoICkKK3sKKyAgUC0+bm9kZV9kZXB0aCA9IG5vZGVfZGVwdGg7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfaW5uZXJfbGVuZ3RoKCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGlubmVyX2xlbmd0aCApCit7CisgIFAtPmlubmVyX2xlbmd0aCA9IGlubmVyX2xlbmd0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3BhcmFtX3NldF9zYWx0KCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IHNhbHRbQkxBS0UyU19TQUxUQllURVNdICkKK3sKKyAgbWVtY3B5KCBQLT5zYWx0LCBzYWx0LCBCTEFLRTJTX1NBTFRCWVRFUyApOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfcGFyYW1fc2V0X3BlcnNvbmFsKCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IHBlcnNvbmFsW0JMQUtFMlNfUEVSU09OQUxCWVRFU10gKQoreworICBtZW1jcHkoIFAtPnBlcnNvbmFsLCBwZXJzb25hbCwgQkxBS0UyU19QRVJTT05BTEJZVEVTICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19pbml0MCggYmxha2Uyc19zdGF0ZSAqUyApCit7CisgIGludCBpOworICBtZW1zZXQoIFMsIDAsIHNpemVvZiggYmxha2Uyc19zdGF0ZSApICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApIFMtPmhbaV0gPSBibGFrZTJzX0lWW2ldOworCisgIHJldHVybiAwOworfQorCisvKiBpbml0MiB4b3JzIElWIHdpdGggaW5wdXQgcGFyYW1ldGVyIGJsb2NrICovCitpbnQgYmxha2Uyc19pbml0X3BhcmFtKCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCBibGFrZTJzX3BhcmFtICpQICkKK3sKKyAgY29uc3QgdWludDMyX3QgKnAgPSAoIGNvbnN0IHVpbnQzMl90ICogKSggUCApOworICBzaXplX3QgaTsKKworICBibGFrZTJzX2luaXQwKCBTICk7CisKKyAgLyogSVYgWE9SIFBhcmFtQmxvY2sgKi8KKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisgICAgUy0+aFtpXSBePSBsb2FkMzIoICZwW2ldICk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogU2VxdWVudGlhbCBibGFrZTJzIGluaXRpYWxpemF0aW9uICovCitpbnQgYmxha2Uyc19pbml0KCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiApCit7CisgIGJsYWtlMnNfcGFyYW0gUFsxXTsKKworICAvKiBNb3ZlIGludGVydmFsIHZlcmlmaWNhdGlvbiBoZXJlPyAqLworICBpZiAoICggIW91dGxlbiApIHx8ICggb3V0bGVuID4gQkxBS0UyU19PVVRCWVRFUyApICkgcmV0dXJuIC0xOworCisgIFAtPmRpZ2VzdF9sZW5ndGggPSBvdXRsZW47CisgIFAtPmtleV9sZW5ndGggICAgPSAwOworICBQLT5mYW5vdXQgICAgICAgID0gMTsKKyAgUC0+ZGVwdGggICAgICAgICA9IDE7CisgIHN0b3JlMzIoICZQLT5sZWFmX2xlbmd0aCwgMCApOworICBzdG9yZTQ4KCAmUC0+bm9kZV9vZmZzZXQsIDAgKTsKKyAgUC0+bm9kZV9kZXB0aCAgICA9IDA7CisgIFAtPmlubmVyX2xlbmd0aCAgPSAwOworICAvKiBtZW1zZXQoUC0+cmVzZXJ2ZWQsIDAsIHNpemVvZihQLT5yZXNlcnZlZCkgKTsgKi8KKyAgbWVtc2V0KCBQLT5zYWx0LCAgICAgMCwgc2l6ZW9mKCBQLT5zYWx0ICkgKTsKKyAgbWVtc2V0KCBQLT5wZXJzb25hbCwgMCwgc2l6ZW9mKCBQLT5wZXJzb25hbCApICk7CisgIHJldHVybiBibGFrZTJzX2luaXRfcGFyYW0oIFMsIFAgKTsKK30KKworaW50IGJsYWtlMnNfaW5pdF9rZXkoIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qga2V5bGVuICkKK3sKKyAgYmxha2Uyc19wYXJhbSBQWzFdOworCisgIGlmICggKCAhb3V0bGVuICkgfHwgKCBvdXRsZW4gPiBCTEFLRTJTX09VVEJZVEVTICkgKSByZXR1cm4gLTE7CisKKyAgaWYgKCAha2V5IHx8ICFrZXlsZW4gfHwga2V5bGVuID4gQkxBS0UyU19LRVlCWVRFUyApIHJldHVybiAtMTsKKworICBQLT5kaWdlc3RfbGVuZ3RoID0gb3V0bGVuOworICBQLT5rZXlfbGVuZ3RoICAgID0ga2V5bGVuOworICBQLT5mYW5vdXQgICAgICAgID0gMTsKKyAgUC0+ZGVwdGggICAgICAgICA9IDE7CisgIHN0b3JlMzIoICZQLT5sZWFmX2xlbmd0aCwgMCApOworICBzdG9yZTQ4KCAmUC0+bm9kZV9vZmZzZXQsIDAgKTsKKyAgUC0+bm9kZV9kZXB0aCAgICA9IDA7CisgIFAtPmlubmVyX2xlbmd0aCAgPSAwOworICAvKiBtZW1zZXQoUC0+cmVzZXJ2ZWQsIDAsIHNpemVvZihQLT5yZXNlcnZlZCkgKTsgKi8KKyAgbWVtc2V0KCBQLT5zYWx0LCAgICAgMCwgc2l6ZW9mKCBQLT5zYWx0ICkgKTsKKyAgbWVtc2V0KCBQLT5wZXJzb25hbCwgMCwgc2l6ZW9mKCBQLT5wZXJzb25hbCApICk7CisKKyAgaWYoIGJsYWtlMnNfaW5pdF9wYXJhbSggUywgUCApIDwgMCApIHJldHVybiAtMTsKKworICB7CisgICAgdWludDhfdCBibG9ja1tCTEFLRTJTX0JMT0NLQllURVNdOworICAgIG1lbXNldCggYmxvY2ssIDAsIEJMQUtFMlNfQkxPQ0tCWVRFUyApOworICAgIG1lbWNweSggYmxvY2ssIGtleSwga2V5bGVuICk7CisgICAgYmxha2Uyc191cGRhdGUoIFMsIGJsb2NrLCBCTEFLRTJTX0JMT0NLQllURVMgKTsKKyAgICBzZWN1cmVfemVyb19tZW1vcnkoIGJsb2NrLCBCTEFLRTJTX0JMT0NLQllURVMgKTsgLyogQnVybiB0aGUga2V5IGZyb20gc3RhY2sgKi8KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibGFrZTJzX2NvbXByZXNzKCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCB1aW50OF90IGJsb2NrW0JMQUtFMlNfQkxPQ0tCWVRFU10gKQoreworICB1aW50MzJfdCBtWzE2XTsKKyAgdWludDMyX3QgdlsxNl07CisgIHNpemVfdCBpOworCisgIGZvciggaSA9IDA7IGkgPCAxNjsgKytpICkKKyAgICBtW2ldID0gbG9hZDMyKCBibG9jayArIGkgKiBzaXplb2YoIG1baV0gKSApOworCisgIGZvciggaSA9IDA7IGkgPCA4OyArK2kgKQorICAgIHZbaV0gPSBTLT5oW2ldOworCisgIHZbIDhdID0gYmxha2Uyc19JVlswXTsKKyAgdlsgOV0gPSBibGFrZTJzX0lWWzFdOworICB2WzEwXSA9IGJsYWtlMnNfSVZbMl07CisgIHZbMTFdID0gYmxha2Uyc19JVlszXTsKKyAgdlsxMl0gPSBTLT50WzBdIF4gYmxha2Uyc19JVls0XTsKKyAgdlsxM10gPSBTLT50WzFdIF4gYmxha2Uyc19JVls1XTsKKyAgdlsxNF0gPSBTLT5mWzBdIF4gYmxha2Uyc19JVls2XTsKKyAgdlsxNV0gPSBTLT5mWzFdIF4gYmxha2Uyc19JVls3XTsKKyNkZWZpbmUgRyhyLGksYSxiLGMsZCkgXAorICBkbyB7IFwKKyAgICBhID0gYSArIGIgKyBtW2JsYWtlMnNfc2lnbWFbcl1bMippKzBdXTsgXAorICAgIGQgPSByb3RyMzIoZCBeIGEsIDE2KTsgXAorICAgIGMgPSBjICsgZDsgXAorICAgIGIgPSByb3RyMzIoYiBeIGMsIDEyKTsgXAorICAgIGEgPSBhICsgYiArIG1bYmxha2Uyc19zaWdtYVtyXVsyKmkrMV1dOyBcCisgICAgZCA9IHJvdHIzMihkIF4gYSwgOCk7IFwKKyAgICBjID0gYyArIGQ7IFwKKyAgICBiID0gcm90cjMyKGIgXiBjLCA3KTsgXAorICB9IHdoaWxlKDApCisjZGVmaW5lIFJPVU5EKHIpICBcCisgIGRvIHsgXAorICAgIEcociwwLHZbIDBdLHZbIDRdLHZbIDhdLHZbMTJdKTsgXAorICAgIEcociwxLHZbIDFdLHZbIDVdLHZbIDldLHZbMTNdKTsgXAorICAgIEcociwyLHZbIDJdLHZbIDZdLHZbMTBdLHZbMTRdKTsgXAorICAgIEcociwzLHZbIDNdLHZbIDddLHZbMTFdLHZbMTVdKTsgXAorICAgIEcociw0LHZbIDBdLHZbIDVdLHZbMTBdLHZbMTVdKTsgXAorICAgIEcociw1LHZbIDFdLHZbIDZdLHZbMTFdLHZbMTJdKTsgXAorICAgIEcociw2LHZbIDJdLHZbIDddLHZbIDhdLHZbMTNdKTsgXAorICAgIEcociw3LHZbIDNdLHZbIDRdLHZbIDldLHZbMTRdKTsgXAorICB9IHdoaWxlKDApCisgIFJPVU5EKCAwICk7CisgIFJPVU5EKCAxICk7CisgIFJPVU5EKCAyICk7CisgIFJPVU5EKCAzICk7CisgIFJPVU5EKCA0ICk7CisgIFJPVU5EKCA1ICk7CisgIFJPVU5EKCA2ICk7CisgIFJPVU5EKCA3ICk7CisgIFJPVU5EKCA4ICk7CisgIFJPVU5EKCA5ICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisgICAgUy0+aFtpXSA9IFMtPmhbaV0gXiB2W2ldIF4gdltpICsgOF07CisKKyN1bmRlZiBHCisjdW5kZWYgUk9VTkQKKyAgcmV0dXJuIDA7Cit9CisKKworaW50IGJsYWtlMnNfdXBkYXRlKCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCB1aW50OF90ICppbiwgdWludDY0X3QgaW5sZW4gKQoreworICB3aGlsZSggaW5sZW4gPiAwICkKKyAgeworICAgIHNpemVfdCBsZWZ0ID0gUy0+YnVmbGVuOworICAgIHNpemVfdCBmaWxsID0gMiAqIEJMQUtFMlNfQkxPQ0tCWVRFUyAtIGxlZnQ7CisKKyAgICBpZiggaW5sZW4gPiBmaWxsICkKKyAgICB7CisgICAgICBtZW1jcHkoIFMtPmJ1ZiArIGxlZnQsIGluLCBmaWxsICk7IC8qIEZpbGwgYnVmZmVyICovCisgICAgICBTLT5idWZsZW4gKz0gZmlsbDsKKyAgICAgIGJsYWtlMnNfaW5jcmVtZW50X2NvdW50ZXIoIFMsIEJMQUtFMlNfQkxPQ0tCWVRFUyApOworICAgICAgYmxha2Uyc19jb21wcmVzcyggUywgUy0+YnVmICk7IC8qIENvbXByZXNzICovCisgICAgICBtZW1jcHkoIFMtPmJ1ZiwgUy0+YnVmICsgQkxBS0UyU19CTE9DS0JZVEVTLCBCTEFLRTJTX0JMT0NLQllURVMgKTsgLyogU2hpZnQgYnVmZmVyIGxlZnQgKi8KKyAgICAgIFMtPmJ1ZmxlbiAtPSBCTEFLRTJTX0JMT0NLQllURVM7CisgICAgICBpbiArPSBmaWxsOworICAgICAgaW5sZW4gLT0gZmlsbDsKKyAgICB9CisgICAgZWxzZSAvKiBpbmxlbiA8PSBmaWxsICovCisgICAgeworICAgICAgbWVtY3B5KCBTLT5idWYgKyBsZWZ0LCBpbiwgKHNpemVfdClpbmxlbiApOworICAgICAgUy0+YnVmbGVuICs9IChzaXplX3QpaW5sZW47IC8qIEJlIGxhenksIGRvIG5vdCBjb21wcmVzcyAqLworICAgICAgaW4gKz0gaW5sZW47CisgICAgICBpbmxlbiAtPSBpbmxlbjsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworaW50IGJsYWtlMnNfZmluYWwoIGJsYWtlMnNfc3RhdGUgKlMsIHVpbnQ4X3QgKm91dCwgdWludDhfdCBvdXRsZW4gKQoreworICB1aW50OF90IGJ1ZmZlcltCTEFLRTJTX09VVEJZVEVTXSA9IHswfTsKKyAgaW50IGk7CisKKyAgaWYoIG91dCA9PSBOVUxMIHx8IG91dGxlbiA9PSAwIHx8IG91dGxlbiA+IEJMQUtFMlNfT1VUQllURVMgKQorICAgIHJldHVybiAtMTsKKworICBpZiggYmxha2Uyc19pc19sYXN0YmxvY2soIFMgKSApCisgICAgcmV0dXJuIC0xOworCisKKyAgaWYoIFMtPmJ1ZmxlbiA+IEJMQUtFMlNfQkxPQ0tCWVRFUyApCisgIHsKKyAgICBibGFrZTJzX2luY3JlbWVudF9jb3VudGVyKCBTLCBCTEFLRTJTX0JMT0NLQllURVMgKTsKKyAgICBibGFrZTJzX2NvbXByZXNzKCBTLCBTLT5idWYgKTsKKyAgICBTLT5idWZsZW4gLT0gQkxBS0UyU19CTE9DS0JZVEVTOworICAgIG1lbW1vdmUoIFMtPmJ1ZiwgUy0+YnVmICsgQkxBS0UyU19CTE9DS0JZVEVTLCBTLT5idWZsZW4gKTsKKyAgfQorCisgIGJsYWtlMnNfaW5jcmVtZW50X2NvdW50ZXIoIFMsICggdWludDMyX3QgKVMtPmJ1ZmxlbiApOworICBibGFrZTJzX3NldF9sYXN0YmxvY2soIFMgKTsKKyAgbWVtc2V0KCBTLT5idWYgKyBTLT5idWZsZW4sIDAsIDIgKiBCTEFLRTJTX0JMT0NLQllURVMgLSBTLT5idWZsZW4gKTsgLyogUGFkZGluZyAqLworICBibGFrZTJzX2NvbXByZXNzKCBTLCBTLT5idWYgKTsKKworICBmb3IoIGkgPSAwOyBpIDwgODsgKytpICkgLyogT3V0cHV0IGZ1bGwgaGFzaCB0byB0ZW1wIGJ1ZmZlciAqLworICAgIHN0b3JlMzIoIGJ1ZmZlciArIHNpemVvZiggUy0+aFtpXSApICogaSwgUy0+aFtpXSApOworICAgIAorICBtZW1jcHkoIG91dCwgYnVmZmVyLCBvdXRsZW4gKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBibGFrZTJzKCB1aW50OF90ICpvdXQsIGNvbnN0IHZvaWQgKmluLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB1aW50NjRfdCBpbmxlbiwgdWludDhfdCBrZXlsZW4gKQoreworICBibGFrZTJzX3N0YXRlIFNbMV07CisKKyAgLyogVmVyaWZ5IHBhcmFtZXRlcnMgKi8KKyAgaWYgKCBOVUxMID09IGluICYmIGlubGVuID4gMCApIHJldHVybiAtMTsKKworICBpZiAoIE5VTEwgPT0gb3V0ICkgcmV0dXJuIC0xOworCisgIGlmICggTlVMTCA9PSBrZXkgJiYga2V5bGVuID4gMCkgcmV0dXJuIC0xOworCisgIGlmKCAhb3V0bGVuIHx8IG91dGxlbiA+IEJMQUtFMlNfT1VUQllURVMgKSByZXR1cm4gLTE7CisKKyAgaWYoIGtleWxlbiA+IEJMQUtFMlNfS0VZQllURVMgKSByZXR1cm4gLTE7CisKKyAgaWYoIGtleWxlbiA+IDAgKQorICB7CisgICAgaWYoIGJsYWtlMnNfaW5pdF9rZXkoIFMsIG91dGxlbiwga2V5LCBrZXlsZW4gKSA8IDAgKSByZXR1cm4gLTE7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoIGJsYWtlMnNfaW5pdCggUywgb3V0bGVuICkgPCAwICkgcmV0dXJuIC0xOworICB9CisKKyAgYmxha2Uyc191cGRhdGUoIFMsICggY29uc3QgdWludDhfdCAqIClpbiwgaW5sZW4gKTsKKyAgYmxha2Uyc19maW5hbCggUywgb3V0LCBvdXRsZW4gKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKFNVUEVSQ09QKQoraW50IGNyeXB0b19oYXNoKCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGxvbmcgaW5sZW4gKQoreworICByZXR1cm4gYmxha2Uycyggb3V0LCBpbiwgTlVMTCwgQkxBS0UyU19PVVRCWVRFUywgaW5sZW4sIDAgKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTEFLRTJTX1NFTEZURVNUKQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImJsYWtlMi1rYXQuaCIKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKQoreworICB1aW50OF90IGtleVtCTEFLRTJTX0tFWUJZVEVTXTsKKyAgdWludDhfdCBidWZbS0FUX0xFTkdUSF07CisgIHNpemVfdCBpOworCisgIGZvciggaSA9IDA7IGkgPCBCTEFLRTJTX0tFWUJZVEVTOyArK2kgKQorICAgIGtleVtpXSA9ICggdWludDhfdCApaTsKKworICBmb3IoIGkgPSAwOyBpIDwgS0FUX0xFTkdUSDsgKytpICkKKyAgICBidWZbaV0gPSAoIHVpbnQ4X3QgKWk7CisKKyAgZm9yKCBpID0gMDsgaSA8IEtBVF9MRU5HVEg7ICsraSApCisgIHsKKyAgICB1aW50OF90IGhhc2hbQkxBS0UyU19PVVRCWVRFU107CisgICAgYmxha2UycyggaGFzaCwgYnVmLCBrZXksIEJMQUtFMlNfT1VUQllURVMsIGksIEJMQUtFMlNfS0VZQllURVMgKTsKKworICAgIGlmKCAwICE9IG1lbWNtcCggaGFzaCwgYmxha2Uyc19rZXllZF9rYXRbaV0sIEJMQUtFMlNfT1VUQllURVMgKSApCisgICAgeworICAgICAgcHV0cyggImVycm9yIiApOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIHB1dHMoICJvayIgKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJzLXJvdW5kLmggYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJzLXJvdW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3MGQ5MgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtcm91bmQuaApAQCAtMCwwICsxLDkwIEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gb3B0aW1pemVkIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgX19CTEFLRTJTX1JPVU5EX0hfXworI2RlZmluZSBfX0JMQUtFMlNfUk9VTkRfSF9fCisKKyNkZWZpbmUgTE9BRFUocCkgIF9tbV9sb2FkdV9zaTEyOCggKGNvbnN0IF9fbTEyOGkgKikocCkgKQorI2RlZmluZSBTVE9SRVUocCxyKSBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpICopKHApLCByKQorCisjZGVmaW5lIFRPRihyZWcpIF9tbV9jYXN0c2kxMjhfcHMoKHJlZykpCisjZGVmaW5lIFRPSShyZWcpIF9tbV9jYXN0cHNfc2kxMjgoKHJlZykpCisKKyNkZWZpbmUgTElLRUxZKHgpIF9fYnVpbHRpbl9leHBlY3QoKHgpLDEpCisKKworLyogTWljcm9hcmNoaXRlY3R1cmUtc3BlY2lmaWMgbWFjcm9zICovCisjaWZuZGVmIEhBVkVfWE9QCisjaWZkZWYgSEFWRV9TU1NFMworI2RlZmluZSBfbW1fcm90aV9lcGkzMihyLCBjKSAoIFwKKyAgICAgICAgICAgICAgICAoOD09LShjKSkgPyBfbW1fc2h1ZmZsZV9lcGk4KHIscjgpIFwKKyAgICAgICAgICAgICAgOiAoMTY9PS0oYykpID8gX21tX3NodWZmbGVfZXBpOChyLHIxNikgXAorICAgICAgICAgICAgICA6IF9tbV94b3Jfc2kxMjgoX21tX3NybGlfZXBpMzIoIChyKSwgLShjKSApLF9tbV9zbGxpX2VwaTMyKCAociksIDMyLSgtKGMpKSApKSApCisjZWxzZQorI2RlZmluZSBfbW1fcm90aV9lcGkzMihyLCBjKSBfbW1feG9yX3NpMTI4KF9tbV9zcmxpX2VwaTMyKCAociksIC0oYykgKSxfbW1fc2xsaV9lcGkzMiggKHIpLCAzMi0oLShjKSkgKSkKKyNlbmRpZgorI2Vsc2UKKy8qIC4uLiAqLworI2VuZGlmCisKKworI2RlZmluZSBHMShyb3cxLHJvdzIscm93Myxyb3c0LGJ1ZikgXAorICByb3cxID0gX21tX2FkZF9lcGkzMiggX21tX2FkZF9lcGkzMiggcm93MSwgYnVmKSwgcm93MiApOyBcCisgIHJvdzQgPSBfbW1feG9yX3NpMTI4KCByb3c0LCByb3cxICk7IFwKKyAgcm93NCA9IF9tbV9yb3RpX2VwaTMyKHJvdzQsIC0xNik7IFwKKyAgcm93MyA9IF9tbV9hZGRfZXBpMzIoIHJvdzMsIHJvdzQgKTsgICBcCisgIHJvdzIgPSBfbW1feG9yX3NpMTI4KCByb3cyLCByb3czICk7IFwKKyAgcm93MiA9IF9tbV9yb3RpX2VwaTMyKHJvdzIsIC0xMik7CisKKyNkZWZpbmUgRzIocm93MSxyb3cyLHJvdzMscm93NCxidWYpIFwKKyAgcm93MSA9IF9tbV9hZGRfZXBpMzIoIF9tbV9hZGRfZXBpMzIoIHJvdzEsIGJ1ZiksIHJvdzIgKTsgXAorICByb3c0ID0gX21tX3hvcl9zaTEyOCggcm93NCwgcm93MSApOyBcCisgIHJvdzQgPSBfbW1fcm90aV9lcGkzMihyb3c0LCAtOCk7IFwKKyAgcm93MyA9IF9tbV9hZGRfZXBpMzIoIHJvdzMsIHJvdzQgKTsgICBcCisgIHJvdzIgPSBfbW1feG9yX3NpMTI4KCByb3cyLCByb3czICk7IFwKKyAgcm93MiA9IF9tbV9yb3RpX2VwaTMyKHJvdzIsIC03KTsKKworI2RlZmluZSBESUFHT05BTElaRShyb3cxLHJvdzIscm93Myxyb3c0KSBcCisgIHJvdzQgPSBfbW1fc2h1ZmZsZV9lcGkzMiggcm93NCwgX01NX1NIVUZGTEUoMiwxLDAsMykgKTsgXAorICByb3czID0gX21tX3NodWZmbGVfZXBpMzIoIHJvdzMsIF9NTV9TSFVGRkxFKDEsMCwzLDIpICk7IFwKKyAgcm93MiA9IF9tbV9zaHVmZmxlX2VwaTMyKCByb3cyLCBfTU1fU0hVRkZMRSgwLDMsMiwxKSApOworCisjZGVmaW5lIFVORElBR09OQUxJWkUocm93MSxyb3cyLHJvdzMscm93NCkgXAorICByb3c0ID0gX21tX3NodWZmbGVfZXBpMzIoIHJvdzQsIF9NTV9TSFVGRkxFKDAsMywyLDEpICk7IFwKKyAgcm93MyA9IF9tbV9zaHVmZmxlX2VwaTMyKCByb3czLCBfTU1fU0hVRkZMRSgxLDAsMywyKSApOyBcCisgIHJvdzIgPSBfbW1fc2h1ZmZsZV9lcGkzMiggcm93MiwgX01NX1NIVUZGTEUoMiwxLDAsMykgKTsKKworI2lmIGRlZmluZWQoSEFWRV9YT1ApCisjaW5jbHVkZSAiYmxha2Uycy1sb2FkLXhvcC5oIgorI2VsaWYgZGVmaW5lZChIQVZFX1NTRTQxKQorI2luY2x1ZGUgImJsYWtlMnMtbG9hZC1zc2U0MS5oIgorI2Vsc2UKKyNpbmNsdWRlICJibGFrZTJzLWxvYWQtc3NlMi5oIgorI2VuZGlmCisKKyNkZWZpbmUgUk9VTkQocikgIFwKKyAgTE9BRF9NU0dfICMjciAjI18xKGJ1ZjEpOyBcCisgIEcxKHJvdzEscm93Mixyb3czLHJvdzQsYnVmMSk7IFwKKyAgTE9BRF9NU0dfICMjciAjI18yKGJ1ZjIpOyBcCisgIEcyKHJvdzEscm93Mixyb3czLHJvdzQsYnVmMik7IFwKKyAgRElBR09OQUxJWkUocm93MSxyb3cyLHJvdzMscm93NCk7IFwKKyAgTE9BRF9NU0dfICMjciAjI18zKGJ1ZjMpOyBcCisgIEcxKHJvdzEscm93Mixyb3czLHJvdzQsYnVmMyk7IFwKKyAgTE9BRF9NU0dfICMjciAjI180KGJ1ZjQpOyBcCisgIEcyKHJvdzEscm93Mixyb3czLHJvdzQsYnVmNCk7IFwKKyAgVU5ESUFHT05BTElaRShyb3cxLHJvdzIscm93Myxyb3c0KTsgXAorIAorI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMuYyBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTM4NWRjCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy5jCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gb3B0aW1pemVkIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYmxha2UyLmgiCisjaW5jbHVkZSAiYmxha2UyLWltcGwuaCIKKworI2luY2x1ZGUgImJsYWtlMi1jb25maWcuaCIKKworCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjaWYgZGVmaW5lZChIQVZFX1NTU0UzKQorI2luY2x1ZGUgPHRtbWludHJpbi5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1NTRTQxKQorI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0FWWCkKKyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9YT1ApCisjaW5jbHVkZSA8eDg2aW50cmluLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImJsYWtlMnMtcm91bmQuaCIKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGJsYWtlMnNfSVZbOF0gPQoreworICAweDZBMDlFNjY3VUwsIDB4QkI2N0FFODVVTCwgMHgzQzZFRjM3MlVMLCAweEE1NEZGNTNBVUwsCisgIDB4NTEwRTUyN0ZVTCwgMHg5QjA1Njg4Q1VMLCAweDFGODNEOUFCVUwsIDB4NUJFMENEMTlVTAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmxha2Uyc19zaWdtYVsxMF1bMTZdID0KK3sKKyAgeyAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSB9ICwKKyAgeyAxNCwgMTAsICA0LCAgOCwgIDksIDE1LCAxMywgIDYsICAxLCAxMiwgIDAsICAyLCAxMSwgIDcsICA1LCAgMyB9ICwKKyAgeyAxMSwgIDgsIDEyLCAgMCwgIDUsICAyLCAxNSwgMTMsIDEwLCAxNCwgIDMsICA2LCAgNywgIDEsICA5LCAgNCB9ICwKKyAgeyAgNywgIDksICAzLCAgMSwgMTMsIDEyLCAxMSwgMTQsICAyLCAgNiwgIDUsIDEwLCAgNCwgIDAsIDE1LCAgOCB9ICwKKyAgeyAgOSwgIDAsICA1LCAgNywgIDIsICA0LCAxMCwgMTUsIDE0LCAgMSwgMTEsIDEyLCAgNiwgIDgsICAzLCAxMyB9ICwKKyAgeyAgMiwgMTIsICA2LCAxMCwgIDAsIDExLCAgOCwgIDMsICA0LCAxMywgIDcsICA1LCAxNSwgMTQsICAxLCAgOSB9ICwKKyAgeyAxMiwgIDUsICAxLCAxNSwgMTQsIDEzLCAgNCwgMTAsICAwLCAgNywgIDYsICAzLCAgOSwgIDIsICA4LCAxMSB9ICwKKyAgeyAxMywgMTEsICA3LCAxNCwgMTIsICAxLCAgMywgIDksICA1LCAgMCwgMTUsICA0LCAgOCwgIDYsICAyLCAxMCB9ICwKKyAgeyAgNiwgMTUsIDE0LCAgOSwgMTEsICAzLCAgMCwgIDgsIDEyLCAgMiwgMTMsICA3LCAgMSwgIDQsIDEwLCAgNSB9ICwKKyAgeyAxMCwgIDIsICA4LCAgNCwgIDcsICA2LCAgMSwgIDUsIDE1LCAxMSwgIDksIDE0LCAgMywgMTIsIDEzICwgMCB9ICwKK307CisKKworLyogU29tZSBoZWxwZXIgZnVuY3Rpb25zLCBub3QgbmVjZXNzYXJpbHkgdXNlZnVsICovCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19zZXRfbGFzdG5vZGUoIGJsYWtlMnNfc3RhdGUgKlMgKQoreworICBTLT5mWzFdID0gLTE7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19jbGVhcl9sYXN0bm9kZSggYmxha2Uyc19zdGF0ZSAqUyApCit7CisgIFMtPmZbMV0gPSAwOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfaXNfbGFzdGJsb2NrKCBjb25zdCBibGFrZTJzX3N0YXRlICpTICkKK3sKKyAgcmV0dXJuIFMtPmZbMF0gIT0gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfc2V0X2xhc3RibG9jayggYmxha2Uyc19zdGF0ZSAqUyApCit7CisgIGlmKCBTLT5sYXN0X25vZGUgKSBibGFrZTJzX3NldF9sYXN0bm9kZSggUyApOworCisgIFMtPmZbMF0gPSAtMTsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX2NsZWFyX2xhc3RibG9jayggYmxha2Uyc19zdGF0ZSAqUyApCit7CisgIGlmKCBTLT5sYXN0X25vZGUgKSBibGFrZTJzX2NsZWFyX2xhc3Rub2RlKCBTICk7CisKKyAgUy0+ZlswXSA9IDA7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19pbmNyZW1lbnRfY291bnRlciggYmxha2Uyc19zdGF0ZSAqUywgY29uc3QgdWludDMyX3QgaW5jICkKK3sKKyAgdWludDY0X3QgdCA9ICggKCB1aW50NjRfdCApUy0+dFsxXSA8PCAzMiApIHwgUy0+dFswXTsKKyAgdCArPSBpbmM7CisgIFMtPnRbMF0gPSAoIHVpbnQzMl90ICkoIHQgPj4gIDAgKTsKKyAgUy0+dFsxXSA9ICggdWludDMyX3QgKSggdCA+PiAzMiApOworICByZXR1cm4gMDsKK30KKworCisvKiBQYXJhbWV0ZXItcmVsYXRlZCBmdW5jdGlvbnMgKi8KK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3BhcmFtX3NldF9kaWdlc3RfbGVuZ3RoKCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGRpZ2VzdF9sZW5ndGggKQoreworICBQLT5kaWdlc3RfbGVuZ3RoID0gZGlnZXN0X2xlbmd0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3BhcmFtX3NldF9mYW5vdXQoIGJsYWtlMnNfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgZmFub3V0ICkKK3sKKyAgUC0+ZmFub3V0ID0gZmFub3V0OworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfcGFyYW1fc2V0X21heF9kZXB0aCggYmxha2Uyc19wYXJhbSAqUCwgY29uc3QgdWludDhfdCBkZXB0aCApCit7CisgIFAtPmRlcHRoID0gZGVwdGg7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfbGVhZl9sZW5ndGgoIGJsYWtlMnNfcGFyYW0gKlAsIGNvbnN0IHVpbnQzMl90IGxlYWZfbGVuZ3RoICkKK3sKKyAgUC0+bGVhZl9sZW5ndGggPSBsZWFmX2xlbmd0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3BhcmFtX3NldF9ub2RlX29mZnNldCggYmxha2Uyc19wYXJhbSAqUCwgY29uc3QgdWludDY0X3Qgbm9kZV9vZmZzZXQgKQoreworICBzdG9yZTQ4KCBQLT5ub2RlX29mZnNldCwgbm9kZV9vZmZzZXQgKTsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3BhcmFtX3NldF9ub2RlX2RlcHRoKCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IG5vZGVfZGVwdGggKQoreworICBQLT5ub2RlX2RlcHRoID0gbm9kZV9kZXB0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3BhcmFtX3NldF9pbm5lcl9sZW5ndGgoIGJsYWtlMnNfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgaW5uZXJfbGVuZ3RoICkKK3sKKyAgUC0+aW5uZXJfbGVuZ3RoID0gaW5uZXJfbGVuZ3RoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfcGFyYW1fc2V0X3NhbHQoIGJsYWtlMnNfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3Qgc2FsdFtCTEFLRTJTX1NBTFRCWVRFU10gKQoreworICBtZW1jcHkoIFAtPnNhbHQsIHNhbHQsIEJMQUtFMlNfU0FMVEJZVEVTICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfcGVyc29uYWwoIGJsYWtlMnNfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgcGVyc29uYWxbQkxBS0UyU19QRVJTT05BTEJZVEVTXSApCit7CisgIG1lbWNweSggUC0+cGVyc29uYWwsIHBlcnNvbmFsLCBCTEFLRTJTX1BFUlNPTkFMQllURVMgKTsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX2luaXQwKCBibGFrZTJzX3N0YXRlICpTICkKK3sKKyAgaW50IGk7CisgIG1lbXNldCggUywgMCwgc2l6ZW9mKCBibGFrZTJzX3N0YXRlICkgKTsKKworICBmb3IoIGkgPSAwOyBpIDwgODsgKytpICkgUy0+aFtpXSA9IGJsYWtlMnNfSVZbaV07CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGluaXQyIHhvcnMgSVYgd2l0aCBpbnB1dCBwYXJhbWV0ZXIgYmxvY2sgKi8KK2ludCBibGFrZTJzX2luaXRfcGFyYW0oIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IGJsYWtlMnNfcGFyYW0gKlAgKQoreworICAvKmJsYWtlMnNfaW5pdDAoIFMgKTsgKi8KKyAgY29uc3QgdWludDhfdCAqIHYgPSAoIGNvbnN0IHVpbnQ4X3QgKiApKCBibGFrZTJzX0lWICk7CisgIGNvbnN0IHVpbnQ4X3QgKiBwID0gKCBjb25zdCB1aW50OF90ICogKSggUCApOworICB1aW50OF90ICogaCA9ICggdWludDhfdCAqICkoIFMtPmggKTsKKyAgaW50IGk7CisgIC8qIElWIFhPUiBQYXJhbUJsb2NrICovCisgIG1lbXNldCggUywgMCwgc2l6ZW9mKCBibGFrZTJzX3N0YXRlICkgKTsKKworICBmb3IoIGkgPSAwOyBpIDwgQkxBS0UyU19PVVRCWVRFUzsgKytpICkgaFtpXSA9IHZbaV0gXiBwW2ldOworCisgIHJldHVybiAwOworfQorCisKKy8qIFNvbWUgc29ydCBvZiBkZWZhdWx0IHBhcmFtZXRlciBibG9jayBpbml0aWFsaXphdGlvbiwgZm9yIHNlcXVlbnRpYWwgYmxha2UycyAqLworaW50IGJsYWtlMnNfaW5pdCggYmxha2Uyc19zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4gKQoreworICBjb25zdCBibGFrZTJzX3BhcmFtIFAgPQorICB7CisgICAgb3V0bGVuLAorICAgIDAsCisgICAgMSwKKyAgICAxLAorICAgIDAsCisgICAgezB9LAorICAgIDAsCisgICAgMCwKKyAgICB7MH0sCisgICAgezB9CisgIH07CisgIC8qIE1vdmUgaW50ZXJ2YWwgdmVyaWZpY2F0aW9uIGhlcmU/ICovCisgIGlmICggKCAhb3V0bGVuICkgfHwgKCBvdXRsZW4gPiBCTEFLRTJTX09VVEJZVEVTICkgKSByZXR1cm4gLTE7CisgIHJldHVybiBibGFrZTJzX2luaXRfcGFyYW0oIFMsICZQICk7Cit9CisKKworaW50IGJsYWtlMnNfaW5pdF9rZXkoIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qga2V5bGVuICkKK3sKKyAgY29uc3QgYmxha2Uyc19wYXJhbSBQID0KKyAgeworICAgIG91dGxlbiwKKyAgICBrZXlsZW4sCisgICAgMSwKKyAgICAxLAorICAgIDAsCisgICAgezB9LAorICAgIDAsCisgICAgMCwKKyAgICB7MH0sCisgICAgezB9CisgIH07CisKKyAgLyogTW92ZSBpbnRlcnZhbCB2ZXJpZmljYXRpb24gaGVyZT8gKi8KKyAgaWYgKCAoICFvdXRsZW4gKSB8fCAoIG91dGxlbiA+IEJMQUtFMlNfT1VUQllURVMgKSApIHJldHVybiAtMTsKKworICBpZiAoICggIWtleSApIHx8ICggIWtleWxlbiApIHx8IGtleWxlbiA+IEJMQUtFMlNfS0VZQllURVMgKSByZXR1cm4gLTE7CisKKyAgaWYoIGJsYWtlMnNfaW5pdF9wYXJhbSggUywgJlAgKSA8IDAgKQorICAgIHJldHVybiAtMTsKKworICB7CisgICAgdWludDhfdCBibG9ja1tCTEFLRTJTX0JMT0NLQllURVNdOworICAgIG1lbXNldCggYmxvY2ssIDAsIEJMQUtFMlNfQkxPQ0tCWVRFUyApOworICAgIG1lbWNweSggYmxvY2ssIGtleSwga2V5bGVuICk7CisgICAgYmxha2Uyc191cGRhdGUoIFMsIGJsb2NrLCBCTEFLRTJTX0JMT0NLQllURVMgKTsKKyAgICBzZWN1cmVfemVyb19tZW1vcnkoIGJsb2NrLCBCTEFLRTJTX0JMT0NLQllURVMgKTsgLyogQnVybiB0aGUga2V5IGZyb20gc3RhY2sgKi8KKyAgfQorICByZXR1cm4gMDsKK30KKworCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19jb21wcmVzcyggYmxha2Uyc19zdGF0ZSAqUywgY29uc3QgdWludDhfdCBibG9ja1tCTEFLRTJTX0JMT0NLQllURVNdICkKK3sKKyAgX19tMTI4aSByb3cxLCByb3cyLCByb3czLCByb3c0OworICBfX20xMjhpIGJ1ZjEsIGJ1ZjIsIGJ1ZjMsIGJ1ZjQ7CisjaWYgZGVmaW5lZChIQVZFX1NTRTQxKQorICBfX20xMjhpIHQwLCB0MTsKKyNpZiAhZGVmaW5lZChIQVZFX1hPUCkKKyAgX19tMTI4aSB0MjsKKyNlbmRpZgorI2VuZGlmCisgIF9fbTEyOGkgZmYwLCBmZjE7CisjaWYgZGVmaW5lZChIQVZFX1NTU0UzKSAmJiAhZGVmaW5lZChIQVZFX1hPUCkKKyAgY29uc3QgX19tMTI4aSByOCA9IF9tbV9zZXRfZXBpOCggMTIsIDE1LCAxNCwgMTMsIDgsIDExLCAxMCwgOSwgNCwgNywgNiwgNSwgMCwgMywgMiwgMSApOworICBjb25zdCBfX20xMjhpIHIxNiA9IF9tbV9zZXRfZXBpOCggMTMsIDEyLCAxNSwgMTQsIDksIDgsIDExLCAxMCwgNSwgNCwgNywgNiwgMSwgMCwgMywgMiApOworI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1NTRTQxKQorICBjb25zdCBfX20xMjhpIG0wID0gTE9BRFUoIGJsb2NrICsgIDAwICk7CisgIGNvbnN0IF9fbTEyOGkgbTEgPSBMT0FEVSggYmxvY2sgKyAgMTYgKTsKKyAgY29uc3QgX19tMTI4aSBtMiA9IExPQURVKCBibG9jayArICAzMiApOworICBjb25zdCBfX20xMjhpIG0zID0gTE9BRFUoIGJsb2NrICsgIDQ4ICk7CisjZWxzZQorICBjb25zdCB1aW50MzJfdCAgbTAgPSAoICggdWludDMyX3QgKiApYmxvY2sgKVsgMF07CisgIGNvbnN0IHVpbnQzMl90ICBtMSA9ICggKCB1aW50MzJfdCAqIClibG9jayApWyAxXTsKKyAgY29uc3QgdWludDMyX3QgIG0yID0gKCAoIHVpbnQzMl90ICogKWJsb2NrIClbIDJdOworICBjb25zdCB1aW50MzJfdCAgbTMgPSAoICggdWludDMyX3QgKiApYmxvY2sgKVsgM107CisgIGNvbnN0IHVpbnQzMl90ICBtNCA9ICggKCB1aW50MzJfdCAqIClibG9jayApWyA0XTsKKyAgY29uc3QgdWludDMyX3QgIG01ID0gKCAoIHVpbnQzMl90ICogKWJsb2NrIClbIDVdOworICBjb25zdCB1aW50MzJfdCAgbTYgPSAoICggdWludDMyX3QgKiApYmxvY2sgKVsgNl07CisgIGNvbnN0IHVpbnQzMl90ICBtNyA9ICggKCB1aW50MzJfdCAqIClibG9jayApWyA3XTsKKyAgY29uc3QgdWludDMyX3QgIG04ID0gKCAoIHVpbnQzMl90ICogKWJsb2NrIClbIDhdOworICBjb25zdCB1aW50MzJfdCAgbTkgPSAoICggdWludDMyX3QgKiApYmxvY2sgKVsgOV07CisgIGNvbnN0IHVpbnQzMl90IG0xMCA9ICggKCB1aW50MzJfdCAqIClibG9jayApWzEwXTsKKyAgY29uc3QgdWludDMyX3QgbTExID0gKCAoIHVpbnQzMl90ICogKWJsb2NrIClbMTFdOworICBjb25zdCB1aW50MzJfdCBtMTIgPSAoICggdWludDMyX3QgKiApYmxvY2sgKVsxMl07CisgIGNvbnN0IHVpbnQzMl90IG0xMyA9ICggKCB1aW50MzJfdCAqIClibG9jayApWzEzXTsKKyAgY29uc3QgdWludDMyX3QgbTE0ID0gKCAoIHVpbnQzMl90ICogKWJsb2NrIClbMTRdOworICBjb25zdCB1aW50MzJfdCBtMTUgPSAoICggdWludDMyX3QgKiApYmxvY2sgKVsxNV07CisjZW5kaWYKKyAgcm93MSA9IGZmMCA9IExPQURVKCAmUy0+aFswXSApOworICByb3cyID0gZmYxID0gTE9BRFUoICZTLT5oWzRdICk7CisgIHJvdzMgPSBfbW1fc2V0cl9lcGkzMiggMHg2QTA5RTY2NywgMHhCQjY3QUU4NSwgMHgzQzZFRjM3MiwgMHhBNTRGRjUzQSApOworICByb3c0ID0gX21tX3hvcl9zaTEyOCggX21tX3NldHJfZXBpMzIoIDB4NTEwRTUyN0YsIDB4OUIwNTY4OEMsIDB4MUY4M0Q5QUIsIDB4NUJFMENEMTkgKSwgTE9BRFUoICZTLT50WzBdICkgKTsKKyAgUk9VTkQoIDAgKTsKKyAgUk9VTkQoIDEgKTsKKyAgUk9VTkQoIDIgKTsKKyAgUk9VTkQoIDMgKTsKKyAgUk9VTkQoIDQgKTsKKyAgUk9VTkQoIDUgKTsKKyAgUk9VTkQoIDYgKTsKKyAgUk9VTkQoIDcgKTsKKyAgUk9VTkQoIDggKTsKKyAgUk9VTkQoIDkgKTsKKyAgU1RPUkVVKCAmUy0+aFswXSwgX21tX3hvcl9zaTEyOCggZmYwLCBfbW1feG9yX3NpMTI4KCByb3cxLCByb3czICkgKSApOworICBTVE9SRVUoICZTLT5oWzRdLCBfbW1feG9yX3NpMTI4KCBmZjEsIF9tbV94b3Jfc2kxMjgoIHJvdzIsIHJvdzQgKSApICk7CisgIHJldHVybiAwOworfQorCisvKiBpbmxlbiBub3cgaW4gYnl0ZXMgKi8KK2ludCBibGFrZTJzX3VwZGF0ZSggYmxha2Uyc19zdGF0ZSAqUywgY29uc3QgdWludDhfdCAqaW4sIHVpbnQ2NF90IGlubGVuICkKK3sKKyAgd2hpbGUoIGlubGVuID4gMCApCisgIHsKKyAgICBzaXplX3QgbGVmdCA9IFMtPmJ1ZmxlbjsKKyAgICBzaXplX3QgZmlsbCA9IDIgKiBCTEFLRTJTX0JMT0NLQllURVMgLSBsZWZ0OworCisgICAgaWYoIGlubGVuID4gZmlsbCApCisgICAgeworICAgICAgbWVtY3B5KCBTLT5idWYgKyBsZWZ0LCBpbiwgZmlsbCApOyAvKiBGaWxsIGJ1ZmZlciAqLworICAgICAgUy0+YnVmbGVuICs9IGZpbGw7CisgICAgICBibGFrZTJzX2luY3JlbWVudF9jb3VudGVyKCBTLCBCTEFLRTJTX0JMT0NLQllURVMgKTsKKyAgICAgIGJsYWtlMnNfY29tcHJlc3MoIFMsIFMtPmJ1ZiApOyAvKiBDb21wcmVzcyAqLworICAgICAgbWVtY3B5KCBTLT5idWYsIFMtPmJ1ZiArIEJMQUtFMlNfQkxPQ0tCWVRFUywgQkxBS0UyU19CTE9DS0JZVEVTICk7IC8qIFNoaWZ0IGJ1ZmZlciBsZWZ0ICovCisgICAgICBTLT5idWZsZW4gLT0gQkxBS0UyU19CTE9DS0JZVEVTOworICAgICAgaW4gKz0gZmlsbDsKKyAgICAgIGlubGVuIC09IGZpbGw7CisgICAgfQorICAgIGVsc2UgLyogaW5sZW4gPD0gZmlsbCAqLworICAgIHsKKyAgICAgIG1lbWNweSggUy0+YnVmICsgbGVmdCwgaW4sIGlubGVuICk7CisgICAgICBTLT5idWZsZW4gKz0gaW5sZW47IC8qIEJlIGxhenksIGRvIG5vdCBjb21wcmVzcyAqLworICAgICAgaW4gKz0gaW5sZW47CisgICAgICBpbmxlbiAtPSBpbmxlbjsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyogSXMgdGhpcyBjb3JyZWN0PyAqLworaW50IGJsYWtlMnNfZmluYWwoIGJsYWtlMnNfc3RhdGUgKlMsIHVpbnQ4X3QgKm91dCwgdWludDhfdCBvdXRsZW4gKQoreworICB1aW50OF90IGJ1ZmZlcltCTEFLRTJTX09VVEJZVEVTXSA9IHswfTsKKyAgaW50IGk7CisKKyAgaWYoIG91dGxlbiA+IEJMQUtFMlNfT1VUQllURVMgKQorICAgIHJldHVybiAtMTsKKworICBpZiggYmxha2Uyc19pc19sYXN0YmxvY2soIFMgKSApCisgICAgcmV0dXJuIC0xOworCisgIGlmKCBTLT5idWZsZW4gPiBCTEFLRTJTX0JMT0NLQllURVMgKQorICB7CisgICAgYmxha2Uyc19pbmNyZW1lbnRfY291bnRlciggUywgQkxBS0UyU19CTE9DS0JZVEVTICk7CisgICAgYmxha2Uyc19jb21wcmVzcyggUywgUy0+YnVmICk7CisgICAgUy0+YnVmbGVuIC09IEJMQUtFMlNfQkxPQ0tCWVRFUzsKKyAgICBtZW1tb3ZlKCBTLT5idWYsIFMtPmJ1ZiArIEJMQUtFMlNfQkxPQ0tCWVRFUywgUy0+YnVmbGVuICk7CisgIH0KKworICBibGFrZTJzX2luY3JlbWVudF9jb3VudGVyKCBTLCAoIHVpbnQzMl90IClTLT5idWZsZW4gKTsKKyAgYmxha2Uyc19zZXRfbGFzdGJsb2NrKCBTICk7CisgIG1lbXNldCggUy0+YnVmICsgUy0+YnVmbGVuLCAwLCAyICogQkxBS0UyU19CTE9DS0JZVEVTIC0gUy0+YnVmbGVuICk7IC8qIFBhZGRpbmcgKi8KKyAgYmxha2Uyc19jb21wcmVzcyggUywgUy0+YnVmICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApIC8qIE91dHB1dCBmdWxsIGhhc2ggdG8gdGVtcCBidWZmZXIgKi8KKyAgICBzdG9yZTMyKCBidWZmZXIgKyBzaXplb2YoIFMtPmhbaV0gKSAqIGksIFMtPmhbaV0gKTsKKworICBtZW1jcHkoIG91dCwgYnVmZmVyLCBvdXRsZW4gKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGlubGVuLCBhdCBsZWFzdCwgc2hvdWxkIGJlIHVpbnQ2NF90LiBPdGhlcnMgY2FuIGJlIHNpemVfdC4gKi8KK2ludCBibGFrZTJzKCB1aW50OF90ICpvdXQsIGNvbnN0IHZvaWQgKmluLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB1aW50NjRfdCBpbmxlbiwgdWludDhfdCBrZXlsZW4gKQoreworICBibGFrZTJzX3N0YXRlIFNbMV07CisKKyAgLyogVmVyaWZ5IHBhcmFtZXRlcnMgKi8KKyAgaWYgKCBOVUxMID09IGluICYmIGlubGVuID4gMCApIHJldHVybiAtMTsKKworICBpZiAoIE5VTEwgPT0gb3V0ICkgcmV0dXJuIC0xOworCisgIGlmICggTlVMTCA9PSBrZXkgJiYga2V5bGVuID4gMCkgcmV0dXJuIC0xOworCisgIGlmKCAhb3V0bGVuIHx8IG91dGxlbiA+IEJMQUtFMlNfT1VUQllURVMgKSByZXR1cm4gLTE7CisKKyAgaWYoIGtleWxlbiA+IEJMQUtFMlNfS0VZQllURVMgKSByZXR1cm4gLTE7CisKKyAgaWYoIGtleWxlbiA+IDAgKQorICB7CisgICAgaWYoIGJsYWtlMnNfaW5pdF9rZXkoIFMsIG91dGxlbiwga2V5LCBrZXlsZW4gKSA8IDAgKSByZXR1cm4gLTE7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoIGJsYWtlMnNfaW5pdCggUywgb3V0bGVuICkgPCAwICkgcmV0dXJuIC0xOworICB9CisKKyAgYmxha2Uyc191cGRhdGUoIFMsICggY29uc3QgdWludDhfdCAqIClpbiwgaW5sZW4gKTsKKyAgYmxha2Uyc19maW5hbCggUywgb3V0LCBvdXRsZW4gKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKFNVUEVSQ09QKQoraW50IGNyeXB0b19oYXNoKCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGxvbmcgaW5sZW4gKQoreworICByZXR1cm4gYmxha2Uycyggb3V0LCBpbiwgTlVMTCwgQkxBS0UyU19PVVRCWVRFUywgaW5sZW4sIDAgKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTEFLRTJTX1NFTEZURVNUKQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImJsYWtlMi1rYXQuaCIKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKQoreworICB1aW50OF90IGtleVtCTEFLRTJTX0tFWUJZVEVTXTsKKyAgdWludDhfdCBidWZbS0FUX0xFTkdUSF07CisgIHNpemVfdCBpOworCisgIGZvciggaSA9IDA7IGkgPCBCTEFLRTJTX0tFWUJZVEVTOyArK2kgKQorICAgIGtleVtpXSA9ICggdWludDhfdCApaTsKKworICBmb3IoIGkgPSAwOyBpIDwgS0FUX0xFTkdUSDsgKytpICkKKyAgICBidWZbaV0gPSAoIHVpbnQ4X3QgKWk7CisKKyAgZm9yKCBpID0gMDsgaSA8IEtBVF9MRU5HVEg7ICsraSApCisgIHsKKyAgICB1aW50OF90IGhhc2hbQkxBS0UyU19PVVRCWVRFU107CisKKyAgICBpZiggYmxha2UycyggaGFzaCwgYnVmLCBrZXksIEJMQUtFMlNfT1VUQllURVMsIGksIEJMQUtFMlNfS0VZQllURVMgKSA8IDAgfHwKKyAgICAgICAgMCAhPSBtZW1jbXAoIGhhc2gsIGJsYWtlMnNfa2V5ZWRfa2F0W2ldLCBCTEFLRTJTX09VVEJZVEVTICkgKQorICAgIHsKKyAgICAgIHB1dHMoICJlcnJvciIgKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBwdXRzKCAib2siICk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYnoybW9kdWxlLmMgYi9Nb2R1bGVzL19iejJtb2R1bGUuYwppbmRleCBlM2UwZWIxLi5mNDA3N2ZhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19iejJtb2R1bGUuYworKysgYi9Nb2R1bGVzL19iejJtb2R1bGUuYwpAQCAtNTkyLDcgKzU5Miw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBfYnoyLkJaMkRlY29tcHJlc3Nvci5kZWNvbXByZXNzCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IkJaMkRlY29tcHJlc3NvciAqIikKICAgICBkYXRhOiBQeV9idWZmZXIKICAgICBtYXhfbGVuZ3RoOiBQeV9zc2l6ZV90PS0xCiAKQEAgLTYxNSw3ICs2MTQsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9iejJfQloyRGVjb21wcmVzc29yX2RlY29tcHJlc3NfaW1wbChCWjJEZWNvbXByZXNzb3IgKnNlbGYsIFB5X2J1ZmZlciAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heF9sZW5ndGgpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjNlNDEwNDVkZWIyNDBhMyBpbnB1dD05NTU4YjQyNGM4YjAwNTE2XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjNlNDEwNDVkZWIyNDBhMyBpbnB1dD01MmUxZmZjNjZhOGVhNjI0XSovCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKaW5kZXggOWIxMTk0ZS4uNTg2YjczYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKQEAgLTIwLDEwICsyMCw2IEBACiAgICAgIDxlbmNvZGluZz5fZGVjb2RlKGNoYXJfYnVmZmVyX29ialssZXJyb3JzPSdzdHJpY3QnXSkgLT4KICAgICAgICAgKFVuaWNvZGUgb2JqZWN0LCBieXRlcyBjb25zdW1lZCkKIAotICAgPGVuY29kaW5nPl9lbmNvZGUoKSBpbnRlcmZhY2VzIGFsc28gYWNjZXB0IG5vbi1Vbmljb2RlIG9iamVjdCBhcwotICAgaW5wdXQuIFRoZSBvYmplY3RzIGFyZSB0aGVuIGNvbnZlcnRlZCB0byBVbmljb2RlIHVzaW5nCi0gICBQeVVuaWNvZGVfRnJvbU9iamVjdCgpIHByaW9yIHRvIGFwcGx5aW5nIHRoZSBjb252ZXJzaW9uLgotCiAgICBUaGVzZSA8ZW5jb2Rpbmc+cyBhcmUgYXZhaWxhYmxlOiB1dGZfOCwgdW5pY29kZV9lc2NhcGUsCiAgICByYXdfdW5pY29kZV9lc2NhcGUsIHVuaWNvZGVfaW50ZXJuYWwsIGxhdGluXzEsIGFzY2lpICg3LWJpdCksCiAgICBtYmNzIChvbiB3aW4zMikuCkBAIC02MDgsNyArNjA0LDcgQEAKICAgICByZXR1cm4gY29kZWNfdHVwbGUoZGVjb2RlZCwgZGF0YS0+bGVuKTsKIH0KIAotI2lmZGVmIEhBVkVfTUJDUworI2lmZGVmIE1TX1dJTkRPV1MKIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy5tYmNzX2RlY29kZQpAQCAtNjMwLDYgKzYyNiwyNSBAQAogfQogCiAvKltjbGluaWMgaW5wdXRdCitfY29kZWNzLm9lbV9kZWNvZGUKKyAgICBkYXRhOiBQeV9idWZmZXIKKyAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKKyAgICBmaW5hbDogaW50KGNfZGVmYXVsdD0iMCIpID0gRmFsc2UKKyAgICAvCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfY29kZWNzX29lbV9kZWNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsIGludCBmaW5hbCkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTE2MTc2MTJmM2ZjYWQ4IGlucHV0PTk1YjhhOTJjNDQ2YjAzY2RdKi8KK3sKKyAgICBQeV9zc2l6ZV90IGNvbnN1bWVkID0gZGF0YS0+bGVuOworICAgIFB5T2JqZWN0ICpkZWNvZGVkID0gUHlVbmljb2RlX0RlY29kZUNvZGVQYWdlU3RhdGVmdWwoQ1BfT0VNQ1AsCisgICAgICAgIGRhdGEtPmJ1ZiwgZGF0YS0+bGVuLCBlcnJvcnMsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKK30KKworLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy5jb2RlX3BhZ2VfZGVjb2RlCiAgICAgY29kZXBhZ2U6IGludAogICAgIGRhdGE6IFB5X2J1ZmZlcgpAQCAtNjUxLDcgKzY2Niw3IEBACiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKIH0KIAotI2VuZGlmIC8qIEhBVkVfTUJDUyAqLworI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogLyogLS0tIEVuY29kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTcxOCw3ICs3MzMsNyBAQAogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl83X2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtNzI2LDI0ICs3NDEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl83X2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wZmVkYTIxZmZjOTIxYmM4IGlucHV0PWZkOTFhNzhmMTAzYjA0MjFdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wZmVkYTIxZmZjOTIxYmM4IGlucHV0PWQxYTQ3NTc5ZTc5Y2JlMTVdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEY3KHN0ciwgMCwgMCwgZXJyb3JzKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGNyhzdHIsIDAsIDAsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl84X2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtNzUxLDE5ICs3NTcsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl84X2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wMmJmNDczMzJiOWM3OTZjIGlucHV0PTJjMjJkNDA1MzJmMDcxZjNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wMmJmNDczMzJiOWM3OTZjIGlucHV0PTQyZTNiYTczYzQzOTJlZWZdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhzdHIsICJ1dGYtOCIsIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0FzVVRGOFN0cmluZyhzdHIsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKiBUaGlzIHZlcnNpb24gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBieXRlb3JkZXIgcGFyYW1ldGVyIG9mIHRoZQpAQCAtNzc1LDcgKzc3Miw3IEBACiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzE2X2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgYnl0ZW9yZGVyOiBpbnQgPSAwCiAgICAgLwpAQCAtNzg0LDI0ICs3ODEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl8xNl9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgYnl0ZW9yZGVyKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM2NTRlMTNlZmEyZTY0ZTQgaW5wdXQ9MzkzNWE0ODliMmQ1Mzg1ZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM2NTRlMTNlZmEyZTY0ZTQgaW5wdXQ9ZmY0NjQxNmIwNGVkYjk0NF0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCBieXRlb3JkZXIpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYxNihzdHIsIGVycm9ycywgYnl0ZW9yZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzE2X2xlX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtODA5LDI0ICs3OTcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl8xNl9sZV9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQzMWIwMWU1NWYyZDQ5OTUgaW5wdXQ9YmMyN2RmMDVkMWQyMGRmZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQzMWIwMWU1NWYyZDQ5OTUgaW5wdXQ9Y2IzODU0NTVlYThmMmZlMF0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCAtMSksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl8xNl9iZV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTgzNCwxOSArODEzLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfMTZfYmVfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05Njg4NmE2ZmQ1NGRjYWUzIGlucHV0PTVhNjlkNDExMjc2MzQ2MmJdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05Njg4NmE2ZmQ1NGRjYWUzIGlucHV0PTkxMTk5OTcwNjZiZGFlZmRdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYxNihzdHIsIGVycm9ycywgKzEpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYxNihzdHIsIGVycm9ycywgKzEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLyogVGhpcyB2ZXJzaW9uIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYnl0ZW9yZGVyIHBhcmFtZXRlciBvZiB0aGUKQEAgLTg1OCw3ICs4MjgsNyBAQAogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl8zMl9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIGJ5dGVvcmRlcjogaW50ID0gMAogICAgIC8KQEAgLTg2NywyNCArODM3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfMzJfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywgaW50IGJ5dGVvcmRlcikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01Yzc2MGRhMGMwOWE4YjgzIGlucHV0PTQzNGExZWZhNDkyYjhkNThdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01Yzc2MGRhMGMwOWE4YjgzIGlucHV0PWM1ZTc3ZGE4MmZiZTVjMmFdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgYnl0ZW9yZGVyKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMzIoc3RyLCBlcnJvcnMsIGJ5dGVvcmRlciksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl8zMl9sZV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTg5MiwyNCArODUzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfMzJfbGVfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iNjVjZDE3NmRlOGUzNmQ2IGlucHV0PWRmYTJkN2RjNzhiOTk0MjJdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iNjVjZDE3NmRlOGUzNmQ2IGlucHV0PTk5OTNiMjVmZTA4Nzc4NDhdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgLTEpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51dGZfMzJfYmVfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC05MTcsMjQgKzg2OSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzMyX2JlX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MWQ5ZTcxYTkzNTg3MDllOSBpbnB1dD00NTk1NjE3YjE4MTY5MDAyXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MWQ5ZTcxYTkzNTg3MDllOSBpbnB1dD1kM2UwY2NhYTAyOTIwNDMxXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMzIoc3RyLCBlcnJvcnMsICsxKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMzIoc3RyLCBlcnJvcnMsICsxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudW5pY29kZV9lc2NhcGVfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC05NDIsMjQgKzg4NSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdW5pY29kZV9lc2NhcGVfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTY2MjcxYjMwYmM0ZjdhM2MgaW5wdXQ9ODI3MzUwNmYxNDA3NjkxMl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTY2MjcxYjMwYmM0ZjdhM2MgaW5wdXQ9NjVkOWVlZmNhNjViNDU1YV0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nKHN0ciksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTk2NywyNCArOTAxLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc19yYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hNjZhODA2ZWQwMWM4MzBhIGlucHV0PTE4MTc1NWQ1ZGZhY2VmM2NdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hNjZhODA2ZWQwMWM4MzBhIGlucHV0PTVhYTMzZTRhMTMzMzkxYWJdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZyhzdHIpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZyhzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy5sYXRpbl8xX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtOTkyLDI0ICs5MTcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX2xhdGluXzFfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmMyOGM4M2EyNzg4NGUwOCBpbnB1dD1mMDNmNmRjZjFkODRiZWU0XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmMyOGM4M2EyNzg4NGUwOCBpbnB1dD0zMGIxMWM5ZTQ5YTY1MTUwXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmcoc3RyLCBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9Bc0xhdGluMVN0cmluZyhzdHIsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLmFzY2lpX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtMTAxNywyNCArOTMzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc19hc2NpaV9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjVlMDM1MTgyZDMzYmVmYyBpbnB1dD1kODdlMjVhMTBhNTkzZmVlXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjVlMDM1MTgyZDMzYmVmYyBpbnB1dD04NDNhMWQyNjhlNmRmYThlXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfQXNBU0NJSVN0cmluZyhzdHIsIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcoc3RyLCBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy5jaGFybWFwX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgbWFwcGluZzogb2JqZWN0ID0gTlVMTAogICAgIC8KQEAgLTEwNDMsMjIgKzk1MCwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfY2hhcm1hcF9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywgUHlPYmplY3QgKm1hcHBpbmcpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDQ3NDc2ZjQ4NDk1YTllOSBpbnB1dD04NWY0MTcyNjYxZThkYWQ5XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDQ3NDc2ZjQ4NDk1YTllOSBpbnB1dD0wNzUyY2RlMDdhNmQ2ZDAwXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KICAgICBpZiAobWFwcGluZyA9PSBQeV9Ob25lKQogICAgICAgICBtYXBwaW5nID0gTlVMTDsKIAotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVDaGFybWFwKHN0ciwgbWFwcGluZywgZXJyb3JzKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcChzdHIsIG1hcHBpbmcsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCkBAIC0xMDc0LDM2ICs5NzIsNDIgQEAKICAgICByZXR1cm4gUHlVbmljb2RlX0J1aWxkRW5jb2RpbmdNYXAobWFwKTsKIH0KIAotI2lmZGVmIEhBVkVfTUJDUworI2lmZGVmIE1TX1dJTkRPV1MKIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy5tYmNzX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc19tYmNzX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03NmUyZTE3MGM5NjZjMDgwIGlucHV0PTY1YzA5ZWUxZTQyMDMyNjNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03NmUyZTE3MGM5NjZjMDgwIGlucHV0PWRlNDcxZTA4MTU5NDc1NTNdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZUNvZGVQYWdlKENQX0FDUCwgc3RyLCBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKK30KIAotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZUNvZGVQYWdlKENQX0FDUCwgc3RyLCBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKy8qW2NsaW5pYyBpbnB1dF0KK19jb2RlY3Mub2VtX2VuY29kZQorICAgIHN0cjogdW5pY29kZQorICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAorICAgIC8KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19jb2RlY3Nfb2VtX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsIGNvbnN0IGNoYXIgKmVycm9ycykKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02NWQ1OTgyYzczN2RlNjQ5IGlucHV0PTNmYzVmMDAyOGFhZDNjZGFdKi8KK3sKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZUNvZGVQYWdlKENQX09FTUNQLCBzdHIsIGVycm9ycyksCisgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLmNvZGVfcGFnZV9lbmNvZGUKICAgICBjb2RlX3BhZ2U6IGludAotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtMTExMSwyNCArMTAxNSwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfY29kZV9wYWdlX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludCBjb2RlX3BhZ2UsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDU2NzNmNjA4NTY1N2E5ZSBpbnB1dD1jODU2MmVjNDYwYzJlMzA5XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDU2NzNmNjA4NTY1N2E5ZSBpbnB1dD03ODY0MjFhZTYxN2Q2ODBiXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVDb2RlUGFnZShjb2RlX3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZUNvZGVQYWdlKGNvZGVfcGFnZSwgc3RyLCBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAotI2VuZGlmIC8qIEhBVkVfTUJDUyAqLworI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogLyogLS0tIEVycm9yIGhhbmRsZXIgcmVnaXN0cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTEyMTYsNiArMTEwOSw4IEBACiAgICAgX0NPREVDU19SRUFEQlVGRkVSX0VOQ09ERV9NRVRIT0RERUYKICAgICBfQ09ERUNTX01CQ1NfRU5DT0RFX01FVEhPRERFRgogICAgIF9DT0RFQ1NfTUJDU19ERUNPREVfTUVUSE9EREVGCisgICAgX0NPREVDU19PRU1fRU5DT0RFX01FVEhPRERFRgorICAgIF9DT0RFQ1NfT0VNX0RFQ09ERV9NRVRIT0RERUYKICAgICBfQ09ERUNTX0NPREVfUEFHRV9FTkNPREVfTUVUSE9EREVGCiAgICAgX0NPREVDU19DT0RFX1BBR0VfREVDT0RFX01FVEhPRERFRgogICAgIF9DT0RFQ1NfUkVHSVNURVJfRVJST1JfTUVUSE9EREVGCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jIGIvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYwppbmRleCAxMGZiY2ZlLi4xNjc1MTAyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMKQEAgLTgxLDcgKzgxLDcgQEAKICAgICBQeV9zc2l6ZV90IGxlZnRpbmRleDsgICAgICAgLyogMCA8PSBsZWZ0aW5kZXggPCBCTE9DS0xFTiAqLwogICAgIFB5X3NzaXplX3QgcmlnaHRpbmRleDsgICAgICAvKiAwIDw9IHJpZ2h0aW5kZXggPCBCTE9DS0xFTiAqLwogICAgIHNpemVfdCBzdGF0ZTsgICAgICAgICAgICAgICAvKiBpbmNyZW1lbnRlZCB3aGVuZXZlciB0aGUgaW5kaWNlcyBtb3ZlICovCi0gICAgUHlfc3NpemVfdCBtYXhsZW47CisgICAgUHlfc3NpemVfdCBtYXhsZW47ICAgICAgICAgIC8qIG1heGxlbiBpcyAtMSBmb3IgdW5ib3VuZGVkIGRlcXVlcyAqLwogICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsKIH0gZGVxdWVvYmplY3Q7CiAKQEAgLTEwOCwyOSArMTA4LDE4IEBACiAjZGVmaW5lIENIRUNLX05PVF9FTkQobGluaykKICNlbmRpZgogCi0vKiBUbyBwcmV2ZW50IGxlbiBmcm9tIG92ZXJmbG93aW5nIFBZX1NTSVpFX1RfTUFYLCB3ZSByZWZ1c2UgdG8KLSAgIGFsbG9jYXRlIG5ldyBibG9ja3MgaWYgdGhlIGN1cnJlbnQgbGVuIGlzIG5lYXJpbmcgb3ZlcmZsb3cuCi0qLwotCi0jZGVmaW5lIE1BWF9ERVFVRV9MRU4gKFBZX1NTSVpFX1RfTUFYIC0gMypCTE9DS0xFTikKLQogLyogQSBzaW1wbGUgZnJlZWxpc3Rpbmcgc2NoZW1lIGlzIHVzZWQgdG8gbWluaW1pemUgY2FsbHMgdG8gdGhlIG1lbW9yeQogICAgYWxsb2NhdG9yLiAgSXQgYWNjb21tb2RhdGVzIGNvbW1vbiB1c2UgY2FzZXMgd2hlcmUgbmV3IGJsb2NrcyBhcmUgYmVpbmcKICAgIGFkZGVkIGF0IGFib3V0IHRoZSBzYW1lIHJhdGUgYXMgb2xkIGJsb2NrcyBhcmUgYmVpbmcgZnJlZWQuCiAgKi8KIAotI2RlZmluZSBNQVhGUkVFQkxPQ0tTIDEwCisjZGVmaW5lIE1BWEZSRUVCTE9DS1MgMTYKIHN0YXRpYyBQeV9zc2l6ZV90IG51bWZyZWVibG9ja3MgPSAwOwogc3RhdGljIGJsb2NrICpmcmVlYmxvY2tzW01BWEZSRUVCTE9DS1NdOwogCiBzdGF0aWMgYmxvY2sgKgotbmV3YmxvY2soUHlfc3NpemVfdCBsZW4pIHsKK25ld2Jsb2NrKHZvaWQpIHsKICAgICBibG9jayAqYjsKLSAgICBpZiAobGVuID49IE1BWF9ERVFVRV9MRU4pIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFkZCBtb3JlIGJsb2NrcyB0byB0aGUgZGVxdWUiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogICAgIGlmIChudW1mcmVlYmxvY2tzKSB7CiAgICAgICAgIG51bWZyZWVibG9ja3MtLTsKICAgICAgICAgcmV0dXJuIGZyZWVibG9ja3NbbnVtZnJlZWJsb2Nrc107CkBAIC0xNTQsMTIgKzE0Myw2IEBACiAgICAgfQogfQogCi0vKiBYWFggVG9kbzoKLSAgIElmIGFsaWduZWQgbWVtb3J5IGFsbG9jYXRpb25zIGJlY29tZSBhdmFpbGFibGUsIG1ha2UgdGhlCi0gICBkZXF1ZSBvYmplY3QgNjQgYnl0ZSBhbGlnbmVkIHNvIHRoYXQgYWxsIG9mIHRoZSBmaWVsZHMKLSAgIGNhbiBiZSByZXRyaWV2ZWQgb3IgdXBkYXRlZCBpbiBhIHNpbmdsZSBjYWNoZSBsaW5lLgotKi8KLQogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKQEAgLTE3MSw3ICsxNTQsNyBAQAogICAgIGlmIChkZXF1ZSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGIgPSBuZXdibG9jaygwKTsKKyAgICBiID0gbmV3YmxvY2soKTsKICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihkZXF1ZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjA3LDcgKzE5MCw3IEBACiAgICAgUHlfU0laRShkZXF1ZSktLTsKICAgICBkZXF1ZS0+c3RhdGUrKzsKIAotICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSAtMSkgeworICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA8IDApIHsKICAgICAgICAgaWYgKFB5X1NJWkUoZGVxdWUpKSB7CiAgICAgICAgICAgICBwcmV2YmxvY2sgPSBkZXF1ZS0+cmlnaHRibG9jay0+bGVmdGxpbms7CiAgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayAhPSBkZXF1ZS0+cmlnaHRibG9jayk7CkBAIC0yNzAsNDIgKzI1MywyNCBAQAogLyogVGhlIGRlcXVlJ3Mgc2l6ZSBsaW1pdCBpcyBkLm1heGxlbi4gIFRoZSBsaW1pdCBjYW4gYmUgemVybyBvciBwb3NpdGl2ZS4KICAqIElmIHRoZXJlIGlzIG5vIGxpbWl0LCB0aGVuIGQubWF4bGVuID09IC0xLgogICoKLSAqIEFmdGVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gYSBkZXF1ZSwgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBzaXplIGhhcyBncm93biBwYXN0Ci0gKiB0aGUgbGltaXQuIElmIGl0IGhhcywgd2UgZ2V0IHRoZSBzaXplIGJhY2sgZG93biB0byB0aGUgbGltaXQgYnkgcG9wcGluZyBhbgotICogaXRlbSBvZmYgb2YgdGhlIG9wcG9zaXRlIGVuZC4gIFRoZSBtZXRob2RzIHRoYXQgY2FuIHRyaWdnZXIgdGhpcyBhcmUgYXBwZW5kKCksCi0gKiBhcHBlbmRsZWZ0KCksIGV4dGVuZCgpLCBhbmQgZXh0ZW5kbGVmdCgpLgorICogQWZ0ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byBhIGRlcXVlLCB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIHNpemUgaGFzCisgKiBncm93biBwYXN0IHRoZSBsaW1pdC4gSWYgaXQgaGFzLCB3ZSBnZXQgdGhlIHNpemUgYmFjayBkb3duIHRvIHRoZSBsaW1pdAorICogYnkgcG9wcGluZyBhbiBpdGVtIG9mZiBvZiB0aGUgb3Bwb3NpdGUgZW5kLiAgVGhlIG1ldGhvZHMgdGhhdCBjYW4KKyAqIHRyaWdnZXIgdGhpcyBhcmUgYXBwZW5kKCksIGFwcGVuZGxlZnQoKSwgZXh0ZW5kKCksIGFuZCBleHRlbmRsZWZ0KCkuCisgKgorICogVGhlIG1hY3JvIHRvIGNoZWNrIHdoZXRoZXIgYSBkZXF1ZSBuZWVkcyB0byBiZSB0cmltbWVkIHVzZXMgYSBzaW5nbGUKKyAqIHVuc2lnbmVkIHRlc3QgdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgMCA8PSBtYXhsZW4gPCBQeV9TSVpFKGRlcXVlKS4KICAqLwogCi1zdGF0aWMgdm9pZAotZGVxdWVfdHJpbV9yaWdodChkZXF1ZW9iamVjdCAqZGVxdWUpCi17Ci0gICAgaWYgKGRlcXVlLT5tYXhsZW4gIT0gLTEgJiYgUHlfU0laRShkZXF1ZSkgPiBkZXF1ZS0+bWF4bGVuKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpydiA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7Ci0gICAgICAgIGFzc2VydChydiAhPSBOVUxMKTsKLSAgICAgICAgYXNzZXJ0KFB5X1NJWkUoZGVxdWUpIDw9IGRlcXVlLT5tYXhsZW4pOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgIH0KLX0KKyNkZWZpbmUgTkVFRFNfVFJJTShkZXF1ZSwgbWF4bGVuKSAoKHNpemVfdCkobWF4bGVuKSA8IChzaXplX3QpKFB5X1NJWkUoZGVxdWUpKSkKIAotc3RhdGljIHZvaWQKLWRlcXVlX3RyaW1fbGVmdChkZXF1ZW9iamVjdCAqZGVxdWUpCitzdGF0aWMgaW50CitkZXF1ZV9hcHBlbmRfaW50ZXJuYWwoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBtYXhsZW4pCiB7Ci0gICAgaWYgKGRlcXVlLT5tYXhsZW4gIT0gLTEgJiYgUHlfU0laRShkZXF1ZSkgPiBkZXF1ZS0+bWF4bGVuKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpydiA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOwotICAgICAgICBhc3NlcnQocnYgIT0gTlVMTCk7Ci0gICAgICAgIGFzc2VydChQeV9TSVpFKGRlcXVlKSA8PSBkZXF1ZS0+bWF4bGVuKTsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1kZXF1ZV9hcHBlbmQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlbSkKLXsKLSAgICBkZXF1ZS0+c3RhdGUrKzsKICAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4gLSAxKSB7Ci0gICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soUHlfU0laRShkZXF1ZSkpOworICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKCk7CiAgICAgICAgIGlmIChiID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgYi0+bGVmdGxpbmsgPSBkZXF1ZS0+cmlnaHRibG9jazsKICAgICAgICAgQ0hFQ0tfRU5EKGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmspOwogICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKQEAgLTMxMywyNCArMjc4LDM2IEBACiAgICAgICAgIE1BUktfRU5EKGItPnJpZ2h0bGluayk7CiAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4ID0gLTE7CiAgICAgfQotICAgIFB5X0lOQ1JFRihpdGVtKTsKICAgICBQeV9TSVpFKGRlcXVlKSsrOwogICAgIGRlcXVlLT5yaWdodGluZGV4Kys7CiAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPmRhdGFbZGVxdWUtPnJpZ2h0aW5kZXhdID0gaXRlbTsKLSAgICBkZXF1ZV90cmltX2xlZnQoZGVxdWUpOworICAgIGlmIChORUVEU19UUklNKGRlcXVlLCBtYXhsZW4pKSB7CisgICAgICAgIFB5T2JqZWN0ICpvbGRpdGVtID0gZGVxdWVfcG9wbGVmdChkZXF1ZSwgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihvbGRpdGVtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXF1ZS0+c3RhdGUrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitkZXF1ZV9hcHBlbmQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlbSkKK3sKKyAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgaWYgKGRlcXVlX2FwcGVuZF9pbnRlcm5hbChkZXF1ZSwgaXRlbSwgZGVxdWUtPm1heGxlbikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGFwcGVuZF9kb2MsICJBZGQgYW4gZWxlbWVudCB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZGVxdWUuIik7CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1kZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0pCitzdGF0aWMgaW50CitkZXF1ZV9hcHBlbmRsZWZ0X2ludGVybmFsKGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0sIFB5X3NzaXplX3QgbWF4bGVuKQogewotICAgIGRlcXVlLT5zdGF0ZSsrOwogICAgIGlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKLSAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhQeV9TSVpFKGRlcXVlKSk7CisgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soKTsKICAgICAgICAgaWYgKGIgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICBiLT5yaWdodGxpbmsgPSBkZXF1ZS0+bGVmdGJsb2NrOwogICAgICAgICBDSEVDS19FTkQoZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmspOwogICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayA9IGI7CkBAIC0zMzgsMzcgKzMxNSw2NSBAQAogICAgICAgICBNQVJLX0VORChiLT5sZWZ0bGluayk7CiAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBCTE9DS0xFTjsKICAgICB9Ci0gICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgIFB5X1NJWkUoZGVxdWUpKys7CiAgICAgZGVxdWUtPmxlZnRpbmRleC0tOwogICAgIGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF0gPSBpdGVtOwotICAgIGRlcXVlX3RyaW1fcmlnaHQoZGVxdWUpOworICAgIGlmIChORUVEU19UUklNKGRlcXVlLCBkZXF1ZS0+bWF4bGVuKSkgeworICAgICAgICBQeU9iamVjdCAqb2xkaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihvbGRpdGVtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXF1ZS0+c3RhdGUrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0pCit7CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIGlmIChkZXF1ZV9hcHBlbmRsZWZ0X2ludGVybmFsKGRlcXVlLCBpdGVtLCBkZXF1ZS0+bWF4bGVuKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoYXBwZW5kbGVmdF9kb2MsICJBZGQgYW4gZWxlbWVudCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZS4iKTsKIAorc3RhdGljIFB5T2JqZWN0KgorZmluYWxpemVfaXRlcmF0b3IoUHlPYmplY3QgKml0KQoreworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KIAogLyogUnVuIGFuIGl0ZXJhdG9yIHRvIGV4aGF1c3Rpb24uICBTaG9ydGN1dCBmb3IKICAgIHRoZSBleHRlbmQvZXh0ZW5kbGVmdCBtZXRob2RzIHdoZW4gbWF4bGVuID09IDAuICovCiBzdGF0aWMgUHlPYmplY3QqCiBjb25zdW1lX2l0ZXJhdG9yKFB5T2JqZWN0ICppdCkKIHsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CiAgICAgUHlPYmplY3QgKml0ZW07CiAKLSAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgd2hpbGUgKChpdGVtID0gaXRlcm5leHQoaXQpKSAhPSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICB9Ci0gICAgUHlfREVDUkVGKGl0KTsKLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgUHlfUkVUVVJOX05PTkU7CisgICAgcmV0dXJuIGZpbmFsaXplX2l0ZXJhdG9yKGl0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2V4dGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKICAgICBQeU9iamVjdCAqaXQsICppdGVtOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeV9zc2l6ZV90IG1heGxlbiA9IGRlcXVlLT5tYXhsZW47CiAKICAgICAvKiBIYW5kbGUgY2FzZSB3aGVyZSBpZChkZXF1ZSkgPT0gaWQoaXRlcmFibGUpICovCiAgICAgaWYgKChQeU9iamVjdCAqKWRlcXVlID09IGl0ZXJhYmxlKSB7CkBAIC0zODEsNiArMzg2LDEzIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAobWF4bGVuID09IDApCisgICAgICAgIHJldHVybiBjb25zdW1lX2l0ZXJhdG9yKGl0KTsKKwogICAgIC8qIFNwYWNlIHNhdmluZyBoZXVyaXN0aWMuICBTdGFydCBmaWxsaW5nIGZyb20gdGhlIGxlZnQgKi8KICAgICBpZiAoUHlfU0laRShkZXF1ZSkgPT0gMCkgewogICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayA9PSBkZXF1ZS0+cmlnaHRibG9jayk7CkBAIC0zODksNDAgKzQwMSwxNSBAQAogICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IDA7CiAgICAgfQogCi0gICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLSAgICBpZiAoaXQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAwKQotICAgICAgICByZXR1cm4gY29uc3VtZV9pdGVyYXRvcihpdCk7Ci0KLSAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLSAgICAgICAgZGVxdWUtPnN0YXRlKys7Ci0gICAgICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSBCTE9DS0xFTiAtIDEpIHsKLSAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soUHlfU0laRShkZXF1ZSkpOwotICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYi0+bGVmdGxpbmsgPSBkZXF1ZS0+cmlnaHRibG9jazsKLSAgICAgICAgICAgIENIRUNLX0VORChkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rKTsKLSAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmsgPSBiOwotICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOwotICAgICAgICAgICAgTUFSS19FTkQoYi0+cmlnaHRsaW5rKTsKLSAgICAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4ID0gLTE7CisgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OworICAgIHdoaWxlICgoaXRlbSA9IGl0ZXJuZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoZGVxdWVfYXBwZW5kX2ludGVybmFsKGRlcXVlLCBpdGVtLCBtYXhsZW4pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIFB5X1NJWkUoZGVxdWUpKys7Ci0gICAgICAgIGRlcXVlLT5yaWdodGluZGV4Kys7Ci0gICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07Ci0gICAgICAgIGRlcXVlX3RyaW1fbGVmdChkZXF1ZSk7CiAgICAgfQotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBQeV9ERUNSRUYoaXQpOwotICAgIFB5X1JFVFVSTl9OT05FOworICAgIHJldHVybiBmaW5hbGl6ZV9pdGVyYXRvcihpdCk7CiB9CiAKIFB5RG9jX1NUUlZBUihleHRlbmRfZG9jLApAQCAtNDMyLDYgKzQxOSw4IEBACiBkZXF1ZV9leHRlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZXJhYmxlKQogewogICAgIFB5T2JqZWN0ICppdCwgKml0ZW07CisgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIFB5X3NzaXplX3QgbWF4bGVuID0gZGVxdWUtPm1heGxlbjsKIAogICAgIC8qIEhhbmRsZSBjYXNlIHdoZXJlIGlkKGRlcXVlKSA9PSBpZChpdGVyYWJsZSkgKi8KICAgICBpZiAoKFB5T2JqZWN0ICopZGVxdWUgPT0gaXRlcmFibGUpIHsKQEAgLTQ0NCw2ICs0MzMsMTMgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChtYXhsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIGNvbnN1bWVfaXRlcmF0b3IoaXQpOworCiAgICAgLyogU3BhY2Ugc2F2aW5nIGhldXJpc3RpYy4gIFN0YXJ0IGZpbGxpbmcgZnJvbSB0aGUgcmlnaHQgKi8KICAgICBpZiAoUHlfU0laRShkZXF1ZSkgPT0gMCkgewogICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayA9PSBkZXF1ZS0+cmlnaHRibG9jayk7CkBAIC00NTIsNDAgKzQ0OCwxNSBAQAogICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMjsKICAgICB9CiAKLSAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotICAgIGlmIChpdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGlmIChkZXF1ZS0+bWF4bGVuID09IDApCi0gICAgICAgIHJldHVybiBjb25zdW1lX2l0ZXJhdG9yKGl0KTsKLQotICAgIHdoaWxlICgoaXRlbSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICBkZXF1ZS0+c3RhdGUrKzsKLSAgICAgICAgaWYgKGRlcXVlLT5sZWZ0aW5kZXggPT0gMCkgewotICAgICAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhQeV9TSVpFKGRlcXVlKSk7Ci0gICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiLT5yaWdodGxpbmsgPSBkZXF1ZS0+bGVmdGJsb2NrOwotICAgICAgICAgICAgQ0hFQ0tfRU5EKGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rKTsKLSAgICAgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rID0gYjsKLSAgICAgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBiOwotICAgICAgICAgICAgTUFSS19FTkQoYi0+bGVmdGxpbmspOwotICAgICAgICAgICAgZGVxdWUtPmxlZnRpbmRleCA9IEJMT0NLTEVOOworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICB3aGlsZSAoKGl0ZW0gPSBpdGVybmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlcXVlX2FwcGVuZGxlZnRfaW50ZXJuYWwoZGVxdWUsIGl0ZW0sIG1heGxlbikgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgUHlfU0laRShkZXF1ZSkrKzsKLSAgICAgICAgZGVxdWUtPmxlZnRpbmRleC0tOwotICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdID0gaXRlbTsKLSAgICAgICAgZGVxdWVfdHJpbV9yaWdodChkZXF1ZSk7CiAgICAgfQotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBQeV9ERUNSRUYoaXQpOwotICAgIFB5X1JFVFVSTl9OT05FOworICAgIHJldHVybiBmaW5hbGl6ZV9pdGVyYXRvcihpdCk7CiB9CiAKIFB5RG9jX1NUUlZBUihleHRlbmRsZWZ0X2RvYywKQEAgLTUwNCw3ICs0NzUsNDAgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqZGVxdWVfY29weShQeU9iamVjdCAqZGVxdWUpOworc3RhdGljIFB5T2JqZWN0ICoKK2RlcXVlX2NvcHkoUHlPYmplY3QgKmRlcXVlKQoreworICAgIGRlcXVlb2JqZWN0ICpvbGRfZGVxdWUgPSAoZGVxdWVvYmplY3QgKilkZXF1ZTsKKyAgICBpZiAoUHlfVFlQRShkZXF1ZSkgPT0gJmRlcXVlX3R5cGUpIHsKKyAgICAgICAgZGVxdWVvYmplY3QgKm5ld19kZXF1ZTsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworCisgICAgICAgIG5ld19kZXF1ZSA9IChkZXF1ZW9iamVjdCAqKWRlcXVlX25ldygmZGVxdWVfdHlwZSwgKFB5T2JqZWN0ICopTlVMTCwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgICAgIGlmIChuZXdfZGVxdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBuZXdfZGVxdWUtPm1heGxlbiA9IG9sZF9kZXF1ZS0+bWF4bGVuOworICAgICAgICAvKiBGYXN0IHBhdGggZm9yIHRoZSBkZXF1ZV9yZXBlYXQoKSBjb21tb24gY2FzZSB3aGVyZSBsZW4oZGVxdWUpID09IDEgKi8KKyAgICAgICAgaWYgKFB5X1NJWkUoZGVxdWUpID09IDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gb2xkX2RlcXVlLT5sZWZ0YmxvY2stPmRhdGFbb2xkX2RlcXVlLT5sZWZ0aW5kZXhdOworICAgICAgICAgICAgcnYgPSBkZXF1ZV9hcHBlbmQobmV3X2RlcXVlLCBpdGVtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ2ID0gZGVxdWVfZXh0ZW5kKG5ld19kZXF1ZSwgZGVxdWUpOworICAgICAgICB9CisgICAgICAgIGlmIChydiAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld19kZXF1ZTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYobmV3X2RlcXVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChvbGRfZGVxdWUtPm1heGxlbiA8IDApCisgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopKFB5X1RZUEUoZGVxdWUpKSwgIk8iLCBkZXF1ZSwgTlVMTCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPaSIsCisgICAgICAgICAgICBkZXF1ZSwgb2xkX2RlcXVlLT5tYXhsZW4sIE5VTEwpOworfQorCitQeURvY19TVFJWQVIoY29weV9kb2MsICJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2NvbmNhdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICpvdGhlcikKQEAgLTUzNCwzOCArNTM4LDEwMiBAQAogICAgIHJldHVybiBuZXdfZGVxdWU7CiB9CiAKLXN0YXRpYyB2b2lkIGRlcXVlX2NsZWFyKGRlcXVlb2JqZWN0ICpkZXF1ZSk7CitzdGF0aWMgdm9pZAorZGVxdWVfY2xlYXIoZGVxdWVvYmplY3QgKmRlcXVlKQoreworICAgIGJsb2NrICpiOworICAgIGJsb2NrICpwcmV2YmxvY2s7CisgICAgYmxvY2sgKmxlZnRibG9jazsKKyAgICBQeV9zc2l6ZV90IGxlZnRpbmRleDsKKyAgICBQeV9zc2l6ZV90IG4sIG07CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgUHlPYmplY3QgKippdGVtcHRyLCAqKmxpbWl0OworCisgICAgaWYgKFB5X1NJWkUoZGVxdWUpID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8qIER1cmluZyB0aGUgcHJvY2VzcyBvZiBjbGVhcmluZyBhIGRlcXVlLCBkZWNyZWZzIGNhbiBjYXVzZSB0aGUKKyAgICAgICBkZXF1ZSB0byBtdXRhdGUuICBUbyBhdm9pZCBmYXRhbCBjb25mdXNpb24sIHdlIGhhdmUgdG8gbWFrZSB0aGUKKyAgICAgICBkZXF1ZSBlbXB0eSBiZWZvcmUgY2xlYXJpbmcgdGhlIGJsb2NrcyBhbmQgbmV2ZXIgcmVmZXIgdG8KKyAgICAgICBhbnl0aGluZyB2aWEgZGVxdWUtPnJlZiB3aGlsZSBjbGVhcmluZy4gIChUaGlzIGlzIHRoZSBzYW1lCisgICAgICAgdGVjaG5pcXVlIHVzZWQgZm9yIGNsZWFyaW5nIGxpc3RzLCBzZXRzLCBhbmQgZGljdHMuKQorCisgICAgICAgTWFraW5nIHRoZSBkZXF1ZSBlbXB0eSByZXF1aXJlcyBhbGxvY2F0aW5nIGEgbmV3IGVtcHR5IGJsb2NrLiAgSW4KKyAgICAgICB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCBtZW1vcnkgaXMgZnVsbCwgd2UgZmFsbCBiYWNrIHRvIGFuCisgICAgICAgYWx0ZXJuYXRlIG1ldGhvZCB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBhIG5ldyBibG9jay4gIFJlcGVhdGluZworICAgICAgIHBvcHMgaW4gYSB3aGlsZS1sb29wIGlzIHNsb3dlciwgcG9zc2libHkgcmUtZW50cmFudCAoYW5kIGEgY2xldmVyCisgICAgICAgYWR2ZXJzYXJ5IGNvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHRlcm1pbmF0ZSkuCisgICAgKi8KKworICAgIGIgPSBuZXdibG9jaygpOworICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZ290byBhbHRlcm5hdGVfbWV0aG9kOworICAgIH0KKworICAgIC8qIFJlbWVtYmVyIHRoZSBvbGQgc2l6ZSwgbGVmdGJsb2NrLCBhbmQgbGVmdGluZGV4ICovCisgICAgbiA9IFB5X1NJWkUoZGVxdWUpOworICAgIGxlZnRibG9jayA9IGRlcXVlLT5sZWZ0YmxvY2s7CisgICAgbGVmdGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKKworICAgIC8qIFNldCB0aGUgZGVxdWUgdG8gYmUgZW1wdHkgdXNpbmcgdGhlIG5ld2x5IGFsbG9jYXRlZCBibG9jayAqLworICAgIE1BUktfRU5EKGItPmxlZnRsaW5rKTsKKyAgICBNQVJLX0VORChiLT5yaWdodGxpbmspOworICAgIFB5X1NJWkUoZGVxdWUpID0gMDsKKyAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKKyAgICBkZXF1ZS0+cmlnaHRibG9jayA9IGI7CisgICAgZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7CisgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7CisgICAgZGVxdWUtPnN0YXRlKys7CisKKyAgICAvKiBOb3cgdGhlIG9sZCBzaXplLCBsZWZ0YmxvY2ssIGFuZCBsZWZ0aW5kZXggYXJlIGRpc2Nvbm5lY3RlZCBmcm9tCisgICAgICAgdGhlIGVtcHR5IGRlcXVlIGFuZCB3ZSBjYW4gdXNlIHRoZW0gdG8gZGVjcmVmIHRoZSBwb2ludGVycy4KKyAgICAqLworICAgIG0gPSAoQkxPQ0tMRU4gLSBsZWZ0aW5kZXggPiBuKSA/IG4gOiBCTE9DS0xFTiAtIGxlZnRpbmRleDsKKyAgICBpdGVtcHRyID0gJmxlZnRibG9jay0+ZGF0YVtsZWZ0aW5kZXhdOworICAgIGxpbWl0ID0gaXRlbXB0ciArIG07CisgICAgbiAtPSBtOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChpdGVtcHRyID09IGxpbWl0KSB7CisgICAgICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgQ0hFQ0tfTk9UX0VORChsZWZ0YmxvY2stPnJpZ2h0bGluayk7CisgICAgICAgICAgICBwcmV2YmxvY2sgPSBsZWZ0YmxvY2s7CisgICAgICAgICAgICBsZWZ0YmxvY2sgPSBsZWZ0YmxvY2stPnJpZ2h0bGluazsKKyAgICAgICAgICAgIG0gPSAobiA+IEJMT0NLTEVOKSA/IEJMT0NLTEVOIDogbjsKKyAgICAgICAgICAgIGl0ZW1wdHIgPSBsZWZ0YmxvY2stPmRhdGE7CisgICAgICAgICAgICBsaW1pdCA9IGl0ZW1wdHIgKyBtOworICAgICAgICAgICAgbiAtPSBtOworICAgICAgICAgICAgZnJlZWJsb2NrKHByZXZibG9jayk7CisgICAgICAgIH0KKyAgICAgICAgaXRlbSA9ICooaXRlbXB0cisrKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KKyAgICBDSEVDS19FTkQobGVmdGJsb2NrLT5yaWdodGxpbmspOworICAgIGZyZWVibG9jayhsZWZ0YmxvY2spOworICAgIHJldHVybjsKKworICBhbHRlcm5hdGVfbWV0aG9kOgorICAgIHdoaWxlIChQeV9TSVpFKGRlcXVlKSkgeworICAgICAgICBpdGVtID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKKyAgICAgICAgYXNzZXJ0IChpdGVtICE9IE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQorfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZGVxdWVfcmVwZWF0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlfc3NpemVfdCBuKQorZGVxdWVfY2xlYXJtZXRob2QoZGVxdWVvYmplY3QgKmRlcXVlKQogewotICAgIGRlcXVlb2JqZWN0ICpuZXdfZGVxdWU7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLQotICAgIC8qIFhYWCBhZGQgYSBzcGVjaWFsIGNhc2UgZm9yIHdoZW4gbWF4bGVuIGlzIGRlZmluZWQgKi8KLSAgICBpZiAobiA8IDApCi0gICAgICAgIG4gPSAwOwotICAgIGVsc2UgaWYgKG4gPiAwICYmIFB5X1NJWkUoZGVxdWUpID4gTUFYX0RFUVVFX0xFTiAvIG4pCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCi0gICAgbmV3X2RlcXVlID0gKGRlcXVlb2JqZWN0ICopZGVxdWVfbmV3KCZkZXF1ZV90eXBlLCAoUHlPYmplY3QgKilOVUxMLCAoUHlPYmplY3QgKilOVUxMKTsKLSAgICBuZXdfZGVxdWUtPm1heGxlbiA9IGRlcXVlLT5tYXhsZW47Ci0KLSAgICBmb3IgKCA7IG4gOyBuLS0pIHsKLSAgICAgICAgcmVzdWx0ID0gZGVxdWVfZXh0ZW5kKG5ld19kZXF1ZSwgKFB5T2JqZWN0ICopZGVxdWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdfZGVxdWUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdfZGVxdWU7CisgICAgZGVxdWVfY2xlYXIoZGVxdWUpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCitQeURvY19TVFJWQVIoY2xlYXJfZG9jLCAiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBkZXF1ZS4iKTsKKwogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2lucGxhY2VfcmVwZWF0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlfc3NpemVfdCBuKQogewotICAgIFB5X3NzaXplX3QgaSwgc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGksIG0sIHNpemU7CiAgICAgUHlPYmplY3QgKnNlcTsKICAgICBQeU9iamVjdCAqcnY7CiAKQEAgLTU4MSwyNyArNjQ5LDQ3IEBACiAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA+IE1BWF9ERVFVRV9MRU4gLyBuKSB7Ci0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotICAgIH0KLQogICAgIGlmIChzaXplID09IDEpIHsKICAgICAgICAgLyogY29tbW9uIGNhc2UsIHJlcGVhdGluZyBhIHNpbmdsZSBlbGVtZW50ICovCiAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XTsKIAotICAgICAgICBpZiAoZGVxdWUtPm1heGxlbiAhPSAtMSAmJiBuID4gZGVxdWUtPm1heGxlbikKKyAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPj0gMCAmJiBuID4gZGVxdWUtPm1heGxlbikKICAgICAgICAgICAgIG4gPSBkZXF1ZS0+bWF4bGVuOwogCi0gICAgICAgIGZvciAoaSA9IDAgOyBpIDwgbi0xIDsgaSsrKSB7Ci0gICAgICAgICAgICBydiA9IGRlcXVlX2FwcGVuZChkZXF1ZSwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAocnYgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIGRlcXVlLT5zdGF0ZSsrOworICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IG4tMSA7ICkgeworICAgICAgICAgICAgaWYgKGRlcXVlLT5yaWdodGluZGV4ID09IEJMT0NLTEVOIC0gMSkgeworICAgICAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1NJWkUoZGVxdWUpICs9IGk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiLT5sZWZ0bGluayA9IGRlcXVlLT5yaWdodGJsb2NrOworICAgICAgICAgICAgICAgIENIRUNLX0VORChkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rKTsKKyAgICAgICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKKyAgICAgICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jayA9IGI7CisgICAgICAgICAgICAgICAgTUFSS19FTkQoYi0+cmlnaHRsaW5rKTsKKyAgICAgICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbSA9IG4gLSAxIC0gaTsKKyAgICAgICAgICAgIGlmIChtID4gQkxPQ0tMRU4gLSAxIC0gZGVxdWUtPnJpZ2h0aW5kZXgpCisgICAgICAgICAgICAgICAgbSA9IEJMT0NLTEVOIC0gMSAtIGRlcXVlLT5yaWdodGluZGV4OworICAgICAgICAgICAgaSArPSBtOworICAgICAgICAgICAgd2hpbGUgKG0tLSkgeworICAgICAgICAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4Kys7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgUHlfU0laRShkZXF1ZSkgKz0gaTsKICAgICAgICAgUHlfSU5DUkVGKGRlcXVlKTsKICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlcXVlOwogICAgIH0KIAorICAgIGlmICgoc2l6ZV90KXNpemUgPiBQWV9TU0laRV9UX01BWCAvIChzaXplX3QpbikgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisKICAgICBzZXEgPSBQeVNlcXVlbmNlX0xpc3QoKFB5T2JqZWN0ICopZGVxdWUpOwogICAgIGlmIChzZXEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIHNlcTsKQEAgLTYxOSw2ICs3MDcsMjAgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCAqCitkZXF1ZV9yZXBlYXQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IG4pCit7CisgICAgZGVxdWVvYmplY3QgKm5ld19kZXF1ZTsKKyAgICBQeU9iamVjdCAqcnY7CisKKyAgICBuZXdfZGVxdWUgPSAoZGVxdWVvYmplY3QgKilkZXF1ZV9jb3B5KChQeU9iamVjdCAqKSBkZXF1ZSk7CisgICAgaWYgKG5ld19kZXF1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IGRlcXVlX2lucGxhY2VfcmVwZWF0KG5ld19kZXF1ZSwgbik7CisgICAgUHlfREVDUkVGKG5ld19kZXF1ZSk7CisgICAgcmV0dXJuIHJ2OworfQorCiAvKiBUaGUgcm90YXRlKCkgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgYW5kIGlzIHVzZWQgaW50ZXJuYWxseQogYXMgYSBwcmltaXRpdmUgZm9yIG90aGVyIG1ldGhvZHMuCiAKQEAgLTY3MSw3ICs3NzMsNyBAQAogICAgIHdoaWxlIChuID4gMCkgewogICAgICAgICBpZiAobGVmdGluZGV4ID09IDApIHsKICAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBiID0gbmV3YmxvY2sobGVuKTsKKyAgICAgICAgICAgICAgICBiID0gbmV3YmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICB9CkBAIC03MDIsNyArODA0LDcgQEAKICAgICAgICAgICAgICAgICAqKGRlc3QrKykgPSAqKHNyYysrKTsKICAgICAgICAgICAgIH0gd2hpbGUgKC0tbSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJpZ2h0aW5kZXggPT0gLTEpIHsKKyAgICAgICAgaWYgKHJpZ2h0aW5kZXggPCAwKSB7CiAgICAgICAgICAgICBhc3NlcnQobGVmdGJsb2NrICE9IHJpZ2h0YmxvY2spOwogICAgICAgICAgICAgYXNzZXJ0KGIgPT0gTlVMTCk7CiAgICAgICAgICAgICBiID0gcmlnaHRibG9jazsKQEAgLTcxNSw3ICs4MTcsNyBAQAogICAgIHdoaWxlIChuIDwgMCkgewogICAgICAgICBpZiAocmlnaHRpbmRleCA9PSBCTE9DS0xFTiAtIDEpIHsKICAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBiID0gbmV3YmxvY2sobGVuKTsKKyAgICAgICAgICAgICAgICBiID0gbmV3YmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICB9CkBAIC03OTAsMTEgKzg5MiwxMSBAQAogICAgIGJsb2NrICpyaWdodGJsb2NrID0gZGVxdWUtPnJpZ2h0YmxvY2s7CiAgICAgUHlfc3NpemVfdCBsZWZ0aW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwogICAgIFB5X3NzaXplX3QgcmlnaHRpbmRleCA9IGRlcXVlLT5yaWdodGluZGV4OwotICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoZGVxdWUpIC8gMjsKLSAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShkZXF1ZSkgPj4gMTsKICAgICBQeU9iamVjdCAqdG1wOwogCi0gICAgZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKKyAgICBuKys7CisgICAgd2hpbGUgKC0tbikgewogICAgICAgICAvKiBWYWxpZGF0ZSB0aGF0IHBvaW50ZXJzIGhhdmVuJ3QgbWV0IGluIHRoZSBtaWRkbGUgKi8KICAgICAgICAgYXNzZXJ0KGxlZnRibG9jayAhPSByaWdodGJsb2NrIHx8IGxlZnRpbmRleCA8IHJpZ2h0aW5kZXgpOwogICAgICAgICBDSEVDS19OT1RfRU5EKGxlZnRibG9jayk7CkBAIC04MTQsNyArOTE2LDcgQEAKIAogICAgICAgICAvKiBTdGVwIGJhY2t3YXJkcyB3aXRoIHRoZSByaWdodCBibG9jay9pbmRleCBwYWlyICovCiAgICAgICAgIHJpZ2h0aW5kZXgtLTsKLSAgICAgICAgaWYgKHJpZ2h0aW5kZXggPT0gLTEpIHsKKyAgICAgICAgaWYgKHJpZ2h0aW5kZXggPCAwKSB7CiAgICAgICAgICAgICByaWdodGJsb2NrID0gcmlnaHRibG9jay0+bGVmdGxpbms7CiAgICAgICAgICAgICByaWdodGluZGV4ID0gQkxPQ0tMRU4gLSAxOwogICAgICAgICB9CkBAIC04MzEsMjAgKzkzMywxOSBAQAogICAgIGJsb2NrICpiID0gZGVxdWUtPmxlZnRibG9jazsKICAgICBQeV9zc2l6ZV90IGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKICAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKGRlcXVlKTsKLSAgICBQeV9zc2l6ZV90IGk7CiAgICAgUHlfc3NpemVfdCBjb3VudCA9IDA7CiAgICAgc2l6ZV90IHN0YXJ0X3N0YXRlID0gZGVxdWUtPnN0YXRlOwogICAgIFB5T2JqZWN0ICppdGVtOwogICAgIGludCBjbXA7CiAKLSAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgIG4rKzsKKyAgICB3aGlsZSAoLS1uKSB7CiAgICAgICAgIENIRUNLX05PVF9FTkQoYik7CiAgICAgICAgIGl0ZW0gPSBiLT5kYXRhW2luZGV4XTsKICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0ZW0sIHYsIFB5X0VRKTsKLSAgICAgICAgaWYgKGNtcCA+IDApCi0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICBpZiAoY21wIDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjb3VudCArPSBjbXA7CiAKICAgICAgICAgaWYgKHN0YXJ0X3N0YXRlICE9IGRlcXVlLT5zdGF0ZSkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKQEAgLTg3MSwxMiArOTcyLDEyIEBACiAgICAgYmxvY2sgKmIgPSBkZXF1ZS0+bGVmdGJsb2NrOwogICAgIFB5X3NzaXplX3QgaW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwogICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoZGVxdWUpOwotICAgIFB5X3NzaXplX3QgaTsKICAgICBzaXplX3Qgc3RhcnRfc3RhdGUgPSBkZXF1ZS0+c3RhdGU7CiAgICAgUHlPYmplY3QgKml0ZW07CiAgICAgaW50IGNtcDsKIAotICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrKSB7CisgICAgbisrOworICAgIHdoaWxlICgtLW4pIHsKICAgICAgICAgQ0hFQ0tfTk9UX0VORChiKTsKICAgICAgICAgaXRlbSA9IGItPmRhdGFbaW5kZXhdOwogICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdiwgUHlfRVEpOwpAQCAtOTA2LDExICsxMDA3LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfaW5kZXgoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IGksIHN0YXJ0PTAsIHN0b3A9UHlfU0laRShkZXF1ZSk7CisgICAgUHlfc3NpemVfdCBpLCBuLCBzdGFydD0wLCBzdG9wPVB5X1NJWkUoZGVxdWUpOwogICAgIFB5T2JqZWN0ICp2LCAqaXRlbTsKICAgICBibG9jayAqYiA9IGRlcXVlLT5sZWZ0YmxvY2s7CiAgICAgUHlfc3NpemVfdCBpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CiAgICAgc2l6ZV90IHN0YXJ0X3N0YXRlID0gZGVxdWUtPnN0YXRlOworICAgIGludCBjbXA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjppbmRleCIsICZ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwKQEAgLTkyOCwyMiArMTAzMCwzMiBAQAogICAgIH0KICAgICBpZiAoc3RvcCA+IFB5X1NJWkUoZGVxdWUpKQogICAgICAgICBzdG9wID0gUHlfU0laRShkZXF1ZSk7CisgICAgaWYgKHN0YXJ0ID4gc3RvcCkKKyAgICAgICAgc3RhcnQgPSBzdG9wOworICAgIGFzc2VydCgwIDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IHN0b3AgJiYgc3RvcCA8PSBQeV9TSVpFKGRlcXVlKSk7CiAKLSAgICBmb3IgKGk9MCA7IGk8c3RvcCA7IGkrKykgewotICAgICAgICBpZiAoaSA+PSBzdGFydCkgewotICAgICAgICAgICAgaW50IGNtcDsKLSAgICAgICAgICAgIENIRUNLX05PVF9FTkQoYik7Ci0gICAgICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07Ci0gICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdiwgUHlfRVEpOwotICAgICAgICAgICAgaWYgKGNtcCA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBpZiAoc3RhcnRfc3RhdGUgIT0gZGVxdWUtPnN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQorICAgIC8qIFhYWCBSZXBsYWNlIHRoaXMgbG9vcCB3aXRoIGZhc3RlciBjb2RlIGZyb20gZGVxdWVfaXRlbSgpICovCisgICAgZm9yIChpPTAgOyBpPHN0YXJ0IDsgaSsrKSB7CisgICAgICAgIGluZGV4Kys7CisgICAgICAgIGlmIChpbmRleCA9PSBCTE9DS0xFTikgeworICAgICAgICAgICAgYiA9IGItPnJpZ2h0bGluazsKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG4gPSBzdG9wIC0gaSArIDE7CisgICAgd2hpbGUgKC0tbikgeworICAgICAgICBDSEVDS19OT1RfRU5EKGIpOworICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CisgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCB2LCBQeV9FUSk7CisgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChzdG9wIC0gbik7CisgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzdGFydF9zdGF0ZSAhPSBkZXF1ZS0+c3RhdGUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgaWYgKGluZGV4ID09IEJMT0NLTEVOKSB7CkBAIC0xMDM3LDg0ICsxMTQ5LDEwIEBACiBQeURvY19TVFJWQVIocmVtb3ZlX2RvYywKICJELnJlbW92ZSh2YWx1ZSkgLS0gcmVtb3ZlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdmFsdWUuIik7CiAKLXN0YXRpYyB2b2lkCi1kZXF1ZV9jbGVhcihkZXF1ZW9iamVjdCAqZGVxdWUpCi17Ci0gICAgYmxvY2sgKmI7Ci0gICAgYmxvY2sgKnByZXZibG9jazsKLSAgICBibG9jayAqbGVmdGJsb2NrOwotICAgIFB5X3NzaXplX3QgbGVmdGluZGV4OwotICAgIFB5X3NzaXplX3QgbjsKLSAgICBQeU9iamVjdCAqaXRlbTsKLQotICAgIGlmIChQeV9TSVpFKGRlcXVlKSA9PSAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKiBEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgY2xlYXJpbmcgYSBkZXF1ZSwgZGVjcmVmcyBjYW4gY2F1c2UgdGhlCi0gICAgICAgZGVxdWUgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uLCB3ZSBoYXZlIHRvIG1ha2UgdGhlCi0gICAgICAgZGVxdWUgZW1wdHkgYmVmb3JlIGNsZWFyaW5nIHRoZSBibG9ja3MgYW5kIG5ldmVyIHJlZmVyIHRvCi0gICAgICAgYW55dGhpbmcgdmlhIGRlcXVlLT5yZWYgd2hpbGUgY2xlYXJpbmcuICAoVGhpcyBpcyB0aGUgc2FtZQotICAgICAgIHRlY2huaXF1ZSB1c2VkIGZvciBjbGVhcmluZyBsaXN0cywgc2V0cywgYW5kIGRpY3RzLikKLQotICAgICAgIE1ha2luZyB0aGUgZGVxdWUgZW1wdHkgcmVxdWlyZXMgYWxsb2NhdGluZyBhIG5ldyBlbXB0eSBibG9jay4gIEluCi0gICAgICAgdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgbWVtb3J5IGlzIGZ1bGwsIHdlIGZhbGwgYmFjayB0byBhbgotICAgICAgIGFsdGVybmF0ZSBtZXRob2QgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYSBuZXcgYmxvY2suICBSZXBlYXRpbmcKLSAgICAgICBwb3BzIGluIGEgd2hpbGUtbG9vcCBpcyBzbG93ZXIsIHBvc3NpYmx5IHJlLWVudHJhbnQgKGFuZCBhIGNsZXZlcgotICAgICAgIGFkdmVyc2FyeSBjb3VsZCBjYXVzZSBpdCB0byBuZXZlciB0ZXJtaW5hdGUpLgotICAgICovCi0KLSAgICBiID0gbmV3YmxvY2soMCk7Ci0gICAgaWYgKGIgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBnb3RvIGFsdGVybmF0ZV9tZXRob2Q7Ci0gICAgfQotCi0gICAgLyogUmVtZW1iZXIgdGhlIG9sZCBzaXplLCBsZWZ0YmxvY2ssIGFuZCBsZWZ0aW5kZXggKi8KLSAgICBsZWZ0YmxvY2sgPSBkZXF1ZS0+bGVmdGJsb2NrOwotICAgIGxlZnRpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7Ci0gICAgbiA9IFB5X1NJWkUoZGVxdWUpOwotCi0gICAgLyogU2V0IHRoZSBkZXF1ZSB0byBiZSBlbXB0eSB1c2luZyB0aGUgbmV3bHkgYWxsb2NhdGVkIGJsb2NrICovCi0gICAgTUFSS19FTkQoYi0+bGVmdGxpbmspOwotICAgIE1BUktfRU5EKGItPnJpZ2h0bGluayk7Ci0gICAgUHlfU0laRShkZXF1ZSkgPSAwOwotICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBiOwotICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKLSAgICBkZXF1ZS0+bGVmdGluZGV4ID0gQ0VOVEVSICsgMTsKLSAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKLSAgICBkZXF1ZS0+c3RhdGUrKzsKLQotICAgIC8qIE5vdyB0aGUgb2xkIHNpemUsIGxlZnRibG9jaywgYW5kIGxlZnRpbmRleCBhcmUgZGlzY29ubmVjdGVkIGZyb20KLSAgICAgICB0aGUgZW1wdHkgZGVxdWUgYW5kIHdlIGNhbiB1c2UgdGhlbSB0byBkZWNyZWYgdGhlIHBvaW50ZXJzLgotICAgICovCi0gICAgd2hpbGUgKG4tLSkgewotICAgICAgICBpdGVtID0gbGVmdGJsb2NrLT5kYXRhW2xlZnRpbmRleF07Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgbGVmdGluZGV4Kys7Ci0gICAgICAgIGlmIChsZWZ0aW5kZXggPT0gQkxPQ0tMRU4gJiYgbikgewotICAgICAgICAgICAgQ0hFQ0tfTk9UX0VORChsZWZ0YmxvY2stPnJpZ2h0bGluayk7Ci0gICAgICAgICAgICBwcmV2YmxvY2sgPSBsZWZ0YmxvY2s7Ci0gICAgICAgICAgICBsZWZ0YmxvY2sgPSBsZWZ0YmxvY2stPnJpZ2h0bGluazsKLSAgICAgICAgICAgIGxlZnRpbmRleCA9IDA7Ci0gICAgICAgICAgICBmcmVlYmxvY2socHJldmJsb2NrKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDSEVDS19FTkQobGVmdGJsb2NrLT5yaWdodGxpbmspOwotICAgIGZyZWVibG9jayhsZWZ0YmxvY2spOwotICAgIHJldHVybjsKLQotICBhbHRlcm5hdGVfbWV0aG9kOgotICAgIHdoaWxlIChQeV9TSVpFKGRlcXVlKSkgewotICAgICAgICBpdGVtID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKLSAgICAgICAgYXNzZXJ0IChpdGVtICE9IE5VTEwpOwotICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgfQotfQotCiBzdGF0aWMgaW50CiB2YWxpZF9pbmRleChQeV9zc2l6ZV90IGksIFB5X3NzaXplX3QgbGltaXQpCiB7Ci0gICAgLyogVGhlIGNhc3QgdG8gc2l6ZV90IGxldCB1cyB1c2UganVzdCBhIHNpbmdsZSBjb21wYXJpc29uCisgICAgLyogVGhlIGNhc3QgdG8gc2l6ZV90IGxldHMgdXMgdXNlIGp1c3QgYSBzaW5nbGUgY29tcGFyaXNvbgogICAgICAgIHRvIGNoZWNrIHdoZXRoZXIgaSBpcyBpbiB0aGUgcmFuZ2U6IDAgPD0gaSA8IGxpbWl0ICovCiAgICAgcmV0dXJuIChzaXplX3QpIGkgPCAoc2l6ZV90KSBsaW1pdDsKIH0KQEAgLTExNDMsMTQgKzExODEsMTYgQEAKICAgICAgICAgaSA9IChQeV9zc2l6ZV90KSgoc2l6ZV90KSBpICUgQkxPQ0tMRU4pOwogICAgICAgICBpZiAoaW5kZXggPCAoUHlfU0laRShkZXF1ZSkgPj4gMSkpIHsKICAgICAgICAgICAgIGIgPSBkZXF1ZS0+bGVmdGJsb2NrOwotICAgICAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIHdoaWxlICgtLW4pCiAgICAgICAgICAgICAgICAgYiA9IGItPnJpZ2h0bGluazsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG4gPSAoUHlfc3NpemVfdCkoCiAgICAgICAgICAgICAgICAgICAgICgoc2l6ZV90KShkZXF1ZS0+bGVmdGluZGV4ICsgUHlfU0laRShkZXF1ZSkgLSAxKSkKICAgICAgICAgICAgICAgICAgICAgLyBCTE9DS0xFTiAtIG4pOwogICAgICAgICAgICAgYiA9IGRlcXVlLT5yaWdodGJsb2NrOwotICAgICAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIHdoaWxlICgtLW4pCiAgICAgICAgICAgICAgICAgYiA9IGItPmxlZnRsaW5rOwogICAgICAgICB9CiAgICAgfQpAQCAtMTE5NCwxNCArMTIzNCwxNiBAQAogICAgIGkgPSAoUHlfc3NpemVfdCkoKHNpemVfdCkgaSAlIEJMT0NLTEVOKTsKICAgICBpZiAoaW5kZXggPD0gaGFsZmxlbikgewogICAgICAgICBiID0gZGVxdWUtPmxlZnRibG9jazsKLSAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgbisrOworICAgICAgICB3aGlsZSAoLS1uKQogICAgICAgICAgICAgYiA9IGItPnJpZ2h0bGluazsKICAgICB9IGVsc2UgewogICAgICAgICBuID0gKFB5X3NzaXplX3QpKAogICAgICAgICAgICAgICAgICgoc2l6ZV90KShkZXF1ZS0+bGVmdGluZGV4ICsgUHlfU0laRShkZXF1ZSkgLSAxKSkKICAgICAgICAgICAgICAgICAvIEJMT0NLTEVOIC0gbik7CiAgICAgICAgIGIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLSAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgbisrOworICAgICAgICB3aGlsZSAoLS1uKQogICAgICAgICAgICAgYiA9IGItPmxlZnRsaW5rOwogICAgIH0KICAgICBQeV9JTkNSRUYodik7CkBAIC0xMjExLDE1ICsxMjUzLDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICoKLWRlcXVlX2NsZWFybWV0aG9kKGRlcXVlb2JqZWN0ICpkZXF1ZSkKLXsKLSAgICBkZXF1ZV9jbGVhcihkZXF1ZSk7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLVB5RG9jX1NUUlZBUihjbGVhcl9kb2MsICJSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGRlcXVlLiIpOwotCiBzdGF0aWMgdm9pZAogZGVxdWVfZGVhbGxvYyhkZXF1ZW9iamVjdCAqZGVxdWUpCiB7CkBAIC0xMjQzLDYgKzEyNzYsNyBAQAogICAgIFB5T2JqZWN0ICppdGVtOwogICAgIFB5X3NzaXplX3QgaW5kZXg7CiAgICAgUHlfc3NpemVfdCBpbmRleGxvID0gZGVxdWUtPmxlZnRpbmRleDsKKyAgICBQeV9zc2l6ZV90IGluZGV4aGlnaDsKIAogICAgIGZvciAoYiA9IGRlcXVlLT5sZWZ0YmxvY2s7IGIgIT0gZGVxdWUtPnJpZ2h0YmxvY2s7IGIgPSBiLT5yaWdodGxpbmspIHsKICAgICAgICAgZm9yIChpbmRleCA9IGluZGV4bG87IGluZGV4IDwgQkxPQ0tMRU4gOyBpbmRleCsrKSB7CkBAIC0xMjUxLDcgKzEyODUsOCBAQAogICAgICAgICB9CiAgICAgICAgIGluZGV4bG8gPSAwOwogICAgIH0KLSAgICBmb3IgKGluZGV4ID0gaW5kZXhsbzsgaW5kZXggPD0gZGVxdWUtPnJpZ2h0aW5kZXg7IGluZGV4KyspIHsKKyAgICBpbmRleGhpZ2ggPSBkZXF1ZS0+cmlnaHRpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gaW5kZXhsbzsgaW5kZXggPD0gaW5kZXhoaWdoOyBpbmRleCsrKSB7CiAgICAgICAgIGl0ZW0gPSBiLT5kYXRhW2luZGV4XTsKICAgICAgICAgUHlfVklTSVQoaXRlbSk7CiAgICAgfQpAQCAtMTI1OSw0NSArMTI5NCwzMyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZGVxdWVfY29weShQeU9iamVjdCAqZGVxdWUpCi17Ci0gICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiA9PSAtMSkKLSAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiTyIsIGRlcXVlLCBOVUxMKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopKFB5X1RZUEUoZGVxdWUpKSwgIk9pIiwKLSAgICAgICAgICAgIGRlcXVlLCAoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4sIE5VTEwpOwotfQotCi1QeURvY19TVFJWQVIoY29weV9kb2MsICJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS4iKTsKLQotc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX3JlZHVjZShkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0gICAgUHlPYmplY3QgKmRpY3QsICpyZXN1bHQsICphc2xpc3Q7CisgICAgUHlPYmplY3QgKmRpY3QsICppdDsKICAgICBfUHlfSURFTlRJRklFUihfX2RpY3RfXyk7CiAKICAgICBkaWN0ID0gX1B5T2JqZWN0X0dldEF0dHJJZCgoUHlPYmplY3QgKilkZXF1ZSwgJlB5SWRfX19kaWN0X18pOwotICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBQeUVycl9DbGVhcigpOwotICAgIGFzbGlzdCA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilkZXF1ZSk7Ci0gICAgaWYgKGFzbGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgICAgIGRpY3QgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgfQorCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKChQeU9iamVjdCAqKWRlcXVlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZGljdCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoZGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQotICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPKSIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE9uKSIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIGRlcXVlLT5tYXhsZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQotICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPTylPIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgUHlfTm9uZSwgZGljdCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT24pTyIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIGRlcXVlLT5tYXhsZW4sIGRpY3QpOworCisgICAgaWYgKGRlcXVlLT5tYXhsZW4gPCAwKSB7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKClOTiIsIFB5X1RZUEUoZGVxdWUpLCBkaWN0LCBpdCk7CiAgICAgfQotICAgIFB5X1hERUNSRUYoZGljdCk7Ci0gICAgUHlfREVDUkVGKGFzbGlzdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oKCluKU5OIiwgUHlfVFlQRShkZXF1ZSksIGRlcXVlLT5tYXhsZW4sIGRpY3QsIGl0KTsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihyZWR1Y2VfZG9jLCAiUmV0dXJuIHN0YXRlIGluZm9ybWF0aW9uIGZvciBwaWNrbGluZy4iKTsKQEAgLTEzMjAsNyArMTM0Myw3IEBACiAgICAgICAgIFB5X1JlcHJMZWF2ZShkZXF1ZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuICE9IC0xKQorICAgIGlmICgoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4gPj0gMCkKICAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoImRlcXVlKCVSLCBtYXhsZW49JXpkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbGlzdCwgKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuKTsKICAgICBlbHNlCkBAIC0xMzgxLDcgKzE0MDQsNyBAQAogICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRih4KTsKICAgICAgICAgUHlfREVDUkVGKHkpOwotICAgICAgICBpZiAoYiA9PSAtMSkKKyAgICAgICAgaWYgKGIgPCAwKQogICAgICAgICAgICAgZ290byBkb25lOwogICAgIH0KICAgICAvKiBXZSByZWFjaGVkIHRoZSBlbmQgb2Ygb25lIGRlcXVlIG9yIGJvdGggKi8KQEAgLTE0MTYsOCArMTQzOSwxNCBAQAogICAgIFB5X3NzaXplX3QgbWF4bGVuID0gLTE7CiAgICAgY2hhciAqa3dsaXN0W10gPSB7Iml0ZXJhYmxlIiwgIm1heGxlbiIsIDB9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkYXJncywgInxPTzpkZXF1ZSIsIGt3bGlzdCwgJml0ZXJhYmxlLCAmbWF4bGVub2JqKSkKLSAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChrd2RhcmdzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZGVxdWUoKSIsIDAsIDIsICZpdGVyYWJsZSwgJm1heGxlbm9iaikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkYXJncywgInxPTzpkZXF1ZSIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZXJhYmxlLCAmbWF4bGVub2JqKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgaWYgKG1heGxlbm9iaiAhPSBOVUxMICYmIG1heGxlbm9iaiAhPSBQeV9Ob25lKSB7CiAgICAgICAgIG1heGxlbiA9IFB5TG9uZ19Bc1NzaXplX3QobWF4bGVub2JqKTsKICAgICAgICAgaWYgKG1heGxlbiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQpAQCAtMTQ0Niw3ICsxNDc1LDcgQEAKICAgICBQeV9zc2l6ZV90IGJsb2NrczsKIAogICAgIHJlcyA9IF9QeU9iamVjdF9TSVpFKFB5X1RZUEUoZGVxdWUpKTsKLSAgICBibG9ja3MgPSAoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpICsgQkxPQ0tMRU4gLSAxKSAvIEJMT0NLTEVOOworICAgIGJsb2NrcyA9IChzaXplX3QpKGRlcXVlLT5sZWZ0aW5kZXggKyBQeV9TSVpFKGRlcXVlKSArIEJMT0NLTEVOIC0gMSkgLyBCTE9DS0xFTjsKICAgICBhc3NlcnQoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpIC0gMSA9PQogICAgICAgICAgICAoYmxvY2tzIC0gMSkgKiBCTE9DS0xFTiArIGRlcXVlLT5yaWdodGluZGV4KTsKICAgICByZXMgKz0gYmxvY2tzICogc2l6ZW9mKGJsb2NrKTsKQEAgLTE0NjUsNyArMTQ5NCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfZ2V0X21heGxlbihkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0gICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCisgICAgaWYgKGRlcXVlLT5tYXhsZW4gPCAwKQogICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KGRlcXVlLT5tYXhsZW4pOwogfQpAQCAtMTgwNiw3ICsxODM1LDcgQEAKICAgICBpdGVtID0gaXQtPmItPmRhdGFbaXQtPmluZGV4XTsKICAgICBpdC0+aW5kZXgtLTsKICAgICBpdC0+Y291bnRlci0tOwotICAgIGlmIChpdC0+aW5kZXggPT0gLTEgJiYgaXQtPmNvdW50ZXIgPiAwKSB7CisgICAgaWYgKGl0LT5pbmRleCA8IDAgJiYgaXQtPmNvdW50ZXIgPiAwKSB7CiAgICAgICAgIENIRUNLX05PVF9FTkQoaXQtPmItPmxlZnRsaW5rKTsKICAgICAgICAgaXQtPmIgPSBpdC0+Yi0+bGVmdGxpbms7CiAgICAgICAgIGl0LT5pbmRleCA9IEJMT0NLTEVOIC0gMTsKQEAgLTE5ODAsNyArMjAwOSw3IEBACiAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgZGQtPmRlZmF1bHRfZmFjdG9yeSk7CiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaXRlbXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCAqKWRkLCAmUHlJZF9pdGVtcywgIigpIik7CisgICAgaXRlbXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCAqKWRkLCAmUHlJZF9pdGVtcywgTlVMTCk7CiAgICAgaWYgKGl0ZW1zID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTIyMzUsMTMgKzIyNjQsMTMgQEAKIAogICAgICAgICAgICAgb2xkdmFsID0gX1B5RGljdF9HZXRJdGVtX0tub3duSGFzaChtYXBwaW5nLCBrZXksIGhhc2gpOwogICAgICAgICAgICAgaWYgKG9sZHZhbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKF9QeURpY3RfU2V0SXRlbV9Lbm93bkhhc2gobWFwcGluZywga2V5LCBvbmUsIGhhc2gpID09IC0xKQorICAgICAgICAgICAgICAgIGlmIChfUHlEaWN0X1NldEl0ZW1fS25vd25IYXNoKG1hcHBpbmcsIGtleSwgb25lLCBoYXNoKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbmV3dmFsID0gUHlOdW1iZXJfQWRkKG9sZHZhbCwgb25lKTsKICAgICAgICAgICAgICAgICBpZiAobmV3dmFsID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgICAgICAgICBpZiAoX1B5RGljdF9TZXRJdGVtX0tub3duSGFzaChtYXBwaW5nLCBrZXksIG5ld3ZhbCwgaGFzaCkgPT0gLTEpCisgICAgICAgICAgICAgICAgaWYgKF9QeURpY3RfU2V0SXRlbV9Lbm93bkhhc2gobWFwcGluZywga2V5LCBuZXd2YWwsIGhhc2gpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgICAgIFB5X0NMRUFSKG5ld3ZhbCk7CiAgICAgICAgICAgICB9CkBAIC0yMjY3LDcgKzIyOTYsNyBAQAogICAgICAgICAgICAgUHlfREVDUkVGKG9sZHZhbCk7CiAgICAgICAgICAgICBpZiAobmV3dmFsID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0SXRlbShtYXBwaW5nLCBrZXksIG5ld3ZhbCkgPT0gLTEpCisgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0SXRlbShtYXBwaW5nLCBrZXksIG5ld3ZhbCkgPCAwKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgUHlfQ0xFQVIobmV3dmFsKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3N2LmMgYi9Nb2R1bGVzL19jc3YuYwppbmRleCBiNDI4Mjc5Li43YTc4NTQxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jc3YuYworKysgYi9Nb2R1bGVzL19jc3YuYwpAQCAtNjAsMTAgKzYwLDEwIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBRdW90ZVN0eWxlIHN0eWxlOwotICAgIGNoYXIgKm5hbWU7CisgICAgY29uc3QgY2hhciAqbmFtZTsKIH0gU3R5bGVEZXNjOwogCi1zdGF0aWMgU3R5bGVEZXNjIHF1b3RlX3N0eWxlc1tdID0geworc3RhdGljIGNvbnN0IFN0eWxlRGVzYyBxdW90ZV9zdHlsZXNbXSA9IHsKICAgICB7IFFVT1RFX01JTklNQUwsICAgICJRVU9URV9NSU5JTUFMIiB9LAogICAgIHsgUVVPVEVfQUxMLCAgICAgICAgIlFVT1RFX0FMTCIgfSwKICAgICB7IFFVT1RFX05PTk5VTUVSSUMsICJRVU9URV9OT05OVU1FUklDIiB9LApAQCAtMjg2LDcgKzI4Niw3IEBACiBzdGF0aWMgaW50CiBkaWFsZWN0X2NoZWNrX3F1b3RpbmcoaW50IHF1b3RpbmcpCiB7Ci0gICAgU3R5bGVEZXNjICpxczsKKyAgICBjb25zdCBTdHlsZURlc2MgKnFzOwogCiAgICAgZm9yIChxcyA9IHF1b3RlX3N0eWxlczsgcXMtPm5hbWU7IHFzKyspIHsKICAgICAgICAgaWYgKChpbnQpcXMtPnN0eWxlID09IHF1b3RpbmcpCkBAIC01MTgsMTUgKzUxOCwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jYWxsX2RpYWxlY3QoUHlPYmplY3QgKmRpYWxlY3RfaW5zdCwgUHlPYmplY3QgKmt3YXJncykKIHsKLSAgICBQeU9iamVjdCAqY3Rvcl9hcmdzOwotICAgIFB5T2JqZWN0ICpkaWFsZWN0OwotCi0gICAgY3Rvcl9hcmdzID0gUHlfQnVpbGRWYWx1ZShkaWFsZWN0X2luc3QgPyAiKE8pIiA6ICIoKSIsIGRpYWxlY3RfaW5zdCk7Ci0gICAgaWYgKGN0b3JfYXJncyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBkaWFsZWN0ID0gUHlPYmplY3RfQ2FsbCgoUHlPYmplY3QgKikmRGlhbGVjdF9UeXBlLCBjdG9yX2FyZ3MsIGt3YXJncyk7Ci0gICAgUHlfREVDUkVGKGN0b3JfYXJncyk7Ci0gICAgcmV0dXJuIGRpYWxlY3Q7CisgICAgUHlPYmplY3QgKnR5cGUgPSAoUHlPYmplY3QgKikmRGlhbGVjdF9UeXBlOworICAgIGlmIChkaWFsZWN0X2luc3QpIHsKKyAgICAgICAgcmV0dXJuIF9QeU9iamVjdF9GYXN0Q2FsbERpY3QodHlwZSwgJmRpYWxlY3RfaW5zdCwgMSwga3dhcmdzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBfUHlPYmplY3RfRmFzdENhbGxEaWN0KHR5cGUsIE5VTEwsIDAsIGt3YXJncyk7CisgICAgfQogfQogCiAvKgpAQCAtMTY0OCw3ICsxNjQ2LDcgQEAKIFB5SW5pdF9fY3N2KHZvaWQpCiB7CiAgICAgUHlPYmplY3QgKm1vZHVsZTsKLSAgICBTdHlsZURlc2MgKnN0eWxlOworICAgIGNvbnN0IFN0eWxlRGVzYyAqc3R5bGU7CiAKICAgICBpZiAoUHlUeXBlX1JlYWR5KCZEaWFsZWN0X1R5cGUpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYwppbmRleCA3ZGU5Y2VlLi5iM2E5NTgxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKQEAgLTExMSwxMiArMTExLDYgQEAKICNpZm5kZWYgSVNfSU5UUkVTT1VSQ0UKICNkZWZpbmUgSVNfSU5UUkVTT1VSQ0UoeCkgKCgoc2l6ZV90KSh4KSA+PiAxNikgPT0gMCkKICNlbmRpZgotIyBpZmRlZiBfV0lOMzJfV0NFCi0vKiBVbmxpa2UgZGVza3RvcCBXaW5kb3dzLCBXaW5DRSBoYXMgYm90aCBXIGFuZCBBIHZhcmlhbnRzIG9mCi0gICBHZXRQcm9jQWRkcmVzcywgYnV0IHRoZSBkZWZhdWx0IFcgdmVyc2lvbiBpcyBub3Qgd2hhdCB3ZSB3YW50ICovCi0jICB1bmRlZiBHZXRQcm9jQWRkcmVzcwotIyAgZGVmaW5lIEdldFByb2NBZGRyZXNzIEdldFByb2NBZGRyZXNzQQotIyBlbmRpZgogI2Vsc2UKICNpbmNsdWRlICJjdHlwZXNfZGxmY24uaCIKICNlbmRpZgpAQCAtNDM1LDcgKzQyOSw3IEBACiAgICAgcmV0dXJuIFN0cnVjdFVuaW9uVHlwZV9uZXcodHlwZSwgYXJncywga3dkcywgMCk7CiB9CiAKLXN0YXRpYyBjaGFyIGZyb21fYWRkcmVzc19kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmcm9tX2FkZHJlc3NfZG9jW10gPQogIkMuZnJvbV9hZGRyZXNzKGludGVnZXIpIC0+IEMgaW5zdGFuY2VcbmFjY2VzcyBhIEMgaW5zdGFuY2UgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQ1Myw3ICs0NDcsNyBAQAogICAgIHJldHVybiBQeUNEYXRhX0F0QWRkcmVzcyh0eXBlLCBidWYpOwogfQogCi1zdGF0aWMgY2hhciBmcm9tX2J1ZmZlcl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmcm9tX2J1ZmZlcl9kb2NbXSA9CiAiQy5mcm9tX2J1ZmZlcihvYmplY3QsIG9mZnNldD0wKSAtPiBDIGluc3RhbmNlXG5jcmVhdGUgYSBDIGluc3RhbmNlIGZyb20gYSB3cml0ZWFibGUgYnVmZmVyIjsKIAogc3RhdGljIGludApAQCAtNTI0LDcgKzUxOCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGNoYXIgZnJvbV9idWZmZXJfY29weV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmcm9tX2J1ZmZlcl9jb3B5X2RvY1tdID0KICJDLmZyb21fYnVmZmVyX2NvcHkob2JqZWN0LCBvZmZzZXQ9MCkgLT4gQyBpbnN0YW5jZVxuY3JlYXRlIGEgQyBpbnN0YW5jZSBmcm9tIGEgcmVhZGFibGUgYnVmZmVyIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTU2Niw3ICs1NjAsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBjaGFyIGluX2RsbF9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBpbl9kbGxfZG9jW10gPQogIkMuaW5fZGxsKGRsbCwgbmFtZSkgLT4gQyBpbnN0YW5jZVxuYWNjZXNzIGEgQyBpbnN0YW5jZSBpbiBhIGRsbCI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC02MjMsNyArNjE3LDcgQEAKICAgICByZXR1cm4gUHlDRGF0YV9BdEFkZHJlc3ModHlwZSwgYWRkcmVzcyk7CiB9CiAKLXN0YXRpYyBjaGFyIGZyb21fcGFyYW1fZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZnJvbV9wYXJhbV9kb2NbXSA9CiAiQ29udmVydCBhIFB5dGhvbiBvYmplY3QgaW50byBhIGZ1bmN0aW9uIGNhbGwgcGFyYW1ldGVyLiI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNDg5LDcgKzE0ODMsNyBAQAogCiAqLwogCi1zdGF0aWMgY2hhciAqU0lNUExFX1RZUEVfQ0hBUlMgPSAiY2JCaEhpSWxMZGZ1elpxUVBYT3Y/ZyI7CitzdGF0aWMgY29uc3QgY2hhciBTSU1QTEVfVFlQRV9DSEFSU1tdID0gImNiQmhIaUlsTGRmdXpacVFQWE92P2ciOwogCiBzdGF0aWMgUHlPYmplY3QgKgogY193Y2hhcl9wX2Zyb21fcGFyYW0oUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSkKQEAgLTI0MTQsNyArMjQwOCw3IEBACiAgICAgY2hhciAqY3AgPSBzdHJpbmc7CiAgICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CiAKLSAgICBhc3NlcnQoc2l6ZW9mKHN0cmluZykgLSAxID4gc2l6ZW9mKFB5X3NzaXplX3QpICogMik7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZihzdHJpbmcpIC0gMSA+IHNpemVvZihQeV9zc2l6ZV90KSAqIDIpOwogICAgIGNwICs9IHNwcmludGYoY3AsICIleCIsIFB5X1NBRkVfRE9XTkNBU1QoaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOwogICAgIHdoaWxlICh0YXJnZXQtPmJfYmFzZSkgewogICAgICAgICBieXRlc19sZWZ0ID0gc2l6ZW9mKHN0cmluZykgLSAoY3AgLSBzdHJpbmcpIC0gMTsKQEAgLTMwNzUsNyArMzA2OSw3IEBACiB9OwogCiAjaWZkZWYgTVNfV0lOMzIKLXN0YXRpYyBQUFJPQyBGaW5kQWRkcmVzcyh2b2lkICpoYW5kbGUsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp0eXBlKQorc3RhdGljIFBQUk9DIEZpbmRBZGRyZXNzKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnR5cGUpCiB7CiAjaWZkZWYgTVNfV0lONjQKICAgICAvKiB3aW42NCBoYXMgbm8gc3RkY2FsbCBjYWxsaW5nIGNvbnYsIHNvIGl0IHNob3VsZApAQCAtMzIwOSw3ICszMjAzLDcgQEAKIH0KIAogc3RhdGljIGludAotX2dldF9uYW1lKFB5T2JqZWN0ICpvYmosIGNoYXIgKipwbmFtZSkKK19nZXRfbmFtZShQeU9iamVjdCAqb2JqLCBjb25zdCBjaGFyICoqcG5hbWUpCiB7CiAjaWZkZWYgTVNfV0lOMzIKICAgICBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKQEAgLTMyMzcsNyArMzIzMSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUHlDRnVuY1B0cl9Gcm9tRGxsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIGNoYXIgKm5hbWU7CisgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBpbnQgKCogYWRkcmVzcykodm9pZCk7CiAgICAgUHlPYmplY3QgKmZ0dXBsZTsKICAgICBQeU9iamVjdCAqZGxsOwpAQCAtNTEyNywyOSArNTEyMSwyOCBAQAogCiAjaWZkZWYgTVNfV0lOMzIKIAotc3RhdGljIGNoYXIgY29tZXJyb3JfZG9jW10gPSAiUmFpc2VkIHdoZW4gYSBDT00gbWV0aG9kIGNhbGwgZmFpbGVkLiI7CitzdGF0aWMgY29uc3QgY2hhciBjb21lcnJvcl9kb2NbXSA9ICJSYWlzZWQgd2hlbiBhIENPTSBtZXRob2QgY2FsbCBmYWlsZWQuIjsKIAogaW50CiBjb21lcnJvcl9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CiAgICAgUHlPYmplY3QgKmhyZXN1bHQsICp0ZXh0LCAqZGV0YWlsczsKLSAgICBQeUJhc2VFeGNlcHRpb25PYmplY3QgKmJzZWxmOwogICAgIFB5T2JqZWN0ICphOwogICAgIGludCBzdGF0dXM7CiAKICAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIGt3ZHMpKQotICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT086Q09NRXJyb3IiLCAmaHJlc3VsdCwgJnRleHQsICZkZXRhaWxzKSkKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgYSA9IFB5U2VxdWVuY2VfR2V0U2xpY2UoYXJncywgMSwgUHlTZXF1ZW5jZV9TaXplKGFyZ3MpKTsKICAgICBpZiAoIWEpCi0gICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gLTE7CiAgICAgc3RhdHVzID0gUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiYXJncyIsIGEpOwogICAgIFB5X0RFQ1JFRihhKTsKICAgICBpZiAoc3RhdHVzIDwgMCkKLSAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAtMTsKIAogICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJocmVzdWx0IiwgaHJlc3VsdCkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CkBAIC01MTYwLDkgKzUxNTMsOCBAQAogICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJkZXRhaWxzIiwgZGV0YWlscykgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBic2VsZiA9IChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmOwogICAgIFB5X0lOQ1JFRihhcmdzKTsKLSAgICBQeV9TRVRSRUYoYnNlbGYtPmFyZ3MsIGFyZ3MpOworICAgIFB5X1NFVFJFRigoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5hcmdzLCBhcmdzKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNTQ5MiwxNCArNTQ4NCwxNCBAQAogI2VuZGlmCiAKIC8qIElmIFJUTERfTE9DQUwgaXMgbm90IGRlZmluZWQgKFdpbmRvd3MhKSwgc2V0IGl0IHRvIHplcm8uICovCi0jaWZuZGVmIFJUTERfTE9DQUwKKyNpZiAhSEFWRV9ERUNMX1JUTERfTE9DQUwKICNkZWZpbmUgUlRMRF9MT0NBTCAwCiAjZW5kaWYKIAogLyogSWYgUlRMRF9HTE9CQUwgaXMgbm90IGRlZmluZWQgKGN5Z3dpbiksIHNldCBpdCB0byB0aGUgc2FtZSB2YWx1ZSBhcwogICAgUlRMRF9MT0NBTC4KICovCi0jaWZuZGVmIFJUTERfR0xPQkFMCisjaWYgIUhBVkVfREVDTF9SVExEX0dMT0JBTAogI2RlZmluZSBSVExEX0dMT0JBTCBSVExEX0xPQ0FMCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCmluZGV4IDNjN2Y4OTIuLjYyOWRkZjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKQEAgLTIzMywxNiArMjMzLDE1IEBACiAgICAgcmV0dXJuICgqZnVuYykodGFibGUpOwogfQogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLUVYUE9SVChQWV9MT05HX0xPTkcpIF90ZXN0ZnVuY19xX2JoaWxmZHEoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwgUFlfTE9OR19MT05HIHEpCitFWFBPUlQobG9uZyBsb25nKSBfdGVzdGZ1bmNfcV9iaGlsZmRxKHNpZ25lZCBjaGFyIGIsIHNob3J0IGgsIGludCBpLCBsb25nIGwsIGZsb2F0IGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLCBsb25nIGxvbmcgcSkKIHsKLSAgICByZXR1cm4gKFBZX0xPTkdfTE9ORykoYiArIGggKyBpICsgbCArIGYgKyBkICsgcSk7CisgICAgcmV0dXJuIChsb25nIGxvbmcpKGIgKyBoICsgaSArIGwgKyBmICsgZCArIHEpOwogfQogCi1FWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfcV9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCitFWFBPUlQobG9uZyBsb25nKSBfdGVzdGZ1bmNfcV9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7Ci0gICAgcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CisgICAgcmV0dXJuIChsb25nIGxvbmcpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CiB9CiAKIEVYUE9SVChpbnQpIF90ZXN0ZnVuY19jYWxsYmFja19pX2lmKGludCB2YWx1ZSwgaW50ICgqZnVuYykoaW50KSkKQEAgLTI1NSwxMCArMjU0LDEwIEBACiAgICAgcmV0dXJuIHN1bTsKIH0KIAotRVhQT1JUKFBZX0xPTkdfTE9ORykgX3Rlc3RmdW5jX2NhbGxiYWNrX3FfcWYoUFlfTE9OR19MT05HIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFlfTE9OR19MT05HICgqZnVuYykoUFlfTE9OR19MT05HKSkKK0VYUE9SVChsb25nIGxvbmcpIF90ZXN0ZnVuY19jYWxsYmFja19xX3FmKGxvbmcgbG9uZyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbG9uZyAoKmZ1bmMpKGxvbmcgbG9uZykpCiB7Ci0gICAgUFlfTE9OR19MT05HIHN1bSA9IDA7CisgICAgbG9uZyBsb25nIHN1bSA9IDA7CiAKICAgICB3aGlsZSAodmFsdWUgIT0gMCkgewogICAgICAgICBzdW0gKz0gZnVuYyh2YWx1ZSk7CkBAIC0yNjcsOCArMjY2LDYgQEAKICAgICByZXR1cm4gc3VtOwogfQogCi0jZW5kaWYKLQogdHlwZWRlZiBzdHJ1Y3QgewogICAgIGNoYXIgKm5hbWU7CiAgICAgY2hhciAqdmFsdWU7CkBAIC0zODQsOCArMzgxLDggQEAKIHsKIH0KIAotRVhQT1JUKFBZX0xPTkdfTE9ORykgbGFzdF90Zl9hcmdfczsKLUVYUE9SVCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIGxhc3RfdGZfYXJnX3U7CitFWFBPUlQobG9uZyBsb25nKSBsYXN0X3RmX2FyZ19zOworRVhQT1JUKHVuc2lnbmVkIGxvbmcgbG9uZykgbGFzdF90Zl9hcmdfdTsKIAogc3RydWN0IEJJVFMgewogICAgIGludCBBOiAxLCBCOjIsIEM6MywgRDo0LCBFOiA1LCBGOiA2LCBHOiA3LCBIOiA4LCBJOiA5OwpAQCAtNDQ4LDggKzQ0NSw4IEBACiAgICAgeyBOVUxMLCBOVUxMLCAwLCBOVUxMfSwKIH07CiAKLSNkZWZpbmUgUyBsYXN0X3RmX2FyZ19zID0gKFBZX0xPTkdfTE9ORyljCi0jZGVmaW5lIFUgbGFzdF90Zl9hcmdfdSA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpYworI2RlZmluZSBTIGxhc3RfdGZfYXJnX3MgPSAobG9uZyBsb25nKWMKKyNkZWZpbmUgVSBsYXN0X3RmX2FyZ191ID0gKHVuc2lnbmVkIGxvbmcgbG9uZyljCiAKIEVYUE9SVChzaWduZWQgY2hhcikgdGZfYihzaWduZWQgY2hhciBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVCh1bnNpZ25lZCBjaGFyKSB0Zl9CKHVuc2lnbmVkIGNoYXIgYykgeyBVOyByZXR1cm4gYy8zOyB9CkBAIC00NTksOCArNDU2LDggQEAKIEVYUE9SVCh1bnNpZ25lZCBpbnQpIHRmX0kodW5zaWduZWQgaW50IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKGxvbmcpIHRmX2wobG9uZyBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVCh1bnNpZ25lZCBsb25nKSB0Zl9MKHVuc2lnbmVkIGxvbmcgYykgeyBVOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQoUFlfTE9OR19MT05HKSB0Zl9xKFBZX0xPTkdfTE9ORyBjKSB7IFM7IHJldHVybiBjLzM7IH0KLUVYUE9SVCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIHRmX1EodW5zaWduZWQgUFlfTE9OR19MT05HIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGxvbmcgbG9uZykgdGZfcShsb25nIGxvbmcgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgbG9uZyBsb25nKSB0Zl9RKHVuc2lnbmVkIGxvbmcgbG9uZyBjKSB7IFU7IHJldHVybiBjLzM7IH0KIEVYUE9SVChmbG9hdCkgdGZfZihmbG9hdCBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVChkb3VibGUpIHRmX2QoZG91YmxlIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKGxvbmcgZG91YmxlKSB0Zl9EKGxvbmcgZG91YmxlIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQpAQCAtNDc0LDggKzQ3MSw4IEBACiBFWFBPUlQodW5zaWduZWQgaW50KSBfX3N0ZGNhbGwgc190Zl9JKHVuc2lnbmVkIGludCBjKSB7IFU7IHJldHVybiBjLzM7IH0KIEVYUE9SVChsb25nKSBfX3N0ZGNhbGwgc190Zl9sKGxvbmcgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQodW5zaWduZWQgbG9uZykgX19zdGRjYWxsIHNfdGZfTCh1bnNpZ25lZCBsb25nIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKFBZX0xPTkdfTE9ORykgX19zdGRjYWxsIHNfdGZfcShQWV9MT05HX0xPTkcgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQodW5zaWduZWQgUFlfTE9OR19MT05HKSBfX3N0ZGNhbGwgc190Zl9RKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChsb25nIGxvbmcpIF9fc3RkY2FsbCBzX3RmX3EobG9uZyBsb25nIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHVuc2lnbmVkIGxvbmcgbG9uZykgX19zdGRjYWxsIHNfdGZfUSh1bnNpZ25lZCBsb25nIGxvbmcgYykgeyBVOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQoZmxvYXQpIF9fc3RkY2FsbCBzX3RmX2YoZmxvYXQgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQoZG91YmxlKSBfX3N0ZGNhbGwgc190Zl9kKGRvdWJsZSBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVChsb25nIGRvdWJsZSkgX19zdGRjYWxsIHNfdGZfRChsb25nIGRvdWJsZSBjKSB7IFM7IHJldHVybiBjLzM7IH0KQEAgLTQ5MCw4ICs0ODcsOCBAQAogRVhQT1JUKHVuc2lnbmVkIGludCkgdGZfYkkoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgaW50IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKGxvbmcpIHRmX2JsKHNpZ25lZCBjaGFyIHgsIGxvbmcgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQodW5zaWduZWQgbG9uZykgdGZfYkwoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgbG9uZyBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChQWV9MT05HX0xPTkcpIHRmX2JxKHNpZ25lZCBjaGFyIHgsIFBZX0xPTkdfTE9ORyBjKSB7IFM7IHJldHVybiBjLzM7IH0KLUVYUE9SVCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIHRmX2JRKHNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChsb25nIGxvbmcpIHRmX2JxKHNpZ25lZCBjaGFyIHgsIGxvbmcgbG9uZyBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVCh1bnNpZ25lZCBsb25nIGxvbmcpIHRmX2JRKHNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIGxvbmcgbG9uZyBjKSB7IFU7IHJldHVybiBjLzM7IH0KIEVYUE9SVChmbG9hdCkgdGZfYmYoc2lnbmVkIGNoYXIgeCwgZmxvYXQgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQoZG91YmxlKSB0Zl9iZChzaWduZWQgY2hhciB4LCBkb3VibGUgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQobG9uZyBkb3VibGUpIHRmX2JEKHNpZ25lZCBjaGFyIHgsIGxvbmcgZG91YmxlIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQpAQCAtNTA2LDggKzUwMyw4IEBACiBFWFBPUlQodW5zaWduZWQgaW50KSBfX3N0ZGNhbGwgc190Zl9iSShzaWduZWQgY2hhciB4LCB1bnNpZ25lZCBpbnQgYykgeyBVOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQobG9uZykgX19zdGRjYWxsIHNfdGZfYmwoc2lnbmVkIGNoYXIgeCwgbG9uZyBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVCh1bnNpZ25lZCBsb25nKSBfX3N0ZGNhbGwgc190Zl9iTChzaWduZWQgY2hhciB4LCB1bnNpZ25lZCBsb25nIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKFBZX0xPTkdfTE9ORykgX19zdGRjYWxsIHNfdGZfYnEoc2lnbmVkIGNoYXIgeCwgUFlfTE9OR19MT05HIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgX19zdGRjYWxsIHNfdGZfYlEoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgUFlfTE9OR19MT05HIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGxvbmcgbG9uZykgX19zdGRjYWxsIHNfdGZfYnEoc2lnbmVkIGNoYXIgeCwgbG9uZyBsb25nIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHVuc2lnbmVkIGxvbmcgbG9uZykgX19zdGRjYWxsIHNfdGZfYlEoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgbG9uZyBsb25nIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKGZsb2F0KSBfX3N0ZGNhbGwgc190Zl9iZihzaWduZWQgY2hhciB4LCBmbG9hdCBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVChkb3VibGUpIF9fc3RkY2FsbCBzX3RmX2JkKHNpZ25lZCBjaGFyIHgsIGRvdWJsZSBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVChsb25nIGRvdWJsZSkgX19zdGRjYWxsIHNfdGZfYkQoc2lnbmVkIGNoYXIgeCwgbG9uZyBkb3VibGUgYykgeyBTOyByZXR1cm4gYy8zOyB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKaW5kZXggOTE0MTNkNy4uYjk1OGYzMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwpAQCAtNzcsNyArNzcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotUHJpbnRFcnJvcihjaGFyICptc2csIC4uLikKK1ByaW50RXJyb3IoY29uc3QgY2hhciAqbXNnLCAuLi4pCiB7CiAgICAgY2hhciBidWZbNTEyXTsKICAgICBQeU9iamVjdCAqZiA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYyBiL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCmluZGV4IDMwZTNhOTYuLmQzMDQ0ZjMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCkBAIC0zODIsNyArMzgyLDcgQEAKICAgICAgICAgICAgd2hvc2Ugb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50CiAgICAgICAgICAgIG1hY2hpbmUgbW9kZS4gKi8KICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBwcml2aWxlZGdlZCBpbnN0cnVjdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogcHJpdmlsZWdlZCBpbnN0cnVjdGlvbiIpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTjoKQEAgLTQ3NCw3ICs0NzQsNiBAQAogICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5sKTsKICAgICAgICAgYnJlYWs7CiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgIGNhc2UgJ3EnOgogICAgIGNhc2UgJ1EnOgogICAgICAgICBzcHJpbnRmKGJ1ZmZlciwKQEAgLTQ4NSw3ICs0ODQsNiBAQAogI2VuZGlmCiAgICAgICAgICAgICBzZWxmLT50YWcsIHNlbGYtPnZhbHVlLnEpOwogICAgICAgICBicmVhazsKLSNlbmRpZgogICAgIGNhc2UgJ2QnOgogICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWYpPiIsCiAgICAgICAgICAgICBzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmQpOwpAQCAtNTkzLDkgKzU5MSw3IEBACiAgICAgc2hvcnQgaDsKICAgICBpbnQgaTsKICAgICBsb25nIGw7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICBQWV9MT05HX0xPTkcgcTsKLSNlbmRpZgorICAgIGxvbmcgbG9uZyBxOwogICAgIGxvbmcgZG91YmxlIEQ7CiAgICAgZG91YmxlIGQ7CiAgICAgZmxvYXQgZjsKQEAgLTkzMCw3ICs5MjYsNyBAQAogICogUmFpc2UgYSBuZXcgZXhjZXB0aW9uICdleGNfY2xhc3MnLCBhZGRpbmcgYWRkaXRpb25hbCB0ZXh0IHRvIHRoZSBvcmlnaW5hbAogICogZXhjZXB0aW9uIHN0cmluZy4KICAqLwotdm9pZCBfY3R5cGVzX2V4dGVuZF9lcnJvcihQeU9iamVjdCAqZXhjX2NsYXNzLCBjaGFyICpmbXQsIC4uLikKK3ZvaWQgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlPYmplY3QgKmV4Y19jbGFzcywgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAgICAgdmFfbGlzdCB2YXJnczsKICAgICBQeU9iamVjdCAqdHAsICp2LCAqdGIsICpzLCAqY2xzX3N0ciwgKm1zZ19zdHI7CkBAIC0xMjAzLDcgKzExOTksNyBAQAogCiAjaWZkZWYgTVNfV0lOMzIKIAotc3RhdGljIGNoYXIgZm9ybWF0X2Vycm9yX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZvcm1hdF9lcnJvcl9kb2NbXSA9CiAiRm9ybWF0RXJyb3IoW2ludGVnZXJdKSAtPiBzdHJpbmdcblwKIFxuXAogQ29udmVydCBhIHdpbjMyIGVycm9yIGNvZGUgaW50byBhIHN0cmluZy4gSWYgdGhlIGVycm9yIGNvZGUgaXMgbm90XG5cCkBAIC0xMjI3LDcgKzEyMjMsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBjaGFyIGxvYWRfbGlicmFyeV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBsb2FkX2xpYnJhcnlfZG9jW10gPQogIkxvYWRMaWJyYXJ5KG5hbWUpIC0+IGhhbmRsZVxuXAogXG5cCiBMb2FkIGFuIGV4ZWN1dGFibGUgKHVzdWFsbHkgYSBETEwpLCBhbmQgcmV0dXJuIGEgaGFuZGxlIHRvIGl0LlxuXApAQCAtMTI1Niw3ICsxMjUyLDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgY2hhciBmcmVlX2xpYnJhcnlfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZnJlZV9saWJyYXJ5X2RvY1tdID0KICJGcmVlTGlicmFyeShoYW5kbGUpIC0+IHZvaWRcblwKIFxuXAogRnJlZSB0aGUgaGFuZGxlIG9mIGFuIGV4ZWN1dGFibGUgcHJldmlvdXNseSBsb2FkZWQgYnkgTG9hZExpYnJhcnkuXG4iOwpAQCAtMTI3MSw3ICsxMjY3LDcgQEAKICAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAotc3RhdGljIGNoYXIgY29weV9jb21fcG9pbnRlcl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBjb3B5X2NvbV9wb2ludGVyX2RvY1tdID0KICJDb3B5Q29tUG9pbnRlcihzcmMsIGRzdCkgLT4gSFJFU1VMVCB2YWx1ZVxuIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEzMDksNyArMTMwNSw3IEBACiAgICAgUHlPYmplY3QgKm5hbWUsICpuYW1lMjsKICAgICBjaGFyICpuYW1lX3N0cjsKICAgICB2b2lkICogaGFuZGxlOwotI2lmZGVmIFJUTERfTE9DQUwKKyNpZiBIQVZFX0RFQ0xfUlRMRF9MT0NBTAogICAgIGludCBtb2RlID0gUlRMRF9OT1cgfCBSVExEX0xPQ0FMOwogI2Vsc2UKICAgICAvKiBjeWd3aW4gZG9lc24ndCBkZWZpbmUgUlRMRF9MT0NBTCAqLwpAQCAtMTQ0MSw3ICsxNDM3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogZnVuY3Rpb25zCiAgKi8KLXN0YXRpYyBjaGFyIHNpemVvZl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBzaXplb2ZfZG9jW10gPQogInNpemVvZihDIHR5cGUpIC0+IGludGVnZXJcbiIKICJzaXplb2YoQyBpbnN0YW5jZSkgLT4gaW50ZWdlclxuIgogIlJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIEMgaW5zdGFuY2UiOwpAQCAtMTQ2Miw3ICsxNDU4LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGNoYXIgYWxpZ25tZW50X2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGFsaWdubWVudF9kb2NbXSA9CiAiYWxpZ25tZW50KEMgdHlwZSkgLT4gaW50ZWdlclxuIgogImFsaWdubWVudChDIGluc3RhbmNlKSAtPiBpbnRlZ2VyXG4iCiAiUmV0dXJuIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG9mIGEgQyBpbnN0YW5jZSI7CkBAIC0xNDg1LDcgKzE0ODEsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgY2hhciBieXJlZl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBieXJlZl9kb2NbXSA9CiAiYnlyZWYoQyBpbnN0YW5jZVssIG9mZnNldD0wXSkgLT4gYnlyZWYtb2JqZWN0XG4iCiAiUmV0dXJuIGEgcG9pbnRlciBsb29rYWxpa2UgdG8gYSBDIGluc3RhbmNlLCBvbmx5IHVzYWJsZVxuIgogImFzIGZ1bmN0aW9uIGFyZ3VtZW50IjsKQEAgLTE1MjksNyArMTUyNSw3IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CiB9CiAKLXN0YXRpYyBjaGFyIGFkZHJlc3NvZl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBhZGRyZXNzb2ZfZG9jW10gPQogImFkZHJlc3NvZihDIGluc3RhbmNlKSAtPiBpbnRlZ2VyXG4iCiAiUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBDIGluc3RhbmNlIGludGVybmFsIGJ1ZmZlciI7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYyBiL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYwppbmRleCBkNjY2YmU1Li5hNDM1ODVmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jCkBAIC0zNzksMTQgKzM3OSwxMiBAQAogICAgIHJldHVybiAwOwogfQogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQogLyogU2FtZSwgYnV0IGhhbmRsaW5nIG5hdGl2ZSBsb25nIGxvbmcuICovCiAKIHN0YXRpYyBpbnQKLWdldF9sb25nbG9uZyhQeU9iamVjdCAqdiwgUFlfTE9OR19MT05HICpwKQorZ2V0X2xvbmdsb25nKFB5T2JqZWN0ICp2LCBsb25nIGxvbmcgKnApCiB7Ci0gICAgUFlfTE9OR19MT05HIHg7CisgICAgbG9uZyBsb25nIHg7CiAgICAgaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBmbG9hdCIpOwpAQCAtNDAyLDIzICs0MDAsMjEgQEAKIC8qIFNhbWUsIGJ1dCBoYW5kbGluZyBuYXRpdmUgdW5zaWduZWQgbG9uZyBsb25nLiAqLwogCiBzdGF0aWMgaW50Ci1nZXRfdWxvbmdsb25nKFB5T2JqZWN0ICp2LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKnApCitnZXRfdWxvbmdsb25nKFB5T2JqZWN0ICp2LCB1bnNpZ25lZCBsb25nIGxvbmcgKnApCiB7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHg7CiAgICAgaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBmbG9hdCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2KTsKLSAgICBpZiAoeCA9PSAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgKnAgPSB4OwogICAgIHJldHVybiAwOwogfQogCi0jZW5kaWYKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJbnRlZ2VyIGZpZWxkcywgd2l0aCBiaXRmaWVsZCBzdXBwb3J0CiAgKi8KQEAgLTcxNSwxNCArNzExLDYgQEAKIH0KICNlbmRpZgogCi0jaWZkZWYgSEFWRV9DOTlfQk9PTAotI2RlZmluZSBCT09MX1RZUEUgX0Jvb2wKLSNlbHNlCi0jZGVmaW5lIEJPT0xfVFlQRSBjaGFyCi0jdW5kZWYgU0laRU9GX19CT09MCi0jZGVmaW5lIFNJWkVPRl9fQk9PTCAxCi0jZW5kaWYKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJvb2xfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7CkBAIC03MzAsMTAgKzcxOCwxMCBAQAogICAgIGNhc2UgLTE6CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGNhc2UgMDoKLSAgICAgICAgKihCT09MX1RZUEUgKilwdHIgPSAwOworICAgICAgICAqKF9Cb29sICopcHRyID0gMDsKICAgICAgICAgX1JFVCh2YWx1ZSk7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgKihCT09MX1RZUEUgKilwdHIgPSAxOworICAgICAgICAqKF9Cb29sICopcHRyID0gMTsKICAgICAgICAgX1JFVCh2YWx1ZSk7CiAgICAgfQogfQpAQCAtNzQxLDcgKzcyOSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYm9vbF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0gICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykqKEJPT0xfVFlQRSAqKXB0cik7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykqKF9Cb29sICopcHRyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTg4OCwxNiArODc2LDE1IEBACiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CiB9CiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogc3RhdGljIFB5T2JqZWN0ICoKIHFfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0gICAgUFlfTE9OR19MT05HIHZhbDsKLSAgICBQWV9MT05HX0xPTkcgeDsKKyAgICBsb25nIGxvbmcgdmFsOworICAgIGxvbmcgbG9uZyB4OwogICAgIGlmIChnZXRfbG9uZ2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7Ci0gICAgeCA9IFNFVChQWV9MT05HX0xPTkcsIHgsIHZhbCwgc2l6ZSk7CisgICAgeCA9IFNFVChsb25nIGxvbmcsIHgsIHZhbCwgc2l6ZSk7CiAgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CiAgICAgX1JFVCh2YWx1ZSk7CiB9CkBAIC05MDUsMTMgKzg5MiwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHFfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0gICAgUFlfTE9OR19MT05HIHZhbDsKLSAgICBQWV9MT05HX0xPTkcgZmllbGQ7CisgICAgbG9uZyBsb25nIHZhbDsKKyAgICBsb25nIGxvbmcgZmllbGQ7CiAgICAgaWYgKGdldF9sb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOwogICAgIGZpZWxkID0gU1dBUF84KGZpZWxkKTsKLSAgICBmaWVsZCA9IFNFVChQWV9MT05HX0xPTkcsIGZpZWxkLCB2YWwsIHNpemUpOworICAgIGZpZWxkID0gU0VUKGxvbmcgbG9uZywgZmllbGQsIHZhbCwgc2l6ZSk7CiAgICAgZmllbGQgPSBTV0FQXzgoZmllbGQpOwogICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAgICAgX1JFVCh2YWx1ZSk7CkBAIC05MjAsNyArOTA3LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBxX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLSAgICBQWV9MT05HX0xPTkcgdmFsOworICAgIGxvbmcgbG9uZyB2YWw7CiAgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbCk7CkBAIC05MjksNyArOTE2LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBxX2dldF9zdyh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLSAgICBQWV9MT05HX0xPTkcgdmFsOworICAgIGxvbmcgbG9uZyB2YWw7CiAgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogICAgIHZhbCA9IFNXQVBfOCh2YWwpOwogICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwpAQCAtOTM5LDEyICs5MjYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBRX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgeDsKICAgICBpZiAoZ2V0X3Vsb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBtZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKLSAgICB4ID0gU0VUKFBZX0xPTkdfTE9ORywgeCwgdmFsLCBzaXplKTsKKyAgICB4ID0gU0VUKGxvbmcgbG9uZywgeCwgdmFsLCBzaXplKTsKICAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKICAgICBfUkVUKHZhbHVlKTsKIH0KQEAgLTk1MiwxMyArOTM5LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogUV9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOwotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBmaWVsZDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBmaWVsZDsKICAgICBpZiAoZ2V0X3Vsb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOwogICAgIGZpZWxkID0gU1dBUF84KGZpZWxkKTsKLSAgICBmaWVsZCA9IFNFVCh1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGZpZWxkLCB2YWwsIHNpemUpOworICAgIGZpZWxkID0gU0VUKHVuc2lnbmVkIGxvbmcgbG9uZywgZmllbGQsIHZhbCwgc2l6ZSk7CiAgICAgZmllbGQgPSBTV0FQXzgoZmllbGQpOwogICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAgICAgX1JFVCh2YWx1ZSk7CkBAIC05NjcsNyArOTU0LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBRX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CiAgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsKTsKQEAgLTk3NiwxMyArOTYzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogUV9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdmFsOwogICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKICAgICB2YWwgPSBTV0FQXzgodmFsKTsKICAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbCk7CiB9Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBub24taW50ZWdlciBhY2Nlc3NvciBtZXRob2RzLCBub3Qgc3VwcG9ydGluZyBiaXQgZmllbGRzCkBAIC0xNDkwLDEwICsxNDc2LDggQEAKICNpZiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HCiAgICAgdiA9ICh2b2lkICopUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayh2YWx1ZSk7CiAjZWxzZQotI2lmbmRlZiBIQVZFX0xPTkdfTE9ORwotIyAgIGVycm9yICJQeUxvbmdfQXNWb2lkUHRyOiBzaXplb2Yodm9pZCopID4gc2l6ZW9mKGxvbmcpLCBidXQgbm8gbG9uZyBsb25nIgotI2VsaWYgU0laRU9GX0xPTkdfTE9ORyA8IFNJWkVPRl9WT0lEX1AKLSMgICBlcnJvciAiUHlMb25nX0FzVm9pZFB0cjogc2l6ZW9mKFBZX0xPTkdfTE9ORykgPCBzaXplb2Yodm9pZCopIgorI2lmIFNJWkVPRl9MT05HX0xPTkcgPCBTSVpFT0ZfVk9JRF9QCisjICAgZXJyb3IgIlB5TG9uZ19Bc1ZvaWRQdHI6IHNpemVvZihsb25nIGxvbmcpIDwgc2l6ZW9mKHZvaWQqKSIKICNlbmRpZgogICAgIHYgPSAodm9pZCAqKVB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHZhbHVlKTsKICNlbmRpZgpAQCAtMTUzOCwxNCArMTUyMiwxMiBAQAogI2Vsc2UKICMgZXJyb3IKICNlbmRpZgotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAjaWYgU0laRU9GX0xPTkdfTE9ORyA9PSA4CiAgICAgeyAncScsIHFfc2V0LCBxX2dldCwgJmZmaV90eXBlX3NpbnQ2NCwgcV9zZXRfc3csIHFfZ2V0X3N3fSwKICAgICB7ICdRJywgUV9zZXQsIFFfZ2V0LCAmZmZpX3R5cGVfdWludDY0LCBRX3NldF9zdywgUV9nZXRfc3d9LAogI2Vsc2UKICMgZXJyb3IKICNlbmRpZgotI2VuZGlmCiAgICAgeyAnUCcsIFBfc2V0LCBQX2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAogICAgIHsgJ3onLCB6X3NldCwgel9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQpAQCAtMTYzNSwxMCArMTYxNyw4IEBACiAjZW5kaWYKICovCiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IFBZX0xPTkdfTE9ORyB4OyB9IHNfbG9uZ19sb25nOwotI2RlZmluZSBMT05HX0xPTkdfQUxJR04gKHNpemVvZihzX2xvbmdfbG9uZykgLSBzaXplb2YoUFlfTE9OR19MT05HKSkKLSNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IGxvbmcgbG9uZyB4OyB9IHNfbG9uZ19sb25nOworI2RlZmluZSBMT05HX0xPTkdfQUxJR04gKHNpemVvZihzX2xvbmdfbG9uZykgLSBzaXplb2YobG9uZyBsb25nKSkKIAogLyogZnJvbSBmZmkuaDoKIHR5cGVkZWYgc3RydWN0IF9mZmlfdHlwZQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCmluZGV4IGYyZGY1YzAuLjVkM2I5NjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKQEAgLTMxLDkgKzMxLDcgQEAKICAgICAgICAgICAgICAgICBsb25nIGw7CiAgICAgICAgICAgICAgICAgZmxvYXQgZjsKICAgICAgICAgICAgICAgICBkb3VibGUgZDsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgICAgICAgICAgICAgIFBZX0xPTkdfTE9ORyBsbDsKLSNlbmRpZgorICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBsbDsKICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBEOwogfTsKIApAQCAtMzAzLDkgKzMwMSw3IEBACiAgICAgICAgIHNob3J0IGg7CiAgICAgICAgIGludCBpOwogICAgICAgICBsb25nIGw7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICAgICAgUFlfTE9OR19MT05HIHE7Ci0jZW5kaWYKKyAgICAgICAgbG9uZyBsb25nIHE7CiAgICAgICAgIGxvbmcgZG91YmxlIEQ7CiAgICAgICAgIGRvdWJsZSBkOwogICAgICAgICBmbG9hdCBmOwpAQCAtMzI3LDcgKzMyMyw3IEBACiBQeUNEYXRhX3NldChQeU9iamVjdCAqZHN0LCBQeU9iamVjdCAqdHlwZSwgU0VURlVOQyBzZXRmdW5jLCBQeU9iamVjdCAqdmFsdWUsCiAgICAgICAgICAgUHlfc3NpemVfdCBpbmRleCwgUHlfc3NpemVfdCBzaXplLCBjaGFyICpwdHIpOwogCi1leHRlcm4gdm9pZCBfY3R5cGVzX2V4dGVuZF9lcnJvcihQeU9iamVjdCAqZXhjX2NsYXNzLCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gdm9pZCBfY3R5cGVzX2V4dGVuZF9lcnJvcihQeU9iamVjdCAqZXhjX2NsYXNzLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIHN0cnVjdCBiYXNlc3BlYyB7CiAgICAgQ0RhdGFPYmplY3QgKmJhc2U7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9kbG1hbGxvYy5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvZGxtYWxsb2MuYwppbmRleCA2ZTQ3NGI3Li41NWMyZDc2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9kbG1hbGxvYy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2RsbWFsbG9jLmMKQEAgLTUyNSw3ICs1MjUsNyBAQAogI2RlZmluZSBNTUFQX0NMRUFSUyAxCiAjZW5kaWYgIC8qIE1NQVBfQ0xFQVJTICovCiAjaWZuZGVmIEhBVkVfTVJFTUFQCi0jaWZkZWYgbGludXgKKyNpZmRlZiBfX2xpbnV4X18KICNkZWZpbmUgSEFWRV9NUkVNQVAgMQogI2Vsc2UgICAvKiBsaW51eCAqLwogI2RlZmluZSBIQVZFX01SRU1BUCAwCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9kZWJ1Zy5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmMWY5Zi4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIGRlYnVnLmMgLSBDb3B5cmlnaHQgKGMpIDE5OTYgUmVkIEhhdCwgSW5jLgotCi0gICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLSAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAgIElOIE5PIEVWRU5UIFNIQUxMIENZR05VUyBTT0xVVElPTlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKLSAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaW5jbHVkZSA8ZmZpLmg+Ci0jaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIEdlbmVyYWwgZGVidWdnaW5nIHJvdXRpbmVzICovCi0KLXZvaWQgZmZpX3N0b3BfaGVyZSh2b2lkKQotewotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCi0gICAgIFBsYWNlIGEgYnJlYWtwb2ludCBvbiBmZmlfc3RvcF9oZXJlIHRvIGJlIG5vdGlmaWVkIG9mIAotICAgICBzaWduaWZpY2FudCBldmVudHMuICovCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHZpYSB0aGUgRkZJX0FTU0VSVCgpIG1hY3JvICovCi0KLXZvaWQgZmZpX2Fzc2VydChjaGFyICpleHByLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgZnByaW50ZihzdGRlcnIsICJBU1NFUlRJT04gRkFJTFVSRTogJXMgYXQgJXM6JWRcbiIsIGV4cHIsIGZpbGUsIGxpbmUpOwotICBmZmlfc3RvcF9oZXJlKCk7Ci0gIGFib3J0KCk7Ci19Ci0KLS8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gYW4gZmZpX3R5cGUgc3RydWN0dXJlICovCi0KLXZvaWQgZmZpX3R5cGVfdGVzdChmZmlfdHlwZSAqYSwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIEZGSV9BU1NFUlRfQVQoYSAhPSBOVUxMLCBmaWxlLCBsaW5lKTsKLQotICAvKkAtdXNlZGVmQCovCi0gIEZGSV9BU1NFUlRfQVQoYS0+dHlwZSA8PSBGRklfVFlQRV9MQVNULCBmaWxlLCBsaW5lKTsKLSAgRkZJX0FTU0VSVF9BVChhLT50eXBlID09IEZGSV9UWVBFX1ZPSUQgfHwgYS0+c2l6ZSA+IDAsIGZpbGUsIGxpbmUpOwotICBGRklfQVNTRVJUX0FUKGEtPnR5cGUgPT0gRkZJX1RZUEVfVk9JRCB8fCBhLT5hbGlnbm1lbnQgPiAwLCBmaWxlLCBsaW5lKTsKLSAgRkZJX0FTU0VSVF9BVChhLT50eXBlICE9IEZGSV9UWVBFX1NUUlVDVCB8fCBhLT5lbGVtZW50cyAhPSBOVUxMLCBmaWxlLCBsaW5lKTsKLSAgLypAPXVzZWRlZkAqLwotfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9mZmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5M2FhYS4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9mZmkuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgZmZpLmMgLSBDb3B5cmlnaHQgKGMpIDE5OTggIFJlZCBIYXQsIEluYy4KLSAgIAotICAgQVJNIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAotCi0gICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLSAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAgIElOIE5PIEVWRU5UIFNIQUxMIENZR05VUyBTT0xVVElPTlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKLSAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaW5jbHVkZSA8ZmZpLmg+Ci0jaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpZmRlZiBfV0lOMzJfV0NFCi0jcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MTQyKSAgICAvKiBiZW5pZ24gcmVkZWZpbml0aW9uIG9mIHR5cGUgKi8KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotLyogZmZpX3ByZXBfYXJncyBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmx5IHJvdXRpbmUgb25jZSBzdGFjayBzcGFjZQotICAgaGFzIGJlZW4gYWxsb2NhdGVkIGZvciB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudHMgKi8KLQotLypALWV4cG9ydGhlYWRlckAqLwotdm9pZCBmZmlfcHJlcF9hcmdzKGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpCi0vKkA9ZXhwb3J0aGVhZGVyQCovCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotICByZWdpc3RlciB2b2lkICoqcF9hcmd2OwotICByZWdpc3RlciBjaGFyICphcmdwOwotICByZWdpc3RlciBmZmlfdHlwZSAqKnBfYXJnOwotCi0gIGFyZ3AgPSBzdGFjazsKLQotICBpZiAoIGVjaWYtPmNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUICkgewotICAgICoodm9pZCAqKikgYXJncCA9IGVjaWYtPnJ2YWx1ZTsKLSAgICBhcmdwICs9IDQ7Ci0gIH0KLQotICBwX2FyZ3YgPSBlY2lmLT5hdmFsdWU7Ci0KLSAgZm9yIChpID0gZWNpZi0+Y2lmLT5uYXJncywgcF9hcmcgPSBlY2lmLT5jaWYtPmFyZ190eXBlczsKLSAgICAgICAoaSAhPSAwKTsKLSAgICAgICBpLS0sIHBfYXJnKyspCi0gICAgewotICAgICAgc2l6ZV90IHo7Ci0gICAgICBzaXplX3QgYXJnYWxpZ24gPSAoKnBfYXJnKS0+YWxpZ25tZW50OwotCi0jaWZkZWYgX1dJTjMyX1dDRQotICAgICAgaWYgKGFyZ2FsaWduID4gNCkKLSAgICAgICAgYXJnYWxpZ24gPSA0OwotI2VuZGlmCi0gICAgICAvKiBBbGlnbiBpZiBuZWNlc3NhcnkgKi8KLSAgICAgIGlmICgoYXJnYWxpZ24gLSAxKSAmICh1bnNpZ25lZCkgYXJncCkgewotCWFyZ3AgPSAoY2hhciAqKSBBTElHTihhcmdwLCBhcmdhbGlnbik7Ci0gICAgICB9Ci0KLQkgIHogPSAoKnBfYXJnKS0+c2l6ZTsKLQkgIGlmICh6IDwgc2l6ZW9mKGludCkpCi0JICAgIHsKLQkgICAgICB6ID0gc2l6ZW9mKGludCk7Ci0JICAgICAgc3dpdGNoICgoKnBfYXJnKS0+dHlwZSkKLQkJewotCQljYXNlIEZGSV9UWVBFX1NJTlQ4OgotCQkgICooc2lnbmVkIGludCAqKSBhcmdwID0gKHNpZ25lZCBpbnQpKihTSU5UOCAqKSgqIHBfYXJndik7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgRkZJX1RZUEVfVUlOVDg6Ci0JCSAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UOCAqKSgqIHBfYXJndik7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgRkZJX1RZUEVfU0lOVDE2OgotCQkgICooc2lnbmVkIGludCAqKSBhcmdwID0gKHNpZ25lZCBpbnQpKihTSU5UMTYgKikoKiBwX2FyZ3YpOwotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlIEZGSV9UWVBFX1VJTlQxNjoKLQkJICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQxNiAqKSgqIHBfYXJndik7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgRkZJX1RZUEVfU1RSVUNUOgotICAgICAgICAgICAgICAgICAgLyogKnBfYXJndiBtYXkgbm90IGJlIGFsaWduZWQgZm9yIGEgVUlOVDMyICovCi0gICAgICAgICAgICAgICAgICBtZW1jcHkoYXJncCwgKnBfYXJndiwgeik7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBGRklfQVNTRVJUKDApOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHogPT0gc2l6ZW9mKGludCkpCi0JICAgIHsKLQkgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQzMiAqKSgqIHBfYXJndik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1lbWNweShhcmdwLCAqcF9hcmd2LCB6KTsKLQkgICAgfQotCSAgcF9hcmd2Kys7Ci0JICBhcmdwICs9IHo7Ci0gICAgfQotICAKLSAgcmV0dXJuOwotfQotCi0vKiBQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nICovCi1mZmlfc3RhdHVzIGZmaV9wcmVwX2NpZl9tYWNoZGVwKGZmaV9jaWYgKmNpZikKLXsKLSAgLyogU2V0IHRoZSByZXR1cm4gdHlwZSBmbGFnICovCi0gIHN3aXRjaCAoY2lmLT5ydHlwZS0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBGRklfVFlQRV9WT0lEOgotICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgotICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6Ci0gICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6Ci0gICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6Ci0gICAgICBjaWYtPmZsYWdzID0gKHVuc2lnbmVkKSBjaWYtPnJ0eXBlLT50eXBlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZGSV9UWVBFX1VJTlQ2NDoKLSAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9TSU5UNjQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfSU5UOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBGRklfT0s7Ci19Ci0KLS8qQC1kZWNsdW5kZWZAKi8KLS8qQC1leHBvcnRoZWFkZXJAKi8KLWV4dGVybiB2b2lkIGZmaV9jYWxsX1NZU1Yodm9pZCAoKikoY2hhciAqLCBleHRlbmRlZF9jaWYgKiksIAotCQkJICAvKkBvdXRAKi8gZXh0ZW5kZWRfY2lmICosIAotCQkJICB1bnNpZ25lZCwgdW5zaWduZWQsIAotCQkJICAvKkBvdXRAKi8gdW5zaWduZWQgKiwgCi0JCQkgIHZvaWQgKCpmbikoKSk7Ci0vKkA9ZGVjbHVuZGVmQCovCi0vKkA9ZXhwb3J0aGVhZGVyQCovCi0KLS8qIFJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSB2b2lkIGZvciBjdHlwZXMgKi8KLWludCBmZmlfY2FsbCgvKkBkZXBlbmRlbnRAKi8gZmZpX2NpZiAqY2lmLCAKLQkgICAgICB2b2lkICgqZm4pKCksIAotCSAgICAgIC8qQG91dEAqLyB2b2lkICpydmFsdWUsIAotCSAgICAgIC8qQGRlcGVuZGVudEAqLyB2b2lkICoqYXZhbHVlKQotewotICBleHRlbmRlZF9jaWYgZWNpZjsKLQotICBlY2lmLmNpZiA9IGNpZjsKLSAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7Ci0gIAotICAvKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RydWN0IGFuZCB3ZSBkb24ndCBoYXZlIGEgcmV0dXJuCSovCi0gIC8qIHZhbHVlIGFkZHJlc3MgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugb25lCQkgICAgICAgICovCi0KLSAgaWYgKChydmFsdWUgPT0gTlVMTCkgJiYgCi0gICAgICAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpKQotICAgIHsKLSAgICAgIC8qQC1zeXN1bnJlY29nQCovCi0gICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYShjaWYtPnJ0eXBlLT5zaXplKTsKLSAgICAgIC8qQD1zeXN1bnJlY29nQCovCi0gICAgfQotICBlbHNlCi0gICAgZWNpZi5ydmFsdWUgPSBydmFsdWU7Ci0gICAgCi0gIAotICBzd2l0Y2ggKGNpZi0+YWJpKSAKLSAgICB7Ci0gICAgY2FzZSBGRklfU1lTVjoKLSAgICAgIC8qQC11c2VkZWZAKi8KLSAgICAgIGZmaV9jYWxsX1NZU1YoZmZpX3ByZXBfYXJncywgJmVjaWYsIGNpZi0+Ynl0ZXMsIAotCQkgICAgY2lmLT5mbGFncywgZWNpZi5ydmFsdWUsIGZuKTsKLSAgICAgIC8qQD11c2VkZWZAKi8KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBGRklfQVNTRVJUKDApOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAvKiBJIHRoaW5rIGNhbGN1bGF0aW5nIHRoZSByZWFsIHN0YWNrIHBvaW50ZXIgZGVsdGEgaXMgbm90IHVzZWZ1bAotICAgICBiZWNhdXNlIHN0ZGNhbGwgaXMgbm90IHN1cHBvcnRlZCAqLwotICByZXR1cm4gMDsKLX0KLQotLyoqIHByaXZhdGUgbWVtYmVycyAqKi8KLQotc3RhdGljIHZvaWQgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWIChjaGFyICpzdGFjaywgdm9pZCAqKnJldCwKLQkJCQkJIHZvaWQqKiBhcmdzLCBmZmlfY2lmKiBjaWYpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBmZmlfY2xvc3VyZV9TWVNWIGluIHN5c3YuYXNtICovCi0KLXVuc2lnbmVkIGludAotZmZpX2Nsb3N1cmVfU1lTVl9pbm5lciAoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsIGNoYXIgKmluX2FyZ3MsIHZvaWQgKnJ2YWx1ZSkKLXsKLSAgZmZpX2NpZiAqY2lmID0gY2xvc3VyZS0+Y2lmOwotICB2b2lkICoqb3V0X2FyZ3M7Ci0KLSAgb3V0X2FyZ3MgPSAodm9pZCAqKikgYWxsb2NhKGNpZi0+bmFyZ3MgKiBzaXplb2YgKHZvaWQgKikpOyAgCi0KLSAgLyogdGhpcyBjYWxsIHdpbGwgaW5pdGlhbGl6ZSBvdXRfYXJncywgc3VjaCB0aGF0IGVhY2gKLSAgICogZWxlbWVudCBpbiB0aGF0IGFycmF5IHBvaW50cyB0byB0aGUgY29ycmVzcG9uZGluZyAKLSAgICogdmFsdWUgb24gdGhlIHN0YWNrOyBhbmQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKLSAgICogYSBzdHJ1Y3R1cmUsIGl0IHdpbGwgcmUtc2V0IHJ2YWx1ZSB0byBwb2ludCB0byB0aGUKLSAgICogc3RydWN0dXJlIHJldHVybiBhZGRyZXNzLiAgKi8KLQotICBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoaW5fYXJncywgJnJ2YWx1ZSwgb3V0X2FyZ3MsIGNpZik7Ci0gIAotICAoY2xvc3VyZS0+ZnVuKShjaWYsIHJ2YWx1ZSwgb3V0X2FyZ3MsIGNsb3N1cmUtPnVzZXJfZGF0YSk7Ci0KLSAgLyogVGVsbCBmZmlfY2xvc3VyZV9TWVNWIHdoYXQgdGhlIHJldHVybnR5cGUgaXMgKi8KLSAgcmV0dXJuIGNpZi0+ZmxhZ3M7Ci19Ci0KLS8qQC1leHBvcnRoZWFkZXJAKi8KLXN0YXRpYyB2b2lkIAotZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKGNoYXIgKnN0YWNrLCB2b2lkICoqcnZhbHVlLAotCQkJICAgIHZvaWQgKiphdmFsdWUsIGZmaV9jaWYgKmNpZikKLS8qQD1leHBvcnRoZWFkZXJAKi8KLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHZvaWQgKipwX2FyZ3Y7Ci0gIGNoYXIgKmFyZ3A7Ci0gIGZmaV90eXBlICoqcF9hcmc7Ci0KLSAgYXJncCA9IHN0YWNrOwotCi0gIGlmICggY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QgKSB7Ci0gICAgKnJ2YWx1ZSA9ICoodm9pZCAqKikgYXJncDsKLSAgICBhcmdwICs9IDQ7Ci0gIH0KLQotICBwX2FyZ3YgPSBhdmFsdWU7Ci0KLSAgZm9yIChpID0gY2lmLT5uYXJncywgcF9hcmcgPSBjaWYtPmFyZ190eXBlczsgKGkgIT0gMCk7IGktLSwgcF9hcmcrKykKLSAgICB7Ci0gICAgICBzaXplX3QgejsKLSAgICAgIHNpemVfdCBhcmdhbGlnbiA9ICgqcF9hcmcpLT5hbGlnbm1lbnQ7Ci0KLSNpZmRlZiBfV0lOMzJfV0NFCi0gICAgICBpZiAoYXJnYWxpZ24gPiA0KQotICAgICAgICBhcmdhbGlnbiA9IDQ7Ci0jZW5kaWYKLSAgICAgIC8qIEFsaWduIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgaWYgKChhcmdhbGlnbiAtIDEpICYgKHVuc2lnbmVkKSBhcmdwKSB7Ci0JYXJncCA9IChjaGFyICopIEFMSUdOKGFyZ3AsIGFyZ2FsaWduKTsKLSAgICAgIH0KLQotICAgICAgeiA9ICgqcF9hcmcpLT5zaXplOwotICAgICAgaWYgKHogPCBzaXplb2YoaW50KSkKLSAgICAgICAgeiA9IHNpemVvZihpbnQpOwotCi0gICAgICAqcF9hcmd2ID0gKHZvaWQqKSBhcmdwOwotCi0gICAgICBwX2FyZ3YrKzsKLSAgICAgIGFyZ3AgKz0gejsKLSAgICB9Ci19Ci0KLS8qCi0gICAgYWRkICAgaXAsIHBjLCAjLTggICAgIDsgaXAgPSBhZGRyZXNzIG9mIHRoaXMgdHJhbXBvbGluZSA9PSBhZGRyZXNzIG9mIGZmaV9jbG9zdXJlCi0gICAgbGRyICAgcGMsIFtwYywgIy00XSAgIDsganVtcCB0byBfX2Z1bgotICAgIERDRCBfX2Z1bgotKi8KLSNkZWZpbmUgRkZJX0lOSVRfVFJBTVBPTElORShUUkFNUCxGVU4pIFwKLXsgXAotICAgIHVuc2lnbmVkIGludCAqX190cmFtcCA9ICh1bnNpZ25lZCBpbnQgKikoVFJBTVApOyBcCi0gICAgX190cmFtcFswXSA9IDB4ZTI0ZmMwMDg7ICAgICAgICAgICAgLyogYWRkICAgaXAsIHBjLCAjLTggICAgKi8gXAotICAgIF9fdHJhbXBbMV0gPSAweGU1MWZmMDA0OyAgICAgICAgICAgIC8qIGxkciAgIHBjLCBbcGMsICMtNF0gICovIFwKLSAgICBfX3RyYW1wWzJdID0gKHVuc2lnbmVkIGludCkoRlVOKTsgXAotICB9Ci0KLS8qIHRoZSBjaWYgbXVzdCBhbHJlYWR5IGJlIHByZXAnZWQgKi8KLQotLyogZGVmaW5lZCBpbiBzeXN2LmFzbSAqLwotdm9pZCBmZmlfY2xvc3VyZV9TWVNWKHZvaWQpOwotCi1mZmlfc3RhdHVzCi1mZmlfcHJlcF9jbG9zdXJlIChmZmlfY2xvc3VyZSogY2xvc3VyZSwKLQkJICBmZmlfY2lmKiBjaWYsCi0JCSAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKSwKLQkJICB2b2lkICp1c2VyX2RhdGEpCi17Ci0gIEZGSV9BU1NFUlQgKGNpZi0+YWJpID09IEZGSV9TWVNWKTsKLSAgCi0gIEZGSV9JTklUX1RSQU1QT0xJTkUgKCZjbG9zdXJlLT50cmFtcFswXSwgJmZmaV9jbG9zdXJlX1NZU1YpOwotCi0gIGNsb3N1cmUtPmNpZiAgPSBjaWY7Ci0gIGNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKLSAgY2xvc3VyZS0+ZnVuICA9IGZ1bjsKLQotI2lmZGVmIF9XSU4zMl9XQ0UKLSAgLyogVGhpcyBpcyBpbXBvcnRhbnQgdG8gYWxsb3cgY2FsbGluZyB0aGUgdHJhbXBvbGluZSBzYWZlbHkgKi8KLSAgRmx1c2hJbnN0cnVjdGlvbkNhY2hlKEdldEN1cnJlbnRQcm9jZXNzKCksIDAsIDApOwotI2VuZGlmCi0KLSAgcmV0dXJuIEZGSV9PSzsKLX0KLQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpLmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9mZmkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5NzViNi4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9mZmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQotICAgbGliZmZpIDIuMDAtYmV0YS13aW5jZSAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCi0KLSAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICAgSU4gTk8gRVZFTlQgU0hBTEwgQ1lHTlVTIFNPTFVUSU9OUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotICAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKLSAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgVGhlIGJhc2ljIEFQSSBpcyBkZXNjcmliZWQgaW4gdGhlIFJFQURNRSBmaWxlLgotCi0gICBUaGUgcmF3IEFQSSBpcyBkZXNpZ25lZCB0byBieXBhc3Mgc29tZSBvZiB0aGUgYXJndW1lbnQgcGFja2luZwotICAgYW5kIHVucGFja2luZyBvbiBhcmNoaXRlY3R1cmVzIGZvciB3aGljaCBpdCBjYW4gYmUgYXZvaWRlZC4KLQotICAgVGhlIGNsb3N1cmUgQVBJIGFsbG93cyBpbnRlcnByZXRlZCBmdW5jdGlvbnMgdG8gYmUgcGFja2FnZWQgdXAKLSAgIGluc2lkZSBhIEMgZnVuY3Rpb24gcG9pbnRlciwgc28gdGhhdCB0aGV5IGNhbiBiZSBjYWxsZWQgYXMgQyBmdW5jdGlvbnMsCi0gICB3aXRoIG5vIHVuZGVyc3RhbmRpbmcgb24gdGhlIGNsaWVudCBzaWRlIHRoYXQgdGhleSBhcmUgaW50ZXJwcmV0ZWQuCi0gICBJdCBjYW4gYWxzbyBiZSB1c2VkIGluIG90aGVyIGNhc2VzIGluIHdoaWNoIGl0IGlzIG5lY2Vzc2FyeSB0byBwYWNrYWdlCi0gICB1cCBhIHVzZXIgc3BlY2lmaWVkIHBhcmFtZXRlciBhbmQgYSBmdW5jdGlvbiBwb2ludGVyIGFzIGEgc2luZ2xlCi0gICBmdW5jdGlvbiBwb2ludGVyLgotCi0gICBUaGUgY2xvc3VyZSBBUEkgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBvcmRlciB0byBnZXQgaXRzIGZ1bmN0aW9uYWxpdHksCi0gICBlLmcuIGZvciB1c2UgYnkgZ2lqLiAgUm91dGluZXMgYXJlIHByb3ZpZGVkIHRvIGVtdWxhdGUgdGhlIHJhdyBBUEkKLSAgIGlmIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtIGRvZXNuJ3QgYWxsb3cgZmFzdGVyIGltcGxlbWVudGF0aW9uLgotCi0gICBNb3JlIGRldGFpbHMgb24gdGhlIHJhdyBhbmQgY2xvdXJlIEFQSSBjYW4gYmUgZm91bmQgaW46Ci0KLSAgIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9qYXZhLzE5OTktcTMvbXNnMDAxMzguaHRtbAotCi0gICBhbmQKLQotICAgaHR0cDovL2djYy5nbnUub3JnL21sL2phdmEvMTk5OS1xMy9tc2cwMDE3NC5odG1sCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWZuZGVmIExJQkZGSV9ICi0jZGVmaW5lIExJQkZGSV9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogU3BlY2lmeSB3aGljaCBhcmNoaXRlY3R1cmUgbGliZmZpIGlzIGNvbmZpZ3VyZWQgZm9yLiAqLwotLyojZGVmaW5lIEBUQVJHRVRAKi8KLQotLyogLS0tLSBTeXN0ZW0gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2luY2x1ZGUgPGZmaXRhcmdldC5oPgotCi0jaWZuZGVmIExJQkZGSV9BU00KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0vKiBMT05HX0xPTkdfTUFYIGlzIG5vdCBhbHdheXMgZGVmaW5lZCAobm90IGlmIFNUUklDVF9BTlNJLCBmb3IgZXhhbXBsZSkuCi0gICBCdXQgd2UgY2FuIGZpbmQgaXQgZWl0aGVyIHVuZGVyIHRoZSBjb3JyZWN0IEFOU0kgbmFtZSwgb3IgdW5kZXIgR05VCi0gICBDJ3MgaW50ZXJuYWwgbmFtZS4gICovCi0jaWZkZWYgTE9OR19MT05HX01BWAotIyBkZWZpbmUgRkZJX0xPTkdfTE9OR19NQVggTE9OR19MT05HX01BWAotI2Vsc2UKLSMgaWZkZWYgTExPTkdfTUFYCi0jICBkZWZpbmUgRkZJX0xPTkdfTE9OR19NQVggTExPTkdfTUFYCi0jIGVsc2UKLSMgIGlmZGVmIF9fR05VQ19fCi0jICAgZGVmaW5lIEZGSV9MT05HX0xPTkdfTUFYIF9fTE9OR19MT05HX01BWF9fCi0jICBlbmRpZgotIyAgaWZkZWYgX01TQ19WRVIKLSMgICBkZWZpbmUgRkZJX0xPTkdfTE9OR19NQVggX0k2NF9NQVgKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIFNDSEFSX01BWCA9PSAxMjcKLSMgZGVmaW5lIGZmaV90eXBlX3VjaGFyICAgICAgICAgICAgICAgIGZmaV90eXBlX3VpbnQ4Ci0jIGRlZmluZSBmZmlfdHlwZV9zY2hhciAgICAgICAgICAgICAgICBmZmlfdHlwZV9zaW50OAotI2Vsc2UKLSAjZXJyb3IgImNoYXIgc2l6ZSBub3Qgc3VwcG9ydGVkIgotI2VuZGlmCi0KLSNpZiBTSFJUX01BWCA9PSAzMjc2NwotIyBkZWZpbmUgZmZpX3R5cGVfdXNob3J0ICAgICAgIGZmaV90eXBlX3VpbnQxNgotIyBkZWZpbmUgZmZpX3R5cGVfc3Nob3J0ICAgICAgIGZmaV90eXBlX3NpbnQxNgotI2VsaWYgU0hSVF9NQVggPT0gMjE0NzQ4MzY0NwotIyBkZWZpbmUgZmZpX3R5cGVfdXNob3J0ICAgICAgIGZmaV90eXBlX3VpbnQzMgotIyBkZWZpbmUgZmZpX3R5cGVfc3Nob3J0ICAgICAgIGZmaV90eXBlX3NpbnQzMgotI2Vsc2UKLSAjZXJyb3IgInNob3J0IHNpemUgbm90IHN1cHBvcnRlZCIKLSNlbmRpZgotCi0jaWYgSU5UX01BWCA9PSAzMjc2NwotIyBkZWZpbmUgZmZpX3R5cGVfdWludCAgICAgICAgIGZmaV90eXBlX3VpbnQxNgotIyBkZWZpbmUgZmZpX3R5cGVfc2ludCAgICAgICAgIGZmaV90eXBlX3NpbnQxNgotI2VsaWYgSU5UX01BWCA9PSAyMTQ3NDgzNjQ3Ci0jIGRlZmluZSBmZmlfdHlwZV91aW50ICAgICAgICAgZmZpX3R5cGVfdWludDMyCi0jIGRlZmluZSBmZmlfdHlwZV9zaW50ICAgICAgICAgZmZpX3R5cGVfc2ludDMyCi0jZWxpZiBJTlRfTUFYID09IDkyMjMzNzIwMzY4NTQ3NzU4MDcKLSMgZGVmaW5lIGZmaV90eXBlX3VpbnQgICAgICAgICBmZmlfdHlwZV91aW50NjQKLSMgZGVmaW5lIGZmaV90eXBlX3NpbnQgICAgICAgICBmZmlfdHlwZV9zaW50NjQKLSNlbHNlCi0gI2Vycm9yICJpbnQgc2l6ZSBub3Qgc3VwcG9ydGVkIgotI2VuZGlmCi0KLSNkZWZpbmUgZmZpX3R5cGVfdWxvbmcgICAgICAgICBmZmlfdHlwZV91aW50NjQKLSNkZWZpbmUgZmZpX3R5cGVfc2xvbmcgICAgICAgICBmZmlfdHlwZV9zaW50NjQKLSNpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3Ci0jIGlmIEZGSV9MT05HX0xPTkdfTUFYICE9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKLSAgI2Vycm9yICJubyA2NC1iaXQgZGF0YSB0eXBlIHN1cHBvcnRlZCIKLSMgZW5kaWYKLSNlbGlmIExPTkdfTUFYICE9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKLSAjZXJyb3IgImxvbmcgc2l6ZSBub3Qgc3VwcG9ydGVkIgotI2VuZGlmCi0KLS8qIFRoZSBjbG9zdXJlIGNvZGUgYXNzdW1lcyB0aGF0IHRoaXMgd29ya3Mgb24gcG9pbnRlcnMsIGkuZS4gYSBzaXplX3QJKi8KLS8qIGNhbiBob2xkIGEgcG9pbnRlci4JCQkJCQkJKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX2ZmaV90eXBlCi17Ci0gIHNpemVfdCBzaXplOwotICB1bnNpZ25lZCBzaG9ydCBhbGlnbm1lbnQ7Ci0gIHVuc2lnbmVkIHNob3J0IHR5cGU7Ci0gIC8qQG51bGxAKi8gc3RydWN0IF9mZmlfdHlwZSAqKmVsZW1lbnRzOwotfSBmZmlfdHlwZTsKLQotLyogVGhlc2UgYXJlIGRlZmluZWQgaW4gdHlwZXMuYyAqLwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3ZvaWQ7Ci1leHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfdWludDg7Ci1leHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfc2ludDg7Ci1leHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfdWludDE2OwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3NpbnQxNjsKLWV4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV91aW50MzI7Ci1leHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfc2ludDMyOwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3VpbnQ2NDsKLWV4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9zaW50NjQ7Ci1leHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfZmxvYXQ7Ci1leHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfZG91YmxlOwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX2xvbmdkb3VibGU7Ci1leHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfcG9pbnRlcjsKLQotCi10eXBlZGVmIGVudW0gewotICBGRklfT0sgPSAwLAotICBGRklfQkFEX1RZUEVERUYsCi0gIEZGSV9CQURfQUJJIAotfSBmZmlfc3RhdHVzOwotCi10eXBlZGVmIHVuc2lnbmVkIEZGSV9UWVBFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGZmaV9hYmkgYWJpOwotICB1bnNpZ25lZCBuYXJnczsKLSAgLypAZGVwZW5kZW50QCovIGZmaV90eXBlICoqYXJnX3R5cGVzOwotICAvKkBkZXBlbmRlbnRAKi8gZmZpX3R5cGUgKnJ0eXBlOwotICB1bnNpZ25lZCBieXRlczsKLSAgdW5zaWduZWQgZmxhZ3M7Ci0jaWZkZWYgRkZJX0VYVFJBX0NJRl9GSUVMRFMKLSAgRkZJX0VYVFJBX0NJRl9GSUVMRFM7Ci0jZW5kaWYKLX0gZmZpX2NpZjsKLQotLyogLS0tLSBEZWZpbml0aW9ucyBmb3IgdGhlIHJhdyBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmbmRlZiBGRklfU0laRU9GX0FSRwotIyBpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3Ci0jICBkZWZpbmUgRkZJX1NJWkVPRl9BUkcgICAgICAgIDQKLSMgZWxpZiBMT05HX01BWCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3Ci0jICBkZWZpbmUgRkZJX1NJWkVPRl9BUkcgICAgICAgIDgKLSMgZW5kaWYKLSNlbmRpZgotCi10eXBlZGVmIHVuaW9uIHsKLSAgZmZpX3NhcmcgIHNpbnQ7Ci0gIGZmaV9hcmcgICB1aW50OwotICBmbG9hdAkgICAgZmx0OwotICBjaGFyICAgICAgZGF0YVtGRklfU0laRU9GX0FSR107Ci0gIHZvaWQqICAgICBwdHI7Ci19IGZmaV9yYXc7Ci0KLXZvaWQgZmZpX3Jhd19jYWxsICgvKkBkZXBlbmRlbnRAKi8gZmZpX2NpZiAqY2lmLCAKLQkJICAgdm9pZCAoKmZuKSgpLCAKLQkJICAgLypAb3V0QCovIHZvaWQgKnJ2YWx1ZSwgCi0JCSAgIC8qQGRlcGVuZGVudEAqLyBmZmlfcmF3ICphdmFsdWUpOwotCi12b2lkIGZmaV9wdHJhcnJheV90b19yYXcgKGZmaV9jaWYgKmNpZiwgdm9pZCAqKmFyZ3MsIGZmaV9yYXcgKnJhdyk7Ci12b2lkIGZmaV9yYXdfdG9fcHRyYXJyYXkgKGZmaV9jaWYgKmNpZiwgZmZpX3JhdyAqcmF3LCB2b2lkICoqYXJncyk7Ci1zaXplX3QgZmZpX3Jhd19zaXplIChmZmlfY2lmICpjaWYpOwotCi0vKiBUaGlzIGlzIGFuYWxvZ291cyB0byB0aGUgcmF3IEFQSSwgZXhjZXB0IGl0IHVzZXMgSmF2YSBwYXJhbWV0ZXIJKi8KLS8qIHBhY2tpbmcsIGV2ZW4gb24gNjQtYml0IG1hY2hpbmVzLiAgSS5lLiBvbiA2NC1iaXQgbWFjaGluZXMJCSovCi0vKiBsb25ncyBhbmQgZG91YmxlcyBhcmUgZm9sbG93ZWQgYnkgYW4gZW1wdHkgNjQtYml0IHdvcmQuCQkqLwotCi12b2lkIGZmaV9qYXZhX3Jhd19jYWxsICgvKkBkZXBlbmRlbnRAKi8gZmZpX2NpZiAqY2lmLCAKLQkJICAgICAgICB2b2lkICgqZm4pKCksIAotCQkgICAgICAgIC8qQG91dEAqLyB2b2lkICpydmFsdWUsIAotCQkgICAgICAgIC8qQGRlcGVuZGVudEAqLyBmZmlfcmF3ICphdmFsdWUpOwotCi12b2lkIGZmaV9qYXZhX3B0cmFycmF5X3RvX3JhdyAoZmZpX2NpZiAqY2lmLCB2b2lkICoqYXJncywgZmZpX3JhdyAqcmF3KTsKLXZvaWQgZmZpX2phdmFfcmF3X3RvX3B0cmFycmF5IChmZmlfY2lmICpjaWYsIGZmaV9yYXcgKnJhdywgdm9pZCAqKmFyZ3MpOwotc2l6ZV90IGZmaV9qYXZhX3Jhd19zaXplIChmZmlfY2lmICpjaWYpOwotCi0vKiAtLS0tIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWYgRkZJX0NMT1NVUkVTCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciB0cmFtcFtGRklfVFJBTVBPTElORV9TSVpFXTsKLSAgZmZpX2NpZiAgICpjaWY7Ci0gIHZvaWQgICAgICgqZnVuKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopOwotICB2b2lkICAgICAgKnVzZXJfZGF0YTsKLX0gZmZpX2Nsb3N1cmU7Ci0KLWZmaV9zdGF0dXMKLWZmaV9wcmVwX2Nsb3N1cmUgKGZmaV9jbG9zdXJlKiwKLQkJICBmZmlfY2lmICosCi0JCSAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKSwKLQkJICB2b2lkICp1c2VyX2RhdGEpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgdHJhbXBbRkZJX1RSQU1QT0xJTkVfU0laRV07Ci0KLSAgZmZpX2NpZiAgICpjaWY7Ci0KLSNpZiAhRkZJX05BVElWRV9SQVdfQVBJCi0KLSAgLyogaWYgdGhpcyBpcyBlbmFibGVkLCB0aGVuIGEgcmF3IGNsb3N1cmUgaGFzIHRoZSBzYW1lIGxheW91dCAKLSAgICAgYXMgYSByZWd1bGFyIGNsb3N1cmUuICBXZSB1c2UgdGhpcyB0byBpbnN0YWxsIGFuIGludGVybWVkaWF0ZSAKLSAgICAgaGFuZGxlciB0byBkbyB0aGUgdHJhbnNhbHRpb24sIHZvaWQqKiAtPiBmZmlfcmF3Ki4gKi8KLQotICB2b2lkICAgICAoKnRyYW5zbGF0ZV9hcmdzKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopOwotICB2b2lkICAgICAgKnRoaXNfY2xvc3VyZTsKLQotI2VuZGlmCi0KLSAgdm9pZCAgICAgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLGZmaV9yYXcqLHZvaWQqKTsKLSAgdm9pZCAgICAgICp1c2VyX2RhdGE7Ci0KLX0gZmZpX3Jhd19jbG9zdXJlOwotCi1mZmlfc3RhdHVzCi1mZmlfcHJlcF9yYXdfY2xvc3VyZSAoZmZpX3Jhd19jbG9zdXJlKiwKLQkJICAgICAgZmZpX2NpZiAqY2lmLAotCQkgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfcmF3Kix2b2lkKiksCi0JCSAgICAgIHZvaWQgKnVzZXJfZGF0YSk7Ci0KLWZmaV9zdGF0dXMKLWZmaV9wcmVwX2phdmFfcmF3X2Nsb3N1cmUgKGZmaV9yYXdfY2xvc3VyZSosCi0JCSAgICAgICAgICAgZmZpX2NpZiAqY2lmLAotCQkgICAgICAgICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLGZmaV9yYXcqLHZvaWQqKSwKLQkJICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOwotCi0jZW5kaWYgLyogRkZJX0NMT1NVUkVTICovCi0KLS8qIC0tLS0gUHVibGljIGludGVyZmFjZSBkZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLWZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmKC8qQG91dEAqLyAvKkBwYXJ0aWFsQCovIGZmaV9jaWYgKmNpZiwgCi0JCQlmZmlfYWJpIGFiaSwKLQkJCXVuc2lnbmVkIGludCBuYXJncywgCi0JCQkvKkBkZXBlbmRlbnRAKi8gLypAb3V0QCovIC8qQHBhcnRpYWxAKi8gZmZpX3R5cGUgKnJ0eXBlLCAKLQkJCS8qQGRlcGVuZGVudEAqLyBmZmlfdHlwZSAqKmF0eXBlcyk7Ci0KLS8qIFJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSB2b2lkIGZvciBjdHlwZXMgKi8KLWludCBmZmlfY2FsbCgvKkBkZXBlbmRlbnRAKi8gZmZpX2NpZiAqY2lmLCAKLQkgICAgICB2b2lkICgqZm4pKCksIAotCSAgICAgIC8qQG91dEAqLyB2b2lkICpydmFsdWUsIAotCSAgICAgIC8qQGRlcGVuZGVudEAqLyB2b2lkICoqYXZhbHVlKTsKLQotLyogVXNlZnVsIGZvciBlbGltaW5hdGluZyBjb21waWxlciB3YXJuaW5ncyAqLwotI2RlZmluZSBGRklfRk4oZikgKCh2b2lkICgqKSgpKWYpCi0KLS8qIC0tLS0gRGVmaW5pdGlvbnMgc2hhcmVkIHdpdGggYXNzZW1ibHkgY29kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNlbmRpZgotCi0vKiBJZiB0aGVzZSBjaGFuZ2UsIHVwZGF0ZSBzcmMvbWlwcy9mZml0YXJnZXQuaC4gKi8KLSNkZWZpbmUgRkZJX1RZUEVfVk9JRCAgICAgICAwICAgIAotI2RlZmluZSBGRklfVFlQRV9JTlQgICAgICAgIDEKLSNkZWZpbmUgRkZJX1RZUEVfRkxPQVQgICAgICAyICAgIAotI2RlZmluZSBGRklfVFlQRV9ET1VCTEUgICAgIDMKLSNpZiAwIC8qQEhBVkVfTE9OR19ET1VCTEVAKi8KLSNkZWZpbmUgRkZJX1RZUEVfTE9OR0RPVUJMRSA0Ci0jZWxzZQotI2RlZmluZSBGRklfVFlQRV9MT05HRE9VQkxFIEZGSV9UWVBFX0RPVUJMRQotI2VuZGlmCi0jZGVmaW5lIEZGSV9UWVBFX1VJTlQ4ICAgICAgNSAgIAotI2RlZmluZSBGRklfVFlQRV9TSU5UOCAgICAgIDYKLSNkZWZpbmUgRkZJX1RZUEVfVUlOVDE2ICAgICA3IAotI2RlZmluZSBGRklfVFlQRV9TSU5UMTYgICAgIDgKLSNkZWZpbmUgRkZJX1RZUEVfVUlOVDMyICAgICA5Ci0jZGVmaW5lIEZGSV9UWVBFX1NJTlQzMiAgICAgMTAKLSNkZWZpbmUgRkZJX1RZUEVfVUlOVDY0ICAgICAxMQotI2RlZmluZSBGRklfVFlQRV9TSU5UNjQgICAgIDEyCi0jZGVmaW5lIEZGSV9UWVBFX1NUUlVDVCAgICAgMTMKLSNkZWZpbmUgRkZJX1RZUEVfUE9JTlRFUiAgICAxNAotCi0vKiBUaGlzIHNob3VsZCBhbHdheXMgcmVmZXIgdG8gdGhlIGxhc3QgdHlwZSBjb2RlIChmb3Igc2FuaXR5IGNoZWNrcykgKi8KLSNkZWZpbmUgRkZJX1RZUEVfTEFTVCAgICAgICBGRklfVFlQRV9QT0lOVEVSCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9mZmlfY29tbW9uLmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9mZmlfY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODc5ZDEuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpX2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBmZmlfY29tbW9uLmggLSBDb3B5cmlnaHQgKGMpIDE5OTYgIFJlZCBIYXQsIEluYy4KLQotICAgQ29tbW9uIGludGVybmFsIGRlZmluaXRpb25zIGFuZCBtYWNyb3MuIE9ubHkgbmVjZXNzYXJ5IGZvciBidWlsZGluZwotICAgbGliZmZpLgotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmbmRlZiBGRklfQ09NTU9OX0gKLSNkZWZpbmUgRkZJX0NPTU1PTl9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgotCi0vKiBEbyBub3QgbW92ZSB0aGlzLiBTb21lIHZlcnNpb25zIG9mIEFJWCBhcmUgdmVyeSBwaWNreSBhYm91dCB3aGVyZQotICAgdGhpcyBpcyBwb3NpdGlvbmVkLiAqLwotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWYgSEFWRV9BTExPQ0FfSAotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgbWVtY3B5LiAqLwotI2lmIFNURENfSEVBREVSUwotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGlmbmRlZiBIQVZFX01FTUNQWQotIyAgZGVmaW5lIG1lbWNweShkLCBzLCBuKSBiY29weSAoKHMpLCAoZCksIChuKSkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChGRklfREVCVUcpIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEZGSV9ERUJVRwotLypAZXhpdHNAKi8gdm9pZCBmZmlfYXNzZXJ0KC8qQHRlbXBAKi8gY2hhciAqZXhwciwgLypAdGVtcEAqLyBjaGFyICpmaWxlLCBpbnQgbGluZSk7Ci12b2lkIGZmaV9zdG9wX2hlcmUodm9pZCk7Ci12b2lkIGZmaV90eXBlX3Rlc3QoLypAdGVtcEAqLyAvKkBvdXRAKi8gZmZpX3R5cGUgKmEsIC8qQHRlbXBAKi8gY2hhciAqZmlsZSwgaW50IGxpbmUpOwotCi0jZGVmaW5lIEZGSV9BU1NFUlQoeCkgKCh4KSA/ICh2b2lkKTAgOiBmZmlfYXNzZXJ0KCN4LCBfX0ZJTEVfXyxfX0xJTkVfXykpCi0jZGVmaW5lIEZGSV9BU1NFUlRfQVQoeCwgZiwgbCkgKCh4KSA/IDAgOiBmZmlfYXNzZXJ0KCN4LCAoZiksIChsKSkpCi0jZGVmaW5lIEZGSV9BU1NFUlRfVkFMSURfVFlQRSh4KSBmZmlfdHlwZV90ZXN0ICh4LCBfX0ZJTEVfXywgX19MSU5FX18pCi0jZWxzZQotI2RlZmluZSBGRklfQVNTRVJUKHgpIAotI2RlZmluZSBGRklfQVNTRVJUX0FUKHgsIGYsIGwpCi0jZGVmaW5lIEZGSV9BU1NFUlRfVkFMSURfVFlQRSh4KQotI2VuZGlmCi0KLSNkZWZpbmUgQUxJR04odiwgYSkgICgoKCgoc2l6ZV90KSAodikpLTEpIHwgKChhKS0xKSkrMSkKLQotLyogUGVyZm9ybSBtYWNoaW5lIGRlcGVuZGVudCBjaWYgcHJvY2Vzc2luZyAqLwotZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWZfbWFjaGRlcChmZmlfY2lmICpjaWYpOwotCi0vKiBFeHRlbmRlZCBjaWYsIHVzZWQgaW4gY2FsbGJhY2sgZnJvbSBhc3NlbWJseSByb3V0aW5lICovCi10eXBlZGVmIHN0cnVjdAotewotICAvKkBkZXBlbmRlbnRAKi8gZmZpX2NpZiAqY2lmOwotICAvKkBkZXBlbmRlbnRAKi8gdm9pZCAqcnZhbHVlOwotICAvKkBkZXBlbmRlbnRAKi8gdm9pZCAqKmF2YWx1ZTsKLX0gZXh0ZW5kZWRfY2lmOwotCi0vKiBUZXJzZSBzaXplZCB0eXBlIGRlZmluaXRpb25zLiAgKi8KLSNpZiBkZWZpbmVkKF9fR05VQ19fKQotCi10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UOCAgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19RSV9fKSkpOwotdHlwZWRlZiBzaWduZWQgaW50ICAgU0lOVDggIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fUUlfXykpKTsKLXR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQxNiBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0hJX18pKSk7Ci10eXBlZGVmIHNpZ25lZCBpbnQgICBTSU5UMTYgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ISV9fKSkpOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDMyIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKTsKLXR5cGVkZWYgc2lnbmVkIGludCAgIFNJTlQzMiBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UNjQgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ESV9fKSkpOwotdHlwZWRlZiBzaWduZWQgaW50ICAgU0lOVDY0IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fRElfXykpKTsKLQotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKLQotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDggIFVJTlQ4OwotdHlwZWRlZiBzaWduZWQgX19pbnQ4ICAgIFNJTlQ4OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDE2IFVJTlQxNjsKLXR5cGVkZWYgc2lnbmVkIF9faW50MTYgICBTSU5UMTY7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgVUlOVDMyOwotdHlwZWRlZiBzaWduZWQgX19pbnQzMiAgIFNJTlQzMjsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVSU5UNjQ7Ci10eXBlZGVmIHNpZ25lZCBfX2ludDY0ICAgU0lOVDY0OwotCi0jZWxzZQotI2Vycm9yICJOZWVkIHR5cGVkZWZzIGhlcmUiCi0jZW5kaWYKLQotdHlwZWRlZiBmbG9hdCBGTE9BVDMyOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL2ZmaWNvbmZpZy5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzk2NGMuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyogZmZpY29uZmlnLmggY3JlYXRlZCBtYW51YWxseSBmb3IgV2luZG93cyBDRSBvbiBBUk0gKi8KLS8qIGZmaWNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiAxMjM0ID0gTElMX0VORElBTiwgNDMyMSA9IEJJR0VORElBTiAqLwotI2RlZmluZSBCWVRFT1JERVIgMTIzNAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIGBfZ2V0YjY3JywgYEdFVEI2NycsIGBnZXRiNjcnIGZvciBDcmF5LTIgYW5kIENyYXktWU1QCi0gICBzeXN0ZW1zLiBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBgYWxsb2NhLmMnIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4KLSAgICovCi0vKiAjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgdXNpbmcgYGFsbG9jYS5jJy4gKi8KLS8qICN1bmRlZiBDX0FMTE9DQSAqLwotCi0vKiBEZWZpbmUgdG8gdGhlIGZsYWdzIG5lZWRlZCBmb3IgdGhlIC5zZWN0aW9uIC5laF9mcmFtZSBkaXJlY3RpdmUuICovCi0vKiAjdW5kZWYgRUhfRlJBTUVfRkxBR1MgKi8KLQotLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgZXh0cmEgZGVidWdnaW5nLiAqLwotI2lmZGVmIERFQlVHICAvKiBEZWZpbmVkIGJ5IHRoZSBwcm9qZWN0IHNldHRpbmdzIGZvciBEZWJ1ZyBidWlsZHMgKi8KLSNkZWZpbmUgRkZJX0RFQlVHCi0jZWxzZQotI3VuZGVmIEZGSV9ERUJVRwotI2VuZGlmCi0KLS8qIERlZmluZSB0aGlzIGlzIHlvdSBkbyBub3Qgd2FudCBzdXBwb3J0IGZvciB0aGUgcmF3IEFQSS4gKi8KLS8qICN1bmRlZiBGRklfTk9fUkFXX0FQSSAqLwotCi0vKiBEZWZpbmUgdGhpcyBpcyB5b3UgZG8gbm90IHdhbnQgc3VwcG9ydCBmb3IgYWdncmVnYXRlIHR5cGVzLiAqLwotLyogI3VuZGVmIEZGSV9OT19TVFJVQ1RTICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGBhbGxvY2EnLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAqLwotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4KLSAgICovCi0vKiAjdW5kZWYgSEFWRV9BTExPQ0FfSCAqLwotCi0vKiBEZWZpbmUgaWYgeW91ciBhc3NlbWJsZXIgc3VwcG9ydHMgLnJlZ2lzdGVyLiAqLwotLyogI3VuZGVmIEhBVkVfQVNfUkVHSVNURVJfUFNFVURPX09QICovCi0KLS8qIERlZmluZSBpZiB5b3VyIGFzc2VtYmxlciBhbmQgbGlua2VyIHN1cHBvcnQgdW5hbGlnbmVkIFBDIHJlbGF0aXZlIHJlbG9jcy4KLSAgICovCi0vKiAjdW5kZWYgSEFWRV9BU19TUEFSQ19VQV9QQ1JFTCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfSU5UVFlQRVNfSCAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGxvbmcgZG91YmxlIHR5cGUgYW5kIGl0IGlzIGJpZ2dlciB0aGFuIGEgZG91YmxlICovCi0vKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgTVNWQyBidWlsZCwgYnV0IGV2ZW4gdGhlcmUgaXQgc2hvdWxkIG5vdCBiZSBkZWZpbmVkICovCi0vKiAjdW5kZWYgSEFWRV9MT05HX0RPVUJMRSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbWNweScgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfTUVNQ1BZIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCi0vKiBXaW5DRSBoYXMgdGhpcyBidXQgSSBkb24ndCB0aGluayB3ZSBuZWVkIHRvIHVzZSBpdCAqLwotLyogI3VuZGVmIEhBVkVfTUVNT1JZX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtbWFwJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX01NQVAgKi8KLQotLyogRGVmaW5lIGlmIG1tYXAgd2l0aCBNQVBfQU5PTihZTU9VUykgd29ya3MuICovCi0vKiAjdW5kZWYgSEFWRV9NTUFQX0FOT04gKi8KLQotLyogRGVmaW5lIGlmIG1tYXAgb2YgL2Rldi96ZXJvIHdvcmtzLiAqLwotLyogI3VuZGVmIEhBVkVfTU1BUF9ERVZfWkVSTyAqLwotCi0vKiBEZWZpbmUgaWYgcmVhZC1vbmx5IG1tYXAgb2YgYSBwbGFpbiBmaWxlIHdvcmtzLiAqLwotLyogI3VuZGVmIEhBVkVfTU1BUF9GSUxFICovCi0KLS8qIERlZmluZSBpZiAuZWhfZnJhbWUgc2VjdGlvbnMgc2hvdWxkIGJlIHJlYWQtb25seS4gKi8KLS8qICN1bmRlZiBIQVZFX1JPX0VIX0ZSQU1FICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfU1RESU5UX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9TVFJJTkdTX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9tbWFuLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfU1lTX01NQU5fSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfU1lTX1NUQVRfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1NZU19UWVBFU19IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfVU5JU1REX0ggKi8KLQotLyogRGVmaW5lIGlmIHRoZSBob3N0IG1hY2hpbmUgc3RvcmVzIHdvcmRzIG9mIG11bHRpLXdvcmQgaW50ZWdlcnMgaW4KLSAgIGJpZy1lbmRpYW4gb3JkZXIuICovCi0vKiAjdW5kZWYgSE9TVF9XT1JEU19CSUdfRU5ESUFOICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdXIgQyBjb21waWxlciBkb2Vzbid0IGFjY2VwdCAtYyBhbmQgLW8gdG9nZXRoZXIuICovCi0vKiAjdW5kZWYgTk9fTUlOVVNfQ19NSU5VU19PICovCi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotLyogI3VuZGVmIFBBQ0tBR0UgKi8KLQotLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCi0vKiAjdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQgKi8KLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotLyogI3VuZGVmIFBBQ0tBR0VfTkFNRSAqLwotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0vKiAjdW5kZWYgUEFDS0FHRV9TVFJJTkcgKi8KLQotLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotLyogI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRSAqLwotCi0vKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotLyogI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTiAqLwotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHR5cGUgZG91YmxlICovCi0jZGVmaW5lIFNJWkVPRl9ET1VCTEUgOAotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHR5cGUgbG9uZyBkb3VibGUgKi8KLSNkZWZpbmUgU0laRU9GX0xPTkdfRE9VQkxFIDgKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLQlTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0JU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0JU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24gKi8KLS8qICN1bmRlZiBTVEFDS19ESVJFQ1RJT04gKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgUHVyaWZ5IGFuZCB3YW50IHRvIHN1cHByZXNzIHNwdXJpb3VzIG1lc3NhZ2VzLgotICAgKi8KLS8qICN1bmRlZiBVU0lOR19QVVJJRlkgKi8KLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotLyogI3VuZGVmIFZFUlNJT04gKi8KLQotLyogd2hldGhlciBieXRlb3JkZXIgaXMgYmlnZW5kaWFuICovCi0vKiAjdW5kZWYgV09SRFNfQklHRU5ESUFOICovCi0KLSNkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLQotI2RlZmluZSBhYm9ydCgpIGV4aXQoOTk5KQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpdGFyZ2V0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9mZml0YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyN2IyNS4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9mZml0YXJnZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCi0gICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCi0gICBUYXJnZXQgY29uZmlndXJhdGlvbiBtYWNyb3MgZm9yIEFSTS4KLQotICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi0gICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gICBJTiBOTyBFVkVOVCBTSEFMTCBDWUdOVVMgU09MVVRJT05TIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCi0gICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLSAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgotICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWZuZGVmIExJQkZGSV9UQVJHRVRfSAotI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKLQotI2lmbmRlZiBMSUJGRklfQVNNCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZmZpX2FyZzsKLXR5cGVkZWYgc2lnbmVkIGxvbmcgICAgICAgICAgICBmZmlfc2FyZzsKLQotdHlwZWRlZiBlbnVtIGZmaV9hYmkgewotICBGRklfRklSU1RfQUJJID0gMCwKLSAgRkZJX1NZU1YsCi0gIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9TWVNWLAotICBGRklfTEFTVF9BQkkgPSBGRklfREVGQVVMVF9BQkkgKyAxCi19IGZmaV9hYmk7Ci0jZW5kaWYKLQotLyogLS0tLSBEZWZpbml0aW9ucyBmb3IgY2xvc3VyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2RlZmluZSBGRklfQ0xPU1VSRVMgMQotI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDEyCi0KLSNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL3ByZXBfY2lmLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9wcmVwX2NpZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWRjZTJmLi4wMDAwMDAwCi0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL3ByZXBfY2lmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIHByZXBfY2lmLmMgLSBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTggIFJlZCBIYXQsIEluYy4KLQotICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi0gICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gICBJTiBOTyBFVkVOVCBTSEFMTCBDWUdOVVMgU09MVVRJT05TIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCi0gICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLSAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgotICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2luY2x1ZGUgPGZmaS5oPgotI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotCi0vKiBSb3VuZCB1cCB0byBGRklfU0laRU9GX0FSRy4gKi8KLQotI2RlZmluZSBTVEFDS19BUkdfU0laRSh4KSBBTElHTih4LCBGRklfU0laRU9GX0FSRykKLQotLyogUGVyZm9ybSBtYWNoaW5lIGluZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIG9mIGFnZ3JlZ2F0ZSB0eXBlCi0gICBzcGVjaWZpY2F0aW9ucy4gKi8KLQotc3RhdGljIGZmaV9zdGF0dXMgaW5pdGlhbGl6ZV9hZ2dyZWdhdGUoLypAb3V0QCovIGZmaV90eXBlICphcmcpCi17Ci0gIGZmaV90eXBlICoqcHRyOyAKLQotICBGRklfQVNTRVJUKGFyZyAhPSBOVUxMKTsKLQotICAvKkAtdXNlZGVmQCovCi0KLSAgRkZJX0FTU0VSVChhcmctPmVsZW1lbnRzICE9IE5VTEwpOwotICBGRklfQVNTRVJUKGFyZy0+c2l6ZSA9PSAwKTsKLSAgRkZJX0FTU0VSVChhcmctPmFsaWdubWVudCA9PSAwKTsKLQotICBwdHIgPSAmKGFyZy0+ZWxlbWVudHNbMF0pOwotCi0gIHdoaWxlICgoKnB0cikgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoKCgqcHRyKS0+c2l6ZSA9PSAwKSAmJiAoaW5pdGlhbGl6ZV9hZ2dyZWdhdGUoKCpwdHIpKSAhPSBGRklfT0spKQotCXJldHVybiBGRklfQkFEX1RZUEVERUY7Ci0gICAgICAKLSAgICAgIC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIGFyZ3VtZW50IHR5cGUgKi8KLSAgICAgIEZGSV9BU1NFUlRfVkFMSURfVFlQRSgqcHRyKTsKLQotICAgICAgYXJnLT5zaXplID0gQUxJR04oYXJnLT5zaXplLCAoKnB0ciktPmFsaWdubWVudCk7Ci0gICAgICBhcmctPnNpemUgKz0gKCpwdHIpLT5zaXplOwotCi0gICAgICBhcmctPmFsaWdubWVudCA9IChhcmctPmFsaWdubWVudCA+ICgqcHRyKS0+YWxpZ25tZW50KSA/IAotCWFyZy0+YWxpZ25tZW50IDogKCpwdHIpLT5hbGlnbm1lbnQ7Ci0KLSAgICAgIHB0cisrOwotICAgIH0KLQotICAvKiBTdHJ1Y3R1cmUgc2l6ZSBpbmNsdWRlcyB0YWlsIHBhZGRpbmcuICBUaGlzIGlzIGltcG9ydGFudCBmb3IKLSAgICAgc3RydWN0dXJlcyB0aGF0IGZpdCBpbiBvbmUgcmVnaXN0ZXIgb24gQUJJcyBsaWtlIHRoZSBQb3dlclBDNjQKLSAgICAgTGludXggQUJJIHRoYXQgcmlnaHQganVzdGlmeSBzbWFsbCBzdHJ1Y3RzIGluIGEgcmVnaXN0ZXIuCi0gICAgIEl0J3MgYWxzbyBuZWVkZWQgZm9yIG5lc3RlZCBzdHJ1Y3R1cmUgbGF5b3V0LCBmb3IgZXhhbXBsZQotICAgICBzdHJ1Y3QgQSB7IGxvbmcgYTsgY2hhciBiOyB9OyBzdHJ1Y3QgQiB7IHN0cnVjdCBBIHg7IGNoYXIgeTsgfTsKLSAgICAgc2hvdWxkIGZpbmQgeSBhdCBhbiBvZmZzZXQgb2YgMipzaXplb2YobG9uZykgYW5kIHJlc3VsdCBpbiBhCi0gICAgIHRvdGFsIHNpemUgb2YgMypzaXplb2YobG9uZykuICAqLwotICBhcmctPnNpemUgPSBBTElHTiAoYXJnLT5zaXplLCBhcmctPmFsaWdubWVudCk7Ci0KLSAgaWYgKGFyZy0+c2l6ZSA9PSAwKQotICAgIHJldHVybiBGRklfQkFEX1RZUEVERUY7Ci0gIGVsc2UKLSAgICByZXR1cm4gRkZJX09LOwotCi0gIC8qQD11c2VkZWZAKi8KLX0KLQotLyogUGVyZm9ybSBtYWNoaW5lIGluZGVwZW5kZW50IGZmaV9jaWYgcHJlcGFyYXRpb24sIHRoZW4gY2FsbAotICAgbWFjaGluZSBkZXBlbmRlbnQgcm91dGluZS4gKi8KLQotZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWYoLypAb3V0QCovIC8qQHBhcnRpYWxAKi8gZmZpX2NpZiAqY2lmLCAKLQkJCWZmaV9hYmkgYWJpLCB1bnNpZ25lZCBpbnQgbmFyZ3MsIAotCQkJLypAZGVwZW5kZW50QCovIC8qQG91dEAqLyAvKkBwYXJ0aWFsQCovIGZmaV90eXBlICpydHlwZSwgCi0JCQkvKkBkZXBlbmRlbnRAKi8gZmZpX3R5cGUgKiphdHlwZXMpCi17Ci0gIHVuc2lnbmVkIGJ5dGVzID0gMDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZmaV90eXBlICoqcHRyOwotCi0gIEZGSV9BU1NFUlQoY2lmICE9IE5VTEwpOwotICBGRklfQVNTRVJUKChhYmkgPiBGRklfRklSU1RfQUJJKSAmJiAoYWJpIDw9IEZGSV9ERUZBVUxUX0FCSSkpOwotCi0gIGNpZi0+YWJpID0gYWJpOwotICBjaWYtPmFyZ190eXBlcyA9IGF0eXBlczsKLSAgY2lmLT5uYXJncyA9IG5hcmdzOwotICBjaWYtPnJ0eXBlID0gcnR5cGU7Ci0KLSAgY2lmLT5mbGFncyA9IDA7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgcmV0dXJuIHR5cGUgaWYgbmVjZXNzYXJ5ICovCi0gIC8qQC11c2VkZWZAKi8KLSAgaWYgKChjaWYtPnJ0eXBlLT5zaXplID09IDApICYmIChpbml0aWFsaXplX2FnZ3JlZ2F0ZShjaWYtPnJ0eXBlKSAhPSBGRklfT0spKQotICAgIHJldHVybiBGRklfQkFEX1RZUEVERUY7Ci0gIC8qQD11c2VkZWZAKi8KLQotICAvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSByZXR1cm4gdHlwZSAqLwotICBGRklfQVNTRVJUX1ZBTElEX1RZUEUoY2lmLT5ydHlwZSk7Ci0KLSAgLyogeDg2LTY0IGFuZCBzMzkwIHN0YWNrIHNwYWNlIGFsbG9jYXRpb24gaXMgaGFuZGxlZCBpbiBwcmVwX21hY2hkZXAuICAqLwotI2lmICFkZWZpbmVkIE02OEsgJiYgIWRlZmluZWQgX194ODZfNjRfXyAmJiAhZGVmaW5lZCBTMzkwCi0gIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSByZXR1cm4gc3RydWN0dXJlIHBvaW50ZXIgKi8KLSAgaWYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCi0gICAgICAvKiBNU1ZDIHJldHVybnMgc21hbGwgc3RydWN0dXJlcyBpbiByZWdpc3RlcnMuICBCdXQgd2UgaGF2ZSBhIGRpZmZlcmVudAotICAgICAgd29ya2Fyb3VuZDogcHJldGVuZCBpbnQzMiBvciBpbnQ2NCByZXR1cm4gdHlwZSwgYW5kIGNvbnZlcnRpbmcgdG8KLSAgICAgIHN0cnVjdHVyZSBhZnRlcndhcmRzLiAqLwotI2lmZGVmIFNQQVJDCi0gICAgICAmJiAoY2lmLT5hYmkgIT0gRkZJX1Y5IHx8IGNpZi0+cnR5cGUtPnNpemUgPiAzMikKLSNlbmRpZgotICAgICAgKQotICAgIGJ5dGVzID0gU1RBQ0tfQVJHX1NJWkUoc2l6ZW9mKHZvaWQqKSk7Ci0jZW5kaWYKLQotICBmb3IgKHB0ciA9IGNpZi0+YXJnX3R5cGVzLCBpID0gY2lmLT5uYXJnczsgaSA+IDA7IGktLSwgcHRyKyspCi0gICAgewotCi0gICAgICAvKiBJbml0aWFsaXplIGFueSB1bmluaXRpYWxpemVkIGFnZ3JlZ2F0ZSB0eXBlIGRlZmluaXRpb25zICovCi0gICAgICBpZiAoKCgqcHRyKS0+c2l6ZSA9PSAwKSAmJiAoaW5pdGlhbGl6ZV9hZ2dyZWdhdGUoKCpwdHIpKSAhPSBGRklfT0spKQotCXJldHVybiBGRklfQkFEX1RZUEVERUY7Ci0KLSAgICAgIC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIGFyZ3VtZW50IHR5cGUsIGRvIHRoaXMgCi0JIGNoZWNrIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbi4gICovCi0gICAgICBGRklfQVNTRVJUX1ZBTElEX1RZUEUoKnB0cik7Ci0KLSNpZiAhZGVmaW5lZCBfX3g4Nl82NF9fICYmICFkZWZpbmVkIFMzOTAKLSNpZmRlZiBTUEFSQwotICAgICAgaWYgKCgoKnB0ciktPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCi0JICAgJiYgKCgqcHRyKS0+c2l6ZSA+IDE2IHx8IGNpZi0+YWJpICE9IEZGSV9WOSkpCi0JICB8fCAoKCpwdHIpLT50eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUKLQkgICAgICAmJiBjaWYtPmFiaSAhPSBGRklfVjkpKQotCWJ5dGVzICs9IHNpemVvZih2b2lkKik7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQl7Ci0jaWZuZGVmIF9NU0NfVkVSCi0JCS8qIERvbid0IGtub3cgaWYgdGhpcyBpcyBhIGxpYmZmaSBidWcgb3Igbm90LiAgQXQgbGVhc3Qgb24KLQkJICAgV2luZG93cyB3aXRoIE1TVkMsIGZ1bmN0aW9uIGNhbGwgcGFyYW1ldGVycyBhcmUgKm5vdCoKLQkJICAgYWxpZ25lZCBpbiB0aGUgc2FtZSB3YXkgYXMgc3RydWN0dXJlIGZpZWxkcyBhcmUsIHRoZXkgYXJlCi0JCSAgIG9ubHkgYWxpZ25lZCBpbiBpbnRlZ2VyIGJvdW5kYXJpZXMuCi0KLQkJICAgVGhpcyBkb2Vzbid0IGRvIGFueSBoYXJtIGZvciBjZGVjbCBmdW5jdGlvbnMgYW5kIGNsb3N1cmVzLAotCQkgICBzaW5jZSB0aGUgY2FsbGVyIGNsZWFucyB1cCB0aGUgc3RhY2ssIGJ1dCBpdCBpcyB3cm9uZyBmb3IKLQkJICAgc3RkY2FsbCBmdW5jdGlvbnMgd2hlcmUgdGhlIGNhbGxlZSBjbGVhbnMuCi0JCSovCi0KLQkgIC8qIEFkZCBhbnkgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8KLQkgIGlmICgoKCpwdHIpLT5hbGlnbm1lbnQgLSAxKSAmIGJ5dGVzKQotCSAgICBieXRlcyA9IEFMSUdOKGJ5dGVzLCAoKnB0ciktPmFsaWdubWVudCk7Ci0JICAKLSNlbmRpZgotCSAgYnl0ZXMgKz0gU1RBQ0tfQVJHX1NJWkUoKCpwdHIpLT5zaXplKTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgY2lmLT5ieXRlcyA9IGJ5dGVzOwotCi0gIC8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcgKi8KLSAgcmV0dXJuIGZmaV9wcmVwX2NpZl9tYWNoZGVwKGNpZik7Ci19CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9zeXN2LmFzbSBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL3N5c3YuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc4YjkwLi4wMDAwMDAwCi0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL3N5c3YuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgIHN5c3YuUyAtIENvcHlyaWdodCAoYykgMTk5OCBSZWQgSGF0LCBJbmMuCi07ICAKLTsgIEFSTSBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKLTsKLTsgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotOyAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi07ICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLTsgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLTsgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotOyAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi07ICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci07Ci07ICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotOyAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi07Ci07ICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi07ICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi07ICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi07ICBJTiBOTyBFVkVOVCBTSEFMTCBDWUdOVVMgU09MVVRJT05TIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCi07ICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLTsgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgotOyAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotOyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotOyNkZWZpbmUgTElCRkZJX0FTTSAgICAgCi07I2luY2x1ZGUgPGZmaWNvbmZpZy5oPgotOyNpbmNsdWRlIDxmZmkuaD4KLTsjaWZkZWYgSEFWRV9NQUNISU5FX0FTTV9ICi07I2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+Ci07I2Vsc2UKLTsjaWZkZWYgX19VU0VSX0xBQkVMX1BSRUZJWF9fCi07I2RlZmluZSBDT05DQVQxKGEsIGIpIENPTkNBVDIoYSwgYikKLTsjZGVmaW5lIENPTkNBVDIoYSwgYikgYSAjIyBiCi0KLTsvKiBVc2UgdGhlIHJpZ2h0IHByZWZpeCBmb3IgZ2xvYmFsIGxhYmVscy4gICovCi07I2RlZmluZSBDTkFNRSh4KSBDT05DQVQxIChfX1VTRVJfTEFCRUxfUFJFRklYX18sIHgpCi07I2Vsc2UKLTsjZGVmaW5lIENOQU1FKHgpIHgKLTsjZW5kaWYKLTsjZGVmaW5lIEVOVFJZKHgpIC5nbG9ibCBDTkFNRSh4KTsgLnR5cGUgQ05BTUUoeCksJWZ1bmN0aW9uOyBDTkFNRSh4KToKLTsjZW5kaWYKLQotCi1GRklfVFlQRV9WT0lEICAgICAgIEVRVSAwCi1GRklfVFlQRV9JTlQgICAgICAgIEVRVSAxCi1GRklfVFlQRV9GTE9BVCAgICAgIEVRVSAyCi1GRklfVFlQRV9ET1VCTEUgICAgIEVRVSAzCi07RkZJX1RZUEVfTE9OR0RPVUJMRSBFUVUgNAotRkZJX1RZUEVfVUlOVDggICAgICBFUVUgNQotRkZJX1RZUEVfU0lOVDggICAgICBFUVUgNgotRkZJX1RZUEVfVUlOVDE2ICAgICBFUVUgNwotRkZJX1RZUEVfU0lOVDE2ICAgICBFUVUgOAotRkZJX1RZUEVfVUlOVDMyICAgICBFUVUgOQotRkZJX1RZUEVfU0lOVDMyICAgICBFUVUgMTAKLUZGSV9UWVBFX1VJTlQ2NCAgICAgRVFVIDExCi1GRklfVFlQRV9TSU5UNjQgICAgIEVRVSAxMgotRkZJX1RZUEVfU1RSVUNUICAgICBFUVUgMTMKLUZGSV9UWVBFX1BPSU5URVIgICAgRVFVIDE0Ci0KLTsgV2luQ0UgYWx3YXlzIHVzZXMgc29mdHdhcmUgZmxvYXRpbmcgcG9pbnQgKEkgdGhpbmspCi1fX1NPRlRGUF9fIEVRVSB7VFJVRX0KLQotCi0gICAgQVJFQSB8LnRleHR8LCBDT0RFLCBBUk0gICAgIDsgLnRleHQKLQotCi0gICAgOyBhMTogICBmZmlfcHJlcF9hcmdzCi0gICAgOyBhMjogICAmZWNpZgotICAgIDsgYTM6ICAgY2lmLT5ieXRlcwotICAgIDsgYTQ6ICAgZmlnLT5mbGFncwotICAgIDsgc3ArMDogZWNpZi5ydmFsdWUKLSAgICA7IHNwKzQ6IGZuCi0KLSAgICA7IFRoaXMgYXNzdW1lcyB3ZSBhcmUgdXNpbmcgZ2FzLgotO0VOVFJZKGZmaV9jYWxsX1NZU1YpCi0KLSAgICBFWFBPUlQgfGZmaV9jYWxsX1NZU1Z8Ci0KLXxmZmlfY2FsbF9TWVNWfCBQUk9DCi0KLSAgICA7IFNhdmUgcmVnaXN0ZXJzCi0gICAgc3RtZmQgc3AhLCB7YTEtYTQsIGZwLCBscn0KLSAgICBtb3YgICBmcCwgc3AKLQotICAgIDsgTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLgotICAgIHN1YiAgIHNwLCBmcCwgYTMKLQotICAgIDsgUGxhY2UgYWxsIG9mIHRoZSBmZmlfcHJlcF9hcmdzIGluIHBvc2l0aW9uCi0gICAgbW92ICAgaXAsIGExCi0gICAgbW92ICAgYTEsIHNwCi0gICAgOyAgICAgYTIgYWxyZWFkeSBzZXQKLQotICAgIDsgQW5kIGNhbGwKLSAgICBtb3YgICBsciwgcGMKLSAgICBtb3YgICBwYywgaXAKLQotICAgIDsgbW92ZSBmaXJzdCA0IHBhcmFtZXRlcnMgaW4gcmVnaXN0ZXJzCi0gICAgbGRyICAgYTEsIFtzcCwgIzBdCi0gICAgbGRyICAgYTIsIFtzcCwgIzRdCi0gICAgbGRyICAgYTMsIFtzcCwgIzhdCi0gICAgbGRyICAgYTQsIFtzcCwgIzEyXQotCi0gICAgOyBhbmQgYWRqdXN0IHN0YWNrCi0gICAgbGRyICAgaXAsIFtmcCwgIzhdCi0gICAgY21wICAgaXAsICMxNgotICAgIG1vdmdlIGlwLCAjMTYKLSAgICBhZGQgICBzcCwgc3AsIGlwCi0KLSAgICA7IGNhbGwgZnVuY3Rpb24KLSAgICBtb3YgICBsciwgcGMKLSAgICBsZHIgICBwYywgW2ZwLCAjMjhdCi0KLSAgICA7IFJlbW92ZSB0aGUgc3BhY2Ugd2UgcHVzaGVkIGZvciB0aGUgYXJncwotICAgIG1vdiAgIHNwLCBmcAotCi0gICAgOyBMb2FkIGEzIHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQotICAgIGxkciAgIGEzLCBbc3AsICMyNF0KLQotICAgIDsgTG9hZCBhNCB3aXRoIHRoZSByZXR1cm4gdHlwZSBjb2RlIAotICAgIGxkciAgIGE0LCBbc3AsICMxMl0KLQotICAgIDsgSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuCi0gICAgY21wICAgYTMsICMwCi0gICAgYmVxICAgY2FsbF9lcGlsb2d1ZQotCi07IHJldHVybiBJTlQKLSAgICBjbXAgICBhNCwgI0ZGSV9UWVBFX0lOVAotICAgIHN0cmVxIGExLCBbYTNdCi0gICAgYmVxICAgY2FsbF9lcGlsb2d1ZQotCi07IHJldHVybiBGTE9BVAotICAgIGNtcCAgICAgYTQsICNGRklfVFlQRV9GTE9BVAotICAgIFsgX19TT0ZURlBfXyAgICAgICAgICAgICAgICAgICAgO2lmZGVmIF9fU09GVEZQX18KLSAgICBzdHJlcSAgIGExLCBbYTNdCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ZWxzZQotICAgIHN0ZmVxcyAgZjAsIFthM10KLSAgICBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtlbmRpZgotICAgIGJlcSAgICAgY2FsbF9lcGlsb2d1ZQotCi07IHJldHVybiBET1VCTEUgb3IgTE9OR0RPVUJMRQotICAgIGNtcCAgICAgYTQsICNGRklfVFlQRV9ET1VCTEUKLSAgICBbIF9fU09GVEZQX18gICAgICAgICAgICAgICAgICAgIDtpZmRlZiBfX1NPRlRGUF9fCi0gICAgc3RtZXFpYSBhMywge2ExLCBhMn0KLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtlbHNlCi0gICAgc3RmZXFkICBmMCwgW2EzXQotICAgIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO2VuZGlmCi0gICAgYmVxICAgICBjYWxsX2VwaWxvZ3VlCi0KLTsgcmV0dXJuIFNJTlQ2NCBvciBVSU5UNjQKLSAgICBjbXAgICAgIGE0LCAjRkZJX1RZUEVfU0lOVDY0Ci0gICAgc3RtZXFpYSBhMywge2ExLCBhMn0KLQotY2FsbF9lcGlsb2d1ZQotICAgIGxkbWZkICAgc3AhLCB7YTEtYTQsIGZwLCBwY30KLQotOy5mZmlfY2FsbF9TWVNWX2VuZDoKLSAgICA7LnNpemUgICAgQ05BTUUoZmZpX2NhbGxfU1lTViksLmZmaV9jYWxsX1NZU1ZfZW5kLUNOQU1FKGZmaV9jYWxsX1NZU1YpCi0gICAgRU5EUAotCi0KLVJFU0VSVkVfUkVUVVJOIEVRVSAxNgotCi0gICAgOyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdHJhbXBvbGluZQotICAgIDsgSXQgaXMgTk9UIGNhbGxhYmxlIGZyb20gQwotICAgIDsgaXAgPSBwb2ludGVyIHRvIHN0cnVjdCBmZmlfY2xvc3VyZQotCi0gICAgSU1QT1JUIHxmZmlfY2xvc3VyZV9TWVNWX2lubmVyfAotCi0gICAgRVhQT1JUIHxmZmlfY2xvc3VyZV9TWVNWfAotfGZmaV9jbG9zdXJlX1NZU1Z8IFBST0MKLQotICAgIDsgU3RvcmUgdGhlIGFyZ3VtZW50IHJlZ2lzdGVycyBvbiB0aGUgc3RhY2sKLSAgICBzdG1mZCAgIHNwISwge2ExLWE0fQotICAgIDsgUHVzaCB0aGUgcmV0dXJuIGFkZHJlc3Mgb250byB0aGUgc3RhY2sKLSAgICBzdG1mZCAgIHNwISwge2xyfQotCi0gICAgbW92ICAgICBhMSwgaXAgICAgICAgICAgICA7IGZpcnN0IGFyZyA9IGFkZHJlc3Mgb2YgZmZpX2Nsb3N1cmUKLSAgICBhZGQgICAgIGEyLCBzcCwgIzQgICAgICAgIDsgc2Vjb25kIGFyZyA9IHNwKzQgKHBvaW50cyB0byBzYXZlZCBhMSkKLQotICAgIDsgQWxsb2NhdGUgc3BhY2UgZm9yIGEgbm9uLXN0cnVjdCByZXR1cm4gdmFsdWUKLSAgICBzdWIgICAgIHNwLCBzcCwgI1JFU0VSVkVfUkVUVVJOCi0gICAgbW92ICAgICBhMywgc3AgICAgICAgICAgICA7IHRoaXJkIGFyZyA9IHJldHVybiB2YWx1ZSBhZGRyZXNzCi0KLSAgICA7IHN0YXRpYyB1bnNpZ25lZCBpbnQKLSAgICA7IGZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIgKGZmaV9jbG9zdXJlICpjbG9zdXJlLCBjaGFyICppbl9hcmdzLCB2b2lkICpydmFsdWUpCi0gICAgYmwgICAgICBmZmlfY2xvc3VyZV9TWVNWX2lubmVyCi0gICAgOyBhMSBub3cgY29udGFpbnMgdGhlIHJldHVybiB0eXBlIGNvZGUgCi0KLSAgICA7IEF0IHRoaXMgcG9pbnQgdGhlIHJldHVybiB2YWx1ZSBpcyBvbiB0aGUgc3RhY2sKLSAgICA7IFRyYW5zZmVyIGl0IHRvIHRoZSBjb3JyZWN0IHJlZ2lzdGVycyBpZiBuZWNlc3NhcnkKLQotOyByZXR1cm4gSU5UCi0gICAgY21wICAgICBhMSwgI0ZGSV9UWVBFX0lOVAotICAgIGxkcmVxICAgYTEsIFtzcF0KLSAgICBiZXEgICAgIGNsb3N1cmVfZXBpbG9ndWUKLQotOyByZXR1cm4gRkxPQVQKLSAgICBjbXAgICAgIGExLCAjRkZJX1RZUEVfRkxPQVQKLSAgICBbIF9fU09GVEZQX18gICAgICAgICAgICAgICAgICAgIDtpZmRlZiBfX1NPRlRGUF9fCi0gICAgbGRyZXEgICBhMSwgW3NwXQotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO2Vsc2UKLSAgICBzdGZlcXMgIGYwLCBbc3BdCi0gICAgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ZW5kaWYKLSAgICBiZXEgICAgIGNsb3N1cmVfZXBpbG9ndWUKLQotOyByZXR1cm4gRE9VQkxFIG9yIExPTkdET1VCTEUKLSAgICBjbXAgICAgIGExLCAjRkZJX1RZUEVfRE9VQkxFCi0gICAgWyBfX1NPRlRGUF9fICAgICAgICAgICAgICAgICAgICA7aWZkZWYgX19TT0ZURlBfXwotICAgIGxkbWVxaWEgc3AsIHthMSwgYTJ9Ci0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ZWxzZQotICAgIHN0ZmVxZCAgZjAsIFtzcF0KLSAgICBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtlbmRpZgotICAgIGJlcSAgICAgY2xvc3VyZV9lcGlsb2d1ZQotCi07IHJldHVybiBTSU5UNjQgb3IgVUlOVDY0Ci0gICAgY21wICAgICBhMSwgI0ZGSV9UWVBFX1NJTlQ2NAotICAgIGxkbWVxaWEgc3AsIHthMSwgYTJ9Ci0KLWNsb3N1cmVfZXBpbG9ndWUKLSAgICBhZGQgICAgIHNwLCBzcCwgI1JFU0VSVkVfUkVUVVJOICAgOyByZW1vdmUgcmV0dXJuIHZhbHVlIGJ1ZmZlcgotICAgIGxkbWZkICAgc3AhLCB7aXB9ICAgICAgICAgOyBpcCA9IHBvcCByZXR1cm4gYWRkcmVzcwotICAgIGFkZCAgICAgc3AsIHNwLCAjMTYgICAgICAgOyByZW1vdmUgc2F2ZWQgYXJndW1lbnQgcmVnaXN0ZXJzIHthMS1hNH0gZnJvbSB0aGUgc3RhY2sKLSAgICBtb3YgICAgIHBjLCBpcCAgICAgICAgICAgIDsgcmV0dXJuCi0KLSAgICBFTkRQICAgIDsgZmZpX2Nsb3N1cmVfU1lTVgotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYyBiL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCmluZGV4IDIyOGY0OTcuLjE4ZWYzMzUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCisrKyBiL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCkBAIC02LDcgKzYsNyBAQAogCiAvKiBSZWxlYXNlIE51bWJlciAqLwogCi1zdGF0aWMgY2hhciAqUHlDdXJzZXNWZXJzaW9uID0gIjIuMSI7CitzdGF0aWMgY29uc3QgY2hhciBQeUN1cnNlc1ZlcnNpb25bXSA9ICIyLjEiOwogCiAvKiBJbmNsdWRlcyAqLwogCkBAIC01Niw3ICs1Niw3IEBACiAgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLVB5Q3Vyc2VzQ2hlY2tFUlIoaW50IGNvZGUsIGNoYXIgKmZuYW1lKQorUHlDdXJzZXNDaGVja0VSUihpbnQgY29kZSwgY29uc3QgY2hhciAqZm5hbWUpCiB7CiAgICAgaWYgKGNvZGUgIT0gRVJSKSB7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N1cnNlc21vZHVsZS5jIGIvTW9kdWxlcy9fY3Vyc2VzbW9kdWxlLmMKaW5kZXggOTYwNzUyYy4uYTQ4NzM1ZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3Vyc2VzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fY3Vyc2VzbW9kdWxlLmMKQEAgLTIzMDYsNyArMjMwNiw3IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgZGF0YSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoc3RyZWFtLCAmUHlJZF9yZWFkLCAiIik7CisgICAgZGF0YSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoc3RyZWFtLCAmUHlJZF9yZWFkLCBOVUxMKTsKICAgICBpZiAoZGF0YSA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycm9yOwogICAgIGlmICghUHlCeXRlc19DaGVjayhkYXRhKSkgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGF0ZXRpbWVtb2R1bGUuYyBiL01vZHVsZXMvX2RhdGV0aW1lbW9kdWxlLmMKaW5kZXggZjQxOWNiMi4uNjU5N2NiNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGF0ZXRpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL19kYXRldGltZW1vZHVsZS5jCkBAIC05LDYgKzksMTIgQEAKIAogI2lmZGVmIE1TX1dJTkRPV1MKICMgIGluY2x1ZGUgPHdpbnNvY2syLmg+ICAgICAgICAgLyogc3RydWN0IHRpbWV2YWwgKi8KK3N0YXRpYyBzdHJ1Y3QgdG0gKmxvY2FsdGltZV9yKGNvbnN0IHRpbWVfdCAqdGltZXAsIHN0cnVjdCB0bSAqcmVzdWx0KQoreworICAgIGlmIChsb2NhbHRpbWVfcyhyZXN1bHQsIHRpbWVwKSA9PSAwKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBOVUxMOworfQogI2VuZGlmCiAKIC8qIERpZmZlcmVudGlhdGUgYmV0d2VlbiBidWlsZGluZyB0aGUgY29yZSBtb2R1bGUgYW5kIGJ1aWxkaW5nIGV4dGVuc2lvbgpAQCAtNTYsNiArNjIsNyBAQAogI2RlZmluZSBEQVRFX0dFVF9NSU5VVEUgICAgICAgICBQeURhdGVUaW1lX0RBVEVfR0VUX01JTlVURQogI2RlZmluZSBEQVRFX0dFVF9TRUNPTkQgICAgICAgICBQeURhdGVUaW1lX0RBVEVfR0VUX1NFQ09ORAogI2RlZmluZSBEQVRFX0dFVF9NSUNST1NFQ09ORCAgICBQeURhdGVUaW1lX0RBVEVfR0VUX01JQ1JPU0VDT05ECisjZGVmaW5lIERBVEVfR0VUX0ZPTEQgICAgICAgICAgIFB5RGF0ZVRpbWVfREFURV9HRVRfRk9MRAogCiAvKiBEYXRlIGFjY2Vzc29ycyBmb3IgZGF0ZSBhbmQgZGF0ZXRpbWUuICovCiAjZGVmaW5lIFNFVF9ZRUFSKG8sIHYpICAgICAgICAgICgoKG8pLT5kYXRhWzBdID0gKCh2KSAmIDB4ZmYwMCkgPj4gOCksIFwKQEAgLTcxLDEyICs3OCwxNCBAQAogICAgICgoKG8pLT5kYXRhWzddID0gKCh2KSAmIDB4ZmYwMDAwKSA+PiAxNiksIFwKICAgICAgKChvKS0+ZGF0YVs4XSA9ICgodikgJiAweDAwZmYwMCkgPj4gOCksIFwKICAgICAgKChvKS0+ZGF0YVs5XSA9ICgodikgJiAweDAwMDBmZikpKQorI2RlZmluZSBEQVRFX1NFVF9GT0xEKG8sIHYpICAgKFB5RGF0ZVRpbWVfREFURV9HRVRfRk9MRChvKSA9ICh2KSkKIAogLyogVGltZSBhY2Nlc3NvcnMgZm9yIHRpbWUuICovCiAjZGVmaW5lIFRJTUVfR0VUX0hPVVIgICAgICAgICAgIFB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUgogI2RlZmluZSBUSU1FX0dFVF9NSU5VVEUgICAgICAgICBQeURhdGVUaW1lX1RJTUVfR0VUX01JTlVURQogI2RlZmluZSBUSU1FX0dFVF9TRUNPTkQgICAgICAgICBQeURhdGVUaW1lX1RJTUVfR0VUX1NFQ09ORAogI2RlZmluZSBUSU1FX0dFVF9NSUNST1NFQ09ORCAgICBQeURhdGVUaW1lX1RJTUVfR0VUX01JQ1JPU0VDT05ECisjZGVmaW5lIFRJTUVfR0VUX0ZPTEQgICAgICAgICAgIFB5RGF0ZVRpbWVfVElNRV9HRVRfRk9MRAogI2RlZmluZSBUSU1FX1NFVF9IT1VSKG8sIHYpICAgICAoUHlEYXRlVGltZV9USU1FX0dFVF9IT1VSKG8pID0gKHYpKQogI2RlZmluZSBUSU1FX1NFVF9NSU5VVEUobywgdikgICAoUHlEYXRlVGltZV9USU1FX0dFVF9NSU5VVEUobykgPSAodikpCiAjZGVmaW5lIFRJTUVfU0VUX1NFQ09ORChvLCB2KSAgIChQeURhdGVUaW1lX1RJTUVfR0VUX1NFQ09ORChvKSA9ICh2KSkKQEAgLTg0LDYgKzkzLDcgQEAKICAgICAoKChvKS0+ZGF0YVszXSA9ICgodikgJiAweGZmMDAwMCkgPj4gMTYpLCBcCiAgICAgICgobyktPmRhdGFbNF0gPSAoKHYpICYgMHgwMGZmMDApID4+IDgpLCBcCiAgICAgICgobyktPmRhdGFbNV0gPSAoKHYpICYgMHgwMDAwZmYpKSkKKyNkZWZpbmUgVElNRV9TRVRfRk9MRChvLCB2KSAgIChQeURhdGVUaW1lX1RJTUVfR0VUX0ZPTEQobykgPSAodikpCiAKIC8qIERlbHRhIGFjY2Vzc29ycyBmb3IgdGltZWRlbHRhLiAqLwogI2RlZmluZSBHRVRfVERfREFZUyhvKSAgICAgICAgICAoKChQeURhdGVUaW1lX0RlbHRhICopKG8pKS0+ZGF5cykKQEAgLTE4NCwxMiArMTk0LDEyIEBACiAgKiBhbmQgdGhlIG51bWJlciBvZiBkYXlzIGJlZm9yZSB0aGF0IG1vbnRoIGluIHRoZSBzYW1lIHllYXIuICBUaGVzZQogICogYXJlIGNvcnJlY3QgZm9yIG5vbi1sZWFwIHllYXJzIG9ubHkuCiAgKi8KLXN0YXRpYyBpbnQgX2RheXNfaW5fbW9udGhbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgX2RheXNfaW5fbW9udGhbXSA9IHsKICAgICAwLCAvKiB1bnVzZWQ7IHRoaXMgdmVjdG9yIHVzZXMgMS1iYXNlZCBpbmRleGluZyAqLwogICAgIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEKIH07CiAKLXN0YXRpYyBpbnQgX2RheXNfYmVmb3JlX21vbnRoW10gPSB7CitzdGF0aWMgY29uc3QgaW50IF9kYXlzX2JlZm9yZV9tb250aFtdID0gewogICAgIDAsIC8qIHVudXNlZDsgdGhpcyB2ZWN0b3IgdXNlcyAxLWJhc2VkIGluZGV4aW5nICovCiAgICAgMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQKIH07CkBAIC00MTcsNyArNDI3LDcgQEAKICAqIGFyZW4ndCwgcmFpc2UgVmFsdWVFcnJvciBhbmQgcmV0dXJuIC0xLgogICovCiBzdGF0aWMgaW50Ci1jaGVja190aW1lX2FyZ3MoaW50IGgsIGludCBtLCBpbnQgcywgaW50IHVzKQorY2hlY2tfdGltZV9hcmdzKGludCBoLCBpbnQgbSwgaW50IHMsIGludCB1cywgaW50IGZvbGQpCiB7CiAgICAgaWYgKGggPCAwIHx8IGggPiAyMykgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKQEAgLTQzOSw2ICs0NDksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJtaWNyb3NlY29uZCBtdXN0IGJlIGluIDAuLjk5OTk5OSIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQorICAgIGlmIChmb2xkICE9IDAgJiYgZm9sZCAhPSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZvbGQgbXVzdCBiZSBlaXRoZXIgMCBvciAxIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTY3NCw4ICs2ODksOCBAQAogCiAvKiBDcmVhdGUgYSBkYXRldGltZSBpbnN0YW5jZSB3aXRoIG5vIHJhbmdlIGNoZWNraW5nLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKLW5ld19kYXRldGltZV9leChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgaG91ciwgaW50IG1pbnV0ZSwKLSAgICAgICAgICAgICBpbnQgc2Vjb25kLCBpbnQgdXNlY29uZCwgUHlPYmplY3QgKnR6aW5mbywgUHlUeXBlT2JqZWN0ICp0eXBlKQorbmV3X2RhdGV0aW1lX2V4MihpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgaG91ciwgaW50IG1pbnV0ZSwKKyAgICAgICAgICAgICAgICAgaW50IHNlY29uZCwgaW50IHVzZWNvbmQsIFB5T2JqZWN0ICp0emluZm8sIGludCBmb2xkLCBQeVR5cGVPYmplY3QgKnR5cGUpCiB7CiAgICAgUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZjsKICAgICBjaGFyIGF3YXJlID0gdHppbmZvICE9IFB5X05vbmU7CkBAIC02OTIsMTggKzcwNywyNyBAQAogICAgICAgICAgICAgUHlfSU5DUkVGKHR6aW5mbyk7CiAgICAgICAgICAgICBzZWxmLT50emluZm8gPSB0emluZm87CiAgICAgICAgIH0KKyAgICAgICAgREFURV9TRVRfRk9MRChzZWxmLCBmb2xkKTsKICAgICB9CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKLSNkZWZpbmUgbmV3X2RhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8pICAgICAgICAgICBcCi0gICAgbmV3X2RhdGV0aW1lX2V4KHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8sICAgICAgICAgICAgXAorc3RhdGljIFB5T2JqZWN0ICoKK25ld19kYXRldGltZV9leChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgaG91ciwgaW50IG1pbnV0ZSwKKyAgICAgICAgICAgICAgICBpbnQgc2Vjb25kLCBpbnQgdXNlY29uZCwgUHlPYmplY3QgKnR6aW5mbywgUHlUeXBlT2JqZWN0ICp0eXBlKQoreworICAgIHJldHVybiBuZXdfZGF0ZXRpbWVfZXgyKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbywgMCwgdHlwZSk7Cit9CisKKyNkZWZpbmUgbmV3X2RhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8sIGZvbGQpIFwKKyAgICBuZXdfZGF0ZXRpbWVfZXgyKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8sIGZvbGQsIFwKICAgICAgICAgICAgICAgICAgICAgJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlKQogCiAvKiBDcmVhdGUgYSB0aW1lIGluc3RhbmNlIHdpdGggbm8gcmFuZ2UgY2hlY2tpbmcuICovCiBzdGF0aWMgUHlPYmplY3QgKgotbmV3X3RpbWVfZXgoaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCB1c2Vjb25kLAotICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mbywgUHlUeXBlT2JqZWN0ICp0eXBlKQorbmV3X3RpbWVfZXgyKGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kLCBpbnQgdXNlY29uZCwKKyAgICAgICAgICAgICBQeU9iamVjdCAqdHppbmZvLCBpbnQgZm9sZCwgUHlUeXBlT2JqZWN0ICp0eXBlKQogewogICAgIFB5RGF0ZVRpbWVfVGltZSAqc2VsZjsKICAgICBjaGFyIGF3YXJlID0gdHppbmZvICE9IFB5X05vbmU7CkBAIC03MjAsMTIgKzc0NCwyMCBAQAogICAgICAgICAgICAgUHlfSU5DUkVGKHR6aW5mbyk7CiAgICAgICAgICAgICBzZWxmLT50emluZm8gPSB0emluZm87CiAgICAgICAgIH0KKyAgICAgICAgVElNRV9TRVRfRk9MRChzZWxmLCBmb2xkKTsKICAgICB9CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKLSNkZWZpbmUgbmV3X3RpbWUoaGgsIG1tLCBzcywgdXMsIHR6aW5mbykgICAgICAgICAgICAgICAgXAotICAgIG5ld190aW1lX2V4KGhoLCBtbSwgc3MsIHVzLCB0emluZm8sICZQeURhdGVUaW1lX1RpbWVUeXBlKQorc3RhdGljIFB5T2JqZWN0ICoKK25ld190aW1lX2V4KGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kLCBpbnQgdXNlY29uZCwKKyAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8sIFB5VHlwZU9iamVjdCAqdHlwZSkKK3sKKyAgICByZXR1cm4gbmV3X3RpbWVfZXgyKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCB0emluZm8sIDAsIHR5cGUpOworfQorCisjZGVmaW5lIG5ld190aW1lKGhoLCBtbSwgc3MsIHVzLCB0emluZm8sIGZvbGQpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmV3X3RpbWVfZXgyKGhoLCBtbSwgc3MsIHVzLCB0emluZm8sIGZvbGQsICZQeURhdGVUaW1lX1RpbWVUeXBlKQogCiAvKiBDcmVhdGUgYSB0aW1lZGVsdGEgaW5zdGFuY2UuICBOb3JtYWxpemUgdGhlIG1lbWJlcnMgaWZmIG5vcm1hbGl6ZSBpcwogICogdHJ1ZS4gIFBhc3NpbmcgZmFsc2UgaXMgYSBzcGVlZCBvcHRpbWl6YXRpb24sIGlmIHlvdSBrbm93IGZvciBzdXJlCkBAIC04NzMsNyArOTA1LDcgQEAKICAqIHRoaXMgcmV0dXJucyBOVUxMLiAgRWxzZSByZXN1bHQgaXMgcmV0dXJuZWQuCiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1jYWxsX3R6aW5mb19tZXRob2QoUHlPYmplY3QgKnR6aW5mbywgY2hhciAqbmFtZSwgUHlPYmplY3QgKnR6aW5mb2FyZykKK2NhbGxfdHppbmZvX21ldGhvZChQeU9iamVjdCAqdHppbmZvLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdHppbmZvYXJnKQogewogICAgIFB5T2JqZWN0ICpvZmZzZXQ7CiAKQEAgLTg4NywxMCArOTE5LDEwIEBACiAgICAgaWYgKG9mZnNldCA9PSBQeV9Ob25lIHx8IG9mZnNldCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgIGlmIChQeURlbHRhX0NoZWNrKG9mZnNldCkpIHsKLSAgICAgICAgaWYgKEdFVF9URF9NSUNST1NFQ09ORFMob2Zmc2V0KSAhPSAwIHx8IEdFVF9URF9TRUNPTkRTKG9mZnNldCkgJSA2MCAhPSAwKSB7CisgICAgICAgIGlmIChHRVRfVERfTUlDUk9TRUNPTkRTKG9mZnNldCkgIT0gMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKG9mZnNldCk7CiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIm9mZnNldCBtdXN0IGJlIGEgdGltZWRlbHRhIgotICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVwcmVzZW50aW5nIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlcHJlc2VudGluZyBhIHdob2xlIG51bWJlciBvZiBzZWNvbmRzIik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBpZiAoKEdFVF9URF9EQVlTKG9mZnNldCkgPT0gLTEgJiYgR0VUX1REX1NFQ09ORFMob2Zmc2V0KSA9PSAwKSB8fApAQCAtMTAwMiw2ICsxMDM0LDMwIEBACiAgICAgcmV0dXJuIHJlcHI7CiB9CiAKKy8qIHJlcHIgaXMgbGlrZSAic29tZWNsYXNzKGFyZzEsIGFyZzIpIi4gIElmIGZvbGQgaXNuJ3QgMCwKKyAqIHN0dWZmCisgKiAgICAgIiwgZm9sZD0iICsgcmVwcih0emluZm8pCisgKiBiZWZvcmUgdGhlIGNsb3NpbmcgIikiLgorICovCitzdGF0aWMgUHlPYmplY3QgKgorYXBwZW5kX2tleXdvcmRfZm9sZChQeU9iamVjdCAqcmVwciwgaW50IGZvbGQpCit7CisgICAgUHlPYmplY3QgKnRlbXA7CisKKyAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrKHJlcHIpKTsKKyAgICBpZiAoZm9sZCA9PSAwKQorICAgICAgICByZXR1cm4gcmVwcjsKKyAgICAvKiBHZXQgcmlkIG9mIHRoZSB0cmFpbGluZyAnKScuICovCisgICAgYXNzZXJ0KFB5VW5pY29kZV9SRUFEX0NIQVIocmVwciwgUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwciktMSkgPT0gJyknKTsKKyAgICB0ZW1wID0gUHlVbmljb2RlX1N1YnN0cmluZyhyZXByLCAwLCBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXByKSAtIDEpOworICAgIFB5X0RFQ1JFRihyZXByKTsKKyAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXByID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiVVLCBmb2xkPSVkKSIsIHRlbXAsIGZvbGQpOworICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICByZXR1cm4gcmVwcjsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBTdHJpbmcgZm9ybWF0IGhlbHBlcnMuCiAgKi8KQEAgLTEwMDksMTAgKzEwNjUsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtYXRfY3RpbWUoUHlEYXRlVGltZV9EYXRlICpkYXRlLCBpbnQgaG91cnMsIGludCBtaW51dGVzLCBpbnQgc2Vjb25kcykKIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqRGF5TmFtZXNbXSA9IHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IERheU5hbWVzW10gPSB7CiAgICAgICAgICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIsICJTdW4iCiAgICAgfTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqTW9udGhOYW1lc1tdID0geworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgTW9udGhOYW1lc1tdID0gewogICAgICAgICAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAogICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCiAgICAgfTsKQEAgLTEwNTcsMTAgKzExMTMsOCBAQAogICAgIH0KICAgICAvKiBPZmZzZXQgaXMgbm9ybWFsaXplZCwgc28gaXQgaXMgbmVnYXRpdmUgaWYgZGF5cyA8IDAgKi8KICAgICBpZiAoR0VUX1REX0RBWVMob2Zmc2V0KSA8IDApIHsKLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBvZmZzZXQ7CiAgICAgICAgIHNpZ24gPSAnLSc7Ci0gICAgICAgIG9mZnNldCA9IGRlbHRhX25lZ2F0aXZlKChQeURhdGVUaW1lX0RlbHRhICopb2Zmc2V0KTsKLSAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBQeV9TRVRSRUYob2Zmc2V0LCBkZWx0YV9uZWdhdGl2ZSgoUHlEYXRlVGltZV9EZWx0YSAqKW9mZnNldCkpOwogICAgICAgICBpZiAob2Zmc2V0ID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTA3MiwxMCArMTEyNiwxMSBAQAogICAgIFB5X0RFQ1JFRihvZmZzZXQpOwogICAgIG1pbnV0ZXMgPSBkaXZtb2Qoc2Vjb25kcywgNjAsICZzZWNvbmRzKTsKICAgICBob3VycyA9IGRpdm1vZChtaW51dGVzLCA2MCwgJm1pbnV0ZXMpOwotICAgIGFzc2VydChzZWNvbmRzID09IDApOwotICAgIC8qIFhYWCBpZ25vcmUgc3ViLW1pbnV0ZSBkYXRhLCBjdXJyZW50bHkgbm90IGFsbG93ZWQuICovCi0gICAgUHlPU19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVjJTAyZCVzJTAyZCIsIHNpZ24sIGhvdXJzLCBzZXAsIG1pbnV0ZXMpOwotCisgICAgaWYgKHNlY29uZHMgPT0gMCkKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVjJTAyZCVzJTAyZCIsIHNpZ24sIGhvdXJzLCBzZXAsIG1pbnV0ZXMpOworICAgIGVsc2UKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVjJTAyZCVzJTAyZCVzJTAyZCIsIHNpZ24sIGhvdXJzLAorICAgICAgICAgICAgICAgICAgICAgIHNlcCwgbWludXRlcywgc2VwLCBzZWNvbmRzKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTMyMyw3ICsxMzc4LDcgQEAKICAgICBpZiAodGltZSAhPSBOVUxMKSB7CiAgICAgICAgIF9QeV9JREVOVElGSUVSKHRpbWUpOwogCi0gICAgICAgIHJlc3VsdCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQodGltZSwgJlB5SWRfdGltZSwgIigpIik7CisgICAgICAgIHJlc3VsdCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQodGltZSwgJlB5SWRfdGltZSwgTlVMTCk7CiAgICAgICAgIFB5X0RFQ1JFRih0aW1lKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTIzMDcsNyArMjM2Miw3IEBACiAgICAge05VTEwsICAgICAgTlVMTH0sCiB9OwogCi1zdGF0aWMgY2hhciBkZWx0YV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBkZWx0YV9kb2NbXSA9CiBQeURvY19TVFIoIkRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgdmFsdWVzLiIpOwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGRlbHRhX2FzX251bWJlciA9IHsKQEAgLTI2NDgsNyArMjcwMyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9zdHIoUHlEYXRlVGltZV9EYXRlICpzZWxmKQogewotICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCAqKXNlbGYsICZQeUlkX2lzb2Zvcm1hdCwgIigpIik7CisgICAgcmV0dXJuIF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKFB5T2JqZWN0ICopc2VsZiwgJlB5SWRfaXNvZm9ybWF0LCBOVUxMKTsKIH0KIAogCkBAIC0yNjc0LDcgKzI3MjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0KSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICB0dXBsZSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKFB5T2JqZWN0ICopc2VsZiwgJlB5SWRfdGltZXR1cGxlLCAiKCkiKTsKKyAgICB0dXBsZSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKFB5T2JqZWN0ICopc2VsZiwgJlB5SWRfdGltZXR1cGxlLCBOVUxMKTsKICAgICBpZiAodHVwbGUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmVzdWx0ID0gd3JhcF9zdHJmdGltZSgoUHlPYmplY3QgKilzZWxmLCBmb3JtYXQsIHR1cGxlLApAQCAtMjg4Niw3ICsyOTQxLDcgQEAKICAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgZGF0ZV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBkYXRlX2RvY1tdID0KIFB5RG9jX1NUUigiZGF0ZSh5ZWFyLCBtb250aCwgZGF5KSAtLT4gZGF0ZSBvYmplY3QiKTsKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBkYXRlX2FzX251bWJlciA9IHsKQEAgLTMwNDcsMTAgKzMxMDIsOCBAQAogICAgIGlmIChkc3QgPT0gUHlfTm9uZSkKICAgICAgICAgZ290byBJbmNvbnNpc3RlbnQ7CiAgICAgaWYgKGRlbHRhX2Jvb2woKFB5RGF0ZVRpbWVfRGVsdGEgKilkc3QpICE9IDApIHsKLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9IGFkZF9kYXRldGltZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilyZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKilkc3QsIDEpOwotICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIGFkZF9kYXRldGltZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKilkc3QsIDEpKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQogICAgICAgICAgICAgZ290byBGYWlsOwogICAgIH0KQEAgLTMwODAsMzcgKzMxMzMsMzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0emluZm9fcmVkdWNlKFB5T2JqZWN0ICpzZWxmKQogewotICAgIFB5T2JqZWN0ICphcmdzLCAqc3RhdGUsICp0bXA7CisgICAgUHlPYmplY3QgKmFyZ3MsICpzdGF0ZTsKICAgICBQeU9iamVjdCAqZ2V0aW5pdGFyZ3MsICpnZXRzdGF0ZTsKICAgICBfUHlfSURFTlRJRklFUihfX2dldGluaXRhcmdzX18pOwogICAgIF9QeV9JREVOVElGSUVSKF9fZ2V0c3RhdGVfXyk7CiAKLSAgICB0bXAgPSBQeVR1cGxlX05ldygwKTsKLSAgICBpZiAodG1wID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCiAgICAgZ2V0aW5pdGFyZ3MgPSBfUHlPYmplY3RfR2V0QXR0cklkKHNlbGYsICZQeUlkX19fZ2V0aW5pdGFyZ3NfXyk7CiAgICAgaWYgKGdldGluaXRhcmdzICE9IE5VTEwpIHsKLSAgICAgICAgYXJncyA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZ2V0aW5pdGFyZ3MsIHRtcCk7CisgICAgICAgIGFyZ3MgPSBfUHlPYmplY3RfQ2FsbE5vQXJnKGdldGluaXRhcmdzKTsKICAgICAgICAgUHlfREVDUkVGKGdldGluaXRhcmdzKTsKICAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgewotICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgYXJncyA9IHRtcDsKLSAgICAgICAgUHlfSU5DUkVGKGFyZ3MpOworCisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICB9CiAKICAgICBnZXRzdGF0ZSA9IF9QeU9iamVjdF9HZXRBdHRySWQoc2VsZiwgJlB5SWRfX19nZXRzdGF0ZV9fKTsKICAgICBpZiAoZ2V0c3RhdGUgIT0gTlVMTCkgewotICAgICAgICBzdGF0ZSA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZ2V0c3RhdGUsIHRtcCk7CisgICAgICAgIHN0YXRlID0gX1B5T2JqZWN0X0NhbGxOb0FyZyhnZXRzdGF0ZSk7CiAgICAgICAgIFB5X0RFQ1JFRihnZXRzdGF0ZSk7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQpAQCAtMzExOSwxMyArMzE2OSwxMiBAQAogICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICBzdGF0ZSA9IFB5X05vbmU7CiAgICAgICAgIGRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihzZWxmKTsKLSAgICAgICAgaWYgKGRpY3RwdHIgJiYgKmRpY3RwdHIgJiYgUHlEaWN0X1NpemUoKmRpY3RwdHIpKQorICAgICAgICBpZiAoZGljdHB0ciAmJiAqZGljdHB0ciAmJiBQeURpY3RfU2l6ZSgqZGljdHB0cikpIHsKICAgICAgICAgICAgIHN0YXRlID0gKmRpY3RwdHI7CisgICAgICAgIH0KICAgICAgICAgUHlfSU5DUkVGKHN0YXRlKTsKICAgICB9CiAKLSAgICBQeV9ERUNSRUYodG1wKTsKLQogICAgIGlmIChzdGF0ZSA9PSBQeV9Ob25lKSB7CiAgICAgICAgIFB5X0RFQ1JFRihzdGF0ZSk7CiAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgYXJncyk7CkBAIC0zMTU1LDcgKzMyMDQsNyBAQAogICAgIHtOVUxMLCBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgdHppbmZvX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIHR6aW5mb19kb2NbXSA9CiBQeURvY19TVFIoIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRpbWUgem9uZSBpbmZvIG9iamVjdHMuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlEYXRlVGltZV9UWkluZm9UeXBlID0gewpAQCAtMzI4Nyw2ICszMzM2LDExIEBACiAgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5uYW1lKTsKICAgICAgICAgcmV0dXJuIHNlbGYtPm5hbWU7CiAgICAgfQorICAgIGlmICgoUHlPYmplY3QgKilzZWxmID09IFB5RGF0ZVRpbWVfVGltZVpvbmVfVVRDIHx8CisgICAgICAgICAgIChHRVRfVERfREFZUyhzZWxmLT5vZmZzZXQpID09IDAgJiYKKyAgICAgICAgICAgIEdFVF9URF9TRUNPTkRTKHNlbGYtPm9mZnNldCkgPT0gMCAmJgorICAgICAgICAgICAgR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmLT5vZmZzZXQpID09IDApKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoIlVUQyIpOwogICAgIC8qIE9mZnNldCBpcyBub3JtYWxpemVkLCBzbyBpdCBpcyBuZWdhdGl2ZSBpZiBkYXlzIDwgMCAqLwogICAgIGlmIChHRVRfVERfREFZUyhzZWxmLT5vZmZzZXQpIDwgMCkgewogICAgICAgICBzaWduID0gJy0nOwpAQCAtMzM4Miw3ICszNDM2LDcgQEAKICAgICB7TlVMTCwgTlVMTH0KIH07CiAKLXN0YXRpYyBjaGFyIHRpbWV6b25lX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIHRpbWV6b25lX2RvY1tdID0KIFB5RG9jX1NUUigiRml4ZWQgb2Zmc2V0IGZyb20gVVRDIGltcGxlbWVudGF0aW9uIG9mIHR6aW5mby4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeURhdGVUaW1lX1RpbWVab25lVHlwZSA9IHsKQEAgLTM0NjYsMTIgKzM1MjAsMTkgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgUHlPYmplY3QgKgordGltZV9mb2xkKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgdm9pZCAqdW51c2VkKQoreworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoVElNRV9HRVRfRk9MRChzZWxmKSk7Cit9CisKIHN0YXRpYyBQeUdldFNldERlZiB0aW1lX2dldHNldFtdID0gewogICAgIHsiaG91ciIsICAgICAgICAoZ2V0dGVyKXRpbWVfaG91cn0sCiAgICAgeyJtaW51dGUiLCAgICAgIChnZXR0ZXIpdGltZV9taW51dGV9LAogICAgIHsic2Vjb25kIiwgICAgICAoZ2V0dGVyKXB5X3RpbWVfc2Vjb25kfSwKICAgICB7Im1pY3Jvc2Vjb25kIiwgKGdldHRlcil0aW1lX21pY3Jvc2Vjb25kfSwKLSAgICB7InR6aW5mbyIsICAgICAgICAgIChnZXR0ZXIpdGltZV90emluZm99LAorICAgIHsidHppbmZvIiwgICAgICAoZ2V0dGVyKXRpbWVfdHppbmZvfSwKKyAgICB7ImZvbGQiLCAgICAgICAgKGdldHRlcil0aW1lX2ZvbGR9LAogICAgIHtOVUxMfQogfTsKIApAQCAtMzQ4MCw3ICszNTQxLDcgQEAKICAqLwogCiBzdGF0aWMgY2hhciAqdGltZV9rd3NbXSA9IHsiaG91ciIsICJtaW51dGUiLCAic2Vjb25kIiwgIm1pY3Jvc2Vjb25kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0emluZm8iLCBOVUxMfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0emluZm8iLCAiZm9sZCIsIE5VTEx9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQpAQCAtMzQ5MiwxMyArMzU1MywxNCBAQAogICAgIGludCBzZWNvbmQgPSAwOwogICAgIGludCB1c2Vjb25kID0gMDsKICAgICBQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKKyAgICBpbnQgZm9sZCA9IDA7CiAKICAgICAvKiBDaGVjayBmb3IgaW52b2NhdGlvbiBmcm9tIHBpY2tsZSB3aXRoIF9fZ2V0c3RhdGVfXyBzdGF0ZSAqLwogICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID49IDEgJiYKICAgICAgICAgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8PSAyICYmCiAgICAgICAgIFB5Qnl0ZXNfQ2hlY2soc3RhdGUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSAmJgogICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKHN0YXRlKSA9PSBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFICYmCi0gICAgICAgICgodW5zaWduZWQgY2hhcikgKFB5Qnl0ZXNfQVNfU1RSSU5HKHN0YXRlKVswXSkpIDwgMjQpCisgICAgICAgICgweDdGICYgKCh1bnNpZ25lZCBjaGFyKSAoUHlCeXRlc19BU19TVFJJTkcoc3RhdGUpWzBdKSkpIDwgMjQpCiAgICAgewogICAgICAgICBQeURhdGVUaW1lX1RpbWUgKm1lOwogICAgICAgICBjaGFyIGF3YXJlOwpAQCAtMzUyMywxOSArMzU4NSwyNiBAQAogICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0emluZm8pOwogICAgICAgICAgICAgICAgIG1lLT50emluZm8gPSB0emluZm87CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGRhdGFbMF0gJiAoMSA8PCA3KSkgeworICAgICAgICAgICAgICAgIG1lLT5kYXRhWzBdIC09IDEyODsKKyAgICAgICAgICAgICAgICBtZS0+Zm9sZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZS0+Zm9sZCA9IDA7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW1lOwogICAgIH0KIAotICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpaU8iLCB0aW1lX2t3cywKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGlpaWlPJGkiLCB0aW1lX2t3cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZob3VyLCAmbWludXRlLCAmc2Vjb25kLCAmdXNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0emluZm8pKSB7Ci0gICAgICAgIGlmIChjaGVja190aW1lX2FyZ3MoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0emluZm8sICZmb2xkKSkgeworICAgICAgICBpZiAoY2hlY2tfdGltZV9hcmdzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCBmb2xkKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBzZWxmID0gbmV3X3RpbWVfZXgoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsIHR6aW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOworICAgICAgICBzZWxmID0gbmV3X3RpbWVfZXgyKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCB0emluZm8sIGZvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgfQogICAgIHJldHVybiBzZWxmOwogfQpAQCAtMzU4NSw2ICszNjU0LDcgQEAKICAgICBpbnQgbSA9IFRJTUVfR0VUX01JTlVURShzZWxmKTsKICAgICBpbnQgcyA9IFRJTUVfR0VUX1NFQ09ORChzZWxmKTsKICAgICBpbnQgdXMgPSBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKKyAgICBpbnQgZm9sZCA9IFRJTUVfR0VUX0ZPTEQoc2VsZik7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKICAgICBpZiAodXMpCkBAIC0zNTk3LDMzICszNjY3LDY4IEBACiAgICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCIlcyglZCwgJWQpIiwgdHlwZV9uYW1lLCBoLCBtKTsKICAgICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgSEFTVFpJTkZPKHNlbGYpKQogICAgICAgICByZXN1bHQgPSBhcHBlbmRfa2V5d29yZF90emluZm8ocmVzdWx0LCBzZWxmLT50emluZm8pOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiBmb2xkKQorICAgICAgICByZXN1bHQgPSBhcHBlbmRfa2V5d29yZF9mb2xkKHJlc3VsdCwgZm9sZCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfc3RyKFB5RGF0ZVRpbWVfVGltZSAqc2VsZikKIHsKLSAgICByZXR1cm4gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCgoUHlPYmplY3QgKilzZWxmLCAmUHlJZF9pc29mb3JtYXQsICIoKSIpOworICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCAqKXNlbGYsICZQeUlkX2lzb2Zvcm1hdCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi10aW1lX2lzb2Zvcm1hdChQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCit0aW1lX2lzb2Zvcm1hdChQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7CiAgICAgY2hhciBidWZbMTAwXTsKKyAgICBjaGFyICp0aW1lc3BlYyA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InRpbWVzcGVjIiwgTlVMTH07CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBpbnQgdXMgPSBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKKyAgICBzdGF0aWMgY2hhciAqc3BlY3NbXVsyXSA9IHsKKyAgICAgICAgeyJob3VycyIsICIlMDJkIn0sCisgICAgICAgIHsibWludXRlcyIsICIlMDJkOiUwMmQifSwKKyAgICAgICAgeyJzZWNvbmRzIiwgIiUwMmQ6JTAyZDolMDJkIn0sCisgICAgICAgIHsibWlsbGlzZWNvbmRzIiwgIiUwMmQ6JTAyZDolMDJkLiUwM2QifSwKKyAgICAgICAgeyJtaWNyb3NlY29uZHMiLCAiJTAyZDolMDJkOiUwMmQuJTA2ZCJ9LAorICAgIH07CisgICAgc2l6ZV90IGdpdmVuX3NwZWM7CiAKLSAgICBpZiAodXMpCi0gICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCIlMDJkOiUwMmQ6JTAyZC4lMDZkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfSE9VUihzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlOVVRFKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzKTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCIlMDJkOiUwMmQ6JTAyZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX0hPVVIoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JTlVURShzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxzOmlzb2Zvcm1hdCIsIGtleXdvcmRzLCAmdGltZXNwZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICh0aW1lc3BlYyA9PSBOVUxMIHx8IHN0cmNtcCh0aW1lc3BlYywgImF1dG8iKSA9PSAwKSB7CisgICAgICAgIGlmICh1cyA9PSAwKSB7CisgICAgICAgICAgICAvKiBzZWNvbmRzICovCisgICAgICAgICAgICBnaXZlbl9zcGVjID0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIG1pY3Jvc2Vjb25kcyAqLworICAgICAgICAgICAgZ2l2ZW5fc3BlYyA9IDQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoZ2l2ZW5fc3BlYyA9IDA7IGdpdmVuX3NwZWMgPCBQeV9BUlJBWV9MRU5HVEgoc3BlY3MpOyBnaXZlbl9zcGVjKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAodGltZXNwZWMsIHNwZWNzW2dpdmVuX3NwZWNdWzBdKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdpdmVuX3NwZWMgPT0gMykgeworICAgICAgICAgICAgICAgICAgICAvKiBtaWxsaXNlY29uZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgdXMgPSB1cyAvIDEwMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdpdmVuX3NwZWMgPT0gUHlfQVJSQVlfTEVOR1RIKHNwZWNzKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gdGltZXNwZWMgdmFsdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdChzcGVjc1tnaXZlbl9zcGVjXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfSE9VUihzZWxmKSwgVElNRV9HRVRfTUlOVVRFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQoc2VsZiksIHVzKTsKKyAgICB9CiAKICAgICBpZiAocmVzdWx0ID09IE5VTEwgfHwgIUhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTM3NTAsOSArMzg1NSwyMyBAQAogdGltZV9oYXNoKFB5RGF0ZVRpbWVfVGltZSAqc2VsZikKIHsKICAgICBpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKLSAgICAgICAgUHlPYmplY3QgKm9mZnNldDsKLQotICAgICAgICBvZmZzZXQgPSB0aW1lX3V0Y29mZnNldCgoUHlPYmplY3QgKilzZWxmLCBOVUxMKTsKKyAgICAgICAgUHlPYmplY3QgKm9mZnNldCwgKnNlbGYwOworICAgICAgICBpZiAoREFURV9HRVRfRk9MRChzZWxmKSkgeworICAgICAgICAgICAgc2VsZjAgPSBuZXdfdGltZV9leDIoREFURV9HRVRfSE9VUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFB5X1RZUEUoc2VsZikpOworICAgICAgICAgICAgaWYgKHNlbGYwID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2VsZjAgPSAoUHlPYmplY3QgKilzZWxmOworICAgICAgICAgICAgUHlfSU5DUkVGKHNlbGYwKTsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgPSB0aW1lX3V0Y29mZnNldChzZWxmMCwgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmMCk7CiAKICAgICAgICAgaWYgKG9mZnNldCA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMzc5OCwxNSArMzkxNywyNCBAQAogICAgIGludCBzcyA9IFRJTUVfR0VUX1NFQ09ORChzZWxmKTsKICAgICBpbnQgdXMgPSBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKICAgICBQeU9iamVjdCAqdHppbmZvID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKKyAgICBpbnQgZm9sZCA9IFRJTUVfR0VUX0ZPTEQoc2VsZik7CiAKLSAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpaU86cmVwbGFjZSIsCisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGlpaWlPJGk6cmVwbGFjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfa3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGgsICZtbSwgJnNzLCAmdXMsICZ0emluZm8pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGgsICZtbSwgJnNzLCAmdXMsICZ0emluZm8sICZmb2xkKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWlpTyIsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8pOwogICAgIGlmICh0dXBsZSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjbG9uZSA9IHRpbWVfbmV3KFB5X1RZUEUoc2VsZiksIHR1cGxlLCBOVUxMKTsKKyAgICBpZiAoY2xvbmUgIT0gTlVMTCkgeworICAgICAgICBpZiAoZm9sZCAhPSAwICYmIGZvbGQgIT0gMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbGQgbXVzdCBiZSBlaXRoZXIgMCBvciAxIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBUSU1FX1NFVF9GT0xEKGNsb25lLCBmb2xkKTsKKyAgICB9CiAgICAgUHlfREVDUkVGKHR1cGxlKTsKICAgICByZXR1cm4gY2xvbmU7CiB9CkBAIC0zODE5LDcgKzM5NDcsNyBAQAogICogX19nZXRzdGF0ZV9fIGlzbid0IGV4cG9zZWQuCiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCi10aW1lX2dldHN0YXRlKFB5RGF0ZVRpbWVfVGltZSAqc2VsZikKK3RpbWVfZ2V0c3RhdGUoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBpbnQgcHJvdG8pCiB7CiAgICAgUHlPYmplY3QgKmJhc2VzdGF0ZTsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKQEAgLTM4MjcsNiArMzk1NSw5IEBACiAgICAgYmFzZXN0YXRlID0gIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKICAgICBpZiAoYmFzZXN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByb3RvID4gMyAmJiBUSU1FX0dFVF9GT0xEKHNlbGYpKQorICAgICAgICAgICAgLyogU2V0IHRoZSBmaXJzdCBiaXQgb2YgdGhlIGZpcnN0IGJ5dGUgKi8KKyAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGJhc2VzdGF0ZSlbMF0gfD0gKDEgPDwgNyk7CiAgICAgICAgIGlmICghIEhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKICAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfUGFjaygxLCBiYXNlc3RhdGUpOwogICAgICAgICBlbHNlCkBAIC0zODM3LDE2ICszOTY4LDIxIEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi10aW1lX3JlZHVjZShQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmcpCit0aW1lX3JlZHVjZShQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgdGltZV9nZXRzdGF0ZShzZWxmKSk7CisgICAgaW50IHByb3RvID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOl9fcmVkdWNlX2V4X18iLCAmcHJvdG8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgdGltZV9nZXRzdGF0ZShzZWxmLCBwcm90bykpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgdGltZV9tZXRob2RzW10gPSB7CiAKLSAgICB7Imlzb2Zvcm1hdCIsICAgKFB5Q0Z1bmN0aW9uKXRpbWVfaXNvZm9ybWF0LCAgICAgICAgTUVUSF9OT0FSR1MsCi0gICAgIFB5RG9jX1NUUigiUmV0dXJuIHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQsIEhIOk1NOlNTWy5tbW1tbW1dIgotICAgICAgICAgICAgICAgIlsrSEg6TU1dLiIpfSwKKyAgICB7Imlzb2Zvcm1hdCIsICAgKFB5Q0Z1bmN0aW9uKXRpbWVfaXNvZm9ybWF0LCAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgW0hIWzpNTVs6U1NbLm1tbVt1dXVdXV1dXSIKKyAgICAgICAgICAgICAgICJbK0hIOk1NXS5cblxuIgorICAgICAgICAgICAgICAgInRpbWVzcGVjIHNwZWNpZmllcyB3aGF0IGNvbXBvbmVudHMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZS5cbiIpfSwKIAogICAgIHsic3RyZnRpbWUiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXRpbWVfc3RyZnRpbWUsICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAogICAgICBQeURvY19TVFIoImZvcm1hdCAtPiBzdHJmdGltZSgpIHN0eWxlIHN0cmluZy4iKX0sCkBAIC0zODY2LDEzICs0MDAyLDEzIEBACiAgICAgeyJyZXBsYWNlIiwgICAgIChQeUNGdW5jdGlvbil0aW1lX3JlcGxhY2UsICAgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCiAgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgd2l0aCBuZXcgc3BlY2lmaWVkIGZpZWxkcy4iKX0sCiAKLSAgICB7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pdGltZV9yZWR1Y2UsICAgICAgICBNRVRIX05PQVJHUywKLSAgICAgUHlEb2NfU1RSKCJfX3JlZHVjZV9fKCkgLT4gKGNscywgc3RhdGUpIil9LAorICAgIHsiX19yZWR1Y2VfZXhfXyIsIChQeUNGdW5jdGlvbil0aW1lX3JlZHVjZSwgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgUHlEb2NfU1RSKCJfX3JlZHVjZV9leF9fKHByb3RvKSAtPiAoY2xzLCBzdGF0ZSkiKX0sCiAKICAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgdGltZV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciB0aW1lX2RvY1tdID0KIFB5RG9jX1NUUigidGltZShbaG91clssIG1pbnV0ZVssIHNlY29uZFssIG1pY3Jvc2Vjb25kWywgdHppbmZvXV1dXV0pIC0tPiBhIHRpbWUgb2JqZWN0XG5cCiBcblwKIEFsbCBhcmd1bWVudHMgYXJlIG9wdGlvbmFsLiB0emluZm8gbWF5IGJlIE5vbmUsIG9yIGFuIGluc3RhbmNlIG9mXG5cCkBAIC0zOTYwLDEyICs0MDk2LDE5IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICoKK2RhdGV0aW1lX2ZvbGQoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgdm9pZCAqdW51c2VkKQoreworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoREFURV9HRVRfRk9MRChzZWxmKSk7Cit9CisKIHN0YXRpYyBQeUdldFNldERlZiBkYXRldGltZV9nZXRzZXRbXSA9IHsKICAgICB7ImhvdXIiLCAgICAgICAgKGdldHRlcilkYXRldGltZV9ob3VyfSwKICAgICB7Im1pbnV0ZSIsICAgICAgKGdldHRlcilkYXRldGltZV9taW51dGV9LAogICAgIHsic2Vjb25kIiwgICAgICAoZ2V0dGVyKWRhdGV0aW1lX3NlY29uZH0sCiAgICAgeyJtaWNyb3NlY29uZCIsIChnZXR0ZXIpZGF0ZXRpbWVfbWljcm9zZWNvbmR9LAotICAgIHsidHppbmZvIiwgICAgICAgICAgKGdldHRlcilkYXRldGltZV90emluZm99LAorICAgIHsidHppbmZvIiwgICAgICAoZ2V0dGVyKWRhdGV0aW1lX3R6aW5mb30sCisgICAgeyJmb2xkIiwgICAgICAgIChnZXR0ZXIpZGF0ZXRpbWVfZm9sZH0sCiAgICAge05VTEx9CiB9OwogCkBAIC0zOTc1LDcgKzQxMTgsNyBAQAogCiBzdGF0aWMgY2hhciAqZGF0ZXRpbWVfa3dzW10gPSB7CiAgICAgInllYXIiLCAibW9udGgiLCAiZGF5IiwgImhvdXIiLCAibWludXRlIiwgInNlY29uZCIsCi0gICAgIm1pY3Jvc2Vjb25kIiwgInR6aW5mbyIsIE5VTEwKKyAgICAibWljcm9zZWNvbmQiLCAidHppbmZvIiwgImZvbGQiLCBOVUxMCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMzk5MCw2ICs0MTMzLDcgQEAKICAgICBpbnQgbWludXRlID0gMDsKICAgICBpbnQgc2Vjb25kID0gMDsKICAgICBpbnQgdXNlY29uZCA9IDA7CisgICAgaW50IGZvbGQgPSAwOwogICAgIFB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOwogCiAgICAgLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KQEAgLTM5OTcsNyArNDE0MSw3IEBACiAgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPD0gMiAmJgogICAgICAgICBQeUJ5dGVzX0NoZWNrKHN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkgJiYKICAgICAgICAgUHlCeXRlc19HRVRfU0laRShzdGF0ZSkgPT0gX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkUgJiYKLSAgICAgICAgTU9OVEhfSVNfU0FORShQeUJ5dGVzX0FTX1NUUklORyhzdGF0ZSlbMl0pKQorICAgICAgICBNT05USF9JU19TQU5FKFB5Qnl0ZXNfQVNfU1RSSU5HKHN0YXRlKVsyXSAmIDB4N0YpKQogICAgIHsKICAgICAgICAgUHlEYXRlVGltZV9EYXRlVGltZSAqbWU7CiAgICAgICAgIGNoYXIgYXdhcmU7CkBAIC00MDIyLDIyICs0MTY2LDI5IEBACiAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHR6aW5mbyk7CiAgICAgICAgICAgICAgICAgbWUtPnR6aW5mbyA9IHR6aW5mbzsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwZGF0YVsyXSAmICgxIDw8IDcpKSB7CisgICAgICAgICAgICAgICAgbWUtPmRhdGFbMl0gLT0gMTI4OworICAgICAgICAgICAgICAgIG1lLT5mb2xkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1lLT5mb2xkID0gMDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopbWU7CiAgICAgfQogCi0gICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgImlpaXxpaWlpTyIsIGRhdGV0aW1lX2t3cywKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiaWlpfGlpaWlPJGkiLCBkYXRldGltZV9rd3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeWVhciwgJm1vbnRoLCAmZGF5LCAmaG91ciwgJm1pbnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmQsICZ1c2Vjb25kLCAmdHppbmZvKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZCwgJnVzZWNvbmQsICZ0emluZm8sICZmb2xkKSkgewogICAgICAgICBpZiAoY2hlY2tfZGF0ZV9hcmdzKHllYXIsIG1vbnRoLCBkYXkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoY2hlY2tfdGltZV9hcmdzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kKSA8IDApCisgICAgICAgIGlmIChjaGVja190aW1lX2FyZ3MoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsIGZvbGQpIDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHNlbGYgPSBuZXdfZGF0ZXRpbWVfZXgoeWVhciwgbW9udGgsIGRheSwKKyAgICAgICAgc2VsZiA9IG5ld19kYXRldGltZV9leDIoeWVhciwgbW9udGgsIGRheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbywgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbywgZm9sZCwgdHlwZSk7CiAgICAgfQogICAgIHJldHVybiBzZWxmOwogfQpAQCAtNDA0NSw2ICs0MTk2LDQ1IEBACiAvKiBUTV9GVU5DIGlzIHRoZSBzaGFyZWQgdHlwZSBvZiBsb2NhbHRpbWUoKSBhbmQgZ210aW1lKCkuICovCiB0eXBlZGVmIHN0cnVjdCB0bSAqKCpUTV9GVU5DKShjb25zdCB0aW1lX3QgKnRpbWVyKTsKIAorLyogQXMgb2YgdmVyc2lvbiAyMDE1ZiBtYXggZm9sZCBpbiBJQU5BIGRhdGFiYXNlIGlzCisgKiAyMyBob3VycyBhdCAxOTY5LTA5LTMwIDEzOjAwOjAwIGluIEt3YWphbGVpbi4gKi8KK3N0YXRpYyBsb25nIGxvbmcgbWF4X2ZvbGRfc2Vjb25kcyA9IDI0ICogMzYwMDsKKy8qIE5COiBkYXRlKDE5NzAsMSwxKS50b29yZGluYWwoKSA9PSA3MTkxNjMgKi8KK3N0YXRpYyBsb25nIGxvbmcgZXBvY2ggPSBQeV9MTCg3MTkxNjMpICogMjQgKiA2MCAqIDYwOworCitzdGF0aWMgbG9uZyBsb25nCit1dGNfdG9fc2Vjb25kcyhpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LAorICAgICAgICAgICAgICAgaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQpCit7CisgICAgbG9uZyBsb25nIG9yZGluYWwgPSB5bWRfdG9fb3JkKHllYXIsIG1vbnRoLCBkYXkpOworICAgIHJldHVybiAoKG9yZGluYWwgKiAyNCArIGhvdXIpICogNjAgKyBtaW51dGUpICogNjAgKyBzZWNvbmQ7Cit9CisKK3N0YXRpYyBsb25nIGxvbmcKK2xvY2FsKGxvbmcgbG9uZyB1KQoreworICAgIHN0cnVjdCB0bSBsb2NhbF90aW1lOworICAgIHRpbWVfdCB0OworICAgIHUgLT0gZXBvY2g7CisgICAgdCA9IHU7CisgICAgaWYgKHQgIT0gdSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgInRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UgZm9yIHBsYXRmb3JtIHRpbWVfdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIFhYWDogYWRkIGJvdW5kcyBjaGVja2luZyAqLworICAgIGlmIChsb2NhbHRpbWVfcigmdCwgJmxvY2FsX3RpbWUpID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiB1dGNfdG9fc2Vjb25kcyhsb2NhbF90aW1lLnRtX3llYXIgKyAxOTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF90aW1lLnRtX21vbiArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3RpbWUudG1fbWRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfdGltZS50bV9ob3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF90aW1lLnRtX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfdGltZS50bV9zZWMpOworfQorCiAvKiBJbnRlcm5hbCBoZWxwZXIuCiAgKiBCdWlsZCBkYXRldGltZSBmcm9tIGEgdGltZV90IGFuZCBhIGRpc3RpbmN0IGNvdW50IG9mIG1pY3Jvc2Vjb25kcy4KICAqIFBhc3MgbG9jYWx0aW1lIG9yIGdtdGltZSBmb3IgZiwgdG8gY29udHJvbCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGltZXQuCkBAIC00MDU0LDYgKzQyNDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mbykKIHsKICAgICBzdHJ1Y3QgdG0gKnRtOworICAgIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZm9sZCA9IDA7CiAKICAgICB0bSA9IGYoJnRpbWV0KTsKICAgICBpZiAodG0gPT0gTlVMTCkgewpAQCAtNDA2NCw2MSArNDI1NSw0MCBAQAogICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwogICAgIH0KIAorICAgIHllYXIgPSB0bS0+dG1feWVhciArIDE5MDA7CisgICAgbW9udGggPSB0bS0+dG1fbW9uICsgMTsKKyAgICBkYXkgPSB0bS0+dG1fbWRheTsKKyAgICBob3VyID0gdG0tPnRtX2hvdXI7CisgICAgbWludXRlID0gdG0tPnRtX21pbjsKICAgICAvKiBUaGUgcGxhdGZvcm0gbG9jYWx0aW1lL2dtdGltZSBtYXkgaW5zZXJ0IGxlYXAgc2Vjb25kcywKICAgICAgKiBpbmRpY2F0ZWQgYnkgdG0tPnRtX3NlYyA+IDU5LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVtLAogICAgICAqIGV4Y2VwdCB0byB0aGUgZXh0ZW50IHRoYXQgcGFzc2luZyB0aGVtIG9uIHRvIHRoZSBkYXRldGltZQogICAgICAqIGNvbnN0cnVjdG9yIHdvdWxkIHJhaXNlIFZhbHVlRXJyb3IgZm9yIGEgcmVhc29uIHRoYXQKICAgICAgKiBtYWRlIG5vIHNlbnNlIHRvIHRoZSB1c2VyLgogICAgICAqLwotICAgIGlmICh0bS0+dG1fc2VjID4gNTkpCi0gICAgICAgIHRtLT50bV9zZWMgPSA1OTsKLSAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNscywgImlpaWlpaWlPIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9tb24gKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX21kYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1faG91ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1fc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pOwotfQorICAgIHNlY29uZCA9IFB5X01JTig1OSwgdG0tPnRtX3NlYyk7CiAKLXN0YXRpYyB0aW1lX3QKLV9QeVRpbWVfRG91YmxlVG9UaW1ldChkb3VibGUgeCkKLXsKLSAgICB0aW1lX3QgcmVzdWx0OwotICAgIGRvdWJsZSBkaWZmOworICAgIGlmICh0emluZm8gPT0gUHlfTm9uZSAmJiBmID09IGxvY2FsdGltZSkgeworICAgICAgICBsb25nIGxvbmcgcHJvYmVfc2Vjb25kcywgcmVzdWx0X3NlY29uZHMsIHRyYW5zaXRpb247CiAKLSAgICByZXN1bHQgPSAodGltZV90KXg7Ci0gICAgLyogSG93IG11Y2ggaW5mbyBkaWQgd2UgbG9zZT8gIHRpbWVfdCBtYXkgYmUgYW4gaW50ZWdyYWwgb3IKLSAgICAgKiBmbG9hdGluZyB0eXBlLCBhbmQgd2UgZG9uJ3Qga25vdyB3aGljaC4gIElmIGl0J3MgaW50ZWdyYWwsCi0gICAgICogd2UgZG9uJ3Qga25vdyB3aGV0aGVyIEMgdHJ1bmNhdGVzLCByb3VuZHMsIHJldHVybnMgdGhlIGZsb29yLAotICAgICAqIGV0Yy4gIElmIHdlIGxvc3QgYSBzZWNvbmQgb3IgbW9yZSwgdGhlIEMgcm91bmRpbmcgaXMKLSAgICAgKiB1bnJlYXNvbmFibGUsIG9yIHRoZSBpbnB1dCBqdXN0IGRvZXNuJ3QgZml0IGluIGEgdGltZV90OwotICAgICAqIGNhbGwgaXQgYW4gZXJyb3IgcmVnYXJkbGVzcy4gIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgY2FzdCB0bwotICAgICAqIHRpbWVfdCBjYW4gY2F1c2UgYSBDIGVycm9yIHRvbywgYnV0IG5vdGhpbmcgd2UgY2FuIGRvIHRvCi0gICAgICogd29ybSBhcm91bmQgdGhhdC4KLSAgICAgKi8KLSAgICBkaWZmID0geCAtIChkb3VibGUpcmVzdWx0OwotICAgIGlmIChkaWZmIDw9IC0xLjAgfHwgZGlmZiA+PSAxLjApIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIG91dCBvZiByYW5nZSBmb3IgcGxhdGZvcm0gdGltZV90Iik7Ci0gICAgICAgIHJlc3VsdCA9ICh0aW1lX3QpLTE7CisgICAgICAgIHJlc3VsdF9zZWNvbmRzID0gdXRjX3RvX3NlY29uZHMoeWVhciwgbW9udGgsIGRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCk7CisgICAgICAgIC8qIFByb2JlIG1heF9mb2xkX3NlY29uZHMgdG8gZGV0ZWN0IGEgZm9sZC4gKi8KKyAgICAgICAgcHJvYmVfc2Vjb25kcyA9IGxvY2FsKGVwb2NoICsgdGltZXQgLSBtYXhfZm9sZF9zZWNvbmRzKTsKKyAgICAgICAgaWYgKHByb2JlX3NlY29uZHMgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdHJhbnNpdGlvbiA9IHJlc3VsdF9zZWNvbmRzIC0gcHJvYmVfc2Vjb25kcyAtIG1heF9mb2xkX3NlY29uZHM7CisgICAgICAgIGlmICh0cmFuc2l0aW9uIDwgMCkgeworICAgICAgICAgICAgcHJvYmVfc2Vjb25kcyA9IGxvY2FsKGVwb2NoICsgdGltZXQgKyB0cmFuc2l0aW9uKTsKKyAgICAgICAgICAgIGlmIChwcm9iZV9zZWNvbmRzID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKHByb2JlX3NlY29uZHMgPT0gcmVzdWx0X3NlY29uZHMpCisgICAgICAgICAgICAgICAgZm9sZCA9IDE7CisgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogUm91bmQgYSBkb3VibGUgdG8gdGhlIG5lYXJlc3QgbG9uZy4gIHx4fCBtdXN0IGJlIHNtYWxsIGVub3VnaCB0byBmaXQKLSAqIGluIGEgQyBsb25nOyB0aGlzIGlzIG5vdCBjaGVja2VkLgotICovCi1zdGF0aWMgZG91YmxlCi1fUHlUaW1lX1JvdW5kSGFsZkV2ZW4oZG91YmxlIHgpCi17Ci0gICAgZG91YmxlIHJvdW5kZWQgPSByb3VuZCh4KTsKLSAgICBpZiAoZmFicyh4LXJvdW5kZWQpID09IDAuNSkKLSAgICAgICAgLyogaGFsZndheSBjYXNlOiByb3VuZCB0byBldmVuICovCi0gICAgICAgIHJvdW5kZWQgPSAyLjAqcm91bmQoeC8yLjApOwotICAgIHJldHVybiByb3VuZGVkOworICAgIHJldHVybiBuZXdfZGF0ZXRpbWVfZXgyKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlLCBzZWNvbmQsIHVzLCB0emluZm8sIGZvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5VHlwZU9iamVjdCAqKWNscyk7CiB9CiAKIC8qIEludGVybmFsIGhlbHBlci4KQEAgLTQxMjksMzIgKzQyOTksMTcgQEAKICAqIHRvIGdldCB0aGF0IG11Y2ggcHJlY2lzaW9uIChlLmcuLCBDIHRpbWUoKSBpc24ndCBnb29kIGVub3VnaCkuCiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1kYXRldGltZV9mcm9tX3RpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBUTV9GVU5DIGYsIGRvdWJsZSB0aW1lc3RhbXAsCitkYXRldGltZV9mcm9tX3RpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBUTV9GVU5DIGYsIFB5T2JqZWN0ICp0aW1lc3RhbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdHppbmZvKQogewogICAgIHRpbWVfdCB0aW1ldDsKLSAgICBkb3VibGUgZnJhY3Rpb247Ci0gICAgaW50IHVzOworICAgIGxvbmcgdXM7CiAKLSAgICB0aW1ldCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldCh0aW1lc3RhbXApOwotICAgIGlmICh0aW1ldCA9PSAodGltZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKF9QeVRpbWVfT2JqZWN0VG9UaW1ldmFsKHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWV0LCAmdXMsIF9QeVRpbWVfUk9VTkRfSEFMRl9FVkVOKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZnJhY3Rpb24gPSB0aW1lc3RhbXAgLSAoZG91YmxlKXRpbWV0OwotICAgIHVzID0gKGludClfUHlUaW1lX1JvdW5kSGFsZkV2ZW4oZnJhY3Rpb24gKiAxZTYpOwotICAgIGlmICh1cyA8IDApIHsKLSAgICAgICAgLyogVHJ1bmNhdGlvbiB0b3dhcmRzIHplcm8gaXMgbm90IHdoYXQgd2Ugd2FudGVkCi0gICAgICAgICAgIGZvciBuZWdhdGl2ZSBudW1iZXJzIChQeXRob24ncyBtb2Qgc2VtYW50aWNzKSAqLwotICAgICAgICB0aW1ldCAtPSAxOwotICAgICAgICB1cyArPSAxMDAwMDAwOwotICAgIH0KLSAgICAvKiBJZiB0aW1lc3RhbXAgaXMgbGVzcyB0aGFuIG9uZSBtaWNyb3NlY29uZCBzbWFsbGVyIHRoYW4gYQotICAgICAqIGZ1bGwgc2Vjb25kLCByb3VuZCB1cC4gT3RoZXJ3aXNlLCBWYWx1ZUVycm9ycyBhcmUgcmFpc2VkCi0gICAgICogZm9yIHNvbWUgZmxvYXRzLiAqLwotICAgIGlmICh1cyA9PSAxMDAwMDAwKSB7Ci0gICAgICAgIHRpbWV0ICs9IDE7Ci0gICAgICAgIHVzID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXRfYW5kX3VzKGNscywgZiwgdGltZXQsIHVzLCB0emluZm8pOworCisgICAgcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXRfYW5kX3VzKGNscywgZiwgdGltZXQsIChpbnQpdXMsIHR6aW5mbyk7CiB9CiAKIC8qIEludGVybmFsIGhlbHBlci4KQEAgLTQyMDUsMTAgKzQzNjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6KTsKICAgICBpZiAoc2VsZiAhPSBOVUxMICYmIHR6ICE9IFB5X05vbmUpIHsKICAgICAgICAgLyogQ29udmVydCBVVEMgdG8gdHppbmZvJ3Mgem9uZS4gKi8KLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBzZWxmOwotCi0gICAgICAgIHNlbGYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHR6LCAmUHlJZF9mcm9tdXRjLCAiTyIsIHNlbGYpOwotICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIHNlbGYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHR6LCAmUHlJZF9mcm9tdXRjLCAiTiIsIHNlbGYpOwogICAgIH0KICAgICByZXR1cm4gc2VsZjsKIH0KQEAgLTQyMjcsMTEgKzQzNzksMTEgQEAKIGRhdGV0aW1lX2Zyb210aW1lc3RhbXAoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKICAgICBQeU9iamVjdCAqc2VsZjsKLSAgICBkb3VibGUgdGltZXN0YW1wOworICAgIFB5T2JqZWN0ICp0aW1lc3RhbXA7CiAgICAgUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CiAgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InRpbWVzdGFtcCIsICJ0eiIsIE5VTEx9OwogCi0gICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiZHxPOmZyb210aW1lc3RhbXAiLAorICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk98Tzpmcm9tdGltZXN0YW1wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZHMsICZ0aW1lc3RhbXAsICZ0emluZm8pKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQpAQCAtNDI0MywxMCArNDM5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyk7CiAgICAgaWYgKHNlbGYgIT0gTlVMTCAmJiB0emluZm8gIT0gUHlfTm9uZSkgewogICAgICAgICAvKiBDb252ZXJ0IFVUQyB0byB0emluZm8ncyB6b25lLiAqLwotICAgICAgICBQeU9iamVjdCAqdGVtcCA9IHNlbGY7Ci0KLSAgICAgICAgc2VsZiA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQodHppbmZvLCAmUHlJZF9mcm9tdXRjLCAiTyIsIHNlbGYpOwotICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIHNlbGYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHR6aW5mbywgJlB5SWRfZnJvbXV0YywgIk4iLCBzZWxmKTsKICAgICB9CiAgICAgcmV0dXJuIHNlbGY7CiB9CkBAIC00MjU1LDEwICs0NDA0LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfdXRjZnJvbXRpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBkb3VibGUgdGltZXN0YW1wOworICAgIFB5T2JqZWN0ICp0aW1lc3RhbXA7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLSAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZDp1dGNmcm9tdGltZXN0YW1wIiwgJnRpbWVzdGFtcCkpCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86dXRjZnJvbXRpbWVzdGFtcCIsICZ0aW1lc3RhbXApKQogICAgICAgICByZXN1bHQgPSBkYXRldGltZV9mcm9tX3RpbWVzdGFtcChjbHMsIGdtdGltZSwgdGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDI4OCwyNyArNDQzNywzMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2NvbWJpbmUoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLSAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZGF0ZSIsICJ0aW1lIiwgTlVMTH07CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImRhdGUiLCAidGltZSIsICJ0emluZm8iLCBOVUxMfTsKICAgICBQeU9iamVjdCAqZGF0ZTsKICAgICBQeU9iamVjdCAqdGltZTsKKyAgICBQeU9iamVjdCAqdHppbmZvID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPIU8hOmNvbWJpbmUiLCBrZXl3b3JkcywKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiTyFPIXxPOmNvbWJpbmUiLCBrZXl3b3JkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeURhdGVUaW1lX0RhdGVUeXBlLCAmZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeURhdGVUaW1lX1RpbWVUeXBlLCAmdGltZSkpIHsKLSAgICAgICAgUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7Ci0KLSAgICAgICAgaWYgKEhBU1RaSU5GTyh0aW1lKSkKLSAgICAgICAgICAgIHR6aW5mbyA9ICgoUHlEYXRlVGltZV9UaW1lICopdGltZSktPnR6aW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeURhdGVUaW1lX1RpbWVUeXBlLCAmdGltZSwgJnR6aW5mbykpIHsKKyAgICAgICAgaWYgKHR6aW5mbyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoSEFTVFpJTkZPKHRpbWUpKQorICAgICAgICAgICAgICAgIHR6aW5mbyA9ICgoUHlEYXRlVGltZV9UaW1lICopdGltZSktPnR6aW5mbzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0emluZm8gPSBQeV9Ob25lOworICAgICAgICB9CiAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjbHMsICJpaWlpaWlpTyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoZGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01PTlRIKGRhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoZGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfSE9VUih0aW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9NSU5VVEUodGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHRpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JQ1JPU0VDT05EKHRpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfWUVBUihkYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChkYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoZGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9IT1VSKHRpbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlOVVRFKHRpbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHRpbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlDUk9TRUNPTkQodGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgREFURV9TRVRfRk9MRChyZXN1bHQsIFRJTUVfR0VUX0ZPTEQodGltZSkpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtNDM3Niw3ICs0NTMwLDcgQEAKICAgICBlbHNlCiAgICAgICAgIHJldHVybiBuZXdfZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFTVFpJTkZPKGRhdGUpID8gZGF0ZS0+dHppbmZvIDogUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFTVFpJTkZPKGRhdGUpID8gZGF0ZS0+dHppbmZvIDogUHlfTm9uZSwgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00NDY5LDkgKzQ2MjMsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgICAgICAgICBpZiAob2ZmZGlmZiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKnRlbXAgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVsdGFfc3VidHJhY3QocmVzdWx0LCBvZmZkaWZmKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgICAgICAgICAgUHlfU0VUUkVGKHJlc3VsdCwgZGVsdGFfc3VidHJhY3QocmVzdWx0LCBvZmZkaWZmKSk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9mZmRpZmYpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00NTIxLDYgKzQ2NzMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZiksCiAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpKTsKICAgICB9CisgICAgaWYgKGJhc2VyZXByICE9IE5VTEwgJiYgREFURV9HRVRfRk9MRChzZWxmKSAhPSAwKQorICAgICAgICBiYXNlcmVwciA9IGFwcGVuZF9rZXl3b3JkX2ZvbGQoYmFzZXJlcHIsIERBVEVfR0VUX0ZPTEQoc2VsZikpOwogICAgIGlmIChiYXNlcmVwciA9PSBOVUxMIHx8ICEgSEFTVFpJTkZPKHNlbGYpKQogICAgICAgICByZXR1cm4gYmFzZXJlcHI7CiAgICAgcmV0dXJuIGFwcGVuZF9rZXl3b3JkX3R6aW5mbyhiYXNlcmVwciwgc2VsZi0+dHppbmZvKTsKQEAgLTQ1MzYsMjUgKzQ2OTAsNTUgQEAKIGRhdGV0aW1lX2lzb2Zvcm1hdChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewogICAgIGludCBzZXAgPSAnVCc7Ci0gICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InNlcCIsIE5VTEx9OworICAgIGNoYXIgKnRpbWVzcGVjID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsic2VwIiwgInRpbWVzcGVjIiwgTlVMTH07CiAgICAgY2hhciBidWZmZXJbMTAwXTsKLSAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogICAgIGludCB1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpOworICAgIHN0YXRpYyBjaGFyICpzcGVjc1tdWzJdID0geworICAgICAgICB7ImhvdXJzIiwgIiUwNGQtJTAyZC0lMDJkJWMlMDJkIn0sCisgICAgICAgIHsibWludXRlcyIsICIlMDRkLSUwMmQtJTAyZCVjJTAyZDolMDJkIn0sCisgICAgICAgIHsic2Vjb25kcyIsICIlMDRkLSUwMmQtJTAyZCVjJTAyZDolMDJkOiUwMmQifSwKKyAgICAgICAgeyJtaWxsaXNlY29uZHMiLCAiJTA0ZC0lMDJkLSUwMmQlYyUwMmQ6JTAyZDolMDJkLiUwM2QifSwKKyAgICAgICAgeyJtaWNyb3NlY29uZHMiLCAiJTA0ZC0lMDJkLSUwMmQlYyUwMmQ6JTAyZDolMDJkLiUwNmQifSwKKyAgICB9OworICAgIHNpemVfdCBnaXZlbl9zcGVjOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8Qzppc29mb3JtYXQiLCBrZXl3b3JkcywgJnNlcCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8Q3M6aXNvZm9ybWF0Iiwga2V5d29yZHMsICZzZXAsICZ0aW1lc3BlYykpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICh1cykKLSAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiUwNGQtJTAyZC0lMDJkJWMlMDJkOiUwMmQ6JTAyZC4lMDZkIiwKKworICAgIGlmICh0aW1lc3BlYyA9PSBOVUxMIHx8IHN0cmNtcCh0aW1lc3BlYywgImF1dG8iKSA9PSAwKSB7CisgICAgICAgIGlmICh1cyA9PSAwKSB7CisgICAgICAgICAgICAvKiBzZWNvbmRzICovCisgICAgICAgICAgICBnaXZlbl9zcGVjID0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIG1pY3Jvc2Vjb25kcyAqLworICAgICAgICAgICAgZ2l2ZW5fc3BlYyA9IDQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoZ2l2ZW5fc3BlYyA9IDA7IGdpdmVuX3NwZWMgPCBQeV9BUlJBWV9MRU5HVEgoc3BlY3MpOyBnaXZlbl9zcGVjKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAodGltZXNwZWMsIHNwZWNzW2dpdmVuX3NwZWNdWzBdKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdpdmVuX3NwZWMgPT0gMykgeworICAgICAgICAgICAgICAgICAgICB1cyA9IHVzIC8gMTAwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2l2ZW5fc3BlYyA9PSBQeV9BUlJBWV9MRU5HVEgoc3BlY3MpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiVW5rbm93biB0aW1lc3BlYyB2YWx1ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KHNwZWNzW2dpdmVuX3NwZWNdWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHNlbGYpLCAoaW50KXNlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksIHVzKTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCIlMDRkLSUwMmQtJTAyZCVjJTAyZDolMDJkOiUwMmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHNlbGYpLCAoaW50KXNlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZikpOworICAgIH0KIAogICAgIGlmICghcmVzdWx0IHx8ICFIQVNUWklORk8oc2VsZikpCiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC00NTgxLDYgKzQ3NjUsNzAgQEAKIC8qIE1pc2NlbGxhbmVvdXMgbWV0aG9kcy4gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKK2ZsaXBfZm9sZChQeU9iamVjdCAqZHQpCit7CisgICAgcmV0dXJuIG5ld19kYXRldGltZV9leDIoR0VUX1lFQVIoZHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChkdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShkdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihkdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKGR0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoZHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKGR0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQVNUWklORk8oZHQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQeURhdGVUaW1lX0RhdGVUaW1lICopZHQpLT50emluZm8gOiBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFEQVRFX0dFVF9GT0xEKGR0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGR0KSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitnZXRfZmxpcF9mb2xkX29mZnNldChQeU9iamVjdCAqZHQpCit7CisgICAgUHlPYmplY3QgKnJlc3VsdCwgKmZsaXBfZHQ7CisKKyAgICBmbGlwX2R0ID0gZmxpcF9mb2xkKGR0KTsKKyAgICBpZiAoZmxpcF9kdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBkYXRldGltZV91dGNvZmZzZXQoZmxpcF9kdCwgTlVMTCk7CisgICAgUHlfREVDUkVGKGZsaXBfZHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIFBFUCA0OTUgZXhjZXB0aW9uOiBXaGVuZXZlciBvbmUgb3IgYm90aCBvZiB0aGUgb3BlcmFuZHMgaW4KKyAqIGludGVyLXpvbmUgY29tcGFyaXNvbiBpcyBzdWNoIHRoYXQgaXRzIHV0Y29mZnNldCgpIGRlcGVuZHMKKyAqIG9uIHRoZSB2YWx1ZSBvZiBpdHMgZm9sZCBmb2xkIGF0dHJpYnV0ZSwgdGhlIHJlc3VsdCBpcyBGYWxzZS4KKyAqCisgKiBSZXR1cm4gMSBpZiBleGNlcHRpb24gYXBwbGllcywgMCBpZiBub3QsICBhbmQgLTEgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQKK3BlcDQ5NV9lcV9leGNlcHRpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9mZnNldF9zZWxmLCBQeU9iamVjdCAqb2Zmc2V0X290aGVyKQoreworICAgIGludCByZXN1bHQgPSAwOworICAgIFB5T2JqZWN0ICpmbGlwX29mZnNldDsKKworICAgIGZsaXBfb2Zmc2V0ID0gZ2V0X2ZsaXBfZm9sZF9vZmZzZXQoc2VsZik7CisgICAgaWYgKGZsaXBfb2Zmc2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoZmxpcF9vZmZzZXQgIT0gb2Zmc2V0X3NlbGYgJiYKKyAgICAgICAgZGVsdGFfY21wKGZsaXBfb2Zmc2V0LCBvZmZzZXRfc2VsZikpCisgICAgeworICAgICAgICByZXN1bHQgPSAxOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIFB5X0RFQ1JFRihmbGlwX29mZnNldCk7CisKKyAgICBmbGlwX29mZnNldCA9IGdldF9mbGlwX2ZvbGRfb2Zmc2V0KG90aGVyKTsKKyAgICBpZiAoZmxpcF9vZmZzZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChmbGlwX29mZnNldCAhPSBvZmZzZXRfb3RoZXIgJiYKKyAgICAgICAgZGVsdGFfY21wKGZsaXBfb2Zmc2V0LCBvZmZzZXRfb3RoZXIpKQorICAgICAgICByZXN1bHQgPSAxOworIGRvbmU6CisgICAgUHlfREVDUkVGKGZsaXBfb2Zmc2V0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfcmljaGNvbXBhcmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwpAQCAtNDYyNyw2ICs0ODc1LDEzIEBACiAgICAgICAgIGRpZmYgPSBtZW1jbXAoKChQeURhdGVUaW1lX0RhdGVUaW1lICopc2VsZiktPmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgKChQeURhdGVUaW1lX0RhdGVUaW1lICopb3RoZXIpLT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgIF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFKTsKKyAgICAgICAgaWYgKChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkgJiYgZGlmZiA9PSAwKSB7CisgICAgICAgICAgICBpbnQgZXggPSBwZXA0OTVfZXFfZXhjZXB0aW9uKHNlbGYsIG90aGVyLCBvZmZzZXQxLCBvZmZzZXQyKTsKKyAgICAgICAgICAgIGlmIChleCA9PSAtMSkKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICBpZiAoZXgpCisgICAgICAgICAgICAgICAgZGlmZiA9IDE7CisgICAgICAgIH0KICAgICAgICAgcmVzdWx0ID0gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKICAgICB9CiAgICAgZWxzZSBpZiAob2Zmc2V0MSAhPSBQeV9Ob25lICYmIG9mZnNldDIgIT0gUHlfTm9uZSkgewpAQCAtNDY0Miw2ICs0ODk3LDEzIEBACiAgICAgICAgICAgICBkaWZmID0gR0VUX1REX1NFQ09ORFMoZGVsdGEpIHwKICAgICAgICAgICAgICAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKGRlbHRhKTsKICAgICAgICAgUHlfREVDUkVGKGRlbHRhKTsKKyAgICAgICAgaWYgKChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkgJiYgZGlmZiA9PSAwKSB7CisgICAgICAgICAgICBpbnQgZXggPSBwZXA0OTVfZXFfZXhjZXB0aW9uKHNlbGYsIG90aGVyLCBvZmZzZXQxLCBvZmZzZXQyKTsKKyAgICAgICAgICAgIGlmIChleCA9PSAtMSkKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICBpZiAoZXgpCisgICAgICAgICAgICAgICAgZGlmZiA9IDE7CisgICAgICAgIH0KICAgICAgICAgcmVzdWx0ID0gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKICAgICB9CiAgICAgZWxzZSBpZiAob3AgPT0gUHlfRVEpIHsKQEAgLTQ2NjcsOSArNDkyOSwyNiBAQAogZGF0ZXRpbWVfaGFzaChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewogICAgIGlmIChzZWxmLT5oYXNoY29kZSA9PSAtMSkgewotICAgICAgICBQeU9iamVjdCAqb2Zmc2V0OwotCi0gICAgICAgIG9mZnNldCA9IGRhdGV0aW1lX3V0Y29mZnNldCgoUHlPYmplY3QgKilzZWxmLCBOVUxMKTsKKyAgICAgICAgUHlPYmplY3QgKm9mZnNldCwgKnNlbGYwOworICAgICAgICBpZiAoREFURV9HRVRfRk9MRChzZWxmKSkgeworICAgICAgICAgICAgc2VsZjAgPSBuZXdfZGF0ZXRpbWVfZXgyKEdFVF9ZRUFSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFB5X1RZUEUoc2VsZikpOworICAgICAgICAgICAgaWYgKHNlbGYwID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2VsZjAgPSAoUHlPYmplY3QgKilzZWxmOworICAgICAgICAgICAgUHlfSU5DUkVGKHNlbGYwKTsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgPSBkYXRldGltZV91dGNvZmZzZXQoc2VsZjAsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoc2VsZjApOwogCiAgICAgICAgIGlmIChvZmZzZXQgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTQ3MjMsNzYgKzUwMDIsNzggQEAKICAgICBpbnQgc3MgPSBEQVRFX0dFVF9TRUNPTkQoc2VsZik7CiAgICAgaW50IHVzID0gREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7CiAgICAgUHlPYmplY3QgKnR6aW5mbyA9IEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmU7CisgICAgaW50IGZvbGQgPSBEQVRFX0dFVF9GT0xEKHNlbGYpOwogCi0gICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGlpaWlpaWlPOnJlcGxhY2UiLAorICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpaWlpTyRpOnJlcGxhY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRldGltZV9rd3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR6aW5mbykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0emluZm8sICZmb2xkKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWlpaWlpTyIsIHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8pOwogICAgIGlmICh0dXBsZSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjbG9uZSA9IGRhdGV0aW1lX25ldyhQeV9UWVBFKHNlbGYpLCB0dXBsZSwgTlVMTCk7CisKKyAgICBpZiAoY2xvbmUgIT0gTlVMTCkgeworICAgICAgICBpZiAoZm9sZCAhPSAwICYmIGZvbGQgIT0gMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbGQgbXVzdCBiZSBlaXRoZXIgMCBvciAxIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBEQVRFX1NFVF9GT0xEKGNsb25lLCBmb2xkKTsKKyAgICB9CiAgICAgUHlfREVDUkVGKHR1cGxlKTsKICAgICByZXR1cm4gY2xvbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1sb2NhbF90aW1lem9uZShQeURhdGVUaW1lX0RhdGVUaW1lICp1dGNfdGltZSkKK2xvY2FsX3RpbWV6b25lX2Zyb21fdGltZXN0YW1wKHRpbWVfdCB0aW1lc3RhbXApCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0gICAgc3RydWN0IHRtICp0aW1lcDsKLSAgICB0aW1lX3QgdGltZXN0YW1wOwogICAgIFB5T2JqZWN0ICpkZWx0YTsKLSAgICBQeU9iamVjdCAqb25lX3NlY29uZDsKLSAgICBQeU9iamVjdCAqc2Vjb25kczsKKyAgICBzdHJ1Y3QgdG0gKmxvY2FsX3RpbWVfdG07CiAgICAgUHlPYmplY3QgKm5hbWVvID0gTlVMTDsKICAgICBjb25zdCBjaGFyICp6b25lID0gTlVMTDsKIAotICAgIGRlbHRhID0gbmV3X2RlbHRhKHltZF90b19vcmQoR0VUX1lFQVIodXRjX3RpbWUpLCBHRVRfTU9OVEgodXRjX3RpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWSh1dGNfdGltZSkpIC0gNzE5MTYzLAotICAgICAgICAgICAgICAgICAgICAgIDYwICogKDYwICogREFURV9HRVRfSE9VUih1dGNfdGltZSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURSh1dGNfdGltZSkpICsKLSAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQodXRjX3RpbWUpLAotICAgICAgICAgICAgICAgICAgICAgIDAsIDApOwotICAgIGlmIChkZWx0YSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBvbmVfc2Vjb25kID0gbmV3X2RlbHRhKDAsIDEsIDAsIDApOwotICAgIGlmIChvbmVfc2Vjb25kID09IE5VTEwpCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgc2Vjb25kcyA9IGRpdmlkZV90aW1lZGVsdGFfdGltZWRlbHRhKChQeURhdGVUaW1lX0RlbHRhICopZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopb25lX3NlY29uZCk7Ci0gICAgUHlfREVDUkVGKG9uZV9zZWNvbmQpOwotICAgIGlmIChzZWNvbmRzID09IE5VTEwpCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgUHlfREVDUkVGKGRlbHRhKTsKLSAgICB0aW1lc3RhbXAgPSBQeUxvbmdfQXNMb25nKHNlY29uZHMpOwotICAgIFB5X0RFQ1JFRihzZWNvbmRzKTsKLSAgICBpZiAodGltZXN0YW1wID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHRpbWVwID0gbG9jYWx0aW1lKCZ0aW1lc3RhbXApOworICAgIGxvY2FsX3RpbWVfdG0gPSBsb2NhbHRpbWUoJnRpbWVzdGFtcCk7CiAjaWZkZWYgSEFWRV9TVFJVQ1RfVE1fVE1fWk9ORQotICAgIHpvbmUgPSB0aW1lcC0+dG1fem9uZTsKLSAgICBkZWx0YSA9IG5ld19kZWx0YSgwLCB0aW1lcC0+dG1fZ210b2ZmLCAwLCAxKTsKKyAgICB6b25lID0gbG9jYWxfdGltZV90bS0+dG1fem9uZTsKKyAgICBkZWx0YSA9IG5ld19kZWx0YSgwLCBsb2NhbF90aW1lX3RtLT50bV9nbXRvZmYsIDAsIDEpOwogI2Vsc2UgLyogSEFWRV9TVFJVQ1RfVE1fVE1fWk9ORSAqLwogICAgIHsKLSAgICAgICAgUHlPYmplY3QgKmxvY2FsX3RpbWU7Ci0gICAgICAgIGxvY2FsX3RpbWUgPSBuZXdfZGF0ZXRpbWUodGltZXAtPnRtX3llYXIgKyAxOTAwLCB0aW1lcC0+dG1fbW9uICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcC0+dG1fbWRheSwgdGltZXAtPnRtX2hvdXIsIHRpbWVwLT50bV9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXAtPnRtX3NlYywgREFURV9HRVRfTUlDUk9TRUNPTkQodXRjX3RpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0Y190aW1lLT50emluZm8pOwotICAgICAgICBpZiAobG9jYWxfdGltZSA9PSBOVUxMKQotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgZGVsdGEgPSBkYXRldGltZV9zdWJ0cmFjdChsb2NhbF90aW1lLCAoUHlPYmplY3QqKXV0Y190aW1lKTsKLSAgICAgICAgLyogWFhYOiBiZWZvcmUgcmVseWluZyBvbiB0em5hbWUsIHdlIHNob3VsZCBjb21wYXJlIGRlbHRhCi0gICAgICAgICAgIHRvIHRoZSBvZmZzZXQgaW1wbGllZCBieSB0aW1lem9uZS9hbHR6b25lICovCi0gICAgICAgIGlmIChkYXlsaWdodCAmJiB0aW1lcC0+dG1faXNkc3QgPj0gMCkKLSAgICAgICAgICAgIHpvbmUgPSB0em5hbWVbdGltZXAtPnRtX2lzZHN0ICUgMl07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHpvbmUgPSB0em5hbWVbMF07CisgICAgICAgIFB5T2JqZWN0ICpsb2NhbF90aW1lLCAqdXRjX3RpbWU7CisgICAgICAgIHN0cnVjdCB0bSAqdXRjX3RpbWVfdG07CisgICAgICAgIGNoYXIgYnVmWzEwMF07CisgICAgICAgIHN0cmZ0aW1lKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlWiIsIGxvY2FsX3RpbWVfdG0pOworICAgICAgICB6b25lID0gYnVmOworICAgICAgICBsb2NhbF90aW1lID0gbmV3X2RhdGV0aW1lKGxvY2FsX3RpbWVfdG0tPnRtX3llYXIgKyAxOTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3RpbWVfdG0tPnRtX21vbiArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfdGltZV90bS0+dG1fbWRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF90aW1lX3RtLT50bV9ob3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3RpbWVfdG0tPnRtX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF90aW1lX3RtLT50bV9zZWMsIDAsIFB5X05vbmUsIDApOworICAgICAgICBpZiAobG9jYWxfdGltZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB1dGNfdGltZV90bSA9IGdtdGltZSgmdGltZXN0YW1wKTsKKyAgICAgICAgdXRjX3RpbWUgPSBuZXdfZGF0ZXRpbWUodXRjX3RpbWVfdG0tPnRtX3llYXIgKyAxOTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGNfdGltZV90bS0+dG1fbW9uICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRjX3RpbWVfdG0tPnRtX21kYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0Y190aW1lX3RtLT50bV9ob3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGNfdGltZV90bS0+dG1fbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGNfdGltZV90bS0+dG1fc2VjLCAwLCBQeV9Ob25lLCAwKTsKKyAgICAgICAgaWYgKHV0Y190aW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsb2NhbF90aW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGRlbHRhID0gZGF0ZXRpbWVfc3VidHJhY3QobG9jYWxfdGltZSwgdXRjX3RpbWUpOwogICAgICAgICBQeV9ERUNSRUYobG9jYWxfdGltZSk7CisgICAgICAgIFB5X0RFQ1JFRih1dGNfdGltZSk7CiAgICAgfQogI2VuZGlmIC8qIEhBVkVfU1RSVUNUX1RNX1RNX1pPTkUgKi8KKyAgICBpZiAoZGVsdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGlmICh6b25lICE9IE5VTEwpIHsKICAgICAgICAgbmFtZW8gPSBQeVVuaWNvZGVfRGVjb2RlTG9jYWxlKHpvbmUsICJzdXJyb2dhdGVlc2NhcGUiKTsKICAgICAgICAgaWYgKG5hbWVvID09IE5VTEwpCkBAIC00ODA1LDEyICs1MDg2LDY1IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICoKK2xvY2FsX3RpbWV6b25lKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnV0Y190aW1lKQoreworICAgIHRpbWVfdCB0aW1lc3RhbXA7CisgICAgUHlPYmplY3QgKmRlbHRhOworICAgIFB5T2JqZWN0ICpvbmVfc2Vjb25kOworICAgIFB5T2JqZWN0ICpzZWNvbmRzOworCisgICAgZGVsdGEgPSBkYXRldGltZV9zdWJ0cmFjdCgoUHlPYmplY3QgKil1dGNfdGltZSwgUHlEYXRlVGltZV9FcG9jaCk7CisgICAgaWYgKGRlbHRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9uZV9zZWNvbmQgPSBuZXdfZGVsdGEoMCwgMSwgMCwgMCk7CisgICAgaWYgKG9uZV9zZWNvbmQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZGVsdGEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2Vjb25kcyA9IGRpdmlkZV90aW1lZGVsdGFfdGltZWRlbHRhKChQeURhdGVUaW1lX0RlbHRhICopZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopb25lX3NlY29uZCk7CisgICAgUHlfREVDUkVGKG9uZV9zZWNvbmQpOworICAgIFB5X0RFQ1JFRihkZWx0YSk7CisgICAgaWYgKHNlY29uZHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdGltZXN0YW1wID0gX1B5TG9uZ19Bc1RpbWVfdChzZWNvbmRzKTsKKyAgICBQeV9ERUNSRUYoc2Vjb25kcyk7CisgICAgaWYgKHRpbWVzdGFtcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbG9jYWxfdGltZXpvbmVfZnJvbV90aW1lc3RhbXAodGltZXN0YW1wKTsKK30KKworc3RhdGljIGxvbmcgbG9uZworbG9jYWxfdG9fc2Vjb25kcyhpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LAorICAgICAgICAgICAgICAgICBpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCwgaW50IGZvbGQpOworCitzdGF0aWMgUHlPYmplY3QgKgorbG9jYWxfdGltZXpvbmVfZnJvbV9sb2NhbChQeURhdGVUaW1lX0RhdGVUaW1lICpsb2NhbF9kdCkKK3sKKyAgICBsb25nIGxvbmcgc2Vjb25kczsKKyAgICB0aW1lX3QgdGltZXN0YW1wOworICAgIHNlY29uZHMgPSBsb2NhbF90b19zZWNvbmRzKEdFVF9ZRUFSKGxvY2FsX2R0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgobG9jYWxfZHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkobG9jYWxfZHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIobG9jYWxfZHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURShsb2NhbF9kdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKGxvY2FsX2R0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9GT0xEKGxvY2FsX2R0KSk7CisgICAgaWYgKHNlY29uZHMgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIFhYWDogYWRkIGJvdW5kcyBjaGVjayAqLworICAgIHRpbWVzdGFtcCA9IHNlY29uZHMgLSBlcG9jaDsKKyAgICByZXR1cm4gbG9jYWxfdGltZXpvbmVfZnJvbV90aW1lc3RhbXAodGltZXN0YW1wKTsKK30KKwogc3RhdGljIFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKgogZGF0ZXRpbWVfYXN0aW1lem9uZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewogICAgIFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnJlc3VsdDsKICAgICBQeU9iamVjdCAqb2Zmc2V0OwogICAgIFB5T2JqZWN0ICp0ZW1wOworICAgIFB5T2JqZWN0ICpzZWxmX3R6aW5mbzsKICAgICBQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKICAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsidHoiLCBOVUxMfTsKIApAQCAtNDgyMSwyNyArNTE1NSwyNyBAQAogICAgIGlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoIUhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKLSAgICAgICAgZ290byBOZWVkQXdhcmU7CisgICAgaWYgKCFIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpIHsKKyAgICAgICAgc2VsZl90emluZm8gPSBsb2NhbF90aW1lem9uZV9mcm9tX2xvY2FsKHNlbGYpOworICAgICAgICBpZiAoc2VsZl90emluZm8gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGZfdHppbmZvID0gc2VsZi0+dHppbmZvOworICAgICAgICBQeV9JTkNSRUYoc2VsZl90emluZm8pOworICAgIH0KIAogICAgIC8qIENvbnZlcnNpb24gdG8gc2VsZidzIG93biB0aW1lIHpvbmUgaXMgYSBOT1AuICovCi0gICAgaWYgKHNlbGYtPnR6aW5mbyA9PSB0emluZm8pIHsKKyAgICBpZiAoc2VsZl90emluZm8gPT0gdHppbmZvKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmX3R6aW5mbyk7CiAgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKICAgICAgICAgcmV0dXJuIHNlbGY7CiAgICAgfQogCiAgICAgLyogQ29udmVydCBzZWxmIHRvIFVUQy4gKi8KLSAgICBvZmZzZXQgPSBkYXRldGltZV91dGNvZmZzZXQoKFB5T2JqZWN0ICopc2VsZiwgTlVMTCk7CisgICAgb2Zmc2V0ID0gY2FsbF91dGNvZmZzZXQoc2VsZl90emluZm8sIChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X0RFQ1JFRihzZWxmX3R6aW5mbyk7CiAgICAgaWYgKG9mZnNldCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAob2Zmc2V0ID09IFB5X05vbmUpIHsKLSAgICAgICAgUHlfREVDUkVGKG9mZnNldCk7Ci0gICAgICBOZWVkQXdhcmU6Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYXN0aW1lem9uZSgpIGNhbm5vdCBiZSBhcHBsaWVkIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJhIG5haXZlIGRhdGV0aW1lIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQogICAgIC8qIHJlc3VsdCA9IHNlbGYgLSBvZmZzZXQgKi8KICAgICByZXN1bHQgPSAoUHlEYXRlVGltZV9EYXRlVGltZSAqKWFkZF9kYXRldGltZV90aW1lZGVsdGEoc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopb2Zmc2V0LCAtMSk7CkBAIC00ODQ5LDYgKzUxODMsMzIgQEAKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCisgICAgLyogTWFrZSBzdXJlIHJlc3VsdCBpcyBhd2FyZSBhbmQgVVRDLiAqLworICAgIGlmICghSEFTVFpJTkZPKHJlc3VsdCkpIHsKKyAgICAgICAgdGVtcCA9IChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICAgICAgcmVzdWx0ID0gKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKikKKyAgICAgICAgICAgICAgICAgICBuZXdfZGF0ZXRpbWVfZXgyKEdFVF9ZRUFSKHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURShyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSUNST1NFQ09ORChyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlEYXRlVGltZV9UaW1lWm9uZV9VVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9GT0xEKHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHJlc3VsdCkpOworICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogUmVzdWx0IGlzIGFscmVhZHkgYXdhcmUgLSBqdXN0IHJlcGxhY2UgdHppbmZvLiAqLworICAgICAgICB0ZW1wID0gcmVzdWx0LT50emluZm87CisgICAgICAgIHJlc3VsdC0+dHppbmZvID0gUHlEYXRlVGltZV9UaW1lWm9uZV9VVEM7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQtPnR6aW5mbyk7CisgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICB9CisKICAgICAvKiBBdHRhY2ggbmV3IHR6aW5mbyBhbmQgbGV0IGZyb211dGMoKSBkbyB0aGUgcmVzdC4gKi8KICAgICB0ZW1wID0gcmVzdWx0LT50emluZm87CiAgICAgaWYgKHR6aW5mbyA9PSBQeV9Ob25lKSB7CkBAIC00ODk2LDYgKzUyNTYsNTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ZmxhZyk7CiB9CiAKK3N0YXRpYyBsb25nIGxvbmcKK2xvY2FsX3RvX3NlY29uZHMoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwKKyAgICAgICAgICAgICAgICAgaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCBmb2xkKQoreworICAgIGxvbmcgbG9uZyB0LCBhLCBiLCB1MSwgdTIsIHQxLCB0MiwgbHQ7CisgICAgdCA9IHV0Y190b19zZWNvbmRzKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKTsKKyAgICAvKiBPdXIgZ29hbCBpcyB0byBzb2x2ZSB0ID0gbG9jYWwodSkgZm9yIHUuICovCisgICAgbHQgPSBsb2NhbCh0KTsKKyAgICBpZiAobHQgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhID0gbHQgLSB0OworICAgIHUxID0gdCAtIGE7CisgICAgdDEgPSBsb2NhbCh1MSk7CisgICAgaWYgKHQxID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHQxID09IHQpIHsKKyAgICAgICAgLyogV2UgZm91bmQgb25lIHNvbHV0aW9uLCBidXQgaXQgbWF5IG5vdCBiZSB0aGUgb25lIHdlIG5lZWQuCisgICAgICAgICAqIExvb2sgZm9yIGFuIGVhcmxpZXIgc29sdXRpb24gKGlmIGBmb2xkYCBpcyAwKSwgb3IgYQorICAgICAgICAgKiBsYXRlciBvbmUgKGlmIGBmb2xkYCBpcyAxKS4gKi8KKyAgICAgICAgaWYgKGZvbGQpCisgICAgICAgICAgICB1MiA9IHUxICsgbWF4X2ZvbGRfc2Vjb25kczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdTIgPSB1MSAtIG1heF9mb2xkX3NlY29uZHM7CisgICAgICAgIGx0ID0gbG9jYWwodTIpOworICAgICAgICBpZiAobHQgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGIgPSBsdCAtIHUyOworICAgICAgICBpZiAoYSA9PSBiKQorICAgICAgICAgICAgcmV0dXJuIHUxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYiA9IHQxIC0gdTE7CisgICAgICAgIGFzc2VydChhICE9IGIpOworICAgIH0KKyAgICB1MiA9IHQgLSBiOworICAgIHQyID0gbG9jYWwodTIpOworICAgIGlmICh0MiA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh0MiA9PSB0KQorICAgICAgICByZXR1cm4gdTI7CisgICAgaWYgKHQxID09IHQpCisgICAgICAgIHJldHVybiB1MTsKKyAgICAvKiBXZSBoYXZlIGZvdW5kIGJvdGggb2Zmc2V0cyBhIGFuZCBiLCBidXQgbmVpdGhlciB0IC0gYSBub3IgdCAtIGIgaXMKKyAgICAgKiBhIHNvbHV0aW9uLiAgVGhpcyBtZWFucyB0IGlzIGluIHRoZSBnYXAuICovCisgICAgcmV0dXJuIGZvbGQ/UHlfTUlOKHUxLCB1Mik6UHlfTUFYKHUxLCB1Mik7Cit9CisKKy8qIGRhdGUoMTk3MCwxLDEpLnRvb3JkaW5hbCgpID09IDcxOTE2MyAqLworI2RlZmluZSBFUE9DSF9TRUNPTkRTICg3MTkxNjNMTCAqIDI0ICogNjAgKiA2MCkKKwogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3RpbWVzdGFtcChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewpAQCAtNDkxMCwzMyArNTMyMCwxOCBAQAogICAgICAgICBQeV9ERUNSRUYoZGVsdGEpOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgc3RydWN0IHRtIHRpbWU7Ci0gICAgICAgIHRpbWVfdCB0aW1lc3RhbXA7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKSAmdGltZSwgJ1wwJywgc2l6ZW9mKHN0cnVjdCB0bSkpOwotICAgICAgICB0aW1lLnRtX3llYXIgPSBHRVRfWUVBUihzZWxmKSAtIDE5MDA7Ci0gICAgICAgIHRpbWUudG1fbW9uID0gR0VUX01PTlRIKHNlbGYpIC0gMTsKLSAgICAgICAgdGltZS50bV9tZGF5ID0gR0VUX0RBWShzZWxmKTsKLSAgICAgICAgdGltZS50bV9ob3VyID0gREFURV9HRVRfSE9VUihzZWxmKTsKLSAgICAgICAgdGltZS50bV9taW4gPSBEQVRFX0dFVF9NSU5VVEUoc2VsZik7Ci0gICAgICAgIHRpbWUudG1fc2VjID0gREFURV9HRVRfU0VDT05EKHNlbGYpOwotICAgICAgICB0aW1lLnRtX3dkYXkgPSAtMTsKLSAgICAgICAgdGltZS50bV9pc2RzdCA9IC0xOwotICAgICAgICB0aW1lc3RhbXAgPSBta3RpbWUoJnRpbWUpOwotICAgICAgICBpZiAodGltZXN0YW1wID09ICh0aW1lX3QpKC0xKQotI2lmbmRlZiBfQUlYCi0gICAgICAgICAgICAvKiBSZXR1cm4gdmFsdWUgb2YgLTEgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiBhbiBlcnJvciwKLSAgICAgICAgICAgICAqIGJ1dCB0bV93ZGF5IGNhbm5vdCByZW1haW4gc2V0IHRvIC0xIGlmIG1rdGltZSBzdWNjZWVkZWQuICovCi0gICAgICAgICAgICAmJiB0aW1lLnRtX3dkYXkgPT0gLTEKLSNlbHNlCi0gICAgICAgICAgICAvKiBvbiBBSVgsIHRtX3dkYXkgaXMgYWx3YXlzIHNldHMsIGV2ZW4gb24gZXJyb3IgKi8KLSNlbmRpZgotICAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgbG9uZyBsb25nIHNlY29uZHM7CisgICAgICAgIHNlY29uZHMgPSBsb2NhbF90b19zZWNvbmRzKEdFVF9ZRUFSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9GT0xEKHNlbGYpKTsKKyAgICAgICAgaWYgKHNlY29uZHMgPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUodGltZXN0YW1wICsgREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZikgLyAxZTYpOworICAgICAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoc2Vjb25kcyAtIEVQT0NIX1NFQ09ORFMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZikgLyAxZTYpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtNDk1Niw3ICs1MzUxLDggQEAKICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKHNlbGYpLAogICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCiAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfRk9MRChzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00OTY2LDcgKzUzNjIsOCBAQAogICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCiAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgIEdFVF9EVF9UWklORk8oc2VsZikpOworICAgICAgICAgICAgICAgICAgICBHRVRfRFRfVFpJTkZPKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9GT0xEKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTUwMTgsNyArNTQxNSw3IEBACiAgKiBfX2dldHN0YXRlX18gaXNuJ3QgZXhwb3NlZC4KICAqLwogc3RhdGljIFB5T2JqZWN0ICoKLWRhdGV0aW1lX2dldHN0YXRlKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYpCitkYXRldGltZV9nZXRzdGF0ZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBpbnQgcHJvdG8pCiB7CiAgICAgUHlPYmplY3QgKmJhc2VzdGF0ZTsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKQEAgLTUwMjYsNiArNTQyMyw5IEBACiAgICAgYmFzZXN0YXRlID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkUpOwogICAgIGlmIChiYXNlc3RhdGUgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJvdG8gPiAzICYmIERBVEVfR0VUX0ZPTEQoc2VsZikpCisgICAgICAgICAgICAvKiBTZXQgdGhlIGZpcnN0IGJpdCBvZiB0aGUgdGhpcmQgYnl0ZSAqLworICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoYmFzZXN0YXRlKVsyXSB8PSAoMSA8PCA3KTsKICAgICAgICAgaWYgKCEgSEFTVFpJTkZPKHNlbGYpIHx8IHNlbGYtPnR6aW5mbyA9PSBQeV9Ob25lKQogICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDEsIGJhc2VzdGF0ZSk7CiAgICAgICAgIGVsc2UKQEAgLTUwMzYsOSArNTQzNiwxMyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZGF0ZXRpbWVfcmVkdWNlKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmcpCitkYXRldGltZV9yZWR1Y2UoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPTikiLCBQeV9UWVBFKHNlbGYpLCBkYXRldGltZV9nZXRzdGF0ZShzZWxmKSk7CisgICAgaW50IHByb3RvID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOl9fcmVkdWNlX2V4X18iLCAmcHJvdG8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgZGF0ZXRpbWVfZ2V0c3RhdGUoc2VsZiwgcHJvdG8pKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGRhdGV0aW1lX21ldGhvZHNbXSA9IHsKQEAgLTUwOTMsOSArNTQ5NywxMiBAQAogCiAgICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbilkYXRldGltZV9pc29mb3JtYXQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCiAgICAgIFB5RG9jX1NUUigiW3NlcF0gLT4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgIgotICAgICAgICAgICAgICAgIllZWVktTU0tRERUSEg6TU06U1NbLm1tbW1tbV1bK0hIOk1NXS5cblxuIgorICAgICAgICAgICAgICAgIllZWVktTU0tRERUW0hIWzpNTVs6U1NbLm1tbVt1dXVdXV1dXVsrSEg6TU1dLlxuIgogICAgICAgICAgICAgICAgInNlcCBpcyB1c2VkIHRvIHNlcGFyYXRlIHRoZSB5ZWFyIGZyb20gdGhlIHRpbWUsIGFuZCAiCi0gICAgICAgICAgICAgICAiZGVmYXVsdHMgdG8gJ1QnLiIpfSwKKyAgICAgICAgICAgICAgICJkZWZhdWx0cyB0byAnVCcuXG4iCisgICAgICAgICAgICAgICAidGltZXNwZWMgc3BlY2lmaWVzIHdoYXQgY29tcG9uZW50cyBvZiB0aGUgdGltZSB0byBpbmNsdWRlIgorICAgICAgICAgICAgICAgIiAoYWxsb3dlZCB2YWx1ZXMgYXJlICdhdXRvJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcycsIgorICAgICAgICAgICAgICAgIiAnbWlsbGlzZWNvbmRzJywgYW5kICdtaWNyb3NlY29uZHMnKS5cbiIpfSwKIAogICAgIHsidXRjb2Zmc2V0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3V0Y29mZnNldCwgTUVUSF9OT0FSR1MsCiAgICAgIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLnV0Y29mZnNldChzZWxmKS4iKX0sCkBAIC01MTEyLDEzICs1NTE5LDEzIEBACiAgICAgeyJhc3RpbWV6b25lIiwgIChQeUNGdW5jdGlvbilkYXRldGltZV9hc3RpbWV6b25lLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAogICAgICBQeURvY19TVFIoInR6IC0+IGNvbnZlcnQgdG8gbG9jYWwgdGltZSBpbiBuZXcgdGltZXpvbmUgdHpcbiIpfSwKIAotICAgIHsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilkYXRldGltZV9yZWR1Y2UsICAgICBNRVRIX05PQVJHUywKLSAgICAgUHlEb2NfU1RSKCJfX3JlZHVjZV9fKCkgLT4gKGNscywgc3RhdGUpIil9LAorICAgIHsiX19yZWR1Y2VfZXhfXyIsIChQeUNGdW5jdGlvbilkYXRldGltZV9yZWR1Y2UsICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIFB5RG9jX1NUUigiX19yZWR1Y2VfZXhfXyhwcm90bykgLT4gKGNscywgc3RhdGUpIil9LAogCiAgICAge05VTEwsICAgICAgTlVMTH0KIH07CiAKLXN0YXRpYyBjaGFyIGRhdGV0aW1lX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGRhdGV0aW1lX2RvY1tdID0KIFB5RG9jX1NUUigiZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheVssIGhvdXJbLCBtaW51dGVbLCBzZWNvbmRbLCBtaWNyb3NlY29uZFssdHppbmZvXV1dXV0pXG5cCiBcblwKIFRoZSB5ZWFyLCBtb250aCBhbmQgZGF5IGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQuIHR6aW5mbyBtYXkgYmUgTm9uZSwgb3IgYW5cblwKQEAgLTUyMDEsNyArNTYwOCw5IEBACiAgICAgbmV3X3RpbWVfZXgsCiAgICAgbmV3X2RlbHRhX2V4LAogICAgIGRhdGV0aW1lX2Zyb210aW1lc3RhbXAsCi0gICAgZGF0ZV9mcm9tdGltZXN0YW1wCisgICAgZGF0ZV9mcm9tdGltZXN0YW1wLAorICAgIG5ld19kYXRldGltZV9leDIsCisgICAgbmV3X3RpbWVfZXgyCiB9OwogCiAKQEAgLTUyODIsMTIgKzU2OTEsMTIgQEAKICAgICAvKiB0aW1lIHZhbHVlcyAqLwogICAgIGQgPSBQeURhdGVUaW1lX1RpbWVUeXBlLnRwX2RpY3Q7CiAKLSAgICB4ID0gbmV3X3RpbWUoMCwgMCwgMCwgMCwgUHlfTm9uZSk7CisgICAgeCA9IG5ld190aW1lKDAsIDAsIDAsIDAsIFB5X05vbmUsIDApOwogICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfREVDUkVGKHgpOwogCi0gICAgeCA9IG5ld190aW1lKDIzLCA1OSwgNTksIDk5OTk5OSwgUHlfTm9uZSk7CisgICAgeCA9IG5ld190aW1lKDIzLCA1OSwgNTksIDk5OTk5OSwgUHlfTm9uZSwgMCk7CiAgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWF4IiwgeCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9ERUNSRUYoeCk7CkBAIC01MzAwLDEyICs1NzA5LDEyIEBACiAgICAgLyogZGF0ZXRpbWUgdmFsdWVzICovCiAgICAgZCA9IFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlLnRwX2RpY3Q7CiAKLSAgICB4ID0gbmV3X2RhdGV0aW1lKDEsIDEsIDEsIDAsIDAsIDAsIDAsIFB5X05vbmUpOworICAgIHggPSBuZXdfZGF0ZXRpbWUoMSwgMSwgMSwgMCwgMCwgMCwgMCwgUHlfTm9uZSwgMCk7CiAgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWluIiwgeCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9ERUNSRUYoeCk7CiAKLSAgICB4ID0gbmV3X2RhdGV0aW1lKE1BWFlFQVIsIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5OTk5LCBQeV9Ob25lKTsKKyAgICB4ID0gbmV3X2RhdGV0aW1lKE1BWFlFQVIsIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5OTk5LCBQeV9Ob25lLCAwKTsKICAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtYXgiLCB4KSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X0RFQ1JFRih4KTsKQEAgLTUzNDcsNyArNTc1Niw3IEBACiAKICAgICAvKiBFcG9jaCAqLwogICAgIFB5RGF0ZVRpbWVfRXBvY2ggPSBuZXdfZGF0ZXRpbWUoMTk3MCwgMSwgMSwgMCwgMCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RGF0ZVRpbWVfVGltZVpvbmVfVVRDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RGF0ZVRpbWVfVGltZVpvbmVfVVRDLCAwKTsKICAgICBpZiAoUHlEYXRlVGltZV9FcG9jaCA9PSBOVUxMKQogICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTUzODIsMTkgKzU3OTEsMTkgQEAKICAgICAvKiBBIDQteWVhciBjeWNsZSBoYXMgYW4gZXh0cmEgbGVhcCBkYXkgb3ZlciB3aGF0IHdlJ2QgZ2V0IGZyb20KICAgICAgKiBwYXN0aW5nIHRvZ2V0aGVyIDQgc2luZ2xlIHllYXJzLgogICAgICAqLwotICAgIGFzc2VydChESTRZID09IDQgKiAzNjUgKyAxKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoREk0WSA9PSA0ICogMzY1ICsgMSk7CiAgICAgYXNzZXJ0KERJNFkgPT0gZGF5c19iZWZvcmVfeWVhcig0KzEpKTsKIAogICAgIC8qIFNpbWlsYXJseSwgYSA0MDAteWVhciBjeWNsZSBoYXMgYW4gZXh0cmEgbGVhcCBkYXkgb3ZlciB3aGF0IHdlJ2QKICAgICAgKiBnZXQgZnJvbSBwYXN0aW5nIHRvZ2V0aGVyIDQgMTAwLXllYXIgY3ljbGVzLgogICAgICAqLwotICAgIGFzc2VydChESTQwMFkgPT0gNCAqIERJMTAwWSArIDEpOworICAgIFB5X0JVSUxEX0FTU0VSVChESTQwMFkgPT0gNCAqIERJMTAwWSArIDEpOwogICAgIGFzc2VydChESTQwMFkgPT0gZGF5c19iZWZvcmVfeWVhcig0MDArMSkpOwogCiAgICAgLyogT1RPSCwgYSAxMDAteWVhciBjeWNsZSBoYXMgb25lIGZld2VyIGxlYXAgZGF5IHRoYW4gd2UnZCBnZXQgZnJvbQogICAgICAqIHBhc3RpbmcgdG9nZXRoZXIgMjUgNC15ZWFyIGN5Y2xlcy4KICAgICAgKi8KLSAgICBhc3NlcnQoREkxMDBZID09IDI1ICogREk0WSAtIDEpOworICAgIFB5X0JVSUxEX0FTU0VSVChESTEwMFkgPT0gMjUgKiBESTRZIC0gMSk7CiAgICAgYXNzZXJ0KERJMTAwWSA9PSBkYXlzX2JlZm9yZV95ZWFyKDEwMCsxKSk7CiAKICAgICBvbmUgPSBQeUxvbmdfRnJvbUxvbmcoMSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kYm1tb2R1bGUuYyBiL01vZHVsZXMvX2RibW1vZHVsZS5jCmluZGV4IGVhODc5MGIuLjgwNDk3OGEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RibW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2RibW1vZHVsZS5jCkBAIC0xNCwxNiArMTQsMTYgQEAKICAqLwogI2lmIGRlZmluZWQoSEFWRV9OREJNX0gpCiAjaW5jbHVkZSA8bmRibS5oPgotc3RhdGljIGNoYXIgKndoaWNoX2RibSA9ICJHTlUgZ2RibSI7ICAvKiBFTVggcG9ydCBvZiBHREJNICovCitzdGF0aWMgY29uc3QgY2hhciB3aGljaF9kYm1bXSA9ICJHTlUgZ2RibSI7ICAvKiBFTVggcG9ydCBvZiBHREJNICovCiAjZWxpZiBkZWZpbmVkKEhBVkVfR0RCTV9OREJNX0gpCiAjaW5jbHVkZSA8Z2RibS9uZGJtLmg+Ci1zdGF0aWMgY2hhciAqd2hpY2hfZGJtID0gIkdOVSBnZGJtIjsKK3N0YXRpYyBjb25zdCBjaGFyIHdoaWNoX2RibVtdID0gIkdOVSBnZGJtIjsKICNlbGlmIGRlZmluZWQoSEFWRV9HREJNX0RBU0hfTkRCTV9IKQogI2luY2x1ZGUgPGdkYm0tbmRibS5oPgotc3RhdGljIGNoYXIgKndoaWNoX2RibSA9ICJHTlUgZ2RibSI7CitzdGF0aWMgY29uc3QgY2hhciB3aGljaF9kYm1bXSA9ICJHTlUgZ2RibSI7CiAjZWxpZiBkZWZpbmVkKEhBVkVfQkVSS0RCX0gpCiAjaW5jbHVkZSA8ZGIuaD4KLXN0YXRpYyBjaGFyICp3aGljaF9kYm0gPSAiQmVya2VsZXkgREIiOworc3RhdGljIGNvbnN0IGNoYXIgd2hpY2hfZGJtW10gPSAiQmVya2VsZXkgREIiOwogI2Vsc2UKICNlcnJvciAiTm8gbmRibS5oIGF2YWlsYWJsZSEiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvX2RlY2ltYWwuYyBiL01vZHVsZXMvX2RlY2ltYWwvX2RlY2ltYWwuYwppbmRleCBlMTU5NDFhLi4zYmE4ZTM1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL19kZWNpbWFsLmMKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9fZGVjaW1hbC5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlICJkb2NzdHJpbmdzLmgiCi0jaW5jbHVkZSAibWVtb3J5LmgiCiAKIAogI2lmICFkZWZpbmVkKE1QRF9WRVJTSU9OX0hFWCkgfHwgTVBEX1ZFUlNJT05fSEVYIDwgMHgwMjA0MDEwMApAQCAtMzM5NCw2ICszMzkzLDEwNSBAQAogICAgIHJldHVybiAoUHlPYmplY3QgKikgcHlsb25nOwogfQogCisvKiBDb252ZXJ0IGEgRGVjaW1hbCB0byBpdHMgZXhhY3QgaW50ZWdlciByYXRpbyByZXByZXNlbnRhdGlvbi4gKi8KK3N0YXRpYyBQeU9iamVjdCAqCitkZWNfYXNfaW50ZWdlcl9yYXRpbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MgVU5VU0VEKQoreworICAgIFB5T2JqZWN0ICpudW1lcmF0b3IgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkZW5vbWluYXRvciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmV4cG9uZW50ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdG1wOworICAgIG1wZF9zc2l6ZV90IGV4cDsKKyAgICBQeU9iamVjdCAqY29udGV4dDsKKyAgICB1aW50MzJfdCBzdGF0dXMgPSAwOworCisgICAgaWYgKG1wZF9pc3NwZWNpYWwoTVBEKHNlbGYpKSkgeworICAgICAgICBpZiAobXBkX2lzbmFuKE1QRChzZWxmKSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBOYU4gdG8gaW50ZWdlciByYXRpbyIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIGludGVnZXIgcmF0aW8iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBDVVJSRU5UX0NPTlRFWFQoY29udGV4dCk7CisKKyAgICB0bXAgPSBkZWNfYWxsb2MoKTsKKyAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFtcGRfcWNvcHkoTVBEKHRtcCksIE1QRChzZWxmKSwgJnN0YXR1cykpIHsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGV4cCA9IG1wZF9pc3plcm8oTVBEKHRtcCkpID8gMCA6IE1QRCh0bXApLT5leHA7CisgICAgTVBEKHRtcCktPmV4cCA9IDA7CisKKyAgICAvKiBjb250ZXh0IGFuZCByb3VuZGluZyBhcmUgdW51c2VkIGhlcmU6IHRoZSBjb252ZXJzaW9uIGlzIGV4YWN0ICovCisgICAgbnVtZXJhdG9yID0gZGVjX2FzX2xvbmcodG1wLCBjb250ZXh0LCBNUERfUk9VTkRfRkxPT1IpOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGV4cG9uZW50ID0gUHlMb25nX0Zyb21Tc2l6ZV90KGV4cCA8IDAgPyAtZXhwIDogZXhwKTsKKyAgICBpZiAoZXhwb25lbnQgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHRtcCA9IFB5TG9uZ19Gcm9tTG9uZygxMCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgUHlfU0VUUkVGKGV4cG9uZW50LCBfcHlfbG9uZ19wb3dlcih0bXAsIGV4cG9uZW50LCBQeV9Ob25lKSk7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgaWYgKGV4cG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoZXhwID49IDApIHsKKyAgICAgICAgUHlfU0VUUkVGKG51bWVyYXRvciwgX3B5X2xvbmdfbXVsdGlwbHkobnVtZXJhdG9yLCBleHBvbmVudCkpOworICAgICAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZGVub21pbmF0b3IgPSBQeUxvbmdfRnJvbUxvbmcoMSk7CisgICAgICAgIGlmIChkZW5vbWluYXRvciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkZW5vbWluYXRvciA9IGV4cG9uZW50OworICAgICAgICBleHBvbmVudCA9IE5VTEw7CisgICAgICAgIHRtcCA9IF9QeUxvbmdfR0NEKG51bWVyYXRvciwgZGVub21pbmF0b3IpOworICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlfU0VUUkVGKG51bWVyYXRvciwgX3B5X2xvbmdfZmxvb3JfZGl2aWRlKG51bWVyYXRvciwgdG1wKSk7CisgICAgICAgIFB5X1NFVFJFRihkZW5vbWluYXRvciwgX3B5X2xvbmdfZmxvb3JfZGl2aWRlKGRlbm9taW5hdG9yLCB0bXApKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCB8fCBkZW5vbWluYXRvciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOworCisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYoZXhwb25lbnQpOworICAgIFB5X1hERUNSRUYoZGVub21pbmF0b3IpOworICAgIFB5X1hERUNSRUYobnVtZXJhdG9yKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBzdGF0aWMgUHlPYmplY3QgKgogUHlEZWNfVG9JbnRlZ3JhbFZhbHVlKFB5T2JqZWN0ICpkZWMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKQEAgLTQ3MDIsNiArNDgwMCw3IEBACiAgIC8qIE1pc2NlbGxhbmVvdXMgKi8KICAgeyAiZnJvbV9mbG9hdCIsIGRlY19mcm9tX2Zsb2F0LCBNRVRIX098TUVUSF9DTEFTUywgZG9jX2Zyb21fZmxvYXQgfSwKICAgeyAiYXNfdHVwbGUiLCBQeURlY19Bc1R1cGxlLCBNRVRIX05PQVJHUywgZG9jX2FzX3R1cGxlIH0sCisgIHsgImFzX2ludGVnZXJfcmF0aW8iLCBkZWNfYXNfaW50ZWdlcl9yYXRpbywgTUVUSF9OT0FSR1MsIGRvY19hc19pbnRlZ2VyX3JhdGlvIH0sCiAKICAgLyogU3BlY2lhbCBtZXRob2RzICovCiAgIHsgIl9fY29weV9fIiwgZGVjX2NvcHksIE1FVEhfTk9BUkdTLCBOVUxMIH0sCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL2RvY3N0cmluZ3MuaCBiL01vZHVsZXMvX2RlY2ltYWwvZG9jc3RyaW5ncy5oCmluZGV4IDcxMDI5YTkuLmY3ZmQ2ZTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvZG9jc3RyaW5ncy5oCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvZG9jc3RyaW5ncy5oCkBAIC03MCw2ICs3MCwxNSBAQAogUmV0dXJuIGEgdHVwbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlci5cblwKIFxuIik7CiAKK1B5RG9jX1NUUlZBUihkb2NfYXNfaW50ZWdlcl9yYXRpbywKKyJhc19pbnRlZ2VyX3JhdGlvKCRzZWxmLCAvKVxuLS1cblxuXAorRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvKCkgLT4gKGludCwgaW50KVxuXAorXG5cCitSZXR1cm4gYSBwYWlyIG9mIGludGVnZXJzLCB3aG9zZSByYXRpbyBpcyBleGFjdGx5IGVxdWFsIHRvIHRoZSBvcmlnaW5hbFxuXAorRGVjaW1hbCBhbmQgd2l0aCBhIHBvc2l0aXZlIGRlbm9taW5hdG9yLiBUaGUgcmF0aW8gaXMgaW4gbG93ZXN0IHRlcm1zLlxuXAorUmFpc2UgT3ZlcmZsb3dFcnJvciBvbiBpbmZpbml0aWVzIGFuZCBhIFZhbHVlRXJyb3Igb24gTmFOcy5cblwKK1xuIik7CisKIFB5RG9jX1NUUlZBUihkb2NfY2Fub25pY2FsLAogImNhbm9uaWNhbCgkc2VsZiwgLylcbi0tXG5cblwKIFJldHVybiB0aGUgY2Fub25pY2FsIGVuY29kaW5nIG9mIHRoZSBhcmd1bWVudC4gIEN1cnJlbnRseSwgdGhlIGVuY29kaW5nXG5cCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL2Jhc2Vhcml0aC5jIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9iYXNlYXJpdGguYwppbmRleCAzNWRlNmI4Li5kZmUxNTIzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL2Jhc2Vhcml0aC5jCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvYmFzZWFyaXRoLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlICJjb25zdGFudHMuaCIKLSNpbmNsdWRlICJtZW1vcnkuaCIKICNpbmNsdWRlICJ0eXBlYXJpdGguaCIKICNpbmNsdWRlICJiYXNlYXJpdGguaCIKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9pby5jIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9pby5jCmluZGV4IGE0NWE0MjkuLjNhYWRmYjAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvaW8uYworKysgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL2lvLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsb2NhbGUuaD4KICNpbmNsdWRlICJiaXRzLmgiCiAjaW5jbHVkZSAiY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAibWVtb3J5LmgiCiAjaW5jbHVkZSAidHlwZWFyaXRoLmgiCiAjaW5jbHVkZSAiaW8uaCIKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tZW1vcnkuYyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmMKaW5kZXggMGY0MWZlNS4uYTg1NGUwOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tZW1vcnkuYworKysgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21lbW9yeS5jCkBAIC0zMCw3ICszMCwxMiBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAidHlwZWFyaXRoLmgiCi0jaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAibXBhbGxvYy5oIgorCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQyMzIpCisjZW5kaWYKIAogCiAvKiBHdWFyYW50ZWVkIG1pbmltdW0gYWxsb2NhdGlvbiBmb3IgYSBjb2VmZmljaWVudC4gTWF5IGJlIGNoYW5nZWQgb25jZQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tZW1vcnkuaCBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBhbGxvYy5oCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIE1vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmgKcmVuYW1lIHRvIE1vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBhbGxvYy5oCmluZGV4IDljOThkMWEuLmVmZDcxMTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmgKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGFsbG9jLmgKQEAgLTI2LDggKzI2LDggQEAKICAqLwogCiAKLSNpZm5kZWYgTUVNT1JZX0gKLSNkZWZpbmUgTUVNT1JZX0gKKyNpZm5kZWYgTVBBTExPQ19ICisjZGVmaW5lIE1QQUxMT0NfSAogCiAKICNpbmNsdWRlICJtcGRlY2ltYWwuaCIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmMgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5jCmluZGV4IDU5M2Y5ZjUuLjMyOGFiOTIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmMKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGRlY2ltYWwuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgImJpdHMuaCIKICNpbmNsdWRlICJjb252b2x1dGUuaCIKICNpbmNsdWRlICJjcnQuaCIKLSNpbmNsdWRlICJtZW1vcnkuaCIKKyNpbmNsdWRlICJtcGFsbG9jLmgiCiAjaW5jbHVkZSAidHlwZWFyaXRoLmgiCiAjaW5jbHVkZSAidW1vZGFyaXRoLmgiCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmggYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5oCmluZGV4IDVjYTc0MTMuLmRhZjJiOWQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmgKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGRlY2ltYWwuaApAQCAtNDgsNiArNDgsOCBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpZmRlZiBfTVNDX1ZFUgogICAjaW5jbHVkZSAidmNjb21wYXQuaCIKQEAgLTU5LDEyICs2MSw2IEBACiAgICNkZWZpbmUgTVBEX0hJREVfU1lNQk9MU19FTkQKICAgI2RlZmluZSBFWFRJTkxJTkUgZXh0ZXJuIGlubGluZQogI2Vsc2UKLSAgI2lmZGVmIEhBVkVfU1RESU5UX0gKLSAgICAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0gICNlbmRpZgotICAjaWZkZWYgSEFWRV9JTlRUWVBFU19ICi0gICAgI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0gICNlbmRpZgogICAjaWZuZGVmIF9fR05VQ19TVERDX0lOTElORV9fCiAgICAgI2RlZmluZSBfX0dOVUNfU1REQ19JTkxJTkVfXyAxCiAgICNlbmRpZgpAQCAtMTA4LDkgKzEwNCw5IEBACiAKICNkZWZpbmUgTVBEX01BSk9SX1ZFUlNJT04gMgogI2RlZmluZSBNUERfTUlOT1JfVkVSU0lPTiA0Ci0jZGVmaW5lIE1QRF9NSUNST19WRVJTSU9OIDEKKyNkZWZpbmUgTVBEX01JQ1JPX1ZFUlNJT04gMgogCi0jZGVmaW5lIE1QRF9WRVJTSU9OICIyLjQuMSIKKyNkZWZpbmUgTVBEX1ZFUlNJT04gIjIuNC4yIgogCiAjZGVmaW5lIE1QRF9WRVJTSU9OX0hFWCAoKE1QRF9NQUpPUl9WRVJTSU9OIDw8IDI0KSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAoTVBEX01JTk9SX1ZFUlNJT04gPDwgMTYpIHwgXApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy92Y2NvbXBhdC5oIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy92Y2NvbXBhdC5oCmluZGV4IGY1OGUwMjMuLmRkMTMxZDggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvdmNjb21wYXQuaAorKysgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL3ZjY29tcGF0LmgKQEAgLTMyLDcgKzMyLDYgQEAKIAogLyogVmlzdWFsIEMgZml4ZXM6IG5vIHN0ZGludC5oLCBubyBzbnByaW50ZiAuLi4gKi8KICNpZmRlZiBfTVNDX1ZFUgotICAjaW5jbHVkZSAidmNzdGRpbnQuaCIKICAgI3VuZGVmIGlubGluZQogICAjZGVmaW5lIGlubGluZSBfX2lubGluZQogICAjdW5kZWYgcmFuZG9tCkBAIC00OSwxMCArNDgsNiBAQAogICAjdW5kZWYgc3RydG9sbAogICAjZGVmaW5lIHN0cnRvbGwgX3N0cnRvaTY0CiAgICNkZWZpbmUgc3RyZHVwIF9zdHJkdXAKLSAgI2RlZmluZSBQUklpNjQgIkk2NGkiCi0gICNkZWZpbmUgUFJJdTY0ICJJNjR1IgotICAjZGVmaW5lIFBSSWkzMiAiSTMyaSIKLSAgI2RlZmluZSBQUkl1MzIgIkkzMnUiCiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL3Rlc3RzL2RlY2NoZWNrLnB5IGIvTW9kdWxlcy9fZGVjaW1hbC90ZXN0cy9kZWNjaGVjay5weQppbmRleCBhYjdkNWJkLi5mOTA3NTMxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL3Rlc3RzL2RlY2NoZWNrLnB5CisrKyBiL01vZHVsZXMvX2RlY2ltYWwvdGVzdHMvZGVjY2hlY2sucHkKQEAgLTUwLDggKzUwLDggQEAKICAgICAgICAgJ19fYWJzX18nLCAnX19ib29sX18nLCAnX19jZWlsX18nLCAnX19jb21wbGV4X18nLCAnX19jb3B5X18nLAogICAgICAgICAnX19mbG9vcl9fJywgJ19fZmxvYXRfXycsICdfX2hhc2hfXycsICdfX2ludF9fJywgJ19fbmVnX18nLAogICAgICAgICAnX19wb3NfXycsICdfX3JlZHVjZV9fJywgJ19fcmVwcl9fJywgJ19fc3RyX18nLCAnX190cnVuY19fJywKLSAgICAgICAgJ2FkanVzdGVkJywgJ2FzX3R1cGxlJywgJ2Nhbm9uaWNhbCcsICdjb25qdWdhdGUnLCAnY29weV9hYnMnLAotICAgICAgICAnY29weV9uZWdhdGUnLCAnaXNfY2Fub25pY2FsJywgJ2lzX2Zpbml0ZScsICdpc19pbmZpbml0ZScsCisgICAgICAgICdhZGp1c3RlZCcsICdhc19pbnRlZ2VyX3JhdGlvJywgJ2FzX3R1cGxlJywgJ2Nhbm9uaWNhbCcsICdjb25qdWdhdGUnLAorICAgICAgICAnY29weV9hYnMnLCAnY29weV9uZWdhdGUnLCAnaXNfY2Fub25pY2FsJywgJ2lzX2Zpbml0ZScsICdpc19pbmZpbml0ZScsCiAgICAgICAgICdpc19uYW4nLCAnaXNfcW5hbicsICdpc19zaWduZWQnLCAnaXNfc25hbicsICdpc196ZXJvJywgJ3JhZGl4JwogICAgICksCiAgICAgIyBVbmFyeSB3aXRoIG9wdGlvbmFsIGNvbnRleHQ6CkBAIC0xMjgsNyArMTI4LDcgQEAKICMgRnVuY3Rpb25zIHRoYXQgcmVxdWlyZSBhIHJlc3RyaWN0ZWQgZXhwb25lbnQgcmFuZ2UgZm9yIHJlYXNvbmFibGUgcnVudGltZXMuCiBVbmFyeVJlc3RyaWN0ZWQgPSBbCiAgICdfX2NlaWxfXycsICdfX2Zsb29yX18nLCAnX19pbnRfXycsICdfX3RydW5jX18nLAotICAndG9faW50ZWdyYWwnLCAndG9faW50ZWdyYWxfdmFsdWUnCisgICdhc19pbnRlZ2VyX3JhdGlvJywgJ3RvX2ludGVncmFsJywgJ3RvX2ludGVncmFsX3ZhbHVlJwogXQogCiBCaW5hcnlSZXN0cmljdGVkID0gWydfX3JvdW5kX18nXQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZWxlbWVudHRyZWUuYyBiL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKaW5kZXggODVmZmNhMi4uZGQ4NDE3YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZWxlbWVudHRyZWUuYworKysgYi9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCkBAIC01Nyw5ICs1Nyw5IEBACiAgICB0aGF0IGFsbCB1c2Ugb2YgdGV4dCBhbmQgdGFpbCBhcyBvYmplY3QgcG9pbnRlcnMgbXVzdCBiZSB3cmFwcGVkIGluCiAgICBKT0lOX09CSi4gIHNlZSBjb21tZW50cyBpbiB0aGUgRWxlbWVudE9iamVjdCBkZWZpbml0aW9uIGZvciBtb3JlCiAgICBpbmZvLiAqLwotI2RlZmluZSBKT0lOX0dFVChwKSAoKFB5X3VpbnRwdHJfdCkgKHApICYgMSkKLSNkZWZpbmUgSk9JTl9TRVQocCwgZmxhZykgKCh2b2lkKikgKChQeV91aW50cHRyX3QpIChKT0lOX09CSihwKSkgfCAoZmxhZykpKQotI2RlZmluZSBKT0lOX09CSihwKSAoKFB5T2JqZWN0KikgKChQeV91aW50cHRyX3QpIChwKSAmIH4oUHlfdWludHB0cl90KTEpKQorI2RlZmluZSBKT0lOX0dFVChwKSAoKHVpbnRwdHJfdCkgKHApICYgMSkKKyNkZWZpbmUgSk9JTl9TRVQocCwgZmxhZykgKCh2b2lkKikgKCh1aW50cHRyX3QpIChKT0lOX09CSihwKSkgfCAoZmxhZykpKQorI2RlZmluZSBKT0lOX09CSihwKSAoKFB5T2JqZWN0KikgKCh1aW50cHRyX3QpIChwKSAmIH4odWludHB0cl90KTEpKQogCiAvKiBQeV9DTEVBUiBmb3IgYSBQeU9iamVjdCogdGhhdCB1c2VzIGEgam9pbiBmbGFnLiBQYXNzIHRoZSBwb2ludGVyIGJ5CiAgKiByZWZlcmVuY2Ugc2luY2UgdGhpcyBmdW5jdGlvbiBzZXRzIGl0IHRvIE5VTEwuCkBAIC0xMjksMzAgKzEyOSw2IEBACiAvKiBoZWxwZXJzICovCiAKIExPQ0FMKFB5T2JqZWN0KikKLWRlZXBjb3B5KFB5T2JqZWN0KiBvYmplY3QsIFB5T2JqZWN0KiBtZW1vKQotewotICAgIC8qIGRvIGEgZGVlcCBjb3B5IG9mIHRoZSBnaXZlbiBvYmplY3QgKi8KLSAgICBQeU9iamVjdCogYXJnczsKLSAgICBQeU9iamVjdCogcmVzdWx0OwotICAgIGVsZW1lbnR0cmVlc3RhdGUgKnN0ID0gRVRfU1RBVEVfR0xPQkFMOwotCi0gICAgaWYgKCFzdC0+ZGVlcGNvcHlfb2JqKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZygKLSAgICAgICAgICAgIFB5RXhjX1J1bnRpbWVFcnJvciwKLSAgICAgICAgICAgICJkZWVwY29weSBoZWxwZXIgbm90IGZvdW5kIgotICAgICAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgYXJncyA9IFB5VHVwbGVfUGFjaygyLCBvYmplY3QsIG1lbW8pOwotICAgIGlmICghYXJncykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChzdC0+ZGVlcGNvcHlfb2JqLCBhcmdzKTsKLSAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTE9DQUwoUHlPYmplY3QqKQogbGlzdF9qb2luKFB5T2JqZWN0KiBsaXN0KQogewogICAgIC8qIGpvaW4gbGlzdCBlbGVtZW50cyAoZGVzdHJveWluZyB0aGUgbGlzdCBpbiB0aGUgcHJvY2VzcykgKi8KQEAgLTQyMCwxMCArMzk2LDggQEAKICAgICBQeV9YREVDUkVGKGF0dHJpYik7CiAKICAgICAvKiBSZXBsYWNlIHRoZSBvYmplY3RzIGFscmVhZHkgcG9pbnRlZCB0byBieSB0YWcsIHRleHQgYW5kIHRhaWwuICovCi0gICAgdG1wID0gc2VsZl9lbGVtLT50YWc7CiAgICAgUHlfSU5DUkVGKHRhZyk7Ci0gICAgc2VsZl9lbGVtLT50YWcgPSB0YWc7Ci0gICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihzZWxmX2VsZW0tPnRhZywgdGFnKTsKIAogICAgIHRtcCA9IHNlbGZfZWxlbS0+dGV4dDsKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC03NDgsNiArNzIyLDkgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0KikgZWxlbWVudDsKIH0KIAorLyogSGVscGVyIGZvciBhIGRlZXAgY29weS4gKi8KK0xPQ0FMKFB5T2JqZWN0ICopIGRlZXBjb3B5KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCiAvKltjbGluaWMgaW5wdXRdCiBfZWxlbWVudHRyZWUuRWxlbWVudC5fX2RlZXBjb3B5X18KIApAQCAtODIwLDcgKzc5Nyw3IEBACiAgICAgfQogCiAgICAgLyogYWRkIG9iamVjdCB0byBtZW1vIGRpY3Rpb25hcnkgKHNvIGRlZXBjb3B5IHdvbid0IHZpc2l0IGl0IGFnYWluKSAqLwotICAgIGlkID0gUHlMb25nX0Zyb21Tc2l6ZV90KChQeV91aW50cHRyX3QpIHNlbGYpOworICAgIGlkID0gUHlMb25nX0Zyb21Tc2l6ZV90KCh1aW50cHRyX3QpIHNlbGYpOwogICAgIGlmICghaWQpCiAgICAgICAgIGdvdG8gZXJyb3I7CiAKQEAgLTgzOCw2ICs4MTUsNTMgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorTE9DQUwoUHlPYmplY3QgKikKK2RlZXBjb3B5KFB5T2JqZWN0ICpvYmplY3QsIFB5T2JqZWN0ICptZW1vKQoreworICAgIC8qIGRvIGEgZGVlcCBjb3B5IG9mIHRoZSBnaXZlbiBvYmplY3QgKi8KKyAgICBlbGVtZW50dHJlZXN0YXRlICpzdDsKKyAgICBQeU9iamVjdCAqc3RhY2tbMl07CisKKyAgICAvKiBGYXN0IHBhdGhzICovCisgICAgaWYgKG9iamVjdCA9PSBQeV9Ob25lIHx8IFB5VW5pY29kZV9DaGVja0V4YWN0KG9iamVjdCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKG9iamVjdCk7CisgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorCisgICAgaWYgKFB5X1JFRkNOVChvYmplY3QpID09IDEpIHsKKyAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG9iamVjdCkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgICAgIGludCBzaW1wbGUgPSAxOworICAgICAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KG9iamVjdCwgJnBvcywgJmtleSwgJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fCAhUHlVbmljb2RlX0NoZWNrRXhhY3QodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNpbXBsZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaW1wbGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RGljdF9Db3B5KG9iamVjdCk7CisgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gZ2VuZXJhbCBjYXNlICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoRWxlbWVudF9DaGVja0V4YWN0KG9iamVjdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBfZWxlbWVudHRyZWVfRWxlbWVudF9fX2RlZXBjb3B5X18oKEVsZW1lbnRPYmplY3QgKilvYmplY3QsIG1lbW8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2VuZXJhbCBjYXNlICovCisgICAgc3QgPSBFVF9TVEFURV9HTE9CQUw7CisgICAgaWYgKCFzdC0+ZGVlcGNvcHlfb2JqKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVlcGNvcHkgaGVscGVyIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzdGFja1swXSA9IG9iamVjdDsKKyAgICBzdGFja1sxXSA9IG1lbW87CisgICAgcmV0dXJuIF9QeU9iamVjdF9GYXN0Q2FsbChzdC0+ZGVlcGNvcHlfb2JqLCBzdGFjaywgMik7Cit9CisKKwogLypbY2xpbmljIGlucHV0XQogX2VsZW1lbnR0cmVlLkVsZW1lbnQuX19zaXplb2ZfXyAtPiBQeV9zc2l6ZV90CiAKQEAgLTE3NjMsNyArMTc4Nyw3IEBACiAgICAgICAgICAgICAgICAgc3RlcCA9IC1zdGVwOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhc3NlcnQoKHNpemVfdClzbGljZWxlbiA8PSBQWV9TSVpFX01BWCAvIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgICAgICBhc3NlcnQoKHNpemVfdClzbGljZWxlbiA8PSBTSVpFX01BWCAvIHNpemVvZihQeU9iamVjdCAqKSk7CiAKICAgICAgICAgICAgIC8qIHJlY3ljbGUgaXMgYSBsaXN0IHRoYXQgd2lsbCBjb250YWluIGFsbCB0aGUgY2hpbGRyZW4KICAgICAgICAgICAgICAqIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbC4KQEAgLTE4OTIsOTIgKzE5MTYsOTAgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0KgotZWxlbWVudF9nZXRhdHRybyhFbGVtZW50T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogbmFtZW9iaikKK2VsZW1lbnRfdGFnX2dldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotICAgIFB5T2JqZWN0KiByZXM7Ci0gICAgY2hhciAqbmFtZSA9ICIiOwotCi0gICAgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lb2JqKSkKLSAgICAgICAgbmFtZSA9IF9QeVVuaWNvZGVfQXNTdHJpbmcobmFtZW9iaik7Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIGhhbmRsZSBjb21tb24gYXR0cmlidXRlcyBmaXJzdCAqLwotICAgIGlmIChzdHJjbXAobmFtZSwgInRhZyIpID09IDApIHsKLSAgICAgICAgcmVzID0gc2VsZi0+dGFnOwotICAgICAgICBQeV9JTkNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAidGV4dCIpID09IDApIHsKLSAgICAgICAgcmVzID0gZWxlbWVudF9nZXRfdGV4dChzZWxmKTsKLSAgICAgICAgUHlfWElOQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIC8qIG1ldGhvZHMgKi8KLSAgICByZXMgPSBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigoUHlPYmplY3QqKSBzZWxmLCBuYW1lb2JqKTsKLSAgICBpZiAocmVzKQotICAgICAgICByZXR1cm4gcmVzOwotCi0gICAgLyogbGVzcyBjb21tb24gYXR0cmlidXRlcyAqLwotICAgIGlmIChzdHJjbXAobmFtZSwgInRhaWwiKSA9PSAwKSB7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIHJlcyA9IGVsZW1lbnRfZ2V0X3RhaWwoc2VsZik7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgImF0dHJpYiIpID09IDApIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgaWYgKCFzZWxmLT5leHRyYSkgewotICAgICAgICAgICAgaWYgKGNyZWF0ZV9leHRyYShzZWxmLCBOVUxMKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzID0gZWxlbWVudF9nZXRfYXR0cmliKHNlbGYpOwotICAgIH0KLQotICAgIGlmICghcmVzKQotICAgICAgICByZXR1cm4gTlVMTDsKLQorICAgIFB5T2JqZWN0ICpyZXMgPSBzZWxmLT50YWc7CiAgICAgUHlfSU5DUkVGKHJlcyk7CiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIGludAotZWxlbWVudF9zZXRhdHRybyhFbGVtZW50T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogbmFtZW9iaiwgUHlPYmplY3QqIHZhbHVlKQorc3RhdGljIFB5T2JqZWN0KgorZWxlbWVudF90ZXh0X2dldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotICAgIGNoYXIgKm5hbWUgPSAiIjsKKyAgICBQeU9iamVjdCAqcmVzID0gZWxlbWVudF9nZXRfdGV4dChzZWxmKTsKKyAgICBQeV9YSU5DUkVGKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KIAotICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiAtMTsKK3N0YXRpYyBQeU9iamVjdCoKK2VsZW1lbnRfdGFpbF9nZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICBQeU9iamVjdCAqcmVzID0gZWxlbWVudF9nZXRfdGFpbChzZWxmKTsKKyAgICBQeV9YSU5DUkVGKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIFB5T2JqZWN0KgorZWxlbWVudF9hdHRyaWJfZ2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBpZiAoIXNlbGYtPmV4dHJhKSB7CisgICAgICAgIGlmIChjcmVhdGVfZXh0cmEoc2VsZiwgTlVMTCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZW9iaikpCi0gICAgICAgIG5hbWUgPSBfUHlVbmljb2RlX0FzU3RyaW5nKG5hbWVvYmopOwotICAgIGlmIChuYW1lID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICByZXMgPSBlbGVtZW50X2dldF9hdHRyaWIoc2VsZik7CisgICAgUHlfWElOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7Cit9CiAKLSAgICBpZiAoc3RyY21wKG5hbWUsICJ0YWciKSA9PSAwKSB7Ci0gICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgICAgIFB5X1NFVFJFRihzZWxmLT50YWcsIHZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAidGV4dCIpID09IDApIHsKLSAgICAgICAgUHlfREVDUkVGKEpPSU5fT0JKKHNlbGYtPnRleHQpKTsKLSAgICAgICAgc2VsZi0+dGV4dCA9IHZhbHVlOwotICAgICAgICBQeV9JTkNSRUYoc2VsZi0+dGV4dCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInRhaWwiKSA9PSAwKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihKT0lOX09CSihzZWxmLT50YWlsKSk7Ci0gICAgICAgIHNlbGYtPnRhaWwgPSB2YWx1ZTsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnRhaWwpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJhdHRyaWIiKSA9PSAwKSB7Ci0gICAgICAgIGlmICghc2VsZi0+ZXh0cmEpIHsKLSAgICAgICAgICAgIGlmIChjcmVhdGVfZXh0cmEoc2VsZiwgTlVMTCkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgICAgICBQeV9TRVRSRUYoc2VsZi0+ZXh0cmEtPmF0dHJpYiwgdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICJDYW4ndCBzZXQgYXJiaXRyYXJ5IGF0dHJpYnV0ZXMgb24gRWxlbWVudCIpOwotICAgICAgICByZXR1cm4gLTE7CisvKiBtYWNybyBmb3Igc2V0dGVyIHZhbGlkYXRpb24gKi8KKyNkZWZpbmUgX1ZBTElEQVRFX0FUVFJfVkFMVUUoVikgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChWKSA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeUVycl9TZXRTdHJpbmcoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIGVsZW1lbnQgYXR0cmlidXRlIik7ICAgICAgXAorICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CiAKK3N0YXRpYyBpbnQKK2VsZW1lbnRfdGFnX3NldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgX1ZBTElEQVRFX0FUVFJfVkFMVUUodmFsdWUpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfU0VUUkVGKHNlbGYtPnRhZywgdmFsdWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlbGVtZW50X3RleHRfc2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICBfVkFMSURBVEVfQVRUUl9WQUxVRSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9ERUNSRUYoSk9JTl9PQkooc2VsZi0+dGV4dCkpOworICAgIHNlbGYtPnRleHQgPSB2YWx1ZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZWxlbWVudF90YWlsX3NldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgX1ZBTElEQVRFX0FUVFJfVkFMVUUodmFsdWUpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfREVDUkVGKEpPSU5fT0JKKHNlbGYtPnRhaWwpKTsKKyAgICBzZWxmLT50YWlsID0gdmFsdWU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsZW1lbnRfYXR0cmliX3NldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgX1ZBTElEQVRFX0FUVFJfVkFMVUUodmFsdWUpOworICAgIGlmICghc2VsZi0+ZXh0cmEpIHsKKyAgICAgICAgaWYgKGNyZWF0ZV9leHRyYShzZWxmLCBOVUxMKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfU0VUUkVGKHNlbGYtPmV4dHJhLT5hdHRyaWIsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTk5NywyMiArMjAxOSwyMiBAQAogICogcHJlLW9yZGVyIHRyYXZlcnNhbC4gVG8ga2VlcCB0cmFjayBvZiB3aGljaCBzdWItZWxlbWVudCBzaG91bGQgYmUgcmV0dXJuZWQKICAqIG5leHQsIGEgc3RhY2sgb2YgcGFyZW50cyBpcyBtYWludGFpbmVkLiBUaGlzIGlzIGEgc3RhbmRhcmQgc3RhY2stYmFzZWQKICAqIGl0ZXJhdGl2ZSBwcmUtb3JkZXIgdHJhdmVyc2FsIG9mIGEgdHJlZS4KLSAqIFRoZSBzdGFjayBpcyBtYW5hZ2VkIHVzaW5nIGEgc2luZ2xlLWxpbmtlZCBsaXN0IHN0YXJ0aW5nIGF0IHBhcmVudF9zdGFjay4KLSAqIEVhY2ggc3RhY2sgbm9kZSBjb250YWlucyB0aGUgc2F2ZWQgcGFyZW50IHRvIHdoaWNoIHdlIHNob3VsZCByZXR1cm4gYWZ0ZXIKKyAqIFRoZSBzdGFjayBpcyBtYW5hZ2VkIHVzaW5nIGEgY29udGludW91cyBhcnJheS4KKyAqIEVhY2ggc3RhY2sgaXRlbSBjb250YWlucyB0aGUgc2F2ZWQgcGFyZW50IHRvIHdoaWNoIHdlIHNob3VsZCByZXR1cm4gYWZ0ZXIKICAqIHRoZSBjdXJyZW50IG9uZSBpcyBleGhhdXN0ZWQsIGFuZCB0aGUgbmV4dCBjaGlsZCB0byBleGFtaW5lIGluIHRoYXQgcGFyZW50LgogICovCiB0eXBlZGVmIHN0cnVjdCBQYXJlbnRMb2NhdG9yX3QgewogICAgIEVsZW1lbnRPYmplY3QgKnBhcmVudDsKICAgICBQeV9zc2l6ZV90IGNoaWxkX2luZGV4OwotICAgIHN0cnVjdCBQYXJlbnRMb2NhdG9yX3QgKm5leHQ7CiB9IFBhcmVudExvY2F0b3I7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECiAgICAgUGFyZW50TG9jYXRvciAqcGFyZW50X3N0YWNrOworICAgIFB5X3NzaXplX3QgcGFyZW50X3N0YWNrX3VzZWQ7CisgICAgUHlfc3NpemVfdCBwYXJlbnRfc3RhY2tfc2l6ZTsKICAgICBFbGVtZW50T2JqZWN0ICpyb290X2VsZW1lbnQ7CiAgICAgUHlPYmplY3QgKnNvdWdodF90YWc7Ci0gICAgaW50IHJvb3RfZG9uZTsKICAgICBpbnQgZ2V0dGV4dDsKIH0gRWxlbWVudEl0ZXJPYmplY3Q7CiAKQEAgLTIwMjAsMTMgKzIwNDIsMTEgQEAKIHN0YXRpYyB2b2lkCiBlbGVtZW50aXRlcl9kZWFsbG9jKEVsZW1lbnRJdGVyT2JqZWN0ICppdCkKIHsKLSAgICBQYXJlbnRMb2NhdG9yICpwID0gaXQtPnBhcmVudF9zdGFjazsKLSAgICB3aGlsZSAocCkgewotICAgICAgICBQYXJlbnRMb2NhdG9yICp0ZW1wID0gcDsKLSAgICAgICAgUHlfWERFQ1JFRihwLT5wYXJlbnQpOwotICAgICAgICBwID0gcC0+bmV4dDsKLSAgICAgICAgUHlPYmplY3RfRnJlZSh0ZW1wKTsKLSAgICB9CisgICAgUHlfc3NpemVfdCBpID0gaXQtPnBhcmVudF9zdGFja191c2VkOworICAgIGl0LT5wYXJlbnRfc3RhY2tfdXNlZCA9IDA7CisgICAgd2hpbGUgKGktLSkKKyAgICAgICAgUHlfWERFQ1JFRihpdC0+cGFyZW50X3N0YWNrW2ldLnBhcmVudCk7CisgICAgUHlNZW1fRnJlZShpdC0+cGFyZW50X3N0YWNrKTsKIAogICAgIFB5X1hERUNSRUYoaXQtPnNvdWdodF90YWcpOwogICAgIFB5X1hERUNSRUYoaXQtPnJvb3RfZWxlbWVudCk7CkBAIC0yMDM4LDExICsyMDU4LDkgQEAKIHN0YXRpYyBpbnQKIGVsZW1lbnRpdGVyX3RyYXZlcnNlKEVsZW1lbnRJdGVyT2JqZWN0ICppdCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0gICAgUGFyZW50TG9jYXRvciAqcCA9IGl0LT5wYXJlbnRfc3RhY2s7Ci0gICAgd2hpbGUgKHApIHsKLSAgICAgICAgUHlfVklTSVQocC0+cGFyZW50KTsKLSAgICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQorICAgIFB5X3NzaXplX3QgaSA9IGl0LT5wYXJlbnRfc3RhY2tfdXNlZDsKKyAgICB3aGlsZSAoaS0tKQorICAgICAgICBQeV9WSVNJVChpdC0+cGFyZW50X3N0YWNrW2ldLnBhcmVudCk7CiAKICAgICBQeV9WSVNJVChpdC0+cm9vdF9lbGVtZW50KTsKICAgICBQeV9WSVNJVChpdC0+c291Z2h0X3RhZyk7CkBAIC0yMDUxLDE3ICsyMDY5LDI1IEBACiAKIC8qIEhlbHBlciBmdW5jdGlvbiBmb3IgZWxlbWVudGl0ZXJfbmV4dC4gQWRkIGEgbmV3IHBhcmVudCB0byB0aGUgcGFyZW50IHN0YWNrLgogICovCi1zdGF0aWMgUGFyZW50TG9jYXRvciAqCi1wYXJlbnRfc3RhY2tfcHVzaF9uZXcoUGFyZW50TG9jYXRvciAqc3RhY2ssIEVsZW1lbnRPYmplY3QgKnBhcmVudCkKK3N0YXRpYyBpbnQKK3BhcmVudF9zdGFja19wdXNoX25ldyhFbGVtZW50SXRlck9iamVjdCAqaXQsIEVsZW1lbnRPYmplY3QgKnBhcmVudCkKIHsKLSAgICBQYXJlbnRMb2NhdG9yICpuZXdfbm9kZSA9IFB5T2JqZWN0X01hbGxvYyhzaXplb2YoUGFyZW50TG9jYXRvcikpOwotICAgIGlmIChuZXdfbm9kZSkgewotICAgICAgICBuZXdfbm9kZS0+cGFyZW50ID0gcGFyZW50OwotICAgICAgICBQeV9JTkNSRUYocGFyZW50KTsKLSAgICAgICAgbmV3X25vZGUtPmNoaWxkX2luZGV4ID0gMDsKLSAgICAgICAgbmV3X25vZGUtPm5leHQgPSBzdGFjazsKKyAgICBQYXJlbnRMb2NhdG9yICppdGVtOworCisgICAgaWYgKGl0LT5wYXJlbnRfc3RhY2tfdXNlZCA+PSBpdC0+cGFyZW50X3N0YWNrX3NpemUpIHsKKyAgICAgICAgUHlfc3NpemVfdCBuZXdfc2l6ZSA9IGl0LT5wYXJlbnRfc3RhY2tfc2l6ZSAqIDI7ICAvKiBuZXZlciBvdmVyZmxvdyAqLworICAgICAgICBQYXJlbnRMb2NhdG9yICpwYXJlbnRfc3RhY2sgPSBpdC0+cGFyZW50X3N0YWNrOworICAgICAgICBQeU1lbV9SZXNpemUocGFyZW50X3N0YWNrLCBQYXJlbnRMb2NhdG9yLCBuZXdfc2l6ZSk7CisgICAgICAgIGlmIChwYXJlbnRfc3RhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaXQtPnBhcmVudF9zdGFjayA9IHBhcmVudF9zdGFjazsKKyAgICAgICAgaXQtPnBhcmVudF9zdGFja19zaXplID0gbmV3X3NpemU7CiAgICAgfQotICAgIHJldHVybiBuZXdfbm9kZTsKKyAgICBpdGVtID0gaXQtPnBhcmVudF9zdGFjayArIGl0LT5wYXJlbnRfc3RhY2tfdXNlZCsrOworICAgIFB5X0lOQ1JFRihwYXJlbnQpOworICAgIGl0ZW0tPnBhcmVudCA9IHBhcmVudDsKKyAgICBpdGVtLT5jaGlsZF9pbmRleCA9IDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0yMDc4LDE1MSArMjEwNCw5MSBAQAogICAgICAqICAgLSBpdGVydGV4dCgpIGFsc28gaGFzIHRvIGhhbmRsZSB0YWlsLCBhZnRlciBmaW5pc2hpbmcgd2l0aCBhbGwgdGhlCiAgICAgICogICAgIGNoaWxkcmVuIG9mIGEgbm9kZS4KICAgICAgKi8KLSAgICBFbGVtZW50T2JqZWN0ICpjdXJfcGFyZW50OwotICAgIFB5X3NzaXplX3QgY2hpbGRfaW5kZXg7CiAgICAgaW50IHJjOwogICAgIEVsZW1lbnRPYmplY3QgKmVsZW07CisgICAgUHlPYmplY3QgKnRleHQ7CiAKICAgICB3aGlsZSAoMSkgewogICAgICAgICAvKiBIYW5kbGUgdGhlIGNhc2UgcmVhY2hlZCBpbiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgaXRlcmF0aW9uLCB3aGVyZQotICAgICAgICAgKiB0aGUgcGFyZW50IHN0YWNrIGlzIGVtcHR5LiBUaGUgcm9vdF9kb25lIGZsYWcgZ2l2ZXMgdXMgaW5kaWNhdGlvbgotICAgICAgICAgKiB3aGV0aGVyIHdlJ3ZlIGp1c3Qgc3RhcnRlZCBpdGVyYXRpbmcgKHNvIHJvb3RfZG9uZSBpcyAwKSwgaW4gd2hpY2gKLSAgICAgICAgICogY2FzZSB0aGUgcm9vdCBpcyByZXR1cm5lZC4gSWYgcm9vdF9kb25lIGlzIDEgYW5kIHdlJ3JlIGhlcmUsIHRoZQorICAgICAgICAgKiB0aGUgcGFyZW50IHN0YWNrIGlzIGVtcHR5LiBJZiByb290X2VsZW1lbnQgaXMgTlVMTCBhbmQgd2UncmUgaGVyZSwgdGhlCiAgICAgICAgICAqIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZC4KICAgICAgICAgICovCi0gICAgICAgIGlmICghaXQtPnBhcmVudF9zdGFjay0+cGFyZW50KSB7Ci0gICAgICAgICAgICBpZiAoaXQtPnJvb3RfZG9uZSkgeworICAgICAgICBpZiAoIWl0LT5wYXJlbnRfc3RhY2tfdXNlZCkgeworICAgICAgICAgICAgaWYgKCFpdC0+cm9vdF9lbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZWxlbSA9IGl0LT5yb290X2VsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFjayA9IHBhcmVudF9zdGFja19wdXNoX25ldyhpdC0+cGFyZW50X3N0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpdC0+cGFyZW50X3N0YWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICBpdC0+cm9vdF9kb25lID0gMTsKLSAgICAgICAgICAgICAgICByYyA9IChpdC0+c291Z2h0X3RhZyA9PSBQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsZW0tPnRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNvdWdodF90YWcsIFB5X0VRKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdC0+Z2V0dGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnRleHQgPSBlbGVtZW50X2dldF90ZXh0KGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogU2VlIGlmIHRoZXJlIGFyZSBjaGlsZHJlbiBsZWZ0IHRvIHRyYXZlcnNlIGluIHRoZSBjdXJyZW50IHBhcmVudC4gSWYKLSAgICAgICAgICogeWVzLCB2aXNpdCB0aGUgbmV4dCBjaGlsZC4gSWYgbm90LCBwb3AgdGhlIHN0YWNrIGFuZCB0cnkgYWdhaW4uCi0gICAgICAgICAqLwotICAgICAgICBjdXJfcGFyZW50ID0gaXQtPnBhcmVudF9zdGFjay0+cGFyZW50OwotICAgICAgICBjaGlsZF9pbmRleCA9IGl0LT5wYXJlbnRfc3RhY2stPmNoaWxkX2luZGV4OwotICAgICAgICBpZiAoY3VyX3BhcmVudC0+ZXh0cmEgJiYgY2hpbGRfaW5kZXggPCBjdXJfcGFyZW50LT5leHRyYS0+bGVuZ3RoKSB7Ci0gICAgICAgICAgICBlbGVtID0gKEVsZW1lbnRPYmplY3QgKiljdXJfcGFyZW50LT5leHRyYS0+Y2hpbGRyZW5bY2hpbGRfaW5kZXhdOwotICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFjay0+Y2hpbGRfaW5kZXgrKzsKLSAgICAgICAgICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBwYXJlbnRfc3RhY2tfcHVzaF9uZXcoaXQtPnBhcmVudF9zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSk7Ci0gICAgICAgICAgICBpZiAoIWl0LT5wYXJlbnRfc3RhY2spIHsKLSAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7Ci0gICAgICAgICAgICBpZiAoaXQtPmdldHRleHQpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGV4dCA9IGVsZW1lbnRfZ2V0X3RleHQoZWxlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0ZXh0KTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUodGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJjID4gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByYyA9IChpdC0+c291Z2h0X3RhZyA9PSBQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsZW0tPnRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNvdWdodF90YWcsIFB5X0VRKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBlbGVtID0gaXQtPnJvb3RfZWxlbWVudDsgIC8qIHN0ZWFscyBhIHJlZmVyZW5jZSAqLworICAgICAgICAgICAgaXQtPnJvb3RfZWxlbWVudCA9IE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqdGFpbDsKLSAgICAgICAgICAgIFBhcmVudExvY2F0b3IgKm5leHQ7Ci0gICAgICAgICAgICBpZiAoaXQtPmdldHRleHQpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoY3VyX3BhcmVudCk7Ci0gICAgICAgICAgICAgICAgdGFpbCA9IGVsZW1lbnRfZ2V0X3RhaWwoY3VyX3BhcmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJfcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0YWlsKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VyX3BhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YWlsID0gUHlfTm9uZTsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYodGFpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0ID0gaXQtPnBhcmVudF9zdGFjay0+bmV4dDsKLSAgICAgICAgICAgIGN1cl9wYXJlbnQgPSBpdC0+cGFyZW50X3N0YWNrLT5wYXJlbnQ7Ci0gICAgICAgICAgICBQeU9iamVjdF9GcmVlKGl0LT5wYXJlbnRfc3RhY2spOwotICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFjayA9IG5leHQ7Ci0gICAgICAgICAgICBQeV9YREVDUkVGKGN1cl9wYXJlbnQpOwotCi0gICAgICAgICAgICAvKiBOb3RlIHRoYXQgZXh0cmEgY29uZGl0aW9uIG9uIGl0LT5wYXJlbnRfc3RhY2stPnBhcmVudCBoZXJlOwotICAgICAgICAgICAgICogdGhpcyBpcyBiZWNhdXNlIGl0ZXJ0ZXh0KCkgaXMgc3VwcG9zZWQgdG8gb25seSByZXR1cm4gKmlubmVyKgotICAgICAgICAgICAgICogdGV4dCwgbm90IHRleHQgZm9sbG93aW5nIHRoZSBlbGVtZW50IGl0IGJlZ2FuIGl0ZXJhdGlvbiB3aXRoLgorICAgICAgICAgICAgLyogU2VlIGlmIHRoZXJlIGFyZSBjaGlsZHJlbiBsZWZ0IHRvIHRyYXZlcnNlIGluIHRoZSBjdXJyZW50IHBhcmVudC4gSWYKKyAgICAgICAgICAgICAqIHllcywgdmlzaXQgdGhlIG5leHQgY2hpbGQuIElmIG5vdCwgcG9wIHRoZSBzdGFjayBhbmQgdHJ5IGFnYWluLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoaXQtPnBhcmVudF9zdGFjay0+cGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUodGFpbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJjID4gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhaWw7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRhaWwpOwotICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUGFyZW50TG9jYXRvciAqaXRlbSA9ICZpdC0+cGFyZW50X3N0YWNrW2l0LT5wYXJlbnRfc3RhY2tfdXNlZCAtIDFdOworICAgICAgICAgICAgUHlfc3NpemVfdCBjaGlsZF9pbmRleCA9IGl0ZW0tPmNoaWxkX2luZGV4OworICAgICAgICAgICAgRWxlbWVudE9iamVjdEV4dHJhICpleHRyYTsKKyAgICAgICAgICAgIGVsZW0gPSBpdGVtLT5wYXJlbnQ7CisgICAgICAgICAgICBleHRyYSA9IGVsZW0tPmV4dHJhOworICAgICAgICAgICAgaWYgKCFleHRyYSB8fCBjaGlsZF9pbmRleCA+PSBleHRyYS0+bGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFja191c2VkLS07CisgICAgICAgICAgICAgICAgLyogTm90ZSB0aGF0IGV4dHJhIGNvbmRpdGlvbiBvbiBpdC0+cGFyZW50X3N0YWNrX3VzZWQgaGVyZTsKKyAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIGJlY2F1c2UgaXRlcnRleHQoKSBpcyBzdXBwb3NlZCB0byBvbmx5IHJldHVybiAqaW5uZXIqCisgICAgICAgICAgICAgICAgICogdGV4dCwgbm90IHRleHQgZm9sbG93aW5nIHRoZSBlbGVtZW50IGl0IGJlZ2FuIGl0ZXJhdGlvbiB3aXRoLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChpdC0+Z2V0dGV4dCAmJiBpdC0+cGFyZW50X3N0YWNrX3VzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfZ2V0X3RhaWwoZWxlbSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZ2V0dGV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRhaWwpOwotICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbGVtID0gKEVsZW1lbnRPYmplY3QgKilleHRyYS0+Y2hpbGRyZW5bY2hpbGRfaW5kZXhdOworICAgICAgICAgICAgaXRlbS0+Y2hpbGRfaW5kZXgrKzsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJlbnRfc3RhY2tfcHVzaF9uZXcoaXQsIGVsZW0pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChpdC0+Z2V0dGV4dCkgeworICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfZ2V0X3RleHQoZWxlbSk7CisgICAgICAgICAgICBnb3RvIGdldHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXQtPnNvdWdodF90YWcgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOworCisgICAgICAgIHJjID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsZW0tPnRhZywgaXQtPnNvdWdodF90YWcsIFB5X0VRKTsKKyAgICAgICAgaWYgKHJjID4gMCkKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOworCisgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjb250aW51ZTsKKworZ2V0dGV4dDoKKyAgICAgICAgaWYgKCF0ZXh0KSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodGV4dCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICByYyA9IFB5T2JqZWN0X0lzVHJ1ZSh0ZXh0KTsKKyAgICAgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgICAgICBQeV9ERUNSRUYodGV4dCk7CisgICAgICAgICAgICBpZiAocmMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMjc0LDYgKzIyNDAsNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCisjZGVmaW5lIElOSVRfUEFSRU5UX1NUQUNLX1NJWkUgOAogCiBzdGF0aWMgUHlPYmplY3QgKgogY3JlYXRlX2VsZW1lbnRpdGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0YWcsIGludCBnZXR0ZXh0KQpAQCAtMjI4NiwyMiArMjI1MywyMCBAQAogCiAgICAgUHlfSU5DUkVGKHRhZyk7CiAgICAgaXQtPnNvdWdodF90YWcgPSB0YWc7Ci0gICAgaXQtPnJvb3RfZG9uZSA9IDA7CiAgICAgaXQtPmdldHRleHQgPSBnZXR0ZXh0OwogICAgIFB5X0lOQ1JFRihzZWxmKTsKICAgICBpdC0+cm9vdF9lbGVtZW50ID0gc2VsZjsKIAogICAgIFB5T2JqZWN0X0dDX1RyYWNrKGl0KTsKIAotICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKFBhcmVudExvY2F0b3IpKTsKKyAgICBpdC0+cGFyZW50X3N0YWNrID0gUHlNZW1fTmV3KFBhcmVudExvY2F0b3IsIElOSVRfUEFSRU5UX1NUQUNLX1NJWkUpOwogICAgIGlmIChpdC0+cGFyZW50X3N0YWNrID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGl0LT5wYXJlbnRfc3RhY2stPnBhcmVudCA9IE5VTEw7Ci0gICAgaXQtPnBhcmVudF9zdGFjay0+Y2hpbGRfaW5kZXggPSAwOwotICAgIGl0LT5wYXJlbnRfc3RhY2stPm5leHQgPSBOVUxMOworICAgIGl0LT5wYXJlbnRfc3RhY2tfdXNlZCA9IDA7CisgICAgaXQtPnBhcmVudF9zdGFja19zaXplID0gSU5JVF9QQVJFTlRfU1RBQ0tfU0laRTsKIAogICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KQEAgLTIzMjYsNyArMjI5MSw3IEBACiAgICAgUHlPYmplY3QgKmVsZW1lbnRfZmFjdG9yeTsKIAogICAgIC8qIGVsZW1lbnQgdHJhY2luZyAqLwotICAgIFB5T2JqZWN0ICpldmVudHM7IC8qIGxpc3Qgb2YgZXZlbnRzLCBvciBOVUxMIGlmIG5vdCBjb2xsZWN0aW5nICovCisgICAgUHlPYmplY3QgKmV2ZW50c19hcHBlbmQ7IC8qIHRoZSBhcHBlbmQgbWV0aG9kIG9mIHRoZSBsaXN0IG9mIGV2ZW50cywgb3IgTlVMTCAqLwogICAgIFB5T2JqZWN0ICpzdGFydF9ldmVudF9vYmo7IC8qIGV2ZW50IG9iamVjdHMgKE5VTEwgdG8gaWdub3JlKSAqLwogICAgIFB5T2JqZWN0ICplbmRfZXZlbnRfb2JqOwogICAgIFB5T2JqZWN0ICpzdGFydF9uc19ldmVudF9vYmo7CkBAIC0yMzYxLDcgKzIzMjYsNyBAQAogICAgICAgICB9CiAgICAgICAgIHQtPmluZGV4ID0gMDsKIAotICAgICAgICB0LT5ldmVudHMgPSBOVUxMOworICAgICAgICB0LT5ldmVudHNfYXBwZW5kID0gTlVMTDsKICAgICAgICAgdC0+c3RhcnRfZXZlbnRfb2JqID0gdC0+ZW5kX2V2ZW50X29iaiA9IE5VTEw7CiAgICAgICAgIHQtPnN0YXJ0X25zX2V2ZW50X29iaiA9IHQtPmVuZF9uc19ldmVudF9vYmogPSBOVUxMOwogICAgIH0KQEAgLTIzODAsMTMgKzIzNDUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmVsZW1lbnRfZmFjdG9yeSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05MWNmYTc1NTg5NzBlZTk2IGlucHV0PTFiNDI0ZWVlZmMzNTI0OWNdKi8KIHsKLSAgICBQeU9iamVjdCAqdG1wOwotCiAgICAgaWYgKGVsZW1lbnRfZmFjdG9yeSkgewogICAgICAgICBQeV9JTkNSRUYoZWxlbWVudF9mYWN0b3J5KTsKLSAgICAgICAgdG1wID0gc2VsZi0+ZWxlbWVudF9mYWN0b3J5OwotICAgICAgICBzZWxmLT5lbGVtZW50X2ZhY3RvcnkgPSBlbGVtZW50X2ZhY3Rvcnk7Ci0gICAgICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICAgICAgUHlfWFNFVFJFRihzZWxmLT5lbGVtZW50X2ZhY3RvcnksIGVsZW1lbnRfZmFjdG9yeSk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0yNDExLDcgKzIzNzIsNyBAQAogICAgIFB5X0NMRUFSKHNlbGYtPnN0YXJ0X25zX2V2ZW50X29iaik7CiAgICAgUHlfQ0xFQVIoc2VsZi0+ZW5kX2V2ZW50X29iaik7CiAgICAgUHlfQ0xFQVIoc2VsZi0+c3RhcnRfZXZlbnRfb2JqKTsKLSAgICBQeV9DTEVBUihzZWxmLT5ldmVudHMpOworICAgIFB5X0NMRUFSKHNlbGYtPmV2ZW50c19hcHBlbmQpOwogICAgIFB5X0NMRUFSKHNlbGYtPnN0YWNrKTsKICAgICBQeV9DTEVBUihzZWxmLT5kYXRhKTsKICAgICBQeV9DTEVBUihzZWxmLT5sYXN0KTsKQEAgLTI0OTIsMTMgKzI0NTMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbm9kZSkKIHsKICAgICBpZiAoYWN0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5VHVwbGVfUGFjaygyLCBhY3Rpb24sIG5vZGUpOworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBQeU9iamVjdCAqZXZlbnQgPSBQeVR1cGxlX1BhY2soMiwgYWN0aW9uLCBub2RlKTsKKyAgICAgICAgaWYgKGV2ZW50ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moc2VsZi0+ZXZlbnRzX2FwcGVuZCwgZXZlbnQsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZXZlbnQpOwogICAgICAgICBpZiAocmVzID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHNlbGYtPmV2ZW50cywgcmVzKSA8IDApIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRihyZXMpOwogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTI1MjcsMTAgKzI0ODksMTcgQEAKICAgICAgICAgc2VsZi0+ZGF0YSA9IE5VTEw7CiAgICAgfQogCi0gICAgaWYgKHNlbGYtPmVsZW1lbnRfZmFjdG9yeSAmJiBzZWxmLT5lbGVtZW50X2ZhY3RvcnkgIT0gUHlfTm9uZSkgewotICAgICAgICBub2RlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPmVsZW1lbnRfZmFjdG9yeSwgIk9PIiwgdGFnLCBhdHRyaWIpOwotICAgIH0gZWxzZSB7CisgICAgaWYgKCFzZWxmLT5lbGVtZW50X2ZhY3RvcnkgfHwgc2VsZi0+ZWxlbWVudF9mYWN0b3J5ID09IFB5X05vbmUpIHsKICAgICAgICAgbm9kZSA9IGNyZWF0ZV9uZXdfZWxlbWVudCh0YWcsIGF0dHJpYik7CisgICAgfSBlbHNlIGlmIChhdHRyaWIgPT0gUHlfTm9uZSkgeworICAgICAgICBhdHRyaWIgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmICghYXR0cmliKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG5vZGUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+ZWxlbWVudF9mYWN0b3J5LCAiT08iLCB0YWcsIGF0dHJpYik7CisgICAgICAgIFB5X0RFQ1JFRihhdHRyaWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbm9kZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5lbGVtZW50X2ZhY3RvcnksICJPTyIsIHRhZywgYXR0cmliKTsKICAgICB9CiAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjk4OSwxMiArMjk1OCw4IEBACiAgICAgICAgICAgICBhdHRyaWJfaW4gKz0gMjsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFBhc3MgYW4gZW1wdHkgZGljdGlvbmFyeSBvbiAqLwotICAgICAgICBhdHRyaWIgPSBQeURpY3RfTmV3KCk7Ci0gICAgICAgIGlmICghYXR0cmliKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodGFnKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIGF0dHJpYiA9IFB5X05vbmU7CiAgICAgfQogCiAgICAgaWYgKFRyZWVCdWlsZGVyX0NoZWNrRXhhY3Qoc2VsZi0+dGFyZ2V0KSkgewpAQCAtMzAwMyw2ICsyOTY4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsIGF0dHJpYik7CiAgICAgfQogICAgIGVsc2UgaWYgKHNlbGYtPmhhbmRsZV9zdGFydCkgeworICAgICAgICBpZiAoYXR0cmliID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhdHRyaWIpOworICAgICAgICAgICAgYXR0cmliID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKCFhdHRyaWIpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPmhhbmRsZV9zdGFydCwgIk9PIiwgdGFnLCBhdHRyaWIpOwogICAgIH0gZWxzZQogICAgICAgICByZXMgPSBOVUxMOwpAQCAtMzA3Niw3ICszMDQ5LDcgQEAKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKCF0YXJnZXQtPmV2ZW50cyB8fCAhdGFyZ2V0LT5zdGFydF9uc19ldmVudF9vYmopCisgICAgaWYgKCF0YXJnZXQtPmV2ZW50c19hcHBlbmQgfHwgIXRhcmdldC0+c3RhcnRfbnNfZXZlbnRfb2JqKQogICAgICAgICByZXR1cm47CiAKICAgICBpZiAoIXVyaSkKQEAgLTMwOTksNyArMzA3Miw3IEBACiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGlmICghdGFyZ2V0LT5ldmVudHMpCisgICAgaWYgKCF0YXJnZXQtPmV2ZW50c19hcHBlbmQpCiAgICAgICAgIHJldHVybjsKIAogICAgIHRyZWVidWlsZGVyX2FwcGVuZF9ldmVudCh0YXJnZXQsIHRhcmdldC0+ZW5kX25zX2V2ZW50X29iaiwgUHlfTm9uZSk7CkBAIC0zNDI2LDcgKzMzOTksNyBAQAogICAgIH0KICAgICBlbHNlIGlmIChzZWxmLT5oYW5kbGVfY2xvc2UpIHsKICAgICAgICAgUHlfREVDUkVGKHJlcyk7Ci0gICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+aGFuZGxlX2Nsb3NlLCAiIik7CisgICAgICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE5vQXJnKHNlbGYtPmhhbmRsZV9jbG9zZSk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMzU4OCw3ICszNTYxLDcgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF9lbGVtZW50dHJlZS5YTUxQYXJzZXIuX3NldGV2ZW50cwogCi0gICAgZXZlbnRzX3F1ZXVlOiBvYmplY3Qoc3ViY2xhc3Nfb2Y9JyZQeUxpc3RfVHlwZScpCisgICAgZXZlbnRzX3F1ZXVlOiBvYmplY3QKICAgICBldmVudHNfdG9fcmVwb3J0OiBvYmplY3QgPSBOb25lCiAgICAgLwogCkBAIC0zNTk4LDEyICszNTcxLDEyIEBACiBfZWxlbWVudHRyZWVfWE1MUGFyc2VyX19zZXRldmVudHNfaW1wbChYTUxQYXJzZXJPYmplY3QgKnNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZXZlbnRzX3F1ZXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmV2ZW50c190b19yZXBvcnQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTQ0MDA5MjkyMmIxM2VkMSBpbnB1dD01OWRiOTc0MjkxMGM2MTc0XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTQ0MDA5MjkyMmIxM2VkMSBpbnB1dD1hYmY5MDgzMGExYzNiMGZjXSovCiB7CiAgICAgLyogYWN0aXZhdGUgZWxlbWVudCBldmVudCByZXBvcnRpbmcgKi8KICAgICBQeV9zc2l6ZV90IGk7CiAgICAgVHJlZUJ1aWxkZXJPYmplY3QgKnRhcmdldDsKLSAgICBQeU9iamVjdCAqZXZlbnRzX3NlcTsKKyAgICBQeU9iamVjdCAqZXZlbnRzX2FwcGVuZCwgKmV2ZW50c19zZXE7CiAKICAgICBpZiAoIVRyZWVCdWlsZGVyX0NoZWNrRXhhY3Qoc2VsZi0+dGFyZ2V0KSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoCkBAIC0zNjE2LDggKzM1ODksMTAgQEAKIAogICAgIHRhcmdldCA9IChUcmVlQnVpbGRlck9iamVjdCopIHNlbGYtPnRhcmdldDsKIAotICAgIFB5X0lOQ1JFRihldmVudHNfcXVldWUpOwotICAgIFB5X1hTRVRSRUYodGFyZ2V0LT5ldmVudHMsIGV2ZW50c19xdWV1ZSk7CisgICAgZXZlbnRzX2FwcGVuZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXZlbnRzX3F1ZXVlLCAiYXBwZW5kIik7CisgICAgaWYgKGV2ZW50c19hcHBlbmQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfWFNFVFJFRih0YXJnZXQtPmV2ZW50c19hcHBlbmQsIGV2ZW50c19hcHBlbmQpOwogCiAgICAgLyogY2xlYXIgb3V0IGV4aXN0aW5nIGV2ZW50cyAqLwogICAgIFB5X0NMRUFSKHRhcmdldC0+c3RhcnRfZXZlbnRfb2JqKTsKQEAgLTM3NTAsNiArMzcyNSwyNiBAQAogICAgIChvYmpvYmphcmdwcm9jKSBlbGVtZW50X2Fzc19zdWJzY3IsCiB9OwogCitzdGF0aWMgUHlHZXRTZXREZWYgZWxlbWVudF9nZXRzZXRsaXN0W10gPSB7CisgICAgeyJ0YWciLAorICAgICAgICAoZ2V0dGVyKWVsZW1lbnRfdGFnX2dldHRlciwKKyAgICAgICAgKHNldHRlcillbGVtZW50X3RhZ19zZXR0ZXIsCisgICAgICAgICJBIHN0cmluZyBpZGVudGlmeWluZyB3aGF0IGtpbmQgb2YgZGF0YSB0aGlzIGVsZW1lbnQgcmVwcmVzZW50cyJ9LAorICAgIHsidGV4dCIsCisgICAgICAgIChnZXR0ZXIpZWxlbWVudF90ZXh0X2dldHRlciwKKyAgICAgICAgKHNldHRlcillbGVtZW50X3RleHRfc2V0dGVyLAorICAgICAgICAiQSBzdHJpbmcgb2YgdGV4dCBkaXJlY3RseSBhZnRlciB0aGUgc3RhcnQgdGFnLCBvciBOb25lIn0sCisgICAgeyJ0YWlsIiwKKyAgICAgICAgKGdldHRlcillbGVtZW50X3RhaWxfZ2V0dGVyLAorICAgICAgICAoc2V0dGVyKWVsZW1lbnRfdGFpbF9zZXR0ZXIsCisgICAgICAgICJBIHN0cmluZyBvZiB0ZXh0IGRpcmVjdGx5IGFmdGVyIHRoZSBlbmQgdGFnLCBvciBOb25lIn0sCisgICAgeyJhdHRyaWIiLAorICAgICAgICAoZ2V0dGVyKWVsZW1lbnRfYXR0cmliX2dldHRlciwKKyAgICAgICAgKHNldHRlcillbGVtZW50X2F0dHJpYl9zZXR0ZXIsCisgICAgICAgICJBIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgZWxlbWVudCdzIGF0dHJpYnV0ZXMifSwKKyAgICB7TlVMTH0sCit9OworCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEVsZW1lbnRfVHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAieG1sLmV0cmVlLkVsZW1lbnRUcmVlLkVsZW1lbnQiLCBzaXplb2YoRWxlbWVudE9iamVjdCksIDAsCkBAIC0zNzY2LDggKzM3NjEsOCBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCi0gICAgKGdldGF0dHJvZnVuYyllbGVtZW50X2dldGF0dHJvLCAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KLSAgICAoc2V0YXR0cm9mdW5jKWVsZW1lbnRfc2V0YXR0cm8sICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCkBAIC0zNzgwLDcgKzM3NzUsNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgZWxlbWVudF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICBlbGVtZW50X2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMgYi9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYwppbmRleCBkNzg1YzQ5Li44NDhhMDNjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYworKysgYi9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYwpAQCAtMTI4LDQ0ICsxMjgsNjAgQEAKIHsKICAgICBQeU9iamVjdCAqcmV0OwogICAgIFB5T2JqZWN0ICphcmdhcHBsLCAqa3dhcHBsOworICAgIFB5T2JqZWN0ICoqc3RhY2s7CisgICAgUHlfc3NpemVfdCBuYXJnczsKIAogICAgIGFzc2VydCAoUHlDYWxsYWJsZV9DaGVjayhwdG8tPmZuKSk7CiAgICAgYXNzZXJ0IChQeVR1cGxlX0NoZWNrKHB0by0+YXJncykpOwogICAgIGFzc2VydCAoUHlEaWN0X0NoZWNrKHB0by0+a3cpKTsKIAogICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKHB0by0+YXJncykgPT0gMCkgewotICAgICAgICBhcmdhcHBsID0gYXJnczsKLSAgICAgICAgUHlfSU5DUkVGKGFyZ3MpOwotICAgIH0gZWxzZSBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKSB7Ci0gICAgICAgIGFyZ2FwcGwgPSBwdG8tPmFyZ3M7Ci0gICAgICAgIFB5X0lOQ1JFRihwdG8tPmFyZ3MpOwotICAgIH0gZWxzZSB7CisgICAgICAgIHN0YWNrID0gJlB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgICAgIG5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICAgICAgYXJnYXBwbCA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkgeworICAgICAgICBzdGFjayA9ICZQeVR1cGxlX0dFVF9JVEVNKHB0by0+YXJncywgMCk7CisgICAgICAgIG5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShwdG8tPmFyZ3MpOworICAgICAgICBhcmdhcHBsID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YWNrID0gTlVMTDsKICAgICAgICAgYXJnYXBwbCA9IFB5U2VxdWVuY2VfQ29uY2F0KHB0by0+YXJncywgYXJncyk7Ci0gICAgICAgIGlmIChhcmdhcHBsID09IE5VTEwpCisgICAgICAgIGlmIChhcmdhcHBsID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKICAgICAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJnYXBwbCkpOwogICAgIH0KIAogICAgIGlmIChQeURpY3RfU2l6ZShwdG8tPmt3KSA9PSAwKSB7CiAgICAgICAgIGt3YXBwbCA9IGt3OwogICAgICAgICBQeV9YSU5DUkVGKGt3YXBwbCk7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAgIGt3YXBwbCA9IFB5RGljdF9Db3B5KHB0by0+a3cpOwogICAgICAgICBpZiAoa3dhcHBsID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdhcHBsKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoYXJnYXBwbCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQorCiAgICAgICAgIGlmIChrdyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBpZiAoUHlEaWN0X01lcmdlKGt3YXBwbCwga3csIDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJnYXBwbCk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihhcmdhcHBsKTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa3dhcHBsKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHJldCA9IFB5T2JqZWN0X0NhbGwocHRvLT5mbiwgYXJnYXBwbCwga3dhcHBsKTsKLSAgICBQeV9ERUNSRUYoYXJnYXBwbCk7CisgICAgaWYgKHN0YWNrKSB7CisgICAgICAgIHJldCA9IF9QeU9iamVjdF9GYXN0Q2FsbERpY3QocHRvLT5mbiwgc3RhY2ssIG5hcmdzLCBrd2FwcGwpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0ID0gUHlPYmplY3RfQ2FsbChwdG8tPmZuLCBhcmdhcHBsLCBrd2FwcGwpOworICAgICAgICBQeV9ERUNSRUYoYXJnYXBwbCk7CisgICAgfQogICAgIFB5X1hERUNSRUYoa3dhcHBsKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtNDYxLDEyICs0NzcsMTIgQEAKIGtleW9iamVjdF9yaWNoY29tcGFyZShQeU9iamVjdCAqa28sIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewogICAgIFB5T2JqZWN0ICpyZXM7Ci0gICAgUHlPYmplY3QgKmFyZ3M7CiAgICAgUHlPYmplY3QgKng7CiAgICAgUHlPYmplY3QgKnk7CiAgICAgUHlPYmplY3QgKmNvbXBhcmU7CiAgICAgUHlPYmplY3QgKmFuc3dlcjsKICAgICBzdGF0aWMgUHlPYmplY3QgKnplcm87CisgICAgUHlPYmplY3QqIHN0YWNrWzJdOwogCiAgICAgaWYgKHplcm8gPT0gTlVMTCkgewogICAgICAgICB6ZXJvID0gUHlMb25nX0Zyb21Mb25nKDApOwpAQCAtNDkwLDE3ICs1MDYsMTMgQEAKICAgICAvKiBDYWxsIHRoZSB1c2VyJ3MgY29tcGFyaXNvbiBmdW5jdGlvbiBhbmQgdHJhbnNsYXRlIHRoZSAzLXdheQogICAgICAqIHJlc3VsdCBpbnRvIHRydWUgb3IgZmFsc2UgKG9yIGVycm9yKS4KICAgICAgKi8KLSAgICBhcmdzID0gUHlUdXBsZV9OZXcoMik7Ci0gICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICBzdGFja1swXSA9IHg7CisgICAgc3RhY2tbMV0gPSB5OworICAgIHJlcyA9IF9QeU9iamVjdF9GYXN0Q2FsbChjb21wYXJlLCBzdGFjaywgMik7CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIFB5X0lOQ1JFRih4KTsKLSAgICBQeV9JTkNSRUYoeSk7Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCB4KTsKLSAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDEsIHkpOwotICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoY29tcGFyZSwgYXJncywgTlVMTCk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOwotICAgIGlmIChyZXMgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgYW5zd2VyID0gUHlPYmplY3RfUmljaENvbXBhcmUocmVzLCB6ZXJvLCBvcCk7CiAgICAgUHlfREVDUkVGKHJlcyk7CiAgICAgcmV0dXJuIGFuc3dlcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2dkYm1tb2R1bGUuYyBiL01vZHVsZXMvX2dkYm1tb2R1bGUuYwppbmRleCBiODQwYmY1Li5kYWFlNzFkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19nZGJtbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fZ2RibW1vZHVsZS5jCkBAIC02MTQsNyArNjE0LDcgQEAKICAgICByZXR1cm4gbmV3ZGJtb2JqZWN0KG5hbWUsIGlmbGFncywgbW9kZSk7CiB9CiAKLXN0YXRpYyBjaGFyIGRibW1vZHVsZV9vcGVuX2ZsYWdzW10gPSAicndjbiIKK3N0YXRpYyBjb25zdCBjaGFyIGRibW1vZHVsZV9vcGVuX2ZsYWdzW10gPSAicndjbiIKICNpZmRlZiBHREJNX0ZBU1QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZiIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faGFzaG9wZW5zc2wuYyBiL01vZHVsZXMvX2hhc2hvcGVuc3NsLmMKaW5kZXggZmY1NzYxNC4uZGFhNGYzZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faGFzaG9wZW5zc2wuYworKysgYi9Nb2R1bGVzL19oYXNob3BlbnNzbC5jCkBAIC0yNSw2ICsyNSwxMiBAQAogI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgogI2luY2x1ZGUgIm9wZW5zc2wvZXJyLmgiCiAKKyNpbmNsdWRlICJjbGluaWMvX2hhc2hvcGVuc3NsLmMuaCIKKy8qW2NsaW5pYyBpbnB1dF0KK21vZHVsZSBfaGFzaGxpYgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9YzJiNGZmMDgxYmFjNGJlMV0qLworCiAjZGVmaW5lIE1VTkNIX1NJWkUgSU5UX01BWAogCiAjaWZuZGVmIEhBU0hfT0JKX0NPTlNUUlVDVE9SCkBAIC03MTMsNiArNzE5LDEyOCBAQAogCiAjZW5kaWYKIAorI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPiAweDEwMTAwMDAwTCAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1NDUllQVCkgJiYgIWRlZmluZWQoTElCUkVTU0xfVkVSU0lPTl9OVU1CRVIpCisjZGVmaW5lIFBZX1NDUllQVCAxCisKKy8qW2NsaW5pYyBpbnB1dF0KK19oYXNobGliLnNjcnlwdAorCisgICAgcGFzc3dvcmQ6IFB5X2J1ZmZlcgorICAgICoKKyAgICBzYWx0OiBQeV9idWZmZXIgPSBOb25lCisgICAgbiBhcyBuX29iajogb2JqZWN0KHN1YmNsYXNzX29mPScmUHlMb25nX1R5cGUnKSA9IE5vbmUKKyAgICByIGFzIHJfb2JqOiBvYmplY3Qoc3ViY2xhc3Nfb2Y9JyZQeUxvbmdfVHlwZScpID0gTm9uZQorICAgIHAgYXMgcF9vYmo6IG9iamVjdChzdWJjbGFzc19vZj0nJlB5TG9uZ19UeXBlJykgPSBOb25lCisgICAgbWF4bWVtOiBsb25nID0gMAorICAgIGRrbGVuOiBsb25nID0gNjQKKworCitzY3J5cHQgcGFzc3dvcmQtYmFzZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfaGFzaGxpYl9zY3J5cHRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKnBhc3N3b3JkLCBQeV9idWZmZXIgKnNhbHQsCisgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbl9vYmosIFB5T2JqZWN0ICpyX29iaiwgUHlPYmplY3QgKnBfb2JqLAorICAgICAgICAgICAgICAgICAgICAgbG9uZyBtYXhtZW0sIGxvbmcgZGtsZW4pCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTQ4NDllMmFhMmI3YjQ2YyBpbnB1dD00OGE3ZDYzYmYzZjc1YzQyXSovCit7CisgICAgUHlPYmplY3QgKmtleV9vYmogPSBOVUxMOworICAgIGNoYXIgKmtleTsKKyAgICBpbnQgcmV0dmFsOworICAgIHVuc2lnbmVkIGxvbmcgbiwgciwgcDsKKworICAgIGlmIChwYXNzd29yZC0+bGVuID4gSU5UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYXNzd29yZCBpcyB0b28gbG9uZy4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHNhbHQtPmJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2FsdCBpcyByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHNhbHQtPmxlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2FsdCBpcyB0b28gbG9uZy4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbiA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhuX29iaik7CisgICAgaWYgKG4gPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJuIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG4gPCAyIHx8IG4gJiAobiAtIDEpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm4gbXVzdCBiZSBhIHBvd2VyIG9mIDIuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHIgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcocl9vYmopOworICAgIGlmIChyID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInIgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gdW5zaWduZWQgaW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHAgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcocF9vYmopOworICAgIGlmIChwID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInAgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gdW5zaWduZWQgaW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtYXhtZW0gPCAwIHx8IG1heG1lbSA+IElOVF9NQVgpIHsKKyAgICAgICAgLyogT3BlblNTTCAxLjEuMCByZXN0cmljdHMgbWF4bWVtIHRvIDMyTUIuIEl0IG1heSBjaGFuZ2UgaW4gdGhlCisgICAgICAgICAgIGZ1dHVyZS4gVGhlIG1heG1lbSBjb25zdGFudCBpcyBwcml2YXRlIHRvIE9wZW5TU0wuICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIm1heG1lbSBtdXN0IGJlIHBvc2l0aXZlIGFuZCBzbWFsbGVyIHRoYW4gJWQiLAorICAgICAgICAgICAgICAgICAgICAgIElOVF9NQVgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZGtsZW4gPCAxIHx8IGRrbGVuID4gSU5UX01BWCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImRrbGVuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYW5kIHNtYWxsZXIgdGhhbiAlZCIsCisgICAgICAgICAgICAgICAgICAgIElOVF9NQVgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBsZXQgT3BlblNTTCB2YWxpZGF0ZSB0aGUgcmVzdCAqLworICAgIHJldHZhbCA9IEVWUF9QQkVfc2NyeXB0KE5VTEwsIDAsIE5VTEwsIDAsIG4sIHIsIHAsIG1heG1lbSwgTlVMTCwgMCk7CisgICAgaWYgKCFyZXR2YWwpIHsKKyAgICAgICAgLyogc29ycnksIGNhbid0IGRvIG11Y2ggYmV0dGVyICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcGFyYW1lbXRlciBjb21iaW5hdGlvbiBmb3IgbiwgciwgcCwgbWF4bWVtLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKworICAgIGtleV9vYmogPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGRrbGVuKTsKKyAgICBpZiAoa2V5X29iaiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBrZXkgPSBQeUJ5dGVzX0FTX1NUUklORyhrZXlfb2JqKTsKKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXR2YWwgPSBFVlBfUEJFX3NjcnlwdCgKKyAgICAgICAgKGNvbnN0IGNoYXIqKXBhc3N3b3JkLT5idWYsIChzaXplX3QpcGFzc3dvcmQtPmxlbiwKKyAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzYWx0LT5idWYsIChzaXplX3Qpc2FsdC0+bGVuLAorICAgICAgICBuLCByLCBwLCBtYXhtZW0sCisgICAgICAgICh1bnNpZ25lZCBjaGFyICopa2V5LCAoc2l6ZV90KWRrbGVuCisgICAgKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgaWYgKCFyZXR2YWwpIHsKKyAgICAgICAgUHlfQ0xFQVIoa2V5X29iaik7CisgICAgICAgIF9zZXRFeGNlcHRpb24oUHlFeGNfVmFsdWVFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4ga2V5X29iajsKK30KKyNlbmRpZgorCiAvKiBTdGF0ZSBmb3Igb3VyIGNhbGxiYWNrIGZ1bmN0aW9uIHNvIHRoYXQgaXQgY2FuIGFjY3VtdWxhdGUgYSByZXN1bHQuICovCiB0eXBlZGVmIHN0cnVjdCBfaW50ZXJuYWxfbmFtZV9tYXBwZXJfc3RhdGUgewogICAgIFB5T2JqZWN0ICpzZXQ7CkBAIC04MzYsNiArOTY0LDcgQEAKICAgICB7InBia2RmMl9obWFjIiwgKFB5Q0Z1bmN0aW9uKXBia2RmMl9obWFjLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKICAgICAgcGJrZGYyX2htYWNfX2RvY19ffSwKICNlbmRpZgorICAgIF9IQVNITElCX1NDUllQVF9NRVRIT0RERUYKICAgICBDT05TVFJVQ1RPUl9NRVRIX0RFRihtZDUpLAogICAgIENPTlNUUlVDVE9SX01FVEhfREVGKHNoYTEpLAogICAgIENPTlNUUlVDVE9SX01FVEhfREVGKHNoYTIyNCksCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jIGIvTW9kdWxlcy9faGVhcHFtb2R1bGUuYwppbmRleCAxMzZhYmY1Li5iNDk5ZTFmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAogICAgIC8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOwotICAgIGxpbWl0ID0gZW5kcG9zIC8gMjsgICAgICAgICAgLyogc21hbGxlc3QgcG9zIHRoYXQgaGFzIG5vIGNoaWxkICovCisgICAgbGltaXQgPSBlbmRwb3MgPj4gMTsgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8KICAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKICAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KICAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwpAQCAtNzgsNiArNzgsNyBAQAogICAgICAgICAgICAgaWYgKGNtcCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgY2hpbGRwb3MgKz0gKCh1bnNpZ25lZCljbXAgXiAxKTsgICAvKiBpbmNyZW1lbnQgd2hlbiBjbXA9PTAgKi8KKyAgICAgICAgICAgIGFyciA9IF9QeUxpc3RfSVRFTVMoaGVhcCk7ICAgICAgICAgLyogYXJyIG1heSBoYXZlIGNoYW5nZWQgKi8KICAgICAgICAgICAgIGlmIChlbmRwb3MgIT0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKQEAgLTg1LDcgKzg2LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLwotICAgICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOwogICAgICAgICB0bXAxID0gYXJyW2NoaWxkcG9zXTsKICAgICAgICAgdG1wMiA9IGFycltwb3NdOwogICAgICAgICBhcnJbY2hpbGRwb3NdID0gdG1wMjsKQEAgLTM0Nyw3ICszNDcsNyBAQAogICAgICAgIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXMgKDIqaisxLTEpLzIgPSBqIHNvIGotMSBpcyB0aGUgbGFyZ2VzdCwKICAgICAgICBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS4KICAgICAqLwotICAgIGZvciAoaSA9IG4vMiAtIDEgOyBpID49IDAgOyBpLS0pCisgICAgZm9yIChpID0gKG4gPj4gMSkgLSAxIDsgaSA+PSAwIDsgaS0tKQogICAgICAgICBpZiAoc2lmdHVwX2Z1bmMoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfUkVUVVJOX05PTkU7CkBAIC00MjAsNyArNDIwLDcgQEAKIAogICAgIC8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOwotICAgIGxpbWl0ID0gZW5kcG9zIC8gMjsgICAgICAgICAgLyogc21hbGxlc3QgcG9zIHRoYXQgaGFzIG5vIGNoaWxkICovCisgICAgbGltaXQgPSBlbmRwb3MgPj4gMTsgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8KICAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKICAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KICAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwpAQCAtNDMyLDYgKzQzMiw3IEBACiAgICAgICAgICAgICBpZiAoY21wIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICBjaGlsZHBvcyArPSAoKHVuc2lnbmVkKWNtcCBeIDEpOyAgIC8qIGluY3JlbWVudCB3aGVuIGNtcD09MCAqLworICAgICAgICAgICAgYXJyID0gX1B5TGlzdF9JVEVNUyhoZWFwKTsgICAgICAgICAvKiBhcnIgbWF5IGhhdmUgY2hhbmdlZCAqLwogICAgICAgICAgICAgaWYgKGVuZHBvcyAhPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOwpAQCAtNDM5LDcgKzQ0MCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KLSAgICAgICAgYXJyID0gX1B5TGlzdF9JVEVNUyhoZWFwKTsKICAgICAgICAgdG1wMSA9IGFycltjaGlsZHBvc107CiAgICAgICAgIHRtcDIgPSBhcnJbcG9zXTsKICAgICAgICAgYXJyW2NoaWxkcG9zXSA9IHRtcDI7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9faW9tb2R1bGUuYyBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5jCmluZGV4IDY1Yzk1NWEuLjYwZjhiNTQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL19pb21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5jCkBAIC0yMCw2ICsyMCw5IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNlbmRpZiAvKiBIQVZFX1NZU19TVEFUX0ggKi8KIAorI2lmZGVmIE1TX1dJTkRPV1MKKyNpbmNsdWRlIDxjb25zb2xlYXBpLmg+CisjZW5kaWYKIAogLyogVmFyaW91cyBpbnRlcm5lZCBzdHJpbmdzICovCiAKQEAgLTUyLDcgKzU1LDYgQEAKIFB5T2JqZWN0ICpfUHlJT19lbXB0eV9ieXRlczsKIFB5T2JqZWN0ICpfUHlJT196ZXJvOwogCi0MCiBQeURvY19TVFJWQVIobW9kdWxlX2RvYywKICJUaGUgaW8gbW9kdWxlIHByb3ZpZGVzIHRoZSBQeXRob24gaW50ZXJmYWNlcyB0byBzdHJlYW0gaGFuZGxpbmcuIFRoZVxuIgogImJ1aWx0aW4gb3BlbiBmdW5jdGlvbiBpcyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlLlxuIgpAQCAtMjM4LDIwICsyNDAsMzMgQEAKICAgICBpbnQgdGV4dCA9IDAsIGJpbmFyeSA9IDAsIHVuaXZlcnNhbCA9IDA7CiAKICAgICBjaGFyIHJhd21vZGVbNl0sICptOwotICAgIGludCBsaW5lX2J1ZmZlcmluZywgaXNhdHR5OworICAgIGludCBsaW5lX2J1ZmZlcmluZywgaXNfbnVtYmVyOworICAgIGxvbmcgaXNhdHR5OwogCi0gICAgUHlPYmplY3QgKnJhdywgKm1vZGVvYmogPSBOVUxMLCAqYnVmZmVyLCAqd3JhcHBlciwgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJhdywgKm1vZGVvYmogPSBOVUxMLCAqYnVmZmVyLCAqd3JhcHBlciwgKnJlc3VsdCA9IE5VTEwsICpwYXRoX29yX2ZkID0gTlVMTDsKIAogICAgIF9QeV9JREVOVElGSUVSKF9ibGtzaXplKTsKICAgICBfUHlfSURFTlRJRklFUihpc2F0dHkpOwogICAgIF9QeV9JREVOVElGSUVSKG1vZGUpOwogICAgIF9QeV9JREVOVElGSUVSKGNsb3NlKTsKIAotICAgIGlmICghUHlVbmljb2RlX0NoZWNrKGZpbGUpICYmCi0JIVB5Qnl0ZXNfQ2hlY2soZmlsZSkgJiYKLQkhUHlOdW1iZXJfQ2hlY2soZmlsZSkpIHsKKyAgICBpc19udW1iZXIgPSBQeU51bWJlcl9DaGVjayhmaWxlKTsKKworICAgIGlmIChpc19udW1iZXIpIHsKKyAgICAgICAgcGF0aF9vcl9mZCA9IGZpbGU7CisgICAgICAgIFB5X0lOQ1JFRihwYXRoX29yX2ZkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXRoX29yX2ZkID0gUHlPU19GU1BhdGgoZmlsZSk7CisgICAgICAgIGlmIChwYXRoX29yX2ZkID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFpc19udW1iZXIgJiYKKyAgICAgICAgIVB5VW5pY29kZV9DaGVjayhwYXRoX29yX2ZkKSAmJgorICAgICAgICAhUHlCeXRlc19DaGVjayhwYXRoX29yX2ZkKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiaW52YWxpZCBmaWxlOiAlUiIsIGZpbGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICAvKiBEZWNvZGUgbW9kZSAqLwpAQCAtMjkyLDcgKzMwNyw3IEBACiAgICAgICAgIGlmIChzdHJjaHIobW9kZStpKzEsIGMpKSB7CiAgICAgICAgICAgaW52YWxpZF9tb2RlOgogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIG1vZGU6ICclcyciLCBtb2RlKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogCiAgICAgfQpAQCAtMzA3LDU0ICszMjIsNjcgQEAKIAogICAgIC8qIFBhcmFtZXRlcnMgdmFsaWRhdGlvbiAqLwogICAgIGlmICh1bml2ZXJzYWwpIHsKLSAgICAgICAgaWYgKHdyaXRpbmcgfHwgYXBwZW5kaW5nKSB7CisgICAgICAgIGlmIChjcmVhdGluZyB8fCB3cml0aW5nIHx8IGFwcGVuZGluZyB8fCB1cGRhdGluZykgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHVzZSBVIGFuZCB3cml0aW5nIG1vZGUgYXQgb25jZSIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZGUgVSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCB4JywgJ3cnLCAnYScsIG9yICcrJyIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAiJ1UnIG1vZGUgaXMgZGVwcmVjYXRlZCIsIDEpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgcmVhZGluZyA9IDE7CiAgICAgfQogCiAgICAgaWYgKHRleHQgJiYgYmluYXJ5KSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGhhdmUgdGV4dCBhbmQgYmluYXJ5IG1vZGUgYXQgb25jZSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICBpZiAoY3JlYXRpbmcgKyByZWFkaW5nICsgd3JpdGluZyArIGFwcGVuZGluZyA+IDEpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBoYXZlIGV4YWN0bHkgb25lIG9mIGNyZWF0ZS9yZWFkL3dyaXRlL2FwcGVuZCBtb2RlIik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIGlmIChiaW5hcnkgJiYgZW5jb2RpbmcgIT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJiaW5hcnkgbW9kZSBkb2Vzbid0IHRha2UgYW4gZW5jb2RpbmcgYXJndW1lbnQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgaWYgKGJpbmFyeSAmJiBlcnJvcnMgIT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJiaW5hcnkgbW9kZSBkb2Vzbid0IHRha2UgYW4gZXJyb3JzIGFyZ3VtZW50Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIGlmIChiaW5hcnkgJiYgbmV3bGluZSAhPSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImJpbmFyeSBtb2RlIGRvZXNuJ3QgdGFrZSBhIG5ld2xpbmUgYXJndW1lbnQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgLyogQ3JlYXRlIHRoZSBSYXcgZmlsZSBzdHJlYW0gKi8KLSAgICByYXcgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopJlB5RmlsZUlPX1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPc2lPIiwgZmlsZSwgcmF3bW9kZSwgY2xvc2VmZCwgb3BlbmVyKTsKKyAgICB7CisgICAgICAgIFB5T2JqZWN0ICpSYXdJT19jbGFzcyA9IChQeU9iamVjdCAqKSZQeUZpbGVJT19UeXBlOworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgaWYgKCFQeV9MZWdhY3lXaW5kb3dzU3RkaW9GbGFnICYmIF9QeUlPX2dldF9jb25zb2xlX3R5cGUocGF0aF9vcl9mZCkgIT0gJ1wwJykgeworICAgICAgICAgICAgUmF3SU9fY2xhc3MgPSAoUHlPYmplY3QgKikmUHlXaW5kb3dzQ29uc29sZUlPX1R5cGU7CisgICAgICAgICAgICBlbmNvZGluZyA9ICJ1dGYtOCI7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICByYXcgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oUmF3SU9fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3NpTyIsIHBhdGhfb3JfZmQsIHJhd21vZGUsIGNsb3NlZmQsIG9wZW5lcik7CisgICAgfQorCiAgICAgaWYgKHJhdyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICByZXN1bHQgPSByYXc7CiAKKyAgICBQeV9ERUNSRUYocGF0aF9vcl9mZCk7CisgICAgcGF0aF9vcl9mZCA9IE5VTEw7CisKICAgICBtb2Rlb2JqID0gUHlVbmljb2RlX0Zyb21TdHJpbmcobW9kZSk7CiAgICAgaWYgKG1vZGVvYmogPT0gTlVMTCkKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTQzNywxMCArNDY1LDEwIEBACiAKICAgICAvKiB3cmFwcyBpbnRvIGEgVGV4dElPV3JhcHBlciAqLwogICAgIHdyYXBwZXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopJlB5VGV4dElPV3JhcHBlcl9UeXBlLAotCQkJCSAgICAiT3Nzc2kiLAotCQkJCSAgICBidWZmZXIsCi0JCQkJICAgIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsCi0JCQkJICAgIGxpbmVfYnVmZmVyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPc3NzaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9idWZmZXJpbmcpOwogICAgIGlmICh3cmFwcGVyID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgcmVzdWx0ID0gd3JhcHBlcjsKQEAgLTQ2MCw2ICs0ODgsNyBAQAogICAgICAgICBQeV9YREVDUkVGKGNsb3NlX3Jlc3VsdCk7CiAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgIH0KKyAgICBQeV9YREVDUkVGKHBhdGhfb3JfZmQpOwogICAgIFB5X1hERUNSRUYobW9kZW9iaik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CkBAIC02OTEsNiArNzIwLDEyIEBACiAgICAgUHlTdHJpbmdJT19UeXBlLnRwX2Jhc2UgPSAmUHlUZXh0SU9CYXNlX1R5cGU7CiAgICAgQUREX1RZUEUoJlB5U3RyaW5nSU9fVHlwZSwgIlN0cmluZ0lPIik7CiAKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgLyogV2luZG93c0NvbnNvbGVJTyAqLworICAgIFB5V2luZG93c0NvbnNvbGVJT19UeXBlLnRwX2Jhc2UgPSAmUHlSYXdJT0Jhc2VfVHlwZTsKKyAgICBBRERfVFlQRSgmUHlXaW5kb3dzQ29uc29sZUlPX1R5cGUsICJfV2luZG93c0NvbnNvbGVJTyIpOworI2VuZGlmCisKICAgICAvKiBCdWZmZXJlZFJlYWRlciAqLwogICAgIFB5QnVmZmVyZWRSZWFkZXJfVHlwZS50cF9iYXNlID0gJlB5QnVmZmVyZWRJT0Jhc2VfVHlwZTsKICAgICBBRERfVFlQRSgmUHlCdWZmZXJlZFJlYWRlcl9UeXBlLCAiQnVmZmVyZWRSZWFkZXIiKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL19pb21vZHVsZS5oIGIvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmgKaW5kZXggMGM2ZWFlMi4uNWQzZGEyOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmgKKysrIGIvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmgKQEAgLTE5LDYgKzE5LDEyIEBACiBleHRlcm4gUHlUeXBlT2JqZWN0IFB5VGV4dElPV3JhcHBlcl9UeXBlOwogZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUluY3JlbWVudGFsTmV3bGluZURlY29kZXJfVHlwZTsKIAorI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorI2lmZGVmIE1TX1dJTkRPV1MKK2V4dGVybiBQeVR5cGVPYmplY3QgUHlXaW5kb3dzQ29uc29sZUlPX1R5cGU7CisjZGVmaW5lIFB5V2luZG93c0NvbnNvbGVJT19DaGVjayhvcCkgKFB5T2JqZWN0X1R5cGVDaGVjaygob3ApLCAmUHlXaW5kb3dzQ29uc29sZUlPX1R5cGUpKQorI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KKyNlbmRpZiAvKiBQeV9MSU1JVEVEX0FQSSAqLwogCiBleHRlcm4gaW50IF9QeUlPX0NvbnZlcnRTc2l6ZV90KFB5T2JqZWN0ICosIHZvaWQgKik7CiAKQEAgLTYwLDcgKzY2LDcgQEAKICAgICogT3RoZXJ3aXNlLCB0aGUgbGluZSBlbmRpbmcgaXMgc3BlY2lmaWVkIGJ5IHJlYWRubCwgYSBzdHIgb2JqZWN0ICovCiBleHRlcm4gUHlfc3NpemVfdCBfUHlJT19maW5kX2xpbmVfZW5kaW5nKAogICAgIGludCB0cmFuc2xhdGVkLCBpbnQgdW5pdmVyc2FsLCBQeU9iamVjdCAqcmVhZG5sLAotICAgIGludCBraW5kLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBQeV9zc2l6ZV90ICpjb25zdW1lZCk7CisgICAgaW50IGtpbmQsIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQsIFB5X3NzaXplX3QgKmNvbnN1bWVkKTsKIAogLyogUmV0dXJuIDEgaWYgYW4gRW52aXJvbm1lbnRFcnJvciB3aXRoIGVycm5vID09IEVJTlRSIGlzIHNldCAoYW5kIHRoZW4KICAgIGNsZWFycyB0aGUgZXJyb3IgaW5kaWNhdG9yKSwgMCBvdGhlcndpc2UuCkBAIC04NSwxMiArOTEsMTIgQEAKICNpZmRlZiBNU19XSU5ET1dTCiAKIC8qIFdpbmRvd3MgdXNlcyBsb25nIGxvbmcgZm9yIG9mZnNldHMgKi8KLXR5cGVkZWYgUFlfTE9OR19MT05HIFB5X29mZl90OwordHlwZWRlZiBsb25nIGxvbmcgUHlfb2ZmX3Q7CiAjIGRlZmluZSBQeUxvbmdfQXNPZmZfdCAgICAgUHlMb25nX0FzTG9uZ0xvbmcKICMgZGVmaW5lIFB5TG9uZ19Gcm9tT2ZmX3QgICBQeUxvbmdfRnJvbUxvbmdMb25nCi0jIGRlZmluZSBQWV9PRkZfVF9NQVggICAgICAgUFlfTExPTkdfTUFYCi0jIGRlZmluZSBQWV9PRkZfVF9NSU4gICAgICAgUFlfTExPTkdfTUlOCi0jIGRlZmluZSBQWV9PRkZfVF9DT01QQVQgICAgUFlfTE9OR19MT05HIC8qIHR5cGUgY29tcGF0aWJsZSB3aXRoIG9mZl90ICovCisjIGRlZmluZSBQWV9PRkZfVF9NQVggICAgICAgTExPTkdfTUFYCisjIGRlZmluZSBQWV9PRkZfVF9NSU4gICAgICAgTExPTkdfTUlOCisjIGRlZmluZSBQWV9PRkZfVF9DT01QQVQgICAgbG9uZyBsb25nICAgIC8qIHR5cGUgY29tcGF0aWJsZSB3aXRoIG9mZl90ICovCiAjIGRlZmluZSBQWV9QUklkT0ZGICAgICAgICAgImxsZCIgICAgICAgIC8qIGZvcm1hdCB0byB1c2UgZm9yIHRoYXQgdHlwZSAqLwogCiAjZWxzZQpAQCAtMTA0LDEyICsxMTAsMTIgQEAKICMgZGVmaW5lIFBZX09GRl9UX01JTiAgICAgICBQWV9TU0laRV9UX01JTgogIyBkZWZpbmUgUFlfT0ZGX1RfQ09NUEFUICAgIFB5X3NzaXplX3QKICMgZGVmaW5lIFBZX1BSSWRPRkYgICAgICAgICAiemQiCi0jZWxpZiAoSEFWRV9MT05HX0xPTkcgJiYgU0laRU9GX09GRl9UID09IFNJWkVPRl9MT05HX0xPTkcpCisjZWxpZiAoU0laRU9GX09GRl9UID09IFNJWkVPRl9MT05HX0xPTkcpCiAjIGRlZmluZSBQeUxvbmdfQXNPZmZfdCAgICAgUHlMb25nX0FzTG9uZ0xvbmcKICMgZGVmaW5lIFB5TG9uZ19Gcm9tT2ZmX3QgICBQeUxvbmdfRnJvbUxvbmdMb25nCi0jIGRlZmluZSBQWV9PRkZfVF9NQVggICAgICAgUFlfTExPTkdfTUFYCi0jIGRlZmluZSBQWV9PRkZfVF9NSU4gICAgICAgUFlfTExPTkdfTUlOCi0jIGRlZmluZSBQWV9PRkZfVF9DT01QQVQgICAgUFlfTE9OR19MT05HCisjIGRlZmluZSBQWV9PRkZfVF9NQVggICAgICAgTExPTkdfTUFYCisjIGRlZmluZSBQWV9PRkZfVF9NSU4gICAgICAgTExPTkdfTUlOCisjIGRlZmluZSBQWV9PRkZfVF9DT01QQVQgICAgbG9uZyBsb25nCiAjIGRlZmluZSBQWV9QUklkT0ZGICAgICAgICAgImxsZCIKICNlbGlmIChTSVpFT0ZfT0ZGX1QgPT0gU0laRU9GX0xPTkcpCiAjIGRlZmluZSBQeUxvbmdfQXNPZmZfdCAgICAgUHlMb25nX0FzTG9uZwpAQCAtMTQ1LDYgKzE1MSwxMCBAQAogZXh0ZXJuIF9QeUlPX1N0YXRlICpfUHlJT19nZXRfbW9kdWxlX3N0YXRlKHZvaWQpOwogZXh0ZXJuIFB5T2JqZWN0ICpfUHlJT19nZXRfbG9jYWxlX21vZHVsZShfUHlJT19TdGF0ZSAqKTsKIAorI2lmZGVmIE1TX1dJTkRPV1MKK2V4dGVybiBjaGFyIF9QeUlPX2dldF9jb25zb2xlX3R5cGUoUHlPYmplY3QgKik7CisjZW5kaWYMCisKIGV4dGVybiBQeU9iamVjdCAqX1B5SU9fc3RyX2Nsb3NlOwogZXh0ZXJuIFB5T2JqZWN0ICpfUHlJT19zdHJfY2xvc2VkOwogZXh0ZXJuIFB5T2JqZWN0ICpfUHlJT19zdHJfZGVjb2RlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jIGIvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jCmluZGV4IDZkNjc3NTEuLmNiZTc0MjUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2J1ZmZlcmVkaW8uYworKysgYi9Nb2R1bGVzL19pby9idWZmZXJlZGlvLmMKQEAgLTY1OSw3ICs2NTksNyBAQAogCiAvKiBTZXRzIHRoZSBjdXJyZW50IGVycm9yIHRvIEJsb2NraW5nSU9FcnJvciAqLwogc3RhdGljIHZvaWQKLV9zZXRfQmxvY2tpbmdJT0Vycm9yKGNoYXIgKm1zZywgUHlfc3NpemVfdCB3cml0dGVuKQorX3NldF9CbG9ja2luZ0lPRXJyb3IoY29uc3QgY2hhciAqbXNnLCBQeV9zc2l6ZV90IHdyaXR0ZW4pCiB7CiAgICAgUHlPYmplY3QgKmVycjsKICAgICBQeUVycl9DbGVhcigpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vYnl0ZXNpby5jIGIvTW9kdWxlcy9faW8vYnl0ZXNpby5jCmluZGV4IDllNWQ3OGIuLmExYmExMjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2J5dGVzaW8uYworKysgYi9Nb2R1bGVzL19pby9ieXRlc2lvLmMKQEAgLTg3LDcgKzg3LDcgQEAKIHN0YXRpYyBpbnQKIHVuc2hhcmVfYnVmZmVyKGJ5dGVzaW8gKnNlbGYsIHNpemVfdCBzaXplKQogewotICAgIFB5T2JqZWN0ICpuZXdfYnVmLCAqb2xkX2J1ZjsKKyAgICBQeU9iamVjdCAqbmV3X2J1ZjsKICAgICBhc3NlcnQoU0hBUkVEX0JVRihzZWxmKSk7CiAgICAgYXNzZXJ0KHNlbGYtPmV4cG9ydHMgPT0gMCk7CiAgICAgYXNzZXJ0KHNpemUgPj0gKHNpemVfdClzZWxmLT5zdHJpbmdfc2l6ZSk7CkBAIC05Niw5ICs5Niw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICBtZW1jcHkoUHlCeXRlc19BU19TVFJJTkcobmV3X2J1ZiksIFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYtPmJ1ZiksCiAgICAgICAgICAgIHNlbGYtPnN0cmluZ19zaXplKTsKLSAgICBvbGRfYnVmID0gc2VsZi0+YnVmOwotICAgIHNlbGYtPmJ1ZiA9IG5ld19idWY7Ci0gICAgUHlfREVDUkVGKG9sZF9idWYpOworICAgIFB5X1NFVFJFRihzZWxmLT5idWYsIG5ld19idWYpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9jbGluaWMvX2lvbW9kdWxlLmMuaCBiL01vZHVsZXMvX2lvL2NsaW5pYy9faW9tb2R1bGUuYy5oCmluZGV4IDZjODhlMzIuLjUwODkxYzUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9faW9tb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvX2lvL2NsaW5pYy9faW9tb2R1bGUuYy5oCkBAIC0xMzgsNyArMTM4LDggQEAKIF9pb19vcGVuKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmlsZSIsICJtb2RlIiwgImJ1ZmZlcmluZyIsICJlbmNvZGluZyIsICJlcnJvcnMiLCAibmV3bGluZSIsICJjbG9zZWZkIiwgIm9wZW5lciIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZpbGUiLCAibW9kZSIsICJidWZmZXJpbmciLCAiZW5jb2RpbmciLCAiZXJyb3JzIiwgIm5ld2xpbmUiLCAiY2xvc2VmZCIsICJvcGVuZXIiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfHNpenp6aU86b3BlbiIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKmZpbGU7CiAgICAgY29uc3QgY2hhciAqbW9kZSA9ICJyIjsKICAgICBpbnQgYnVmZmVyaW5nID0gLTE7CkBAIC0xNDgsMTIgKzE0OSwxMyBAQAogICAgIGludCBjbG9zZWZkID0gMTsKICAgICBQeU9iamVjdCAqb3BlbmVyID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98c2l6enppTzpvcGVuIiwgX2tleXdvcmRzLAotICAgICAgICAmZmlsZSwgJm1vZGUsICZidWZmZXJpbmcsICZlbmNvZGluZywgJmVycm9ycywgJm5ld2xpbmUsICZjbG9zZWZkLCAmb3BlbmVyKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZmaWxlLCAmbW9kZSwgJmJ1ZmZlcmluZywgJmVuY29kaW5nLCAmZXJyb3JzLCAmbmV3bGluZSwgJmNsb3NlZmQsICZvcGVuZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX29wZW5faW1wbChtb2R1bGUsIGZpbGUsIG1vZGUsIGJ1ZmZlcmluZywgZW5jb2RpbmcsIGVycm9ycywgbmV3bGluZSwgY2xvc2VmZCwgb3BlbmVyKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJjMmMwMDNjYjdkYWVhZmUgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE0NzY5NjI5MzkxYTMxMzAgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vY2xpbmljL2J1ZmZlcmVkaW8uYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL2J1ZmZlcmVkaW8uYy5oCmluZGV4IDQzN2UyNzUuLjU4MTQ0YTQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9idWZmZXJlZGlvLmMuaAorKysgYi9Nb2R1bGVzL19pby9jbGluaWMvYnVmZmVyZWRpby5jLmgKQEAgLTE5LDE0ICsxOSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50byIsICZidWZmZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19CdWZmZXJlZElPQmFzZV9yZWFkaW50b19pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDgsMTQgKzUwLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8xIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50bzEiLCAmYnVmZmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRJT0Jhc2VfcmVhZGludG8xX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC05OSw4ICsxMDMsOSBAQAogICAgIFB5X3NzaXplX3Qgc2l6ZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnBlZWsiLAotICAgICAgICAmc2l6ZSkpCisgICAgICAgICZzaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcGVla19pbXBsKHNlbGYsIHNpemUpOwogCiBleGl0OgpAQCAtMTI1LDggKzEzMCw5IEBACiAgICAgUHlfc3NpemVfdCBuID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkIiwKLSAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZuKSkKKyAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcmVhZF9pbXBsKHNlbGYsIG4pOwogCiBleGl0OgpAQCAtMTUwLDggKzE1Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBuOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJuOnJlYWQxIiwgJm4pKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAibjpyZWFkMSIsICZuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcmVhZDFfaW1wbChzZWxmLCBuKTsKIAogZXhpdDoKQEAgLTE3NSwxNCArMTgyLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8iLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3JlYWRpbnRvX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMDQsMTQgKzIxMywxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvMSIsICZidWZmZXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8xIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3JlYWRpbnRvMV9pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjM0LDggKzI0NSw5IEBACiAgICAgUHlfc3NpemVfdCBzaXplID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkbGluZSIsCi0gICAgICAgIF9QeUlPX0NvbnZlcnRTc2l6ZV90LCAmc2l6ZSkpCisgICAgICAgIF9QeUlPX0NvbnZlcnRTc2l6ZV90LCAmc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3JlYWRsaW5lX2ltcGwoc2VsZiwgc2l6ZSk7CiAKIGV4aXQ6CkBAIC0yNjEsOCArMjczLDkgQEAKICAgICBpbnQgd2hlbmNlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnNlZWsiLAotICAgICAgICAmdGFyZ2V0b2JqLCAmd2hlbmNlKSkKKyAgICAgICAgJnRhcmdldG9iaiwgJndoZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3NlZWtfaW1wbChzZWxmLCB0YXJnZXRvYmosIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC0yODgsOCArMzAxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRydW5jYXRlIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJnBvcykpCisgICAgICAgICZwb3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19CdWZmZXJlZF90cnVuY2F0ZV9pbXBsKHNlbGYsIHBvcyk7CiAKIGV4aXQ6CkBAIC0zMTAsMTMgKzMyNCwxNSBAQAogX2lvX0J1ZmZlcmVkUmVhZGVyX19faW5pdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBpbnQgcmV0dXJuX3ZhbHVlID0gLTE7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJyYXciLCAiYnVmZmVyX3NpemUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJyYXciLCAiYnVmZmVyX3NpemUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfG46QnVmZmVyZWRSZWFkZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpyYXc7CiAgICAgUHlfc3NpemVfdCBidWZmZXJfc2l6ZSA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfG46QnVmZmVyZWRSZWFkZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZyYXcsICZidWZmZXJfc2l6ZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmcmF3LCAmYnVmZmVyX3NpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J1ZmZlcmVkUmVhZGVyX19faW5pdF9fX2ltcGwoKGJ1ZmZlcmVkICopc2VsZiwgcmF3LCBidWZmZXJfc2l6ZSk7CiAKIGV4aXQ6CkBAIC0zNDEsMTMgKzM1NywxNSBAQAogX2lvX0J1ZmZlcmVkV3JpdGVyX19faW5pdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBpbnQgcmV0dXJuX3ZhbHVlID0gLTE7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJyYXciLCAiYnVmZmVyX3NpemUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJyYXciLCAiYnVmZmVyX3NpemUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfG46QnVmZmVyZWRXcml0ZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpyYXc7CiAgICAgUHlfc3NpemVfdCBidWZmZXJfc2l6ZSA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfG46QnVmZmVyZWRXcml0ZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZyYXcsICZidWZmZXJfc2l6ZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmcmF3LCAmYnVmZmVyX3NpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J1ZmZlcmVkV3JpdGVyX19faW5pdF9fX2ltcGwoKGJ1ZmZlcmVkICopc2VsZiwgcmF3LCBidWZmZXJfc2l6ZSk7CiAKIGV4aXQ6CkBAIC0zNzEsMTQgKzM4OSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjp3cml0ZSIsICZidWZmZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J1ZmZlcmVkV3JpdGVyX3dyaXRlX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00MTAsMTEgKzQzMCwxMyBAQAogICAgIFB5X3NzaXplX3QgYnVmZmVyX3NpemUgPSBERUZBVUxUX0JVRkZFUl9TSVpFOwogCiAgICAgaWYgKChQeV9UWVBFKHNlbGYpID09ICZQeUJ1ZmZlcmVkUldQYWlyX1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiQnVmZmVyZWRSV1BhaXIiLCBrd2FyZ3MpKQorICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIkJ1ZmZlcmVkUldQYWlyIiwga3dhcmdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098bjpCdWZmZXJlZFJXUGFpciIsCi0gICAgICAgICZyZWFkZXIsICZ3cml0ZXIsICZidWZmZXJfc2l6ZSkpCisgICAgICAgICZyZWFkZXIsICZ3cml0ZXIsICZidWZmZXJfc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnVmZmVyZWRSV1BhaXJfX19pbml0X19faW1wbCgocndwYWlyICopc2VsZiwgcmVhZGVyLCB3cml0ZXIsIGJ1ZmZlcl9zaXplKTsKIAogZXhpdDoKQEAgLTQzOSwxNiArNDYxLDE4IEBACiBfaW9fQnVmZmVyZWRSYW5kb21fX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InJhdyIsICJidWZmZXJfc2l6ZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InJhdyIsICJidWZmZXJfc2l6ZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98bjpCdWZmZXJlZFJhbmRvbSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnJhdzsKICAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplID0gREVGQVVMVF9CVUZGRVJfU0laRTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98bjpCdWZmZXJlZFJhbmRvbSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnJhdywgJmJ1ZmZlcl9zaXplKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZyYXcsICZidWZmZXJfc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnVmZmVyZWRSYW5kb21fX19pbml0X19faW1wbCgoYnVmZmVyZWQgKilzZWxmLCByYXcsIGJ1ZmZlcl9zaXplKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJiYmI1ZTIzOWI0ZmZlNmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE5NTZmMzk0ZWNkZTRjZjkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vY2xpbmljL2J5dGVzaW8uYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL2J5dGVzaW8uYy5oCmluZGV4IDVmMmFiYjAuLmM2NGNlNWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9ieXRlc2lvLmMuaAorKysgYi9Nb2R1bGVzL19pby9jbGluaWMvYnl0ZXNpby5jLmgKQEAgLTE3MSw4ICsxNzEsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZhcmcpKQorICAgICAgICAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CeXRlc0lPX3JlYWRfaW1wbChzZWxmLCBhcmcpOwogCiBleGl0OgpAQCAtMjE1LDggKzIxNiw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkbGluZSIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZhcmcpKQorICAgICAgICAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CeXRlc0lPX3JlYWRsaW5lX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTI0Nyw4ICsyNDksOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZGxpbmVzIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmFyZykpCisgICAgICAgICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J5dGVzSU9fcmVhZGxpbmVzX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTI3NiwxNCArMjc5LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8iLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnl0ZXNJT19yZWFkaW50b19pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzExLDggKzMxNiw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0cnVuY2F0ZSIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZhcmcpKQorICAgICAgICAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CeXRlc0lPX3RydW5jYXRlX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTM0NSw4ICszNTEsOSBAQAogICAgIGludCB3aGVuY2UgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGk6c2VlayIsCi0gICAgICAgICZwb3MsICZ3aGVuY2UpKQorICAgICAgICAmcG9zLCAmd2hlbmNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CeXRlc0lPX3NlZWtfaW1wbChzZWxmLCBwb3MsIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC00MDgsMTUgKzQxNSwxNyBAQAogX2lvX0J5dGVzSU9fX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImluaXRpYWxfYnl0ZXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJpbml0aWFsX2J5dGVzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE86Qnl0ZXNJTyIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKmluaXR2YWx1ZSA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TzpCeXRlc0lPIiwgX2tleXdvcmRzLAotICAgICAgICAmaW5pdHZhbHVlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZpbml0dmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J5dGVzSU9fX19pbml0X19faW1wbCgoYnl0ZXNpbyAqKXNlbGYsIGluaXR2YWx1ZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02MGNlMmM2MjcyNzE4NDMxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02MzgyZThlYjU3OGVlYTY0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2NsaW5pYy9maWxlaW8uYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL2ZpbGVpby5jLmgKaW5kZXggMTA0MjAwOC4uOTA4ZmUwZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vY2xpbmljL2ZpbGVpby5jLmgKKysrIGIvTW9kdWxlcy9faW8vY2xpbmljL2ZpbGVpby5jLmgKQEAgLTQ5LDE1ICs0OSwxNyBAQAogX2lvX0ZpbGVJT19fX2luaXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgaW50IHJldHVybl92YWx1ZSA9IC0xOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmlsZSIsICJtb2RlIiwgImNsb3NlZmQiLCAib3BlbmVyIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZmlsZSIsICJtb2RlIiwgImNsb3NlZmQiLCAib3BlbmVyIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3xzaU86RmlsZUlPIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqbmFtZW9iajsKICAgICBjb25zdCBjaGFyICptb2RlID0gInIiOwogICAgIGludCBjbG9zZWZkID0gMTsKICAgICBQeU9iamVjdCAqb3BlbmVyID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98c2lPOkZpbGVJTyIsIF9rZXl3b3JkcywKLSAgICAgICAgJm5hbWVvYmosICZtb2RlLCAmY2xvc2VmZCwgJm9wZW5lcikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmbmFtZW9iaiwgJm1vZGUsICZjbG9zZWZkLCAmb3BlbmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19GaWxlSU9fX19pbml0X19faW1wbCgoZmlsZWlvICopc2VsZiwgbmFtZW9iaiwgbW9kZSwgY2xvc2VmZCwgb3BlbmVyKTsKIAogZXhpdDoKQEAgLTE1NCwxNCArMTU2LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8iLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fRmlsZUlPX3JlYWRpbnRvX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMTAsOCArMjE0LDkgQEAKICAgICBQeV9zc2l6ZV90IHNpemUgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8mOnJlYWQiLAotICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJnNpemUpKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0ZpbGVJT19yZWFkX2ltcGwoc2VsZiwgc2l6ZSk7CiAKIGV4aXQ6CkBAIC0yNDAsMTQgKzI0NSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBiID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjp3cml0ZSIsICZiKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0ZpbGVJT193cml0ZV9pbXBsKHNlbGYsICZiKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBiICovCi0gICAgaWYgKGIub2JqKQorICAgIGlmIChiLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yODAsOCArMjg3LDkgQEAKICAgICBpbnQgd2hlbmNlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnNlZWsiLAotICAgICAgICAmcG9zLCAmd2hlbmNlKSkKKyAgICAgICAgJnBvcywgJndoZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fRmlsZUlPX3NlZWtfaW1wbChzZWxmLCBwb3MsIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC0zMzMsOCArMzQxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRydW5jYXRlIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJnBvc29iaikpCisgICAgICAgICZwb3NvYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0ZpbGVJT190cnVuY2F0ZV9pbXBsKHNlbGYsIHBvc29iaik7CiAKIGV4aXQ6CkBAIC0zNjQsNCArMzczLDQgQEAKICNpZm5kZWYgX0lPX0ZJTEVJT19UUlVOQ0FURV9NRVRIT0RERUYKICAgICAjZGVmaW5lIF9JT19GSUxFSU9fVFJVTkNBVEVfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX0lPX0ZJTEVJT19UUlVOQ0FURV9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGNiYzM5YjQ2NjU5ODQ5MiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTE5MjRiYzBlZTExZDU4ZSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9jbGluaWMvaW9iYXNlLmMuaCBiL01vZHVsZXMvX2lvL2NsaW5pYy9pb2Jhc2UuYy5oCmluZGV4IDk3NjJmMTEuLmVkYmY3M2EgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9pb2Jhc2UuYy5oCisrKyBiL01vZHVsZXMvX2lvL2NsaW5pYy9pb2Jhc2UuYy5oCkBAIC0xODYsOCArMTg2LDkgQEAKICAgICBQeV9zc2l6ZV90IGxpbWl0ID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkbGluZSIsCi0gICAgICAgIF9QeUlPX0NvbnZlcnRTc2l6ZV90LCAmbGltaXQpKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJmxpbWl0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fSU9CYXNlX3JlYWRsaW5lX2ltcGwoc2VsZiwgbGltaXQpOwogCiBleGl0OgpAQCAtMjE3LDggKzIxOCw5IEBACiAgICAgUHlfc3NpemVfdCBoaW50ID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkbGluZXMiLAotICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJmhpbnQpKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJmhpbnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19JT0Jhc2VfcmVhZGxpbmVzX2ltcGwoc2VsZiwgaGludCk7CiAKIGV4aXQ6CkBAIC0yNTEsOCArMjUzLDkgQEAKICAgICBQeV9zc2l6ZV90IG4gPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cmVhZCIsCi0gICAgICAgICZuKSkKKyAgICAgICAgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19SYXdJT0Jhc2VfcmVhZF9pbXBsKHNlbGYsIG4pOwogCiBleGl0OgpAQCAtMjc2LDQgKzI3OSw0IEBACiB7CiAgICAgcmV0dXJuIF9pb19fUmF3SU9CYXNlX3JlYWRhbGxfaW1wbChzZWxmKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iODc0OTUyZjVjYzI0OGE0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wZjUzZmVkOTI4ZDhlMDJmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2NsaW5pYy9zdHJpbmdpby5jLmggYi9Nb2R1bGVzL19pby9jbGluaWMvc3RyaW5naW8uYy5oCmluZGV4IGE4ZTMyYTMuLmQyYzA1ZDcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9zdHJpbmdpby5jLmgKKysrIGIvTW9kdWxlcy9faW8vY2xpbmljL3N0cmluZ2lvLmMuaApAQCAtNjEsOCArNjEsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZhcmcpKQorICAgICAgICAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19TdHJpbmdJT19yZWFkX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTkxLDggKzkyLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmFyZykpCisgICAgICAgICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1N0cmluZ0lPX3JlYWRsaW5lX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTEyMyw4ICsxMjUsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJ1bmNhdGUiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYXJnKSkKKyAgICAgICAgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fU3RyaW5nSU9fdHJ1bmNhdGVfaW1wbChzZWxmLCBhcmcpOwogCiBleGl0OgpAQCAtMTU3LDggKzE2MCw5IEBACiAgICAgaW50IHdoZW5jZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58aTpzZWVrIiwKLSAgICAgICAgJnBvcywgJndoZW5jZSkpCisgICAgICAgICZwb3MsICZ3aGVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1N0cmluZ0lPX3NlZWtfaW1wbChzZWxmLCBwb3MsIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC0yMTcsMTMgKzIyMSwxNSBAQAogX2lvX1N0cmluZ0lPX19faW5pdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBpbnQgcmV0dXJuX3ZhbHVlID0gLTE7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJpbml0aWFsX3ZhbHVlIiwgIm5ld2xpbmUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJpbml0aWFsX3ZhbHVlIiwgIm5ld2xpbmUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T086U3RyaW5nSU8iLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICp2YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5ld2xpbmVfb2JqID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPTzpTdHJpbmdJTyIsIF9rZXl3b3JkcywKLSAgICAgICAgJnZhbHVlLCAmbmV3bGluZV9vYmopKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnZhbHVlLCAmbmV3bGluZV9vYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1N0cmluZ0lPX19faW5pdF9fX2ltcGwoKHN0cmluZ2lvICopc2VsZiwgdmFsdWUsIG5ld2xpbmVfb2JqKTsKIAogZXhpdDoKQEAgLTI4Myw0ICsyODksNCBAQAogewogICAgIHJldHVybiBfaW9fU3RyaW5nSU9fc2Vla2FibGVfaW1wbChzZWxmKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mMDYxY2YzYTIwY2QxNGVkIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01ZGQ1YzJhMjEzZTc1NDA1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2NsaW5pYy90ZXh0aW8uYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL3RleHRpby5jLmgKaW5kZXggZGM3ZThjNy4uNmM0MDgxOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vY2xpbmljL3RleHRpby5jLmgKKysrIGIvTW9kdWxlcy9faW8vY2xpbmljL3RleHRpby5jLmgKQEAgLTI0LDE0ICsyNCwxNiBAQAogX2lvX0luY3JlbWVudGFsTmV3bGluZURlY29kZXJfX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImRlY29kZXIiLCAidHJhbnNsYXRlIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImRlY29kZXIiLCAidHJhbnNsYXRlIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik9pfE86SW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlciIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKmRlY29kZXI7CiAgICAgaW50IHRyYW5zbGF0ZTsKICAgICBQeU9iamVjdCAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9pfE86SW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJmRlY29kZXIsICZ0cmFuc2xhdGUsICZlcnJvcnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmRlY29kZXIsICZ0cmFuc2xhdGUsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0luY3JlbWVudGFsTmV3bGluZURlY29kZXJfX19pbml0X19faW1wbCgobmxkZWNvZGVyX29iamVjdCAqKXNlbGYsIGRlY29kZXIsIHRyYW5zbGF0ZSwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTU0LDEzICs1NiwxNSBAQAogX2lvX0luY3JlbWVudGFsTmV3bGluZURlY29kZXJfZGVjb2RlKG5sZGVjb2Rlcl9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiaW5wdXQiLCAiZmluYWwiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJpbnB1dCIsICJmaW5hbCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98aTpkZWNvZGUiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICppbnB1dDsKICAgICBpbnQgZmluYWwgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xpOmRlY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmlucHV0LCAmZmluYWwpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmlucHV0LCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0luY3JlbWVudGFsTmV3bGluZURlY29kZXJfZGVjb2RlX2ltcGwoc2VsZiwgaW5wdXQsIGZpbmFsKTsKIAogZXhpdDoKQEAgLTE1Myw3ICsxNTcsOCBAQAogX2lvX1RleHRJT1dyYXBwZXJfX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImJ1ZmZlciIsICJlbmNvZGluZyIsICJlcnJvcnMiLCAibmV3bGluZSIsICJsaW5lX2J1ZmZlcmluZyIsICJ3cml0ZV90aHJvdWdoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiYnVmZmVyIiwgImVuY29kaW5nIiwgImVycm9ycyIsICJuZXdsaW5lIiwgImxpbmVfYnVmZmVyaW5nIiwgIndyaXRlX3Rocm91Z2giLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfHp6emlpOlRleHRJT1dyYXBwZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpidWZmZXI7CiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CkBAIC0xNjEsOSArMTY2LDEwIEBACiAgICAgaW50IGxpbmVfYnVmZmVyaW5nID0gMDsKICAgICBpbnQgd3JpdGVfdGhyb3VnaCA9IDA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHp6emlpOlRleHRJT1dyYXBwZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZidWZmZXIsICZlbmNvZGluZywgJmVycm9ycywgJm5ld2xpbmUsICZsaW5lX2J1ZmZlcmluZywgJndyaXRlX3Rocm91Z2gpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmJ1ZmZlciwgJmVuY29kaW5nLCAmZXJyb3JzLCAmbmV3bGluZSwgJmxpbmVfYnVmZmVyaW5nLCAmd3JpdGVfdGhyb3VnaCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fVGV4dElPV3JhcHBlcl9fX2luaXRfX19pbXBsKCh0ZXh0aW8gKilzZWxmLCBidWZmZXIsIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsIGxpbmVfYnVmZmVyaW5nLCB3cml0ZV90aHJvdWdoKTsKIAogZXhpdDoKQEAgLTIwNCw4ICsyMTAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICp0ZXh0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOndyaXRlIiwgJnRleHQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTp3cml0ZSIsICZ0ZXh0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19UZXh0SU9XcmFwcGVyX3dyaXRlX2ltcGwoc2VsZiwgdGV4dCk7CiAKIGV4aXQ6CkBAIC0yMzAsOCArMjM3LDkgQEAKICAgICBQeV9zc2l6ZV90IG4gPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8mOnJlYWQiLAotICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJm4pKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1RleHRJT1dyYXBwZXJfcmVhZF9pbXBsKHNlbGYsIG4pOwogCiBleGl0OgpAQCAtMjU2LDggKzI2NCw5IEBACiAgICAgUHlfc3NpemVfdCBzaXplID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnJlYWRsaW5lIiwKLSAgICAgICAgJnNpemUpKQorICAgICAgICAmc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fVGV4dElPV3JhcHBlcl9yZWFkbGluZV9pbXBsKHNlbGYsIHNpemUpOwogCiBleGl0OgpAQCAtMjgzLDggKzI5Miw5IEBACiAgICAgaW50IHdoZW5jZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpzZWVrIiwKLSAgICAgICAgJmNvb2tpZU9iaiwgJndoZW5jZSkpCisgICAgICAgICZjb29raWVPYmosICZ3aGVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1RleHRJT1dyYXBwZXJfc2Vla19pbXBsKHNlbGYsIGNvb2tpZU9iaiwgd2hlbmNlKTsKIAogZXhpdDoKQEAgLTMyNyw4ICszMzcsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJ1bmNhdGUiLAogICAgICAgICAwLCAxLAotICAgICAgICAmcG9zKSkKKyAgICAgICAgJnBvcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fVGV4dElPV3JhcHBlcl90cnVuY2F0ZV9pbXBsKHNlbGYsIHBvcyk7CiAKIGV4aXQ6CkBAIC00NTMsNCArNDY0LDQgQEAKIHsKICAgICByZXR1cm4gX2lvX1RleHRJT1dyYXBwZXJfY2xvc2VfaW1wbChzZWxmKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02OTA2MDhmODVhYWI4YmE1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03ZWM2MjRhOWJmNjM5M2Y1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2NsaW5pYy93aW5jb25zb2xlaW8uYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL3dpbmNvbnNvbGVpby5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0ZmNiYgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2lvL2NsaW5pYy93aW5jb25zb2xlaW8uYy5oCkBAIC0wLDAgKzEsMzMxIEBACisvKltjbGluaWMgaW5wdXRdCitwcmVzZXJ2ZQorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKQorCitQeURvY19TVFJWQVIoX2lvX19XaW5kb3dzQ29uc29sZUlPX2Nsb3NlX19kb2NfXywKKyJjbG9zZSgkc2VsZiwgLylcbiIKKyItLVxuIgorIlxuIgorIkNsb3NlIHRoZSBoYW5kbGUuXG4iCisiXG4iCisiQSBjbG9zZWQgaGFuZGxlIGNhbm5vdCBiZSB1c2VkIGZvciBmdXJ0aGVyIEkvTyBvcGVyYXRpb25zLiAgY2xvc2UoKSBtYXkgYmVcbiIKKyJjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aG91dCBlcnJvci4iKTsKKworI2RlZmluZSBfSU9fX1dJTkRPV1NDT05TT0xFSU9fQ0xPU0VfTUVUSE9EREVGICAgIFwKKyAgICB7ImNsb3NlIiwgKFB5Q0Z1bmN0aW9uKV9pb19fV2luZG93c0NvbnNvbGVJT19jbG9zZSwgTUVUSF9OT0FSR1MsIF9pb19fV2luZG93c0NvbnNvbGVJT19jbG9zZV9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorX2lvX19XaW5kb3dzQ29uc29sZUlPX2Nsb3NlX2ltcGwod2luY29uc29sZWlvICpzZWxmKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19pb19fV2luZG93c0NvbnNvbGVJT19jbG9zZSh3aW5jb25zb2xlaW8gKnNlbGYsIFB5T2JqZWN0ICpQeV9VTlVTRUQoaWdub3JlZCkpCit7CisgICAgcmV0dXJuIF9pb19fV2luZG93c0NvbnNvbGVJT19jbG9zZV9pbXBsKHNlbGYpOworfQorCisjZW5kaWYgLyogZGVmaW5lZChNU19XSU5ET1dTKSAqLworCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKQorCitQeURvY19TVFJWQVIoX2lvX19XaW5kb3dzQ29uc29sZUlPX19faW5pdF9fX19kb2NfXywKKyJfV2luZG93c0NvbnNvbGVJTyhmaWxlLCBtb2RlPVwnclwnLCBjbG9zZWZkPVRydWUsIG9wZW5lcj1Ob25lKVxuIgorIi0tXG4iCisiXG4iCisiT3BlbiBhIGNvbnNvbGUgYnVmZmVyIGJ5IGZpbGUgZGVzY3JpcHRvci5cbiIKKyJcbiIKKyJUaGUgbW9kZSBjYW4gYmUgXCdyYlwnIChkZWZhdWx0KSwgb3IgXCd3YlwnIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgYnl0ZXMuIEFsbFxuIgorIm90aGVyIG1vZGUgY2hhcmFjdGVycyB3aWxsIGJlIGlnbm9yZWQuIE1vZGUgXCdiXCcgd2lsbCBiZSBhc3N1bWVkIGlmIGl0IGlzXG4iCisib21pdHRlZC4gVGhlICpvcGVuZXIqIHBhcmFtZXRlciBpcyBhbHdheXMgaWdub3JlZC4iKTsKKworc3RhdGljIGludAorX2lvX19XaW5kb3dzQ29uc29sZUlPX19faW5pdF9fX2ltcGwod2luY29uc29sZWlvICpzZWxmLCBQeU9iamVjdCAqbmFtZW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGUsIGludCBjbG9zZWZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9wZW5lcik7CisKK3N0YXRpYyBpbnQKK19pb19fV2luZG93c0NvbnNvbGVJT19fX2luaXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgICAgaW50IHJldHVybl92YWx1ZSA9IC0xOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZpbGUiLCAibW9kZSIsICJjbG9zZWZkIiwgIm9wZW5lciIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98c2lPOl9XaW5kb3dzQ29uc29sZUlPIiwgX2tleXdvcmRzLCAwfTsKKyAgICBQeU9iamVjdCAqbmFtZW9iajsKKyAgICBjb25zdCBjaGFyICptb2RlID0gInIiOworICAgIGludCBjbG9zZWZkID0gMTsKKyAgICBQeU9iamVjdCAqb3BlbmVyID0gUHlfTm9uZTsKKworICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJm5hbWVvYmosICZtb2RlLCAmY2xvc2VmZCwgJm9wZW5lcikpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBfaW9fX1dpbmRvd3NDb25zb2xlSU9fX19pbml0X19faW1wbCgod2luY29uc29sZWlvICopc2VsZiwgbmFtZW9iaiwgbW9kZSwgY2xvc2VmZCwgb3BlbmVyKTsKKworZXhpdDoKKyAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOworfQorCisjZW5kaWYgLyogZGVmaW5lZChNU19XSU5ET1dTKSAqLworCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKQorCitQeURvY19TVFJWQVIoX2lvX19XaW5kb3dzQ29uc29sZUlPX2ZpbGVub19fZG9jX18sCisiZmlsZW5vKCRzZWxmLCAvKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGZpbGUgZGVzY3JpcHRvciAoYW4gaW50ZWdlcikuXG4iCisiXG4iCisiZmlsZW5vIGlzIG9ubHkgc2V0IHdoZW4gYSBmaWxlIGRlc2NyaXB0b3IgaXMgdXNlZCB0byBvcGVuXG4iCisib25lIG9mIHRoZSBzdGFuZGFyZCBzdHJlYW1zLiIpOworCisjZGVmaW5lIF9JT19fV0lORE9XU0NPTlNPTEVJT19GSUxFTk9fTUVUSE9EREVGICAgIFwKKyAgICB7ImZpbGVubyIsIChQeUNGdW5jdGlvbilfaW9fX1dpbmRvd3NDb25zb2xlSU9fZmlsZW5vLCBNRVRIX05PQVJHUywgX2lvX19XaW5kb3dzQ29uc29sZUlPX2ZpbGVub19fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorX2lvX19XaW5kb3dzQ29uc29sZUlPX2ZpbGVub19pbXBsKHdpbmNvbnNvbGVpbyAqc2VsZik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitfaW9fX1dpbmRvd3NDb25zb2xlSU9fZmlsZW5vKHdpbmNvbnNvbGVpbyAqc2VsZiwgUHlPYmplY3QgKlB5X1VOVVNFRChpZ25vcmVkKSkKK3sKKyAgICByZXR1cm4gX2lvX19XaW5kb3dzQ29uc29sZUlPX2ZpbGVub19pbXBsKHNlbGYpOworfQorCisjZW5kaWYgLyogZGVmaW5lZChNU19XSU5ET1dTKSAqLworCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKQorCitQeURvY19TVFJWQVIoX2lvX19XaW5kb3dzQ29uc29sZUlPX3JlYWRhYmxlX19kb2NfXywKKyJyZWFkYWJsZSgkc2VsZiwgLylcbiIKKyItLVxuIgorIlxuIgorIlRydWUgaWYgY29uc29sZSBpcyBhbiBpbnB1dCBidWZmZXIuIik7CisKKyNkZWZpbmUgX0lPX19XSU5ET1dTQ09OU09MRUlPX1JFQURBQkxFX01FVEhPRERFRiAgICBcCisgICAgeyJyZWFkYWJsZSIsIChQeUNGdW5jdGlvbilfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZGFibGUsIE1FVEhfTk9BUkdTLCBfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZGFibGVfX2RvY19ffSwKKworc3RhdGljIFB5T2JqZWN0ICoKK19pb19fV2luZG93c0NvbnNvbGVJT19yZWFkYWJsZV9pbXBsKHdpbmNvbnNvbGVpbyAqc2VsZik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZGFibGUod2luY29uc29sZWlvICpzZWxmLCBQeU9iamVjdCAqUHlfVU5VU0VEKGlnbm9yZWQpKQoreworICAgIHJldHVybiBfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZGFibGVfaW1wbChzZWxmKTsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoTVNfV0lORE9XUykgKi8KKworI2lmIGRlZmluZWQoTVNfV0lORE9XUykKKworUHlEb2NfU1RSVkFSKF9pb19fV2luZG93c0NvbnNvbGVJT193cml0YWJsZV9fZG9jX18sCisid3JpdGFibGUoJHNlbGYsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJUcnVlIGlmIGNvbnNvbGUgaXMgYW4gb3V0cHV0IGJ1ZmZlci4iKTsKKworI2RlZmluZSBfSU9fX1dJTkRPV1NDT05TT0xFSU9fV1JJVEFCTEVfTUVUSE9EREVGICAgIFwKKyAgICB7IndyaXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKV9pb19fV2luZG93c0NvbnNvbGVJT193cml0YWJsZSwgTUVUSF9OT0FSR1MsIF9pb19fV2luZG93c0NvbnNvbGVJT193cml0YWJsZV9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorX2lvX19XaW5kb3dzQ29uc29sZUlPX3dyaXRhYmxlX2ltcGwod2luY29uc29sZWlvICpzZWxmKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19pb19fV2luZG93c0NvbnNvbGVJT193cml0YWJsZSh3aW5jb25zb2xlaW8gKnNlbGYsIFB5T2JqZWN0ICpQeV9VTlVTRUQoaWdub3JlZCkpCit7CisgICAgcmV0dXJuIF9pb19fV2luZG93c0NvbnNvbGVJT193cml0YWJsZV9pbXBsKHNlbGYpOworfQorCisjZW5kaWYgLyogZGVmaW5lZChNU19XSU5ET1dTKSAqLworCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKQorCitQeURvY19TVFJWQVIoX2lvX19XaW5kb3dzQ29uc29sZUlPX3JlYWRpbnRvX19kb2NfXywKKyJyZWFkaW50bygkc2VsZiwgYnVmZmVyLCAvKVxuIgorIi0tXG4iCisiXG4iCisiU2FtZSBhcyBSYXdJT0Jhc2UucmVhZGludG8oKS4iKTsKKworI2RlZmluZSBfSU9fX1dJTkRPV1NDT05TT0xFSU9fUkVBRElOVE9fTUVUSE9EREVGICAgIFwKKyAgICB7InJlYWRpbnRvIiwgKFB5Q0Z1bmN0aW9uKV9pb19fV2luZG93c0NvbnNvbGVJT19yZWFkaW50bywgTUVUSF9PLCBfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZGludG9fX2RvY19ffSwKKworc3RhdGljIFB5T2JqZWN0ICoKK19pb19fV2luZG93c0NvbnNvbGVJT19yZWFkaW50b19pbXBsKHdpbmNvbnNvbGVpbyAqc2VsZiwgUHlfYnVmZmVyICpidWZmZXIpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2lvX19XaW5kb3dzQ29uc29sZUlPX3JlYWRpbnRvKHdpbmNvbnNvbGVpbyAqc2VsZiwgUHlPYmplY3QgKmFyZykKK3sKKyAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBQeV9idWZmZXIgYnVmZmVyID0ge05VTEwsIE5VTEx9OworCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50byIsICZidWZmZXIpKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19XaW5kb3dzQ29uc29sZUlPX3JlYWRpbnRvX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CisKK2V4aXQ6CisgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KKworICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKE1TX1dJTkRPV1MpICovCisKKyNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCisKK1B5RG9jX1NUUlZBUihfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZGFsbF9fZG9jX18sCisicmVhZGFsbCgkc2VsZiwgLylcbiIKKyItLVxuIgorIlxuIgorIlJlYWQgYWxsIGRhdGEgZnJvbSB0aGUgY29uc29sZSwgcmV0dXJuZWQgYXMgYnl0ZXMuXG4iCisiXG4iCisiUmV0dXJuIGFuIGVtcHR5IGJ5dGVzIG9iamVjdCBhdCBFT0YuIik7CisKKyNkZWZpbmUgX0lPX19XSU5ET1dTQ09OU09MRUlPX1JFQURBTExfTUVUSE9EREVGICAgIFwKKyAgICB7InJlYWRhbGwiLCAoUHlDRnVuY3Rpb24pX2lvX19XaW5kb3dzQ29uc29sZUlPX3JlYWRhbGwsIE1FVEhfTk9BUkdTLCBfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZGFsbF9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorX2lvX19XaW5kb3dzQ29uc29sZUlPX3JlYWRhbGxfaW1wbCh3aW5jb25zb2xlaW8gKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2lvX19XaW5kb3dzQ29uc29sZUlPX3JlYWRhbGwod2luY29uc29sZWlvICpzZWxmLCBQeU9iamVjdCAqUHlfVU5VU0VEKGlnbm9yZWQpKQoreworICAgIHJldHVybiBfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZGFsbF9pbXBsKHNlbGYpOworfQorCisjZW5kaWYgLyogZGVmaW5lZChNU19XSU5ET1dTKSAqLworCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKQorCitQeURvY19TVFJWQVIoX2lvX19XaW5kb3dzQ29uc29sZUlPX3JlYWRfX2RvY19fLAorInJlYWQoJHNlbGYsIHNpemU9LTEsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJSZWFkIGF0IG1vc3Qgc2l6ZSBieXRlcywgcmV0dXJuZWQgYXMgYnl0ZXMuXG4iCisiXG4iCisiT25seSBtYWtlcyBvbmUgc3lzdGVtIGNhbGwgd2hlbiBzaXplIGlzIGEgcG9zaXRpdmUgaW50ZWdlcixcbiIKKyJzbyBsZXNzIGRhdGEgbWF5IGJlIHJldHVybmVkIHRoYW4gcmVxdWVzdGVkLlxuIgorIlJldHVybiBhbiBlbXB0eSBieXRlcyBvYmplY3QgYXQgRU9GLiIpOworCisjZGVmaW5lIF9JT19fV0lORE9XU0NPTlNPTEVJT19SRUFEX01FVEhPRERFRiAgICBcCisgICAgeyJyZWFkIiwgKFB5Q0Z1bmN0aW9uKV9pb19fV2luZG93c0NvbnNvbGVJT19yZWFkLCBNRVRIX1ZBUkFSR1MsIF9pb19fV2luZG93c0NvbnNvbGVJT19yZWFkX19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZF9pbXBsKHdpbmNvbnNvbGVpbyAqc2VsZiwgUHlfc3NpemVfdCBzaXplKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19pb19fV2luZG93c0NvbnNvbGVJT19yZWFkKHdpbmNvbnNvbGVpbyAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBzaXplID0gLTE7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkIiwKKyAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZzaXplKSkgeworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIHJldHVybl92YWx1ZSA9IF9pb19fV2luZG93c0NvbnNvbGVJT19yZWFkX2ltcGwoc2VsZiwgc2l6ZSk7CisKK2V4aXQ6CisgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoTVNfV0lORE9XUykgKi8KKworI2lmIGRlZmluZWQoTVNfV0lORE9XUykKKworUHlEb2NfU1RSVkFSKF9pb19fV2luZG93c0NvbnNvbGVJT193cml0ZV9fZG9jX18sCisid3JpdGUoJHNlbGYsIGIsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJXcml0ZSBidWZmZXIgYiB0byBmaWxlLCByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uXG4iCisiXG4iCisiT25seSBtYWtlcyBvbmUgc3lzdGVtIGNhbGwsIHNvIG5vdCBhbGwgb2YgdGhlIGRhdGEgbWF5IGJlIHdyaXR0ZW4uXG4iCisiVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuIGlzIHJldHVybmVkLiIpOworCisjZGVmaW5lIF9JT19fV0lORE9XU0NPTlNPTEVJT19XUklURV9NRVRIT0RERUYgICAgXAorICAgIHsid3JpdGUiLCAoUHlDRnVuY3Rpb24pX2lvX19XaW5kb3dzQ29uc29sZUlPX3dyaXRlLCBNRVRIX08sIF9pb19fV2luZG93c0NvbnNvbGVJT193cml0ZV9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorX2lvX19XaW5kb3dzQ29uc29sZUlPX3dyaXRlX2ltcGwod2luY29uc29sZWlvICpzZWxmLCBQeV9idWZmZXIgKmIpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2lvX19XaW5kb3dzQ29uc29sZUlPX3dyaXRlKHdpbmNvbnNvbGVpbyAqc2VsZiwgUHlPYmplY3QgKmFyZykKK3sKKyAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBQeV9idWZmZXIgYiA9IHtOVUxMLCBOVUxMfTsKKworICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6d3JpdGUiLCAmYikpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBfaW9fX1dpbmRvd3NDb25zb2xlSU9fd3JpdGVfaW1wbChzZWxmLCAmYik7CisKK2V4aXQ6CisgICAgLyogQ2xlYW51cCBmb3IgYiAqLworICAgIGlmIChiLm9iaikgeworICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmIpOworICAgIH0KKworICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKE1TX1dJTkRPV1MpICovCisKKyNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCisKK1B5RG9jX1NUUlZBUihfaW9fX1dpbmRvd3NDb25zb2xlSU9faXNhdHR5X19kb2NfXywKKyJpc2F0dHkoJHNlbGYsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJBbHdheXMgVHJ1ZS4iKTsKKworI2RlZmluZSBfSU9fX1dJTkRPV1NDT05TT0xFSU9fSVNBVFRZX01FVEhPRERFRiAgICBcCisgICAgeyJpc2F0dHkiLCAoUHlDRnVuY3Rpb24pX2lvX19XaW5kb3dzQ29uc29sZUlPX2lzYXR0eSwgTUVUSF9OT0FSR1MsIF9pb19fV2luZG93c0NvbnNvbGVJT19pc2F0dHlfX2RvY19ffSwKKworc3RhdGljIFB5T2JqZWN0ICoKK19pb19fV2luZG93c0NvbnNvbGVJT19pc2F0dHlfaW1wbCh3aW5jb25zb2xlaW8gKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2lvX19XaW5kb3dzQ29uc29sZUlPX2lzYXR0eSh3aW5jb25zb2xlaW8gKnNlbGYsIFB5T2JqZWN0ICpQeV9VTlVTRUQoaWdub3JlZCkpCit7CisgICAgcmV0dXJuIF9pb19fV2luZG93c0NvbnNvbGVJT19pc2F0dHlfaW1wbChzZWxmKTsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoTVNfV0lORE9XUykgKi8KKworI2lmbmRlZiBfSU9fX1dJTkRPV1NDT05TT0xFSU9fQ0xPU0VfTUVUSE9EREVGCisgICAgI2RlZmluZSBfSU9fX1dJTkRPV1NDT05TT0xFSU9fQ0xPU0VfTUVUSE9EREVGCisjZW5kaWYgLyogIWRlZmluZWQoX0lPX19XSU5ET1dTQ09OU09MRUlPX0NMT1NFX01FVEhPRERFRikgKi8KKworI2lmbmRlZiBfSU9fX1dJTkRPV1NDT05TT0xFSU9fRklMRU5PX01FVEhPRERFRgorICAgICNkZWZpbmUgX0lPX19XSU5ET1dTQ09OU09MRUlPX0ZJTEVOT19NRVRIT0RERUYKKyNlbmRpZiAvKiAhZGVmaW5lZChfSU9fX1dJTkRPV1NDT05TT0xFSU9fRklMRU5PX01FVEhPRERFRikgKi8KKworI2lmbmRlZiBfSU9fX1dJTkRPV1NDT05TT0xFSU9fUkVBREFCTEVfTUVUSE9EREVGCisgICAgI2RlZmluZSBfSU9fX1dJTkRPV1NDT05TT0xFSU9fUkVBREFCTEVfTUVUSE9EREVGCisjZW5kaWYgLyogIWRlZmluZWQoX0lPX19XSU5ET1dTQ09OU09MRUlPX1JFQURBQkxFX01FVEhPRERFRikgKi8KKworI2lmbmRlZiBfSU9fX1dJTkRPV1NDT05TT0xFSU9fV1JJVEFCTEVfTUVUSE9EREVGCisgICAgI2RlZmluZSBfSU9fX1dJTkRPV1NDT05TT0xFSU9fV1JJVEFCTEVfTUVUSE9EREVGCisjZW5kaWYgLyogIWRlZmluZWQoX0lPX19XSU5ET1dTQ09OU09MRUlPX1dSSVRBQkxFX01FVEhPRERFRikgKi8KKworI2lmbmRlZiBfSU9fX1dJTkRPV1NDT05TT0xFSU9fUkVBRElOVE9fTUVUSE9EREVGCisgICAgI2RlZmluZSBfSU9fX1dJTkRPV1NDT05TT0xFSU9fUkVBRElOVE9fTUVUSE9EREVGCisjZW5kaWYgLyogIWRlZmluZWQoX0lPX19XSU5ET1dTQ09OU09MRUlPX1JFQURJTlRPX01FVEhPRERFRikgKi8KKworI2lmbmRlZiBfSU9fX1dJTkRPV1NDT05TT0xFSU9fUkVBREFMTF9NRVRIT0RERUYKKyAgICAjZGVmaW5lIF9JT19fV0lORE9XU0NPTlNPTEVJT19SRUFEQUxMX01FVEhPRERFRgorI2VuZGlmIC8qICFkZWZpbmVkKF9JT19fV0lORE9XU0NPTlNPTEVJT19SRUFEQUxMX01FVEhPRERFRikgKi8KKworI2lmbmRlZiBfSU9fX1dJTkRPV1NDT05TT0xFSU9fUkVBRF9NRVRIT0RERUYKKyAgICAjZGVmaW5lIF9JT19fV0lORE9XU0NPTlNPTEVJT19SRUFEX01FVEhPRERFRgorI2VuZGlmIC8qICFkZWZpbmVkKF9JT19fV0lORE9XU0NPTlNPTEVJT19SRUFEX01FVEhPRERFRikgKi8KKworI2lmbmRlZiBfSU9fX1dJTkRPV1NDT05TT0xFSU9fV1JJVEVfTUVUSE9EREVGCisgICAgI2RlZmluZSBfSU9fX1dJTkRPV1NDT05TT0xFSU9fV1JJVEVfTUVUSE9EREVGCisjZW5kaWYgLyogIWRlZmluZWQoX0lPX19XSU5ET1dTQ09OU09MRUlPX1dSSVRFX01FVEhPRERFRikgKi8KKworI2lmbmRlZiBfSU9fX1dJTkRPV1NDT05TT0xFSU9fSVNBVFRZX01FVEhPRERFRgorICAgICNkZWZpbmUgX0lPX19XSU5ET1dTQ09OU09MRUlPX0lTQVRUWV9NRVRIT0RERUYKKyNlbmRpZiAvKiAhZGVmaW5lZChfSU9fX1dJTkRPV1NDT05TT0xFSU9fSVNBVFRZX01FVEhPRERFRikgKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05ZWJhOTE2Zjg1MzdmZmY3IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2ZpbGVpby5jIGIvTW9kdWxlcy9faW8vZmlsZWlvLmMKaW5kZXggOTE5Y2Y1MC4uNTRjZmI3ZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vZmlsZWlvLmMKKysrIGIvTW9kdWxlcy9faW8vZmlsZWlvLmMKQEAgLTkyLDggKzkyLDcgQEAKICAgICBpZiAoc2VsZi0+ZmQgPj0gMCAmJiBzZWxmLT5jbG9zZWZkKSB7CiAgICAgICAgIFB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKICAgICAgICAgUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKLSAgICAgICAgaWYgKFB5RXJyX1dhcm5Gb3JtYXQoUHlFeGNfUmVzb3VyY2VXYXJuaW5nLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5jbG9zZWQgZmlsZSAlUiIsIHNvdXJjZSkpIHsKKyAgICAgICAgaWYgKFB5RXJyX1Jlc291cmNlV2FybmluZyhzb3VyY2UsIDEsICJ1bmNsb3NlZCBmaWxlICVSIiwgc291cmNlKSkgewogICAgICAgICAgICAgLyogU3B1cmlvdXMgZXJyb3JzIGNhbiBhcHBlYXIgYXQgc2h1dGRvd24gKi8KICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1dhcm5pbmcpKQogICAgICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QgKikgc2VsZik7CkBAIC0xMTgsMTggKzExNywxMyBAQAogICAgICAgICBpbnQgZmQgPSBzZWxmLT5mZDsKICAgICAgICAgc2VsZi0+ZmQgPSAtMTsKICAgICAgICAgLyogZmQgaXMgYWNjZXNzaWJsZSBhbmQgc29tZW9uZSBlbHNlIG1heSBoYXZlIGNsb3NlZCBpdCAqLwotICAgICAgICBpZiAoX1B5VmVyaWZ5X2ZkKGZkKSkgewotICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAotICAgICAgICAgICAgZXJyID0gY2xvc2UoZmQpOwotICAgICAgICAgICAgaWYgKGVyciA8IDApCi0gICAgICAgICAgICAgICAgc2F2ZV9lcnJubyA9IGVycm5vOwotICAgICAgICAgICAgX1B5X0VORF9TVVBQUkVTU19JUEgKLSAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCi0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAorICAgICAgICBlcnIgPSBjbG9zZShmZCk7CisgICAgICAgIGlmIChlcnIgPCAwKQogICAgICAgICAgICAgc2F2ZV9lcnJubyA9IGVycm5vOwotICAgICAgICAgICAgZXJyID0gLTE7Ci0gICAgICAgIH0KKyAgICAgICAgX1B5X0VORF9TVVBQUkVTU19JUEgKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICB9CiAgICAgaWYgKGVyciA8IDApIHsKICAgICAgICAgZXJybm8gPSBzYXZlX2Vycm5vOwpAQCAtNTQ2LDcgKzU0MCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1lcnJfbW9kZShjaGFyICphY3Rpb24pCitlcnJfbW9kZShjb25zdCBjaGFyICphY3Rpb24pCiB7CiAgICAgX1B5SU9fU3RhdGUgKnN0YXRlID0gSU9fU1RBVEUoKTsKICAgICBpZiAoc3RhdGUgIT0gTlVMTCkKQEAgLTcwMSw4ICs2OTUsNiBAQAogCiAgICAgaWYgKHNlbGYtPmZkIDwgMCkKICAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKLSAgICBpZiAoIV9QeVZlcmlmeV9mZChzZWxmLT5mZCkpCi0gICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CiAKICAgICBfUHlfQkVHSU5fU1VQUFJFU1NfSVBICiAjaWZkZWYgTVNfV0lORE9XUwpAQCAtOTE1LDE4ICs5MDcsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmIChfUHlWZXJpZnlfZmQoZmQpKSB7Ci0gICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBfUHlfQkVHSU5fU1VQUFJFU1NfSVBICiAjaWZkZWYgTVNfV0lORE9XUwotICAgICAgICByZXMgPSBfbHNlZWtpNjQoZmQsIHBvcywgd2hlbmNlKTsKKyAgICByZXMgPSBfbHNlZWtpNjQoZmQsIHBvcywgd2hlbmNlKTsKICNlbHNlCi0gICAgICAgIHJlcyA9IGxzZWVrKGZkLCBwb3MsIHdoZW5jZSk7CisgICAgcmVzID0gbHNlZWsoZmQsIHBvcywgd2hlbmNlKTsKICNlbmRpZgotICAgICAgICBfUHlfRU5EX1NVUFBSRVNTX0lQSAotICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwotICAgIH0gZWxzZQotICAgICAgICByZXMgPSAtMTsKKyAgICBfUHlfRU5EX1NVUFBSRVNTX0lQSAorICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgaWYgKHJlcyA8IDApCiAgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CiAKQEAgLTEwNDksNyArMTAzOCw3IEBACiB9CiAjZW5kaWYgLyogSEFWRV9GVFJVTkNBVEUgKi8KIAotc3RhdGljIGNoYXIgKgorc3RhdGljIGNvbnN0IGNoYXIgKgogbW9kZV9zdHJpbmcoZmlsZWlvICpzZWxmKQogewogICAgIGlmIChzZWxmLT5jcmVhdGVkKSB7CkBAIC0xMTE3LDEwICsxMTA2LDcgQEAKICAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAotICAgIGlmIChfUHlWZXJpZnlfZmQoc2VsZi0+ZmQpKQotICAgICAgICByZXMgPSBpc2F0dHkoc2VsZi0+ZmQpOwotICAgIGVsc2UKLSAgICAgICAgcmVzID0gMDsKKyAgICByZXMgPSBpc2F0dHkoc2VsZi0+ZmQpOwogICAgIF9QeV9FTkRfU1VQUFJFU1NfSVBICiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlcyk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9pb2Jhc2UuYyBiL01vZHVsZXMvX2lvL2lvYmFzZS5jCmluZGV4IDU3NTQxYTguLjQ3MmVmM2IgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2lvYmFzZS5jCisrKyBiL01vZHVsZXMvX2lvL2lvYmFzZS5jCkBAIC04MjgsNyArODI4LDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3QgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb25fdGFnICovCi0gICAgKGRlc3RydWN0b3IpaW9iYXNlX2ZpbmFsaXplLCAvKiB0cF9maW5hbGl6ZSAqLworICAgIGlvYmFzZV9maW5hbGl6ZSwgICAgICAgICAgICAvKiB0cF9maW5hbGl6ZSAqLwogfTsKIAogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9zdHJpbmdpby5jIGIvTW9kdWxlcy9faW8vc3RyaW5naW8uYwppbmRleCAwNmI0MTQ0Li5lY2Y2ZGMxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9zdHJpbmdpby5jCisrKyBiL01vZHVsZXMvX2lvL3N0cmluZ2lvLmMKQEAgLTQzOCw3ICs0MzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUlPX3N0cl9yZWFkbGluZSwgTlVMTCk7CiAgICAgICAgIGlmIChsaW5lICYmICFQeVVuaWNvZGVfQ2hlY2sobGluZSkpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JT0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZSgpIHNob3VsZCBoYXZlIHJldHVybmVkIGFuIHN0ciBvYmplY3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmUoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIHN0ciBvYmplY3QsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICclLjIwMHMnIiwgUHlfVFlQRShsaW5lKS0+dHBfbmFtZSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYobGluZSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL3RleHRpby5jIGIvTW9kdWxlcy9faW8vdGV4dGlvLmMKaW5kZXggMDYzY2FhNi4uNTA4ZTQ2ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vdGV4dGlvLmMKKysrIGIvTW9kdWxlcy9faW8vdGV4dGlvLmMKQEAgLTUzMSw3ICs1MzEsNyBAQAogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWYwZDJjOWMxMzZmNGUwZDAgaW5wdXQ9ZjhmZjEwMTgyNWUzMmU3Zl0qLwogewogICAgIFB5T2JqZWN0ICpidWZmZXI7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIGZsYWc7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGZsYWc7CiAKICAgICBpZiAoc2VsZi0+ZGVjb2RlciAhPSBQeV9Ob25lKSB7CiAgICAgICAgIFB5T2JqZWN0ICpzdGF0ZSA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKHNlbGYtPmRlY29kZXIsCkBAIC01NjcsNyArNTY3LDcgQEAKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jMTBjNjIyNTA4YjU3NmNiIGlucHV0PWM1M2ZiNTA1YTc2ZGJiZTJdKi8KIHsKICAgICBQeU9iamVjdCAqYnVmZmVyOwotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBmbGFnOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBmbGFnOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiT0siLCAmYnVmZmVyLCAmZmxhZykpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNzcyLDcgKzc3Miw3IEBACiAgICAgZW5jb2RlZnVuY190IGVuY29kZWZ1bmM7CiB9IGVuY29kZWZ1bmNlbnRyeTsKIAotc3RhdGljIGVuY29kZWZ1bmNlbnRyeSBlbmNvZGVmdW5jc1tdID0geworc3RhdGljIGNvbnN0IGVuY29kZWZ1bmNlbnRyeSBlbmNvZGVmdW5jc1tdID0gewogICAgIHsiYXNjaWkiLCAgICAgICAoZW5jb2RlZnVuY190KSBhc2NpaV9lbmNvZGV9LAogICAgIHsiaXNvODg1OS0xIiwgICAoZW5jb2RlZnVuY190KSBsYXRpbjFfZW5jb2RlfSwKICAgICB7InV0Zi04IiwgICAgICAgKGVuY29kZWZ1bmNfdCkgdXRmOF9lbmNvZGV9LApAQCAtMTAyMSw3ICsxMDIxLDcgQEAKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhyZXMpKSB7Ci0gICAgICAgICAgICBlbmNvZGVmdW5jZW50cnkgKmUgPSBlbmNvZGVmdW5jczsKKyAgICAgICAgICAgIGNvbnN0IGVuY29kZWZ1bmNlbnRyeSAqZSA9IGVuY29kZWZ1bmNzOwogICAgICAgICAgICAgd2hpbGUgKGUtPm5hbWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcocmVzLCBlLT5uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICBzZWxmLT5lbmNvZGVmdW5jID0gZS0+ZW5jb2RlZnVuYzsKQEAgLTE2NDQsOCArMTY0NCw4IEBACiAvKiBOT1RFOiBgZW5kYCBtdXN0IHBvaW50IHRvIHRoZSByZWFsIGVuZCBvZiB0aGUgUHlfVUNTNCBzdG9yYWdlLAogICAgdGhhdCBpcyB0byB0aGUgTlVMIGNoYXJhY3Rlci4gT3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiB3aWxsIHByb2R1Y2UKICAgIGluY29ycmVjdCByZXN1bHRzLiAqLwotc3RhdGljIGNoYXIgKgotZmluZF9jb250cm9sX2NoYXIoaW50IGtpbmQsIGNoYXIgKnMsIGNoYXIgKmVuZCwgUHlfVUNTNCBjaCkKK3N0YXRpYyBjb25zdCBjaGFyICoKK2ZpbmRfY29udHJvbF9jaGFyKGludCBraW5kLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICplbmQsIFB5X1VDUzQgY2gpCiB7CiAgICAgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKICAgICAgICAgYXNzZXJ0KGNoIDwgMjU2KTsKQEAgLTE2NjUsMTMgKzE2NjUsMTMgQEAKIFB5X3NzaXplX3QKIF9QeUlPX2ZpbmRfbGluZV9lbmRpbmcoCiAgICAgaW50IHRyYW5zbGF0ZWQsIGludCB1bml2ZXJzYWwsIFB5T2JqZWN0ICpyZWFkbmwsCi0gICAgaW50IGtpbmQsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIFB5X3NzaXplX3QgKmNvbnN1bWVkKQorICAgIGludCBraW5kLCBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kLCBQeV9zc2l6ZV90ICpjb25zdW1lZCkKIHsKICAgICBQeV9zc2l6ZV90IGxlbiA9ICgoY2hhciopZW5kIC0gKGNoYXIqKXN0YXJ0KS9raW5kOwogCiAgICAgaWYgKHRyYW5zbGF0ZWQpIHsKICAgICAgICAgLyogTmV3bGluZXMgYXJlIGFscmVhZHkgdHJhbnNsYXRlZCwgb25seSBzZWFyY2ggZm9yIFxuICovCi0gICAgICAgIGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHN0YXJ0LCBlbmQsICdcbicpOworICAgICAgICBjb25zdCBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzdGFydCwgZW5kLCAnXG4nKTsKICAgICAgICAgaWYgKHBvcyAhPSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIChwb3MgLSBzdGFydCkva2luZCArIDE7CiAgICAgICAgIGVsc2UgewpAQCAtMTY4Myw3ICsxNjgzLDcgQEAKICAgICAgICAgLyogVW5pdmVyc2FsIG5ld2xpbmUgc2VhcmNoLiBGaW5kIGFueSBvZiBcciwgXHJcbiwgXG4KICAgICAgICAgICogVGhlIGRlY29kZXIgZW5zdXJlcyB0aGF0IFxyXG4gYXJlIG5vdCBzcGxpdCBpbiB0d28gcGllY2VzCiAgICAgICAgICAqLwotICAgICAgICBjaGFyICpzID0gc3RhcnQ7CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBzdGFydDsKICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgUHlfVUNTNCBjaDsKICAgICAgICAgICAgIC8qIEZhc3QgcGF0aCBmb3Igbm9uLWNvbnRyb2wgY2hhcnMuIFRoZSBsb29wIGFsd2F5cyBlbmRzCkBAIC0xNzEzLDIxICsxNzEzLDIxIEBACiAgICAgICAgIC8qIEFzc3VtZSB0aGF0IHJlYWRubCBpcyBhbiBBU0NJSSBjaGFyYWN0ZXIuICovCiAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfS0lORChyZWFkbmwpID09IFB5VW5pY29kZV8xQllURV9LSU5EKTsKICAgICAgICAgaWYgKHJlYWRubF9sZW4gPT0gMSkgewotICAgICAgICAgICAgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgc3RhcnQsIGVuZCwgbmxbMF0pOworICAgICAgICAgICAgY29uc3QgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgc3RhcnQsIGVuZCwgbmxbMF0pOwogICAgICAgICAgICAgaWYgKHBvcyAhPSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiAocG9zIC0gc3RhcnQpL2tpbmQgKyAxOwogICAgICAgICAgICAgKmNvbnN1bWVkID0gbGVuOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgY2hhciAqcyA9IHN0YXJ0OwotICAgICAgICAgICAgY2hhciAqZSA9IGVuZCAtIChyZWFkbmxfbGVuIC0gMSkqa2luZDsKLSAgICAgICAgICAgIGNoYXIgKnBvczsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBzdGFydDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmUgPSBlbmQgLSAocmVhZG5sX2xlbiAtIDEpKmtpbmQ7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwb3M7CiAgICAgICAgICAgICBpZiAoZSA8IHMpCiAgICAgICAgICAgICAgICAgZSA9IHM7CiAgICAgICAgICAgICB3aGlsZSAocyA8IGUpIHsKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgICAgICAgICAgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgcywgZW5kLCBubFswXSk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgcywgZW5kLCBubFswXSk7CiAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBOVUxMIHx8IHBvcyA+PSBlKQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcmVhZG5sX2xlbjsgaSsrKSB7CkBAIC0yNjg5LDcgKzI2ODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUlPX3N0cl9yZWFkbGluZSwgTlVMTCk7CiAgICAgICAgIGlmIChsaW5lICYmICFQeVVuaWNvZGVfQ2hlY2sobGluZSkpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JT0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZSgpIHNob3VsZCBoYXZlIHJldHVybmVkIGFuIHN0ciBvYmplY3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmUoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIHN0ciBvYmplY3QsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICclLjIwMHMnIiwgUHlfVFlQRShsaW5lKS0+dHBfbmFtZSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYobGluZSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL3dpbmNvbnNvbGVpby5jIGIvTW9kdWxlcy9faW8vd2luY29uc29sZWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyN2ZmMQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2lvL3dpbmNvbnNvbGVpby5jCkBAIC0wLDAgKzEsMTA5NiBAQAorLyoKKyAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiBXaW5kb3dzIGNvbnNvbGUgSS9PCisKKyAgICBDbGFzc2VzIGRlZmluZWQgaGVyZTogX1dpbmRvd3NDb25zb2xlSU8KKworICAgIFdyaXR0ZW4gYnkgU3RldmUgRG93ZXIKKyovCisKKyNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgorI2luY2x1ZGUgIlB5dGhvbi5oIgorCisjaWZkZWYgTVNfV0lORE9XUworCisjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGRlZi5oPiAvKiBGb3Igb2Zmc2V0b2YgKi8KKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAiX2lvbW9kdWxlLmgiCisKKy8qIEJVRlNJWiBkZXRlcm1pbmVzIGhvdyBtYW55IGNoYXJhY3RlcnMgY2FuIGJlIHR5cGVkIGF0IHRoZSBjb25zb2xlCisgICBiZWZvcmUgaXQgc3RhcnRzIGJsb2NraW5nLiAqLworI2lmIEJVRlNJWiA8ICgxNioxMDI0KQorI2RlZmluZSBTTUFMTENIVU5LICgyKjEwMjQpCisjZWxpZiAoQlVGU0laID49ICgyIDw8IDI1KSkKKyNlcnJvciAidW5yZWFzb25hYmxlIEJVRlNJWiA+IDY0TUIgZGVmaW5lZCIKKyNlbHNlCisjZGVmaW5lIFNNQUxMQ0hVTksgQlVGU0laCisjZW5kaWYKKworLyogQlVGTUFYIGRldGVybWluZXMgaG93IG1hbnkgYnl0ZXMgY2FuIGJlIHJlYWQgaW4gb25lIGdvLiAqLworI2RlZmluZSBCVUZNQVggKDMyKjEwMjQqMTAyNCkKKworY2hhciBfZ2V0X2NvbnNvbGVfdHlwZShIQU5ETEUgaGFuZGxlKSB7CisgICAgRFdPUkQgbW9kZSwgcGVla19jb3VudDsKKworICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIHJldHVybiAnXDAnOworICAgIAorICAgIGlmICghR2V0Q29uc29sZU1vZGUoaGFuZGxlLCAmbW9kZSkpCisgICAgICAgIHJldHVybiAnXDAnOworCisgICAgLyogUGVlayBhdCB0aGUgaGFuZGxlIHRvIHNlZSB3aGV0aGVyIGl0IGlzIGFuIGlucHV0IG9yIG91dHB1dCBoYW5kbGUgKi8KKyAgICBpZiAoR2V0TnVtYmVyT2ZDb25zb2xlSW5wdXRFdmVudHMoaGFuZGxlLCAmcGVla19jb3VudCkpCisgICAgICAgIHJldHVybiAncic7CisgICAgcmV0dXJuICd3JzsKK30KKworY2hhciBfUHlJT19nZXRfY29uc29sZV90eXBlKFB5T2JqZWN0ICpwYXRoX29yX2ZkKSB7CisgICAgaW50IGZkOworCisgICAgZmQgPSBQeUxvbmdfQXNMb25nKHBhdGhfb3JfZmQpOworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgSEFORExFIGhhbmRsZTsKKyAgICAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAorICAgICAgICBoYW5kbGUgPSAoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZkKTsKKyAgICAgICAgX1B5X0VORF9TVVBQUkVTU19JUEgKKyAgICAgICAgaWYgKCFoYW5kbGUpCisgICAgICAgICAgICByZXR1cm4gJ1wwJzsKKyAgICAgICAgcmV0dXJuIF9nZXRfY29uc29sZV90eXBlKGhhbmRsZSk7CisgICAgfQorCisgICAgUHlPYmplY3QgKmRlY29kZWQgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihkZWNvZGVkKTsKKworICAgIGludCBkID0gUHlVbmljb2RlX0ZTRGVjb2RlcihwYXRoX29yX2ZkLCAmZGVjb2RlZCk7CisgICAgaWYgKCFkKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X0NMRUFSKGRlY29kZWQpOworICAgICAgICByZXR1cm4gJ1wwJzsKKyAgICB9CisKKyAgICBjaGFyIG0gPSAnXDAnOworICAgIGlmICghUHlVbmljb2RlX0NoZWNrKGRlY29kZWQpKSB7CisgICAgICAgIHJldHVybiAnXDAnOworICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcoZGVjb2RlZCwgIkNPTklOJCIpID09IDApIHsKKyAgICAgICAgbSA9ICdyJzsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nKGRlY29kZWQsICJDT05PVVQkIikgPT0gMCB8fAorICAgICAgICBQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhkZWNvZGVkLCAiQ09OIikgPT0gMCkgeworICAgICAgICBtID0gJ3cnOworICAgIH0KKworICAgIFB5X0NMRUFSKGRlY29kZWQpOworICAgIHJldHVybiBtOworfQorCisvKltjbGluaWMgaW5wdXRdCittb2R1bGUgX2lvCitjbGFzcyBfaW8uX1dpbmRvd3NDb25zb2xlSU8gIndpbmNvbnNvbGVpbyAqIiAiJlB5V2luZG93c0NvbnNvbGVJT19UeXBlIgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9ZTg5N2ZkYzFmYmE0ZTEzMV0qLworCisvKltweXRob24gaW5wdXRdCitjbGFzcyBpb19zc2l6ZV90X2NvbnZlcnRlcihDQ29udmVydGVyKToKKyAgICB0eXBlID0gJ1B5X3NzaXplX3QnCisgICAgY29udmVydGVyID0gJ19QeUlPX0NvbnZlcnRTc2l6ZV90JworW3B5dGhvbiBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworLypbcHl0aG9uIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9ZDBhODExZDNjYmZkMWIzM10qLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEhBTkRMRSBoYW5kbGU7CisgICAgaW50IGZkOworICAgIHVuc2lnbmVkIGludCBjcmVhdGVkIDogMTsKKyAgICB1bnNpZ25lZCBpbnQgcmVhZGFibGUgOiAxOworICAgIHVuc2lnbmVkIGludCB3cml0YWJsZSA6IDE7CisgICAgdW5zaWduZWQgaW50IGNsb3NlaGFuZGxlIDogMTsKKyAgICBjaGFyIGZpbmFsaXppbmc7CisgICAgdW5zaWduZWQgaW50IGJsa3NpemU7CisgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIGNoYXIgYnVmWzRdOworfSB3aW5jb25zb2xlaW87CisKK1B5VHlwZU9iamVjdCBQeVdpbmRvd3NDb25zb2xlSU9fVHlwZTsKKworX1B5X0lERU5USUZJRVIobmFtZSk7CisKK2ludAorX1B5V2luZG93c0NvbnNvbGVJT19jbG9zZWQoUHlPYmplY3QgKnNlbGYpCit7CisgICAgcmV0dXJuICgod2luY29uc29sZWlvICopc2VsZiktPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KKworCisvKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgd2l0aCBleGNlcHRpb24gc2V0IG9uIGZhaWx1cmUuICovCitzdGF0aWMgaW50CitpbnRlcm5hbF9jbG9zZSh3aW5jb25zb2xlaW8gKnNlbGYpCit7CisgICAgaWYgKHNlbGYtPmhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBpZiAoc2VsZi0+Y2xvc2VoYW5kbGUpIHsKKyAgICAgICAgICAgIGlmIChzZWxmLT5mZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAorICAgICAgICAgICAgICAgIGNsb3NlKHNlbGYtPmZkKTsKKyAgICAgICAgICAgICAgICBfUHlfRU5EX1NVUFBSRVNTX0lQSAorICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2xvc2VIYW5kbGUoc2VsZi0+aGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICAgICAgc2VsZi0+ZmQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qW2NsaW5pYyBpbnB1dF0KK19pby5fV2luZG93c0NvbnNvbGVJTy5jbG9zZQorCitDbG9zZSB0aGUgaGFuZGxlLgorCitBIGNsb3NlZCBoYW5kbGUgY2Fubm90IGJlIHVzZWQgZm9yIGZ1cnRoZXIgSS9PIG9wZXJhdGlvbnMuICBjbG9zZSgpIG1heSBiZQorY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHdpdGhvdXQgZXJyb3IuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfaW9fX1dpbmRvd3NDb25zb2xlSU9fY2xvc2VfaW1wbCh3aW5jb25zb2xlaW8gKnNlbGYpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjdlZjk1YjY2YzI5MDU3YiBpbnB1dD0xODU2MTdlMzQ5YWU0YzdiXSovCit7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqZXhjLCAqdmFsLCAqdGI7CisgICAgaW50IHJjOworICAgIF9QeV9JREVOVElGSUVSKGNsb3NlKTsKKyAgICByZXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCopJlB5UmF3SU9CYXNlX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlJZF9jbG9zZSwgIk8iLCBzZWxmKTsKKyAgICBpZiAoIXNlbGYtPmNsb3NlaGFuZGxlKSB7CisgICAgICAgIHNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIFB5RXJyX0ZldGNoKCZleGMsICZ2YWwsICZ0Yik7CisgICAgcmMgPSBpbnRlcm5hbF9jbG9zZShzZWxmKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIF9QeUVycl9DaGFpbkV4Y2VwdGlvbnMoZXhjLCB2YWwsIHRiKTsKKyAgICBpZiAocmMgPCAwKQorICAgICAgICBQeV9DTEVBUihyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCit3aW5jb25zb2xlaW9fbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworICAgIHdpbmNvbnNvbGVpbyAqc2VsZjsKKworICAgIGFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7CisKKyAgICBzZWxmID0gKHdpbmNvbnNvbGVpbyAqKSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgICAgICBzZWxmLT5mZCA9IC0xOworICAgICAgICBzZWxmLT5jcmVhdGVkID0gMDsKKyAgICAgICAgc2VsZi0+cmVhZGFibGUgPSAwOworICAgICAgICBzZWxmLT53cml0YWJsZSA9IDA7CisgICAgICAgIHNlbGYtPmNsb3NlaGFuZGxlID0gMDsKKyAgICAgICAgc2VsZi0+Ymxrc2l6ZSA9IDA7CisgICAgICAgIHNlbGYtPndlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHNlbGY7Cit9CisKKy8qW2NsaW5pYyBpbnB1dF0KK19pby5fV2luZG93c0NvbnNvbGVJTy5fX2luaXRfXworICAgIGZpbGUgYXMgbmFtZW9iajogb2JqZWN0CisgICAgbW9kZTogc3RyID0gInIiCisgICAgY2xvc2VmZDogaW50KGNfZGVmYXVsdD0iMSIpID0gVHJ1ZQorICAgIG9wZW5lcjogb2JqZWN0ID0gTm9uZQorCitPcGVuIGEgY29uc29sZSBidWZmZXIgYnkgZmlsZSBkZXNjcmlwdG9yLgorCitUaGUgbW9kZSBjYW4gYmUgJ3JiJyAoZGVmYXVsdCksIG9yICd3YicgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyBieXRlcy4gQWxsCitvdGhlciBtb2RlIGNoYXJhY3RlcnMgd2lsbCBiZSBpZ25vcmVkLiBNb2RlICdiJyB3aWxsIGJlIGFzc3VtZWQgaWYgaXQgaXMKK29taXR0ZWQuIFRoZSAqb3BlbmVyKiBwYXJhbWV0ZXIgaXMgYWx3YXlzIGlnbm9yZWQuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBpbnQKK19pb19fV2luZG93c0NvbnNvbGVJT19fX2luaXRfX19pbXBsKHdpbmNvbnNvbGVpbyAqc2VsZiwgUHlPYmplY3QgKm5hbWVvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlLCBpbnQgY2xvc2VmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvcGVuZXIpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9M2ZkOWNiY2RkOGQ5NTQyOSBpbnB1dD02MWJlMzk2MzNhODZmNWQ3XSovCit7CisgICAgY29uc3QgY2hhciAqczsKKyAgICB3Y2hhcl90ICpuYW1lID0gTlVMTDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgcndhID0gMDsKKyAgICBpbnQgZmQgPSAtMTsKKyAgICBpbnQgZmRfaXNfb3duID0gMDsKKworICAgIGFzc2VydChQeVdpbmRvd3NDb25zb2xlSU9fQ2hlY2soc2VsZikpOworICAgIGlmIChzZWxmLT5oYW5kbGUgPj0gMCkgeworICAgICAgICBpZiAoc2VsZi0+Y2xvc2VoYW5kbGUpIHsKKyAgICAgICAgICAgIC8qIEhhdmUgdG8gY2xvc2UgdGhlIGV4aXN0aW5nIGZpbGUgZmlyc3QuICovCisgICAgICAgICAgICBpZiAoaW50ZXJuYWxfY2xvc2Uoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoUHlGbG9hdF9DaGVjayhuYW1lb2JqKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZmQgPSBfUHlMb25nX0FzSW50KG5hbWVvYmopOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgZmlsZSBkZXNjcmlwdG9yIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgc2VsZi0+ZmQgPSBmZDsKKworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgUHlPYmplY3QgKmRlY29kZWRuYW1lID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGRlY29kZWRuYW1lKTsKKworICAgICAgICBpbnQgZCA9IFB5VW5pY29kZV9GU0RlY29kZXIobmFtZW9iaiwgKHZvaWQqKSZkZWNvZGVkbmFtZSk7CisgICAgICAgIGlmICghZCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBQeV9zc2l6ZV90IGxlbmd0aDsKKyAgICAgICAgbmFtZSA9IFB5VW5pY29kZV9Bc1dpZGVDaGFyU3RyaW5nKGRlY29kZWRuYW1lLCAmbGVuZ3RoKTsKKyAgICAgICAgUHlfQ0xFQVIoZGVjb2RlZG5hbWUpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGlmICh3Y3NsZW4obmFtZSkgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICBQeU1lbV9GcmVlKG5hbWUpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbWJlZGRlZCBudWxsIGNoYXJhY3RlciIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcyA9IG1vZGU7CisgICAgd2hpbGUgKCpzKSB7CisgICAgICAgIHN3aXRjaCAoKnMrKykgeworICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgY2FzZSAnYSc6CisgICAgICAgIGNhc2UgJ2InOgorICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgIGlmIChyd2EpCisgICAgICAgICAgICAgICAgZ290byBiYWRfbW9kZTsKKyAgICAgICAgICAgIHJ3YSA9IDE7CisgICAgICAgICAgICBzZWxmLT5yZWFkYWJsZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICBpZiAocndhKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkX21vZGU7CisgICAgICAgICAgICByd2EgPSAxOworICAgICAgICAgICAgc2VsZi0+d3JpdGFibGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBtb2RlOiAlLjIwMHMiLCBtb2RlKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXJ3YSkKKyAgICAgICAgZ290byBiYWRfbW9kZTsKKworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIF9QeV9CRUdJTl9TVVBQUkVTU19JUEgKKyAgICAgICAgc2VsZi0+aGFuZGxlID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmZCk7CisgICAgICAgIF9QeV9FTkRfU1VQUFJFU1NfSVBICisgICAgICAgIHNlbGYtPmNsb3NlaGFuZGxlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBEV09SRCBhY2Nlc3MgPSBHRU5FUklDX1JFQUQ7CisKKyAgICAgICAgc2VsZi0+Y2xvc2VoYW5kbGUgPSAxOworICAgICAgICBpZiAoIWNsb3NlZmQpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJDYW5ub3QgdXNlIGNsb3NlZmQ9RmFsc2Ugd2l0aCBmaWxlIG5hbWUiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi0+d3JpdGFibGUpCisgICAgICAgICAgICBhY2Nlc3MgfD0gR0VORVJJQ19XUklURTsKKworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIC8qIEF0dGVtcHQgdG8gb3BlbiBmb3IgcmVhZC93cml0ZSBpbml0aWFsbHksIHRoZW4gZmFsbCBiYWNrCisgICAgICAgICAgIG9uIHRoZSBzcGVjaWZpYyBhY2Nlc3MuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIG1vZGVybiBuYW1lcworICAgICAgICAgICBDT05JTiQgYW5kIENPTk9VVCQsIHdoaWNoIGFsbG93IHJlYWRpbmcvd3JpdGluZyBzdGF0ZSBhcworICAgICAgICAgICB3ZWxsIGFzIHJlYWRpbmcvd3JpdGluZyBjb250ZW50LiAqLworICAgICAgICBzZWxmLT5oYW5kbGUgPSBDcmVhdGVGaWxlVyhuYW1lLCBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLAorICAgICAgICAgICAgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwgTlVMTCwgT1BFTl9FWElTVElORywgMCwgTlVMTCk7CisgICAgICAgIGlmIChzZWxmLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgICAgICBzZWxmLT5oYW5kbGUgPSBDcmVhdGVGaWxlVyhuYW1lLCBhY2Nlc3MsCisgICAgICAgICAgICAgICAgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwgTlVMTCwgT1BFTl9FWElTVElORywgMCwgTlVMTCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICAgICAgaWYgKHNlbGYtPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICAgICAgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoUHlFeGNfT1NFcnJvciwgR2V0TGFzdEVycm9yKCksIG5hbWVvYmopOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgICBpZiAoc2VsZi0+d3JpdGFibGUgJiYgX2dldF9jb25zb2xlX3R5cGUoc2VsZi0+aGFuZGxlKSAhPSAndycpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAiQ2Fubm90IG9wZW4gY29uc29sZSBpbnB1dCBidWZmZXIgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKHNlbGYtPnJlYWRhYmxlICYmIF9nZXRfY29uc29sZV90eXBlKHNlbGYtPmhhbmRsZSkgIT0gJ3InKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgIkNhbm5vdCBvcGVuIGNvbnNvbGUgb3V0cHV0IGJ1ZmZlciBmb3IgcmVhZGluZyIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHNlbGYtPmJsa3NpemUgPSBERUZBVUxUX0JVRkZFUl9TSVpFOworICAgIG1lbXNldChzZWxmLT5idWYsIDAsIDQpOworCisgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQoKFB5T2JqZWN0ICopc2VsZiwgJlB5SWRfbmFtZSwgbmFtZW9iaikgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgZ290byBkb25lOworCitiYWRfbW9kZToKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIk11c3QgaGF2ZSBleGFjdGx5IG9uZSBvZiByZWFkIG9yIHdyaXRlIG1vZGUiKTsKK2Vycm9yOgorICAgIHJldCA9IC0xOworICAgIGludGVybmFsX2Nsb3NlKHNlbGYpOworCitkb25lOgorICAgIGlmIChuYW1lKQorICAgICAgICBQeU1lbV9GcmVlKG5hbWUpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3dpbmNvbnNvbGVpb190cmF2ZXJzZSh3aW5jb25zb2xlaW8gKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworICAgIFB5X1ZJU0lUKHNlbGYtPmRpY3QpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3aW5jb25zb2xlaW9fY2xlYXIod2luY29uc29sZWlvICpzZWxmKQoreworICAgIFB5X0NMRUFSKHNlbGYtPmRpY3QpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAord2luY29uc29sZWlvX2RlYWxsb2Mod2luY29uc29sZWlvICpzZWxmKQoreworICAgIHNlbGYtPmZpbmFsaXppbmcgPSAxOworICAgIGlmIChfUHlJT0Jhc2VfZmluYWxpemUoKFB5T2JqZWN0ICopIHNlbGYpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKHNlbGYpOworICAgIGlmIChzZWxmLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBzZWxmKTsKKyAgICBQeV9DTEVBUihzZWxmLT5kaWN0KTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorZXJyX2Nsb3NlZCh2b2lkKQoreworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorZXJyX21vZGUoY29uc3QgY2hhciAqYWN0aW9uKQoreworICAgIF9QeUlPX1N0YXRlICpzdGF0ZSA9IElPX1NUQVRFKCk7CisgICAgaWYgKHN0YXRlICE9IE5VTEwpCisgICAgICAgIFB5RXJyX0Zvcm1hdChzdGF0ZS0+dW5zdXBwb3J0ZWRfb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIkNvbnNvbGUgYnVmZmVyIGRvZXMgbm90IHN1cHBvcnQgJXMiLCBhY3Rpb24pOworICAgIHJldHVybiBOVUxMOworfQorCisvKltjbGluaWMgaW5wdXRdCitfaW8uX1dpbmRvd3NDb25zb2xlSU8uZmlsZW5vCisKK1JldHVybiB0aGUgdW5kZXJseWluZyBmaWxlIGRlc2NyaXB0b3IgKGFuIGludGVnZXIpLgorCitmaWxlbm8gaXMgb25seSBzZXQgd2hlbiBhIGZpbGUgZGVzY3JpcHRvciBpcyB1c2VkIHRvIG9wZW4KK29uZSBvZiB0aGUgc3RhbmRhcmQgc3RyZWFtcy4KKworW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorX2lvX19XaW5kb3dzQ29uc29sZUlPX2ZpbGVub19pbXBsKHdpbmNvbnNvbGVpbyAqc2VsZikKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wMDZmYTc0Y2UzYjVjZmJmIGlucHV0PTA3OWFkYzMzMGRkYWFiZTZdKi8KK3sKKyAgICBpZiAoc2VsZi0+ZmQgPCAwICYmIHNlbGYtPmhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBfUHlfQkVHSU5fU1VQUFJFU1NfSVBICisgICAgICAgIGlmIChzZWxmLT53cml0YWJsZSkKKyAgICAgICAgICAgIHNlbGYtPmZkID0gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdClzZWxmLT5oYW5kbGUsICd3YicpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWxmLT5mZCA9IF9vcGVuX29zZmhhbmRsZSgoaW50cHRyX3Qpc2VsZi0+aGFuZGxlLCAncmInKTsKKyAgICAgICAgX1B5X0VORF9TVVBQUkVTU19JUEgKKyAgICB9CisgICAgaWYgKHNlbGYtPmZkIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJmaWxlbm8iKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHNlbGYtPmZkKTsKK30KKworLypbY2xpbmljIGlucHV0XQorX2lvLl9XaW5kb3dzQ29uc29sZUlPLnJlYWRhYmxlCisKK1RydWUgaWYgY29uc29sZSBpcyBhbiBpbnB1dCBidWZmZXIuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZGFibGVfaW1wbCh3aW5jb25zb2xlaW8gKnNlbGYpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGFmOWNlZjI3NDNiZWNmMCBpbnB1dD02YmU5ZGVmYjUzMDJkYWFlXSovCit7CisgICAgaWYgKHNlbGYtPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKSBzZWxmLT5yZWFkYWJsZSk7Cit9CisKKy8qW2NsaW5pYyBpbnB1dF0KK19pby5fV2luZG93c0NvbnNvbGVJTy53cml0YWJsZQorCitUcnVlIGlmIGNvbnNvbGUgaXMgYW4gb3V0cHV0IGJ1ZmZlci4KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19pb19fV2luZG93c0NvbnNvbGVJT193cml0YWJsZV9pbXBsKHdpbmNvbnNvbGVpbyAqc2VsZikKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lMGEyYWQ3ZWFlNWFiZjY3IGlucHV0PWNlZmJkOGFiYzI0ZGY2YTBdKi8KK3sKKyAgICBpZiAoc2VsZi0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpIHNlbGYtPndyaXRhYmxlKTsKK30KKworc3RhdGljIERXT1JECitfYnVmbGVuKHdpbmNvbnNvbGVpbyAqc2VsZikKK3sKKyAgICBmb3IgKERXT1JEIGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGlmICghc2VsZi0+YnVmW2ldKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiA0OworfQorCitzdGF0aWMgRFdPUkQKK19jb3B5ZnJvbWJ1Zih3aW5jb25zb2xlaW8gKnNlbGYsIGNoYXIgKmJ1ZiwgRFdPUkQgbGVuKQoreworICAgIERXT1JEIG4gPSAwOworCisgICAgd2hpbGUgKHNlbGYtPmJ1ZlswXSAmJiBsZW4tLSkgeworICAgICAgICBuICs9IDE7CisgICAgICAgIGJ1ZlswXSA9IHNlbGYtPmJ1ZlswXTsKKyAgICAgICAgc2VsZi0+YnVmWzBdID0gc2VsZi0+YnVmWzFdOworICAgICAgICBzZWxmLT5idWZbMV0gPSBzZWxmLT5idWZbMl07CisgICAgICAgIHNlbGYtPmJ1ZlsyXSA9IHNlbGYtPmJ1ZlszXTsKKyAgICAgICAgc2VsZi0+YnVmWzNdID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIHdjaGFyX3QgKgorcmVhZF9jb25zb2xlX3coSEFORExFIGhhbmRsZSwgRFdPUkQgbWF4bGVuLCBEV09SRCAqcmVhZGxlbikgeworICAgIGludCBlcnIgPSAwLCBzaWcgPSAwOworCisgICAgd2NoYXJfdCAqYnVmID0gKHdjaGFyX3QqKVB5TWVtX01hbGxvYyhtYXhsZW4gKiBzaXplb2Yod2NoYXJfdCkpOworICAgIGlmICghYnVmKQorICAgICAgICBnb3RvIGVycm9yOworICAgICpyZWFkbGVuID0gMDsKKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmb3IgKERXT1JEIG9mZiA9IDA7IG9mZiA8IG1heGxlbjsgb2ZmICs9IEJVRlNJWikgeworICAgICAgICBEV09SRCBuLCBsZW4gPSBtaW4obWF4bGVuIC0gb2ZmLCBCVUZTSVopOworICAgICAgICBTZXRMYXN0RXJyb3IoMCk7CisgICAgICAgIEJPT0wgcmVzID0gUmVhZENvbnNvbGVXKGhhbmRsZSwgJmJ1ZltvZmZdLCBsZW4sICZuLCBOVUxMKTsKKworICAgICAgICBpZiAoIXJlcykgeworICAgICAgICAgICAgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gRVJST1JfT1BFUkFUSU9OX0FCT1JURUQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgSEFORExFIGhJbnRlcnJ1cHRFdmVudCA9IF9QeU9TX1NpZ2ludEV2ZW50KCk7CisgICAgICAgICAgICBpZiAoV2FpdEZvclNpbmdsZU9iamVjdEV4KGhJbnRlcnJ1cHRFdmVudCwgMTAwLCBGQUxTRSkKKyAgICAgICAgICAgICAgICA9PSBXQUlUX09CSkVDVF8wKSB7CisgICAgICAgICAgICAgICAgUmVzZXRFdmVudChoSW50ZXJydXB0RXZlbnQpOworICAgICAgICAgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBzaWcgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKKyAgICAgICAgICAgICAgICBQeV9VTkJMT0NLX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBpZiAoc2lnIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKnJlYWRsZW4gKz0gbjsKKworICAgICAgICAvKiBJZiB3ZSBkaWRuJ3QgcmVhZCBhIGZ1bGwgYnVmZmVyIHRoYXQgdGltZSwgZG9uJ3QgdHJ5CisgICAgICAgICAgIGFnYWluIG9yIHdlIHdpbGwgYmxvY2sgYSBzZWNvbmQgdGltZS4gKi8KKyAgICAgICAgaWYgKG4gPCBsZW4pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogSWYgdGhlIGJ1ZmZlciBlbmRlZCB3aXRoIGEgbmV3bGluZSwgYnJlYWsgb3V0ICovCisgICAgICAgIGlmIChidWZbKnJlYWRsZW4gLSAxXSA9PSAnXG4nKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICBpZiAoc2lnKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoZXJyKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoKnJlYWRsZW4gPiAwICYmIGJ1ZlswXSA9PSBMJ1x4MWEnKSB7CisgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgYnVmID0gKHdjaGFyX3QgKilQeU1lbV9NYWxsb2Moc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICAgICAgaWYgKCFidWYpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBidWZbMF0gPSBMJ1wwJzsKKyAgICAgICAgKnJlYWRsZW4gPSAwOworICAgIH0KKworICAgIHJldHVybiBidWY7CisKK2Vycm9yOgorICAgIGlmIChidWYpCisgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgUHlfc3NpemVfdAorcmVhZGludG8od2luY29uc29sZWlvICpzZWxmLCBjaGFyICpidWYsIFB5X3NzaXplX3QgbGVuKQoreworICAgIGlmIChzZWxmLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgZXJyX2Nsb3NlZCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghc2VsZi0+cmVhZGFibGUpIHsKKyAgICAgICAgZXJyX21vZGUoInJlYWRpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGVuID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChsZW4gPiBCVUZNQVgpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJjYW5ub3QgcmVhZCBtb3JlIHRoYW4gJWQgYnl0ZXMiLCBCVUZNQVgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogRWFjaCBjaGFyYWN0ZXIgbWF5IHRha2UgdXAgdG8gNCBieXRlcyBpbiB0aGUgZmluYWwgYnVmZmVyLgorICAgICAgIFRoaXMgaXMgaGlnaGx5IGNvbnNlcnZhdGl2ZSwgYnV0IG5lY2Vzc2FyeSB0byBhdm9pZAorICAgICAgIGZhaWx1cmUgZm9yIGFueSBnaXZlbiBVbmljb2RlIGlucHV0IChlLmcuIFxVMDAxMGZmZmYpLgorICAgICAgIElmIHRoZSBjYWxsZXIgcmVxdWVzdHMgZmV3ZXIgdGhhbiA0IGJ5dGVzLCB3ZSBidWZmZXIgb25lCisgICAgICAgY2hhcmFjdGVyLgorICAgICovCisgICAgRFdPUkQgd2xlbiA9IChEV09SRCkobGVuIC8gNCk7CisgICAgaWYgKHdsZW4gPT0gMCkgeworICAgICAgICB3bGVuID0gMTsKKyAgICB9CisKKyAgICBEV09SRCByZWFkX2xlbiA9IF9jb3B5ZnJvbWJ1ZihzZWxmLCBidWYsIChEV09SRClsZW4pOworICAgIGlmIChyZWFkX2xlbikgeworICAgICAgICBidWYgPSAmYnVmW3JlYWRfbGVuXTsKKyAgICAgICAgbGVuIC09IHJlYWRfbGVuOworICAgICAgICB3bGVuIC09IDE7CisgICAgfQorICAgIGlmIChsZW4gPT0gcmVhZF9sZW4gfHwgd2xlbiA9PSAwKQorICAgICAgICByZXR1cm4gcmVhZF9sZW47CisKKyAgICBEV09SRCBuOworICAgIHdjaGFyX3QgKndidWYgPSByZWFkX2NvbnNvbGVfdyhzZWxmLT5oYW5kbGUsIHdsZW4sICZuKTsKKyAgICBpZiAod2J1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBQeU1lbV9GcmVlKHdidWYpOworICAgICAgICByZXR1cm4gcmVhZF9sZW47CisgICAgfQorCisgICAgaW50IGVyciA9IDA7CisgICAgRFdPUkQgdThuID0gMDsKKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAobGVuIDwgNCkgeworICAgICAgICBpZiAoV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VVEY4LCAwLCB3YnVmLCBuLAorICAgICAgICAgICAgICAgIHNlbGYtPmJ1Ziwgc2l6ZW9mKHNlbGYtPmJ1ZikgLyBzaXplb2Yoc2VsZi0+YnVmWzBdKSwKKyAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSkKKyAgICAgICAgICAgIHU4biA9IF9jb3B5ZnJvbWJ1ZihzZWxmLCBidWYsIChEV09SRClsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIHU4biA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgd2J1ZiwgbiwKKyAgICAgICAgICAgIGJ1ZiwgKERXT1JEKWxlbiwgTlVMTCwgTlVMTCk7CisgICAgfQorCisgICAgaWYgKHU4bikgeworICAgICAgICByZWFkX2xlbiArPSB1OG47CisgICAgICAgIHU4biA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikgeworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBuZWVkZWQgYnVmZmVyIGZvciBhIG1vcmUgdXNlZnVsIGVycm9yLCBhcyB0aGlzCisgICAgICAgICAgICAgICAgbWVhbnMgb3VyICIvIDQiIGxvZ2ljIGFib3ZlIGlzIGluc3VmZmljaWVudCBmb3Igc29tZSBpbnB1dC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICB1OG4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsIDAsIHdidWYsIG4sCisgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIFB5TWVtX0ZyZWUod2J1Zik7CisKKyAgICBpZiAodThuKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJCdWZmZXIgaGFkIHJvb20gZm9yICVkIGJ5dGVzIGJ1dCAlZCBieXRlcyByZXF1aXJlZCIsCisgICAgICAgICAgICBsZW4sIHU4bik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGVycikgeworICAgICAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycihlcnIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHJlYWRfbGVuOworfQorCisvKltjbGluaWMgaW5wdXRdCitfaW8uX1dpbmRvd3NDb25zb2xlSU8ucmVhZGludG8KKyAgICBidWZmZXI6IFB5X2J1ZmZlcihhY2NlcHQ9e3J3YnVmZmVyfSkKKyAgICAvCisKK1NhbWUgYXMgUmF3SU9CYXNlLnJlYWRpbnRvKCkuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZGludG9faW1wbCh3aW5jb25zb2xlaW8gKnNlbGYsIFB5X2J1ZmZlciAqYnVmZmVyKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTY2ZDFiZGZhM2YyMGFmMzkgaW5wdXQ9NGVkNjhkYTQ4YTZiYWZmZV0qLworeworICAgIFB5X3NzaXplX3QgbGVuID0gcmVhZGludG8oc2VsZiwgYnVmZmVyLT5idWYsIGJ1ZmZlci0+bGVuKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KGxlbik7Cit9CisKK3N0YXRpYyBEV09SRAorbmV3X2J1ZmZlcnNpemUod2luY29uc29sZWlvICpzZWxmLCBEV09SRCBjdXJyZW50c2l6ZSkKK3sKKyAgICBEV09SRCBhZGRlbmQ7CisKKyAgICAvKiBFeHBhbmQgdGhlIGJ1ZmZlciBieSBhbiBhbW91bnQgcHJvcG9ydGlvbmFsIHRvIHRoZSBjdXJyZW50IHNpemUsCisgICAgICAgZ2l2aW5nIHVzIGFtb3J0aXplZCBsaW5lYXItdGltZSBiZWhhdmlvci4gIEZvciBiaWdnZXIgc2l6ZXMsIHVzZSBhCisgICAgICAgbGVzcy10aGFuLWRvdWJsZSBncm93dGggZmFjdG9yIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBhbGxvY2F0aW9uLiAqLworICAgIGlmIChjdXJyZW50c2l6ZSA+IDY1NTM2KQorICAgICAgICBhZGRlbmQgPSBjdXJyZW50c2l6ZSA+PiAzOworICAgIGVsc2UKKyAgICAgICAgYWRkZW5kID0gMjU2ICsgY3VycmVudHNpemU7CisgICAgaWYgKGFkZGVuZCA8IFNNQUxMQ0hVTkspCisgICAgICAgIC8qIEF2b2lkIHRpbnkgcmVhZCgpIGNhbGxzLiAqLworICAgICAgICBhZGRlbmQgPSBTTUFMTENIVU5LOworICAgIHJldHVybiBhZGRlbmQgKyBjdXJyZW50c2l6ZTsKK30KKworLypbY2xpbmljIGlucHV0XQorX2lvLl9XaW5kb3dzQ29uc29sZUlPLnJlYWRhbGwKKworUmVhZCBhbGwgZGF0YSBmcm9tIHRoZSBjb25zb2xlLCByZXR1cm5lZCBhcyBieXRlcy4KKworUmV0dXJuIGFuIGVtcHR5IGJ5dGVzIG9iamVjdCBhdCBFT0YuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZGFsbF9pbXBsKHdpbmNvbnNvbGVpbyAqc2VsZikKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lNmQzMTJjNjg0ZjZlMjNiIGlucHV0PTQwMjRkNjQ5YTEwMDZlNjldKi8KK3sKKyAgICB3Y2hhcl90ICpidWY7CisgICAgRFdPUkQgYnVmc2l6ZSwgbiwgbGVuID0gMDsKKyAgICBQeU9iamVjdCAqYnl0ZXM7CisgICAgRFdPUkQgYnl0ZXNfc2l6ZSwgcm47CisKKyAgICBpZiAoc2VsZi0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworCisgICAgYnVmc2l6ZSA9IEJVRlNJWjsKKworICAgIGJ1ZiA9ICh3Y2hhcl90KilQeU1lbV9NYWxsb2MoKGJ1ZnNpemUgKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHdjaGFyX3QgKnN1YmJ1ZjsKKworICAgICAgICBpZiAobGVuID49IChQeV9zc2l6ZV90KWJ1ZnNpemUpIHsKKyAgICAgICAgICAgIERXT1JEIG5ld3NpemUgPSBuZXdfYnVmZmVyc2l6ZShzZWxmLCBsZW4pOworICAgICAgICAgICAgaWYgKG5ld3NpemUgPiBCVUZNQVgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAobmV3c2l6ZSA8IGJ1ZnNpemUpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuYm91bmRlZCByZWFkIHJldHVybmVkIG1vcmUgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhbiBhIFB5dGhvbiBieXRlcyBvYmplY3QgY2FuIGhvbGQiKTsKKyAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZzaXplID0gbmV3c2l6ZTsKKworICAgICAgICAgICAgYnVmID0gUHlNZW1fUmVhbGxvYyhidWYsIChidWZzaXplICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOworICAgICAgICAgICAgaWYgKCFidWYpIHsKKyAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdWJidWYgPSByZWFkX2NvbnNvbGVfdyhzZWxmLT5oYW5kbGUsIGJ1ZnNpemUgLSBsZW4sICZuKTsKKworICAgICAgICBpZiAoc3ViYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAgICAgd2NzbmNweV9zKCZidWZbbGVuXSwgYnVmc2l6ZSAtIGxlbiArIDEsIHN1YmJ1Ziwgbik7CisKKyAgICAgICAgUHlNZW1fRnJlZShzdWJidWYpOworCisgICAgICAgIC8qIHdoZW4gdGhlIHJlYWQgc3RhcnRzIHdpdGggXlogb3IgaXMgZW1wdHkgd2UgYnJlYWsgKi8KKyAgICAgICAgaWYgKG4gPT0gMCB8fCBidWZbbGVuXSA9PSAnXHgxYScpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBsZW4gKz0gbjsKKyAgICB9CisKKyAgICBpZiAobGVuID4gMCAmJiBidWZbMF0gPT0gJ1x4MWEnICYmIF9idWZsZW4oc2VsZikgPT0gMCkgeworICAgICAgICAvKiB3aGVuIHRoZSByZXN1bHQgc3RhcnRzIHdpdGggXlogd2UgcmV0dXJuIGFuIGVtcHR5IGJ1ZmZlciAqLworICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOworICAgIH0KKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBieXRlc19zaXplID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VVEY4LCAwLCBidWYsIGxlbiwKKyAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAKKyAgICBpZiAoIWJ5dGVzX3NpemUpIHsKKyAgICAgICAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGVycik7CisgICAgfQorCisgICAgYnl0ZXNfc2l6ZSArPSBfYnVmbGVuKHNlbGYpOworICAgIGJ5dGVzID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBieXRlc19zaXplKTsKKyAgICBybiA9IF9jb3B5ZnJvbWJ1ZihzZWxmLCBQeUJ5dGVzX0FTX1NUUklORyhieXRlcyksIGJ5dGVzX3NpemUpOworCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGJ5dGVzX3NpemUgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsIDAsIGJ1ZiwgbGVuLAorICAgICAgICAmUHlCeXRlc19BU19TVFJJTkcoYnl0ZXMpW3JuXSwgYnl0ZXNfc2l6ZSAtIHJuLCBOVUxMLCBOVUxMKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgaWYgKCFieXRlc19zaXplKSB7CisgICAgICAgIERXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgICAgIFB5X0NMRUFSKGJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGVycik7CisgICAgfQorCisgICAgUHlNZW1fRnJlZShidWYpOworICAgIGlmIChieXRlc19zaXplIDwgKHNpemVfdClQeUJ5dGVzX0dFVF9TSVpFKGJ5dGVzKSkgeworICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZieXRlcywgbiAqIHNpemVvZih3Y2hhcl90KSkgPCAwKSB7CisgICAgICAgICAgICBQeV9DTEVBUihieXRlcyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYnl0ZXM7Cit9CisKKy8qW2NsaW5pYyBpbnB1dF0KK19pby5fV2luZG93c0NvbnNvbGVJTy5yZWFkCisgICAgc2l6ZTogaW9fc3NpemVfdCA9IC0xCisgICAgLworCitSZWFkIGF0IG1vc3Qgc2l6ZSBieXRlcywgcmV0dXJuZWQgYXMgYnl0ZXMuCisKK09ubHkgbWFrZXMgb25lIHN5c3RlbSBjYWxsIHdoZW4gc2l6ZSBpcyBhIHBvc2l0aXZlIGludGVnZXIsCitzbyBsZXNzIGRhdGEgbWF5IGJlIHJldHVybmVkIHRoYW4gcmVxdWVzdGVkLgorUmV0dXJuIGFuIGVtcHR5IGJ5dGVzIG9iamVjdCBhdCBFT0YuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfaW9fX1dpbmRvd3NDb25zb2xlSU9fcmVhZF9pbXBsKHdpbmNvbnNvbGVpbyAqc2VsZiwgUHlfc3NpemVfdCBzaXplKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTU3ZGY2OGFmOWY0YjIyZDAgaW5wdXQ9NmM1NmZjZWVjNDYwZjFkZF0qLworeworICAgIFB5T2JqZWN0ICpieXRlczsKKyAgICBQeV9zc2l6ZV90IGJ5dGVzX3NpemU7CisgICAgCisgICAgaWYgKHNlbGYtPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBpZiAoIXNlbGYtPnJlYWRhYmxlKQorICAgICAgICByZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKKworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIF9pb19fV2luZG93c0NvbnNvbGVJT19yZWFkYWxsX2ltcGwoc2VsZik7CisgICAgaWYgKHNpemUgPiBCVUZNQVgpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJjYW5ub3QgcmVhZCBtb3JlIHRoYW4gJWQgYnl0ZXMiLCBCVUZNQVgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBieXRlcyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7CisgICAgaWYgKGJ5dGVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYnl0ZXNfc2l6ZSA9IHJlYWRpbnRvKHNlbGYsIFB5Qnl0ZXNfQVNfU1RSSU5HKGJ5dGVzKSwgUHlCeXRlc19HRVRfU0laRShieXRlcykpOworICAgIGlmIChieXRlc19zaXplIDwgMCkgeworICAgICAgICBQeV9DTEVBUihieXRlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChieXRlc19zaXplIDwgUHlCeXRlc19HRVRfU0laRShieXRlcykpIHsKKyAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmYnl0ZXMsIGJ5dGVzX3NpemUpIDwgMCkgeworICAgICAgICAgICAgUHlfQ0xFQVIoYnl0ZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXM7Cit9CisKKy8qW2NsaW5pYyBpbnB1dF0KK19pby5fV2luZG93c0NvbnNvbGVJTy53cml0ZQorICAgIGI6IFB5X2J1ZmZlcgorICAgIC8KKworV3JpdGUgYnVmZmVyIGIgdG8gZmlsZSwgcmV0dXJuIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorCitPbmx5IG1ha2VzIG9uZSBzeXN0ZW0gY2FsbCwgc28gbm90IGFsbCBvZiB0aGUgZGF0YSBtYXkgYmUgd3JpdHRlbi4KK1RoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiBpcyByZXR1cm5lZC4KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19pb19fV2luZG93c0NvbnNvbGVJT193cml0ZV9pbXBsKHdpbmNvbnNvbGVpbyAqc2VsZiwgUHlfYnVmZmVyICpiKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTc3NWJkYjE2ZmJmOTEzN2IgaW5wdXQ9YmUzNWZiNjI0Zjk3Yzk0MV0qLworeworICAgIEJPT0wgcmVzID0gVFJVRTsKKyAgICB3Y2hhcl90ICp3YnVmOworICAgIERXT1JEIGxlbiwgd2xlbiwgbiA9IDA7CisKKyAgICBpZiAoc2VsZi0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIGlmICghc2VsZi0+d3JpdGFibGUpCisgICAgICAgIHJldHVybiBlcnJfbW9kZSgid3JpdGluZyIpOworCisgICAgaWYgKGItPmxlbiA+IEJVRk1BWCkKKyAgICAgICAgbGVuID0gQlVGTUFYOworICAgIGVsc2UKKyAgICAgICAgbGVuID0gKERXT1JEKWItPmxlbjsKKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICB3bGVuID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAwLCBiLT5idWYsIGxlbiwgTlVMTCwgMCk7CisKKyAgICAvKiBpc3N1ZTExMzk1IHRoZXJlIGlzIGFuIHVuc3BlY2lmaWVkIHVwcGVyIGJvdW5kIG9uIGhvdyBtYW55IGJ5dGVzCisgICAgICAgY2FuIGJlIHdyaXR0ZW4gYXQgb25jZS4gV2UgY2FwIGF0IDMyayAtIHRoZSBjYWxsZXIgd2lsbCBoYXZlIHRvCisgICAgICAgaGFuZGxlIHBhcnRpYWwgd3JpdGVzLgorICAgICAgIFNpbmNlIHdlIGRvbid0IGtub3cgaG93IG1hbnkgaW5wdXQgYnl0ZXMgYXJlIGJlaW5nIGlnbm9yZWQsIHdlCisgICAgICAgaGF2ZSB0byByZWR1Y2UgYW5kIHJlY2FsY3VsYXRlLiAqLworICAgIHdoaWxlICh3bGVuID4gMzI3NjYgLyBzaXplb2Yod2NoYXJfdCkpIHsKKyAgICAgICAgbGVuIC89IDI7CisgICAgICAgIHdsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VURjgsIDAsIGItPmJ1ZiwgbGVuLCBOVUxMLCAwKTsKKyAgICB9CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAKKyAgICBpZiAoIXdsZW4pCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKworICAgIHdidWYgPSAod2NoYXJfdCopUHlNZW1fTWFsbG9jKHdsZW4gKiBzaXplb2Yod2NoYXJfdCkpOworCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHdsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VURjgsIDAsIGItPmJ1ZiwgbGVuLCB3YnVmLCB3bGVuKTsKKyAgICBpZiAod2xlbikgeworICAgICAgICByZXMgPSBXcml0ZUNvbnNvbGVXKHNlbGYtPmhhbmRsZSwgd2J1Ziwgd2xlbiwgJm4sIE5VTEwpOworICAgICAgICBpZiAobiA8IHdsZW4pIHsKKyAgICAgICAgICAgIC8qIFdyb3RlIGZld2VyIGNoYXJhY3RlcnMgdGhhbiBleHBlY3RlZCwgd2hpY2ggbWVhbnMgb3VyCisgICAgICAgICAgICAgKiBsZW4gdmFsdWUgbWF5IGJlIHdyb25nLiBTbyByZWNhbGN1bGF0ZSBpdCBmcm9tIHRoZQorICAgICAgICAgICAgICogY2hhcmFjdGVycyB0aGF0IHdlcmUgd3JpdHRlbi4gQXMgdGhpcyBjb3VsZCBwb3RlbnRpYWxseQorICAgICAgICAgICAgICogcmVzdWx0IGluIGEgZGlmZmVyZW50IHZhbHVlLCB3ZSBhbHNvIHZhbGlkYXRlIHRoYXQgdmFsdWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgd2J1ZiwgbiwKKyAgICAgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgICAgICB3bGVuID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAwLCBiLT5idWYsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHdsZW4gPT0gbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICByZXMgPSAwOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgCisgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIFB5TWVtX0ZyZWUod2J1Zik7CisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihlcnIpOworICAgIH0KKworICAgIFB5TWVtX0ZyZWUod2J1Zik7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChsZW4pOworfQorCitzdGF0aWMgUHlPYmplY3QgKgord2luY29uc29sZWlvX3JlcHIod2luY29uc29sZWlvICpzZWxmKQoreworICAgIGlmIChzZWxmLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiPF9pby5fV2luZG93c0NvbnNvbGVJTyBbY2xvc2VkXT4iKTsKKworICAgIGlmIChzZWxmLT5yZWFkYWJsZSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tRm9ybWF0KCI8X2lvLl9XaW5kb3dzQ29uc29sZUlPIG1vZGU9J3JiJyBjbG9zZWZkPSVzPiIsCisgICAgICAgICAgICBzZWxmLT5jbG9zZWhhbmRsZSA/ICJUcnVlIiA6ICJGYWxzZSIpOworICAgIGlmIChzZWxmLT53cml0YWJsZSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tRm9ybWF0KCI8X2lvLl9XaW5kb3dzQ29uc29sZUlPIG1vZGU9J3diJyBjbG9zZWZkPSVzPiIsCisgICAgICAgICAgICBzZWxmLT5jbG9zZWhhbmRsZSA/ICJUcnVlIiA6ICJGYWxzZSIpOworCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiX1dpbmRvd3NDb25zb2xlSU8gaGFzIGludmFsaWQgbW9kZSIpOworICAgIHJldHVybiBOVUxMOworfQorCisvKltjbGluaWMgaW5wdXRdCitfaW8uX1dpbmRvd3NDb25zb2xlSU8uaXNhdHR5CisKK0Fsd2F5cyBUcnVlLgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorX2lvX19XaW5kb3dzQ29uc29sZUlPX2lzYXR0eV9pbXBsKHdpbmNvbnNvbGVpbyAqc2VsZikKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05ZWFjMDlkMjg3YzExYmQ3IGlucHV0PTliOTE1OTFkYmUzNTZmODZdKi8KK3sKKyAgICBpZiAoc2VsZi0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIAorICAgIFB5X1JFVFVSTl9UUlVFOworfQorCitzdGF0aWMgUHlPYmplY3QgKgord2luY29uc29sZWlvX2dldHN0YXRlKHdpbmNvbnNvbGVpbyAqc2VsZikKK3sKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiY2Fubm90IHNlcmlhbGl6ZSAnJXMnIG9iamVjdCIsIFB5X1RZUEUoc2VsZiktPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOworfQorCisjaW5jbHVkZSAiY2xpbmljL3dpbmNvbnNvbGVpby5jLmgiCisKK3N0YXRpYyBQeU1ldGhvZERlZiB3aW5jb25zb2xlaW9fbWV0aG9kc1tdID0geworICAgIF9JT19fV0lORE9XU0NPTlNPTEVJT19SRUFEX01FVEhPRERFRgorICAgIF9JT19fV0lORE9XU0NPTlNPTEVJT19SRUFEQUxMX01FVEhPRERFRgorICAgIF9JT19fV0lORE9XU0NPTlNPTEVJT19SRUFESU5UT19NRVRIT0RERUYKKyAgICBfSU9fX1dJTkRPV1NDT05TT0xFSU9fV1JJVEVfTUVUSE9EREVGCisgICAgX0lPX19XSU5ET1dTQ09OU09MRUlPX0NMT1NFX01FVEhPRERFRgorICAgIF9JT19fV0lORE9XU0NPTlNPTEVJT19SRUFEQUJMRV9NRVRIT0RERUYKKyAgICBfSU9fX1dJTkRPV1NDT05TT0xFSU9fV1JJVEFCTEVfTUVUSE9EREVGCisgICAgX0lPX19XSU5ET1dTQ09OU09MRUlPX0ZJTEVOT19NRVRIT0RERUYKKyAgICBfSU9fX1dJTkRPV1NDT05TT0xFSU9fSVNBVFRZX01FVEhPRERFRgorICAgIHsiX19nZXRzdGF0ZV9fIiwgKFB5Q0Z1bmN0aW9uKXdpbmNvbnNvbGVpb19nZXRzdGF0ZSwgTUVUSF9OT0FSR1MsIE5VTEx9LAorICAgIHtOVUxMLCAgICAgICAgICAgTlVMTH0gICAgICAgICAgICAgLyogc2VudGluZWwgKi8KK307CisKKy8qICdjbG9zZWQnIGFuZCAnbW9kZScgYXJlIGF0dHJpYnV0ZXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBGaWxlSU8uICovCisKK3N0YXRpYyBQeU9iamVjdCAqCitnZXRfY2xvc2VkKHdpbmNvbnNvbGVpbyAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShzZWxmLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2dldF9jbG9zZWZkKHdpbmNvbnNvbGVpbyAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShzZWxmLT5jbG9zZWhhbmRsZSkpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorZ2V0X21vZGUod2luY29uc29sZWlvICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZyhzZWxmLT5yZWFkYWJsZSA/ICJyYiIgOiAid2IiKTsKK30KKworc3RhdGljIFB5R2V0U2V0RGVmIHdpbmNvbnNvbGVpb19nZXRzZXRsaXN0W10gPSB7CisgICAgeyJjbG9zZWQiLCAoZ2V0dGVyKWdldF9jbG9zZWQsIE5VTEwsICJUcnVlIGlmIHRoZSBmaWxlIGlzIGNsb3NlZCJ9LAorICAgIHsiY2xvc2VmZCIsIChnZXR0ZXIpZ2V0X2Nsb3NlZmQsIE5VTEwsCisgICAgICAgICJUcnVlIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3Igd2lsbCBiZSBjbG9zZWQgYnkgY2xvc2UoKS4ifSwKKyAgICB7Im1vZGUiLCAoZ2V0dGVyKWdldF9tb2RlLCBOVUxMLCAiU3RyaW5nIGdpdmluZyB0aGUgZmlsZSBtb2RlIn0sCisgICAge05VTEx9LAorfTsKKworc3RhdGljIFB5TWVtYmVyRGVmIHdpbmNvbnNvbGVpb19tZW1iZXJzW10gPSB7CisgICAgeyJfYmxrc2l6ZSIsIFRfVUlOVCwgb2Zmc2V0b2Yod2luY29uc29sZWlvLCBibGtzaXplKSwgMH0sCisgICAgeyJfZmluYWxpemluZyIsIFRfQk9PTCwgb2Zmc2V0b2Yod2luY29uc29sZWlvLCBmaW5hbGl6aW5nKSwgMH0sCisgICAge05VTEx9Cit9OworCitQeVR5cGVPYmplY3QgUHlXaW5kb3dzQ29uc29sZUlPX1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9pby5fV2luZG93c0NvbnNvbGVJTyIsCisgICAgc2l6ZW9mKHdpbmNvbnNvbGVpbyksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3Rvcil3aW5jb25zb2xlaW9fZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXNlcnZlZCAqLworICAgIChyZXByZnVuYyl3aW5jb25zb2xlaW9fcmVwciwgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUKKyAgICAgICAgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfCBQeV9UUEZMQUdTX0hBVkVfRklOQUxJWkUsICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgX2lvX19XaW5kb3dzQ29uc29sZUlPX19faW5pdF9fX19kb2NfXywgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXdpbmNvbnNvbGVpb190cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpd2luY29uc29sZWlvX2NsZWFyLCAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZih3aW5jb25zb2xlaW8sIHdlYWtyZWZsaXN0KSwgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHdpbmNvbnNvbGVpb19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHdpbmNvbnNvbGVpb19tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIHdpbmNvbnNvbGVpb19nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIG9mZnNldG9mKHdpbmNvbnNvbGVpbywgZGljdCksICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIF9pb19fV2luZG93c0NvbnNvbGVJT19fX2luaXRfXywgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICB3aW5jb25zb2xlaW9fbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXNfZ2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tcm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhY2hlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdWJjbGFzc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF92ZXJzaW9uX3RhZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmluYWxpemUgKi8KK307CisKKyNlbmRpZiAvKiBNU19XSU5ET1dTICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19qc29uLmMgYi9Nb2R1bGVzL19qc29uLmMKaW5kZXggZjgyYWYzNC4uZDNkYmY5OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fanNvbi5jCisrKyBiL01vZHVsZXMvX2pzb24uYwpAQCAtMTEyLDcgKzExMiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2VuY29kZWRfY29uc3QoUHlPYmplY3QgKm9iaik7CiBzdGF0aWMgdm9pZAotcmFpc2VfZXJybXNnKGNoYXIgKm1zZywgUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgZW5kKTsKK3JhaXNlX2Vycm1zZyhjb25zdCBjaGFyICptc2csIFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGVuZCk7CiBzdGF0aWMgUHlPYmplY3QgKgogZW5jb2Rlcl9lbmNvZGVfc3RyaW5nKFB5RW5jb2Rlck9iamVjdCAqcywgUHlPYmplY3QgKm9iaik7CiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMzIxLDcgKzMyMSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1yYWlzZV9lcnJtc2coY2hhciAqbXNnLCBQeU9iamVjdCAqcywgUHlfc3NpemVfdCBlbmQpCityYWlzZV9lcnJtc2coY29uc3QgY2hhciAqbXNnLCBQeU9iamVjdCAqcywgUHlfc3NpemVfdCBlbmQpCiB7CiAgICAgLyogVXNlIEpTT05EZWNvZGVFcnJvciBleGNlcHRpb24gdG8gcmFpc2UgYSBuaWNlIGxvb2tpbmcgVmFsdWVFcnJvciBzdWJjbGFzcyAqLwogICAgIHN0YXRpYyBQeU9iamVjdCAqSlNPTkRlY29kZUVycm9yID0gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jIGIvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMKaW5kZXggYjFkNmFkZC4uODI1OTE4MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogLyogdGhlIGdyb3VwaW5nIGlzIHRlcm1pbmF0ZWQgYnkgZWl0aGVyIDAgb3IgQ0hBUl9NQVggKi8KIHN0YXRpYyBQeU9iamVjdCoKLWNvcHlfZ3JvdXBpbmcoY2hhciogcykKK2NvcHlfZ3JvdXBpbmcoY29uc3QgY2hhciogcykKIHsKICAgICBpbnQgaTsKICAgICBQeU9iamVjdCAqcmVzdWx0LCAqdmFsID0gTlVMTDsKQEAgLTYyMSw1MyArNjIxLDM0IEBACiBQeU1PRElOSVRfRlVOQwogUHlJbml0X19sb2NhbGUodm9pZCkKIHsKLSAgICBQeU9iamVjdCAqbSwgKmQsICp4OworICAgIFB5T2JqZWN0ICptOwogI2lmZGVmIEhBVkVfTEFOR0lORk9fSAogICAgIGludCBpOwogI2VuZGlmCiAKICAgICBtID0gUHlNb2R1bGVfQ3JlYXRlKCZfbG9jYWxlbW9kdWxlKTsKICAgICBpZiAobSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhMQ19DVFlQRSk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxDX0NUWVBFIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKLQotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoTENfVElNRSk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxDX1RJTUUiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOwotCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhMQ19DT0xMQVRFKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTENfQ09MTEFURSIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7Ci0KLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKExDX01PTkVUQVJZKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTENfTU9ORVRBUlkiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIExDX0NUWVBFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBMQ19USU1FKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBMQ19DT0xMQVRFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBMQ19NT05FVEFSWSk7CiAKICNpZmRlZiBMQ19NRVNTQUdFUwotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoTENfTUVTU0FHRVMpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMQ19NRVNTQUdFUyIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgTENfTUVTU0FHRVMpOwogI2VuZGlmIC8qIExDX01FU1NBR0VTICovCiAKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKExDX05VTUVSSUMpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMQ19OVU1FUklDIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKLQotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoTENfQUxMKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTENfQUxMIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKLQotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoQ0hBUl9NQVgpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDSEFSX01BWCIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgTENfTlVNRVJJQyk7CisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgTENfQUxMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBDSEFSX01BWCk7CiAKICAgICBFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigibG9jYWxlLkVycm9yIiwgTlVMTCwgTlVMTCk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRXJyb3IpOworICAgIGlmIChFcnJvciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihtKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXJyb3IiLCBFcnJvcik7CiAKICNpZmRlZiBIQVZFX0xBTkdJTkZPX0gKICAgICBmb3IgKGkgPSAwOyBsYW5naW5mb19jb25zdGFudHNbaV0ubmFtZTsgaSsrKSB7CkBAIC02NzUsNiArNjU2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmdpbmZvX2NvbnN0YW50c1tpXS52YWx1ZSk7CiAgICAgfQogI2VuZGlmCisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYobSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICByZXR1cm4gbTsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbHNwcm9mLmMgYi9Nb2R1bGVzL19sc3Byb2YuYwppbmRleCA2NmU1MzRmLi5kYzNmOGFiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19sc3Byb2YuYworKysgYi9Nb2R1bGVzL19sc3Byb2YuYwpAQCAtMiwxNyArMiwxMyBAQAogI2luY2x1ZGUgImZyYW1lb2JqZWN0LmgiCiAjaW5jbHVkZSAicm90YXRpbmd0cmVlLmgiCiAKLSNpZiAhZGVmaW5lZChIQVZFX0xPTkdfTE9ORykKLSNlcnJvciAiVGhpcyBtb2R1bGUgcmVxdWlyZXMgbG9uZyBsb25ncyEiCi0jZW5kaWYKLQogLyoqKiBTZWxlY3Rpb24gb2YgYSBoaWdoLXByZWNpc2lvbiB0aW1lciAqKiovCiAKICNpZmRlZiBNU19XSU5ET1dTCiAKICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKLXN0YXRpYyBQWV9MT05HX0xPTkcKK3N0YXRpYyBsb25nIGxvbmcKIGhwVGltZXIodm9pZCkKIHsKICAgICBMQVJHRV9JTlRFR0VSIGxpOwpAQCAtMzksMTEgKzM1LDExIEBACiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CiAKLXN0YXRpYyBQWV9MT05HX0xPTkcKK3N0YXRpYyBsb25nIGxvbmcKIGhwVGltZXIodm9pZCkKIHsKICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBQWV9MT05HX0xPTkcgcmV0OworICAgIGxvbmcgbG9uZyByZXQ7CiAjaWZkZWYgR0VUVElNRU9GREFZX05PX1RaCiAgICAgZ2V0dGltZW9mZGF5KCZ0dik7CiAjZWxzZQpAQCAtNzAsOCArNjYsOCBAQAogLyogcmVwcmVzZW50cyBhIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGFub3RoZXIgZnVuY3Rpb24gKi8KIHR5cGVkZWYgc3RydWN0IF9Qcm9maWxlclN1YkVudHJ5IHsKICAgICByb3RhdGluZ19ub2RlX3QgaGVhZGVyOwotICAgIFBZX0xPTkdfTE9ORyB0dDsKLSAgICBQWV9MT05HX0xPTkcgaXQ7CisgICAgbG9uZyBsb25nIHR0OworICAgIGxvbmcgbG9uZyBpdDsKICAgICBsb25nIGNhbGxjb3VudDsKICAgICBsb25nIHJlY3Vyc2l2ZWNhbGxjb3VudDsKICAgICBsb25nIHJlY3Vyc2lvbkxldmVsOwpAQCAtODEsOCArNzcsOCBAQAogdHlwZWRlZiBzdHJ1Y3QgX1Byb2ZpbGVyRW50cnkgewogICAgIHJvdGF0aW5nX25vZGVfdCBoZWFkZXI7CiAgICAgUHlPYmplY3QgKnVzZXJPYmo7IC8qIFB5Q29kZU9iamVjdCwgb3IgYSBkZXNjcmlwdGl2ZSBzdHIgZm9yIGJ1aWx0aW5zICovCi0gICAgUFlfTE9OR19MT05HIHR0OyAvKiB0b3RhbCB0aW1lIGluIHRoaXMgZW50cnkgKi8KLSAgICBQWV9MT05HX0xPTkcgaXQ7IC8qIGlubGluZSB0aW1lIGluIHRoaXMgZW50cnkgKG5vdCBpbiBzdWJjYWxscykgKi8KKyAgICBsb25nIGxvbmcgdHQ7IC8qIHRvdGFsIHRpbWUgaW4gdGhpcyBlbnRyeSAqLworICAgIGxvbmcgbG9uZyBpdDsgLyogaW5saW5lIHRpbWUgaW4gdGhpcyBlbnRyeSAobm90IGluIHN1YmNhbGxzKSAqLwogICAgIGxvbmcgY2FsbGNvdW50OyAvKiBob3cgbWFueSB0aW1lcyB0aGlzIHdhcyBjYWxsZWQgKi8KICAgICBsb25nIHJlY3Vyc2l2ZWNhbGxjb3VudDsgLyogaG93IG1hbnkgdGltZXMgY2FsbGVkIHJlY3Vyc2l2ZWx5ICovCiAgICAgbG9uZyByZWN1cnNpb25MZXZlbDsKQEAgLTkwLDggKzg2LDggQEAKIH0gUHJvZmlsZXJFbnRyeTsKIAogdHlwZWRlZiBzdHJ1Y3QgX1Byb2ZpbGVyQ29udGV4dCB7Ci0gICAgUFlfTE9OR19MT05HIHQwOwotICAgIFBZX0xPTkdfTE9ORyBzdWJ0OworICAgIGxvbmcgbG9uZyB0MDsKKyAgICBsb25nIGxvbmcgc3VidDsKICAgICBzdHJ1Y3QgX1Byb2ZpbGVyQ29udGV4dCAqcHJldmlvdXM7CiAgICAgUHJvZmlsZXJFbnRyeSAqY3R4RW50cnk7CiB9IFByb2ZpbGVyQ29udGV4dDsKQEAgLTEyMSw5ICsxMTcsOSBAQAogI2RlZmluZSBET1VCTEVfVElNRVJfUFJFQ0lTSU9OICAgNDI5NDk2NzI5Ni4wCiBzdGF0aWMgUHlPYmplY3QgKmVtcHR5X3R1cGxlOwogCi1zdGF0aWMgUFlfTE9OR19MT05HIENhbGxFeHRlcm5hbFRpbWVyKFByb2ZpbGVyT2JqZWN0ICpwT2JqKQorc3RhdGljIGxvbmcgbG9uZyBDYWxsRXh0ZXJuYWxUaW1lcihQcm9maWxlck9iamVjdCAqcE9iaikKIHsKLSAgICBQWV9MT05HX0xPTkcgcmVzdWx0OworICAgIGxvbmcgbG9uZyByZXN1bHQ7CiAgICAgUHlPYmplY3QgKm8gPSBQeU9iamVjdF9DYWxsKHBPYmotPmV4dGVybmFsVGltZXIsIGVtcHR5X3R1cGxlLCBOVUxMKTsKICAgICBpZiAobyA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShwT2JqLT5leHRlcm5hbFRpbWVyKTsKQEAgLTEzNiwxMSArMTMyLDExIEBACiAgICAgfQogICAgIGVsc2UgewogICAgICAgICAvKiBpbnRlcnByZXQgdGhlIHJlc3VsdCBhcyBhIGRvdWJsZSBtZWFzdXJlZCBpbiBzZWNvbmRzLgotICAgICAgICAgICBBcyB0aGUgcHJvZmlsZXIgd29ya3Mgd2l0aCBQWV9MT05HX0xPTkcgaW50ZXJuYWxseQorICAgICAgICAgICBBcyB0aGUgcHJvZmlsZXIgd29ya3Mgd2l0aCBsb25nIGxvbmcgaW50ZXJuYWxseQogICAgICAgICAgICB3ZSBjb252ZXJ0IGl0IHRvIGEgbGFyZ2UgaW50ZWdlciAqLwogICAgICAgICBkb3VibGUgdmFsID0gUHlGbG9hdF9Bc0RvdWJsZShvKTsKICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgZGVsYXllZCB0byB0aGUgY29kZSBiZWxvdyAqLwotICAgICAgICByZXN1bHQgPSAoUFlfTE9OR19MT05HKSAodmFsICogRE9VQkxFX1RJTUVSX1BSRUNJU0lPTik7CisgICAgICAgIHJlc3VsdCA9IChsb25nIGxvbmcpICh2YWwgKiBET1VCTEVfVElNRVJfUFJFQ0lTSU9OKTsKICAgICB9CiAgICAgUHlfREVDUkVGKG8pOwogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CkBAIC0zNDIsOCArMzM4LDggQEAKIHN0YXRpYyB2b2lkCiBTdG9wKFByb2ZpbGVyT2JqZWN0ICpwT2JqLCBQcm9maWxlckNvbnRleHQgKnNlbGYsIFByb2ZpbGVyRW50cnkgKmVudHJ5KQogewotICAgIFBZX0xPTkdfTE9ORyB0dCA9IENBTExfVElNRVIocE9iaikgLSBzZWxmLT50MDsKLSAgICBQWV9MT05HX0xPTkcgaXQgPSB0dCAtIHNlbGYtPnN1YnQ7CisgICAgbG9uZyBsb25nIHR0ID0gQ0FMTF9USU1FUihwT2JqKSAtIHNlbGYtPnQwOworICAgIGxvbmcgbG9uZyBpdCA9IHR0IC0gc2VsZi0+c3VidDsKICAgICBpZiAoc2VsZi0+cHJldmlvdXMpCiAgICAgICAgIHNlbGYtPnByZXZpb3VzLT5zdWJ0ICs9IHR0OwogICAgIHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQgPSBzZWxmLT5wcmV2aW91czsKQEAgLTc2Miw3ICs3NTgsNiBAQAogc3RhdGljIGludAogcHJvZmlsZXJfaW5pdChQcm9maWxlck9iamVjdCAqcE9iaiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLSAgICBQeU9iamVjdCAqbzsKICAgICBQeU9iamVjdCAqdGltZXIgPSBOVUxMOwogICAgIGRvdWJsZSB0aW1ldW5pdCA9IDAuMDsKICAgICBpbnQgc3ViY2FsbHMgPSAxOwpAQCAtNzc3LDExICs3NzIsOSBAQAogCiAgICAgaWYgKHNldFN1YmNhbGxzKHBPYmosIHN1YmNhbGxzKSA8IDAgfHwgc2V0QnVpbHRpbnMocE9iaiwgYnVpbHRpbnMpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIG8gPSBwT2JqLT5leHRlcm5hbFRpbWVyOwotICAgIHBPYmotPmV4dGVybmFsVGltZXIgPSB0aW1lcjsKLSAgICBQeV9YSU5DUkVGKHRpbWVyKTsKLSAgICBQeV9YREVDUkVGKG8pOwogICAgIHBPYmotPmV4dGVybmFsVGltZXJVbml0ID0gdGltZXVuaXQ7CisgICAgUHlfWElOQ1JFRih0aW1lcik7CisgICAgUHlfWFNFVFJFRihwT2JqLT5leHRlcm5hbFRpbWVyLCB0aW1lcik7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2x6bWFtb2R1bGUuYyBiL01vZHVsZXMvX2x6bWFtb2R1bGUuYwppbmRleCBiYzAxZmZlLi41ZTE1OGZkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19sem1hbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fbHptYW1vZHVsZS5jCkBAIC0xOCwxMiArMTgsNiBAQAogCiAjaW5jbHVkZSA8bHptYS5oPgogCi0KLSNpZm5kZWYgUFlfTE9OR19MT05HCi0jZXJyb3IgIlRoaXMgbW9kdWxlIHJlcXVpcmVzIFBZX0xPTkdfTE9ORyB0byBiZSBkZWZpbmVkIgotI2VuZGlmCi0KLQogI2lmZGVmIFdJVEhfVEhSRUFECiAjZGVmaW5lIEFDUVVJUkVfTE9DSyhvYmopIGRvIHsgXAogICAgIGlmICghUHlUaHJlYWRfYWNxdWlyZV9sb2NrKChvYmopLT5sb2NrLCAwKSkgeyBcCkBAIC0xNjMsNyArMTU3LDcgQEAKICAgICAgIHVpbnQzMl90IC0gdGhlICJJIiAodW5zaWduZWQgaW50KSBzcGVjaWZpZXIgaXMgdGhlIHJpZ2h0IHNpemUsIGJ1dAogICAgICAgc2lsZW50bHkgaWdub3JlcyBvdmVyZmxvd3Mgb24gY29udmVyc2lvbi4KIAotICAgICAgbHptYV92bGkgLSB0aGUgIksiICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIHNwZWNpZmllciBpcyB0aGUgcmlnaHQKKyAgICAgIGx6bWFfdmxpIC0gdGhlICJLIiAodW5zaWduZWQgbG9uZyBsb25nKSBzcGVjaWZpZXIgaXMgdGhlIHJpZ2h0CiAgICAgICBzaXplLCBidXQgbGlrZSAiSSIgaXQgc2lsZW50bHkgaWdub3JlcyBvdmVyZmxvd3Mgb24gY29udmVyc2lvbi4KIAogICAgICAgbHptYV9tb2RlIGFuZCBsem1hX21hdGNoX2ZpbmRlciAtIHRoZXNlIGFyZSBlbnVtZXJhdGlvbiB0eXBlcywgYW5kCkBAIC0xNzYsMTIgKzE3MCwxMiBAQAogICAgIHN0YXRpYyBpbnQgXAogICAgIEZVTkNOQU1FKFB5T2JqZWN0ICpvYmosIHZvaWQgKnB0cikgXAogICAgIHsgXAotICAgICAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOyBcCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7IFwKICAgICAgICAgXAogICAgICAgICB2YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKG9iaik7IFwKICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIFwKICAgICAgICAgICAgIHJldHVybiAwOyBcCi0gICAgICAgIGlmICgodW5zaWduZWQgUFlfTE9OR19MT05HKShUWVBFKXZhbCAhPSB2YWwpIHsgXAorICAgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcgbG9uZykoVFlQRSl2YWwgIT0gdmFsKSB7IFwKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIHRvbyBsYXJnZSBmb3IgIiAjVFlQRSAiIHR5cGUiKTsgXAogICAgICAgICAgICAgcmV0dXJuIDA7IFwKQEAgLTM5OCw3ICszOTIsNyBAQAogICAgUHl0aG9uLWxldmVsIGZpbHRlciBzcGVjaWZpZXJzIChyZXByZXNlbnRlZCBhcyBkaWN0cykuICovCiAKIHN0YXRpYyBpbnQKLXNwZWNfYWRkX2ZpZWxkKFB5T2JqZWN0ICpzcGVjLCBfUHlfSWRlbnRpZmllciAqa2V5LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsdWUpCitzcGVjX2FkZF9maWVsZChQeU9iamVjdCAqc3BlYywgX1B5X0lkZW50aWZpZXIgKmtleSwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKQogewogICAgIGludCBzdGF0dXM7CiAgICAgUHlPYmplY3QgKnZhbHVlX29iamVjdDsKQEAgLTU1Myw3ICs1NDcsNiBAQAogLypbY2xpbmljIGlucHV0XQogX2x6bWEuTFpNQUNvbXByZXNzb3IuY29tcHJlc3MKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iQ29tcHJlc3NvciAqIikKICAgICBkYXRhOiBQeV9idWZmZXIKICAgICAvCiAKQEAgLTU2Nyw3ICs1NjAsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogX2x6bWFfTFpNQUNvbXByZXNzb3JfY29tcHJlc3NfaW1wbChDb21wcmVzc29yICpzZWxmLCBQeV9idWZmZXIgKmRhdGEpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzFmNjE1MTM2OTYzZTAwZiBpbnB1dD04YjYwY2IxM2UwY2U2NDIwXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzFmNjE1MTM2OTYzZTAwZiBpbnB1dD02NDAxOWVhYzdmMmNjOGQwXSovCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKQEAgLTU4Myw4ICs1NzYsNiBAQAogLypbY2xpbmljIGlucHV0XQogX2x6bWEuTFpNQUNvbXByZXNzb3IuZmx1c2gKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iQ29tcHJlc3NvciAqIikKLQogRmluaXNoIHRoZSBjb21wcmVzc2lvbiBwcm9jZXNzLgogCiBSZXR1cm5zIHRoZSBjb21wcmVzc2VkIGRhdGEgbGVmdCBpbiBpbnRlcm5hbCBidWZmZXJzLgpAQCAtNTk0LDcgKzU4NSw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfbHptYV9MWk1BQ29tcHJlc3Nvcl9mbHVzaF9pbXBsKENvbXByZXNzb3IgKnNlbGYpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmVjMjFmM2UyMjUwNGY1MCBpbnB1dD0zMDYwZmIyNmY5YjQwNDJjXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmVjMjFmM2UyMjUwNGY1MCBpbnB1dD02YjM2OTMwM2Y2N2FkMGE4XSovCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKQEAgLTY5OCw3ICs2ODksNiBAQAogLypbLWNsaW5pYyBpbnB1dF0KIF9sem1hLkxaTUFDb21wcmVzc29yLl9faW5pdF9fCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IkNvbXByZXNzb3IgKiIpCiAgICAgZm9ybWF0OiBpbnQoY19kZWZhdWx0PSJGT1JNQVRfWFoiKSA9IEZPUk1BVF9YWgogICAgICAgICBUaGUgY29udGFpbmVyIGZvcm1hdCB0byB1c2UgZm9yIHRoZSBvdXRwdXQuICBUaGlzIGNhbgogICAgICAgICBiZSBGT1JNQVRfWFogKGRlZmF1bHQpLCBGT1JNQVRfQUxPTkUsIG9yIEZPUk1BVF9SQVcuCkBAIC0xMDYzLDcgKzEwNTMsNiBAQAogLypbY2xpbmljIGlucHV0XQogX2x6bWEuTFpNQURlY29tcHJlc3Nvci5kZWNvbXByZXNzCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IkRlY29tcHJlc3NvciAqIikKICAgICBkYXRhOiBQeV9idWZmZXIKICAgICBtYXhfbGVuZ3RoOiBQeV9zc2l6ZV90PS0xCiAKQEAgLTEwODYsNyArMTA3NSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2x6bWFfTFpNQURlY29tcHJlc3Nvcl9kZWNvbXByZXNzX2ltcGwoRGVjb21wcmVzc29yICpzZWxmLCBQeV9idWZmZXIgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heF9sZW5ndGgpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZWY0ZTIwZWM3MTIyMjQxZCBpbnB1dD1mMmJiOTAyY2MxY2FmMjAzXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZWY0ZTIwZWM3MTIyMjQxZCBpbnB1dD02MGMxZjEzNTgyMGUzMDlkXSovCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKQEAgLTExMjYsNyArMTExNSw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBfbHptYS5MWk1BRGVjb21wcmVzc29yLl9faW5pdF9fCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IkRlY29tcHJlc3NvciAqIikKICAgICBmb3JtYXQ6IGludChjX2RlZmF1bHQ9IkZPUk1BVF9BVVRPIikgPSBGT1JNQVRfQVVUTwogICAgICAgICBTcGVjaWZpZXMgdGhlIGNvbnRhaW5lciBmb3JtYXQgb2YgdGhlIGlucHV0IHN0cmVhbS4gIElmIHRoaXMgaXMKICAgICAgICAgRk9STUFUX0FVVE8gKHRoZSBkZWZhdWx0KSwgdGhlIGRlY29tcHJlc3NvciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0CkBAIC0xMTUyLDcgKzExNDAsNyBAQAogc3RhdGljIGludAogX2x6bWFfTFpNQURlY29tcHJlc3Nvcl9fX2luaXRfX19pbXBsKERlY29tcHJlc3NvciAqc2VsZiwgaW50IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbWVtbGltaXQsIFB5T2JqZWN0ICpmaWx0ZXJzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTNlMTgyMWY4YWEzNjU2NGMgaW5wdXQ9NDU4Y2E2MTMyZWYyOTgwMV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTNlMTgyMWY4YWEzNjU2NGMgaW5wdXQ9ODFmZTY4NGE2YzJmOGEyN10qLwogewogICAgIGNvbnN0IHVpbnQzMl90IGRlY29kZXJfZmxhZ3MgPSBMWk1BX1RFTExfQU5ZX0NIRUNLIHwgTFpNQV9URUxMX05PX0NIRUNLOwogICAgIHVpbnQ2NF90IG1lbWxpbWl0XyA9IFVJTlQ2NF9NQVg7CkBAIC0xNDQ3LDcgKzE0MzUsNyBAQAogLyogU29tZSBvZiBvdXIgY29uc3RhbnRzIGFyZSBtb3JlIHRoYW4gMzIgYml0cyB3aWRlLCBzbyBQeU1vZHVsZV9BZGRJbnRDb25zdGFudAogICAgd291bGQgbm90IHdvcmsgY29ycmVjdGx5IG9uIHBsYXRmb3JtcyB3aXRoIDMyLWJpdCBsb25ncy4gKi8KIHN0YXRpYyBpbnQKLW1vZHVsZV9hZGRfaW50X2NvbnN0YW50KFB5T2JqZWN0ICptLCBjb25zdCBjaGFyICpuYW1lLCBQWV9MT05HX0xPTkcgdmFsdWUpCittb2R1bGVfYWRkX2ludF9jb25zdGFudChQeU9iamVjdCAqbSwgY29uc3QgY2hhciAqbmFtZSwgbG9uZyBsb25nIHZhbHVlKQogewogICAgIFB5T2JqZWN0ICpvID0gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CiAgICAgaWYgKG8gPT0gTlVMTCkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuYyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuYwppbmRleCA0YWU2MzhlLi5kOTJhOGJmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMKKysrIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5jCkBAIC0xMjgsNyArMTI4LDcgQEAKICAgICB7InJlY3YiLCBtdWx0aXByb2Nlc3NpbmdfcmVjdiwgTUVUSF9WQVJBUkdTLCAiIn0sCiAgICAgeyJzZW5kIiwgbXVsdGlwcm9jZXNzaW5nX3NlbmQsIE1FVEhfVkFSQVJHUywgIiJ9LAogI2VuZGlmCi0jaWZuZGVmIFBPU0lYX1NFTUFQSE9SRVNfTk9UX0VOQUJMRUQKKyNpZiAhZGVmaW5lZChQT1NJWF9TRU1BUEhPUkVTX05PVF9FTkFCTEVEKSAmJiAhZGVmaW5lZChfX0FORFJPSURfXykKICAgICB7InNlbV91bmxpbmsiLCBfUHlNcF9zZW1fdW5saW5rLCBNRVRIX1ZBUkFSR1MsICIifSwKICNlbmRpZgogICAgIHtOVUxMfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5oIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5oCmluZGV4IDlhZWVhOGQuLjUxMmJjMTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuaAorKysgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmgKQEAgLTYwLDcgKzYwLDcgQEAKICNpZiBTSVpFT0ZfVk9JRF9QID09IFNJWkVPRl9MT05HCiAjICBkZWZpbmUgRl9QT0lOVEVSICJrIgogIyAgZGVmaW5lIFRfUE9JTlRFUiBUX1VMT05HCi0jZWxpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKSAmJiAoU0laRU9GX1ZPSURfUCA9PSBTSVpFT0ZfTE9OR19MT05HKQorI2VsaWYgU0laRU9GX1ZPSURfUCA9PSBTSVpFT0ZfTE9OR19MT05HCiAjICBkZWZpbmUgRl9QT0lOVEVSICJLIgogIyAgZGVmaW5lIFRfUE9JTlRFUiBUX1VMT05HTE9ORwogI2Vsc2UKZGlmZiAtLWdpdCBhL01vZHVsZXMvX29wZXJhdG9yLmMgYi9Nb2R1bGVzL19vcGVyYXRvci5jCmluZGV4IGRmZmYxZDIuLmZiOGVhZmMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX29wZXJhdG9yLmMKKysrIGIvTW9kdWxlcy9fb3BlcmF0b3IuYwpAQCAtMTExMSw2ICsxMTExLDggQEAKICAgICAgICAgUHlPYmplY3QgKmZ1bmN0b29sczsKICAgICAgICAgUHlPYmplY3QgKnBhcnRpYWw7CiAgICAgICAgIFB5T2JqZWN0ICpjb25zdHJ1Y3RvcjsKKyAgICAgICAgUHlPYmplY3QgKm5ld2FyZ3NbMl07CisKICAgICAgICAgX1B5X0lERU5USUZJRVIocGFydGlhbCk7CiAgICAgICAgIGZ1bmN0b29scyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiZnVuY3Rvb2xzIik7CiAgICAgICAgIGlmICghZnVuY3Rvb2xzKQpAQCAtMTExOSwxNyArMTEyMSwxMSBAQAogICAgICAgICBQeV9ERUNSRUYoZnVuY3Rvb2xzKTsKICAgICAgICAgaWYgKCFwYXJ0aWFsKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIG5ld2FyZ3MgPSBQeVR1cGxlX05ldygyKTsKLSAgICAgICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkgewotICAgICAgICAgICAgUHlfREVDUkVGKHBhcnRpYWwpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfSU5DUkVGKFB5X1RZUEUobWMpKTsKLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmdzLCAwLCAoUHlPYmplY3QgKilQeV9UWVBFKG1jKSk7Ci0gICAgICAgIFB5X0lOQ1JFRihtYy0+bmFtZSk7Ci0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgMSwgbWMtPm5hbWUpOwotICAgICAgICBjb25zdHJ1Y3RvciA9IFB5T2JqZWN0X0NhbGwocGFydGlhbCwgbmV3YXJncywgbWMtPmt3ZHMpOwotICAgICAgICBQeV9ERUNSRUYobmV3YXJncyk7CisKKyAgICAgICAgbmV3YXJnc1swXSA9IChQeU9iamVjdCAqKVB5X1RZUEUobWMpOworICAgICAgICBuZXdhcmdzWzFdID0gbWMtPm5hbWU7CisgICAgICAgIGNvbnN0cnVjdG9yID0gX1B5T2JqZWN0X0Zhc3RDYWxsRGljdChwYXJ0aWFsLCBuZXdhcmdzLCAyLCBtYy0+a3dkcyk7CisKICAgICAgICAgUHlfREVDUkVGKHBhcnRpYWwpOwogICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTk8iLCBjb25zdHJ1Y3RvciwgbWMtPmFyZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3BpY2tsZS5jIGIvTW9kdWxlcy9fcGlja2xlLmMKaW5kZXggM2MyMWI2YS4uZmMxNmM2MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fcGlja2xlLmMKKysrIGIvTW9kdWxlcy9fcGlja2xlLmMKQEAgLTE1Myw2ICsxNTMsOSBAQAogICAgIFB5T2JqZWN0ICpjb2RlY3NfZW5jb2RlOwogICAgIC8qIGJ1aWx0aW5zLmdldGF0dHIsIHVzZWQgZm9yIHNhdmluZyBuZXN0ZWQgbmFtZXMgd2l0aCBwcm90b2NvbCA8IDQgKi8KICAgICBQeU9iamVjdCAqZ2V0YXR0cjsKKyAgICAvKiBmdW5jdG9vbHMucGFydGlhbCwgdXNlZCBmb3IgaW1wbGVtZW50aW5nIF9fbmV3b2JqX2V4X18gd2l0aCBwcm90b2NvbHMKKyAgICAgICAyIGFuZCAzICovCisgICAgUHlPYmplY3QgKnBhcnRpYWw7CiB9IFBpY2tsZVN0YXRlOwogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBfcGlja2xlIG1vZHVsZSBkZWZpbml0aW9uLiAqLwpAQCAtMTkwLDYgKzE5Myw3IEBACiAgICAgUHlfQ0xFQVIoc3QtPmltcG9ydF9tYXBwaW5nXzN0bzIpOwogICAgIFB5X0NMRUFSKHN0LT5jb2RlY3NfZW5jb2RlKTsKICAgICBQeV9DTEVBUihzdC0+Z2V0YXR0cik7CisgICAgUHlfQ0xFQVIoc3QtPnBhcnRpYWwpOwogfQogCiAvKiBJbml0aWFsaXplIHRoZSBnaXZlbiBwaWNrbGUgbW9kdWxlIHN0YXRlLiAqLwpAQCAtMjAwLDYgKzIwNCw3IEBACiAgICAgUHlPYmplY3QgKmNvcHlyZWcgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpjb21wYXRfcGlja2xlID0gTlVMTDsKICAgICBQeU9iamVjdCAqY29kZWNzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZnVuY3Rvb2xzID0gTlVMTDsKIAogICAgIGJ1aWx0aW5zID0gUHlFdmFsX0dldEJ1aWx0aW5zKCk7CiAgICAgaWYgKGJ1aWx0aW5zID09IE5VTEwpCkBAIC0zMTQsMTIgKzMxOSwyMSBAQAogICAgIH0KICAgICBQeV9DTEVBUihjb2RlY3MpOwogCisgICAgZnVuY3Rvb2xzID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJmdW5jdG9vbHMiKTsKKyAgICBpZiAoIWZ1bmN0b29scykKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBzdC0+cGFydGlhbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuY3Rvb2xzLCAicGFydGlhbCIpOworICAgIGlmICghc3QtPnBhcnRpYWwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfQ0xFQVIoZnVuY3Rvb2xzKTsKKwogICAgIHJldHVybiAwOwogCiAgIGVycm9yOgogICAgIFB5X0NMRUFSKGNvcHlyZWcpOwogICAgIFB5X0NMRUFSKGNvbXBhdF9waWNrbGUpOwogICAgIFB5X0NMRUFSKGNvZGVjcyk7CisgICAgUHlfQ0xFQVIoZnVuY3Rvb2xzKTsKICAgICBfUGlja2xlX0NsZWFyU3RhdGUoc3QpOwogICAgIHJldHVybiAtMTsKIH0KQEAgLTMzMSw0MyArMzQ1LDIwIEBACiBfUGlja2xlX0Zhc3RDYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqb2JqKQogewogICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0gICAgUHlPYmplY3QgKmFyZ190dXBsZSA9IFB5VHVwbGVfTmV3KDEpOwogCi0gICAgLyogTm90ZTogdGhpcyBmdW5jdGlvbiB1c2VkIHRvIHJldXNlIHRoZSBhcmd1bWVudCB0dXBsZS4gVGhpcyB1c2VkIHRvIGdpdmUKLSAgICAgICBhIHNsaWdodCBwZXJmb3JtYW5jZSBib29zdCB3aXRoIG9sZGVyIHBpY2tsZSBpbXBsZW1lbnRhdGlvbnMgd2hlcmUgbWFueQotICAgICAgIHVuYnVmZmVyZWQgcmVhZHMgb2NjdXJyZWQgKHRodXMgbmVlZGluZyBtYW55IGZ1bmN0aW9uIGNhbGxzKS4KLQotICAgICAgIEhvd2V2ZXIsIHRoaXMgb3B0aW1pemF0aW9uIHdhcyByZW1vdmVkIGJlY2F1c2UgaXQgd2FzIHRvbyBjb21wbGljYXRlZAotICAgICAgIHRvIGdldCByaWdodC4gSXQgYWJ1c2VkIHRoZSBDIEFQSSBmb3IgdHVwbGVzIHRvIG11dGF0ZSB0aGVtIHdoaWNoIGxlZAotICAgICAgIHRvIHN1YnRsZSByZWZlcmVuY2UgY291bnRpbmcgYW5kIGNvbmN1cnJlbmN5IGJ1Z3MuIEZ1cnRoZXJtb3JlLCB0aGUKLSAgICAgICBpbnRyb2R1Y3Rpb24gb2YgcHJvdG9jb2wgNCBhbmQgdGhlIHByZWZldGNoaW5nIG9wdGltaXphdGlvbiB2aWEgcGVlaygpCi0gICAgICAgc2lnbmlmaWNhbnRseSByZWR1Y2VkIHRoZSBudW1iZXIgb2YgZnVuY3Rpb24gY2FsbHMgd2UgZG8uIFRodXMsIHRoZQotICAgICAgIGJlbmVmaXRzIGJlY2FtZSBtYXJnaW5hbCBhdCBiZXN0LiAqLwotCi0gICAgaWYgKGFyZ190dXBsZSA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihvYmopOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShhcmdfdHVwbGUsIDAsIG9iaik7Ci0gICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdfdHVwbGUsIE5VTEwpOwotICAgIFB5X0NMRUFSKGFyZ190dXBsZSk7CisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0NhbGxBcmcxKGZ1bmMsIG9iaik7CisgICAgUHlfREVDUkVGKG9iaik7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQKLXN0YWNrX3VuZGVyZmxvdyh2b2lkKQotewotICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKLSAgICBQeUVycl9TZXRTdHJpbmcoc3QtPlVucGlja2xpbmdFcnJvciwgInVucGlja2xpbmcgc3RhY2sgdW5kZXJmbG93Iik7Ci0gICAgcmV0dXJuIC0xOwotfQotCiAvKiBJbnRlcm5hbCBkYXRhIHR5cGUgdXNlZCBhcyB0aGUgdW5waWNrbGluZyBzdGFjay4gKi8KIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9WQVJfSEVBRAogICAgIFB5T2JqZWN0ICoqZGF0YTsKKyAgICBpbnQgbWFya19zZXQ7ICAgICAgICAgIC8qIGlzIE1BUksgc2V0PyAqLworICAgIFB5X3NzaXplX3QgZmVuY2U7ICAgICAgLyogcG9zaXRpb24gb2YgdG9wIE1BUksgb3IgMCAqLwogICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkOyAgLyogbnVtYmVyIG9mIHNsb3RzIGluIGRhdGEgYWxsb2NhdGVkICovCiB9IFBkYXRhOwogCkBAIC0zOTgsNiArMzg5LDggQEAKICAgICBpZiAoIShzZWxmID0gUHlPYmplY3RfTmV3KFBkYXRhLCAmUGRhdGFfVHlwZSkpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9TSVpFKHNlbGYpID0gMDsKKyAgICBzZWxmLT5tYXJrX3NldCA9IDA7CisgICAgc2VsZi0+ZmVuY2UgPSAwOwogICAgIHNlbGYtPmFsbG9jYXRlZCA9IDg7CiAgICAgc2VsZi0+ZGF0YSA9IFB5TWVtX01BTExPQyhzZWxmLT5hbGxvY2F0ZWQgKiBzaXplb2YoUHlPYmplY3QgKikpOwogICAgIGlmIChzZWxmLT5kYXRhKQpAQCAtNDE1LDggKzQwOCw3IEBACiB7CiAgICAgUHlfc3NpemVfdCBpID0gUHlfU0laRShzZWxmKTsKIAotICAgIGlmIChjbGVhcnRvIDwgMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGFzc2VydChjbGVhcnRvID49IHNlbGYtPmZlbmNlKTsKICAgICBpZiAoY2xlYXJ0byA+PSBpKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtNDUyLDYgKzQ0NCwxNyBAQAogICAgIHJldHVybiAtMTsKIH0KIAorc3RhdGljIGludAorUGRhdGFfc3RhY2tfdW5kZXJmbG93KFBkYXRhICpzZWxmKQoreworICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoc3QtPlVucGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+bWFya19zZXQgPworICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBNQVJLIGZvdW5kIiA6CisgICAgICAgICAgICAgICAgICAgICJ1bnBpY2tsaW5nIHN0YWNrIHVuZGVyZmxvdyIpOworICAgIHJldHVybiAtMTsKK30KKwogLyogRCBpcyBhIFBkYXRhKi4gIFBvcCB0aGUgdG9wbW9zdCBlbGVtZW50IGFuZCBzdG9yZSBpdCBpbnRvIFYsIHdoaWNoCiAgKiBtdXN0IGJlIGFuIGx2YWx1ZSBob2xkaW5nIFB5T2JqZWN0Ki4gIE9uIHN0YWNrIHVuZGVyZmxvdywgVW5waWNrbGluZ0Vycm9yCiAgKiBpcyByYWlzZWQgYW5kIFYgaXMgc2V0IHRvIE5VTEwuCkBAIC00NTksOSArNDYyLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQZGF0YV9wb3AoUGRhdGEgKnNlbGYpCiB7Ci0gICAgaWYgKFB5X1NJWkUoc2VsZikgPT0gMCkgewotICAgICAgICBQaWNrbGVTdGF0ZSAqc3QgPSBfUGlja2xlX0dldEdsb2JhbFN0YXRlKCk7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLCAiYmFkIHBpY2tsZSBkYXRhIik7CisgICAgaWYgKFB5X1NJWkUoc2VsZikgPD0gc2VsZi0+ZmVuY2UpIHsKKyAgICAgICAgUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIHNlbGYtPmRhdGFbLS1QeV9TSVpFKHNlbGYpXTsKQEAgLTQ5Myw2ICs0OTUsMTAgQEAKICAgICBQeU9iamVjdCAqdHVwbGU7CiAgICAgUHlfc3NpemVfdCBsZW4sIGksIGo7CiAKKyAgICBpZiAoc3RhcnQgPCBzZWxmLT5mZW5jZSkgeworICAgICAgICBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBsZW4gPSBQeV9TSVpFKHNlbGYpIC0gc3RhcnQ7CiAgICAgdHVwbGUgPSBQeVR1cGxlX05ldyhsZW4pOwogICAgIGlmICh0dXBsZSA9PSBOVUxMKQpAQCAtODYwLDcgKzg2Niw3IEBACiB7CiAgICAgc2l6ZV90IGk7CiAKLSAgICBhc3NlcnQoc2l6ZW9mKHNpemVfdCkgPD0gOCk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZihzaXplX3QpIDw9IDgpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzaXplX3QpOyBpKyspIHsKICAgICAgICAgb3V0W2ldID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiAoOCAqIGkpKSAmIDB4ZmYpOwpAQCAtMTA4Niw2ICsxMDkyLDE0IEBACiB9CiAKIHN0YXRpYyBpbnQKK2JhZF9yZWFkbGluZSh2b2lkKQoreworICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoc3QtPlVucGlja2xpbmdFcnJvciwgInBpY2tsZSBkYXRhIHdhcyB0cnVuY2F0ZWQiKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKIF9VbnBpY2tsZXJfU2tpcENvbnN1bWVkKFVucGlja2xlck9iamVjdCAqc2VsZikKIHsKICAgICBQeV9zc2l6ZV90IGNvbnN1bWVkOwpAQCAtMTEzNCw5ICsxMTQ4LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgaWYgKG4gPT0gUkVBRF9XSE9MRV9MSU5FKSB7Ci0gICAgICAgIFB5T2JqZWN0ICplbXB0eV90dXBsZSA9IFB5VHVwbGVfTmV3KDApOwotICAgICAgICBkYXRhID0gUHlPYmplY3RfQ2FsbChzZWxmLT5yZWFkbGluZSwgZW1wdHlfdHVwbGUsIE5VTEwpOwotICAgICAgICBQeV9ERUNSRUYoZW1wdHlfdHVwbGUpOworICAgICAgICBkYXRhID0gX1B5T2JqZWN0X0NhbGxOb0FyZyhzZWxmLT5yZWFkbGluZSk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICBQeU9iamVjdCAqbGVuOwpAQCAtMTE3NCw2ICsxMTg2LDM2IEBACiAgICAgcmV0dXJuIHJlYWRfc2l6ZTsKIH0KIAorLyogRG9uJ3QgY2FsbCBpdCBkaXJlY3RseTogdXNlIF9VbnBpY2tsZXJfUmVhZCgpICovCitzdGF0aWMgUHlfc3NpemVfdAorX1VucGlja2xlcl9SZWFkSW1wbChVbnBpY2tsZXJPYmplY3QgKnNlbGYsIGNoYXIgKipzLCBQeV9zc2l6ZV90IG4pCit7CisgICAgUHlfc3NpemVfdCBudW1fcmVhZDsKKworICAgICpzID0gTlVMTDsKKyAgICBpZiAoc2VsZi0+bmV4dF9yZWFkX2lkeCA+IFBZX1NTSVpFX1RfTUFYIC0gbikgeworICAgICAgICBQaWNrbGVTdGF0ZSAqc3QgPSBfUGlja2xlX0dldEdsb2JhbFN0YXRlKCk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQgd291bGQgb3ZlcmZsb3cgKGludmFsaWQgYnl0ZWNvZGUpIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBUaGlzIGNhc2UgaXMgaGFuZGxlZCBieSB0aGUgX1VucGlja2xlcl9SZWFkKCkgbWFjcm8gZm9yIGVmZmljaWVuY3kgKi8KKyAgICBhc3NlcnQoc2VsZi0+bmV4dF9yZWFkX2lkeCArIG4gPiBzZWxmLT5pbnB1dF9sZW4pOworCisgICAgaWYgKCFzZWxmLT5yZWFkKQorICAgICAgICByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisKKyAgICBudW1fcmVhZCA9IF9VbnBpY2tsZXJfUmVhZEZyb21GaWxlKHNlbGYsIG4pOworICAgIGlmIChudW1fcmVhZCA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobnVtX3JlYWQgPCBuKQorICAgICAgICByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgKnMgPSBzZWxmLT5pbnB1dF9idWZmZXI7CisgICAgc2VsZi0+bmV4dF9yZWFkX2lkeCA9IG47CisgICAgcmV0dXJuIG47Cit9CisKIC8qIFJlYWQgYG5gIGJ5dGVzIGZyb20gdGhlIHVucGlja2xlcidzIGRhdGEgc291cmNlLCBzdG9yaW5nIHRoZSByZXN1bHQgaW4gYCpzYC4KIAogICAgVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgYWxsIGRhdGEgcmVhZHMsIHJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGUgdW5waWNrbGVyJ3MKQEAgLTExODcsMzggKzEyMjksMTIgQEAKIAogICAgUmV0dXJucyAtMSAod2l0aCBhbiBleGNlcHRpb24gc2V0KSBvbiBmYWlsdXJlLiBPbiBzdWNjZXNzLCByZXR1cm4gdGhlCiAgICBudW1iZXIgb2YgY2hhcnMgcmVhZC4gKi8KLXN0YXRpYyBQeV9zc2l6ZV90Ci1fVW5waWNrbGVyX1JlYWQoVW5waWNrbGVyT2JqZWN0ICpzZWxmLCBjaGFyICoqcywgUHlfc3NpemVfdCBuKQotewotICAgIFB5X3NzaXplX3QgbnVtX3JlYWQ7Ci0KLSAgICAqcyA9IE5VTEw7Ci0gICAgaWYgKHNlbGYtPm5leHRfcmVhZF9pZHggPiBQWV9TU0laRV9UX01BWCAtIG4pIHsKLSAgICAgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOwotICAgICAgICBQeUVycl9TZXRTdHJpbmcoc3QtPlVucGlja2xpbmdFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIHdvdWxkIG92ZXJmbG93IChpbnZhbGlkIGJ5dGVjb2RlKSIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChzZWxmLT5uZXh0X3JlYWRfaWR4ICsgbiA8PSBzZWxmLT5pbnB1dF9sZW4pIHsKLSAgICAgICAgKnMgPSBzZWxmLT5pbnB1dF9idWZmZXIgKyBzZWxmLT5uZXh0X3JlYWRfaWR4OwotICAgICAgICBzZWxmLT5uZXh0X3JlYWRfaWR4ICs9IG47Ci0gICAgICAgIHJldHVybiBuOwotICAgIH0KLSAgICBpZiAoIXNlbGYtPnJlYWQpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0VPRkVycm9yLCAiUmFuIG91dCBvZiBpbnB1dCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG51bV9yZWFkID0gX1VucGlja2xlcl9SZWFkRnJvbUZpbGUoc2VsZiwgbik7Ci0gICAgaWYgKG51bV9yZWFkIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChudW1fcmVhZCA8IG4pIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0VPRkVycm9yLCAiUmFuIG91dCBvZiBpbnB1dCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgICpzID0gc2VsZi0+aW5wdXRfYnVmZmVyOwotICAgIHNlbGYtPm5leHRfcmVhZF9pZHggPSBuOwotICAgIHJldHVybiBuOwotfQorI2RlZmluZSBfVW5waWNrbGVyX1JlYWQoc2VsZiwgcywgbikgXAorICAgICgoKG4pIDw9IChzZWxmKS0+aW5wdXRfbGVuIC0gKHNlbGYpLT5uZXh0X3JlYWRfaWR4KSAgICAgIFwKKyAgICAgPyAoKihzKSA9IChzZWxmKS0+aW5wdXRfYnVmZmVyICsgKHNlbGYpLT5uZXh0X3JlYWRfaWR4LCBcCisgICAgICAgIChzZWxmKS0+bmV4dF9yZWFkX2lkeCArPSAobiksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAobikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgOiBfVW5waWNrbGVyX1JlYWRJbXBsKHNlbGYsIChzKSwgKG4pKSkKIAogc3RhdGljIFB5X3NzaXplX3QKIF9VbnBpY2tsZXJfQ29weUxpbmUoVW5waWNrbGVyT2JqZWN0ICpzZWxmLCBjaGFyICpsaW5lLCBQeV9zc2l6ZV90IGxlbiwKQEAgLTEyMzgsNyArMTI1NCw3IEBACiB9CiAKIC8qIFJlYWQgYSBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmVhbS9idWZmZXIuIElmIHdlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgaW5wdXQKLSAgIGJlZm9yZSBoaXR0aW5nIFxuLCByZXR1cm4gdGhlIGRhdGEgd2UgZm91bmQuCisgICBiZWZvcmUgaGl0dGluZyBcbiwgcmFpc2UgYW4gZXJyb3IuCiAKICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFycyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiAqLwogc3RhdGljIFB5X3NzaXplX3QKQEAgLTEyNTQsMjAgKzEyNzAsMTYgQEAKICAgICAgICAgICAgIHJldHVybiBfVW5waWNrbGVyX0NvcHlMaW5lKHNlbGYsIGxpbmVfc3RhcnQsIG51bV9yZWFkLCByZXN1bHQpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChzZWxmLT5yZWFkKSB7Ci0gICAgICAgIG51bV9yZWFkID0gX1VucGlja2xlcl9SZWFkRnJvbUZpbGUoc2VsZiwgUkVBRF9XSE9MRV9MSU5FKTsKLSAgICAgICAgaWYgKG51bV9yZWFkIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgc2VsZi0+bmV4dF9yZWFkX2lkeCA9IG51bV9yZWFkOwotICAgICAgICByZXR1cm4gX1VucGlja2xlcl9Db3B5TGluZShzZWxmLCBzZWxmLT5pbnB1dF9idWZmZXIsIG51bV9yZWFkLCByZXN1bHQpOwotICAgIH0KKyAgICBpZiAoIXNlbGYtPnJlYWQpCisgICAgICAgIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKIAotICAgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSd2ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZy4gUmV0dXJuIHRoZQotICAgICAgIHJlbWFpbmluZyBzdHJpbmcgYW5kIGxldCB0aGUgY2FsbGVyIGZpZ3VyZSBpdCBvdXQuICovCi0gICAgKnJlc3VsdCA9IHNlbGYtPmlucHV0X2J1ZmZlciArIHNlbGYtPm5leHRfcmVhZF9pZHg7Ci0gICAgbnVtX3JlYWQgPSBpIC0gc2VsZi0+bmV4dF9yZWFkX2lkeDsKLSAgICBzZWxmLT5uZXh0X3JlYWRfaWR4ID0gaTsKLSAgICByZXR1cm4gbnVtX3JlYWQ7CisgICAgbnVtX3JlYWQgPSBfVW5waWNrbGVyX1JlYWRGcm9tRmlsZShzZWxmLCBSRUFEX1dIT0xFX0xJTkUpOworICAgIGlmIChudW1fcmVhZCA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobnVtX3JlYWQgPT0gMCB8fCBzZWxmLT5pbnB1dF9idWZmZXJbbnVtX3JlYWQgLSAxXSAhPSAnXG4nKQorICAgICAgICByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgc2VsZi0+bmV4dF9yZWFkX2lkeCA9IG51bV9yZWFkOworICAgIHJldHVybiBfVW5waWNrbGVyX0NvcHlMaW5lKHNlbGYsIHNlbGYtPmlucHV0X2J1ZmZlciwgbnVtX3JlYWQsIHJlc3VsdCk7CiB9CiAKIC8qIFJldHVybnMgLTEgKHdpdGggYW4gZXhjZXB0aW9uIHNldCkgb24gZmFpbHVyZSwgMCBvbiBzdWNjZXNzLiBUaGUgbWVtbyBhcnJheQpAQCAtMjA5NiwzOCArMjEwOCwzNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJhd191bmljb2RlX2VzY2FwZShQeU9iamVjdCAqb2JqKQogewotICAgIFB5T2JqZWN0ICpyZXByOwogICAgIGNoYXIgKnA7CiAgICAgUHlfc3NpemVfdCBpLCBzaXplOwotICAgIHNpemVfdCBleHBhbmRzaXplOwogICAgIHZvaWQgKmRhdGE7CiAgICAgdW5zaWduZWQgaW50IGtpbmQ7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShvYmopKQogICAgICAgICByZXR1cm4gTlVMTDsKIAorICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisKICAgICBzaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgob2JqKTsKICAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEob2JqKTsKICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQob2JqKTsKLSAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfNEJZVEVfS0lORCkKLSAgICAgICAgZXhwYW5kc2l6ZSA9IDEwOwotICAgIGVsc2UKLSAgICAgICAgZXhwYW5kc2l6ZSA9IDY7CiAKLSAgICBpZiAoKHNpemVfdClzaXplID4gKHNpemVfdClQWV9TU0laRV9UX01BWCAvIGV4cGFuZHNpemUpCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotICAgIHJlcHIgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGV4cGFuZHNpemUgKiBzaXplKTsKLSAgICBpZiAocmVwciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoc2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gcmVwcjsKLSAgICBhc3NlcnQoUHlfUkVGQ05UKHJlcHIpID09IDEpOworICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBzaXplKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOwogCi0gICAgcCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpOwogICAgIGZvciAoaT0wOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKICAgICAgICAgLyogTWFwIDMyLWJpdCBjaGFyYWN0ZXJzIHRvICdcVXh4eHh4eHh4JyAqLwogICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgeworICAgICAgICAgICAgLyogLTE6IHN1YnRyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDEwLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAnVSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAyOCkgJiAweGZdOwpAQCAtMjEzOSw4ICsyMTQ4LDEzIEBACiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiA0KSAmIDB4Zl07CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzW2NoICYgMTVdOwogICAgICAgICB9Ci0gICAgICAgIC8qIE1hcCAxNi1iaXQgY2hhcmFjdGVycyB0byAnXHV4eHh4JyAqLworICAgICAgICAvKiBNYXAgMTYtYml0IGNoYXJhY3RlcnMsICdcXCcgYW5kICdcbicgdG8gJ1x1eHh4eCcgKi8KICAgICAgICAgZWxzZSBpZiAoY2ggPj0gMjU2IHx8IGNoID09ICdcXCcgfHwgY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgLyogLTE6IHN1YnRyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDYtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICd1JzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDEyKSAmIDB4Zl07CkBAIC0yMTUyLDE0ICsyMTY2LDE2IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICAgICpwKysgPSAoY2hhcikgY2g7CiAgICAgfQotICAgIHNpemUgPSBwIC0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVwciwgc2l6ZSkgPCAwKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcmVwcjsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CisKK2Vycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKLXdyaXRlX3V0ZjgoUGlja2xlck9iamVjdCAqc2VsZiwgY2hhciAqZGF0YSwgUHlfc3NpemVfdCBzaXplKQord3JpdGVfdXRmOChQaWNrbGVyT2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpkYXRhLCBQeV9zc2l6ZV90IHNpemUpCiB7CiAgICAgY2hhciBoZWFkZXJbOV07CiAgICAgUHlfc3NpemVfdCBsZW47CkBAIC0yODU4LDcgKzI4NzQsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgX1B5X0lERU5USUZJRVIoaXRlbXMpOwogCi0gICAgICAgICAgICBpdGVtcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQob2JqLCAmUHlJZF9pdGVtcywgIigpIik7CisgICAgICAgICAgICBpdGVtcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQob2JqLCAmUHlJZF9pdGVtcywgTlVMTCk7CiAgICAgICAgICAgICBpZiAoaXRlbXMgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlbXMpOwpAQCAtMzUzNSwxMSArMzU1MSw5IEBACiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgewotICAgICAgICAgICAgaWYgKHNlbGYtPnByb3RvID49IDQpIHsKLSAgICAgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX25ld29ial9leF9fKTsKLSAgICAgICAgICAgICAgICB1c2VfbmV3b2JqX2V4ID0gUHlVbmljb2RlX0NvbXBhcmUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBfUHlVbmljb2RlX0Zyb21JZCgmUHlJZF9fX25ld29ial9leF9fKSkgPT0gMDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3b2JqX2V4X18pOworICAgICAgICAgICAgdXNlX25ld29ial9leCA9IFB5VW5pY29kZV9Db21wYXJlKAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBfUHlVbmljb2RlX0Zyb21JZCgmUHlJZF9fX25ld29ial9leF9fKSkgPT0gMDsKICAgICAgICAgICAgIGlmICghdXNlX25ld29ial9leCkgewogICAgICAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3b2JqX18pOwogICAgICAgICAgICAgICAgIHVzZV9uZXdvYmogPSBQeVVuaWNvZGVfQ29tcGFyZSgKQEAgLTM1ODMsMTEgKzM1OTcsNTggQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzYXZlKHNlbGYsIGNscywgMCkgPCAwIHx8Ci0gICAgICAgICAgICBzYXZlKHNlbGYsIGFyZ3MsIDApIDwgMCB8fAotICAgICAgICAgICAgc2F2ZShzZWxmLCBrd2FyZ3MsIDApIDwgMCB8fAotICAgICAgICAgICAgX1BpY2tsZXJfV3JpdGUoc2VsZiwgJm5ld29ial9leF9vcCwgMSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChzZWxmLT5wcm90byA+PSA0KSB7CisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBjbHMsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIHNhdmUoc2VsZiwgYXJncywgMCkgPCAwIHx8CisgICAgICAgICAgICAgICAgc2F2ZShzZWxmLCBrd2FyZ3MsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIF9QaWNrbGVyX1dyaXRlKHNlbGYsICZuZXdvYmpfZXhfb3AsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuZXdhcmdzOworICAgICAgICAgICAgUHlPYmplY3QgKmNsc19uZXc7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX25ld19fKTsKKworICAgICAgICAgICAgbmV3YXJncyA9IFB5VHVwbGVfTmV3KFB5X1NJWkUoYXJncykgKyAyKTsKKyAgICAgICAgICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBjbHNfbmV3ID0gX1B5T2JqZWN0X0dldEF0dHJJZChjbHMsICZQeUlkX19fbmV3X18pOworICAgICAgICAgICAgaWYgKGNsc19uZXcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIDAsIGNsc19uZXcpOworICAgICAgICAgICAgUHlfSU5DUkVGKGNscyk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIDEsIGNscyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShhcmdzKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIGkgKyAyLCBpdGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FsbGFibGUgPSBQeU9iamVjdF9DYWxsKHN0LT5wYXJ0aWFsLCBuZXdhcmdzLCBrd2FyZ3MpOworICAgICAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICAgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBuZXdhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgICAgICBpZiAobmV3YXJncyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIGNhbGxhYmxlLCAwKSA8IDAgfHwKKyAgICAgICAgICAgICAgICBzYXZlKHNlbGYsIG5ld2FyZ3MsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIF9QaWNrbGVyX1dyaXRlKHNlbGYsICZyZWR1Y2Vfb3AsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSBpZiAodXNlX25ld29iaikgewpAQCAtMzg3NywxMCArMzkzOCw3IEBACiAgICAgICAgICAgICAvKiBDaGVjayBmb3IgYSBfX3JlZHVjZV9fIG1ldGhvZC4gKi8KICAgICAgICAgICAgIHJlZHVjZV9mdW5jID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX19fcmVkdWNlX18pOwogICAgICAgICAgICAgaWYgKHJlZHVjZV9mdW5jICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqZW1wdHlfdHVwbGUgPSBQeVR1cGxlX05ldygwKTsKLSAgICAgICAgICAgICAgICByZWR1Y2VfdmFsdWUgPSBQeU9iamVjdF9DYWxsKHJlZHVjZV9mdW5jLCBlbXB0eV90dXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbXB0eV90dXBsZSk7CisgICAgICAgICAgICAgICAgcmVkdWNlX3ZhbHVlID0gX1B5T2JqZWN0X0NhbGxOb0FyZyhyZWR1Y2VfZnVuYyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoc3QtPlBpY2tsaW5nRXJyb3IsCkBAIC00Mzk3LDcgKzQ0NTUsNyBAQAogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICInbWVtbycgYXR0cmlidXRlIG11c3QgYmUgYW4gUGlja2xlck1lbW9Qcm94eSBvYmplY3QiCisgICAgICAgICAgICAgICAgICAgICAiJ21lbW8nIGF0dHJpYnV0ZSBtdXN0IGJlIGEgUGlja2xlck1lbW9Qcm94eSBvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgICAib3IgZGljdCwgbm90ICUuMjAwcyIsIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC00NDI2LDggKzQ0ODQsNiBAQAogc3RhdGljIGludAogUGlja2xlcl9zZXRfcGVyc2lkKFBpY2tsZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBQeU9iamVjdCAqdG1wOwotCiAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOwpAQCAtNDQzOSwxMCArNDQ5NSw4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICB0bXAgPSBzZWxmLT5wZXJzX2Z1bmM7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICBzZWxmLT5wZXJzX2Z1bmMgPSB2YWx1ZTsKLSAgICBQeV9YREVDUkVGKHRtcCk7ICAgICAgLyogc2VsZi0+cGVyc19mdW5jIGNhbiBiZSBOVUxMLCBzbyBiZSBjYXJlZnVsLiAqLworICAgIFB5X1hTRVRSRUYoc2VsZi0+cGVyc19mdW5jLCB2YWx1ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTQ1MjQsMTMgKzQ1NzgsMTkgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBtYXJrZXIoVW5waWNrbGVyT2JqZWN0ICpzZWxmKQogewotICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKKyAgICBQeV9zc2l6ZV90IG1hcms7CisKICAgICBpZiAoc2VsZi0+bnVtX21hcmtzIDwgMSkgeworICAgICAgICBQaWNrbGVTdGF0ZSAqc3QgPSBfUGlja2xlX0dldEdsb2JhbFN0YXRlKCk7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLCAiY291bGQgbm90IGZpbmQgTUFSSyIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgcmV0dXJuIHNlbGYtPm1hcmtzWy0tc2VsZi0+bnVtX21hcmtzXTsKKyAgICBtYXJrID0gc2VsZi0+bWFya3NbLS1zZWxmLT5udW1fbWFya3NdOworICAgIHNlbGYtPnN0YWNrLT5tYXJrX3NldCA9IHNlbGYtPm51bV9tYXJrcyAhPSAwOworICAgIHNlbGYtPnN0YWNrLT5mZW5jZSA9IHNlbGYtPm51bV9tYXJrcyA/CisgICAgICAgICAgICBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MgLSAxXSA6IDA7CisgICAgcmV0dXJuIG1hcms7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQ1NDEsMTQgKzQ2MDEsNiBAQAogfQogCiBzdGF0aWMgaW50Ci1iYWRfcmVhZGxpbmUodm9pZCkKLXsKLSAgICBQaWNrbGVTdGF0ZSAqc3QgPSBfUGlja2xlX0dldEdsb2JhbFN0YXRlKCk7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJwaWNrbGUgZGF0YSB3YXMgdHJ1bmNhdGVkIik7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50CiBsb2FkX2ludChVbnBpY2tsZXJPYmplY3QgKnNlbGYpCiB7CiAgICAgUHlPYmplY3QgKnZhbHVlOwpAQCAtNDk5MSw3ICs1MDQzLDcgQEAKICAgICBQeU9iamVjdCAqdHVwbGU7CiAKICAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPCBsZW4pCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAKICAgICB0dXBsZSA9IFBkYXRhX3BvcHR1cGxlKHNlbGYtPnN0YWNrLCBQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIGxlbik7CiAgICAgaWYgKHR1cGxlID09IE5VTEwpCkBAIC01MDczLDYgKzUxMjUsMTMgQEAKICAgICBpZiAoKGRpY3QgPSBQeURpY3RfTmV3KCkpID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKIAorICAgIGlmICgoaiAtIGkpICUgMiAhPSAwKSB7CisgICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJvZGQgbnVtYmVyIG9mIGl0ZW1zIGZvciBESUNUIik7CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKwogICAgIGZvciAoayA9IGkgKyAxOyBrIDwgajsgayArPSAyKSB7CiAgICAgICAgIGtleSA9IHNlbGYtPnN0YWNrLT5kYXRhW2sgLSAxXTsKICAgICAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtrXTsKQEAgLTUxNDAsNyArNTE5OSw3IEBACiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIGkgPCAxKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogCiAgICAgYXJncyA9IFBkYXRhX3BvcHR1cGxlKHNlbGYtPnN0YWNrLCBpICsgMSk7CiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKQEAgLTU0NjMsMTIgKzU1MjIsMTUgQEAKICAgICAgKi8KICAgICBpZiAoc2VsZi0+bnVtX21hcmtzID4gMCAmJiBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MgLSAxXSA9PSBsZW4pIHsKICAgICAgICAgc2VsZi0+bnVtX21hcmtzLS07Ci0gICAgfSBlbHNlIGlmIChsZW4gPiAwKSB7CisgICAgICAgIHNlbGYtPnN0YWNrLT5tYXJrX3NldCA9IHNlbGYtPm51bV9tYXJrcyAhPSAwOworICAgICAgICBzZWxmLT5zdGFjay0+ZmVuY2UgPSBzZWxmLT5udW1fbWFya3MgPworICAgICAgICAgICAgICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcyAtIDFdIDogMDsKKyAgICB9IGVsc2UgaWYgKGxlbiA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOworICAgIGVsc2UgewogICAgICAgICBsZW4tLTsKICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnN0YWNrLT5kYXRhW2xlbl0pOwogICAgICAgICBQeV9TSVpFKHNlbGYtPnN0YWNrKSA9IGxlbjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtNTQ5MCwxMCArNTU1MiwxMCBAQAogbG9hZF9kdXAoVW5waWNrbGVyT2JqZWN0ICpzZWxmKQogewogICAgIFB5T2JqZWN0ICpsYXN0OwotICAgIFB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3QgbGVuID0gUHlfU0laRShzZWxmLT5zdGFjayk7CiAKLSAgICBpZiAoKGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKGxlbiA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIGxhc3QgPSBzZWxmLT5zdGFjay0+ZGF0YVtsZW4gLSAxXTsKICAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIGxhc3QsIC0xKTsKICAgICByZXR1cm4gMDsKQEAgLTU2NzYsOCArNTczOCw4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAobGVuIDwgMikKICAgICAgICAgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDFdOwogCiAgICAga2V5ID0gUHlMb25nX0Zyb21TdHJpbmcocywgTlVMTCwgMTApOwpAQCAtNTcwNSw4ICs1NzY3LDggQEAKICAgICBpZiAoX1VucGlja2xlcl9SZWFkKHNlbGYsICZzLCAxKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKIAotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDFdOwogCiAgICAgaWR4ID0gUHlfQ0hBUk1BU0soc1swXSk7CkBAIC01NzI0LDggKzU3ODYsOCBAQAogICAgIGlmIChfVW5waWNrbGVyX1JlYWQoc2VsZiwgJnMsIDQpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICB2YWx1ZSA9IHNlbGYtPnN0YWNrLT5kYXRhW1B5X1NJWkUoc2VsZi0+c3RhY2spIC0gMV07CiAKICAgICBpZHggPSBjYWxjX2JpbnNpemUocywgNCk7CkBAIC01NzQzLDggKzU4MDUsOCBAQAogewogICAgIFB5T2JqZWN0ICp2YWx1ZTsKIAotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDFdOwogCiAgICAgcmV0dXJuIF9VbnBpY2tsZXJfTWVtb1B1dChzZWxmLCBzZWxmLT5tZW1vX2xlbiwgdmFsdWUpOwpAQCAtNTc1OCw4ICs1ODIwLDggQEAKICAgICBQeV9zc2l6ZV90IGxlbiwgaTsKIAogICAgIGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwotICAgIGlmICh4ID4gbGVuIHx8IHggPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmICh4ID4gbGVuIHx8IHggPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICBpZiAobGVuID09IHgpICAvKiBub3RoaW5nIHRvIGRvICovCiAgICAgICAgIHJldHVybiAwOwogCkBAIC01ODA4LDggKzU4NzAsOCBAQAogc3RhdGljIGludAogbG9hZF9hcHBlbmQoVW5waWNrbGVyT2JqZWN0ICpzZWxmKQogewotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDEgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDEgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICByZXR1cm4gZG9fYXBwZW5kKHNlbGYsIFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gMSk7CiB9CiAKQEAgLTU4MzEsOCArNTg5Myw4IEBACiAgICAgaW50IHN0YXR1cyA9IDA7CiAKICAgICBsZW4gPSBQeV9TSVpFKHNlbGYtPnN0YWNrKTsKLSAgICBpZiAoeCA+IGxlbiB8fCB4IDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoeCA+IGxlbiB8fCB4IDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgaWYgKGxlbiA9PSB4KSAgLyogbm90aGluZyB0byBkbyAqLwogICAgICAgICByZXR1cm4gMDsKICAgICBpZiAoKGxlbiAtIHgpICUgMiAhPSAwKSB7CkBAIC01ODg1LDggKzU5NDcsOCBAQAogICAgIGlmIChtYXJrIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwotICAgIGlmIChtYXJrID4gbGVuIHx8IG1hcmsgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChtYXJrID4gbGVuIHx8IG1hcmsgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICBpZiAobGVuID09IG1hcmspICAvKiBub3RoaW5nIHRvIGRvICovCiAgICAgICAgIHJldHVybiAwOwogCkBAIC01OTQxLDggKzYwMDMsOCBAQAogICAgIC8qIFN0YWNrIGlzIC4uLiBpbnN0YW5jZSwgc3RhdGUuICBXZSB3YW50IHRvIGxlYXZlIGluc3RhbmNlIGF0CiAgICAgICogdGhlIHN0YWNrIHRvcCwgcG9zc2libHkgbXV0YXRlZCB2aWEgaW5zdGFuY2UuX19zZXRzdGF0ZV9fKHN0YXRlKS4KICAgICAgKi8KLSAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPCAyKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gMiA8IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAKICAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHN0YXRlKTsKICAgICBpZiAoc3RhdGUgPT0gTlVMTCkKQEAgLTYwNzgsNyArNjE0MCw4IEBACiAgICAgICAgIHNlbGYtPm1hcmtzX3NpemUgPSAoUHlfc3NpemVfdClhbGxvYzsKICAgICB9CiAKLSAgICBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MrK10gPSBQeV9TSVpFKHNlbGYtPnN0YWNrKTsKKyAgICBzZWxmLT5zdGFjay0+bWFya19zZXQgPSAxOworICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcysrXSA9IHNlbGYtPnN0YWNrLT5mZW5jZSA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC02MTYxLDYgKzYyMjQsOCBAQAogICAgIGNoYXIgKnMgPSBOVUxMOwogCiAgICAgc2VsZi0+bnVtX21hcmtzID0gMDsKKyAgICBzZWxmLT5zdGFjay0+bWFya19zZXQgPSAwOworICAgIHNlbGYtPnN0YWNrLT5mZW5jZSA9IDA7CiAgICAgc2VsZi0+cHJvdG8gPSAwOwogICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSkKICAgICAgICAgUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIDApOwpAQCAtNjE3Myw4ICs2MjM4LDEzIEBACiAgICAgY2FzZSBvcGNvZGU6IGlmIChsb2FkX2Z1bmMoc2VsZiwgKGFyZykpIDwgMCkgYnJlYWs7IGNvbnRpbnVlOwogCiAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKF9VbnBpY2tsZXJfUmVhZChzZWxmLCAmcywgMSkgPCAwKQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChfVW5waWNrbGVyX1JlYWQoc2VsZiwgJnMsIDEpIDwgMCkgeworICAgICAgICAgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoc3QtPlVucGlja2xpbmdFcnJvcikpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfRU9GRXJyb3IsICJSYW4gb3V0IG9mIGlucHV0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCiAgICAgICAgIHN3aXRjaCAoKGVudW0gb3Bjb2RlKXNbMF0pIHsKICAgICAgICAgT1AoTk9ORSwgbG9hZF9ub25lKQpAQCAtNjI0NiwxNSArNjMxNiwxOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChzWzBdID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoc3QtPlVucGlja2xpbmdFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbG9hZCBrZXksICclYycuIiwgc1swXSk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjID0gKHVuc2lnbmVkIGNoYXIpICpzOworICAgICAgICAgICAgICAgIGlmICgweDIwIDw9IGMgJiYgYyA8PSAweDdlICYmIGMgIT0gJ1wnJyAmJiBjICE9ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHN0LT5VbnBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBsb2FkIGtleSwgJyVjJy4iLCBjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChzdC0+VW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbG9hZCBrZXksICdcXHglMDJ4Jy4iLCBjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGFuZCB3ZSBhcmUgZG9uZSEgKi8KQEAgLTY4NjUsOCArNjkzOSw2IEBACiBzdGF0aWMgaW50CiBVbnBpY2tsZXJfc2V0X3BlcnNsb2FkKFVucGlja2xlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CkBAIC02ODc5LDEwICs2OTUxLDggQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHRtcCA9IHNlbGYtPnBlcnNfZnVuYzsKICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgIHNlbGYtPnBlcnNfZnVuYyA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYodG1wKTsgICAgICAvKiBzZWxmLT5wZXJzX2Z1bmMgY2FuIGJlIE5VTEwsIHNvIGJlIGNhcmVmdWwuICovCisgICAgUHlfWFNFVFJFRihzZWxmLT5wZXJzX2Z1bmMsIHZhbHVlKTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fcG9zaXhzdWJwcm9jZXNzLmMgYi9Nb2R1bGVzL19wb3NpeHN1YnByb2Nlc3MuYwppbmRleCA4YmVkYWI1Li4wY2EwYWE1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19wb3NpeHN1YnByb2Nlc3MuYworKysgYi9Nb2R1bGVzL19wb3NpeHN1YnByb2Nlc3MuYwpAQCAtMjEsOCArMjEsNyBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChTWVNfZ2V0ZGVudHM2NCkKLS8qIEFuZHJvaWQgZG9lc24ndCBleHBvc2Ugc3lzY2FsbHMsIGFkZCB0aGUgZGVmaW5pdGlvbiBtYW51YWxseS4gKi8KKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiBfX0FORFJPSURfQVBJX18gPCAyMSAmJiAhZGVmaW5lZChTWVNfZ2V0ZGVudHM2NCkKICMgaW5jbHVkZSA8c3lzL2xpbnV4LXN5c2NhbGxzLmg+CiAjIGRlZmluZSBTWVNfZ2V0ZGVudHM2NCAgX19OUl9nZXRkZW50czY0CiAjZW5kaWYKQEAgLTcyLDcgKzcxLDcgQEAKIAogLyogQ29udmVydCBBU0NJSSB0byBhIHBvc2l0aXZlIGludCwgbm8gbGliYyBjYWxsLiBubyBvdmVyZmxvdy4gLTEgb24gZXJyb3IuICovCiBzdGF0aWMgaW50Ci1fcG9zX2ludF9mcm9tX2FzY2lpKGNoYXIgKm5hbWUpCitfcG9zX2ludF9mcm9tX2FzY2lpKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgaW50IG51bSA9IDA7CiAgICAgd2hpbGUgKCpuYW1lID49ICcwJyAmJiAqbmFtZSA8PSAnOScpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKaW5kZXggOTVhZDRhNC4uNjM3NTlkNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKQEAgLTY4LDkgKzY4LDggQEAKIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgPHRpbWUuaD4gICAgICAgICAgICAgICAvKiBmb3Igc2VlZGluZyB0byBjdXJyZW50IHRpbWUgKi8KLQotI2lmbmRlZiBQWV9VSU5UMzJfVAotIyAgZXJyb3IgIkZhaWxlZCB0byBmaW5kIGFuIGV4YWN0LXdpZHRoIDMyLWJpdCBpbnRlZ2VyIHR5cGUiCisjaWZkZWYgSEFWRV9QUk9DRVNTX0gKKyMgIGluY2x1ZGUgPHByb2Nlc3MuaD4gICAgICAgICAgLyogbmVlZGVkIGZvciBnZXRwaWQoKSAqLwogI2VuZGlmCiAKIC8qIFBlcmlvZCBwYXJhbWV0ZXJzIC0tIFRoZXNlIGFyZSBhbGwgbWFnaWMuICBEb24ndCBjaGFuZ2UuICovCkBAIC04Myw3ICs4Miw3IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAogICAgIGludCBpbmRleDsKLSAgICBQWV9VSU5UMzJfVCBzdGF0ZVtOXTsKKyAgICB1aW50MzJfdCBzdGF0ZVtOXTsKIH0gUmFuZG9tT2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFJhbmRvbV9UeXBlOwpAQCAtOTUsMTMgKzk0LDEzIEBACiAKIAogLyogZ2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciBvbiBbMCwweGZmZmZmZmZmXS1pbnRlcnZhbCAqLwotc3RhdGljIFBZX1VJTlQzMl9UCitzdGF0aWMgdWludDMyX3QKIGdlbnJhbmRfaW50MzIoUmFuZG9tT2JqZWN0ICpzZWxmKQogewotICAgIFBZX1VJTlQzMl9UIHk7Ci0gICAgc3RhdGljIFBZX1VJTlQzMl9UIG1hZzAxWzJdPXsweDBVLCBNQVRSSVhfQX07CisgICAgdWludDMyX3QgeTsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbWFnMDFbMl0gPSB7MHgwVSwgTUFUUklYX0F9OwogICAgIC8qIG1hZzAxW3hdID0geCAqIE1BVFJJWF9BICBmb3IgeD0wLDEgKi8KLSAgICBQWV9VSU5UMzJfVCAqbXQ7CisgICAgdWludDMyX3QgKm10OwogCiAgICAgbXQgPSBzZWxmLT5zdGF0ZTsKICAgICBpZiAoc2VsZi0+aW5kZXggPj0gTikgeyAvKiBnZW5lcmF0ZSBOIHdvcmRzIGF0IG9uZSB0aW1lICovCkBAIC0xMzYsMjEgKzEzNSwyMSBAQAogICogb3B0aW1pemUgdGhlIGRpdmlzaW9uIGF3YXkgYXQgY29tcGlsZS10aW1lLiAgNjcxMDg4NjQgaXMgMioqMjYuICBJbgogICogZWZmZWN0LCBhIGNvbnRhaW5zIDI3IHJhbmRvbSBiaXRzIHNoaWZ0ZWQgbGVmdCAyNiwgYW5kIGIgZmlsbHMgaW4gdGhlCiAgKiBsb3dlciAyNiBiaXRzIG9mIHRoZSA1My1iaXQgbnVtZXJhdG9yLgotICogVGhlIG9yZ2luYWwgY29kZSBjcmVkaXRlZCBJc2FrdSBXYWRhIGZvciB0aGlzIGFsZ29yaXRobSwgMjAwMi8wMS8wOS4KKyAqIFRoZSBvcmlnaW5hbCBjb2RlIGNyZWRpdGVkIElzYWt1IFdhZGEgZm9yIHRoaXMgYWxnb3JpdGhtLCAyMDAyLzAxLzA5LgogICovCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZG9tX3JhbmRvbShSYW5kb21PYmplY3QgKnNlbGYpCiB7Ci0gICAgUFlfVUlOVDMyX1QgYT1nZW5yYW5kX2ludDMyKHNlbGYpPj41LCBiPWdlbnJhbmRfaW50MzIoc2VsZik+PjY7CisgICAgdWludDMyX3QgYT1nZW5yYW5kX2ludDMyKHNlbGYpPj41LCBiPWdlbnJhbmRfaW50MzIoc2VsZik+PjY7CiAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoYSo2NzEwODg2NC4wK2IpKigxLjAvOTAwNzE5OTI1NDc0MDk5Mi4wKSk7CiB9CiAKIC8qIGluaXRpYWxpemVzIG10W05dIHdpdGggYSBzZWVkICovCiBzdGF0aWMgdm9pZAotaW5pdF9nZW5yYW5kKFJhbmRvbU9iamVjdCAqc2VsZiwgUFlfVUlOVDMyX1QgcykKK2luaXRfZ2VucmFuZChSYW5kb21PYmplY3QgKnNlbGYsIHVpbnQzMl90IHMpCiB7CiAgICAgaW50IG10aTsKLSAgICBQWV9VSU5UMzJfVCAqbXQ7CisgICAgdWludDMyX3QgKm10OwogCiAgICAgbXQgPSBzZWxmLT5zdGF0ZTsKICAgICBtdFswXT0gczsKQEAgLTE2OSwxMSArMTY4LDExIEBACiAvKiBpbml0aWFsaXplIGJ5IGFuIGFycmF5IHdpdGggYXJyYXktbGVuZ3RoICovCiAvKiBpbml0X2tleSBpcyB0aGUgYXJyYXkgZm9yIGluaXRpYWxpemluZyBrZXlzICovCiAvKiBrZXlfbGVuZ3RoIGlzIGl0cyBsZW5ndGggKi8KLXN0YXRpYyBQeU9iamVjdCAqCi1pbml0X2J5X2FycmF5KFJhbmRvbU9iamVjdCAqc2VsZiwgUFlfVUlOVDMyX1QgaW5pdF9rZXlbXSwgc2l6ZV90IGtleV9sZW5ndGgpCitzdGF0aWMgdm9pZAoraW5pdF9ieV9hcnJheShSYW5kb21PYmplY3QgKnNlbGYsIHVpbnQzMl90IGluaXRfa2V5W10sIHNpemVfdCBrZXlfbGVuZ3RoKQogewogICAgIHNpemVfdCBpLCBqLCBrOyAgICAgICAvKiB3YXMgc2lnbmVkIGluIHRoZSBvcmlnaW5hbCBjb2RlLiBSREggMTIvMTYvMjAwMiAqLwotICAgIFBZX1VJTlQzMl9UICptdDsKKyAgICB1aW50MzJfdCAqbXQ7CiAKICAgICBtdCA9IHNlbGYtPnN0YXRlOwogICAgIGluaXRfZ2VucmFuZChzZWxmLCAxOTY1MDIxOFUpOwpAQCAtMTgxLDIxICsxODAsMTkgQEAKICAgICBrID0gKE4+a2V5X2xlbmd0aCA/IE4gOiBrZXlfbGVuZ3RoKTsKICAgICBmb3IgKDsgazsgay0tKSB7CiAgICAgICAgIG10W2ldID0gKG10W2ldIF4gKChtdFtpLTFdIF4gKG10W2ktMV0gPj4gMzApKSAqIDE2NjQ1MjVVKSkKLSAgICAgICAgICAgICAgICAgKyBpbml0X2tleVtqXSArIChQWV9VSU5UMzJfVClqOyAvKiBub24gbGluZWFyICovCisgICAgICAgICAgICAgICAgICsgaW5pdF9rZXlbal0gKyAodWludDMyX3QpajsgLyogbm9uIGxpbmVhciAqLwogICAgICAgICBpKys7IGorKzsKICAgICAgICAgaWYgKGk+PU4pIHsgbXRbMF0gPSBtdFtOLTFdOyBpPTE7IH0KICAgICAgICAgaWYgKGo+PWtleV9sZW5ndGgpIGo9MDsKICAgICB9CiAgICAgZm9yIChrPU4tMTsgazsgay0tKSB7CiAgICAgICAgIG10W2ldID0gKG10W2ldIF4gKChtdFtpLTFdIF4gKG10W2ktMV0gPj4gMzApKSAqIDE1NjYwODM5NDFVKSkKLSAgICAgICAgICAgICAgICAgLSAoUFlfVUlOVDMyX1QpaTsgLyogbm9uIGxpbmVhciAqLworICAgICAgICAgICAgICAgICAtICh1aW50MzJfdClpOyAvKiBub24gbGluZWFyICovCiAgICAgICAgIGkrKzsKICAgICAgICAgaWYgKGk+PU4pIHsgbXRbMF0gPSBtdFtOLTFdOyBpPTE7IH0KICAgICB9CiAKICAgICBtdFswXSA9IDB4ODAwMDAwMDBVOyAvKiBNU0IgaXMgMTsgYXNzdXJpbmcgbm9uLXplcm8gaW5pdGlhbCBhcnJheSAqLwotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyoKQEAgLTIwMywxMiArMjAwLDQzIEBACiAgKiBUd2lzdGVyIGRvd25sb2FkLgogICovCiAKK3N0YXRpYyBpbnQKK3JhbmRvbV9zZWVkX3VyYW5kb20oUmFuZG9tT2JqZWN0ICpzZWxmKQoreworICAgIFBZX1VJTlQzMl9UIGtleVtOXTsKKworICAgIGlmIChfUHlPU19VUmFuZG9tTm9uYmxvY2soa2V5LCBzaXplb2Yoa2V5KSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW5pdF9ieV9hcnJheShzZWxmLCBrZXksIFB5X0FSUkFZX0xFTkdUSChrZXkpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3JhbmRvbV9zZWVkX3RpbWVfcGlkKFJhbmRvbU9iamVjdCAqc2VsZikKK3sKKyAgICBfUHlUaW1lX3Qgbm93OworICAgIHVpbnQzMl90IGtleVs1XTsKKworICAgIG5vdyA9IF9QeVRpbWVfR2V0U3lzdGVtQ2xvY2soKTsKKyAgICBrZXlbMF0gPSAoUFlfVUlOVDMyX1QpKG5vdyAmIDB4ZmZmZmZmZmZVKTsKKyAgICBrZXlbMV0gPSAoUFlfVUlOVDMyX1QpKG5vdyA+PiAzMik7CisKKyAgICBrZXlbMl0gPSAoUFlfVUlOVDMyX1QpZ2V0cGlkKCk7CisKKyAgICBub3cgPSBfUHlUaW1lX0dldE1vbm90b25pY0Nsb2NrKCk7CisgICAga2V5WzNdID0gKFBZX1VJTlQzMl9UKShub3cgJiAweGZmZmZmZmZmVSk7CisgICAga2V5WzRdID0gKFBZX1VJTlQzMl9UKShub3cgPj4gMzIpOworCisgICAgaW5pdF9ieV9hcnJheShzZWxmLCBrZXksIFB5X0FSUkFZX0xFTkdUSChrZXkpKTsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmRvbV9zZWVkKFJhbmRvbU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7ICAgICAgICAgICAgLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLwogICAgIFB5T2JqZWN0ICpuID0gTlVMTDsKLSAgICBQWV9VSU5UMzJfVCAqa2V5ID0gTlVMTDsKKyAgICB1aW50MzJfdCAqa2V5ID0gTlVMTDsKICAgICBzaXplX3QgYml0cywga2V5dXNlZDsKICAgICBpbnQgcmVzOwogICAgIFB5T2JqZWN0ICphcmcgPSBOVUxMOwpAQCAtMjE2LDE0ICsyNDQsMTcgQEAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZWVkIiwgMCwgMSwgJmFyZykpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKGFyZyA9PSBOVUxMIHx8IGFyZyA9PSBQeV9Ob25lKSB7Ci0gICAgICAgIHRpbWVfdCBub3c7CisgICAgIGlmIChhcmcgPT0gTlVMTCB8fCBhcmcgPT0gUHlfTm9uZSkgeworICAgICAgICBpZiAocmFuZG9tX3NlZWRfdXJhbmRvbShzZWxmKSA+PSAwKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogCi0gICAgICAgIHRpbWUoJm5vdyk7Ci0gICAgICAgIGluaXRfZ2VucmFuZChzZWxmLCAoUFlfVUlOVDMyX1Qpbm93KTsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgIC8qIFJlYWRpbmcgc3lzdGVtIGVudHJvcHkgZmFpbGVkLCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGVudHJvcHk6CisgICAgICAgICAgICAgICB1c2UgdGhlIGN1cnJlbnQgdGltZSBhbmQgcHJvY2VzcyBpZGVudGlmaWVyLiAqLworICAgICAgICAgICAgcmFuZG9tX3NlZWRfdGltZV9waWQoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQorCiAgICAgLyogVGhpcyBhbGdvcml0aG0gcmVsaWVzIG9uIHRoZSBudW1iZXIgYmVpbmcgdW5zaWduZWQuCiAgICAgICogU286IGlmIHRoZSBhcmcgaXMgYSBQeUxvbmcsIHVzZSBpdHMgYWJzb2x1dGUgdmFsdWUuCiAgICAgICogT3RoZXJ3aXNlIHVzZSBpdHMgaGFzaCB2YWx1ZSwgY2FzdCB0byB1bnNpZ25lZC4KQEAgLTI0OCw3ICsyNzksNyBAQAogICAgIGtleXVzZWQgPSBiaXRzID09IDAgPyAxIDogKGJpdHMgLSAxKSAvIDMyICsgMTsKIAogICAgIC8qIENvbnZlcnQgc2VlZCB0byBieXRlIHNlcXVlbmNlLiAqLwotICAgIGtleSA9IChQWV9VSU5UMzJfVCAqKVB5TWVtX01hbGxvYygoc2l6ZV90KTQgKiBrZXl1c2VkKTsKKyAgICBrZXkgPSAodWludDMyX3QgKilQeU1lbV9NYWxsb2MoKHNpemVfdCk0ICoga2V5dXNlZCk7CiAgICAgaWYgKGtleSA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIGdvdG8gRG9uZTsKQEAgLTI2NywxMyArMjk4LDE3IEBACiAgICAgICAgIHNpemVfdCBpLCBqOwogICAgICAgICAvKiBSZXZlcnNlIGFuIGFycmF5LiAqLwogICAgICAgICBmb3IgKGkgPSAwLCBqID0ga2V5dXNlZCAtIDE7IGkgPCBqOyBpKyssIGotLSkgewotICAgICAgICAgICAgUFlfVUlOVDMyX1QgdG1wID0ga2V5W2ldOworICAgICAgICAgICAgdWludDMyX3QgdG1wID0ga2V5W2ldOwogICAgICAgICAgICAga2V5W2ldID0ga2V5W2pdOwogICAgICAgICAgICAga2V5W2pdID0gdG1wOwogICAgICAgICB9CiAgICAgfQogI2VuZGlmCi0gICAgcmVzdWx0ID0gaW5pdF9ieV9hcnJheShzZWxmLCBrZXksIGtleXVzZWQpOworICAgIGluaXRfYnlfYXJyYXkoc2VsZiwga2V5LCBrZXl1c2VkKTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXN1bHQgPSBQeV9Ob25lOworCiBEb25lOgogICAgIFB5X1hERUNSRUYobik7CiAgICAgUHlNZW1fRnJlZShrZXkpOwpAQCAtMzI5LDcgKzM2NCw3IEBACiAgICAgICAgIGVsZW1lbnQgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcoUHlUdXBsZV9HRVRfSVRFTShzdGF0ZSwgaSkpOwogICAgICAgICBpZiAoZWxlbWVudCA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHNlbGYtPnN0YXRlW2ldID0gKFBZX1VJTlQzMl9UKWVsZW1lbnQ7CisgICAgICAgIHNlbGYtPnN0YXRlW2ldID0gKHVpbnQzMl90KWVsZW1lbnQ7CiAgICAgfQogCiAgICAgaW5kZXggPSBQeUxvbmdfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3RhdGUsIGkpKTsKQEAgLTM0OSw4ICszODQsOCBAQAogcmFuZG9tX2dldHJhbmRiaXRzKFJhbmRvbU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgaW50IGssIGksIHdvcmRzOwotICAgIFBZX1VJTlQzMl9UIHI7Ci0gICAgUFlfVUlOVDMyX1QgKndvcmRhcnJheTsKKyAgICB1aW50MzJfdCByOworICAgIHVpbnQzMl90ICp3b3JkYXJyYXk7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRyYW5kYml0cyIsICZrKSkKQEAgLTM2Niw3ICs0MDEsNyBAQAogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoZ2VucmFuZF9pbnQzMihzZWxmKSA+PiAoMzIgLSBrKSk7CiAKICAgICB3b3JkcyA9IChrIC0gMSkgLyAzMiArIDE7Ci0gICAgd29yZGFycmF5ID0gKFBZX1VJTlQzMl9UICopUHlNZW1fTWFsbG9jKHdvcmRzICogNCk7CisgICAgd29yZGFycmF5ID0gKHVpbnQzMl90ICopUHlNZW1fTWFsbG9jKHdvcmRzICogNCk7CiAgICAgaWYgKHdvcmRhcnJheSA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc2Nwcm94eS5jIGIvTW9kdWxlcy9fc2Nwcm94eS5jCmluZGV4IDY2YjZlMzQuLjFjZTRiNzcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NjcHJveHkuYworKysgYi9Nb2R1bGVzL19zY3Byb3h5LmMKQEAgLTcxLDE2ICs3MSwxMiBAQAogICAgIHJlc3VsdCA9IFB5RGljdF9OZXcoKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpIGdvdG8gZXJyb3I7CiAKLSAgICBpZiAoJmtTQ1Byb3BOZXRQcm94aWVzRXhjbHVkZVNpbXBsZUhvc3RuYW1lcyAhPSBOVUxMKSB7Ci0gICAgICAgIGFOdW0gPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsCi0gICAgICAgICAgICBrU0NQcm9wTmV0UHJveGllc0V4Y2x1ZGVTaW1wbGVIb3N0bmFtZXMpOwotICAgICAgICBpZiAoYU51bSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB2ID0gUHlCb29sX0Zyb21Mb25nKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdiA9IFB5Qm9vbF9Gcm9tTG9uZyhjZm51bV90b19pbnQzMihhTnVtKSk7Ci0gICAgICAgIH0KLSAgICB9ICBlbHNlIHsKKyAgICBhTnVtID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LAorICAgICAgICBrU0NQcm9wTmV0UHJveGllc0V4Y2x1ZGVTaW1wbGVIb3N0bmFtZXMpOworICAgIGlmIChhTnVtID09IE5VTEwpIHsKICAgICAgICAgdiA9IFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2ID0gUHlCb29sX0Zyb21Mb25nKGNmbnVtX3RvX2ludDMyKGFOdW0pKTsKICAgICB9CiAKICAgICBpZiAodiA9PSBOVUxMKSBnb3RvIGVycm9yOwpAQCAtMTMwLDcgKzEyNiw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNldF9wcm94eShQeU9iamVjdCogcHJveGllcywgY2hhciogcHJvdG8sIENGRGljdGlvbmFyeVJlZiBwcm94eURpY3QsCitzZXRfcHJveHkoUHlPYmplY3QqIHByb3hpZXMsIGNvbnN0IGNoYXIqIHByb3RvLCBDRkRpY3Rpb25hcnlSZWYgcHJveHlEaWN0LAogICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIGVuYWJsZWRLZXksCiAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgaG9zdEtleSwgQ0ZTdHJpbmdSZWYgcG9ydEtleSkKIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NoYTMvUkVBRE1FLnR4dCBiL01vZHVsZXMvX3NoYTMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzRiMWQxCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc2hhMy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTEgQEAKK0tlY2NhayBDb2RlIFBhY2thZ2UKKz09PT09PT09PT09PT09PT09PT0KKworVGhlIGZpbGVzIGluIGtjcCBhcmUgdGFrZW4gZnJvbSB0aGUgS2VjY2FrIENvZGUgUGFja2FnZS4gVGhleSBoYXZlIGJlZW4KK3NsaWdodGx5IHRvIGJlIEM4OSBjb21wYXRpYmxlLiBUaGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGhlYWRlciBmaWxlCitLZWNjYWtQLTE2MDAtU25QLmggaGEgYmVlbiByZW5hbWVkIHRvIEtlY2Nha1AtMTYwMC1TblAtb3B0MzIuaCBvcgorS2VjY2FrUC0xNjAwLVNuUC1vcHQ2NC5oLgorCitUaGUgNjRiaXQgZmlsZXMgd2VyZSBnZW5lcmF0ZWQgd2l0aCBnZW5lcmljNjRsYy9saWJrZWNjYWsuYS5wYWNrIHRhcmdldCwgdGhlCiszMmJpdCBmaWxlcyB3aXRoIGdlbmVyaWMzMmxjL2xpYmtlY2Nhay5hLnBhY2suCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NoYTMvY2xlYW51cC5weSBiL01vZHVsZXMvX3NoYTMvY2xlYW51cC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xN2M1NmIzCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc2hhMy9jbGVhbnVwLnB5CkBAIC0wLDAgKzEsNTAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTIgICBDaHJpc3RpYW4gSGVpbWVzIChjaHJpc3RpYW5AcHl0aG9uLm9yZykKKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorIworIyBjbGVhbnVwIEtlY2NhayBzb3VyY2VzCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCisKK0NQUDEgPSByZS5jb21waWxlKCJeLy8oLiopIikKK0NQUDIgPSByZS5jb21waWxlKCJcIC8vKC4qKSIpCisKK1NUQVRJQ1MgPSAoInZvaWQgIiwgImludCAiLCAiSGFzaFJldHVybiAiLAorICAgICAgICAgICAiY29uc3QgVUlOVDY0ICIsICJVSU5UMTYgIiwgIiAgICBpbnQgcHJlZml4IyMiKQorCitIRVJFID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCitLRUNDQUsgPSBvcy5wYXRoLmpvaW4oSEVSRSwgImtjcCIpCisKK2RlZiBnZXRmaWxlcygpOgorICAgIGZvciBuYW1lIGluIG9zLmxpc3RkaXIoS0VDQ0FLKToKKyAgICAgICAgbmFtZSA9IG9zLnBhdGguam9pbihLRUNDQUssIG5hbWUpCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKG5hbWUpOgorICAgICAgICAgICAgeWllbGQgbmFtZQorCitkZWYgY2xlYW51cChmKToKKyAgICBidWYgPSBbXQorICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICMgbWFyayBhbGwgZnVuY3Rpb25zIGFuZCBnbG9iYWwgZGF0YSBhcyBzdGF0aWMKKyAgICAgICAgI2lmIGxpbmUuc3RhcnRzd2l0aChTVEFUSUNTKToKKyAgICAgICAgIyAgICBidWYuYXBwZW5kKCJzdGF0aWMgIiArIGxpbmUpCisgICAgICAgICMgICAgY29udGludWUKKyAgICAgICAgIyByZW1vdmUgVUlOVDY0IHR5cGVkZWYsIHdlIGhhdmUgb3VyIG93bgorICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoInR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCIpOgorICAgICAgICAgICAgYnVmLmFwcGVuZCgiLyogJXMgKi9cbiIgJSBsaW5lLnN0cmlwKCkpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAjIyByZW1vdmUgI2luY2x1ZGUgImJyZ19lbmRpYW4uaCIKKyAgICAgICAgaWYgImJyZ19lbmRpYW4uaCIgaW4gbGluZToKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIi8qICVzICovXG4iICUgbGluZS5zdHJpcCgpKQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgIyB0cmFuc2Zvcm0gQysrIGNvbW1lbnRzIGludG8gQU5TSSBDIGNvbW1lbnRzCisgICAgICAgIGxpbmUgPSBDUFAxLnN1YihyIi8qXDEgKi9cbiIsIGxpbmUpCisgICAgICAgIGxpbmUgPSBDUFAyLnN1YihyIiAvKlwxICovXG4iLCBsaW5lKQorICAgICAgICBidWYuYXBwZW5kKGxpbmUpCisgICAgcmV0dXJuICIiLmpvaW4oYnVmKQorCitmb3IgbmFtZSBpbiBnZXRmaWxlcygpOgorICAgIHdpdGggb3BlbihuYW1lKSBhcyBmOgorICAgICAgICByZXMgPSBjbGVhbnVwKGYpCisgICAgd2l0aCBvcGVuKG5hbWUsICJ3IikgYXMgZjoKKyAgICAgICAgZi53cml0ZShyZXMpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zaGEzL2NsaW5pYy9zaGEzbW9kdWxlLmMuaCBiL01vZHVsZXMvX3NoYTMvY2xpbmljL3NoYTNtb2R1bGUuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNGRjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zaGEzL2NsaW5pYy9zaGEzbW9kdWxlLmMuaApAQCAtMCwwICsxLDE1NCBAQAorLypbY2xpbmljIGlucHV0XQorcHJlc2VydmUKK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworUHlEb2NfU1RSVkFSKHB5X3NoYTNfbmV3X19kb2NfXywKKyJzaGEzXzIyNChzdHJpbmc9Tm9uZSlcbiIKKyItLVxuIgorIlxuIgorIlJldHVybiBhIG5ldyBTSEEzIGhhc2ggb2JqZWN0IHdpdGggYSBoYXNoYml0IGxlbmd0aCBvZiAyOCBieXRlcy4iKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK3B5X3NoYTNfbmV3X2ltcGwoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqZGF0YSk7CisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9zaGEzX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOnNoYTNfMjI0IiwgX2tleXdvcmRzLCAwfTsKKyAgICBQeU9iamVjdCAqZGF0YSA9IE5VTEw7CisKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhKSkgeworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIHJldHVybl92YWx1ZSA9IHB5X3NoYTNfbmV3X2ltcGwodHlwZSwgZGF0YSk7CisKK2V4aXQ6CisgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKK30KKworUHlEb2NfU1RSVkFSKF9zaGEzX3NoYTNfMjI0X2NvcHlfX2RvY19fLAorImNvcHkoJHNlbGYsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJSZXR1cm4gYSBjb3B5IG9mIHRoZSBoYXNoIG9iamVjdC4iKTsKKworI2RlZmluZSBfU0hBM19TSEEzXzIyNF9DT1BZX01FVEhPRERFRiAgICBcCisgICAgeyJjb3B5IiwgKFB5Q0Z1bmN0aW9uKV9zaGEzX3NoYTNfMjI0X2NvcHksIE1FVEhfTk9BUkdTLCBfc2hhM19zaGEzXzIyNF9jb3B5X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfc2hhM19zaGEzXzIyNF9jb3B5X2ltcGwoU0hBM29iamVjdCAqc2VsZik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitfc2hhM19zaGEzXzIyNF9jb3B5KFNIQTNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpQeV9VTlVTRUQoaWdub3JlZCkpCit7CisgICAgcmV0dXJuIF9zaGEzX3NoYTNfMjI0X2NvcHlfaW1wbChzZWxmKTsKK30KKworUHlEb2NfU1RSVkFSKF9zaGEzX3NoYTNfMjI0X2RpZ2VzdF9fZG9jX18sCisiZGlnZXN0KCRzZWxmLCAvKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgYXMgYSBzdHJpbmcgb2YgYmluYXJ5IGRhdGEuIik7CisKKyNkZWZpbmUgX1NIQTNfU0hBM18yMjRfRElHRVNUX01FVEhPRERFRiAgICBcCisgICAgeyJkaWdlc3QiLCAoUHlDRnVuY3Rpb24pX3NoYTNfc2hhM18yMjRfZGlnZXN0LCBNRVRIX05PQVJHUywgX3NoYTNfc2hhM18yMjRfZGlnZXN0X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfc2hhM19zaGEzXzIyNF9kaWdlc3RfaW1wbChTSEEzb2JqZWN0ICpzZWxmKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19zaGEzX3NoYTNfMjI0X2RpZ2VzdChTSEEzb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqUHlfVU5VU0VEKGlnbm9yZWQpKQoreworICAgIHJldHVybiBfc2hhM19zaGEzXzIyNF9kaWdlc3RfaW1wbChzZWxmKTsKK30KKworUHlEb2NfU1RSVkFSKF9zaGEzX3NoYTNfMjI0X2hleGRpZ2VzdF9fZG9jX18sCisiaGV4ZGlnZXN0KCRzZWxmLCAvKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgYXMgYSBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzLiIpOworCisjZGVmaW5lIF9TSEEzX1NIQTNfMjI0X0hFWERJR0VTVF9NRVRIT0RERUYgICAgXAorICAgIHsiaGV4ZGlnZXN0IiwgKFB5Q0Z1bmN0aW9uKV9zaGEzX3NoYTNfMjI0X2hleGRpZ2VzdCwgTUVUSF9OT0FSR1MsIF9zaGEzX3NoYTNfMjI0X2hleGRpZ2VzdF9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorX3NoYTNfc2hhM18yMjRfaGV4ZGlnZXN0X2ltcGwoU0hBM29iamVjdCAqc2VsZik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitfc2hhM19zaGEzXzIyNF9oZXhkaWdlc3QoU0hBM29iamVjdCAqc2VsZiwgUHlPYmplY3QgKlB5X1VOVVNFRChpZ25vcmVkKSkKK3sKKyAgICByZXR1cm4gX3NoYTNfc2hhM18yMjRfaGV4ZGlnZXN0X2ltcGwoc2VsZik7Cit9CisKK1B5RG9jX1NUUlZBUihfc2hhM19zaGEzXzIyNF91cGRhdGVfX2RvY19fLAorInVwZGF0ZSgkc2VsZiwgb2JqLCAvKVxuIgorIi0tXG4iCisiXG4iCisiVXBkYXRlIHRoaXMgaGFzaCBvYmplY3RcJ3Mgc3RhdGUgd2l0aCB0aGUgcHJvdmlkZWQgc3RyaW5nLiIpOworCisjZGVmaW5lIF9TSEEzX1NIQTNfMjI0X1VQREFURV9NRVRIT0RERUYgICAgXAorICAgIHsidXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKV9zaGEzX3NoYTNfMjI0X3VwZGF0ZSwgTUVUSF9PLCBfc2hhM19zaGEzXzIyNF91cGRhdGVfX2RvY19ffSwKKworUHlEb2NfU1RSVkFSKF9zaGEzX3NoYWtlXzEyOF9kaWdlc3RfX2RvY19fLAorImRpZ2VzdCgkc2VsZiwgLywgbGVuZ3RoKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgYXMgYSBzdHJpbmcgb2YgYmluYXJ5IGRhdGEuIik7CisKKyNkZWZpbmUgX1NIQTNfU0hBS0VfMTI4X0RJR0VTVF9NRVRIT0RERUYgICAgXAorICAgIHsiZGlnZXN0IiwgKFB5Q0Z1bmN0aW9uKV9zaGEzX3NoYWtlXzEyOF9kaWdlc3QsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBfc2hhM19zaGFrZV8xMjhfZGlnZXN0X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfc2hhM19zaGFrZV8xMjhfZGlnZXN0X2ltcGwoU0hBM29iamVjdCAqc2VsZiwgdW5zaWduZWQgbG9uZyBsZW5ndGgpOworCitzdGF0aWMgUHlPYmplY3QgKgorX3NoYTNfc2hha2VfMTI4X2RpZ2VzdChTSEEzb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKyAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJsZW5ndGgiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJrOmRpZ2VzdCIsIF9rZXl3b3JkcywgMH07CisgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZsZW5ndGgpKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gX3NoYTNfc2hha2VfMTI4X2RpZ2VzdF9pbXBsKHNlbGYsIGxlbmd0aCk7CisKK2V4aXQ6CisgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKK30KKworUHlEb2NfU1RSVkFSKF9zaGEzX3NoYWtlXzEyOF9oZXhkaWdlc3RfX2RvY19fLAorImhleGRpZ2VzdCgkc2VsZiwgLywgbGVuZ3RoKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgYXMgYSBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzLiIpOworCisjZGVmaW5lIF9TSEEzX1NIQUtFXzEyOF9IRVhESUdFU1RfTUVUSE9EREVGICAgIFwKKyAgICB7ImhleGRpZ2VzdCIsIChQeUNGdW5jdGlvbilfc2hhM19zaGFrZV8xMjhfaGV4ZGlnZXN0LCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgX3NoYTNfc2hha2VfMTI4X2hleGRpZ2VzdF9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorX3NoYTNfc2hha2VfMTI4X2hleGRpZ2VzdF9pbXBsKFNIQTNvYmplY3QgKnNlbGYsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19zaGEzX3NoYWtlXzEyOF9oZXhkaWdlc3QoU0hBM29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsibGVuZ3RoIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiazpoZXhkaWdlc3QiLCBfa2V5d29yZHMsIDB9OworICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmbGVuZ3RoKSkgeworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIHJldHVybl92YWx1ZSA9IF9zaGEzX3NoYWtlXzEyOF9oZXhkaWdlc3RfaW1wbChzZWxmLCBsZW5ndGgpOworCitleGl0OgorICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTBjZmYwNWYyYzc0ZDQxZSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtIYXNoLmMgYi9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtIYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5ZmI0MwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha0hhc2guYwpAQCAtMCwwICsxLDgyIEBACisvKgorSW1wbGVtZW50YXRpb24gYnkgdGhlIEtlY2NhaywgS2V5YWsgYW5kIEtldGplIFRlYW1zLCBuYW1lbHksIEd1aWRvIEJlcnRvbmksCitKb2FuIERhZW1lbiwgTWljaGHDq2wgUGVldGVycywgR2lsbGVzIFZhbiBBc3NjaGUgYW5kIFJvbm55IFZhbiBLZWVyLCBoZXJlYnkKK2Rlbm90ZWQgYXMgInRoZSBpbXBsZW1lbnRlciIuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uLCBmZWVkYmFjayBvciBxdWVzdGlvbnMsIHBsZWFzZSByZWZlciB0byBvdXIgd2Vic2l0ZXM6CitodHRwOi8va2VjY2FrLm5vZWtlb24ub3JnLworaHR0cDovL2tleWFrLm5vZWtlb24ub3JnLworaHR0cDovL2tldGplLm5vZWtlb24ub3JnLworCitUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGltcGxlbWVudGVyIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodAorYW5kIHJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoZSBzb3VyY2UgY29kZSBpbiB0aGlzIGZpbGUuCitodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvCisqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiS2VjY2FrSGFzaC5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0hhc2hSZXR1cm4gS2VjY2FrX0hhc2hJbml0aWFsaXplKEtlY2Nha19IYXNoSW5zdGFuY2UgKmluc3RhbmNlLCB1bnNpZ25lZCBpbnQgcmF0ZSwgdW5zaWduZWQgaW50IGNhcGFjaXR5LCB1bnNpZ25lZCBpbnQgaGFzaGJpdGxlbiwgdW5zaWduZWQgY2hhciBkZWxpbWl0ZWRTdWZmaXgpCit7CisgICAgSGFzaFJldHVybiByZXN1bHQ7CisKKyAgICBpZiAoZGVsaW1pdGVkU3VmZml4ID09IDApCisgICAgICAgIHJldHVybiBGQUlMOworICAgIHJlc3VsdCA9IChIYXNoUmV0dXJuKUtlY2Nha1dpZHRoMTYwMF9TcG9uZ2VJbml0aWFsaXplKCZpbnN0YW5jZS0+c3BvbmdlLCByYXRlLCBjYXBhY2l0eSk7CisgICAgaWYgKHJlc3VsdCAhPSBTVUNDRVNTKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIGluc3RhbmNlLT5maXhlZE91dHB1dExlbmd0aCA9IGhhc2hiaXRsZW47CisgICAgaW5zdGFuY2UtPmRlbGltaXRlZFN1ZmZpeCA9IGRlbGltaXRlZFN1ZmZpeDsKKyAgICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitIYXNoUmV0dXJuIEtlY2Nha19IYXNoVXBkYXRlKEtlY2Nha19IYXNoSW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBCaXRTZXF1ZW5jZSAqZGF0YSwgRGF0YUxlbmd0aCBkYXRhYml0bGVuKQoreworICAgIGlmICgoZGF0YWJpdGxlbiAlIDgpID09IDApCisgICAgICAgIHJldHVybiAoSGFzaFJldHVybilLZWNjYWtXaWR0aDE2MDBfU3BvbmdlQWJzb3JiKCZpbnN0YW5jZS0+c3BvbmdlLCBkYXRhLCBkYXRhYml0bGVuLzgpOworICAgIGVsc2UgeworICAgICAgICBIYXNoUmV0dXJuIHJldCA9IChIYXNoUmV0dXJuKUtlY2Nha1dpZHRoMTYwMF9TcG9uZ2VBYnNvcmIoJmluc3RhbmNlLT5zcG9uZ2UsIGRhdGEsIGRhdGFiaXRsZW4vOCk7CisgICAgICAgIGlmIChyZXQgPT0gU1VDQ0VTUykgeworICAgICAgICAgICAgLyogVGhlIGxhc3QgcGFydGlhbCBieXRlIGlzIGFzc3VtZWQgdG8gYmUgYWxpZ25lZCBvbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyAqLworCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGxhc3RCeXRlID0gZGF0YVtkYXRhYml0bGVuLzhdOworICAgICAgICAgICAgLyogQ29uY2F0ZW5hdGUgdGhlIGxhc3QgZmV3IGJpdHMgcHJvdmlkZWQgaGVyZSB3aXRoIHRob3NlIG9mIHRoZSBzdWZmaXggKi8KKworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVsaW1pdGVkTGFzdEJ5dGVzID0gKHVuc2lnbmVkIHNob3J0KSgodW5zaWduZWQgc2hvcnQpbGFzdEJ5dGUgfCAoKHVuc2lnbmVkIHNob3J0KWluc3RhbmNlLT5kZWxpbWl0ZWRTdWZmaXggPDwgKGRhdGFiaXRsZW4gJSA4KSkpOworICAgICAgICAgICAgaWYgKChkZWxpbWl0ZWRMYXN0Qnl0ZXMgJiAweEZGMDApID09IDB4MDAwMCkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlLT5kZWxpbWl0ZWRTdWZmaXggPSBkZWxpbWl0ZWRMYXN0Qnl0ZXMgJiAweEZGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvbmVCeXRlWzFdOworICAgICAgICAgICAgICAgIG9uZUJ5dGVbMF0gPSBkZWxpbWl0ZWRMYXN0Qnl0ZXMgJiAweEZGOworICAgICAgICAgICAgICAgIHJldCA9IChIYXNoUmV0dXJuKUtlY2Nha1dpZHRoMTYwMF9TcG9uZ2VBYnNvcmIoJmluc3RhbmNlLT5zcG9uZ2UsIG9uZUJ5dGUsIDEpOworICAgICAgICAgICAgICAgIGluc3RhbmNlLT5kZWxpbWl0ZWRTdWZmaXggPSAoZGVsaW1pdGVkTGFzdEJ5dGVzID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitIYXNoUmV0dXJuIEtlY2Nha19IYXNoRmluYWwoS2VjY2FrX0hhc2hJbnN0YW5jZSAqaW5zdGFuY2UsIEJpdFNlcXVlbmNlICpoYXNodmFsKQoreworICAgIEhhc2hSZXR1cm4gcmV0ID0gKEhhc2hSZXR1cm4pS2VjY2FrV2lkdGgxNjAwX1Nwb25nZUFic29yYkxhc3RGZXdCaXRzKCZpbnN0YW5jZS0+c3BvbmdlLCBpbnN0YW5jZS0+ZGVsaW1pdGVkU3VmZml4KTsKKyAgICBpZiAocmV0ID09IFNVQ0NFU1MpCisgICAgICAgIHJldHVybiAoSGFzaFJldHVybilLZWNjYWtXaWR0aDE2MDBfU3BvbmdlU3F1ZWV6ZSgmaW5zdGFuY2UtPnNwb25nZSwgaGFzaHZhbCwgaW5zdGFuY2UtPmZpeGVkT3V0cHV0TGVuZ3RoLzgpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitIYXNoUmV0dXJuIEtlY2Nha19IYXNoU3F1ZWV6ZShLZWNjYWtfSGFzaEluc3RhbmNlICppbnN0YW5jZSwgQml0U2VxdWVuY2UgKmRhdGEsIERhdGFMZW5ndGggZGF0YWJpdGxlbikKK3sKKyAgICBpZiAoKGRhdGFiaXRsZW4gJSA4KSAhPSAwKQorICAgICAgICByZXR1cm4gRkFJTDsKKyAgICByZXR1cm4gKEhhc2hSZXR1cm4pS2VjY2FrV2lkdGgxNjAwX1Nwb25nZVNxdWVlemUoJmluc3RhbmNlLT5zcG9uZ2UsIGRhdGEsIGRhdGFiaXRsZW4vOCk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtIYXNoLmggYi9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtIYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJkM2RjNgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha0hhc2guaApAQCAtMCwwICsxLDExNCBAQAorLyoKK0ltcGxlbWVudGF0aW9uIGJ5IHRoZSBLZWNjYWssIEtleWFrIGFuZCBLZXRqZSBUZWFtcywgbmFtZWx5LCBHdWlkbyBCZXJ0b25pLAorSm9hbiBEYWVtZW4sIE1pY2hhw6tsIFBlZXRlcnMsIEdpbGxlcyBWYW4gQXNzY2hlIGFuZCBSb25ueSBWYW4gS2VlciwgaGVyZWJ5CitkZW5vdGVkIGFzICJ0aGUgaW1wbGVtZW50ZXIiLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZmVlZGJhY2sgb3IgcXVlc3Rpb25zLCBwbGVhc2UgcmVmZXIgdG8gb3VyIHdlYnNpdGVzOgoraHR0cDovL2tlY2Nhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXlhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXRqZS5ub2VrZW9uLm9yZy8KKworVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBpbXBsZW1lbnRlciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQKK2FuZCByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGUgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlLgoraHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworKi8KKworI2lmbmRlZiBfS2VjY2FrSGFzaEludGVyZmFjZV9oXworI2RlZmluZSBfS2VjY2FrSGFzaEludGVyZmFjZV9oXworCisjaWZuZGVmIEtlY2Nha1AxNjAwX2V4Y2x1ZGVkCisKKyNpbmNsdWRlICJLZWNjYWtTcG9uZ2UuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJpdFNlcXVlbmNlOwordHlwZWRlZiBzaXplX3QgRGF0YUxlbmd0aDsKK3R5cGVkZWYgZW51bSB7IFNVQ0NFU1MgPSAwLCBGQUlMID0gMSwgQkFEX0hBU0hMRU4gPSAyIH0gSGFzaFJldHVybjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEtlY2Nha1dpZHRoMTYwMF9TcG9uZ2VJbnN0YW5jZSBzcG9uZ2U7CisgICAgdW5zaWduZWQgaW50IGZpeGVkT3V0cHV0TGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgZGVsaW1pdGVkU3VmZml4OworfSBLZWNjYWtfSGFzaEluc3RhbmNlOworCisvKioKKyAgKiBGdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBLZWNjYWtbciwgY10gc3BvbmdlIGZ1bmN0aW9uIGluc3RhbmNlIHVzZWQgaW4gc2VxdWVudGlhbCBoYXNoaW5nIG1vZGUuCisgICogQHBhcmFtICBoYXNoSW5zdGFuY2UgICAgUG9pbnRlciB0byB0aGUgaGFzaCBpbnN0YW5jZSB0byBiZSBpbml0aWFsaXplZC4KKyAgKiBAcGFyYW0gIHJhdGUgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgcmF0ZSByLgorICAqIEBwYXJhbSAgY2FwYWNpdHkgICAgVGhlIHZhbHVlIG9mIHRoZSBjYXBhY2l0eSBjLgorICAqIEBwYXJhbSAgaGFzaGJpdGxlbiAgVGhlIGRlc2lyZWQgbnVtYmVyIG9mIG91dHB1dCBiaXRzLAorICAqICAgICAgICAgICAgICAgICAgICAgb3IgMCBmb3IgYW4gYXJiaXRyYXJpbHktbG9uZyBvdXRwdXQuCisgICogQHBhcmFtICBkZWxpbWl0ZWRTdWZmaXggQml0cyB0aGF0IHdpbGwgYmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgZW5kCisgICogICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGlucHV0IG1lc3NhZ2UsIGFzIGluIGRvbWFpbiBzZXBhcmF0aW9uLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBieXRlIGNvbnRhaW5pbmcgZnJvbSAwIHRvIDcgYml0cworICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCBsaWtlIHRoZSBAYSBkZWxpbWl0ZWREYXRhIHBhcmFtZXRlciBvZgorICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBLZWNjYWtfU3BvbmdlQWJzb3JiTGFzdEZld0JpdHMoKSBmdW5jdGlvbi4KKyAgKiBAcHJlICAgIE9uZSBtdXN0IGhhdmUgcitjPTE2MDAgYW5kIHRoZSByYXRlIGEgbXVsdGlwbGUgb2YgOCBiaXRzIGluIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICogQHJldHVybiBTVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIEZBSUwgb3RoZXJ3aXNlLgorICAqLworSGFzaFJldHVybiBLZWNjYWtfSGFzaEluaXRpYWxpemUoS2VjY2FrX0hhc2hJbnN0YW5jZSAqaGFzaEluc3RhbmNlLCB1bnNpZ25lZCBpbnQgcmF0ZSwgdW5zaWduZWQgaW50IGNhcGFjaXR5LCB1bnNpZ25lZCBpbnQgaGFzaGJpdGxlbiwgdW5zaWduZWQgY2hhciBkZWxpbWl0ZWRTdWZmaXgpOworCisvKiogTWFjcm8gdG8gaW5pdGlhbGl6ZSBhIFNIQUtFMTI4IGluc3RhbmNlIGFzIHNwZWNpZmllZCBpbiB0aGUgRklQUyAyMDIgc3RhbmRhcmQuCisgICovCisjZGVmaW5lIEtlY2Nha19IYXNoSW5pdGlhbGl6ZV9TSEFLRTEyOChoYXNoSW5zdGFuY2UpICAgICAgICBLZWNjYWtfSGFzaEluaXRpYWxpemUoaGFzaEluc3RhbmNlLCAxMzQ0LCAgMjU2LCAgIDAsIDB4MUYpCisKKy8qKiBNYWNybyB0byBpbml0aWFsaXplIGEgU0hBS0UyNTYgaW5zdGFuY2UgYXMgc3BlY2lmaWVkIGluIHRoZSBGSVBTIDIwMiBzdGFuZGFyZC4KKyAgKi8KKyNkZWZpbmUgS2VjY2FrX0hhc2hJbml0aWFsaXplX1NIQUtFMjU2KGhhc2hJbnN0YW5jZSkgICAgICAgIEtlY2Nha19IYXNoSW5pdGlhbGl6ZShoYXNoSW5zdGFuY2UsIDEwODgsICA1MTIsICAgMCwgMHgxRikKKworLyoqIE1hY3JvIHRvIGluaXRpYWxpemUgYSBTSEEzLTIyNCBpbnN0YW5jZSBhcyBzcGVjaWZpZWQgaW4gdGhlIEZJUFMgMjAyIHN0YW5kYXJkLgorICAqLworI2RlZmluZSBLZWNjYWtfSGFzaEluaXRpYWxpemVfU0hBM18yMjQoaGFzaEluc3RhbmNlKSAgICAgICAgS2VjY2FrX0hhc2hJbml0aWFsaXplKGhhc2hJbnN0YW5jZSwgMTE1MiwgIDQ0OCwgMjI0LCAweDA2KQorCisvKiogTWFjcm8gdG8gaW5pdGlhbGl6ZSBhIFNIQTMtMjU2IGluc3RhbmNlIGFzIHNwZWNpZmllZCBpbiB0aGUgRklQUyAyMDIgc3RhbmRhcmQuCisgICovCisjZGVmaW5lIEtlY2Nha19IYXNoSW5pdGlhbGl6ZV9TSEEzXzI1NihoYXNoSW5zdGFuY2UpICAgICAgICBLZWNjYWtfSGFzaEluaXRpYWxpemUoaGFzaEluc3RhbmNlLCAxMDg4LCAgNTEyLCAyNTYsIDB4MDYpCisKKy8qKiBNYWNybyB0byBpbml0aWFsaXplIGEgU0hBMy0zODQgaW5zdGFuY2UgYXMgc3BlY2lmaWVkIGluIHRoZSBGSVBTIDIwMiBzdGFuZGFyZC4KKyAgKi8KKyNkZWZpbmUgS2VjY2FrX0hhc2hJbml0aWFsaXplX1NIQTNfMzg0KGhhc2hJbnN0YW5jZSkgICAgICAgIEtlY2Nha19IYXNoSW5pdGlhbGl6ZShoYXNoSW5zdGFuY2UsICA4MzIsICA3NjgsIDM4NCwgMHgwNikKKworLyoqIE1hY3JvIHRvIGluaXRpYWxpemUgYSBTSEEzLTUxMiBpbnN0YW5jZSBhcyBzcGVjaWZpZWQgaW4gdGhlIEZJUFMgMjAyIHN0YW5kYXJkLgorICAqLworI2RlZmluZSBLZWNjYWtfSGFzaEluaXRpYWxpemVfU0hBM181MTIoaGFzaEluc3RhbmNlKSAgICAgICAgS2VjY2FrX0hhc2hJbml0aWFsaXplKGhhc2hJbnN0YW5jZSwgIDU3NiwgMTAyNCwgNTEyLCAweDA2KQorCisvKioKKyAgKiBGdW5jdGlvbiB0byBnaXZlIGlucHV0IGRhdGEgdG8gYmUgYWJzb3JiZWQuCisgICogQHBhcmFtICBoYXNoSW5zdGFuY2UgICAgUG9pbnRlciB0byB0aGUgaGFzaCBpbnN0YW5jZSBpbml0aWFsaXplZCBieSBLZWNjYWtfSGFzaEluaXRpYWxpemUoKS4KKyAgKiBAcGFyYW0gIGRhdGEgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEuCisgICogICAgICAgICAgICAgICAgICAgICBXaGVuIEBhIGRhdGFiaXRMZW4gaXMgbm90IGEgbXVsdGlwbGUgb2YgOCwgdGhlIGxhc3QgYml0cyBvZiBkYXRhIG11c3QgYmUKKyAgKiAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBsYXN0IGJ5dGUgKGxpdHRsZS1lbmRpYW4gY29udmVudGlvbikuCisgICogQHBhcmFtICBkYXRhYml0TGVuICBUaGUgbnVtYmVyIG9mIGlucHV0IGJpdHMgcHJvdmlkZWQgaW4gdGhlIGlucHV0IGRhdGEuCisgICogQHByZSAgICBJbiB0aGUgcHJldmlvdXMgY2FsbCB0byBLZWNjYWtfSGFzaFVwZGF0ZSgpLCBkYXRhYml0bGVuIHdhcyBhIG11bHRpcGxlIG9mIDguCisgICogQHJldHVybiBTVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIEZBSUwgb3RoZXJ3aXNlLgorICAqLworSGFzaFJldHVybiBLZWNjYWtfSGFzaFVwZGF0ZShLZWNjYWtfSGFzaEluc3RhbmNlICpoYXNoSW5zdGFuY2UsIGNvbnN0IEJpdFNlcXVlbmNlICpkYXRhLCBEYXRhTGVuZ3RoIGRhdGFiaXRsZW4pOworCisvKioKKyAgKiBGdW5jdGlvbiB0byBjYWxsIGFmdGVyIGFsbCBpbnB1dCBibG9ja3MgaGF2ZSBiZWVuIGlucHV0IGFuZCB0byBnZXQKKyAgKiBvdXRwdXQgYml0cyBpZiB0aGUgbGVuZ3RoIHdhcyBzcGVjaWZpZWQgd2hlbiBjYWxsaW5nIEtlY2Nha19IYXNoSW5pdGlhbGl6ZSgpLgorICAqIEBwYXJhbSAgaGFzaEluc3RhbmNlICAgIFBvaW50ZXIgdG8gdGhlIGhhc2ggaW5zdGFuY2UgaW5pdGlhbGl6ZWQgYnkgS2VjY2FrX0hhc2hJbml0aWFsaXplKCkuCisgICogSWYgQGEgaGFzaGJpdGxlbiB3YXMgbm90IDAgaW4gdGhlIGNhbGwgdG8gS2VjY2FrX0hhc2hJbml0aWFsaXplKCksIHRoZSBudW1iZXIgb2YKKyAgKiAgICAgb3V0cHV0IGJpdHMgaXMgZXF1YWwgdG8gQGEgaGFzaGJpdGxlbi4KKyAgKiBJZiBAYSBoYXNoYml0bGVuIHdhcyAwIGluIHRoZSBjYWxsIHRvIEtlY2Nha19IYXNoSW5pdGlhbGl6ZSgpLCB0aGUgb3V0cHV0IGJpdHMKKyAgKiAgICAgbXVzdCBiZSBleHRyYWN0ZWQgdXNpbmcgdGhlIEtlY2Nha19IYXNoU3F1ZWV6ZSgpIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgc3RhdGUgICAgICAgUG9pbnRlciB0byB0aGUgc3RhdGUgb2YgdGhlIHNwb25nZSBmdW5jdGlvbiBpbml0aWFsaXplZCBieSBJbml0KCkuCisgICogQHBhcmFtICBoYXNodmFsICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgd2hlcmUgdG8gc3RvcmUgdGhlIG91dHB1dCBkYXRhLgorICAqIEByZXR1cm4gU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBGQUlMIG90aGVyd2lzZS4KKyAgKi8KK0hhc2hSZXR1cm4gS2VjY2FrX0hhc2hGaW5hbChLZWNjYWtfSGFzaEluc3RhbmNlICpoYXNoSW5zdGFuY2UsIEJpdFNlcXVlbmNlICpoYXNodmFsKTsKKworIC8qKgorICAqIEZ1bmN0aW9uIHRvIHNxdWVlemUgb3V0cHV0IGRhdGEuCisgICogQHBhcmFtICBoYXNoSW5zdGFuY2UgICAgUG9pbnRlciB0byB0aGUgaGFzaCBpbnN0YW5jZSBpbml0aWFsaXplZCBieSBLZWNjYWtfSGFzaEluaXRpYWxpemUoKS4KKyAgKiBAcGFyYW0gIGRhdGEgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB3aGVyZSB0byBzdG9yZSB0aGUgb3V0cHV0IGRhdGEuCisgICogQHBhcmFtICBkYXRhYml0bGVuICBUaGUgbnVtYmVyIG9mIG91dHB1dCBiaXRzIGRlc2lyZWQgKG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4KS4KKyAgKiBAcHJlICAgIEtlY2Nha19IYXNoRmluYWwoKSBtdXN0IGhhdmUgYmVlbiBhbHJlYWR5IGNhbGxlZC4KKyAgKiBAcHJlICAgIEBhIGRhdGFiaXRsZW4gaXMgYSBtdWx0aXBsZSBvZiA4LgorICAqIEByZXR1cm4gU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBGQUlMIG90aGVyd2lzZS4KKyAgKi8KK0hhc2hSZXR1cm4gS2VjY2FrX0hhc2hTcXVlZXplKEtlY2Nha19IYXNoSW5zdGFuY2UgKmhhc2hJbnN0YW5jZSwgQml0U2VxdWVuY2UgKmRhdGEsIERhdGFMZW5ndGggZGF0YWJpdGxlbik7CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha1AtMTYwMC02NC5tYWNyb3MgYi9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtQLTE2MDAtNjQubWFjcm9zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTFmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtQLTE2MDAtNjQubWFjcm9zCkBAIC0wLDAgKzEsMjIwOCBAQAorLyoKK0ltcGxlbWVudGF0aW9uIGJ5IHRoZSBLZWNjYWssIEtleWFrIGFuZCBLZXRqZSBUZWFtcywgbmFtZWx5LCBHdWlkbyBCZXJ0b25pLAorSm9hbiBEYWVtZW4sIE1pY2hhw6tsIFBlZXRlcnMsIEdpbGxlcyBWYW4gQXNzY2hlIGFuZCBSb25ueSBWYW4gS2VlciwgaGVyZWJ5CitkZW5vdGVkIGFzICJ0aGUgaW1wbGVtZW50ZXIiLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZmVlZGJhY2sgb3IgcXVlc3Rpb25zLCBwbGVhc2UgcmVmZXIgdG8gb3VyIHdlYnNpdGVzOgoraHR0cDovL2tlY2Nhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXlhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXRqZS5ub2VrZW9uLm9yZy8KKworVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBpbXBsZW1lbnRlciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQKK2FuZCByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGUgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlLgoraHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworKi8KKworI2RlZmluZSBkZWNsYXJlQUJDREUgXAorICAgIFVJTlQ2NCBBYmEsIEFiZSwgQWJpLCBBYm8sIEFidTsgXAorICAgIFVJTlQ2NCBBZ2EsIEFnZSwgQWdpLCBBZ28sIEFndTsgXAorICAgIFVJTlQ2NCBBa2EsIEFrZSwgQWtpLCBBa28sIEFrdTsgXAorICAgIFVJTlQ2NCBBbWEsIEFtZSwgQW1pLCBBbW8sIEFtdTsgXAorICAgIFVJTlQ2NCBBc2EsIEFzZSwgQXNpLCBBc28sIEFzdTsgXAorICAgIFVJTlQ2NCBCYmEsIEJiZSwgQmJpLCBCYm8sIEJidTsgXAorICAgIFVJTlQ2NCBCZ2EsIEJnZSwgQmdpLCBCZ28sIEJndTsgXAorICAgIFVJTlQ2NCBCa2EsIEJrZSwgQmtpLCBCa28sIEJrdTsgXAorICAgIFVJTlQ2NCBCbWEsIEJtZSwgQm1pLCBCbW8sIEJtdTsgXAorICAgIFVJTlQ2NCBCc2EsIEJzZSwgQnNpLCBCc28sIEJzdTsgXAorICAgIFVJTlQ2NCBDYSwgQ2UsIENpLCBDbywgQ3U7IFwKKyAgICBVSU5UNjQgRGEsIERlLCBEaSwgRG8sIER1OyBcCisgICAgVUlOVDY0IEViYSwgRWJlLCBFYmksIEVibywgRWJ1OyBcCisgICAgVUlOVDY0IEVnYSwgRWdlLCBFZ2ksIEVnbywgRWd1OyBcCisgICAgVUlOVDY0IEVrYSwgRWtlLCBFa2ksIEVrbywgRWt1OyBcCisgICAgVUlOVDY0IEVtYSwgRW1lLCBFbWksIEVtbywgRW11OyBcCisgICAgVUlOVDY0IEVzYSwgRXNlLCBFc2ksIEVzbywgRXN1OyBcCisKKyNkZWZpbmUgcHJlcGFyZVRoZXRhIFwKKyAgICBDYSA9IEFiYV5BZ2FeQWthXkFtYV5Bc2E7IFwKKyAgICBDZSA9IEFiZV5BZ2VeQWtlXkFtZV5Bc2U7IFwKKyAgICBDaSA9IEFiaV5BZ2leQWtpXkFtaV5Bc2k7IFwKKyAgICBDbyA9IEFib15BZ29eQWtvXkFtb15Bc287IFwKKyAgICBDdSA9IEFidV5BZ3VeQWt1XkFtdV5Bc3U7IFwKKworI2lmZGVmIFVzZUJlYmlnb2tpbWlzYQorLyogLS0tIENvZGUgZm9yIHJvdW5kLCB3aXRoIHByZXBhcmUtdGhldGEgKGxhbmUgY29tcGxlbWVudGluZyBwYXR0ZXJuICdiZWJpZ29raW1pc2EnKSAqLworCisvKiAtLS0gNjQtYml0IGxhbmVzIG1hcHBlZCB0byA2NC1iaXQgd29yZHMgKi8KKworI2RlZmluZSB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpLCBBLCBFKSBcCisgICAgRGEgPSBDdV5ST0w2NChDZSwgMSk7IFwKKyAgICBEZSA9IENhXlJPTDY0KENpLCAxKTsgXAorICAgIERpID0gQ2VeUk9MNjQoQ28sIDEpOyBcCisgICAgRG8gPSBDaV5ST0w2NChDdSwgMSk7IFwKKyAgICBEdSA9IENvXlJPTDY0KENhLCAxKTsgXAorXAorICAgIEEjI2JhIF49IERhOyBcCisgICAgQmJhID0gQSMjYmE7IFwKKyAgICBBIyNnZSBePSBEZTsgXAorICAgIEJiZSA9IFJPTDY0KEEjI2dlLCA0NCk7IFwKKyAgICBBIyNraSBePSBEaTsgXAorICAgIEJiaSA9IFJPTDY0KEEjI2tpLCA0Myk7IFwKKyAgICBBIyNtbyBePSBEbzsgXAorICAgIEJibyA9IFJPTDY0KEEjI21vLCAyMSk7IFwKKyAgICBBIyNzdSBePSBEdTsgXAorICAgIEJidSA9IFJPTDY0KEEjI3N1LCAxNCk7IFwKKyAgICBFIyNiYSA9ICAgQmJhIF4oICBCYmUgfCAgQmJpICk7IFwKKyAgICBFIyNiYSBePSBLZWNjYWtGMTYwMFJvdW5kQ29uc3RhbnRzW2ldOyBcCisgICAgQ2EgPSBFIyNiYTsgXAorICAgIEUjI2JlID0gICBCYmUgXigofkJiaSl8ICBCYm8gKTsgXAorICAgIENlID0gRSMjYmU7IFwKKyAgICBFIyNiaSA9ICAgQmJpIF4oICBCYm8gJiAgQmJ1ICk7IFwKKyAgICBDaSA9IEUjI2JpOyBcCisgICAgRSMjYm8gPSAgIEJibyBeKCAgQmJ1IHwgIEJiYSApOyBcCisgICAgQ28gPSBFIyNibzsgXAorICAgIEUjI2J1ID0gICBCYnUgXiggIEJiYSAmICBCYmUgKTsgXAorICAgIEN1ID0gRSMjYnU7IFwKK1wKKyAgICBBIyNibyBePSBEbzsgXAorICAgIEJnYSA9IFJPTDY0KEEjI2JvLCAyOCk7IFwKKyAgICBBIyNndSBePSBEdTsgXAorICAgIEJnZSA9IFJPTDY0KEEjI2d1LCAyMCk7IFwKKyAgICBBIyNrYSBePSBEYTsgXAorICAgIEJnaSA9IFJPTDY0KEEjI2thLCAzKTsgXAorICAgIEEjI21lIF49IERlOyBcCisgICAgQmdvID0gUk9MNjQoQSMjbWUsIDQ1KTsgXAorICAgIEEjI3NpIF49IERpOyBcCisgICAgQmd1ID0gUk9MNjQoQSMjc2ksIDYxKTsgXAorICAgIEUjI2dhID0gICBCZ2EgXiggIEJnZSB8ICBCZ2kgKTsgXAorICAgIENhIF49IEUjI2dhOyBcCisgICAgRSMjZ2UgPSAgIEJnZSBeKCAgQmdpICYgIEJnbyApOyBcCisgICAgQ2UgXj0gRSMjZ2U7IFwKKyAgICBFIyNnaSA9ICAgQmdpIF4oICBCZ28gfCh+Qmd1KSk7IFwKKyAgICBDaSBePSBFIyNnaTsgXAorICAgIEUjI2dvID0gICBCZ28gXiggIEJndSB8ICBCZ2EgKTsgXAorICAgIENvIF49IEUjI2dvOyBcCisgICAgRSMjZ3UgPSAgIEJndSBeKCAgQmdhICYgIEJnZSApOyBcCisgICAgQ3UgXj0gRSMjZ3U7IFwKK1wKKyAgICBBIyNiZSBePSBEZTsgXAorICAgIEJrYSA9IFJPTDY0KEEjI2JlLCAxKTsgXAorICAgIEEjI2dpIF49IERpOyBcCisgICAgQmtlID0gUk9MNjQoQSMjZ2ksIDYpOyBcCisgICAgQSMja28gXj0gRG87IFwKKyAgICBCa2kgPSBST0w2NChBIyNrbywgMjUpOyBcCisgICAgQSMjbXUgXj0gRHU7IFwKKyAgICBCa28gPSBST0w2NChBIyNtdSwgOCk7IFwKKyAgICBBIyNzYSBePSBEYTsgXAorICAgIEJrdSA9IFJPTDY0KEEjI3NhLCAxOCk7IFwKKyAgICBFIyNrYSA9ICAgQmthIF4oICBCa2UgfCAgQmtpICk7IFwKKyAgICBDYSBePSBFIyNrYTsgXAorICAgIEUjI2tlID0gICBCa2UgXiggIEJraSAmICBCa28gKTsgXAorICAgIENlIF49IEUjI2tlOyBcCisgICAgRSMja2kgPSAgIEJraSBeKCh+QmtvKSYgIEJrdSApOyBcCisgICAgQ2kgXj0gRSMja2k7IFwKKyAgICBFIyNrbyA9ICh+QmtvKV4oICBCa3UgfCAgQmthICk7IFwKKyAgICBDbyBePSBFIyNrbzsgXAorICAgIEUjI2t1ID0gICBCa3UgXiggIEJrYSAmICBCa2UgKTsgXAorICAgIEN1IF49IEUjI2t1OyBcCitcCisgICAgQSMjYnUgXj0gRHU7IFwKKyAgICBCbWEgPSBST0w2NChBIyNidSwgMjcpOyBcCisgICAgQSMjZ2EgXj0gRGE7IFwKKyAgICBCbWUgPSBST0w2NChBIyNnYSwgMzYpOyBcCisgICAgQSMja2UgXj0gRGU7IFwKKyAgICBCbWkgPSBST0w2NChBIyNrZSwgMTApOyBcCisgICAgQSMjbWkgXj0gRGk7IFwKKyAgICBCbW8gPSBST0w2NChBIyNtaSwgMTUpOyBcCisgICAgQSMjc28gXj0gRG87IFwKKyAgICBCbXUgPSBST0w2NChBIyNzbywgNTYpOyBcCisgICAgRSMjbWEgPSAgIEJtYSBeKCAgQm1lICYgIEJtaSApOyBcCisgICAgQ2EgXj0gRSMjbWE7IFwKKyAgICBFIyNtZSA9ICAgQm1lIF4oICBCbWkgfCAgQm1vICk7IFwKKyAgICBDZSBePSBFIyNtZTsgXAorICAgIEUjI21pID0gICBCbWkgXigofkJtbyl8ICBCbXUgKTsgXAorICAgIENpIF49IEUjI21pOyBcCisgICAgRSMjbW8gPSAofkJtbyleKCAgQm11ICYgIEJtYSApOyBcCisgICAgQ28gXj0gRSMjbW87IFwKKyAgICBFIyNtdSA9ICAgQm11IF4oICBCbWEgfCAgQm1lICk7IFwKKyAgICBDdSBePSBFIyNtdTsgXAorXAorICAgIEEjI2JpIF49IERpOyBcCisgICAgQnNhID0gUk9MNjQoQSMjYmksIDYyKTsgXAorICAgIEEjI2dvIF49IERvOyBcCisgICAgQnNlID0gUk9MNjQoQSMjZ28sIDU1KTsgXAorICAgIEEjI2t1IF49IER1OyBcCisgICAgQnNpID0gUk9MNjQoQSMja3UsIDM5KTsgXAorICAgIEEjI21hIF49IERhOyBcCisgICAgQnNvID0gUk9MNjQoQSMjbWEsIDQxKTsgXAorICAgIEEjI3NlIF49IERlOyBcCisgICAgQnN1ID0gUk9MNjQoQSMjc2UsIDIpOyBcCisgICAgRSMjc2EgPSAgIEJzYSBeKCh+QnNlKSYgIEJzaSApOyBcCisgICAgQ2EgXj0gRSMjc2E7IFwKKyAgICBFIyNzZSA9ICh+QnNlKV4oICBCc2kgfCAgQnNvICk7IFwKKyAgICBDZSBePSBFIyNzZTsgXAorICAgIEUjI3NpID0gICBCc2kgXiggIEJzbyAmICBCc3UgKTsgXAorICAgIENpIF49IEUjI3NpOyBcCisgICAgRSMjc28gPSAgIEJzbyBeKCAgQnN1IHwgIEJzYSApOyBcCisgICAgQ28gXj0gRSMjc287IFwKKyAgICBFIyNzdSA9ICAgQnN1IF4oICBCc2EgJiAgQnNlICk7IFwKKyAgICBDdSBePSBFIyNzdTsgXAorXAorCisvKiAtLS0gQ29kZSBmb3Igcm91bmQgKGxhbmUgY29tcGxlbWVudGluZyBwYXR0ZXJuICdiZWJpZ29raW1pc2EnKSAqLworCisvKiAtLS0gNjQtYml0IGxhbmVzIG1hcHBlZCB0byA2NC1iaXQgd29yZHMgKi8KKworI2RlZmluZSB0aGV0YVJob1BpQ2hpSW90YShpLCBBLCBFKSBcCisgICAgRGEgPSBDdV5ST0w2NChDZSwgMSk7IFwKKyAgICBEZSA9IENhXlJPTDY0KENpLCAxKTsgXAorICAgIERpID0gQ2VeUk9MNjQoQ28sIDEpOyBcCisgICAgRG8gPSBDaV5ST0w2NChDdSwgMSk7IFwKKyAgICBEdSA9IENvXlJPTDY0KENhLCAxKTsgXAorXAorICAgIEEjI2JhIF49IERhOyBcCisgICAgQmJhID0gQSMjYmE7IFwKKyAgICBBIyNnZSBePSBEZTsgXAorICAgIEJiZSA9IFJPTDY0KEEjI2dlLCA0NCk7IFwKKyAgICBBIyNraSBePSBEaTsgXAorICAgIEJiaSA9IFJPTDY0KEEjI2tpLCA0Myk7IFwKKyAgICBBIyNtbyBePSBEbzsgXAorICAgIEJibyA9IFJPTDY0KEEjI21vLCAyMSk7IFwKKyAgICBBIyNzdSBePSBEdTsgXAorICAgIEJidSA9IFJPTDY0KEEjI3N1LCAxNCk7IFwKKyAgICBFIyNiYSA9ICAgQmJhIF4oICBCYmUgfCAgQmJpICk7IFwKKyAgICBFIyNiYSBePSBLZWNjYWtGMTYwMFJvdW5kQ29uc3RhbnRzW2ldOyBcCisgICAgRSMjYmUgPSAgIEJiZSBeKCh+QmJpKXwgIEJibyApOyBcCisgICAgRSMjYmkgPSAgIEJiaSBeKCAgQmJvICYgIEJidSApOyBcCisgICAgRSMjYm8gPSAgIEJibyBeKCAgQmJ1IHwgIEJiYSApOyBcCisgICAgRSMjYnUgPSAgIEJidSBeKCAgQmJhICYgIEJiZSApOyBcCitcCisgICAgQSMjYm8gXj0gRG87IFwKKyAgICBCZ2EgPSBST0w2NChBIyNibywgMjgpOyBcCisgICAgQSMjZ3UgXj0gRHU7IFwKKyAgICBCZ2UgPSBST0w2NChBIyNndSwgMjApOyBcCisgICAgQSMja2EgXj0gRGE7IFwKKyAgICBCZ2kgPSBST0w2NChBIyNrYSwgMyk7IFwKKyAgICBBIyNtZSBePSBEZTsgXAorICAgIEJnbyA9IFJPTDY0KEEjI21lLCA0NSk7IFwKKyAgICBBIyNzaSBePSBEaTsgXAorICAgIEJndSA9IFJPTDY0KEEjI3NpLCA2MSk7IFwKKyAgICBFIyNnYSA9ICAgQmdhIF4oICBCZ2UgfCAgQmdpICk7IFwKKyAgICBFIyNnZSA9ICAgQmdlIF4oICBCZ2kgJiAgQmdvICk7IFwKKyAgICBFIyNnaSA9ICAgQmdpIF4oICBCZ28gfCh+Qmd1KSk7IFwKKyAgICBFIyNnbyA9ICAgQmdvIF4oICBCZ3UgfCAgQmdhICk7IFwKKyAgICBFIyNndSA9ICAgQmd1IF4oICBCZ2EgJiAgQmdlICk7IFwKK1wKKyAgICBBIyNiZSBePSBEZTsgXAorICAgIEJrYSA9IFJPTDY0KEEjI2JlLCAxKTsgXAorICAgIEEjI2dpIF49IERpOyBcCisgICAgQmtlID0gUk9MNjQoQSMjZ2ksIDYpOyBcCisgICAgQSMja28gXj0gRG87IFwKKyAgICBCa2kgPSBST0w2NChBIyNrbywgMjUpOyBcCisgICAgQSMjbXUgXj0gRHU7IFwKKyAgICBCa28gPSBST0w2NChBIyNtdSwgOCk7IFwKKyAgICBBIyNzYSBePSBEYTsgXAorICAgIEJrdSA9IFJPTDY0KEEjI3NhLCAxOCk7IFwKKyAgICBFIyNrYSA9ICAgQmthIF4oICBCa2UgfCAgQmtpICk7IFwKKyAgICBFIyNrZSA9ICAgQmtlIF4oICBCa2kgJiAgQmtvICk7IFwKKyAgICBFIyNraSA9ICAgQmtpIF4oKH5Ca28pJiAgQmt1ICk7IFwKKyAgICBFIyNrbyA9ICh+QmtvKV4oICBCa3UgfCAgQmthICk7IFwKKyAgICBFIyNrdSA9ICAgQmt1IF4oICBCa2EgJiAgQmtlICk7IFwKK1wKKyAgICBBIyNidSBePSBEdTsgXAorICAgIEJtYSA9IFJPTDY0KEEjI2J1LCAyNyk7IFwKKyAgICBBIyNnYSBePSBEYTsgXAorICAgIEJtZSA9IFJPTDY0KEEjI2dhLCAzNik7IFwKKyAgICBBIyNrZSBePSBEZTsgXAorICAgIEJtaSA9IFJPTDY0KEEjI2tlLCAxMCk7IFwKKyAgICBBIyNtaSBePSBEaTsgXAorICAgIEJtbyA9IFJPTDY0KEEjI21pLCAxNSk7IFwKKyAgICBBIyNzbyBePSBEbzsgXAorICAgIEJtdSA9IFJPTDY0KEEjI3NvLCA1Nik7IFwKKyAgICBFIyNtYSA9ICAgQm1hIF4oICBCbWUgJiAgQm1pICk7IFwKKyAgICBFIyNtZSA9ICAgQm1lIF4oICBCbWkgfCAgQm1vICk7IFwKKyAgICBFIyNtaSA9ICAgQm1pIF4oKH5CbW8pfCAgQm11ICk7IFwKKyAgICBFIyNtbyA9ICh+Qm1vKV4oICBCbXUgJiAgQm1hICk7IFwKKyAgICBFIyNtdSA9ICAgQm11IF4oICBCbWEgfCAgQm1lICk7IFwKK1wKKyAgICBBIyNiaSBePSBEaTsgXAorICAgIEJzYSA9IFJPTDY0KEEjI2JpLCA2Mik7IFwKKyAgICBBIyNnbyBePSBEbzsgXAorICAgIEJzZSA9IFJPTDY0KEEjI2dvLCA1NSk7IFwKKyAgICBBIyNrdSBePSBEdTsgXAorICAgIEJzaSA9IFJPTDY0KEEjI2t1LCAzOSk7IFwKKyAgICBBIyNtYSBePSBEYTsgXAorICAgIEJzbyA9IFJPTDY0KEEjI21hLCA0MSk7IFwKKyAgICBBIyNzZSBePSBEZTsgXAorICAgIEJzdSA9IFJPTDY0KEEjI3NlLCAyKTsgXAorICAgIEUjI3NhID0gICBCc2EgXigofkJzZSkmICBCc2kgKTsgXAorICAgIEUjI3NlID0gKH5Cc2UpXiggIEJzaSB8ICBCc28gKTsgXAorICAgIEUjI3NpID0gICBCc2kgXiggIEJzbyAmICBCc3UgKTsgXAorICAgIEUjI3NvID0gICBCc28gXiggIEJzdSB8ICBCc2EgKTsgXAorICAgIEUjI3N1ID0gICBCc3UgXiggIEJzYSAmICBCc2UgKTsgXAorXAorCisjZWxzZSAvKiBVc2VCZWJpZ29raW1pc2EgKi8KKworLyogLS0tIENvZGUgZm9yIHJvdW5kLCB3aXRoIHByZXBhcmUtdGhldGEgKi8KKworLyogLS0tIDY0LWJpdCBsYW5lcyBtYXBwZWQgdG8gNjQtYml0IHdvcmRzICovCisKKyNkZWZpbmUgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSwgQSwgRSkgXAorICAgIERhID0gQ3VeUk9MNjQoQ2UsIDEpOyBcCisgICAgRGUgPSBDYV5ST0w2NChDaSwgMSk7IFwKKyAgICBEaSA9IENlXlJPTDY0KENvLCAxKTsgXAorICAgIERvID0gQ2leUk9MNjQoQ3UsIDEpOyBcCisgICAgRHUgPSBDb15ST0w2NChDYSwgMSk7IFwKK1wKKyAgICBBIyNiYSBePSBEYTsgXAorICAgIEJiYSA9IEEjI2JhOyBcCisgICAgQSMjZ2UgXj0gRGU7IFwKKyAgICBCYmUgPSBST0w2NChBIyNnZSwgNDQpOyBcCisgICAgQSMja2kgXj0gRGk7IFwKKyAgICBCYmkgPSBST0w2NChBIyNraSwgNDMpOyBcCisgICAgQSMjbW8gXj0gRG87IFwKKyAgICBCYm8gPSBST0w2NChBIyNtbywgMjEpOyBcCisgICAgQSMjc3UgXj0gRHU7IFwKKyAgICBCYnUgPSBST0w2NChBIyNzdSwgMTQpOyBcCisgICAgRSMjYmEgPSAgIEJiYSBeKCh+QmJlKSYgIEJiaSApOyBcCisgICAgRSMjYmEgXj0gS2VjY2FrRjE2MDBSb3VuZENvbnN0YW50c1tpXTsgXAorICAgIENhID0gRSMjYmE7IFwKKyAgICBFIyNiZSA9ICAgQmJlIF4oKH5CYmkpJiAgQmJvICk7IFwKKyAgICBDZSA9IEUjI2JlOyBcCisgICAgRSMjYmkgPSAgIEJiaSBeKCh+QmJvKSYgIEJidSApOyBcCisgICAgQ2kgPSBFIyNiaTsgXAorICAgIEUjI2JvID0gICBCYm8gXigofkJidSkmICBCYmEgKTsgXAorICAgIENvID0gRSMjYm87IFwKKyAgICBFIyNidSA9ICAgQmJ1IF4oKH5CYmEpJiAgQmJlICk7IFwKKyAgICBDdSA9IEUjI2J1OyBcCitcCisgICAgQSMjYm8gXj0gRG87IFwKKyAgICBCZ2EgPSBST0w2NChBIyNibywgMjgpOyBcCisgICAgQSMjZ3UgXj0gRHU7IFwKKyAgICBCZ2UgPSBST0w2NChBIyNndSwgMjApOyBcCisgICAgQSMja2EgXj0gRGE7IFwKKyAgICBCZ2kgPSBST0w2NChBIyNrYSwgMyk7IFwKKyAgICBBIyNtZSBePSBEZTsgXAorICAgIEJnbyA9IFJPTDY0KEEjI21lLCA0NSk7IFwKKyAgICBBIyNzaSBePSBEaTsgXAorICAgIEJndSA9IFJPTDY0KEEjI3NpLCA2MSk7IFwKKyAgICBFIyNnYSA9ICAgQmdhIF4oKH5CZ2UpJiAgQmdpICk7IFwKKyAgICBDYSBePSBFIyNnYTsgXAorICAgIEUjI2dlID0gICBCZ2UgXigofkJnaSkmICBCZ28gKTsgXAorICAgIENlIF49IEUjI2dlOyBcCisgICAgRSMjZ2kgPSAgIEJnaSBeKCh+QmdvKSYgIEJndSApOyBcCisgICAgQ2kgXj0gRSMjZ2k7IFwKKyAgICBFIyNnbyA9ICAgQmdvIF4oKH5CZ3UpJiAgQmdhICk7IFwKKyAgICBDbyBePSBFIyNnbzsgXAorICAgIEUjI2d1ID0gICBCZ3UgXigofkJnYSkmICBCZ2UgKTsgXAorICAgIEN1IF49IEUjI2d1OyBcCitcCisgICAgQSMjYmUgXj0gRGU7IFwKKyAgICBCa2EgPSBST0w2NChBIyNiZSwgMSk7IFwKKyAgICBBIyNnaSBePSBEaTsgXAorICAgIEJrZSA9IFJPTDY0KEEjI2dpLCA2KTsgXAorICAgIEEjI2tvIF49IERvOyBcCisgICAgQmtpID0gUk9MNjQoQSMja28sIDI1KTsgXAorICAgIEEjI211IF49IER1OyBcCisgICAgQmtvID0gUk9MNjQoQSMjbXUsIDgpOyBcCisgICAgQSMjc2EgXj0gRGE7IFwKKyAgICBCa3UgPSBST0w2NChBIyNzYSwgMTgpOyBcCisgICAgRSMja2EgPSAgIEJrYSBeKCh+QmtlKSYgIEJraSApOyBcCisgICAgQ2EgXj0gRSMja2E7IFwKKyAgICBFIyNrZSA9ICAgQmtlIF4oKH5Ca2kpJiAgQmtvICk7IFwKKyAgICBDZSBePSBFIyNrZTsgXAorICAgIEUjI2tpID0gICBCa2kgXigofkJrbykmICBCa3UgKTsgXAorICAgIENpIF49IEUjI2tpOyBcCisgICAgRSMja28gPSAgIEJrbyBeKCh+Qmt1KSYgIEJrYSApOyBcCisgICAgQ28gXj0gRSMja287IFwKKyAgICBFIyNrdSA9ICAgQmt1IF4oKH5Ca2EpJiAgQmtlICk7IFwKKyAgICBDdSBePSBFIyNrdTsgXAorXAorICAgIEEjI2J1IF49IER1OyBcCisgICAgQm1hID0gUk9MNjQoQSMjYnUsIDI3KTsgXAorICAgIEEjI2dhIF49IERhOyBcCisgICAgQm1lID0gUk9MNjQoQSMjZ2EsIDM2KTsgXAorICAgIEEjI2tlIF49IERlOyBcCisgICAgQm1pID0gUk9MNjQoQSMja2UsIDEwKTsgXAorICAgIEEjI21pIF49IERpOyBcCisgICAgQm1vID0gUk9MNjQoQSMjbWksIDE1KTsgXAorICAgIEEjI3NvIF49IERvOyBcCisgICAgQm11ID0gUk9MNjQoQSMjc28sIDU2KTsgXAorICAgIEUjI21hID0gICBCbWEgXigofkJtZSkmICBCbWkgKTsgXAorICAgIENhIF49IEUjI21hOyBcCisgICAgRSMjbWUgPSAgIEJtZSBeKCh+Qm1pKSYgIEJtbyApOyBcCisgICAgQ2UgXj0gRSMjbWU7IFwKKyAgICBFIyNtaSA9ICAgQm1pIF4oKH5CbW8pJiAgQm11ICk7IFwKKyAgICBDaSBePSBFIyNtaTsgXAorICAgIEUjI21vID0gICBCbW8gXigofkJtdSkmICBCbWEgKTsgXAorICAgIENvIF49IEUjI21vOyBcCisgICAgRSMjbXUgPSAgIEJtdSBeKCh+Qm1hKSYgIEJtZSApOyBcCisgICAgQ3UgXj0gRSMjbXU7IFwKK1wKKyAgICBBIyNiaSBePSBEaTsgXAorICAgIEJzYSA9IFJPTDY0KEEjI2JpLCA2Mik7IFwKKyAgICBBIyNnbyBePSBEbzsgXAorICAgIEJzZSA9IFJPTDY0KEEjI2dvLCA1NSk7IFwKKyAgICBBIyNrdSBePSBEdTsgXAorICAgIEJzaSA9IFJPTDY0KEEjI2t1LCAzOSk7IFwKKyAgICBBIyNtYSBePSBEYTsgXAorICAgIEJzbyA9IFJPTDY0KEEjI21hLCA0MSk7IFwKKyAgICBBIyNzZSBePSBEZTsgXAorICAgIEJzdSA9IFJPTDY0KEEjI3NlLCAyKTsgXAorICAgIEUjI3NhID0gICBCc2EgXigofkJzZSkmICBCc2kgKTsgXAorICAgIENhIF49IEUjI3NhOyBcCisgICAgRSMjc2UgPSAgIEJzZSBeKCh+QnNpKSYgIEJzbyApOyBcCisgICAgQ2UgXj0gRSMjc2U7IFwKKyAgICBFIyNzaSA9ICAgQnNpIF4oKH5Cc28pJiAgQnN1ICk7IFwKKyAgICBDaSBePSBFIyNzaTsgXAorICAgIEUjI3NvID0gICBCc28gXigofkJzdSkmICBCc2EgKTsgXAorICAgIENvIF49IEUjI3NvOyBcCisgICAgRSMjc3UgPSAgIEJzdSBeKCh+QnNhKSYgIEJzZSApOyBcCisgICAgQ3UgXj0gRSMjc3U7IFwKK1wKKworLyogLS0tIENvZGUgZm9yIHJvdW5kICovCisKKy8qIC0tLSA2NC1iaXQgbGFuZXMgbWFwcGVkIHRvIDY0LWJpdCB3b3JkcyAqLworCisjZGVmaW5lIHRoZXRhUmhvUGlDaGlJb3RhKGksIEEsIEUpIFwKKyAgICBEYSA9IEN1XlJPTDY0KENlLCAxKTsgXAorICAgIERlID0gQ2FeUk9MNjQoQ2ksIDEpOyBcCisgICAgRGkgPSBDZV5ST0w2NChDbywgMSk7IFwKKyAgICBEbyA9IENpXlJPTDY0KEN1LCAxKTsgXAorICAgIER1ID0gQ29eUk9MNjQoQ2EsIDEpOyBcCitcCisgICAgQSMjYmEgXj0gRGE7IFwKKyAgICBCYmEgPSBBIyNiYTsgXAorICAgIEEjI2dlIF49IERlOyBcCisgICAgQmJlID0gUk9MNjQoQSMjZ2UsIDQ0KTsgXAorICAgIEEjI2tpIF49IERpOyBcCisgICAgQmJpID0gUk9MNjQoQSMja2ksIDQzKTsgXAorICAgIEEjI21vIF49IERvOyBcCisgICAgQmJvID0gUk9MNjQoQSMjbW8sIDIxKTsgXAorICAgIEEjI3N1IF49IER1OyBcCisgICAgQmJ1ID0gUk9MNjQoQSMjc3UsIDE0KTsgXAorICAgIEUjI2JhID0gICBCYmEgXigofkJiZSkmICBCYmkgKTsgXAorICAgIEUjI2JhIF49IEtlY2Nha0YxNjAwUm91bmRDb25zdGFudHNbaV07IFwKKyAgICBFIyNiZSA9ICAgQmJlIF4oKH5CYmkpJiAgQmJvICk7IFwKKyAgICBFIyNiaSA9ICAgQmJpIF4oKH5CYm8pJiAgQmJ1ICk7IFwKKyAgICBFIyNibyA9ICAgQmJvIF4oKH5CYnUpJiAgQmJhICk7IFwKKyAgICBFIyNidSA9ICAgQmJ1IF4oKH5CYmEpJiAgQmJlICk7IFwKK1wKKyAgICBBIyNibyBePSBEbzsgXAorICAgIEJnYSA9IFJPTDY0KEEjI2JvLCAyOCk7IFwKKyAgICBBIyNndSBePSBEdTsgXAorICAgIEJnZSA9IFJPTDY0KEEjI2d1LCAyMCk7IFwKKyAgICBBIyNrYSBePSBEYTsgXAorICAgIEJnaSA9IFJPTDY0KEEjI2thLCAzKTsgXAorICAgIEEjI21lIF49IERlOyBcCisgICAgQmdvID0gUk9MNjQoQSMjbWUsIDQ1KTsgXAorICAgIEEjI3NpIF49IERpOyBcCisgICAgQmd1ID0gUk9MNjQoQSMjc2ksIDYxKTsgXAorICAgIEUjI2dhID0gICBCZ2EgXigofkJnZSkmICBCZ2kgKTsgXAorICAgIEUjI2dlID0gICBCZ2UgXigofkJnaSkmICBCZ28gKTsgXAorICAgIEUjI2dpID0gICBCZ2kgXigofkJnbykmICBCZ3UgKTsgXAorICAgIEUjI2dvID0gICBCZ28gXigofkJndSkmICBCZ2EgKTsgXAorICAgIEUjI2d1ID0gICBCZ3UgXigofkJnYSkmICBCZ2UgKTsgXAorXAorICAgIEEjI2JlIF49IERlOyBcCisgICAgQmthID0gUk9MNjQoQSMjYmUsIDEpOyBcCisgICAgQSMjZ2kgXj0gRGk7IFwKKyAgICBCa2UgPSBST0w2NChBIyNnaSwgNik7IFwKKyAgICBBIyNrbyBePSBEbzsgXAorICAgIEJraSA9IFJPTDY0KEEjI2tvLCAyNSk7IFwKKyAgICBBIyNtdSBePSBEdTsgXAorICAgIEJrbyA9IFJPTDY0KEEjI211LCA4KTsgXAorICAgIEEjI3NhIF49IERhOyBcCisgICAgQmt1ID0gUk9MNjQoQSMjc2EsIDE4KTsgXAorICAgIEUjI2thID0gICBCa2EgXigofkJrZSkmICBCa2kgKTsgXAorICAgIEUjI2tlID0gICBCa2UgXigofkJraSkmICBCa28gKTsgXAorICAgIEUjI2tpID0gICBCa2kgXigofkJrbykmICBCa3UgKTsgXAorICAgIEUjI2tvID0gICBCa28gXigofkJrdSkmICBCa2EgKTsgXAorICAgIEUjI2t1ID0gICBCa3UgXigofkJrYSkmICBCa2UgKTsgXAorXAorICAgIEEjI2J1IF49IER1OyBcCisgICAgQm1hID0gUk9MNjQoQSMjYnUsIDI3KTsgXAorICAgIEEjI2dhIF49IERhOyBcCisgICAgQm1lID0gUk9MNjQoQSMjZ2EsIDM2KTsgXAorICAgIEEjI2tlIF49IERlOyBcCisgICAgQm1pID0gUk9MNjQoQSMja2UsIDEwKTsgXAorICAgIEEjI21pIF49IERpOyBcCisgICAgQm1vID0gUk9MNjQoQSMjbWksIDE1KTsgXAorICAgIEEjI3NvIF49IERvOyBcCisgICAgQm11ID0gUk9MNjQoQSMjc28sIDU2KTsgXAorICAgIEUjI21hID0gICBCbWEgXigofkJtZSkmICBCbWkgKTsgXAorICAgIEUjI21lID0gICBCbWUgXigofkJtaSkmICBCbW8gKTsgXAorICAgIEUjI21pID0gICBCbWkgXigofkJtbykmICBCbXUgKTsgXAorICAgIEUjI21vID0gICBCbW8gXigofkJtdSkmICBCbWEgKTsgXAorICAgIEUjI211ID0gICBCbXUgXigofkJtYSkmICBCbWUgKTsgXAorXAorICAgIEEjI2JpIF49IERpOyBcCisgICAgQnNhID0gUk9MNjQoQSMjYmksIDYyKTsgXAorICAgIEEjI2dvIF49IERvOyBcCisgICAgQnNlID0gUk9MNjQoQSMjZ28sIDU1KTsgXAorICAgIEEjI2t1IF49IER1OyBcCisgICAgQnNpID0gUk9MNjQoQSMja3UsIDM5KTsgXAorICAgIEEjI21hIF49IERhOyBcCisgICAgQnNvID0gUk9MNjQoQSMjbWEsIDQxKTsgXAorICAgIEEjI3NlIF49IERlOyBcCisgICAgQnN1ID0gUk9MNjQoQSMjc2UsIDIpOyBcCisgICAgRSMjc2EgPSAgIEJzYSBeKCh+QnNlKSYgIEJzaSApOyBcCisgICAgRSMjc2UgPSAgIEJzZSBeKCh+QnNpKSYgIEJzbyApOyBcCisgICAgRSMjc2kgPSAgIEJzaSBeKCh+QnNvKSYgIEJzdSApOyBcCisgICAgRSMjc28gPSAgIEJzbyBeKCh+QnN1KSYgIEJzYSApOyBcCisgICAgRSMjc3UgPSAgIEJzdSBeKCh+QnNhKSYgIEJzZSApOyBcCitcCisKKyNlbmRpZiAvKiBVc2VCZWJpZ29raW1pc2EgKi8KKworCisjZGVmaW5lIGNvcHlGcm9tU3RhdGUoWCwgc3RhdGUpIFwKKyAgICBYIyNiYSA9IHN0YXRlWyAwXTsgXAorICAgIFgjI2JlID0gc3RhdGVbIDFdOyBcCisgICAgWCMjYmkgPSBzdGF0ZVsgMl07IFwKKyAgICBYIyNibyA9IHN0YXRlWyAzXTsgXAorICAgIFgjI2J1ID0gc3RhdGVbIDRdOyBcCisgICAgWCMjZ2EgPSBzdGF0ZVsgNV07IFwKKyAgICBYIyNnZSA9IHN0YXRlWyA2XTsgXAorICAgIFgjI2dpID0gc3RhdGVbIDddOyBcCisgICAgWCMjZ28gPSBzdGF0ZVsgOF07IFwKKyAgICBYIyNndSA9IHN0YXRlWyA5XTsgXAorICAgIFgjI2thID0gc3RhdGVbMTBdOyBcCisgICAgWCMja2UgPSBzdGF0ZVsxMV07IFwKKyAgICBYIyNraSA9IHN0YXRlWzEyXTsgXAorICAgIFgjI2tvID0gc3RhdGVbMTNdOyBcCisgICAgWCMja3UgPSBzdGF0ZVsxNF07IFwKKyAgICBYIyNtYSA9IHN0YXRlWzE1XTsgXAorICAgIFgjI21lID0gc3RhdGVbMTZdOyBcCisgICAgWCMjbWkgPSBzdGF0ZVsxN107IFwKKyAgICBYIyNtbyA9IHN0YXRlWzE4XTsgXAorICAgIFgjI211ID0gc3RhdGVbMTldOyBcCisgICAgWCMjc2EgPSBzdGF0ZVsyMF07IFwKKyAgICBYIyNzZSA9IHN0YXRlWzIxXTsgXAorICAgIFgjI3NpID0gc3RhdGVbMjJdOyBcCisgICAgWCMjc28gPSBzdGF0ZVsyM107IFwKKyAgICBYIyNzdSA9IHN0YXRlWzI0XTsgXAorCisjZGVmaW5lIGNvcHlUb1N0YXRlKHN0YXRlLCBYKSBcCisgICAgc3RhdGVbIDBdID0gWCMjYmE7IFwKKyAgICBzdGF0ZVsgMV0gPSBYIyNiZTsgXAorICAgIHN0YXRlWyAyXSA9IFgjI2JpOyBcCisgICAgc3RhdGVbIDNdID0gWCMjYm87IFwKKyAgICBzdGF0ZVsgNF0gPSBYIyNidTsgXAorICAgIHN0YXRlWyA1XSA9IFgjI2dhOyBcCisgICAgc3RhdGVbIDZdID0gWCMjZ2U7IFwKKyAgICBzdGF0ZVsgN10gPSBYIyNnaTsgXAorICAgIHN0YXRlWyA4XSA9IFgjI2dvOyBcCisgICAgc3RhdGVbIDldID0gWCMjZ3U7IFwKKyAgICBzdGF0ZVsxMF0gPSBYIyNrYTsgXAorICAgIHN0YXRlWzExXSA9IFgjI2tlOyBcCisgICAgc3RhdGVbMTJdID0gWCMja2k7IFwKKyAgICBzdGF0ZVsxM10gPSBYIyNrbzsgXAorICAgIHN0YXRlWzE0XSA9IFgjI2t1OyBcCisgICAgc3RhdGVbMTVdID0gWCMjbWE7IFwKKyAgICBzdGF0ZVsxNl0gPSBYIyNtZTsgXAorICAgIHN0YXRlWzE3XSA9IFgjI21pOyBcCisgICAgc3RhdGVbMThdID0gWCMjbW87IFwKKyAgICBzdGF0ZVsxOV0gPSBYIyNtdTsgXAorICAgIHN0YXRlWzIwXSA9IFgjI3NhOyBcCisgICAgc3RhdGVbMjFdID0gWCMjc2U7IFwKKyAgICBzdGF0ZVsyMl0gPSBYIyNzaTsgXAorICAgIHN0YXRlWzIzXSA9IFgjI3NvOyBcCisgICAgc3RhdGVbMjRdID0gWCMjc3U7IFwKKworI2RlZmluZSBjb3B5U3RhdGVWYXJpYWJsZXMoWCwgWSkgXAorICAgIFgjI2JhID0gWSMjYmE7IFwKKyAgICBYIyNiZSA9IFkjI2JlOyBcCisgICAgWCMjYmkgPSBZIyNiaTsgXAorICAgIFgjI2JvID0gWSMjYm87IFwKKyAgICBYIyNidSA9IFkjI2J1OyBcCisgICAgWCMjZ2EgPSBZIyNnYTsgXAorICAgIFgjI2dlID0gWSMjZ2U7IFwKKyAgICBYIyNnaSA9IFkjI2dpOyBcCisgICAgWCMjZ28gPSBZIyNnbzsgXAorICAgIFgjI2d1ID0gWSMjZ3U7IFwKKyAgICBYIyNrYSA9IFkjI2thOyBcCisgICAgWCMja2UgPSBZIyNrZTsgXAorICAgIFgjI2tpID0gWSMja2k7IFwKKyAgICBYIyNrbyA9IFkjI2tvOyBcCisgICAgWCMja3UgPSBZIyNrdTsgXAorICAgIFgjI21hID0gWSMjbWE7IFwKKyAgICBYIyNtZSA9IFkjI21lOyBcCisgICAgWCMjbWkgPSBZIyNtaTsgXAorICAgIFgjI21vID0gWSMjbW87IFwKKyAgICBYIyNtdSA9IFkjI211OyBcCisgICAgWCMjc2EgPSBZIyNzYTsgXAorICAgIFgjI3NlID0gWSMjc2U7IFwKKyAgICBYIyNzaSA9IFkjI3NpOyBcCisgICAgWCMjc28gPSBZIyNzbzsgXAorICAgIFgjI3N1ID0gWSMjc3U7IFwKKworI2RlZmluZSBjb3B5RnJvbVN0YXRlQW5kQWRkKFgsIHN0YXRlLCBpbnB1dCwgbGFuZUNvdW50KSBcCisgICAgaWYgKGxhbmVDb3VudCA8IDE2KSB7IFwKKyAgICAgICAgaWYgKGxhbmVDb3VudCA8IDgpIHsgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDQpIHsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDEpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjYmEgPSBzdGF0ZVsgMF07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNiYSA9IHN0YXRlWyAwXV5pbnB1dFsgMF07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIFgjI2JlID0gc3RhdGVbIDFdOyBcCisgICAgICAgICAgICAgICAgICAgIFgjI2JpID0gc3RhdGVbIDJdOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjYmEgPSBzdGF0ZVsgMF1eaW5wdXRbIDBdOyBcCisgICAgICAgICAgICAgICAgICAgIFgjI2JlID0gc3RhdGVbIDFdXmlucHV0WyAxXTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMykgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNiaSA9IHN0YXRlWyAyXTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2JpID0gc3RhdGVbIDJdXmlucHV0WyAyXTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBYIyNibyA9IHN0YXRlWyAzXTsgXAorICAgICAgICAgICAgICAgIFgjI2J1ID0gc3RhdGVbIDRdOyBcCisgICAgICAgICAgICAgICAgWCMjZ2EgPSBzdGF0ZVsgNV07IFwKKyAgICAgICAgICAgICAgICBYIyNnZSA9IHN0YXRlWyA2XTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgIFgjI2JhID0gc3RhdGVbIDBdXmlucHV0WyAwXTsgXAorICAgICAgICAgICAgICAgIFgjI2JlID0gc3RhdGVbIDFdXmlucHV0WyAxXTsgXAorICAgICAgICAgICAgICAgIFgjI2JpID0gc3RhdGVbIDJdXmlucHV0WyAyXTsgXAorICAgICAgICAgICAgICAgIFgjI2JvID0gc3RhdGVbIDNdXmlucHV0WyAzXTsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCA2KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDUpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjYnUgPSBzdGF0ZVsgNF07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNidSA9IHN0YXRlWyA0XV5pbnB1dFsgNF07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIFgjI2dhID0gc3RhdGVbIDVdOyBcCisgICAgICAgICAgICAgICAgICAgIFgjI2dlID0gc3RhdGVbIDZdOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjYnUgPSBzdGF0ZVsgNF1eaW5wdXRbIDRdOyBcCisgICAgICAgICAgICAgICAgICAgIFgjI2dhID0gc3RhdGVbIDVdXmlucHV0WyA1XTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgNykgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNnZSA9IHN0YXRlWyA2XTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2dlID0gc3RhdGVbIDZdXmlucHV0WyA2XTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgWCMjZ2kgPSBzdGF0ZVsgN107IFwKKyAgICAgICAgICAgIFgjI2dvID0gc3RhdGVbIDhdOyBcCisgICAgICAgICAgICBYIyNndSA9IHN0YXRlWyA5XTsgXAorICAgICAgICAgICAgWCMja2EgPSBzdGF0ZVsxMF07IFwKKyAgICAgICAgICAgIFgjI2tlID0gc3RhdGVbMTFdOyBcCisgICAgICAgICAgICBYIyNraSA9IHN0YXRlWzEyXTsgXAorICAgICAgICAgICAgWCMja28gPSBzdGF0ZVsxM107IFwKKyAgICAgICAgICAgIFgjI2t1ID0gc3RhdGVbMTRdOyBcCisgICAgICAgIH0gXAorICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgWCMjYmEgPSBzdGF0ZVsgMF1eaW5wdXRbIDBdOyBcCisgICAgICAgICAgICBYIyNiZSA9IHN0YXRlWyAxXV5pbnB1dFsgMV07IFwKKyAgICAgICAgICAgIFgjI2JpID0gc3RhdGVbIDJdXmlucHV0WyAyXTsgXAorICAgICAgICAgICAgWCMjYm8gPSBzdGF0ZVsgM11eaW5wdXRbIDNdOyBcCisgICAgICAgICAgICBYIyNidSA9IHN0YXRlWyA0XV5pbnB1dFsgNF07IFwKKyAgICAgICAgICAgIFgjI2dhID0gc3RhdGVbIDVdXmlucHV0WyA1XTsgXAorICAgICAgICAgICAgWCMjZ2UgPSBzdGF0ZVsgNl1eaW5wdXRbIDZdOyBcCisgICAgICAgICAgICBYIyNnaSA9IHN0YXRlWyA3XV5pbnB1dFsgN107IFwKKyAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxMikgeyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDEwKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjZ28gPSBzdGF0ZVsgOF07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNnbyA9IHN0YXRlWyA4XV5pbnB1dFsgOF07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIFgjI2d1ID0gc3RhdGVbIDldOyBcCisgICAgICAgICAgICAgICAgICAgIFgjI2thID0gc3RhdGVbMTBdOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjZ28gPSBzdGF0ZVsgOF1eaW5wdXRbIDhdOyBcCisgICAgICAgICAgICAgICAgICAgIFgjI2d1ID0gc3RhdGVbIDldXmlucHV0WyA5XTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTEpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMja2EgPSBzdGF0ZVsxMF07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNrYSA9IHN0YXRlWzEwXV5pbnB1dFsxMF07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgWCMja2UgPSBzdGF0ZVsxMV07IFwKKyAgICAgICAgICAgICAgICBYIyNraSA9IHN0YXRlWzEyXTsgXAorICAgICAgICAgICAgICAgIFgjI2tvID0gc3RhdGVbMTNdOyBcCisgICAgICAgICAgICAgICAgWCMja3UgPSBzdGF0ZVsxNF07IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBYIyNnbyA9IHN0YXRlWyA4XV5pbnB1dFsgOF07IFwKKyAgICAgICAgICAgICAgICBYIyNndSA9IHN0YXRlWyA5XV5pbnB1dFsgOV07IFwKKyAgICAgICAgICAgICAgICBYIyNrYSA9IHN0YXRlWzEwXV5pbnB1dFsxMF07IFwKKyAgICAgICAgICAgICAgICBYIyNrZSA9IHN0YXRlWzExXV5pbnB1dFsxMV07IFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTQpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTMpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMja2kgPSBzdGF0ZVsxMl07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNraSA9IHN0YXRlWzEyXV5pbnB1dFsxMl07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIFgjI2tvID0gc3RhdGVbMTNdOyBcCisgICAgICAgICAgICAgICAgICAgIFgjI2t1ID0gc3RhdGVbMTRdOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgWCMja2kgPSBzdGF0ZVsxMl1eaW5wdXRbMTJdOyBcCisgICAgICAgICAgICAgICAgICAgIFgjI2tvID0gc3RhdGVbMTNdXmlucHV0WzEzXTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTUpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMja3UgPSBzdGF0ZVsxNF07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNrdSA9IHN0YXRlWzE0XV5pbnB1dFsxNF07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgICAgIFgjI21hID0gc3RhdGVbMTVdOyBcCisgICAgICAgIFgjI21lID0gc3RhdGVbMTZdOyBcCisgICAgICAgIFgjI21pID0gc3RhdGVbMTddOyBcCisgICAgICAgIFgjI21vID0gc3RhdGVbMThdOyBcCisgICAgICAgIFgjI211ID0gc3RhdGVbMTldOyBcCisgICAgICAgIFgjI3NhID0gc3RhdGVbMjBdOyBcCisgICAgICAgIFgjI3NlID0gc3RhdGVbMjFdOyBcCisgICAgICAgIFgjI3NpID0gc3RhdGVbMjJdOyBcCisgICAgICAgIFgjI3NvID0gc3RhdGVbMjNdOyBcCisgICAgICAgIFgjI3N1ID0gc3RhdGVbMjRdOyBcCisgICAgfSBcCisgICAgZWxzZSB7IFwKKyAgICAgICAgWCMjYmEgPSBzdGF0ZVsgMF1eaW5wdXRbIDBdOyBcCisgICAgICAgIFgjI2JlID0gc3RhdGVbIDFdXmlucHV0WyAxXTsgXAorICAgICAgICBYIyNiaSA9IHN0YXRlWyAyXV5pbnB1dFsgMl07IFwKKyAgICAgICAgWCMjYm8gPSBzdGF0ZVsgM11eaW5wdXRbIDNdOyBcCisgICAgICAgIFgjI2J1ID0gc3RhdGVbIDRdXmlucHV0WyA0XTsgXAorICAgICAgICBYIyNnYSA9IHN0YXRlWyA1XV5pbnB1dFsgNV07IFwKKyAgICAgICAgWCMjZ2UgPSBzdGF0ZVsgNl1eaW5wdXRbIDZdOyBcCisgICAgICAgIFgjI2dpID0gc3RhdGVbIDddXmlucHV0WyA3XTsgXAorICAgICAgICBYIyNnbyA9IHN0YXRlWyA4XV5pbnB1dFsgOF07IFwKKyAgICAgICAgWCMjZ3UgPSBzdGF0ZVsgOV1eaW5wdXRbIDldOyBcCisgICAgICAgIFgjI2thID0gc3RhdGVbMTBdXmlucHV0WzEwXTsgXAorICAgICAgICBYIyNrZSA9IHN0YXRlWzExXV5pbnB1dFsxMV07IFwKKyAgICAgICAgWCMja2kgPSBzdGF0ZVsxMl1eaW5wdXRbMTJdOyBcCisgICAgICAgIFgjI2tvID0gc3RhdGVbMTNdXmlucHV0WzEzXTsgXAorICAgICAgICBYIyNrdSA9IHN0YXRlWzE0XV5pbnB1dFsxNF07IFwKKyAgICAgICAgWCMjbWEgPSBzdGF0ZVsxNV1eaW5wdXRbMTVdOyBcCisgICAgICAgIGlmIChsYW5lQ291bnQgPCAyNCkgeyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMjApIHsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxOCkgeyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxNykgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNtZSA9IHN0YXRlWzE2XTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI21lID0gc3RhdGVbMTZdXmlucHV0WzE2XTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjbWkgPSBzdGF0ZVsxN107IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjbW8gPSBzdGF0ZVsxOF07IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBYIyNtZSA9IHN0YXRlWzE2XV5pbnB1dFsxNl07IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjbWkgPSBzdGF0ZVsxN11eaW5wdXRbMTddOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxOSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNtbyA9IHN0YXRlWzE4XTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI21vID0gc3RhdGVbMThdXmlucHV0WzE4XTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBYIyNtdSA9IHN0YXRlWzE5XTsgXAorICAgICAgICAgICAgICAgIFgjI3NhID0gc3RhdGVbMjBdOyBcCisgICAgICAgICAgICAgICAgWCMjc2UgPSBzdGF0ZVsyMV07IFwKKyAgICAgICAgICAgICAgICBYIyNzaSA9IHN0YXRlWzIyXTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgIFgjI21lID0gc3RhdGVbMTZdXmlucHV0WzE2XTsgXAorICAgICAgICAgICAgICAgIFgjI21pID0gc3RhdGVbMTddXmlucHV0WzE3XTsgXAorICAgICAgICAgICAgICAgIFgjI21vID0gc3RhdGVbMThdXmlucHV0WzE4XTsgXAorICAgICAgICAgICAgICAgIFgjI211ID0gc3RhdGVbMTldXmlucHV0WzE5XTsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyMikgeyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyMSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNzYSA9IHN0YXRlWzIwXTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI3NhID0gc3RhdGVbMjBdXmlucHV0WzIwXTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjc2UgPSBzdGF0ZVsyMV07IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjc2kgPSBzdGF0ZVsyMl07IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBYIyNzYSA9IHN0YXRlWzIwXV5pbnB1dFsyMF07IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjc2UgPSBzdGF0ZVsyMV1eaW5wdXRbMjFdOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyMykgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNzaSA9IHN0YXRlWzIyXTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI3NpID0gc3RhdGVbMjJdXmlucHV0WzIyXTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgWCMjc28gPSBzdGF0ZVsyM107IFwKKyAgICAgICAgICAgIFgjI3N1ID0gc3RhdGVbMjRdOyBcCisgICAgICAgIH0gXAorICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgWCMjbWUgPSBzdGF0ZVsxNl1eaW5wdXRbMTZdOyBcCisgICAgICAgICAgICBYIyNtaSA9IHN0YXRlWzE3XV5pbnB1dFsxN107IFwKKyAgICAgICAgICAgIFgjI21vID0gc3RhdGVbMThdXmlucHV0WzE4XTsgXAorICAgICAgICAgICAgWCMjbXUgPSBzdGF0ZVsxOV1eaW5wdXRbMTldOyBcCisgICAgICAgICAgICBYIyNzYSA9IHN0YXRlWzIwXV5pbnB1dFsyMF07IFwKKyAgICAgICAgICAgIFgjI3NlID0gc3RhdGVbMjFdXmlucHV0WzIxXTsgXAorICAgICAgICAgICAgWCMjc2kgPSBzdGF0ZVsyMl1eaW5wdXRbMjJdOyBcCisgICAgICAgICAgICBYIyNzbyA9IHN0YXRlWzIzXV5pbnB1dFsyM107IFwKKyAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyNSkgeyBcCisgICAgICAgICAgICAgICAgWCMjc3UgPSBzdGF0ZVsyNF07IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBYIyNzdSA9IHN0YXRlWzI0XV5pbnB1dFsyNF07IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgYWRkSW5wdXQoWCwgaW5wdXQsIGxhbmVDb3VudCkgXAorICAgIGlmIChsYW5lQ291bnQgPT0gMjEpIHsgXAorICAgICAgICBYIyNiYSBePSBpbnB1dFsgMF07IFwKKyAgICAgICAgWCMjYmUgXj0gaW5wdXRbIDFdOyBcCisgICAgICAgIFgjI2JpIF49IGlucHV0WyAyXTsgXAorICAgICAgICBYIyNibyBePSBpbnB1dFsgM107IFwKKyAgICAgICAgWCMjYnUgXj0gaW5wdXRbIDRdOyBcCisgICAgICAgIFgjI2dhIF49IGlucHV0WyA1XTsgXAorICAgICAgICBYIyNnZSBePSBpbnB1dFsgNl07IFwKKyAgICAgICAgWCMjZ2kgXj0gaW5wdXRbIDddOyBcCisgICAgICAgIFgjI2dvIF49IGlucHV0WyA4XTsgXAorICAgICAgICBYIyNndSBePSBpbnB1dFsgOV07IFwKKyAgICAgICAgWCMja2EgXj0gaW5wdXRbMTBdOyBcCisgICAgICAgIFgjI2tlIF49IGlucHV0WzExXTsgXAorICAgICAgICBYIyNraSBePSBpbnB1dFsxMl07IFwKKyAgICAgICAgWCMja28gXj0gaW5wdXRbMTNdOyBcCisgICAgICAgIFgjI2t1IF49IGlucHV0WzE0XTsgXAorICAgICAgICBYIyNtYSBePSBpbnB1dFsxNV07IFwKKyAgICAgICAgWCMjbWUgXj0gaW5wdXRbMTZdOyBcCisgICAgICAgIFgjI21pIF49IGlucHV0WzE3XTsgXAorICAgICAgICBYIyNtbyBePSBpbnB1dFsxOF07IFwKKyAgICAgICAgWCMjbXUgXj0gaW5wdXRbMTldOyBcCisgICAgICAgIFgjI3NhIF49IGlucHV0WzIwXTsgXAorICAgIH0gXAorICAgIGVsc2UgaWYgKGxhbmVDb3VudCA8IDE2KSB7IFwKKyAgICAgICAgaWYgKGxhbmVDb3VudCA8IDgpIHsgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDQpIHsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDEpIHsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2JhIF49IGlucHV0WyAwXTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBYIyNiYSBePSBpbnB1dFsgMF07IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjYmUgXj0gaW5wdXRbIDFdOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAzKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNiaSBePSBpbnB1dFsgMl07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgWCMjYmEgXj0gaW5wdXRbIDBdOyBcCisgICAgICAgICAgICAgICAgWCMjYmUgXj0gaW5wdXRbIDFdOyBcCisgICAgICAgICAgICAgICAgWCMjYmkgXj0gaW5wdXRbIDJdOyBcCisgICAgICAgICAgICAgICAgWCMjYm8gXj0gaW5wdXRbIDNdOyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDYpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgNSkgeyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjYnUgXj0gaW5wdXRbIDRdOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIFgjI2J1IF49IGlucHV0WyA0XTsgXAorICAgICAgICAgICAgICAgICAgICBYIyNnYSBePSBpbnB1dFsgNV07IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDcpIHsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2dlIF49IGlucHV0WyA2XTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgIFgjI2JhIF49IGlucHV0WyAwXTsgXAorICAgICAgICAgICAgWCMjYmUgXj0gaW5wdXRbIDFdOyBcCisgICAgICAgICAgICBYIyNiaSBePSBpbnB1dFsgMl07IFwKKyAgICAgICAgICAgIFgjI2JvIF49IGlucHV0WyAzXTsgXAorICAgICAgICAgICAgWCMjYnUgXj0gaW5wdXRbIDRdOyBcCisgICAgICAgICAgICBYIyNnYSBePSBpbnB1dFsgNV07IFwKKyAgICAgICAgICAgIFgjI2dlIF49IGlucHV0WyA2XTsgXAorICAgICAgICAgICAgWCMjZ2kgXj0gaW5wdXRbIDddOyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTIpIHsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxMCkgeyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCA5KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNnbyBePSBpbnB1dFsgOF07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjZ28gXj0gaW5wdXRbIDhdOyBcCisgICAgICAgICAgICAgICAgICAgIFgjI2d1IF49IGlucHV0WyA5XTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTEpIHsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2thIF49IGlucHV0WzEwXTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBYIyNnbyBePSBpbnB1dFsgOF07IFwKKyAgICAgICAgICAgICAgICBYIyNndSBePSBpbnB1dFsgOV07IFwKKyAgICAgICAgICAgICAgICBYIyNrYSBePSBpbnB1dFsxMF07IFwKKyAgICAgICAgICAgICAgICBYIyNrZSBePSBpbnB1dFsxMV07IFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTQpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTMpIHsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2tpIF49IGlucHV0WzEyXTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBYIyNraSBePSBpbnB1dFsxMl07IFwKKyAgICAgICAgICAgICAgICAgICAgWCMja28gXj0gaW5wdXRbMTNdOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxNSkgeyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMja3UgXj0gaW5wdXRbMTRdOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gXAorICAgIGVsc2UgeyBcCisgICAgICAgIFgjI2JhIF49IGlucHV0WyAwXTsgXAorICAgICAgICBYIyNiZSBePSBpbnB1dFsgMV07IFwKKyAgICAgICAgWCMjYmkgXj0gaW5wdXRbIDJdOyBcCisgICAgICAgIFgjI2JvIF49IGlucHV0WyAzXTsgXAorICAgICAgICBYIyNidSBePSBpbnB1dFsgNF07IFwKKyAgICAgICAgWCMjZ2EgXj0gaW5wdXRbIDVdOyBcCisgICAgICAgIFgjI2dlIF49IGlucHV0WyA2XTsgXAorICAgICAgICBYIyNnaSBePSBpbnB1dFsgN107IFwKKyAgICAgICAgWCMjZ28gXj0gaW5wdXRbIDhdOyBcCisgICAgICAgIFgjI2d1IF49IGlucHV0WyA5XTsgXAorICAgICAgICBYIyNrYSBePSBpbnB1dFsxMF07IFwKKyAgICAgICAgWCMja2UgXj0gaW5wdXRbMTFdOyBcCisgICAgICAgIFgjI2tpIF49IGlucHV0WzEyXTsgXAorICAgICAgICBYIyNrbyBePSBpbnB1dFsxM107IFwKKyAgICAgICAgWCMja3UgXj0gaW5wdXRbMTRdOyBcCisgICAgICAgIFgjI21hIF49IGlucHV0WzE1XTsgXAorICAgICAgICBpZiAobGFuZUNvdW50IDwgMjQpIHsgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIwKSB7IFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTgpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTcpIHsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI21lIF49IGlucHV0WzE2XTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBYIyNtZSBePSBpbnB1dFsxNl07IFwKKyAgICAgICAgICAgICAgICAgICAgWCMjbWkgXj0gaW5wdXRbMTddOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxOSkgeyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjbW8gXj0gaW5wdXRbMThdOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgIFgjI21lIF49IGlucHV0WzE2XTsgXAorICAgICAgICAgICAgICAgIFgjI21pIF49IGlucHV0WzE3XTsgXAorICAgICAgICAgICAgICAgIFgjI21vIF49IGlucHV0WzE4XTsgXAorICAgICAgICAgICAgICAgIFgjI211IF49IGlucHV0WzE5XTsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyMikgeyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyMSkgeyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjc2EgXj0gaW5wdXRbMjBdOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIFgjI3NhIF49IGlucHV0WzIwXTsgXAorICAgICAgICAgICAgICAgICAgICBYIyNzZSBePSBpbnB1dFsyMV07IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIzKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNzaSBePSBpbnB1dFsyMl07IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICBYIyNtZSBePSBpbnB1dFsxNl07IFwKKyAgICAgICAgICAgIFgjI21pIF49IGlucHV0WzE3XTsgXAorICAgICAgICAgICAgWCMjbW8gXj0gaW5wdXRbMThdOyBcCisgICAgICAgICAgICBYIyNtdSBePSBpbnB1dFsxOV07IFwKKyAgICAgICAgICAgIFgjI3NhIF49IGlucHV0WzIwXTsgXAorICAgICAgICAgICAgWCMjc2UgXj0gaW5wdXRbMjFdOyBcCisgICAgICAgICAgICBYIyNzaSBePSBpbnB1dFsyMl07IFwKKyAgICAgICAgICAgIFgjI3NvIF49IGlucHV0WzIzXTsgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDI1KSB7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBYIyNzdSBePSBpbnB1dFsyNF07IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9CisKKyNpZmRlZiBVc2VCZWJpZ29raW1pc2EKKworI2RlZmluZSBjb3B5VG9TdGF0ZUFuZE91dHB1dChYLCBzdGF0ZSwgb3V0cHV0LCBsYW5lQ291bnQpIFwKKyAgICBpZiAobGFuZUNvdW50IDwgMTYpIHsgXAorICAgICAgICBpZiAobGFuZUNvdW50IDwgOCkgeyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgNCkgeyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIpIHsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsgMF0gPSBYIyNiYTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDEpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyAwXSA9IFgjI2JhOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsgMV0gPSBYIyNiZTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsgMl0gPSBYIyNiaTsgXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyAwXSA9IFgjI2JhOyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgMF0gPSBYIyNiYTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsgMV0gPSBYIyNiZTsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDFdID0gflgjI2JlOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyAyXSA9IFgjI2JpOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMykgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDJdID0gflgjI2JpOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIHN0YXRlWyAzXSA9IFgjI2JvOyBcCisgICAgICAgICAgICAgICAgc3RhdGVbIDRdID0gWCMjYnU7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsgNV0gPSBYIyNnYTsgXAorICAgICAgICAgICAgICAgIHN0YXRlWyA2XSA9IFgjI2dlOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgc3RhdGVbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsgMV0gPSBYIyNiZTsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsgMV0gPSB+WCMjYmU7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsgMl0gPSBYIyNiaTsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsgMl0gPSB+WCMjYmk7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsgM10gPSBYIyNibzsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsgM10gPSBYIyNibzsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCA2KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbIDRdID0gWCMjYnU7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSA1KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgNF0gPSBYIyNidTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbIDVdID0gWCMjZ2E7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbIDZdID0gWCMjZ2U7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsgNF0gPSBYIyNidTsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDRdID0gWCMjYnU7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbIDVdID0gWCMjZ2E7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyA1XSA9IFgjI2dhOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyA2XSA9IFgjI2dlOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gNykgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDZdID0gWCMjZ2U7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIHN0YXRlWyA3XSA9IFgjI2dpOyBcCisgICAgICAgICAgICBzdGF0ZVsgOF0gPSBYIyNnbzsgXAorICAgICAgICAgICAgc3RhdGVbIDldID0gWCMjZ3U7IFwKKyAgICAgICAgICAgIHN0YXRlWzEwXSA9IFgjI2thOyBcCisgICAgICAgICAgICBzdGF0ZVsxMV0gPSBYIyNrZTsgXAorICAgICAgICAgICAgc3RhdGVbMTJdID0gWCMja2k7IFwKKyAgICAgICAgICAgIHN0YXRlWzEzXSA9IFgjI2tvOyBcCisgICAgICAgICAgICBzdGF0ZVsxNF0gPSBYIyNrdTsgXAorICAgICAgICB9IFwKKyAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgIHN0YXRlWyAwXSA9IFgjI2JhOyBcCisgICAgICAgICAgICBvdXRwdXRbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgICAgIHN0YXRlWyAxXSA9IFgjI2JlOyBcCisgICAgICAgICAgICBvdXRwdXRbIDFdID0gflgjI2JlOyBcCisgICAgICAgICAgICBzdGF0ZVsgMl0gPSBYIyNiaTsgXAorICAgICAgICAgICAgb3V0cHV0WyAyXSA9IH5YIyNiaTsgXAorICAgICAgICAgICAgc3RhdGVbIDNdID0gWCMjYm87IFwKKyAgICAgICAgICAgIG91dHB1dFsgM10gPSBYIyNibzsgXAorICAgICAgICAgICAgc3RhdGVbIDRdID0gWCMjYnU7IFwKKyAgICAgICAgICAgIG91dHB1dFsgNF0gPSBYIyNidTsgXAorICAgICAgICAgICAgc3RhdGVbIDVdID0gWCMjZ2E7IFwKKyAgICAgICAgICAgIG91dHB1dFsgNV0gPSBYIyNnYTsgXAorICAgICAgICAgICAgc3RhdGVbIDZdID0gWCMjZ2U7IFwKKyAgICAgICAgICAgIG91dHB1dFsgNl0gPSBYIyNnZTsgXAorICAgICAgICAgICAgc3RhdGVbIDddID0gWCMjZ2k7IFwKKyAgICAgICAgICAgIG91dHB1dFsgN10gPSBYIyNnaTsgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDEyKSB7IFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTApIHsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsgOF0gPSBYIyNnbzsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyA4XSA9IH5YIyNnbzsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbIDldID0gWCMjZ3U7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMTBdID0gWCMja2E7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsgOF0gPSBYIyNnbzsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDhdID0gflgjI2dvOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyA5XSA9IFgjI2d1OyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgOV0gPSBYIyNndTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsxMF0gPSBYIyNrYTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDExKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxMF0gPSBYIyNrYTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsxMV0gPSBYIyNrZTsgXAorICAgICAgICAgICAgICAgIHN0YXRlWzEyXSA9IFgjI2tpOyBcCisgICAgICAgICAgICAgICAgc3RhdGVbMTNdID0gWCMja287IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsxNF0gPSBYIyNrdTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgIHN0YXRlWyA4XSA9IFgjI2dvOyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WyA4XSA9IH5YIyNnbzsgXAorICAgICAgICAgICAgICAgIHN0YXRlWyA5XSA9IFgjI2d1OyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WyA5XSA9IFgjI2d1OyBcCisgICAgICAgICAgICAgICAgc3RhdGVbMTBdID0gWCMja2E7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbMTBdID0gWCMja2E7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsxMV0gPSBYIyNrZTsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsxMV0gPSBYIyNrZTsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxNCkgeyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzEyXSA9IFgjI2tpOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMTMpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzEyXSA9IH5YIyNraTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMTNdID0gWCMja287IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMTRdID0gWCMja3U7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsxMl0gPSBYIyNraTsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTJdID0gflgjI2tpOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzEzXSA9IFgjI2tvOyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxM10gPSBYIyNrbzsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsxNF0gPSBYIyNrdTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDE1KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxNF0gPSBYIyNrdTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICAgICAgc3RhdGVbMTVdID0gWCMjbWE7IFwKKyAgICAgICAgc3RhdGVbMTZdID0gWCMjbWU7IFwKKyAgICAgICAgc3RhdGVbMTddID0gWCMjbWk7IFwKKyAgICAgICAgc3RhdGVbMThdID0gWCMjbW87IFwKKyAgICAgICAgc3RhdGVbMTldID0gWCMjbXU7IFwKKyAgICAgICAgc3RhdGVbMjBdID0gWCMjc2E7IFwKKyAgICAgICAgc3RhdGVbMjFdID0gWCMjc2U7IFwKKyAgICAgICAgc3RhdGVbMjJdID0gWCMjc2k7IFwKKyAgICAgICAgc3RhdGVbMjNdID0gWCMjc287IFwKKyAgICAgICAgc3RhdGVbMjRdID0gWCMjc3U7IFwKKyAgICB9IFwKKyAgICBlbHNlIHsgXAorICAgICAgICBzdGF0ZVsgMF0gPSBYIyNiYTsgXAorICAgICAgICBvdXRwdXRbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgc3RhdGVbIDFdID0gWCMjYmU7IFwKKyAgICAgICAgb3V0cHV0WyAxXSA9IH5YIyNiZTsgXAorICAgICAgICBzdGF0ZVsgMl0gPSBYIyNiaTsgXAorICAgICAgICBvdXRwdXRbIDJdID0gflgjI2JpOyBcCisgICAgICAgIHN0YXRlWyAzXSA9IFgjI2JvOyBcCisgICAgICAgIG91dHB1dFsgM10gPSBYIyNibzsgXAorICAgICAgICBzdGF0ZVsgNF0gPSBYIyNidTsgXAorICAgICAgICBvdXRwdXRbIDRdID0gWCMjYnU7IFwKKyAgICAgICAgc3RhdGVbIDVdID0gWCMjZ2E7IFwKKyAgICAgICAgb3V0cHV0WyA1XSA9IFgjI2dhOyBcCisgICAgICAgIHN0YXRlWyA2XSA9IFgjI2dlOyBcCisgICAgICAgIG91dHB1dFsgNl0gPSBYIyNnZTsgXAorICAgICAgICBzdGF0ZVsgN10gPSBYIyNnaTsgXAorICAgICAgICBvdXRwdXRbIDddID0gWCMjZ2k7IFwKKyAgICAgICAgc3RhdGVbIDhdID0gWCMjZ287IFwKKyAgICAgICAgb3V0cHV0WyA4XSA9IH5YIyNnbzsgXAorICAgICAgICBzdGF0ZVsgOV0gPSBYIyNndTsgXAorICAgICAgICBvdXRwdXRbIDldID0gWCMjZ3U7IFwKKyAgICAgICAgc3RhdGVbMTBdID0gWCMja2E7IFwKKyAgICAgICAgb3V0cHV0WzEwXSA9IFgjI2thOyBcCisgICAgICAgIHN0YXRlWzExXSA9IFgjI2tlOyBcCisgICAgICAgIG91dHB1dFsxMV0gPSBYIyNrZTsgXAorICAgICAgICBzdGF0ZVsxMl0gPSBYIyNraTsgXAorICAgICAgICBvdXRwdXRbMTJdID0gflgjI2tpOyBcCisgICAgICAgIHN0YXRlWzEzXSA9IFgjI2tvOyBcCisgICAgICAgIG91dHB1dFsxM10gPSBYIyNrbzsgXAorICAgICAgICBzdGF0ZVsxNF0gPSBYIyNrdTsgXAorICAgICAgICBvdXRwdXRbMTRdID0gWCMja3U7IFwKKyAgICAgICAgc3RhdGVbMTVdID0gWCMjbWE7IFwKKyAgICAgICAgb3V0cHV0WzE1XSA9IFgjI21hOyBcCisgICAgICAgIGlmIChsYW5lQ291bnQgPCAyNCkgeyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMjApIHsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxOCkgeyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzE2XSA9IFgjI21lOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMTcpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzE2XSA9IFgjI21lOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsxN10gPSBYIyNtaTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsxOF0gPSBYIyNtbzsgXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzE2XSA9IFgjI21lOyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxNl0gPSBYIyNtZTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsxN10gPSBYIyNtaTsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTddID0gflgjI21pOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzE4XSA9IFgjI21vOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMTkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzE4XSA9IFgjI21vOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIHN0YXRlWzE5XSA9IFgjI211OyBcCisgICAgICAgICAgICAgICAgc3RhdGVbMjBdID0gWCMjc2E7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsyMV0gPSBYIyNzZTsgXAorICAgICAgICAgICAgICAgIHN0YXRlWzIyXSA9IFgjI3NpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgc3RhdGVbMTZdID0gWCMjbWU7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbMTZdID0gWCMjbWU7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsxN10gPSBYIyNtaTsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsxN10gPSB+WCMjbWk7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsxOF0gPSBYIyNtbzsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsxOF0gPSBYIyNtbzsgXAorICAgICAgICAgICAgICAgIHN0YXRlWzE5XSA9IFgjI211OyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WzE5XSA9IFgjI211OyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIyKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMjBdID0gWCMjc2E7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAyMSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMjBdID0gflgjI3NhOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsyMV0gPSBYIyNzZTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsyMl0gPSBYIyNzaTsgXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzIwXSA9IFgjI3NhOyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsyMF0gPSB+WCMjc2E7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMjFdID0gWCMjc2U7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzIxXSA9IFgjI3NlOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzIyXSA9IFgjI3NpOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMjMpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzIyXSA9IFgjI3NpOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBzdGF0ZVsyM10gPSBYIyNzbzsgXAorICAgICAgICAgICAgc3RhdGVbMjRdID0gWCMjc3U7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICBzdGF0ZVsxNl0gPSBYIyNtZTsgXAorICAgICAgICAgICAgb3V0cHV0WzE2XSA9IFgjI21lOyBcCisgICAgICAgICAgICBzdGF0ZVsxN10gPSBYIyNtaTsgXAorICAgICAgICAgICAgb3V0cHV0WzE3XSA9IH5YIyNtaTsgXAorICAgICAgICAgICAgc3RhdGVbMThdID0gWCMjbW87IFwKKyAgICAgICAgICAgIG91dHB1dFsxOF0gPSBYIyNtbzsgXAorICAgICAgICAgICAgc3RhdGVbMTldID0gWCMjbXU7IFwKKyAgICAgICAgICAgIG91dHB1dFsxOV0gPSBYIyNtdTsgXAorICAgICAgICAgICAgc3RhdGVbMjBdID0gWCMjc2E7IFwKKyAgICAgICAgICAgIG91dHB1dFsyMF0gPSB+WCMjc2E7IFwKKyAgICAgICAgICAgIHN0YXRlWzIxXSA9IFgjI3NlOyBcCisgICAgICAgICAgICBvdXRwdXRbMjFdID0gWCMjc2U7IFwKKyAgICAgICAgICAgIHN0YXRlWzIyXSA9IFgjI3NpOyBcCisgICAgICAgICAgICBvdXRwdXRbMjJdID0gWCMjc2k7IFwKKyAgICAgICAgICAgIHN0YXRlWzIzXSA9IFgjI3NvOyBcCisgICAgICAgICAgICBvdXRwdXRbMjNdID0gWCMjc287IFwKKyAgICAgICAgICAgIHN0YXRlWzI0XSA9IFgjI3N1OyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDI1KSB7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbMjRdID0gWCMjc3U7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgb3V0cHV0KFgsIG91dHB1dCwgbGFuZUNvdW50KSBcCisgICAgaWYgKGxhbmVDb3VudCA8IDE2KSB7IFwKKyAgICAgICAgaWYgKGxhbmVDb3VudCA8IDgpIHsgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDQpIHsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAxKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgMF0gPSBYIyNiYTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyAxXSA9IH5YIyNiZTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDMpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyAyXSA9IH5YIyNiaTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbIDFdID0gflgjI2JlOyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WyAyXSA9IH5YIyNiaTsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsgM10gPSBYIyNibzsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCA2KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSA1KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgNF0gPSBYIyNidTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDRdID0gWCMjYnU7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyA1XSA9IFgjI2dhOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gNykgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDZdID0gWCMjZ2U7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICBvdXRwdXRbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgICAgIG91dHB1dFsgMV0gPSB+WCMjYmU7IFwKKyAgICAgICAgICAgIG91dHB1dFsgMl0gPSB+WCMjYmk7IFwKKyAgICAgICAgICAgIG91dHB1dFsgM10gPSBYIyNibzsgXAorICAgICAgICAgICAgb3V0cHV0WyA0XSA9IFgjI2J1OyBcCisgICAgICAgICAgICBvdXRwdXRbIDVdID0gWCMjZ2E7IFwKKyAgICAgICAgICAgIG91dHB1dFsgNl0gPSBYIyNnZTsgXAorICAgICAgICAgICAgb3V0cHV0WyA3XSA9IFgjI2dpOyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTIpIHsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxMCkgeyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gOSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDhdID0gflgjI2dvOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgOF0gPSB+WCMjZ287IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyA5XSA9IFgjI2d1OyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMTEpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzEwXSA9IFgjI2thOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsgOF0gPSB+WCMjZ287IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbIDldID0gWCMjZ3U7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbMTBdID0gWCMja2E7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbMTFdID0gWCMja2U7IFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTQpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDEzKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxMl0gPSB+WCMja2k7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzEyXSA9IH5YIyNraTsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTNdID0gWCMja287IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAxNSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTRdID0gWCMja3U7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgZWxzZSB7IFwKKyAgICAgICAgb3V0cHV0WyAwXSA9IFgjI2JhOyBcCisgICAgICAgIG91dHB1dFsgMV0gPSB+WCMjYmU7IFwKKyAgICAgICAgb3V0cHV0WyAyXSA9IH5YIyNiaTsgXAorICAgICAgICBvdXRwdXRbIDNdID0gWCMjYm87IFwKKyAgICAgICAgb3V0cHV0WyA0XSA9IFgjI2J1OyBcCisgICAgICAgIG91dHB1dFsgNV0gPSBYIyNnYTsgXAorICAgICAgICBvdXRwdXRbIDZdID0gWCMjZ2U7IFwKKyAgICAgICAgb3V0cHV0WyA3XSA9IFgjI2dpOyBcCisgICAgICAgIG91dHB1dFsgOF0gPSB+WCMjZ287IFwKKyAgICAgICAgb3V0cHV0WyA5XSA9IFgjI2d1OyBcCisgICAgICAgIG91dHB1dFsxMF0gPSBYIyNrYTsgXAorICAgICAgICBvdXRwdXRbMTFdID0gWCMja2U7IFwKKyAgICAgICAgb3V0cHV0WzEyXSA9IH5YIyNraTsgXAorICAgICAgICBvdXRwdXRbMTNdID0gWCMja287IFwKKyAgICAgICAgb3V0cHV0WzE0XSA9IFgjI2t1OyBcCisgICAgICAgIG91dHB1dFsxNV0gPSBYIyNtYTsgXAorICAgICAgICBpZiAobGFuZUNvdW50IDwgMjQpIHsgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIwKSB7IFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTgpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDE3KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxNl0gPSBYIyNtZTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTZdID0gWCMjbWU7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzE3XSA9IH5YIyNtaTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDE5KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxOF0gPSBYIyNtbzsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbMTZdID0gWCMjbWU7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbMTddID0gflgjI21pOyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WzE4XSA9IFgjI21vOyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WzE5XSA9IFgjI211OyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIyKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAyMSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMjBdID0gflgjI3NhOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsyMF0gPSB+WCMjc2E7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzIxXSA9IFgjI3NlOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMjMpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzIyXSA9IFgjI3NpOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgb3V0cHV0WzE2XSA9IFgjI21lOyBcCisgICAgICAgICAgICBvdXRwdXRbMTddID0gflgjI21pOyBcCisgICAgICAgICAgICBvdXRwdXRbMThdID0gWCMjbW87IFwKKyAgICAgICAgICAgIG91dHB1dFsxOV0gPSBYIyNtdTsgXAorICAgICAgICAgICAgb3V0cHV0WzIwXSA9IH5YIyNzYTsgXAorICAgICAgICAgICAgb3V0cHV0WzIxXSA9IFgjI3NlOyBcCisgICAgICAgICAgICBvdXRwdXRbMjJdID0gWCMjc2k7IFwKKyAgICAgICAgICAgIG91dHB1dFsyM10gPSBYIyNzbzsgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAyNSkgeyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WzI0XSA9IFgjI3N1OyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZGVmaW5lIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgaW5kZXgsIG5hbWUpIFwKKyAgICBYIyNuYW1lIF49IGlucHV0W2luZGV4XTsgXAorICAgIG91dHB1dFtpbmRleF0gPSBYIyNuYW1lOworCisjZGVmaW5lIHdyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgaW5kZXgsIG5hbWUpIFwKKyAgICBYIyNuYW1lIF49IGlucHV0W2luZGV4XTsgXAorICAgIG91dHB1dFtpbmRleF0gPSB+WCMjbmFtZTsKKworI2RlZmluZSB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgaW5kZXgsIG5hbWUpIFwKKyAgICBvdXRwdXRbaW5kZXhdID0gaW5wdXRbaW5kZXhdIF4gWCMjbmFtZTsgXAorICAgIFgjI25hbWUgXj0gb3V0cHV0W2luZGV4XTsKKworI2RlZmluZSB1bndyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgaW5kZXgsIG5hbWUpIFwKKyAgICBvdXRwdXRbaW5kZXhdID0gfihpbnB1dFtpbmRleF0gXiBYIyNuYW1lKTsgXAorICAgIFgjI25hbWUgXj0gb3V0cHV0W2luZGV4XTsgXAorCisjZWxzZSAvKiBVc2VCZWJpZ29raW1pc2EgKi8KKworCisjZGVmaW5lIGNvcHlUb1N0YXRlQW5kT3V0cHV0KFgsIHN0YXRlLCBvdXRwdXQsIGxhbmVDb3VudCkgXAorICAgIGlmIChsYW5lQ291bnQgPCAxNikgeyBcCisgICAgICAgIGlmIChsYW5lQ291bnQgPCA4KSB7IFwKKyAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCA0KSB7IFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMikgeyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyAwXSA9IFgjI2JhOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyAxXSA9IFgjI2JlOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyAyXSA9IFgjI2JpOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyAwXSA9IFgjI2JhOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyAxXSA9IFgjI2JlOyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgMV0gPSBYIyNiZTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsgMl0gPSBYIyNiaTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDMpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyAyXSA9IFgjI2JpOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIHN0YXRlWyAzXSA9IFgjI2JvOyBcCisgICAgICAgICAgICAgICAgc3RhdGVbIDRdID0gWCMjYnU7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsgNV0gPSBYIyNnYTsgXAorICAgICAgICAgICAgICAgIHN0YXRlWyA2XSA9IFgjI2dlOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgc3RhdGVbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsgMV0gPSBYIyNiZTsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsgMV0gPSBYIyNiZTsgXAorICAgICAgICAgICAgICAgIHN0YXRlWyAyXSA9IFgjI2JpOyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WyAyXSA9IFgjI2JpOyBcCisgICAgICAgICAgICAgICAgc3RhdGVbIDNdID0gWCMjYm87IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbIDNdID0gWCMjYm87IFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgNikgeyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyA0XSA9IFgjI2J1OyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gNSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDRdID0gWCMjYnU7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyA1XSA9IFgjI2dhOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyA2XSA9IFgjI2dlOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbIDRdID0gWCMjYnU7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyA0XSA9IFgjI2J1OyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyA1XSA9IFgjI2dhOyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgNV0gPSBYIyNnYTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsgNl0gPSBYIyNnZTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDcpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyA2XSA9IFgjI2dlOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBzdGF0ZVsgN10gPSBYIyNnaTsgXAorICAgICAgICAgICAgc3RhdGVbIDhdID0gWCMjZ287IFwKKyAgICAgICAgICAgIHN0YXRlWyA5XSA9IFgjI2d1OyBcCisgICAgICAgICAgICBzdGF0ZVsxMF0gPSBYIyNrYTsgXAorICAgICAgICAgICAgc3RhdGVbMTFdID0gWCMja2U7IFwKKyAgICAgICAgICAgIHN0YXRlWzEyXSA9IFgjI2tpOyBcCisgICAgICAgICAgICBzdGF0ZVsxM10gPSBYIyNrbzsgXAorICAgICAgICAgICAgc3RhdGVbMTRdID0gWCMja3U7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICBzdGF0ZVsgMF0gPSBYIyNiYTsgXAorICAgICAgICAgICAgb3V0cHV0WyAwXSA9IFgjI2JhOyBcCisgICAgICAgICAgICBzdGF0ZVsgMV0gPSBYIyNiZTsgXAorICAgICAgICAgICAgb3V0cHV0WyAxXSA9IFgjI2JlOyBcCisgICAgICAgICAgICBzdGF0ZVsgMl0gPSBYIyNiaTsgXAorICAgICAgICAgICAgb3V0cHV0WyAyXSA9IFgjI2JpOyBcCisgICAgICAgICAgICBzdGF0ZVsgM10gPSBYIyNibzsgXAorICAgICAgICAgICAgb3V0cHV0WyAzXSA9IFgjI2JvOyBcCisgICAgICAgICAgICBzdGF0ZVsgNF0gPSBYIyNidTsgXAorICAgICAgICAgICAgb3V0cHV0WyA0XSA9IFgjI2J1OyBcCisgICAgICAgICAgICBzdGF0ZVsgNV0gPSBYIyNnYTsgXAorICAgICAgICAgICAgb3V0cHV0WyA1XSA9IFgjI2dhOyBcCisgICAgICAgICAgICBzdGF0ZVsgNl0gPSBYIyNnZTsgXAorICAgICAgICAgICAgb3V0cHV0WyA2XSA9IFgjI2dlOyBcCisgICAgICAgICAgICBzdGF0ZVsgN10gPSBYIyNnaTsgXAorICAgICAgICAgICAgb3V0cHV0WyA3XSA9IFgjI2dpOyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTIpIHsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxMCkgeyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyA4XSA9IFgjI2dvOyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gOSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDhdID0gWCMjZ287IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyA5XSA9IFgjI2d1OyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzEwXSA9IFgjI2thOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbIDhdID0gWCMjZ287IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyA4XSA9IFgjI2dvOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWyA5XSA9IFgjI2d1OyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgOV0gPSBYIyNndTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsxMF0gPSBYIyNrYTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDExKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxMF0gPSBYIyNrYTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsxMV0gPSBYIyNrZTsgXAorICAgICAgICAgICAgICAgIHN0YXRlWzEyXSA9IFgjI2tpOyBcCisgICAgICAgICAgICAgICAgc3RhdGVbMTNdID0gWCMja287IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsxNF0gPSBYIyNrdTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgIHN0YXRlWyA4XSA9IFgjI2dvOyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WyA4XSA9IFgjI2dvOyBcCisgICAgICAgICAgICAgICAgc3RhdGVbIDldID0gWCMjZ3U7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbIDldID0gWCMjZ3U7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsxMF0gPSBYIyNrYTsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsxMF0gPSBYIyNrYTsgXAorICAgICAgICAgICAgICAgIHN0YXRlWzExXSA9IFgjI2tlOyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WzExXSA9IFgjI2tlOyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDE0KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMTJdID0gWCMja2k7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAxMykgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTJdPSBYIyNraTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMTNdID0gWCMja287IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMTRdID0gWCMja3U7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsxMl0gPSBYIyNraTsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTJdPSBYIyNraTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsxM10gPSBYIyNrbzsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTNdID0gWCMja287IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMTRdID0gWCMja3U7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAxNSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTRdID0gWCMja3U7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgICAgIHN0YXRlWzE1XSA9IFgjI21hOyBcCisgICAgICAgIHN0YXRlWzE2XSA9IFgjI21lOyBcCisgICAgICAgIHN0YXRlWzE3XSA9IFgjI21pOyBcCisgICAgICAgIHN0YXRlWzE4XSA9IFgjI21vOyBcCisgICAgICAgIHN0YXRlWzE5XSA9IFgjI211OyBcCisgICAgICAgIHN0YXRlWzIwXSA9IFgjI3NhOyBcCisgICAgICAgIHN0YXRlWzIxXSA9IFgjI3NlOyBcCisgICAgICAgIHN0YXRlWzIyXSA9IFgjI3NpOyBcCisgICAgICAgIHN0YXRlWzIzXSA9IFgjI3NvOyBcCisgICAgICAgIHN0YXRlWzI0XSA9IFgjI3N1OyBcCisgICAgfSBcCisgICAgZWxzZSB7IFwKKyAgICAgICAgc3RhdGVbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgb3V0cHV0WyAwXSA9IFgjI2JhOyBcCisgICAgICAgIHN0YXRlWyAxXSA9IFgjI2JlOyBcCisgICAgICAgIG91dHB1dFsgMV0gPSBYIyNiZTsgXAorICAgICAgICBzdGF0ZVsgMl0gPSBYIyNiaTsgXAorICAgICAgICBvdXRwdXRbIDJdID0gWCMjYmk7IFwKKyAgICAgICAgc3RhdGVbIDNdID0gWCMjYm87IFwKKyAgICAgICAgb3V0cHV0WyAzXSA9IFgjI2JvOyBcCisgICAgICAgIHN0YXRlWyA0XSA9IFgjI2J1OyBcCisgICAgICAgIG91dHB1dFsgNF0gPSBYIyNidTsgXAorICAgICAgICBzdGF0ZVsgNV0gPSBYIyNnYTsgXAorICAgICAgICBvdXRwdXRbIDVdID0gWCMjZ2E7IFwKKyAgICAgICAgc3RhdGVbIDZdID0gWCMjZ2U7IFwKKyAgICAgICAgb3V0cHV0WyA2XSA9IFgjI2dlOyBcCisgICAgICAgIHN0YXRlWyA3XSA9IFgjI2dpOyBcCisgICAgICAgIG91dHB1dFsgN10gPSBYIyNnaTsgXAorICAgICAgICBzdGF0ZVsgOF0gPSBYIyNnbzsgXAorICAgICAgICBvdXRwdXRbIDhdID0gWCMjZ287IFwKKyAgICAgICAgc3RhdGVbIDldID0gWCMjZ3U7IFwKKyAgICAgICAgb3V0cHV0WyA5XSA9IFgjI2d1OyBcCisgICAgICAgIHN0YXRlWzEwXSA9IFgjI2thOyBcCisgICAgICAgIG91dHB1dFsxMF0gPSBYIyNrYTsgXAorICAgICAgICBzdGF0ZVsxMV0gPSBYIyNrZTsgXAorICAgICAgICBvdXRwdXRbMTFdID0gWCMja2U7IFwKKyAgICAgICAgc3RhdGVbMTJdID0gWCMja2k7IFwKKyAgICAgICAgb3V0cHV0WzEyXT0gWCMja2k7IFwKKyAgICAgICAgc3RhdGVbMTNdID0gWCMja287IFwKKyAgICAgICAgb3V0cHV0WzEzXSA9IFgjI2tvOyBcCisgICAgICAgIHN0YXRlWzE0XSA9IFgjI2t1OyBcCisgICAgICAgIG91dHB1dFsxNF0gPSBYIyNrdTsgXAorICAgICAgICBzdGF0ZVsxNV0gPSBYIyNtYTsgXAorICAgICAgICBvdXRwdXRbMTVdID0gWCMjbWE7IFwKKyAgICAgICAgaWYgKGxhbmVDb3VudCA8IDI0KSB7IFwKKyAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyMCkgeyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDE4KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMTZdID0gWCMjbWU7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAxNykgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTZdID0gWCMjbWU7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzE3XSA9IFgjI21pOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzE4XSA9IFgjI21vOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMTZdID0gWCMjbWU7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzE2XSA9IFgjI21lOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzE3XSA9IFgjI21pOyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxN10gPSBYIyNtaTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsxOF0gPSBYIyNtbzsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDE5KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxOF0gPSBYIyNtbzsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsxOV0gPSBYIyNtdTsgXAorICAgICAgICAgICAgICAgIHN0YXRlWzIwXSA9IFgjI3NhOyBcCisgICAgICAgICAgICAgICAgc3RhdGVbMjFdID0gWCMjc2U7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsyMl0gPSBYIyNzaTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgIHN0YXRlWzE2XSA9IFgjI21lOyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WzE2XSA9IFgjI21lOyBcCisgICAgICAgICAgICAgICAgc3RhdGVbMTddID0gWCMjbWk7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbMTddID0gWCMjbWk7IFwKKyAgICAgICAgICAgICAgICBzdGF0ZVsxOF0gPSBYIyNtbzsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsxOF0gPSBYIyNtbzsgXAorICAgICAgICAgICAgICAgIHN0YXRlWzE5XSA9IFgjI211OyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WzE5XSA9IFgjI211OyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIyKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMjBdID0gWCMjc2E7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAyMSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMjBdID0gWCMjc2E7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzIxXSA9IFgjI3NlOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzIyXSA9IFgjI3NpOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVbMjBdID0gWCMjc2E7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzIwXSA9IFgjI3NhOyBcCisgICAgICAgICAgICAgICAgICAgIHN0YXRlWzIxXSA9IFgjI3NlOyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsyMV0gPSBYIyNzZTsgXAorICAgICAgICAgICAgICAgICAgICBzdGF0ZVsyMl0gPSBYIyNzaTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDIzKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsyMl0gPSBYIyNzaTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgc3RhdGVbMjNdID0gWCMjc287IFwKKyAgICAgICAgICAgIHN0YXRlWzI0XSA9IFgjI3N1OyBcCisgICAgICAgIH0gXAorICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgc3RhdGVbMTZdID0gWCMjbWU7IFwKKyAgICAgICAgICAgIG91dHB1dFsxNl0gPSBYIyNtZTsgXAorICAgICAgICAgICAgc3RhdGVbMTddID0gWCMjbWk7IFwKKyAgICAgICAgICAgIG91dHB1dFsxN10gPSBYIyNtaTsgXAorICAgICAgICAgICAgc3RhdGVbMThdID0gWCMjbW87IFwKKyAgICAgICAgICAgIG91dHB1dFsxOF0gPSBYIyNtbzsgXAorICAgICAgICAgICAgc3RhdGVbMTldID0gWCMjbXU7IFwKKyAgICAgICAgICAgIG91dHB1dFsxOV0gPSBYIyNtdTsgXAorICAgICAgICAgICAgc3RhdGVbMjBdID0gWCMjc2E7IFwKKyAgICAgICAgICAgIG91dHB1dFsyMF0gPSBYIyNzYTsgXAorICAgICAgICAgICAgc3RhdGVbMjFdID0gWCMjc2U7IFwKKyAgICAgICAgICAgIG91dHB1dFsyMV0gPSBYIyNzZTsgXAorICAgICAgICAgICAgc3RhdGVbMjJdID0gWCMjc2k7IFwKKyAgICAgICAgICAgIG91dHB1dFsyMl0gPSBYIyNzaTsgXAorICAgICAgICAgICAgc3RhdGVbMjNdID0gWCMjc287IFwKKyAgICAgICAgICAgIG91dHB1dFsyM10gPSBYIyNzbzsgXAorICAgICAgICAgICAgc3RhdGVbMjRdID0gWCMjc3U7IFwKKyAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMjUpIHsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsyNF0gPSBYIyNzdTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBvdXRwdXQoWCwgb3V0cHV0LCBsYW5lQ291bnQpIFwKKyAgICBpZiAobGFuZUNvdW50IDwgMTYpIHsgXAorICAgICAgICBpZiAobGFuZUNvdW50IDwgOCkgeyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgNCkgeyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDEpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyAwXSA9IFgjI2JhOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgMF0gPSBYIyNiYTsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDFdID0gWCMjYmU7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAzKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgMl0gPSBYIyNiaTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbIDBdID0gWCMjYmE7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbIDFdID0gWCMjYmU7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbIDJdID0gWCMjYmk7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbIDNdID0gWCMjYm87IFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgNikgeyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gNSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDRdID0gWCMjYnU7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyA0XSA9IFgjI2J1OyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgNV0gPSBYIyNnYTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDcpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyA2XSA9IFgjI2dlOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgb3V0cHV0WyAwXSA9IFgjI2JhOyBcCisgICAgICAgICAgICBvdXRwdXRbIDFdID0gWCMjYmU7IFwKKyAgICAgICAgICAgIG91dHB1dFsgMl0gPSBYIyNiaTsgXAorICAgICAgICAgICAgb3V0cHV0WyAzXSA9IFgjI2JvOyBcCisgICAgICAgICAgICBvdXRwdXRbIDRdID0gWCMjYnU7IFwKKyAgICAgICAgICAgIG91dHB1dFsgNV0gPSBYIyNnYTsgXAorICAgICAgICAgICAgb3V0cHV0WyA2XSA9IFgjI2dlOyBcCisgICAgICAgICAgICBvdXRwdXRbIDddID0gWCMjZ2k7IFwKKyAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxMikgeyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDEwKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSA5KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsgOF0gPSBYIyNnbzsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIDhdID0gWCMjZ287IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WyA5XSA9IFgjI2d1OyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMTEpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzEwXSA9IFgjI2thOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsgOF0gPSBYIyNnbzsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsgOV0gPSBYIyNndTsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsxMF0gPSBYIyNrYTsgXAorICAgICAgICAgICAgICAgIG91dHB1dFsxMV0gPSBYIyNrZTsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxNCkgeyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMTMpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzEyXSA9IFgjI2tpOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxMl0gPSBYIyNraTsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTNdID0gWCMja287IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAxNSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTRdID0gWCMja3U7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgZWxzZSB7IFwKKyAgICAgICAgb3V0cHV0WyAwXSA9IFgjI2JhOyBcCisgICAgICAgIG91dHB1dFsgMV0gPSBYIyNiZTsgXAorICAgICAgICBvdXRwdXRbIDJdID0gWCMjYmk7IFwKKyAgICAgICAgb3V0cHV0WyAzXSA9IFgjI2JvOyBcCisgICAgICAgIG91dHB1dFsgNF0gPSBYIyNidTsgXAorICAgICAgICBvdXRwdXRbIDVdID0gWCMjZ2E7IFwKKyAgICAgICAgb3V0cHV0WyA2XSA9IFgjI2dlOyBcCisgICAgICAgIG91dHB1dFsgN10gPSBYIyNnaTsgXAorICAgICAgICBvdXRwdXRbIDhdID0gWCMjZ287IFwKKyAgICAgICAgb3V0cHV0WyA5XSA9IFgjI2d1OyBcCisgICAgICAgIG91dHB1dFsxMF0gPSBYIyNrYTsgXAorICAgICAgICBvdXRwdXRbMTFdID0gWCMja2U7IFwKKyAgICAgICAgb3V0cHV0WzEyXSA9IFgjI2tpOyBcCisgICAgICAgIG91dHB1dFsxM10gPSBYIyNrbzsgXAorICAgICAgICBvdXRwdXRbMTRdID0gWCMja3U7IFwKKyAgICAgICAgb3V0cHV0WzE1XSA9IFgjI21hOyBcCisgICAgICAgIGlmIChsYW5lQ291bnQgPCAyNCkgeyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMjApIHsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxOCkgeyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPj0gMTcpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzE2XSA9IFgjI21lOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxNl0gPSBYIyNtZTsgXAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMTddID0gWCMjbWk7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAxOSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMThdID0gWCMjbW87IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WzE2XSA9IFgjI21lOyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WzE3XSA9IFgjI21pOyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WzE4XSA9IFgjI21vOyBcCisgICAgICAgICAgICAgICAgb3V0cHV0WzE5XSA9IFgjI211OyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIyKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+PSAyMSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbMjBdID0gWCMjc2E7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzIwXSA9IFgjI3NhOyBcCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFsyMV0gPSBYIyNzZTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDIzKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsyMl0gPSBYIyNzaTsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgIG91dHB1dFsxNl0gPSBYIyNtZTsgXAorICAgICAgICAgICAgb3V0cHV0WzE3XSA9IFgjI21pOyBcCisgICAgICAgICAgICBvdXRwdXRbMThdID0gWCMjbW87IFwKKyAgICAgICAgICAgIG91dHB1dFsxOV0gPSBYIyNtdTsgXAorICAgICAgICAgICAgb3V0cHV0WzIwXSA9IFgjI3NhOyBcCisgICAgICAgICAgICBvdXRwdXRbMjFdID0gWCMjc2U7IFwKKyAgICAgICAgICAgIG91dHB1dFsyMl0gPSBYIyNzaTsgXAorICAgICAgICAgICAgb3V0cHV0WzIzXSA9IFgjI3NvOyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50ID49IDI1KSB7IFwKKyAgICAgICAgICAgICAgICBvdXRwdXRbMjRdID0gWCMjc3U7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCBpbmRleCwgbmFtZSkgXAorICAgIFgjI25hbWUgXj0gaW5wdXRbaW5kZXhdOyBcCisgICAgb3V0cHV0W2luZGV4XSA9IFgjI25hbWU7CisKKyNkZWZpbmUgd3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCBpbmRleCwgbmFtZSkgXAorICAgIFgjI25hbWUgXj0gaW5wdXRbaW5kZXhdOyBcCisgICAgb3V0cHV0W2luZGV4XSA9IFgjI25hbWU7CisKKyNkZWZpbmUgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIGluZGV4LCBuYW1lKSBcCisgICAgb3V0cHV0W2luZGV4XSA9IGlucHV0W2luZGV4XSBeIFgjI25hbWU7IFwKKyAgICBYIyNuYW1lIF49IG91dHB1dFtpbmRleF07CisKKyNkZWZpbmUgdW53cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIGluZGV4LCBuYW1lKSBcCisgICAgb3V0cHV0W2luZGV4XSA9IGlucHV0W2luZGV4XSBeIFgjI25hbWU7IFwKKyAgICBYIyNuYW1lIF49IG91dHB1dFtpbmRleF07CisKKyNlbmRpZgorCisjZGVmaW5lIHdyYXAoWCwgaW5wdXQsIG91dHB1dCwgbGFuZUNvdW50LCB0cmFpbGluZ0JpdHMpIFwKKyAgICBpZiAobGFuZUNvdW50IDwgMTYpIHsgXAorICAgICAgICBpZiAobGFuZUNvdW50IDwgOCkgeyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgNCkgeyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNiYSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDAsIGJhKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNiZSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAwLCBiYSkgXAorICAgICAgICAgICAgICAgICAgICB3cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDEsIGJlKSBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAzKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2JpIF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMiwgYmkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2JvIF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDAsIGJhKSBcCisgICAgICAgICAgICAgICAgd3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCAxLCBiZSkgXAorICAgICAgICAgICAgICAgIHdyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMiwgYmkpIFwKKyAgICAgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDMsIGJvKSBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDYpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgNSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNidSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDQsIGJ1KSBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNnYSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCA0LCBidSkgXAorICAgICAgICAgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDUsIGdhKSBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCA3KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2dlIF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgNiwgZ2UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2dpIF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMCwgYmEpIFwKKyAgICAgICAgICAgIHdyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMSwgYmUpIFwKKyAgICAgICAgICAgIHdyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMiwgYmkpIFwKKyAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMywgYm8pIFwKKyAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgNCwgYnUpIFwKKyAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgNSwgZ2EpIFwKKyAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgNiwgZ2UpIFwKKyAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgNywgZ2kpIFwKKyAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxMikgeyBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDEwKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjZ28gXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCA4LCBnbykgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjZ3UgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIHdyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgOCwgZ28pIFwKKyAgICAgICAgICAgICAgICAgICAgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCA5LCBndSkgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTEpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMja2EgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAxMCwga2EpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2tlIF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICB3cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDgsIGdvKSBcCisgICAgICAgICAgICAgICAgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCA5LCBndSkgXAorICAgICAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTAsIGthKSBcCisgICAgICAgICAgICAgICAgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAxMSwga2UpIFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTQpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTMpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMja2kgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCAxMiwga2kpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2tvIF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICB3cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDEyLCBraSkgXAorICAgICAgICAgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDEzLCBrbykgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTUpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMja3UgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAxNCwga3UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI21hIF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9IFwKKyAgICBlbHNlIHsgXAorICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDAsIGJhKSBcCisgICAgICAgIHdyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMSwgYmUpIFwKKyAgICAgICAgd3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCAyLCBiaSkgXAorICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDMsIGJvKSBcCisgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgNCwgYnUpIFwKKyAgICAgICAgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCA1LCBnYSkgXAorICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDYsIGdlKSBcCisgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgNywgZ2kpIFwKKyAgICAgICAgd3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCA4LCBnbykgXAorICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDksIGd1KSBcCisgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTAsIGthKSBcCisgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTEsIGtlKSBcCisgICAgICAgIHdyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMTIsIGtpKSBcCisgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTMsIGtvKSBcCisgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTQsIGt1KSBcCisgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTUsIG1hKSBcCisgICAgICAgIGlmIChsYW5lQ291bnQgPCAyNCkgeyBcCisgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMjApIHsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxOCkgeyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxNykgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNtZSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE2LCBtZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjbWkgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTYsIG1lKSBcCisgICAgICAgICAgICAgICAgICAgIHdyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMTcsIG1pKSBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxOSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNtbyBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE4LCBtbykgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjbXUgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTYsIG1lKSBcCisgICAgICAgICAgICAgICAgd3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCAxNywgbWkpIFwKKyAgICAgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE4LCBtbykgXAorICAgICAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTksIG11KSBcCisgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIyKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIxKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI3NhIF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMjAsIHNhKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNzZSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgd3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCAyMCwgc2EpIFwKKyAgICAgICAgICAgICAgICAgICAgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAyMSwgc2UpIFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIzKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI3NpIF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMjIsIHNpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNzbyBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE2LCBtZSkgXAorICAgICAgICAgICAgd3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCAxNywgbWkpIFwKKyAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTgsIG1vKSBcCisgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE5LCBtdSkgXAorICAgICAgICAgICAgd3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCAyMCwgc2EpIFwKKyAgICAgICAgICAgIHdyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMjEsIHNlKSBcCisgICAgICAgICAgICB3cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDIyLCBzaSkgXAorICAgICAgICAgICAgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAyMywgc28pIFwKKyAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyNSkgeyBcCisgICAgICAgICAgICAgICAgWCMjc3UgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgd3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAyNCwgc3UpIFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgdW53cmFwKFgsIGlucHV0LCBvdXRwdXQsIGxhbmVDb3VudCwgdHJhaWxpbmdCaXRzKSBcCisgICAgaWYgKGxhbmVDb3VudCA8IDE2KSB7IFwKKyAgICAgICAgaWYgKGxhbmVDb3VudCA8IDgpIHsgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDQpIHsgXAorICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAyKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDEpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjYmEgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDAsIGJhKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNiZSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDAsIGJhKSBcCisgICAgICAgICAgICAgICAgICAgIHVud3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCAxLCBiZSkgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMykgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNiaSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bndyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMiwgYmkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2JvIF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMCwgYmEpIFwKKyAgICAgICAgICAgICAgICB1bndyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMSwgYmUpIFwKKyAgICAgICAgICAgICAgICB1bndyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMiwgYmkpIFwKKyAgICAgICAgICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMywgYm8pIFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgNikgeyBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCA1KSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2J1IF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCA0LCBidSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjZ2EgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCA0LCBidSkgXAorICAgICAgICAgICAgICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgNSwgZ2EpIFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDcpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjZ2UgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDYsIGdlKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNnaSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMCwgYmEpIFwKKyAgICAgICAgICAgIHVud3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCAxLCBiZSkgXAorICAgICAgICAgICAgdW53cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDIsIGJpKSBcCisgICAgICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMywgYm8pIFwKKyAgICAgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCA0LCBidSkgXAorICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDUsIGdhKSBcCisgICAgICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgNiwgZ2UpIFwKKyAgICAgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCA3LCBnaSkgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDEyKSB7IFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTApIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgOSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNnbyBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bndyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgOCwgZ28pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFgjI2d1IF49IHRyYWlsaW5nQml0czsgXAorICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICB1bndyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgOCwgZ28pIFwKKyAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDksIGd1KSBcCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPCAxMSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNrYSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTAsIGthKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBYIyNrZSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgdW53cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDgsIGdvKSBcCisgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDksIGd1KSBcCisgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDEwLCBrYSkgXAorICAgICAgICAgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAxMSwga2UpIFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTQpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTMpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMja2kgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDEyLCBraSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMja28gXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIHVud3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCAxMiwga2kpIFwKKyAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDEzLCBrbykgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTUpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMja3UgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE0LCBrdSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjbWEgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gXAorICAgIGVsc2UgeyBcCisgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAwLCBiYSkgXAorICAgICAgICB1bndyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMSwgYmUpIFwKKyAgICAgICAgdW53cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDIsIGJpKSBcCisgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAzLCBibykgXAorICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgNCwgYnUpIFwKKyAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDUsIGdhKSBcCisgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCA2LCBnZSkgXAorICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgNywgZ2kpIFwKKyAgICAgICAgdW53cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDgsIGdvKSBcCisgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCA5LCBndSkgXAorICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTAsIGthKSBcCisgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAxMSwga2UpIFwKKyAgICAgICAgdW53cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDEyLCBraSkgXAorICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMTMsIGtvKSBcCisgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAxNCwga3UpIFwKKyAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE1LCBtYSkgXAorICAgICAgICBpZiAobGFuZUNvdW50IDwgMjQpIHsgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDIwKSB7IFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTgpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTcpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjbWUgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE2LCBtZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjbWkgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAxNiwgbWUpIFwKKyAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDE3LCBtaSkgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMTkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjbW8gXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE4LCBtbykgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjbXUgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAxNiwgbWUpIFwKKyAgICAgICAgICAgICAgICB1bndyYXBPbmVJbnZlcnQoWCwgaW5wdXQsIG91dHB1dCwgMTcsIG1pKSBcCisgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE4LCBtbykgXAorICAgICAgICAgICAgICAgIHVud3JhcE9uZShYLCBpbnB1dCwgb3V0cHV0LCAxOSwgbXUpIFwKKyAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMjIpIHsgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMjEpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjc2EgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDIwLCBzYSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjc2UgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgIHVud3JhcE9uZUludmVydChYLCBpbnB1dCwgb3V0cHV0LCAyMCwgc2EpIFwKKyAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDIxLCBzZSkgXAorICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50IDwgMjMpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjc2kgXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDIyLCBzaSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgWCMjc28gXj0gdHJhaWxpbmdCaXRzOyBcCisgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE2LCBtZSkgXAorICAgICAgICAgICAgdW53cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDE3LCBtaSkgXAorICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE4LCBtbykgXAorICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDE5LCBtdSkgXAorICAgICAgICAgICAgdW53cmFwT25lSW52ZXJ0KFgsIGlucHV0LCBvdXRwdXQsIDIwLCBzYSkgXAorICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDIxLCBzZSkgXAorICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDIyLCBzaSkgXAorICAgICAgICAgICAgdW53cmFwT25lKFgsIGlucHV0LCBvdXRwdXQsIDIzLCBzbykgXAorICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA8IDI1KSB7IFwKKyAgICAgICAgICAgICAgICBYIyNzdSBePSB0cmFpbGluZ0JpdHM7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICB1bndyYXBPbmUoWCwgaW5wdXQsIG91dHB1dCwgMjQsIHN1KSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrUC0xNjAwLVNuUC1vcHQzMi5oIGIvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrUC0xNjAwLVNuUC1vcHQzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZjc2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtQLTE2MDAtU25QLW9wdDMyLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKK0ltcGxlbWVudGF0aW9uIGJ5IHRoZSBLZWNjYWssIEtleWFrIGFuZCBLZXRqZSBUZWFtcywgbmFtZWx5LCBHdWlkbyBCZXJ0b25pLAorSm9hbiBEYWVtZW4sIE1pY2hhw6tsIFBlZXRlcnMsIEdpbGxlcyBWYW4gQXNzY2hlIGFuZCBSb25ueSBWYW4gS2VlciwgaGVyZWJ5CitkZW5vdGVkIGFzICJ0aGUgaW1wbGVtZW50ZXIiLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZmVlZGJhY2sgb3IgcXVlc3Rpb25zLCBwbGVhc2UgcmVmZXIgdG8gb3VyIHdlYnNpdGVzOgoraHR0cDovL2tlY2Nhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXlhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXRqZS5ub2VrZW9uLm9yZy8KKworVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBpbXBsZW1lbnRlciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQKK2FuZCByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGUgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlLgoraHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworKi8KKworI2lmbmRlZiBfS2VjY2FrUF8xNjAwX1NuUF9oXworI2RlZmluZSBfS2VjY2FrUF8xNjAwX1NuUF9oXworCisvKiogRm9yIHRoZSBkb2N1bWVudGF0aW9uLCBzZWUgU25QLWRvY3VtZW50YXRpb24uaC4KKyAqLworCisjZGVmaW5lIEtlY2Nha1AxNjAwX2ltcGxlbWVudGF0aW9uICAgICAgImluLXBsYWNlIDMyLWJpdCBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24iCisjZGVmaW5lIEtlY2Nha1AxNjAwX3N0YXRlU2l6ZUluQnl0ZXMgICAgMjAwCisjZGVmaW5lIEtlY2Nha1AxNjAwX3N0YXRlQWxpZ25tZW50ICAgICAgOAorCisjZGVmaW5lIEtlY2Nha1AxNjAwX1N0YXRpY0luaXRpYWxpemUoKQordm9pZCBLZWNjYWtQMTYwMF9Jbml0aWFsaXplKHZvaWQgKnN0YXRlKTsKK3ZvaWQgS2VjY2FrUDE2MDBfQWRkQnl0ZSh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKK3ZvaWQgS2VjY2FrUDE2MDBfQWRkQnl0ZXModm9pZCAqc3RhdGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW5ndGgpOwordm9pZCBLZWNjYWtQMTYwMF9PdmVyd3JpdGVCeXRlcyh2b2lkICpzdGF0ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0aCk7Cit2b2lkIEtlY2Nha1AxNjAwX092ZXJ3cml0ZVdpdGhaZXJvZXModm9pZCAqc3RhdGUsIHVuc2lnbmVkIGludCBieXRlQ291bnQpOwordm9pZCBLZWNjYWtQMTYwMF9QZXJtdXRlXzEycm91bmRzKHZvaWQgKnN0YXRlKTsKK3ZvaWQgS2VjY2FrUDE2MDBfUGVybXV0ZV8yNHJvdW5kcyh2b2lkICpzdGF0ZSk7Cit2b2lkIEtlY2Nha1AxNjAwX0V4dHJhY3RCeXRlcyhjb25zdCB2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0aCk7Cit2b2lkIEtlY2Nha1AxNjAwX0V4dHJhY3RBbmRBZGRCeXRlcyhjb25zdCB2b2lkICpzdGF0ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0aCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrUC0xNjAwLVNuUC1vcHQ2NC5oIGIvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrUC0xNjAwLVNuUC1vcHQ2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWEzMWEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtQLTE2MDAtU25QLW9wdDY0LmgKQEAgLTAsMCArMSw0OSBAQAorLyoKK0ltcGxlbWVudGF0aW9uIGJ5IHRoZSBLZWNjYWssIEtleWFrIGFuZCBLZXRqZSBUZWFtcywgbmFtZWx5LCBHdWlkbyBCZXJ0b25pLAorSm9hbiBEYWVtZW4sIE1pY2hhw6tsIFBlZXRlcnMsIEdpbGxlcyBWYW4gQXNzY2hlIGFuZCBSb25ueSBWYW4gS2VlciwgaGVyZWJ5CitkZW5vdGVkIGFzICJ0aGUgaW1wbGVtZW50ZXIiLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZmVlZGJhY2sgb3IgcXVlc3Rpb25zLCBwbGVhc2UgcmVmZXIgdG8gb3VyIHdlYnNpdGVzOgoraHR0cDovL2tlY2Nhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXlhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXRqZS5ub2VrZW9uLm9yZy8KKworVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBpbXBsZW1lbnRlciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQKK2FuZCByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGUgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlLgoraHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworKi8KKworI2lmbmRlZiBfS2VjY2FrUF8xNjAwX1NuUF9oXworI2RlZmluZSBfS2VjY2FrUF8xNjAwX1NuUF9oXworCisvKiogRm9yIHRoZSBkb2N1bWVudGF0aW9uLCBzZWUgU25QLWRvY3VtZW50YXRpb24uaC4KKyAqLworCisvKiAjaW5jbHVkZSAiYnJnX2VuZGlhbi5oIiAqLworI2luY2x1ZGUgIktlY2Nha1AtMTYwMC1vcHQ2NC1jb25maWcuaCIKKworI2RlZmluZSBLZWNjYWtQMTYwMF9pbXBsZW1lbnRhdGlvbiAgICAgICJnZW5lcmljIDY0LWJpdCBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gKCIgS2VjY2FrUDE2MDBfaW1wbGVtZW50YXRpb25fY29uZmlnICIpIgorI2RlZmluZSBLZWNjYWtQMTYwMF9zdGF0ZVNpemVJbkJ5dGVzICAgIDIwMAorI2RlZmluZSBLZWNjYWtQMTYwMF9zdGF0ZUFsaWdubWVudCAgICAgIDgKKyNkZWZpbmUgS2VjY2FrRjE2MDBfRmFzdExvb3Bfc3VwcG9ydGVkCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSBLZWNjYWtQMTYwMF9TdGF0aWNJbml0aWFsaXplKCkKK3ZvaWQgS2VjY2FrUDE2MDBfSW5pdGlhbGl6ZSh2b2lkICpzdGF0ZSk7CisjaWYgKFBMQVRGT1JNX0JZVEVfT1JERVIgPT0gSVNfTElUVExFX0VORElBTikKKyNkZWZpbmUgS2VjY2FrUDE2MDBfQWRkQnl0ZShzdGF0ZSwgYnl0ZSwgb2Zmc2V0KSBcCisgICAgKCh1bnNpZ25lZCBjaGFyKikoc3RhdGUpKVsob2Zmc2V0KV0gXj0gKGJ5dGUpCisjZWxzZQordm9pZCBLZWNjYWtQMTYwMF9BZGRCeXRlKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyIGRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQpOworI2VuZGlmCit2b2lkIEtlY2Nha1AxNjAwX0FkZEJ5dGVzKHZvaWQgKnN0YXRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKTsKK3ZvaWQgS2VjY2FrUDE2MDBfT3ZlcndyaXRlQnl0ZXModm9pZCAqc3RhdGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW5ndGgpOwordm9pZCBLZWNjYWtQMTYwMF9PdmVyd3JpdGVXaXRoWmVyb2VzKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBpbnQgYnl0ZUNvdW50KTsKK3ZvaWQgS2VjY2FrUDE2MDBfUGVybXV0ZV8xMnJvdW5kcyh2b2lkICpzdGF0ZSk7Cit2b2lkIEtlY2Nha1AxNjAwX1Blcm11dGVfMjRyb3VuZHModm9pZCAqc3RhdGUpOwordm9pZCBLZWNjYWtQMTYwMF9FeHRyYWN0Qnl0ZXMoY29uc3Qgdm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW5ndGgpOwordm9pZCBLZWNjYWtQMTYwMF9FeHRyYWN0QW5kQWRkQnl0ZXMoY29uc3Qgdm9pZCAqc3RhdGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW5ndGgpOworc2l6ZV90IEtlY2Nha0YxNjAwX0Zhc3RMb29wX0Fic29yYih2b2lkICpzdGF0ZSwgdW5zaWduZWQgaW50IGxhbmVDb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGRhdGFCeXRlTGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtQLTE2MDAtU25QLmggYi9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtQLTE2MDAtU25QLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyM2YwOQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha1AtMTYwMC1TblAuaApAQCAtMCwwICsxLDcgQEAKKyNpZiBLZWNjYWtPcHQgPT0gNjQKKyAgI2luY2x1ZGUgIktlY2Nha1AtMTYwMC1TblAtb3B0NjQuaCIKKyNlbGlmIEtlY2Nha09wdCA9PSAzMgorICAjaW5jbHVkZSAiS2VjY2FrUC0xNjAwLVNuUC1vcHQzMi5oIgorI2Vsc2UKKyAgI2Vycm9yICJObyBLZWNjYWtPcHQiCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha1AtMTYwMC1pbnBsYWNlMzJCSS5jIGIvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrUC0xNjAwLWlucGxhY2UzMkJJLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJmOWZmZQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha1AtMTYwMC1pbnBsYWNlMzJCSS5jCkBAIC0wLDAgKzEsMTE2MiBAQAorLyoKK0ltcGxlbWVudGF0aW9uIGJ5IHRoZSBLZWNjYWssIEtleWFrIGFuZCBLZXRqZSBUZWFtcywgbmFtZWx5LCBHdWlkbyBCZXJ0b25pLAorSm9hbiBEYWVtZW4sIE1pY2hhw6tsIFBlZXRlcnMsIEdpbGxlcyBWYW4gQXNzY2hlIGFuZCBSb25ueSBWYW4gS2VlciwgaGVyZWJ5CitkZW5vdGVkIGFzICJ0aGUgaW1wbGVtZW50ZXIiLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZmVlZGJhY2sgb3IgcXVlc3Rpb25zLCBwbGVhc2UgcmVmZXIgdG8gb3VyIHdlYnNpdGVzOgoraHR0cDovL2tlY2Nhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXlhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXRqZS5ub2VrZW9uLm9yZy8KKworVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBpbXBsZW1lbnRlciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQKK2FuZCByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGUgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlLgoraHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworKi8KKworI2luY2x1ZGUgICAgPHN0cmluZy5oPgorLyogI2luY2x1ZGUgImJyZ19lbmRpYW4uaCIgKi8KKyNpbmNsdWRlICJLZWNjYWtQLTE2MDAtU25QLmgiCisjaW5jbHVkZSAiU25QLVJlbGFuZWQuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDMyOworLyogV0FSTklORzogb24gOC1iaXQgYW5kIDE2LWJpdCBwbGF0Zm9ybXMsIHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5OiAqLworCisvKnR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICBVSU5UMzI7ICovCisKKworI2RlZmluZSBST0wzMihhLCBvZmZzZXQpICgoKChVSU5UMzIpYSkgPDwgKG9mZnNldCkpIF4gKCgoVUlOVDMyKWEpID4+ICgzMi0ob2Zmc2V0KSkpKQorCisvKiBDcmVkaXQgdG8gSGVucnkgUy4gV2FycmVuLCBIYWNrZXIncyBEZWxpZ2h0LCBBZGRpc29uLVdlc2xleSwgMjAwMiAqLworCisjZGVmaW5lIHByZXBhcmVUb0JpdEludGVybGVhdmluZyhsb3csIGhpZ2gsIHRlbXAsIHRlbXAwLCB0ZW1wMSkgXAorICAgICAgICB0ZW1wMCA9IChsb3cpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDAgXiAodGVtcDAgPj4gIDEpKSAmIDB4MjIyMjIyMjJVTDsgIHRlbXAwID0gdGVtcDAgXiB0ZW1wIF4gKHRlbXAgPDwgIDEpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDAgXiAodGVtcDAgPj4gIDIpKSAmIDB4MEMwQzBDMENVTDsgIHRlbXAwID0gdGVtcDAgXiB0ZW1wIF4gKHRlbXAgPDwgIDIpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDAgXiAodGVtcDAgPj4gIDQpKSAmIDB4MDBGMDAwRjBVTDsgIHRlbXAwID0gdGVtcDAgXiB0ZW1wIF4gKHRlbXAgPDwgIDQpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDAgXiAodGVtcDAgPj4gIDgpKSAmIDB4MDAwMEZGMDBVTDsgIHRlbXAwID0gdGVtcDAgXiB0ZW1wIF4gKHRlbXAgPDwgIDgpOyBcCisgICAgICAgIHRlbXAxID0gKGhpZ2gpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDEgXiAodGVtcDEgPj4gIDEpKSAmIDB4MjIyMjIyMjJVTDsgIHRlbXAxID0gdGVtcDEgXiB0ZW1wIF4gKHRlbXAgPDwgIDEpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDEgXiAodGVtcDEgPj4gIDIpKSAmIDB4MEMwQzBDMENVTDsgIHRlbXAxID0gdGVtcDEgXiB0ZW1wIF4gKHRlbXAgPDwgIDIpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDEgXiAodGVtcDEgPj4gIDQpKSAmIDB4MDBGMDAwRjBVTDsgIHRlbXAxID0gdGVtcDEgXiB0ZW1wIF4gKHRlbXAgPDwgIDQpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDEgXiAodGVtcDEgPj4gIDgpKSAmIDB4MDAwMEZGMDBVTDsgIHRlbXAxID0gdGVtcDEgXiB0ZW1wIF4gKHRlbXAgPDwgIDgpOworCisjZGVmaW5lIHRvQml0SW50ZXJsZWF2aW5nQW5kWE9SKGxvdywgaGlnaCwgZXZlbiwgb2RkLCB0ZW1wLCB0ZW1wMCwgdGVtcDEpIFwKKyAgICAgICAgcHJlcGFyZVRvQml0SW50ZXJsZWF2aW5nKGxvdywgaGlnaCwgdGVtcCwgdGVtcDAsIHRlbXAxKSBcCisgICAgICAgIGV2ZW4gXj0gKHRlbXAwICYgMHgwMDAwRkZGRikgfCAodGVtcDEgPDwgMTYpOyBcCisgICAgICAgIG9kZCBePSAodGVtcDAgPj4gMTYpIHwgKHRlbXAxICYgMHhGRkZGMDAwMCk7CisKKyNkZWZpbmUgdG9CaXRJbnRlcmxlYXZpbmdBbmRBTkQobG93LCBoaWdoLCBldmVuLCBvZGQsIHRlbXAsIHRlbXAwLCB0ZW1wMSkgXAorICAgICAgICBwcmVwYXJlVG9CaXRJbnRlcmxlYXZpbmcobG93LCBoaWdoLCB0ZW1wLCB0ZW1wMCwgdGVtcDEpIFwKKyAgICAgICAgZXZlbiAmPSAodGVtcDAgJiAweDAwMDBGRkZGKSB8ICh0ZW1wMSA8PCAxNik7IFwKKyAgICAgICAgb2RkICY9ICh0ZW1wMCA+PiAxNikgfCAodGVtcDEgJiAweEZGRkYwMDAwKTsKKworI2RlZmluZSB0b0JpdEludGVybGVhdmluZ0FuZFNldChsb3csIGhpZ2gsIGV2ZW4sIG9kZCwgdGVtcCwgdGVtcDAsIHRlbXAxKSBcCisgICAgICAgIHByZXBhcmVUb0JpdEludGVybGVhdmluZyhsb3csIGhpZ2gsIHRlbXAsIHRlbXAwLCB0ZW1wMSkgXAorICAgICAgICBldmVuID0gKHRlbXAwICYgMHgwMDAwRkZGRikgfCAodGVtcDEgPDwgMTYpOyBcCisgICAgICAgIG9kZCA9ICh0ZW1wMCA+PiAxNikgfCAodGVtcDEgJiAweEZGRkYwMDAwKTsKKworLyogQ3JlZGl0IHRvIEhlbnJ5IFMuIFdhcnJlbiwgSGFja2VyJ3MgRGVsaWdodCwgQWRkaXNvbi1XZXNsZXksIDIwMDIgKi8KKworI2RlZmluZSBwcmVwYXJlRnJvbUJpdEludGVybGVhdmluZyhldmVuLCBvZGQsIHRlbXAsIHRlbXAwLCB0ZW1wMSkgXAorICAgICAgICB0ZW1wMCA9IChldmVuKTsgXAorICAgICAgICB0ZW1wMSA9IChvZGQpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDAgJiAweDAwMDBGRkZGKSB8ICh0ZW1wMSA8PCAxNik7IFwKKyAgICAgICAgdGVtcDEgPSAodGVtcDAgPj4gMTYpIHwgKHRlbXAxICYgMHhGRkZGMDAwMCk7IFwKKyAgICAgICAgdGVtcDAgPSB0ZW1wOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDAgXiAodGVtcDAgPj4gIDgpKSAmIDB4MDAwMEZGMDBVTDsgIHRlbXAwID0gdGVtcDAgXiB0ZW1wIF4gKHRlbXAgPDwgIDgpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDAgXiAodGVtcDAgPj4gIDQpKSAmIDB4MDBGMDAwRjBVTDsgIHRlbXAwID0gdGVtcDAgXiB0ZW1wIF4gKHRlbXAgPDwgIDQpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDAgXiAodGVtcDAgPj4gIDIpKSAmIDB4MEMwQzBDMENVTDsgIHRlbXAwID0gdGVtcDAgXiB0ZW1wIF4gKHRlbXAgPDwgIDIpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDAgXiAodGVtcDAgPj4gIDEpKSAmIDB4MjIyMjIyMjJVTDsgIHRlbXAwID0gdGVtcDAgXiB0ZW1wIF4gKHRlbXAgPDwgIDEpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDEgXiAodGVtcDEgPj4gIDgpKSAmIDB4MDAwMEZGMDBVTDsgIHRlbXAxID0gdGVtcDEgXiB0ZW1wIF4gKHRlbXAgPDwgIDgpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDEgXiAodGVtcDEgPj4gIDQpKSAmIDB4MDBGMDAwRjBVTDsgIHRlbXAxID0gdGVtcDEgXiB0ZW1wIF4gKHRlbXAgPDwgIDQpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDEgXiAodGVtcDEgPj4gIDIpKSAmIDB4MEMwQzBDMENVTDsgIHRlbXAxID0gdGVtcDEgXiB0ZW1wIF4gKHRlbXAgPDwgIDIpOyBcCisgICAgICAgIHRlbXAgPSAodGVtcDEgXiAodGVtcDEgPj4gIDEpKSAmIDB4MjIyMjIyMjJVTDsgIHRlbXAxID0gdGVtcDEgXiB0ZW1wIF4gKHRlbXAgPDwgIDEpOworCisjZGVmaW5lIGZyb21CaXRJbnRlcmxlYXZpbmcoZXZlbiwgb2RkLCBsb3csIGhpZ2gsIHRlbXAsIHRlbXAwLCB0ZW1wMSkgXAorICAgICAgICBwcmVwYXJlRnJvbUJpdEludGVybGVhdmluZyhldmVuLCBvZGQsIHRlbXAsIHRlbXAwLCB0ZW1wMSkgXAorICAgICAgICBsb3cgPSB0ZW1wMDsgXAorICAgICAgICBoaWdoID0gdGVtcDE7CisKKyNkZWZpbmUgZnJvbUJpdEludGVybGVhdmluZ0FuZFhPUihldmVuLCBvZGQsIGxvd0luLCBoaWdoSW4sIGxvd091dCwgaGlnaE91dCwgdGVtcCwgdGVtcDAsIHRlbXAxKSBcCisgICAgICAgIHByZXBhcmVGcm9tQml0SW50ZXJsZWF2aW5nKGV2ZW4sIG9kZCwgdGVtcCwgdGVtcDAsIHRlbXAxKSBcCisgICAgICAgIGxvd091dCA9IGxvd0luIF4gdGVtcDA7IFwKKyAgICAgICAgaGlnaE91dCA9IGhpZ2hJbiBeIHRlbXAxOworCit2b2lkIEtlY2Nha1AxNjAwX1NldEJ5dGVzSW5MYW5lVG9aZXJvKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBpbnQgbGFuZVBvc2l0aW9uLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgIFVJTlQ4IGxhbmVBc0J5dGVzWzhdOworICAgIFVJTlQzMiBsb3csIGhpZ2g7CisgICAgVUlOVDMyIHRlbXAsIHRlbXAwLCB0ZW1wMTsKKyAgICBVSU5UMzIgKnN0YXRlQXNIYWxmTGFuZXMgPSAoVUlOVDMyKilzdGF0ZTsKKworICAgIG1lbXNldChsYW5lQXNCeXRlcywgMHhGRiwgb2Zmc2V0KTsKKyAgICBtZW1zZXQobGFuZUFzQnl0ZXMrb2Zmc2V0LCAweDAwLCBsZW5ndGgpOworICAgIG1lbXNldChsYW5lQXNCeXRlcytvZmZzZXQrbGVuZ3RoLCAweEZGLCA4LW9mZnNldC1sZW5ndGgpOworI2lmIChQTEFURk9STV9CWVRFX09SREVSID09IElTX0xJVFRMRV9FTkRJQU4pCisgICAgbG93ID0gKigoVUlOVDMyKikobGFuZUFzQnl0ZXMrMCkpOworICAgIGhpZ2ggPSAqKChVSU5UMzIqKShsYW5lQXNCeXRlcys0KSk7CisjZWxzZQorICAgIGxvdyA9IGxhbmVBc0J5dGVzWzBdCisgICAgICAgIHwgKChVSU5UMzIpKGxhbmVBc0J5dGVzWzFdKSA8PCA4KQorICAgICAgICB8ICgoVUlOVDMyKShsYW5lQXNCeXRlc1syXSkgPDwgMTYpCisgICAgICAgIHwgKChVSU5UMzIpKGxhbmVBc0J5dGVzWzNdKSA8PCAyNCk7CisgICAgaGlnaCA9IGxhbmVBc0J5dGVzWzRdCisgICAgICAgIHwgKChVSU5UMzIpKGxhbmVBc0J5dGVzWzVdKSA8PCA4KQorICAgICAgICB8ICgoVUlOVDMyKShsYW5lQXNCeXRlc1s2XSkgPDwgMTYpCisgICAgICAgIHwgKChVSU5UMzIpKGxhbmVBc0J5dGVzWzddKSA8PCAyNCk7CisjZW5kaWYKKyAgICB0b0JpdEludGVybGVhdmluZ0FuZEFORChsb3csIGhpZ2gsIHN0YXRlQXNIYWxmTGFuZXNbbGFuZVBvc2l0aW9uKjIrMF0sIHN0YXRlQXNIYWxmTGFuZXNbbGFuZVBvc2l0aW9uKjIrMV0sIHRlbXAsIHRlbXAwLCB0ZW1wMSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBLZWNjYWtQMTYwMF9Jbml0aWFsaXplKHZvaWQgKnN0YXRlKQoreworICAgIG1lbXNldChzdGF0ZSwgMCwgMjAwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0FkZEJ5dGUodm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgYnl0ZSwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbGFuZVBvc2l0aW9uID0gb2Zmc2V0Lzg7CisgICAgdW5zaWduZWQgaW50IG9mZnNldEluTGFuZSA9IG9mZnNldCU4OworICAgIFVJTlQzMiBsb3csIGhpZ2g7CisgICAgVUlOVDMyIHRlbXAsIHRlbXAwLCB0ZW1wMTsKKyAgICBVSU5UMzIgKnN0YXRlQXNIYWxmTGFuZXMgPSAoVUlOVDMyKilzdGF0ZTsKKworICAgIGlmIChvZmZzZXRJbkxhbmUgPCA0KSB7CisgICAgICAgIGxvdyA9IChVSU5UMzIpYnl0ZSA8PCAob2Zmc2V0SW5MYW5lKjgpOworICAgICAgICBoaWdoID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxvdyA9IDA7CisgICAgICAgIGhpZ2ggPSAoVUlOVDMyKWJ5dGUgPDwgKChvZmZzZXRJbkxhbmUtNCkqOCk7CisgICAgfQorICAgIHRvQml0SW50ZXJsZWF2aW5nQW5kWE9SKGxvdywgaGlnaCwgc3RhdGVBc0hhbGZMYW5lc1tsYW5lUG9zaXRpb24qMiswXSwgc3RhdGVBc0hhbGZMYW5lc1tsYW5lUG9zaXRpb24qMisxXSwgdGVtcCwgdGVtcDAsIHRlbXAxKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0FkZEJ5dGVzSW5MYW5lKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBpbnQgbGFuZVBvc2l0aW9uLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgIFVJTlQ4IGxhbmVBc0J5dGVzWzhdOworICAgIFVJTlQzMiBsb3csIGhpZ2g7CisgICAgVUlOVDMyIHRlbXAsIHRlbXAwLCB0ZW1wMTsKKyAgICBVSU5UMzIgKnN0YXRlQXNIYWxmTGFuZXMgPSAoVUlOVDMyKilzdGF0ZTsKKworICAgIG1lbXNldChsYW5lQXNCeXRlcywgMCwgOCk7CisgICAgbWVtY3B5KGxhbmVBc0J5dGVzK29mZnNldCwgZGF0YSwgbGVuZ3RoKTsKKyNpZiAoUExBVEZPUk1fQllURV9PUkRFUiA9PSBJU19MSVRUTEVfRU5ESUFOKQorICAgIGxvdyA9ICooKFVJTlQzMiopKGxhbmVBc0J5dGVzKzApKTsKKyAgICBoaWdoID0gKigoVUlOVDMyKikobGFuZUFzQnl0ZXMrNCkpOworI2Vsc2UKKyAgICBsb3cgPSBsYW5lQXNCeXRlc1swXQorICAgICAgICB8ICgoVUlOVDMyKShsYW5lQXNCeXRlc1sxXSkgPDwgOCkKKyAgICAgICAgfCAoKFVJTlQzMikobGFuZUFzQnl0ZXNbMl0pIDw8IDE2KQorICAgICAgICB8ICgoVUlOVDMyKShsYW5lQXNCeXRlc1szXSkgPDwgMjQpOworICAgIGhpZ2ggPSBsYW5lQXNCeXRlc1s0XQorICAgICAgICB8ICgoVUlOVDMyKShsYW5lQXNCeXRlc1s1XSkgPDwgOCkKKyAgICAgICAgfCAoKFVJTlQzMikobGFuZUFzQnl0ZXNbNl0pIDw8IDE2KQorICAgICAgICB8ICgoVUlOVDMyKShsYW5lQXNCeXRlc1s3XSkgPDwgMjQpOworI2VuZGlmCisgICAgdG9CaXRJbnRlcmxlYXZpbmdBbmRYT1IobG93LCBoaWdoLCBzdGF0ZUFzSGFsZkxhbmVzW2xhbmVQb3NpdGlvbioyKzBdLCBzdGF0ZUFzSGFsZkxhbmVzW2xhbmVQb3NpdGlvbioyKzFdLCB0ZW1wLCB0ZW1wMCwgdGVtcDEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgS2VjY2FrUDE2MDBfQWRkTGFuZXModm9pZCAqc3RhdGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsYW5lQ291bnQpCit7CisjaWYgKFBMQVRGT1JNX0JZVEVfT1JERVIgPT0gSVNfTElUVExFX0VORElBTikKKyAgICBjb25zdCBVSU5UMzIgKiBwSSA9IChjb25zdCBVSU5UMzIgKilkYXRhOworICAgIFVJTlQzMiAqIHBTID0gKFVJTlQzMiopc3RhdGU7CisgICAgVUlOVDMyIHQsIHgwLCB4MTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSBsYW5lQ291bnQtMTsgaSA+PSAwOyAtLWkpIHsKKyNpZmRlZiBOT19NSVNBTElHTkVEX0FDQ0VTU0VTCisgICAgICAgIFVJTlQzMiBsb3c7CisgICAgICAgIFVJTlQzMiBoaWdoOworICAgICAgICBtZW1jcHkoJmxvdywgcEkrKywgNCk7CisgICAgICAgIG1lbWNweSgmaGlnaCwgcEkrKywgNCk7CisgICAgICAgIHRvQml0SW50ZXJsZWF2aW5nQW5kWE9SKGxvdywgaGlnaCwgKihwUysrKSwgKihwUysrKSwgdCwgeDAsIHgxKTsKKyNlbHNlCisgICAgICAgIHRvQml0SW50ZXJsZWF2aW5nQW5kWE9SKCoocEkrKyksICoocEkrKyksICoocFMrKyksICoocFMrKyksIHQsIHgwLCB4MSkKKyNlbmRpZgorICAgIH0KKyNlbHNlCisgICAgdW5zaWduZWQgaW50IGxhbmVQb3NpdGlvbjsKKyAgICBmb3IobGFuZVBvc2l0aW9uPTA7IGxhbmVQb3NpdGlvbjxsYW5lQ291bnQ7IGxhbmVQb3NpdGlvbisrKSB7CisgICAgICAgIFVJTlQ4IGxhbmVBc0J5dGVzWzhdOworICAgICAgICBVSU5UMzIgbG93LCBoaWdoLCB0ZW1wLCB0ZW1wMCwgdGVtcDE7CisgICAgICAgIFVJTlQzMiAqc3RhdGVBc0hhbGZMYW5lczsKKyAgICAgICAgbWVtY3B5KGxhbmVBc0J5dGVzLCBkYXRhK2xhbmVQb3NpdGlvbio4LCA4KTsKKyAgICAgICAgbG93ID0gbGFuZUFzQnl0ZXNbMF0KKyAgICAgICAgICAgIHwgKChVSU5UMzIpKGxhbmVBc0J5dGVzWzFdKSA8PCA4KQorICAgICAgICAgICAgfCAoKFVJTlQzMikobGFuZUFzQnl0ZXNbMl0pIDw8IDE2KQorICAgICAgICAgICAgfCAoKFVJTlQzMikobGFuZUFzQnl0ZXNbM10pIDw8IDI0KTsKKyAgICAgICAgaGlnaCA9IGxhbmVBc0J5dGVzWzRdCisgICAgICAgICAgICB8ICgoVUlOVDMyKShsYW5lQXNCeXRlc1s1XSkgPDwgOCkKKyAgICAgICAgICAgIHwgKChVSU5UMzIpKGxhbmVBc0J5dGVzWzZdKSA8PCAxNikKKyAgICAgICAgICAgIHwgKChVSU5UMzIpKGxhbmVBc0J5dGVzWzddKSA8PCAyNCk7CisgICAgICAgIHN0YXRlQXNIYWxmTGFuZXMgPSAoVUlOVDMyKilzdGF0ZTsKKyAgICAgICAgdG9CaXRJbnRlcmxlYXZpbmdBbmRYT1IobG93LCBoaWdoLCBzdGF0ZUFzSGFsZkxhbmVzW2xhbmVQb3NpdGlvbioyKzBdLCBzdGF0ZUFzSGFsZkxhbmVzW2xhbmVQb3NpdGlvbioyKzFdLCB0ZW1wLCB0ZW1wMCwgdGVtcDEpOworICAgIH0KKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgS2VjY2FrUDE2MDBfQWRkQnl0ZXModm9pZCAqc3RhdGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisgICAgU25QX0FkZEJ5dGVzKHN0YXRlLCBkYXRhLCBvZmZzZXQsIGxlbmd0aCwgS2VjY2FrUDE2MDBfQWRkTGFuZXMsIEtlY2Nha1AxNjAwX0FkZEJ5dGVzSW5MYW5lLCA4KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX092ZXJ3cml0ZUJ5dGVzSW5MYW5lKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBpbnQgbGFuZVBvc2l0aW9uLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgIEtlY2Nha1AxNjAwX1NldEJ5dGVzSW5MYW5lVG9aZXJvKHN0YXRlLCBsYW5lUG9zaXRpb24sIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBLZWNjYWtQMTYwMF9BZGRCeXRlc0luTGFuZShzdGF0ZSwgbGFuZVBvc2l0aW9uLCBkYXRhLCBvZmZzZXQsIGxlbmd0aCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBLZWNjYWtQMTYwMF9PdmVyd3JpdGVMYW5lcyh2b2lkICpzdGF0ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGxhbmVDb3VudCkKK3sKKyNpZiAoUExBVEZPUk1fQllURV9PUkRFUiA9PSBJU19MSVRUTEVfRU5ESUFOKQorICAgIGNvbnN0IFVJTlQzMiAqIHBJID0gKGNvbnN0IFVJTlQzMiAqKWRhdGE7CisgICAgVUlOVDMyICogcFMgPSAoVUlOVDMyICopc3RhdGU7CisgICAgVUlOVDMyIHQsIHgwLCB4MTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSBsYW5lQ291bnQtMTsgaSA+PSAwOyAtLWkpIHsKKyNpZmRlZiBOT19NSVNBTElHTkVEX0FDQ0VTU0VTCisgICAgICAgIFVJTlQzMiBsb3c7CisgICAgICAgIFVJTlQzMiBoaWdoOworICAgICAgICBtZW1jcHkoJmxvdywgcEkrKywgNCk7CisgICAgICAgIG1lbWNweSgmaGlnaCwgcEkrKywgNCk7CisgICAgICAgIHRvQml0SW50ZXJsZWF2aW5nQW5kU2V0KGxvdywgaGlnaCwgKihwUysrKSwgKihwUysrKSwgdCwgeDAsIHgxKTsKKyNlbHNlCisgICAgICAgIHRvQml0SW50ZXJsZWF2aW5nQW5kU2V0KCoocEkrKyksICoocEkrKyksICoocFMrKyksICoocFMrKyksIHQsIHgwLCB4MSkKKyNlbmRpZgorICAgIH0KKyNlbHNlCisgICAgdW5zaWduZWQgaW50IGxhbmVQb3NpdGlvbjsKKyAgICBmb3IobGFuZVBvc2l0aW9uPTA7IGxhbmVQb3NpdGlvbjxsYW5lQ291bnQ7IGxhbmVQb3NpdGlvbisrKSB7CisgICAgICAgIFVJTlQ4IGxhbmVBc0J5dGVzWzhdOworICAgICAgICBVSU5UMzIgbG93LCBoaWdoLCB0ZW1wLCB0ZW1wMCwgdGVtcDE7CisgICAgICAgIFVJTlQzMiAqc3RhdGVBc0hhbGZMYW5lczsKKyAgICAgICAgbWVtY3B5KGxhbmVBc0J5dGVzLCBkYXRhK2xhbmVQb3NpdGlvbio4LCA4KTsKKyAgICAgICAgbG93ID0gbGFuZUFzQnl0ZXNbMF0KKyAgICAgICAgICAgIHwgKChVSU5UMzIpKGxhbmVBc0J5dGVzWzFdKSA8PCA4KQorICAgICAgICAgICAgfCAoKFVJTlQzMikobGFuZUFzQnl0ZXNbMl0pIDw8IDE2KQorICAgICAgICAgICAgfCAoKFVJTlQzMikobGFuZUFzQnl0ZXNbM10pIDw8IDI0KTsKKyAgICAgICAgaGlnaCA9IGxhbmVBc0J5dGVzWzRdCisgICAgICAgICAgICB8ICgoVUlOVDMyKShsYW5lQXNCeXRlc1s1XSkgPDwgOCkKKyAgICAgICAgICAgIHwgKChVSU5UMzIpKGxhbmVBc0J5dGVzWzZdKSA8PCAxNikKKyAgICAgICAgICAgIHwgKChVSU5UMzIpKGxhbmVBc0J5dGVzWzddKSA8PCAyNCk7CisgICAgICAgIHN0YXRlQXNIYWxmTGFuZXMgPSAoVUlOVDMyKilzdGF0ZTsKKyAgICAgICAgdG9CaXRJbnRlcmxlYXZpbmdBbmRTZXQobG93LCBoaWdoLCBzdGF0ZUFzSGFsZkxhbmVzW2xhbmVQb3NpdGlvbioyKzBdLCBzdGF0ZUFzSGFsZkxhbmVzW2xhbmVQb3NpdGlvbioyKzFdLCB0ZW1wLCB0ZW1wMCwgdGVtcDEpOworICAgIH0KKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgS2VjY2FrUDE2MDBfT3ZlcndyaXRlQnl0ZXModm9pZCAqc3RhdGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisgICAgU25QX092ZXJ3cml0ZUJ5dGVzKHN0YXRlLCBkYXRhLCBvZmZzZXQsIGxlbmd0aCwgS2VjY2FrUDE2MDBfT3ZlcndyaXRlTGFuZXMsIEtlY2Nha1AxNjAwX092ZXJ3cml0ZUJ5dGVzSW5MYW5lLCA4KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX092ZXJ3cml0ZVdpdGhaZXJvZXModm9pZCAqc3RhdGUsIHVuc2lnbmVkIGludCBieXRlQ291bnQpCit7CisgICAgVUlOVDMyICpzdGF0ZUFzSGFsZkxhbmVzID0gKFVJTlQzMiopc3RhdGU7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPGJ5dGVDb3VudC84OyBpKyspIHsKKyAgICAgICAgc3RhdGVBc0hhbGZMYW5lc1tpKjIrMF0gPSAwOworICAgICAgICBzdGF0ZUFzSGFsZkxhbmVzW2kqMisxXSA9IDA7CisgICAgfQorICAgIGlmIChieXRlQ291bnQlOCAhPSAwKQorICAgICAgICBLZWNjYWtQMTYwMF9TZXRCeXRlc0luTGFuZVRvWmVybyhzdGF0ZSwgYnl0ZUNvdW50LzgsIDAsIGJ5dGVDb3VudCU4KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0V4dHJhY3RCeXRlc0luTGFuZShjb25zdCB2b2lkICpzdGF0ZSwgdW5zaWduZWQgaW50IGxhbmVQb3NpdGlvbiwgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgICBVSU5UMzIgKnN0YXRlQXNIYWxmTGFuZXMgPSAoVUlOVDMyKilzdGF0ZTsKKyAgICBVSU5UMzIgbG93LCBoaWdoLCB0ZW1wLCB0ZW1wMCwgdGVtcDE7CisgICAgVUlOVDggbGFuZUFzQnl0ZXNbOF07CisKKyAgICBmcm9tQml0SW50ZXJsZWF2aW5nKHN0YXRlQXNIYWxmTGFuZXNbbGFuZVBvc2l0aW9uKjJdLCBzdGF0ZUFzSGFsZkxhbmVzW2xhbmVQb3NpdGlvbioyKzFdLCBsb3csIGhpZ2gsIHRlbXAsIHRlbXAwLCB0ZW1wMSk7CisjaWYgKFBMQVRGT1JNX0JZVEVfT1JERVIgPT0gSVNfTElUVExFX0VORElBTikKKyAgICAqKChVSU5UMzIqKShsYW5lQXNCeXRlcyswKSkgPSBsb3c7CisgICAgKigoVUlOVDMyKikobGFuZUFzQnl0ZXMrNCkpID0gaGlnaDsKKyNlbHNlCisgICAgbGFuZUFzQnl0ZXNbMF0gPSBsb3cgJiAweEZGOworICAgIGxhbmVBc0J5dGVzWzFdID0gKGxvdyA+PiA4KSAmIDB4RkY7CisgICAgbGFuZUFzQnl0ZXNbMl0gPSAobG93ID4+IDE2KSAmIDB4RkY7CisgICAgbGFuZUFzQnl0ZXNbM10gPSAobG93ID4+IDI0KSAmIDB4RkY7CisgICAgbGFuZUFzQnl0ZXNbNF0gPSBoaWdoICYgMHhGRjsKKyAgICBsYW5lQXNCeXRlc1s1XSA9IChoaWdoID4+IDgpICYgMHhGRjsKKyAgICBsYW5lQXNCeXRlc1s2XSA9IChoaWdoID4+IDE2KSAmIDB4RkY7CisgICAgbGFuZUFzQnl0ZXNbN10gPSAoaGlnaCA+PiAyNCkgJiAweEZGOworI2VuZGlmCisgICAgbWVtY3B5KGRhdGEsIGxhbmVBc0J5dGVzK29mZnNldCwgbGVuZ3RoKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0V4dHJhY3RMYW5lcyhjb25zdCB2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGxhbmVDb3VudCkKK3sKKyNpZiAoUExBVEZPUk1fQllURV9PUkRFUiA9PSBJU19MSVRUTEVfRU5ESUFOKQorICAgIFVJTlQzMiAqIHBJID0gKFVJTlQzMiAqKWRhdGE7CisgICAgY29uc3QgVUlOVDMyICogcFMgPSAoIGNvbnN0IFVJTlQzMiAqKXN0YXRlOworICAgIFVJTlQzMiB0LCB4MCwgeDE7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gbGFuZUNvdW50LTE7IGkgPj0gMDsgLS1pKSB7CisjaWZkZWYgTk9fTUlTQUxJR05FRF9BQ0NFU1NFUworICAgICAgICBVSU5UMzIgbG93OworICAgICAgICBVSU5UMzIgaGlnaDsKKyAgICAgICAgZnJvbUJpdEludGVybGVhdmluZygqKHBTKyspLCAqKHBTKyspLCBsb3csIGhpZ2gsIHQsIHgwLCB4MSk7CisgICAgICAgIG1lbWNweShwSSsrLCAmbG93LCA0KTsKKyAgICAgICAgbWVtY3B5KHBJKyssICZoaWdoLCA0KTsKKyNlbHNlCisgICAgICAgIGZyb21CaXRJbnRlcmxlYXZpbmcoKihwUysrKSwgKihwUysrKSwgKihwSSsrKSwgKihwSSsrKSwgdCwgeDAsIHgxKQorI2VuZGlmCisgICAgfQorI2Vsc2UKKyAgICB1bnNpZ25lZCBpbnQgbGFuZVBvc2l0aW9uOworICAgIGZvcihsYW5lUG9zaXRpb249MDsgbGFuZVBvc2l0aW9uPGxhbmVDb3VudDsgbGFuZVBvc2l0aW9uKyspIHsKKyAgICAgICAgVUlOVDMyICpzdGF0ZUFzSGFsZkxhbmVzID0gKFVJTlQzMiopc3RhdGU7CisgICAgICAgIFVJTlQzMiBsb3csIGhpZ2gsIHRlbXAsIHRlbXAwLCB0ZW1wMTsKKyAgICAgICAgVUlOVDggbGFuZUFzQnl0ZXNbOF07CisgICAgICAgIGZyb21CaXRJbnRlcmxlYXZpbmcoc3RhdGVBc0hhbGZMYW5lc1tsYW5lUG9zaXRpb24qMl0sIHN0YXRlQXNIYWxmTGFuZXNbbGFuZVBvc2l0aW9uKjIrMV0sIGxvdywgaGlnaCwgdGVtcCwgdGVtcDAsIHRlbXAxKTsKKyAgICAgICAgbGFuZUFzQnl0ZXNbMF0gPSBsb3cgJiAweEZGOworICAgICAgICBsYW5lQXNCeXRlc1sxXSA9IChsb3cgPj4gOCkgJiAweEZGOworICAgICAgICBsYW5lQXNCeXRlc1syXSA9IChsb3cgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgbGFuZUFzQnl0ZXNbM10gPSAobG93ID4+IDI0KSAmIDB4RkY7CisgICAgICAgIGxhbmVBc0J5dGVzWzRdID0gaGlnaCAmIDB4RkY7CisgICAgICAgIGxhbmVBc0J5dGVzWzVdID0gKGhpZ2ggPj4gOCkgJiAweEZGOworICAgICAgICBsYW5lQXNCeXRlc1s2XSA9IChoaWdoID4+IDE2KSAmIDB4RkY7CisgICAgICAgIGxhbmVBc0J5dGVzWzddID0gKGhpZ2ggPj4gMjQpICYgMHhGRjsKKyAgICAgICAgbWVtY3B5KGRhdGErbGFuZVBvc2l0aW9uKjgsIGxhbmVBc0J5dGVzLCA4KTsKKyAgICB9CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0V4dHJhY3RCeXRlcyhjb25zdCB2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgICBTblBfRXh0cmFjdEJ5dGVzKHN0YXRlLCBkYXRhLCBvZmZzZXQsIGxlbmd0aCwgS2VjY2FrUDE2MDBfRXh0cmFjdExhbmVzLCBLZWNjYWtQMTYwMF9FeHRyYWN0Qnl0ZXNJbkxhbmUsIDgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgS2VjY2FrUDE2MDBfRXh0cmFjdEFuZEFkZEJ5dGVzSW5MYW5lKGNvbnN0IHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBpbnQgbGFuZVBvc2l0aW9uLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCwgdW5zaWduZWQgY2hhciAqb3V0cHV0LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgIFVJTlQzMiAqc3RhdGVBc0hhbGZMYW5lcyA9IChVSU5UMzIqKXN0YXRlOworICAgIFVJTlQzMiBsb3csIGhpZ2gsIHRlbXAsIHRlbXAwLCB0ZW1wMTsKKyAgICBVSU5UOCBsYW5lQXNCeXRlc1s4XTsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIGZyb21CaXRJbnRlcmxlYXZpbmcoc3RhdGVBc0hhbGZMYW5lc1tsYW5lUG9zaXRpb24qMl0sIHN0YXRlQXNIYWxmTGFuZXNbbGFuZVBvc2l0aW9uKjIrMV0sIGxvdywgaGlnaCwgdGVtcCwgdGVtcDAsIHRlbXAxKTsKKyNpZiAoUExBVEZPUk1fQllURV9PUkRFUiA9PSBJU19MSVRUTEVfRU5ESUFOKQorICAgICooKFVJTlQzMiopKGxhbmVBc0J5dGVzKzApKSA9IGxvdzsKKyAgICAqKChVSU5UMzIqKShsYW5lQXNCeXRlcys0KSkgPSBoaWdoOworI2Vsc2UKKyAgICBsYW5lQXNCeXRlc1swXSA9IGxvdyAmIDB4RkY7CisgICAgbGFuZUFzQnl0ZXNbMV0gPSAobG93ID4+IDgpICYgMHhGRjsKKyAgICBsYW5lQXNCeXRlc1syXSA9IChsb3cgPj4gMTYpICYgMHhGRjsKKyAgICBsYW5lQXNCeXRlc1szXSA9IChsb3cgPj4gMjQpICYgMHhGRjsKKyAgICBsYW5lQXNCeXRlc1s0XSA9IGhpZ2ggJiAweEZGOworICAgIGxhbmVBc0J5dGVzWzVdID0gKGhpZ2ggPj4gOCkgJiAweEZGOworICAgIGxhbmVBc0J5dGVzWzZdID0gKGhpZ2ggPj4gMTYpICYgMHhGRjsKKyAgICBsYW5lQXNCeXRlc1s3XSA9IChoaWdoID4+IDI0KSAmIDB4RkY7CisjZW5kaWYKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgICAgICBvdXRwdXRbaV0gPSBpbnB1dFtpXSBeIGxhbmVBc0J5dGVzW29mZnNldCtpXTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0V4dHJhY3RBbmRBZGRMYW5lcyhjb25zdCB2b2lkICpzdGF0ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgdW5zaWduZWQgaW50IGxhbmVDb3VudCkKK3sKKyNpZiAoUExBVEZPUk1fQllURV9PUkRFUiA9PSBJU19MSVRUTEVfRU5ESUFOKQorICAgIGNvbnN0IFVJTlQzMiAqIHBJID0gKGNvbnN0IFVJTlQzMiAqKWlucHV0OworICAgIFVJTlQzMiAqIHBPID0gKFVJTlQzMiAqKW91dHB1dDsKKyAgICBjb25zdCBVSU5UMzIgKiBwUyA9IChjb25zdCBVSU5UMzIgKilzdGF0ZTsKKyAgICBVSU5UMzIgdCwgeDAsIHgxOworICAgIGludCBpOworICAgIGZvciAoaSA9IGxhbmVDb3VudC0xOyBpID49IDA7IC0taSkgeworI2lmZGVmIE5PX01JU0FMSUdORURfQUNDRVNTRVMKKyAgICAgICAgVUlOVDMyIGxvdzsKKyAgICAgICAgVUlOVDMyIGhpZ2g7CisgICAgICAgIGZyb21CaXRJbnRlcmxlYXZpbmcoKihwUysrKSwgKihwUysrKSwgbG93LCBoaWdoLCB0LCB4MCwgeDEpOworICAgICAgICAqKHBPKyspID0gKihwSSsrKSBeIGxvdzsKKyAgICAgICAgKihwTysrKSA9ICoocEkrKykgXiBoaWdoOworI2Vsc2UKKyAgICAgICAgZnJvbUJpdEludGVybGVhdmluZ0FuZFhPUigqKHBTKyspLCAqKHBTKyspLCAqKHBJKyspLCAqKHBJKyspLCAqKHBPKyspLCAqKHBPKyspLCB0LCB4MCwgeDEpCisjZW5kaWYKKyAgICB9CisjZWxzZQorICAgIHVuc2lnbmVkIGludCBsYW5lUG9zaXRpb247CisgICAgZm9yKGxhbmVQb3NpdGlvbj0wOyBsYW5lUG9zaXRpb248bGFuZUNvdW50OyBsYW5lUG9zaXRpb24rKykgeworICAgICAgICBVSU5UMzIgKnN0YXRlQXNIYWxmTGFuZXMgPSAoVUlOVDMyKilzdGF0ZTsKKyAgICAgICAgVUlOVDMyIGxvdywgaGlnaCwgdGVtcCwgdGVtcDAsIHRlbXAxOworICAgICAgICBVSU5UOCBsYW5lQXNCeXRlc1s4XTsKKyAgICAgICAgZnJvbUJpdEludGVybGVhdmluZyhzdGF0ZUFzSGFsZkxhbmVzW2xhbmVQb3NpdGlvbioyXSwgc3RhdGVBc0hhbGZMYW5lc1tsYW5lUG9zaXRpb24qMisxXSwgbG93LCBoaWdoLCB0ZW1wLCB0ZW1wMCwgdGVtcDEpOworICAgICAgICBsYW5lQXNCeXRlc1swXSA9IGxvdyAmIDB4RkY7CisgICAgICAgIGxhbmVBc0J5dGVzWzFdID0gKGxvdyA+PiA4KSAmIDB4RkY7CisgICAgICAgIGxhbmVBc0J5dGVzWzJdID0gKGxvdyA+PiAxNikgJiAweEZGOworICAgICAgICBsYW5lQXNCeXRlc1szXSA9IChsb3cgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgbGFuZUFzQnl0ZXNbNF0gPSBoaWdoICYgMHhGRjsKKyAgICAgICAgbGFuZUFzQnl0ZXNbNV0gPSAoaGlnaCA+PiA4KSAmIDB4RkY7CisgICAgICAgIGxhbmVBc0J5dGVzWzZdID0gKGhpZ2ggPj4gMTYpICYgMHhGRjsKKyAgICAgICAgbGFuZUFzQnl0ZXNbN10gPSAoaGlnaCA+PiAyNCkgJiAweEZGOworICAgICAgICAoKFVJTlQzMiopKG91dHB1dCtsYW5lUG9zaXRpb24qOCkpWzBdID0gKChVSU5UMzIqKShpbnB1dCtsYW5lUG9zaXRpb24qOCkpWzBdIF4gKCooY29uc3QgVUlOVDMyKikobGFuZUFzQnl0ZXMrMCkpOworICAgICAgICAoKFVJTlQzMiopKG91dHB1dCtsYW5lUG9zaXRpb24qOCkpWzFdID0gKChVSU5UMzIqKShpbnB1dCtsYW5lUG9zaXRpb24qOCkpWzBdIF4gKCooY29uc3QgVUlOVDMyKikobGFuZUFzQnl0ZXMrNCkpOworICAgIH0KKyNlbmRpZgorfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0V4dHJhY3RBbmRBZGRCeXRlcyhjb25zdCB2b2lkICpzdGF0ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgICBTblBfRXh0cmFjdEFuZEFkZEJ5dGVzKHN0YXRlLCBpbnB1dCwgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCwgS2VjY2FrUDE2MDBfRXh0cmFjdEFuZEFkZExhbmVzLCBLZWNjYWtQMTYwMF9FeHRyYWN0QW5kQWRkQnl0ZXNJbkxhbmUsIDgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBVSU5UMzIgS2VjY2FrRjE2MDBSb3VuZENvbnN0YW50c19pbnQyWzIqMjQrMV0gPQoreworICAgIDB4MDAwMDAwMDFVTCwgICAgMHgwMDAwMDAwMFVMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHgwMDAwMDA4OVVMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHg4MDAwMDA4YlVMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHg4MDAwODA4MFVMLAorICAgIDB4MDAwMDAwMDFVTCwgICAgMHgwMDAwMDA4YlVMLAorICAgIDB4MDAwMDAwMDFVTCwgICAgMHgwMDAwODAwMFVMLAorICAgIDB4MDAwMDAwMDFVTCwgICAgMHg4MDAwODA4OFVMLAorICAgIDB4MDAwMDAwMDFVTCwgICAgMHg4MDAwMDA4MlVMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHgwMDAwMDAwYlVMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHgwMDAwMDAwYVVMLAorICAgIDB4MDAwMDAwMDFVTCwgICAgMHgwMDAwODA4MlVMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHgwMDAwODAwM1VMLAorICAgIDB4MDAwMDAwMDFVTCwgICAgMHgwMDAwODA4YlVMLAorICAgIDB4MDAwMDAwMDFVTCwgICAgMHg4MDAwMDAwYlVMLAorICAgIDB4MDAwMDAwMDFVTCwgICAgMHg4MDAwMDA4YVVMLAorICAgIDB4MDAwMDAwMDFVTCwgICAgMHg4MDAwMDA4MVVMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHg4MDAwMDA4MVVMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHg4MDAwMDAwOFVMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHgwMDAwMDA4M1VMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHg4MDAwODAwM1VMLAorICAgIDB4MDAwMDAwMDFVTCwgICAgMHg4MDAwODA4OFVMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHg4MDAwMDA4OFVMLAorICAgIDB4MDAwMDAwMDFVTCwgICAgMHgwMDAwODAwMFVMLAorICAgIDB4MDAwMDAwMDBVTCwgICAgMHg4MDAwODA4MlVMLAorICAgIDB4MDAwMDAwRkZVTAorfTsKKworI2RlZmluZSBLZWNjYWtBdG9EX3JvdW5kMCgpIFwKKyAgICAgICAgQ3ggPSBBYnUwXkFndTBeQWt1MF5BbXUwXkFzdTA7IFwKKyAgICAgICAgRHUxID0gQWJlMV5BZ2UxXkFrZTFeQW1lMV5Bc2UxOyBcCisgICAgICAgIERhMCA9IEN4XlJPTDMyKER1MSwgMSk7IFwKKyAgICAgICAgQ3ogPSBBYnUxXkFndTFeQWt1MV5BbXUxXkFzdTE7IFwKKyAgICAgICAgRHUwID0gQWJlMF5BZ2UwXkFrZTBeQW1lMF5Bc2UwOyBcCisgICAgICAgIERhMSA9IEN6XkR1MDsgXAorXAorICAgICAgICBDdyA9IEFiaTBeQWdpMF5Ba2kwXkFtaTBeQXNpMDsgXAorICAgICAgICBEbzAgPSBDd15ST0wzMihDeiwgMSk7IFwKKyAgICAgICAgQ3kgPSBBYmkxXkFnaTFeQWtpMV5BbWkxXkFzaTE7IFwKKyAgICAgICAgRG8xID0gQ3leQ3g7IFwKK1wKKyAgICAgICAgQ3ggPSBBYmEwXkFnYTBeQWthMF5BbWEwXkFzYTA7IFwKKyAgICAgICAgRGUwID0gQ3heUk9MMzIoQ3ksIDEpOyBcCisgICAgICAgIEN6ID0gQWJhMV5BZ2ExXkFrYTFeQW1hMV5Bc2ExOyBcCisgICAgICAgIERlMSA9IEN6XkN3OyBcCitcCisgICAgICAgIEN5ID0gQWJvMV5BZ28xXkFrbzFeQW1vMV5Bc28xOyBcCisgICAgICAgIERpMCA9IER1MF5ST0wzMihDeSwgMSk7IFwKKyAgICAgICAgQ3cgPSBBYm8wXkFnbzBeQWtvMF5BbW8wXkFzbzA7IFwKKyAgICAgICAgRGkxID0gRHUxXkN3OyBcCitcCisgICAgICAgIER1MCA9IEN3XlJPTDMyKEN6LCAxKTsgXAorICAgICAgICBEdTEgPSBDeV5DeDsgXAorCisjZGVmaW5lIEtlY2Nha0F0b0Rfcm91bmQxKCkgXAorICAgICAgICBDeCA9IEFzdTBeQWd1MF5BbXUwXkFidTFeQWt1MTsgXAorICAgICAgICBEdTEgPSBBZ2UxXkFtZTBeQWJlMF5Ba2UxXkFzZTE7IFwKKyAgICAgICAgRGEwID0gQ3heUk9MMzIoRHUxLCAxKTsgXAorICAgICAgICBDeiA9IEFzdTFeQWd1MV5BbXUxXkFidTBeQWt1MDsgXAorICAgICAgICBEdTAgPSBBZ2UwXkFtZTFeQWJlMV5Ba2UwXkFzZTA7IFwKKyAgICAgICAgRGExID0gQ3peRHUwOyBcCitcCisgICAgICAgIEN3ID0gQWtpMV5Bc2kxXkFnaTBeQW1pMV5BYmkwOyBcCisgICAgICAgIERvMCA9IEN3XlJPTDMyKEN6LCAxKTsgXAorICAgICAgICBDeSA9IEFraTBeQXNpMF5BZ2kxXkFtaTBeQWJpMTsgXAorICAgICAgICBEbzEgPSBDeV5DeDsgXAorXAorICAgICAgICBDeCA9IEFiYTBeQWthMV5Bc2EwXkFnYTBeQW1hMTsgXAorICAgICAgICBEZTAgPSBDeF5ST0wzMihDeSwgMSk7IFwKKyAgICAgICAgQ3ogPSBBYmExXkFrYTBeQXNhMV5BZ2ExXkFtYTA7IFwKKyAgICAgICAgRGUxID0gQ3peQ3c7IFwKK1wKKyAgICAgICAgQ3kgPSBBbW8wXkFibzFeQWtvMF5Bc28xXkFnbzA7IFwKKyAgICAgICAgRGkwID0gRHUwXlJPTDMyKEN5LCAxKTsgXAorICAgICAgICBDdyA9IEFtbzFeQWJvMF5Ba28xXkFzbzBeQWdvMTsgXAorICAgICAgICBEaTEgPSBEdTFeQ3c7IFwKK1wKKyAgICAgICAgRHUwID0gQ3deUk9MMzIoQ3osIDEpOyBcCisgICAgICAgIER1MSA9IEN5XkN4OyBcCisKKyNkZWZpbmUgS2VjY2FrQXRvRF9yb3VuZDIoKSBcCisgICAgICAgIEN4ID0gQWt1MV5BZ3UwXkFidTFeQXN1MV5BbXUxOyBcCisgICAgICAgIER1MSA9IEFtZTBeQWtlMF5BZ2UwXkFiZTBeQXNlMTsgXAorICAgICAgICBEYTAgPSBDeF5ST0wzMihEdTEsIDEpOyBcCisgICAgICAgIEN6ID0gQWt1MF5BZ3UxXkFidTBeQXN1MF5BbXUwOyBcCisgICAgICAgIER1MCA9IEFtZTFeQWtlMV5BZ2UxXkFiZTFeQXNlMDsgXAorICAgICAgICBEYTEgPSBDel5EdTA7IFwKK1wKKyAgICAgICAgQ3cgPSBBZ2kxXkFiaTFeQXNpMV5BbWkwXkFraTE7IFwKKyAgICAgICAgRG8wID0gQ3deUk9MMzIoQ3osIDEpOyBcCisgICAgICAgIEN5ID0gQWdpMF5BYmkwXkFzaTBeQW1pMV5Ba2kwOyBcCisgICAgICAgIERvMSA9IEN5XkN4OyBcCitcCisgICAgICAgIEN4ID0gQWJhMF5Bc2ExXkFtYTFeQWthMV5BZ2ExOyBcCisgICAgICAgIERlMCA9IEN4XlJPTDMyKEN5LCAxKTsgXAorICAgICAgICBDeiA9IEFiYTFeQXNhMF5BbWEwXkFrYTBeQWdhMDsgXAorICAgICAgICBEZTEgPSBDel5DdzsgXAorXAorICAgICAgICBDeSA9IEFzbzBeQW1vMF5Ba28xXkFnbzBeQWJvMDsgXAorICAgICAgICBEaTAgPSBEdTBeUk9MMzIoQ3ksIDEpOyBcCisgICAgICAgIEN3ID0gQXNvMV5BbW8xXkFrbzBeQWdvMV5BYm8xOyBcCisgICAgICAgIERpMSA9IER1MV5DdzsgXAorXAorICAgICAgICBEdTAgPSBDd15ST0wzMihDeiwgMSk7IFwKKyAgICAgICAgRHUxID0gQ3leQ3g7IFwKKworI2RlZmluZSBLZWNjYWtBdG9EX3JvdW5kMygpIFwKKyAgICAgICAgQ3ggPSBBbXUxXkFndTBeQXN1MV5Ba3UwXkFidTA7IFwKKyAgICAgICAgRHUxID0gQWtlMF5BYmUxXkFtZTFeQWdlMF5Bc2UxOyBcCisgICAgICAgIERhMCA9IEN4XlJPTDMyKER1MSwgMSk7IFwKKyAgICAgICAgQ3ogPSBBbXUwXkFndTFeQXN1MF5Ba3UxXkFidTE7IFwKKyAgICAgICAgRHUwID0gQWtlMV5BYmUwXkFtZTBeQWdlMV5Bc2UwOyBcCisgICAgICAgIERhMSA9IEN6XkR1MDsgXAorXAorICAgICAgICBDdyA9IEFzaTBeQWtpMF5BYmkxXkFtaTFeQWdpMTsgXAorICAgICAgICBEbzAgPSBDd15ST0wzMihDeiwgMSk7IFwKKyAgICAgICAgQ3kgPSBBc2kxXkFraTFeQWJpMF5BbWkwXkFnaTA7IFwKKyAgICAgICAgRG8xID0gQ3leQ3g7IFwKK1wKKyAgICAgICAgQ3ggPSBBYmEwXkFtYTBeQWdhMV5Bc2ExXkFrYTA7IFwKKyAgICAgICAgRGUwID0gQ3heUk9MMzIoQ3ksIDEpOyBcCisgICAgICAgIEN6ID0gQWJhMV5BbWExXkFnYTBeQXNhMF5Ba2ExOyBcCisgICAgICAgIERlMSA9IEN6XkN3OyBcCitcCisgICAgICAgIEN5ID0gQWdvMV5Bc28wXkFrbzBeQWJvMF5BbW8xOyBcCisgICAgICAgIERpMCA9IER1MF5ST0wzMihDeSwgMSk7IFwKKyAgICAgICAgQ3cgPSBBZ28wXkFzbzFeQWtvMV5BYm8xXkFtbzA7IFwKKyAgICAgICAgRGkxID0gRHUxXkN3OyBcCitcCisgICAgICAgIER1MCA9IEN3XlJPTDMyKEN6LCAxKTsgXAorICAgICAgICBEdTEgPSBDeV5DeDsgXAorCit2b2lkIEtlY2Nha1AxNjAwX1Blcm11dGVfTnJvdW5kcyh2b2lkICpzdGF0ZSwgdW5zaWduZWQgaW50IG5Sb3VuZHMpCit7CisgICAgeworICAgICAgICBVSU5UMzIgRGEwLCBEZTAsIERpMCwgRG8wLCBEdTA7CisgICAgICAgIFVJTlQzMiBEYTEsIERlMSwgRGkxLCBEbzEsIER1MTsKKyAgICAgICAgVUlOVDMyIENhMCwgQ2UwLCBDaTAsIENvMCwgQ3UwOworICAgICAgICBVSU5UMzIgQ3gsIEN5LCBDeiwgQ3c7CisgICAgICAgICNkZWZpbmUgQmEgQ2EwCisgICAgICAgICNkZWZpbmUgQmUgQ2UwCisgICAgICAgICNkZWZpbmUgQmkgQ2kwCisgICAgICAgICNkZWZpbmUgQm8gQ28wCisgICAgICAgICNkZWZpbmUgQnUgQ3UwCisgICAgICAgIGNvbnN0IFVJTlQzMiAqcFJvdW5kQ29uc3RhbnRzID0gS2VjY2FrRjE2MDBSb3VuZENvbnN0YW50c19pbnQyKygyNC1uUm91bmRzKSoyOworICAgICAgICBVSU5UMzIgKnN0YXRlQXNIYWxmTGFuZXMgPSAoVUlOVDMyKilzdGF0ZTsKKyAgICAgICAgI2RlZmluZSBBYmEwIHN0YXRlQXNIYWxmTGFuZXNbIDBdCisgICAgICAgICNkZWZpbmUgQWJhMSBzdGF0ZUFzSGFsZkxhbmVzWyAxXQorICAgICAgICAjZGVmaW5lIEFiZTAgc3RhdGVBc0hhbGZMYW5lc1sgMl0KKyAgICAgICAgI2RlZmluZSBBYmUxIHN0YXRlQXNIYWxmTGFuZXNbIDNdCisgICAgICAgICNkZWZpbmUgQWJpMCBzdGF0ZUFzSGFsZkxhbmVzWyA0XQorICAgICAgICAjZGVmaW5lIEFiaTEgc3RhdGVBc0hhbGZMYW5lc1sgNV0KKyAgICAgICAgI2RlZmluZSBBYm8wIHN0YXRlQXNIYWxmTGFuZXNbIDZdCisgICAgICAgICNkZWZpbmUgQWJvMSBzdGF0ZUFzSGFsZkxhbmVzWyA3XQorICAgICAgICAjZGVmaW5lIEFidTAgc3RhdGVBc0hhbGZMYW5lc1sgOF0KKyAgICAgICAgI2RlZmluZSBBYnUxIHN0YXRlQXNIYWxmTGFuZXNbIDldCisgICAgICAgICNkZWZpbmUgQWdhMCBzdGF0ZUFzSGFsZkxhbmVzWzEwXQorICAgICAgICAjZGVmaW5lIEFnYTEgc3RhdGVBc0hhbGZMYW5lc1sxMV0KKyAgICAgICAgI2RlZmluZSBBZ2UwIHN0YXRlQXNIYWxmTGFuZXNbMTJdCisgICAgICAgICNkZWZpbmUgQWdlMSBzdGF0ZUFzSGFsZkxhbmVzWzEzXQorICAgICAgICAjZGVmaW5lIEFnaTAgc3RhdGVBc0hhbGZMYW5lc1sxNF0KKyAgICAgICAgI2RlZmluZSBBZ2kxIHN0YXRlQXNIYWxmTGFuZXNbMTVdCisgICAgICAgICNkZWZpbmUgQWdvMCBzdGF0ZUFzSGFsZkxhbmVzWzE2XQorICAgICAgICAjZGVmaW5lIEFnbzEgc3RhdGVBc0hhbGZMYW5lc1sxN10KKyAgICAgICAgI2RlZmluZSBBZ3UwIHN0YXRlQXNIYWxmTGFuZXNbMThdCisgICAgICAgICNkZWZpbmUgQWd1MSBzdGF0ZUFzSGFsZkxhbmVzWzE5XQorICAgICAgICAjZGVmaW5lIEFrYTAgc3RhdGVBc0hhbGZMYW5lc1syMF0KKyAgICAgICAgI2RlZmluZSBBa2ExIHN0YXRlQXNIYWxmTGFuZXNbMjFdCisgICAgICAgICNkZWZpbmUgQWtlMCBzdGF0ZUFzSGFsZkxhbmVzWzIyXQorICAgICAgICAjZGVmaW5lIEFrZTEgc3RhdGVBc0hhbGZMYW5lc1syM10KKyAgICAgICAgI2RlZmluZSBBa2kwIHN0YXRlQXNIYWxmTGFuZXNbMjRdCisgICAgICAgICNkZWZpbmUgQWtpMSBzdGF0ZUFzSGFsZkxhbmVzWzI1XQorICAgICAgICAjZGVmaW5lIEFrbzAgc3RhdGVBc0hhbGZMYW5lc1syNl0KKyAgICAgICAgI2RlZmluZSBBa28xIHN0YXRlQXNIYWxmTGFuZXNbMjddCisgICAgICAgICNkZWZpbmUgQWt1MCBzdGF0ZUFzSGFsZkxhbmVzWzI4XQorICAgICAgICAjZGVmaW5lIEFrdTEgc3RhdGVBc0hhbGZMYW5lc1syOV0KKyAgICAgICAgI2RlZmluZSBBbWEwIHN0YXRlQXNIYWxmTGFuZXNbMzBdCisgICAgICAgICNkZWZpbmUgQW1hMSBzdGF0ZUFzSGFsZkxhbmVzWzMxXQorICAgICAgICAjZGVmaW5lIEFtZTAgc3RhdGVBc0hhbGZMYW5lc1szMl0KKyAgICAgICAgI2RlZmluZSBBbWUxIHN0YXRlQXNIYWxmTGFuZXNbMzNdCisgICAgICAgICNkZWZpbmUgQW1pMCBzdGF0ZUFzSGFsZkxhbmVzWzM0XQorICAgICAgICAjZGVmaW5lIEFtaTEgc3RhdGVBc0hhbGZMYW5lc1szNV0KKyAgICAgICAgI2RlZmluZSBBbW8wIHN0YXRlQXNIYWxmTGFuZXNbMzZdCisgICAgICAgICNkZWZpbmUgQW1vMSBzdGF0ZUFzSGFsZkxhbmVzWzM3XQorICAgICAgICAjZGVmaW5lIEFtdTAgc3RhdGVBc0hhbGZMYW5lc1szOF0KKyAgICAgICAgI2RlZmluZSBBbXUxIHN0YXRlQXNIYWxmTGFuZXNbMzldCisgICAgICAgICNkZWZpbmUgQXNhMCBzdGF0ZUFzSGFsZkxhbmVzWzQwXQorICAgICAgICAjZGVmaW5lIEFzYTEgc3RhdGVBc0hhbGZMYW5lc1s0MV0KKyAgICAgICAgI2RlZmluZSBBc2UwIHN0YXRlQXNIYWxmTGFuZXNbNDJdCisgICAgICAgICNkZWZpbmUgQXNlMSBzdGF0ZUFzSGFsZkxhbmVzWzQzXQorICAgICAgICAjZGVmaW5lIEFzaTAgc3RhdGVBc0hhbGZMYW5lc1s0NF0KKyAgICAgICAgI2RlZmluZSBBc2kxIHN0YXRlQXNIYWxmTGFuZXNbNDVdCisgICAgICAgICNkZWZpbmUgQXNvMCBzdGF0ZUFzSGFsZkxhbmVzWzQ2XQorICAgICAgICAjZGVmaW5lIEFzbzEgc3RhdGVBc0hhbGZMYW5lc1s0N10KKyAgICAgICAgI2RlZmluZSBBc3UwIHN0YXRlQXNIYWxmTGFuZXNbNDhdCisgICAgICAgICNkZWZpbmUgQXN1MSBzdGF0ZUFzSGFsZkxhbmVzWzQ5XQorCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIC0tLSBDb2RlIGZvciA0IHJvdW5kcyAqLworCisgICAgICAgICAgICAvKiAtLS0gdXNpbmcgZmFjdG9yIDIgaW50ZXJsZWF2aW5nLCA2NC1iaXQgbGFuZXMgbWFwcGVkIHRvIDMyLWJpdCB3b3JkcyAqLworCisgICAgICAgICAgICBLZWNjYWtBdG9EX3JvdW5kMCgpOworCisgICAgICAgICAgICBCYSA9IChBYmEwXkRhMCk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBZ2UwXkRlMCksIDIyKTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFraTFeRGkxKSwgMjIpOworICAgICAgICAgICAgQm8gPSBST0wzMigoQW1vMV5EbzEpLCAxMSk7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBc3UwXkR1MCksIDcpOworICAgICAgICAgICAgQWJhMCA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBYmEwIF49ICoocFJvdW5kQ29uc3RhbnRzKyspOworICAgICAgICAgICAgQWdlMCA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBa2kxID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFtbzEgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQXN1MCA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEJhID0gKEFiYTFeRGExKTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFnZTFeRGUxKSwgMjIpOworICAgICAgICAgICAgQmkgPSBST0wzMigoQWtpMF5EaTApLCAyMSk7CisgICAgICAgICAgICBCbyA9IFJPTDMyKChBbW8wXkRvMCksIDEwKTsKKyAgICAgICAgICAgIEJ1ID0gUk9MMzIoKEFzdTFeRHUxKSwgNyk7CisgICAgICAgICAgICBBYmExID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFiYTEgXj0gKihwUm91bmRDb25zdGFudHMrKyk7CisgICAgICAgICAgICBBZ2UxID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFraTAgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQW1vMCA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBc3UxID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQmkgPSBST0wzMigoQWthMV5EYTEpLCAyKTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFtZTFeRGUxKSwgMjMpOworICAgICAgICAgICAgQnUgPSBST0wzMigoQXNpMV5EaTEpLCAzMSk7CisgICAgICAgICAgICBCYSA9IFJPTDMyKChBYm8wXkRvMCksIDE0KTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFndTBeRHUwKSwgMTApOworICAgICAgICAgICAgQWthMSA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBbWUxID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFzaTEgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWJvMCA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBZ3UwID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQmkgPSBST0wzMigoQWthMF5EYTApLCAxKTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFtZTBeRGUwKSwgMjIpOworICAgICAgICAgICAgQnUgPSBST0wzMigoQXNpMF5EaTApLCAzMCk7CisgICAgICAgICAgICBCYSA9IFJPTDMyKChBYm8xXkRvMSksIDE0KTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFndTFeRHUxKSwgMTApOworICAgICAgICAgICAgQWthMCA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBbWUwID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFzaTAgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWJvMSA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBZ3UxID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQnUgPSBST0wzMigoQXNhMF5EYTApLCA5KTsKKyAgICAgICAgICAgIEJhID0gUk9MMzIoKEFiZTFeRGUxKSwgMSk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBZ2kwXkRpMCksIDMpOworICAgICAgICAgICAgQmkgPSBST0wzMigoQWtvMV5EbzEpLCAxMyk7CisgICAgICAgICAgICBCbyA9IFJPTDMyKChBbXUwXkR1MCksIDQpOworICAgICAgICAgICAgQXNhMCA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBYmUxID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFnaTAgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWtvMSA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBbXUwID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQnUgPSBST0wzMigoQXNhMV5EYTEpLCA5KTsKKyAgICAgICAgICAgIEJhID0gKEFiZTBeRGUwKTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFnaTFeRGkxKSwgMyk7CisgICAgICAgICAgICBCaSA9IFJPTDMyKChBa28wXkRvMCksIDEyKTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFtdTFeRHUxKSwgNCk7CisgICAgICAgICAgICBBc2ExID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFiZTAgPSAgIEJlIF4oKH5CaSkmICBCbyApOworICAgICAgICAgICAgQWdpMSA9ICAgQmkgXigofkJvKSYgIEJ1ICk7CisgICAgICAgICAgICBBa28wID0gICBCbyBeKCh+QnUpJiAgQmEgKTsKKyAgICAgICAgICAgIEFtdTEgPSAgIEJ1IF4oKH5CYSkmICBCZSApOworCisgICAgICAgICAgICBCZSA9IFJPTDMyKChBZ2EwXkRhMCksIDE4KTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFrZTBeRGUwKSwgNSk7CisgICAgICAgICAgICBCbyA9IFJPTDMyKChBbWkxXkRpMSksIDgpOworICAgICAgICAgICAgQnUgPSBST0wzMigoQXNvMF5EbzApLCAyOCk7CisgICAgICAgICAgICBCYSA9IFJPTDMyKChBYnUxXkR1MSksIDE0KTsKKyAgICAgICAgICAgIEFnYTAgPSAgIEJhIF4oKH5CZSkmICBCaSApOworICAgICAgICAgICAgQWtlMCA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBbWkxID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFzbzAgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQWJ1MSA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFnYTFeRGExKSwgMTgpOworICAgICAgICAgICAgQmkgPSBST0wzMigoQWtlMV5EZTEpLCA1KTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFtaTBeRGkwKSwgNyk7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBc28xXkRvMSksIDI4KTsKKyAgICAgICAgICAgIEJhID0gUk9MMzIoKEFidTBeRHUwKSwgMTMpOworICAgICAgICAgICAgQWdhMSA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBa2UxID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFtaTAgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQXNvMSA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBYnUwID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQm8gPSBST0wzMigoQW1hMV5EYTEpLCAyMSk7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBc2UwXkRlMCksIDEpOworICAgICAgICAgICAgQmEgPSBST0wzMigoQWJpMF5EaTApLCAzMSk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBZ28xXkRvMSksIDI4KTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFrdTFeRHUxKSwgMjApOworICAgICAgICAgICAgQW1hMSA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBc2UwID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFiaTAgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWdvMSA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBa3UxID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQm8gPSBST0wzMigoQW1hMF5EYTApLCAyMCk7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBc2UxXkRlMSksIDEpOworICAgICAgICAgICAgQmEgPSBST0wzMigoQWJpMV5EaTEpLCAzMSk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBZ28wXkRvMCksIDI3KTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFrdTBeRHUwKSwgMTkpOworICAgICAgICAgICAgQW1hMCA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBc2UxID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFiaTEgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWdvMCA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBa3UwID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgS2VjY2FrQXRvRF9yb3VuZDEoKTsKKworICAgICAgICAgICAgQmEgPSAoQWJhMF5EYTApOworICAgICAgICAgICAgQmUgPSBST0wzMigoQW1lMV5EZTApLCAyMik7CisgICAgICAgICAgICBCaSA9IFJPTDMyKChBZ2kxXkRpMSksIDIyKTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFzbzFeRG8xKSwgMTEpOworICAgICAgICAgICAgQnUgPSBST0wzMigoQWt1MV5EdTApLCA3KTsKKyAgICAgICAgICAgIEFiYTAgPSAgIEJhIF4oKH5CZSkmICBCaSApOworICAgICAgICAgICAgQWJhMCBePSAqKHBSb3VuZENvbnN0YW50cysrKTsKKyAgICAgICAgICAgIEFtZTEgPSAgIEJlIF4oKH5CaSkmICBCbyApOworICAgICAgICAgICAgQWdpMSA9ICAgQmkgXigofkJvKSYgIEJ1ICk7CisgICAgICAgICAgICBBc28xID0gICBCbyBeKCh+QnUpJiAgQmEgKTsKKyAgICAgICAgICAgIEFrdTEgPSAgIEJ1IF4oKH5CYSkmICBCZSApOworCisgICAgICAgICAgICBCYSA9IChBYmExXkRhMSk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBbWUwXkRlMSksIDIyKTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFnaTBeRGkwKSwgMjEpOworICAgICAgICAgICAgQm8gPSBST0wzMigoQXNvMF5EbzApLCAxMCk7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBa3UwXkR1MSksIDcpOworICAgICAgICAgICAgQWJhMSA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBYmExIF49ICoocFJvdW5kQ29uc3RhbnRzKyspOworICAgICAgICAgICAgQW1lMCA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBZ2kwID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFzbzAgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQWt1MCA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFzYTFeRGExKSwgMik7CisgICAgICAgICAgICBCbyA9IFJPTDMyKChBa2UxXkRlMSksIDIzKTsKKyAgICAgICAgICAgIEJ1ID0gUk9MMzIoKEFiaTFeRGkxKSwgMzEpOworICAgICAgICAgICAgQmEgPSBST0wzMigoQW1vMV5EbzApLCAxNCk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBZ3UwXkR1MCksIDEwKTsKKyAgICAgICAgICAgIEFzYTEgPSAgIEJhIF4oKH5CZSkmICBCaSApOworICAgICAgICAgICAgQWtlMSA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBYmkxID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFtbzEgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQWd1MCA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFzYTBeRGEwKSwgMSk7CisgICAgICAgICAgICBCbyA9IFJPTDMyKChBa2UwXkRlMCksIDIyKTsKKyAgICAgICAgICAgIEJ1ID0gUk9MMzIoKEFiaTBeRGkwKSwgMzApOworICAgICAgICAgICAgQmEgPSBST0wzMigoQW1vMF5EbzEpLCAxNCk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBZ3UxXkR1MSksIDEwKTsKKyAgICAgICAgICAgIEFzYTAgPSAgIEJhIF4oKH5CZSkmICBCaSApOworICAgICAgICAgICAgQWtlMCA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBYmkwID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFtbzAgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQWd1MSA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEJ1ID0gUk9MMzIoKEFtYTFeRGEwKSwgOSk7CisgICAgICAgICAgICBCYSA9IFJPTDMyKChBZ2UxXkRlMSksIDEpOworICAgICAgICAgICAgQmUgPSBST0wzMigoQXNpMV5EaTApLCAzKTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFrbzBeRG8xKSwgMTMpOworICAgICAgICAgICAgQm8gPSBST0wzMigoQWJ1MV5EdTApLCA0KTsKKyAgICAgICAgICAgIEFtYTEgPSAgIEJhIF4oKH5CZSkmICBCaSApOworICAgICAgICAgICAgQWdlMSA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBc2kxID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFrbzAgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQWJ1MSA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEJ1ID0gUk9MMzIoKEFtYTBeRGExKSwgOSk7CisgICAgICAgICAgICBCYSA9IChBZ2UwXkRlMCk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBc2kwXkRpMSksIDMpOworICAgICAgICAgICAgQmkgPSBST0wzMigoQWtvMV5EbzApLCAxMik7CisgICAgICAgICAgICBCbyA9IFJPTDMyKChBYnUwXkR1MSksIDQpOworICAgICAgICAgICAgQW1hMCA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBZ2UwID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFzaTAgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWtvMSA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBYnUwID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQmUgPSBST0wzMigoQWthMV5EYTApLCAxOCk7CisgICAgICAgICAgICBCaSA9IFJPTDMyKChBYmUxXkRlMCksIDUpOworICAgICAgICAgICAgQm8gPSBST0wzMigoQW1pMF5EaTEpLCA4KTsKKyAgICAgICAgICAgIEJ1ID0gUk9MMzIoKEFnbzFeRG8wKSwgMjgpOworICAgICAgICAgICAgQmEgPSBST0wzMigoQXN1MV5EdTEpLCAxNCk7CisgICAgICAgICAgICBBa2ExID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFiZTEgPSAgIEJlIF4oKH5CaSkmICBCbyApOworICAgICAgICAgICAgQW1pMCA9ICAgQmkgXigofkJvKSYgIEJ1ICk7CisgICAgICAgICAgICBBZ28xID0gICBCbyBeKCh+QnUpJiAgQmEgKTsKKyAgICAgICAgICAgIEFzdTEgPSAgIEJ1IF4oKH5CYSkmICBCZSApOworCisgICAgICAgICAgICBCZSA9IFJPTDMyKChBa2EwXkRhMSksIDE4KTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFiZTBeRGUxKSwgNSk7CisgICAgICAgICAgICBCbyA9IFJPTDMyKChBbWkxXkRpMCksIDcpOworICAgICAgICAgICAgQnUgPSBST0wzMigoQWdvMF5EbzEpLCAyOCk7CisgICAgICAgICAgICBCYSA9IFJPTDMyKChBc3UwXkR1MCksIDEzKTsKKyAgICAgICAgICAgIEFrYTAgPSAgIEJhIF4oKH5CZSkmICBCaSApOworICAgICAgICAgICAgQWJlMCA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBbWkxID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFnbzAgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQXN1MCA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFnYTFeRGExKSwgMjEpOworICAgICAgICAgICAgQnUgPSBST0wzMigoQXNlMF5EZTApLCAxKTsKKyAgICAgICAgICAgIEJhID0gUk9MMzIoKEFraTFeRGkwKSwgMzEpOworICAgICAgICAgICAgQmUgPSBST0wzMigoQWJvMV5EbzEpLCAyOCk7CisgICAgICAgICAgICBCaSA9IFJPTDMyKChBbXUxXkR1MSksIDIwKTsKKyAgICAgICAgICAgIEFnYTEgPSAgIEJhIF4oKH5CZSkmICBCaSApOworICAgICAgICAgICAgQXNlMCA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBa2kxID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFibzEgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQW11MSA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFnYTBeRGEwKSwgMjApOworICAgICAgICAgICAgQnUgPSBST0wzMigoQXNlMV5EZTEpLCAxKTsKKyAgICAgICAgICAgIEJhID0gUk9MMzIoKEFraTBeRGkxKSwgMzEpOworICAgICAgICAgICAgQmUgPSBST0wzMigoQWJvMF5EbzApLCAyNyk7CisgICAgICAgICAgICBCaSA9IFJPTDMyKChBbXUwXkR1MCksIDE5KTsKKyAgICAgICAgICAgIEFnYTAgPSAgIEJhIF4oKH5CZSkmICBCaSApOworICAgICAgICAgICAgQXNlMSA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBa2kwID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFibzAgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQW11MCA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEtlY2Nha0F0b0Rfcm91bmQyKCk7CisKKyAgICAgICAgICAgIEJhID0gKEFiYTBeRGEwKTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFrZTFeRGUwKSwgMjIpOworICAgICAgICAgICAgQmkgPSBST0wzMigoQXNpMF5EaTEpLCAyMik7CisgICAgICAgICAgICBCbyA9IFJPTDMyKChBZ28wXkRvMSksIDExKTsKKyAgICAgICAgICAgIEJ1ID0gUk9MMzIoKEFtdTFeRHUwKSwgNyk7CisgICAgICAgICAgICBBYmEwID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFiYTAgXj0gKihwUm91bmRDb25zdGFudHMrKyk7CisgICAgICAgICAgICBBa2UxID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFzaTAgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWdvMCA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBbXUxID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQmEgPSAoQWJhMV5EYTEpOworICAgICAgICAgICAgQmUgPSBST0wzMigoQWtlMF5EZTEpLCAyMik7CisgICAgICAgICAgICBCaSA9IFJPTDMyKChBc2kxXkRpMCksIDIxKTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFnbzFeRG8wKSwgMTApOworICAgICAgICAgICAgQnUgPSBST0wzMigoQW11MF5EdTEpLCA3KTsKKyAgICAgICAgICAgIEFiYTEgPSAgIEJhIF4oKH5CZSkmICBCaSApOworICAgICAgICAgICAgQWJhMSBePSAqKHBSb3VuZENvbnN0YW50cysrKTsKKyAgICAgICAgICAgIEFrZTAgPSAgIEJlIF4oKH5CaSkmICBCbyApOworICAgICAgICAgICAgQXNpMSA9ICAgQmkgXigofkJvKSYgIEJ1ICk7CisgICAgICAgICAgICBBZ28xID0gICBCbyBeKCh+QnUpJiAgQmEgKTsKKyAgICAgICAgICAgIEFtdTAgPSAgIEJ1IF4oKH5CYSkmICBCZSApOworCisgICAgICAgICAgICBCaSA9IFJPTDMyKChBbWEwXkRhMSksIDIpOworICAgICAgICAgICAgQm8gPSBST0wzMigoQWJlMF5EZTEpLCAyMyk7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBa2kwXkRpMSksIDMxKTsKKyAgICAgICAgICAgIEJhID0gUk9MMzIoKEFzbzFeRG8wKSwgMTQpOworICAgICAgICAgICAgQmUgPSBST0wzMigoQWd1MF5EdTApLCAxMCk7CisgICAgICAgICAgICBBbWEwID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFiZTAgPSAgIEJlIF4oKH5CaSkmICBCbyApOworICAgICAgICAgICAgQWtpMCA9ICAgQmkgXigofkJvKSYgIEJ1ICk7CisgICAgICAgICAgICBBc28xID0gICBCbyBeKCh+QnUpJiAgQmEgKTsKKyAgICAgICAgICAgIEFndTAgPSAgIEJ1IF4oKH5CYSkmICBCZSApOworCisgICAgICAgICAgICBCaSA9IFJPTDMyKChBbWExXkRhMCksIDEpOworICAgICAgICAgICAgQm8gPSBST0wzMigoQWJlMV5EZTApLCAyMik7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBa2kxXkRpMCksIDMwKTsKKyAgICAgICAgICAgIEJhID0gUk9MMzIoKEFzbzBeRG8xKSwgMTQpOworICAgICAgICAgICAgQmUgPSBST0wzMigoQWd1MV5EdTEpLCAxMCk7CisgICAgICAgICAgICBBbWExID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFiZTEgPSAgIEJlIF4oKH5CaSkmICBCbyApOworICAgICAgICAgICAgQWtpMSA9ICAgQmkgXigofkJvKSYgIEJ1ICk7CisgICAgICAgICAgICBBc28wID0gICBCbyBeKCh+QnUpJiAgQmEgKTsKKyAgICAgICAgICAgIEFndTEgPSAgIEJ1IF4oKH5CYSkmICBCZSApOworCisgICAgICAgICAgICBCdSA9IFJPTDMyKChBZ2ExXkRhMCksIDkpOworICAgICAgICAgICAgQmEgPSBST0wzMigoQW1lMF5EZTEpLCAxKTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFiaTFeRGkwKSwgMyk7CisgICAgICAgICAgICBCaSA9IFJPTDMyKChBa28xXkRvMSksIDEzKTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFzdTFeRHUwKSwgNCk7CisgICAgICAgICAgICBBZ2ExID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFtZTAgPSAgIEJlIF4oKH5CaSkmICBCbyApOworICAgICAgICAgICAgQWJpMSA9ICAgQmkgXigofkJvKSYgIEJ1ICk7CisgICAgICAgICAgICBBa28xID0gICBCbyBeKCh+QnUpJiAgQmEgKTsKKyAgICAgICAgICAgIEFzdTEgPSAgIEJ1IF4oKH5CYSkmICBCZSApOworCisgICAgICAgICAgICBCdSA9IFJPTDMyKChBZ2EwXkRhMSksIDkpOworICAgICAgICAgICAgQmEgPSAoQW1lMV5EZTApOworICAgICAgICAgICAgQmUgPSBST0wzMigoQWJpMF5EaTEpLCAzKTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFrbzBeRG8wKSwgMTIpOworICAgICAgICAgICAgQm8gPSBST0wzMigoQXN1MF5EdTEpLCA0KTsKKyAgICAgICAgICAgIEFnYTAgPSAgIEJhIF4oKH5CZSkmICBCaSApOworICAgICAgICAgICAgQW1lMSA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBYmkwID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFrbzAgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQXN1MCA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFzYTFeRGEwKSwgMTgpOworICAgICAgICAgICAgQmkgPSBST0wzMigoQWdlMV5EZTApLCA1KTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFtaTFeRGkxKSwgOCk7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBYm8xXkRvMCksIDI4KTsKKyAgICAgICAgICAgIEJhID0gUk9MMzIoKEFrdTBeRHUxKSwgMTQpOworICAgICAgICAgICAgQXNhMSA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBZ2UxID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFtaTEgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWJvMSA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBa3UwID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQmUgPSBST0wzMigoQXNhMF5EYTEpLCAxOCk7CisgICAgICAgICAgICBCaSA9IFJPTDMyKChBZ2UwXkRlMSksIDUpOworICAgICAgICAgICAgQm8gPSBST0wzMigoQW1pMF5EaTApLCA3KTsKKyAgICAgICAgICAgIEJ1ID0gUk9MMzIoKEFibzBeRG8xKSwgMjgpOworICAgICAgICAgICAgQmEgPSBST0wzMigoQWt1MV5EdTApLCAxMyk7CisgICAgICAgICAgICBBc2EwID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFnZTAgPSAgIEJlIF4oKH5CaSkmICBCbyApOworICAgICAgICAgICAgQW1pMCA9ICAgQmkgXigofkJvKSYgIEJ1ICk7CisgICAgICAgICAgICBBYm8wID0gICBCbyBeKCh+QnUpJiAgQmEgKTsKKyAgICAgICAgICAgIEFrdTEgPSAgIEJ1IF4oKH5CYSkmICBCZSApOworCisgICAgICAgICAgICBCbyA9IFJPTDMyKChBa2EwXkRhMSksIDIxKTsKKyAgICAgICAgICAgIEJ1ID0gUk9MMzIoKEFzZTBeRGUwKSwgMSk7CisgICAgICAgICAgICBCYSA9IFJPTDMyKChBZ2kxXkRpMCksIDMxKTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFtbzBeRG8xKSwgMjgpOworICAgICAgICAgICAgQmkgPSBST0wzMigoQWJ1MF5EdTEpLCAyMCk7CisgICAgICAgICAgICBBa2EwID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFzZTAgPSAgIEJlIF4oKH5CaSkmICBCbyApOworICAgICAgICAgICAgQWdpMSA9ICAgQmkgXigofkJvKSYgIEJ1ICk7CisgICAgICAgICAgICBBbW8wID0gICBCbyBeKCh+QnUpJiAgQmEgKTsKKyAgICAgICAgICAgIEFidTAgPSAgIEJ1IF4oKH5CYSkmICBCZSApOworCisgICAgICAgICAgICBCbyA9IFJPTDMyKChBa2ExXkRhMCksIDIwKTsKKyAgICAgICAgICAgIEJ1ID0gUk9MMzIoKEFzZTFeRGUxKSwgMSk7CisgICAgICAgICAgICBCYSA9IFJPTDMyKChBZ2kwXkRpMSksIDMxKTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFtbzFeRG8wKSwgMjcpOworICAgICAgICAgICAgQmkgPSBST0wzMigoQWJ1MV5EdTApLCAxOSk7CisgICAgICAgICAgICBBa2ExID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFzZTEgPSAgIEJlIF4oKH5CaSkmICBCbyApOworICAgICAgICAgICAgQWdpMCA9ICAgQmkgXigofkJvKSYgIEJ1ICk7CisgICAgICAgICAgICBBbW8xID0gICBCbyBeKCh+QnUpJiAgQmEgKTsKKyAgICAgICAgICAgIEFidTEgPSAgIEJ1IF4oKH5CYSkmICBCZSApOworCisgICAgICAgICAgICBLZWNjYWtBdG9EX3JvdW5kMygpOworCisgICAgICAgICAgICBCYSA9IChBYmEwXkRhMCk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBYmUwXkRlMCksIDIyKTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFiaTBeRGkxKSwgMjIpOworICAgICAgICAgICAgQm8gPSBST0wzMigoQWJvMF5EbzEpLCAxMSk7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBYnUwXkR1MCksIDcpOworICAgICAgICAgICAgQWJhMCA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBYmEwIF49ICoocFJvdW5kQ29uc3RhbnRzKyspOworICAgICAgICAgICAgQWJlMCA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBYmkwID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFibzAgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQWJ1MCA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEJhID0gKEFiYTFeRGExKTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFiZTFeRGUxKSwgMjIpOworICAgICAgICAgICAgQmkgPSBST0wzMigoQWJpMV5EaTApLCAyMSk7CisgICAgICAgICAgICBCbyA9IFJPTDMyKChBYm8xXkRvMCksIDEwKTsKKyAgICAgICAgICAgIEJ1ID0gUk9MMzIoKEFidTFeRHUxKSwgNyk7CisgICAgICAgICAgICBBYmExID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFiYTEgXj0gKihwUm91bmRDb25zdGFudHMrKyk7CisgICAgICAgICAgICBBYmUxID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFiaTEgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWJvMSA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBYnUxID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQmkgPSBST0wzMigoQWdhMF5EYTEpLCAyKTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFnZTBeRGUxKSwgMjMpOworICAgICAgICAgICAgQnUgPSBST0wzMigoQWdpMF5EaTEpLCAzMSk7CisgICAgICAgICAgICBCYSA9IFJPTDMyKChBZ28wXkRvMCksIDE0KTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFndTBeRHUwKSwgMTApOworICAgICAgICAgICAgQWdhMCA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBZ2UwID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFnaTAgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWdvMCA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBZ3UwID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQmkgPSBST0wzMigoQWdhMV5EYTApLCAxKTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFnZTFeRGUwKSwgMjIpOworICAgICAgICAgICAgQnUgPSBST0wzMigoQWdpMV5EaTApLCAzMCk7CisgICAgICAgICAgICBCYSA9IFJPTDMyKChBZ28xXkRvMSksIDE0KTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFndTFeRHUxKSwgMTApOworICAgICAgICAgICAgQWdhMSA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBZ2UxID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFnaTEgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWdvMSA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBZ3UxID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQnUgPSBST0wzMigoQWthMF5EYTApLCA5KTsKKyAgICAgICAgICAgIEJhID0gUk9MMzIoKEFrZTBeRGUxKSwgMSk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBa2kwXkRpMCksIDMpOworICAgICAgICAgICAgQmkgPSBST0wzMigoQWtvMF5EbzEpLCAxMyk7CisgICAgICAgICAgICBCbyA9IFJPTDMyKChBa3UwXkR1MCksIDQpOworICAgICAgICAgICAgQWthMCA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBa2UwID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFraTAgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQWtvMCA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBa3UwID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQnUgPSBST0wzMigoQWthMV5EYTEpLCA5KTsKKyAgICAgICAgICAgIEJhID0gKEFrZTFeRGUwKTsKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFraTFeRGkxKSwgMyk7CisgICAgICAgICAgICBCaSA9IFJPTDMyKChBa28xXkRvMCksIDEyKTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFrdTFeRHUxKSwgNCk7CisgICAgICAgICAgICBBa2ExID0gICBCYSBeKCh+QmUpJiAgQmkgKTsKKyAgICAgICAgICAgIEFrZTEgPSAgIEJlIF4oKH5CaSkmICBCbyApOworICAgICAgICAgICAgQWtpMSA9ICAgQmkgXigofkJvKSYgIEJ1ICk7CisgICAgICAgICAgICBBa28xID0gICBCbyBeKCh+QnUpJiAgQmEgKTsKKyAgICAgICAgICAgIEFrdTEgPSAgIEJ1IF4oKH5CYSkmICBCZSApOworCisgICAgICAgICAgICBCZSA9IFJPTDMyKChBbWEwXkRhMCksIDE4KTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFtZTBeRGUwKSwgNSk7CisgICAgICAgICAgICBCbyA9IFJPTDMyKChBbWkwXkRpMSksIDgpOworICAgICAgICAgICAgQnUgPSBST0wzMigoQW1vMF5EbzApLCAyOCk7CisgICAgICAgICAgICBCYSA9IFJPTDMyKChBbXUwXkR1MSksIDE0KTsKKyAgICAgICAgICAgIEFtYTAgPSAgIEJhIF4oKH5CZSkmICBCaSApOworICAgICAgICAgICAgQW1lMCA9ICAgQmUgXigofkJpKSYgIEJvICk7CisgICAgICAgICAgICBBbWkwID0gICBCaSBeKCh+Qm8pJiAgQnUgKTsKKyAgICAgICAgICAgIEFtbzAgPSAgIEJvIF4oKH5CdSkmICBCYSApOworICAgICAgICAgICAgQW11MCA9ICAgQnUgXigofkJhKSYgIEJlICk7CisKKyAgICAgICAgICAgIEJlID0gUk9MMzIoKEFtYTFeRGExKSwgMTgpOworICAgICAgICAgICAgQmkgPSBST0wzMigoQW1lMV5EZTEpLCA1KTsKKyAgICAgICAgICAgIEJvID0gUk9MMzIoKEFtaTFeRGkwKSwgNyk7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBbW8xXkRvMSksIDI4KTsKKyAgICAgICAgICAgIEJhID0gUk9MMzIoKEFtdTFeRHUwKSwgMTMpOworICAgICAgICAgICAgQW1hMSA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBbWUxID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFtaTEgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQW1vMSA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBbXUxID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQm8gPSBST0wzMigoQXNhMF5EYTEpLCAyMSk7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBc2UwXkRlMCksIDEpOworICAgICAgICAgICAgQmEgPSBST0wzMigoQXNpMF5EaTApLCAzMSk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBc28wXkRvMSksIDI4KTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFzdTBeRHUxKSwgMjApOworICAgICAgICAgICAgQXNhMCA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBc2UwID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFzaTAgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQXNvMCA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBc3UwID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKworICAgICAgICAgICAgQm8gPSBST0wzMigoQXNhMV5EYTApLCAyMCk7CisgICAgICAgICAgICBCdSA9IFJPTDMyKChBc2UxXkRlMSksIDEpOworICAgICAgICAgICAgQmEgPSBST0wzMigoQXNpMV5EaTEpLCAzMSk7CisgICAgICAgICAgICBCZSA9IFJPTDMyKChBc28xXkRvMCksIDI3KTsKKyAgICAgICAgICAgIEJpID0gUk9MMzIoKEFzdTFeRHUwKSwgMTkpOworICAgICAgICAgICAgQXNhMSA9ICAgQmEgXigofkJlKSYgIEJpICk7CisgICAgICAgICAgICBBc2UxID0gICBCZSBeKCh+QmkpJiAgQm8gKTsKKyAgICAgICAgICAgIEFzaTEgPSAgIEJpIF4oKH5CbykmICBCdSApOworICAgICAgICAgICAgQXNvMSA9ICAgQm8gXigofkJ1KSYgIEJhICk7CisgICAgICAgICAgICBBc3UxID0gICBCdSBeKCh+QmEpJiAgQmUgKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoICpwUm91bmRDb25zdGFudHMgIT0gMHhGRiApOworCisgICAgICAgICN1bmRlZiBBYmEwCisgICAgICAgICN1bmRlZiBBYmExCisgICAgICAgICN1bmRlZiBBYmUwCisgICAgICAgICN1bmRlZiBBYmUxCisgICAgICAgICN1bmRlZiBBYmkwCisgICAgICAgICN1bmRlZiBBYmkxCisgICAgICAgICN1bmRlZiBBYm8wCisgICAgICAgICN1bmRlZiBBYm8xCisgICAgICAgICN1bmRlZiBBYnUwCisgICAgICAgICN1bmRlZiBBYnUxCisgICAgICAgICN1bmRlZiBBZ2EwCisgICAgICAgICN1bmRlZiBBZ2ExCisgICAgICAgICN1bmRlZiBBZ2UwCisgICAgICAgICN1bmRlZiBBZ2UxCisgICAgICAgICN1bmRlZiBBZ2kwCisgICAgICAgICN1bmRlZiBBZ2kxCisgICAgICAgICN1bmRlZiBBZ28wCisgICAgICAgICN1bmRlZiBBZ28xCisgICAgICAgICN1bmRlZiBBZ3UwCisgICAgICAgICN1bmRlZiBBZ3UxCisgICAgICAgICN1bmRlZiBBa2EwCisgICAgICAgICN1bmRlZiBBa2ExCisgICAgICAgICN1bmRlZiBBa2UwCisgICAgICAgICN1bmRlZiBBa2UxCisgICAgICAgICN1bmRlZiBBa2kwCisgICAgICAgICN1bmRlZiBBa2kxCisgICAgICAgICN1bmRlZiBBa28wCisgICAgICAgICN1bmRlZiBBa28xCisgICAgICAgICN1bmRlZiBBa3UwCisgICAgICAgICN1bmRlZiBBa3UxCisgICAgICAgICN1bmRlZiBBbWEwCisgICAgICAgICN1bmRlZiBBbWExCisgICAgICAgICN1bmRlZiBBbWUwCisgICAgICAgICN1bmRlZiBBbWUxCisgICAgICAgICN1bmRlZiBBbWkwCisgICAgICAgICN1bmRlZiBBbWkxCisgICAgICAgICN1bmRlZiBBbW8wCisgICAgICAgICN1bmRlZiBBbW8xCisgICAgICAgICN1bmRlZiBBbXUwCisgICAgICAgICN1bmRlZiBBbXUxCisgICAgICAgICN1bmRlZiBBc2EwCisgICAgICAgICN1bmRlZiBBc2ExCisgICAgICAgICN1bmRlZiBBc2UwCisgICAgICAgICN1bmRlZiBBc2UxCisgICAgICAgICN1bmRlZiBBc2kwCisgICAgICAgICN1bmRlZiBBc2kxCisgICAgICAgICN1bmRlZiBBc28wCisgICAgICAgICN1bmRlZiBBc28xCisgICAgICAgICN1bmRlZiBBc3UwCisgICAgICAgICN1bmRlZiBBc3UxCisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgS2VjY2FrUDE2MDBfUGVybXV0ZV8xMnJvdW5kcyh2b2lkICpzdGF0ZSkKK3sKKyAgICAgS2VjY2FrUDE2MDBfUGVybXV0ZV9Ocm91bmRzKHN0YXRlLCAxMik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBLZWNjYWtQMTYwMF9QZXJtdXRlXzI0cm91bmRzKHZvaWQgKnN0YXRlKQoreworICAgICBLZWNjYWtQMTYwMF9QZXJtdXRlX05yb3VuZHMoc3RhdGUsIDI0KTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha1AtMTYwMC1vcHQ2NC1jb25maWcuaCBiL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha1AtMTYwMC1vcHQ2NC1jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTAxYzY0Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrUC0xNjAwLW9wdDY0LWNvbmZpZy5oCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBLZWNjYWtQMTYwMF9pbXBsZW1lbnRhdGlvbl9jb25maWcgImxhbmUgY29tcGxlbWVudGluZywgYWxsIHJvdW5kcyB1bnJvbGxlZCIKKyNkZWZpbmUgS2VjY2FrUDE2MDBfZnVsbFVucm9sbGluZworI2RlZmluZSBLZWNjYWtQMTYwMF91c2VMYW5lQ29tcGxlbWVudGluZwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrUC0xNjAwLW9wdDY0LmMgYi9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtQLTE2MDAtb3B0NjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTAwMTBkCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrUC0xNjAwLW9wdDY0LmMKQEAgLTAsMCArMSw0NzQgQEAKKy8qCitJbXBsZW1lbnRhdGlvbiBieSB0aGUgS2VjY2FrLCBLZXlhayBhbmQgS2V0amUgVGVhbXMsIG5hbWVseSwgR3VpZG8gQmVydG9uaSwKK0pvYW4gRGFlbWVuLCBNaWNoYcOrbCBQZWV0ZXJzLCBHaWxsZXMgVmFuIEFzc2NoZSBhbmQgUm9ubnkgVmFuIEtlZXIsIGhlcmVieQorZGVub3RlZCBhcyAidGhlIGltcGxlbWVudGVyIi4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIGZlZWRiYWNrIG9yIHF1ZXN0aW9ucywgcGxlYXNlIHJlZmVyIHRvIG91ciB3ZWJzaXRlczoKK2h0dHA6Ly9rZWNjYWsubm9la2Vvbi5vcmcvCitodHRwOi8va2V5YWsubm9la2Vvbi5vcmcvCitodHRwOi8va2V0amUubm9la2Vvbi5vcmcvCisKK1RvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgaW1wbGVtZW50ZXIgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0CithbmQgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhlIHNvdXJjZSBjb2RlIGluIHRoaXMgZmlsZS4KK2h0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KKyovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKy8qICNpbmNsdWRlICJicmdfZW5kaWFuLmgiICovCisjaW5jbHVkZSAiS2VjY2FrUC0xNjAwLW9wdDY0LWNvbmZpZy5oIgorCisjaWYgTk9UX1BZVEhPTgordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJTlQ4OworLyogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IFVJTlQ2NDsgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChLZWNjYWtQMTYwMF91c2VMYW5lQ29tcGxlbWVudGluZykKKyNkZWZpbmUgVXNlQmViaWdva2ltaXNhCisjZW5kaWYKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIFJPTDY0KGEsIG9mZnNldCkgX3JvdGw2NChhLCBvZmZzZXQpCisjZWxpZiBkZWZpbmVkKEtlY2Nha1AxNjAwX3VzZVNITEQpCisgICAgI2RlZmluZSBST0w2NCh4LE4pICh7IFwKKyAgICByZWdpc3RlciBVSU5UNjQgX19vdXQ7IFwKKyAgICByZWdpc3RlciBVSU5UNjQgX19pbiA9IHg7IFwKKyAgICBfX2FzbV9fICgic2hsZCAlMiwlMCwlMCIgOiAiPXIiKF9fb3V0KSA6ICIwIihfX2luKSwgImkiKE4pKTsgXAorICAgIF9fb3V0OyBcCisgICAgfSkKKyNlbHNlCisjZGVmaW5lIFJPTDY0KGEsIG9mZnNldCkgKCgoKFVJTlQ2NClhKSA8PCBvZmZzZXQpIF4gKCgoVUlOVDY0KWEpID4+ICg2NC1vZmZzZXQpKSkKKyNlbmRpZgorCisjaW5jbHVkZSAiS2VjY2FrUC0xNjAwLTY0Lm1hY3JvcyIKKyNpZmRlZiBLZWNjYWtQMTYwMF9mdWxsVW5yb2xsaW5nCisjZGVmaW5lIEZ1bGxVbnJvbGxpbmcKKyNlbHNlCisjZGVmaW5lIFVucm9sbGluZyBLZWNjYWtQMTYwMF91bnJvbGxpbmcKKyNlbmRpZgorI2luY2x1ZGUgIktlY2Nha1AtMTYwMC11bnJvbGxpbmcubWFjcm9zIgorI2luY2x1ZGUgIlNuUC1SZWxhbmVkLmgiCisKK3N0YXRpYyBjb25zdCBVSU5UNjQgS2VjY2FrRjE2MDBSb3VuZENvbnN0YW50c1syNF0gPSB7CisgICAgMHgwMDAwMDAwMDAwMDAwMDAxVUxMLAorICAgIDB4MDAwMDAwMDAwMDAwODA4MlVMTCwKKyAgICAweDgwMDAwMDAwMDAwMDgwOGFVTEwsCisgICAgMHg4MDAwMDAwMDgwMDA4MDAwVUxMLAorICAgIDB4MDAwMDAwMDAwMDAwODA4YlVMTCwKKyAgICAweDAwMDAwMDAwODAwMDAwMDFVTEwsCisgICAgMHg4MDAwMDAwMDgwMDA4MDgxVUxMLAorICAgIDB4ODAwMDAwMDAwMDAwODAwOVVMTCwKKyAgICAweDAwMDAwMDAwMDAwMDAwOGFVTEwsCisgICAgMHgwMDAwMDAwMDAwMDAwMDg4VUxMLAorICAgIDB4MDAwMDAwMDA4MDAwODAwOVVMTCwKKyAgICAweDAwMDAwMDAwODAwMDAwMGFVTEwsCisgICAgMHgwMDAwMDAwMDgwMDA4MDhiVUxMLAorICAgIDB4ODAwMDAwMDAwMDAwMDA4YlVMTCwKKyAgICAweDgwMDAwMDAwMDAwMDgwODlVTEwsCisgICAgMHg4MDAwMDAwMDAwMDA4MDAzVUxMLAorICAgIDB4ODAwMDAwMDAwMDAwODAwMlVMTCwKKyAgICAweDgwMDAwMDAwMDAwMDAwODBVTEwsCisgICAgMHgwMDAwMDAwMDAwMDA4MDBhVUxMLAorICAgIDB4ODAwMDAwMDA4MDAwMDAwYVVMTCwKKyAgICAweDgwMDAwMDAwODAwMDgwODFVTEwsCisgICAgMHg4MDAwMDAwMDAwMDA4MDgwVUxMLAorICAgIDB4MDAwMDAwMDA4MDAwMDAwMVVMTCwKKyAgICAweDgwMDAwMDAwODAwMDgwMDhVTEwgfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0luaXRpYWxpemUodm9pZCAqc3RhdGUpCit7CisgICAgbWVtc2V0KHN0YXRlLCAwLCAyMDApOworI2lmZGVmIEtlY2Nha1AxNjAwX3VzZUxhbmVDb21wbGVtZW50aW5nCisgICAgKChVSU5UNjQqKXN0YXRlKVsgMV0gPSB+KFVJTlQ2NCkwOworICAgICgoVUlOVDY0KilzdGF0ZSlbIDJdID0gfihVSU5UNjQpMDsKKyAgICAoKFVJTlQ2NCopc3RhdGUpWyA4XSA9IH4oVUlOVDY0KTA7CisgICAgKChVSU5UNjQqKXN0YXRlKVsxMl0gPSB+KFVJTlQ2NCkwOworICAgICgoVUlOVDY0KilzdGF0ZSlbMTddID0gfihVSU5UNjQpMDsKKyAgICAoKFVJTlQ2NCopc3RhdGUpWzIwXSA9IH4oVUlOVDY0KTA7CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0FkZEJ5dGVzSW5MYW5lKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBpbnQgbGFuZVBvc2l0aW9uLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworI2lmIChQTEFURk9STV9CWVRFX09SREVSID09IElTX0xJVFRMRV9FTkRJQU4pCisgICAgVUlOVDY0IGxhbmU7CisgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGxlbmd0aCA9PSAxKQorICAgICAgICBsYW5lID0gZGF0YVswXTsKKyAgICBlbHNlIHsKKyAgICAgICAgbGFuZSA9IDA7CisgICAgICAgIG1lbWNweSgmbGFuZSwgZGF0YSwgbGVuZ3RoKTsKKyAgICB9CisgICAgbGFuZSA8PD0gb2Zmc2V0Kjg7CisjZWxzZQorICAgIFVJTlQ2NCBsYW5lID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgICAgICBsYW5lIHw9ICgoVUlOVDY0KWRhdGFbaV0pIDw8ICgoaStvZmZzZXQpKjgpOworI2VuZGlmCisgICAgKChVSU5UNjQqKXN0YXRlKVtsYW5lUG9zaXRpb25dIF49IGxhbmU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBLZWNjYWtQMTYwMF9BZGRMYW5lcyh2b2lkICpzdGF0ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGxhbmVDb3VudCkKK3sKKyNpZiAoUExBVEZPUk1fQllURV9PUkRFUiA9PSBJU19MSVRUTEVfRU5ESUFOKQorICAgIHVuc2lnbmVkIGludCBpID0gMDsKKyNpZmRlZiBOT19NSVNBTElHTkVEX0FDQ0VTU0VTCisgICAgLyogSWYgZWl0aGVyIHBvaW50ZXIgaXMgbWlzYWxpZ25lZCwgZmFsbCBiYWNrIHRvIGJ5dGUtd2lzZSB4b3IuICovCisKKyAgICBpZiAoKCgoKHVpbnRwdHJfdClzdGF0ZSkgJiA3KSAhPSAwKSB8fCAoKCgodWludHB0cl90KWRhdGEpICYgNykgIT0gMCkpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsYW5lQ291bnQgKiA4OyBpKyspIHsKKyAgICAgICAgKCh1bnNpZ25lZCBjaGFyKilzdGF0ZSlbaV0gXj0gZGF0YVtpXTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgLyogT3RoZXJ3aXNlLi4uICovCisKKyAgICAgIGZvciggOyAoaSs4KTw9bGFuZUNvdW50OyBpKz04KSB7CisgICAgICAgICAgKChVSU5UNjQqKXN0YXRlKVtpKzBdIF49ICgoVUlOVDY0KilkYXRhKVtpKzBdOworICAgICAgICAgICgoVUlOVDY0KilzdGF0ZSlbaSsxXSBePSAoKFVJTlQ2NCopZGF0YSlbaSsxXTsKKyAgICAgICAgICAoKFVJTlQ2NCopc3RhdGUpW2krMl0gXj0gKChVSU5UNjQqKWRhdGEpW2krMl07CisgICAgICAgICAgKChVSU5UNjQqKXN0YXRlKVtpKzNdIF49ICgoVUlOVDY0KilkYXRhKVtpKzNdOworICAgICAgICAgICgoVUlOVDY0KilzdGF0ZSlbaSs0XSBePSAoKFVJTlQ2NCopZGF0YSlbaSs0XTsKKyAgICAgICAgICAoKFVJTlQ2NCopc3RhdGUpW2krNV0gXj0gKChVSU5UNjQqKWRhdGEpW2krNV07CisgICAgICAgICAgKChVSU5UNjQqKXN0YXRlKVtpKzZdIF49ICgoVUlOVDY0KilkYXRhKVtpKzZdOworICAgICAgICAgICgoVUlOVDY0KilzdGF0ZSlbaSs3XSBePSAoKFVJTlQ2NCopZGF0YSlbaSs3XTsKKyAgICAgIH0KKyAgICAgIGZvciggOyAoaSs0KTw9bGFuZUNvdW50OyBpKz00KSB7CisgICAgICAgICAgKChVSU5UNjQqKXN0YXRlKVtpKzBdIF49ICgoVUlOVDY0KilkYXRhKVtpKzBdOworICAgICAgICAgICgoVUlOVDY0KilzdGF0ZSlbaSsxXSBePSAoKFVJTlQ2NCopZGF0YSlbaSsxXTsKKyAgICAgICAgICAoKFVJTlQ2NCopc3RhdGUpW2krMl0gXj0gKChVSU5UNjQqKWRhdGEpW2krMl07CisgICAgICAgICAgKChVSU5UNjQqKXN0YXRlKVtpKzNdIF49ICgoVUlOVDY0KilkYXRhKVtpKzNdOworICAgICAgfQorICAgICAgZm9yKCA7IChpKzIpPD1sYW5lQ291bnQ7IGkrPTIpIHsKKyAgICAgICAgICAoKFVJTlQ2NCopc3RhdGUpW2krMF0gXj0gKChVSU5UNjQqKWRhdGEpW2krMF07CisgICAgICAgICAgKChVSU5UNjQqKXN0YXRlKVtpKzFdIF49ICgoVUlOVDY0KilkYXRhKVtpKzFdOworICAgICAgfQorICAgICAgaWYgKGk8bGFuZUNvdW50KSB7CisgICAgICAgICAgKChVSU5UNjQqKXN0YXRlKVtpKzBdIF49ICgoVUlOVDY0KilkYXRhKVtpKzBdOworICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgdW5zaWduZWQgaW50IGk7CisgICAgVUlOVDggKmN1ckRhdGEgPSBkYXRhOworICAgIGZvcihpPTA7IGk8bGFuZUNvdW50OyBpKyssIGN1ckRhdGErPTgpIHsKKyAgICAgICAgVUlOVDY0IGxhbmUgPSAoVUlOVDY0KWN1ckRhdGFbMF0KKyAgICAgICAgICAgIHwgKChVSU5UNjQpY3VyRGF0YVsxXSA8PCA4KQorICAgICAgICAgICAgfCAoKFVJTlQ2NCljdXJEYXRhWzJdIDw8IDE2KQorICAgICAgICAgICAgfCAoKFVJTlQ2NCljdXJEYXRhWzNdIDw8IDI0KQorICAgICAgICAgICAgfCAoKFVJTlQ2NCljdXJEYXRhWzRdIDw8MzIpCisgICAgICAgICAgICB8ICgoVUlOVDY0KWN1ckRhdGFbNV0gPDwgNDApCisgICAgICAgICAgICB8ICgoVUlOVDY0KWN1ckRhdGFbNl0gPDwgNDgpCisgICAgICAgICAgICB8ICgoVUlOVDY0KWN1ckRhdGFbN10gPDwgNTYpOworICAgICAgICAoKFVJTlQ2NCopc3RhdGUpW2ldIF49IGxhbmU7CisgICAgfQorI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIChQTEFURk9STV9CWVRFX09SREVSICE9IElTX0xJVFRMRV9FTkRJQU4pCit2b2lkIEtlY2Nha1AxNjAwX0FkZEJ5dGUodm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgYnl0ZSwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKyAgICBVSU5UNjQgbGFuZSA9IGJ5dGU7CisgICAgbGFuZSA8PD0gKG9mZnNldCU4KSo4OworICAgICgoVUlOVDY0KilzdGF0ZSlbb2Zmc2V0LzhdIF49IGxhbmU7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0FkZEJ5dGVzKHZvaWQgKnN0YXRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgIFNuUF9BZGRCeXRlcyhzdGF0ZSwgZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIEtlY2Nha1AxNjAwX0FkZExhbmVzLCBLZWNjYWtQMTYwMF9BZGRCeXRlc0luTGFuZSwgOCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBLZWNjYWtQMTYwMF9PdmVyd3JpdGVCeXRlc0luTGFuZSh2b2lkICpzdGF0ZSwgdW5zaWduZWQgaW50IGxhbmVQb3NpdGlvbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyNpZiAoUExBVEZPUk1fQllURV9PUkRFUiA9PSBJU19MSVRUTEVfRU5ESUFOKQorI2lmZGVmIEtlY2Nha1AxNjAwX3VzZUxhbmVDb21wbGVtZW50aW5nCisgICAgaWYgKChsYW5lUG9zaXRpb24gPT0gMSkgfHwgKGxhbmVQb3NpdGlvbiA9PSAyKSB8fCAobGFuZVBvc2l0aW9uID09IDgpIHx8IChsYW5lUG9zaXRpb24gPT0gMTIpIHx8IChsYW5lUG9zaXRpb24gPT0gMTcpIHx8IChsYW5lUG9zaXRpb24gPT0gMjApKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKilzdGF0ZSlbbGFuZVBvc2l0aW9uKjgrb2Zmc2V0K2ldID0gfmRhdGFbaV07CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgbWVtY3B5KCh1bnNpZ25lZCBjaGFyKilzdGF0ZStsYW5lUG9zaXRpb24qOCtvZmZzZXQsIGRhdGEsIGxlbmd0aCk7CisgICAgfQorI2Vsc2UKKyNlcnJvciAiTm90IHlldCBpbXBsZW1lbnRlZCIKKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgS2VjY2FrUDE2MDBfT3ZlcndyaXRlTGFuZXModm9pZCAqc3RhdGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsYW5lQ291bnQpCit7CisjaWYgKFBMQVRGT1JNX0JZVEVfT1JERVIgPT0gSVNfTElUVExFX0VORElBTikKKyNpZmRlZiBLZWNjYWtQMTYwMF91c2VMYW5lQ29tcGxlbWVudGluZworICAgIHVuc2lnbmVkIGludCBsYW5lUG9zaXRpb247CisKKyAgICBmb3IobGFuZVBvc2l0aW9uPTA7IGxhbmVQb3NpdGlvbjxsYW5lQ291bnQ7IGxhbmVQb3NpdGlvbisrKQorICAgICAgICBpZiAoKGxhbmVQb3NpdGlvbiA9PSAxKSB8fCAobGFuZVBvc2l0aW9uID09IDIpIHx8IChsYW5lUG9zaXRpb24gPT0gOCkgfHwgKGxhbmVQb3NpdGlvbiA9PSAxMikgfHwgKGxhbmVQb3NpdGlvbiA9PSAxNykgfHwgKGxhbmVQb3NpdGlvbiA9PSAyMCkpCisgICAgICAgICAgICAoKFVJTlQ2NCopc3RhdGUpW2xhbmVQb3NpdGlvbl0gPSB+KChjb25zdCBVSU5UNjQqKWRhdGEpW2xhbmVQb3NpdGlvbl07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICgoVUlOVDY0KilzdGF0ZSlbbGFuZVBvc2l0aW9uXSA9ICgoY29uc3QgVUlOVDY0KilkYXRhKVtsYW5lUG9zaXRpb25dOworI2Vsc2UKKyAgICBtZW1jcHkoc3RhdGUsIGRhdGEsIGxhbmVDb3VudCo4KTsKKyNlbmRpZgorI2Vsc2UKKyNlcnJvciAiTm90IHlldCBpbXBsZW1lbnRlZCIKKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgS2VjY2FrUDE2MDBfT3ZlcndyaXRlQnl0ZXModm9pZCAqc3RhdGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisgICAgU25QX092ZXJ3cml0ZUJ5dGVzKHN0YXRlLCBkYXRhLCBvZmZzZXQsIGxlbmd0aCwgS2VjY2FrUDE2MDBfT3ZlcndyaXRlTGFuZXMsIEtlY2Nha1AxNjAwX092ZXJ3cml0ZUJ5dGVzSW5MYW5lLCA4KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX092ZXJ3cml0ZVdpdGhaZXJvZXModm9pZCAqc3RhdGUsIHVuc2lnbmVkIGludCBieXRlQ291bnQpCit7CisjaWYgKFBMQVRGT1JNX0JZVEVfT1JERVIgPT0gSVNfTElUVExFX0VORElBTikKKyNpZmRlZiBLZWNjYWtQMTYwMF91c2VMYW5lQ29tcGxlbWVudGluZworICAgIHVuc2lnbmVkIGludCBsYW5lUG9zaXRpb247CisKKyAgICBmb3IobGFuZVBvc2l0aW9uPTA7IGxhbmVQb3NpdGlvbjxieXRlQ291bnQvODsgbGFuZVBvc2l0aW9uKyspCisgICAgICAgIGlmICgobGFuZVBvc2l0aW9uID09IDEpIHx8IChsYW5lUG9zaXRpb24gPT0gMikgfHwgKGxhbmVQb3NpdGlvbiA9PSA4KSB8fCAobGFuZVBvc2l0aW9uID09IDEyKSB8fCAobGFuZVBvc2l0aW9uID09IDE3KSB8fCAobGFuZVBvc2l0aW9uID09IDIwKSkKKyAgICAgICAgICAgICgoVUlOVDY0KilzdGF0ZSlbbGFuZVBvc2l0aW9uXSA9IH4wOworICAgICAgICBlbHNlCisgICAgICAgICAgICAoKFVJTlQ2NCopc3RhdGUpW2xhbmVQb3NpdGlvbl0gPSAwOworICAgIGlmIChieXRlQ291bnQlOCAhPSAwKSB7CisgICAgICAgIGxhbmVQb3NpdGlvbiA9IGJ5dGVDb3VudC84OworICAgICAgICBpZiAoKGxhbmVQb3NpdGlvbiA9PSAxKSB8fCAobGFuZVBvc2l0aW9uID09IDIpIHx8IChsYW5lUG9zaXRpb24gPT0gOCkgfHwgKGxhbmVQb3NpdGlvbiA9PSAxMikgfHwgKGxhbmVQb3NpdGlvbiA9PSAxNykgfHwgKGxhbmVQb3NpdGlvbiA9PSAyMCkpCisgICAgICAgICAgICBtZW1zZXQoKHVuc2lnbmVkIGNoYXIqKXN0YXRlK2xhbmVQb3NpdGlvbio4LCAweEZGLCBieXRlQ291bnQlOCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1lbXNldCgodW5zaWduZWQgY2hhciopc3RhdGUrbGFuZVBvc2l0aW9uKjgsIDAsIGJ5dGVDb3VudCU4KTsKKyAgICB9CisjZWxzZQorICAgIG1lbXNldChzdGF0ZSwgMCwgYnl0ZUNvdW50KTsKKyNlbmRpZgorI2Vsc2UKKyNlcnJvciAiTm90IHlldCBpbXBsZW1lbnRlZCIKKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgS2VjY2FrUDE2MDBfUGVybXV0ZV8yNHJvdW5kcyh2b2lkICpzdGF0ZSkKK3sKKyAgICBkZWNsYXJlQUJDREUKKyAgICAjaWZuZGVmIEtlY2Nha1AxNjAwX2Z1bGxVbnJvbGxpbmcKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAjZW5kaWYKKyAgICBVSU5UNjQgKnN0YXRlQXNMYW5lcyA9IChVSU5UNjQqKXN0YXRlOworCisgICAgY29weUZyb21TdGF0ZShBLCBzdGF0ZUFzTGFuZXMpCisgICAgcm91bmRzMjQKKyAgICBjb3B5VG9TdGF0ZShzdGF0ZUFzTGFuZXMsIEEpCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBLZWNjYWtQMTYwMF9QZXJtdXRlXzEycm91bmRzKHZvaWQgKnN0YXRlKQoreworICAgIGRlY2xhcmVBQkNERQorICAgICNpZm5kZWYgS2VjY2FrUDE2MDBfZnVsbFVucm9sbGluZworICAgIHVuc2lnbmVkIGludCBpOworICAgICNlbmRpZgorICAgIFVJTlQ2NCAqc3RhdGVBc0xhbmVzID0gKFVJTlQ2NCopc3RhdGU7CisKKyAgICBjb3B5RnJvbVN0YXRlKEEsIHN0YXRlQXNMYW5lcykKKyAgICByb3VuZHMxMgorICAgIGNvcHlUb1N0YXRlKHN0YXRlQXNMYW5lcywgQSkKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0V4dHJhY3RCeXRlc0luTGFuZShjb25zdCB2b2lkICpzdGF0ZSwgdW5zaWduZWQgaW50IGxhbmVQb3NpdGlvbiwgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgICBVSU5UNjQgbGFuZSA9ICgoVUlOVDY0KilzdGF0ZSlbbGFuZVBvc2l0aW9uXTsKKyNpZmRlZiBLZWNjYWtQMTYwMF91c2VMYW5lQ29tcGxlbWVudGluZworICAgIGlmICgobGFuZVBvc2l0aW9uID09IDEpIHx8IChsYW5lUG9zaXRpb24gPT0gMikgfHwgKGxhbmVQb3NpdGlvbiA9PSA4KSB8fCAobGFuZVBvc2l0aW9uID09IDEyKSB8fCAobGFuZVBvc2l0aW9uID09IDE3KSB8fCAobGFuZVBvc2l0aW9uID09IDIwKSkKKyAgICAgICAgbGFuZSA9IH5sYW5lOworI2VuZGlmCisjaWYgKFBMQVRGT1JNX0JZVEVfT1JERVIgPT0gSVNfTElUVExFX0VORElBTikKKyAgICB7CisgICAgICAgIFVJTlQ2NCBsYW5lMVsxXTsKKyAgICAgICAgbGFuZTFbMF0gPSBsYW5lOworICAgICAgICBtZW1jcHkoZGF0YSwgKFVJTlQ4KilsYW5lMStvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorI2Vsc2UKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBsYW5lID4+PSBvZmZzZXQqODsKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKSB7CisgICAgICAgIGRhdGFbaV0gPSBsYW5lICYgMHhGRjsKKyAgICAgICAgbGFuZSA+Pj0gODsKKyAgICB9CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgKFBMQVRGT1JNX0JZVEVfT1JERVIgIT0gSVNfTElUVExFX0VORElBTikKK3ZvaWQgZnJvbVdvcmRUb0J5dGVzKFVJTlQ4ICpieXRlcywgY29uc3QgVUlOVDY0IHdvcmQpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPCg2NC84KTsgaSsrKQorICAgICAgICBieXRlc1tpXSA9ICh3b3JkID4+ICg4KmkpKSAmIDB4RkY7Cit9CisjZW5kaWYKKwordm9pZCBLZWNjYWtQMTYwMF9FeHRyYWN0TGFuZXMoY29uc3Qgdm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsYW5lQ291bnQpCit7CisjaWYgKFBMQVRGT1JNX0JZVEVfT1JERVIgPT0gSVNfTElUVExFX0VORElBTikKKyAgICBtZW1jcHkoZGF0YSwgc3RhdGUsIGxhbmVDb3VudCo4KTsKKyNlbHNlCisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPGxhbmVDb3VudDsgaSsrKQorICAgICAgICBmcm9tV29yZFRvQnl0ZXMoZGF0YSsoaSo4KSwgKChjb25zdCBVSU5UNjQqKXN0YXRlKVtpXSk7CisjZW5kaWYKKyNpZmRlZiBLZWNjYWtQMTYwMF91c2VMYW5lQ29tcGxlbWVudGluZworICAgIGlmIChsYW5lQ291bnQgPiAxKSB7CisgICAgICAgICgoVUlOVDY0KilkYXRhKVsgMV0gPSB+KChVSU5UNjQqKWRhdGEpWyAxXTsKKyAgICAgICAgaWYgKGxhbmVDb3VudCA+IDIpIHsKKyAgICAgICAgICAgICgoVUlOVDY0KilkYXRhKVsgMl0gPSB+KChVSU5UNjQqKWRhdGEpWyAyXTsKKyAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPiA4KSB7CisgICAgICAgICAgICAgICAgKChVSU5UNjQqKWRhdGEpWyA4XSA9IH4oKFVJTlQ2NCopZGF0YSlbIDhdOworICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPiAxMikgeworICAgICAgICAgICAgICAgICAgICAoKFVJTlQ2NCopZGF0YSlbMTJdID0gfigoVUlOVDY0KilkYXRhKVsxMl07CisgICAgICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPiAxNykgeworICAgICAgICAgICAgICAgICAgICAgICAgKChVSU5UNjQqKWRhdGEpWzE3XSA9IH4oKFVJTlQ2NCopZGF0YSlbMTddOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+IDIwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChVSU5UNjQqKWRhdGEpWzIwXSA9IH4oKFVJTlQ2NCopZGF0YSlbMjBdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBLZWNjYWtQMTYwMF9FeHRyYWN0Qnl0ZXMoY29uc3Qgdm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisgICAgU25QX0V4dHJhY3RCeXRlcyhzdGF0ZSwgZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIEtlY2Nha1AxNjAwX0V4dHJhY3RMYW5lcywgS2VjY2FrUDE2MDBfRXh0cmFjdEJ5dGVzSW5MYW5lLCA4KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEtlY2Nha1AxNjAwX0V4dHJhY3RBbmRBZGRCeXRlc0luTGFuZShjb25zdCB2b2lkICpzdGF0ZSwgdW5zaWduZWQgaW50IGxhbmVQb3NpdGlvbiwgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgICBVSU5UNjQgbGFuZSA9ICgoVUlOVDY0KilzdGF0ZSlbbGFuZVBvc2l0aW9uXTsKKyNpZmRlZiBLZWNjYWtQMTYwMF91c2VMYW5lQ29tcGxlbWVudGluZworICAgIGlmICgobGFuZVBvc2l0aW9uID09IDEpIHx8IChsYW5lUG9zaXRpb24gPT0gMikgfHwgKGxhbmVQb3NpdGlvbiA9PSA4KSB8fCAobGFuZVBvc2l0aW9uID09IDEyKSB8fCAobGFuZVBvc2l0aW9uID09IDE3KSB8fCAobGFuZVBvc2l0aW9uID09IDIwKSkKKyAgICAgICAgbGFuZSA9IH5sYW5lOworI2VuZGlmCisjaWYgKFBMQVRGT1JNX0JZVEVfT1JERVIgPT0gSVNfTElUVExFX0VORElBTikKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBVSU5UNjQgbGFuZTFbMV07CisgICAgICAgIGxhbmUxWzBdID0gbGFuZTsKKyAgICAgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICAgICAgICAgIG91dHB1dFtpXSA9IGlucHV0W2ldIF4gKChVSU5UOCopbGFuZTEpW29mZnNldCtpXTsKKyAgICB9CisjZWxzZQorICAgIHVuc2lnbmVkIGludCBpOworICAgIGxhbmUgPj49IG9mZnNldCo4OworICAgIGZvcihpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKyAgICAgICAgb3V0cHV0W2ldID0gaW5wdXRbaV0gXiAobGFuZSAmIDB4RkYpOworICAgICAgICBsYW5lID4+PSA4OworICAgIH0KKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgS2VjY2FrUDE2MDBfRXh0cmFjdEFuZEFkZExhbmVzKGNvbnN0IHZvaWQgKnN0YXRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCwgdW5zaWduZWQgY2hhciAqb3V0cHV0LCB1bnNpZ25lZCBpbnQgbGFuZUNvdW50KQoreworICAgIHVuc2lnbmVkIGludCBpOworI2lmIChQTEFURk9STV9CWVRFX09SREVSICE9IElTX0xJVFRMRV9FTkRJQU4pCisgICAgdW5zaWduZWQgY2hhciB0ZW1wWzhdOworICAgIHVuc2lnbmVkIGludCBqOworI2VuZGlmCisKKyAgICBmb3IoaT0wOyBpPGxhbmVDb3VudDsgaSsrKSB7CisjaWYgKFBMQVRGT1JNX0JZVEVfT1JERVIgPT0gSVNfTElUVExFX0VORElBTikKKyAgICAgICAgKChVSU5UNjQqKW91dHB1dClbaV0gPSAoKFVJTlQ2NCopaW5wdXQpW2ldIF4gKChjb25zdCBVSU5UNjQqKXN0YXRlKVtpXTsKKyNlbHNlCisgICAgICAgIGZyb21Xb3JkVG9CeXRlcyh0ZW1wLCAoKGNvbnN0IFVJTlQ2NCopc3RhdGUpW2ldKTsKKyAgICAgICAgZm9yKGo9MDsgajw4OyBqKyspCisgICAgICAgICAgICBvdXRwdXRbaSo4K2pdID0gaW5wdXRbaSo4K2pdIF4gdGVtcFtqXTsKKyNlbmRpZgorICAgIH0KKyNpZmRlZiBLZWNjYWtQMTYwMF91c2VMYW5lQ29tcGxlbWVudGluZworICAgIGlmIChsYW5lQ291bnQgPiAxKSB7CisgICAgICAgICgoVUlOVDY0KilvdXRwdXQpWyAxXSA9IH4oKFVJTlQ2NCopb3V0cHV0KVsgMV07CisgICAgICAgIGlmIChsYW5lQ291bnQgPiAyKSB7CisgICAgICAgICAgICAoKFVJTlQ2NCopb3V0cHV0KVsgMl0gPSB+KChVSU5UNjQqKW91dHB1dClbIDJdOworICAgICAgICAgICAgaWYgKGxhbmVDb3VudCA+IDgpIHsKKyAgICAgICAgICAgICAgICAoKFVJTlQ2NCopb3V0cHV0KVsgOF0gPSB+KChVSU5UNjQqKW91dHB1dClbIDhdOworICAgICAgICAgICAgICAgIGlmIChsYW5lQ291bnQgPiAxMikgeworICAgICAgICAgICAgICAgICAgICAoKFVJTlQ2NCopb3V0cHV0KVsxMl0gPSB+KChVSU5UNjQqKW91dHB1dClbMTJdOworICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID4gMTcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoVUlOVDY0KilvdXRwdXQpWzE3XSA9IH4oKFVJTlQ2NCopb3V0cHV0KVsxN107CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFuZUNvdW50ID4gMjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFVJTlQ2NCopb3V0cHV0KVsyMF0gPSB+KChVSU5UNjQqKW91dHB1dClbMjBdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBLZWNjYWtQMTYwMF9FeHRyYWN0QW5kQWRkQnl0ZXMoY29uc3Qgdm9pZCAqc3RhdGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisgICAgU25QX0V4dHJhY3RBbmRBZGRCeXRlcyhzdGF0ZSwgaW5wdXQsIG91dHB1dCwgb2Zmc2V0LCBsZW5ndGgsIEtlY2Nha1AxNjAwX0V4dHJhY3RBbmRBZGRMYW5lcywgS2VjY2FrUDE2MDBfRXh0cmFjdEFuZEFkZEJ5dGVzSW5MYW5lLCA4KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzaXplX3QgS2VjY2FrRjE2MDBfRmFzdExvb3BfQWJzb3JiKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBpbnQgbGFuZUNvdW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3QgZGF0YUJ5dGVMZW4pCit7CisgICAgc2l6ZV90IG9yaWdpbmFsRGF0YUJ5dGVMZW4gPSBkYXRhQnl0ZUxlbjsKKyAgICBkZWNsYXJlQUJDREUKKyAgICAjaWZuZGVmIEtlY2Nha1AxNjAwX2Z1bGxVbnJvbGxpbmcKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAjZW5kaWYKKyAgICBVSU5UNjQgKnN0YXRlQXNMYW5lcyA9IChVSU5UNjQqKXN0YXRlOworICAgIFVJTlQ2NCAqaW5EYXRhQXNMYW5lcyA9IChVSU5UNjQqKWRhdGE7CisKKyAgICBjb3B5RnJvbVN0YXRlKEEsIHN0YXRlQXNMYW5lcykKKyAgICB3aGlsZShkYXRhQnl0ZUxlbiA+PSBsYW5lQ291bnQqOCkgeworICAgICAgICBhZGRJbnB1dChBLCBpbkRhdGFBc0xhbmVzLCBsYW5lQ291bnQpCisgICAgICAgIHJvdW5kczI0CisgICAgICAgIGluRGF0YUFzTGFuZXMgKz0gbGFuZUNvdW50OworICAgICAgICBkYXRhQnl0ZUxlbiAtPSBsYW5lQ291bnQqODsKKyAgICB9CisgICAgY29weVRvU3RhdGUoc3RhdGVBc0xhbmVzLCBBKQorICAgIHJldHVybiBvcmlnaW5hbERhdGFCeXRlTGVuIC0gZGF0YUJ5dGVMZW47Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtQLTE2MDAtdW5yb2xsaW5nLm1hY3JvcyBiL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha1AtMTYwMC11bnJvbGxpbmcubWFjcm9zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNWNlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtQLTE2MDAtdW5yb2xsaW5nLm1hY3JvcwpAQCAtMCwwICsxLDE4NSBAQAorLyoKK0ltcGxlbWVudGF0aW9uIGJ5IHRoZSBLZWNjYWssIEtleWFrIGFuZCBLZXRqZSBUZWFtcywgbmFtZWx5LCBHdWlkbyBCZXJ0b25pLAorSm9hbiBEYWVtZW4sIE1pY2hhw6tsIFBlZXRlcnMsIEdpbGxlcyBWYW4gQXNzY2hlIGFuZCBSb25ueSBWYW4gS2VlciwgaGVyZWJ5CitkZW5vdGVkIGFzICJ0aGUgaW1wbGVtZW50ZXIiLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZmVlZGJhY2sgb3IgcXVlc3Rpb25zLCBwbGVhc2UgcmVmZXIgdG8gb3VyIHdlYnNpdGVzOgoraHR0cDovL2tlY2Nhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXlhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXRqZS5ub2VrZW9uLm9yZy8KKworVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBpbXBsZW1lbnRlciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQKK2FuZCByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGUgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlLgoraHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworKi8KKworI2lmIChkZWZpbmVkKEZ1bGxVbnJvbGxpbmcpKQorI2RlZmluZSByb3VuZHMyNCBcCisgICAgcHJlcGFyZVRoZXRhIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSggMCwgQSwgRSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKCAxLCBFLCBBKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoIDIsIEEsIEUpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSggMywgRSwgQSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKCA0LCBBLCBFKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoIDUsIEUsIEEpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSggNiwgQSwgRSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKCA3LCBFLCBBKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoIDgsIEEsIEUpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSggOSwgRSwgQSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDEwLCBBLCBFKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoMTEsIEUsIEEpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSgxMiwgQSwgRSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDEzLCBFLCBBKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoMTQsIEEsIEUpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSgxNSwgRSwgQSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDE2LCBBLCBFKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoMTcsIEUsIEEpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSgxOCwgQSwgRSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDE5LCBFLCBBKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoMjAsIEEsIEUpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSgyMSwgRSwgQSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDIyLCBBLCBFKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGEoMjMsIEUsIEEpIFwKKworI2RlZmluZSByb3VuZHMxMiBcCisgICAgcHJlcGFyZVRoZXRhIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSgxMiwgQSwgRSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDEzLCBFLCBBKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoMTQsIEEsIEUpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSgxNSwgRSwgQSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDE2LCBBLCBFKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoMTcsIEUsIEEpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSgxOCwgQSwgRSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDE5LCBFLCBBKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoMjAsIEEsIEUpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSgyMSwgRSwgQSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDIyLCBBLCBFKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGEoMjMsIEUsIEEpIFwKKworI2VsaWYgKFVucm9sbGluZyA9PSAxMikKKyNkZWZpbmUgcm91bmRzMjQgXAorICAgIHByZXBhcmVUaGV0YSBcCisgICAgZm9yKGk9MDsgaTwyNDsgaSs9MTIpIHsgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpICAgLCBBLCBFKSBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkrIDEsIEUsIEEpIFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSsgMiwgQSwgRSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKyAzLCBFLCBBKSBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkrIDQsIEEsIEUpIFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSsgNSwgRSwgQSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKyA2LCBBLCBFKSBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkrIDcsIEUsIEEpIFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSsgOCwgQSwgRSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKyA5LCBFLCBBKSBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkrMTAsIEEsIEUpIFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSsxMSwgRSwgQSkgXAorICAgIH0gXAorCisjZGVmaW5lIHJvdW5kczEyIFwKKyAgICBwcmVwYXJlVGhldGEgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDEyLCBBLCBFKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoMTMsIEUsIEEpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSgxNCwgQSwgRSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDE1LCBFLCBBKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoMTYsIEEsIEUpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSgxNywgRSwgQSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDE4LCBBLCBFKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoMTksIEUsIEEpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YSgyMCwgQSwgRSkgXAorICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKDIxLCBFLCBBKSBcCisgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoMjIsIEEsIEUpIFwKKyAgICB0aGV0YVJob1BpQ2hpSW90YSgyMywgRSwgQSkgXAorCisjZWxpZiAoVW5yb2xsaW5nID09IDYpCisjZGVmaW5lIHJvdW5kczI0IFwKKyAgICBwcmVwYXJlVGhldGEgXAorICAgIGZvcihpPTA7IGk8MjQ7IGkrPTYpIHsgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpICAsIEEsIEUpIFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSsxLCBFLCBBKSBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkrMiwgQSwgRSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKzMsIEUsIEEpIFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSs0LCBBLCBFKSBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkrNSwgRSwgQSkgXAorICAgIH0gXAorCisjZGVmaW5lIHJvdW5kczEyIFwKKyAgICBwcmVwYXJlVGhldGEgXAorICAgIGZvcihpPTEyOyBpPDI0OyBpKz02KSB7IFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSAgLCBBLCBFKSBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkrMSwgRSwgQSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKzIsIEEsIEUpIFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSszLCBFLCBBKSBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkrNCwgQSwgRSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKzUsIEUsIEEpIFwKKyAgICB9IFwKKworI2VsaWYgKFVucm9sbGluZyA9PSA0KQorI2RlZmluZSByb3VuZHMyNCBcCisgICAgcHJlcGFyZVRoZXRhIFwKKyAgICBmb3IoaT0wOyBpPDI0OyBpKz00KSB7IFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSAgLCBBLCBFKSBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkrMSwgRSwgQSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKzIsIEEsIEUpIFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSszLCBFLCBBKSBcCisgICAgfSBcCisKKyNkZWZpbmUgcm91bmRzMTIgXAorICAgIHByZXBhcmVUaGV0YSBcCisgICAgZm9yKGk9MTI7IGk8MjQ7IGkrPTQpIHsgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpICAsIEEsIEUpIFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSsxLCBFLCBBKSBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkrMiwgQSwgRSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKzMsIEUsIEEpIFwKKyAgICB9IFwKKworI2VsaWYgKFVucm9sbGluZyA9PSAzKQorI2RlZmluZSByb3VuZHMyNCBcCisgICAgcHJlcGFyZVRoZXRhIFwKKyAgICBmb3IoaT0wOyBpPDI0OyBpKz0zKSB7IFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSAgLCBBLCBFKSBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkrMSwgRSwgQSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKzIsIEEsIEUpIFwKKyAgICAgICAgY29weVN0YXRlVmFyaWFibGVzKEEsIEUpIFwKKyAgICB9IFwKKworI2RlZmluZSByb3VuZHMxMiBcCisgICAgcHJlcGFyZVRoZXRhIFwKKyAgICBmb3IoaT0xMjsgaTwyNDsgaSs9MykgeyBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkgICwgQSwgRSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKzEsIEUsIEEpIFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSsyLCBBLCBFKSBcCisgICAgICAgIGNvcHlTdGF0ZVZhcmlhYmxlcyhBLCBFKSBcCisgICAgfSBcCisKKyNlbGlmIChVbnJvbGxpbmcgPT0gMikKKyNkZWZpbmUgcm91bmRzMjQgXAorICAgIHByZXBhcmVUaGV0YSBcCisgICAgZm9yKGk9MDsgaTwyNDsgaSs9MikgeyBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkgICwgQSwgRSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKzEsIEUsIEEpIFwKKyAgICB9IFwKKworI2RlZmluZSByb3VuZHMxMiBcCisgICAgcHJlcGFyZVRoZXRhIFwKKyAgICBmb3IoaT0xMjsgaTwyNDsgaSs9MikgeyBcCisgICAgICAgIHRoZXRhUmhvUGlDaGlJb3RhUHJlcGFyZVRoZXRhKGkgICwgQSwgRSkgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpKzEsIEUsIEEpIFwKKyAgICB9IFwKKworI2VsaWYgKFVucm9sbGluZyA9PSAxKQorI2RlZmluZSByb3VuZHMyNCBcCisgICAgcHJlcGFyZVRoZXRhIFwKKyAgICBmb3IoaT0wOyBpPDI0OyBpKyspIHsgXAorICAgICAgICB0aGV0YVJob1BpQ2hpSW90YVByZXBhcmVUaGV0YShpICAsIEEsIEUpIFwKKyAgICAgICAgY29weVN0YXRlVmFyaWFibGVzKEEsIEUpIFwKKyAgICB9IFwKKworI2RlZmluZSByb3VuZHMxMiBcCisgICAgcHJlcGFyZVRoZXRhIFwKKyAgICBmb3IoaT0xMjsgaTwyNDsgaSsrKSB7IFwKKyAgICAgICAgdGhldGFSaG9QaUNoaUlvdGFQcmVwYXJlVGhldGEoaSAgLCBBLCBFKSBcCisgICAgICAgIGNvcHlTdGF0ZVZhcmlhYmxlcyhBLCBFKSBcCisgICAgfSBcCisKKyNlbHNlCisjZXJyb3IgIlVucm9sbGluZyBpcyBub3QgY29ycmVjdGx5IHNwZWNpZmllZCEiCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha1Nwb25nZS5jIGIvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrU3BvbmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkYjczMQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha1Nwb25nZS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCitJbXBsZW1lbnRhdGlvbiBieSB0aGUgS2VjY2FrLCBLZXlhayBhbmQgS2V0amUgVGVhbXMsIG5hbWVseSwgR3VpZG8gQmVydG9uaSwKK0pvYW4gRGFlbWVuLCBNaWNoYcOrbCBQZWV0ZXJzLCBHaWxsZXMgVmFuIEFzc2NoZSBhbmQgUm9ubnkgVmFuIEtlZXIsIGhlcmVieQorZGVub3RlZCBhcyAidGhlIGltcGxlbWVudGVyIi4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIGZlZWRiYWNrIG9yIHF1ZXN0aW9ucywgcGxlYXNlIHJlZmVyIHRvIG91ciB3ZWJzaXRlczoKK2h0dHA6Ly9rZWNjYWsubm9la2Vvbi5vcmcvCitodHRwOi8va2V5YWsubm9la2Vvbi5vcmcvCitodHRwOi8va2V0amUubm9la2Vvbi5vcmcvCisKK1RvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgaW1wbGVtZW50ZXIgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0CithbmQgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhlIHNvdXJjZSBjb2RlIGluIHRoaXMgZmlsZS4KK2h0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KKyovCisKKyNpbmNsdWRlICJLZWNjYWtTcG9uZ2UuaCIKKworI2lmZGVmIEtlY2Nha1JlZmVyZW5jZQorICAgICNpbmNsdWRlICJkaXNwbGF5SW50ZXJtZWRpYXRlVmFsdWVzLmgiCisjZW5kaWYKKworI2lmbmRlZiBLZWNjYWtQMjAwX2V4Y2x1ZGVkCisgICAgI2luY2x1ZGUgIktlY2Nha1AtMjAwLVNuUC5oIgorCisgICAgI2RlZmluZSBwcmVmaXggS2VjY2FrV2lkdGgyMDAKKyAgICAjZGVmaW5lIFNuUCBLZWNjYWtQMjAwCisgICAgI2RlZmluZSBTblBfd2lkdGggMjAwCisgICAgI2RlZmluZSBTblBfUGVybXV0ZSBLZWNjYWtQMjAwX1Blcm11dGVfMThyb3VuZHMKKyAgICAjaWYgZGVmaW5lZChLZWNjYWtGMjAwX0Zhc3RMb29wX3N1cHBvcnRlZCkKKyAgICAgICAgI2RlZmluZSBTblBfRmFzdExvb3BfQWJzb3JiIEtlY2Nha0YyMDBfRmFzdExvb3BfQWJzb3JiCisgICAgI2VuZGlmCisgICAgICAgICNpbmNsdWRlICJLZWNjYWtTcG9uZ2UuaW5jIgorICAgICN1bmRlZiBwcmVmaXgKKyAgICAjdW5kZWYgU25QCisgICAgI3VuZGVmIFNuUF93aWR0aAorICAgICN1bmRlZiBTblBfUGVybXV0ZQorICAgICN1bmRlZiBTblBfRmFzdExvb3BfQWJzb3JiCisjZW5kaWYKKworI2lmbmRlZiBLZWNjYWtQNDAwX2V4Y2x1ZGVkCisgICAgI2luY2x1ZGUgIktlY2Nha1AtNDAwLVNuUC5oIgorCisgICAgI2RlZmluZSBwcmVmaXggS2VjY2FrV2lkdGg0MDAKKyAgICAjZGVmaW5lIFNuUCBLZWNjYWtQNDAwCisgICAgI2RlZmluZSBTblBfd2lkdGggNDAwCisgICAgI2RlZmluZSBTblBfUGVybXV0ZSBLZWNjYWtQNDAwX1Blcm11dGVfMjByb3VuZHMKKyAgICAjaWYgZGVmaW5lZChLZWNjYWtGNDAwX0Zhc3RMb29wX3N1cHBvcnRlZCkKKyAgICAgICAgI2RlZmluZSBTblBfRmFzdExvb3BfQWJzb3JiIEtlY2Nha0Y0MDBfRmFzdExvb3BfQWJzb3JiCisgICAgI2VuZGlmCisgICAgICAgICNpbmNsdWRlICJLZWNjYWtTcG9uZ2UuaW5jIgorICAgICN1bmRlZiBwcmVmaXgKKyAgICAjdW5kZWYgU25QCisgICAgI3VuZGVmIFNuUF93aWR0aAorICAgICN1bmRlZiBTblBfUGVybXV0ZQorICAgICN1bmRlZiBTblBfRmFzdExvb3BfQWJzb3JiCisjZW5kaWYKKworI2lmbmRlZiBLZWNjYWtQODAwX2V4Y2x1ZGVkCisgICAgI2luY2x1ZGUgIktlY2Nha1AtODAwLVNuUC5oIgorCisgICAgI2RlZmluZSBwcmVmaXggS2VjY2FrV2lkdGg4MDAKKyAgICAjZGVmaW5lIFNuUCBLZWNjYWtQODAwCisgICAgI2RlZmluZSBTblBfd2lkdGggODAwCisgICAgI2RlZmluZSBTblBfUGVybXV0ZSBLZWNjYWtQODAwX1Blcm11dGVfMjJyb3VuZHMKKyAgICAjaWYgZGVmaW5lZChLZWNjYWtGODAwX0Zhc3RMb29wX3N1cHBvcnRlZCkKKyAgICAgICAgI2RlZmluZSBTblBfRmFzdExvb3BfQWJzb3JiIEtlY2Nha0Y4MDBfRmFzdExvb3BfQWJzb3JiCisgICAgI2VuZGlmCisgICAgICAgICNpbmNsdWRlICJLZWNjYWtTcG9uZ2UuaW5jIgorICAgICN1bmRlZiBwcmVmaXgKKyAgICAjdW5kZWYgU25QCisgICAgI3VuZGVmIFNuUF93aWR0aAorICAgICN1bmRlZiBTblBfUGVybXV0ZQorICAgICN1bmRlZiBTblBfRmFzdExvb3BfQWJzb3JiCisjZW5kaWYKKworI2lmbmRlZiBLZWNjYWtQMTYwMF9leGNsdWRlZAorICAgICNpbmNsdWRlICJLZWNjYWtQLTE2MDAtU25QLmgiCisKKyAgICAjZGVmaW5lIHByZWZpeCBLZWNjYWtXaWR0aDE2MDAKKyAgICAjZGVmaW5lIFNuUCBLZWNjYWtQMTYwMAorICAgICNkZWZpbmUgU25QX3dpZHRoIDE2MDAKKyAgICAjZGVmaW5lIFNuUF9QZXJtdXRlIEtlY2Nha1AxNjAwX1Blcm11dGVfMjRyb3VuZHMKKyAgICAjaWYgZGVmaW5lZChLZWNjYWtGMTYwMF9GYXN0TG9vcF9zdXBwb3J0ZWQpCisgICAgICAgICNkZWZpbmUgU25QX0Zhc3RMb29wX0Fic29yYiBLZWNjYWtGMTYwMF9GYXN0TG9vcF9BYnNvcmIKKyAgICAjZW5kaWYKKyAgICAgICAgI2luY2x1ZGUgIktlY2Nha1Nwb25nZS5pbmMiCisgICAgI3VuZGVmIHByZWZpeAorICAgICN1bmRlZiBTblAKKyAgICAjdW5kZWYgU25QX3dpZHRoCisgICAgI3VuZGVmIFNuUF9QZXJtdXRlCisgICAgI3VuZGVmIFNuUF9GYXN0TG9vcF9BYnNvcmIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrU3BvbmdlLmggYi9Nb2R1bGVzL19zaGEzL2tjcC9LZWNjYWtTcG9uZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjRiYWRjCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrU3BvbmdlLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qCitJbXBsZW1lbnRhdGlvbiBieSB0aGUgS2VjY2FrLCBLZXlhayBhbmQgS2V0amUgVGVhbXMsIG5hbWVseSwgR3VpZG8gQmVydG9uaSwKK0pvYW4gRGFlbWVuLCBNaWNoYcOrbCBQZWV0ZXJzLCBHaWxsZXMgVmFuIEFzc2NoZSBhbmQgUm9ubnkgVmFuIEtlZXIsIGhlcmVieQorZGVub3RlZCBhcyAidGhlIGltcGxlbWVudGVyIi4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIGZlZWRiYWNrIG9yIHF1ZXN0aW9ucywgcGxlYXNlIHJlZmVyIHRvIG91ciB3ZWJzaXRlczoKK2h0dHA6Ly9rZWNjYWsubm9la2Vvbi5vcmcvCitodHRwOi8va2V5YWsubm9la2Vvbi5vcmcvCitodHRwOi8va2V0amUubm9la2Vvbi5vcmcvCisKK1RvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgaW1wbGVtZW50ZXIgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0CithbmQgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhlIHNvdXJjZSBjb2RlIGluIHRoaXMgZmlsZS4KK2h0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KKyovCisKKyNpZm5kZWYgX0tlY2Nha1Nwb25nZV9oXworI2RlZmluZSBfS2VjY2FrU3BvbmdlX2hfCisKKy8qKiBHZW5lcmFsIGluZm9ybWF0aW9uCisgICoKKyAgKiBUaGUgZm9sbG93aW5nIHR5cGUgYW5kIGZ1bmN0aW9ucyBhcmUgbm90IGFjdHVhbGx5IGltcGxlbWVudGVkLiBUaGVpcgorICAqIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJpYywgd2l0aCB0aGUgcHJlZml4IFByZWZpeCByZXBsYWNlZCBieQorICAqIC0gS2VjY2FrV2lkdGgyMDAgZm9yIGEgc3BvbmdlIGZ1bmN0aW9uIGJhc2VkIG9uIEtlY2Nhay1mWzIwMF0KKyAgKiAtIEtlY2Nha1dpZHRoNDAwIGZvciBhIHNwb25nZSBmdW5jdGlvbiBiYXNlZCBvbiBLZWNjYWstZls0MDBdCisgICogLSBLZWNjYWtXaWR0aDgwMCBmb3IgYSBzcG9uZ2UgZnVuY3Rpb24gYmFzZWQgb24gS2VjY2FrLWZbODAwXQorICAqIC0gS2VjY2FrV2lkdGgxNjAwIGZvciBhIHNwb25nZSBmdW5jdGlvbiBiYXNlZCBvbiBLZWNjYWstZlsxNjAwXQorICAqCisgICogSW4gYWxsIHRoZXNlIGZ1bmN0aW9ucywgdGhlIHJhdGUgYW5kIGNhcGFjaXR5IG11c3Qgc3VtIHRvIHRoZSB3aWR0aCBvZiB0aGUKKyAgKiBjaG9zZW4gcGVybXV0YXRpb24uIEZvciBpbnN0YW5jZSwgdG8gdXNlIHRoZSBzcG9uZ2UgZnVuY3Rpb24KKyAgKiBLZWNjYWtbcj0xMzQ0LCBjPTI1Nl0sIG9uZSBtdXN0IHVzZSBLZWNjYWtXaWR0aDE2MDBfU3BvbmdlKCkgb3IgYSBjb21iaW5hdGlvbgorICAqIG9mIEtlY2Nha1dpZHRoMTYwMF9TcG9uZ2VJbml0aWFsaXplKCksIEtlY2Nha1dpZHRoMTYwMF9TcG9uZ2VBYnNvcmIoKSwKKyAgKiBLZWNjYWtXaWR0aDE2MDBfU3BvbmdlQWJzb3JiTGFzdEZld0JpdHMoKSBhbmQKKyAgKiBLZWNjYWtXaWR0aDE2MDBfU3BvbmdlU3F1ZWV6ZSgpLgorICAqCisgICogVGhlIFByZWZpeF9TcG9uZ2VJbnN0YW5jZSBjb250YWlucyB0aGUgc3BvbmdlIGluc3RhbmNlIGF0dHJpYnV0ZXMgZm9yIHVzZQorICAqIHdpdGggdGhlIFByZWZpeF9TcG9uZ2UqIGZ1bmN0aW9ucy4KKyAgKiBJdCBnYXRoZXJzIHRoZSBzdGF0ZSBwcm9jZXNzZWQgYnkgdGhlIHBlcm11dGF0aW9uIGFzIHdlbGwgYXMgdGhlIHJhdGUsCisgICogdGhlIHBvc2l0aW9uIG9mIGlucHV0L291dHB1dCBieXRlcyBpbiB0aGUgc3RhdGUgYW5kIHRoZSBwaGFzZQorICAqIChhYnNvcmJpbmcgb3Igc3F1ZWV6aW5nKS4KKyAgKi8KKworI2lmZGVmIERvbnRSZWFsbHlJbmNsdWRlX0RvY3VtZW50YXRpb25Pbmx5CisvKiogRnVuY3Rpb24gdG8gZXZhbHVhdGUgdGhlIHNwb25nZSBmdW5jdGlvbiBLZWNjYWtbciwgY10gaW4gYSBzaW5nbGUgY2FsbC4KKyAgKiBAcGFyYW0gIHJhdGUgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgcmF0ZSByLgorICAqIEBwYXJhbSAgY2FwYWNpdHkgICAgVGhlIHZhbHVlIG9mIHRoZSBjYXBhY2l0eSBjLgorICAqIEBwYXJhbSAgaW5wdXQgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1lc3NhZ2UgKGJlZm9yZSB0aGUgc3VmZml4KS4KKyAgKiBAcGFyYW0gIGlucHV0Qnl0ZUxlbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBtZXNzYWdlIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgc3VmZml4ICAgICAgICAgIEJ5dGUgY29udGFpbmluZyBmcm9tIDAgdG8gNyBzdWZmaXggYml0cworICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbXVzdCBiZSBhYnNvcmJlZCBhZnRlciBAYSBpbnB1dC4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGVzZSA8aT5uPC9pPiBiaXRzIG11c3QgYmUgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBwb3NpdGlvbnMuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgYml0cyBtdXN0IGJlIGRlbGltaXRlZCB3aXRoIGEgYml0IDEgYXQgcG9zaXRpb24gPGk+bjwvaT4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAoY291bnRpbmcgZnJvbSAwPUxTQiB0byA3PU1TQikgYW5kIGZvbGxvd2VkIGJ5IGJpdHMgMAorICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcG9zaXRpb24gPGk+bjwvaT4rMSB0byBwb3NpdGlvbiA3LgorICAqICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUgZXhhbXBsZXM6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSWYgbm8gYml0cyBhcmUgdG8gYmUgYWJzb3JiZWQsIHRoZW4gQGEgc3VmZml4IG11c3QgYmUgMHgwMS4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJZiB0aGUgMi1iaXQgc2VxdWVuY2UgMCwwIGlzIHRvIGJlIGFic29yYmVkLCBAYSBzdWZmaXggbXVzdCBiZSAweDA0LgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIElmIHRoZSA1LWJpdCBzZXF1ZW5jZSAwLDEsMCwwLDEgaXMgdG8gYmUgYWJzb3JiZWQsIEBhIHN1ZmZpeCBtdXN0IGJlIDB4MzIuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSWYgdGhlIDctYml0IHNlcXVlbmNlIDEsMSwwLDEsMCwwLDAgaXMgdG8gYmUgYWJzb3JiZWQsIEBhIHN1ZmZpeCBtdXN0IGJlIDB4OEIuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgLgorICAqIEBwYXJhbSAgb3V0cHV0ICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgICogQHBhcmFtICBvdXRwdXRCeXRlTGVuICAgVGhlIGRlc2lyZWQgbnVtYmVyIG9mIG91dHB1dCBieXRlcy4KKyAgKiBAcHJlICAgIE9uZSBtdXN0IGhhdmUgcitjIGVxdWFsIHRvIHRoZSBzdXBwb3J0ZWQgd2lkdGggb2YgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAqICAgICAgICAgYW5kIHRoZSByYXRlIGEgbXVsdGlwbGUgb2YgOCBiaXRzIChvbmUgYnl0ZSkgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgKiBAcHJlICAgIEBhIHN1ZmZpeCDiiaAgMHgwMAorICAqIEByZXR1cm4gWmVybyBpZiBzdWNjZXNzZnVsLCAxIG90aGVyd2lzZS4KKyAgKi8KK2ludCBQcmVmaXhfU3BvbmdlKHVuc2lnbmVkIGludCByYXRlLCB1bnNpZ25lZCBpbnQgY2FwYWNpdHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LCBzaXplX3QgaW5wdXRCeXRlTGVuLCB1bnNpZ25lZCBjaGFyIHN1ZmZpeCwgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBzaXplX3Qgb3V0cHV0Qnl0ZUxlbik7CisKKy8qKgorICAqIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIG9mIHRoZSBLZWNjYWtbciwgY10gc3BvbmdlIGZ1bmN0aW9uLgorICAqIFRoZSBwaGFzZSBvZiB0aGUgc3BvbmdlIGZ1bmN0aW9uIGlzIHNldCB0byBhYnNvcmJpbmcuCisgICogQHBhcmFtICBzcG9uZ2VJbnN0YW5jZSAgUG9pbnRlciB0byB0aGUgc3BvbmdlIGluc3RhbmNlIHRvIGJlIGluaXRpYWxpemVkLgorICAqIEBwYXJhbSAgcmF0ZSAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSByYXRlIHIuCisgICogQHBhcmFtICBjYXBhY2l0eSAgICBUaGUgdmFsdWUgb2YgdGhlIGNhcGFjaXR5IGMuCisgICogQHByZSAgICBPbmUgbXVzdCBoYXZlIHIrYyBlcXVhbCB0byB0aGUgc3VwcG9ydGVkIHdpZHRoIG9mIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgKiAgICAgICAgIGFuZCB0aGUgcmF0ZSBhIG11bHRpcGxlIG9mIDggYml0cyAob25lIGJ5dGUpIGluIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICogQHJldHVybiBaZXJvIGlmIHN1Y2Nlc3NmdWwsIDEgb3RoZXJ3aXNlLgorICAqLworaW50IFByZWZpeF9TcG9uZ2VJbml0aWFsaXplKFByZWZpeF9TcG9uZ2VJbnN0YW5jZSAqc3BvbmdlSW5zdGFuY2UsIHVuc2lnbmVkIGludCByYXRlLCB1bnNpZ25lZCBpbnQgY2FwYWNpdHkpOworCisvKioKKyAgKiBGdW5jdGlvbiB0byBnaXZlIGlucHV0IGRhdGEgYnl0ZXMgZm9yIHRoZSBzcG9uZ2UgZnVuY3Rpb24gdG8gYWJzb3JiLgorICAqIEBwYXJhbSAgc3BvbmdlSW5zdGFuY2UgIFBvaW50ZXIgdG8gdGhlIHNwb25nZSBpbnN0YW5jZSBpbml0aWFsaXplZCBieSBQcmVmaXhfU3BvbmdlSW5pdGlhbGl6ZSgpLgorICAqIEBwYXJhbSAgZGF0YSAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YS4KKyAgKiBAcGFyYW0gIGRhdGFCeXRlTGVuICBUaGUgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIHByb3ZpZGVkIGluIHRoZSBpbnB1dCBkYXRhLgorICAqIEBwcmUgICAgVGhlIHNwb25nZSBmdW5jdGlvbiBtdXN0IGJlIGluIHRoZSBhYnNvcmJpbmcgcGhhc2UsCisgICogICAgICAgICBpLmUuLCBQcmVmaXhfU3BvbmdlU3F1ZWV6ZSgpIG9yIFByZWZpeF9TcG9uZ2VBYnNvcmJMYXN0RmV3Qml0cygpCisgICogICAgICAgICBtdXN0IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGJlZm9yZS4KKyAgKiBAcmV0dXJuIFplcm8gaWYgc3VjY2Vzc2Z1bCwgMSBvdGhlcndpc2UuCisgICovCitpbnQgUHJlZml4X1Nwb25nZUFic29yYihQcmVmaXhfU3BvbmdlSW5zdGFuY2UgKnNwb25nZUluc3RhbmNlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3QgZGF0YUJ5dGVMZW4pOworCisvKioKKyAgKiBGdW5jdGlvbiB0byBnaXZlIGlucHV0IGRhdGEgYml0cyBmb3IgdGhlIHNwb25nZSBmdW5jdGlvbiB0byBhYnNvcmIKKyAgKiBhbmQgdGhlbiB0byBzd2l0Y2ggdG8gdGhlIHNxdWVlemluZyBwaGFzZS4KKyAgKiBAcGFyYW0gIHNwb25nZUluc3RhbmNlICBQb2ludGVyIHRvIHRoZSBzcG9uZ2UgaW5zdGFuY2UgaW5pdGlhbGl6ZWQgYnkgUHJlZml4X1Nwb25nZUluaXRpYWxpemUoKS4KKyAgKiBAcGFyYW0gIGRlbGltaXRlZERhdGEgICBCeXRlIGNvbnRhaW5pbmcgZnJvbSAwIHRvIDcgdHJhaWxpbmcgYml0cworICAqICAgICAgICAgICAgICAgICAgICAgdGhhdCBtdXN0IGJlIGFic29yYmVkLgorICAqICAgICAgICAgICAgICAgICAgICAgVGhlc2UgPGk+bjwvaT4gYml0cyBtdXN0IGJlIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgcG9zaXRpb25zLgorICAqICAgICAgICAgICAgICAgICAgICAgVGhlc2UgYml0cyBtdXN0IGJlIGRlbGltaXRlZCB3aXRoIGEgYml0IDEgYXQgcG9zaXRpb24gPGk+bjwvaT4KKyAgKiAgICAgICAgICAgICAgICAgICAgIChjb3VudGluZyBmcm9tIDA9TFNCIHRvIDc9TVNCKSBhbmQgZm9sbG93ZWQgYnkgYml0cyAwCisgICogICAgICAgICAgICAgICAgICAgICBmcm9tIHBvc2l0aW9uIDxpPm48L2k+KzEgdG8gcG9zaXRpb24gNy4KKyAgKiAgICAgICAgICAgICAgICAgICAgIFNvbWUgZXhhbXBsZXM6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgLSBJZiBubyBiaXRzIGFyZSB0byBiZSBhYnNvcmJlZCwgdGhlbiBAYSBkZWxpbWl0ZWREYXRhIG11c3QgYmUgMHgwMS4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAtIElmIHRoZSAyLWJpdCBzZXF1ZW5jZSAwLDAgaXMgdG8gYmUgYWJzb3JiZWQsIEBhIGRlbGltaXRlZERhdGEgbXVzdCBiZSAweDA0LgorICAqICAgICAgICAgICAgICAgICAgICAgICAgIC0gSWYgdGhlIDUtYml0IHNlcXVlbmNlIDAsMSwwLDAsMSBpcyB0byBiZSBhYnNvcmJlZCwgQGEgZGVsaW1pdGVkRGF0YSBtdXN0IGJlIDB4MzIuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgLSBJZiB0aGUgNy1iaXQgc2VxdWVuY2UgMSwxLDAsMSwwLDAsMCBpcyB0byBiZSBhYnNvcmJlZCwgQGEgZGVsaW1pdGVkRGF0YSBtdXN0IGJlIDB4OEIuCisgICogICAgICAgICAgICAgICAgICAgICAuCisgICogQHByZSAgICBUaGUgc3BvbmdlIGZ1bmN0aW9uIG11c3QgYmUgaW4gdGhlIGFic29yYmluZyBwaGFzZSwKKyAgKiAgICAgICAgIGkuZS4sIFByZWZpeF9TcG9uZ2VTcXVlZXplKCkgb3IgUHJlZml4X1Nwb25nZUFic29yYkxhc3RGZXdCaXRzKCkKKyAgKiAgICAgICAgIG11c3Qgbm90IGhhdmUgYmVlbiBjYWxsZWQgYmVmb3JlLgorICAqIEBwcmUgICAgQGEgZGVsaW1pdGVkRGF0YSDiiaAgMHgwMAorICAqIEByZXR1cm4gWmVybyBpZiBzdWNjZXNzZnVsLCAxIG90aGVyd2lzZS4KKyAgKi8KK2ludCBQcmVmaXhfU3BvbmdlQWJzb3JiTGFzdEZld0JpdHMoUHJlZml4X1Nwb25nZUluc3RhbmNlICpzcG9uZ2VJbnN0YW5jZSwgdW5zaWduZWQgY2hhciBkZWxpbWl0ZWREYXRhKTsKKworLyoqCisgICogRnVuY3Rpb24gdG8gc3F1ZWV6ZSBvdXRwdXQgZGF0YSBmcm9tIHRoZSBzcG9uZ2UgZnVuY3Rpb24uCisgICogSWYgdGhlIHNwb25nZSBmdW5jdGlvbiB3YXMgaW4gdGhlIGFic29yYmluZyBwaGFzZSwgdGhpcyBmdW5jdGlvbgorICAqIHN3aXRjaGVzIGl0IHRvIHRoZSBzcXVlZXppbmcgcGhhc2UKKyAgKiBhcyBpZiBQcmVmaXhfU3BvbmdlQWJzb3JiTGFzdEZld0JpdHMoc3BvbmdlSW5zdGFuY2UsIDB4MDEpIHdhcyBjYWxsZWQuCisgICogQHBhcmFtICBzcG9uZ2VJbnN0YW5jZSAgUG9pbnRlciB0byB0aGUgc3BvbmdlIGluc3RhbmNlIGluaXRpYWxpemVkIGJ5IFByZWZpeF9TcG9uZ2VJbml0aWFsaXplKCkuCisgICogQHBhcmFtICBkYXRhICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgd2hlcmUgdG8gc3RvcmUgdGhlIG91dHB1dCBkYXRhLgorICAqIEBwYXJhbSAgZGF0YUJ5dGVMZW4gVGhlIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgZGVzaXJlZC4KKyAgKiBAcmV0dXJuIFplcm8gaWYgc3VjY2Vzc2Z1bCwgMSBvdGhlcndpc2UuCisgICovCitpbnQgUHJlZml4X1Nwb25nZVNxdWVlemUoUHJlZml4X1Nwb25nZUluc3RhbmNlICpzcG9uZ2VJbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGRhdGFCeXRlTGVuKTsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiYWxpZ24uaCIKKworI2RlZmluZSBLQ1BfRGVjbGFyZVNwb25nZVN0cnVjdHVyZShwcmVmaXgsIHNpemUsIGFsaWdubWVudCkgXAorICAgIEFMSUdOKGFsaWdubWVudCkgdHlwZWRlZiBzdHJ1Y3QgcHJlZml4IyNfU3BvbmdlSW5zdGFuY2VTdHJ1Y3QgeyBcCisgICAgICAgIHVuc2lnbmVkIGNoYXIgc3RhdGVbc2l6ZV07IFwKKyAgICAgICAgdW5zaWduZWQgaW50IHJhdGU7IFwKKyAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVJT0luZGV4OyBcCisgICAgICAgIGludCBzcXVlZXppbmc7IFwKKyAgICB9IHByZWZpeCMjX1Nwb25nZUluc3RhbmNlOworCisjZGVmaW5lIEtDUF9EZWNsYXJlU3BvbmdlRnVuY3Rpb25zKHByZWZpeCkgXAorICAgIGludCBwcmVmaXgjI19TcG9uZ2UodW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBjYXBhY2l0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsIHNpemVfdCBpbnB1dEJ5dGVMZW4sIHVuc2lnbmVkIGNoYXIgc3VmZml4LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIHNpemVfdCBvdXRwdXRCeXRlTGVuKTsgXAorICAgIGludCBwcmVmaXgjI19TcG9uZ2VJbml0aWFsaXplKHByZWZpeCMjX1Nwb25nZUluc3RhbmNlICpzcG9uZ2VJbnN0YW5jZSwgdW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBjYXBhY2l0eSk7IFwKKyAgICBpbnQgcHJlZml4IyNfU3BvbmdlQWJzb3JiKHByZWZpeCMjX1Nwb25nZUluc3RhbmNlICpzcG9uZ2VJbnN0YW5jZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGRhdGFCeXRlTGVuKTsgXAorICAgIGludCBwcmVmaXgjI19TcG9uZ2VBYnNvcmJMYXN0RmV3Qml0cyhwcmVmaXgjI19TcG9uZ2VJbnN0YW5jZSAqc3BvbmdlSW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgZGVsaW1pdGVkRGF0YSk7IFwKKyAgICBpbnQgcHJlZml4IyNfU3BvbmdlU3F1ZWV6ZShwcmVmaXgjI19TcG9uZ2VJbnN0YW5jZSAqc3BvbmdlSW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHNpemVfdCBkYXRhQnl0ZUxlbik7CisKKyNpZm5kZWYgS2VjY2FrUDIwMF9leGNsdWRlZAorICAgICNpbmNsdWRlICJLZWNjYWtQLTIwMC1TblAuaCIKKyAgICBLQ1BfRGVjbGFyZVNwb25nZVN0cnVjdHVyZShLZWNjYWtXaWR0aDIwMCwgS2VjY2FrUDIwMF9zdGF0ZVNpemVJbkJ5dGVzLCBLZWNjYWtQMjAwX3N0YXRlQWxpZ25tZW50KQorICAgIEtDUF9EZWNsYXJlU3BvbmdlRnVuY3Rpb25zKEtlY2Nha1dpZHRoMjAwKQorI2VuZGlmCisKKyNpZm5kZWYgS2VjY2FrUDQwMF9leGNsdWRlZAorICAgICNpbmNsdWRlICJLZWNjYWtQLTQwMC1TblAuaCIKKyAgICBLQ1BfRGVjbGFyZVNwb25nZVN0cnVjdHVyZShLZWNjYWtXaWR0aDQwMCwgS2VjY2FrUDQwMF9zdGF0ZVNpemVJbkJ5dGVzLCBLZWNjYWtQNDAwX3N0YXRlQWxpZ25tZW50KQorICAgIEtDUF9EZWNsYXJlU3BvbmdlRnVuY3Rpb25zKEtlY2Nha1dpZHRoNDAwKQorI2VuZGlmCisKKyNpZm5kZWYgS2VjY2FrUDgwMF9leGNsdWRlZAorICAgICNpbmNsdWRlICJLZWNjYWtQLTgwMC1TblAuaCIKKyAgICBLQ1BfRGVjbGFyZVNwb25nZVN0cnVjdHVyZShLZWNjYWtXaWR0aDgwMCwgS2VjY2FrUDgwMF9zdGF0ZVNpemVJbkJ5dGVzLCBLZWNjYWtQODAwX3N0YXRlQWxpZ25tZW50KQorICAgIEtDUF9EZWNsYXJlU3BvbmdlRnVuY3Rpb25zKEtlY2Nha1dpZHRoODAwKQorI2VuZGlmCisKKyNpZm5kZWYgS2VjY2FrUDE2MDBfZXhjbHVkZWQKKyAgICAjaW5jbHVkZSAiS2VjY2FrUC0xNjAwLVNuUC5oIgorICAgIEtDUF9EZWNsYXJlU3BvbmdlU3RydWN0dXJlKEtlY2Nha1dpZHRoMTYwMCwgS2VjY2FrUDE2MDBfc3RhdGVTaXplSW5CeXRlcywgS2VjY2FrUDE2MDBfc3RhdGVBbGlnbm1lbnQpCisgICAgS0NQX0RlY2xhcmVTcG9uZ2VGdW5jdGlvbnMoS2VjY2FrV2lkdGgxNjAwKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc2hhMy9rY3AvS2VjY2FrU3BvbmdlLmluYyBiL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha1Nwb25nZS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwNzM5ZAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NoYTMva2NwL0tlY2Nha1Nwb25nZS5pbmMKQEAgLTAsMCArMSwzMzIgQEAKKy8qCitJbXBsZW1lbnRhdGlvbiBieSB0aGUgS2VjY2FrLCBLZXlhayBhbmQgS2V0amUgVGVhbXMsIG5hbWVseSwgR3VpZG8gQmVydG9uaSwKK0pvYW4gRGFlbWVuLCBNaWNoYcOrbCBQZWV0ZXJzLCBHaWxsZXMgVmFuIEFzc2NoZSBhbmQgUm9ubnkgVmFuIEtlZXIsIGhlcmVieQorZGVub3RlZCBhcyAidGhlIGltcGxlbWVudGVyIi4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIGZlZWRiYWNrIG9yIHF1ZXN0aW9ucywgcGxlYXNlIHJlZmVyIHRvIG91ciB3ZWJzaXRlczoKK2h0dHA6Ly9rZWNjYWsubm9la2Vvbi5vcmcvCitodHRwOi8va2V5YWsubm9la2Vvbi5vcmcvCitodHRwOi8va2V0amUubm9la2Vvbi5vcmcvCisKK1RvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgaW1wbGVtZW50ZXIgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0CithbmQgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhlIHNvdXJjZSBjb2RlIGluIHRoaXMgZmlsZS4KK2h0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KKyovCisKKyNkZWZpbmUgSk9JTjAoYSwgYikgICAgICAgICAgICAgICAgICAgICBhICMjIGIKKyNkZWZpbmUgSk9JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICBKT0lOMChhLCBiKQorCisjZGVmaW5lIFNwb25nZSAgICAgICAgICAgICAgICAgICAgICAgICAgSk9JTihwcmVmaXgsIF9TcG9uZ2UpCisjZGVmaW5lIFNwb25nZUluc3RhbmNlICAgICAgICAgICAgICAgICAgSk9JTihwcmVmaXgsIF9TcG9uZ2VJbnN0YW5jZSkKKyNkZWZpbmUgU3BvbmdlSW5pdGlhbGl6ZSAgICAgICAgICAgICAgICBKT0lOKHByZWZpeCwgX1Nwb25nZUluaXRpYWxpemUpCisjZGVmaW5lIFNwb25nZUFic29yYiAgICAgICAgICAgICAgICAgICAgSk9JTihwcmVmaXgsIF9TcG9uZ2VBYnNvcmIpCisjZGVmaW5lIFNwb25nZUFic29yYkxhc3RGZXdCaXRzICAgICAgICAgSk9JTihwcmVmaXgsIF9TcG9uZ2VBYnNvcmJMYXN0RmV3Qml0cykKKyNkZWZpbmUgU3BvbmdlU3F1ZWV6ZSAgICAgICAgICAgICAgICAgICBKT0lOKHByZWZpeCwgX1Nwb25nZVNxdWVlemUpCisKKyNkZWZpbmUgU25QX3N0YXRlU2l6ZUluQnl0ZXMgICAgICAgICAgICBKT0lOKFNuUCwgX3N0YXRlU2l6ZUluQnl0ZXMpCisjZGVmaW5lIFNuUF9zdGF0ZUFsaWdubWVudCAgICAgICAgICAgICAgSk9JTihTblAsIF9zdGF0ZUFsaWdubWVudCkKKyNkZWZpbmUgU25QX1N0YXRpY0luaXRpYWxpemUgICAgICAgICAgICBKT0lOKFNuUCwgX1N0YXRpY0luaXRpYWxpemUpCisjZGVmaW5lIFNuUF9Jbml0aWFsaXplICAgICAgICAgICAgICAgICAgSk9JTihTblAsIF9Jbml0aWFsaXplKQorI2RlZmluZSBTblBfQWRkQnl0ZSAgICAgICAgICAgICAgICAgICAgIEpPSU4oU25QLCBfQWRkQnl0ZSkKKyNkZWZpbmUgU25QX0FkZEJ5dGVzICAgICAgICAgICAgICAgICAgICBKT0lOKFNuUCwgX0FkZEJ5dGVzKQorI2RlZmluZSBTblBfRXh0cmFjdEJ5dGVzICAgICAgICAgICAgICAgIEpPSU4oU25QLCBfRXh0cmFjdEJ5dGVzKQorCitpbnQgU3BvbmdlKHVuc2lnbmVkIGludCByYXRlLCB1bnNpZ25lZCBpbnQgY2FwYWNpdHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LCBzaXplX3QgaW5wdXRCeXRlTGVuLCB1bnNpZ25lZCBjaGFyIHN1ZmZpeCwgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBzaXplX3Qgb3V0cHV0Qnl0ZUxlbikKK3sKKyAgICBBTElHTihTblBfc3RhdGVBbGlnbm1lbnQpIHVuc2lnbmVkIGNoYXIgc3RhdGVbU25QX3N0YXRlU2l6ZUluQnl0ZXNdOworICAgIHVuc2lnbmVkIGludCBwYXJ0aWFsQmxvY2s7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY3VySW5wdXQgPSBpbnB1dDsKKyAgICB1bnNpZ25lZCBjaGFyICpjdXJPdXRwdXQgPSBvdXRwdXQ7CisgICAgdW5zaWduZWQgaW50IHJhdGVJbkJ5dGVzID0gcmF0ZS84OworCisgICAgaWYgKHJhdGUrY2FwYWNpdHkgIT0gU25QX3dpZHRoKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoKHJhdGUgPD0gMCkgfHwgKHJhdGUgPiBTblBfd2lkdGgpIHx8ICgocmF0ZSAlIDgpICE9IDApKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoc3VmZml4ID09IDApCisgICAgICAgIHJldHVybiAxOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGUgKi8KKworICAgIFNuUF9TdGF0aWNJbml0aWFsaXplKCk7CisgICAgU25QX0luaXRpYWxpemUoc3RhdGUpOworCisgICAgLyogRmlyc3QsIGFic29yYiB3aG9sZSBibG9ja3MgKi8KKworI2lmZGVmIFNuUF9GYXN0TG9vcF9BYnNvcmIKKyAgICBpZiAoKChyYXRlSW5CeXRlcyAlIChTblBfd2lkdGgvMjAwKSkgPT0gMCkgJiYgKGlucHV0Qnl0ZUxlbiA+PSByYXRlSW5CeXRlcykpIHsKKyAgICAgICAgLyogZmFzdCBsYW5lOiB3aG9sZSBsYW5lIHJhdGUgKi8KKworICAgICAgICBzaXplX3QgajsKKyAgICAgICAgaiA9IFNuUF9GYXN0TG9vcF9BYnNvcmIoc3RhdGUsIHJhdGVJbkJ5dGVzLyhTblBfd2lkdGgvMjAwKSwgY3VySW5wdXQsIGlucHV0Qnl0ZUxlbik7CisgICAgICAgIGN1cklucHV0ICs9IGo7CisgICAgICAgIGlucHV0Qnl0ZUxlbiAtPSBqOworICAgIH0KKyNlbmRpZgorICAgIHdoaWxlKGlucHV0Qnl0ZUxlbiA+PSAoc2l6ZV90KXJhdGVJbkJ5dGVzKSB7CisgICAgICAgICNpZmRlZiBLZWNjYWtSZWZlcmVuY2UKKyAgICAgICAgZGlzcGxheUJ5dGVzKDEsICJCbG9jayB0byBiZSBhYnNvcmJlZCIsIGN1cklucHV0LCByYXRlSW5CeXRlcyk7CisgICAgICAgICNlbmRpZgorICAgICAgICBTblBfQWRkQnl0ZXMoc3RhdGUsIGN1cklucHV0LCAwLCByYXRlSW5CeXRlcyk7CisgICAgICAgIFNuUF9QZXJtdXRlKHN0YXRlKTsKKyAgICAgICAgY3VySW5wdXQgKz0gcmF0ZUluQnl0ZXM7CisgICAgICAgIGlucHV0Qnl0ZUxlbiAtPSByYXRlSW5CeXRlczsKKyAgICB9CisKKyAgICAvKiBUaGVuLCBhYnNvcmIgd2hhdCByZW1haW5zICovCisKKyAgICBwYXJ0aWFsQmxvY2sgPSAodW5zaWduZWQgaW50KWlucHV0Qnl0ZUxlbjsKKyAgICAjaWZkZWYgS2VjY2FrUmVmZXJlbmNlCisgICAgZGlzcGxheUJ5dGVzKDEsICJCbG9jayB0byBiZSBhYnNvcmJlZCAocGFydCkiLCBjdXJJbnB1dCwgcGFydGlhbEJsb2NrKTsKKyAgICAjZW5kaWYKKyAgICBTblBfQWRkQnl0ZXMoc3RhdGUsIGN1cklucHV0LCAwLCBwYXJ0aWFsQmxvY2spOworCisgICAgLyogRmluYWxseSwgYWJzb3JiIHRoZSBzdWZmaXggKi8KKworICAgICNpZmRlZiBLZWNjYWtSZWZlcmVuY2UKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgZGVsaW1pdGVkRGF0YTFbMV07CisgICAgICAgIGRlbGltaXRlZERhdGExWzBdID0gc3VmZml4OworICAgICAgICBkaXNwbGF5Qnl0ZXMoMSwgIkJsb2NrIHRvIGJlIGFic29yYmVkIChsYXN0IGZldyBiaXRzICsgZmlyc3QgYml0IG9mIHBhZGRpbmcpIiwgZGVsaW1pdGVkRGF0YTEsIDEpOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAvKiBMYXN0IGZldyBiaXRzLCB3aG9zZSBkZWxpbWl0ZXIgY29pbmNpZGVzIHdpdGggZmlyc3QgYml0IG9mIHBhZGRpbmcgKi8KKworICAgIFNuUF9BZGRCeXRlKHN0YXRlLCBzdWZmaXgsIHBhcnRpYWxCbG9jayk7CisgICAgLyogSWYgdGhlIGZpcnN0IGJpdCBvZiBwYWRkaW5nIGlzIGF0IHBvc2l0aW9uIHJhdGUtMSwgd2UgbmVlZCBhIHdob2xlIG5ldyBibG9jayBmb3IgdGhlIHNlY29uZCBiaXQgb2YgcGFkZGluZyAqLworCisgICAgaWYgKChzdWZmaXggPj0gMHg4MCkgJiYgKHBhcnRpYWxCbG9jayA9PSAocmF0ZUluQnl0ZXMtMSkpKQorICAgICAgICBTblBfUGVybXV0ZShzdGF0ZSk7CisgICAgLyogU2Vjb25kIGJpdCBvZiBwYWRkaW5nICovCisKKyAgICBTblBfQWRkQnl0ZShzdGF0ZSwgMHg4MCwgcmF0ZUluQnl0ZXMtMSk7CisgICAgI2lmZGVmIEtlY2Nha1JlZmVyZW5jZQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBibG9ja1tTblBfd2lkdGgvOF07CisgICAgICAgIG1lbXNldChibG9jaywgMCwgU25QX3dpZHRoLzgpOworICAgICAgICBibG9ja1tyYXRlSW5CeXRlcy0xXSA9IDB4ODA7CisgICAgICAgIGRpc3BsYXlCeXRlcygxLCAiU2Vjb25kIGJpdCBvZiBwYWRkaW5nIiwgYmxvY2ssIHJhdGVJbkJ5dGVzKTsKKyAgICB9CisgICAgI2VuZGlmCisgICAgU25QX1Blcm11dGUoc3RhdGUpOworICAgICNpZmRlZiBLZWNjYWtSZWZlcmVuY2UKKyAgICBkaXNwbGF5VGV4dCgxLCAiLS0tIFN3aXRjaGluZyB0byBzcXVlZXppbmcgcGhhc2UgLS0tIik7CisgICAgI2VuZGlmCisKKyAgICAvKiBGaXJzdCwgb3V0cHV0IHdob2xlIGJsb2NrcyAqLworCisgICAgd2hpbGUob3V0cHV0Qnl0ZUxlbiA+IChzaXplX3QpcmF0ZUluQnl0ZXMpIHsKKyAgICAgICAgU25QX0V4dHJhY3RCeXRlcyhzdGF0ZSwgY3VyT3V0cHV0LCAwLCByYXRlSW5CeXRlcyk7CisgICAgICAgIFNuUF9QZXJtdXRlKHN0YXRlKTsKKyAgICAgICAgI2lmZGVmIEtlY2Nha1JlZmVyZW5jZQorICAgICAgICBkaXNwbGF5Qnl0ZXMoMSwgIlNxdWVlemVkIGJsb2NrIiwgY3VyT3V0cHV0LCByYXRlSW5CeXRlcyk7CisgICAgICAgICNlbmRpZgorICAgICAgICBjdXJPdXRwdXQgKz0gcmF0ZUluQnl0ZXM7CisgICAgICAgIG91dHB1dEJ5dGVMZW4gLT0gcmF0ZUluQnl0ZXM7CisgICAgfQorCisgICAgLyogRmluYWxseSwgb3V0cHV0IHdoYXQgcmVtYWlucyAqLworCisgICAgcGFydGlhbEJsb2NrID0gKHVuc2lnbmVkIGludClvdXRwdXRCeXRlTGVuOworICAgIFNuUF9FeHRyYWN0Qnl0ZXMoc3RhdGUsIGN1ck91dHB1dCwgMCwgcGFydGlhbEJsb2NrKTsKKyAgICAjaWZkZWYgS2VjY2FrUmVmZXJlbmNlCisgICAgZGlzcGxheUJ5dGVzKDEsICJTcXVlZXplZCBibG9jayAocGFydCkiLCBjdXJPdXRwdXQsIHBhcnRpYWxCbG9jayk7CisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgU3BvbmdlSW5pdGlhbGl6ZShTcG9uZ2VJbnN0YW5jZSAqaW5zdGFuY2UsIHVuc2lnbmVkIGludCByYXRlLCB1bnNpZ25lZCBpbnQgY2FwYWNpdHkpCit7CisgICAgaWYgKHJhdGUrY2FwYWNpdHkgIT0gU25QX3dpZHRoKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoKHJhdGUgPD0gMCkgfHwgKHJhdGUgPiBTblBfd2lkdGgpIHx8ICgocmF0ZSAlIDgpICE9IDApKQorICAgICAgICByZXR1cm4gMTsKKyAgICBTblBfU3RhdGljSW5pdGlhbGl6ZSgpOworICAgIFNuUF9Jbml0aWFsaXplKGluc3RhbmNlLT5zdGF0ZSk7CisgICAgaW5zdGFuY2UtPnJhdGUgPSByYXRlOworICAgIGluc3RhbmNlLT5ieXRlSU9JbmRleCA9IDA7CisgICAgaW5zdGFuY2UtPnNxdWVlemluZyA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgU3BvbmdlQWJzb3JiKFNwb25nZUluc3RhbmNlICppbnN0YW5jZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGRhdGFCeXRlTGVuKQoreworICAgIHNpemVfdCBpLCBqOworICAgIHVuc2lnbmVkIGludCBwYXJ0aWFsQmxvY2s7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY3VyRGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgcmF0ZUluQnl0ZXMgPSBpbnN0YW5jZS0+cmF0ZS84OworCisgICAgaWYgKGluc3RhbmNlLT5zcXVlZXppbmcpCisgICAgICAgIHJldHVybiAxOyAvKiBUb28gbGF0ZSBmb3IgYWRkaXRpb25hbCBpbnB1dCAqLworCisKKyAgICBpID0gMDsKKyAgICBjdXJEYXRhID0gZGF0YTsKKyAgICB3aGlsZShpIDwgZGF0YUJ5dGVMZW4pIHsKKyAgICAgICAgaWYgKChpbnN0YW5jZS0+Ynl0ZUlPSW5kZXggPT0gMCkgJiYgKGRhdGFCeXRlTGVuID49IChpICsgcmF0ZUluQnl0ZXMpKSkgeworI2lmZGVmIFNuUF9GYXN0TG9vcF9BYnNvcmIKKyAgICAgICAgICAgIC8qIHByb2Nlc3NpbmcgZnVsbCBibG9ja3MgZmlyc3QgKi8KKworICAgICAgICAgICAgaWYgKChyYXRlSW5CeXRlcyAlIChTblBfd2lkdGgvMjAwKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIGZhc3QgbGFuZTogd2hvbGUgbGFuZSByYXRlICovCisKKyAgICAgICAgICAgICAgICBqID0gU25QX0Zhc3RMb29wX0Fic29yYihpbnN0YW5jZS0+c3RhdGUsIHJhdGVJbkJ5dGVzLyhTblBfd2lkdGgvMjAwKSwgY3VyRGF0YSwgZGF0YUJ5dGVMZW4gLSBpKTsKKyAgICAgICAgICAgICAgICBpICs9IGo7CisgICAgICAgICAgICAgICAgY3VyRGF0YSArPSBqOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBmb3Ioaj1kYXRhQnl0ZUxlbi1pOyBqPj1yYXRlSW5CeXRlczsgai09cmF0ZUluQnl0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtlY2Nha1JlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Qnl0ZXMoMSwgIkJsb2NrIHRvIGJlIGFic29yYmVkIiwgY3VyRGF0YSwgcmF0ZUluQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgU25QX0FkZEJ5dGVzKGluc3RhbmNlLT5zdGF0ZSwgY3VyRGF0YSwgMCwgcmF0ZUluQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICBTblBfUGVybXV0ZShpbnN0YW5jZS0+c3RhdGUpOworICAgICAgICAgICAgICAgICAgICBjdXJEYXRhKz1yYXRlSW5CeXRlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSA9IGRhdGFCeXRlTGVuIC0gajsKKyNpZmRlZiBTblBfRmFzdExvb3BfQWJzb3JiCisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5vcm1hbCBsYW5lOiB1c2luZyB0aGUgbWVzc2FnZSBxdWV1ZSAqLworCisgICAgICAgICAgICBwYXJ0aWFsQmxvY2sgPSAodW5zaWduZWQgaW50KShkYXRhQnl0ZUxlbiAtIGkpOworICAgICAgICAgICAgaWYgKHBhcnRpYWxCbG9jaytpbnN0YW5jZS0+Ynl0ZUlPSW5kZXggPiByYXRlSW5CeXRlcykKKyAgICAgICAgICAgICAgICBwYXJ0aWFsQmxvY2sgPSByYXRlSW5CeXRlcy1pbnN0YW5jZS0+Ynl0ZUlPSW5kZXg7CisgICAgICAgICAgICAjaWZkZWYgS2VjY2FrUmVmZXJlbmNlCisgICAgICAgICAgICBkaXNwbGF5Qnl0ZXMoMSwgIkJsb2NrIHRvIGJlIGFic29yYmVkIChwYXJ0KSIsIGN1ckRhdGEsIHBhcnRpYWxCbG9jayk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGkgKz0gcGFydGlhbEJsb2NrOworCisgICAgICAgICAgICBTblBfQWRkQnl0ZXMoaW5zdGFuY2UtPnN0YXRlLCBjdXJEYXRhLCBpbnN0YW5jZS0+Ynl0ZUlPSW5kZXgsIHBhcnRpYWxCbG9jayk7CisgICAgICAgICAgICBjdXJEYXRhICs9IHBhcnRpYWxCbG9jazsKKyAgICAgICAgICAgIGluc3RhbmNlLT5ieXRlSU9JbmRleCArPSBwYXJ0aWFsQmxvY2s7CisgICAgICAgICAgICBpZiAoaW5zdGFuY2UtPmJ5dGVJT0luZGV4ID09IHJhdGVJbkJ5dGVzKSB7CisgICAgICAgICAgICAgICAgU25QX1Blcm11dGUoaW5zdGFuY2UtPnN0YXRlKTsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZS0+Ynl0ZUlPSW5kZXggPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBTcG9uZ2VBYnNvcmJMYXN0RmV3Qml0cyhTcG9uZ2VJbnN0YW5jZSAqaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgZGVsaW1pdGVkRGF0YSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmF0ZUluQnl0ZXMgPSBpbnN0YW5jZS0+cmF0ZS84OworCisgICAgaWYgKGRlbGltaXRlZERhdGEgPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKGluc3RhbmNlLT5zcXVlZXppbmcpCisgICAgICAgIHJldHVybiAxOyAvKiBUb28gbGF0ZSBmb3IgYWRkaXRpb25hbCBpbnB1dCAqLworCisKKyAgICAjaWZkZWYgS2VjY2FrUmVmZXJlbmNlCisgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGRlbGltaXRlZERhdGExWzFdOworICAgICAgICBkZWxpbWl0ZWREYXRhMVswXSA9IGRlbGltaXRlZERhdGE7CisgICAgICAgIGRpc3BsYXlCeXRlcygxLCAiQmxvY2sgdG8gYmUgYWJzb3JiZWQgKGxhc3QgZmV3IGJpdHMgKyBmaXJzdCBiaXQgb2YgcGFkZGluZykiLCBkZWxpbWl0ZWREYXRhMSwgMSk7CisgICAgfQorICAgICNlbmRpZgorICAgIC8qIExhc3QgZmV3IGJpdHMsIHdob3NlIGRlbGltaXRlciBjb2luY2lkZXMgd2l0aCBmaXJzdCBiaXQgb2YgcGFkZGluZyAqLworCisgICAgU25QX0FkZEJ5dGUoaW5zdGFuY2UtPnN0YXRlLCBkZWxpbWl0ZWREYXRhLCBpbnN0YW5jZS0+Ynl0ZUlPSW5kZXgpOworICAgIC8qIElmIHRoZSBmaXJzdCBiaXQgb2YgcGFkZGluZyBpcyBhdCBwb3NpdGlvbiByYXRlLTEsIHdlIG5lZWQgYSB3aG9sZSBuZXcgYmxvY2sgZm9yIHRoZSBzZWNvbmQgYml0IG9mIHBhZGRpbmcgKi8KKworICAgIGlmICgoZGVsaW1pdGVkRGF0YSA+PSAweDgwKSAmJiAoaW5zdGFuY2UtPmJ5dGVJT0luZGV4ID09IChyYXRlSW5CeXRlcy0xKSkpCisgICAgICAgIFNuUF9QZXJtdXRlKGluc3RhbmNlLT5zdGF0ZSk7CisgICAgLyogU2Vjb25kIGJpdCBvZiBwYWRkaW5nICovCisKKyAgICBTblBfQWRkQnl0ZShpbnN0YW5jZS0+c3RhdGUsIDB4ODAsIHJhdGVJbkJ5dGVzLTEpOworICAgICNpZmRlZiBLZWNjYWtSZWZlcmVuY2UKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYmxvY2tbU25QX3dpZHRoLzhdOworICAgICAgICBtZW1zZXQoYmxvY2ssIDAsIFNuUF93aWR0aC84KTsKKyAgICAgICAgYmxvY2tbcmF0ZUluQnl0ZXMtMV0gPSAweDgwOworICAgICAgICBkaXNwbGF5Qnl0ZXMoMSwgIlNlY29uZCBiaXQgb2YgcGFkZGluZyIsIGJsb2NrLCByYXRlSW5CeXRlcyk7CisgICAgfQorICAgICNlbmRpZgorICAgIFNuUF9QZXJtdXRlKGluc3RhbmNlLT5zdGF0ZSk7CisgICAgaW5zdGFuY2UtPmJ5dGVJT0luZGV4ID0gMDsKKyAgICBpbnN0YW5jZS0+c3F1ZWV6aW5nID0gMTsKKyAgICAjaWZkZWYgS2VjY2FrUmVmZXJlbmNlCisgICAgZGlzcGxheVRleHQoMSwgIi0tLSBTd2l0Y2hpbmcgdG8gc3F1ZWV6aW5nIHBoYXNlIC0tLSIpOworICAgICNlbmRpZgorICAgIHJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBTcG9uZ2VTcXVlZXplKFNwb25nZUluc3RhbmNlICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGRhdGFCeXRlTGVuKQoreworICAgIHNpemVfdCBpLCBqOworICAgIHVuc2lnbmVkIGludCBwYXJ0aWFsQmxvY2s7CisgICAgdW5zaWduZWQgaW50IHJhdGVJbkJ5dGVzID0gaW5zdGFuY2UtPnJhdGUvODsKKyAgICB1bnNpZ25lZCBjaGFyICpjdXJEYXRhOworCisgICAgaWYgKCFpbnN0YW5jZS0+c3F1ZWV6aW5nKQorICAgICAgICBTcG9uZ2VBYnNvcmJMYXN0RmV3Qml0cyhpbnN0YW5jZSwgMHgwMSk7CisKKyAgICBpID0gMDsKKyAgICBjdXJEYXRhID0gZGF0YTsKKyAgICB3aGlsZShpIDwgZGF0YUJ5dGVMZW4pIHsKKyAgICAgICAgaWYgKChpbnN0YW5jZS0+Ynl0ZUlPSW5kZXggPT0gcmF0ZUluQnl0ZXMpICYmIChkYXRhQnl0ZUxlbiA+PSAoaSArIHJhdGVJbkJ5dGVzKSkpIHsKKyAgICAgICAgICAgIGZvcihqPWRhdGFCeXRlTGVuLWk7IGo+PXJhdGVJbkJ5dGVzOyBqLT1yYXRlSW5CeXRlcykgeworICAgICAgICAgICAgICAgIFNuUF9QZXJtdXRlKGluc3RhbmNlLT5zdGF0ZSk7CisgICAgICAgICAgICAgICAgU25QX0V4dHJhY3RCeXRlcyhpbnN0YW5jZS0+c3RhdGUsIGN1ckRhdGEsIDAsIHJhdGVJbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICAjaWZkZWYgS2VjY2FrUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgZGlzcGxheUJ5dGVzKDEsICJTcXVlZXplZCBibG9jayIsIGN1ckRhdGEsIHJhdGVJbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBjdXJEYXRhKz1yYXRlSW5CeXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgPSBkYXRhQnl0ZUxlbiAtIGo7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBub3JtYWwgbGFuZTogdXNpbmcgdGhlIG1lc3NhZ2UgcXVldWUgKi8KKworICAgICAgICAgICAgaWYgKGluc3RhbmNlLT5ieXRlSU9JbmRleCA9PSByYXRlSW5CeXRlcykgeworICAgICAgICAgICAgICAgIFNuUF9QZXJtdXRlKGluc3RhbmNlLT5zdGF0ZSk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UtPmJ5dGVJT0luZGV4ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcnRpYWxCbG9jayA9ICh1bnNpZ25lZCBpbnQpKGRhdGFCeXRlTGVuIC0gaSk7CisgICAgICAgICAgICBpZiAocGFydGlhbEJsb2NrK2luc3RhbmNlLT5ieXRlSU9JbmRleCA+IHJhdGVJbkJ5dGVzKQorICAgICAgICAgICAgICAgIHBhcnRpYWxCbG9jayA9IHJhdGVJbkJ5dGVzLWluc3RhbmNlLT5ieXRlSU9JbmRleDsKKyAgICAgICAgICAgIGkgKz0gcGFydGlhbEJsb2NrOworCisgICAgICAgICAgICBTblBfRXh0cmFjdEJ5dGVzKGluc3RhbmNlLT5zdGF0ZSwgY3VyRGF0YSwgaW5zdGFuY2UtPmJ5dGVJT0luZGV4LCBwYXJ0aWFsQmxvY2spOworICAgICAgICAgICAgI2lmZGVmIEtlY2Nha1JlZmVyZW5jZQorICAgICAgICAgICAgZGlzcGxheUJ5dGVzKDEsICJTcXVlZXplZCBibG9jayAocGFydCkiLCBjdXJEYXRhLCBwYXJ0aWFsQmxvY2spOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBjdXJEYXRhICs9IHBhcnRpYWxCbG9jazsKKyAgICAgICAgICAgIGluc3RhbmNlLT5ieXRlSU9JbmRleCArPSBwYXJ0aWFsQmxvY2s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI3VuZGVmIFNwb25nZQorI3VuZGVmIFNwb25nZUluc3RhbmNlCisjdW5kZWYgU3BvbmdlSW5pdGlhbGl6ZQorI3VuZGVmIFNwb25nZUFic29yYgorI3VuZGVmIFNwb25nZUFic29yYkxhc3RGZXdCaXRzCisjdW5kZWYgU3BvbmdlU3F1ZWV6ZQorI3VuZGVmIFNuUF9zdGF0ZVNpemVJbkJ5dGVzCisjdW5kZWYgU25QX3N0YXRlQWxpZ25tZW50CisjdW5kZWYgU25QX1N0YXRpY0luaXRpYWxpemUKKyN1bmRlZiBTblBfSW5pdGlhbGl6ZQorI3VuZGVmIFNuUF9BZGRCeXRlCisjdW5kZWYgU25QX0FkZEJ5dGVzCisjdW5kZWYgU25QX0V4dHJhY3RCeXRlcwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc2hhMy9rY3AvUGxTblAtRmFsbGJhY2suaW5jIGIvTW9kdWxlcy9fc2hhMy9rY3AvUGxTblAtRmFsbGJhY2suaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTExOWEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zaGEzL2tjcC9QbFNuUC1GYWxsYmFjay5pbmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qCitJbXBsZW1lbnRhdGlvbiBieSB0aGUgS2VjY2FrLCBLZXlhayBhbmQgS2V0amUgVGVhbXMsIG5hbWVseSwgR3VpZG8gQmVydG9uaSwKK0pvYW4gRGFlbWVuLCBNaWNoYcOrbCBQZWV0ZXJzLCBHaWxsZXMgVmFuIEFzc2NoZSBhbmQgUm9ubnkgVmFuIEtlZXIsIGhlcmVieQorZGVub3RlZCBhcyAidGhlIGltcGxlbWVudGVyIi4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIGZlZWRiYWNrIG9yIHF1ZXN0aW9ucywgcGxlYXNlIHJlZmVyIHRvIG91ciB3ZWJzaXRlczoKK2h0dHA6Ly9rZWNjYWsubm9la2Vvbi5vcmcvCitodHRwOi8va2V5YWsubm9la2Vvbi5vcmcvCitodHRwOi8va2V0amUubm9la2Vvbi5vcmcvCisKK1RvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgaW1wbGVtZW50ZXIgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0CithbmQgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhlIHNvdXJjZSBjb2RlIGluIHRoaXMgZmlsZS4KK2h0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KKyovCisKKy8qIGV4cGVjdCBQbFNuUF9iYXNlUGFyYWxsZWxpc20sIFBsU25QX3RhcmdldFBhcmFsbGVsaXNtICovCisKKy8qIGV4cGVjdCBTblBfc3RhdGVTaXplSW5CeXRlcywgU25QX3N0YXRlQWxpZ25tZW50ICovCisKKy8qIGV4cGVjdCBwcmVmaXggKi8KKworLyogZXhwZWN0IFNuUF8qICovCisKKworI2RlZmluZSBKT0lOMChhLCBiKSAgICAgICAgICAgICAgICAgICAgIGEgIyMgYgorI2RlZmluZSBKT0lOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgIEpPSU4wKGEsIGIpCisKKyNkZWZpbmUgUGxTblBfU3RhdGljSW5pdGlhbGl6ZSAgICAgICAgICBKT0lOKHByZWZpeCwgX1N0YXRpY0luaXRpYWxpemUpCisjZGVmaW5lIFBsU25QX0luaXRpYWxpemVBbGwgICAgICAgICAgICAgSk9JTihwcmVmaXgsIF9Jbml0aWFsaXplQWxsKQorI2RlZmluZSBQbFNuUF9BZGRCeXRlICAgICAgICAgICAgICAgICAgIEpPSU4ocHJlZml4LCBfQWRkQnl0ZSkKKyNkZWZpbmUgUGxTblBfQWRkQnl0ZXMgICAgICAgICAgICAgICAgICBKT0lOKHByZWZpeCwgX0FkZEJ5dGVzKQorI2RlZmluZSBQbFNuUF9BZGRMYW5lc0FsbCAgICAgICAgICAgICAgIEpPSU4ocHJlZml4LCBfQWRkTGFuZXNBbGwpCisjZGVmaW5lIFBsU25QX092ZXJ3cml0ZUJ5dGVzICAgICAgICAgICAgSk9JTihwcmVmaXgsIF9PdmVyd3JpdGVCeXRlcykKKyNkZWZpbmUgUGxTblBfT3ZlcndyaXRlTGFuZXNBbGwgICAgICAgICBKT0lOKHByZWZpeCwgX092ZXJ3cml0ZUxhbmVzQWxsKQorI2RlZmluZSBQbFNuUF9PdmVyd3JpdGVXaXRoWmVyb2VzICAgICAgIEpPSU4ocHJlZml4LCBfT3ZlcndyaXRlV2l0aFplcm9lcykKKyNkZWZpbmUgUGxTblBfRXh0cmFjdEJ5dGVzICAgICAgICAgICAgICBKT0lOKHByZWZpeCwgX0V4dHJhY3RCeXRlcykKKyNkZWZpbmUgUGxTblBfRXh0cmFjdExhbmVzQWxsICAgICAgICAgICBKT0lOKHByZWZpeCwgX0V4dHJhY3RMYW5lc0FsbCkKKyNkZWZpbmUgUGxTblBfRXh0cmFjdEFuZEFkZEJ5dGVzICAgICAgICBKT0lOKHByZWZpeCwgX0V4dHJhY3RBbmRBZGRCeXRlcykKKyNkZWZpbmUgUGxTblBfRXh0cmFjdEFuZEFkZExhbmVzQWxsICAgICBKT0lOKHByZWZpeCwgX0V4dHJhY3RBbmRBZGRMYW5lc0FsbCkKKworI2lmIChQbFNuUF9iYXNlUGFyYWxsZWxpc20gPT0gMSkKKyAgICAjZGVmaW5lIFNuUF9zdGF0ZVNpemVJbkJ5dGVzICAgICAgICAgICAgSk9JTihTblAsIF9zdGF0ZVNpemVJbkJ5dGVzKQorICAgICNkZWZpbmUgU25QX3N0YXRlQWxpZ25tZW50ICAgICAgICAgICAgICBKT0lOKFNuUCwgX3N0YXRlQWxpZ25tZW50KQorI2Vsc2UKKyAgICAjZGVmaW5lIFNuUF9zdGF0ZVNpemVJbkJ5dGVzICAgICAgICAgICAgSk9JTihTblAsIF9zdGF0ZXNTaXplSW5CeXRlcykKKyAgICAjZGVmaW5lIFNuUF9zdGF0ZUFsaWdubWVudCAgICAgICAgICAgICAgSk9JTihTblAsIF9zdGF0ZXNBbGlnbm1lbnQpCisjZW5kaWYKKyNkZWZpbmUgUGxTblBfZmFjdG9yICgoUGxTblBfdGFyZ2V0UGFyYWxsZWxpc20pLyhQbFNuUF9iYXNlUGFyYWxsZWxpc20pKQorI2RlZmluZSBTblBfc3RhdGVPZmZzZXQgKCgoU25QX3N0YXRlU2l6ZUluQnl0ZXMrKFNuUF9zdGF0ZUFsaWdubWVudC0xKSkvU25QX3N0YXRlQWxpZ25tZW50KSpTblBfc3RhdGVBbGlnbm1lbnQpCisjZGVmaW5lIHN0YXRlV2l0aEluZGV4KGkpICgodW5zaWduZWQgY2hhciAqKXN0YXRlcysoKGkpKlNuUF9zdGF0ZU9mZnNldCkpCisKKyNkZWZpbmUgU25QX1N0YXRpY0luaXRpYWxpemUgICAgICAgICAgICBKT0lOKFNuUCwgX1N0YXRpY0luaXRpYWxpemUpCisjZGVmaW5lIFNuUF9Jbml0aWFsaXplICAgICAgICAgICAgICAgICAgSk9JTihTblAsIF9Jbml0aWFsaXplKQorI2RlZmluZSBTblBfSW5pdGlhbGl6ZUFsbCAgICAgICAgICAgICAgIEpPSU4oU25QLCBfSW5pdGlhbGl6ZUFsbCkKKyNkZWZpbmUgU25QX0FkZEJ5dGUgICAgICAgICAgICAgICAgICAgICBKT0lOKFNuUCwgX0FkZEJ5dGUpCisjZGVmaW5lIFNuUF9BZGRCeXRlcyAgICAgICAgICAgICAgICAgICAgSk9JTihTblAsIF9BZGRCeXRlcykKKyNkZWZpbmUgU25QX0FkZExhbmVzQWxsICAgICAgICAgICAgICAgICBKT0lOKFNuUCwgX0FkZExhbmVzQWxsKQorI2RlZmluZSBTblBfT3ZlcndyaXRlQnl0ZXMgICAgICAgICAgICAgIEpPSU4oU25QLCBfT3ZlcndyaXRlQnl0ZXMpCisjZGVmaW5lIFNuUF9PdmVyd3JpdGVMYW5lc0FsbCAgICAgICAgICAgSk9JTihTblAsIF9PdmVyd3JpdGVMYW5lc0FsbCkKKyNkZWZpbmUgU25QX092ZXJ3cml0ZVdpdGhaZXJvZXMgICAgICAgICBKT0lOKFNuUCwgX092ZXJ3cml0ZVdpdGhaZXJvZXMpCisjZGVmaW5lIFNuUF9FeHRyYWN0Qnl0ZXMgICAgICAgICAgICAgICAgSk9JTihTblAsIF9FeHRyYWN0Qnl0ZXMpCisjZGVmaW5lIFNuUF9FeHRyYWN0TGFuZXNBbGwgICAgICAgICAgICAgSk9JTihTblAsIF9FeHRyYWN0TGFuZXNBbGwpCisjZGVmaW5lIFNuUF9FeHRyYWN0QW5kQWRkQnl0ZXMgICAgICAgICAgSk9JTihTblAsIF9FeHRyYWN0QW5kQWRkQnl0ZXMpCisjZGVmaW5lIFNuUF9FeHRyYWN0QW5kQWRkTGFuZXNBbGwgICAgICAgSk9JTihTblAsIF9FeHRyYWN0QW5kQWRkTGFuZXNBbGwpCisKK3ZvaWQgUGxTblBfU3RhdGljSW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgU25QX1N0YXRpY0luaXRpYWxpemUoKTsKK30KKwordm9pZCBQbFNuUF9Jbml0aWFsaXplQWxsKHZvaWQgKnN0YXRlcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8UGxTblBfZmFjdG9yOyBpKyspCisgICAgI2lmIChQbFNuUF9iYXNlUGFyYWxsZWxpc20gPT0gMSkKKyAgICAgICAgU25QX0luaXRpYWxpemUoc3RhdGVXaXRoSW5kZXgoaSkpOworICAgICNlbHNlCisgICAgICAgIFNuUF9Jbml0aWFsaXplQWxsKHN0YXRlV2l0aEluZGV4KGkpKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBQbFNuUF9BZGRCeXRlKHZvaWQgKnN0YXRlcywgdW5zaWduZWQgaW50IGluc3RhbmNlSW5kZXgsIHVuc2lnbmVkIGNoYXIgYnl0ZSwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKyAgICAjaWYgKFBsU25QX2Jhc2VQYXJhbGxlbGlzbSA9PSAxKQorICAgICAgICBTblBfQWRkQnl0ZShzdGF0ZVdpdGhJbmRleChpbnN0YW5jZUluZGV4KSwgYnl0ZSwgb2Zmc2V0KTsKKyAgICAjZWxzZQorICAgICAgICBTblBfQWRkQnl0ZShzdGF0ZVdpdGhJbmRleChpbnN0YW5jZUluZGV4L1BsU25QX2Jhc2VQYXJhbGxlbGlzbSksIGluc3RhbmNlSW5kZXglUGxTblBfYmFzZVBhcmFsbGVsaXNtLCBieXRlLCBvZmZzZXQpOworICAgICNlbmRpZgorfQorCit2b2lkIFBsU25QX0FkZEJ5dGVzKHZvaWQgKnN0YXRlcywgdW5zaWduZWQgaW50IGluc3RhbmNlSW5kZXgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisgICAgI2lmIChQbFNuUF9iYXNlUGFyYWxsZWxpc20gPT0gMSkKKyAgICAgICAgU25QX0FkZEJ5dGVzKHN0YXRlV2l0aEluZGV4KGluc3RhbmNlSW5kZXgpLCBkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgI2Vsc2UKKyAgICAgICAgU25QX0FkZEJ5dGVzKHN0YXRlV2l0aEluZGV4KGluc3RhbmNlSW5kZXgvUGxTblBfYmFzZVBhcmFsbGVsaXNtKSwgaW5zdGFuY2VJbmRleCVQbFNuUF9iYXNlUGFyYWxsZWxpc20sIGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBQbFNuUF9BZGRMYW5lc0FsbCh2b2lkICpzdGF0ZXMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsYW5lQ291bnQsIHVuc2lnbmVkIGludCBsYW5lT2Zmc2V0KQoreworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgZm9yKGk9MDsgaTxQbFNuUF9mYWN0b3I7IGkrKykgeworICAgICAgICAjaWYgKFBsU25QX2Jhc2VQYXJhbGxlbGlzbSA9PSAxKQorICAgICAgICAgICAgU25QX0FkZEJ5dGVzKHN0YXRlV2l0aEluZGV4KGkpLCBkYXRhLCAwLCBsYW5lQ291bnQqU25QX2xhbmVMZW5ndGhJbkJ5dGVzKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIFNuUF9BZGRMYW5lc0FsbChzdGF0ZVdpdGhJbmRleChpKSwgZGF0YSwgbGFuZUNvdW50LCBsYW5lT2Zmc2V0KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGRhdGEgKz0gUGxTblBfYmFzZVBhcmFsbGVsaXNtKmxhbmVPZmZzZXQqU25QX2xhbmVMZW5ndGhJbkJ5dGVzOworICAgIH0KK30KKwordm9pZCBQbFNuUF9PdmVyd3JpdGVCeXRlcyh2b2lkICpzdGF0ZXMsIHVuc2lnbmVkIGludCBpbnN0YW5jZUluZGV4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgICNpZiAoUGxTblBfYmFzZVBhcmFsbGVsaXNtID09IDEpCisgICAgICAgIFNuUF9PdmVyd3JpdGVCeXRlcyhzdGF0ZVdpdGhJbmRleChpbnN0YW5jZUluZGV4KSwgZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOworICAgICNlbHNlCisgICAgICAgIFNuUF9PdmVyd3JpdGVCeXRlcyhzdGF0ZVdpdGhJbmRleChpbnN0YW5jZUluZGV4L1BsU25QX2Jhc2VQYXJhbGxlbGlzbSksIGluc3RhbmNlSW5kZXglUGxTblBfYmFzZVBhcmFsbGVsaXNtLCBkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgUGxTblBfT3ZlcndyaXRlTGFuZXNBbGwodm9pZCAqc3RhdGVzLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbGFuZUNvdW50LCB1bnNpZ25lZCBpbnQgbGFuZU9mZnNldCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8UGxTblBfZmFjdG9yOyBpKyspIHsKKyAgICAgICAgI2lmIChQbFNuUF9iYXNlUGFyYWxsZWxpc20gPT0gMSkKKyAgICAgICAgICAgIFNuUF9PdmVyd3JpdGVCeXRlcyhzdGF0ZVdpdGhJbmRleChpKSwgZGF0YSwgMCwgbGFuZUNvdW50KlNuUF9sYW5lTGVuZ3RoSW5CeXRlcyk7CisgICAgICAgICNlbHNlCisgICAgICAgICAgICBTblBfT3ZlcndyaXRlTGFuZXNBbGwoc3RhdGVXaXRoSW5kZXgoaSksIGRhdGEsIGxhbmVDb3VudCwgbGFuZU9mZnNldCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBkYXRhICs9IFBsU25QX2Jhc2VQYXJhbGxlbGlzbSpsYW5lT2Zmc2V0KlNuUF9sYW5lTGVuZ3RoSW5CeXRlczsKKyAgICB9Cit9CisKK3ZvaWQgUGxTblBfT3ZlcndyaXRlV2l0aFplcm9lcyh2b2lkICpzdGF0ZXMsIHVuc2lnbmVkIGludCBpbnN0YW5jZUluZGV4LCB1bnNpZ25lZCBpbnQgYnl0ZUNvdW50KQoreworICAgICNpZiAoUGxTblBfYmFzZVBhcmFsbGVsaXNtID09IDEpCisgICAgICAgIFNuUF9PdmVyd3JpdGVXaXRoWmVyb2VzKHN0YXRlV2l0aEluZGV4KGluc3RhbmNlSW5kZXgpLCBieXRlQ291bnQpOworICAgICNlbHNlCisgICAgICAgIFNuUF9PdmVyd3JpdGVXaXRoWmVyb2VzKHN0YXRlV2l0aEluZGV4KGluc3RhbmNlSW5kZXgvUGxTblBfYmFzZVBhcmFsbGVsaXNtKSwgaW5zdGFuY2VJbmRleCVQbFNuUF9iYXNlUGFyYWxsZWxpc20sIGJ5dGVDb3VudCk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgUGxTblBfUGVybXV0ZUFsbCh2b2lkICpzdGF0ZXMpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPFBsU25QX2ZhY3RvcjsgaSsrKSB7CisgICAgICAgICNpZiAoUGxTblBfYmFzZVBhcmFsbGVsaXNtID09IDEpCisgICAgICAgICAgICBTblBfUGVybXV0ZShzdGF0ZVdpdGhJbmRleChpKSk7CisgICAgICAgICNlbHNlCisgICAgICAgICAgICBTblBfUGVybXV0ZUFsbChzdGF0ZVdpdGhJbmRleChpKSk7CisgICAgICAgICNlbmRpZgorICAgIH0KK30KKworI2lmIChkZWZpbmVkKFNuUF9QZXJtdXRlXzEycm91bmRzKSB8fCBkZWZpbmVkKFNuUF9QZXJtdXRlQWxsXzEycm91bmRzKSkKK3ZvaWQgUGxTblBfUGVybXV0ZUFsbF8xMnJvdW5kcyh2b2lkICpzdGF0ZXMpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPFBsU25QX2ZhY3RvcjsgaSsrKSB7CisgICAgICAgICNpZiAoUGxTblBfYmFzZVBhcmFsbGVsaXNtID09IDEpCisgICAgICAgICAgICBTblBfUGVybXV0ZV8xMnJvdW5kcyhzdGF0ZVdpdGhJbmRleChpKSk7CisgICAgICAgICNlbHNlCisgICAgICAgICAgICBTblBfUGVybXV0ZUFsbF8xMnJvdW5kcyhzdGF0ZVdpdGhJbmRleChpKSk7CisgICAgICAgICNlbmRpZgorICAgIH0KK30KKyNlbmRpZgorCit2b2lkIFBsU25QX0V4dHJhY3RCeXRlcyh2b2lkICpzdGF0ZXMsIHVuc2lnbmVkIGludCBpbnN0YW5jZUluZGV4LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgICNpZiAoUGxTblBfYmFzZVBhcmFsbGVsaXNtID09IDEpCisgICAgICAgIFNuUF9FeHRyYWN0Qnl0ZXMoc3RhdGVXaXRoSW5kZXgoaW5zdGFuY2VJbmRleCksIGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAjZWxzZQorICAgICAgICBTblBfRXh0cmFjdEJ5dGVzKHN0YXRlV2l0aEluZGV4KGluc3RhbmNlSW5kZXgvUGxTblBfYmFzZVBhcmFsbGVsaXNtKSwgaW5zdGFuY2VJbmRleCVQbFNuUF9iYXNlUGFyYWxsZWxpc20sIGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBQbFNuUF9FeHRyYWN0TGFuZXNBbGwoY29uc3Qgdm9pZCAqc3RhdGVzLCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbGFuZUNvdW50LCB1bnNpZ25lZCBpbnQgbGFuZU9mZnNldCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8UGxTblBfZmFjdG9yOyBpKyspIHsKKyAgICAgICAgI2lmIChQbFNuUF9iYXNlUGFyYWxsZWxpc20gPT0gMSkKKyAgICAgICAgICAgIFNuUF9FeHRyYWN0Qnl0ZXMoc3RhdGVXaXRoSW5kZXgoaSksIGRhdGEsIDAsIGxhbmVDb3VudCpTblBfbGFuZUxlbmd0aEluQnl0ZXMpOworICAgICAgICAjZWxzZQorICAgICAgICAgICAgU25QX0V4dHJhY3RMYW5lc0FsbChzdGF0ZVdpdGhJbmRleChpKSwgZGF0YSwgbGFuZUNvdW50LCBsYW5lT2Zmc2V0KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGRhdGEgKz0gbGFuZU9mZnNldCpTblBfbGFuZUxlbmd0aEluQnl0ZXMqUGxTblBfYmFzZVBhcmFsbGVsaXNtOworICAgIH0KK30KKwordm9pZCBQbFNuUF9FeHRyYWN0QW5kQWRkQnl0ZXModm9pZCAqc3RhdGVzLCB1bnNpZ25lZCBpbnQgaW5zdGFuY2VJbmRleCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgICAjaWYgKFBsU25QX2Jhc2VQYXJhbGxlbGlzbSA9PSAxKQorICAgICAgICBTblBfRXh0cmFjdEFuZEFkZEJ5dGVzKHN0YXRlV2l0aEluZGV4KGluc3RhbmNlSW5kZXgpLCBpbnB1dCwgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCk7CisgICAgI2Vsc2UKKyAgICAgICAgU25QX0V4dHJhY3RBbmRBZGRCeXRlcyhzdGF0ZVdpdGhJbmRleChpbnN0YW5jZUluZGV4L1BsU25QX2Jhc2VQYXJhbGxlbGlzbSksIGluc3RhbmNlSW5kZXglUGxTblBfYmFzZVBhcmFsbGVsaXNtLCBpbnB1dCwgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgUGxTblBfRXh0cmFjdEFuZEFkZExhbmVzQWxsKGNvbnN0IHZvaWQgKnN0YXRlcywgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgdW5zaWduZWQgaW50IGxhbmVDb3VudCwgdW5zaWduZWQgaW50IGxhbmVPZmZzZXQpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IoaT0wOyBpPFBsU25QX2ZhY3RvcjsgaSsrKSB7CisgICAgICAgICNpZiAoUGxTblBfYmFzZVBhcmFsbGVsaXNtID09IDEpCisgICAgICAgICAgICBTblBfRXh0cmFjdEFuZEFkZEJ5dGVzKHN0YXRlV2l0aEluZGV4KGkpLCBpbnB1dCwgb3V0cHV0LCAwLCBsYW5lQ291bnQqU25QX2xhbmVMZW5ndGhJbkJ5dGVzKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIFNuUF9FeHRyYWN0QW5kQWRkTGFuZXNBbGwoc3RhdGVXaXRoSW5kZXgoaSksIGlucHV0LCBvdXRwdXQsIGxhbmVDb3VudCwgbGFuZU9mZnNldCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBpbnB1dCArPSBsYW5lT2Zmc2V0KlNuUF9sYW5lTGVuZ3RoSW5CeXRlcypQbFNuUF9iYXNlUGFyYWxsZWxpc207CisgICAgICAgIG91dHB1dCArPSBsYW5lT2Zmc2V0KlNuUF9sYW5lTGVuZ3RoSW5CeXRlcypQbFNuUF9iYXNlUGFyYWxsZWxpc207CisgICAgfQorfQorCisjdW5kZWYgUGxTblBfZmFjdG9yCisjdW5kZWYgU25QX3N0YXRlT2Zmc2V0CisjdW5kZWYgc3RhdGVXaXRoSW5kZXgKKyN1bmRlZiBKT0lOMAorI3VuZGVmIEpPSU4KKyN1bmRlZiBQbFNuUF9TdGF0aWNJbml0aWFsaXplCisjdW5kZWYgUGxTblBfSW5pdGlhbGl6ZUFsbAorI3VuZGVmIFBsU25QX0FkZEJ5dGUKKyN1bmRlZiBQbFNuUF9BZGRCeXRlcworI3VuZGVmIFBsU25QX0FkZExhbmVzQWxsCisjdW5kZWYgUGxTblBfT3ZlcndyaXRlQnl0ZXMKKyN1bmRlZiBQbFNuUF9PdmVyd3JpdGVMYW5lc0FsbAorI3VuZGVmIFBsU25QX092ZXJ3cml0ZVdpdGhaZXJvZXMKKyN1bmRlZiBQbFNuUF9QZXJtdXRlQWxsCisjdW5kZWYgUGxTblBfRXh0cmFjdEJ5dGVzCisjdW5kZWYgUGxTblBfRXh0cmFjdExhbmVzQWxsCisjdW5kZWYgUGxTblBfRXh0cmFjdEFuZEFkZEJ5dGVzCisjdW5kZWYgUGxTblBfRXh0cmFjdEFuZEFkZExhbmVzQWxsCisjdW5kZWYgU25QX3N0YXRlQWxpZ25tZW50CisjdW5kZWYgU25QX3N0YXRlU2l6ZUluQnl0ZXMKKyN1bmRlZiBQbFNuUF9mYWN0b3IKKyN1bmRlZiBTblBfc3RhdGVPZmZzZXQKKyN1bmRlZiBzdGF0ZVdpdGhJbmRleAorI3VuZGVmIFNuUF9TdGF0aWNJbml0aWFsaXplCisjdW5kZWYgU25QX0luaXRpYWxpemUKKyN1bmRlZiBTblBfSW5pdGlhbGl6ZUFsbAorI3VuZGVmIFNuUF9BZGRCeXRlCisjdW5kZWYgU25QX0FkZEJ5dGVzCisjdW5kZWYgU25QX0FkZExhbmVzQWxsCisjdW5kZWYgU25QX092ZXJ3cml0ZUJ5dGVzCisjdW5kZWYgU25QX092ZXJ3cml0ZVdpdGhaZXJvZXMKKyN1bmRlZiBTblBfT3ZlcndyaXRlTGFuZXNBbGwKKyN1bmRlZiBTblBfRXh0cmFjdEJ5dGVzCisjdW5kZWYgU25QX0V4dHJhY3RMYW5lc0FsbAorI3VuZGVmIFNuUF9FeHRyYWN0QW5kQWRkQnl0ZXMKKyN1bmRlZiBTblBfRXh0cmFjdEFuZEFkZExhbmVzQWxsCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zaGEzL2tjcC9TblAtUmVsYW5lZC5oIGIvTW9kdWxlcy9fc2hhMy9rY3AvU25QLVJlbGFuZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODZlNjM1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc2hhMy9rY3AvU25QLVJlbGFuZWQuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKK0ltcGxlbWVudGF0aW9uIGJ5IHRoZSBLZWNjYWssIEtleWFrIGFuZCBLZXRqZSBUZWFtcywgbmFtZWx5LCBHdWlkbyBCZXJ0b25pLAorSm9hbiBEYWVtZW4sIE1pY2hhw6tsIFBlZXRlcnMsIEdpbGxlcyBWYW4gQXNzY2hlIGFuZCBSb25ueSBWYW4gS2VlciwgaGVyZWJ5CitkZW5vdGVkIGFzICJ0aGUgaW1wbGVtZW50ZXIiLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZmVlZGJhY2sgb3IgcXVlc3Rpb25zLCBwbGVhc2UgcmVmZXIgdG8gb3VyIHdlYnNpdGVzOgoraHR0cDovL2tlY2Nhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXlhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXRqZS5ub2VrZW9uLm9yZy8KKworVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBpbXBsZW1lbnRlciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQKK2FuZCByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGUgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlLgoraHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworKi8KKworI2lmbmRlZiBfU25QX1JlbGFuZWRfaF8KKyNkZWZpbmUgX1NuUF9SZWxhbmVkX2hfCisKKyNkZWZpbmUgU25QX0FkZEJ5dGVzKHN0YXRlLCBkYXRhLCBvZmZzZXQsIGxlbmd0aCwgU25QX0FkZExhbmVzLCBTblBfQWRkQnl0ZXNJbkxhbmUsIFNuUF9sYW5lTGVuZ3RoSW5CeXRlcykgXAorICAgIHsgXAorICAgICAgICBpZiAoKG9mZnNldCkgPT0gMCkgeyBcCisgICAgICAgICAgICBTblBfQWRkTGFuZXMoc3RhdGUsIGRhdGEsIChsZW5ndGgpL1NuUF9sYW5lTGVuZ3RoSW5CeXRlcyk7IFwKKyAgICAgICAgICAgIFNuUF9BZGRCeXRlc0luTGFuZShzdGF0ZSwgXAorICAgICAgICAgICAgICAgIChsZW5ndGgpL1NuUF9sYW5lTGVuZ3RoSW5CeXRlcywgXAorICAgICAgICAgICAgICAgIChkYXRhKSsoKGxlbmd0aCkvU25QX2xhbmVMZW5ndGhJbkJ5dGVzKSpTblBfbGFuZUxlbmd0aEluQnl0ZXMsIFwKKyAgICAgICAgICAgICAgICAwLCBcCisgICAgICAgICAgICAgICAgKGxlbmd0aCklU25QX2xhbmVMZW5ndGhJbkJ5dGVzKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfc2l6ZUxlZnQgPSAobGVuZ3RoKTsgXAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9sYW5lUG9zaXRpb24gPSAob2Zmc2V0KS9TblBfbGFuZUxlbmd0aEluQnl0ZXM7IFwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfb2Zmc2V0SW5MYW5lID0gKG9mZnNldCklU25QX2xhbmVMZW5ndGhJbkJ5dGVzOyBcCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpfY3VyRGF0YSA9IChkYXRhKTsgXAorICAgICAgICAgICAgd2hpbGUoX3NpemVMZWZ0ID4gMCkgeyBcCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9ieXRlc0luTGFuZSA9IFNuUF9sYW5lTGVuZ3RoSW5CeXRlcyAtIF9vZmZzZXRJbkxhbmU7IFwKKyAgICAgICAgICAgICAgICBpZiAoX2J5dGVzSW5MYW5lID4gX3NpemVMZWZ0KSBcCisgICAgICAgICAgICAgICAgICAgIF9ieXRlc0luTGFuZSA9IF9zaXplTGVmdDsgXAorICAgICAgICAgICAgICAgIFNuUF9BZGRCeXRlc0luTGFuZShzdGF0ZSwgX2xhbmVQb3NpdGlvbiwgX2N1ckRhdGEsIF9vZmZzZXRJbkxhbmUsIF9ieXRlc0luTGFuZSk7IFwKKyAgICAgICAgICAgICAgICBfc2l6ZUxlZnQgLT0gX2J5dGVzSW5MYW5lOyBcCisgICAgICAgICAgICAgICAgX2xhbmVQb3NpdGlvbisrOyBcCisgICAgICAgICAgICAgICAgX29mZnNldEluTGFuZSA9IDA7IFwKKyAgICAgICAgICAgICAgICBfY3VyRGF0YSArPSBfYnl0ZXNJbkxhbmU7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgU25QX092ZXJ3cml0ZUJ5dGVzKHN0YXRlLCBkYXRhLCBvZmZzZXQsIGxlbmd0aCwgU25QX092ZXJ3cml0ZUxhbmVzLCBTblBfT3ZlcndyaXRlQnl0ZXNJbkxhbmUsIFNuUF9sYW5lTGVuZ3RoSW5CeXRlcykgXAorICAgIHsgXAorICAgICAgICBpZiAoKG9mZnNldCkgPT0gMCkgeyBcCisgICAgICAgICAgICBTblBfT3ZlcndyaXRlTGFuZXMoc3RhdGUsIGRhdGEsIChsZW5ndGgpL1NuUF9sYW5lTGVuZ3RoSW5CeXRlcyk7IFwKKyAgICAgICAgICAgIFNuUF9PdmVyd3JpdGVCeXRlc0luTGFuZShzdGF0ZSwgXAorICAgICAgICAgICAgICAgIChsZW5ndGgpL1NuUF9sYW5lTGVuZ3RoSW5CeXRlcywgXAorICAgICAgICAgICAgICAgIChkYXRhKSsoKGxlbmd0aCkvU25QX2xhbmVMZW5ndGhJbkJ5dGVzKSpTblBfbGFuZUxlbmd0aEluQnl0ZXMsIFwKKyAgICAgICAgICAgICAgICAwLCBcCisgICAgICAgICAgICAgICAgKGxlbmd0aCklU25QX2xhbmVMZW5ndGhJbkJ5dGVzKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfc2l6ZUxlZnQgPSAobGVuZ3RoKTsgXAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9sYW5lUG9zaXRpb24gPSAob2Zmc2V0KS9TblBfbGFuZUxlbmd0aEluQnl0ZXM7IFwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfb2Zmc2V0SW5MYW5lID0gKG9mZnNldCklU25QX2xhbmVMZW5ndGhJbkJ5dGVzOyBcCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpfY3VyRGF0YSA9IChkYXRhKTsgXAorICAgICAgICAgICAgd2hpbGUoX3NpemVMZWZ0ID4gMCkgeyBcCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9ieXRlc0luTGFuZSA9IFNuUF9sYW5lTGVuZ3RoSW5CeXRlcyAtIF9vZmZzZXRJbkxhbmU7IFwKKyAgICAgICAgICAgICAgICBpZiAoX2J5dGVzSW5MYW5lID4gX3NpemVMZWZ0KSBcCisgICAgICAgICAgICAgICAgICAgIF9ieXRlc0luTGFuZSA9IF9zaXplTGVmdDsgXAorICAgICAgICAgICAgICAgIFNuUF9PdmVyd3JpdGVCeXRlc0luTGFuZShzdGF0ZSwgX2xhbmVQb3NpdGlvbiwgX2N1ckRhdGEsIF9vZmZzZXRJbkxhbmUsIF9ieXRlc0luTGFuZSk7IFwKKyAgICAgICAgICAgICAgICBfc2l6ZUxlZnQgLT0gX2J5dGVzSW5MYW5lOyBcCisgICAgICAgICAgICAgICAgX2xhbmVQb3NpdGlvbisrOyBcCisgICAgICAgICAgICAgICAgX29mZnNldEluTGFuZSA9IDA7IFwKKyAgICAgICAgICAgICAgICBfY3VyRGF0YSArPSBfYnl0ZXNJbkxhbmU7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgU25QX0V4dHJhY3RCeXRlcyhzdGF0ZSwgZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIFNuUF9FeHRyYWN0TGFuZXMsIFNuUF9FeHRyYWN0Qnl0ZXNJbkxhbmUsIFNuUF9sYW5lTGVuZ3RoSW5CeXRlcykgXAorICAgIHsgXAorICAgICAgICBpZiAoKG9mZnNldCkgPT0gMCkgeyBcCisgICAgICAgICAgICBTblBfRXh0cmFjdExhbmVzKHN0YXRlLCBkYXRhLCAobGVuZ3RoKS9TblBfbGFuZUxlbmd0aEluQnl0ZXMpOyBcCisgICAgICAgICAgICBTblBfRXh0cmFjdEJ5dGVzSW5MYW5lKHN0YXRlLCBcCisgICAgICAgICAgICAgICAgKGxlbmd0aCkvU25QX2xhbmVMZW5ndGhJbkJ5dGVzLCBcCisgICAgICAgICAgICAgICAgKGRhdGEpKygobGVuZ3RoKS9TblBfbGFuZUxlbmd0aEluQnl0ZXMpKlNuUF9sYW5lTGVuZ3RoSW5CeXRlcywgXAorICAgICAgICAgICAgICAgIDAsIFwKKyAgICAgICAgICAgICAgICAobGVuZ3RoKSVTblBfbGFuZUxlbmd0aEluQnl0ZXMpOyBcCisgICAgICAgIH0gXAorICAgICAgICBlbHNlIHsgXAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9zaXplTGVmdCA9IChsZW5ndGgpOyBcCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX2xhbmVQb3NpdGlvbiA9IChvZmZzZXQpL1NuUF9sYW5lTGVuZ3RoSW5CeXRlczsgXAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9vZmZzZXRJbkxhbmUgPSAob2Zmc2V0KSVTblBfbGFuZUxlbmd0aEluQnl0ZXM7IFwKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKl9jdXJEYXRhID0gKGRhdGEpOyBcCisgICAgICAgICAgICB3aGlsZShfc2l6ZUxlZnQgPiAwKSB7IFwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX2J5dGVzSW5MYW5lID0gU25QX2xhbmVMZW5ndGhJbkJ5dGVzIC0gX29mZnNldEluTGFuZTsgXAorICAgICAgICAgICAgICAgIGlmIChfYnl0ZXNJbkxhbmUgPiBfc2l6ZUxlZnQpIFwKKyAgICAgICAgICAgICAgICAgICAgX2J5dGVzSW5MYW5lID0gX3NpemVMZWZ0OyBcCisgICAgICAgICAgICAgICAgU25QX0V4dHJhY3RCeXRlc0luTGFuZShzdGF0ZSwgX2xhbmVQb3NpdGlvbiwgX2N1ckRhdGEsIF9vZmZzZXRJbkxhbmUsIF9ieXRlc0luTGFuZSk7IFwKKyAgICAgICAgICAgICAgICBfc2l6ZUxlZnQgLT0gX2J5dGVzSW5MYW5lOyBcCisgICAgICAgICAgICAgICAgX2xhbmVQb3NpdGlvbisrOyBcCisgICAgICAgICAgICAgICAgX29mZnNldEluTGFuZSA9IDA7IFwKKyAgICAgICAgICAgICAgICBfY3VyRGF0YSArPSBfYnl0ZXNJbkxhbmU7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgU25QX0V4dHJhY3RBbmRBZGRCeXRlcyhzdGF0ZSwgaW5wdXQsIG91dHB1dCwgb2Zmc2V0LCBsZW5ndGgsIFNuUF9FeHRyYWN0QW5kQWRkTGFuZXMsIFNuUF9FeHRyYWN0QW5kQWRkQnl0ZXNJbkxhbmUsIFNuUF9sYW5lTGVuZ3RoSW5CeXRlcykgXAorICAgIHsgXAorICAgICAgICBpZiAoKG9mZnNldCkgPT0gMCkgeyBcCisgICAgICAgICAgICBTblBfRXh0cmFjdEFuZEFkZExhbmVzKHN0YXRlLCBpbnB1dCwgb3V0cHV0LCAobGVuZ3RoKS9TblBfbGFuZUxlbmd0aEluQnl0ZXMpOyBcCisgICAgICAgICAgICBTblBfRXh0cmFjdEFuZEFkZEJ5dGVzSW5MYW5lKHN0YXRlLCBcCisgICAgICAgICAgICAgICAgKGxlbmd0aCkvU25QX2xhbmVMZW5ndGhJbkJ5dGVzLCBcCisgICAgICAgICAgICAgICAgKGlucHV0KSsoKGxlbmd0aCkvU25QX2xhbmVMZW5ndGhJbkJ5dGVzKSpTblBfbGFuZUxlbmd0aEluQnl0ZXMsIFwKKyAgICAgICAgICAgICAgICAob3V0cHV0KSsoKGxlbmd0aCkvU25QX2xhbmVMZW5ndGhJbkJ5dGVzKSpTblBfbGFuZUxlbmd0aEluQnl0ZXMsIFwKKyAgICAgICAgICAgICAgICAwLCBcCisgICAgICAgICAgICAgICAgKGxlbmd0aCklU25QX2xhbmVMZW5ndGhJbkJ5dGVzKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfc2l6ZUxlZnQgPSAobGVuZ3RoKTsgXAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9sYW5lUG9zaXRpb24gPSAob2Zmc2V0KS9TblBfbGFuZUxlbmd0aEluQnl0ZXM7IFwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfb2Zmc2V0SW5MYW5lID0gKG9mZnNldCklU25QX2xhbmVMZW5ndGhJbkJ5dGVzOyBcCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpfY3VySW5wdXQgPSAoaW5wdXQpOyBcCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpfY3VyT3V0cHV0ID0gKG91dHB1dCk7IFwKKyAgICAgICAgICAgIHdoaWxlKF9zaXplTGVmdCA+IDApIHsgXAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfYnl0ZXNJbkxhbmUgPSBTblBfbGFuZUxlbmd0aEluQnl0ZXMgLSBfb2Zmc2V0SW5MYW5lOyBcCisgICAgICAgICAgICAgICAgaWYgKF9ieXRlc0luTGFuZSA+IF9zaXplTGVmdCkgXAorICAgICAgICAgICAgICAgICAgICBfYnl0ZXNJbkxhbmUgPSBfc2l6ZUxlZnQ7IFwKKyAgICAgICAgICAgICAgICBTblBfRXh0cmFjdEFuZEFkZEJ5dGVzSW5MYW5lKHN0YXRlLCBfbGFuZVBvc2l0aW9uLCBfY3VySW5wdXQsIF9jdXJPdXRwdXQsIF9vZmZzZXRJbkxhbmUsIF9ieXRlc0luTGFuZSk7IFwKKyAgICAgICAgICAgICAgICBfc2l6ZUxlZnQgLT0gX2J5dGVzSW5MYW5lOyBcCisgICAgICAgICAgICAgICAgX2xhbmVQb3NpdGlvbisrOyBcCisgICAgICAgICAgICAgICAgX29mZnNldEluTGFuZSA9IDA7IFwKKyAgICAgICAgICAgICAgICBfY3VySW5wdXQgKz0gX2J5dGVzSW5MYW5lOyBcCisgICAgICAgICAgICAgICAgX2N1ck91dHB1dCArPSBfYnl0ZXNJbkxhbmU7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc2hhMy9rY3AvYWxpZ24uaCBiL01vZHVsZXMvX3NoYTMva2NwL2FsaWduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1MGZlOAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NoYTMva2NwL2FsaWduLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKK0ltcGxlbWVudGF0aW9uIGJ5IHRoZSBLZWNjYWssIEtleWFrIGFuZCBLZXRqZSBUZWFtcywgbmFtZWx5LCBHdWlkbyBCZXJ0b25pLAorSm9hbiBEYWVtZW4sIE1pY2hhw6tsIFBlZXRlcnMsIEdpbGxlcyBWYW4gQXNzY2hlIGFuZCBSb25ueSBWYW4gS2VlciwgaGVyZWJ5CitkZW5vdGVkIGFzICJ0aGUgaW1wbGVtZW50ZXIiLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZmVlZGJhY2sgb3IgcXVlc3Rpb25zLCBwbGVhc2UgcmVmZXIgdG8gb3VyIHdlYnNpdGVzOgoraHR0cDovL2tlY2Nhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXlhay5ub2VrZW9uLm9yZy8KK2h0dHA6Ly9rZXRqZS5ub2VrZW9uLm9yZy8KKworVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBpbXBsZW1lbnRlciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQKK2FuZCByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGUgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlLgoraHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworKi8KKworI2lmbmRlZiBfYWxpZ25faF8KKyNkZWZpbmUgX2FsaWduX2hfCisKKy8qIG9uIE1hYyBPUy1YIGFuZCBwb3NzaWJseSBvdGhlcnMsIEFMSUdOKHgpIGlzIGRlZmluZWQgaW4gcGFyYW0uaCwgYW5kIC1XZXJyb3IgY2hva2VzIG9uIHRoZSByZWRlZi4gKi8KKworI2lmZGVmIEFMSUdOCisjdW5kZWYgQUxJR04KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgQUxJR04oeCkgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoeCkpKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgQUxJR04oeCkgX19kZWNsc3BlYyhhbGlnbih4KSkKKyNlbGlmIGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKQorI2RlZmluZSBBTElHTih4KSBfX2FsaWduKHgpCisjZWxzZQorI2RlZmluZSBBTElHTih4KQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc2hhMy9zaGEzbW9kdWxlLmMgYi9Nb2R1bGVzL19zaGEzL3NoYTNtb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGFjNjMxCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc2hhMy9zaGEzbW9kdWxlLmMKQEAgLTAsMCArMSw3NTkgQEAKKy8qIFNIQTMgbW9kdWxlCisgKgorICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBTSEEzIGFsZ29yaXRobQorICoKKyAqIFNlZSBiZWxvdyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGNvZGUgdGhpcyBtb2R1bGUgd2FzCisgKiBiYXNlZCB1cG9uLiBBZGRpdGlvbmFsIHdvcmsgcGVyZm9ybWVkIGJ5OgorICoKKyAqICBBbmRyZXcgS3VjaGxpbmcgKGFta0BhbWsuY2EpCisgKiAgR3JlZyBTdGVpbiAoZ3N0ZWluQGx5cmEub3JnKQorICogIFRyZXZvciBQZXJyaW4gKHRyZXZwQHRyZXZwLm5ldCkKKyAqICBHcmVnb3J5IFAuIFNtaXRoIChncmVnQGtyeXB0by5vcmcpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTYgIENocmlzdGlhbiBIZWltZXMgKGNocmlzdGlhbkBweXRob24ub3JnKQorICogTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorICoKKyAqLworCisjaW5jbHVkZSAiUHl0aG9uLmgiCisjaW5jbHVkZSAicHlzdHJoZXguaCIKKyNpbmNsdWRlICIuLi9oYXNobGliLmgiCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBLTMgKEtlY2NhaykgYW5kIFNIQUtFCisgKgorICogVGhlIGNvZGUgaXMgYmFzZWQgb24gS2VjY2FrQ29kZVBhY2thZ2UgZnJvbSAyMDE2LTA0LTIzCisgKiBjb21taXQgNjQ3ZjkzMDc5YWZjNGFkYTNkMjM3Mzc0NzdhNmU1MjUxMWNhNDFmZAorICoKKyAqIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgYWx0ZXJlZCBpbiB0aGlzIHBvaW50czoKKyAqICAtIEMrKyBjb21tZW50cyBhcmUgY29udmVydGVkIHRvIEFOU0kgQyBjb21tZW50cy4KKyAqICAtIGFsbCBmdW5jdGlvbiBuYW1lcyBhcmUgbWFuZ2xlZAorICogIC0gdHlwZWRlZiBmb3IgVUlOVDY0IGlzIGNvbW1lbnRlZCBvdXQuCisgKiAgLSBicmdfZW5kaWFuLmggaXMgcmVtb3ZlZAorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX3NwYXJjCisgIC8qIG9wdDY0IHVzZXMgdW4tYWxpZ25lZCBtZW1vcnkgYWNjZXNzIHRoYXQgY2F1c2VzIGEgQlVTIGVycm9yIHdpdGggbXNnCisgICAqICdpbnZhbGlkIGFkZHJlc3MgYWxpZ25tZW50JyBvbiBTUEFSQy4gKi8KKyAgI2RlZmluZSBLZWNjYWtPcHQgMzIKKyNlbGlmIFBZX0JJR19FTkRJQU4KKyAgLyogb3B0NjQgaXMgbm90IHlldCBzdXBwb3J0ZWQgb24gYmlnIGVuZGlhbiBwbGF0Zm9ybXMgKi8KKyAgI2RlZmluZSBLZWNjYWtPcHQgMzIKKyNlbGlmIFNJWkVPRl9WT0lEX1AgPT0gOCAmJiBkZWZpbmVkKFBZX1VJTlQ2NF9UKQorICAvKiBvcHQ2NCB3b3JrcyBvbmx5IG9uIGxpdHRsZS1lbmRpYW4gNjRiaXQgcGxhdGZvcm1zIHdpdGggdW5zaWduZWQgaW50NjQgKi8KKyAgI2RlZmluZSBLZWNjYWtPcHQgNjQKKyNlbHNlCisgIC8qIG9wdDMyIGlzIHVzZWQgZm9yIHRoZSByZW1haW5pbmcgMzIgYW5kIDY0Yml0IHBsYXRmb3JtcyAqLworICAjZGVmaW5lIEtlY2Nha09wdCAzMgorI2VuZGlmCisKKyNpZiBLZWNjYWtPcHQgPT0gNjQgJiYgZGVmaW5lZChQWV9VSU5UNjRfVCkKKyAgLyogNjRiaXQgcGxhdGZvcm1zIHdpdGggdW5zaWduZWQgaW50NjQgKi8KKyAgdHlwZWRlZiBQWV9VSU5UNjRfVCBVSU5UNjQ7CisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBVSU5UODsKKyNlbmRpZgorCisvKiByZXBsYWNlbWVudCBmb3IgYnJnX2VuZGlhbi5oICovCisjZGVmaW5lIElTX0xJVFRMRV9FTkRJQU4gMTIzNAorI2RlZmluZSBJU19CSUdfRU5ESUFOIDQzMjEKKyNpZiBQWV9MSVRUTEVfRU5ESUFOCisjZGVmaW5lIFBMQVRGT1JNX0JZVEVfT1JERVIgSVNfTElUVExFX0VORElBTgorI2VuZGlmCisjaWYgUFlfQklHX0VORElBTgorI2RlZmluZSBQTEFURk9STV9CWVRFX09SREVSIElTX0JJR19FTkRJQU4KKyNlbmRpZgorCisvKiBtYW5nbGUgbmFtZXMgKi8KKyNkZWZpbmUgS2VjY2FrRjE2MDBfRmFzdExvb3BfQWJzb3JiIF9QeVNIQTNfS2VjY2FrRjE2MDBfRmFzdExvb3BfQWJzb3JiCisjZGVmaW5lIEtlY2Nha19IYXNoRmluYWwgX1B5U0hBM19LZWNjYWtfSGFzaEZpbmFsCisjZGVmaW5lIEtlY2Nha19IYXNoSW5pdGlhbGl6ZSBfUHlTSEEzX0tlY2Nha19IYXNoSW5pdGlhbGl6ZQorI2RlZmluZSBLZWNjYWtfSGFzaFNxdWVlemUgX1B5U0hBM19LZWNjYWtfSGFzaFNxdWVlemUKKyNkZWZpbmUgS2VjY2FrX0hhc2hVcGRhdGUgX1B5U0hBM19LZWNjYWtfSGFzaFVwZGF0ZQorI2RlZmluZSBLZWNjYWtQMTYwMF9BZGRCeXRlcyBfUHlTSEEzX0tlY2Nha1AxNjAwX0FkZEJ5dGVzCisjZGVmaW5lIEtlY2Nha1AxNjAwX0FkZEJ5dGVzSW5MYW5lIF9QeVNIQTNfS2VjY2FrUDE2MDBfQWRkQnl0ZXNJbkxhbmUKKyNkZWZpbmUgS2VjY2FrUDE2MDBfQWRkTGFuZXMgX1B5U0hBM19LZWNjYWtQMTYwMF9BZGRMYW5lcworI2RlZmluZSBLZWNjYWtQMTYwMF9FeHRyYWN0QW5kQWRkQnl0ZXMgX1B5U0hBM19LZWNjYWtQMTYwMF9FeHRyYWN0QW5kQWRkQnl0ZXMKKyNkZWZpbmUgS2VjY2FrUDE2MDBfRXh0cmFjdEFuZEFkZEJ5dGVzSW5MYW5lIF9QeVNIQTNfS2VjY2FrUDE2MDBfRXh0cmFjdEFuZEFkZEJ5dGVzSW5MYW5lCisjZGVmaW5lIEtlY2Nha1AxNjAwX0V4dHJhY3RBbmRBZGRMYW5lcyBfUHlTSEEzX0tlY2Nha1AxNjAwX0V4dHJhY3RBbmRBZGRMYW5lcworI2RlZmluZSBLZWNjYWtQMTYwMF9FeHRyYWN0Qnl0ZXMgX1B5U0hBM19LZWNjYWtQMTYwMF9FeHRyYWN0Qnl0ZXMKKyNkZWZpbmUgS2VjY2FrUDE2MDBfRXh0cmFjdEJ5dGVzSW5MYW5lIF9QeVNIQTNfS2VjY2FrUDE2MDBfRXh0cmFjdEJ5dGVzSW5MYW5lCisjZGVmaW5lIEtlY2Nha1AxNjAwX0V4dHJhY3RMYW5lcyBfUHlTSEEzX0tlY2Nha1AxNjAwX0V4dHJhY3RMYW5lcworI2RlZmluZSBLZWNjYWtQMTYwMF9Jbml0aWFsaXplIF9QeVNIQTNfS2VjY2FrUDE2MDBfSW5pdGlhbGl6ZQorI2RlZmluZSBLZWNjYWtQMTYwMF9PdmVyd3JpdGVCeXRlcyBfUHlTSEEzX0tlY2Nha1AxNjAwX092ZXJ3cml0ZUJ5dGVzCisjZGVmaW5lIEtlY2Nha1AxNjAwX092ZXJ3cml0ZUJ5dGVzSW5MYW5lIF9QeVNIQTNfS2VjY2FrUDE2MDBfT3ZlcndyaXRlQnl0ZXNJbkxhbmUKKyNkZWZpbmUgS2VjY2FrUDE2MDBfT3ZlcndyaXRlTGFuZXMgX1B5U0hBM19LZWNjYWtQMTYwMF9PdmVyd3JpdGVMYW5lcworI2RlZmluZSBLZWNjYWtQMTYwMF9PdmVyd3JpdGVXaXRoWmVyb2VzIF9QeVNIQTNfS2VjY2FrUDE2MDBfT3ZlcndyaXRlV2l0aFplcm9lcworI2RlZmluZSBLZWNjYWtQMTYwMF9QZXJtdXRlXzEycm91bmRzIF9QeVNIQTNfS2VjY2FrUDE2MDBfUGVybXV0ZV8xMnJvdW5kcworI2RlZmluZSBLZWNjYWtQMTYwMF9QZXJtdXRlXzI0cm91bmRzIF9QeVNIQTNfS2VjY2FrUDE2MDBfUGVybXV0ZV8yNHJvdW5kcworI2RlZmluZSBLZWNjYWtXaWR0aDE2MDBfU3BvbmdlIF9QeVNIQTNfS2VjY2FrV2lkdGgxNjAwX1Nwb25nZQorI2RlZmluZSBLZWNjYWtXaWR0aDE2MDBfU3BvbmdlQWJzb3JiIF9QeVNIQTNfS2VjY2FrV2lkdGgxNjAwX1Nwb25nZUFic29yYgorI2RlZmluZSBLZWNjYWtXaWR0aDE2MDBfU3BvbmdlQWJzb3JiTGFzdEZld0JpdHMgX1B5U0hBM19LZWNjYWtXaWR0aDE2MDBfU3BvbmdlQWJzb3JiTGFzdEZld0JpdHMKKyNkZWZpbmUgS2VjY2FrV2lkdGgxNjAwX1Nwb25nZUluaXRpYWxpemUgX1B5U0hBM19LZWNjYWtXaWR0aDE2MDBfU3BvbmdlSW5pdGlhbGl6ZQorI2RlZmluZSBLZWNjYWtXaWR0aDE2MDBfU3BvbmdlU3F1ZWV6ZSBfUHlTSEEzX0tlY2Nha1dpZHRoMTYwMF9TcG9uZ2VTcXVlZXplCisjaWYgS2VjY2FrT3B0ID09IDMyCisjZGVmaW5lIEtlY2Nha1AxNjAwX0FkZEJ5dGUgX1B5U0hBM19LZWNjYWtQMTYwMF9BZGRCeXRlCisjZGVmaW5lIEtlY2Nha1AxNjAwX1Blcm11dGVfTnJvdW5kcyBfUHlTSEEzX0tlY2Nha1AxNjAwX1Blcm11dGVfTnJvdW5kcworI2RlZmluZSBLZWNjYWtQMTYwMF9TZXRCeXRlc0luTGFuZVRvWmVybyBfUHlTSEEzX0tlY2Nha1AxNjAwX1NldEJ5dGVzSW5MYW5lVG9aZXJvCisjZW5kaWYKKworLyogd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBLZWNjYWtQMTYwMCAqLworI2RlZmluZSBLZWNjYWtQMjAwX2V4Y2x1ZGVkIDEKKyNkZWZpbmUgS2VjY2FrUDQwMF9leGNsdWRlZCAxCisjZGVmaW5lIEtlY2Nha1A4MDBfZXhjbHVkZWQgMQorCisvKiBpbmxpbmUgYWxsIEtlY2NhayBkZXBlbmRlbmNpZXMgKi8KKyNpbmNsdWRlICJrY3AvS2VjY2FrSGFzaC5oIgorI2luY2x1ZGUgImtjcC9LZWNjYWtTcG9uZ2UuaCIKKyNpbmNsdWRlICJrY3AvS2VjY2FrSGFzaC5jIgorI2luY2x1ZGUgImtjcC9LZWNjYWtTcG9uZ2UuYyIKKyNpZiBLZWNjYWtPcHQgPT0gNjQKKyAgI2luY2x1ZGUgImtjcC9LZWNjYWtQLTE2MDAtb3B0NjQuYyIKKyNlbGlmIEtlY2Nha09wdCA9PSAzMgorICAjaW5jbHVkZSAia2NwL0tlY2Nha1AtMTYwMC1pbnBsYWNlMzJCSS5jIgorI2VuZGlmCisKKyNkZWZpbmUgU0hBM19NQVhfRElHRVNUU0laRSA2NCAvKiA2NCBCeXRlcyAoNTEyIEJpdHMpIGZvciAyMjQgdG8gNTEyICovCisjZGVmaW5lIFNIQTNfTEFORVNJWkUgKDIwICogOCkgLyogRXh0cmFjdExhbmUgbmVlZHMgbWF4IHVpbnQ2NF90WzIwXSBleHRyYS4gKi8KKyNkZWZpbmUgU0hBM19zdGF0ZSBLZWNjYWtfSGFzaEluc3RhbmNlCisjZGVmaW5lIFNIQTNfaW5pdCBLZWNjYWtfSGFzaEluaXRpYWxpemUKKyNkZWZpbmUgU0hBM19wcm9jZXNzIEtlY2Nha19IYXNoVXBkYXRlCisjZGVmaW5lIFNIQTNfZG9uZSBLZWNjYWtfSGFzaEZpbmFsCisjZGVmaW5lIFNIQTNfc3F1ZWV6ZSBLZWNjYWtfSGFzaFNxdWVlemUKKyNkZWZpbmUgU0hBM19jb3B5c3RhdGUoZGVzdCwgc3JjKSBtZW1jcHkoJihkZXN0KSwgJihzcmMpLCBzaXplb2YoU0hBM19zdGF0ZSkpCisKKworLypbY2xpbmljIGlucHV0XQorbW9kdWxlIF9zaGEzCitjbGFzcyBfc2hhMy5zaGEzXzIyNCAiU0hBM29iamVjdCAqIiAiJlNIQTNfMjI0dHlwIgorY2xhc3MgX3NoYTMuc2hhM18yNTYgIlNIQTNvYmplY3QgKiIgIiZTSEEzXzI1NnR5cCIKK2NsYXNzIF9zaGEzLnNoYTNfMzg0ICJTSEEzb2JqZWN0ICoiICImU0hBM18zODR0eXAiCitjbGFzcyBfc2hhMy5zaGEzXzUxMiAiU0hBM29iamVjdCAqIiAiJlNIQTNfNTEydHlwIgorY2xhc3MgX3NoYTMuc2hha2VfMTI4ICJTSEEzb2JqZWN0ICoiICImU0hBS0UxMjh0eXBlIgorY2xhc3MgX3NoYTMuc2hha2VfMjU2ICJTSEEzb2JqZWN0ICoiICImU0hBS0UyNTZ0eXBlIgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9YjhhNTM2ODBmMzcwMjg1YV0qLworCisvKiBUaGUgc3RydWN0dXJlIGZvciBzdG9yaW5nIFNIQTMgaW5mbyAqLworCisjZGVmaW5lIFBZX1dJVEhfS0VDQ0FLIDAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBTSEEzX3N0YXRlIGhhc2hfc3RhdGU7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBQeVRocmVhZF90eXBlX2xvY2sgbG9jazsKKyNlbmRpZgorfSBTSEEzb2JqZWN0OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IFNIQTNfMjI0dHlwZTsKK3N0YXRpYyBQeVR5cGVPYmplY3QgU0hBM18yNTZ0eXBlOworc3RhdGljIFB5VHlwZU9iamVjdCBTSEEzXzM4NHR5cGU7CitzdGF0aWMgUHlUeXBlT2JqZWN0IFNIQTNfNTEydHlwZTsKKyNpZmRlZiBQWV9XSVRIX0tFQ0NBSworc3RhdGljIFB5VHlwZU9iamVjdCBLZWNjYWtfMjI0dHlwZTsKK3N0YXRpYyBQeVR5cGVPYmplY3QgS2VjY2FrXzI1NnR5cGU7CitzdGF0aWMgUHlUeXBlT2JqZWN0IEtlY2Nha18zODR0eXBlOworc3RhdGljIFB5VHlwZU9iamVjdCBLZWNjYWtfNTEydHlwZTsKKyNlbmRpZgorc3RhdGljIFB5VHlwZU9iamVjdCBTSEFLRTEyOHR5cGU7CitzdGF0aWMgUHlUeXBlT2JqZWN0IFNIQUtFMjU2dHlwZTsKKworI2luY2x1ZGUgImNsaW5pYy9zaGEzbW9kdWxlLmMuaCIKKworc3RhdGljIFNIQTNvYmplY3QgKgorbmV3U0hBM29iamVjdChQeVR5cGVPYmplY3QgKnR5cGUpCit7CisgICAgU0hBM29iamVjdCAqbmV3b2JqOworICAgIG5ld29iaiA9IChTSEEzb2JqZWN0ICopUHlPYmplY3RfTmV3KFNIQTNvYmplY3QsIHR5cGUpOworICAgIGlmIChuZXdvYmogPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBuZXdvYmotPmxvY2sgPSBOVUxMOworI2VuZGlmCisgICAgcmV0dXJuIG5ld29iajsKK30KKworCisvKltjbGluaWMgaW5wdXRdCitAY2xhc3NtZXRob2QKK19zaGEzLnNoYTNfMjI0Ll9fbmV3X18gYXMgcHlfc2hhM19uZXcKKyAgICBzdHJpbmcgYXMgZGF0YTogb2JqZWN0ID0gTlVMTAorCitSZXR1cm4gYSBuZXcgU0hBMyBoYXNoIG9iamVjdCB3aXRoIGEgaGFzaGJpdCBsZW5ndGggb2YgMjggYnl0ZXMuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9zaGEzX25ld19pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmRhdGEpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGQ1YzM0Mjc5ZTY5YmYwOSBpbnB1dD1kN2M1ODJiOTUwYTg1OGI2XSovCit7CisgICAgU0hBM29iamVjdCAqc2VsZiA9IE5VTEw7CisgICAgUHlfYnVmZmVyIGJ1ZiA9IHtOVUxMLCBOVUxMfTsKKyAgICBIYXNoUmV0dXJuIHJlczsKKworICAgIHNlbGYgPSBuZXdTSEEzb2JqZWN0KHR5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAodHlwZSA9PSAmU0hBM18yMjR0eXBlKSB7CisgICAgICAgIHJlcyA9IEtlY2Nha19IYXNoSW5pdGlhbGl6ZV9TSEEzXzIyNCgmc2VsZi0+aGFzaF9zdGF0ZSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09ICZTSEEzXzI1NnR5cGUpIHsKKyAgICAgICAgcmVzID0gS2VjY2FrX0hhc2hJbml0aWFsaXplX1NIQTNfMjU2KCZzZWxmLT5oYXNoX3N0YXRlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJlNIQTNfMzg0dHlwZSkgeworICAgICAgICByZXMgPSBLZWNjYWtfSGFzaEluaXRpYWxpemVfU0hBM18zODQoJnNlbGYtPmhhc2hfc3RhdGUpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSAmU0hBM181MTJ0eXBlKSB7CisgICAgICAgIHJlcyA9IEtlY2Nha19IYXNoSW5pdGlhbGl6ZV9TSEEzXzUxMigmc2VsZi0+aGFzaF9zdGF0ZSk7CisjaWZkZWYgUFlfV0lUSF9LRUNDQUsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJktlY2Nha18yMjR0eXBlKSB7CisgICAgICAgIHJlcyA9IEtlY2Nha19IYXNoSW5pdGlhbGl6ZSgmc2VsZi0+aGFzaF9zdGF0ZSwgMTE1MiwgNDQ4LCAyMjQsIDB4MDEpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSAmS2VjY2FrXzI1NnR5cGUpIHsKKyAgICAgICAgcmVzID0gS2VjY2FrX0hhc2hJbml0aWFsaXplKCZzZWxmLT5oYXNoX3N0YXRlLCAxMDg4LCA1MTIsIDI1NiwgMHgwMSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09ICZLZWNjYWtfMzg0dHlwZSkgeworICAgICAgICByZXMgPSBLZWNjYWtfSGFzaEluaXRpYWxpemUoJnNlbGYtPmhhc2hfc3RhdGUsIDgzMiwgNzY4LCAzODQsIDB4MDEpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSAmS2VjY2FrXzUxMnR5cGUpIHsKKyAgICAgICAgcmVzID0gS2VjY2FrX0hhc2hJbml0aWFsaXplKCZzZWxmLT5oYXNoX3N0YXRlLCA1NzYsIDEwMjQsIDUxMiwgMHgwMSk7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJlNIQUtFMTI4dHlwZSkgeworICAgICAgICByZXMgPSBLZWNjYWtfSGFzaEluaXRpYWxpemVfU0hBS0UxMjgoJnNlbGYtPmhhc2hfc3RhdGUpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSAmU0hBS0UyNTZ0eXBlKSB7CisgICAgICAgIHJlcyA9IEtlY2Nha19IYXNoSW5pdGlhbGl6ZV9TSEFLRTI1Nigmc2VsZi0+aGFzaF9zdGF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGRhdGEpIHsKKyAgICAgICAgR0VUX0JVRkZFUl9WSUVXX09SX0VSUk9SKGRhdGEsICZidWYsIGdvdG8gZXJyb3IpOworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgICAgIGlmIChidWYubGVuID49IEhBU0hMSUJfR0lMX01JTlNJWkUpIHsKKyAgICAgICAgICAgIC8qIGludmFyaWFudDogTmV3IG9iamVjdHMgY2FuJ3QgYmUgYWNjZXNzZWQgYnkgb3RoZXIgY29kZSB5ZXQsCisgICAgICAgICAgICAgKiB0aHVzIGl0J3Mgc2FmZSB0byByZWxlYXNlIHRoZSBHSUwgd2l0aG91dCBsb2NraW5nIHRoZSBvYmplY3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIHJlcyA9IFNIQTNfcHJvY2Vzcygmc2VsZi0+aGFzaF9zdGF0ZSwgYnVmLmJ1ZiwgYnVmLmxlbiAqIDgpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IFNIQTNfcHJvY2Vzcygmc2VsZi0+aGFzaF9zdGF0ZSwgYnVmLmJ1ZiwgYnVmLmxlbiAqIDgpOworICAgICAgICB9CisjZWxzZQorICAgICAgICByZXMgPSBTSEEzX3Byb2Nlc3MoJnNlbGYtPmhhc2hfc3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4gKiA4KTsKKyNlbmRpZgorICAgICAgICBpZiAocmVzICE9IFNVQ0NFU1MpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVybmFsIGVycm9yIGluIFNIQTMgVXBkYXRlKCkiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKworICBlcnJvcjoKKyAgICBpZiAoc2VsZikgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgfQorICAgIGlmIChkYXRhICYmIGJ1Zi5vYmopIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyogSW50ZXJuYWwgbWV0aG9kcyBmb3IgYSBoYXNoIG9iamVjdCAqLworCitzdGF0aWMgdm9pZAorU0hBM19kZWFsbG9jKFNIQTNvYmplY3QgKnNlbGYpCit7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBpZiAoc2VsZi0+bG9jaykgeworICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CisgICAgfQorI2VuZGlmCisgICAgUHlPYmplY3RfRGVsKHNlbGYpOworfQorCisKKy8qIEV4dGVybmFsIG1ldGhvZHMgZm9yIGEgaGFzaCBvYmplY3QgKi8KKworCisvKltjbGluaWMgaW5wdXRdCitfc2hhMy5zaGEzXzIyNC5jb3B5CisKK1JldHVybiBhIGNvcHkgb2YgdGhlIGhhc2ggb2JqZWN0LgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorX3NoYTNfc2hhM18yMjRfY29weV9pbXBsKFNIQTNvYmplY3QgKnNlbGYpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NmM1Mzc0MTFlY2RjZGE0YyBpbnB1dD05M2E0NGFhZWJlYTUxYmE4XSovCit7CisgICAgU0hBM29iamVjdCAqbmV3b2JqOworCisgICAgaWYgKChuZXdvYmogPSBuZXdTSEEzb2JqZWN0KFB5X1RZUEUoc2VsZikpKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBFTlRFUl9IQVNITElCKHNlbGYpOworICAgIFNIQTNfY29weXN0YXRlKG5ld29iai0+aGFzaF9zdGF0ZSwgc2VsZi0+aGFzaF9zdGF0ZSk7CisgICAgTEVBVkVfSEFTSExJQihzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3b2JqOworfQorCisKKy8qW2NsaW5pYyBpbnB1dF0KK19zaGEzLnNoYTNfMjI0LmRpZ2VzdAorCitSZXR1cm4gdGhlIGRpZ2VzdCB2YWx1ZSBhcyBhIHN0cmluZyBvZiBiaW5hcnkgZGF0YS4KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19zaGEzX3NoYTNfMjI0X2RpZ2VzdF9pbXBsKFNIQTNvYmplY3QgKnNlbGYpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmQ1MzE4NDJlMjBiMmQ1YiBpbnB1dD1hNTgwNzkxN2QyMTliMzBlXSovCit7CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbU0hBM19NQVhfRElHRVNUU0laRSArIFNIQTNfTEFORVNJWkVdOworICAgIFNIQTNfc3RhdGUgdGVtcDsKKyAgICBIYXNoUmV0dXJuIHJlczsKKworICAgIEVOVEVSX0hBU0hMSUIoc2VsZik7CisgICAgU0hBM19jb3B5c3RhdGUodGVtcCwgc2VsZi0+aGFzaF9zdGF0ZSk7CisgICAgTEVBVkVfSEFTSExJQihzZWxmKTsKKyAgICByZXMgPSBTSEEzX2RvbmUoJnRlbXAsIGRpZ2VzdCk7CisgICAgaWYgKHJlcyAhPSBTVUNDRVNTKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJpbnRlcm5hbCBlcnJvciBpbiBTSEEzIEZpbmFsKCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjb25zdCBjaGFyICopZGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5oYXNoX3N0YXRlLmZpeGVkT3V0cHV0TGVuZ3RoIC8gOCk7Cit9CisKKworLypbY2xpbmljIGlucHV0XQorX3NoYTMuc2hhM18yMjQuaGV4ZGlnZXN0CisKK1JldHVybiB0aGUgZGlnZXN0IHZhbHVlIGFzIGEgc3RyaW5nIG9mIGhleGFkZWNpbWFsIGRpZ2l0cy4KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19zaGEzX3NoYTNfMjI0X2hleGRpZ2VzdF9pbXBsKFNIQTNvYmplY3QgKnNlbGYpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NzVhZDAzMjU3OTA2OTE4ZCBpbnB1dD0yZDkxYmI2ZTBkMTE0ZWUzXSovCit7CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbU0hBM19NQVhfRElHRVNUU0laRSArIFNIQTNfTEFORVNJWkVdOworICAgIFNIQTNfc3RhdGUgdGVtcDsKKyAgICBIYXNoUmV0dXJuIHJlczsKKworICAgIC8qIEdldCB0aGUgcmF3IChiaW5hcnkpIGRpZ2VzdCB2YWx1ZSAqLworICAgIEVOVEVSX0hBU0hMSUIoc2VsZik7CisgICAgU0hBM19jb3B5c3RhdGUodGVtcCwgc2VsZi0+aGFzaF9zdGF0ZSk7CisgICAgTEVBVkVfSEFTSExJQihzZWxmKTsKKyAgICByZXMgPSBTSEEzX2RvbmUoJnRlbXAsIGRpZ2VzdCk7CisgICAgaWYgKHJlcyAhPSBTVUNDRVNTKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJpbnRlcm5hbCBlcnJvciBpbiBTSEEzIEZpbmFsKCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBfUHlfc3RyaGV4KChjb25zdCBjaGFyICopZGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmhhc2hfc3RhdGUuZml4ZWRPdXRwdXRMZW5ndGggLyA4KTsKK30KKworCisvKltjbGluaWMgaW5wdXRdCitfc2hhMy5zaGEzXzIyNC51cGRhdGUKKworICAgIG9iajogb2JqZWN0CisgICAgLworCitVcGRhdGUgdGhpcyBoYXNoIG9iamVjdCdzIHN0YXRlIHdpdGggdGhlIHByb3ZpZGVkIHN0cmluZy4KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19zaGEzX3NoYTNfMjI0X3VwZGF0ZShTSEEzb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2JqKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTA2NzIxZDU1YjQ4M2UwYWYgaW5wdXQ9YmU0NGJmMGQxYzI3OTc5MV0qLworeworICAgIFB5X2J1ZmZlciBidWY7CisgICAgSGFzaFJldHVybiByZXM7CisKKyAgICBHRVRfQlVGRkVSX1ZJRVdfT1JfRVJST1VUKG9iaiwgJmJ1Zik7CisKKyAgICAvKiBhZGQgbmV3IGRhdGEsIHRoZSBmdW5jdGlvbiB0YWtlcyB0aGUgbGVuZ3RoIGluIGJpdHMgbm90IGJ5dGVzICovCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBpZiAoc2VsZi0+bG9jayA9PSBOVUxMICYmIGJ1Zi5sZW4gPj0gSEFTSExJQl9HSUxfTUlOU0laRSkgeworICAgICAgICBzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIH0KKyAgICAvKiBPbmNlIGEgbG9jayBleGlzdHMgYWxsIGNvZGUgcGF0aHMgbXVzdCBiZSBzeW5jaHJvbml6ZWQuIFdlIGhhdmUgdG8KKyAgICAgKiByZWxlYXNlIHRoZSBHSUwgZXZlbiBmb3Igc21hbGwgYnVmZmVycyBhcyBhY3F1aXJpbmcgdGhlIGxvY2sgbWF5IHRha2UKKyAgICAgKiBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIHRpbWUgd2hlbiBhbm90aGVyIHRocmVhZCB1cGRhdGVzIHRoaXMgb2JqZWN0CisgICAgICogd2l0aCBsb3RzIG9mIGRhdGEuICovCisgICAgaWYgKHNlbGYtPmxvY2spIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soc2VsZi0+bG9jaywgMSk7CisgICAgICAgIHJlcyA9IFNIQTNfcHJvY2Vzcygmc2VsZi0+aGFzaF9zdGF0ZSwgYnVmLmJ1ZiwgYnVmLmxlbiAqIDgpOworICAgICAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soc2VsZi0+bG9jayk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXMgPSBTSEEzX3Byb2Nlc3MoJnNlbGYtPmhhc2hfc3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4gKiA4KTsKKyAgICB9CisjZWxzZQorICAgIHJlcyA9IFNIQTNfcHJvY2Vzcygmc2VsZi0+aGFzaF9zdGF0ZSwgYnVmLmJ1ZiwgYnVmLmxlbiAqIDgpOworI2VuZGlmCisKKyAgICBpZiAocmVzICE9IFNVQ0NFU1MpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCBlcnJvciBpbiBTSEEzIFVwZGF0ZSgpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCisKK3N0YXRpYyBQeU1ldGhvZERlZiBTSEEzX21ldGhvZHNbXSA9IHsKKyAgICBfU0hBM19TSEEzXzIyNF9DT1BZX01FVEhPRERFRgorICAgIF9TSEEzX1NIQTNfMjI0X0RJR0VTVF9NRVRIT0RERUYKKyAgICBfU0hBM19TSEEzXzIyNF9IRVhESUdFU1RfTUVUSE9EREVGCisgICAgX1NIQTNfU0hBM18yMjRfVVBEQVRFX01FVEhPRERFRgorICAgIHtOVUxMLCAgICAgICAgTlVMTH0gICAgICAgICAvKiBzZW50aW5lbCAqLworfTsKKworCitzdGF0aWMgUHlPYmplY3QgKgorU0hBM19nZXRfYmxvY2tfc2l6ZShTSEEzb2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIGludCByYXRlID0gc2VsZi0+aGFzaF9zdGF0ZS5zcG9uZ2UucmF0ZTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHJhdGUgLyA4KTsKK30KKworCitzdGF0aWMgUHlPYmplY3QgKgorU0hBM19nZXRfbmFtZShTSEEzb2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIFB5VHlwZU9iamVjdCAqdHlwZSA9IFB5X1RZUEUoc2VsZik7CisgICAgaWYgKHR5cGUgPT0gJlNIQTNfMjI0dHlwZSkgeworICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoInNoYTNfMjI0Iik7CisgICAgfSBlbHNlIGlmICh0eXBlID09ICZTSEEzXzI1NnR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJzaGEzXzI1NiIpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSAmU0hBM18zODR0eXBlKSB7CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZygic2hhM18zODQiKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJlNIQTNfNTEydHlwZSkgeworICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoInNoYTNfNTEyIik7CisjaWZkZWYgUFlfV0lUSF9LRUNDQUsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJktlY2Nha18yMjR0eXBlKSB7CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZygia2VjY2FrXzIyNCIpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSAmS2VjY2FrXzI1NnR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJrZWNjYWtfMjU2Iik7CisgICAgfSBlbHNlIGlmICh0eXBlID09ICZLZWNjYWtfMzg0dHlwZSkgeworICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoImtlY2Nha18zODQiKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJktlY2Nha181MTJ0eXBlKSB7CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZygia2VjY2FrXzUxMiIpOworI2VuZGlmCisgICAgfSBlbHNlIGlmICh0eXBlID09ICZTSEFLRTEyOHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJzaGFrZV8xMjgiKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJlNIQUtFMjU2dHlwZSkgeworICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoInNoYWtlXzI1NiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKKworc3RhdGljIFB5T2JqZWN0ICoKK1NIQTNfZ2V0X2RpZ2VzdF9zaXplKFNIQTNvYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhzZWxmLT5oYXNoX3N0YXRlLmZpeGVkT3V0cHV0TGVuZ3RoIC8gOCk7Cit9CisKKworc3RhdGljIFB5T2JqZWN0ICoKK1NIQTNfZ2V0X2NhcGFjaXR5X2JpdHMoU0hBM29iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICBpbnQgY2FwYWNpdHkgPSAxNjAwIC0gc2VsZi0+aGFzaF9zdGF0ZS5zcG9uZ2UucmF0ZTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKGNhcGFjaXR5KTsKK30KKworCitzdGF0aWMgUHlPYmplY3QgKgorU0hBM19nZXRfcmF0ZV9iaXRzKFNIQTNvYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgdW5zaWduZWQgaW50IHJhdGUgPSBzZWxmLT5oYXNoX3N0YXRlLnNwb25nZS5yYXRlOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcocmF0ZSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitTSEEzX2dldF9zdWZmaXgoU0hBM29iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHN1ZmZpeFsyXTsKKyAgICBzdWZmaXhbMF0gPSBzZWxmLT5oYXNoX3N0YXRlLmRlbGltaXRlZFN1ZmZpeDsKKyAgICBzdWZmaXhbMV0gPSAwOworICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjb25zdCBjaGFyICopc3VmZml4LCAxKTsKK30KKworCitzdGF0aWMgUHlHZXRTZXREZWYgU0hBM19nZXRzZXRlcnNbXSA9IHsKKyAgICB7ImJsb2NrX3NpemUiLCAoZ2V0dGVyKVNIQTNfZ2V0X2Jsb2NrX3NpemUsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsibmFtZSIsIChnZXR0ZXIpU0hBM19nZXRfbmFtZSwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJkaWdlc3Rfc2l6ZSIsIChnZXR0ZXIpU0hBM19nZXRfZGlnZXN0X3NpemUsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiX2NhcGFjaXR5X2JpdHMiLCAoZ2V0dGVyKVNIQTNfZ2V0X2NhcGFjaXR5X2JpdHMsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiX3JhdGVfYml0cyIsIChnZXR0ZXIpU0hBM19nZXRfcmF0ZV9iaXRzLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7Il9zdWZmaXgiLCAoZ2V0dGVyKVNIQTNfZ2V0X3N1ZmZpeCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisjZGVmaW5lIFNIQTNfVFlQRSh0eXBlX29iaiwgdHlwZV9uYW1lLCB0eXBlX2RvYywgdHlwZV9tZXRob2RzKSBcCisgICAgc3RhdGljIFB5VHlwZU9iamVjdCB0eXBlX29iaiA9IHsgXAorICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkgXAorICAgICAgICB0eXBlX25hbWUsICAgICAgICAgIC8qIHRwX25hbWUgKi8gXAorICAgICAgICBzaXplb2YoU0hBM29iamVjdCksIC8qIHRwX3NpemUgKi8gXAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovIFwKKyAgICAgICAgLyogIG1ldGhvZHMgICovIFwKKyAgICAgICAgKGRlc3RydWN0b3IpU0hBM19kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovIFwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLyBcCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLyBcCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLyBcCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfcmVzZXJ2ZWQgKi8gXAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8gXAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLyBcCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8gXAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8gXAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8gXAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8gXAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLyBcCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8gXAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovIFwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8gXAorICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsIC8qIHRwX2ZsYWdzICovIFwKKyAgICAgICAgdHlwZV9kb2MsICAgICAgICAgICAvKiB0cF9kb2MgKi8gXAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovIFwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLyBcCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8gXAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovIFwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovIFwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLyBcCisgICAgICAgIHR5cGVfbWV0aG9kcywgICAgICAgLyogdHBfbWV0aG9kcyAqLyBcCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLyBcCisgICAgICAgIFNIQTNfZ2V0c2V0ZXJzLCAgICAgLyogdHBfZ2V0c2V0ICovIFwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovIFwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovIFwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8gXAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLyBcCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLyBcCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLyBcCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8gXAorICAgICAgICBweV9zaGEzX25ldywgICAgICAgIC8qIHRwX25ldyAqLyBcCisgICAgfQorCitQeURvY19TVFJWQVIoc2hhM18yNTZfX2RvY19fLAorInNoYTNfMjU2KFtzdHJpbmddKSAtPiBTSEEzIG9iamVjdFxuXAorXG5cCitSZXR1cm4gYSBuZXcgU0hBMyBoYXNoIG9iamVjdCB3aXRoIGEgaGFzaGJpdCBsZW5ndGggb2YgMzIgYnl0ZXMuIik7CisKK1B5RG9jX1NUUlZBUihzaGEzXzM4NF9fZG9jX18sCisic2hhM18zODQoW3N0cmluZ10pIC0+IFNIQTMgb2JqZWN0XG5cCitcblwKK1JldHVybiBhIG5ldyBTSEEzIGhhc2ggb2JqZWN0IHdpdGggYSBoYXNoYml0IGxlbmd0aCBvZiA0OCBieXRlcy4iKTsKKworUHlEb2NfU1RSVkFSKHNoYTNfNTEyX19kb2NfXywKKyJzaGEzXzUxMihbc3RyaW5nXSkgLT4gU0hBMyBvYmplY3RcblwKK1xuXAorUmV0dXJuIGEgbmV3IFNIQTMgaGFzaCBvYmplY3Qgd2l0aCBhIGhhc2hiaXQgbGVuZ3RoIG9mIDY0IGJ5dGVzLiIpOworCitTSEEzX1RZUEUoU0hBM18yMjR0eXBlLCAiX3NoYTMuc2hhM18yMjQiLCBweV9zaGEzX25ld19fZG9jX18sIFNIQTNfbWV0aG9kcyk7CitTSEEzX1RZUEUoU0hBM18yNTZ0eXBlLCAiX3NoYTMuc2hhM18yNTYiLCBzaGEzXzI1Nl9fZG9jX18sIFNIQTNfbWV0aG9kcyk7CitTSEEzX1RZUEUoU0hBM18zODR0eXBlLCAiX3NoYTMuc2hhM18zODQiLCBzaGEzXzM4NF9fZG9jX18sIFNIQTNfbWV0aG9kcyk7CitTSEEzX1RZUEUoU0hBM181MTJ0eXBlLCAiX3NoYTMuc2hhM181MTIiLCBzaGEzXzUxMl9fZG9jX18sIFNIQTNfbWV0aG9kcyk7CisKKyNpZmRlZiBQWV9XSVRIX0tFQ0NBSworUHlEb2NfU1RSVkFSKGtlY2Nha18yMjRfX2RvY19fLAorImtlY2Nha18yMjQoW3N0cmluZ10pIC0+IEtlY2NhayBvYmplY3RcblwKK1xuXAorUmV0dXJuIGEgbmV3IEtlY2NhayBoYXNoIG9iamVjdCB3aXRoIGEgaGFzaGJpdCBsZW5ndGggb2YgMjggYnl0ZXMuIik7CisKK1B5RG9jX1NUUlZBUihrZWNjYWtfMjU2X19kb2NfXywKKyJrZWNjYWtfMjU2KFtzdHJpbmddKSAtPiBLZWNjYWsgb2JqZWN0XG5cCitcblwKK1JldHVybiBhIG5ldyBLZWNjYWsgaGFzaCBvYmplY3Qgd2l0aCBhIGhhc2hiaXQgbGVuZ3RoIG9mIDMyIGJ5dGVzLiIpOworCitQeURvY19TVFJWQVIoa2VjY2FrXzM4NF9fZG9jX18sCisia2VjY2FrXzM4NChbc3RyaW5nXSkgLT4gS2VjY2FrIG9iamVjdFxuXAorXG5cCitSZXR1cm4gYSBuZXcgS2VjY2FrIGhhc2ggb2JqZWN0IHdpdGggYSBoYXNoYml0IGxlbmd0aCBvZiA0OCBieXRlcy4iKTsKKworUHlEb2NfU1RSVkFSKGtlY2Nha181MTJfX2RvY19fLAorImtlY2Nha181MTIoW3N0cmluZ10pIC0+IEtlY2NhayBvYmplY3RcblwKK1xuXAorUmV0dXJuIGEgbmV3IEtlY2NhayBoYXNoIG9iamVjdCB3aXRoIGEgaGFzaGJpdCBsZW5ndGggb2YgNjQgYnl0ZXMuIik7CisKK1NIQTNfVFlQRShLZWNjYWtfMjI0dHlwZSwgIl9zaGEzLmtlY2Nha18yMjQiLCBrZWNjYWtfMjI0X19kb2NfXywgU0hBM19tZXRob2RzKTsKK1NIQTNfVFlQRShLZWNjYWtfMjU2dHlwZSwgIl9zaGEzLmtlY2Nha18yNTYiLCBrZWNjYWtfMjU2X19kb2NfXywgU0hBM19tZXRob2RzKTsKK1NIQTNfVFlQRShLZWNjYWtfMzg0dHlwZSwgIl9zaGEzLmtlY2Nha18zODQiLCBrZWNjYWtfMzg0X19kb2NfXywgU0hBM19tZXRob2RzKTsKK1NIQTNfVFlQRShLZWNjYWtfNTEydHlwZSwgIl9zaGEzLmtlY2Nha181MTIiLCBrZWNjYWtfNTEyX19kb2NfXywgU0hBM19tZXRob2RzKTsKKyNlbmRpZgorCisKK3N0YXRpYyBQeU9iamVjdCAqCitfU0hBS0VfZGlnZXN0KFNIQTNvYmplY3QgKnNlbGYsIHVuc2lnbmVkIGxvbmcgZGlnZXN0bGVuLCBpbnQgaGV4KQoreworICAgIHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCA9IE5VTEw7CisgICAgU0hBM19zdGF0ZSB0ZW1wOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisKKyAgICAvKiBFeHRyYWN0TGFuZSBuZWVkcyBhdCBsZWFzdCBTSEEzX01BWF9ESUdFU1RTSVpFICsgU0hBM19MQU5FU0laRSBhbmQKKyAgICAgKiBTSEEzX0xBTkVTSVpFIGV4dHJhIHNwYWNlLgorICAgICAqLworICAgIGRpZ2VzdCA9ICh1bnNpZ25lZCBjaGFyKilQeU1lbV9NYWxsb2MoZGlnZXN0bGVuICsgU0hBM19MQU5FU0laRSk7CisgICAgaWYgKGRpZ2VzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKworICAgIC8qIEdldCB0aGUgcmF3IChiaW5hcnkpIGRpZ2VzdCB2YWx1ZSAqLworICAgIEVOVEVSX0hBU0hMSUIoc2VsZik7CisgICAgU0hBM19jb3B5c3RhdGUodGVtcCwgc2VsZi0+aGFzaF9zdGF0ZSk7CisgICAgTEVBVkVfSEFTSExJQihzZWxmKTsKKyAgICByZXMgPSBTSEEzX2RvbmUoJnRlbXAsIE5VTEwpOworICAgIGlmIChyZXMgIT0gU1VDQ0VTUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiaW50ZXJuYWwgZXJyb3IgaW4gU0hBMyBkb25lKCkiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcmVzID0gU0hBM19zcXVlZXplKCZ0ZW1wLCBkaWdlc3QsIGRpZ2VzdGxlbiAqIDgpOworICAgIGlmIChyZXMgIT0gU1VDQ0VTUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiaW50ZXJuYWwgZXJyb3IgaW4gU0hBMyBTcXVlZXplKCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChoZXgpIHsKKyAgICAgICAgIHJlc3VsdCA9IF9QeV9zdHJoZXgoKGNvbnN0IGNoYXIgKilkaWdlc3QsIGRpZ2VzdGxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciAqKWRpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3RsZW4pOworICAgIH0KKyAgZXJyb3I6CisgICAgaWYgKGRpZ2VzdCAhPSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0ZyZWUoZGlnZXN0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKltjbGluaWMgaW5wdXRdCitfc2hhMy5zaGFrZV8xMjguZGlnZXN0CisKKyAgICBsZW5ndGg6IHVuc2lnbmVkX2xvbmcoYml0d2lzZT1UcnVlKQorICAgIFwKKworUmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgYXMgYSBzdHJpbmcgb2YgYmluYXJ5IGRhdGEuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfc2hhM19zaGFrZV8xMjhfZGlnZXN0X2ltcGwoU0hBM29iamVjdCAqc2VsZiwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjMxMzYwNWUyZjg3YmI4ZiBpbnB1dD02MDhjOGNhODBhZTlkMTE1XSovCit7CisgICAgcmV0dXJuIF9TSEFLRV9kaWdlc3Qoc2VsZiwgbGVuZ3RoLCAwKTsKK30KKworCisvKltjbGluaWMgaW5wdXRdCitfc2hhMy5zaGFrZV8xMjguaGV4ZGlnZXN0CisKKyAgICBsZW5ndGg6IHVuc2lnbmVkX2xvbmcoYml0d2lzZT1UcnVlKQorICAgIFwKKworUmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgYXMgYSBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzLgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorX3NoYTNfc2hha2VfMTI4X2hleGRpZ2VzdF9pbXBsKFNIQTNvYmplY3QgKnNlbGYsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJmOGUyZjFlNDkwOTQ0YTggaW5wdXQ9NjRlNTZiNDc2MGRiNDU3M10qLworeworICAgIHJldHVybiBfU0hBS0VfZGlnZXN0KHNlbGYsIGxlbmd0aCwgMSk7Cit9CisKKworc3RhdGljIFB5TWV0aG9kRGVmIFNIQUtFX21ldGhvZHNbXSA9IHsKKyAgICBfU0hBM19TSEEzXzIyNF9DT1BZX01FVEhPRERFRgorICAgIF9TSEEzX1NIQUtFXzEyOF9ESUdFU1RfTUVUSE9EREVGCisgICAgX1NIQTNfU0hBS0VfMTI4X0hFWERJR0VTVF9NRVRIT0RERUYKKyAgICBfU0hBM19TSEEzXzIyNF9VUERBVEVfTUVUSE9EREVGCisgICAge05VTEwsICAgICAgICBOVUxMfSAgICAgICAgIC8qIHNlbnRpbmVsICovCit9OworCitQeURvY19TVFJWQVIoc2hha2VfMTI4X19kb2NfXywKKyJzaGFrZV8xMjgoW3N0cmluZ10pIC0+IFNIQUtFIG9iamVjdFxuXAorXG5cCitSZXR1cm4gYSBuZXcgU0hBS0UgaGFzaCBvYmplY3QuIik7CisKK1B5RG9jX1NUUlZBUihzaGFrZV8yNTZfX2RvY19fLAorInNoYWtlXzI1Nihbc3RyaW5nXSkgLT4gU0hBS0Ugb2JqZWN0XG5cCitcblwKK1JldHVybiBhIG5ldyBTSEFLRSBoYXNoIG9iamVjdC4iKTsKKworU0hBM19UWVBFKFNIQUtFMTI4dHlwZSwgIl9zaGEzLnNoYWtlXzEyOCIsIHNoYWtlXzEyOF9fZG9jX18sIFNIQUtFX21ldGhvZHMpOworU0hBM19UWVBFKFNIQUtFMjU2dHlwZSwgIl9zaGEzLnNoYWtlXzI1NiIsIHNoYWtlXzI1Nl9fZG9jX18sIFNIQUtFX21ldGhvZHMpOworCisKKy8qIEluaXRpYWxpemUgdGhpcyBtb2R1bGUuICovCitzdGF0aWMgc3RydWN0IFB5TW9kdWxlRGVmIF9TSEEzbW9kdWxlID0geworICAgICAgICBQeU1vZHVsZURlZl9IRUFEX0lOSVQsCisgICAgICAgICJfc2hhMyIsCisgICAgICAgIE5VTEwsCisgICAgICAgIC0xLAorICAgICAgICBOVUxMLAorICAgICAgICBOVUxMLAorICAgICAgICBOVUxMLAorICAgICAgICBOVUxMLAorICAgICAgICBOVUxMCit9OworCisKK1B5TU9ESU5JVF9GVU5DCitQeUluaXRfX3NoYTModm9pZCkKK3sKKyAgICBQeU9iamVjdCAqbSA9IE5VTEw7CisKKyAgICBpZiAoKG0gPSBQeU1vZHVsZV9DcmVhdGUoJl9TSEEzbW9kdWxlKSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyNkZWZpbmUgaW5pdF9zaGEzdHlwZShuYW1lLCB0eXBlKSAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X1RZUEUodHlwZSkgPSAmUHlUeXBlX1R5cGU7IFwKKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSh0eXBlKSA8IDApIHsgXAorICAgICAgICAgICAgZ290byBlcnJvcjsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlfSU5DUkVGKChQeU9iamVjdCAqKXR5cGUpOyAgXAorICAgICAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sIG5hbWUsIChQeU9iamVjdCAqKXR5cGUpIDwgMCkgeyBcCisgICAgICAgICAgICBnb3RvIGVycm9yOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKKworICAgIGluaXRfc2hhM3R5cGUoInNoYTNfMjI0IiwgJlNIQTNfMjI0dHlwZSk7CisgICAgaW5pdF9zaGEzdHlwZSgic2hhM18yNTYiLCAmU0hBM18yNTZ0eXBlKTsKKyAgICBpbml0X3NoYTN0eXBlKCJzaGEzXzM4NCIsICZTSEEzXzM4NHR5cGUpOworICAgIGluaXRfc2hhM3R5cGUoInNoYTNfNTEyIiwgJlNIQTNfNTEydHlwZSk7CisjaWZkZWYgUFlfV0lUSF9LRUNDQUsKKyAgICBpbml0X3NoYTN0eXBlKCJrZWNjYWtfMjI0IiwgJktlY2Nha18yMjR0eXBlKTsKKyAgICBpbml0X3NoYTN0eXBlKCJrZWNjYWtfMjU2IiwgJktlY2Nha18yNTZ0eXBlKTsKKyAgICBpbml0X3NoYTN0eXBlKCJrZWNjYWtfMzg0IiwgJktlY2Nha18zODR0eXBlKTsKKyAgICBpbml0X3NoYTN0eXBlKCJrZWNjYWtfNTEyIiwgJktlY2Nha181MTJ0eXBlKTsKKyNlbmRpZgorICAgIGluaXRfc2hhM3R5cGUoInNoYWtlXzEyOCIsICZTSEFLRTEyOHR5cGUpOworICAgIGluaXRfc2hhM3R5cGUoInNoYWtlXzI1NiIsICZTSEFLRTI1NnR5cGUpOworCisjdW5kZWYgaW5pdF9zaGEzdHlwZQorCisgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJrZWNjYWtvcHQiLCBLZWNjYWtPcHQpIDwgMCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAoUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgImltcGxlbWVudGF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2VjY2FrUDE2MDBfaW1wbGVtZW50YXRpb24pIDwgMCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldHVybiBtOworICBlcnJvcjoKKyAgICBQeV9ERUNSRUYobSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuYyBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCmluZGV4IDM2ODlhNGUuLjYyYzU4OTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCkBAIC0yNDQsOCArMjQ0LDcgQEAKICAgICAgICAgcHRyID0gcHRyLT5uZXh0OwogICAgIH0KIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGNhY2hlX21ldGhvZHNbXSA9IHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCmluZGV4IDNjNTIxMDguLjRhMTBjZTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYwpAQCAtMzY2LDggKzM2Niw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIC8qCkBAIC02NzMsNyArNjcyLDcgQEAKICAgICBhZ2dyZWdhdGVfaW5zdGFuY2UgPSAoUHlPYmplY3QqKilzcWxpdGUzX2FnZ3JlZ2F0ZV9jb250ZXh0KGNvbnRleHQsIHNpemVvZihQeU9iamVjdCopKTsKIAogICAgIGlmICgqYWdncmVnYXRlX2luc3RhbmNlID09IDApIHsKLSAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihhZ2dyZWdhdGVfY2xhc3MsICIiKTsKKyAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihhZ2dyZWdhdGVfY2xhc3MsIE5VTEwpOwogCiAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICAqYWdncmVnYXRlX2luc3RhbmNlID0gMDsKQEAgLTc0NSw3ICs3NDQsNyBAQAogICAgIFB5RXJyX0ZldGNoKCZleGNlcHRpb24sICZ2YWx1ZSwgJnRiKTsKICAgICByZXN0b3JlID0gMTsKIAotICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSwgJlB5SWRfZmluYWxpemUsICIiKTsKKyAgICBmdW5jdGlvbl9yZXN1bHQgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKCphZ2dyZWdhdGVfaW5zdGFuY2UsICZQeUlkX2ZpbmFsaXplLCBOVUxMKTsKIAogICAgIFB5X0RFQ1JFRigqYWdncmVnYXRlX2luc3RhbmNlKTsKIApAQCAtODc0LDggKzg3Myw3IEBACiAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgZnVuYywgUHlfTm9uZSkgPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAKQEAgLTkwNiw4ICs5MDQsNyBAQAogICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGFnZ3JlZ2F0ZV9jbGFzcywgUHlfTm9uZSkgPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAKQEAgLTk2Myw3ICs5NjAsNyBAQAogCiAgICAgZ2lsc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwogI2VuZGlmCi0gICAgcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopdXNlcl9hcmcsICIiKTsKKyAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0Kil1c2VyX2FyZywgTlVMTCk7CiAKICAgICBpZiAoIXJldCkgewogICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CkBAIC0xMDQyLDggKzEwMzksNyBAQAogICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGF1dGhvcml6ZXJfY2IsIFB5X05vbmUpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogfQogCkBAIC0xMDcyLDggKzEwNjgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X3RyYWNlX2NhbGxiYWNrKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQpAQCAtMTEwMCw4ICsxMDk1LDcgQEAKICAgICAgICAgc3FsaXRlM190cmFjZShzZWxmLT5kYiwgX3RyYWNlX2NhbGxiYWNrLCB0cmFjZV9jYWxsYmFjayk7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiAjaWZkZWYgSEFWRV9MT0FEX0VYVEVOU0lPTgpAQCAtMTEyNCw4ICsxMTE4LDcgQEAKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJFcnJvciBlbmFibGluZyBsb2FkIGV4dGVuc2lvbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAKQEAgLTExNDgsOCArMTE0MSw3IEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCBlcnJtc2cpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAjZW5kaWYKQEAgLTEyOTksNyArMTI5MSw3IEBACiAgICAgUHlPYmplY3QqIHJlc3VsdCA9IDA7CiAgICAgUHlPYmplY3QqIG1ldGhvZCA9IDA7CiAKLSAgICBjdXJzb3IgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCopc2VsZiwgJlB5SWRfY3Vyc29yLCAiIik7CisgICAgY3Vyc29yID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCgoUHlPYmplY3QqKXNlbGYsICZQeUlkX2N1cnNvciwgTlVMTCk7CiAgICAgaWYgKCFjdXJzb3IpIHsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CkBAIC0xMzI4LDcgKzEzMjAsNyBAQAogICAgIFB5T2JqZWN0KiByZXN1bHQgPSAwOwogICAgIFB5T2JqZWN0KiBtZXRob2QgPSAwOwogCi0gICAgY3Vyc29yID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCgoUHlPYmplY3QqKXNlbGYsICZQeUlkX2N1cnNvciwgIiIpOworICAgIGN1cnNvciA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKFB5T2JqZWN0KilzZWxmLCAmUHlJZF9jdXJzb3IsIE5VTEwpOwogICAgIGlmICghY3Vyc29yKSB7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMTM1Nyw3ICsxMzQ5LDcgQEAKICAgICBQeU9iamVjdCogcmVzdWx0ID0gMDsKICAgICBQeU9iamVjdCogbWV0aG9kID0gMDsKIAotICAgIGN1cnNvciA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKFB5T2JqZWN0KilzZWxmLCAmUHlJZF9jdXJzb3IsICIiKTsKKyAgICBjdXJzb3IgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCopc2VsZiwgJlB5SWRfY3Vyc29yLCBOVUxMKTsKICAgICBpZiAoIWN1cnNvcikgewogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KQEAgLTE1MjcsNyArMTUxOSw3IEBACiAgICAgICAgIGdvdG8gZmluYWxseTsKICAgICB9CiAKLSAgICB1cHBlcmNhc2VfbmFtZSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQobmFtZSwgJlB5SWRfdXBwZXIsICIiKTsKKyAgICB1cHBlcmNhc2VfbmFtZSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQobmFtZSwgJlB5SWRfdXBwZXIsIE5VTEwpOwogICAgIGlmICghdXBwZXJjYXNlX25hbWUpIHsKICAgICAgICAgZ290byBmaW5hbGx5OwogICAgIH0KQEAgLTE2MTksNyArMTYxMSw3IEBACiAgICAgICAgIG1ldGhvZF9uYW1lID0gInJvbGxiYWNrIjsKICAgICB9CiAKLSAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgbWV0aG9kX25hbWUsICIiKTsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgbWV0aG9kX25hbWUsIE5VTEwpOwogICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTE2MjgsNyArMTYyMCw3IEBACiAgICAgUHlfUkVUVVJOX0ZBTFNFOwogfQogCi1zdGF0aWMgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGNvbm5lY3Rpb25fZG9jW10gPQogUHlEb2NfU1RSKCJTUUxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbiBvYmplY3QuIik7CiAKIHN0YXRpYyBQeUdldFNldERlZiBjb25uZWN0aW9uX2dldHNldFtdID0gewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCmluZGV4IGUxNjc2ZGUuLmUyYzdhMzQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAogUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9pdGVybmV4dChweXNxbGl0ZV9DdXJzb3IqIHNlbGYpOwogCi1zdGF0aWMgY2hhciogZXJybXNnX2ZldGNoX2Fjcm9zc19yb2xsYmFjayA9ICJDdXJzb3IgbmVlZGVkIHRvIGJlIHJlc2V0IGJlY2F1c2Ugb2YgY29tbWl0L3JvbGxiYWNrIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIGZldGNoZWQgZnJvbS4iOworc3RhdGljIGNvbnN0IGNoYXIgZXJybXNnX2ZldGNoX2Fjcm9zc19yb2xsYmFja1tdID0gIkN1cnNvciBuZWVkZWQgdG8gYmUgcmVzZXQgYmVjYXVzZSBvZiBjb21taXQvcm9sbGJhY2sgYW5kIGNhbiBubyBsb25nZXIgYmUgZmV0Y2hlZCBmcm9tLiI7CiAKIHN0YXRpYyBweXNxbGl0ZV9TdGF0ZW1lbnRLaW5kIGRldGVjdF9zdGF0ZW1lbnRfdHlwZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQpCiB7CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICBQeU9iamVjdCogcmV0dmFsOwogICAgIF9QeV9JREVOVElGSUVSKHVwcGVyKTsKIAotICAgIHVwY2FzZV9rZXkgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGtleSwgJlB5SWRfdXBwZXIsICIiKTsKKyAgICB1cGNhc2Vfa2V5ID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChrZXksICZQeUlkX3VwcGVyLCBOVUxMKTsKICAgICBpZiAoIXVwY2FzZV9rZXkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjQyLDggKzI0Miw3IEBACiAgICAgY29uc3QgY2hhciogcG9zOwogCiAgICAgaWYgKCFjb2xuYW1lKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgIH0KIAogICAgIGZvciAocG9zID0gY29sbmFtZTs7IHBvcysrKSB7CkBAIC02OTgsNyArNjk3LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5sYXN0cm93aWQpOwotICAgICAgICBpZiAoIW11bHRpcGxlICYmIHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9JTlNFUlQpIHsKKyAgICAgICAgaWYgKCFtdWx0aXBsZSAmJgorICAgICAgICAgICAgLyogUkVQTEFDRSBpcyBhbiBhbGlhcyBmb3IgSU5TRVJUIE9SIFJFUExBQ0UgKi8KKyAgICAgICAgICAgIChzdGF0ZW1lbnRfdHlwZSA9PSBTVEFURU1FTlRfSU5TRVJUIHx8IHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9SRVBMQUNFKSkgewogICAgICAgICAgICAgc3FsaXRlX2ludDY0IGxhc3Ryb3dpZDsKICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgICAgIGxhc3Ryb3dpZCA9IHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQoc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOwpAQCAtOTEzLDggKzkxNCw3IEBACiAKICAgICByb3cgPSBweXNxbGl0ZV9jdXJzb3JfaXRlcm5leHQoc2VsZik7CiAgICAgaWYgKCFyb3cgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogCiAgICAgcmV0dXJuIHJvdzsKQEAgLTk5NSw4ICs5OTUsNyBAQAogUHlPYmplY3QqIHB5c3FsaXRlX25vb3AocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7CiAgICAgLyogZG9uJ3QgY2FyZSwgcmV0dXJuIE5vbmUgKi8KLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfY2xvc2UocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncykKQEAgLTEwMTIsOCArMTAxMSw3IEBACiAKICAgICBzZWxmLT5jbG9zZWQgPSAxOwogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY3Vyc29yX21ldGhvZHNbXSA9IHsKQEAgLTEwNDksNyArMTA0Nyw3IEBACiAgICAge05VTEx9CiB9OwogCi1zdGF0aWMgY2hhciBjdXJzb3JfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgY3Vyc29yX2RvY1tdID0KIFB5RG9jX1NUUigiU1FMaXRlIGRhdGFiYXNlIGN1cnNvciBjbGFzcy4iKTsKIAogUHlUeXBlT2JqZWN0IHB5c3FsaXRlX0N1cnNvclR5cGUgPSB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKaW5kZXggN2E3ZTg2MC4uY2M0NTMzMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYwpAQCAtMTM5LDggKzEzOSw3IEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiQ2hhbmdpbmcgdGhlIHNoYXJlZF9jYWNoZSBmbGFnIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAKQEAgLTE3Miw4ICsxNzEsNyBAQAogICAgIGlmIChyYyA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihtb2R1bGVfcmVnaXN0ZXJfYWRhcHRlcl9kb2MsCkBAIC0xOTQsNyArMTkyLDcgQEAKICAgICB9CiAKICAgICAvKiBjb252ZXJ0IHRoZSBuYW1lIHRvIHVwcGVyIGNhc2UgKi8KLSAgICBuYW1lID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChvcmlnX25hbWUsICZQeUlkX3VwcGVyLCAiIik7CisgICAgbmFtZSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQob3JpZ19uYW1lLCAmUHlJZF91cHBlciwgTlVMTCk7CiAgICAgaWYgKCFuYW1lKSB7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMjIxLDggKzIxOSw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzX2RvYywKQEAgLTI2MSwxMyArMjU4LDEzIEBACiB9OwogCiBzdHJ1Y3QgX0ludENvbnN0YW50UGFpciB7Ci0gICAgY2hhciogY29uc3RhbnRfbmFtZTsKKyAgICBjb25zdCBjaGFyICpjb25zdGFudF9uYW1lOwogICAgIGludCBjb25zdGFudF92YWx1ZTsKIH07CiAKIHR5cGVkZWYgc3RydWN0IF9JbnRDb25zdGFudFBhaXIgSW50Q29uc3RhbnRQYWlyOwogCi1zdGF0aWMgSW50Q29uc3RhbnRQYWlyIF9pbnRfY29uc3RhbnRzW10gPSB7CitzdGF0aWMgY29uc3QgSW50Q29uc3RhbnRQYWlyIF9pbnRfY29uc3RhbnRzW10gPSB7CiAgICAgeyJQQVJTRV9ERUNMVFlQRVMiLCBQQVJTRV9ERUNMVFlQRVN9LAogICAgIHsiUEFSU0VfQ09MTkFNRVMiLCBQQVJTRV9DT0xOQU1FU30sCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMgYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5jCmluZGV4IDMxMmZlM2IuLjM1MWIxYjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYwpAQCAtMTEzLDcgKzExMyw2IEBACiBQeU9iamVjdCAqCiBfcHlzcWxpdGVfbG9uZ19mcm9tX2ludDY0KHNxbGl0ZV9pbnQ2NCB2YWx1ZSkKIHsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogIyBpZiBTSVpFT0ZfTE9OR19MT05HIDwgOAogICAgIGlmICh2YWx1ZSA+IFBZX0xMT05HX01BWCB8fCB2YWx1ZSA8IFBZX0xMT05HX01JTikgewogICAgICAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KCZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwKQEAgLTEyNCwxNCArMTIzLDYgQEAKICAgICBpZiAodmFsdWUgPiBMT05HX01BWCB8fCB2YWx1ZSA8IExPTkdfTUlOKQogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CiAjIGVuZGlmCi0jZWxzZQotIyBpZiBTSVpFT0ZfTE9ORyA8IDgKLSAgICBpZiAodmFsdWUgPiBMT05HX01BWCB8fCB2YWx1ZSA8IExPTkdfTUlOKSB7Ci0gICAgICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoJnZhbHVlLCBzaXplb2YodmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0xJVFRMRV9FTkRJQU4sIDEgLyogc2lnbmVkICovKTsKLSAgICB9Ci0jIGVuZGlmCi0jZW5kaWYKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QodmFsdWUsIHNxbGl0ZV9pbnQ2NCwgbG9uZykpOwogfQogCkBAIC0xMzksMjMgKzEzMCwxMyBAQAogX3B5c3FsaXRlX2xvbmdfYXNfaW50NjQoUHlPYmplY3QgKiBweV92YWwpCiB7CiAgICAgaW50IG92ZXJmbG93OwotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0gICAgUFlfTE9OR19MT05HIHZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhweV92YWwsICZvdmVyZmxvdyk7Ci0jZWxzZQotICAgIGxvbmcgdmFsdWUgPSBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cocHlfdmFsLCAmb3ZlcmZsb3cpOwotI2VuZGlmCisgICAgbG9uZyBsb25nIHZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhweV92YWwsICZvdmVyZmxvdyk7CiAgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAoIW92ZXJmbG93KSB7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKICMgaWYgU0laRU9GX0xPTkdfTE9ORyA+IDgKICAgICAgICAgaWYgKC0weDgwMDAwMDAwMDAwMDAwMDBMTCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAweDdGRkZGRkZGRkZGRkZGRkZMTCkKICMgZW5kaWYKLSNlbHNlCi0jIGlmIFNJWkVPRl9MT05HID4gOAotICAgICAgICBpZiAoLTB4ODAwMDAwMDAwMDAwMDAwMEwgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMHg3RkZGRkZGRkZGRkZGRkZGTCkKLSMgZW5kaWYKLSNlbmRpZgogICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KICAgICBlbHNlIGlmIChzaXplb2YodmFsdWUpIDwgc2l6ZW9mKHNxbGl0ZV9pbnQ2NCkpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NyZS5jIGIvTW9kdWxlcy9fc3JlLmMKaW5kZXggMDliNTgzNS4uYWZhOTA5OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3JlLmMKKysrIGIvTW9kdWxlcy9fc3JlLmMKQEAgLTM1LDcgKzM1LDcgQEAKICAqIG90aGVyIGNvbXBhdGliaWxpdHkgd29yay4KICAqLwogCi1zdGF0aWMgY2hhciBjb3B5cmlnaHRbXSA9CitzdGF0aWMgY29uc3QgY2hhciBjb3B5cmlnaHRbXSA9CiAgICAgIiBTUkUgMi4yLjIgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDIgYnkgU2VjcmV0IExhYnMgQUIgIjsKIAogI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCkBAIC02Miw5ICs2Miw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogb3B0aW9uYWwgZmVhdHVyZXMgKi8KIAotLyogZW5hYmxlcyBmYXN0IHNlYXJjaGluZyAqLwotI2RlZmluZSBVU0VfRkFTVF9TRUFSQ0gKLQogLyogZW5hYmxlcyBjb3B5L2RlZXBjb3B5IGhhbmRsaW5nICh3b3JrIGluIHByb2dyZXNzKSAqLwogI3VuZGVmIFVTRV9CVUlMVElOX0NPUFkKIApAQCAtNzE3LDcgKzcxNCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKLWNhbGwoY2hhciogbW9kdWxlLCBjaGFyKiBmdW5jdGlvbiwgUHlPYmplY3QqIGFyZ3MpCitjYWxsKGNvbnN0IGNoYXIqIG1vZHVsZSwgY29uc3QgY2hhciogZnVuY3Rpb24sIFB5T2JqZWN0KiBhcmdzKQogewogICAgIFB5T2JqZWN0KiBuYW1lOwogICAgIFB5T2JqZWN0KiBtb2Q7CkBAIC0xMDU5LDcgKzEwNTYsNiBAQAogICAgIFB5T2JqZWN0KiBqb2luZXI7CiAgICAgUHlPYmplY3QqIGl0ZW07CiAgICAgUHlPYmplY3QqIGZpbHRlcjsKLSAgICBQeU9iamVjdCogYXJnczsKICAgICBQeU9iamVjdCogbWF0Y2g7CiAgICAgdm9pZCogcHRyOwogICAgIFB5X3NzaXplX3Qgc3RhdHVzOwpAQCAtMTE2MSwxMyArMTE1Nyw3IEBACiAgICAgICAgICAgICBtYXRjaCA9IHBhdHRlcm5fbmV3X21hdGNoKHNlbGYsICZzdGF0ZSwgMSk7CiAgICAgICAgICAgICBpZiAoIW1hdGNoKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIG1hdGNoKTsKLSAgICAgICAgICAgIGlmICghYXJncykgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtYXRjaCk7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ZW0gPSBQeU9iamVjdF9DYWxsT2JqZWN0KGZpbHRlciwgYXJncyk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgICAgICBpdGVtID0gX1B5T2JqZWN0X0NhbGxBcmcxKGZpbHRlciwgbWF0Y2gpOwogICAgICAgICAgICAgUHlfREVDUkVGKG1hdGNoKTsKICAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTU5Miw3ICsxNTgyLDcgQEAKICAgICAgICAgc2tpcCA9ICpjb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBWVFJBQ0UoKCIlbHUgKHNraXAgdG8gJXApXG4iLCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylza2lwLCBjb2RlK3NraXApKTsgICAgICAgIFwKLSAgICAgICAgaWYgKHNraXAtYWRqID4gKFB5X3VpbnRwdHJfdCkoZW5kIC0gY29kZSkpICAgICAgXAorICAgICAgICBpZiAoc2tpcC1hZGogPiAodWludHB0cl90KShlbmQgLSBjb2RlKSkgICAgICBcCiAgICAgICAgICAgICBGQUlMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgY29kZSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCkBAIC0xNjI2LDcgKzE2MTYsNyBAQAogCiAgICAgICAgIGNhc2UgU1JFX09QX0NIQVJTRVQ6CiAgICAgICAgICAgICBvZmZzZXQgPSAyNTYvU1JFX0NPREVfQklUUzsgLyogMjU2LWJpdCBiaXRtYXAgKi8KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiAoUHlfdWludHB0cl90KShlbmQgLSBjb2RlKSkKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAodWludHB0cl90KShlbmQgLSBjb2RlKSkKICAgICAgICAgICAgICAgICBGQUlMOwogICAgICAgICAgICAgY29kZSArPSBvZmZzZXQ7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE2MzQsNyArMTYyNCw3IEBACiAgICAgICAgIGNhc2UgU1JFX09QX0JJR0NIQVJTRVQ6CiAgICAgICAgICAgICBHRVRfQVJHOyAvKiBOdW1iZXIgb2YgYmxvY2tzICovCiAgICAgICAgICAgICBvZmZzZXQgPSAyNTYvc2l6ZW9mKFNSRV9DT0RFKTsgLyogMjU2LWJ5dGUgdGFibGUgKi8KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiAoUHlfdWludHB0cl90KShlbmQgLSBjb2RlKSkKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAodWludHB0cl90KShlbmQgLSBjb2RlKSkKICAgICAgICAgICAgICAgICBGQUlMOwogICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgZWFjaCBieXRlIHBvaW50cyB0byBhIHZhbGlkIGJsb2NrICovCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKQEAgLTE2NDMsNyArMTYzMyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb2RlICs9IG9mZnNldDsKICAgICAgICAgICAgIG9mZnNldCA9IGFyZyAqICgyNTYvU1JFX0NPREVfQklUUyk7IC8qIDI1Ni1iaXQgYml0bWFwIHRpbWVzIGFyZyAqLwotICAgICAgICAgICAgaWYgKG9mZnNldCA+IChQeV91aW50cHRyX3QpKGVuZCAtIGNvZGUpKQorICAgICAgICAgICAgaWYgKG9mZnNldCA+ICh1aW50cHRyX3QpKGVuZCAtIGNvZGUpKQogICAgICAgICAgICAgICAgIEZBSUw7CiAgICAgICAgICAgICBjb2RlICs9IG9mZnNldDsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTc5NCwxMSArMTc4NCwxMSBAQAogICAgICAgICAgICAgICAgICAgICBHRVRfQVJHOyBwcmVmaXhfbGVuID0gYXJnOwogICAgICAgICAgICAgICAgICAgICBHRVRfQVJHOwogICAgICAgICAgICAgICAgICAgICAvKiBIZXJlIGNvbWVzIHRoZSBwcmVmaXggc3RyaW5nICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXhfbGVuID4gKFB5X3VpbnRwdHJfdCkobmV3Y29kZSAtIGNvZGUpKQorICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4X2xlbiA+ICh1aW50cHRyX3QpKG5ld2NvZGUgLSBjb2RlKSkKICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUw7CiAgICAgICAgICAgICAgICAgICAgIGNvZGUgKz0gcHJlZml4X2xlbjsKICAgICAgICAgICAgICAgICAgICAgLyogQW5kIGhlcmUgY29tZXMgdGhlIG92ZXJsYXAgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeF9sZW4gPiAoUHlfdWludHB0cl90KShuZXdjb2RlIC0gY29kZSkpCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXhfbGVuID4gKHVpbnRwdHJfdCkobmV3Y29kZSAtIGNvZGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgRkFJTDsKICAgICAgICAgICAgICAgICAgICAgLyogRWFjaCBvdmVybGFwIHZhbHVlIHNob3VsZCBiZSA8IHByZWZpeF9sZW4gKi8KICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHByZWZpeF9sZW47IGkrKykgewpAQCAtMTkyNyw3ICsxOTE3LDcgQEAKICAgICAgICAgICAgICAgIHRvIGFsbG93IGFyYml0cmFyeSBqdW1wcyBhbnl3aGVyZSBpbiB0aGUgY29kZTsgc28gd2UganVzdCBsb29rCiAgICAgICAgICAgICAgICBmb3IgYSBKVU1QIG9wY29kZSBwcmVjZWRpbmcgb3VyIHNraXAgdGFyZ2V0LgogICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChza2lwID49IDMgJiYgc2tpcC0zIDwgKFB5X3VpbnRwdHJfdCkoZW5kIC0gY29kZSkgJiYKKyAgICAgICAgICAgIGlmIChza2lwID49IDMgJiYgc2tpcC0zIDwgKHVpbnRwdHJfdCkoZW5kIC0gY29kZSkgJiYKICAgICAgICAgICAgICAgICBjb2RlW3NraXAtM10gPT0gU1JFX09QX0pVTVApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgVlRSQUNFKCgiYm90aCB0aGVuIGFuZCBlbHNlIHBhcnRzIHByZXNlbnRcbiIpKTsKQEAgLTIwNTIsOCArMjA0Miw5IEBACiAgICAgICAgIC8qIERlZmF1bHQgdmFsdWUgKi8KICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAoUHlMb25nX0NoZWNrKGluZGV4KSkKLSAgICAgICAgcmV0dXJuIFB5TG9uZ19Bc1NzaXplX3QoaW5kZXgpOworICAgIGlmIChQeUluZGV4X0NoZWNrKGluZGV4KSkgeworICAgICAgICByZXR1cm4gUHlOdW1iZXJfQXNTc2l6ZV90KGluZGV4LCBOVUxMKTsKKyAgICB9CiAKICAgICBpID0gLTE7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NzbC5jIGIvTW9kdWxlcy9fc3NsLmMKaW5kZXggYTc5YzNhOC4uYjRmYWM0NCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3NsLmMKKysrIGIvTW9kdWxlcy9fc3NsLmMKQEAgLTQ1NSw3ICs0NTUsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotUHlTU0xfU2V0RXJyb3IoUHlTU0xTb2NrZXQgKm9iaiwgaW50IHJldCwgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pCitQeVNTTF9TZXRFcnJvcihQeVNTTFNvY2tldCAqb2JqLCBpbnQgcmV0LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykKIHsKICAgICBQeU9iamVjdCAqdHlwZSA9IFB5U1NMRXJyb3JPYmplY3Q7CiAgICAgY2hhciAqZXJyc3RyID0gTlVMTDsKQEAgLTUzNyw3ICs1MzcsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotX3NldFNTTEVycm9yIChjaGFyICplcnJzdHIsIGludCBlcnJjb2RlLCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykgeworX3NldFNTTEVycm9yIChjb25zdCBjaGFyICplcnJzdHIsIGludCBlcnJjb2RlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykgewogCiAgICAgaWYgKGVycnN0ciA9PSBOVUxMKQogICAgICAgICBlcnJjb2RlID0gRVJSX3BlZWtfbGFzdF9lcnJvcigpOwpAQCAtMTU0Nyw2ICsxNTQ3LDc2IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAwMDIwMDBVTAorc3RhdGljIFB5T2JqZWN0ICoKK2NpcGhlcl90b19kaWN0KGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcikKK3sKKyAgICBjb25zdCBjaGFyICpjaXBoZXJfbmFtZSwgKmNpcGhlcl9wcm90b2NvbDsKKworICAgIHVuc2lnbmVkIGxvbmcgY2lwaGVyX2lkOworICAgIGludCBhbGdfYml0cywgc3RyZW5ndGhfYml0cywgbGVuOworICAgIGNoYXIgYnVmWzUxMl0gPSB7MH07CisjaWYgT1BFTlNTTF9WRVJTSU9OXzFfMQorICAgIGludCBhZWFkLCBuaWQ7CisgICAgY29uc3QgY2hhciAqc2tjaXBoZXIgPSBOVUxMLCAqZGlnZXN0ID0gTlVMTCwgKmt4ID0gTlVMTCwgKmF1dGggPSBOVUxMOworI2VuZGlmCisgICAgUHlPYmplY3QgKnJldHZhbDsKKworICAgIHJldHZhbCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAocmV0dmFsID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBjYW4gYmUgTlVMTCAqLworICAgIGNpcGhlcl9uYW1lID0gU1NMX0NJUEhFUl9nZXRfbmFtZShjaXBoZXIpOworICAgIGNpcGhlcl9wcm90b2NvbCA9IFNTTF9DSVBIRVJfZ2V0X3ZlcnNpb24oY2lwaGVyKTsKKyAgICBjaXBoZXJfaWQgPSBTU0xfQ0lQSEVSX2dldF9pZChjaXBoZXIpOworICAgIFNTTF9DSVBIRVJfZGVzY3JpcHRpb24oY2lwaGVyLCBidWYsIHNpemVvZihidWYpIC0gMSk7CisgICAgbGVuID0gc3RybGVuKGJ1Zik7CisgICAgaWYgKGxlbiA+IDEgJiYgYnVmW2xlbi0xXSA9PSAnXG4nKQorICAgICAgICBidWZbbGVuLTFdID0gJ1wwJzsKKyAgICBzdHJlbmd0aF9iaXRzID0gU1NMX0NJUEhFUl9nZXRfYml0cyhjaXBoZXIsICZhbGdfYml0cyk7CisKKyNpZiBPUEVOU1NMX1ZFUlNJT05fMV8xCisgICAgYWVhZCA9IFNTTF9DSVBIRVJfaXNfYWVhZChjaXBoZXIpOworICAgIG5pZCA9IFNTTF9DSVBIRVJfZ2V0X2NpcGhlcl9uaWQoY2lwaGVyKTsKKyAgICBza2NpcGhlciA9IG5pZCAhPSBOSURfdW5kZWYgPyBPQkpfbmlkMmxuKG5pZCkgOiBOVUxMOworICAgIG5pZCA9IFNTTF9DSVBIRVJfZ2V0X2RpZ2VzdF9uaWQoY2lwaGVyKTsKKyAgICBkaWdlc3QgPSBuaWQgIT0gTklEX3VuZGVmID8gT0JKX25pZDJsbihuaWQpIDogTlVMTDsKKyAgICBuaWQgPSBTU0xfQ0lQSEVSX2dldF9reF9uaWQoY2lwaGVyKTsKKyAgICBreCA9IG5pZCAhPSBOSURfdW5kZWYgPyBPQkpfbmlkMmxuKG5pZCkgOiBOVUxMOworICAgIG5pZCA9IFNTTF9DSVBIRVJfZ2V0X2F1dGhfbmlkKGNpcGhlcik7CisgICAgYXV0aCA9IG5pZCAhPSBOSURfdW5kZWYgPyBPQkpfbmlkMmxuKG5pZCkgOiBOVUxMOworI2VuZGlmCisKKyAgICByZXR2YWwgPSBQeV9CdWlsZFZhbHVlKAorICAgICAgICAie3Nrc3Nzc3Nzc2lzaSIKKyNpZiBPUEVOU1NMX1ZFUlNJT05fMV8xCisgICAgICAgICJzT3Nzc3Nzc3NzIgorI2VuZGlmCisgICAgICAgICJ9IiwKKyAgICAgICAgImlkIiwgY2lwaGVyX2lkLAorICAgICAgICAibmFtZSIsIGNpcGhlcl9uYW1lLAorICAgICAgICAicHJvdG9jb2wiLCBjaXBoZXJfcHJvdG9jb2wsCisgICAgICAgICJkZXNjcmlwdGlvbiIsIGJ1ZiwKKyAgICAgICAgInN0cmVuZ3RoX2JpdHMiLCBzdHJlbmd0aF9iaXRzLAorICAgICAgICAiYWxnX2JpdHMiLCBhbGdfYml0cworI2lmIE9QRU5TU0xfVkVSU0lPTl8xXzEKKyAgICAgICAgLCJhZWFkIiwgYWVhZCA/IFB5X1RydWUgOiBQeV9GYWxzZSwKKyAgICAgICAgInN5bW1ldHJpYyIsIHNrY2lwaGVyLAorICAgICAgICAiZGlnZXN0IiwgZGlnZXN0LAorICAgICAgICAia2VhIiwga3gsCisgICAgICAgICJhdXRoIiwgYXV0aAorI2VuZGlmCisgICAgICAgKTsKKyAgICByZXR1cm4gcmV0dmFsOworCisgIGVycm9yOgorICAgIFB5X1hERUNSRUYocmV0dmFsKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCiAvKltjbGluaWMgaW5wdXRdCiBfc3NsLl9TU0xTb2NrZXQuc2hhcmVkX2NpcGhlcnMKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTI1MDYsNiArMjU3Niw1MiBAQAogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMDAyMDAwVUwKKy8qW2NsaW5pYyBpbnB1dF0KK19zc2wuX1NTTENvbnRleHQuZ2V0X2NpcGhlcnMKK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19zc2xfX1NTTENvbnRleHRfZ2V0X2NpcGhlcnNfaW1wbChQeVNTTENvbnRleHQgKnNlbGYpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTU2ZTRkNjhhNDA2ZGZjNCBpbnB1dD1hMmFhZGM5YWY4OWI3OWM1XSovCit7CisgICAgU1NMICpzc2wgPSBOVUxMOworICAgIFNUQUNLX09GKFNTTF9DSVBIRVIpICpzayA9IE5VTEw7CisgICAgU1NMX0NJUEhFUiAqY2lwaGVyOworICAgIGludCBpPTA7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEwsICpkY3Q7CisKKyAgICBzc2wgPSBTU0xfbmV3KHNlbGYtPmN0eCk7CisgICAgaWYgKHNzbCA9PSBOVUxMKSB7CisgICAgICAgIF9zZXRTU0xFcnJvcihOVUxMLCAwLCBfX0ZJTEVfXywgX19MSU5FX18pOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIHNrID0gU1NMX2dldF9jaXBoZXJzKHNzbCk7CisKKyAgICByZXN1bHQgPSBQeUxpc3RfTmV3KHNrX1NTTF9DSVBIRVJfbnVtKHNrKSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2tfU1NMX0NJUEhFUl9udW0oc2spOyBpKyspIHsKKyAgICAgICAgY2lwaGVyID0gc2tfU1NMX0NJUEhFUl92YWx1ZShzaywgaSk7CisgICAgICAgIGRjdCA9IGNpcGhlcl90b19kaWN0KGNpcGhlcik7CisgICAgICAgIGlmIChkY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfQ0xFQVIocmVzdWx0KTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmVzdWx0LCBpLCBkY3QpOworICAgIH0KKworICBleGl0OgorICAgIGlmIChzc2wgIT0gTlVMTCkKKyAgICAgICAgU1NMX2ZyZWUoc3NsKTsKKyAgICByZXR1cm4gcmVzdWx0OworCit9CisjZW5kaWYKKworCiAjaWZkZWYgT1BFTlNTTF9OUE5fTkVHT1RJQVRFRAogc3RhdGljIGludAogZG9fcHJvdG9jb2xfc2VsZWN0aW9uKGludCBhbHBuLCB1bnNpZ25lZCBjaGFyICoqb3V0LCB1bnNpZ25lZCBjaGFyICpvdXRsZW4sCkBAIC0zNjczLDYgKzM3ODksNyBAQAogICAgIF9TU0xfX1NTTENPTlRFWFRfU0VUX1NFUlZFUk5BTUVfQ0FMTEJBQ0tfTUVUSE9EREVGCiAgICAgX1NTTF9fU1NMQ09OVEVYVF9DRVJUX1NUT1JFX1NUQVRTX01FVEhPRERFRgogICAgIF9TU0xfX1NTTENPTlRFWFRfR0VUX0NBX0NFUlRTX01FVEhPRERFRgorICAgIF9TU0xfX1NTTENPTlRFWFRfR0VUX0NJUEhFUlNfTUVUSE9EREVGCiAgICAge05VTEwsIE5VTEx9ICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3RydWN0LmMgYi9Nb2R1bGVzL19zdHJ1Y3QuYwppbmRleCBmOTY1NTQxLi4wODIwOTYxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zdHJ1Y3QuYworKysgYi9Nb2R1bGVzL19zdHJ1Y3QuYwpAQCAtNjAsNiArNjAsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IGRvdWJsZSB4OyB9IHN0X2RvdWJsZTsKIHR5cGVkZWYgc3RydWN0IHsgY2hhciBjOyB2b2lkICp4OyB9IHN0X3ZvaWRfcDsKIHR5cGVkZWYgc3RydWN0IHsgY2hhciBjOyBzaXplX3QgeDsgfSBzdF9zaXplX3Q7Cit0eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgX0Jvb2wgeDsgfSBzdF9ib29sOwogCiAjZGVmaW5lIFNIT1JUX0FMSUdOIChzaXplb2Yoc3Rfc2hvcnQpIC0gc2l6ZW9mKHNob3J0KSkKICNkZWZpbmUgSU5UX0FMSUdOIChzaXplb2Yoc3RfaW50KSAtIHNpemVvZihpbnQpKQpAQCAtNjgsMjIgKzY5LDEyIEBACiAjZGVmaW5lIERPVUJMRV9BTElHTiAoc2l6ZW9mKHN0X2RvdWJsZSkgLSBzaXplb2YoZG91YmxlKSkKICNkZWZpbmUgVk9JRF9QX0FMSUdOIChzaXplb2Yoc3Rfdm9pZF9wKSAtIHNpemVvZih2b2lkICopKQogI2RlZmluZSBTSVpFX1RfQUxJR04gKHNpemVvZihzdF9zaXplX3QpIC0gc2l6ZW9mKHNpemVfdCkpCisjZGVmaW5lIEJPT0xfQUxJR04gKHNpemVvZihzdF9ib29sKSAtIHNpemVvZihfQm9vbCkpCiAKIC8qIFdlIGNhbid0IHN1cHBvcnQgcSBhbmQgUSBpbiBuYXRpdmUgbW9kZSB1bmxlc3MgdGhlIGNvbXBpbGVyIGRvZXM7CiAgICBpbiBzdGQgbW9kZSwgdGhleSdyZSA4IGJ5dGVzIG9uIGFsbCBwbGF0Zm9ybXMuICovCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLXR5cGVkZWYgc3RydWN0IHsgY2hhciBjOyBQWV9MT05HX0xPTkcgeDsgfSBzX2xvbmdfbG9uZzsKLSNkZWZpbmUgTE9OR19MT05HX0FMSUdOIChzaXplb2Yoc19sb25nX2xvbmcpIC0gc2l6ZW9mKFBZX0xPTkdfTE9ORykpCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQzk5X0JPT0wKLSNkZWZpbmUgQk9PTF9UWVBFIF9Cb29sCi10eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgX0Jvb2wgeDsgfSBzX2Jvb2w7Ci0jZGVmaW5lIEJPT0xfQUxJR04gKHNpemVvZihzX2Jvb2wpIC0gc2l6ZW9mKEJPT0xfVFlQRSkpCi0jZWxzZQotI2RlZmluZSBCT09MX1RZUEUgY2hhcgotI2RlZmluZSBCT09MX0FMSUdOIDAKLSNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IGxvbmcgbG9uZyB4OyB9IHNfbG9uZ19sb25nOworI2RlZmluZSBMT05HX0xPTkdfQUxJR04gKHNpemVvZihzX2xvbmdfbG9uZykgLSBzaXplb2YobG9uZyBsb25nKSkKIAogI2lmZGVmIF9fcG93ZXJjCiAjcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKQEAgLTE2NCwxNCArMTU1LDEyIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCiAvKiBTYW1lLCBidXQgaGFuZGxpbmcgbmF0aXZlIGxvbmcgbG9uZy4gKi8KIAogc3RhdGljIGludAotZ2V0X2xvbmdsb25nKFB5T2JqZWN0ICp2LCBQWV9MT05HX0xPTkcgKnApCitnZXRfbG9uZ2xvbmcoUHlPYmplY3QgKnYsIGxvbmcgbG9uZyAqcCkKIHsKLSAgICBQWV9MT05HX0xPTkcgeDsKKyAgICBsb25nIGxvbmcgeDsKIAogICAgIHYgPSBnZXRfcHlsb25nKHYpOwogICAgIGlmICh2ID09IE5VTEwpCkBAIC0xNzksNyArMTY4LDcgQEAKICAgICBhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKICAgICB4ID0gUHlMb25nX0FzTG9uZ0xvbmcodik7CiAgICAgUHlfREVDUkVGKHYpOwotICAgIGlmICh4ID09IChQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgIGlmICh4ID09IChsb25nIGxvbmcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgb3V0IG9mIHJhbmdlIik7CkBAIC0xOTIsOSArMTgxLDkgQEAKIC8qIFNhbWUsIGJ1dCBoYW5kbGluZyBuYXRpdmUgdW5zaWduZWQgbG9uZyBsb25nLiAqLwogCiBzdGF0aWMgaW50Ci1nZXRfdWxvbmdsb25nKFB5T2JqZWN0ICp2LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKnApCitnZXRfdWxvbmdsb25nKFB5T2JqZWN0ICp2LCB1bnNpZ25lZCBsb25nIGxvbmcgKnApCiB7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHg7CiAKICAgICB2ID0gZ2V0X3B5bG9uZyh2KTsKICAgICBpZiAodiA9PSBOVUxMKQpAQCAtMjAyLDcgKzE5MSw3IEBACiAgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CiAgICAgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodik7CiAgICAgUHlfREVDUkVGKHYpOwotICAgIGlmICh4ID09ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nIGxvbmcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgb3V0IG9mIHJhbmdlIik7CkBAIC0yMTIsOCArMjAxLDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotI2VuZGlmCi0KIC8qIFNhbWUsIGJ1dCBoYW5kbGluZyBQeV9zc2l6ZV90ICovCiAKIHN0YXRpYyBpbnQKQEAgLTI2Nyw2ICsyNTQsMzMgQEAKIC8qIEZsb2F0aW5nIHBvaW50IGhlbHBlcnMgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKK3VucGFja19oYWxmZmxvYXQoY29uc3QgY2hhciAqcCwgIC8qIHN0YXJ0IG9mIDItYnl0ZSBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICAgaW50IGxlKSAgICAgICAgIC8qIHRydWUgZm9yIGxpdHRsZS1lbmRpYW4sIGZhbHNlIGZvciBiaWctZW5kaWFuICovCit7CisgICAgZG91YmxlIHg7CisKKyAgICB4ID0gX1B5RmxvYXRfVW5wYWNrMigodW5zaWduZWQgY2hhciAqKXAsIGxlKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7Cit9CisKK3N0YXRpYyBpbnQKK3BhY2tfaGFsZmZsb2F0KGNoYXIgKnAsICAgICAgLyogc3RhcnQgb2YgMi1ieXRlIHN0cmluZyAqLworICAgICAgICAgICAgICAgUHlPYmplY3QgKnYsICAvKiB2YWx1ZSB0byBwYWNrICovCisgICAgICAgICAgICAgICBpbnQgbGUpICAgICAgIC8qIHRydWUgZm9yIGxpdHRsZS1lbmRpYW4sIGZhbHNlIGZvciBiaWctZW5kaWFuICovCit7CisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gX1B5RmxvYXRfUGFjazIoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCBsZSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCiB1bnBhY2tfZmxvYXQoY29uc3QgY2hhciAqcCwgIC8qIHN0YXJ0IG9mIDQtYnl0ZSBzdHJpbmcgKi8KICAgICAgICAgIGludCBsZSkgICAgICAgICAgICAgLyogdHJ1ZSBmb3IgbGl0dGxlLWVuZGlhbiwgZmFsc2UgZm9yIGJpZy1lbmRpYW4gKi8KIHsKQEAgLTQzNiw0MCArNDUwLDQ2IEBACiAvKiBOYXRpdmUgbW9kZSBkb2Vzbid0IHN1cHBvcnQgcSBvciBRIHVubGVzcyB0aGUgcGxhdGZvcm0gQyBzdXBwb3J0cwogICAgbG9uZyBsb25nIChvciwgb24gV2luZG93cywgX19pbnQ2NCkuICovCiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfbG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotICAgIFBZX0xPTkdfTE9ORyB4OworICAgIGxvbmcgbG9uZyB4OwogICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CiAgICAgaWYgKHggPj0gTE9OR19NSU4gJiYgeCA8PSBMT05HX01BWCkKLSAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIFBZX0xPTkdfTE9ORywgbG9uZykpOworICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgbG9uZyBsb25nLCBsb25nKSk7CiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV91bG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB4OwogICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CiAgICAgaWYgKHggPD0gTE9OR19NQVgpCi0gICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIHVuc2lnbmVkIGxvbmcgbG9uZywgbG9uZykpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoeCk7CiB9CiAKLSNlbmRpZgotCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfYm9vbChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0gICAgQk9PTF9UWVBFIHg7CisgICAgX0Jvb2wgeDsKICAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoeCAhPSAwKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgorbnVfaGFsZmZsb2F0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKyNpZiBQWV9MSVRUTEVfRU5ESUFOCisgICAgcmV0dXJuIHVucGFja19oYWxmZmxvYXQocCwgMSk7CisjZWxzZQorICAgIHJldHVybiB1bnBhY2tfaGFsZmZsb2F0KHAsIDApOworI2VuZGlmICAgIAorfQorCitzdGF0aWMgUHlPYmplY3QgKgogbnVfZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewogICAgIGZsb2F0IHg7CkBAIC02NDMsMTIgKzY2MywxMCBAQAogICAgIHJldHVybiAwOwogfQogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQogc3RhdGljIGludAogbnBfbG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLSAgICBQWV9MT05HX0xPTkcgeDsKKyAgICBsb25nIGxvbmcgeDsKICAgICBpZiAoZ2V0X2xvbmdsb25nKHYsICZ4KSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKICAgICBtZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOwpAQCAtNjU4LDIwICs2NzYsMTkgQEAKIHN0YXRpYyBpbnQKIG5wX3Vsb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB4OwogICAgIGlmIChnZXRfdWxvbmdsb25nKHYsICZ4KSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKICAgICBtZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOwogICAgIHJldHVybiAwOwogfQotI2VuZGlmCiAKIAogc3RhdGljIGludAogbnBfYm9vbChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewogICAgIGludCB5OwotICAgIEJPT0xfVFlQRSB4OworICAgIF9Cb29sIHg7CiAgICAgeSA9IFB5T2JqZWN0X0lzVHJ1ZSh2KTsKICAgICBpZiAoeSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKQEAgLTY4MSw2ICs2OTgsMTYgQEAKIH0KIAogc3RhdGljIGludAorbnBfaGFsZmZsb2F0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisjaWYgUFlfTElUVExFX0VORElBTgorICAgIHJldHVybiBwYWNrX2hhbGZmbG9hdChwLCB2LCAxKTsKKyNlbHNlCisgICAgcmV0dXJuIHBhY2tfaGFsZmZsb2F0KHAsIHYsIDApOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQKIG5wX2Zsb2F0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7CiAgICAgZmxvYXQgeCA9IChmbG9hdClQeUZsb2F0X0FzRG91YmxlKHYpOwpAQCAtNzIzLDcgKzc1MCw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBmb3JtYXRkZWYgbmF0aXZlX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3QgZm9ybWF0ZGVmIG5hdGl2ZV90YWJsZVtdID0gewogICAgIHsneCcsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgTlVMTH0sCiAgICAgeydiJywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBudV9ieXRlLCAgICAgICAgbnBfYnl0ZX0sCiAgICAgeydCJywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBudV91Ynl0ZSwgICAgICAgbnBfdWJ5dGV9LApAQCAtNzM4LDExICs3NjUsMTAgQEAKICAgICB7J0wnLCAgICAgICBzaXplb2YobG9uZyksICAgTE9OR19BTElHTiwgICAgIG51X3Vsb25nLCAgICAgICBucF91bG9uZ30sCiAgICAgeyduJywgICAgICAgc2l6ZW9mKHNpemVfdCksIFNJWkVfVF9BTElHTiwgICBudV9zc2l6ZV90LCAgICAgbnBfc3NpemVfdH0sCiAgICAgeydOJywgICAgICAgc2l6ZW9mKHNpemVfdCksIFNJWkVfVF9BTElHTiwgICBudV9zaXplX3QsICAgICAgbnBfc2l6ZV90fSwKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIHsncScsICAgICAgIHNpemVvZihQWV9MT05HX0xPTkcpLCBMT05HX0xPTkdfQUxJR04sIG51X2xvbmdsb25nLCBucF9sb25nbG9uZ30sCi0gICAgeydRJywgICAgICAgc2l6ZW9mKFBZX0xPTkdfTE9ORyksIExPTkdfTE9OR19BTElHTiwgbnVfdWxvbmdsb25nLG5wX3Vsb25nbG9uZ30sCi0jZW5kaWYKLSAgICB7Jz8nLCAgICAgICBzaXplb2YoQk9PTF9UWVBFKSwgICAgICBCT09MX0FMSUdOLCAgICAgbnVfYm9vbCwgICAgICAgIG5wX2Jvb2x9LAorICAgIHsncScsICAgICAgIHNpemVvZihsb25nIGxvbmcpLCBMT05HX0xPTkdfQUxJR04sIG51X2xvbmdsb25nLCBucF9sb25nbG9uZ30sCisgICAgeydRJywgICAgICAgc2l6ZW9mKGxvbmcgbG9uZyksIExPTkdfTE9OR19BTElHTiwgbnVfdWxvbmdsb25nLG5wX3Vsb25nbG9uZ30sCisgICAgeyc/JywgICAgICAgc2l6ZW9mKF9Cb29sKSwgICAgICBCT09MX0FMSUdOLCAgICAgbnVfYm9vbCwgICAgICAgIG5wX2Jvb2x9LAorICAgIHsnZScsICAgICAgIHNpemVvZihzaG9ydCksICBTSE9SVF9BTElHTiwgICAgbnVfaGFsZmZsb2F0LCAgIG5wX2hhbGZmbG9hdH0sCiAgICAgeydmJywgICAgICAgc2l6ZW9mKGZsb2F0KSwgIEZMT0FUX0FMSUdOLCAgICBudV9mbG9hdCwgICAgICAgbnBfZmxvYXR9LAogICAgIHsnZCcsICAgICAgIHNpemVvZihkb3VibGUpLCBET1VCTEVfQUxJR04sICAgbnVfZG91YmxlLCAgICAgIG5wX2RvdWJsZX0sCiAgICAgeydQJywgICAgICAgc2l6ZW9mKHZvaWQgKiksIFZPSURfUF9BTElHTiwgICBudV92b2lkX3AsICAgICAgbnBfdm9pZF9wfSwKQEAgLTc4Myw4ICs4MDksNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1X2xvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIFBZX0xPTkdfTE9ORyB4ID0gMDsKKyAgICBsb25nIGxvbmcgeCA9IDA7CiAgICAgUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKICAgICBkbyB7CkBAIC03OTIsMzcgKzgxNywzMCBAQAogICAgIH0gd2hpbGUgKC0taSA+IDApOwogICAgIC8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCiAgICAgaWYgKFNJWkVPRl9MT05HX0xPTkcgPiBmLT5zaXplKQotICAgICAgICB4IHw9IC0oeCAmICgoUFlfTE9OR19MT05HKTEgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworICAgICAgICB4IHw9IC0oeCAmICgobG9uZyBsb25nKTEgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOwogICAgIGlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCi0gICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIGxvbmcgbG9uZywgbG9uZykpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOwotI2Vsc2UKLSAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAxICAvKiBzaWduZWQgKi8pOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidV91bG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHggPSAwOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB4ID0gMDsKICAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwogICAgIGRvIHsKICAgICAgICAgeCA9ICh4PDw4KSB8ICpieXRlcysrOwogICAgIH0gd2hpbGUgKC0taSA+IDApOwogICAgIGlmICh4IDw9IExPTkdfTUFYKQotICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7CisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBsb25nIGxvbmcsIGxvbmcpKTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOwotI2Vsc2UKLSAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAwICAvKiBzaWduZWQgKi8pOwotI2VuZGlmCit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitidV9oYWxmZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworICAgIHJldHVybiB1bnBhY2tfaGFsZmZsb2F0KHAsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtOTIyLDYgKzk0MCwxMiBAQAogfQogCiBzdGF0aWMgaW50CiticF9oYWxmZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKyAgICByZXR1cm4gcGFja19oYWxmZmxvYXQocCwgdiwgMCk7Cit9CisKK3N0YXRpYyBpbnQKIGJwX2Zsb2F0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7CiAgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwpAQCAtOTcyLDYgKzk5Niw3IEBACiAgICAgeydxJywgICAgICAgOCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9sb25nbG9uZywgICAgYnBfbG9uZ2xvbmd9LAogICAgIHsnUScsICAgICAgIDgsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfdWxvbmdsb25nLCAgIGJwX3Vsb25nbG9uZ30sCiAgICAgeyc/JywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9ib29sLCAgICAgICAgYnBfYm9vbH0sCisgICAgeydlJywgICAgICAgMiwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9oYWxmZmxvYXQsICAgYnBfaGFsZmZsb2F0fSwKICAgICB7J2YnLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X2Zsb2F0LCAgICAgICBicF9mbG9hdH0sCiAgICAgeydkJywgICAgICAgOCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9kb3VibGUsICAgICAgYnBfZG91YmxlfSwKICAgICB7MH0KQEAgLTEwMTEsOCArMTAzNiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbHVfbG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0gICAgUFlfTE9OR19MT05HIHggPSAwOworICAgIGxvbmcgbG9uZyB4ID0gMDsKICAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwogICAgIGRvIHsKQEAgLTEwMjAsMzcgKzEwNDQsMzAgQEAKICAgICB9IHdoaWxlIChpID4gMCk7CiAgICAgLyogRXh0ZW5kIHRoZSBzaWduIGJpdC4gKi8KICAgICBpZiAoU0laRU9GX0xPTkdfTE9ORyA+IGYtPnNpemUpCi0gICAgICAgIHggfD0gLSh4ICYgKChQWV9MT05HX0xPTkcpMSA8PCAoKDggKiBmLT5zaXplKSAtIDEpKSk7CisgICAgICAgIHggfD0gLSh4ICYgKChsb25nIGxvbmcpMSA8PCAoKDggKiBmLT5zaXplKSAtIDEpKSk7CiAgICAgaWYgKHggPj0gTE9OR19NSU4gJiYgeCA8PSBMT05HX01BWCkKLSAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIFBZX0xPTkdfTE9ORywgbG9uZykpOworICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgbG9uZyBsb25nLCBsb25nKSk7CiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoeCk7Ci0jZWxzZQotICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogbGl0dGxlLWVuZGlhbiAqLwotICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIHNpZ25lZCAqLyk7Ci0jZW5kaWYKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGx1X3Vsb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeCA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHggPSAwOwogICAgIFB5X3NzaXplX3QgaSA9IGYtPnNpemU7CiAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7CiAgICAgZG8gewogICAgICAgICB4ID0gKHg8PDgpIHwgYnl0ZXNbLS1pXTsKICAgICB9IHdoaWxlIChpID4gMCk7CiAgICAgaWYgKHggPD0gTE9OR19NQVgpCi0gICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIHVuc2lnbmVkIGxvbmcgbG9uZywgbG9uZykpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoeCk7Ci0jZWxzZQotICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogbGl0dGxlLWVuZGlhbiAqLwotICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIHNpZ25lZCAqLyk7Ci0jZW5kaWYKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2x1X2hhbGZmbG9hdChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisgICAgcmV0dXJuIHVucGFja19oYWxmZmxvYXQocCwgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMTQyLDYgKzExNTksMTIgQEAKIH0KIAogc3RhdGljIGludAorbHBfaGFsZmZsb2F0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisgICAgcmV0dXJuIHBhY2tfaGFsZmZsb2F0KHAsIHYsIDEpOworfQorCitzdGF0aWMgaW50CiBscF9mbG9hdChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewogICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKQEAgLTExODIsNiArMTIwNSw3IEBACiAgICAgeydRJywgICAgICAgOCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBsdV91bG9uZ2xvbmcsICAgbHBfdWxvbmdsb25nfSwKICAgICB7Jz8nLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X2Jvb2wsICAgICAgICBicF9ib29sfSwgLyogU3RkIHJlcCBub3QgZW5kaWFuIGRlcCwKICAgICAgICAgYnV0IHBvdGVudGlhbGx5IGRpZmZlcmVudCBmcm9tIG5hdGl2ZSByZXAgLS0gcmV1c2UgYnhfYm9vbCBmdW5jcy4gKi8KKyAgICB7J2UnLCAgICAgICAyLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X2hhbGZmbG9hdCwgICBscF9oYWxmZmxvYXR9LAogICAgIHsnZicsICAgICAgIDQsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfZmxvYXQsICAgICAgIGxwX2Zsb2F0fSwKICAgICB7J2QnLCAgICAgICA4LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X2RvdWJsZSwgICAgICBscF9kb3VibGV9LAogICAgIHswfQpAQCAtMTE4OSw3ICsxMjEzLDcgQEAKIAogCiBzdGF0aWMgY29uc3QgZm9ybWF0ZGVmICoKLXdoaWNodGFibGUoY2hhciAqKnBmbXQpCit3aGljaHRhYmxlKGNvbnN0IGNoYXIgKipwZm10KQogewogICAgIGNvbnN0IGNoYXIgKmZtdCA9ICgqcGZtdCkrKzsgLyogTWF5IGJlIGJhY2tlZCBvdXQgb2YgbGF0ZXIgKi8KICAgICBzd2l0Y2ggKCpmbXQpIHsKQEAgLTEyNjgsNyArMTI5Miw3IEBACiAKICAgICBmbXQgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmLT5zX2Zvcm1hdCk7CiAKLSAgICBmID0gd2hpY2h0YWJsZSgoY2hhciAqKikmZm10KTsKKyAgICBmID0gd2hpY2h0YWJsZSgmZm10KTsKIAogICAgIHMgPSBmbXQ7CiAgICAgc2l6ZSA9IDA7CkBAIC0xNDU2LDcgKzE0ODAsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotc191bnBhY2tfaW50ZXJuYWwoUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiwgY2hhciAqc3RhcnRmcm9tKSB7CitzX3VucGFja19pbnRlcm5hbChQeVN0cnVjdE9iamVjdCAqc29zZWxmLCBjb25zdCBjaGFyICpzdGFydGZyb20pIHsKICAgICBmb3JtYXRjb2RlICpjb2RlOwogICAgIFB5X3NzaXplX3QgaSA9IDA7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5VHVwbGVfTmV3KHNvc2VsZi0+c19sZW4pOwpAQCAtMjIzOSw3ICsyMjYzLDcgQEAKICAgeDogcGFkIGJ5dGUgKG5vIGRhdGEpOyBjOmNoYXI7IGI6c2lnbmVkIGJ5dGU7IEI6dW5zaWduZWQgYnl0ZTtcblwKICAgPzogX0Jvb2wgKHJlcXVpcmVzIEM5OTsgaWYgbm90IGF2YWlsYWJsZSwgY2hhciBpcyB1c2VkIGluc3RlYWQpXG5cCiAgIGg6c2hvcnQ7IEg6dW5zaWduZWQgc2hvcnQ7IGk6aW50OyBJOnVuc2lnbmVkIGludDtcblwKLSAgbDpsb25nOyBMOnVuc2lnbmVkIGxvbmc7IGY6ZmxvYXQ7IGQ6ZG91YmxlLlxuXAorICBsOmxvbmc7IEw6dW5zaWduZWQgbG9uZzsgZjpmbG9hdDsgZDpkb3VibGU7IGU6aGFsZi1mbG9hdC5cblwKIFNwZWNpYWwgY2FzZXMgKHByZWNlZGluZyBkZWNpbWFsIGNvdW50IGluZGljYXRlcyBsZW5ndGgpOlxuXAogICBzOnN0cmluZyAoYXJyYXkgb2YgY2hhcik7IHA6IHBhc2NhbCBzdHJpbmcgKHdpdGggY291bnQgYnl0ZSkuXG5cCiBTcGVjaWFsIGNhc2VzIChvbmx5IGF2YWlsYWJsZSBpbiBuYXRpdmUgZm9ybWF0KTpcblwKQEAgLTIyNzksNyArMjMwMyw3IEBACiAKICAgICAvKiBDaGVjayBlbmRpYW4gYW5kIHN3YXAgaW4gZmFzdGVyIGZ1bmN0aW9ucyAqLwogICAgIHsKLSAgICAgICAgZm9ybWF0ZGVmICpuYXRpdmUgPSBuYXRpdmVfdGFibGU7CisgICAgICAgIGNvbnN0IGZvcm1hdGRlZiAqbmF0aXZlID0gbmF0aXZlX3RhYmxlOwogICAgICAgICBmb3JtYXRkZWYgKm90aGVyLCAqcHRyOwogI2lmIFBZX0xJVFRMRV9FTkRJQU4KICAgICAgICAgb3RoZXIgPSBsaWxlbmRpYW5fdGFibGU7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL190ZXN0YnVmZmVyLmMgYi9Nb2R1bGVzL190ZXN0YnVmZmVyLmMKaW5kZXggNDNkYjhhOC4uMTNkM2NjYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGVzdGJ1ZmZlci5jCisrKyBiL01vZHVsZXMvX3Rlc3RidWZmZXIuYwpAQCAtMTMsNyArMTMsNyBAQAogUHlPYmplY3QgKmNhbGNzaXplID0gTlVMTDsKIAogLyogY2FjaGUgc2ltcGxlIGZvcm1hdCBzdHJpbmcgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpzaW1wbGVfZm10ID0gIkIiOworc3RhdGljIGNvbnN0IGNoYXIgc2ltcGxlX2ZtdFtdID0gIkIiOwogUHlPYmplY3QgKnNpbXBsZV9mb3JtYXQgPSBOVUxMOwogI2RlZmluZSBTSU1QTEVfRk9STUFUKGZtdCkgKGZtdCA9PSBOVUxMIHx8IHN0cmNtcChmbXQsICJCIikgPT0gMCkKICNkZWZpbmUgRklYX0ZPUk1BVChmbXQpIChmbXQgPT0gTlVMTCA/ICJCIiA6IGZtdCkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCmluZGV4IDgxZjViMWQuLmI1YjhmMWEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwpAQCAtNjAsOSArNjAsNyBAQAogICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfTE9ORywgbG9uZyk7CiAgICAgQ0hFQ0tfU0laRU9GKFNJWkVPRl9WT0lEX1AsIHZvaWQqKTsKICAgICBDSEVDS19TSVpFT0YoU0laRU9GX1RJTUVfVCwgdGltZV90KTsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfTE9OR19MT05HLCBQWV9MT05HX0xPTkcpOwotI2VuZGlmCisgICAgQ0hFQ0tfU0laRU9GKFNJWkVPRl9MT05HX0xPTkcsIGxvbmcgbG9uZyk7CiAKICN1bmRlZiBDSEVDS19TSVpFT0YKIApAQCAtMTAwLDIyICs5OCwxNCBAQAogICAgIENIRUNLX1NJR05ORVNTKFB5X1VDUzEsIDApOwogICAgIENIRUNLX1NJR05ORVNTKFB5X1VDUzIsIDApOwogICAgIENIRUNLX1NJR05ORVNTKFB5X1VDUzQsIDApOwotI2lmZGVmIEhBVkVfSU5UMzJfVAotICAgIENIRUNLX1NJWkVPRihQWV9JTlQzMl9ULCA0KTsKLSAgICBDSEVDS19TSUdOTkVTUyhQWV9JTlQzMl9ULCAxKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfVUlOVDMyX1QKLSAgICBDSEVDS19TSVpFT0YoUFlfVUlOVDMyX1QsIDQpOwotICAgIENIRUNLX1NJR05ORVNTKFBZX1VJTlQzMl9ULCAwKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfSU5UNjRfVAotICAgIENIRUNLX1NJWkVPRihQWV9JTlQ2NF9ULCA4KTsKLSAgICBDSEVDS19TSUdOTkVTUyhQWV9JTlQ2NF9ULCAxKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfVUlOVDY0X1QKLSAgICBDSEVDS19TSVpFT0YoUFlfVUlOVDY0X1QsIDgpOwotICAgIENIRUNLX1NJR05ORVNTKFBZX1VJTlQ2NF9ULCAwKTsKLSNlbmRpZgorICAgIENIRUNLX1NJWkVPRihpbnQzMl90LCA0KTsKKyAgICBDSEVDS19TSUdOTkVTUyhpbnQzMl90LCAxKTsKKyAgICBDSEVDS19TSVpFT0YodWludDMyX3QsIDQpOworICAgIENIRUNLX1NJR05ORVNTKHVpbnQzMl90LCAwKTsKKyAgICBDSEVDS19TSVpFT0YoaW50NjRfdCwgOCk7CisgICAgQ0hFQ0tfU0lHTk5FU1MoaW50NjRfdCwgMSk7CisgICAgQ0hFQ0tfU0laRU9GKHVpbnQ2NF90LCA4KTsKKyAgICBDSEVDS19TSUdOTkVTUyh1aW50NjRfdCwgMCk7CiAKICAgICAvKiBwb2ludGVyL3NpemUgdHlwZXMgKi8KICAgICBDSEVDS19TSVpFT0Yoc2l6ZV90LCBzaXplb2Yodm9pZCAqKSk7CkBAIC0xMjMsMTAgKzExMywxMCBAQAogICAgIENIRUNLX1NJWkVPRihQeV9zc2l6ZV90LCBzaXplb2Yodm9pZCAqKSk7CiAgICAgQ0hFQ0tfU0lHTk5FU1MoUHlfc3NpemVfdCwgMSk7CiAKLSAgICBDSEVDS19TSVpFT0YoUHlfdWludHB0cl90LCBzaXplb2Yodm9pZCAqKSk7Ci0gICAgQ0hFQ0tfU0lHTk5FU1MoUHlfdWludHB0cl90LCAwKTsKLSAgICBDSEVDS19TSVpFT0YoUHlfaW50cHRyX3QsIHNpemVvZih2b2lkICopKTsKLSAgICBDSEVDS19TSUdOTkVTUyhQeV9pbnRwdHJfdCwgMSk7CisgICAgQ0hFQ0tfU0laRU9GKHVpbnRwdHJfdCwgc2l6ZW9mKHZvaWQgKikpOworICAgIENIRUNLX1NJR05ORVNTKHVpbnRwdHJfdCwgMCk7CisgICAgQ0hFQ0tfU0laRU9GKGludHB0cl90LCBzaXplb2Yodm9pZCAqKSk7CisgICAgQ0hFQ0tfU0lHTk5FU1MoaW50cHRyX3QsIDEpOwogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwpAQCAtMzU3LDEyICszNDcsMTIgQEAKIH0KIAogCi0vKiBUZXN0cyBvZiBQeUxvbmdfe0FzLCBGcm9tfXtVbnNpZ25lZCx9TG9uZygpLCBhbmQgKCNpZmRlZiBIQVZFX0xPTkdfTE9ORykKKy8qIFRlc3RzIG9mIFB5TG9uZ197QXMsIEZyb219e1Vuc2lnbmVkLH1Mb25nKCksIGFuZAogICAgUHlMb25nX3tBcywgRnJvbX17VW5zaWduZWQsfUxvbmdMb25nKCkuCiAKICAgIE5vdGUgdGhhdCB0aGUgbWVhdCBvZiB0aGUgdGVzdCBpcyBjb250YWluZWQgaW4gdGVzdGNhcGlfbG9uZy5oLgogICAgVGhpcyBpcyByZXZvbHRpbmcsIGJ1dCBkZWxpY2F0ZSBjb2RlIGR1cGxpY2F0aW9uIGlzIHdvcnNlOiAgImFsbW9zdAotICAgZXhhY3RseSB0aGUgc2FtZSIgY29kZSBpcyBuZWVkZWQgdG8gdGVzdCBQWV9MT05HX0xPTkcsIGJ1dCB0aGUgdWJpcXVpdG91cworICAgZXhhY3RseSB0aGUgc2FtZSIgY29kZSBpcyBuZWVkZWQgdG8gdGVzdCBsb25nIGxvbmcsIGJ1dCB0aGUgdWJpcXVpdG91cwogICAgZGVwZW5kZW5jZSBvbiB0eXBlIG5hbWVzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gdXNlIGEgcGFyYW1ldGVyaXplZAogICAgZnVuY3Rpb24uICBBIGdpYW50IG1hY3JvIHdvdWxkIGJlIGV2ZW4gd29yc2UgdGhhbiB0aGlzLiAgQSBDKysgdGVtcGxhdGUKICAgIHdvdWxkIGJlIHBlcmZlY3QuCkBAIC00MDIsOCArMzkyLDYgQEAKICN1bmRlZiBGX1VfVE9fUFkKICN1bmRlZiBGX1BZX1RPX1UKIAotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0KIHN0YXRpYyBQeU9iamVjdCAqCiByYWlzZV90ZXN0X2xvbmdsb25nX2Vycm9yKGNvbnN0IGNoYXIqIG1zZykKIHsKQEAgLTQxMSw3ICszOTksNyBAQAogfQogCiAjZGVmaW5lIFRFU1ROQU1FICAgICAgICB0ZXN0X2xvbmdsb25nX2FwaV9pbm5lcgotI2RlZmluZSBUWVBFTkFNRSAgICAgICAgUFlfTE9OR19MT05HCisjZGVmaW5lIFRZUEVOQU1FICAgICAgICBsb25nIGxvbmcKICNkZWZpbmUgRl9TX1RPX1BZICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcKICNkZWZpbmUgRl9QWV9UT19TICAgICAgIFB5TG9uZ19Bc0xvbmdMb25nCiAjZGVmaW5lIEZfVV9UT19QWSAgICAgICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcKQEAgLTU5OCw3ICs1ODYsNyBAQAogfQogCiAvKiBUZXN0IHRoZSBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93IEFQSS4gR2VuZXJhbCBjb252ZXJzaW9uIHRvCi0gICBQWV9MT05HX0xPTkcgaXMgdGVzdGVkIGJ5IHRlc3RfbG9uZ19hcGlfaW5uZXIuIFRoaXMgdGVzdCB3aWxsCisgICBsb25nIGxvbmcgaXMgdGVzdGVkIGJ5IHRlc3RfbG9uZ19hcGlfaW5uZXIuIFRoaXMgdGVzdCB3aWxsCiAgICBjb25jZW50cmF0ZSBvbiBwcm9wZXIgaGFuZGxpbmcgb2Ygb3ZlcmZsb3cuCiAqLwogCkBAIC02MDYsNyArNTk0LDcgQEAKIHRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyhQeU9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqbnVtLCAqb25lLCAqdGVtcDsKLSAgICBQWV9MT05HX0xPTkcgdmFsdWU7CisgICAgbG9uZyBsb25nIHZhbHVlOwogICAgIGludCBvdmVyZmxvdzsKIAogICAgIC8qIFRlc3QgdGhhdCBvdmVyZmxvdyBpcyBzZXQgcHJvcGVybHkgZm9yIGEgbGFyZ2UgdmFsdWUuICovCkBAIC04MjQsNyArODEyLDcgQEAKICAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAotLyogVGVzdCB0aGUgTCBjb2RlIGZvciBQeUFyZ19QYXJzZVR1cGxlLiAgVGhpcyBzaG91bGQgZGVsaXZlciBhIFBZX0xPTkdfTE9ORworLyogVGVzdCB0aGUgTCBjb2RlIGZvciBQeUFyZ19QYXJzZVR1cGxlLiAgVGhpcyBzaG91bGQgZGVsaXZlciBhIGxvbmcgbG9uZwogICAgZm9yIGJvdGggbG9uZyBhbmQgaW50IGFyZ3VtZW50cy4gIFRoZSB0ZXN0IG1heSBsZWFrIGEgbGl0dGxlIG1lbW9yeSBpZgogICAgaXQgZmFpbHMuCiAqLwpAQCAtODMyLDcgKzgyMCw3IEBACiB0ZXN0X0xfY29kZShQeU9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqdHVwbGUsICpudW07Ci0gICAgUFlfTE9OR19MT05HIHZhbHVlOworICAgIGxvbmcgbG9uZyB2YWx1ZTsKIAogICAgIHR1cGxlID0gUHlUdXBsZV9OZXcoMSk7CiAgICAgaWYgKHR1cGxlID09IE5VTEwpCkBAIC04NzAsOCArODU4LDYgQEAKICAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAotI2VuZGlmICAvKiBpZmRlZiBIQVZFX0xPTkdfTE9ORyAqLwotCiBzdGF0aWMgUHlPYmplY3QgKgogcmV0dXJuX25vbmUodm9pZCAqdW51c2VkKQogewpAQCAtMTAwMSw3ICs5ODcsNyBAQAogZ2V0YXJnc19rZXl3b3JkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImFyZzEiLCJhcmcyIiwiYXJnMyIsImFyZzQiLCJhcmc1IiwgTlVMTH07Ci0gICAgc3RhdGljIGNoYXIgKmZtdD0iKGlpKWl8KGkoaWkpKShpaWkpaSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAiKGlpKWl8KGkoaWkpKShpaWkpaSI7CiAgICAgaW50IGludF9hcmdzWzEwXT17LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCBmbXQsIGtleXdvcmRzLApAQCAtMTAyOCw2ICsxMDE0LDIxIEBACiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIHJlcXVpcmVkLCBvcHRpb25hbCwga2V5d29yZF9vbmx5KTsKIH0KIAorLyogdGVzdCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMgcG9zaXRpb25hbC1vbmx5IGFyZ3VtZW50cyAqLworc3RhdGljIFB5T2JqZWN0ICoKK2dldGFyZ3NfcG9zaXRpb25hbF9vbmx5X2FuZF9rZXl3b3JkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7IiIsICIiLCAia2V5d29yZCIsIE5VTEx9OworICAgIGludCByZXF1aXJlZCA9IC0xOworICAgIGludCBvcHRpb25hbCA9IC0xOworICAgIGludCBrZXl3b3JkID0gLTE7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpfGlpIiwga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcXVpcmVkLCAmb3B0aW9uYWwsICZrZXl3b3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIHJlcXVpcmVkLCBvcHRpb25hbCwga2V5d29yZCk7Cit9CisKIC8qIEZ1bmN0aW9ucyB0byBjYWxsIFB5QXJnX1BhcnNlVHVwbGUgd2l0aCBpbnRlZ2VyIGZvcm1hdCBjb2RlcywKICAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KICovCkBAIC0xMTIxLDExICsxMTIyLDEwIEBACiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7CiB9CiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfTChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUFlfTE9OR19MT05HIHZhbHVlOworICAgIGxvbmcgbG9uZyB2YWx1ZTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkwiLCAmdmFsdWUpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CkBAIC0xMTM0LDEyICsxMTM0LDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJnc19LKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsdWU7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlOwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSyIsICZ2YWx1ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOwogfQotI2VuZGlmCiAKIC8qIFRoaXMgZnVuY3Rpb24gbm90IG9ubHkgdGVzdHMgdGhlICdrJyBnZXRhcmdzIGNvZGUsIGJ1dCBhbHNvIHRoZQogICAgUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaygpIGFuZCBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKCkgZnVuY3Rpb25zLiAqLwpAQCAtMTE2MSw3ICsxMTYwLDcgQEAKICAgICB2YWx1ZSA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2sobnVtKTsKICAgICBpZiAodmFsdWUgIT0gVUxPTkdfTUFYKQogICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfa19jb2RlIiwKLSAgICAgICAgIlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soKSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOworICAgICAgICAgICAgIlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soKSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOwogCiAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKIApAQCAtMTE4MCw3ICsxMTc5LDcgQEAKICAgICB2YWx1ZSA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2sobnVtKTsKICAgICBpZiAodmFsdWUgIT0gKHVuc2lnbmVkIGxvbmcpLTB4NDIpCiAgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9rX2NvZGUiLAotICAgICAgICAiUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaygpIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CisgICAgICAgICAgICAiUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaygpIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CiAKICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOwogCkBAIC0yMTMwLDcgKzIxMjksNyBAQAogICAgIFB5T2JqZWN0ICpyYzsKICAgICBpbnQgc3VjY2VzczsKICAgICBQeUdJTFN0YXRlX1NUQVRFIHMgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwotICAgIHJjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKWNhbGxhYmxlLCAiIik7CisgICAgcmMgPSBfUHlPYmplY3RfQ2FsbE5vQXJnKChQeU9iamVjdCAqKWNhbGxhYmxlKTsKICAgICBzdWNjZXNzID0gKHJjICE9IE5VTEwpOwogICAgIFB5X1hERUNSRUYocmMpOwogICAgIFB5R0lMU3RhdGVfUmVsZWFzZShzKTsKQEAgLTIyNjQsMTAgKzIyNjMsOCBAQAogICAgIENIRUNLXzFfRk9STUFUKCIlenUiLCBzaXplX3QpOwogCiAgICAgLyogIiVsbGQiIGFuZCAiJWxsdSIgc3VwcG9ydCBhZGRlZCBpbiBQeXRob24gMi43LiAqLwotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0gICAgQ0hFQ0tfMV9GT1JNQVQoIiVsbHUiLCB1bnNpZ25lZCBQWV9MT05HX0xPTkcpOwotICAgIENIRUNLXzFfRk9STUFUKCIlbGxkIiwgUFlfTE9OR19MT05HKTsKLSNlbmRpZgorICAgIENIRUNLXzFfRk9STUFUKCIlbGx1IiwgdW5zaWduZWQgbG9uZyBsb25nKTsKKyAgICBDSEVDS18xX0ZPUk1BVCgiJWxsZCIsIGxvbmcgbG9uZyk7CiAKICAgICBQeV9SRVRVUk5fTk9ORTsKIApAQCAtMjMxMiw3ICsyMzA5LDcgQEAKICAgICByZXN1bHQgPSBQeU9TX3N0cmluZ190b19kb3VibGUoU1RSLCBOVUxMLCBOVUxMKTsgICAgICAgICAgICBcCiAgICAgaWYgKHJlc3VsdCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocmVzdWx0ICE9IGV4cGVjdGVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJlc3VsdCAhPSAoZG91YmxlKWV4cGVjdGVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBtc2cgPSAiY29udmVyc2lvbiBvZiAiIFNUUiAiIHRvIGZsb2F0IGZhaWxlZCI7ICAgICAgICAgIFwKICAgICAgICAgZ290byBmYWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQpAQCAtMjkwNCw3ICsyOTAxLDkgQEAKIHN0YXRpYyBpbnQKIGNoZWNrX3RpbWVfcm91bmRpbmcoaW50IHJvdW5kKQogewotICAgIGlmIChyb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0ZMT09SICYmIHJvdW5kICE9IF9QeVRpbWVfUk9VTkRfQ0VJTElORykgeworICAgIGlmIChyb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0ZMT09SCisgICAgICAgICYmIHJvdW5kICE9IF9QeVRpbWVfUk9VTkRfQ0VJTElORworICAgICAgICAmJiByb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTikgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgcm91bmRpbmciKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTMzOTksNyArMzM5OCw3IEBACiAgICAgLyogQWxsb2NhdGUgYSBQeXRob24gdGhyZWFkIHN0YXRlIGZvciB0aGlzIHRocmVhZCAqLwogICAgIHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKIAotICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbih0ZXN0X2NfdGhyZWFkLT5jYWxsYmFjaywgIiIsIE5VTEwpOworICAgIHJlcyA9IF9QeU9iamVjdF9DYWxsTm9BcmcodGVzdF9jX3RocmVhZC0+Y2FsbGJhY2spOwogICAgIFB5X0NMRUFSKHRlc3RfY190aHJlYWQtPmNhbGxiYWNrKTsKIAogICAgIGlmIChyZXMgPT0gTlVMTCkgewpAQCAtMzY4OSw3ICszNjg4LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X3B5dGltZV9hc3NlY29uZHNkb3VibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFBZX0xPTkdfTE9ORyBuczsKKyAgICBsb25nIGxvbmcgbnM7CiAgICAgX1B5VGltZV90IHRzOwogICAgIGRvdWJsZSBkOwogCkBAIC0zNzAzLDcgKzM3MDIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfUHlUaW1lX0FzVGltZXZhbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUFlfTE9OR19MT05HIG5zOworICAgIGxvbmcgbG9uZyBuczsKICAgICBpbnQgcm91bmQ7CiAgICAgX1B5VGltZV90IHQ7CiAgICAgc3RydWN0IHRpbWV2YWwgdHY7CkBAIC0zNzE3LDcgKzM3MTYsNyBAQAogICAgIGlmIChfUHlUaW1lX0FzVGltZXZhbCh0LCAmdHYsIHJvdW5kKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgc2Vjb25kcyA9IFB5TG9uZ19Gcm9tTG9uZygoUFlfTE9OR19MT05HKXR2LnR2X3NlYyk7CisgICAgc2Vjb25kcyA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZyBsb25nKXR2LnR2X3NlYyk7CiAgICAgaWYgKHNlY29uZHMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk5sIiwgc2Vjb25kcywgdHYudHZfdXNlYyk7CkBAIC0zNzI3LDcgKzM3MjYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfUHlUaW1lX0FzVGltZXNwZWMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFBZX0xPTkdfTE9ORyBuczsKKyAgICBsb25nIGxvbmcgbnM7CiAgICAgX1B5VGltZV90IHQ7CiAgICAgc3RydWN0IHRpbWVzcGVjIHRzOwogCkBAIC0zNzQzLDcgKzM3NDIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfUHlUaW1lX0FzTWlsbGlzZWNvbmRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQWV9MT05HX0xPTkcgbnM7CisgICAgbG9uZyBsb25nIG5zOwogICAgIGludCByb3VuZDsKICAgICBfUHlUaW1lX3QgdCwgbXM7CiAKQEAgLTM3NjEsNyArMzc2MCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9QeVRpbWVfQXNNaWNyb3NlY29uZHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFBZX0xPTkdfTE9ORyBuczsKKyAgICBsb25nIGxvbmcgbnM7CiAgICAgaW50IHJvdW5kOwogICAgIF9QeVRpbWVfdCB0LCBtczsKIApAQCAtMzc4NSw2ICszNzg0LDE1MiBAQAogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcodHN0YXRlLT5yZWN1cnNpb25fZGVwdGggLSAxKTsKIH0KIAorc3RhdGljIFB5T2JqZWN0KgorcHltZW1fYnVmZmVyX292ZXJmbG93KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICpidWZmZXI7CisKKyAgICAvKiBEZWxpYmVyYXRlIGJ1ZmZlciBvdmVyZmxvdyB0byBjaGVjayB0aGF0IFB5TWVtX0ZyZWUoKSBkZXRlY3RzCisgICAgICAgdGhlIG92ZXJmbG93IHdoZW4gZGVidWcgaG9va3MgYXJlIGluc3RhbGxlZC4gKi8KKyAgICBidWZmZXIgPSBQeU1lbV9NYWxsb2MoMTYpOworICAgIGJ1ZmZlclsxNl0gPSAneCc7CisgICAgUHlNZW1fRnJlZShidWZmZXIpOworCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK3B5bWVtX2FwaV9taXN1c2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmJ1ZmZlcjsKKworICAgIC8qIERlbGliZXJhdGUgbWlzdXNhZ2Ugb2YgUHl0aG9uIGFsbG9jYXRvcnM6CisgICAgICAgYWxsb2NvY2F0ZSB3aXRoIFB5TWVtIGJ1dCByZWxlYXNlIHdpdGggUHlNZW1fUmF3LiAqLworICAgIGJ1ZmZlciA9IFB5TWVtX01hbGxvYygxNik7CisgICAgUHlNZW1fUmF3RnJlZShidWZmZXIpOworCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK3B5bWVtX21hbGxvY193aXRob3V0X2dpbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqYnVmZmVyOworCisgICAgLyogRGVsaWJlcmF0ZSBidWcgdG8gdGVzdCBkZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnM6CisgICAgICAgY2FsbCBQeU1lbV9NYWxsb2MoKSB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTCAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBidWZmZXIgPSBQeU1lbV9NYWxsb2MoMTApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICBQeU1lbV9GcmVlKGJ1ZmZlcik7CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KgorcHlvYmplY3RfbWFsbG9jX3dpdGhvdXRfZ2lsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICpidWZmZXI7CisKKyAgICAvKiBEZWxpYmVyYXRlIGJ1ZyB0byB0ZXN0IGRlYnVnIGhvb2tzIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yczoKKyAgICAgICBjYWxsIFB5T2JqZWN0X01hbGxvYygpIHdpdGhvdXQgaG9sZGluZyB0aGUgR0lMICovCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGJ1ZmZlciA9IFB5T2JqZWN0X01hbGxvYygxMCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIFB5T2JqZWN0X0ZyZWUoYnVmZmVyKTsKKworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QgKgordHJhY2VtYWxsb2NfdHJhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIHVuc2lnbmVkIGludCBkb21haW47CisgICAgUHlPYmplY3QgKnB0cl9vYmo7CisgICAgdm9pZCAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpbnQgcmVsZWFzZV9naWwgPSAwOworICAgIGludCByZXM7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIklPbnxpIiwgJmRvbWFpbiwgJnB0cl9vYmosICZzaXplLCAmcmVsZWFzZV9naWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSBQeUxvbmdfQXNWb2lkUHRyKHB0cl9vYmopOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChyZWxlYXNlX2dpbCkgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJlcyA9IF9QeVRyYWNlTWFsbG9jX1RyYWNrKGRvbWFpbiwgKHVpbnRwdHJfdClwdHIsIHNpemUpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVzID0gX1B5VHJhY2VNYWxsb2NfVHJhY2soZG9tYWluLCAodWludHB0cl90KXB0ciwgc2l6ZSk7CisgICAgfQorCisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIl9QeVRyYWNlTWFsbG9jX1RyYWNrIGVycm9yIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QgKgordHJhY2VtYWxsb2NfdW50cmFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgdW5zaWduZWQgaW50IGRvbWFpbjsKKyAgICBQeU9iamVjdCAqcHRyX29iajsKKyAgICB2b2lkICpwdHI7CisgICAgaW50IHJlczsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSU8iLCAmZG9tYWluLCAmcHRyX29iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHB0ciA9IFB5TG9uZ19Bc1ZvaWRQdHIocHRyX29iaik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmVzID0gX1B5VHJhY2VNYWxsb2NfVW50cmFjayhkb21haW4sICh1aW50cHRyX3QpcHRyKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiX1B5VHJhY2VNYWxsb2NfVHJhY2sgZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCit0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICB1bnNpZ25lZCBpbnQgZG9tYWluOworICAgIFB5T2JqZWN0ICpwdHJfb2JqOworICAgIHZvaWQgKnB0cjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSU8iLCAmZG9tYWluLCAmcHRyX29iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHB0ciA9IFB5TG9uZ19Bc1ZvaWRQdHIocHRyX29iaik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIF9QeVRyYWNlTWFsbG9jX0dldFRyYWNlYmFjayhkb21haW4sICh1aW50cHRyX3QpcHRyKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2RpY3RfZ2V0X3ZlcnNpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5RGljdE9iamVjdCAqZGljdDsKKyAgICB1aW50NjRfdCB2ZXJzaW9uOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHZlcnNpb24gPSBkaWN0LT5tYV92ZXJzaW9uX3RhZzsKKworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YodW5zaWduZWQgUFlfTE9OR19MT05HKSA+PSBzaXplb2YodmVyc2lvbikpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyl2ZXJzaW9uKTsKK30KKwogCiBzdGF0aWMgUHlNZXRob2REZWYgVGVzdE1ldGhvZHNbXSA9IHsKICAgICB7InJhaXNlX2V4Y2VwdGlvbiIsICAgICAgICAgcmFpc2VfZXhjZXB0aW9uLCAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKQEAgLTM4MzAsNiArMzk3NSw5IEBACiAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCiAgICAgeyJnZXRhcmdzX2tleXdvcmRfb25seSIsIChQeUNGdW5jdGlvbilnZXRhcmdzX2tleXdvcmRfb25seSwKICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKKyAgICB7ImdldGFyZ3NfcG9zaXRpb25hbF9vbmx5X2FuZF9rZXl3b3JkcyIsCisgICAgICAoUHlDRnVuY3Rpb24pZ2V0YXJnc19wb3NpdGlvbmFsX29ubHlfYW5kX2tleXdvcmRzLAorICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAogICAgIHsiZ2V0YXJnc19iIiwgICAgICAgICAgICAgICBnZXRhcmdzX2IsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0YXJnc19CIiwgICAgICAgICAgICAgICBnZXRhcmdzX0IsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0YXJnc19oIiwgICAgICAgICAgICAgICBnZXRhcmdzX2gsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LApAQCAtMzg0MCwxNCArMzk4OCwxMiBAQAogICAgIHsiZ2V0YXJnc19sIiwgICAgICAgICAgICAgICBnZXRhcmdzX2wsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0YXJnc19uIiwgICAgICAgICAgICAgICBnZXRhcmdzX24sICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0YXJnc19wIiwgICAgICAgICAgICAgICBnZXRhcmdzX3AsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgeyJnZXRhcmdzX0wiLCAgICAgICAgICAgICAgIGdldGFyZ3NfTCwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJnZXRhcmdzX0siLCAgICAgICAgICAgICAgIGdldGFyZ3NfSywgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJ0ZXN0X2xvbmdsb25nX2FwaSIsICAgICAgIHRlc3RfbG9uZ2xvbmdfYXBpLCAgICAgICAgICAgICAgIE1FVEhfTk9BUkdTfSwKICAgICB7InRlc3RfbG9uZ19sb25nX2FuZF9vdmVyZmxvdyIsCiAgICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3csIE1FVEhfTk9BUkdTfSwKICAgICB7InRlc3RfTF9jb2RlIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlc3RfTF9jb2RlLCAgICAgICAgTUVUSF9OT0FSR1N9LAotI2VuZGlmCiAgICAgeyJnZXRhcmdzX2YiLCAgICAgICAgICAgICAgIGdldGFyZ3NfZiwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJnZXRhcmdzX2QiLCAgICAgICAgICAgICAgIGdldGFyZ3NfZCwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJnZXRhcmdzX0QiLCAgICAgICAgICAgICAgIGdldGFyZ3NfRCwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCkBAIC0zOTc2LDYgKzQxMjIsMTQgQEAKICAgICB7IlB5VGltZV9Bc01pbGxpc2Vjb25kcyIsIHRlc3RfUHlUaW1lX0FzTWlsbGlzZWNvbmRzLCBNRVRIX1ZBUkFSR1N9LAogICAgIHsiUHlUaW1lX0FzTWljcm9zZWNvbmRzIiwgdGVzdF9QeVRpbWVfQXNNaWNyb3NlY29uZHMsIE1FVEhfVkFSQVJHU30sCiAgICAgeyJnZXRfcmVjdXJzaW9uX2RlcHRoIiwgZ2V0X3JlY3Vyc2lvbl9kZXB0aCwgTUVUSF9OT0FSR1N9LAorICAgIHsicHltZW1fYnVmZmVyX292ZXJmbG93IiwgcHltZW1fYnVmZmVyX292ZXJmbG93LCBNRVRIX05PQVJHU30sCisgICAgeyJweW1lbV9hcGlfbWlzdXNlIiwgcHltZW1fYXBpX21pc3VzZSwgTUVUSF9OT0FSR1N9LAorICAgIHsicHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsIiwgcHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsLCBNRVRIX05PQVJHU30sCisgICAgeyJweW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwiLCBweW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwsIE1FVEhfTk9BUkdTfSwKKyAgICB7InRyYWNlbWFsbG9jX3RyYWNrIiwgdHJhY2VtYWxsb2NfdHJhY2ssIE1FVEhfVkFSQVJHU30sCisgICAgeyJ0cmFjZW1hbGxvY191bnRyYWNrIiwgdHJhY2VtYWxsb2NfdW50cmFjaywgTUVUSF9WQVJBUkdTfSwKKyAgICB7InRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2siLCB0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZGljdF9nZXRfdmVyc2lvbiIsIGRpY3RfZ2V0X3ZlcnNpb24sIE1FVEhfVkFSQVJHU30sCiAgICAge05VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCiB9OwogCkBAIC0zOTk1LDEwICs0MTQ5LDggQEAKICAgICBmbG9hdCBmbG9hdF9tZW1iZXI7CiAgICAgZG91YmxlIGRvdWJsZV9tZW1iZXI7CiAgICAgY2hhciBpbnBsYWNlX21lbWJlcls2XTsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIFBZX0xPTkdfTE9ORyBsb25nbG9uZ19tZW1iZXI7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHVsb25nbG9uZ19tZW1iZXI7Ci0jZW5kaWYKKyAgICBsb25nIGxvbmcgbG9uZ2xvbmdfbWVtYmVyOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1bG9uZ2xvbmdfbWVtYmVyOwogfSBhbGxfc3RydWN0bWVtYmVyczsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtNDAyMCwxMCArNDE3Miw4IEBACiAgICAgeyJUX0ZMT0FUIiwgVF9GTE9BVCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmZsb2F0X21lbWJlciksIDAsIE5VTEx9LAogICAgIHsiVF9ET1VCTEUiLCBUX0RPVUJMRSwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmRvdWJsZV9tZW1iZXIpLCAwLCBOVUxMfSwKICAgICB7IlRfU1RSSU5HX0lOUExBQ0UiLCBUX1NUUklOR19JTlBMQUNFLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuaW5wbGFjZV9tZW1iZXIpLCAwLCBOVUxMfSwKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgIHsiVF9MT05HTE9ORyIsIFRfTE9OR0xPTkcsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5sb25nbG9uZ19tZW1iZXIpLCAwLCBOVUxMfSwKICAgICB7IlRfVUxPTkdMT05HIiwgVF9VTE9OR0xPTkcsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy51bG9uZ2xvbmdfbWVtYmVyKSwgMCwgTlVMTH0sCi0jZW5kaWYKICAgICB7TlVMTH0KIH07CiAKQEAgLTQwMzUsMTUgKzQxODUsOSBAQAogICAgICAgICAiVF9CT09MIiwgIlRfQllURSIsICJUX1VCWVRFIiwgIlRfU0hPUlQiLCAiVF9VU0hPUlQiLAogICAgICAgICAiVF9JTlQiLCAiVF9VSU5UIiwgIlRfTE9ORyIsICJUX1VMT05HIiwgIlRfUFlTU0laRVQiLAogICAgICAgICAiVF9GTE9BVCIsICJUX0RPVUJMRSIsICJUX1NUUklOR19JTlBMQUNFIiwKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgICAgICAiVF9MT05HTE9ORyIsICJUX1VMT05HTE9ORyIsCi0jZW5kaWYKICAgICAgICAgTlVMTH07Ci0gICAgc3RhdGljIGNoYXIgKmZtdCA9ICJ8YmJCaEhpSWxrbmZkcyMiCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICAgICAgIkxLIgotI2VuZGlmCi0gICAgICAgIDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICJ8YmJCaEhpSWxrbmZkcyNMSyI7CiAgICAgdGVzdF9zdHJ1Y3RtZW1iZXJzICpvYjsKICAgICBjb25zdCBjaGFyICpzID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHN0cmluZ19sZW4gPSAwOwpAQCAtNDA2NSwxMCArNDIwOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLmZsb2F0X21lbWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMuZG91YmxlX21lbWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcywgJnN0cmluZ19sZW4KLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJm9iLT5zdHJ1Y3RtZW1iZXJzLmxvbmdsb25nX21lbWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMudWxvbmdsb25nX21lbWJlcgotI2VuZGlmCiAgICAgICAgICkpIHsKICAgICAgICAgUHlfREVDUkVGKG9iKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00Mzk0LDYgKzQ1MzYsNyBAQAogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NQVgiLCBQeUxvbmdfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpKTsKICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBZX1NTSVpFX1RfTUlOIiwgUHlMb25nX0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUlOKSk7CiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSVpFT0ZfUFlHQ19IRUFEIiwgUHlMb25nX0Zyb21Tc2l6ZV90KHNpemVvZihQeUdDX0hlYWQpKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSVpFT0ZfVElNRV9UIiwgUHlMb25nX0Zyb21Tc2l6ZV90KHNpemVvZih0aW1lX3QpKSk7CiAgICAgUHlfSU5DUkVGKCZQeUluc3RhbmNlTWV0aG9kX1R5cGUpOwogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiaW5zdGFuY2VtZXRob2QiLCAoUHlPYmplY3QgKikmUHlJbnN0YW5jZU1ldGhvZF9UeXBlKTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGVzdG11bHRpcGhhc2UuYyBiL01vZHVsZXMvX3Rlc3RtdWx0aXBoYXNlLmMKaW5kZXggNDFkYTk5Ny4uNGRhYTM0ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGVzdG11bHRpcGhhc2UuYworKysgYi9Nb2R1bGVzL190ZXN0bXVsdGlwaGFzZS5jCkBAIC02MSw3ICs2MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLUV4YW1wbGVfc2V0YXR0cihFeGFtcGxlT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKK0V4YW1wbGVfc2V0YXR0cihFeGFtcGxlT2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKICAgICBpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpIHsKICAgICAgICAgc2VsZi0+eF9hdHRyID0gUHlEaWN0X05ldygpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGtpbnRlci5jIGIvTW9kdWxlcy9fdGtpbnRlci5jCmluZGV4IDMxNmY5MzIuLjIxZjA2M2QgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3RraW50ZXIuYworKysgYi9Nb2R1bGVzL190a2ludGVyLmMKQEAgLTQ2Miw3ICs0NjIsNyBAQAogICAgICAgICAgICAgICAgIHYgPSBOVUxMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIGksIHcpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LCBpLCB3KTsKICAgICAgICAgfQogICAgIH0KICAgICBUY2xfRnJlZShGUkVFQ0FTVCBhcmd2KTsKQEAgLTQ4MCwxMyArNDgwLDEzIEBACiAgICAgICAgIFB5X3NzaXplX3QgaSwgc2l6ZTsKICAgICAgICAgUHlPYmplY3QgKmVsZW0sICpuZXdlbGVtLCAqcmVzdWx0OwogCi0gICAgICAgIHNpemUgPSBQeVR1cGxlX1NpemUoYXJnKTsKKyAgICAgICAgc2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoYXJnKTsKICAgICAgICAgcmVzdWx0ID0gTlVMTDsKICAgICAgICAgLyogUmVjdXJzaXZlbHkgaW52b2tlIFNwbGl0T2JqIGZvciBhbGwgdHVwbGUgaXRlbXMuCiAgICAgICAgICAgIElmIHRoaXMgZG9lcyBub3QgcmV0dXJuIGEgbmV3IG9iamVjdCwgbm8gYWN0aW9uIGlzCiAgICAgICAgICAgIG5lZWRlZC4gKi8KICAgICAgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HZXRJdGVtKGFyZywgaSk7CisgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmcsIGkpOwogICAgICAgICAgICAgbmV3ZWxlbSA9IFNwbGl0T2JqKGVsZW0pOwogICAgICAgICAgICAgaWYgKCFuZXdlbGVtKSB7CiAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihyZXN1bHQpOwpAQCAtNTAyLDEyICs1MDIsMTIgQEAKICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgaTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJnLCBrKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJnLCBrKTsKICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBrLCBlbGVtKTsKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGssIGVsZW0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGksIG5ld2VsZW0pOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIG5ld2VsZW0pOwogICAgICAgICB9CiAgICAgICAgIGlmIChyZXN1bHQpCiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNTI5LDcgKzUyOSw3IEBACiAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaSwgbmV3ZWxlbSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgbmV3ZWxlbSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC01NTEsNyArNTUxLDcgQEAKICAgICBlbHNlIGlmIChQeUJ5dGVzX0NoZWNrKGFyZykpIHsKICAgICAgICAgaW50IGFyZ2M7CiAgICAgICAgIGNvbnN0IGNoYXIgKiphcmd2OwotICAgICAgICBjaGFyICpsaXN0ID0gUHlCeXRlc19Bc1N0cmluZyhhcmcpOworICAgICAgICBjaGFyICpsaXN0ID0gUHlCeXRlc19BU19TVFJJTkcoYXJnKTsKIAogICAgICAgICBpZiAoVGNsX1NwbGl0TGlzdCgoVGNsX0ludGVycCAqKU5VTEwsIGxpc3QsICZhcmdjLCAmYXJndikgIT0gVENMX09LKSB7CiAgICAgICAgICAgICBQeV9JTkNSRUYoYXJnKTsKQEAgLTU1OSw3ICs1NTksNyBAQAogICAgICAgICB9CiAgICAgICAgIFRjbF9GcmVlKEZSRUVDQVNUIGFyZ3YpOwogICAgICAgICBpZiAoYXJnYyA+IDEpCi0gICAgICAgICAgICByZXR1cm4gU3BsaXQoUHlCeXRlc19Bc1N0cmluZyhhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBTcGxpdChQeUJ5dGVzX0FTX1NUUklORyhhcmcpKTsKICAgICAgICAgLyogRmFsbCB0aHJvdWdoLCByZXR1cm5pbmcgYXJnLiAqLwogICAgIH0KICAgICBQeV9JTkNSRUYoYXJnKTsKQEAgLTc1OCw3ICs3NTgsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBUY2xfU2V0VmFyKHYtPmludGVycCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0Y2xfbGlicmFyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FzU3RyaW5nKHV0ZjhfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyh1dGY4X3BhdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVENMX0dMT0JBTF9PTkxZKTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodXRmOF9wYXRoKTsKICAgICAgICAgICAgIH0KQEAgLTg0MSw3ICs4NDEsNyBAQAogICAgIFB5X0RFQ1JFRih0cCk7CiB9CiAKLXN0YXRpYyBjaGFyKgorc3RhdGljIGNvbnN0IGNoYXIgKgogUHlUY2xPYmplY3RfVGNsU3RyaW5nKFB5T2JqZWN0ICpzZWxmKQogewogICAgIHJldHVybiBUY2xfR2V0U3RyaW5nKCgoUHlUY2xPYmplY3QqKXNlbGYpLT52YWx1ZSk7CkBAIC05NzYsNyArOTc2LDcgQEAKIH07CiAKIAotI2lmIFBZX1NJWkVfTUFYID4gSU5UX01BWAorI2lmIFNJWkVfTUFYID4gSU5UX01BWAogI2RlZmluZSBDSEVDS19TVFJJTkdfTEVOR1RIKHMpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAocyAhPSBOVUxMICYmIHN0cmxlbihzKSA+PSBJTlRfTUFYKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzdHJpbmcgaXMgdG9vIGxvbmciKTsgXApAQCAtMTE4MiwxMCArMTE4Miw4IEBACiB7CiAgICAgICAgIFRjbF9XaWRlSW50IHdpZGVWYWx1ZTsKICAgICAgICAgaWYgKFRjbF9HZXRXaWRlSW50RnJvbU9iaihUa2FwcF9JbnRlcnAodGthcHApLCB2YWx1ZSwgJndpZGVWYWx1ZSkgPT0gVENMX09LKSB7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgICAgICAgICAgIGlmIChzaXplb2Yod2lkZVZhbHVlKSA8PSBTSVpFT0ZfTE9OR19MT05HKQogICAgICAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHdpZGVWYWx1ZSk7Ci0jZW5kaWYKICAgICAgICAgICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKHVuc2lnbmVkIGNoYXIgKikodm9pZCAqKSZ3aWRlVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih3aWRlVmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQWV9MSVRUTEVfRU5ESUFOLApAQCAtMTMwNiw3ICsxMzA0LDcgQEAKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMTUxNyw4ICsxNTE1LDggQEAKICAgICBpbnQgZmxhZ3MgPSBUQ0xfRVZBTF9ESVJFQ1QgfCBUQ0xfRVZBTF9HTE9CQUw7CiAKICAgICAvKiBJZiBhcmdzIGlzIGEgc2luZ2xlIHR1cGxlLCByZXBsYWNlIHdpdGggY29udGVudHMgb2YgdHVwbGUgKi8KLSAgICBpZiAoMSA9PSBQeVR1cGxlX1NpemUoYXJncykpewotICAgICAgICBQeU9iamVjdCogaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKICAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2soaXRlbSkpCiAgICAgICAgICAgICBhcmdzID0gaXRlbTsKICAgICB9CkBAIC0xNzI2LDE0ICsxNzI0LDE0IEBACiB2YXJuYW1lX2NvbnZlcnRlcihQeU9iamVjdCAqaW4sIHZvaWQgKl9vdXQpCiB7CiAgICAgY2hhciAqczsKLSAgICBjaGFyICoqb3V0ID0gKGNoYXIqKilfb3V0OworICAgIGNvbnN0IGNoYXIgKipvdXQgPSAoY29uc3QgY2hhcioqKV9vdXQ7CiAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2soaW4pKSB7Ci0gICAgICAgIGlmIChQeUJ5dGVzX1NpemUoaW4pID4gSU5UX01BWCkgeworICAgICAgICBpZiAoUHlCeXRlc19HRVRfU0laRShpbikgPiBJTlRfTUFYKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImJ5dGVzIG9iamVjdCBpcyB0b28gbG9uZyIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgcyA9IFB5Qnl0ZXNfQXNTdHJpbmcoaW4pOwotICAgICAgICBpZiAoc3RybGVuKHMpICE9IChzaXplX3QpUHlCeXRlc19TaXplKGluKSkgeworICAgICAgICBzID0gUHlCeXRlc19BU19TVFJJTkcoaW4pOworICAgICAgICBpZiAoc3RybGVuKHMpICE9IChzaXplX3QpUHlCeXRlc19HRVRfU0laRShpbikpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1iZWRkZWQgbnVsbCBieXRlIik7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQpAQCAtMTg0Niw3ICsxODQ0LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBTZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgZmxhZ3MpCiB7Ci0gICAgY2hhciAqbmFtZTEsICpuYW1lMjsKKyAgICBjb25zdCBjaGFyICpuYW1lMSwgKm5hbWUyOwogICAgIFB5T2JqZWN0ICpuZXdWYWx1ZTsKICAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKICAgICBUY2xfT2JqICpuZXd2YWwsICpvazsKQEAgLTE5MTUsNyArMTkxMyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogR2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGZsYWdzKQogewotICAgIGNoYXIgKm5hbWUxLCAqbmFtZTI9TlVMTDsKKyAgICBjb25zdCBjaGFyICpuYW1lMSwgKm5hbWUyPU5VTEw7CiAgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CiAgICAgVGNsX09iaiAqdHJlczsKIApAQCAtMjI3NCwxMCArMjI3MiwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmpjOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpzID0gRnJvbU9iaigoUHlPYmplY3QqKXNlbGYsIG9ianZbaV0pOwotICAgICAgICAgICAgaWYgKCFzIHx8IFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBzKSkgeworICAgICAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LCBpLCBzKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdjsKICAgICB9CkBAIC0yMzA0LDExICsyMzAzLDEyIEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0ICpzID0gdW5pY29kZUZyb21UY2xTdHJpbmcoYXJndltpXSk7Ci0gICAgICAgIGlmICghcyB8fCBQeVR1cGxlX1NldEl0ZW0odiwgaSwgcykpIHsKKyAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYodik7CiAgICAgICAgICAgICB2ID0gTlVMTDsKICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKICAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIGksIHMpOwogICAgIH0KIAogICBmaW5hbGx5OgpAQCAtMjM0OSwxMCArMjM0OSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmpjOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpzID0gRnJvbU9iaigoUHlPYmplY3QqKXNlbGYsIG9ianZbaV0pOwotICAgICAgICAgICAgaWYgKCFzIHx8IFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBzKSkgeworICAgICAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LCBpLCBzKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdjsKICAgICB9CkBAIC0yNDEwLDEwICsyNDExLDExIEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgKGFyZ2MgLSAxKTsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0ICpzID0gdW5pY29kZUZyb21UY2xTdHJpbmcoYXJndltpICsgMV0pOwotICAgICAgICBpZiAoIXMgfHwgUHlUdXBsZV9TZXRJdGVtKGFyZywgaSwgcykpIHsKKyAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKICAgICAgICAgICAgIHJldHVybiBQeXRob25DbWRfRXJyb3IoaW50ZXJwKTsKICAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZywgaSwgcyk7CiAgICAgfQogICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CiAgICAgUHlfREVDUkVGKGFyZyk7CkBAIC0yNDg1LDcgKzI0ODcsNiBAQAogLypbY2xpbmljIGlucHV0XQogX3RraW50ZXIudGthcHAuY3JlYXRlY29tbWFuZAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJUa2FwcE9iamVjdCAqIikKICAgICBuYW1lOiBzdHIKICAgICBmdW5jOiBvYmplY3QKICAgICAvCkBAIC0yNDk1LDcgKzI0OTYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF90a2ludGVyX3RrYXBwX2NyZWF0ZWNvbW1hbmRfaW1wbChUa2FwcE9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZnVuYykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yYTFjNzlhNGVlMmFmNDEwIGlucHV0PTJiYzJjMDQ2YTA5MTQyMzRdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yYTFjNzlhNGVlMmFmNDEwIGlucHV0PTI1NTc4NWNiNzBlZGM2YTBdKi8KIHsKICAgICBQeXRob25DbWRfQ2xpZW50RGF0YSAqZGF0YTsKICAgICBpbnQgZXJyOwpAQCAtMjU2MSw3ICsyNTYyLDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF90a2ludGVyLnRrYXBwLmRlbGV0ZWNvbW1hbmQKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iVGthcHBPYmplY3QgKiIpCiAgICAgbmFtZTogc3RyCiAgICAgLwogCkBAIC0yNTY5LDcgKzI1NjksNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogX3RraW50ZXJfdGthcHBfZGVsZXRlY29tbWFuZF9pbXBsKFRrYXBwT2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpuYW1lKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE2N2U4Y2I1ODQ1ZTBkMmQgaW5wdXQ9YjYzMDY0NjhmMTBiMjE5Y10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE2N2U4Y2I1ODQ1ZTBkMmQgaW5wdXQ9NTNlOTk1MmVhZTFmODVmNV0qLwogewogICAgIGludCBlcnI7CiAKQEAgLTI3NjIsMTMgKzI3NjIsMTEgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF90a2ludGVyLnRrdGltZXJ0b2tlbi5kZWxldGV0aW1lcmhhbmRsZXIKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iVGt0dE9iamVjdCAqIikKLQogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogX3RraW50ZXJfdGt0aW1lcnRva2VuX2RlbGV0ZXRpbWVyaGFuZGxlcl9pbXBsKFRrdHRPYmplY3QgKnNlbGYpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmQ3ZmUxN2YzMjhjZmE1NSBpbnB1dD0yNWJhNWRkNTk0ZTUyMDg0XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmQ3ZmUxN2YzMjhjZmE1NSBpbnB1dD00MGJkMDcwZmY4NWY1Y2YzXSovCiB7CiAgICAgVGt0dE9iamVjdCAqdiA9IHNlbGY7CiAgICAgUHlPYmplY3QgKmZ1bmMgPSB2LT5mdW5jOwpAQCAtMjg5NCw3ICsyODkyLDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF90a2ludGVyLnRrYXBwLm1haW5sb29wCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlRrYXBwT2JqZWN0ICoiKQogICAgIHRocmVzaG9sZDogaW50ID0gMAogICAgIC8KIApAQCAtMjkwMiw3ICsyODk5LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIF90a2ludGVyX3RrYXBwX21haW5sb29wX2ltcGwoVGthcHBPYmplY3QgKnNlbGYsIGludCB0aHJlc2hvbGQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGJhOGVhYmJlNTc4NDFiMCBpbnB1dD1hZDU3YzljMWRkMmI5NDcwXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGJhOGVhYmJlNTc4NDFiMCBpbnB1dD0wMzZiY2RjZjAzZDVlY2EwXSovCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOwpAQCAtMzA3MiwxMyArMzA2OSwxMSBAQAogLypbY2xpbmljIGlucHV0XQogX3RraW50ZXIudGthcHAud2lsbGRpc3BhdGNoCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlRrYXBwT2JqZWN0ICoiKQotCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfdGtpbnRlcl90a2FwcF93aWxsZGlzcGF0Y2hfaW1wbChUa2FwcE9iamVjdCAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wZTNmNDZkMjQ0NjQyMTU1IGlucHV0PTI2MzA2OTk3Njc4MDg5NzBdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wZTNmNDZkMjQ0NjQyMTU1IGlucHV0PWQ4OGY1OTcwODQzZDZkYWJdKi8KIHsKICAgICBzZWxmLT5kaXNwYXRjaGluZyA9IDE7CiAKQEAgLTM2MjksMTQgKzM2MjQsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFRjbF9GaW5kRXhlY3V0YWJsZShQeUJ5dGVzX0FzU3RyaW5nKGNleGUpKTsKKyAgICAgICAgICAgIFRjbF9GaW5kRXhlY3V0YWJsZShQeUJ5dGVzX0FTX1NUUklORyhjZXhlKSk7CiAKICAgICAgICAgICAgIGlmIChzZXRfdmFyKSB7CiAgICAgICAgICAgICAgICAgU2V0RW52aXJvbm1lbnRWYXJpYWJsZVcoTCJUQ0xfTElCUkFSWSIsIE5VTEwpOwogICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUod2NzX3BhdGgpOwogICAgICAgICAgICAgfQogI2Vsc2UKLSAgICAgICAgICAgIFRjbF9GaW5kRXhlY3V0YWJsZShQeUJ5dGVzX0FzU3RyaW5nKGNleGUpKTsKKyAgICAgICAgICAgIFRjbF9GaW5kRXhlY3V0YWJsZShQeUJ5dGVzX0FTX1NUUklORyhjZXhlKSk7CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogICAgICAgICB9CiAgICAgICAgIFB5X1hERUNSRUYoY2V4ZSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL190cmFjZW1hbGxvYy5jIGIvTW9kdWxlcy9fdHJhY2VtYWxsb2MuYwppbmRleCA2NWJmN2EzLi5lYzhiZDk2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL190cmFjZW1hbGxvYy5jCisrKyBiL01vZHVsZXMvX3RyYWNlbWFsbG9jLmMKQEAgLTM5LDcgKzM5LDExIEBACiAgICAgLyogbGltaXQgb2YgdGhlIG51bWJlciBvZiBmcmFtZXMgaW4gYSB0cmFjZWJhY2ssIDEgYnkgZGVmYXVsdC4KICAgICAgICBWYXJpYWJsZSBwcm90ZWN0ZWQgYnkgdGhlIEdJTC4gKi8KICAgICBpbnQgbWF4X25mcmFtZTsKLX0gdHJhY2VtYWxsb2NfY29uZmlnID0ge1RSQUNFTUFMTE9DX05PVF9JTklUSUFMSVpFRCwgMCwgMX07CisKKyAgICAvKiB1c2UgZG9tYWluIGluIHRyYWNlIGtleT8KKyAgICAgICBWYXJpYWJsZSBwcm90ZWN0ZWQgYnkgdGhlIEdJTC4gKi8KKyAgICBpbnQgdXNlX2RvbWFpbjsKK30gdHJhY2VtYWxsb2NfY29uZmlnID0ge1RSQUNFTUFMTE9DX05PVF9JTklUSUFMSVpFRCwgMCwgMSwgMH07CiAKICNpZiBkZWZpbmVkKFRSQUNFX1JBV19NQUxMT0MpICYmIGRlZmluZWQoV0lUSF9USFJFQUQpCiAvKiBUaGlzIGxvY2sgaXMgbmVlZGVkIGJlY2F1c2UgdHJhY2VtYWxsb2NfZnJlZSgpIGlzIGNhbGxlZCB3aXRob3V0CkBAIC01NCwxMCArNTgsMjEgQEAKICMgIGRlZmluZSBUQUJMRVNfVU5MT0NLKCkKICNlbmRpZgogCisKKyNkZWZpbmUgREVGQVVMVF9ET01BSU4gMAorCisvKiBQYWNrIHRoZSBmcmFtZV90IHN0cnVjdHVyZSB0byByZWR1Y2UgdGhlIG1lbW9yeSBmb290cHJpbnQuICovCit0eXBlZGVmIHN0cnVjdAorI2lmZGVmIF9fR05VQ19fCitfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2VuZGlmCit7CisgICAgdWludHB0cl90IHB0cjsKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW47Cit9IHBvaW50ZXJfdDsKKwogLyogUGFjayB0aGUgZnJhbWVfdCBzdHJ1Y3R1cmUgdG8gcmVkdWNlIHRoZSBtZW1vcnkgZm9vdHByaW50IG9uIDY0LWJpdAotICAgYXJjaGl0ZWN0dXJlczogMTIgYnl0ZXMgaW5zdGVhZCBvZiAxNi4gVGhpcyBvcHRpbWl6YXRpb24gbWlnaHQgcHJvZHVjZQotICAgU0lHQlVTIG9uIGFyY2hpdGVjdHVyZXMgbm90IHN1cHBvcnRpbmcgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3NlcyAoNjQtYml0Ci0gICBNSVBTIENQVT8pOiBvbiBzdWNoIGFyY2hpdGVjdHVyZSwgdGhlIHN0cnVjdHVyZSBtdXN0IG5vdCBiZSBwYWNrZWQuICovCisgICBhcmNoaXRlY3R1cmVzOiAxMiBieXRlcyBpbnN0ZWFkIG9mIDE2LiAqLwogdHlwZWRlZiBzdHJ1Y3QKICNpZmRlZiBfX0dOVUNfXwogX19hdHRyaWJ1dGVfXygocGFja2VkKSkKQEAgLTY1LDEwICs4MCwxMyBAQAogX2RlY2xzcGVjKGFsaWduKDQpKQogI2VuZGlmCiB7CisgICAgLyogZmlsZW5hbWUgY2Fubm90IGJlIE5VTEw6ICI8dW5rbm93bj4iIGlzIHVzZWQgaWYgdGhlIFB5dGhvbiBmcmFtZQorICAgICAgIGZpbGVuYW1lIGlzIE5VTEwgKi8KICAgICBQeU9iamVjdCAqZmlsZW5hbWU7CiAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKIH0gZnJhbWVfdDsKIAorCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlfdWhhc2hfdCBoYXNoOwogICAgIGludCBuZnJhbWU7CkBAIC04MSw2ICs5OSw3IEBACiAjZGVmaW5lIE1BWF9ORlJBTUUgXAogICAgICAgICAoKElOVF9NQVggLSAoaW50KXNpemVvZih0cmFjZWJhY2tfdCkpIC8gKGludClzaXplb2YoZnJhbWVfdCkgKyAxKQogCisKIHN0YXRpYyBQeU9iamVjdCAqdW5rbm93bl9maWxlbmFtZSA9IE5VTEw7CiBzdGF0aWMgdHJhY2ViYWNrX3QgdHJhY2VtYWxsb2NfZW1wdHlfdHJhY2ViYWNrOwogCkBAIC05Myw2ICsxMTIsNyBAQAogICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CiB9IHRyYWNlX3Q7CiAKKwogLyogU2l6ZSBpbiBieXRlcyBvZiBjdXJyZW50bHkgdHJhY2VkIG1lbW9yeS4KICAgIFByb3RlY3RlZCBieSBUQUJMRVNfTE9DSygpLiAqLwogc3RhdGljIHNpemVfdCB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ID0gMDsKQEAgLTExOSw2ICsxMzksNyBAQAogICAgUHJvdGVjdGVkIGJ5IFRBQkxFU19MT0NLKCkuICovCiBzdGF0aWMgX1B5X2hhc2h0YWJsZV90ICp0cmFjZW1hbGxvY190cmFjZXMgPSBOVUxMOwogCisKICNpZmRlZiBUUkFDRV9ERUJVRwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX2Vycm9yKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQpAQCAtMTMzLDYgKzE1NCw3IEBACiB9CiAjZW5kaWYKIAorCiAjaWYgZGVmaW5lZChXSVRIX1RIUkVBRCkgJiYgZGVmaW5lZChUUkFDRV9SQVdfTUFMTE9DKQogI2RlZmluZSBSRUVOVFJBTlRfVEhSRUFETE9DQUwKIApAQCAtMTQzLDcgKzE2NSw3IEBACiAjICBlcnJvciAibmVlZCBuYXRpdmUgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgKFRMUykiCiAjZW5kaWYKIAotc3RhdGljIGludCB0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5Oworc3RhdGljIGludCB0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5ID0gLTE7CiAKIC8qIEFueSBub24tTlVMTCBwb2ludGVyIGNhbiBiZSB1c2VkICovCiAjZGVmaW5lIFJFRU5UUkFOVCBQeV9UcnVlCkBAIC0xNTEsNyArMTczLDEwIEBACiBzdGF0aWMgaW50CiBnZXRfcmVlbnRyYW50KHZvaWQpCiB7Ci0gICAgdm9pZCAqcHRyID0gUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KTsKKyAgICB2b2lkICpwdHI7CisKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSAhPSAtMSk7CisgICAgcHRyID0gUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KTsKICAgICBpZiAocHRyICE9IE5VTEwpIHsKICAgICAgICAgYXNzZXJ0KHB0ciA9PSBSRUVOVFJBTlQpOwogICAgICAgICByZXR1cm4gMTsKQEAgLTE2NCwxMiArMTg5LDE0IEBACiBzZXRfcmVlbnRyYW50KGludCByZWVudHJhbnQpCiB7CiAgICAgYXNzZXJ0KHJlZW50cmFudCA9PSAwIHx8IHJlZW50cmFudCA9PSAxKTsKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSAhPSAtMSk7CisKICAgICBpZiAocmVlbnRyYW50KSB7Ci0gICAgICAgIGFzc2VydChQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkpID09IE5VTEwpOworICAgICAgICBhc3NlcnQoIWdldF9yZWVudHJhbnQoKSk7CiAgICAgICAgIFB5VGhyZWFkX3NldF9rZXlfdmFsdWUodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSwgUkVFTlRSQU5UKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGFzc2VydChQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkpID09IFJFRU5UUkFOVCk7CisgICAgICAgIGFzc2VydChnZXRfcmVlbnRyYW50KCkpOwogICAgICAgICBQeVRocmVhZF9zZXRfa2V5X3ZhbHVlKHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXksIE5VTEwpOwogICAgIH0KIH0KQEAgLTE5NCwyNyArMjIxLDc1IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludAotaGFzaHRhYmxlX2NvbXBhcmVfdW5pY29kZShjb25zdCB2b2lkICprZXksIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnkpCisKK3N0YXRpYyBQeV91aGFzaF90CitoYXNodGFibGVfaGFzaF9weW9iamVjdChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5KQogewotICAgIGlmIChrZXkgIT0gTlVMTCAmJiBlbnRyeS0+a2V5ICE9IE5VTEwpCi0gICAgICAgIHJldHVybiAoUHlVbmljb2RlX0NvbXBhcmUoKFB5T2JqZWN0ICopa2V5LCAoUHlPYmplY3QgKillbnRyeS0+a2V5KSA9PSAwKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBrZXkgPT0gZW50cnktPmtleTsKKyAgICBQeU9iamVjdCAqb2JqOworCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwgb2JqKTsKKyAgICByZXR1cm4gUHlPYmplY3RfSGFzaChvYmopOwogfQogCi1zdGF0aWMgX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdCBoYXNodGFibGVfYWxsb2MgPSB7bWFsbG9jLCBmcmVlfTsKKworc3RhdGljIGludAoraGFzaHRhYmxlX2NvbXBhcmVfdW5pY29kZShfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KQoreworICAgIFB5T2JqZWN0ICprZXkxLCAqa2V5MjsKKworICAgIF9QeV9IQVNIVEFCTEVfUkVBRF9LRVkoaHQsIHBrZXksIGtleTEpOworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoaHQsIGVudHJ5LCBrZXkyKTsKKworICAgIGlmIChrZXkxICE9IE5VTEwgJiYga2V5MiAhPSBOVUxMKQorICAgICAgICByZXR1cm4gKFB5VW5pY29kZV9Db21wYXJlKGtleTEsIGtleTIpID09IDApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGtleTEgPT0ga2V5MjsKK30KKworCitzdGF0aWMgUHlfdWhhc2hfdAoraGFzaHRhYmxlX2hhc2hfcG9pbnRlcl90KF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKnBrZXkpCit7CisgICAgcG9pbnRlcl90IHB0cjsKKyAgICBQeV91aGFzaF90IGhhc2g7CisKKyAgICBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKGh0LCBwa2V5LCBwdHIpOworCisgICAgaGFzaCA9IChQeV91aGFzaF90KV9QeV9IYXNoUG9pbnRlcigodm9pZCopcHRyLnB0cik7CisgICAgaGFzaCBePSBwdHIuZG9tYWluOworICAgIHJldHVybiBoYXNoOworfQorCisKK3N0YXRpYyBpbnQKK2hhc2h0YWJsZV9jb21wYXJlX3BvaW50ZXJfdChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnkpCit7CisgICAgcG9pbnRlcl90IHB0cjEsIHB0cjI7CisKKyAgICBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKGh0LCBwa2V5LCBwdHIxKTsKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKGh0LCBlbnRyeSwgcHRyMik7CisKKyAgICAvKiBjb21wYXJlIHBvaW50ZXIgYmVmb3JlIGRvbWFpbiwgYmVjYXVzZSBwb2ludGVyIGlzIG1vcmUgbGlrZWx5IHRvIGJlCisgICAgICAgZGlmZmVyZW50ICovCisgICAgcmV0dXJuIChwdHIxLnB0ciA9PSBwdHIyLnB0ciAmJiBwdHIxLmRvbWFpbiA9PSBwdHIyLmRvbWFpbik7CisKK30KKwogCiBzdGF0aWMgX1B5X2hhc2h0YWJsZV90ICoKLWhhc2h0YWJsZV9uZXcoc2l6ZV90IGRhdGFfc2l6ZSwKK2hhc2h0YWJsZV9uZXcoc2l6ZV90IGtleV9zaXplLCBzaXplX3QgZGF0YV9zaXplLAogICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYyBoYXNoX2Z1bmMsCiAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jIGNvbXBhcmVfZnVuYykKIHsKLSAgICByZXR1cm4gX1B5X2hhc2h0YWJsZV9uZXdfZnVsbChkYXRhX3NpemUsIDAsCisgICAgX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdCBoYXNodGFibGVfYWxsb2MgPSB7bWFsbG9jLCBmcmVlfTsKKyAgICByZXR1cm4gX1B5X2hhc2h0YWJsZV9uZXdfZnVsbChrZXlfc2l6ZSwgZGF0YV9zaXplLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfZnVuYywgY29tcGFyZV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsICZoYXNodGFibGVfYWxsb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXNodGFibGVfYWxsb2MpOwogfQogCisKIHN0YXRpYyB2b2lkKgogcmF3X21hbGxvYyhzaXplX3Qgc2l6ZSkKIHsKQEAgLTIyNywyMSArMzAyLDI4IEBACiAgICAgYWxsb2NhdG9ycy5yYXcuZnJlZShhbGxvY2F0b3JzLnJhdy5jdHgsIHB0cik7CiB9CiAKKwogc3RhdGljIFB5X3VoYXNoX3QKLWhhc2h0YWJsZV9oYXNoX3RyYWNlYmFjayhjb25zdCB2b2lkICprZXkpCitoYXNodGFibGVfaGFzaF90cmFjZWJhY2soX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSkKIHsKLSAgICBjb25zdCB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrID0ga2V5OworICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CisKKyAgICBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKGh0LCBwa2V5LCB0cmFjZWJhY2spOwogICAgIHJldHVybiB0cmFjZWJhY2stPmhhc2g7CiB9CiAKKwogc3RhdGljIGludAotaGFzaHRhYmxlX2NvbXBhcmVfdHJhY2ViYWNrKGNvbnN0IHRyYWNlYmFja190ICp0cmFjZWJhY2sxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqaGUpCitoYXNodGFibGVfY29tcGFyZV90cmFjZWJhY2soX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KQogewotICAgIGNvbnN0IHRyYWNlYmFja190ICp0cmFjZWJhY2syID0gaGUtPmtleTsKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrMSwgKnRyYWNlYmFjazI7CiAgICAgY29uc3QgZnJhbWVfdCAqZnJhbWUxLCAqZnJhbWUyOwogICAgIGludCBpOwogCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwgdHJhY2ViYWNrMSk7CisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWShodCwgZW50cnksIHRyYWNlYmFjazIpOworCiAgICAgaWYgKHRyYWNlYmFjazEtPm5mcmFtZSAhPSB0cmFjZWJhY2syLT5uZnJhbWUpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC0yNjAsNiArMzQyLDcgQEAKICAgICByZXR1cm4gMTsKIH0KIAorCiBzdGF0aWMgdm9pZAogdHJhY2VtYWxsb2NfZ2V0X2ZyYW1lKFB5RnJhbWVPYmplY3QgKnB5ZnJhbWUsIGZyYW1lX3QgKmZyYW1lKQogewpAQCAtMzEwLDE1ICszOTMsMTUgQEAKICAgICB9CiAKICAgICAvKiBpbnRlcm4gdGhlIGZpbGVuYW1lICovCi0gICAgZW50cnkgPSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeSh0cmFjZW1hbGxvY19maWxlbmFtZXMsIGZpbGVuYW1lKTsKKyAgICBlbnRyeSA9IF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKHRyYWNlbWFsbG9jX2ZpbGVuYW1lcywgZmlsZW5hbWUpOwogICAgIGlmIChlbnRyeSAhPSBOVUxMKSB7Ci0gICAgICAgIGZpbGVuYW1lID0gKFB5T2JqZWN0ICopZW50cnktPmtleTsKKyAgICAgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWSh0cmFjZW1hbGxvY19maWxlbmFtZXMsIGVudHJ5LCBmaWxlbmFtZSk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICAvKiB0cmFjZW1hbGxvY19maWxlbmFtZXMgaXMgcmVzcG9uc2libGUgdG8ga2VlcCBhIHJlZmVyZW5jZQogICAgICAgICAgICB0byB0aGUgZmlsZW5hbWUgKi8KICAgICAgICAgUHlfSU5DUkVGKGZpbGVuYW1lKTsKLSAgICAgICAgaWYgKF9QeV9oYXNodGFibGVfc2V0KHRyYWNlbWFsbG9jX2ZpbGVuYW1lcywgZmlsZW5hbWUsIE5VTEwsIDApIDwgMCkgeworICAgICAgICBpZiAoX1B5X0hBU0hUQUJMRV9TRVRfTk9EQVRBKHRyYWNlbWFsbG9jX2ZpbGVuYW1lcywgZmlsZW5hbWUpIDwgMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGZpbGVuYW1lKTsKICNpZmRlZiBUUkFDRV9ERUJVRwogICAgICAgICAgICAgdHJhY2VtYWxsb2NfZXJyb3IoImZhaWxlZCB0byBpbnRlcm4gdGhlIGZpbGVuYW1lIik7CkBAIC0zMzEsNiArNDE0LDcgQEAKICAgICBmcmFtZS0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKIH0KIAorCiBzdGF0aWMgUHlfdWhhc2hfdAogdHJhY2ViYWNrX2hhc2godHJhY2ViYWNrX3QgKnRyYWNlYmFjaykKIHsKQEAgLTM1NSw2ICs0MzksNyBAQAogICAgIHJldHVybiB4OwogfQogCisKIHN0YXRpYyB2b2lkCiB0cmFjZWJhY2tfZ2V0X2ZyYW1lcyh0cmFjZWJhY2tfdCAqdHJhY2ViYWNrKQogewpAQCAtMzgyLDYgKzQ2Nyw3IEBACiAgICAgfQogfQogCisKIHN0YXRpYyB0cmFjZWJhY2tfdCAqCiB0cmFjZWJhY2tfbmV3KHZvaWQpCiB7CkBAIC00MDEsOSArNDg3LDkgQEAKICAgICB0cmFjZWJhY2stPmhhc2ggPSB0cmFjZWJhY2tfaGFzaCh0cmFjZWJhY2spOwogCiAgICAgLyogaW50ZXJuIHRoZSB0cmFjZWJhY2sgKi8KLSAgICBlbnRyeSA9IF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KHRyYWNlbWFsbG9jX3RyYWNlYmFja3MsIHRyYWNlYmFjayk7CisgICAgZW50cnkgPSBfUHlfSEFTSFRBQkxFX0dFVF9FTlRSWSh0cmFjZW1hbGxvY190cmFjZWJhY2tzLCB0cmFjZWJhY2spOwogICAgIGlmIChlbnRyeSAhPSBOVUxMKSB7Ci0gICAgICAgIHRyYWNlYmFjayA9ICh0cmFjZWJhY2tfdCAqKWVudHJ5LT5rZXk7CisgICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkodHJhY2VtYWxsb2NfdHJhY2ViYWNrcywgZW50cnksIHRyYWNlYmFjayk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICB0cmFjZWJhY2tfdCAqY29weTsKQEAgLTQyMCw3ICs1MDYsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1lbWNweShjb3B5LCB0cmFjZWJhY2ssIHRyYWNlYmFja19zaXplKTsKIAotICAgICAgICBpZiAoX1B5X2hhc2h0YWJsZV9zZXQodHJhY2VtYWxsb2NfdHJhY2ViYWNrcywgY29weSwgTlVMTCwgMCkgPCAwKSB7CisgICAgICAgIGlmIChfUHlfSEFTSFRBQkxFX1NFVF9OT0RBVEEodHJhY2VtYWxsb2NfdHJhY2ViYWNrcywgY29weSkgPCAwKSB7CiAgICAgICAgICAgICByYXdfZnJlZShjb3B5KTsKICNpZmRlZiBUUkFDRV9ERUJVRwogICAgICAgICAgICAgdHJhY2VtYWxsb2NfZXJyb3IoImZhaWxlZCB0byBpbnRlcm4gdGhlIHRyYWNlYmFjazogcHV0ZGF0YSBmYWlsZWQiKTsKQEAgLTQzMiw1MyArNTE4LDE2MSBAQAogICAgIHJldHVybiB0cmFjZWJhY2s7CiB9CiAKKwogc3RhdGljIGludAotdHJhY2VtYWxsb2NfYWRkX3RyYWNlKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit0cmFjZW1hbGxvY191c2VfZG9tYWluX2NiKF9QeV9oYXNodGFibGVfdCAqb2xkX3RyYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKnVzZXJfZGF0YSkKIHsKLSAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOwotICAgIHRyYWNlX3QgdHJhY2U7Ci0gICAgaW50IHJlczsKKyAgICB1aW50cHRyX3QgcHRyOworICAgIHBvaW50ZXJfdCBrZXk7CisgICAgX1B5X2hhc2h0YWJsZV90ICpuZXdfdHJhY2VzID0gKF9QeV9oYXNodGFibGVfdCAqKXVzZXJfZGF0YTsKKyAgICBjb25zdCB2b2lkICpwZGF0YSA9IF9QeV9IQVNIVEFCTEVfRU5UUllfUERBVEEob2xkX3RyYWNlcywgZW50cnkpOwogCi0jaWZkZWYgV0lUSF9USFJFQUQKLSAgICBhc3NlcnQoUHlHSUxTdGF0ZV9DaGVjaygpKTsKLSNlbmRpZgorICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkob2xkX3RyYWNlcywgZW50cnksIHB0cik7CisgICAga2V5LnB0ciA9IHB0cjsKKyAgICBrZXkuZG9tYWluID0gREVGQVVMVF9ET01BSU47CiAKLSAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2tfbmV3KCk7Ci0gICAgaWYgKHRyYWNlYmFjayA9PSBOVUxMKQorICAgIHJldHVybiBfUHlfaGFzaHRhYmxlX3NldChuZXdfdHJhY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa2V5KSwgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3RyYWNlcy0+ZGF0YV9zaXplLCBwZGF0YSk7Cit9CisKKworLyogQ29udmVydCB0cmFjZW1hbGxvY190cmFjZXMgZnJvbSBjb21wYWN0IGtleSAodWludHB0cl90KSB0byBwb2ludGVyX3Qga2V5LgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuICovCitzdGF0aWMgaW50Cit0cmFjZW1hbGxvY191c2VfZG9tYWluKHZvaWQpCit7CisgICAgX1B5X2hhc2h0YWJsZV90ICpuZXdfdHJhY2VzID0gTlVMTDsKKworICAgIGFzc2VydCghdHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pOworCisgICAgbmV3X3RyYWNlcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKHBvaW50ZXJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9oYXNoX3BvaW50ZXJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfY29tcGFyZV9wb2ludGVyX3QpOworICAgIGlmIChuZXdfdHJhY2VzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgdHJhY2Uuc2l6ZSA9IHNpemU7Ci0gICAgdHJhY2UudHJhY2ViYWNrID0gdHJhY2ViYWNrOwotCi0gICAgcmVzID0gX1B5X0hBU0hUQUJMRV9TRVQodHJhY2VtYWxsb2NfdHJhY2VzLCBwdHIsIHRyYWNlKTsKLSAgICBpZiAocmVzID09IDApIHsKLSAgICAgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPD0gUFlfU0laRV9NQVggLSBzaXplKTsKLSAgICAgICAgdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSArPSBzaXplOwotICAgICAgICBpZiAodHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSA+IHRyYWNlbWFsbG9jX3BlYWtfdHJhY2VkX21lbW9yeSkKLSAgICAgICAgICAgIHRyYWNlbWFsbG9jX3BlYWtfdHJhY2VkX21lbW9yeSA9IHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnk7CiAgICAgfQogCi0gICAgcmV0dXJuIHJlczsKKyAgICBpZiAoX1B5X2hhc2h0YWJsZV9mb3JlYWNoKHRyYWNlbWFsbG9jX3RyYWNlcywgdHJhY2VtYWxsb2NfdXNlX2RvbWFpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld190cmFjZXMpIDwgMCkKKyAgICB7CisgICAgICAgIF9QeV9oYXNodGFibGVfZGVzdHJveShuZXdfdHJhY2VzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIF9QeV9oYXNodGFibGVfZGVzdHJveSh0cmFjZW1hbGxvY190cmFjZXMpOworICAgIHRyYWNlbWFsbG9jX3RyYWNlcyA9IG5ld190cmFjZXM7CisKKyAgICB0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbiA9IDE7CisKKyAgICByZXR1cm4gMDsKIH0KIAorCiBzdGF0aWMgdm9pZAotdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKHZvaWQgKnB0cikKK3RyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sIHVpbnRwdHJfdCBwdHIpCiB7CiAgICAgdHJhY2VfdCB0cmFjZTsKKyAgICBpbnQgcmVtb3ZlZDsKIAotICAgIGlmIChfUHlfaGFzaHRhYmxlX3BvcCh0cmFjZW1hbGxvY190cmFjZXMsIHB0ciwgJnRyYWNlLCBzaXplb2YodHJhY2UpKSkgeworICAgIGFzc2VydCh0cmFjZW1hbGxvY19jb25maWcudHJhY2luZyk7CisKKyAgICBpZiAodHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pIHsKKyAgICAgICAgcG9pbnRlcl90IGtleSA9IHtwdHIsIGRvbWFpbn07CisgICAgICAgIHJlbW92ZWQgPSBfUHlfSEFTSFRBQkxFX1BPUCh0cmFjZW1hbGxvY190cmFjZXMsIGtleSwgdHJhY2UpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVtb3ZlZCA9IF9QeV9IQVNIVEFCTEVfUE9QKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyLCB0cmFjZSk7CisgICAgfQorICAgIGlmICghcmVtb3ZlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPj0gdHJhY2Uuc2l6ZSk7CisgICAgdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSAtPSB0cmFjZS5zaXplOworfQorCisjZGVmaW5lIFJFTU9WRV9UUkFDRShwdHIpIFwKKyAgICAgICAgICAgIHRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShERUZBVUxUX0RPTUFJTiwgKHVpbnRwdHJfdCkocHRyKSkKKworCitzdGF0aWMgaW50Cit0cmFjZW1hbGxvY19hZGRfdHJhY2UoX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCB1aW50cHRyX3QgcHRyLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKQoreworICAgIHBvaW50ZXJfdCBrZXkgPSB7cHRyLCBkb21haW59OworICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CisgICAgdHJhY2VfdCB0cmFjZTsKKyAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QqIGVudHJ5OworICAgIGludCByZXM7CisKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfY29uZmlnLnRyYWNpbmcpOworCisgICAgdHJhY2ViYWNrID0gdHJhY2ViYWNrX25ldygpOworICAgIGlmICh0cmFjZWJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCF0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbiAmJiBkb21haW4gIT0gREVGQVVMVF9ET01BSU4pIHsKKyAgICAgICAgLyogZmlyc3QgdHJhY2UgdXNpbmcgYSBub24temVybyBkb21haW4gd2hlcmVhcyB0cmFjZXMgdXNlIGNvbXBhY3QKKyAgICAgICAgICAgKHVpbnRwdHJfdCkga2V5czogc3dpdGNoIHRvIHBvaW50ZXJfdCBrZXlzLiAqLworICAgICAgICBpZiAodHJhY2VtYWxsb2NfdXNlX2RvbWFpbigpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKSB7CisgICAgICAgIGVudHJ5ID0gX1B5X0hBU0hUQUJMRV9HRVRfRU5UUlkodHJhY2VtYWxsb2NfdHJhY2VzLCBrZXkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZW50cnkgPSBfUHlfSEFTSFRBQkxFX0dFVF9FTlRSWSh0cmFjZW1hbGxvY190cmFjZXMsIHB0cik7CisgICAgfQorCisgICAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgLyogdGhlIG1lbW9yeSBibG9jayBpcyBhbHJlYWR5IHRyYWNrZWQgKi8KKyAgICAgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEodHJhY2VtYWxsb2NfdHJhY2VzLCBlbnRyeSwgdHJhY2UpOwogICAgICAgICBhc3NlcnQodHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSA+PSB0cmFjZS5zaXplKTsKICAgICAgICAgdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSAtPSB0cmFjZS5zaXplOworCisgICAgICAgIHRyYWNlLnNpemUgPSBzaXplOworICAgICAgICB0cmFjZS50cmFjZWJhY2sgPSB0cmFjZWJhY2s7CisgICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfV1JJVEVfREFUQSh0cmFjZW1hbGxvY190cmFjZXMsIGVudHJ5LCB0cmFjZSk7CiAgICAgfQorICAgIGVsc2UgeworICAgICAgICB0cmFjZS5zaXplID0gc2l6ZTsKKyAgICAgICAgdHJhY2UudHJhY2ViYWNrID0gdHJhY2ViYWNrOworCisgICAgICAgIGlmICh0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbikgeworICAgICAgICAgICAgcmVzID0gX1B5X0hBU0hUQUJMRV9TRVQodHJhY2VtYWxsb2NfdHJhY2VzLCBrZXksIHRyYWNlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IF9QeV9IQVNIVEFCTEVfU0VUKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyLCB0cmFjZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPD0gU0laRV9NQVggLSBzaXplKTsKKyAgICB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ICs9IHNpemU7CisgICAgaWYgKHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPiB0cmFjZW1hbGxvY19wZWFrX3RyYWNlZF9tZW1vcnkpCisgICAgICAgIHRyYWNlbWFsbG9jX3BlYWtfdHJhY2VkX21lbW9yeSA9IHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnk7CisgICAgcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgQUREX1RSQUNFKHB0ciwgc2l6ZSkgXAorICAgICAgICAgICAgdHJhY2VtYWxsb2NfYWRkX3RyYWNlKERFRkFVTFRfRE9NQUlOLCAodWludHB0cl90KShwdHIpLCBzaXplKQorCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfYWxsb2MoaW50IHVzZV9jYWxsb2MsIHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKQogewogICAgIFB5TWVtQWxsb2NhdG9yRXggKmFsbG9jID0gKFB5TWVtQWxsb2NhdG9yRXggKiljdHg7CiAgICAgdm9pZCAqcHRyOwogCi0gICAgYXNzZXJ0KGVsc2l6ZSA9PSAwIHx8IG5lbGVtIDw9IFBZX1NJWkVfTUFYIC8gZWxzaXplKTsKKyAgICBhc3NlcnQoZWxzaXplID09IDAgfHwgbmVsZW0gPD0gU0laRV9NQVggLyBlbHNpemUpOwogCiAgICAgaWYgKHVzZV9jYWxsb2MpCiAgICAgICAgIHB0ciA9IGFsbG9jLT5jYWxsb2MoYWxsb2MtPmN0eCwgbmVsZW0sIGVsc2l6ZSk7CkBAIC00ODgsNyArNjgyLDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBUQUJMRVNfTE9DSygpOwotICAgIGlmICh0cmFjZW1hbGxvY19hZGRfdHJhY2UocHRyLCBuZWxlbSAqIGVsc2l6ZSkgPCAwKSB7CisgICAgaWYgKEFERF9UUkFDRShwdHIsIG5lbGVtICogZWxzaXplKSA8IDApIHsKICAgICAgICAgLyogRmFpbGVkIHRvIGFsbG9jYXRlIGEgdHJhY2UgZm9yIHRoZSBuZXcgbWVtb3J5IGJsb2NrICovCiAgICAgICAgIFRBQkxFU19VTkxPQ0soKTsKICAgICAgICAgYWxsb2MtPmZyZWUoYWxsb2MtPmN0eCwgcHRyKTsKQEAgLTQ5OCw2ICs2OTIsNyBAQAogICAgIHJldHVybiBwdHI7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19yZWFsbG9jKHZvaWQgKmN0eCwgdm9pZCAqcHRyLCBzaXplX3QgbmV3X3NpemUpCiB7CkBAIC01MTIsOSArNzA3LDE0IEBACiAgICAgICAgIC8qIGFuIGV4aXN0aW5nIG1lbW9yeSBibG9jayBoYXMgYmVlbiByZXNpemVkICovCiAKICAgICAgICAgVEFCTEVTX0xPQ0soKTsKLSAgICAgICAgdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKHB0cik7CiAKLSAgICAgICAgaWYgKHRyYWNlbWFsbG9jX2FkZF90cmFjZShwdHIyLCBuZXdfc2l6ZSkgPCAwKSB7CisgICAgICAgIC8qIHRyYWNlbWFsbG9jX2FkZF90cmFjZSgpIHVwZGF0ZXMgdGhlIHRyYWNlIGlmIHRoZXJlIGlzIGFscmVhZHkKKyAgICAgICAgICAgYSB0cmFjZSBhdCBhZGRyZXNzIChkb21haW4sIHB0cjIpICovCisgICAgICAgIGlmIChwdHIyICE9IHB0cikgeworICAgICAgICAgICAgUkVNT1ZFX1RSQUNFKHB0cik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQUREX1RSQUNFKHB0cjIsIG5ld19zaXplKSA8IDApIHsKICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gVGhlIGVycm9yIGNhbm5vdCBiZSByZXBvcnRlZCB0bwogICAgICAgICAgICAgICAgdGhlIGNhbGxlciwgYmVjYXVzZSByZWFsbG9jKCkgbWF5IGFscmVhZHkgaGF2ZSBzaHJ1bmsgdGhlCiAgICAgICAgICAgICAgICBtZW1vcnkgYmxvY2sgYW5kIHNvIHJlbW92ZWQgYnl0ZXMuCkBAIC01MzIsNyArNzMyLDcgQEAKICAgICAgICAgLyogbmV3IGFsbG9jYXRpb24gKi8KIAogICAgICAgICBUQUJMRVNfTE9DSygpOwotICAgICAgICBpZiAodHJhY2VtYWxsb2NfYWRkX3RyYWNlKHB0cjIsIG5ld19zaXplKSA8IDApIHsKKyAgICAgICAgaWYgKEFERF9UUkFDRShwdHIyLCBuZXdfc2l6ZSkgPCAwKSB7CiAgICAgICAgICAgICAvKiBGYWlsZWQgdG8gYWxsb2NhdGUgYSB0cmFjZSBmb3IgdGhlIG5ldyBtZW1vcnkgYmxvY2sgKi8KICAgICAgICAgICAgIFRBQkxFU19VTkxPQ0soKTsKICAgICAgICAgICAgIGFsbG9jLT5mcmVlKGFsbG9jLT5jdHgsIHB0cjIpOwpAQCAtNTQzLDYgKzc0Myw3IEBACiAgICAgcmV0dXJuIHB0cjI7CiB9CiAKKwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX2ZyZWUodm9pZCAqY3R4LCB2b2lkICpwdHIpCiB7CkBAIC01NTcsMTAgKzc1OCwxMSBAQAogICAgIGFsbG9jLT5mcmVlKGFsbG9jLT5jdHgsIHB0cik7CiAKICAgICBUQUJMRVNfTE9DSygpOwotICAgIHRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShwdHIpOworICAgIFJFTU9WRV9UUkFDRShwdHIpOwogICAgIFRBQkxFU19VTkxPQ0soKTsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX2FsbG9jX2dpbChpbnQgdXNlX2NhbGxvYywgdm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCiB7CkBAIC01ODUsMTggKzc4NywyMSBAQAogICAgIHJldHVybiBwdHI7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19tYWxsb2NfZ2lsKHZvaWQgKmN0eCwgc2l6ZV90IHNpemUpCiB7CiAgICAgcmV0dXJuIHRyYWNlbWFsbG9jX2FsbG9jX2dpbCgwLCBjdHgsIDEsIHNpemUpOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfY2FsbG9jX2dpbCh2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKIHsKICAgICByZXR1cm4gdHJhY2VtYWxsb2NfYWxsb2NfZ2lsKDEsIGN0eCwgbmVsZW0sIGVsc2l6ZSk7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19yZWFsbG9jX2dpbCh2b2lkICpjdHgsIHZvaWQgKnB0ciwgc2l6ZV90IG5ld19zaXplKQogewpAQCAtNjEyLDcgKzgxNyw3IEBACiAgICAgICAgIHB0cjIgPSBhbGxvYy0+cmVhbGxvYyhhbGxvYy0+Y3R4LCBwdHIsIG5ld19zaXplKTsKICAgICAgICAgaWYgKHB0cjIgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgVEFCTEVTX0xPQ0soKTsKLSAgICAgICAgICAgIHRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShwdHIpOworICAgICAgICAgICAgUkVNT1ZFX1RSQUNFKHB0cik7CiAgICAgICAgICAgICBUQUJMRVNfVU5MT0NLKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHB0cjI7CkBAIC02MjksNiArODM0LDcgQEAKICAgICByZXR1cm4gcHRyMjsKIH0KIAorCiAjaWZkZWYgVFJBQ0VfUkFXX01BTExPQwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19yYXdfYWxsb2MoaW50IHVzZV9jYWxsb2MsIHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKQpAQCAtNjYzLDE4ICs4NjksMjEgQEAKICAgICByZXR1cm4gcHRyOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfcmF3X21hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBzaXplKQogewogICAgIHJldHVybiB0cmFjZW1hbGxvY19yYXdfYWxsb2MoMCwgY3R4LCAxLCBzaXplKTsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX3Jhd19jYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCiB7CiAgICAgcmV0dXJuIHRyYWNlbWFsbG9jX3Jhd19hbGxvYygxLCBjdHgsIG5lbGVtLCBlbHNpemUpOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfcmF3X3JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBuZXdfc2l6ZSkKIHsKQEAgLTY5MSw3ICs5MDAsNyBAQAogCiAgICAgICAgIGlmIChwdHIyICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpIHsKICAgICAgICAgICAgIFRBQkxFU19MT0NLKCk7Ci0gICAgICAgICAgICB0cmFjZW1hbGxvY19yZW1vdmVfdHJhY2UocHRyKTsKKyAgICAgICAgICAgIFJFTU9WRV9UUkFDRShwdHIpOwogICAgICAgICAgICAgVEFCTEVTX1VOTE9DSygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwdHIyOwpAQCAtNzE1LDIyICs5MjQsMzEgQEAKIH0KICNlbmRpZiAgIC8qIFRSQUNFX1JBV19NQUxMT0MgKi8KIAorCiBzdGF0aWMgaW50Ci10cmFjZW1hbGxvY19jbGVhcl9maWxlbmFtZShfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICp1c2VyX2RhdGEpCit0cmFjZW1hbGxvY19jbGVhcl9maWxlbmFtZShfUHlfaGFzaHRhYmxlX3QgKmh0LCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQogewotICAgIFB5T2JqZWN0ICpmaWxlbmFtZSA9IChQeU9iamVjdCAqKWVudHJ5LT5rZXk7CisgICAgUHlPYmplY3QgKmZpbGVuYW1lOworCisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWShodCwgZW50cnksIGZpbGVuYW1lKTsKICAgICBQeV9ERUNSRUYoZmlsZW5hbWUpOwogICAgIHJldHVybiAwOwogfQogCisKIHN0YXRpYyBpbnQKLXRyYWNlYmFja19mcmVlX3RyYWNlYmFjayhfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICp1c2VyX2RhdGEpCit0cmFjZWJhY2tfZnJlZV90cmFjZWJhY2soX1B5X2hhc2h0YWJsZV90ICpodCwgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCiB7Ci0gICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjayA9ICh0cmFjZWJhY2tfdCAqKWVudHJ5LT5rZXk7CisgICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazsKKworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoaHQsIGVudHJ5LCB0cmFjZWJhY2spOwogICAgIHJhd19mcmVlKHRyYWNlYmFjayk7CiAgICAgcmV0dXJuIDA7CiB9CiAKKwogLyogcmVlbnRyYW50IGZsYWcgbXVzdCBiZSBzZXQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFuZCBHSUwgbXVzdCBiZSBoZWxkICovCiBzdGF0aWMgdm9pZAogdHJhY2VtYWxsb2NfY2xlYXJfdHJhY2VzKHZvaWQpCkBAIC03NTMsNiArOTcxLDcgQEAKICAgICBfUHlfaGFzaHRhYmxlX2NsZWFyKHRyYWNlbWFsbG9jX2ZpbGVuYW1lcyk7CiB9CiAKKwogc3RhdGljIGludAogdHJhY2VtYWxsb2NfaW5pdCh2b2lkKQogewpAQCAtNzg5LDIxICsxMDA4LDI5IEBACiAgICAgfQogI2VuZGlmCiAKLSAgICB0cmFjZW1hbGxvY19maWxlbmFtZXMgPSBoYXNodGFibGVfbmV3KDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMpUHlPYmplY3RfSGFzaCwKKyAgICB0cmFjZW1hbGxvY19maWxlbmFtZXMgPSBoYXNodGFibGVfbmV3KHNpemVvZihQeU9iamVjdCAqKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9oYXNoX3B5b2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2NvbXBhcmVfdW5pY29kZSk7CiAKLSAgICB0cmFjZW1hbGxvY190cmFjZWJhY2tzID0gaGFzaHRhYmxlX25ldygwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYyloYXNodGFibGVfaGFzaF90cmFjZWJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jKWhhc2h0YWJsZV9jb21wYXJlX3RyYWNlYmFjayk7CisgICAgdHJhY2VtYWxsb2NfdHJhY2ViYWNrcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKHRyYWNlYmFja190ICopLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9oYXNoX3RyYWNlYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfY29tcGFyZV90cmFjZWJhY2spOwogCi0gICAgdHJhY2VtYWxsb2NfdHJhY2VzID0gaGFzaHRhYmxlX25ldyhzaXplb2YodHJhY2VfdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2RpcmVjdCk7CisgICAgaWYgKHRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKSB7CisgICAgICAgIHRyYWNlbWFsbG9jX3RyYWNlcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKHBvaW50ZXJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9oYXNoX3BvaW50ZXJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfY29tcGFyZV9wb2ludGVyX3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdHJhY2VtYWxsb2NfdHJhY2VzID0gaGFzaHRhYmxlX25ldyhzaXplb2YodWludHB0cl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KTsKKyAgICB9CiAKICAgICBpZiAodHJhY2VtYWxsb2NfZmlsZW5hbWVzID09IE5VTEwgfHwgdHJhY2VtYWxsb2NfdHJhY2ViYWNrcyA9PSBOVUxMCi0gICAgICAgIHx8IHRyYWNlbWFsbG9jX3RyYWNlcyA9PSBOVUxMKQotICAgIHsKKyAgICAgICB8fCB0cmFjZW1hbGxvY190cmFjZXMgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtODIzLDYgKzEwNTAsNyBAQAogICAgIHJldHVybiAwOwogfQogCisKIHN0YXRpYyB2b2lkCiB0cmFjZW1hbGxvY19kZWluaXQodm9pZCkKIHsKQEAgLTgzMyw5ICsxMDYxLDkgQEAKICAgICB0cmFjZW1hbGxvY19zdG9wKCk7CiAKICAgICAvKiBkZXN0cm95IGhhc2ggdGFibGVzICovCi0gICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KHRyYWNlbWFsbG9jX3RyYWNlcyk7CiAgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KHRyYWNlbWFsbG9jX3RyYWNlYmFja3MpOwogICAgIF9QeV9oYXNodGFibGVfZGVzdHJveSh0cmFjZW1hbGxvY19maWxlbmFtZXMpOworICAgIF9QeV9oYXNodGFibGVfZGVzdHJveSh0cmFjZW1hbGxvY190cmFjZXMpOwogCiAjaWYgZGVmaW5lZChXSVRIX1RIUkVBRCkgJiYgZGVmaW5lZChUUkFDRV9SQVdfTUFMTE9DKQogICAgIGlmICh0YWJsZXNfbG9jayAhPSBOVUxMKSB7CkBAIC04NDYsMTEgKzEwNzQsMTMgQEAKIAogI2lmZGVmIFJFRU5UUkFOVF9USFJFQURMT0NBTAogICAgIFB5VGhyZWFkX2RlbGV0ZV9rZXkodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSk7CisgICAgdHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSA9IC0xOwogI2VuZGlmCiAKICAgICBQeV9YREVDUkVGKHVua25vd25fZmlsZW5hbWUpOwogfQogCisKIHN0YXRpYyBpbnQKIHRyYWNlbWFsbG9jX3N0YXJ0KGludCBtYXhfbmZyYW1lKQogewpAQCAtOTA3LDYgKzExMzcsNyBAQAogICAgIHJldHVybiAwOwogfQogCisKIHN0YXRpYyB2b2lkCiB0cmFjZW1hbGxvY19zdG9wKHZvaWQpCiB7CkBAIC05MjMsOCArMTE1NCw5IEBACiAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9NRU0sICZhbGxvY2F0b3JzLm1lbSk7CiAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZhbGxvY2F0b3JzLm9iaik7CiAKLSAgICAvKiByZWxlYXNlIG1lbW9yeSAqLwogICAgIHRyYWNlbWFsbG9jX2NsZWFyX3RyYWNlcygpOworCisgICAgLyogcmVsZWFzZSBtZW1vcnkgKi8KICAgICByYXdfZnJlZSh0cmFjZW1hbGxvY190cmFjZWJhY2spOwogICAgIHRyYWNlbWFsbG9jX3RyYWNlYmFjayA9IE5VTEw7CiB9CkBAIC05MzUsNiArMTE2Nyw3IEBACiAgICAgIlRydWUgaWYgdGhlIHRyYWNlbWFsbG9jIG1vZHVsZSBpcyB0cmFjaW5nIFB5dGhvbiBtZW1vcnkgYWxsb2NhdGlvbnMsXG4iCiAgICAgIkZhbHNlIG90aGVyd2lzZS4iKTsKIAorCiBzdGF0aWMgUHlPYmplY3QqCiBweV90cmFjZW1hbGxvY19pc190cmFjaW5nKFB5T2JqZWN0ICpzZWxmKQogewpAQCAtOTQ2LDYgKzExNzksNyBAQAogICAgICJcbiIKICAgICAiQ2xlYXIgdHJhY2VzIG9mIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkIGJ5IFB5dGhvbi4iKTsKIAorCiBzdGF0aWMgUHlPYmplY3QqCiBweV90cmFjZW1hbGxvY19jbGVhcl90cmFjZXMoUHlPYmplY3QgKnNlbGYpCiB7CkBAIC05NTksNiArMTE5Myw3IEBACiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKKwogc3RhdGljIFB5T2JqZWN0KgogZnJhbWVfdG9fcHlvYmplY3QoZnJhbWVfdCAqZnJhbWUpCiB7CkBAIC05NjgsOCArMTIwMyw2IEBACiAgICAgaWYgKGZyYW1lX29iaiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChmcmFtZS0+ZmlsZW5hbWUgPT0gTlVMTCkKLSAgICAgICAgZnJhbWUtPmZpbGVuYW1lID0gUHlfTm9uZTsKICAgICBQeV9JTkNSRUYoZnJhbWUtPmZpbGVuYW1lKTsKICAgICBQeVR1cGxlX1NFVF9JVEVNKGZyYW1lX29iaiwgMCwgZnJhbWUtPmZpbGVuYW1lKTsKIApAQCAtOTgzLDYgKzEyMTYsNyBAQAogICAgIHJldHVybiBmcmFtZV9vYmo7CiB9CiAKKwogc3RhdGljIFB5T2JqZWN0KgogdHJhY2ViYWNrX3RvX3B5b2JqZWN0KHRyYWNlYmFja190ICp0cmFjZWJhY2ssIF9QeV9oYXNodGFibGVfdCAqaW50ZXJuX3RhYmxlKQogewpAQCAtMTAyMSwzMyArMTI1NSw0MyBAQAogICAgIHJldHVybiBmcmFtZXM7CiB9CiAKKwogc3RhdGljIFB5T2JqZWN0KgotdHJhY2VfdG9fcHlvYmplY3QodHJhY2VfdCAqdHJhY2UsIF9QeV9oYXNodGFibGVfdCAqaW50ZXJuX3RyYWNlYmFja3MpCit0cmFjZV90b19weW9iamVjdChfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sIHRyYWNlX3QgKnRyYWNlLAorICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV90ICppbnRlcm5fdHJhY2ViYWNrcykKIHsKICAgICBQeU9iamVjdCAqdHJhY2Vfb2JqID0gTlVMTDsKLSAgICBQeU9iamVjdCAqc2l6ZSwgKnRyYWNlYmFjazsKKyAgICBQeU9iamVjdCAqb2JqOwogCi0gICAgdHJhY2Vfb2JqID0gUHlUdXBsZV9OZXcoMik7CisgICAgdHJhY2Vfb2JqID0gUHlUdXBsZV9OZXcoMyk7CiAgICAgaWYgKHRyYWNlX29iaiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHNpemUgPSBQeUxvbmdfRnJvbVNpemVfdCh0cmFjZS0+c2l6ZSk7Ci0gICAgaWYgKHNpemUgPT0gTlVMTCkgeworICAgIG9iaiA9IFB5TG9uZ19Gcm9tU2l6ZV90KGRvbWFpbik7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRih0cmFjZV9vYmopOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlUdXBsZV9TRVRfSVRFTSh0cmFjZV9vYmosIDAsIHNpemUpOworICAgIFB5VHVwbGVfU0VUX0lURU0odHJhY2Vfb2JqLCAwLCBvYmopOwogCi0gICAgdHJhY2ViYWNrID0gdHJhY2ViYWNrX3RvX3B5b2JqZWN0KHRyYWNlLT50cmFjZWJhY2ssIGludGVybl90cmFjZWJhY2tzKTsKLSAgICBpZiAodHJhY2ViYWNrID09IE5VTEwpIHsKKyAgICBvYmogPSBQeUxvbmdfRnJvbVNpemVfdCh0cmFjZS0+c2l6ZSk7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRih0cmFjZV9vYmopOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlUdXBsZV9TRVRfSVRFTSh0cmFjZV9vYmosIDEsIHRyYWNlYmFjayk7CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0cmFjZV9vYmosIDEsIG9iaik7CisKKyAgICBvYmogPSB0cmFjZWJhY2tfdG9fcHlvYmplY3QodHJhY2UtPnRyYWNlYmFjaywgaW50ZXJuX3RyYWNlYmFja3MpOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodHJhY2Vfb2JqKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5VHVwbGVfU0VUX0lURU0odHJhY2Vfb2JqLCAyLCBvYmopOwogCiAgICAgcmV0dXJuIHRyYWNlX29iajsKIH0KIAorCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgX1B5X2hhc2h0YWJsZV90ICp0cmFjZXM7CiAgICAgX1B5X2hhc2h0YWJsZV90ICp0cmFjZWJhY2tzOwpAQCAtMTA1NSwxNiArMTI5OSwyNiBAQAogfSBnZXRfdHJhY2VzX3Q7CiAKIHN0YXRpYyBpbnQKLXRyYWNlbWFsbG9jX2dldF90cmFjZXNfZmlsbChfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICp1c2VyX2RhdGEpCit0cmFjZW1hbGxvY19nZXRfdHJhY2VzX2ZpbGwoX1B5X2hhc2h0YWJsZV90ICp0cmFjZXMsIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQogewogICAgIGdldF90cmFjZXNfdCAqZ2V0X3RyYWNlcyA9IHVzZXJfZGF0YTsKLSAgICB0cmFjZV90ICp0cmFjZTsKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW47CisgICAgdHJhY2VfdCB0cmFjZTsKICAgICBQeU9iamVjdCAqdHJhY2VtYWxsb2Nfb2JqOwogICAgIGludCByZXM7CiAKLSAgICB0cmFjZSA9ICh0cmFjZV90ICopX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBKGVudHJ5KTsKKyAgICBpZiAodHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pIHsKKyAgICAgICAgcG9pbnRlcl90IGtleTsKKyAgICAgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWSh0cmFjZXMsIGVudHJ5LCBrZXkpOworICAgICAgICBkb21haW4gPSBrZXkuZG9tYWluOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZG9tYWluID0gREVGQVVMVF9ET01BSU47CisgICAgfQorICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKHRyYWNlcywgZW50cnksIHRyYWNlKTsKIAotICAgIHRyYWNlbWFsbG9jX29iaiA9IHRyYWNlX3RvX3B5b2JqZWN0KHRyYWNlLCBnZXRfdHJhY2VzLT50cmFjZWJhY2tzKTsKKyAgICB0cmFjZW1hbGxvY19vYmogPSB0cmFjZV90b19weW9iamVjdChkb21haW4sICZ0cmFjZSwgZ2V0X3RyYWNlcy0+dHJhY2ViYWNrcyk7CiAgICAgaWYgKHRyYWNlbWFsbG9jX29iaiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gMTsKIApAQCAtMTA3NiwxNCArMTMzMCwxOSBAQAogICAgIHJldHVybiAwOwogfQogCisKIHN0YXRpYyBpbnQKLXRyYWNlbWFsbG9jX3B5b2JqZWN0X2RlY3JlZl9jYihfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICp1c2VyX2RhdGEpCit0cmFjZW1hbGxvY19weW9iamVjdF9kZWNyZWZfY2IoX1B5X2hhc2h0YWJsZV90ICp0cmFjZWJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQogewotICAgIFB5T2JqZWN0ICpvYmogPSAoUHlPYmplY3QgKilfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEFfQVNfVk9JRF9QKGVudHJ5KTsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKHRyYWNlYmFja3MsIGVudHJ5LCBvYmopOwogICAgIFB5X0RFQ1JFRihvYmopOwogICAgIHJldHVybiAwOwogfQogCisKIFB5RG9jX1NUUlZBUih0cmFjZW1hbGxvY19nZXRfdHJhY2VzX2RvYywKICAgICAiX2dldF90cmFjZXMoKSAtPiBsaXN0XG4iCiAgICAgIlxuIgpAQCAtMTExMCw3ICsxMzY5LDggQEAKIAogICAgIC8qIHRoZSB0cmFjZWJhY2sgaGFzaCB0YWJsZSBpcyB1c2VkIHRlbXBvcmFyaWx5IHRvIGludGVybiB0cmFjZWJhY2sgdHVwbGUKICAgICAgICBvZiAoZmlsZW5hbWUsIGxpbmVubykgdHVwbGVzICovCi0gICAgZ2V0X3RyYWNlcy50cmFjZWJhY2tzID0gaGFzaHRhYmxlX25ldyhzaXplb2YoUHlPYmplY3QgKiksCisgICAgZ2V0X3RyYWNlcy50cmFjZWJhY2tzID0gaGFzaHRhYmxlX25ldyhzaXplb2YodHJhY2ViYWNrX3QgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUHlPYmplY3QgKiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2RpcmVjdCk7CiAgICAgaWYgKGdldF90cmFjZXMudHJhY2ViYWNrcyA9PSBOVUxMKSB7CkBAIC0xMTQyLDE1ICsxNDAyLDQzIEBACiBmaW5hbGx5OgogICAgIGlmIChnZXRfdHJhY2VzLnRyYWNlYmFja3MgIT0gTlVMTCkgewogICAgICAgICBfUHlfaGFzaHRhYmxlX2ZvcmVhY2goZ2V0X3RyYWNlcy50cmFjZWJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlbWFsbG9jX3B5b2JqZWN0X2RlY3JlZl9jYiwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZW1hbGxvY19weW9iamVjdF9kZWNyZWZfY2IsIE5VTEwpOwogICAgICAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3koZ2V0X3RyYWNlcy50cmFjZWJhY2tzKTsKICAgICB9Ci0gICAgaWYgKGdldF90cmFjZXMudHJhY2VzICE9IE5VTEwpCisgICAgaWYgKGdldF90cmFjZXMudHJhY2VzICE9IE5VTEwpIHsKICAgICAgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KGdldF90cmFjZXMudHJhY2VzKTsKKyAgICB9CiAKICAgICByZXR1cm4gZ2V0X3RyYWNlcy5saXN0OwogfQogCisKK3N0YXRpYyB0cmFjZWJhY2tfdCoKK3RyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCB1aW50cHRyX3QgcHRyKQoreworICAgIHRyYWNlX3QgdHJhY2U7CisgICAgaW50IGZvdW5kOworCisgICAgaWYgKCF0cmFjZW1hbGxvY19jb25maWcudHJhY2luZykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBUQUJMRVNfTE9DSygpOworICAgIGlmICh0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbikgeworICAgICAgICBwb2ludGVyX3Qga2V5ID0ge3B0ciwgZG9tYWlufTsKKyAgICAgICAgZm91bmQgPSBfUHlfSEFTSFRBQkxFX0dFVCh0cmFjZW1hbGxvY190cmFjZXMsIGtleSwgdHJhY2UpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm91bmQgPSBfUHlfSEFTSFRBQkxFX0dFVCh0cmFjZW1hbGxvY190cmFjZXMsIHB0ciwgdHJhY2UpOworICAgIH0KKyAgICBUQUJMRVNfVU5MT0NLKCk7CisKKyAgICBpZiAoIWZvdW5kKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiB0cmFjZS50cmFjZWJhY2s7Cit9CisKKwogUHlEb2NfU1RSVkFSKHRyYWNlbWFsbG9jX2dldF9vYmplY3RfdHJhY2ViYWNrX2RvYywKICAgICAiX2dldF9vYmplY3RfdHJhY2ViYWNrKG9iailcbiIKICAgICAiXG4iCkBAIC0xMTY1LDExICsxNDUzLDcgQEAKIHsKICAgICBQeVR5cGVPYmplY3QgKnR5cGU7CiAgICAgdm9pZCAqcHRyOwotICAgIHRyYWNlX3QgdHJhY2U7Ci0gICAgaW50IGZvdW5kOwotCi0gICAgaWYgKCF0cmFjZW1hbGxvY19jb25maWcudHJhY2luZykKLSAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazsKIAogICAgIHR5cGUgPSBQeV9UWVBFKG9iaik7CiAgICAgaWYgKFB5VHlwZV9JU19HQyh0eXBlKSkKQEAgLTExNzcsMTYgKzE0NjEsNDggQEAKICAgICBlbHNlCiAgICAgICAgIHB0ciA9ICh2b2lkICopb2JqOwogCi0gICAgVEFCTEVTX0xPQ0soKTsKLSAgICBmb3VuZCA9IF9QeV9IQVNIVEFCTEVfR0VUKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyLCB0cmFjZSk7Ci0gICAgVEFCTEVTX1VOTE9DSygpOwotCi0gICAgaWYgKCFmb3VuZCkKKyAgICB0cmFjZWJhY2sgPSB0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrKERFRkFVTFRfRE9NQUlOLCAodWludHB0cl90KXB0cik7CisgICAgaWYgKHRyYWNlYmFjayA9PSBOVUxMKQogICAgICAgICBQeV9SRVRVUk5fTk9ORTsKIAotICAgIHJldHVybiB0cmFjZWJhY2tfdG9fcHlvYmplY3QodHJhY2UudHJhY2ViYWNrLCBOVUxMKTsKKyAgICByZXR1cm4gdHJhY2ViYWNrX3RvX3B5b2JqZWN0KHRyYWNlYmFjaywgTlVMTCk7CiB9CiAKKworI2RlZmluZSBQVVRTKGZkLCBzdHIpIF9QeV93cml0ZV9ub3JhaXNlKGZkLCBzdHIsIChpbnQpc3RybGVuKHN0cikpCisKK3N0YXRpYyB2b2lkCitfUHlNZW1fRHVtcEZyYW1lKGludCBmZCwgZnJhbWVfdCAqIGZyYW1lKQoreworICAgIFBVVFMoZmQsICIgIEZpbGUgXCIiKTsKKyAgICBfUHlfRHVtcEFTQ0lJKGZkLCBmcmFtZS0+ZmlsZW5hbWUpOworICAgIFBVVFMoZmQsICJcIiwgbGluZSAiKTsKKyAgICBfUHlfRHVtcERlY2ltYWwoZmQsIGZyYW1lLT5saW5lbm8pOworICAgIFBVVFMoZmQsICJcbiIpOworfQorCisvKiBEdW1wIHRoZSB0cmFjZWJhY2sgd2hlcmUgYSBtZW1vcnkgYmxvY2sgd2FzIGFsbG9jYXRlZCBpbnRvIGZpbGUgZGVzY3JpcHRvcgorICAgZmQuIFRoZSBmdW5jdGlvbiBtYXkgYmxvY2sgb24gVEFCTEVTX0xPQ0soKSBidXQgaXQgaXMgdW5saWtlbHkuICovCit2b2lkCitfUHlNZW1fRHVtcFRyYWNlYmFjayhpbnQgZmQsIGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOworICAgIGludCBpOworCisgICAgdHJhY2ViYWNrID0gdHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjayhERUZBVUxUX0RPTUFJTiwgKHVpbnRwdHJfdClwdHIpOworICAgIGlmICh0cmFjZWJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgUFVUUyhmZCwgIk1lbW9yeSBibG9jayBhbGxvY2F0ZWQgYXQgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOlxuIik7CisgICAgZm9yIChpPTA7IGkgPCB0cmFjZWJhY2stPm5mcmFtZTsgaSsrKSB7CisgICAgICAgIF9QeU1lbV9EdW1wRnJhbWUoZmQsICZ0cmFjZWJhY2stPmZyYW1lc1tpXSk7CisgICAgfQorICAgIFBVVFMoZmQsICJcbiIpOworfQorCisjdW5kZWYgUFVUUworCisKIFB5RG9jX1NUUlZBUih0cmFjZW1hbGxvY19zdGFydF9kb2MsCiAgICAgInN0YXJ0KG5mcmFtZTogaW50PTEpXG4iCiAgICAgIlxuIgpAQCAtMTIyMiw2ICsxNTM4LDcgQEAKICAgICAiU3RvcCB0cmFjaW5nIFB5dGhvbiBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIGNsZWFyIHRyYWNlc1xuIgogICAgICJvZiBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZCBieSBQeXRob24uIik7CiAKKwogc3RhdGljIFB5T2JqZWN0KgogcHlfdHJhY2VtYWxsb2Nfc3RvcChQeU9iamVjdCAqc2VsZikKIHsKQEAgLTEyMjksNiArMTU0Niw3IEBACiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKKwogUHlEb2NfU1RSVkFSKHRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2tfbGltaXRfZG9jLAogICAgICJnZXRfdHJhY2ViYWNrX2xpbWl0KCkgLT4gaW50XG4iCiAgICAgIlxuIgpAQCAtMTI0NCw2ICsxNTYyLDcgQEAKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHRyYWNlbWFsbG9jX2NvbmZpZy5tYXhfbmZyYW1lKTsKIH0KIAorCiBQeURvY19TVFJWQVIodHJhY2VtYWxsb2NfZ2V0X3RyYWNlbWFsbG9jX21lbW9yeV9kb2MsCiAgICAgImdldF90cmFjZW1hbGxvY19tZW1vcnkoKSAtPiBpbnRcbiIKICAgICAiXG4iCkBAIC0xMjY3LDYgKzE1ODYsNyBAQAogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOIiwgc2l6ZV9vYmopOwogfQogCisKIFB5RG9jX1NUUlZBUih0cmFjZW1hbGxvY19nZXRfdHJhY2VkX21lbW9yeV9kb2MsCiAgICAgImdldF90cmFjZWRfbWVtb3J5KCkgLT4gKGludCwgaW50KVxuIgogICAgICJcbiIKQEAgLTEyOTIsNiArMTYxMiw3IEBACiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk5OIiwgc2l6ZV9vYmosIHBlYWtfc2l6ZV9vYmopOwogfQogCisKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewogICAgIHsiaXNfdHJhY2luZyIsIChQeUNGdW5jdGlvbilweV90cmFjZW1hbGxvY19pc190cmFjaW5nLAogICAgICBNRVRIX05PQVJHUywgdHJhY2VtYWxsb2NfaXNfdHJhY2luZ19kb2N9LApAQCAtMTM0Miw2ICsxNjYzLDcgQEAKICAgICByZXR1cm4gbTsKIH0KIAorCiBzdGF0aWMgaW50CiBwYXJzZV9zeXNfeG9wdGlvbnMoUHlPYmplY3QgKnZhbHVlKQogewpAQCAtMTM3MCw2ICsxNjkyLDcgQEAKICAgICByZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChuZnJhbWUsIGxvbmcsIGludCk7CiB9CiAKKwogaW50CiBfUHlUcmFjZU1hbGxvY19Jbml0KHZvaWQpCiB7CkBAIC0xNDI4LDYgKzE3NTEsNyBAQAogICAgIHJldHVybiB0cmFjZW1hbGxvY19zdGFydChuZnJhbWUpOwogfQogCisKIHZvaWQKIF9QeVRyYWNlTWFsbG9jX0Zpbmkodm9pZCkKIHsKQEAgLTE0MzcsMyArMTc2MSw1OSBAQAogICAgIHRyYWNlbWFsbG9jX2RlaW5pdCgpOwogfQogCitpbnQKK19QeVRyYWNlTWFsbG9jX1RyYWNrKF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwgdWludHB0cl90IHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKQoreworICAgIGludCByZXM7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbF9zdGF0ZTsKKyNlbmRpZgorCisgICAgaWYgKCF0cmFjZW1hbGxvY19jb25maWcudHJhY2luZykgeworICAgICAgICAvKiB0cmFjZW1hbGxvYyBpcyBub3QgdHJhY2luZzogZG8gbm90aGluZyAqLworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBnaWxfc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworI2VuZGlmCisKKyAgICBUQUJMRVNfTE9DSygpOworICAgIHJlcyA9IHRyYWNlbWFsbG9jX2FkZF90cmFjZShkb21haW4sIHB0ciwgc2l6ZSk7CisgICAgVEFCTEVTX1VOTE9DSygpOworCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsX3N0YXRlKTsKKyNlbmRpZgorICAgIHJldHVybiByZXM7Cit9CisKKworaW50CitfUHlUcmFjZU1hbGxvY19VbnRyYWNrKF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwgdWludHB0cl90IHB0cikKK3sKKyAgICBpZiAoIXRyYWNlbWFsbG9jX2NvbmZpZy50cmFjaW5nKSB7CisgICAgICAgIC8qIHRyYWNlbWFsbG9jIGlzIG5vdCB0cmFjaW5nOiBkbyBub3RoaW5nICovCisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyAgICBUQUJMRVNfTE9DSygpOworICAgIHRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShkb21haW4sIHB0cik7CisgICAgVEFCTEVTX1VOTE9DSygpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworUHlPYmplY3QqCitfUHlUcmFjZU1hbGxvY19HZXRUcmFjZWJhY2soX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCB1aW50cHRyX3QgcHRyKQoreworICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CisKKyAgICB0cmFjZWJhY2sgPSB0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrKGRvbWFpbiwgcHRyKTsKKyAgICBpZiAodHJhY2ViYWNrID09IE5VTEwpCisgICAgICAgIFB5X1JFVFVSTl9OT05FOworCisgICAgcmV0dXJuIHRyYWNlYmFja190b19weW9iamVjdCh0cmFjZWJhY2ssIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fd2luYXBpLmMgYi9Nb2R1bGVzL193aW5hcGkuYwppbmRleCBlZGM2Y2Y0Li45MWQ0ZjAxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL193aW5hcGkuYworKysgYi9Nb2R1bGVzL193aW5hcGkuYwpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgICAgIHNlbGYuZGVjbGFyZShkYXRhKQogICAgICAgICBzZWxmLmVycl9vY2N1cnJlZF9pZigiX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSIsIGRhdGEpCiAgICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKAotICAgICAgICAgICAgJ2lmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpXG4gICAgUHlfUkVUVVJOX05PTkU7XG4nKQorICAgICAgICAgICAgJ2lmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHtcbiAgICBQeV9SRVRVUk5fTk9ORTtcbn1cbicpCiAgICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKAogICAgICAgICAgICAgJ3JldHVybl92YWx1ZSA9IEhBTkRMRV9UT19QWU5VTShfcmV0dXJuX3ZhbHVlKTtcbicpCiAKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgICAgICBkYXRhLnJldHVybl9jb252ZXJzaW9uLmFwcGVuZCgKICAgICAgICAgICAgICdyZXR1cm5fdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCJrIiwgX3JldHVybl92YWx1ZSk7XG4nKQogW3B5dGhvbiBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwotLypbcHl0aG9uIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9Mzc0MDc2OTc5NTk2ZWJiYV0qLworLypbcHl0aG9uIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9OTQ4MTllNzJkMmM2ZDU1OF0qLwogCiAjaW5jbHVkZSAiY2xpbmljL193aW5hcGkuYy5oIgogCkBAIC00ODYsNyArNDg2LDcgQEAKICAgICBjb25zdCBVU0hPUlQgcHJlZml4X2xlbiA9IDQ7CiAgICAgVVNIT1JUIHByaW50X2xlbiA9IDA7CiAgICAgVVNIT1JUIHJkYl9zaXplID0gMDsKLSAgICBQUkVQQVJTRV9EQVRBX0JVRkZFUiByZGIgPSBOVUxMOworICAgIF9QeV9QUkVQQVJTRV9EQVRBX0JVRkZFUiByZGIgPSBOVUxMOwogCiAgICAgLyogSnVuY3Rpb24gcG9pbnQgY3JlYXRpb24gKi8KICAgICBIQU5ETEUganVuY3Rpb24gPSBOVUxMOwpAQCAtNTQyLDE4ICs1NDIsMTggQEAKICAgICAgICAgIC0gdGhlIHNpemUgb2YgdGhlIHByaW50IG5hbWUgaW4gYnl0ZXMKICAgICAgICAgIC0gdGhlIHNpemUgb2YgdGhlIHN1YnN0aXR1dGUgbmFtZSBpbiBieXRlcwogICAgICAgICAgLSB0aGUgc2l6ZSBvZiB0d28gTlVMIHRlcm1pbmF0b3JzIGluIGJ5dGVzICovCi0gICAgcmRiX3NpemUgPSBSRVBBUlNFX0RBVEFfQlVGRkVSX0hFQURFUl9TSVpFICsKKyAgICByZGJfc2l6ZSA9IF9QeV9SRVBBUlNFX0RBVEFfQlVGRkVSX0hFQURFUl9TSVpFICsKICAgICAgICAgc2l6ZW9mKHJkYi0+TW91bnRQb2ludFJlcGFyc2VCdWZmZXIpIC0KICAgICAgICAgc2l6ZW9mKHJkYi0+TW91bnRQb2ludFJlcGFyc2VCdWZmZXIuUGF0aEJ1ZmZlcikgKwogICAgICAgICAvKiBUd28gKzEncyBmb3IgTlVMIHRlcm1pbmF0b3JzLiAqLwogICAgICAgICAocHJlZml4X2xlbiArIHByaW50X2xlbiArIDEgKyBwcmludF9sZW4gKyAxKSAqIHNpemVvZihXQ0hBUik7Ci0gICAgcmRiID0gKFBSRVBBUlNFX0RBVEFfQlVGRkVSKVB5TWVtX1Jhd01hbGxvYyhyZGJfc2l6ZSk7CisgICAgcmRiID0gKF9QeV9QUkVQQVJTRV9EQVRBX0JVRkZFUilQeU1lbV9SYXdNYWxsb2MocmRiX3NpemUpOwogICAgIGlmIChyZGIgPT0gTlVMTCkKICAgICAgICAgZ290byBjbGVhbnVwOwogCiAgICAgbWVtc2V0KHJkYiwgMCwgcmRiX3NpemUpOwogICAgIHJkYi0+UmVwYXJzZVRhZyA9IElPX1JFUEFSU0VfVEFHX01PVU5UX1BPSU5UOwotICAgIHJkYi0+UmVwYXJzZURhdGFMZW5ndGggPSByZGJfc2l6ZSAtIFJFUEFSU0VfREFUQV9CVUZGRVJfSEVBREVSX1NJWkU7CisgICAgcmRiLT5SZXBhcnNlRGF0YUxlbmd0aCA9IHJkYl9zaXplIC0gX1B5X1JFUEFSU0VfREFUQV9CVUZGRVJfSEVBREVSX1NJWkU7CiAgICAgcmRiLT5Nb3VudFBvaW50UmVwYXJzZUJ1ZmZlci5TdWJzdGl0dXRlTmFtZU9mZnNldCA9IDA7CiAgICAgcmRiLT5Nb3VudFBvaW50UmVwYXJzZUJ1ZmZlci5TdWJzdGl0dXRlTmFtZUxlbmd0aCA9CiAgICAgICAgIChwcmVmaXhfbGVuICsgcHJpbnRfbGVuKSAqIHNpemVvZihXQ0hBUik7CkBAIC02NzQsNyArNjc0LDcgQEAKIC8qIGhlbHBlcnMgZm9yIGNyZWF0ZXByb2Nlc3MgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldHVsb25nKFB5T2JqZWN0KiBvYmosIGNoYXIqIG5hbWUpCitnZXR1bG9uZyhQeU9iamVjdCogb2JqLCBjb25zdCBjaGFyKiBuYW1lKQogewogICAgIFB5T2JqZWN0KiB2YWx1ZTsKICAgICB1bnNpZ25lZCBsb25nIHJldDsKQEAgLTY5MCw3ICs2OTAsNyBAQAogfQogCiBzdGF0aWMgSEFORExFCi1nZXRoYW5kbGUoUHlPYmplY3QqIG9iaiwgY2hhciogbmFtZSkKK2dldGhhbmRsZShQeU9iamVjdCogb2JqLCBjb25zdCBjaGFyKiBuYW1lKQogewogICAgIFB5T2JqZWN0KiB2YWx1ZTsKICAgICBIQU5ETEUgcmV0OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hZGRyaW5mby5oIGIvTW9kdWxlcy9hZGRyaW5mby5oCmluZGV4IDFjYjZmMGUuLmMzYzg2MjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYWRkcmluZm8uaAorKysgYi9Nb2R1bGVzL2FkZHJpbmZvLmgKQEAgLTE0MSwxMSArMTQxLDcgQEAKICAqIFJGQyAyNTUzOiBwcm90b2NvbC1pbmRlcGVuZGVudCBwbGFjZWhvbGRlciBmb3Igc29ja2V0IGFkZHJlc3NlcwogICovCiAjZGVmaW5lIF9TU19NQVhTSVpFICAgICAxMjgKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotI2RlZmluZSBfU1NfQUxJR05TSVpFICAgKHNpemVvZihQWV9MT05HX0xPTkcpKQotI2Vsc2UKLSNkZWZpbmUgX1NTX0FMSUdOU0laRSAgIChzaXplb2YoZG91YmxlKSkKLSNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLworI2RlZmluZSBfU1NfQUxJR05TSVpFICAgKHNpemVvZihsb25nIGxvbmcpKQogI2RlZmluZSBfU1NfUEFEMVNJWkUgICAgKF9TU19BTElHTlNJWkUgLSBzaXplb2YodV9jaGFyKSAqIDIpCiAjZGVmaW5lIF9TU19QQUQyU0laRSAgICAoX1NTX01BWFNJWkUgLSBzaXplb2YodV9jaGFyKSAqIDIgLSBcCiAgICAgICAgICAgICAgICAgX1NTX1BBRDFTSVpFIC0gX1NTX0FMSUdOU0laRSkKQEAgLTE1OCwxMSArMTU0LDcgQEAKICAgICB1bnNpZ25lZCBzaG9ydCBzc19mYW1pbHk7ICAgICAgICAgICAvKiBhZGRyZXNzIGZhbWlseSAqLwogI2VuZGlmIC8qIEhBVkVfU09DS0FERFJfU0FfTEVOICovCiAgICAgY2hhciAgICAgICAgX19zc19wYWQxW19TU19QQUQxU0laRV07Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICBQWV9MT05HX0xPTkcgX19zc19hbGlnbjsgICAgICAgICAgICAvKiBmb3JjZSBkZXNpcmVkIHN0cnVjdHVyZSBzdG9yYWdlIGFsaWdubWVudCAqLwotI2Vsc2UKLSAgICBkb3VibGUgX19zc19hbGlnbjsgICAgICAgICAgLyogZm9yY2UgZGVzaXJlZCBzdHJ1Y3R1cmUgc3RvcmFnZSBhbGlnbm1lbnQgKi8KLSNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLworICAgIGxvbmcgbG9uZyBfX3NzX2FsaWduOyAgICAgICAgICAgIC8qIGZvcmNlIGRlc2lyZWQgc3RydWN0dXJlIHN0b3JhZ2UgYWxpZ25tZW50ICovCiAgICAgY2hhciAgICAgICAgX19zc19wYWQyW19TU19QQUQyU0laRV07CiB9OwogI2VuZGlmIC8qICFIQVZFX1NPQ0tBRERSX1NUT1JBR0UgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvYXJyYXltb2R1bGUuYyBiL01vZHVsZXMvYXJyYXltb2R1bGUuYwppbmRleCBhNDk2NmI0Li41ODY4YzUyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCkBAIC0zMSw3ICszMSw3IEBACiAgICAgaW50IGl0ZW1zaXplOwogICAgIFB5T2JqZWN0ICogKCpnZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCk7CiAgICAgaW50ICgqc2V0aXRlbSkoc3RydWN0IGFycmF5b2JqZWN0ICosIFB5X3NzaXplX3QsIFB5T2JqZWN0ICopOwotICAgIGNoYXIgKmZvcm1hdHM7CisgICAgY29uc3QgY2hhciAqZm9ybWF0czsKICAgICBpbnQgaXNfaW50ZWdlcl90eXBlOwogICAgIGludCBpc19zaWduZWQ7CiB9OwpAQCAtNDAsNyArNDAsNyBAQAogICAgIFB5T2JqZWN0X1ZBUl9IRUFECiAgICAgY2hhciAqb2JfaXRlbTsKICAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsKLSAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqb2JfZGVzY3I7CisgICAgY29uc3Qgc3RydWN0IGFycmF5ZGVzY3IgKm9iX2Rlc2NyOwogICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KICAgICBpbnQgb2JfZXhwb3J0czsgIC8qIE51bWJlciBvZiBleHBvcnRlZCBidWZmZXJzICovCiB9IGFycmF5b2JqZWN0OwpAQCAtNDE4LDIyICs0MTgsMjAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0KIHN0YXRpYyBQeU9iamVjdCAqCiBxX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKChQWV9MT05HX0xPTkcgKilhcC0+b2JfaXRlbSlbaV0pOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKCgobG9uZyBsb25nICopYXAtPm9iX2l0ZW0pW2ldKTsKIH0KIAogc3RhdGljIGludAogcV9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLSAgICBQWV9MT05HX0xPTkcgeDsKKyAgICBsb25nIGxvbmcgeDsKICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJMO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgaWYgKGkgPj0gMCkKLSAgICAgICAgKChQWV9MT05HX0xPTkcgKilhcC0+b2JfaXRlbSlbaV0gPSB4OworICAgICAgICAoKGxvbmcgbG9uZyAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTQ0MSwyMCArNDM5LDIwIEBACiBRUV9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewogICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoCi0gICAgICAgICgodW5zaWduZWQgUFlfTE9OR19MT05HICopYXAtPm9iX2l0ZW0pW2ldKTsKKyAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcgKilhcC0+b2JfaXRlbSlbaV0pOwogfQogCiBzdGF0aWMgaW50CiBRUV9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgeDsKICAgICBpZiAoUHlMb25nX0NoZWNrKHYpKSB7CiAgICAgICAgIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKHYpOwotICAgICAgICBpZiAoeCA9PSAodW5zaWduZWQgUFlfTE9OR19MT05HKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZyBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgUFlfTE9OR19MT05HIHk7CisgICAgICAgIGxvbmcgbG9uZyB5OwogICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJMO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJnkpKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICBpZiAoeSA8IDApIHsKQEAgLTQ2MiwxNCArNDYwLDEzIEBACiAgICAgICAgICAgICAgICAgInVuc2lnbmVkIGxvbmcgbG9uZyBpcyBsZXNzIHRoYW4gbWluaW11bSIpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIHggPSAodW5zaWduZWQgUFlfTE9OR19MT05HKXk7CisgICAgICAgIHggPSAodW5zaWduZWQgbG9uZyBsb25nKXk7CiAgICAgfQogCiAgICAgaWYgKGkgPj0gMCkKLSAgICAgICAgKCh1bnNpZ25lZCBQWV9MT05HX0xPTkcgKilhcC0+b2JfaXRlbSlbaV0gPSB4OworICAgICAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CiAgICAgcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKQEAgLTUxMSw3ICs1MDgsNyBAQAogICogRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB0eXBlY29kZV90b19tZm9ybWF0X2NvZGUoKSBpZiB5b3UgYWRkIGEgbmV3CiAgKiB0eXBlY29kZS4KICAqLwotc3RhdGljIHN0cnVjdCBhcnJheWRlc2NyIGRlc2NyaXB0b3JzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFycmF5ZGVzY3IgZGVzY3JpcHRvcnNbXSA9IHsKICAgICB7J2InLCAxLCBiX2dldGl0ZW0sIGJfc2V0aXRlbSwgImIiLCAxLCAxfSwKICAgICB7J0InLCAxLCBCQl9nZXRpdGVtLCBCQl9zZXRpdGVtLCAiQiIsIDEsIDB9LAogICAgIHsndScsIHNpemVvZihQeV9VTklDT0RFKSwgdV9nZXRpdGVtLCB1X3NldGl0ZW0sICJ1IiwgMCwgMH0sCkBAIC01MjEsMTAgKzUxOCw4IEBACiAgICAgeydJJywgc2l6ZW9mKGludCksIElJX2dldGl0ZW0sIElJX3NldGl0ZW0sICJJIiwgMSwgMH0sCiAgICAgeydsJywgc2l6ZW9mKGxvbmcpLCBsX2dldGl0ZW0sIGxfc2V0aXRlbSwgImwiLCAxLCAxfSwKICAgICB7J0wnLCBzaXplb2YobG9uZyksIExMX2dldGl0ZW0sIExMX3NldGl0ZW0sICJMIiwgMSwgMH0sCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICB7J3EnLCBzaXplb2YoUFlfTE9OR19MT05HKSwgcV9nZXRpdGVtLCBxX3NldGl0ZW0sICJxIiwgMSwgMX0sCi0gICAgeydRJywgc2l6ZW9mKFBZX0xPTkdfTE9ORyksIFFRX2dldGl0ZW0sIFFRX3NldGl0ZW0sICJRIiwgMSwgMH0sCi0jZW5kaWYKKyAgICB7J3EnLCBzaXplb2YobG9uZyBsb25nKSwgcV9nZXRpdGVtLCBxX3NldGl0ZW0sICJxIiwgMSwgMX0sCisgICAgeydRJywgc2l6ZW9mKGxvbmcgbG9uZyksIFFRX2dldGl0ZW0sIFFRX3NldGl0ZW0sICJRIiwgMSwgMH0sCiAgICAgeydmJywgc2l6ZW9mKGZsb2F0KSwgZl9nZXRpdGVtLCBmX3NldGl0ZW0sICJmIiwgMCwgMH0sCiAgICAgeydkJywgc2l6ZW9mKGRvdWJsZSksIGRfZ2V0aXRlbSwgZF9zZXRpdGVtLCAiZCIsIDAsIDB9LAogICAgIHsnXDAnLCAwLCAwLCAwLCAwLCAwLCAwfSAvKiBTZW50aW5lbCAqLwpAQCAtNTM5LDcgKzUzNCw3IEBACiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD1hZDQzZDM3ZTk0MmE4ODU0XSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1uZXdhcnJheW9iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgc2l6ZSwgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyKQorbmV3YXJyYXlvYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcikKIHsKICAgICBhcnJheW9iamVjdCAqb3A7CiAgICAgc2l6ZV90IG5ieXRlczsKQEAgLTg1MiwzNyArODQ3LDEwIEBACiB9CiAKIHN0YXRpYyBpbnQKLWFycmF5X2Fzc19zbGljZShhcnJheW9iamVjdCAqYSwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoLCBQeU9iamVjdCAqdikKK2FycmF5X2RlbF9zbGljZShhcnJheW9iamVjdCAqYSwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoKQogewogICAgIGNoYXIgKml0ZW07Ci0gICAgUHlfc3NpemVfdCBuOyAvKiBTaXplIG9mIHJlcGxhY2VtZW50IGFycmF5ICovCiAgICAgUHlfc3NpemVfdCBkOyAvKiBDaGFuZ2UgaW4gc2l6ZSAqLwotI2RlZmluZSBiICgoYXJyYXlvYmplY3QgKil2KQotICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgIG4gPSAwOwotICAgIGVsc2UgaWYgKGFycmF5X0NoZWNrKHYpKSB7Ci0gICAgICAgIG4gPSBQeV9TSVpFKGIpOwotICAgICAgICBpZiAoYSA9PSBiKSB7Ci0gICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2UgImFbaTpqXSA9IGEiIC0tIGNvcHkgYiBmaXJzdCAqLwotICAgICAgICAgICAgaW50IHJldDsKLSAgICAgICAgICAgIHYgPSBhcnJheV9zbGljZShiLCAwLCBuKTsKLSAgICAgICAgICAgIGlmICghdikKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICByZXQgPSBhcnJheV9hc3Nfc2xpY2UoYSwgaWxvdywgaWhpZ2gsIHYpOwotICAgICAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYi0+b2JfZGVzY3IgIT0gYS0+b2JfZGVzY3IpIHsKLSAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAiY2FuIG9ubHkgYXNzaWduIGFycmF5IChub3QgXCIlLjIwMHNcIikgdG8gYXJyYXkgc2xpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQogICAgIGlmIChpbG93IDwgMCkKICAgICAgICAgaWxvdyA9IDA7CiAgICAgZWxzZSBpZiAoaWxvdyA+IFB5X1NJWkUoYSkpCkBAIC04OTQsNyArODYyLDcgQEAKICAgICBlbHNlIGlmIChpaGlnaCA+IFB5X1NJWkUoYSkpCiAgICAgICAgIGloaWdoID0gUHlfU0laRShhKTsKICAgICBpdGVtID0gYS0+b2JfaXRlbTsKLSAgICBkID0gbiAtIChpaGlnaC1pbG93KTsKKyAgICBkID0gaWhpZ2gtaWxvdzsKICAgICAvKiBJc3N1ZSAjNDUwOTogSWYgdGhlIGFycmF5IGhhcyBleHBvcnRlZCBidWZmZXJzIGFuZCB0aGUgc2xpY2UKICAgICAgICBhc3NpZ25tZW50IHdvdWxkIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgYXJyYXksIGZhaWwgZWFybHkgdG8gbWFrZQogICAgICAgIHN1cmUgd2UgZG9uJ3QgbW9kaWZ5IGl0LiAqLwpAQCAtOTAzLDI1ICs4NzEsMTQgQEAKICAgICAgICAgICAgICJjYW5ub3QgcmVzaXplIGFuIGFycmF5IHRoYXQgaXMgZXhwb3J0aW5nIGJ1ZmZlcnMiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBpZiAoZCA8IDApIHsgLyogRGVsZXRlIC1kIGl0ZW1zICovCi0gICAgICAgIG1lbW1vdmUoaXRlbSArIChpaGlnaCtkKSphLT5vYl9kZXNjci0+aXRlbXNpemUsCisgICAgaWYgKGQgPiAwKSB7IC8qIERlbGV0ZSBkIGl0ZW1zICovCisgICAgICAgIG1lbW1vdmUoaXRlbSArIChpaGlnaC1kKSphLT5vYl9kZXNjci0+aXRlbXNpemUsCiAgICAgICAgICAgICBpdGVtICsgaWhpZ2gqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAogICAgICAgICAgICAgKFB5X1NJWkUoYSktaWhpZ2gpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0gICAgICAgIGlmIChhcnJheV9yZXNpemUoYSwgUHlfU0laRShhKSArIGQpID09IC0xKQorICAgICAgICBpZiAoYXJyYXlfcmVzaXplKGEsIFB5X1NJWkUoYSkgLSBkKSA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgZWxzZSBpZiAoZCA+IDApIHsgLyogSW5zZXJ0IGQgaXRlbXMgKi8KLSAgICAgICAgaWYgKGFycmF5X3Jlc2l6ZShhLCBQeV9TSVpFKGEpICsgZCkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIG1lbW1vdmUoaXRlbSArIChpaGlnaCtkKSphLT5vYl9kZXNjci0+aXRlbXNpemUsCi0gICAgICAgICAgICBpdGVtICsgaWhpZ2gqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAotICAgICAgICAgICAgKFB5X1NJWkUoYSktaWhpZ2gpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0gICAgfQotICAgIGlmIChuID4gMCkKLSAgICAgICAgbWVtY3B5KGl0ZW0gKyBpbG93KmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwgYi0+b2JfaXRlbSwKLSAgICAgICAgICAgICAgIG4qYi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKICAgICByZXR1cm4gMDsKLSN1bmRlZiBiCiB9CiAKIHN0YXRpYyBpbnQKQEAgLTkzMyw3ICs4OTAsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBhcnJheV9hc3Nfc2xpY2UoYSwgaSwgaSsxLCB2KTsKKyAgICAgICAgcmV0dXJuIGFycmF5X2RlbF9zbGljZShhLCBpLCBpKzEpOwogICAgIHJldHVybiAoKmEtPm9iX2Rlc2NyLT5zZXRpdGVtKShhLCBpLCB2KTsKIH0KIApAQCAtMTE2Myw4ICsxMTIwLDcgQEAKICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGZpLCB2LCBQeV9FUSk7CiAgICAgICAgIFB5X0RFQ1JFRihzZWxmaSk7CiAgICAgICAgIGlmIChjbXAgPiAwKSB7Ci0gICAgICAgICAgICBpZiAoYXJyYXlfYXNzX3NsaWNlKHNlbGYsIGksIGkrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilOVUxMKSAhPSAwKQorICAgICAgICAgICAgaWYgKGFycmF5X2RlbF9zbGljZShzZWxmLCBpLCBpKzEpICE9IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTEyMDcsNyArMTE2Myw3IEBACiAgICAgdiA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLCBpKTsKICAgICBpZiAodiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoYXJyYXlfYXNzX3NsaWNlKHNlbGYsIGksIGkrMSwgKFB5T2JqZWN0ICopTlVMTCkgIT0gMCkgeworICAgIGlmIChhcnJheV9kZWxfc2xpY2Uoc2VsZiwgaSwgaSsxKSAhPSAwKSB7CiAgICAgICAgIFB5X0RFQ1JFRih2KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTg2MSwxNiArMTgxNywxNCBAQAogICAgICAgICBpbnRzaXplID0gc2l6ZW9mKGxvbmcpOwogICAgICAgICBpc19zaWduZWQgPSAwOwogICAgICAgICBicmVhazsKLSNpZiBIQVZFX0xPTkdfTE9ORwogICAgIGNhc2UgJ3EnOgotICAgICAgICBpbnRzaXplID0gc2l6ZW9mKFBZX0xPTkdfTE9ORyk7CisgICAgICAgIGludHNpemUgPSBzaXplb2YobG9uZyBsb25nKTsKICAgICAgICAgaXNfc2lnbmVkID0gMTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAnUSc6Ci0gICAgICAgIGludHNpemUgPSBzaXplb2YoUFlfTE9OR19MT05HKTsKKyAgICAgICAgaW50c2l6ZSA9IHNpemVvZihsb25nIGxvbmcpOwogICAgICAgICBpc19zaWduZWQgPSAwOwogICAgICAgICBicmVhazsKLSNlbmRpZgogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBVTktOT1dOX0ZPUk1BVDsKICAgICB9CkBAIC0xOTU0LDcgKzE5MDgsNyBAQAogewogICAgIFB5T2JqZWN0ICpjb252ZXJ0ZWRfaXRlbXM7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKLSAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CisgICAgY29uc3Qgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOwogCiAgICAgaWYgKCFQeVR5cGVfQ2hlY2soYXJyYXl0eXBlKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLApAQCAtMjA5Miw3ICsyMDQ2LDcgQEAKICAgICAgICAgUHlfc3NpemVfdCBpdGVtY291bnQgPSBQeV9TSVpFKGl0ZW1zKSAvIG1mX2Rlc2NyLnNpemU7CiAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1lbXN0ciA9CiAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKGl0ZW1zKTsKLSAgICAgICAgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOworICAgICAgICBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CiAKICAgICAgICAgLyogSWYgcG9zc2libGUsIHRyeSB0byBwYWNrIGFycmF5J3MgaXRlbXMgdXNpbmcgYSBkYXRhIHR5cGUKICAgICAgICAgICogdGhhdCBmaXRzIGJldHRlci4gVGhpcyBtYXkgcmVzdWx0IGluIGFuIGFycmF5IHdpdGggbmFycm93ZXIKQEAgLTI1NjIsNyArMjUxNiw3IEBACiAgICAgdmlldy0+Zm9ybWF0ID0gTlVMTDsKICAgICB2aWV3LT5pbnRlcm5hbCA9IE5VTEw7CiAgICAgaWYgKChmbGFncyAmIFB5QlVGX0ZPUk1BVCkgPT0gUHlCVUZfRk9STUFUKSB7Ci0gICAgICAgIHZpZXctPmZvcm1hdCA9IHNlbGYtPm9iX2Rlc2NyLT5mb3JtYXRzOworICAgICAgICB2aWV3LT5mb3JtYXQgPSAoY2hhciAqKXNlbGYtPm9iX2Rlc2NyLT5mb3JtYXRzOwogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgICAgICBpZiAoc2VsZi0+b2JfZGVzY3ItPnR5cGVjb2RlID09ICd1JykgewogICAgICAgICAgICAgdmlldy0+Zm9ybWF0ID0gInciOwpAQCAtMjYwMyw3ICsyNTU3LDcgQEAKIHsKICAgICBpbnQgYzsKICAgICBQeU9iamVjdCAqaW5pdGlhbCA9IE5VTEwsICppdCA9IE5VTEw7Ci0gICAgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOworICAgIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKIAogICAgIGlmICh0eXBlID09ICZBcnJheXR5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJhcnJheS5hcnJheSgpIiwga3dkcykpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjczMiwxMSArMjY4Niw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgICAgICAgImJhZCB0eXBlY29kZSAobXVzdCBiZSBiLCBCLCB1LCBoLCBILCBpLCBJLCBsLCBMLCBxLCBRLCBmIG9yIGQpIik7Ci0jZWxzZQotICAgICAgICAiYmFkIHR5cGVjb2RlIChtdXN0IGJlIGIsIEIsIHUsIGgsIEgsIGksIEksIGwsIEwsIGYgb3IgZCkiKTsKLSNlbmRpZgogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0yODgzLDkgKzI4MzMsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheWl0ZXJfbmV4dChhcnJheWl0ZXJvYmplY3QgKml0KQogeworICAgIGFycmF5b2JqZWN0ICphbzsKKworICAgIGFzc2VydChpdCAhPSBOVUxMKTsKICAgICBhc3NlcnQoUHlBcnJheUl0ZXJfQ2hlY2soaXQpKTsKLSAgICBpZiAoaXQtPmluZGV4IDwgUHlfU0laRShpdC0+YW8pKQotICAgICAgICByZXR1cm4gKCppdC0+Z2V0aXRlbSkoaXQtPmFvLCBpdC0+aW5kZXgrKyk7CisgICAgYW8gPSBpdC0+YW87CisgICAgaWYgKGFvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzc2VydChhcnJheV9DaGVjayhhbykpOworICAgIGlmIChpdC0+aW5kZXggPCBQeV9TSVpFKGFvKSkgeworICAgICAgICByZXR1cm4gKCppdC0+Z2V0aXRlbSkoYW8sIGl0LT5pbmRleCsrKTsKKyAgICB9CisgICAgaXQtPmFvID0gTlVMTDsKKyAgICBQeV9ERUNSRUYoYW8pOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0yOTE0LDggKzI4NzUsMTEgQEAKIGFycmF5X2FycmF5aXRlcmF0b3JfX19yZWR1Y2VfX19pbXBsKGFycmF5aXRlcm9iamVjdCAqc2VsZikKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03ODk4YTUyZThlNjZlMDE2IGlucHV0PWEwNjJlYTFlOTk1MTQxN2FdKi8KIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTihPKW4iLCBfUHlPYmplY3RfR2V0QnVpbHRpbigiaXRlciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmFvLCBzZWxmLT5pbmRleCk7CisgICAgUHlPYmplY3QgKmZ1bmMgPSBfUHlPYmplY3RfR2V0QnVpbHRpbigiaXRlciIpOworICAgIGlmIChzZWxmLT5hbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOKCgpKSIsIGZ1bmMpOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTihPKW4iLCBmdW5jLCBzZWxmLT5hbywgc2VsZi0+aW5kZXgpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCkBAIC0yOTk1LDcgKzI5NTksNyBAQAogICAgIGNoYXIgYnVmZmVyW1B5X0FSUkFZX0xFTkdUSChkZXNjcmlwdG9ycyldLCAqcDsKICAgICBQeU9iamVjdCAqdHlwZWNvZGVzOwogICAgIFB5X3NzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOworICAgIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKIAogICAgIGlmIChQeVR5cGVfUmVhZHkoJkFycmF5dHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2F1ZGlvb3AuYyBiL01vZHVsZXMvYXVkaW9vcC5jCmluZGV4IDFlMTMxZDIuLjNmMzFhMmIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXVkaW9vcC5jCisrKyBiL01vZHVsZXMvYXVkaW9vcC5jCkBAIC01LDggKzUsNiBAQAogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKLXR5cGVkZWYgc2hvcnQgUHlJbnQxNjsKLQogI2lmIGRlZmluZWQoX19DSEFSX1VOU0lHTkVEX18pCiAjaWYgZGVmaW5lZChzaWduZWQpCiAvKiBUaGlzIG1vZHVsZSBjdXJyZW50bHkgZG9lcyBub3Qgd29yayBvbiBzeXN0ZW1zIHdoZXJlIG9ubHkgdW5zaWduZWQKQEAgLTUxLDEzICs0OSwxNSBAQAogI2RlZmluZSBTRUdfU0hJRlQgICAgICAgKDQpICAgICAgICAgICAgIC8qIExlZnQgc2hpZnQgZm9yIHNlZ21lbnQgbnVtYmVyLiAqLwogI2RlZmluZSBTRUdfTUFTSyAgICAgICAgKDB4NzApICAgICAgICAgIC8qIFNlZ21lbnQgZmllbGQgbWFzay4gKi8KIAotc3RhdGljIFB5SW50MTYgc2VnX2FlbmRbOF0gPSB7MHgxRiwgMHgzRiwgMHg3RiwgMHhGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUZGLCAweDNGRiwgMHg3RkYsIDB4RkZGfTsKLXN0YXRpYyBQeUludDE2IHNlZ191ZW5kWzhdID0gezB4M0YsIDB4N0YsIDB4RkYsIDB4MUZGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRkYsIDB4N0ZGLCAweEZGRiwgMHgxRkZGfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IHNlZ19hZW5kWzhdID0geworICAgIDB4MUYsIDB4M0YsIDB4N0YsIDB4RkYsIDB4MUZGLCAweDNGRiwgMHg3RkYsIDB4RkZGCit9Oworc3RhdGljIGNvbnN0IGludDE2X3Qgc2VnX3VlbmRbOF0gPSB7CisgICAgMHgzRiwgMHg3RiwgMHhGRiwgMHgxRkYsIDB4M0ZGLCAweDdGRiwgMHhGRkYsIDB4MUZGRgorfTsKIAotc3RhdGljIFB5SW50MTYKLXNlYXJjaChQeUludDE2IHZhbCwgUHlJbnQxNiAqdGFibGUsIGludCBzaXplKQorc3RhdGljIGludDE2X3QKK3NlYXJjaChpbnQxNl90IHZhbCwgY29uc3QgaW50MTZfdCAqdGFibGUsIGludCBzaXplKQogewogICAgIGludCBpOwogCkBAIC03MCw3ICs3MCw3IEBACiAjZGVmaW5lIHN0X3VsYXcybGluZWFyMTYodWMpIChfc3RfdWxhdzJsaW5lYXIxNlt1Y10pCiAjZGVmaW5lIHN0X2FsYXcybGluZWFyMTYodWMpIChfc3RfYWxhdzJsaW5lYXIxNlt1Y10pCiAKLXN0YXRpYyBQeUludDE2IF9zdF91bGF3MmxpbmVhcjE2WzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgaW50MTZfdCBfc3RfdWxhdzJsaW5lYXIxNlsyNTZdID0gewogICAgIC0zMjEyNCwgIC0zMTEwMCwgIC0zMDA3NiwgIC0yOTA1MiwgIC0yODAyOCwgIC0yNzAwNCwgIC0yNTk4MCwKICAgICAtMjQ5NTYsICAtMjM5MzIsICAtMjI5MDgsICAtMjE4ODQsICAtMjA4NjAsICAtMTk4MzYsICAtMTg4MTIsCiAgICAgLTE3Nzg4LCAgLTE2NzY0LCAgLTE1OTk2LCAgLTE1NDg0LCAgLTE0OTcyLCAgLTE0NDYwLCAgLTEzOTQ4LApAQCAtMTQzLDEwICsxNDMsMTAgQEAKICAqIEpvaG4gV2lsZXkgJiBTb25zLCBwcHMgOTgtMTExIGFuZCA0NzItNDc2LgogICovCiBzdGF0aWMgdW5zaWduZWQgY2hhcgotc3RfMTRsaW5lYXIydWxhdyhQeUludDE2IHBjbV92YWwpICAgICAgIC8qIDIncyBjb21wbGVtZW50ICgxNC1iaXQgcmFuZ2UpICovCitzdF8xNGxpbmVhcjJ1bGF3KGludDE2X3QgcGNtX3ZhbCkgICAgICAgLyogMidzIGNvbXBsZW1lbnQgKDE0LWJpdCByYW5nZSkgKi8KIHsKLSAgICBQeUludDE2ICAgICAgICAgbWFzazsKLSAgICBQeUludDE2ICAgICAgICAgc2VnOworICAgIGludDE2X3QgICAgICAgICBtYXNrOworICAgIGludDE2X3QgICAgICAgICBzZWc7CiAgICAgdW5zaWduZWQgY2hhciAgIHV2YWw7CiAKICAgICAvKiB1LWxhdyBpbnZlcnRzIGFsbCBiaXRzICovCkBAIC0xNzYsNyArMTc2LDcgQEAKIAogfQogCi1zdGF0aWMgUHlJbnQxNiBfc3RfYWxhdzJsaW5lYXIxNlsyNTZdID0geworc3RhdGljIGNvbnN0IGludDE2X3QgX3N0X2FsYXcybGluZWFyMTZbMjU2XSA9IHsKICAgICAgLTU1MDQsICAgLTUyNDgsICAgLTYwMTYsICAgLTU3NjAsICAgLTQ0ODAsICAgLTQyMjQsICAgLTQ5OTIsCiAgICAgIC00NzM2LCAgIC03NTUyLCAgIC03Mjk2LCAgIC04MDY0LCAgIC03ODA4LCAgIC02NTI4LCAgIC02MjcyLAogICAgICAtNzA0MCwgICAtNjc4NCwgICAtMjc1MiwgICAtMjYyNCwgICAtMzAwOCwgICAtMjg4MCwgICAtMjI0MCwKQEAgLTIzNyw5ICsyMzcsOSBAQAogICogSm9obiBXaWxleSAmIFNvbnMsIHBwcyA5OC0xMTEgYW5kIDQ3Mi00NzYuCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyCi1zdF9saW5lYXIyYWxhdyhQeUludDE2IHBjbV92YWwpIC8qIDIncyBjb21wbGVtZW50ICgxMy1iaXQgcmFuZ2UpICovCitzdF9saW5lYXIyYWxhdyhpbnQxNl90IHBjbV92YWwpIC8qIDIncyBjb21wbGVtZW50ICgxMy1iaXQgcmFuZ2UpICovCiB7Ci0gICAgUHlJbnQxNiAgICAgICAgIG1hc2s7CisgICAgaW50MTZfdCAgICAgICAgIG1hc2s7CiAgICAgc2hvcnQgICAgICAgICAgIHNlZzsKICAgICB1bnNpZ25lZCBjaGFyICAgYXZhbDsKIApAQCAtMjcwLDEyICsyNzAsMTIgQEAKIC8qIEVuZCBvZiBjb2RlIHRha2VuIGZyb20gc294ICovCiAKIC8qIEludGVsIEFEUENNIHN0ZXAgdmFyaWF0aW9uIHRhYmxlICovCi1zdGF0aWMgaW50IGluZGV4VGFibGVbMTZdID0geworc3RhdGljIGNvbnN0IGludCBpbmRleFRhYmxlWzE2XSA9IHsKICAgICAtMSwgLTEsIC0xLCAtMSwgMiwgNCwgNiwgOCwKICAgICAtMSwgLTEsIC0xLCAtMSwgMiwgNCwgNiwgOCwKIH07CiAKLXN0YXRpYyBpbnQgc3RlcHNpemVUYWJsZVs4OV0gPSB7CitzdGF0aWMgY29uc3QgaW50IHN0ZXBzaXplVGFibGVbODldID0gewogICAgIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTYsIDE3LAogICAgIDE5LCAyMSwgMjMsIDI1LCAyOCwgMzEsIDM0LCAzNywgNDEsIDQ1LAogICAgIDUwLCA1NSwgNjAsIDY2LCA3MywgODAsIDg4LCA5NywgMTA3LCAxMTgsCkBAIC0yOTUsNyArMjk1LDcgQEAKIAogI2RlZmluZSBHRVRJTlQ4KGNwLCBpKSAgICAgICAgICBHRVRJTlRYKHNpZ25lZCBjaGFyLCAoY3ApLCAoaSkpCiAjZGVmaW5lIEdFVElOVDE2KGNwLCBpKSAgICAgICAgIEdFVElOVFgoc2hvcnQsIChjcCksIChpKSkKLSNkZWZpbmUgR0VUSU5UMzIoY3AsIGkpICAgICAgICAgR0VUSU5UWChQWV9JTlQzMl9ULCAoY3ApLCAoaSkpCisjZGVmaW5lIEdFVElOVDMyKGNwLCBpKSAgICAgICAgIEdFVElOVFgoaW50MzJfdCwgKGNwKSwgKGkpKQogCiAjaWYgV09SRFNfQklHRU5ESUFOCiAjZGVmaW5lIEdFVElOVDI0KGNwLCBpKSAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMxMiw3ICszMTIsNyBAQAogCiAjZGVmaW5lIFNFVElOVDgoY3AsIGksIHZhbCkgICAgIFNFVElOVFgoc2lnbmVkIGNoYXIsIChjcCksIChpKSwgKHZhbCkpCiAjZGVmaW5lIFNFVElOVDE2KGNwLCBpLCB2YWwpICAgIFNFVElOVFgoc2hvcnQsIChjcCksIChpKSwgKHZhbCkpCi0jZGVmaW5lIFNFVElOVDMyKGNwLCBpLCB2YWwpICAgIFNFVElOVFgoUFlfSU5UMzJfVCwgKGNwKSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgU0VUSU5UMzIoY3AsIGksIHZhbCkgICAgU0VUSU5UWChpbnQzMl90LCAoY3ApLCAoaSksICh2YWwpKQogCiAjaWYgV09SRFNfQklHRU5ESUFOCiAjZGVmaW5lIFNFVElOVDI0KGNwLCBpLCB2YWwpICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNDQ0LDcgKzQ0NCw5IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGZvciAoaSA9IDA7IGkgPCBmcmFnbWVudC0+bGVuOyBpICs9IHdpZHRoKSB7CiAgICAgICAgIGludCB2YWwgPSBHRVRSQVdTQU1QTEUod2lkdGgsIGZyYWdtZW50LT5idWYsIGkpOwotICAgICAgICBpZiAodmFsIDwgMCkgYWJzdmFsID0gKC12YWwpOworICAgICAgICAvKiBDYXN0IHRvIHVuc2lnbmVkIGJlZm9yZSBuZWdhdGluZy4gVW5zaWduZWQgb3ZlcmZsb3cgaXMgd2VsbC0KKyAgICAgICAgZGVmaW5lZCwgYnV0IHNpZ25lZCBvdmVyZmxvdyBpcyBub3QuICovCisgICAgICAgIGlmICh2YWwgPCAwKSBhYnN2YWwgPSAodW5zaWduZWQgaW50KS0oaW50NjRfdCl2YWw7CiAgICAgICAgIGVsc2UgYWJzdmFsID0gdmFsOwogICAgICAgICBpZiAoYWJzdmFsID4gbWF4KSBtYXggPSBhYnN2YWw7CiAgICAgfQpAQCAtMTEyNSw3ICsxMTI3LDcgQEAKICAgICAgICAgICAgIHZhbCA9ICgodW5zaWduZWQgaW50KUdFVElOVDI0KGZyYWdtZW50LT5idWYsIGkpKSAmIDB4ZmZmZmZmdTsKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBhc3NlcnQod2lkdGggPT0gNCk7Ci0gICAgICAgICAgICB2YWwgPSBHRVRJTlRYKFBZX1VJTlQzMl9ULCBmcmFnbWVudC0+YnVmLCBpKTsKKyAgICAgICAgICAgIHZhbCA9IEdFVElOVFgodWludDMyX3QsIGZyYWdtZW50LT5idWYsIGkpOwogICAgICAgICB9CiAKICAgICAgICAgdmFsICs9ICh1bnNpZ25lZCBpbnQpYmlhczsKQEAgLTExNDAsNyArMTE0Miw3IEBACiAgICAgICAgICAgICBTRVRJTlQyNChuY3AsIGksIChpbnQpdmFsKTsKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBhc3NlcnQod2lkdGggPT0gNCk7Ci0gICAgICAgICAgICBTRVRJTlRYKFBZX1VJTlQzMl9ULCBuY3AsIGksIHZhbCk7CisgICAgICAgICAgICBTRVRJTlRYKHVpbnQzMl90LCBuY3AsIGksIHZhbCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJ2OwpAQCAtMTMzMiw3ICsxMzM0LDcgQEAKICAgICB3ZWlnaHRBIC89IGQ7CiAgICAgd2VpZ2h0QiAvPSBkOwogCi0gICAgaWYgKChzaXplX3QpbmNoYW5uZWxzID4gUFlfU0laRV9NQVgvc2l6ZW9mKGludCkpIHsKKyAgICBpZiAoKHNpemVfdCluY2hhbm5lbHMgPiBTSVpFX01BWC9zaXplb2YoaW50KSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIG91dHB1dCBidWZmZXIiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2JpbmFzY2lpLmMgYi9Nb2R1bGVzL2JpbmFzY2lpLmMKaW5kZXggZjBiNDdkOC4uYzMzMjBjZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9iaW5hc2NpaS5jCisrKyBiL01vZHVsZXMvYmluYXNjaWkuYwpAQCAtNzQsNyArNzQsNyBAQAogI2RlZmluZSBTS0lQIDB4N0UKICNkZWZpbmUgRkFJTCAweDdECiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYmxlX2EyYl9ocXhbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlX2EyYl9ocXhbMjU2XSA9IHsKIC8qICAgICAgIF5AICAgIF5BICAgIF5CICAgIF5DICAgIF5EICAgIF5FICAgIF5GICAgIF5HICAgKi8KIC8qIDAqLyAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKIC8qICAgICAgIFxiICAgIFx0ICAgIFxuICAgIF5LICAgIF5MICAgIFxyICAgIF5OICAgIF5PICAgKi8KQEAgLTEyNSwxMCArMTI1LDEwIEBACiAgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9ocXhbXSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZV9iMmFfaHF4W10gPQogIiFcIiMkJSYnKCkqKywtMDEyMzQ1Njg5QEFCQ0RFRkdISUpLTE1OUFFSU1RVVlhZWltgYWJjZGVmaGlqa2xtcHFyIjsKIAotc3RhdGljIGNoYXIgdGFibGVfYTJiX2Jhc2U2NFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgdGFibGVfYTJiX2Jhc2U2NFtdID0gewogICAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLAogICAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLAogICAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsNjIsIC0xLC0xLC0xLDYzLApAQCAtMTQ0LDEyICsxNDQsMTIgQEAKIC8qIE1heCBiaW5hcnkgY2h1bmsgc2l6ZTsgbGltaXRlZCBvbmx5IGJ5IGF2YWlsYWJsZSBtZW1vcnkgKi8KICNkZWZpbmUgQkFTRTY0X01BWEJJTiAoKFBZX1NTSVpFX1RfTUFYIC0gMykgLyAyKQogCi1zdGF0aWMgdW5zaWduZWQgY2hhciB0YWJsZV9iMmFfYmFzZTY0W10gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGVfYjJhX2Jhc2U2NFtdID0KICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKIAogCiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjcmN0YWJfaHF4WzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgY3JjdGFiX2hxeFsyNTZdID0gewogICAgIDB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwYTUsIDB4NjBjNiwgMHg3MGU3LAogICAgIDB4ODEwOCwgMHg5MTI5LCAweGExNGEsIDB4YjE2YiwgMHhjMThjLCAweGQxYWQsIDB4ZTFjZSwgMHhmMWVmLAogICAgIDB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MmI1LCAweDQyOTQsIDB4NzJmNywgMHg2MmQ2LApAQCAtMjU2LDcgKzI1Niw4IEBACiBiaW5hc2NpaV9hMmJfdXVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZTAyN2Y4ZTBiMDU5ODc0MiBpbnB1dD03Y2FmZWFmNzNkZjYzZDFjXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKQEAgLTM0MiwxMyArMzQzLDE1IEBACiBiaW5hc2NpaV9iMmFfdXVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDA3MDY3MGU1MmU0YWE2YiBpbnB1dD0wMGZkZjQ1OGNlOGI0NjViXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLSAgICBQeU9iamVjdCAqcnY7Ci0gICAgUHlfc3NpemVfdCBiaW5fbGVuOworICAgIFB5X3NzaXplX3QgYmluX2xlbiwgb3V0X2xlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogICAgIGJpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGJpbl9sZW4gPSBkYXRhLT5sZW47CiAgICAgaWYgKCBiaW5fbGVuID4gNDUgKSB7CkBAIC0zNTgsOSArMzYxLDEwIEBACiAgICAgfQogCiAgICAgLyogV2UncmUgbGF6eSBhbmQgYWxsb2NhdGUgdG8gbXVjaCAoZml4ZWQgdXAgbGF0ZXIpICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAyICsgKGJpbl9sZW4rMikvMyo0KSkgPT0gTlVMTCApCisgICAgb3V0X2xlbiA9IDIgKyAoYmluX2xlbiArIDIpIC8gMyAqIDQ7CisgICAgYXNjaWlfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIG91dF9sZW4pOworICAgIGlmIChhc2NpaV9kYXRhID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIC8qIFN0b3JlIHRoZSBsZW5ndGggKi8KICAgICAqYXNjaWlfZGF0YSsrID0gJyAnICsgKGJpbl9sZW4gJiAwNzcpOwpAQCAtMzgyLDE3ICszODYsMTIgQEAKICAgICB9CiAgICAgKmFzY2lpX2RhdGErKyA9ICdcbic7ICAgICAgIC8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KIAotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LAotICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGFzY2lpX2RhdGEpOwogfQogCiAKIHN0YXRpYyBpbnQKLWJpbmFzY2lpX2ZpbmRfdmFsaWQodW5zaWduZWQgY2hhciAqcywgUHlfc3NpemVfdCBzbGVuLCBpbnQgbnVtKQorYmluYXNjaWlfZmluZF92YWxpZChjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBQeV9zc2l6ZV90IHNsZW4sIGludCBudW0pCiB7CiAgICAgLyogRmluZHMgJiByZXR1cm5zIHRoZSAobnVtKzEpdGgKICAgICAqKiB2YWxpZCBjaGFyYWN0ZXIgZm9yIGJhc2U2NCwgb3IgLTEgaWYgbm9uZS4KQEAgLTQyOSwxMyArNDI4LDE0IEBACiBiaW5hc2NpaV9hMmJfYmFzZTY0X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTA2MjgyMjNmMTlmZDNmOWIgaW5wdXQ9NTg3MmFjZjZlMWNhYzI0M10qLwogewotICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwogICAgIGludCBsZWZ0Yml0cyA9IDA7CiAgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOwogICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0gICAgUHlPYmplY3QgKnJ2OwogICAgIFB5X3NzaXplX3QgYXNjaWlfbGVuLCBiaW5fbGVuOwogICAgIGludCBxdWFkX3BvcyA9IDA7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgYXNjaWlfZGF0YSA9IGRhdGEtPmJ1ZjsKICAgICBhc2NpaV9sZW4gPSBkYXRhLT5sZW47CkBAIC00NDcsMTEgKzQ0NywxMiBAQAogCiAgICAgYmluX2xlbiA9ICgoYXNjaWlfbGVuKzMpLzQpKjM7IC8qIFVwcGVyIGJvdW5kLCBjb3JyZWN0ZWQgbGF0ZXIgKi8KIAorICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisKICAgICAvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKSkgPT0gTlVMTCApCisgICAgYmluX2RhdGEgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBiaW5fbGVuKTsKKyAgICBpZiAoYmluX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYmluX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKLSAgICBiaW5fbGVuID0gMDsKIAogICAgIGZvciggOyBhc2NpaV9sZW4gPiAwOyBhc2NpaV9sZW4tLSwgYXNjaWlfZGF0YSsrKSB7CiAgICAgICAgIHRoaXNfY2ggPSAqYXNjaWlfZGF0YTsKQEAgLTQ5NiwzMSArNDk3LDE3IEBACiAgICAgICAgIGlmICggbGVmdGJpdHMgPj0gOCApIHsKICAgICAgICAgICAgIGxlZnRiaXRzIC09IDg7CiAgICAgICAgICAgICAqYmluX2RhdGErKyA9IChsZWZ0Y2hhciA+PiBsZWZ0Yml0cykgJiAweGZmOwotICAgICAgICAgICAgYmluX2xlbisrOwogICAgICAgICAgICAgbGVmdGNoYXIgJj0gKCgxIDw8IGxlZnRiaXRzKSAtIDEpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGxlZnRiaXRzICE9IDApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSW5jb3JyZWN0IHBhZGRpbmciKTsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLyogQW5kIHNldCBzdHJpbmcgc2l6ZSBjb3JyZWN0bHkuIElmIHRoZSByZXN1bHQgc3RyaW5nIGlzIGVtcHR5Ci0gICAgKiogKGJlY2F1c2UgdGhlIGlucHV0IHdhcyBhbGwgaW52YWxpZCkgcmV0dXJuIHRoZSBzaGFyZWQgZW1wdHkKLSAgICAqKiBzdHJpbmcgaW5zdGVhZDsgX1B5Qnl0ZXNfUmVzaXplKCkgd29uJ3QgZG8gdGhpcyBmb3IgdXMuCi0gICAgKi8KLSAgICBpZiAoYmluX2xlbiA+IDApIHsKLSAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsIGJpbl9sZW4pIDwgMCkgewotICAgICAgICAgICAgUHlfQ0xFQVIocnYpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICBydiA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOwotICAgIH0KLSAgICByZXR1cm4gcnY7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBiaW5fZGF0YSk7CiB9CiAKIApAQCAtNTI4LDI0ICs1MTUsMjcgQEAKIGJpbmFzY2lpLmIyYV9iYXNlNjQKIAogICAgIGRhdGE6IFB5X2J1ZmZlcgotICAgIC8KKyAgICAqCisgICAgbmV3bGluZTogaW50KGNfZGVmYXVsdD0iMSIpID0gVHJ1ZQogCiBCYXNlNjQtY29kZSBsaW5lIG9mIGRhdGEuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1iaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTRkOTY2NjMxNzA3NzhkYzMgaW5wdXQ9MTRlYzRlNDczNzExNzRhOV0qLworYmluYXNjaWlfYjJhX2Jhc2U2NF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSwgaW50IG5ld2xpbmUpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NGFkNjJjOGU4NDg1ZDNiMyBpbnB1dD03YjJlYTZmYTM4ZDg5MjRjXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLSAgICBQeU9iamVjdCAqcnY7Ci0gICAgUHlfc3NpemVfdCBiaW5fbGVuOworICAgIFB5X3NzaXplX3QgYmluX2xlbiwgb3V0X2xlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBiaW5fZGF0YSA9IGRhdGEtPmJ1ZjsKICAgICBiaW5fbGVuID0gZGF0YS0+bGVuOworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CiAKICAgICBhc3NlcnQoYmluX2xlbiA+PSAwKTsKIApAQCAtNTU1LDExICs1NDUsMTQgQEAKICAgICB9CiAKICAgICAvKiBXZSdyZSBsYXp5IGFuZCBhbGxvY2F0ZSB0b28gbXVjaCAoZml4ZWQgdXAgbGF0ZXIpLgotICAgICAgICIrMyIgbGVhdmVzIHJvb20gZm9yIHVwIHRvIHR3byBwYWQgY2hhcmFjdGVycyBhbmQgYSB0cmFpbGluZwotICAgICAgIG5ld2xpbmUuICBOb3RlIHRoYXQgJ2InIGdldHMgZW5jb2RlZCBhcyAnWWc9PVxuJyAoMSBpbiwgNSBvdXQpLiAqLwotICAgIGlmICggKHJ2PVB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYmluX2xlbioyICsgMykpID09IE5VTEwgKQorICAgICAgICIrMiIgbGVhdmVzIHJvb20gZm9yIHVwIHRvIHR3byBwYWQgY2hhcmFjdGVycy4KKyAgICAgICBOb3RlIHRoYXQgJ2InIGdldHMgZW5jb2RlZCBhcyAnWWc9PVxuJyAoMSBpbiwgNSBvdXQpLiAqLworICAgIG91dF9sZW4gPSBiaW5fbGVuKjIgKyAyOworICAgIGlmIChuZXdsaW5lKQorICAgICAgICBvdXRfbGVuKys7CisgICAgYXNjaWlfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIG91dF9sZW4pOworICAgIGlmIChhc2NpaV9kYXRhID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggOyBiaW5fbGVuID4gMCA7IGJpbl9sZW4tLSwgYmluX2RhdGErKyApIHsKICAgICAgICAgLyogU2hpZnQgdGhlIGRhdGEgaW50byBvdXIgYnVmZmVyICovCkBAIC01ODEsMTQgKzU3NCwxMCBAQAogICAgICAgICAqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2Jhc2U2NFsobGVmdGNoYXImMHhmKSA8PCAyXTsKICAgICAgICAgKmFzY2lpX2RhdGErKyA9IEJBU0U2NF9QQUQ7CiAgICAgfQotICAgICphc2NpaV9kYXRhKysgPSAnXG4nOyAgICAgICAvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCisgICAgaWYgKG5ld2xpbmUpCisgICAgICAgICphc2NpaV9kYXRhKysgPSAnXG4nOyAgICAgICAvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCiAKLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGFzY2lpX2RhdGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydikpKSA8IDApIHsKLSAgICAgICAgUHlfQ0xFQVIocnYpOwotICAgIH0KLSAgICByZXR1cm4gcnY7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBhc2NpaV9kYXRhKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQpAQCAtNjA0LDE2ICs1OTMsMTkgQEAKIGJpbmFzY2lpX2EyYl9ocXhfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NGQ2ZDhjNTRkNTRlYTFjMSBpbnB1dD0wZDkxNGM2ODBlMGVlZDU1XSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLSAgICBQeU9iamVjdCAqcnY7CisgICAgUHlPYmplY3QgKnJlczsKICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICBpbnQgZG9uZSA9IDA7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgYXNjaWlfZGF0YSA9IGRhdGEtPmJ1ZjsKICAgICBsZW4gPSBkYXRhLT5sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAogICAgIGFzc2VydChsZW4gPj0gMCk7CiAKQEAgLTYyMyw5ICs2MTUsOSBAQAogICAgIC8qIEFsbG9jYXRlIGEgc3RyaW5nIHRoYXQgaXMgdG9vIGJpZyAoZml4ZWQgbGF0ZXIpCiAgICAgICAgQWRkIHR3byB0byB0aGUgaW5pdGlhbCBsZW5ndGggdG8gcHJldmVudCBpbnRlcm5pbmcgd2hpY2gKICAgICAgICB3b3VsZCBwcmVjbHVkZSBzdWJzZXF1ZW50IHJlc2l6aW5nLiAgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbisyKSkgPT0gTlVMTCApCisgICAgYmluX2RhdGEgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBsZW4gKyAyKTsKKyAgICBpZiAoYmluX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYmluX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggOyBsZW4gPiAwIDsgbGVuLS0sIGFzY2lpX2RhdGErKyApIHsKICAgICAgICAgLyogR2V0IHRoZSBieXRlIGFuZCBsb29rIGl0IHVwICovCkBAIC02MzQsNyArNjI2LDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBpZiAoIHRoaXNfY2ggPT0gRkFJTCApIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIklsbGVnYWwgY2hhciIpOwotICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBpZiAoIHRoaXNfY2ggPT0gRE9ORSApIHsKQEAgLTY1NiwyMSArNjQ4LDE0IEBACiAgICAgaWYgKCBsZWZ0Yml0cyAmJiAhZG9uZSApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGhhcyBpbmNvbXBsZXRlIG51bWJlciBvZiBieXRlcyIpOwotICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChiaW5fZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIGlmIChydikgewotICAgICAgICBQeU9iamVjdCAqcnJ2ID0gUHlfQnVpbGRWYWx1ZSgiT2kiLCBydiwgZG9uZSk7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIHJldHVybiBycnY7Ci0gICAgfQogCi0gICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGJpbl9kYXRhKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOaSIsIHJlcywgZG9uZSk7CiB9CiAKIApAQCAtNjg3LDExICs2NzIsMTMgQEAKIGJpbmFzY2lpX3JsZWNvZGVfaHF4X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTM5M2Q3OTMzOGY1ZjU2MjkgaW5wdXQ9ZTFmMTcxMjQ0N2E4MmIwOV0qLwogewotICAgIHVuc2lnbmVkIGNoYXIgKmluX2RhdGEsICpvdXRfZGF0YTsKLSAgICBQeU9iamVjdCAqcnY7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpvdXRfZGF0YTsKICAgICB1bnNpZ25lZCBjaGFyIGNoOwogICAgIFB5X3NzaXplX3QgaW4sIGluZW5kLCBsZW47CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKICAgICBpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGxlbiA9IGRhdGEtPmxlbjsKIApAQCAtNzAxLDkgKzY4OCw5IEBACiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiAgICAgLyogV29yc3QgY2FzZTogb3V0cHV0IGlzIHR3aWNlIGFzIGJpZyBhcyBpbnB1dCAoZml4ZWQgbGF0ZXIpICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qMisyKSkgPT0gTlVMTCApCisgICAgb3V0X2RhdGEgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBsZW4gKiAyICsgMik7CisgICAgaWYgKG91dF9kYXRhID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydik7CiAKICAgICBmb3IoIGluPTA7IGluPGxlbjsgaW4rKykgewogICAgICAgICBjaCA9IGluX2RhdGFbaW5dOwpAQCAtNzI5LDEyICs3MTYsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LAotICAgICAgICAgICAgICAgICAgICAgICAob3V0X2RhdGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydikpKSA8IDApIHsKLSAgICAgICAgUHlfQ0xFQVIocnYpOwotICAgIH0KLSAgICByZXR1cm4gcnY7CisKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIG91dF9kYXRhKTsKIH0KIAogCkBAIC03NTEsMTUgKzczNCwxNyBAQAogYmluYXNjaWlfYjJhX2hxeF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kMGFhNWE3MDRiYzlmN2RlIGlucHV0PTk1OTZlYmUwMTlmZTEyYmFdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKICAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBiaW5fZGF0YSA9IGRhdGEtPmJ1ZjsKICAgICBsZW4gPSBkYXRhLT5sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAogICAgIGFzc2VydChsZW4gPj0gMCk7CiAKQEAgLTc2Nyw5ICs3NTIsOSBAQAogICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAogICAgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIHRoYXQgaXMgYXQgbGVhc3QgbGFyZ2UgZW5vdWdoICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qMisyKSkgPT0gTlVMTCApCisgICAgYXNjaWlfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbiAqIDIgKyAyKTsKKyAgICBpZiAoYXNjaWlfZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBhc2NpaV9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydik7CiAKICAgICBmb3IoIDsgbGVuID4gMCA7IGxlbi0tLCBiaW5fZGF0YSsrICkgewogICAgICAgICAvKiBTaGlmdCBpbnRvIG91ciBidWZmZXIsIGFuZCBvdXRwdXQgYW55IDZiaXRzIHJlYWR5ICovCkBAIC03ODYsMTIgKzc3MSw4IEBACiAgICAgICAgIGxlZnRjaGFyIDw8PSAoNi1sZWZ0Yml0cyk7CiAgICAgICAgICphc2NpaV9kYXRhKysgPSB0YWJsZV9iMmFfaHF4W2xlZnRjaGFyICYgMHgzZl07CiAgICAgfQotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LAotICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgYXNjaWlfZGF0YSk7CiB9CiAKIApAQCAtODA4LDEzICs3ODksMTUgQEAKIGJpbmFzY2lpX3JsZWRlY29kZV9ocXhfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTgyNjYxOTU2NWRlMWM2YyBpbnB1dD01NGNkZDQ5ZmMwMTQ0MDJjXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqb3V0X2RhdGE7CiAgICAgdW5zaWduZWQgY2hhciBpbl9ieXRlLCBpbl9yZXBlYXQ7Ci0gICAgUHlPYmplY3QgKnJ2OwotICAgIFB5X3NzaXplX3QgaW5fbGVuLCBvdXRfbGVuLCBvdXRfbGVuX2xlZnQ7CisgICAgUHlfc3NpemVfdCBpbl9sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgaW5fZGF0YSA9IGRhdGEtPmJ1ZjsKICAgICBpbl9sZW4gPSBkYXRhLT5sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAogICAgIGFzc2VydChpbl9sZW4gPj0gMCk7CiAKQEAgLTgyNSw1OSArODA4LDQ4IEBACiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgb2YgcmVhc29uYWJsZSBzaXplLiBSZXNpemVkIHdoZW4gbmVlZGVkICovCi0gICAgb3V0X2xlbiA9IGluX2xlbioyOwotICAgIGlmICggKHJ2PVB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgb3V0X2xlbikpID09IE5VTEwgKQorICAgIG91dF9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgaW5fbGVuKTsKKyAgICBpZiAob3V0X2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgb3V0X2xlbl9sZWZ0ID0gb3V0X2xlbjsKLSAgICBvdXRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOworCisgICAgLyogVXNlIG92ZXJhbGxvY2F0aW9uICovCisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CiAKICAgICAvKgogICAgICoqIFdlIG5lZWQgdHdvIG1hY3JvcyBoZXJlIHRvIGdldC9wdXQgYnl0ZXMgYW5kIGhhbmRsZQogICAgICoqIGVuZC1vZi1idWZmZXIgZm9yIGlucHV0IGFuZCBvdXRwdXQgc3RyaW5ncy4KICAgICAqLwotI2RlZmluZSBJTkJZVEUoYikgXAotICAgIGRvIHsgXAotICAgICAgICAgICAgIGlmICggLS1pbl9sZW4gPCAwICkgeyBcCi0gICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbmNvbXBsZXRlLCAiIik7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsgXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgXAotICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgIGIgPSAqaW5fZGF0YSsrOyBcCisjZGVmaW5lIElOQllURShiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBpZiAoIC0taW5fbGVuIDwgMCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbmNvbXBsZXRlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGdvdG8gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBiID0gKmluX2RhdGErKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSgwKQogCi0jZGVmaW5lIE9VVEJZVEUoYikgXAotICAgIGRvIHsgXAotICAgICAgICAgICAgIGlmICggLS1vdXRfbGVuX2xlZnQgPCAwICkgeyBcCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKCBvdXRfbGVuID4gUFlfU1NJWkVfVF9NQVggLyAyKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsgXAotICAgICAgICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LCAyKm91dF9sZW4pIDwgMCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgeyBQeV9YREVDUkVGKHJ2KTsgcmV0dXJuIE5VTEw7IH0gXAotICAgICAgICAgICAgICAgICAgICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0X2xlbjsgXAotICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW5fbGVmdCA9IG91dF9sZW4tMTsgXAotICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4gPSBvdXRfbGVuICogMjsgXAotICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgICpvdXRfZGF0YSsrID0gYjsgXAotICAgIH0gd2hpbGUoMCkKLQotICAgICAgICAvKgotICAgICAgICAqKiBIYW5kbGUgZmlyc3QgYnl0ZSBzZXBhcmF0ZWx5IChzaW5jZSB3ZSBoYXZlIHRvIGdldCBhbmdyeQotICAgICAgICAqKiBpbiBjYXNlIG9mIGFuIG9ycGhhbmVkIFJMRSBjb2RlKS4KLSAgICAgICAgKi8KLSAgICAgICAgSU5CWVRFKGluX2J5dGUpOworICAgIC8qCisgICAgKiogSGFuZGxlIGZpcnN0IGJ5dGUgc2VwYXJhdGVseSAoc2luY2Ugd2UgaGF2ZSB0byBnZXQgYW5ncnkKKyAgICAqKiBpbiBjYXNlIG9mIGFuIG9ycGhhbmVkIFJMRSBjb2RlKS4KKyAgICAqLworICAgIElOQllURShpbl9ieXRlKTsKIAogICAgIGlmIChpbl9ieXRlID09IFJVTkNIQVIpIHsKICAgICAgICAgSU5CWVRFKGluX3JlcGVhdCk7CisgICAgICAgIC8qIG9ubHkgMSBieXRlIHdpbGwgYmUgd3JpdHRlbiwgYnV0IDIgYnl0ZXMgd2VyZSBwcmVhbGxvY2F0ZWQ6CisgICAgICAgICAgIHN1YnRyYWN0IDEgYnl0ZSB0byBwcmV2ZW50IG92ZXJhbGxvY2F0aW9uICovCisgICAgICAgIHdyaXRlci5taW5fc2l6ZS0tOworCiAgICAgICAgIGlmIChpbl9yZXBlYXQgIT0gMCkgewogICAgICAgICAgICAgLyogTm90ZSBFcnJvciwgbm90IEluY29tcGxldGUgKHdoaWNoIGlzIGF0IHRoZSBlbmQKICAgICAgICAgICAgICoqIG9mIHRoZSBzdHJpbmcgb25seSkuIFRoaXMgaXMgYSBwcm9ncmFtbWVyIGVycm9yLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIk9ycGhhbmVkIFJMRSBjb2RlIGF0IHN0YXJ0Iik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgIE9VVEJZVEUoUlVOQ0hBUik7CisgICAgICAgICpvdXRfZGF0YSsrID0gUlVOQ0hBUjsKICAgICB9IGVsc2UgewotICAgICAgICBPVVRCWVRFKGluX2J5dGUpOworICAgICAgICAqb3V0X2RhdGErKyA9IGluX2J5dGU7CiAgICAgfQogCiAgICAgd2hpbGUoIGluX2xlbiA+IDAgKSB7CkBAIC04ODUsMjYgKzg1NywzOSBAQAogCiAgICAgICAgIGlmIChpbl9ieXRlID09IFJVTkNIQVIpIHsKICAgICAgICAgICAgIElOQllURShpbl9yZXBlYXQpOworICAgICAgICAgICAgLyogb25seSAxIGJ5dGUgd2lsbCBiZSB3cml0dGVuLCBidXQgMiBieXRlcyB3ZXJlIHByZWFsbG9jYXRlZDoKKyAgICAgICAgICAgICAgIHN1YnRyYWN0IDEgYnl0ZSB0byBwcmV2ZW50IG92ZXJhbGxvY2F0aW9uICovCisgICAgICAgICAgICB3cml0ZXIubWluX3NpemUtLTsKKwogICAgICAgICAgICAgaWYgKCBpbl9yZXBlYXQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAvKiBKdXN0IGFuIGVzY2FwZWQgUlVOQ0hBUiB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIE9VVEJZVEUoUlVOQ0hBUik7CisgICAgICAgICAgICAgICAgKm91dF9kYXRhKysgPSBSVU5DSEFSOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvKiBQaWNrIHVwIHZhbHVlIGFuZCBvdXRwdXQgYSBzZXF1ZW5jZSBvZiBpdCAqLwogICAgICAgICAgICAgICAgIGluX2J5dGUgPSBvdXRfZGF0YVstMV07CisKKyAgICAgICAgICAgICAgICAvKiBlbmxhcmdlIHRoZSBidWZmZXIgaWYgbmVlZGVkICovCisgICAgICAgICAgICAgICAgaWYgKGluX3JlcGVhdCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogLTEgYmVjYXVzZSB3ZSBhbHJlYWR5IHByZWFsbG9jYXRlZCAxIGJ5dGUgKi8KKyAgICAgICAgICAgICAgICAgICAgb3V0X2RhdGEgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIG91dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcmVwZWF0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRfZGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICB3aGlsZSAoIC0taW5fcmVwZWF0ID4gMCApCi0gICAgICAgICAgICAgICAgICAgIE9VVEJZVEUoaW5fYnl0ZSk7CisgICAgICAgICAgICAgICAgICAgICpvdXRfZGF0YSsrID0gaW5fYnl0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIE5vcm1hbCBieXRlICovCi0gICAgICAgICAgICBPVVRCWVRFKGluX2J5dGUpOworICAgICAgICAgICAgKm91dF9kYXRhKysgPSBpbl9ieXRlOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LAotICAgICAgICAgICAgICAgICAgICAgICAob3V0X2RhdGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydikpKSA8IDApIHsKLSAgICAgICAgUHlfQ0xFQVIocnYpOwotICAgIH0KLSAgICByZXR1cm4gcnY7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBvdXRfZGF0YSk7CisKK2Vycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtOTIyLDcgKzkwNyw3IEBACiBiaW5hc2NpaV9jcmNfaHF4X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCB1bnNpZ25lZCBpbnQgY3JjKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PThlYzJhNzg1OTBkMTkxNzAgaW5wdXQ9YWRkOGM1MzcxMmNjY2VkYV0qLwogewotICAgIHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwogICAgIFB5X3NzaXplX3QgbGVuOwogCiAgICAgY3JjICY9IDB4ZmZmZjsKQEAgLTEwMDAsNyArOTg1LDcgQEAKICAgICAgdXNpbmcgYnl0ZS1zd2FwIGluc3RydWN0aW9ucy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGNyY18zMl90YWJbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY3JjXzMyX3RhYlsyNTZdID0gewogMHgwMDAwMDAwMFUsIDB4NzcwNzMwOTZVLCAweGVlMGU2MTJjVSwgMHg5OTA5NTFiYVUsIDB4MDc2ZGM0MTlVLAogMHg3MDZhZjQ4ZlUsIDB4ZTk2M2E1MzVVLCAweDllNjQ5NWEzVSwgMHgwZWRiODgzMlUsIDB4NzlkY2I4YTRVLAogMHhlMGQ1ZTkxZVUsIDB4OTdkMmQ5ODhVLCAweDA5YjY0YzJiVSwgMHg3ZWIxN2NiZFUsIDB4ZTdiODJkMDdVLApAQCAtMTA3Myw3ICsxMDU4LDcgQEAKICNpZmRlZiBVU0VfWkxJQl9DUkMzMgogLyogVGhpcyB3YXMgdGFrZW4gZnJvbSB6bGlibW9kdWxlLmMgUHlabGliX2NyYzMyIChidXQgaXMgUFlfU1NJWkVfVF9DTEVBTikgKi8KIHsKLSAgICBCeXRlICpidWY7CisgICAgY29uc3QgQnl0ZSAqYnVmOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIGludCBzaWduZWRfdmFsOwogCkBAIC0xMDg0LDcgKzEwNjksNyBAQAogfQogI2Vsc2UgIC8qIFVTRV9aTElCX0NSQzMyICovCiB7IC8qIEJ5IEppbSBBaGxzdHJvbTsgQWxsIHJpZ2h0cyB0cmFuc2ZlcnJlZCB0byBDTlJJICovCi0gICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgUHlfc3NpemVfdCBsZW47CiAgICAgdW5zaWduZWQgaW50IHJlc3VsdDsKIApAQCAtMTE2Nyw3ICsxMTUyLDcgQEAKIGJpbmFzY2lpX2EyYl9oZXhfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmhleHN0cikKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wY2MxYTEzOWFmMGVlZWNiIGlucHV0PTllMWU3ZjJmOTRkYjI0ZmRdKi8KIHsKLSAgICBjaGFyKiBhcmdidWY7CisgICAgY29uc3QgY2hhciogYXJnYnVmOwogICAgIFB5X3NzaXplX3QgYXJnbGVuOwogICAgIFB5T2JqZWN0ICpyZXR2YWw7CiAgICAgY2hhciogcmV0YnVmOwpAQCAtMTIyNCw3ICsxMjA5LDcgQEAKICAgICByZXR1cm4gYmluYXNjaWlfYTJiX2hleF9pbXBsKG1vZHVsZSwgaGV4c3RyKTsKIH0KIAotc3RhdGljIGludCB0YWJsZV9oZXhbMTI4XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgdGFibGVfaGV4WzEyOF0gPSB7CiAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLAogICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwKICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCkBAIC0xMjU1LDcgKzEyNDAsOCBAQAogewogICAgIFB5X3NzaXplX3QgaW4sIG91dDsKICAgICBjaGFyIGNoOwotICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpvZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKm9kYXRhOwogICAgIFB5X3NzaXplX3QgZGF0YWxlbiA9IDA7CiAgICAgUHlPYmplY3QgKnJ2OwogCkBAIC0xMzYxLDEzICsxMzQ3LDE0IEBACiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZTk4ODQ0NzJlYmIxYTk0YyBpbnB1dD03ZjJhOWFhYTAwOGU5MmIyXSovCiB7CiAgICAgUHlfc3NpemVfdCBpbiwgb3V0OwotICAgIHVuc2lnbmVkIGNoYXIgKmRhdGFidWYsICpvZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhYnVmOworICAgIHVuc2lnbmVkIGNoYXIgKm9kYXRhOwogICAgIFB5X3NzaXplX3QgZGF0YWxlbiA9IDAsIG9kYXRhbGVuID0gMDsKICAgICBQeU9iamVjdCAqcnY7CiAgICAgdW5zaWduZWQgaW50IGxpbmVsZW4gPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgY2g7CiAgICAgaW50IGNybGYgPSAwOwotICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKIAogICAgIGRhdGFidWYgPSBkYXRhLT5idWY7CiAgICAgZGF0YWxlbiA9IGRhdGEtPmxlbjsKQEAgLTEzNzYsNyArMTM2Myw3IEBACiAgICAgLyogWFhYOiB0aGlzIGZ1bmN0aW9uIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY29udmVydGluZyBhbGwgb2YKICAgICAgKiB0aGUgZW5kIG9mIGxpbmVzIHRvIGJlIHRoZSBzYW1lIGRlcGVuZGluZyBvbiB0aGlzIGRldGVjdGlvbgogICAgICAqIGhlcmUgKi8KLSAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgbWVtY2hyKGRhdGFidWYsICdcbicsIGRhdGFsZW4pOworICAgIHAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBtZW1jaHIoZGF0YWJ1ZiwgJ1xuJywgZGF0YWxlbik7CiAgICAgaWYgKChwICE9IE5VTEwpICYmIChwID4gZGF0YWJ1ZikgJiYgKCoocC0xKSA9PSAnXHInKSkKICAgICAgICAgY3JsZiA9IDE7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL2NsaW5pYy9tdWx0aWJ5dGVjb2RlYy5jLmggYi9Nb2R1bGVzL2Nqa2NvZGVjcy9jbGluaWMvbXVsdGlieXRlY29kZWMuYy5oCmluZGV4IDhhNDdmZjguLmM5YzU4Y2QgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL2NsaW5pYy9tdWx0aWJ5dGVjb2RlYy5jLmgKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvY2xpbmljL211bHRpYnl0ZWNvZGVjLmMuaApAQCAtMjUsMTMgKzI1LDE1IEBACiBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlQ29kZWNfZW5jb2RlKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImlucHV0IiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImlucHV0IiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98ejplbmNvZGUiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICppbnB1dDsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3x6OmVuY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmlucHV0LCAmZXJyb3JzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZpbnB1dCwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlQ29kZWNfZW5jb2RlX2ltcGwoc2VsZiwgaW5wdXQsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC02MSwxOSArNjMsMjIgQEAKIF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVDb2RlY19kZWNvZGUoTXVsdGlieXRlQ29kZWNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiaW5wdXQiLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiaW5wdXQiLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsieSp8ejpkZWNvZGUiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5X2J1ZmZlciBpbnB1dCA9IHtOVUxMLCBOVUxMfTsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAieSp8ejpkZWNvZGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZpbnB1dCwgJmVycm9ycykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmaW5wdXQsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX211bHRpYnl0ZWNvZGVjX011bHRpYnl0ZUNvZGVjX2RlY29kZV9pbXBsKHNlbGYsICZpbnB1dCwgZXJyb3JzKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBpbnB1dCAqLwotICAgIGlmIChpbnB1dC5vYmopCisgICAgaWYgKGlucHV0Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmlucHV0KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtOTUsMTMgKzEwMCwxNSBAQAogX211bHRpYnl0ZWNvZGVjX011bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlcl9lbmNvZGUoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImlucHV0IiwgImZpbmFsIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiaW5wdXQiLCAiZmluYWwiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfGk6ZW5jb2RlIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqaW5wdXQ7CiAgICAgaW50IGZpbmFsID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aTplbmNvZGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZpbnB1dCwgJmZpbmFsKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZpbnB1dCwgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJfZW5jb2RlX2ltcGwoc2VsZiwgaW5wdXQsIGZpbmFsKTsKIAogZXhpdDoKQEAgLTE0MiwxOSArMTQ5LDIyIEBACiBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyX2RlY29kZShNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiaW5wdXQiLCAiZmluYWwiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJpbnB1dCIsICJmaW5hbCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InkqfGk6ZGVjb2RlIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeV9idWZmZXIgaW5wdXQgPSB7TlVMTCwgTlVMTH07CiAgICAgaW50IGZpbmFsID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInkqfGk6ZGVjb2RlIiwgX2tleXdvcmRzLAotICAgICAgICAmaW5wdXQsICZmaW5hbCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmaW5wdXQsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyX2RlY29kZV9pbXBsKHNlbGYsICZpbnB1dCwgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGlucHV0ICovCi0gICAgaWYgKGlucHV0Lm9iaikKKyAgICBpZiAoaW5wdXQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmaW5wdXQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xOTYsOCArMjA2LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWQiLAogICAgICAgICAwLCAxLAotICAgICAgICAmc2l6ZW9iaikpCisgICAgICAgICZzaXplb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVTdHJlYW1SZWFkZXJfcmVhZF9pbXBsKHNlbGYsIHNpemVvYmopOwogCiBleGl0OgpAQCAtMjI0LDggKzIzNSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkbGluZSIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZzaXplb2JqKSkKKyAgICAgICAgJnNpemVvYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX211bHRpYnl0ZWNvZGVjX011bHRpYnl0ZVN0cmVhbVJlYWRlcl9yZWFkbGluZV9pbXBsKHNlbGYsIHNpemVvYmopOwogCiBleGl0OgpAQCAtMjUyLDggKzI2NCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkbGluZXMiLAogICAgICAgICAwLCAxLAotICAgICAgICAmc2l6ZWhpbnRvYmopKQorICAgICAgICAmc2l6ZWhpbnRvYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX211bHRpYnl0ZWNvZGVjX011bHRpYnl0ZVN0cmVhbVJlYWRlcl9yZWFkbGluZXNfaW1wbChzZWxmLCBzaXplaGludG9iaik7CiAKIGV4aXQ6CkBAIC0zMTcsNCArMzMwLDQgQEAKIAogI2RlZmluZSBfTVVMVElCWVRFQ09ERUNfX19DUkVBVEVfQ09ERUNfTUVUSE9EREVGICAgIFwKICAgICB7Il9fY3JlYXRlX2NvZGVjIiwgKFB5Q0Z1bmN0aW9uKV9tdWx0aWJ5dGVjb2RlY19fX2NyZWF0ZV9jb2RlYywgTUVUSF9PLCBfbXVsdGlieXRlY29kZWNfX19jcmVhdGVfY29kZWNfX2RvY19ffSwKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lZWJiMjFlMThjMzA0M2QxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD04ZTg2ZmExNjJjODUyMzBiIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19iejJtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2J6Mm1vZHVsZS5jLmgKaW5kZXggM2VkODMwMy4uYzQwMzJlYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2J6Mm1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2J6Mm1vZHVsZS5jLmgKQEAgLTI1LDE0ICsyNSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpjb21wcmVzcyIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmNvbXByZXNzIiwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2J6Ml9CWjJDb21wcmVzc29yX2NvbXByZXNzX2ltcGwoc2VsZiwgJmRhdGEpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTgwLDExICs4MiwxMyBAQAogICAgIGludCBjb21wcmVzc2xldmVsID0gOTsKIAogICAgIGlmICgoUHlfVFlQRShzZWxmKSA9PSAmQloyQ29tcHJlc3Nvcl9UeXBlKSAmJgotICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIkJaMkNvbXByZXNzb3IiLCBrd2FyZ3MpKQorICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIkJaMkNvbXByZXNzb3IiLCBrd2FyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpCWjJDb21wcmVzc29yIiwKLSAgICAgICAgJmNvbXByZXNzbGV2ZWwpKQorICAgICAgICAmY29tcHJlc3NsZXZlbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfYnoyX0JaMkNvbXByZXNzb3JfX19pbml0X19faW1wbCgoQloyQ29tcHJlc3NvciAqKXNlbGYsIGNvbXByZXNzbGV2ZWwpOwogCiBleGl0OgpAQCAtMTIxLDE5ICsxMjUsMjIgQEAKIF9iejJfQloyRGVjb21wcmVzc29yX2RlY29tcHJlc3MoQloyRGVjb21wcmVzc29yICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImRhdGEiLCAibWF4X2xlbmd0aCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImRhdGEiLCAibWF4X2xlbmd0aCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InkqfG46ZGVjb21wcmVzcyIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAgICAgUHlfc3NpemVfdCBtYXhfbGVuZ3RoID0gLTE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ5KnxuOmRlY29tcHJlc3MiLCBfa2V5d29yZHMsCi0gICAgICAgICZkYXRhLCAmbWF4X2xlbmd0aCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZGF0YSwgJm1heF9sZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2J6Ml9CWjJEZWNvbXByZXNzb3JfZGVjb21wcmVzc19pbXBsKHNlbGYsICZkYXRhLCBtYXhfbGVuZ3RoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xNTUsMTQgKzE2MiwxNiBAQAogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKIAogICAgIGlmICgoUHlfVFlQRShzZWxmKSA9PSAmQloyRGVjb21wcmVzc29yX1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9Qb3NpdGlvbmFsKCJCWjJEZWNvbXByZXNzb3IiLCBhcmdzKSkKKyAgICAgICAgIV9QeUFyZ19Ob1Bvc2l0aW9uYWwoIkJaMkRlY29tcHJlc3NvciIsIGFyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgaWYgKChQeV9UWVBFKHNlbGYpID09ICZCWjJEZWNvbXByZXNzb3JfVHlwZSkgJiYKLSAgICAgICAgIV9QeUFyZ19Ob0tleXdvcmRzKCJCWjJEZWNvbXByZXNzb3IiLCBrd2FyZ3MpKQorICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIkJaMkRlY29tcHJlc3NvciIsIGt3YXJncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfYnoyX0JaMkRlY29tcHJlc3Nvcl9fX2luaXRfX19pbXBsKChCWjJEZWNvbXByZXNzb3IgKilzZWxmKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZlZjI5Yjc2YjMzMTRmYzcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQwZTVlZjA0OWY5ZTcxOWIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2NvZGVjc21vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fY29kZWNzbW9kdWxlLmMuaAppbmRleCBhZjA2YzZkLi5jN2ZkNjZmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fY29kZWNzbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fY29kZWNzbW9kdWxlLmMuaApAQCAtMzMsOCArMzMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmxvb2t1cCIsICZlbmNvZGluZykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmxvb2t1cCIsICZlbmNvZGluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2xvb2t1cF9pbXBsKG1vZHVsZSwgZW5jb2RpbmcpOwogCiBleGl0OgpAQCAtNjQsMTQgKzY1LDE2IEBACiBfY29kZWNzX2VuY29kZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7Im9iaiIsICJlbmNvZGluZyIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJvYmoiLCAiZW5jb2RpbmciLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3xzczplbmNvZGUiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpvYmo7CiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHNzOmVuY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJm9iaiwgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZvYmosICZlbmNvZGluZywgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2VuY29kZV9pbXBsKG1vZHVsZSwgb2JqLCBlbmNvZGluZywgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTEwMSwxNCArMTA0LDE2IEBACiBfY29kZWNzX2RlY29kZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7Im9iaiIsICJlbmNvZGluZyIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJvYmoiLCAiZW5jb2RpbmciLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3xzczpkZWNvZGUiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpvYmo7CiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHNzOmRlY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJm9iaiwgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZvYmosICZlbmNvZGluZywgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2RlY29kZV9pbXBsKG1vZHVsZSwgb2JqLCBlbmNvZGluZywgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTEzMyw4ICsxMzgsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOl9mb3JnZXRfY29kZWMiLCAmZW5jb2RpbmcpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpfZm9yZ2V0X2NvZGVjIiwgJmVuY29kaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfX2ZvcmdldF9jb2RlY19pbXBsKG1vZHVsZSwgZW5jb2RpbmcpOwogCiBleGl0OgpAQCAtMTYxLDE0ICsxNjcsMTYgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6OmVzY2FwZV9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycykpCisgICAgICAgICZkYXRhLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfZXNjYXBlX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTkzLDggKzIwMSw5IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8ejplc2NhcGVfZW5jb2RlIiwKLSAgICAgICAgJlB5Qnl0ZXNfVHlwZSwgJmRhdGEsICZlcnJvcnMpKQorICAgICAgICAmUHlCeXRlc19UeXBlLCAmZGF0YSwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2VzY2FwZV9lbmNvZGVfaW1wbChtb2R1bGUsIGRhdGEsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0yMjEsOCArMjMwLDkgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dW5pY29kZV9pbnRlcm5hbF9kZWNvZGUiLAotICAgICAgICAmb2JqLCAmZXJyb3JzKSkKKyAgICAgICAgJm9iaiwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3VuaWNvZGVfaW50ZXJuYWxfZGVjb2RlX2ltcGwobW9kdWxlLCBvYmosIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0yNTAsMTQgKzI2MCwxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppOnV0Zl83X2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzdfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjgzLDE0ICsyOTUsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfOF9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl84X2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTMxNiwxNCArMzMwLDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emk6dXRmXzE2X2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTM0OSwxNCArMzY1LDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emk6dXRmXzE2X2xlX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2xlX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTM4MiwxNCArNDAwLDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emk6dXRmXzE2X2JlX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2JlX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQxNywxNCArNDM3LDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emlpOnV0Zl8xNl9leF9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZieXRlb3JkZXIsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8xNl9leF9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGJ5dGVvcmRlciwgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQ1MCwxNCArNDcyLDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emk6dXRmXzMyX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzMyX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQ4MywxNCArNTA3LDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emk6dXRmXzMyX2xlX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzMyX2xlX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTUxNiwxNCArNTQyLDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emk6dXRmXzMyX2JlX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzMyX2JlX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTU1MSwxNCArNTc5LDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emlpOnV0Zl8zMl9leF9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZieXRlb3JkZXIsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8zMl9leF9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGJ5dGVvcmRlciwgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTU4MywxNCArNjEzLDE2IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ejp1bmljb2RlX2VzY2FwZV9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycykpCisgICAgICAgICZkYXRhLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdW5pY29kZV9lc2NhcGVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC02MTUsMTQgKzY0NywxNiBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHo6cmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19yYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC02NDcsMTQgKzY4MSwxNiBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHo6bGF0aW5fMV9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycykpCisgICAgICAgICZkYXRhLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfbGF0aW5fMV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTY3OSwxNCArNzE1LDE2IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8ejphc2NpaV9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycykpCisgICAgICAgICZkYXRhLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfYXNjaWlfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC03MTIsMTkgKzc1MCwyMSBAQAogICAgIFB5T2JqZWN0ICptYXBwaW5nID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8ek86Y2hhcm1hcF9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJm1hcHBpbmcpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJm1hcHBpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19jaGFybWFwX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgbWFwcGluZyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQogCi0jaWYgZGVmaW5lZChIQVZFX01CQ1MpCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKQogCiBQeURvY19TVFJWQVIoX2NvZGVjc19tYmNzX2RlY29kZV9fZG9jX18sCiAibWJjc19kZWNvZGUoJG1vZHVsZSwgZGF0YSwgZXJyb3JzPU5vbmUsIGZpbmFsPUZhbHNlLCAvKVxuIgpAQCAtNzQ3LDIxICs3ODcsNjIgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTptYmNzX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfbWJjc19kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CiAKLSNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfTUJDUykgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKE1TX1dJTkRPV1MpICovCiAKLSNpZiBkZWZpbmVkKEhBVkVfTUJDUykKKyNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCisKK1B5RG9jX1NUUlZBUihfY29kZWNzX29lbV9kZWNvZGVfX2RvY19fLAorIm9lbV9kZWNvZGUoJG1vZHVsZSwgZGF0YSwgZXJyb3JzPU5vbmUsIGZpbmFsPUZhbHNlLCAvKVxuIgorIi0tXG4iCisiXG4iKTsKKworI2RlZmluZSBfQ09ERUNTX09FTV9ERUNPREVfTUVUSE9EREVGICAgIFwKKyAgICB7Im9lbV9kZWNvZGUiLCAoUHlDRnVuY3Rpb24pX2NvZGVjc19vZW1fZGVjb2RlLCBNRVRIX1ZBUkFSR1MsIF9jb2RlY3Nfb2VtX2RlY29kZV9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorX2NvZGVjc19vZW1fZGVjb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgZmluYWwpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2NvZGVjc19vZW1fZGVjb2RlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OworICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CisgICAgaW50IGZpbmFsID0gMDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emk6b2VtX2RlY29kZSIsCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19vZW1fZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CisKK2V4aXQ6CisgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLworICAgIGlmIChkYXRhLm9iaikgeworICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KKworICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKE1TX1dJTkRPV1MpICovCisKKyNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCiAKIFB5RG9jX1NUUlZBUihfY29kZWNzX2NvZGVfcGFnZV9kZWNvZGVfX2RvY19fLAogImNvZGVfcGFnZV9kZWNvZGUoJG1vZHVsZSwgY29kZXBhZ2UsIGRhdGEsIGVycm9ycz1Ob25lLCBmaW5hbD1GYWxzZSwgLylcbiIKQEAgLTc4NSwxOSArODY2LDIxIEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXkqfHppOmNvZGVfcGFnZV9kZWNvZGUiLAotICAgICAgICAmY29kZXBhZ2UsICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmY29kZXBhZ2UsICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19jb2RlX3BhZ2VfZGVjb2RlX2ltcGwobW9kdWxlLCBjb2RlcGFnZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KIAotI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9NQkNTKSAqLworI2VuZGlmIC8qIGRlZmluZWQoTVNfV0lORE9XUykgKi8KIAogUHlEb2NfU1RSVkFSKF9jb2RlY3NfcmVhZGJ1ZmZlcl9lbmNvZGVfX2RvY19fLAogInJlYWRidWZmZXJfZW5jb2RlKCRtb2R1bGUsIGRhdGEsIGVycm9ycz1Ob25lLCAvKVxuIgpAQCAtODE5LDE0ICs5MDIsMTYgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6OnJlYWRidWZmZXJfZW5jb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMpKQorICAgICAgICAmZGF0YSwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3JlYWRidWZmZXJfZW5jb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04NTEsOCArOTM2LDkgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dW5pY29kZV9pbnRlcm5hbF9lbmNvZGUiLAotICAgICAgICAmb2JqLCAmZXJyb3JzKSkKKyAgICAgICAgJm9iaiwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3VuaWNvZGVfaW50ZXJuYWxfZW5jb2RlX2ltcGwobW9kdWxlLCBvYmosIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC04NzgsOSArOTY0LDEwIEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dXRmXzdfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6dXRmXzdfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl83X2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtOTA2LDkgKzk5MywxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl84X2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnV0Zl84X2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfOF9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTkzNSw5ICsxMDIzLDEwIEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6aTp1dGZfMTZfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycywgJmJ5dGVvcmRlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHppOnV0Zl8xNl9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMsIGJ5dGVvcmRlcik7CiAKIGV4aXQ6CkBAIC05NjMsOSArMTA1MiwxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl8xNl9sZV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1dGZfMTZfbGVfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8xNl9sZV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTk5MSw5ICsxMDgxLDEwIEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dXRmXzE2X2JlX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnV0Zl8xNl9iZV9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2JlX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMTAyMCw5ICsxMTExLDEwIEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6aTp1dGZfMzJfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycywgJmJ5dGVvcmRlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHppOnV0Zl8zMl9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzMyX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMsIGJ5dGVvcmRlcik7CiAKIGV4aXQ6CkBAIC0xMDQ4LDkgKzExNDAsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfbGVfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6dXRmXzMyX2xlX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfbGVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMDc2LDkgKzExNjksMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfYmVfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6dXRmXzMyX2JlX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfYmVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTA0LDkgKzExOTgsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1bmljb2RlX2VzY2FwZV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1bmljb2RlX2VzY2FwZV9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdW5pY29kZV9lc2NhcGVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTMyLDkgKzEyMjcsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpyYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6cmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19yYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTYwLDkgKzEyNTYsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpsYXRpbl8xX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OmxhdGluXzFfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2xhdGluXzFfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTg4LDkgKzEyODUsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejphc2NpaV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejphc2NpaV9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfYXNjaWlfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMjE3LDkgKzEzMTUsMTAgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICptYXBwaW5nID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6TzpjaGFybWFwX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMsICZtYXBwaW5nKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ek86Y2hhcm1hcF9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzLCAmbWFwcGluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NoYXJtYXBfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycywgbWFwcGluZyk7CiAKIGV4aXQ6CkBAIC0xMjQzLDE1ICsxMzQyLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm1hcDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpjaGFybWFwX2J1aWxkIiwgJm1hcCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmNoYXJtYXBfYnVpbGQiLCAmbWFwKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfY2hhcm1hcF9idWlsZF9pbXBsKG1vZHVsZSwgbWFwKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQogCi0jaWYgZGVmaW5lZChIQVZFX01CQ1MpCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKQogCiBQeURvY19TVFJWQVIoX2NvZGVjc19tYmNzX2VuY29kZV9fZG9jX18sCiAibWJjc19lbmNvZGUoJG1vZHVsZSwgc3RyLCBlcnJvcnM9Tm9uZSwgLylcbiIKQEAgLTEyNzEsMTggKzEzNzEsNTEgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejptYmNzX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6Om1iY3NfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX21iY3NfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KIAotI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9NQkNTKSAqLworI2VuZGlmIC8qIGRlZmluZWQoTVNfV0lORE9XUykgKi8KIAotI2lmIGRlZmluZWQoSEFWRV9NQkNTKQorI2lmIGRlZmluZWQoTVNfV0lORE9XUykKKworUHlEb2NfU1RSVkFSKF9jb2RlY3Nfb2VtX2VuY29kZV9fZG9jX18sCisib2VtX2VuY29kZSgkbW9kdWxlLCBzdHIsIGVycm9ycz1Ob25lLCAvKVxuIgorIi0tXG4iCisiXG4iKTsKKworI2RlZmluZSBfQ09ERUNTX09FTV9FTkNPREVfTUVUSE9EREVGICAgIFwKKyAgICB7Im9lbV9lbmNvZGUiLCAoUHlDRnVuY3Rpb24pX2NvZGVjc19vZW1fZW5jb2RlLCBNRVRIX1ZBUkFSR1MsIF9jb2RlY3Nfb2VtX2VuY29kZV9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorX2NvZGVjc19vZW1fZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwgY29uc3QgY2hhciAqZXJyb3JzKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19jb2RlY3Nfb2VtX2VuY29kZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RyOworICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejpvZW1fZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX29lbV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKKworZXhpdDoKKyAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOworfQorCisjZW5kaWYgLyogZGVmaW5lZChNU19XSU5ET1dTKSAqLworCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKQogCiBQeURvY19TVFJWQVIoX2NvZGVjc19jb2RlX3BhZ2VfZW5jb2RlX19kb2NfXywKICJjb2RlX3BhZ2VfZW5jb2RlKCRtb2R1bGUsIGNvZGVfcGFnZSwgc3RyLCBlcnJvcnM9Tm9uZSwgLylcbiIKQEAgLTEzMDQsMTYgKzE0MzcsMTcgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPfHo6Y29kZV9wYWdlX2VuY29kZSIsCi0gICAgICAgICZjb2RlX3BhZ2UsICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaVV8ejpjb2RlX3BhZ2VfZW5jb2RlIiwKKyAgICAgICAgJmNvZGVfcGFnZSwgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NvZGVfcGFnZV9lbmNvZGVfaW1wbChtb2R1bGUsIGNvZGVfcGFnZSwgc3RyLCBlcnJvcnMpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CiAKLSNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfTUJDUykgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKE1TX1dJTkRPV1MpICovCiAKIFB5RG9jX1NUUlZBUihfY29kZWNzX3JlZ2lzdGVyX2Vycm9yX19kb2NfXywKICJyZWdpc3Rlcl9lcnJvcigkbW9kdWxlLCBlcnJvcnMsIGhhbmRsZXIsIC8pXG4iCkBAIC0xMzQwLDggKzE0NzQsOSBAQAogICAgIFB5T2JqZWN0ICpoYW5kbGVyOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzTzpyZWdpc3Rlcl9lcnJvciIsCi0gICAgICAgICZlcnJvcnMsICZoYW5kbGVyKSkKKyAgICAgICAgJmVycm9ycywgJmhhbmRsZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19yZWdpc3Rlcl9lcnJvcl9pbXBsKG1vZHVsZSwgZXJyb3JzLCBoYW5kbGVyKTsKIAogZXhpdDoKQEAgLTEzNjksOCArMTUwNCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpsb29rdXBfZXJyb3IiLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmxvb2t1cF9lcnJvciIsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfbG9va3VwX2Vycm9yX2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTEzODEsNiArMTUxNywxMCBAQAogICAgICNkZWZpbmUgX0NPREVDU19NQkNTX0RFQ09ERV9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChfQ09ERUNTX01CQ1NfREVDT0RFX01FVEhPRERFRikgKi8KIAorI2lmbmRlZiBfQ09ERUNTX09FTV9ERUNPREVfTUVUSE9EREVGCisgICAgI2RlZmluZSBfQ09ERUNTX09FTV9ERUNPREVfTUVUSE9EREVGCisjZW5kaWYgLyogIWRlZmluZWQoX0NPREVDU19PRU1fREVDT0RFX01FVEhPRERFRikgKi8KKwogI2lmbmRlZiBfQ09ERUNTX0NPREVfUEFHRV9ERUNPREVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfQ09ERUNTX0NPREVfUEFHRV9ERUNPREVfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX0NPREVDU19DT0RFX1BBR0VfREVDT0RFX01FVEhPRERFRikgKi8KQEAgLTEzODksNyArMTUyOSwxMSBAQAogICAgICNkZWZpbmUgX0NPREVDU19NQkNTX0VOQ09ERV9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChfQ09ERUNTX01CQ1NfRU5DT0RFX01FVEhPRERFRikgKi8KIAorI2lmbmRlZiBfQ09ERUNTX09FTV9FTkNPREVfTUVUSE9EREVGCisgICAgI2RlZmluZSBfQ09ERUNTX09FTV9FTkNPREVfTUVUSE9EREVGCisjZW5kaWYgLyogIWRlZmluZWQoX0NPREVDU19PRU1fRU5DT0RFX01FVEhPRERFRikgKi8KKwogI2lmbmRlZiBfQ09ERUNTX0NPREVfUEFHRV9FTkNPREVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfQ09ERUNTX0NPREVfUEFHRV9FTkNPREVfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX0NPREVDU19DT0RFX1BBR0VfRU5DT0RFX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00MmZlZDk0ZTJhYjc2NWJhIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lYmUzMTNhYjQxN2IxN2JiIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19jcnlwdG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fY3J5cHRtb2R1bGUuYy5oCmluZGV4IGEzYzM3MWMuLjQxMmM2ZmUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19jcnlwdG1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2NyeXB0bW9kdWxlLmMuaApAQCAtMjcsMTEgKzI3LDEyIEBACiAgICAgY29uc3QgY2hhciAqc2FsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6Y3J5cHQiLAotICAgICAgICAmd29yZCwgJnNhbHQpKQorICAgICAgICAmd29yZCwgJnNhbHQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gY3J5cHRfY3J5cHRfaW1wbChtb2R1bGUsIHdvcmQsIHNhbHQpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZTA0OTNhOTY5MTUzNzY5MCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGRmYzg4MjY0ZTY2MmRmNCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fY3Vyc2VzbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19jdXJzZXNtb2R1bGUuYy5oCmluZGV4IDVlMTE3NDIuLjYyZmYxYzggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19jdXJzZXNtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19jdXJzZXNtb2R1bGUuYy5oCkBAIC00MCwyMiArNDAsMjYgQEAKIAogICAgIHN3aXRjaCAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSkgewogICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86YWRkY2giLCAmY2gpKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOmFkZGNoIiwgJmNoKSkgewogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9sOmFkZGNoIiwgJmNoLCAmYXR0cikpCisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9sOmFkZGNoIiwgJmNoLCAmYXR0cikpIHsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBncm91cF9yaWdodF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpTzphZGRjaCIsICZ5LCAmeCwgJmNoKSkKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlPOmFkZGNoIiwgJnksICZ4LCAmY2gpKSB7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgZ3JvdXBfbGVmdF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpT2w6YWRkY2giLCAmeSwgJngsICZjaCwgJmF0dHIpKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaU9sOmFkZGNoIiwgJnksICZ4LCAmY2gsICZhdHRyKSkgewogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdyb3VwX3JpZ2h0XzEgPSAxOwogICAgICAgICAgICAgZ3JvdXBfbGVmdF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjgsNCArNzIsNCBAQAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk4MmIxZTcwOTU3N2YzZWMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTEzZmZjNWY4ZDc5Y2JmYmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2RhdGV0aW1lbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19kYXRldGltZW1vZHVsZS5jLmgKaW5kZXggNjg4YzkwMy4uY2YwOTIwNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2RhdGV0aW1lbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fZGF0ZXRpbWVtb2R1bGUuYy5oCkBAIC0yMywxNSArMjMsMTcgQEAKIGRhdGV0aW1lX2RhdGV0aW1lX25vdyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsidHoiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJ0eiIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOm5vdyIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnR6ID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOm5vdyIsIF9rZXl3b3JkcywKLSAgICAgICAgJnR6KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ0eikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBkYXRldGltZV9kYXRldGltZV9ub3dfaW1wbCh0eXBlLCB0eik7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03ZjQ1YzY3MGQ2ZTQ5NTNhIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02MWY4NWFmNTYzN2RmOGI1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19kYm1tb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2RibW1vZHVsZS5jLmgKaW5kZXggNDljYmNlYi4uMDZjZjdlNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2RibW1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2RibW1vZHVsZS5jLmgKQEAgLTYwLDggKzYwLDkgQEAKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfE86Z2V0IiwKLSAgICAgICAgJmtleSwgJmtleV9sZW5ndGgsICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmtleSwgJmtleV9sZW5ndGgsICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9kYm1fZGJtX2dldF9pbXBsKHNlbGYsIGtleSwga2V5X2xlbmd0aCwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC05Myw4ICs5NCw5IEBACiAgICAgUHlPYmplY3QgKmRlZmF1bHRfdmFsdWUgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xPOnNldGRlZmF1bHQiLAotICAgICAgICAma2V5LCAma2V5X2xlbmd0aCwgJmRlZmF1bHRfdmFsdWUpKQorICAgICAgICAma2V5LCAma2V5X2xlbmd0aCwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2RibV9kYm1fc2V0ZGVmYXVsdF9pbXBsKHNlbGYsIGtleSwga2V5X2xlbmd0aCwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xMzEsMTEgKzEzMywxMiBAQAogICAgIGludCBtb2RlID0gNDM4OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHNpOm9wZW4iLAotICAgICAgICAmZmlsZW5hbWUsICZmbGFncywgJm1vZGUpKQorICAgICAgICAmZmlsZW5hbWUsICZmbGFncywgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZGJtb3Blbl9pbXBsKG1vZHVsZSwgZmlsZW5hbWUsIGZsYWdzLCBtb2RlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZmZjEyZjE2OGNkZjhiNDMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk5YWRmOTY2ZWYwNDc1ZmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2VsZW1lbnR0cmVlLmMuaCBiL01vZHVsZXMvY2xpbmljL19lbGVtZW50dHJlZS5jLmgKaW5kZXggODZiNGM0Yy4uYzkxZGZiZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2VsZW1lbnR0cmVlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fZWxlbWVudHRyZWUuYy5oCkBAIC0xOSw4ICsxOSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnN1YmVsZW1lbnQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8hOmFwcGVuZCIsICZFbGVtZW50X1R5cGUsICZzdWJlbGVtZW50KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8hOmFwcGVuZCIsICZFbGVtZW50X1R5cGUsICZzdWJlbGVtZW50KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2FwcGVuZF9pbXBsKHNlbGYsIHN1YmVsZW1lbnQpOwogCiBleGl0OgpAQCAtODcsOCArODgsOSBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9fX3NpemVvZl9fX2ltcGwoc2VsZik7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTE0NCwxMyArMTQ2LDE1IEBACiBfZWxlbWVudHRyZWVfRWxlbWVudF9maW5kKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJuYW1lc3BhY2VzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJuYW1lc3BhY2VzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3xPOmZpbmQiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpwYXRoOwogICAgIFB5T2JqZWN0ICpuYW1lc3BhY2VzID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TzpmaW5kIiwgX2tleXdvcmRzLAotICAgICAgICAmcGF0aCwgJm5hbWVzcGFjZXMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2ZpbmRfaW1wbChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzKTsKIAogZXhpdDoKQEAgLTE3NCwxNCArMTc4LDE2IEBACiBfZWxlbWVudHRyZWVfRWxlbWVudF9maW5kdGV4dChFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAiZGVmYXVsdCIsICJuYW1lc3BhY2VzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkZWZhdWx0IiwgIm5hbWVzcGFjZXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfE9POmZpbmR0ZXh0IiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqcGF0aDsKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IFB5X05vbmU7CiAgICAgUHlPYmplY3QgKm5hbWVzcGFjZXMgPSBQeV9Ob25lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xPTzpmaW5kdGV4dCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgsICZkZWZhdWx0X3ZhbHVlLCAmbmFtZXNwYWNlcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmcGF0aCwgJmRlZmF1bHRfdmFsdWUsICZuYW1lc3BhY2VzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2ZpbmR0ZXh0X2ltcGwoc2VsZiwgcGF0aCwgZGVmYXVsdF92YWx1ZSwgbmFtZXNwYWNlcyk7CiAKIGV4aXQ6CkBAIC0yMDQsMTMgKzIxMCwxNSBAQAogX2VsZW1lbnR0cmVlX0VsZW1lbnRfZmluZGFsbChFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAibmFtZXNwYWNlcyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAibmFtZXNwYWNlcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98TzpmaW5kYWxsIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqcGF0aDsKICAgICBQeU9iamVjdCAqbmFtZXNwYWNlcyA9IFB5X05vbmU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfE86ZmluZGFsbCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZwYXRoLCAmbmFtZXNwYWNlcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9maW5kYWxsX2ltcGwoc2VsZiwgcGF0aCwgbmFtZXNwYWNlcyk7CiAKIGV4aXQ6CkBAIC0yMzMsMTMgKzI0MSwxNSBAQAogX2VsZW1lbnR0cmVlX0VsZW1lbnRfaXRlcmZpbmQoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgIm5hbWVzcGFjZXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgIm5hbWVzcGFjZXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfE86aXRlcmZpbmQiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpwYXRoOwogICAgIFB5T2JqZWN0ICpuYW1lc3BhY2VzID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TzppdGVyZmluZCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZwYXRoLCAmbmFtZXNwYWNlcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9pdGVyZmluZF9pbXBsKHNlbGYsIHBhdGgsIG5hbWVzcGFjZXMpOwogCiBleGl0OgpAQCAtMjYyLDEzICsyNzIsMTUgQEAKIF9lbGVtZW50dHJlZV9FbGVtZW50X2dldChFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImtleSIsICJkZWZhdWx0IiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsia2V5IiwgImRlZmF1bHQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfE86Z2V0IiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqa2V5OwogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TzpnZXQiLCBfa2V5d29yZHMsCi0gICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2dldF9pbXBsKHNlbGYsIGtleSwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMDcsMTIgKzMxOSwxNCBAQAogX2VsZW1lbnR0cmVlX0VsZW1lbnRfaXRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InRhZyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InRhZyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOml0ZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICp0YWcgPSBQeV9Ob25lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86aXRlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJnRhZykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmdGFnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2l0ZXJfaW1wbChzZWxmLCB0YWcpOwogCiBleGl0OgpAQCAtMzU2LDggKzM3MCw5IEBACiAgICAgUHlPYmplY3QgKnN1YmVsZW1lbnQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5PITppbnNlcnQiLAotICAgICAgICAmaW5kZXgsICZFbGVtZW50X1R5cGUsICZzdWJlbGVtZW50KSkKKyAgICAgICAgJmluZGV4LCAmRWxlbWVudF9UeXBlLCAmc3ViZWxlbWVudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9pbnNlcnRfaW1wbChzZWxmLCBpbmRleCwgc3ViZWxlbWVudCk7CiAKIGV4aXQ6CkBAIC00MTksOCArNDM0LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIm1ha2VlbGVtZW50IiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJnRhZywgJmF0dHJpYikpCisgICAgICAgICZ0YWcsICZhdHRyaWIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfbWFrZWVsZW1lbnRfaW1wbChzZWxmLCB0YWcsIGF0dHJpYik7CiAKIGV4aXQ6CkBAIC00NDQsOCArNDYwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqc3ViZWxlbWVudDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyE6cmVtb3ZlIiwgJkVsZW1lbnRfVHlwZSwgJnN1YmVsZW1lbnQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyE6cmVtb3ZlIiwgJkVsZW1lbnRfVHlwZSwgJnN1YmVsZW1lbnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfcmVtb3ZlX2ltcGwoc2VsZiwgc3ViZWxlbWVudCk7CiAKIGV4aXQ6CkBAIC00NzMsOCArNDkwLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNldCIsCiAgICAgICAgIDIsIDIsCi0gICAgICAgICZrZXksICZ2YWx1ZSkpCisgICAgICAgICZrZXksICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9zZXRfaW1wbChzZWxmLCBrZXksIHZhbHVlKTsKIAogZXhpdDoKQEAgLTQ4OSwxMiArNTA3LDE0IEBACiBfZWxlbWVudHRyZWVfVHJlZUJ1aWxkZXJfX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImVsZW1lbnRfZmFjdG9yeSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImVsZW1lbnRfZmFjdG9yeSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOlRyZWVCdWlsZGVyIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqZWxlbWVudF9mYWN0b3J5ID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOlRyZWVCdWlsZGVyIiwgX2tleXdvcmRzLAotICAgICAgICAmZWxlbWVudF9mYWN0b3J5KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZlbGVtZW50X2ZhY3RvcnkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX1RyZWVCdWlsZGVyX19faW5pdF9fX2ltcGwoKFRyZWVCdWlsZGVyT2JqZWN0ICopc2VsZiwgZWxlbWVudF9mYWN0b3J5KTsKIAogZXhpdDoKQEAgLTU1NSw4ICs1NzUsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3RhcnQiLAogICAgICAgICAxLCAyLAotICAgICAgICAmdGFnLCAmYXR0cnMpKQorICAgICAgICAmdGFnLCAmYXR0cnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX1RyZWVCdWlsZGVyX3N0YXJ0X2ltcGwoc2VsZiwgdGFnLCBhdHRycyk7CiAKIGV4aXQ6CkBAIC01NzEsMTQgKzU5MiwxNiBAQAogX2VsZW1lbnR0cmVlX1hNTFBhcnNlcl9fX2luaXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgaW50IHJldHVybl92YWx1ZSA9IC0xOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiaHRtbCIsICJ0YXJnZXQiLCAiZW5jb2RpbmciLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJodG1sIiwgInRhcmdldCIsICJlbmNvZGluZyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPT3o6WE1MUGFyc2VyIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqaHRtbCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnRhcmdldCA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9PejpYTUxQYXJzZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZodG1sLCAmdGFyZ2V0LCAmZW5jb2RpbmcpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmh0bWwsICZ0YXJnZXQsICZlbmNvZGluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfWE1MUGFyc2VyX19faW5pdF9fX2ltcGwoKFhNTFBhcnNlck9iamVjdCAqKXNlbGYsIGh0bWwsIHRhcmdldCwgZW5jb2RpbmcpOwogCiBleGl0OgpAQCAtNjQwLDggKzY2Myw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkb2N0eXBlIiwKICAgICAgICAgMywgMywKLSAgICAgICAgJm5hbWUsICZwdWJpZCwgJnN5c3RlbSkpCisgICAgICAgICZuYW1lLCAmcHViaWQsICZzeXN0ZW0pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX1hNTFBhcnNlcl9kb2N0eXBlX2ltcGwoc2VsZiwgbmFtZSwgcHViaWQsIHN5c3RlbSk7CiAKIGV4aXQ6CkBAIC02NjgsMTIgKzY5MiwxNCBAQAogICAgIFB5T2JqZWN0ICpldmVudHNfcXVldWU7CiAgICAgUHlPYmplY3QgKmV2ZW50c190b19yZXBvcnQgPSBQeV9Ob25lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOl9zZXRldmVudHMiLAotICAgICAgICAmUHlMaXN0X1R5cGUsICZldmVudHNfcXVldWUsICZldmVudHNfdG9fcmVwb3J0KSkKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJfc2V0ZXZlbnRzIiwKKyAgICAgICAgMSwgMiwKKyAgICAgICAgJmV2ZW50c19xdWV1ZSwgJmV2ZW50c190b19yZXBvcnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX1hNTFBhcnNlcl9fc2V0ZXZlbnRzX2ltcGwoc2VsZiwgZXZlbnRzX3F1ZXVlLCBldmVudHNfdG9fcmVwb3J0KTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTI1YjhiZjdlN2YyMTUxY2EgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTRjNWU5NGMyOGEwMDljZTYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2dkYm1tb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2dkYm1tb2R1bGUuYy5oCmluZGV4IDJkODdjZmMuLmZkZDU4OWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19nZGJtbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fZ2RibW1vZHVsZS5jLmgKQEAgLTIzLDggKzIzLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImdldCIsCiAgICAgICAgIDEsIDIsCi0gICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmtleSwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2dkYm1fZ2RibV9nZXRfaW1wbChzZWxmLCBrZXksIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtNTMsOCArNTQsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2V0ZGVmYXVsdCIsCiAgICAgICAgIDEsIDIsCi0gICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmtleSwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2dkYm1fZ2RibV9zZXRkZWZhdWx0X2ltcGwoc2VsZiwga2V5LCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTE0Nyw4ICsxNDksOSBAQAogICAgIGNvbnN0IGNoYXIgKmtleTsKICAgICBQeV9zc2l6ZV9jbGVhbl90IGtleV9sZW5ndGg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInMjOm5leHRrZXkiLCAma2V5LCAma2V5X2xlbmd0aCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzIzpuZXh0a2V5IiwgJmtleSwgJmtleV9sZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2dkYm1fZ2RibV9uZXh0a2V5X2ltcGwoc2VsZiwga2V5LCBrZXlfbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTI0MiwxMSArMjQ1LDEyIEBACiAgICAgaW50IG1vZGUgPSA0Mzg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8c2k6b3BlbiIsCi0gICAgICAgICZuYW1lLCAmZmxhZ3MsICZtb2RlKSkKKyAgICAgICAgJm5hbWUsICZmbGFncywgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZGJtb3Blbl9pbXBsKG1vZHVsZSwgbmFtZSwgZmxhZ3MsIG1vZGUpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OWFjN2E4OTg1OGE5NzY1ZiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZWQwZjVkNGUzZDc5YjgwYyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9faGFzaG9wZW5zc2wuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2hhc2hvcGVuc3NsLmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmU2Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9jbGluaWMvX2hhc2hvcGVuc3NsLmMuaApAQCAtMCwwICsxLDYwIEBACisvKltjbGluaWMgaW5wdXRdCitwcmVzZXJ2ZQorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPiAweDEwMTAwMDAwTCAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1NDUllQVCkgJiYgIWRlZmluZWQoTElCUkVTU0xfVkVSU0lPTl9OVU1CRVIpKQorCitQeURvY19TVFJWQVIoX2hhc2hsaWJfc2NyeXB0X19kb2NfXywKKyJzY3J5cHQoJG1vZHVsZSwgLywgcGFzc3dvcmQsICosIHNhbHQ9Tm9uZSwgbj1Ob25lLCByPU5vbmUsIHA9Tm9uZSxcbiIKKyIgICAgICAgbWF4bWVtPTAsIGRrbGVuPTY0KVxuIgorIi0tXG4iCisiXG4iCisic2NyeXB0IHBhc3N3b3JkLWJhc2VkIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uLiIpOworCisjZGVmaW5lIF9IQVNITElCX1NDUllQVF9NRVRIT0RERUYgICAgXAorICAgIHsic2NyeXB0IiwgKFB5Q0Z1bmN0aW9uKV9oYXNobGliX3NjcnlwdCwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIF9oYXNobGliX3NjcnlwdF9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorX2hhc2hsaWJfc2NyeXB0X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpwYXNzd29yZCwgUHlfYnVmZmVyICpzYWx0LAorICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5fb2JqLCBQeU9iamVjdCAqcl9vYmosIFB5T2JqZWN0ICpwX29iaiwKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgbWF4bWVtLCBsb25nIGRrbGVuKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19oYXNobGliX3NjcnlwdChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKyAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXNzd29yZCIsICJzYWx0IiwgIm4iLCAiciIsICJwIiwgIm1heG1lbSIsICJka2xlbiIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InkqfCR5Kk8hTyFPIWxsOnNjcnlwdCIsIF9rZXl3b3JkcywgMH07CisgICAgUHlfYnVmZmVyIHBhc3N3b3JkID0ge05VTEwsIE5VTEx9OworICAgIFB5X2J1ZmZlciBzYWx0ID0ge05VTEwsIE5VTEx9OworICAgIFB5T2JqZWN0ICpuX29iaiA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKnJfb2JqID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqcF9vYmogPSBQeV9Ob25lOworICAgIGxvbmcgbWF4bWVtID0gMDsKKyAgICBsb25nIGRrbGVuID0gNjQ7CisKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZwYXNzd29yZCwgJnNhbHQsICZQeUxvbmdfVHlwZSwgJm5fb2JqLCAmUHlMb25nX1R5cGUsICZyX29iaiwgJlB5TG9uZ19UeXBlLCAmcF9vYmosICZtYXhtZW0sICZka2xlbikpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBfaGFzaGxpYl9zY3J5cHRfaW1wbChtb2R1bGUsICZwYXNzd29yZCwgJnNhbHQsIG5fb2JqLCByX29iaiwgcF9vYmosIG1heG1lbSwgZGtsZW4pOworCitleGl0OgorICAgIC8qIENsZWFudXAgZm9yIHBhc3N3b3JkICovCisgICAgaWYgKHBhc3N3b3JkLm9iaikgeworICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhc3N3b3JkKTsKKyAgICB9CisgICAgLyogQ2xlYW51cCBmb3Igc2FsdCAqLworICAgIGlmIChzYWx0Lm9iaikgeworICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnNhbHQpOworICAgIH0KKworICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKKyNlbmRpZiAvKiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+IDB4MTAxMDAwMDBMICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU0NSWVBUKSAmJiAhZGVmaW5lZChMSUJSRVNTTF9WRVJTSU9OX05VTUJFUikpICovCisKKyNpZm5kZWYgX0hBU0hMSUJfU0NSWVBUX01FVEhPRERFRgorICAgICNkZWZpbmUgX0hBU0hMSUJfU0NSWVBUX01FVEhPRERFRgorI2VuZGlmIC8qICFkZWZpbmVkKF9IQVNITElCX1NDUllQVF9NRVRIT0RERUYpICovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGM1Mzg2Nzg5Zjc3NDMwYSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fbHptYW1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fbHptYW1vZHVsZS5jLmgKaW5kZXggZjhkMzhlYS4uYzJhYzg5YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2x6bWFtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19sem1hbW9kdWxlLmMuaApAQCAtMjUsMTQgKzI1LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmNvbXByZXNzIiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6Y29tcHJlc3MiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbHptYV9MWk1BQ29tcHJlc3Nvcl9jb21wcmVzc19pbXBsKHNlbGYsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04OSwxOSArOTEsMjIgQEAKIF9sem1hX0xaTUFEZWNvbXByZXNzb3JfZGVjb21wcmVzcyhEZWNvbXByZXNzb3IgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZGF0YSIsICJtYXhfbGVuZ3RoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZGF0YSIsICJtYXhfbGVuZ3RoIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsieSp8bjpkZWNvbXByZXNzIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKICAgICBQeV9zc2l6ZV90IG1heF9sZW5ndGggPSAtMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInkqfG46ZGVjb21wcmVzcyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmRhdGEsICZtYXhfbGVuZ3RoKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCAmbWF4X2xlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbHptYV9MWk1BRGVjb21wcmVzc29yX2RlY29tcHJlc3NfaW1wbChzZWxmLCAmZGF0YSwgbWF4X2xlbmd0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTM3LDE0ICsxNDIsMTYgQEAKIF9sem1hX0xaTUFEZWNvbXByZXNzb3JfX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImZvcm1hdCIsICJtZW1saW1pdCIsICJmaWx0ZXJzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZm9ybWF0IiwgIm1lbWxpbWl0IiwgImZpbHRlcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8aU9POkxaTUFEZWNvbXByZXNzb3IiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBmb3JtYXQgPSBGT1JNQVRfQVVUTzsKICAgICBQeU9iamVjdCAqbWVtbGltaXQgPSBQeV9Ob25lOwogICAgIFB5T2JqZWN0ICpmaWx0ZXJzID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpT086TFpNQURlY29tcHJlc3NvciIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZvcm1hdCwgJm1lbWxpbWl0LCAmZmlsdGVycykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZm9ybWF0LCAmbWVtbGltaXQsICZmaWx0ZXJzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9sem1hX0xaTUFEZWNvbXByZXNzb3JfX19pbml0X19faW1wbCgoRGVjb21wcmVzc29yICopc2VsZiwgZm9ybWF0LCBtZW1saW1pdCwgZmlsdGVycyk7CiAKIGV4aXQ6CkBAIC0xNzEsOCArMTc4LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgY2hlY2tfaWQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6aXNfY2hlY2tfc3VwcG9ydGVkIiwgJmNoZWNrX2lkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6aXNfY2hlY2tfc3VwcG9ydGVkIiwgJmNoZWNrX2lkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9sem1hX2lzX2NoZWNrX3N1cHBvcnRlZF9pbXBsKG1vZHVsZSwgY2hlY2tfaWQpOwogCiBleGl0OgpAQCAtMTk5LDggKzIwNyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgbHptYV9maWx0ZXIgZmlsdGVyID0ge0xaTUFfVkxJX1VOS05PV04sIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpfZW5jb2RlX2ZpbHRlcl9wcm9wZXJ0aWVzIiwgbHptYV9maWx0ZXJfY29udmVydGVyLCAmZmlsdGVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl9lbmNvZGVfZmlsdGVyX3Byb3BlcnRpZXMiLCBsem1hX2ZpbHRlcl9jb252ZXJ0ZXIsICZmaWx0ZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2x6bWFfX2VuY29kZV9maWx0ZXJfcHJvcGVydGllc19pbXBsKG1vZHVsZSwgZmlsdGVyKTsKIAogZXhpdDoKQEAgLTIzNCwxNSArMjQzLDE3IEBACiAgICAgUHlfYnVmZmVyIGVuY29kZWRfcHJvcHMgPSB7TlVMTCwgTlVMTH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8meSo6X2RlY29kZV9maWx0ZXJfcHJvcGVydGllcyIsCi0gICAgICAgIGx6bWFfdmxpX2NvbnZlcnRlciwgJmZpbHRlcl9pZCwgJmVuY29kZWRfcHJvcHMpKQorICAgICAgICBsem1hX3ZsaV9jb252ZXJ0ZXIsICZmaWx0ZXJfaWQsICZlbmNvZGVkX3Byb3BzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9sem1hX19kZWNvZGVfZmlsdGVyX3Byb3BlcnRpZXNfaW1wbChtb2R1bGUsIGZpbHRlcl9pZCwgJmVuY29kZWRfcHJvcHMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGVuY29kZWRfcHJvcHMgKi8KLSAgICBpZiAoZW5jb2RlZF9wcm9wcy5vYmopCisgICAgaWYgKGVuY29kZWRfcHJvcHMub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZW5jb2RlZF9wcm9wcyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mYWRhMDYwMjBmZDMxOGNjIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05NDM0NTgzZmUxMTFjNzcxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19vcGNvZGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX29wY29kZS5jLmgKaW5kZXggYTVmNjQ0Mi4uNTEzY2JmZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX29wY29kZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX29wY29kZS5jLmgKQEAgLTIzLDE0ICsyMywxNiBAQAogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfE86c3RhY2tfZWZmZWN0IiwKLSAgICAgICAgJm9wY29kZSwgJm9wYXJnKSkKKyAgICAgICAgJm9wY29kZSwgJm9wYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfb3Bjb2RlX3N0YWNrX2VmZmVjdF9pbXBsKG1vZHVsZSwgb3Bjb2RlLCBvcGFyZyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk4NGQ2ZGUxNDAzMDNkMTAgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTRkOTFjNmE3NjUwOTc4NTMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX3BpY2tsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fcGlja2xlLmMuaAppbmRleCBiZDEyZDJhLi5iOGVlYzMzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fcGlja2xlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fcGlja2xlLmMuaApAQCAtNTMsOCArNTMsOSBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfcGlja2xlX1BpY2tsZXJfX19zaXplb2ZfX19pbXBsKHNlbGYpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC05MiwxNCArOTMsMTYgQEAKIF9waWNrbGVfUGlja2xlcl9fX2luaXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgaW50IHJldHVybl92YWx1ZSA9IC0xOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmlsZSIsICJwcm90b2NvbCIsICJmaXhfaW1wb3J0cyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZpbGUiLCAicHJvdG9jb2wiLCAiZml4X2ltcG9ydHMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfE9wOlBpY2tsZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpmaWxlOwogICAgIFB5T2JqZWN0ICpwcm90b2NvbCA9IE5VTEw7CiAgICAgaW50IGZpeF9pbXBvcnRzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98T3A6UGlja2xlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZpbGUsICZwcm90b2NvbCwgJmZpeF9pbXBvcnRzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZmaWxlLCAmcHJvdG9jb2wsICZmaXhfaW1wb3J0cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfcGlja2xlX1BpY2tsZXJfX19pbml0X19faW1wbCgoUGlja2xlck9iamVjdCAqKXNlbGYsIGZpbGUsIHByb3RvY29sLCBmaXhfaW1wb3J0cyk7CiAKIGV4aXQ6CkBAIC0yMTIsOCArMjE1LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZpbmRfY2xhc3MiLAogICAgICAgICAyLCAyLAotICAgICAgICAmbW9kdWxlX25hbWUsICZnbG9iYWxfbmFtZSkpCisgICAgICAgICZtb2R1bGVfbmFtZSwgJmdsb2JhbF9uYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfVW5waWNrbGVyX2ZpbmRfY2xhc3NfaW1wbChzZWxmLCBtb2R1bGVfbmFtZSwgZ2xvYmFsX25hbWUpOwogCiBleGl0OgpAQCAtMjM5LDggKzI0Myw5IEBACiAgICAgUHlfc3NpemVfdCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgX3JldHVybl92YWx1ZSA9IF9waWNrbGVfVW5waWNrbGVyX19fc2l6ZW9mX19faW1wbChzZWxmKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjgxLDE1ICsyODYsMTcgQEAKIF9waWNrbGVfVW5waWNrbGVyX19faW5pdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBpbnQgcmV0dXJuX3ZhbHVlID0gLTE7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJmaWxlIiwgImZpeF9pbXBvcnRzIiwgImVuY29kaW5nIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZpbGUiLCAiZml4X2ltcG9ydHMiLCAiZW5jb2RpbmciLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3wkcHNzOlVucGlja2xlciIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKmZpbGU7CiAgICAgaW50IGZpeF9pbXBvcnRzID0gMTsKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9ICJBU0NJSSI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gInN0cmljdCI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfCRwc3M6VW5waWNrbGVyIiwgX2tleXdvcmRzLAotICAgICAgICAmZmlsZSwgJmZpeF9pbXBvcnRzLCAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmZpbGUsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfVW5waWNrbGVyX19faW5pdF9fX2ltcGwoKFVucGlja2xlck9iamVjdCAqKXNlbGYsIGZpbGUsIGZpeF9pbXBvcnRzLCBlbmNvZGluZywgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTM4NywxNSArMzk0LDE3IEBACiBfcGlja2xlX2R1bXAoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJvYmoiLCAiZmlsZSIsICJwcm90b2NvbCIsICJmaXhfaW1wb3J0cyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7Im9iaiIsICJmaWxlIiwgInByb3RvY29sIiwgImZpeF9pbXBvcnRzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT098TyRwOmR1bXAiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpvYmo7CiAgICAgUHlPYmplY3QgKmZpbGU7CiAgICAgUHlPYmplY3QgKnByb3RvY29sID0gTlVMTDsKICAgICBpbnQgZml4X2ltcG9ydHMgPSAxOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT098TyRwOmR1bXAiLCBfa2V5d29yZHMsCi0gICAgICAgICZvYmosICZmaWxlLCAmcHJvdG9jb2wsICZmaXhfaW1wb3J0cykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmb2JqLCAmZmlsZSwgJnByb3RvY29sLCAmZml4X2ltcG9ydHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3BpY2tsZV9kdW1wX2ltcGwobW9kdWxlLCBvYmosIGZpbGUsIHByb3RvY29sLCBmaXhfaW1wb3J0cyk7CiAKIGV4aXQ6CkBAIC00MzEsMTQgKzQ0MCwxNiBAQAogX3BpY2tsZV9kdW1wcyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7Im9iaiIsICJwcm90b2NvbCIsICJmaXhfaW1wb3J0cyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7Im9iaiIsICJwcm90b2NvbCIsICJmaXhfaW1wb3J0cyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98TyRwOmR1bXBzIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqb2JqOwogICAgIFB5T2JqZWN0ICpwcm90b2NvbCA9IE5VTEw7CiAgICAgaW50IGZpeF9pbXBvcnRzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TyRwOmR1bXBzIiwgX2tleXdvcmRzLAotICAgICAgICAmb2JqLCAmcHJvdG9jb2wsICZmaXhfaW1wb3J0cykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmb2JqLCAmcHJvdG9jb2wsICZmaXhfaW1wb3J0cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfcGlja2xlX2R1bXBzX2ltcGwobW9kdWxlLCBvYmosIHByb3RvY29sLCBmaXhfaW1wb3J0cyk7CiAKIGV4aXQ6CkBAIC00ODUsMTUgKzQ5NiwxNyBAQAogX3BpY2tsZV9sb2FkKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmlsZSIsICJmaXhfaW1wb3J0cyIsICJlbmNvZGluZyIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJmaWxlIiwgImZpeF9pbXBvcnRzIiwgImVuY29kaW5nIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98JHBzczpsb2FkIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqZmlsZTsKICAgICBpbnQgZml4X2ltcG9ydHMgPSAxOwogICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nID0gIkFTQ0lJIjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSAic3RyaWN0IjsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98JHBzczpsb2FkIiwgX2tleXdvcmRzLAotICAgICAgICAmZmlsZSwgJmZpeF9pbXBvcnRzLCAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmZpbGUsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfbG9hZF9pbXBsKG1vZHVsZSwgZmlsZSwgZml4X2ltcG9ydHMsIGVuY29kaW5nLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtNTMxLDE4ICs1NDQsMjAgQEAKIF9waWNrbGVfbG9hZHMoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJkYXRhIiwgImZpeF9pbXBvcnRzIiwgImVuY29kaW5nIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImRhdGEiLCAiZml4X2ltcG9ydHMiLCAiZW5jb2RpbmciLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3wkcHNzOmxvYWRzIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqZGF0YTsKICAgICBpbnQgZml4X2ltcG9ydHMgPSAxOwogICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nID0gIkFTQ0lJIjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSAic3RyaWN0IjsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98JHBzczpsb2FkcyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmRhdGEsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCAmZml4X2ltcG9ydHMsICZlbmNvZGluZywgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfcGlja2xlX2xvYWRzX2ltcGwobW9kdWxlLCBkYXRhLCBmaXhfaW1wb3J0cywgZW5jb2RpbmcsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05MzY1N2U1NWQ2YTc0OGFmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MGY5MTI3MTA5NjczYzk4IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19zcmUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX3NyZS5jLmgKaW5kZXggMzI4MTcxNy4uOWFiYTEzZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX3NyZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX3NyZS5jLmgKQEAgLTIwLDggKzIwLDkgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfc3JlX2dldGNvZGVzaXplX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDgsMTEgKzQ5LDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOmdldGxvd2VyIiwKLSAgICAgICAgJmNoYXJhY3RlciwgJmZsYWdzKSkKKyAgICAgICAgJmNoYXJhY3RlciwgJmZsYWdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfc3JlX2dldGxvd2VyX2ltcGwobW9kdWxlLCBjaGFyYWN0ZXIsIGZsYWdzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNzcsMTUgKzgwLDE3IEBACiBfc3JlX1NSRV9QYXR0ZXJuX21hdGNoKFBhdHRlcm5PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgInBvcyIsICJlbmRwb3MiLCAicGF0dGVybiIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInBhdHRlcm4iLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T25uJE86bWF0Y2giLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzdHJpbmcgPSBOVUxMOwogICAgIFB5X3NzaXplX3QgcG9zID0gMDsKICAgICBQeV9zc2l6ZV90IGVuZHBvcyA9IFBZX1NTSVpFX1RfTUFYOwogICAgIFB5T2JqZWN0ICpwYXR0ZXJuID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbm4kTzptYXRjaCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcywgJnBhdHRlcm4pKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcywgJnBhdHRlcm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9tYXRjaF9pbXBsKHNlbGYsIHN0cmluZywgcG9zLCBlbmRwb3MsIHBhdHRlcm4pOwogCiBleGl0OgpAQCAtMTExLDE1ICsxMTYsMTcgQEAKIF9zcmVfU1JFX1BhdHRlcm5fZnVsbG1hdGNoKFBhdHRlcm5PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgInBvcyIsICJlbmRwb3MiLCAicGF0dGVybiIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInBhdHRlcm4iLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T25uJE86ZnVsbG1hdGNoIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAgICAgUHlfc3NpemVfdCBlbmRwb3MgPSBQWV9TU0laRV9UX01BWDsKICAgICBQeU9iamVjdCAqcGF0dGVybiA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T25uJE86ZnVsbG1hdGNoIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX2Z1bGxtYXRjaF9pbXBsKHNlbGYsIHN0cmluZywgcG9zLCBlbmRwb3MsIHBhdHRlcm4pOwogCiBleGl0OgpAQCAtMTQ3LDE1ICsxNTQsMTcgQEAKIF9zcmVfU1JFX1BhdHRlcm5fc2VhcmNoKFBhdHRlcm5PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgInBvcyIsICJlbmRwb3MiLCAicGF0dGVybiIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInBhdHRlcm4iLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T25uJE86c2VhcmNoIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAgICAgUHlfc3NpemVfdCBlbmRwb3MgPSBQWV9TU0laRV9UX01BWDsKICAgICBQeU9iamVjdCAqcGF0dGVybiA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T25uJE86c2VhcmNoIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX3NlYXJjaF9pbXBsKHNlbGYsIHN0cmluZywgcG9zLCBlbmRwb3MsIHBhdHRlcm4pOwogCiBleGl0OgpAQCAtMTgxLDE1ICsxOTAsMTcgQEAKIF9zcmVfU1JFX1BhdHRlcm5fZmluZGFsbChQYXR0ZXJuT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInNvdXJjZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInNvdXJjZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPbm4kTzpmaW5kYWxsIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAgICAgUHlfc3NpemVfdCBlbmRwb3MgPSBQWV9TU0laRV9UX01BWDsKICAgICBQeU9iamVjdCAqc291cmNlID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbm4kTzpmaW5kYWxsIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmc291cmNlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MsICZzb3VyY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9maW5kYWxsX2ltcGwoc2VsZiwgc3RyaW5nLCBwb3MsIGVuZHBvcywgc291cmNlKTsKIAogZXhpdDoKQEAgLTIxNSwxNCArMjI2LDE2IEBACiBfc3JlX1NSRV9QYXR0ZXJuX2ZpbmRpdGVyKFBhdHRlcm5PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgInBvcyIsICJlbmRwb3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzdHJpbmciLCAicG9zIiwgImVuZHBvcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98bm46ZmluZGl0ZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogICAgIFB5X3NzaXplX3QgZW5kcG9zID0gUFlfU1NJWkVfVF9NQVg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfG5uOmZpbmRpdGVyIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9maW5kaXRlcl9pbXBsKHNlbGYsIHN0cmluZywgcG9zLCBlbmRwb3MpOwogCiBleGl0OgpAQCAtMjQ1LDE0ICsyNTgsMTYgQEAKIF9zcmVfU1JFX1BhdHRlcm5fc2Nhbm5lcihQYXR0ZXJuT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgInBvcyIsICJlbmRwb3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfG5uOnNjYW5uZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogICAgIFB5X3NzaXplX3QgZW5kcG9zID0gUFlfU1NJWkVfVF9NQVg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfG5uOnNjYW5uZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX3NjYW5uZXJfaW1wbChzZWxmLCBzdHJpbmcsIHBvcywgZW5kcG9zKTsKIAogZXhpdDoKQEAgLTI3NiwxNCArMjkxLDE2IEBACiBfc3JlX1NSRV9QYXR0ZXJuX3NwbGl0KFBhdHRlcm5PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgIm1heHNwbGl0IiwgInNvdXJjZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJtYXhzcGxpdCIsICJzb3VyY2UiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T24kTzpzcGxpdCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnN0cmluZyA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBtYXhzcGxpdCA9IDA7CiAgICAgUHlPYmplY3QgKnNvdXJjZSA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T24kTzpzcGxpdCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZywgJm1heHNwbGl0LCAmc291cmNlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdHJpbmcsICZtYXhzcGxpdCwgJnNvdXJjZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX3NwbGl0X2ltcGwoc2VsZiwgc3RyaW5nLCBtYXhzcGxpdCwgc291cmNlKTsKIAogZXhpdDoKQEAgLTMwNywxNCArMzI0LDE2IEBACiBfc3JlX1NSRV9QYXR0ZXJuX3N1YihQYXR0ZXJuT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InJlcGwiLCAic3RyaW5nIiwgImNvdW50IiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicmVwbCIsICJzdHJpbmciLCAiY291bnQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPT3xuOnN1YiIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnJlcGw7CiAgICAgUHlPYmplY3QgKnN0cmluZzsKICAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9PfG46c3ViIiwgX2tleXdvcmRzLAotICAgICAgICAmcmVwbCwgJnN0cmluZywgJmNvdW50KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZyZXBsLCAmc3RyaW5nLCAmY291bnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9zdWJfaW1wbChzZWxmLCByZXBsLCBzdHJpbmcsIGNvdW50KTsKIAogZXhpdDoKQEAgLTMzOCwxNCArMzU3LDE2IEBACiBfc3JlX1NSRV9QYXR0ZXJuX3N1Ym4oUGF0dGVybk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJyZXBsIiwgInN0cmluZyIsICJjb3VudCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InJlcGwiLCAic3RyaW5nIiwgImNvdW50IiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT098bjpzdWJuIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqcmVwbDsKICAgICBQeU9iamVjdCAqc3RyaW5nOwogICAgIFB5X3NzaXplX3QgY291bnQgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT098bjpzdWJuIiwgX2tleXdvcmRzLAotICAgICAgICAmcmVwbCwgJnN0cmluZywgJmNvdW50KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZyZXBsLCAmc3RyaW5nLCAmY291bnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9zdWJuX2ltcGwoc2VsZiwgcmVwbCwgc3RyaW5nLCBjb3VudCk7CiAKIGV4aXQ6CkBAIC0zODQsMTIgKzQwNSwxNCBAQAogX3NyZV9TUkVfUGF0dGVybl9fX2RlZXBjb3B5X18oUGF0dGVybk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJtZW1vIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsibWVtbyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik86X19kZWVwY29weV9fIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqbWVtbzsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk86X19kZWVwY29weV9fIiwgX2tleXdvcmRzLAotICAgICAgICAmbWVtbykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmbWVtbykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX19fZGVlcGNvcHlfX19pbXBsKHNlbGYsIG1lbW8pOwogCiBleGl0OgpAQCAtNDE0LDcgKzQzNyw4IEBACiBfc3JlX2NvbXBpbGUoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXR0ZXJuIiwgImZsYWdzIiwgImNvZGUiLCAiZ3JvdXBzIiwgImdyb3VwaW5kZXgiLCAiaW5kZXhncm91cCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdHRlcm4iLCAiZmxhZ3MiLCAiY29kZSIsICJncm91cHMiLCAiZ3JvdXBpbmRleCIsICJpbmRleGdyb3VwIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT2lPIW5PTzpjb21waWxlIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqcGF0dGVybjsKICAgICBpbnQgZmxhZ3M7CiAgICAgUHlPYmplY3QgKmNvZGU7CkBAIC00MjIsOSArNDQ2LDEwIEBACiAgICAgUHlPYmplY3QgKmdyb3VwaW5kZXg7CiAgICAgUHlPYmplY3QgKmluZGV4Z3JvdXA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPaU8hbk9POmNvbXBpbGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZwYXR0ZXJuLCAmZmxhZ3MsICZQeUxpc3RfVHlwZSwgJmNvZGUsICZncm91cHMsICZncm91cGluZGV4LCAmaW5kZXhncm91cCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmcGF0dGVybiwgJmZsYWdzLCAmUHlMaXN0X1R5cGUsICZjb2RlLCAmZ3JvdXBzLCAmZ3JvdXBpbmRleCwgJmluZGV4Z3JvdXApKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9jb21waWxlX2ltcGwobW9kdWxlLCBwYXR0ZXJuLCBmbGFncywgY29kZSwgZ3JvdXBzLCBncm91cGluZGV4LCBpbmRleGdyb3VwKTsKIAogZXhpdDoKQEAgLTQ0NywxMiArNDcyLDE0IEBACiBfc3JlX1NSRV9NYXRjaF9leHBhbmQoTWF0Y2hPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsidGVtcGxhdGUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJ0ZW1wbGF0ZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik86ZXhwYW5kIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqdGVtcGxhdGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPOmV4cGFuZCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnRlbXBsYXRlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ0ZW1wbGF0ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9NYXRjaF9leHBhbmRfaW1wbChzZWxmLCB0ZW1wbGF0ZSk7CiAKIGV4aXQ6CkBAIC00NzgsMTIgKzUwNSwxNCBAQAogX3NyZV9TUkVfTWF0Y2hfZ3JvdXBzKE1hdGNoT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImRlZmF1bHQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJkZWZhdWx0IiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE86Z3JvdXBzIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IFB5X05vbmU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8Tzpncm91cHMiLCBfa2V5d29yZHMsCi0gICAgICAgICZkZWZhdWx0X3ZhbHVlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX01hdGNoX2dyb3Vwc19pbXBsKHNlbGYsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtNTA5LDEyICs1MzgsMTQgQEAKIF9zcmVfU1JFX01hdGNoX2dyb3VwZGljdChNYXRjaE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJkZWZhdWx0IiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZGVmYXVsdCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOmdyb3VwZGljdCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKmRlZmF1bHRfdmFsdWUgPSBQeV9Ob25lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86Z3JvdXBkaWN0IiwgX2tleXdvcmRzLAotICAgICAgICAmZGVmYXVsdF92YWx1ZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZGVmYXVsdF92YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9NYXRjaF9ncm91cGRpY3RfaW1wbChzZWxmLCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTU0MiwxMSArNTczLDEzIEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdGFydCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZncm91cCkpCisgICAgICAgICZncm91cCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfTWF0Y2hfc3RhcnRfaW1wbChzZWxmLCBncm91cCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTU3NCwxMSArNjA3LDEzIEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJlbmQiLAogICAgICAgICAwLCAxLAotICAgICAgICAmZ3JvdXApKQorICAgICAgICAmZ3JvdXApKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF9zcmVfU1JFX01hdGNoX2VuZF9pbXBsKHNlbGYsIGdyb3VwKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNjA1LDggKzY0MCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzcGFuIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmdyb3VwKSkKKyAgICAgICAgJmdyb3VwKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX01hdGNoX3NwYW5faW1wbChzZWxmLCBncm91cCk7CiAKIGV4aXQ6CkBAIC02NDUsMTIgKzY4MSwxNCBAQAogX3NyZV9TUkVfTWF0Y2hfX19kZWVwY29weV9fKE1hdGNoT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7Im1lbW8iLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJtZW1vIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTzpfX2RlZXBjb3B5X18iLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICptZW1vOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTzpfX2RlZXBjb3B5X18iLCBfa2V5d29yZHMsCi0gICAgICAgICZtZW1vKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZtZW1vKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX01hdGNoX19fZGVlcGNvcHlfX19pbXBsKHNlbGYsIG1lbW8pOwogCiBleGl0OgpAQCAtNjkwLDQgKzcyOCw0IEBACiB7CiAgICAgcmV0dXJuIF9zcmVfU1JFX1NjYW5uZXJfc2VhcmNoX2ltcGwoc2VsZik7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTRjZTllNWI3NDhjZTUzMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmNiYzJiMTQ4MjczOGU1NCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fc3NsLmMuaCBiL01vZHVsZXMvY2xpbmljL19zc2wuYy5oCmluZGV4IDg1MmUzNjUuLmVlODIxM2EgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19zc2wuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19zc2wuYy5oCkBAIC0zNiw4ICszNiw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnBhdGg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl90ZXN0X2RlY29kZV9jZXJ0IiwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpfdGVzdF9kZWNvZGVfY2VydCIsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fdGVzdF9kZWNvZGVfY2VydF9pbXBsKG1vZHVsZSwgcGF0aCk7CiAKIGV4aXQ6CkBAIC03MSw4ICs3Miw5IEBACiAgICAgaW50IGJpbmFyeV9tb2RlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHA6cGVlcl9jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICZiaW5hcnlfbW9kZSkpCisgICAgICAgICZiaW5hcnlfbW9kZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xTb2NrZXRfcGVlcl9jZXJ0aWZpY2F0ZV9pbXBsKHNlbGYsIGJpbmFyeV9tb2RlKTsKIAogZXhpdDoKQEAgLTIwOSwxNCArMjExLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6d3JpdGUiLCAmYikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xTb2NrZXRfd3JpdGVfaW1wbChzZWxmLCAmYik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYiAqLwotICAgIGlmIChiLm9iaikKKyAgICBpZiAoYi5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZiKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjYwLDEyICsyNjQsMTQgQEAKIAogICAgIHN3aXRjaCAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSkgewogICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVhZCIsICZsZW4pKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlYWQiLCAmbGVuKSkgewogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml3KjpyZWFkIiwgJmxlbiwgJmJ1ZmZlcikpCisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml3KjpyZWFkIiwgJmxlbiwgJmJ1ZmZlcikpIHsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBncm91cF9yaWdodF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtMjc2LDggKzI4Miw5IEBACiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zMzIsMTEgKzMzOSwxMyBAQAogICAgIGludCBwcm90b192ZXJzaW9uOwogCiAgICAgaWYgKCh0eXBlID09ICZQeVNTTENvbnRleHRfVHlwZSkgJiYKLSAgICAgICAgIV9QeUFyZ19Ob0tleXdvcmRzKCJfU1NMQ29udGV4dCIsIGt3YXJncykpCisgICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiX1NTTENvbnRleHQiLCBrd2FyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOl9TU0xDb250ZXh0IiwKLSAgICAgICAgJnByb3RvX3ZlcnNpb24pKQorICAgICAgICAmcHJvdG9fdmVyc2lvbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xDb250ZXh0X2ltcGwodHlwZSwgcHJvdG9fdmVyc2lvbik7CiAKIGV4aXQ6CkBAIC0zNjAsMTQgKzM2OSwzNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmNpcGhlcmxpc3Q7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6c2V0X2NpcGhlcnMiLCAmY2lwaGVybGlzdCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOnNldF9jaXBoZXJzIiwgJmNpcGhlcmxpc3QpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9zZXRfY2lwaGVyc19pbXBsKHNlbGYsIGNpcGhlcmxpc3QpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CiAKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMDAyMDAwVUwpCisKK1B5RG9jX1NUUlZBUihfc3NsX19TU0xDb250ZXh0X2dldF9jaXBoZXJzX19kb2NfXywKKyJnZXRfY2lwaGVycygkc2VsZiwgLylcbiIKKyItLVxuIgorIlxuIik7CisKKyNkZWZpbmUgX1NTTF9fU1NMQ09OVEVYVF9HRVRfQ0lQSEVSU19NRVRIT0RERUYgICAgXAorICAgIHsiZ2V0X2NpcGhlcnMiLCAoUHlDRnVuY3Rpb24pX3NzbF9fU1NMQ29udGV4dF9nZXRfY2lwaGVycywgTUVUSF9OT0FSR1MsIF9zc2xfX1NTTENvbnRleHRfZ2V0X2NpcGhlcnNfX2RvY19ffSwKKworc3RhdGljIFB5T2JqZWN0ICoKK19zc2xfX1NTTENvbnRleHRfZ2V0X2NpcGhlcnNfaW1wbChQeVNTTENvbnRleHQgKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX3NzbF9fU1NMQ29udGV4dF9nZXRfY2lwaGVycyhQeVNTTENvbnRleHQgKnNlbGYsIFB5T2JqZWN0ICpQeV9VTlVTRUQoaWdub3JlZCkpCit7CisgICAgcmV0dXJuIF9zc2xfX1NTTENvbnRleHRfZ2V0X2NpcGhlcnNfaW1wbChzZWxmKTsKK30KKworI2VuZGlmIC8qIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAwMDIwMDBVTCkgKi8KKwogUHlEb2NfU1RSVkFSKF9zc2xfX1NTTENvbnRleHRfX3NldF9ucG5fcHJvdG9jb2xzX19kb2NfXywKICJfc2V0X25wbl9wcm90b2NvbHMoJHNlbGYsIHByb3RvcywgLylcbiIKICItLVxuIgpAQCAtMzg2LDE0ICs0MTcsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgcHJvdG9zID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpfc2V0X25wbl9wcm90b2NvbHMiLCAmcHJvdG9zKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOl9zZXRfbnBuX3Byb3RvY29scyIsICZwcm90b3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9fc2V0X25wbl9wcm90b2NvbHNfaW1wbChzZWxmLCAmcHJvdG9zKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBwcm90b3MgKi8KLSAgICBpZiAocHJvdG9zLm9iaikKKyAgICBpZiAocHJvdG9zLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnByb3Rvcyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQxNiwxNCArNDQ5LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIHByb3RvcyA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6X3NldF9hbHBuX3Byb3RvY29scyIsICZwcm90b3MpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6X3NldF9hbHBuX3Byb3RvY29scyIsICZwcm90b3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9fc2V0X2FscG5fcHJvdG9jb2xzX2ltcGwoc2VsZiwgJnByb3Rvcyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgcHJvdG9zICovCi0gICAgaWYgKHByb3Rvcy5vYmopCisgICAgaWYgKHByb3Rvcy5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwcm90b3MpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00NDQsMTQgKzQ3OSwxNiBAQAogX3NzbF9fU1NMQ29udGV4dF9sb2FkX2NlcnRfY2hhaW4oUHlTU0xDb250ZXh0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImNlcnRmaWxlIiwgImtleWZpbGUiLCAicGFzc3dvcmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJjZXJ0ZmlsZSIsICJrZXlmaWxlIiwgInBhc3N3b3JkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3xPTzpsb2FkX2NlcnRfY2hhaW4iLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpjZXJ0ZmlsZTsKICAgICBQeU9iamVjdCAqa2V5ZmlsZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnBhc3N3b3JkID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98T086bG9hZF9jZXJ0X2NoYWluIiwgX2tleXdvcmRzLAotICAgICAgICAmY2VydGZpbGUsICZrZXlmaWxlLCAmcGFzc3dvcmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmNlcnRmaWxlLCAma2V5ZmlsZSwgJnBhc3N3b3JkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfbG9hZF9jZXJ0X2NoYWluX2ltcGwoc2VsZiwgY2VydGZpbGUsIGtleWZpbGUsIHBhc3N3b3JkKTsKIAogZXhpdDoKQEAgLTQ3NiwxNCArNTEzLDE2IEBACiBfc3NsX19TU0xDb250ZXh0X2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhQeVNTTENvbnRleHQgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiY2FmaWxlIiwgImNhcGF0aCIsICJjYWRhdGEiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJjYWZpbGUiLCAiY2FwYXRoIiwgImNhZGF0YSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPT086bG9hZF92ZXJpZnlfbG9jYXRpb25zIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqY2FmaWxlID0gTlVMTDsKICAgICBQeU9iamVjdCAqY2FwYXRoID0gTlVMTDsKICAgICBQeU9iamVjdCAqY2FkYXRhID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPT086bG9hZF92ZXJpZnlfbG9jYXRpb25zIiwgX2tleXdvcmRzLAotICAgICAgICAmY2FmaWxlLCAmY2FwYXRoLCAmY2FkYXRhKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZjYWZpbGUsICZjYXBhdGgsICZjYWRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnNfaW1wbChzZWxmLCBjYWZpbGUsIGNhcGF0aCwgY2FkYXRhKTsKIAogZXhpdDoKQEAgLTUxNCwxNCArNTUzLDE2IEBACiBfc3NsX19TU0xDb250ZXh0X193cmFwX3NvY2tldChQeVNTTENvbnRleHQgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic29jayIsICJzZXJ2ZXJfc2lkZSIsICJzZXJ2ZXJfaG9zdG5hbWUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzb2NrIiwgInNlcnZlcl9zaWRlIiwgInNlcnZlcl9ob3N0bmFtZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8haXxPOl93cmFwX3NvY2tldCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnNvY2s7CiAgICAgaW50IHNlcnZlcl9zaWRlOwogICAgIFB5T2JqZWN0ICpob3N0bmFtZV9vYmogPSBQeV9Ob25lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyFpfE86X3dyYXBfc29ja2V0IiwgX2tleXdvcmRzLAotICAgICAgICBQeVNvY2tldE1vZHVsZS5Tb2NrX1R5cGUsICZzb2NrLCAmc2VydmVyX3NpZGUsICZob3N0bmFtZV9vYmopKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgUHlTb2NrZXRNb2R1bGUuU29ja19UeXBlLCAmc29jaywgJnNlcnZlcl9zaWRlLCAmaG9zdG5hbWVfb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfX3dyYXBfc29ja2V0X2ltcGwoc2VsZiwgc29jaywgc2VydmVyX3NpZGUsIGhvc3RuYW1lX29iaik7CiAKIGV4aXQ6CkBAIC01NDYsMTUgKzU4NywxNyBAQAogX3NzbF9fU1NMQ29udGV4dF9fd3JhcF9iaW8oUHlTU0xDb250ZXh0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImluY29taW5nIiwgIm91dGdvaW5nIiwgInNlcnZlcl9zaWRlIiwgInNlcnZlcl9ob3N0bmFtZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImluY29taW5nIiwgIm91dGdvaW5nIiwgInNlcnZlcl9zaWRlIiwgInNlcnZlcl9ob3N0bmFtZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8hTyFpfE86X3dyYXBfYmlvIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeVNTTE1lbW9yeUJJTyAqaW5jb21pbmc7CiAgICAgUHlTU0xNZW1vcnlCSU8gKm91dGdvaW5nOwogICAgIGludCBzZXJ2ZXJfc2lkZTsKICAgICBQeU9iamVjdCAqaG9zdG5hbWVfb2JqID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8hTyFpfE86X3dyYXBfYmlvIiwgX2tleXdvcmRzLAotICAgICAgICAmUHlTU0xNZW1vcnlCSU9fVHlwZSwgJmluY29taW5nLCAmUHlTU0xNZW1vcnlCSU9fVHlwZSwgJm91dGdvaW5nLCAmc2VydmVyX3NpZGUsICZob3N0bmFtZV9vYmopKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJlB5U1NMTWVtb3J5QklPX1R5cGUsICZpbmNvbWluZywgJlB5U1NMTWVtb3J5QklPX1R5cGUsICZvdXRnb2luZywgJnNlcnZlcl9zaWRlLCAmaG9zdG5hbWVfb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfX3dyYXBfYmlvX2ltcGwoc2VsZiwgaW5jb21pbmcsIG91dGdvaW5nLCBzZXJ2ZXJfc2lkZSwgaG9zdG5hbWVfb2JqKTsKIAogZXhpdDoKQEAgLTY2NiwxMiArNzA5LDE0IEBACiBfc3NsX19TU0xDb250ZXh0X2dldF9jYV9jZXJ0cyhQeVNTTENvbnRleHQgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiYmluYXJ5X2Zvcm0iLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJiaW5hcnlfZm9ybSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxwOmdldF9jYV9jZXJ0cyIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IGJpbmFyeV9mb3JtID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxwOmdldF9jYV9jZXJ0cyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmJpbmFyeV9mb3JtKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZiaW5hcnlfZm9ybSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xDb250ZXh0X2dldF9jYV9jZXJ0c19pbXBsKHNlbGYsIGJpbmFyeV9mb3JtKTsKIAogZXhpdDoKQEAgLTY4NywxMSArNzMyLDEzIEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAKICAgICBpZiAoKHR5cGUgPT0gJlB5U1NMTWVtb3J5QklPX1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9Qb3NpdGlvbmFsKCJNZW1vcnlCSU8iLCBhcmdzKSkKKyAgICAgICAgIV9QeUFyZ19Ob1Bvc2l0aW9uYWwoIk1lbW9yeUJJTyIsIGFyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgaWYgKCh0eXBlID09ICZQeVNTTE1lbW9yeUJJT19UeXBlKSAmJgotICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIk1lbW9yeUJJTyIsIGt3YXJncykpCisgICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiTWVtb3J5QklPIiwga3dhcmdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfTWVtb3J5QklPX2ltcGwodHlwZSk7CiAKIGV4aXQ6CkBAIC03MjIsOCArNzY5LDkgQEAKICAgICBpbnQgbGVuID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnJlYWQiLAotICAgICAgICAmbGVuKSkKKyAgICAgICAgJmxlbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX01lbW9yeUJJT19yZWFkX2ltcGwoc2VsZiwgbGVuKTsKIAogZXhpdDoKQEAgLTc1MCwxNCArNzk4LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6d3JpdGUiLCAmYikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX01lbW9yeUJJT193cml0ZV9pbXBsKHNlbGYsICZiKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBiICovCi0gICAgaWYgKGIub2JqKQorICAgIGlmIChiLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04MDUsMTQgKzg1NSwxNiBAQAogICAgIGRvdWJsZSBlbnRyb3B5OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKmQ6UkFORF9hZGQiLAotICAgICAgICAmdmlldywgJmVudHJvcHkpKQorICAgICAgICAmdmlldywgJmVudHJvcHkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9SQU5EX2FkZF9pbXBsKG1vZHVsZSwgJnZpZXcsIGVudHJvcHkpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIHZpZXcgKi8KLSAgICBpZiAodmlldy5vYmopCisgICAgaWYgKHZpZXcub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTgzNSw4ICs4ODcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBuOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOlJBTkRfYnl0ZXMiLCAmbikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOlJBTkRfYnl0ZXMiLCAmbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX1JBTkRfYnl0ZXNfaW1wbChtb2R1bGUsIG4pOwogCiBleGl0OgpAQCAtODY0LDggKzkxNyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG47CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6UkFORF9wc2V1ZG9fYnl0ZXMiLCAmbikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOlJBTkRfcHNldWRvX2J5dGVzIiwgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9SQU5EX3BzZXVkb19ieXRlc19pbXBsKG1vZHVsZSwgbik7CiAKIGV4aXQ6CkBAIC05MTYsOCArOTcwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcGF0aDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6UkFORF9lZ2QiLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOlJBTkRfZWdkIiwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX1JBTkRfZWdkX2ltcGwobW9kdWxlLCBwYXRoKTsKIAogZXhpdDoKQEAgLTk2NSwxMyArMTAyMCwxNSBAQAogX3NzbF90eHQyb2JqKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsidHh0IiwgIm5hbWUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJ0eHQiLCAibmFtZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InN8cDp0eHQyb2JqIiwgX2tleXdvcmRzLCAwfTsKICAgICBjb25zdCBjaGFyICp0eHQ7CiAgICAgaW50IG5hbWUgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xwOnR4dDJvYmoiLCBfa2V5d29yZHMsCi0gICAgICAgICZ0eHQsICZuYW1lKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ0eHQsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfdHh0Mm9ial9pbXBsKG1vZHVsZSwgdHh0LCBuYW1lKTsKIAogZXhpdDoKQEAgLTk5Niw4ICsxMDUzLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgbmlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOm5pZDJvYmoiLCAmbmlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6bmlkMm9iaiIsICZuaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9uaWQyb2JqX2ltcGwobW9kdWxlLCBuaWQpOwogCiBleGl0OgpAQCAtMTAyOCwxMiArMTA4NiwxNCBAQAogX3NzbF9lbnVtX2NlcnRpZmljYXRlcyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0b3JlX25hbWUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzdG9yZV9uYW1lIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiczplbnVtX2NlcnRpZmljYXRlcyIsIF9rZXl3b3JkcywgMH07CiAgICAgY29uc3QgY2hhciAqc3RvcmVfbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInM6ZW51bV9jZXJ0aWZpY2F0ZXMiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdG9yZV9uYW1lKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdG9yZV9uYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfZW51bV9jZXJ0aWZpY2F0ZXNfaW1wbChtb2R1bGUsIHN0b3JlX25hbWUpOwogCiBleGl0OgpAQCAtMTA2NSwxMiArMTEyNSwxNCBAQAogX3NzbF9lbnVtX2NybHMoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzdG9yZV9uYW1lIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RvcmVfbmFtZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InM6ZW51bV9jcmxzIiwgX2tleXdvcmRzLCAwfTsKICAgICBjb25zdCBjaGFyICpzdG9yZV9uYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiczplbnVtX2NybHMiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdG9yZV9uYW1lKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdG9yZV9uYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfZW51bV9jcmxzX2ltcGwobW9kdWxlLCBzdG9yZV9uYW1lKTsKIAogZXhpdDoKQEAgLTEwODcsNiArMTE0OSwxMCBAQAogICAgICNkZWZpbmUgX1NTTF9fU1NMU09DS0VUX1NFTEVDVEVEX0FMUE5fUFJPVE9DT0xfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX1NTTF9fU1NMU09DS0VUX1NFTEVDVEVEX0FMUE5fUFJPVE9DT0xfTUVUSE9EREVGKSAqLwogCisjaWZuZGVmIF9TU0xfX1NTTENPTlRFWFRfR0VUX0NJUEhFUlNfTUVUSE9EREVGCisgICAgI2RlZmluZSBfU1NMX19TU0xDT05URVhUX0dFVF9DSVBIRVJTX01FVEhPRERFRgorI2VuZGlmIC8qICFkZWZpbmVkKF9TU0xfX1NTTENPTlRFWFRfR0VUX0NJUEhFUlNfTUVUSE9EREVGKSAqLworCiAjaWZuZGVmIF9TU0xfX1NTTENPTlRFWFRfU0VUX0VDREhfQ1VSVkVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfU1NMX19TU0xDT05URVhUX1NFVF9FQ0RIX0NVUlZFX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKF9TU0xfX1NTTENPTlRFWFRfU0VUX0VDREhfQ1VSVkVfTUVUSE9EREVGKSAqLwpAQCAtMTEwMiw0ICsxMTY4LDQgQEAKICNpZm5kZWYgX1NTTF9FTlVNX0NSTFNfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfU1NMX0VOVU1fQ1JMU19NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChfU1NMX0VOVU1fQ1JMU19NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NmZiMTA1OTRkODM1MWRjNSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmU3OTA3YTdkOGY5N2NjZiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fdGtpbnRlci5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fdGtpbnRlci5jLmgKaW5kZXggNzdhZjA4My4uZWRkNTM4MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX3RraW50ZXIuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL190a2ludGVyLmMuaApAQCAtMTksOCArMTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKnNjcmlwdDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpldmFsIiwgJnNjcmlwdCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV2YWwiLCAmc2NyaXB0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2V2YWxfaW1wbChzZWxmLCBzY3JpcHQpOwogCiBleGl0OgpAQCAtNDQsOCArNDUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV2YWxmaWxlIiwgJmZpbGVOYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6ZXZhbGZpbGUiLCAmZmlsZU5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfZXZhbGZpbGVfaW1wbChzZWxmLCBmaWxlTmFtZSk7CiAKIGV4aXQ6CkBAIC02OSw4ICs3MSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqc2NyaXB0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOnJlY29yZCIsICZzY3JpcHQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpyZWNvcmQiLCAmc2NyaXB0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX3JlY29yZF9pbXBsKHNlbGYsIHNjcmlwdCk7CiAKIGV4aXQ6CkBAIC05NCw4ICs5Nyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqbXNnOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmFkZGVycmluZm8iLCAmbXNnKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6YWRkZXJyaW5mbyIsICZtc2cpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfYWRkZXJyaW5mb19pbXBsKHNlbGYsIG1zZyk7CiAKIGV4aXQ6CkBAIC0xNDMsOCArMTQ3LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJzdHJpbmciLCAmcykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJzdHJpbmciLCAmcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9leHByc3RyaW5nX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0xNjgsOCArMTczLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJsb25nIiwgJnMpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHBybG9uZyIsICZzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2V4cHJsb25nX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0xOTMsOCArMTk5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJkb3VibGUiLCAmcykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJkb3VibGUiLCAmcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9leHByZG91YmxlX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0yMTgsOCArMjI1LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJib29sZWFuIiwgJnMpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHByYm9vbGVhbiIsICZzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2V4cHJib29sZWFuX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0yNjIsOCArMjcwLDkgQEAKICAgICBQeU9iamVjdCAqZnVuYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086Y3JlYXRlY29tbWFuZCIsCi0gICAgICAgICZuYW1lLCAmZnVuYykpCisgICAgICAgICZuYW1lLCAmZnVuYykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9jcmVhdGVjb21tYW5kX2ltcGwoc2VsZiwgbmFtZSwgZnVuYyk7CiAKIGV4aXQ6CkBAIC0yODcsOCArMjk2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpuYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmRlbGV0ZWNvbW1hbmQiLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmRlbGV0ZWNvbW1hbmQiLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9kZWxldGVjb21tYW5kX2ltcGwoc2VsZiwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0zMTgsOCArMzI4LDkgQEAKICAgICBQeU9iamVjdCAqZnVuYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2lPOmNyZWF0ZWZpbGVoYW5kbGVyIiwKLSAgICAgICAgJmZpbGUsICZtYXNrLCAmZnVuYykpCisgICAgICAgICZmaWxlLCAmbWFzaywgJmZ1bmMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfY3JlYXRlZmlsZWhhbmRsZXJfaW1wbChzZWxmLCBmaWxlLCBtYXNrLCBmdW5jKTsKIAogZXhpdDoKQEAgLTM3Nyw4ICszODgsOSBAQAogICAgIFB5T2JqZWN0ICpmdW5jOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpjcmVhdGV0aW1lcmhhbmRsZXIiLAotICAgICAgICAmbWlsbGlzZWNvbmRzLCAmZnVuYykpCisgICAgICAgICZtaWxsaXNlY29uZHMsICZmdW5jKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2NyZWF0ZXRpbWVyaGFuZGxlcl9pbXBsKHNlbGYsIG1pbGxpc2Vjb25kcywgZnVuYyk7CiAKIGV4aXQ6CkBAIC00MDMsOCArNDE1LDkgQEAKICAgICBpbnQgdGhyZXNob2xkID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6bWFpbmxvb3AiLAotICAgICAgICAmdGhyZXNob2xkKSkKKyAgICAgICAgJnRocmVzaG9sZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9tYWlubG9vcF9pbXBsKHNlbGYsIHRocmVzaG9sZCk7CiAKIGV4aXQ6CkBAIC00MjksOCArNDQyLDkgQEAKICAgICBpbnQgZmxhZ3MgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpkb29uZWV2ZW50IiwKLSAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgJmZsYWdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2Rvb25lZXZlbnRfaW1wbChzZWxmLCBmbGFncyk7CiAKIGV4aXQ6CkBAIC01NTEsOCArNTY1LDkgQEAKICAgICBjb25zdCBjaGFyICp1c2UgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8enNzaWlpaXo6Y3JlYXRlIiwKLSAgICAgICAgJnNjcmVlbk5hbWUsICZiYXNlTmFtZSwgJmNsYXNzTmFtZSwgJmludGVyYWN0aXZlLCAmd2FudG9iamVjdHMsICZ3YW50VGssICZzeW5jLCAmdXNlKSkKKyAgICAgICAgJnNjcmVlbk5hbWUsICZiYXNlTmFtZSwgJmNsYXNzTmFtZSwgJmludGVyYWN0aXZlLCAmd2FudG9iamVjdHMsICZ3YW50VGssICZzeW5jLCAmdXNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX2NyZWF0ZV9pbXBsKG1vZHVsZSwgc2NyZWVuTmFtZSwgYmFzZU5hbWUsIGNsYXNzTmFtZSwgaW50ZXJhY3RpdmUsIHdhbnRvYmplY3RzLCB3YW50VGssIHN5bmMsIHVzZSk7CiAKIGV4aXQ6CkBAIC01NzksOCArNTk0LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgbmV3X3ZhbDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpzZXRidXN5d2FpdGludGVydmFsIiwgJm5ld192YWwpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpzZXRidXN5d2FpdGludGVydmFsIiwgJm5ld192YWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfc2V0YnVzeXdhaXRpbnRlcnZhbF9pbXBsKG1vZHVsZSwgbmV3X3ZhbCk7CiAKIGV4aXQ6CkBAIC02MDYsOCArNjIyLDkgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl9nZXRidXN5d2FpdGludGVydmFsX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNjIxLDQgKzYzOCw0IEBACiAjaWZuZGVmIF9US0lOVEVSX1RLQVBQX0RFTEVURUZJTEVIQU5ETEVSX01FVEhPRERFRgogICAgICNkZWZpbmUgX1RLSU5URVJfVEtBUFBfREVMRVRFRklMRUhBTkRMRVJfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX1RLSU5URVJfVEtBUFBfREVMRVRFRklMRUhBTkRMRVJfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWY5MDU3YzhiZjI4ODYzM2QgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTgzNmM1NzhiNzFkNjkwOTcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX3dlYWtyZWYuYy5oIGIvTW9kdWxlcy9jbGluaWMvX3dlYWtyZWYuYy5oCmluZGV4IGI4M2IzM2UuLmMxOTJlNzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL193ZWFrcmVmLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fd2Vha3JlZi5jLmgKQEAgLTIxLDExICsyMSwxMiBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2Vha3JlZl9nZXR3ZWFrcmVmY291bnRfaW1wbChtb2R1bGUsIG9iamVjdCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQ5MDg2Yzg1NzZkNDY5MzMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWUxYWQ1ODcxNDczMjNlMTkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX3dpbmFwaS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fd2luYXBpLmMuaAppbmRleCBhYzM4ZDM3Li40NGQ0OGE5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fd2luYXBpLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fd2luYXBpLmMuaApAQCAtMTksOCArMTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCB3YWl0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJwOkdldE92ZXJsYXBwZWRSZXN1bHQiLCAmd2FpdCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJwOkdldE92ZXJsYXBwZWRSZXN1bHQiLCAmd2FpdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX092ZXJsYXBwZWRfR2V0T3ZlcmxhcHBlZFJlc3VsdF9pbXBsKHNlbGYsIHdhaXQpOwogCiBleGl0OgpAQCAtNzksOCArODAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIEhBTkRMRSBoYW5kbGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgRl9IQU5ETEUgIjpDbG9zZUhhbmRsZSIsICZoYW5kbGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBGX0hBTkRMRSAiOkNsb3NlSGFuZGxlIiwgJmhhbmRsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX0Nsb3NlSGFuZGxlX2ltcGwobW9kdWxlLCBoYW5kbGUpOwogCiBleGl0OgpAQCAtMTAzLDEzICsxMDUsMTUgQEAKIF93aW5hcGlfQ29ubmVjdE5hbWVkUGlwZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImhhbmRsZSIsICJvdmVybGFwcGVkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiaGFuZGxlIiwgIm92ZXJsYXBwZWQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyIiIEZfSEFORExFICJ8aTpDb25uZWN0TmFtZWRQaXBlIiwgX2tleXdvcmRzLCAwfTsKICAgICBIQU5ETEUgaGFuZGxlOwogICAgIGludCB1c2Vfb3ZlcmxhcHBlZCA9IDA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICIiIEZfSEFORExFICJ8aTpDb25uZWN0TmFtZWRQaXBlIiwgX2tleXdvcmRzLAotICAgICAgICAmaGFuZGxlLCAmdXNlX292ZXJsYXBwZWQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmhhbmRsZSwgJnVzZV9vdmVybGFwcGVkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfQ29ubmVjdE5hbWVkUGlwZV9pbXBsKG1vZHVsZSwgaGFuZGxlLCB1c2Vfb3ZlcmxhcHBlZCk7CiAKIGV4aXQ6CkBAIC0xNDcsMTMgKzE1MSwxNiBAQAogICAgIEhBTkRMRSBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJza2siIEZfUE9JTlRFUiAia2siIEZfSEFORExFICI6Q3JlYXRlRmlsZSIsCi0gICAgICAgICZmaWxlX25hbWUsICZkZXNpcmVkX2FjY2VzcywgJnNoYXJlX21vZGUsICZzZWN1cml0eV9hdHRyaWJ1dGVzLCAmY3JlYXRpb25fZGlzcG9zaXRpb24sICZmbGFnc19hbmRfYXR0cmlidXRlcywgJnRlbXBsYXRlX2ZpbGUpKQorICAgICAgICAmZmlsZV9uYW1lLCAmZGVzaXJlZF9hY2Nlc3MsICZzaGFyZV9tb2RlLCAmc2VjdXJpdHlfYXR0cmlidXRlcywgJmNyZWF0aW9uX2Rpc3Bvc2l0aW9uLCAmZmxhZ3NfYW5kX2F0dHJpYnV0ZXMsICZ0ZW1wbGF0ZV9maWxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX0NyZWF0ZUZpbGVfaW1wbChtb2R1bGUsIGZpbGVfbmFtZSwgZGVzaXJlZF9hY2Nlc3MsIHNoYXJlX21vZGUsIHNlY3VyaXR5X2F0dHJpYnV0ZXMsIGNyZWF0aW9uX2Rpc3Bvc2l0aW9uLCBmbGFnc19hbmRfYXR0cmlidXRlcywgdGVtcGxhdGVfZmlsZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICB9CisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gSEFORExFX1RPX1BZTlVNKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTgwLDggKzE4Nyw5IEBACiAgICAgTFBXU1RSIGRzdF9wYXRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1dTpDcmVhdGVKdW5jdGlvbiIsCi0gICAgICAgICZzcmNfcGF0aCwgJmRzdF9wYXRoKSkKKyAgICAgICAgJnNyY19wYXRoLCAmZHN0X3BhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9DcmVhdGVKdW5jdGlvbl9pbXBsKG1vZHVsZSwgc3JjX3BhdGgsIGRzdF9wYXRoKTsKIAogZXhpdDoKQEAgLTIyMCwxMyArMjI4LDE2IEBACiAgICAgSEFORExFIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNra2tra2siIEZfUE9JTlRFUiAiOkNyZWF0ZU5hbWVkUGlwZSIsCi0gICAgICAgICZuYW1lLCAmb3Blbl9tb2RlLCAmcGlwZV9tb2RlLCAmbWF4X2luc3RhbmNlcywgJm91dF9idWZmZXJfc2l6ZSwgJmluX2J1ZmZlcl9zaXplLCAmZGVmYXVsdF90aW1lb3V0LCAmc2VjdXJpdHlfYXR0cmlidXRlcykpCisgICAgICAgICZuYW1lLCAmb3Blbl9tb2RlLCAmcGlwZV9tb2RlLCAmbWF4X2luc3RhbmNlcywgJm91dF9idWZmZXJfc2l6ZSwgJmluX2J1ZmZlcl9zaXplLCAmZGVmYXVsdF90aW1lb3V0LCAmc2VjdXJpdHlfYXR0cmlidXRlcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9DcmVhdGVOYW1lZFBpcGVfaW1wbChtb2R1bGUsIG5hbWUsIG9wZW5fbW9kZSwgcGlwZV9tb2RlLCBtYXhfaW5zdGFuY2VzLCBvdXRfYnVmZmVyX3NpemUsIGluX2J1ZmZlcl9zaXplLCBkZWZhdWx0X3RpbWVvdXQsIHNlY3VyaXR5X2F0dHJpYnV0ZXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgfQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IEhBTkRMRV9UT19QWU5VTShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTI1OCw4ICsyNjksOSBAQAogICAgIERXT1JEIHNpemU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9rOkNyZWF0ZVBpcGUiLAotICAgICAgICAmcGlwZV9hdHRycywgJnNpemUpKQorICAgICAgICAmcGlwZV9hdHRycywgJnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9DcmVhdGVQaXBlX2ltcGwobW9kdWxlLCBwaXBlX2F0dHJzLCBzaXplKTsKIAogZXhpdDoKQEAgLTMwOCw4ICszMjAsOSBAQAogICAgIFB5T2JqZWN0ICpzdGFydHVwX2luZm87CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlpaT09pa09aTzpDcmVhdGVQcm9jZXNzIiwKLSAgICAgICAgJmFwcGxpY2F0aW9uX25hbWUsICZjb21tYW5kX2xpbmUsICZwcm9jX2F0dHJzLCAmdGhyZWFkX2F0dHJzLCAmaW5oZXJpdF9oYW5kbGVzLCAmY3JlYXRpb25fZmxhZ3MsICZlbnZfbWFwcGluZywgJmN1cnJlbnRfZGlyZWN0b3J5LCAmc3RhcnR1cF9pbmZvKSkKKyAgICAgICAgJmFwcGxpY2F0aW9uX25hbWUsICZjb21tYW5kX2xpbmUsICZwcm9jX2F0dHJzLCAmdGhyZWFkX2F0dHJzLCAmaW5oZXJpdF9oYW5kbGVzLCAmY3JlYXRpb25fZmxhZ3MsICZlbnZfbWFwcGluZywgJmN1cnJlbnRfZGlyZWN0b3J5LCAmc3RhcnR1cF9pbmZvKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfQ3JlYXRlUHJvY2Vzc19pbXBsKG1vZHVsZSwgYXBwbGljYXRpb25fbmFtZSwgY29tbWFuZF9saW5lLCBwcm9jX2F0dHJzLCB0aHJlYWRfYXR0cnMsIGluaGVyaXRfaGFuZGxlcywgY3JlYXRpb25fZmxhZ3MsIGVudl9tYXBwaW5nLCBjdXJyZW50X2RpcmVjdG9yeSwgc3RhcnR1cF9pbmZvKTsKIAogZXhpdDoKQEAgLTM1MSwxMyArMzY0LDE2IEBACiAgICAgSEFORExFIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgRl9IQU5ETEUgIiIgRl9IQU5ETEUgIiIgRl9IQU5ETEUgImtpfGs6RHVwbGljYXRlSGFuZGxlIiwKLSAgICAgICAgJnNvdXJjZV9wcm9jZXNzX2hhbmRsZSwgJnNvdXJjZV9oYW5kbGUsICZ0YXJnZXRfcHJvY2Vzc19oYW5kbGUsICZkZXNpcmVkX2FjY2VzcywgJmluaGVyaXRfaGFuZGxlLCAmb3B0aW9ucykpCisgICAgICAgICZzb3VyY2VfcHJvY2Vzc19oYW5kbGUsICZzb3VyY2VfaGFuZGxlLCAmdGFyZ2V0X3Byb2Nlc3NfaGFuZGxlLCAmZGVzaXJlZF9hY2Nlc3MsICZpbmhlcml0X2hhbmRsZSwgJm9wdGlvbnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfRHVwbGljYXRlSGFuZGxlX2ltcGwobW9kdWxlLCBzb3VyY2VfcHJvY2Vzc19oYW5kbGUsIHNvdXJjZV9oYW5kbGUsIHRhcmdldF9wcm9jZXNzX2hhbmRsZSwgZGVzaXJlZF9hY2Nlc3MsIGluaGVyaXRfaGFuZGxlLCBvcHRpb25zKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIH0KKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBIQU5ETEVfVE9fUFlOVU0oX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zODEsOCArMzk3LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBVSU5UIEV4aXRDb2RlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJJOkV4aXRQcm9jZXNzIiwgJkV4aXRDb2RlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkk6RXhpdFByb2Nlc3MiLCAmRXhpdENvZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9FeGl0UHJvY2Vzc19pbXBsKG1vZHVsZSwgRXhpdENvZGUpOwogCiBleGl0OgpAQCAtNDA4LDEwICs0MjUsMTIgQEAKICAgICBIQU5ETEUgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX0dldEN1cnJlbnRQcm9jZXNzX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIH0KKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBIQU5ETEVfVE9fUFlOVU0oX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MzcsMTEgKzQ1NiwxMyBAQAogICAgIEhBTkRMRSBwcm9jZXNzOwogICAgIERXT1JEIF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgRl9IQU5ETEUgIjpHZXRFeGl0Q29kZVByb2Nlc3MiLCAmcHJvY2VzcykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIEZfSEFORExFICI6R2V0RXhpdENvZGVQcm9jZXNzIiwgJnByb2Nlc3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfR2V0RXhpdENvZGVQcm9jZXNzX2ltcGwobW9kdWxlLCBwcm9jZXNzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gRFdPUkRfTUFYKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBEV09SRF9NQVgpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCJrIiwgX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00NjYsOCArNDg3LDkgQEAKICAgICBEV09SRCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfR2V0TGFzdEVycm9yX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gRFdPUkRfTUFYKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBEV09SRF9NQVgpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCJrIiwgX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00OTksOCArNTIxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBITU9EVUxFIG1vZHVsZV9oYW5kbGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgRl9IQU5ETEUgIjpHZXRNb2R1bGVGaWxlTmFtZSIsICZtb2R1bGVfaGFuZGxlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgRl9IQU5ETEUgIjpHZXRNb2R1bGVGaWxlTmFtZSIsICZtb2R1bGVfaGFuZGxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfR2V0TW9kdWxlRmlsZU5hbWVfaW1wbChtb2R1bGUsIG1vZHVsZV9oYW5kbGUpOwogCiBleGl0OgpAQCAtNTMxLDEzICs1NTQsMTYgQEAKICAgICBEV09SRCBzdGRfaGFuZGxlOwogICAgIEhBTkRMRSBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJrOkdldFN0ZEhhbmRsZSIsICZzdGRfaGFuZGxlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIms6R2V0U3RkSGFuZGxlIiwgJnN0ZF9oYW5kbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfR2V0U3RkSGFuZGxlX2ltcGwobW9kdWxlLCBzdGRfaGFuZGxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIH0KKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBIQU5ETEVfVE9fUFlOVU0oX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01NjMsOCArNTg5LDkgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9HZXRWZXJzaW9uX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNTkzLDEzICs2MjAsMTYgQEAKICAgICBIQU5ETEUgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAia2lrOk9wZW5Qcm9jZXNzIiwKLSAgICAgICAgJmRlc2lyZWRfYWNjZXNzLCAmaW5oZXJpdF9oYW5kbGUsICZwcm9jZXNzX2lkKSkKKyAgICAgICAgJmRlc2lyZWRfYWNjZXNzLCAmaW5oZXJpdF9oYW5kbGUsICZwcm9jZXNzX2lkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX09wZW5Qcm9jZXNzX2ltcGwobW9kdWxlLCBkZXNpcmVkX2FjY2VzcywgaW5oZXJpdF9oYW5kbGUsIHByb2Nlc3NfaWQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgfQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IEhBTkRMRV9UT19QWU5VTShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTYyNSw4ICs2NTUsOSBAQAogICAgIGludCBzaXplID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBGX0hBTkRMRSAifGk6UGVla05hbWVkUGlwZSIsCi0gICAgICAgICZoYW5kbGUsICZzaXplKSkKKyAgICAgICAgJmhhbmRsZSwgJnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9QZWVrTmFtZWRQaXBlX2ltcGwobW9kdWxlLCBoYW5kbGUsIHNpemUpOwogCiBleGl0OgpAQCAtNjQ5LDE0ICs2ODAsMTYgQEAKIF93aW5hcGlfUmVhZEZpbGUoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJoYW5kbGUiLCAic2l6ZSIsICJvdmVybGFwcGVkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiaGFuZGxlIiwgInNpemUiLCAib3ZlcmxhcHBlZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7IiIgRl9IQU5ETEUgIml8aTpSZWFkRmlsZSIsIF9rZXl3b3JkcywgMH07CiAgICAgSEFORExFIGhhbmRsZTsKICAgICBpbnQgc2l6ZTsKICAgICBpbnQgdXNlX292ZXJsYXBwZWQgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiIiBGX0hBTkRMRSAiaXxpOlJlYWRGaWxlIiwgX2tleXdvcmRzLAotICAgICAgICAmaGFuZGxlLCAmc2l6ZSwgJnVzZV9vdmVybGFwcGVkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZoYW5kbGUsICZzaXplLCAmdXNlX292ZXJsYXBwZWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9SZWFkRmlsZV9pbXBsKG1vZHVsZSwgaGFuZGxlLCBzaXplLCB1c2Vfb3ZlcmxhcHBlZCk7CiAKIGV4aXQ6CkBAIC02ODgsOCArNzIxLDkgQEAKICAgICBQeU9iamVjdCAqY29sbGVjdF9kYXRhX3RpbWVvdXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgRl9IQU5ETEUgIk9PTzpTZXROYW1lZFBpcGVIYW5kbGVTdGF0ZSIsCi0gICAgICAgICZuYW1lZF9waXBlLCAmbW9kZSwgJm1heF9jb2xsZWN0aW9uX2NvdW50LCAmY29sbGVjdF9kYXRhX3RpbWVvdXQpKQorICAgICAgICAmbmFtZWRfcGlwZSwgJm1vZGUsICZtYXhfY29sbGVjdGlvbl9jb3VudCwgJmNvbGxlY3RfZGF0YV90aW1lb3V0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGVfaW1wbChtb2R1bGUsIG5hbWVkX3BpcGUsIG1vZGUsIG1heF9jb2xsZWN0aW9uX2NvdW50LCBjb2xsZWN0X2RhdGFfdGltZW91dCk7CiAKIGV4aXQ6CkBAIC03MTcsOCArNzUxLDkgQEAKICAgICBVSU5UIGV4aXRfY29kZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBGX0hBTkRMRSAiSTpUZXJtaW5hdGVQcm9jZXNzIiwKLSAgICAgICAgJmhhbmRsZSwgJmV4aXRfY29kZSkpCisgICAgICAgICZoYW5kbGUsICZleGl0X2NvZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9UZXJtaW5hdGVQcm9jZXNzX2ltcGwobW9kdWxlLCBoYW5kbGUsIGV4aXRfY29kZSk7CiAKIGV4aXQ6CkBAIC03NDQsOCArNzc5LDkgQEAKICAgICBEV09SRCB0aW1lb3V0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzazpXYWl0TmFtZWRQaXBlIiwKLSAgICAgICAgJm5hbWUsICZ0aW1lb3V0KSkKKyAgICAgICAgJm5hbWUsICZ0aW1lb3V0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfV2FpdE5hbWVkUGlwZV9pbXBsKG1vZHVsZSwgbmFtZSwgdGltZW91dCk7CiAKIGV4aXQ6CkBAIC03NzQsOCArODEwLDkgQEAKICAgICBEV09SRCBtaWxsaXNlY29uZHMgPSBJTkZJTklURTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2l8azpXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIiwKLSAgICAgICAgJmhhbmRsZV9zZXEsICZ3YWl0X2ZsYWcsICZtaWxsaXNlY29uZHMpKQorICAgICAgICAmaGFuZGxlX3NlcSwgJndhaXRfZmxhZywgJm1pbGxpc2Vjb25kcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX1dhaXRGb3JNdWx0aXBsZU9iamVjdHNfaW1wbChtb2R1bGUsIGhhbmRsZV9zZXEsIHdhaXRfZmxhZywgbWlsbGlzZWNvbmRzKTsKIAogZXhpdDoKQEAgLTgwOCwxMSArODQ1LDEzIEBACiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIEZfSEFORExFICJrOldhaXRGb3JTaW5nbGVPYmplY3QiLAotICAgICAgICAmaGFuZGxlLCAmbWlsbGlzZWNvbmRzKSkKKyAgICAgICAgJmhhbmRsZSwgJm1pbGxpc2Vjb25kcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9XYWl0Rm9yU2luZ2xlT2JqZWN0X2ltcGwobW9kdWxlLCBoYW5kbGUsIG1pbGxpc2Vjb25kcyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTgzNSwxNyArODc0LDE5IEBACiBfd2luYXBpX1dyaXRlRmlsZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImhhbmRsZSIsICJidWZmZXIiLCAib3ZlcmxhcHBlZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImhhbmRsZSIsICJidWZmZXIiLCAib3ZlcmxhcHBlZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7IiIgRl9IQU5ETEUgIk98aTpXcml0ZUZpbGUiLCBfa2V5d29yZHMsIDB9OwogICAgIEhBTkRMRSBoYW5kbGU7CiAgICAgUHlPYmplY3QgKmJ1ZmZlcjsKICAgICBpbnQgdXNlX292ZXJsYXBwZWQgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiIiBGX0hBTkRMRSAiT3xpOldyaXRlRmlsZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmhhbmRsZSwgJmJ1ZmZlciwgJnVzZV9vdmVybGFwcGVkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZoYW5kbGUsICZidWZmZXIsICZ1c2Vfb3ZlcmxhcHBlZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX1dyaXRlRmlsZV9pbXBsKG1vZHVsZSwgaGFuZGxlLCBidWZmZXIsIHVzZV9vdmVybGFwcGVkKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE0YzRiMmE5ZmNiMGJlYTEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTRiZmNjZmIzMmFiNzI2ZTggaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvYXJyYXltb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvYXJyYXltb2R1bGUuYy5oCmluZGV4IDBjNzA2MWEuLjNiOWZjZGEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL2FycmF5bW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9hcnJheW1vZHVsZS5jLmgKQEAgLTc3LDggKzc3LDkgQEAKICAgICBQeV9zc2l6ZV90IGkgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cG9wIiwKLSAgICAgICAgJmkpKQorICAgICAgICAmaSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhcnJheV9hcnJheV9wb3BfaW1wbChzZWxmLCBpKTsKIAogZXhpdDoKQEAgLTExNCw4ICsxMTUsOSBAQAogICAgIFB5T2JqZWN0ICp2OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzppbnNlcnQiLAotICAgICAgICAmaSwgJnYpKQorICAgICAgICAmaSwgJnYpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXJyYXlfYXJyYXlfaW5zZXJ0X2ltcGwoc2VsZiwgaSwgdik7CiAKIGV4aXQ6CkBAIC0yMTEsOCArMjEzLDkgQEAKICAgICBQeV9zc2l6ZV90IG47CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9uOmZyb21maWxlIiwKLSAgICAgICAgJmYsICZuKSkKKyAgICAgICAgJmYsICZuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGFycmF5X2FycmF5X2Zyb21maWxlX2ltcGwoc2VsZiwgZiwgbik7CiAKIGV4aXQ6CkBAIC0yNzUsMTQgKzI3OCwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInMqOmZyb21zdHJpbmciLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInMqOmZyb21zdHJpbmciLCAmYnVmZmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGFycmF5X2FycmF5X2Zyb21zdHJpbmdfaW1wbChzZWxmLCAmYnVmZmVyKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBidWZmZXIgKi8KLSAgICBpZiAoYnVmZmVyLm9iaikKKyAgICBpZiAoYnVmZmVyLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1ZmZlcik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTMwNSwxNCArMzEwLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6ZnJvbWJ5dGVzIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpmcm9tYnl0ZXMiLCAmYnVmZmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGFycmF5X2FycmF5X2Zyb21ieXRlc19pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzc5LDggKzM4Niw5IEBACiAgICAgUHlfVU5JQ09ERSAqdXN0cjsKICAgICBQeV9zc2l6ZV9jbGVhbl90IHVzdHJfbGVuZ3RoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ1Izpmcm9tdW5pY29kZSIsICZ1c3RyLCAmdXN0cl9sZW5ndGgpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidSM6ZnJvbXVuaWNvZGUiLCAmdXN0ciwgJnVzdHJfbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGFycmF5X2FycmF5X2Zyb211bmljb2RlX2ltcGwoc2VsZiwgdXN0ciwgdXN0cl9sZW5ndGgpOwogCiBleGl0OgpAQCAtNDUzLDggKzQ2MSw5IEBACiAgICAgUHlPYmplY3QgKml0ZW1zOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPQ2lPOl9hcnJheV9yZWNvbnN0cnVjdG9yIiwKLSAgICAgICAgJmFycmF5dHlwZSwgJnR5cGVjb2RlLCAmbWZvcm1hdF9jb2RlLCAmaXRlbXMpKQorICAgICAgICAmYXJyYXl0eXBlLCAmdHlwZWNvZGUsICZtZm9ybWF0X2NvZGUsICZpdGVtcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhcnJheV9fYXJyYXlfcmVjb25zdHJ1Y3Rvcl9pbXBsKG1vZHVsZSwgYXJyYXl0eXBlLCB0eXBlY29kZSwgbWZvcm1hdF9jb2RlLCBpdGVtcyk7CiAKIGV4aXQ6CkBAIC00OTYsNCArNTA1LDQgQEAKIAogI2RlZmluZSBBUlJBWV9BUlJBWUlURVJBVE9SX19fU0VUU1RBVEVfX19NRVRIT0RERUYgICAgXAogICAgIHsiX19zZXRzdGF0ZV9fIiwgKFB5Q0Z1bmN0aW9uKWFycmF5X2FycmF5aXRlcmF0b3JfX19zZXRzdGF0ZV9fLCBNRVRIX08sIGFycmF5X2FycmF5aXRlcmF0b3JfX19zZXRzdGF0ZV9fX19kb2NfX30sCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzA1ZGYzZjU3OTYwMzllNCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjIwNTRmYjc2NGM4Y2M2NCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9hdWRpb29wLmMuaCBiL01vZHVsZXMvY2xpbmljL2F1ZGlvb3AuYy5oCmluZGV4IDYyZTMxM2I1Li5iZTRiNzE4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9hdWRpb29wLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9hdWRpb29wLmMuaApAQCAtMjQsMTQgKzI0LDE2IEBACiAgICAgUHlfc3NpemVfdCBpbmRleDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppbjpnZXRzYW1wbGUiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJmluZGV4KSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZpbmRleCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2dldHNhbXBsZV9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgaW5kZXgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC01NiwxNCArNTgsMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTptYXgiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfbWF4X2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODgsMTQgKzkyLDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6bWlubWF4IiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX21pbm1heF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTEyMCwxNCArMTI2LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6YXZnIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2F2Z19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE1MiwxNCArMTYwLDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6cm1zIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX3Jtc19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE4NSwxNyArMTk1LDIwIEBACiAgICAgUHlfYnVmZmVyIHJlZmVyZW5jZSA9IHtOVUxMLCBOVUxMfTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp5KjpmaW5kZml0IiwKLSAgICAgICAgJmZyYWdtZW50LCAmcmVmZXJlbmNlKSkKKyAgICAgICAgJmZyYWdtZW50LCAmcmVmZXJlbmNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfZmluZGZpdF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCAmcmVmZXJlbmNlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAgICAgLyogQ2xlYW51cCBmb3IgcmVmZXJlbmNlICovCi0gICAgaWYgKHJlZmVyZW5jZS5vYmopCisgICAgaWYgKHJlZmVyZW5jZS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZWZlcmVuY2UpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMjEsMTcgKzIzNCwyMCBAQAogICAgIFB5X2J1ZmZlciByZWZlcmVuY2UgPSB7TlVMTCwgTlVMTH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqeSo6ZmluZGZhY3RvciIsCi0gICAgICAgICZmcmFnbWVudCwgJnJlZmVyZW5jZSkpCisgICAgICAgICZmcmFnbWVudCwgJnJlZmVyZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2ZpbmRmYWN0b3JfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgJnJlZmVyZW5jZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogICAgIC8qIENsZWFudXAgZm9yIHJlZmVyZW5jZSAqLwotICAgIGlmIChyZWZlcmVuY2Uub2JqKQorICAgIGlmIChyZWZlcmVuY2Uub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmVmZXJlbmNlKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjU3LDE0ICsyNzMsMTYgQEAKICAgICBQeV9zc2l6ZV90IGxlbmd0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSpuOmZpbmRtYXgiLAotICAgICAgICAmZnJhZ21lbnQsICZsZW5ndGgpKQorICAgICAgICAmZnJhZ21lbnQsICZsZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9maW5kbWF4X2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIGxlbmd0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTI4OSwxNCArMzA3LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6YXZncHAiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfYXZncHBfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zMjEsMTQgKzM0MSwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOm1heHBwIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX21heHBwX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzUzLDE0ICszNzUsMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTpjcm9zcyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9jcm9zc19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTM4NywxNCArNDExLDE2IEBACiAgICAgZG91YmxlIGZhY3RvcjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppZDptdWwiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJmZhY3RvcikpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmZmFjdG9yKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfbXVsX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoLCBmYWN0b3IpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00MjIsMTQgKzQ0OCwxNiBAQAogICAgIGRvdWJsZSByZmFjdG9yOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KmlkZDp0b21vbm8iLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJmxmYWN0b3IsICZyZmFjdG9yKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZsZmFjdG9yLCAmcmZhY3RvcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX3RvbW9ub19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgbGZhY3RvciwgcmZhY3Rvcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQ1NywxNCArNDg1LDE2IEBACiAgICAgZG91YmxlIHJmYWN0b3I7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaWRkOnRvc3RlcmVvIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZsZmFjdG9yLCAmcmZhY3RvcikpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbGZhY3RvciwgJnJmYWN0b3IpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF90b3N0ZXJlb19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgbGZhY3RvciwgcmZhY3Rvcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQ5MSwxNyArNTIxLDIwIEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnkqaTphZGQiLAotICAgICAgICAmZnJhZ21lbnQxLCAmZnJhZ21lbnQyLCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQxLCAmZnJhZ21lbnQyLCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9hZGRfaW1wbChtb2R1bGUsICZmcmFnbWVudDEsICZmcmFnbWVudDIsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudDEgKi8KLSAgICBpZiAoZnJhZ21lbnQxLm9iaikKKyAgICBpZiAoZnJhZ21lbnQxLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50MSk7CisgICAgfQogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50MiAqLwotICAgIGlmIChmcmFnbWVudDIub2JqKQorICAgIGlmIChmcmFnbWVudDIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTI3LDE0ICs1NjAsMTYgQEAKICAgICBpbnQgYmlhczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppaTpiaWFzIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZiaWFzKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZiaWFzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfYmlhc19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgYmlhcyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTU1OSwxNCArNTk0LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6cmV2ZXJzZSIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9yZXZlcnNlX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTkxLDE0ICs2MjgsMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTpieXRlc3dhcCIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9ieXRlc3dhcF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTYyNSwxNCArNjY0LDE2IEBACiAgICAgaW50IG5ld3dpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KmlpOmxpbjJsaW4iLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJm5ld3dpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZuZXd3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2xpbjJsaW5faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIG5ld3dpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNjY2LDE0ICs3MDcsMTYgQEAKICAgICBpbnQgd2VpZ2h0QiA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaWlpaU98aWk6cmF0ZWN2IiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZuY2hhbm5lbHMsICZpbnJhdGUsICZvdXRyYXRlLCAmc3RhdGUsICZ3ZWlnaHRBLCAmd2VpZ2h0QikpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbmNoYW5uZWxzLCAmaW5yYXRlLCAmb3V0cmF0ZSwgJnN0YXRlLCAmd2VpZ2h0QSwgJndlaWdodEIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9yYXRlY3ZfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIG5jaGFubmVscywgaW5yYXRlLCBvdXRyYXRlLCBzdGF0ZSwgd2VpZ2h0QSwgd2VpZ2h0Qik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTY5OCwxNCArNzQxLDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6bGluMnVsYXciLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfbGluMnVsYXdfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC03MzAsMTQgKzc3NSwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOnVsYXcybGluIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX3VsYXcybGluX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNzYyLDE0ICs4MDksMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTpsaW4yYWxhdyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9saW4yYWxhd19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTc5NCwxNCArODQzLDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6YWxhdzJsaW4iLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfYWxhdzJsaW5faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04MjgsMTQgKzg3OSwxNiBAQAogICAgIFB5T2JqZWN0ICpzdGF0ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppTzpsaW4yYWRwY20iLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJnN0YXRlKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZzdGF0ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2xpbjJhZHBjbV9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgc3RhdGUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04NjIsMTUgKzkxNSwxNyBAQAogICAgIFB5T2JqZWN0ICpzdGF0ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppTzphZHBjbTJsaW4iLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJnN0YXRlKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZzdGF0ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2FkcGNtMmxpbl9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgc3RhdGUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Mzg1ZmIwOWZhMjFhNjJjMCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZTBhYjc0YzNmYTU3YzM5YyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9iaW5hc2NpaS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9iaW5hc2NpaS5jLmgKaW5kZXggZTIwY2FjMi4uMGVlN2Y1NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvYmluYXNjaWkuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL2JpbmFzY2lpLmMuaApAQCAtMjAsOCArMjAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfdXUiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfdXUiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9hMmJfdXVfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKQEAgLTUwLDE0ICs1MSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpiMmFfdXUiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpiMmFfdXUiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9iMmFfdXVfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04MCw4ICs4Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmEyYl9iYXNlNjQiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfYmFzZTY0IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYTJiX2Jhc2U2NF9pbXBsKG1vZHVsZSwgJmRhdGEpOwogCiBleGl0OgpAQCAtOTMsMzEgKzk3LDM3IEBACiB9CiAKIFB5RG9jX1NUUlZBUihiaW5hc2NpaV9iMmFfYmFzZTY0X19kb2NfXywKLSJiMmFfYmFzZTY0KCRtb2R1bGUsIGRhdGEsIC8pXG4iCisiYjJhX2Jhc2U2NCgkbW9kdWxlLCAvLCBkYXRhLCAqLCBuZXdsaW5lPVRydWUpXG4iCiAiLS1cbiIKICJcbiIKICJCYXNlNjQtY29kZSBsaW5lIG9mIGRhdGEuIik7CiAKICNkZWZpbmUgQklOQVNDSUlfQjJBX0JBU0U2NF9NRVRIT0RERUYgICAgXAotICAgIHsiYjJhX2Jhc2U2NCIsIChQeUNGdW5jdGlvbiliaW5hc2NpaV9iMmFfYmFzZTY0LCBNRVRIX08sIGJpbmFzY2lpX2IyYV9iYXNlNjRfX2RvY19ffSwKKyAgICB7ImIyYV9iYXNlNjQiLCAoUHlDRnVuY3Rpb24pYmluYXNjaWlfYjJhX2Jhc2U2NCwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpbmFzY2lpX2IyYV9iYXNlNjRfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpOworYmluYXNjaWlfYjJhX2Jhc2U2NF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSwgaW50IG5ld2xpbmUpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYmluYXNjaWlfYjJhX2Jhc2U2NChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJnKQorYmluYXNjaWlfYjJhX2Jhc2U2NChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJkYXRhIiwgIm5ld2xpbmUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ5KnwkaTpiMmFfYmFzZTY0IiwgX2tleXdvcmRzLCAwfTsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKKyAgICBpbnQgbmV3bGluZSA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmIyYV9iYXNlNjQiLCAmZGF0YSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZGF0YSwgJm5ld2xpbmUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwobW9kdWxlLCAmZGF0YSk7CisgICAgfQorICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChtb2R1bGUsICZkYXRhLCBuZXdsaW5lKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xNDAsOCArMTUwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6YTJiX2hxeCIsIGFzY2lpX2J1ZmZlcl9jb252ZXJ0ZXIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmEyYl9ocXgiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9hMmJfaHF4X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CkBAIC0xNzAsMTQgKzE4MSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpybGVjb2RlX2hxeCIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOnJsZWNvZGVfaHF4IiwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfcmxlY29kZV9ocXhfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMDAsMTQgKzIxMywxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpiMmFfaHF4IiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6YjJhX2hxeCIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2IyYV9ocXhfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMzAsMTQgKzI0NSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpybGVkZWNvZGVfaHF4IiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6cmxlZGVjb2RlX2hxeCIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX3JsZWRlY29kZV9ocXhfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yNjMsMTcgKzI4MCwyMCBAQAogICAgIHVuc2lnbmVkIGludCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kkk6Y3JjX2hxeCIsCi0gICAgICAgICZkYXRhLCAmY3JjKSkKKyAgICAgICAgJmRhdGEsICZjcmMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IGJpbmFzY2lpX2NyY19ocXhfaW1wbChtb2R1bGUsICZkYXRhLCBjcmMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAodW5zaWduZWQgaW50KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAodW5zaWduZWQgaW50KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjk5LDE3ICszMTksMjAgQEAKICAgICB1bnNpZ25lZCBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8STpjcmMzMiIsCi0gICAgICAgICZkYXRhLCAmY3JjKSkKKyAgICAgICAgJmRhdGEsICZjcmMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IGJpbmFzY2lpX2NyYzMyX2ltcGwobW9kdWxlLCAmZGF0YSwgY3JjKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTMzNSwxNCArMzU4LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmIyYV9oZXgiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpiMmFfaGV4IiwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYjJhX2hleF9pbXBsKG1vZHVsZSwgJmRhdGEpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTM2NywxNCArMzkyLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmhleGxpZnkiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpoZXhsaWZ5IiwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfaGV4bGlmeV9pbXBsKG1vZHVsZSwgJmRhdGEpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQwMCw4ICs0MjcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBoZXhzdHIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmEyYl9oZXgiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmaGV4c3RyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmEyYl9oZXgiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmaGV4c3RyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2EyYl9oZXhfaW1wbChtb2R1bGUsICZoZXhzdHIpOwogCiBleGl0OgpAQCAtNDMyLDggKzQ2MCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGhleHN0ciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6dW5oZXhsaWZ5IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmhleHN0cikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjp1bmhleGxpZnkiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmaGV4c3RyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX3VuaGV4bGlmeV9pbXBsKG1vZHVsZSwgJmhleHN0cik7CiAKIGV4aXQ6CkBAIC00NjAsMTMgKzQ4OSwxNSBAQAogYmluYXNjaWlfYTJiX3FwKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZGF0YSIsICJoZWFkZXIiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJkYXRhIiwgImhlYWRlciIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mfGk6YTJiX3FwIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKICAgICBpbnQgaGVhZGVyID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mfGk6YTJiX3FwIiwgX2tleXdvcmRzLAotICAgICAgICBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSwgJmhlYWRlcikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSwgJmhlYWRlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9hMmJfcXBfaW1wbChtb2R1bGUsICZkYXRhLCBoZWFkZXIpOwogCiBleGl0OgpAQCAtNDk4LDIyICs1MjksMjUgQEAKIGJpbmFzY2lpX2IyYV9xcChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImRhdGEiLCAicXVvdGV0YWJzIiwgImlzdGV4dCIsICJoZWFkZXIiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJkYXRhIiwgInF1b3RldGFicyIsICJpc3RleHQiLCAiaGVhZGVyIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsieSp8aWlpOmIyYV9xcCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAgICAgaW50IHF1b3RldGFicyA9IDA7CiAgICAgaW50IGlzdGV4dCA9IDE7CiAgICAgaW50IGhlYWRlciA9IDA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ5KnxpaWk6YjJhX3FwIiwgX2tleXdvcmRzLAotICAgICAgICAmZGF0YSwgJnF1b3RldGFicywgJmlzdGV4dCwgJmhlYWRlcikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZGF0YSwgJnF1b3RldGFicywgJmlzdGV4dCwgJmhlYWRlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9iMmFfcXBfaW1wbChtb2R1bGUsICZkYXRhLCBxdW90ZXRhYnMsIGlzdGV4dCwgaGVhZGVyKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTExNzNmYzk3MThhNWVkYyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTI2MTFiMDVkOGJmNGE5YyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9jbWF0aG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9jbWF0aG1vZHVsZS5jLmgKaW5kZXggYTI1NTM1My4uZTQ2YzMxNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvY21hdGhtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL2NtYXRobW9kdWxlLmMuaApAQCAtMjEsOCArMjEsOSBAQAogICAgIFB5X2NvbXBsZXggejsKICAgICBQeV9jb21wbGV4IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6YWNvcyIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6YWNvcyIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9hY29zX2ltcGwobW9kdWxlLCB6KTsKQEAgLTYyLDggKzYzLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFjb3NoIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphY29zaCIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9hY29zaF9pbXBsKG1vZHVsZSwgeik7CkBAIC0xMDMsOCArMTA1LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFzaW4iLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFzaW4iLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYXNpbl9pbXBsKG1vZHVsZSwgeik7CkBAIC0xNDQsOCArMTQ3LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFzaW5oIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphc2luaCIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9hc2luaF9pbXBsKG1vZHVsZSwgeik7CkBAIC0xODUsOCArMTg5LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmF0YW4iLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmF0YW4iLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYXRhbl9pbXBsKG1vZHVsZSwgeik7CkBAIC0yMjYsOCArMjMxLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmF0YW5oIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphdGFuaCIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9hdGFuaF9pbXBsKG1vZHVsZSwgeik7CkBAIC0yNjcsOCArMjczLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmNvcyIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6Y29zIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX2Nvc19pbXBsKG1vZHVsZSwgeik7CkBAIC0zMDgsOCArMzE1LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmNvc2giLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmNvc2giLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfY29zaF9pbXBsKG1vZHVsZSwgeik7CkBAIC0zNDksOCArMzU3LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmV4cCIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6ZXhwIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX2V4cF9pbXBsKG1vZHVsZSwgeik7CkBAIC0zOTAsOCArMzk5LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmxvZzEwIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpsb2cxMCIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9sb2cxMF9pbXBsKG1vZHVsZSwgeik7CkBAIC00MzEsOCArNDQxLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNpbiIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6c2luIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX3Npbl9pbXBsKG1vZHVsZSwgeik7CkBAIC00NzIsOCArNDgzLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNpbmgiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNpbmgiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfc2luaF9pbXBsKG1vZHVsZSwgeik7CkBAIC01MTMsOCArNTI1LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNxcnQiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNxcnQiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfc3FydF9pbXBsKG1vZHVsZSwgeik7CkBAIC01NTQsOCArNTY3LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnRhbiIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6dGFuIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX3Rhbl9pbXBsKG1vZHVsZSwgeik7CkBAIC01OTUsOCArNjA5LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnRhbmgiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnRhbmgiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfdGFuaF9pbXBsKG1vZHVsZSwgeik7CkBAIC02MzksOCArNjU0LDkgQEAKICAgICBQeU9iamVjdCAqeV9vYmogPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEfE86bG9nIiwKLSAgICAgICAgJngsICZ5X29iaikpCisgICAgICAgICZ4LCAmeV9vYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gY21hdGhfbG9nX2ltcGwobW9kdWxlLCB4LCB5X29iaik7CiAKIGV4aXQ6CkBAIC02NjUsOCArNjgxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9jb21wbGV4IHo7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6cGhhc2UiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnBoYXNlIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gY21hdGhfcGhhc2VfaW1wbChtb2R1bGUsIHopOwogCiBleGl0OgpAQCAtNjkzLDggKzcxMCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfY29tcGxleCB6OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnBvbGFyIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpwb2xhciIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX3BvbGFyX2ltcGwobW9kdWxlLCB6KTsKIAogZXhpdDoKQEAgLTcyMSw4ICs3MzksOSBAQAogICAgIGRvdWJsZSBwaGk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImRkOnJlY3QiLAotICAgICAgICAmciwgJnBoaSkpCisgICAgICAgICZyLCAmcGhpKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX3JlY3RfaW1wbChtb2R1bGUsIHIsIHBoaSk7CiAKIGV4aXQ6CkBAIC03NDcsOCArNzY2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9jb21wbGV4IHo7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6aXNmaW5pdGUiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmlzZmluaXRlIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gY21hdGhfaXNmaW5pdGVfaW1wbChtb2R1bGUsIHopOwogCiBleGl0OgpAQCAtNzczLDggKzc5Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfY29tcGxleCB6OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmlzbmFuIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDppc25hbiIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX2lzbmFuX2ltcGwobW9kdWxlLCB6KTsKIAogZXhpdDoKQEAgLTc5OSw4ICs4MjAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2NvbXBsZXggejsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDppc2luZiIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6aXNpbmYiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBjbWF0aF9pc2luZl9pbXBsKG1vZHVsZSwgeik7CiAKIGV4aXQ6CkBAIC04MzksMjIgKzg2MSwyNSBAQAogY21hdGhfaXNjbG9zZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImEiLCAiYiIsICJyZWxfdG9sIiwgImFic190b2wiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJhIiwgImIiLCAicmVsX3RvbCIsICJhYnNfdG9sIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiRER8JGRkOmlzY2xvc2UiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5X2NvbXBsZXggYTsKICAgICBQeV9jb21wbGV4IGI7CiAgICAgZG91YmxlIHJlbF90b2wgPSAxZS0wOTsKICAgICBkb3VibGUgYWJzX3RvbCA9IDAuMDsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIkREfCRkZDppc2Nsb3NlIiwgX2tleXdvcmRzLAotICAgICAgICAmYSwgJmIsICZyZWxfdG9sLCAmYWJzX3RvbCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmYSwgJmIsICZyZWxfdG9sLCAmYWJzX3RvbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfaXNjbG9zZV9pbXBsKG1vZHVsZSwgYSwgYiwgcmVsX3RvbCwgYWJzX3RvbCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTczMjE5NDAyOWI3ZmIxZTcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWFhMmU3N2NhOWZjMjY5MjggaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvZmNudGxtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvZmNudGxtb2R1bGUuYy5oCmluZGV4IDY3NjYwZWIuLjg0YTAwNGIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL2ZjbnRsbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9mY250bG1vZHVsZS5jLmgKQEAgLTMzLDggKzMzLDkgQEAKICAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpfE86ZmNudGwiLAotICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZhcmcpKQorICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZmNudGxfZmNudGxfaW1wbChtb2R1bGUsIGZkLCBjb2RlLCBhcmcpOwogCiBleGl0OgpAQCAtOTEsOCArOTIsOSBAQAogICAgIGludCBtdXRhdGVfYXJnID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZJfE9wOmlvY3RsIiwKLSAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmb2JfYXJnLCAmbXV0YXRlX2FyZykpCisgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJm9iX2FyZywgJm11dGF0ZV9hcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZmNudGxfaW9jdGxfaW1wbChtb2R1bGUsIGZkLCBjb2RlLCBvYl9hcmcsIG11dGF0ZV9hcmcpOwogCiBleGl0OgpAQCAtMTIyLDggKzEyNCw5IEBACiAgICAgaW50IGNvZGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTpmbG9jayIsCi0gICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSkpCisgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBmY250bF9mbG9ja19pbXBsKG1vZHVsZSwgZmQsIGNvZGUpOwogCiBleGl0OgpAQCAtMTc1LDExICsxNzgsMTIgQEAKICAgICBpbnQgd2hlbmNlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpfE9PaTpsb2NrZiIsCi0gICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJmxlbm9iaiwgJnN0YXJ0b2JqLCAmd2hlbmNlKSkKKyAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmbGVub2JqLCAmc3RhcnRvYmosICZ3aGVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZmNudGxfbG9ja2ZfaW1wbChtb2R1bGUsIGZkLCBjb2RlLCBsZW5vYmosIHN0YXJ0b2JqLCB3aGVuY2UpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTdiMTMwNmI4NjRjMDFjOCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzZjZmY3NmE4ZmIyYzlhNiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9ncnBtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvZ3JwbW9kdWxlLmMuaAppbmRleCAyYzQ3YTQyLi45YzlkNTk1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9ncnBtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL2dycG1vZHVsZS5jLmgKQEAgLTIwLDEyICsyMCwxNCBAQAogZ3JwX2dldGdyZ2lkKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiaWQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJpZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik86Z2V0Z3JnaWQiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICppZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk86Z2V0Z3JnaWQiLCBfa2V5d29yZHMsCi0gICAgICAgICZpZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZ3JwX2dldGdyZ2lkX2ltcGwobW9kdWxlLCBpZCk7CiAKIGV4aXQ6CkBAIC01MCwxMiArNTIsMTQgQEAKIGdycF9nZXRncm5hbShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7Im5hbWUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJuYW1lIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiVTpnZXRncm5hbSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKm5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJVOmdldGdybmFtIiwgX2tleXdvcmRzLAotICAgICAgICAmbmFtZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBncnBfZ2V0Z3JuYW1faW1wbChtb2R1bGUsIG5hbWUpOwogCiBleGl0OgpAQCAtODIsNCArODYsNCBAQAogewogICAgIHJldHVybiBncnBfZ2V0Z3JhbGxfaW1wbChtb2R1bGUpOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJlZTA5ZmVlZmM1NGEyY2IgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWMwNjA4MTA5N2I3ZmZmZTcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvbWQ1bW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL21kNW1vZHVsZS5jLmgKaW5kZXggMGJkOTU4YS4uYWViMWM0MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvbWQ1bW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9tZDVtb2R1bGUuYy5oCkBAIC04MSwxNSArODEsMTcgQEAKIF9tZDVfbWQ1KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE86bWQ1IiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOm1kNSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tZDVfbWQ1X2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NGNkM2NjOTZlMzU1NjNkMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Zjg2ZmMyZjNmMjE4MzFlMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9wb3NpeG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9wb3NpeG1vZHVsZS5jLmgKaW5kZXggMWJiZmMwNi4uNjA4OGVlYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvcG9zaXhtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3Bvc2l4bW9kdWxlLmMuaApAQCAtMzYsMTQgKzM2LDE2IEBACiBvc19zdGF0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZ8JE8mcDpzdGF0IiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJzdGF0IiwgInBhdGgiLCAwLCAxKTsKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnwkTyZwOnN0YXQiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgRlNUQVRBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgRlNUQVRBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3N0YXRfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC03MiwxMyArNzQsMTUgQEAKIG9zX2xzdGF0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mfCRPJjpsc3RhdCIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgibHN0YXQiLCAicGF0aCIsIDAsIDApOwogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mfCRPJjpsc3RhdCIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBGU1RBVEFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBGU1RBVEFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbHN0YXRfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMTMxLDcgKzEzNSw4IEBACiBvc19hY2Nlc3MoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgIm1vZGUiLCAiZGlyX2ZkIiwgImVmZmVjdGl2ZV9pZHMiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJtb2RlIiwgImRpcl9mZCIsICJlZmZlY3RpdmVfaWRzIiwgImZvbGxvd19zeW1saW5rcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8maXwkTyZwcDphY2Nlc3MiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImFjY2VzcyIsICJwYXRoIiwgMCwgMCk7CiAgICAgaW50IG1vZGU7CiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwpAQCAtMTM5LDEyICsxNDQsMTQgQEAKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8maXwkTyZwcDphY2Nlc3MiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIEZBQ0NFU1NBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZWZmZWN0aXZlX2lkcywgJmZvbGxvd19zeW1saW5rcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBGQUNDRVNTQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmVmZmVjdGl2ZV9pZHMsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX2FjY2Vzc19pbXBsKG1vZHVsZSwgJnBhdGgsIG1vZGUsIGRpcl9mZCwgZWZmZWN0aXZlX2lkcywgZm9sbG93X3N5bWxpbmtzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTc4LDExICsxODUsMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgY2hhciAqX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTp0dHluYW1lIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dHR5bmFtZSIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfdHR5bmFtZV9pbXBsKG1vZHVsZSwgZmQpOwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0yMzMsMTIgKzI0MiwxNCBAQAogb3NfY2hkaXIoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mOmNoZGlyIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJjaGRpciIsICJwYXRoIiwgMCwgUEFUSF9IQVZFX0ZDSERJUik7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJjpjaGRpciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jaGRpcl9pbXBsKG1vZHVsZSwgJnBhdGgpOwogCiBleGl0OgpAQCAtMjY5LDEyICsyODAsMTQgQEAKIG9zX2ZjaGRpcihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJjpmY2hkaXIiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBmZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mOmZjaGRpciIsIF9rZXl3b3JkcywKLSAgICAgICAgZmlsZGVzX2NvbnZlcnRlciwgJmZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mY2hkaXJfaW1wbChtb2R1bGUsIGZkKTsKIAogZXhpdDoKQEAgLTMyMCwxNSArMzMzLDE3IEBACiBvc19jaG1vZChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAibW9kZSIsICJkaXJfZmQiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJtb2RlIiwgImRpcl9mZCIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJml8JE8mcDpjaG1vZCIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiY2htb2QiLCAicGF0aCIsIDAsIFBBVEhfSEFWRV9GQ0hNT0QpOwogICAgIGludCBtb2RlOwogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8maXwkTyZwOmNobW9kIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBGQ0hNT0RBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIEZDSE1PREFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfY2htb2RfaW1wbChtb2R1bGUsICZwYXRoLCBtb2RlLCBkaXJfZmQsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC0zNTgsMTMgKzM3MywxNSBAQAogb3NfZmNobW9kKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmQiLCAibW9kZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZkIiwgIm1vZGUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpaTpmY2htb2QiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBmZDsKICAgICBpbnQgbW9kZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImlpOmZjaG1vZCIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZkLCAmbW9kZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZmQsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2ZjaG1vZF9pbXBsKG1vZHVsZSwgZmQsIG1vZGUpOwogCiBleGl0OgpAQCAtMzk0LDEzICs0MTEsMTUgQEAKIG9zX2xjaG1vZChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAibW9kZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAibW9kZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8maTpsY2htb2QiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImxjaG1vZCIsICJwYXRoIiwgMCwgMCk7CiAgICAgaW50IG1vZGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJmk6bGNobW9kIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbGNobW9kX2ltcGwobW9kdWxlLCAmcGF0aCwgbW9kZSk7CiAKIGV4aXQ6CkBAIC00MzcsMTQgKzQ1NiwxNiBAQAogb3NfY2hmbGFncyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAiZmxhZ3MiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJmbGFncyIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJmt8cDpjaGZsYWdzIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJjaGZsYWdzIiwgInBhdGgiLCAwLCAwKTsKICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZrfHA6Y2hmbGFncyIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmZmxhZ3MsICZmb2xsb3dfc3ltbGlua3MpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmZmxhZ3MsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfY2hmbGFnc19pbXBsKG1vZHVsZSwgJnBhdGgsIGZsYWdzLCBmb2xsb3dfc3ltbGlua3MpOwogCiBleGl0OgpAQCAtNDc3LDEzICs0OTgsMTUgQEAKIG9zX2xjaGZsYWdzKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJmbGFncyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAiZmxhZ3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJms6bGNoZmxhZ3MiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImxjaGZsYWdzIiwgInBhdGgiLCAwLCAwKTsKICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZrOmxjaGZsYWdzIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmbGFncykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmbGFncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19sY2hmbGFnc19pbXBsKG1vZHVsZSwgJnBhdGgsIGZsYWdzKTsKIAogZXhpdDoKQEAgLTUxMywxMiArNTM2LDE0IEBACiBvc19jaHJvb3QoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mOmNocm9vdCIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiY2hyb290IiwgInBhdGgiLCAwLCAwKTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mOmNocm9vdCIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jaHJvb3RfaW1wbChtb2R1bGUsICZwYXRoKTsKIAogZXhpdDoKQEAgLTU0OCwxMiArNTczLDE0IEBACiBvc19mc3luYyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJjpmc3luYyIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IGZkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyY6ZnN5bmMiLCBfa2V5d29yZHMsCi0gICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBmaWxkZXNfY29udmVydGVyLCAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZnN5bmNfaW1wbChtb2R1bGUsIGZkKTsKIAogZXhpdDoKQEAgLTYwMiwxMiArNjI5LDE0IEBACiBvc19mZGF0YXN5bmMoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJmZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyY6ZmRhdGFzeW5jIiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQgZmQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJjpmZGF0YXN5bmMiLCBfa2V5d29yZHMsCi0gICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBmaWxkZXNfY29udmVydGVyLCAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZmRhdGFzeW5jX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC02NTksMTYgKzY4OCwxOCBAQAogb3NfY2hvd24oUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgInVpZCIsICJnaWQiLCAiZGlyX2ZkIiwgImZvbGxvd19zeW1saW5rcyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAidWlkIiwgImdpZCIsICJkaXJfZmQiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZPJk8mfCRPJnA6Y2hvd24iLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImNob3duIiwgInBhdGgiLCAwLCBQQVRIX0hBVkVfRkNIT1dOKTsKICAgICB1aWRfdCB1aWQ7CiAgICAgZ2lkX3QgZ2lkOwogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZPJnwkTyZwOmNob3duIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCwgRkNIT1dOQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCwgRkNIT1dOQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jaG93bl9pbXBsKG1vZHVsZSwgJnBhdGgsIHVpZCwgZ2lkLCBkaXJfZmQsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC03MDAsMTQgKzczMSwxNiBAQAogb3NfZmNob3duKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmQiLCAidWlkIiwgImdpZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZkIiwgInVpZCIsICJnaWQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpTyZPJjpmY2hvd24iLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBmZDsKICAgICB1aWRfdCB1aWQ7CiAgICAgZ2lkX3QgZ2lkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaU8mTyY6ZmNob3duIiwgX2tleXdvcmRzLAotICAgICAgICAmZmQsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZmQsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mY2hvd25faW1wbChtb2R1bGUsIGZkLCB1aWQsIGdpZCk7CiAKIGV4aXQ6CkBAIC03MzcsMTQgKzc3MCwxNiBAQAogb3NfbGNob3duKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJ1aWQiLCAiZ2lkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJ1aWQiLCAiZ2lkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZPJk8mOmxjaG93biIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgibGNob3duIiwgInBhdGgiLCAwLCAwKTsKICAgICB1aWRfdCB1aWQ7CiAgICAgZ2lkX3QgZ2lkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZPJk8mOmxjaG93biIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBfUHlfVWlkX0NvbnZlcnRlciwgJnVpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBfUHlfVWlkX0NvbnZlcnRlciwgJnVpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbGNob3duX2ltcGwobW9kdWxlLCAmcGF0aCwgdWlkLCBnaWQpOwogCiBleGl0OgpAQCAtODIyLDE2ICs4NTcsMTggQEAKIG9zX2xpbmsoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzcmMiLCAiZHN0IiwgInNyY19kaXJfZmQiLCAiZHN0X2Rpcl9mZCIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzcmMiLCAiZHN0IiwgInNyY19kaXJfZmQiLCAiZHN0X2Rpcl9mZCIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJk8mfCRPJk8mcDpsaW5rIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3Qgc3JjID0gUEFUSF9UX0lOSVRJQUxJWkUoImxpbmsiLCAic3JjIiwgMCwgMCk7CiAgICAgcGF0aF90IGRzdCA9IFBBVEhfVF9JTklUSUFMSVpFKCJsaW5rIiwgImRzdCIsIDAsIDApOwogICAgIGludCBzcmNfZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAgICAgaW50IGRzdF9kaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8JE8mTyZwOmxpbmsiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmc3JjLCBwYXRoX2NvbnZlcnRlciwgJmRzdCwgZGlyX2ZkX2NvbnZlcnRlciwgJnNyY19kaXJfZmQsIGRpcl9mZF9jb252ZXJ0ZXIsICZkc3RfZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmc3JjLCBwYXRoX2NvbnZlcnRlciwgJmRzdCwgZGlyX2ZkX2NvbnZlcnRlciwgJnNyY19kaXJfZmQsIGRpcl9mZF9jb252ZXJ0ZXIsICZkc3RfZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xpbmtfaW1wbChtb2R1bGUsICZzcmMsICZkc3QsIHNyY19kaXJfZmQsIGRzdF9kaXJfZmQsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC04NzIsMTIgKzkwOSwxNCBAQAogb3NfbGlzdGRpcihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE8mOmxpc3RkaXIiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImxpc3RkaXIiLCAicGF0aCIsIDEsIFBBVEhfSEFWRV9GRE9QRU5ESVIpOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE8mOmxpc3RkaXIiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbGlzdGRpcl9pbXBsKG1vZHVsZSwgJnBhdGgpOwogCiBleGl0OgpAQCAtOTA2LDggKzk0NSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiX2dldGZ1bGxwYXRobmFtZSIsICJwYXRoIiwgMCwgMCk7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl9nZXRmdWxscGF0aG5hbWUiLCBwYXRoX2NvbnZlcnRlciwgJnBhdGgpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6X2dldGZ1bGxwYXRobmFtZSIsIHBhdGhfY29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19fZ2V0ZnVsbHBhdGhuYW1lX2ltcGwobW9kdWxlLCAmcGF0aCk7CiAKIGV4aXQ6CkBAIC05MzksOCArOTc5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcGF0aDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpfZ2V0ZmluYWxwYXRobmFtZSIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6X2dldGZpbmFscGF0aG5hbWUiLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19fZ2V0ZmluYWxwYXRobmFtZV9pbXBsKG1vZHVsZSwgcGF0aCk7CiAKIGV4aXQ6CkBAIC05NjgsOCArMTAwOSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiX2lzZGlyIiwgInBhdGgiLCAwLCAwKTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6X2lzZGlyIiwgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl9pc2RpciIsIHBhdGhfY29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19faXNkaXJfaW1wbChtb2R1bGUsICZwYXRoKTsKIAogZXhpdDoKQEAgLTk5OSwxMiArMTA0MSwxNCBAQAogb3NfX2dldHZvbHVtZXBhdGhuYW1lKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJVOl9nZXR2b2x1bWVwYXRobmFtZSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnBhdGg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJVOl9nZXR2b2x1bWVwYXRobmFtZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfX2dldHZvbHVtZXBhdGhuYW1lX2ltcGwobW9kdWxlLCBwYXRoKTsKIAogZXhpdDoKQEAgLTEwMzYsMTQgKzEwODAsMTYgQEAKIG9zX21rZGlyKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJtb2RlIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAibW9kZSIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJnxpJE8mOm1rZGlyIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJta2RpciIsICJwYXRoIiwgMCwgMCk7CiAgICAgaW50IG1vZGUgPSA1MTE7CiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8aSRPJjpta2RpciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmbW9kZSwgTUtESVJBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIE1LRElSQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19ta2Rpcl9pbXBsKG1vZHVsZSwgJnBhdGgsIG1vZGUsIGRpcl9mZCk7CiAKIGV4aXQ6CkBAIC0xMDczLDggKzExMTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBpbmNyZW1lbnQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6bmljZSIsICZpbmNyZW1lbnQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpuaWNlIiwgJmluY3JlbWVudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19uaWNlX2ltcGwobW9kdWxlLCBpbmNyZW1lbnQpOwogCiBleGl0OgpAQCAtMTEwMSwxMyArMTE0OCwxNSBAQAogb3NfZ2V0cHJpb3JpdHkoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJ3aGljaCIsICJ3aG8iLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJ3aGljaCIsICJ3aG8iLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpaTpnZXRwcmlvcml0eSIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHdoaWNoOwogICAgIGludCB3aG87CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpaTpnZXRwcmlvcml0eSIsIF9rZXl3b3JkcywKLSAgICAgICAgJndoaWNoLCAmd2hvKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ3aGljaCwgJndobykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19nZXRwcmlvcml0eV9pbXBsKG1vZHVsZSwgd2hpY2gsIHdobyk7CiAKIGV4aXQ6CkBAIC0xMTM0LDE0ICsxMTgzLDE2IEBACiBvc19zZXRwcmlvcml0eShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7IndoaWNoIiwgIndobyIsICJwcmlvcml0eSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7IndoaWNoIiwgIndobyIsICJwcmlvcml0eSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7ImlpaTpzZXRwcmlvcml0eSIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHdoaWNoOwogICAgIGludCB3aG87CiAgICAgaW50IHByaW9yaXR5OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaWlpOnNldHByaW9yaXR5IiwgX2tleXdvcmRzLAotICAgICAgICAmd2hpY2gsICZ3aG8sICZwcmlvcml0eSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmd2hpY2gsICZ3aG8sICZwcmlvcml0eSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRwcmlvcml0eV9pbXBsKG1vZHVsZSwgd2hpY2gsIHdobywgcHJpb3JpdHkpOwogCiBleGl0OgpAQCAtMTE3MywxNSArMTIyNCwxNyBAQAogb3NfcmVuYW1lKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3JjIiwgImRzdCIsICJzcmNfZGlyX2ZkIiwgImRzdF9kaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzcmMiLCAiZHN0IiwgInNyY19kaXJfZmQiLCAiZHN0X2Rpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mTyZ8JE8mTyY6cmVuYW1lIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3Qgc3JjID0gUEFUSF9UX0lOSVRJQUxJWkUoInJlbmFtZSIsICJzcmMiLCAwLCAwKTsKICAgICBwYXRoX3QgZHN0ID0gUEFUSF9UX0lOSVRJQUxJWkUoInJlbmFtZSIsICJkc3QiLCAwLCAwKTsKICAgICBpbnQgc3JjX2Rpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogICAgIGludCBkc3RfZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mfCRPJk8mOnJlbmFtZSIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcmVuYW1lX2ltcGwobW9kdWxlLCAmc3JjLCAmZHN0LCBzcmNfZGlyX2ZkLCBkc3RfZGlyX2ZkKTsKIAogZXhpdDoKQEAgLTEyMTYsMTUgKzEyNjksMTcgQEAKIG9zX3JlcGxhY2UoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzcmMiLCAiZHN0IiwgInNyY19kaXJfZmQiLCAiZHN0X2Rpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InNyYyIsICJkc3QiLCAic3JjX2Rpcl9mZCIsICJkc3RfZGlyX2ZkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZPJnwkTyZPJjpyZXBsYWNlIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3Qgc3JjID0gUEFUSF9UX0lOSVRJQUxJWkUoInJlcGxhY2UiLCAic3JjIiwgMCwgMCk7CiAgICAgcGF0aF90IGRzdCA9IFBBVEhfVF9JTklUSUFMSVpFKCJyZXBsYWNlIiwgImRzdCIsIDAsIDApOwogICAgIGludCBzcmNfZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAgICAgaW50IGRzdF9kaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8JE8mTyY6cmVwbGFjZSIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcmVwbGFjZV9pbXBsKG1vZHVsZSwgJnNyYywgJmRzdCwgc3JjX2Rpcl9mZCwgZHN0X2Rpcl9mZCk7CiAKIGV4aXQ6CkBAIC0xMjU3LDEzICsxMzEyLDE1IEBACiBvc19ybWRpcihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAiZGlyX2ZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJnwkTyY6cm1kaXIiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInJtZGlyIiwgInBhdGgiLCAwLCAwKTsKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnwkTyY6cm1kaXIiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgVU5MSU5LQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIFVOTElOS0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfcm1kaXJfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMTI5MSwxNiArMTM0OCwxOSBAQAogb3Nfc3lzdGVtKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiY29tbWFuZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImNvbW1hbmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ1OnN5c3RlbSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlfVU5JQ09ERSAqY29tbWFuZDsKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ1OnN5c3RlbSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmNvbW1hbmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmNvbW1hbmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3N5c3RlbV9pbXBsKG1vZHVsZSwgY29tbWFuZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTEzMjcsMTYgKzEzODcsMTkgQEAKIG9zX3N5c3RlbShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImNvbW1hbmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJjb21tYW5kIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyY6c3lzdGVtIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqY29tbWFuZCA9IE5VTEw7CiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyY6c3lzdGVtIiwgX2tleXdvcmRzLAotICAgICAgICBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZjb21tYW5kKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJmNvbW1hbmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3N5c3RlbV9pbXBsKG1vZHVsZSwgY29tbWFuZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTEzNjYsOCArMTQyOSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG1hc2s7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dW1hc2siLCAmbWFzaykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnVtYXNrIiwgJm1hc2spKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdW1hc2tfaW1wbChtb2R1bGUsIG1hc2spOwogCiBleGl0OgpAQCAtMTM5NSwxMyArMTQ1OSwxNSBAQAogb3NfdW5saW5rKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mfCRPJjp1bmxpbmsiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInVubGluayIsICJwYXRoIiwgMCwgMCk7CiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8JE8mOnVubGluayIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgVU5MSU5LQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc191bmxpbmtfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMTQzMiwxMyArMTQ5OCwxNSBAQAogb3NfcmVtb3ZlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mfCRPJjpyZW1vdmUiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInJlbW92ZSIsICJwYXRoIiwgMCwgMCk7CiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8JE8mOnJlbW92ZSIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgVU5MSU5LQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19yZW1vdmVfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMTUxMywxNiArMTU4MSwxOCBAQAogb3NfdXRpbWUoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgInRpbWVzIiwgIm5zIiwgImRpcl9mZCIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgInRpbWVzIiwgIm5zIiwgImRpcl9mZCIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJnxPJE9PJnA6dXRpbWUiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInV0aW1lIiwgInBhdGgiLCAwLCBQQVRIX1VUSU1FX0hBVkVfRkQpOwogICAgIFB5T2JqZWN0ICp0aW1lcyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5zID0gTlVMTDsKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnxPJE9PJnA6dXRpbWUiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJnRpbWVzLCAmbnMsIEZVVElNRU5TQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZ0aW1lcywgJm5zLCBGVVRJTUVOU0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdXRpbWVfaW1wbChtb2R1bGUsICZwYXRoLCB0aW1lcywgbnMsIGRpcl9mZCwgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTE1NDgsMTIgKzE2MTgsMTQgQEAKIG9zX19leGl0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpfZXhpdCIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHN0YXR1czsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6X2V4aXQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19fZXhpdF9pbXBsKG1vZHVsZSwgc3RhdHVzKTsKIAogZXhpdDoKQEAgLTE1NzcsMjMgKzE2NDksMjQgQEAKICAgICB7ImV4ZWN2IiwgKFB5Q0Z1bmN0aW9uKW9zX2V4ZWN2LCBNRVRIX1ZBUkFSR1MsIG9zX2V4ZWN2X19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1vc19leGVjdl9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpwYXRoLCBQeU9iamVjdCAqYXJndik7Citvc19leGVjdl9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIHBhdGhfdCAqcGF0aCwgUHlPYmplY3QgKmFyZ3YpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogb3NfZXhlY3YoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKnBhdGggPSBOVUxMOworICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImV4ZWN2IiwgInBhdGgiLCAwLCAwKTsKICAgICBQeU9iamVjdCAqYXJndjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPOmV4ZWN2IiwKLSAgICAgICAgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCwgJmFyZ3YpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZhcmd2KSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgcmV0dXJuX3ZhbHVlID0gb3NfZXhlY3ZfaW1wbChtb2R1bGUsIHBhdGgsIGFyZ3YpOworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBvc19leGVjdl9pbXBsKG1vZHVsZSwgJnBhdGgsIGFyZ3YpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIHBhdGggKi8KLSAgICBQeV9YREVDUkVGKHBhdGgpOworICAgIHBhdGhfY2xlYW51cCgmcGF0aCk7CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTYyNSwxNCArMTY5OCwxNiBAQAogb3NfZXhlY3ZlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJhcmd2IiwgImVudiIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAiYXJndiIsICJlbnYiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJk9POmV4ZWN2ZSIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiZXhlY3ZlIiwgInBhdGgiLCAwLCBQQVRIX0hBVkVfRkVYRUNWRSk7CiAgICAgUHlPYmplY3QgKmFyZ3Y7CiAgICAgUHlPYmplY3QgKmVudjsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mT086ZXhlY3ZlIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZhcmd2LCAmZW52KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmFyZ3YsICZlbnYpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZXhlY3ZlX2ltcGwobW9kdWxlLCAmcGF0aCwgYXJndiwgZW52KTsKIAogZXhpdDoKQEAgLTE2NDQsNyArMTcxOSw3IEBACiAKICNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfRVhFQ1YpICovCiAKLSNpZiBkZWZpbmVkKEhBVkVfU1BBV05WKQorI2lmIChkZWZpbmVkKEhBVkVfU1BBV05WKSB8fCBkZWZpbmVkKEhBVkVfV1NQQVdOVikpCiAKIFB5RG9jX1NUUlZBUihvc19zcGF3bnZfX2RvY19fLAogInNwYXdudigkbW9kdWxlLCBtb2RlLCBwYXRoLCBhcmd2LCAvKVxuIgpAQCAtMTY2MywzMSArMTczOCwzMiBAQAogICAgIHsic3Bhd252IiwgKFB5Q0Z1bmN0aW9uKW9zX3NwYXdudiwgTUVUSF9WQVJBUkdTLCBvc19zcGF3bnZfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLW9zX3NwYXdudl9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludCBtb2RlLCBQeU9iamVjdCAqcGF0aCwgUHlPYmplY3QgKmFyZ3YpOworb3Nfc3Bhd252X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50IG1vZGUsIHBhdGhfdCAqcGF0aCwgUHlPYmplY3QgKmFyZ3YpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogb3Nfc3Bhd252KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBtb2RlOwotICAgIFB5T2JqZWN0ICpwYXRoID0gTlVMTDsKKyAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJzcGF3bnYiLCAicGF0aCIsIDAsIDApOwogICAgIFB5T2JqZWN0ICphcmd2OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyZPOnNwYXdudiIsCi0gICAgICAgICZtb2RlLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZwYXRoLCAmYXJndikpCisgICAgICAgICZtb2RlLCBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZhcmd2KSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgcmV0dXJuX3ZhbHVlID0gb3Nfc3Bhd252X2ltcGwobW9kdWxlLCBtb2RlLCBwYXRoLCBhcmd2KTsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc3Bhd252X2ltcGwobW9kdWxlLCBtb2RlLCAmcGF0aCwgYXJndik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgcGF0aCAqLwotICAgIFB5X1hERUNSRUYocGF0aCk7CisgICAgcGF0aF9jbGVhbnVwKCZwYXRoKTsKIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CiAKLSNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfU1BBV05WKSAqLworI2VuZGlmIC8qIChkZWZpbmVkKEhBVkVfU1BBV05WKSB8fCBkZWZpbmVkKEhBVkVfV1NQQVdOVikpICovCiAKLSNpZiBkZWZpbmVkKEhBVkVfU1BBV05WKQorI2lmIChkZWZpbmVkKEhBVkVfU1BBV05WKSB8fCBkZWZpbmVkKEhBVkVfV1NQQVdOVikpCiAKIFB5RG9jX1NUUlZBUihvc19zcGF3bnZlX19kb2NfXywKICJzcGF3bnZlKCRtb2R1bGUsIG1vZGUsIHBhdGgsIGFyZ3YsIGVudiwgLylcbiIKQEAgLTE3MDgsNyArMTc4NCw3IEBACiAgICAgeyJzcGF3bnZlIiwgKFB5Q0Z1bmN0aW9uKW9zX3NwYXdudmUsIE1FVEhfVkFSQVJHUywgb3Nfc3Bhd252ZV9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotb3Nfc3Bhd252ZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludCBtb2RlLCBQeU9iamVjdCAqcGF0aCwgUHlPYmplY3QgKmFyZ3YsCitvc19zcGF3bnZlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50IG1vZGUsIHBhdGhfdCAqcGF0aCwgUHlPYmplY3QgKmFyZ3YsCiAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmVudik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNzE2LDIzICsxNzkyLDI0IEBACiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG1vZGU7Ci0gICAgUHlPYmplY3QgKnBhdGggPSBOVUxMOworICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInNwYXdudmUiLCAicGF0aCIsIDAsIDApOwogICAgIFB5T2JqZWN0ICphcmd2OwogICAgIFB5T2JqZWN0ICplbnY7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJk9POnNwYXdudmUiLAotICAgICAgICAmbW9kZSwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCwgJmFyZ3YsICZlbnYpKQorICAgICAgICAmbW9kZSwgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmYXJndiwgJmVudikpIHsKICAgICAgICAgZ290byBleGl0OwotICAgIHJldHVybl92YWx1ZSA9IG9zX3NwYXdudmVfaW1wbChtb2R1bGUsIG1vZGUsIHBhdGgsIGFyZ3YsIGVudik7CisgICAgfQorICAgIHJldHVybl92YWx1ZSA9IG9zX3NwYXdudmVfaW1wbChtb2R1bGUsIG1vZGUsICZwYXRoLCBhcmd2LCBlbnYpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIHBhdGggKi8KLSAgICBQeV9YREVDUkVGKHBhdGgpOworICAgIHBhdGhfY2xlYW51cCgmcGF0aCk7CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQogCi0jZW5kaWYgLyogZGVmaW5lZChIQVZFX1NQQVdOVikgKi8KKyNlbmRpZiAvKiAoZGVmaW5lZChIQVZFX1NQQVdOVikgfHwgZGVmaW5lZChIQVZFX1dTUEFXTlYpKSAqLwogCiAjaWYgZGVmaW5lZChIQVZFX0ZPUksxKQogCkBAIC0xODAwLDEyICsxODc3LDE0IEBACiBvc19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicG9saWN5IiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicG9saWN5IiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpzY2hlZF9nZXRfcHJpb3JpdHlfbWF4IiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQgcG9saWN5OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaTpzY2hlZF9nZXRfcHJpb3JpdHlfbWF4IiwgX2tleXdvcmRzLAotICAgICAgICAmcG9saWN5KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZwb2xpY3kpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfZ2V0X3ByaW9yaXR5X21heF9pbXBsKG1vZHVsZSwgcG9saWN5KTsKIAogZXhpdDoKQEAgLTE4MzIsMTIgKzE5MTEsMTQgQEAKIG9zX3NjaGVkX2dldF9wcmlvcml0eV9taW4oUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwb2xpY3kiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwb2xpY3kiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpOnNjaGVkX2dldF9wcmlvcml0eV9taW4iLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBwb2xpY3k7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOnNjaGVkX2dldF9wcmlvcml0eV9taW4iLCBfa2V5d29yZHMsCi0gICAgICAgICZwb2xpY3kpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnBvbGljeSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zY2hlZF9nZXRfcHJpb3JpdHlfbWluX2ltcGwobW9kdWxlLCBwb2xpY3kpOwogCiBleGl0OgpAQCAtMTg2OCw4ICsxOTQ5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBwaWRfdCBwaWQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX2dldHNjaGVkdWxlciIsICZwaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6c2NoZWRfZ2V0c2NoZWR1bGVyIiwgJnBpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zY2hlZF9nZXRzY2hlZHVsZXJfaW1wbChtb2R1bGUsIHBpZCk7CiAKIGV4aXQ6CkBAIC0xODk2LDEyICsxOTc4LDE0IEBACiBvc19zY2hlZF9wYXJhbShQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic2NoZWRfcHJpb3JpdHkiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzY2hlZF9wcmlvcml0eSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik86c2NoZWRfcGFyYW0iLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzY2hlZF9wcmlvcml0eTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk86c2NoZWRfcGFyYW0iLCBfa2V5d29yZHMsCi0gICAgICAgICZzY2hlZF9wcmlvcml0eSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc2NoZWRfcHJpb3JpdHkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfcGFyYW1faW1wbCh0eXBlLCBzY2hlZF9wcmlvcml0eSk7CiAKIGV4aXQ6CkBAIC0xOTM3LDggKzIwMjEsOSBAQAogICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfUElEICJpTyY6c2NoZWRfc2V0c2NoZWR1bGVyIiwKLSAgICAgICAgJnBpZCwgJnBvbGljeSwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkKKyAgICAgICAgJnBpZCwgJnBvbGljeSwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NjaGVkX3NldHNjaGVkdWxlcl9pbXBsKG1vZHVsZSwgcGlkLCBwb2xpY3ksICZwYXJhbSk7CiAKIGV4aXQ6CkBAIC0xOTcwLDggKzIwNTUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHBpZF90IHBpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6c2NoZWRfZ2V0cGFyYW0iLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX2dldHBhcmFtIiwgJnBpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zY2hlZF9nZXRwYXJhbV9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTIwMDYsOCArMjA5Miw5IEBACiAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIF9QeV9QQVJTRV9QSUQgIk8mOnNjaGVkX3NldHBhcmFtIiwKLSAgICAgICAgJnBpZCwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkKKyAgICAgICAgJnBpZCwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NjaGVkX3NldHBhcmFtX2ltcGwobW9kdWxlLCBwaWQsICZwYXJhbSk7CiAKIGV4aXQ6CkBAIC0yMDM5LDExICsyMTI2LDEzIEBACiAgICAgcGlkX3QgcGlkOwogICAgIGRvdWJsZSBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9QSUQgIjpzY2hlZF9ycl9nZXRfaW50ZXJ2YWwiLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX3JyX2dldF9pbnRlcnZhbCIsICZwaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3NjaGVkX3JyX2dldF9pbnRlcnZhbF9pbXBsKG1vZHVsZSwgcGlkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5RmxvYXRfRnJvbURvdWJsZShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTIwOTgsOCArMjE4Nyw5IEBACiAgICAgUHlPYmplY3QgKm1hc2s7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX1BJRCAiTzpzY2hlZF9zZXRhZmZpbml0eSIsCi0gICAgICAgICZwaWQsICZtYXNrKSkKKyAgICAgICAgJnBpZCwgJm1hc2spKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfc2V0YWZmaW5pdHlfaW1wbChtb2R1bGUsIHBpZCwgbWFzayk7CiAKIGV4aXQ6CkBAIC0yMTE0LDcgKzIyMDQsNyBAQAogInNjaGVkX2dldGFmZmluaXR5KCRtb2R1bGUsIHBpZCwgLylcbiIKICItLVxuIgogIlxuIgotIlJldHVybiB0aGUgYWZmaW5pdHkgb2YgdGhlIHByb2Nlc3MgaWRlbnRpZmllZCBieSBwaWQuXG4iCisiUmV0dXJuIHRoZSBhZmZpbml0eSBvZiB0aGUgcHJvY2VzcyBpZGVudGlmaWVkIGJ5IHBpZCAob3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBpZiB6ZXJvKS5cbiIKICJcbiIKICJUaGUgYWZmaW5pdHkgaXMgcmV0dXJuZWQgYXMgYSBzZXQgb2YgQ1BVIGlkZW50aWZpZXJzLiIpOwogCkBAIC0yMTMwLDggKzIyMjAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHBpZF90IHBpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6c2NoZWRfZ2V0YWZmaW5pdHkiLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX2dldGFmZmluaXR5IiwgJnBpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zY2hlZF9nZXRhZmZpbml0eV9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTIzMTYsMTIgKzI0MDcsMTQgQEAKIG9zX2dldHBnaWQoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwaWQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwaWQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyIiIF9QeV9QQVJTRV9QSUQgIjpnZXRwZ2lkIiwgX2tleXdvcmRzLCAwfTsKICAgICBwaWRfdCBwaWQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICIiIF9QeV9QQVJTRV9QSUQgIjpnZXRwZ2lkIiwgX2tleXdvcmRzLAotICAgICAgICAmcGlkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZwaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZ2V0cGdpZF9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTI0NjUsOCArMjU1OCw5IEBACiAgICAgUHlfc3NpemVfdCBzaWduYWw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX1BJRCAibjpraWxsIiwKLSAgICAgICAgJnBpZCwgJnNpZ25hbCkpCisgICAgICAgICZwaWQsICZzaWduYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfa2lsbF9pbXBsKG1vZHVsZSwgcGlkLCBzaWduYWwpOwogCiBleGl0OgpAQCAtMjQ5Nyw4ICsyNTkxLDkgQEAKICAgICBpbnQgc2lnbmFsOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIF9QeV9QQVJTRV9QSUQgImk6a2lsbHBnIiwKLSAgICAgICAgJnBnaWQsICZzaWduYWwpKQorICAgICAgICAmcGdpZCwgJnNpZ25hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19raWxscGdfaW1wbChtb2R1bGUsIHBnaWQsIHNpZ25hbCk7CiAKIGV4aXQ6CkBAIC0yNTI3LDggKzI2MjIsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBvcDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpwbG9jayIsICZvcCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnBsb2NrIiwgJm9wKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3Bsb2NrX2ltcGwobW9kdWxlLCBvcCk7CiAKIGV4aXQ6CkBAIC0yNTU3LDggKzI2NTMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHVpZF90IHVpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0dWlkIiwgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0dWlkIiwgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0dWlkX2ltcGwobW9kdWxlLCB1aWQpOwogCiBleGl0OgpAQCAtMjU4Nyw4ICsyNjg0LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICB1aWRfdCBldWlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpzZXRldWlkIiwgX1B5X1VpZF9Db252ZXJ0ZXIsICZldWlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnNldGV1aWQiLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0ZXVpZF9pbXBsKG1vZHVsZSwgZXVpZCk7CiAKIGV4aXQ6CkBAIC0yNjE3LDggKzI3MTUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGdpZF90IGVnaWQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnNldGVnaWQiLCBfUHlfR2lkX0NvbnZlcnRlciwgJmVnaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0ZWdpZCIsIF9QeV9HaWRfQ29udmVydGVyLCAmZWdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRlZ2lkX2ltcGwobW9kdWxlLCBlZ2lkKTsKIAogZXhpdDoKQEAgLTI2NDksOCArMjc0OCw5IEBACiAgICAgdWlkX3QgZXVpZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJjpzZXRyZXVpZCIsCi0gICAgICAgIF9QeV9VaWRfQ29udmVydGVyLCAmcnVpZCwgX1B5X1VpZF9Db252ZXJ0ZXIsICZldWlkKSkKKyAgICAgICAgX1B5X1VpZF9Db252ZXJ0ZXIsICZydWlkLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0cmV1aWRfaW1wbChtb2R1bGUsIHJ1aWQsIGV1aWQpOwogCiBleGl0OgpAQCAtMjY4MSw4ICsyNzgxLDkgQEAKICAgICBnaWRfdCBlZ2lkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mOnNldHJlZ2lkIiwKLSAgICAgICAgX1B5X0dpZF9Db252ZXJ0ZXIsICZyZ2lkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmVnaWQpKQorICAgICAgICBfUHlfR2lkX0NvbnZlcnRlciwgJnJnaWQsIF9QeV9HaWRfQ29udmVydGVyLCAmZWdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRyZWdpZF9pbXBsKG1vZHVsZSwgcmdpZCwgZWdpZCk7CiAKIGV4aXQ6CkBAIC0yNzExLDggKzI4MTIsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGdpZF90IGdpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0Z2lkIiwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0Z2lkIiwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0Z2lkX2ltcGwobW9kdWxlLCBnaWQpOwogCiBleGl0OgpAQCAtMjc1NSwxMiArMjg1NywxNCBAQAogb3Nfd2FpdDMoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJvcHRpb25zIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsib3B0aW9ucyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Imk6d2FpdDMiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBvcHRpb25zOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaTp3YWl0MyIsIF9rZXl3b3JkcywKLSAgICAgICAgJm9wdGlvbnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJm9wdGlvbnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfd2FpdDNfaW1wbChtb2R1bGUsIG9wdGlvbnMpOwogCiBleGl0OgpAQCAtMjc5MCwxMyArMjg5NCwxNSBAQAogb3Nfd2FpdDQoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwaWQiLCAib3B0aW9ucyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBpZCIsICJvcHRpb25zIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiIiBfUHlfUEFSU0VfUElEICJpOndhaXQ0IiwgX2tleXdvcmRzLCAwfTsKICAgICBwaWRfdCBwaWQ7CiAgICAgaW50IG9wdGlvbnM7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICIiIF9QeV9QQVJTRV9QSUQgImk6d2FpdDQiLCBfa2V5d29yZHMsCi0gICAgICAgICZwaWQsICZvcHRpb25zKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZwaWQsICZvcHRpb25zKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3dhaXQ0X2ltcGwobW9kdWxlLCBwaWQsIG9wdGlvbnMpOwogCiBleGl0OgpAQCAtMjgzOSw4ICsyOTQ1LDkgQEAKICAgICBpbnQgb3B0aW9uczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIgX1B5X1BBUlNFX1BJRCAiaTp3YWl0aWQiLAotICAgICAgICAmaWR0eXBlLCAmaWQsICZvcHRpb25zKSkKKyAgICAgICAgJmlkdHlwZSwgJmlkLCAmb3B0aW9ucykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc193YWl0aWRfaW1wbChtb2R1bGUsIGlkdHlwZSwgaWQsIG9wdGlvbnMpOwogCiBleGl0OgpAQCAtMjg3Niw4ICsyOTgzLDkgQEAKICAgICBpbnQgb3B0aW9uczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfUElEICJpOndhaXRwaWQiLAotICAgICAgICAmcGlkLCAmb3B0aW9ucykpCisgICAgICAgICZwaWQsICZvcHRpb25zKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3dhaXRwaWRfaW1wbChtb2R1bGUsIHBpZCwgb3B0aW9ucyk7CiAKIGV4aXQ6CkBAIC0yOTAzLDE4ICszMDExLDE5IEBACiAgICAgeyJ3YWl0cGlkIiwgKFB5Q0Z1bmN0aW9uKW9zX3dhaXRwaWQsIE1FVEhfVkFSQVJHUywgb3Nfd2FpdHBpZF9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotb3Nfd2FpdHBpZF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2ludHB0cl90IHBpZCwgaW50IG9wdGlvbnMpOworb3Nfd2FpdHBpZF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludHB0cl90IHBpZCwgaW50IG9wdGlvbnMpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogb3Nfd2FpdHBpZChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBQeV9pbnRwdHJfdCBwaWQ7CisgICAgaW50cHRyX3QgcGlkOwogICAgIGludCBvcHRpb25zOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIF9QeV9QQVJTRV9JTlRQVFIgImk6d2FpdHBpZCIsCi0gICAgICAgICZwaWQsICZvcHRpb25zKSkKKyAgICAgICAgJnBpZCwgJm9wdGlvbnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfd2FpdHBpZF9pbXBsKG1vZHVsZSwgcGlkLCBvcHRpb25zKTsKIAogZXhpdDoKQEAgLTI5NzcsMTUgKzMwODYsMTcgQEAKIG9zX3N5bWxpbmsoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzcmMiLCAiZHN0IiwgInRhcmdldF9pc19kaXJlY3RvcnkiLCAiZGlyX2ZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3JjIiwgImRzdCIsICJ0YXJnZXRfaXNfZGlyZWN0b3J5IiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mTyZ8cCRPJjpzeW1saW5rIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3Qgc3JjID0gUEFUSF9UX0lOSVRJQUxJWkUoInN5bWxpbmsiLCAic3JjIiwgMCwgMCk7CiAgICAgcGF0aF90IGRzdCA9IFBBVEhfVF9JTklUSUFMSVpFKCJzeW1saW5rIiwgImRzdCIsIDAsIDApOwogICAgIGludCB0YXJnZXRfaXNfZGlyZWN0b3J5ID0gMDsKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mfHAkTyY6c3ltbGluayIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCAmdGFyZ2V0X2lzX2RpcmVjdG9yeSwgU1lNTElOS0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCAmdGFyZ2V0X2lzX2RpcmVjdG9yeSwgU1lNTElOS0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc3ltbGlua19pbXBsKG1vZHVsZSwgJnNyYywgJmRzdCwgdGFyZ2V0X2lzX2RpcmVjdG9yeSwgZGlyX2ZkKTsKIAogZXhpdDoKQEAgLTMwNDUsOCArMzE1Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgcGlkX3QgcGlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9QSUQgIjpnZXRzaWQiLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOmdldHNpZCIsICZwaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZ2V0c2lkX2ltcGwobW9kdWxlLCBwaWQpOwogCiBleGl0OgpAQCAtMzA5OSw4ICszMjExLDkgQEAKICAgICBwaWRfdCBwZ3JwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIF9QeV9QQVJTRV9QSUQgIiIgX1B5X1BBUlNFX1BJRCAiOnNldHBnaWQiLAotICAgICAgICAmcGlkLCAmcGdycCkpCisgICAgICAgICZwaWQsICZwZ3JwKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NldHBnaWRfaW1wbChtb2R1bGUsIHBpZCwgcGdycCk7CiAKIGV4aXQ6CkBAIC0zMTI5LDggKzMyNDIsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBmZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTp0Y2dldHBncnAiLCAmZmQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTp0Y2dldHBncnAiLCAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdGNnZXRwZ3JwX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC0zMTYxLDggKzMyNzUsOSBAQAogICAgIHBpZF90IHBnaWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiIF9QeV9QQVJTRV9QSUQgIjp0Y3NldHBncnAiLAotICAgICAgICAmZmQsICZwZ2lkKSkKKyAgICAgICAgJmZkLCAmcGdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc190Y3NldHBncnBfaW1wbChtb2R1bGUsIGZkLCBwZ2lkKTsKIAogZXhpdDoKQEAgLTMxOTIsMTkgKzMzMDcsMjIgQEAKIG9zX29wZW4oUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImZsYWdzIiwgIm1vZGUiLCAiZGlyX2ZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJmbGFncyIsICJtb2RlIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8maXxpJE8mOm9wZW4iLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoIm9wZW4iLCAicGF0aCIsIDAsIDApOwogICAgIGludCBmbGFnczsKICAgICBpbnQgbW9kZSA9IDUxMTsKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJml8aSRPJjpvcGVuIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmbGFncywgJm1vZGUsIE9QRU5BVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmZsYWdzLCAmbW9kZSwgT1BFTkFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX29wZW5faW1wbChtb2R1bGUsICZwYXRoLCBmbGFncywgbW9kZSwgZGlyX2ZkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzIzMCwxMiArMzM0OCwxNCBAQAogb3NfY2xvc2UoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJmZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpjbG9zZSIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IGZkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaTpjbG9zZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jbG9zZV9pbXBsKG1vZHVsZSwgZmQpOwogCiBleGl0OgpAQCAtMzI2Miw4ICszMzgyLDkgQEAKICAgICBpbnQgZmRfaGlnaDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6Y2xvc2VyYW5nZSIsCi0gICAgICAgICZmZF9sb3csICZmZF9oaWdoKSkKKyAgICAgICAgJmZkX2xvdywgJmZkX2hpZ2gpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfY2xvc2VyYW5nZV9pbXBsKG1vZHVsZSwgZmRfbG93LCBmZF9oaWdoKTsKIAogZXhpdDoKQEAgLTMyODksMTEgKzM0MTAsMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6ZHVwIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6ZHVwIiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19kdXBfaW1wbChtb2R1bGUsIGZkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzMxNiwxNCArMzQzOSwxNiBAQAogb3NfZHVwMihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImZkIiwgImZkMiIsICJpbmhlcml0YWJsZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZkIiwgImZkMiIsICJpbmhlcml0YWJsZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7ImlpfHA6ZHVwMiIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IGZkOwogICAgIGludCBmZDI7CiAgICAgaW50IGluaGVyaXRhYmxlID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImlpfHA6ZHVwMiIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZkLCAmZmQyLCAmaW5oZXJpdGFibGUpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmZkLCAmZmQyLCAmaW5oZXJpdGFibGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZHVwMl9pbXBsKG1vZHVsZSwgZmQsIGZkMiwgaW5oZXJpdGFibGUpOwogCiBleGl0OgpAQCAtMzM2MCw4ICszNDg1LDkgQEAKICAgICBQeV9vZmZfdCBsZW5ndGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpTyY6bG9ja2YiLAotICAgICAgICAmZmQsICZjb21tYW5kLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZsZW5ndGgpKQorICAgICAgICAmZmQsICZjb21tYW5kLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZsZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbG9ja2ZfaW1wbChtb2R1bGUsIGZkLCBjb21tYW5kLCBsZW5ndGgpOwogCiBleGl0OgpAQCAtMzM5NSwxMSArMzUyMSwxMyBAQAogICAgIFB5X29mZl90IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJmk6bHNlZWsiLAotICAgICAgICAmZmQsIFB5X29mZl90X2NvbnZlcnRlciwgJnBvc2l0aW9uLCAmaG93KSkKKyAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZwb3NpdGlvbiwgJmhvdykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfbHNlZWtfaW1wbChtb2R1bGUsIGZkLCBwb3NpdGlvbiwgaG93KTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21QeV9vZmZfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM0MjYsOCArMzU1NCw5IEBACiAgICAgUHlfc3NpemVfdCBsZW5ndGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImluOnJlYWQiLAotICAgICAgICAmZmQsICZsZW5ndGgpKQorICAgICAgICAmZmQsICZsZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcmVhZF9pbXBsKG1vZHVsZSwgZmQsIGxlbmd0aCk7CiAKIGV4aXQ6CkBAIC0zNDY1LDExICszNTk0LDEzIEBACiAgICAgUHlfc3NpemVfdCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpyZWFkdiIsCi0gICAgICAgICZmZCwgJmJ1ZmZlcnMpKQorICAgICAgICAmZmQsICZidWZmZXJzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19yZWFkdl9pbXBsKG1vZHVsZSwgZmQsIGJ1ZmZlcnMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zNTA0LDggKzM2MzUsOSBAQAogICAgIFB5X29mZl90IG9mZnNldDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlPJjpwcmVhZCIsCi0gICAgICAgICZmZCwgJmxlbmd0aCwgUHlfb2ZmX3RfY29udmVydGVyLCAmb2Zmc2V0KSkKKyAgICAgICAgJmZkLCAmbGVuZ3RoLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZvZmZzZXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcHJlYWRfaW1wbChtb2R1bGUsIGZkLCBsZW5ndGgsIG9mZnNldCk7CiAKIGV4aXQ6CkBAIC0zNTM1LDE3ICszNjY3LDIwIEBACiAgICAgUHlfc3NpemVfdCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpeSo6d3JpdGUiLAotICAgICAgICAmZmQsICZkYXRhKSkKKyAgICAgICAgJmZkLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3Nfd3JpdGVfaW1wbChtb2R1bGUsIGZkLCAmZGF0YSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zNTY5LDEyICszNzA0LDE0IEBACiBvc19mc3RhdChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpOmZzdGF0IiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQgZmQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOmZzdGF0IiwgX2tleXdvcmRzLAotICAgICAgICAmZmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2ZzdGF0X2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC0zNjAzLDExICszNzQwLDEzIEBACiAgICAgaW50IGZkOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmlzYXR0eSIsICZmZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmlzYXR0eSIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfaXNhdHR5X2ltcGwobW9kdWxlLCBmZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM2NjUsOCArMzgwNCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGZsYWdzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnBpcGUyIiwgJmZsYWdzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6cGlwZTIiLCAmZmxhZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcGlwZTJfaW1wbChtb2R1bGUsIGZsYWdzKTsKIAogZXhpdDoKQEAgLTM3MDEsMTEgKzM4NDEsMTMgQEAKICAgICBQeV9zc2l6ZV90IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOndyaXRldiIsCi0gICAgICAgICZmZCwgJmJ1ZmZlcnMpKQorICAgICAgICAmZmQsICZidWZmZXJzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc193cml0ZXZfaW1wbChtb2R1bGUsIGZkLCBidWZmZXJzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzc0MiwxNyArMzg4NCwyMCBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXkqTyY6cHdyaXRlIiwKLSAgICAgICAgJmZkLCAmYnVmZmVyLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZvZmZzZXQpKQorICAgICAgICAmZmQsICZidWZmZXIsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfcHdyaXRlX2ltcGwobW9kdWxlLCBmZCwgJmJ1ZmZlciwgb2Zmc2V0KTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzc4MiwxNCArMzkyNywxNiBAQAogb3NfbWtmaWZvKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJtb2RlIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAibW9kZSIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJnxpJE8mOm1rZmlmbyIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgibWtmaWZvIiwgInBhdGgiLCAwLCAwKTsKICAgICBpbnQgbW9kZSA9IDQzODsKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnxpJE8mOm1rZmlmbyIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmbW9kZSwgTUtGSUZPQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBNS0ZJRk9BVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX21rZmlmb19pbXBsKG1vZHVsZSwgJnBhdGgsIG1vZGUsIGRpcl9mZCk7CiAKIGV4aXQ6CkBAIC0zODMyLDE1ICszOTc5LDE3IEBACiBvc19ta25vZChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAibW9kZSIsICJkZXZpY2UiLCAiZGlyX2ZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJtb2RlIiwgImRldmljZSIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJnxpTyYkTyY6bWtub2QiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoIm1rbm9kIiwgInBhdGgiLCAwLCAwKTsKICAgICBpbnQgbW9kZSA9IDM4NDsKICAgICBkZXZfdCBkZXZpY2UgPSAwOwogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mfGlPJiRPJjpta25vZCIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmbW9kZSwgX1B5X0Rldl9Db252ZXJ0ZXIsICZkZXZpY2UsIE1LTk9EQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBfUHlfRGV2X0NvbnZlcnRlciwgJmRldmljZSwgTUtOT0RBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX21rbm9kX2ltcGwobW9kdWxlLCAmcGF0aCwgbW9kZSwgZGV2aWNlLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMzg3MywxMSArNDAyMiwxMyBAQAogICAgIGRldl90IGRldmljZTsKICAgICB1bnNpZ25lZCBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6bWFqb3IiLCBfUHlfRGV2X0NvbnZlcnRlciwgJmRldmljZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjptYWpvciIsIF9QeV9EZXZfQ29udmVydGVyLCAmZGV2aWNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19tYWpvcl9pbXBsKG1vZHVsZSwgZGV2aWNlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzkwNywxMSArNDA1OCwxMyBAQAogICAgIGRldl90IGRldmljZTsKICAgICB1bnNpZ25lZCBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6bWlub3IiLCBfUHlfRGV2X0NvbnZlcnRlciwgJmRldmljZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjptaW5vciIsIF9QeV9EZXZfQ29udmVydGVyLCAmZGV2aWNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19taW5vcl9pbXBsKG1vZHVsZSwgZGV2aWNlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzk0MywxMSArNDA5NiwxMyBAQAogICAgIGRldl90IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOm1ha2VkZXYiLAotICAgICAgICAmbWFqb3IsICZtaW5vcikpCisgICAgICAgICZtYWpvciwgJm1pbm9yKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19tYWtlZGV2X2ltcGwobW9kdWxlLCBtYWpvciwgbWlub3IpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAoZGV2X3QpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IChkZXZfdCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9QeUxvbmdfRnJvbURldihfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM5NzgsOCArNDEzMyw5IEBACiAgICAgUHlfb2ZmX3QgbGVuZ3RoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyY6ZnRydW5jYXRlIiwKLSAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZsZW5ndGgpKQorICAgICAgICAmZmQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mdHJ1bmNhdGVfaW1wbChtb2R1bGUsIGZkLCBsZW5ndGgpOwogCiBleGl0OgpAQCAtNDAwOSwxMyArNDE2NSwxNSBAQAogb3NfdHJ1bmNhdGUoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImxlbmd0aCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAibGVuZ3RoIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZPJjp0cnVuY2F0ZSIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgidHJ1bmNhdGUiLCAicGF0aCIsIDAsIFBBVEhfSEFWRV9GVFJVTkNBVEUpOwogICAgIFB5X29mZl90IGxlbmd0aDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyY6dHJ1bmNhdGUiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3RydW5jYXRlX2ltcGwobW9kdWxlLCAmcGF0aCwgbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTQwNTQsOCArNDIxMiw5IEBACiAgICAgUHlfb2ZmX3QgbGVuZ3RoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyZPJjpwb3NpeF9mYWxsb2NhdGUiLAotICAgICAgICAmZmQsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkKKyAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZvZmZzZXQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19wb3NpeF9mYWxsb2NhdGVfaW1wbChtb2R1bGUsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAKIGV4aXQ6CkBAIC00MDk3LDggKzQyNTYsOSBAQAogICAgIGludCBhZHZpY2U7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJk8maTpwb3NpeF9mYWR2aXNlIiwKLSAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZvZmZzZXQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCwgJmFkdmljZSkpCisgICAgICAgICZmZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmb2Zmc2V0LCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZsZW5ndGgsICZhZHZpY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcG9zaXhfZmFkdmlzZV9pbXBsKG1vZHVsZSwgZmQsIG9mZnNldCwgbGVuZ3RoLCBhZHZpY2UpOwogCiBleGl0OgpAQCAtNDEyOSw4ICs0Mjg5LDkgQEAKICAgICBQeU9iamVjdCAqdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlVVOnB1dGVudiIsCi0gICAgICAgICZuYW1lLCAmdmFsdWUpKQorICAgICAgICAmbmFtZSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3B1dGVudl9pbXBsKG1vZHVsZSwgbmFtZSwgdmFsdWUpOwogCiBleGl0OgpAQCAtNDE2MSw4ICs0MzIyLDkgQEAKICAgICBQeU9iamVjdCAqdmFsdWUgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mOnB1dGVudiIsCi0gICAgICAgIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJm5hbWUsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnZhbHVlKSkKKyAgICAgICAgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmbmFtZSwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcHV0ZW52X2ltcGwobW9kdWxlLCBuYW1lLCB2YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MTk2LDggKzQzNTgsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpuYW1lID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6dW5zZXRlbnYiLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnVuc2V0ZW52IiwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc191bnNldGVudl9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC00MjI3LDggKzQzOTAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBjb2RlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnN0cmVycm9yIiwgJmNvZGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpzdHJlcnJvciIsICZjb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3N0cmVycm9yX2ltcGwobW9kdWxlLCBjb2RlKTsKIAogZXhpdDoKQEAgLTQyNTYsMTEgKzQ0MjAsMTMgQEAKICAgICBpbnQgc3RhdHVzOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOldDT1JFRFVNUCIsICZzdGF0dXMpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpXQ09SRURVTVAiLCAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19XQ09SRURVTVBfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQyOTAsMTYgKzQ0NTYsMTkgQEAKIG9zX1dJRkNPTlRJTlVFRChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0YXR1cyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0YXR1cyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Imk6V0lGQ09OVElOVUVEIiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQgc3RhdHVzOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaTpXSUZDT05USU5VRUQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0lGQ09OVElOVUVEX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MzI2LDE2ICs0NDk1LDE5IEBACiBvc19XSUZTVE9QUEVEKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpXSUZTVE9QUEVEIiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQgc3RhdHVzOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaTpXSUZTVE9QUEVEIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdGF0dXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX1dJRlNUT1BQRURfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQzNjIsMTYgKzQ1MzQsMTkgQEAKIG9zX1dJRlNJR05BTEVEKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpXSUZTSUdOQUxFRCIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHN0YXR1czsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6V0lGU0lHTkFMRUQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0lGU0lHTkFMRURfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQzOTgsMTYgKzQ1NzMsMTkgQEAKIG9zX1dJRkVYSVRFRChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0YXR1cyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0YXR1cyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Imk6V0lGRVhJVEVEIiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQgc3RhdHVzOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaTpXSUZFWElURUQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0lGRVhJVEVEX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00NDM0LDE2ICs0NjEyLDE5IEBACiBvc19XRVhJVFNUQVRVUyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0YXR1cyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0YXR1cyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Imk6V0VYSVRTVEFUVVMiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBzdGF0dXM7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldFWElUU1RBVFVTIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdGF0dXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX1dFWElUU1RBVFVTX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00NDcwLDE2ICs0NjUxLDE5IEBACiBvc19XVEVSTVNJRyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0YXR1cyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0YXR1cyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Imk6V1RFUk1TSUciLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBzdGF0dXM7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldURVJNU0lHIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdGF0dXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX1dURVJNU0lHX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00NTA2LDE2ICs0NjkwLDE5IEBACiBvc19XU1RPUFNJRyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0YXR1cyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0YXR1cyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Imk6V1NUT1BTSUciLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBzdGF0dXM7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldTVE9QU0lHIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdGF0dXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX1dTVE9QU0lHX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00NTQ2LDggKzQ3MzMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBmZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpmc3RhdHZmcyIsICZmZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmZzdGF0dmZzIiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2ZzdGF0dmZzX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC00NTc4LDEyICs0NzY2LDE0IEBACiBvc19zdGF0dmZzKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJjpzdGF0dmZzIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJzdGF0dmZzIiwgInBhdGgiLCAwLCBQQVRIX0hBVkVfRlNUQVRWRlMpOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyY6c3RhdHZmcyIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zdGF0dmZzX2ltcGwobW9kdWxlLCAmcGF0aCk7CiAKIGV4aXQ6CkBAIC00NjEzLDEyICs0ODAzLDE0IEBACiBvc19fZ2V0ZGlza3VzYWdlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ1Ol9nZXRkaXNrdXNhZ2UiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5X1VOSUNPREUgKnBhdGg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ1Ol9nZXRkaXNrdXNhZ2UiLCBfa2V5d29yZHMsCi0gICAgICAgICZwYXRoKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX19nZXRkaXNrdXNhZ2VfaW1wbChtb2R1bGUsIHBhdGgpOwogCiBleGl0OgpAQCAtNDY1MiwxMSArNDg0NCwxMyBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU8mOmZwYXRoY29uZiIsCi0gICAgICAgICZmZCwgY29udl9wYXRoX2NvbmZuYW1lLCAmbmFtZSkpCisgICAgICAgICZmZCwgY29udl9wYXRoX2NvbmZuYW1lLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfZnBhdGhjb25mX2ltcGwobW9kdWxlLCBmZCwgbmFtZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ2ODcsMTcgKzQ4ODEsMjAgQEAKIG9zX3BhdGhjb25mKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJuYW1lIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJuYW1lIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZPJjpwYXRoY29uZiIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgicGF0aGNvbmYiLCAicGF0aCIsIDAsIFBBVEhfSEFWRV9GUEFUSENPTkYpOwogICAgIGludCBuYW1lOwogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyY6cGF0aGNvbmYiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgY29udl9wYXRoX2NvbmZuYW1lLCAmbmFtZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIGNvbnZfcGF0aF9jb25mbmFtZSwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3BhdGhjb25mX2ltcGwobW9kdWxlLCAmcGF0aCwgbmFtZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ3MjksOCArNDkyNiw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmNvbmZzdHIiLCBjb252X2NvbmZzdHJfY29uZm5hbWUsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmNvbmZzdHIiLCBjb252X2NvbmZzdHJfY29uZm5hbWUsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2NvbmZzdHJfaW1wbChtb2R1bGUsIG5hbWUpOwogCiBleGl0OgpAQCAtNDc2MCwxMSArNDk1OCwxMyBAQAogICAgIGludCBuYW1lOwogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c3lzY29uZiIsIGNvbnZfc3lzY29uZl9jb25mbmFtZSwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c3lzY29uZiIsIGNvbnZfc3lzY29uZl9jb25mbmFtZSwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3N5c2NvbmZfaW1wbChtb2R1bGUsIG5hbWUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00Nzk0LDYgKzQ5OTQsNjAgQEAKICAgICByZXR1cm4gb3NfYWJvcnRfaW1wbChtb2R1bGUpOwogfQogCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKQorCitQeURvY19TVFJWQVIob3Nfc3RhcnRmaWxlX19kb2NfXywKKyJzdGFydGZpbGUoJG1vZHVsZSwgLywgZmlsZXBhdGgsIG9wZXJhdGlvbj1Ob25lKVxuIgorIi0tXG4iCisiXG4iCisic3RhcnRmaWxlKGZpbGVwYXRoIFssIG9wZXJhdGlvbl0pXG4iCisiXG4iCisiU3RhcnQgYSBmaWxlIHdpdGggaXRzIGFzc29jaWF0ZWQgYXBwbGljYXRpb24uXG4iCisiXG4iCisiV2hlbiBcIm9wZXJhdGlvblwiIGlzIG5vdCBzcGVjaWZpZWQgb3IgXCJvcGVuXCIsIHRoaXMgYWN0cyBsaWtlXG4iCisiZG91YmxlLWNsaWNraW5nIHRoZSBmaWxlIGluIEV4cGxvcmVyLCBvciBnaXZpbmcgdGhlIGZpbGUgbmFtZSBhcyBhblxuIgorImFyZ3VtZW50IHRvIHRoZSBET1MgXCJzdGFydFwiIGNvbW1hbmQ6IHRoZSBmaWxlIGlzIG9wZW5lZCB3aXRoIHdoYXRldmVyXG4iCisiYXBwbGljYXRpb24gKGlmIGFueSkgaXRzIGV4dGVuc2lvbiBpcyBhc3NvY2lhdGVkLlxuIgorIldoZW4gYW5vdGhlciBcIm9wZXJhdGlvblwiIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgd2hhdCBzaG91bGQgYmUgZG9uZSB3aXRoXG4iCisidGhlIGZpbGUuICBBIHR5cGljYWwgb3BlcmF0aW9uIGlzIFwicHJpbnRcIi5cbiIKKyJcbiIKKyJzdGFydGZpbGUgcmV0dXJucyBhcyBzb29uIGFzIHRoZSBhc3NvY2lhdGVkIGFwcGxpY2F0aW9uIGlzIGxhdW5jaGVkLlxuIgorIlRoZXJlIGlzIG5vIG9wdGlvbiB0byB3YWl0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gY2xvc2UsIGFuZCBubyB3YXlcbiIKKyJ0byByZXRyaWV2ZSB0aGUgYXBwbGljYXRpb25cJ3MgZXhpdCBzdGF0dXMuXG4iCisiXG4iCisiVGhlIGZpbGVwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIElmIHlvdSB3YW50IHRvIHVzZVxuIgorImFuIGFic29sdXRlIHBhdGgsIG1ha2Ugc3VyZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIG5vdCBhIHNsYXNoIChcIi9cIik7XG4iCisidGhlIHVuZGVybHlpbmcgV2luMzIgU2hlbGxFeGVjdXRlIGZ1bmN0aW9uIGRvZXNuXCd0IHdvcmsgaWYgaXQgaXMuIik7CisKKyNkZWZpbmUgT1NfU1RBUlRGSUxFX01FVEhPRERFRiAgICBcCisgICAgeyJzdGFydGZpbGUiLCAoUHlDRnVuY3Rpb24pb3Nfc3RhcnRmaWxlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgb3Nfc3RhcnRmaWxlX19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitvc19zdGFydGZpbGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBwYXRoX3QgKmZpbGVwYXRoLCBQeV9VTklDT0RFICpvcGVyYXRpb24pOworCitzdGF0aWMgUHlPYmplY3QgKgorb3Nfc3RhcnRmaWxlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmlsZXBhdGgiLCAib3BlcmF0aW9uIiwgTlVMTH07CisgICAgcGF0aF90IGZpbGVwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInN0YXJ0ZmlsZSIsICJmaWxlcGF0aCIsIDAsIDApOworICAgIFB5X1VOSUNPREUgKm9wZXJhdGlvbiA9IE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnx1OnN0YXJ0ZmlsZSIsIF9rZXl3b3JkcywKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZmaWxlcGF0aCwgJm9wZXJhdGlvbikpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBvc19zdGFydGZpbGVfaW1wbChtb2R1bGUsICZmaWxlcGF0aCwgb3BlcmF0aW9uKTsKKworZXhpdDoKKyAgICAvKiBDbGVhbnVwIGZvciBmaWxlcGF0aCAqLworICAgIHBhdGhfY2xlYW51cCgmZmlsZXBhdGgpOworCisgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoTVNfV0lORE9XUykgKi8KKwogI2lmIGRlZmluZWQoSEFWRV9HRVRMT0FEQVZHKQogCiBQeURvY19TVFJWQVIob3NfZ2V0bG9hZGF2Z19fZG9jX18sCkBAIC00ODM5LDEyICs1MDkzLDE0IEBACiBvc19kZXZpY2VfZW5jb2RpbmcoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJmZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpkZXZpY2VfZW5jb2RpbmciLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBmZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6ZGV2aWNlX2VuY29kaW5nIiwgX2tleXdvcmRzLAotICAgICAgICAmZmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2RldmljZV9lbmNvZGluZ19pbXBsKG1vZHVsZSwgZmQpOwogCiBleGl0OgpAQCAtNDg3NCw4ICs1MTMwLDkgQEAKICAgICB1aWRfdCBzdWlkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyY6c2V0cmVzdWlkIiwKLSAgICAgICAgX1B5X1VpZF9Db252ZXJ0ZXIsICZydWlkLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQsIF9QeV9VaWRfQ29udmVydGVyLCAmc3VpZCkpCisgICAgICAgIF9QeV9VaWRfQ29udmVydGVyLCAmcnVpZCwgX1B5X1VpZF9Db252ZXJ0ZXIsICZldWlkLCBfUHlfVWlkX0NvbnZlcnRlciwgJnN1aWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0cmVzdWlkX2ltcGwobW9kdWxlLCBydWlkLCBldWlkLCBzdWlkKTsKIAogZXhpdDoKQEAgLTQ5MDcsOCArNTE2NCw5IEBACiAgICAgZ2lkX3Qgc2dpZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJk8mOnNldHJlc2dpZCIsCi0gICAgICAgIF9QeV9HaWRfQ29udmVydGVyLCAmcmdpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZlZ2lkLCBfUHlfR2lkX0NvbnZlcnRlciwgJnNnaWQpKQorICAgICAgICBfUHlfR2lkX0NvbnZlcnRlciwgJnJnaWQsIF9QeV9HaWRfQ29udmVydGVyLCAmZWdpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZzZ2lkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NldHJlc2dpZF9pbXBsKG1vZHVsZSwgcmdpZCwgZWdpZCwgc2dpZCk7CiAKIGV4aXQ6CkBAIC00OTg1LDE0ICs1MjQzLDE2IEBACiBvc19nZXR4YXR0cihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAiYXR0cmlidXRlIiwgImZvbGxvd19zeW1saW5rcyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAiYXR0cmlidXRlIiwgImZvbGxvd19zeW1saW5rcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mTyZ8JHA6Z2V0eGF0dHIiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImdldHhhdHRyIiwgInBhdGgiLCAwLCAxKTsKICAgICBwYXRoX3QgYXR0cmlidXRlID0gUEFUSF9UX0lOSVRJQUxJWkUoImdldHhhdHRyIiwgImF0dHJpYnV0ZSIsIDAsIDApOwogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZPJnwkcDpnZXR4YXR0ciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBwYXRoX2NvbnZlcnRlciwgJmF0dHJpYnV0ZSwgJmZvbGxvd19zeW1saW5rcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIHBhdGhfY29udmVydGVyLCAmYXR0cmlidXRlLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2dldHhhdHRyX2ltcGwobW9kdWxlLCAmcGF0aCwgJmF0dHJpYnV0ZSwgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTUwMzEsMTYgKzUyOTEsMTggQEAKIG9zX3NldHhhdHRyKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJhdHRyaWJ1dGUiLCAidmFsdWUiLCAiZmxhZ3MiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJhdHRyaWJ1dGUiLCAidmFsdWUiLCAiZmxhZ3MiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZPJnkqfGkkcDpzZXR4YXR0ciIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgic2V0eGF0dHIiLCAicGF0aCIsIDAsIDEpOwogICAgIHBhdGhfdCBhdHRyaWJ1dGUgPSBQQVRIX1RfSU5JVElBTElaRSgic2V0eGF0dHIiLCAiYXR0cmlidXRlIiwgMCwgMCk7CiAgICAgUHlfYnVmZmVyIHZhbHVlID0ge05VTEwsIE5VTEx9OwogICAgIGludCBmbGFncyA9IDA7CiAgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8meSp8aSRwOnNldHhhdHRyIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIHBhdGhfY29udmVydGVyLCAmYXR0cmlidXRlLCAmdmFsdWUsICZmbGFncywgJmZvbGxvd19zeW1saW5rcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIHBhdGhfY29udmVydGVyLCAmYXR0cmlidXRlLCAmdmFsdWUsICZmbGFncywgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXR4YXR0cl9pbXBsKG1vZHVsZSwgJnBhdGgsICZhdHRyaWJ1dGUsICZ2YWx1ZSwgZmxhZ3MsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC01MDQ5LDggKzUzMTEsOSBAQAogICAgIC8qIENsZWFudXAgZm9yIGF0dHJpYnV0ZSAqLwogICAgIHBhdGhfY2xlYW51cCgmYXR0cmlidXRlKTsKICAgICAvKiBDbGVhbnVwIGZvciB2YWx1ZSAqLwotICAgIGlmICh2YWx1ZS5vYmopCisgICAgaWYgKHZhbHVlLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZhbHVlKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTA4MSwxNCArNTM0NCwxNiBAQAogb3NfcmVtb3ZleGF0dHIoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImF0dHJpYnV0ZSIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImF0dHJpYnV0ZSIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJk8mfCRwOnJlbW92ZXhhdHRyIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJyZW1vdmV4YXR0ciIsICJwYXRoIiwgMCwgMSk7CiAgICAgcGF0aF90IGF0dHJpYnV0ZSA9IFBBVEhfVF9JTklUSUFMSVpFKCJyZW1vdmV4YXR0ciIsICJhdHRyaWJ1dGUiLCAwLCAwKTsKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8JHA6cmVtb3ZleGF0dHIiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgcGF0aF9jb252ZXJ0ZXIsICZhdHRyaWJ1dGUsICZmb2xsb3dfc3ltbGlua3MpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBwYXRoX2NvbnZlcnRlciwgJmF0dHJpYnV0ZSwgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19yZW1vdmV4YXR0cl9pbXBsKG1vZHVsZSwgJnBhdGgsICZhdHRyaWJ1dGUsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC01MTI2LDEzICs1MzkxLDE1IEBACiBvc19saXN0eGF0dHIoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImZvbGxvd19zeW1saW5rcyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE8mJHA6bGlzdHhhdHRyIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJsaXN0eGF0dHIiLCAicGF0aCIsIDEsIDEpOwogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE8mJHA6bGlzdHhhdHRyIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmb2xsb3dfc3ltbGlua3MpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xpc3R4YXR0cl9pbXBsKG1vZHVsZSwgJnBhdGgsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC01MTYyLDggKzU0MjksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAibjp1cmFuZG9tIiwgJnNpemUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAibjp1cmFuZG9tIiwgJnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdXJhbmRvbV9pbXBsKG1vZHVsZSwgc2l6ZSk7CiAKIGV4aXQ6CkBAIC01MTc0LDcgKzU0NDIsMTEgQEAKICJjcHVfY291bnQoJG1vZHVsZSwgLylcbiIKICItLVxuIgogIlxuIgotIlJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbTsgcmV0dXJuIE5vbmUgaWYgaW5kZXRlcm1pbmFibGUuIik7CisiUmV0dXJuIHRoZSBudW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtOyByZXR1cm4gTm9uZSBpZiBpbmRldGVybWluYWJsZS5cbiIKKyJcbiIKKyJUaGlzIG51bWJlciBpcyBub3QgZXF1aXZhbGVudCB0byB0aGUgbnVtYmVyIG9mIENQVXMgdGhlIGN1cnJlbnQgcHJvY2VzcyBjYW5cbiIKKyJ1c2UuICBUaGUgbnVtYmVyIG9mIHVzYWJsZSBDUFVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoXG4iCisiYGBsZW4ob3Muc2NoZWRfZ2V0YWZmaW5pdHkoMCkpYGAiKTsKIAogI2RlZmluZSBPU19DUFVfQ09VTlRfTUVUSE9EREVGICAgIFwKICAgICB7ImNwdV9jb3VudCIsIChQeUNGdW5jdGlvbilvc19jcHVfY291bnQsIE1FVEhfTk9BUkdTLCBvc19jcHVfY291bnRfX2RvY19ffSwKQEAgLTUyMDcsMTEgKzU0NzksMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6Z2V0X2luaGVyaXRhYmxlIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6Z2V0X2luaGVyaXRhYmxlIiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19nZXRfaW5oZXJpdGFibGVfaW1wbChtb2R1bGUsIGZkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNTIzOCw4ICs1NTEyLDkgQEAKICAgICBpbnQgaW5oZXJpdGFibGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOnNldF9pbmhlcml0YWJsZSIsCi0gICAgICAgICZmZCwgJmluaGVyaXRhYmxlKSkKKyAgICAgICAgJmZkLCAmaW5oZXJpdGFibGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0X2luaGVyaXRhYmxlX2ltcGwobW9kdWxlLCBmZCwgaW5oZXJpdGFibGUpOwogCiBleGl0OgpAQCAtNTI1OCwyMCArNTUzMywyMiBAQAogICAgIHsiZ2V0X2hhbmRsZV9pbmhlcml0YWJsZSIsIChQeUNGdW5jdGlvbilvc19nZXRfaGFuZGxlX2luaGVyaXRhYmxlLCBNRVRIX08sIG9zX2dldF9oYW5kbGVfaW5oZXJpdGFibGVfX2RvY19ffSwKIAogc3RhdGljIGludAotb3NfZ2V0X2hhbmRsZV9pbmhlcml0YWJsZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2ludHB0cl90IGhhbmRsZSk7Citvc19nZXRfaGFuZGxlX2luaGVyaXRhYmxlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50cHRyX3QgaGFuZGxlKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG9zX2dldF9oYW5kbGVfaW5oZXJpdGFibGUoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBQeV9pbnRwdHJfdCBoYW5kbGU7CisgICAgaW50cHRyX3QgaGFuZGxlOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9JTlRQVFIgIjpnZXRfaGFuZGxlX2luaGVyaXRhYmxlIiwgJmhhbmRsZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9JTlRQVFIgIjpnZXRfaGFuZGxlX2luaGVyaXRhYmxlIiwgJmhhbmRsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfZ2V0X2hhbmRsZV9pbmhlcml0YWJsZV9pbXBsKG1vZHVsZSwgaGFuZGxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNTI5MiwxOSArNTU2OSwyMCBAQAogICAgIHsic2V0X2hhbmRsZV9pbmhlcml0YWJsZSIsIChQeUNGdW5jdGlvbilvc19zZXRfaGFuZGxlX2luaGVyaXRhYmxlLCBNRVRIX1ZBUkFSR1MsIG9zX3NldF9oYW5kbGVfaW5oZXJpdGFibGVfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLW9zX3NldF9oYW5kbGVfaW5oZXJpdGFibGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9pbnRwdHJfdCBoYW5kbGUsCitvc19zZXRfaGFuZGxlX2luaGVyaXRhYmxlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50cHRyX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmhlcml0YWJsZSk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvc19zZXRfaGFuZGxlX2luaGVyaXRhYmxlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIFB5X2ludHB0cl90IGhhbmRsZTsKKyAgICBpbnRwdHJfdCBoYW5kbGU7CiAgICAgaW50IGluaGVyaXRhYmxlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIF9QeV9QQVJTRV9JTlRQVFIgInA6c2V0X2hhbmRsZV9pbmhlcml0YWJsZSIsCi0gICAgICAgICZoYW5kbGUsICZpbmhlcml0YWJsZSkpCisgICAgICAgICZoYW5kbGUsICZpbmhlcml0YWJsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRfaGFuZGxlX2luaGVyaXRhYmxlX2ltcGwobW9kdWxlLCBoYW5kbGUsIGluaGVyaXRhYmxlKTsKIAogZXhpdDoKQEAgLTUzMTMsNiArNTU5MSw3NSBAQAogCiAjZW5kaWYgLyogZGVmaW5lZChNU19XSU5ET1dTKSAqLwogCitQeURvY19TVFJWQVIob3NfZnNwYXRoX19kb2NfXywKKyJmc3BhdGgoJG1vZHVsZSwgLywgcGF0aClcbiIKKyItLVxuIgorIlxuIgorIlJldHVybiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LlxuIgorIlxuIgorIklmIHRoZSBvYmplY3QgaXMgc3RyIG9yIGJ5dGVzLCB0aGVuIGFsbG93IGl0IHRvIHBhc3MgdGhyb3VnaCBhcy1pcy4gSWYgdGhlXG4iCisib2JqZWN0IGRlZmluZXMgX19mc3BhdGhfXygpLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoYXQgbWV0aG9kLiBBbGwgb3RoZXJcbiIKKyJ0eXBlcyByYWlzZSBhIFR5cGVFcnJvci4iKTsKKworI2RlZmluZSBPU19GU1BBVEhfTUVUSE9EREVGICAgIFwKKyAgICB7ImZzcGF0aCIsIChQeUNGdW5jdGlvbilvc19mc3BhdGgsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBvc19mc3BhdGhfX2RvY19ffSwKKworc3RhdGljIFB5T2JqZWN0ICoKK29zX2ZzcGF0aF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpwYXRoKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK29zX2ZzcGF0aChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKyAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTzpmc3BhdGgiLCBfa2V5d29yZHMsIDB9OworICAgIFB5T2JqZWN0ICpwYXRoOworCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmcGF0aCkpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBvc19mc3BhdGhfaW1wbChtb2R1bGUsIHBhdGgpOworCitleGl0OgorICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKKyNpZiBkZWZpbmVkKEhBVkVfR0VUUkFORE9NX1NZU0NBTEwpCisKK1B5RG9jX1NUUlZBUihvc19nZXRyYW5kb21fX2RvY19fLAorImdldHJhbmRvbSgkbW9kdWxlLCAvLCBzaXplLCBmbGFncz0wKVxuIgorIi0tXG4iCisiXG4iCisiT2J0YWluIGEgc2VyaWVzIG9mIHJhbmRvbSBieXRlcy4iKTsKKworI2RlZmluZSBPU19HRVRSQU5ET01fTUVUSE9EREVGICAgIFwKKyAgICB7ImdldHJhbmRvbSIsIChQeUNGdW5jdGlvbilvc19nZXRyYW5kb20sIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBvc19nZXRyYW5kb21fX2RvY19ffSwKKworc3RhdGljIFB5T2JqZWN0ICoKK29zX2dldHJhbmRvbV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X3NzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK29zX2dldHJhbmRvbShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKyAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzaXplIiwgImZsYWdzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsibnxpOmdldHJhbmRvbSIsIF9rZXl3b3JkcywgMH07CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGludCBmbGFncyA9IDA7CisKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzaXplLCAmZmxhZ3MpKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gb3NfZ2V0cmFuZG9tX2ltcGwobW9kdWxlLCBzaXplLCBmbGFncyk7CisKK2V4aXQ6CisgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9HRVRSQU5ET01fU1lTQ0FMTCkgKi8KKwogI2lmbmRlZiBPU19UVFlOQU1FX01FVEhPRERFRgogICAgICNkZWZpbmUgT1NfVFRZTkFNRV9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChPU19UVFlOQU1FX01FVEhPRERFRikgKi8KQEAgLTU3NDEsNiArNjA4OCwxMCBAQAogICAgICNkZWZpbmUgT1NfU1lTQ09ORl9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChPU19TWVNDT05GX01FVEhPRERFRikgKi8KIAorI2lmbmRlZiBPU19TVEFSVEZJTEVfTUVUSE9EREVGCisgICAgI2RlZmluZSBPU19TVEFSVEZJTEVfTUVUSE9EREVGCisjZW5kaWYgLyogIWRlZmluZWQoT1NfU1RBUlRGSUxFX01FVEhPRERFRikgKi8KKwogI2lmbmRlZiBPU19HRVRMT0FEQVZHX01FVEhPRERFRgogICAgICNkZWZpbmUgT1NfR0VUTE9BREFWR19NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChPU19HRVRMT0FEQVZHX01FVEhPRERFRikgKi8KQEAgLTU3ODQsNCArNjEzNSw4IEBACiAjaWZuZGVmIE9TX1NFVF9IQU5ETEVfSU5IRVJJVEFCTEVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBPU19TRVRfSEFORExFX0lOSEVSSVRBQkxFX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKE9TX1NFVF9IQU5ETEVfSU5IRVJJVEFCTEVfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTlkNWY4MzFiMjMxNDVkMWUgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworCisjaWZuZGVmIE9TX0dFVFJBTkRPTV9NRVRIT0RERUYKKyAgICAjZGVmaW5lIE9TX0dFVFJBTkRPTV9NRVRIT0RERUYKKyNlbmRpZiAvKiAhZGVmaW5lZChPU19HRVRSQU5ET01fTUVUSE9EREVGKSAqLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZjZTUxYzdkNDMyNjYyYzIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvcHdkbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL3B3ZG1vZHVsZS5jLmgKaW5kZXggY2IxOTFhMC4uZjllMDY0NCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvcHdkbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9wd2Rtb2R1bGUuYy5oCkBAIC0zMyw4ICszMyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmFyZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnXywgIlU6Z2V0cHduYW0iLCAmYXJnKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ18sICJVOmdldHB3bmFtIiwgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBwd2RfZ2V0cHduYW1faW1wbChtb2R1bGUsIGFyZyk7CiAKIGV4aXQ6CkBAIC02OCw0ICs2OSw0IEBACiAjaWZuZGVmIFBXRF9HRVRQV0FMTF9NRVRIT0RERUYKICAgICAjZGVmaW5lIFBXRF9HRVRQV0FMTF9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChQV0RfR0VUUFdBTExfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQwZWExYzVjODMyZjBjMWEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZjNDFkOGQ4OGVjMjA2ZDggaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvcHlleHBhdC5jLmggYi9Nb2R1bGVzL2NsaW5pYy9weWV4cGF0LmMuaAppbmRleCBjNWI1YzcxLi44YTAzZjY3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9weWV4cGF0LmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9weWV4cGF0LmMuaApAQCAtMjUsOCArMjUsOSBAQAogICAgIGludCBpc2ZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOlBhcnNlIiwKLSAgICAgICAgJmRhdGEsICZpc2ZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZpc2ZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHB5ZXhwYXRfeG1scGFyc2VyX1BhcnNlX2ltcGwoc2VsZiwgZGF0YSwgaXNmaW5hbCk7CiAKIGV4aXQ6CkBAIC02MCw4ICs2MSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqYmFzZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpTZXRCYXNlIiwgJmJhc2UpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpTZXRCYXNlIiwgJmJhc2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gcHlleHBhdF94bWxwYXJzZXJfU2V0QmFzZV9pbXBsKHNlbGYsIGJhc2UpOwogCiBleGl0OgpAQCAtMTI5LDggKzEzMSw5IEBACiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6fHM6RXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUiLAotICAgICAgICAmY29udGV4dCwgJmVuY29kaW5nKSkKKyAgICAgICAgJmNvbnRleHQsICZlbmNvZGluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBweWV4cGF0X3htbHBhcnNlcl9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZV9pbXBsKHNlbGYsIGNvbnRleHQsIGVuY29kaW5nKTsKIAogZXhpdDoKQEAgLTE2MCw4ICsxNjMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBmbGFnOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOlNldFBhcmFtRW50aXR5UGFyc2luZyIsICZmbGFnKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6U2V0UGFyYW1FbnRpdHlQYXJzaW5nIiwgJmZsYWcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gcHlleHBhdF94bWxwYXJzZXJfU2V0UGFyYW1FbnRpdHlQYXJzaW5nX2ltcGwoc2VsZiwgZmxhZyk7CiAKIGV4aXQ6CkBAIC0xOTMsOCArMTk3LDkgQEAKICAgICBpbnQgZmxhZyA9IDE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxwOlVzZUZvcmVpZ25EVEQiLAotICAgICAgICAmZmxhZykpCisgICAgICAgICZmbGFnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHB5ZXhwYXRfeG1scGFyc2VyX1VzZUZvcmVpZ25EVERfaW1wbChzZWxmLCBmbGFnKTsKIAogZXhpdDoKQEAgLTIzOCwxNCArMjQzLDE2IEBACiBweWV4cGF0X1BhcnNlckNyZWF0ZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImVuY29kaW5nIiwgIm5hbWVzcGFjZV9zZXBhcmF0b3IiLCAiaW50ZXJuIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZW5jb2RpbmciLCAibmFtZXNwYWNlX3NlcGFyYXRvciIsICJpbnRlcm4iLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8enpPOlBhcnNlckNyZWF0ZSIsIF9rZXl3b3JkcywgMH07CiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKm5hbWVzcGFjZV9zZXBhcmF0b3IgPSBOVUxMOwogICAgIFB5T2JqZWN0ICppbnRlcm4gPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifHp6TzpQYXJzZXJDcmVhdGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZlbmNvZGluZywgJm5hbWVzcGFjZV9zZXBhcmF0b3IsICZpbnRlcm4pKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmVuY29kaW5nLCAmbmFtZXNwYWNlX3NlcGFyYXRvciwgJmludGVybikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBweWV4cGF0X1BhcnNlckNyZWF0ZV9pbXBsKG1vZHVsZSwgZW5jb2RpbmcsIG5hbWVzcGFjZV9zZXBhcmF0b3IsIGludGVybik7CiAKIGV4aXQ6CkBAIC0yNzAsOCArMjc3LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBsb25nIGNvZGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImw6RXJyb3JTdHJpbmciLCAmY29kZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJsOkVycm9yU3RyaW5nIiwgJmNvZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gcHlleHBhdF9FcnJvclN0cmluZ19pbXBsKG1vZHVsZSwgY29kZSk7CiAKIGV4aXQ6CkBAIC0yODEsNCArMjg5LDQgQEAKICNpZm5kZWYgUFlFWFBBVF9YTUxQQVJTRVJfVVNFRk9SRUlHTkRURF9NRVRIT0RERUYKICAgICAjZGVmaW5lIFBZRVhQQVRfWE1MUEFSU0VSX1VTRUZPUkVJR05EVERfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoUFlFWFBBVF9YTUxQQVJTRVJfVVNFRk9SRUlHTkRURF9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDQ3OWNmYWI2MDdlOWRjOCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTNjZmU2NjJmMmJjNDhlNSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9zaGExbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL3NoYTFtb2R1bGUuYy5oCmluZGV4IDViOGRiODAuLjE5NzI3NjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL3NoYTFtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3NoYTFtb2R1bGUuYy5oCkBAIC04MSwxNSArODEsMTcgQEAKIF9zaGExX3NoYTEoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzdHJpbmciLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzdHJpbmciLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8TzpzaGExIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOnNoYTEiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0cmluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc2hhMV9zaGExX2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGI2YTE5NGZiYjBiOTRmMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTQ5YTVkMDhjMjQ4MzM3ZCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9zaGEyNTZtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvc2hhMjU2bW9kdWxlLmMuaAppbmRleCA2NjE1NjljLi40MjM5YWI4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9zaGEyNTZtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3NoYTI1Nm1vZHVsZS5jLmgKQEAgLTgxLDEyICs4MSwxNCBAQAogX3NoYTI1Nl9zaGEyNTYoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzdHJpbmciLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzdHJpbmciLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8TzpzaGEyNTYiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzdHJpbmcgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86c2hhMjU2IiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdHJpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NoYTI1Nl9zaGEyNTZfaW1wbChtb2R1bGUsIHN0cmluZyk7CiAKIGV4aXQ6CkBAIC0xMDksMTUgKzExMSwxNyBAQAogX3NoYTI1Nl9zaGEyMjQoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzdHJpbmciLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzdHJpbmciLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8TzpzaGEyMjQiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzdHJpbmcgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86c2hhMjI0IiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdHJpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NoYTI1Nl9zaGEyMjRfaW1wbChtb2R1bGUsIHN0cmluZyk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01YTFmYzU0ODBlMzk5Zjk1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hMTI5NmJhNmQwNzgwMDUxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL3NoYTUxMm1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9zaGE1MTJtb2R1bGUuYy5oCmluZGV4IGQ2NGMyYTQuLjk2ODBlYTIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL3NoYTUxMm1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvc2hhNTEybW9kdWxlLmMuaApAQCAtMiw4ICsyLDYgQEAKIHByZXNlcnZlCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKLSNpZiBkZWZpbmVkKFBZX0xPTkdfTE9ORykKLQogUHlEb2NfU1RSVkFSKFNIQTUxMlR5cGVfY29weV9fZG9jX18sCiAiY29weSgkc2VsZiwgLylcbiIKICItLVxuIgpAQCAtMjIsMTAgKzIwLDYgQEAKICAgICByZXR1cm4gU0hBNTEyVHlwZV9jb3B5X2ltcGwoc2VsZik7CiB9CiAKLSNlbmRpZiAvKiBkZWZpbmVkKFBZX0xPTkdfTE9ORykgKi8KLQotI2lmIGRlZmluZWQoUFlfTE9OR19MT05HKQotCiBQeURvY19TVFJWQVIoU0hBNTEyVHlwZV9kaWdlc3RfX2RvY19fLAogImRpZ2VzdCgkc2VsZiwgLylcbiIKICItLVxuIgpAQCAtNDQsMTAgKzM4LDYgQEAKICAgICByZXR1cm4gU0hBNTEyVHlwZV9kaWdlc3RfaW1wbChzZWxmKTsKIH0KIAotI2VuZGlmIC8qIGRlZmluZWQoUFlfTE9OR19MT05HKSAqLwotCi0jaWYgZGVmaW5lZChQWV9MT05HX0xPTkcpCi0KIFB5RG9jX1NUUlZBUihTSEE1MTJUeXBlX2hleGRpZ2VzdF9fZG9jX18sCiAiaGV4ZGlnZXN0KCRzZWxmLCAvKVxuIgogIi0tXG4iCkBAIC02NiwxMCArNTYsNiBAQAogICAgIHJldHVybiBTSEE1MTJUeXBlX2hleGRpZ2VzdF9pbXBsKHNlbGYpOwogfQogCi0jZW5kaWYgLyogZGVmaW5lZChQWV9MT05HX0xPTkcpICovCi0KLSNpZiBkZWZpbmVkKFBZX0xPTkdfTE9ORykKLQogUHlEb2NfU1RSVkFSKFNIQTUxMlR5cGVfdXBkYXRlX19kb2NfXywKICJ1cGRhdGUoJHNlbGYsIG9iaiwgLylcbiIKICItLVxuIgpAQCAtNzksMTAgKzY1LDYgQEAKICNkZWZpbmUgU0hBNTEyVFlQRV9VUERBVEVfTUVUSE9EREVGICAgIFwKICAgICB7InVwZGF0ZSIsIChQeUNGdW5jdGlvbilTSEE1MTJUeXBlX3VwZGF0ZSwgTUVUSF9PLCBTSEE1MTJUeXBlX3VwZGF0ZV9fZG9jX199LAogCi0jZW5kaWYgLyogZGVmaW5lZChQWV9MT05HX0xPTkcpICovCi0KLSNpZiBkZWZpbmVkKFBZX0xPTkdfTE9ORykKLQogUHlEb2NfU1RSVkFSKF9zaGE1MTJfc2hhNTEyX19kb2NfXywKICJzaGE1MTIoJG1vZHVsZSwgLywgc3RyaW5nPWJcJ1wnKVxuIgogIi0tXG4iCkBAIC05OSwyMiArODEsMjAgQEAKIF9zaGE1MTJfc2hhNTEyKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE86c2hhNTEyIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOnNoYTUxMiIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zaGE1MTJfc2hhNTEyX2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CiAKLSNlbmRpZiAvKiBkZWZpbmVkKFBZX0xPTkdfTE9ORykgKi8KLQotI2lmIGRlZmluZWQoUFlfTE9OR19MT05HKQotCiBQeURvY19TVFJWQVIoX3NoYTUxMl9zaGEzODRfX2RvY19fLAogInNoYTM4NCgkbW9kdWxlLCAvLCBzdHJpbmc9YlwnXCcpXG4iCiAiLS1cbiIKQEAgLTEzMSw0MSArMTExLDE3IEBACiBfc2hhNTEyX3NoYTM4NChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0cmluZyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOnNoYTM4NCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnN0cmluZyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TzpzaGEzODQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0cmluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc2hhNTEyX3NoYTM4NF9pbXBsKG1vZHVsZSwgc3RyaW5nKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotCi0jZW5kaWYgLyogZGVmaW5lZChQWV9MT05HX0xPTkcpICovCi0KLSNpZm5kZWYgU0hBNTEyVFlQRV9DT1BZX01FVEhPRERFRgotICAgICNkZWZpbmUgU0hBNTEyVFlQRV9DT1BZX01FVEhPRERFRgotI2VuZGlmIC8qICFkZWZpbmVkKFNIQTUxMlRZUEVfQ09QWV9NRVRIT0RERUYpICovCi0KLSNpZm5kZWYgU0hBNTEyVFlQRV9ESUdFU1RfTUVUSE9EREVGCi0gICAgI2RlZmluZSBTSEE1MTJUWVBFX0RJR0VTVF9NRVRIT0RERUYKLSNlbmRpZiAvKiAhZGVmaW5lZChTSEE1MTJUWVBFX0RJR0VTVF9NRVRIT0RERUYpICovCi0KLSNpZm5kZWYgU0hBNTEyVFlQRV9IRVhESUdFU1RfTUVUSE9EREVGCi0gICAgI2RlZmluZSBTSEE1MTJUWVBFX0hFWERJR0VTVF9NRVRIT0RERUYKLSNlbmRpZiAvKiAhZGVmaW5lZChTSEE1MTJUWVBFX0hFWERJR0VTVF9NRVRIT0RERUYpICovCi0KLSNpZm5kZWYgU0hBNTEyVFlQRV9VUERBVEVfTUVUSE9EREVGCi0gICAgI2RlZmluZSBTSEE1MTJUWVBFX1VQREFURV9NRVRIT0RERUYKLSNlbmRpZiAvKiAhZGVmaW5lZChTSEE1MTJUWVBFX1VQREFURV9NRVRIT0RERUYpICovCi0KLSNpZm5kZWYgX1NIQTUxMl9TSEE1MTJfTUVUSE9EREVGCi0gICAgI2RlZmluZSBfU0hBNTEyX1NIQTUxMl9NRVRIT0RERUYKLSNlbmRpZiAvKiAhZGVmaW5lZChfU0hBNTEyX1NIQTUxMl9NRVRIT0RERUYpICovCi0KLSNpZm5kZWYgX1NIQTUxMl9TSEEzODRfTUVUSE9EREVGCi0gICAgI2RlZmluZSBfU0hBNTEyX1NIQTM4NF9NRVRIT0RERUYKLSNlbmRpZiAvKiAhZGVmaW5lZChfU0hBNTEyX1NIQTM4NF9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmI4N2Y0OTRkZjUwZmZjMCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGY3ZjY2MDNhOWM0ZTkxMCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9zaWduYWxtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvc2lnbmFsbW9kdWxlLmMuaAppbmRleCBjOGY0Y2Q1Li5mOGQ1YmQ5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9zaWduYWxtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3NpZ25hbG1vZHVsZS5jLmgKQEAgLTIzLDExICsyMywxMyBAQAogICAgIGludCBzZWNvbmRzOwogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTphbGFybSIsICZzZWNvbmRzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6YWxhcm0iLCAmc2Vjb25kcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gc2lnbmFsX2FsYXJtX2ltcGwobW9kdWxlLCBzZWNvbmRzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtODUsOCArODcsOSBAQAogICAgIFB5T2JqZWN0ICpoYW5kbGVyOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpzaWduYWwiLAotICAgICAgICAmc2lnbmFsbnVtLCAmaGFuZGxlcikpCisgICAgICAgICZzaWduYWxudW0sICZoYW5kbGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHNpZ25hbF9zaWduYWxfaW1wbChtb2R1bGUsIHNpZ25hbG51bSwgaGFuZGxlcik7CiAKIGV4aXQ6CkBAIC0xMTcsOCArMTIwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgc2lnbmFsbnVtOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldHNpZ25hbCIsICZzaWduYWxudW0pKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRzaWduYWwiLCAmc2lnbmFsbnVtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHNpZ25hbF9nZXRzaWduYWxfaW1wbChtb2R1bGUsIHNpZ25hbG51bSk7CiAKIGV4aXQ6CkBAIC0xNTAsOCArMTU0LDkgQEAKICAgICBpbnQgZmxhZzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6c2lnaW50ZXJydXB0IiwKLSAgICAgICAgJnNpZ25hbG51bSwgJmZsYWcpKQorICAgICAgICAmc2lnbmFsbnVtLCAmZmxhZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfc2lnaW50ZXJydXB0X2ltcGwobW9kdWxlLCBzaWduYWxudW0sIGZsYWcpOwogCiBleGl0OgpAQCAtMTg5LDggKzE5NCw5IEBACiAgICAgZG91YmxlIGludGVydmFsID0gMC4wOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpZHxkOnNldGl0aW1lciIsCi0gICAgICAgICZ3aGljaCwgJnNlY29uZHMsICZpbnRlcnZhbCkpCisgICAgICAgICZ3aGljaCwgJnNlY29uZHMsICZpbnRlcnZhbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfc2V0aXRpbWVyX2ltcGwobW9kdWxlLCB3aGljaCwgc2Vjb25kcywgaW50ZXJ2YWwpOwogCiBleGl0OgpAQCAtMjE5LDggKzIyNSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IHdoaWNoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldGl0aW1lciIsICZ3aGljaCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldGl0aW1lciIsICZ3aGljaCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfZ2V0aXRpbWVyX2ltcGwobW9kdWxlLCB3aGljaCk7CiAKIGV4aXQ6CkBAIC0yNTEsOCArMjU4LDkgQEAKICAgICBQeU9iamVjdCAqbWFzazsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86cHRocmVhZF9zaWdtYXNrIiwKLSAgICAgICAgJmhvdywgJm1hc2spKQorICAgICAgICAmaG93LCAmbWFzaykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfcHRocmVhZF9zaWdtYXNrX2ltcGwobW9kdWxlLCBob3csIG1hc2spOwogCiBleGl0OgpAQCAtMzQ0LDggKzM1Miw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzaWd0aW1lZHdhaXQiLAogICAgICAgICAyLCAyLAotICAgICAgICAmc2lnc2V0LCAmdGltZW91dF9vYmopKQorICAgICAgICAmc2lnc2V0LCAmdGltZW91dF9vYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gc2lnbmFsX3NpZ3RpbWVkd2FpdF9pbXBsKG1vZHVsZSwgc2lnc2V0LCB0aW1lb3V0X29iaik7CiAKIGV4aXQ6CkBAIC0zNzYsOCArMzg1LDkgQEAKICAgICBpbnQgc2lnbmFsbnVtOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaTpwdGhyZWFkX2tpbGwiLAotICAgICAgICAmdGhyZWFkX2lkLCAmc2lnbmFsbnVtKSkKKyAgICAgICAgJnRocmVhZF9pZCwgJnNpZ25hbG51bSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfcHRocmVhZF9raWxsX2ltcGwobW9kdWxlLCB0aHJlYWRfaWQsIHNpZ25hbG51bSk7CiAKIGV4aXQ6CkBAIC00MjksNCArNDM5LDQgQEAKICNpZm5kZWYgU0lHTkFMX1BUSFJFQURfS0lMTF9NRVRIT0RERUYKICAgICAjZGVmaW5lIFNJR05BTF9QVEhSRUFEX0tJTExfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoU0lHTkFMX1BUSFJFQURfS0lMTF9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGFmYTU5ODQxMmJmYjhkMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzY5OTBlZjBkMGJhNzJiNiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9zcHdkbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL3Nwd2Rtb2R1bGUuYy5oCmluZGV4IGUyNmFjZjEuLmIyNDc5ZmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL3Nwd2Rtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3Nwd2Rtb2R1bGUuYy5oCkBAIC0yNCw4ICsyNCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmFyZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnXywgIlU6Z2V0c3BuYW0iLCAmYXJnKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ18sICJVOmdldHNwbmFtIiwgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzcHdkX2dldHNwbmFtX2ltcGwobW9kdWxlLCBhcmcpOwogCiBleGl0OgpAQCAtNjUsNCArNjYsNCBAQAogI2lmbmRlZiBTUFdEX0dFVFNQQUxMX01FVEhPRERFRgogICAgICNkZWZpbmUgU1BXRF9HRVRTUEFMTF9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChTUFdEX0dFVFNQQUxMX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MTBmNjgxYjM2ZjU0YzMwIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wN2NkOGFmMGFmZDc3ZmU3IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL3VuaWNvZGVkYXRhLmMuaCBiL01vZHVsZXMvY2xpbmljL3VuaWNvZGVkYXRhLmMuaAppbmRleCBkNTIwYzFlLi5kNDgxY2NiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy91bmljb2RlZGF0YS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvdW5pY29kZWRhdGEuYy5oCkBAIC0yNyw4ICsyNyw5IEBACiAgICAgUHlPYmplY3QgKmRlZmF1bHRfdmFsdWUgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJDfE86ZGVjaW1hbCIsCi0gICAgICAgICZjaHIsICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmNociwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2RlY2ltYWxfaW1wbChzZWxmLCBjaHIsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtNTksOCArNjAsOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQ3xPOmRpZ2l0IiwKLSAgICAgICAgJmNociwgJmRlZmF1bHRfdmFsdWUpKQorICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfZGlnaXRfaW1wbChzZWxmLCBjaHIsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtOTIsOCArOTQsOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQ3xPOm51bWVyaWMiLAotICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZjaHIsICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9udW1lcmljX2ltcGwoc2VsZiwgY2hyLCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTExOCw4ICsxMjEsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBjaHI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6Y2F0ZWdvcnkiLCAmY2hyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6Y2F0ZWdvcnkiLCAmY2hyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9jYXRlZ29yeV9pbXBsKHNlbGYsIGNocik7CiAKIGV4aXQ6CkBAIC0xNDYsOCArMTUwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgY2hyOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmJpZGlyZWN0aW9uYWwiLCAmY2hyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6YmlkaXJlY3Rpb25hbCIsICZjaHIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2JpZGlyZWN0aW9uYWxfaW1wbChzZWxmLCBjaHIpOwogCiBleGl0OgpAQCAtMTc1LDExICsxODAsMTMgQEAKICAgICBpbnQgY2hyOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmNvbWJpbmluZyIsICZjaHIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzpjb21iaW5pbmciLCAmY2hyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfY29tYmluaW5nX2ltcGwoc2VsZiwgY2hyKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjA4LDExICsyMTUsMTMgQEAKICAgICBpbnQgY2hyOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOm1pcnJvcmVkIiwgJmNocikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOm1pcnJvcmVkIiwgJmNocikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX21pcnJvcmVkX2ltcGwoc2VsZiwgY2hyKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjM3LDggKzI0Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGNocjsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzplYXN0X2FzaWFuX3dpZHRoIiwgJmNocikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmVhc3RfYXNpYW5fd2lkdGgiLCAmY2hyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9lYXN0X2FzaWFuX3dpZHRoX2ltcGwoc2VsZiwgY2hyKTsKIAogZXhpdDoKQEAgLTI2NSw4ICsyNzUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBjaHI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6ZGVjb21wb3NpdGlvbiIsICZjaHIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzpkZWNvbXBvc2l0aW9uIiwgJmNocikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfZGVjb21wb3NpdGlvbl9pbXBsKHNlbGYsIGNocik7CiAKIGV4aXQ6CkBAIC0yOTYsOCArMzA3LDkgQEAKICAgICBQeU9iamVjdCAqaW5wdXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPITpub3JtYWxpemUiLAotICAgICAgICAmZm9ybSwgJlB5VW5pY29kZV9UeXBlLCAmaW5wdXQpKQorICAgICAgICAmZm9ybSwgJlB5VW5pY29kZV9UeXBlLCAmaW5wdXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX25vcm1hbGl6ZV9pbXBsKHNlbGYsIGZvcm0sIGlucHV0KTsKIAogZXhpdDoKQEAgLTMyNyw4ICszMzksOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQ3xPOm5hbWUiLAotICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZjaHIsICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9uYW1lX2ltcGwoc2VsZiwgY2hyLCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM1OCwxMSArMzcxLDEyIEBACiAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBQeV9zc2l6ZV9jbGVhbl90IG5hbWVfbGVuZ3RoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzIzpsb29rdXAiLCAmbmFtZSwgJm5hbWVfbGVuZ3RoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInMjOmxvb2t1cCIsICZuYW1lLCAmbmFtZV9sZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2xvb2t1cF9pbXBsKHNlbGYsIG5hbWUsIG5hbWVfbGVuZ3RoKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTRmOGRhMzNjNmJjNmVmYzkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTUzMTNjZTEyOWRhODdiMmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvemxpYm1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaAppbmRleCBiMWFmN2NlLi4xNzIzMDhhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaApAQCAtMyw0NCArMyw0OCBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBQeURvY19TVFJWQVIoemxpYl9jb21wcmVzc19fZG9jX18sCi0iY29tcHJlc3MoJG1vZHVsZSwgYnl0ZXMsIGxldmVsPVpfREVGQVVMVF9DT01QUkVTU0lPTiwgLylcbiIKKyJjb21wcmVzcygkbW9kdWxlLCBkYXRhLCAvLCBsZXZlbD1aX0RFRkFVTFRfQ09NUFJFU1NJT04pXG4iCiAiLS1cbiIKICJcbiIKICJSZXR1cm5zIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgY29tcHJlc3NlZCBkYXRhLlxuIgogIlxuIgotIiAgYnl0ZXNcbiIKKyIgIGRhdGFcbiIKICIgICAgQmluYXJ5IGRhdGEgdG8gYmUgY29tcHJlc3NlZC5cbiIKICIgIGxldmVsXG4iCi0iICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkuIik7CisiICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkgb3IgLTEuIik7CiAKICNkZWZpbmUgWkxJQl9DT01QUkVTU19NRVRIT0RERUYgICAgXAotICAgIHsiY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pemxpYl9jb21wcmVzcywgTUVUSF9WQVJBUkdTLCB6bGliX2NvbXByZXNzX19kb2NfX30sCisgICAgeyJjb21wcmVzcyIsIChQeUNGdW5jdGlvbil6bGliX2NvbXByZXNzLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgemxpYl9jb21wcmVzc19fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9jb21wcmVzc19pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqYnl0ZXMsIGludCBsZXZlbCk7Cit6bGliX2NvbXByZXNzX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgbGV2ZWwpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9jb21wcmVzcyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncykKK3psaWJfY29tcHJlc3MoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgUHlfYnVmZmVyIGJ5dGVzID0ge05VTEwsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7IiIsICJsZXZlbCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InkqfGk6Y29tcHJlc3MiLCBfa2V5d29yZHMsIDB9OworICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogICAgIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8aTpjb21wcmVzcyIsCi0gICAgICAgICZieXRlcywgJmxldmVsKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCAmbGV2ZWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICByZXR1cm5fdmFsdWUgPSB6bGliX2NvbXByZXNzX2ltcGwobW9kdWxlLCAmYnl0ZXMsIGxldmVsKTsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9jb21wcmVzc19pbXBsKG1vZHVsZSwgJmRhdGEsIGxldmVsKTsKIAogZXhpdDoKLSAgICAvKiBDbGVhbnVwIGZvciBieXRlcyAqLwotICAgIGlmIChieXRlcy5vYmopCi0gICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnl0ZXMpOworICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KKyAgICBpZiAoZGF0YS5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQogCiBQeURvY19TVFJWQVIoemxpYl9kZWNvbXByZXNzX19kb2NfXywKLSJkZWNvbXByZXNzKCRtb2R1bGUsIGRhdGEsIHdiaXRzPU1BWF9XQklUUywgYnVmc2l6ZT1ERUZfQlVGX1NJWkUsIC8pXG4iCisiZGVjb21wcmVzcygkbW9kdWxlLCBkYXRhLCAvLCB3Yml0cz1NQVhfV0JJVFMsIGJ1ZnNpemU9REVGX0JVRl9TSVpFKVxuIgogIi0tXG4iCiAiXG4iCiAiUmV0dXJucyBhIGJ5dGVzIG9iamVjdCBjb250YWluaW5nIHRoZSB1bmNvbXByZXNzZWQgZGF0YS5cbiIKQEAgLTUzLDI5ICs1NywzMyBAQAogIiAgICBUaGUgaW5pdGlhbCBvdXRwdXQgYnVmZmVyIHNpemUuIik7CiAKICNkZWZpbmUgWkxJQl9ERUNPTVBSRVNTX01FVEhPRERFRiAgICBcCi0gICAgeyJkZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKXpsaWJfZGVjb21wcmVzcywgTUVUSF9WQVJBUkdTLCB6bGliX2RlY29tcHJlc3NfX2RvY19ffSwKKyAgICB7ImRlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pemxpYl9kZWNvbXByZXNzLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgemxpYl9kZWNvbXByZXNzX19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCiB6bGliX2RlY29tcHJlc3NfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEsIGludCB3Yml0cywKICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgYnVmc2l6ZSk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi16bGliX2RlY29tcHJlc3MoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MpCit6bGliX2RlY29tcHJlc3MoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiIiwgIndiaXRzIiwgImJ1ZnNpemUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ5KnxpTyY6ZGVjb21wcmVzcyIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAgICAgaW50IHdiaXRzID0gTUFYX1dCSVRTOwogICAgIFB5X3NzaXplX3QgYnVmc2l6ZSA9IERFRl9CVUZfU0laRTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8aU8mOmRlY29tcHJlc3MiLAotICAgICAgICAmZGF0YSwgJndiaXRzLCBzc2l6ZV90X2NvbnZlcnRlciwgJmJ1ZnNpemUpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmRhdGEsICZ3Yml0cywgc3NpemVfdF9jb252ZXJ0ZXIsICZidWZzaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfZGVjb21wcmVzc19pbXBsKG1vZHVsZSwgJmRhdGEsIHdiaXRzLCBidWZzaXplKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xMjEsNyArMTI5LDggQEAKIHpsaWJfY29tcHJlc3NvYmooUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJsZXZlbCIsICJtZXRob2QiLCAid2JpdHMiLCAibWVtTGV2ZWwiLCAic3RyYXRlZ3kiLCAiemRpY3QiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJsZXZlbCIsICJtZXRob2QiLCAid2JpdHMiLCAibWVtTGV2ZWwiLCAic3RyYXRlZ3kiLCAiemRpY3QiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8aWlpaWl5Kjpjb21wcmVzc29iaiIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOwogICAgIGludCBtZXRob2QgPSBERUZMQVRFRDsKICAgICBpbnQgd2JpdHMgPSBNQVhfV0JJVFM7CkBAIC0xMjksMTUgKzEzOCwxNyBAQAogICAgIGludCBzdHJhdGVneSA9IFpfREVGQVVMVF9TVFJBVEVHWTsKICAgICBQeV9idWZmZXIgemRpY3QgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8aWlpaWl5Kjpjb21wcmVzc29iaiIsIF9rZXl3b3JkcywKLSAgICAgICAgJmxldmVsLCAmbWV0aG9kLCAmd2JpdHMsICZtZW1MZXZlbCwgJnN0cmF0ZWd5LCAmemRpY3QpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmxldmVsLCAmbWV0aG9kLCAmd2JpdHMsICZtZW1MZXZlbCwgJnN0cmF0ZWd5LCAmemRpY3QpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9jb21wcmVzc29ial9pbXBsKG1vZHVsZSwgbGV2ZWwsIG1ldGhvZCwgd2JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwgJnpkaWN0KTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciB6ZGljdCAqLwotICAgIGlmICh6ZGljdC5vYmopCisgICAgaWYgKHpkaWN0Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnpkaWN0KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTY0LDEzICsxNzUsMTUgQEAKIHpsaWJfZGVjb21wcmVzc29iaihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7IndiaXRzIiwgInpkaWN0IiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsid2JpdHMiLCAiemRpY3QiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8aU86ZGVjb21wcmVzc29iaiIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHdiaXRzID0gTUFYX1dCSVRTOwogICAgIFB5T2JqZWN0ICp6ZGljdCA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8aU86ZGVjb21wcmVzc29iaiIsIF9rZXl3b3JkcywKLSAgICAgICAgJndiaXRzLCAmemRpY3QpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJndiaXRzLCAmemRpY3QpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9kZWNvbXByZXNzb2JqX2ltcGwobW9kdWxlLCB3Yml0cywgemRpY3QpOwogCiBleGl0OgpAQCAtMjAyLDIwICsyMTUsMjIgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6Y29tcHJlc3MiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpjb21wcmVzcyIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfQ29tcHJlc3NfY29tcHJlc3NfaW1wbChzZWxmLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQogCiBQeURvY19TVFJWQVIoemxpYl9EZWNvbXByZXNzX2RlY29tcHJlc3NfX2RvY19fLAotImRlY29tcHJlc3MoJHNlbGYsIGRhdGEsIG1heF9sZW5ndGg9MCwgLylcbiIKKyJkZWNvbXByZXNzKCRzZWxmLCBkYXRhLCAvLCBtYXhfbGVuZ3RoPTApXG4iCiAiLS1cbiIKICJcbiIKICJSZXR1cm4gYSBieXRlcyBvYmplY3QgY29udGFpbmluZyB0aGUgZGVjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRhdGEuXG4iCkBAIC0yMzIsMjggKzI0NywzMiBAQAogIkNhbGwgdGhlIGZsdXNoKCkgbWV0aG9kIHRvIGNsZWFyIHRoZXNlIGJ1ZmZlcnMuIik7CiAKICNkZWZpbmUgWkxJQl9ERUNPTVBSRVNTX0RFQ09NUFJFU1NfTUVUSE9EREVGICAgIFwKLSAgICB7ImRlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pemxpYl9EZWNvbXByZXNzX2RlY29tcHJlc3MsIE1FVEhfVkFSQVJHUywgemxpYl9EZWNvbXByZXNzX2RlY29tcHJlc3NfX2RvY19ffSwKKyAgICB7ImRlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pemxpYl9EZWNvbXByZXNzX2RlY29tcHJlc3MsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCB6bGliX0RlY29tcHJlc3NfZGVjb21wcmVzc19fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgogemxpYl9EZWNvbXByZXNzX2RlY29tcHJlc3NfaW1wbChjb21wb2JqZWN0ICpzZWxmLCBQeV9idWZmZXIgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4X2xlbmd0aCk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi16bGliX0RlY29tcHJlc3NfZGVjb21wcmVzcyhjb21wb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3psaWJfRGVjb21wcmVzc19kZWNvbXByZXNzKGNvbXBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7IiIsICJtYXhfbGVuZ3RoIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsieSp8TyY6ZGVjb21wcmVzcyIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAgICAgUHlfc3NpemVfdCBtYXhfbGVuZ3RoID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8TyY6ZGVjb21wcmVzcyIsCi0gICAgICAgICZkYXRhLCBzc2l6ZV90X2NvbnZlcnRlciwgJm1heF9sZW5ndGgpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmRhdGEsIHNzaXplX3RfY29udmVydGVyLCAmbWF4X2xlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB6bGliX0RlY29tcHJlc3NfZGVjb21wcmVzc19pbXBsKHNlbGYsICZkYXRhLCBtYXhfbGVuZ3RoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yODMsOCArMzAyLDkgQEAKICAgICBpbnQgbW9kZSA9IFpfRklOSVNIOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpmbHVzaCIsCi0gICAgICAgICZtb2RlKSkKKyAgICAgICAgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9Db21wcmVzc19mbHVzaF9pbXBsKHNlbGYsIG1vZGUpOwogCiBleGl0OgpAQCAtMzU3LDggKzM3Nyw5IEBACiAgICAgUHlfc3NpemVfdCBsZW5ndGggPSBERUZfQlVGX1NJWkU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpmbHVzaCIsCi0gICAgICAgIHNzaXplX3RfY29udmVydGVyLCAmbGVuZ3RoKSkKKyAgICAgICAgc3NpemVfdF9jb252ZXJ0ZXIsICZsZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9EZWNvbXByZXNzX2ZsdXNoX2ltcGwoc2VsZiwgbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTM5MCwxNCArNDExLDE2IEBACiAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8STphZGxlcjMyIiwKLSAgICAgICAgJmRhdGEsICZ2YWx1ZSkpCisgICAgICAgICZkYXRhLCAmdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9hZGxlcjMyX2ltcGwobW9kdWxlLCAmZGF0YSwgdmFsdWUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQyNywxNCArNDUwLDE2IEBACiAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8STpjcmMzMiIsCi0gICAgICAgICZkYXRhLCAmdmFsdWUpKQorICAgICAgICAmZGF0YSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfY3JjMzJfaW1wbChtb2R1bGUsICZkYXRhLCB2YWx1ZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDQyLDQgKzQ2Nyw0IEBACiAjaWZuZGVmIFpMSUJfQ09NUFJFU1NfQ09QWV9NRVRIT0RERUYKICAgICAjZGVmaW5lIFpMSUJfQ09NUFJFU1NfQ09QWV9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChaTElCX0NPTVBSRVNTX0NPUFlfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTc3MTFlZjAyZDFkNTc3NmMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQ4OTExZWY0MjliNjU5MDMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbWF0aG1vZHVsZS5jIGIvTW9kdWxlcy9jbWF0aG1vZHVsZS5jCmluZGV4IGNiYTQyYTcuLjgzMTk3NjcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY21hdGhtb2R1bGUuYworKysgYi9Nb2R1bGVzL2NtYXRobW9kdWxlLmMKQEAgLTgxLDYgKzgxLDU0IEBACiAjZW5kaWYKICNkZWZpbmUgQ01fU0NBTEVfRE9XTiAoLShDTV9TQ0FMRV9VUCsxKS8yKQogCisvKiBDb25zdGFudHMgY21hdGguaW5mLCBjbWF0aC5pbmZqLCBjbWF0aC5uYW4sIGNtYXRoLm5hbmouCisgICBjbWF0aC5uYW4gYW5kIGNtYXRoLm5hbmogYXJlIGRlZmluZWQgb25seSB3aGVuIGVpdGhlcgorICAgUFlfTk9fU0hPUlRfRkxPQVRfUkVQUiBpcyAqbm90KiBkZWZpbmVkICh3aGljaCBzaG91bGQgYmUKKyAgIHRoZSBtb3N0IGNvbW1vbiBzaXR1YXRpb24gb24gbWFjaGluZXMgdXNpbmcgYW4gSUVFRSA3NTQKKyAgIHJlcHJlc2VudGF0aW9uKSwgb3IgUHlfTkFOIGlzIGRlZmluZWQuICovCisKK3N0YXRpYyBkb3VibGUKK21faW5mKHZvaWQpCit7CisjaWZuZGVmIFBZX05PX1NIT1JUX0ZMT0FUX1JFUFIKKyAgICByZXR1cm4gX1B5X2RnX2luZmluaXR5KDApOworI2Vsc2UKKyAgICByZXR1cm4gUHlfSFVHRV9WQUw7CisjZW5kaWYKK30KKworc3RhdGljIFB5X2NvbXBsZXgKK2NfaW5maih2b2lkKQoreworICAgIFB5X2NvbXBsZXggcjsKKyAgICByLnJlYWwgPSAwLjA7CisgICAgci5pbWFnID0gbV9pbmYoKTsKKyAgICByZXR1cm4gcjsKK30KKworI2lmICFkZWZpbmVkKFBZX05PX1NIT1JUX0ZMT0FUX1JFUFIpIHx8IGRlZmluZWQoUHlfTkFOKQorCitzdGF0aWMgZG91YmxlCittX25hbih2b2lkKQoreworI2lmbmRlZiBQWV9OT19TSE9SVF9GTE9BVF9SRVBSCisgICAgcmV0dXJuIF9QeV9kZ19zdGRuYW4oMCk7CisjZWxzZQorICAgIHJldHVybiBQeV9OQU47CisjZW5kaWYKK30KKworc3RhdGljIFB5X2NvbXBsZXgKK2NfbmFuaih2b2lkKQoreworICAgIFB5X2NvbXBsZXggcjsKKyAgICByLnJlYWwgPSAwLjA7CisgICAgci5pbWFnID0gbV9uYW4oKTsKKyAgICByZXR1cm4gcjsKK30KKworI2VuZGlmCisKIC8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCiBzdGF0aWMgUHlfY29tcGxleCBjbWF0aF9hc2luaF9pbXBsKFB5T2JqZWN0ICosIFB5X2NvbXBsZXgpOwogc3RhdGljIFB5X2NvbXBsZXggY21hdGhfYXRhbmhfaW1wbChQeU9iamVjdCAqLCBQeV9jb21wbGV4KTsKQEAgLTEyMzksNiArMTI4NywxMyBAQAogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAicGkiLAogICAgICAgICAgICAgICAgICAgICAgICBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTUFUSF9QSSkpOwogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZSIsIFB5RmxvYXRfRnJvbURvdWJsZShQeV9NQVRIX0UpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInRhdSIsIFB5RmxvYXRfRnJvbURvdWJsZShQeV9NQVRIX1RBVSkpOyAvKiAycGkgKi8KKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImluZiIsIFB5RmxvYXRfRnJvbURvdWJsZShtX2luZigpKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJpbmZqIiwgUHlDb21wbGV4X0Zyb21DQ29tcGxleChjX2luZmooKSkpOworI2lmICFkZWZpbmVkKFBZX05PX1NIT1JUX0ZMT0FUX1JFUFIpIHx8IGRlZmluZWQoUHlfTkFOKQorICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAibmFuIiwgUHlGbG9hdF9Gcm9tRG91YmxlKG1fbmFuKCkpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIm5hbmoiLCBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGNfbmFuaigpKSk7CisjZW5kaWYKIAogICAgIC8qIGluaXRpYWxpemUgc3BlY2lhbCB2YWx1ZSB0YWJsZXMgKi8KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9mYXVsdGhhbmRsZXIuYyBiL01vZHVsZXMvZmF1bHRoYW5kbGVyLmMKaW5kZXggZjFmZGE0OC4uMWMxZTRmYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9mYXVsdGhhbmRsZXIuYworKysgYi9Nb2R1bGVzL2ZhdWx0aGFuZGxlci5jCkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICBoYW5kbGVyIGZhaWxzIGluIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcigpICovCiAgICAge1NJR1NFR1YsIDAsICJTZWdtZW50YXRpb24gZmF1bHQiLCB9CiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZmF1bHRoYW5kbGVyX25zaWduYWxzID0gXAorc3RhdGljIGNvbnN0IHNpemVfdCBmYXVsdGhhbmRsZXJfbnNpZ25hbHMgPSBcCiAgICAgUHlfQVJSQVlfTEVOR1RIKGZhdWx0aGFuZGxlcl9oYW5kbGVycyk7CiAKICNpZmRlZiBIQVZFX1NJR0FMVFNUQUNLCkBAIC0xNTksNyArMTU5LDcgQEAKICAgICAgICAgZmQgPSBfUHlMb25nX0FzSW50KGZpbGUpOwogICAgICAgICBpZiAoZmQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGZkIDwgMCB8fCAhX1B5VmVyaWZ5X2ZkKGZkKSkgeworICAgICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0ZXIiKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTE2OCw3ICsxNjgsNyBAQAogICAgICAgICByZXR1cm4gZmQ7CiAgICAgfQogCi0gICAgcmVzdWx0ID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmaWxlLCAmUHlJZF9maWxlbm8sICIiKTsKKyAgICByZXN1bHQgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGZpbGUsICZQeUlkX2ZpbGVubywgTlVMTCk7CiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7CiAKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgcmVzdWx0ID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmaWxlLCAmUHlJZF9mbHVzaCwgIiIpOworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZmlsZSwgJlB5SWRfZmx1c2gsIE5VTEwpOwogICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgZWxzZSB7CkBAIC0yMDIsOCArMjAyLDkgQEAKIHN0YXRpYyBQeVRocmVhZFN0YXRlKgogZ2V0X3RocmVhZF9zdGF0ZSh2b2lkKQogewotICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gX1B5VGhyZWFkU3RhdGVfVW5jaGVja2VkR2V0KCk7CiAgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKSB7CisgICAgICAgIC8qIGp1c3QgaW4gY2FzZSBidXQgdmVyeSB1bmxpa2VseS4uLiAqLwogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBnZXQgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRlIik7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjM0LDExICsyMzUsMTIgQEAKICAgICAgICBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpLiAqLwogICAgIHRzdGF0ZSA9IFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCk7CiAjZWxzZQotICAgIHRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7CisgICAgdHN0YXRlID0gX1B5VGhyZWFkU3RhdGVfVW5jaGVja2VkR2V0KCk7CiAjZW5kaWYKIAotICAgIGlmIChhbGxfdGhyZWFkcykKLSAgICAgICAgX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKGZkLCBpbnRlcnAsIHRzdGF0ZSk7CisgICAgaWYgKGFsbF90aHJlYWRzKSB7CisgICAgICAgICh2b2lkKV9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyhmZCwgTlVMTCwgdHN0YXRlKTsKKyAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIGlmICh0c3RhdGUgIT0gTlVMTCkKICAgICAgICAgICAgIF9QeV9EdW1wVHJhY2ViYWNrKGZkLCB0c3RhdGUpOwpAQCAtMjcyLDcgKzI3NCw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKGFsbF90aHJlYWRzKSB7Ci0gICAgICAgIGVycm1zZyA9IF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyhmZCwgdHN0YXRlLT5pbnRlcnAsIHRzdGF0ZSk7CisgICAgICAgIGVycm1zZyA9IF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyhmZCwgTlVMTCwgdHN0YXRlKTsKICAgICAgICAgaWYgKGVycm1zZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCBlcnJtc2cpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yODgsNiArMjkwLDE5IEBACiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKK3N0YXRpYyB2b2lkCitmYXVsdGhhbmRsZXJfZGlzYWJsZV9mYXRhbF9oYW5kbGVyKGZhdWx0X2hhbmRsZXJfdCAqaGFuZGxlcikKK3sKKyAgICBpZiAoIWhhbmRsZXItPmVuYWJsZWQpCisgICAgICAgIHJldHVybjsKKyAgICBoYW5kbGVyLT5lbmFibGVkID0gMDsKKyNpZmRlZiBIQVZFX1NJR0FDVElPTgorICAgICh2b2lkKXNpZ2FjdGlvbihoYW5kbGVyLT5zaWdudW0sICZoYW5kbGVyLT5wcmV2aW91cywgTlVMTCk7CisjZWxzZQorICAgICh2b2lkKXNpZ25hbChoYW5kbGVyLT5zaWdudW0sIGhhbmRsZXItPnByZXZpb3VzKTsKKyNlbmRpZgorfQorCiAKIC8qIEhhbmRsZXIgZm9yIFNJR1NFR1YsIFNJR0ZQRSwgU0lHQUJSVCwgU0lHQlVTIGFuZCBTSUdJTEwgc2lnbmFscy4KIApAQCAtMzA2LDcgKzMyMSw3IEBACiBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3IoaW50IHNpZ251bSkKIHsKICAgICBjb25zdCBpbnQgZmQgPSBmYXRhbF9lcnJvci5mZDsKLSAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBzaXplX3QgaTsKICAgICBmYXVsdF9oYW5kbGVyX3QgKmhhbmRsZXIgPSBOVUxMOwogICAgIGludCBzYXZlX2Vycm5vID0gZXJybm87CiAKQEAgLTMyNCwxMiArMzM5LDcgQEAKICAgICB9CiAKICAgICAvKiByZXN0b3JlIHRoZSBwcmV2aW91cyBoYW5kbGVyICovCi0jaWZkZWYgSEFWRV9TSUdBQ1RJT04KLSAgICAodm9pZClzaWdhY3Rpb24oc2lnbnVtLCAmaGFuZGxlci0+cHJldmlvdXMsIE5VTEwpOwotI2Vsc2UKLSAgICAodm9pZClzaWduYWwoc2lnbnVtLCBoYW5kbGVyLT5wcmV2aW91cyk7Ci0jZW5kaWYKLSAgICBoYW5kbGVyLT5lbmFibGVkID0gMDsKKyAgICBmYXVsdGhhbmRsZXJfZGlzYWJsZV9mYXRhbF9oYW5kbGVyKGhhbmRsZXIpOwogCiAgICAgUFVUUyhmZCwgIkZhdGFsIFB5dGhvbiBlcnJvcjogIik7CiAgICAgUFVUUyhmZCwgaGFuZGxlci0+bmFtZSk7CkBAIC0zNTEsMjAgKzM2MSwxMTcgQEAKICAgICByYWlzZShzaWdudW0pOwogfQogCisjaWZkZWYgTVNfV0lORE9XUworc3RhdGljIExPTkcgV0lOQVBJCitmYXVsdGhhbmRsZXJfZXhjX2hhbmRsZXIoc3RydWN0IF9FWENFUFRJT05fUE9JTlRFUlMgKmV4Y19pbmZvKQoreworICAgIGNvbnN0IGludCBmZCA9IGZhdGFsX2Vycm9yLmZkOworICAgIERXT1JEIGNvZGUgPSBleGNfaW5mby0+RXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25Db2RlOworICAgIERXT1JEIGZsYWdzID0gZXhjX2luZm8tPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uRmxhZ3M7CisKKyAgICAvKiBvbmx5IGxvZyBmYXRhbCBleGNlcHRpb25zICovCisgICAgaWYgKGZsYWdzICYgRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFKSB7CisgICAgICAgIC8qIGNhbGwgdGhlIG5leHQgZXhjZXB0aW9uIGhhbmRsZXIgKi8KKyAgICAgICAgcmV0dXJuIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0g7CisgICAgfQorCisgICAgUFVUUyhmZCwgIldpbmRvd3MgZmF0YWwgZXhjZXB0aW9uOiAiKTsKKyAgICBzd2l0Y2ggKGNvZGUpCisgICAgeworICAgIC8qIG9ubHkgZm9ybWF0IG1vc3QgY29tbW9uIGVycm9ycyAqLworICAgIGNhc2UgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT046IFBVVFMoZmQsICJhY2Nlc3MgdmlvbGF0aW9uIik7IGJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX0ZMVF9ESVZJREVfQllfWkVSTzogUFVUUyhmZCwgImZsb2F0IGRpdmlkZSBieSB6ZXJvIik7IGJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX0ZMVF9PVkVSRkxPVzogUFVUUyhmZCwgImZsb2F0IG92ZXJmbG93Iik7IGJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTzogUFVUUyhmZCwgImludCBkaXZpZGUgYnkgemVybyIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9JTlRfT1ZFUkZMT1c6IFBVVFMoZmQsICJpbnRlZ2VyIG92ZXJmbG93Iik7IGJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX0lOX1BBR0VfRVJST1I6IFBVVFMoZmQsICJwYWdlIGVycm9yIik7IGJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX1NUQUNLX09WRVJGTE9XOiBQVVRTKGZkLCAic3RhY2sgb3ZlcmZsb3ciKTsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUFVUUyhmZCwgImNvZGUgIik7CisgICAgICAgIF9QeV9EdW1wRGVjaW1hbChmZCwgY29kZSk7CisgICAgfQorICAgIFBVVFMoZmQsICJcblxuIik7CisKKyAgICBpZiAoY29kZSA9PSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTikgeworICAgICAgICAvKiBkaXNhYmxlIHNpZ25hbCBoYW5kbGVyIGZvciBTSUdTRUdWICovCisgICAgICAgIHNpemVfdCBpOworICAgICAgICBmb3IgKGk9MDsgaSA8IGZhdWx0aGFuZGxlcl9uc2lnbmFsczsgaSsrKSB7CisgICAgICAgICAgICBmYXVsdF9oYW5kbGVyX3QgKmhhbmRsZXIgPSAmZmF1bHRoYW5kbGVyX2hhbmRsZXJzW2ldOworICAgICAgICAgICAgaWYgKGhhbmRsZXItPnNpZ251bSA9PSBTSUdTRUdWKSB7CisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyX2Rpc2FibGVfZmF0YWxfaGFuZGxlcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZhdWx0aGFuZGxlcl9kdW1wX3RyYWNlYmFjayhmZCwgZmF0YWxfZXJyb3IuYWxsX3RocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsX2Vycm9yLmludGVycCk7CisKKyAgICAvKiBjYWxsIHRoZSBuZXh0IGV4Y2VwdGlvbiBoYW5kbGVyICovCisgICAgcmV0dXJuIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0g7Cit9CisjZW5kaWYKKwogLyogSW5zdGFsbCB0aGUgaGFuZGxlciBmb3IgZmF0YWwgc2lnbmFscywgZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yKCkuICovCiAKK3N0YXRpYyBpbnQKK2ZhdWx0aGFuZGxlcl9lbmFibGUodm9pZCkKK3sKKyAgICBzaXplX3QgaTsKKworICAgIGlmIChmYXRhbF9lcnJvci5lbmFibGVkKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmYXRhbF9lcnJvci5lbmFibGVkID0gMTsKKworICAgIGZvciAoaT0wOyBpIDwgZmF1bHRoYW5kbGVyX25zaWduYWxzOyBpKyspIHsKKyAgICAgICAgZmF1bHRfaGFuZGxlcl90ICpoYW5kbGVyOworI2lmZGVmIEhBVkVfU0lHQUNUSU9OCisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOworI2VuZGlmCisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaGFuZGxlciA9ICZmYXVsdGhhbmRsZXJfaGFuZGxlcnNbaV07CisgICAgICAgIGFzc2VydCghaGFuZGxlci0+ZW5hYmxlZCk7CisjaWZkZWYgSEFWRV9TSUdBQ1RJT04KKyAgICAgICAgYWN0aW9uLnNhX2hhbmRsZXIgPSBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3I7CisgICAgICAgIHNpZ2VtcHR5c2V0KCZhY3Rpb24uc2FfbWFzayk7CisgICAgICAgIC8qIERvIG5vdCBwcmV2ZW50IHRoZSBzaWduYWwgZnJvbSBiZWluZyByZWNlaXZlZCBmcm9tIHdpdGhpbgorICAgICAgICAgICBpdHMgb3duIHNpZ25hbCBoYW5kbGVyICovCisgICAgICAgIGFjdGlvbi5zYV9mbGFncyA9IFNBX05PREVGRVI7CisjaWZkZWYgSEFWRV9TSUdBTFRTVEFDSworICAgICAgICBpZiAoc3RhY2suc3Nfc3AgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogQ2FsbCB0aGUgc2lnbmFsIGhhbmRsZXIgb24gYW4gYWx0ZXJuYXRlIHNpZ25hbCBzdGFjaworICAgICAgICAgICAgICAgcHJvdmlkZWQgYnkgc2lnYWx0c3RhY2soKSAqLworICAgICAgICAgICAgYWN0aW9uLnNhX2ZsYWdzIHw9IFNBX09OU1RBQ0s7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBlcnIgPSBzaWdhY3Rpb24oaGFuZGxlci0+c2lnbnVtLCAmYWN0aW9uLCAmaGFuZGxlci0+cHJldmlvdXMpOworI2Vsc2UKKyAgICAgICAgaGFuZGxlci0+cHJldmlvdXMgPSBzaWduYWwoaGFuZGxlci0+c2lnbnVtLAorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcik7CisgICAgICAgIGVyciA9IChoYW5kbGVyLT5wcmV2aW91cyA9PSBTSUdfRVJSKTsKKyNlbmRpZgorICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfUnVudGltZUVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZXItPmVuYWJsZWQgPSAxOworICAgIH0KKworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICBBZGRWZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoMSwgZmF1bHRoYW5kbGVyX2V4Y19oYW5kbGVyKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgUHlPYmplY3QqCi1mYXVsdGhhbmRsZXJfZW5hYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK2ZhdWx0aGFuZGxlcl9weV9lbmFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmlsZSIsICJhbGxfdGhyZWFkcyIsIE5VTEx9OwogICAgIFB5T2JqZWN0ICpmaWxlID0gTlVMTDsKICAgICBpbnQgYWxsX3RocmVhZHMgPSAxOwotICAgIHVuc2lnbmVkIGludCBpOwotICAgIGZhdWx0X2hhbmRsZXJfdCAqaGFuZGxlcjsKLSNpZmRlZiBIQVZFX1NJR0FDVElPTgotICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOwotI2VuZGlmCi0gICAgaW50IGVycjsKICAgICBpbnQgZmQ7CiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwogCkBAIC0zODYsMzcgKzQ5MywxMCBAQAogICAgIGZhdGFsX2Vycm9yLmFsbF90aHJlYWRzID0gYWxsX3RocmVhZHM7CiAgICAgZmF0YWxfZXJyb3IuaW50ZXJwID0gdHN0YXRlLT5pbnRlcnA7CiAKLSAgICBpZiAoIWZhdGFsX2Vycm9yLmVuYWJsZWQpIHsKLSAgICAgICAgZmF0YWxfZXJyb3IuZW5hYmxlZCA9IDE7Ci0KLSAgICAgICAgZm9yIChpPTA7IGkgPCBmYXVsdGhhbmRsZXJfbnNpZ25hbHM7IGkrKykgewotICAgICAgICAgICAgaGFuZGxlciA9ICZmYXVsdGhhbmRsZXJfaGFuZGxlcnNbaV07Ci0jaWZkZWYgSEFWRV9TSUdBQ1RJT04KLSAgICAgICAgICAgIGFjdGlvbi5zYV9oYW5kbGVyID0gZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yOwotICAgICAgICAgICAgc2lnZW1wdHlzZXQoJmFjdGlvbi5zYV9tYXNrKTsKLSAgICAgICAgICAgIC8qIERvIG5vdCBwcmV2ZW50IHRoZSBzaWduYWwgZnJvbSBiZWluZyByZWNlaXZlZCBmcm9tIHdpdGhpbgotICAgICAgICAgICAgICAgaXRzIG93biBzaWduYWwgaGFuZGxlciAqLwotICAgICAgICAgICAgYWN0aW9uLnNhX2ZsYWdzID0gU0FfTk9ERUZFUjsKLSNpZmRlZiBIQVZFX1NJR0FMVFNUQUNLCi0gICAgICAgICAgICBpZiAoc3RhY2suc3Nfc3AgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIENhbGwgdGhlIHNpZ25hbCBoYW5kbGVyIG9uIGFuIGFsdGVybmF0ZSBzaWduYWwgc3RhY2sKLSAgICAgICAgICAgICAgICAgICBwcm92aWRlZCBieSBzaWdhbHRzdGFjaygpICovCi0gICAgICAgICAgICAgICAgYWN0aW9uLnNhX2ZsYWdzIHw9IFNBX09OU1RBQ0s7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGVyciA9IHNpZ2FjdGlvbihoYW5kbGVyLT5zaWdudW0sICZhY3Rpb24sICZoYW5kbGVyLT5wcmV2aW91cyk7Ci0jZWxzZQotICAgICAgICAgICAgaGFuZGxlci0+cHJldmlvdXMgPSBzaWduYWwoaGFuZGxlci0+c2lnbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yKTsKLSAgICAgICAgICAgIGVyciA9IChoYW5kbGVyLT5wcmV2aW91cyA9PSBTSUdfRVJSKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19SdW50aW1lRXJyb3IpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlci0+ZW5hYmxlZCA9IDE7Ci0gICAgICAgIH0KKyAgICBpZiAoZmF1bHRoYW5kbGVyX2VuYWJsZSgpIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIApAQCAtNDMwLDE0ICs1MTAsNyBAQAogICAgICAgICBmYXRhbF9lcnJvci5lbmFibGVkID0gMDsKICAgICAgICAgZm9yIChpPTA7IGkgPCBmYXVsdGhhbmRsZXJfbnNpZ25hbHM7IGkrKykgewogICAgICAgICAgICAgaGFuZGxlciA9ICZmYXVsdGhhbmRsZXJfaGFuZGxlcnNbaV07Ci0gICAgICAgICAgICBpZiAoIWhhbmRsZXItPmVuYWJsZWQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0jaWZkZWYgSEFWRV9TSUdBQ1RJT04KLSAgICAgICAgICAgICh2b2lkKXNpZ2FjdGlvbihoYW5kbGVyLT5zaWdudW0sICZoYW5kbGVyLT5wcmV2aW91cywgTlVMTCk7Ci0jZWxzZQotICAgICAgICAgICAgKHZvaWQpc2lnbmFsKGhhbmRsZXItPnNpZ251bSwgaGFuZGxlci0+cHJldmlvdXMpOwotI2VuZGlmCi0gICAgICAgICAgICBoYW5kbGVyLT5lbmFibGVkID0gMDsKKyAgICAgICAgICAgIGZhdWx0aGFuZGxlcl9kaXNhYmxlX2ZhdGFsX2hhbmRsZXIoaGFuZGxlcik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ2OSw3ICs1NDIsNiBAQAogewogICAgIFB5TG9ja1N0YXR1cyBzdDsKICAgICBjb25zdCBjaGFyKiBlcnJtc2c7Ci0gICAgUHlUaHJlYWRTdGF0ZSAqY3VycmVudDsKICAgICBpbnQgb2s7CiAjaWYgZGVmaW5lZChIQVZFX1BUSFJFQURfU0lHTUFTSykgJiYgIWRlZmluZWQoSEFWRV9CUk9LRU5fUFRIUkVBRF9TSUdNQVNLKQogICAgIHNpZ3NldF90IHNldDsKQEAgLTQ4OSwxMiArNTYxLDkgQEAKICAgICAgICAgLyogVGltZW91dCA9PiBkdW1wIHRyYWNlYmFjayAqLwogICAgICAgICBhc3NlcnQoc3QgPT0gUFlfTE9DS19GQUlMVVJFKTsKIAotICAgICAgICAvKiBnZXQgdGhlIHRocmVhZCBob2xkaW5nIHRoZSBHSUwsIE5VTEwgaWYgbm8gdGhyZWFkIGhvbGQgdGhlIEdJTCAqLwotICAgICAgICBjdXJyZW50ID0gX1B5VGhyZWFkU3RhdGVfVW5jaGVja2VkR2V0KCk7Ci0KICAgICAgICAgX1B5X3dyaXRlX25vcmFpc2UodGhyZWFkLmZkLCB0aHJlYWQuaGVhZGVyLCAoaW50KXRocmVhZC5oZWFkZXJfbGVuKTsKIAotICAgICAgICBlcnJtc2cgPSBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHModGhyZWFkLmZkLCB0aHJlYWQuaW50ZXJwLCBjdXJyZW50KTsKKyAgICAgICAgZXJybXNnID0gX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKHRocmVhZC5mZCwgdGhyZWFkLmludGVycCwgTlVMTCk7CiAgICAgICAgIG9rID0gKGVycm1zZyA9PSBOVUxMKTsKIAogICAgICAgICBpZiAodGhyZWFkLmV4aXQpCkBAIC04OTQsNyArOTYzLDcgQEAKIGZhdWx0aGFuZGxlcl9zaWdzZWd2KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBpbnQgcmVsZWFzZV9naWwgPSAwOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X3JlYWRfbnVsbCIsICZyZWxlYXNlX2dpbCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfc2lnc2VndiIsICZyZWxlYXNlX2dpbCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKHJlbGVhc2VfZ2lsKSB7CkBAIC05MDcsNiArOTc2LDQ5IEBACiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorc3RhdGljIHZvaWQKK2ZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcl90aHJlYWQodm9pZCAqcGxvY2spCit7CisgICAgUHlUaHJlYWRfdHlwZV9sb2NrICpsb2NrID0gKFB5VGhyZWFkX3R5cGVfbG9jayAqKXBsb2NrOworCisgICAgUHlfRmF0YWxFcnJvcigiaW4gbmV3IHRocmVhZCIpOworCisgICAgLyogbm90aWZ5IHRoZSBjYWxsZXIgdGhhdCB3ZSBhcmUgZG9uZSAqLworICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhsb2NrKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2ZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcl9jX3RocmVhZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgbG9uZyB0aHJlYWQ7CisgICAgUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2s7CisKKyAgICBmYXVsdGhhbmRsZXJfc3VwcHJlc3NfY3Jhc2hfcmVwb3J0KCk7CisKKyAgICBsb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmIChsb2NrID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworCisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGxvY2ssIFdBSVRfTE9DSyk7CisKKyAgICB0aHJlYWQgPSBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcl90aHJlYWQsIGxvY2spOworICAgIGlmICh0aHJlYWQgPT0gLTEpIHsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKGxvY2spOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAidW5hYmxlIHRvIHN0YXJ0IHRoZSB0aHJlYWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogd2FpdCB1bnRpbCB0aGUgdGhyZWFkIGNvbXBsZXRlczogaXQgd2lsbCBuZXZlciBvY2N1ciwgc2luY2UgUHlfRmF0YWxFcnJvcigpCisgICAgICAgZXhpdHMgdGhlIHByb2Nlc3MgaW1tZWRpYWx0eS4gKi8KKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2sobG9jaywgV0FJVF9MT0NLKTsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2sobG9jayk7CisgICAgUHlUaHJlYWRfZnJlZV9sb2NrKGxvY2spOworCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisjZW5kaWYKKwogc3RhdGljIFB5T2JqZWN0ICoKIGZhdWx0aGFuZGxlcl9zaWdmcGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewpAQCAtOTUxLDYgKzEwNjMsOCBAQAogfQogCiAjaWYgZGVmaW5lZChIQVZFX1NJR0FMVFNUQUNLKSAmJiBkZWZpbmVkKEhBVkVfU0lHQUNUSU9OKQorI2RlZmluZSBGQVVMVEhBTkRMRVJfU1RBQ0tfT1ZFUkZMT1cKKwogI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKICAgIC8qIElzc3VlICMyMzY1NDogVHVybiBvZmYgSUNDJ3MgdGFpbCBjYWxsIG9wdGltaXphdGlvbiBmb3IgdGhlCiAgICAgKiBzdGFja19vdmVyZmxvdyBnZW5lcmF0b3IuIElDQyB0dXJucyB0aGUgcmVjdXJzaXZlIHRhaWwgY2FsbCBpbnRvCkBAIC05NTgsMTIgKzEwNzIsMTIgQEAKICMgIHByYWdtYSBpbnRlbCBvcHRpbWl6YXRpb25fbGV2ZWwgMAogI2VuZGlmCiBzdGF0aWMKLVB5X3VpbnRwdHJfdAotc3RhY2tfb3ZlcmZsb3coUHlfdWludHB0cl90IG1pbl9zcCwgUHlfdWludHB0cl90IG1heF9zcCwgc2l6ZV90ICpkZXB0aCkKK3VpbnRwdHJfdAorc3RhY2tfb3ZlcmZsb3codWludHB0cl90IG1pbl9zcCwgdWludHB0cl90IG1heF9zcCwgc2l6ZV90ICpkZXB0aCkKIHsKICAgICAvKiBhbGxvY2F0ZSA0MDk2IGJ5dGVzIG9uIHRoZSBzdGFjayBhdCBlYWNoIGNhbGwgKi8KICAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls0MDk2XTsKLSAgICBQeV91aW50cHRyX3Qgc3AgPSAoUHlfdWludHB0cl90KSZidWZmZXI7CisgICAgdWludHB0cl90IHNwID0gKHVpbnRwdHJfdCkmYnVmZmVyOwogICAgICpkZXB0aCArPSAxOwogICAgIGlmIChzcCA8IG1pbl9zcCB8fCBtYXhfc3AgPCBzcCkKICAgICAgICAgcmV0dXJuIHNwOwpAQCAtOTc2LDggKzEwOTAsOCBAQAogZmF1bHRoYW5kbGVyX3N0YWNrX292ZXJmbG93KFB5T2JqZWN0ICpzZWxmKQogewogICAgIHNpemVfdCBkZXB0aCwgc2l6ZTsKLSAgICBQeV91aW50cHRyX3Qgc3AgPSAoUHlfdWludHB0cl90KSZkZXB0aDsKLSAgICBQeV91aW50cHRyX3Qgc3RvcDsKKyAgICB1aW50cHRyX3Qgc3AgPSAodWludHB0cl90KSZkZXB0aDsKKyAgICB1aW50cHRyX3Qgc3RvcDsKIAogICAgIGZhdWx0aGFuZGxlcl9zdXBwcmVzc19jcmFzaF9yZXBvcnQoKTsKICAgICBkZXB0aCA9IDA7CkBAIC05OTQsNyArMTEwOCw3IEBACiAgICAgICAgIHNpemUsIGRlcHRoKTsKICAgICByZXR1cm4gTlVMTDsKIH0KLSNlbmRpZgorI2VuZGlmICAgLyogZGVmaW5lZChIQVZFX1NJR0FMVFNUQUNLKSAmJiBkZWZpbmVkKEhBVkVfU0lHQUNUSU9OKSAqLwogCiAKIHN0YXRpYyBpbnQKQEAgLTEwMTcsMTIgKzExMzEsMjUgQEAKICAgICByZXR1cm4gMDsKIH0KIAorI2lmZGVmIE1TX1dJTkRPV1MKK3N0YXRpYyBQeU9iamVjdCAqCitmYXVsdGhhbmRsZXJfcmFpc2VfZXhjZXB0aW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY29kZSwgZmxhZ3MgPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSXxJOl9yYWlzZV9leGNlcHRpb24iLCAmY29kZSwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmF1bHRoYW5kbGVyX3N1cHByZXNzX2NyYXNoX3JlcG9ydCgpOworICAgIFJhaXNlRXhjZXB0aW9uKGNvZGUsIGZsYWdzLCAwLCBOVUxMKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKyNlbmRpZgorCiBQeURvY19TVFJWQVIobW9kdWxlX2RvYywKICJmYXVsdGhhbmRsZXIgbW9kdWxlLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKICAgICB7ImVuYWJsZSIsCi0gICAgIChQeUNGdW5jdGlvbilmYXVsdGhhbmRsZXJfZW5hYmxlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKKyAgICAgKFB5Q0Z1bmN0aW9uKWZhdWx0aGFuZGxlcl9weV9lbmFibGUsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAogICAgICBQeURvY19TVFIoImVuYWJsZShmaWxlPXN5cy5zdGRlcnIsIGFsbF90aHJlYWRzPVRydWUpOiAiCiAgICAgICAgICAgICAgICAiZW5hYmxlIHRoZSBmYXVsdCBoYW5kbGVyIil9LAogICAgIHsiZGlzYWJsZSIsIChQeUNGdW5jdGlvbilmYXVsdGhhbmRsZXJfZGlzYWJsZV9weSwgTUVUSF9OT0FSR1MsCkBAIC0xMDY1LDE2ICsxMTkyLDI1IEBACiAgICAgICAgICAgICAgICAiYSBTSUdTRUdWIG9yIFNJR0JVUyBzaWduYWwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSIpfSwKICAgICB7Il9zaWdzZWd2IiwgZmF1bHRoYW5kbGVyX3NpZ3NlZ3YsIE1FVEhfVkFSQVJHUywKICAgICAgUHlEb2NfU1RSKCJfc2lnc2VndihyZWxlYXNlX2dpbD1GYWxzZSk6IHJhaXNlIGEgU0lHU0VHViBzaWduYWwiKX0sCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICB7Il9mYXRhbF9lcnJvcl9jX3RocmVhZCIsIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcl9jX3RocmVhZCwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiZmF0YWxfZXJyb3JfY190aHJlYWQoKTogIgorICAgICAgICAgICAgICAgImNhbGwgUHlfRmF0YWxFcnJvcigpIGluIGEgbmV3IEMgdGhyZWFkLiIpfSwKKyNlbmRpZgogICAgIHsiX3NpZ2FicnQiLCBmYXVsdGhhbmRsZXJfc2lnYWJydCwgTUVUSF9OT0FSR1MsCiAgICAgIFB5RG9jX1NUUigiX3NpZ2FicnQoKTogcmFpc2UgYSBTSUdBQlJUIHNpZ25hbCIpfSwKICAgICB7Il9zaWdmcGUiLCAoUHlDRnVuY3Rpb24pZmF1bHRoYW5kbGVyX3NpZ2ZwZSwgTUVUSF9OT0FSR1MsCiAgICAgIFB5RG9jX1NUUigiX3NpZ2ZwZSgpOiByYWlzZSBhIFNJR0ZQRSBzaWduYWwiKX0sCiAgICAgeyJfZmF0YWxfZXJyb3IiLCBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3JfcHksIE1FVEhfVkFSQVJHUywKICAgICAgUHlEb2NfU1RSKCJfZmF0YWxfZXJyb3IobWVzc2FnZSk6IGNhbGwgUHlfRmF0YWxFcnJvcihtZXNzYWdlKSIpfSwKLSNpZiBkZWZpbmVkKEhBVkVfU0lHQUxUU1RBQ0spICYmIGRlZmluZWQoSEFWRV9TSUdBQ1RJT04pCisjaWZkZWYgRkFVTFRIQU5ETEVSX1NUQUNLX09WRVJGTE9XCiAgICAgeyJfc3RhY2tfb3ZlcmZsb3ciLCAoUHlDRnVuY3Rpb24pZmF1bHRoYW5kbGVyX3N0YWNrX292ZXJmbG93LCBNRVRIX05PQVJHUywKICAgICAgUHlEb2NfU1RSKCJfc3RhY2tfb3ZlcmZsb3coKTogcmVjdXJzaXZlIGNhbGwgdG8gcmFpc2UgYSBzdGFjayBvdmVyZmxvdyIpfSwKICNlbmRpZgorI2lmZGVmIE1TX1dJTkRPV1MKKyAgICB7Il9yYWlzZV9leGNlcHRpb24iLCBmYXVsdGhhbmRsZXJfcmFpc2VfZXhjZXB0aW9uLCBNRVRIX1ZBUkFSR1MsCisgICAgIFB5RG9jX1NUUigicmFpc2VfZXhjZXB0aW9uKGNvZGUsIGZsYWdzPTApOiBDYWxsIFJhaXNlRXhjZXB0aW9uKGNvZGUsIGZsYWdzKS4iKX0sCisjZW5kaWYKICAgICB7TlVMTCwgTlVMTH0gIC8qIHNlbnRpbmVsICovCiB9OwogCkBAIC0xMDkzLDcgKzEyMjksMzMgQEAKIFB5TU9ESU5JVF9GVU5DCiBQeUluaXRfZmF1bHRoYW5kbGVyKHZvaWQpCiB7Ci0gICAgcmV0dXJuIFB5TW9kdWxlX0NyZWF0ZSgmbW9kdWxlX2RlZik7CisgICAgUHlPYmplY3QgKm0gPSBQeU1vZHVsZV9DcmVhdGUoJm1vZHVsZV9kZWYpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogQWRkIGNvbnN0YW50cyBmb3IgdW5pdCB0ZXN0cyAqLworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAvKiBSYWlzZUV4Y2VwdGlvbigpIGNvZGVzIChwcmVmaXhlZCBieSBhbiB1bmRlcnNjb3JlKSAqLworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX0VYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9FWENFUFRJT05fSU5UX0RJVklERV9CWV9aRVJPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX0VYQ0VQVElPTl9TVEFDS19PVkVSRkxPVyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTl9TVEFDS19PVkVSRkxPVykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogUmFpc2VFeGNlcHRpb24oKSBmbGFncyAocHJlZml4ZWQgYnkgYW4gdW5kZXJzY29yZSkgKi8KKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9FWENFUFRJT05fTk9OQ09OVElOVUFCTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT05fTk9OQ09OVElOVUFCTEUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9FWENFUFRJT05fTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTikpCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisKKyAgICByZXR1cm4gbTsKIH0KIAogLyogQ2FsbCBmYXVsdGhhbmRsZXIuZW5hYmxlKCkgaWYgdGhlIFBZVEhPTkZBVUxUSEFORExFUiBlbnZpcm9ubWVudCB2YXJpYWJsZQpAQCAtMTEyOCw3ICsxMjkwLDcgQEAKICAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICByZXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKG1vZHVsZSwgJlB5SWRfZW5hYmxlLCAiIik7CisgICAgcmVzID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChtb2R1bGUsICZQeUlkX2VuYWJsZSwgTlVMTCk7CiAgICAgUHlfREVDUkVGKG1vZHVsZSk7CiAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2djbW9kdWxlLmMgYi9Nb2R1bGVzL2djbW9kdWxlLmMKaW5kZXggY2I3MjIyZC4uMDc5NTBhNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nY21vZHVsZS5jCisrKyBiL01vZHVsZXMvZ2Ntb2R1bGUuYwpAQCAtNzM4LDcgKzczOCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1kZWJ1Z19jeWNsZShjaGFyICptc2csIFB5T2JqZWN0ICpvcCkKK2RlYnVnX2N5Y2xlKGNvbnN0IGNoYXIgKm1zZywgUHlPYmplY3QgKm9wKQogewogICAgIFB5U3lzX0Zvcm1hdFN0ZGVycigiZ2M6ICVzIDwlcyAlcD5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgUHlfVFlQRShvcCktPnRwX25hbWUsIG9wKTsKQEAgLTg5Miw2ICs4OTIsNyBAQAogICAgICh2b2lkKVB5TGlzdF9DbGVhckZyZWVMaXN0KCk7CiAgICAgKHZvaWQpUHlEaWN0X0NsZWFyRnJlZUxpc3QoKTsKICAgICAodm9pZClQeVNldF9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlBc3luY0dlbl9DbGVhckZyZWVMaXN0cygpOwogfQogCiAvKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uLiAgUmVhZCB0aGlzIHRvIHVuZGVyc3RhbmQgaG93IHRoZQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRhZGRyaW5mby5jIGIvTW9kdWxlcy9nZXRhZGRyaW5mby5jCmluZGV4IGQ4MTY3ZWEuLmI2ZmI1M2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0YWRkcmluZm8uYworKysgYi9Nb2R1bGVzL2dldGFkZHJpbmZvLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFkZHJpbmZvICosIGludCk7CiBzdGF0aWMgaW50IHN0cl9pc251bWJlcihjb25zdCBjaGFyICopOwogCi1zdGF0aWMgY2hhciAqYWlfZXJybGlzdFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhaV9lcnJsaXN0W10gPSB7CiAgICAgInN1Y2Nlc3MuIiwKICAgICAiYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQuIiwgICAgICAgLyogRUFJX0FERFJGQU1JTFkgKi8KICAgICAidGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsICAgICAgICAgICAgLyogRUFJX0FHQUlOICAgICAgKi8KQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAjZGVmaW5lIEVSUihlcnIpIHsgZXJyb3IgPSAoZXJyKTsgZ290byBiYWQ7IH0KIAotY2hhciAqCitjb25zdCBjaGFyICoKIGdhaV9zdHJlcnJvcihpbnQgZWNvZGUpCiB7CiAgICAgaWYgKGVjb2RlIDwgMCB8fCBlY29kZSA+IEVBSV9NQVgpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldHBhdGguYyBiL01vZHVsZXMvZ2V0cGF0aC5jCmluZGV4IDE4ZGViNjAuLjY1YjQ3YTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0cGF0aC5jCisrKyBiL01vZHVsZXMvZ2V0cGF0aC5jCkBAIC00NjAsOCArNDYwLDggQEAKIHsKICAgICBleHRlcm4gd2NoYXJfdCAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7CiAKLSAgICBzdGF0aWMgd2NoYXJfdCBkZWxpbWl0ZXJbMl0gPSB7REVMSU0sICdcMCd9OwotICAgIHN0YXRpYyB3Y2hhcl90IHNlcGFyYXRvclsyXSA9IHtTRVAsICdcMCd9OworICAgIHN0YXRpYyBjb25zdCB3Y2hhcl90IGRlbGltaXRlclsyXSA9IHtERUxJTSwgJ1wwJ307CisgICAgc3RhdGljIGNvbnN0IHdjaGFyX3Qgc2VwYXJhdG9yWzJdID0ge1NFUCwgJ1wwJ307CiAgICAgY2hhciAqX3J0cHlwYXRoID0gUHlfR0VURU5WKCJQWVRIT05QQVRIIik7IC8qIFhYWCB1c2Ugd2lkZSB2ZXJzaW9uIG9uIFdpbmRvd3MgKi8KICAgICB3Y2hhcl90ICpydHB5cGF0aCA9IE5VTEw7CiAgICAgd2NoYXJfdCAqaG9tZSA9IFB5X0dldFB5dGhvbkhvbWUoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ3JwbW9kdWxlLmMgYi9Nb2R1bGVzL2dycG1vZHVsZS5jCmluZGV4IDNhMTM0YTAuLjk0MzdhZTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ3JwbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9ncnBtb2R1bGUuYwpAQCAtMTAwLDE0ICsxMDAsMjUgQEAKICAgICBnaWRfdCBnaWQ7CiAgICAgc3RydWN0IGdyb3VwICpwOwogCi0gICAgcHlfaW50X2lkID0gUHlOdW1iZXJfTG9uZyhpZCk7Ci0gICAgaWYgKCFweV9pbnRfaWQpCisgICAgaWYgKCFfUHlfR2lkX0NvbnZlcnRlcihpZCwgJmdpZCkpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICghX1B5X0dpZF9Db252ZXJ0ZXIocHlfaW50X2lkLCAmZ2lkKSkgeworICAgICAgICB9CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwIGlkIG11c3QgYmUgaW50LCBub3QgJS4yMDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+b2JfdHlwZS0+dHBfbmFtZSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBweV9pbnRfaWQgPSBQeU51bWJlcl9Mb25nKGlkKTsKKyAgICAgICAgaWYgKCFweV9pbnRfaWQpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFfUHlfR2lkX0NvbnZlcnRlcihweV9pbnRfaWQsICZnaWQpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocHlfaW50X2lkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRihweV9pbnRfaWQpOwotICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlfREVDUkVGKHB5X2ludF9pZCk7CiAKICAgICBpZiAoKHAgPSBnZXRncmdpZChnaWQpKSA9PSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICpnaWRfb2JqID0gX1B5TG9uZ19Gcm9tR2lkKGdpZCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2hhc2hsaWIuaCBiL01vZHVsZXMvaGFzaGxpYi5oCmluZGV4IDM1ODA0NTMuLjUzMGI2YjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaGFzaGxpYi5oCisrKyBiL01vZHVsZXMvaGFzaGxpYi5oCkBAIC0yLDMwICsyLDMzIEBACiAKIC8qCiAgKiBHaXZlbiBhIFB5T2JqZWN0KiBvYmosIGZpbGwgaW4gdGhlIFB5X2J1ZmZlciogdmlld3Agd2l0aCB0aGUgcmVzdWx0Ci0gKiBvZiBQeU9iamVjdF9HZXRCdWZmZXIuICBTZXRzIGFuIGV4Y2VwdGlvbiBhbmQgaXNzdWVzIGEgcmV0dXJuIE5VTEwKLSAqIG9uIGFueSBlcnJvcnMuCisgKiBvZiBQeU9iamVjdF9HZXRCdWZmZXIuICBTZXRzIGFuIGV4Y2VwdGlvbiBhbmQgaXNzdWVzIHRoZSBlcnJhY3Rpb24KKyAqIG9uIGFueSBlcnJvcnMsIGUuZy4gJ3JldHVybiBOVUxMJyBvciAnZ290byBlcnJvcicuCiAgKi8KLSNkZWZpbmUgR0VUX0JVRkZFUl9WSUVXX09SX0VSUk9VVChvYmosIHZpZXdwKSBkbyB7IFwKKyNkZWZpbmUgR0VUX0JVRkZFUl9WSUVXX09SX0VSUk9SKG9iaiwgdmlld3AsIGVycmFjdGlvbikgZG8geyBcCiAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soKG9iaikpKSB7IFwKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pY29kZS1vYmplY3RzIG11c3QgYmUgZW5jb2RlZCBiZWZvcmUgaGFzaGluZyIpO1wKLSAgICAgICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgICAgICAgICBlcnJhY3Rpb247IFwKICAgICAgICAgfSBcCiAgICAgICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIoKG9iaikpKSB7IFwKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IHN1cHBvcnRpbmcgdGhlIGJ1ZmZlciBBUEkgcmVxdWlyZWQiKTsgXAotICAgICAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICAgICAgICAgIGVycmFjdGlvbjsgXAogICAgICAgICB9IFwKICAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcigob2JqKSwgKHZpZXdwKSwgUHlCVUZfU0lNUExFKSA9PSAtMSkgeyBcCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgICAgICAgICAgZXJyYWN0aW9uOyBcCiAgICAgICAgIH0gXAogICAgICAgICBpZiAoKHZpZXdwKS0+bmRpbSA+IDEpIHsgXAogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0J1ZmZlckVycm9yLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBtdXN0IGJlIHNpbmdsZSBkaW1lbnNpb24iKTsgXAogICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgodmlld3ApKTsgXAotICAgICAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICAgICAgICAgIGVycmFjdGlvbjsgXAogICAgICAgICB9IFwKLSAgICB9IHdoaWxlKDApOworICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBHRVRfQlVGRkVSX1ZJRVdfT1JfRVJST1VUKG9iaiwgdmlld3ApIFwKKyAgICBHRVRfQlVGRkVSX1ZJRVdfT1JfRVJST1Iob2JqLCB2aWV3cCwgcmV0dXJuIE5VTEwpCiAKIC8qCiAgKiBIZWxwZXIgY29kZSB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIGhhc2ggb2JqZWN0IHdoZW4gdGhlIEdJTCBpcwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9oYXNodGFibGUuYyBiL01vZHVsZXMvaGFzaHRhYmxlLmMKaW5kZXggZmRkZGMxOS4uMzQ2MmZlZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9oYXNodGFibGUuYworKysgYi9Nb2R1bGVzL2hhc2h0YWJsZS5jCkBAIC0xLDUgKzEsNSBAQAotLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBoYXNoIHRhYmxlIChfUHlfaGFzaHRhYmxlX3QpIGlzIGJhc2VkIG9uIHRoZSBjZnVoYXNoCi0gICBwcm9qZWN0OgorLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBoYXNoIHRhYmxlIChfUHlfaGFzaHRhYmxlX3QpIGlzIGJhc2VkIG9uIHRoZQorICAgY2Z1aGFzaCBwcm9qZWN0OgogICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJjZnUvCiAKICAgIENvcHlyaWdodCBvZiBjZnVoYXNoOgpAQCAtNTksNyArNTksMjEgQEAKICNkZWZpbmUgRU5UUllfTkVYVChFTlRSWSkgXAogICAgICAgICAoKF9QeV9oYXNodGFibGVfZW50cnlfdCAqKV9QeV9TTElTVF9JVEVNX05FWFQoRU5UUlkpKQogI2RlZmluZSBIQVNIVEFCTEVfSVRFTV9TSVpFKEhUKSBcCi0gICAgICAgIChzaXplb2YoX1B5X2hhc2h0YWJsZV9lbnRyeV90KSArIChIVCktPmRhdGFfc2l6ZSkKKyAgICAgICAgKHNpemVvZihfUHlfaGFzaHRhYmxlX2VudHJ5X3QpICsgKEhUKS0+a2V5X3NpemUgKyAoSFQpLT5kYXRhX3NpemUpCisKKyNkZWZpbmUgRU5UUllfUkVBRF9QREFUQShUQUJMRSwgRU5UUlksIERBVEFfU0laRSwgUERBVEEpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgYXNzZXJ0KChEQVRBX1NJWkUpID09IChUQUJMRSktPmRhdGFfc2l6ZSk7IFwKKyAgICAgICAgUHlfTUVNQ1BZKChQREFUQSksIF9QeV9IQVNIVEFCTEVfRU5UUllfUERBVEEoVEFCTEUsIChFTlRSWSkpLCBcCisgICAgICAgICAgICAgICAgICAoREFUQV9TSVpFKSk7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEVOVFJZX1dSSVRFX1BEQVRBKFRBQkxFLCBFTlRSWSwgREFUQV9TSVpFLCBQREFUQSkgXAorICAgIGRvIHsgXAorICAgICAgICBhc3NlcnQoKERBVEFfU0laRSkgPT0gKFRBQkxFKS0+ZGF0YV9zaXplKTsgXAorICAgICAgICBQeV9NRU1DUFkoKHZvaWQgKilfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKChUQUJMRSksIChFTlRSWSkpLCBcCisgICAgICAgICAgICAgICAgICAoUERBVEEpLCAoREFUQV9TSVpFKSk7IFwKKyAgICB9IHdoaWxlICgwKQogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCiBzdGF0aWMgdm9pZCBoYXNodGFibGVfcmVoYXNoKF9QeV9oYXNodGFibGVfdCAqaHQpOwpAQCAtNzAsNiArODQsNyBAQAogICAgIGxpc3QtPmhlYWQgPSBOVUxMOwogfQogCisKIHN0YXRpYyB2b2lkCiBfUHlfc2xpc3RfcHJlcGVuZChfUHlfc2xpc3RfdCAqbGlzdCwgX1B5X3NsaXN0X2l0ZW1fdCAqaXRlbSkKIHsKQEAgLTc3LDYgKzkyLDcgQEAKICAgICBsaXN0LT5oZWFkID0gaXRlbTsKIH0KIAorCiBzdGF0aWMgdm9pZAogX1B5X3NsaXN0X3JlbW92ZShfUHlfc2xpc3RfdCAqbGlzdCwgX1B5X3NsaXN0X2l0ZW1fdCAqcHJldmlvdXMsCiAgICAgICAgICAgICAgICAgIF9QeV9zbGlzdF9pdGVtX3QgKml0ZW0pCkBAIC04NywyNCArMTAzLDI2IEBACiAgICAgICAgIGxpc3QtPmhlYWQgPSBpdGVtLT5uZXh0OwogfQogCi1QeV91aGFzaF90Ci1fUHlfaGFzaHRhYmxlX2hhc2hfaW50KGNvbnN0IHZvaWQgKmtleSkKLXsKLSAgICByZXR1cm4gKFB5X3VoYXNoX3Qpa2V5OwotfQogCiBQeV91aGFzaF90Ci1fUHlfaGFzaHRhYmxlX2hhc2hfcHRyKGNvbnN0IHZvaWQgKmtleSkKK19QeV9oYXNodGFibGVfaGFzaF9wdHIoc3RydWN0IF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKnBrZXkpCiB7Ci0gICAgcmV0dXJuIChQeV91aGFzaF90KV9QeV9IYXNoUG9pbnRlcigodm9pZCAqKWtleSk7CisgICAgdm9pZCAqa2V5OworCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwga2V5KTsKKyAgICByZXR1cm4gKFB5X3VoYXNoX3QpX1B5X0hhc2hQb2ludGVyKGtleSk7CiB9CiAKKwogaW50Ci1fUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KGNvbnN0IHZvaWQgKmtleSwgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSkKK19QeV9oYXNodGFibGVfY29tcGFyZV9kaXJlY3QoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSkKIHsKLSAgICByZXR1cm4gZW50cnktPmtleSA9PSBrZXk7CisgICAgY29uc3Qgdm9pZCAqcGtleTIgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX1BLRVkoZW50cnkpOworICAgIHJldHVybiAobWVtY21wKHBrZXksIHBrZXkyLCBodC0+a2V5X3NpemUpID09IDApOwogfQogCisKIC8qIG1ha2VzIHN1cmUgdGhlIHJlYWwgc2l6ZSBvZiB0aGUgYnVja2V0cyBhcnJheSBpcyBhIHBvd2VyIG9mIDIgKi8KIHN0YXRpYyBzaXplX3QKIHJvdW5kX3NpemUoc2l6ZV90IHMpCkBAIC0xMTgsMTMgKzEzNiwxMiBAQAogICAgIHJldHVybiBpOwogfQogCisKIF9QeV9oYXNodGFibGVfdCAqCi1fUHlfaGFzaHRhYmxlX25ld19mdWxsKHNpemVfdCBkYXRhX3NpemUsIHNpemVfdCBpbml0X3NpemUsCitfUHlfaGFzaHRhYmxlX25ld19mdWxsKHNpemVfdCBrZXlfc2l6ZSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluaXRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMgaGFzaF9mdW5jLAogICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYyBjb21wYXJlX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfY29weV9kYXRhX2Z1bmMgY29weV9kYXRhX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZnJlZV9kYXRhX2Z1bmMgZnJlZV9kYXRhX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZ2V0X2RhdGFfc2l6ZV9mdW5jIGdldF9kYXRhX3NpemVfZnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdCAqYWxsb2NhdG9yKQogewogICAgIF9QeV9oYXNodGFibGVfdCAqaHQ7CkBAIC0xNDQsNiArMTYxLDcgQEAKIAogICAgIGh0LT5udW1fYnVja2V0cyA9IHJvdW5kX3NpemUoaW5pdF9zaXplKTsKICAgICBodC0+ZW50cmllcyA9IDA7CisgICAgaHQtPmtleV9zaXplID0ga2V5X3NpemU7CiAgICAgaHQtPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKIAogICAgIGJ1Y2tldHNfc2l6ZSA9IGh0LT5udW1fYnVja2V0cyAqIHNpemVvZihodC0+YnVja2V0c1swXSk7CkBAIC0xNTYsMjggKzE3NCwyNyBAQAogCiAgICAgaHQtPmhhc2hfZnVuYyA9IGhhc2hfZnVuYzsKICAgICBodC0+Y29tcGFyZV9mdW5jID0gY29tcGFyZV9mdW5jOwotICAgIGh0LT5jb3B5X2RhdGFfZnVuYyA9IGNvcHlfZGF0YV9mdW5jOwotICAgIGh0LT5mcmVlX2RhdGFfZnVuYyA9IGZyZWVfZGF0YV9mdW5jOwotICAgIGh0LT5nZXRfZGF0YV9zaXplX2Z1bmMgPSBnZXRfZGF0YV9zaXplX2Z1bmM7CiAgICAgaHQtPmFsbG9jID0gYWxsb2M7CiAgICAgcmV0dXJuIGh0OwogfQogCisKIF9QeV9oYXNodGFibGVfdCAqCi1fUHlfaGFzaHRhYmxlX25ldyhzaXplX3QgZGF0YV9zaXplLAorX1B5X2hhc2h0YWJsZV9uZXcoc2l6ZV90IGtleV9zaXplLCBzaXplX3QgZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMgaGFzaF9mdW5jLAogICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMgY29tcGFyZV9mdW5jKQogewotICAgIHJldHVybiBfUHlfaGFzaHRhYmxlX25ld19mdWxsKGRhdGFfc2l6ZSwgSEFTSFRBQkxFX01JTl9TSVpFLAorICAgIHJldHVybiBfUHlfaGFzaHRhYmxlX25ld19mdWxsKGtleV9zaXplLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFTSFRBQkxFX01JTl9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfZnVuYywgY29tcGFyZV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogfQogCisKIHNpemVfdAogX1B5X2hhc2h0YWJsZV9zaXplKF9QeV9oYXNodGFibGVfdCAqaHQpCiB7CiAgICAgc2l6ZV90IHNpemU7Ci0gICAgc2l6ZV90IGh2OwogCiAgICAgc2l6ZSA9IHNpemVvZihfUHlfaGFzaHRhYmxlX3QpOwogCkBAIC0xODcsMjIgKzIwNCwxMCBAQAogICAgIC8qIGVudHJpZXMgKi8KICAgICBzaXplICs9IGh0LT5lbnRyaWVzICogSEFTSFRBQkxFX0lURU1fU0laRShodCk7CiAKLSAgICAvKiBkYXRhIGxpbmtlZCBmcm9tIGVudHJpZXMgKi8KLSAgICBpZiAoaHQtPmdldF9kYXRhX3NpemVfZnVuYykgewotICAgICAgICBmb3IgKGh2ID0gMDsgaHYgPCBodC0+bnVtX2J1Y2tldHM7IGh2KyspIHsKLSAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnk7Ci0KLSAgICAgICAgICAgIGZvciAoZW50cnkgPSBUQUJMRV9IRUFEKGh0LCBodik7IGVudHJ5OyBlbnRyeSA9IEVOVFJZX05FWFQoZW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgdm9pZCAqZGF0YTsKLQotICAgICAgICAgICAgICAgIGRhdGEgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEFfQVNfVk9JRF9QKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBzaXplICs9IGh0LT5nZXRfZGF0YV9zaXplX2Z1bmMoZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CiAgICAgcmV0dXJuIHNpemU7CiB9CiAKKwogI2lmZGVmIFB5X0RFQlVHCiB2b2lkCiBfUHlfaGFzaHRhYmxlX3ByaW50X3N0YXRzKF9QeV9oYXNodGFibGVfdCAqaHQpCkBAIC0yNDMsMzggKzI0OCw0NSBAQAogfQogI2VuZGlmCiAKLS8qIEdldCBhbiBlbnRyeS4gUmV0dXJuIE5VTEwgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdC4gKi8KKwogX1B5X2hhc2h0YWJsZV9lbnRyeV90ICoKLV9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKmtleSkKK19QeV9oYXNodGFibGVfZ2V0X2VudHJ5KF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qga2V5X3NpemUsIGNvbnN0IHZvaWQgKnBrZXkpCiB7CiAgICAgUHlfdWhhc2hfdCBrZXlfaGFzaDsKICAgICBzaXplX3QgaW5kZXg7CiAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeTsKIAotICAgIGtleV9oYXNoID0gaHQtPmhhc2hfZnVuYyhrZXkpOworICAgIGFzc2VydChrZXlfc2l6ZSA9PSBodC0+a2V5X3NpemUpOworCisgICAga2V5X2hhc2ggPSBodC0+aGFzaF9mdW5jKGh0LCBwa2V5KTsKICAgICBpbmRleCA9IGtleV9oYXNoICYgKGh0LT5udW1fYnVja2V0cyAtIDEpOwogCiAgICAgZm9yIChlbnRyeSA9IFRBQkxFX0hFQUQoaHQsIGluZGV4KTsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBFTlRSWV9ORVhUKGVudHJ5KSkgewotICAgICAgICBpZiAoZW50cnktPmtleV9oYXNoID09IGtleV9oYXNoICYmIGh0LT5jb21wYXJlX2Z1bmMoa2V5LCBlbnRyeSkpCisgICAgICAgIGlmIChlbnRyeS0+a2V5X2hhc2ggPT0ga2V5X2hhc2ggJiYgaHQtPmNvbXBhcmVfZnVuYyhodCwgcGtleSwgZW50cnkpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgcmV0dXJuIGVudHJ5OwogfQogCisKIHN0YXRpYyBpbnQKLV9oYXNodGFibGVfcG9wX2VudHJ5KF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkKK19QeV9oYXNodGFibGVfcG9wX2VudHJ5KF9QeV9oYXNodGFibGVfdCAqaHQsIHNpemVfdCBrZXlfc2l6ZSwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpCiB7CiAgICAgUHlfdWhhc2hfdCBrZXlfaGFzaDsKICAgICBzaXplX3QgaW5kZXg7CiAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgKnByZXZpb3VzOwogCi0gICAga2V5X2hhc2ggPSBodC0+aGFzaF9mdW5jKGtleSk7CisgICAgYXNzZXJ0KGtleV9zaXplID09IGh0LT5rZXlfc2l6ZSk7CisKKyAgICBrZXlfaGFzaCA9IGh0LT5oYXNoX2Z1bmMoaHQsIHBrZXkpOwogICAgIGluZGV4ID0ga2V5X2hhc2ggJiAoaHQtPm51bV9idWNrZXRzIC0gMSk7CiAKICAgICBwcmV2aW91cyA9IE5VTEw7CiAgICAgZm9yIChlbnRyeSA9IFRBQkxFX0hFQUQoaHQsIGluZGV4KTsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBFTlRSWV9ORVhUKGVudHJ5KSkgewotICAgICAgICBpZiAoZW50cnktPmtleV9oYXNoID09IGtleV9oYXNoICYmIGh0LT5jb21wYXJlX2Z1bmMoa2V5LCBlbnRyeSkpCisgICAgICAgIGlmIChlbnRyeS0+a2V5X2hhc2ggPT0ga2V5X2hhc2ggJiYgaHQtPmNvbXBhcmVfZnVuYyhodCwgcGtleSwgZW50cnkpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIHByZXZpb3VzID0gZW50cnk7CiAgICAgfQpAQCAtMjg3LDcgKzI5OSw3IEBACiAgICAgaHQtPmVudHJpZXMtLTsKIAogICAgIGlmIChkYXRhICE9IE5VTEwpCi0gICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKGh0LCBkYXRhLCBkYXRhX3NpemUsIGVudHJ5KTsKKyAgICAgICAgRU5UUllfUkVBRF9QREFUQShodCwgZW50cnksIGRhdGFfc2l6ZSwgZGF0YSk7CiAgICAgaHQtPmFsbG9jLmZyZWUoZW50cnkpOwogCiAgICAgaWYgKChmbG9hdClodC0+ZW50cmllcyAvIChmbG9hdClodC0+bnVtX2J1Y2tldHMgPCBIQVNIVEFCTEVfTE9XKQpAQCAtMjk1LDI2ICszMDcsMjcgQEAKICAgICByZXR1cm4gMTsKIH0KIAotLyogQWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBoYXNoLiBUaGUga2V5IG11c3Qgbm90IGJlIHByZXNlbnQgaW4gdGhlIGhhc2ggdGFibGUuCi0gICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBtZW1vcnkgZXJyb3IuICovCisKIGludAotX1B5X2hhc2h0YWJsZV9zZXQoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqa2V5LAotICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkKK19QeV9oYXNodGFibGVfc2V0KF9QeV9oYXNodGFibGVfdCAqaHQsIHNpemVfdCBrZXlfc2l6ZSwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIGNvbnN0IHZvaWQgKmRhdGEpCiB7CiAgICAgUHlfdWhhc2hfdCBrZXlfaGFzaDsKICAgICBzaXplX3QgaW5kZXg7CiAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeTsKIAorICAgIGFzc2VydChrZXlfc2l6ZSA9PSBodC0+a2V5X3NpemUpOworCiAgICAgYXNzZXJ0KGRhdGEgIT0gTlVMTCB8fCBkYXRhX3NpemUgPT0gMCk7CiAjaWZuZGVmIE5ERUJVRwogICAgIC8qIERvbid0IHdyaXRlIHRoZSBhc3NlcnRpb24gb24gYSBzaW5nbGUgbGluZSBiZWNhdXNlIGl0IGlzIGludGVyZXN0aW5nCiAgICAgICAgdG8ga25vdyB0aGUgZHVwbGljYXRlZCBlbnRyeSBpZiB0aGUgYXNzZXJ0aW9uIGZhaWxlZC4gVGhlIGVudHJ5IGNhbgogICAgICAgIGJlIHJlYWQgdXNpbmcgYSBkZWJ1Z2dlci4gKi8KLSAgICBlbnRyeSA9IF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KGh0LCBrZXkpOworICAgIGVudHJ5ID0gX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkoaHQsIGtleV9zaXplLCBwa2V5KTsKICAgICBhc3NlcnQoZW50cnkgPT0gTlVMTCk7CiAjZW5kaWYKIAotICAgIGtleV9oYXNoID0gaHQtPmhhc2hfZnVuYyhrZXkpOworICAgIGtleV9oYXNoID0gaHQtPmhhc2hfZnVuYyhodCwgcGtleSk7CiAgICAgaW5kZXggPSBrZXlfaGFzaCAmIChodC0+bnVtX2J1Y2tldHMgLSAxKTsKIAogICAgIGVudHJ5ID0gaHQtPmFsbG9jLm1hbGxvYyhIQVNIVEFCTEVfSVRFTV9TSVpFKGh0KSk7CkBAIC0zMjMsMTIgKzMzNiwxMCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgZW50cnktPmtleSA9ICh2b2lkICopa2V5OwogICAgIGVudHJ5LT5rZXlfaGFzaCA9IGtleV9oYXNoOwotCi0gICAgYXNzZXJ0KGRhdGFfc2l6ZSA9PSBodC0+ZGF0YV9zaXplKTsKKyAgICBQeV9NRU1DUFkoKHZvaWQgKilfUHlfSEFTSFRBQkxFX0VOVFJZX1BLRVkoZW50cnkpLCBwa2V5LCBodC0+a2V5X3NpemUpOwogICAgIGlmIChkYXRhKQotICAgICAgICBtZW1jcHkoX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBKGVudHJ5KSwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICAgICAgRU5UUllfV1JJVEVfUERBVEEoaHQsIGVudHJ5LCBkYXRhX3NpemUsIGRhdGEpOwogCiAgICAgX1B5X3NsaXN0X3ByZXBlbmQoJmh0LT5idWNrZXRzW2luZGV4XSwgKF9QeV9zbGlzdF9pdGVtX3QqKWVudHJ5KTsKICAgICBodC0+ZW50cmllcysrOwpAQCAtMzM4LDQ4ICszNDksNTAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLyogR2V0IGRhdGEgZnJvbSBhbiBlbnRyeS4gQ29weSBlbnRyeSBkYXRhIGludG8gZGF0YSBhbmQgcmV0dXJuIDEgaWYgdGhlIGVudHJ5Ci0gICBleGlzdHMsIHJldHVybiAwIGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdC4gKi8KKwogaW50Ci1fUHlfaGFzaHRhYmxlX2dldChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpCitfUHlfaGFzaHRhYmxlX2dldChfUHlfaGFzaHRhYmxlX3QgKmh0LCBzaXplX3Qga2V5X3NpemUsY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCiB7CiAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeTsKIAogICAgIGFzc2VydChkYXRhICE9IE5VTEwpOwogCi0gICAgZW50cnkgPSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeShodCwga2V5KTsKKyAgICBlbnRyeSA9IF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KGh0LCBrZXlfc2l6ZSwgcGtleSk7CiAgICAgaWYgKGVudHJ5ID09IE5VTEwpCiAgICAgICAgIHJldHVybiAwOwotICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKGh0LCBkYXRhLCBkYXRhX3NpemUsIGVudHJ5KTsKKyAgICBFTlRSWV9SRUFEX1BEQVRBKGh0LCBlbnRyeSwgZGF0YV9zaXplLCBkYXRhKTsKICAgICByZXR1cm4gMTsKIH0KIAorCiBpbnQKLV9QeV9oYXNodGFibGVfcG9wKF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkKK19QeV9oYXNodGFibGVfcG9wKF9QeV9oYXNodGFibGVfdCAqaHQsIHNpemVfdCBrZXlfc2l6ZSwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCiB7CiAgICAgYXNzZXJ0KGRhdGEgIT0gTlVMTCk7Ci0gICAgYXNzZXJ0KGh0LT5mcmVlX2RhdGFfZnVuYyA9PSBOVUxMKTsKLSAgICByZXR1cm4gX2hhc2h0YWJsZV9wb3BfZW50cnkoaHQsIGtleSwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICByZXR1cm4gX1B5X2hhc2h0YWJsZV9wb3BfZW50cnkoaHQsIGtleV9zaXplLCBwa2V5LCBkYXRhLCBkYXRhX3NpemUpOwogfQogCi0vKiBEZWxldGUgYW4gZW50cnkuIFRoZSBlbnRyeSBtdXN0IGV4aXN0LiAqLworCisvKiBDb2RlIGNvbW1lbnRlZCBzaW5jZSB0aGUgZnVuY3Rpb24gaXMgbm90IG5lZWRlZCBpbiBQeXRob24gKi8KKyNpZiAwCiB2b2lkCi1fUHlfaGFzaHRhYmxlX2RlbGV0ZShfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICprZXkpCitfUHlfaGFzaHRhYmxlX2RlbGV0ZShfUHlfaGFzaHRhYmxlX3QgKmh0LCBzaXplX3Qga2V5X3NpemUsIGNvbnN0IHZvaWQgKnBrZXkpCiB7CiAjaWZuZGVmIE5ERUJVRwotICAgIGludCBmb3VuZCA9IF9oYXNodGFibGVfcG9wX2VudHJ5KGh0LCBrZXksIE5VTEwsIDApOworICAgIGludCBmb3VuZCA9IF9QeV9oYXNodGFibGVfcG9wX2VudHJ5KGh0LCBrZXlfc2l6ZSwgcGtleSwgTlVMTCwgMCk7CiAgICAgYXNzZXJ0KGZvdW5kKTsKICNlbHNlCi0gICAgKHZvaWQpX2hhc2h0YWJsZV9wb3BfZW50cnkoaHQsIGtleSwgTlVMTCwgMCk7CisgICAgKHZvaWQpX1B5X2hhc2h0YWJsZV9wb3BfZW50cnkoaHQsIGtleV9zaXplLCBwa2V5LCBOVUxMLCAwKTsKICNlbmRpZgogfQorI2VuZGlmCiAKLS8qIFByb3RvdHlwZSBmb3IgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGZvcmVhY2gKLSAgIGtleS92YWx1ZSBwYWlyIGluIHRoZSBoYXNoIGJ5IGhhc2h0YWJsZV9mb3JlYWNoKCkuICBJdGVyYXRpb24KLSAgIHN0b3BzIGlmIGEgbm9uLXplcm8gdmFsdWUgaXMgcmV0dXJuZWQuICovCisKIGludAogX1B5X2hhc2h0YWJsZV9mb3JlYWNoKF9QeV9oYXNodGFibGVfdCAqaHQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICgqZnVuYykgKF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKmFyZyksCisgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9mb3JlYWNoX2Z1bmMgZnVuYywKICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpCiB7CiAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeTsKQEAgLTM4Nyw3ICs0MDAsNyBAQAogCiAgICAgZm9yIChodiA9IDA7IGh2IDwgaHQtPm51bV9idWNrZXRzOyBodisrKSB7CiAgICAgICAgIGZvciAoZW50cnkgPSBUQUJMRV9IRUFEKGh0LCBodik7IGVudHJ5OyBlbnRyeSA9IEVOVFJZX05FWFQoZW50cnkpKSB7Ci0gICAgICAgICAgICBpbnQgcmVzID0gZnVuYyhlbnRyeSwgYXJnKTsKKyAgICAgICAgICAgIGludCByZXMgPSBmdW5jKGh0LCBlbnRyeSwgYXJnKTsKICAgICAgICAgICAgIGlmIChyZXMpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQpAQCAtMzk1LDYgKzQwOCw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIHZvaWQKIGhhc2h0YWJsZV9yZWhhc2goX1B5X2hhc2h0YWJsZV90ICpodCkKIHsKQEAgLTQyNiw3ICs0NDAsOCBAQAogICAgICAgICBmb3IgKGVudHJ5ID0gQlVDS0VUU19IRUFEKG9sZF9idWNrZXRzW2J1Y2tldF0pOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IG5leHQpIHsKICAgICAgICAgICAgIHNpemVfdCBlbnRyeV9pbmRleDsKIAotICAgICAgICAgICAgYXNzZXJ0KGh0LT5oYXNoX2Z1bmMoZW50cnktPmtleSkgPT0gZW50cnktPmtleV9oYXNoKTsKKworICAgICAgICAgICAgYXNzZXJ0KGh0LT5oYXNoX2Z1bmMoaHQsIF9QeV9IQVNIVEFCTEVfRU5UUllfUEtFWShlbnRyeSkpID09IGVudHJ5LT5rZXlfaGFzaCk7CiAgICAgICAgICAgICBuZXh0ID0gRU5UUllfTkVYVChlbnRyeSk7CiAgICAgICAgICAgICBlbnRyeV9pbmRleCA9IGVudHJ5LT5rZXlfaGFzaCAmIChuZXdfc2l6ZSAtIDEpOwogCkBAIC00MzcsNiArNDUyLDcgQEAKICAgICBodC0+YWxsb2MuZnJlZShvbGRfYnVja2V0cyk7CiB9CiAKKwogdm9pZAogX1B5X2hhc2h0YWJsZV9jbGVhcihfUHlfaGFzaHRhYmxlX3QgKmh0KQogewpAQCAtNDQ2LDggKzQ2Miw2IEBACiAgICAgZm9yIChpPTA7IGkgPCBodC0+bnVtX2J1Y2tldHM7IGkrKykgewogICAgICAgICBmb3IgKGVudHJ5ID0gVEFCTEVfSEVBRChodCwgaSk7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gbmV4dCkgewogICAgICAgICAgICAgbmV4dCA9IEVOVFJZX05FWFQoZW50cnkpOwotICAgICAgICAgICAgaWYgKGh0LT5mcmVlX2RhdGFfZnVuYykKLSAgICAgICAgICAgICAgICBodC0+ZnJlZV9kYXRhX2Z1bmMoX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBX0FTX1ZPSURfUChlbnRyeSkpOwogICAgICAgICAgICAgaHQtPmFsbG9jLmZyZWUoZW50cnkpOwogICAgICAgICB9CiAgICAgICAgIF9QeV9zbGlzdF9pbml0KCZodC0+YnVja2V0c1tpXSk7CkBAIC00NTYsNiArNDcwLDcgQEAKICAgICBoYXNodGFibGVfcmVoYXNoKGh0KTsKIH0KIAorCiB2b2lkCiBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3koX1B5X2hhc2h0YWJsZV90ICpodCkKIHsKQEAgLTQ2NSw4ICs0ODAsNiBAQAogICAgICAgICBfUHlfc2xpc3RfaXRlbV90ICplbnRyeSA9IGh0LT5idWNrZXRzW2ldLmhlYWQ7CiAgICAgICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgICAgICAgX1B5X3NsaXN0X2l0ZW1fdCAqZW50cnlfbmV4dCA9IGVudHJ5LT5uZXh0OwotICAgICAgICAgICAgaWYgKGh0LT5mcmVlX2RhdGFfZnVuYykKLSAgICAgICAgICAgICAgICBodC0+ZnJlZV9kYXRhX2Z1bmMoX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBX0FTX1ZPSURfUChlbnRyeSkpOwogICAgICAgICAgICAgaHQtPmFsbG9jLmZyZWUoZW50cnkpOwogICAgICAgICAgICAgZW50cnkgPSBlbnRyeV9uZXh0OwogICAgICAgICB9CkBAIC00NzYsMzkgKzQ4OSwzMSBAQAogICAgIGh0LT5hbGxvYy5mcmVlKGh0KTsKIH0KIAotLyogUmV0dXJuIGEgY29weSBvZiB0aGUgaGFzaCB0YWJsZSAqLworCiBfUHlfaGFzaHRhYmxlX3QgKgogX1B5X2hhc2h0YWJsZV9jb3B5KF9QeV9oYXNodGFibGVfdCAqc3JjKQogeworICAgIGNvbnN0IHNpemVfdCBrZXlfc2l6ZSA9IHNyYy0+a2V5X3NpemU7CisgICAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSA9IHNyYy0+ZGF0YV9zaXplOwogICAgIF9QeV9oYXNodGFibGVfdCAqZHN0OwogICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnk7CiAgICAgc2l6ZV90IGJ1Y2tldDsKICAgICBpbnQgZXJyOwotICAgIHZvaWQgKmRhdGEsICpuZXdfZGF0YTsKIAotICAgIGRzdCA9IF9QeV9oYXNodGFibGVfbmV3X2Z1bGwoc3JjLT5kYXRhX3NpemUsIHNyYy0+bnVtX2J1Y2tldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5oYXNoX2Z1bmMsIHNyYy0+Y29tcGFyZV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+Y29weV9kYXRhX2Z1bmMsIHNyYy0+ZnJlZV9kYXRhX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5nZXRfZGF0YV9zaXplX2Z1bmMsICZzcmMtPmFsbG9jKTsKKyAgICBkc3QgPSBfUHlfaGFzaHRhYmxlX25ld19mdWxsKGtleV9zaXplLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPm51bV9idWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5oYXNoX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmNvbXBhcmVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmMtPmFsbG9jKTsKICAgICBpZiAoZHN0ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgZm9yIChidWNrZXQ9MDsgYnVja2V0IDwgc3JjLT5udW1fYnVja2V0czsgYnVja2V0KyspIHsKICAgICAgICAgZW50cnkgPSBUQUJMRV9IRUFEKHNyYywgYnVja2V0KTsKICAgICAgICAgZm9yICg7IGVudHJ5OyBlbnRyeSA9IEVOVFJZX05FWFQoZW50cnkpKSB7Ci0gICAgICAgICAgICBpZiAoc3JjLT5jb3B5X2RhdGFfZnVuYykgewotICAgICAgICAgICAgICAgIGRhdGEgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEFfQVNfVk9JRF9QKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBuZXdfZGF0YSA9IHNyYy0+Y29weV9kYXRhX2Z1bmMoZGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld19kYXRhICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IF9QeV9oYXNodGFibGVfc2V0KGRzdCwgZW50cnktPmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X2RhdGEsIHNyYy0+ZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBlcnIgPSBfUHlfaGFzaHRhYmxlX3NldChkc3QsIGVudHJ5LT5rZXksIGRhdGEsIHNyYy0+ZGF0YV9zaXplKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBrZXkgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX1BLRVkoZW50cnkpOworICAgICAgICAgICAgY29uc3Qgdm9pZCAqcGRhdGEgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKHNyYywgZW50cnkpOworICAgICAgICAgICAgZXJyID0gX1B5X2hhc2h0YWJsZV9zZXQoZHN0LCBrZXlfc2l6ZSwgcGtleSwgZGF0YV9zaXplLCBwZGF0YSk7CiAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KGRzdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC01MTcsNCArNTIyLDMgQEAKICAgICB9CiAgICAgcmV0dXJuIGRzdDsKIH0KLQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9oYXNodGFibGUuaCBiL01vZHVsZXMvaGFzaHRhYmxlLmgKaW5kZXggYTlmOTk5My4uMThmZWQwOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9oYXNodGFibGUuaAorKysgYi9Nb2R1bGVzL2hhc2h0YWJsZS5oCkBAIC0xLDkgKzEsMTAgQEAKICNpZm5kZWYgUHlfSEFTSFRBQkxFX0gKICNkZWZpbmUgUHlfSEFTSFRBQkxFX0gKLQogLyogVGhlIHdob2xlIEFQSSBpcyBwcml2YXRlICovCiAjaWZuZGVmIFB5X0xJTUlURURfQVBJCiAKKy8qIFNpbmdsZSBsaW5rZWQgbGlzdCAqLworCiB0eXBlZGVmIHN0cnVjdCBfUHlfc2xpc3RfaXRlbV9zIHsKICAgICBzdHJ1Y3QgX1B5X3NsaXN0X2l0ZW1fcyAqbmV4dDsKIH0gX1B5X3NsaXN0X2l0ZW1fdDsKQEAgLTE2LDMzICsxNyw2NiBAQAogCiAjZGVmaW5lIF9QeV9TTElTVF9IRUFEKFNMSVNUKSAoKChfUHlfc2xpc3RfdCAqKVNMSVNUKS0+aGVhZCkKIAorCisvKiBfUHlfaGFzaHRhYmxlOiB0YWJsZSBlbnRyeSAqLworCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogdXNlZCBieSBfUHlfaGFzaHRhYmxlX3QuYnVja2V0cyB0byBsaW5rIGVudHJpZXMgKi8KICAgICBfUHlfc2xpc3RfaXRlbV90IF9QeV9zbGlzdF9pdGVtOwogCi0gICAgY29uc3Qgdm9pZCAqa2V5OwogICAgIFB5X3VoYXNoX3Qga2V5X2hhc2g7CiAKLSAgICAvKiBkYXRhIGZvbGxvd3MgKi8KKyAgICAvKiBrZXkgKGtleV9zaXplIGJ5dGVzKSBhbmQgdGhlbiBkYXRhIChkYXRhX3NpemUgYnl0ZXMpIGZvbGxvd3MgKi8KIH0gX1B5X2hhc2h0YWJsZV9lbnRyeV90OwogCi0jZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfREFUQShFTlRSWSkgXAotICAgICAgICAoKGNoYXIgKikoRU5UUlkpICsgc2l6ZW9mKF9QeV9oYXNodGFibGVfZW50cnlfdCkpCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfUEtFWShFTlRSWSkgXAorICAgICAgICAoKGNvbnN0IHZvaWQgKikoKGNoYXIgKikoRU5UUlkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKF9QeV9oYXNodGFibGVfZW50cnlfdCkpKQogCi0jZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfREFUQV9BU19WT0lEX1AoRU5UUlkpIFwKLSAgICAgICAgKCoodm9pZCAqKilfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEEoRU5UUlkpKQorI2RlZmluZSBfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKFRBQkxFLCBFTlRSWSkgXAorICAgICAgICAoKGNvbnN0IHZvaWQgKikoKGNoYXIgKikoRU5UUlkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKF9QeV9oYXNodGFibGVfZW50cnlfdCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgKyAoVEFCTEUpLT5rZXlfc2l6ZSkpCiAKLSNkZWZpbmUgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEoVEFCTEUsIERBVEEsIERBVEFfU0laRSwgRU5UUlkpIFwKKy8qIEdldCBhIGtleSB2YWx1ZSBmcm9tIHBrZXk6IHVzZSBtZW1jcHkoKSByYXRoZXIgdGhhbiBhIHBvaW50ZXIgZGVyZWZlcmVuY2UKKyAgIHRvIGF2b2lkIG1lbW9yeSBhbGlnbm1lbnQgaXNzdWVzLiAqLworI2RlZmluZSBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKFRBQkxFLCBQS0VZLCBEU1RfS0VZKSBcCiAgICAgZG8geyBcCi0gICAgICAgIGFzc2VydCgoREFUQV9TSVpFKSA9PSAoVEFCTEUpLT5kYXRhX3NpemUpOyBcCi0gICAgICAgIG1lbWNweShEQVRBLCBfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEEoRU5UUlkpLCBEQVRBX1NJWkUpOyBcCisgICAgICAgIGFzc2VydChzaXplb2YoRFNUX0tFWSkgPT0gKFRBQkxFKS0+a2V5X3NpemUpOyBcCisgICAgICAgIFB5X01FTUNQWSgmKERTVF9LRVkpLCAoUEtFWSksIHNpemVvZihEU1RfS0VZKSk7IFwKICAgICB9IHdoaWxlICgwKQogCi10eXBlZGVmIFB5X3VoYXNoX3QgKCpfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYykgKGNvbnN0IHZvaWQgKmtleSk7Ci10eXBlZGVmIGludCAoKl9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jKSAoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmhlKTsKLXR5cGVkZWYgdm9pZCogKCpfUHlfaGFzaHRhYmxlX2NvcHlfZGF0YV9mdW5jKSh2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoKl9QeV9oYXNodGFibGVfZnJlZV9kYXRhX2Z1bmMpKHZvaWQgKmRhdGEpOwotdHlwZWRlZiBzaXplX3QgKCpfUHlfaGFzaHRhYmxlX2dldF9kYXRhX3NpemVfZnVuYykodm9pZCAqZGF0YSk7CisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoVEFCTEUsIEVOVFJZLCBLRVkpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgYXNzZXJ0KHNpemVvZihLRVkpID09IChUQUJMRSktPmtleV9zaXplKTsgXAorICAgICAgICBQeV9NRU1DUFkoJihLRVkpLCBfUHlfSEFTSFRBQkxFX0VOVFJZX1BLRVkoRU5UUlkpLCBzaXplb2YoS0VZKSk7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKFRBQkxFLCBFTlRSWSwgREFUQSkgXAorICAgIGRvIHsgXAorICAgICAgICBhc3NlcnQoc2l6ZW9mKERBVEEpID09IChUQUJMRSktPmRhdGFfc2l6ZSk7IFwKKyAgICAgICAgUHlfTUVNQ1BZKCYoREFUQSksIF9QeV9IQVNIVEFCTEVfRU5UUllfUERBVEEoVEFCTEUsIChFTlRSWSkpLCBcCisgICAgICAgICAgICAgICAgICBzaXplb2YoREFUQSkpOyBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfUHlfSEFTSFRBQkxFX0VOVFJZX1dSSVRFX0RBVEEoVEFCTEUsIEVOVFJZLCBEQVRBKSBcCisgICAgZG8geyBcCisgICAgICAgIGFzc2VydChzaXplb2YoREFUQSkgPT0gKFRBQkxFKS0+ZGF0YV9zaXplKTsgXAorICAgICAgICBQeV9NRU1DUFkoKHZvaWQgKilfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKChUQUJMRSksIChFTlRSWSkpLCBcCisgICAgICAgICAgICAgICAgICAmKERBVEEpLCBzaXplb2YoREFUQSkpOyBcCisgICAgfSB3aGlsZSAoMCkKKworCisvKiBfUHlfaGFzaHRhYmxlOiBwcm90b3R5cGVzICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0cnVjdCBfUHlfaGFzaHRhYmxlX3Q7CisKK3R5cGVkZWYgUHlfdWhhc2hfdCAoKl9QeV9oYXNodGFibGVfaGFzaF9mdW5jKSAoc3RydWN0IF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBrZXkpOwordHlwZWRlZiBpbnQgKCpfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYykgKHN0cnVjdCBfUHlfaGFzaHRhYmxlX3QgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICpoZSk7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICAvKiBhbGxvY2F0ZSBhIG1lbW9yeSBibG9jayAqLwpAQCAtNTIsNzcgKzg2LDEyNiBAQAogICAgIHZvaWQgKCpmcmVlKSAodm9pZCAqcHRyKTsKIH0gX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgeworCisvKiBfUHlfaGFzaHRhYmxlOiB0YWJsZSAqLworCit0eXBlZGVmIHN0cnVjdCBfUHlfaGFzaHRhYmxlX3QgewogICAgIHNpemVfdCBudW1fYnVja2V0czsKICAgICBzaXplX3QgZW50cmllczsgLyogVG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlLiAqLwogICAgIF9QeV9zbGlzdF90ICpidWNrZXRzOworICAgIHNpemVfdCBrZXlfc2l6ZTsKICAgICBzaXplX3QgZGF0YV9zaXplOwogCiAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMgaGFzaF9mdW5jOwogICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jIGNvbXBhcmVfZnVuYzsKLSAgICBfUHlfaGFzaHRhYmxlX2NvcHlfZGF0YV9mdW5jIGNvcHlfZGF0YV9mdW5jOwotICAgIF9QeV9oYXNodGFibGVfZnJlZV9kYXRhX2Z1bmMgZnJlZV9kYXRhX2Z1bmM7Ci0gICAgX1B5X2hhc2h0YWJsZV9nZXRfZGF0YV9zaXplX2Z1bmMgZ2V0X2RhdGFfc2l6ZV9mdW5jOwogICAgIF9QeV9oYXNodGFibGVfYWxsb2NhdG9yX3QgYWxsb2M7CiB9IF9QeV9oYXNodGFibGVfdDsKIAotLyogaGFzaCBhbmQgY29tcGFyZSBmdW5jdGlvbnMgZm9yIGludGVnZXJzIGFuZCBwb2ludGVycyAqLwotUHlBUElfRlVOQyhQeV91aGFzaF90KSBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyKGNvbnN0IHZvaWQgKmtleSk7Ci1QeUFQSV9GVU5DKFB5X3VoYXNoX3QpIF9QeV9oYXNodGFibGVfaGFzaF9pbnQoY29uc3Qgdm9pZCAqa2V5KTsKLVB5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KGNvbnN0IHZvaWQgKmtleSwgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSk7CisvKiBoYXNoIGEgcG9pbnRlciAodm9pZCopICovCitQeUFQSV9GVU5DKFB5X3VoYXNoX3QpIF9QeV9oYXNodGFibGVfaGFzaF9wdHIoCisgICAgc3RydWN0IF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgY29uc3Qgdm9pZCAqcGtleSk7CisKKy8qIGNvbXBhcmlzb24gdXNpbmcgbWVtY21wKCkgKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KAorICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgY29uc3Qgdm9pZCAqcGtleSwKKyAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KTsKIAogUHlBUElfRlVOQyhfUHlfaGFzaHRhYmxlX3QgKikgX1B5X2hhc2h0YWJsZV9uZXcoCisgICAgc2l6ZV90IGtleV9zaXplLAogICAgIHNpemVfdCBkYXRhX3NpemUsCiAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMgaGFzaF9mdW5jLAogICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jIGNvbXBhcmVfZnVuYyk7CisKIFB5QVBJX0ZVTkMoX1B5X2hhc2h0YWJsZV90ICopIF9QeV9oYXNodGFibGVfbmV3X2Z1bGwoCisgICAgc2l6ZV90IGtleV9zaXplLAogICAgIHNpemVfdCBkYXRhX3NpemUsCiAgICAgc2l6ZV90IGluaXRfc2l6ZSwKICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYyBoYXNoX2Z1bmMsCiAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMgY29tcGFyZV9mdW5jLAotICAgIF9QeV9oYXNodGFibGVfY29weV9kYXRhX2Z1bmMgY29weV9kYXRhX2Z1bmMsCi0gICAgX1B5X2hhc2h0YWJsZV9mcmVlX2RhdGFfZnVuYyBmcmVlX2RhdGFfZnVuYywKLSAgICBfUHlfaGFzaHRhYmxlX2dldF9kYXRhX3NpemVfZnVuYyBnZXRfZGF0YV9zaXplX2Z1bmMsCiAgICAgX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdCAqYWxsb2NhdG9yKTsKLVB5QVBJX0ZVTkMoX1B5X2hhc2h0YWJsZV90ICopIF9QeV9oYXNodGFibGVfY29weShfUHlfaGFzaHRhYmxlX3QgKnNyYyk7Ci1QeUFQSV9GVU5DKHZvaWQpIF9QeV9oYXNodGFibGVfY2xlYXIoX1B5X2hhc2h0YWJsZV90ICpodCk7CisKIFB5QVBJX0ZVTkModm9pZCkgX1B5X2hhc2h0YWJsZV9kZXN0cm95KF9QeV9oYXNodGFibGVfdCAqaHQpOwogCi10eXBlZGVmIGludCAoKl9QeV9oYXNodGFibGVfZm9yZWFjaF9mdW5jKSAoX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgdm9pZCAqYXJnKTsKKy8qIFJldHVybiBhIGNvcHkgb2YgdGhlIGhhc2ggdGFibGUgKi8KK1B5QVBJX0ZVTkMoX1B5X2hhc2h0YWJsZV90ICopIF9QeV9oYXNodGFibGVfY29weShfUHlfaGFzaHRhYmxlX3QgKnNyYyk7CiAKK1B5QVBJX0ZVTkModm9pZCkgX1B5X2hhc2h0YWJsZV9jbGVhcihfUHlfaGFzaHRhYmxlX3QgKmh0KTsKKwordHlwZWRlZiBpbnQgKCpfUHlfaGFzaHRhYmxlX2ZvcmVhY2hfZnVuYykgKF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOworCisvKiBDYWxsIGZ1bmMoKSBvbiBlYWNoIGVudHJ5IG9mIHRoZSBoYXNodGFibGUuCisgICBJdGVyYXRpb24gc3RvcHMgaWYgZnVuYygpIHJlc3VsdCBpcyBub24temVybywgaW4gdGhpcyBjYXNlIGl0J3MgdGhlIHJlc3VsdAorICAgb2YgdGhlIGNhbGwuIE90aGVyd2lzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4gKi8KIFB5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX2ZvcmVhY2goCiAgICAgX1B5X2hhc2h0YWJsZV90ICpodCwKLSAgICBfUHlfaGFzaHRhYmxlX2ZvcmVhY2hfZnVuYyBmdW5jLCB2b2lkICphcmcpOworICAgIF9QeV9oYXNodGFibGVfZm9yZWFjaF9mdW5jIGZ1bmMsCisgICAgdm9pZCAqYXJnKTsKKwogUHlBUElfRlVOQyhzaXplX3QpIF9QeV9oYXNodGFibGVfc2l6ZShfUHlfaGFzaHRhYmxlX3QgKmh0KTsKIAotUHlBUElfRlVOQyhfUHlfaGFzaHRhYmxlX2VudHJ5X3QqKSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeSgKLSAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAotICAgIGNvbnN0IHZvaWQgKmtleSk7CisvKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGhhc2guIFRoZSBrZXkgbXVzdCBub3QgYmUgcHJlc2VudCBpbiB0aGUgaGFzaCB0YWJsZS4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIG1lbW9yeSBlcnJvci4KKworICAgRG9uJ3QgY2FsbCBkaXJlY3RseSB0aGlzIGZ1bmN0aW9uLAorICAgYnV0IHVzZSBfUHlfSEFTSFRBQkxFX1NFVCgpIGFuZCBfUHlfSEFTSFRBQkxFX1NFVF9OT0RBVEEoKSBtYWNyb3MgKi8KIFB5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX3NldCgKICAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAotICAgIGNvbnN0IHZvaWQgKmtleSwKLSAgICB2b2lkICpkYXRhLAotICAgIHNpemVfdCBkYXRhX3NpemUpOwotUHlBUElfRlVOQyhpbnQpIF9QeV9oYXNodGFibGVfZ2V0KAotICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCi0gICAgY29uc3Qgdm9pZCAqa2V5LAotICAgIHZvaWQgKmRhdGEsCi0gICAgc2l6ZV90IGRhdGFfc2l6ZSk7Ci1QeUFQSV9GVU5DKGludCkgX1B5X2hhc2h0YWJsZV9wb3AoCi0gICAgX1B5X2hhc2h0YWJsZV90ICpodCwKLSAgICBjb25zdCB2b2lkICprZXksCi0gICAgdm9pZCAqZGF0YSwKLSAgICBzaXplX3QgZGF0YV9zaXplKTsKLVB5QVBJX0ZVTkModm9pZCkgX1B5X2hhc2h0YWJsZV9kZWxldGUoCi0gICAgX1B5X2hhc2h0YWJsZV90ICpodCwKLSAgICBjb25zdCB2b2lkICprZXkpOworICAgIHNpemVfdCBrZXlfc2l6ZSwKKyAgICBjb25zdCB2b2lkICpwa2V5LAorICAgIHNpemVfdCBkYXRhX3NpemUsCisgICAgY29uc3Qgdm9pZCAqZGF0YSk7CiAKICNkZWZpbmUgX1B5X0hBU0hUQUJMRV9TRVQoVEFCTEUsIEtFWSwgREFUQSkgXAotICAgIF9QeV9oYXNodGFibGVfc2V0KFRBQkxFLCBLRVksICYoREFUQSksIHNpemVvZihEQVRBKSkKKyAgICBfUHlfaGFzaHRhYmxlX3NldChUQUJMRSwgc2l6ZW9mKEtFWSksICYoS0VZKSwgc2l6ZW9mKERBVEEpLCAmKERBVEEpKQorCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfU0VUX05PREFUQShUQUJMRSwgS0VZKSBcCisgICAgX1B5X2hhc2h0YWJsZV9zZXQoVEFCTEUsIHNpemVvZihLRVkpLCAmKEtFWSksIDAsIE5VTEwpCisKKworLyogR2V0IGFuIGVudHJ5LgorICAgUmV0dXJuIE5VTEwgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdC4KKworICAgRG9uJ3QgY2FsbCBkaXJlY3RseSB0aGlzIGZ1bmN0aW9uLCBidXQgdXNlIF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKCkKKyAgIG1hY3JvICovCitQeUFQSV9GVU5DKF9QeV9oYXNodGFibGVfZW50cnlfdCopIF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KAorICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgc2l6ZV90IGtleV9zaXplLAorICAgIGNvbnN0IHZvaWQgKnBrZXkpOworCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKFRBQkxFLCBLRVkpIFwKKyAgICBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeShUQUJMRSwgc2l6ZW9mKEtFWSksICYoS0VZKSkKKworCisvKiBHZXQgZGF0YSBmcm9tIGFuIGVudHJ5LiBDb3B5IGVudHJ5IGRhdGEgaW50byBkYXRhIGFuZCByZXR1cm4gMSBpZiB0aGUgZW50cnkKKyAgIGV4aXN0cywgcmV0dXJuIDAgaWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0LgorCisgICBEb24ndCBjYWxsIGRpcmVjdGx5IHRoaXMgZnVuY3Rpb24sIGJ1dCB1c2UgX1B5X0hBU0hUQUJMRV9HRVQoKSBtYWNybyAqLworUHlBUElfRlVOQyhpbnQpIF9QeV9oYXNodGFibGVfZ2V0KAorICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgc2l6ZV90IGtleV9zaXplLAorICAgIGNvbnN0IHZvaWQgKnBrZXksCisgICAgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICB2b2lkICpkYXRhKTsKIAogI2RlZmluZSBfUHlfSEFTSFRBQkxFX0dFVChUQUJMRSwgS0VZLCBEQVRBKSBcCi0gICAgX1B5X2hhc2h0YWJsZV9nZXQoVEFCTEUsIEtFWSwgJihEQVRBKSwgc2l6ZW9mKERBVEEpKQorICAgIF9QeV9oYXNodGFibGVfZ2V0KFRBQkxFLCBzaXplb2YoS0VZKSwgJihLRVkpLCBzaXplb2YoREFUQSksICYoREFUQSkpCisKKworLyogRG9uJ3QgY2FsbCBkaXJlY3RseSB0aGlzIGZ1bmN0aW9uLCBidXQgdXNlIF9QeV9IQVNIVEFCTEVfUE9QKCkgbWFjcm8gKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX3BvcCgKKyAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAorICAgIHNpemVfdCBrZXlfc2l6ZSwKKyAgICBjb25zdCB2b2lkICpwa2V5LAorICAgIHNpemVfdCBkYXRhX3NpemUsCisgICAgdm9pZCAqZGF0YSk7CisKKyNkZWZpbmUgX1B5X0hBU0hUQUJMRV9QT1AoVEFCTEUsIEtFWSwgREFUQSkgXAorICAgIF9QeV9oYXNodGFibGVfcG9wKFRBQkxFLCBzaXplb2YoS0VZKSwgJihLRVkpLCBzaXplb2YoREFUQSksICYoREFUQSkpCisKIAogI2VuZGlmICAgLyogUHlfTElNSVRFRF9BUEkgKi8KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jIGIvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYwppbmRleCA2ZmYyNDFlLi5jOTY2Mzc2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCisrKyBiL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKQEAgLTEsNCArMSw1IEBACiAKKyNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCkBAIC03LDcgKzgsNyBAQAogKi8KIAogCi0vKiBncm91cGJ5IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGdyb3VwYnkgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKQEAgLTc0LDcgKzc1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBncm91cGJ5X25leHQoZ3JvdXBieW9iamVjdCAqZ2JvKQogewotICAgIFB5T2JqZWN0ICpuZXd2YWx1ZSwgKm5ld2tleSwgKnIsICpncm91cGVyLCAqdG1wOworICAgIFB5T2JqZWN0ICpuZXd2YWx1ZSwgKm5ld2tleSwgKnIsICpncm91cGVyOwogCiAgICAgLyogc2tpcCB0byBuZXh0IGl0ZXJhdGlvbiBncm91cCAqLwogICAgIGZvciAoOzspIHsKQEAgLTg1LDggKzg2LDcgQEAKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBpbnQgcmNtcDsKIAotICAgICAgICAgICAgcmNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChnYm8tPnRndGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2JvLT5jdXJya2V5LCBQeV9FUSk7CisgICAgICAgICAgICByY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGdiby0+dGd0a2V5LCBnYm8tPmN1cnJrZXksIFB5X0VRKTsKICAgICAgICAgICAgIGlmIChyY21wID09IC0xKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgZWxzZSBpZiAocmNtcCA9PSAwKQpAQCAtMTAxLDI3ICsxMDEsMTkgQEAKICAgICAgICAgICAgIG5ld2tleSA9IG5ld3ZhbHVlOwogICAgICAgICAgICAgUHlfSU5DUkVGKG5ld3ZhbHVlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWx1ZSwgTlVMTCk7CisgICAgICAgICAgICBuZXdrZXkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdiby0+a2V5ZnVuYywgbmV3dmFsdWUsIE5VTEwpOwogICAgICAgICAgICAgaWYgKG5ld2tleSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld3ZhbHVlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHRtcCA9IGdiby0+Y3VycmtleTsKLSAgICAgICAgZ2JvLT5jdXJya2V5ID0gbmV3a2V5OwotICAgICAgICBQeV9YREVDUkVGKHRtcCk7Ci0KLSAgICAgICAgdG1wID0gZ2JvLT5jdXJydmFsdWU7Ci0gICAgICAgIGdiby0+Y3VycnZhbHVlID0gbmV3dmFsdWU7Ci0gICAgICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICAgICAgUHlfWFNFVFJFRihnYm8tPmN1cnJrZXksIG5ld2tleSk7CisgICAgICAgIFB5X1hTRVRSRUYoZ2JvLT5jdXJydmFsdWUsIG5ld3ZhbHVlKTsKICAgICB9CiAKICAgICBQeV9JTkNSRUYoZ2JvLT5jdXJya2V5KTsKLSAgICB0bXAgPSBnYm8tPnRndGtleTsKLSAgICBnYm8tPnRndGtleSA9IGdiby0+Y3VycmtleTsKLSAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihnYm8tPnRndGtleSwgZ2JvLT5jdXJya2V5KTsKIAogICAgIGdyb3VwZXIgPSBfZ3JvdXBlcl9jcmVhdGUoZ2JvLCBnYm8tPnRndGtleSk7CiAgICAgaWYgKGdyb3VwZXIgPT0gTlVMTCkKQEAgLTE3Myw3ICsxNjUsNyBAQAogICAgICByZWR1Y2VfZG9jfSwKICAgICB7Il9fc2V0c3RhdGVfXyIsICAgIChQeUNGdW5jdGlvbilncm91cGJ5X3NldHN0YXRlLCAgICBNRVRIX08sCiAgICAgIHNldHN0YXRlX2RvY30sCi0gICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihncm91cGJ5X2RvYywKQEAgLTI5Niw4ICsyODgsNyBAQAogICAgICAgICAgICAgbmV3a2V5ID0gbmV3dmFsdWU7CiAgICAgICAgICAgICBQeV9JTkNSRUYobmV3dmFsdWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3a2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnYm8tPmtleWZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbHVlLCBOVUxMKTsKKyAgICAgICAgICAgIG5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLCBuZXd2YWx1ZSwgTlVMTCk7CiAgICAgICAgICAgICBpZiAobmV3a2V5ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3dmFsdWUpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzI1LDggKzMxNiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2dyb3VwZXJfcmVkdWNlKF9ncm91cGVyb2JqZWN0ICpseikKIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTykiLCBQeV9UWVBFKGx6KSwKLSAgICAgICAgICAgIGx6LT5wYXJlbnQsIGx6LT50Z3RrZXkpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKSIsIFB5X1RZUEUobHopLCBsei0+cGFyZW50LCBsei0+dGd0a2V5KTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIF9ncm91cGVyX21ldGhvZHNbXSA9IHsKQEAgLTM1OSw3ICszNDksNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpX2dyb3VwZXJfdHJhdmVyc2UsLyogdHBfdHJhdmVyc2UgKi8KKyAgICAodHJhdmVyc2Vwcm9jKV9ncm91cGVyX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwpAQCAtMzgwLDggKzM3MCw3IEBACiB9OwogCiAKLQotLyogdGVlIG9iamVjdCBhbmQgd2l0aCBzdXBwb3J0aW5nIGZ1bmN0aW9uIGFuZCBvYmplY3RzICoqKioqKioqKioqKioqKi8KKy8qIHRlZSBvYmplY3QgYW5kIHdpdGggc3VwcG9ydGluZyBmdW5jdGlvbiBhbmQgb2JqZWN0cyAqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogVGhlIHRlZWRhdGFvYmplY3QgcHJlLWFsbG9jYXRlcyBzcGFjZSBmb3IgTElOS0NFTExTIG51bWJlciBvZiBvYmplY3RzLgogICAgVG8gaGVscCB0aGUgb2JqZWN0IGZpdCBuZWF0bHkgaW5zaWRlIGNhY2hlIGxpbmVzIChzcGFjZSBmb3IgMTYgdG8gMzIKQEAgLTM5Niw3ICszODUsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKICAgICBQeU9iamVjdCAqaXQ7Ci0gICAgaW50IG51bXJlYWQ7ICAvKiAwIDw9IG51bXJlYWQgPD0gTElOS0NFTExTICovCisgICAgaW50IG51bXJlYWQ7ICAgICAgICAgICAgICAgIC8qIDAgPD0gbnVtcmVhZCA8PSBMSU5LQ0VMTFMgKi8KICAgICBQeU9iamVjdCAqbmV4dGxpbms7CiAgICAgUHlPYmplY3QgKih2YWx1ZXNbTElOS0NFTExTXSk7CiB9IHRlZWRhdGFvYmplY3Q7CkBAIC00MDQsNyArMzkzLDcgQEAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECiAgICAgdGVlZGF0YW9iamVjdCAqZGF0YW9iajsKLSAgICBpbnQgaW5kZXg7ICAgIC8qIDAgPD0gaW5kZXggPD0gTElOS0NFTExTICovCisgICAgaW50IGluZGV4OyAgICAgICAgICAgICAgICAgIC8qIDAgPD0gaW5kZXggPD0gTElOS0NFTExTICovCiAgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OwogfSB0ZWVvYmplY3Q7CiAKQEAgLTQ2MSw2ICs0NTAsNyBAQAogdGVlZGF0YW9iamVjdF90cmF2ZXJzZSh0ZWVkYXRhb2JqZWN0ICp0ZG8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqIGFyZykKIHsKICAgICBpbnQgaTsKKwogICAgIFB5X1ZJU0lUKHRkby0+aXQpOwogICAgIGZvciAoaSA9IDA7IGkgPCB0ZG8tPm51bXJlYWQ7IGkrKykKICAgICAgICAgUHlfVklTSVQodGRvLT52YWx1ZXNbaV0pOwpAQCAtNTEwLDYgKzUwMCw3IEBACiAgICAgaW50IGk7CiAgICAgLyogY3JlYXRlIGEgdGVtcG9yYXJ5IGxpc3Qgb2YgYWxyZWFkeSBpdGVyYXRlZCB2YWx1ZXMgKi8KICAgICBQeU9iamVjdCAqdmFsdWVzID0gUHlMaXN0X05ldyh0ZG8tPm51bXJlYWQpOworCiAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGZvciAoaT0wIDsgaTx0ZG8tPm51bXJlYWQgOyBpKyspIHsKQEAgLTU3Nyw3ICs1NjgsNyBAQAogUHlEb2NfU1RSVkFSKHRlZWRhdGFvYmplY3RfZG9jLCAiRGF0YSBjb250YWluZXIgY29tbW9uIHRvIG11bHRpcGxlIHRlZSBvYmplY3RzLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHRlZWRhdGFvYmplY3RfdHlwZSA9IHsKLSAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkgICAgICAgICAvKiBNdXN0IGZpbGwgaW4gdHlwZSB2YWx1ZSBsYXRlciAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKSAgICAgICAgICAgICAgICAgLyogTXVzdCBmaWxsIGluIHR5cGUgdmFsdWUgbGF0ZXIgKi8KICAgICAiaXRlcnRvb2xzLl90ZWVfZGF0YW9iamVjdCIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICBzaXplb2YodGVlZGF0YW9iamVjdCksICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KQEAgLTU5Nyw3ICs1ODgsNyBAQAogICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgIC8qIHRwX2ZsYWdzICovCiAgICAgdGVlZGF0YW9iamVjdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAodHJhdmVyc2Vwcm9jKXRlZWRhdGFvYmplY3RfdHJhdmVyc2UsICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgKGlucXVpcnkpdGVlZGF0YW9iamVjdF9jbGVhciwgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwpAQCAtNzUyLDkgKzc0Myw5IEBACiAiSXRlcmF0b3Igd3JhcHBlZCB0byBtYWtlIGl0IGNvcHlhYmxlIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0ZWVfbWV0aG9kc1tdID0gewotICAgIHsiX19jb3B5X18iLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlZV9jb3B5LCAgTUVUSF9OT0FSR1MsIHRlZWNvcHlfZG9jfSwKLSAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbil0ZWVfcmVkdWNlLCAgICAgIE1FVEhfTk9BUkdTLCByZWR1Y2VfZG9jfSwKLSAgICB7Il9fc2V0c3RhdGVfXyIsICAgIChQeUNGdW5jdGlvbil0ZWVfc2V0c3RhdGUsICAgIE1FVEhfTywgc2V0c3RhdGVfZG9jfSwKKyAgICB7Il9fY29weV9fIiwgICAgICAgIChQeUNGdW5jdGlvbil0ZWVfY29weSwgICAgIE1FVEhfTk9BUkdTLCB0ZWVjb3B5X2RvY30sCisgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pdGVlX3JlZHVjZSwgICBNRVRIX05PQVJHUywgcmVkdWNlX2RvY30sCisgICAgeyJfX3NldHN0YXRlX18iLCAgICAoUHlDRnVuY3Rpb24pdGVlX3NldHN0YXRlLCBNRVRIX08sICAgICAgc2V0c3RhdGVfZG9jfSwKICAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIApAQCAtNzg0LDcgKzc3NSw3IEBACiAgICAgKHRyYXZlcnNlcHJvYyl0ZWVfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAoaW5xdWlyeSl0ZWVfY2xlYXIsICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgb2Zmc2V0b2YodGVlb2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIG9mZnNldG9mKHRlZW9iamVjdCwgd2Vha3JlZmxpc3QpLCAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIChpdGVybmV4dGZ1bmMpdGVlX25leHQsICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgdGVlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwpAQCAtODUwLDEyICs4NDEsMTMgQEAKICJ0ZWUoaXRlcmFibGUsIG49MikgLS0+IHR1cGxlIG9mIG4gaW5kZXBlbmRlbnQgaXRlcmF0b3JzLiIpOwogCiAKLS8qIGN5Y2xlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY3ljbGUgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAogICAgIFB5T2JqZWN0ICppdDsKICAgICBQeU9iamVjdCAqc2F2ZWQ7CisgICAgUHlfc3NpemVfdCBpbmRleDsKICAgICBpbnQgZmlyc3RwYXNzOwogfSBjeWNsZW9iamVjdDsKIApAQCAtODk1LDYgKzg4Nyw3IEBACiAgICAgfQogICAgIGx6LT5pdCA9IGl0OwogICAgIGx6LT5zYXZlZCA9IHNhdmVkOworICAgIGx6LT5pbmRleCA9IDA7CiAgICAgbHotPmZpcnN0cGFzcyA9IDA7CiAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopbHo7CkBAIC05MDQsMTUgKzg5NywxNiBAQAogY3ljbGVfZGVhbGxvYyhjeWNsZW9iamVjdCAqbHopCiB7CiAgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0gICAgUHlfWERFQ1JFRihsei0+c2F2ZWQpOwogICAgIFB5X1hERUNSRUYobHotPml0KTsKKyAgICBQeV9YREVDUkVGKGx6LT5zYXZlZCk7CiAgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBjeWNsZV90cmF2ZXJzZShjeWNsZW9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotICAgIFB5X1ZJU0lUKGx6LT5pdCk7CisgICAgaWYgKGx6LT5pdCkKKyAgICAgICAgUHlfVklTSVQobHotPml0KTsKICAgICBQeV9WSVNJVChsei0+c2F2ZWQpOwogICAgIHJldHVybiAwOwogfQpAQCAtOTIxLDU2ICs5MTUsNjkgQEAKIGN5Y2xlX25leHQoY3ljbGVvYmplY3QgKmx6KQogewogICAgIFB5T2JqZWN0ICppdGVtOwotICAgIFB5T2JqZWN0ICppdDsKLSAgICBQeU9iamVjdCAqdG1wOwogCi0gICAgd2hpbGUgKDEpIHsKKyAgICBpZiAobHotPml0ICE9IE5VTEwpIHsKICAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGx6LT5pdCk7CiAgICAgICAgIGlmIChpdGVtICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmICghbHotPmZpcnN0cGFzcyAmJiBQeUxpc3RfQXBwZW5kKGx6LT5zYXZlZCwgaXRlbSkpIHsKKyAgICAgICAgICAgIGlmIChsei0+Zmlyc3RwYXNzKQorICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobHotPnNhdmVkLCBpdGVtKSkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBpdGVtOwogICAgICAgICB9Ci0gICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKLSAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChQeUxpc3RfU2l6ZShsei0+c2F2ZWQpID09IDApCisgICAgICAgIC8qIE5vdGU6ICBTdG9wSXRlcmF0aW9uIGlzIGFscmVhZHkgY2xlYXJlZCBieSBQeUl0ZXJfTmV4dCgpICovCisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihsei0+c2F2ZWQpOwotICAgICAgICBpZiAoaXQgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB0bXAgPSBsei0+aXQ7Ci0gICAgICAgIGx6LT5pdCA9IGl0OwotICAgICAgICBsei0+Zmlyc3RwYXNzID0gMTsKLSAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIFB5X0NMRUFSKGx6LT5pdCk7CiAgICAgfQorICAgIGlmIChQeV9TSVpFKGx6LT5zYXZlZCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShsei0+c2F2ZWQsIGx6LT5pbmRleCk7CisgICAgbHotPmluZGV4Kys7CisgICAgaWYgKGx6LT5pbmRleCA+PSBQeV9TSVpFKGx6LT5zYXZlZCkpCisgICAgICAgIGx6LT5pbmRleCA9IDA7CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIHJldHVybiBpdGVtOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY3ljbGVfcmVkdWNlKGN5Y2xlb2JqZWN0ICpseikKIHsKLSAgICAvKiBDcmVhdGUgYSBuZXcgY3ljbGUgd2l0aCB0aGUgaXRlcmF0b3IgdHVwbGUsIHRoZW4gc2V0Ci0gICAgICogdGhlIHNhdmVkIHN0YXRlIG9uIGl0LgotICAgICAqLwotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE8pKE9pKSIsIFB5X1RZUEUobHopLAotICAgICAgICBsei0+aXQsIGx6LT5zYXZlZCwgbHotPmZpcnN0cGFzcyk7CisgICAgLyogQ3JlYXRlIGEgbmV3IGN5Y2xlIHdpdGggdGhlIGl0ZXJhdG9yIHR1cGxlLCB0aGVuIHNldCB0aGUgc2F2ZWQgc3RhdGUgKi8KKyAgICBpZiAobHotPml0ID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ID0gUHlPYmplY3RfR2V0SXRlcihsei0+c2F2ZWQpOworICAgICAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAobHotPmluZGV4ICE9IDApIHsKKyAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fc2V0c3RhdGVfXyk7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChpdCwgJlB5SWRfX19zZXRzdGF0ZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm4iLCBsei0+aW5kZXgpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE4pKE9pKSIsIFB5X1RZUEUobHopLCBpdCwgbHotPnNhdmVkLCAxKTsKICAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oTykoT2kpIiwgUHlfVFlQRShseiksIGx6LT5pdCwgbHotPnNhdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5maXJzdHBhc3MpOworfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY3ljbGVfc2V0c3RhdGUoY3ljbGVvYmplY3QgKmx6LCBQeU9iamVjdCAqc3RhdGUpCiB7CiAgICAgUHlPYmplY3QgKnNhdmVkPU5VTEw7CiAgICAgaW50IGZpcnN0cGFzczsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoc3RhdGUsICJPaSIsICZzYXZlZCwgJmZpcnN0cGFzcykpCisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoc3RhdGUsICJPIWkiLCAmUHlMaXN0X1R5cGUsICZzYXZlZCwgJmZpcnN0cGFzcykpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIFB5X1hJTkNSRUYoc2F2ZWQpOworICAgIFB5X0lOQ1JFRihzYXZlZCk7CiAgICAgUHlfWFNFVFJFRihsei0+c2F2ZWQsIHNhdmVkKTsKICAgICBsei0+Zmlyc3RwYXNzID0gZmlyc3RwYXNzICE9IDA7CisgICAgbHotPmluZGV4ID0gMDsKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIApAQCAtMTAzOSw3ICsxMDQ2LDcgQEAKICAgICBQeU9iamVjdF9IRUFECiAgICAgUHlPYmplY3QgKmZ1bmM7CiAgICAgUHlPYmplY3QgKml0OwotICAgIGxvbmcgICAgICAgICBzdGFydDsKKyAgICBsb25nIHN0YXJ0OwogfSBkcm9wd2hpbGVvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZHJvcHdoaWxlX3R5cGU7CkBAIC0xMTI5LDggKzExMzYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRyb3B3aGlsZV9yZWR1Y2UoZHJvcHdoaWxlb2JqZWN0ICpseikKIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTylsIiwgUHlfVFlQRShseiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbHotPmZ1bmMsIGx6LT5pdCwgbHotPnN0YXJ0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTylsIiwgUHlfVFlQRShseiksIGx6LT5mdW5jLCBsei0+aXQsIGx6LT5zdGFydCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMTgxLDEzICsxMTg3LDEzIEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIGRyb3B3aGlsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpZHJvcHdoaWxlX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICh0cmF2ZXJzZXByb2MpZHJvcHdoaWxlX3RyYXZlcnNlLCAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIChpdGVybmV4dGZ1bmMpZHJvcHdoaWxlX25leHQsICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0gICAgZHJvcHdoaWxlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBkcm9wd2hpbGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KQEAgLTEyMDgsNyArMTIxNCw3IEBACiAgICAgUHlPYmplY3RfSEVBRAogICAgIFB5T2JqZWN0ICpmdW5jOwogICAgIFB5T2JqZWN0ICppdDsKLSAgICBsb25nICAgICAgICAgc3RvcDsKKyAgICBsb25nIHN0b3A7CiB9IHRha2V3aGlsZW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCB0YWtld2hpbGVfdHlwZTsKQEAgLTEyODMsNyArMTI4OSw3IEBACiAgICAgfQogICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwogICAgIFB5X0RFQ1JFRihnb29kKTsKLSAgICBpZiAob2sgPT0gMSkKKyAgICBpZiAob2sgPiAwKQogICAgICAgICByZXR1cm4gaXRlbTsKICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgaWYgKG9rID09IDApCkBAIC0xMjk0LDE0ICsxMzAwLDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGFrZXdoaWxlX3JlZHVjZSh0YWtld2hpbGVvYmplY3QgKmx6KQogewotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKWwiLCBQeV9UWVBFKGx6KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsei0+ZnVuYywgbHotPml0LCBsei0+c3RvcCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pbCIsIFB5X1RZUEUobHopLCBsei0+ZnVuYywgbHotPml0LCBsei0+c3RvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0YWtld2hpbGVfcmVkdWNlX3NldHN0YXRlKHRha2V3aGlsZW9iamVjdCAqbHosIFB5T2JqZWN0ICpzdGF0ZSkKIHsKICAgICBpbnQgc3RvcCA9IFB5T2JqZWN0X0lzVHJ1ZShzdGF0ZSk7CisKICAgICBpZiAoc3RvcCA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGx6LT5zdG9wID0gc3RvcDsKQEAgLTEzNDUsNyArMTM1MSw3IEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIHRha2V3aGlsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpdGFrZXdoaWxlX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICh0cmF2ZXJzZXByb2MpdGFrZXdoaWxlX3RyYXZlcnNlLCAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCkBAIC0xMzY2LDcgKzEzNzIsNyBAQAogfTsKIAogCi0vKiBpc2xpY2Ugb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGlzbGljZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKQEAgLTE0MDIsNyArMTQwOCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CisgICAgICAgICAgICAgICAgICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciAiCisgICAgICAgICAgICAgICAgICAgImFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTQxNywxNCArMTQyNCwxNiBAQAogICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLiIpOworICAgICAgICAgICAgICAgICAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgIgorICAgICAgICAgICAgICAgICAgICJhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHN0YXJ0PDAgfHwgc3RvcDwtMSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgIkluZGljZXMgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CisgICAgICAgICAgICJJbmRpY2VzIGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgIgorICAgICAgICAgICAiYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTE1MjEsNiArMTUzMCw3IEBACiAgICAgICogdGhlbiAnc2V0c3RhdGUnIHdpdGggdGhlIG5leHQgYW5kIGNvdW50CiAgICAgICovCiAgICAgUHlPYmplY3QgKnN0b3A7CisKICAgICBpZiAobHotPml0ID09IE5VTEwpIHsKICAgICAgICAgUHlPYmplY3QgKmVtcHR5X2xpc3Q7CiAgICAgICAgIFB5T2JqZWN0ICplbXB0eV9pdDsKQEAgLTE1NTAsNiArMTU2MCw3IEBACiBpc2xpY2Vfc2V0c3RhdGUoaXNsaWNlb2JqZWN0ICpseiwgUHlPYmplY3QgKnN0YXRlKQogewogICAgIFB5X3NzaXplX3QgY250ID0gUHlMb25nX0FzU3NpemVfdChzdGF0ZSk7CisKICAgICBpZiAoY250ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGx6LT5jbnQgPSBjbnQ7CkBAIC0xNzY0LDcgKzE3NzUsNyBAQAogfTsKIAogCi0vKiBjaGFpbiBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY2hhaW4gb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRApAQCAtMTg0MCwzMiArMTg1MSwzMiBAQAogICAgIFB5T2JqZWN0ICppdGVtOwogCiAgICAgaWYgKGx6LT5zb3VyY2UgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxyZWFkeSBzdG9wcGVkICovCisgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgLyogYWxyZWFkeSBzdG9wcGVkICovCiAKICAgICBpZiAobHotPmFjdGl2ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IFB5SXRlcl9OZXh0KGx6LT5zb3VyY2UpOwogICAgICAgICBpZiAoaXRlcmFibGUgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlfQ0xFQVIobHotPnNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG1vcmUgaW5wdXQgc291cmNlcyAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIG5vIG1vcmUgaW5wdXQgc291cmNlcyAqLwogICAgICAgICB9CiAgICAgICAgIGx6LT5hY3RpdmUgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKICAgICAgICAgUHlfREVDUkVGKGl0ZXJhYmxlKTsKICAgICAgICAgaWYgKGx6LT5hY3RpdmUgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlfQ0xFQVIobHotPnNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IG5vdCBpdGVyYWJsZSAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGlucHV0IG5vdCBpdGVyYWJsZSAqLwogICAgICAgICB9CiAgICAgfQotICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChsei0+YWN0aXZlKTsKKyAgICBpdGVtID0gKCpQeV9UWVBFKGx6LT5hY3RpdmUpLT50cF9pdGVybmV4dCkobHotPmFjdGl2ZSk7CiAgICAgaWYgKGl0ZW0gIT0gTlVMTCkKICAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IHJhaXNlZCBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBpbnB1dCByYWlzZWQgYW4gZXhjZXB0aW9uICovCiAgICAgfQogICAgIFB5X0NMRUFSKGx6LT5hY3RpdmUpOwotICAgIHJldHVybiBjaGFpbl9uZXh0KGx6KTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVjdXJzZSBhbmQgdXNlIG5leHQgYWN0aXZlICovCisgICAgcmV0dXJuIGNoYWluX25leHQobHopOyAgICAgICAgICAgICAgLyogcmVjdXJzZSBhbmQgdXNlIG5leHQgYWN0aXZlICovCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xODkxLDYgKzE5MDIsNyBAQAogY2hhaW5fc2V0c3RhdGUoY2hhaW5vYmplY3QgKmx6LCBQeU9iamVjdCAqc3RhdGUpCiB7CiAgICAgUHlPYmplY3QgKnNvdXJjZSwgKmFjdGl2ZT1OVUxMOworCiAgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwgIk98TyIsICZzb3VyY2UsICZhY3RpdmUpKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMTkxNSwxMyArMTkyNywxMyBAQAogdGhhdCBldmFsdWF0ZXMgbGF6aWx5LiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgY2hhaW5fbWV0aG9kc1tdID0gewotICAgIHsiZnJvbV9pdGVyYWJsZSIsIChQeUNGdW5jdGlvbikgY2hhaW5fbmV3X2Zyb21faXRlcmFibGUsICAgICAgICAgICAgTUVUSF9PIHwgTUVUSF9DTEFTUywKLSAgICAgICAgY2hhaW5fZnJvbV9pdGVyYWJsZV9kb2N9LAorICAgIHsiZnJvbV9pdGVyYWJsZSIsIChQeUNGdW5jdGlvbikgY2hhaW5fbmV3X2Zyb21faXRlcmFibGUsIE1FVEhfTyB8IE1FVEhfQ0xBU1MsCisgICAgIGNoYWluX2Zyb21faXRlcmFibGVfZG9jfSwKICAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbiljaGFpbl9yZWR1Y2UsICAgICAgTUVUSF9OT0FSR1MsCiAgICAgIHJlZHVjZV9kb2N9LAogICAgIHsiX19zZXRzdGF0ZV9fIiwgICAgKFB5Q0Z1bmN0aW9uKWNoYWluX3NldHN0YXRlLCAgICBNRVRIX08sCiAgICAgIHNldHN0YXRlX2RvY30sCi0gICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY2hhaW5fdHlwZSA9IHsKQEAgLTE5NzMsMTAgKzE5ODUsMTAgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqcG9vbHM7ICAgICAgICAgICAgICAgICAgICAvKiB0dXBsZSBvZiBwb29sIHR1cGxlcyAqLwotICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciBwb29sICovCi0gICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgcHJvZHVjdCBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdCAqcG9vbHM7ICAgICAgICAvKiB0dXBsZSBvZiBwb29sIHR1cGxlcyAqLworICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgIC8qIG9uZSBpbmRleCBwZXIgcG9vbCAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IHByb2R1Y3RvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcHJvZHVjdF90eXBlOwpAQCAtMTk5NSw3ICsyMDA3LDggQEAKICAgICAgICAgUHlPYmplY3QgKnRtcGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKICAgICAgICAgaWYgKHRtcGFyZ3MgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcyh0bXBhcmdzLCBrd2RzLCAifG46cHJvZHVjdCIsIGt3bGlzdCwgJnJlcGVhdCkpIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHModG1wYXJncywga3dkcywgInxuOnByb2R1Y3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZyZXBlYXQpKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYodG1wYXJncyk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtMjI4NCw3ICsyMjk3LDcgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcHJvZHVjdF90eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICJpdGVydG9vbHMucHJvZHVjdCIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KLSAgICBzaXplb2YocHJvZHVjdG9iamVjdCksICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgc2l6ZW9mKHByb2R1Y3RvYmplY3QpLCAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAvKiBtZXRob2RzICovCiAgICAgKGRlc3RydWN0b3IpcHJvZHVjdF9kZWFsbG9jLCAgICAgICAgLyogdHBfZGVhbGxvYyAqLwpAQCAtMjMyNiwxNSArMjMzOSwxNSBAQAogfTsKIAogCi0vKiBjb21iaW5hdGlvbnMgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbWJpbmF0aW9ucyBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLwotICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciByZXN1bHQgZWxlbWVudCAqLwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLSAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGNvbWJpbmF0aW9ucyBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgIC8qIG9uZSBpbmRleCBwZXIgcmVzdWx0IGVsZW1lbnQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IGNvbWJpbmF0aW9uc29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjb21iaW5hdGlvbnNfdHlwZTsKQEAgLTI1NDQsMTcgKzI1NTcsMTYgQEAKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShsei0+cG9vbCk7CiAKLSAgICBpZiAoIVB5VHVwbGVfQ2hlY2soc3RhdGUpIHx8IFB5VHVwbGVfR0VUX1NJWkUoc3RhdGUpICE9IGx6LT5yKQotICAgIHsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soc3RhdGUpIHx8IFB5VHVwbGVfR0VUX1NJWkUoc3RhdGUpICE9IGx6LT5yKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBhcmd1bWVudHMiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykKLSAgICB7CisgICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykgewogICAgICAgICBQeV9zc2l6ZV90IG1heDsKICAgICAgICAgUHlPYmplY3QqIGluZGV4T2JqZWN0ID0gUHlUdXBsZV9HRVRfSVRFTShzdGF0ZSwgaSk7CiAgICAgICAgIFB5X3NzaXplX3QgaW5kZXggPSBQeUxvbmdfQXNTc2l6ZV90KGluZGV4T2JqZWN0KTsKKwogICAgICAgICBpZiAoaW5kZXggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOyAvKiBub3QgYW4gaW50ZWdlciAqLwogICAgICAgICBtYXggPSBpICsgbiAtIGx6LT5yOwpAQCAtMjY0MCw3ICsyNjUyLDcgQEAKIH07CiAKIAotLyogY29tYmluYXRpb25zIHdpdGggcmVwbGFjZW1lbnQgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb21iaW5hdGlvbnMgd2l0aCByZXBsYWNlbWVudCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEVxdWl2YWxlbnQgdG86CiAKQEAgLTI2NzAsMTEgKzI2ODIsMTEgQEAKICovCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIFB5T2JqZWN0ICpwb29sOyAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCisgICAgUHlPYmplY3QgKnBvb2w7ICAgICAgICAgLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KICAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAvKiBvbmUgaW5kZXggcGVyIHJlc3VsdCBlbGVtZW50ICovCiAgICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLSAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGN3ciBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLworICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGN3ciBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gY3dyb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGN3cl90eXBlOwpAQCAtMjY5MSw4ICsyNzAzLDkgQEAKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgc3RhdGljIGNoYXIgKmt3YXJnc1tdID0geyJpdGVyYWJsZSIsICJyIiwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT246Y29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQiLCBrd2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZXJhYmxlLCAmcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT246Y29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3YXJncywgJml0ZXJhYmxlLCAmcikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgcG9vbCA9IFB5U2VxdWVuY2VfVHVwbGUoaXRlcmFibGUpOwpAQCAtMjg1Nyw4ICsyODcwLDcgQEAKICAgICAgICAgaW5kaWNlcyA9IFB5VHVwbGVfTmV3KGx6LT5yKTsKICAgICAgICAgaWYgKCFpbmRpY2VzKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykgewogICAgICAgICAgICAgUHlPYmplY3QqIGluZGV4ID0gUHlMb25nX0Zyb21Tc2l6ZV90KGx6LT5pbmRpY2VzW2ldKTsKICAgICAgICAgICAgIGlmICghaW5kZXgpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW5kaWNlcyk7CkBAIC0yODg0LDEwICsyODk2LDEwIEBACiAgICAgfQogCiAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUobHotPnBvb2wpOwotICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspCi0gICAgeworICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspIHsKICAgICAgICAgUHlPYmplY3QqIGluZGV4T2JqZWN0ID0gUHlUdXBsZV9HRVRfSVRFTShzdGF0ZSwgaSk7CiAgICAgICAgIFB5X3NzaXplX3QgaW5kZXggPSBQeUxvbmdfQXNTc2l6ZV90KGluZGV4T2JqZWN0KTsKKwogICAgICAgICBpZiAoaW5kZXggPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsgLyogbm90IGFuIGludGVnZXIgKi8KICAgICAgICAgLyogY2xhbXAgdGhlIGluZGV4ICovCkBAIC0yOTcxLDcgKzI5ODMsNyBAQAogfTsKIAogCi0vKiBwZXJtdXRhdGlvbnMgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogcGVybXV0YXRpb25zIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiBkZWYgcGVybXV0YXRpb25zKGl0ZXJhYmxlLCByPU5vbmUpOgogICAgICdwZXJtdXRhdGlvbnMocmFuZ2UoMyksIDIpIC0tPiAoMCwxKSAoMCwyKSAoMSwwKSAoMSwyKSAoMiwwKSAoMiwxKScKQEAgLTI5OTgsMTIgKzMwMTAsMTIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLwotICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciBlbGVtZW50IGluIHRoZSBwb29sICovCi0gICAgUHlfc3NpemVfdCAqY3ljbGVzOyAgICAgICAgICAgICAgICAgLyogb25lIHJvbGxvdmVyIGNvdW50ZXIgcGVyIGVsZW1lbnQgaW4gdGhlIHJlc3VsdCAqLwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLSAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIHBlcm11dGF0aW9ucyBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgIC8qIG9uZSBpbmRleCBwZXIgZWxlbWVudCBpbiB0aGUgcG9vbCAqLworICAgIFB5X3NzaXplX3QgKmN5Y2xlczsgICAgIC8qIG9uZSByb2xsb3ZlciBjb3VudGVyIHBlciBlbGVtZW50IGluIHRoZSByZXN1bHQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IHBlcm11dGF0aW9uc29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwZXJtdXRhdGlvbnNfdHlwZTsKQEAgLTMyMTgsNyArMzIzMCw3IEBACiAgICAgICAgIGluZGljZXMgPSBQeVR1cGxlX05ldyhuKTsKICAgICAgICAgaWYgKGluZGljZXMgPT0gTlVMTCkKICAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICBmb3IgKGk9MDsgaTxuOyBpKyspeworICAgICAgICBmb3IgKGk9MDsgaTxuOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0KiBpbmRleCA9IFB5TG9uZ19Gcm9tU3NpemVfdChwby0+aW5kaWNlc1tpXSk7CiAgICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICAgICAgIGdvdG8gZXJyOwpAQCAtMzIyOCw4ICszMjQwLDcgQEAKICAgICAgICAgY3ljbGVzID0gUHlUdXBsZV9OZXcocG8tPnIpOwogICAgICAgICBpZiAoY3ljbGVzID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgZm9yIChpPTA7IGk8cG8tPnI7IGkrKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGk9MCA7IGk8cG8tPnIgOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0KiBpbmRleCA9IFB5TG9uZ19Gcm9tU3NpemVfdChwby0+Y3ljbGVzW2ldKTsKICAgICAgICAgICAgIGlmICghaW5kZXgpCiAgICAgICAgICAgICAgICAgZ290byBlcnI7CkBAIC0zMjU3LDE1ICszMjY4LDEyIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUocG8tPnBvb2wpOwotICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGluZGljZXMpICE9IG4gfHwKLSAgICAgICAgUHlUdXBsZV9HRVRfU0laRShjeWNsZXMpICE9IHBvLT5yKQotICAgIHsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShpbmRpY2VzKSAhPSBuIHx8IFB5VHVwbGVfR0VUX1NJWkUoY3ljbGVzKSAhPSBwby0+cikgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgYXJndW1lbnRzIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGZvciAoaT0wOyBpPG47IGkrKykKLSAgICB7CisgICAgZm9yIChpPTA7IGk8bjsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0KiBpbmRleE9iamVjdCA9IFB5VHVwbGVfR0VUX0lURU0oaW5kaWNlcywgaSk7CiAgICAgICAgIFB5X3NzaXplX3QgaW5kZXggPSBQeUxvbmdfQXNTc2l6ZV90KGluZGV4T2JqZWN0KTsKICAgICAgICAgaWYgKGluZGV4IDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQpAQCAtMzI3OCw4ICszMjg2LDcgQEAKICAgICAgICAgcG8tPmluZGljZXNbaV0gPSBpbmRleDsKICAgICB9CiAKLSAgICBmb3IgKGk9MDsgaTxwby0+cjsgaSsrKQotICAgIHsKKyAgICBmb3IgKGk9MDsgaTxwby0+cjsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0KiBpbmRleE9iamVjdCA9IFB5VHVwbGVfR0VUX0lURU0oY3ljbGVzLCBpKTsKICAgICAgICAgUHlfc3NpemVfdCBpbmRleCA9IFB5TG9uZ19Bc1NzaXplX3QoaW5kZXhPYmplY3QpOwogICAgICAgICBpZiAoaW5kZXggPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCkBAIC0zMzIwLDExICszMzI3LDExIEBACiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcGVybXV0YXRpb25zX3R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIml0ZXJ0b29scy5wZXJtdXRhdGlvbnMiLCAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgIml0ZXJ0b29scy5wZXJtdXRhdGlvbnMiLCAgICAgICAgICAgLyogdHBfbmFtZSAqLwogICAgIHNpemVvZihwZXJtdXRhdGlvbnNvYmplY3QpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKXBlcm11dGF0aW9uc19kZWFsbG9jLCAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChkZXN0cnVjdG9yKXBlcm11dGF0aW9uc19kZWFsbG9jLCAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCkBAIC0zMzQxLDEzICszMzQ4LDEzIEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwotICAgIHBlcm11dGF0aW9uc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYylwZXJtdXRhdGlvbnNfdHJhdmVyc2UsICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIHBlcm11dGF0aW9uc19kb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpcGVybXV0YXRpb25zX3RyYXZlcnNlLC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwotICAgIChpdGVybmV4dGZ1bmMpcGVybXV0YXRpb25zX25leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAoaXRlcm5leHRmdW5jKXBlcm11dGF0aW9uc19uZXh0LCAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgIHBlcm11YXRpb25zX21ldGhvZHMsICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCkBAIC0zMzU4LDExICszMzY1LDExIEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotICAgIHBlcm11dGF0aW9uc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgcGVybXV0YXRpb25zX25ldywgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotLyogYWNjdW11bGF0ZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYWNjdW11bGF0ZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECkBAIC0zNDI5LDkgKzM0MzYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFjY3VtdWxhdGVfbmV4dChhY2N1bXVsYXRlb2JqZWN0ICpseikKIHsKLSAgICBQeU9iamVjdCAqdmFsLCAqb2xkdG90YWwsICpuZXd0b3RhbDsKKyAgICBQeU9iamVjdCAqdmFsLCAqbmV3dG90YWw7CiAKLSAgICB2YWwgPSBQeUl0ZXJfTmV4dChsei0+aXQpOworICAgIHZhbCA9ICgqUHlfVFlQRShsei0+aXQpLT50cF9pdGVybmV4dCkobHotPml0KTsKICAgICBpZiAodmFsID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0zNDQ5LDExICszNDU2LDggQEAKICAgICBpZiAobmV3dG90YWwgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBvbGR0b3RhbCA9IGx6LT50b3RhbDsKLSAgICBsei0+dG90YWwgPSBuZXd0b3RhbDsKLSAgICBQeV9ERUNSRUYob2xkdG90YWwpOwotCiAgICAgUHlfSU5DUkVGKG5ld3RvdGFsKTsKKyAgICBQeV9TRVRSRUYobHotPnRvdGFsLCBuZXd0b3RhbCk7CiAgICAgcmV0dXJuIG5ld3RvdGFsOwogfQogCkBAIC0zNDgwLDcgKzM0ODQsNyBAQAogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKU8iLCBQeV9UWVBFKGx6KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsei0+aXQsIGx6LT5iaW5vcD9sei0+Ymlub3A6UHlfTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsei0+dG90YWw/bHotPnRvdGFsOlB5X05vbmUpOwotIH0KK30KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFjY3VtdWxhdGVfc2V0c3RhdGUoYWNjdW11bGF0ZW9iamVjdCAqbHosIFB5T2JqZWN0ICpzdGF0ZSkKQEAgLTM2NDIsNyArMzY0Niw3IEBACiAKICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoc2VsZWN0b3IpOwogICAgICAgICBQeV9ERUNSRUYoc2VsZWN0b3IpOwotICAgICAgICBpZiAob2sgPT0gMSkKKyAgICAgICAgaWYgKG9rID4gMCkKICAgICAgICAgICAgIHJldHVybiBkYXR1bTsKICAgICAgICAgUHlfREVDUkVGKGRhdHVtKTsKICAgICAgICAgaWYgKG9rIDwgMCkKQEAgLTM2NTUsNyArMzY1OSw3IEBACiB7CiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pIiwgUHlfVFlQRShseiksCiAgICAgICAgIGx6LT5kYXRhLCBsei0+c2VsZWN0b3JzKTsKLSAgICB9Cit9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjb21wcmVzc19tZXRob2RzW10gPSB7CiAgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pY29tcHJlc3NfcmVkdWNlLCAgICAgIE1FVEhfTk9BUkdTLApAQCAtMzY3NCw0NCArMzY3OCw0NCBAQAogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICJpdGVydG9vbHMuY29tcHJlc3MiLCAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICBzaXplb2YoY29tcHJlc3NvYmplY3QpLCAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwogICAgIChkZXN0cnVjdG9yKWNvbXByZXNzX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCi0gICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXNlcnZlZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KLSAgICBjb21wcmVzc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYyljb21wcmVzc190cmF2ZXJzZSwgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjb21wcmVzc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNvbXByZXNzX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAoaXRlcm5leHRmdW5jKWNvbXByZXNzX25leHQsICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwotICAgIGNvbXByZXNzX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KLSAgICBjb21wcmVzc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCi0gICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICBjb21wcmVzc19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvbXByZXNzX25ldywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMzc5Miw4ICszNzk2LDcgQEAKICAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUHlPYmplY3QgKmdvb2Q7Ci0gICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sIE5VTEwpOworICAgICAgICAgICAgZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsIGl0ZW0sIE5VTEwpOwogICAgICAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM4MTIsOSArMzgxNSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsdGVyZmFsc2VfcmVkdWNlKGZpbHRlcmZhbHNlb2JqZWN0ICpseikKIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTykiLCBQeV9UWVBFKGx6KSwKLSAgICAgICAgbHotPmZ1bmMsIGx6LT5pdCk7Ci0gICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKSIsIFB5X1RZUEUobHopLCBsei0+ZnVuYywgbHotPml0KTsKK30KIAogc3RhdGljIFB5TWV0aG9kRGVmIGZpbHRlcmZhbHNlX21ldGhvZHNbXSA9IHsKICAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbilmaWx0ZXJmYWxzZV9yZWR1Y2UsICAgICAgTUVUSF9OT0FSR1MsCkBAIC0zODM0LDcgKzM4MzYsNyBAQAogICAgIHNpemVvZihmaWx0ZXJmYWxzZW9iamVjdCksICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKWZpbHRlcmZhbHNlX2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChkZXN0cnVjdG9yKWZpbHRlcmZhbHNlX2RlYWxsb2MsICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCkBAIC0zODUyLDcgKzM4NTQsNyBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CiAgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICBmaWx0ZXJmYWxzZV9kb2MsICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKWZpbHRlcmZhbHNlX3RyYXZlcnNlLCAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKHRyYXZlcnNlcHJvYylmaWx0ZXJmYWxzZV90cmF2ZXJzZSwgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KQEAgLTQwOTEsMTUgKzQwOTMsMTUgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0gICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgY291bnRfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYyljb3VudF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNvdW50X3RyYXZlcnNlLCAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAoaXRlcm5leHRmdW5jKWNvdW50X25leHQsICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwotICAgIGNvdW50X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGNvdW50X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwpAQCAtNDI2NSw5ICs0MjY3LDcgQEAKICAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0vKiB6aXBsb25nZXN0IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJQeXRob24uaCIKKy8qIHppcGxvbmdlc3Qgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKQEAgLTQzMDYsNyArNDMwNiw3IEBACiAgICAgaXR0dXBsZSA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7CiAgICAgaWYgKGl0dHVwbGUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZm9yIChpPTA7IGkgPCB0dXBsZXNpemU7ICsraSkgeworICAgIGZvciAoaT0wOyBpIDwgdHVwbGVzaXplOyBpKyspIHsKICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwogICAgICAgICBQeU9iamVjdCAqaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZW0pOwogICAgICAgICBpZiAoaXQgPT0gTlVMTCkgewpAQCAtNDQ0Nyw2ICs0NDQ3LDcgQEAKICAgICAgKi8KICAgICBpbnQgaTsKICAgICBQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KFB5VHVwbGVfR0VUX1NJWkUobHotPml0dHVwbGUpKTsKKwogICAgIGlmIChhcmdzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGZvciAoaT0wOyBpPFB5VHVwbGVfR0VUX1NJWkUobHotPml0dHVwbGUpOyBpKyspIHsKQEAgLTQ0OTcsNyArNDQ5OCw3IEBACiAgICAgc2l6ZW9mKHppcGxvbmdlc3RvYmplY3QpLCAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgKGRlc3RydWN0b3IpemlwX2xvbmdlc3RfZGVhbGxvYywgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKGRlc3RydWN0b3IpemlwX2xvbmdlc3RfZGVhbGxvYywgICAgLyogdHBfZGVhbGxvYyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KQEAgLTQ1MTQsOCArNDUxNSw4IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwotICAgIHppcF9sb25nZXN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYyl6aXBfbG9uZ2VzdF90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICB6aXBfbG9uZ2VzdF9kb2MsICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXppcF9sb25nZXN0X3RyYXZlcnNlLCAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwpAQCAtNDUzMSw3ICs0NTMyLDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCi0gICAgemlwX2xvbmdlc3RfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICB6aXBfbG9uZ2VzdF9uZXcsICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL21haW4uYyBiL01vZHVsZXMvbWFpbi5jCmluZGV4IGU0Yzk1NWUuLjBiODJmNDggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWFpbi5jCisrKyBiL01vZHVsZXMvbWFpbi5jCkBAIC00MiwxMSArNDIsMTEgQEAKICNkZWZpbmUgUFJPR1JBTV9PUFRTIEJBU0VfT1BUUwogCiAvKiBTaG9ydCB1c2FnZSBtZXNzYWdlICh3aXRoICVzIGZvciBhcmd2MCkgKi8KLXN0YXRpYyBjaGFyICp1c2FnZV9saW5lID0KK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlX2xpbmVbXSA9CiAidXNhZ2U6ICVscyBbb3B0aW9uXSAuLi4gWy1jIGNtZCB8IC1tIG1vZCB8IGZpbGUgfCAtXSBbYXJnXSAuLi5cbiI7CiAKIC8qIExvbmcgdXNhZ2UgbWVzc2FnZSwgc3BsaXQgaW50byBwYXJ0cyA8IDUxMiBieXRlcyAqLwotc3RhdGljIGNoYXIgKnVzYWdlXzEgPSAiXAorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfMVtdID0gIlwKIE9wdGlvbnMgYW5kIGFyZ3VtZW50cyAoYW5kIGNvcnJlc3BvbmRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzKTpcblwKIC1iICAgICA6IGlzc3VlIHdhcm5pbmdzIGFib3V0IHN0cihieXRlc19pbnN0YW5jZSksIHN0cihieXRlYXJyYXlfaW5zdGFuY2UpXG5cCiAgICAgICAgICBhbmQgY29tcGFyaW5nIGJ5dGVzL2J5dGVhcnJheSB3aXRoIHN0ci4gKC1iYjogaXNzdWUgZXJyb3JzKVxuXApAQCAtNTYsNyArNTYsNyBAQAogLUUgICAgIDogaWdub3JlIFBZVEhPTiogZW52aXJvbm1lbnQgdmFyaWFibGVzIChzdWNoIGFzIFBZVEhPTlBBVEgpXG5cCiAtaCAgICAgOiBwcmludCB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdCAoYWxzbyAtLWhlbHApXG5cCiAiOwotc3RhdGljIGNoYXIgKnVzYWdlXzIgPSAiXAorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfMltdID0gIlwKIC1pICAgICA6IGluc3BlY3QgaW50ZXJhY3RpdmVseSBhZnRlciBydW5uaW5nIHNjcmlwdDsgZm9yY2VzIGEgcHJvbXB0IGV2ZW5cblwKICAgICAgICAgIGlmIHN0ZGluIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHRlcm1pbmFsOyBhbHNvIFBZVEhPTklOU1BFQ1Q9eFxuXAogLUkgICAgIDogaXNvbGF0ZSBQeXRob24gZnJvbSB0aGUgdXNlcidzIGVudmlyb25tZW50IChpbXBsaWVzIC1FIGFuZCAtcylcblwKQEAgLTY3LDcgKzY3LDcgQEAKIC1zICAgICA6IGRvbid0IGFkZCB1c2VyIHNpdGUgZGlyZWN0b3J5IHRvIHN5cy5wYXRoOyBhbHNvIFBZVEhPTk5PVVNFUlNJVEVcblwKIC1TICAgICA6IGRvbid0IGltcGx5ICdpbXBvcnQgc2l0ZScgb24gaW5pdGlhbGl6YXRpb25cblwKICI7Ci1zdGF0aWMgY2hhciAqdXNhZ2VfMyA9ICJcCitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV8zW10gPSAiXAogLXUgICAgIDogdW5idWZmZXJlZCBiaW5hcnkgc3Rkb3V0IGFuZCBzdGRlcnIsIHN0ZGluIGFsd2F5cyBidWZmZXJlZDtcblwKICAgICAgICAgIGFsc28gUFlUSE9OVU5CVUZGRVJFRD14XG5cCiAgICAgICAgICBzZWUgbWFuIHBhZ2UgZm9yIGRldGFpbHMgb24gaW50ZXJuYWwgYnVmZmVyaW5nIHJlbGF0aW5nIHRvICctdSdcblwKQEAgLTc5LDcgKzc5LDcgQEAKIC14ICAgICA6IHNraXAgZmlyc3QgbGluZSBvZiBzb3VyY2UsIGFsbG93aW5nIHVzZSBvZiBub24tVW5peCBmb3JtcyBvZiAjIWNtZFxuXAogLVggb3B0IDogc2V0IGltcGxlbWVudGF0aW9uLXNwZWNpZmljIG9wdGlvblxuXAogIjsKLXN0YXRpYyBjaGFyICp1c2FnZV80ID0gIlwKK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlXzRbXSA9ICJcCiBmaWxlICAgOiBwcm9ncmFtIHJlYWQgZnJvbSBzY3JpcHQgZmlsZVxuXAogLSAgICAgIDogcHJvZ3JhbSByZWFkIGZyb20gc3RkaW4gKGRlZmF1bHQ7IGludGVyYWN0aXZlIG1vZGUgaWYgYSB0dHkpXG5cCiBhcmcgLi4uOiBhcmd1bWVudHMgcGFzc2VkIHRvIHByb2dyYW0gaW4gc3lzLmFyZ3ZbMTpdXG5cblwKQEAgLTg4LDIyICs4OCwyMyBAQAogUFlUSE9OUEFUSCAgIDogJyVsYyctc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMgcHJlZml4ZWQgdG8gdGhlXG5cCiAgICAgICAgICAgICAgICBkZWZhdWx0IG1vZHVsZSBzZWFyY2ggcGF0aC4gIFRoZSByZXN1bHQgaXMgc3lzLnBhdGguXG5cCiAiOwotc3RhdGljIGNoYXIgKnVzYWdlXzUgPQorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfNVtdID0KICJQWVRIT05IT01FICAgOiBhbHRlcm5hdGUgPHByZWZpeD4gZGlyZWN0b3J5IChvciA8cHJlZml4PiVsYzxleGVjX3ByZWZpeD4pLlxuIgogIiAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IG1vZHVsZSBzZWFyY2ggcGF0aCB1c2VzICVzLlxuIgogIlBZVEhPTkNBU0VPSyA6IGlnbm9yZSBjYXNlIGluICdpbXBvcnQnIHN0YXRlbWVudHMgKFdpbmRvd3MpLlxuIgogIlBZVEhPTklPRU5DT0RJTkc6IEVuY29kaW5nWzplcnJvcnNdIHVzZWQgZm9yIHN0ZGluL3N0ZG91dC9zdGRlcnIuXG4iCi0iUFlUSE9ORkFVTFRIQU5ETEVSOiBkdW1wIHRoZSBQeXRob24gdHJhY2ViYWNrIG9uIGZhdGFsIGVycm9ycy5cblwKLSI7Ci1zdGF0aWMgY2hhciAqdXNhZ2VfNiA9ICJcCi1QWVRIT05IQVNIU0VFRDogaWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gJ3JhbmRvbScsIGEgcmFuZG9tIHZhbHVlIGlzIHVzZWRcblwKLSAgIHRvIHNlZWQgdGhlIGhhc2hlcyBvZiBzdHIsIGJ5dGVzIGFuZCBkYXRldGltZSBvYmplY3RzLiAgSXQgY2FuIGFsc28gYmVcblwKLSAgIHNldCB0byBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBbMCw0Mjk0OTY3Mjk1XSB0byBnZXQgaGFzaCB2YWx1ZXMgd2l0aCBhXG5cCi0gICBwcmVkaWN0YWJsZSBzZWVkLlxuXAotIjsKKyJQWVRIT05GQVVMVEhBTkRMRVI6IGR1bXAgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gZmF0YWwgZXJyb3JzLlxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlXzZbXSA9CisiUFlUSE9OSEFTSFNFRUQ6IGlmIHRoaXMgdmFyaWFibGUgaXMgc2V0IHRvICdyYW5kb20nLCBhIHJhbmRvbSB2YWx1ZSBpcyB1c2VkXG4iCisiICAgdG8gc2VlZCB0aGUgaGFzaGVzIG9mIHN0ciwgYnl0ZXMgYW5kIGRhdGV0aW1lIG9iamVjdHMuICBJdCBjYW4gYWxzbyBiZVxuIgorIiAgIHNldCB0byBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBbMCw0Mjk0OTY3Mjk1XSB0byBnZXQgaGFzaCB2YWx1ZXMgd2l0aCBhXG4iCisiICAgcHJlZGljdGFibGUgc2VlZC5cbiIKKyJQWVRIT05NQUxMT0M6IHNldCB0aGUgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzIGFuZC9vciBpbnN0YWxsIGRlYnVnIGhvb2tzXG4iCisiICAgb24gUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzLiBVc2UgUFlUSE9OTUFMTE9DPWRlYnVnIHRvIGluc3RhbGwgZGVidWdcbiIKKyIgICBob29rcy5cbiI7CiAKIHN0YXRpYyBpbnQKLXVzYWdlKGludCBleGl0Y29kZSwgd2NoYXJfdCogcHJvZ3JhbSkKK3VzYWdlKGludCBleGl0Y29kZSwgY29uc3Qgd2NoYXJfdCogcHJvZ3JhbSkKIHsKICAgICBGSUxFICpmID0gZXhpdGNvZGUgPyBzdGRlcnIgOiBzdGRvdXQ7CiAKQEAgLTM0MSw2ICszNDIsNyBAQAogICAgIGludCBoZWxwID0gMDsKICAgICBpbnQgdmVyc2lvbiA9IDA7CiAgICAgaW50IHNhd191bmJ1ZmZlcmVkX2ZsYWcgPSAwOworICAgIGNoYXIgKm9wdDsKICAgICBQeUNvbXBpbGVyRmxhZ3MgY2Y7CiAgICAgUHlPYmplY3QgKndhcm5pbmdfb3B0aW9uID0gTlVMTDsKICAgICBQeU9iamVjdCAqd2FybmluZ19vcHRpb25zID0gTlVMTDsKQEAgLTM2NSw2ICszNjcsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIG9wdCA9IFB5X0dFVEVOVigiUFlUSE9OTUFMTE9DIik7CisgICAgaWYgKF9QeU1lbV9TZXR1cEFsbG9jYXRvcnMob3B0KSA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIkVycm9yIGluIFBZVEhPTk1BTExPQzogdW5rbm93biBhbGxvY2F0b3IgXCIlc1wiIVxuIiwgb3B0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKICAgICBQeV9IYXNoUmFuZG9taXphdGlvbkZsYWcgPSAxOwogICAgIF9QeVJhbmRvbV9Jbml0KCk7CiAKQEAgLTQ3Myw3ICs0ODIsOCBAQAogICAgICAgICAgICAgd2FybmluZ19vcHRpb24gPSBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKF9QeU9TX29wdGFyZywgLTEpOwogICAgICAgICAgICAgaWYgKHdhcm5pbmdfb3B0aW9uID09IE5VTEwpCiAgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiZmFpbHVyZSBpbiBoYW5kbGluZyBvZiAtVyBhcmd1bWVudCIpOwotICAgICAgICAgICAgUHlMaXN0X0FwcGVuZCh3YXJuaW5nX29wdGlvbnMsIHdhcm5pbmdfb3B0aW9uKTsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHdhcm5pbmdfb3B0aW9ucywgd2FybmluZ19vcHRpb24pID09IC0xKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImZhaWx1cmUgaW4gaGFuZGxpbmcgb2YgLVcgYXJndW1lbnQiKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRih3YXJuaW5nX29wdGlvbik7CiAgICAgICAgICAgICBicmVhazsKIApAQCAtNjU0LDcgKzY2NCw3IEBACiAgICAgICAgICAgICBQeV9TZXRQcm9ncmFtTmFtZSh3YnVmKTsKIAogICAgICAgICAgICAgLyogRG9uJ3QgZnJlZSB3YnVmLCB0aGUgYXJndW1lbnQgdG8gUHlfU2V0UHJvZ3JhbU5hbWUKLSAgICAgICAgICAgICAqIG11c3QgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBQeV9GaW5hbGl6ZSBpcyBjYWxsZWQuCisgICAgICAgICAgICAgKiBtdXN0IHJlbWFpbiB2YWxpZCB1bnRpbCBQeV9GaW5hbGl6ZUV4IGlzIGNhbGxlZC4KICAgICAgICAgICAgICAqLwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUHlfU2V0UHJvZ3JhbU5hbWUoYXJndlswXSk7CkBAIC03ODUsNyArNzk1LDExIEBACiAgICAgICAgIHN0cyA9IFB5UnVuX0FueUZpbGVGbGFncyhzdGRpbiwgIjxzdGRpbj4iLCAmY2YpICE9IDA7CiAgICAgfQogCi0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICAvKiBWYWx1ZSB1bmxpa2VseSB0byBiZSBjb25mdXNlZCB3aXRoIGEgbm9uLWVycm9yIGV4aXQgc3RhdHVzIG9yCisgICAgICAgIG90aGVyIHNwZWNpYWwgbWVhbmluZyAqLworICAgICAgICBzdHMgPSAxMjA7CisgICAgfQogCiAjaWZkZWYgX19JTlNVUkVfXwogICAgIC8qIEluc3VyZSsrIGlzIGEgbWVtb3J5IGFuYWx5c2lzIHRvb2wgdGhhdCBhaWRzIGluIGRpc2NvdmVyaW5nCmRpZmYgLS1naXQgYS9Nb2R1bGVzL21hdGhtb2R1bGUuYyBiL01vZHVsZXMvbWF0aG1vZHVsZS5jCmluZGV4IGI5NDViZDYuLjk1ZWE0ZjcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWF0aG1vZHVsZS5jCisrKyBiL01vZHVsZXMvbWF0aG1vZHVsZS5jCkBAIC04NzUsNyArODc1LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLW1hdGhfMihQeU9iamVjdCAqYXJncywgZG91YmxlICgqZnVuYykgKGRvdWJsZSwgZG91YmxlKSwgY2hhciAqZnVuY25hbWUpCittYXRoXzIoUHlPYmplY3QgKmFyZ3MsIGRvdWJsZSAoKmZ1bmMpIChkb3VibGUsIGRvdWJsZSksIGNvbnN0IGNoYXIgKmZ1bmNuYW1lKQogewogICAgIFB5T2JqZWN0ICpveCwgKm95OwogICAgIGRvdWJsZSB4LCB5LCByOwpAQCAtMTY3Miw3ICsxNjcyLDcgQEAKICAgIGluIHRoYXQgaW50IGlzIGxhcmdlciB0aGFuIFBZX1NTSVpFX1RfTUFYLiAqLwogCiBzdGF0aWMgUHlPYmplY3QqCi1sb2doZWxwZXIoUHlPYmplY3QqIGFyZywgZG91YmxlICgqZnVuYykoZG91YmxlKSwgY2hhciAqZnVuY25hbWUpCitsb2doZWxwZXIoUHlPYmplY3QqIGFyZywgZG91YmxlICgqZnVuYykoZG91YmxlKSwgY29uc3QgY2hhciAqZnVuY25hbWUpCiB7CiAgICAgLyogSWYgaXQgaXMgaW50LCBkbyBpdCBvdXJzZWx2ZXMuICovCiAgICAgaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7CkBAIC0yMTQ0LDYgKzIxNDQsNyBAQAogCiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJwaSIsIFB5RmxvYXRfRnJvbURvdWJsZShQeV9NQVRIX1BJKSk7CiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlIiwgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfRSkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAidGF1IiwgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfVEFVKSk7ICAvKiAycGkgKi8KICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImluZiIsIFB5RmxvYXRfRnJvbURvdWJsZShtX2luZigpKSk7CiAjaWYgIWRlZmluZWQoUFlfTk9fU0hPUlRfRkxPQVRfUkVQUikgfHwgZGVmaW5lZChQeV9OQU4pCiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJuYW4iLCBQeUZsb2F0X0Zyb21Eb3VibGUobV9uYW4oKSkpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tZDVtb2R1bGUuYyBiL01vZHVsZXMvbWQ1bW9kdWxlLmMKaW5kZXggZjk0YWNjNy4uMDRiYzA2ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tZDVtb2R1bGUuYworKysgYi9Nb2R1bGVzL21kNW1vZHVsZS5jCkBAIC0zMCw3ICszMCw3IEBACiAKICNpZiBTSVpFT0ZfSU5UID09IDQKIHR5cGVkZWYgdW5zaWduZWQgaW50IE1ENV9JTlQzMjsgLyogMzItYml0IGludGVnZXIgKi8KLXR5cGVkZWYgUFlfTE9OR19MT05HIE1ENV9JTlQ2NDsgLyogNjQtYml0IGludGVnZXIgKi8KK3R5cGVkZWYgbG9uZyBsb25nIE1ENV9JTlQ2NDsgLyogNjQtYml0IGludGVnZXIgKi8KICNlbHNlCiAvKiBub3QgZGVmaW5lZC4gY29tcGlsYXRpb24gd2lsbCBkaWUuICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvbW1hcG1vZHVsZS5jIGIvTW9kdWxlcy9tbWFwbW9kdWxlLmMKaW5kZXggYmI5OGE5OS4uNzNjMzdkMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tbWFwbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9tbWFwbW9kdWxlLmMKQEAgLTkzLDcgKzkzLDcgQEAKICAgICBzaXplX3QgICAgICBzaXplOwogICAgIHNpemVfdCAgICAgIHBvczsgICAgLyogcmVsYXRpdmUgdG8gb2Zmc2V0ICovCiAjaWZkZWYgTVNfV0lORE9XUwotICAgIFBZX0xPTkdfTE9ORyBvZmZzZXQ7CisgICAgbG9uZyBsb25nIG9mZnNldDsKICNlbHNlCiAgICAgb2ZmX3QgICAgICAgb2Zmc2V0OwogI2VuZGlmCkBAIC0zODksNiArMzg5LDcgQEAKICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5X2J1ZmZlciBkYXRhOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKICAgICBDSEVDS19WQUxJRChOVUxMKTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqOndyaXRlIiwgJmRhdGEpKQpAQCAtNDA2LDkgKzQwNyw5IEBACiAgICAgfQogICAgIG1lbWNweShzZWxmLT5kYXRhICsgc2VsZi0+cG9zLCBkYXRhLmJ1ZiwgZGF0YS5sZW4pOwogICAgIHNlbGYtPnBvcyA9IHNlbGYtPnBvcyArIGRhdGEubGVuOworICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tU3NpemVfdChkYXRhLmxlbik7CiAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7Ci0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00NDUsNyArNDQ2LDcgQEAKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgaWYgKHNlbGYtPmZpbGVfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CiAgICAgICAgIERXT1JEIGxvdyxoaWdoOwotICAgICAgICBQWV9MT05HX0xPTkcgc2l6ZTsKKyAgICAgICAgbG9uZyBsb25nIHNpemU7CiAgICAgICAgIGxvdyA9IEdldEZpbGVTaXplKHNlbGYtPmZpbGVfaGFuZGxlLCAmaGlnaCk7CiAgICAgICAgIGlmIChsb3cgPT0gSU5WQUxJRF9GSUxFX1NJWkUpIHsKICAgICAgICAgICAgIC8qIEl0IG1pZ2h0IGJlIHRoYXQgdGhlIGZ1bmN0aW9uIGFwcGVhcnMgdG8gaGF2ZSBmYWlsZWQsCkBAIC00NTYsNyArNDU3LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoIWhpZ2ggJiYgbG93IDwgTE9OR19NQVgpCiAgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKChsb25nKWxvdyk7Ci0gICAgICAgIHNpemUgPSAoKChQWV9MT05HX0xPTkcpaGlnaCk8PDMyKSArIGxvdzsKKyAgICAgICAgc2l6ZSA9ICgoKGxvbmcgbG9uZyloaWdoKTw8MzIpICsgbG93OwogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyhzaXplKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHNlbGYtPnNpemUpOwpAQCAtMTI1Nyw3ICsxMjU4LDcgQEAKIAogLyogQSBub3RlIG9uIHNpemVzIGFuZCBvZmZzZXRzOiB3aGlsZSB0aGUgYWN0dWFsIG1hcCBzaXplIG11c3QgaG9sZCBpbiBhCiAgICBQeV9zc2l6ZV90LCBib3RoIHRoZSB0b3RhbCBmaWxlIHNpemUgYW5kIHRoZSBzdGFydCBvZmZzZXQgY2FuIGJlIGxvbmdlcgotICAgdGhhbiBhIFB5X3NzaXplX3QsIHNvIHdlIHVzZSBQWV9MT05HX0xPTkcgd2hpY2ggaXMgYWx3YXlzIDY0LWJpdC4KKyAgIHRoYW4gYSBQeV9zc2l6ZV90LCBzbyB3ZSB1c2UgbG9uZyBsb25nIHdoaWNoIGlzIGFsd2F5cyA2NC1iaXQuCiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTI2Niw3ICsxMjY3LDcgQEAKICAgICBtbWFwX29iamVjdCAqbV9vYmo7CiAgICAgUHlPYmplY3QgKm1hcF9zaXplX29iaiA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBtYXBfc2l6ZTsKLSAgICBQWV9MT05HX0xPTkcgb2Zmc2V0ID0gMCwgc2l6ZTsKKyAgICBsb25nIGxvbmcgb2Zmc2V0ID0gMCwgc2l6ZTsKICAgICBEV09SRCBvZmZfaGk7ICAgICAgIC8qIHVwcGVyIDMyIGJpdHMgb2Ygb2Zmc2V0ICovCiAgICAgRFdPUkQgb2ZmX2xvOyAgICAgICAvKiBsb3dlciAzMiBiaXRzIG9mIG9mZnNldCAqLwogICAgIERXT1JEIHNpemVfaGk7ICAgICAgLyogdXBwZXIgMzIgYml0cyBvZiBzaXplICovCkBAIC0xMzI1LDEwICsxMzI2LDYgQEAKICAgICAgKi8KICAgICBpZiAoZmlsZW5vICE9IC0xICYmIGZpbGVubyAhPSAwKSB7CiAgICAgICAgIC8qIEVuc3VyZSB0aGF0IGZpbGVubyBpcyB3aXRoaW4gdGhlIENSVCdzIHZhbGlkIHJhbmdlICovCi0gICAgICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZpbGVubykpIHsKLSAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CiAgICAgICAgIF9QeV9CRUdJTl9TVVBQUkVTU19JUEgKICAgICAgICAgZmggPSAoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZpbGVubyk7CiAgICAgICAgIF9QeV9FTkRfU1VQUFJFU1NfSVBICkBAIC0xMzc4LDcgKzEzNzUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0Vycik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNpemUgPSAoKChQWV9MT05HX0xPTkcpIGhpZ2gpIDw8IDMyKSArIGxvdzsKKyAgICAgICAgICAgIHNpemUgPSAoKChsb25nIGxvbmcpIGhpZ2gpIDw8IDMyKSArIGxvdzsKICAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBtbWFwIGFuIGVtcHR5IGZpbGUiKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvbmlzbW9kdWxlLmMgYi9Nb2R1bGVzL25pc21vZHVsZS5jCmluZGV4IDY0ZWI1ZGIuLmI2YTg1NWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbmlzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9uaXNtb2R1bGUuYwpAQCAtNzYsMTEgKzc2LDcgQEAKIAogICAgICpwZml4ID0gMDsKICAgICBmb3IgKGk9MDsgYWxpYXNlc1tpXS5hbGlhcyAhPSAwTDsgaSsrKSB7Ci0gICAgICAgIGlmICghc3RyY21wIChhbGlhc2VzW2ldLmFsaWFzLCBtYXApKSB7Ci0gICAgICAgICAgICAqcGZpeCA9IGFsaWFzZXNbaV0uZml4OwotICAgICAgICAgICAgcmV0dXJuIGFsaWFzZXNbaV0ubWFwOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RyY21wIChhbGlhc2VzW2ldLm1hcCwgbWFwKSkgeworICAgICAgICBpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5hbGlhcywgbWFwKSB8fCAhc3RyY21wIChhbGlhc2VzW2ldLm1hcCwgbWFwKSkgewogICAgICAgICAgICAgKnBmaXggPSBhbGlhc2VzW2ldLmZpeDsKICAgICAgICAgICAgIHJldHVybiBhbGlhc2VzW2ldLm1hcDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9vc3NhdWRpb2Rldi5jIGIvTW9kdWxlcy9vc3NhdWRpb2Rldi5jCmluZGV4IGQyZmQ1YzguLjQ3OTYyMDMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvb3NzYXVkaW9kZXYuYworKysgYi9Nb2R1bGVzL29zc2F1ZGlvZGV2LmMKQEAgLTMxLDkgKzMxLDEzIEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjZWxzZQogI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KKyNlbmRpZgogCi0jaWYgZGVmaW5lZChsaW51eCkKKyNpZmRlZiBfX2xpbnV4X18KIAogI2lmbmRlZiBIQVZFX1NURElOVF9ICiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDMyX3Q7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL292ZXJsYXBwZWQuYyBiL01vZHVsZXMvb3ZlcmxhcHBlZC5jCmluZGV4IGY4NWU1YmMuLjBhYTg2NTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvb3ZlcmxhcHBlZC5jCisrKyBiL01vZHVsZXMvb3ZlcmxhcHBlZC5jCkBAIC05NzMsMjggKzk3MywyOCBAQAogc3RhdGljIGludAogcGFyc2VfYWRkcmVzcyhQeU9iamVjdCAqb2JqLCBTT0NLQUREUiAqQWRkcmVzcywgaW50IExlbmd0aCkKIHsKLSAgICBjaGFyICpIb3N0OworICAgIFB5X1VOSUNPREUgKkhvc3Q7CiAgICAgdW5zaWduZWQgc2hvcnQgUG9ydDsKICAgICB1bnNpZ25lZCBsb25nIEZsb3dJbmZvOwogICAgIHVuc2lnbmVkIGxvbmcgU2NvcGVJZDsKIAogICAgIG1lbXNldChBZGRyZXNzLCAwLCBMZW5ndGgpOwogCi0gICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUob2JqLCAic0giLCAmSG9zdCwgJlBvcnQpKQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKG9iaiwgInVIIiwgJkhvc3QsICZQb3J0KSkKICAgICB7CiAgICAgICAgIEFkZHJlc3MtPnNhX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgICAgIGlmIChXU0FTdHJpbmdUb0FkZHJlc3NBKEhvc3QsIEFGX0lORVQsIE5VTEwsIEFkZHJlc3MsICZMZW5ndGgpIDwgMCkgeworICAgICAgICBpZiAoV1NBU3RyaW5nVG9BZGRyZXNzVyhIb3N0LCBBRl9JTkVULCBOVUxMLCBBZGRyZXNzLCAmTGVuZ3RoKSA8IDApIHsKICAgICAgICAgICAgIFNldEZyb21XaW5kb3dzRXJyKFdTQUdldExhc3RFcnJvcigpKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICAoKFNPQ0tBRERSX0lOKilBZGRyZXNzKS0+c2luX3BvcnQgPSBodG9ucyhQb3J0KTsKICAgICAgICAgcmV0dXJuIExlbmd0aDsKICAgICB9Ci0gICAgZWxzZSBpZiAoUHlBcmdfUGFyc2VUdXBsZShvYmosICJzSGtrIiwgJkhvc3QsICZQb3J0LCAmRmxvd0luZm8sICZTY29wZUlkKSkKKyAgICBlbHNlIGlmIChQeUFyZ19QYXJzZVR1cGxlKG9iaiwgInVIa2siLCAmSG9zdCwgJlBvcnQsICZGbG93SW5mbywgJlNjb3BlSWQpKQogICAgIHsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgQWRkcmVzcy0+c2FfZmFtaWx5ID0gQUZfSU5FVDY7Ci0gICAgICAgIGlmIChXU0FTdHJpbmdUb0FkZHJlc3NBKEhvc3QsIEFGX0lORVQ2LCBOVUxMLCBBZGRyZXNzLCAmTGVuZ3RoKSA8IDApIHsKKyAgICAgICAgaWYgKFdTQVN0cmluZ1RvQWRkcmVzc1coSG9zdCwgQUZfSU5FVDYsIE5VTEwsIEFkZHJlc3MsICZMZW5ndGgpIDwgMCkgewogICAgICAgICAgICAgU2V0RnJvbVdpbmRvd3NFcnIoV1NBR2V0TGFzdEVycm9yKCkpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jIGIvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYwppbmRleCA2NDcxYjhlLi44Mjc3MGE1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCisrKyBiL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKQEAgLTUzLDcgKzUzLDcgQEAKIC8qICBTdHJpbmcgY29uc3RhbnRzIHVzZWQgdG8gaW5pdGlhbGl6ZSBtb2R1bGUgYXR0cmlidXRlcy4KICAqCiAgKi8KLXN0YXRpYyBjaGFyIHBhcnNlcl9jb3B5cmlnaHRfc3RyaW5nW10gPQorc3RhdGljIGNvbnN0IGNoYXIgcGFyc2VyX2NvcHlyaWdodF9zdHJpbmdbXSA9CiAiQ29weXJpZ2h0IDE5OTUtMTk5NiBieSBWaXJnaW5pYSBQb2x5dGVjaG5pYyBJbnN0aXR1dGUgJiBTdGF0ZVxuXAogVW5pdmVyc2l0eSwgQmxhY2tzYnVyZywgVmlyZ2luaWEsIFVTQSwgYW5kIEZyZWQgTC4gRHJha2UsIEpyLiwgUmVzdG9uLFxuXAogVmlyZ2luaWEsIFVTQS4gIFBvcnRpb25zIGNvcHlyaWdodCAxOTkxLTE5OTUgYnkgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaFxuXApAQCAtNjMsNyArNjMsNyBAQAogUHlEb2NfU1RSVkFSKHBhcnNlcl9kb2Nfc3RyaW5nLAogIlRoaXMgaXMgYW4gaW50ZXJmYWNlIHRvIFB5dGhvbidzIGludGVybmFsIHBhcnNlci4iKTsKIAotc3RhdGljIGNoYXIgcGFyc2VyX3ZlcnNpb25fc3RyaW5nW10gPSAiMC41IjsKK3N0YXRpYyBjb25zdCBjaGFyIHBhcnNlcl92ZXJzaW9uX3N0cmluZ1tdID0gIjAuNSI7CiAKIAogdHlwZWRlZiBQeU9iamVjdCogKCpTZXFNYWtlcikgKFB5X3NzaXplX3QgbGVuZ3RoKTsKQEAgLTU3OCwxMyArNTc4LDEzIEBACiB9CiAKIAotLyogIGVycl9zdHJpbmcoY2hhciogbWVzc2FnZSkKKy8qICBlcnJfc3RyaW5nKGNvbnN0IGNoYXIqIG1lc3NhZ2UpCiAgKgogICogIFNldHMgdGhlIGVycm9yIHN0cmluZyBmb3IgYW4gZXhjZXB0aW9uIG9mIHR5cGUgUGFyc2VyRXJyb3IuCiAgKgogICovCiBzdGF0aWMgdm9pZAotZXJyX3N0cmluZyhjaGFyICptZXNzYWdlKQorZXJyX3N0cmluZyhjb25zdCBjaGFyICptZXNzYWdlKQogewogICAgIFB5RXJyX1NldFN0cmluZyhwYXJzZXJfZXJyb3IsIG1lc3NhZ2UpOwogfQpAQCAtNTk3LDcgKzU5Nyw3IEBACiAgKgogICovCiBzdGF0aWMgUHlPYmplY3QqCi1wYXJzZXJfZG9fcGFyc2UoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdywgY2hhciAqYXJnc3BlYywgaW50IHR5cGUpCitwYXJzZXJfZG9fcGFyc2UoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdywgY29uc3QgY2hhciAqYXJnc3BlYywgaW50IHR5cGUpCiB7CiAgICAgY2hhciogICAgIHN0cmluZyA9IDA7CiAgICAgUHlPYmplY3QqIHJlcyAgICA9IDA7CkBAIC02NzAsOSArNjcwLDc1IEBACiAKIAogc3RhdGljIG5vZGUqIGJ1aWxkX25vZGVfdHJlZShQeU9iamVjdCAqdHVwbGUpOwotc3RhdGljIGludCAgIHZhbGlkYXRlX2V4cHJfdHJlZShub2RlICp0cmVlKTsKLXN0YXRpYyBpbnQgICB2YWxpZGF0ZV9maWxlX2lucHV0KG5vZGUgKnRyZWUpOwotc3RhdGljIGludCAgIHZhbGlkYXRlX2VuY29kaW5nX2RlY2wobm9kZSAqdHJlZSk7CisKK3N0YXRpYyBpbnQKK3ZhbGlkYXRlX25vZGUobm9kZSAqdHJlZSkKK3sKKyAgICBpbnQgdHlwZSA9IFRZUEUodHJlZSk7CisgICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKKyAgICBkZmEgKm50X2RmYTsKKyAgICBzdGF0ZSAqZGZhX3N0YXRlOworICAgIGludCBwb3MsIGFyYzsKKworICAgIGFzc2VydChJU05PTlRFUk1JTkFMKHR5cGUpKTsKKyAgICB0eXBlIC09IE5UX09GRlNFVDsKKyAgICBpZiAodHlwZSA+PSBfUHlQYXJzZXJfR3JhbW1hci5nX25kZmFzKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsICJVbnJlY29nbml6ZWQgbm9kZSB0eXBlICVkLiIsIFRZUEUodHJlZSkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbnRfZGZhID0gJl9QeVBhcnNlcl9HcmFtbWFyLmdfZGZhW3R5cGVdOworICAgIFJFUSh0cmVlLCBudF9kZmEtPmRfdHlwZSk7CisKKyAgICAvKiBSdW4gdGhlIERGQSBmb3IgdGhpcyBub250ZXJtaW5hbC4gKi8KKyAgICBkZmFfc3RhdGUgPSAmbnRfZGZhLT5kX3N0YXRlW250X2RmYS0+ZF9pbml0aWFsXTsKKyAgICBmb3IgKHBvcyA9IDA7IHBvcyA8IG5jaDsgKytwb3MpIHsKKyAgICAgICAgbm9kZSAqY2ggPSBDSElMRCh0cmVlLCBwb3MpOworICAgICAgICBpbnQgY2hfdHlwZSA9IFRZUEUoY2gpOworICAgICAgICBmb3IgKGFyYyA9IDA7IGFyYyA8IGRmYV9zdGF0ZS0+c19uYXJjczsgKythcmMpIHsKKyAgICAgICAgICAgIHNob3J0IGFfbGFiZWwgPSBkZmFfc3RhdGUtPnNfYXJjW2FyY10uYV9sYmw7CisgICAgICAgICAgICBhc3NlcnQoYV9sYWJlbCA8IF9QeVBhcnNlcl9HcmFtbWFyLmdfbGwubGxfbmxhYmVscyk7CisgICAgICAgICAgICBpZiAoX1B5UGFyc2VyX0dyYW1tYXIuZ19sbC5sbF9sYWJlbFthX2xhYmVsXS5sYl90eXBlID09IGNoX3R5cGUpIHsKKyAgICAgCSAgICAgICAgLyogVGhlIGNoaWxkIGlzIGFjY2VwdGFibGU7IGlmIG5vbi10ZXJtaW5hbCwgdmFsaWRhdGUgaXQgcmVjdXJzaXZlbHkuICovCisgICAgICAgICAgICAgICAgaWYgKElTTk9OVEVSTUlOQUwoY2hfdHlwZSkgJiYgIXZhbGlkYXRlX25vZGUoY2gpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgc3RhdGUsIGFuZCBtb3ZlIG9uIHRvIHRoZSBuZXh0IGNoaWxkLiAqLworICAgICAgICAgICAgICAgIGRmYV9zdGF0ZSA9ICZudF9kZmEtPmRfc3RhdGVbZGZhX3N0YXRlLT5zX2FyY1thcmNdLmFfYXJyb3ddOworICAgICAgICAgICAgICAgIGdvdG8gYXJjX2ZvdW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFdoYXQgd291bGQgdGhpcyBzdGF0ZSBoYXZlIGFjY2VwdGVkPyAqLworICAgICAgICB7CisgICAgICAgICAgICBzaG9ydCBhX2xhYmVsID0gZGZhX3N0YXRlLT5zX2FyYy0+YV9sYmw7CisgICAgICAgICAgICBpbnQgbmV4dF90eXBlOworICAgICAgICAgICAgaWYgKCFhX2xhYmVsKSAvKiBXb3VsZG4ndCBhY2NlcHQgYW55IG1vcmUgY2hpbGRyZW4gKi8KKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfbnVtX2NoaWxkcmVuOworCisgICAgICAgICAgICBuZXh0X3R5cGUgPSBfUHlQYXJzZXJfR3JhbW1hci5nX2xsLmxsX2xhYmVsW2FfbGFiZWxdLmxiX3R5cGU7CisgICAgICAgICAgICBpZiAoSVNOT05URVJNSU5BTChuZXh0X3R5cGUpKQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsICJFeHBlY3RlZCBub2RlIHR5cGUgJWQsIGdvdCAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3R5cGUsIGNoX3R5cGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsICJJbGxlZ2FsIHRlcm1pbmFsOiBleHBlY3RlZCAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlQYXJzZXJfVG9rZW5OYW1lc1tuZXh0X3R5cGVdKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKK2FyY19mb3VuZDoKKyAgICAgICAgY29udGludWU7CisgICAgfQorICAgIC8qIEFyZSB3ZSBpbiBhIGZpbmFsIHN0YXRlPyBJZiBzbywgcmV0dXJuIDEgZm9yIHN1Y2Nlc3NmdWwgdmFsaWRhdGlvbi4gKi8KKyAgICBmb3IgKGFyYyA9IDA7IGFyYyA8IGRmYV9zdGF0ZS0+c19uYXJjczsgKythcmMpIHsKKyAgICAgICAgaWYgKCFkZmFfc3RhdGUtPnNfYXJjW2FyY10uYV9sYmwpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCitpbGxlZ2FsX251bV9jaGlsZHJlbjoKKyAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLAorICAgICAgICAgICAgICAgICAiSWxsZWdhbCBudW1iZXIgb2YgY2hpbGRyZW4gZm9yICVzIG5vZGUuIiwgbnRfZGZhLT5kX25hbWUpOworICAgIHJldHVybiAwOworfQogCiAvKiAgUHlPYmplY3QqIHBhcnNlcl90dXBsZTJzdChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiAgKgpAQCAtNjgxLDcgKzc0Nyw3IEBACiAgKiAgdHVwbGUgY2FuIGJlIHZhbGlkYXRlZC4gIEl0IGRvZXMgdGhpcyBieSBjaGVja2luZyB0aGUgZmlyc3QgY29kZSBvZiB0aGUKICAqICB0dXBsZSwgYW5kLCBpZiBhY2NlcHRhYmxlLCBidWlsZHMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiAgSWYgdGhpcwogICogIHN0ZXAgc3VjY2VlZHMsIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBpcyB2YWxpZGF0ZWQgYXMgZnVsbHkgYXMKLSAqICBwb3NzaWJsZSB3aXRoIHRoZSB2YXJpb3VzIHZhbGlkYXRlXyooKSByb3V0aW5lcyBkZWZpbmVkIGJlbG93LgorICogIHBvc3NpYmxlIHdpdGggdGhlIHJlY3Vyc2l2ZSB2YWxpZGF0ZV9ub2RlKCkgcm91dGluZSBkZWZpbmVkIGFib3ZlLgogICoKICAqICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2hhbmdlZCBpZiBzdXBwb3J0IGlzIHRvIGJlIGFkZGVkIGZvciBQeVNUX0ZSQUdNRU5UCiAgKiAgU1Qgb2JqZWN0cy4KQEAgLTcxMCwzMyArNzc2LDM1IEBACiAgICAgICovCiAgICAgdHJlZSA9IGJ1aWxkX25vZGVfdHJlZSh0dXBsZSk7CiAgICAgaWYgKHRyZWUgIT0gMCkgewotICAgICAgICBpbnQgc3RhcnRfc3ltID0gVFlQRSh0cmVlKTsKLSAgICAgICAgaWYgKHN0YXJ0X3N5bSA9PSBldmFsX2lucHV0KSB7CisgICAgICAgIG5vZGUgKnZhbGlkYXRpb25fcm9vdCA9IHRyZWU7CisgICAgICAgIGludCB0cmVlX3R5cGUgPSAwOworICAgICAgICBzd2l0Y2ggKFRZUEUodHJlZSkpIHsKKyAgICAgICAgY2FzZSBldmFsX2lucHV0OgogICAgICAgICAgICAgLyogIE1pZ2h0IGJlIGFuIGV2YWwgZm9ybS4gICovCi0gICAgICAgICAgICBpZiAodmFsaWRhdGVfZXhwcl90cmVlKHRyZWUpKQotICAgICAgICAgICAgICAgIHN0ID0gcGFyc2VyX25ld3N0b2JqZWN0KHRyZWUsIFB5U1RfRVhQUik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlOb2RlX0ZyZWUodHJlZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RhcnRfc3ltID09IGZpbGVfaW5wdXQpIHsKLSAgICAgICAgICAgIC8qICBUaGlzIGxvb2tzIGxpa2UgYW4gZXhlYyBmb3JtIHNvIGZhci4gICovCi0gICAgICAgICAgICBpZiAodmFsaWRhdGVfZmlsZV9pbnB1dCh0cmVlKSkKLSAgICAgICAgICAgICAgICBzdCA9IHBhcnNlcl9uZXdzdG9iamVjdCh0cmVlLCBQeVNUX1NVSVRFKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBQeU5vZGVfRnJlZSh0cmVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdGFydF9zeW0gPT0gZW5jb2RpbmdfZGVjbCkgeworICAgICAgICAgICAgdHJlZV90eXBlID0gUHlTVF9FWFBSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZW5jb2RpbmdfZGVjbDoKICAgICAgICAgICAgIC8qIFRoaXMgbG9va3MgbGlrZSBhbiBlbmNvZGluZ19kZWNsIHNvIGZhci4gKi8KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZV9lbmNvZGluZ19kZWNsKHRyZWUpKQotICAgICAgICAgICAgICAgIHN0ID0gcGFyc2VyX25ld3N0b2JqZWN0KHRyZWUsIFB5U1RfU1VJVEUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFB5Tm9kZV9GcmVlKHRyZWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKE5DSCh0cmVlKSAhPSAxKQorICAgICAgICAgICAgICAgIGVycl9zdHJpbmcoIkVycm9yIFBhcnNpbmcgZW5jb2RpbmdfZGVjbCIpOworICAgICAgICAgICAgdmFsaWRhdGlvbl9yb290ID0gQ0hJTEQodHJlZSwgMCk7CisgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBmaWxlX2lucHV0OgorICAgICAgICAgICAgLyogIFRoaXMgbG9va3MgbGlrZSBhbiBleGVjIGZvcm0gc28gZmFyLiAgKi8KKworICAgICAgICAgICAgdHJlZV90eXBlID0gUHlTVF9TVUlURTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLyogIFRoaXMgaXMgYSBmcmFnbWVudCwgYXQgYmVzdC4gKi8KICAgICAgICAgICAgIFB5Tm9kZV9GcmVlKHRyZWUpOwogICAgICAgICAgICAgZXJyX3N0cmluZygicGFyc2UgdHJlZSBkb2VzIG5vdCB1c2UgYSB2YWxpZCBzdGFydCBzeW1ib2wiKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CiAgICAgICAgIH0KKworICAgICAgICBpZiAodmFsaWRhdGVfbm9kZSh2YWxpZGF0aW9uX3Jvb3QpKQorICAgICAgICAgICAgc3QgPSBwYXJzZXJfbmV3c3RvYmplY3QodHJlZSwgdHJlZV90eXBlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlOb2RlX0ZyZWUodHJlZSk7CiAgICAgfQogICAgIC8qICBNYWtlIHN1cmUgd2UgcmFpc2UgYW4gZXhjZXB0aW9uIG9uIGFsbCBlcnJvcnMuICBXZSBzaG91bGQgbmV2ZXIKICAgICAgKiAgZ2V0IHRoaXMsIGJ1dCB3ZSdkIGRvIHdlbGwgdG8gYmUgc3VyZSBzb21ldGhpbmcgaXMgZG9uZS4KQEAgLTk4MSwyNDMzICsxMDQ5LDYgQEAKIH0KIAogCi0vKgotICogIFZhbGlkYXRpb24gcm91dGluZXMgdXNlZCB3aXRoaW4gdGhlIHZhbGlkYXRpb24gc2VjdGlvbjoKLSAqLwotc3RhdGljIGludCB2YWxpZGF0ZV90ZXJtaW5hbChub2RlICp0ZXJtaW5hbCwgaW50IHR5cGUsIGNoYXIgKnN0cmluZyk7Ci0KLSNkZWZpbmUgdmFsaWRhdGVfYW1wZXJzYW5kKGNoKSAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgQU1QRVIsICImIikKLSNkZWZpbmUgdmFsaWRhdGVfY2lyY3VtZmxleChjaCkgdmFsaWRhdGVfdGVybWluYWwoY2gsIENJUkNVTUZMRVgsICJeIikKLSNkZWZpbmUgdmFsaWRhdGVfY29sb24oY2gpICAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgQ09MT04sICI6IikKLSNkZWZpbmUgdmFsaWRhdGVfY29tbWEoY2gpICAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgQ09NTUEsICIsIikKLSNkZWZpbmUgdmFsaWRhdGVfZGVkZW50KGNoKSAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICBERURFTlQsICIiKQotI2RlZmluZSB2YWxpZGF0ZV9lcXVhbChjaCkgICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICBFUVVBTCwgIj0iKQotI2RlZmluZSB2YWxpZGF0ZV9pbmRlbnQoY2gpICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgIElOREVOVCwgKGNoYXIqKU5VTEwpCi0jZGVmaW5lIHZhbGlkYXRlX2xwYXJlbihjaCkgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgICBMUEFSLCAiKCIpCi0jZGVmaW5lIHZhbGlkYXRlX25ld2xpbmUoY2gpICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICBORVdMSU5FLCAoY2hhciopTlVMTCkKLSNkZWZpbmUgdmFsaWRhdGVfcnBhcmVuKGNoKSAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgIFJQQVIsICIpIikKLSNkZWZpbmUgdmFsaWRhdGVfc2VtaShjaCkgICAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgIFNFTUksICI7IikKLSNkZWZpbmUgdmFsaWRhdGVfc3RhcihjaCkgICAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgIFNUQVIsICIqIikKLSNkZWZpbmUgdmFsaWRhdGVfdmJhcihjaCkgICAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgIFZCQVIsICJ8IikKLSNkZWZpbmUgdmFsaWRhdGVfZG91Ymxlc3RhcihjaCkgdmFsaWRhdGVfdGVybWluYWwoY2gsIERPVUJMRVNUQVIsICIqKiIpCi0jZGVmaW5lIHZhbGlkYXRlX2RvdChjaCkgICAgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgICAgRE9ULCAiLiIpCi0jZGVmaW5lIHZhbGlkYXRlX2F0KGNoKSAgICAgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgICAgIEFULCAiQCIpCi0jZGVmaW5lIHZhbGlkYXRlX3JhcnJvdyhjaCkgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgUkFSUk9XLCAiLT4iKQotI2RlZmluZSB2YWxpZGF0ZV9uYW1lKGNoLCBzdHIpICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICAgTkFNRSwgc3RyKQotCi0jZGVmaW5lIFZBTElEQVRFUihuKSAgICBzdGF0aWMgaW50IHZhbGlkYXRlXyMjbihub2RlICp0cmVlKQotCi1WQUxJREFURVIobm9kZSk7ICAgICAgICAgICAgICAgIFZBTElEQVRFUihzbWFsbF9zdG10KTsKLVZBTElEQVRFUihjbGFzcyk7ICAgICAgICAgICAgICAgVkFMSURBVEVSKG5vZGUpOwotVkFMSURBVEVSKHBhcmFtZXRlcnMpOyAgICAgICAgICBWQUxJREFURVIoc3VpdGUpOwotVkFMSURBVEVSKHRlc3RsaXN0KTsgICAgICAgICAgICBWQUxJREFURVIodmFyYXJnc2xpc3QpOwotVkFMSURBVEVSKHZmcGRlZik7Ci1WQUxJREFURVIoc3RtdCk7ICAgICAgICAgICAgICAgIFZBTElEQVRFUihzaW1wbGVfc3RtdCk7Ci1WQUxJREFURVIoZXhwcl9zdG10KTsgICAgICAgICAgIFZBTElEQVRFUihwb3dlcik7Ci1WQUxJREFURVIoZGVsX3N0bXQpOwotVkFMSURBVEVSKHJldHVybl9zdG10KTsgICAgICAgICBWQUxJREFURVIocmFpc2Vfc3RtdCk7Ci1WQUxJREFURVIoaW1wb3J0X3N0bXQpOyAgICAgICAgIFZBTElEQVRFUihpbXBvcnRfc3RtdCk7Ci1WQUxJREFURVIoaW1wb3J0X25hbWUpOyAgICAgICAgIFZBTElEQVRFUih5aWVsZF9zdG10KTsKLVZBTElEQVRFUihnbG9iYWxfc3RtdCk7ICAgICAgICAgVkFMSURBVEVSKG5vbmxvY2FsX3N0bXQpOwotVkFMSURBVEVSKGFzc2VydF9zdG10KTsKLVZBTElEQVRFUihjb21wb3VuZF9zdG10KTsgICAgICAgVkFMSURBVEVSKHRlc3Rfb3Jfc3Rhcl9leHByKTsKLVZBTElEQVRFUih3aGlsZSk7ICAgICAgICAgICAgICAgVkFMSURBVEVSKGZvcik7Ci1WQUxJREFURVIodHJ5KTsgICAgICAgICAgICAgICAgIFZBTElEQVRFUihleGNlcHRfY2xhdXNlKTsKLVZBTElEQVRFUih0ZXN0KTsgICAgICAgICAgICAgICAgVkFMSURBVEVSKGFuZF90ZXN0KTsKLVZBTElEQVRFUihub3RfdGVzdCk7ICAgICAgICAgICAgVkFMSURBVEVSKGNvbXBhcmlzb24pOwotVkFMSURBVEVSKGNvbXBfb3ApOwotVkFMSURBVEVSKHN0YXJfZXhwcik7ICAgICAgICAgICBWQUxJREFURVIoZXhwcik7Ci1WQUxJREFURVIoeG9yX2V4cHIpOyAgICAgICAgICAgIFZBTElEQVRFUihhbmRfZXhwcik7Ci1WQUxJREFURVIoc2hpZnRfZXhwcik7ICAgICAgICAgIFZBTElEQVRFUihhcml0aF9leHByKTsKLVZBTElEQVRFUih0ZXJtKTsgICAgICAgICAgICAgICAgVkFMSURBVEVSKGZhY3Rvcik7Ci1WQUxJREFURVIoYXRvbSk7ICAgICAgICAgICAgICAgIFZBTElEQVRFUihsYW1iZGVmKTsKLVZBTElEQVRFUih0cmFpbGVyKTsgICAgICAgICAgICAgVkFMSURBVEVSKHN1YnNjcmlwdCk7Ci1WQUxJREFURVIoc3Vic2NyaXB0bGlzdCk7ICAgICAgIFZBTElEQVRFUihzbGljZW9wKTsKLVZBTElEQVRFUihleHBybGlzdCk7ICAgICAgICAgICAgVkFMSURBVEVSKGRpY3RvcnNldG1ha2VyKTsKLVZBTElEQVRFUihhcmdsaXN0KTsgICAgICAgICAgICAgVkFMSURBVEVSKGFyZ3VtZW50KTsKLVZBTElEQVRFUihjb21wX2Zvcik7Ci1WQUxJREFURVIoY29tcF9pdGVyKTsgICAgICAgICAgIFZBTElEQVRFUihjb21wX2lmKTsKLVZBTElEQVRFUih0ZXN0bGlzdF9jb21wKTsgICAgICAgVkFMSURBVEVSKHlpZWxkX2V4cHIpOwotVkFMSURBVEVSKG9yX3Rlc3QpOwotVkFMSURBVEVSKHRlc3Rfbm9jb25kKTsgICAgICAgICBWQUxJREFURVIobGFtYmRlZl9ub2NvbmQpOwotVkFMSURBVEVSKHlpZWxkX2FyZyk7Ci1WQUxJREFURVIoYXN5bmNfZnVuY2RlZik7ICAgICAgIFZBTElEQVRFUihhc3luY19zdG10KTsKLVZBTElEQVRFUihhdG9tX2V4cHIpOwotCi0jdW5kZWYgVkFMSURBVEVSCi0KLSNkZWZpbmUgaXNfZXZlbihuKSAgICAgICgoKG4pICYgMSkgPT0gMCkKLSNkZWZpbmUgaXNfb2RkKG4pICAgICAgICgoKG4pICYgMSkgPT0gMSkKLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9udHlwZShub2RlICpuLCBpbnQgdCkKLXsKLSAgICBpZiAoVFlQRShuKSAhPSB0KSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsICJFeHBlY3RlZCBub2RlIHR5cGUgJWQsIGdvdCAlZC4iLAotICAgICAgICAgICAgICAgICAgICAgdCwgVFlQRShuKSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotCi0vKiAgVmVyaWZpZXMgdGhhdCB0aGUgbnVtYmVyIG9mIGNoaWxkIG5vZGVzIGlzIGV4YWN0bHkgJ251bScsIHJhaXNpbmcKLSAqICBhbiBleGNlcHRpb24gaWYgaXQgaXNuJ3QuICBUaGUgZXhjZXB0aW9uIG1lc3NhZ2UgZG9lcyBub3QgaW5kaWNhdGUKLSAqICB0aGUgZXhhY3QgbnVtYmVyIG9mIG5vZGVzLCBhbGxvd2luZyB0aGlzIHRvIGJlIHVzZWQgdG8gcmFpc2UgdGhlCi0gKiAgInJpZ2h0IiBleGNlcHRpb24gd2hlbiB0aGUgd3JvbmcgbnVtYmVyIG9mIG5vZGVzIGlzIHByZXNlbnQgaW4gYQotICogIHNwZWNpZmljIHZhcmlhbnQgb2YgYSBzdGF0ZW1lbnQncyBzeW50YXguICBUaGlzIGlzIGNvbW1vbmx5IHVzZWQKLSAqICBpbiB0aGF0IGZhc2hpb24uCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX251bW5vZGVzKG5vZGUgKm4sIGludCBudW0sIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWUpCi17Ci0gICAgaWYgKE5DSChuKSAhPSBudW0pIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgJXMgbm9kZS4iLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3Rlcm1pbmFsKG5vZGUgKnRlcm1pbmFsLCBpbnQgdHlwZSwgY2hhciAqc3RyaW5nKQotewotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodGVybWluYWwsIHR5cGUpCi0gICAgICAgICAgICAgICAmJiAoKHN0cmluZyA9PSAwKSB8fCAoc3RyY21wKHN0cmluZywgU1RSKHRlcm1pbmFsKSkgPT0gMCkpKTsKLQotICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCB0ZXJtaW5hbDogZXhwZWN0ZWQgXCIlc1wiIiwgc3RyaW5nKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0vKiAgWCAoJywnIFgpIFsnLCddICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9yZXBlYXRpbmdfbGlzdF92YXJpYWJsZShub2RlICp0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpc3Rfbm9kZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqdmFsaWRhdGVfY2hpbGRfZnVuY19pbmMpKG5vZGUgKiwgaW50ICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCBsaXN0X25vZGVfdHlwZV9uYW1lKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IChuY2ggJiYgdmFsaWRhdGVfbnR5cGUodHJlZSwgbGlzdF9ub2RlX3R5cGUpKTsKLQotICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIC8qIFVuY29uZGl0aW9uYWxseSByYWlzZS4gKi8KLSAgICAgICAgKHZvaWQpIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsIGxpc3Rfbm9kZV90eXBlX25hbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZm9yICggOyByZXMgJiYgKnBvcyA8IG5jaDsgKSB7Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jaGlsZF9mdW5jX2luYyh0cmVlLCBwb3MpOwotICAgICAgICAgICAgaWYgKCFyZXMgfHwgKnBvcyA+PSBuY2gpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCAoKnBvcykrKykpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qICBYICgnLCcgWCkgWycsJ10gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3JlcGVhdGluZ19saXN0KG5vZGUgKnRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdF9ub2RlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCp2YWxpZGF0ZV9jaGlsZF9mdW5jKShub2RlICopLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgbGlzdF9ub2RlX3R5cGVfbmFtZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAobmNoICYmIHZhbGlkYXRlX250eXBlKHRyZWUsIGxpc3Rfbm9kZV90eXBlKSk7Ci0gICAgaW50IHBvcyA9IDA7Ci0KLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAvKiBVbmNvbmRpdGlvbmFsbHkgcmFpc2UuICovCi0gICAgICAgICh2b2lkKSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCBsaXN0X25vZGVfdHlwZV9uYW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZvciAoIDsgcmVzICYmIHBvcyA8IG5jaDsgKSB7Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jaGlsZF9mdW5jKENISUxEKHRyZWUsIHBvcysrKSk7Ci0gICAgICAgICAgICBpZiAoIXJlcyB8fCBwb3MgPj0gbmNoKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgcG9zKyspKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLS8qICB2YWxpZGF0ZV9jbGFzcygpCi0gKgotICogIGNsYXNzZGVmOgotICogICAgICAnY2xhc3MnIE5BTUUgWycoJyB0ZXN0bGlzdCAnKSddICc6JyBzdWl0ZQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9jbGFzcyhub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBjbGFzc2RlZikgJiYKLSAgICAgICAgICAgICAgICAoKG5jaCA9PSA0KSB8fCAobmNoID09IDYpIHx8IChuY2ggPT0gNykpKTsKLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJjbGFzcyIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAxKSwgTkFNRSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIG5jaCAtIDIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgbmNoIC0gMSkpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICh2b2lkKSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCA0LCAiY2xhc3MiKTsKLSAgICB9Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIGlmIChuY2ggPT0gNykgewotICAgICAgICAgICAgICAgIHJlcyA9ICgodmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsIDIpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfYXJnbGlzdChDSElMRCh0cmVlLCAzKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLCA0KSkpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChuY2ggPT0gNikgewotICAgICAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwyKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLDMpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICBpZl9zdG10OgotICogICAgICAnaWYnIHRlc3QgJzonIHN1aXRlICgnZWxpZicgdGVzdCAnOicgc3VpdGUpKiBbJ2Vsc2UnICc6JyBzdWl0ZV0KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfaWYobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgaWZfc3RtdCkKLSAgICAgICAgICAgICAgICYmIChuY2ggPj0gNCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJpZiIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDEpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgMikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCAzKSkpOwotCi0gICAgaWYgKHJlcyAmJiAoKG5jaCAlIDQpID09IDMpKSB7Ci0gICAgICAgIC8qICAuLi4gJ2Vsc2UnICc6JyBzdWl0ZSAgKi8KLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgbmNoIC0gMyksICJlbHNlIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIG5jaCAtIDIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgbmNoIC0gMSkpKTsKLSAgICAgICAgbmNoIC09IDM7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICh2b2lkKSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCA0LCAiaWYiKTsKLSAgICBpZiAoKG5jaCAlIDQpICE9IDApCi0gICAgICAgIC8qIFdpbGwgY2F0Y2ggdGhlIGNhc2UgZm9yIG5jaCA8IDQgKi8KLSAgICAgICAgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMCwgImlmIik7Ci0gICAgZWxzZSBpZiAocmVzICYmIChuY2ggPiA0KSkgewotICAgICAgICAvKiAgLi4uICgnZWxpZicgdGVzdCAnOicgc3VpdGUpKyAuLi4gICovCi0gICAgICAgIGludCBqID0gNDsKLSAgICAgICAgd2hpbGUgKChqIDwgbmNoKSAmJiByZXMpIHsKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIGopLCAiZWxpZiIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgaiArIDIpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgaiArIDEpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIGogKyAzKSkpOwotICAgICAgICAgICAgaiArPSA0OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgcGFyYW1ldGVyczoKLSAqICAgICAgJygnIFt2YXJhcmdzbGlzdF0gJyknCi0gKgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9wYXJhbWV0ZXJzKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgcGFyYW1ldGVycykgJiYgKChuY2ggPT0gMikgfHwgKG5jaCA9PSAzKSk7Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwgMCkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgbmNoIC0gMSkpKTsKLSAgICAgICAgaWYgKHJlcyAmJiAobmNoID09IDMpKQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdmFyYXJnc2xpc3QoQ0hJTEQodHJlZSwgMSkpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgKHZvaWQpIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJwYXJhbWV0ZXJzIik7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgdmFsaWRhdGVfc3VpdGUoKQotICoKLSAqICBzdWl0ZToKLSAqICAgICAgc2ltcGxlX3N0bXQKLSAqICAgIHwgTkVXTElORSBJTkRFTlQgc3RtdCsgREVERU5UCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3N1aXRlKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHN1aXRlKSAmJiAoKG5jaCA9PSAxKSB8fCAobmNoID49IDQpKSk7Ci0KLSAgICBpZiAocmVzICYmIChuY2ggPT0gMSkpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX3NpbXBsZV9zdG10KENISUxEKHRyZWUsIDApKTsKLSAgICBlbHNlIGlmIChyZXMpIHsKLSAgICAgICAgLyogIE5FV0xJTkUgSU5ERU5UIHN0bXQrIERFREVOVCAgKi8KLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25ld2xpbmUoQ0hJTEQodHJlZSwgMCkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9pbmRlbnQoQ0hJTEQodHJlZSwgMSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdG10KENISUxEKHRyZWUsIDIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZGVkZW50KENISUxEKHRyZWUsIG5jaCAtIDEpKSk7Ci0KLSAgICAgICAgaWYgKHJlcyAmJiAobmNoID4gNCkpIHsKLSAgICAgICAgICAgIGludCBpID0gMzsKLSAgICAgICAgICAgIC0tbmNoOyAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JnZXQgdGhlIERFREVOVCAgICAgKi8KLSAgICAgICAgICAgIGZvciAoIDsgcmVzICYmIChpIDwgbmNoKTsgKytpKQotICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3N0bXQoQ0hJTEQodHJlZSwgaSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5jaCA8IDQpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCA0LCAic3VpdGUiKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3Rlc3RsaXN0KG5vZGUgKnRyZWUpCi17Ci0gICAgcmV0dXJuICh2YWxpZGF0ZV9yZXBlYXRpbmdfbGlzdCh0cmVlLCB0ZXN0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX3Rlc3QsICJ0ZXN0bGlzdCIpKTsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfdGVzdGxpc3Rfc3Rhcl9leHByKG5vZGUgKnRsKQotewotICAgIHJldHVybiAodmFsaWRhdGVfcmVwZWF0aW5nX2xpc3QodGwsIHRlc3RsaXN0X3N0YXJfZXhwciwgdmFsaWRhdGVfdGVzdF9vcl9zdGFyX2V4cHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdGxpc3QiKSk7Ci19Ci0KLQotLyogdmFsaWRhdGUgZWl0aGVyIHZmcGRlZiBvciB0ZnBkZWYuCi0gKiB2ZnBkZWY6IE5BTUUKLSAqIHRmcGRlZjogTkFNRSBbJzonIHRlc3RdCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3ZmcGRlZihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaWYgKFRZUEUodHJlZSkgPT0gdmZwZGVmKSB7Ci0gICAgICAgIHJldHVybiBuY2ggPT0gMSAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCBOVUxMKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoVFlQRSh0cmVlKSA9PSB0ZnBkZWYpIHsKLSAgICAgICAgaWYgKG5jaCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmNoID09IDMpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCBOVUxMKSAmJgotICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDEpKSAmJgotICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMikpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB2ZnBkZWZdIHwgJyoqJyB2ZnBkZWYKLSAqIC4ub3IgdGZwZGVmIGluIHBsYWNlIG9mIHZmcGRlZi4gdmZwZGVmOiBOQU1FOyB0ZnBkZWY6IE5BTUUgWyc6JyB0ZXN0XQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV92YXJhcmdzbGlzdF90cmFpbGVyKG5vZGUgKnRyZWUsIGludCBzdGFydCkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAwOwotCi0gICAgaWYgKG5jaCA8PSBzdGFydCkgewotICAgICAgICBlcnJfc3RyaW5nKCJleHBlY3RlZCB2YXJpYWJsZSBhcmd1bWVudCB0cmFpbGVyIGZvciB2YXJhcmdzbGlzdCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgc3RhcnQpKSA9PSBTVEFSKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqICcqJyBbdmZwZGVmXQotICAgICAgICAgKi8KLSAgICAgICAgcmVzID0gdmFsaWRhdGVfc3RhcihDSElMRCh0cmVlLCBzdGFydCsrKSk7Ci0gICAgICAgIGlmIChyZXMgJiYgc3RhcnQgPCBuY2ggJiYgKFRZUEUoQ0hJTEQodHJlZSwgc3RhcnQpKSA9PSB2ZnBkZWYgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRShDSElMRCh0cmVlLCBzdGFydCkpID09IHRmcGRlZikpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV92ZnBkZWYoQ0hJTEQodHJlZSwgc3RhcnQrKykpOwotICAgICAgICAvKgotICAgICAgICAgKiAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSoKLSAgICAgICAgICovCi0gICAgICAgIHdoaWxlIChyZXMgJiYgc3RhcnQgKyAxIDwgbmNoICYmICgKLSAgICAgICAgICAgICAgICAgICBUWVBFKENISUxEKHRyZWUsIHN0YXJ0ICsgMSkpID09IHZmcGRlZiB8fAotICAgICAgICAgICAgICAgICAgIFRZUEUoQ0hJTEQodHJlZSwgc3RhcnQgKyAxKSkgPT0gdGZwZGVmKSkgewotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIHN0YXJ0KyspKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3ZmcGRlZihDSElMRCh0cmVlLCBzdGFydCsrKSkpOwotICAgICAgICAgICAgaWYgKHJlcyAmJiBzdGFydCArIDEgPCBuY2ggJiYgVFlQRShDSElMRCh0cmVlLCBzdGFydCkpID09IEVRVUFMKQotICAgICAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9lcXVhbChDSElMRCh0cmVlLCBzdGFydCsrKSkKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCBzdGFydCsrKSkpOwotICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFsnLCcgJyoqJyB2ZnBkZWZdCi0gICAgICAgICAqLwotICAgICAgICBpZiAocmVzICYmIHN0YXJ0ICsgMiA8IG5jaCAmJiBUWVBFKENISUxEKHRyZWUsIHN0YXJ0KzEpKSA9PSBET1VCTEVTVEFSKQotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIHN0YXJ0KyspKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2RvdWJsZXN0YXIoQ0hJTEQodHJlZSwgc3RhcnQrKykpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdmZwZGVmKENISUxEKHRyZWUsIHN0YXJ0KyspKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFRZUEUoQ0hJTEQodHJlZSwgc3RhcnQpKSA9PSBET1VCTEVTVEFSKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqICcqKicgdmZwZGVmCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc3RhcnQgKyAxIDwgbmNoKQotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX2RvdWJsZXN0YXIoQ0hJTEQodHJlZSwgc3RhcnQrKykpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdmZwZGVmKENISUxEKHRyZWUsIHN0YXJ0KyspKSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGVycl9zdHJpbmcoImV4cGVjdGVkIHZmcGRlZiBhZnRlciAqKiBpbiB2YXJhcmdzbGlzdCB0cmFpbGVyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJlcyA9IDA7Ci0gICAgICAgIGVycl9zdHJpbmcoImV4cGVjdGVkICogb3IgKiogaW4gdmFyYXJnc2xpc3QgdHJhaWxlciIpOwotICAgIH0KLQotICAgIGlmIChyZXMgJiYgc3RhcnQgIT0gbmNoKSB7Ci0gICAgICAgIHJlcyA9IDA7Ci0gICAgICAgIGVycl9zdHJpbmcoInVuZXhwZWN0ZWQgZXh0cmEgY2hpbGRyZW4gaW4gdmFyYXJnc2xpc3QgdHJhaWxlciIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLS8qIHZhbGlkYXRlX3ZhcmFyZ3NsaXN0KCkKLSAqCi0gKiBWYWxpZGF0ZSB0eXBlZGFyZ3NsaXN0IG9yIHZhcmFyZ3NsaXN0LgotICoKLSAqIHR5cGVkYXJnc2xpc3Q6ICgodGZwZGVmIFsnPScgdGVzdF0gJywnKSoKLSAqICAgICAgICAgICAgICAgICAoJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnICcqKicgdGZwZGVmXSB8Ci0gKiAgICAgICAgICAgICAgICAgICcqKicgdGZwZGVmKQotICogICAgICAgICAgICAgICAgIHwgdGZwZGVmIFsnPScgdGVzdF0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddKQotICogdGZwZGVmOiBOQU1FIFsnOicgdGVzdF0KLSAqIHZhcmFyZ3NsaXN0OiAoKHZmcGRlZiBbJz0nIHRlc3RdICcsJykqCi0gKiAgICAgICAgICAgICAgICgnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqICBbJywnICcqKicgdmZwZGVmXSB8Ci0gKiAgICAgICAgICAgICAgICAnKionIHZmcGRlZikKLSAqICAgICAgICAgICAgICAgfCB2ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10pCi0gKiB2ZnBkZWY6IE5BTUUKLSAqCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3ZhcmFyZ3NsaXN0KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKFRZUEUodHJlZSkgPT0gdmFyYXJnc2xpc3QgfHwKLSAgICAgICAgICAgICAgIFRZUEUodHJlZSkgPT0gdHlwZWRhcmdzbGlzdCkgJiYKLSAgICAgICAgICAgICAgKG5jaCAhPSAwKTsKLSAgICBpbnQgc3ltOwotICAgIG5vZGUgKmNoOwotICAgIGludCBpID0gMDsKLQotICAgIGlmICghcmVzKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAobmNoIDwgMSkgewotICAgICAgICBlcnJfc3RyaW5nKCJ2YXJhcmdzbGlzdCBtaXNzaW5nIGNoaWxkIG5vZGVzIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB3aGlsZSAoaSA8IG5jaCkgewotICAgICAgICBjaCA9IENISUxEKHRyZWUsIGkpOwotICAgICAgICBzeW0gPSBUWVBFKGNoKTsKLSAgICAgICAgaWYgKHN5bSA9PSB2ZnBkZWYgfHwgc3ltID09IHRmcGRlZikgewotICAgICAgICAgICAgLyogdmFsaWRhdGUgKHZmcGRlZiBbJz0nIHRlc3RdICcsJykrICovCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV92ZnBkZWYoY2gpOwotICAgICAgICAgICAgKytpOwotICAgICAgICAgICAgaWYgKHJlcyAmJiAoaSsyIDw9IG5jaCkgJiYgVFlQRShDSElMRCh0cmVlLCBpKSkgPT0gRVFVQUwpIHsKLSAgICAgICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfZXF1YWwoQ0hJTEQodHJlZSwgaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgaSsxKSkpOwotICAgICAgICAgICAgICAgIGlmIChyZXMpCi0gICAgICAgICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVzICYmIGkgPCBuY2gpIHsKLSAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBpKSk7Ci0gICAgICAgICAgICAgICAgKytpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN5bSA9PSBET1VCTEVTVEFSIHx8IHN5bSA9PSBTVEFSKSB7Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV92YXJhcmdzbGlzdF90cmFpbGVyKHRyZWUsIGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBmb3JtYXRpb24gZm9yIHZhcmFyZ3NsaXN0Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotCi0vKiAgY29tcF9pdGVyOiAgY29tcF9mb3IgfCBjb21wX2lmCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2NvbXBfaXRlcihub2RlICp0cmVlKQotewotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgY29tcF9pdGVyKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgImNvbXBfaXRlciIpKTsKLSAgICBpZiAocmVzICYmIFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IGNvbXBfZm9yKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21wX2ZvcihDSElMRCh0cmVlLCAwKSk7Ci0gICAgZWxzZQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21wX2lmKENISUxEKHRyZWUsIDApKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qICBjb21wX2ZvcjogICdmb3InIGV4cHJsaXN0ICdpbicgdGVzdCBbY29tcF9pdGVyXQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9jb21wX2Zvcihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlczsKLQotICAgIGlmIChuY2ggPT0gNSkKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tcF9pdGVyKENISUxEKHRyZWUsIDQpKTsKLSAgICBlbHNlCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDQsICJjb21wX2ZvciIpOwotCi0gICAgaWYgKHJlcykKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJmb3IiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZXhwcmxpc3QoQ0hJTEQodHJlZSwgMSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDIpLCAiaW4iKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfb3JfdGVzdChDSElMRCh0cmVlLCAzKSkpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotLyogIGNvbXBfaWY6ICAnaWYnIHRlc3Rfbm9jb25kIFtjb21wX2l0ZXJdCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2NvbXBfaWYobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXM7Ci0KLSAgICBpZiAobmNoID09IDMpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbXBfaXRlcihDSElMRCh0cmVlLCAyKSk7Ci0gICAgZWxzZQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAiY29tcF9pZiIpOwotCi0gICAgaWYgKHJlcykKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJpZiIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0X25vY29uZChDSElMRCh0cmVlLCAxKSkpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotCi0vKiAgc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10Ci0gKgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBzdG10KQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgInN0bXQiKSk7Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIHRyZWUgPSBDSElMRCh0cmVlLCAwKTsKLQotICAgICAgICBpZiAoVFlQRSh0cmVlKSA9PSBzaW1wbGVfc3RtdCkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3NpbXBsZV9zdG10KHRyZWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21wb3VuZF9zdG10KHRyZWUpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIHNtYWxsX3N0bXQgKCc7JyBzbWFsbF9zdG10KSogWyc7J10gTkVXTElORQotICoKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfc2ltcGxlX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgc2ltcGxlX3N0bXQpCi0gICAgICAgICAgICAgICAmJiAobmNoID49IDIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zbWFsbF9zdG10KENISUxEKHRyZWUsIDApKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmV3bGluZShDSElMRCh0cmVlLCBuY2ggLSAxKSkpOwotCi0gICAgaWYgKG5jaCA8IDIpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJzaW1wbGVfc3RtdCIpOwotICAgIC0tbmNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmdldCB0aGUgTkVXTElORSAgICAqLwotICAgIGlmIChyZXMgJiYgaXNfZXZlbihuY2gpKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9zZW1pKENISUxEKHRyZWUsIC0tbmNoKSk7Ci0gICAgaWYgKHJlcyAmJiAobmNoID4gMikpIHsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChpID0gMTsgcmVzICYmIChpIDwgbmNoKTsgaSArPSAyKQotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX3NlbWkoQ0hJTEQodHJlZSwgaSkpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc21hbGxfc3RtdChDSElMRCh0cmVlLCBpICsgMSkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3NtYWxsX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAic21hbGxfc3RtdCIpOwotCi0gICAgaWYgKHJlcykgewotICAgICAgICBpbnQgbnR5cGUgPSBUWVBFKENISUxEKHRyZWUsIDApKTsKLQotICAgICAgICBpZiAoICAobnR5cGUgPT0gZXhwcl9zdG10KQotICAgICAgICAgICAgICB8fCAobnR5cGUgPT0gZGVsX3N0bXQpCi0gICAgICAgICAgICAgIHx8IChudHlwZSA9PSBwYXNzX3N0bXQpCi0gICAgICAgICAgICAgIHx8IChudHlwZSA9PSBmbG93X3N0bXQpCi0gICAgICAgICAgICAgIHx8IChudHlwZSA9PSBpbXBvcnRfc3RtdCkKLSAgICAgICAgICAgICAgfHwgKG50eXBlID09IGdsb2JhbF9zdG10KQotICAgICAgICAgICAgICB8fCAobnR5cGUgPT0gbm9ubG9jYWxfc3RtdCkKLSAgICAgICAgICAgICAgfHwgKG50eXBlID09IGFzc2VydF9zdG10KSkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX25vZGUoQ0hJTEQodHJlZSwgMCkpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIHNtYWxsX3N0bXQgY2hpbGQgdHlwZSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG5jaCA9PSAxKSB7Ci0gICAgICAgIHJlcyA9IDA7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIGNoaWxkIG5vZGUgb2Ygc21hbGxfc3RtdDogJWQuIiwKLSAgICAgICAgICAgICAgICAgICAgIFRZUEUoQ0hJTEQodHJlZSwgMCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICBjb21wb3VuZF9zdG10OgotICogICAgICBpZl9zdG10IHwgd2hpbGVfc3RtdCB8IGZvcl9zdG10IHwgdHJ5X3N0bXQgfCB3aXRoX3N0bXQgfCBmdW5jZGVmIHwgY2xhc3NkZWYgfCBkZWNvcmF0ZWQKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfY29tcG91bmRfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgY29tcG91bmRfc3RtdCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJjb21wb3VuZF9zdG10IikpOwotICAgIGludCBudHlwZTsKLQotICAgIGlmICghcmVzKQotICAgICAgICByZXR1cm4gKDApOwotCi0gICAgdHJlZSA9IENISUxEKHRyZWUsIDApOwotICAgIG50eXBlID0gVFlQRSh0cmVlKTsKLSAgICBpZiAoICAobnR5cGUgPT0gaWZfc3RtdCkKLSAgICAgICAgICB8fCAobnR5cGUgPT0gd2hpbGVfc3RtdCkKLSAgICAgICAgICB8fCAobnR5cGUgPT0gZm9yX3N0bXQpCi0gICAgICAgICAgfHwgKG50eXBlID09IHRyeV9zdG10KQotICAgICAgICAgIHx8IChudHlwZSA9PSB3aXRoX3N0bXQpCi0gICAgICAgICAgfHwgKG50eXBlID09IGZ1bmNkZWYpCi0gICAgICAgICAgfHwgKG50eXBlID09IGFzeW5jX3N0bXQpCi0gICAgICAgICAgfHwgKG50eXBlID09IGNsYXNzZGVmKQotICAgICAgICAgIHx8IChudHlwZSA9PSBkZWNvcmF0ZWQpKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9ub2RlKHRyZWUpOwotICAgIGVsc2UgewotICAgICAgICByZXMgPSAwOwotICAgICAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgY29tcG91bmQgc3RhdGVtZW50IHR5cGU6ICVkLiIsIFRZUEUodHJlZSkpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3lpZWxkX29yX3Rlc3RsaXN0KG5vZGUgKnRyZWUsIGludCB0c2UpCi17Ci0gICAgaWYgKFRZUEUodHJlZSkgPT0geWllbGRfZXhwcikgewotICAgICAgICByZXR1cm4gdmFsaWRhdGVfeWllbGRfZXhwcih0cmVlKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmICh0c2UpCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVfdGVzdGxpc3Rfc3Rhcl9leHByKHRyZWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVfdGVzdGxpc3QodHJlZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9leHByX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgajsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZXhwcl9zdG10KQotICAgICAgICAgICAgICAgJiYgaXNfb2RkKG5jaCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3RsaXN0X3N0YXJfZXhwcihDSElMRCh0cmVlLCAwKSkpOwotCi0gICAgaWYgKHJlcyAmJiBuY2ggPT0gMwotICAgICAgICAmJiBUWVBFKENISUxEKHRyZWUsIDEpKSA9PSBhdWdhc3NpZ24pIHsKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXMoQ0hJTEQodHJlZSwgMSksIDEsICJhdWdhc3NpZ24iKQotICAgICAgICAgICAgJiYgdmFsaWRhdGVfeWllbGRfb3JfdGVzdGxpc3QoQ0hJTEQodHJlZSwgMiksIDApOwotCi0gICAgICAgIGlmIChyZXMpIHsKLSAgICAgICAgICAgIGNoYXIgKnMgPSBTVFIoQ0hJTEQoQ0hJTEQodHJlZSwgMSksIDApKTsKLQotICAgICAgICAgICAgcmVzID0gKHN0cmNtcChzLCAiKz0iKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKHMsICItPSIpID09IDAKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAocywgIio9IikgPT0gMAotICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChzLCAiLz0iKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKHMsICIvLz0iKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKHMsICIlPSIpID09IDAKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAocywgIiY9IikgPT0gMAotICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChzLCAifD0iKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKHMsICJePSIpID09IDAKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAocywgIjw8PSIpID09IDAKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAocywgIj4+PSIpID09IDAKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAocywgIioqPSIpID09IDApOwotICAgICAgICAgICAgaWYgKCFyZXMpCi0gICAgICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBhdWdtZW50ZWQgYXNzaWdubWVudCBvcGVyYXRvciIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBmb3IgKGogPSAxOyByZXMgJiYgKGogPCBuY2gpOyBqICs9IDIpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9lcXVhbChDSElMRCh0cmVlLCBqKSkKLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV95aWVsZF9vcl90ZXN0bGlzdChDSElMRCh0cmVlLCBqICsgMSksIDEpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfZGVsX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICByZXR1cm4gKHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJkZWxfc3RtdCIpCi0gICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiZGVsIikKLSAgICAgICAgICAgICYmIHZhbGlkYXRlX2V4cHJsaXN0KENISUxEKHRyZWUsIDEpKSk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfcmV0dXJuX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgcmV0dXJuX3N0bXQpCi0gICAgICAgICAgICAgICAmJiAoKG5jaCA9PSAxKSB8fCAobmNoID09IDIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgInJldHVybiIpKTsKLQotICAgIGlmIChyZXMgJiYgKG5jaCA9PSAyKSkKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdGxpc3QoQ0hJTEQodHJlZSwgMSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qCi0gKiAgcmFpc2Vfc3RtdDoKLSAqCi0gKiAgJ3JhaXNlJyBbdGVzdCBbJ2Zyb20nIHRlc3RdXQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9yYWlzZV9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHJhaXNlX3N0bXQpCi0gICAgICAgICAgICAgICAmJiAoKG5jaCA9PSAxKSB8fCAobmNoID09IDIpIHx8IChuY2ggPT0gNCkpKTsKLQotICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAodm9pZCkgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgInJhaXNlIik7Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIHJlcyA9IHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJyYWlzZSIpOwotICAgICAgICBpZiAocmVzICYmIChuY2ggPj0gMikpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDEpKTsKLSAgICAgICAgaWYgKHJlcyAmJiAobmNoID09IDQpKSB7Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAyKSwgImZyb20iKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMykpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogeWllbGRfZXhwcjogJ3lpZWxkJyBbeWllbGRfYXJnXQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV95aWVsZF9leHByKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpZiAobmNoIDwgMSB8fCBuY2ggPiAyKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoIXZhbGlkYXRlX250eXBlKHRyZWUsIHlpZWxkX2V4cHIpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoIXZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJ5aWVsZCIpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAobmNoID09IDIpIHsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZV95aWVsZF9hcmcoQ0hJTEQodHJlZSwgMSkpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi0vKiB5aWVsZF9hcmc6ICdmcm9tJyB0ZXN0IHwgdGVzdGxpc3QKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfeWllbGRfYXJnKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpZiAoIXZhbGlkYXRlX250eXBlKHRyZWUsIHlpZWxkX2FyZykpCi0gICAgICAgIHJldHVybiAwOwotICAgIHN3aXRjaCAobmNoKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGlmICghdmFsaWRhdGVfdGVzdGxpc3QoQ0hJTEQodHJlZSwgbmNoIC0gMSkpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBpZiAoIXZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJmcm9tIikpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDEpKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotLyogeWllbGRfc3RtdDogeWllbGRfZXhwcgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV95aWVsZF9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgcmV0dXJuICh2YWxpZGF0ZV9udHlwZSh0cmVlLCB5aWVsZF9zdG10KQotICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgInlpZWxkX3N0bXQiKQotICAgICAgICAgICAgJiYgdmFsaWRhdGVfeWllbGRfZXhwcihDSElMRCh0cmVlLCAwKSkpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2ltcG9ydF9hc19uYW1lKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgb2sgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBpbXBvcnRfYXNfbmFtZSk7Ci0KLSAgICBpZiAob2spIHsKLSAgICAgICAgaWYgKG5jaCA9PSAxKQotICAgICAgICAgICAgb2sgPSB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCBOVUxMKTsKLSAgICAgICAgZWxzZSBpZiAobmNoID09IDMpCi0gICAgICAgICAgICBvayA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCBOVUxMKQotICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAxKSwgImFzIikKLSAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMiksIE5VTEwpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb2sgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAzLCAiaW1wb3J0X2FzX25hbWUiKTsKLSAgICB9Ci0gICAgcmV0dXJuIG9rOwotfQotCi0KLS8qIGRvdHRlZF9uYW1lOiAgTkFNRSAoIi4iIE5BTUUpKgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9kb3R0ZWRfbmFtZShub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBkb3R0ZWRfbmFtZSkKLSAgICAgICAgICAgICAgICYmIGlzX29kZChuY2gpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCBOVUxMKSk7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAxOyByZXMgJiYgKGkgPCBuY2gpOyBpICs9IDIpIHsKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2RvdChDSElMRCh0cmVlLCBpKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgaSsxKSwgTlVMTCkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLS8qIGRvdHRlZF9hc19uYW1lOiAgZG90dGVkX25hbWUgW05BTUUgTkFNRV0KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfZG90dGVkX2FzX25hbWUobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBkb3R0ZWRfYXNfbmFtZSk7Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIGlmIChuY2ggPT0gMSkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2RvdHRlZF9uYW1lKENISUxEKHRyZWUsIDApKTsKLSAgICAgICAgZWxzZSBpZiAobmNoID09IDMpCi0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfZG90dGVkX25hbWUoQ0hJTEQodHJlZSwgMCkpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAxKSwgImFzIikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDIpLCBOVUxMKSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgbnVtYmVyIG9mIGNoaWxkcmVuIGZvciBkb3R0ZWRfYXNfbmFtZSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotLyogZG90dGVkX2FzX25hbWUgKCcsJyBkb3R0ZWRfYXNfbmFtZSkqICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZXMobm9kZSAqdHJlZSkKLXsKLSAgICAgICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICAgICAgaW50IHJlcyA9IGlzX29kZChuY2gpICYmIHZhbGlkYXRlX2RvdHRlZF9hc19uYW1lKENISUxEKHRyZWUsIDApKTsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChpID0gMTsgcmVzICYmIChpIDwgbmNoKTsgaSArPSAyKQotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIGkpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2RvdHRlZF9hc19uYW1lKENISUxEKHRyZWUsIGkgKyAxKSkpOwotICAgICAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogaW1wb3J0X2FzX25hbWUgKCcsJyBpbXBvcnRfYXNfbmFtZSkqIFsnLCddICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9pbXBvcnRfYXNfbmFtZXMobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfYXNfbmFtZShDSElMRCh0cmVlLCAwKSk7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAxOyByZXMgJiYgKGkgKyAxIDwgbmNoKTsgaSArPSAyKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgaSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9pbXBvcnRfYXNfbmFtZShDSElMRCh0cmVlLCBpICsgMSkpKTsKLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogJ2ltcG9ydCcgZG90dGVkX2FzX25hbWVzICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9pbXBvcnRfbmFtZShub2RlICp0cmVlKQotewotICAgICAgICByZXR1cm4gKHZhbGlkYXRlX250eXBlKHRyZWUsIGltcG9ydF9uYW1lKQotICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJpbXBvcnRfbmFtZSIpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImltcG9ydCIpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZG90dGVkX2FzX25hbWVzKENISUxEKHRyZWUsIDEpKSk7Ci19Ci0KLS8qIEhlbHBlciBmdW5jdGlvbiB0byBjb3VudCB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgZG90cyAob3IgZWxsaXBzaXMgdG9rZW5zKSBpbgotICogJ2Zyb20gLi4ubW9kdWxlIGltcG9ydCBuYW1lJwotICovCi1zdGF0aWMgaW50Ci1jb3VudF9mcm9tX2RvdHMobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgTkNIKHRyZWUpOyBpKyspCi0gICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIGkpKSAhPSBET1QgJiYgVFlQRShDSElMRCh0cmVlLCBpKSkgIT0gRUxMSVBTSVMpCi0gICAgICAgICAgICBicmVhazsKLSAgICByZXR1cm4gaSAtIDE7Ci19Ci0KLS8qIGltcG9ydF9mcm9tOiAoJ2Zyb20nICgnLicqIGRvdHRlZF9uYW1lIHwgJy4nKykKLSAqICAgICAgICAgICAgICAgJ2ltcG9ydCcgKCcqJyB8ICcoJyBpbXBvcnRfYXNfbmFtZXMgJyknIHwgaW1wb3J0X2FzX25hbWVzKSkKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfaW1wb3J0X2Zyb20obm9kZSAqdHJlZSkKLXsKLSAgICAgICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICAgICAgaW50IG5kb3RzID0gY291bnRfZnJvbV9kb3RzKHRyZWUpOwotICAgICAgICBpbnQgaGF2ZW5hbWUgPSAoVFlQRShDSElMRCh0cmVlLCBuZG90cyArIDEpKSA9PSBkb3R0ZWRfbmFtZSk7Ci0gICAgICAgIGludCBvZmZzZXQgPSBuZG90cyArIGhhdmVuYW1lOwotICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgaW1wb3J0X2Zyb20pCi0gICAgICAgICAgICAgICAgJiYgKG9mZnNldCA+PSAxKQotICAgICAgICAgICAgICAgICYmIChuY2ggPj0gMyArIG9mZnNldCkKLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiZnJvbSIpCi0gICAgICAgICAgICAgICAgJiYgKCFoYXZlbmFtZSB8fCB2YWxpZGF0ZV9kb3R0ZWRfbmFtZShDSElMRCh0cmVlLCBuZG90cyArIDEpKSkKLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIG9mZnNldCArIDEpLCAiaW1wb3J0Iik7Ci0KLSAgICAgICAgaWYgKHJlcyAmJiBUWVBFKENISUxEKHRyZWUsIG9mZnNldCArIDIpKSA9PSBMUEFSKQotICAgICAgICAgICAgcmVzID0gKChuY2ggPT0gb2Zmc2V0ICsgNSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfaW1wb3J0X2FzX25hbWVzKENISUxEKHRyZWUsIG9mZnNldCArIDMpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLCBvZmZzZXQgKyA0KSkpOwotICAgICAgICBlbHNlIGlmIChyZXMgJiYgVFlQRShDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSkgIT0gU1RBUikKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2ltcG9ydF9hc19uYW1lcyhDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSk7Ci0gICAgICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiBpbXBvcnRfc3RtdDogaW1wb3J0X25hbWUgfCBpbXBvcnRfZnJvbSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfaW1wb3J0X3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAiaW1wb3J0X3N0bXQiKTsKLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgaW50IG50eXBlID0gVFlQRShDSElMRCh0cmVlLCAwKSk7Ci0KLSAgICAgICAgaWYgKG50eXBlID09IGltcG9ydF9uYW1lIHx8IG50eXBlID09IGltcG9ydF9mcm9tKQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfbm9kZShDSElMRCh0cmVlLCAwKSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgaW1wb3J0X3N0bXQgY2hpbGQgdHlwZSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG5jaCA9PSAxKSB7Ci0gICAgICAgIHJlcyA9IDA7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIGNoaWxkIG5vZGUgb2YgaW1wb3J0X3N0bXQ6ICVkLiIsCi0gICAgICAgICAgICAgICAgICAgICBUWVBFKENISUxEKHRyZWUsIDApKSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgZ2xvYmFsX3N0bXQ6Ci0gKgotICogICdnbG9iYWwnIE5BTUUgKCcsJyBOQU1FKSoKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfZ2xvYmFsX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgajsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZ2xvYmFsX3N0bXQpCi0gICAgICAgICAgICAgICAmJiBpc19ldmVuKG5jaCkgJiYgKG5jaCA+PSAyKSk7Ci0KLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBnbG9iYWwgc3RhdGVtZW50Iik7Ci0KLSAgICBpZiAocmVzKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImdsb2JhbCIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAxKSwgTkFNRSkpOwotICAgIGZvciAoaiA9IDI7IHJlcyAmJiAoaiA8IG5jaCk7IGogKz0gMikKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIGopKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgaiArIDEpLCBOQU1FKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLS8qICBub25sb2NhbF9zdG10OgotICoKLSAqICAnbm9ubG9jYWwnIE5BTUUgKCcsJyBOQU1FKSoKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfbm9ubG9jYWxfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCBqOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBub25sb2NhbF9zdG10KQotICAgICAgICAgICAgICAgJiYgaXNfZXZlbihuY2gpICYmIChuY2ggPj0gMikpOwotCi0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgbm9ubG9jYWwgc3RhdGVtZW50Iik7Ci0KLSAgICBpZiAocmVzKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgIm5vbmxvY2FsIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDEpLCBOQU1FKSk7Ci0gICAgZm9yIChqID0gMjsgcmVzICYmIChqIDwgbmNoKTsgaiArPSAyKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgaikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCBqICsgMSksIE5BTUUpKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qICBhc3NlcnRfc3RtdDoKLSAqCi0gKiAgJ2Fzc2VydCcgdGVzdCBbJywnIHRlc3RdCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2Fzc2VydF9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGFzc2VydF9zdG10KQotICAgICAgICAgICAgICAgJiYgKChuY2ggPT0gMikgfHwgKG5jaCA9PSA0KSkKLSAgICAgICAgICAgICAgICYmICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiYXNzZXJ0IikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDEpKSk7Ci0KLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBhc3NlcnQgc3RhdGVtZW50Iik7Ci0gICAgaWYgKHJlcyAmJiAobmNoID4gMikpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCAyKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMykpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV93aGlsZShub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCB3aGlsZV9zdG10KQotICAgICAgICAgICAgICAgJiYgKChuY2ggPT0gNCkgfHwgKG5jaCA9PSA3KSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJ3aGlsZSIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDEpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgMikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCAzKSkpOwotCi0gICAgaWYgKHJlcyAmJiAobmNoID09IDcpKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCA0KSwgImVsc2UiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgNSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCA2KSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2Zvcihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBmb3Jfc3RtdCkKLSAgICAgICAgICAgICAgICYmICgobmNoID09IDYpIHx8IChuY2ggPT0gOSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiZm9yIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2V4cHJsaXN0KENISUxEKHRyZWUsIDEpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAyKSwgImluIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3RsaXN0KENISUxEKHRyZWUsIDMpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgNCkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCA1KSkpOwotCi0gICAgaWYgKHJlcyAmJiAobmNoID09IDkpKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCA2KSwgImVsc2UiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgNykpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCA4KSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICB0cnlfc3RtdDoKLSAqICAgICAgJ3RyeScgJzonIHN1aXRlIChleGNlcHRfY2xhdXNlICc6JyBzdWl0ZSkrIFsnZWxzZScgJzonIHN1aXRlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydmaW5hbGx5JyAnOicgc3VpdGVdCi0gKiAgICB8ICd0cnknICc6JyBzdWl0ZSAnZmluYWxseScgJzonIHN1aXRlCi0gKgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV90cnkobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCBwb3MgPSAzOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgdHJ5X3N0bXQpCi0gICAgICAgICAgICAgICAmJiAobmNoID49IDYpICYmICgobmNoICUgMykgPT0gMCkpOwotCi0gICAgaWYgKHJlcykKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJ0cnkiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgMSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCAyKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIG5jaCAtIDIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgbmNoIC0gMSkpKTsKLSAgICBlbHNlIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gImV4Y2VwdCI7Ci0gICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIG5jaCAtIDMpKSAhPSBleGNlcHRfY2xhdXNlKQotICAgICAgICAgICAgbmFtZSA9IFNUUihDSElMRCh0cmVlLCBuY2ggLSAzKSk7Ci0KLSAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgdHJ5LyVzIG5vZGUuIiwgbmFtZSk7Ci0gICAgfQotICAgIC8qIEhhbmRsZSB0cnkvZmluYWxseSBzdGF0ZW1lbnQgKi8KLSAgICBpZiAocmVzICYmIChUWVBFKENISUxEKHRyZWUsIHBvcykpID09IE5BTUUpICYmCi0gICAgICAgIChzdHJjbXAoU1RSKENISUxEKHRyZWUsIHBvcykpLCAiZmluYWxseSIpID09IDApKSB7Ci0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCA2LCAidHJ5L2ZpbmFsbHkiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgNCkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCA1KSkpOwotICAgICAgICByZXR1cm4gKHJlcyk7Ci0gICAgfQotICAgIC8qIHRyeS9leGNlcHQgc3RhdGVtZW50OiBza2lwIHBhc3QgZXhjZXB0X2NsYXVzZSBzZWN0aW9ucyAqLwotICAgIHdoaWxlIChyZXMgJiYgcG9zIDwgbmNoICYmIChUWVBFKENISUxEKHRyZWUsIHBvcykpID09IGV4Y2VwdF9jbGF1c2UpKSB7Ci0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9leGNlcHRfY2xhdXNlKENISUxEKHRyZWUsIHBvcykpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCBwb3MgKyAxKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIHBvcyArIDIpKSk7Ci0gICAgICAgIHBvcyArPSAzOwotICAgIH0KLSAgICAvKiBza2lwIGVsc2UgY2xhdXNlICovCi0gICAgaWYgKHJlcyAmJiBwb3MgPCBuY2ggJiYgKFRZUEUoQ0hJTEQodHJlZSwgcG9zKSkgPT0gTkFNRSkgJiYKLSAgICAgICAgKHN0cmNtcChTVFIoQ0hJTEQodHJlZSwgcG9zKSksICJlbHNlIikgPT0gMCkpIHsKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIHBvcyArIDEpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgcG9zICsgMikpKTsKLSAgICAgICAgcG9zICs9IDM7Ci0gICAgfQotICAgIGlmIChyZXMgJiYgcG9zIDwgbmNoKSB7Ci0gICAgICAgIC8qIGxhc3QgY2xhdXNlIG11c3QgYmUgYSBmaW5hbGx5ICovCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIHBvcyksICJmaW5hbGx5IikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIHBvcyArIDMsICJ0cnkvZXhjZXB0L2ZpbmFsbHkiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgcG9zICsgMSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCBwb3MgKyAyKSkpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfZXhjZXB0X2NsYXVzZShub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBleGNlcHRfY2xhdXNlKQotICAgICAgICAgICAgICAgJiYgKChuY2ggPT0gMSkgfHwgKG5jaCA9PSAyKSB8fCAobmNoID09IDQpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImV4Y2VwdCIpKTsKLQotICAgIGlmIChyZXMgJiYgKG5jaCA+IDEpKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDEpKTsKLSAgICBpZiAocmVzICYmIChuY2ggPT0gNCkpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDIpLCAiYXMiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMyksIE5BTUUpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV90ZXN0KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgdGVzdCkgJiYgaXNfb2RkKG5jaCk7Ci0KLSAgICBpZiAocmVzICYmIChUWVBFKENISUxEKHRyZWUsIDApKSA9PSBsYW1iZGVmKSkKLSAgICAgICAgcmVzID0gKChuY2ggPT0gMSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2xhbWJkZWYoQ0hJTEQodHJlZSwgMCkpKTsKLSAgICBlbHNlIGlmIChyZXMpIHsKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfb3JfdGVzdChDSElMRCh0cmVlLCAwKSk7Ci0gICAgICAgIHJlcyA9IChyZXMgJiYgKG5jaCA9PSAxIHx8IChuY2ggPT0gNSAmJgotICAgICAgICAgICAgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAxKSwgImlmIikgJiYKLSAgICAgICAgICAgIHZhbGlkYXRlX29yX3Rlc3QoQ0hJTEQodHJlZSwgMikpICYmCi0gICAgICAgICAgICB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDMpLCAiZWxzZSIpICYmCi0gICAgICAgICAgICB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDQpKSkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV90ZXN0X25vY29uZChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIHRlc3Rfbm9jb25kKSAmJiAobmNoID09IDEpOwotCi0gICAgaWYgKHJlcyAmJiAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gbGFtYmRlZl9ub2NvbmQpKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfbGFtYmRlZl9ub2NvbmQoQ0hJTEQodHJlZSwgMCkpKTsKLSAgICBlbHNlIGlmIChyZXMpIHsKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX29yX3Rlc3QoQ0hJTEQodHJlZSwgMCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9vcl90ZXN0KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgb3JfdGVzdCkgJiYgaXNfb2RkKG5jaCk7Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIGludCBwb3M7Ci0gICAgICAgIHJlcyA9IHZhbGlkYXRlX2FuZF90ZXN0KENISUxEKHRyZWUsIDApKTsKLSAgICAgICAgZm9yIChwb3MgPSAxOyByZXMgJiYgKHBvcyA8IG5jaCk7IHBvcyArPSAyKQotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgcG9zKSwgIm9yIikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9hbmRfdGVzdChDSElMRCh0cmVlLCBwb3MgKyAxKSkpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfYW5kX3Rlc3Qobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcG9zOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBhbmRfdGVzdCkKLSAgICAgICAgICAgICAgICYmIGlzX29kZChuY2gpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9ub3RfdGVzdChDSElMRCh0cmVlLCAwKSkpOwotCi0gICAgZm9yIChwb3MgPSAxOyByZXMgJiYgKHBvcyA8IG5jaCk7IHBvcyArPSAyKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCBwb3MpLCAiYW5kIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25vdF90ZXN0KENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfbm90X3Rlc3Qobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBub3RfdGVzdCkgJiYgKChuY2ggPT0gMSkgfHwgKG5jaCA9PSAyKSk7Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIGlmIChuY2ggPT0gMikKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAibm90IikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9ub3RfdGVzdChDSElMRCh0cmVlLCAxKSkpOwotICAgICAgICBlbHNlIGlmIChuY2ggPT0gMSkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbXBhcmlzb24oQ0hJTEQodHJlZSwgMCkpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfY29tcGFyaXNvbihub2RlICp0cmVlKQotewotICAgIGludCBwb3M7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGNvbXBhcmlzb24pCi0gICAgICAgICAgICAgICAmJiBpc19vZGQobmNoKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZXhwcihDSElMRCh0cmVlLCAwKSkpOwotCi0gICAgZm9yIChwb3MgPSAxOyByZXMgJiYgKHBvcyA8IG5jaCk7IHBvcyArPSAyKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfY29tcF9vcChDSElMRCh0cmVlLCBwb3MpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZXhwcihDSElMRCh0cmVlLCBwb3MgKyAxKSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2NvbXBfb3Aobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcmVzID0gMDsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotCi0gICAgaWYgKCF2YWxpZGF0ZV9udHlwZSh0cmVlLCBjb21wX29wKSkKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICBpZiAobmNoID09IDEpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogIE9ubHkgY2hpbGQgd2lsbCBiZSBhIHRlcm1pbmFsIHdpdGggYSB3ZWxsLWRlZmluZWQgc3ltYm9saWMgbmFtZQotICAgICAgICAgKiAgb3IgYSBOQU1FIHdpdGggYSBzdHJpbmcgb2YgZWl0aGVyICdpcycgb3IgJ2luJwotICAgICAgICAgKi8KLSAgICAgICAgdHJlZSA9IENISUxEKHRyZWUsIDApOwotICAgICAgICBzd2l0Y2ggKFRZUEUodHJlZSkpIHsKLSAgICAgICAgICBjYXNlIExFU1M6Ci0gICAgICAgICAgY2FzZSBHUkVBVEVSOgotICAgICAgICAgIGNhc2UgRVFFUVVBTDoKLSAgICAgICAgICBjYXNlIEVRVUFMOgotICAgICAgICAgIGNhc2UgTEVTU0VRVUFMOgotICAgICAgICAgIGNhc2UgR1JFQVRFUkVRVUFMOgotICAgICAgICAgIGNhc2UgTk9URVFVQUw6Ci0gICAgICAgICAgICAgIHJlcyA9IDE7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgTkFNRToKLSAgICAgICAgICAgICAgcmVzID0gKChzdHJjbXAoU1RSKHRyZWUpLCAiaW4iKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgfHwgKHN0cmNtcChTVFIodHJlZSksICJpcyIpID09IDApKTsKLSAgICAgICAgICAgICAgaWYgKCFyZXMpIHsKLSAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgb3BlcmF0b3IgJyVzJyIsIFNUUih0cmVlKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBjb21wYXJpc29uIG9wZXJhdG9yIHR5cGUiKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoKHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJjb21wX29wIikpICE9IDApIHsKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDApLCBOQU1FKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMSksIE5BTUUpCi0gICAgICAgICAgICAgICAmJiAoKChzdHJjbXAoU1RSKENISUxEKHRyZWUsIDApKSwgImlzIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKHN0cmNtcChTVFIoQ0hJTEQodHJlZSwgMSkpLCAibm90IikgPT0gMCkpCi0gICAgICAgICAgICAgICAgICAgfHwgKChzdHJjbXAoU1RSKENISUxEKHRyZWUsIDApKSwgIm5vdCIpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICYmIChzdHJjbXAoU1RSKENISUxEKHRyZWUsIDEpKSwgImluIikgPT0gMCkpKSk7Ci0gICAgICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgZXJyX3N0cmluZygidW5rbm93biBjb21wYXJpc29uIG9wZXJhdG9yIik7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9zdGFyX2V4cHIobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgc3Rhcl9leHByKTsKLSAgICBpZiAoIXJlcykgcmV0dXJuIHJlczsKLSAgICBpZiAoIXZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJzdGFyX2V4cHIiKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDApLCBTVEFSKSAmJiAgICAgIFwKLSAgICAgICAgdmFsaWRhdGVfZXhwcihDSElMRCh0cmVlLCAxKSk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfZXhwcihub2RlICp0cmVlKQotewotICAgIGludCBqOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBleHByKQotICAgICAgICAgICAgICAgJiYgaXNfb2RkKG5jaCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3hvcl9leHByKENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICBmb3IgKGogPSAyOyByZXMgJiYgKGogPCBuY2gpOyBqICs9IDIpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV94b3JfZXhwcihDSElMRCh0cmVlLCBqKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3ZiYXIoQ0hJTEQodHJlZSwgaiAtIDEpKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfeG9yX2V4cHIobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgajsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgeG9yX2V4cHIpCi0gICAgICAgICAgICAgICAmJiBpc19vZGQobmNoKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfYW5kX2V4cHIoQ0hJTEQodHJlZSwgMCkpKTsKLQotICAgIGZvciAoaiA9IDI7IHJlcyAmJiAoaiA8IG5jaCk7IGogKz0gMikKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NpcmN1bWZsZXgoQ0hJTEQodHJlZSwgaiAtIDEpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfYW5kX2V4cHIoQ0hJTEQodHJlZSwgaikpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9hbmRfZXhwcihub2RlICp0cmVlKQotewotICAgIGludCBwb3M7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGFuZF9leHByKQotICAgICAgICAgICAgICAgJiYgaXNfb2RkKG5jaCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3NoaWZ0X2V4cHIoQ0hJTEQodHJlZSwgMCkpKTsKLQotICAgIGZvciAocG9zID0gMTsgcmVzICYmIChwb3MgPCBuY2gpOyBwb3MgKz0gMikKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2FtcGVyc2FuZChDSElMRCh0cmVlLCBwb3MpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc2hpZnRfZXhwcihDSElMRCh0cmVlLCBwb3MgKyAxKSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2NoYWluX3R3b19vcHMobm9kZSAqdHJlZSwgaW50ICgqdGVybXZhbGlkKShub2RlICopLCBpbnQgb3AxLCBpbnQgb3AyKQotIHsKLSAgICBpbnQgcG9zID0gMTsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAoaXNfb2RkKG5jaCkKLSAgICAgICAgICAgICAgICYmICgqdGVybXZhbGlkKShDSElMRCh0cmVlLCAwKSkpOwotCi0gICAgZm9yICggOyByZXMgJiYgKHBvcyA8IG5jaCk7IHBvcyArPSAyKSB7Ci0gICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIHBvcykpICE9IG9wMSkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIHBvcyksIG9wMik7Ci0gICAgICAgIGlmIChyZXMpCi0gICAgICAgICAgICByZXMgPSAoKnRlcm12YWxpZCkoQ0hJTEQodHJlZSwgcG9zICsgMSkpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfc2hpZnRfZXhwcihub2RlICp0cmVlKQotewotICAgIHJldHVybiAodmFsaWRhdGVfbnR5cGUodHJlZSwgc2hpZnRfZXhwcikKLSAgICAgICAgICAgICYmIHZhbGlkYXRlX2NoYWluX3R3b19vcHModHJlZSwgdmFsaWRhdGVfYXJpdGhfZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVGVFNISUZULCBSSUdIVFNISUZUKSk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfYXJpdGhfZXhwcihub2RlICp0cmVlKQotewotICAgIHJldHVybiAodmFsaWRhdGVfbnR5cGUodHJlZSwgYXJpdGhfZXhwcikKLSAgICAgICAgICAgICYmIHZhbGlkYXRlX2NoYWluX3R3b19vcHModHJlZSwgdmFsaWRhdGVfdGVybSwgUExVUywgTUlOVVMpKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV90ZXJtKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHBvcyA9IDE7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHRlcm0pCi0gICAgICAgICAgICAgICAmJiBpc19vZGQobmNoKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZmFjdG9yKENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICBmb3IgKCA7IHJlcyAmJiAocG9zIDwgbmNoKTsgcG9zICs9IDIpCi0gICAgICAgIHJlcyA9ICgoKFRZUEUoQ0hJTEQodHJlZSwgcG9zKSkgPT0gU1RBUikKLSAgICAgICAgICAgICAgIHx8IChUWVBFKENISUxEKHRyZWUsIHBvcykpID09IFNMQVNIKQotICAgICAgICAgICAgICAgfHwgKFRZUEUoQ0hJTEQodHJlZSwgcG9zKSkgPT0gRE9VQkxFU0xBU0gpCi0gICAgICAgICAgICAgICB8fCAoVFlQRShDSElMRCh0cmVlLCBwb3MpKSA9PSBQRVJDRU5UKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2ZhY3RvcihDSElMRCh0cmVlLCBwb3MgKyAxKSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICBmYWN0b3I6Ci0gKgotICogIGZhY3RvcjogKCcrJ3wnLSd8J34nKSBmYWN0b3IgfCBwb3dlcgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9mYWN0b3Iobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZmFjdG9yKQotICAgICAgICAgICAgICAgJiYgKCgobmNoID09IDIpCi0gICAgICAgICAgICAgICAgICAgICYmICgoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gUExVUykKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChUWVBFKENISUxEKHRyZWUsIDApKSA9PSBNSU5VUykKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChUWVBFKENISUxEKHRyZWUsIDApKSA9PSBUSUxERSkpCi0gICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2ZhY3RvcihDSElMRCh0cmVlLCAxKSkpCi0gICAgICAgICAgICAgICAgICAgfHwgKChuY2ggPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfcG93ZXIoQ0hJTEQodHJlZSwgMCkpKSkpOwotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgcG93ZXI6Ci0gKgotICogIHBvd2VyOiBhdG9tX2V4cHIgdHJhaWxlciogWycqKicgZmFjdG9yXQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9wb3dlcihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBwb3dlcikgJiYgKG5jaCA+PSAxKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfYXRvbV9leHByKENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICBpZiAobmNoID4gMSkgewotICAgICAgICBpZiAobmNoICE9IDMpIHsKLSAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgbnVtYmVyIG9mIG5vZGVzIGZvciAncG93ZXInIik7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICB9Ci0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9kb3VibGVzdGFyKENISUxEKHRyZWUsIDEpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZmFjdG9yKENISUxEKHRyZWUsIDIpKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICBhdG9tX2V4cHI6Ci0gKgotICogIGF0b21fZXhwcjogW0FXQUlUXSBhdG9tIHRyYWlsZXIqCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2F0b21fZXhwcihub2RlICp0cmVlKQotewotICAgIGludCBzdGFydCA9IDA7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzOwotICAgIGludCBwb3M7Ci0KLSAgICByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBhdG9tX2V4cHIpICYmIChuY2ggPj0gMSk7Ci0gICAgaWYgKCFyZXMpIHsKLSAgICAgICAgcmV0dXJuIChyZXMpOwotICAgIH0KLQotICAgIGlmIChUWVBFKENISUxEKHRyZWUsIDApKSA9PSBBV0FJVCkgewotICAgICAgICBzdGFydCA9IDE7Ci0gICAgICAgIGlmIChuY2ggPCAyKSB7Ci0gICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIG51bWJlciBvZiBub2RlcyBmb3IgJ2F0b21fZXhwciciKTsKLSAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXMgPSB2YWxpZGF0ZV9hdG9tKENISUxEKHRyZWUsIHN0YXJ0KSk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICBwb3MgPSBzdGFydCArIDE7Ci0gICAgICAgIHdoaWxlIChyZXMgJiYgKHBvcyA8IG5jaCkgJiYgKFRZUEUoQ0hJTEQodHJlZSwgcG9zKSkgPT0gdHJhaWxlcikpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90cmFpbGVyKENISUxEKHRyZWUsIHBvcysrKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2F0b20obm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcG9zOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIGF0b20pOwotCi0gICAgaWYgKHJlcyAmJiBuY2ggPCAxKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCBuY2grMSwgImF0b20iKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIHN3aXRjaCAoVFlQRShDSElMRCh0cmVlLCAwKSkpIHsKLSAgICAgICAgICBjYXNlIExQQVI6Ci0gICAgICAgICAgICByZXMgPSAoKG5jaCA8PSAzKQotICAgICAgICAgICAgICAgICAgICYmICh2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgbmNoIC0gMSkpKSk7Ci0KLSAgICAgICAgICAgIGlmIChyZXMgJiYgKG5jaCA9PSAzKSkgewotICAgICAgICAgICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIDEpKT09eWllbGRfZXhwcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3lpZWxkX2V4cHIoQ0hJTEQodHJlZSwgMSkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3RsaXN0X2NvbXAoQ0hJTEQodHJlZSwgMSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBMU1FCOgotICAgICAgICAgICAgaWYgKG5jaCA9PSAyKQotICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDEpLCBSU1FCKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5jaCA9PSAzKQotICAgICAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV90ZXN0bGlzdF9jb21wKENISUxEKHRyZWUsIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAyKSwgUlNRQikpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIGxpc3QgZGlzcGxheSBhdG9tIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIExCUkFDRToKLSAgICAgICAgICAgIHJlcyA9ICgobmNoIDw9IDMpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgbmNoIC0gMSksIFJCUkFDRSkpOwotCi0gICAgICAgICAgICBpZiAocmVzICYmIChuY2ggPT0gMykpCi0gICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZGljdG9yc2V0bWFrZXIoQ0hJTEQodHJlZSwgMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBOQU1FOgotICAgICAgICAgIGNhc2UgTlVNQkVSOgotICAgICAgICAgIGNhc2UgRUxMSVBTSVM6Ci0gICAgICAgICAgICByZXMgPSAobmNoID09IDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICBmb3IgKHBvcyA9IDE7IHJlcyAmJiAocG9zIDwgbmNoKTsgKytwb3MpCi0gICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgcG9zKSwgU1RSSU5HKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICB0ZXN0bGlzdF9jb21wOgotICogICAgKHRlc3R8c3Rhcl9leHByKSAoIGNvbXBfZm9yIHwgKCcsJyAodGVzdHxzdGFyX2V4cHIpKSogWycsJ10gKQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV90ZXN0bGlzdF9jb21wKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgb2s7Ci0KLSAgICBpZiAobmNoID09IDApIHsKLSAgICAgICAgZXJyX3N0cmluZygibWlzc2luZyBjaGlsZCBub2RlcyBvZiB0ZXN0bGlzdF9jb21wIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChuY2ggPT0gMiAmJiBUWVBFKENISUxEKHRyZWUsIDEpKSA9PSBjb21wX2ZvcikgewotICAgICAgICBvayA9ICh2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDApKQotICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbXBfZm9yKENISUxEKHRyZWUsIDEpKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBvayA9IHZhbGlkYXRlX3JlcGVhdGluZ19saXN0KHRyZWUsCi0gICAgICAgICAgICAgICAgdGVzdGxpc3RfY29tcCwKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZV90ZXN0X29yX3N0YXJfZXhwciwKLSAgICAgICAgICAgICAgICAidGVzdGxpc3RfY29tcCIpOwotICAgIH0KLSAgICByZXR1cm4gb2s7Ci19Ci0KLS8qICBkZWNvcmF0b3I6Ci0gKiAgICAnQCcgZG90dGVkX25hbWUgWyAnKCcgW2FyZ2xpc3RdICcpJyBdIE5FV0xJTkUKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfZGVjb3JhdG9yKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG9rOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgb2sgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZGVjb3JhdG9yKSAmJgotICAgICAgICAgIChuY2ggPT0gMyB8fCBuY2ggPT0gNSB8fCBuY2ggPT0gNikgJiYKLSAgICAgICAgICB2YWxpZGF0ZV9hdChDSElMRCh0cmVlLCAwKSkgJiYKLSAgICAgICAgICB2YWxpZGF0ZV9kb3R0ZWRfbmFtZShDSElMRCh0cmVlLCAxKSkgJiYKLSAgICAgICAgICB2YWxpZGF0ZV9uZXdsaW5lKFJDSElMRCh0cmVlLCAtMSkpKTsKLQotICAgIGlmIChvayAmJiBuY2ggIT0gMykgewotICAgICAgICBvayA9ICh2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwgMikpICYmCi0gICAgICAgICAgICAgIHZhbGlkYXRlX3JwYXJlbihSQ0hJTEQodHJlZSwgLTIpKSk7Ci0KLSAgICAgICAgaWYgKG9rICYmIG5jaCA9PSA2KQotICAgICAgICAgICAgb2sgPSB2YWxpZGF0ZV9hcmdsaXN0KENISUxEKHRyZWUsIDMpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb2s7Ci19Ci0KLS8qICBkZWNvcmF0b3JzOgotICogICAgZGVjb3JhdG9yKwotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9kZWNvcmF0b3JzKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IGksIG5jaCwgb2s7Ci0gICAgbmNoID0gTkNIKHRyZWUpOwotICAgIG9rID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgZGVjb3JhdG9ycykgJiYgbmNoID49IDE7Ci0KLSAgICBmb3IgKGkgPSAwOyBvayAmJiBpIDwgbmNoOyArK2kpCi0gICAgICAgIG9rID0gdmFsaWRhdGVfZGVjb3JhdG9yKENISUxEKHRyZWUsIGkpKTsKLQotICAgIHJldHVybiBvazsKLX0KLQotLyogIHdpdGhfaXRlbToKLSAqICAgdGVzdCBbJ2FzJyBleHByXQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV93aXRoX2l0ZW0obm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCBvayA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCB3aXRoX2l0ZW0pCi0gICAgICAgICAgICAgICYmIChuY2ggPT0gMSB8fCBuY2ggPT0gMykKLSAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAwKSkpOwotICAgIGlmIChvayAmJiBuY2ggPT0gMykKLSAgICAgICAgb2sgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAxKSwgImFzIikKLSAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZXhwcihDSElMRCh0cmVlLCAyKSkpOwotICAgIHJldHVybiBvazsKLX0KLQotLyogIHdpdGhfc3RtdDoKLSAqICAgIDAgICAgICAxICAgICAgICAgIC4uLiAgICAgICAgICAgICAtMiAgIC0xCi0gKiAgICd3aXRoJyB3aXRoX2l0ZW0gKCcsJyB3aXRoX2l0ZW0pKiAnOicgc3VpdGUKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfd2l0aF9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgb2sgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgd2l0aF9zdG10KQotICAgICAgICAmJiAobmNoICUgMiA9PSAwKQotICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAid2l0aCIpCi0gICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKFJDSElMRCh0cmVlLCAtMikpCi0gICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKFJDSElMRCh0cmVlLCAtMSkpKTsKLSAgICBmb3IgKGkgPSAxOyBvayAmJiBpIDwgbmNoIC0gMjsgaSArPSAyKQotICAgICAgICBvayA9IHZhbGlkYXRlX3dpdGhfaXRlbShDSElMRCh0cmVlLCBpKSk7Ci0gICAgcmV0dXJuIG9rOwotfQotCi0vKiBmdW5jZGVmOiAnZGVmJyBOQU1FIHBhcmFtZXRlcnMgWyctPicgdGVzdF0gJzonIHN1aXRlICovCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2Z1bmNkZWYobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBmdW5jZGVmKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIGlmIChuY2ggPT0gNSkgewotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJkZWYiKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDEpLCBOQU1FKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3BhcmFtZXRlcnMoQ0hJTEQodHJlZSwgMikpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgMykpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgNCkpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChuY2ggPT0gNykgewotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJkZWYiKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDEpLCBOQU1FKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3BhcmFtZXRlcnMoQ0hJTEQodHJlZSwgMikpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfcmFycm93KENISUxEKHRyZWUsIDMpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgNCkpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgNSkpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgNikpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgZnVuY2RlZiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qIGFzeW5jX2Z1bmNkZWY6IEFTWU5DIGZ1bmNkZWYgKi8KLQotc3RhdGljIGludAotdmFsaWRhdGVfYXN5bmNfZnVuY2RlZihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIGFzeW5jX2Z1bmNkZWYpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgaWYgKG5jaCA9PSAyKSB7Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMCksIEFTWU5DKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2Z1bmNkZWYoQ0hJTEQodHJlZSwgMSkpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgYXN5bmNfZnVuY2RlZiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotLyogYXN5bmNfc3RtdDogQVNZTkMgKGZ1bmNkZWYgfCB3aXRoX3N0bXQgfCBmb3Jfc3RtdCkgKi8KLQotc3RhdGljIGludAotdmFsaWRhdGVfYXN5bmNfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBhc3luY19zdG10KQotICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDApLCBBU1lOQykpOwotCi0gICAgaWYgKG5jaCAhPSAyKSB7Ci0gICAgICAgIHJlcyA9IDA7Ci0gICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgbnVtYmVyIG9mIGNoaWxkcmVuIGZvciBhc3luY19zdG10Iik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgMSkpID09IGZ1bmNkZWYpIHsKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2Z1bmNkZWYoQ0hJTEQodHJlZSwgMSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFRZUEUoQ0hJTEQodHJlZSwgMSkpID09IHdpdGhfc3RtdCkgewotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfd2l0aF9zdG10KENISUxEKHRyZWUsIDEpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChUWVBFKENISUxEKHRyZWUsIDEpKSA9PSBmb3Jfc3RtdCkgewotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZm9yKENISUxEKHRyZWUsIDEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotCi0vKiBkZWNvcmF0ZWQKLSAqICAgZGVjb3JhdG9ycyAoY2xhc3NkZWYgfCBmdW5jZGVmKQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9kZWNvcmF0ZWQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCBvayA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBkZWNvcmF0ZWQpCi0gICAgICAgICAgICAgICYmIChuY2ggPT0gMikKLSAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZGVjb3JhdG9ycyhSQ0hJTEQodHJlZSwgLTIpKSk7Ci0gICAgaWYgKFRZUEUoUkNISUxEKHRyZWUsIC0xKSkgPT0gZnVuY2RlZikKLSAgICAgICAgb2sgPSBvayAmJiB2YWxpZGF0ZV9mdW5jZGVmKFJDSElMRCh0cmVlLCAtMSkpOwotICAgIGVsc2UKLSAgICAgICAgb2sgPSBvayAmJiB2YWxpZGF0ZV9jbGFzcyhSQ0hJTEQodHJlZSwgLTEpKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2xhbWJkZWYobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgbGFtYmRlZikKLSAgICAgICAgICAgICAgICYmICgobmNoID09IDMpIHx8IChuY2ggPT0gNCkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAibGFtYmRhIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIG5jaCAtIDIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCBuY2ggLSAxKSkpOwotCi0gICAgaWYgKHJlcyAmJiAobmNoID09IDQpKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV92YXJhcmdzbGlzdChDSElMRCh0cmVlLCAxKSk7Ci0gICAgZWxzZSBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgKHZvaWQpIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDMsICJsYW1iZGVmIik7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfbGFtYmRlZl9ub2NvbmQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgbGFtYmRlZl9ub2NvbmQpCi0gICAgICAgICAgICAgICAmJiAoKG5jaCA9PSAzKSB8fCAobmNoID09IDQpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImxhbWJkYSIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCBuY2ggLSAyKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgbmNoIC0gMSkpKTsKLQotICAgIGlmIChyZXMgJiYgKG5jaCA9PSA0KSkKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfdmFyYXJnc2xpc3QoQ0hJTEQodHJlZSwgMSkpOwotICAgIGVsc2UgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICh2b2lkKSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAzLCAibGFtYmRlZl9ub2NvbmQiKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgYXJnbGlzdDoKLSAqCi0gKiAgKGFyZ3VtZW50ICcsJykqIChhcmd1bWVudCBbJywnXSB8ICcqJyB0ZXN0IFsnLCcgJyoqJyB0ZXN0XSB8ICcqKicgdGVzdCkKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfYXJnbGlzdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IGkgPSAwOwotICAgIGludCBvayA9IDE7Ci0KLSAgICBpZiAobmNoIDw9IDApCi0gICAgICAgIC8qIHJhaXNlIHRoZSByaWdodCBlcnJvciBmcm9tIGhhdmluZyBhbiBpbnZhbGlkIG51bWJlciBvZiBjaGlsZHJlbiAqLwotICAgICAgICByZXR1cm4gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgbmNoICsgMSwgImFyZ2xpc3QiKTsKLQotICAgIGlmIChuY2ggPiAxKSB7Ci0gICAgICAgIGZvciAoaT0wOyBpPG5jaDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCBpKSkgPT0gYXJndW1lbnQpIHsKLSAgICAgICAgICAgICAgICBub2RlICpjaCA9IENISUxEKHRyZWUsIGkpOwotICAgICAgICAgICAgICAgIGlmIChOQ0goY2gpID09IDIgJiYgVFlQRShDSElMRChjaCwgMSkpID09IGNvbXBfZm9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycl9zdHJpbmcoIm5lZWQgJygnLCAnKScgZm9yIGdlbmVyYXRvciBleHByZXNzaW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlIChvayAmJiBuY2gtaSA+PSAyKSB7Ci0gICAgICAgIC8qIHNraXAgbGVhZGluZyAoYXJndW1lbnQgJywnKSAqLwotICAgICAgICBvayA9ICh2YWxpZGF0ZV9hcmd1bWVudChDSElMRCh0cmVlLCBpKSkKLSAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgaSsxKSkpOwotICAgICAgICBpZiAob2spCi0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgfQotICAgIG9rID0gMTsKLSAgICBpZiAobmNoLWkgPiAwKSB7Ci0gICAgICAgIGludCBzeW0gPSBUWVBFKENISUxEKHRyZWUsIGkpKTsKLQotICAgICAgICBpZiAoc3ltID09IGFyZ3VtZW50KSB7Ci0gICAgICAgICAgICBvayA9IHZhbGlkYXRlX2FyZ3VtZW50KENISUxEKHRyZWUsIGkpKTsKLSAgICAgICAgICAgIGlmIChvayAmJiBpKzEgIT0gbmNoKSB7Ci0gICAgICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBhcmdsaXN0IHNwZWNpZmljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiIChleHRyYSBzdHVmZiBvbiBlbmQpIik7Ci0gICAgICAgICAgICAgICAgb2sgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIGFyZ2xpc3Qgc3BlY2lmaWNhdGlvbiIpOwotICAgICAgICAgICAgb2sgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAob2spOwotfQotCi0KLQotLyogIGFyZ3VtZW50OiAoIHRlc3QgW2NvbXBfZm9yXSB8Ci0gKiAgICAgICAgICAgICAgdGVzdCAnPScgdGVzdCB8Ci0gKiAgICAgICAgICAgICAgJyoqJyB0ZXN0IHwKLSAqICAgICAgICAgICAgICAnKicgdGVzdCApCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2FyZ3VtZW50KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGFyZ3VtZW50KQotICAgICAgICAgICAgICAgJiYgKChuY2ggPT0gMSkgfHwgKG5jaCA9PSAyKSB8fCAobmNoID09IDMpKSk7Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIDApKSA9PSBET1VCTEVTVEFSKSB7Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDEpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChUWVBFKENISUxEKHRyZWUsIDApKSA9PSBTVEFSKSB7Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDEpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChuY2ggPT0gMSkgewotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAwKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmNoID09IDIpIHsKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDApKQotICAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb21wX2ZvcihDSElMRCh0cmVlLCAxKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJlcyAmJiAobmNoID09IDMpKSB7Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZXF1YWwoQ0hJTEQodHJlZSwgMSkpCi0gICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMikpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotCi0vKiAgdHJhaWxlcjoKLSAqCi0gKiAgJygnIFthcmdsaXN0XSAnKScgfCAnWycgc3Vic2NyaXB0bGlzdCAnXScgfCAnLicgTkFNRQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV90cmFpbGVyKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgdHJhaWxlcikgJiYgKChuY2ggPT0gMikgfHwgKG5jaCA9PSAzKSk7Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIHN3aXRjaCAoVFlQRShDSElMRCh0cmVlLCAwKSkpIHsKLSAgICAgICAgICBjYXNlIExQQVI6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgbmNoIC0gMSkpOwotICAgICAgICAgICAgaWYgKHJlcyAmJiAobmNoID09IDMpKQotICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2FyZ2xpc3QoQ0hJTEQodHJlZSwgMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBMU1FCOgotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDMsICJ0cmFpbGVyIikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWJzY3JpcHRsaXN0KENISUxEKHRyZWUsIDEpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDIpLCBSU1FCKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIERPVDoKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAidHJhaWxlciIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMSksIE5BTUUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICh2b2lkKSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAidHJhaWxlciIpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIHN1YnNjcmlwdGxpc3Q6Ci0gKgotICogIHN1YnNjcmlwdCAoJywnIHN1YnNjcmlwdCkqIFsnLCddCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3N1YnNjcmlwdGxpc3Qobm9kZSAqdHJlZSkKLXsKLSAgICByZXR1cm4gKHZhbGlkYXRlX3JlcGVhdGluZ19saXN0KHRyZWUsIHN1YnNjcmlwdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9zdWJzY3JpcHQsICJzdWJzY3JpcHRsaXN0IikpOwotfQotCi0KLS8qICBzdWJzY3JpcHQ6Ci0gKgotICogICcuJyAnLicgJy4nIHwgdGVzdCB8IFt0ZXN0XSAnOicgW3Rlc3RdIFtzbGljZW9wXQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9zdWJzY3JpcHQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBzdWJzY3JpcHQpICYmIChuY2ggPj0gMSkgJiYgKG5jaCA8PSA0KTsKLQotICAgIGlmICghcmVzKSB7Ci0gICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgIGVycl9zdHJpbmcoImludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3Igc3Vic2NyaXB0IG5vZGUiKTsKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IERPVCkKLSAgICAgICAgLyogdGFrZSBjYXJlIG9mICgnLicgJy4nICcuJykgcG9zc2liaWxpdHkgKi8KLSAgICAgICAgcmV0dXJuICh2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAzLCAic3Vic2NyaXB0IikKLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kb3QoQ0hJTEQodHJlZSwgMCkpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZG90KENISUxEKHRyZWUsIDEpKQotICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2RvdChDSElMRCh0cmVlLCAyKSkpOwotICAgIGlmIChuY2ggPT0gMSkgewotICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gdGVzdCkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCAwKSk7Ci0gICAgICAgIHJldHVybiAocmVzKTsKLSAgICB9Ci0gICAgLyogIE11c3QgYmUgW3Rlc3RdICc6JyBbdGVzdF0gW3NsaWNlb3BdLAotICAgICAqICBidXQgYXQgbGVhc3Qgb25lIG9mIHRoZSBvcHRpb25hbCBjb21wb25lbnRzIHdpbGwKLSAgICAgKiAgYmUgcHJlc2VudCwgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggeWV0LgotICAgICAqLwotICAgIGlmICgoVFlQRShDSElMRCh0cmVlLCAwKSkgIT0gQ09MT04pIHx8IChuY2ggPT0gNCkpIHsKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAwKSk7Ci0gICAgICAgIG9mZnNldCA9IDE7Ci0gICAgfQotICAgIGlmIChyZXMpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIG9mZnNldCkpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgaW50IHJlbSA9IG5jaCAtICsrb2Zmc2V0OwotICAgICAgICBpZiAocmVtKSB7Ci0gICAgICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCBvZmZzZXQpKSA9PSB0ZXN0KSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCBvZmZzZXQpKTsKLSAgICAgICAgICAgICAgICArK29mZnNldDsKLSAgICAgICAgICAgICAgICAtLXJlbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXMgJiYgcmVtKQotICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3NsaWNlb3AoQ0hJTEQodHJlZSwgb2Zmc2V0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3NsaWNlb3Aobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAoKG5jaCA9PSAxKSB8fCB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAic2xpY2VvcCIpKQotICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZSh0cmVlLCBzbGljZW9wKTsKLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICByZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAic2xpY2VvcCIpOwotICAgIH0KLSAgICBpZiAocmVzKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCAwKSk7Ci0gICAgaWYgKHJlcyAmJiAobmNoID09IDIpKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDEpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV90ZXN0X29yX3N0YXJfZXhwcihub2RlICpuKQotewotICAgIGlmIChUWVBFKG4pID09IHRlc3QpCi0gICAgICAgIHJldHVybiB2YWxpZGF0ZV90ZXN0KG4pOwotICAgIHJldHVybiB2YWxpZGF0ZV9zdGFyX2V4cHIobik7Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2V4cHJfb3Jfc3Rhcl9leHByKG5vZGUgKm4pCi17Ci0gICAgaWYgKFRZUEUobikgPT0gZXhwcikKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlX2V4cHIobik7Ci0gICAgcmV0dXJuIHZhbGlkYXRlX3N0YXJfZXhwcihuKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9leHBybGlzdChub2RlICp0cmVlKQotewotICAgIHJldHVybiAodmFsaWRhdGVfcmVwZWF0aW5nX2xpc3QodHJlZSwgZXhwcmxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9leHByX29yX3N0YXJfZXhwciwgImV4cHJsaXN0IikpOwotfQotCi0vKiBJbmNyZW1lbnRpbmcgdmFsaWRhdGUgZnVuY3Rpb25zIHJldHVybnMgbm9uemVybyBpZmYgc3VjY2VzcyAobGlrZSBvdGhlcgotICogdmFsaWRhdGUgZnVuY3Rpb25zLCBhbmQgYWR2YW5jZSAqaSBieSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHBhdHRlcm4uICovCi0KLS8qIHRlc3QgJzonIHRlc3QgKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3Rlc3RfY29sb25fdGVzdF9pbmMobm9kZSAqdHJlZSwgaW50ICppKQotewotICAgIHJldHVybiAodmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAoKmkpKyspKQotICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgKCppKSsrKSkKLSAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgKCppKSsrKSkpOwotfQotCi0vKiB0ZXN0ICc6JyB0ZXN0IHwgJyoqJyBleHByICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9kaWN0X2VsZW1lbnRfaW5jKG5vZGUgKnRyZWUsIGludCAqaSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAwOwotICAgIGlmIChuY2ggLSAqaSA+PSAyKSB7Ci0gICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsICppKzEpKSA9PSBDT0xPTikgewotICAgICAgICAgICAgLyogdGVzdCAnOicgdGVzdCAqLwotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdF9jb2xvbl90ZXN0X2luYyh0cmVlLCBpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qICcqKicgZXhwciAqLwotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX2RvdWJsZXN0YXIoQ0hJTEQodHJlZSwgKCppKSsrKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZXhwcihDSElMRCh0cmVlLCAoKmkpKyspKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotLyoKLSAqICBkaWN0b3JzZXRtYWtlcjoKLSAqCi0gKiAgICggKCh0ZXN0ICc6JyB0ZXN0IHwgJyoqJyBleHByKQotICogICAgICAoY29tcF9mb3IgfCAoJywnICh0ZXN0ICc6JyB0ZXN0IHwgJyoqJyBleHByKSkqIFsnLCddKSkgfAotICogICAgICgodGVzdCB8ICcqJyB0ZXN0KQotICogICAgICAoY29tcF9mb3IgfCAoJywnICh0ZXN0IHwgJyonIHRlc3QpKSogWycsJ10pKSApCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2RpY3RvcnNldG1ha2VyKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzOwotICAgIGludCBpID0gMDsKLQotICAgIHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIGRpY3RvcnNldG1ha2VyKTsKLSAgICBpZiAoIXJlcykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAobmNoIC0gaSA8IDEpIHsKLSAgICAgICAgLyogVW5jb25kaXRpb25hbGx5IHJhaXNlLiAqLwotICAgICAgICAodm9pZCkgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgImRpY3RvcnNldG1ha2VyIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChuY2ggLSBpID49IDIKLSAgICAgICAgJiYgKChUWVBFKENISUxEKHRyZWUsIGkrMSkpID09IENPTE9OKSB8fAotICAgICAgICAgICAgKFRZUEUoQ0hJTEQodHJlZSwgaSkpID09IERPVUJMRVNUQVIpKSkgewotICAgICAgICAvKiBEaWN0aW9uYXJ5IGRpc3BsYXkgb3IgZGljdGlvbmFyeSBjb21wcmVoZW5zaW9uLiAqLwotICAgICAgICBpZiAobmNoIC0gaSA+PSA0ICYmIFRZUEUoQ0hJTEQodHJlZSwgaSszKSkgPT0gY29tcF9mb3IpIHsKLSAgICAgICAgICAgIC8qIERpY3Rpb25hcnkgY29tcHJlaGVuc2lvbi4gKi8KLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV90ZXN0X2NvbG9uX3Rlc3RfaW5jKHRyZWUsICZpKQotICAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb21wX2ZvcihDSElMRCh0cmVlLCBpKyspKSk7Ci0gICAgICAgICAgICBpZiAoIXJlcykKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIERpY3Rpb25hcnkgZGlzcGxheS4gKi8KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9yZXBlYXRpbmdfbGlzdF92YXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgZGljdG9yc2V0bWFrZXIsCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX2RpY3RfZWxlbWVudF9pbmMsCi0gICAgICAgICAgICAgICAgICAgICZpLAotICAgICAgICAgICAgICAgICAgICAiZGljdG9yc2V0bWFrZXIiKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFNldCBkaXNwbGF5IG9yIHNldCBjb21wcmVoZW5zaW9uLiAqLwotICAgICAgICBpZiAobmNoIC0gaSA+PSAyICYmIFRZUEUoQ0hJTEQodHJlZSwgaSArIDEpKSA9PSBjb21wX2ZvcikgewotICAgICAgICAgICAgLyogU2V0IGNvbXByZWhlbnNpb24uICovCi0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCBpKyspKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbXBfZm9yKENISUxEKHRyZWUsIGkrKykpKTsKLSAgICAgICAgICAgIGlmICghcmVzKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogU2V0IGRpc3BsYXkuICovCi0gICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9yZXBlYXRpbmdfbGlzdCh0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdG9yc2V0bWFrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV90ZXN0X29yX3N0YXJfZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaWN0b3JzZXRtYWtlciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5jaCAtIGkgPiAwKSB7Ci0gICAgICAgIGVycl9zdHJpbmcoIklsbGVnYWwgdHJhaWxpbmcgbm9kZXMgZm9yIGRpY3RvcnNldG1ha2VyLiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9ldmFsX2lucHV0KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHBvczsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZXZhbF9pbnB1dCkKLSAgICAgICAgICAgICAgICYmIChuY2ggPj0gMikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3RsaXN0KENISUxEKHRyZWUsIDApKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgbmNoIC0gMSksIEVORE1BUktFUikpOwotCi0gICAgZm9yIChwb3MgPSAxOyByZXMgJiYgKHBvcyA8IChuY2ggLSAxKSk7ICsrcG9zKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCBwb3MpLCBORVdMSU5FKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9ub2RlKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50ICAgbmNoICA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogbnVtLiBjaGlsZHJlbiBvbiBjdXJyZW50IG5vZGUgICovCi0gICAgaW50ICAgcmVzICA9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogcmVzdWx0IHZhbHVlICAgICAgICAgICAgICAgICAgICovCi0gICAgbm9kZSogbmV4dCA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogbm9kZSB0byBwcm9jZXNzIGFmdGVyIHRoaXMgb25lICovCi0KLSAgICB3aGlsZSAocmVzICYmICh0cmVlICE9IDApKSB7Ci0gICAgICAgIG5jaCAgPSBOQ0godHJlZSk7Ci0gICAgICAgIG5leHQgPSAwOwotICAgICAgICBzd2l0Y2ggKFRZUEUodHJlZSkpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgRGVmaW5pdGlvbiBub2Rlcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgIGNhc2UgYXN5bmNfZnVuY2RlZjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2FzeW5jX2Z1bmNkZWYodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGFzeW5jX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9hc3luY19zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBmdW5jZGVmOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZnVuY2RlZih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2Ugd2l0aF9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfd2l0aF9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBjbGFzc2RlZjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NsYXNzKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBkZWNvcmF0ZWQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9kZWNvcmF0ZWQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgIlRyaXZpYWwiIHBhcnNlIHRyZWUgbm9kZXMuCi0gICAgICAgICAgICAgKiAgKFdoeSBkaWQgSSBjYWxsIHRoZXNlIHRyaXZpYWw/KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgY2FzZSBzdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2Ugc21hbGxfc3RtdDoKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgZXhwcl9zdG10IHwgZGVsX3N0bXQgfCBwYXNzX3N0bXQgfCBmbG93X3N0bXQgfAotICAgICAgICAgICAgICogIGltcG9ydF9zdG10IHwgZ2xvYmFsX3N0bXQgfCBub25sb2NhbF9zdG10IHwgYXNzZXJ0X3N0bXQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfc21hbGxfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgZmxvd19zdG10OgotICAgICAgICAgICAgcmVzICA9ICh2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAiZmxvd19zdG10IikKLSAgICAgICAgICAgICAgICAgICAgJiYgKChUWVBFKENISUxEKHRyZWUsIDApKSA9PSBicmVha19zdG10KQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IGNvbnRpbnVlX3N0bXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0geWllbGRfc3RtdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChUWVBFKENISUxEKHRyZWUsIDApKSA9PSByZXR1cm5fc3RtdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChUWVBFKENISUxEKHRyZWUsIDApKSA9PSByYWlzZV9zdG10KSkpOwotICAgICAgICAgICAgaWYgKHJlcykKLSAgICAgICAgICAgICAgICBuZXh0ID0gQ0hJTEQodHJlZSwgMCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChuY2ggPT0gMSkKLSAgICAgICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIGZsb3dfc3RtdCB0eXBlIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHlpZWxkX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV95aWVsZF9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIENvbXBvdW5kIHN0YXRlbWVudHMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICBjYXNlIHNpbXBsZV9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfc2ltcGxlX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGNvbXBvdW5kX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21wb3VuZF9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIEZ1bmRhbWVudGFsIHN0YXRlbWVudHMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICBjYXNlIGV4cHJfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2V4cHJfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgZGVsX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9kZWxfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgcGFzc19zdG10OgotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJwYXNzIikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAicGFzcyIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgYnJlYWtfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAiYnJlYWsiKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJicmVhayIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgY29udGludWVfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAiY29udGludWUiKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJjb250aW51ZSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgcmV0dXJuX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9yZXR1cm5fc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgcmFpc2Vfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3JhaXNlX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGltcG9ydF9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGltcG9ydF9uYW1lOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X25hbWUodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGltcG9ydF9mcm9tOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X2Zyb20odHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGdsb2JhbF9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZ2xvYmFsX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIG5vbmxvY2FsX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9ub25sb2NhbF9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBhc3NlcnRfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2Fzc2VydF9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBpZl9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfaWYodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHdoaWxlX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV93aGlsZSh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgZm9yX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9mb3IodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRyeV9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdHJ5KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBzdWl0ZToKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3N1aXRlKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIEV4cHJlc3Npb24gbm9kZXMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICBjYXNlIHRlc3RsaXN0OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdGxpc3QodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHlpZWxkX2V4cHI6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV95aWVsZF9leHByKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0ZXN0OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgYW5kX3Rlc3Q6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9hbmRfdGVzdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2Ugbm90X3Rlc3Q6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9ub3RfdGVzdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgY29tcGFyaXNvbjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbXBhcmlzb24odHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGV4cHJsaXN0OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZXhwcmxpc3QodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGNvbXBfb3A6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21wX29wKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBleHByOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZXhwcih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgeG9yX2V4cHI6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV94b3JfZXhwcih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgYW5kX2V4cHI6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9hbmRfZXhwcih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2Ugc2hpZnRfZXhwcjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3NoaWZ0X2V4cHIodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGFyaXRoX2V4cHI6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9hcml0aF9leHByKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0ZXJtOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVybSh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgZmFjdG9yOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZmFjdG9yKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBwb3dlcjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Bvd2VyKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBhdG9tOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfYXRvbSh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qIEhvcGVmdWxseSBuZXZlciByZWFjaGVkISAqLwotICAgICAgICAgICAgZXJyX3N0cmluZygidW5yZWNvZ25pemVkIG5vZGUgdHlwZSIpOwotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHRyZWUgPSBuZXh0OwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfZXhwcl90cmVlKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX2V2YWxfaW5wdXQodHJlZSk7Ci0KLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgZXJyX3N0cmluZygiY291bGQgbm90IHZhbGlkYXRlIGV4cHJlc3Npb24gdHVwbGUiKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgZmlsZV9pbnB1dDoKLSAqICAgICAgKE5FV0xJTkUgfCBzdG10KSogRU5ETUFSS0VSCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2ZpbGVfaW5wdXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgajsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpIC0gMTsKLSAgICBpbnQgcmVzID0gKChuY2ggPj0gMCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIG5jaCksIEVORE1BUktFUikpOwotCi0gICAgZm9yIChqID0gMDsgcmVzICYmIChqIDwgbmNoKTsgKytqKSB7Ci0gICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIGopKSA9PSBzdG10KQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfc3RtdChDSElMRCh0cmVlLCBqKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX25ld2xpbmUoQ0hJTEQodHJlZSwgaikpOwotICAgIH0KLSAgICAvKiAgVGhpcyBzdGF5cyBpbiB0byBwcmV2ZW50IGFueSBpbnRlcm5hbCBmYWlsdXJlcyBmcm9tIGdldHRpbmcgdG8gdGhlCi0gICAgICogIHVzZXIuICBIb3BlZnVsbHksIHRoaXMgd29uJ3QgYmUgbmVlZGVkLiAgSWYgYSB1c2VyIHJlcG9ydHMgZ2V0dGluZwotICAgICAqICB0aGlzLCB3ZSBoYXZlIHNvbWUgZGVidWdnaW5nIHRvIGRvLgotICAgICAqLwotICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICBlcnJfc3RyaW5nKCJWQUxJREFUSU9OIEZBSUxVUkU6IHJlcG9ydCB0aGlzIHRvIHRoZSBtYWludGFpbmVyISIpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9lbmNvZGluZ19kZWNsKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKChuY2ggPT0gMSkKLSAgICAgICAgJiYgdmFsaWRhdGVfZmlsZV9pbnB1dChDSElMRCh0cmVlLCAwKSkpOwotCi0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIGVycl9zdHJpbmcoIkVycm9yIFBhcnNpbmcgZW5jb2RpbmdfZGVjbCIpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQogc3RhdGljIFB5T2JqZWN0KgogcGlja2xlX2NvbnN0cnVjdG9yID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9wb3NpeG1vZHVsZS5jIGIvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCmluZGV4IGY2ZjA4YmYuLmNlNjQ2ODQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcG9zaXhtb2R1bGUuYworKysgYi9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKQEAgLTMyLDYgKzMyLDEyIEBACiAjaW5jbHVkZSAid2lucmVwYXJzZS5oIgogI2VuZGlmCiAKKy8qIE9uIGFuZHJvaWQgQVBJIGxldmVsIDIxLCAnQVRfRUFDQ0VTUycgaXMgbm90IGRlY2xhcmVkIGFsdGhvdWdoCisgKiBIQVZFX0ZBQ0NFU1NBVCBpcyBkZWZpbmVkLiAqLworI2lmZGVmIF9fQU5EUk9JRF9fCisjdW5kZWYgSEFWRV9GQUNDRVNTQVQKKyNlbmRpZgorCiAjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIG5lZWRlZCBmb3IgY3Rlcm1pZCgpICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtMTI3LDYgKzEzMywxMyBAQAogI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KICNlbmRpZgogCisjaWZkZWYgSEFWRV9MSU5VWF9SQU5ET01fSAorIyAgaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0dFVFJBTkRPTV9TWVNDQUxMCisjICBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2VuZGlmCisKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCiAjICBkZWZpbmUgVEVSTVNJWkVfVVNFX0NPTklPCiAjZWxpZiBkZWZpbmVkKEhBVkVfU1lTX0lPQ1RMX0gpCkBAIC0xNTEsNiArMTY0LDggQEAKICNkZWZpbmUgSEFWRV9HRVRMT0dJTiAgIDEKICNkZWZpbmUgSEFWRV9TUEFXTlYgICAgIDEKICNkZWZpbmUgSEFWRV9FWEVDViAgICAgIDEKKyNkZWZpbmUgSEFWRV9XU1BBV05WICAgIDEKKyNkZWZpbmUgSEFWRV9XRVhFQ1YgICAgIDEKICNkZWZpbmUgSEFWRV9QSVBFICAgICAgIDEKICNkZWZpbmUgSEFWRV9TWVNURU0gICAgIDEKICNkZWZpbmUgSEFWRV9DV0FJVCAgICAgIDEKQEAgLTYzNCwyMiArNjQ5LDE0IEBACiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotIyAgZGVmaW5lIF9QeUxvbmdfRnJvbURldiBQeUxvbmdfRnJvbUxvbmdMb25nCi0jZWxzZQotIyAgZGVmaW5lIF9QeUxvbmdfRnJvbURldiBQeUxvbmdfRnJvbUxvbmcKLSNlbmRpZgorI2RlZmluZSBfUHlMb25nX0Zyb21EZXYgUHlMb25nX0Zyb21Mb25nTG9uZwogCiAKICNpZiBkZWZpbmVkKEhBVkVfTUtOT0QpICYmIGRlZmluZWQoSEFWRV9NQUtFREVWKQogc3RhdGljIGludAogX1B5X0Rldl9Db252ZXJ0ZXIoUHlPYmplY3QgKm9iaiwgdm9pZCAqcCkKIHsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgICooKGRldl90ICopcCkgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKG9iaik7Ci0jZWxzZQotICAgICooKGRldl90ICopcCkgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcob2JqKTsKLSNlbmRpZgogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gMDsKICAgICByZXR1cm4gMTsKQEAgLTY3MSwyMSArNjc4LDIwIEBACiAjZW5kaWYKIAogc3RhdGljIGludAotX2ZkX2NvbnZlcnRlcihQeU9iamVjdCAqbywgaW50ICpwLCBjb25zdCBjaGFyICphbGxvd2VkKQorX2ZkX2NvbnZlcnRlcihQeU9iamVjdCAqbywgaW50ICpwKQogewogICAgIGludCBvdmVyZmxvdzsKICAgICBsb25nIGxvbmdfdmFsdWU7CiAKICAgICBQeU9iamVjdCAqaW5kZXggPSBQeU51bWJlcl9JbmRleChvKTsKICAgICBpZiAoaW5kZXggPT0gTlVMTCkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IHNob3VsZCBiZSAlcywgbm90ICUuMjAwcyIsCi0gICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLCBQeV9UWVBFKG8pLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayhpbmRleCkpOwogICAgIGxvbmdfdmFsdWUgPSBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3coaW5kZXgsICZvdmVyZmxvdyk7CiAgICAgUHlfREVDUkVGKGluZGV4KTsKKyAgICBhc3NlcnQoIVB5RXJyX09jY3VycmVkKCkpOwogICAgIGlmIChvdmVyZmxvdyA+IDAgfHwgbG9uZ192YWx1ZSA+IElOVF9NQVgpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiZmQgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKQEAgLTcwOCw3ICs3MTQsMTUgQEAKICAgICAgICAgKihpbnQgKilwID0gREVGQVVMVF9ESVJfRkQ7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICByZXR1cm4gX2ZkX2NvbnZlcnRlcihvLCAoaW50ICopcCwgImludGVnZXIiKTsKKyAgICBlbHNlIGlmIChQeUluZGV4X0NoZWNrKG8pKSB7CisgICAgICAgIHJldHVybiBfZmRfY29udmVydGVyKG8sIChpbnQgKilwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgc2hvdWxkIGJlIGludGVnZXIgb3IgTm9uZSwgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG8pLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogfQogCiAKQEAgLTcyMyw3ICs3MzcsNyBAQAogICoKICAqICAgKiBPbiBXaW5kb3dzLCBpZiB3ZSBnZXQgYSAoVW5pY29kZSkgc3RyaW5nIHdlCiAgKiAgICAgZXh0cmFjdCB0aGUgd2NoYXJfdCAqIGFuZCByZXR1cm4gaXQ7IGlmIHdlIGdldAotICogICAgIGJ5dGVzIHdlIGV4dHJhY3QgdGhlIGNoYXIgKiBhbmQgcmV0dXJuIHRoYXQuCisgKiAgICAgYnl0ZXMgd2UgZGVjb2RlIHRvIHdjaGFyX3QgKiBhbmQgcmV0dXJuIHRoYXQuCiAgKgogICogICAqIE9uIGFsbCBvdGhlciBwbGF0Zm9ybXMsIHN0cmluZ3MgYXJlIGVuY29kZWQKICAqICAgICB0byBieXRlcyB1c2luZyBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsIHRoZW4gd2UKQEAgLTc1NSw3ICs3NjksOSBAQAogICogICAgIGFuZCB3YXMgbm90IGVuY29kZWQuICAoT25seSB1c2VkIG9uIFdpbmRvd3MuKQogICogICBwYXRoLm5hcnJvdwogICogICAgIFBvaW50cyB0byB0aGUgcGF0aCBpZiBpdCB3YXMgZXhwcmVzc2VkIGFzIGJ5dGVzLAotICogICAgIG9yIGl0IHdhcyBVbmljb2RlIGFuZCB3YXMgZW5jb2RlZCB0byBieXRlcy4KKyAqICAgICBvciBpdCB3YXMgVW5pY29kZSBhbmQgd2FzIGVuY29kZWQgdG8gYnl0ZXMuIChPbiBXaW5kb3dzLAorICogICAgIGlzIGFuIG5vbi16ZXJvIGludGVnZXIgaWYgdGhlIHBhdGggd2FzIGV4cHJlc3NlZCBhcyBieXRlcy4KKyAqICAgICBUaGUgdHlwZSBpcyBkZWxpYmVyYXRlbHkgaW5jb21wYXRpYmxlIHRvIHByZXZlbnQgbWlzdXNlLikKICAqICAgcGF0aC5mZAogICogICAgIENvbnRhaW5zIGEgZmlsZSBkZXNjcmlwdG9yIGlmIHBhdGguYWNjZXB0X2ZkIHdhcyB0cnVlCiAgKiAgICAgYW5kIHRoZSBjYWxsZXIgcHJvdmlkZWQgYSBzaWduZWQgaW50ZWdlciBpbnN0ZWFkIG9mIGFueQpAQCAtNzk5LDE2ICs4MTUsMjUgQEAKICAgICBjb25zdCBjaGFyICphcmd1bWVudF9uYW1lOwogICAgIGludCBudWxsYWJsZTsKICAgICBpbnQgYWxsb3dfZmQ7Ci0gICAgd2NoYXJfdCAqd2lkZTsKLSAgICBjaGFyICpuYXJyb3c7CisgICAgY29uc3Qgd2NoYXJfdCAqd2lkZTsKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgQk9PTCBuYXJyb3c7CisjZWxzZQorICAgIGNvbnN0IGNoYXIgKm5hcnJvdzsKKyNlbmRpZgogICAgIGludCBmZDsKICAgICBQeV9zc2l6ZV90IGxlbmd0aDsKICAgICBQeU9iamVjdCAqb2JqZWN0OwogICAgIFB5T2JqZWN0ICpjbGVhbnVwOwogfSBwYXRoX3Q7CiAKKyNpZmRlZiBNU19XSU5ET1dTCisjZGVmaW5lIFBBVEhfVF9JTklUSUFMSVpFKGZ1bmN0aW9uX25hbWUsIGFyZ3VtZW50X25hbWUsIG51bGxhYmxlLCBhbGxvd19mZCkgXAorICAgIHtmdW5jdGlvbl9uYW1lLCBhcmd1bWVudF9uYW1lLCBudWxsYWJsZSwgYWxsb3dfZmQsIE5VTEwsIEZBTFNFLCAtMSwgMCwgTlVMTCwgTlVMTH0KKyNlbHNlCiAjZGVmaW5lIFBBVEhfVF9JTklUSUFMSVpFKGZ1bmN0aW9uX25hbWUsIGFyZ3VtZW50X25hbWUsIG51bGxhYmxlLCBhbGxvd19mZCkgXAogICAgIHtmdW5jdGlvbl9uYW1lLCBhcmd1bWVudF9uYW1lLCBudWxsYWJsZSwgYWxsb3dfZmQsIE5VTEwsIE5VTEwsIC0xLCAwLCBOVUxMLCBOVUxMfQorI2VuZGlmCiAKIHN0YXRpYyB2b2lkCiBwYXRoX2NsZWFudXAocGF0aF90ICpwYXRoKSB7CkBAIC04MTgsMTEgKzg0MywxOSBAQAogfQogCiBzdGF0aWMgaW50Ci1wYXRoX2NvbnZlcnRlcihQeU9iamVjdCAqbywgdm9pZCAqcCkgeworcGF0aF9jb252ZXJ0ZXIoUHlPYmplY3QgKm8sIHZvaWQgKnApCit7CiAgICAgcGF0aF90ICpwYXRoID0gKHBhdGhfdCAqKXA7Ci0gICAgUHlPYmplY3QgKnVuaWNvZGUsICpieXRlczsKKyAgICBQeU9iamVjdCAqYnl0ZXMsICp0b19jbGVhbnVwID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IGxlbmd0aDsKLSAgICBjaGFyICpuYXJyb3c7CisgICAgaW50IGlzX2luZGV4LCBpc19idWZmZXIsIGlzX2J5dGVzLCBpc191bmljb2RlOworICAgIC8qIERlZmF1bHQgdG8gZmFpbHVyZSwgZm9yY2luZyBleHBsaWNpdCBzaWduYWxpbmcgb2Ygc3VjY2Nlc3MuICovCisgICAgaW50IHJldCA9IDA7CisgICAgY29uc3QgY2hhciAqbmFycm93OworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICBQeU9iamVjdCAqd287CisgICAgY29uc3Qgd2NoYXJfdCAqd2lkZTsKKyNlbmRpZgogCiAjZGVmaW5lIEZPUk1BVF9FWENFUFRJT04oZXhjLCBmbXQpIFwKICAgICBQeUVycl9Gb3JtYXQoZXhjLCAiJXMlcyIgZm10LCBcCkBAIC04MzYsMTIyICs4NjksMTkxIEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIC8qIGVuc3VyZSBpdCdzIGFsd2F5cyBzYWZlIHRvIGNhbGwgcGF0aF9jbGVhbnVwKCkgKi8KKyAgICAvKiBFbnN1cmUgaXQncyBhbHdheXMgc2FmZSB0byBjYWxsIHBhdGhfY2xlYW51cCgpLiAqLwogICAgIHBhdGgtPmNsZWFudXAgPSBOVUxMOwogCi0gICAgaWYgKG8gPT0gUHlfTm9uZSkgewotICAgICAgICBpZiAoIXBhdGgtPm51bGxhYmxlKSB7Ci0gICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHNwZWNpZnkgTm9uZSBmb3IgJXMgYXJndW1lbnQiKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisgICAgaWYgKChvID09IFB5X05vbmUpICYmIHBhdGgtPm51bGxhYmxlKSB7CiAgICAgICAgIHBhdGgtPndpZGUgPSBOVUxMOworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgcGF0aC0+bmFycm93ID0gRkFMU0U7CisjZWxzZQogICAgICAgICBwYXRoLT5uYXJyb3cgPSBOVUxMOworI2VuZGlmCiAgICAgICAgIHBhdGgtPmxlbmd0aCA9IDA7CiAgICAgICAgIHBhdGgtPm9iamVjdCA9IG87CiAgICAgICAgIHBhdGgtPmZkID0gLTE7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChvKTsKLSAgICBpZiAodW5pY29kZSkgewotI2lmZGVmIE1TX1dJTkRPV1MKLSAgICAgICAgd2NoYXJfdCAqd2lkZTsKKyAgICAvKiBPbmx5IGNhbGwgdGhpcyBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgdHJlYXQgdGhlIHJldHVybiB2YWx1ZSBvZgorICAgICAgIG9zLmZzcGF0aCgpIGFzIGFuIGZkIG9yIGJ1ZmZlci4gKi8KKyAgICBpc19pbmRleCA9IHBhdGgtPmFsbG93X2ZkICYmIFB5SW5kZXhfQ2hlY2sobyk7CisgICAgaXNfYnVmZmVyID0gUHlPYmplY3RfQ2hlY2tCdWZmZXIobyk7CisgICAgaXNfYnl0ZXMgPSBQeUJ5dGVzX0NoZWNrKG8pOworICAgIGlzX3VuaWNvZGUgPSBQeVVuaWNvZGVfQ2hlY2sobyk7CiAKLSAgICAgICAgd2lkZSA9IFB5VW5pY29kZV9Bc1VuaWNvZGVBbmRTaXplKHVuaWNvZGUsICZsZW5ndGgpOworICAgIGlmICghaXNfaW5kZXggJiYgIWlzX2J1ZmZlciAmJiAhaXNfdW5pY29kZSAmJiAhaXNfYnl0ZXMpIHsKKyAgICAgICAgLyogSW5saW5lIFB5T1NfRlNQYXRoKCkgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlcy4gKi8KKyAgICAgICAgX1B5X0lERU5USUZJRVIoX19mc3BhdGhfXyk7CisgICAgICAgIFB5T2JqZWN0ICpmdW5jID0gTlVMTDsKKworICAgICAgICBmdW5jID0gX1B5T2JqZWN0X0xvb2t1cFNwZWNpYWwobywgJlB5SWRfX19mc3BhdGhfXyk7CisgICAgICAgIGlmIChOVUxMID09IGZ1bmMpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIG8gPSB0b19jbGVhbnVwID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBpZiAoTlVMTCA9PSBvKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKG8pKSB7CisgICAgICAgICAgICBpc191bmljb2RlID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChQeUJ5dGVzX0NoZWNrKG8pKSB7CisgICAgICAgICAgICBpc19ieXRlcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfdW5pY29kZSkgeworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgd2lkZSA9IFB5VW5pY29kZV9Bc1dpZGVDaGFyU3RyaW5nKG8sICZsZW5ndGgpOwogICAgICAgICBpZiAoIXdpZGUpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih1bmljb2RlKTsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGlmIChsZW5ndGggPiAzMjc2NykgewogICAgICAgICAgICAgRk9STUFUX0VYQ0VQVElPTihQeUV4Y19WYWx1ZUVycm9yLCAiJXMgdG9vIGxvbmcgZm9yIFdpbmRvd3MiKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih1bmljb2RlKTsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGlmICh3Y3NsZW4od2lkZSkgIT0gbGVuZ3RoKSB7Ci0gICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1ZhbHVlRXJyb3IsICJlbWJlZGRlZCBudWxsIGNoYXJhY3RlciIpOwotICAgICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1ZhbHVlRXJyb3IsICJlbWJlZGRlZCBudWxsIGNoYXJhY3RlciBpbiAlcyIpOworICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAKICAgICAgICAgcGF0aC0+d2lkZSA9IHdpZGU7Ci0gICAgICAgIHBhdGgtPm5hcnJvdyA9IE5VTEw7CiAgICAgICAgIHBhdGgtPmxlbmd0aCA9IGxlbmd0aDsKICAgICAgICAgcGF0aC0+b2JqZWN0ID0gbzsKICAgICAgICAgcGF0aC0+ZmQgPSAtMTsKLSAgICAgICAgcGF0aC0+Y2xlYW51cCA9IHVuaWNvZGU7Ci0gICAgICAgIHJldHVybiBQeV9DTEVBTlVQX1NVUFBPUlRFRDsKKyAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgZ290byBleGl0OwogI2Vsc2UKLSAgICAgICAgaW50IGNvbnZlcnRlZCA9IFB5VW5pY29kZV9GU0NvbnZlcnRlcih1bmljb2RlLCAmYnl0ZXMpOwotICAgICAgICBQeV9ERUNSRUYodW5pY29kZSk7Ci0gICAgICAgIGlmICghY29udmVydGVkKQotICAgICAgICAgICAgYnl0ZXMgPSBOVUxMOworICAgICAgICBpZiAoIVB5VW5pY29kZV9GU0NvbnZlcnRlcihvLCAmYnl0ZXMpKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KICNlbmRpZgogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0NoZWNrQnVmZmVyKG8pKQotICAgICAgICAgICAgYnl0ZXMgPSBQeUJ5dGVzX0Zyb21PYmplY3Qobyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJ5dGVzID0gTlVMTDsKKyAgICBlbHNlIGlmIChpc19ieXRlcykgeworICAgICAgICBieXRlcyA9IG87CisgICAgICAgIFB5X0lOQ1JFRihieXRlcyk7CisgICAgfQorICAgIGVsc2UgaWYgKGlzX2J1ZmZlcikgeworICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIDEsCisgICAgICAgICAgICAiJXMlcyVzIHNob3VsZCBiZSAlcywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICBwYXRoLT5mdW5jdGlvbl9uYW1lID8gcGF0aC0+ZnVuY3Rpb25fbmFtZSA6ICIiLAorICAgICAgICAgICAgcGF0aC0+ZnVuY3Rpb25fbmFtZSA/ICI6ICIgICAgICAgICAgICAgICAgOiAiIiwKKyAgICAgICAgICAgIHBhdGgtPmFyZ3VtZW50X25hbWUgPyBwYXRoLT5hcmd1bWVudF9uYW1lIDogInBhdGgiLAorICAgICAgICAgICAgcGF0aC0+YWxsb3dfZmQgJiYgcGF0aC0+bnVsbGFibGUgPyAic3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2UsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIgb3IgTm9uZSIgOgorICAgICAgICAgICAgcGF0aC0+YWxsb3dfZmQgPyAic3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2Ugb3IgaW50ZWdlciIgOgorICAgICAgICAgICAgcGF0aC0+bnVsbGFibGUgPyAic3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2Ugb3IgTm9uZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nLCBieXRlcyBvciBvcy5QYXRoTGlrZSIsCisgICAgICAgICAgICBQeV9UWVBFKG8pLT50cF9uYW1lKSkgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIGJ5dGVzID0gUHlCeXRlc19Gcm9tT2JqZWN0KG8pOwogICAgICAgICBpZiAoIWJ5dGVzKSB7Ci0gICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAgICAgaWYgKHBhdGgtPmFsbG93X2ZkKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZkOwotICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBfZmRfY29udmVydGVyKG8sICZmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcsIGJ5dGVzIG9yIGludGVnZXIiKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPndpZGUgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBwYXRoLT5uYXJyb3cgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBwYXRoLT5sZW5ndGggPSAwOwotICAgICAgICAgICAgICAgICAgICBwYXRoLT5vYmplY3QgPSBvOwotICAgICAgICAgICAgICAgICAgICBwYXRoLT5mZCA9IGZkOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgIH0KLQotICAgIGlmICghYnl0ZXMpIHsKLSAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgRk9STUFUX0VYQ0VQVElPTihQeUV4Y19UeXBlRXJyb3IsICJpbGxlZ2FsIHR5cGUgZm9yICVzIHBhcmFtZXRlciIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KKyAgICBlbHNlIGlmIChpc19pbmRleCkgeworICAgICAgICBpZiAoIV9mZF9jb252ZXJ0ZXIobywgJnBhdGgtPmZkKSkgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIHBhdGgtPndpZGUgPSBOVUxMOwogI2lmZGVmIE1TX1dJTkRPV1MKLSAgICBpZiAod2luMzJfd2Fybl9ieXRlc19hcGkoKSkgewotICAgICAgICBQeV9ERUNSRUYoYnl0ZXMpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgICAgIHBhdGgtPm5hcnJvdyA9IEZBTFNFOworI2Vsc2UKKyAgICAgICAgcGF0aC0+bmFycm93ID0gTlVMTDsKICNlbmRpZgorICAgICAgICBwYXRoLT5sZW5ndGggPSAwOworICAgICAgICBwYXRoLT5vYmplY3QgPSBvOworICAgICAgICByZXQgPSAxOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIGVsc2UgeworIGVycm9yX2V4aXQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlcyVzJXMgc2hvdWxkIGJlICVzLCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgIHBhdGgtPmZ1bmN0aW9uX25hbWUgPyBwYXRoLT5mdW5jdGlvbl9uYW1lIDogIiIsCisgICAgICAgICAgICBwYXRoLT5mdW5jdGlvbl9uYW1lID8gIjogIiAgICAgICAgICAgICAgICA6ICIiLAorICAgICAgICAgICAgcGF0aC0+YXJndW1lbnRfbmFtZSA/IHBhdGgtPmFyZ3VtZW50X25hbWUgOiAicGF0aCIsCisgICAgICAgICAgICBwYXRoLT5hbGxvd19mZCAmJiBwYXRoLT5udWxsYWJsZSA/ICJzdHJpbmcsIGJ5dGVzLCBvcy5QYXRoTGlrZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciBvciBOb25lIiA6CisgICAgICAgICAgICBwYXRoLT5hbGxvd19mZCA/ICJzdHJpbmcsIGJ5dGVzLCBvcy5QYXRoTGlrZSBvciBpbnRlZ2VyIiA6CisgICAgICAgICAgICBwYXRoLT5udWxsYWJsZSA/ICJzdHJpbmcsIGJ5dGVzLCBvcy5QYXRoTGlrZSBvciBOb25lIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcsIGJ5dGVzIG9yIG9zLlBhdGhMaWtlIiwKKyAgICAgICAgICAgIFB5X1RZUEUobyktPnRwX25hbWUpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogCiAgICAgbGVuZ3RoID0gUHlCeXRlc19HRVRfU0laRShieXRlcyk7Ci0jaWZkZWYgTVNfV0lORE9XUwotICAgIGlmIChsZW5ndGggPiBNQVhfUEFUSC0xKSB7Ci0gICAgICAgIEZPUk1BVF9FWENFUFRJT04oUHlFeGNfVmFsdWVFcnJvciwgIiVzIHRvbyBsb25nIGZvciBXaW5kb3dzIik7Ci0gICAgICAgIFB5X0RFQ1JFRihieXRlcyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSNlbmRpZgotCiAgICAgbmFycm93ID0gUHlCeXRlc19BU19TVFJJTkcoYnl0ZXMpOwogICAgIGlmICgoc2l6ZV90KWxlbmd0aCAhPSBzdHJsZW4obmFycm93KSkgewogICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1ZhbHVlRXJyb3IsICJlbWJlZGRlZCBudWxsIGNoYXJhY3RlciBpbiAlcyIpOwogICAgICAgICBQeV9ERUNSRUYoYnl0ZXMpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAorI2lmZGVmIE1TX1dJTkRPV1MKKyAgICB3byA9IFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplKAorICAgICAgICBuYXJyb3csCisgICAgICAgIGxlbmd0aAorICAgICk7CisgICAgaWYgKCF3bykgeworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgd2lkZSA9IFB5VW5pY29kZV9Bc1dpZGVDaGFyU3RyaW5nKHdvLCAmbGVuZ3RoKTsKKyAgICBQeV9ERUNSRUYod28pOworCisgICAgaWYgKCF3aWRlKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgaWYgKGxlbmd0aCA+IDMyNzY3KSB7CisgICAgICAgIEZPUk1BVF9FWENFUFRJT04oUHlFeGNfVmFsdWVFcnJvciwgIiVzIHRvbyBsb25nIGZvciBXaW5kb3dzIik7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgaWYgKHdjc2xlbih3aWRlKSAhPSBsZW5ndGgpIHsKKyAgICAgICAgRk9STUFUX0VYQ0VQVElPTihQeUV4Y19WYWx1ZUVycm9yLCAiZW1iZWRkZWQgbnVsbCBjaGFyYWN0ZXIgaW4gJXMiKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBwYXRoLT53aWRlID0gd2lkZTsKKyAgICBwYXRoLT5uYXJyb3cgPSBUUlVFOworI2Vsc2UKICAgICBwYXRoLT53aWRlID0gTlVMTDsKICAgICBwYXRoLT5uYXJyb3cgPSBuYXJyb3c7CisjZW5kaWYKICAgICBwYXRoLT5sZW5ndGggPSBsZW5ndGg7CiAgICAgcGF0aC0+b2JqZWN0ID0gbzsKICAgICBwYXRoLT5mZCA9IC0xOwotICAgIHBhdGgtPmNsZWFudXAgPSBieXRlczsKLSAgICByZXR1cm4gUHlfQ0xFQU5VUF9TVVBQT1JURUQ7CisgICAgaWYgKGJ5dGVzID09IG8pIHsKKyAgICAgICAgUHlfREVDUkVGKGJ5dGVzKTsKKyAgICAgICAgcmV0ID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHBhdGgtPmNsZWFudXAgPSBieXRlczsKKyAgICAgICAgcmV0ID0gUHlfQ0xFQU5VUF9TVVBQT1JURUQ7CisgICAgfQorIGV4aXQ6CisgICAgUHlfWERFQ1JFRih0b19jbGVhbnVwKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZAotYXJndW1lbnRfdW5hdmFpbGFibGVfZXJyb3IoY2hhciAqZnVuY3Rpb25fbmFtZSwgY2hhciAqYXJndW1lbnRfbmFtZSkgeworYXJndW1lbnRfdW5hdmFpbGFibGVfZXJyb3IoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgY29uc3QgY2hhciAqYXJndW1lbnRfbmFtZSkKK3sKICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKICAgICAgICAgIiVzJXMlcyB1bmF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtIiwKICAgICAgICAgKGZ1bmN0aW9uX25hbWUgIT0gTlVMTCkgPyBmdW5jdGlvbl9uYW1lIDogIiIsCkBAIC05NzQsNyArMTA3Niw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWZkX3NwZWNpZmllZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZmQpIHsKK2ZkX3NwZWNpZmllZChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZmQpCit7CiAgICAgaWYgKGZkID09IC0xKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtOTgzLDcgKzEwODYsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1mb2xsb3dfc3ltbGlua3Nfc3BlY2lmaWVkKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmb2xsb3dfc3ltbGlua3MpIHsKK2ZvbGxvd19zeW1saW5rc19zcGVjaWZpZWQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGZvbGxvd19zeW1saW5rcykKK3sKICAgICBpZiAoZm9sbG93X3N5bWxpbmtzKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtOTkyLDggKzEwOTYsMTMgQEAKIH0KIAogc3RhdGljIGludAotcGF0aF9hbmRfZGlyX2ZkX2ludmFsaWQoY2hhciAqZnVuY3Rpb25fbmFtZSwgcGF0aF90ICpwYXRoLCBpbnQgZGlyX2ZkKSB7Ci0gICAgaWYgKCFwYXRoLT5uYXJyb3cgJiYgIXBhdGgtPndpZGUgJiYgKGRpcl9mZCAhPSBERUZBVUxUX0RJUl9GRCkpIHsKK3BhdGhfYW5kX2Rpcl9mZF9pbnZhbGlkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIHBhdGhfdCAqcGF0aCwgaW50IGRpcl9mZCkKK3sKKyAgICBpZiAoIXBhdGgtPndpZGUgJiYgKGRpcl9mZCAhPSBERUZBVUxUX0RJUl9GRCkKKyNpZm5kZWYgTVNfV0lORE9XUworICAgICAgICAmJiAhcGF0aC0+bmFycm93CisjZW5kaWYKKyAgICApIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbid0IHNwZWNpZnkgZGlyX2ZkIHdpdGhvdXQgbWF0Y2hpbmcgcGF0aCIsCiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lKTsKQEAgLTEwMDMsNyArMTExMiw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRpcl9mZF9hbmRfZmRfaW52YWxpZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZGlyX2ZkLCBpbnQgZmQpIHsKK2Rpcl9mZF9hbmRfZmRfaW52YWxpZChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZGlyX2ZkLCBpbnQgZmQpCit7CiAgICAgaWYgKChkaXJfZmQgIT0gREVGQVVMVF9ESVJfRkQpICYmIChmZCAhPSAtMSkpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbid0IHNwZWNpZnkgYm90aCBkaXJfZmQgYW5kIGZkIiwKQEAgLTEwMTQsOCArMTEyNCw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLWZkX2FuZF9mb2xsb3dfc3ltbGlua3NfaW52YWxpZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbGxvd19zeW1saW5rcykgeworZmRfYW5kX2ZvbGxvd19zeW1saW5rc19pbnZhbGlkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9sbG93X3N5bWxpbmtzKQorewogICAgIGlmICgoZmQgPiAwKSAmJiAoIWZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCB1c2UgZmQgYW5kIGZvbGxvd19zeW1saW5rcyB0b2dldGhlciIsCkBAIC0xMDI2LDggKzExMzcsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1kaXJfZmRfYW5kX2ZvbGxvd19zeW1saW5rc19pbnZhbGlkKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBkaXJfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb2xsb3dfc3ltbGlua3MpIHsKK2Rpcl9mZF9hbmRfZm9sbG93X3N5bWxpbmtzX2ludmFsaWQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGRpcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbGxvd19zeW1saW5rcykKK3sKICAgICBpZiAoKGRpcl9mZCAhPSBERUZBVUxUX0RJUl9GRCkgJiYgKCFmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgdXNlIGRpcl9mZCBhbmQgZm9sbG93X3N5bWxpbmtzIHRvZ2V0aGVyIiwKQEAgLTEwMzgsNyArMTE1MCw3IEBACiB9CiAKICNpZmRlZiBNU19XSU5ET1dTCi0gICAgdHlwZWRlZiBQWV9MT05HX0xPTkcgUHlfb2ZmX3Q7CisgICAgdHlwZWRlZiBsb25nIGxvbmcgUHlfb2ZmX3Q7CiAjZWxzZQogICAgIHR5cGVkZWYgb2ZmX3QgUHlfb2ZmX3Q7CiAjZW5kaWYKQEAgLTEwNjYsNDEgKzExNzgsMTMgQEAKICNlbmRpZgogfQogCi0KLSNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDE0MDAgJiYgX01TQ19WRVIgPCAxOTAwCi0vKiBMZWdhY3kgaW1wbGVtZW50YXRpb24gb2YgX1B5VmVyaWZ5X2ZkX2R1cDIgd2hpbGUgdHJhbnNpdGlvbmluZyB0bwotICogTVNWQyAxNC4wLiBUaGlzIHNob3VsZCBldmVudHVhbGx5IGJlIHJlbW92ZWQuIChpc3N1ZTIzNTI0KQotICovCi0jZGVmaW5lIElPSU5GT19MMkUgNQotI2RlZmluZSBJT0lORk9fQVJSQVlTIDY0Ci0jZGVmaW5lIElPSU5GT19BUlJBWV9FTFRTICAgKDEgPDwgSU9JTkZPX0wyRSkKLSNkZWZpbmUgX05IQU5ETEVfICAgICAgICAgICAoSU9JTkZPX0FSUkFZUyAqIElPSU5GT19BUlJBWV9FTFRTKQotI2RlZmluZSBfTk9fQ09OU09MRV9GSUxFTk8gKGludHB0cl90KS0yCi0KLS8qIHRoZSBzcGVjaWFsIGNhc2Ugb2YgY2hlY2tpbmcgZHVwMi4gIFRoZSB0YXJnZXQgZmQgbXVzdCBiZSBpbiBhIHNlbnNpYmxlIHJhbmdlICovCi1zdGF0aWMgaW50Ci1fUHlWZXJpZnlfZmRfZHVwMihpbnQgZmQxLCBpbnQgZmQyKQotewotICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkMSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChmZDIgPT0gX05PX0NPTlNPTEVfRklMRU5PKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoKHVuc2lnbmVkKWZkMiA8IF9OSEFORExFXykKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIF9QeVZlcmlmeV9mZF9kdXAyKGZkMSwgZmQyKSAoX1B5VmVyaWZ5X2ZkKGZkMSkgJiYgKGZkMikgPj0gMCkKLSNlbmRpZgotCiAjaWZkZWYgTVNfV0lORE9XUwogCiBzdGF0aWMgaW50CiB3aW4zMl9nZXRfcmVwYXJzZV90YWcoSEFORExFIHJlcGFyc2VfcG9pbnRfaGFuZGxlLCBVTE9ORyAqcmVwYXJzZV90YWcpCiB7Ci0gICAgY2hhciB0YXJnZXRfYnVmZmVyW01BWElNVU1fUkVQQVJTRV9EQVRBX0JVRkZFUl9TSVpFXTsKLSAgICBSRVBBUlNFX0RBVEFfQlVGRkVSICpyZGIgPSAoUkVQQVJTRV9EQVRBX0JVRkZFUiAqKXRhcmdldF9idWZmZXI7CisgICAgY2hhciB0YXJnZXRfYnVmZmVyW19QeV9NQVhJTVVNX1JFUEFSU0VfREFUQV9CVUZGRVJfU0laRV07CisgICAgX1B5X1JFUEFSU0VfREFUQV9CVUZGRVIgKnJkYiA9IChfUHlfUkVQQVJTRV9EQVRBX0JVRkZFUiAqKXRhcmdldF9idWZmZXI7CiAgICAgRFdPUkQgbl9ieXRlc19yZXR1cm5lZDsKIAogICAgIGlmICgwID09IERldmljZUlvQ29udHJvbCgKQEAgLTExNTksNyArMTI0Myw3IEBACiAgICAgZm9yIChlID0gX3dlbnZpcm9uOyAqZSAhPSBOVUxMOyBlKyspIHsKICAgICAgICAgUHlPYmplY3QgKms7CiAgICAgICAgIFB5T2JqZWN0ICp2OwotICAgICAgICB3Y2hhcl90ICpwID0gd2NzY2hyKCplLCBMJz0nKTsKKyAgICAgICAgY29uc3Qgd2NoYXJfdCAqcCA9IHdjc2NocigqZSwgTCc9Jyk7CiAgICAgICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgayA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKmUsIChQeV9zc2l6ZV90KShwLSplKSk7CkBAIC0xMTg3LDcgKzEyNzEsNyBAQAogICAgIGZvciAoZSA9IGVudmlyb247ICplICE9IE5VTEw7IGUrKykgewogICAgICAgICBQeU9iamVjdCAqazsKICAgICAgICAgUHlPYmplY3QgKnY7Ci0gICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoKmUsICc9Jyk7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBzdHJjaHIoKmUsICc9Jyk7CiAgICAgICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgayA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKmUsIChpbnQpKHAtKmUpKTsKQEAgLTEyMjIsNyArMTMwNiw3IEBACiAKICNpZmRlZiBNU19XSU5ET1dTCiBzdGF0aWMgUHlPYmplY3QgKgotd2luMzJfZXJyb3IoY2hhciogZnVuY3Rpb24sIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQord2luMzJfZXJyb3IoY29uc3QgY2hhciogZnVuY3Rpb24sIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQogewogICAgIC8qIFhYWCBXZSBzaG91bGQgcGFzcyB0aGUgZnVuY3Rpb24gbmFtZSBhbG9uZyBpbiB0aGUgZnV0dXJlLgogICAgICAgICh3aW5yZWcuYyBhbHNvIHdhbnRzIHRvIHBhc3MgdGhlIGZ1bmN0aW9uIG5hbWUuKQpAQCAtMTIzNyw3ICsxMzIxLDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXdpbjMyX2Vycm9yX29iamVjdChjaGFyKiBmdW5jdGlvbiwgUHlPYmplY3QqIGZpbGVuYW1lKQord2luMzJfZXJyb3Jfb2JqZWN0KGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBQeU9iamVjdCogZmlsZW5hbWUpCiB7CiAgICAgLyogWFhYIC0gc2VlIHdpbjMyX2Vycm9yIGZvciBjb21tZW50cyBvbiAnZnVuY3Rpb24nICovCiAgICAgZXJybm8gPSBHZXRMYXN0RXJyb3IoKTsKQEAgLTEyOTcsOSArMTM4MSw2IEBACiAgICAgaW50IHJlczsKICAgICBpbnQgYXN5bmNfZXJyID0gMDsKIAotICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkKSkKLSAgICAgICAgcmV0dXJuIHBvc2l4X2Vycm9yKCk7Ci0KICAgICBkbyB7CiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSApAQCAtMTMyMCwzMSArMTQwMSw2IEBACiAgICBpdCBhbHNvIG5lZWRzIHRvIHNldCAibWFnaWMiIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbmRpY2F0aW5nCiAgICB0aGUgcGVyLWRyaXZlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aGljaCBhcmUgb2YgdGhlIGZvcm0gPTxkcml2ZT46ICovCiBzdGF0aWMgQk9PTCBfX3N0ZGNhbGwKLXdpbjMyX2NoZGlyKExQQ1NUUiBwYXRoKQotewotICAgIGNoYXIgbmV3X3BhdGhbTUFYX1BBVEhdOwotICAgIGludCByZXN1bHQ7Ci0gICAgY2hhciBlbnZbNF0gPSAiPXg6IjsKLQotICAgIGlmKCFTZXRDdXJyZW50RGlyZWN0b3J5QShwYXRoKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJlc3VsdCA9IEdldEN1cnJlbnREaXJlY3RvcnlBKFB5X0FSUkFZX0xFTkdUSChuZXdfcGF0aCksIG5ld19wYXRoKTsKLSAgICBpZiAoIXJlc3VsdCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8qIEluIHRoZSBBTlNJIEFQSSwgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgcGF0aHMgbG9uZ2VyCi0gICAgICAgdGhhbiBNQVhfUEFUSC0xIChub3QgaW5jbHVkaW5nIHRoZSBmaW5hbCBudWxsIGNoYXJhY3RlcikuICovCi0gICAgYXNzZXJ0KHJlc3VsdCA8IFB5X0FSUkFZX0xFTkdUSChuZXdfcGF0aCkpOwotICAgIGlmIChzdHJuY21wKG5ld19wYXRoLCAiXFxcXCIsIDIpID09IDAgfHwKLSAgICAgICAgc3RybmNtcChuZXdfcGF0aCwgIi8vIiwgMikgPT0gMCkKLSAgICAgICAgLyogVU5DIHBhdGgsIG5vdGhpbmcgdG8gZG8uICovCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIGVudlsxXSA9IG5ld19wYXRoWzBdOwotICAgIHJldHVybiBTZXRFbnZpcm9ubWVudFZhcmlhYmxlQShlbnYsIG5ld19wYXRoKTsKLX0KLQotLyogVGhlIFVuaWNvZGUgdmVyc2lvbiBkaWZmZXJzIGZyb20gdGhlIEFOU0kgdmVyc2lvbgotICAgc2luY2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG1pZ2h0IGV4Y2VlZCBNQVhfUEFUSCBjaGFyYWN0ZXJzICovCi1zdGF0aWMgQk9PTCBfX3N0ZGNhbGwKIHdpbjMyX3djaGRpcihMUENXU1RSIHBhdGgpCiB7CiAgICAgd2NoYXJfdCBwYXRoX2J1ZltNQVhfUEFUSF0sICpuZXdfcGF0aCA9IHBhdGhfYnVmOwpAQCAtMTM5MCwzMyArMTQ0NiwxMCBAQAogI2RlZmluZSBIQVZFX1NUQVRfTlNFQyAxCiAjZGVmaW5lIEhBVkVfU1RSVUNUX1NUQVRfU1RfRklMRV9BVFRSSUJVVEVTIDEKIAotc3RhdGljIEJPT0wKLWF0dHJpYnV0ZXNfZnJvbV9kaXIoTFBDU1RSIHBzekZpbGUsIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OICppbmZvLCBVTE9ORyAqcmVwYXJzZV90YWcpCi17Ci0gICAgSEFORExFIGhGaW5kRmlsZTsKLSAgICBXSU4zMl9GSU5EX0RBVEFBIEZpbGVEYXRhOwotICAgIGhGaW5kRmlsZSA9IEZpbmRGaXJzdEZpbGVBKHBzekZpbGUsICZGaWxlRGF0YSk7Ci0gICAgaWYgKGhGaW5kRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIEZpbmRDbG9zZShoRmluZEZpbGUpOwotICAgIG1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKLSAgICAqcmVwYXJzZV90YWcgPSAwOwotICAgIGluZm8tPmR3RmlsZUF0dHJpYnV0ZXMgPSBGaWxlRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzOwotICAgIGluZm8tPmZ0Q3JlYXRpb25UaW1lICAgPSBGaWxlRGF0YS5mdENyZWF0aW9uVGltZTsKLSAgICBpbmZvLT5mdExhc3RBY2Nlc3NUaW1lID0gRmlsZURhdGEuZnRMYXN0QWNjZXNzVGltZTsKLSAgICBpbmZvLT5mdExhc3RXcml0ZVRpbWUgID0gRmlsZURhdGEuZnRMYXN0V3JpdGVUaW1lOwotICAgIGluZm8tPm5GaWxlU2l6ZUhpZ2ggICAgPSBGaWxlRGF0YS5uRmlsZVNpemVIaWdoOwotICAgIGluZm8tPm5GaWxlU2l6ZUxvdyAgICAgPSBGaWxlRGF0YS5uRmlsZVNpemVMb3c7Ci0vKiAgaW5mby0+bk51bWJlck9mTGlua3MgICA9IDE7ICovCi0gICAgaWYgKEZpbGVEYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRVBBUlNFX1BPSU5UKQotICAgICAgICAqcmVwYXJzZV90YWcgPSBGaWxlRGF0YS5kd1Jlc2VydmVkMDsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQogc3RhdGljIHZvaWQKLWZpbmRfZGF0YV90b19maWxlX2luZm9fdyhXSU4zMl9GSU5EX0RBVEFXICpwRmlsZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgKnJlcGFyc2VfdGFnKQorZmluZF9kYXRhX3RvX2ZpbGVfaW5mbyhXSU4zMl9GSU5EX0RBVEFXICpwRmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAqcmVwYXJzZV90YWcpCiB7CiAgICAgbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwogICAgIGluZm8tPmR3RmlsZUF0dHJpYnV0ZXMgPSBwRmlsZURhdGEtPmR3RmlsZUF0dHJpYnV0ZXM7CkBAIC0xNDMzLDcgKzE0NjYsNyBAQAogfQogCiBzdGF0aWMgQk9PTAotYXR0cmlidXRlc19mcm9tX2Rpcl93KExQQ1dTVFIgcHN6RmlsZSwgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gKmluZm8sIFVMT05HICpyZXBhcnNlX3RhZykKK2F0dHJpYnV0ZXNfZnJvbV9kaXIoTFBDV1NUUiBwc3pGaWxlLCBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiAqaW5mbywgVUxPTkcgKnJlcGFyc2VfdGFnKQogewogICAgIEhBTkRMRSBoRmluZEZpbGU7CiAgICAgV0lOMzJfRklORF9EQVRBVyBGaWxlRGF0YTsKQEAgLTE0NDEsNyArMTQ3NCw3IEBACiAgICAgaWYgKGhGaW5kRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIEZpbmRDbG9zZShoRmluZEZpbGUpOwotICAgIGZpbmRfZGF0YV90b19maWxlX2luZm9fdygmRmlsZURhdGEsIGluZm8sIHJlcGFyc2VfdGFnKTsKKyAgICBmaW5kX2RhdGFfdG9fZmlsZV9pbmZvKCZGaWxlRGF0YSwgaW5mbywgcmVwYXJzZV90YWcpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0xNDU4LDcgKzE0OTEsNyBAQAogICAgIGlmKCFidWZfc2l6ZSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgYnVmID0gUHlNZW1fTmV3KHdjaGFyX3QsIGJ1Zl9zaXplKzEpOworICAgIGJ1ZiA9ICh3Y2hhcl90ICopUHlNZW1fUmF3TWFsbG9jKChidWZfc2l6ZSArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICBpZiAoIWJ1ZikgewogICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfT1VUT0ZNRU1PUlkpOwogICAgICAgICByZXR1cm4gRkFMU0U7CkBAIC0xNDY4LDEyICsxNTAxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX3NpemUsIFZPTFVNRV9OQU1FX0RPUyk7CiAKICAgICBpZighcmVzdWx0X2xlbmd0aCkgewotICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgICAgIFB5TWVtX1Jhd0ZyZWUoYnVmKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIGlmKCFDbG9zZUhhbmRsZShoZGwpKSB7Ci0gICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgUHlNZW1fUmF3RnJlZShidWYpOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCkBAIC0xNDg0LDEwICsxNTE3LDcgQEAKIH0KIAogc3RhdGljIGludAotd2luMzJfeHN0YXRfaW1wbF93KGNvbnN0IHdjaGFyX3QgKnBhdGgsIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3QgKnJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICBCT09MIHRyYXZlcnNlKTsKLXN0YXRpYyBpbnQKLXdpbjMyX3hzdGF0X2ltcGwoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCAqcmVzdWx0LAord2luMzJfeHN0YXRfaW1wbChjb25zdCB3Y2hhcl90ICpwYXRoLCBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0ICpyZXN1bHQsCiAgICAgICAgICAgICAgICAgIEJPT0wgdHJhdmVyc2UpCiB7CiAgICAgaW50IGNvZGU7CkBAIC0xNDk1LDkgKzE1MjUsOSBAQAogICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGluZm87CiAgICAgVUxPTkcgcmVwYXJzZV90YWcgPSAwOwogICAgIHdjaGFyX3QgKnRhcmdldF9wYXRoOwotICAgIGNvbnN0IGNoYXIgKmRvdDsKKyAgICBjb25zdCB3Y2hhcl90ICpkb3Q7CiAKLSAgICBoRmlsZSA9IENyZWF0ZUZpbGVBKAorICAgIGhGaWxlID0gQ3JlYXRlRmlsZVcoCiAgICAgICAgIHBhdGgsCiAgICAgICAgIEZJTEVfUkVBRF9BVFRSSUJVVEVTLCAvKiBkZXNpcmVkIGFjY2VzcyAqLwogICAgICAgICAwLCAvKiBzaGFyZSBtb2RlICovCkBAIC0xNTQ2LDk2ICsxNTc2LDYgQEAKICAgICAgICAgICAgIGlmICh0cmF2ZXJzZSkgewogICAgICAgICAgICAgICAgIC8qIEluIG9yZGVyIHRvIGNhbGwgR2V0RmluYWxQYXRoTmFtZUJ5SGFuZGxlIHdlIG5lZWQgdG8gb3BlbgogICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIHdpdGhvdXQgdGhlIHJlcGFyc2UgaGFuZGxpbmcgZmxhZyBzZXQuICovCi0gICAgICAgICAgICAgICAgaEZpbGUyID0gQ3JlYXRlRmlsZUEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBGSUxFX1JFQURfQVRUUklCVVRFUywgRklMRV9TSEFSRV9SRUFELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgT1BFTl9FWElTVElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTHxGSUxFX0ZMQUdfQkFDS1VQX1NFTUFOVElDUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICAgICAgICAgIGlmIChoRmlsZTIgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgICAgIGlmICghZ2V0X3RhcmdldF9wYXRoKGhGaWxlMiwgJnRhcmdldF9wYXRoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICAgICAgY29kZSA9IHdpbjMyX3hzdGF0X2ltcGxfdyh0YXJnZXRfcGF0aCwgcmVzdWx0LCBGQUxTRSk7Ci0gICAgICAgICAgICAgICAgUHlNZW1fRnJlZSh0YXJnZXRfcGF0aCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotICAgIH0KLSAgICBfUHlfYXR0cmlidXRlX2RhdGFfdG9fc3RhdCgmaW5mbywgcmVwYXJzZV90YWcsIHJlc3VsdCk7Ci0KLSAgICAvKiBTZXQgU19JRVhFQyBpZiBpdCBpcyBhbiAuZXhlLCAuYmF0LCAuLi4gKi8KLSAgICBkb3QgPSBzdHJyY2hyKHBhdGgsICcuJyk7Ci0gICAgaWYgKGRvdCkgewotICAgICAgICBpZiAoc3RyaWNtcChkb3QsICIuYmF0IikgPT0gMCB8fCBzdHJpY21wKGRvdCwgIi5jbWQiKSA9PSAwIHx8Ci0gICAgICAgICAgICBzdHJpY21wKGRvdCwgIi5leGUiKSA9PSAwIHx8IHN0cmljbXAoZG90LCAiLmNvbSIpID09IDApCi0gICAgICAgICAgICByZXN1bHQtPnN0X21vZGUgfD0gMDExMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXdpbjMyX3hzdGF0X2ltcGxfdyhjb25zdCB3Y2hhcl90ICpwYXRoLCBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0ICpyZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgQk9PTCB0cmF2ZXJzZSkKLXsKLSAgICBpbnQgY29kZTsKLSAgICBIQU5ETEUgaEZpbGUsIGhGaWxlMjsKLSAgICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBpbmZvOwotICAgIFVMT05HIHJlcGFyc2VfdGFnID0gMDsKLSAgICB3Y2hhcl90ICp0YXJnZXRfcGF0aDsKLSAgICBjb25zdCB3Y2hhcl90ICpkb3Q7Ci0KLSAgICBoRmlsZSA9IENyZWF0ZUZpbGVXKAotICAgICAgICBwYXRoLAotICAgICAgICBGSUxFX1JFQURfQVRUUklCVVRFUywgLyogZGVzaXJlZCBhY2Nlc3MgKi8KLSAgICAgICAgMCwgLyogc2hhcmUgbW9kZSAqLwotICAgICAgICBOVUxMLCAvKiBzZWN1cml0eSBhdHRyaWJ1dGVzICovCi0gICAgICAgIE9QRU5fRVhJU1RJTkcsCi0gICAgICAgIC8qIEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTIGlzIHJlcXVpcmVkIHRvIG9wZW4gYSBkaXJlY3RvcnkgKi8KLSAgICAgICAgLyogRklMRV9GTEFHX09QRU5fUkVQQVJTRV9QT0lOVCBkb2VzIG5vdCBmb2xsb3cgdGhlIHN5bWxpbmsuCi0gICAgICAgICAgIEJlY2F1c2Ugb2YgdGhpcywgY2FsbHMgbGlrZSBHZXRGaW5hbFBhdGhOYW1lQnlIYW5kbGUgd2lsbCByZXR1cm4KLSAgICAgICAgICAgdGhlIHN5bWxpbmsgcGF0aCBhZ2FpbiBhbmQgbm90IHRoZSBhY3R1YWwgZmluYWwgcGF0aC4gKi8KLSAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMfEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTfAotICAgICAgICAgICAgRklMRV9GTEFHX09QRU5fUkVQQVJTRV9QT0lOVCwKLSAgICAgICAgTlVMTCk7Ci0KLSAgICBpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICAgICAgLyogRWl0aGVyIHRoZSB0YXJnZXQgZG9lc24ndCBleGlzdCwgb3Igd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8KLSAgICAgICAgICAgZ2V0IGEgaGFuZGxlIHRvIGl0LiBJZiB0aGUgZm9ybWVyLCB3ZSBuZWVkIHRvIHJldHVybiBhbiBlcnJvci4KLSAgICAgICAgICAgSWYgdGhlIGxhdHRlciwgd2UgY2FuIHVzZSBhdHRyaWJ1dGVzX2Zyb21fZGlyLiAqLwotICAgICAgICBpZiAoR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfU0hBUklOR19WSU9MQVRJT04pCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIC8qIENvdWxkIG5vdCBnZXQgYXR0cmlidXRlcyBvbiBvcGVuIGZpbGUuIEZhbGwgYmFjayB0bwotICAgICAgICAgICByZWFkaW5nIHRoZSBkaXJlY3RvcnkuICovCi0gICAgICAgIGlmICghYXR0cmlidXRlc19mcm9tX2Rpcl93KHBhdGgsICZpbmZvLCAmcmVwYXJzZV90YWcpKQotICAgICAgICAgICAgLyogVmVyeSBzdHJhbmdlLiBUaGlzIHNob3VsZCBub3QgZmFpbCBub3cgKi8KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGluZm8uZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1JFUEFSU0VfUE9JTlQpIHsKLSAgICAgICAgICAgIGlmICh0cmF2ZXJzZSkgewotICAgICAgICAgICAgICAgIC8qIFNob3VsZCB0cmF2ZXJzZSwgYnV0IGNvdWxkIG5vdCBvcGVuIHJlcGFyc2UgcG9pbnQgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX1NIQVJJTkdfVklPTEFUSU9OKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIUdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGhGaWxlLCAmaW5mbykpIHsKLSAgICAgICAgICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5mby5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfUkVQQVJTRV9QT0lOVCkgewotICAgICAgICAgICAgaWYgKCF3aW4zMl9nZXRfcmVwYXJzZV90YWcoaEZpbGUsICZyZXBhcnNlX3RhZykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICAvKiBDbG9zZSB0aGUgb3V0ZXIgb3BlbiBmaWxlIGhhbmRsZSBub3cgdGhhdCB3ZSdyZSBhYm91dCB0bwotICAgICAgICAgICAgICAgcmVvcGVuIGl0IHdpdGggZGlmZmVyZW50IGZsYWdzLiAqLwotICAgICAgICAgICAgaWYgKCFDbG9zZUhhbmRsZShoRmlsZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICBpZiAodHJhdmVyc2UpIHsKLSAgICAgICAgICAgICAgICAvKiBJbiBvcmRlciB0byBjYWxsIEdldEZpbmFsUGF0aE5hbWVCeUhhbmRsZSB3ZSBuZWVkIHRvIG9wZW4KLSAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSB3aXRob3V0IHRoZSByZXBhcnNlIGhhbmRsaW5nIGZsYWcgc2V0LiAqLwogICAgICAgICAgICAgICAgIGhGaWxlMiA9IENyZWF0ZUZpbGVXKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgRklMRV9SRUFEX0FUVFJJQlVURVMsIEZJTEVfU0hBUkVfUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE9QRU5fRVhJU1RJTkcsCkBAIC0xNjQ3LDggKzE1ODcsOCBAQAogICAgICAgICAgICAgICAgIGlmICghZ2V0X3RhcmdldF9wYXRoKGhGaWxlMiwgJnRhcmdldF9wYXRoKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICAgICAgICAgICAgY29kZSA9IHdpbjMyX3hzdGF0X2ltcGxfdyh0YXJnZXRfcGF0aCwgcmVzdWx0LCBGQUxTRSk7Ci0gICAgICAgICAgICAgICAgUHlNZW1fRnJlZSh0YXJnZXRfcGF0aCk7CisgICAgICAgICAgICAgICAgY29kZSA9IHdpbjMyX3hzdGF0X2ltcGwodGFyZ2V0X3BhdGgsIHJlc3VsdCwgRkFMU0UpOworICAgICAgICAgICAgICAgIFB5TWVtX1Jhd0ZyZWUodGFyZ2V0X3BhdGgpOwogICAgICAgICAgICAgICAgIHJldHVybiBjb2RlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UKQEAgLTE2NjcsNyArMTYwNyw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXdpbjMyX3hzdGF0KGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3QgKnJlc3VsdCwgQk9PTCB0cmF2ZXJzZSkKK3dpbjMyX3hzdGF0KGNvbnN0IHdjaGFyX3QgKnBhdGgsIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3QgKnJlc3VsdCwgQk9PTCB0cmF2ZXJzZSkKIHsKICAgICAvKiBQcm90b2NvbCB2aW9sYXRpb246IHdlIGV4cGxpY2l0bHkgY2xlYXIgZXJybm8sIGluc3RlYWQgb2YKICAgICAgICBzZXR0aW5nIGl0IHRvIGEgUE9TSVggZXJyb3IuIENhbGxlcnMgc2hvdWxkIHVzZSBHZXRMYXN0RXJyb3IuICovCkBAIC0xNjc1LDE2ICsxNjE1LDYgQEAKICAgICBlcnJubyA9IDA7CiAgICAgcmV0dXJuIGNvZGU7CiB9Ci0KLXN0YXRpYyBpbnQKLXdpbjMyX3hzdGF0X3coY29uc3Qgd2NoYXJfdCAqcGF0aCwgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCAqcmVzdWx0LCBCT09MIHRyYXZlcnNlKQotewotICAgIC8qIFByb3RvY29sIHZpb2xhdGlvbjogd2UgZXhwbGljaXRseSBjbGVhciBlcnJubywgaW5zdGVhZCBvZgotICAgICAgIHNldHRpbmcgaXQgdG8gYSBQT1NJWCBlcnJvci4gQ2FsbGVycyBzaG91bGQgdXNlIEdldExhc3RFcnJvci4gKi8KLSAgICBpbnQgY29kZSA9IHdpbjMyX3hzdGF0X2ltcGxfdyhwYXRoLCByZXN1bHQsIHRyYXZlcnNlKTsKLSAgICBlcnJubyA9IDA7Ci0gICAgcmV0dXJuIGNvZGU7Ci19CiAvKiBBYm91dCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczogd2luMzJfbHN0YXRfdywgd2luMzJfc3RhdCwgd2luMzJfc3RhdF93CiAKICAgIEluIFBvc2l4LCBzdGF0IGF1dG9tYXRpY2FsbHkgdHJhdmVyc2VzIHN5bWxpbmtzIGFuZCByZXR1cm5zIHRoZSBzdGF0CkBAIC0xNjk0LDM0ICsxNjI0LDIwIEBACiAKICAgIFRoZXJlZm9yZSwgd2luMzJfbHN0YXQgd2lsbCBnZXQgdGhlIGF0dHJpYnV0ZXMgdHJhZGl0aW9uYWxseSwgYW5kCiAgICB3aW4zMl9zdGF0IHdpbGwgZmlyc3QgZXhwbGljaXRseSByZXNvbHZlIHRoZSBzeW1saW5rIHRhcmdldCBhbmQgdGhlbiB3aWxsCi0gICBjYWxsIHdpbjMyX2xzdGF0IG9uIHRoYXQgcmVzdWx0LgotCi0gICBUaGUgX3cgcmVwcmVzZW50IFVuaWNvZGUgZXF1aXZhbGVudHMgb2YgdGhlIGFmb3JlbWVudGlvbmVkIEFOU0kgZnVuY3Rpb25zLiAqLworICAgY2FsbCB3aW4zMl9sc3RhdCBvbiB0aGF0IHJlc3VsdC4gKi8KIAogc3RhdGljIGludAotd2luMzJfbHN0YXQoY29uc3QgY2hhciogcGF0aCwgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCAqcmVzdWx0KQord2luMzJfbHN0YXQoY29uc3Qgd2NoYXJfdCogcGF0aCwgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCAqcmVzdWx0KQogewogICAgIHJldHVybiB3aW4zMl94c3RhdChwYXRoLCByZXN1bHQsIEZBTFNFKTsKIH0KIAogc3RhdGljIGludAotd2luMzJfbHN0YXRfdyhjb25zdCB3Y2hhcl90KiBwYXRoLCBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0ICpyZXN1bHQpCi17Ci0gICAgcmV0dXJuIHdpbjMyX3hzdGF0X3cocGF0aCwgcmVzdWx0LCBGQUxTRSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXdpbjMyX3N0YXQoY29uc3QgY2hhciogcGF0aCwgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCAqcmVzdWx0KQord2luMzJfc3RhdChjb25zdCB3Y2hhcl90KiBwYXRoLCBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0ICpyZXN1bHQpCiB7CiAgICAgcmV0dXJuIHdpbjMyX3hzdGF0KHBhdGgsIHJlc3VsdCwgVFJVRSk7CiB9CiAKLXN0YXRpYyBpbnQKLXdpbjMyX3N0YXRfdyhjb25zdCB3Y2hhcl90KiBwYXRoLCBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0ICpyZXN1bHQpCi17Ci0gICAgcmV0dXJuIHdpbjMyX3hzdGF0X3cocGF0aCwgcmVzdWx0LCBUUlVFKTsKLX0KLQogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogUHlEb2NfU1RSVkFSKHN0YXRfcmVzdWx0X19kb2NfXywKQEAgLTIwMDMsNyArMTkxOSw3IEBACiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAwLCBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpc3QtPnN0X21vZGUpKTsKICNpZmRlZiBIQVZFX0xBUkdFRklMRV9TVVBQT1JUCiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXN0LT5zdF9pbm8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZylzdC0+c3RfaW5vKSk7CiAjZWxzZQogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMSwgUHlMb25nX0Zyb21Mb25nKChsb25nKXN0LT5zdF9pbm8pKTsKICNlbmRpZgpAQCAtMjAyMiw3ICsxOTM4LDcgQEAKICNlbmRpZgogI2lmZGVmIEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpc3QtPnN0X3NpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZylzdC0+c3Rfc2l6ZSkpOwogI2Vsc2UKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDYsIFB5TG9uZ19Gcm9tTG9uZyhzdC0+c3Rfc2l6ZSkpOwogI2VuZGlmCkBAIC0yMTAyLDcgKzIwMTgsNyBAQAogCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1wb3NpeF9kb19zdGF0KGNoYXIgKmZ1bmN0aW9uX25hbWUsIHBhdGhfdCAqcGF0aCwKK3Bvc2l4X2RvX3N0YXQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgcGF0aF90ICpwYXRoLAogICAgICAgICAgICAgICBpbnQgZGlyX2ZkLCBpbnQgZm9sbG93X3N5bWxpbmtzKQogewogICAgIFNUUlVDVF9TVEFUIHN0OwpAQCAtMjEyMSwyOCArMjAzNywyNiBAQAogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICBpZiAocGF0aC0+ZmQgIT0gLTEpCiAgICAgICAgIHJlc3VsdCA9IEZTVEFUKHBhdGgtPmZkLCAmc3QpOwotICAgIGVsc2UKICNpZmRlZiBNU19XSU5ET1dTCi0gICAgaWYgKHBhdGgtPndpZGUpIHsKLSAgICAgICAgaWYgKGZvbGxvd19zeW1saW5rcykKLSAgICAgICAgICAgIHJlc3VsdCA9IHdpbjMyX3N0YXRfdyhwYXRoLT53aWRlLCAmc3QpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQgPSB3aW4zMl9sc3RhdF93KHBhdGgtPndpZGUsICZzdCk7Ci0gICAgfQorICAgIGVsc2UgaWYgKGZvbGxvd19zeW1saW5rcykKKyAgICAgICAgcmVzdWx0ID0gd2luMzJfc3RhdChwYXRoLT53aWRlLCAmc3QpOwogICAgIGVsc2UKLSNlbmRpZgotI2lmIGRlZmluZWQoSEFWRV9MU1RBVCkgfHwgZGVmaW5lZChNU19XSU5ET1dTKQorICAgICAgICByZXN1bHQgPSB3aW4zMl9sc3RhdChwYXRoLT53aWRlLCAmc3QpOworI2Vsc2UKKyAgICBlbHNlCisjaWYgZGVmaW5lZChIQVZFX0xTVEFUKQogICAgIGlmICgoIWZvbGxvd19zeW1saW5rcykgJiYgKGRpcl9mZCA9PSBERUZBVUxUX0RJUl9GRCkpCiAgICAgICAgIHJlc3VsdCA9IExTVEFUKHBhdGgtPm5hcnJvdywgJnN0KTsKICAgICBlbHNlCi0jZW5kaWYKKyNlbmRpZiAvKiBIQVZFX0xTVEFUICovCiAjaWZkZWYgSEFWRV9GU1RBVEFUCiAgICAgaWYgKChkaXJfZmQgIT0gREVGQVVMVF9ESVJfRkQpIHx8ICFmb2xsb3dfc3ltbGlua3MpCiAgICAgICAgIHJlc3VsdCA9IGZzdGF0YXQoZGlyX2ZkLCBwYXRoLT5uYXJyb3csICZzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dfc3ltbGlua3MgPyAwIDogQVRfU1lNTElOS19OT0ZPTExPVyk7CiAgICAgZWxzZQotI2VuZGlmCisjZW5kaWYgLyogSEFWRV9GU1RBVEFUICovCiAgICAgICAgIHJlc3VsdCA9IFNUQVQocGF0aC0+bmFycm93LCAmc3QpOworI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCiAgICAgaWYgKHJlc3VsdCAhPSAwKSB7CkBAIC0yNDIyLDggKzIzMzYsOCBAQAogICAgIHR5cGUgPSAnaWRfdCcKICAgICBmb3JtYXRfdW5pdCA9ICciIF9QeV9QQVJTRV9QSUQgIicKIAotY2xhc3MgUHlfaW50cHRyX3RfY29udmVydGVyKENDb252ZXJ0ZXIpOgotICAgIHR5cGUgPSAnUHlfaW50cHRyX3QnCitjbGFzcyBpbnRwdHJfdF9jb252ZXJ0ZXIoQ0NvbnZlcnRlcik6CisgICAgdHlwZSA9ICdpbnRwdHJfdCcKICAgICBmb3JtYXRfdW5pdCA9ICciIF9QeV9QQVJTRV9JTlRQVFIgIicKIAogY2xhc3MgUHlfb2ZmX3RfY29udmVydGVyKENDb252ZXJ0ZXIpOgpAQCAtMjQ1MCw3ICsyMzY0LDcgQEAKICAgICBpbXBsX2J5X3JlZmVyZW5jZSA9IFRydWU7CiAKIFtweXRob24gc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KLS8qW3B5dGhvbiBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTM5YTNlZTVlNmI0YjBkIGlucHV0PWFmZmU2ODMxNmYxNjA0MDFdKi8KKy8qW3B5dGhvbiBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTM5YTNlZTVlNmI0YjBkIGlucHV0PTQxOGZjZTBlMDExNDQ0NjFdKi8KIAogLypbY2xpbmljIGlucHV0XQogCkBAIC0yNTc4LDEwICsyNDkyLDcgQEAKIAogI2lmZGVmIE1TX1dJTkRPV1MKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgaWYgKHBhdGgtPndpZGUgIT0gTlVMTCkKLSAgICAgICAgYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzVyhwYXRoLT53aWRlKTsKLSAgICBlbHNlCi0gICAgICAgIGF0dHIgPSBHZXRGaWxlQXR0cmlidXRlc0EocGF0aC0+bmFycm93KTsKKyAgICBhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXNXKHBhdGgtPndpZGUpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKICAgICAvKgpAQCAtMjcwNSwxMSArMjYxNiw4IEBACiAKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAjaWZkZWYgTVNfV0lORE9XUwotICAgIGlmIChwYXRoLT53aWRlKQotICAgICAgICByZXN1bHQgPSB3aW4zMl93Y2hkaXIocGF0aC0+d2lkZSk7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSB3aW4zMl9jaGRpcihwYXRoLT5uYXJyb3cpOwotICAgIHJlc3VsdCA9ICFyZXN1bHQ7IC8qIG9uIHVuaXgsIHN1Y2Nlc3MgPSAwLCBvbiB3aW5kb3dzLCBzdWNjZXNzID0gITAgKi8KKyAgICAvKiBvbiB1bml4LCBzdWNjZXNzID0gMCwgb24gd2luZG93cywgc3VjY2VzcyA9ICEwICovCisgICAgcmVzdWx0ID0gIXdpbjMyX3djaGRpcihwYXRoLT53aWRlKTsKICNlbHNlCiAjaWZkZWYgSEFWRV9GQ0hESVIKICAgICBpZiAocGF0aC0+ZmQgIT0gLTEpCkBAIC0yODA0LDEwICsyNzEyLDcgQEAKIAogI2lmZGVmIE1TX1dJTkRPV1MKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgaWYgKHBhdGgtPndpZGUpCi0gICAgICAgIGF0dHIgPSBHZXRGaWxlQXR0cmlidXRlc1cocGF0aC0+d2lkZSk7Ci0gICAgZWxzZQotICAgICAgICBhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXNBKHBhdGgtPm5hcnJvdyk7CisgICAgYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzVyhwYXRoLT53aWRlKTsKICAgICBpZiAoYXR0ciA9PSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUykKICAgICAgICAgcmVzdWx0ID0gMDsKICAgICBlbHNlIHsKQEAgLTI4MTUsMTAgKzI3MjAsNyBAQAogICAgICAgICAgICAgYXR0ciAmPSB+RklMRV9BVFRSSUJVVEVfUkVBRE9OTFk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGF0dHIgfD0gRklMRV9BVFRSSUJVVEVfUkVBRE9OTFk7Ci0gICAgICAgIGlmIChwYXRoLT53aWRlKQotICAgICAgICAgICAgcmVzdWx0ID0gU2V0RmlsZUF0dHJpYnV0ZXNXKHBhdGgtPndpZGUsIGF0dHIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQgPSBTZXRGaWxlQXR0cmlidXRlc0EocGF0aC0+bmFycm93LCBhdHRyKTsKKyAgICAgICAgcmVzdWx0ID0gU2V0RmlsZUF0dHJpYnV0ZXNXKHBhdGgtPndpZGUsIGF0dHIpOwogICAgIH0KICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCkBAIC0zMzE0LDEyICszMjE2LDIyIEBACiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgIGRvIHsKICAgICAgICAgYnVmbGVuICs9IGNodW5rOworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgaWYgKGJ1ZmxlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIHRtcGJ1ZiA9IFB5TWVtX1Jhd1JlYWxsb2MoYnVmLCBidWZsZW4pOwogICAgICAgICBpZiAodG1wYnVmID09IE5VTEwpCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBidWYgPSB0bXBidWY7CisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBjd2QgPSBnZXRjd2QoYnVmLCAoaW50KWJ1Zmxlbik7CisjZWxzZQogICAgICAgICBjd2QgPSBnZXRjd2QoYnVmLCBidWZsZW4pOworI2VuZGlmCiAgICAgfSB3aGlsZSAoY3dkID09IE5VTEwgJiYgZXJybm8gPT0gRVJBTkdFKTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCkBAIC0zNDAxLDcgKzMzMTMsNyBAQAogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTdmMDBmNjAwN2ZkNTI2OWEgaW5wdXQ9YjAwOTVlYmJjYmFhN2UwNF0qLwogewogI2lmZGVmIE1TX1dJTkRPV1MKLSAgICBCT09MIHJlc3VsdDsKKyAgICBCT09MIHJlc3VsdCA9IEZBTFNFOwogI2Vsc2UKICAgICBpbnQgcmVzdWx0OwogI2VuZGlmCkBAIC0zNDEzLDE4ICszMzI1LDE4IEBACiAgICAgfQogI2VuZGlmCiAKKyNpZm5kZWYgTVNfV0lORE9XUwogICAgIGlmICgoc3JjLT5uYXJyb3cgJiYgZHN0LT53aWRlKSB8fCAoc3JjLT53aWRlICYmIGRzdC0+bmFycm93KSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5rOiBzcmMgYW5kIGRzdCBtdXN0IGJlIHRoZSBzYW1lIHR5cGUiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorI2VuZGlmCiAKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgIGlmIChzcmMtPndpZGUpCiAgICAgICAgIHJlc3VsdCA9IENyZWF0ZUhhcmRMaW5rVyhkc3QtPndpZGUsIHNyYy0+d2lkZSwgTlVMTCk7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSBDcmVhdGVIYXJkTGlua0EoZHN0LT5uYXJyb3csIHNyYy0+bmFycm93LCBOVUxMKTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCiAgICAgaWYgKCFyZXN1bHQpCkBAIC0zNDM5LDEzICszMzUxLDEzIEBACiAgICAgICAgICAgICBkc3RfZGlyX2ZkLCBkc3QtPm5hcnJvdywKICAgICAgICAgICAgIGZvbGxvd19zeW1saW5rcyA/IEFUX1NZTUxJTktfRk9MTE9XIDogMCk7CiAgICAgZWxzZQotI2VuZGlmCisjZW5kaWYgLyogSEFWRV9MSU5LQVQgKi8KICAgICAgICAgcmVzdWx0ID0gbGluayhzcmMtPm5hcnJvdywgZHN0LT5uYXJyb3cpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKICAgICBpZiAocmVzdWx0KQogICAgICAgICByZXR1cm4gcGF0aF9lcnJvcjIoc3JjLCBkc3QpOwotI2VuZGlmCisjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CkBAIC0zNDU5LDk5ICszMzcxLDM5IEBACiAgICAgUHlPYmplY3QgKnY7CiAgICAgSEFORExFIGhGaW5kRmlsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwogICAgIEJPT0wgcmVzdWx0OwotICAgIFdJTjMyX0ZJTkRfREFUQSBGaWxlRGF0YTsKLSAgICBjaGFyIG5hbWVidWZbTUFYX1BBVEgrNF07IC8qIE92ZXJhbGxvY2F0ZSBmb3IgIlwqLioiICovCi0gICAgY2hhciAqYnVmcHRyID0gbmFtZWJ1ZjsKKyAgICB3Y2hhcl90IG5hbWVidWZbTUFYX1BBVEgrNF07IC8qIE92ZXJhbGxvY2F0ZSBmb3IgIlwqLioiICovCiAgICAgLyogb25seSBjbGFpbSB0byBoYXZlIHNwYWNlIGZvciBNQVhfUEFUSCAqLwogICAgIFB5X3NzaXplX3QgbGVuID0gUHlfQVJSQVlfTEVOR1RIKG5hbWVidWYpLTQ7Ci0gICAgUHlPYmplY3QgKnBvID0gTlVMTDsKICAgICB3Y2hhcl90ICp3bmFtZWJ1ZiA9IE5VTEw7CiAKLSAgICBpZiAoIXBhdGgtPm5hcnJvdykgewotICAgICAgICBXSU4zMl9GSU5EX0RBVEFXIHdGaWxlRGF0YTsKLSAgICAgICAgd2NoYXJfdCAqcG9fd2NoYXJzOworICAgIFdJTjMyX0ZJTkRfREFUQVcgd0ZpbGVEYXRhOworICAgIGNvbnN0IHdjaGFyX3QgKnBvX3djaGFyczsKIAotICAgICAgICBpZiAoIXBhdGgtPndpZGUpIHsgLyogRGVmYXVsdCBhcmc6ICIuIiAqLwotICAgICAgICAgICAgcG9fd2NoYXJzID0gTCIuIjsKLSAgICAgICAgICAgIGxlbiA9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwb193Y2hhcnMgPSBwYXRoLT53aWRlOwotICAgICAgICAgICAgbGVuID0gd2NzbGVuKHBhdGgtPndpZGUpOwotICAgICAgICB9Ci0gICAgICAgIC8qIFRoZSArNSBpcyBzbyB3ZSBjYW4gYXBwZW5kICJcXCouKlwwIiAqLwotICAgICAgICB3bmFtZWJ1ZiA9IFB5TWVtX05ldyh3Y2hhcl90LCBsZW4gKyA1KTsKLSAgICAgICAgaWYgKCF3bmFtZWJ1ZikgewotICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotICAgICAgICB3Y3NjcHkod25hbWVidWYsIHBvX3djaGFycyk7Ci0gICAgICAgIGlmIChsZW4gPiAwKSB7Ci0gICAgICAgICAgICB3Y2hhcl90IHdjaCA9IHduYW1lYnVmW2xlbi0xXTsKLSAgICAgICAgICAgIGlmICh3Y2ggIT0gU0VQICYmIHdjaCAhPSBBTFRTRVAgJiYgd2NoICE9IEwnOicpCi0gICAgICAgICAgICAgICAgd25hbWVidWZbbGVuKytdID0gU0VQOwotICAgICAgICAgICAgd2NzY3B5KHduYW1lYnVmICsgbGVuLCBMIiouKiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgICAgIGhGaW5kRmlsZSA9IEZpbmRGaXJzdEZpbGVXKHduYW1lYnVmLCAmd0ZpbGVEYXRhKTsKLSAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKLSAgICAgICAgaWYgKGhGaW5kRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICAgICAgaW50IGVycm9yID0gR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgICAgICBpZiAoZXJyb3IgPT0gRVJST1JfRklMRV9OT1RfRk9VTkQpCi0gICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOwotICAgICAgICAgICAgbGlzdCA9IHBhdGhfZXJyb3IocGF0aCk7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgLyogU2tpcCBvdmVyIC4gYW5kIC4uICovCi0gICAgICAgICAgICBpZiAod2NzY21wKHdGaWxlRGF0YS5jRmlsZU5hbWUsIEwiLiIpICE9IDAgJiYKLSAgICAgICAgICAgICAgICB3Y3NjbXAod0ZpbGVEYXRhLmNGaWxlTmFtZSwgTCIuLiIpICE9IDApIHsKLSAgICAgICAgICAgICAgICB2ID0gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcih3RmlsZURhdGEuY0ZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjc2xlbih3RmlsZURhdGEuY0ZpbGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgdikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgICAgICAgICByZXN1bHQgPSBGaW5kTmV4dEZpbGVXKGhGaW5kRmlsZSwgJndGaWxlRGF0YSk7Ci0gICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwotICAgICAgICAgICAgLyogRmluZE5leHRGaWxlIHNldHMgZXJyb3IgdG8gRVJST1JfTk9fTU9SRV9GSUxFUyBpZgotICAgICAgICAgICAgICAgaXQgZ290IHRvIHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeS4gKi8KLSAgICAgICAgICAgIGlmICghcmVzdWx0ICYmIEdldExhc3RFcnJvcigpICE9IEVSUk9SX05PX01PUkVfRklMRVMpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7Ci0gICAgICAgICAgICAgICAgbGlzdCA9IHBhdGhfZXJyb3IocGF0aCk7Ci0gICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChyZXN1bHQgPT0gVFJVRSk7Ci0KKyAgICBpZiAoIXBhdGgtPndpZGUpIHsgLyogRGVmYXVsdCBhcmc6ICIuIiAqLworICAgICAgICBwb193Y2hhcnMgPSBMIi4iOworICAgICAgICBsZW4gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHBvX3djaGFycyA9IHBhdGgtPndpZGU7CisgICAgICAgIGxlbiA9IHdjc2xlbihwYXRoLT53aWRlKTsKKyAgICB9CisgICAgLyogVGhlICs1IGlzIHNvIHdlIGNhbiBhcHBlbmQgIlxcKi4qXDAiICovCisgICAgd25hbWVidWYgPSBQeU1lbV9OZXcod2NoYXJfdCwgbGVuICsgNSk7CisgICAgaWYgKCF3bmFtZWJ1ZikgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQotICAgIHN0cmNweShuYW1lYnVmLCBwYXRoLT5uYXJyb3cpOwotICAgIGxlbiA9IHBhdGgtPmxlbmd0aDsKKyAgICB3Y3NjcHkod25hbWVidWYsIHBvX3djaGFycyk7CiAgICAgaWYgKGxlbiA+IDApIHsKLSAgICAgICAgY2hhciBjaCA9IG5hbWVidWZbbGVuLTFdOwotICAgICAgICBpZiAoY2ggIT0gJ1xcJyAmJiBjaCAhPSAnLycgJiYgY2ggIT0gJzonKQotICAgICAgICAgICAgbmFtZWJ1ZltsZW4rK10gPSAnXFwnOwotICAgICAgICBzdHJjcHkobmFtZWJ1ZiArIGxlbiwgIiouKiIpOworICAgICAgICB3Y2hhcl90IHdjaCA9IHduYW1lYnVmW2xlbi0xXTsKKyAgICAgICAgaWYgKHdjaCAhPSBTRVAgJiYgd2NoICE9IEFMVFNFUCAmJiB3Y2ggIT0gTCc6JykKKyAgICAgICAgICAgIHduYW1lYnVmW2xlbisrXSA9IFNFUDsKKyAgICAgICAgd2NzY3B5KHduYW1lYnVmICsgbGVuLCBMIiouKiIpOwogICAgIH0KLQotICAgIGlmICgobGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCisgICAgaWYgKChsaXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICBoRmluZEZpbGUgPSBGaW5kRmlyc3RGaWxlKG5hbWVidWYsICZGaWxlRGF0YSk7CisgICAgaEZpbmRGaWxlID0gRmluZEZpcnN0RmlsZVcod25hbWVidWYsICZ3RmlsZURhdGEpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgaWYgKGhGaW5kRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewogICAgICAgICBpbnQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKQEAgLTM1NjMsOSArMzQxNSwxMyBAQAogICAgIH0KICAgICBkbyB7CiAgICAgICAgIC8qIFNraXAgb3ZlciAuIGFuZCAuLiAqLwotICAgICAgICBpZiAoc3RyY21wKEZpbGVEYXRhLmNGaWxlTmFtZSwgIi4iKSAhPSAwICYmCi0gICAgICAgICAgICBzdHJjbXAoRmlsZURhdGEuY0ZpbGVOYW1lLCAiLi4iKSAhPSAwKSB7Ci0gICAgICAgICAgICB2ID0gUHlCeXRlc19Gcm9tU3RyaW5nKEZpbGVEYXRhLmNGaWxlTmFtZSk7CisgICAgICAgIGlmICh3Y3NjbXAod0ZpbGVEYXRhLmNGaWxlTmFtZSwgTCIuIikgIT0gMCAmJgorICAgICAgICAgICAgd2NzY21wKHdGaWxlRGF0YS5jRmlsZU5hbWUsIEwiLi4iKSAhPSAwKSB7CisgICAgICAgICAgICB2ID0gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcih3RmlsZURhdGEuY0ZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NzbGVuKHdGaWxlRGF0YS5jRmlsZU5hbWUpKTsKKyAgICAgICAgICAgIGlmIChwYXRoLT5uYXJyb3cgJiYgdikgeworICAgICAgICAgICAgICAgIFB5X1NFVFJFRih2LCBQeVVuaWNvZGVfRW5jb2RlRlNEZWZhdWx0KHYpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CiAgICAgICAgICAgICAgICAgbGlzdCA9IE5VTEw7CkBAIC0zNTgwLDcgKzM0MzYsNyBAQAogICAgICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICB9CiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICAgICAgcmVzdWx0ID0gRmluZE5leHRGaWxlKGhGaW5kRmlsZSwgJkZpbGVEYXRhKTsKKyAgICAgICAgcmVzdWx0ID0gRmluZE5leHRGaWxlVyhoRmluZEZpbGUsICZ3RmlsZURhdGEpOwogICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgICAvKiBGaW5kTmV4dEZpbGUgc2V0cyBlcnJvciB0byBFUlJPUl9OT19NT1JFX0ZJTEVTIGlmCiAgICAgICAgICAgIGl0IGdvdCB0byB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnkuICovCkBAIC0zNjM1LDcgKzM0OTEsNyBAQAogICAgIGVsc2UKICNlbmRpZgogICAgIHsKLSAgICAgICAgY2hhciAqbmFtZTsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICAgICAgaWYgKHBhdGgtPm5hcnJvdykgewogICAgICAgICAgICAgbmFtZSA9IHBhdGgtPm5hcnJvdzsKICAgICAgICAgICAgIC8qIG9ubHkgcmV0dXJuIGJ5dGVzIGlmIHRoZXkgc3BlY2lmaWVkIGEgYnl0ZXMgb2JqZWN0ICovCkBAIC0zNzYxLDQxICszNjE3LDI5IEBACiBvc19fZ2V0ZnVsbHBhdGhuYW1lX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgcGF0aF90ICpwYXRoKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJiODY3OWQ1Njg0NWJjOWIgaW5wdXQ9MzMyZWQ1MzdjMjlkMGEzZV0qLwogewotICAgIGlmICghcGF0aC0+bmFycm93KQotICAgIHsKLSAgICAgICAgd2NoYXJfdCB3b3V0YnVmW01BWF9QQVRIXSwgKndvdXRidWZwID0gd291dGJ1ZjsKLSAgICAgICAgd2NoYXJfdCAqd3RlbXA7Ci0gICAgICAgIERXT1JEIHJlc3VsdDsKLSAgICAgICAgUHlPYmplY3QgKnY7CisgICAgd2NoYXJfdCB3b3V0YnVmW01BWF9QQVRIXSwgKndvdXRidWZwID0gd291dGJ1ZjsKKyAgICB3Y2hhcl90ICp3dGVtcDsKKyAgICBEV09SRCByZXN1bHQ7CisgICAgUHlPYmplY3QgKnY7CiAKLSAgICAgICAgcmVzdWx0ID0gR2V0RnVsbFBhdGhOYW1lVyhwYXRoLT53aWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0FSUkFZX0xFTkdUSCh3b3V0YnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3V0YnVmLCAmd3RlbXApOwotICAgICAgICBpZiAocmVzdWx0ID4gUHlfQVJSQVlfTEVOR1RIKHdvdXRidWYpKSB7Ci0gICAgICAgICAgICB3b3V0YnVmcCA9IFB5TWVtX05ldyh3Y2hhcl90LCByZXN1bHQpOwotICAgICAgICAgICAgaWYgKCF3b3V0YnVmcCkKLSAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IEdldEZ1bGxQYXRoTmFtZVcocGF0aC0+d2lkZSwgcmVzdWx0LCB3b3V0YnVmcCwgJnd0ZW1wKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0KQotICAgICAgICAgICAgdiA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIod291dGJ1ZnAsIHdjc2xlbih3b3V0YnVmcCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2ID0gd2luMzJfZXJyb3Jfb2JqZWN0KCJHZXRGdWxsUGF0aE5hbWVXIiwgcGF0aC0+b2JqZWN0KTsKLSAgICAgICAgaWYgKHdvdXRidWZwICE9IHdvdXRidWYpCi0gICAgICAgICAgICBQeU1lbV9GcmVlKHdvdXRidWZwKTsKLSAgICAgICAgcmV0dXJuIHY7CisgICAgcmVzdWx0ID0gR2V0RnVsbFBhdGhOYW1lVyhwYXRoLT53aWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfQVJSQVlfTEVOR1RIKHdvdXRidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd291dGJ1ZiwgJnd0ZW1wKTsKKyAgICBpZiAocmVzdWx0ID4gUHlfQVJSQVlfTEVOR1RIKHdvdXRidWYpKSB7CisgICAgICAgIHdvdXRidWZwID0gUHlNZW1fTmV3KHdjaGFyX3QsIHJlc3VsdCk7CisgICAgICAgIGlmICghd291dGJ1ZnApCisgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmVzdWx0ID0gR2V0RnVsbFBhdGhOYW1lVyhwYXRoLT53aWRlLCByZXN1bHQsIHdvdXRidWZwLCAmd3RlbXApOwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgY2hhciBvdXRidWZbTUFYX1BBVEhdOwotICAgICAgICBjaGFyICp0ZW1wOwotCi0gICAgICAgIGlmICghR2V0RnVsbFBhdGhOYW1lKHBhdGgtPm5hcnJvdywgUHlfQVJSQVlfTEVOR1RIKG91dGJ1ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJ1ZiwgJnRlbXApKSB7Ci0gICAgICAgICAgICB3aW4zMl9lcnJvcl9vYmplY3QoIkdldEZ1bGxQYXRoTmFtZSIsIHBhdGgtPm9iamVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nKG91dGJ1Zik7Ci0gICAgfQorICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgdiA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIod291dGJ1ZnAsIHdjc2xlbih3b3V0YnVmcCkpOworICAgICAgICBpZiAocGF0aC0+bmFycm93KQorICAgICAgICAgICAgUHlfU0VUUkVGKHYsIFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQodikpOworICAgIH0gZWxzZQorICAgICAgICB2ID0gd2luMzJfZXJyb3Jfb2JqZWN0KCJHZXRGdWxsUGF0aE5hbWVXIiwgcGF0aC0+b2JqZWN0KTsKKyAgICBpZiAod291dGJ1ZnAgIT0gd291dGJ1ZikKKyAgICAgICAgUHlNZW1fRnJlZSh3b3V0YnVmcCk7CisgICAgcmV0dXJuIHY7CiB9CiAKIApAQCAtMzgxNyw3ICszNjYxLDcgQEAKICAgICB3Y2hhcl90ICp0YXJnZXRfcGF0aDsKICAgICBpbnQgcmVzdWx0X2xlbmd0aDsKICAgICBQeU9iamVjdCAqcmVzdWx0OwotICAgIHdjaGFyX3QgKnBhdGhfd2NoYXI7CisgICAgY29uc3Qgd2NoYXJfdCAqcGF0aF93Y2hhcjsKIAogICAgIHBhdGhfd2NoYXIgPSBQeVVuaWNvZGVfQXNVbmljb2RlKHBhdGgpOwogICAgIGlmIChwYXRoX3djaGFyID09IE5VTEwpCkBAIC0zODc5LDEwICszNzIzLDcgQEAKICAgICBEV09SRCBhdHRyaWJ1dGVzOwogCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgIGlmICghcGF0aC0+bmFycm93KQotICAgICAgICBhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXNXKHBhdGgtPndpZGUpOwotICAgIGVsc2UKLSAgICAgICAgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzQShwYXRoLT5uYXJyb3cpOworICAgIGF0dHJpYnV0ZXMgPSBHZXRGaWxlQXR0cmlidXRlc1cocGF0aC0+d2lkZSk7CiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAogICAgIGlmIChhdHRyaWJ1dGVzID09IElOVkFMSURfRklMRV9BVFRSSUJVVEVTKQpAQCAtMzkwOCw3ICszNzQ5LDggQEAKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jYmRjYmQxMDU5Y2VlZjRjIGlucHV0PTdlYWNhZGM0MGFjYmRhNmJdKi8KIHsKICAgICBQeU9iamVjdCAqcmVzdWx0OwotICAgIHdjaGFyX3QgKnBhdGhfd2NoYXIsICptb3VudHBhdGg9TlVMTDsKKyAgICBjb25zdCB3Y2hhcl90ICpwYXRoX3djaGFyOworICAgIHdjaGFyX3QgKm1vdW50cGF0aD1OVUxMOwogICAgIHNpemVfdCBidWZsZW47CiAgICAgQk9PTCByZXQ7CiAKQEAgLTM5NzksMTAgKzM4MjEsNyBAQAogCiAjaWZkZWYgTVNfV0lORE9XUwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICBpZiAocGF0aC0+d2lkZSkKLSAgICAgICAgcmVzdWx0ID0gQ3JlYXRlRGlyZWN0b3J5VyhwYXRoLT53aWRlLCBOVUxMKTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IENyZWF0ZURpcmVjdG9yeUEocGF0aC0+bmFycm93LCBOVUxMKTsKKyAgICByZXN1bHQgPSBDcmVhdGVEaXJlY3RvcnlXKHBhdGgtPndpZGUsIE5VTEwpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKICAgICBpZiAoIXJlc3VsdCkKQEAgLTQwMDIsNyArMzg0MSw3IEBACiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICBpZiAocmVzdWx0IDwgMCkKICAgICAgICAgcmV0dXJuIHBhdGhfZXJyb3IocGF0aCk7Ci0jZW5kaWYKKyNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKQEAgLTQxMDYsNyArMzk0NSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW50ZXJuYWxfcmVuYW1lKHBhdGhfdCAqc3JjLCBwYXRoX3QgKmRzdCwgaW50IHNyY19kaXJfZmQsIGludCBkc3RfZGlyX2ZkLCBpbnQgaXNfcmVwbGFjZSkKIHsKLSAgICBjaGFyICpmdW5jdGlvbl9uYW1lID0gaXNfcmVwbGFjZSA/ICJyZXBsYWNlIiA6ICJyZW5hbWUiOworICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUgPSBpc19yZXBsYWNlID8gInJlcGxhY2UiIDogInJlbmFtZSI7CiAgICAgaW50IGRpcl9mZF9zcGVjaWZpZWQ7CiAKICNpZmRlZiBNU19XSU5ET1dTCkBAIC00MTI1LDMxICszOTY0LDI4IEBACiAgICAgfQogI2VuZGlmCiAKLSAgICBpZiAoKHNyYy0+bmFycm93ICYmIGRzdC0+d2lkZSkgfHwgKHNyYy0+d2lkZSAmJiBkc3QtPm5hcnJvdykpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiJXM6IHNyYyBhbmQgZHN0IG11c3QgYmUgdGhlIHNhbWUgdHlwZSIsIGZ1bmN0aW9uX25hbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KICNpZmRlZiBNU19XSU5ET1dTCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgIGlmIChzcmMtPndpZGUpCi0gICAgICAgIHJlc3VsdCA9IE1vdmVGaWxlRXhXKHNyYy0+d2lkZSwgZHN0LT53aWRlLCBmbGFncyk7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSBNb3ZlRmlsZUV4QShzcmMtPm5hcnJvdywgZHN0LT5uYXJyb3csIGZsYWdzKTsKKyAgICByZXN1bHQgPSBNb3ZlRmlsZUV4VyhzcmMtPndpZGUsIGRzdC0+d2lkZSwgZmxhZ3MpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKICAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgcmV0dXJuIHBhdGhfZXJyb3IyKHNyYywgZHN0KTsKIAogI2Vsc2UKKyAgICBpZiAoKHNyYy0+bmFycm93ICYmIGRzdC0+d2lkZSkgfHwgKHNyYy0+d2lkZSAmJiBkc3QtPm5hcnJvdykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXM6IHNyYyBhbmQgZHN0IG11c3QgYmUgdGhlIHNhbWUgdHlwZSIsIGZ1bmN0aW9uX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAjaWZkZWYgSEFWRV9SRU5BTUVBVAogICAgIGlmIChkaXJfZmRfc3BlY2lmaWVkKQogICAgICAgICByZXN1bHQgPSByZW5hbWVhdChzcmNfZGlyX2ZkLCBzcmMtPm5hcnJvdywgZHN0X2Rpcl9mZCwgZHN0LT5uYXJyb3cpOwogICAgIGVsc2UKICNlbmRpZgotICAgICAgICByZXN1bHQgPSByZW5hbWUoc3JjLT5uYXJyb3csIGRzdC0+bmFycm93KTsKKyAgICByZXN1bHQgPSByZW5hbWUoc3JjLT5uYXJyb3csIGRzdC0+bmFycm93KTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCiAgICAgaWYgKHJlc3VsdCkKQEAgLTQyMzAsMTEgKzQwNjYsOCBAQAogCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogI2lmZGVmIE1TX1dJTkRPV1MKLSAgICBpZiAocGF0aC0+d2lkZSkKLSAgICAgICAgcmVzdWx0ID0gUmVtb3ZlRGlyZWN0b3J5VyhwYXRoLT53aWRlKTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IFJlbW92ZURpcmVjdG9yeUEocGF0aC0+bmFycm93KTsKLSAgICByZXN1bHQgPSAhcmVzdWx0OyAvKiBXaW5kb3dzLCBzdWNjZXNzPTEsIFVOSVgsIHN1Y2Nlc3M9MCAqLworICAgIC8qIFdpbmRvd3MsIHN1Y2Nlc3M9MSwgVU5JWCwgc3VjY2Vzcz0wICovCisgICAgcmVzdWx0ID0gIVJlbW92ZURpcmVjdG9yeVcocGF0aC0+d2lkZSk7CiAjZWxzZQogI2lmZGVmIEhBVkVfVU5MSU5LQVQKICAgICBpZiAoZGlyX2ZkICE9IERFRkFVTFRfRElSX0ZEKQpAQCAtNDI4Niw3ICs0MTE5LDcgQEAKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yOTBmYzQzN2RkNGYzM2EwIGlucHV0PTg2YTU4NTU0YmE2MDk0YWZdKi8KIHsKICAgICBsb25nIHJlc3VsdDsKLSAgICBjaGFyICpieXRlcyA9IFB5Qnl0ZXNfQXNTdHJpbmcoY29tbWFuZCk7CisgICAgY29uc3QgY2hhciAqYnl0ZXMgPSBQeUJ5dGVzX0FzU3RyaW5nKGNvbW1hbmQpOwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICByZXN1bHQgPSBzeXN0ZW0oYnl0ZXMpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCkBAIC00MzgwLDExICs0MjEzLDggQEAKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAogI2lmZGVmIE1TX1dJTkRPV1MKLSAgICBpZiAocGF0aC0+d2lkZSkKLSAgICAgICAgcmVzdWx0ID0gUHlfRGVsZXRlRmlsZVcocGF0aC0+d2lkZSk7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSBEZWxldGVGaWxlQShwYXRoLT5uYXJyb3cpOwotICAgIHJlc3VsdCA9ICFyZXN1bHQ7IC8qIFdpbmRvd3MsIHN1Y2Nlc3M9MSwgVU5JWCwgc3VjY2Vzcz0wICovCisgICAgLyogV2luZG93cywgc3VjY2Vzcz0xLCBVTklYLCBzdWNjZXNzPTAgKi8KKyAgICByZXN1bHQgPSAhUHlfRGVsZXRlRmlsZVcocGF0aC0+d2lkZSk7CiAjZWxzZQogI2lmZGVmIEhBVkVfVU5MSU5LQVQKICAgICBpZiAoZGlyX2ZkICE9IERFRkFVTFRfRElSX0ZEKQpAQCAtNDU2Niw3ICs0Mzk2LDcgQEAKICNpZiBkZWZpbmVkKEhBVkVfRlVUSU1FU0FUKSB8fCBkZWZpbmVkKEhBVkVfVVRJTUVOU0FUKQogCiBzdGF0aWMgaW50Ci11dGltZV9kaXJfZmQodXRpbWVfdCAqdXQsIGludCBkaXJfZmQsIGNoYXIgKnBhdGgsIGludCBmb2xsb3dfc3ltbGlua3MpCit1dGltZV9kaXJfZmQodXRpbWVfdCAqdXQsIGludCBkaXJfZmQsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBmb2xsb3dfc3ltbGlua3MpCiB7CiAjaWZkZWYgSEFWRV9VVElNRU5TQVQKICAgICBpbnQgZmxhZ3MgPSBmb2xsb3dfc3ltbGlua3MgPyAwIDogQVRfU1lNTElOS19OT0ZPTExPVzsKQEAgLTQ2MDgsMTQgKzQ0MzgsMTQgQEAKICAgICAjZGVmaW5lIFBBVEhfVVRJTUVfSEFWRV9GRCAwCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoSEFWRV9VVElNRU5TQVQpIHx8IGRlZmluZWQoSEFWRV9MVVRJTUVTKQorIyAgZGVmaW5lIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKKyNlbmRpZgogCi0jZGVmaW5lIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MgXAotICAgICAgICAoZGVmaW5lZChIQVZFX1VUSU1FTlNBVCkgfHwgZGVmaW5lZChIQVZFX0xVVElNRVMpKQotCi0jaWYgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2lmZGVmIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKIAogc3RhdGljIGludAotdXRpbWVfbm9mb2xsb3dfc3ltbGlua3ModXRpbWVfdCAqdXQsIGNoYXIgKnBhdGgpCit1dGltZV9ub2ZvbGxvd19zeW1saW5rcyh1dGltZV90ICp1dCwgY29uc3QgY2hhciAqcGF0aCkKIHsKICNpZmRlZiBIQVZFX1VUSU1FTlNBVAogICAgIFVUSU1FX1RPX1RJTUVTUEVDOwpAQCAtNDYzMSw3ICs0NDYxLDcgQEAKICNpZm5kZWYgTVNfV0lORE9XUwogCiBzdGF0aWMgaW50Ci11dGltZV9kZWZhdWx0KHV0aW1lX3QgKnV0LCBjaGFyICpwYXRoKQordXRpbWVfZGVmYXVsdCh1dGltZV90ICp1dCwgY29uc3QgY2hhciAqcGF0aCkKIHsKICNpZmRlZiBIQVZFX1VUSU1FTlNBVAogICAgIFVUSU1FX1RPX1RJTUVTUEVDOwpAQCAtNDc3NCw3ICs0NjA0LDcgQEAKICAgICAgICAgdXRpbWUubm93ID0gMTsKICAgICB9CiAKLSNpZiAhVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2lmICFkZWZpbmVkKFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MpCiAgICAgaWYgKGZvbGxvd19zeW1saW5rc19zcGVjaWZpZWQoInV0aW1lIiwgZm9sbG93X3N5bWxpbmtzKSkKICAgICAgICAgZ290byBleGl0OwogI2VuZGlmCkBAIC00Nzk1LDE0ICs0NjI1LDkgQEAKIAogI2lmZGVmIE1TX1dJTkRPV1MKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgaWYgKHBhdGgtPndpZGUpCi0gICAgICAgIGhGaWxlID0gQ3JlYXRlRmlsZVcocGF0aC0+d2lkZSwgRklMRV9XUklURV9BVFRSSUJVVEVTLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE9QRU5fRVhJU1RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9GTEFHX0JBQ0tVUF9TRU1BTlRJQ1MsIE5VTEwpOwotICAgIGVsc2UKLSAgICAgICAgaEZpbGUgPSBDcmVhdGVGaWxlQShwYXRoLT5uYXJyb3csIEZJTEVfV1JJVEVfQVRUUklCVVRFUywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBPUEVOX0VYSVNUSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTLCBOVUxMKTsKKyAgICBoRmlsZSA9IENyZWF0ZUZpbGVXKHBhdGgtPndpZGUsIEZJTEVfV1JJVEVfQVRUUklCVVRFUywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE9QRU5fRVhJU1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0ZMQUdfQkFDS1VQX1NFTUFOVElDUywgTlVMTCk7CiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICBpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKICAgICAgICAgcGF0aF9lcnJvcihwYXRoKTsKQEAgLTQ4MjgsNyArNDY1Myw3IEBACiAjZWxzZSAvKiBNU19XSU5ET1dTICovCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCi0jaWYgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2lmZGVmIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKICAgICBpZiAoKCFmb2xsb3dfc3ltbGlua3MpICYmIChkaXJfZmQgPT0gREVGQVVMVF9ESVJfRkQpKQogICAgICAgICByZXN1bHQgPSB1dGltZV9ub2ZvbGxvd19zeW1saW5rcygmdXRpbWUsIHBhdGgtPm5hcnJvdyk7CiAgICAgZWxzZQpAQCAtNDg4OCw5ICs0NzEzLDE1IEBACiAgICAgcmV0dXJuIE5VTEw7IC8qIE1ha2UgZ2NjIC1XYWxsIGhhcHB5ICovCiB9CiAKKyNpZiBkZWZpbmVkKEhBVkVfV0VYRUNWKSB8fCBkZWZpbmVkKEhBVkVfV1NQQVdOVikKKyNkZWZpbmUgRVhFQ1ZfQ0hBUiB3Y2hhcl90CisjZWxzZQorI2RlZmluZSBFWEVDVl9DSEFSIGNoYXIKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChIQVZFX0VYRUNWKSB8fCBkZWZpbmVkKEhBVkVfU1BBV05WKQogc3RhdGljIHZvaWQKLWZyZWVfc3RyaW5nX2FycmF5KGNoYXIgKiphcnJheSwgUHlfc3NpemVfdCBjb3VudCkKK2ZyZWVfc3RyaW5nX2FycmF5KEVYRUNWX0NIQVIgKiphcnJheSwgUHlfc3NpemVfdCBjb3VudCkKIHsKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCkBAIC00ODk5LDEwICs0NzMwLDE1IEBACiB9CiAKIHN0YXRpYwotaW50IGZzY29udmVydF9zdHJkdXAoUHlPYmplY3QgKm8sIGNoYXIqKm91dCkKK2ludCBmc2NvbnZlcnRfc3RyZHVwKFB5T2JqZWN0ICpvLCBFWEVDVl9DSEFSKipvdXQpCiB7Ci0gICAgUHlPYmplY3QgKmJ5dGVzOwogICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyNpZiBkZWZpbmVkKEhBVkVfV0VYRUNWKSB8fCBkZWZpbmVkKEhBVkVfV1NQQVdOVikKKyAgICAqb3V0ID0gUHlVbmljb2RlX0FzV2lkZUNoYXJTdHJpbmcobywgJnNpemUpOworICAgIGlmICghKm91dCkKKyAgICAgICAgcmV0dXJuIDA7CisjZWxzZQorICAgIFB5T2JqZWN0ICpieXRlczsKICAgICBpZiAoIVB5VW5pY29kZV9GU0NvbnZlcnRlcihvLCAmYnl0ZXMpKQogICAgICAgICByZXR1cm4gMDsKICAgICBzaXplID0gUHlCeXRlc19HRVRfU0laRShieXRlcyk7CkBAIC00OTEzLDI1ICs0NzQ5LDI0IEBACiAgICAgfQogICAgIG1lbWNweSgqb3V0LCBQeUJ5dGVzX0FzU3RyaW5nKGJ5dGVzKSwgc2l6ZSsxKTsKICAgICBQeV9ERUNSRUYoYnl0ZXMpOworI2VuZGlmCiAgICAgcmV0dXJuIDE7CiB9CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoSEFWRV9FWEVDVikgfHwgZGVmaW5lZCAoSEFWRV9GRVhFQ1ZFKQotc3RhdGljIGNoYXIqKgorc3RhdGljIEVYRUNWX0NIQVIqKgogcGFyc2VfZW52bGlzdChQeU9iamVjdCogZW52LCBQeV9zc2l6ZV90ICplbnZjX3B0cikKIHsKLSAgICBjaGFyICoqZW52bGlzdDsKICAgICBQeV9zc2l6ZV90IGksIHBvcywgZW52YzsKICAgICBQeU9iamVjdCAqa2V5cz1OVUxMLCAqdmFscz1OVUxMOwotICAgIFB5T2JqZWN0ICprZXksICp2YWwsICprZXkyLCAqdmFsMjsKLSAgICBjaGFyICpwLCAqaywgKnY7Ci0gICAgc2l6ZV90IGxlbjsKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsLCAqa2V5dmFsOworICAgIEVYRUNWX0NIQVIgKiplbnZsaXN0OwogCiAgICAgaSA9IFB5TWFwcGluZ19TaXplKGVudik7CiAgICAgaWYgKGkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBlbnZsaXN0ID0gUHlNZW1fTkVXKGNoYXIgKiwgaSArIDEpOworICAgIGVudmxpc3QgPSBQeU1lbV9ORVcoRVhFQ1ZfQ0hBUiAqLCBpICsgMSk7CiAgICAgaWYgKGVudmxpc3QgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQ5NTUsMjggKzQ3OTAsMTYgQEAKICAgICAgICAgaWYgKCFrZXkgfHwgIXZhbCkKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKLSAgICAgICAgaWYgKFB5VW5pY29kZV9GU0NvbnZlcnRlcihrZXksICZrZXkyKSA9PSAwKQorICAgICAgICBrZXl2YWwgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJVU9JVUiLCBrZXksIHZhbCk7CisgICAgICAgIGlmICgha2V5dmFsKQogICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgaWYgKFB5VW5pY29kZV9GU0NvbnZlcnRlcih2YWwsICZ2YWwyKSA9PSAwKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoa2V5Mik7CisKKyAgICAgICAgaWYgKCFmc2NvbnZlcnRfc3RyZHVwKGtleXZhbCwgJmVudmxpc3RbZW52YysrXSkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXl2YWwpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotCi0gICAgICAgIGsgPSBQeUJ5dGVzX0FzU3RyaW5nKGtleTIpOwotICAgICAgICB2ID0gUHlCeXRlc19Bc1N0cmluZyh2YWwyKTsKLSAgICAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShrZXkyKSArIFB5Qnl0ZXNfR0VUX1NJWkUodmFsMikgKyAyOwotCi0gICAgICAgIHAgPSBQeU1lbV9ORVcoY2hhciwgbGVuKTsKLSAgICAgICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkyKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih2YWwyKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgUHlPU19zbnByaW50ZihwLCBsZW4sICIlcz0lcyIsIGssIHYpOwotICAgICAgICBlbnZsaXN0W2VudmMrK10gPSBwOwotICAgICAgICBQeV9ERUNSRUYoa2V5Mik7Ci0gICAgICAgIFB5X0RFQ1JFRih2YWwyKTsKKyAgICAgICAgCisgICAgICAgIFB5X0RFQ1JFRihrZXl2YWwpOwogICAgIH0KICAgICBQeV9ERUNSRUYodmFscyk7CiAgICAgUHlfREVDUkVGKGtleXMpOwpAQCAtNDk4OCwxNyArNDgxMSwxNSBAQAogZXJyb3I6CiAgICAgUHlfWERFQ1JFRihrZXlzKTsKICAgICBQeV9YREVDUkVGKHZhbHMpOwotICAgIHdoaWxlICgtLWVudmMgPj0gMCkKLSAgICAgICAgUHlNZW1fREVMKGVudmxpc3RbZW52Y10pOwotICAgIFB5TWVtX0RFTChlbnZsaXN0KTsKKyAgICBmcmVlX3N0cmluZ19hcnJheShlbnZsaXN0LCBlbnZjKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGNoYXIqKgorc3RhdGljIEVYRUNWX0NIQVIqKgogcGFyc2VfYXJnbGlzdChQeU9iamVjdCogYXJndiwgUHlfc3NpemVfdCAqYXJnYykKIHsKICAgICBpbnQgaTsKLSAgICBjaGFyICoqYXJndmxpc3QgPSBQeU1lbV9ORVcoY2hhciAqLCAqYXJnYysxKTsKKyAgICBFWEVDVl9DSEFSICoqYXJndmxpc3QgPSBQeU1lbV9ORVcoRVhFQ1ZfQ0hBUiAqLCAqYXJnYysxKTsKICAgICBpZiAoYXJndmxpc3QgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTUwMjAsNiArNDg0MSw3IEBACiAgICAgZnJlZV9zdHJpbmdfYXJyYXkoYXJndmxpc3QsICphcmdjKTsKICAgICByZXR1cm4gTlVMTDsKIH0KKwogI2VuZGlmCiAKIApAQCAtNTAyNyw3ICs0ODQ5LDcgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIG9zLmV4ZWN2CiAKLSAgICBwYXRoOiBGU0NvbnZlcnRlcgorICAgIHBhdGg6IHBhdGhfdAogICAgICAgICBQYXRoIG9mIGV4ZWN1dGFibGUgZmlsZS4KICAgICBhcmd2OiBvYmplY3QKICAgICAgICAgVHVwbGUgb3IgbGlzdCBvZiBzdHJpbmdzLgpAQCAtNTAzNywxNyArNDg1OSwxNSBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotb3NfZXhlY3ZfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqcGF0aCwgUHlPYmplY3QgKmFyZ3YpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjIxZGMzNGRlZWI1YjAwNCBpbnB1dD05NjA0MTU1OTkyNWU1MjI5XSovCitvc19leGVjdl9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIHBhdGhfdCAqcGF0aCwgUHlPYmplY3QgKmFyZ3YpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9M2I1MmZlYzM0Y2QwZGFmZCBpbnB1dD05YmFjMzFlZmFlMDdkYWM3XSovCiB7Ci0gICAgY2hhciAqcGF0aF9jaGFyOwotICAgIGNoYXIgKiphcmd2bGlzdDsKKyAgICBFWEVDVl9DSEFSICoqYXJndmxpc3Q7CiAgICAgUHlfc3NpemVfdCBhcmdjOwogCiAgICAgLyogZXhlY3YgaGFzIHR3byBhcmd1bWVudHM6IChwYXRoLCBhcmd2KSwgd2hlcmUKICAgICAgICBhcmd2IGlzIGEgbGlzdCBvciB0dXBsZSBvZiBzdHJpbmdzLiAqLwogCi0gICAgcGF0aF9jaGFyID0gUHlCeXRlc19Bc1N0cmluZyhwYXRoKTsKICAgICBpZiAoIVB5TGlzdF9DaGVjayhhcmd2KSAmJiAhUHlUdXBsZV9DaGVjayhhcmd2KSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImV4ZWN2KCkgYXJnIDIgbXVzdCBiZSBhIHR1cGxlIG9yIGxpc3QiKTsKQEAgLTUwNjQsNyArNDg4NCwxMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBleGVjdihwYXRoX2NoYXIsIGFyZ3ZsaXN0KTsKKyNpZmRlZiBIQVZFX1dFWEVDVgorICAgIF93ZXhlY3YocGF0aC0+d2lkZSwgYXJndmxpc3QpOworI2Vsc2UKKyAgICBleGVjdihwYXRoLT5uYXJyb3csIGFyZ3ZsaXN0KTsKKyNlbmRpZgogCiAgICAgLyogSWYgd2UgZ2V0IGhlcmUgaXQncyBkZWZpbml0ZWx5IGFuIGVycm9yICovCiAKQEAgLTUwOTAsOCArNDkxNCw4IEBACiBvc19leGVjdmVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBwYXRoX3QgKnBhdGgsIFB5T2JqZWN0ICphcmd2LCBQeU9iamVjdCAqZW52KQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZmOWZhOGU0ZGE4YmRlNTggaW5wdXQ9NjI2ODA0ZmEwOTI2MDZkOV0qLwogewotICAgIGNoYXIgKiphcmd2bGlzdCA9IE5VTEw7Ci0gICAgY2hhciAqKmVudmxpc3Q7CisgICAgRVhFQ1ZfQ0hBUiAqKmFyZ3ZsaXN0ID0gTlVMTDsKKyAgICBFWEVDVl9DSEFSICoqZW52bGlzdDsKICAgICBQeV9zc2l6ZV90IGFyZ2MsIGVudmM7CiAKICAgICAvKiBleGVjdmUgaGFzIHRocmVlIGFyZ3VtZW50czogKHBhdGgsIGFyZ3YsIGVudiksIHdoZXJlCkBAIC01MTI0LDMwICs0OTQ4LDMzIEBACiAgICAgICAgIGZleGVjdmUocGF0aC0+ZmQsIGFyZ3ZsaXN0LCBlbnZsaXN0KTsKICAgICBlbHNlCiAjZW5kaWYKKyNpZmRlZiBIQVZFX1dFWEVDVgorICAgICAgICBfd2V4ZWN2ZShwYXRoLT53aWRlLCBhcmd2bGlzdCwgZW52bGlzdCk7CisjZWxzZQogICAgICAgICBleGVjdmUocGF0aC0+bmFycm93LCBhcmd2bGlzdCwgZW52bGlzdCk7CisjZW5kaWYKIAogICAgIC8qIElmIHdlIGdldCBoZXJlIGl0J3MgZGVmaW5pdGVseSBhbiBlcnJvciAqLwogCiAgICAgcGF0aF9lcnJvcihwYXRoKTsKIAotICAgIHdoaWxlICgtLWVudmMgPj0gMCkKLSAgICAgICAgUHlNZW1fREVMKGVudmxpc3RbZW52Y10pOwotICAgIFB5TWVtX0RFTChlbnZsaXN0KTsKKyAgICBmcmVlX3N0cmluZ19hcnJheShlbnZsaXN0LCBlbnZjKTsKICAgZmFpbDoKICAgICBpZiAoYXJndmxpc3QpCiAgICAgICAgIGZyZWVfc3RyaW5nX2FycmF5KGFyZ3ZsaXN0LCBhcmdjKTsKICAgICByZXR1cm4gTlVMTDsKIH0KKwogI2VuZGlmIC8qIEhBVkVfRVhFQ1YgKi8KIAogCi0jaWZkZWYgSEFWRV9TUEFXTlYKKyNpZiBkZWZpbmVkKEhBVkVfU1BBV05WKSB8fCBkZWZpbmVkKEhBVkVfV1NQQVdOVikKIC8qW2NsaW5pYyBpbnB1dF0KIG9zLnNwYXdudgogCiAgICAgbW9kZTogaW50CiAgICAgICAgIE1vZGUgb2YgcHJvY2VzcyBjcmVhdGlvbi4KLSAgICBwYXRoOiBGU0NvbnZlcnRlcgorICAgIHBhdGg6IHBhdGhfdAogICAgICAgICBQYXRoIG9mIGV4ZWN1dGFibGUgZmlsZS4KICAgICBhcmd2OiBvYmplY3QKICAgICAgICAgVHVwbGUgb3IgbGlzdCBvZiBzdHJpbmdzLgpAQCAtNTE1NywyMCArNDk4NCwxOCBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotb3Nfc3Bhd252X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50IG1vZGUsIFB5T2JqZWN0ICpwYXRoLCBQeU9iamVjdCAqYXJndikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jNDI3YzBjZTQwZjEwNjM4IGlucHV0PTA0MmM5MWRmYzFlNmRlYmNdKi8KK29zX3NwYXdudl9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludCBtb2RlLCBwYXRoX3QgKnBhdGgsIFB5T2JqZWN0ICphcmd2KQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTcxY2QwMzdhOWQ5NmI4MTYgaW5wdXQ9NDMyMjQyNDIzMDMyOTFiZV0qLwogewotICAgIGNoYXIgKnBhdGhfY2hhcjsKLSAgICBjaGFyICoqYXJndmxpc3Q7CisgICAgRVhFQ1ZfQ0hBUiAqKmFyZ3ZsaXN0OwogICAgIGludCBpOwogICAgIFB5X3NzaXplX3QgYXJnYzsKLSAgICBQeV9pbnRwdHJfdCBzcGF3bnZhbDsKKyAgICBpbnRwdHJfdCBzcGF3bnZhbDsKICAgICBQeU9iamVjdCAqKCpnZXRpdGVtKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKIAogICAgIC8qIHNwYXdudiBoYXMgdGhyZWUgYXJndW1lbnRzOiAobW9kZSwgcGF0aCwgYXJndiksIHdoZXJlCiAgICAgICAgYXJndiBpcyBhIGxpc3Qgb3IgdHVwbGUgb2Ygc3RyaW5ncy4gKi8KIAotICAgIHBhdGhfY2hhciA9IFB5Qnl0ZXNfQXNTdHJpbmcocGF0aCk7CiAgICAgaWYgKFB5TGlzdF9DaGVjayhhcmd2KSkgewogICAgICAgICBhcmdjID0gUHlMaXN0X1NpemUoYXJndik7CiAgICAgICAgIGdldGl0ZW0gPSBQeUxpc3RfR2V0SXRlbTsKQEAgLTUxODUsNyArNTAxMCw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGFyZ3ZsaXN0ID0gUHlNZW1fTkVXKGNoYXIgKiwgYXJnYysxKTsKKyAgICBhcmd2bGlzdCA9IFB5TWVtX05FVyhFWEVDVl9DSEFSICosIGFyZ2MrMSk7CiAgICAgaWYgKGFyZ3ZsaXN0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgfQpAQCAtNTIwNSw3ICs1MDMwLDExIEBACiAgICAgICAgIG1vZGUgPSBfUF9PVkVSTEFZOwogCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgIHNwYXdudmFsID0gX3NwYXdudihtb2RlLCBwYXRoX2NoYXIsIGFyZ3ZsaXN0KTsKKyNpZmRlZiBIQVZFX1dTUEFXTlYKKyAgICBzcGF3bnZhbCA9IF93c3Bhd252KG1vZGUsIHBhdGgtPndpZGUsIGFyZ3ZsaXN0KTsKKyNlbHNlCisgICAgc3Bhd252YWwgPSBfc3Bhd252KG1vZGUsIHBhdGgtPm5hcnJvdywgYXJndmxpc3QpOworI2VuZGlmCiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAogICAgIGZyZWVfc3RyaW5nX2FycmF5KGFyZ3ZsaXN0LCBhcmdjKTsKQEAgLTUyMjIsNyArNTA1MSw3IEBACiAKICAgICBtb2RlOiBpbnQKICAgICAgICAgTW9kZSBvZiBwcm9jZXNzIGNyZWF0aW9uLgotICAgIHBhdGg6IEZTQ29udmVydGVyCisgICAgcGF0aDogcGF0aF90CiAgICAgICAgIFBhdGggb2YgZXhlY3V0YWJsZSBmaWxlLgogICAgIGFyZ3Y6IG9iamVjdAogICAgICAgICBUdXBsZSBvciBsaXN0IG9mIHN0cmluZ3MuCkBAIC01MjM0LDE2ICs1MDYzLDE1IEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1vc19zcGF3bnZlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50IG1vZGUsIFB5T2JqZWN0ICpwYXRoLCBQeU9iamVjdCAqYXJndiwKK29zX3NwYXdudmVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnQgbW9kZSwgcGF0aF90ICpwYXRoLCBQeU9iamVjdCAqYXJndiwKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZW52KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWViY2ZhNWY3YmEyZjQyMTkgaW5wdXQ9MDIzNjJmZDkzNzk2M2Y4Zl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTMwZmU4NWJlNTZmZTM3YWQgaW5wdXQ9M2U0MDgwM2VlN2M0YzU4Nl0qLwogewotICAgIGNoYXIgKnBhdGhfY2hhcjsKLSAgICBjaGFyICoqYXJndmxpc3Q7Ci0gICAgY2hhciAqKmVudmxpc3Q7CisgICAgRVhFQ1ZfQ0hBUiAqKmFyZ3ZsaXN0OworICAgIEVYRUNWX0NIQVIgKiplbnZsaXN0OwogICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwogICAgIFB5X3NzaXplX3QgYXJnYywgaSwgZW52YzsKLSAgICBQeV9pbnRwdHJfdCBzcGF3bnZhbDsKKyAgICBpbnRwdHJfdCBzcGF3bnZhbDsKICAgICBQeU9iamVjdCAqKCpnZXRpdGVtKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKICAgICBQeV9zc2l6ZV90IGxhc3RhcmcgPSAwOwogCkBAIC01MjUxLDcgKzUwNzksNiBAQAogICAgICAgIGFyZ3YgaXMgYSBsaXN0IG9yIHR1cGxlIG9mIHN0cmluZ3MgYW5kIGVudiBpcyBhIGRpY3Rpb25hcnkKICAgICAgICBsaWtlIHBvc2l4LmVudmlyb24uICovCiAKLSAgICBwYXRoX2NoYXIgPSBQeUJ5dGVzX0FzU3RyaW5nKHBhdGgpOwogICAgIGlmIChQeUxpc3RfQ2hlY2soYXJndikpIHsKICAgICAgICAgYXJnYyA9IFB5TGlzdF9TaXplKGFyZ3YpOwogICAgICAgICBnZXRpdGVtID0gUHlMaXN0X0dldEl0ZW07CkBAIC01MjcxLDcgKzUwOTgsNyBAQAogICAgICAgICBnb3RvIGZhaWxfMDsKICAgICB9CiAKLSAgICBhcmd2bGlzdCA9IFB5TWVtX05FVyhjaGFyICosIGFyZ2MrMSk7CisgICAgYXJndmxpc3QgPSBQeU1lbV9ORVcoRVhFQ1ZfQ0hBUiAqLCBhcmdjKzEpOwogICAgIGlmIChhcmd2bGlzdCA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIGdvdG8gZmFpbF8wOwpAQCAtNTI5NSw3ICs1MTIyLDExIEBACiAgICAgICAgIG1vZGUgPSBfUF9PVkVSTEFZOwogCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgIHNwYXdudmFsID0gX3NwYXdudmUobW9kZSwgcGF0aF9jaGFyLCBhcmd2bGlzdCwgZW52bGlzdCk7CisjaWZkZWYgSEFWRV9XU1BBV05WCisgICAgc3Bhd252YWwgPSBfd3NwYXdudmUobW9kZSwgcGF0aC0+d2lkZSwgYXJndmxpc3QsIGVudmxpc3QpOworI2Vsc2UKKyAgICBzcGF3bnZhbCA9IF9zcGF3bnZlKG1vZGUsIHBhdGgtPm5hcnJvdywgYXJndmxpc3QsIGVudmxpc3QpOworI2VuZGlmCiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAogICAgIGlmIChzcGF3bnZhbCA9PSAtMSkKQEAgLTU3NTgsMTQgKzU1ODksMTQgQEAKICAgICBwaWQ6IHBpZF90CiAgICAgLwogCi1SZXR1cm4gdGhlIGFmZmluaXR5IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZWQgYnkgcGlkLgorUmV0dXJuIHRoZSBhZmZpbml0eSBvZiB0aGUgcHJvY2VzcyBpZGVudGlmaWVkIGJ5IHBpZCAob3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBpZiB6ZXJvKS4KIAogVGhlIGFmZmluaXR5IGlzIHJldHVybmVkIGFzIGEgc2V0IG9mIENQVSBpZGVudGlmaWVycy4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9zX3NjaGVkX2dldGFmZmluaXR5X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgcGlkX3QgcGlkKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWY3MjZmMmMxOTNjMTdhNGYgaW5wdXQ9ZWFmMTYxOTM2ODc0YjhhMV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWY3MjZmMmMxOTNjMTdhNGYgaW5wdXQ9OTgzY2U3Y2I0YTU2NTk4MF0qLwogewogICAgIGludCBjcHUsIG5jcHVzLCBjb3VudDsKICAgICBzaXplX3Qgc2V0c2l6ZTsKQEAgLTU5MjYsNyArNTc1Nyw3IEBACiAgICAgaWYgKF9QeV9zZXRfaW5oZXJpdGFibGUobWFzdGVyX2ZkLCAwLCBOVUxMKSA8IDApCiAgICAgICAgIGdvdG8gcG9zaXhfZXJyb3I7CiAKLSNpZiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChIQVZFX0RFVl9QVEMpCisjaWYgIWRlZmluZWQoX19DWUdXSU5fXykgJiYgIWRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKEhBVkVfREVWX1BUQykKICAgICBpb2N0bChzbGF2ZV9mZCwgSV9QVVNILCAicHRlbSIpOyAvKiBwdXNoIHB0ZW0gKi8KICAgICBpb2N0bChzbGF2ZV9mZCwgSV9QVVNILCAibGR0ZXJtIik7IC8qIHB1c2ggbGR0ZXJtICovCiAjaWZuZGVmIF9faHB1eApAQCAtNjI1MSw3ICs2MDgyLDcgQEAKIHBvc2l4X2luaXRncm91cHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpvbmFtZTsKLSAgICBjaGFyICp1c2VybmFtZTsKKyAgICBjb25zdCBjaGFyICp1c2VybmFtZTsKICAgICBpbnQgcmVzOwogI2lmZGVmIF9fQVBQTEVfXwogICAgIGludCBnaWQ7CkBAIC02OTk4LDcgKzY4MjksNyBAQAogLyogTVMgQyBoYXMgYSB2YXJpYW50IG9mIHdhaXRwaWQoKSB0aGF0J3MgdXNhYmxlIGZvciBtb3N0IHB1cnBvc2VzLiAqLwogLypbY2xpbmljIGlucHV0XQogb3Mud2FpdHBpZAotICAgIHBpZDogUHlfaW50cHRyX3QKKyAgICBwaWQ6IGludHB0cl90CiAgICAgb3B0aW9uczogaW50CiAgICAgLwogCkBAIC03MDExLDExICs2ODQyLDExIEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1vc193YWl0cGlkX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfaW50cHRyX3QgcGlkLCBpbnQgb3B0aW9ucykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xNWYxY2UwMDVhMzQ2YjA5IGlucHV0PTQ0NGM4ZjUxY2NhNWI4NjJdKi8KK29zX3dhaXRwaWRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnRwdHJfdCBwaWQsIGludCBvcHRpb25zKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJlODM2YjIyMTI3MWQ1MzggaW5wdXQ9NDBmMjQ0MGM1MTU0MTBmOF0qLwogewogICAgIGludCBzdGF0dXM7Ci0gICAgUHlfaW50cHRyX3QgcmVzOworICAgIGludHB0cl90IHJlczsKICAgICBpbnQgYXN5bmNfZXJyID0gMDsKIAogICAgIGRvIHsKQEAgLTcxMjUsMTYgKzY5NTYsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW5fcmVhZGxpbmsoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotICAgIHdjaGFyX3QgKnBhdGg7CisgICAgY29uc3Qgd2NoYXJfdCAqcGF0aDsKICAgICBEV09SRCBuX2J5dGVzX3JldHVybmVkOwogICAgIERXT1JEIGlvX3Jlc3VsdDsKICAgICBQeU9iamVjdCAqcG8sICpyZXN1bHQ7Ci0gICAgICAgIGludCBkaXJfZmQ7CisgICAgaW50IGRpcl9mZDsKICAgICBIQU5ETEUgcmVwYXJzZV9wb2ludF9oYW5kbGU7CiAKLSAgICBjaGFyIHRhcmdldF9idWZmZXJbTUFYSU1VTV9SRVBBUlNFX0RBVEFfQlVGRkVSX1NJWkVdOwotICAgIFJFUEFSU0VfREFUQV9CVUZGRVIgKnJkYiA9IChSRVBBUlNFX0RBVEFfQlVGRkVSICopdGFyZ2V0X2J1ZmZlcjsKLSAgICB3Y2hhcl90ICpwcmludF9uYW1lOworICAgIGNoYXIgdGFyZ2V0X2J1ZmZlcltfUHlfTUFYSU1VTV9SRVBBUlNFX0RBVEFfQlVGRkVSX1NJWkVdOworICAgIF9QeV9SRVBBUlNFX0RBVEFfQlVGRkVSICpyZGIgPSAoX1B5X1JFUEFSU0VfREFUQV9CVUZGRVIgKil0YXJnZXRfYnVmZmVyOworICAgIGNvbnN0IHdjaGFyX3QgKnByaW50X25hbWU7CiAKICAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCBOVUxMfTsKIApAQCAtNzIwMiwyMiArNzAzMywxOSBAQAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykKIAogLyogR3JhYiBDcmVhdGVTeW1ib2xpY0xpbmtXIGR5bmFtaWNhbGx5IGZyb20ga2VybmVsMzIgKi8KLXN0YXRpYyBEV09SRCAoQ0FMTEJBQ0sgKlB5X0NyZWF0ZVN5bWJvbGljTGlua1cpKExQV1NUUiwgTFBXU1RSLCBEV09SRCkgPSBOVUxMOwotc3RhdGljIERXT1JEIChDQUxMQkFDSyAqUHlfQ3JlYXRlU3ltYm9saWNMaW5rQSkoTFBTVFIsIExQU1RSLCBEV09SRCkgPSBOVUxMOworc3RhdGljIERXT1JEIChDQUxMQkFDSyAqUHlfQ3JlYXRlU3ltYm9saWNMaW5rVykoTFBDV1NUUiwgTFBDV1NUUiwgRFdPUkQpID0gTlVMTDsKIAogc3RhdGljIGludAogY2hlY2tfQ3JlYXRlU3ltYm9saWNMaW5rKHZvaWQpCiB7CiAgICAgSElOU1RBTkNFIGhLZXJuZWwzMjsKICAgICAvKiBvbmx5IHJlY2hlY2sgKi8KLSAgICBpZiAoUHlfQ3JlYXRlU3ltYm9saWNMaW5rVyAmJiBQeV9DcmVhdGVTeW1ib2xpY0xpbmtBKQorICAgIGlmIChQeV9DcmVhdGVTeW1ib2xpY0xpbmtXKQogICAgICAgICByZXR1cm4gMTsKICAgICBoS2VybmVsMzIgPSBHZXRNb2R1bGVIYW5kbGVXKEwiS0VSTkVMMzIiKTsKICAgICAqKEZBUlBST0MqKSZQeV9DcmVhdGVTeW1ib2xpY0xpbmtXID0gR2V0UHJvY0FkZHJlc3MoaEtlcm5lbDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRlU3ltYm9saWNMaW5rVyIpOwotICAgICooRkFSUFJPQyopJlB5X0NyZWF0ZVN5bWJvbGljTGlua0EgPSBHZXRQcm9jQWRkcmVzcyhoS2VybmVsMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGVTeW1ib2xpY0xpbmtBIik7Ci0gICAgcmV0dXJuIChQeV9DcmVhdGVTeW1ib2xpY0xpbmtXICYmIFB5X0NyZWF0ZVN5bWJvbGljTGlua0EpOworICAgIHJldHVybiBQeV9DcmVhdGVTeW1ib2xpY0xpbmtXICE9IE5VTEw7CiB9CiAKIC8qIFJlbW92ZSB0aGUgbGFzdCBwb3J0aW9uIG9mIHRoZSBwYXRoICovCkBAIC03MjM0LDIwICs3MDYyLDYgQEAKICAgICAqcHRyID0gMDsKIH0KIAotLyogUmVtb3ZlIHRoZSBsYXN0IHBvcnRpb24gb2YgdGhlIHBhdGggKi8KLXN0YXRpYyB2b2lkCi1fZGlybmFtZUEoY2hhciAqcGF0aCkKLXsKLSAgICBjaGFyICpwdHI7Ci0KLSAgICAvKiB3YWxrIHRoZSBwYXRoIGZyb20gdGhlIGVuZCB1bnRpbCBhIGJhY2tzbGFzaCBpcyBlbmNvdW50ZXJlZCAqLwotICAgIGZvcihwdHIgPSBwYXRoICsgc3RybGVuKHBhdGgpOyBwdHIgIT0gcGF0aDsgcHRyLS0pIHsKLSAgICAgICAgaWYgKCpwdHIgPT0gJ1xcJyB8fCAqcHRyID09ICcvJykKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAqcHRyID0gMDsKLX0KLQogLyogSXMgdGhpcyBwYXRoIGFic29sdXRlPyAqLwogc3RhdGljIGludAogX2lzX2Fic1coY29uc3QgV0NIQVIgKnBhdGgpCkBAIC03MjU2LDE0ICs3MDcwLDYgQEAKIAogfQogCi0vKiBJcyB0aGlzIHBhdGggYWJzb2x1dGU/ICovCi1zdGF0aWMgaW50Ci1faXNfYWJzQShjb25zdCBjaGFyICpwYXRoKQotewotICAgIHJldHVybiBwYXRoWzBdID09ICdcXCcgfHwgcGF0aFswXSA9PSAnLycgfHwgcGF0aFsxXSA9PSAnOic7Ci0KLX0KLQogLyogam9pbiByb290IGFuZCByZXN0IHdpdGggYSBiYWNrc2xhc2ggKi8KIHN0YXRpYyB2b2lkCiBfam9pblcoV0NIQVIgKmRlc3RfcGF0aCwgY29uc3QgV0NIQVIgKnJvb3QsIGNvbnN0IFdDSEFSICpyZXN0KQpAQCAtNzI4NSwzMCArNzA5MSw5IEBACiAgICAgd2NzY3B5KGRlc3RfcGF0aCtyb290X2xlbiwgcmVzdCk7CiB9CiAKLS8qIGpvaW4gcm9vdCBhbmQgcmVzdCB3aXRoIGEgYmFja3NsYXNoICovCi1zdGF0aWMgdm9pZAotX2pvaW5BKGNoYXIgKmRlc3RfcGF0aCwgY29uc3QgY2hhciAqcm9vdCwgY29uc3QgY2hhciAqcmVzdCkKLXsKLSAgICBzaXplX3Qgcm9vdF9sZW47Ci0KLSAgICBpZiAoX2lzX2Fic0EocmVzdCkpIHsKLSAgICAgICAgc3RyY3B5KGRlc3RfcGF0aCwgcmVzdCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByb290X2xlbiA9IHN0cmxlbihyb290KTsKLQotICAgIHN0cmNweShkZXN0X3BhdGgsIHJvb3QpOwotICAgIGlmKHJvb3RfbGVuKSB7Ci0gICAgICAgIGRlc3RfcGF0aFtyb290X2xlbl0gPSAnXFwnOwotICAgICAgICByb290X2xlbisrOwotICAgIH0KLSAgICBzdHJjcHkoZGVzdF9wYXRoK3Jvb3RfbGVuLCByZXN0KTsKLX0KLQogLyogUmV0dXJuIFRydWUgaWYgdGhlIHBhdGggYXQgc3JjIHJlbGF0aXZlIHRvIGRlc3QgaXMgYSBkaXJlY3RvcnkgKi8KIHN0YXRpYyBpbnQKLV9jaGVja19kaXJXKFdDSEFSICpzcmMsIFdDSEFSICpkZXN0KQorX2NoZWNrX2RpclcoTFBDV1NUUiBzcmMsIExQQ1dTVFIgZGVzdCkKIHsKICAgICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIHNyY19pbmZvOwogICAgIFdDSEFSIGRlc3RfcGFyZW50W01BWF9QQVRIXTsKQEAgLTczMjQsMjUgKzcxMDksNiBAQAogICAgICAgICAmJiBzcmNfaW5mby5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZCiAgICAgKTsKIH0KLQotLyogUmV0dXJuIFRydWUgaWYgdGhlIHBhdGggYXQgc3JjIHJlbGF0aXZlIHRvIGRlc3QgaXMgYSBkaXJlY3RvcnkgKi8KLXN0YXRpYyBpbnQKLV9jaGVja19kaXJBKGNoYXIgKnNyYywgY2hhciAqZGVzdCkKLXsKLSAgICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIHNyY19pbmZvOwotICAgIGNoYXIgZGVzdF9wYXJlbnRbTUFYX1BBVEhdOwotICAgIGNoYXIgc3JjX3Jlc29sdmVkW01BWF9QQVRIXSA9ICIiOwotCi0gICAgLyogZGVzdF9wYXJlbnQgPSBvcy5wYXRoLmRpcm5hbWUoZGVzdCkgKi8KLSAgICBzdHJjcHkoZGVzdF9wYXJlbnQsIGRlc3QpOwotICAgIF9kaXJuYW1lQShkZXN0X3BhcmVudCk7Ci0gICAgLyogc3JjX3Jlc29sdmVkID0gb3MucGF0aC5qb2luKGRlc3RfcGFyZW50LCBzcmMpICovCi0gICAgX2pvaW5BKHNyY19yZXNvbHZlZCwgZGVzdF9wYXJlbnQsIHNyYyk7Ci0gICAgcmV0dXJuICgKLSAgICAgICAgR2V0RmlsZUF0dHJpYnV0ZXNFeEEoc3JjX3Jlc29sdmVkLCBHZXRGaWxlRXhJbmZvU3RhbmRhcmQsICZzcmNfaW5mbykKLSAgICAgICAgJiYgc3JjX2luZm8uZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWQotICAgICk7Ci19CiAjZW5kaWYKIAogCkBAIC03NDAyLDE4ICs3MTY4LDEwIEBACiAjaWZkZWYgTVNfV0lORE9XUwogCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgIGlmIChkc3QtPndpZGUpIHsKLSAgICAgICAgLyogaWYgc3JjIGlzIGEgZGlyZWN0b3J5LCBlbnN1cmUgdGFyZ2V0X2lzX2RpcmVjdG9yeT09MSAqLwotICAgICAgICB0YXJnZXRfaXNfZGlyZWN0b3J5IHw9IF9jaGVja19kaXJXKHNyYy0+d2lkZSwgZHN0LT53aWRlKTsKLSAgICAgICAgcmVzdWx0ID0gUHlfQ3JlYXRlU3ltYm9saWNMaW5rVyhkc3QtPndpZGUsIHNyYy0+d2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaXNfZGlyZWN0b3J5KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGlmIHNyYyBpcyBhIGRpcmVjdG9yeSwgZW5zdXJlIHRhcmdldF9pc19kaXJlY3Rvcnk9PTEgKi8KLSAgICAgICAgdGFyZ2V0X2lzX2RpcmVjdG9yeSB8PSBfY2hlY2tfZGlyQShzcmMtPm5hcnJvdywgZHN0LT5uYXJyb3cpOwotICAgICAgICByZXN1bHQgPSBQeV9DcmVhdGVTeW1ib2xpY0xpbmtBKGRzdC0+bmFycm93LCBzcmMtPm5hcnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaXNfZGlyZWN0b3J5KTsKLSAgICB9CisgICAgLyogaWYgc3JjIGlzIGEgZGlyZWN0b3J5LCBlbnN1cmUgdGFyZ2V0X2lzX2RpcmVjdG9yeT09MSAqLworICAgIHRhcmdldF9pc19kaXJlY3RvcnkgfD0gX2NoZWNrX2Rpclcoc3JjLT53aWRlLCBkc3QtPndpZGUpOworICAgIHJlc3VsdCA9IFB5X0NyZWF0ZVN5bWJvbGljTGlua1coZHN0LT53aWRlLCBzcmMtPndpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaXNfZGlyZWN0b3J5KTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCiAgICAgaWYgKCFyZXN1bHQpCkBAIC03NzE4LDE2ICs3NDc2LDE1IEBACiAgICAgZG8gewogICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAjaWZkZWYgTVNfV0lORE9XUwotICAgICAgICBpZiAocGF0aC0+d2lkZSkKLSAgICAgICAgICAgIGZkID0gX3dvcGVuKHBhdGgtPndpZGUsIGZsYWdzLCBtb2RlKTsKLSAgICAgICAgZWxzZQotI2VuZGlmCisgICAgICAgIGZkID0gX3dvcGVuKHBhdGgtPndpZGUsIGZsYWdzLCBtb2RlKTsKKyNlbHNlCiAjaWZkZWYgSEFWRV9PUEVOQVQKICAgICAgICAgaWYgKGRpcl9mZCAhPSBERUZBVUxUX0RJUl9GRCkKICAgICAgICAgICAgIGZkID0gb3BlbmF0KGRpcl9mZCwgcGF0aC0+bmFycm93LCBmbGFncywgbW9kZSk7CiAgICAgICAgIGVsc2UKLSNlbmRpZgorI2VuZGlmIC8qIEhBVkVfT1BFTkFUICovCiAgICAgICAgICAgICBmZCA9IG9wZW4ocGF0aC0+bmFycm93LCBmbGFncywgbW9kZSk7CisjZW5kaWYgLyogIU1TX1dJTkRPV1MgKi8KICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICB9IHdoaWxlIChmZCA8IDAgJiYgZXJybm8gPT0gRUlOVFIgJiYgIShhc3luY19lcnIgPSBQeUVycl9DaGVja1NpZ25hbHMoKSkpOwogICAgIF9QeV9FTkRfU1VQUFJFU1NfSVBICkBAIC03NzYyLDggKzc1MTksNiBAQAogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJmZTRlOTM2MDI4MjJjMTQgaW5wdXQ9MmJjNDI0NTFjYTVjMzIyM10qLwogewogICAgIGludCByZXM7Ci0gICAgaWYgKCFfUHlWZXJpZnlfZmQoZmQpKQotICAgICAgICByZXR1cm4gcG9zaXhfZXJyb3IoKTsKICAgICAvKiBXZSBkbyBub3Qgd2FudCB0byByZXRyeSB1cG9uIEVJTlRSOiBzZWUgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvNTc2NDc4LwogICAgICAqIGFuZCBodHRwOi8vbGludXguZGVya2VpbGVyLmNvbS9NYWlsaW5nLUxpc3RzL0tlcm5lbC8yMDA1LTA5LzMwMDAuaHRtbAogICAgICAqIGZvciBtb3JlIGRldGFpbHMuCkBAIC03Nzk2LDkgKzc1NTEsOCBAQAogICAgIGludCBpOwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICBfUHlfQkVHSU5fU1VQUFJFU1NfSVBICi0gICAgZm9yIChpID0gZmRfbG93OyBpIDwgZmRfaGlnaDsgaSsrKQotICAgICAgICBpZiAoX1B5VmVyaWZ5X2ZkKGkpKQotICAgICAgICAgICAgY2xvc2UoaSk7CisgICAgZm9yIChpID0gUHlfTUFYKGZkX2xvdywgMCk7IGkgPCBmZF9oaWdoOyBpKyspCisgICAgICAgIGNsb3NlKGkpOwogICAgIF9QeV9FTkRfU1VQUFJFU1NfSVBICiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICBQeV9SRVRVUk5fTk9ORTsKQEAgLTc4NDIsNyArNzU5Niw3IEBACiAgICAgaW50IGR1cDNfd29ya3MgPSAtMTsKICNlbmRpZgogCi0gICAgaWYgKCFfUHlWZXJpZnlfZmRfZHVwMihmZCwgZmQyKSkKKyAgICBpZiAoZmQgPCAwIHx8IGZkMiA8IDApCiAgICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOwogCiAgICAgLyogZHVwMigpIGNhbiBmYWlsIHdpdGggRUlOVFIgaWYgdGhlIHRhcmdldCBGRCBpcyBhbHJlYWR5IG9wZW4sIGJlY2F1c2UgaXQKQEAgLTc5NjYsMTAgKzc3MjAsNiBAQAogewogICAgIFB5X29mZl90IHJlc3VsdDsKIAotICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkKSkgewotICAgICAgICBwb3NpeF9lcnJvcigpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQogI2lmZGVmIFNFRUtfU0VUCiAgICAgLyogVHVybiAwLCAxLCAyIGludG8gU0VFS197U0VULENVUixFTkR9ICovCiAgICAgc3dpdGNoIChob3cpIHsKQEAgLTc5ODIsMTAgKzc3MzIsNiBAQAogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpIHsKLSAgICAgICAgcG9zaXhfZXJyb3IoKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAogI2lmZGVmIE1TX1dJTkRPV1MKQEAgLTgxOTMsMTAgKzc5MzksNiBAQAogICAgIGJ1ZmZlciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBsZW5ndGgpOwogICAgIGlmIChidWZmZXIgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfUHlWZXJpZnlfZmQoZmQpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihidWZmZXIpOwotICAgICAgICByZXR1cm4gcG9zaXhfZXJyb3IoKTsKLSAgICB9CiAKICAgICBkbyB7CiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKQEAgLTgzNTksNyArODEwMSw3IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LCAiaWlPbjpzZW5kZmlsZSIsCiAgICAgICAgICAgICBrZXl3b3JkcywgJm91dCwgJmluLCAmb2Zmb2JqLCAmY291bnQpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSNpZmRlZiBsaW51eAorI2lmZGVmIF9fbGludXhfXwogICAgIGlmIChvZmZvYmogPT0gUHlfTm9uZSkgewogICAgICAgICBkbyB7CiAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCkBAIC04NDM5LDggKzgxODEsNiBAQAogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTZhNDhjOGI0ZTY0NGNhMDAgaW5wdXQ9MDhjZTk0YWExZWFmN2I1ZV0qLwogewogICAgIGludCByZXR1cm5fdmFsdWU7Ci0gICAgaWYgKCFfUHlWZXJpZnlfZmQoZmQpKQotICAgICAgICByZXR1cm4gMDsKICAgICBfUHlfQkVHSU5fU1VQUFJFU1NfSVBICiAgICAgcmV0dXJuX3ZhbHVlID0gaXNhdHR5KGZkKTsKICAgICBfUHlfRU5EX1NVUFBSRVNTX0lQSApAQCAtODQ3OSw4ICs4MjE5LDggQEAKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgb2sgPSBDcmVhdGVQaXBlKCZyZWFkLCAmd3JpdGUsICZhdHRyLCAwKTsKICAgICBpZiAob2spIHsKLSAgICAgICAgZmRzWzBdID0gX29wZW5fb3NmaGFuZGxlKChQeV9pbnRwdHJfdClyZWFkLCBfT19SRE9OTFkpOwotICAgICAgICBmZHNbMV0gPSBfb3Blbl9vc2ZoYW5kbGUoKFB5X2ludHB0cl90KXdyaXRlLCBfT19XUk9OTFkpOworICAgICAgICBmZHNbMF0gPSBfb3Blbl9vc2ZoYW5kbGUoKGludHB0cl90KXJlYWQsIF9PX1JET05MWSk7CisgICAgICAgIGZkc1sxXSA9IF9vcGVuX29zZmhhbmRsZSgoaW50cHRyX3Qpd3JpdGUsIF9PX1dST05MWSk7CiAgICAgICAgIGlmIChmZHNbMF0gPT0gLTEgfHwgZmRzWzFdID09IC0xKSB7CiAgICAgICAgICAgICBDbG9zZUhhbmRsZShyZWFkKTsKICAgICAgICAgICAgIENsb3NlSGFuZGxlKHdyaXRlKTsKQEAgLTg2MzIsMTEgKzgzNzIsNiBAQAogICAgIFB5X3NzaXplX3Qgc2l6ZTsKICAgICBpbnQgYXN5bmNfZXJyID0gMDsKIAotICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkKSkgewotICAgICAgICBwb3NpeF9lcnJvcigpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCiAgICAgZG8gewogICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgIF9QeV9CRUdJTl9TVVBQUkVTU19JUEgKQEAgLTg4MTksOSArODU1NCw2IEBACiAgICAgaW50IHJlc3VsdDsKICAgICBpbnQgYXN5bmNfZXJyID0gMDsKIAotICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkKSkKLSAgICAgICAgcmV0dXJuIHBvc2l4X2Vycm9yKCk7Ci0KICAgICBkbyB7CiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSApAQCAtODg2OCwxMCArODYwMCw3IEBACiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgIF9QeV9CRUdJTl9TVVBQUkVTU19JUEgKICNpZmRlZiBNU19XSU5ET1dTCi0gICAgaWYgKHBhdGgtPndpZGUpCi0gICAgICAgIGZkID0gX3dvcGVuKHBhdGgtPndpZGUsIF9PX1dST05MWSB8IF9PX0JJTkFSWSB8IF9PX05PSU5IRVJJVCk7Ci0gICAgZWxzZQotICAgICAgICBmZCA9IF9vcGVuKHBhdGgtPm5hcnJvdywgX09fV1JPTkxZIHwgX09fQklOQVJZIHwgX09fTk9JTkhFUklUKTsKKyAgICBmZCA9IF93b3BlbihwYXRoLT53aWRlLCBfT19XUk9OTFkgfCBfT19CSU5BUlkgfCBfT19OT0lOSEVSSVQpOwogICAgIGlmIChmZCA8IDApCiAgICAgICAgIHJlc3VsdCA9IC0xOwogICAgIGVsc2UgewpAQCAtOTAxNSw3ICs4NzQ0LDcgQEAKIG9zX3B1dGVudl9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdmFsdWUpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDI5YTU2N2Q2YjIzMjdkMiBpbnB1dD1iYTU4NjU4MWMyZTYxMDVmXSovCiB7Ci0gICAgd2NoYXJfdCAqZW52OworICAgIGNvbnN0IHdjaGFyX3QgKmVudjsKIAogICAgIFB5T2JqZWN0ICp1bmljb2RlID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiVVPSVVIiwgbmFtZSwgdmFsdWUpOwogICAgIGlmICh1bmljb2RlID09IE5VTEwpIHsKQEAgLTkwNjEsOCArODc5MCw4IEBACiB7CiAgICAgUHlPYmplY3QgKmJ5dGVzID0gTlVMTDsKICAgICBjaGFyICplbnY7Ci0gICAgY2hhciAqbmFtZV9zdHJpbmcgPSBQeUJ5dGVzX0FzU3RyaW5nKG5hbWUpOwotICAgIGNoYXIgKnZhbHVlX3N0cmluZyA9IFB5Qnl0ZXNfQXNTdHJpbmcodmFsdWUpOworICAgIGNvbnN0IGNoYXIgKm5hbWVfc3RyaW5nID0gUHlCeXRlc19Bc1N0cmluZyhuYW1lKTsKKyAgICBjb25zdCBjaGFyICp2YWx1ZV9zdHJpbmcgPSBQeUJ5dGVzX0FzU3RyaW5nKHZhbHVlKTsKIAogICAgIGJ5dGVzID0gUHlCeXRlc19Gcm9tRm9ybWF0KCIlcz0lcyIsIG5hbWVfc3RyaW5nLCB2YWx1ZV9zdHJpbmcpOwogICAgIGlmIChieXRlcyA9PSBOVUxMKSB7CkBAIC05MzQwLDE3ICs5MDY5LDE3IEBACiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAwLCBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpIHN0LmZfYnNpemUpKTsKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDEsIFB5TG9uZ19Gcm9tTG9uZygobG9uZykgc3QuZl9mcnNpemUpKTsKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpIHN0LmZfYmxvY2tzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIHN0LmZfYmxvY2tzKSk7CiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKSBzdC5mX2JmcmVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIHN0LmZfYmZyZWUpKTsKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpIHN0LmZfYmF2YWlsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIHN0LmZfYmF2YWlsKSk7CiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKSBzdC5mX2ZpbGVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIHN0LmZfZmlsZXMpKTsKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpIHN0LmZfZmZyZWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgc3QuZl9mZnJlZSkpOwogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORykgc3QuZl9mYXZhaWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgc3QuZl9mYXZhaWwpKTsKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDgsIFB5TG9uZ19Gcm9tTG9uZygobG9uZykgc3QuZl9mbGFnKSk7CiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA5LCBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpIHN0LmZfbmFtZW1heCkpOwogI2VuZGlmCkBAIC05NDgxLDggKzkyMTAsOCBAQAogICogc3VmZmljaWVudGx5IHBlcnZhc2l2ZSB0aGF0IGl0J3Mgbm90IHdvcnRoIHRoZSBsb3NzIG9mIHJlYWRhYmlsaXR5LgogICovCiBzdHJ1Y3QgY29uc3RkZWYgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgbG9uZyB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCB2YWx1ZTsKIH07CiAKIHN0YXRpYyBpbnQKQEAgLTk0OTAsNyArOTIxOSwxMCBAQAogICAgICAgICAgICAgICBzaXplX3QgdGFibGVzaXplKQogewogICAgIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkgewotICAgICAgICAqdmFsdWVwID0gUHlMb25nX0FTX0xPTkcoYXJnKTsKKyAgICAgICAgaW50IHZhbHVlID0gX1B5TG9uZ19Bc0ludChhcmcpOworICAgICAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAqdmFsdWVwID0gdmFsdWU7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgICBlbHNlIHsKQEAgLTEwNDUxLDcgKzEwMTgzLDcgQEAKIAogc3RhdGljIGludAogc2V0dXBfY29uZm5hbWVfdGFibGUoc3RydWN0IGNvbnN0ZGVmICp0YWJsZSwgc2l6ZV90IHRhYmxlc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnRhYmxlbmFtZSwgUHlPYmplY3QgKm1vZHVsZSkKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgUHlPYmplY3QgKm1vZHVsZSkKIHsKICAgICBQeU9iamVjdCAqZCA9IE5VTEw7CiAgICAgc2l6ZV90IGk7CkBAIC0xMDUyMiwzMSArMTAyNTQsOCBAQAogfQogCiAjaWZkZWYgTVNfV0lORE9XUwotLyogQUMgMy41OiBjaGFuZ2UgdG8gcGF0aF90PyBidXQgdGhhdCBtaWdodCBjaGFuZ2UgZXhjZXB0aW9ucyAqLwotUHlEb2NfU1RSVkFSKHdpbjMyX3N0YXJ0ZmlsZV9fZG9jX18sCi0ic3RhcnRmaWxlKGZpbGVwYXRoIFssIG9wZXJhdGlvbl0pXG5cCi1cblwKLVN0YXJ0IGEgZmlsZSB3aXRoIGl0cyBhc3NvY2lhdGVkIGFwcGxpY2F0aW9uLlxuXAotXG5cCi1XaGVuIFwib3BlcmF0aW9uXCIgaXMgbm90IHNwZWNpZmllZCBvciBcIm9wZW5cIiwgdGhpcyBhY3RzIGxpa2VcblwKLWRvdWJsZS1jbGlja2luZyB0aGUgZmlsZSBpbiBFeHBsb3Jlciwgb3IgZ2l2aW5nIHRoZSBmaWxlIG5hbWUgYXMgYW5cblwKLWFyZ3VtZW50IHRvIHRoZSBET1MgXCJzdGFydFwiIGNvbW1hbmQ6IHRoZSBmaWxlIGlzIG9wZW5lZCB3aXRoIHdoYXRldmVyXG5cCi1hcHBsaWNhdGlvbiAoaWYgYW55KSBpdHMgZXh0ZW5zaW9uIGlzIGFzc29jaWF0ZWQuXG5cCi1XaGVuIGFub3RoZXIgXCJvcGVyYXRpb25cIiBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHdoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aFxuXAotdGhlIGZpbGUuICBBIHR5cGljYWwgb3BlcmF0aW9uIGlzIFwicHJpbnRcIi5cblwKLVxuXAotc3RhcnRmaWxlIHJldHVybnMgYXMgc29vbiBhcyB0aGUgYXNzb2NpYXRlZCBhcHBsaWNhdGlvbiBpcyBsYXVuY2hlZC5cblwKLVRoZXJlIGlzIG5vIG9wdGlvbiB0byB3YWl0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gY2xvc2UsIGFuZCBubyB3YXlcblwKLXRvIHJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbidzIGV4aXQgc3RhdHVzLlxuXAotXG5cCi1UaGUgZmlsZXBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgSWYgeW91IHdhbnQgdG8gdXNlXG5cCi1hbiBhYnNvbHV0ZSBwYXRoLCBtYWtlIHN1cmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBub3QgYSBzbGFzaCAoXCIvXCIpO1xuXAotdGhlIHVuZGVybHlpbmcgV2luMzIgU2hlbGxFeGVjdXRlIGZ1bmN0aW9uIGRvZXNuJ3Qgd29yayBpZiBpdCBpcy4iKTsKLQogLyogR3JhYiBTaGVsbEV4ZWN1dGUgZHluYW1pY2FsbHkgZnJvbSBzaGVsbDMyICovCiBzdGF0aWMgaW50IGhhc19TaGVsbEV4ZWN1dGUgPSAtMTsKLXN0YXRpYyBISU5TVEFOQ0UgKENBTExCQUNLICpQeV9TaGVsbEV4ZWN1dGVBKShIV05ELCBMUENTVFIsIExQQ1NUUiwgTFBDU1RSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiwgSU5UKTsKIHN0YXRpYyBISU5TVEFOQ0UgKENBTExCQUNLICpQeV9TaGVsbEV4ZWN1dGVXKShIV05ELCBMUENXU1RSLCBMUENXU1RSLCBMUENXU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIsIElOVCk7CiBzdGF0aWMgaW50CkBAIC0xMDU2MCwxMiArMTAyNjksOSBAQAogICAgICAgICBoU2hlbGwzMiA9IExvYWRMaWJyYXJ5VyhMIlNIRUxMMzIiKTsKICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICAgaWYgKGhTaGVsbDMyKSB7Ci0gICAgICAgICAgICAqKEZBUlBST0MqKSZQeV9TaGVsbEV4ZWN1dGVBID0gR2V0UHJvY0FkZHJlc3MoaFNoZWxsMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaGVsbEV4ZWN1dGVBIik7CiAgICAgICAgICAgICAqKEZBUlBST0MqKSZQeV9TaGVsbEV4ZWN1dGVXID0gR2V0UHJvY0FkZHJlc3MoaFNoZWxsMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaGVsbEV4ZWN1dGVXIik7Ci0gICAgICAgICAgICBoYXNfU2hlbGxFeGVjdXRlID0gUHlfU2hlbGxFeGVjdXRlQSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1NoZWxsRXhlY3V0ZVc7CisgICAgICAgICAgICBoYXNfU2hlbGxFeGVjdXRlID0gUHlfU2hlbGxFeGVjdXRlVyAhPSBOVUxMOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaGFzX1NoZWxsRXhlY3V0ZSA9IDA7CiAgICAgICAgIH0KQEAgLTEwNTc0LDE2ICsxMDI4MCwzNiBAQAogfQogCiAKLXN0YXRpYyBQeU9iamVjdCAqCi13aW4zMl9zdGFydGZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotICAgIFB5T2JqZWN0ICpvZmlsZXBhdGg7Ci0gICAgY2hhciAqZmlsZXBhdGg7Ci0gICAgY2hhciAqb3BlcmF0aW9uID0gTlVMTDsKLSAgICB3Y2hhcl90ICp3cGF0aCwgKndvcGVyYXRpb247Ci0gICAgSElOU1RBTkNFIHJjOworLypbY2xpbmljIGlucHV0XQorb3Muc3RhcnRmaWxlCisgICAgZmlsZXBhdGg6IHBhdGhfdAorICAgIG9wZXJhdGlvbjogUHlfVU5JQ09ERSA9IE5VTEwKIAotICAgIFB5T2JqZWN0ICp1bmlwYXRoLCAqdW9wZXJhdGlvbiA9IE5VTEw7CitzdGFydGZpbGUoZmlsZXBhdGggWywgb3BlcmF0aW9uXSkKKworU3RhcnQgYSBmaWxlIHdpdGggaXRzIGFzc29jaWF0ZWQgYXBwbGljYXRpb24uCisKK1doZW4gIm9wZXJhdGlvbiIgaXMgbm90IHNwZWNpZmllZCBvciAib3BlbiIsIHRoaXMgYWN0cyBsaWtlCitkb3VibGUtY2xpY2tpbmcgdGhlIGZpbGUgaW4gRXhwbG9yZXIsIG9yIGdpdmluZyB0aGUgZmlsZSBuYW1lIGFzIGFuCithcmd1bWVudCB0byB0aGUgRE9TICJzdGFydCIgY29tbWFuZDogdGhlIGZpbGUgaXMgb3BlbmVkIHdpdGggd2hhdGV2ZXIKK2FwcGxpY2F0aW9uIChpZiBhbnkpIGl0cyBleHRlbnNpb24gaXMgYXNzb2NpYXRlZC4KK1doZW4gYW5vdGhlciAib3BlcmF0aW9uIiBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHdoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aAordGhlIGZpbGUuICBBIHR5cGljYWwgb3BlcmF0aW9uIGlzICJwcmludCIuCisKK3N0YXJ0ZmlsZSByZXR1cm5zIGFzIHNvb24gYXMgdGhlIGFzc29jaWF0ZWQgYXBwbGljYXRpb24gaXMgbGF1bmNoZWQuCitUaGVyZSBpcyBubyBvcHRpb24gdG8gd2FpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIGNsb3NlLCBhbmQgbm8gd2F5Cit0byByZXRyaWV2ZSB0aGUgYXBwbGljYXRpb24ncyBleGl0IHN0YXR1cy4KKworVGhlIGZpbGVwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIElmIHlvdSB3YW50IHRvIHVzZQorYW4gYWJzb2x1dGUgcGF0aCwgbWFrZSBzdXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgbm90IGEgc2xhc2ggKCIvIik7Cit0aGUgdW5kZXJseWluZyBXaW4zMiBTaGVsbEV4ZWN1dGUgZnVuY3Rpb24gZG9lc24ndCB3b3JrIGlmIGl0IGlzLgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorb3Nfc3RhcnRmaWxlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgcGF0aF90ICpmaWxlcGF0aCwgUHlfVU5JQ09ERSAqb3BlcmF0aW9uKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTkxMmNlYmE3OWFjZmExYzkgaW5wdXQ9NjM5NTBiZjI5ODYzODBkMF0qLworeworICAgIEhJTlNUQU5DRSByYzsKIAogICAgIGlmKCFjaGVja19TaGVsbEV4ZWN1dGUoKSkgewogICAgICAgICAvKiBJZiB0aGUgT1MgZG9lc24ndCBoYXZlIFNoZWxsRXhlY3V0ZSwgcmV0dXJuIGEKQEAgLTEwNTkyLDY4ICsxMDMxOCwxNiBAQAogICAgICAgICAgICAgInN0YXJ0ZmlsZSBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0iKTsKICAgICB9CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8czpzdGFydGZpbGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5pcGF0aCwgJm9wZXJhdGlvbikpIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgZ290byBub3JtYWw7Ci0gICAgfQotCi0gICAgaWYgKG9wZXJhdGlvbikgewotICAgICAgICB1b3BlcmF0aW9uID0gUHlVbmljb2RlX0RlY29kZUFTQ0lJKG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4ob3BlcmF0aW9uKSwgTlVMTCk7Ci0gICAgICAgIGlmICghdW9wZXJhdGlvbikgewotICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbiA9IE5VTEw7Ci0gICAgICAgICAgICBnb3RvIG5vcm1hbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdwYXRoID0gUHlVbmljb2RlX0FzVW5pY29kZSh1bmlwYXRoKTsKLSAgICBpZiAod3BhdGggPT0gTlVMTCkKLSAgICAgICAgZ290byBub3JtYWw7Ci0gICAgaWYgKHVvcGVyYXRpb24pIHsKLSAgICAgICAgd29wZXJhdGlvbiA9IFB5VW5pY29kZV9Bc1VuaWNvZGUodW9wZXJhdGlvbik7Ci0gICAgICAgIGlmICh3b3BlcmF0aW9uID09IE5VTEwpCi0gICAgICAgICAgICBnb3RvIG5vcm1hbDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICB3b3BlcmF0aW9uID0gTlVMTDsKLQogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICByYyA9IFB5X1NoZWxsRXhlY3V0ZVcoKEhXTkQpMCwgd29wZXJhdGlvbiwgd3BhdGgsCisgICAgcmMgPSBQeV9TaGVsbEV4ZWN1dGVXKChIV05EKTAsIG9wZXJhdGlvbiwgZmlsZXBhdGgtPndpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIFNXX1NIT1dOT1JNQUwpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLSAgICBQeV9YREVDUkVGKHVvcGVyYXRpb24pOwogICAgIGlmIChyYyA8PSAoSElOU1RBTkNFKTMyKSB7Ci0gICAgICAgIHdpbjMyX2Vycm9yX29iamVjdCgic3RhcnRmaWxlIiwgdW5pcGF0aCk7CisgICAgICAgIHdpbjMyX2Vycm9yX29iamVjdCgic3RhcnRmaWxlIiwgZmlsZXBhdGgtPm9iamVjdCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7Ci0KLW5vcm1hbDoKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfHM6c3RhcnRmaWxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmb2ZpbGVwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BlcmF0aW9uKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHdpbjMyX3dhcm5fYnl0ZXNfYXBpKCkpIHsKLSAgICAgICAgUHlfREVDUkVGKG9maWxlcGF0aCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBmaWxlcGF0aCA9IFB5Qnl0ZXNfQXNTdHJpbmcob2ZpbGVwYXRoKTsKLSAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgcmMgPSBQeV9TaGVsbEV4ZWN1dGVBKChIV05EKTAsIG9wZXJhdGlvbiwgZmlsZXBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIFNXX1NIT1dOT1JNQUwpOwotICAgIFB5X0VORF9BTExPV19USFJFQURTCi0gICAgaWYgKHJjIDw9IChISU5TVEFOQ0UpMzIpIHsKLSAgICAgICAgUHlPYmplY3QgKmVycnZhbCA9IHdpbjMyX2Vycm9yKCJzdGFydGZpbGUiLCBmaWxlcGF0aCk7Ci0gICAgICAgIFB5X0RFQ1JFRihvZmlsZXBhdGgpOwotICAgICAgICByZXR1cm4gZXJydmFsOwotICAgIH0KLSAgICBQeV9ERUNSRUYob2ZpbGVwYXRoKTsKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCkBAIC0xMDgyMSw3ICsxMDQ5NSw3IEBACiAgICAgZm9yIChpID0gMDsgOyBpKyspIHsKICAgICAgICAgdm9pZCAqcHRyOwogICAgICAgICBzc2l6ZV90IHJlc3VsdDsKLSAgICAgICAgc3RhdGljIFB5X3NzaXplX3QgYnVmZmVyX3NpemVzW10gPSB7MTI4LCBYQVRUUl9TSVpFX01BWCwgMH07CisgICAgICAgIHN0YXRpYyBjb25zdCBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplc1tdID0gezEyOCwgWEFUVFJfU0laRV9NQVgsIDB9OwogICAgICAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemVzW2ldOwogICAgICAgICBpZiAoIWJ1ZmZlcl9zaXplKSB7CiAgICAgICAgICAgICBwYXRoX2Vycm9yKHBhdGgpOwpAQCAtMTA5ODUsOSArMTA2NTksOSBAQAogICAgIG5hbWUgPSBwYXRoLT5uYXJyb3cgPyBwYXRoLT5uYXJyb3cgOiAiLiI7CiAKICAgICBmb3IgKGkgPSAwOyA7IGkrKykgewotICAgICAgICBjaGFyICpzdGFydCwgKnRyYWNlLCAqZW5kOworICAgICAgICBjb25zdCBjaGFyICpzdGFydCwgKnRyYWNlLCAqZW5kOwogICAgICAgICBzc2l6ZV90IGxlbmd0aDsKLSAgICAgICAgc3RhdGljIFB5X3NzaXplX3QgYnVmZmVyX3NpemVzW10gPSB7IDI1NiwgWEFUVFJfTElTVF9NQVgsIDAgfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFB5X3NzaXplX3QgYnVmZmVyX3NpemVzW10gPSB7IDI1NiwgWEFUVFJfTElTVF9NQVgsIDAgfTsKICAgICAgICAgUHlfc3NpemVfdCBidWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplc1tpXTsKICAgICAgICAgaWYgKCFidWZmZXJfc2l6ZSkgewogICAgICAgICAgICAgLyogRVJBTkdFICovCkBAIC0xMTA3OCw4ICsxMDc1Miw3IEBACiAgICAgaWYgKGJ5dGVzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgcmVzdWx0ID0gX1B5T1NfVVJhbmRvbShQeUJ5dGVzX0FTX1NUUklORyhieXRlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKGJ5dGVzKSk7CisgICAgcmVzdWx0ID0gX1B5T1NfVVJhbmRvbShQeUJ5dGVzX0FTX1NUUklORyhieXRlcyksIFB5Qnl0ZXNfR0VUX1NJWkUoYnl0ZXMpKTsKICAgICBpZiAocmVzdWx0ID09IC0xKSB7CiAgICAgICAgIFB5X0RFQ1JFRihieXRlcyk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTExOTksMTEgKzEwODcyLDE1IEBACiBvcy5jcHVfY291bnQKIAogUmV0dXJuIHRoZSBudW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtOyByZXR1cm4gTm9uZSBpZiBpbmRldGVybWluYWJsZS4KKworVGhpcyBudW1iZXIgaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIG51bWJlciBvZiBDUFVzIHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuCit1c2UuICBUaGUgbnVtYmVyIG9mIHVzYWJsZSBDUFVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCitgYGxlbihvcy5zY2hlZF9nZXRhZmZpbml0eSgwKSlgYAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogb3NfY3B1X2NvdW50X2ltcGwoUHlPYmplY3QgKm1vZHVsZSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01ZmMyOTQ2M2MzOTM2YTljIGlucHV0PWQ1NWUyZjhmMzgyM2E2MjhdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01ZmMyOTQ2M2MzOTM2YTljIGlucHV0PWU3YzhmNGJhNmRiYmFkZDNdKi8KIHsKICAgICBpbnQgbmNwdSA9IDA7CiAjaWZkZWYgTVNfV0lORE9XUwpAQCAtMTEyNDcsMTEgKzEwOTI0LDYgQEAKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wNDQ1ZTIwZTE0OWFhNWI4IGlucHV0PTg5YWMwMDhkYzlhYjZiOTVdKi8KIHsKICAgICBpbnQgcmV0dXJuX3ZhbHVlOwotICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkKSkgewotICAgICAgICBwb3NpeF9lcnJvcigpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCiAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAogICAgIHJldHVybl92YWx1ZSA9IF9QeV9nZXRfaW5oZXJpdGFibGUoZmQpOwogICAgIF9QeV9FTkRfU1VQUFJFU1NfSVBICkBAIC0xMTI3Myw4ICsxMDk0NSw2IEBACiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjFiMTkxOGEyZjNjMzhjMiBpbnB1dD05Y2VhZWFkODdhMWUyNDAyXSovCiB7CiAgICAgaW50IHJlc3VsdDsKLSAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpCi0gICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOwogCiAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAogICAgIHJlc3VsdCA9IF9QeV9zZXRfaW5oZXJpdGFibGUoZmQsIGluaGVyaXRhYmxlLCBOVUxMKTsKQEAgLTExMjg4LDE1ICsxMDk1OCwxNSBAQAogI2lmZGVmIE1TX1dJTkRPV1MKIC8qW2NsaW5pYyBpbnB1dF0KIG9zLmdldF9oYW5kbGVfaW5oZXJpdGFibGUgLT4gYm9vbAotICAgIGhhbmRsZTogUHlfaW50cHRyX3QKKyAgICBoYW5kbGU6IGludHB0cl90CiAgICAgLwogCiBHZXQgdGhlIGNsb3NlLW9uLWV4ZSBmbGFnIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgaW50Ci1vc19nZXRfaGFuZGxlX2luaGVyaXRhYmxlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfaW50cHRyX3QgaGFuZGxlKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTllNTM4OWIwYWEwOTE2Y2UgaW5wdXQ9NWY3NzU5NDQzYWFlM2RjNV0qLworb3NfZ2V0X2hhbmRsZV9pbmhlcml0YWJsZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludHB0cl90IGhhbmRsZSkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zNmJlNWFmY2E2ZWE4NGQ4IGlucHV0PWNmZTk5ZjljMDVjNzBhZDFdKi8KIHsKICAgICBEV09SRCBmbGFnczsKIApAQCAtMTEzMTEsNyArMTA5ODEsNyBAQAogCiAvKltjbGluaWMgaW5wdXRdCiBvcy5zZXRfaGFuZGxlX2luaGVyaXRhYmxlCi0gICAgaGFuZGxlOiBQeV9pbnRwdHJfdAorICAgIGhhbmRsZTogaW50cHRyX3QKICAgICBpbmhlcml0YWJsZTogYm9vbAogICAgIC8KIApAQCAtMTEzMTksOSArMTA5ODksOSBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotb3Nfc2V0X2hhbmRsZV9pbmhlcml0YWJsZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2ludHB0cl90IGhhbmRsZSwKK29zX3NldF9oYW5kbGVfaW5oZXJpdGFibGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnRwdHJfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaGVyaXRhYmxlKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWIxZTY3YmZhMzIxM2Q3NDUgaW5wdXQ9ZTY0YjJiMjczMDQ2OWRlZl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTAyMWQ3NGZlNmM5NmJhYTMgaW5wdXQ9N2E3NjQxMzkwZDgzNjRmY10qLwogewogICAgIERXT1JEIGZsYWdzID0gaW5oZXJpdGFibGUgPyBIQU5ETEVfRkxBR19JTkhFUklUIDogMDsKICAgICBpZiAoIVNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpaGFuZGxlLCBIQU5ETEVfRkxBR19JTkhFUklULCBmbGFncykpIHsKQEAgLTExMzQ4LDkgKzExMDE4LDYgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0X2Jsb2NraW5nIiwgJmZkKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpCi0gICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOwotCiAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAogICAgIGJsb2NraW5nID0gX1B5X2dldF9ibG9ja2luZyhmZCk7CiAgICAgX1B5X0VORF9TVVBQUkVTU19JUEgKQEAgLTExMzc0LDkgKzExMDQxLDYgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOnNldF9ibG9ja2luZyIsICZmZCwgJmJsb2NraW5nKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpCi0gICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOwotCiAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAogICAgIHJlc3VsdCA9IF9QeV9zZXRfYmxvY2tpbmcoZmQsIGJsb2NraW5nKTsKICAgICBfUHlfRU5EX1NVUFBSRVNTX0lQSApAQCAtMTE0NjAsMTYgKzExMTI0LDE2IEBACiAgICAgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCBzdDsKIAogI2lmZGVmIE1TX1dJTkRPV1MKLSAgICB3Y2hhcl90ICpwYXRoOworICAgIGNvbnN0IHdjaGFyX3QgKnBhdGg7CiAKICAgICBwYXRoID0gUHlVbmljb2RlX0FzVW5pY29kZShzZWxmLT5wYXRoKTsKICAgICBpZiAoIXBhdGgpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKGZvbGxvd19zeW1saW5rcykKLSAgICAgICAgcmVzdWx0ID0gd2luMzJfc3RhdF93KHBhdGgsICZzdCk7CisgICAgICAgIHJlc3VsdCA9IHdpbjMyX3N0YXQocGF0aCwgJnN0KTsKICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IHdpbjMyX2xzdGF0X3cocGF0aCwgJnN0KTsKKyAgICAgICAgcmVzdWx0ID0gd2luMzJfbHN0YXQocGF0aCwgJnN0KTsKIAogICAgIGlmIChyZXN1bHQgIT0gMCkgewogICAgICAgICByZXR1cm4gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoUHlFeGNfT1NFcnJvciwKQEAgLTExNDc3LDcgKzExMTQxLDcgQEAKICAgICB9CiAjZWxzZSAvKiBQT1NJWCAqLwogICAgIFB5T2JqZWN0ICpieXRlczsKLSAgICBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKnBhdGg7CiAKICAgICBpZiAoIVB5VW5pY29kZV9GU0NvbnZlcnRlcihzZWxmLT5wYXRoLCAmYnl0ZXMpKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExNjYxLDE0ICsxMTMyNSwxNCBAQAogewogI2lmZGVmIE1TX1dJTkRPV1MKICAgICBpZiAoIXNlbGYtPmdvdF9maWxlX2luZGV4KSB7Ci0gICAgICAgIHdjaGFyX3QgKnBhdGg7CisgICAgICAgIGNvbnN0IHdjaGFyX3QgKnBhdGg7CiAgICAgICAgIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3Qgc3RhdDsKIAogICAgICAgICBwYXRoID0gUHlVbmljb2RlX0FzVW5pY29kZShzZWxmLT5wYXRoKTsKICAgICAgICAgaWYgKCFwYXRoKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKHdpbjMyX2xzdGF0X3cocGF0aCwgJnN0YXQpICE9IDApIHsKKyAgICAgICAgaWYgKHdpbjMyX2xzdGF0KHBhdGgsICZzdGF0KSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoUHlFeGNfT1NFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBzZWxmLT5wYXRoKTsKICAgICAgICAgfQpAQCAtMTE2NzYsMTAgKzExMzQwLDEwIEBACiAgICAgICAgIHNlbGYtPndpbjMyX2ZpbGVfaW5kZXggPSBzdGF0LnN0X2lubzsKICAgICAgICAgc2VsZi0+Z290X2ZpbGVfaW5kZXggPSAxOwogICAgIH0KLSAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXNlbGYtPndpbjMyX2ZpbGVfaW5kZXgpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpc2VsZi0+d2luMzJfZmlsZV9pbmRleCk7CiAjZWxzZSAvKiBQT1NJWCAqLwogI2lmZGVmIEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQKLSAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXNlbGYtPmRfaW5vKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKXNlbGYtPmRfaW5vKTsKICNlbHNlCiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygobG9uZylzZWxmLT5kX2lubyk7CiAjZW5kaWYKQEAgLTExNjkyLDYgKzExMzU2LDEzIEBACiAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tRm9ybWF0KCI8RGlyRW50cnkgJVI+Iiwgc2VsZi0+bmFtZSk7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCAqCitEaXJFbnRyeV9mc3BhdGgoRGlyRW50cnkgKnNlbGYpCit7CisgICAgUHlfSU5DUkVGKHNlbGYtPnBhdGgpOworICAgIHJldHVybiBzZWxmLT5wYXRoOworfQorCiBzdGF0aWMgUHlNZW1iZXJEZWYgRGlyRW50cnlfbWVtYmVyc1tdID0gewogICAgIHsibmFtZSIsIFRfT0JKRUNUX0VYLCBvZmZzZXRvZihEaXJFbnRyeSwgbmFtZSksIFJFQURPTkxZLAogICAgICAidGhlIGVudHJ5J3MgYmFzZSBmaWxlbmFtZSwgcmVsYXRpdmUgdG8gc2NhbmRpcigpIFwicGF0aFwiIGFyZ3VtZW50In0sCkBAIC0xMTcxNiw2ICsxMTM4Nyw5IEBACiAgICAgeyJpbm9kZSIsIChQeUNGdW5jdGlvbilEaXJFbnRyeV9pbm9kZSwgTUVUSF9OT0FSR1MsCiAgICAgICJyZXR1cm4gaW5vZGUgb2YgdGhlIGVudHJ5OyBjYWNoZWQgcGVyIGVudHJ5IiwKICAgICB9LAorICAgIHsiX19mc3BhdGhfXyIsIChQeUNGdW5jdGlvbilEaXJFbnRyeV9mc3BhdGgsIE1FVEhfTk9BUkdTLAorICAgICAicmV0dXJucyB0aGUgcGF0aCBmb3IgdGhlIGVudHJ5IiwKKyAgICB9LAogICAgIHtOVUxMfQogfTsKIApAQCAtMTE3NTUsNyArMTE0MjksNyBAQAogI2lmZGVmIE1TX1dJTkRPV1MKIAogc3RhdGljIHdjaGFyX3QgKgotam9pbl9wYXRoX2ZpbGVuYW1lVyh3Y2hhcl90ICpwYXRoX3dpZGUsIHdjaGFyX3QqIGZpbGVuYW1lKQoram9pbl9wYXRoX2ZpbGVuYW1lVyhjb25zdCB3Y2hhcl90ICpwYXRoX3dpZGUsIGNvbnN0IHdjaGFyX3QgKmZpbGVuYW1lKQogewogICAgIFB5X3NzaXplX3QgcGF0aF9sZW47CiAgICAgUHlfc3NpemVfdCBzaXplOwpAQCAtMTE4MDcsNiArMTE0ODEsMTEgQEAKICAgICBlbnRyeS0+bmFtZSA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoZGF0YVctPmNGaWxlTmFtZSwgLTEpOwogICAgIGlmICghZW50cnktPm5hbWUpCiAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKHBhdGgtPm5hcnJvdykgeworICAgICAgICBQeV9TRVRSRUYoZW50cnktPm5hbWUsIFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQoZW50cnktPm5hbWUpKTsKKyAgICAgICAgaWYgKCFlbnRyeS0+bmFtZSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCiAgICAgam9pbmVkX3BhdGggPSBqb2luX3BhdGhfZmlsZW5hbWVXKHBhdGgtPndpZGUsIGRhdGFXLT5jRmlsZU5hbWUpOwogICAgIGlmICgham9pbmVkX3BhdGgpCkBAIC0xMTgxNiw4ICsxMTQ5NSwxMyBAQAogICAgIFB5TWVtX0ZyZWUoam9pbmVkX3BhdGgpOwogICAgIGlmICghZW50cnktPnBhdGgpCiAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKHBhdGgtPm5hcnJvdykgeworICAgICAgICBQeV9TRVRSRUYoZW50cnktPnBhdGgsIFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQoZW50cnktPnBhdGgpKTsKKyAgICAgICAgaWYgKCFlbnRyeS0+cGF0aCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0gICAgZmluZF9kYXRhX3RvX2ZpbGVfaW5mb193KGRhdGFXLCAmZmlsZV9pbmZvLCAmcmVwYXJzZV90YWcpOworICAgIGZpbmRfZGF0YV90b19maWxlX2luZm8oZGF0YVcsICZmaWxlX2luZm8sICZyZXBhcnNlX3RhZyk7CiAgICAgX1B5X2F0dHJpYnV0ZV9kYXRhX3RvX3N0YXQoJmZpbGVfaW5mbywgcmVwYXJzZV90YWcsICZlbnRyeS0+d2luMzJfbHN0YXQpOwogCiAgICAgcmV0dXJuIChQeU9iamVjdCAqKWVudHJ5OwpAQCAtMTE4MzAsNyArMTE1MTQsNyBAQAogI2Vsc2UgLyogUE9TSVggKi8KIAogc3RhdGljIGNoYXIgKgotam9pbl9wYXRoX2ZpbGVuYW1lKGNoYXIgKnBhdGhfbmFycm93LCBjaGFyKiBmaWxlbmFtZSwgUHlfc3NpemVfdCBmaWxlbmFtZV9sZW4pCitqb2luX3BhdGhfZmlsZW5hbWUoY29uc3QgY2hhciAqcGF0aF9uYXJyb3csIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBQeV9zc2l6ZV90IGZpbGVuYW1lX2xlbikKIHsKICAgICBQeV9zc2l6ZV90IHBhdGhfbGVuOwogICAgIFB5X3NzaXplX3Qgc2l6ZTsKQEAgLTExODYyLDcgKzExNTQ2LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLURpckVudHJ5X2Zyb21fcG9zaXhfaW5mbyhwYXRoX3QgKnBhdGgsIGNoYXIgKm5hbWUsIFB5X3NzaXplX3QgbmFtZV9sZW4sCitEaXJFbnRyeV9mcm9tX3Bvc2l4X2luZm8ocGF0aF90ICpwYXRoLCBjb25zdCBjaGFyICpuYW1lLCBQeV9zc2l6ZV90IG5hbWVfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlub190IGRfaW5vCiAjaWZkZWYgSEFWRV9ESVJFTlRfRF9UWVBFCiAgICAgICAgICAgICAgICAgICAgICAgICAgLCB1bnNpZ25lZCBjaGFyIGRfdHlwZQpAQCAtMTE5MjUsOCArMTE2MDksMTQgQEAKIAogI2lmZGVmIE1TX1dJTkRPV1MKIAorc3RhdGljIGludAorU2NhbmRpckl0ZXJhdG9yX2lzX2Nsb3NlZChTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQoreworICAgIHJldHVybiBpdGVyYXRvci0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFOworfQorCiBzdGF0aWMgdm9pZAotU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCitTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKIHsKICAgICBIQU5ETEUgaGFuZGxlID0gaXRlcmF0b3ItPmhhbmRsZTsKIApAQCAtMTE5NDYsNyArMTE2MzYsNyBAQAogICAgIEJPT0wgc3VjY2VzczsKICAgICBQeU9iamVjdCAqZW50cnk7CiAKLSAgICAvKiBIYXBwZW5zIGlmIHRoZSBpdGVyYXRvciBpcyBpdGVyYXRlZCB0d2ljZSAqLworICAgIC8qIEhhcHBlbnMgaWYgdGhlIGl0ZXJhdG9yIGlzIGl0ZXJhdGVkIHR3aWNlLCBvciBjbG9zZWQgZXhwbGljaXRseSAqLwogICAgIGlmIChpdGVyYXRvci0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMTE5NzcsMTQgKzExNjY3LDIwIEBACiAgICAgfQogCiAgICAgLyogRXJyb3Igb3Igbm8gbW9yZSBmaWxlcyAqLwotICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZShpdGVyYXRvcik7CisgICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlZGlyKGl0ZXJhdG9yKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIAogI2Vsc2UgLyogUE9TSVggKi8KIAorc3RhdGljIGludAorU2NhbmRpckl0ZXJhdG9yX2lzX2Nsb3NlZChTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQoreworICAgIHJldHVybiAhaXRlcmF0b3ItPmRpcnA7Cit9CisKIHN0YXRpYyB2b2lkCi1TY2FuZGlySXRlcmF0b3JfY2xvc2UoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKK1NjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQogewogICAgIERJUiAqZGlycCA9IGl0ZXJhdG9yLT5kaXJwOwogCkBAIC0xMjAwNiw3ICsxMTcwMiw3IEBACiAgICAgaW50IGlzX2RvdDsKICAgICBQeU9iamVjdCAqZW50cnk7CiAKLSAgICAvKiBIYXBwZW5zIGlmIHRoZSBpdGVyYXRvciBpcyBpdGVyYXRlZCB0d2ljZSAqLworICAgIC8qIEhhcHBlbnMgaWYgdGhlIGl0ZXJhdG9yIGlzIGl0ZXJhdGVkIHR3aWNlLCBvciBjbG9zZWQgZXhwbGljaXRseSAqLwogICAgIGlmICghaXRlcmF0b3ItPmRpcnApCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0xMjA0MywyMSArMTE3MzksNzYgQEAKICAgICB9CiAKICAgICAvKiBFcnJvciBvciBubyBtb3JlIGZpbGVzICovCi0gICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKGl0ZXJhdG9yKTsKKyAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoaXRlcmF0b3IpOwogICAgIHJldHVybiBOVUxMOwogfQogCiAjZW5kaWYKIAorc3RhdGljIFB5T2JqZWN0ICoKK1NjYW5kaXJJdGVyYXRvcl9jbG9zZShTY2FuZGlySXRlcmF0b3IgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihzZWxmKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK1NjYW5kaXJJdGVyYXRvcl9lbnRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiBzZWxmOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorU2NhbmRpckl0ZXJhdG9yX2V4aXQoU2NhbmRpckl0ZXJhdG9yICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoc2VsZik7CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkCitTY2FuZGlySXRlcmF0b3JfZmluYWxpemUoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKK3sKKyAgICBQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOworCisgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KKyAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKKworICAgIGlmICghU2NhbmRpckl0ZXJhdG9yX2lzX2Nsb3NlZChpdGVyYXRvcikpIHsKKyAgICAgICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlZGlyKGl0ZXJhdG9yKTsKKworICAgICAgICBpZiAoUHlFcnJfUmVzb3VyY2VXYXJuaW5nKChQeU9iamVjdCAqKWl0ZXJhdG9yLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmNsb3NlZCBzY2FuZGlyIGl0ZXJhdG9yICVSIiwgaXRlcmF0b3IpKSB7CisgICAgICAgICAgICAvKiBTcHVyaW91cyBlcnJvcnMgY2FuIGFwcGVhciBhdCBzaHV0ZG93biAqLworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfV2FybmluZykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoKFB5T2JqZWN0ICopIGl0ZXJhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFB5X0NMRUFSKGl0ZXJhdG9yLT5wYXRoLm9iamVjdCk7CisgICAgcGF0aF9jbGVhbnVwKCZpdGVyYXRvci0+cGF0aCk7CisKKyAgICAvKiBSZXN0b3JlIHRoZSBzYXZlZCBleGNlcHRpb24uICovCisgICAgUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKK30KKwogc3RhdGljIHZvaWQKIFNjYW5kaXJJdGVyYXRvcl9kZWFsbG9jKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCiB7Ci0gICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKGl0ZXJhdG9yKTsKLSAgICBQeV9YREVDUkVGKGl0ZXJhdG9yLT5wYXRoLm9iamVjdCk7Ci0gICAgcGF0aF9jbGVhbnVwKCZpdGVyYXRvci0+cGF0aCk7CisgICAgaWYgKFB5T2JqZWN0X0NhbGxGaW5hbGl6ZXJGcm9tRGVhbGxvYygoUHlPYmplY3QgKilpdGVyYXRvcikgPCAwKQorICAgICAgICByZXR1cm47CisKICAgICBQeV9UWVBFKGl0ZXJhdG9yKS0+dHBfZnJlZSgoUHlPYmplY3QgKilpdGVyYXRvcik7CiB9CiAKK3N0YXRpYyBQeU1ldGhvZERlZiBTY2FuZGlySXRlcmF0b3JfbWV0aG9kc1tdID0geworICAgIHsiX19lbnRlcl9fIiwgKFB5Q0Z1bmN0aW9uKVNjYW5kaXJJdGVyYXRvcl9lbnRlciwgTUVUSF9OT0FSR1N9LAorICAgIHsiX19leGl0X18iLCAoUHlDRnVuY3Rpb24pU2NhbmRpckl0ZXJhdG9yX2V4aXQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJjbG9zZSIsIChQeUNGdW5jdGlvbilTY2FuZGlySXRlcmF0b3JfY2xvc2UsIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTH0KK307CisKIHN0YXRpYyBQeVR5cGVPYmplY3QgU2NhbmRpckl0ZXJhdG9yVHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICBNT0ROQU1FICIuU2NhbmRpckl0ZXJhdG9yIiwgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwpAQCAtMTIwNzksNyArMTE4MzAsOCBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQKKyAgICAgICAgfCBQeV9UUEZMQUdTX0hBVkVfRklOQUxJWkUsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCkBAIC0xMjA4Nyw2ICsxMTgzOSwyNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgKGl0ZXJuZXh0ZnVuYylTY2FuZGlySXRlcmF0b3JfaXRlcm5leHQsIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgU2NhbmRpckl0ZXJhdG9yX21ldGhvZHMsICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2lzX2djICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWNoZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdWJjbGFzc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF92ZXJzaW9uX3RhZyAqLworICAgIChkZXN0cnVjdG9yKVNjYW5kaXJJdGVyYXRvcl9maW5hbGl6ZSwgICAvKiB0cF9maW5hbGl6ZSAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEyMDk3LDcgKzExODcwLDcgQEAKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgd2NoYXJfdCAqcGF0aF9zdHJXOwogI2Vsc2UKLSAgICBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKnBhdGg7CiAjZW5kaWYKIAogICAgIGl0ZXJhdG9yID0gUHlPYmplY3RfTmV3KFNjYW5kaXJJdGVyYXRvciwgJlNjYW5kaXJJdGVyYXRvclR5cGUpOwpAQCAtMTIxMjQsMTEgKzExODk3LDYgQEAKICAgICBQeV9YSU5DUkVGKGl0ZXJhdG9yLT5wYXRoLm9iamVjdCk7CiAKICNpZmRlZiBNU19XSU5ET1dTCi0gICAgaWYgKGl0ZXJhdG9yLT5wYXRoLm5hcnJvdykgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9zLnNjYW5kaXIoKSBkb2Vzbid0IHN1cHBvcnQgYnl0ZXMgcGF0aCBvbiBXaW5kb3dzLCB1c2UgVW5pY29kZSBpbnN0ZWFkIik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQogICAgIGl0ZXJhdG9yLT5maXJzdF90aW1lID0gMTsKIAogICAgIHBhdGhfc3RyVyA9IGpvaW5fcGF0aF9maWxlbmFtZVcoaXRlcmF0b3ItPnBhdGgud2lkZSwgTCIqLioiKTsKQEAgLTEyMTY5LDYgKzExOTM3LDEyNCBAQAogICAgIHJldHVybiBOVUxMOwogfQogCisvKgorICAgIFJldHVybiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgorCisgICAgSWYgdGhlIG9iamVjdCBpcyBzdHIgb3IgYnl0ZXMsIHRoZW4gYWxsb3cgaXQgdG8gcGFzcyB0aHJvdWdoIHdpdGgKKyAgICBhbiBpbmNyZW1lbnRlZCByZWZjb3VudC4gSWYgdGhlIG9iamVjdCBkZWZpbmVzIF9fZnNwYXRoX18oKSwgdGhlbgorICAgIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoYXQgbWV0aG9kLiBBbGwgb3RoZXIgdHlwZXMgcmFpc2UgYSBUeXBlRXJyb3IuCisqLworUHlPYmplY3QgKgorUHlPU19GU1BhdGgoUHlPYmplY3QgKnBhdGgpCit7CisgICAgLyogRm9yIGVycm9yIG1lc3NhZ2UgcmVhc29ucywgdGhpcyBmdW5jdGlvbiBpcyBtYW51YWxseSBpbmxpbmVkIGluCisgICAgICAgcGF0aF9jb252ZXJ0ZXIoKS4gKi8KKyAgICBfUHlfSURFTlRJRklFUihfX2ZzcGF0aF9fKTsKKyAgICBQeU9iamVjdCAqZnVuYyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnBhdGhfcmVwciA9IE5VTEw7CisKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHBhdGgpIHx8IFB5Qnl0ZXNfQ2hlY2socGF0aCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKHBhdGgpOworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBmdW5jID0gX1B5T2JqZWN0X0xvb2t1cFNwZWNpYWwocGF0aCwgJlB5SWRfX19mc3BhdGhfXyk7CisgICAgaWYgKE5VTEwgPT0gZnVuYykgeworICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgc3RyLCBieXRlcyBvciBvcy5QYXRoTGlrZSBvYmplY3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShwYXRoKS0+dHBfbmFtZSk7CisgICAgfQorCisgICAgcGF0aF9yZXByID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgaWYgKE5VTEwgPT0gcGF0aF9yZXByKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghKFB5VW5pY29kZV9DaGVjayhwYXRoX3JlcHIpIHx8IFB5Qnl0ZXNfQ2hlY2socGF0aF9yZXByKSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlLjIwMHMuX19mc3BhdGhfXygpIHRvIHJldHVybiBzdHIgb3IgYnl0ZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICJub3QgJS4yMDBzIiwgUHlfVFlQRShwYXRoKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocGF0aF9yZXByKS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihwYXRoX3JlcHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcGF0aF9yZXByOworfQorCisvKltjbGluaWMgaW5wdXRdCitvcy5mc3BhdGgKKworICAgIHBhdGg6IG9iamVjdAorCitSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHBhdGggcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4KKworSWYgdGhlIG9iamVjdCBpcyBzdHIgb3IgYnl0ZXMsIHRoZW4gYWxsb3cgaXQgdG8gcGFzcyB0aHJvdWdoIGFzLWlzLiBJZiB0aGUKK29iamVjdCBkZWZpbmVzIF9fZnNwYXRoX18oKSwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGF0IG1ldGhvZC4gQWxsIG90aGVyCit0eXBlcyByYWlzZSBhIFR5cGVFcnJvci4KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK29zX2ZzcGF0aF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpwYXRoKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWMzYzNiNzhlY2ZmMjkxNGYgaW5wdXQ9ZTM1NzE2NWY3YjIyNDkwZl0qLworeworICAgIHJldHVybiBQeU9TX0ZTUGF0aChwYXRoKTsKK30KKworI2lmZGVmIEhBVkVfR0VUUkFORE9NX1NZU0NBTEwKKy8qW2NsaW5pYyBpbnB1dF0KK29zLmdldHJhbmRvbQorCisgICAgc2l6ZTogUHlfc3NpemVfdAorICAgIGZsYWdzOiBpbnQ9MAorCitPYnRhaW4gYSBzZXJpZXMgb2YgcmFuZG9tIGJ5dGVzLgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorb3NfZ2V0cmFuZG9tX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfc3NpemVfdCBzaXplLCBpbnQgZmxhZ3MpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjNhNjE4MTk2YTYxNDA5YyBpbnB1dD01OWJhZmFjMzljNTk0OTQ3XSovCit7CisgICAgY2hhciAqYnVmZmVyOworICAgIFB5X3NzaXplX3QgbjsKKyAgICBQeU9iamVjdCAqYnl0ZXM7CisKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOworICAgIH0KKworICAgIGJ1ZmZlciA9IFB5TWVtX01hbGxvYyhzaXplKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgbiA9IHN5c2NhbGwoU1lTX2dldHJhbmRvbSwgYnVmZmVyLCBzaXplLCBmbGFncyk7CisgICAgICAgIGlmIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikgeworICAgICAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIFB5TWVtX0ZyZWUoYnVmZmVyKTsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBieXRlcyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBuKTsKKyAgICBQeU1lbV9GcmVlKGJ1ZmZlcik7CisKKyAgICByZXR1cm4gYnl0ZXM7Cit9CisjZW5kaWYgICAvKiBIQVZFX0dFVFJBTkRPTV9TWVNDQUxMICovCiAKICNpbmNsdWRlICJjbGluaWMvcG9zaXhtb2R1bGUuYy5oIgogCkBAIC0xMjI2MCw3ICsxMjE0Niw3IEBACiAgICAgT1NfS0lMTFBHX01FVEhPRERFRgogICAgIE9TX1BMT0NLX01FVEhPRERFRgogI2lmZGVmIE1TX1dJTkRPV1MKLSAgICB7InN0YXJ0ZmlsZSIsICAgICAgIHdpbjMyX3N0YXJ0ZmlsZSwgTUVUSF9WQVJBUkdTLCB3aW4zMl9zdGFydGZpbGVfX2RvY19ffSwKKyAgICBPU19TVEFSVEZJTEVfTUVUSE9EREVGCiAjZW5kaWYKICAgICBPU19TRVRVSURfTUVUSE9EREVGCiAgICAgT1NfU0VURVVJRF9NRVRIT0RERUYKQEAgLTEyMzY5LDYgKzEyMjU1LDggQEAKICAgICB7InNjYW5kaXIiLCAgICAgICAgIChQeUNGdW5jdGlvbilwb3NpeF9zY2FuZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l4X3NjYW5kaXJfX2RvY19ffSwKKyAgICBPU19GU1BBVEhfTUVUSE9EREVGCisgICAgT1NfR0VUUkFORE9NX01FVEhPRERFRgogICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIApAQCAtMTIzODAsNyArMTIyNjgsNiBAQAogICAgIEhBTkRMRSB0b2s7CiAgICAgVE9LRU5fUFJJVklMRUdFUyB0b2tfcHJpdjsKICAgICBMVUlEIGx1aWQ7Ci0gICAgaW50IG1ldGhfaWR4ID0gMDsKIAogICAgIGlmICghT3BlblByb2Nlc3NUb2tlbihHZXRDdXJyZW50UHJvY2VzcygpLCBUT0tFTl9BTExfQUNDRVNTLCAmdG9rKSkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMjQ4MywxMiArMTIzNzAsMTQgQEAKICNpZmRlZiBPX0xBUkdFRklMRQogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBPX0xBUkdFRklMRSkpIHJldHVybiAtMTsKICNlbmRpZgorI2lmbmRlZiBfX0dOVV9fCiAjaWZkZWYgT19TSExPQ0sKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgT19TSExPQ0spKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX0VYTE9DSwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBPX0VYTE9DSykpIHJldHVybiAtMTsKICNlbmRpZgorI2VuZGlmCiAjaWZkZWYgT19FWEVDCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIE9fRVhFQykpIHJldHVybiAtMTsKICNlbmRpZgpAQCAtMTI3OTEsMjggKzEyNjgwLDMzIEBACiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFhBVFRSX1NJWkVfTUFYKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKLSNpZmRlZiBSVExEX0xBWlkKKyNpZiBIQVZFX0RFQ0xfUlRMRF9MQVpZCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJUTERfTEFaWSkpIHJldHVybiAtMTsKICNlbmRpZgotI2lmZGVmIFJUTERfTk9XCisjaWYgSEFWRV9ERUNMX1JUTERfTk9XCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJUTERfTk9XKSkgcmV0dXJuIC0xOwogI2VuZGlmCi0jaWZkZWYgUlRMRF9HTE9CQUwKKyNpZiBIQVZFX0RFQ0xfUlRMRF9HTE9CQUwKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgUlRMRF9HTE9CQUwpKSByZXR1cm4gLTE7CiAjZW5kaWYKLSNpZmRlZiBSVExEX0xPQ0FMCisjaWYgSEFWRV9ERUNMX1JUTERfTE9DQUwKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgUlRMRF9MT0NBTCkpIHJldHVybiAtMTsKICNlbmRpZgotI2lmZGVmIFJUTERfTk9ERUxFVEUKKyNpZiBIQVZFX0RFQ0xfUlRMRF9OT0RFTEVURQogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBSVExEX05PREVMRVRFKSkgcmV0dXJuIC0xOwogI2VuZGlmCi0jaWZkZWYgUlRMRF9OT0xPQUQKKyNpZiBIQVZFX0RFQ0xfUlRMRF9OT0xPQUQKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgUlRMRF9OT0xPQUQpKSByZXR1cm4gLTE7CiAjZW5kaWYKLSNpZmRlZiBSVExEX0RFRVBCSU5ECisjaWYgSEFWRV9ERUNMX1JUTERfREVFUEJJTkQKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgUlRMRF9ERUVQQklORCkpIHJldHVybiAtMTsKICNlbmRpZgogCisjaWZkZWYgSEFWRV9HRVRSQU5ET01fU1lTQ0FMTAorICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBHUk5EX1JBTkRPTSkpIHJldHVybiAtMTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgR1JORF9OT05CTE9DSykpIHJldHVybiAtMTsKKyNlbmRpZgorCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTEyODMwLDcgKzEyNzI0LDcgQEAKIH07CiAKIAotc3RhdGljIGNoYXIgKmhhdmVfZnVuY3Rpb25zW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhhdmVfZnVuY3Rpb25zW10gPSB7CiAKICNpZmRlZiBIQVZFX0ZBQ0NFU1NBVAogICAgICJIQVZFX0ZBQ0NFU1NBVCIsCkBAIC0xMjk2NSw3ICsxMjg1OSw3IEBACiB7CiAgICAgUHlPYmplY3QgKm0sICp2OwogICAgIFB5T2JqZWN0ICpsaXN0OwotICAgIGNoYXIgKip0cmFjZTsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKnRyYWNlOwogCiAjaWYgZGVmaW5lZChIQVZFX1NZTUxJTkspICYmIGRlZmluZWQoTVNfV0lORE9XUykKICAgICB3aW4zMl9jYW5fc3ltbGluayA9IGVuYWJsZV9zeW1saW5rKCk7CkBAIC0xMzE0MSw2ICsxMzAzNSw5IEBACiAgICAgfQogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiX2hhdmVfZnVuY3Rpb25zIiwgbGlzdCk7CiAKKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopICZEaXJFbnRyeVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRGlyRW50cnkiLCAoUHlPYmplY3QgKikmRGlyRW50cnlUeXBlKTsKKwogICAgIGluaXRpYWxpemVkID0gMTsKIAogICAgIHJldHVybiBtOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9wd2Rtb2R1bGUuYyBiL01vZHVsZXMvcHdkbW9kdWxlLmMKaW5kZXggNzQxNmNmNy4uNzg0ZTlkMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wd2Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3B3ZG1vZHVsZS5jCkBAIC03NSwxMCArNzUsMTggQEAKICNkZWZpbmUgU0VUUyhpLHZhbCkgc2V0cyh2LCBpLCB2YWwpCiAKICAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X25hbWUpOworI2lmIGRlZmluZWQoSEFWRV9TVFJVQ1RfUEFTU1dEX1BXX1BBU1NXRCkgJiYgIWRlZmluZWQoX19BTkRST0lEX18pCiAgICAgU0VUUyhzZXRJbmRleCsrLCBwLT5wd19wYXNzd2QpOworI2Vsc2UKKyAgICBTRVRTKHNldEluZGV4KyssICIiKTsKKyNlbmRpZgogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgc2V0SW5kZXgrKywgX1B5TG9uZ19Gcm9tVWlkKHAtPnB3X3VpZCkpOwogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgc2V0SW5kZXgrKywgX1B5TG9uZ19Gcm9tR2lkKHAtPnB3X2dpZCkpOworI2lmIGRlZmluZWQoSEFWRV9TVFJVQ1RfUEFTU1dEX1BXX0dFQ09TKQogICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfZ2Vjb3MpOworI2Vsc2UKKyAgICBTRVRTKHNldEluZGV4KyssICIiKTsKKyNlbmRpZgogICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfZGlyKTsKICAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X3NoZWxsKTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9weWV4cGF0LmMgYi9Nb2R1bGVzL3B5ZXhwYXQuYwppbmRleCBlYjMyMmMyLi5iMTliN2JlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3B5ZXhwYXQuYworKysgYi9Nb2R1bGVzL3B5ZXhwYXQuYwpAQCAtOTEsNyArOTEsNyBAQAogICogZmFsc2Ugb24gYW4gZXhjZXB0aW9uLgogICovCiBzdGF0aWMgaW50Ci1zZXRfZXJyb3JfYXR0cihQeU9iamVjdCAqZXJyLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCitzZXRfZXJyb3JfYXR0cihQeU9iamVjdCAqZXJyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCiB7CiAgICAgUHlPYmplY3QgKnYgPSBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOwogCkBAIC0yMTgsNyArMjE4LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0KgotY2FsbF93aXRoX2ZyYW1lKGNoYXIgKmZ1bmNuYW1lLCBpbnQgbGluZW5vLCBQeU9iamVjdCogZnVuYywgUHlPYmplY3QqIGFyZ3MsCitjYWxsX3dpdGhfZnJhbWUoY29uc3QgY2hhciAqZnVuY25hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0KiBmdW5jLCBQeU9iamVjdCogYXJncywKICAgICAgICAgICAgICAgICB4bWxwYXJzZW9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqcmVzOwpAQCAtNzQ3LDcgKzc0Nyw4IEBACiAgICAgICAgIHMgKz0gTUFYX0NIVU5LX1NJWkU7CiAgICAgICAgIHNsZW4gLT0gTUFYX0NIVU5LX1NJWkU7CiAgICAgfQotICAgIGFzc2VydChNQVhfQ0hVTktfU0laRSA8IElOVF9NQVggJiYgc2xlbiA8IElOVF9NQVgpOworICAgIFB5X0JVSUxEX0FTU0VSVChNQVhfQ0hVTktfU0laRSA8PSBJTlRfTUFYKTsKKyAgICBhc3NlcnQoc2xlbiA8PSBJTlRfTUFYKTsKICAgICByYyA9IFhNTF9QYXJzZShzZWxmLT5pdHNlbGYsIHMsIChpbnQpc2xlbiwgaXNmaW5hbCk7CiAKIGRvbmU6CkBAIC03NjUsNyArNzY2LDcgQEAKIHsKICAgICBQeU9iamVjdCAqc3RyOwogICAgIFB5X3NzaXplX3QgbGVuOwotICAgIGNoYXIgKnB0cjsKKyAgICBjb25zdCBjaGFyICpwdHI7CiAKICAgICBzdHIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24obWV0aCwgIm4iLCBidWZfc2l6ZSk7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQpAQCAtMTIyNSwxMiArMTIyNiw4IEBACiAgICAgc2VsZi0+aXRzZWxmID0gTlVMTDsKIAogICAgIGlmIChzZWxmLT5oYW5kbGVycyAhPSBOVUxMKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wOwotICAgICAgICBmb3IgKGkgPSAwOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKLSAgICAgICAgICAgIHRlbXAgPSBzZWxmLT5oYW5kbGVyc1tpXTsKLSAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKLSAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7Ci0gICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgUHlfQ0xFQVIoc2VsZi0+aGFuZGxlcnNbaV0pOwogICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmhhbmRsZXJzKTsKICAgICAgICAgc2VsZi0+aGFuZGxlcnMgPSBOVUxMOwogICAgIH0KQEAgLTEzNDQsNyArMTM0MSw2IEBACiAgICAgaW50IGhhbmRsZXJudW0gPSBoYW5kbGVybmFtZTJpbnQobmFtZSk7CiAgICAgaWYgKGhhbmRsZXJudW0gPj0gMCkgewogICAgICAgICB4bWxoYW5kbGVyIGNfaGFuZGxlciA9IE5VTEw7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gc2VsZi0+aGFuZGxlcnNbaGFuZGxlcm51bV07CiAKICAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewogICAgICAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciwgYW5kIGEgY2hhcmFjdGVyCkBAIC0xMzY2LDggKzEzNjIsNyBAQAogICAgICAgICAgICAgUHlfSU5DUkVGKHYpOwogICAgICAgICAgICAgY19oYW5kbGVyID0gaGFuZGxlcl9pbmZvW2hhbmRsZXJudW1dLmhhbmRsZXI7CiAgICAgICAgIH0KLSAgICAgICAgc2VsZi0+aGFuZGxlcnNbaGFuZGxlcm51bV0gPSB2OwotICAgICAgICBQeV9YREVDUkVGKHRlbXApOworICAgICAgICBQeV9YU0VUUkVGKHNlbGYtPmhhbmRsZXJzW2hhbmRsZXJudW1dLCB2KTsKICAgICAgICAgaGFuZGxlcl9pbmZvW2hhbmRsZXJudW1dLnNldHRlcihzZWxmLT5pdHNlbGYsIGNfaGFuZGxlcik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KQEAgLTE3MDYsNyArMTcwMSwxNSBAQAogICAgIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJuYXRpdmVfZW5jb2RpbmciLCAiVVRGLTgiKTsKIAogICAgIHN5c19tb2R1bGVzID0gUHlTeXNfR2V0T2JqZWN0KCJtb2R1bGVzIik7CisgICAgaWYgKHN5c19tb2R1bGVzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBlcnJvcnNfbW9kdWxlID0gUHlEaWN0X0dldEl0ZW0oZCwgZXJybW9kX25hbWUpOwogICAgIGlmIChlcnJvcnNfbW9kdWxlID09IE5VTEwpIHsKICAgICAgICAgZXJyb3JzX21vZHVsZSA9IFB5TW9kdWxlX05ldyhNT0RVTEVfTkFNRSAiLmVycm9ycyIpOwpAQCAtMTcyNyw5ICsxNzMwLDExIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgUHlfREVDUkVGKG1vZGVsbW9kX25hbWUpOwotICAgIGlmIChlcnJvcnNfbW9kdWxlID09IE5VTEwgfHwgbW9kZWxfbW9kdWxlID09IE5VTEwpCisgICAgaWYgKGVycm9yc19tb2R1bGUgPT0gTlVMTCB8fCBtb2RlbF9tb2R1bGUgPT0gTlVMTCkgewogICAgICAgICAvKiBEb24ndCBjb3JlIGR1bXAgbGF0ZXIhICovCisgICAgICAgIFB5X0RFQ1JFRihtKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjaWYgWE1MX0NPTUJJTkVEX1ZFUlNJT04gPiAxOTUwNQogICAgIHsKQEAgLTE4OTcsMTUgKzE5MDIsMTIgQEAKIGNsZWFyX2hhbmRsZXJzKHhtbHBhcnNlb2JqZWN0ICpzZWxmLCBpbnQgaW5pdGlhbCkKIHsKICAgICBpbnQgaSA9IDA7Ci0gICAgUHlPYmplY3QgKnRlbXA7CiAKICAgICBmb3IgKDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CiAgICAgICAgIGlmIChpbml0aWFsKQogICAgICAgICAgICAgc2VsZi0+aGFuZGxlcnNbaV0gPSBOVUxMOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRlbXAgPSBzZWxmLT5oYW5kbGVyc1tpXTsKLSAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKLSAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgICAgICAgICBQeV9DTEVBUihzZWxmLT5oYW5kbGVyc1tpXSk7CiAgICAgICAgICAgICBoYW5kbGVyX2luZm9baV0uc2V0dGVyKHNlbGYtPml0c2VsZiwgTlVMTCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3JlYWRsaW5lLmMgYi9Nb2R1bGVzL3JlYWRsaW5lLmMKaW5kZXggNTRmMTViYy4uM2I5NGQ0YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yZWFkbGluZS5jCisrKyBiL01vZHVsZXMvcmVhZGxpbmUuYwpAQCAtMzQzLDEwICszNDMsOCBAQAogICAgICAgICBQeV9DTEVBUigqaG9va192YXIpOwogICAgIH0KICAgICBlbHNlIGlmIChQeUNhbGxhYmxlX0NoZWNrKGZ1bmN0aW9uKSkgewotICAgICAgICBQeU9iamVjdCAqdG1wID0gKmhvb2tfdmFyOwogICAgICAgICBQeV9JTkNSRUYoZnVuY3Rpb24pOwotICAgICAgICAqaG9va192YXIgPSBmdW5jdGlvbjsKLSAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgICAgICBQeV9YU0VUUkVGKCpob29rX3ZhciwgZnVuY3Rpb24pOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKQEAgLTYwNCw2ICs2MDIsMjQgQEAKICJhZGRfaGlzdG9yeShzdHJpbmcpIC0+IE5vbmVcblwKIGFkZCBhbiBpdGVtIHRvIHRoZSBoaXN0b3J5IGJ1ZmZlciIpOwogCitzdGF0aWMgaW50IHNob3VsZF9hdXRvX2FkZF9oaXN0b3J5ID0gMTsKKworLyogRW5hYmxlIG9yIGRpc2FibGUgYXV0b21hdGljIGhpc3RvcnkgKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK3B5X3NldF9hdXRvX2hpc3RvcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicDpzZXRfYXV0b19oaXN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNob3VsZF9hdXRvX2FkZF9oaXN0b3J5KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK1B5RG9jX1NUUlZBUihkb2Nfc2V0X2F1dG9faGlzdG9yeSwKKyJzZXRfYXV0b19oaXN0b3J5KGVuYWJsZWQpIC0+IE5vbmVcblwKK0VuYWJsZXMgb3IgZGlzYWJsZXMgYXV0b21hdGljIGhpc3RvcnkuIik7CisKIAogLyogR2V0IHRoZSB0YWItY29tcGxldGlvbiB3b3JkLWRlbGltaXRlcnMgdGhhdCByZWFkbGluZSB1c2VzICovCiAKQEAgLTgyMiw2ICs4MzgsNyBAQAogCiAgICAgeyJzZXRfY29tcGxldGVyX2RlbGltcyIsIHNldF9jb21wbGV0ZXJfZGVsaW1zLAogICAgICBNRVRIX08sIGRvY19zZXRfY29tcGxldGVyX2RlbGltc30sCisgICAgeyJzZXRfYXV0b19oaXN0b3J5IiwgcHlfc2V0X2F1dG9faGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X2F1dG9faGlzdG9yeX0sCiAgICAgeyJhZGRfaGlzdG9yeSIsIHB5X2FkZF9oaXN0b3J5LCBNRVRIX08sIGRvY19hZGRfaGlzdG9yeX0sCiAgICAgeyJyZW1vdmVfaGlzdG9yeV9pdGVtIiwgcHlfcmVtb3ZlX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX3JlbW92ZV9oaXN0b3J5fSwKICAgICB7InJlcGxhY2VfaGlzdG9yeV9pdGVtIiwgcHlfcmVwbGFjZV9oaXN0b3J5LCBNRVRIX1ZBUkFSR1MsIGRvY19yZXBsYWNlX2hpc3Rvcnl9LApAQCAtODU3LDcgKzg3NCw3IEBACiAgICAgICAgIGlmIChyID09IFB5X05vbmUpCiAgICAgICAgICAgICByZXN1bHQgPSAwOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFB5TG9uZ19Bc0xvbmcocik7CisgICAgICAgICAgICByZXN1bHQgPSBfUHlMb25nX0FzSW50KHIpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KQEAgLTEzMjcsNyArMTM0NCw3IEBACiAKICAgICAvKiB3ZSBoYXZlIGEgdmFsaWQgbGluZSAqLwogICAgIG4gPSBzdHJsZW4ocCk7Ci0gICAgaWYgKG4gPiAwKSB7CisgICAgaWYgKHNob3VsZF9hdXRvX2FkZF9oaXN0b3J5ICYmIG4gPiAwKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmxpbmU7CiAgICAgICAgIGludCBsZW5ndGggPSBfcHlfZ2V0X2hpc3RvcnlfbGVuZ3RoKCk7CiAgICAgICAgIGlmIChsZW5ndGggPiAwKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9yZXNvdXJjZS5jIGIvTW9kdWxlcy9yZXNvdXJjZS5jCmluZGV4IDNhMWNmMDkuLjY3MDJiN2EgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcmVzb3VyY2UuYworKysgYi9Nb2R1bGVzL3Jlc291cmNlLmMKQEAgLTEzNSwxMyArMTM1LDExIEBACiBzdGF0aWMgUHlPYmplY3QqCiBybGltaXQycHkoc3RydWN0IHJsaW1pdCBybCkKIHsKLSNpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKQogICAgIGlmIChzaXplb2YocmwucmxpbV9jdXIpID4gc2l6ZW9mKGxvbmcpKSB7CiAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJMTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQWV9MT05HX0xPTkcpIHJsLnJsaW1fY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFlfTE9OR19MT05HKSBybC5ybGltX21heCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHJsLnJsaW1fY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBybC5ybGltX21heCk7CiAgICAgfQotI2VuZGlmCiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgKGxvbmcpIHJsLnJsaW1fY3VyLCAobG9uZykgcmwucmxpbV9tYXgpOwogfQogCkBAIC00MzgsMTEgKzQzNiw5IEBACiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgUkxJTUlUX05QVFMpOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKQogICAgIGlmIChzaXplb2YoUkxJTV9JTkZJTklUWSkgPiBzaXplb2YobG9uZykpIHsKLSAgICAgICAgdiA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORykgUkxJTV9JTkZJTklUWSk7CisgICAgICAgIHYgPSBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIFJMSU1fSU5GSU5JVFkpOwogICAgIH0gZWxzZQotI2VuZGlmCiAgICAgewogICAgICAgICB2ID0gUHlMb25nX0Zyb21Mb25nKChsb25nKSBSTElNX0lORklOSVRZKTsKICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jIGIvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYwppbmRleCAwMDMyNGE1Li40OWZhMWY1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKQEAgLTQsNiArNCwxMCBAQAogICAgaGF2ZSBhbnkgdmFsdWUgZXhjZXB0IElOVkFMSURfU09DS0VULgogKi8KIAorI2lmIGRlZmluZWQoSEFWRV9QT0xMX0gpICYmICFkZWZpbmVkKF9HTlVfU09VUkNFKQorI2RlZmluZSBfR05VX1NPVVJDRQorI2VuZGlmCisKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlIDxzdHJ1Y3RtZW1iZXIuaD4KIApAQCAtMTc5Myw3ICsxNzk3LDcgQEAKICAqLwogI2lmICFkZWZpbmVkKF9fT3BlbkJTRF9fKQogIyAgIGRlZmluZSBJREVOVF9UWVBFICBUX1VJTlRQVFJUCi0jICAgZGVmaW5lIElERU5UX0NBU1QgIFB5X2ludHB0cl90CisjICAgZGVmaW5lIElERU5UX0NBU1QgIGludHB0cl90CiAjICAgZGVmaW5lIERBVEFfVFlQRSAgIFRfSU5UUFRSVAogIyAgIGRlZmluZSBEQVRBX0ZNVF9VTklUIElOVFBUUlRfRk1UX1VOSVQKICMgICBkZWZpbmUgSURFTlRfQXNUeXBlIFB5TG9uZ19Bc1VpbnRwdHJfdApAQCAtMTg0Miw3ICsxODQ2LDcgQEAKICAgICBQeU9iamVjdCAqcGZkOwogICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiaWRlbnQiLCAiZmlsdGVyIiwgImZsYWdzIiwgImZmbGFncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIiwgInVkYXRhIiwgTlVMTH07Ci0gICAgc3RhdGljIGNoYXIgKmZtdCA9ICJPfGhISSIgREFUQV9GTVRfVU5JVCBVSU5UUFRSVF9GTVRfVU5JVCAiOmtldmVudCI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAiT3xoSEkiIERBVEFfRk1UX1VOSVQgVUlOVFBUUlRfRk1UX1VOSVQgIjprZXZlbnQiOwogCiAgICAgRVZfU0VUKCYoc2VsZi0+ZSksIDAsIEVWRklMVF9SRUFELCBFVl9BREQsIDAsIDAsIDApOyAvKiBkZWZhdWx0cyAqLwogCkBAIC0xODcyLDcgKzE4NzYsNyBAQAoga3F1ZXVlX2V2ZW50X3JpY2hjb21wYXJlKGtxdWV1ZV9ldmVudF9PYmplY3QgKnMsIGtxdWV1ZV9ldmVudF9PYmplY3QgKm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wKQogewotICAgIFB5X2ludHB0cl90IHJlc3VsdCA9IDA7CisgICAgaW50cHRyX3QgcmVzdWx0ID0gMDsKIAogICAgIGlmICgha3F1ZXVlX2V2ZW50X0NoZWNrKG8pKSB7CiAgICAgICAgIGlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkgewpAQCAtMjEyNyw3ICsyMTMxLDcgQEAKICAgICAgICAgaWYgKF9QeVRpbWVfRnJvbVNlY29uZHNPYmplY3QoJnRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aW1lb3V0LCBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpIDwgMCkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAidGltZW91dCBhcmd1bWVudCBtdXN0IGJlIGFuIG51bWJlciAiCisgICAgICAgICAgICAgICAgInRpbWVvdXQgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciAiCiAgICAgICAgICAgICAgICAgIm9yIE5vbmUsIGdvdCAlLjIwMHMiLAogICAgICAgICAgICAgICAgIFB5X1RZUEUob3RpbWVvdXQpLT50cF9uYW1lKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjQ1Miw2ICsyNDU2LDEwIEBACiAjaWZkZWYgUE9MTE1TRwogICAgICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBQT0xMTVNHKTsKICNlbmRpZgorI2lmZGVmIFBPTExSREhVUAorICAgICAgICAvKiBLZXJuZWwgMi42LjE3KyAqLworICAgICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBQT0xMUkRIVVApOworI2VuZGlmCiAgICAgfQogI2VuZGlmIC8qIEhBVkVfUE9MTCAqLwogCkBAIC0yNDczLDEyICsyNDgxLDE4IEBACiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgRVBPTExQUkkpOwogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEVQT0xMRVJSKTsKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBFUE9MTEhVUCk7CisjaWZkZWYgRVBPTExSREhVUAorICAgIC8qIEtlcm5lbCAyLjYuMTcgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBFUE9MTFJESFVQKTsKKyNlbmRpZgogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEVQT0xMRVQpOwogI2lmZGVmIEVQT0xMT05FU0hPVAogICAgIC8qIEtlcm5lbCAyLjYuMisgKi8KICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBFUE9MTE9ORVNIT1QpOwogI2VuZGlmCi0gICAgLyogUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMX1JESFVQIiwgRVBPTExSREhVUCk7ICovCisjaWZkZWYgRVBPTExFWENMVVNJVkUKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBFUE9MTEVYQ0xVU0lWRSk7CisjZW5kaWYKIAogI2lmZGVmIEVQT0xMUkROT1JNCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgRVBPTExSRE5PUk0pOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zaGExbW9kdWxlLmMgYi9Nb2R1bGVzL3NoYTFtb2R1bGUuYwppbmRleCA2Y2IzMmVkLi5kNTA2NWNlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NoYTFtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NoYTFtb2R1bGUuYwpAQCAtMzAsNyArMzAsNyBAQAogCiAjaWYgU0laRU9GX0lOVCA9PSA0CiB0eXBlZGVmIHVuc2lnbmVkIGludCBTSEExX0lOVDMyOyAgICAgICAgLyogMzItYml0IGludGVnZXIgKi8KLXR5cGVkZWYgUFlfTE9OR19MT05HIFNIQTFfSU5UNjQ7ICAgICAgICAvKiA2NC1iaXQgaW50ZWdlciAqLwordHlwZWRlZiBsb25nIGxvbmcgU0hBMV9JTlQ2NDsgICAgICAgIC8qIDY0LWJpdCBpbnRlZ2VyICovCiAjZWxzZQogLyogbm90IGRlZmluZWQuIGNvbXBpbGF0aW9uIHdpbGwgZGllLiAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NoYTUxMm1vZHVsZS5jIGIvTW9kdWxlcy9zaGE1MTJtb2R1bGUuYwppbmRleCBmOWZmMGVhLi5mNWY5ZTE4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NoYTUxMm1vZHVsZS5jCisrKyBiL01vZHVsZXMvc2hhNTEybW9kdWxlLmMKQEAgLTI3LDE1ICsyNywxMyBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9ODFhM2NjZGU5MmJjZmU4ZF0qLwogCi0jaWZkZWYgUFlfTE9OR19MT05HIC8qIElmIG5vIFBZX0xPTkdfTE9ORywgZG9uJ3QgY29tcGlsZSBhbnl0aGluZyEgKi8KLQogLyogU29tZSB1c2VmdWwgdHlwZXMgKi8KIAogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFNIQV9CWVRFOwogCiAjaWYgU0laRU9GX0lOVCA9PSA0CiB0eXBlZGVmIHVuc2lnbmVkIGludCBTSEFfSU5UMzI7IC8qIDMyLWJpdCBpbnRlZ2VyICovCi10eXBlZGVmIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBTSEFfSU5UNjQ7ICAgICAgICAvKiA2NC1iaXQgaW50ZWdlciAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgU0hBX0lOVDY0OyAgICAgICAgLyogNjQtYml0IGludGVnZXIgKi8KICNlbHNlCiAvKiBub3QgZGVmaW5lZC4gY29tcGlsYXRpb24gd2lsbCBkaWUuICovCiAjZW5kaWYKQEAgLTEyMSwxMiArMTE5LDEyIEBACiAKIC8qIFZhcmlvdXMgbG9naWNhbCBmdW5jdGlvbnMgKi8KICNkZWZpbmUgUk9SNjQoeCwgeSkgXAotICAgICggKCgoKHgpICYgUHlfVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpPj4oKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoeSkgJiA2MykpIHwgXAotICAgICAgKCh4KTw8KCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpKDY0LSgoeSkgJiA2MykpKSkpICYgUHlfVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpCisgICAgKCAoKCgoeCkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSk+PigodW5zaWduZWQgbG9uZyBsb25nKSh5KSAmIDYzKSkgfCBcCisgICAgICAoKHgpPDwoKHVuc2lnbmVkIGxvbmcgbG9uZykoNjQtKCh5KSAmIDYzKSkpKSkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSkKICNkZWZpbmUgQ2goeCx5LHopICAgICAgICh6IF4gKHggJiAoeSBeIHopKSkKICNkZWZpbmUgTWFqKHgseSx6KSAgICAgICgoKHggfCB5KSAmIHopIHwgKHggJiB5KSkKICNkZWZpbmUgUyh4LCBuKSAgICAgICAgIFJPUjY0KCh4KSwobikpCi0jZGVmaW5lIFIoeCwgbikgICAgICAgICAoKCh4KSAmIFB5X1VMTCgweEZGRkZGRkZGRkZGRkZGRkYpKSA+PiAoKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyluKSkKKyNkZWZpbmUgUih4LCBuKSAgICAgICAgICgoKHgpICYgUHlfVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpID4+ICgodW5zaWduZWQgbG9uZyBsb25nKW4pKQogI2RlZmluZSBTaWdtYTAoeCkgICAgICAgKFMoeCwgMjgpIF4gUyh4LCAzNCkgXiBTKHgsIDM5KSkKICNkZWZpbmUgU2lnbWExKHgpICAgICAgIChTKHgsIDE0KSBeIFMoeCwgMTgpIF4gUyh4LCA0MSkpCiAjZGVmaW5lIEdhbW1hMCh4KSAgICAgICAoUyh4LCAxKSBeIFMoeCwgOCkgXiBSKHgsIDcpKQpAQCAtODAzLDUgKzgwMSwzIEBACiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSEE1MTJUeXBlIiwgKFB5T2JqZWN0ICopJlNIQTUxMnR5cGUpOwogICAgIHJldHVybiBtOwogfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMgYi9Nb2R1bGVzL3NpZ25hbG1vZHVsZS5jCmluZGV4IGExYTE4YjAuLjhjYTU3OTEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zaWduYWxtb2R1bGUuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiByZXBvcnRfd2FrZXVwX3dyaXRlX2Vycm9yKHZvaWQgKmRhdGEpCiB7CiAgICAgaW50IHNhdmVfZXJybm8gPSBlcnJubzsKLSAgICBlcnJubyA9IChpbnQpIChQeV9pbnRwdHJfdCkgZGF0YTsKKyAgICBlcnJubyA9IChpbnQpIChpbnRwdHJfdCkgZGF0YTsKICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CiAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpZ25vcmVkIHdoZW4gdHJ5aW5nIHRvIHdyaXRlIHRvIHRoZSAiCiAgICAgICAgICAgICAgICAgICAgICAgInNpZ25hbCB3YWtldXAgZmQ6XG4iKTsKQEAgLTI3Nyw3ICsyNzcsNyBAQAogCiAgICAgICAgICAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgICAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwocmVwb3J0X3dha2V1cF93cml0ZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKShQeV9pbnRwdHJfdCllcnJubyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoaW50cHRyX3QpZXJybm8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTc5LDcgKzU3OSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZkID0gKGludClzb2NrZmQ7Ci0gICAgICAgICAgICBpZiAoKFNPQ0tFVF9UKWZkICE9IHNvY2tmZCB8fCAhX1B5VmVyaWZ5X2ZkKGZkKSkgeworICAgICAgICAgICAgaWYgKChTT0NLRVRfVClmZCAhPSBzb2NrZmQpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgZmQiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KQEAgLTYwOSwxMSArNjA5LDYgQEAKICAgICBpZiAoZmQgIT0gLTEpIHsKICAgICAgICAgaW50IGJsb2NraW5nOwogCi0gICAgICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkKSkgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGZkIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCiAgICAgICAgIGlmIChfUHlfZnN0YXQoZmQsICZzdGF0dXMpICE9IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMTI3MSwyMTAgKzEyNjYsMTY5IEBACiAgICAgfQogCiAjaWZkZWYgU0lHSFVQCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdIVVApOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdIVVAiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdIVVApKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHSU5UCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdJTlQpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJTlQiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdJTlQpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHQlJFQUsKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKFNJR0JSRUFLKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQlJFQUsiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdCUkVBSykpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBTSUdRVUlUCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdRVUlUKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUVVJVCIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNJR1FVSVQpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHSUxMCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdJTEwpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJTEwiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdJTEwpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHVFJBUAotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHVFJBUCk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RSQVAiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdUUkFQKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIFNJR0lPVAotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHSU9UKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSU9UIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU0lHSU9UKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIFNJR0FCUlQKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKFNJR0FCUlQpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdBQlJUIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU0lHQUJSVCkpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBTSUdFTVQKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKFNJR0VNVCk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0VNVCIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNJR0VNVCkpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBTSUdGUEUKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKFNJR0ZQRSk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0ZQRSIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNJR0ZQRSkpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBTSUdLSUxMCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdLSUxMKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHS0lMTCIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNJR0tJTEwpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHQlVTCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdCVVMpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdCVVMiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdCVVMpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHU0VHVgotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHU0VHVik7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1NFR1YiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdTRUdWKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIFNJR1NZUwotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHU1lTKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHU1lTIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU0lHU1lTKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIFNJR1BJUEUKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKFNJR1BJUEUpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdQSVBFIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU0lHUElQRSkpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBTSUdBTFJNCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdBTFJNKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQUxSTSIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNJR0FMUk0pKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHVEVSTQotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHVEVSTSk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RFUk0iLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdURVJNKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIFNJR1VTUjEKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKFNJR1VTUjEpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdVU1IxIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU0lHVVNSMSkpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBTSUdVU1IyCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdVU1IyKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVVNSMiIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNJR1VTUjIpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHQ0xECi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdDTEQpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdDTEQiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdDTEQpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHQ0hMRAotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHQ0hMRCk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0NITEQiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdDSExEKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIFNJR1BXUgotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHUFdSKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUFdSIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU0lHUFdSKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIFNJR0lPCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdJTyk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lPIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU0lHSU8pKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHVVJHCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdVUkcpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdVUkciLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdVUkcpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHV0lOQ0gKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKFNJR1dJTkNIKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHV0lOQ0giLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdXSU5DSCkpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBTSUdQT0xMCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdQT0xMKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUE9MTCIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNJR1BPTEwpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHU1RPUAotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHU1RPUCk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1NUT1AiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdTVE9QKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIFNJR1RTVFAKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKFNJR1RTVFApOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdUU1RQIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU0lHVFNUUCkpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBTSUdDT05UCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdDT05UKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQ09OVCIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNJR0NPTlQpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHVFRJTgotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHVFRJTik7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RUSU4iLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdUVElOKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIFNJR1RUT1UKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKFNJR1RUT1UpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdUVE9VIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU0lHVFRPVSkpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBTSUdWVEFMUk0KLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKFNJR1ZUQUxSTSk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1ZUQUxSTSIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNJR1ZUQUxSTSkpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBTSUdQUk9GCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdQUk9GKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUFJPRiIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNJR1BST0YpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHWENQVQotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHWENQVSk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1hDUFUiLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdYQ1BVKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIFNJR1hGU1oKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKFNJR1hGU1opOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdYRlNaIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU0lHWEZTWikpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBTSUdSVE1JTgotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHUlRNSU4pOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdSVE1JTiIsIHgpOwotICAgIFB5X1hERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNJR1JUTUlOKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIFNJR1JUTUFYCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhTSUdSVE1BWCk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1JUTUFYIiwgeCk7Ci0gICAgUHlfWERFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU0lHUlRNQVgpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAjaWZkZWYgU0lHSU5GTwotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoU0lHSU5GTyk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lORk8iLCB4KTsKLSAgICBQeV9YREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTSUdJTkZPKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogCiAjaWZkZWYgSVRJTUVSX1JFQUwKLSAgICB4ID0gUHlMb25nX0Zyb21Mb25nKElUSU1FUl9SRUFMKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSVRJTUVSX1JFQUwiLCB4KTsKLSAgICBQeV9ERUNSRUYoeCk7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIElUSU1FUl9SRUFMKSkKKyAgICAgICAgIGdvdG8gZmluYWxseTsKICNlbmRpZgogI2lmZGVmIElUSU1FUl9WSVJUVUFMCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhJVElNRVJfVklSVFVBTCk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklUSU1FUl9WSVJUVUFMIiwgeCk7Ci0gICAgUHlfREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBJVElNRVJfVklSVFVBTCkpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKICNpZmRlZiBJVElNRVJfUFJPRgotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoSVRJTUVSX1BST0YpOwotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJVElNRVJfUFJPRiIsIHgpOwotICAgIFB5X0RFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgSVRJTUVSX1BST0YpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAKICNpZiBkZWZpbmVkIChIQVZFX1NFVElUSU1FUikgfHwgZGVmaW5lZCAoSEFWRV9HRVRJVElNRVIpCkBAIC0xNDg1LDE1ICsxNDM5LDEzIEBACiAjZW5kaWYKIAogI2lmZGVmIENUUkxfQ19FVkVOVAotICAgIHggPSBQeUxvbmdfRnJvbUxvbmcoQ1RSTF9DX0VWRU5UKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ1RSTF9DX0VWRU5UIiwgeCk7Ci0gICAgUHlfREVDUkVGKHgpOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBDVFJMX0NfRVZFTlQpKQorICAgICAgICAgZ290byBmaW5hbGx5OwogI2VuZGlmCiAKICNpZmRlZiBDVFJMX0JSRUFLX0VWRU5UCi0gICAgeCA9IFB5TG9uZ19Gcm9tTG9uZyhDVFJMX0JSRUFLX0VWRU5UKTsKLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ1RSTF9CUkVBS19FVkVOVCIsIHgpOwotICAgIFB5X0RFQ1JFRih4KTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQ1RSTF9CUkVBS19FVkVOVCkpCisgICAgICAgICBnb3RvIGZpbmFsbHk7CiAjZW5kaWYKIAogI2lmZGVmIE1TX1dJTkRPV1MKZGlmZiAtLWdpdCBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCmluZGV4IGQwNTk2MTcuLmRkOGJmYjAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwpAQCAtMTM2LDcgKzEzNiw3IEBACiBzZW5kKGRhdGFbLCBmbGFnc10pIC0tIHNlbmQgZGF0YSwgbWF5IG5vdCBzZW5kIGFsbCBvZiBpdFxuXAogc2VuZHRvKGRhdGFbLCBmbGFnc10sIGFkZHIpIC0tIHNlbmQgZGF0YSB0byBhIGdpdmVuIGFkZHJlc3NcblwKIHNldGJsb2NraW5nKDAgfCAxKSAtLSBzZXQgb3IgY2xlYXIgdGhlIGJsb2NraW5nIEkvTyBmbGFnXG5cCi1zZXRzb2Nrb3B0KGxldmVsLCBvcHRuYW1lLCB2YWx1ZSkgLS0gc2V0IHNvY2tldCBvcHRpb25zXG5cCitzZXRzb2Nrb3B0KGxldmVsLCBvcHRuYW1lLCB2YWx1ZVssIG9wdGxlbl0pIC0tIHNldCBzb2NrZXQgb3B0aW9uc1xuXAogc2V0dGltZW91dChOb25lIHwgZmxvYXQpIC0tIHNldCBvciBjbGVhciB0aGUgdGltZW91dFxuXAogc2h1dGRvd24oaG93KSAtLSBzaHV0IGRvd24gdHJhZmZpYyBpbiBvbmUgb3IgYm90aCBkaXJlY3Rpb25zXG5cCiBpZl9uYW1laW5kZXgoKSAtLSByZXR1cm4gYWxsIG5ldHdvcmsgaW50ZXJmYWNlIGluZGljZXMgYW5kIG5hbWVzXG5cCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgIE9uIHRoZSBvdGhlciBoYW5kLCBub3QgYWxsIExpbnV4IHZlcnNpb25zIGFncmVlLCBzbyB0aGVyZSB0aGUgc2V0dGluZ3MKICAgIGNvbXB1dGVkIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0IGFyZSBuZWVkZWQhICovCiAKLSNpZm5kZWYgbGludXgKKyNpZm5kZWYgX19saW51eF9fCiAjIHVuZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHCiAjIHVuZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfQVJHCiAjIHVuZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJHCkBAIC0xNjMsNyArMTYzLDExIEBACiAjIGluY2x1ZGUgPHN5cy91aW8uaD4KICNlbmRpZgogCi0jaWZuZGVmIFdJVEhfVEhSRUFECisjaWYgIWRlZmluZWQoV0lUSF9USFJFQUQpCisjIHVuZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmIF9fQU5EUk9JRF9BUElfXyA8IDIzCiAjIHVuZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SCiAjZW5kaWYKIApAQCAtMTcyLDcgKzE3Niw3IEBACiAjICBkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcKICMgZWxpZiBkZWZpbmVkKF9fc3VuKSB8fCBkZWZpbmVkKF9fc2dpKQogIyAgZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfQVJHCi0jIGVsaWYgZGVmaW5lZChsaW51eCkKKyMgZWxpZiBkZWZpbmVkKF9fbGludXhfXykKIC8qIFJlbHkgb24gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgKi8KICMgZWxzZQogIyAgdW5kZWYgSEFWRV9HRVRIT1NUQllOQU1FX1IKQEAgLTI4Miw2ICsyODYsMzYgQEAKICNpbmNsdWRlIDxuZXQvaWYuaD4KICNlbmRpZgogCisjaWZkZWYgSEFWRV9TT0NLQUREUl9BTEcKKyNpbmNsdWRlIDxsaW51eC9pZl9hbGcuaD4KKyNpZm5kZWYgQUZfQUxHCisjZGVmaW5lIEFGX0FMRyAzOAorI2VuZGlmCisjaWZuZGVmIFNPTF9BTEcKKyNkZWZpbmUgU09MX0FMRyAyNzkKKyNlbmRpZgorCisvKiBMaW51eCAzLjE5ICovCisjaWZuZGVmIEFMR19TRVRfQUVBRF9BU1NPQ0xFTgorI2RlZmluZSBBTEdfU0VUX0FFQURfQVNTT0NMRU4gICAgICAgICAgIDQKKyNlbmRpZgorI2lmbmRlZiBBTEdfU0VUX0FFQURfQVVUSFNJWkUKKyNkZWZpbmUgQUxHX1NFVF9BRUFEX0FVVEhTSVpFICAgICAgICAgICA1CisjZW5kaWYKKy8qIExpbnV4IDQuOCAqLworI2lmbmRlZiBBTEdfU0VUX1BVQktFWQorI2RlZmluZSBBTEdfU0VUX1BVQktFWSAgICAgICAgICAgICAgICAgIDYKKyNlbmRpZgorCisjaWZuZGVmIEFMR19PUF9TSUdOCisjZGVmaW5lIEFMR19PUF9TSUdOICAgICAgICAgICAgICAgICAgICAgMgorI2VuZGlmCisjaWZuZGVmIEFMR19PUF9WRVJJRlkKKyNkZWZpbmUgQUxHX09QX1ZFUklGWSAgICAgICAgICAgICAgICAgICAzCisjZW5kaWYKKworI2VuZGlmIC8qIEhBVkVfU09DS0FERFJfQUxHICovCisKIC8qIEdlbmVyaWMgc29ja2V0IG9iamVjdCBkZWZpbml0aW9ucyBhbmQgaW5jbHVkZXMgKi8KICNkZWZpbmUgUHlTb2NrZXRfQlVJTERJTkdfU09DS0VUCiAjaW5jbHVkZSAic29ja2V0bW9kdWxlLmgiCkBAIC02MDYsMjQgKzY0MCwzNSBAQAogI2lmbmRlZiBNU19XSU5ET1dTCiAjaWYgKGRlZmluZWQoSEFWRV9TWVNfSU9DVExfSCkgJiYgZGVmaW5lZChGSU9OQklPKSkKICAgICBibG9jayA9ICFibG9jazsKLSAgICBpb2N0bChzLT5zb2NrX2ZkLCBGSU9OQklPLCAodW5zaWduZWQgaW50ICopJmJsb2NrKTsKKyAgICBpZiAoaW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKHVuc2lnbmVkIGludCAqKSZibG9jaykgPT0gLTEpCisgICAgICAgIGdvdG8gZXJyb3I7CiAjZWxzZQogICAgIGRlbGF5X2ZsYWcgPSBmY250bChzLT5zb2NrX2ZkLCBGX0dFVEZMLCAwKTsKKyAgICBpZiAoZGVsYXlfZmxhZyA9PSAtMSkKKyAgICAgICAgZ290byBlcnJvcjsKICAgICBpZiAoYmxvY2spCiAgICAgICAgIG5ld19kZWxheV9mbGFnID0gZGVsYXlfZmxhZyAmICh+T19OT05CTE9DSyk7CiAgICAgZWxzZQogICAgICAgICBuZXdfZGVsYXlfZmxhZyA9IGRlbGF5X2ZsYWcgfCBPX05PTkJMT0NLOwogICAgIGlmIChuZXdfZGVsYXlfZmxhZyAhPSBkZWxheV9mbGFnKQotICAgICAgICBmY250bChzLT5zb2NrX2ZkLCBGX1NFVEZMLCBuZXdfZGVsYXlfZmxhZyk7CisgICAgICAgIGlmIChmY250bChzLT5zb2NrX2ZkLCBGX1NFVEZMLCBuZXdfZGVsYXlfZmxhZykgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGVycm9yOwogI2VuZGlmCiAjZWxzZSAvKiBNU19XSU5ET1dTICovCiAgICAgYXJnID0gIWJsb2NrOwotICAgIGlvY3Rsc29ja2V0KHMtPnNvY2tfZmQsIEZJT05CSU8sICZhcmcpOworICAgIGlmIChpb2N0bHNvY2tldChzLT5zb2NrX2ZkLCBGSU9OQklPLCAmYXJnKSAhPSAwKQorICAgICAgICBnb3RvIGVycm9yOwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0gICAgLyogU2luY2UgdGhlc2UgZG9uJ3QgcmV0dXJuIGFueXRoaW5nICovCi0gICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIGVycm9yOgorI2lmbmRlZiBNU19XSU5ET1dTCisgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworI2Vsc2UKKyAgICBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycihQeUV4Y19PU0Vycm9yLCBXU0FHZXRMYXN0RXJyb3IoKSk7CisjZW5kaWYKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTg3MSw3ICs5MTYsNyBAQAogLyogRGVmYXVsdCB0aW1lb3V0IGZvciBuZXcgc29ja2V0cyAqLwogc3RhdGljIF9QeVRpbWVfdCBkZWZhdWx0dGltZW91dCA9IF9QWVRJTUVfRlJPTVNFQ09ORFMoLTEpOwogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogaW5pdF9zb2Nrb2JqZWN0KFB5U29ja2V0U29ja09iamVjdCAqcywKICAgICAgICAgICAgICAgICBTT0NLRVRfVCBmZCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90bykKIHsKQEAgLTg4OCwxMCArOTMzLDEzIEBACiAjZW5kaWYKICAgICB7CiAgICAgICAgIHMtPnNvY2tfdGltZW91dCA9IGRlZmF1bHR0aW1lb3V0OwotICAgICAgICBpZiAoZGVmYXVsdHRpbWVvdXQgPj0gMCkKLSAgICAgICAgICAgIGludGVybmFsX3NldGJsb2NraW5nKHMsIDApOworICAgICAgICBpZiAoZGVmYXVsdHRpbWVvdXQgPj0gMCkgeworICAgICAgICAgICAgaWYgKGludGVybmFsX3NldGJsb2NraW5nKHMsIDApID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQotCisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtOTA2LDggKzk1NCwxMiBAQAogICAgIFB5U29ja2V0U29ja09iamVjdCAqczsKICAgICBzID0gKFB5U29ja2V0U29ja09iamVjdCAqKQogICAgICAgICBQeVR5cGVfR2VuZXJpY05ldygmc29ja190eXBlLCBOVUxMLCBOVUxMKTsKLSAgICBpZiAocyAhPSBOVUxMKQotICAgICAgICBpbml0X3NvY2tvYmplY3QocywgZmQsIGZhbWlseSwgdHlwZSwgcHJvdG8pOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChpbml0X3NvY2tvYmplY3QocywgZmQsIGZhbWlseSwgdHlwZSwgcHJvdG8pID09IC0xKSB7CisgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIHJldHVybiBzOwogfQogCkBAIC05MjYsNyArOTc4LDcgQEAKICAgIGFuIGVycm9yIG9jY3VycmVkOyB0aGVuIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuICovCiAKIHN0YXRpYyBpbnQKLXNldGlwYWRkcihjaGFyICpuYW1lLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJfcmV0LCBzaXplX3QgYWRkcl9yZXRfc2l6ZSwgaW50IGFmKQorc2V0aXBhZGRyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkciAqYWRkcl9yZXQsIHNpemVfdCBhZGRyX3JldF9zaXplLCBpbnQgYWYpCiB7CiAgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzOwogICAgIGludCBlcnJvcjsKQEAgLTExMDcsNyArMTE1OSw3IEBACiAgICBhbiBlcnJvciBvY2N1cnJlZC4gKi8KIAogc3RhdGljIGludAotc2V0YmRhZGRyKGNoYXIgKm5hbWUsIGJkYWRkcl90ICpiZGFkZHIpCitzZXRiZGFkZHIoY29uc3QgY2hhciAqbmFtZSwgYmRhZGRyX3QgKmJkYWRkcikKIHsKICAgICB1bnNpZ25lZCBpbnQgYjAsIGIxLCBiMiwgYjMsIGI0LCBiNTsKICAgICBjaGFyIGNoOwpAQCAtMTE4MCw3ICsxMjMyLDcgQEAKICAgICBjYXNlIEFGX1VOSVg6CiAgICAgewogICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gKmEgPSAoc3RydWN0IHNvY2thZGRyX3VuICopIGFkZHI7Ci0jaWZkZWYgbGludXgKKyNpZmRlZiBfX2xpbnV4X18KICAgICAgICAgaWYgKGEtPnN1bl9wYXRoWzBdID09IDApIHsgIC8qIExpbnV4IGFic3RyYWN0IG5hbWVzcGFjZSAqLwogICAgICAgICAgICAgYWRkcmxlbiAtPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKTsKICAgICAgICAgICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKGEtPnN1bl9wYXRoLCBhZGRybGVuKTsKQEAgLTEzNzEsNiArMTQyMywyMiBAQAogICAgICAgICB9CiAjZW5kaWYKIAorI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCisgICAgY2FzZSBBRl9BTEc6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfYWxnICphID0gKHN0cnVjdCBzb2NrYWRkcl9hbGcgKilhZGRyOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyNzI0hIIiwKKyAgICAgICAgICAgIGEtPnNhbGdfdHlwZSwKKyAgICAgICAgICAgIHN0cm5sZW4oKGNvbnN0IGNoYXIqKWEtPnNhbGdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGEtPnNhbGdfdHlwZSkpLAorICAgICAgICAgICAgYS0+c2FsZ19uYW1lLAorICAgICAgICAgICAgc3RybmxlbigoY29uc3QgY2hhciopYS0+c2FsZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYS0+c2FsZ19uYW1lKSksCisgICAgICAgICAgICBhLT5zYWxnX2ZlYXQsCisgICAgICAgICAgICBhLT5zYWxnX21hc2spOworICAgIH0KKyNlbmRpZgorCiAgICAgLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCiAKICAgICBkZWZhdWx0OgpAQCAtMTQwMSw3ICsxNDY5LDcgQEAKIGlkbmFfY29udmVydGVyKFB5T2JqZWN0ICpvYmosIHN0cnVjdCBtYXliZV9pZG5hICpkYXRhKQogewogICAgIHNpemVfdCBsZW47Ci0gICAgUHlPYmplY3QgKm9iajIsICpvYmozOworICAgIFB5T2JqZWN0ICpvYmoyOwogICAgIGlmIChvYmogPT0gTlVMTCkgewogICAgICAgICBpZG5hX2NsZWFudXAoZGF0YSk7CiAgICAgICAgIHJldHVybiAxOwpAQCAtMTQxNiwzMSArMTQ4NCwyNyBAQAogICAgICAgICBkYXRhLT5idWYgPSBQeUJ5dGVBcnJheV9Bc1N0cmluZyhvYmopOwogICAgICAgICBsZW4gPSBQeUJ5dGVBcnJheV9TaXplKG9iaik7CiAgICAgfQotICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhvYmopICYmIFB5VW5pY29kZV9SRUFEWShvYmopID09IDAgJiYgUHlVbmljb2RlX0lTX0NPTVBBQ1RfQVNDSUkob2JqKSkgewotICAgICAgICBkYXRhLT5idWYgPSBQeVVuaWNvZGVfREFUQShvYmopOwotICAgICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChvYmopOworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKSB7CisgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRFkob2JqKSA9PSAwICYmIFB5VW5pY29kZV9JU19DT01QQUNUX0FTQ0lJKG9iaikpIHsKKyAgICAgICAgICAgIGRhdGEtPmJ1ZiA9IFB5VW5pY29kZV9EQVRBKG9iaik7CisgICAgICAgICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChvYmopOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgb2JqMiA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcob2JqLCAiaWRuYSIsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFvYmoyKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImVuY29kaW5nIG9mIGhvc3RuYW1lIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sob2JqMikpOworICAgICAgICAgICAgZGF0YS0+b2JqID0gb2JqMjsKKyAgICAgICAgICAgIGRhdGEtPmJ1ZiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKG9iajIpOworICAgICAgICAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShvYmoyKTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgb2JqMiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KG9iaik7Ci0gICAgICAgIGlmICghb2JqMikgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0cmluZyBvciB1bmljb2RlIHRleHQgYnVmZmVyIGV4cGVjdGVkLCBub3QgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBvYmozID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhvYmoyLCAiaWRuYSIsIE5VTEwpOwotICAgICAgICBQeV9ERUNSRUYob2JqMik7Ci0gICAgICAgIGlmICghb2JqMykgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImVuY29kaW5nIG9mIGhvc3RuYW1lIGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrKG9iajMpKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYob2JqMyk7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZW5jb2Rpbmcgb2YgaG9zdG5hbWUgZmFpbGVkIHRvIHJldHVybiBieXRlcyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS0+b2JqID0gb2JqMzsKLSAgICAgICAgZGF0YS0+YnVmID0gUHlCeXRlc19BU19TVFJJTkcob2JqMyk7Ci0gICAgICAgIGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUob2JqMyk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJzdHIsIGJ5dGVzIG9yIGJ5dGVhcnJheSBleHBlY3RlZCwgbm90ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoc3RybGVuKGRhdGEtPmJ1ZikgIT0gbGVuKSB7CiAgICAgICAgIFB5X0NMRUFSKGRhdGEtPm9iaik7CkBAIC0xNDgzLDcgKzE1NDcsNyBAQAogICAgICAgICBhc3NlcnQocGF0aC5sZW4gPj0gMCk7CiAKICAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4qKWFkZHJfcmV0OwotI2lmZGVmIGxpbnV4CisjaWZkZWYgX19saW51eF9fCiAgICAgICAgIGlmIChwYXRoLmxlbiA+IDAgJiYgKihjb25zdCBjaGFyICopcGF0aC5idWYgPT0gMCkgewogICAgICAgICAgICAgLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlIGV4dGVuc2lvbiAqLwogICAgICAgICAgICAgaWYgKChzaXplX3QpcGF0aC5sZW4gPiBzaXplb2YgYWRkci0+c3VuX3BhdGgpIHsKQEAgLTE5NDAsNiArMjAwNCwzNiBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICNlbmRpZgorI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCisgICAgY2FzZSBBRl9BTEc6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfYWxnICpzYTsKKyAgICAgICAgY2hhciAqdHlwZTsKKyAgICAgICAgY2hhciAqbmFtZTsKKyAgICAgICAgc2EgPSAoc3RydWN0IHNvY2thZGRyX2FsZyAqKWFkZHJfcmV0OworCisgICAgICAgIG1lbXNldChzYSwgMCwgc2l6ZW9mKCpzYSkpOworICAgICAgICBzYS0+c2FsZ19mYW1pbHkgPSBBRl9BTEc7CisKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xISDpnZXRzb2NrYWRkcmFyZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlLCAmbmFtZSwgJnNhLT5zYWxnX2ZlYXQsICZzYS0+c2FsZ19tYXNrKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAvKiBzb2NrYWRkcl9hbGcgaGFzIGZpeGVkLXNpemVkIGNoYXIgYXJyYXlzIGZvciB0eXBlIGFuZCBuYW1lICovCisgICAgICAgIGlmIChzdHJsZW4odHlwZSkgPiBzaXplb2Yoc2EtPnNhbGdfdHlwZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiQUZfQUxHIHR5cGUgdG9vIGxvbmcuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzdHJuY3B5KChjaGFyICopc2EtPnNhbGdfdHlwZSwgdHlwZSwgc2l6ZW9mKHNhLT5zYWxnX3R5cGUpKTsKKyAgICAgICAgaWYgKHN0cmxlbihuYW1lKSA+IHNpemVvZihzYS0+c2FsZ19uYW1lKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJBRl9BTEcgbmFtZSB0b28gbG9uZy4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkoKGNoYXIgKilzYS0+c2FsZ19uYW1lLCBuYW1lLCBzaXplb2Yoc2EtPnNhbGdfbmFtZSkpOworCisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mKCpzYSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgogCiAgICAgLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCiAKQEAgLTIwNjEsNiArMjE1NSwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICNlbmRpZgorI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCisgICAgY2FzZSBBRl9BTEc6CisgICAgeworICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2FsZyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgogCiAgICAgLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCiAKQEAgLTIyMjAsMTAgKzIzMjEsMjEgQEAKIHNvY2tfYWNjZXB0X2ltcGwoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCB2b2lkICpkYXRhKQogewogICAgIHN0cnVjdCBzb2NrX2FjY2VwdCAqY3R4ID0gZGF0YTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBTQVMyU0EoY3R4LT5hZGRyYnVmKTsKKyAgICBzb2NrbGVuX3QgKnBhZGRybGVuID0gY3R4LT5hZGRybGVuOworI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCisgICAgLyogQUZfQUxHIGRvZXMgbm90IHN1cHBvcnQgYWNjZXB0KCkgd2l0aCBhZGRyIGFuZCByYWlzZXMKKyAgICAgKiBFQ09OTkFCT1JURUQgaW5zdGVhZC4gKi8KKyAgICBpZiAocy0+c29ja19mYW1pbHkgPT0gQUZfQUxHKSB7CisgICAgICAgIGFkZHIgPSBOVUxMOworICAgICAgICBwYWRkcmxlbiA9IE5VTEw7CisgICAgICAgICpjdHgtPmFkZHJsZW4gPSAwOworICAgIH0KKyNlbmRpZgogCiAjaWYgZGVmaW5lZChIQVZFX0FDQ0VQVDQpICYmIGRlZmluZWQoU09DS19DTE9FWEVDKQogICAgIGlmIChhY2NlcHQ0X3dvcmtzICE9IDApIHsKLSAgICAgICAgY3R4LT5yZXN1bHQgPSBhY2NlcHQ0KHMtPnNvY2tfZmQsIFNBUzJTQShjdHgtPmFkZHJidWYpLCBjdHgtPmFkZHJsZW4sCisgICAgICAgIGN0eC0+cmVzdWx0ID0gYWNjZXB0NChzLT5zb2NrX2ZkLCBhZGRyLCBwYWRkcmxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQ0tfQ0xPRVhFQyk7CiAgICAgICAgIGlmIChjdHgtPnJlc3VsdCA9PSBJTlZBTElEX1NPQ0tFVCAmJiBhY2NlcHQ0X3dvcmtzID09IC0xKSB7CiAgICAgICAgICAgICAvKiBPbiBMaW51eCBvbGRlciB0aGFuIDIuNi4yOCwgYWNjZXB0NCgpIGZhaWxzIHdpdGggRU5PU1lTICovCkBAIC0yMjMxLDkgKzIzNDMsOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChhY2NlcHQ0X3dvcmtzID09IDApCi0gICAgICAgIGN0eC0+cmVzdWx0ID0gYWNjZXB0KHMtPnNvY2tfZmQsIFNBUzJTQShjdHgtPmFkZHJidWYpLCBjdHgtPmFkZHJsZW4pOworICAgICAgICBjdHgtPnJlc3VsdCA9IGFjY2VwdChzLT5zb2NrX2ZkLCBhZGRyLCBwYWRkcmxlbik7CiAjZWxzZQotICAgIGN0eC0+cmVzdWx0ID0gYWNjZXB0KHMtPnNvY2tfZmQsIFNBUzJTQShjdHgtPmFkZHJidWYpLCBjdHgtPmFkZHJsZW4pOworICAgIGN0eC0+cmVzdWx0ID0gYWNjZXB0KHMtPnNvY2tfZmQsIGFkZHIsIHBhZGRybGVuKTsKICNlbmRpZgogCiAjaWZkZWYgTVNfV0lORE9XUwpAQCAtMjMyOSwxMCArMjQ0MSwxMCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHMtPnNvY2tfdGltZW91dCA9IF9QeVRpbWVfRnJvbVNlY29uZHMoYmxvY2sgPyAtMSA6IDApOwotICAgIGludGVybmFsX3NldGJsb2NraW5nKHMsIGJsb2NrKTsKLQotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoaW50ZXJuYWxfc2V0YmxvY2tpbmcocywgYmxvY2spID09IC0xKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldGJsb2NraW5nX2RvYywKQEAgLTIzOTgsMTAgKzI1MTAsMTAgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzLT5zb2NrX3RpbWVvdXQgPSB0aW1lb3V0OwotICAgIGludGVybmFsX3NldGJsb2NraW5nKHMsIHRpbWVvdXQgPCAwKTsKLQotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoaW50ZXJuYWxfc2V0YmxvY2tpbmcocywgdGltZW91dCA8IDApID09IC0xKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldHRpbWVvdXRfZG9jLApAQCAtMjQzNSw5ICsyNTQ3LDEyIEBACiBvcGVyYXRpb25zIGFyZSBkaXNhYmxlZC4iKTsKIAogLyogcy5zZXRzb2Nrb3B0KCkgbWV0aG9kLgotICAgV2l0aCBhbiBpbnRlZ2VyIHRoaXJkIGFyZ3VtZW50LCBzZXRzIGFuIGludGVnZXIgb3B0aW9uLgorICAgV2l0aCBhbiBpbnRlZ2VyIHRoaXJkIGFyZ3VtZW50LCBzZXRzIGFuIGludGVnZXIgb3B0dmFsIHdpdGggb3B0bGVuPTQuCisgICBXaXRoIE5vbmUgYXMgdGhpcmQgYXJndW1lbnQgYW5kIGFuIGludGVnZXIgZm91cnRoIGFyZ3VtZW50LCBzZXQKKyAgIG9wdHZhbD1OVUxMIHdpdGggdW5zaWduZWQgaW50IGFzIG9wdGxlbi4KICAgIFdpdGggYSBzdHJpbmcgdGhpcmQgYXJndW1lbnQsIHNldHMgYW4gb3B0aW9uIGZyb20gYSBidWZmZXI7Ci0gICB1c2Ugb3B0aW9uYWwgYnVpbHQtaW4gbW9kdWxlICdzdHJ1Y3QnIHRvIGVuY29kZSB0aGUgc3RyaW5nLiAqLworICAgdXNlIG9wdGlvbmFsIGJ1aWx0LWluIG1vZHVsZSAnc3RydWN0JyB0byBlbmNvZGUgdGhlIHN0cmluZy4KKyovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NldHNvY2tvcHQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKQEAgLTI0NDcsMzEgKzI1NjIsNjQgQEAKICAgICBpbnQgcmVzOwogICAgIFB5X2J1ZmZlciBvcHR2YWw7CiAgICAgaW50IGZsYWc7CisgICAgdW5zaWduZWQgaW50IG9wdGxlbjsKKyAgICBQeU9iamVjdCAqbm9uZTsKIAorICAgIC8qIHNldHNvY2tvcHQobGV2ZWwsIG9wdCwgZmxhZykgKi8KICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOnNldHNvY2tvcHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCwgJm9wdG5hbWUsICZmbGFnKSkgewogICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikmZmxhZywgc2l6ZW9mIGZsYWcpOworICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpeSo6c2V0c29ja29wdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwsICZvcHRuYW1lLCAmb3B0dmFsKSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwuYnVmLCBvcHR2YWwubGVuKTsKKworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgLyogc2V0c29ja29wdChsZXZlbCwgb3B0LCBOb25lLCBmbGFnKSAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaU8hSTpzZXRzb2Nrb3B0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwsICZvcHRuYW1lLCBQeV9UWVBFKFB5X05vbmUpLCAmbm9uZSwgJm9wdGxlbikpIHsKKyAgICAgICAgYXNzZXJ0KHNpemVvZihzb2NrbGVuX3QpID49IHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKyAgICAgICAgcmVzID0gc2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAoc29ja2xlbl90KW9wdGxlbik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBQeUVycl9DbGVhcigpOworICAgIC8qIHNldHNvY2tvcHQobGV2ZWwsIG9wdCwgYnVmZmVyKSAqLworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWl5KjpzZXRzb2Nrb3B0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwsICZvcHRuYW1lLCAmb3B0dmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgaWYgKG9wdHZhbC5sZW4gPiBJTlRfTUFYKSB7CiAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJm9wdHZhbCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNvY2tldCBvcHRpb24gaXMgbGFyZ2VyIHRoYW4gJWkgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UX01BWCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAocmVzIDwgMCkKKyAgICByZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0dmFsLmJ1ZiwgKGludClvcHR2YWwubGVuKTsKKyNlbHNlCisgICAgcmVzID0gc2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLmJ1Ziwgb3B0dmFsLmxlbik7CisjZW5kaWYKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZvcHR2YWwpOworCitkb25lOgorICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorCisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXRzb2Nrb3B0X2RvYywKLSJzZXRzb2Nrb3B0KGxldmVsLCBvcHRpb24sIHZhbHVlKVxuXAorInNldHNvY2tvcHQobGV2ZWwsIG9wdGlvbiwgdmFsdWU6IGludClcblwKK3NldHNvY2tvcHQobGV2ZWwsIG9wdGlvbiwgdmFsdWU6IGJ1ZmZlcilcblwKK3NldHNvY2tvcHQobGV2ZWwsIG9wdGlvbiwgTm9uZSwgb3B0bGVuOiBpbnQpXG5cCiBcblwKIFNldCBhIHNvY2tldCBvcHRpb24uICBTZWUgdGhlIFVuaXggbWFudWFsIGZvciBsZXZlbCBhbmQgb3B0aW9uLlxuXAotVGhlIHZhbHVlIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZy4iKTsKK1RoZSB2YWx1ZSBhcmd1bWVudCBjYW4gZWl0aGVyIGJlIGFuIGludGVnZXIsIGEgc3RyaW5nIGJ1ZmZlciwgb3IgXG5cCitOb25lLCBvcHRsZW4uIik7CiAKIAogLyogcy5nZXRzb2Nrb3B0KCkgbWV0aG9kLgpAQCAtMjU2MywxNyArMjcxMSwyMiBAQAogc29ja19jbG9zZShQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7CiAgICAgU09DS0VUX1QgZmQ7CisgICAgaW50IHJlczsKIAotICAgIC8qIFdlIGRvIG5vdCB3YW50IHRvIHJldHJ5IHVwb24gRUlOVFI6IHNlZSBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy81NzY0NzgvCi0gICAgICogYW5kIGh0dHA6Ly9saW51eC5kZXJrZWlsZXIuY29tL01haWxpbmctTGlzdHMvS2VybmVsLzIwMDUtMDkvMzAwMC5odG1sCi0gICAgICogZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgKi8KICAgICBmZCA9IHMtPnNvY2tfZmQ7CiAgICAgaWYgKGZkICE9IElOVkFMSURfU09DS0VUKSB7CiAgICAgICAgIHMtPnNvY2tfZmQgPSBJTlZBTElEX1NPQ0tFVDsKKworICAgICAgICAvKiBXZSBkbyBub3Qgd2FudCB0byByZXRyeSB1cG9uIEVJTlRSOiBzZWUKKyAgICAgICAgICAgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvNTc2NDc4LyBhbmQKKyAgICAgICAgICAgaHR0cDovL2xpbnV4LmRlcmtlaWxlci5jb20vTWFpbGluZy1MaXN0cy9LZXJuZWwvMjAwNS0wOS8zMDAwLmh0bWwKKyAgICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4gKi8KICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICAodm9pZCkgU09DS0VUQ0xPU0UoZmQpOworICAgICAgICByZXMgPSBTT0NLRVRDTE9TRShmZCk7CiAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwpAQCAtMzc1Niw2ICszOTA5LDUxIEBACiB9OwogCiBzdGF0aWMgaW50Citzb2NrX3NlbmRtc2dfaW92ZWMoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqZGF0YV9hcmcsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLAorICAgICAgICAgICAgICAgICAgIFB5X2J1ZmZlciAqKmRhdGFidWZzb3V0LCBQeV9zc2l6ZV90ICpuZGF0YWJ1ZnNvdXQpIHsKKyAgICBQeV9zc2l6ZV90IG5kYXRhcGFydHMsIG5kYXRhYnVmcyA9IDA7CisgICAgaW50IHJlc3VsdCA9IC0xOworICAgIHN0cnVjdCBpb3ZlYyAqaW92cyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRhdGFfZmFzdCA9IE5VTEw7CisgICAgUHlfYnVmZmVyICpkYXRhYnVmcyA9IE5VTEw7CisKKyAgICAvKiBGaWxsIGluIGFuIGlvdmVjIGZvciBlYWNoIG1lc3NhZ2UgcGFydCwgYW5kIHNhdmUgdGhlIFB5X2J1ZmZlcgorICAgICAgIHN0cnVjdHMgdG8gcmVsZWFzZSBhZnRlcndhcmRzLiAqLworICAgIGlmICgoZGF0YV9mYXN0ID0gUHlTZXF1ZW5jZV9GYXN0KGRhdGFfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kbXNnKCkgYXJndW1lbnQgMSBtdXN0IGJlIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcmFibGUiKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIG5kYXRhcGFydHMgPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZGF0YV9mYXN0KTsKKyAgICBpZiAobmRhdGFwYXJ0cyA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsICJzZW5kbXNnKCkgYXJndW1lbnQgMSBpcyB0b28gbG9uZyIpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIG1zZy0+bXNnX2lvdmxlbiA9IG5kYXRhcGFydHM7CisgICAgaWYgKG5kYXRhcGFydHMgPiAwICYmCisgICAgICAgICgobXNnLT5tc2dfaW92ID0gaW92cyA9IFB5TWVtX05ldyhzdHJ1Y3QgaW92ZWMsIG5kYXRhcGFydHMpKSA9PSBOVUxMIHx8CisgICAgICAgICAoZGF0YWJ1ZnMgPSBQeU1lbV9OZXcoUHlfYnVmZmVyLCBuZGF0YXBhcnRzKSkgPT0gTlVMTCkpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBmb3IgKDsgbmRhdGFidWZzIDwgbmRhdGFwYXJ0czsgbmRhdGFidWZzKyspIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oZGF0YV9mYXN0LCBuZGF0YWJ1ZnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ5KjtzZW5kbXNnKCkgYXJndW1lbnQgMSBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMtbGlrZSBvYmplY3RzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJ1ZnNbbmRhdGFidWZzXSkpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIGlvdnNbbmRhdGFidWZzXS5pb3ZfYmFzZSA9IGRhdGFidWZzW25kYXRhYnVmc10uYnVmOworICAgICAgICBpb3ZzW25kYXRhYnVmc10uaW92X2xlbiA9IGRhdGFidWZzW25kYXRhYnVmc10ubGVuOworICAgIH0KKyAgICByZXN1bHQgPSAwOworICBmaW5hbGx5OgorICAgICpkYXRhYnVmc291dCA9IGRhdGFidWZzOworICAgICpuZGF0YWJ1ZnNvdXQgPSBuZGF0YWJ1ZnM7CisgICAgUHlfWERFQ1JFRihkYXRhX2Zhc3QpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKIHNvY2tfc2VuZG1zZ19pbXBsKFB5U29ja2V0U29ja09iamVjdCAqcywgdm9pZCAqZGF0YSkKIHsKICAgICBzdHJ1Y3Qgc29ja19zZW5kbXNnICpjdHggPSBkYXRhOwpAQCAtMzc2OSw5ICszOTY3LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NlbmRtc2coUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IGksIG5kYXRhcGFydHMsIG5kYXRhYnVmcyA9IDAsIG5jbXNncywgbmNtc2didWZzID0gMDsKKyAgICBQeV9zc2l6ZV90IGksIG5kYXRhYnVmcyA9IDAsIG5jbXNncywgbmNtc2didWZzID0gMDsKICAgICBQeV9idWZmZXIgKmRhdGFidWZzID0gTlVMTDsKLSAgICBzdHJ1Y3QgaW92ZWMgKmlvdnMgPSBOVUxMOwogICAgIHNvY2tfYWRkcl90IGFkZHJidWY7CiAgICAgc3RydWN0IG1zZ2hkciBtc2cgPSB7MH07CiAgICAgc3RydWN0IGNtc2dpbmZvIHsKQEAgLTM3ODIsNyArMzk3OSw3IEBACiAgICAgdm9pZCAqY29udHJvbGJ1ZiA9IE5VTEw7CiAgICAgc2l6ZV90IGNvbnRyb2xsZW4sIGNvbnRyb2xsZW5fbGFzdDsKICAgICBpbnQgYWRkcmxlbiwgZmxhZ3MgPSAwOwotICAgIFB5T2JqZWN0ICpkYXRhX2FyZywgKmNtc2dfYXJnID0gTlVMTCwgKmFkZHJfYXJnID0gTlVMTCwgKmRhdGFfZmFzdCA9IE5VTEwsCisgICAgUHlPYmplY3QgKmRhdGFfYXJnLCAqY21zZ19hcmcgPSBOVUxMLCAqYWRkcl9hcmcgPSBOVUxMLAogICAgICAgICAqY21zZ19mYXN0ID0gTlVMTCwgKnJldHZhbCA9IE5VTEw7CiAgICAgc3RydWN0IHNvY2tfc2VuZG1zZyBjdHg7CiAKQEAgLTM4MDAsMzAgKzM5OTcsOCBAQAogCiAgICAgLyogRmlsbCBpbiBhbiBpb3ZlYyBmb3IgZWFjaCBtZXNzYWdlIHBhcnQsIGFuZCBzYXZlIHRoZSBQeV9idWZmZXIKICAgICAgICBzdHJ1Y3RzIHRvIHJlbGVhc2UgYWZ0ZXJ3YXJkcy4gKi8KLSAgICBpZiAoKGRhdGFfZmFzdCA9IFB5U2VxdWVuY2VfRmFzdChkYXRhX2FyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZG1zZygpIGFyZ3VtZW50IDEgbXVzdCBiZSBhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhYmxlIikpID09IE5VTEwpCisgICAgaWYgKHNvY2tfc2VuZG1zZ19pb3ZlYyhzLCBkYXRhX2FyZywgJm1zZywgJmRhdGFidWZzLCAmbmRhdGFidWZzKSA9PSAtMSkgewogICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgbmRhdGFwYXJ0cyA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShkYXRhX2Zhc3QpOwotICAgIGlmIChuZGF0YXBhcnRzID4gSU5UX01BWCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT1NFcnJvciwgInNlbmRtc2coKSBhcmd1bWVudCAxIGlzIHRvbyBsb25nIik7Ci0gICAgICAgIGdvdG8gZmluYWxseTsKLSAgICB9Ci0gICAgbXNnLm1zZ19pb3ZsZW4gPSBuZGF0YXBhcnRzOwotICAgIGlmIChuZGF0YXBhcnRzID4gMCAmJgotICAgICAgICAoKG1zZy5tc2dfaW92ID0gaW92cyA9IFB5TWVtX05ldyhzdHJ1Y3QgaW92ZWMsIG5kYXRhcGFydHMpKSA9PSBOVUxMIHx8Ci0gICAgICAgICAoZGF0YWJ1ZnMgPSBQeU1lbV9OZXcoUHlfYnVmZmVyLCBuZGF0YXBhcnRzKSkgPT0gTlVMTCkpIHsKLSAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgZ290byBmaW5hbGx5OwotICAgIH0KLSAgICBmb3IgKDsgbmRhdGFidWZzIDwgbmRhdGFwYXJ0czsgbmRhdGFidWZzKyspIHsKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oZGF0YV9mYXN0LCBuZGF0YWJ1ZnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJ5KjtzZW5kbXNnKCkgYXJndW1lbnQgMSBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMtbGlrZSBvYmplY3RzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJ1ZnNbbmRhdGFidWZzXSkpCi0gICAgICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgICAgIGlvdnNbbmRhdGFidWZzXS5pb3ZfYmFzZSA9IGRhdGFidWZzW25kYXRhYnVmc10uYnVmOwotICAgICAgICBpb3ZzW25kYXRhYnVmc10uaW92X2xlbiA9IGRhdGFidWZzW25kYXRhYnVmc10ubGVuOwogICAgIH0KIAogICAgIGlmIChjbXNnX2FyZyA9PSBOVUxMKQpAQCAtMzk1NCw4ICs0MTI5LDYgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgbmRhdGFidWZzOyBpKyspCiAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGFidWZzW2ldKTsKICAgICBQeU1lbV9GcmVlKGRhdGFidWZzKTsKLSAgICBQeU1lbV9GcmVlKGlvdnMpOwotICAgIFB5X1hERUNSRUYoZGF0YV9mYXN0KTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCkBAIC0zOTc3LDYgKzQxNTAsMTY1IEBACiBkYXRhIHNlbnQuIik7CiAjZW5kaWYgICAgLyogQ01TR19MRU4gKi8KIAorI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCitzdGF0aWMgUHlPYmplY3QqCitzb2NrX3NlbmRtc2dfYWZhbGcoUHlTb2NrZXRTb2NrT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CisKKyAgICBQeV9zc2l6ZV90IGksIG5kYXRhYnVmcyA9IDA7CisgICAgUHlfYnVmZmVyICpkYXRhYnVmcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRhdGFfYXJnID0gTlVMTDsKKworICAgIFB5X2J1ZmZlciBpdiA9IHtOVUxMLCBOVUxMfTsKKworICAgIFB5T2JqZWN0ICpvcG9iaiA9IE5VTEw7CisgICAgaW50IG9wID0gLTE7CisKKyAgICBQeU9iamVjdCAqYXNzb2NsZW5vYmogPSBOVUxMOworICAgIGludCBhc3NvY2xlbiA9IC0xOworCisgICAgdW5zaWduZWQgaW50ICp1aXB0cjsKKyAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgc3RydWN0IG1zZ2hkciBtc2c7CisgICAgc3RydWN0IGNtc2doZHIgKmhlYWRlciA9IE5VTEw7CisgICAgc3RydWN0IGFmX2FsZ19pdiAqYWxnX2l2ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc29ja19zZW5kbXNnIGN0eDsKKyAgICBQeV9zc2l6ZV90IGNvbnRyb2xsZW47CisgICAgdm9pZCAqY29udHJvbGJ1ZiA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7Im1zZyIsICJvcCIsICJpdiIsICJhc3NvY2xlbiIsICJmbGFncyIsIDB9OworCisgICAgaWYgKHNlbGYtPnNvY2tfZmFtaWx5ICE9IEFGX0FMRykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbGdzZXQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIEFGX0FMRyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8TyRPIXkqTyFpOnNlbmRtc2dfYWZhbGciLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YV9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5TG9uZ19UeXBlLCAmb3BvYmosICZpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlMb25nX1R5cGUsICZhc3NvY2xlbm9iaiwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBvcCBpcyBhIHJlcXVpcmVkLCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgPj0gMCAqLworICAgIGlmIChvcG9iaiAhPSBOVUxMKSB7CisgICAgICAgIG9wID0gX1B5TG9uZ19Bc0ludChvcG9iaik7CisgICAgfQorICAgIGlmIChvcCA8IDApIHsKKyAgICAgICAgLyogb3ZlcnJpZGUgZXhjZXB0aW9uIGZyb20gX1B5TG9uZ19Bc0ludCgpICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvciBtaXNzaW5nIGFyZ3VtZW50ICdvcCciKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICAvKiBhc3NvY2xlbiBpcyBvcHRpb25hbCBidXQgbXVzdCBiZSA+PSAwICovCisgICAgaWYgKGFzc29jbGVub2JqICE9IE5VTEwpIHsKKyAgICAgICAgYXNzb2NsZW4gPSBfUHlMb25nX0FzSW50KGFzc29jbGVub2JqKTsKKyAgICAgICAgaWYgKGFzc29jbGVuID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXNzb2NsZW4gPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc3NvY2xlbiBtdXN0IGJlIHBvc2l0aXZlIik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb250cm9sbGVuID0gQ01TR19TUEFDRSg0KTsKKyAgICBpZiAoaXYuYnVmICE9IE5VTEwpIHsKKyAgICAgICAgY29udHJvbGxlbiArPSBDTVNHX1NQQUNFKHNpemVvZigqYWxnX2l2KSArIGl2Lmxlbik7CisgICAgfQorICAgIGlmIChhc3NvY2xlbiA+PSAwKSB7CisgICAgICAgIGNvbnRyb2xsZW4gKz0gQ01TR19TUEFDRSg0KTsKKyAgICB9CisKKyAgICBjb250cm9sYnVmID0gUHlNZW1fTWFsbG9jKGNvbnRyb2xsZW4pOworICAgIGlmIChjb250cm9sYnVmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIG1lbXNldChjb250cm9sYnVmLCAwLCBjb250cm9sbGVuKTsKKworICAgIG1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisgICAgbXNnLm1zZ19jb250cm9sbGVuID0gY29udHJvbGxlbjsKKyAgICBtc2cubXNnX2NvbnRyb2wgPSBjb250cm9sYnVmOworCisgICAgLyogRmlsbCBpbiBhbiBpb3ZlYyBmb3IgZWFjaCBtZXNzYWdlIHBhcnQsIGFuZCBzYXZlIHRoZSBQeV9idWZmZXIKKyAgICAgICBzdHJ1Y3RzIHRvIHJlbGVhc2UgYWZ0ZXJ3YXJkcy4gKi8KKyAgICBpZiAoZGF0YV9hcmcgIT0gTlVMTCkgeworICAgICAgICBpZiAoc29ja19zZW5kbXNnX2lvdmVjKHNlbGYsIGRhdGFfYXJnLCAmbXNnLCAmZGF0YWJ1ZnMsICZuZGF0YWJ1ZnMpID09IC0xKSB7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzZXQgb3BlcmF0aW9uIHRvIGVuY3J5cHQgb3IgZGVjcnlwdCAqLworICAgIGhlYWRlciA9IENNU0dfRklSU1RIRFIoJm1zZyk7CisgICAgaWYgKGhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIHJlc3VsdCBmcm9tIENNU0dfRklSU1RIRFIiKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBoZWFkZXItPmNtc2dfbGV2ZWwgPSBTT0xfQUxHOworICAgIGhlYWRlci0+Y21zZ190eXBlID0gQUxHX1NFVF9PUDsKKyAgICBoZWFkZXItPmNtc2dfbGVuID0gQ01TR19MRU4oNCk7CisgICAgdWlwdHIgPSAodm9pZCopQ01TR19EQVRBKGhlYWRlcik7CisgICAgKnVpcHRyID0gKHVuc2lnbmVkIGludClvcDsKKworICAgIC8qIHNldCBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKi8KKyAgICBpZiAoaXYuYnVmICE9IE5VTEwpIHsKKyAgICAgICAgaGVhZGVyID0gQ01TR19OWFRIRFIoJm1zZywgaGVhZGVyKTsKKyAgICAgICAgaWYgKGhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5VTEwgcmVzdWx0IGZyb20gQ01TR19OWFRIRFIoaXYpIik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgaGVhZGVyLT5jbXNnX2xldmVsID0gU09MX0FMRzsKKyAgICAgICAgaGVhZGVyLT5jbXNnX3R5cGUgPSBBTEdfU0VUX0lWOworICAgICAgICBoZWFkZXItPmNtc2dfbGVuID0gQ01TR19TUEFDRShzaXplb2YoKmFsZ19pdikgKyBpdi5sZW4pOworICAgICAgICBhbGdfaXYgPSAodm9pZCopQ01TR19EQVRBKGhlYWRlcik7CisgICAgICAgIGFsZ19pdi0+aXZsZW4gPSBpdi5sZW47CisgICAgICAgIG1lbWNweShhbGdfaXYtPml2LCBpdi5idWYsIGl2Lmxlbik7CisgICAgfQorCisgICAgLyogc2V0IGxlbmd0aCBvZiBhc3NvY2lhdGVkIGRhdGEgZm9yIEFFQUQgKi8KKyAgICBpZiAoYXNzb2NsZW4gPj0gMCkgeworICAgICAgICBoZWFkZXIgPSBDTVNHX05YVEhEUigmbXNnLCBoZWFkZXIpOworICAgICAgICBpZiAoaGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgTlVMTCByZXN1bHQgZnJvbSBDTVNHX05YVEhEUihhc3NvYykiKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBoZWFkZXItPmNtc2dfbGV2ZWwgPSBTT0xfQUxHOworICAgICAgICBoZWFkZXItPmNtc2dfdHlwZSA9IEFMR19TRVRfQUVBRF9BU1NPQ0xFTjsKKyAgICAgICAgaGVhZGVyLT5jbXNnX2xlbiA9IENNU0dfTEVOKDQpOworICAgICAgICB1aXB0ciA9ICh2b2lkKilDTVNHX0RBVEEoaGVhZGVyKTsKKyAgICAgICAgKnVpcHRyID0gKHVuc2lnbmVkIGludClhc3NvY2xlbjsKKyAgICB9CisKKyAgICBjdHgubXNnID0gJm1zZzsKKyAgICBjdHguZmxhZ3MgPSBmbGFnczsKKyAgICBpZiAoc29ja19jYWxsKHNlbGYsIDEsIHNvY2tfc2VuZG1zZ19pbXBsLCAmY3R4KSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKKworICAgIHJldHZhbCA9IFB5TG9uZ19Gcm9tU3NpemVfdChjdHgucmVzdWx0KTsKKworICBmaW5hbGx5OgorICAgIFB5TWVtX0ZyZWUoY29udHJvbGJ1Zik7CisgICAgaWYgKGl2LmJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJml2KTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG5kYXRhYnVmczsgaSsrKQorICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhYnVmc1tpXSk7CisgICAgUHlNZW1fRnJlZShkYXRhYnVmcyk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworUHlEb2NfU1RSVkFSKHNlbmRtc2dfYWZhbGdfZG9jLAorInNlbmRtc2dfYWZhbGcoW21zZ10sICosIG9wWywgaXZbLCBhc3NvY2xlblssIGZsYWdzPU1TR19NT1JFXV1dKVxuXAorXG5cCitTZXQgb3BlcmF0aW9uIG1vZGUsIElWIGFuZCBsZW5ndGggb2YgYXNzb2NpYXRlZCBkYXRhIGZvciBhbiBBRl9BTEdcblwKK29wZXJhdGlvbiBzb2NrZXQuIik7CisjZW5kaWYKIAogLyogcy5zaHV0ZG93bihob3cpIG1ldGhvZCAqLwogCkBAIC00MDM1LDYgKzQzNjcsMTcgQEAKICAgICAgICAgICAgIHJldHVybiBzZXRfZXJyb3IoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcocmVjdik7IH0KKyNpZiBkZWZpbmVkKFNJT19MT09QQkFDS19GQVNUX1BBVEgpCisgICAgY2FzZSBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIOiB7CisgICAgICAgIHVuc2lnbmVkIGludCBvcHRpb247CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmcsICJrSTppb2N0bCIsICZjbWQsICZvcHRpb24pKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChXU0FJb2N0bChzLT5zb2NrX2ZkLCBjbWQsICZvcHRpb24sIHNpemVvZihvcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsICZyZWN2LCBOVUxMLCBOVUxMKSA9PSBTT0NLRVRfRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRfZXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcocmVjdik7IH0KKyNlbmRpZgogICAgIGRlZmF1bHQ6CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBpb2N0bCBjb21tYW5kICVkIiwgY21kKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00MDQ1LDcgKzQzODgsOCBAQAogXG5cCiBDb250cm9sIHRoZSBzb2NrZXQgd2l0aCBXU0FJb2N0bCBzeXNjYWxsLiBDdXJyZW50bHkgc3VwcG9ydGVkICdjbWQnIHZhbHVlcyBhcmVcblwKIFNJT19SQ1ZBTEw6ICAnb3B0aW9uJyBtdXN0IGJlIG9uZSBvZiB0aGUgc29ja2V0LlJDVkFMTF8qIGNvbnN0YW50cy5cblwKLVNJT19LRUVQQUxJVkVfVkFMUzogICdvcHRpb24nIGlzIGEgdHVwbGUgb2YgKG9ub2ZmLCB0aW1lb3V0LCBpbnRlcnZhbCkuIik7CitTSU9fS0VFUEFMSVZFX1ZBTFM6ICAnb3B0aW9uJyBpcyBhIHR1cGxlIG9mIChvbm9mZiwgdGltZW91dCwgaW50ZXJ2YWwpLlxuXAorU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSDogJ29wdGlvbicgaXMgYSBib29sZWFuIHZhbHVlLCBhbmQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCIpOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCkBAIC00MTQ0LDYgKzQ0ODgsMTAgQEAKICAgICB7InNlbmRtc2ciLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZG1zZywgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgICAgICAgIHNlbmRtc2dfZG9jfSwKICNlbmRpZgorI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCisgICAgeyJzZW5kbXNnX2FmYWxnIiwgICAgIChQeUNGdW5jdGlvbilzb2NrX3NlbmRtc2dfYWZhbGcsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgc2VuZG1zZ19hZmFsZ19kb2N9LAorI2VuZGlmCiAgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIApAQCAtNDE2NCwyMiArNDUxMiw0NSBAQAogICAgRmlyc3QgY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRpb24uICovCiAKIHN0YXRpYyB2b2lkCitzb2NrX2ZpbmFsaXplKFB5U29ja2V0U29ja09iamVjdCAqcykKK3sKKyAgICBTT0NLRVRfVCBmZDsKKyAgICBQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOworCisgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KKyAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKKworICAgIGlmIChzLT5zb2NrX2ZkICE9IElOVkFMSURfU09DS0VUKSB7CisgICAgICAgIGlmIChQeUVycl9SZXNvdXJjZVdhcm5pbmcoKFB5T2JqZWN0ICopcywgMSwgInVuY2xvc2VkICVSIiwgcykpIHsKKyAgICAgICAgICAgIC8qIFNwdXJpb3VzIGVycm9ycyBjYW4gYXBwZWFyIGF0IHNodXRkb3duICovCisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19XYXJuaW5nKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QgKilzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE9ubHkgY2xvc2UgdGhlIHNvY2tldCAqYWZ0ZXIqIGxvZ2dpbmcgdGhlIFJlc291cmNlV2FybmluZyB3YXJuaW5nCisgICAgICAgICAgIHRvIGFsbG93IHRoZSBsb2dnZXIgdG8gY2FsbCBzb2NrZXQgbWV0aG9kcyBsaWtlCisgICAgICAgICAgIHNvY2tldC5nZXRzb2NrbmFtZSgpLiBJZiB0aGUgc29ja2V0IGlzIGNsb3NlZCBiZWZvcmUsIHNvY2tldAorICAgICAgICAgICBtZXRob2RzIGZhaWxzIHdpdGggdGhlIEVCQURGIGVycm9yLiAqLworICAgICAgICBmZCA9IHMtPnNvY2tfZmQ7CisgICAgICAgIHMtPnNvY2tfZmQgPSBJTlZBTElEX1NPQ0tFVDsKKworICAgICAgICAvKiBXZSBkbyBub3Qgd2FudCB0byByZXRyeSB1cG9uIEVJTlRSOiBzZWUgc29ja19jbG9zZSgpICovCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgKHZvaWQpIFNPQ0tFVENMT1NFKGZkKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIHRoZSBzYXZlZCBleGNlcHRpb24uICovCisgICAgUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKK30KKworc3RhdGljIHZvaWQKIHNvY2tfZGVhbGxvYyhQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7Ci0gICAgaWYgKHMtPnNvY2tfZmQgIT0gSU5WQUxJRF9TT0NLRVQpIHsKLSAgICAgICAgUHlPYmplY3QgKmV4YywgKnZhbCwgKnRiOwotICAgICAgICBQeV9zc2l6ZV90IG9sZF9yZWZjb3VudCA9IFB5X1JFRkNOVChzKTsKLSAgICAgICAgKytQeV9SRUZDTlQocyk7Ci0gICAgICAgIFB5RXJyX0ZldGNoKCZleGMsICZ2YWwsICZ0Yik7Ci0gICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX1Jlc291cmNlV2FybmluZywgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuY2xvc2VkICVSIiwgcykpCi0gICAgICAgICAgICAvKiBTcHVyaW91cyBlcnJvcnMgY2FuIGFwcGVhciBhdCBzaHV0ZG93biAqLwotICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfV2FybmluZykpCi0gICAgICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKChQeU9iamVjdCAqKSBzKTsKLSAgICAgICAgUHlFcnJfUmVzdG9yZShleGMsIHZhbCwgdGIpOwotICAgICAgICAodm9pZCkgU09DS0VUQ0xPU0Uocy0+c29ja19mZCk7Ci0gICAgICAgIFB5X1JFRkNOVChzKSA9IG9sZF9yZWZjb3VudDsKLSAgICB9CisgICAgaWYgKFB5T2JqZWN0X0NhbGxGaW5hbGl6ZXJGcm9tRGVhbGxvYygoUHlPYmplY3QgKilzKSA8IDApCisgICAgICAgIHJldHVybjsKKwogICAgIFB5X1RZUEUocyktPnRwX2ZyZWUoKFB5T2JqZWN0ICopcyk7CiB9CiAKQEAgLTQzNjcsNyArNDczOCwxMCBAQAogICAgICAgICB9CiAjZW5kaWYKICAgICB9Ci0gICAgaW5pdF9zb2Nrb2JqZWN0KHMsIGZkLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKKyAgICBpZiAoaW5pdF9zb2Nrb2JqZWN0KHMsIGZkLCBmYW1pbHksIHR5cGUsIHByb3RvKSA9PSAtMSkgeworICAgICAgICBTT0NLRVRDTE9TRShmZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKICAgICByZXR1cm4gMDsKIApAQCAtNDM5Niw3ICs0NzcwLDggQEAKICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFCisgICAgICAgIHwgUHlfVFBGTEFHU19IQVZFX0ZJTkFMSVpFLCAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIHNvY2tfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KQEAgLTQ0MTYsNiArNDc5MSwxNSBAQAogICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KICAgICBzb2NrX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogICAgIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXNfZ2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tcm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhY2hlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdWJjbGFzc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF92ZXJzaW9uX3RhZyAqLworICAgIChkZXN0cnVjdG9yKXNvY2tfZmluYWxpemUsICAgICAgICAgICAgICAgICAgLyogdHBfZmluYWxpemUgKi8KIH07CiAKIApAQCAtNTQ1MSwxMCArNTgzNSw2IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKHJldHZhbCk7CiAgICAgfQotCi0gICAgLyogTk9UUkVBQ0hFRCAqLwotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJpbnZhbGlkIGhhbmRsaW5nIG9mIGluZXRfbnRvcCIpOwotICAgIHJldHVybiBOVUxMOwogfQogCiAjZWxpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCkBAIC02MTg4LDkgKzY1NjgsNiBAQAogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFGX1VOU1BFQyk7CiAjZW5kaWYKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBBRl9JTkVUKTsKLSNpZmRlZiBBRl9JTkVUNgotICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFGX0lORVQ2KTsKLSNlbmRpZiAvKiBBRl9JTkVUNiAqLwogI2lmIGRlZmluZWQoQUZfVU5JWCkKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBBRl9VTklYKTsKICNlbmRpZiAvKiBBRl9VTklYICovCkBAIC02MjIxLDYgKzY1OTgsOSBAQAogICAgIC8qIFJlc2VydmVkIGZvciBXZXJuZXIncyBBVE0gKi8KICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBBRl9BQUw1KTsKICNlbmRpZgorI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUZfQUxHKTsgLyogTGludXggY3J5cHRvICovCisjZW5kaWYKICNpZmRlZiBBRl9YMjUKICAgICAvKiBSZXNlcnZlZCBmb3IgWC4yNSBwcm9qZWN0ICovCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUZfWDI1KTsKQEAgLTYyODIsNiArNjY2Miw5IEBACiAjaWZkZWYgTkVUTElOS19UQVBCQVNFCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgTkVUTElOS19UQVBCQVNFKTsKICNlbmRpZgorI2lmZGVmIE5FVExJTktfQ1JZUFRPCisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgTkVUTElOS19DUllQVE8pOworI2VuZGlmCiAjZW5kaWYgLyogQUZfTkVUTElOSyAqLwogI2lmZGVmIEFGX1JPVVRFCiAgICAgLyogQWxpYXMgdG8gZW11bGF0ZSA0LjRCU0QgKi8KQEAgLTY0MzUsMTEgKzY4MTgsMzAgQEAKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBUSVBDX1RPUF9TUlYpOwogI2VuZGlmCiAKKyNpZmRlZiBIQVZFX1NPQ0tBRERSX0FMRworICAgIC8qIFNvY2tldCBvcHRpb25zICovCisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUxHX1NFVF9LRVkpOworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFMR19TRVRfSVYpOworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFMR19TRVRfT1ApOworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFMR19TRVRfQUVBRF9BU1NPQ0xFTik7CisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUxHX1NFVF9BRUFEX0FVVEhTSVpFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBBTEdfU0VUX1BVQktFWSk7CisKKyAgICAvKiBPcGVyYXRpb25zICovCisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUxHX09QX0RFQ1JZUFQpOworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFMR19PUF9FTkNSWVBUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBBTEdfT1BfU0lHTik7CisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUxHX09QX1ZFUklGWSk7CisjZW5kaWYKKwogICAgIC8qIFNvY2tldCB0eXBlcyAqLwogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPQ0tfU1RSRUFNKTsKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT0NLX0RHUkFNKTsKIC8qIFdlIGhhdmUgaW5jb21wbGV0ZSBzb2NrZXQgc3VwcG9ydC4gKi8KKyNpZmRlZiBTT0NLX1JBVworICAgIC8qIFNPQ0tfUkFXIGlzIG1hcmtlZCBhcyBvcHRpb25hbCBpbiB0aGUgUE9TSVggc3BlY2lmaWNhdGlvbiAqLwogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPQ0tfUkFXKTsKKyNlbmRpZgogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPQ0tfU0VRUEFDS0VUKTsKICNpZiBkZWZpbmVkKFNPQ0tfUkRNKQogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPQ0tfUkRNKTsKQEAgLTY0ODIsOSArNjg4NCwxMSBAQAogI2lmZGVmICBTT19PT0JJTkxJTkUKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT19PT0JJTkxJTkUpOwogI2VuZGlmCisjaWZuZGVmIF9fR05VX18KICNpZmRlZiAgU09fUkVVU0VQT1JUCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU09fUkVVU0VQT1JUKTsKICNlbmRpZgorI2VuZGlmCiAjaWZkZWYgIFNPX1NOREJVRgogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPX1NOREJVRik7CiAjZW5kaWYKQEAgLTY1MjEsNiArNjkyNSwxMiBAQAogI2lmZGVmICBMT0NBTF9QRUVSQ1JFRAogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIExPQ0FMX1BFRVJDUkVEKTsKICNlbmRpZgorI2lmZGVmICBTT19QQVNTU0VDCisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU09fUEFTU1NFQyk7CisjZW5kaWYKKyNpZmRlZiAgU09fUEVFUlNFQworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPX1BFRVJTRUMpOworI2VuZGlmCiAjaWZkZWYgIFNPX0JJTkRUT0RFVklDRQogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPX0JJTkRUT0RFVklDRSk7CiAjZW5kaWYKQEAgLTY1MzAsNiArNjk0MCwxMiBAQAogI2lmZGVmICBTT19NQVJLCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU09fTUFSSyk7CiAjZW5kaWYKKyNpZmRlZiBTT19ET01BSU4KKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT19ET01BSU4pOworI2VuZGlmCisjaWZkZWYgU09fUFJPVE9DT0wKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT19QUk9UT0NPTCk7CisjZW5kaWYKIAogICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGZvciAibGlzdGVuIiAqLwogI2lmZGVmICBTT01BWENPTk4KQEAgLTY2ODgsNiArNzEwNCw5IEBACiAjaWZkZWYgU09MX1JEUwogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPTF9SRFMpOwogI2VuZGlmCisjaWZkZWYgSEFWRV9TT0NLQUREUl9BTEcKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT0xfQUxHKTsKKyNlbmRpZgogI2lmZGVmIFJEU19DQU5DRUxfU0VOVF9UTwogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJEU19DQU5DRUxfU0VOVF9UTyk7CiAjZW5kaWYKQEAgLTcyMjUsOCArNzY0NCwxNiBAQAogCiAjaWZkZWYgU0lPX1JDVkFMTAogICAgIHsKLSAgICAgICAgRFdPUkQgY29kZXNbXSA9IHtTSU9fUkNWQUxMLCBTSU9fS0VFUEFMSVZFX1ZBTFN9OwotICAgICAgICBjb25zdCBjaGFyICpuYW1lc1tdID0geyJTSU9fUkNWQUxMIiwgIlNJT19LRUVQQUxJVkVfVkFMUyJ9OworICAgICAgICBEV09SRCBjb2Rlc1tdID0ge1NJT19SQ1ZBTEwsIFNJT19LRUVQQUxJVkVfVkFMUywKKyNpZiBkZWZpbmVkKFNJT19MT09QQkFDS19GQVNUX1BBVEgpCisgICAgICAgICAgICBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRICisjZW5kaWYKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZXNbXSA9IHsiU0lPX1JDVkFMTCIsICJTSU9fS0VFUEFMSVZFX1ZBTFMiLAorI2lmIGRlZmluZWQoU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCkKKyAgICAgICAgICAgICJTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIIgorI2VuZGlmCisgICAgICAgIH07CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IoaSA9IDA7IGk8UHlfQVJSQVlfTEVOR1RIKGNvZGVzKTsgKytpKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdG1wOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zcHdkbW9kdWxlLmMgYi9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYwppbmRleCA0YjlmM2NkLi41NTZhNzE1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYwpAQCAtMTM3LDcgKzEzNywxMCBAQAogICAgIGlmIChQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShieXRlcywgJm5hbWUsIE5VTEwpID09IC0xKQogICAgICAgICBnb3RvIG91dDsKICAgICBpZiAoKHAgPSBnZXRzcG5hbShuYW1lKSkgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJnZXRzcG5hbSgpOiBuYW1lIG5vdCBmb3VuZCIpOworICAgICAgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLCAiZ2V0c3BuYW0oKTogbmFtZSBub3QgZm91bmQiKTsKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQogICAgIHJldHZhbCA9IG1rc3BlbnQocCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NyZV9saWIuaCBiL01vZHVsZXMvc3JlX2xpYi5oCmluZGV4IDEyOGM3MWUuLjA4NjVmYzYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3JlX2xpYi5oCisrKyBiL01vZHVsZXMvc3JlX2xpYi5oCkBAIC0zNjcsMTQgKzM2NywxMiBAQAogI2RlZmluZSBSRVRVUk5fT05fRkFJTFVSRShpKSBcCiAgICAgZG8geyBSRVRVUk5fT05fRVJST1IoaSk7IGlmIChpID09IDApIFJFVFVSTl9GQUlMVVJFOyB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFNGWSh4KSAjeAotCiAjZGVmaW5lIERBVEFfU1RBQ0tfQUxMT0Moc3RhdGUsIHR5cGUsIHB0cikgXAogZG8geyBcCiAgICAgYWxsb2NfcG9zID0gc3RhdGUtPmRhdGFfc3RhY2tfYmFzZTsgXAogICAgIFRSQUNFKCgiYWxsb2NhdGluZyAlcyBpbiAlIiBQWV9GT1JNQVRfU0laRV9UICJkICIgXAogICAgICAgICAgICAiKCUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpXG4iLCBcCi0gICAgICAgICAgIFNGWSh0eXBlKSwgYWxsb2NfcG9zLCBzaXplb2YodHlwZSkpKTsgXAorICAgICAgICAgICBQeV9TVFJJTkdJRlkodHlwZSksIGFsbG9jX3Bvcywgc2l6ZW9mKHR5cGUpKSk7IFwKICAgICBpZiAoc2l6ZW9mKHR5cGUpID4gc3RhdGUtPmRhdGFfc3RhY2tfc2l6ZSAtIGFsbG9jX3BvcykgeyBcCiAgICAgICAgIGludCBqID0gZGF0YV9zdGFja19ncm93KHN0YXRlLCBzaXplb2YodHlwZSkpOyBcCiAgICAgICAgIGlmIChqIDwgMCkgcmV0dXJuIGo7IFwKQEAgLTM4Nyw3ICszODUsNyBAQAogCiAjZGVmaW5lIERBVEFfU1RBQ0tfTE9PS1VQX0FUKHN0YXRlLCB0eXBlLCBwdHIsIHBvcykgXAogZG8geyBcCi0gICAgVFJBQ0UoKCJsb29raW5nIHVwICVzIGF0ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsIFNGWSh0eXBlKSwgcG9zKSk7IFwKKyAgICBUUkFDRSgoImxvb2tpbmcgdXAgJXMgYXQgJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwgUHlfU1RSSU5HSUZZKHR5cGUpLCBwb3MpKTsgXAogICAgIHB0ciA9ICh0eXBlKikoc3RhdGUtPmRhdGFfc3RhY2srcG9zKTsgXAogfSB3aGlsZSAoMCkKIApAQCAtNTMxLDcgKzUyOSw3IEBACiAgICAgaWYgKGN0eC0+cGF0dGVyblswXSA9PSBTUkVfT1BfSU5GTykgewogICAgICAgICAvKiBvcHRpbWl6YXRpb24gaW5mbyBibG9jayAqLwogICAgICAgICAvKiA8SU5GTz4gPDE9c2tpcD4gPDI9ZmxhZ3M+IDwzPW1pbj4gLi4uICovCi0gICAgICAgIGlmIChjdHgtPnBhdHRlcm5bM10gJiYgKFB5X3VpbnRwdHJfdCkoZW5kIC0gY3R4LT5wdHIpIDwgY3R4LT5wYXR0ZXJuWzNdKSB7CisgICAgICAgIGlmIChjdHgtPnBhdHRlcm5bM10gJiYgKHVpbnRwdHJfdCkoZW5kIC0gY3R4LT5wdHIpIDwgY3R4LT5wYXR0ZXJuWzNdKSB7CiAgICAgICAgICAgICBUUkFDRSgoInJlamVjdCAoZ290ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgY2hhcnMsICIKICAgICAgICAgICAgICAgICAgICAibmVlZCAlIiBQWV9GT1JNQVRfU0laRV9UICJkKVxuIiwKICAgICAgICAgICAgICAgICAgICBlbmQgLSBjdHgtPnB0ciwgKFB5X3NzaXplX3QpIGN0eC0+cGF0dGVyblszXSkpOwpAQCAtMTI1Niw3ICsxMjU0LDMyIEBACiAgICAgICAgICAgIHByZWZpeCwgcHJlZml4X2xlbiwgcHJlZml4X3NraXApKTsKICAgICBUUkFDRSgoImNoYXJzZXQgPSAlcFxuIiwgY2hhcnNldCkpOwogCi0jaWYgZGVmaW5lZChVU0VfRkFTVF9TRUFSQ0gpCisgICAgaWYgKHByZWZpeF9sZW4gPT0gMSkgeworICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgbGl0ZXJhbCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgU1JFX0NIQVIgYyA9IChTUkVfQ0hBUikgcHJlZml4WzBdOworI2lmIFNJWkVPRl9TUkVfQ0hBUiA8IDQKKyAgICAgICAgaWYgKChTUkVfQ09ERSkgYyAhPSBwcmVmaXhbMF0pCisgICAgICAgICAgICByZXR1cm4gMDsgLyogbGl0ZXJhbCBjYW4ndCBtYXRjaDogZG9lc24ndCBmaXQgaW4gY2hhciB3aWR0aCAqLworI2VuZGlmCisgICAgICAgIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7CisgICAgICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKKyAgICAgICAgICAgIHdoaWxlICgqcHRyICE9IGMpIHsKKyAgICAgICAgICAgICAgICBpZiAoKytwdHIgPj0gZW5kKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRSQUNFKCgifCVwfCVwfFNFQVJDSCBMSVRFUkFMXG4iLCBwYXR0ZXJuLCBwdHIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5zdGFydCA9IHB0cjsKKyAgICAgICAgICAgIHN0YXRlLT5wdHIgPSBwdHIgKyBwcmVmaXhfc2tpcDsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFNSRV9JTkZPX0xJVEVSQUwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIHdlIGdvdCBhbGwgb2YgaXQgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IFNSRShtYXRjaCkoc3RhdGUsIHBhdHRlcm4gKyAyKnByZWZpeF9za2lwLCAwKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgKytwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgaWYgKHByZWZpeF9sZW4gPiAxKSB7CiAgICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBrbm93biBwcmVmaXguICB1c2UgdGhlIG92ZXJsYXAKICAgICAgICAgICAgdGFibGUgdG8gc2tpcCBmb3J3YXJkIGFzIGZhc3QgYXMgd2UgcG9zc2libHkgY2FuICovCkBAIC0xMzA1LDMyICsxMzI4LDggQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0jZW5kaWYKIAotICAgIGlmIChwYXR0ZXJuWzBdID09IFNSRV9PUF9MSVRFUkFMKSB7Ci0gICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBsaXRlcmFsIGNoYXJhY3Rlci4gIHRoaXMgaXMgdXNlZAotICAgICAgICAgICBmb3Igc2hvcnQgcHJlZml4ZXMsIGFuZCBpZiBmYXN0IHNlYXJjaCBpcyBkaXNhYmxlZCAqLwotICAgICAgICBTUkVfQ0hBUiBjID0gKFNSRV9DSEFSKSBwYXR0ZXJuWzFdOwotI2lmIFNJWkVPRl9TUkVfQ0hBUiA8IDQKLSAgICAgICAgaWYgKChTUkVfQ09ERSkgYyAhPSBwYXR0ZXJuWzFdKQotICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGxpdGVyYWwgY2FuJ3QgbWF0Y2g6IGRvZXNuJ3QgZml0IGluIGNoYXIgd2lkdGggKi8KLSNlbmRpZgotICAgICAgICBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwotICAgICAgICB3aGlsZSAocHRyIDwgZW5kKSB7Ci0gICAgICAgICAgICB3aGlsZSAoKnB0ciAhPSBjKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCsrcHRyID49IGVuZCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUUkFDRSgoInwlcHwlcHxTRUFSQ0ggTElURVJBTFxuIiwgcGF0dGVybiwgcHRyKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+c3RhcnQgPSBwdHI7Ci0gICAgICAgICAgICBzdGF0ZS0+cHRyID0gKytwdHI7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBTUkVfSU5GT19MSVRFUkFMKQotICAgICAgICAgICAgICAgIHJldHVybiAxOyAvKiB3ZSBnb3QgYWxsIG9mIGl0ICovCi0gICAgICAgICAgICBzdGF0dXMgPSBTUkUobWF0Y2gpKHN0YXRlLCBwYXR0ZXJuICsgMiwgMCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNoYXJzZXQpIHsKKyAgICBpZiAoY2hhcnNldCkgewogICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgY2hhcmFjdGVyIGZyb20gYSBrbm93biBzZXQgKi8KICAgICAgICAgZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKICAgICAgICAgZm9yICg7OykgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5jIGIvTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5jCmluZGV4IGY4NGNjNzguLjM0YTZmYzUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3ltdGFibGVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3N5bXRhYmxlbW9kdWxlLmMKQEAgLTc5LDYgKzc5LDcgQEAKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBERUZfRlJFRV9DTEFTUyk7CiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgREVGX0lNUE9SVCk7CiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgREVGX0JPVU5EKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBERUZfQU5OT1QpOwogCiAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRZUEVfRlVOQ1RJT04iLCBGdW5jdGlvbkJsb2NrKTsKICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVFlQRV9DTEFTUyIsIENsYXNzQmxvY2spOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwppbmRleCBkMmNhYWNkLi45NDc0NjQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwpAQCAtMzExLDcgKzMxMSw3IEBACiAgICBSZXR1cm5zIG5vbi16ZXJvIG9uIHN1Y2Nlc3MgKHBhcmFsbGVscyBQeUFyZ19QYXJzZVR1cGxlKS4KICovCiBzdGF0aWMgaW50Ci1wYXJzZV90aW1lX3RfYXJncyhQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCB0aW1lX3QgKnB3aGVuKQorcGFyc2VfdGltZV90X2FyZ3MoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdGltZV90ICpwd2hlbikKIHsKICAgICBQeU9iamVjdCAqb3QgPSBOVUxMOwogICAgIHRpbWVfdCB3aGVudDsKQEAgLTczMiwxMCArNzMyLDEwIEBACiB7CiAgICAgLyogSW5zcGlyZWQgYnkgT3BlbiBHcm91cCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIGF0CiAgICAgICogaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS9mdW5jdGlvbnMvYXNjdGltZS5odG1sICovCi0gICAgc3RhdGljIGNoYXIgd2RheV9uYW1lWzddWzRdID0geworICAgIHN0YXRpYyBjb25zdCBjaGFyIHdkYXlfbmFtZVs3XVs0XSA9IHsKICAgICAgICAgIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIKICAgICB9OwotICAgIHN0YXRpYyBjaGFyIG1vbl9uYW1lWzEyXVs0XSA9IHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtb25fbmFtZVsxMl1bNF0gPSB7CiAgICAgICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCiAgICAgICAgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIKICAgICB9OwpAQCAtMTAzNCw2ICsxMDM0LDcgQEAKICAgICB9CiAjZW5kaWYKIAorICAgIC8qIEN1cnJlbnRseSwgUHl0aG9uIDMgcmVxdWlyZXMgY2xvY2soKSB0byBidWlsZDogc2VlIGlzc3VlICMyMjYyNCAqLwogICAgIHJldHVybiBmbG9hdGNsb2NrKGluZm8pOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKaW5kZXggZmU0ZTkwOC4uN2Q1MThmYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy91bmljb2RlZGF0YS5jCisrKyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwpAQCAtODg0LDcgKzg4NCw3IEBACiAgICAgcmV0dXJuIGg7CiB9CiAKLXN0YXRpYyBjaGFyICpoYW5ndWxfc3lsbGFibGVzW11bM10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhhbmd1bF9zeWxsYWJsZXNbXVszXSA9IHsKICAgICB7ICJHIiwgICJBIiwgICAiIiAgIH0sCiAgICAgeyAiR0ciLCAiQUUiLCAgIkciICB9LAogICAgIHsgIk4iLCAgIllBIiwgICJHRyIgfSwKQEAgLTEwNTcsNyArMTA1Nyw3IEBACiAgICAgaW50IGksIGxlbjE7CiAgICAgKmxlbiA9IC0xOwogICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGNoYXIgKnMgPSBoYW5ndWxfc3lsbGFibGVzW2ldW2NvbHVtbl07CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBoYW5ndWxfc3lsbGFibGVzW2ldW2NvbHVtbl07CiAgICAgICAgIGxlbjEgPSBQeV9TQUZFX0RPV05DQVNUKHN0cmxlbihzKSwgc2l6ZV90LCBpbnQpOwogICAgICAgICBpZiAobGVuMSA8PSAqbGVuKQogICAgICAgICAgICAgY29udGludWU7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3dpbnJlcGFyc2UuaCBiL01vZHVsZXMvd2lucmVwYXJzZS5oCmluZGV4IDY2Zjc3NzUuLjI4MDQ5YzkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvd2lucmVwYXJzZS5oCisrKyBiL01vZHVsZXMvd2lucmVwYXJzZS5oCkBAIC0yLDcgKzIsNyBAQAogI2RlZmluZSBQeV9XSU5SRVBBUlNFX0gKIAogI2lmZGVmIE1TX1dJTkRPV1MKLSNpbmNsdWRlIDxXaW5kb3dzLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewpAQCAtMTAsOSArMTAsMTAgQEAKIAogLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgd2FzIGNvcGllZCBmcm9tCiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY1NTIwMTIuYXNweCBhcyB0aGUgcmVxdWlyZWQKLSAgIGluY2x1ZGUgZG9lc24ndCBzZWVtIHRvIGJlIHByZXNlbnQgaW4gdGhlIFdpbmRvd3MgU0RLIChhdCBsZWFzdCBhcyBpbmNsdWRlZAotICAgd2l0aCBWaXN1YWwgU3R1ZGlvIEV4cHJlc3MpLiAqLwotdHlwZWRlZiBzdHJ1Y3QgX1JFUEFSU0VfREFUQV9CVUZGRVIgeworICAgaW5jbHVkZSBrbVxudGlmcy5oIGlzbid0IHByZXNlbnQgaW4gdGhlIFdpbmRvd3MgU0RLIChhdCBsZWFzdCBhcyBpbmNsdWRlZAorICAgd2l0aCBWaXN1YWwgU3R1ZGlvIEV4cHJlc3MpLiBVc2UgdW5pcXVlIG5hbWVzIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGgKKyAgIHRoZSBzdHJ1Y3R1cmUgYXMgZGVmaW5lZCBieSBNaW4gR1cuICovCit0eXBlZGVmIHN0cnVjdCB7CiAgICAgVUxPTkcgUmVwYXJzZVRhZzsKICAgICBVU0hPUlQgUmVwYXJzZURhdGFMZW5ndGg7CiAgICAgVVNIT1JUIFJlc2VydmVkOwpAQCAtMzgsMTEgKzM5LDExIEBACiAgICAgICAgICAgICBVQ0hBUiAgRGF0YUJ1ZmZlclsxXTsKICAgICAgICAgfSBHZW5lcmljUmVwYXJzZUJ1ZmZlcjsKICAgICB9OwotfSBSRVBBUlNFX0RBVEFfQlVGRkVSLCAqUFJFUEFSU0VfREFUQV9CVUZGRVI7Cit9IF9QeV9SRVBBUlNFX0RBVEFfQlVGRkVSLCAqX1B5X1BSRVBBUlNFX0RBVEFfQlVGRkVSOwogCi0jZGVmaW5lIFJFUEFSU0VfREFUQV9CVUZGRVJfSEVBREVSX1NJWkUgIEZJRUxEX09GRlNFVChSRVBBUlNFX0RBVEFfQlVGRkVSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWNSZXBhcnNlQnVmZmVyKQotI2RlZmluZSBNQVhJTVVNX1JFUEFSU0VfREFUQV9CVUZGRVJfU0laRSAgKCAxNiAqIDEwMjQgKQorI2RlZmluZSBfUHlfUkVQQVJTRV9EQVRBX0JVRkZFUl9IRUFERVJfU0laRSBcCisgICAgRklFTERfT0ZGU0VUKF9QeV9SRVBBUlNFX0RBVEFfQlVGRkVSLCBHZW5lcmljUmVwYXJzZUJ1ZmZlcikKKyNkZWZpbmUgX1B5X01BWElNVU1fUkVQQVJTRV9EQVRBX0JVRkZFUl9TSVpFICAoIDE2ICogMTAyNCApCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy94eGxpbWl0ZWQuYyBiL01vZHVsZXMveHhsaW1pdGVkLmMKaW5kZXggNDBjMTc2MC4uYzFhOWJlOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eGxpbWl0ZWQuYworKysgYi9Nb2R1bGVzL3h4bGltaXRlZC5jCkBAIC04OSw3ICs4OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLVh4b19zZXRhdHRyKFh4b09iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCitYeG9fc2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQogewogICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkgewogICAgICAgICBzZWxmLT54X2F0dHIgPSBQeURpY3RfTmV3KCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3h4bW9kdWxlLmMgYi9Nb2R1bGVzL3h4bW9kdWxlLmMKaW5kZXggODUyMzBkOS4uMDc2NDQwNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eG1vZHVsZS5jCisrKyBiL01vZHVsZXMveHhtb2R1bGUuYwpAQCAtNzYsNyArNzYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1YeG9fc2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQorWHhvX3NldGF0dHIoWHhvT2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKICAgICBpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpIHsKICAgICAgICAgc2VsZi0+eF9hdHRyID0gUHlEaWN0X05ldygpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96bGlibW9kdWxlLmMgYi9Nb2R1bGVzL3psaWJtb2R1bGUuYwppbmRleCBmY2NiNjE2Li40Y2RlZDMxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWJtb2R1bGUuYworKysgYi9Nb2R1bGVzL3psaWJtb2R1bGUuYwpAQCAtNTcsNyArNTcsNyBAQAogfSBjb21wb2JqZWN0OwogCiBzdGF0aWMgdm9pZAotemxpYl9lcnJvcih6X3N0cmVhbSB6c3QsIGludCBlcnIsIGNoYXIgKm1zZykKK3psaWJfZXJyb3Ioel9zdHJlYW0genN0LCBpbnQgZXJyLCBjb25zdCBjaGFyICptc2cpCiB7CiAgICAgY29uc3QgY2hhciAqem1zZyA9IFpfTlVMTDsKICAgICAvKiBJbiBjYXNlIG9mIGEgdmVyc2lvbiBtaXNtYXRjaCwgenN0Lm1zZyB3b24ndCBiZSBpbml0aWFsaXplZC4KQEAgLTE5OSwxOCArMTk5LDE4IEBACiAvKltjbGluaWMgaW5wdXRdCiB6bGliLmNvbXByZXNzCiAKLSAgICBieXRlczogUHlfYnVmZmVyCisgICAgZGF0YTogUHlfYnVmZmVyCiAgICAgICAgIEJpbmFyeSBkYXRhIHRvIGJlIGNvbXByZXNzZWQuCi0gICAgbGV2ZWw6IGludChjX2RlZmF1bHQ9IlpfREVGQVVMVF9DT01QUkVTU0lPTiIpID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OCi0gICAgICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkuCiAgICAgLworICAgIGxldmVsOiBpbnQoY19kZWZhdWx0PSJaX0RFRkFVTFRfQ09NUFJFU1NJT04iKSA9IFpfREVGQVVMVF9DT01QUkVTU0lPTgorICAgICAgICBDb21wcmVzc2lvbiBsZXZlbCwgaW4gMC05IG9yIC0xLgogCiBSZXR1cm5zIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgY29tcHJlc3NlZCBkYXRhLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9jb21wcmVzc19pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqYnl0ZXMsIGludCBsZXZlbCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hZTY0YzJjMzA3NjMyMWEwIGlucHV0PWJlM2FiZTk5MzRiZGE0YjNdKi8KK3psaWJfY29tcHJlc3NfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEsIGludCBsZXZlbCkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kODA5MDZkNzNmNjI5NGM4IGlucHV0PTYzOGQ1NGI2MzE1ZGJlZDNdKi8KIHsKICAgICBQeU9iamVjdCAqUmV0VmFsID0gTlVMTDsKICAgICBCeXRlICppYnVmOwpAQCAtMjE4LDggKzIxOCw4IEBACiAgICAgaW50IGVyciwgZmx1c2g7CiAgICAgel9zdHJlYW0genN0OwogCi0gICAgaWJ1ZiA9IGJ5dGVzLT5idWY7Ci0gICAgaWJ1ZmxlbiA9IGJ5dGVzLT5sZW47CisgICAgaWJ1ZiA9IGRhdGEtPmJ1ZjsKKyAgICBpYnVmbGVuID0gZGF0YS0+bGVuOwogCiAgICAgenN0Lm9wYXF1ZSA9IE5VTEw7CiAgICAgenN0LnphbGxvYyA9IFB5WmxpYl9NYWxsb2M7CkBAIC0zMTgsMTEgKzMxOCwxMSBAQAogCiAgICAgZGF0YTogUHlfYnVmZmVyCiAgICAgICAgIENvbXByZXNzZWQgZGF0YS4KKyAgICAvCiAgICAgd2JpdHM6IGludChjX2RlZmF1bHQ9Ik1BWF9XQklUUyIpID0gTUFYX1dCSVRTCiAgICAgICAgIFRoZSB3aW5kb3cgYnVmZmVyIHNpemUgYW5kIGNvbnRhaW5lciBmb3JtYXQuCiAgICAgYnVmc2l6ZTogc3NpemVfdChjX2RlZmF1bHQ9IkRFRl9CVUZfU0laRSIpID0gREVGX0JVRl9TSVpFCiAgICAgICAgIFRoZSBpbml0aWFsIG91dHB1dCBidWZmZXIgc2l6ZS4KLSAgICAvCiAKIFJldHVybnMgYSBieXRlcyBvYmplY3QgY29udGFpbmluZyB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC0zMzAsNyArMzMwLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB6bGliX2RlY29tcHJlc3NfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEsIGludCB3Yml0cywKICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgYnVmc2l6ZSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03N2M3ZTM1MTExZGM4YzQyIGlucHV0PWMxM2RkMmM1Njk2Y2QxN2ZdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03N2M3ZTM1MTExZGM4YzQyIGlucHV0PTIxOTYwOTM2MjA4ZTlhNWJdKi8KIHsKICAgICBQeU9iamVjdCAqUmV0VmFsID0gTlVMTDsKICAgICBCeXRlICppYnVmOwpAQCAtNzUwLDExICs3NTAsMTEgQEAKIAogICAgIGRhdGE6IFB5X2J1ZmZlcgogICAgICAgICBUaGUgYmluYXJ5IGRhdGEgdG8gZGVjb21wcmVzcy4KKyAgICAvCiAgICAgbWF4X2xlbmd0aDogc3NpemVfdCA9IDAKICAgICAgICAgVGhlIG1heGltdW0gYWxsb3dhYmxlIGxlbmd0aCBvZiB0aGUgZGVjb21wcmVzc2VkIGRhdGEuCiAgICAgICAgIFVuY29uc3VtZWQgaW5wdXQgZGF0YSB3aWxsIGJlIHN0b3JlZCBpbgogICAgICAgICB0aGUgdW5jb25zdW1lZF90YWlsIGF0dHJpYnV0ZS4KLSAgICAvCiAKIFJldHVybiBhIGJ5dGVzIG9iamVjdCBjb250YWluaW5nIHRoZSBkZWNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgZGF0YS4KIApAQCAtNzY2LDcgKzc2Niw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogemxpYl9EZWNvbXByZXNzX2RlY29tcHJlc3NfaW1wbChjb21wb2JqZWN0ICpzZWxmLCBQeV9idWZmZXIgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4X2xlbmd0aCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02ZTUxNzNjNzRlNzEwMzUyIGlucHV0PWQ2ZGU5YjUzYzQ1NjZiOGFdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02ZTUxNzNjNzRlNzEwMzUyIGlucHV0PWI4NWEyMTJhMDEyYjc3MGFdKi8KIHsKICAgICBpbnQgZXJyID0gWl9PSzsKICAgICBQeV9zc2l6ZV90IGlidWZsZW4sIG9idWZsZW4gPSBERUZfQlVGX1NJWkUsIGhhcmRfbGltaXQ7CkBAIC0xMzMzLDcgKzEzMzMsNyBAQAogInpsaWIgbGlicmFyeSwgd2hpY2ggaXMgYmFzZWQgb24gR05VIHppcC5cbiIKICJcbiIKICJhZGxlcjMyKHN0cmluZ1ssIHN0YXJ0XSkgLS0gQ29tcHV0ZSBhbiBBZGxlci0zMiBjaGVja3N1bS5cbiIKLSJjb21wcmVzcyhzdHJpbmdbLCBsZXZlbF0pIC0tIENvbXByZXNzIHN0cmluZywgd2l0aCBjb21wcmVzc2lvbiBsZXZlbCBpbiAwLTkuXG4iCisiY29tcHJlc3MoZGF0YVssIGxldmVsXSkgLS0gQ29tcHJlc3MgZGF0YSwgd2l0aCBjb21wcmVzc2lvbiBsZXZlbCAwLTkgb3IgLTEuXG4iCiAiY29tcHJlc3NvYmooW2xldmVsWywgLi4uXV0pIC0tIFJldHVybiBhIGNvbXByZXNzb3Igb2JqZWN0LlxuIgogImNyYzMyKHN0cmluZ1ssIHN0YXJ0XSkgLS0gQ29tcHV0ZSBhIENSQy0zMiBjaGVja3N1bS5cbiIKICJkZWNvbXByZXNzKHN0cmluZyxbd2JpdHNdLFtidWZzaXplXSkgLS0gRGVjb21wcmVzc2VzIGEgY29tcHJlc3NlZCBzdHJpbmcuXG4iCmRpZmYgLS1naXQgYS9PYmplY3RzL2Fic3RyYWN0LmMgYi9PYmplY3RzL2Fic3RyYWN0LmMKaW5kZXggODgyMDViZC4uNTA4ZmQ4MiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9hYnN0cmFjdC5jCisrKyBiL09iamVjdHMvYWJzdHJhY3QuYwpAQCAtMzIsOCArMzIsMTAgQEAKIHsKICAgICBQeU9iamVjdCAqdjsKIAotICAgIGlmIChvID09IE5VTEwpCisgICAgaWYgKG8gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KKwogICAgIHYgPSAoUHlPYmplY3QgKilvLT5vYl90eXBlOwogICAgIFB5X0lOQ1JFRih2KTsKICAgICByZXR1cm4gdjsKQEAgLTEzNywxMiArMTM5LDE2IEBACiB7CiAgICAgUHlNYXBwaW5nTWV0aG9kcyAqbTsKIAotICAgIGlmIChvID09IE5VTEwgfHwga2V5ID09IE5VTEwpCisgICAgaWYgKG8gPT0gTlVMTCB8fCBrZXkgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOwotICAgIGlmIChtICYmIG0tPm1wX3N1YnNjcmlwdCkKLSAgICAgICAgcmV0dXJuIG0tPm1wX3N1YnNjcmlwdChvLCBrZXkpOworICAgIGlmIChtICYmIG0tPm1wX3N1YnNjcmlwdCkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IG0tPm1wX3N1YnNjcmlwdChvLCBrZXkpOworICAgICAgICBhc3NlcnQoKGl0ZW0gIT0gTlVMTCkgXiAoUHlFcnJfT2NjdXJyZWQoKSAhPSBOVUxMKSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KIAogICAgIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSkgewogICAgICAgICBpZiAoUHlJbmRleF9DaGVjayhrZXkpKSB7CkBAIC02NjksMTMgKzY3NSwzMSBAQAogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogICAgIF9QeV9JREVOVElGSUVSKF9fZm9ybWF0X18pOwogCisgICAgaWYgKGZvcm1hdF9zcGVjICE9IE5VTEwgJiYgIVB5VW5pY29kZV9DaGVjayhmb3JtYXRfc3BlYykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkZvcm1hdCBzcGVjaWZpZXIgbXVzdCBiZSBhIHN0cmluZywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGZvcm1hdF9zcGVjKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIEZhc3QgcGF0aCBmb3IgY29tbW9uIHR5cGVzLiAqLworICAgIGlmIChmb3JtYXRfc3BlYyA9PSBOVUxMIHx8IFB5VW5pY29kZV9HRVRfTEVOR1RIKGZvcm1hdF9zcGVjKSA9PSAwKSB7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChvYmopKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYob2JqKTsKKyAgICAgICAgICAgIHJldHVybiBvYmo7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5TG9uZ19DaGVja0V4YWN0KG9iaikpIHsKKyAgICAgICAgICAgIHJldHVybiBQeU9iamVjdF9TdHIob2JqKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qIElmIG5vIGZvcm1hdF9zcGVjIGlzIHByb3ZpZGVkLCB1c2UgYW4gZW1wdHkgc3RyaW5nICovCiAgICAgaWYgKGZvcm1hdF9zcGVjID09IE5VTEwpIHsKICAgICAgICAgZW1wdHkgPSBQeVVuaWNvZGVfTmV3KDAsIDApOwogICAgICAgICBmb3JtYXRfc3BlYyA9IGVtcHR5OwogICAgIH0KIAotICAgIC8qIEZpbmQgdGhlICh1bmJvdW5kISkgX19mb3JtYXRfXyBtZXRob2QgKGEgYm9ycm93ZWQgcmVmZXJlbmNlKSAqLworICAgIC8qIEZpbmQgdGhlICh1bmJvdW5kISkgX19mb3JtYXRfXyBtZXRob2QgKi8KICAgICBtZXRoID0gX1B5T2JqZWN0X0xvb2t1cFNwZWNpYWwob2JqLCAmUHlJZF9fX2Zvcm1hdF9fKTsKICAgICBpZiAobWV0aCA9PSBOVUxMKSB7CiAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKQEAgLTExMjIsOCArMTE0NiwxMCBAQAogewogICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotICAgIGlmIChvID09IE5VTEwpCisgICAgaWYgKG8gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KKwogICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CiAgICAgaWYgKG0gJiYgbS0+bmJfbmVnYXRpdmUpCiAgICAgICAgIHJldHVybiAoKm0tPm5iX25lZ2F0aXZlKShvKTsKQEAgLTExMzYsOCArMTE2MiwxMCBAQAogewogICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotICAgIGlmIChvID09IE5VTEwpCisgICAgaWYgKG8gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KKwogICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CiAgICAgaWYgKG0gJiYgbS0+bmJfcG9zaXRpdmUpCiAgICAgICAgIHJldHVybiAoKm0tPm5iX3Bvc2l0aXZlKShvKTsKQEAgLTExNTAsOCArMTE3OCwxMCBAQAogewogICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotICAgIGlmIChvID09IE5VTEwpCisgICAgaWYgKG8gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KKwogICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CiAgICAgaWYgKG0gJiYgbS0+bmJfaW52ZXJ0KQogICAgICAgICByZXR1cm4gKCptLT5uYl9pbnZlcnQpKG8pOwpAQCAtMTE2NCw4ICsxMTk0LDEwIEBACiB7CiAgICAgUHlOdW1iZXJNZXRob2RzICptOwogCi0gICAgaWYgKG8gPT0gTlVMTCkKKyAgICBpZiAobyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQorCiAgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKICAgICBpZiAobSAmJiBtLT5uYl9hYnNvbHV0ZSkKICAgICAgICAgcmV0dXJuIG0tPm5iX2Fic29sdXRlKG8pOwpAQCAtMTE4MSw4ICsxMjEzLDEwIEBACiBQeU51bWJlcl9JbmRleChQeU9iamVjdCAqaXRlbSkKIHsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLSAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgIGlmIChpdGVtID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CisKICAgICBpZiAoUHlMb25nX0NoZWNrKGl0ZW0pKSB7CiAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKICAgICAgICAgcmV0dXJuIGl0ZW07CkBAIC0xMjY1LDQyICsxMjk5LDU1IEBACiBQeU9iamVjdCAqCiBQeU51bWJlcl9Mb25nKFB5T2JqZWN0ICpvKQogeworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgUHlOdW1iZXJNZXRob2RzICptOwogICAgIFB5T2JqZWN0ICp0cnVuY19mdW5jOwogICAgIFB5X2J1ZmZlciB2aWV3OwogICAgIF9QeV9JREVOVElGSUVSKF9fdHJ1bmNfXyk7CiAKLSAgICBpZiAobyA9PSBOVUxMKQorICAgIGlmIChvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CisKICAgICBpZiAoUHlMb25nX0NoZWNrRXhhY3QobykpIHsKICAgICAgICAgUHlfSU5DUkVGKG8pOwogICAgICAgICByZXR1cm4gbzsKICAgICB9CiAgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKICAgICBpZiAobSAmJiBtLT5uYl9pbnQpIHsgLyogVGhpcyBzaG91bGQgaW5jbHVkZSBzdWJjbGFzc2VzIG9mIGludCAqLwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopX1B5TG9uZ19Gcm9tTmJJbnQobyk7CisgICAgICAgIHJlc3VsdCA9IChQeU9iamVjdCAqKV9QeUxvbmdfRnJvbU5iSW50KG8pOworICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgIVB5TG9uZ19DaGVja0V4YWN0KHJlc3VsdCkpIHsKKyAgICAgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIF9QeUxvbmdfQ29weSgoUHlMb25nT2JqZWN0ICopcmVzdWx0KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgdHJ1bmNfZnVuYyA9IF9QeU9iamVjdF9Mb29rdXBTcGVjaWFsKG8sICZQeUlkX19fdHJ1bmNfXyk7CiAgICAgaWYgKHRydW5jX2Z1bmMpIHsKLSAgICAgICAgUHlPYmplY3QgKnRydW5jYXRlZCA9IFB5RXZhbF9DYWxsT2JqZWN0KHRydW5jX2Z1bmMsIE5VTEwpOwotICAgICAgICBQeU9iamVjdCAqaW50X2luc3RhbmNlOworICAgICAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdCh0cnVuY19mdW5jLCBOVUxMKTsKICAgICAgICAgUHlfREVDUkVGKHRydW5jX2Z1bmMpOwotICAgICAgICBpZiAodHJ1bmNhdGVkID09IE5VTEwgfHwgUHlMb25nX0NoZWNrKHRydW5jYXRlZCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1bmNhdGVkOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwgfHwgUHlMb25nX0NoZWNrRXhhY3QocmVzdWx0KSkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlMb25nX0NoZWNrKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIF9QeUxvbmdfQ29weSgoUHlMb25nT2JqZWN0ICopcmVzdWx0KSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CiAgICAgICAgIC8qIF9fdHJ1bmNfXyBpcyBzcGVjaWZpZWQgdG8gcmV0dXJuIGFuIEludGVncmFsIHR5cGUsCiAgICAgICAgICAgIGJ1dCBpbnQoKSBuZWVkcyB0byByZXR1cm4gYW4gaW50LiAqLwotICAgICAgICBtID0gdHJ1bmNhdGVkLT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgICAgIG0gPSByZXN1bHQtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKICAgICAgICAgaWYgKG0gPT0gTlVMTCB8fCBtLT5uYl9pbnQgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAogICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAiX190cnVuY19fIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSAlLjIwMHMpIiwKLSAgICAgICAgICAgICAgICB0cnVuY2F0ZWQtPm9iX3R5cGUtPnRwX25hbWUpOwotICAgICAgICAgICAgUHlfREVDUkVGKHRydW5jYXRlZCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgaW50X2luc3RhbmNlID0gKFB5T2JqZWN0ICopX1B5TG9uZ19Gcm9tTmJJbnQodHJ1bmNhdGVkKTsKLSAgICAgICAgUHlfREVDUkVGKHRydW5jYXRlZCk7Ci0gICAgICAgIHJldHVybiBpbnRfaW5zdGFuY2U7CisgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIChQeU9iamVjdCAqKV9QeUxvbmdfRnJvbU5iSW50KHJlc3VsdCkpOworICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgIVB5TG9uZ19DaGVja0V4YWN0KHJlc3VsdCkpIHsKKyAgICAgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIF9QeUxvbmdfQ29weSgoUHlMb25nT2JqZWN0ICopcmVzdWx0KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTMyMiw3ICsxMzY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKG8pLCAxMCk7CiAKICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKG8sICZ2aWV3LCBQeUJVRl9TSU1QTEUpID09IDApIHsKLSAgICAgICAgUHlPYmplY3QgKnJlc3VsdCwgKmJ5dGVzOworICAgICAgICBQeU9iamVjdCAqYnl0ZXM7CiAKICAgICAgICAgLyogQ29weSB0byBOVUwtdGVybWluYXRlZCBidWZmZXIuICovCiAgICAgICAgIGJ5dGVzID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciAqKXZpZXcuYnVmLCB2aWV3Lmxlbik7CkBAIC0xMzQ2LDIzICsxMzkzLDQzIEBACiB7CiAgICAgUHlOdW1iZXJNZXRob2RzICptOwogCi0gICAgaWYgKG8gPT0gTlVMTCkKKyAgICBpZiAobyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQorCisgICAgaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChvKSkgeworICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgIHJldHVybiBvOworICAgIH0KICAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwogICAgIGlmIChtICYmIG0tPm5iX2Zsb2F0KSB7IC8qIFRoaXMgc2hvdWxkIGluY2x1ZGUgc3ViY2xhc3NlcyBvZiBmbG9hdCAqLwogICAgICAgICBQeU9iamVjdCAqcmVzID0gbS0+bmJfZmxvYXQobyk7Ci0gICAgICAgIGlmIChyZXMgJiYgIVB5RmxvYXRfQ2hlY2socmVzKSkgeworICAgICAgICBkb3VibGUgdmFsOworICAgICAgICBpZiAoIXJlcyB8fCBQeUZsb2F0X0NoZWNrRXhhY3QocmVzKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5RmxvYXRfQ2hlY2socmVzKSkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgIl9fZmxvYXRfXyByZXR1cm5lZCBub24tZmxvYXQgKHR5cGUgJS4yMDBzKSIsCi0gICAgICAgICAgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIiUuNTBzLl9fZmxvYXRfXyByZXR1cm5lZCBub24tZmxvYXQgKHR5cGUgJS41MHMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvLT5vYl90eXBlLT50cF9uYW1lLCByZXMtPm9iX3R5cGUtPnRwX25hbWUpOwogICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAvKiBJc3N1ZSAjMjY5ODM6IHdhcm4gaWYgJ3Jlcycgbm90IG9mIGV4YWN0IHR5cGUgZmxvYXQuICovCisgICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgMSwKKyAgICAgICAgICAgICAgICAiJS41MHMuX19mbG9hdF9fIHJldHVybmVkIG5vbi1mbG9hdCAodHlwZSAlLjUwcykuICAiCisgICAgICAgICAgICAgICAgIlRoZSBhYmlsaXR5IHRvIHJldHVybiBhbiBpbnN0YW5jZSBvZiBhIHN0cmljdCBzdWJjbGFzcyBvZiBmbG9hdCAiCisgICAgICAgICAgICAgICAgImlzIGRlcHJlY2F0ZWQsIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFB5dGhvbi4iLAorICAgICAgICAgICAgICAgIG8tPm9iX3R5cGUtPnRwX25hbWUsIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdmFsID0gUHlGbG9hdF9BU19ET1VCTEUocmVzKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKICAgICB9CiAgICAgaWYgKFB5RmxvYXRfQ2hlY2sobykpIHsgLyogQSBmbG9hdCBzdWJjbGFzcyB3aXRoIG5iX2Zsb2F0ID09IE5VTEwgKi8KLSAgICAgICAgUHlGbG9hdE9iamVjdCAqcG8gPSAoUHlGbG9hdE9iamVjdCAqKW87Ci0gICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocG8tPm9iX2Z2YWwpOworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKFB5RmxvYXRfQVNfRE9VQkxFKG8pKTsKICAgICB9CiAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbVN0cmluZyhvKTsKIH0KQEAgLTE0MzAsOCArMTQ5Nyw5IEBACiB7CiAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLSAgICBpZiAocyA9PSBOVUxMIHx8IG8gPT0gTlVMTCkKKyAgICBpZiAocyA9PSBOVUxMIHx8IG8gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKICAgICBpZiAobSAmJiBtLT5zcV9jb25jYXQpCkBAIC0xNDU0LDggKzE1MjIsOSBAQAogewogICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0gICAgaWYgKG8gPT0gTlVMTCkKKyAgICBpZiAobyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQogCiAgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwogICAgIGlmIChtICYmIG0tPnNxX3JlcGVhdCkKQEAgLTE0ODMsOCArMTU1Miw5IEBACiB7CiAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLSAgICBpZiAocyA9PSBOVUxMIHx8IG8gPT0gTlVMTCkKKyAgICBpZiAocyA9PSBOVUxMIHx8IG8gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKICAgICBpZiAobSAmJiBtLT5zcV9pbnBsYWNlX2NvbmNhdCkKQEAgLTE1MDcsOCArMTU3Nyw5IEBACiB7CiAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLSAgICBpZiAobyA9PSBOVUxMKQorICAgIGlmIChvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CiAKICAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CiAgICAgaWYgKG0gJiYgbS0+c3FfaW5wbGFjZV9yZXBlYXQpCkBAIC0xNTM2LDE2ICsxNjA3LDE5IEBACiB7CiAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLSAgICBpZiAocyA9PSBOVUxMKQorICAgIGlmIChzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CiAKICAgICBtID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CiAgICAgaWYgKG0gJiYgbS0+c3FfaXRlbSkgewogICAgICAgICBpZiAoaSA8IDApIHsKICAgICAgICAgICAgIGlmIChtLT5zcV9sZW5ndGgpIHsKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7Ci0gICAgICAgICAgICAgICAgaWYgKGwgPCAwKQorICAgICAgICAgICAgICAgIGlmIChsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoUHlFcnJfT2NjdXJyZWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpICs9IGw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1NjAsNyArMTYzNCw5IEBACiB7CiAgICAgUHlNYXBwaW5nTWV0aG9kcyAqbXA7CiAKLSAgICBpZiAoIXMpIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKCFzKSB7CisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQogCiAgICAgbXAgPSBzLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOwogICAgIGlmIChtcCAmJiBtcC0+bXBfc3Vic2NyaXB0KSB7CkBAIC0xNjg3LDggKzE3NjMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogICAgIFB5X3NzaXplX3QgajsKIAotICAgIGlmICh2ID09IE5VTEwpCisgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIC8qIFNwZWNpYWwtY2FzZSB0aGUgY29tbW9uIHR1cGxlIGFuZCBsaXN0IGNhc2VzLCBmb3IgZWZmaWNpZW5jeS4gKi8KICAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHYpKSB7CkBAIC0xNzY4LDggKzE4NDUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAvKiByZXN1bHQgbGlzdCAqLwogICAgIFB5T2JqZWN0ICpydjsgICAgICAgICAgLyogcmV0dXJuIHZhbHVlIGZyb20gUHlMaXN0X0V4dGVuZCAqLwogCi0gICAgaWYgKHYgPT0gTlVMTCkKKyAgICBpZiAodiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQogCiAgICAgcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCkBAIC0xNzg5LDggKzE4NjcsOSBAQAogewogICAgIFB5T2JqZWN0ICppdDsKIAotICAgIGlmICh2ID09IE5VTEwpCisgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIGlmIChQeUxpc3RfQ2hlY2tFeGFjdCh2KSB8fCBQeVR1cGxlX0NoZWNrRXhhY3QodikpIHsKICAgICAgICAgUHlfSU5DUkVGKHYpOwpAQCAtMTk3Myw4ICsyMDUyLDkgQEAKIHsKICAgICBQeU9iamVjdCAqb2tleSwgKnI7CiAKLSAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgaWYgKGtleSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQogCiAgICAgb2tleSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKGtleSk7CiAgICAgaWYgKG9rZXkgPT0gTlVMTCkKQEAgLTIxNDMsNyArMjIyMyw3IEBACiB9CiAKIFB5T2JqZWN0ICoKLVB5T2JqZWN0X0NhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKK1B5T2JqZWN0X0NhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIHRlcm5hcnlmdW5jIGNhbGw7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKQEAgLTIxNTIsNiArMjIzMiw4IEBACiAgICAgICAgYmVjYXVzZSBpdCBtYXkgY2xlYXIgaXQgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGFuZCBzbyB0aGUKICAgICAgICBjYWxsZXIgbG9zZXMgaXRzIGV4Y2VwdGlvbiAqLwogICAgIGFzc2VydCghUHlFcnJfT2NjdXJyZWQoKSk7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOworICAgIGFzc2VydChrd2FyZ3MgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa3dhcmdzKSk7CiAKICAgICBjYWxsID0gZnVuYy0+b2JfdHlwZS0+dHBfY2FsbDsKICAgICBpZiAoY2FsbCA9PSBOVUxMKSB7CkBAIC0yMTYzLDEwOCArMjI0NSwyOTMgQEAKICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgY2FsbGluZyBhIFB5dGhvbiBvYmplY3QiKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICByZXN1bHQgPSAoKmNhbGwpKGZ1bmMsIGFyZywga3cpOworICAgIHJlc3VsdCA9ICgqY2FsbCkoZnVuYywgYXJncywga3dhcmdzKTsKIAogICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwogCiAgICAgcmV0dXJuIF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KGZ1bmMsIHJlc3VsdCwgTlVMTCk7CiB9CiAKK1B5T2JqZWN0KgorX1B5U3RhY2tfQXNUdXBsZShQeU9iamVjdCAqKnN0YWNrLCBQeV9zc2l6ZV90IG5hcmdzKQoreworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5X3NzaXplX3QgaTsKKworICAgIGFyZ3MgPSBQeVR1cGxlX05ldyhuYXJncyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaSA8IG5hcmdzOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBzdGFja1tpXTsKKyAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIGksIGl0ZW0pOworICAgIH0KKworICAgIHJldHVybiBhcmdzOworfQorCitQeU9iamVjdCAqCitfUHlPYmplY3RfRmFzdENhbGxEaWN0KFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqKmFyZ3MsIFB5X3NzaXplX3QgbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgICAgdGVybmFyeWZ1bmMgY2FsbDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKworICAgIC8qIF9QeU9iamVjdF9GYXN0Q2FsbERpY3QoKSBtdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhbiBleGNlcHRpb24gc2V0LAorICAgICAgIGJlY2F1c2UgaXQgbWF5IGNsZWFyIGl0IChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBhbmQgc28gdGhlCisgICAgICAgY2FsbGVyIGxvc2VzIGl0cyBleGNlcHRpb24gKi8KKyAgICBhc3NlcnQoIVB5RXJyX09jY3VycmVkKCkpOworCisgICAgYXNzZXJ0KGZ1bmMgIT0gTlVMTCk7CisgICAgYXNzZXJ0KG5hcmdzID49IDApOworICAgIGFzc2VydChuYXJncyA9PSAwIHx8IGFyZ3MgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGt3YXJncyA9PSBOVUxMIHx8IFB5RGljdF9DaGVjayhrd2FyZ3MpKTsKKworICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBjYWxsaW5nIGEgUHl0aG9uIG9iamVjdCIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKSB7CisgICAgICAgIHJlc3VsdCA9IF9QeUZ1bmN0aW9uX0Zhc3RDYWxsRGljdChmdW5jLCBhcmdzLCBuYXJncywga3dhcmdzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykpIHsKKyAgICAgICAgcmVzdWx0ID0gX1B5Q0Z1bmN0aW9uX0Zhc3RDYWxsRGljdChmdW5jLCBhcmdzLCBuYXJncywga3dhcmdzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICp0dXBsZTsKKworICAgICAgICAvKiBTbG93LXBhdGg6IGJ1aWxkIGEgdGVtcG9yYXJ5IHR1cGxlICovCisgICAgICAgIGNhbGwgPSBmdW5jLT5vYl90eXBlLT50cF9jYWxsOworICAgICAgICBpZiAoY2FsbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICB0dXBsZSA9IF9QeVN0YWNrX0FzVHVwbGUoYXJncywgbmFyZ3MpOworICAgICAgICBpZiAodHVwbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gKCpjYWxsKShmdW5jLCB0dXBsZSwga3dhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKKworICAgICAgICByZXN1bHQgPSBfUHlfQ2hlY2tGdW5jdGlvblJlc3VsdChmdW5jLCByZXN1bHQsIE5VTEwpOworICAgIH0KKworZXhpdDoKKyAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIFBvc2l0aW9uYWwgYXJndW1lbnRzIGFyZSBvYmogZm9sbG93ZWQgYXJncy4gKi8KK1B5T2JqZWN0ICoKK19QeU9iamVjdF9DYWxsX1ByZXBlbmQoUHlPYmplY3QgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIFB5T2JqZWN0ICpzbWFsbF9zdGFja1s4XTsKKyAgICBQeU9iamVjdCAqKnN0YWNrOworICAgIFB5X3NzaXplX3QgYXJnY291bnQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKworICAgIGFyZ2NvdW50ID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBpZiAoYXJnY291bnQgKyAxIDw9IChQeV9zc2l6ZV90KVB5X0FSUkFZX0xFTkdUSChzbWFsbF9zdGFjaykpIHsKKyAgICAgICAgc3RhY2sgPSBzbWFsbF9zdGFjazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YWNrID0gUHlNZW1fTWFsbG9jKChhcmdjb3VudCArIDEpICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICAgICAgaWYgKHN0YWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHVzZSBib3Jyb3dlZCByZWZlcmVuY2VzICovCisgICAgc3RhY2tbMF0gPSBvYmo7CisgICAgUHlfTUVNQ1BZKCZzdGFja1sxXSwKKyAgICAgICAgICAgICAgJlB5VHVwbGVfR0VUX0lURU0oYXJncywgMCksCisgICAgICAgICAgICAgIGFyZ2NvdW50ICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKKworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9GYXN0Q2FsbERpY3QoZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLCBhcmdjb3VudCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2FyZ3MpOworICAgIGlmIChzdGFjayAhPSBzbWFsbF9zdGFjaykgeworICAgICAgICBQeU1lbV9GcmVlKHN0YWNrKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK19QeVN0YWNrX0FzRGljdChQeU9iamVjdCAqKnZhbHVlcywgUHlfc3NpemVfdCBua3dhcmdzLCBQeU9iamVjdCAqa3duYW1lcywKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqZnVuYykKK3sKKyAgICBQeU9iamVjdCAqa3dkaWN0OworICAgIFB5X3NzaXplX3QgaTsKKworICAgIGt3ZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoa3dkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpPTA7IGkgPCBua3dhcmdzOyBpKyspIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgUHlPYmplY3QgKmtleSA9IFB5VHVwbGVfR0VUX0lURU0oa3duYW1lcywgaSk7CisgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9ICp2YWx1ZXMrKzsKKworICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW0oa3dkaWN0LCBrZXkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyVzIGdvdCBtdWx0aXBsZSB2YWx1ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Iga2V5d29yZCBhcmd1bWVudCAnJVUnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0RnVuY05hbWUoZnVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtleSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoa3dkaWN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oa3dkaWN0LCBrZXksIHZhbHVlKTsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgUHlfREVDUkVGKGt3ZGljdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ga3dkaWN0OworfQorCitQeU9iamVjdCAqCitfUHlPYmplY3RfRmFzdENhbGxLZXl3b3JkcyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKipzdGFjaywgUHlfc3NpemVfdCBuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd25hbWVzKQoreworICAgIFB5T2JqZWN0ICprd2RpY3QsICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBua3dhcmdzID0gKGt3bmFtZXMgPT0gTlVMTCkgPyAwIDogUHlUdXBsZV9HRVRfU0laRShrd25hbWVzKTsKKworICAgIGFzc2VydChuYXJncyA+PSAwKTsKKyAgICBhc3NlcnQoa3duYW1lcyA9PSBOVUxMIHx8IFB5VHVwbGVfQ2hlY2tFeGFjdChrd25hbWVzKSk7CisgICAgYXNzZXJ0KChuYXJncyA9PSAwICYmIG5rd2FyZ3MgPT0gMCkgfHwgc3RhY2sgIT0gTlVMTCk7CisKKyAgICBpZiAoUHlGdW5jdGlvbl9DaGVjayhmdW5jKSkgeworICAgICAgICAvKiBGYXN0LXBhdGg6IGF2b2lkIHRlbXBvcmFyeSB0dXBsZSBvciBkaWN0ICovCisgICAgICAgIHJldHVybiBfUHlGdW5jdGlvbl9GYXN0Q2FsbEtleXdvcmRzKGZ1bmMsIHN0YWNrLCBuYXJncywga3duYW1lcyk7CisgICAgfQorCisgICAgaWYgKG5rd2FyZ3MgPiAwKSB7CisgICAgICAgIGt3ZGljdCA9IF9QeVN0YWNrX0FzRGljdChzdGFjayArIG5hcmdzLCBua3dhcmdzLCBrd25hbWVzLCBmdW5jKTsKKyAgICAgICAgaWYgKGt3ZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAga3dkaWN0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBfUHlPYmplY3RfRmFzdENhbGxEaWN0KGZ1bmMsIHN0YWNrLCBuYXJncywga3dkaWN0KTsKKyAgICBQeV9YREVDUkVGKGt3ZGljdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogc3RhdGljIFB5T2JqZWN0KgogY2FsbF9mdW5jdGlvbl90YWlsKFB5T2JqZWN0ICpjYWxsYWJsZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlPYmplY3QgKnJldHZhbDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0gICAgaWYgKGFyZ3MgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KGFyZ3MgIT0gTlVMTCk7CiAKICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLSAgICAgICAgUHlPYmplY3QgKmE7Ci0KLSAgICAgICAgYSA9IFB5VHVwbGVfTmV3KDEpOwotICAgICAgICBpZiAoYSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGEsIDAsIGFyZ3MpOwotICAgICAgICBhcmdzID0gYTsKKyAgICAgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0NhbGxBcmcxKGNhbGxhYmxlLCBhcmdzKTsKICAgICB9Ci0gICAgcmV0dmFsID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7CisgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIGFyZ3MsIE5VTEwpOworICAgIH0KIAotICAgIFB5X0RFQ1JFRihhcmdzKTsKLQotICAgIHJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5T2JqZWN0ICpjYWxsYWJsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAgICAgdmFfbGlzdCB2YTsKLSAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqYXJncywgKnJlc3VsdDsKIAotICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMKQorICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7Ci0KLSAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKLSAgICAgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0gICAgICAgIGFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7Ci0gICAgICAgIHZhX2VuZCh2YSk7CiAgICAgfQotICAgIGVsc2UKLSAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwotICAgIGlmIChhcmdzID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgcmV0dXJuIGNhbGxfZnVuY3Rpb25fdGFpbChjYWxsYWJsZSwgYXJncyk7CisgICAgaWYgKCFmb3JtYXQgfHwgISpmb3JtYXQpIHsKKyAgICAgICAgcmV0dXJuIF9QeU9iamVjdF9DYWxsTm9BcmcoY2FsbGFibGUpOworICAgIH0KKworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIGFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7CisgICAgdmFfZW5kKHZhKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJlc3VsdCA9IGNhbGxfZnVuY3Rpb25fdGFpbChjYWxsYWJsZSwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQoUHlPYmplY3QgKmNhbGxhYmxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKICAgICB2YV9saXN0IHZhOwotICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzdWx0OwogCi0gICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKLQotICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkgewotICAgICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKLSAgICAgICAgYXJncyA9IF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoZm9ybWF0LCB2YSk7Ci0gICAgICAgIHZhX2VuZCh2YSk7CiAgICAgfQotICAgIGVsc2UKLSAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwogCi0gICAgcmV0dXJuIGNhbGxfZnVuY3Rpb25fdGFpbChjYWxsYWJsZSwgYXJncyk7CisgICAgaWYgKCFmb3JtYXQgfHwgISpmb3JtYXQpIHsKKyAgICAgICAgcmV0dXJuIF9QeU9iamVjdF9DYWxsTm9BcmcoY2FsbGFibGUpOworICAgIH0KKworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIGFyZ3MgPSBfUHlfVmFCdWlsZFZhbHVlX1NpemVUKGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBjYWxsX2Z1bmN0aW9uX3RhaWwoY2FsbGFibGUsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBjYWxsbWV0aG9kKFB5T2JqZWN0KiBmdW5jLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmEsIGludCBpc19zaXplX3QpCiB7Ci0gICAgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmFyZ3MsICpyZXN1bHQ7CisKKyAgICBhc3NlcnQoZnVuYyAhPSBOVUxMKTsKIAogICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewogICAgICAgICB0eXBlX2Vycm9yKCJhdHRyaWJ1dGUgb2YgdHlwZSAnJS4yMDBzJyBpcyBub3QgY2FsbGFibGUiLCBmdW5jKTsKLSAgICAgICAgZ290byBleGl0OworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKLSAgICAgICAgaWYgKGlzX3NpemVfdCkKLSAgICAgICAgICAgIGFyZ3MgPSBfUHlfVmFCdWlsZFZhbHVlX1NpemVUKGZvcm1hdCwgdmEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOworICAgIGlmICghZm9ybWF0IHx8ICEqZm9ybWF0KSB7CisgICAgICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE5vQXJnKGZ1bmMpOwogICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKIAotICAgIHJldHZhbCA9IGNhbGxfZnVuY3Rpb25fdGFpbChmdW5jLCBhcmdzKTsKKyAgICBpZiAoaXNfc2l6ZV90KSB7CisgICAgICAgIGFyZ3MgPSBfUHlfVmFCdWlsZFZhbHVlX1NpemVUKGZvcm1hdCwgdmEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKyAgICB9CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgZXhpdDoKLSAgICAvKiBhcmdzIGdldHMgY29uc3VtZWQgaW4gY2FsbF9mdW5jdGlvbl90YWlsICovCi0gICAgUHlfWERFQ1JFRihmdW5jKTsKLQotICAgIHJldHVybiByZXR2YWw7CisgICAgcmVzdWx0ID0gY2FsbF9mdW5jdGlvbl90YWlsKGZ1bmMsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCkBAIC0yMjc0LDggKzI1NDEsOSBAQAogICAgIFB5T2JqZWN0ICpmdW5jID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKIAotICAgIGlmIChvID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorICAgIGlmIChvID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQogCiAgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgbmFtZSk7CiAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKQEAgLTIyODQsNiArMjU1Miw3IEBACiAgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CiAgICAgcmV0dmFsID0gY2FsbG1ldGhvZChmdW5jLCBmb3JtYXQsIHZhLCAwKTsKICAgICB2YV9lbmQodmEpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yMjk1LDggKzI1NjQsOSBAQAogICAgIFB5T2JqZWN0ICpmdW5jID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKIAotICAgIGlmIChvID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorICAgIGlmIChvID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQogCiAgICAgZnVuYyA9IF9QeU9iamVjdF9HZXRBdHRySWQobywgbmFtZSk7CiAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKQEAgLTIzMDUsNiArMjU3NSw3IEBACiAgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CiAgICAgcmV0dmFsID0gY2FsbG1ldGhvZChmdW5jLCBmb3JtYXQsIHZhLCAwKTsKICAgICB2YV9lbmQodmEpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yMzE2LDggKzI1ODcsOSBAQAogICAgIFB5T2JqZWN0ICpmdW5jID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmV0dmFsOwogCi0gICAgaWYgKG8gPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCisgICAgaWYgKG8gPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CiAKICAgICBmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvLCBuYW1lKTsKICAgICBpZiAoZnVuYyA9PSBOVUxMKQpAQCAtMjMyNSw2ICsyNTk3LDcgQEAKICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKICAgICByZXR2YWwgPSBjYWxsbWV0aG9kKGZ1bmMsIGZvcm1hdCwgdmEsIDEpOwogICAgIHZhX2VuZCh2YSk7CisgICAgUHlfREVDUkVGKGZ1bmMpOwogICAgIHJldHVybiByZXR2YWw7CiB9CiAKQEAgLTIzMzYsOCArMjYwOSw5IEBACiAgICAgUHlPYmplY3QgKmZ1bmMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZXR2YWw7CiAKLSAgICBpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKKyAgICBpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIGZ1bmMgPSBfUHlPYmplY3RfR2V0QXR0cklkKG8sIG5hbWUpOwogICAgIGlmIChmdW5jID09IE5VTEwpIHsKQEAgLTIzNDYsMzkgKzI2MjAsNjEgQEAKICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKICAgICByZXR2YWwgPSBjYWxsbWV0aG9kKGZ1bmMsIGZvcm1hdCwgdmEsIDEpOwogICAgIHZhX2VuZCh2YSk7CisgICAgUHlfREVDUkVGKGZ1bmMpOwogICAgIHJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1vYmphcmdzX21rdHVwbGUodmFfbGlzdCB2YSkKK3N0YXRpYyBQeU9iamVjdCAqKgorb2JqYXJnc19ta3N0YWNrKFB5T2JqZWN0ICoqc21hbGxfc3RhY2ssIFB5X3NzaXplX3Qgc21hbGxfc3RhY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICB2YV9saXN0IHZhLCBQeV9zc2l6ZV90ICpwX25hcmdzKQogewotICAgIGludCBpLCBuID0gMDsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAgICAgdmFfbGlzdCBjb3VudHZhOwotICAgIFB5T2JqZWN0ICpyZXN1bHQsICp0bXA7CisgICAgUHlPYmplY3QgKipzdGFjazsKIAotICAgICAgICBQeV9WQV9DT1BZKGNvdW50dmEsIHZhKTsKKyAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworICAgIFB5X1ZBX0NPUFkoY291bnR2YSwgdmEpOwogCi0gICAgd2hpbGUgKCgoUHlPYmplY3QgKil2YV9hcmcoY291bnR2YSwgUHlPYmplY3QgKikpICE9IE5VTEwpCi0gICAgICAgICsrbjsKLSAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhuKTsKLSAgICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgbiA+IDApIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgdG1wID0gKFB5T2JqZWN0ICopdmFfYXJnKHZhLCBQeU9iamVjdCAqKTsKLSAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCB0bXApOwotICAgICAgICAgICAgUHlfSU5DUkVGKHRtcCk7CisgICAgbiA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZyA9IChQeU9iamVjdCAqKXZhX2FyZyhjb3VudHZhLCBQeU9iamVjdCAqKTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBuKys7CisgICAgfQorICAgICpwX25hcmdzID0gbjsKKworICAgIC8qIENvcHkgYXJndW1lbnRzICovCisgICAgaWYgKG4gPD0gc21hbGxfc3RhY2tfc2l6ZSkgeworICAgICAgICBzdGFjayA9IHNtYWxsX3N0YWNrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RhY2sgPSBQeU1lbV9NYWxsb2MobiAqIHNpemVvZihzdGFja1swXSkpOworICAgICAgICBpZiAoc3RhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIHN0YWNrW2ldID0gdmFfYXJnKHZhLCBQeU9iamVjdCAqKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YWNrOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncyhQeU9iamVjdCAqY2FsbGFibGUsIFB5T2JqZWN0ICpuYW1lLCAuLi4pCiB7Ci0gICAgUHlPYmplY3QgKmFyZ3MsICp0bXA7CisgICAgUHlPYmplY3QgKnNtYWxsX3N0YWNrWzVdOworICAgIFB5T2JqZWN0ICoqc3RhY2s7CisgICAgUHlfc3NpemVfdCBuYXJnczsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgIHZhX2xpc3QgdmFyZ3M7CiAKLSAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQogCiAgICAgY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKGNhbGxhYmxlLCBuYW1lKTsKICAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkKQEAgLTIzODYsMjggKzI2ODIsMzYgQEAKIAogICAgIC8qIGNvdW50IHRoZSBhcmdzICovCiAgICAgdmFfc3RhcnQodmFyZ3MsIG5hbWUpOwotICAgIGFyZ3MgPSBvYmphcmdzX21rdHVwbGUodmFyZ3MpOworICAgIHN0YWNrID0gb2JqYXJnc19ta3N0YWNrKHNtYWxsX3N0YWNrLCBQeV9BUlJBWV9MRU5HVEgoc21hbGxfc3RhY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmdzLCAmbmFyZ3MpOwogICAgIHZhX2VuZCh2YXJncyk7Ci0gICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgIGlmIChzdGFjayA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICB0bXAgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBhcmdzLCBOVUxMKTsKLSAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKIAotICAgIHJldHVybiB0bXA7CisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0Zhc3RDYWxsKGNhbGxhYmxlLCBzdGFjaywgbmFyZ3MpOworICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CisgICAgaWYgKHN0YWNrICE9IHNtYWxsX3N0YWNrKSB7CisgICAgICAgIFB5TWVtX0ZyZWUoc3RhY2spOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeU9iamVjdF9DYWxsTWV0aG9kSWRPYmpBcmdzKFB5T2JqZWN0ICpjYWxsYWJsZSwKICAgICAgICAgc3RydWN0IF9QeV9JZGVudGlmaWVyICpuYW1lLCAuLi4pCiB7Ci0gICAgUHlPYmplY3QgKmFyZ3MsICp0bXA7CisgICAgUHlPYmplY3QgKnNtYWxsX3N0YWNrWzVdOworICAgIFB5T2JqZWN0ICoqc3RhY2s7CisgICAgUHlfc3NpemVfdCBuYXJnczsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgIHZhX2xpc3QgdmFyZ3M7CiAKLSAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQogCiAgICAgY2FsbGFibGUgPSBfUHlPYmplY3RfR2V0QXR0cklkKGNhbGxhYmxlLCBuYW1lKTsKICAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkKQEAgLTI0MTUsMzggKzI3MTksNTEgQEAKIAogICAgIC8qIGNvdW50IHRoZSBhcmdzICovCiAgICAgdmFfc3RhcnQodmFyZ3MsIG5hbWUpOwotICAgIGFyZ3MgPSBvYmphcmdzX21rdHVwbGUodmFyZ3MpOworICAgIHN0YWNrID0gb2JqYXJnc19ta3N0YWNrKHNtYWxsX3N0YWNrLCBQeV9BUlJBWV9MRU5HVEgoc21hbGxfc3RhY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmdzLCAmbmFyZ3MpOwogICAgIHZhX2VuZCh2YXJncyk7Ci0gICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgIGlmIChzdGFjayA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICB0bXAgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBhcmdzLCBOVUxMKTsKLSAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKIAotICAgIHJldHVybiB0bXA7CisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0Zhc3RDYWxsKGNhbGxhYmxlLCBzdGFjaywgbmFyZ3MpOworICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CisgICAgaWYgKHN0YWNrICE9IHNtYWxsX3N0YWNrKSB7CisgICAgICAgIFB5TWVtX0ZyZWUoc3RhY2spOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoUHlPYmplY3QgKmNhbGxhYmxlLCAuLi4pCiB7Ci0gICAgUHlPYmplY3QgKmFyZ3MsICp0bXA7CisgICAgUHlPYmplY3QgKnNtYWxsX3N0YWNrWzVdOworICAgIFB5T2JqZWN0ICoqc3RhY2s7CisgICAgUHlfc3NpemVfdCBuYXJnczsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgIHZhX2xpc3QgdmFyZ3M7CiAKLSAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkKKyAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIC8qIGNvdW50IHRoZSBhcmdzICovCiAgICAgdmFfc3RhcnQodmFyZ3MsIGNhbGxhYmxlKTsKLSAgICBhcmdzID0gb2JqYXJnc19ta3R1cGxlKHZhcmdzKTsKKyAgICBzdGFjayA9IG9iamFyZ3NfbWtzdGFjayhzbWFsbF9zdGFjaywgUHlfQVJSQVlfTEVOR1RIKHNtYWxsX3N0YWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJncywgJm5hcmdzKTsKICAgICB2YV9lbmQodmFyZ3MpOwotICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgaWYgKHN0YWNrID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgdG1wID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KIAotICAgIHJldHVybiB0bXA7CisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0Zhc3RDYWxsKGNhbGxhYmxlLCBzdGFjaywgbmFyZ3MpOworICAgIGlmIChzdGFjayAhPSBzbWFsbF9zdGFjaykgeworICAgICAgICBQeU1lbV9GcmVlKHN0YWNrKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKZGlmZiAtLWdpdCBhL09iamVjdHMvYnl0ZWFycmF5b2JqZWN0LmMgYi9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jCmluZGV4IDZkNGM2YTEuLmM2ZDA3MDcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYnl0ZWFycmF5b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9ieXRlYXJyYXlvYmplY3QuYwpAQCAtMjc4LDMxICsyNzgsNiBAQAogICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1ieXRlYXJyYXlfZm9ybWF0KFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLSAgICBQeU9iamVjdCAqYnl0ZXNfaW4sICpieXRlc19vdXQsICpyZXM7Ci0gICAgY2hhciAqYnl0ZXN0cmluZzsKLQotICAgIGlmIChzZWxmID09IE5VTEwgfHwgIVB5Qnl0ZUFycmF5X0NoZWNrKHNlbGYpIHx8IGFyZ3MgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGJ5dGVzdHJpbmcgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0gICAgYnl0ZXNfaW4gPSBQeUJ5dGVzX0Zyb21TdHJpbmcoYnl0ZXN0cmluZyk7Ci0gICAgaWYgKGJ5dGVzX2luID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGJ5dGVzX291dCA9IF9QeUJ5dGVzX0Zvcm1hdChieXRlc19pbiwgYXJncyk7Ci0gICAgUHlfREVDUkVGKGJ5dGVzX2luKTsKLSAgICBpZiAoYnl0ZXNfb3V0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlcyA9IFB5Qnl0ZUFycmF5X0Zyb21PYmplY3QoYnl0ZXNfb3V0KTsKLSAgICBQeV9ERUNSRUYoYnl0ZXNfb3V0KTsKLSAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiByZXM7Ci19Ci0KIC8qIEZ1bmN0aW9ucyBzdHVmZmVkIGludG8gdGhlIHR5cGUgb2JqZWN0ICovCiAKIHN0YXRpYyBQeV9zc2l6ZV90CkBAIC04MjAsMTcgKzc5NSwxNSBAQAogICAgIH0KIAogICAgIC8qIElzIGl0IGFuIGludD8gKi8KLSAgICBjb3VudCA9IFB5TnVtYmVyX0FzU3NpemVfdChhcmcsIFB5RXhjX092ZXJmbG93RXJyb3IpOwotICAgIGlmIChjb3VudCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQorICAgIGlmIChQeUluZGV4X0NoZWNrKGFyZykpIHsKKyAgICAgICAgY291bnQgPSBQeU51bWJlcl9Bc1NzaXplX3QoYXJnLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKKyAgICAgICAgaWYgKGNvdW50ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY291bnQgPCAwKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgY291bnQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIGNvdW50Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICAgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICAgICAgaWYgKFB5Qnl0ZUFycmF5X1Jlc2l6ZSgoUHlPYmplY3QgKilzZWxmLCBjb3VudCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTExOSwxNjEgKzEwOTIsMjcgQEAKICNpbmNsdWRlICJzdHJpbmdsaWIvdHJhbnNtb2dyaWZ5LmgiCiAKIAotLyogVGhlIGZvbGxvd2luZyBQeV9MT0NBTF9JTkxJTkUgYW5kIFB5X0xPQ0FMIGZ1bmN0aW9ucwotd2VyZSBjb3BpZWQgZnJvbSB0aGUgb2xkIGNoYXIqIHN0eWxlIHN0cmluZyBvYmplY3QuICovCi0KLS8qIGhlbHBlciBtYWNybyB0byBmaXh1cCBzdGFydC9lbmQgc2xpY2UgdmFsdWVzICovCi0jZGVmaW5lIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbikgICAgICAgICBcCi0gICAgaWYgKGVuZCA+IGxlbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVuZCA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAoZW5kIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVuZCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChlbmQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHN0YXJ0IDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHN0YXJ0ICs9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChzdGFydCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBzdGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1QeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKLWJ5dGVhcnJheV9maW5kX2ludGVybmFsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGRpcikKLXsKLSAgICBQeU9iamVjdCAqc3Vib2JqOwotICAgIGNoYXIgYnl0ZTsKLSAgICBQeV9idWZmZXIgc3ViYnVmOwotICAgIGNvbnN0IGNoYXIgKnN1YjsKLSAgICBQeV9zc2l6ZV90IGxlbiwgc3ViX2xlbjsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0PTAsIGVuZD1QWV9TU0laRV9UX01BWDsKLSAgICBQeV9zc2l6ZV90IHJlczsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfYnl0ZSgiZmluZC9yZmluZC9pbmRleC9yaW5kZXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLCAmc3Vib2JqLCAmYnl0ZSwgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIC0yOwotCi0gICAgaWYgKHN1Ym9iaikgewotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Ym9iaiwgJnN1YmJ1ZiwgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0yOwotCi0gICAgICAgIHN1YiA9IHN1YmJ1Zi5idWY7Ci0gICAgICAgIHN1Yl9sZW4gPSBzdWJidWYubGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViID0gJmJ5dGU7Ci0gICAgICAgIHN1Yl9sZW4gPSAxOwotICAgIH0KLSAgICBsZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7Ci0gICAgaWYgKGVuZCAtIHN0YXJ0IDwgc3ViX2xlbikKLSAgICAgICAgcmVzID0gLTE7Ci0gICAgZWxzZSBpZiAoc3ViX2xlbiA9PSAxCi0jaWZuZGVmIEhBVkVfTUVNUkNIUgotICAgICAgICAgICAgJiYgZGlyID4gMAotI2VuZGlmCi0gICAgKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlID0gKnN1YjsKLSAgICAgICAgaW50IG1vZGUgPSAoZGlyID4gMCkgPyBGQVNUX1NFQVJDSCA6IEZBU1RfUlNFQVJDSDsKLSAgICAgICAgcmVzID0gc3RyaW5nbGliX2Zhc3RzZWFyY2hfbWVtY2hyXzFjaGFyKAotICAgICAgICAgICAgUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAotICAgICAgICAgICAgbmVlZGxlLCBuZWVkbGUsIG1vZGUpOwotICAgICAgICBpZiAocmVzID49IDApCi0gICAgICAgICAgICByZXMgKz0gc3RhcnQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoZGlyID4gMCkKLSAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9maW5kX3NsaWNlKAotICAgICAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgbGVuLAotICAgICAgICAgICAgICAgIHN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9yZmluZF9zbGljZSgKLSAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksIGxlbiwKLSAgICAgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwotICAgIH0KLQotICAgIGlmIChzdWJvYmopCi0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnN1YmJ1Zik7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1QeURvY19TVFJWQVIoZmluZF9fZG9jX18sCi0iQi5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAotXG5cCi1SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxuXAotc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXG5cCi1hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cCi1cblwKLVJldHVybiAtMSBvbiBmYWlsdXJlLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2ZpbmQoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gYnl0ZWFycmF5X2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgKzEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2ZpbmQoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKLVB5RG9jX1NUUlZBUihjb3VudF9fZG9jX18sCi0iQi5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnNlY3Rpb24gc3ViIGluXG5cCi1ieXRlcyBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWRcblwKLWFzIGluIHNsaWNlIG5vdGF0aW9uLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2NvdW50KFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeU9iamVjdCAqc3ViX29iajsKLSAgICBjb25zdCBjaGFyICpzdHIgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksICpzdWI7Ci0gICAgUHlfc3NpemVfdCBzdWJfbGVuOwotICAgIGNoYXIgYnl0ZTsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0KLSAgICBQeV9idWZmZXIgdnN1YjsKLSAgICBQeU9iamVjdCAqY291bnRfb2JqOwotCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc19ieXRlKCJjb3VudCIsIGFyZ3MsICZzdWJfb2JqLCAmYnl0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoc3ViX29iaikgewotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Yl9vYmosICZ2c3ViLCBQeUJVRl9TSU1QTEUpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICBzdWIgPSB2c3ViLmJ1ZjsKLSAgICAgICAgc3ViX2xlbiA9IHZzdWIubGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViID0gJmJ5dGU7Ci0gICAgICAgIHN1Yl9sZW4gPSAxOwotICAgIH0KLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpKTsKLQotICAgIGNvdW50X29iaiA9IFB5TG9uZ19Gcm9tU3NpemVfdCgKLSAgICAgICAgc3RyaW5nbGliX2NvdW50KHN0ciArIHN0YXJ0LCBlbmQgLSBzdGFydCwgc3ViLCBzdWJfbGVuLCBQWV9TU0laRV9UX01BWCkKLSAgICAgICAgKTsKLQotICAgIGlmIChzdWJfb2JqKQotICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2c3ViKTsKLQotICAgIHJldHVybiBjb3VudF9vYmo7CisgICAgcmV0dXJuIF9QeV9ieXRlc19jb3VudChQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LmNsZWFyCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQotCiBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gdGhlIGJ5dGVhcnJheS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9jbGVhcl9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTg1YzJmZTZhZWRlMDk1NmMgaW5wdXQ9ZTUyNGZkMzMwYWJjZGMxOF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTg1YzJmZTZhZWRlMDk1NmMgaW5wdXQ9ZWQ2ZWRhZTlkZTQ0N2FjNF0qLwogewogICAgIGlmIChQeUJ5dGVBcnJheV9SZXNpemUoKFB5T2JqZWN0ICopc2VsZiwgMCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEyODMsMjUzICsxMTIyLDcyIEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuY29weQogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKLQogUmV0dXJuIGEgY29weSBvZiBCLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2NvcHlfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02OGNmYmNmZWQ0ODRjMTMyIGlucHV0PTZkNWQyOTc1YWEwZjMzZjNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02OGNmYmNmZWQ0ODRjMTMyIGlucHV0PTY1OTdiMGMwMWJjY2FhOWVdKi8KIHsKICAgICByZXR1cm4gUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKChQeU9iamVjdCAqKXNlbGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSk7CiB9CiAKLVB5RG9jX1NUUlZBUihpbmRleF9fZG9jX18sCi0iQi5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotTGlrZSBCLmZpbmQoKSBidXQgcmFpc2UgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzZWN0aW9uIGlzIG5vdCBmb3VuZC4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9pbmRleChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlYXJyYXlfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzZWN0aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfaW5kZXgoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKLQotUHlEb2NfU1RSVkFSKHJmaW5kX19kb2NfXywKLSJCLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAotXG5cCi1SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcblwKLXN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxuXAotYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuXAotXG5cCi1SZXR1cm4gLTEgb24gZmFpbHVyZS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9yZmluZChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlYXJyYXlfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCAtMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfcmZpbmQoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKLQotUHlEb2NfU1RSVkFSKHJpbmRleF9fZG9jX18sCi0iQi5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLUxpa2UgQi5yZmluZCgpIGJ1dCByYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3JpbmRleChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlYXJyYXlfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCAtMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzZWN0aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfcmluZGV4KFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi0KIHN0YXRpYyBpbnQKIGJ5dGVhcnJheV9jb250YWlucyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLSAgICBQeV9zc2l6ZV90IGl2YWwgPSBQeU51bWJlcl9Bc1NzaXplX3QoYXJnLCBQeUV4Y19WYWx1ZUVycm9yKTsKLSAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5X2J1ZmZlciB2YXJnOwotICAgICAgICBQeV9zc2l6ZV90IHBvczsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihhcmcsICZ2YXJnLCBQeUJVRl9TSU1QTEUpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHBvcyA9IHN0cmluZ2xpYl9maW5kKFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlfU0laRShzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyZy5idWYsIHZhcmcubGVuLCAwKTsKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmFyZyk7Ci0gICAgICAgIHJldHVybiBwb3MgPj0gMDsKLSAgICB9Ci0gICAgaWYgKGl2YWwgPCAwIHx8IGl2YWwgPj0gMjU2KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnl0ZSBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiBtZW1jaHIoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCAoaW50KSBpdmFsLCBQeV9TSVpFKHNlbGYpKSAhPSBOVUxMOworICAgIHJldHVybiBfUHlfYnl0ZXNfY29udGFpbnMoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJnKTsKIH0KIAotCi0vKiBNYXRjaGVzIHRoZSBlbmQgKGRpcmVjdGlvbiA+PSAwKSBvciBzdGFydCAoZGlyZWN0aW9uIDwgMCkgb2Ygc2VsZgotICogYWdhaW5zdCBzdWJzdHIsIHVzaW5nIHRoZSBzdGFydCBhbmQgZW5kIGFyZ3VtZW50cy4gUmV0dXJucwotICogLTEgb24gZXJyb3IsIDAgaWYgbm90IGZvdW5kIGFuZCAxIGlmIGZvdW5kLgotICovCi1QeV9MT0NBTChpbnQpCi1fYnl0ZWFycmF5X3RhaWxtYXRjaChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnN1YnN0ciwgUHlfc3NpemVfdCBzdGFydCwKLSAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCi17Ci0gICAgUHlfc3NpemVfdCBsZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLSAgICBjb25zdCBjaGFyKiBzdHI7Ci0gICAgUHlfYnVmZmVyIHZzdWJzdHI7Ci0gICAgaW50IHJ2ID0gMDsKLQotICAgIHN0ciA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLQotICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc3Vic3RyLCAmdnN1YnN0ciwgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOwotCi0gICAgaWYgKGRpcmVjdGlvbiA8IDApIHsKLSAgICAgICAgLyogc3RhcnRzd2l0aCAqLwotICAgICAgICBpZiAoc3RhcnQrdnN1YnN0ci5sZW4gPiBsZW4pIHsKLSAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGVuZHN3aXRoICovCi0gICAgICAgIGlmIChlbmQtc3RhcnQgPCB2c3Vic3RyLmxlbiB8fCBzdGFydCA+IGxlbikgewotICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVuZC12c3Vic3RyLmxlbiA+IHN0YXJ0KQotICAgICAgICAgICAgc3RhcnQgPSBlbmQgLSB2c3Vic3RyLmxlbjsKLSAgICB9Ci0gICAgaWYgKGVuZC1zdGFydCA+PSB2c3Vic3RyLmxlbikKLSAgICAgICAgcnYgPSAhIG1lbWNtcChzdHIrc3RhcnQsIHZzdWJzdHIuYnVmLCB2c3Vic3RyLmxlbik7Ci0KLWRvbmU6Ci0gICAgUHlCdWZmZXJfUmVsZWFzZSgmdnN1YnN0cik7Ci0gICAgcmV0dXJuIHJ2OwotfQotCi0KLVB5RG9jX1NUUlZBUihzdGFydHN3aXRoX19kb2NfXywKLSJCLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxuXAotXG5cCi1SZXR1cm4gVHJ1ZSBpZiBCIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCi1XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxuXAotcHJlZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3N0YXJ0c3dpdGgoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwotICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlPYmplY3QgKnN1Ym9iajsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygic3RhcnRzd2l0aCIsIGFyZ3MsICZzdWJvYmosICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKLSAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IF9ieXRlYXJyYXlfdGFpbG1hdGNoKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgLTEpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gX2J5dGVhcnJheV90YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCAtMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0YXJ0c3dpdGggZmlyc3QgYXJnIG11c3QgYmUgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJvciBhIHR1cGxlIG9mIGJ5dGVzLCBub3QgJXMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19zdGFydHN3aXRoKFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi1QeURvY19TVFJWQVIoZW5kc3dpdGhfX2RvY19fLAotIkIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxuXAotXG5cCi1SZXR1cm4gVHJ1ZSBpZiBCIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAotV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAotV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cblwKLXN1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9lbmRzd2l0aChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0gICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKLSAgICBQeU9iamVjdCAqc3Vib2JqOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCJlbmRzd2l0aCIsIGFyZ3MsICZzdWJvYmosICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKLSAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IF9ieXRlYXJyYXlfdGFpbG1hdGNoKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgKzEpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gX2J5dGVhcnJheV90YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCArMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImVuZHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIGJ5dGVzIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYSB0dXBsZSBvZiBieXRlcywgbm90ICVzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfZW5kc3dpdGgoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LnRyYW5zbGF0ZQogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICB0YWJsZTogb2JqZWN0CiAgICAgICAgIFRyYW5zbGF0aW9uIHRhYmxlLCB3aGljaCBtdXN0IGJlIGEgYnl0ZXMgb2JqZWN0IG9mIGxlbmd0aCAyNTYuCi0gICAgWwotICAgIGRlbGV0ZWNoYXJzOiBvYmplY3QKLSAgICBdCiAgICAgLworICAgIGRlbGV0ZSBhcyBkZWxldGVjaGFyczogb2JqZWN0KGNfZGVmYXVsdD0iTlVMTCIpID0gYicnCiAKIFJldHVybiBhIGNvcHkgd2l0aCBlYWNoIGNoYXJhY3RlciBtYXBwZWQgYnkgdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLgogCi1BbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcgaW4gdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGRlbGV0ZWNoYXJzIGFyZSByZW1vdmVkLgorQWxsIGNoYXJhY3RlcnMgb2NjdXJyaW5nIGluIHRoZSBvcHRpb25hbCBhcmd1bWVudCBkZWxldGUgYXJlIHJlbW92ZWQuCiBUaGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV90cmFuc2xhdGVfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncm91cF9yaWdodF8xLCBQeU9iamVjdCAqZGVsZXRlY2hhcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmJlYmM4NmE5YTFmZjA4MyBpbnB1dD1iNzQ5YWQ4NWY0ODYwODI0XSovCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmRlbGV0ZWNoYXJzKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWI2YThmMDFjMmE3NGU0NDYgaW5wdXQ9Y2ZmZjk1NmQ0ZDEyN2E5Yl0qLwogewogICAgIGNoYXIgKmlucHV0LCAqb3V0cHV0OwogICAgIGNvbnN0IGNoYXIgKnRhYmxlX2NoYXJzOwpAQCAtMTU3Miw3ICsxMjMwLDcgQEAKICAgICByZXN1bHQgPSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGlubGVuKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCiAgICAgICAgIGdvdG8gZG9uZTsKLSAgICBvdXRwdXRfc3RhcnQgPSBvdXRwdXQgPSBQeUJ5dGVBcnJheV9Bc1N0cmluZyhyZXN1bHQpOworICAgIG91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwogICAgIGlucHV0ID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKGlucHV0X29iaik7CiAKICAgICBpZiAodmRlbC5sZW4gPT0gMCAmJiB0YWJsZV9jaGFycyAhPSBOVUxMKSB7CkBAIC0xNTk4LDggKzEyNTYsNyBAQAogICAgIGZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7CiAgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqaW5wdXQrKyk7CiAgICAgICAgIGlmICh0cmFuc190YWJsZVtjXSAhPSAtMSkKLSAgICAgICAgICAgIGlmIChQeV9DSEFSTUFTSygqb3V0cHV0KysgPSAoY2hhcil0cmFuc190YWJsZVtjXSkgPT0gYykKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAqb3V0cHV0KysgPSAoY2hhcil0cmFuc190YWJsZVtjXTsKICAgICB9CiAgICAgLyogRml4IHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nICovCiAgICAgaWYgKGlubGVuID4gMCkKQEAgLTE2NDIsNDkzICsxMjk5LDYgQEAKIH0KIAogCi0vKiBmaW5kIGFuZCBjb3VudCBjaGFyYWN0ZXJzIGFuZCBzdWJzdHJpbmdzICovCi0KLSNkZWZpbmUgZmluZGNoYXIodGFyZ2V0LCB0YXJnZXRfbGVuLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoY2hhciAqKW1lbWNocigoY29uc3Qgdm9pZCAqKSh0YXJnZXQpLCBjLCB0YXJnZXRfbGVuKSkKLQotCi0vKiBCeXRlcyBvcHMgbXVzdCByZXR1cm4gYSBzdHJpbmcsIGNyZWF0ZSBhIGNvcHkgKi8KLVB5X0xPQ0FMKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi1yZXR1cm5fc2VsZihQeUJ5dGVBcnJheU9iamVjdCAqc2VsZikKLXsKLSAgICAvKiBhbHdheXMgcmV0dXJuIGEgbmV3IGJ5dGVhcnJheSAqLwotICAgIHJldHVybiAoUHlCeXRlQXJyYXlPYmplY3QgKilQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZSgKLSAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwKLSAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpKTsKLX0KLQotUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCi1jb3VudGNoYXIoY29uc3QgY2hhciAqdGFyZ2V0LCBQeV9zc2l6ZV90IHRhcmdldF9sZW4sIGNoYXIgYywgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBQeV9zc2l6ZV90IGNvdW50PTA7Ci0gICAgY29uc3QgY2hhciAqc3RhcnQ9dGFyZ2V0OwotICAgIGNvbnN0IGNoYXIgKmVuZD10YXJnZXQrdGFyZ2V0X2xlbjsKLQotICAgIHdoaWxlICggKHN0YXJ0PWZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGMpKSAhPSBOVUxMICkgewotICAgICAgICBjb3VudCsrOwotICAgICAgICBpZiAoY291bnQgPj0gbWF4Y291bnQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RhcnQgKz0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi0KLS8qIEFsZ29yaXRobXMgZm9yIGRpZmZlcmVudCBjYXNlcyBvZiBzdHJpbmcgcmVwbGFjZW1lbnQgKi8KLQotLyogbGVuKHNlbGYpPj0xLCBmcm9tPSIiLCBsZW4odG8pPj0xLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJlcGxhY2VfaW50ZXJsZWF2ZShQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudCwgaTsKLSAgICBQeUJ5dGVBcnJheU9iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9sZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLQotICAgIC8qIDEgYXQgdGhlIGVuZCBwbHVzIDEgYWZ0ZXIgZXZlcnkgY2hhcmFjdGVyOwotICAgICAgIGNvdW50ID0gbWluKG1heGNvdW50LCBzZWxmX2xlbiArIDEpICovCi0gICAgaWYgKG1heGNvdW50IDw9IHNlbGZfbGVuKQotICAgICAgICBjb3VudCA9IG1heGNvdW50OwotICAgIGVsc2UKLSAgICAgICAgLyogQ2FuJ3Qgb3ZlcmZsb3c6IHNlbGZfbGVuICsgMSA8PSBtYXhjb3VudCA8PSBQWV9TU0laRV9UX01BWC4gKi8KLSAgICAgICAgY291bnQgPSBzZWxmX2xlbiArIDE7Ci0KLSAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgICAvKiAgIHJlc3VsdF9sZW4gPSBjb3VudCAqIHRvX2xlbiArIHNlbGZfbGVuOyAqLwotICAgIGFzc2VydChjb3VudCA+IDApOwotICAgIGlmICh0b19sZW4gPiAoUFlfU1NJWkVfVF9NQVggLSBzZWxmX2xlbikgLyBjb3VudCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmVzdWx0X2xlbiA9IGNvdW50ICogdG9fbGVuICsgc2VsZl9sZW47Ci0KLSAgICBpZiAoISAocmVzdWx0ID0gKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi0gICAgICAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHNlbGZfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgLyogVE9ETzogc3BlY2lhbCBjYXNlIHNpbmdsZSBjaGFyYWN0ZXIsIHdoaWNoIGRvZXNuJ3QgbmVlZCBtZW1jcHkgKi8KLQotICAgIC8qIExheSB0aGUgZmlyc3Qgb25lIGRvd24gKGd1YXJhbnRlZWQgdGhpcyB3aWxsIG9jY3VyKSAqLwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgY291bnQgLT0gMTsKLQotICAgIGZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKLSAgICAgICAgKnJlc3VsdF9zKysgPSAqc2VsZl9zKys7Ci0gICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgIH0KLQotICAgIC8qIENvcHkgdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbi1pKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFNwZWNpYWwgY2FzZSBmb3IgZGVsZXRpbmcgYSBzaW5nbGUgY2hhcmFjdGVyICovCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09MSwgdG89IiIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcihQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudDsKLSAgICBQeUJ5dGVBcnJheU9iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9sZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLSAgICBzZWxmX3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0KLSAgICBjb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gY291bnQ7ICAvKiBmcm9tX2xlbiA9PSAxICovCi0gICAgYXNzZXJ0KHJlc3VsdF9sZW4+PTApOwotCi0gICAgaWYgKCAocmVzdWx0ID0gKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi0gICAgICAgICAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgIHN0YXJ0ID0gbmV4dCsxOwotICAgIH0KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk+PTIsIHRvPSIiLCBtYXhjb3VudD49MSAqLwotCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKLSAgICBQeUJ5dGVBcnJheU9iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9sZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLSAgICBzZWxmX3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0KLSAgICBjb3VudCA9IHN0cmluZ2xpYl9jb3VudChzZWxmX3MsIHNlbGZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y291bnQpOwotCi0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgLyogbm8gbWF0Y2hlcyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gKGNvdW50ICogZnJvbV9sZW4pOwotICAgIGFzc2VydCAocmVzdWx0X2xlbj49MCk7Ci0KLSAgICBpZiAoIChyZXN1bHQgPSAoUHlCeXRlQXJyYXlPYmplY3QgKikKLSAgICAgICAgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwgKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICByZXN1bHRfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQtc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIG5leHQgPSBzdGFydCArIG9mZnNldDsKLQotICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLQotICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgIHN0YXJ0ID0gbmV4dCtmcm9tX2xlbjsKLSAgICB9Ci0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT09MSwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi1yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIGNoYXIgdG9fYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQsICpuZXh0OwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW47Ci0gICAgUHlCeXRlQXJyYXlPYmplY3QgKnJlc3VsdDsKLQotICAgIC8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLwotICAgIHNlbGZfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpOwotCi0gICAgbmV4dCA9IGZpbmRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYyk7Ci0KLSAgICBpZiAobmV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgYnl0ZXMgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIE5lZWQgdG8gbWFrZSBhIG5ldyBieXRlcyAqLwotICAgIHJlc3VsdCA9IChQeUJ5dGVBcnJheU9iamVjdCAqKSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7Ci0KLSAgICAvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLwotICAgIHN0YXJ0ID0gIHJlc3VsdF9zICsgKG5leHQtc2VsZl9zKTsKLSAgICAqc3RhcnQgPSB0b19jOwotICAgIHN0YXJ0Kys7Ci0gICAgZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKLQotICAgIHdoaWxlICgtLW1heGNvdW50ID4gMCkgewotICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKLSAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAqbmV4dCA9IHRvX2M7Ci0gICAgICAgIHN0YXJ0ID0gbmV4dCsxOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT1sZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQ7Ci0gICAgY2hhciAqc2VsZl9zOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIG9mZnNldDsKLSAgICBQeUJ5dGVBcnJheU9iamVjdCAqcmVzdWx0OwotCi0gICAgLyogVGhlIHJlc3VsdCBieXRlcyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KLQotICAgIHNlbGZfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpOwotCi0gICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc2VsZl9zLCBzZWxmX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKLSAgICAgICAgLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBieXRlcyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogTmVlZCB0byBtYWtlIGEgbmV3IGJ5dGVzICovCi0gICAgcmVzdWx0ID0gKFB5Qnl0ZUFycmF5T2JqZWN0ICopIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKLQotICAgIC8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCi0gICAgc3RhcnQgPSAgcmVzdWx0X3MgKyBvZmZzZXQ7Ci0gICAgUHlfTUVNQ1BZKHN0YXJ0LCB0b19zLCBmcm9tX2xlbik7Ci0gICAgc3RhcnQgKz0gZnJvbV9sZW47Ci0gICAgZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKLQotICAgIHdoaWxlICggLS1tYXhjb3VudCA+IDApIHsKLSAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZC1zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIGlmIChvZmZzZXQ9PS0xKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIFB5X01FTUNQWShzdGFydCtvZmZzZXQsIHRvX3MsIGZyb21fbGVuKTsKLSAgICAgICAgc3RhcnQgKz0gb2Zmc2V0K2Zyb21fbGVuOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT0xLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQ7Ci0gICAgUHlCeXRlQXJyYXlPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpOwotCi0gICAgY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7Ci0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBhbmQgbmV3LCBoZW5jZSB0aGUgIi0xIiAqLwotICAgIC8qICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLTEpICAqLwotICAgIGFzc2VydChjb3VudCA+IDApOwotICAgIGlmICh0b19sZW4gLSAxID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIGJ5dGVzIGlzIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4gLSAxKTsKLQotICAgIGlmICggKHJlc3VsdCA9IChQeUJ5dGVBcnJheU9iamVjdCAqKQotICAgICAgICAgIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIHN0YXJ0ID0gc2VsZl9zOwotICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKLSAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChuZXh0ID09IHN0YXJ0KSB7Ci0gICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICAgICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgPSBuZXh0KzE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk+PTIsIGxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZV9zdWJzdHJpbmcoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OwotICAgIFB5Qnl0ZUFycmF5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0gICAgc2VsZl9sZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLQotICAgIGNvdW50ID0gc3RyaW5nbGliX2NvdW50KHNlbGZfcywgc2VsZl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0KLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgICAvKiAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pICovCi0gICAgYXNzZXJ0KGNvdW50ID4gMCk7Ci0gICAgaWYgKHRvX2xlbiAtIGZyb21fbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIGJ5dGVzIGlzIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4gLSBmcm9tX2xlbik7Ci0KLSAgICBpZiAoIChyZXN1bHQgPSAoUHlCeXRlQXJyYXlPYmplY3QgKikKLSAgICAgICAgICBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIHN0YXJ0ID0gc2VsZl9zOwotICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBuZXh0ID0gc3RhcnQrb2Zmc2V0OwotICAgICAgICBpZiAobmV4dCA9PSBzdGFydCkgewotICAgICAgICAgICAgLyogcmVwbGFjZSB3aXRoIHRoZSAndG8nICovCi0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgICAgICAgICBzdGFydCArPSBmcm9tX2xlbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgICAgICAgICBzdGFydCA9IG5leHQrZnJvbV9sZW47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZShQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBpZiAobWF4Y291bnQgPCAwKSB7Ci0gICAgICAgIG1heGNvdW50ID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgfSBlbHNlIGlmIChtYXhjb3VudCA9PSAwIHx8IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpID09IDApIHsKLSAgICAgICAgLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBieXRlcyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgaWYgKG1heGNvdW50ID09IDAgfHwKLSAgICAgICAgKGZyb21fbGVuID09IDAgJiYgdG9fbGVuID09IDApKSB7Ci0gICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgYnl0ZXMgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIEhhbmRsZSB6ZXJvLWxlbmd0aCBzcGVjaWFsIGNhc2VzICovCi0KLSAgICBpZiAoZnJvbV9sZW4gPT0gMCkgewotICAgICAgICAvKiBpbnNlcnQgdGhlICd0bycgYnl0ZXMgZXZlcnl3aGVyZS4gICAqLwotICAgICAgICAvKiAgICA+Pj4gIlB5dGhvbiIucmVwbGFjZSgiIiwgIi4iKSAgICAgKi8KLSAgICAgICAgLyogICAgJy5QLnkudC5oLm8ubi4nICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHJldHVybiByZXBsYWNlX2ludGVybGVhdmUoc2VsZiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0gICAgfQotCi0gICAgLyogRXhjZXB0IGZvciAiIi5yZXBsYWNlKCIiLCAiQSIpID09ICJBIiB0aGVyZSBpcyBubyB3YXkgYmV5b25kIHRoaXMgKi8KLSAgICAvKiBwb2ludCBmb3IgYW4gZW1wdHkgc2VsZiBieXRlcyB0byBnZW5lcmF0ZSBhIG5vbi1lbXB0eSBieXRlcyAqLwotICAgIC8qIFNwZWNpYWwgY2FzZSBzbyB0aGUgcmVtYWluaW5nIGNvZGUgYWx3YXlzIGdldHMgYSBub24tZW1wdHkgYnl0ZXMgKi8KLSAgICBpZiAoUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZikgPT0gMCkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgaWYgKHRvX2xlbiA9PSAwKSB7Ci0gICAgICAgIC8qIGRlbGV0ZSBhbGwgb2NjdXJyZW5jZXMgb2YgJ2Zyb20nIGJ5dGVzICovCi0gICAgICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcigKLSAgICAgICAgICAgICAgICAgICAgc2VsZiwgZnJvbV9zWzBdLCBtYXhjb3VudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIG1heGNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlcmUgYm90aCBieXRlcyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAqLwotCi0gICAgaWYgKGZyb21fbGVuID09IHRvX2xlbikgewotICAgICAgICBpZiAoZnJvbV9sZW4gPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3Rlcl9pbl9wbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgZnJvbV9zWzBdLAotICAgICAgICAgICAgICAgICAgICB0b19zWzBdLAotICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoCi0gICAgICAgICAgICAgICAgc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBPdGhlcndpc2UgdXNlIHRoZSBtb3JlIGdlbmVyaWMgYWxnb3JpdGhtcyAqLwotICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7Ci0gICAgICAgIHJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoc2VsZiwgZnJvbV9zWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGxlbignZnJvbScpPj0yLCBsZW4oJ3RvJyk+PTEgKi8KLSAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nKHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotICAgIH0KLX0KLQotCiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkucmVwbGFjZQogCkBAIC0yMTUwLDkgKzEzMjAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICBQeV9idWZmZXIgKm5ldywgUHlfc3NpemVfdCBjb3VudCkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kMzk4ODRjNGRjNTk0MTJhIGlucHV0PWFhMzc5ZDk4ODYzN2M3ZmJdKi8KIHsKLSAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVwbGFjZSgoUHlCeXRlQXJyYXlPYmplY3QgKikgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQtPmJ1Ziwgb2xkLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT5idWYsIG5ldy0+bGVuLCBjb3VudCk7CisgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlKChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopb2xkLT5idWYsIG9sZC0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW5ldy0+YnVmLCBuZXctPmxlbiwgY291bnQpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCkBAIC0yMjAwLDcgKzEzNzAsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LnBhcnRpdGlvbgogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICBzZXA6IG9iamVjdAogICAgIC8KIApAQCAtMjIxNiw3ICsxMzg1LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9wYXJ0aXRpb24oUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXApCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDVkMjUyNWRkZDM1Zjk1NyBpbnB1dD03ZDdmZTM3YjE2OTZkNTA2XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDVkMjUyNWRkZDM1Zjk1NyBpbnB1dD04NmY4OTIyMzg5MmI3MGI1XSovCiB7CiAgICAgUHlPYmplY3QgKmJ5dGVzZXAsICpyZXN1bHQ7CiAKQEAgLTIyMzgsNyArMTQwNyw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkucnBhcnRpdGlvbgogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICBzZXA6IG9iamVjdAogICAgIC8KIApAQCAtMjI1NCw3ICsxNDIyLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9ycGFydGl0aW9uKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2VwKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQ0MGRlM2M5NDI2MTE1ZTggaW5wdXQ9OWI4Y2Q1NDBjMWI3NTg1M10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQ0MGRlM2M5NDI2MTE1ZTggaW5wdXQ9NWY0MDk0ZjJkZTg3YzhmM10qLwogewogICAgIFB5T2JqZWN0ICpieXRlc2VwLCAqcmVzdWx0OwogCkBAIC0yMzEyLDE0ICsxNDgwLDEyIEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkucmV2ZXJzZQogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKLQogUmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIHZhbHVlcyBpbiBCIGluIHBsYWNlLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3JldmVyc2VfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05Zjc2MTZmMjlhYjMwOWQzIGlucHV0PTc5MzNhNDk5Yjg1OTdiZDFdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05Zjc2MTZmMjlhYjMwOWQzIGlucHV0PTU0MzM1NjMxOWZjNzg1NTddKi8KIHsKICAgICBjaGFyIHN3YXAsICpoZWFkLCAqdGFpbDsKICAgICBQeV9zc2l6ZV90IGksIGosIG4gPSBQeV9TSVpFKHNlbGYpOwpAQCAtMjM0OCw3ICsxNTE0LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5pbnNlcnQKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgaW5kZXg6IFB5X3NzaXplX3QKICAgICAgICAgVGhlIGluZGV4IHdoZXJlIHRoZSB2YWx1ZSBpcyB0byBiZSBpbnNlcnRlZC4KICAgICBpdGVtOiBieXRlc3ZhbHVlCkBAIC0yMzYwLDcgKzE1MjUsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2luc2VydF9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGluZGV4LCBpbnQgaXRlbSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03NmM3NzVhNzBlN2IwN2I3IGlucHV0PTgzMzc2NjgzNmJhMzBlMWVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03NmM3NzVhNzBlN2IwN2I3IGlucHV0PWIyYjVkMDdlOWRlNmMwNzBdKi8KIHsKICAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKHNlbGYpOwogICAgIGNoYXIgKmJ1ZjsKQEAgLTIzOTAsNyArMTU1NSw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuYXBwZW5kCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQogICAgIGl0ZW06IGJ5dGVzdmFsdWUKICAgICAgICAgVGhlIGl0ZW0gdG8gYmUgYXBwZW5kZWQuCiAgICAgLwpAQCAtMjQwMCw3ICsxNTY0LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9hcHBlbmRfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgaW50IGl0ZW0pCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTE1NGUxOWVkMTg4NmNiNiBpbnB1dD1hZTU2ZWE4NzM4MDQwN2NjXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTE1NGUxOWVkMTg4NmNiNiBpbnB1dD0yMGQ2YmVjM2QxMzQwNTkzXSovCiB7CiAgICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShzZWxmKTsKIApAQCAtMjQyMCw3ICsxNTg0LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5leHRlbmQKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgaXRlcmFibGVfb2ZfaW50czogb2JqZWN0CiAgICAgICAgIFRoZSBpdGVyYWJsZSBvZiBpdGVtcyB0byBhcHBlbmQuCiAgICAgLwpAQCAtMjQzMCw3ICsxNTkzLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9leHRlbmQoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppdGVyYWJsZV9vZl9pbnRzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk4MTU1ZGJlMjQ5MTcwYjEgaW5wdXQ9Y2U4M2E1ZDc1YjcwZDg1MF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk4MTU1ZGJlMjQ5MTcwYjEgaW5wdXQ9YzYxN2IzYTkzMjQ5YmEyOF0qLwogewogICAgIFB5T2JqZWN0ICppdCwgKml0ZW0sICpieXRlYXJyYXlfb2JqOwogICAgIFB5X3NzaXplX3QgYnVmX3NpemUgPSAwLCBsZW4gPSAwOwpAQCAtMjUxNSw3ICsxNjc4LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5wb3AKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgaW5kZXg6IFB5X3NzaXplX3QgPSAtMQogICAgICAgICBUaGUgaW5kZXggZnJvbSB3aGVyZSB0byByZW1vdmUgdGhlIGl0ZW0uCiAgICAgICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVtb3ZlIHRoZSBsYXN0IGl0ZW0uCkBAIC0yNTI4LDcgKzE2OTAsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3BvcF9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGluZGV4KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWUwY2NkNDAxZjgwMjFkYTggaW5wdXQ9MDc5N2U2YzBjYTlkNWE4NV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWUwY2NkNDAxZjgwMjFkYTggaW5wdXQ9MzU5MWRmMmQwNmMwZDIzN10qLwogewogICAgIGludCB2YWx1ZTsKICAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKHNlbGYpOwpAQCAtMjU2MCw3ICsxNzIyLDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5yZW1vdmUKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgdmFsdWU6IGJ5dGVzdmFsdWUKICAgICAgICAgVGhlIHZhbHVlIHRvIHJlbW92ZS4KICAgICAvCkBAIC0yNTcwLDIwICsxNzMxLDIwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfcmVtb3ZlX2ltcGwoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIGludCB2YWx1ZSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kNjU5ZTM3ODY2NzA5YzEzIGlucHV0PTQ3NTYwYjExZmQ4NTZjMjRdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kNjU5ZTM3ODY2NzA5YzEzIGlucHV0PTEyMTgzMTI0MGNkNTFkZGZdKi8KIHsKLSAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKHNlbGYpOworICAgIFB5X3NzaXplX3Qgd2hlcmUsIG4gPSBQeV9TSVpFKHNlbGYpOwogICAgIGNoYXIgKmJ1ZiA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICBjaGFyICp3aGVyZSA9IG1lbWNocihidWYsIHZhbHVlLCBuKTsKIAotICAgIGlmICghd2hlcmUpIHsKKyAgICB3aGVyZSA9IHN0cmluZ2xpYl9maW5kX2NoYXIoYnVmLCBuLCB2YWx1ZSk7CisgICAgaWYgKHdoZXJlIDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInZhbHVlIG5vdCBmb3VuZCBpbiBieXRlYXJyYXkiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmICghX2NhbnJlc2l6ZShzZWxmKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBtZW1tb3ZlKHdoZXJlLCB3aGVyZSArIDEsIGJ1ZiArIG4gLSB3aGVyZSk7CisgICAgbWVtbW92ZShidWYgKyB3aGVyZSwgYnVmICsgd2hlcmUgKyAxLCBuIC0gd2hlcmUpOwogICAgIGlmIChQeUJ5dGVBcnJheV9SZXNpemUoKFB5T2JqZWN0ICopc2VsZiwgbiAtIDEpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTI1OTMsOCArMTc1NCw4IEBACiAvKiBYWFggVGhlc2UgdHdvIGhlbHBlcnMgY291bGQgYmUgb3B0aW1pemVkIGlmIGFyZ3NpemUgPT0gMSAqLwogCiBzdGF0aWMgUHlfc3NpemVfdAotbHN0cmlwX2hlbHBlcihjaGFyICpteXB0ciwgUHlfc3NpemVfdCBteXNpemUsCi0gICAgICAgICAgICAgIHZvaWQgKmFyZ3B0ciwgUHlfc3NpemVfdCBhcmdzaXplKQorbHN0cmlwX2hlbHBlcihjb25zdCBjaGFyICpteXB0ciwgUHlfc3NpemVfdCBteXNpemUsCisgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmFyZ3B0ciwgUHlfc3NpemVfdCBhcmdzaXplKQogewogICAgIFB5X3NzaXplX3QgaSA9IDA7CiAgICAgd2hpbGUgKGkgPCBteXNpemUgJiYgbWVtY2hyKGFyZ3B0ciwgKHVuc2lnbmVkIGNoYXIpIG15cHRyW2ldLCBhcmdzaXplKSkKQEAgLTI2MDMsOCArMTc2NCw4IEBACiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90Ci1yc3RyaXBfaGVscGVyKGNoYXIgKm15cHRyLCBQeV9zc2l6ZV90IG15c2l6ZSwKLSAgICAgICAgICAgICAgdm9pZCAqYXJncHRyLCBQeV9zc2l6ZV90IGFyZ3NpemUpCityc3RyaXBfaGVscGVyKGNvbnN0IGNoYXIgKm15cHRyLCBQeV9zc2l6ZV90IG15c2l6ZSwKKyAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYXJncHRyLCBQeV9zc2l6ZV90IGFyZ3NpemUpCiB7CiAgICAgUHlfc3NpemVfdCBpID0gbXlzaXplIC0gMTsKICAgICB3aGlsZSAoaSA+PSAwICYmIG1lbWNocihhcmdwdHIsICh1bnNpZ25lZCBjaGFyKSBteXB0cltpXSwgYXJnc2l6ZSkpCkBAIC0yODA1LDI3ICsxOTY2LDEwIEBACiAgICAgICAgICk7CiB9CiAKLXN0YXRpYyBpbnQKLWhleF9kaWdpdF90b19pbnQoUHlfVUNTNCBjKQotewotICAgIGlmIChjID49IDEyOCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChQeV9JU0RJR0lUKGMpKQotICAgICAgICByZXR1cm4gYyAtICcwJzsKLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKFB5X0lTVVBQRVIoYykpCi0gICAgICAgICAgICBjID0gUHlfVE9MT1dFUihjKTsKLSAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQotICAgICAgICAgICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCiAvKltjbGluaWMgaW5wdXRdCiBAY2xhc3NtZXRob2QKIGJ5dGVhcnJheS5mcm9taGV4CiAKLSAgICBjbHM6IHNlbGYodHlwZT0iUHlPYmplY3QqIikKICAgICBzdHJpbmc6IHVuaWNvZGUKICAgICAvCiAKQEAgLTI4MzYsNTEgKzE5ODAsMTUgQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVhcnJheV9mcm9taGV4X2ltcGwoUHlPYmplY3QqY2xzLCBQeU9iamVjdCAqc3RyaW5nKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRmM2RhNjAxMjliMzcwMGMgaW5wdXQ9OTA3YmJkMmQzNGQ5MzY3YV0qLworYnl0ZWFycmF5X2Zyb21oZXhfaW1wbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpzdHJpbmcpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGYwZjBiNmQzMGZiM2JhMCBpbnB1dD1mMDMzYTE2ZDFmYjIxZjQ4XSovCiB7Ci0gICAgUHlPYmplY3QgKm5ld2J5dGVzOwotICAgIGNoYXIgKmJ1ZjsKLSAgICBQeV9zc2l6ZV90IGhleGxlbiwgYnl0ZXNsZW4sIGksIGo7Ci0gICAgaW50IHRvcCwgYm90OwotICAgIHZvaWQgKmRhdGE7Ci0gICAgdW5zaWduZWQgaW50IGtpbmQ7Ci0KLSAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrKHN0cmluZykpOwotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3RyaW5nKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cmluZyk7Ci0gICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHN0cmluZyk7Ci0gICAgaGV4bGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyaW5nKTsKLQotICAgIGJ5dGVzbGVuID0gaGV4bGVuLzI7IC8qIFRoaXMgb3ZlcmVzdGltYXRlcyBpZiB0aGVyZSBhcmUgc3BhY2VzICovCi0gICAgbmV3Ynl0ZXMgPSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBieXRlc2xlbik7Ci0gICAgaWYgKCFuZXdieXRlcykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYnVmID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKG5ld2J5dGVzKTsKLSAgICBmb3IgKGkgPSBqID0gMDsgaSA8IGhleGxlbjsgaSArPSAyKSB7Ci0gICAgICAgIC8qIHNraXAgb3ZlciBzcGFjZXMgaW4gdGhlIGlucHV0ICovCi0gICAgICAgIHdoaWxlIChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSA9PSAnICcpCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIGlmIChpID49IGhleGxlbikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB0b3AgPSBoZXhfZGlnaXRfdG9faW50KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpKTsKLSAgICAgICAgYm90ID0gaGV4X2RpZ2l0X3RvX2ludChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKzEpKTsKLSAgICAgICAgaWYgKHRvcCA9PSAtMSB8fCBib3QgPT0gLTEpIHsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJub24taGV4YWRlY2ltYWwgbnVtYmVyIGZvdW5kIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbWhleCgpIGFyZyBhdCBwb3NpdGlvbiAlemQiLCBpKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmW2orK10gPSAodG9wIDw8IDQpICsgYm90OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBfUHlCeXRlc19Gcm9tSGV4KHN0cmluZywgdHlwZSA9PSAmUHlCeXRlQXJyYXlfVHlwZSk7CisgICAgaWYgKHR5cGUgIT0gJlB5Qnl0ZUFycmF5X1R5cGUgJiYgcmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfU0VUUkVGKHJlc3VsdCwgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygoUHlPYmplY3QgKil0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgTlVMTCkpOwogICAgIH0KLSAgICBpZiAoUHlCeXRlQXJyYXlfUmVzaXplKG5ld2J5dGVzLCBqKSA8IDApCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgcmV0dXJuIG5ld2J5dGVzOwotCi0gIGVycm9yOgotICAgIFB5X0RFQ1JFRihuZXdieXRlcyk7Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGhleF9fZG9jX18sCkBAIC0yOTM1LDE0ICsyMDQzLDEyIEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuX19yZWR1Y2VfXyBhcyBieXRlYXJyYXlfcmVkdWNlCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQotCiBSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3JlZHVjZV9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTUyYmYzMDQwODY0NjRjYWIgaW5wdXQ9ZmJiMDdkZTRkMTAyYTAzYV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTUyYmYzMDQwODY0NjRjYWIgaW5wdXQ9NDRiNTczN2FkYTYyZGQzZl0qLwogewogICAgIHJldHVybiBfY29tbW9uX3JlZHVjZShzZWxmLCAyKTsKIH0KQEAgLTI5NTAsNyArMjA1Niw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuX19yZWR1Y2VfZXhfXyBhcyBieXRlYXJyYXlfcmVkdWNlX2V4CiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQogICAgIHByb3RvOiBpbnQgPSAwCiAgICAgLwogCkBAIC0yOTU5LDcgKzIwNjQsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3JlZHVjZV9leF9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBpbnQgcHJvdG8pCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTJlYWMzMzM3NzE5NzUyMCBpbnB1dD0wZTA5MWE0MmNhNmRiZDkxXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTJlYWMzMzM3NzE5NzUyMCBpbnB1dD1mMTI5YmMxYTFhYTE1MWVlXSovCiB7CiAgICAgcmV0dXJuIF9jb21tb25fcmVkdWNlKHNlbGYsIHByb3RvKTsKIH0KQEAgLTI5NjcsMTQgKzIwNzIsMTIgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5fX3NpemVvZl9fIGFzIGJ5dGVhcnJheV9zaXplb2YKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCi0KIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJ5dGVhcnJheSBvYmplY3QgaW4gbWVtb3J5LCBpbiBieXRlcy4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9zaXplb2ZfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03MzhhYmRkMTc5NTFjNDI3IGlucHV0PTZiMjNkMzA1MzYyYjQ2MmJdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03MzhhYmRkMTc5NTFjNDI3IGlucHV0PWUyNzMyMGZkOThhNGJjNWFdKi8KIHsKICAgICBQeV9zc2l6ZV90IHJlczsKIApAQCAtMzAxNSwxOSArMjExOCwyMiBAQAogICAgIEJZVEVBUlJBWV9BUFBFTkRfTUVUSE9EREVGCiAgICAgeyJjYXBpdGFsaXplIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9jYXBpdGFsaXplLCBNRVRIX05PQVJHUywKICAgICAgX1B5X2NhcGl0YWxpemVfX2RvY19ffSwKLSAgICB7ImNlbnRlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfY2VudGVyLCBNRVRIX1ZBUkFSR1MsIGNlbnRlcl9fZG9jX199LAorICAgIHsiY2VudGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9jZW50ZXIsIE1FVEhfVkFSQVJHUywgX1B5X2NlbnRlcl9fZG9jX199LAogICAgIEJZVEVBUlJBWV9DTEVBUl9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfQ09QWV9NRVRIT0RERUYKLSAgICB7ImNvdW50IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9jb3VudCwgTUVUSF9WQVJBUkdTLCBjb3VudF9fZG9jX199LAorICAgIHsiY291bnQiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2NvdW50LCBNRVRIX1ZBUkFSR1MsCisgICAgIF9QeV9jb3VudF9fZG9jX199LAogICAgIEJZVEVBUlJBWV9ERUNPREVfTUVUSE9EREVGCi0gICAgeyJlbmRzd2l0aCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfZW5kc3dpdGgsIE1FVEhfVkFSQVJHUywgZW5kc3dpdGhfX2RvY19ffSwKKyAgICB7ImVuZHN3aXRoIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9lbmRzd2l0aCwgTUVUSF9WQVJBUkdTLAorICAgICBfUHlfZW5kc3dpdGhfX2RvY19ffSwKICAgICB7ImV4cGFuZHRhYnMiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2V4cGFuZHRhYnMsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0gICAgIGV4cGFuZHRhYnNfX2RvY19ffSwKKyAgICAgX1B5X2V4cGFuZHRhYnNfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfRVhURU5EX01FVEhPRERFRgotICAgIHsiZmluZCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfZmluZCwgTUVUSF9WQVJBUkdTLCBmaW5kX19kb2NfX30sCisgICAgeyJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9maW5kLCBNRVRIX1ZBUkFSR1MsCisgICAgIF9QeV9maW5kX19kb2NfX30sCiAgICAgQllURUFSUkFZX0ZST01IRVhfTUVUSE9EREVGCiAgICAgeyJoZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2hleCwgTUVUSF9OT0FSR1MsIGhleF9fZG9jX199LAotICAgIHsiaW5kZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2luZGV4LCBNRVRIX1ZBUkFSR1MsIGluZGV4X19kb2NfX30sCisgICAgeyJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfaW5kZXgsIE1FVEhfVkFSQVJHUywgX1B5X2luZGV4X19kb2NfX30sCiAgICAgQllURUFSUkFZX0lOU0VSVF9NRVRIT0RERUYKICAgICB7ImlzYWxudW0iLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2lzYWxudW0sIE1FVEhfTk9BUkdTLAogICAgICBfUHlfaXNhbG51bV9fZG9jX199LApAQCAtMzA0NCw3ICsyMTUwLDcgQEAKICAgICB7ImlzdXBwZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2lzdXBwZXIsIE1FVEhfTk9BUkdTLAogICAgICBfUHlfaXN1cHBlcl9fZG9jX199LAogICAgIEJZVEVBUlJBWV9KT0lOX01FVEhPRERFRgotICAgIHsibGp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2xqdXN0LCBNRVRIX1ZBUkFSR1MsIGxqdXN0X19kb2NfX30sCisgICAgeyJsanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfbGp1c3QsIE1FVEhfVkFSQVJHUywgX1B5X2xqdXN0X19kb2NfX30sCiAgICAgeyJsb3dlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfbG93ZXIsIE1FVEhfTk9BUkdTLCBfUHlfbG93ZXJfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfTFNUUklQX01FVEhPRERFRgogICAgIEJZVEVBUlJBWV9NQUtFVFJBTlNfTUVUSE9EREVGCkBAIC0zMDUzLDIzICsyMTU5LDIzIEBACiAgICAgQllURUFSUkFZX1JFTU9WRV9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfUkVQTEFDRV9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfUkVWRVJTRV9NRVRIT0RERUYKLSAgICB7InJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9yZmluZCwgTUVUSF9WQVJBUkdTLCByZmluZF9fZG9jX199LAotICAgIHsicmluZGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9yaW5kZXgsIE1FVEhfVkFSQVJHUywgcmluZGV4X19kb2NfX30sCi0gICAgeyJyanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfcmp1c3QsIE1FVEhfVkFSQVJHUywgcmp1c3RfX2RvY19ffSwKKyAgICB7InJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9yZmluZCwgTUVUSF9WQVJBUkdTLCBfUHlfcmZpbmRfX2RvY19ffSwKKyAgICB7InJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfcmluZGV4LCBNRVRIX1ZBUkFSR1MsIF9QeV9yaW5kZXhfX2RvY19ffSwKKyAgICB7InJqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9yanVzdCwgTUVUSF9WQVJBUkdTLCBfUHlfcmp1c3RfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfUlBBUlRJVElPTl9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfUlNQTElUX01FVEhPRERFRgogICAgIEJZVEVBUlJBWV9SU1RSSVBfTUVUSE9EREVGCiAgICAgQllURUFSUkFZX1NQTElUX01FVEhPRERFRgogICAgIEJZVEVBUlJBWV9TUExJVExJTkVTX01FVEhPRERFRgogICAgIHsic3RhcnRzd2l0aCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfc3RhcnRzd2l0aCwgTUVUSF9WQVJBUkdTICwKLSAgICAgc3RhcnRzd2l0aF9fZG9jX199LAorICAgICBfUHlfc3RhcnRzd2l0aF9fZG9jX199LAogICAgIEJZVEVBUlJBWV9TVFJJUF9NRVRIT0RERUYKICAgICB7InN3YXBjYXNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9zd2FwY2FzZSwgTUVUSF9OT0FSR1MsCiAgICAgIF9QeV9zd2FwY2FzZV9fZG9jX199LAogICAgIHsidGl0bGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3RpdGxlLCBNRVRIX05PQVJHUywgX1B5X3RpdGxlX19kb2NfX30sCiAgICAgQllURUFSUkFZX1RSQU5TTEFURV9NRVRIT0RERUYKICAgICB7InVwcGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl91cHBlciwgTUVUSF9OT0FSR1MsIF9QeV91cHBlcl9fZG9jX199LAotICAgIHsiemZpbGwiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3pmaWxsLCBNRVRIX1ZBUkFSR1MsIHpmaWxsX19kb2NfX30sCisgICAgeyJ6ZmlsbCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfemZpbGwsIE1FVEhfVkFSQVJHUywgX1B5X3pmaWxsX19kb2NfX30sCiAgICAge05VTEx9CiB9OwogCkBAIC0zMDc4LDcgKzIxODQsNyBAQAogewogICAgIGlmICghUHlCeXRlQXJyYXlfQ2hlY2sodikpCiAgICAgICAgIFB5X1JFVFVSTl9OT1RJTVBMRU1FTlRFRDsKLSAgICByZXR1cm4gYnl0ZWFycmF5X2Zvcm1hdCgoUHlCeXRlQXJyYXlPYmplY3QgKil2LCB3KTsKKyAgICByZXR1cm4gX1B5Qnl0ZXNfRm9ybWF0RXgoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRSh2KSwgdywgMSk7CiB9CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgYnl0ZWFycmF5X2FzX251bWJlciA9IHsKZGlmZiAtLWdpdCBhL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jIGIvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKaW5kZXggYTI5OTkxNS4uZDdmMDYxYiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKKysrIGIvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKQEAgLTEsMyArMSw0IEBACisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJieXRlc19tZXRob2RzLmgiCiAKQEAgLTI3Nyw3ICsyNzgsNyBAQAogY2hhcmFjdGVycywgYWxsIHJlbWFpbmluZyBjYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXJjYXNlLiIpOwogCiB2b2lkCi1fUHlfYnl0ZXNfdGl0bGUoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKK19QeV9ieXRlc190aXRsZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewogICAgIFB5X3NzaXplX3QgaTsKICAgICBpbnQgcHJldmlvdXNfaXNfY2FzZWQgPSAwOwpAQCAtMzA2LDcgKzMwNyw3IEBACiBhbmQgdGhlIHJlc3QgbG93ZXItY2FzZWQuIik7CiAKIHZvaWQKLV9QeV9ieXRlc19jYXBpdGFsaXplKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCitfUHlfYnl0ZXNfY2FwaXRhbGl6ZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewogICAgIFB5X3NzaXplX3QgaTsKIApAQCAtMzM2LDcgKzMzNyw3IEBACiB0byBsb3dlcmNhc2UgQVNDSUkgYW5kIHZpY2UgdmVyc2EuIik7CiAKIHZvaWQKLV9QeV9ieXRlc19zd2FwY2FzZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQorX1B5X2J5dGVzX3N3YXBjYXNlKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCiB7CiAgICAgUHlfc3NpemVfdCBpOwogCkBAIC0zODcsMyArMzg4LDQyNyBAQAogCiAgICAgcmV0dXJuIHJlczsKIH0KKworI2RlZmluZSBGQVNUU0VBUkNIIGZhc3RzZWFyY2gKKyNkZWZpbmUgU1RSSU5HTElCKEYpIHN0cmluZ2xpYl8jI0YKKyNkZWZpbmUgU1RSSU5HTElCX0NIQVIgY2hhcgorI2RlZmluZSBTVFJJTkdMSUJfU0laRU9GX0NIQVIgMQorCisjaW5jbHVkZSAic3RyaW5nbGliL2Zhc3RzZWFyY2guaCIKKyNpbmNsdWRlICJzdHJpbmdsaWIvY291bnQuaCIKKyNpbmNsdWRlICJzdHJpbmdsaWIvZmluZC5oIgorCisvKgorV3JhcHMgc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoKSBhbmQgYWRkaXRpb25hbGx5IGNoZWNrcyB3aGV0aGVyIHRoZQorZmlyc3QgYXJndW1lbnQgaXMgYW4gaW50ZWdlciBpbiByYW5nZSgwLCAyNTYpLgorCitJZiB0aGlzIGlzIHRoZSBjYXNlLCB3cml0ZXMgdGhlIGludGVnZXIgdmFsdWUgdG8gdGhlIGJ5dGUgcGFyYW1ldGVyCithbmQgc2V0cyBzdWJvYmogdG8gTlVMTC4gT3RoZXJ3aXNlLCBzZXRzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzdWJvYmoKK2FuZCBkb2Vzbid0IHRvdWNoIGJ5dGUuIFRoZSBvdGhlciBwYXJhbWV0ZXJzIGFyZSBzaW1pbGFyIHRvIHRob3NlIG9mCitzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygpLgorKi8KKworUHlfTE9DQUxfSU5MSU5FKGludCkKK3BhcnNlX2FyZ3NfZmluZHNfYnl0ZShjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBQeU9iamVjdCAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKnN1Ym9iaiwgY2hhciAqYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqZW5kKQoreworICAgIFB5T2JqZWN0ICp0bXBfc3Vib2JqOworICAgIFB5X3NzaXplX3QgaXZhbDsKKyAgICBQeU9iamVjdCAqZXJyOworCisgICAgaWYoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKGZ1bmN0aW9uX25hbWUsIGFyZ3MsICZ0bXBfc3Vib2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIVB5TnVtYmVyX0NoZWNrKHRtcF9zdWJvYmopKSB7CisgICAgICAgICpzdWJvYmogPSB0bXBfc3Vib2JqOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpdmFsID0gUHlOdW1iZXJfQXNTc2l6ZV90KHRtcF9zdWJvYmosIFB5RXhjX092ZXJmbG93RXJyb3IpOworICAgIGlmIChpdmFsID09IC0xKSB7CisgICAgICAgIGVyciA9IFB5RXJyX09jY3VycmVkKCk7CisgICAgICAgIGlmIChlcnIgJiYgIVB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhlcnIsIFB5RXhjX092ZXJmbG93RXJyb3IpKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgKnN1Ym9iaiA9IHRtcF9zdWJvYmo7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpdmFsIDwgMCB8fCBpdmFsID4gMjU1KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnl0ZSBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgKnN1Ym9iaiA9IE5VTEw7CisgICAgKmJ5dGUgPSAoY2hhcilpdmFsOworICAgIHJldHVybiAxOworfQorCisvKiBoZWxwZXIgbWFjcm8gdG8gZml4dXAgc3RhcnQvZW5kIHNsaWNlIHZhbHVlcyAqLworI2RlZmluZSBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pICAgICAgICAgXAorICAgIGlmIChlbmQgPiBsZW4pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVuZCA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmIChlbmQgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbmQgKz0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChlbmQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3RhcnQgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGFydCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzdGFydCA8IDApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKK2ZpbmRfaW50ZXJuYWwoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgUHlPYmplY3QgKmFyZ3MsIGludCBkaXIpCit7CisgICAgUHlPYmplY3QgKnN1Ym9iajsKKyAgICBjaGFyIGJ5dGU7CisgICAgUHlfYnVmZmVyIHN1YmJ1ZjsKKyAgICBjb25zdCBjaGFyICpzdWI7CisgICAgUHlfc3NpemVfdCBzdWJfbGVuOworICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwLCBlbmQgPSBQWV9TU0laRV9UX01BWDsKKyAgICBQeV9zc2l6ZV90IHJlczsKKworICAgIGlmICghcGFyc2VfYXJnc19maW5kc19ieXRlKGZ1bmN0aW9uX25hbWUsIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1Ym9iaiwgJmJ5dGUsICZzdGFydCwgJmVuZCkpCisgICAgICAgIHJldHVybiAtMjsKKworICAgIGlmIChzdWJvYmopIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJvYmosICZzdWJidWYsIFB5QlVGX1NJTVBMRSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMjsKKworICAgICAgICBzdWIgPSBzdWJidWYuYnVmOworICAgICAgICBzdWJfbGVuID0gc3ViYnVmLmxlbjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN1YiA9ICZieXRlOworICAgICAgICBzdWJfbGVuID0gMTsKKyAgICB9CisKKyAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOworICAgIGlmIChlbmQgLSBzdGFydCA8IHN1Yl9sZW4pCisgICAgICAgIHJlcyA9IC0xOworICAgIGVsc2UgaWYgKHN1Yl9sZW4gPT0gMSkgeworICAgICAgICBpZiAoZGlyID4gMCkKKyAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9maW5kX2NoYXIoCisgICAgICAgICAgICAgICAgc3RyICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICpzdWIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfcmZpbmRfY2hhcigKKyAgICAgICAgICAgICAgICBzdHIgKyBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgKnN1Yik7CisgICAgICAgIGlmIChyZXMgPj0gMCkKKyAgICAgICAgICAgIHJlcyArPSBzdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChkaXIgPiAwKQorICAgICAgICAgICAgcmVzID0gc3RyaW5nbGliX2ZpbmRfc2xpY2UoCisgICAgICAgICAgICAgICAgc3RyLCBsZW4sCisgICAgICAgICAgICAgICAgc3ViLCBzdWJfbGVuLCBzdGFydCwgZW5kKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzID0gc3RyaW5nbGliX3JmaW5kX3NsaWNlKAorICAgICAgICAgICAgICAgIHN0ciwgbGVuLAorICAgICAgICAgICAgICAgIHN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7CisgICAgfQorCisgICAgaWYgKHN1Ym9iaikKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmc3ViYnVmKTsKKworICAgIHJldHVybiByZXM7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X2ZpbmRfX2RvY19fLAorIkIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKK1xuXAorUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcblwKK3N1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxuXAorYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuXAorXG5cCitSZXR1cm4gLTEgb24gZmFpbHVyZS4iKTsKKworUHlPYmplY3QgKgorX1B5X2J5dGVzX2ZpbmQoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBmaW5kX2ludGVybmFsKHN0ciwgbGVuLCAiZmluZCIsIGFyZ3MsICsxKTsKKyAgICBpZiAocmVzdWx0ID09IC0yKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X2luZGV4X19kb2NfXywKKyJCLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAorXG5cCitMaWtlIEIuZmluZCgpIGJ1dCByYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLiIpOworCitQeU9iamVjdCAqCitfUHlfYnl0ZXNfaW5kZXgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBmaW5kX2ludGVybmFsKHN0ciwgbGVuLCAiaW5kZXgiLCBhcmdzLCArMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzZWN0aW9uIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworfQorCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9yZmluZF9fZG9jX18sCisiQi5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKK1xuXAorUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXG5cCitzdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gQltzdGFydCxlbmRdLiAgT3B0aW9uYWxcblwKK2FyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblwKK1xuXAorUmV0dXJuIC0xIG9uIGZhaWx1cmUuIik7CisKK1B5T2JqZWN0ICoKK19QeV9ieXRlc19yZmluZChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGZpbmRfaW50ZXJuYWwoc3RyLCBsZW4sICJyZmluZCIsIGFyZ3MsIC0xKTsKKyAgICBpZiAocmVzdWx0ID09IC0yKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X3JpbmRleF9fZG9jX18sCisiQi5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCitcblwKK0xpa2UgQi5yZmluZCgpIGJ1dCByYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLiIpOworCitQeU9iamVjdCAqCitfUHlfYnl0ZXNfcmluZGV4KGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gZmluZF9pbnRlcm5hbChzdHIsIGxlbiwgInJpbmRleCIsIGFyZ3MsIC0xKTsKKyAgICBpZiAocmVzdWx0ID09IC0yKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN1YnNlY3Rpb24gbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X2NvdW50X19kb2NfXywKKyJCLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAorXG5cCitSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic2VjdGlvbiBzdWIgaW5cblwKK2J5dGVzIEJbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZFxuXAorYXMgaW4gc2xpY2Ugbm90YXRpb24uIik7CisKK1B5T2JqZWN0ICoKK19QeV9ieXRlc19jb3VudChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeU9iamVjdCAqc3ViX29iajsKKyAgICBjb25zdCBjaGFyICpzdWI7CisgICAgUHlfc3NpemVfdCBzdWJfbGVuOworICAgIGNoYXIgYnl0ZTsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7CisKKyAgICBQeV9idWZmZXIgdnN1YjsKKyAgICBQeU9iamVjdCAqY291bnRfb2JqOworCisgICAgaWYgKCFwYXJzZV9hcmdzX2ZpbmRzX2J5dGUoImNvdW50IiwgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViX29iaiwgJmJ5dGUsICZzdGFydCwgJmVuZCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHN1Yl9vYmopIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJfb2JqLCAmdnN1YiwgUHlCVUZfU0lNUExFKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgc3ViID0gdnN1Yi5idWY7CisgICAgICAgIHN1Yl9sZW4gPSB2c3ViLmxlbjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN1YiA9ICZieXRlOworICAgICAgICBzdWJfbGVuID0gMTsKKyAgICB9CisKKyAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOworCisgICAgY291bnRfb2JqID0gUHlMb25nX0Zyb21Tc2l6ZV90KAorICAgICAgICBzdHJpbmdsaWJfY291bnQoc3RyICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBzdWIsIHN1Yl9sZW4sIFBZX1NTSVpFX1RfTUFYKQorICAgICAgICApOworCisgICAgaWYgKHN1Yl9vYmopCisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZzdWIpOworCisgICAgcmV0dXJuIGNvdW50X29iajsKK30KKworaW50CitfUHlfYnl0ZXNfY29udGFpbnMoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZykKK3sKKyAgICBQeV9zc2l6ZV90IGl2YWwgPSBQeU51bWJlcl9Bc1NzaXplX3QoYXJnLCBOVUxMKTsKKyAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X2J1ZmZlciB2YXJnOworICAgICAgICBQeV9zc2l6ZV90IHBvczsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihhcmcsICZ2YXJnLCBQeUJVRl9TSU1QTEUpICE9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHBvcyA9IHN0cmluZ2xpYl9maW5kKHN0ciwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJnLmJ1ZiwgdmFyZy5sZW4sIDApOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2YXJnKTsKKyAgICAgICAgcmV0dXJuIHBvcyA+PSAwOworICAgIH0KKyAgICBpZiAoaXZhbCA8IDAgfHwgaXZhbCA+PSAyNTYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJieXRlIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIG1lbWNocihzdHIsIChpbnQpIGl2YWwsIGxlbikgIT0gTlVMTDsKK30KKworCisvKiBNYXRjaGVzIHRoZSBlbmQgKGRpcmVjdGlvbiA+PSAwKSBvciBzdGFydCAoZGlyZWN0aW9uIDwgMCkgb2YgdGhlIGJ1ZmZlcgorICogYWdhaW5zdCBzdWJzdHIsIHVzaW5nIHRoZSBzdGFydCBhbmQgZW5kIGFyZ3VtZW50cy4gUmV0dXJucworICogLTEgb24gZXJyb3IsIDAgaWYgbm90IGZvdW5kIGFuZCAxIGlmIGZvdW5kLgorICovCitQeV9MT0NBTChpbnQpCit0YWlsbWF0Y2goY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKnN1YnN0ciwKKyAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCwgaW50IGRpcmVjdGlvbikKK3sKKyAgICBQeV9idWZmZXIgc3ViX3ZpZXcgPSB7TlVMTCwgTlVMTH07CisgICAgY29uc3QgY2hhciAqc3ViOworICAgIFB5X3NzaXplX3Qgc2xlbjsKKworICAgIGlmIChQeUJ5dGVzX0NoZWNrKHN1YnN0cikpIHsKKyAgICAgICAgc3ViID0gUHlCeXRlc19BU19TVFJJTkcoc3Vic3RyKTsKKyAgICAgICAgc2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc3Vic3RyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc3Vic3RyLCAmc3ViX3ZpZXcsIFB5QlVGX1NJTVBMRSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc3ViID0gc3ViX3ZpZXcuYnVmOworICAgICAgICBzbGVuID0gc3ViX3ZpZXcubGVuOworICAgIH0KKworICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7CisKKyAgICBpZiAoZGlyZWN0aW9uIDwgMCkgeworICAgICAgICAvKiBzdGFydHN3aXRoICovCisgICAgICAgIGlmIChzdGFydCArIHNsZW4gPiBsZW4pCisgICAgICAgICAgICBnb3RvIG5vdGZvdW5kOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGVuZHN3aXRoICovCisgICAgICAgIGlmIChlbmQgLSBzdGFydCA8IHNsZW4gfHwgc3RhcnQgPiBsZW4pCisgICAgICAgICAgICBnb3RvIG5vdGZvdW5kOworCisgICAgICAgIGlmIChlbmQgLSBzbGVuID4gc3RhcnQpCisgICAgICAgICAgICBzdGFydCA9IGVuZCAtIHNsZW47CisgICAgfQorICAgIGlmIChlbmQgLSBzdGFydCA8IHNsZW4pCisgICAgICAgIGdvdG8gbm90Zm91bmQ7CisgICAgaWYgKG1lbWNtcChzdHIgKyBzdGFydCwgc3ViLCBzbGVuKSAhPSAwKQorICAgICAgICBnb3RvIG5vdGZvdW5kOworCisgICAgUHlCdWZmZXJfUmVsZWFzZSgmc3ViX3ZpZXcpOworICAgIHJldHVybiAxOworCitub3Rmb3VuZDoKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzdWJfdmlldyk7CisgICAgcmV0dXJuIDA7Cit9CisKK1B5X0xPQ0FMKFB5T2JqZWN0ICopCitfUHlfYnl0ZXNfdGFpbG1hdGNoKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQoreworICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CisgICAgUHlPYmplY3QgKnN1Ym9iajsKKyAgICBpbnQgcmVzdWx0OworCisgICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcyhmdW5jdGlvbl9uYW1lLCBhcmdzLCAmc3Vib2JqLCAmc3RhcnQsICZlbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQgPSB0YWlsbWF0Y2goc3RyLCBsZW4sIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CisgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHN0ciwgbGVuLCBzdWJvYmosIHN0YXJ0LCBlbmQsIGRpcmVjdGlvbik7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgZmlyc3QgYXJnIG11c3QgYmUgYnl0ZXMgb3IgYSB0dXBsZSBvZiBieXRlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKK30KKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfc3RhcnRzd2l0aF9fZG9jX18sCisiQi5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcblwKK1xuXAorUmV0dXJuIFRydWUgaWYgQiBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAorV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAorV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cblwKK3ByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS4iKTsKKworUHlPYmplY3QgKgorX1B5X2J5dGVzX3N0YXJ0c3dpdGgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgcmV0dXJuIF9QeV9ieXRlc190YWlsbWF0Y2goc3RyLCBsZW4sICJzdGFydHN3aXRoIiwgYXJncywgLTEpOworfQorCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9lbmRzd2l0aF9fZG9jX18sCisiQi5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXG5cCitcblwKK1JldHVybiBUcnVlIGlmIEIgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCitXaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCitXaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxuXAorc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LiIpOworCitQeU9iamVjdCAqCitfUHlfYnl0ZXNfZW5kc3dpdGgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgcmV0dXJuIF9QeV9ieXRlc190YWlsbWF0Y2goc3RyLCBsZW4sICJlbmRzd2l0aCIsIGFyZ3MsICsxKTsKK30KKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfZXhwYW5kdGFic19fZG9jX18sCisiQi5leHBhbmR0YWJzKHRhYnNpemU9OCkgLT4gY29weSBvZiBCXG5cCitcblwKK1JldHVybiBhIGNvcHkgb2YgQiB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIGV4cGFuZGVkIHVzaW5nIHNwYWNlcy5cblwKK0lmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLiIpOworCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9sanVzdF9fZG9jX18sCisiQi5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXG4iCisiXG4iCisiUmV0dXJuIEIgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiBQYWRkaW5nIGlzXG4iCisiZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLiIpOworCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9yanVzdF9fZG9jX18sCisiQi5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXG4iCisiXG4iCisiUmV0dXJuIEIgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xuIgorImRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKSIpOworCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9jZW50ZXJfX2RvY19fLAorIkIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcbiIKKyJcbiIKKyJSZXR1cm4gQiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggd2lkdGguICBQYWRkaW5nIGlzXG4iCisiZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLiIpOworCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV96ZmlsbF9fZG9jX18sCisiQi56ZmlsbCh3aWR0aCkgLT4gY29weSBvZiBCXG4iCisiXG4iCisiUGFkIGEgbnVtZXJpYyBzdHJpbmcgQiB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0LCB0byBmaWxsIGEgZmllbGRcbiIKKyJvZiB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgQiBpcyBuZXZlciB0cnVuY2F0ZWQuIik7CisKZGlmZiAtLWdpdCBhL09iamVjdHMvYnl0ZXNvYmplY3QuYyBiL09iamVjdHMvYnl0ZXNvYmplY3QuYwppbmRleCA1OTM0MzM2Li42ZTdjNGZhIDEwMDY0NAotLS0gYS9PYmplY3RzL2J5dGVzb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9ieXRlc29iamVjdC5jCkBAIC05LDkgKzksOSBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogCiAvKltjbGluaWMgaW5wdXRdCi1jbGFzcyBieXRlcyAiUHlCeXRlc09iamVjdCoiICImUHlCeXRlc19UeXBlIgorY2xhc3MgYnl0ZXMgIlB5Qnl0ZXNPYmplY3QgKiIgIiZQeUJ5dGVzX1R5cGUiCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD0xYTFkOTEwMmFmYzFiMDBjXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD03YTIzOGY5NjVkNjQ4OTJiXSovCiAKICNpbmNsdWRlICJjbGluaWMvYnl0ZXNvYmplY3QuYy5oIgogCkBAIC0zMCw2ICszMCwxMCBAQAogKi8KICNkZWZpbmUgUHlCeXRlc09iamVjdF9TSVpFIChvZmZzZXRvZihQeUJ5dGVzT2JqZWN0LCBvYl9zdmFsKSArIDEpCiAKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK1B5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KSBfUHlCeXRlc1dyaXRlcl9HZXRTaXplKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIpOworCiAvKgogICAgRm9yIFB5Qnl0ZXNfRnJvbVN0cmluZygpLCB0aGUgcGFyYW1ldGVyIGBzdHInIHBvaW50cyB0byBhIG51bGwtdGVybWluYXRlZAogICAgc3RyaW5nIGNvbnRhaW5pbmcgZXhhY3RseSBgc2l6ZScgYnl0ZXMuCkBAIC0xNzQsMTkwICsxNzgsMTg0IEBACiBQeU9iamVjdCAqCiBQeUJ5dGVzX0Zyb21Gb3JtYXRWKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YXJncykKIHsKLSAgICB2YV9saXN0IGNvdW50OwotICAgIFB5X3NzaXplX3QgbiA9IDA7Ci0gICAgY29uc3QgY2hhciogZjsKICAgICBjaGFyICpzOwotICAgIFB5T2JqZWN0KiBzdHJpbmc7CisgICAgY29uc3QgY2hhciAqZjsKKyAgICBjb25zdCBjaGFyICpwOworICAgIFB5X3NzaXplX3QgcHJlYzsKKyAgICBpbnQgbG9uZ2ZsYWc7CisgICAgaW50IHNpemVfdGZsYWc7CisgICAgLyogTG9uZ2VzdCA2NC1iaXQgZm9ybWF0dGVkIG51bWJlcnM6CisgICAgICAgLSAiMTg0NDY3NDQwNzM3MDk1NTE2MTVcMCIgKDIxIGJ5dGVzKQorICAgICAgIC0gIi05MjIzMzcyMDM2ODU0Nzc1ODA4XDAiICgyMSBieXRlcykKKyAgICAgICBEZWNpbWFsIHRha2VzIHRoZSBtb3N0IHNwYWNlIChpdCBpc24ndCBlbm91Z2ggZm9yIG9jdGFsLikKIAotICAgIFB5X1ZBX0NPUFkoY291bnQsIHZhcmdzKTsKLSAgICAvKiBzdGVwIDE6IGZpZ3VyZSBvdXQgaG93IGxhcmdlIGEgYnVmZmVyIHdlIG5lZWQgKi8KLSAgICBmb3IgKGYgPSBmb3JtYXQ7ICpmOyBmKyspIHsKLSAgICAgICAgaWYgKCpmID09ICclJykgewotICAgICAgICAgICAgY29uc3QgY2hhciogcCA9IGY7Ci0gICAgICAgICAgICB3aGlsZSAoKisrZiAmJiAqZiAhPSAnJScgJiYgIVB5X0lTQUxQSEEoKmYpKQotICAgICAgICAgICAgICAgIDsKKyAgICAgICBMb25nZXN0IDY0LWJpdCBwb2ludGVyIHJlcHJlc2VudGF0aW9uOgorICAgICAgICIweGZmZmZmZmZmZmZmZmZmZmZcMCIgKDE5IGJ5dGVzKS4gKi8KKyAgICBjaGFyIGJ1ZmZlclsyMV07CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCi0gICAgICAgICAgICAvKiBza2lwIHRoZSAnbCcgb3IgJ3onIGluIHslbGQsICV6ZCwgJWx1LCAlenV9IHNpbmNlCi0gICAgICAgICAgICAgKiB0aGV5IGRvbid0IGFmZmVjdCB0aGUgYW1vdW50IG9mIHNwYWNlIHdlIHJlc2VydmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgoKmYgPT0gJ2wnIHx8ICpmID09ICd6JykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKQotICAgICAgICAgICAgICAgICsrZjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCi0gICAgICAgICAgICBzd2l0Y2ggKCpmKSB7Ci0gICAgICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgYyA9IHZhX2FyZyhjb3VudCwgaW50KTsKLSAgICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgYyA+IDI1NSkgewotICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeUJ5dGVzX0Zyb21Gb3JtYXRWKCk6ICVjIGZvcm1hdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0cyBhbiBpbnRlZ2VyIGluIHJhbmdlIFswOyAyNTVdIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICBuKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdkJzogY2FzZSAndSc6IGNhc2UgJ2knOiBjYXNlICd4JzoKLSAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKGNvdW50LCBpbnQpOwotICAgICAgICAgICAgICAgIC8qIDIwIGJ5dGVzIGlzIGVub3VnaCB0byBob2xkIGEgNjQtYml0Ci0gICAgICAgICAgICAgICAgICAgaW50ZWdlci4gIERlY2ltYWwgdGFrZXMgdGhlIG1vc3Qgc3BhY2UuCi0gICAgICAgICAgICAgICAgICAgVGhpcyBpc24ndCBlbm91Z2ggZm9yIG9jdGFsLiAqLwotICAgICAgICAgICAgICAgIG4gKz0gMjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgICBzID0gdmFfYXJnKGNvdW50LCBjaGFyKik7Ci0gICAgICAgICAgICAgICAgbiArPSBzdHJsZW4ocyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKGNvdW50LCBpbnQpOwotICAgICAgICAgICAgICAgIC8qIG1heGltdW0gNjQtYml0IHBvaW50ZXIgcmVwcmVzZW50YXRpb246Ci0gICAgICAgICAgICAgICAgICogMHhmZmZmZmZmZmZmZmZmZmZmCi0gICAgICAgICAgICAgICAgICogc28gMTkgY2hhcmFjdGVycyBpcyBlbm91Z2guCi0gICAgICAgICAgICAgICAgICogWFhYIEkgY291bnQgMTggLS0gd2hhdCdzIHRoZSBleHRyYSBmb3I/Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbiArPSAxOTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogaWYgd2Ugc3R1bWJsZSB1cG9uIGFuIHVua25vd24KLSAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nIGNvZGUsIGNvcHkgdGhlIHJlc3Qgb2YKLSAgICAgICAgICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyB0byB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgc3RyaW5nLiAod2UgY2Fubm90IGp1c3Qgc2tpcCB0aGUKLSAgICAgICAgICAgICAgICAgICBjb2RlLCBzaW5jZSB0aGVyZSdzIG5vIHdheSB0byBrbm93Ci0gICAgICAgICAgICAgICAgICAgd2hhdCdzIGluIHRoZSBhcmd1bWVudCBsaXN0KSAqLwotICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHApOwotICAgICAgICAgICAgICAgIGdvdG8gZXhwYW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG4rKzsKLSAgICB9Ci0gZXhwYW5kOgotICAgIC8qIHN0ZXAgMjogZmlsbCB0aGUgYnVmZmVyICovCi0gICAgLyogU2luY2Ugd2UndmUgYW5hbHl6ZWQgaG93IG11Y2ggc3BhY2Ugd2UgbmVlZCBmb3IgdGhlIHdvcnN0IGNhc2UsCi0gICAgICAgdXNlIHNwcmludGYgZGlyZWN0bHkgaW5zdGVhZCBvZiB0aGUgc2xvd2VyIFB5T1Nfc25wcmludGYuICovCi0gICAgc3RyaW5nID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLSAgICBpZiAoIXN0cmluZykKKyAgICBzID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgc3RybGVuKGZvcm1hdCkpOworICAgIGlmIChzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOworICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOwogCi0gICAgcyA9IFB5Qnl0ZXNfQXNTdHJpbmcoc3RyaW5nKTsKKyNkZWZpbmUgV1JJVEVfQllURVMoc3RyKSBcCisgICAgZG8geyBcCisgICAgICAgIHMgPSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKCZ3cml0ZXIsIHMsIChzdHIpLCBzdHJsZW4oc3RyKSk7IFwKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkgXAorICAgICAgICAgICAgZ290byBlcnJvcjsgXAorICAgIH0gd2hpbGUgKDApCiAKICAgICBmb3IgKGYgPSBmb3JtYXQ7ICpmOyBmKyspIHsKLSAgICAgICAgaWYgKCpmID09ICclJykgewotICAgICAgICAgICAgY29uc3QgY2hhciogcCA9IGYrKzsKKyAgICAgICAgaWYgKCpmICE9ICclJykgeworICAgICAgICAgICAgKnMrKyA9ICpmOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBwID0gZisrOworCisgICAgICAgIC8qIGlnbm9yZSB0aGUgd2lkdGggKGV4OiAxMCBpbiAiJTEwcyIpICovCisgICAgICAgIHdoaWxlIChQeV9JU0RJR0lUKCpmKSkKKyAgICAgICAgICAgIGYrKzsKKworICAgICAgICAvKiBwYXJzZSB0aGUgcHJlY2lzaW9uIChleDogMTAgaW4gIiUuMTBzIikgKi8KKyAgICAgICAgcHJlYyA9IDA7CisgICAgICAgIGlmICgqZiA9PSAnLicpIHsKKyAgICAgICAgICAgIGYrKzsKKyAgICAgICAgICAgIGZvciAoOyBQeV9JU0RJR0lUKCpmKTsgZisrKSB7CisgICAgICAgICAgICAgICAgcHJlYyA9IChwcmVjICogMTApICsgKCpmIC0gJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgqZiAmJiAqZiAhPSAnJScgJiYgIVB5X0lTQUxQSEEoKmYpKQorICAgICAgICAgICAgZisrOworCisgICAgICAgIC8qIGhhbmRsZSB0aGUgbG9uZyBmbGFnICgnbCcpLCBidXQgb25seSBmb3IgJWxkIGFuZCAlbHUuCisgICAgICAgICAgIG90aGVycyBjYW4gYmUgYWRkZWQgd2hlbiBuZWNlc3NhcnkuICovCisgICAgICAgIGxvbmdmbGFnID0gMDsKKyAgICAgICAgaWYgKCpmID09ICdsJyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7CisgICAgICAgICAgICBsb25nZmxhZyA9IDE7CisgICAgICAgICAgICArK2Y7CisgICAgICAgIH0KKworICAgICAgICAvKiBoYW5kbGUgdGhlIHNpemVfdCBmbGFnICgneicpLiAqLworICAgICAgICBzaXplX3RmbGFnID0gMDsKKyAgICAgICAgaWYgKCpmID09ICd6JyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7CisgICAgICAgICAgICBzaXplX3RmbGFnID0gMTsKKyAgICAgICAgICAgICsrZjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN1YnRyYWN0IGJ5dGVzIHByZWFsbG9jYXRlZCBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAgICAgICAgICAgKGV4OiAyIGZvciAiJXMiKSAqLworICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gKGYgLSBwICsgMSk7CisKKyAgICAgICAgc3dpdGNoICgqZikgeworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGMgPSB2YV9hcmcodmFyZ3MsIGludCk7CisgICAgICAgICAgICBpZiAoYyA8IDAgfHwgYyA+IDI1NSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHlCeXRlc19Gcm9tRm9ybWF0VigpOiAlYyBmb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0cyBhbiBpbnRlZ2VyIGluIHJhbmdlIFswOyAyNTVdIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSsrOworICAgICAgICAgICAgKnMrKyA9ICh1bnNpZ25lZCBjaGFyKWM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWxkIiwgdmFfYXJnKHZhcmdzLCBsb25nKSk7CisgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgUHlfc3NpemVfdCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWQiLCB2YV9hcmcodmFyZ3MsIGludCkpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWx1IiwKKyAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBsb25nKSk7CisgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgc2l6ZV90KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIldSIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgdW5zaWduZWQgaW50KSk7CisgICAgICAgICAgICBhc3NlcnQoc3RybGVuKGJ1ZmZlcikgPCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBXUklURV9CWVRFUyhidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVpIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJsZW4oYnVmZmVyKSA8IHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJXgiLCB2YV9hcmcodmFyZ3MsIGludCkpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICB7CiAgICAgICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgICAgICBpbnQgbG9uZ2ZsYWcgPSAwOwotICAgICAgICAgICAgaW50IHNpemVfdGZsYWcgPSAwOwotICAgICAgICAgICAgLyogcGFyc2UgdGhlIHdpZHRoLnByZWNpc2lvbiBwYXJ0ICh3ZSdyZSBvbmx5Ci0gICAgICAgICAgICAgICBpbnRlcmVzdGVkIGluIHRoZSBwcmVjaXNpb24gdmFsdWUsIGlmIGFueSkgKi8KLSAgICAgICAgICAgIG4gPSAwOwotICAgICAgICAgICAgd2hpbGUgKFB5X0lTRElHSVQoKmYpKQotICAgICAgICAgICAgICAgIG4gPSAobioxMCkgKyAqZisrIC0gJzAnOwotICAgICAgICAgICAgaWYgKCpmID09ICcuJykgewotICAgICAgICAgICAgICAgIGYrKzsKLSAgICAgICAgICAgICAgICBuID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoUHlfSVNESUdJVCgqZikpCi0gICAgICAgICAgICAgICAgICAgIG4gPSAobioxMCkgKyAqZisrIC0gJzAnOworCisgICAgICAgICAgICBwID0gdmFfYXJnKHZhcmdzLCBjb25zdCBjaGFyKik7CisgICAgICAgICAgICBpID0gc3RybGVuKHApOworICAgICAgICAgICAgaWYgKHByZWMgPiAwICYmIGkgPiBwcmVjKQorICAgICAgICAgICAgICAgIGkgPSBwcmVjOworICAgICAgICAgICAgcyA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgcywgcCwgaSk7CisgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlcCIsIHZhX2FyZyh2YXJncywgdm9pZCopKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJsZW4oYnVmZmVyKSA8IHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIC8qICVwIGlzIGlsbC1kZWZpbmVkOiAgZW5zdXJlIGxlYWRpbmcgMHguICovCisgICAgICAgICAgICBpZiAoYnVmZmVyWzFdID09ICdYJykKKyAgICAgICAgICAgICAgICBidWZmZXJbMV0gPSAneCc7CisgICAgICAgICAgICBlbHNlIGlmIChidWZmZXJbMV0gIT0gJ3gnKSB7CisgICAgICAgICAgICAgICAgbWVtbW92ZShidWZmZXIrMiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSsxKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbMF0gPSAnMCc7CisgICAgICAgICAgICAgICAgYnVmZmVyWzFdID0gJ3gnOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCpmICYmICpmICE9ICclJyAmJiAhUHlfSVNBTFBIQSgqZikpCi0gICAgICAgICAgICAgICAgZisrOwotICAgICAgICAgICAgLyogaGFuZGxlIHRoZSBsb25nIGZsYWcsIGJ1dCBvbmx5IGZvciAlbGQgYW5kICVsdS4KLSAgICAgICAgICAgICAgIG90aGVycyBjYW4gYmUgYWRkZWQgd2hlbiBuZWNlc3NhcnkuICovCi0gICAgICAgICAgICBpZiAoKmYgPT0gJ2wnICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKLSAgICAgICAgICAgICAgICBsb25nZmxhZyA9IDE7Ci0gICAgICAgICAgICAgICAgKytmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogaGFuZGxlIHRoZSBzaXplX3QgZmxhZy4gKi8KLSAgICAgICAgICAgIGlmICgqZiA9PSAneicgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgewotICAgICAgICAgICAgICAgIHNpemVfdGZsYWcgPSAxOwotICAgICAgICAgICAgICAgICsrZjsKKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSsrOworICAgICAgICAgICAgKnMrKyA9ICclJzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoKmYgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIGZpeCBtaW5fc2l6ZSBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZvcm1hdCBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUrKzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3dpdGNoICgqZikgewotICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGMgPSB2YV9hcmcodmFyZ3MsIGludCk7Ci0gICAgICAgICAgICAgICAgLyogYyBoYXMgYmVlbiBjaGVja2VkIGZvciBvdmVyZmxvdyBpbiB0aGUgZmlyc3Qgc3RlcCAqLwotICAgICAgICAgICAgICAgICpzKysgPSAodW5zaWduZWQgY2hhciljOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlbGQiLCB2YV9hcmcodmFyZ3MsIGxvbmcpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgUHlfc3NpemVfdCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJWQiLCB2YV9hcmcodmFyZ3MsIGludCkpOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBsb25nKSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZV90ZmxhZykKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHNpemVfdCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVpIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiV4IiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgIHAgPSB2YV9hcmcodmFyZ3MsIGNoYXIqKTsKLSAgICAgICAgICAgICAgICBpID0gc3RybGVuKHApOwotICAgICAgICAgICAgICAgIGlmIChuID4gMCAmJiBpID4gbikKLSAgICAgICAgICAgICAgICAgICAgaSA9IG47Ci0gICAgICAgICAgICAgICAgUHlfTUVNQ1BZKHMsIHAsIGkpOwotICAgICAgICAgICAgICAgIHMgKz0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVwIiwgdmFfYXJnKHZhcmdzLCB2b2lkKikpOwotICAgICAgICAgICAgICAgIC8qICVwIGlzIGlsbC1kZWZpbmVkOiAgZW5zdXJlIGxlYWRpbmcgMHguICovCi0gICAgICAgICAgICAgICAgaWYgKHNbMV0gPT0gJ1gnKQotICAgICAgICAgICAgICAgICAgICBzWzFdID0gJ3gnOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNbMV0gIT0gJ3gnKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUocysyLCBzLCBzdHJsZW4ocykrMSk7Ci0gICAgICAgICAgICAgICAgICAgIHNbMF0gPSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgIHNbMV0gPSAneCc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICAgICAgKnMrKyA9ICclJzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc3RyY3B5KHMsIHApOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICpzKysgPSAqZjsKKyAgICAgICAgICAgIC8qIGludmFsaWQgZm9ybWF0IHN0cmluZzogY29weSB1bmZvcm1hdHRlZCBzdHJpbmcgYW5kIGV4aXQgKi8KKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKHApOworICAgICAgICAgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzKTsKKyAgICAgICAgfQogICAgIH0KIAotIGVuZDoKLSAgICBfUHlCeXRlc19SZXNpemUoJnN0cmluZywgcyAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHN0cmluZykpOwotICAgIHJldHVybiBzdHJpbmc7CisjdW5kZWYgV1JJVEVfQllURVMKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcyk7CisKKyBlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCkBAIC00MDksMTIgKzQwNywxNCBAQAogCiAvKiBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSB0byBhIFB5Qnl0ZXMgb2JqZWN0LCBvciBOVUxMIG9uIGZhaWx1cmUuICovCiAKLXN0YXRpYyBQeU9iamVjdCAqCi1mb3JtYXRmbG9hdChQeU9iamVjdCAqdiwgaW50IGZsYWdzLCBpbnQgcHJlYywgaW50IHR5cGUpCitzdGF0aWMgY2hhcioKK2Zvcm1hdGZsb2F0KFB5T2JqZWN0ICp2LCBpbnQgZmxhZ3MsIGludCBwcmVjLCBpbnQgdHlwZSwKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqcF9yZXN1bHQsIF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0cikKIHsKICAgICBjaGFyICpwOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgZG91YmxlIHg7CisgICAgc2l6ZV90IGxlbjsKIAogICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwogICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewpAQCAtNDMxLDkgKzQzMSwyMiBAQAogCiAgICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShwLCBzdHJsZW4ocCkpOworCisgICAgbGVuID0gc3RybGVuKHApOworICAgIGlmICh3cml0ZXIgIT0gTlVMTCkgeworICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3RyLCBsZW4pOworICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfTUVNQ1BZKHN0ciwgcCwgbGVuKTsKKyAgICAgICAgUHlNZW1fRnJlZShwKTsKKyAgICAgICAgc3RyICs9IGxlbjsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHAsIGxlbik7CiAgICAgUHlNZW1fRnJlZShwKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgICpwX3Jlc3VsdCA9IHJlc3VsdDsKKyAgICByZXR1cm4gc3RyOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDczLDExICs0ODYsMTEgQEAKIHN0YXRpYyBpbnQKIGJ5dGVfY29udmVydGVyKFB5T2JqZWN0ICphcmcsIGNoYXIgKnApCiB7Ci0gICAgaWYgKFB5Qnl0ZXNfQ2hlY2soYXJnKSAmJiBQeUJ5dGVzX1NpemUoYXJnKSA9PSAxKSB7CisgICAgaWYgKFB5Qnl0ZXNfQ2hlY2soYXJnKSAmJiBQeUJ5dGVzX0dFVF9TSVpFKGFyZykgPT0gMSkgewogICAgICAgICAqcCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGFyZylbMF07CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICBlbHNlIGlmIChQeUJ5dGVBcnJheV9DaGVjayhhcmcpICYmIFB5Qnl0ZUFycmF5X1NpemUoYXJnKSA9PSAxKSB7CisgICAgZWxzZSBpZiAoUHlCeXRlQXJyYXlfQ2hlY2soYXJnKSAmJiBQeUJ5dGVBcnJheV9HRVRfU0laRShhcmcpID09IDEpIHsKICAgICAgICAgKnAgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoYXJnKVswXTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQpAQCAtNTU3LDM2ICs1NzAsMzYgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotLyogZm10JSh2MSx2MiwuLi4pIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byBzcHJpbnRmKGZtdCwgdjEsIHYyLCAuLi4pCi0KLSAgIEZPUk1BVEJVRkxFTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaW4gd2hpY2ggdGhlIGludHMgJgotICAgY2hhcnMgYXJlIGZvcm1hdHRlZC4gWFhYIFRoaXMgaXMgYSBtYWdpYyBudW1iZXIuIEVhY2ggZm9ybWF0dGluZwotICAgcm91dGluZSBkb2VzIGJvdW5kcyBjaGVja2luZyB0byBlbnN1cmUgbm8gb3ZlcmZsb3csIGJ1dCBhIGJldHRlcgotICAgc29sdXRpb24gbWF5IGJlIHRvIG1hbGxvYyBhIGJ1ZmZlciBvZiBhcHByb3ByaWF0ZSBzaXplIGZvciBlYWNoCi0gICBmb3JtYXQuIEZvciBub3csIHRoZSBjdXJyZW50IHNvbHV0aW9uIGlzIHN1ZmZpY2llbnQuCi0qLwotI2RlZmluZSBGT1JNQVRCVUZMRU4gKHNpemVfdCkxMjAKKy8qIGZtdCUodjEsdjIsLi4uKSBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gc3ByaW50ZihmbXQsIHYxLCB2MiwgLi4uKSAqLwogCiBQeU9iamVjdCAqCi1fUHlCeXRlc19Gb3JtYXQoUHlPYmplY3QgKmZvcm1hdCwgUHlPYmplY3QgKmFyZ3MpCitfUHlCeXRlc19Gb3JtYXRFeChjb25zdCBjaGFyICpmb3JtYXQsIFB5X3NzaXplX3QgZm9ybWF0X2xlbiwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBpbnQgdXNlX2J5dGVhcnJheSkKIHsKLSAgICBjaGFyICpmbXQsICpyZXM7CisgICAgY29uc3QgY2hhciAqZm10OworICAgIGNoYXIgKnJlczsKICAgICBQeV9zc2l6ZV90IGFyZ2xlbiwgYXJnaWR4OwotICAgIFB5X3NzaXplX3QgcmVzbGVuLCByZXNjbnQsIGZtdGNudDsKKyAgICBQeV9zc2l6ZV90IGZtdGNudDsKICAgICBpbnQgYXJnc19vd25lZCA9IDA7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBQeU9iamVjdCAqZGljdCA9IE5VTEw7Ci0gICAgaWYgKGZvcm1hdCA9PSBOVUxMIHx8ICFQeUJ5dGVzX0NoZWNrKGZvcm1hdCkgfHwgYXJncyA9PSBOVUxMKSB7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOworCisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGZtdCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGZvcm1hdCk7Ci0gICAgZm10Y250ID0gUHlCeXRlc19HRVRfU0laRShmb3JtYXQpOwotICAgIHJlc2xlbiA9IHJlc2NudCA9IGZtdGNudCArIDEwMDsKLSAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgcmVzbGVuKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgZm10ID0gZm9ybWF0OworICAgIGZtdGNudCA9IGZvcm1hdF9sZW47CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHdyaXRlci51c2VfYnl0ZWFycmF5ID0gdXNlX2J5dGVhcnJheTsKKworICAgIHJlcyA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGZtdGNudCk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXMgPSBQeUJ5dGVzX0FzU3RyaW5nKHJlc3VsdCk7CisgICAgaWYgKCF1c2VfYnl0ZWFycmF5KQorICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKKwogICAgIGlmIChQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CiAgICAgICAgIGFyZ2xlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CiAgICAgICAgIGFyZ2lkeCA9IDA7CkBAIC02MDAsMTggKzYxMywyMyBAQAogICAgICAgICAhUHlCeXRlQXJyYXlfQ2hlY2soYXJncykpIHsKICAgICAgICAgICAgIGRpY3QgPSBhcmdzOwogICAgIH0KKwogICAgIHdoaWxlICgtLWZtdGNudCA+PSAwKSB7CiAgICAgICAgIGlmICgqZm10ICE9ICclJykgewotICAgICAgICAgICAgaWYgKC0tcmVzY250IDwgMCkgewotICAgICAgICAgICAgICAgIHJlc2NudCA9IGZtdGNudCArIDEwMDsKLSAgICAgICAgICAgICAgICByZXNsZW4gKz0gcmVzY250OwotICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgcmVzID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICArIHJlc2xlbiAtIHJlc2NudDsKLSAgICAgICAgICAgICAgICAtLXJlc2NudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpyZXMrKyA9ICpmbXQrKzsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuOworICAgICAgICAgICAgY2hhciAqcG9zOworCisgICAgICAgICAgICBwb3MgPSBzdHJjaHIoZm10ICsgMSwgJyUnKTsKKyAgICAgICAgICAgIGlmIChwb3MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBsZW4gPSBwb3MgLSBmbXQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGVuID0gZm9ybWF0X2xlbiAtIChmbXQgLSBmb3JtYXQpOworICAgICAgICAgICAgYXNzZXJ0KGxlbiAhPSAwKTsKKworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlcywgZm10LCBsZW4pOworICAgICAgICAgICAgcmVzICs9IGxlbjsKKyAgICAgICAgICAgIGZtdCArPSBsZW47CisgICAgICAgICAgICBmbXRjbnQgLT0gKGxlbiAtIDEpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgLyogR290IGEgZm9ybWF0IHNwZWNpZmllciAqLwpAQCAtNjI2LDEwICs2NDQsMTQgQEAKICAgICAgICAgICAgIGludCBzaWduOwogICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4gPSAwOwogICAgICAgICAgICAgY2hhciBvbmVjaGFyOyAvKiBGb3IgYnl0ZV9jb252ZXJ0ZXIoKSAqLworICAgICAgICAgICAgUHlfc3NpemVfdCBhbGxvYzsKKyNpZmRlZiBQeV9ERUJVRworICAgICAgICAgICAgY2hhciAqYmVmb3JlOworI2VuZGlmCiAKICAgICAgICAgICAgIGZtdCsrOwogICAgICAgICAgICAgaWYgKCpmbXQgPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqa2V5c3RhcnQ7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5c3RhcnQ7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBrZXlsZW47CiAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmtleTsKICAgICAgICAgICAgICAgICBpbnQgcGNvdW50ID0gMTsKQEAgLTY3Myw2ICs2OTUsOCBAQAogICAgICAgICAgICAgICAgIGFyZ2xlbiA9IC0xOwogICAgICAgICAgICAgICAgIGFyZ2lkeCA9IC0yOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBQYXJzZSBmbGFncy4gRXhhbXBsZTogIiUraSIgPT4gZmxhZ3M9Rl9TSUdOLiAqLwogICAgICAgICAgICAgd2hpbGUgKC0tZm10Y250ID49IDApIHsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMgPSAqZm10KyspIHsKICAgICAgICAgICAgICAgICBjYXNlICctJzogZmxhZ3MgfD0gRl9MSlVTVDsgY29udGludWU7CkBAIC02ODMsNiArNzA3LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBhcnNlIHdpZHRoLiBFeGFtcGxlOiAiJTEwcyIgPT4gd2lkdGg9MTAgKi8KICAgICAgICAgICAgIGlmIChjID09ICcqJykgewogICAgICAgICAgICAgICAgIHYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7CiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKQEAgLTcxNyw2ICs3NDMsOCBAQAogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHdpZHRoKjEwICsgKGMgLSAnMCcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUGFyc2UgcHJlY2lzaW9uLiBFeGFtcGxlOiAiJS4zZiIgPT4gcHJlYz0zICovCiAgICAgICAgICAgICBpZiAoYyA9PSAnLicpIHsKICAgICAgICAgICAgICAgICBwcmVjID0gMDsKICAgICAgICAgICAgICAgICBpZiAoLS1mbXRjbnQgPj0gMCkKQEAgLTc3MSwxMyArNzk5LDE5IEBACiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZtdGNudCA8IDApIHsKKyAgICAgICAgICAgICAgICAvKiBsYXN0IHdyaXRlcjogZGlzYWJsZSB3cml0ZXIgb3ZlcmFsbG9jYXRpb24gKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc2lnbiA9IDA7CiAgICAgICAgICAgICBmaWxsID0gJyAnOwogICAgICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICBwYnVmID0gIiUiOwotICAgICAgICAgICAgICAgIGxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgKnJlcysrID0gJyUnOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgICAgICAvLyAlciBpcyBvbmx5IGZvciAyLzMgY29kZTsgMyBvbmx5IGNvZGUgc2hvdWxkIHVzZSAlYQogICAgICAgICAgICAgY2FzZSAnYSc6CkBAIC03OTAsNiArODI0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAocHJlYyA+PSAwICYmIGxlbiA+IHByZWMpCiAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHByZWM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgIC8vICVzIGlzIG9ubHkgZm9yIDIvMyBjb2RlOyAzIG9ubHkgY29kZSBzaG91bGQgdXNlICViCiAgICAgICAgICAgICBjYXNlICdiJzoKQEAgLTc5OSwxMiArODM0LDQ5IEBACiAgICAgICAgICAgICAgICAgaWYgKHByZWMgPj0gMCAmJiBsZW4gPiBwcmVjKQogICAgICAgICAgICAgICAgICAgICBsZW4gPSBwcmVjOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlICdpJzoKICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICAgICAgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHYpCisgICAgICAgICAgICAgICAgICAgICYmIHdpZHRoID09IC0xICYmIHByZWMgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgJiYgIShmbGFncyAmIChGX1NJR04gfCBGX0JMQU5LKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnWCcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IHBhdGggKi8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdGVybmF0ZSA9IGZsYWdzICYgRl9BTFQ7CisgICAgICAgICAgICAgICAgICAgIGludCBiYXNlOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChjKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCgwICYmICIndHlwZScgbm90IGluIFtkaXVveFhdIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgcGF0aCAqLworICAgICAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gMjsgLyogc2l6ZSBwcmVhbGxvY2F0ZWQgZm9yICIlZCIgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzID0gX1B5TG9uZ19Gb3JtYXRCeXRlc1dyaXRlcigmd3JpdGVyLCByZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgYmFzZSwgYWx0ZXJuYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgdGVtcCA9IGZvcm1hdGxvbmcodiwgZmxhZ3MsIHByZWMsIGMpOwogICAgICAgICAgICAgICAgIGlmICghdGVtcCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTgxNSwxNCArODg3LDI1IEBACiAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRl9aRVJPKQogICAgICAgICAgICAgICAgICAgICBmaWxsID0gJzAnOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgICBjYXNlICdGJzoKICAgICAgICAgICAgIGNhc2UgJ2cnOgogICAgICAgICAgICAgY2FzZSAnRyc6Ci0gICAgICAgICAgICAgICAgdGVtcCA9IGZvcm1hdGZsb2F0KHYsIGZsYWdzLCBwcmVjLCBjKTsKLSAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGlmICh3aWR0aCA9PSAtMSAmJiBwcmVjID09IC0xCisgICAgICAgICAgICAgICAgICAgICYmICEoZmxhZ3MgJiAoRl9TSUdOIHwgRl9CTEFOSykpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoICovCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAyOyAvKiBzaXplIHByZWFsbG9jYXRlZCBmb3IgIiVmIiAqLworICAgICAgICAgICAgICAgICAgICByZXMgPSBmb3JtYXRmbG9hdCh2LCBmbGFncywgcHJlYywgYywgTlVMTCwgJndyaXRlciwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXRmbG9hdCh2LCBmbGFncywgcHJlYywgYywgJnRlbXAsIE5VTEwsIHJlcykpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgcGJ1ZiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHRlbXApOwogICAgICAgICAgICAgICAgIGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUodGVtcCk7CkBAIC04MzAsMjEgKzkxMywyOCBAQAogICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZfWkVSTykKICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICcwJzsKICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICAgICAgICAgcGJ1ZiA9ICZvbmVjaGFyOwogICAgICAgICAgICAgICAgIGxlbiA9IGJ5dGVfY29udmVydGVyKHYsICZvbmVjaGFyKTsKICAgICAgICAgICAgICAgICBpZiAoIWxlbikKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoICovCisgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IG9uZWNoYXI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyICclYycgKDB4JXgpICIKICAgICAgICAgICAgICAgICAgICJhdCBpbmRleCAlemQiLAogICAgICAgICAgICAgICAgICAgYywgYywKLSAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KShmbXQgLSAxIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FzU3RyaW5nKGZvcm1hdCkpKTsKKyAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KShmbXQgLSAxIC0gZm9ybWF0KSk7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHNpZ24pIHsKICAgICAgICAgICAgICAgICBpZiAoKnBidWYgPT0gJy0nIHx8ICpwYnVmID09ICcrJykgewogICAgICAgICAgICAgICAgICAgICBzaWduID0gKnBidWYrKzsKQEAgLTg1OSwyOSArOTQ5LDMxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAod2lkdGggPCBsZW4pCiAgICAgICAgICAgICAgICAgd2lkdGggPSBsZW47Ci0gICAgICAgICAgICBpZiAocmVzY250IC0gKHNpZ24gIT0gMCkgPCB3aWR0aCkgewotICAgICAgICAgICAgICAgIHJlc2xlbiAtPSByZXNjbnQ7Ci0gICAgICAgICAgICAgICAgcmVzY250ID0gd2lkdGggKyBmbXRjbnQgKyAxMDA7Ci0gICAgICAgICAgICAgICAgcmVzbGVuICs9IHJlc2NudDsKLSAgICAgICAgICAgICAgICBpZiAocmVzbGVuIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkgewotICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICArIHJlc2xlbiAtIHJlc2NudDsKKworICAgICAgICAgICAgYWxsb2MgPSB3aWR0aDsKKyAgICAgICAgICAgIGlmIChzaWduICE9IDAgJiYgbGVuID09IHdpZHRoKQorICAgICAgICAgICAgICAgIGFsbG9jKys7CisgICAgICAgICAgICAvKiAyOiBzaXplIHByZWFsbG9jYXRlZCBmb3IgJXMgKi8KKyAgICAgICAgICAgIGlmIChhbGxvYyA+IDIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHJlcywgYWxsb2MgLSAyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CisjaWZkZWYgUHlfREVCVUcKKyAgICAgICAgICAgIGJlZm9yZSA9IHJlczsKKyNlbmRpZgorCisgICAgICAgICAgICAvKiBXcml0ZSB0aGUgc2lnbiBpZiBuZWVkZWQgKi8KICAgICAgICAgICAgIGlmIChzaWduKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZpbGwgIT0gJyAnKQogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSBzaWduOwotICAgICAgICAgICAgICAgIHJlc2NudC0tOwogICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IGxlbikKICAgICAgICAgICAgICAgICAgICAgd2lkdGgtLTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV3JpdGUgdGhlIG51bWVyaWMgcHJlZml4IGZvciAieCIsICJYIiBhbmQgIm8iIGZvcm1hdHMKKyAgICAgICAgICAgICAgIGlmIHRoZSBhbHRlcm5hdGUgZm9ybSBpcyB1c2VkLgorICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHdyaXRlICIweCIgZm9yIHRoZSAiJSN4IiBmb3JtYXQuICovCiAgICAgICAgICAgICBpZiAoKGZsYWdzICYgRl9BTFQpICYmIChjID09ICd4JyB8fCBjID09ICdYJykpIHsKICAgICAgICAgICAgICAgICBhc3NlcnQocGJ1ZlswXSA9PSAnMCcpOwogICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzFdID09IGMpOwpAQCAtODg5LDE4ICs5ODEsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gKnBidWYrKzsKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gKnBidWYrKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzY250IC09IDI7CiAgICAgICAgICAgICAgICAgd2lkdGggLT0gMjsKICAgICAgICAgICAgICAgICBpZiAod2lkdGggPCAwKQogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDA7CiAgICAgICAgICAgICAgICAgbGVuIC09IDI7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBhZCBsZWZ0IHdpdGggdGhlIGZpbGwgY2hhcmFjdGVyIGlmIG5lZWRlZCAqLwogICAgICAgICAgICAgaWYgKHdpZHRoID4gbGVuICYmICEoZmxhZ3MgJiBGX0xKVVNUKSkgewotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgLS1yZXNjbnQ7Ci0gICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IGZpbGw7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS13aWR0aCA+IGxlbik7CisgICAgICAgICAgICAgICAgbWVtc2V0KHJlcywgZmlsbCwgd2lkdGggLSBsZW4pOworICAgICAgICAgICAgICAgIHJlcyArPSAod2lkdGggLSBsZW4pOworICAgICAgICAgICAgICAgIHdpZHRoID0gbGVuOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiBwYWRkaW5nIHdpdGggc3BhY2VzOiB3cml0ZSBzaWduIGlmIG5lZWRlZCBhbmQvb3IgbnVtZXJpYworICAgICAgICAgICAgICAgcHJlZml4IGlmIHRoZSBhbHRlcm5hdGUgZm9ybSBpcyB1c2VkICovCiAgICAgICAgICAgICBpZiAoZmlsbCA9PSAnICcpIHsKICAgICAgICAgICAgICAgICBpZiAoc2lnbikKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gc2lnbjsKQEAgLTkxMiwxMyArMTAwNywxNyBAQAogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29weSBieXRlcyAqLwogICAgICAgICAgICAgUHlfTUVNQ1BZKHJlcywgcGJ1ZiwgbGVuKTsKICAgICAgICAgICAgIHJlcyArPSBsZW47Ci0gICAgICAgICAgICByZXNjbnQgLT0gbGVuOwotICAgICAgICAgICAgd2hpbGUgKC0td2lkdGggPj0gbGVuKSB7Ci0gICAgICAgICAgICAgICAgLS1yZXNjbnQ7Ci0gICAgICAgICAgICAgICAgKnJlcysrID0gJyAnOworCisgICAgICAgICAgICAvKiBQYWQgcmlnaHQgd2l0aCB0aGUgZmlsbCBjaGFyYWN0ZXIgaWYgbmVlZGVkICovCisgICAgICAgICAgICBpZiAod2lkdGggPiBsZW4pIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQocmVzLCAnICcsIHdpZHRoIC0gbGVuKTsKKyAgICAgICAgICAgICAgICByZXMgKz0gKHdpZHRoIC0gbGVuKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGRpY3QgJiYgKGFyZ2lkeCA8IGFyZ2xlbikgJiYgYyAhPSAnJScpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgYnl0ZXMgZm9ybWF0dGluZyIpOwpAQCAtOTI2LDIyICsxMDI1LDMxIEBACiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisKKyNpZmRlZiBQeV9ERUJVRworICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB3ZSBjb21wdXRlZCB0aGUgZXhhY3Qgc2l6ZSBmb3IgdGhpcyB3cml0ZSAqLworICAgICAgICAgICAgYXNzZXJ0KChyZXMgLSBiZWZvcmUpID09IGFsbG9jKTsKKyNlbmRpZgogICAgICAgICB9IC8qICclJyAqLworCisgICAgICAgIC8qIElmIG92ZXJhbGxvY2F0aW9uIHdhcyBkaXNhYmxlZCwgZW5zdXJlIHRoYXQgaXQgd2FzIHRoZSBsYXN0CisgICAgICAgICAgIHdyaXRlLiBPdGhlcndpc2UsIHdlIG1pc3NlZCBhbiBvcHRpbWl6YXRpb24gKi8KKyAgICAgICAgYXNzZXJ0KHdyaXRlci5vdmVyYWxsb2NhdGUgfHwgZm10Y250IDwgMCB8fCB1c2VfYnl0ZWFycmF5KTsKICAgICB9IC8qIHVudGlsIGVuZCAqLworCiAgICAgaWYgKGFyZ2lkeCA8IGFyZ2xlbiAmJiAhZGljdCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgYnl0ZXMgZm9ybWF0dGluZyIpOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KKwogICAgIGlmIChhcmdzX293bmVkKSB7CiAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4gLSByZXNjbnQpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcmVzKTsKIAogIGVycm9yOgotICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgaWYgKGFyZ3Nfb3duZWQpIHsKICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIH0KQEAgLTk2MSw2ICsxMDY5LDQyIEBACiAgICB0aGUgc3RyaW5nIGlzIFVURi04IGVuY29kZWQgYW5kIHNob3VsZCBiZSByZS1lbmNvZGVkIGluIHRoZQogICAgc3BlY2lmaWVkIGVuY29kaW5nLiAgKi8KIAorc3RhdGljIGNoYXIgKgorX1B5Qnl0ZXNfRGVjb2RlRXNjYXBlUmVjb2RlKGNvbnN0IGNoYXIgKipzLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLCBjb25zdCBjaGFyICpyZWNvZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqcCkKK3sKKyAgICBQeU9iamVjdCAqdSwgKnc7CisgICAgY29uc3QgY2hhciogdDsKKworICAgIHQgPSAqczsKKyAgICAvKiBEZWNvZGUgbm9uLUFTQ0lJIGJ5dGVzIGFzIFVURi04LiAqLworICAgIHdoaWxlICh0IDwgZW5kICYmICgqdCAmIDB4ODApKQorICAgICAgICB0Kys7CisgICAgdSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KCpzLCB0IC0gKnMsIGVycm9ycyk7CisgICAgaWYgKHUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBSZWNvZGUgdGhlbSBpbiB0YXJnZXQgZW5jb2RpbmcuICovCisgICAgdyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwgcmVjb2RlX2VuY29kaW5nLCBlcnJvcnMpOworICAgIFB5X0RFQ1JFRih1KTsKKyAgICBpZiAgKHcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sodykpOworCisgICAgLyogQXBwZW5kIGJ5dGVzIHRvIG91dHB1dCBidWZmZXIuICovCisgICAgd3JpdGVyLT5taW5fc2l6ZS0tOyAgIC8qIHN1YnRyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcyh3cml0ZXIsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcodyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRSh3KSk7CisgICAgUHlfREVDUkVGKHcpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgKnMgPSB0OworICAgIHJldHVybiBwOworfQorCiBQeU9iamVjdCAqUHlCeXRlc19EZWNvZGVFc2NhcGUoY29uc3QgY2hhciAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKQEAgLTk2OCw1NCArMTExMiw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWNvZGVfZW5jb2RpbmcpCiB7CiAgICAgaW50IGM7Ci0gICAgY2hhciAqcCwgKmJ1ZjsKKyAgICBjaGFyICpwOwogICAgIGNvbnN0IGNoYXIgKmVuZDsKLSAgICBQeU9iamVjdCAqdjsKLSAgICBQeV9zc2l6ZV90IG5ld2xlbiA9IHJlY29kZV9lbmNvZGluZyA/IDQqbGVuOmxlbjsKLSAgICB2ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG5ld2xlbik7Ci0gICAgaWYgKHYgPT0gTlVMTCkKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworCisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcCA9IGJ1ZiA9IFB5Qnl0ZXNfQXNTdHJpbmcodik7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CisKICAgICBlbmQgPSBzICsgbGVuOwogICAgIHdoaWxlIChzIDwgZW5kKSB7CiAgICAgICAgIGlmICgqcyAhPSAnXFwnKSB7CiAgICAgICAgICAgbm9uX2VzYzoKLSAgICAgICAgICAgIGlmIChyZWNvZGVfZW5jb2RpbmcgJiYgKCpzICYgMHg4MCkpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdSwgKnc7Ci0gICAgICAgICAgICAgICAgY2hhciAqcjsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0OwotICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgcm47Ci0gICAgICAgICAgICAgICAgdCA9IHM7Ci0gICAgICAgICAgICAgICAgLyogRGVjb2RlIG5vbi1BU0NJSSBieXRlcyBhcyBVVEYtOC4gKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAodCA8IGVuZCAmJiAoKnQgJiAweDgwKSkgdCsrOwotICAgICAgICAgICAgICAgIHUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCB0IC0gcywgZXJyb3JzKTsKLSAgICAgICAgICAgICAgICBpZighdSkgZ290byBmYWlsZWQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBSZWNvZGUgdGhlbSBpbiB0YXJnZXQgZW5jb2RpbmcuICovCi0gICAgICAgICAgICAgICAgdyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHUsIHJlY29kZV9lbmNvZGluZywgZXJyb3JzKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF3KSAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBBcHBlbmQgYnl0ZXMgdG8gb3V0cHV0IGJ1ZmZlci4gKi8KLSAgICAgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayh3KSk7Ci0gICAgICAgICAgICAgICAgciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHcpOwotICAgICAgICAgICAgICAgIHJuID0gUHlCeXRlc19HRVRfU0laRSh3KTsKLSAgICAgICAgICAgICAgICBQeV9NRU1DUFkocCwgciwgcm4pOwotICAgICAgICAgICAgICAgIHAgKz0gcm47Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOwotICAgICAgICAgICAgICAgIHMgPSB0OwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKHJlY29kZV9lbmNvZGluZyAmJiAoKnMgJiAweDgwKSkpIHsKICAgICAgICAgICAgICAgICAqcCsrID0gKnMrKzsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG5vbi1BU0NJSSBjaGFyYWN0ZXIgYW5kIG5lZWQgdG8gcmVjb2RlICovCisgICAgICAgICAgICAgICAgcCA9IF9QeUJ5dGVzX0RlY29kZUVzY2FwZVJlY29kZSgmcywgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCByZWNvZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVyLCBwKTsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisKICAgICAgICAgcysrOwotICAgICAgICBpZiAocz09ZW5kKSB7CisgICAgICAgIGlmIChzID09IGVuZCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWlsaW5nIFxcIGluIHN0cmluZyIpOwogICAgICAgICAgICAgZ290byBmYWlsZWQ7CiAgICAgICAgIH0KKwogICAgICAgICBzd2l0Y2ggKCpzKyspIHsKICAgICAgICAgLyogWFhYIFRoaXMgYXNzdW1lcyBBU0NJSSEgKi8KICAgICAgICAgY2FzZSAnXG4nOiBicmVhazsKQEAgLTEwNDAsMjggKzExNzIsMTggQEAKICAgICAgICAgICAgICpwKysgPSBjOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgaWYgKHMrMSA8IGVuZCAmJiBQeV9JU1hESUdJVChzWzBdKSAmJiBQeV9JU1hESUdJVChzWzFdKSkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB4ID0gMDsKLSAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKnMpOwotICAgICAgICAgICAgICAgIHMrKzsKLSAgICAgICAgICAgICAgICBpZiAoUHlfSVNESUdJVChjKSkKLSAgICAgICAgICAgICAgICAgICAgeCA9IGMgLSAnMCc7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUHlfSVNMT1dFUihjKSkKLSAgICAgICAgICAgICAgICAgICAgeCA9IDEwICsgYyAtICdhJzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHggPSAxMCArIGMgLSAnQSc7Ci0gICAgICAgICAgICAgICAgeCA9IHggPDwgNDsKLSAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKnMpOwotICAgICAgICAgICAgICAgIHMrKzsKLSAgICAgICAgICAgICAgICBpZiAoUHlfSVNESUdJVChjKSkKLSAgICAgICAgICAgICAgICAgICAgeCArPSBjIC0gJzAnOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFB5X0lTTE9XRVIoYykpCi0gICAgICAgICAgICAgICAgICAgIHggKz0gMTAgKyBjIC0gJ2EnOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgeCArPSAxMCArIGMgLSAnQSc7Ci0gICAgICAgICAgICAgICAgKnArKyA9IHg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocysxIDwgZW5kKSB7CisgICAgICAgICAgICAgICAgaW50IGRpZ2l0MSwgZGlnaXQyOworICAgICAgICAgICAgICAgIGRpZ2l0MSA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzWzBdKV07CisgICAgICAgICAgICAgICAgZGlnaXQyID0gX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHNbMV0pXTsKKyAgICAgICAgICAgICAgICBpZiAoZGlnaXQxIDwgMTYgJiYgZGlnaXQyIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSgoZGlnaXQxIDw8IDQpICsgZGlnaXQyKTsKKyAgICAgICAgICAgICAgICAgICAgcyArPSAyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0cyAqLworCiAgICAgICAgICAgICBpZiAoIWVycm9ycyB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkgewogICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBcXHggZXNjYXBlIGF0IHBvc2l0aW9uICVkIiwKQEAgLTEwODMsMTggKzEyMDUsMjAgQEAKICAgICAgICAgICAgIGlmIChzIDwgZW5kICYmIFB5X0lTWERJR0lUKHNbMF0pKQogICAgICAgICAgICAgICAgIHMrKzsgLyogYW5kIGEgaGV4ZGlnaXQgKi8KICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIDEsICJpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSAnXFwlYyciLCAqKC0tcykpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKICAgICAgICAgICAgICpwKysgPSAnXFwnOwotICAgICAgICAgICAgcy0tOwogICAgICAgICAgICAgZ290byBub25fZXNjOyAvKiBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHVuZXNjYXBlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEYtOCBieXRlcyBtYXkgZm9sbG93LiAqLwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChwLWJ1ZiA8IG5ld2xlbikKLSAgICAgICAgX1B5Qnl0ZXNfUmVzaXplKCZ2LCBwIC0gYnVmKTsKLSAgICByZXR1cm4gdjsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CisKICAgZmFpbGVkOgotICAgIFB5X0RFQ1JFRih2KTsKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0xMzYzLDI0ICsxNDg3LDcgQEAKIHN0YXRpYyBpbnQKIGJ5dGVzX2NvbnRhaW5zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotICAgIFB5X3NzaXplX3QgaXZhbCA9IFB5TnVtYmVyX0FzU3NpemVfdChhcmcsIFB5RXhjX1ZhbHVlRXJyb3IpOwotICAgIGlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgUHlfYnVmZmVyIHZhcmc7Ci0gICAgICAgIFB5X3NzaXplX3QgcG9zOwotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKGFyZywgJnZhcmcsIFB5QlVGX1NJTVBMRSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcG9zID0gc3RyaW5nbGliX2ZpbmQoUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIFB5X1NJWkUoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmcuYnVmLCB2YXJnLmxlbiwgMCk7Ci0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZhcmcpOwotICAgICAgICByZXR1cm4gcG9zID49IDA7Ci0gICAgfQotICAgIGlmIChpdmFsIDwgMCB8fCBpdmFsID49IDI1NikgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJ5dGUgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWVtY2hyKFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCAoaW50KSBpdmFsLCBQeV9TSVpFKHNlbGYpKSAhPSBOVUxMOworICAgIHJldHVybiBfUHlfYnl0ZXNfY29udGFpbnMoUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZiksIGFyZyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNjI3LDggKzE3MzQsOCBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfc3BsaXRfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGJkZTQ0ZGFjYjM2ZWYyZSBpbnB1dD04YjgwOWIzOTA3NGFiYmZhXSovCitieXRlc19zcGxpdF9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTIxMjZiNTg0NGMxZDhlZiBpbnB1dD04YjgwOWIzOTA3NGFiYmZhXSovCiB7CiAgICAgUHlfc3NpemVfdCBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBuOwogICAgIGNvbnN0IGNoYXIgKnMgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgKnN1YjsKQEAgLTE2NTIsNyArMTc1OSw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlcy5wYXJ0aXRpb24KIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlc09iamVjdCAqIikKICAgICBzZXA6IFB5X2J1ZmZlcgogICAgIC8KIApAQCAtMTY2OCw3ICsxNzc0LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3BhcnRpdGlvbl9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5X2J1ZmZlciAqc2VwKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWY1MzJiMzkyYTE3ZmY2OTUgaW5wdXQ9YmM4NTVkYzYzY2E5NDlkZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWY1MzJiMzkyYTE3ZmY2OTUgaW5wdXQ9NjFjY2E5NTUxOTQwNjA5OV0qLwogewogICAgIHJldHVybiBzdHJpbmdsaWJfcGFydGl0aW9uKAogICAgICAgICAoUHlPYmplY3QqKSBzZWxmLApAQCAtMTY4MCw3ICsxNzg2LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVzLnJwYXJ0aXRpb24KIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlc09iamVjdCAqIikKICAgICBzZXA6IFB5X2J1ZmZlcgogICAgIC8KIApAQCAtMTY5Niw3ICsxODAxLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3JwYXJ0aXRpb25faW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeV9idWZmZXIgKnNlcCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xOTFiMTE0Y2JiMDI4ZTUwIGlucHV0PTY1ODhmZmYyNjJhOTE3MGVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xOTFiMTE0Y2JiMDI4ZTUwIGlucHV0PTY3ZjY4OWU2M2E2MmQ0NzhdKi8KIHsKICAgICByZXR1cm4gc3RyaW5nbGliX3JwYXJ0aXRpb24oCiAgICAgICAgIChQeU9iamVjdCopIHNlbGYsCkBAIC0xNzE0LDggKzE4MTksOCBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfcnNwbGl0X2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTBiNjU3MGI5Nzc5MTFkODggaW5wdXQ9MGY4NmM5ZjI4ZjdkN2I3Yl0qLworYnl0ZXNfcnNwbGl0X2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iYTY5OGQ5ZWEwMWUxYzhmIGlucHV0PTBmODZjOWYyOGY3ZDdiN2JdKi8KIHsKICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZiksIG47CiAgICAgY29uc3QgY2hhciAqcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwpAQCAtMTc1Myw4ICsxODU4LDggQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX2pvaW4oUHlCeXRlc09iamVjdCpzZWxmLCBQeU9iamVjdCAqaXRlcmFibGVfb2ZfYnl0ZXMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NjM0YWZmMTQ3NjRmZjk5NyBpbnB1dD03ZmUzNzdiOTViZDU0OWQyXSovCitieXRlc19qb2luKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppdGVyYWJsZV9vZl9ieXRlcykKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hMDQ2ZjM3OWY2MjZmNmY4IGlucHV0PTdmZTM3N2I5NWJkNTQ5ZDJdKi8KIHsKICAgICByZXR1cm4gc3RyaW5nbGliX2J5dGVzX2pvaW4oKFB5T2JqZWN0KilzZWxmLCBpdGVyYWJsZV9vZl9ieXRlcyk7CiB9CkBAIC0xNzY3LDE1OCArMTg3MiwzMCBAQAogICAgIHJldHVybiBieXRlc19qb2luKChQeUJ5dGVzT2JqZWN0KilzZXAsIHgpOwogfQogCi0vKiBoZWxwZXIgbWFjcm8gdG8gZml4dXAgc3RhcnQvZW5kIHNsaWNlIHZhbHVlcyAqLwotI2RlZmluZSBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pICAgICAgICAgXAotICAgIGlmIChlbmQgPiBsZW4pICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVuZCA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmIChlbmQgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBlbmQgKz0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChlbmQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoc3RhcnQgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGFydCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChzdGFydCA8IDApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1QeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKLWJ5dGVzX2ZpbmRfaW50ZXJuYWwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBkaXIpCi17Ci0gICAgUHlPYmplY3QgKnN1Ym9iajsKLSAgICBjaGFyIGJ5dGU7Ci0gICAgUHlfYnVmZmVyIHN1YmJ1ZjsKLSAgICBjb25zdCBjaGFyICpzdWI7Ci0gICAgUHlfc3NpemVfdCBsZW4sIHN1Yl9sZW47Ci0gICAgUHlfc3NpemVfdCBzdGFydD0wLCBlbmQ9UFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlfc3NpemVfdCByZXM7Ci0KLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzX2J5dGUoImZpbmQvcmZpbmQvaW5kZXgvcmluZGV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywgJnN1Ym9iaiwgJmJ5dGUsICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiAtMjsKLQotICAgIGlmIChzdWJvYmopIHsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJvYmosICZzdWJidWYsIFB5QlVGX1NJTVBMRSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiAtMjsKLQotICAgICAgICBzdWIgPSBzdWJidWYuYnVmOwotICAgICAgICBzdWJfbGVuID0gc3ViYnVmLmxlbjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHN1YiA9ICZieXRlOwotICAgICAgICBzdWJfbGVuID0gMTsKLSAgICB9Ci0gICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKTsKLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7Ci0gICAgaWYgKGVuZCAtIHN0YXJ0IDwgc3ViX2xlbikKLSAgICAgICAgcmVzID0gLTE7Ci0gICAgZWxzZSBpZiAoc3ViX2xlbiA9PSAxCi0jaWZuZGVmIEhBVkVfTUVNUkNIUgotICAgICAgICAgICAgJiYgZGlyID4gMAotI2VuZGlmCi0gICAgKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlID0gKnN1YjsKLSAgICAgICAgaW50IG1vZGUgPSAoZGlyID4gMCkgPyBGQVNUX1NFQVJDSCA6IEZBU1RfUlNFQVJDSDsKLSAgICAgICAgcmVzID0gc3RyaW5nbGliX2Zhc3RzZWFyY2hfbWVtY2hyXzFjaGFyKAotICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc2VsZikgKyBzdGFydCwgZW5kIC0gc3RhcnQsCi0gICAgICAgICAgICBuZWVkbGUsIG5lZWRsZSwgbW9kZSk7Ci0gICAgICAgIGlmIChyZXMgPj0gMCkKLSAgICAgICAgICAgIHJlcyArPSBzdGFydDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChkaXIgPiAwKQotICAgICAgICAgICAgcmVzID0gc3RyaW5nbGliX2ZpbmRfc2xpY2UoCi0gICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIGxlbiwKLSAgICAgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfcmZpbmRfc2xpY2UoCi0gICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIGxlbiwKLSAgICAgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwotICAgIH0KLQotICAgIGlmIChzdWJvYmopCi0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnN1YmJ1Zik7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLVB5RG9jX1NUUlZBUihmaW5kX19kb2NfXywKLSJCLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLVJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCxcblwKLXN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxuXAotYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuXAotXG5cCi1SZXR1cm4gLTEgb24gZmFpbHVyZS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX2ZpbmQoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlc19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsICsxKTsKLSAgICBpZiAocmVzdWx0ID09IC0yKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19maW5kKFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAotCi1QeURvY19TVFJWQVIoaW5kZXhfX2RvY19fLAotIkIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLUxpa2UgQi5maW5kKCkgYnV0IHJhaXNlIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdCBmb3VuZC4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX2luZGV4KFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gYnl0ZXNfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzdHJpbmcgbm90IGZvdW5kIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19pbmRleChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIAotUHlEb2NfU1RSVkFSKHJmaW5kX19kb2NfXywKLSJCLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAotXG5cCi1SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxuXAotc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsXG5cCi1hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cCi1cblwKLVJldHVybiAtMSBvbiBmYWlsdXJlLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfcmZpbmQoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlc19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKLSAgICBpZiAocmVzdWx0ID09IC0yKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19yZmluZChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIAotUHlEb2NfU1RSVkFSKHJpbmRleF9fZG9jX18sCi0iQi5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLUxpa2UgQi5yZmluZCgpIGJ1dCByYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QgZm91bmQuIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19yaW5kZXgoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlc19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKLSAgICBpZiAocmVzdWx0ID09IC0yKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInN1YnN0cmluZyBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX3JpbmRleChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIApAQCAtMjAwNSw3ICsxOTgyLDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVzLnN0cmlwCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZXNPYmplY3QgKiIpCiAgICAgYnl0ZXM6IG9iamVjdCA9IE5vbmUKICAgICAvCiAKQEAgLTIwMTYsNyArMTk5Miw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19zdHJpcF9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpieXRlcykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jN2MyMjhkM2JkMTA0YTFiIGlucHV0PTM3ZGFhNWZhZDEzOTVkOTVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jN2MyMjhkM2JkMTA0YTFiIGlucHV0PThhMzU0NjQwZTRlMGIzZWZdKi8KIHsKICAgICByZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgQk9USFNUUklQLCBieXRlcyk7CiB9CkBAIC0yMDI0LDcgKzIwMDAsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZXMubHN0cmlwCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZXNPYmplY3QgKiIpCiAgICAgYnl0ZXM6IG9iamVjdCA9IE5vbmUKICAgICAvCiAKQEAgLTIwMzUsNyArMjAxMCw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19sc3RyaXBfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYnl0ZXMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Mjg2MDJlNTg2ZjUyNGU4MiBpbnB1dD04ODgxMWIwOWRmYmMyOTg4XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Mjg2MDJlNTg2ZjUyNGU4MiBpbnB1dD05YmFmZjQzOThjM2Y2ODU3XSovCiB7CiAgICAgcmV0dXJuIGRvX2FyZ3N0cmlwKHNlbGYsIExFRlRTVFJJUCwgYnl0ZXMpOwogfQpAQCAtMjA0Myw3ICsyMDE4LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVzLnJzdHJpcAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVzT2JqZWN0ICoiKQogICAgIGJ5dGVzOiBvYmplY3QgPSBOb25lCiAgICAgLwogCkBAIC0yMDU0LDgxICsyMDI4LDM3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19yc3RyaXBfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYnl0ZXMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTQ3ZTM4MTVjOTU0NDdkYSBpbnB1dD04ZjkzYzljZDM2MWYwMTQwXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTQ3ZTM4MTVjOTU0NDdkYSBpbnB1dD1iNzhhZjQ0NWM3MjdlMzJiXSovCiB7CiAgICAgcmV0dXJuIGRvX2FyZ3N0cmlwKHNlbGYsIFJJR0hUU1RSSVAsIGJ5dGVzKTsKIH0KIAogCi1QeURvY19TVFJWQVIoY291bnRfX2RvY19fLAotIkIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLVJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgc3ViIGluXG5cCi1zdHJpbmcgQltzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkXG5cCi1hcyBpbiBzbGljZSBub3RhdGlvbi4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX2NvdW50KFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5T2JqZWN0ICpzdWJfb2JqOwotICAgIGNvbnN0IGNoYXIgKnN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwotICAgIFB5X3NzaXplX3Qgc3ViX2xlbjsKLSAgICBjaGFyIGJ5dGU7Ci0gICAgUHlfc3NpemVfdCBzdGFydCA9IDAsIGVuZCA9IFBZX1NTSVpFX1RfTUFYOwotCi0gICAgUHlfYnVmZmVyIHZzdWI7Ci0gICAgUHlPYmplY3QgKmNvdW50X29iajsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfYnl0ZSgiY291bnQiLCBhcmdzLCAmc3ViX29iaiwgJmJ5dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKHN1Yl9vYmopIHsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJfb2JqLCAmdnN1YiwgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICAgc3ViID0gdnN1Yi5idWY7Ci0gICAgICAgIHN1Yl9sZW4gPSB2c3ViLmxlbjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHN1YiA9ICZieXRlOwotICAgICAgICBzdWJfbGVuID0gMTsKLSAgICB9Ci0KLSAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpKTsKLQotICAgIGNvdW50X29iaiA9IFB5TG9uZ19Gcm9tU3NpemVfdCgKLSAgICAgICAgc3RyaW5nbGliX2NvdW50KHN0ciArIHN0YXJ0LCBlbmQgLSBzdGFydCwgc3ViLCBzdWJfbGVuLCBQWV9TU0laRV9UX01BWCkKLSAgICAgICAgKTsKLQotICAgIGlmIChzdWJfb2JqKQotICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2c3ViKTsKLQotICAgIHJldHVybiBjb3VudF9vYmo7CisgICAgcmV0dXJuIF9QeV9ieXRlc19jb3VudChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIAogLypbY2xpbmljIGlucHV0XQogYnl0ZXMudHJhbnNsYXRlCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZXNPYmplY3QgKiIpCiAgICAgdGFibGU6IG9iamVjdAogICAgICAgICBUcmFuc2xhdGlvbiB0YWJsZSwgd2hpY2ggbXVzdCBiZSBhIGJ5dGVzIG9iamVjdCBvZiBsZW5ndGggMjU2LgotICAgIFsKLSAgICBkZWxldGVjaGFyczogb2JqZWN0Ci0gICAgXQogICAgIC8KKyAgICBkZWxldGUgYXMgZGVsZXRlY2hhcnM6IG9iamVjdChjX2RlZmF1bHQ9Ik5VTEwiKSA9IGInJwogCiBSZXR1cm4gYSBjb3B5IHdpdGggZWFjaCBjaGFyYWN0ZXIgbWFwcGVkIGJ5IHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS4KIAotQWxsIGNoYXJhY3RlcnMgb2NjdXJyaW5nIGluIHRoZSBvcHRpb25hbCBhcmd1bWVudCBkZWxldGVjaGFycyBhcmUgcmVtb3ZlZC4KK0FsbCBjaGFyYWN0ZXJzIG9jY3VycmluZyBpbiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgZGVsZXRlIGFyZSByZW1vdmVkLgogVGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGFyZSBtYXBwZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24gdGFibGUuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc190cmFuc2xhdGVfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdGFibGUsIGludCBncm91cF9yaWdodF8xLAorYnl0ZXNfdHJhbnNsYXRlX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmRlbGV0ZWNoYXJzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTIzM2RmODUwZWI1MGJmOGQgaW5wdXQ9ZDhmYTU1MTlkN2NjNGJlN10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQzYmUzNDM3ZjE5NTYyMTEgaW5wdXQ9MGVjZGYxNTlmNjU0MjMzY10qLwogewogICAgIGNoYXIgKmlucHV0LCAqb3V0cHV0OwogICAgIFB5X2J1ZmZlciB0YWJsZV92aWV3ID0ge05VTEwsIE5VTEx9OwpAQCAtMjE4OSw3ICsyMTE5LDcgQEAKICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdGFibGVfdmlldyk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBvdXRwdXRfc3RhcnQgPSBvdXRwdXQgPSBQeUJ5dGVzX0FzU3RyaW5nKHJlc3VsdCk7CisgICAgb3V0cHV0X3N0YXJ0ID0gb3V0cHV0ID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKICAgICBpbnB1dCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGlucHV0X29iaik7CiAKICAgICBpZiAoZGVsbGVuID09IDAgJiYgdGFibGVfY2hhcnMgIT0gTlVMTCkgewpAQCAtMjI2NSw0OTggKzIxOTUsNiBAQAogICAgIHJldHVybiBfUHlfYnl0ZXNfbWFrZXRyYW5zKGZybSwgdG8pOwogfQogCi0vKiBmaW5kIGFuZCBjb3VudCBjaGFyYWN0ZXJzIGFuZCBzdWJzdHJpbmdzICovCi0KLSNkZWZpbmUgZmluZGNoYXIodGFyZ2V0LCB0YXJnZXRfbGVuLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoY2hhciAqKW1lbWNocigoY29uc3Qgdm9pZCAqKSh0YXJnZXQpLCBjLCB0YXJnZXRfbGVuKSkKLQotLyogU3RyaW5nIG9wcyBtdXN0IHJldHVybiBhIHN0cmluZy4gICovCi0vKiBJZiB0aGUgb2JqZWN0IGlzIHN1YmNsYXNzIG9mIHN0cmluZywgY3JlYXRlIGEgY29weSAqLwotUHlfTE9DQUwoUHlCeXRlc09iamVjdCAqKQotcmV0dXJuX3NlbGYoUHlCeXRlc09iamVjdCAqc2VsZikKLXsKLSAgICBpZiAoUHlCeXRlc19DaGVja0V4YWN0KHNlbGYpKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIHNlbGY7Ci0gICAgfQotICAgIHJldHVybiAoUHlCeXRlc09iamVjdCAqKVB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoCi0gICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLAotICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpKTsKLX0KLQotUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCi1jb3VudGNoYXIoY29uc3QgY2hhciAqdGFyZ2V0LCBQeV9zc2l6ZV90IHRhcmdldF9sZW4sIGNoYXIgYywgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBQeV9zc2l6ZV90IGNvdW50PTA7Ci0gICAgY29uc3QgY2hhciAqc3RhcnQ9dGFyZ2V0OwotICAgIGNvbnN0IGNoYXIgKmVuZD10YXJnZXQrdGFyZ2V0X2xlbjsKLQotICAgIHdoaWxlICggKHN0YXJ0PWZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGMpKSAhPSBOVUxMICkgewotICAgICAgICBjb3VudCsrOwotICAgICAgICBpZiAoY291bnQgPj0gbWF4Y291bnQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RhcnQgKz0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi0KLS8qIEFsZ29yaXRobXMgZm9yIGRpZmZlcmVudCBjYXNlcyBvZiBzdHJpbmcgcmVwbGFjZW1lbnQgKi8KLQotLyogbGVuKHNlbGYpPj0xLCBmcm9tPSIiLCBsZW4odG8pPj0xLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlc09iamVjdCAqKQotcmVwbGFjZV9pbnRlcmxlYXZlKFB5Qnl0ZXNPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQsIGk7Ci0gICAgUHlCeXRlc09iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9sZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotCi0gICAgLyogMSBhdCB0aGUgZW5kIHBsdXMgMSBhZnRlciBldmVyeSBjaGFyYWN0ZXI7Ci0gICAgICAgY291bnQgPSBtaW4obWF4Y291bnQsIHNlbGZfbGVuICsgMSkgKi8KLSAgICBpZiAobWF4Y291bnQgPD0gc2VsZl9sZW4pCi0gICAgICAgIGNvdW50ID0gbWF4Y291bnQ7Ci0gICAgZWxzZQotICAgICAgICAvKiBDYW4ndCBvdmVyZmxvdzogc2VsZl9sZW4gKyAxIDw9IG1heGNvdW50IDw9IFBZX1NTSVpFX1RfTUFYLiAqLwotICAgICAgICBjb3VudCA9IHNlbGZfbGVuICsgMTsKLQotICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICAgIC8qICAgcmVzdWx0X2xlbiA9IGNvdW50ICogdG9fbGVuICsgc2VsZl9sZW47ICovCi0gICAgYXNzZXJ0KGNvdW50ID4gMCk7Ci0gICAgaWYgKHRvX2xlbiA+IChQWV9TU0laRV9UX01BWCAtIHNlbGZfbGVuKSAvIGNvdW50KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2VtZW50IGJ5dGVzIGFyZSB0b28gbG9uZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmVzdWx0X2xlbiA9IGNvdW50ICogdG9fbGVuICsgc2VsZl9sZW47Ci0KLSAgICBpZiAoISAocmVzdWx0ID0gKFB5Qnl0ZXNPYmplY3QgKikKLSAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpICkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBzZWxmX3MgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICAvKiBUT0RPOiBzcGVjaWFsIGNhc2Ugc2luZ2xlIGNoYXJhY3Rlciwgd2hpY2ggZG9lc24ndCBuZWVkIG1lbWNweSAqLwotCi0gICAgLyogTGF5IHRoZSBmaXJzdCBvbmUgZG93biAoZ3VhcmFudGVlZCB0aGlzIHdpbGwgb2NjdXIpICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICBjb3VudCAtPSAxOwotCi0gICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgewotICAgICAgICAqcmVzdWx0X3MrKyA9ICpzZWxmX3MrKzsKLSAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgfQotCi0gICAgLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuLWkpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogU3BlY2lhbCBjYXNlIGZvciBkZWxldGluZyBhIHNpbmdsZSBjaGFyYWN0ZXIgKi8KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT0xLCB0bz0iIiwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJlcGxhY2VfZGVsZXRlX3NpbmdsZV9jaGFyYWN0ZXIoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudDsKLSAgICBQeUJ5dGVzT2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZik7Ci0gICAgc2VsZl9zID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0KLSAgICBjb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gY291bnQ7ICAvKiBmcm9tX2xlbiA9PSAxICovCi0gICAgYXNzZXJ0KHJlc3VsdF9sZW4+PTApOwotCi0gICAgaWYgKCAocmVzdWx0ID0gKFB5Qnl0ZXNPYmplY3QgKikKLSAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgIHN0YXJ0ID0gbmV4dCsxOwotICAgIH0KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk+PTIsIHRvPSIiLCBtYXhjb3VudD49MSAqLwotCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkgewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKLSAgICBQeUJ5dGVzT2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZik7Ci0gICAgc2VsZl9zID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0KLSAgICBjb3VudCA9IHN0cmluZ2xpYl9jb3VudChzZWxmX3MsIHNlbGZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y291bnQpOwotCi0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgLyogbm8gbWF0Y2hlcyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gKGNvdW50ICogZnJvbV9sZW4pOwotICAgIGFzc2VydCAocmVzdWx0X2xlbj49MCk7Ci0KLSAgICBpZiAoIChyZXN1bHQgPSAoUHlCeXRlc09iamVjdCAqKQotICAgICAgICAgIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwgKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJlc3VsdF9zID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIHN0YXJ0ID0gc2VsZl9zOwotICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBuZXh0ID0gc3RhcnQgKyBvZmZzZXQ7Ci0KLSAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0KLSAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotICAgICAgICBzdGFydCA9IG5leHQrZnJvbV9sZW47Ci0gICAgfQotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PWxlbih0byk9PTEsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywgY2hhciB0b19jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3MsICpzdGFydCwgKmVuZCwgKm5leHQ7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbjsKLSAgICBQeUJ5dGVzT2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICAvKiBUaGUgcmVzdWx0IHN0cmluZyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KLSAgICBzZWxmX3MgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICBuZXh0ID0gZmluZGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jKTsKLQotICAgIGlmIChuZXh0ID09IE5VTEwpIHsKLSAgICAgICAgLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIE5lZWQgdG8gbWFrZSBhIG5ldyBzdHJpbmcgKi8KLSAgICByZXN1bHQgPSAoUHlCeXRlc09iamVjdCAqKSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4pOwotCi0gICAgLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KLSAgICBzdGFydCA9ICByZXN1bHRfcyArIChuZXh0LXNlbGZfcyk7Ci0gICAgKnN0YXJ0ID0gdG9fYzsKLSAgICBzdGFydCsrOwotICAgIGVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47Ci0KLSAgICB3aGlsZSAoLS1tYXhjb3VudCA+IDApIHsKLSAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7Ci0gICAgICAgIGlmIChuZXh0ID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgKm5leHQgPSB0b19jOwotICAgICAgICBzdGFydCA9IG5leHQrMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKFB5Qnl0ZXNPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqcmVzdWx0X3MsICpzdGFydCwgKmVuZDsKLSAgICBjaGFyICpzZWxmX3M7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgb2Zmc2V0OwotICAgIFB5Qnl0ZXNPYmplY3QgKnJlc3VsdDsKLQotICAgIC8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLwotCi0gICAgc2VsZl9zID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0gICAgc2VsZl9sZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotCi0gICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc2VsZl9zLCBzZWxmX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKLSAgICAgICAgLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIE5lZWQgdG8gbWFrZSBhIG5ldyBzdHJpbmcgKi8KLSAgICByZXN1bHQgPSAoUHlCeXRlc09iamVjdCAqKSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4pOwotCi0gICAgLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KLSAgICBzdGFydCA9ICByZXN1bHRfcyArIG9mZnNldDsKLSAgICBQeV9NRU1DUFkoc3RhcnQsIHRvX3MsIGZyb21fbGVuKTsKLSAgICBzdGFydCArPSBmcm9tX2xlbjsKLSAgICBlbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOwotCi0gICAgd2hpbGUgKCAtLW1heGNvdW50ID4gMCkgewotICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgaWYgKG9mZnNldD09LTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgUHlfTUVNQ1BZKHN0YXJ0K29mZnNldCwgdG9fcywgZnJvbV9sZW4pOwotICAgICAgICBzdGFydCArPSBvZmZzZXQrZnJvbV9sZW47Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PTEsIGxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQ7Ci0gICAgUHlCeXRlc09iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9zID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0gICAgc2VsZl9sZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotCi0gICAgY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7Ci0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBhbmQgbmV3LCBoZW5jZSB0aGUgIi0xIiAqLwotICAgIC8qICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLTEpICAqLwotICAgIGFzc2VydChjb3VudCA+IDApOwotICAgIGlmICh0b19sZW4gLSAxID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZW1lbnQgYnl0ZXMgYXJlIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4gLSAxKTsKLQotICAgIGlmICggKHJlc3VsdCA9IChQeUJ5dGVzT2JqZWN0ICopCi0gICAgICAgICAgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQpIHsKLSAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgICAgICAgICBzdGFydCA9IG5leHQrMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBzdHJpbmcgKi8KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk+PTIsIGxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlX3N1YnN0cmluZyhQeUJ5dGVzT2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KSB7Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OwotICAgIFB5Qnl0ZXNPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpOwotICAgIHNlbGZfbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKTsKLQotICAgIGNvdW50ID0gc3RyaW5nbGliX2NvdW50KHNlbGZfcywgc2VsZl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0KLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgICAvKiAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pICovCi0gICAgYXNzZXJ0KGNvdW50ID4gMCk7Ci0gICAgaWYgKHRvX2xlbiAtIGZyb21fbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZW1lbnQgYnl0ZXMgYXJlIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pOwotCi0gICAgaWYgKCAocmVzdWx0ID0gKFB5Qnl0ZXNPYmplY3QgKikKLSAgICAgICAgICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICBzdGFydCA9IHNlbGZfczsKLSAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZC1zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbmV4dCA9IHN0YXJ0K29mZnNldDsKLSAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQpIHsKLSAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgKz0gZnJvbV9sZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgPSBuZXh0K2Zyb21fbGVuOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIENvcHkgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVtYWluaW5nIHN0cmluZyAqLwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJlcGxhY2UoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBpZiAobWF4Y291bnQgPCAwKSB7Ci0gICAgICAgIG1heGNvdW50ID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgfSBlbHNlIGlmIChtYXhjb3VudCA9PSAwIHx8IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZikgPT0gMCkgewotICAgICAgICAvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgaWYgKG1heGNvdW50ID09IDAgfHwKLSAgICAgICAgKGZyb21fbGVuID09IDAgJiYgdG9fbGVuID09IDApKSB7Ci0gICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBIYW5kbGUgemVyby1sZW5ndGggc3BlY2lhbCBjYXNlcyAqLwotCi0gICAgaWYgKGZyb21fbGVuID09IDApIHsKLSAgICAgICAgLyogaW5zZXJ0IHRoZSAndG8nIHN0cmluZyBldmVyeXdoZXJlLiAgICovCi0gICAgICAgIC8qICAgID4+PiAiUHl0aG9uIi5yZXBsYWNlKCIiLCAiLiIpICAgICAqLwotICAgICAgICAvKiAgICAnLlAueS50Lmguby5uLicgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIHJlcGxhY2VfaW50ZXJsZWF2ZShzZWxmLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLSAgICB9Ci0KLSAgICAvKiBFeGNlcHQgZm9yICIiLnJlcGxhY2UoIiIsICJBIikgPT0gIkEiIHRoZXJlIGlzIG5vIHdheSBiZXlvbmQgdGhpcyAqLwotICAgIC8qIHBvaW50IGZvciBhbiBlbXB0eSBzZWxmIHN0cmluZyB0byBnZW5lcmF0ZSBhIG5vbi1lbXB0eSBzdHJpbmcgKi8KLSAgICAvKiBTcGVjaWFsIGNhc2Ugc28gdGhlIHJlbWFpbmluZyBjb2RlIGFsd2F5cyBnZXRzIGEgbm9uLWVtcHR5IHN0cmluZyAqLwotICAgIGlmIChQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIGlmICh0b19sZW4gPT0gMCkgewotICAgICAgICAvKiBkZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mICdmcm9tJyBzdHJpbmcgKi8KLSAgICAgICAgaWYgKGZyb21fbGVuID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlX2RlbGV0ZV9zaW5nbGVfY2hhcmFjdGVyKAotICAgICAgICAgICAgICAgIHNlbGYsIGZyb21fc1swXSwgbWF4Y291bnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VfZGVsZXRlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fbGVuLCBtYXhjb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZXJlIGJvdGggc3RyaW5ncyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAqLwotCi0gICAgaWYgKGZyb21fbGVuID09IHRvX2xlbikgewotICAgICAgICBpZiAoZnJvbV9sZW4gPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3Rlcl9pbl9wbGFjZSgKLSAgICAgICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgICAgIGZyb21fc1swXSwKLSAgICAgICAgICAgICAgICB0b19zWzBdLAotICAgICAgICAgICAgICAgIG1heGNvdW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZSgKLSAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sCi0gICAgICAgICAgICAgICAgbWF4Y291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogT3RoZXJ3aXNlIHVzZSB0aGUgbW9yZSBnZW5lcmljIGFsZ29yaXRobXMgKi8KLSAgICBpZiAoZnJvbV9sZW4gPT0gMSkgewotICAgICAgICByZXR1cm4gcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyKHNlbGYsIGZyb21fc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBsZW4oJ2Zyb20nKT49MiwgbGVuKCd0bycpPj0xICovCi0gICAgICAgIHJldHVybiByZXBsYWNlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0gICAgfQotfQotCiAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVzLnJlcGxhY2UKQEAgLTI3NzUsMTU2ICsyMjEzLDI4IEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19yZXBsYWNlX2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBQeV9idWZmZXIgKm9sZCwgUHlfYnVmZmVyICpuZXcsCitieXRlc19yZXBsYWNlX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlfYnVmZmVyICpvbGQsIFB5X2J1ZmZlciAqbmV3LAogICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDAzZGM5ZDdhODNjNWExZCBpbnB1dD1iMmZiYmYwYmYwNGRlOGU1XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTk0ZmE1ODhiNmI5YzEwNCBpbnB1dD1iMmZiYmYwYmYwNGRlOGU1XSovCiB7Ci0gICAgcmV0dXJuIChQeU9iamVjdCAqKXJlcGxhY2UoKFB5Qnl0ZXNPYmplY3QgKikgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW9sZC0+YnVmLCBvbGQtPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW5ldy0+YnVmLCBuZXctPmxlbiwgY291bnQpOworICAgIHJldHVybiBzdHJpbmdsaWJfcmVwbGFjZSgoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW9sZC0+YnVmLCBvbGQtPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiluZXctPmJ1ZiwgbmV3LT5sZW4sIGNvdW50KTsKIH0KIAogLyoqIEVuZCBEQUxLRSAqKi8KIAotLyogTWF0Y2hlcyB0aGUgZW5kIChkaXJlY3Rpb24gPj0gMCkgb3Igc3RhcnQgKGRpcmVjdGlvbiA8IDApIG9mIHNlbGYKLSAqIGFnYWluc3Qgc3Vic3RyLCB1c2luZyB0aGUgc3RhcnQgYW5kIGVuZCBhcmd1bWVudHMuIFJldHVybnMKLSAqIC0xIG9uIGVycm9yLCAwIGlmIG5vdCBmb3VuZCBhbmQgMSBpZiBmb3VuZC4KLSAqLwotUHlfTE9DQUwoaW50KQotX2J5dGVzX3RhaWxtYXRjaChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc3Vic3RyLCBQeV9zc2l6ZV90IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCi17Ci0gICAgUHlfc3NpemVfdCBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotICAgIFB5X3NzaXplX3Qgc2xlbjsKLSAgICBQeV9idWZmZXIgc3ViX3ZpZXcgPSB7TlVMTCwgTlVMTH07Ci0gICAgY29uc3QgY2hhciogc3ViOwotICAgIGNvbnN0IGNoYXIqIHN0cjsKLQotICAgIGlmIChQeUJ5dGVzX0NoZWNrKHN1YnN0cikpIHsKLSAgICAgICAgc3ViID0gUHlCeXRlc19BU19TVFJJTkcoc3Vic3RyKTsKLSAgICAgICAgc2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc3Vic3RyKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc3Vic3RyLCAmc3ViX3ZpZXcsIFB5QlVGX1NJTVBMRSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgc3ViID0gc3ViX3ZpZXcuYnVmOwotICAgICAgICBzbGVuID0gc3ViX3ZpZXcubGVuOwotICAgIH0KLSAgICBzdHIgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7Ci0KLSAgICBpZiAoZGlyZWN0aW9uIDwgMCkgewotICAgICAgICAvKiBzdGFydHN3aXRoICovCi0gICAgICAgIGlmIChzdGFydCtzbGVuID4gbGVuKQotICAgICAgICAgICAgZ290byBub3Rmb3VuZDsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBlbmRzd2l0aCAqLwotICAgICAgICBpZiAoZW5kLXN0YXJ0IDwgc2xlbiB8fCBzdGFydCA+IGxlbikKLSAgICAgICAgICAgIGdvdG8gbm90Zm91bmQ7Ci0KLSAgICAgICAgaWYgKGVuZC1zbGVuID4gc3RhcnQpCi0gICAgICAgICAgICBzdGFydCA9IGVuZCAtIHNsZW47Ci0gICAgfQotICAgIGlmIChlbmQtc3RhcnQgPCBzbGVuKQotICAgICAgICBnb3RvIG5vdGZvdW5kOwotICAgIGlmIChtZW1jbXAoc3RyK3N0YXJ0LCBzdWIsIHNsZW4pICE9IDApCi0gICAgICAgIGdvdG8gbm90Zm91bmQ7Ci0KLSAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzdWJfdmlldyk7Ci0gICAgcmV0dXJuIDE7Ci0KLW5vdGZvdW5kOgotICAgIFB5QnVmZmVyX1JlbGVhc2UoJnN1Yl92aWV3KTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi1QeURvY19TVFJWQVIoc3RhcnRzd2l0aF9fZG9jX18sCi0iQi5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcblwKLVxuXAotUmV0dXJuIFRydWUgaWYgQiBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAotV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAotV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cblwKLXByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3N0YXJ0c3dpdGgoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0gICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKLSAgICBQeU9iamVjdCAqc3Vib2JqOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCJzdGFydHN3aXRoIiwgYXJncywgJnN1Ym9iaiwgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgewotICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0ID0gX2J5dGVzX3RhaWxtYXRjaChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCAtMSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwotICAgIH0KLSAgICByZXN1bHQgPSBfYnl0ZXNfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgLTEpOwotICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJzdGFydHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYSB0dXBsZSBvZiBieXRlcywgbm90ICVzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfc3RhcnRzd2l0aChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKLQotUHlEb2NfU1RSVkFSKGVuZHN3aXRoX19kb2NfXywKLSJCLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcblwKLVxuXAotUmV0dXJuIFRydWUgaWYgQiBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBzdWZmaXgsIEZhbHNlIG90aGVyd2lzZS5cblwKLVdpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cblwKLVdpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBCIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1zdWZmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBieXRlcyB0byB0cnkuIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19lbmRzd2l0aChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLSAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwotICAgIFB5T2JqZWN0ICpzdWJvYmo7Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoImVuZHN3aXRoIiwgYXJncywgJnN1Ym9iaiwgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgewotICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0ID0gX2J5dGVzX3RhaWxtYXRjaChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCArMSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwotICAgIH0KLSAgICByZXN1bHQgPSBfYnl0ZXNfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgKzEpOwotICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJlbmRzd2l0aCBmaXJzdCBhcmcgbXVzdCBiZSBieXRlcyBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImEgdHVwbGUgb2YgYnl0ZXMsIG5vdCAlcyIsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2VuZHN3aXRoKFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogCkBAIC0yOTQ0LDkgKzIyNTQsOSBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfZGVjb2RlX2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBjb25zdCBjaGFyICplbmNvZGluZywKK2J5dGVzX2RlY29kZV9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKmVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJkMjAxNmZmOGUwYmIxNzYgaW5wdXQ9OTU4MTc0NzY5ZDJhNDBjYV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTU2NDlhNTNkZGUyN2IzMTQgaW5wdXQ9OTU4MTc0NzY5ZDJhNDBjYV0qLwogewogICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoKFB5T2JqZWN0KilzZWxmLCBlbmNvZGluZywgZXJyb3JzKTsKIH0KQEAgLTI5NjQsOCArMjI3NCw4IEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19zcGxpdGxpbmVzX2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBpbnQga2VlcGVuZHMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTk1YzM1OThmNzgzM2NhZCBpbnB1dD03ZjRhYWM2NzE0NGY5OTQ0XSovCitieXRlc19zcGxpdGxpbmVzX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgaW50IGtlZXBlbmRzKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTM0ODQxNDlhNWQ4ODBmZmIgaW5wdXQ9N2Y0YWFjNjcxNDRmOTk0NF0qLwogewogICAgIHJldHVybiBzdHJpbmdsaWJfc3BsaXRsaW5lcygKICAgICAgICAgKFB5T2JqZWN0Kikgc2VsZiwgUHlCeXRlc19BU19TVFJJTkcoc2VsZiksCkBAIC0yOTczLDIyICsyMjgzLDYgQEAKICAgICAgICAgKTsKIH0KIAotc3RhdGljIGludAotaGV4X2RpZ2l0X3RvX2ludChQeV9VQ1M0IGMpCi17Ci0gICAgaWYgKGMgPj0gMTI4KQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKFB5X0lTRElHSVQoYykpCi0gICAgICAgIHJldHVybiBjIC0gJzAnOwotICAgIGVsc2UgewotICAgICAgICBpZiAoUHlfSVNVUFBFUihjKSkKLSAgICAgICAgICAgIGMgPSBQeV9UT0xPV0VSKGMpOwotICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCi0gICAgICAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KIC8qW2NsaW5pYyBpbnB1dF0KIEBjbGFzc21ldGhvZAogYnl0ZXMuZnJvbWhleApAQCAtMzAwNiw0NyArMjMwMCw4OCBAQAogYnl0ZXNfZnJvbWhleF9pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnN0cmluZykKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wOTczYWNjNjM2NjFiYjJlIGlucHV0PWJmNGQxYzM2MTY3MGFjZDNdKi8KIHsKLSAgICBQeU9iamVjdCAqbmV3c3RyaW5nOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBfUHlCeXRlc19Gcm9tSGV4KHN0cmluZywgMCk7CisgICAgaWYgKHR5cGUgIT0gJlB5Qnl0ZXNfVHlwZSAmJiByZXN1bHQgIT0gTlVMTCkgeworICAgICAgICBQeV9TRVRSRUYocmVzdWx0LCBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCAqKXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBOVUxMKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1B5T2JqZWN0KgorX1B5Qnl0ZXNfRnJvbUhleChQeU9iamVjdCAqc3RyaW5nLCBpbnQgdXNlX2J5dGVhcnJheSkKK3sKICAgICBjaGFyICpidWY7Ci0gICAgUHlfc3NpemVfdCBoZXhsZW4sIGJ5dGVzbGVuLCBpLCBqOwotICAgIGludCB0b3AsIGJvdDsKLSAgICB2b2lkICpkYXRhOwotICAgIHVuc2lnbmVkIGludCBraW5kOworICAgIFB5X3NzaXplX3QgaGV4bGVuLCBpbnZhbGlkX2NoYXI7CisgICAgdW5zaWduZWQgaW50IHRvcCwgYm90OworICAgIFB5X1VDUzEgKnN0ciwgKmVuZDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHdyaXRlci51c2VfYnl0ZWFycmF5ID0gdXNlX2J5dGVhcnJheTsKIAogICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2soc3RyaW5nKSk7CiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdHJpbmcpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyaW5nKTsKLSAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyaW5nKTsKICAgICBoZXhsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHJpbmcpOwogCi0gICAgYnl0ZXNsZW4gPSBoZXhsZW4vMjsgLyogVGhpcyBvdmVyZXN0aW1hdGVzIGlmIHRoZXJlIGFyZSBzcGFjZXMgKi8KLSAgICBuZXdzdHJpbmcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ5dGVzbGVuKTsKLSAgICBpZiAoIW5ld3N0cmluZykKKyAgICBpZiAoIVB5VW5pY29kZV9JU19BU0NJSShzdHJpbmcpKSB7CisgICAgICAgIHZvaWQgKmRhdGEgPSBQeVVuaWNvZGVfREFUQShzdHJpbmcpOworICAgICAgICB1bnNpZ25lZCBpbnQga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cmluZyk7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKworICAgICAgICAvKiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBub24tQVNDSUkgY2hhcmFjdGVyICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZXhsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpID49IDEyOCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnZhbGlkX2NoYXIgPSBpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGFzc2VydChQeVVuaWNvZGVfS0lORChzdHJpbmcpID09IFB5VW5pY29kZV8xQllURV9LSU5EKTsKKyAgICBzdHIgPSBQeVVuaWNvZGVfMUJZVEVfREFUQShzdHJpbmcpOworCisgICAgLyogVGhpcyBvdmVyZXN0aW1hdGVzIGlmIHRoZXJlIGFyZSBzcGFjZXMgKi8KKyAgICBidWYgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBoZXhsZW4gLyAyKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGJ1ZiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKG5ld3N0cmluZyk7Ci0gICAgZm9yIChpID0gaiA9IDA7IGkgPCBoZXhsZW47IGkgKz0gMikgeworCisgICAgZW5kID0gc3RyICsgaGV4bGVuOworICAgIHdoaWxlIChzdHIgPCBlbmQpIHsKICAgICAgICAgLyogc2tpcCBvdmVyIHNwYWNlcyBpbiB0aGUgaW5wdXQgKi8KLSAgICAgICAgd2hpbGUgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpID09ICcgJykKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgaWYgKGkgPj0gaGV4bGVuKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHRvcCA9IGhleF9kaWdpdF90b19pbnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkpOwotICAgICAgICBib3QgPSBoZXhfZGlnaXRfdG9faW50KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkrMSkpOwotICAgICAgICBpZiAodG9wID09IC0xIHx8IGJvdCA9PSAtMSkgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1oZXhhZGVjaW1hbCBudW1iZXIgZm91bmQgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uICV6ZCIsIGkpOworICAgICAgICBpZiAoKnN0ciA9PSAnICcpIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBzdHIrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKCpzdHIgPT0gJyAnKTsKKyAgICAgICAgICAgIGlmIChzdHIgPj0gZW5kKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdG9wID0gX1B5TG9uZ19EaWdpdFZhbHVlWypzdHJdOworICAgICAgICBpZiAodG9wID49IDE2KSB7CisgICAgICAgICAgICBpbnZhbGlkX2NoYXIgPSBzdHIgLSBQeVVuaWNvZGVfMUJZVEVfREFUQShzdHJpbmcpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBidWZbaisrXSA9ICh0b3AgPDwgNCkgKyBib3Q7CisgICAgICAgIHN0cisrOworCisgICAgICAgIGJvdCA9IF9QeUxvbmdfRGlnaXRWYWx1ZVsqc3RyXTsKKyAgICAgICAgaWYgKGJvdCA+PSAxNikgeworICAgICAgICAgICAgaW52YWxpZF9jaGFyID0gc3RyIC0gUHlVbmljb2RlXzFCWVRFX0RBVEEoc3RyaW5nKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc3RyKys7CisKKyAgICAgICAgKmJ1ZisrID0gKHVuc2lnbmVkIGNoYXIpKCh0b3AgPDwgNCkgKyBib3QpOwogICAgIH0KLSAgICBpZiAoaiAhPSBieXRlc2xlbiAmJiBfUHlCeXRlc19SZXNpemUoJm5ld3N0cmluZywgaikgPCAwKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIHJldHVybiBuZXdzdHJpbmc7CisKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGJ1Zik7CiAKICAgZXJyb3I6Ci0gICAgUHlfWERFQ1JFRihuZXdzdHJpbmcpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAibm9uLWhleGFkZWNpbWFsIG51bWJlciBmb3VuZCBpbiAiCisgICAgICAgICAgICAgICAgICJmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uICV6ZCIsIGludmFsaWRfY2hhcik7CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMzA3NiwxNyArMjQxMSwyMCBAQAogICAgIHsiX19nZXRuZXdhcmdzX18iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYnl0ZXNfZ2V0bmV3YXJncywgIE1FVEhfTk9BUkdTfSwKICAgICB7ImNhcGl0YWxpemUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2NhcGl0YWxpemUsIE1FVEhfTk9BUkdTLAogICAgICBfUHlfY2FwaXRhbGl6ZV9fZG9jX199LAotICAgIHsiY2VudGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9jZW50ZXIsIE1FVEhfVkFSQVJHUywgY2VudGVyX19kb2NfX30sCi0gICAgeyJjb3VudCIsIChQeUNGdW5jdGlvbilieXRlc19jb3VudCwgTUVUSF9WQVJBUkdTLCBjb3VudF9fZG9jX199LAorICAgIHsiY2VudGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9jZW50ZXIsIE1FVEhfVkFSQVJHUywKKyAgICAgX1B5X2NlbnRlcl9fZG9jX199LAorICAgIHsiY291bnQiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfY291bnQsIE1FVEhfVkFSQVJHUywKKyAgICAgX1B5X2NvdW50X19kb2NfX30sCiAgICAgQllURVNfREVDT0RFX01FVEhPRERFRgogICAgIHsiZW5kc3dpdGgiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfZW5kc3dpdGgsIE1FVEhfVkFSQVJHUywKLSAgICAgZW5kc3dpdGhfX2RvY19ffSwKKyAgICAgX1B5X2VuZHN3aXRoX19kb2NfX30sCiAgICAgeyJleHBhbmR0YWJzIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9leHBhbmR0YWJzLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotICAgICBleHBhbmR0YWJzX19kb2NfX30sCi0gICAgeyJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2ZpbmQsIE1FVEhfVkFSQVJHUywgZmluZF9fZG9jX199LAorICAgICBfUHlfZXhwYW5kdGFic19fZG9jX199LAorICAgIHsiZmluZCIsIChQeUNGdW5jdGlvbilieXRlc19maW5kLCBNRVRIX1ZBUkFSR1MsCisgICAgIF9QeV9maW5kX19kb2NfX30sCiAgICAgQllURVNfRlJPTUhFWF9NRVRIT0RERUYKICAgICB7ImhleCIsIChQeUNGdW5jdGlvbilieXRlc19oZXgsIE1FVEhfTk9BUkdTLCBoZXhfX2RvY19ffSwKLSAgICB7ImluZGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2luZGV4LCBNRVRIX1ZBUkFSR1MsIGluZGV4X19kb2NfX30sCisgICAgeyJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlc19pbmRleCwgTUVUSF9WQVJBUkdTLCBfUHlfaW5kZXhfX2RvY19ffSwKICAgICB7ImlzYWxudW0iLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2lzYWxudW0sIE1FVEhfTk9BUkdTLAogICAgICBfUHlfaXNhbG51bV9fZG9jX199LAogICAgIHsiaXNhbHBoYSIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfaXNhbHBoYSwgTUVUSF9OT0FSR1MsCkBAIC0zMTAyLDM4ICsyNDQwLDQwIEBACiAgICAgeyJpc3VwcGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9pc3VwcGVyLCBNRVRIX05PQVJHUywKICAgICAgX1B5X2lzdXBwZXJfX2RvY19ffSwKICAgICBCWVRFU19KT0lOX01FVEhPRERFRgotICAgIHsibGp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2xqdXN0LCBNRVRIX1ZBUkFSR1MsIGxqdXN0X19kb2NfX30sCisgICAgeyJsanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfbGp1c3QsIE1FVEhfVkFSQVJHUywgX1B5X2xqdXN0X19kb2NfX30sCiAgICAgeyJsb3dlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfbG93ZXIsIE1FVEhfTk9BUkdTLCBfUHlfbG93ZXJfX2RvY19ffSwKICAgICBCWVRFU19MU1RSSVBfTUVUSE9EREVGCiAgICAgQllURVNfTUFLRVRSQU5TX01FVEhPRERFRgogICAgIEJZVEVTX1BBUlRJVElPTl9NRVRIT0RERUYKICAgICBCWVRFU19SRVBMQUNFX01FVEhPRERFRgotICAgIHsicmZpbmQiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfcmZpbmQsIE1FVEhfVkFSQVJHUywgcmZpbmRfX2RvY19ffSwKLSAgICB7InJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlc19yaW5kZXgsIE1FVEhfVkFSQVJHUywgcmluZGV4X19kb2NfX30sCi0gICAgeyJyanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfcmp1c3QsIE1FVEhfVkFSQVJHUywgcmp1c3RfX2RvY19ffSwKKyAgICB7InJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3JmaW5kLCBNRVRIX1ZBUkFSR1MsIF9QeV9yZmluZF9fZG9jX199LAorICAgIHsicmluZGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3JpbmRleCwgTUVUSF9WQVJBUkdTLCBfUHlfcmluZGV4X19kb2NfX30sCisgICAgeyJyanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfcmp1c3QsIE1FVEhfVkFSQVJHUywgX1B5X3JqdXN0X19kb2NfX30sCiAgICAgQllURVNfUlBBUlRJVElPTl9NRVRIT0RERUYKICAgICBCWVRFU19SU1BMSVRfTUVUSE9EREVGCiAgICAgQllURVNfUlNUUklQX01FVEhPRERFRgogICAgIEJZVEVTX1NQTElUX01FVEhPRERFRgogICAgIEJZVEVTX1NQTElUTElORVNfTUVUSE9EREVGCiAgICAgeyJzdGFydHN3aXRoIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3N0YXJ0c3dpdGgsIE1FVEhfVkFSQVJHUywKLSAgICAgc3RhcnRzd2l0aF9fZG9jX199LAorICAgICBfUHlfc3RhcnRzd2l0aF9fZG9jX199LAogICAgIEJZVEVTX1NUUklQX01FVEhPRERFRgogICAgIHsic3dhcGNhc2UiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3N3YXBjYXNlLCBNRVRIX05PQVJHUywKICAgICAgX1B5X3N3YXBjYXNlX19kb2NfX30sCiAgICAgeyJ0aXRsZSIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfdGl0bGUsIE1FVEhfTk9BUkdTLCBfUHlfdGl0bGVfX2RvY19ffSwKICAgICBCWVRFU19UUkFOU0xBVEVfTUVUSE9EREVGCiAgICAgeyJ1cHBlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfdXBwZXIsIE1FVEhfTk9BUkdTLCBfUHlfdXBwZXJfX2RvY19ffSwKLSAgICB7InpmaWxsIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl96ZmlsbCwgTUVUSF9WQVJBUkdTLCB6ZmlsbF9fZG9jX199LAorICAgIHsiemZpbGwiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3pmaWxsLCBNRVRIX1ZBUkFSR1MsIF9QeV96ZmlsbF9fZG9jX199LAogICAgIHtOVUxMLCAgICAgTlVMTH0gICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19tb2QoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQorYnl0ZXNfbW9kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotICAgIGlmICghUHlCeXRlc19DaGVjayh2KSkKKyAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2soc2VsZikpIHsKICAgICAgICAgUHlfUkVUVVJOX05PVElNUExFTUVOVEVEOwotICAgIHJldHVybiBfUHlCeXRlc19Gb3JtYXQodiwgdyk7CisgICAgfQorICAgIHJldHVybiBfUHlCeXRlc19Gb3JtYXRFeChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCAwKTsKIH0KIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBieXRlc19hc19udW1iZXIgPSB7CkBAIC0zMjIyLDE3ICsyNTYyLDE1IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICAvKiBJcyBpdCBhbiBpbnRlZ2VyPyAqLwotICAgIHNpemUgPSBQeU51bWJlcl9Bc1NzaXplX3QoeCwgUHlFeGNfT3ZlcmZsb3dFcnJvcik7Ci0gICAgaWYgKHNpemUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKKyAgICBpZiAoUHlJbmRleF9DaGVjayh4KSkgeworICAgICAgICBzaXplID0gUHlOdW1iZXJfQXNTc2l6ZV90KHgsIFB5RXhjX092ZXJmbG93RXJyb3IpOworICAgICAgICBpZiAoc2l6ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2l6ZSA8IDApIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBjb3VudCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIGNvdW50Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBuZXcgPSBfUHlCeXRlc19Gcm9tU2l6ZShzaXplLCAxKTsKICAgICAgICAgaWYgKG5ldyA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zMjQyLDEwOCArMjU4MCw5MyBAQAogICAgIHJldHVybiBQeUJ5dGVzX0Zyb21PYmplY3QoeCk7CiB9CiAKLVB5T2JqZWN0ICoKLVB5Qnl0ZXNfRnJvbU9iamVjdChQeU9iamVjdCAqeCkKK3N0YXRpYyBQeU9iamVjdCoKK19QeUJ5dGVzX0Zyb21CdWZmZXIoUHlPYmplY3QgKngpCiB7Ci0gICAgUHlPYmplY3QgKm5ldywgKml0OworICAgIFB5T2JqZWN0ICpuZXc7CisgICAgUHlfYnVmZmVyIHZpZXc7CisKKyAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHgsICZ2aWV3LCBQeUJVRl9GVUxMX1JPKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbmV3ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCB2aWV3Lmxlbik7CisgICAgaWYgKCFuZXcpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoUHlCdWZmZXJfVG9Db250aWd1b3VzKCgoUHlCeXRlc09iamVjdCAqKW5ldyktPm9iX3N2YWwsCisgICAgICAgICAgICAgICAgJnZpZXcsIHZpZXcubGVuLCAnQycpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOworICAgIHJldHVybiBuZXc7CisKK2ZhaWw6CisgICAgUHlfWERFQ1JFRihuZXcpOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOworICAgIHJldHVybiBOVUxMOworfQorCisjZGVmaW5lIF9QeUJ5dGVzX0ZST01fTElTVF9CT0RZKHgsIEdFVF9JVEVNKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlPYmplY3QgKmJ5dGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X3NzaXplX3QgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9zc2l6ZV90IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2hhciAqc3RyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5T2JqZWN0ICppdGVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnl0ZXMgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIFB5X1NJWkUoeCkpOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChieXRlcyA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyID0gKChQeUJ5dGVzT2JqZWN0ICopYnl0ZXMpLT5vYl9zdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh4KTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGl0ZW0gPSBHRVRfSVRFTSgoeCksIGkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+PSAyNTYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqc3RyKysgPSAoY2hhcikgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIGJ5dGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVycm9yOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlfREVDUkVGKGJ5dGVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBQeU9iamVjdCoKK19QeUJ5dGVzX0Zyb21MaXN0KFB5T2JqZWN0ICp4KQoreworICAgIF9QeUJ5dGVzX0ZST01fTElTVF9CT0RZKHgsIFB5TGlzdF9HRVRfSVRFTSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK19QeUJ5dGVzX0Zyb21UdXBsZShQeU9iamVjdCAqeCkKK3sKKyAgICBfUHlCeXRlc19GUk9NX0xJU1RfQk9EWSh4LCBQeVR1cGxlX0dFVF9JVEVNKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK19QeUJ5dGVzX0Zyb21JdGVyYXRvcihQeU9iamVjdCAqaXQsIFB5T2JqZWN0ICp4KQoreworICAgIGNoYXIgKnN0cjsKICAgICBQeV9zc2l6ZV90IGksIHNpemU7Ci0KLSAgICBpZiAoeCA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoUHlCeXRlc19DaGVja0V4YWN0KHgpKSB7Ci0gICAgICAgIFB5X0lOQ1JFRih4KTsKLSAgICAgICAgcmV0dXJuIHg7Ci0gICAgfQotCi0gICAgLyogVXNlIHRoZSBtb2Rlcm4gYnVmZmVyIGludGVyZmFjZSAqLwotICAgIGlmIChQeU9iamVjdF9DaGVja0J1ZmZlcih4KSkgewotICAgICAgICBQeV9idWZmZXIgdmlldzsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcih4LCAmdmlldywgUHlCVUZfRlVMTF9STykgPCAwKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIG5ldyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgdmlldy5sZW4pOwotICAgICAgICBpZiAoIW5ldykKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgaWYgKFB5QnVmZmVyX1RvQ29udGlndW91cygoKFB5Qnl0ZXNPYmplY3QgKiluZXcpLT5vYl9zdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aWV3LCB2aWV3LmxlbiwgJ0MnKSA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwotICAgICAgICByZXR1cm4gbmV3OwotICAgICAgZmFpbDoKLSAgICAgICAgUHlfWERFQ1JFRihuZXcpOwotICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soeCkpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCB1bmljb2RlIG9iamVjdCB0byBieXRlcyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoUHlMaXN0X0NoZWNrRXhhY3QoeCkpIHsKLSAgICAgICAgbmV3ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBQeV9TSVpFKHgpKTsKLSAgICAgICAgaWYgKG5ldyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHgpOyBpKyspIHsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3QoCi0gICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKHgsIGkpLCBQeUV4Y19WYWx1ZUVycm9yKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ldyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IDI1NikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpIik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ldyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKFB5Qnl0ZXNPYmplY3QgKiluZXcpLT5vYl9zdmFsW2ldID0gKGNoYXIpIHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXc7Ci0gICAgfQotICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QoeCkpIHsKLSAgICAgICAgbmV3ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBQeV9TSVpFKHgpKTsKLSAgICAgICAgaWYgKG5ldyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHgpOyBpKyspIHsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3QoCi0gICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTSh4LCBpKSwgUHlFeGNfVmFsdWVFcnJvcik7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXcpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+PSAyNTYpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KSIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXcpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKChQeUJ5dGVzT2JqZWN0ICopbmV3KS0+b2Jfc3ZhbFtpXSA9IChjaGFyKSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3OwotICAgIH0KKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICAvKiBGb3IgaXRlcmF0b3IgdmVyc2lvbiwgY3JlYXRlIGEgc3RyaW5nIG9iamVjdCBhbmQgcmVzaXplIGFzIG5lZWRlZCAqLwogICAgIHNpemUgPSBQeU9iamVjdF9MZW5ndGhIaW50KHgsIDY0KTsKICAgICBpZiAoc2l6ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAvKiBBbGxvY2F0ZSBhbiBleHRyYSBieXRlIHRvIHByZXZlbnQgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgpIGZyb20KLSAgICAgICByZXR1cm5pbmcgYSBzaGFyZWQgZW1wdHkgYnl0ZXMgc3RyaW5nLiBUaGlzIHJlcXVpcmVkIGJlY2F1c2Ugd2UKLSAgICAgICB3YW50IHRvIGNhbGwgX1B5Qnl0ZXNfUmVzaXplKCkgdGhlIHJldHVybmVkIG9iamVjdCwgd2hpY2ggd2UgY2FuCi0gICAgICAgb25seSBkbyBvbiBieXRlcyBvYmplY3RzIHdpdGggcmVmY291bnQgPT0gMS4gKi8KLSAgICBpZiAoc2l6ZSA9PSAwKQotICAgICAgICBzaXplID0gMTsKLSAgICBuZXcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpOwotICAgIGlmIChuZXcgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXNzZXJ0KFB5X1JFRkNOVChuZXcpID09IDEpOwogCi0gICAgLyogR2V0IHRoZSBpdGVyYXRvciAqLwotICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih4KTsKLSAgICBpZiAoaXQgPT0gTlVMTCkKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHNpemUpOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CisgICAgc2l6ZSA9IHdyaXRlci5hbGxvY2F0ZWQ7CiAKICAgICAvKiBSdW4gdGhlIGl0ZXJhdG9yIHRvIGV4aGF1c3Rpb24gKi8KICAgICBmb3IgKGkgPSAwOyA7IGkrKykgewpAQCAtMzM1OSw3ICsyNjgyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qIEludGVycHJldCBpdCBhcyBhbiBpbnQgKF9faW5kZXhfXykgKi8KLSAgICAgICAgdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfVmFsdWVFcnJvcik7CisgICAgICAgIHZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIE5VTEwpOwogICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTMzNzMsMjEgKzI2OTYsNTggQEAKIAogICAgICAgICAvKiBBcHBlbmQgdGhlIGJ5dGUgKi8KICAgICAgICAgaWYgKGkgPj0gc2l6ZSkgewotICAgICAgICAgICAgc2l6ZSA9IDIgKiBzaXplICsgMTsKLSAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJm5ldywgc2l6ZSkgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9SZXNpemUoJndyaXRlciwgc3RyLCBzaXplKzEpOworICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgc2l6ZSA9IHdyaXRlci5hbGxvY2F0ZWQ7CiAgICAgICAgIH0KLSAgICAgICAgKChQeUJ5dGVzT2JqZWN0ICopbmV3KS0+b2Jfc3ZhbFtpXSA9IChjaGFyKSB2YWx1ZTsKKyAgICAgICAgKnN0cisrID0gKGNoYXIpIHZhbHVlOwogICAgIH0KLSAgICBfUHlCeXRlc19SZXNpemUoJm5ldywgaSk7CiAKLSAgICAvKiBDbGVhbiB1cCBhbmQgcmV0dXJuIHN1Y2Nlc3MgKi8KLSAgICBQeV9ERUNSRUYoaXQpOwotICAgIHJldHVybiBuZXc7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzdHIpOwogCiAgIGVycm9yOgotICAgIFB5X1hERUNSRUYoaXQpOwotICAgIFB5X1hERUNSRUYobmV3KTsKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOworfQorCitQeU9iamVjdCAqCitQeUJ5dGVzX0Zyb21PYmplY3QoUHlPYmplY3QgKngpCit7CisgICAgUHlPYmplY3QgKml0LCAqcmVzdWx0OworCisgICAgaWYgKHggPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKFB5Qnl0ZXNfQ2hlY2tFeGFjdCh4KSkgeworICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgIHJldHVybiB4OworICAgIH0KKworICAgIC8qIFVzZSB0aGUgbW9kZXJuIGJ1ZmZlciBpbnRlcmZhY2UgKi8KKyAgICBpZiAoUHlPYmplY3RfQ2hlY2tCdWZmZXIoeCkpCisgICAgICAgIHJldHVybiBfUHlCeXRlc19Gcm9tQnVmZmVyKHgpOworCisgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHgpKQorICAgICAgICByZXR1cm4gX1B5Qnl0ZXNfRnJvbUxpc3QoeCk7CisKKyAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHgpKQorICAgICAgICByZXR1cm4gX1B5Qnl0ZXNfRnJvbVR1cGxlKHgpOworCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soeCkpIHsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHgpOworICAgICAgICBpZiAoaXQgIT0gTlVMTCkgeworICAgICAgICAgICAgcmVzdWx0ID0gX1B5Qnl0ZXNfRnJvbUl0ZXJhdG9yKGl0LCB4KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0ICclLjIwMHMnIG9iamVjdCB0byBieXRlcyIsCisgICAgICAgICAgICAgICAgIHgtPm9iX3R5cGUtPnRwX25hbWUpOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0zNzM4LDMgKzMwOTgsMjgyIEBACiAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CisKKworLyogX1B5Qnl0ZXNXcml0ZXIgQVBJICovCisKKyNpZmRlZiBNU19XSU5ET1dTCisgICAvKiBPbiBXaW5kb3dzLCBvdmVyYWxsb2NhdGUgYnkgNTAlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgMgorI2Vsc2UKKyAgIC8qIE9uIExpbnV4LCBvdmVyYWxsb2NhdGUgYnkgMjUlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgNAorI2VuZGlmCisKK3ZvaWQKK19QeUJ5dGVzV3JpdGVyX0luaXQoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlcikKK3sKKyAgICAvKiBTZXQgYWxsIGF0dHJpYnV0ZXMgYmVmb3JlIHNtYWxsX2J1ZmZlciB0byAwICovCisgICAgbWVtc2V0KHdyaXRlciwgMCwgb2Zmc2V0b2YoX1B5Qnl0ZXNXcml0ZXIsIHNtYWxsX2J1ZmZlcikpOworI2lmZGVmIFB5X0RFQlVHCisgICAgbWVtc2V0KHdyaXRlci0+c21hbGxfYnVmZmVyLCAweENCLCBzaXplb2Yod3JpdGVyLT5zbWFsbF9idWZmZXIpKTsKKyNlbmRpZgorfQorCit2b2lkCitfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIpCit7CisgICAgUHlfQ0xFQVIod3JpdGVyLT5idWZmZXIpOworfQorCitQeV9MT0NBTF9JTkxJTkUoY2hhciopCitfUHlCeXRlc1dyaXRlcl9Bc1N0cmluZyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyKQoreworICAgIGlmICh3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIpIHsKKyAgICAgICAgYXNzZXJ0KHdyaXRlci0+YnVmZmVyID09IE5VTEwpOworICAgICAgICByZXR1cm4gd3JpdGVyLT5zbWFsbF9idWZmZXI7CisgICAgfQorICAgIGVsc2UgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkgeworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgIT0gTlVMTCk7CisgICAgICAgIHJldHVybiBQeUJ5dGVBcnJheV9BU19TVFJJTkcod3JpdGVyLT5idWZmZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KHdyaXRlci0+YnVmZmVyICE9IE5VTEwpOworICAgICAgICByZXR1cm4gUHlCeXRlc19BU19TVFJJTkcod3JpdGVyLT5idWZmZXIpOworICAgIH0KK30KKworUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCitfUHlCeXRlc1dyaXRlcl9HZXRTaXplKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0cikKK3sKKyAgICBjaGFyICpzdGFydCA9IF9QeUJ5dGVzV3JpdGVyX0FzU3RyaW5nKHdyaXRlcik7CisgICAgYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RyID49IHN0YXJ0KTsKKyAgICBhc3NlcnQoc3RyIC0gc3RhcnQgPD0gd3JpdGVyLT5hbGxvY2F0ZWQpOworICAgIHJldHVybiBzdHIgLSBzdGFydDsKK30KKworUHlfTE9DQUxfSU5MSU5FKHZvaWQpCitfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0cikKK3sKKyNpZmRlZiBQeV9ERUJVRworICAgIGNoYXIgKnN0YXJ0LCAqZW5kOworCisgICAgaWYgKHdyaXRlci0+dXNlX3NtYWxsX2J1ZmZlcikgeworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgPT0gTlVMTCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpCisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlQXJyYXlfQ2hlY2tFeGFjdCh3cml0ZXItPmJ1ZmZlcikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVja0V4YWN0KHdyaXRlci0+YnVmZmVyKSk7CisgICAgICAgIGFzc2VydChQeV9SRUZDTlQod3JpdGVyLT5idWZmZXIpID09IDEpOworICAgIH0KKworICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpIHsKKyAgICAgICAgLyogYnl0ZWFycmF5IGhhcyBpdHMgb3duIG92ZXJhbGxvY2F0aW9uIGFsZ29yaXRobSwKKyAgICAgICAgICAgd3JpdGVyIG92ZXJhbGxvY2F0aW9uIG11c3QgYmUgZGlzYWJsZWQgKi8KKyAgICAgICAgYXNzZXJ0KCF3cml0ZXItPm92ZXJhbGxvY2F0ZSk7CisgICAgfQorCisgICAgYXNzZXJ0KDAgPD0gd3JpdGVyLT5hbGxvY2F0ZWQpOworICAgIGFzc2VydCgwIDw9IHdyaXRlci0+bWluX3NpemUgJiYgd3JpdGVyLT5taW5fc2l6ZSA8PSB3cml0ZXItPmFsbG9jYXRlZCk7CisgICAgLyogdGhlIGxhc3QgYnl0ZSBtdXN0IGFsd2F5cyBiZSBudWxsICovCisgICAgc3RhcnQgPSBfUHlCeXRlc1dyaXRlcl9Bc1N0cmluZyh3cml0ZXIpOworICAgIGFzc2VydChzdGFydFt3cml0ZXItPmFsbG9jYXRlZF0gPT0gMCk7CisKKyAgICBlbmQgPSBzdGFydCArIHdyaXRlci0+YWxsb2NhdGVkOworICAgIGFzc2VydChzdHIgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0YXJ0IDw9IHN0ciAmJiBzdHIgPD0gZW5kKTsKKyNlbmRpZgorfQorCit2b2lkKgorX1B5Qnl0ZXNXcml0ZXJfUmVzaXplKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIHZvaWQgKnN0ciwgUHlfc3NpemVfdCBzaXplKQoreworICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkLCBwb3M7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KHdyaXRlciwgc3RyKTsKKyAgICBhc3NlcnQod3JpdGVyLT5hbGxvY2F0ZWQgPCBzaXplKTsKKworICAgIGFsbG9jYXRlZCA9IHNpemU7CisgICAgaWYgKHdyaXRlci0+b3ZlcmFsbG9jYXRlCisgICAgICAgICYmIGFsbG9jYXRlZCA8PSAoUFlfU1NJWkVfVF9NQVggLSBhbGxvY2F0ZWQgLyBPVkVSQUxMT0NBVEVfRkFDVE9SKSkgeworICAgICAgICAvKiBvdmVyYWxsb2NhdGUgdG8gbGltaXQgdGhlIG51bWJlciBvZiByZWFsbG9jKCkgKi8KKyAgICAgICAgYWxsb2NhdGVkICs9IGFsbG9jYXRlZCAvIE9WRVJBTExPQ0FURV9GQUNUT1I7CisgICAgfQorCisgICAgcG9zID0gX1B5Qnl0ZXNXcml0ZXJfR2V0U2l6ZSh3cml0ZXIsIHN0cik7CisgICAgaWYgKCF3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIpIHsKKyAgICAgICAgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkgeworICAgICAgICAgICAgaWYgKFB5Qnl0ZUFycmF5X1Jlc2l6ZSh3cml0ZXItPmJ1ZmZlciwgYWxsb2NhdGVkKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgLyogd3JpdGVyLT5hbGxvY2F0ZWQgY2FuIGJlIHNtYWxsZXIgdGhhbiB3cml0ZXItPmJ1ZmZlci0+b2JfYWxsb2MsCisgICAgICAgICAgICAgICBidXQgd2UgY2Fubm90IHVzZSBvYl9hbGxvYyBiZWNhdXNlIGJ5dGVzIG1heSBuZWVkIHRvIGJlIG1vdmVkCisgICAgICAgICAgICAgICB0byB1c2UgdGhlIHdob2xlIGJ1ZmZlci4gYnl0ZWFycmF5IHVzZXMgYW4gaW50ZXJuYWwgb3B0aW1pemF0aW9uCisgICAgICAgICAgICAgICB0byBhdm9pZCBtb3Zpbmcgb3IgY29weWluZyBieXRlcyB3aGVuIGJ5dGVzIGFyZSByZW1vdmVkIGF0IHRoZQorICAgICAgICAgICAgICAgYmVnaW5uaW5nIChleDogZGVsIGJ5dGVhcnJheVs6MV0pLiAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmd3JpdGVyLT5idWZmZXIsIGFsbG9jYXRlZCkpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogY29udmVydCBmcm9tIHN0YWNrIGJ1ZmZlciB0byBieXRlcyBvYmplY3QgYnVmZmVyICovCisgICAgICAgIGFzc2VydCh3cml0ZXItPmJ1ZmZlciA9PSBOVUxMKTsKKworICAgICAgICBpZiAod3JpdGVyLT51c2VfYnl0ZWFycmF5KQorICAgICAgICAgICAgd3JpdGVyLT5idWZmZXIgPSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBhbGxvY2F0ZWQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3cml0ZXItPmJ1ZmZlciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYWxsb2NhdGVkKTsKKyAgICAgICAgaWYgKHdyaXRlci0+YnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIGlmIChwb3MgIT0gMCkgeworICAgICAgICAgICAgY2hhciAqZGVzdDsKKyAgICAgICAgICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpCisgICAgICAgICAgICAgICAgZGVzdCA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyh3cml0ZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGVzdCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHdyaXRlci0+YnVmZmVyKTsKKyAgICAgICAgICAgIFB5X01FTUNQWShkZXN0LAorICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+c21hbGxfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgIHBvcyk7CisgICAgICAgIH0KKworICAgICAgICB3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIgPSAwOworI2lmZGVmIFB5X0RFQlVHCisgICAgICAgIG1lbXNldCh3cml0ZXItPnNtYWxsX2J1ZmZlciwgMHhEQiwgc2l6ZW9mKHdyaXRlci0+c21hbGxfYnVmZmVyKSk7CisjZW5kaWYKKyAgICB9CisgICAgd3JpdGVyLT5hbGxvY2F0ZWQgPSBhbGxvY2F0ZWQ7CisKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9Bc1N0cmluZyh3cml0ZXIpICsgcG9zOworICAgIF9QeUJ5dGVzV3JpdGVyX0NoZWNrQ29uc2lzdGVuY3kod3JpdGVyLCBzdHIpOworICAgIHJldHVybiBzdHI7CisKK2Vycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2Mod3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCoKK19QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgdm9pZCAqc3RyLCBQeV9zc2l6ZV90IHNpemUpCit7CisgICAgUHlfc3NpemVfdCBuZXdfbWluX3NpemU7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KHdyaXRlciwgc3RyKTsKKyAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKworICAgIGlmICh3cml0ZXItPm1pbl9zaXplID4gUFlfU1NJWkVfVF9NQVggLSBzaXplKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2Mod3JpdGVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5ld19taW5fc2l6ZSA9IHdyaXRlci0+bWluX3NpemUgKyBzaXplOworCisgICAgaWYgKG5ld19taW5fc2l6ZSA+IHdyaXRlci0+YWxsb2NhdGVkKQorICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9SZXNpemUod3JpdGVyLCBzdHIsIG5ld19taW5fc2l6ZSk7CisKKyAgICB3cml0ZXItPm1pbl9zaXplID0gbmV3X21pbl9zaXplOworICAgIHJldHVybiBzdHI7Cit9CisKKy8qIEFsbG9jYXRlIHRoZSBidWZmZXIgdG8gd3JpdGUgc2l6ZSBieXRlcy4KKyAgIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGJ1ZmZlciBkYXRhLgorICAgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCBvbiBlcnJvci4gKi8KK3ZvaWQqCitfUHlCeXRlc1dyaXRlcl9BbGxvYyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBQeV9zc2l6ZV90IHNpemUpCit7CisgICAgLyogZW5zdXJlIHRoYXQgX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoKSBpcyBvbmx5IGNhbGxlZCBvbmNlICovCisgICAgYXNzZXJ0KHdyaXRlci0+bWluX3NpemUgPT0gMCAmJiB3cml0ZXItPmJ1ZmZlciA9PSBOVUxMKTsKKyAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKworICAgIHdyaXRlci0+dXNlX3NtYWxsX2J1ZmZlciA9IDE7CisjaWZkZWYgUHlfREVCVUcKKyAgICB3cml0ZXItPmFsbG9jYXRlZCA9IHNpemVvZih3cml0ZXItPnNtYWxsX2J1ZmZlcikgLSAxOworICAgIC8qIEluIGRlYnVnIG1vZGUsIGRvbid0IHVzZSB0aGUgZnVsbCBzbWFsbCBidWZmZXIgYmVjYXVzZSBpdCBpcyBsZXNzCisgICAgICAgZWZmaWNpZW50IHRoYW4gYnl0ZXMgYW5kIGJ5dGVhcnJheSBvYmplY3RzIHRvIGRldGVjdCBidWZmZXIgdW5kZXJmbG93CisgICAgICAgYW5kIGJ1ZmZlciBvdmVyZmxvdy4gVXNlIDEwIGJ5dGVzIG9mIHRoZSBzbWFsbCBidWZmZXIgdG8gdGVzdCBhbHNvCisgICAgICAgY29kZSB1c2luZyB0aGUgc21hbGxlciBidWZmZXIgaW4gZGVidWcgbW9kZS4KKworICAgICAgIERvbid0IG1vZGlmeSB0aGUgX1B5Qnl0ZXNXcml0ZXIgc3RydWN0dXJlICh1c2UgYSBzaG9ydGVyIHNtYWxsIGJ1ZmZlcikKKyAgICAgICBpbiBkZWJ1ZyBtb2RlIHRvIGFsc28gYmUgYWJsZSB0byBkZXRlY3Qgc3RhY2sgb3ZlcmZsb3cgd2hlbiBydW5uaW5nCisgICAgICAgdGVzdHMgaW4gZGVidWcgbW9kZS4gVGhlIF9QeUJ5dGVzV3JpdGVyIGlzIGxhcmdlIChtb3JlIHRoYW4gNTEyIGJ5dGVzKSwKKyAgICAgICBpZiBQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoKSBpcyBub3QgdXNlZCBpbiBkZWVwIEMgY2FsbGJhY2ssIHdlIG1heSBoaXQgYQorICAgICAgIHN0YWNrIG92ZXJmbG93LiAqLworICAgIHdyaXRlci0+YWxsb2NhdGVkID0gUHlfTUlOKHdyaXRlci0+YWxsb2NhdGVkLCAxMCk7CisgICAgLyogX1B5Qnl0ZXNXcml0ZXJfQ2hlY2tDb25zaXN0ZW5jeSgpIHJlcXVpcmVzIHRoZSBsYXN0IGJ5dGUgdG8gYmUgMCwKKyAgICAgICB0byBkZXRlY3QgYnVmZmVyIG92ZXJmbG93ICovCisgICAgd3JpdGVyLT5zbWFsbF9idWZmZXJbd3JpdGVyLT5hbGxvY2F0ZWRdID0gMDsKKyNlbHNlCisgICAgd3JpdGVyLT5hbGxvY2F0ZWQgPSBzaXplb2Yod3JpdGVyLT5zbWFsbF9idWZmZXIpOworI2VuZGlmCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUod3JpdGVyLCB3cml0ZXItPnNtYWxsX2J1ZmZlciwgc2l6ZSk7Cit9CisKK1B5T2JqZWN0ICoKK19QeUJ5dGVzV3JpdGVyX0ZpbmlzaChfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCB2b2lkICpzdHIpCit7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KHdyaXRlciwgc3RyKTsKKworICAgIHNpemUgPSBfUHlCeXRlc1dyaXRlcl9HZXRTaXplKHdyaXRlciwgc3RyKTsKKyAgICBpZiAoc2l6ZSA9PSAwICYmICF3cml0ZXItPnVzZV9ieXRlYXJyYXkpIHsKKyAgICAgICAgUHlfQ0xFQVIod3JpdGVyLT5idWZmZXIpOworICAgICAgICAvKiBHZXQgdGhlIGVtcHR5IGJ5dGUgc3RyaW5nIHNpbmdsZXRvbiAqLworICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOworICAgIH0KKyAgICBlbHNlIGlmICh3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIpIHsKKyAgICAgICAgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUod3JpdGVyLT5zbWFsbF9idWZmZXIsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSh3cml0ZXItPnNtYWxsX2J1ZmZlciwgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IHdyaXRlci0+YnVmZmVyOworICAgICAgICB3cml0ZXItPmJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKHNpemUgIT0gd3JpdGVyLT5hbGxvY2F0ZWQpIHsKKyAgICAgICAgICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlCeXRlQXJyYXlfUmVzaXplKHJlc3VsdCwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQqCitfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIHZvaWQgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnl0ZXMsIFB5X3NzaXplX3Qgc2l6ZSkKK3sKKyAgICBjaGFyICpzdHIgPSAoY2hhciAqKXB0cjsKKworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUod3JpdGVyLCBzdHIsIHNpemUpOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBQeV9NRU1DUFkoc3RyLCBieXRlcywgc2l6ZSk7CisgICAgc3RyICs9IHNpemU7CisKKyAgICByZXR1cm4gc3RyOworfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jbGFzc29iamVjdC5jIGIvT2JqZWN0cy9jbGFzc29iamVjdC5jCmluZGV4IDVlOGFjNTkuLmIwZWQwMjMgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY2xhc3NvYmplY3QuYworKysgYi9PYmplY3RzL2NsYXNzb2JqZWN0LmMKQEAgLTMwMiwzNCArMzAyLDE5IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1tZXRob2RfY2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZywgUHlPYmplY3QgKmt3KQorbWV0aG9kX2NhbGwoUHlPYmplY3QgKm1ldGhvZCwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0gICAgUHlPYmplY3QgKnNlbGYgPSBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKTsKLSAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpzZWxmLCAqZnVuYzsKIAotICAgIGZ1bmMgPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oZnVuYyk7CisgICAgc2VsZiA9IFB5TWV0aG9kX0dFVF9TRUxGKG1ldGhvZCk7CiAgICAgaWYgKHNlbGYgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBQeV9zc2l6ZV90IGFyZ2NvdW50ID0gUHlUdXBsZV9TaXplKGFyZyk7Ci0gICAgICAgIFB5T2JqZWN0ICpuZXdhcmcgPSBQeVR1cGxlX05ldyhhcmdjb3VudCArIDEpOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaWYgKG5ld2FyZyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmcsIDAsIHNlbGYpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykgewotICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZywgaSk7Ci0gICAgICAgICAgICBQeV9YSU5DUkVGKHYpOwotICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmcsIGkrMSwgdik7Ci0gICAgICAgIH0KLSAgICAgICAgYXJnID0gbmV3YXJnOwotICAgIH0KLSAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKChQeU9iamVjdCAqKWZ1bmMsIGFyZywga3cpOwotICAgIFB5X0RFQ1JFRihhcmcpOwotICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBmdW5jID0gUHlNZXRob2RfR0VUX0ZVTkNUSU9OKG1ldGhvZCk7CisKKyAgICByZXR1cm4gX1B5T2JqZWN0X0NhbGxfUHJlcGVuZChmdW5jLCBzZWxmLCBhcmdzLCBrd2FyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jbGluaWMvYnl0ZWFycmF5b2JqZWN0LmMuaCBiL09iamVjdHMvY2xpbmljL2J5dGVhcnJheW9iamVjdC5jLmgKaW5kZXggZTg3YTIyMS4uYTYwYmU3NiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jbGluaWMvYnl0ZWFycmF5b2JqZWN0LmMuaAorKysgYi9PYmplY3RzL2NsaW5pYy9ieXRlYXJyYXlvYmplY3QuYy5oCkBAIC0zOSw0NSArMzksMzggQEAKIH0KIAogUHlEb2NfU1RSVkFSKGJ5dGVhcnJheV90cmFuc2xhdGVfX2RvY19fLAotInRyYW5zbGF0ZSh0YWJsZSwgW2RlbGV0ZWNoYXJzXSlcbiIKKyJ0cmFuc2xhdGUoJHNlbGYsIHRhYmxlLCAvLCBkZWxldGU9YlwnXCcpXG4iCisiLS1cbiIKKyJcbiIKICJSZXR1cm4gYSBjb3B5IHdpdGggZWFjaCBjaGFyYWN0ZXIgbWFwcGVkIGJ5IHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS5cbiIKICJcbiIKICIgIHRhYmxlXG4iCiAiICAgIFRyYW5zbGF0aW9uIHRhYmxlLCB3aGljaCBtdXN0IGJlIGEgYnl0ZXMgb2JqZWN0IG9mIGxlbmd0aCAyNTYuXG4iCiAiXG4iCi0iQWxsIGNoYXJhY3RlcnMgb2NjdXJyaW5nIGluIHRoZSBvcHRpb25hbCBhcmd1bWVudCBkZWxldGVjaGFycyBhcmUgcmVtb3ZlZC5cbiIKKyJBbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcgaW4gdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGRlbGV0ZSBhcmUgcmVtb3ZlZC5cbiIKICJUaGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS4iKTsKIAogI2RlZmluZSBCWVRFQVJSQVlfVFJBTlNMQVRFX01FVEhPRERFRiAgICBcCi0gICAgeyJ0cmFuc2xhdGUiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X3RyYW5zbGF0ZSwgTUVUSF9WQVJBUkdTLCBieXRlYXJyYXlfdHJhbnNsYXRlX19kb2NfX30sCisgICAgeyJ0cmFuc2xhdGUiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X3RyYW5zbGF0ZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJ5dGVhcnJheV90cmFuc2xhdGVfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV90cmFuc2xhdGVfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncm91cF9yaWdodF8xLCBQeU9iamVjdCAqZGVsZXRlY2hhcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpkZWxldGVjaGFycyk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlYXJyYXlfdHJhbnNsYXRlKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK2J5dGVhcnJheV90cmFuc2xhdGUoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7IiIsICJkZWxldGUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfE86dHJhbnNsYXRlIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqdGFibGU7Ci0gICAgaW50IGdyb3VwX3JpZ2h0XzEgPSAwOwogICAgIFB5T2JqZWN0ICpkZWxldGVjaGFycyA9IE5VTEw7CiAKLSAgICBzd2l0Y2ggKFB5VHVwbGVfR0VUX1NJWkUoYXJncykpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOnRyYW5zbGF0ZSIsICZ0YWJsZSkpCi0gICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT086dHJhbnNsYXRlIiwgJnRhYmxlLCAmZGVsZXRlY2hhcnMpKQotICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgIGdyb3VwX3JpZ2h0XzEgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnl0ZWFycmF5LnRyYW5zbGF0ZSByZXF1aXJlcyAxIHRvIDIgYXJndW1lbnRzIik7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmdGFibGUsICZkZWxldGVjaGFycykpIHsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KLSAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfdHJhbnNsYXRlX2ltcGwoc2VsZiwgdGFibGUsIGdyb3VwX3JpZ2h0XzEsIGRlbGV0ZWNoYXJzKTsKKyAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfdHJhbnNsYXRlX2ltcGwoc2VsZiwgdGFibGUsIGRlbGV0ZWNoYXJzKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwpAQCAtMTA4LDE3ICsxMDEsMjAgQEAKICAgICBQeV9idWZmZXIgdG8gPSB7TlVMTCwgTlVMTH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqeSo6bWFrZXRyYW5zIiwKLSAgICAgICAgJmZybSwgJnRvKSkKKyAgICAgICAgJmZybSwgJnRvKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9tYWtldHJhbnNfaW1wbCgmZnJtLCAmdG8pOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZybSAqLwotICAgIGlmIChmcm0ub2JqKQorICAgIGlmIChmcm0ub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJtKTsKKyAgICB9CiAgICAgLyogQ2xlYW51cCBmb3IgdG8gKi8KLSAgICBpZiAodG8ub2JqKQorICAgIGlmICh0by5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ0byk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE1MiwxNyArMTQ4LDIwIEBACiAgICAgUHlfc3NpemVfdCBjb3VudCA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnkqfG46cmVwbGFjZSIsCi0gICAgICAgICZvbGQsICZuZXcsICZjb3VudCkpCisgICAgICAgICZvbGQsICZuZXcsICZjb3VudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfcmVwbGFjZV9pbXBsKHNlbGYsICZvbGQsICZuZXcsIGNvdW50KTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBvbGQgKi8KLSAgICBpZiAob2xkLm9iaikKKyAgICBpZiAob2xkLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJm9sZCk7CisgICAgfQogICAgIC8qIENsZWFudXAgZm9yIG5ldyAqLwotICAgIGlmIChuZXcub2JqKQorICAgIGlmIChuZXcub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmbmV3KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTkyLDEzICsxOTEsMTUgQEAKIGJ5dGVhcnJheV9zcGxpdChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzZXAiLCAibWF4c3BsaXQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzZXAiLCAibWF4c3BsaXQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T246c3BsaXQiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzZXAgPSBQeV9Ob25lOwogICAgIFB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbjpzcGxpdCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnNlcCwgJm1heHNwbGl0KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzZXAsICZtYXhzcGxpdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfc3BsaXRfaW1wbChzZWxmLCBzZXAsIG1heHNwbGl0KTsKIAogZXhpdDoKQEAgLTI2NCwxMyArMjY1LDE1IEBACiBieXRlYXJyYXlfcnNwbGl0KFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InNlcCIsICJtYXhzcGxpdCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InNlcCIsICJtYXhzcGxpdCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPbjpyc3BsaXQiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzZXAgPSBQeV9Ob25lOwogICAgIFB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbjpyc3BsaXQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzZXAsICZtYXhzcGxpdCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X3JzcGxpdF9pbXBsKHNlbGYsIHNlcCwgbWF4c3BsaXQpOwogCiBleGl0OgpAQCAtMzIwLDggKzMyMyw5IEBACiAgICAgaW50IGl0ZW07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5PJjppbnNlcnQiLAotICAgICAgICAmaW5kZXgsIF9nZXRieXRldmFsdWUsICZpdGVtKSkKKyAgICAgICAgJmluZGV4LCBfZ2V0Ynl0ZXZhbHVlLCAmaXRlbSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfaW5zZXJ0X2ltcGwoc2VsZiwgaW5kZXgsIGl0ZW0pOwogCiBleGl0OgpAQCAtMzQ5LDggKzM1Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGl0ZW07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmFwcGVuZCIsIF9nZXRieXRldmFsdWUsICZpdGVtKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmFwcGVuZCIsIF9nZXRieXRldmFsdWUsICZpdGVtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9hcHBlbmRfaW1wbChzZWxmLCBpdGVtKTsKIAogZXhpdDoKQEAgLTM5NCw4ICszOTksOSBAQAogICAgIFB5X3NzaXplX3QgaW5kZXggPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cG9wIiwKLSAgICAgICAgJmluZGV4KSkKKyAgICAgICAgJmluZGV4KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9wb3BfaW1wbChzZWxmLCBpbmRleCk7CiAKIGV4aXQ6CkBAIC00MjMsOCArNDI5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnJlbW92ZSIsIF9nZXRieXRldmFsdWUsICZ2YWx1ZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpyZW1vdmUiLCBfZ2V0Ynl0ZXZhbHVlLCAmdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X3JlbW92ZV9pbXBsKHNlbGYsIHZhbHVlKTsKIAogZXhpdDoKQEAgLTQ1Myw4ICs0NjAsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3RyaXAiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYnl0ZXMpKQorICAgICAgICAmYnl0ZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X3N0cmlwX2ltcGwoc2VsZiwgYnl0ZXMpOwogCiBleGl0OgpAQCAtNDgzLDggKzQ5MSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJsc3RyaXAiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYnl0ZXMpKQorICAgICAgICAmYnl0ZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X2xzdHJpcF9pbXBsKHNlbGYsIGJ5dGVzKTsKIAogZXhpdDoKQEAgLTUxMyw4ICs1MjIsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicnN0cmlwIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmJ5dGVzKSkKKyAgICAgICAgJmJ5dGVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9yc3RyaXBfaW1wbChzZWxmLCBieXRlcyk7CiAKIGV4aXQ6CkBAIC01NDcsMTMgKzU1NywxNSBAQAogYnl0ZWFycmF5X2RlY29kZShQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJlbmNvZGluZyIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJlbmNvZGluZyIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8c3M6ZGVjb2RlIiwgX2tleXdvcmRzLCAwfTsKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxzczpkZWNvZGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZlbmNvZGluZywgJmVycm9ycykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X2RlY29kZV9pbXBsKHNlbGYsIGVuY29kaW5nLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtNTkyLDEyICs2MDQsMTQgQEAKIGJ5dGVhcnJheV9zcGxpdGxpbmVzKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImtlZXBlbmRzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsia2VlcGVuZHMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8aTpzcGxpdGxpbmVzIiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQga2VlcGVuZHMgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifGk6c3BsaXRsaW5lcyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmtlZXBlbmRzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZrZWVwZW5kcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfc3BsaXRsaW5lc19pbXBsKHNlbGYsIGtlZXBlbmRzKTsKIAogZXhpdDoKQEAgLTYxNywxNyArNjMxLDE4IEBACiAgICAgeyJmcm9taGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9mcm9taGV4LCBNRVRIX098TUVUSF9DTEFTUywgYnl0ZWFycmF5X2Zyb21oZXhfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVhcnJheV9mcm9taGV4X2ltcGwoUHlPYmplY3QqY2xzLCBQeU9iamVjdCAqc3RyaW5nKTsKK2J5dGVhcnJheV9mcm9taGV4X2ltcGwoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqc3RyaW5nKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVhcnJheV9mcm9taGV4KFB5VHlwZU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJnKQorYnl0ZWFycmF5X2Zyb21oZXgoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJnKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpzdHJpbmc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6ZnJvbWhleCIsICZzdHJpbmcpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpmcm9taGV4IiwgJnN0cmluZykpIHsKICAgICAgICAgZ290byBleGl0OwotICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9mcm9taGV4X2ltcGwoKFB5T2JqZWN0KiljbHMsIHN0cmluZyk7CisgICAgfQorICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9mcm9taGV4X2ltcGwodHlwZSwgc3RyaW5nKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwpAQCAtNjcwLDggKzY4NSw5IEBACiAgICAgaW50IHByb3RvID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X19yZWR1Y2VfZXhfXyIsCi0gICAgICAgICZwcm90bykpCisgICAgICAgICZwcm90bykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfcmVkdWNlX2V4X2ltcGwoc2VsZiwgcHJvdG8pOwogCiBleGl0OgpAQCAtNjk1LDQgKzcxMSw0IEBACiB7CiAgICAgcmV0dXJuIGJ5dGVhcnJheV9zaXplb2ZfaW1wbChzZWxmKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05NjZjMTVmZjIyYzVlMjQzIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01OWEwYzg2YjI5ZmYwNmQxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvY2xpbmljL2J5dGVzb2JqZWN0LmMuaCBiL09iamVjdHMvY2xpbmljL2J5dGVzb2JqZWN0LmMuaAppbmRleCA1YTFhNWU5Li5mMTc5Y2U2IDEwMDY0NAotLS0gYS9PYmplY3RzL2NsaW5pYy9ieXRlc29iamVjdC5jLmgKKysrIGIvT2JqZWN0cy9jbGluaWMvYnl0ZXNvYmplY3QuYy5oCkBAIC0yMCwxOSArMjAsMjEgQEAKICAgICB7InNwbGl0IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3NwbGl0LCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYnl0ZXNfc3BsaXRfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3NwbGl0X2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KTsKK2J5dGVzX3NwbGl0X2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19zcGxpdChQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQorYnl0ZXNfc3BsaXQoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzZXAiLCAibWF4c3BsaXQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzZXAiLCAibWF4c3BsaXQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T246c3BsaXQiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzZXAgPSBQeV9Ob25lOwogICAgIFB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbjpzcGxpdCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnNlcCwgJm1heHNwbGl0KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzZXAsICZtYXhzcGxpdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlc19zcGxpdF9pbXBsKHNlbGYsIHNlcCwgbWF4c3BsaXQpOwogCiBleGl0OgpAQCAtNjQsMTQgKzY2LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIHNlcCA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6cGFydGl0aW9uIiwgJnNlcCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpwYXJ0aXRpb24iLCAmc2VwKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX3BhcnRpdGlvbl9pbXBsKHNlbGYsICZzZXApOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIHNlcCAqLwotICAgIGlmIChzZXAub2JqKQorICAgIGlmIChzZXAub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmc2VwKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTAxLDE0ICsxMDUsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgc2VwID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpycGFydGl0aW9uIiwgJnNlcCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpycGFydGl0aW9uIiwgJnNlcCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlc19ycGFydGl0aW9uX2ltcGwoc2VsZiwgJnNlcCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3Igc2VwICovCi0gICAgaWYgKHNlcC5vYmopCisgICAgaWYgKHNlcC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzZXApOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xMzMsMTkgKzEzOSwyMSBAQAogICAgIHsicnNwbGl0IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3JzcGxpdCwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJ5dGVzX3JzcGxpdF9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfcnNwbGl0X2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KTsKK2J5dGVzX3JzcGxpdF9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfcnNwbGl0KFB5Qnl0ZXNPYmplY3Qqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCitieXRlc19yc3BsaXQoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzZXAiLCAibWF4c3BsaXQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzZXAiLCAibWF4c3BsaXQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T246cnNwbGl0IiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc2VwID0gUHlfTm9uZTsKICAgICBQeV9zc2l6ZV90IG1heHNwbGl0ID0gLTE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T246cnNwbGl0IiwgX2tleXdvcmRzLAotICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnNlcCwgJm1heHNwbGl0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX3JzcGxpdF9pbXBsKHNlbGYsIHNlcCwgbWF4c3BsaXQpOwogCiBleGl0OgpAQCAtMTg5LDggKzE5Nyw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdHJpcCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZieXRlcykpCisgICAgICAgICZieXRlcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlc19zdHJpcF9pbXBsKHNlbGYsIGJ5dGVzKTsKIAogZXhpdDoKQEAgLTIxOSw4ICsyMjgsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAibHN0cmlwIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmJ5dGVzKSkKKyAgICAgICAgJmJ5dGVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX2xzdHJpcF9pbXBsKHNlbGYsIGJ5dGVzKTsKIAogZXhpdDoKQEAgLTI0OSw4ICsyNTksOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicnN0cmlwIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmJ5dGVzKSkKKyAgICAgICAgJmJ5dGVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX3JzdHJpcF9pbXBsKHNlbGYsIGJ5dGVzKTsKIAogZXhpdDoKQEAgLTI1OCw0NSArMjY5LDM4IEBACiB9CiAKIFB5RG9jX1NUUlZBUihieXRlc190cmFuc2xhdGVfX2RvY19fLAotInRyYW5zbGF0ZSh0YWJsZSwgW2RlbGV0ZWNoYXJzXSlcbiIKKyJ0cmFuc2xhdGUoJHNlbGYsIHRhYmxlLCAvLCBkZWxldGU9YlwnXCcpXG4iCisiLS1cbiIKKyJcbiIKICJSZXR1cm4gYSBjb3B5IHdpdGggZWFjaCBjaGFyYWN0ZXIgbWFwcGVkIGJ5IHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS5cbiIKICJcbiIKICIgIHRhYmxlXG4iCiAiICAgIFRyYW5zbGF0aW9uIHRhYmxlLCB3aGljaCBtdXN0IGJlIGEgYnl0ZXMgb2JqZWN0IG9mIGxlbmd0aCAyNTYuXG4iCiAiXG4iCi0iQWxsIGNoYXJhY3RlcnMgb2NjdXJyaW5nIGluIHRoZSBvcHRpb25hbCBhcmd1bWVudCBkZWxldGVjaGFycyBhcmUgcmVtb3ZlZC5cbiIKKyJBbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcgaW4gdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGRlbGV0ZSBhcmUgcmVtb3ZlZC5cbiIKICJUaGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS4iKTsKIAogI2RlZmluZSBCWVRFU19UUkFOU0xBVEVfTUVUSE9EREVGICAgIFwKLSAgICB7InRyYW5zbGF0ZSIsIChQeUNGdW5jdGlvbilieXRlc190cmFuc2xhdGUsIE1FVEhfVkFSQVJHUywgYnl0ZXNfdHJhbnNsYXRlX19kb2NfX30sCisgICAgeyJ0cmFuc2xhdGUiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfdHJhbnNsYXRlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYnl0ZXNfdHJhbnNsYXRlX19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc190cmFuc2xhdGVfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdGFibGUsIGludCBncm91cF9yaWdodF8xLAorYnl0ZXNfdHJhbnNsYXRlX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmRlbGV0ZWNoYXJzKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3RyYW5zbGF0ZShQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK2J5dGVzX3RyYW5zbGF0ZShQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyIiLCAiZGVsZXRlIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3xPOnRyYW5zbGF0ZSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnRhYmxlOwotICAgIGludCBncm91cF9yaWdodF8xID0gMDsKICAgICBQeU9iamVjdCAqZGVsZXRlY2hhcnMgPSBOVUxMOwogCi0gICAgc3dpdGNoIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzp0cmFuc2xhdGUiLCAmdGFibGUpKQotICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9POnRyYW5zbGF0ZSIsICZ0YWJsZSwgJmRlbGV0ZWNoYXJzKSkKLSAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICBncm91cF9yaWdodF8xID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ5dGVzLnRyYW5zbGF0ZSByZXF1aXJlcyAxIHRvIDIgYXJndW1lbnRzIik7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmdGFibGUsICZkZWxldGVjaGFycykpIHsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KLSAgICByZXR1cm5fdmFsdWUgPSBieXRlc190cmFuc2xhdGVfaW1wbChzZWxmLCB0YWJsZSwgZ3JvdXBfcmlnaHRfMSwgZGVsZXRlY2hhcnMpOworICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX3RyYW5zbGF0ZV9pbXBsKHNlbGYsIHRhYmxlLCBkZWxldGVjaGFycyk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKQEAgLTMyNywxNyArMzMxLDIwIEBACiAgICAgUHlfYnVmZmVyIHRvID0ge05VTEwsIE5VTEx9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnkqOm1ha2V0cmFucyIsCi0gICAgICAgICZmcm0sICZ0bykpCisgICAgICAgICZmcm0sICZ0bykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlc19tYWtldHJhbnNfaW1wbCgmZnJtLCAmdG8pOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZybSAqLwotICAgIGlmIChmcm0ub2JqKQorICAgIGlmIChmcm0ub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJtKTsKKyAgICB9CiAgICAgLyogQ2xlYW51cCBmb3IgdG8gKi8KLSAgICBpZiAodG8ub2JqKQorICAgIGlmICh0by5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ0byk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTM1OSwxMSArMzY2LDExIEBACiAgICAgeyJyZXBsYWNlIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3JlcGxhY2UsIE1FVEhfVkFSQVJHUywgYnl0ZXNfcmVwbGFjZV9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfcmVwbGFjZV9pbXBsKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgUHlfYnVmZmVyICpvbGQsIFB5X2J1ZmZlciAqbmV3LAorYnl0ZXNfcmVwbGFjZV9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5X2J1ZmZlciAqb2xkLCBQeV9idWZmZXIgKm5ldywKICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGNvdW50KTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3JlcGxhY2UoUHlCeXRlc09iamVjdCpzZWxmLCBQeU9iamVjdCAqYXJncykKK2J5dGVzX3JlcGxhY2UoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIG9sZCA9IHtOVUxMLCBOVUxMfTsKQEAgLTM3MSwxNyArMzc4LDIwIEBACiAgICAgUHlfc3NpemVfdCBjb3VudCA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnkqfG46cmVwbGFjZSIsCi0gICAgICAgICZvbGQsICZuZXcsICZjb3VudCkpCisgICAgICAgICZvbGQsICZuZXcsICZjb3VudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlc19yZXBsYWNlX2ltcGwoc2VsZiwgJm9sZCwgJm5ldywgY291bnQpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIG9sZCAqLwotICAgIGlmIChvbGQub2JqKQorICAgIGlmIChvbGQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmb2xkKTsKKyAgICB9CiAgICAgLyogQ2xlYW51cCBmb3IgbmV3ICovCi0gICAgaWYgKG5ldy5vYmopCisgICAgaWYgKG5ldy5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZuZXcpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00MDUsMjAgKzQxNSwyMiBAQAogICAgIHsiZGVjb2RlIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2RlY29kZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJ5dGVzX2RlY29kZV9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfZGVjb2RlX2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBjb25zdCBjaGFyICplbmNvZGluZywKK2J5dGVzX2RlY29kZV9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKmVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX2RlY29kZShQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQorYnl0ZXNfZGVjb2RlKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZW5jb2RpbmciLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZW5jb2RpbmciLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifHNzOmRlY29kZSIsIF9rZXl3b3JkcywgMH07CiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8c3M6ZGVjb2RlIiwgX2tleXdvcmRzLAotICAgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX2RlY29kZV9pbXBsKHNlbGYsIGVuY29kaW5nLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtNDM4LDE4ICs0NTAsMjAgQEAKICAgICB7InNwbGl0bGluZXMiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfc3BsaXRsaW5lcywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJ5dGVzX3NwbGl0bGluZXNfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3NwbGl0bGluZXNfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIGludCBrZWVwZW5kcyk7CitieXRlc19zcGxpdGxpbmVzX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgaW50IGtlZXBlbmRzKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3NwbGl0bGluZXMoUHlCeXRlc09iamVjdCpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK2J5dGVzX3NwbGl0bGluZXMoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJrZWVwZW5kcyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImtlZXBlbmRzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifGk6c3BsaXRsaW5lcyIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IGtlZXBlbmRzID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpOnNwbGl0bGluZXMiLCBfa2V5d29yZHMsCi0gICAgICAgICZrZWVwZW5kcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAma2VlcGVuZHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfc3BsaXRsaW5lc19pbXBsKHNlbGYsIGtlZXBlbmRzKTsKIAogZXhpdDoKQEAgLTQ3NywxMSArNDkxLDEyIEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnN0cmluZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpmcm9taGV4IiwgJnN0cmluZykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmZyb21oZXgiLCAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX2Zyb21oZXhfaW1wbCh0eXBlLCBzdHJpbmcpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmQwY2U4ZjI1ZDdlMThmNCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTYxOGMwNWMyNGMxZTYxNyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9PYmplY3RzL2NsaW5pYy9kaWN0b2JqZWN0LmMuaCBiL09iamVjdHMvY2xpbmljL2RpY3RvYmplY3QuYy5oCmluZGV4IDUyODhiOWEuLmQwY2RmYzMgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY2xpbmljL2RpY3RvYmplY3QuYy5oCisrKyBiL09iamVjdHMvY2xpbmljL2RpY3RvYmplY3QuYy5oCkBAIC0yMyw4ICsyMyw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJmcm9ta2V5cyIsCiAgICAgICAgIDEsIDIsCi0gICAgICAgICZpdGVyYWJsZSwgJnZhbHVlKSkKKyAgICAgICAgJml0ZXJhYmxlLCAmdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZGljdF9mcm9ta2V5c19pbXBsKHR5cGUsIGl0ZXJhYmxlLCB2YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zOSw0ICs0MCw0IEBACiAKICNkZWZpbmUgRElDVF9fX0NPTlRBSU5TX19fTUVUSE9EREVGICAgIFwKICAgICB7Il9fY29udGFpbnNfXyIsIChQeUNGdW5jdGlvbilkaWN0X19fY29udGFpbnNfXywgTUVUSF9PfE1FVEhfQ09FWElTVCwgZGljdF9fX2NvbnRhaW5zX19fX2RvY19ffSwKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mZTc0ZDY3NjMzMmZkYmE2IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05MjYzMjYxMDllM2Q5ODM5IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvY2xpbmljL3VuaWNvZGVvYmplY3QuYy5oIGIvT2JqZWN0cy9jbGluaWMvdW5pY29kZW9iamVjdC5jLmgKaW5kZXggZDQyYTcwMC4uODkxZTkwYyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jbGluaWMvdW5pY29kZW9iamVjdC5jLmgKKysrIGIvT2JqZWN0cy9jbGluaWMvdW5pY29kZW9iamVjdC5jLmgKQEAgLTMxLDExICszMSwxMiBAQAogICAgIFB5T2JqZWN0ICp6ID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xVVTptYWtldHJhbnMiLAotICAgICAgICAmeCwgJnksICZ6KSkKKyAgICAgICAgJngsICZ5LCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB1bmljb2RlX21ha2V0cmFuc19pbXBsKHgsIHksIHopOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTRhZmZkZmY1YjJkYWZmNSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NGE4NmRkMTA4ZDkyZDEwNCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9PYmplY3RzL2NvZGVvYmplY3QuYyBiL09iamVjdHMvY29kZW9iamVjdC5jCmluZGV4IDZjMGU1YmYuLmQ1MTRlYzEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY29kZW9iamVjdC5jCisrKyBiL09iamVjdHMvY29kZW9iamVjdC5jCkBAIC0xLDMgKzEsNSBAQAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKwogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgImNvZGUuaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKQEAgLTUsNiArNywxMiBAQAogI2RlZmluZSBOQU1FX0NIQVJTIFwKICAgICAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgogCisvKiBIb2xkZXIgZm9yIGNvX2V4dHJhIGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlfc3NpemVfdCBjZV9zaXplOworICAgIHZvaWQgKipjZV9leHRyYXM7Cit9IF9QeUNvZGVPYmplY3RFeHRyYTsKKwogLyogYWxsX25hbWVfY2hhcnMocyk6IHRydWUgaWZmIGFsbCBjaGFycyBpbiBzIGFyZSB2YWxpZCBOQU1FX0NIQVJTICovCiAKIHN0YXRpYyBpbnQKQEAgLTk2LDcgKzEwNCw3IEBACiAgICAgICAgIFB5X3NzaXplX3QgdG90YWxfYXJncyA9IGFyZ2NvdW50ICsga3dvbmx5YXJnY291bnQgKwogICAgICAgICAgICAgKChmbGFncyAmIENPX1ZBUkFSR1MpICE9IDApICsgKChmbGFncyAmIENPX1ZBUktFWVdPUkRTKSAhPSAwKTsKICAgICAgICAgUHlfc3NpemVfdCBhbGxvY19zaXplID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogbl9jZWxsdmFyczsKLSAgICAgICAgaW50IHVzZWRfY2VsbDJhcmcgPSAwOworICAgICAgICBib29sIHVzZWRfY2VsbDJhcmcgPSBmYWxzZTsKICAgICAgICAgY2VsbDJhcmcgPSBQeU1lbV9NQUxMT0MoYWxsb2Nfc2l6ZSk7CiAgICAgICAgIGlmIChjZWxsMmFyZyA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMDksNyArMTE3LDcgQEAKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJnID0gUHlUdXBsZV9HRVRfSVRFTSh2YXJuYW1lcywgaik7CiAgICAgICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ29tcGFyZShjZWxsLCBhcmcpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNlbGwyYXJnW2ldID0gajsKLSAgICAgICAgICAgICAgICAgICAgdXNlZF9jZWxsMmFyZyA9IDE7CisgICAgICAgICAgICAgICAgICAgIHVzZWRfY2VsbDJhcmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNTIsNiArMTYwLDcgQEAKICAgICBjby0+Y29fbG5vdGFiID0gbG5vdGFiOwogICAgIGNvLT5jb196b21iaWVmcmFtZSA9IE5VTEw7CiAgICAgY28tPmNvX3dlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICBjby0+Y29fZXh0cmEgPSBOVUxMOwogICAgIHJldHVybiBjbzsKIH0KIApAQCAtMzYxLDYgKzM3MCwyMSBAQAogc3RhdGljIHZvaWQKIGNvZGVfZGVhbGxvYyhQeUNvZGVPYmplY3QgKmNvKQogeworICAgIGlmIChjby0+Y29fZXh0cmEgIT0gTlVMTCkgeworICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgICAgICBfUHlDb2RlT2JqZWN0RXh0cmEgKmNvX2V4dHJhID0gY28tPmNvX2V4dHJhOworCisgICAgICAgIGZvciAoUHlfc3NpemVfdCBpID0gMDsgaSA8IGNvX2V4dHJhLT5jZV9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZyZWVmdW5jIGZyZWVfZXh0cmEgPSB0c3RhdGUtPmNvX2V4dHJhX2ZyZWVmdW5jc1tpXTsKKworICAgICAgICAgICAgaWYgKGZyZWVfZXh0cmEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZyZWVfZXh0cmEoY29fZXh0cmEtPmNlX2V4dHJhc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBQeU1lbV9GUkVFKGNvLT5jb19leHRyYSk7CisgICAgfQorCiAgICAgUHlfWERFQ1JFRihjby0+Y29fY29kZSk7CiAgICAgUHlfWERFQ1JFRihjby0+Y29fY29uc3RzKTsKICAgICBQeV9YREVDUkVGKGNvLT5jb19uYW1lcyk7CkBAIC02OTQsNyArNzE4LDggQEAKICAgICAgICAgYWRkciArPSAqcCsrOwogICAgICAgICBpZiAoYWRkciA+IGFkZHJxKQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGxpbmUgKz0gKnArKzsKKyAgICAgICAgbGluZSArPSAoc2lnbmVkIGNoYXIpKnA7CisgICAgICAgIHArKzsKICAgICB9CiAgICAgcmV0dXJuIGxpbmU7CiB9CkBAIC03MjksMTcgKzc1NCwxOSBAQAogICAgICAgICBpZiAoYWRkciArICpwID4gbGFzdGkpCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgYWRkciArPSAqcCsrOwotICAgICAgICBpZiAoKnApCisgICAgICAgIGlmICgoc2lnbmVkIGNoYXIpKnApCiAgICAgICAgICAgICBib3VuZHMtPmFwX2xvd2VyID0gYWRkcjsKLSAgICAgICAgbGluZSArPSAqcCsrOworICAgICAgICBsaW5lICs9IChzaWduZWQgY2hhcikqcDsKKyAgICAgICAgcCsrOwogICAgICAgICAtLXNpemU7CiAgICAgfQogCiAgICAgaWYgKHNpemUgPiAwKSB7CiAgICAgICAgIHdoaWxlICgtLXNpemUgPj0gMCkgewogICAgICAgICAgICAgYWRkciArPSAqcCsrOwotICAgICAgICAgICAgaWYgKCpwKyspCisgICAgICAgICAgICBpZiAoKHNpZ25lZCBjaGFyKSpwKQogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcCsrOwogICAgICAgICB9CiAgICAgICAgIGJvdW5kcy0+YXBfdXBwZXIgPSBhZGRyOwogICAgIH0KQEAgLTc0OSwzICs3NzYsODAgQEAKIAogICAgIHJldHVybiBsaW5lOwogfQorCisKK2ludAorX1B5Q29kZV9HZXRFeHRyYShQeU9iamVjdCAqY29kZSwgUHlfc3NpemVfdCBpbmRleCwgdm9pZCAqKmV4dHJhKQoreworICAgIGFzc2VydCgqZXh0cmEgPT0gTlVMTCk7CisKKyAgICBpZiAoIVB5Q29kZV9DaGVjayhjb2RlKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB5Q29kZU9iamVjdCAqbyA9IChQeUNvZGVPYmplY3QqKSBjb2RlOworICAgIF9QeUNvZGVPYmplY3RFeHRyYSAqY29fZXh0cmEgPSAoX1B5Q29kZU9iamVjdEV4dHJhKikgby0+Y29fZXh0cmE7CisKKworICAgIGlmIChjb19leHRyYSA9PSBOVUxMIHx8IGNvX2V4dHJhLT5jZV9zaXplIDw9IGluZGV4KSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICpleHRyYSA9IGNvX2V4dHJhLT5jZV9leHRyYXNbaW5kZXhdOworICAgIHJldHVybiAwOworfQorCisKK2ludAorX1B5Q29kZV9TZXRFeHRyYShQeU9iamVjdCAqY29kZSwgUHlfc3NpemVfdCBpbmRleCwgdm9pZCAqZXh0cmEpCit7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKKworICAgIGlmICghUHlDb2RlX0NoZWNrKGNvZGUpIHx8IGluZGV4IDwgMCB8fAorICAgICAgICAgICAgaW5kZXggPj0gdHN0YXRlLT5jb19leHRyYV91c2VyX2NvdW50KSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgUHlDb2RlT2JqZWN0ICpvID0gKFB5Q29kZU9iamVjdCopIGNvZGU7CisgICAgX1B5Q29kZU9iamVjdEV4dHJhICpjb19leHRyYSA9IChfUHlDb2RlT2JqZWN0RXh0cmEgKikgby0+Y29fZXh0cmE7CisKKyAgICBpZiAoY29fZXh0cmEgPT0gTlVMTCkgeworICAgICAgICBvLT5jb19leHRyYSA9IChfUHlDb2RlT2JqZWN0RXh0cmEqKSBQeU1lbV9NYWxsb2MoCisgICAgICAgICAgICBzaXplb2YoX1B5Q29kZU9iamVjdEV4dHJhKSk7CisgICAgICAgIGlmIChvLT5jb19leHRyYSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgY29fZXh0cmEgPSAoX1B5Q29kZU9iamVjdEV4dHJhICopIG8tPmNvX2V4dHJhOworCisgICAgICAgIGNvX2V4dHJhLT5jZV9leHRyYXMgPSBQeU1lbV9NYWxsb2MoCisgICAgICAgICAgICB0c3RhdGUtPmNvX2V4dHJhX3VzZXJfY291bnQgKiBzaXplb2Yodm9pZCopKTsKKyAgICAgICAgaWYgKGNvX2V4dHJhLT5jZV9leHRyYXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgY29fZXh0cmEtPmNlX3NpemUgPSB0c3RhdGUtPmNvX2V4dHJhX3VzZXJfY291bnQ7CisKKyAgICAgICAgZm9yIChQeV9zc2l6ZV90IGkgPSAwOyBpIDwgY29fZXh0cmEtPmNlX3NpemU7IGkrKykgeworICAgICAgICAgICAgY29fZXh0cmEtPmNlX2V4dHJhc1tpXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoY29fZXh0cmEtPmNlX3NpemUgPD0gaW5kZXgpIHsKKyAgICAgICAgY29fZXh0cmEtPmNlX2V4dHJhcyA9IFB5TWVtX1JlYWxsb2MoCisgICAgICAgICAgICBjb19leHRyYS0+Y2VfZXh0cmFzLCB0c3RhdGUtPmNvX2V4dHJhX3VzZXJfY291bnQgKiBzaXplb2Yodm9pZCopKTsKKworICAgICAgICBpZiAoY29fZXh0cmEtPmNlX2V4dHJhcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBjb19leHRyYS0+Y2Vfc2l6ZSA9IHRzdGF0ZS0+Y29fZXh0cmFfdXNlcl9jb3VudDsKKworICAgICAgICBmb3IgKFB5X3NzaXplX3QgaSA9IGNvX2V4dHJhLT5jZV9zaXplOyBpIDwgY29fZXh0cmEtPmNlX3NpemU7IGkrKykgeworICAgICAgICAgICAgY29fZXh0cmEtPmNlX2V4dHJhc1tpXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb19leHRyYS0+Y2VfZXh0cmFzW2luZGV4XSA9IGV4dHJhOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9kZXNjcm9iamVjdC5jIGIvT2JqZWN0cy9kZXNjcm9iamVjdC5jCmluZGV4IGRhNjhlM2IuLjA3NmU3NDEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGVzY3JvYmplY3QuYworKysgYi9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKQEAgLTIyLDcgKzIyLDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRlc2NyX3JlcHIoUHlEZXNjck9iamVjdCAqZGVzY3IsIGNoYXIgKmZvcm1hdCkKK2Rlc2NyX3JlcHIoUHlEZXNjck9iamVjdCAqZGVzY3IsIGNvbnN0IGNoYXIgKmZvcm1hdCkKIHsKICAgICBQeU9iamVjdCAqbmFtZSA9IE5VTEw7CiAgICAgaWYgKGRlc2NyLT5kX25hbWUgIT0gTlVMTCAmJiBQeVVuaWNvZGVfQ2hlY2soZGVzY3ItPmRfbmFtZSkpCkBAIC0yMTMsNyArMjEzLDcgQEAKIG1ldGhvZGRlc2NyX2NhbGwoUHlNZXRob2REZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKICAgICBQeV9zc2l6ZV90IGFyZ2M7Ci0gICAgUHlPYmplY3QgKnNlbGYsICpmdW5jLCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpzZWxmLCAqZnVuYywgKnJlc3VsdCwgKipzdGFjazsKIAogICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhY2NlcHRhYmxlIGFzICdzZWxmJyAqLwogICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKQEAgLTI0MiwxMyArMjQyLDggQEAKICAgICBmdW5jID0gUHlDRnVuY3Rpb25fTmV3RXgoZGVzY3ItPmRfbWV0aG9kLCBzZWxmLCBOVUxMKTsKICAgICBpZiAoZnVuYyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBhcmdjKTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFyZ3MsIGt3ZHMpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBzdGFjayA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9GYXN0Q2FsbERpY3QoZnVuYywgc3RhY2ssIGFyZ2MgLSAxLCBrd2RzKTsKICAgICBQeV9ERUNSRUYoZnVuYyk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTI1OCw3ICsyNTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2RzKQogewogICAgIFB5X3NzaXplX3QgYXJnYzsKLSAgICBQeU9iamVjdCAqc2VsZiwgKmZ1bmMsICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnNlbGYsICpmdW5jLCAqcmVzdWx0LCAqKnN0YWNrOwogCiAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFjY2VwdGFibGUgYXMgJ3NlbGYnICovCiAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwpAQCAtMjk1LDE0ICsyOTAsOSBAQAogICAgIGZ1bmMgPSBQeUNGdW5jdGlvbl9OZXdFeChkZXNjci0+ZF9tZXRob2QsIHNlbGYsIE5VTEwpOwogICAgIGlmIChmdW5jID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIGFyZ2MpOwotICAgIGlmIChhcmdzID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJncywga3dkcyk7CisgICAgc3RhY2sgPSAmUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAxKTsKKyAgICByZXN1bHQgPSBfUHlPYmplY3RfRmFzdENhbGxEaWN0KGZ1bmMsIHN0YWNrLCBhcmdjIC0gMSwga3dkcyk7CiAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0zMTAsNyArMzAwLDcgQEAKIHdyYXBwZXJkZXNjcl9jYWxsKFB5V3JhcHBlckRlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewogICAgIFB5X3NzaXplX3QgYXJnYzsKLSAgICBQeU9iamVjdCAqc2VsZiwgKmZ1bmMsICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnNlbGYsICpmdW5jLCAqcmVzdWx0LCAqKnN0YWNrOwogCiAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFjY2VwdGFibGUgYXMgJ3NlbGYnICovCiAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwpAQCAtMzM5LDEzICszMjksOSBAQAogICAgIGZ1bmMgPSBQeVdyYXBwZXJfTmV3KChQeU9iamVjdCAqKWRlc2NyLCBzZWxmKTsKICAgICBpZiAoZnVuYyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBhcmdjKTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFyZ3MsIGt3ZHMpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKKworICAgIHN0YWNrID0gJlB5VHVwbGVfR0VUX0lURU0oYXJncywgMSk7CisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0Zhc3RDYWxsRGljdChmdW5jLCBzdGFjaywgYXJnYyAtIDEsIGt3ZHMpOwogICAgIFB5X0RFQ1JFRihmdW5jKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMTAzMyw3ICsxMDE5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwcGVyX3JpY2hjb21wYXJlKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqYiwgaW50IG9wKQogewotICAgIFB5X2ludHB0cl90IHJlc3VsdDsKKyAgICBpbnRwdHJfdCByZXN1bHQ7CiAgICAgUHlPYmplY3QgKnY7CiAgICAgUHlXcmFwcGVyRGVzY3JPYmplY3QgKmFfZGVzY3IsICpiX2Rlc2NyOwogCmRpZmYgLS1naXQgYS9PYmplY3RzL2RpY3QtY29tbW9uLmggYi9PYmplY3RzL2RpY3QtY29tbW9uLmgKaW5kZXggMjkxMmViOS4uYzNiYWY1OSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9kaWN0LWNvbW1vbi5oCisrKyBiL09iamVjdHMvZGljdC1jb21tb24uaApAQCAtOCwxNSArOCw3MSBAQAogICAgIFB5T2JqZWN0ICptZV92YWx1ZTsgLyogVGhpcyBmaWVsZCBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGNvbWJpbmVkIHRhYmxlcyAqLwogfSBQeURpY3RLZXlFbnRyeTsKIAotdHlwZWRlZiBQeURpY3RLZXlFbnRyeSAqKCpkaWN0X2xvb2t1cF9mdW5jKQotKFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXksIFB5X2hhc2hfdCBoYXNoLCBQeU9iamVjdCAqKip2YWx1ZV9hZGRyKTsKKy8qIGRpY3RfbG9va3VwX2Z1bmMoKSByZXR1cm5zIGluZGV4IG9mIGVudHJ5IHdoaWNoIGNhbiBiZSB1c2VkIGxpa2UgREtfRU5UUklFUyhkaylbaW5kZXhdLgorICogLTEgd2hlbiBubyBlbnRyeSBmb3VuZCwgLTMgd2hlbiBjb21wYXJlIHJhaXNlcyBlcnJvci4KKyAqLwordHlwZWRlZiBQeV9zc2l6ZV90ICgqZGljdF9sb29rdXBfZnVuYykKKyhQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCwgUHlPYmplY3QgKioqdmFsdWVfYWRkciwKKyBQeV9zc2l6ZV90ICpoYXNocG9zKTsKIAorI2RlZmluZSBES0lYX0VNUFRZICgtMSkKKyNkZWZpbmUgREtJWF9EVU1NWSAoLTIpICAvKiBVc2VkIGludGVybmFsbHkgKi8KKyNkZWZpbmUgREtJWF9FUlJPUiAoLTMpCisKKy8qIFNlZSBkaWN0b2JqZWN0LmMgZm9yIGFjdHVhbCBsYXlvdXQgb2YgRGljdEtleXNPYmplY3QgKi8KIHN0cnVjdCBfZGljdGtleXNvYmplY3QgewogICAgIFB5X3NzaXplX3QgZGtfcmVmY250OworCisgICAgLyogU2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSAoZGtfaW5kaWNlcykuIEl0IG11c3QgYmUgYSBwb3dlciBvZiAyLiAqLwogICAgIFB5X3NzaXplX3QgZGtfc2l6ZTsKKworICAgIC8qIEZ1bmN0aW9uIHRvIGxvb2t1cCBpbiB0aGUgaGFzaCB0YWJsZSAoZGtfaW5kaWNlcyk6CisKKyAgICAgICAtIGxvb2tkaWN0KCk6IGdlbmVyYWwtcHVycG9zZSwgYW5kIG1heSByZXR1cm4gREtJWF9FUlJPUiBpZiAoYW5kCisgICAgICAgICBvbmx5IGlmKSBhIGNvbXBhcmlzb24gcmFpc2VzIGFuIGV4Y2VwdGlvbi4KKworICAgICAgIC0gbG9va2RpY3RfdW5pY29kZSgpOiBzcGVjaWFsaXplZCB0byBVbmljb2RlIHN0cmluZyBrZXlzLCBjb21wYXJpc29uIG9mCisgICAgICAgICB3aGljaCBjYW4gbmV2ZXIgcmFpc2UgYW4gZXhjZXB0aW9uOyB0aGF0IGZ1bmN0aW9uIGNhbiBuZXZlciByZXR1cm4KKyAgICAgICAgIERLSVhfRVJST1IuCisKKyAgICAgICAtIGxvb2tkaWN0X3VuaWNvZGVfbm9kdW1teSgpOiBzaW1pbGFyIHRvIGxvb2tkaWN0X3VuaWNvZGUoKSBidXQgZnVydGhlcgorICAgICAgICAgc3BlY2lhbGl6ZWQgZm9yIFVuaWNvZGUgc3RyaW5nIGtleXMgdGhhdCBjYW5ub3QgYmUgdGhlIDxkdW1teT4gdmFsdWUuCisKKyAgICAgICAtIGxvb2tkaWN0X3NwbGl0KCk6IFZlcnNpb24gb2YgbG9va2RpY3QoKSBmb3Igc3BsaXQgdGFibGVzLiAqLwogICAgIGRpY3RfbG9va3VwX2Z1bmMgZGtfbG9va3VwOworCisgICAgLyogTnVtYmVyIG9mIHVzYWJsZSBlbnRyaWVzIGluIGRrX2VudHJpZXMuCisgICAgICAgMCA8PSBka191c2FibGUgPD0gVVNBQkxFX0ZSQUNUSU9OKGRrX3NpemUpICovCiAgICAgUHlfc3NpemVfdCBka191c2FibGU7Ci0gICAgUHlEaWN0S2V5RW50cnkgZGtfZW50cmllc1sxXTsKKworICAgIC8qIE51bWJlciBvZiB1c2VkIGVudHJpZXMgaW4gZGtfZW50cmllcy4KKyAgICAgICAwIDw9IGRrX25lbnRyaWVzIDwgZGtfc2l6ZSAqLworICAgIFB5X3NzaXplX3QgZGtfbmVudHJpZXM7CisKKyAgICAvKiBBY3R1YWwgaGFzaCB0YWJsZSBvZiBka19zaXplIGVudHJpZXMuIEl0IGhvbGRzIGluZGljZXMgaW4gZGtfZW50cmllcywKKyAgICAgICBvciBES0lYX0VNUFRZKC0xKSBvciBES0lYX0RVTU1ZKC0yKS4KKworICAgICAgIEluZGljZXMgbXVzdCBiZTogMCA8PSBpbmRpY2UgPCBVU0FCTEVfRlJBQ1RJT04oZGtfc2l6ZSkuCisKKyAgICAgICBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBpbmRpY2UgZGVwZW5kcyBvbiBka19zaXplOgorCisgICAgICAgLSAxIGJ5dGUgaWYgZGtfc2l6ZSA8PSAweGZmIChjaGFyKikKKyAgICAgICAtIDIgYnl0ZXMgaWYgZGtfc2l6ZSA8PSAweGZmZmYgKGludDE2X3QqKQorICAgICAgIC0gNCBieXRlcyBpZiBka19zaXplIDw9IDB4ZmZmZmZmZmYgKGludDMyX3QqKQorICAgICAgIC0gOCBieXRlcyBvdGhlcndpc2UgKGludDY0X3QqKQorCisgICAgICAgRHluYW1pY2FsbHkgc2l6ZWQsIDggaXMgbWluaW11bS4gKi8KKyAgICB1bmlvbiB7CisgICAgICAgIGludDhfdCBhc18xWzhdOworICAgICAgICBpbnQxNl90IGFzXzJbNF07CisgICAgICAgIGludDMyX3QgYXNfNFsyXTsKKyNpZiBTSVpFT0ZfVk9JRF9QID4gNAorICAgICAgICBpbnQ2NF90IGFzXzhbMV07CisjZW5kaWYKKyAgICB9IGRrX2luZGljZXM7CisKKyAgICAvKiAiUHlEaWN0S2V5RW50cnkgZGtfZW50cmllc1tka191c2FibGVdOyIgYXJyYXkgZm9sbG93czoKKyAgICAgICBzZWUgdGhlIERLX0VOVFJJRVMoKSBtYWNybyAqLwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9PYmplY3RzL2RpY3RvYmplY3QuYyBiL09iamVjdHMvZGljdG9iamVjdC5jCmluZGV4IGUwNGFiMmIuLjQ2MWViNTcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGljdG9iamVjdC5jCisrKyBiL09iamVjdHMvZGljdG9iamVjdC5jCkBAIC0xLDQgKzEsMyBAQAotCiAvKiBEaWN0aW9uYXJ5IG9iamVjdCBpbXBsZW1lbnRhdGlvbiB1c2luZyBhIGhhc2ggdGFibGUgKi8KIAogLyogVGhlIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBhIHNlcGFyYXRlIGZpbGUsIE9iamVjdHMvZGljdG5vdGVzLnR4dCwKQEAgLTcsNjQgKzYsMTA4IEBACiAgICB0dW5pbmcgZGljdGlvbmFyaWVzLCBhbmQgc2V2ZXJhbCBpZGVhcyBmb3IgcG9zc2libGUgb3B0aW1pemF0aW9ucy4KICovCiAKKy8qIFB5RGljdEtleXNPYmplY3QKKworVGhpcyBpbXBsZW1lbnRzIHRoZSBkaWN0aW9uYXJ5J3MgaGFzaHRhYmxlLgorCitBcyBvZiBQeXRob24gMy42LCB0aGlzIGlzIGNvbXBhY3QgYW5kIG9yZGVyZWQuIEJhc2ljIGlkZWEgaXMgZGVzY3JpYmVkIGhlcmUuCitodHRwczovL21vcmVweXB5LmJsb2dzcG90LmNvbS8yMDE1LzAxL2Zhc3Rlci1tb3JlLW1lbW9yeS1lZmZpY2llbnQtYW5kLW1vcmUuaHRtbAorCitsYXlvdXQ6CisKKystLS0tLS0tLS0tLS0tLS0rCit8IGRrX3JlZmNudCAgICAgfAorfCBka19zaXplICAgICAgIHwKK3wgZGtfbG9va3VwICAgICB8Cit8IGRrX3VzYWJsZSAgICAgfAorfCBka19uZW50cmllcyAgIHwKKystLS0tLS0tLS0tLS0tLS0rCit8IGRrX2luZGljZXMgICAgfAorfCAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0rCit8IGRrX2VudHJpZXMgICAgfAorfCAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0rCisKK2RrX2luZGljZXMgaXMgYWN0dWFsIGhhc2h0YWJsZS4gIEl0IGhvbGRzIGluZGV4IGluIGVudHJpZXMsIG9yIERLSVhfRU1QVFkoLTEpCitvciBES0lYX0RVTU1ZKC0yKS4KK1NpemUgb2YgaW5kaWNlcyBpcyBka19zaXplLiAgVHlwZSBvZiBlYWNoIGluZGV4IGluIGluZGljZXMgaXMgdmFyeSBvbiBka19zaXplOgorCisqIGludDggIGZvciAgICAgICAgICBka19zaXplIDw9IDEyOAorKiBpbnQxNiBmb3IgMjU2ICAgPD0gZGtfc2l6ZSA8PSAyKioxNQorKiBpbnQzMiBmb3IgMioqMTYgPD0gZGtfc2l6ZSA8PSAyKiozMQorKiBpbnQ2NCBmb3IgMioqMzIgPD0gZGtfc2l6ZQorCitka19lbnRyaWVzIGlzIGFycmF5IG9mIFB5RGljdEtleUVudHJ5LiAgSXQncyBzaXplIGlzIFVTQUJMRV9GUkFDVElPTihka19zaXplKS4KK0RLX0VOVFJJRVMoZGspIGNhbiBiZSB1c2VkIHRvIGdldCBwb2ludGVyIHRvIGVudHJpZXMuCisKK05PVEU6IFNpbmNlIG5lZ2F0aXZlIHZhbHVlIGlzIHVzZWQgZm9yIERLSVhfRU1QVFkgYW5kIERLSVhfRFVNTVksIHR5cGUgb2YKK2RrX2luZGljZXMgZW50cnkgaXMgc2lnbmVkIGludGVnZXIgYW5kIGludDE2IGlzIHVzZWQgZm9yIHRhYmxlIHdoaWNoCitka19zaXplID09IDI1Ni4KKyovCisKIAogLyoKLVRoZXJlIGFyZSBmb3VyIGtpbmRzIG9mIHNsb3RzIGluIHRoZSB0YWJsZToKLQotMS4gVW51c2VkLiAgbWVfa2V5ID09IG1lX3ZhbHVlID09IE5VTEwKLSAgIERvZXMgbm90IGhvbGQgYW4gYWN0aXZlIChrZXksIHZhbHVlKSBwYWlyIG5vdyBhbmQgbmV2ZXIgZGlkLiAgVW51c2VkIGNhbgotICAgdHJhbnNpdGlvbiB0byBBY3RpdmUgdXBvbiBrZXkgaW5zZXJ0aW9uLiAgVGhpcyBpcyB0aGUgb25seSBjYXNlIGluIHdoaWNoCi0gICBtZV9rZXkgaXMgTlVMTCwgYW5kIGlzIGVhY2ggc2xvdCdzIGluaXRpYWwgc3RhdGUuCi0KLTIuIEFjdGl2ZS4gIG1lX2tleSAhPSBOVUxMIGFuZCBtZV9rZXkgIT0gZHVtbXkgYW5kIG1lX3ZhbHVlICE9IE5VTEwKLSAgIEhvbGRzIGFuIGFjdGl2ZSAoa2V5LCB2YWx1ZSkgcGFpci4gIEFjdGl2ZSBjYW4gdHJhbnNpdGlvbiB0byBEdW1teSBvcgotICAgUGVuZGluZyB1cG9uIGtleSBkZWxldGlvbiAoZm9yIGNvbWJpbmVkIGFuZCBzcGxpdCB0YWJsZXMgcmVzcGVjdGl2ZWx5KS4KLSAgIFRoaXMgaXMgdGhlIG9ubHkgY2FzZSBpbiB3aGljaCBtZV92YWx1ZSAhPSBOVUxMLgotCi0zLiBEdW1teS4gIG1lX2tleSA9PSBkdW1teSBhbmQgbWVfdmFsdWUgPT0gTlVMTAotICAgUHJldmlvdXNseSBoZWxkIGFuIGFjdGl2ZSAoa2V5LCB2YWx1ZSkgcGFpciwgYnV0IHRoYXQgd2FzIGRlbGV0ZWQgYW5kIGFuCi0gICBhY3RpdmUgcGFpciBoYXMgbm90IHlldCBvdmVyd3JpdHRlbiB0aGUgc2xvdC4gIER1bW15IGNhbiB0cmFuc2l0aW9uIHRvCi0gICBBY3RpdmUgdXBvbiBrZXkgaW5zZXJ0aW9uLiAgRHVtbXkgc2xvdHMgY2Fubm90IGJlIG1hZGUgVW51c2VkIGFnYWluCi0gICAoY2Fubm90IGhhdmUgbWVfa2V5IHNldCB0byBOVUxMKSwgZWxzZSB0aGUgcHJvYmUgc2VxdWVuY2UgaW4gY2FzZSBvZgotICAgY29sbGlzaW9uIHdvdWxkIGhhdmUgbm8gd2F5IHRvIGtub3cgdGhleSB3ZXJlIG9uY2UgYWN0aXZlLgotCi00LiBQZW5kaW5nLiBOb3QgeWV0IGluc2VydGVkIG9yIGRlbGV0ZWQgZnJvbSBhIHNwbGl0LXRhYmxlLgotICAga2V5ICE9IE5VTEwsIGtleSAhPSBkdW1teSBhbmQgdmFsdWUgPT0gTlVMTAotCiBUaGUgRGljdE9iamVjdCBjYW4gYmUgaW4gb25lIG9mIHR3byBmb3Jtcy4KKwogRWl0aGVyOgogICBBIGNvbWJpbmVkIHRhYmxlOgogICAgIG1hX3ZhbHVlcyA9PSBOVUxMLCBka19yZWZjbnQgPT0gMS4KICAgICBWYWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgbWVfdmFsdWUgZmllbGQgb2YgdGhlIFB5RGljdEtleXNPYmplY3QuCi0gICAgU2xvdCBraW5kIDQgaXMgbm90IGFsbG93ZWQgaS5lLgotICAgICAgICBrZXkgIT0gTlVMTCwga2V5ICE9IGR1bW15IGFuZCB2YWx1ZSA9PSBOVUxMIGlzIGlsbGVnYWwuCiBPcjoKICAgQSBzcGxpdCB0YWJsZToKICAgICBtYV92YWx1ZXMgIT0gTlVMTCwgZGtfcmVmY250ID49IDEKICAgICBWYWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgbWFfdmFsdWVzIGFycmF5LgotICAgIE9ubHkgc3RyaW5nICh1bmljb2RlKSBrZXlzIGFyZSBhbGxvd2VkLCBubyA8ZHVtbXk+IGtleXMgYXJlIHByZXNlbnQuCisgICAgT25seSBzdHJpbmcgKHVuaWNvZGUpIGtleXMgYXJlIGFsbG93ZWQuCisgICAgQWxsIGRpY3RzIHNoYXJpbmcgc2FtZSBrZXkgbXVzdCBoYXZlIHNhbWUgaW5zZXJ0aW9uIG9yZGVyLgogCi1Ob3RlOiAucG9waXRlbSgpIGFidXNlcyB0aGUgbWVfaGFzaCBmaWVsZCBvZiBhbiBVbnVzZWQgb3IgRHVtbXkgc2xvdCB0bwotaG9sZCBhIHNlYXJjaCBmaW5nZXIuICBUaGUgbWVfaGFzaCBmaWVsZCBvZiBVbnVzZWQgb3IgRHVtbXkgc2xvdHMgaGFzIG5vCi1tZWFuaW5nIG90aGVyd2lzZS4gQXMgYSBjb25zZXF1ZW5jZSBvZiB0aGlzIHBvcGl0ZW0gYWx3YXlzIGNvbnZlcnRzIHRoZSBkaWN0Ci10byB0aGUgY29tYmluZWQtdGFibGUgZm9ybS4KK1RoZXJlIGFyZSBmb3VyIGtpbmRzIG9mIHNsb3RzIGluIHRoZSB0YWJsZSAoc2xvdCBpcyBpbmRleCwgYW5kCitES19FTlRSSUVTKGtleXMpW2luZGV4XSBpZiBpbmRleCA+PSAwKToKKworMS4gVW51c2VkLiAgaW5kZXggPT0gREtJWF9FTVBUWQorICAgRG9lcyBub3QgaG9sZCBhbiBhY3RpdmUgKGtleSwgdmFsdWUpIHBhaXIgbm93IGFuZCBuZXZlciBkaWQuICBVbnVzZWQgY2FuCisgICB0cmFuc2l0aW9uIHRvIEFjdGl2ZSB1cG9uIGtleSBpbnNlcnRpb24uICBUaGlzIGlzIGVhY2ggc2xvdCdzIGluaXRpYWwgc3RhdGUuCisKKzIuIEFjdGl2ZS4gIGluZGV4ID49IDAsIG1lX2tleSAhPSBOVUxMIGFuZCBtZV92YWx1ZSAhPSBOVUxMCisgICBIb2xkcyBhbiBhY3RpdmUgKGtleSwgdmFsdWUpIHBhaXIuICBBY3RpdmUgY2FuIHRyYW5zaXRpb24gdG8gRHVtbXkgb3IKKyAgIFBlbmRpbmcgdXBvbiBrZXkgZGVsZXRpb24gKGZvciBjb21iaW5lZCBhbmQgc3BsaXQgdGFibGVzIHJlc3BlY3RpdmVseSkuCisgICBUaGlzIGlzIHRoZSBvbmx5IGNhc2UgaW4gd2hpY2ggbWVfdmFsdWUgIT0gTlVMTC4KKworMy4gRHVtbXkuICBpbmRleCA9PSBES0lYX0RVTU1ZICAoY29tYmluZWQgb25seSkKKyAgIFByZXZpb3VzbHkgaGVsZCBhbiBhY3RpdmUgKGtleSwgdmFsdWUpIHBhaXIsIGJ1dCB0aGF0IHdhcyBkZWxldGVkIGFuZCBhbgorICAgYWN0aXZlIHBhaXIgaGFzIG5vdCB5ZXQgb3ZlcndyaXR0ZW4gdGhlIHNsb3QuICBEdW1teSBjYW4gdHJhbnNpdGlvbiB0bworICAgQWN0aXZlIHVwb24ga2V5IGluc2VydGlvbi4gIER1bW15IHNsb3RzIGNhbm5vdCBiZSBtYWRlIFVudXNlZCBhZ2FpbgorICAgZWxzZSB0aGUgcHJvYmUgc2VxdWVuY2UgaW4gY2FzZSBvZiBjb2xsaXNpb24gd291bGQgaGF2ZSBubyB3YXkgdG8ga25vdworICAgdGhleSB3ZXJlIG9uY2UgYWN0aXZlLgorCis0LiBQZW5kaW5nLiBpbmRleCA+PSAwLCBrZXkgIT0gTlVMTCwgYW5kIHZhbHVlID09IE5VTEwgIChzcGxpdCBvbmx5KQorICAgTm90IHlldCBpbnNlcnRlZCBpbiBzcGxpdC10YWJsZS4KICovCiAKLS8qIFB5RGljdF9NSU5TSVpFX1NQTElUIGlzIHRoZSBtaW5pbXVtIHNpemUgb2YgYSBzcGxpdCBkaWN0aW9uYXJ5LgotICogSXQgbXVzdCBiZSBhIHBvd2VyIG9mIDIsIGFuZCBhdCBsZWFzdCA0LgotICogUmVzaXppbmcgb2Ygc3BsaXQgZGljdGlvbmFyaWVzIGlzIHZlcnkgcmFyZSwgc28gdGhlIHNhdmluZyBtZW1vcnkgaXMgbW9yZQotICogaW1wb3J0YW50IHRoYW4gdGhlIGNvc3Qgb2YgcmVzaXppbmcuCi0gKi8KLSNkZWZpbmUgUHlEaWN0X01JTlNJWkVfU1BMSVQgNAorLyoKK1ByZXNlcnZpbmcgaW5zZXJ0aW9uIG9yZGVyCiAKLS8qIFB5RGljdF9NSU5TSVpFX0NPTUJJTkVEIGlzIHRoZSBzdGFydGluZyBzaXplIGZvciBhbnkgbmV3LCBub24tc3BsaXQgZGljdC4KK0l0J3Mgc2ltcGxlIGZvciBjb21iaW5lZCB0YWJsZS4gIFNpbmNlIGRrX2VudHJpZXMgaXMgbW9zdGx5IGFwcGVuZCBvbmx5LCB3ZSBjYW4KK2dldCBpbnNlcnRpb24gb3JkZXIgYnkganVzdCBpdGVyYXRpbmcgZGtfZW50cmllcy4KKworT25lIGV4Y2VwdGlvbiBpcyAucG9waXRlbSgpLiAgSXQgcmVtb3ZlcyBsYXN0IGl0ZW0gaW4gZGtfZW50cmllcyBhbmQgZGVjcmVtZW50Citka19uZW50cmllcyB0byBhY2hpZXZlIGFtb3J0aXplZCBPKDEpLiAgU2luY2UgdGhlcmUgYXJlIERLSVhfRFVNTVkgcmVtYWlucyBpbgorZGtfaW5kaWNlcywgd2UgY2FuJ3QgaW5jcmVtZW50IGRrX3VzYWJsZSBldmVuIHRob3VnaCBka19uZW50cmllcyBpcworZGVjcmVtZW50ZWQuCisKK0luIHNwbGl0IHRhYmxlLCBpbnNlcnRpbmcgaW50byBwZW5kaW5nIGVudHJ5IGlzIGFsbG93ZWQgb25seSBmb3IgZGtfZW50cmllc1tpeF0KK3doZXJlIGl4ID09IG1wLT5tYV91c2VkLiBJbnNlcnRpbmcgaW50byBvdGhlciBpbmRleCBhbmQgZGVsZXRpbmcgaXRlbSBjYXVzZQorY29udmVydGluZyB0aGUgZGljdCB0byB0aGUgY29tYmluZWQgdGFibGUuCisqLworCisvKiBQeURpY3RfTUlOU0laRSBpcyB0aGUgc3RhcnRpbmcgc2l6ZSBmb3IgYW55IG5ldyBkaWN0LgogICogOCBhbGxvd3MgZGljdHMgd2l0aCBubyBtb3JlIHRoYW4gNSBhY3RpdmUgZW50cmllczsgZXhwZXJpbWVudHMgc3VnZ2VzdGVkCiAgKiB0aGlzIHN1ZmZpY2VzIGZvciB0aGUgbWFqb3JpdHkgb2YgZGljdHMgKGNvbnNpc3RpbmcgbW9zdGx5IG9mIHVzdWFsbHktc21hbGwKICAqIGRpY3RzIGNyZWF0ZWQgdG8gcGFzcyBrZXl3b3JkIGFyZ3VtZW50cykuCiAgKiBNYWtpbmcgdGhpcyA4LCByYXRoZXIgdGhhbiA0IHJlZHVjZXMgdGhlIG51bWJlciBvZiByZXNpemVzIGZvciBtb3N0CiAgKiBkaWN0aW9uYXJpZXMsIHdpdGhvdXQgYW55IHNpZ25pZmljYW50IGV4dHJhIG1lbW9yeSB1c2UuCiAgKi8KLSNkZWZpbmUgUHlEaWN0X01JTlNJWkVfQ09NQklORUQgOAorI2RlZmluZSBQeURpY3RfTUlOU0laRSA4CiAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJkaWN0LWNvbW1vbi5oIgpAQCAtMTc3LDQxICsyMjAsMzggQEAKIAogKi8KIAotLyogT2JqZWN0IHVzZWQgYXMgZHVtbXkga2V5IHRvIGZpbGwgZGVsZXRlZCBlbnRyaWVzCi0gKiBUaGlzIGNvdWxkIGJlIGFueSB1bmlxdWUgb2JqZWN0LAotICogdXNlIGEgY3VzdG9tIHR5cGUgaW4gb3JkZXIgdG8gbWluaW1pc2UgY291cGxpbmcuCi0qLwotc3RhdGljIFB5T2JqZWN0IF9kdW1teV9zdHJ1Y3Q7Ci0KLSNkZWZpbmUgZHVtbXkgKCZfZHVtbXlfc3RydWN0KQotCi0jaWZkZWYgUHlfUkVGX0RFQlVHCi1QeU9iamVjdCAqCi1fUHlEaWN0X0R1bW15KHZvaWQpCi17Ci0gICAgcmV0dXJuIGR1bW15OwotfQotI2VuZGlmCi0KIC8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi1zdGF0aWMgUHlEaWN0S2V5RW50cnkgKmxvb2tkaWN0KFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X2hhc2hfdCBoYXNoLCBQeU9iamVjdCAqKip2YWx1ZV9hZGRyKTsKLXN0YXRpYyBQeURpY3RLZXlFbnRyeSAqbG9va2RpY3RfdW5pY29kZShQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X2hhc2hfdCBoYXNoLCBQeU9iamVjdCAqKip2YWx1ZV9hZGRyKTsKLXN0YXRpYyBQeURpY3RLZXlFbnRyeSAqCitzdGF0aWMgUHlfc3NpemVfdCBsb29rZGljdChQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfaGFzaF90IGhhc2gsIFB5T2JqZWN0ICoqKnZhbHVlX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpoYXNocG9zKTsKK3N0YXRpYyBQeV9zc2l6ZV90IGxvb2tkaWN0X3VuaWNvZGUoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfaGFzaF90IGhhc2gsIFB5T2JqZWN0ICoqKnZhbHVlX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmhhc2hwb3MpOworc3RhdGljIFB5X3NzaXplX3QKIGxvb2tkaWN0X3VuaWNvZGVfbm9kdW1teShQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgIFB5X2hhc2hfdCBoYXNoLCBQeU9iamVjdCAqKip2YWx1ZV9hZGRyKTsKLXN0YXRpYyBQeURpY3RLZXlFbnRyeSAqbG9va2RpY3Rfc3BsaXQoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfaGFzaF90IGhhc2gsIFB5T2JqZWN0ICoqKnZhbHVlX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgIFB5X2hhc2hfdCBoYXNoLCBQeU9iamVjdCAqKip2YWx1ZV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmhhc2hwb3MpOworc3RhdGljIFB5X3NzaXplX3QgbG9va2RpY3Rfc3BsaXQoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X2hhc2hfdCBoYXNoLCBQeU9iamVjdCAqKip2YWx1ZV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqaGFzaHBvcyk7CiAKIHN0YXRpYyBpbnQgZGljdHJlc2l6ZShQeURpY3RPYmplY3QgKm1wLCBQeV9zc2l6ZV90IG1pbnVzZWQpOwogCi0vKiBEaWN0aW9uYXJ5IHJldXNlIHNjaGVtZSB0byBzYXZlIGNhbGxzIHRvIG1hbGxvYywgZnJlZSwgYW5kIG1lbXNldCAqLworLypHbG9iYWwgY291bnRlciB1c2VkIHRvIHNldCBtYV92ZXJzaW9uX3RhZyBmaWVsZCBvZiBkaWN0aW9uYXJ5LgorICogSXQgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHRoYXQgYSBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQgYW5kIGVhY2gKKyAqIHRpbWUgdGhhdCBhIGRpY3Rpb25hcnkgaXMgbW9kaWZpZWQuICovCitzdGF0aWMgdWludDY0X3QgcHlkaWN0X2dsb2JhbF92ZXJzaW9uID0gMDsKKworI2RlZmluZSBESUNUX05FWFRfVkVSU0lPTigpICgrK3B5ZGljdF9nbG9iYWxfdmVyc2lvbikKKworLyogRGljdGlvbmFyeSByZXVzZSBzY2hlbWUgdG8gc2F2ZSBjYWxscyB0byBtYWxsb2MgYW5kIGZyZWUgKi8KICNpZm5kZWYgUHlEaWN0X01BWEZSRUVMSVNUCiAjZGVmaW5lIFB5RGljdF9NQVhGUkVFTElTVCA4MAogI2VuZGlmCiBzdGF0aWMgUHlEaWN0T2JqZWN0ICpmcmVlX2xpc3RbUHlEaWN0X01BWEZSRUVMSVNUXTsKIHN0YXRpYyBpbnQgbnVtZnJlZSA9IDA7CitzdGF0aWMgUHlEaWN0S2V5c09iamVjdCAqa2V5c19mcmVlX2xpc3RbUHlEaWN0X01BWEZSRUVMSVNUXTsKK3N0YXRpYyBpbnQgbnVtZnJlZWtleXMgPSAwOwogCiAjaW5jbHVkZSAiY2xpbmljL2RpY3RvYmplY3QuYy5oIgogCkBAIC0yMTksMTIgKzI1OSwxNSBAQAogUHlEaWN0X0NsZWFyRnJlZUxpc3Qodm9pZCkKIHsKICAgICBQeURpY3RPYmplY3QgKm9wOwotICAgIGludCByZXQgPSBudW1mcmVlOworICAgIGludCByZXQgPSBudW1mcmVlICsgbnVtZnJlZWtleXM7CiAgICAgd2hpbGUgKG51bWZyZWUpIHsKICAgICAgICAgb3AgPSBmcmVlX2xpc3RbLS1udW1mcmVlXTsKICAgICAgICAgYXNzZXJ0KFB5RGljdF9DaGVja0V4YWN0KG9wKSk7CiAgICAgICAgIFB5T2JqZWN0X0dDX0RlbChvcCk7CiAgICAgfQorICAgIHdoaWxlIChudW1mcmVla2V5cykgeworICAgICAgICBQeU9iamVjdF9GUkVFKGtleXNfZnJlZV9saXN0Wy0tbnVtZnJlZWtleXNdKTsKKyAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMjQzLDQwICsyODYsMTE3IEBACiAgICAgUHlEaWN0X0NsZWFyRnJlZUxpc3QoKTsKIH0KIAorI2RlZmluZSBES19TSVpFKGRrKSAoKGRrKS0+ZGtfc2l6ZSkKKyNpZiBTSVpFT0ZfVk9JRF9QID4gNAorI2RlZmluZSBES19JWFNJWkUoZGspICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKERLX1NJWkUoZGspIDw9IDB4ZmYgPyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgMSA6IERLX1NJWkUoZGspIDw9IDB4ZmZmZiA/ICAgICAgICAgICAgXAorICAgICAgICAgICAgMiA6IERLX1NJWkUoZGspIDw9IDB4ZmZmZmZmZmYgPyAgICBcCisgICAgICAgICAgICAgICAgNCA6IHNpemVvZihpbnQ2NF90KSkKKyNlbHNlCisjZGVmaW5lIERLX0lYU0laRShkaykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoREtfU0laRShkaykgPD0gMHhmZiA/ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAxIDogREtfU0laRShkaykgPD0gMHhmZmZmID8gICAgICAgICAgICBcCisgICAgICAgICAgICAyIDogc2l6ZW9mKGludDMyX3QpKQorI2VuZGlmCisjZGVmaW5lIERLX0VOVFJJRVMoZGspIFwKKyAgICAoKFB5RGljdEtleUVudHJ5KikoJihkayktPmRrX2luZGljZXMuYXNfMVtES19TSVpFKGRrKSAqIERLX0lYU0laRShkayldKSkKKwogI2RlZmluZSBES19ERUJVR19JTkNSRUYgX1B5X0lOQ19SRUZUT1RBTCBfUHlfUkVGX0RFQlVHX0NPTU1BCiAjZGVmaW5lIERLX0RFQlVHX0RFQ1JFRiBfUHlfREVDX1JFRlRPVEFMIF9QeV9SRUZfREVCVUdfQ09NTUEKIAogI2RlZmluZSBES19JTkNSRUYoZGspIChES19ERUJVR19JTkNSRUYgKysoZGspLT5ka19yZWZjbnQpCiAjZGVmaW5lIERLX0RFQ1JFRihkaykgaWYgKERLX0RFQlVHX0RFQ1JFRiAoLS0oZGspLT5ka19yZWZjbnQpID09IDApIGZyZWVfa2V5c19vYmplY3QoZGspCi0jZGVmaW5lIERLX1NJWkUoZGspICgoZGspLT5ka19zaXplKQogI2RlZmluZSBES19NQVNLKGRrKSAoKChkayktPmRrX3NpemUpLTEpCiAjZGVmaW5lIElTX1BPV0VSX09GXzIoeCkgKCgoeCkgJiAoeC0xKSkgPT0gMCkKIAorCisvKiBsb29rdXAgaW5kaWNlcy4gIHJldHVybnMgREtJWF9FTVBUWSwgREtJWF9EVU1NWSwgb3IgaXggPj0wICovCitzdGF0aWMgaW5saW5lIFB5X3NzaXplX3QKK2RrX2dldF9pbmRleChQeURpY3RLZXlzT2JqZWN0ICprZXlzLCBQeV9zc2l6ZV90IGkpCit7CisgICAgUHlfc3NpemVfdCBzID0gREtfU0laRShrZXlzKTsKKyAgICBQeV9zc2l6ZV90IGl4OworCisgICAgaWYgKHMgPD0gMHhmZikgeworICAgICAgICBpbnQ4X3QgKmluZGljZXMgPSBrZXlzLT5ka19pbmRpY2VzLmFzXzE7CisgICAgICAgIGl4ID0gaW5kaWNlc1tpXTsKKyAgICB9CisgICAgZWxzZSBpZiAocyA8PSAweGZmZmYpIHsKKyAgICAgICAgaW50MTZfdCAqaW5kaWNlcyA9IGtleXMtPmRrX2luZGljZXMuYXNfMjsKKyAgICAgICAgaXggPSBpbmRpY2VzW2ldOworICAgIH0KKyAgICBlbHNlIGlmIChzIDw9IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgaW50MzJfdCAqaW5kaWNlcyA9IGtleXMtPmRrX2luZGljZXMuYXNfNDsKKyAgICAgICAgaXggPSBpbmRpY2VzW2ldOworICAgIH0KKyNpZiBTSVpFT0ZfVk9JRF9QID4gNAorICAgIGVsc2UgeworICAgICAgICBpbnQ2NF90ICppbmRpY2VzID0ga2V5cy0+ZGtfaW5kaWNlcy5hc184OworICAgICAgICBpeCA9IGluZGljZXNbaV07CisgICAgfQorI2VuZGlmCisgICAgYXNzZXJ0KGl4ID49IERLSVhfRFVNTVkpOworICAgIHJldHVybiBpeDsKK30KKworLyogd3JpdGUgdG8gaW5kaWNlcy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGtfc2V0X2luZGV4KFB5RGljdEtleXNPYmplY3QgKmtleXMsIFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBpeCkKK3sKKyAgICBQeV9zc2l6ZV90IHMgPSBES19TSVpFKGtleXMpOworCisgICAgYXNzZXJ0KGl4ID49IERLSVhfRFVNTVkpOworCisgICAgaWYgKHMgPD0gMHhmZikgeworICAgICAgICBpbnQ4X3QgKmluZGljZXMgPSBrZXlzLT5ka19pbmRpY2VzLmFzXzE7CisgICAgICAgIGFzc2VydChpeCA8PSAweDdmKTsKKyAgICAgICAgaW5kaWNlc1tpXSA9IChjaGFyKWl4OworICAgIH0KKyAgICBlbHNlIGlmIChzIDw9IDB4ZmZmZikgeworICAgICAgICBpbnQxNl90ICppbmRpY2VzID0ga2V5cy0+ZGtfaW5kaWNlcy5hc18yOworICAgICAgICBhc3NlcnQoaXggPD0gMHg3ZmZmKTsKKyAgICAgICAgaW5kaWNlc1tpXSA9IChpbnQxNl90KWl4OworICAgIH0KKyAgICBlbHNlIGlmIChzIDw9IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgaW50MzJfdCAqaW5kaWNlcyA9IGtleXMtPmRrX2luZGljZXMuYXNfNDsKKyAgICAgICAgYXNzZXJ0KGl4IDw9IDB4N2ZmZmZmZmYpOworICAgICAgICBpbmRpY2VzW2ldID0gKGludDMyX3QpaXg7CisgICAgfQorI2lmIFNJWkVPRl9WT0lEX1AgPiA0CisgICAgZWxzZSB7CisgICAgICAgIGludDY0X3QgKmluZGljZXMgPSBrZXlzLT5ka19pbmRpY2VzLmFzXzg7CisgICAgICAgIGluZGljZXNbaV0gPSBpeDsKKyAgICB9CisjZW5kaWYKK30KKworCiAvKiBVU0FCTEVfRlJBQ1RJT04gaXMgdGhlIG1heGltdW0gZGljdGlvbmFyeSBsb2FkLgotICogQ3VycmVudGx5IHNldCB0byAoMm4rMSkvMy4gSW5jcmVhc2luZyB0aGlzIHJhdGlvIG1ha2VzIGRpY3Rpb25hcmllcyBtb3JlCi0gKiBkZW5zZSByZXN1bHRpbmcgaW4gbW9yZSBjb2xsaXNpb25zLiAgRGVjcmVhc2luZyBpdCBpbXByb3ZlcyBzcGFyc2VuZXNzCi0gKiBhdCB0aGUgZXhwZW5zZSBvZiBzcHJlYWRpbmcgZW50cmllcyBvdmVyIG1vcmUgY2FjaGUgbGluZXMgYW5kIGF0IHRoZQotICogY29zdCBvZiB0b3RhbCBtZW1vcnkgY29uc3VtZWQuCisgKiBJbmNyZWFzaW5nIHRoaXMgcmF0aW8gbWFrZXMgZGljdGlvbmFyaWVzIG1vcmUgZGVuc2UgcmVzdWx0aW5nIGluIG1vcmUKKyAqIGNvbGxpc2lvbnMuICBEZWNyZWFzaW5nIGl0IGltcHJvdmVzIHNwYXJzZW5lc3MgYXQgdGhlIGV4cGVuc2Ugb2Ygc3ByZWFkaW5nCisgKiBpbmRpY2VzIG92ZXIgbW9yZSBjYWNoZSBsaW5lcyBhbmQgYXQgdGhlIGNvc3Qgb2YgdG90YWwgbWVtb3J5IGNvbnN1bWVkLgogICoKICAqIFVTQUJMRV9GUkFDVElPTiBtdXN0IG9iZXkgdGhlIGZvbGxvd2luZzoKICAqICAgICAoMCA8IFVTQUJMRV9GUkFDVElPTihuKSA8IG4pIGZvciBhbGwgbiA+PSAyCiAgKgotICogVVNBQkxFX0ZSQUNUSU9OIHNob3VsZCBiZSB2ZXJ5IHF1aWNrIHRvIGNhbGN1bGF0ZS4KLSAqIEZyYWN0aW9ucyBhcm91bmQgNS84IHRvIDIvMyBzZWVtIHRvIHdvcmsgd2VsbCBpbiBwcmFjdGljZS4KKyAqIFVTQUJMRV9GUkFDVElPTiBzaG91bGQgYmUgcXVpY2sgdG8gY2FsY3VsYXRlLgorICogRnJhY3Rpb25zIGFyb3VuZCAxLzIgdG8gMi8zIHNlZW0gdG8gd29yayB3ZWxsIGluIHByYWN0aWNlLgogICovCisjZGVmaW5lIFVTQUJMRV9GUkFDVElPTihuKSAoKChuKSA8PCAxKS8zKQogCi0vKiBVc2UgKDJuKzEpLzMgcmF0aGVyIHRoYW4gMm4rMyBiZWNhdXNlOiBpdCBtYWtlcyBubyBkaWZmZXJlbmNlIGZvcgotICogY29tYmluZWQgdGFibGVzICh0aGUgdHdvIGZyYWN0aW9ucyByb3VuZCB0byB0aGUgc2FtZSBudW1iZXIgbiA8ICksCi0gKiBidXQgMio0LzMgaXMgMiB3aGVyZWFzICgyKjQrMSkvMyBpcyAzIHdoaWNoIHBvdGVudGlhbGx5IHNhdmVzIHF1aXRlCi0gKiBhIGxvdCBvZiBzcGFjZSBmb3Igc21hbGwsIHNwbGl0IHRhYmxlcyAqLwotI2RlZmluZSBVU0FCTEVfRlJBQ1RJT04obikgKCgoKG4pIDw8IDEpKzEpLzMpCisvKiBFU1RJTUFURV9TSVpFIGlzIHJldmVyc2UgZnVuY3Rpb24gb2YgVVNBQkxFX0ZSQUNUSU9OLgorICogVGhpcyBjYW4gYmUgdXNlZCB0byByZXNlcnZlIGVub3VnaCBzaXplIHRvIGluc2VydCBuIGVudHJpZXMgd2l0aG91dAorICogcmVzaXppbmcuCisgKi8KKyNkZWZpbmUgRVNUSU1BVEVfU0laRShuKSAgKCgobikqMykgPj4gMSkKIAotLyogQWx0ZXJuYXRpdmUgZnJhY3Rpb24gdGhhdCBpcyBvdGhlcndpc2UgY2xvc2UgZW5vdWdoIHRvICgybisxKS8zIHRvIG1ha2UKKy8qIEFsdGVybmF0aXZlIGZyYWN0aW9uIHRoYXQgaXMgb3RoZXJ3aXNlIGNsb3NlIGVub3VnaCB0byAybi8zIHRvIG1ha2UKICAqIGxpdHRsZSBkaWZmZXJlbmNlLiA4ICogMi8zID09IDggKiA1LzggPT0gNS4gMTYgKiAyLzMgPT0gMTYgKiA1LzggPT0gMTAuCiAgKiAzMiAqIDIvMyA9IDIxLCAzMiAqIDUvOCA9IDIwLgogICogSXRzIGFkdmFudGFnZSBpcyB0aGF0IGl0IGlzIGZhc3RlciB0byBjb21wdXRlIG9uIG1hY2hpbmVzIHdpdGggc2xvdyBkaXZpc2lvbi4KICAqICNkZWZpbmUgVVNBQkxFX0ZSQUNUSU9OKG4pICgoKG4pID4+IDEpICsgKChuKSA+PiAyKSAtICgobikgPj4gMykpCi0qLworICovCiAKIC8qIEdST1dUSF9SQVRFLiBHcm93dGggcmF0ZSB1cG9uIGhpdHRpbmcgbWF4aW11bSBsb2FkLgogICogQ3VycmVudGx5IHNldCB0byB1c2VkKjIgKyBjYXBhY2l0eS8yLgpAQCAtMzA0LDkgKzQyNCw5IEBACiAgICAgICAgIDEsIC8qIGRrX3NpemUgKi8KICAgICAgICAgbG9va2RpY3Rfc3BsaXQsIC8qIGRrX2xvb2t1cCAqLwogICAgICAgICAwLCAvKiBka191c2FibGUgKGltbXV0YWJsZSkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgeyAwLCAwLCAwIH0gLyogZGtfZW50cmllcyAoZW1wdHkpICovCi0gICAgICAgIH0KKyAgICAgICAgMCwgLyogZGtfbmVudHJpZXMgKi8KKyAgICAgICAgLmRrX2luZGljZXMgPSB7IC5hc18xID0ge0RLSVhfRU1QVFksIERLSVhfRU1QVFksIERLSVhfRU1QVFksIERLSVhfRU1QVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBES0lYX0VNUFRZLCBES0lYX0VNUFRZLCBES0lYX0VNUFRZLCBES0lYX0VNUFRZfX0sCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKmVtcHR5X3ZhbHVlc1sxXSA9IHsgTlVMTCB9OwpAQCAtMzE2LDQ1ICs0MzYsNjcgQEAKIHN0YXRpYyBQeURpY3RLZXlzT2JqZWN0ICpuZXdfa2V5c19vYmplY3QoUHlfc3NpemVfdCBzaXplKQogewogICAgIFB5RGljdEtleXNPYmplY3QgKmRrOwotICAgIFB5X3NzaXplX3QgaTsKLSAgICBQeURpY3RLZXlFbnRyeSAqZXAwOworICAgIFB5X3NzaXplX3QgZXMsIHVzYWJsZTsKIAotICAgIGFzc2VydChzaXplID49IFB5RGljdF9NSU5TSVpFX1NQTElUKTsKKyAgICBhc3NlcnQoc2l6ZSA+PSBQeURpY3RfTUlOU0laRSk7CiAgICAgYXNzZXJ0KElTX1BPV0VSX09GXzIoc2l6ZSkpOwotICAgIGRrID0gUHlNZW1fTUFMTE9DKHNpemVvZihQeURpY3RLZXlzT2JqZWN0KSArCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFB5RGljdEtleUVudHJ5KSAqIChzaXplLTEpKTsKLSAgICBpZiAoZGsgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHVzYWJsZSA9IFVTQUJMRV9GUkFDVElPTihzaXplKTsKKyAgICBpZiAoc2l6ZSA8PSAweGZmKSB7CisgICAgICAgIGVzID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2l6ZSA8PSAweGZmZmYpIHsKKyAgICAgICAgZXMgPSAyOworICAgIH0KKyNpZiBTSVpFT0ZfVk9JRF9QID4gNAorICAgIGVsc2UgaWYgKHNpemUgPD0gMHhmZmZmZmZmZikgeworICAgICAgICBlcyA9IDQ7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGVzID0gc2l6ZW9mKFB5X3NzaXplX3QpOworICAgIH0KKworICAgIGlmIChzaXplID09IFB5RGljdF9NSU5TSVpFICYmIG51bWZyZWVrZXlzID4gMCkgeworICAgICAgICBkayA9IGtleXNfZnJlZV9saXN0Wy0tbnVtZnJlZWtleXNdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGsgPSBQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5RGljdEtleXNPYmplY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUHlfTUVNQkVSX1NJWkUoUHlEaWN0S2V5c09iamVjdCwgZGtfaW5kaWNlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlcyAqIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoUHlEaWN0S2V5RW50cnkpICogdXNhYmxlKTsKKyAgICAgICAgaWYgKGRrID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgIH0KICAgICBES19ERUJVR19JTkNSRUYgZGstPmRrX3JlZmNudCA9IDE7CiAgICAgZGstPmRrX3NpemUgPSBzaXplOwotICAgIGRrLT5ka191c2FibGUgPSBVU0FCTEVfRlJBQ1RJT04oc2l6ZSk7Ci0gICAgZXAwID0gJmRrLT5ka19lbnRyaWVzWzBdOwotICAgIC8qIEhhc2ggdmFsdWUgb2Ygc2xvdCAwIGlzIHVzZWQgYnkgcG9waXRlbSwgc28gaXQgbXVzdCBiZSBpbml0aWFsaXplZCAqLwotICAgIGVwMC0+bWVfaGFzaCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBlcDBbaV0ubWVfa2V5ID0gTlVMTDsKLSAgICAgICAgZXAwW2ldLm1lX3ZhbHVlID0gTlVMTDsKLSAgICB9CisgICAgZGstPmRrX3VzYWJsZSA9IHVzYWJsZTsKICAgICBkay0+ZGtfbG9va3VwID0gbG9va2RpY3RfdW5pY29kZV9ub2R1bW15OworICAgIGRrLT5ka19uZW50cmllcyA9IDA7CisgICAgbWVtc2V0KCZkay0+ZGtfaW5kaWNlcy5hc18xWzBdLCAweGZmLCBlcyAqIHNpemUpOworICAgIG1lbXNldChES19FTlRSSUVTKGRrKSwgMCwgc2l6ZW9mKFB5RGljdEtleUVudHJ5KSAqIHVzYWJsZSk7CiAgICAgcmV0dXJuIGRrOwogfQogCiBzdGF0aWMgdm9pZAogZnJlZV9rZXlzX29iamVjdChQeURpY3RLZXlzT2JqZWN0ICprZXlzKQogewotICAgIFB5RGljdEtleUVudHJ5ICplbnRyaWVzID0gJmtleXMtPmRrX2VudHJpZXNbMF07CisgICAgUHlEaWN0S2V5RW50cnkgKmVudHJpZXMgPSBES19FTlRSSUVTKGtleXMpOwogICAgIFB5X3NzaXplX3QgaSwgbjsKLSAgICBmb3IgKGkgPSAwLCBuID0gREtfU0laRShrZXlzKTsgaSA8IG47IGkrKykgeworICAgIGZvciAoaSA9IDAsIG4gPSBrZXlzLT5ka19uZW50cmllczsgaSA8IG47IGkrKykgewogICAgICAgICBQeV9YREVDUkVGKGVudHJpZXNbaV0ubWVfa2V5KTsKICAgICAgICAgUHlfWERFQ1JFRihlbnRyaWVzW2ldLm1lX3ZhbHVlKTsKICAgICB9Ci0gICAgUHlNZW1fRlJFRShrZXlzKTsKKyAgICBpZiAoa2V5cy0+ZGtfc2l6ZSA9PSBQeURpY3RfTUlOU0laRSAmJiBudW1mcmVla2V5cyA8IFB5RGljdF9NQVhGUkVFTElTVCkgeworICAgICAgICBrZXlzX2ZyZWVfbGlzdFtudW1mcmVla2V5cysrXSA9IGtleXM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUHlPYmplY3RfRlJFRShrZXlzKTsKIH0KIAogI2RlZmluZSBuZXdfdmFsdWVzKHNpemUpIFB5TWVtX05FVyhQeU9iamVjdCAqLCBzaXplKQotCiAjZGVmaW5lIGZyZWVfdmFsdWVzKHZhbHVlcykgUHlNZW1fRlJFRSh2YWx1ZXMpCiAKIC8qIENvbnN1bWVzIGEgcmVmZXJlbmNlIHRvIHRoZSBrZXlzIG9iamVjdCAqLwpAQCAtMzgwLDYgKzUyMiw3IEBACiAgICAgbXAtPm1hX2tleXMgPSBrZXlzOwogICAgIG1wLT5tYV92YWx1ZXMgPSB2YWx1ZXM7CiAgICAgbXAtPm1hX3VzZWQgPSAwOworICAgIG1wLT5tYV92ZXJzaW9uX3RhZyA9IERJQ1RfTkVYVF9WRVJTSU9OKCk7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKW1wOwogfQogCkBAIC0zOTAsNyArNTMzLDcgQEAKICAgICBQeU9iamVjdCAqKnZhbHVlczsKICAgICBQeV9zc2l6ZV90IGksIHNpemU7CiAKLSAgICBzaXplID0gREtfU0laRShrZXlzKTsKKyAgICBzaXplID0gVVNBQkxFX0ZSQUNUSU9OKERLX1NJWkUoa2V5cykpOwogICAgIHZhbHVlcyA9IG5ld192YWx1ZXMoc2l6ZSk7CiAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKSB7CiAgICAgICAgIERLX0RFQ1JFRihrZXlzKTsKQEAgLTQwNSwxMiArNTQ4LDQzIEBACiBQeU9iamVjdCAqCiBQeURpY3RfTmV3KHZvaWQpCiB7Ci0gICAgUHlEaWN0S2V5c09iamVjdCAqa2V5cyA9IG5ld19rZXlzX29iamVjdChQeURpY3RfTUlOU0laRV9DT01CSU5FRCk7CisgICAgUHlEaWN0S2V5c09iamVjdCAqa2V5cyA9IG5ld19rZXlzX29iamVjdChQeURpY3RfTUlOU0laRSk7CiAgICAgaWYgKGtleXMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIG5ld19kaWN0KGtleXMsIE5VTEwpOwogfQogCisvKiBTZWFyY2ggaW5kZXggb2YgaGFzaCB0YWJsZSBmcm9tIG9mZnNldCBvZiBlbnRyeSB0YWJsZSAqLworc3RhdGljIFB5X3NzaXplX3QKK2xvb2tkaWN0X2luZGV4KFB5RGljdEtleXNPYmplY3QgKmssIFB5X2hhc2hfdCBoYXNoLCBQeV9zc2l6ZV90IGluZGV4KQoreworICAgIHNpemVfdCBpLCBwZXJ0dXJiOworICAgIHNpemVfdCBtYXNrID0gREtfTUFTSyhrKTsKKyAgICBQeV9zc2l6ZV90IGl4OworCisgICAgaSA9IChzaXplX3QpaGFzaCAmIG1hc2s7CisgICAgaXggPSBka19nZXRfaW5kZXgoaywgaSk7CisgICAgaWYgKGl4ID09IGluZGV4KSB7CisgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICBpZiAoaXggPT0gREtJWF9FTVBUWSkgeworICAgICAgICByZXR1cm4gREtJWF9FTVBUWTsKKyAgICB9CisKKyAgICBmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKKyAgICAgICAgaSA9IG1hc2sgJiAoKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDEpOworICAgICAgICBpeCA9IGRrX2dldF9pbmRleChrLCBpKTsKKyAgICAgICAgaWYgKGl4ID09IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXggPT0gREtJWF9FTVBUWSkgeworICAgICAgICAgICAgcmV0dXJuIERLSVhfRU1QVFk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KDApOyAgICAgICAgICAvKiBOT1QgUkVBQ0hFRCAqLworICAgIHJldHVybiBES0lYX0VSUk9SOworfQorCiAvKgogVGhlIGJhc2ljIGxvb2t1cCBmdW5jdGlvbiB1c2VkIGJ5IGFsbCBvcGVyYXRpb25zLgogVGhpcyBpcyBiYXNlZCBvbiBBbGdvcml0aG0gRCBmcm9tIEtudXRoIFZvbC4gMywgU2VjLiA2LjQuCkBAIC00MjYsNTIgKzYwMCw2MyBAQAogY29udHJpYnV0aW9ucyBieSBSZWltZXIgQmVocmVuZHMsIEp5cmtpIEFsYWt1aWphbGEsIFZsYWRpbWlyIE1hcmFuZ296b3YgYW5kCiBDaHJpc3RpYW4gVGlzbWVyLgogCi1sb29rZGljdCgpIGlzIGdlbmVyYWwtcHVycG9zZSwgYW5kIG1heSByZXR1cm4gTlVMTCBpZiAoYW5kIG9ubHkgaWYpIGEKLWNvbXBhcmlzb24gcmFpc2VzIGFuIGV4Y2VwdGlvbiAodGhpcyB3YXMgbmV3IGluIFB5dGhvbiAyLjUpLgorbG9va2RpY3QoKSBpcyBnZW5lcmFsLXB1cnBvc2UsIGFuZCBtYXkgcmV0dXJuIERLSVhfRVJST1IgaWYgKGFuZCBvbmx5IGlmKSBhCitjb21wYXJpc29uIHJhaXNlcyBhbiBleGNlcHRpb24uCiBsb29rZGljdF91bmljb2RlKCkgYmVsb3cgaXMgc3BlY2lhbGl6ZWQgdG8gc3RyaW5nIGtleXMsIGNvbXBhcmlzb24gb2Ygd2hpY2ggY2FuCi1uZXZlciByYWlzZSBhbiBleGNlcHRpb247IHRoYXQgZnVuY3Rpb24gY2FuIG5ldmVyIHJldHVybiBOVUxMLgorbmV2ZXIgcmFpc2UgYW4gZXhjZXB0aW9uOyB0aGF0IGZ1bmN0aW9uIGNhbiBuZXZlciByZXR1cm4gREtJWF9FUlJPUi4KIGxvb2tkaWN0X3VuaWNvZGVfbm9kdW1teSBpcyBmdXJ0aGVyIHNwZWNpYWxpemVkIGZvciBzdHJpbmcga2V5cyB0aGF0IGNhbm5vdCBiZQogdGhlIDxkdW1teT4gdmFsdWUuCi1Gb3IgYm90aCwgd2hlbiB0aGUga2V5IGlzbid0IGZvdW5kIGEgUHlEaWN0RW50cnkqIGlzIHJldHVybmVkCi13aGVyZSB0aGUga2V5IHdvdWxkIGhhdmUgYmVlbiBmb3VuZCwgKnZhbHVlX2FkZHIgcG9pbnRzIHRvIHRoZSBtYXRjaGluZyB2YWx1ZQotc2xvdC4KK0ZvciBib3RoLCB3aGVuIHRoZSBrZXkgaXNuJ3QgZm91bmQgYSBES0lYX0VNUFRZIGlzIHJldHVybmVkLiBoYXNocG9zIHJldHVybnMKK3doZXJlIHRoZSBrZXkgaW5kZXggc2hvdWxkIGJlIGluc2VydGVkLgogKi8KLXN0YXRpYyBQeURpY3RLZXlFbnRyeSAqCitzdGF0aWMgUHlfc3NpemVfdAogbG9va2RpY3QoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwKLSAgICAgICAgIFB5X2hhc2hfdCBoYXNoLCBQeU9iamVjdCAqKip2YWx1ZV9hZGRyKQorICAgICAgICAgUHlfaGFzaF90IGhhc2gsIFB5T2JqZWN0ICoqKnZhbHVlX2FkZHIsIFB5X3NzaXplX3QgKmhhc2hwb3MpCiB7Ci0gICAgc2l6ZV90IGk7Ci0gICAgc2l6ZV90IHBlcnR1cmI7Ci0gICAgUHlEaWN0S2V5RW50cnkgKmZyZWVzbG90OwotICAgIHNpemVfdCBtYXNrOwotICAgIFB5RGljdEtleUVudHJ5ICplcDA7Ci0gICAgUHlEaWN0S2V5RW50cnkgKmVwOworICAgIHNpemVfdCBpLCBwZXJ0dXJiLCBtYXNrOworICAgIFB5X3NzaXplX3QgaXgsIGZyZWVzbG90OwogICAgIGludCBjbXA7CisgICAgUHlEaWN0S2V5c09iamVjdCAqZGs7CisgICAgUHlEaWN0S2V5RW50cnkgKmVwMCwgKmVwOwogICAgIFB5T2JqZWN0ICpzdGFydGtleTsKIAogdG9wOgotICAgIG1hc2sgPSBES19NQVNLKG1wLT5tYV9rZXlzKTsKLSAgICBlcDAgPSAmbXAtPm1hX2tleXMtPmRrX2VudHJpZXNbMF07CisgICAgZGsgPSBtcC0+bWFfa2V5czsKKyAgICBtYXNrID0gREtfTUFTSyhkayk7CisgICAgZXAwID0gREtfRU5UUklFUyhkayk7CiAgICAgaSA9IChzaXplX3QpaGFzaCAmIG1hc2s7Ci0gICAgZXAgPSAmZXAwW2ldOwotICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwgfHwgZXAtPm1lX2tleSA9PSBrZXkpIHsKLSAgICAgICAgKnZhbHVlX2FkZHIgPSAmZXAtPm1lX3ZhbHVlOwotICAgICAgICByZXR1cm4gZXA7CisKKyAgICBpeCA9IGRrX2dldF9pbmRleChkaywgaSk7CisgICAgaWYgKGl4ID09IERLSVhfRU1QVFkpIHsKKyAgICAgICAgaWYgKGhhc2hwb3MgIT0gTlVMTCkKKyAgICAgICAgICAgICpoYXNocG9zID0gaTsKKyAgICAgICAgKnZhbHVlX2FkZHIgPSBOVUxMOworICAgICAgICByZXR1cm4gREtJWF9FTVBUWTsKICAgICB9Ci0gICAgaWYgKGVwLT5tZV9rZXkgPT0gZHVtbXkpCi0gICAgICAgIGZyZWVzbG90ID0gZXA7CisgICAgaWYgKGl4ID09IERLSVhfRFVNTVkpIHsKKyAgICAgICAgZnJlZXNsb3QgPSBpOworICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgaWYgKGVwLT5tZV9oYXNoID09IGhhc2gpIHsKKyAgICAgICAgZXAgPSAmZXAwW2l4XTsKKyAgICAgICAgaWYgKGVwLT5tZV9rZXkgPT0ga2V5KSB7CisgICAgICAgICAgICAqdmFsdWVfYWRkciA9ICZlcC0+bWVfdmFsdWU7CisgICAgICAgICAgICBpZiAoaGFzaHBvcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICpoYXNocG9zID0gaTsKKyAgICAgICAgICAgIHJldHVybiBpeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXAtPm1lX2tleSAhPSBOVUxMICYmIGVwLT5tZV9oYXNoID09IGhhc2gpIHsKICAgICAgICAgICAgIHN0YXJ0a2V5ID0gZXAtPm1lX2tleTsKICAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CiAgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOwogICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKICAgICAgICAgICAgIGlmIChjbXAgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgaWYgKGVwMCA9PSBtcC0+bWFfa2V5cy0+ZGtfZW50cmllcyAmJiBlcC0+bWVfa2V5ID09IHN0YXJ0a2V5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERLSVhfRVJST1I7CisgICAgICAgICAgICBpZiAoZGsgPT0gbXAtPm1hX2tleXMgJiYgZXAtPm1lX2tleSA9PSBzdGFydGtleSkgewogICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICp2YWx1ZV9hZGRyID0gJmVwLT5tZV92YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwOworICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaHBvcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgKmhhc2hwb3MgPSBpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXg7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CkBAIC00NzksNDAgKzY2NCw0OCBAQAogICAgICAgICAgICAgICAgIGdvdG8gdG9wOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGZyZWVzbG90ID0gTlVMTDsKKyAgICAgICAgZnJlZXNsb3QgPSAtMTsKICAgICB9CiAKLSAgICAvKiBJbiB0aGUgbG9vcCwgbWVfa2V5ID09IGR1bW15IGlzIGJ5IGZhciAoZmFjdG9yIG9mIDEwMHMpIHRoZQotICAgICAgIGxlYXN0IGxpa2VseSBvdXRjb21lLCBzbyB0ZXN0IGZvciB0aGF0IGxhc3QuICovCiAgICAgZm9yIChwZXJ0dXJiID0gaGFzaDsgOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7Ci0gICAgICAgIGkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKLSAgICAgICAgZXAgPSAmZXAwW2kgJiBtYXNrXTsKLSAgICAgICAgaWYgKGVwLT5tZV9rZXkgPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKGZyZWVzbG90ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqdmFsdWVfYWRkciA9ICZlcC0+bWVfdmFsdWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqdmFsdWVfYWRkciA9ICZmcmVlc2xvdC0+bWVfdmFsdWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZyZWVzbG90OworICAgICAgICBpID0gKChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxKSAmIG1hc2s7CisgICAgICAgIGl4ID0gZGtfZ2V0X2luZGV4KGRrLCBpKTsKKyAgICAgICAgaWYgKGl4ID09IERLSVhfRU1QVFkpIHsKKyAgICAgICAgICAgIGlmIChoYXNocG9zICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqaGFzaHBvcyA9IChmcmVlc2xvdCA9PSAtMSkgPyAoUHlfc3NpemVfdClpIDogZnJlZXNsb3Q7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAqdmFsdWVfYWRkciA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gaXg7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGl4ID09IERLSVhfRFVNTVkpIHsKKyAgICAgICAgICAgIGlmIChmcmVlc2xvdCA9PSAtMSkKKyAgICAgICAgICAgICAgICBmcmVlc2xvdCA9IGk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlcCA9ICZlcDBbaXhdOwogICAgICAgICBpZiAoZXAtPm1lX2tleSA9PSBrZXkpIHsKKyAgICAgICAgICAgIGlmIChoYXNocG9zICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqaGFzaHBvcyA9IGk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAqdmFsdWVfYWRkciA9ICZlcC0+bWVfdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gZXA7CisgICAgICAgICAgICByZXR1cm4gaXg7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGVwLT5tZV9oYXNoID09IGhhc2ggJiYgZXAtPm1lX2tleSAhPSBkdW1teSkgeworICAgICAgICBpZiAoZXAtPm1lX2hhc2ggPT0gaGFzaCAmJiBlcC0+bWVfa2V5ICE9IE5VTEwpIHsKICAgICAgICAgICAgIHN0YXJ0a2V5ID0gZXAtPm1lX2tleTsKICAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CiAgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOwogICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKICAgICAgICAgICAgIGlmIChjbXAgPCAwKSB7CiAgICAgICAgICAgICAgICAgKnZhbHVlX2FkZHIgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBES0lYX0VSUk9SOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVwMCA9PSBtcC0+bWFfa2V5cy0+ZGtfZW50cmllcyAmJiBlcC0+bWVfa2V5ID09IHN0YXJ0a2V5KSB7CisgICAgICAgICAgICBpZiAoZGsgPT0gbXAtPm1hX2tleXMgJiYgZXAtPm1lX2tleSA9PSBzdGFydGtleSkgewogICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXNocG9zICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpoYXNocG9zID0gaTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAqdmFsdWVfYWRkciA9ICZlcC0+bWVfdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl4OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewpAQCAtNTIwLDcyICs3MTMsODAgQEAKICAgICAgICAgICAgICAgICBnb3RvIHRvcDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlcC0+bWVfa2V5ID09IGR1bW15ICYmIGZyZWVzbG90ID09IE5VTEwpCi0gICAgICAgICAgICBmcmVlc2xvdCA9IGVwOwogICAgIH0KICAgICBhc3NlcnQoMCk7ICAgICAgICAgIC8qIE5PVCBSRUFDSEVEICovCiAgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFNwZWNpYWxpemVkIHZlcnNpb24gZm9yIHN0cmluZy1vbmx5IGtleXMgKi8KLXN0YXRpYyBQeURpY3RLZXlFbnRyeSAqCitzdGF0aWMgUHlfc3NpemVfdAogbG9va2RpY3RfdW5pY29kZShQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LAotICAgICAgICAgICAgICAgICBQeV9oYXNoX3QgaGFzaCwgUHlPYmplY3QgKioqdmFsdWVfYWRkcikKKyAgICAgICAgICAgICAgICAgUHlfaGFzaF90IGhhc2gsIFB5T2JqZWN0ICoqKnZhbHVlX2FkZHIsIFB5X3NzaXplX3QgKmhhc2hwb3MpCiB7Ci0gICAgc2l6ZV90IGk7Ci0gICAgc2l6ZV90IHBlcnR1cmI7Ci0gICAgUHlEaWN0S2V5RW50cnkgKmZyZWVzbG90OworICAgIHNpemVfdCBpLCBwZXJ0dXJiOwogICAgIHNpemVfdCBtYXNrID0gREtfTUFTSyhtcC0+bWFfa2V5cyk7Ci0gICAgUHlEaWN0S2V5RW50cnkgKmVwMCA9ICZtcC0+bWFfa2V5cy0+ZGtfZW50cmllc1swXTsKLSAgICBQeURpY3RLZXlFbnRyeSAqZXA7CisgICAgUHlfc3NpemVfdCBpeCwgZnJlZXNsb3Q7CisgICAgUHlEaWN0S2V5RW50cnkgKmVwLCAqZXAwID0gREtfRU5UUklFUyhtcC0+bWFfa2V5cyk7CiAKKyAgICBhc3NlcnQobXAtPm1hX3ZhbHVlcyA9PSBOVUxMKTsKICAgICAvKiBNYWtlIHN1cmUgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgdG8gaGFuZGxlIG5vbi11bmljb2RlIGtleXMsCiAgICAgICAgaW5jbHVkaW5nIHN1YmNsYXNzZXMgb2Ygc3RyOyBlLmcuLCBvbmUgcmVhc29uIHRvIHN1YmNsYXNzCiAgICAgICAgdW5pY29kZXMgaXMgdG8gb3ZlcnJpZGUgX19lcV9fLCBhbmQgZm9yIHNwZWVkIHdlIGRvbid0IGNhdGVyIHRvCiAgICAgICAgdGhhdCBoZXJlLiAqLwogICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSkgewogICAgICAgICBtcC0+bWFfa2V5cy0+ZGtfbG9va3VwID0gbG9va2RpY3Q7Ci0gICAgICAgIHJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoLCB2YWx1ZV9hZGRyKTsKKyAgICAgICAgcmV0dXJuIGxvb2tkaWN0KG1wLCBrZXksIGhhc2gsIHZhbHVlX2FkZHIsIGhhc2hwb3MpOwogICAgIH0KICAgICBpID0gKHNpemVfdCloYXNoICYgbWFzazsKLSAgICBlcCA9ICZlcDBbaV07Ci0gICAgaWYgKGVwLT5tZV9rZXkgPT0gTlVMTCB8fCBlcC0+bWVfa2V5ID09IGtleSkgewotICAgICAgICAqdmFsdWVfYWRkciA9ICZlcC0+bWVfdmFsdWU7Ci0gICAgICAgIHJldHVybiBlcDsKKyAgICBpeCA9IGRrX2dldF9pbmRleChtcC0+bWFfa2V5cywgaSk7CisgICAgaWYgKGl4ID09IERLSVhfRU1QVFkpIHsKKyAgICAgICAgaWYgKGhhc2hwb3MgIT0gTlVMTCkKKyAgICAgICAgICAgICpoYXNocG9zID0gaTsKKyAgICAgICAgKnZhbHVlX2FkZHIgPSBOVUxMOworICAgICAgICByZXR1cm4gREtJWF9FTVBUWTsKICAgICB9Ci0gICAgaWYgKGVwLT5tZV9rZXkgPT0gZHVtbXkpCi0gICAgICAgIGZyZWVzbG90ID0gZXA7CisgICAgaWYgKGl4ID09IERLSVhfRFVNTVkpIHsKKyAgICAgICAgZnJlZXNsb3QgPSBpOworICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgaWYgKGVwLT5tZV9oYXNoID09IGhhc2ggJiYgdW5pY29kZV9lcShlcC0+bWVfa2V5LCBrZXkpKSB7CisgICAgICAgIGVwID0gJmVwMFtpeF07CisgICAgICAgIC8qIG9ubHkgc3BsaXQgdGFibGUgY2FuIGJlIGl4ICE9IERLSVhfRFVNTVkgJiYgbWVfa2V5ID09IE5VTEwgKi8KKyAgICAgICAgYXNzZXJ0KGVwLT5tZV9rZXkgIT0gTlVMTCk7CisgICAgICAgIGlmIChlcC0+bWVfa2V5ID09IGtleSB8fCAoZXAtPm1lX2hhc2ggPT0gaGFzaCAmJiB1bmljb2RlX2VxKGVwLT5tZV9rZXksIGtleSkpKSB7CisgICAgICAgICAgICBpZiAoaGFzaHBvcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICpoYXNocG9zID0gaTsKICAgICAgICAgICAgICp2YWx1ZV9hZGRyID0gJmVwLT5tZV92YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBlcDsKKyAgICAgICAgICAgIHJldHVybiBpeDsKICAgICAgICAgfQotICAgICAgICBmcmVlc2xvdCA9IE5VTEw7CisgICAgICAgIGZyZWVzbG90ID0gLTE7CiAgICAgfQogCi0gICAgLyogSW4gdGhlIGxvb3AsIG1lX2tleSA9PSBkdW1teSBpcyBieSBmYXIgKGZhY3RvciBvZiAxMDBzKSB0aGUKLSAgICAgICBsZWFzdCBsaWtlbHkgb3V0Y29tZSwgc28gdGVzdCBmb3IgdGhhdCBsYXN0LiAqLwogICAgIGZvciAocGVydHVyYiA9IGhhc2g7IDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgewotICAgICAgICBpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7Ci0gICAgICAgIGVwID0gJmVwMFtpICYgbWFza107Ci0gICAgICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChmcmVlc2xvdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKnZhbHVlX2FkZHIgPSAmZXAtPm1lX3ZhbHVlOwotICAgICAgICAgICAgICAgIHJldHVybiBlcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnZhbHVlX2FkZHIgPSAmZnJlZXNsb3QtPm1lX3ZhbHVlOwotICAgICAgICAgICAgICAgIHJldHVybiBmcmVlc2xvdDsKKyAgICAgICAgaSA9IG1hc2sgJiAoKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDEpOworICAgICAgICBpeCA9IGRrX2dldF9pbmRleChtcC0+bWFfa2V5cywgaSk7CisgICAgICAgIGlmIChpeCA9PSBES0lYX0VNUFRZKSB7CisgICAgICAgICAgICBpZiAoaGFzaHBvcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKmhhc2hwb3MgPSAoZnJlZXNsb3QgPT0gLTEpID8gKFB5X3NzaXplX3QpaSA6IGZyZWVzbG90OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgKnZhbHVlX2FkZHIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIERLSVhfRU1QVFk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGl4ID09IERLSVhfRFVNTVkpIHsKKyAgICAgICAgICAgIGlmIChmcmVlc2xvdCA9PSAtMSkKKyAgICAgICAgICAgICAgICBmcmVlc2xvdCA9IGk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlcCA9ICZlcDBbaXhdOwogICAgICAgICBpZiAoZXAtPm1lX2tleSA9PSBrZXkKICAgICAgICAgICAgIHx8IChlcC0+bWVfaGFzaCA9PSBoYXNoCi0gICAgICAgICAgICAmJiBlcC0+bWVfa2V5ICE9IGR1bW15Ci0gICAgICAgICAgICAmJiB1bmljb2RlX2VxKGVwLT5tZV9rZXksIGtleSkpKSB7CisgICAgICAgICAgICAgICAgJiYgZXAtPm1lX2tleSAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgdW5pY29kZV9lcShlcC0+bWVfa2V5LCBrZXkpKSkgewogICAgICAgICAgICAgKnZhbHVlX2FkZHIgPSAmZXAtPm1lX3ZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIGVwOworICAgICAgICAgICAgaWYgKGhhc2hwb3MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpoYXNocG9zID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpeDsKICAgICAgICAgfQotICAgICAgICBpZiAoZXAtPm1lX2tleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQotICAgICAgICAgICAgZnJlZXNsb3QgPSBlcDsKICAgICB9CiAgICAgYXNzZXJ0KDApOyAgICAgICAgICAvKiBOT1QgUkVBQ0hFRCAqLwogICAgIHJldHVybiAwOwpAQCAtNTkzLDQwICs3OTQsNjIgQEAKIAogLyogRmFzdGVyIHZlcnNpb24gb2YgbG9va2RpY3RfdW5pY29kZSB3aGVuIGl0IGlzIGtub3duIHRoYXQgbm8gPGR1bW15PiBrZXlzCiAgKiB3aWxsIGJlIHByZXNlbnQuICovCi1zdGF0aWMgUHlEaWN0S2V5RW50cnkgKgorc3RhdGljIFB5X3NzaXplX3QKIGxvb2tkaWN0X3VuaWNvZGVfbm9kdW1teShQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgIFB5X2hhc2hfdCBoYXNoLCBQeU9iamVjdCAqKip2YWx1ZV9hZGRyKQorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X2hhc2hfdCBoYXNoLCBQeU9iamVjdCAqKip2YWx1ZV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmhhc2hwb3MpCiB7Ci0gICAgc2l6ZV90IGk7Ci0gICAgc2l6ZV90IHBlcnR1cmI7CisgICAgc2l6ZV90IGksIHBlcnR1cmI7CiAgICAgc2l6ZV90IG1hc2sgPSBES19NQVNLKG1wLT5tYV9rZXlzKTsKLSAgICBQeURpY3RLZXlFbnRyeSAqZXAwID0gJm1wLT5tYV9rZXlzLT5ka19lbnRyaWVzWzBdOwotICAgIFB5RGljdEtleUVudHJ5ICplcDsKKyAgICBQeV9zc2l6ZV90IGl4OworICAgIFB5RGljdEtleUVudHJ5ICplcCwgKmVwMCA9IERLX0VOVFJJRVMobXAtPm1hX2tleXMpOwogCisgICAgYXNzZXJ0KG1wLT5tYV92YWx1ZXMgPT0gTlVMTCk7CiAgICAgLyogTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBoYXZlIHRvIGhhbmRsZSBub24tdW5pY29kZSBrZXlzLAogICAgICAgIGluY2x1ZGluZyBzdWJjbGFzc2VzIG9mIHN0cjsgZS5nLiwgb25lIHJlYXNvbiB0byBzdWJjbGFzcwogICAgICAgIHVuaWNvZGVzIGlzIHRvIG92ZXJyaWRlIF9fZXFfXywgYW5kIGZvciBzcGVlZCB3ZSBkb24ndCBjYXRlciB0bwogICAgICAgIHRoYXQgaGVyZS4gKi8KICAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkpIHsKICAgICAgICAgbXAtPm1hX2tleXMtPmRrX2xvb2t1cCA9IGxvb2tkaWN0OwotICAgICAgICByZXR1cm4gbG9va2RpY3QobXAsIGtleSwgaGFzaCwgdmFsdWVfYWRkcik7CisgICAgICAgIHJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoLCB2YWx1ZV9hZGRyLCBoYXNocG9zKTsKICAgICB9CiAgICAgaSA9IChzaXplX3QpaGFzaCAmIG1hc2s7Ci0gICAgZXAgPSAmZXAwW2ldOwotICAgIGFzc2VydChlcC0+bWVfa2V5ID09IE5VTEwgfHwgUHlVbmljb2RlX0NoZWNrRXhhY3QoZXAtPm1lX2tleSkpOwotICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwgfHwgZXAtPm1lX2tleSA9PSBrZXkgfHwKKyAgICBpeCA9IGRrX2dldF9pbmRleChtcC0+bWFfa2V5cywgaSk7CisgICAgYXNzZXJ0IChpeCAhPSBES0lYX0RVTU1ZKTsKKyAgICBpZiAoaXggPT0gREtJWF9FTVBUWSkgeworICAgICAgICBpZiAoaGFzaHBvcyAhPSBOVUxMKQorICAgICAgICAgICAgKmhhc2hwb3MgPSBpOworICAgICAgICAqdmFsdWVfYWRkciA9IE5VTEw7CisgICAgICAgIHJldHVybiBES0lYX0VNUFRZOworICAgIH0KKyAgICBlcCA9ICZlcDBbaXhdOworICAgIGFzc2VydChlcC0+bWVfa2V5ICE9IE5VTEwpOworICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2tFeGFjdChlcC0+bWVfa2V5KSk7CisgICAgaWYgKGVwLT5tZV9rZXkgPT0ga2V5IHx8CiAgICAgICAgIChlcC0+bWVfaGFzaCA9PSBoYXNoICYmIHVuaWNvZGVfZXEoZXAtPm1lX2tleSwga2V5KSkpIHsKKyAgICAgICAgaWYgKGhhc2hwb3MgIT0gTlVMTCkKKyAgICAgICAgICAgICpoYXNocG9zID0gaTsKICAgICAgICAgKnZhbHVlX2FkZHIgPSAmZXAtPm1lX3ZhbHVlOwotICAgICAgICByZXR1cm4gZXA7CisgICAgICAgIHJldHVybiBpeDsKICAgICB9CiAgICAgZm9yIChwZXJ0dXJiID0gaGFzaDsgOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7Ci0gICAgICAgIGkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKLSAgICAgICAgZXAgPSAmZXAwW2kgJiBtYXNrXTsKLSAgICAgICAgYXNzZXJ0KGVwLT5tZV9rZXkgPT0gTlVMTCB8fCBQeVVuaWNvZGVfQ2hlY2tFeGFjdChlcC0+bWVfa2V5KSk7Ci0gICAgICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwgfHwgZXAtPm1lX2tleSA9PSBrZXkgfHwKKyAgICAgICAgaSA9IG1hc2sgJiAoKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDEpOworICAgICAgICBpeCA9IGRrX2dldF9pbmRleChtcC0+bWFfa2V5cywgaSk7CisgICAgICAgIGFzc2VydCAoaXggIT0gREtJWF9EVU1NWSk7CisgICAgICAgIGlmIChpeCA9PSBES0lYX0VNUFRZKSB7CisgICAgICAgICAgICBpZiAoaGFzaHBvcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICpoYXNocG9zID0gaTsKKyAgICAgICAgICAgICp2YWx1ZV9hZGRyID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBES0lYX0VNUFRZOworICAgICAgICB9CisgICAgICAgIGVwID0gJmVwMFtpeF07CisgICAgICAgIGFzc2VydChlcC0+bWVfa2V5ICE9IE5VTEwgJiYgUHlVbmljb2RlX0NoZWNrRXhhY3QoZXAtPm1lX2tleSkpOworICAgICAgICBpZiAoZXAtPm1lX2tleSA9PSBrZXkgfHwKICAgICAgICAgICAgIChlcC0+bWVfaGFzaCA9PSBoYXNoICYmIHVuaWNvZGVfZXEoZXAtPm1lX2tleSwga2V5KSkpIHsKKyAgICAgICAgICAgIGlmIChoYXNocG9zICE9IE5VTEwpCisgICAgICAgICAgICAgICAgKmhhc2hwb3MgPSBpOwogICAgICAgICAgICAgKnZhbHVlX2FkZHIgPSAmZXAtPm1lX3ZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIGVwOworICAgICAgICAgICAgcmV0dXJuIGl4OwogICAgICAgICB9CiAgICAgfQogICAgIGFzc2VydCgwKTsgICAgICAgICAgLyogTk9UIFJFQUNIRUQgKi8KQEAgLTYzOCwzOSArODYxLDYxIEBACiAgKiBTcGxpdCB0YWJsZXMgb25seSBjb250YWluIHVuaWNvZGUga2V5cyBhbmQgbm8gZHVtbXkga2V5cywKICAqIHNvIGFsZ29yaXRobSBpcyB0aGUgc2FtZSBhcyBsb29rZGljdF91bmljb2RlX25vZHVtbXkuCiAgKi8KLXN0YXRpYyBQeURpY3RLZXlFbnRyeSAqCitzdGF0aWMgUHlfc3NpemVfdAogbG9va2RpY3Rfc3BsaXQoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwKLSAgICAgICAgICAgICAgIFB5X2hhc2hfdCBoYXNoLCBQeU9iamVjdCAqKip2YWx1ZV9hZGRyKQorICAgICAgICAgICAgICAgUHlfaGFzaF90IGhhc2gsIFB5T2JqZWN0ICoqKnZhbHVlX2FkZHIsIFB5X3NzaXplX3QgKmhhc2hwb3MpCiB7Ci0gICAgc2l6ZV90IGk7Ci0gICAgc2l6ZV90IHBlcnR1cmI7CisgICAgc2l6ZV90IGksIHBlcnR1cmI7CiAgICAgc2l6ZV90IG1hc2sgPSBES19NQVNLKG1wLT5tYV9rZXlzKTsKLSAgICBQeURpY3RLZXlFbnRyeSAqZXAwID0gJm1wLT5tYV9rZXlzLT5ka19lbnRyaWVzWzBdOwotICAgIFB5RGljdEtleUVudHJ5ICplcDsKKyAgICBQeV9zc2l6ZV90IGl4OworICAgIFB5RGljdEtleUVudHJ5ICplcCwgKmVwMCA9IERLX0VOVFJJRVMobXAtPm1hX2tleXMpOwogCisgICAgLyogbXAgbXVzdCBzcGxpdCB0YWJsZSAqLworICAgIGFzc2VydChtcC0+bWFfdmFsdWVzICE9IE5VTEwpOwogICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSkgewotICAgICAgICBlcCA9IGxvb2tkaWN0KG1wLCBrZXksIGhhc2gsIHZhbHVlX2FkZHIpOwotICAgICAgICAvKiBsb29rZGljdCBleHBlY3RzIGEgY29tYmluZWQtdGFibGUsIHNvIGZpeCB2YWx1ZV9hZGRyICovCi0gICAgICAgIGkgPSBlcCAtIGVwMDsKLSAgICAgICAgKnZhbHVlX2FkZHIgPSAmbXAtPm1hX3ZhbHVlc1tpXTsKLSAgICAgICAgcmV0dXJuIGVwOworICAgICAgICBpeCA9IGxvb2tkaWN0KG1wLCBrZXksIGhhc2gsIHZhbHVlX2FkZHIsIGhhc2hwb3MpOworICAgICAgICBpZiAoaXggPj0gMCkgeworICAgICAgICAgICAgKnZhbHVlX2FkZHIgPSAmbXAtPm1hX3ZhbHVlc1tpeF07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGl4OwogICAgIH0KKwogICAgIGkgPSAoc2l6ZV90KWhhc2ggJiBtYXNrOwotICAgIGVwID0gJmVwMFtpXTsKKyAgICBpeCA9IGRrX2dldF9pbmRleChtcC0+bWFfa2V5cywgaSk7CisgICAgaWYgKGl4ID09IERLSVhfRU1QVFkpIHsKKyAgICAgICAgaWYgKGhhc2hwb3MgIT0gTlVMTCkKKyAgICAgICAgICAgICpoYXNocG9zID0gaTsKKyAgICAgICAgKnZhbHVlX2FkZHIgPSBOVUxMOworICAgICAgICByZXR1cm4gREtJWF9FTVBUWTsKKyAgICB9CisgICAgYXNzZXJ0KGl4ID49IDApOworICAgIGVwID0gJmVwMFtpeF07CiAgICAgYXNzZXJ0KGVwLT5tZV9rZXkgPT0gTlVMTCB8fCBQeVVuaWNvZGVfQ2hlY2tFeGFjdChlcC0+bWVfa2V5KSk7Ci0gICAgaWYgKGVwLT5tZV9rZXkgPT0gTlVMTCB8fCBlcC0+bWVfa2V5ID09IGtleSB8fAorICAgIGlmIChlcC0+bWVfa2V5ID09IGtleSB8fAogICAgICAgICAoZXAtPm1lX2hhc2ggPT0gaGFzaCAmJiB1bmljb2RlX2VxKGVwLT5tZV9rZXksIGtleSkpKSB7Ci0gICAgICAgICp2YWx1ZV9hZGRyID0gJm1wLT5tYV92YWx1ZXNbaV07Ci0gICAgICAgIHJldHVybiBlcDsKKyAgICAgICAgaWYgKGhhc2hwb3MgIT0gTlVMTCkKKyAgICAgICAgICAgICpoYXNocG9zID0gaTsKKyAgICAgICAgKnZhbHVlX2FkZHIgPSAmbXAtPm1hX3ZhbHVlc1tpeF07CisgICAgICAgIHJldHVybiBpeDsKICAgICB9CiAgICAgZm9yIChwZXJ0dXJiID0gaGFzaDsgOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7Ci0gICAgICAgIGkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKLSAgICAgICAgZXAgPSAmZXAwW2kgJiBtYXNrXTsKKyAgICAgICAgaSA9IG1hc2sgJiAoKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDEpOworICAgICAgICBpeCA9IGRrX2dldF9pbmRleChtcC0+bWFfa2V5cywgaSk7CisgICAgICAgIGlmIChpeCA9PSBES0lYX0VNUFRZKSB7CisgICAgICAgICAgICBpZiAoaGFzaHBvcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICpoYXNocG9zID0gaTsKKyAgICAgICAgICAgICp2YWx1ZV9hZGRyID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBES0lYX0VNUFRZOworICAgICAgICB9CisgICAgICAgIGFzc2VydChpeCA+PSAwKTsKKyAgICAgICAgZXAgPSAmZXAwW2l4XTsKICAgICAgICAgYXNzZXJ0KGVwLT5tZV9rZXkgPT0gTlVMTCB8fCBQeVVuaWNvZGVfQ2hlY2tFeGFjdChlcC0+bWVfa2V5KSk7Ci0gICAgICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwgfHwgZXAtPm1lX2tleSA9PSBrZXkgfHwKKyAgICAgICAgaWYgKGVwLT5tZV9rZXkgPT0ga2V5IHx8CiAgICAgICAgICAgICAoZXAtPm1lX2hhc2ggPT0gaGFzaCAmJiB1bmljb2RlX2VxKGVwLT5tZV9rZXksIGtleSkpKSB7Ci0gICAgICAgICAgICAqdmFsdWVfYWRkciA9ICZtcC0+bWFfdmFsdWVzW2kgJiBtYXNrXTsKLSAgICAgICAgICAgIHJldHVybiBlcDsKKyAgICAgICAgICAgIGlmIChoYXNocG9zICE9IE5VTEwpCisgICAgICAgICAgICAgICAgKmhhc2hwb3MgPSBpOworICAgICAgICAgICAgKnZhbHVlX2FkZHIgPSAmbXAtPm1hX3ZhbHVlc1tpeF07CisgICAgICAgICAgICByZXR1cm4gaXg7CiAgICAgICAgIH0KICAgICB9CiAgICAgYXNzZXJ0KDApOyAgICAgICAgICAvKiBOT1QgUkVBQ0hFRCAqLwpAQCAtNzA3LDI3ICs5NTIsMjcgQEAKIHsKICAgICBQeURpY3RPYmplY3QgKm1wOwogICAgIFB5T2JqZWN0ICp2YWx1ZTsKLSAgICBQeV9zc2l6ZV90IGksIHNpemU7CisgICAgUHlfc3NpemVfdCBpLCBudW1lbnRyaWVzOworICAgIFB5RGljdEtleUVudHJ5ICplcDA7CiAKICAgICBpZiAoIVB5RGljdF9DaGVja0V4YWN0KG9wKSB8fCAhX1B5T2JqZWN0X0dDX0lTX1RSQUNLRUQob3ApKQogICAgICAgICByZXR1cm47CiAKICAgICBtcCA9IChQeURpY3RPYmplY3QgKikgb3A7Ci0gICAgc2l6ZSA9IERLX1NJWkUobXAtPm1hX2tleXMpOworICAgIGVwMCA9IERLX0VOVFJJRVMobXAtPm1hX2tleXMpOworICAgIG51bWVudHJpZXMgPSBtcC0+bWFfa2V5cy0+ZGtfbmVudHJpZXM7CiAgICAgaWYgKF9QeURpY3RfSGFzU3BsaXRUYWJsZShtcCkpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtZW50cmllczsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoKHZhbHVlID0gbXAtPm1hX3ZhbHVlc1tpXSkgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIGlmIChfUHlPYmplY3RfR0NfTUFZX0JFX1RSQUNLRUQodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KCFfUHlPYmplY3RfR0NfTUFZX0JFX1RSQUNLRUQoCi0gICAgICAgICAgICAgICAgICAgIG1wLT5tYV9rZXlzLT5ka19lbnRyaWVzW2ldLm1lX2tleSkpOworICAgICAgICAgICAgICAgIGFzc2VydCghX1B5T2JqZWN0X0dDX01BWV9CRV9UUkFDS0VEKGVwMFtpXS5tZV9rZXkpKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIFB5RGljdEtleUVudHJ5ICplcDAgPSAmbXAtPm1hX2tleXMtPmRrX2VudHJpZXNbMF07Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWVudHJpZXM7IGkrKykgewogICAgICAgICAgICAgaWYgKCh2YWx1ZSA9IGVwMFtpXS5tZV92YWx1ZSkgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIGlmIChfUHlPYmplY3RfR0NfTUFZX0JFX1RSQUNLRUQodmFsdWUpIHx8CkBAIC03NDEsMzEgKzk4NiwzMyBAQAogLyogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZmluZCBzbG90IGZvciBhbiBpdGVtIGZyb20gaXRzIGhhc2gKICAqIHdoZW4gaXQgaXMga25vd24gdGhhdCB0aGUga2V5IGlzIG5vdCBwcmVzZW50IGluIHRoZSBkaWN0LgogICovCi1zdGF0aWMgUHlEaWN0S2V5RW50cnkgKgorc3RhdGljIFB5X3NzaXplX3QKIGZpbmRfZW1wdHlfc2xvdChQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCwKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqKip2YWx1ZV9hZGRyKQorICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqKnZhbHVlX2FkZHIsIFB5X3NzaXplX3QgKmhhc2hwb3MpCiB7Ci0gICAgc2l6ZV90IGk7Ci0gICAgc2l6ZV90IHBlcnR1cmI7CisgICAgc2l6ZV90IGksIHBlcnR1cmI7CiAgICAgc2l6ZV90IG1hc2sgPSBES19NQVNLKG1wLT5tYV9rZXlzKTsKLSAgICBQeURpY3RLZXlFbnRyeSAqZXAwID0gJm1wLT5tYV9rZXlzLT5ka19lbnRyaWVzWzBdOwotICAgIFB5RGljdEtleUVudHJ5ICplcDsKKyAgICBQeV9zc2l6ZV90IGl4OworICAgIFB5RGljdEtleUVudHJ5ICplcCwgKmVwMCA9IERLX0VOVFJJRVMobXAtPm1hX2tleXMpOwogCisgICAgYXNzZXJ0KGhhc2hwb3MgIT0gTlVMTCk7CiAgICAgYXNzZXJ0KGtleSAhPSBOVUxMKTsKICAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkpCiAgICAgICAgIG1wLT5tYV9rZXlzLT5ka19sb29rdXAgPSBsb29rZGljdDsKICAgICBpID0gaGFzaCAmIG1hc2s7Ci0gICAgZXAgPSAmZXAwW2ldOwotICAgIGZvciAocGVydHVyYiA9IGhhc2g7IGVwLT5tZV9rZXkgIT0gTlVMTDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgeworICAgIGl4ID0gZGtfZ2V0X2luZGV4KG1wLT5tYV9rZXlzLCBpKTsKKyAgICBmb3IgKHBlcnR1cmIgPSBoYXNoOyBpeCAhPSBES0lYX0VNUFRZOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7CiAgICAgICAgIGkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKLSAgICAgICAgZXAgPSAmZXAwW2kgJiBtYXNrXTsKKyAgICAgICAgaXggPSBka19nZXRfaW5kZXgobXAtPm1hX2tleXMsIGkgJiBtYXNrKTsKICAgICB9CisgICAgZXAgPSAmZXAwW21wLT5tYV9rZXlzLT5ka19uZW50cmllc107CisgICAgKmhhc2hwb3MgPSBpICYgbWFzazsKICAgICBhc3NlcnQoZXAtPm1lX3ZhbHVlID09IE5VTEwpOwogICAgIGlmIChtcC0+bWFfdmFsdWVzKQotICAgICAgICAqdmFsdWVfYWRkciA9ICZtcC0+bWFfdmFsdWVzW2kgJiBtYXNrXTsKKyAgICAgICAgKnZhbHVlX2FkZHIgPSAmbXAtPm1hX3ZhbHVlc1tpeF07CiAgICAgZWxzZQogICAgICAgICAqdmFsdWVfYWRkciA9ICZlcC0+bWVfdmFsdWU7Ci0gICAgcmV0dXJuIGVwOworICAgIHJldHVybiBpeDsKIH0KIAogc3RhdGljIGludApAQCAtNzg0LDU4ICsxMDMxLDg1IEBACiB7CiAgICAgUHlPYmplY3QgKm9sZF92YWx1ZTsKICAgICBQeU9iamVjdCAqKnZhbHVlX2FkZHI7Ci0gICAgUHlEaWN0S2V5RW50cnkgKmVwOwotICAgIGFzc2VydChrZXkgIT0gZHVtbXkpOworICAgIFB5RGljdEtleUVudHJ5ICplcCwgKmVwMDsKKyAgICBQeV9zc2l6ZV90IGhhc2hwb3MsIGl4OwogCiAgICAgaWYgKG1wLT5tYV92YWx1ZXMgIT0gTlVMTCAmJiAhUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSkgewogICAgICAgICBpZiAoaW5zZXJ0aW9uX3Jlc2l6ZShtcCkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGVwID0gbXAtPm1hX2tleXMtPmRrX2xvb2t1cChtcCwga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgaWYgKGVwID09IE5VTEwpIHsKKyAgICBpeCA9IG1wLT5tYV9rZXlzLT5ka19sb29rdXAobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIsICZoYXNocG9zKTsKKyAgICBpZiAoaXggPT0gREtJWF9FUlJPUikgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQorCiAgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkgfHwgbXAtPm1hX2tleXMtPmRrX2xvb2t1cCA9PSBsb29rZGljdCk7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKICAgICBNQUlOVEFJTl9UUkFDS0lORyhtcCwga2V5LCB2YWx1ZSk7Ci0gICAgb2xkX3ZhbHVlID0gKnZhbHVlX2FkZHI7Ci0gICAgaWYgKG9sZF92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgIGFzc2VydChlcC0+bWVfa2V5ICE9IE5VTEwgJiYgZXAtPm1lX2tleSAhPSBkdW1teSk7Ci0gICAgICAgICp2YWx1ZV9hZGRyID0gdmFsdWU7Ci0gICAgICAgIFB5X0RFQ1JFRihvbGRfdmFsdWUpOyAvKiB3aGljaCAqKkNBTioqIHJlLWVudGVyIChzZWUgaXNzdWUgIzIyNjUzKSAqLworCisgICAgLyogV2hlbiBpbnNlcnRpb24gb3JkZXIgaXMgZGlmZmVyZW50IGZyb20gc2hhcmVkIGtleSwgd2UgY2FuJ3Qgc2hhcmUKKyAgICAgKiB0aGUga2V5IGFueW1vcmUuICBDb252ZXJ0IHRoaXMgaW5zdGFuY2UgdG8gY29tYmluZSB0YWJsZS4KKyAgICAgKi8KKyAgICBpZiAoX1B5RGljdF9IYXNTcGxpdFRhYmxlKG1wKSAmJgorICAgICAgICAoKGl4ID49IDAgJiYgKnZhbHVlX2FkZHIgPT0gTlVMTCAmJiBtcC0+bWFfdXNlZCAhPSBpeCkgfHwKKyAgICAgICAgIChpeCA9PSBES0lYX0VNUFRZICYmIG1wLT5tYV91c2VkICE9IG1wLT5tYV9rZXlzLT5ka19uZW50cmllcykpKSB7CisgICAgICAgIGlmIChpbnNlcnRpb25fcmVzaXplKG1wKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZmluZF9lbXB0eV9zbG90KG1wLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyLCAmaGFzaHBvcyk7CisgICAgICAgIGl4ID0gREtJWF9FTVBUWTsKICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOwotICAgICAgICAgICAgaWYgKG1wLT5tYV9rZXlzLT5ka191c2FibGUgPD0gMCkgewotICAgICAgICAgICAgICAgIC8qIE5lZWQgdG8gcmVzaXplLiAqLwotICAgICAgICAgICAgICAgIGlmIChpbnNlcnRpb25fcmVzaXplKG1wKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXAgPSBmaW5kX2VtcHR5X3Nsb3QobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOworCisgICAgaWYgKGl4ID09IERLSVhfRU1QVFkpIHsKKyAgICAgICAgLyogSW5zZXJ0IGludG8gbmV3IHNsb3QuICovCisgICAgICAgIGlmIChtcC0+bWFfa2V5cy0+ZGtfdXNhYmxlIDw9IDApIHsKKyAgICAgICAgICAgIC8qIE5lZWQgdG8gcmVzaXplLiAqLworICAgICAgICAgICAgaWYgKGluc2VydGlvbl9yZXNpemUobXApIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbXAtPm1hX2tleXMtPmRrX3VzYWJsZS0tOwotICAgICAgICAgICAgYXNzZXJ0KG1wLT5tYV9rZXlzLT5ka191c2FibGUgPj0gMCk7Ci0gICAgICAgICAgICBlcC0+bWVfa2V5ID0ga2V5OwotICAgICAgICAgICAgZXAtPm1lX2hhc2ggPSBoYXNoOworICAgICAgICAgICAgZmluZF9lbXB0eV9zbG90KG1wLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyLCAmaGFzaHBvcyk7CisgICAgICAgIH0KKyAgICAgICAgZXAwID0gREtfRU5UUklFUyhtcC0+bWFfa2V5cyk7CisgICAgICAgIGVwID0gJmVwMFttcC0+bWFfa2V5cy0+ZGtfbmVudHJpZXNdOworICAgICAgICBka19zZXRfaW5kZXgobXAtPm1hX2tleXMsIGhhc2hwb3MsIG1wLT5tYV9rZXlzLT5ka19uZW50cmllcyk7CisgICAgICAgIFB5X0lOQ1JFRihrZXkpOworICAgICAgICBlcC0+bWVfa2V5ID0ga2V5OworICAgICAgICBlcC0+bWVfaGFzaCA9IGhhc2g7CisgICAgICAgIGlmIChtcC0+bWFfdmFsdWVzKSB7CisgICAgICAgICAgICBhc3NlcnQgKG1wLT5tYV92YWx1ZXNbbXAtPm1hX2tleXMtPmRrX25lbnRyaWVzXSA9PSBOVUxMKTsKKyAgICAgICAgICAgIG1wLT5tYV92YWx1ZXNbbXAtPm1hX2tleXMtPmRrX25lbnRyaWVzXSA9IHZhbHVlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGVwLT5tZV9rZXkgPT0gZHVtbXkpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKLSAgICAgICAgICAgICAgICBlcC0+bWVfa2V5ID0ga2V5OwotICAgICAgICAgICAgICAgIGVwLT5tZV9oYXNoID0gaGFzaDsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZHVtbXkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQoX1B5RGljdF9IYXNTcGxpdFRhYmxlKG1wKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBlcC0+bWVfdmFsdWUgPSB2YWx1ZTsKICAgICAgICAgfQogICAgICAgICBtcC0+bWFfdXNlZCsrOwotICAgICAgICAqdmFsdWVfYWRkciA9IHZhbHVlOwotICAgICAgICBhc3NlcnQoZXAtPm1lX2tleSAhPSBOVUxMICYmIGVwLT5tZV9rZXkgIT0gZHVtbXkpOworICAgICAgICBtcC0+bWFfdmVyc2lvbl90YWcgPSBESUNUX05FWFRfVkVSU0lPTigpOworICAgICAgICBtcC0+bWFfa2V5cy0+ZGtfdXNhYmxlLS07CisgICAgICAgIG1wLT5tYV9rZXlzLT5ka19uZW50cmllcysrOworICAgICAgICBhc3NlcnQobXAtPm1hX2tleXMtPmRrX3VzYWJsZSA+PSAwKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorCisgICAgYXNzZXJ0KHZhbHVlX2FkZHIgIT0gTlVMTCk7CisKKyAgICBvbGRfdmFsdWUgPSAqdmFsdWVfYWRkcjsKKyAgICBpZiAob2xkX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgKnZhbHVlX2FkZHIgPSB2YWx1ZTsKKyAgICAgICAgbXAtPm1hX3ZlcnNpb25fdGFnID0gRElDVF9ORVhUX1ZFUlNJT04oKTsKKworICAgICAgICBQeV9ERUNSRUYob2xkX3ZhbHVlKTsgLyogd2hpY2ggKipDQU4qKiByZS1lbnRlciAoc2VlIGlzc3VlICMyMjY1MykgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogcGVuZGluZyBzdGF0ZSAqLworICAgIGFzc2VydChfUHlEaWN0X0hhc1NwbGl0VGFibGUobXApKTsKKyAgICBhc3NlcnQoaXggPT0gbXAtPm1hX3VzZWQpOworICAgICp2YWx1ZV9hZGRyID0gdmFsdWU7CisgICAgbXAtPm1hX3VzZWQrKzsKKyAgICBtcC0+bWFfdmVyc2lvbl90YWcgPSBESUNUX05FWFRfVkVSU0lPTigpOwogICAgIHJldHVybiAwOwogfQogCkBAIC04NTMsMjUgKzExMjcsMjUgQEAKIGluc2VydGRpY3RfY2xlYW4oUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gsCiAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBzaXplX3QgaTsKLSAgICBzaXplX3QgcGVydHVyYjsKKyAgICBzaXplX3QgaSwgcGVydHVyYjsKICAgICBQeURpY3RLZXlzT2JqZWN0ICprID0gbXAtPm1hX2tleXM7CiAgICAgc2l6ZV90IG1hc2sgPSAoc2l6ZV90KURLX1NJWkUoayktMTsKLSAgICBQeURpY3RLZXlFbnRyeSAqZXAwID0gJmstPmRrX2VudHJpZXNbMF07CisgICAgUHlEaWN0S2V5RW50cnkgKmVwMCA9IERLX0VOVFJJRVMobXAtPm1hX2tleXMpOwogICAgIFB5RGljdEtleUVudHJ5ICplcDsKIAogICAgIGFzc2VydChrLT5ka19sb29rdXAgIT0gTlVMTCk7CiAgICAgYXNzZXJ0KHZhbHVlICE9IE5VTEwpOwogICAgIGFzc2VydChrZXkgIT0gTlVMTCk7Ci0gICAgYXNzZXJ0KGtleSAhPSBkdW1teSk7CiAgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkgfHwgay0+ZGtfbG9va3VwID09IGxvb2tkaWN0KTsKICAgICBpID0gaGFzaCAmIG1hc2s7Ci0gICAgZXAgPSAmZXAwW2ldOwotICAgIGZvciAocGVydHVyYiA9IGhhc2g7IGVwLT5tZV9rZXkgIT0gTlVMTDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgewotICAgICAgICBpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7Ci0gICAgICAgIGVwID0gJmVwMFtpICYgbWFza107CisgICAgZm9yIChwZXJ0dXJiID0gaGFzaDsgZGtfZ2V0X2luZGV4KGssIGkpICE9IERLSVhfRU1QVFk7CisgICAgICAgICBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7CisgICAgICAgIGkgPSBtYXNrICYgKChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxKTsKICAgICB9CisgICAgZXAgPSAmZXAwW2stPmRrX25lbnRyaWVzXTsKICAgICBhc3NlcnQoZXAtPm1lX3ZhbHVlID09IE5VTEwpOworICAgIGRrX3NldF9pbmRleChrLCBpLCBrLT5ka19uZW50cmllcyk7CisgICAgay0+ZGtfbmVudHJpZXMrKzsKICAgICBlcC0+bWVfa2V5ID0ga2V5OwogICAgIGVwLT5tZV9oYXNoID0gaGFzaDsKICAgICBlcC0+bWVfdmFsdWUgPSB2YWx1ZTsKQEAgLTg5MCwxMyArMTE2NCwxMyBAQAogc3RhdGljIGludAogZGljdHJlc2l6ZShQeURpY3RPYmplY3QgKm1wLCBQeV9zc2l6ZV90IG1pbnVzZWQpCiB7Ci0gICAgUHlfc3NpemVfdCBuZXdzaXplOworICAgIFB5X3NzaXplX3QgaSwgbmV3c2l6ZTsKICAgICBQeURpY3RLZXlzT2JqZWN0ICpvbGRrZXlzOwogICAgIFB5T2JqZWN0ICoqb2xkdmFsdWVzOwotICAgIFB5X3NzaXplX3QgaSwgb2xkc2l6ZTsKKyAgICBQeURpY3RLZXlFbnRyeSAqZXAwOwogCi0vKiBGaW5kIHRoZSBzbWFsbGVzdCB0YWJsZSBzaXplID4gbWludXNlZC4gKi8KLSAgICBmb3IgKG5ld3NpemUgPSBQeURpY3RfTUlOU0laRV9DT01CSU5FRDsKKyAgICAvKiBGaW5kIHRoZSBzbWFsbGVzdCB0YWJsZSBzaXplID4gbWludXNlZC4gKi8KKyAgICBmb3IgKG5ld3NpemUgPSBQeURpY3RfTUlOU0laRTsKICAgICAgICAgIG5ld3NpemUgPD0gbWludXNlZCAmJiBuZXdzaXplID4gMDsKICAgICAgICAgIG5ld3NpemUgPDw9IDEpCiAgICAgICAgIDsKQEAgLTkxNCw1NCArMTE4OCw0MSBAQAogICAgIH0KICAgICBpZiAob2xka2V5cy0+ZGtfbG9va3VwID09IGxvb2tkaWN0KQogICAgICAgICBtcC0+bWFfa2V5cy0+ZGtfbG9va3VwID0gbG9va2RpY3Q7Ci0gICAgb2xkc2l6ZSA9IERLX1NJWkUob2xka2V5cyk7CiAgICAgbXAtPm1hX3ZhbHVlcyA9IE5VTEw7Ci0gICAgLyogSWYgZW1wdHkgdGhlbiBub3RoaW5nIHRvIGNvcHkgc28ganVzdCByZXR1cm4gKi8KLSAgICBpZiAob2xkc2l6ZSA9PSAxKSB7Ci0gICAgICAgIGFzc2VydChvbGRrZXlzID09IFB5X0VNUFRZX0tFWVMpOwotICAgICAgICBES19ERUNSRUYob2xka2V5cyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICBlcDAgPSBES19FTlRSSUVTKG9sZGtleXMpOwogICAgIC8qIE1haW4gbG9vcCBiZWxvdyBhc3N1bWVzIHdlIGNhbiB0cmFuc2ZlciByZWZjb3VudCB0byBuZXcga2V5cwogICAgICAqIGFuZCB0aGF0IHZhbHVlIGlzIHN0b3JlZCBpbiBtZV92YWx1ZS4KICAgICAgKiBJbmNyZW1lbnQgcmVmLWNvdW50cyBhbmQgY29weSB2YWx1ZXMgaGVyZSB0byBjb21wZW5zYXRlCiAgICAgICogVGhpcyAocmVzaXppbmcgYSBzcGxpdCB0YWJsZSkgc2hvdWxkIGJlIHJlbGF0aXZlbHkgcmFyZSAqLwogICAgIGlmIChvbGR2YWx1ZXMgIT0gTlVMTCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2xkc2l6ZTsgaSsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGRrZXlzLT5ka19uZW50cmllczsgaSsrKSB7CiAgICAgICAgICAgICBpZiAob2xkdmFsdWVzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYob2xka2V5cy0+ZGtfZW50cmllc1tpXS5tZV9rZXkpOwotICAgICAgICAgICAgICAgIG9sZGtleXMtPmRrX2VudHJpZXNbaV0ubWVfdmFsdWUgPSBvbGR2YWx1ZXNbaV07CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVwMFtpXS5tZV9rZXkpOworICAgICAgICAgICAgICAgIGVwMFtpXS5tZV92YWx1ZSA9IG9sZHZhbHVlc1tpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICAvKiBNYWluIGxvb3AgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgb2xkc2l6ZTsgaSsrKSB7Ci0gICAgICAgIFB5RGljdEtleUVudHJ5ICplcCA9ICZvbGRrZXlzLT5ka19lbnRyaWVzW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCBvbGRrZXlzLT5ka19uZW50cmllczsgaSsrKSB7CisgICAgICAgIFB5RGljdEtleUVudHJ5ICplcCA9ICZlcDBbaV07CiAgICAgICAgIGlmIChlcC0+bWVfdmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgYXNzZXJ0KGVwLT5tZV9rZXkgIT0gZHVtbXkpOwogICAgICAgICAgICAgaW5zZXJ0ZGljdF9jbGVhbihtcCwgZXAtPm1lX2tleSwgZXAtPm1lX2hhc2gsIGVwLT5tZV92YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgbXAtPm1hX2tleXMtPmRrX3VzYWJsZSAtPSBtcC0+bWFfdXNlZDsKICAgICBpZiAob2xkdmFsdWVzICE9IE5VTEwpIHsKICAgICAgICAgLyogTlVMTCBvdXQgbWVfdmFsdWUgc2xvdCBpbiBvbGRrZXlzLCBpbiBjYXNlIGl0IHdhcyBzaGFyZWQgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG9sZHNpemU7IGkrKykKLSAgICAgICAgICAgIG9sZGtleXMtPmRrX2VudHJpZXNbaV0ubWVfdmFsdWUgPSBOVUxMOwotICAgICAgICBhc3NlcnQob2xkdmFsdWVzICE9IGVtcHR5X3ZhbHVlcyk7Ci0gICAgICAgIGZyZWVfdmFsdWVzKG9sZHZhbHVlcyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGRrZXlzLT5ka19uZW50cmllczsgaSsrKQorICAgICAgICAgICAgZXAwW2ldLm1lX3ZhbHVlID0gTlVMTDsKICAgICAgICAgREtfREVDUkVGKG9sZGtleXMpOworICAgICAgICBpZiAob2xkdmFsdWVzICE9IGVtcHR5X3ZhbHVlcykgeworICAgICAgICAgICAgZnJlZV92YWx1ZXMob2xkdmFsdWVzKTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgYXNzZXJ0KG9sZGtleXMtPmRrX2xvb2t1cCAhPSBsb29rZGljdF9zcGxpdCk7Ci0gICAgICAgIGlmIChvbGRrZXlzLT5ka19sb29rdXAgIT0gbG9va2RpY3RfdW5pY29kZV9ub2R1bW15KSB7Ci0gICAgICAgICAgICBQeURpY3RLZXlFbnRyeSAqZXAwID0gJm9sZGtleXMtPmRrX2VudHJpZXNbMF07Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2xkc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVwMFtpXS5tZV9rZXkgPT0gZHVtbXkpCi0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkdW1teSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgYXNzZXJ0KG9sZGtleXMtPmRrX3JlZmNudCA9PSAxKTsKLSAgICAgICAgREtfREVCVUdfREVDUkVGIFB5TWVtX0ZSRUUob2xka2V5cyk7CisgICAgICAgIERLX0RFQlVHX0RFQ1JFRiBQeU9iamVjdF9GUkVFKG9sZGtleXMpOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KQEAgLTk5MSw4ICsxMjUyLDggQEAKICAgICAgICAgfQogICAgICAgICBhc3NlcnQobXAtPm1hX2tleXMtPmRrX2xvb2t1cCA9PSBsb29rZGljdF91bmljb2RlX25vZHVtbXkpOwogICAgICAgICAvKiBDb3B5IHZhbHVlcyBpbnRvIGEgbmV3IGFycmF5ICovCi0gICAgICAgIGVwMCA9ICZtcC0+bWFfa2V5cy0+ZGtfZW50cmllc1swXTsKLSAgICAgICAgc2l6ZSA9IERLX1NJWkUobXAtPm1hX2tleXMpOworICAgICAgICBlcDAgPSBES19FTlRSSUVTKG1wLT5tYV9rZXlzKTsKKyAgICAgICAgc2l6ZSA9IFVTQUJMRV9GUkFDVElPTihES19TSVpFKG1wLT5tYV9rZXlzKSk7CiAgICAgICAgIHZhbHVlcyA9IG5ld192YWx1ZXMoc2l6ZSk7CiAgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLApAQCAtMTAxNSw3ICsxMjc2LDcgQEAKIHsKICAgICBQeV9zc2l6ZV90IG5ld3NpemU7CiAgICAgUHlEaWN0S2V5c09iamVjdCAqbmV3X2tleXM7Ci0gICAgZm9yIChuZXdzaXplID0gUHlEaWN0X01JTlNJWkVfQ09NQklORUQ7CisgICAgZm9yIChuZXdzaXplID0gUHlEaWN0X01JTlNJWkU7CiAgICAgICAgICBuZXdzaXplIDw9IG1pbnVzZWQgJiYgbmV3c2l6ZSA+IDA7CiAgICAgICAgICBuZXdzaXplIDw8PSAxKQogICAgICAgICA7CkBAIC0xMDM5LDggKzEzMDAsOCBAQAogUHlEaWN0X0dldEl0ZW0oUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5KQogewogICAgIFB5X2hhc2hfdCBoYXNoOworICAgIFB5X3NzaXplX3QgaXg7CiAgICAgUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilvcDsKLSAgICBQeURpY3RLZXlFbnRyeSAqZXA7CiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwogICAgIFB5T2JqZWN0ICoqdmFsdWVfYWRkcjsKIApAQCAtMTA2NiwxNSArMTMyNywxNSBAQAogICAgICAgICAvKiBwcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgZXhjZXB0aW9uICovCiAgICAgICAgIFB5T2JqZWN0ICplcnJfdHlwZSwgKmVycl92YWx1ZSwgKmVycl90YjsKICAgICAgICAgUHlFcnJfRmV0Y2goJmVycl90eXBlLCAmZXJyX3ZhbHVlLCAmZXJyX3RiKTsKLSAgICAgICAgZXAgPSAobXAtPm1hX2tleXMtPmRrX2xvb2t1cCkobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOworICAgICAgICBpeCA9IChtcC0+bWFfa2V5cy0+ZGtfbG9va3VwKShtcCwga2V5LCBoYXNoLCAmdmFsdWVfYWRkciwgTlVMTCk7CiAgICAgICAgIC8qIGlnbm9yZSBlcnJvcnMgKi8KICAgICAgICAgUHlFcnJfUmVzdG9yZShlcnJfdHlwZSwgZXJyX3ZhbHVlLCBlcnJfdGIpOwotICAgICAgICBpZiAoZXAgPT0gTlVMTCkKKyAgICAgICAgaWYgKGl4IDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgZXAgPSAobXAtPm1hX2tleXMtPmRrX2xvb2t1cCkobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOwotICAgICAgICBpZiAoZXAgPT0gTlVMTCkgeworICAgICAgICBpeCA9IChtcC0+bWFfa2V5cy0+ZGtfbG9va3VwKShtcCwga2V5LCBoYXNoLCAmdmFsdWVfYWRkciwgTlVMTCk7CisgICAgICAgIGlmIChpeCA8IDApIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtMTA4NSw4ICsxMzQ2LDggQEAKIFB5T2JqZWN0ICoKIF9QeURpY3RfR2V0SXRlbV9Lbm93bkhhc2goUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKIHsKKyAgICBQeV9zc2l6ZV90IGl4OwogICAgIFB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7Ci0gICAgUHlEaWN0S2V5RW50cnkgKmVwOwogICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKICAgICBQeU9iamVjdCAqKnZhbHVlX2FkZHI7CiAKQEAgLTExMDMsMTUgKzEzNjQsMTUgQEAKICAgICAgICAgLyogcHJlc2VydmUgdGhlIGV4aXN0aW5nIGV4Y2VwdGlvbiAqLwogICAgICAgICBQeU9iamVjdCAqZXJyX3R5cGUsICplcnJfdmFsdWUsICplcnJfdGI7CiAgICAgICAgIFB5RXJyX0ZldGNoKCZlcnJfdHlwZSwgJmVycl92YWx1ZSwgJmVycl90Yik7Ci0gICAgICAgIGVwID0gKG1wLT5tYV9rZXlzLT5ka19sb29rdXApKG1wLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyKTsKKyAgICAgICAgaXggPSAobXAtPm1hX2tleXMtPmRrX2xvb2t1cCkobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIsIE5VTEwpOwogICAgICAgICAvKiBpZ25vcmUgZXJyb3JzICovCiAgICAgICAgIFB5RXJyX1Jlc3RvcmUoZXJyX3R5cGUsIGVycl92YWx1ZSwgZXJyX3RiKTsKLSAgICAgICAgaWYgKGVwID09IE5VTEwpCisgICAgICAgIGlmIChpeCA9PSBES0lYX0VNUFRZKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBlcCA9IChtcC0+bWFfa2V5cy0+ZGtfbG9va3VwKShtcCwga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgICAgIGlmIChlcCA9PSBOVUxMKSB7CisgICAgICAgIGl4ID0gKG1wLT5tYV9rZXlzLT5ka19sb29rdXApKG1wLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyLCBOVUxMKTsKKyAgICAgICAgaWYgKGl4ID09IERLSVhfRU1QVFkpIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtMTEyNiw5ICsxMzg3LDkgQEAKIFB5T2JqZWN0ICoKIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yKFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKmtleSkKIHsKKyAgICBQeV9zc2l6ZV90IGl4OwogICAgIFB5X2hhc2hfdCBoYXNoOwogICAgIFB5RGljdE9iamVjdCptcCA9IChQeURpY3RPYmplY3QgKilvcDsKLSAgICBQeURpY3RLZXlFbnRyeSAqZXA7CiAgICAgUHlPYmplY3QgKip2YWx1ZV9hZGRyOwogCiAgICAgaWYgKCFQeURpY3RfQ2hlY2sob3ApKSB7CkBAIC0xMTQ0LDggKzE0MDUsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZXAgPSAobXAtPm1hX2tleXMtPmRrX2xvb2t1cCkobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOwotICAgIGlmIChlcCA9PSBOVUxMKQorICAgIGl4ID0gKG1wLT5tYV9rZXlzLT5ka19sb29rdXApKG1wLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyLCBOVUxMKTsKKyAgICBpZiAoaXggPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gKnZhbHVlX2FkZHI7CiB9CkBAIC0xMTYwLDM5ICsxNDIxLDQwIEBACiAgICAgcmV0dXJuIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yKGRwLCBrdik7CiB9CiAKLS8qIEZhc3QgdmVyc2lvbiBvZiBnbG9iYWwgdmFsdWUgbG9va3VwLgorLyogRmFzdCB2ZXJzaW9uIG9mIGdsb2JhbCB2YWx1ZSBsb29rdXAgKExPQURfR0xPQkFMKS4KICAqIExvb2t1cCBpbiBnbG9iYWxzLCB0aGVuIGJ1aWx0aW5zLgorICoKKyAqIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQgKGV4OiBjb21wdXRpbmcgdGhlCisgKiBrZXkgaGFzaCBmYWlsZWQsIGtleSBjb21wYXJpc29uIGZhaWxlZCwgLi4uKS4gUmV0dXJuIE5VTEwgaWYgdGhlIGtleSBkb2Vzbid0CisgKiBleGlzdC4gUmV0dXJuIHRoZSB2YWx1ZSBpZiB0aGUga2V5IGV4aXN0cy4KICAqLwogUHlPYmplY3QgKgogX1B5RGljdF9Mb2FkR2xvYmFsKFB5RGljdE9iamVjdCAqZ2xvYmFscywgUHlEaWN0T2JqZWN0ICpidWlsdGlucywgUHlPYmplY3QgKmtleSkKIHsKLSAgICBQeU9iamVjdCAqeDsKLSAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSkgewotICAgICAgICBQeU9iamVjdCAqKnZhbHVlX2FkZHI7Ci0gICAgICAgIFB5X2hhc2hfdCBoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopa2V5KS0+aGFzaDsKLSAgICAgICAgaWYgKGhhc2ggIT0gLTEpIHsKLSAgICAgICAgICAgIFB5RGljdEtleUVudHJ5ICplOwotICAgICAgICAgICAgZSA9IGdsb2JhbHMtPm1hX2tleXMtPmRrX2xvb2t1cChnbG9iYWxzLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyKTsKLSAgICAgICAgICAgIGlmIChlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHggPSAqdmFsdWVfYWRkcjsKLSAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgICAgICBlID0gYnVpbHRpbnMtPm1hX2tleXMtPmRrX2xvb2t1cChidWlsdGlucywga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgICAgICAgICBpZiAoZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4ID0gKnZhbHVlX2FkZHI7Ci0gICAgICAgICAgICByZXR1cm4geDsKLSAgICAgICAgfQorICAgIFB5X3NzaXplX3QgaXg7CisgICAgUHlfaGFzaF90IGhhc2g7CisgICAgUHlPYmplY3QgKip2YWx1ZV9hZGRyOworCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKQorICAgIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgeCA9IFB5RGljdF9HZXRJdGVtV2l0aEVycm9yKChQeU9iamVjdCAqKWdsb2JhbHMsIGtleSk7Ci0gICAgaWYgKHggIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIHg7Ci0gICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisKKyAgICAvKiBuYW1lc3BhY2UgMTogZ2xvYmFscyAqLworICAgIGl4ID0gZ2xvYmFscy0+bWFfa2V5cy0+ZGtfbG9va3VwKGdsb2JhbHMsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIsIE5VTEwpOworICAgIGlmIChpeCA9PSBES0lYX0VSUk9SKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3IoKFB5T2JqZWN0ICopYnVpbHRpbnMsIGtleSk7CisgICAgaWYgKGl4ICE9IERLSVhfRU1QVFkgJiYgKnZhbHVlX2FkZHIgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICp2YWx1ZV9hZGRyOworCisgICAgLyogbmFtZXNwYWNlIDI6IGJ1aWx0aW5zICovCisgICAgaXggPSBidWlsdGlucy0+bWFfa2V5cy0+ZGtfbG9va3VwKGJ1aWx0aW5zLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyLCBOVUxMKTsKKyAgICBpZiAoaXggPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKnZhbHVlX2FkZHI7CiB9CiAKIC8qIENBVVRJT046IFB5RGljdF9TZXRJdGVtKCkgbXVzdCBndWFyYW50ZWUgdGhhdCBpdCB3b24ndCByZXNpemUgdGhlCkBAIC0xMjQ3LDE2ICsxNTA5LDggQEAKIGludAogUHlEaWN0X0RlbEl0ZW0oUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5KQogewotICAgIFB5RGljdE9iamVjdCAqbXA7CiAgICAgUHlfaGFzaF90IGhhc2g7Ci0gICAgUHlEaWN0S2V5RW50cnkgKmVwOwotICAgIFB5T2JqZWN0ICpvbGRfa2V5LCAqb2xkX3ZhbHVlOwotICAgIFB5T2JqZWN0ICoqdmFsdWVfYWRkcjsKIAotICAgIGlmICghUHlEaWN0X0NoZWNrKG9wKSkgewotICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KICAgICBhc3NlcnQoa2V5KTsKICAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkgfHwKICAgICAgICAgKGhhc2ggPSAoKFB5QVNDSUlPYmplY3QgKikga2V5KS0+aGFzaCkgPT0gLTEpIHsKQEAgLTEyNjQsMzEgKzE1MTgsMTQgQEAKICAgICAgICAgaWYgKGhhc2ggPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIG1wID0gKFB5RGljdE9iamVjdCAqKW9wOwotICAgIGVwID0gKG1wLT5tYV9rZXlzLT5ka19sb29rdXApKG1wLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyKTsKLSAgICBpZiAoZXAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmICgqdmFsdWVfYWRkciA9PSBOVUxMKSB7Ci0gICAgICAgIF9QeUVycl9TZXRLZXlFcnJvcihrZXkpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG9sZF92YWx1ZSA9ICp2YWx1ZV9hZGRyOwotICAgICp2YWx1ZV9hZGRyID0gTlVMTDsKLSAgICBtcC0+bWFfdXNlZC0tOwotICAgIGlmICghX1B5RGljdF9IYXNTcGxpdFRhYmxlKG1wKSkgewotICAgICAgICBFTlNVUkVfQUxMT1dTX0RFTEVUSU9OUyhtcCk7Ci0gICAgICAgIG9sZF9rZXkgPSBlcC0+bWVfa2V5OwotICAgICAgICBQeV9JTkNSRUYoZHVtbXkpOwotICAgICAgICBlcC0+bWVfa2V5ID0gZHVtbXk7Ci0gICAgICAgIFB5X0RFQ1JFRihvbGRfa2V5KTsKLSAgICB9Ci0gICAgUHlfREVDUkVGKG9sZF92YWx1ZSk7Ci0gICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gX1B5RGljdF9EZWxJdGVtX0tub3duSGFzaChvcCwga2V5LCBoYXNoKTsKIH0KIAogaW50CiBfUHlEaWN0X0RlbEl0ZW1fS25vd25IYXNoKFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCiB7CisgICAgUHlfc3NpemVfdCBoYXNocG9zLCBpeDsKICAgICBQeURpY3RPYmplY3QgKm1wOwogICAgIFB5RGljdEtleUVudHJ5ICplcDsKICAgICBQeU9iamVjdCAqb2xkX2tleSwgKm9sZF92YWx1ZTsKQEAgLTEzMDEsMjEgKzE1MzgsMjcgQEAKICAgICBhc3NlcnQoa2V5KTsKICAgICBhc3NlcnQoaGFzaCAhPSAtMSk7CiAgICAgbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7Ci0gICAgZXAgPSAobXAtPm1hX2tleXMtPmRrX2xvb2t1cCkobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOwotICAgIGlmIChlcCA9PSBOVUxMKQorICAgIGl4ID0gKG1wLT5tYV9rZXlzLT5ka19sb29rdXApKG1wLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyLCAmaGFzaHBvcyk7CisgICAgaWYgKGl4ID09IERLSVhfRVJST1IpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoKnZhbHVlX2FkZHIgPT0gTlVMTCkgeworICAgIGlmIChpeCA9PSBES0lYX0VNUFRZIHx8ICp2YWx1ZV9hZGRyID09IE5VTEwpIHsKICAgICAgICAgX1B5RXJyX1NldEtleUVycm9yKGtleSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CisgICAgYXNzZXJ0KGRrX2dldF9pbmRleChtcC0+bWFfa2V5cywgaGFzaHBvcykgPT0gaXgpOwogICAgIG9sZF92YWx1ZSA9ICp2YWx1ZV9hZGRyOwogICAgICp2YWx1ZV9hZGRyID0gTlVMTDsKICAgICBtcC0+bWFfdXNlZC0tOwotICAgIGlmICghX1B5RGljdF9IYXNTcGxpdFRhYmxlKG1wKSkgeworICAgIG1wLT5tYV92ZXJzaW9uX3RhZyA9IERJQ1RfTkVYVF9WRVJTSU9OKCk7CisgICAgaWYgKF9QeURpY3RfSGFzU3BsaXRUYWJsZShtcCkpIHsKKyAgICAgICAgbXAtPm1hX2tleXMtPmRrX3VzYWJsZSA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlcCA9ICZES19FTlRSSUVTKG1wLT5tYV9rZXlzKVtpeF07CisgICAgICAgIGRrX3NldF9pbmRleChtcC0+bWFfa2V5cywgaGFzaHBvcywgREtJWF9EVU1NWSk7CiAgICAgICAgIEVOU1VSRV9BTExPV1NfREVMRVRJT05TKG1wKTsKICAgICAgICAgb2xkX2tleSA9IGVwLT5tZV9rZXk7Ci0gICAgICAgIFB5X0lOQ1JFRihkdW1teSk7Ci0gICAgICAgIGVwLT5tZV9rZXkgPSBkdW1teTsKKyAgICAgICAgZXAtPm1lX2tleSA9IE5VTEw7CiAgICAgICAgIFB5X0RFQ1JFRihvbGRfa2V5KTsKICAgICB9CiAgICAgUHlfREVDUkVGKG9sZF92YWx1ZSk7CkBAIC0xMzQyLDkgKzE1ODUsMTAgQEAKICAgICBtcC0+bWFfa2V5cyA9IFB5X0VNUFRZX0tFWVM7CiAgICAgbXAtPm1hX3ZhbHVlcyA9IGVtcHR5X3ZhbHVlczsKICAgICBtcC0+bWFfdXNlZCA9IDA7CisgICAgbXAtPm1hX3ZlcnNpb25fdGFnID0gRElDVF9ORVhUX1ZFUlNJT04oKTsKICAgICAvKiAuLi50aGVuIGNsZWFyIHRoZSBrZXlzIGFuZCB2YWx1ZXMgKi8KICAgICBpZiAob2xkdmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgbiA9IERLX1NJWkUob2xka2V5cyk7CisgICAgICAgIG4gPSBvbGRrZXlzLT5ka19uZW50cmllczsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICAgIFB5X0NMRUFSKG9sZHZhbHVlc1tpXSk7CiAgICAgICAgIGZyZWVfdmFsdWVzKG9sZHZhbHVlcyk7CkBAIC0xMzU5LDMzICsxNjAzLDM2IEBACiAvKiBSZXR1cm5zIC0xIGlmIG5vIG1vcmUgaXRlbXMgKG9yIG9wIGlzIG5vdCBhIGRpY3QpLAogICogaW5kZXggb2YgaXRlbSBvdGhlcndpc2UuIFN0b3JlcyB2YWx1ZSBpbiBwdmFsdWUKICAqLwotUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCitzdGF0aWMgaW5saW5lIFB5X3NzaXplX3QKIGRpY3RfbmV4dChQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKipwdmFsdWUpCiB7Ci0gICAgUHlfc3NpemVfdCBtYXNrLCBvZmZzZXQ7CisgICAgUHlfc3NpemVfdCBuOwogICAgIFB5RGljdE9iamVjdCAqbXA7Ci0gICAgUHlPYmplY3QgKip2YWx1ZV9wdHI7Ci0KKyAgICBQeU9iamVjdCAqKnZhbHVlX3B0ciA9IE5VTEw7CiAKICAgICBpZiAoIVB5RGljdF9DaGVjayhvcCkpCiAgICAgICAgIHJldHVybiAtMTsKICAgICBtcCA9IChQeURpY3RPYmplY3QgKilvcDsKICAgICBpZiAoaSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKKworICAgIG4gPSBtcC0+bWFfa2V5cy0+ZGtfbmVudHJpZXM7CiAgICAgaWYgKG1wLT5tYV92YWx1ZXMpIHsKLSAgICAgICAgdmFsdWVfcHRyID0gJm1wLT5tYV92YWx1ZXNbaV07Ci0gICAgICAgIG9mZnNldCA9IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICAgICAgZm9yICg7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlX3B0ciA9ICZtcC0+bWFfdmFsdWVzW2ldOworICAgICAgICAgICAgaWYgKCp2YWx1ZV9wdHIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgdmFsdWVfcHRyID0gJm1wLT5tYV9rZXlzLT5ka19lbnRyaWVzW2ldLm1lX3ZhbHVlOwotICAgICAgICBvZmZzZXQgPSBzaXplb2YoUHlEaWN0S2V5RW50cnkpOworICAgICAgICBQeURpY3RLZXlFbnRyeSAqZXAwID0gREtfRU5UUklFUyhtcC0+bWFfa2V5cyk7CisgICAgICAgIGZvciAoOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB2YWx1ZV9wdHIgPSAmZXAwW2ldLm1lX3ZhbHVlOworICAgICAgICAgICAgaWYgKCp2YWx1ZV9wdHIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KLSAgICBtYXNrID0gREtfTUFTSyhtcC0+bWFfa2V5cyk7Ci0gICAgd2hpbGUgKGkgPD0gbWFzayAmJiAqdmFsdWVfcHRyID09IE5VTEwpIHsKLSAgICAgICAgdmFsdWVfcHRyID0gKFB5T2JqZWN0ICoqKSgoKGNoYXIgKil2YWx1ZV9wdHIpICsgb2Zmc2V0KTsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICBpZiAoaSA+IG1hc2spCisgICAgaWYgKGkgPj0gbikKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGlmIChwdmFsdWUpCiAgICAgICAgICpwdmFsdWUgPSAqdmFsdWVfcHRyOwpAQCAtMTQxMCwxNCArMTY1NywxNCBAQAogaW50CiBQeURpY3RfTmV4dChQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgKnBwb3MsIFB5T2JqZWN0ICoqcGtleSwgUHlPYmplY3QgKipwdmFsdWUpCiB7Ci0gICAgUHlEaWN0T2JqZWN0ICptcDsKKyAgICBQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCopb3A7CiAgICAgUHlfc3NpemVfdCBpID0gZGljdF9uZXh0KG9wLCAqcHBvcywgcHZhbHVlKTsKICAgICBpZiAoaSA8IDApCiAgICAgICAgIHJldHVybiAwOwogICAgIG1wID0gKFB5RGljdE9iamVjdCAqKW9wOwogICAgICpwcG9zID0gaSsxOwogICAgIGlmIChwa2V5KQotICAgICAgICAqcGtleSA9IG1wLT5tYV9rZXlzLT5ka19lbnRyaWVzW2ldLm1lX2tleTsKKyAgICAgICAgKnBrZXkgPSBES19FTlRSSUVTKG1wLT5tYV9rZXlzKVtpXS5tZV9rZXk7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTE0MjksMTQgKzE2NzYsMTYgQEAKICAgICAgICAgICAgICBQeU9iamVjdCAqKnB2YWx1ZSwgUHlfaGFzaF90ICpwaGFzaCkKIHsKICAgICBQeURpY3RPYmplY3QgKm1wOworICAgIFB5RGljdEtleUVudHJ5ICplcDA7CiAgICAgUHlfc3NpemVfdCBpID0gZGljdF9uZXh0KG9wLCAqcHBvcywgcHZhbHVlKTsKICAgICBpZiAoaSA8IDApCiAgICAgICAgIHJldHVybiAwOwogICAgIG1wID0gKFB5RGljdE9iamVjdCAqKW9wOworICAgIGVwMCA9IERLX0VOVFJJRVMobXAtPm1hX2tleXMpOwogICAgICpwcG9zID0gaSsxOwotICAgICpwaGFzaCA9IG1wLT5tYV9rZXlzLT5ka19lbnRyaWVzW2ldLm1lX2hhc2g7CisgICAgKnBoYXNoID0gZXAwW2ldLm1lX2hhc2g7CiAgICAgaWYgKHBrZXkpCi0gICAgICAgICpwa2V5ID0gbXAtPm1hX2tleXMtPmRrX2VudHJpZXNbaV0ubWVfa2V5OworICAgICAgICAqcGtleSA9IGVwMFtpXS5tZV9rZXk7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTE0NDUsNiArMTY5NCw3IEBACiBfUHlEaWN0X1BvcChQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqZGVmbHQpCiB7CiAgICAgUHlfaGFzaF90IGhhc2g7CisgICAgUHlfc3NpemVfdCBpeCwgaGFzaHBvczsKICAgICBQeU9iamVjdCAqb2xkX3ZhbHVlLCAqb2xkX2tleTsKICAgICBQeURpY3RLZXlFbnRyeSAqZXA7CiAgICAgUHlPYmplY3QgKip2YWx1ZV9hZGRyOwpAQCAtMTQ2MywxMSArMTcxMywxMCBAQAogICAgICAgICBpZiAoaGFzaCA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBlcCA9IChtcC0+bWFfa2V5cy0+ZGtfbG9va3VwKShtcCwga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgaWYgKGVwID09IE5VTEwpCisgICAgaXggPSAobXAtPm1hX2tleXMtPmRrX2xvb2t1cCkobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIsICZoYXNocG9zKTsKKyAgICBpZiAoaXggPT0gREtJWF9FUlJPUikKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgb2xkX3ZhbHVlID0gKnZhbHVlX2FkZHI7Ci0gICAgaWYgKG9sZF92YWx1ZSA9PSBOVUxMKSB7CisgICAgaWYgKGl4ID09IERLSVhfRU1QVFkpIHsKICAgICAgICAgaWYgKGRlZmx0KSB7CiAgICAgICAgICAgICBQeV9JTkNSRUYoZGVmbHQpOwogICAgICAgICAgICAgcmV0dXJuIGRlZmx0OwpAQCAtMTQ3NSwxMyArMTcyNCwxNyBAQAogICAgICAgICBfUHlFcnJfU2V0S2V5RXJyb3Ioa2V5KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCisgICAgb2xkX3ZhbHVlID0gKnZhbHVlX2FkZHI7CiAgICAgKnZhbHVlX2FkZHIgPSBOVUxMOwogICAgIG1wLT5tYV91c2VkLS07CisgICAgbXAtPm1hX3ZlcnNpb25fdGFnID0gRElDVF9ORVhUX1ZFUlNJT04oKTsKICAgICBpZiAoIV9QeURpY3RfSGFzU3BsaXRUYWJsZShtcCkpIHsKKyAgICAgICAgZGtfc2V0X2luZGV4KG1wLT5tYV9rZXlzLCBoYXNocG9zLCBES0lYX0RVTU1ZKTsKKyAgICAgICAgZXAgPSAmREtfRU5UUklFUyhtcC0+bWFfa2V5cylbaXhdOwogICAgICAgICBFTlNVUkVfQUxMT1dTX0RFTEVUSU9OUyhtcCk7CiAgICAgICAgIG9sZF9rZXkgPSBlcC0+bWVfa2V5OwotICAgICAgICBQeV9JTkNSRUYoZHVtbXkpOwotICAgICAgICBlcC0+bWVfa2V5ID0gZHVtbXk7CisgICAgICAgIGVwLT5tZV9rZXkgPSBOVUxMOwogICAgICAgICBQeV9ERUNSRUYob2xkX2tleSk7CiAgICAgfQogICAgIHJldHVybiBvbGRfdmFsdWU7CkBAIC0xNTA4LDcgKzE3NjEsNyBAQAogICAgICAgICAgICAgUHlPYmplY3QgKmtleTsKICAgICAgICAgICAgIFB5X2hhc2hfdCBoYXNoOwogCi0gICAgICAgICAgICBpZiAoZGljdHJlc2l6ZShtcCwgUHlfU0laRShpdGVyYWJsZSkpKSB7CisgICAgICAgICAgICBpZiAoZGljdHJlc2l6ZShtcCwgRVNUSU1BVEVfU0laRShQeV9TSVpFKGl0ZXJhYmxlKSkpKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGQpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQpAQCAtMTUyNyw3ICsxNzgwLDcgQEAKICAgICAgICAgICAgIFB5T2JqZWN0ICprZXk7CiAgICAgICAgICAgICBQeV9oYXNoX3QgaGFzaDsKIAotICAgICAgICAgICAgaWYgKGRpY3RyZXNpemUobXAsIFB5U2V0X0dFVF9TSVpFKGl0ZXJhYmxlKSkpIHsKKyAgICAgICAgICAgIGlmIChkaWN0cmVzaXplKG1wLCBFU1RJTUFURV9TSVpFKFB5U2V0X0dFVF9TSVpFKGl0ZXJhYmxlKSkpKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGQpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQpAQCAtMTU4Nyw3ICsxODQwLDcgQEAKICAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG1wKQogICAgIGlmICh2YWx1ZXMgIT0gTlVMTCkgewogICAgICAgICBpZiAodmFsdWVzICE9IGVtcHR5X3ZhbHVlcykgewotICAgICAgICAgICAgZm9yIChpID0gMCwgbiA9IERLX1NJWkUobXAtPm1hX2tleXMpOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBuID0gbXAtPm1hX2tleXMtPmRrX25lbnRyaWVzOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih2YWx1ZXNbaV0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZnJlZV92YWx1ZXModmFsdWVzKTsKQEAgLTE2OTksOCArMTk1Miw4IEBACiBkaWN0X3N1YnNjcmlwdChQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5KQogewogICAgIFB5T2JqZWN0ICp2OworICAgIFB5X3NzaXplX3QgaXg7CiAgICAgUHlfaGFzaF90IGhhc2g7Ci0gICAgUHlEaWN0S2V5RW50cnkgKmVwOwogICAgIFB5T2JqZWN0ICoqdmFsdWVfYWRkcjsKIAogICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fApAQCAtMTcwOSwxMSArMTk2MiwxMCBAQAogICAgICAgICBpZiAoaGFzaCA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBlcCA9IChtcC0+bWFfa2V5cy0+ZGtfbG9va3VwKShtcCwga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgaWYgKGVwID09IE5VTEwpCisgICAgaXggPSAobXAtPm1hX2tleXMtPmRrX2xvb2t1cCkobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIsIE5VTEwpOworICAgIGlmIChpeCA9PSBES0lYX0VSUk9SKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB2ID0gKnZhbHVlX2FkZHI7Ci0gICAgaWYgKHYgPT0gTlVMTCkgeworICAgIGlmIChpeCA9PSBES0lYX0VNUFRZIHx8ICp2YWx1ZV9hZGRyID09IE5VTEwpIHsKICAgICAgICAgaWYgKCFQeURpY3RfQ2hlY2tFeGFjdChtcCkpIHsKICAgICAgICAgICAgIC8qIExvb2sgdXAgX19taXNzaW5nX18gbWV0aG9kIGlmIHdlJ3JlIGEgc3ViY2xhc3MuICovCiAgICAgICAgICAgICBQeU9iamVjdCAqbWlzc2luZywgKnJlczsKQEAgLTE3MzEsOCArMTk4Myw4IEBACiAgICAgICAgIF9QeUVycl9TZXRLZXlFcnJvcihrZXkpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZWxzZQotICAgICAgICBQeV9JTkNSRUYodik7CisgICAgdiA9ICp2YWx1ZV9hZGRyOworICAgIFB5X0lOQ1JFRih2KTsKICAgICByZXR1cm4gdjsKIH0KIApAQCAtMTc3Miw4ICsyMDI0LDggQEAKICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICBnb3RvIGFnYWluOwogICAgIH0KLSAgICBlcCA9ICZtcC0+bWFfa2V5cy0+ZGtfZW50cmllc1swXTsKLSAgICBzaXplID0gREtfU0laRShtcC0+bWFfa2V5cyk7CisgICAgZXAgPSBES19FTlRSSUVTKG1wLT5tYV9rZXlzKTsKKyAgICBzaXplID0gbXAtPm1hX2tleXMtPmRrX25lbnRyaWVzOwogICAgIGlmIChtcC0+bWFfdmFsdWVzKSB7CiAgICAgICAgIHZhbHVlX3B0ciA9IG1wLT5tYV92YWx1ZXM7CiAgICAgICAgIG9mZnNldCA9IHNpemVvZihQeU9iamVjdCAqKTsKQEAgLTE4MDAsNiArMjA1Miw3IEBACiB7CiAgICAgUHlPYmplY3QgKnY7CiAgICAgUHlfc3NpemVfdCBpLCBqOworICAgIFB5RGljdEtleUVudHJ5ICplcDsKICAgICBQeV9zc2l6ZV90IHNpemUsIG4sIG9mZnNldDsKICAgICBQeU9iamVjdCAqKnZhbHVlX3B0cjsKIApAQCAtMTgxNSwxMyArMjA2OCwxNCBAQAogICAgICAgICBQeV9ERUNSRUYodik7CiAgICAgICAgIGdvdG8gYWdhaW47CiAgICAgfQotICAgIHNpemUgPSBES19TSVpFKG1wLT5tYV9rZXlzKTsKKyAgICBlcCA9IERLX0VOVFJJRVMobXAtPm1hX2tleXMpOworICAgIHNpemUgPSBtcC0+bWFfa2V5cy0+ZGtfbmVudHJpZXM7CiAgICAgaWYgKG1wLT5tYV92YWx1ZXMpIHsKICAgICAgICAgdmFsdWVfcHRyID0gbXAtPm1hX3ZhbHVlczsKICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKFB5T2JqZWN0ICopOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgdmFsdWVfcHRyID0gJm1wLT5tYV9rZXlzLT5ka19lbnRyaWVzWzBdLm1lX3ZhbHVlOworICAgICAgICB2YWx1ZV9wdHIgPSAmZXBbMF0ubWVfdmFsdWU7CiAgICAgICAgIG9mZnNldCA9IHNpemVvZihQeURpY3RLZXlFbnRyeSk7CiAgICAgfQogICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CkBAIC0xODcyLDggKzIxMjYsOCBAQAogICAgICAgICBnb3RvIGFnYWluOwogICAgIH0KICAgICAvKiBOb3RoaW5nIHdlIGRvIGJlbG93IG1ha2VzIGFueSBmdW5jdGlvbiBjYWxscy4gKi8KLSAgICBlcCA9IG1wLT5tYV9rZXlzLT5ka19lbnRyaWVzOwotICAgIHNpemUgPSBES19TSVpFKG1wLT5tYV9rZXlzKTsKKyAgICBlcCA9IERLX0VOVFJJRVMobXAtPm1hX2tleXMpOworICAgIHNpemUgPSBtcC0+bWFfa2V5cy0+ZGtfbmVudHJpZXM7CiAgICAgaWYgKG1wLT5tYV92YWx1ZXMpIHsKICAgICAgICAgdmFsdWVfcHRyID0gbXAtPm1hX3ZhbHVlczsKICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKFB5T2JqZWN0ICopOwpAQCAtMTkxNyw3ICsyMTcxLDggQEAKIH0KIAogc3RhdGljIGludAotZGljdF91cGRhdGVfY29tbW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMsIGNoYXIgKm1ldGhuYW1lKQorZGljdF91cGRhdGVfY29tbW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWV0aG5hbWUpCiB7CiAgICAgUHlPYmplY3QgKmFyZyA9IE5VTEw7CiAgICAgaW50IHJlc3VsdCA9IDA7CkBAIC0yMDQwLDcgKzIyOTUsNyBAQAogewogICAgIFB5RGljdE9iamVjdCAqbXAsICpvdGhlcjsKICAgICBQeV9zc2l6ZV90IGksIG47Ci0gICAgUHlEaWN0S2V5RW50cnkgKmVudHJ5OworICAgIFB5RGljdEtleUVudHJ5ICplbnRyeSwgKmVwMDsKIAogICAgIC8qIFdlIGFjY2VwdCBmb3IgdGhlIGFyZ3VtZW50IGVpdGhlciBhIGNvbmNyZXRlIGRpY3Rpb25hcnkgb2JqZWN0LAogICAgICAqIG9yIGFuIGFic3RyYWN0ICJtYXBwaW5nIiBvYmplY3QuICBGb3IgdGhlIGZvcm1lciwgd2UgY2FuIGRvCkBAIC0yMDcwLDEwICsyMzI1LDExIEBACiAgICAgICAgIGlmIChtcC0+bWFfa2V5cy0+ZGtfdXNhYmxlICogMyA8IG90aGVyLT5tYV91c2VkICogMikKICAgICAgICAgICAgIGlmIChkaWN0cmVzaXplKG1wLCAobXAtPm1hX3VzZWQgKyBvdGhlci0+bWFfdXNlZCkqMikgIT0gMCkKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgZm9yIChpID0gMCwgbiA9IERLX1NJWkUob3RoZXItPm1hX2tleXMpOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGVwMCA9IERLX0VOVFJJRVMob3RoZXItPm1hX2tleXMpOworICAgICAgICBmb3IgKGkgPSAwLCBuID0gb3RoZXItPm1hX2tleXMtPmRrX25lbnRyaWVzOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CiAgICAgICAgICAgICBQeV9oYXNoX3QgaGFzaDsKLSAgICAgICAgICAgIGVudHJ5ID0gJm90aGVyLT5tYV9rZXlzLT5ka19lbnRyaWVzW2ldOworICAgICAgICAgICAgZW50cnkgPSAmZXAwW2ldOwogICAgICAgICAgICAga2V5ID0gZW50cnktPm1lX2tleTsKICAgICAgICAgICAgIGhhc2ggPSBlbnRyeS0+bWVfaGFzaDsKICAgICAgICAgICAgIGlmIChvdGhlci0+bWFfdmFsdWVzKQpAQCAtMjA5Miw3ICsyMzQ4LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAotICAgICAgICAgICAgICAgIGlmIChuICE9IERLX1NJWkUob3RoZXItPm1hX2tleXMpKSB7CisgICAgICAgICAgICAgICAgaWYgKG4gIT0gb3RoZXItPm1hX2tleXMtPmRrX25lbnRyaWVzKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGljdCBtdXRhdGVkIGR1cmluZyB1cGRhdGUiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjE2Nyw3ICsyNDIzLDkgQEAKICAgICBtcCA9IChQeURpY3RPYmplY3QgKilvOwogICAgIGlmIChfUHlEaWN0X0hhc1NwbGl0VGFibGUobXApKSB7CiAgICAgICAgIFB5RGljdE9iamVjdCAqc3BsaXRfY29weTsKLSAgICAgICAgUHlPYmplY3QgKipuZXd2YWx1ZXMgPSBuZXdfdmFsdWVzKERLX1NJWkUobXAtPm1hX2tleXMpKTsKKyAgICAgICAgUHlfc3NpemVfdCBzaXplID0gVVNBQkxFX0ZSQUNUSU9OKERLX1NJWkUobXAtPm1hX2tleXMpKTsKKyAgICAgICAgUHlPYmplY3QgKipuZXd2YWx1ZXM7CisgICAgICAgIG5ld3ZhbHVlcyA9IG5ld192YWx1ZXMoc2l6ZSk7CiAgICAgICAgIGlmIChuZXd2YWx1ZXMgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICBzcGxpdF9jb3B5ID0gUHlPYmplY3RfR0NfTmV3KFB5RGljdE9iamVjdCwgJlB5RGljdF9UeXBlKTsKQEAgLTIxNzksNyArMjQzNyw3IEBACiAgICAgICAgIHNwbGl0X2NvcHktPm1hX2tleXMgPSBtcC0+bWFfa2V5czsKICAgICAgICAgc3BsaXRfY29weS0+bWFfdXNlZCA9IG1wLT5tYV91c2VkOwogICAgICAgICBES19JTkNSRUYobXAtPm1hX2tleXMpOwotICAgICAgICBmb3IgKGkgPSAwLCBuID0gREtfU0laRShtcC0+bWFfa2V5cyk7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZm9yIChpID0gMCwgbiA9IHNpemU7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IG1wLT5tYV92YWx1ZXNbaV07CiAgICAgICAgICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKICAgICAgICAgICAgIHNwbGl0X2NvcHktPm1hX3ZhbHVlc1tpXSA9IHZhbHVlOwpAQCAtMjI1MCw4ICsyNTA4LDggQEAKICAgICAgICAgLyogY2FuJ3QgYmUgZXF1YWwgaWYgIyBvZiBlbnRyaWVzIGRpZmZlciAqLwogICAgICAgICByZXR1cm4gMDsKICAgICAvKiBTYW1lICMgb2YgZW50cmllcyAtLSBjaGVjayBhbGwgb2YgJ2VtLiAgRXhpdCBlYXJseSBvbiBhbnkgZGlmZi4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgREtfU0laRShhLT5tYV9rZXlzKTsgaSsrKSB7Ci0gICAgICAgIFB5RGljdEtleUVudHJ5ICplcCA9ICZhLT5tYV9rZXlzLT5ka19lbnRyaWVzW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCBhLT5tYV9rZXlzLT5ka19uZW50cmllczsgaSsrKSB7CisgICAgICAgIFB5RGljdEtleUVudHJ5ICplcCA9ICZES19FTlRSSUVTKGEtPm1hX2tleXMpW2ldOwogICAgICAgICBQeU9iamVjdCAqYXZhbDsKICAgICAgICAgaWYgKGEtPm1hX3ZhbHVlcykKICAgICAgICAgICAgIGF2YWwgPSBhLT5tYV92YWx1ZXNbaV07CkBAIC0yMjY4LDcgKzI1MjYsNyBAQAogICAgICAgICAgICAgLyogZGl0dG8gZm9yIGtleSAqLwogICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7CiAgICAgICAgICAgICAvKiByZXVzZSB0aGUga25vd24gaGFzaCB2YWx1ZSAqLwotICAgICAgICAgICAgaWYgKChiLT5tYV9rZXlzLT5ka19sb29rdXApKGIsIGtleSwgZXAtPm1lX2hhc2gsICZ2YWRkcikgPT0gTlVMTCkKKyAgICAgICAgICAgIGlmICgoYi0+bWFfa2V5cy0+ZGtfbG9va3VwKShiLCBrZXksIGVwLT5tZV9oYXNoLCAmdmFkZHIsIE5VTEwpIDwgMCkKICAgICAgICAgICAgICAgICBidmFsID0gTlVMTDsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBidmFsID0gKnZhZGRyOwpAQCAtMjMyNiw3ICsyNTg0LDcgQEAKIHsKICAgICByZWdpc3RlciBQeURpY3RPYmplY3QgKm1wID0gc2VsZjsKICAgICBQeV9oYXNoX3QgaGFzaDsKLSAgICBQeURpY3RLZXlFbnRyeSAqZXA7CisgICAgUHlfc3NpemVfdCBpeDsKICAgICBQeU9iamVjdCAqKnZhbHVlX2FkZHI7CiAKICAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkgfHwKQEAgLTIzMzUsMTAgKzI1OTMsMTIgQEAKICAgICAgICAgaWYgKGhhc2ggPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZXAgPSAobXAtPm1hX2tleXMtPmRrX2xvb2t1cCkobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOwotICAgIGlmIChlcCA9PSBOVUxMKQorICAgIGl4ID0gKG1wLT5tYV9rZXlzLT5ka19sb29rdXApKG1wLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyLCBOVUxMKTsKKyAgICBpZiAoaXggPT0gREtJWF9FUlJPUikKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygqdmFsdWVfYWRkciAhPSBOVUxMKTsKKyAgICBpZiAoaXggPT0gREtJWF9FTVBUWSB8fCAqdmFsdWVfYWRkciA9PSBOVUxMKQorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0yMzQ4LDcgKzI2MDgsNyBAQAogICAgIFB5T2JqZWN0ICpmYWlsb2JqID0gUHlfTm9uZTsKICAgICBQeU9iamVjdCAqdmFsID0gTlVMTDsKICAgICBQeV9oYXNoX3QgaGFzaDsKLSAgICBQeURpY3RLZXlFbnRyeSAqZXA7CisgICAgUHlfc3NpemVfdCBpeDsKICAgICBQeU9iamVjdCAqKnZhbHVlX2FkZHI7CiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJnZXQiLCAxLCAyLCAma2V5LCAmZmFpbG9iaikpCkBAIC0yMzYwLDEyICsyNjIwLDEzIEBACiAgICAgICAgIGlmIChoYXNoID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGVwID0gKG1wLT5tYV9rZXlzLT5ka19sb29rdXApKG1wLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyKTsKLSAgICBpZiAoZXAgPT0gTlVMTCkKKyAgICBpeCA9IChtcC0+bWFfa2V5cy0+ZGtfbG9va3VwKShtcCwga2V5LCBoYXNoLCAmdmFsdWVfYWRkciwgTlVMTCk7CisgICAgaWYgKGl4ID09IERLSVhfRVJST1IpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHZhbCA9ICp2YWx1ZV9hZGRyOwotICAgIGlmICh2YWwgPT0gTlVMTCkKKyAgICBpZiAoaXggPT0gREtJWF9FTVBUWSB8fCAqdmFsdWVfYWRkciA9PSBOVUxMKQogICAgICAgICB2YWwgPSBmYWlsb2JqOworICAgIGVsc2UKKyAgICAgICAgdmFsID0gKnZhbHVlX2FkZHI7CiAgICAgUHlfSU5DUkVGKHZhbCk7CiAgICAgcmV0dXJuIHZhbDsKIH0KQEAgLTIzNzYsNiArMjYzNyw3IEBACiAgICAgUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilkOwogICAgIFB5T2JqZWN0ICp2YWwgPSBOVUxMOwogICAgIFB5X2hhc2hfdCBoYXNoOworICAgIFB5X3NzaXplX3QgaGFzaHBvcywgaXg7CiAgICAgUHlEaWN0S2V5RW50cnkgKmVwOwogICAgIFB5T2JqZWN0ICoqdmFsdWVfYWRkcjsKIApAQCAtMjM4OSwyNyArMjY1MSwzOCBAQAogICAgICAgICBpZiAoaGFzaCA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBlcCA9IChtcC0+bWFfa2V5cy0+ZGtfbG9va3VwKShtcCwga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgaWYgKGVwID09IE5VTEwpCisgICAgaXggPSAobXAtPm1hX2tleXMtPmRrX2xvb2t1cCkobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIsICZoYXNocG9zKTsKKyAgICBpZiAoaXggPT0gREtJWF9FUlJPUikKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgdmFsID0gKnZhbHVlX2FkZHI7Ci0gICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgaWYgKGl4ID09IERLSVhfRU1QVFkgfHwgKnZhbHVlX2FkZHIgPT0gTlVMTCkgeworICAgICAgICB2YWwgPSBkZWZhdWx0b2JqOwogICAgICAgICBpZiAobXAtPm1hX2tleXMtPmRrX3VzYWJsZSA8PSAwKSB7CiAgICAgICAgICAgICAvKiBOZWVkIHRvIHJlc2l6ZS4gKi8KICAgICAgICAgICAgIGlmIChpbnNlcnRpb25fcmVzaXplKG1wKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBlcCA9IGZpbmRfZW1wdHlfc2xvdChtcCwga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7CisgICAgICAgICAgICBmaW5kX2VtcHR5X3Nsb3QobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIsICZoYXNocG9zKTsKICAgICAgICAgfQorICAgICAgICBpeCA9IG1wLT5tYV9rZXlzLT5ka19uZW50cmllczsKICAgICAgICAgUHlfSU5DUkVGKGRlZmF1bHRvYmopOwogICAgICAgICBQeV9JTkNSRUYoa2V5KTsKICAgICAgICAgTUFJTlRBSU5fVFJBQ0tJTkcobXAsIGtleSwgZGVmYXVsdG9iaik7CisgICAgICAgIGRrX3NldF9pbmRleChtcC0+bWFfa2V5cywgaGFzaHBvcywgaXgpOworICAgICAgICBlcCA9ICZES19FTlRSSUVTKG1wLT5tYV9rZXlzKVtpeF07CiAgICAgICAgIGVwLT5tZV9rZXkgPSBrZXk7CiAgICAgICAgIGVwLT5tZV9oYXNoID0gaGFzaDsKLSAgICAgICAgKnZhbHVlX2FkZHIgPSBkZWZhdWx0b2JqOwotICAgICAgICB2YWwgPSBkZWZhdWx0b2JqOworICAgICAgICBpZiAobXAtPm1hX3ZhbHVlcykgeworICAgICAgICAgICAgbXAtPm1hX3ZhbHVlc1tpeF0gPSB2YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBlcC0+bWVfdmFsdWUgPSB2YWw7CisgICAgICAgIH0KICAgICAgICAgbXAtPm1hX2tleXMtPmRrX3VzYWJsZS0tOworICAgICAgICBtcC0+bWFfa2V5cy0+ZGtfbmVudHJpZXMrKzsKICAgICAgICAgbXAtPm1hX3VzZWQrKzsKKyAgICAgICAgbXAtPm1hX3ZlcnNpb25fdGFnID0gRElDVF9ORVhUX1ZFUlNJT04oKTsKICAgICB9CisgICAgZWxzZQorICAgICAgICB2YWwgPSAqdmFsdWVfYWRkcjsKICAgICByZXR1cm4gdmFsOwogfQogCkBAIC0yNDQ4LDExICsyNzIxLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9wb3BpdGVtKFB5RGljdE9iamVjdCAqbXApCiB7Ci0gICAgUHlfaGFzaF90IGkgPSAwOwotICAgIFB5RGljdEtleUVudHJ5ICplcDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CisgICAgUHlEaWN0S2V5RW50cnkgKmVwMCwgKmVwOwogICAgIFB5T2JqZWN0ICpyZXM7CiAKLQogICAgIC8qIEFsbG9jYXRlIHRoZSByZXN1bHQgdHVwbGUgYmVmb3JlIGNoZWNraW5nIHRoZSBzaXplLiAgQmVsaWV2ZSBpdAogICAgICAqIG9yIG5vdCwgdGhpcyBhbGxvY2F0aW9uIGNvdWxkIHRyaWdnZXIgYSBnYXJiYWdlIGNvbGxlY3Rpb24gd2hpY2gKICAgICAgKiBjb3VsZCBlbXB0eSB0aGUgZGljdCwgc28gaWYgd2UgY2hlY2tlZCB0aGUgc2l6ZSBmaXJzdCBhbmQgdGhhdApAQCAtMjQ3OSw2MSArMjc1MSw1NyBAQAogICAgICAgICB9CiAgICAgfQogICAgIEVOU1VSRV9BTExPV1NfREVMRVRJT05TKG1wKTsKLSAgICAvKiBTZXQgZXAgdG8gInRoZSBmaXJzdCIgZGljdCBlbnRyeSB3aXRoIGEgdmFsdWUuICBXZSBhYnVzZSB0aGUgaGFzaAotICAgICAqIGZpZWxkIG9mIHNsb3QgMCB0byBob2xkIGEgc2VhcmNoIGZpbmdlcjoKLSAgICAgKiBJZiBzbG90IDAgaGFzIGEgdmFsdWUsIHVzZSBzbG90IDAuCi0gICAgICogRWxzZSBzbG90IDAgaXMgYmVpbmcgdXNlZCB0byBob2xkIGEgc2VhcmNoIGZpbmdlciwKLSAgICAgKiBhbmQgd2UgdXNlIGl0cyBoYXNoIHZhbHVlIGFzIHRoZSBmaXJzdCBpbmRleCB0byBsb29rLgotICAgICAqLwotICAgIGVwID0gJm1wLT5tYV9rZXlzLT5ka19lbnRyaWVzWzBdOwotICAgIGlmIChlcC0+bWVfdmFsdWUgPT0gTlVMTCkgewotICAgICAgICBQeV9zc2l6ZV90IG1hc2sgPSBES19NQVNLKG1wLT5tYV9rZXlzKTsKLSAgICAgICAgaSA9IGVwLT5tZV9oYXNoOwotICAgICAgICAvKiBUaGUgaGFzaCBmaWVsZCBtYXkgYmUgYSByZWFsIGhhc2ggdmFsdWUsIG9yIGl0IG1heSBiZSBhCi0gICAgICAgICAqIGxlZ2l0IHNlYXJjaCBmaW5nZXIsIG9yIGl0IG1heSBiZSBhIG9uY2UtbGVnaXQgc2VhcmNoCi0gICAgICAgICAqIGZpbmdlciB0aGF0J3Mgb3V0IG9mIGJvdW5kcyBub3cgYmVjYXVzZSBpdCB3cmFwcGVkIGFyb3VuZAotICAgICAgICAgKiBvciB0aGUgdGFibGUgc2hydW5rIC0tIHNpbXBseSBtYWtlIHN1cmUgaXQncyBpbiBib3VuZHMgbm93LgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGkgPiBtYXNrIHx8IGkgPCAxKQotICAgICAgICAgICAgaSA9IDE7ICAgICAgICAgICAgICAvKiBza2lwIHNsb3QgMCAqLwotICAgICAgICB3aGlsZSAoKGVwID0gJm1wLT5tYV9rZXlzLT5ka19lbnRyaWVzW2ldKS0+bWVfdmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgaWYgKGkgPiBtYXNrKQotICAgICAgICAgICAgICAgIGkgPSAxOwotICAgICAgICB9CisKKyAgICAvKiBQb3AgbGFzdCBpdGVtICovCisgICAgZXAwID0gREtfRU5UUklFUyhtcC0+bWFfa2V5cyk7CisgICAgaSA9IG1wLT5tYV9rZXlzLT5ka19uZW50cmllcyAtIDE7CisgICAgd2hpbGUgKGkgPj0gMCAmJiBlcDBbaV0ubWVfdmFsdWUgPT0gTlVMTCkgeworICAgICAgICBpLS07CiAgICAgfQorICAgIGFzc2VydChpID49IDApOworCisgICAgZXAgPSAmZXAwW2ldOworICAgIGogPSBsb29rZGljdF9pbmRleChtcC0+bWFfa2V5cywgZXAtPm1lX2hhc2gsIGkpOworICAgIGFzc2VydChqID49IDApOworICAgIGFzc2VydChka19nZXRfaW5kZXgobXAtPm1hX2tleXMsIGopID09IGkpOworICAgIGRrX3NldF9pbmRleChtcC0+bWFfa2V5cywgaiwgREtJWF9EVU1NWSk7CisKICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlcywgMCwgZXAtPm1lX2tleSk7CiAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXMsIDEsIGVwLT5tZV92YWx1ZSk7Ci0gICAgUHlfSU5DUkVGKGR1bW15KTsKLSAgICBlcC0+bWVfa2V5ID0gZHVtbXk7CisgICAgZXAtPm1lX2tleSA9IE5VTEw7CiAgICAgZXAtPm1lX3ZhbHVlID0gTlVMTDsKKyAgICAvKiBXZSBjYW4ndCBka191c2FibGUrKyBzaW5jZSB0aGVyZSBpcyBES0lYX0RVTU1ZIGluIGluZGljZXMgKi8KKyAgICBtcC0+bWFfa2V5cy0+ZGtfbmVudHJpZXMgPSBpOwogICAgIG1wLT5tYV91c2VkLS07Ci0gICAgYXNzZXJ0KG1wLT5tYV9rZXlzLT5ka19lbnRyaWVzWzBdLm1lX3ZhbHVlID09IE5VTEwpOwotICAgIG1wLT5tYV9rZXlzLT5ka19lbnRyaWVzWzBdLm1lX2hhc2ggPSBpICsgMTsgIC8qIG5leHQgcGxhY2UgdG8gc3RhcnQgKi8KKyAgICBtcC0+bWFfdmVyc2lvbl90YWcgPSBESUNUX05FWFRfVkVSU0lPTigpOwogICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIGRpY3RfdHJhdmVyc2UoUHlPYmplY3QgKm9wLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLSAgICBQeV9zc2l6ZV90IGksIG47CiAgICAgUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilvcDsKLSAgICBpZiAobXAtPm1hX2tleXMtPmRrX2xvb2t1cCA9PSBsb29rZGljdCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgREtfU0laRShtcC0+bWFfa2V5cyk7IGkrKykgewotICAgICAgICAgICAgaWYgKG1wLT5tYV9rZXlzLT5ka19lbnRyaWVzW2ldLm1lX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9WSVNJVChtcC0+bWFfa2V5cy0+ZGtfZW50cmllc1tpXS5tZV92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgUHlfVklTSVQobXAtPm1hX2tleXMtPmRrX2VudHJpZXNbaV0ubWVfa2V5KTsKKyAgICBQeURpY3RLZXlzT2JqZWN0ICprZXlzID0gbXAtPm1hX2tleXM7CisgICAgUHlEaWN0S2V5RW50cnkgKmVudHJpZXMgPSBES19FTlRSSUVTKG1wLT5tYV9rZXlzKTsKKyAgICBQeV9zc2l6ZV90IGksIG4gPSBrZXlzLT5ka19uZW50cmllczsKKworICAgIGlmIChrZXlzLT5ka19sb29rdXAgPT0gbG9va2RpY3QpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgaWYgKGVudHJpZXNbaV0ubWVfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X1ZJU0lUKGVudHJpZXNbaV0ubWVfdmFsdWUpOworICAgICAgICAgICAgICAgIFB5X1ZJU0lUKGVudHJpZXNbaV0ubWVfa2V5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgfQorICAgIGVsc2UgewogICAgICAgICBpZiAobXAtPm1hX3ZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwLCBuID0gREtfU0laRShtcC0+bWFfa2V5cyk7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgICBQeV9WSVNJVChtcC0+bWFfdmFsdWVzW2ldKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDAsIG4gPSBES19TSVpFKG1wLT5tYV9rZXlzKTsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIFB5X1ZJU0lUKG1wLT5tYV9rZXlzLT5ka19lbnRyaWVzW2ldLm1lX3ZhbHVlKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBQeV9WSVNJVChlbnRyaWVzW2ldLm1lX3ZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI1NTIsMjMgKzI4MjAsMzEgQEAKIFB5X3NzaXplX3QKIF9QeURpY3RfU2l6ZU9mKFB5RGljdE9iamVjdCAqbXApCiB7Ci0gICAgUHlfc3NpemVfdCBzaXplLCByZXM7CisgICAgUHlfc3NpemVfdCBzaXplLCB1c2FibGUsIHJlczsKIAogICAgIHNpemUgPSBES19TSVpFKG1wLT5tYV9rZXlzKTsKKyAgICB1c2FibGUgPSBVU0FCTEVfRlJBQ1RJT04oc2l6ZSk7CisKICAgICByZXMgPSBfUHlPYmplY3RfU0laRShQeV9UWVBFKG1wKSk7CiAgICAgaWYgKG1wLT5tYV92YWx1ZXMpCi0gICAgICAgIHJlcyArPSBzaXplICogc2l6ZW9mKFB5T2JqZWN0Kik7CisgICAgICAgIHJlcyArPSB1c2FibGUgKiBzaXplb2YoUHlPYmplY3QqKTsKICAgICAvKiBJZiB0aGUgZGljdGlvbmFyeSBpcyBzcGxpdCwgdGhlIGtleXMgcG9ydGlvbiBpcyBhY2NvdW50ZWQtZm9yCiAgICAgICAgaW4gdGhlIHR5cGUgb2JqZWN0LiAqLwogICAgIGlmIChtcC0+bWFfa2V5cy0+ZGtfcmVmY250ID09IDEpCi0gICAgICAgIHJlcyArPSBzaXplb2YoUHlEaWN0S2V5c09iamVjdCkgKyAoc2l6ZS0xKSAqIHNpemVvZihQeURpY3RLZXlFbnRyeSk7CisgICAgICAgIHJlcyArPSAoc2l6ZW9mKFB5RGljdEtleXNPYmplY3QpCisgICAgICAgICAgICAgICAgLSBQeV9NRU1CRVJfU0laRShQeURpY3RLZXlzT2JqZWN0LCBka19pbmRpY2VzKQorICAgICAgICAgICAgICAgICsgREtfSVhTSVpFKG1wLT5tYV9rZXlzKSAqIHNpemUKKyAgICAgICAgICAgICAgICArIHNpemVvZihQeURpY3RLZXlFbnRyeSkgKiB1c2FibGUpOwogICAgIHJldHVybiByZXM7CiB9CiAKIFB5X3NzaXplX3QKIF9QeURpY3RfS2V5c1NpemUoUHlEaWN0S2V5c09iamVjdCAqa2V5cykKIHsKLSAgICByZXR1cm4gc2l6ZW9mKFB5RGljdEtleXNPYmplY3QpICsgKERLX1NJWkUoa2V5cyktMSkgKiBzaXplb2YoUHlEaWN0S2V5RW50cnkpOworICAgIHJldHVybiAoc2l6ZW9mKFB5RGljdEtleXNPYmplY3QpCisgICAgICAgICAgICAtIFB5X01FTUJFUl9TSVpFKFB5RGljdEtleXNPYmplY3QsIGRrX2luZGljZXMpCisgICAgICAgICAgICArIERLX0lYU0laRShrZXlzKSAqIERLX1NJWkUoa2V5cykKKyAgICAgICAgICAgICsgVVNBQkxFX0ZSQUNUSU9OKERLX1NJWkUoa2V5cykpICogc2l6ZW9mKFB5RGljdEtleUVudHJ5KSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0yNjU1LDggKzI5MzEsOCBAQAogUHlEaWN0X0NvbnRhaW5zKFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKmtleSkKIHsKICAgICBQeV9oYXNoX3QgaGFzaDsKKyAgICBQeV9zc2l6ZV90IGl4OwogICAgIFB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7Ci0gICAgUHlEaWN0S2V5RW50cnkgKmVwOwogICAgIFB5T2JqZWN0ICoqdmFsdWVfYWRkcjsKIAogICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fApAQCAtMjY2NSw4ICsyOTQxLDEwIEBACiAgICAgICAgIGlmIChoYXNoID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBlcCA9IChtcC0+bWFfa2V5cy0+ZGtfbG9va3VwKShtcCwga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgcmV0dXJuIChlcCA9PSBOVUxMKSA/IC0xIDogKCp2YWx1ZV9hZGRyICE9IE5VTEwpOworICAgIGl4ID0gKG1wLT5tYV9rZXlzLT5ka19sb29rdXApKG1wLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyLCBOVUxMKTsKKyAgICBpZiAoaXggPT0gREtJWF9FUlJPUikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAoaXggIT0gREtJWF9FTVBUWSAmJiAqdmFsdWVfYWRkciAhPSBOVUxMKTsKIH0KIAogLyogSW50ZXJuYWwgdmVyc2lvbiBvZiBQeURpY3RfQ29udGFpbnMgdXNlZCB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIGFscmVhZHkga25vd24gKi8KQEAgLTI2NzQsMTEgKzI5NTIsMTMgQEAKIF9QeURpY3RfQ29udGFpbnMoUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKIHsKICAgICBQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKW9wOwotICAgIFB5RGljdEtleUVudHJ5ICplcDsKICAgICBQeU9iamVjdCAqKnZhbHVlX2FkZHI7CisgICAgUHlfc3NpemVfdCBpeDsKIAotICAgIGVwID0gKG1wLT5tYV9rZXlzLT5ka19sb29rdXApKG1wLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyKTsKLSAgICByZXR1cm4gKGVwID09IE5VTEwpID8gLTEgOiAoKnZhbHVlX2FkZHIgIT0gTlVMTCk7CisgICAgaXggPSAobXAtPm1hX2tleXMtPmRrX2xvb2t1cCkobXAsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIsIE5VTEwpOworICAgIGlmIChpeCA9PSBES0lYX0VSUk9SKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIChpeCAhPSBES0lYX0VNUFRZICYmICp2YWx1ZV9hZGRyICE9IE5VTEwpOwogfQogCiAvKiBIYWNrIHRvIGltcGxlbWVudCAia2V5IGluIGRpY3QiICovCkBAIC0yNzEyLDcgKzI5OTIsOCBAQAogICAgICAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhkKTsKIAogICAgIGQtPm1hX3VzZWQgPSAwOwotICAgIGQtPm1hX2tleXMgPSBuZXdfa2V5c19vYmplY3QoUHlEaWN0X01JTlNJWkVfQ09NQklORUQpOworICAgIGQtPm1hX3ZlcnNpb25fdGFnID0gRElDVF9ORVhUX1ZFUlNJT04oKTsKKyAgICBkLT5tYV9rZXlzID0gbmV3X2tleXNfb2JqZWN0KFB5RGljdF9NSU5TSVpFKTsKICAgICBpZiAoZC0+bWFfa2V5cyA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yOTQwLDcgKzMyMjEsNyBAQAogc3RhdGljIFB5T2JqZWN0ICpkaWN0aXRlcl9pdGVybmV4dGtleShkaWN0aXRlcm9iamVjdCAqZGkpCiB7CiAgICAgUHlPYmplY3QgKmtleTsKLSAgICBQeV9zc2l6ZV90IGksIG1hc2ssIG9mZnNldDsKKyAgICBQeV9zc2l6ZV90IGksIG4sIG9mZnNldDsKICAgICBQeURpY3RLZXlzT2JqZWN0ICprOwogICAgIFB5RGljdE9iamVjdCAqZCA9IGRpLT5kaV9kaWN0OwogICAgIFB5T2JqZWN0ICoqdmFsdWVfcHRyOwpAQCAtMjk2NSwxOSArMzI0NiwxOSBAQAogICAgICAgICBvZmZzZXQgPSBzaXplb2YoUHlPYmplY3QgKik7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICB2YWx1ZV9wdHIgPSAmay0+ZGtfZW50cmllc1tpXS5tZV92YWx1ZTsKKyAgICAgICAgdmFsdWVfcHRyID0gJkRLX0VOVFJJRVMoaylbaV0ubWVfdmFsdWU7CiAgICAgICAgIG9mZnNldCA9IHNpemVvZihQeURpY3RLZXlFbnRyeSk7CiAgICAgfQotICAgIG1hc2sgPSBES19TSVpFKGspLTE7Ci0gICAgd2hpbGUgKGkgPD0gbWFzayAmJiAqdmFsdWVfcHRyID09IE5VTEwpIHsKKyAgICBuID0gay0+ZGtfbmVudHJpZXMgLSAxOworICAgIHdoaWxlIChpIDw9IG4gJiYgKnZhbHVlX3B0ciA9PSBOVUxMKSB7CiAgICAgICAgIHZhbHVlX3B0ciA9IChQeU9iamVjdCAqKikoKChjaGFyICopdmFsdWVfcHRyKSArIG9mZnNldCk7CiAgICAgICAgIGkrKzsKICAgICB9CiAgICAgZGktPmRpX3BvcyA9IGkrMTsKLSAgICBpZiAoaSA+IG1hc2spCisgICAgaWYgKGkgPiBuKQogICAgICAgICBnb3RvIGZhaWw7CiAgICAgZGktPmxlbi0tOwotICAgIGtleSA9IGstPmRrX2VudHJpZXNbaV0ubWVfa2V5OworICAgIGtleSA9IERLX0VOVFJJRVMoaylbaV0ubWVfa2V5OwogICAgIFB5X0lOQ1JFRihrZXkpOwogICAgIHJldHVybiBrZXk7CiAKQEAgLTMwMjMsNyArMzMwNCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKmRpY3RpdGVyX2l0ZXJuZXh0dmFsdWUoZGljdGl0ZXJvYmplY3QgKmRpKQogewogICAgIFB5T2JqZWN0ICp2YWx1ZTsKLSAgICBQeV9zc2l6ZV90IGksIG1hc2ssIG9mZnNldDsKKyAgICBQeV9zc2l6ZV90IGksIG4sIG9mZnNldDsKICAgICBQeURpY3RPYmplY3QgKmQgPSBkaS0+ZGlfZGljdDsKICAgICBQeU9iamVjdCAqKnZhbHVlX3B0cjsKIApAQCAtMzAzOSwyMSArMzMyMCwyMSBAQAogICAgIH0KIAogICAgIGkgPSBkaS0+ZGlfcG9zOwotICAgIG1hc2sgPSBES19TSVpFKGQtPm1hX2tleXMpLTE7Ci0gICAgaWYgKGkgPCAwIHx8IGkgPiBtYXNrKQorICAgIG4gPSBkLT5tYV9rZXlzLT5ka19uZW50cmllcyAtIDE7CisgICAgaWYgKGkgPCAwIHx8IGkgPiBuKQogICAgICAgICBnb3RvIGZhaWw7CiAgICAgaWYgKGQtPm1hX3ZhbHVlcykgewogICAgICAgICB2YWx1ZV9wdHIgPSAmZC0+bWFfdmFsdWVzW2ldOwogICAgICAgICBvZmZzZXQgPSBzaXplb2YoUHlPYmplY3QgKik7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICB2YWx1ZV9wdHIgPSAmZC0+bWFfa2V5cy0+ZGtfZW50cmllc1tpXS5tZV92YWx1ZTsKKyAgICAgICAgdmFsdWVfcHRyID0gJkRLX0VOVFJJRVMoZC0+bWFfa2V5cylbaV0ubWVfdmFsdWU7CiAgICAgICAgIG9mZnNldCA9IHNpemVvZihQeURpY3RLZXlFbnRyeSk7CiAgICAgfQotICAgIHdoaWxlIChpIDw9IG1hc2sgJiYgKnZhbHVlX3B0ciA9PSBOVUxMKSB7CisgICAgd2hpbGUgKGkgPD0gbiAmJiAqdmFsdWVfcHRyID09IE5VTEwpIHsKICAgICAgICAgdmFsdWVfcHRyID0gKFB5T2JqZWN0ICoqKSgoKGNoYXIgKil2YWx1ZV9wdHIpICsgb2Zmc2V0KTsKICAgICAgICAgaSsrOwotICAgICAgICBpZiAoaSA+IG1hc2spCisgICAgICAgIGlmIChpID4gbikKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAgICAgZGktPmRpX3BvcyA9IGkrMTsKQEAgLTMxMDQsNyArMzM4NSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKmRpY3RpdGVyX2l0ZXJuZXh0aXRlbShkaWN0aXRlcm9iamVjdCAqZGkpCiB7CiAgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlLCAqcmVzdWx0ID0gZGktPmRpX3Jlc3VsdDsKLSAgICBQeV9zc2l6ZV90IGksIG1hc2ssIG9mZnNldDsKKyAgICBQeV9zc2l6ZV90IGksIG4sIG9mZnNldDsKICAgICBQeURpY3RPYmplY3QgKmQgPSBkaS0+ZGlfZGljdDsKICAgICBQeU9iamVjdCAqKnZhbHVlX3B0cjsKIApAQCAtMzEyMiwyMSArMzQwMywyMSBAQAogICAgIGkgPSBkaS0+ZGlfcG9zOwogICAgIGlmIChpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwotICAgIG1hc2sgPSBES19TSVpFKGQtPm1hX2tleXMpLTE7CisgICAgbiA9IGQtPm1hX2tleXMtPmRrX25lbnRyaWVzIC0gMTsKICAgICBpZiAoZC0+bWFfdmFsdWVzKSB7CiAgICAgICAgIHZhbHVlX3B0ciA9ICZkLT5tYV92YWx1ZXNbaV07CiAgICAgICAgIG9mZnNldCA9IHNpemVvZihQeU9iamVjdCAqKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIHZhbHVlX3B0ciA9ICZkLT5tYV9rZXlzLT5ka19lbnRyaWVzW2ldLm1lX3ZhbHVlOworICAgICAgICB2YWx1ZV9wdHIgPSAmREtfRU5UUklFUyhkLT5tYV9rZXlzKVtpXS5tZV92YWx1ZTsKICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKFB5RGljdEtleUVudHJ5KTsKICAgICB9Ci0gICAgd2hpbGUgKGkgPD0gbWFzayAmJiAqdmFsdWVfcHRyID09IE5VTEwpIHsKKyAgICB3aGlsZSAoaSA8PSBuICYmICp2YWx1ZV9wdHIgPT0gTlVMTCkgewogICAgICAgICB2YWx1ZV9wdHIgPSAoUHlPYmplY3QgKiopKCgoY2hhciAqKXZhbHVlX3B0cikgKyBvZmZzZXQpOwogICAgICAgICBpKys7CiAgICAgfQogICAgIGRpLT5kaV9wb3MgPSBpKzE7Ci0gICAgaWYgKGkgPiBtYXNrKQorICAgIGlmIChpID4gbikKICAgICAgICAgZ290byBmYWlsOwogCiAgICAgaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpIHsKQEAgLTMxNDksNyArMzQzMCw3IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgZGktPmxlbi0tOwotICAgIGtleSA9IGQtPm1hX2tleXMtPmRrX2VudHJpZXNbaV0ubWVfa2V5OworICAgIGtleSA9IERLX0VOVFJJRVMoZC0+bWFfa2V5cylbaV0ubWVfa2V5OwogICAgIHZhbHVlID0gKnZhbHVlX3B0cjsKICAgICBQeV9JTkNSRUYoa2V5KTsKICAgICBQeV9JTkNSRUYodmFsdWUpOwpAQCAtMzc4OSw3ICs0MDcwLDcgQEAKIFB5RGljdEtleXNPYmplY3QgKgogX1B5RGljdF9OZXdLZXlzRm9yQ2xhc3Modm9pZCkKIHsKLSAgICBQeURpY3RLZXlzT2JqZWN0ICprZXlzID0gbmV3X2tleXNfb2JqZWN0KFB5RGljdF9NSU5TSVpFX1NQTElUKTsKKyAgICBQeURpY3RLZXlzT2JqZWN0ICprZXlzID0gbmV3X2tleXNfb2JqZWN0KFB5RGljdF9NSU5TSVpFKTsKICAgICBpZiAoa2V5cyA9PSBOVUxMKQogICAgICAgICBQeUVycl9DbGVhcigpOwogICAgIGVsc2UKQEAgLTM4MjUsNyArNDEwNiw3IEBACiAKIGludAogX1B5T2JqZWN0RGljdF9TZXRJdGVtKFB5VHlwZU9iamVjdCAqdHAsIFB5T2JqZWN0ICoqZGljdHB0ciwKLSAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqdmFsdWUpCiB7CiAgICAgUHlPYmplY3QgKmRpY3Q7CiAgICAgaW50IHJlczsKQEAgLTM4NTQsNyArNDEzNSw4IEBACiAgICAgICAgICAgICAgICAgLyogRWl0aGVyIHVwZGF0ZSB0cC0+aHRfY2FjaGVkX2tleXMgb3IgZGVsZXRlIGl0ICovCiAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZC0+ZGtfcmVmY250ID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgQ0FDSEVEX0tFWVModHApID0gbWFrZV9rZXlzX3NoYXJlZChkaWN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQ0FDSEVEX0tFWVModHApID0gTlVMTDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgREtfREVDUkVGKGNhY2hlZCk7CkBAIC0zODg0LDUwICs0MTY2LDMgQEAKIHsKICAgICBES19ERUNSRUYoa2V5cyk7CiB9Ci0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBQeU9iamVjdCAqCi1kdW1teV9yZXByKFB5T2JqZWN0ICpvcCkKLXsKLSAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoIjxkdW1teSBrZXk+Iik7Ci19Ci0KLS8qIEFSR1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1kdW1teV9kZWFsbG9jKFB5T2JqZWN0KiBpZ25vcmUpCi17Ci0gICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgZ2V0IGNhbGxlZCwgYnV0IHdlIGFsc28gZG9uJ3Qgd2FudCB0byBTRUdWIGlmCi0gICAgICogd2UgYWNjaWRlbnRhbGx5IGRlY3JlZiBkdW1teS1rZXkgb3V0IG9mIGV4aXN0ZW5jZS4KLSAgICAgKi8KLSAgICBQeV9GYXRhbEVycm9yKCJkZWFsbG9jYXRpbmcgPGR1bW15IGtleT4iKTsKLX0KLQotc3RhdGljIFB5VHlwZU9iamVjdCBQeURpY3REdW1teV9UeXBlID0gewotICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0gICAgIjxkdW1teSBrZXk+IHR5cGUiLAotICAgIDAsCi0gICAgMCwKLSAgICBkdW1teV9kZWFsbG9jLCAgICAgIC8qdHBfZGVhbGxvYyovIC8qbmV2ZXIgY2FsbGVkKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLwotICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3Jlc2VydmVkKi8KLSAgICBkdW1teV9yZXByLCAgICAgICAgIC8qdHBfcmVwciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCi0gICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCi0gICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zdHIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyICovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxULCAvKnRwX2ZsYWdzICovCi19OwotCi1zdGF0aWMgUHlPYmplY3QgX2R1bW15X3N0cnVjdCA9IHsKLSAgX1B5T2JqZWN0X0VYVFJBX0lOSVQKLSAgMiwgJlB5RGljdER1bW15X1R5cGUKLX07Ci0KZGlmZiAtLWdpdCBhL09iamVjdHMvZW51bW9iamVjdC5jIGIvT2JqZWN0cy9lbnVtb2JqZWN0LmMKaW5kZXggYzQ1OGNmZS4uZGFlMTY2ZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9lbnVtb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9lbnVtb2JqZWN0LmMKQEAgLTI1MCw2ICsyNTAsMTMgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICByZXZlcnNlZF9tZXRoID0gX1B5T2JqZWN0X0xvb2t1cFNwZWNpYWwoc2VxLCAmUHlJZF9fX3JldmVyc2VkX18pOworICAgIGlmIChyZXZlcnNlZF9tZXRoID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfREVDUkVGKHJldmVyc2VkX21ldGgpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclLjIwMHMnIG9iamVjdCBpcyBub3QgcmV2ZXJzaWJsZSIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlcSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgaWYgKHJldmVyc2VkX21ldGggIT0gTlVMTCkgewogICAgICAgICBQeU9iamVjdCAqcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhyZXZlcnNlZF9tZXRoLCBOVUxMKTsKICAgICAgICAgUHlfREVDUkVGKHJldmVyc2VkX21ldGgpOwpAQCAtMjU5LDggKzI2Niw5IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKCFQeVNlcXVlbmNlX0NoZWNrKHNlcSkpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCB0byByZXZlcnNlZCgpIG11c3QgYmUgYSBzZXF1ZW5jZSIpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclLjIwMHMnIG9iamVjdCBpcyBub3QgcmV2ZXJzaWJsZSIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlcSktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvZXhjZXB0aW9ucy5jIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKaW5kZXggMDc0OWU5MC4uNmZiNWViNyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9leGNlcHRpb25zLmMKKysrIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKQEAgLTU5LDE1ICs1OSwxMSBAQAogc3RhdGljIGludAogQmFzZUV4Y2VwdGlvbl9pbml0KFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIGt3ZHMpKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICB0bXAgPSBzZWxmLT5hcmdzOwotICAgIHNlbGYtPmFyZ3MgPSBhcmdzOwotICAgIFB5X0lOQ1JFRihzZWxmLT5hcmdzKTsKLSAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgIFB5X1hTRVRSRUYoc2VsZi0+YXJncywgYXJncyk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTIzNCw3ICsyMzAsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgUHlfWElOQ1JFRih0Yik7CisgICAgUHlfSU5DUkVGKHRiKTsKICAgICBQeV9YU0VUUkVGKHNlbGYtPnRyYWNlYmFjaywgdGIpOwogICAgIHJldHVybiAwOwogfQpAQCAtMzI4LDExICszMjQsMTAgQEAKIAogLyogU3RlYWxzIGEgcmVmZXJlbmNlIHRvIGNhdXNlICovCiB2b2lkCi1QeUV4Y2VwdGlvbl9TZXRDYXVzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmNhdXNlKSB7Ci0gICAgUHlPYmplY3QgKm9sZF9jYXVzZSA9ICgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiktPmNhdXNlOwotICAgICgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiktPmNhdXNlID0gY2F1c2U7CitQeUV4Y2VwdGlvbl9TZXRDYXVzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmNhdXNlKQorewogICAgICgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiktPnN1cHByZXNzX2NvbnRleHQgPSAxOwotICAgIFB5X1hERUNSRUYob2xkX2NhdXNlKTsKKyAgICBQeV9YU0VUUkVGKCgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiktPmNhdXNlLCBjYXVzZSk7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTM0NCwxMCArMzM5LDkgQEAKIAogLyogU3RlYWxzIGEgcmVmZXJlbmNlIHRvIGNvbnRleHQgKi8KIHZvaWQKLVB5RXhjZXB0aW9uX1NldENvbnRleHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpjb250ZXh0KSB7Ci0gICAgUHlPYmplY3QgKm9sZF9jb250ZXh0ID0gKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKS0+Y29udGV4dDsKLSAgICAoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5jb250ZXh0ID0gY29udGV4dDsKLSAgICBQeV9YREVDUkVGKG9sZF9jb250ZXh0KTsKK1B5RXhjZXB0aW9uX1NldENvbnRleHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpjb250ZXh0KQoreworICAgIFB5X1hTRVRSRUYoKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKS0+Y29udGV4dCwgY29udGV4dCk7CiB9CiAKIApAQCAtNzEyLDYgKzcwNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZS4iKTsKIAogLyoKKyAqICAgIE1vZHVsZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBJbXBvcnRFcnJvcgorICovCisKK01pZGRsaW5nRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19JbXBvcnRFcnJvciwgTW9kdWxlTm90Rm91bmRFcnJvciwgSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk1vZHVsZSBub3QgZm91bmQuIik7CisKKy8qCiAgKiAgICBPU0Vycm9yIGV4dGVuZHMgRXhjZXB0aW9uCiAgKi8KIApAQCAtOTkxLDcgKzk5Miw3IEBACiAgICAgcmV0dXJuIDA7CiAKIGVycm9yOgotICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIHJldHVybiAtMTsKIH0KIApAQCAtMTA3MSw4ICsxMDcyLDcgQEAKICAgICB9CiAgICAgaWYgKHNlbGYtPm15ZXJybm8gJiYgc2VsZi0+c3RyZXJyb3IpCiAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiW0Vycm5vICVTXSAlUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5teWVycm5vID8gc2VsZi0+bXllcnJubzogUHlfTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVycm9yID8gc2VsZi0+c3RyZXJyb3I6IFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+bXllcnJubywgc2VsZi0+c3RyZXJyb3IpOwogICAgIHJldHVybiBCYXNlRXhjZXB0aW9uX3N0cigoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZik7CiB9CiAKQEAgLTI0NzYsNiArMjQ3Niw3IEBACiAgICAgUFJFX0lOSVQoU3lzdGVtRXhpdCkKICAgICBQUkVfSU5JVChLZXlib2FyZEludGVycnVwdCkKICAgICBQUkVfSU5JVChJbXBvcnRFcnJvcikKKyAgICBQUkVfSU5JVChNb2R1bGVOb3RGb3VuZEVycm9yKQogICAgIFBSRV9JTklUKE9TRXJyb3IpCiAgICAgUFJFX0lOSVQoRU9GRXJyb3IpCiAgICAgUFJFX0lOSVQoUnVudGltZUVycm9yKQpAQCAtMjU0OCw2ICsyNTQ5LDcgQEAKICAgICBQT1NUX0lOSVQoU3lzdGVtRXhpdCkKICAgICBQT1NUX0lOSVQoS2V5Ym9hcmRJbnRlcnJ1cHQpCiAgICAgUE9TVF9JTklUKEltcG9ydEVycm9yKQorICAgIFBPU1RfSU5JVChNb2R1bGVOb3RGb3VuZEVycm9yKQogICAgIFBPU1RfSU5JVChPU0Vycm9yKQogICAgIElOSVRfQUxJQVMoRW52aXJvbm1lbnRFcnJvciwgT1NFcnJvcikKICAgICBJTklUX0FMSUFTKElPRXJyb3IsIE9TRXJyb3IpCkBAIC0yNjEwLDcgKzI2MTIsOSBAQAogICAgIEFERF9FUlJOTyhCbG9ja2luZ0lPRXJyb3IsIEVXT1VMREJMT0NLKTsKICAgICBQT1NUX0lOSVQoQnJva2VuUGlwZUVycm9yKTsKICAgICBBRERfRVJSTk8oQnJva2VuUGlwZUVycm9yLCBFUElQRSk7CisjaWZkZWYgRVNIVVRET1dOCiAgICAgQUREX0VSUk5PKEJyb2tlblBpcGVFcnJvciwgRVNIVVRET1dOKTsKKyNlbmRpZgogICAgIFBPU1RfSU5JVChDaGlsZFByb2Nlc3NFcnJvcik7CiAgICAgQUREX0VSUk5PKENoaWxkUHJvY2Vzc0Vycm9yLCBFQ0hJTEQpOwogICAgIFBPU1RfSU5JVChDb25uZWN0aW9uQWJvcnRlZEVycm9yKTsKZGlmZiAtLWdpdCBhL09iamVjdHMvZmlsZW9iamVjdC5jIGIvT2JqZWN0cy9maWxlb2JqZWN0LmMKaW5kZXggMjM0ZDA3ZS4uZjQ0MjQxOCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9maWxlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9maWxlb2JqZWN0LmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogaW50CiBQeUZpbGVfV3JpdGVPYmplY3QoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICpmLCBpbnQgZmxhZ3MpCiB7Ci0gICAgUHlPYmplY3QgKndyaXRlciwgKnZhbHVlLCAqYXJncywgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqd3JpdGVyLCAqdmFsdWUsICpyZXN1bHQ7CiAgICAgX1B5X0lERU5USUZJRVIod3JpdGUpOwogCiAgICAgaWYgKGYgPT0gTlVMTCkgewpAQCAtMTQ2LDE0ICsxNDYsNyBAQAogICAgICAgICBQeV9ERUNSRUYod3JpdGVyKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHZhbHVlKTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7Ci0gICAgICAgIFB5X0RFQ1JFRih3cml0ZXIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHdyaXRlciwgYXJncyk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9DYWxsQXJnMSh3cml0ZXIsIHZhbHVlKTsKICAgICBQeV9ERUNSRUYodmFsdWUpOwogICAgIFB5X0RFQ1JFRih3cml0ZXIpOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL09iamVjdHMvZmxvYXRvYmplY3QuYyBiL09iamVjdHMvZmxvYXRvYmplY3QuYwppbmRleCBkOTJiZWMzLi4wNjQyYjE2IDEwMDY0NAotLS0gYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mbG9hdG9iamVjdC5jCkBAIC0yMTUsMzUgKzIxNSw0OSBAQAogUHlGbG9hdF9Bc0RvdWJsZShQeU9iamVjdCAqb3ApCiB7CiAgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKLSAgICBQeUZsb2F0T2JqZWN0ICpmbzsKKyAgICBQeU9iamVjdCAqcmVzOwogICAgIGRvdWJsZSB2YWw7CiAKLSAgICBpZiAob3AgJiYgUHlGbG9hdF9DaGVjayhvcCkpCi0gICAgICAgIHJldHVybiBQeUZsb2F0X0FTX0RPVUJMRSgoUHlGbG9hdE9iamVjdCopIG9wKTsKLQogICAgIGlmIChvcCA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAoKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fCBuYi0+bmJfZmxvYXQgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYSBmbG9hdCBpcyByZXF1aXJlZCIpOworICAgIGlmIChQeUZsb2F0X0NoZWNrKG9wKSkgeworICAgICAgICByZXR1cm4gUHlGbG9hdF9BU19ET1VCTEUob3ApOworICAgIH0KKworICAgIG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcjsKKyAgICBpZiAobmIgPT0gTlVMTCB8fCBuYi0+bmJfZmxvYXQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAibXVzdCBiZSByZWFsIG51bWJlciwgbm90ICUuNTBzIiwKKyAgICAgICAgICAgICAgICAgICAgIG9wLT5vYl90eXBlLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGZvID0gKFB5RmxvYXRPYmplY3QqKSAoKm5iLT5uYl9mbG9hdCkgKG9wKTsKLSAgICBpZiAoZm8gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmICghUHlGbG9hdF9DaGVjayhmbykpIHsKLSAgICAgICAgUHlfREVDUkVGKGZvKTsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJuYl9mbG9hdCBzaG91bGQgcmV0dXJuIGZsb2F0IG9iamVjdCIpOworICAgIHJlcyA9ICgqbmItPm5iX2Zsb2F0KSAob3ApOworICAgIGlmIChyZXMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQorICAgIGlmICghUHlGbG9hdF9DaGVja0V4YWN0KHJlcykpIHsKKyAgICAgICAgaWYgKCFQeUZsb2F0X0NoZWNrKHJlcykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiUuNTBzLl9fZmxvYXRfXyByZXR1cm5lZCBub24tZmxvYXQgKHR5cGUgJS41MHMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+b2JfdHlwZS0+dHBfbmFtZSwgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgMSwKKyAgICAgICAgICAgICAgICAiJS41MHMuX19mbG9hdF9fIHJldHVybmVkIG5vbi1mbG9hdCAodHlwZSAlLjUwcykuICAiCisgICAgICAgICAgICAgICAgIlRoZSBhYmlsaXR5IHRvIHJldHVybiBhbiBpbnN0YW5jZSBvZiBhIHN0cmljdCBzdWJjbGFzcyBvZiBmbG9hdCAiCisgICAgICAgICAgICAgICAgImlzIGRlcHJlY2F0ZWQsIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFB5dGhvbi4iLAorICAgICAgICAgICAgICAgIG9wLT5vYl90eXBlLT50cF9uYW1lLCByZXMtPm9iX3R5cGUtPnRwX25hbWUpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotICAgIHZhbCA9IFB5RmxvYXRfQVNfRE9VQkxFKGZvKTsKLSAgICBQeV9ERUNSRUYoZm8pOwotCisgICAgdmFsID0gUHlGbG9hdF9BU19ET1VCTEUocmVzKTsKKyAgICBQeV9ERUNSRUYocmVzKTsKICAgICByZXR1cm4gdmFsOwogfQogCkBAIC0xMTk1LDcgKzEyMDksNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2Zyb21oZXgoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZykKIHsKLSAgICBQeU9iamVjdCAqcmVzdWx0X2FzX2Zsb2F0LCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgZG91YmxlIHg7CiAgICAgbG9uZyBleHAsIHRvcF9leHAsIGxzYiwga2V5X2RpZ2l0OwogICAgIGNoYXIgKnMsICpjb2VmZl9zdGFydCwgKnNfc3RvcmUsICpjb2VmZl9lbmQsICpleHBfc3RhcnQsICpzX2VuZDsKQEAgLTE0MTAsMTEgKzE0MjQsMTAgQEAKICAgICAgICAgcysrOwogICAgIGlmIChzICE9IHNfZW5kKQogICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOwotICAgIHJlc3VsdF9hc19mbG9hdCA9IFB5X0J1aWxkVmFsdWUoIihkKSIsIG5lZ2F0ZSA/IC14IDogeCk7Ci0gICAgaWYgKHJlc3VsdF9hc19mbG9hdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNscywgcmVzdWx0X2FzX2Zsb2F0KTsKLSAgICBQeV9ERUNSRUYocmVzdWx0X2FzX2Zsb2F0KTsKKyAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUobmVnYXRlID8gLXggOiB4KTsKKyAgICBpZiAoY2xzICE9IChQeU9iamVjdCAqKSZQeUZsb2F0X1R5cGUgJiYgcmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfU0VUUkVGKHJlc3VsdCwgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjbHMsIHJlc3VsdCwgTlVMTCkpOworICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogCiAgIG92ZXJmbG93X2Vycm9yOgpAQCAtMTQ1MSwyOSArMTQ2NCwyMyBAQAogICAgIGludCBleHBvbmVudDsKICAgICBpbnQgaTsKIAotICAgIFB5T2JqZWN0ICpwcmV2OwogICAgIFB5T2JqZWN0ICpweV9leHBvbmVudCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm51bWVyYXRvciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmRlbm9taW5hdG9yID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmVzdWx0X3BhaXIgPSBOVUxMOwogICAgIFB5TnVtYmVyTWV0aG9kcyAqbG9uZ19tZXRob2RzID0gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyOwogCi0jZGVmaW5lIElOUExBQ0VfVVBEQVRFKG9iaiwgY2FsbCkgXAotICAgIHByZXYgPSBvYmo7IFwKLSAgICBvYmogPSBjYWxsOyBcCi0gICAgUHlfREVDUkVGKHByZXYpOyBcCi0KICAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCBzZWxmKTsKIAogICAgIGlmIChQeV9JU19JTkZJTklUWShzZWxmKSkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBwYXNzIGluZmluaXR5IHRvIGZsb2F0LmFzX2ludGVnZXJfcmF0aW8uIik7Ci0gICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKFB5X0lTX05BTihzZWxmKSkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBwYXNzIE5hTiB0byBmbG9hdC5hc19pbnRlZ2VyX3JhdGlvLiIpOwotICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0IE5hTiB0byBpbnRlZ2VyIHJhdGlvIik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImFzX2ludGVnZXJfcmF0aW8iLCBnb3RvIGVycm9yKTsKQEAgLTE0ODksMjkgKzE0OTYsMzEgQEAKICAgICAgICB0byBiZSB0cnVuY2F0ZWQgYnkgUHlMb25nX0Zyb21Eb3VibGUoKS4gKi8KIAogICAgIG51bWVyYXRvciA9IFB5TG9uZ19Gcm9tRG91YmxlKGZsb2F0X3BhcnQpOwotICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZGVub21pbmF0b3IgPSBQeUxvbmdfRnJvbUxvbmcoMSk7CisgICAgaWYgKGRlbm9taW5hdG9yID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgcHlfZXhwb25lbnQgPSBQeUxvbmdfRnJvbUxvbmcoUHlfQUJTKGV4cG9uZW50KSk7CisgICAgaWYgKHB5X2V4cG9uZW50ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKICAgICAvKiBmb2xkIGluIDIqKmV4cG9uZW50ICovCi0gICAgZGVub21pbmF0b3IgPSBQeUxvbmdfRnJvbUxvbmcoMSk7Ci0gICAgcHlfZXhwb25lbnQgPSBQeUxvbmdfRnJvbUxvbmcobGFicygobG9uZylleHBvbmVudCkpOwotICAgIGlmIChweV9leHBvbmVudCA9PSBOVUxMKSBnb3RvIGVycm9yOwotICAgIElOUExBQ0VfVVBEQVRFKHB5X2V4cG9uZW50LAotICAgICAgICAgICAgICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbHNoaWZ0KGRlbm9taW5hdG9yLCBweV9leHBvbmVudCkpOwotICAgIGlmIChweV9leHBvbmVudCA9PSBOVUxMKSBnb3RvIGVycm9yOwogICAgIGlmIChleHBvbmVudCA+IDApIHsKLSAgICAgICAgSU5QTEFDRV9VUERBVEUobnVtZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBsb25nX21ldGhvZHMtPm5iX211bHRpcGx5KG51bWVyYXRvciwgcHlfZXhwb25lbnQpKTsKLSAgICAgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgICAgICBQeV9TRVRSRUYobnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgbG9uZ19tZXRob2RzLT5uYl9sc2hpZnQobnVtZXJhdG9yLCBweV9leHBvbmVudCkpOworICAgICAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgUHlfREVDUkVGKGRlbm9taW5hdG9yKTsKLSAgICAgICAgZGVub21pbmF0b3IgPSBweV9leHBvbmVudDsKLSAgICAgICAgcHlfZXhwb25lbnQgPSBOVUxMOworICAgICAgICBQeV9TRVRSRUYoZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICBsb25nX21ldGhvZHMtPm5iX2xzaGlmdChkZW5vbWluYXRvciwgcHlfZXhwb25lbnQpKTsKKyAgICAgICAgaWYgKGRlbm9taW5hdG9yID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIHJlc3VsdF9wYWlyID0gUHlUdXBsZV9QYWNrKDIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOwogCi0jdW5kZWYgSU5QTEFDRV9VUERBVEUKIGVycm9yOgogICAgIFB5X1hERUNSRUYocHlfZXhwb25lbnQpOwogICAgIFB5X1hERUNSRUYoZGVub21pbmF0b3IpOwpAQCAtMTk2Niw4ICsxOTc1LDEyMCBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogX1B5RmxvYXRfe1BhY2ssVW5wYWNrfXs0LDh9LiAgU2VlIGZsb2F0b2JqZWN0LmguCisgKiBfUHlGbG9hdF97UGFjayxVbnBhY2t9ezIsNCw4fS4gIFNlZSBmbG9hdG9iamVjdC5oLgorICogVG8gbWF0Y2ggdGhlIE5QWV9IQUxGX1JPVU5EX1RJRVNfVE9fRVZFTiBiZWhhdmlvciBpbjoKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9udW1weS9udW1weS9ibG9iL21hc3Rlci9udW1weS9jb3JlL3NyYy9ucHltYXRoL2hhbGZmbG9hdC5jCisgKiBXZSB1c2U6CisgKiAgICAgICBiaXRzID0gKHVuc2lnbmVkIHNob3J0KWY7ICAgIE5vdGUgdGhlIHRydW5jYXRpb24KKyAqICAgICAgIGlmICgoZiAtIGJpdHMgPiAwLjUpIHx8IChmIC0gYml0cyA9PSAwLjUgJiYgYml0cyAlIDIpKSB7CisgKiAgICAgICAgICAgYml0cysrOworICogICAgICAgfQogICovCisKK2ludAorX1B5RmxvYXRfUGFjazIoZG91YmxlIHgsIHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHNpZ247CisgICAgaW50IGU7CisgICAgZG91YmxlIGY7CisgICAgdW5zaWduZWQgc2hvcnQgYml0czsKKyAgICBpbnQgaW5jciA9IDE7CisKKyAgICBpZiAoeCA9PSAwLjApIHsKKyAgICAgICAgc2lnbiA9IChjb3B5c2lnbigxLjAsIHgpID09IC0xLjApOworICAgICAgICBlID0gMDsKKyAgICAgICAgYml0cyA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKFB5X0lTX0lORklOSVRZKHgpKSB7CisgICAgICAgIHNpZ24gPSAoeCA8IDAuMCk7CisgICAgICAgIGUgPSAweDFmOworICAgICAgICBiaXRzID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlfSVNfTkFOKHgpKSB7CisgICAgICAgIC8qIFRoZXJlIGFyZSAyMDQ2IGRpc3RpbmN0IGhhbGYtcHJlY2lzaW9uIE5hTnMgKDEwMjIgc2lnbmFsaW5nIGFuZAorICAgICAgICAgICAxMDI0IHF1aWV0KSwgYnV0IHRoZXJlIGFyZSBvbmx5IHR3byBxdWlldCBOYU5zIHRoYXQgZG9uJ3QgYXJpc2UgYnkKKyAgICAgICAgICAgcXVpZXRpbmcgYSBzaWduYWxpbmcgTmFOOyB3ZSBnZXQgdGhvc2UgYnkgc2V0dGluZyB0aGUgdG9wbW9zdCBiaXQKKyAgICAgICAgICAgb2YgdGhlIGZyYWN0aW9uIGZpZWxkIGFuZCBjbGVhcmluZyBhbGwgb3RoZXIgZnJhY3Rpb24gYml0cy4gV2UKKyAgICAgICAgICAgY2hvb3NlIHRoZSBvbmUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc2lnbi4gKi8KKyAgICAgICAgc2lnbiA9IChjb3B5c2lnbigxLjAsIHgpID09IC0xLjApOworICAgICAgICBlID0gMHgxZjsKKyAgICAgICAgYml0cyA9IDUxMjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNpZ24gPSAoeCA8IDAuMCk7CisgICAgICAgIGlmIChzaWduKSB7CisgICAgICAgICAgICB4ID0gLXg7CisgICAgICAgIH0KKworICAgICAgICBmID0gZnJleHAoeCwgJmUpOworICAgICAgICBpZiAoZiA8IDAuNSB8fCBmID49IDEuMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmV4cCgpIHJlc3VsdCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vcm1hbGl6ZSBmIHRvIGJlIGluIHRoZSByYW5nZSBbMS4wLCAyLjApICovCisgICAgICAgIGYgKj0gMi4wOworICAgICAgICBlLS07CisKKyAgICAgICAgaWYgKGUgPj0gMTYpIHsKKyAgICAgICAgICAgIGdvdG8gT3ZlcmZsb3c7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZSA8IC0yNSkgeworICAgICAgICAgICAgLyogfHh8IDwgMioqLTI1LiBVbmRlcmZsb3cgdG8gemVyby4gKi8KKyAgICAgICAgICAgIGYgPSAwLjA7CisgICAgICAgICAgICBlID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlIDwgLTE0KSB7CisgICAgICAgICAgICAvKiB8eHwgPCAyKiotMTQuIEdyYWR1YWwgdW5kZXJmbG93ICovCisgICAgICAgICAgICBmID0gbGRleHAoZiwgMTQgKyBlKTsKKyAgICAgICAgICAgIGUgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogaWYgKCEoZSA9PSAwICYmIGYgPT0gMC4wKSkgKi8geworICAgICAgICAgICAgZSArPSAxNTsKKyAgICAgICAgICAgIGYgLT0gMS4wOyAvKiBHZXQgcmlkIG9mIGxlYWRpbmcgMSAqLworICAgICAgICB9CisKKyAgICAgICAgZiAqPSAxMDI0LjA7IC8qIDIqKjEwICovCisgICAgICAgIC8qIFJvdW5kIHRvIGV2ZW4gKi8KKyAgICAgICAgYml0cyA9ICh1bnNpZ25lZCBzaG9ydClmOyAvKiBOb3RlIHRoZSB0cnVuY2F0aW9uICovCisgICAgICAgIGFzc2VydChiaXRzIDwgMTAyNCk7CisgICAgICAgIGFzc2VydChlIDwgMzEpOworICAgICAgICBpZiAoKGYgLSBiaXRzID4gMC41KSB8fCAoKGYgLSBiaXRzID09IDAuNSkgJiYgKGJpdHMgJSAyID09IDEpKSkgeworICAgICAgICAgICAgKytiaXRzOworICAgICAgICAgICAgaWYgKGJpdHMgPT0gMTAyNCkgeworICAgICAgICAgICAgICAgIC8qIFRoZSBjYXJyeSBwcm9wYWdhdGVkIG91dCBvZiBhIHN0cmluZyBvZiAxMCAxIGJpdHMuICovCisgICAgICAgICAgICAgICAgYml0cyA9IDA7CisgICAgICAgICAgICAgICAgKytlOworICAgICAgICAgICAgICAgIGlmIChlID09IDMxKQorICAgICAgICAgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYml0cyB8PSAoZSA8PCAxMCkgfCAoc2lnbiA8PCAxNSk7CisKKyAgICAvKiBXcml0ZSBvdXQgcmVzdWx0LiAqLworICAgIGlmIChsZSkgeworICAgICAgICBwICs9IDE7CisgICAgICAgIGluY3IgPSAtMTsKKyAgICB9CisKKyAgICAvKiBGaXJzdCBieXRlICovCisgICAgKnAgPSAodW5zaWduZWQgY2hhcikoKGJpdHMgPj4gOCkgJiAweEZGKTsKKyAgICBwICs9IGluY3I7CisKKyAgICAvKiBTZWNvbmQgYnl0ZSAqLworICAgICpwID0gKHVuc2lnbmVkIGNoYXIpKGJpdHMgJiAweEZGKTsKKworICAgIHJldHVybiAwOworCisgIE92ZXJmbG93OgorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAiZmxvYXQgdG9vIGxhcmdlIHRvIHBhY2sgd2l0aCBlIGZvcm1hdCIpOworICAgIHJldHVybiAtMTsKK30KKwogaW50CiBfUHlGbG9hdF9QYWNrNChkb3VibGUgeCwgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKQogewpAQCAtMjIwMyw2ICsyMzI0LDc2IEBACiB9CiAKIGRvdWJsZQorX1B5RmxvYXRfVW5wYWNrMihjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpCit7CisgICAgdW5zaWduZWQgY2hhciBzaWduOworICAgIGludCBlOworICAgIHVuc2lnbmVkIGludCBmOworICAgIGRvdWJsZSB4OworICAgIGludCBpbmNyID0gMTsKKworICAgIGlmIChsZSkgeworICAgICAgICBwICs9IDE7CisgICAgICAgIGluY3IgPSAtMTsKKyAgICB9CisKKyAgICAvKiBGaXJzdCBieXRlICovCisgICAgc2lnbiA9ICgqcCA+PiA3KSAmIDE7CisgICAgZSA9ICgqcCAmIDB4N0MpID4+IDI7CisgICAgZiA9ICgqcCAmIDB4MDMpIDw8IDg7CisgICAgcCArPSBpbmNyOworCisgICAgLyogU2Vjb25kIGJ5dGUgKi8KKyAgICBmIHw9ICpwOworCisgICAgaWYgKGUgPT0gMHgxZikgeworI2lmZGVmIFBZX05PX1NIT1JUX0ZMT0FUX1JFUFIKKyAgICAgICAgaWYgKGYgPT0gMCkgeworICAgICAgICAgICAgLyogSW5maW5pdHkgKi8KKyAgICAgICAgICAgIHJldHVybiBzaWduID8gLVB5X0hVR0VfVkFMIDogUHlfSFVHRV9WQUw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBOYU4gKi8KKyNpZmRlZiBQeV9OQU4KKyAgICAgICAgICAgIHJldHVybiBzaWduID8gLVB5X05BTiA6IFB5X05BTjsKKyNlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiY2FuJ3QgdW5wYWNrIElFRUUgNzU0IE5hTiAiCisgICAgICAgICAgICAgICAgIm9uIHBsYXRmb3JtIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBOYU5zIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisjZW5kaWYgIC8qICNpZmRlZiBQeV9OQU4gKi8KKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKGYgPT0gMCkgeworICAgICAgICAgICAgLyogSW5maW5pdHkgKi8KKyAgICAgICAgICAgIHJldHVybiBfUHlfZGdfaW5maW5pdHkoc2lnbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBOYU4gKi8KKyAgICAgICAgICAgIHJldHVybiBfUHlfZGdfc3RkbmFuKHNpZ24pOworICAgICAgICB9CisjZW5kaWYgIC8qICNpZmRlZiBQWV9OT19TSE9SVF9GTE9BVF9SRVBSICovCisgICAgfQorCisgICAgeCA9IChkb3VibGUpZiAvIDEwMjQuMDsKKworICAgIGlmIChlID09IDApIHsKKyAgICAgICAgZSA9IC0xNDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHggKz0gMS4wOworICAgICAgICBlIC09IDE1OworICAgIH0KKyAgICB4ID0gbGRleHAoeCwgZSk7CisKKyAgICBpZiAoc2lnbikKKyAgICAgICAgeCA9IC14OworCisgICAgcmV0dXJuIHg7Cit9CisKK2RvdWJsZQogX1B5RmxvYXRfVW5wYWNrNChjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpCiB7CiAgICAgaWYgKGZsb2F0X2Zvcm1hdCA9PSB1bmtub3duX2Zvcm1hdCkgewpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mcmFtZW9iamVjdC5jIGIvT2JqZWN0cy9mcmFtZW9iamVjdC5jCmluZGV4IDlhYWRkNjEuLmIxMTU2MTQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZnJhbWVvYmplY3QuYworKysgYi9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgICAgICBuZXdfbGFzdGkgPSAtMTsKICAgICAgICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBsbm90YWJfbGVuOyBvZmZzZXQgKz0gMikgewogICAgICAgICAgICAgYWRkciArPSBsbm90YWJbb2Zmc2V0XTsKLSAgICAgICAgICAgIGxpbmUgKz0gbG5vdGFiW29mZnNldCsxXTsKKyAgICAgICAgICAgIGxpbmUgKz0gKHNpZ25lZCBjaGFyKWxub3RhYltvZmZzZXQrMV07CiAgICAgICAgICAgICBpZiAobGluZSA+PSBuZXdfbGluZW5vKSB7CiAgICAgICAgICAgICAgICAgbmV3X2xhc3RpID0gYWRkcjsKICAgICAgICAgICAgICAgICBuZXdfbGluZW5vID0gbGluZTsKQEAgLTE4OSw3ICsxODksNyBAQAogICAgIG1lbXNldChibG9ja3N0YWNrLCAnXDAnLCBzaXplb2YoYmxvY2tzdGFjaykpOwogICAgIG1lbXNldChpbl9maW5hbGx5LCAnXDAnLCBzaXplb2YoaW5fZmluYWxseSkpOwogICAgIGJsb2Nrc3RhY2tfdG9wID0gMDsKLSAgICBmb3IgKGFkZHIgPSAwOyBhZGRyIDwgY29kZV9sZW47IGFkZHIrKykgeworICAgIGZvciAoYWRkciA9IDA7IGFkZHIgPCBjb2RlX2xlbjsgYWRkciArPSAyKSB7CiAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3AgPSBjb2RlW2FkZHJdOwogICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKQEAgLTI1MSwxMCArMjUxLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAob3AgPj0gSEFWRV9BUkdVTUVOVCkgewotICAgICAgICAgICAgYWRkciArPSAyOwotICAgICAgICB9CiAgICAgfQogCiAgICAgLyogVmVyaWZ5IHRoYXQgdGhlIGJsb2Nrc3RhY2sgdHJhY2tpbmcgY29kZSBkaWRuJ3QgZ2V0IGxvc3QuICovCkBAIC0yNzcsNyArMjczLDcgQEAKICAgICAgKiBjYW4gdGVsbCB3aGV0aGVyIHRoZSBqdW1wIGdvZXMgaW50byBhbnkgYmxvY2tzIHdpdGhvdXQgY29taW5nIG91dAogICAgICAqIGFnYWluIC0gaW4gdGhhdCBjYXNlIHdlIHJhaXNlIGFuIGV4Y2VwdGlvbiBiZWxvdy4gKi8KICAgICBkZWx0YV9pYmxvY2sgPSAwOwotICAgIGZvciAoYWRkciA9IG1pbl9hZGRyOyBhZGRyIDwgbWF4X2FkZHI7IGFkZHIrKykgeworICAgIGZvciAoYWRkciA9IG1pbl9hZGRyOyBhZGRyIDwgbWF4X2FkZHI7IGFkZHIgKz0gMikgewogICAgICAgICB1bnNpZ25lZCBjaGFyIG9wID0gY29kZVthZGRyXTsKICAgICAgICAgc3dpdGNoIChvcCkgewogICAgICAgICBjYXNlIFNFVFVQX0xPT1A6CkBAIC0yOTQsMTAgKzI5MCw2IEBACiAgICAgICAgIH0KIAogICAgICAgICBtaW5fZGVsdGFfaWJsb2NrID0gUHlfTUlOKG1pbl9kZWx0YV9pYmxvY2ssIGRlbHRhX2libG9jayk7Ci0KLSAgICAgICAgaWYgKG9wID49IEhBVkVfQVJHVU1FTlQpIHsKLSAgICAgICAgICAgIGFkZHIgKz0gMjsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qIERlcml2ZSB0aGUgYWJzb2x1dGUgaWJsb2NrIHZhbHVlcyBmcm9tIHRoZSBkZWx0YXMuICovCmRpZmYgLS1naXQgYS9PYmplY3RzL2Z1bmNvYmplY3QuYyBiL09iamVjdHMvZnVuY29iamVjdC5jCmluZGV4IGU2YzMyN2QuLjI2MWMxNmQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZnVuY29iamVjdC5jCisrKyBiL09iamVjdHMvZnVuY29iamVjdC5jCkBAIC0yNDksNyArMjQ5LDYgQEAKIHN0YXRpYyBpbnQKIGZ1bmNfc2V0X2NvZGUoUHlGdW5jdGlvbk9iamVjdCAqb3AsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBQeU9iamVjdCAqdG1wOwogICAgIFB5X3NzaXplX3QgbmZyZWUsIG5jbG9zdXJlOwogCiAgICAgLyogTm90IGxlZ2FsIHRvIGRlbCBmLmZ1bmNfY29kZSBvciB0byBzZXQgaXQgdG8gYW55dGhpbmcKQEAgLTI3MCwxMCArMjY5LDggQEAKICAgICAgICAgICAgICAgICAgICAgIG5jbG9zdXJlLCBuZnJlZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmZ1bmNfY29kZTsKICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgIG9wLT5mdW5jX2NvZGUgPSB2YWx1ZTsKLSAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBQeV9YU0VUUkVGKG9wLT5mdW5jX2NvZGUsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjg3LDggKzI4NCw2IEBACiBzdGF0aWMgaW50CiBmdW5jX3NldF9uYW1lKFB5RnVuY3Rpb25PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIC8qIE5vdCBsZWdhbCB0byBkZWwgZi5mdW5jX25hbWUgb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCiAgICAgICogb3RoZXIgdGhhbiBhIHN0cmluZyBvYmplY3QuICovCiAgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKQEAgLTI5NiwxMCArMjkxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJfX25hbWVfXyBtdXN0IGJlIHNldCB0byBhIHN0cmluZyBvYmplY3QiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICB0bXAgPSBvcC0+ZnVuY19uYW1lOwogICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgb3AtPmZ1bmNfbmFtZSA9IHZhbHVlOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmZ1bmNfbmFtZSwgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0zMTMsOCArMzA2LDYgQEAKIHN0YXRpYyBpbnQKIGZ1bmNfc2V0X3F1YWxuYW1lKFB5RnVuY3Rpb25PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIC8qIE5vdCBsZWdhbCB0byBkZWwgZi5fX3F1YWxuYW1lX18gb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCiAgICAgICogb3RoZXIgdGhhbiBhIHN0cmluZyBvYmplY3QuICovCiAgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKQEAgLTMyMiwxMCArMzEzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJfX3F1YWxuYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmZ1bmNfcXVhbG5hbWU7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+ZnVuY19xdWFsbmFtZSA9IHZhbHVlOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmZ1bmNfcXVhbG5hbWUsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzQzLDggKzMzMiw2IEBACiBzdGF0aWMgaW50CiBmdW5jX3NldF9kZWZhdWx0cyhQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICAvKiBMZWdhbCB0byBkZWwgZi5mdW5jX2RlZmF1bHRzLgogICAgICAqIENhbiBvbmx5IHNldCBmdW5jX2RlZmF1bHRzIHRvIE5VTEwgb3IgYSB0dXBsZS4gKi8KICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKQEAgLTM1NCwxMCArMzQxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJfX2RlZmF1bHRzX18gbXVzdCBiZSBzZXQgdG8gYSB0dXBsZSBvYmplY3QiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICB0bXAgPSBvcC0+ZnVuY19kZWZhdWx0czsKICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+ZnVuY19kZWZhdWx0cyA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICBQeV9YU0VUUkVGKG9wLT5mdW5jX2RlZmF1bHRzLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTM3NSw4ICszNjAsNiBAQAogc3RhdGljIGludAogZnVuY19zZXRfa3dkZWZhdWx0cyhQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKICAgICAgICAgdmFsdWUgPSBOVUxMOwogICAgIC8qIExlZ2FsIHRvIGRlbCBmLmZ1bmNfa3dkZWZhdWx0cy4KQEAgLTM4NiwxMCArMzY5LDggQEAKICAgICAgICAgICAgICJfX2t3ZGVmYXVsdHNfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Qgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmZ1bmNfa3dkZWZhdWx0czsKICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+ZnVuY19rd2RlZmF1bHRzID0gdmFsdWU7Ci0gICAgUHlfWERFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmZ1bmNfa3dkZWZhdWx0cywgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC00MDgsOCArMzg5LDYgQEAKIHN0YXRpYyBpbnQKIGZ1bmNfc2V0X2Fubm90YXRpb25zKFB5RnVuY3Rpb25PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKQogICAgICAgICB2YWx1ZSA9IE5VTEw7CiAgICAgLyogTGVnYWwgdG8gZGVsIGYuZnVuY19hbm5vdGF0aW9ucy4KQEAgLTQyMCwxMCArMzk5LDggQEAKICAgICAgICAgICAgICJfX2Fubm90YXRpb25zX18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0IG9iamVjdCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHRtcCA9IG9wLT5mdW5jX2Fubm90YXRpb25zOwogICAgIFB5X1hJTkNSRUYodmFsdWUpOwotICAgIG9wLT5mdW5jX2Fubm90YXRpb25zID0gdmFsdWU7Ci0gICAgUHlfWERFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmZ1bmNfYW5ub3RhdGlvbnMsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9nZW5vYmplY3QuYyBiL09iamVjdHMvZ2Vub2JqZWN0LmMKaW5kZXggOTE3MmU2YS4uYmM1MzA5YSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9nZW5vYmplY3QuYworKysgYi9PYmplY3RzL2dlbm9iamVjdC5jCkBAIC01LDcgKzUsMTUgQEAKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKICNpbmNsdWRlICJvcGNvZGUuaCIKIAotc3RhdGljIFB5T2JqZWN0ICpnZW5fY2xvc2UoUHlHZW5PYmplY3QgKmdlbiwgUHlPYmplY3QgKmFyZ3MpOworc3RhdGljIFB5T2JqZWN0ICpnZW5fY2xvc2UoUHlHZW5PYmplY3QgKiwgUHlPYmplY3QgKik7CitzdGF0aWMgUHlPYmplY3QgKmFzeW5jX2dlbl9hc2VuZF9uZXcoUHlBc3luY0dlbk9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqYXN5bmNfZ2VuX2F0aHJvd19uZXcoUHlBc3luY0dlbk9iamVjdCAqLCBQeU9iamVjdCAqKTsKKworc3RhdGljIGNoYXIgKk5PTl9JTklUX0NPUk9fTVNHID0gImNhbid0IHNlbmQgbm9uLU5vbmUgdmFsdWUgdG8gYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianVzdC1zdGFydGVkIGNvcm91dGluZSI7CisKK3N0YXRpYyBjaGFyICpBU1lOQ19HRU5fSUdOT1JFRF9FWElUX01TRyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXN5bmMgZ2VuZXJhdG9yIGlnbm9yZWQgR2VuZXJhdG9yRXhpdCI7CiAKIHN0YXRpYyBpbnQKIGdlbl90cmF2ZXJzZShQeUdlbk9iamVjdCAqZ2VuLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKQEAgLTI4LDYgKzM2LDI2IEBACiAgICAgICAgIC8qIEdlbmVyYXRvciBpc24ndCBwYXVzZWQsIHNvIG5vIG5lZWQgdG8gY2xvc2UgKi8KICAgICAgICAgcmV0dXJuOwogCisgICAgaWYgKFB5QXN5bmNHZW5fQ2hlY2tFeGFjdChzZWxmKSkgeworICAgICAgICBQeUFzeW5jR2VuT2JqZWN0ICphZ2VuID0gKFB5QXN5bmNHZW5PYmplY3QqKXNlbGY7CisgICAgICAgIFB5T2JqZWN0ICpmaW5hbGl6ZXIgPSBhZ2VuLT5hZ19maW5hbGl6ZXI7CisgICAgICAgIGlmIChmaW5hbGl6ZXIgJiYgIWFnZW4tPmFnX2Nsb3NlZCkgeworICAgICAgICAgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KKyAgICAgICAgICAgIFB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOworCisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZpbmFsaXplciwgc2VsZiwgTlVMTCk7CisKKyAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShzZWxmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBSZXN0b3JlIHRoZSBzYXZlZCBleGNlcHRpb24uICovCisgICAgICAgICAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCiAgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KICAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKIApAQCAtNzQsNiArMTAyLDEyIEBACiAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAvKiByZXN1cnJlY3RlZC4gIDooICovCiAKICAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhzZWxmKTsKKyAgICBpZiAoUHlBc3luY0dlbl9DaGVja0V4YWN0KGdlbikpIHsKKyAgICAgICAgLyogV2UgaGF2ZSB0byBoYW5kbGUgdGhpcyBjYXNlIGZvciBhc3luY2hyb25vdXMgZ2VuZXJhdG9ycworICAgICAgICAgICByaWdodCBoZXJlLCBiZWNhdXNlIHRoaXMgY29kZSBoYXMgdG8gYmUgYmV0d2VlbiBVTlRSQUNLCisgICAgICAgICAgIGFuZCBHQ19EZWwuICovCisgICAgICAgIFB5X0NMRUFSKCgoUHlBc3luY0dlbk9iamVjdCopZ2VuKS0+YWdfZmluYWxpemVyKTsKKyAgICB9CiAgICAgaWYgKGdlbi0+Z2lfZnJhbWUgIT0gTlVMTCkgewogICAgICAgICBnZW4tPmdpX2ZyYW1lLT5mX2dlbiA9IE5VTEw7CiAgICAgICAgIFB5X0NMRUFSKGdlbi0+Z2lfZnJhbWUpOwpAQCAtODQsNiArMTE4LDMzIEBACiAgICAgUHlPYmplY3RfR0NfRGVsKGdlbik7CiB9CiAKK3N0YXRpYyB2b2lkCitnZW5fY2hhaW5fcnVudGltZV9lcnJvcihjb25zdCBjaGFyICptc2cpCit7CisgICAgUHlPYmplY3QgKmV4YywgKnZhbCwgKnZhbDIsICp0YjsKKworICAgIC8qIFRPRE86IFRoaXMgYWJvdXQgcmV3cml0aW5nIHVzaW5nIF9QeUVycl9DaGFpbkV4Y2VwdGlvbnMuICovCisKKyAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOworICAgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmZXhjLCAmdmFsLCAmdGIpOworICAgIGlmICh0YiAhPSBOVUxMKSB7CisgICAgICAgIFB5RXhjZXB0aW9uX1NldFRyYWNlYmFjayh2YWwsIHRiKTsKKyAgICB9CisKKyAgICBQeV9ERUNSRUYoZXhjKTsKKyAgICBQeV9YREVDUkVGKHRiKTsKKworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIG1zZyk7CisgICAgUHlFcnJfRmV0Y2goJmV4YywgJnZhbDIsICZ0Yik7CisgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGMsICZ2YWwyLCAmdGIpOworCisgICAgUHlfSU5DUkVGKHZhbCk7CisgICAgUHlFeGNlcHRpb25fU2V0Q2F1c2UodmFsMiwgdmFsKTsKKyAgICBQeUV4Y2VwdGlvbl9TZXRDb250ZXh0KHZhbDIsIHZhbCk7CisKKyAgICBQeUVycl9SZXN0b3JlKGV4YywgdmFsMiwgdGIpOworfQorCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuX3NlbmRfZXgoUHlHZW5PYmplY3QgKmdlbiwgUHlPYmplY3QgKmFyZywgaW50IGV4YywgaW50IGNsb3NpbmcpCiB7CkBAIC05Myw4ICsxNTQsMTIgQEAKIAogICAgIGlmIChnZW4tPmdpX3J1bm5pbmcpIHsKICAgICAgICAgY2hhciAqbXNnID0gImdlbmVyYXRvciBhbHJlYWR5IGV4ZWN1dGluZyI7Ci0gICAgICAgIGlmIChQeUNvcm9fQ2hlY2tFeGFjdChnZW4pKQorICAgICAgICBpZiAoUHlDb3JvX0NoZWNrRXhhY3QoZ2VuKSkgewogICAgICAgICAgICAgbXNnID0gImNvcm91dGluZSBhbHJlYWR5IGV4ZWN1dGluZyI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlBc3luY0dlbl9DaGVja0V4YWN0KGdlbikpIHsKKyAgICAgICAgICAgIG1zZyA9ICJhc3luYyBnZW5lcmF0b3IgYWxyZWFkeSBleGVjdXRpbmciOworICAgICAgICB9CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBtc2cpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xMDYsMTAgKzE3MSwxNiBAQAogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAogICAgICAgICAgICAgICAgIFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAiY2Fubm90IHJldXNlIGFscmVhZHkgYXdhaXRlZCBjb3JvdXRpbmUiKTsKLSAgICAgICAgfSBlbHNlIGlmIChhcmcgJiYgIWV4YykgeworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFyZyAmJiAhZXhjKSB7CiAgICAgICAgICAgICAvKiBgZ2VuYCBpcyBhbiBleGhhdXN0ZWQgZ2VuZXJhdG9yOgogICAgICAgICAgICAgICAgb25seSBzZXQgZXhjZXB0aW9uIGlmIGNhbGxlZCBmcm9tIHNlbmQoKS4gKi8KLSAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgICAgICAgICBpZiAoUHlBc3luY0dlbl9DaGVja0V4YWN0KGdlbikpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BBc3luY0l0ZXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTExOCw5ICsxODksMTMgQEAKICAgICAgICAgaWYgKGFyZyAmJiBhcmcgIT0gUHlfTm9uZSkgewogICAgICAgICAgICAgY2hhciAqbXNnID0gImNhbid0IHNlbmQgbm9uLU5vbmUgdmFsdWUgdG8gYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAianVzdC1zdGFydGVkIGdlbmVyYXRvciI7Ci0gICAgICAgICAgICBpZiAoUHlDb3JvX0NoZWNrRXhhY3QoZ2VuKSkKKyAgICAgICAgICAgIGlmIChQeUNvcm9fQ2hlY2tFeGFjdChnZW4pKSB7CisgICAgICAgICAgICAgICAgbXNnID0gTk9OX0lOSVRfQ09ST19NU0c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChQeUFzeW5jR2VuX0NoZWNrRXhhY3QoZ2VuKSkgewogICAgICAgICAgICAgICAgIG1zZyA9ICJjYW4ndCBzZW5kIG5vbi1Ob25lIHZhbHVlIHRvIGEgIgotICAgICAgICAgICAgICAgICAgICAgICJqdXN0LXN0YXJ0ZWQgY29yb3V0aW5lIjsKKyAgICAgICAgICAgICAgICAgICAgICAianVzdC1zdGFydGVkIGFzeW5jIGdlbmVyYXRvciI7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtc2cpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTE1MiwxMCArMjI3LDIwIEBACiAgICAgaWYgKHJlc3VsdCAmJiBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBQeV9Ob25lKSB7CiAgICAgICAgICAgICAvKiBEZWxheSBleGNlcHRpb24gaW5zdGFudGlhdGlvbiBpZiB3ZSBjYW4gKi8KLSAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlBc3luY0dlbl9DaGVja0V4YWN0KGdlbikpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BBc3luY0l0ZXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgUHlPYmplY3QgKmUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1N0b3BJdGVyYXRpb24sIHJlc3VsdCwgTlVMTCk7CisKKyAgICAgICAgICAgIC8qIEFzeW5jIGdlbmVyYXRvcnMgY2Fubm90IHJldHVybiBhbnl0aGluZyBidXQgTm9uZSAqLworICAgICAgICAgICAgYXNzZXJ0KCFQeUFzeW5jR2VuX0NoZWNrRXhhY3QoZ2VuKSk7CisKICAgICAgICAgICAgIGlmIChlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfU3RvcEl0ZXJhdGlvbiwgZSk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGUpOwpAQCAtMTY3LDM0ICsyNTIsNDQgQEAKICAgICAgICAgLyogQ2hlY2sgZm9yIF9fZnV0dXJlX18gZ2VuZXJhdG9yX3N0b3AgYW5kIGNvbmRpdGlvbmFsbHkgdHVybgogICAgICAgICAgKiBhIGxlYWtpbmcgU3RvcEl0ZXJhdGlvbiBpbnRvIFJ1bnRpbWVFcnJvciAod2l0aCBpdHMgY2F1c2UKICAgICAgICAgICogc2V0IGFwcHJvcHJpYXRlbHkpLiAqLwotICAgICAgICBpZiAoKChQeUNvZGVPYmplY3QgKilnZW4tPmdpX2NvZGUpLT5jb19mbGFncyAmCi0gICAgICAgICAgICAgIChDT19GVVRVUkVfR0VORVJBVE9SX1NUT1AgfCBDT19DT1JPVVRJTkUgfCBDT19JVEVSQUJMRV9DT1JPVVRJTkUpKQorCisgICAgICAgIGNvbnN0IGludCBjaGVja19zdG9wX2l0ZXJfZXJyb3JfZmxhZ3MgPSBDT19GVVRVUkVfR0VORVJBVE9SX1NUT1AgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09fQ09ST1VUSU5FIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPX0lURVJBQkxFX0NPUk9VVElORSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT19BU1lOQ19HRU5FUkFUT1I7CisKKyAgICAgICAgaWYgKGdlbi0+Z2lfY29kZSAhPSBOVUxMICYmCisgICAgICAgICAgICAoKFB5Q29kZU9iamVjdCAqKWdlbi0+Z2lfY29kZSktPmNvX2ZsYWdzICYKKyAgICAgICAgICAgICAgICBjaGVja19zdG9wX2l0ZXJfZXJyb3JfZmxhZ3MpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpleGMsICp2YWwsICp2YWwyLCAqdGI7Ci0gICAgICAgICAgICBjaGFyICptc2cgPSAiZ2VuZXJhdG9yIHJhaXNlZCBTdG9wSXRlcmF0aW9uIjsKLSAgICAgICAgICAgIGlmIChQeUNvcm9fQ2hlY2tFeGFjdChnZW4pKQorICAgICAgICAgICAgLyogYGdlbmAgaXMgZWl0aGVyOgorICAgICAgICAgICAgICAgICAgKiBhIGdlbmVyYXRvciB3aXRoIENPX0ZVVFVSRV9HRU5FUkFUT1JfU1RPUCBmbGFnOworICAgICAgICAgICAgICAgICAgKiBhIGNvcm91dGluZTsKKyAgICAgICAgICAgICAgICAgICogYSBnZW5lcmF0b3Igd2l0aCBDT19JVEVSQUJMRV9DT1JPVVRJTkUgZmxhZworICAgICAgICAgICAgICAgICAgICAoZGVjb3JhdGVkIHdpdGggdHlwZXMuY29yb3V0aW5lIGRlY29yYXRvcik7CisgICAgICAgICAgICAgICAgICAqIGFuIGFzeW5jIGdlbmVyYXRvci4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBjb25zdCBjaGFyICptc2cgPSAiZ2VuZXJhdG9yIHJhaXNlZCBTdG9wSXRlcmF0aW9uIjsKKyAgICAgICAgICAgIGlmIChQeUNvcm9fQ2hlY2tFeGFjdChnZW4pKSB7CiAgICAgICAgICAgICAgICAgbXNnID0gImNvcm91dGluZSByYWlzZWQgU3RvcEl0ZXJhdGlvbiI7Ci0gICAgICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOwotICAgICAgICAgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGMsICZ2YWwsICZ0Yik7Ci0gICAgICAgICAgICBpZiAodGIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBQeUV4Y2VwdGlvbl9TZXRUcmFjZWJhY2sodmFsLCB0Yik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoZXhjKTsKLSAgICAgICAgICAgIFB5X1hERUNSRUYodGIpOwotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgbXNnKTsKLSAgICAgICAgICAgIFB5RXJyX0ZldGNoKCZleGMsICZ2YWwyLCAmdGIpOwotICAgICAgICAgICAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGMsICZ2YWwyLCAmdGIpOwotICAgICAgICAgICAgUHlfSU5DUkVGKHZhbCk7Ci0gICAgICAgICAgICBQeUV4Y2VwdGlvbl9TZXRDYXVzZSh2YWwyLCB2YWwpOwotICAgICAgICAgICAgUHlFeGNlcHRpb25fU2V0Q29udGV4dCh2YWwyLCB2YWwpOwotICAgICAgICAgICAgUHlFcnJfUmVzdG9yZShleGMsIHZhbDIsIHRiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgUHlBc3luY0dlbl9DaGVja0V4YWN0KGdlbikgeworICAgICAgICAgICAgICAgIG1zZyA9ICJhc3luYyBnZW5lcmF0b3IgcmFpc2VkIFN0b3BJdGVyYXRpb24iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogUmFpc2UgYSBSdW50aW1lRXJyb3IgKi8KKyAgICAgICAgICAgIGdlbl9jaGFpbl9ydW50aW1lX2Vycm9yKG1zZyk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBgZ2VuYCBpcyBhbiBvcmRpbmFyeSBnZW5lcmF0b3Igd2l0aG91dAorICAgICAgICAgICAgICAgQ09fRlVUVVJFX0dFTkVSQVRPUl9TVE9QIGZsYWcuCisgICAgICAgICAgICAqLworCiAgICAgICAgICAgICBQeU9iamVjdCAqZXhjLCAqdmFsLCAqdGI7CiAKICAgICAgICAgICAgIC8qIFBvcCB0aGUgZXhjZXB0aW9uIGJlZm9yZSBpc3N1aW5nIGEgd2FybmluZy4gKi8KICAgICAgICAgICAgIFB5RXJyX0ZldGNoKCZleGMsICZ2YWwsICZ0Yik7CiAKLSAgICAgICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIDEsCisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdG9yICclLjUwUycgcmFpc2VkIFN0b3BJdGVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLT5naV9xdWFsbmFtZSkpIHsKICAgICAgICAgICAgICAgICAvKiBXYXJuaW5nIHdhcyBjb252ZXJ0ZWQgdG8gYW4gZXJyb3IuICovCkBAIC0yMDcsNiArMzAyLDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgZWxzZSBpZiAoUHlBc3luY0dlbl9DaGVja0V4YWN0KGdlbikgJiYgIXJlc3VsdCAmJgorICAgICAgICAgICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEFzeW5jSXRlcmF0aW9uKSkKKyAgICB7CisgICAgICAgIC8qIGNvZGUgaW4gYGdlbmAgcmFpc2VkIGEgU3RvcEFzeW5jSXRlcmF0aW9uIGVycm9yOgorICAgICAgICAgICByYWlzZSBhIFJ1bnRpbWVFcnJvci4KKyAgICAgICAgKi8KKyAgICAgICAgY29uc3QgY2hhciAqbXNnID0gImFzeW5jIGdlbmVyYXRvciByYWlzZWQgU3RvcEFzeW5jSXRlcmF0aW9uIjsKKyAgICAgICAgZ2VuX2NoYWluX3J1bnRpbWVfZXJyb3IobXNnKTsKKyAgICB9CiAKICAgICBpZiAoIXJlc3VsdCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKICAgICAgICAgLyogZ2VuZXJhdG9yIGNhbid0IGJlIHJlcnVuLCBzbyByZWxlYXNlIHRoZSBmcmFtZSAqLwpAQCAtMjUzLDE4ICszNTcsMjAgQEAKICAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKICAgICBfUHlfSURFTlRJRklFUihjbG9zZSk7CiAKLSAgICBpZiAoUHlHZW5fQ2hlY2tFeGFjdCh5ZikpIHsKKyAgICBpZiAoUHlHZW5fQ2hlY2tFeGFjdCh5ZikgfHwgUHlDb3JvX0NoZWNrRXhhY3QoeWYpKSB7CiAgICAgICAgIHJldHZhbCA9IGdlbl9jbG9zZSgoUHlHZW5PYmplY3QgKil5ZiwgTlVMTCk7CiAgICAgICAgIGlmIChyZXR2YWwgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICAgUHlPYmplY3QgKm1ldGggPSBfUHlPYmplY3RfR2V0QXR0cklkKHlmLCAmUHlJZF9jbG9zZSk7CiAgICAgICAgIGlmIChtZXRoID09IE5VTEwpIHsKICAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCiAgICAgICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHlmKTsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24obWV0aCwgIiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dmFsID0gX1B5T2JqZWN0X0NhbGxOb0FyZyhtZXRoKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihtZXRoKTsKICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0yODQsNyArMzkwLDcgQEAKICAgICAgICAgUHlPYmplY3QgKmJ5dGVjb2RlID0gZi0+Zl9jb2RlLT5jb19jb2RlOwogICAgICAgICB1bnNpZ25lZCBjaGFyICpjb2RlID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhieXRlY29kZSk7CiAKLSAgICAgICAgaWYgKGNvZGVbZi0+Zl9sYXN0aSArIDFdICE9IFlJRUxEX0ZST00pCisgICAgICAgIGlmIChjb2RlW2YtPmZfbGFzdGkgKyAyXSAhPSBZSUVMRF9GUk9NKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHlmID0gZi0+Zl9zdGFja3RvcFstMV07CiAgICAgICAgIFB5X0lOQ1JFRih5Zik7CkBAIC0zMTEsOCArNDE3LDExIEBACiAgICAgcmV0dmFsID0gZ2VuX3NlbmRfZXgoZ2VuLCBQeV9Ob25lLCAxLCAxKTsKICAgICBpZiAocmV0dmFsKSB7CiAgICAgICAgIGNoYXIgKm1zZyA9ICJnZW5lcmF0b3IgaWdub3JlZCBHZW5lcmF0b3JFeGl0IjsKLSAgICAgICAgaWYgKFB5Q29yb19DaGVja0V4YWN0KGdlbikpCisgICAgICAgIGlmIChQeUNvcm9fQ2hlY2tFeGFjdChnZW4pKSB7CiAgICAgICAgICAgICBtc2cgPSAiY29yb3V0aW5lIGlnbm9yZWQgR2VuZXJhdG9yRXhpdCI7CisgICAgICAgIH0gZWxzZSBpZiAoUHlBc3luY0dlbl9DaGVja0V4YWN0KGdlbikpIHsKKyAgICAgICAgICAgIG1zZyA9IEFTWU5DX0dFTl9JR05PUkVEX0VYSVRfTVNHOworICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOwogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCBtc2cpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTMzMiwyMSArNDQxLDIyIEBACiByZXR1cm4gbmV4dCB5aWVsZGVkIHZhbHVlIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24uIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1nZW5fdGhyb3coUHlHZW5PYmplY3QgKmdlbiwgUHlPYmplY3QgKmFyZ3MpCitfZ2VuX3Rocm93KFB5R2VuT2JqZWN0ICpnZW4sIGludCBjbG9zZV9vbl9nZW5leGl0LAorICAgICAgICAgICBQeU9iamVjdCAqdHlwLCBQeU9iamVjdCAqdmFsLCBQeU9iamVjdCAqdGIpCiB7Ci0gICAgUHlPYmplY3QgKnR5cDsKLSAgICBQeU9iamVjdCAqdGIgPSBOVUxMOwotICAgIFB5T2JqZWN0ICp2YWwgPSBOVUxMOwogICAgIFB5T2JqZWN0ICp5ZiA9IF9QeUdlbl95ZihnZW4pOwogICAgIF9QeV9JREVOVElGSUVSKHRocm93KTsKIAotICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRocm93IiwgMSwgMywgJnR5cCwgJnZhbCwgJnRiKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KICAgICBpZiAoeWYpIHsKICAgICAgICAgUHlPYmplY3QgKnJldDsKICAgICAgICAgaW50IGVycjsKLSAgICAgICAgaWYgKFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyh0eXAsIFB5RXhjX0dlbmVyYXRvckV4aXQpKSB7CisgICAgICAgIGlmIChQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXModHlwLCBQeUV4Y19HZW5lcmF0b3JFeGl0KSAmJgorICAgICAgICAgICAgY2xvc2Vfb25fZ2VuZXhpdAorICAgICAgICApIHsKKyAgICAgICAgICAgIC8qIEFzeW5jaHJvbm91cyBnZW5lcmF0b3JzICpzaG91bGQgbm90KiBiZSBjbG9zZWQgcmlnaHQgYXdheS4KKyAgICAgICAgICAgICAgIFdlIGhhdmUgdG8gYWxsb3cgc29tZSBhd2FpdHMgdG8gd29yayBpdCB0aHJvdWdoLCBoZW5jZSB0aGUKKyAgICAgICAgICAgICAgIGBjbG9zZV9vbl9nZW5leGl0YCBwYXJhbWV0ZXIgaGVyZS4KKyAgICAgICAgICAgICovCiAgICAgICAgICAgICBnZW4tPmdpX3J1bm5pbmcgPSAxOwogICAgICAgICAgICAgZXJyID0gZ2VuX2Nsb3NlX2l0ZXIoeWYpOwogICAgICAgICAgICAgZ2VuLT5naV9ydW5uaW5nID0gMDsKQEAgLTM1NSwxMSArNDY1LDE2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbl9zZW5kX2V4KGdlbiwgUHlfTm9uZSwgMSwgMCk7CiAgICAgICAgICAgICBnb3RvIHRocm93X2hlcmU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKFB5R2VuX0NoZWNrRXhhY3QoeWYpKSB7CisgICAgICAgIGlmIChQeUdlbl9DaGVja0V4YWN0KHlmKSB8fCBQeUNvcm9fQ2hlY2tFeGFjdCh5ZikpIHsKKyAgICAgICAgICAgIC8qIGB5ZmAgaXMgYSBnZW5lcmF0b3Igb3IgYSBjb3JvdXRpbmUuICovCiAgICAgICAgICAgICBnZW4tPmdpX3J1bm5pbmcgPSAxOwotICAgICAgICAgICAgcmV0ID0gZ2VuX3Rocm93KChQeUdlbk9iamVjdCAqKXlmLCBhcmdzKTsKKyAgICAgICAgICAgIC8qIENsb3NlIHRoZSBnZW5lcmF0b3IgdGhhdCB3ZSBhcmUgY3VycmVudGx5IGl0ZXJhdGluZyB3aXRoCisgICAgICAgICAgICAgICAneWllbGQgZnJvbScgb3IgYXdhaXRpbmcgb24gd2l0aCAnYXdhaXQnLiAqLworICAgICAgICAgICAgcmV0ID0gX2dlbl90aHJvdygoUHlHZW5PYmplY3QgKil5ZiwgY2xvc2Vfb25fZ2VuZXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwLCB2YWwsIHRiKTsKICAgICAgICAgICAgIGdlbi0+Z2lfcnVubmluZyA9IDA7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBgeWZgIGlzIGFuIGl0ZXJhdG9yIG9yIGEgY29yb3V0aW5lLWxpa2Ugb2JqZWN0LiAqLwogICAgICAgICAgICAgUHlPYmplY3QgKm1ldGggPSBfUHlPYmplY3RfR2V0QXR0cklkKHlmLCAmUHlJZF90aHJvdyk7CiAgICAgICAgICAgICBpZiAobWV0aCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgewpAQCAtMzcxLDcgKzQ4Niw3IEBACiAgICAgICAgICAgICAgICAgZ290byB0aHJvd19oZXJlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZ2VuLT5naV9ydW5uaW5nID0gMTsKLSAgICAgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxPYmplY3QobWV0aCwgYXJncyk7CisgICAgICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKG1ldGgsIHR5cCwgdmFsLCB0YiwgTlVMTCk7CiAgICAgICAgICAgICBnZW4tPmdpX3J1bm5pbmcgPSAwOwogICAgICAgICAgICAgUHlfREVDUkVGKG1ldGgpOwogICAgICAgICB9CkBAIC0zODMsNyArNDk4LDcgQEAKICAgICAgICAgICAgIGFzc2VydChyZXQgPT0geWYpOwogICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CiAgICAgICAgICAgICAvKiBUZXJtaW5hdGlvbiByZXBldGl0aW9uIG9mIFlJRUxEX0ZST00gKi8KLSAgICAgICAgICAgIGdlbi0+Z2lfZnJhbWUtPmZfbGFzdGkrKzsKKyAgICAgICAgICAgIGdlbi0+Z2lfZnJhbWUtPmZfbGFzdGkgKz0gMjsKICAgICAgICAgICAgIGlmIChfUHlHZW5fRmV0Y2hTdG9wSXRlcmF0aW9uVmFsdWUoJnZhbCkgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldCA9IGdlbl9zZW5kX2V4KGdlbiwgdmFsLCAwLCAwKTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsKTsKQEAgLTQ1NCw2ICs1NjksMjEgQEAKIAogCiBzdGF0aWMgUHlPYmplY3QgKgorZ2VuX3Rocm93KFB5R2VuT2JqZWN0ICpnZW4sIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5T2JqZWN0ICp0eXA7CisgICAgUHlPYmplY3QgKnRiID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdmFsID0gTlVMTDsKKworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRocm93IiwgMSwgMywgJnR5cCwgJnZhbCwgJnRiKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gX2dlbl90aHJvdyhnZW4sIDEsIHR5cCwgdmFsLCB0Yik7Cit9CisKKworc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9pdGVybmV4dChQeUdlbk9iamVjdCAqZ2VuKQogewogICAgIHJldHVybiBnZW5fc2VuZF9leChnZW4sIE5VTEwsIDAsIDApOwpAQCAtNTI2LDggKzY1Niw2IEBACiBzdGF0aWMgaW50CiBnZW5fc2V0X25hbWUoUHlHZW5PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIC8qIE5vdCBsZWdhbCB0byBkZWwgZ2VuLmdpX25hbWUgb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCiAgICAgICogb3RoZXIgdGhhbiBhIHN0cmluZyBvYmplY3QuICovCiAgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKQEAgLTUzNSwxMCArNjYzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJfX25hbWVfXyBtdXN0IGJlIHNldCB0byBhIHN0cmluZyBvYmplY3QiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICB0bXAgPSBvcC0+Z2lfbmFtZTsKICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgIG9wLT5naV9uYW1lID0gdmFsdWU7Ci0gICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihvcC0+Z2lfbmFtZSwgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC01NTIsOCArNjc4LDYgQEAKIHN0YXRpYyBpbnQKIGdlbl9zZXRfcXVhbG5hbWUoUHlHZW5PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIC8qIE5vdCBsZWdhbCB0byBkZWwgZ2VuLl9fcXVhbG5hbWVfXyBvciB0byBzZXQgaXQgdG8gYW55dGhpbmcKICAgICAgKiBvdGhlciB0aGFuIGEgc3RyaW5nIG9iamVjdC4gKi8KICAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCAhUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewpAQCAtNTYxLDEwICs2ODUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIl9fcXVhbG5hbWVfXyBtdXN0IGJlIHNldCB0byBhIHN0cmluZyBvYmplY3QiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICB0bXAgPSBvcC0+Z2lfcXVhbG5hbWU7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+Z2lfcXVhbG5hbWUgPSB2YWx1ZTsKLSAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBQeV9YU0VUUkVGKG9wLT5naV9xdWFsbmFtZSwgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xMDA1LDIxICsxMTI3LDIxIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECi0gICAgUHlPYmplY3QgKmF3X2FpdGVyOworICAgIFB5T2JqZWN0ICphZ3NfYWl0ZXI7CiB9IFB5QUl0ZXJXcmFwcGVyOwogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhaXRlcl93cmFwcGVyX2l0ZXJuZXh0KFB5QUl0ZXJXcmFwcGVyICphdykKIHsKLSAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfU3RvcEl0ZXJhdGlvbiwgYXctPmF3X2FpdGVyKTsKKyAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfU3RvcEl0ZXJhdGlvbiwgYXctPmFnc19haXRlcik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIGFpdGVyX3dyYXBwZXJfdHJhdmVyc2UoUHlBSXRlcldyYXBwZXIgKmF3LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLSAgICBQeV9WSVNJVCgoUHlPYmplY3QgKilhdy0+YXdfYWl0ZXIpOworICAgIFB5X1ZJU0lUKChQeU9iamVjdCAqKWF3LT5hZ3NfYWl0ZXIpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xMDI3LDcgKzExNDksNyBAQAogYWl0ZXJfd3JhcHBlcl9kZWFsbG9jKFB5QUl0ZXJXcmFwcGVyICphdykKIHsKICAgICBfUHlPYmplY3RfR0NfVU5UUkFDSygoUHlPYmplY3QgKilhdyk7Ci0gICAgUHlfQ0xFQVIoYXctPmF3X2FpdGVyKTsKKyAgICBQeV9DTEVBUihhdy0+YWdzX2FpdGVyKTsKICAgICBQeU9iamVjdF9HQ19EZWwoYXcpOwogfQogCkBAIC0xMDg5LDcgKzEyMTEsODE3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBQeV9JTkNSRUYoYWl0ZXIpOwotICAgIGF3LT5hd19haXRlciA9IGFpdGVyOworICAgIGF3LT5hZ3NfYWl0ZXIgPSBhaXRlcjsKICAgICBfUHlPYmplY3RfR0NfVFJBQ0soYXcpOwogICAgIHJldHVybiAoUHlPYmplY3QgKilhdzsKIH0KKworCisvKiA9PT09PT09PT0gQXN5bmNocm9ub3VzIEdlbmVyYXRvcnMgPT09PT09PT09ICovCisKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBV0FJVEFCTEVfU1RBVEVfSU5JVCwgICAvKiBuZXcgYXdhaXRhYmxlLCBoYXMgbm90IHlldCBiZWVuIGl0ZXJhdGVkICovCisgICAgQVdBSVRBQkxFX1NUQVRFX0lURVIsICAgLyogYmVpbmcgaXRlcmF0ZWQgKi8KKyAgICBBV0FJVEFCTEVfU1RBVEVfQ0xPU0VELCAvKiBjbG9zZWQgKi8KK30gQXdhaXRhYmxlU3RhdGU7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeUFzeW5jR2VuT2JqZWN0ICphZ3NfZ2VuOworCisgICAgLyogQ2FuIGJlIE5VTEwsIHdoZW4gaW4gdGhlIF9fYW5leHRfXygpIG1vZGUKKyAgICAgICAoZXF1aXZhbGVudCBvZiAiYXNlbmQoTm9uZSkiKSAqLworICAgIFB5T2JqZWN0ICphZ3Nfc2VuZHZhbDsKKworICAgIEF3YWl0YWJsZVN0YXRlIGFnc19zdGF0ZTsKK30gUHlBc3luY0dlbkFTZW5kOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlBc3luY0dlbk9iamVjdCAqYWd0X2dlbjsKKworICAgIC8qIENhbiBiZSBOVUxMLCB3aGVuIGluIHRoZSAiYWNsb3NlKCkiIG1vZGUKKyAgICAgICAoZXF1aXZhbGVudCBvZiAiYXRocm93KEdlbmVyYXRvckV4aXQpIikgKi8KKyAgICBQeU9iamVjdCAqYWd0X2FyZ3M7CisKKyAgICBBd2FpdGFibGVTdGF0ZSBhZ3Rfc3RhdGU7Cit9IFB5QXN5bmNHZW5BVGhyb3c7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqYWd3X3ZhbDsKK30gX1B5QXN5bmNHZW5XcmFwcGVkVmFsdWU7CisKKworI2lmbmRlZiBfUHlBc3luY0dlbl9NQVhGUkVFTElTVAorI2RlZmluZSBfUHlBc3luY0dlbl9NQVhGUkVFTElTVCA4MAorI2VuZGlmCisKKy8qIEZyZWVsaXN0cyBib29zdCBwZXJmb3JtYW5jZSA2LTEwJTsgdGhleSBhbHNvIHJlZHVjZSBtZW1vcnkKKyAgIGZyYWdtZW50YXRpb24sIGFzIF9QeUFzeW5jR2VuV3JhcHBlZFZhbHVlIGFuZCBQeUFzeW5jR2VuQVNlbmQKKyAgIGFyZSBzaG9ydC1saXZpbmcgb2JqZWN0cyB0aGF0IGFyZSBpbnN0YW50aWF0ZWQgZm9yIGV2ZXJ5CisgICBfX2FuZXh0X18gY2FsbC4KKyovCisKK3N0YXRpYyBfUHlBc3luY0dlbldyYXBwZWRWYWx1ZSAqYWdfdmFsdWVfZnJlZWxpc3RbX1B5QXN5bmNHZW5fTUFYRlJFRUxJU1RdOworc3RhdGljIGludCBhZ192YWx1ZV9mcmVlbGlzdF9mcmVlID0gMDsKKworc3RhdGljIFB5QXN5bmNHZW5BU2VuZCAqYWdfYXNlbmRfZnJlZWxpc3RbX1B5QXN5bmNHZW5fTUFYRlJFRUxJU1RdOworc3RhdGljIGludCBhZ19hc2VuZF9mcmVlbGlzdF9mcmVlID0gMDsKKworI2RlZmluZSBfUHlBc3luY0dlbldyYXBwZWRWYWx1ZV9DaGVja0V4YWN0KG8pIFwKKyAgICAgICAgICAgICAgICAgICAgKFB5X1RZUEUobykgPT0gJl9QeUFzeW5jR2VuV3JhcHBlZFZhbHVlX1R5cGUpCisKKyNkZWZpbmUgUHlBc3luY0dlbkFTZW5kX0NoZWNrRXhhY3QobykgXAorICAgICAgICAgICAgICAgICAgICAoUHlfVFlQRShvKSA9PSAmX1B5QXN5bmNHZW5BU2VuZF9UeXBlKQorCisKK3N0YXRpYyBpbnQKK2FzeW5jX2dlbl90cmF2ZXJzZShQeUFzeW5jR2VuT2JqZWN0ICpnZW4sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworICAgIFB5X1ZJU0lUKGdlbi0+YWdfZmluYWxpemVyKTsKKyAgICByZXR1cm4gZ2VuX3RyYXZlcnNlKChQeUdlbk9iamVjdCopZ2VuLCB2aXNpdCwgYXJnKTsKK30KKworCitzdGF0aWMgUHlPYmplY3QgKgorYXN5bmNfZ2VuX3JlcHIoUHlBc3luY0dlbk9iamVjdCAqbykKK3sKKyAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIjxhc3luY19nZW5lcmF0b3Igb2JqZWN0ICVTIGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8tPmFnX3F1YWxuYW1lLCBvKTsKK30KKworCitzdGF0aWMgaW50Cithc3luY19nZW5faW5pdF9ob29rcyhQeUFzeW5jR2VuT2JqZWN0ICpvKQoreworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBQeU9iamVjdCAqZmluYWxpemVyOworICAgIFB5T2JqZWN0ICpmaXJzdGl0ZXI7CisKKyAgICBpZiAoby0+YWdfaG9va3NfaW5pdGVkKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG8tPmFnX2hvb2tzX2luaXRlZCA9IDE7CisKKyAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworCisgICAgZmluYWxpemVyID0gdHN0YXRlLT5hc3luY19nZW5fZmluYWxpemVyOworICAgIGlmIChmaW5hbGl6ZXIpIHsKKyAgICAgICAgUHlfSU5DUkVGKGZpbmFsaXplcik7CisgICAgICAgIG8tPmFnX2ZpbmFsaXplciA9IGZpbmFsaXplcjsKKyAgICB9CisKKyAgICBmaXJzdGl0ZXIgPSB0c3RhdGUtPmFzeW5jX2dlbl9maXJzdGl0ZXI7CisgICAgaWYgKGZpcnN0aXRlcikgeworICAgICAgICBQeU9iamVjdCAqcmVzOworCisgICAgICAgIFB5X0lOQ1JFRihmaXJzdGl0ZXIpOworICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZmlyc3RpdGVyLCAiTyIsIG8pOworICAgICAgICBQeV9ERUNSRUYoZmlyc3RpdGVyKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgUHlPYmplY3QgKgorYXN5bmNfZ2VuX2FuZXh0KFB5QXN5bmNHZW5PYmplY3QgKm8pCit7CisgICAgaWYgKGFzeW5jX2dlbl9pbml0X2hvb2tzKG8pKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gYXN5bmNfZ2VuX2FzZW5kX25ldyhvLCBOVUxMKTsKK30KKworCitzdGF0aWMgUHlPYmplY3QgKgorYXN5bmNfZ2VuX2FzZW5kKFB5QXN5bmNHZW5PYmplY3QgKm8sIFB5T2JqZWN0ICphcmcpCit7CisgICAgaWYgKGFzeW5jX2dlbl9pbml0X2hvb2tzKG8pKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gYXN5bmNfZ2VuX2FzZW5kX25ldyhvLCBhcmcpOworfQorCisKK3N0YXRpYyBQeU9iamVjdCAqCithc3luY19nZW5fYWNsb3NlKFB5QXN5bmNHZW5PYmplY3QgKm8sIFB5T2JqZWN0ICphcmcpCit7CisgICAgaWYgKGFzeW5jX2dlbl9pbml0X2hvb2tzKG8pKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gYXN5bmNfZ2VuX2F0aHJvd19uZXcobywgTlVMTCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCithc3luY19nZW5fYXRocm93KFB5QXN5bmNHZW5PYmplY3QgKm8sIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmIChhc3luY19nZW5faW5pdF9ob29rcyhvKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGFzeW5jX2dlbl9hdGhyb3dfbmV3KG8sIGFyZ3MpOworfQorCisKK3N0YXRpYyBQeUdldFNldERlZiBhc3luY19nZW5fZ2V0c2V0bGlzdFtdID0geworICAgIHsiX19uYW1lX18iLCAoZ2V0dGVyKWdlbl9nZXRfbmFtZSwgKHNldHRlcilnZW5fc2V0X25hbWUsCisgICAgIFB5RG9jX1NUUigibmFtZSBvZiB0aGUgYXN5bmMgZ2VuZXJhdG9yIil9LAorICAgIHsiX19xdWFsbmFtZV9fIiwgKGdldHRlcilnZW5fZ2V0X3F1YWxuYW1lLCAoc2V0dGVyKWdlbl9zZXRfcXVhbG5hbWUsCisgICAgIFB5RG9jX1NUUigicXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFzeW5jIGdlbmVyYXRvciIpfSwKKyAgICB7ImFnX2F3YWl0IiwgKGdldHRlciljb3JvX2dldF9jcl9hd2FpdCwgTlVMTCwKKyAgICAgUHlEb2NfU1RSKCJvYmplY3QgYmVpbmcgYXdhaXRlZCBvbiwgb3IgTm9uZSIpfSwKKyAgICB7TlVMTH0gLyogU2VudGluZWwgKi8KK307CisKK3N0YXRpYyBQeU1lbWJlckRlZiBhc3luY19nZW5fbWVtYmVybGlzdFtdID0geworICAgIHsiYWdfZnJhbWUiLCAgIFRfT0JKRUNULCBvZmZzZXRvZihQeUFzeW5jR2VuT2JqZWN0LCBhZ19mcmFtZSksICAgUkVBRE9OTFl9LAorICAgIHsiYWdfcnVubmluZyIsIFRfQk9PTCwgICBvZmZzZXRvZihQeUFzeW5jR2VuT2JqZWN0LCBhZ19ydW5uaW5nKSwgUkVBRE9OTFl9LAorICAgIHsiYWdfY29kZSIsICAgIFRfT0JKRUNULCBvZmZzZXRvZihQeUFzeW5jR2VuT2JqZWN0LCBhZ19jb2RlKSwgICAgUkVBRE9OTFl9LAorICAgIHtOVUxMfSAgICAgIC8qIFNlbnRpbmVsICovCit9OworCitQeURvY19TVFJWQVIoYXN5bmNfYWNsb3NlX2RvYywKKyJhY2xvc2UoKSAtPiByYWlzZSBHZW5lcmF0b3JFeGl0IGluc2lkZSBnZW5lcmF0b3IuIik7CisKK1B5RG9jX1NUUlZBUihhc3luY19hc2VuZF9kb2MsCisiYXNlbmQodikgLT4gc2VuZCAndicgaW4gZ2VuZXJhdG9yLiIpOworCitQeURvY19TVFJWQVIoYXN5bmNfYXRocm93X2RvYywKKyJhdGhyb3codHlwWyx2YWxbLHRiXV0pIC0+IHJhaXNlIGV4Y2VwdGlvbiBpbiBnZW5lcmF0b3IuIik7CisKK3N0YXRpYyBQeU1ldGhvZERlZiBhc3luY19nZW5fbWV0aG9kc1tdID0geworICAgIHsiYXNlbmQiLCAoUHlDRnVuY3Rpb24pYXN5bmNfZ2VuX2FzZW5kLCBNRVRIX08sIGFzeW5jX2FzZW5kX2RvY30sCisgICAgeyJhdGhyb3ciLChQeUNGdW5jdGlvbilhc3luY19nZW5fYXRocm93LCBNRVRIX1ZBUkFSR1MsIGFzeW5jX2F0aHJvd19kb2N9LAorICAgIHsiYWNsb3NlIiwgKFB5Q0Z1bmN0aW9uKWFzeW5jX2dlbl9hY2xvc2UsIE1FVEhfTk9BUkdTLCBhc3luY19hY2xvc2VfZG9jfSwKKyAgICB7TlVMTCwgTlVMTH0gICAgICAgIC8qIFNlbnRpbmVsICovCit9OworCisKK3N0YXRpYyBQeUFzeW5jTWV0aG9kcyBhc3luY19nZW5fYXNfYXN5bmMgPSB7CisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbV9hd2FpdCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW1fYWl0ZXIgKi8KKyAgICAodW5hcnlmdW5jKWFzeW5jX2dlbl9hbmV4dCAgICAgICAgICAgICAgICAgIC8qIGFtX2FuZXh0ICovCit9OworCisKK1B5VHlwZU9iamVjdCBQeUFzeW5jR2VuX1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiYXN5bmNfZ2VuZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlBc3luY0dlbk9iamVjdCksICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZ2VuX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgICZhc3luY19nZW5fYXNfYXN5bmMsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYXN5bmMgKi8KKyAgICAocmVwcmZ1bmMpYXN5bmNfZ2VuX3JlcHIsICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0hBVkVfRklOQUxJWkUsICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpYXN5bmNfZ2VuX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKFB5QXN5bmNHZW5PYmplY3QsIGFnX3dlYWtyZWZsaXN0KSwgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgYXN5bmNfZ2VuX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgYXN5bmNfZ2VuX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgYXN5bmNfZ2VuX2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pc19nYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FjaGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N1YmNsYXNzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb25fdGFnICovCisgICAgX1B5R2VuX0ZpbmFsaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9maW5hbGl6ZSAqLworfTsKKworCitQeU9iamVjdCAqCitQeUFzeW5jR2VuX05ldyhQeUZyYW1lT2JqZWN0ICpmLCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnF1YWxuYW1lKQoreworICAgIFB5QXN5bmNHZW5PYmplY3QgKm87CisgICAgbyA9IChQeUFzeW5jR2VuT2JqZWN0ICopZ2VuX25ld193aXRoX3F1YWxuYW1lKAorICAgICAgICAmUHlBc3luY0dlbl9UeXBlLCBmLCBuYW1lLCBxdWFsbmFtZSk7CisgICAgaWYgKG8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgby0+YWdfZmluYWxpemVyID0gTlVMTDsKKyAgICBvLT5hZ19jbG9zZWQgPSAwOworICAgIG8tPmFnX2hvb2tzX2luaXRlZCA9IDA7CisgICAgcmV0dXJuIChQeU9iamVjdCopbzsKK30KKworCitpbnQKK1B5QXN5bmNHZW5fQ2xlYXJGcmVlTGlzdHModm9pZCkKK3sKKyAgICBpbnQgcmV0ID0gYWdfdmFsdWVfZnJlZWxpc3RfZnJlZSArIGFnX2FzZW5kX2ZyZWVsaXN0X2ZyZWU7CisKKyAgICB3aGlsZSAoYWdfdmFsdWVfZnJlZWxpc3RfZnJlZSkgeworICAgICAgICBfUHlBc3luY0dlbldyYXBwZWRWYWx1ZSAqbzsKKyAgICAgICAgbyA9IGFnX3ZhbHVlX2ZyZWVsaXN0Wy0tYWdfdmFsdWVfZnJlZWxpc3RfZnJlZV07CisgICAgICAgIGFzc2VydChfUHlBc3luY0dlbldyYXBwZWRWYWx1ZV9DaGVja0V4YWN0KG8pKTsKKyAgICAgICAgUHlPYmplY3RfRGVsKG8pOworICAgIH0KKworICAgIHdoaWxlIChhZ19hc2VuZF9mcmVlbGlzdF9mcmVlKSB7CisgICAgICAgIFB5QXN5bmNHZW5BU2VuZCAqbzsKKyAgICAgICAgbyA9IGFnX2FzZW5kX2ZyZWVsaXN0Wy0tYWdfYXNlbmRfZnJlZWxpc3RfZnJlZV07CisgICAgICAgIGFzc2VydChQeV9UWVBFKG8pID09ICZfUHlBc3luY0dlbkFTZW5kX1R5cGUpOworICAgICAgICBQeU9iamVjdF9EZWwobyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZAorUHlBc3luY0dlbl9GaW5pKHZvaWQpCit7CisgICAgUHlBc3luY0dlbl9DbGVhckZyZWVMaXN0cygpOworfQorCisKK3N0YXRpYyBQeU9iamVjdCAqCithc3luY19nZW5fdW53cmFwX3ZhbHVlKFB5QXN5bmNHZW5PYmplY3QgKmdlbiwgUHlPYmplY3QgKnJlc3VsdCkKK3sKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BBc3luY0l0ZXJhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wQXN5bmNJdGVyYXRpb24pCisgICAgICAgICAgICB8fCBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0dlbmVyYXRvckV4aXQpCisgICAgICAgICkgeworICAgICAgICAgICAgZ2VuLT5hZ19jbG9zZWQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKF9QeUFzeW5jR2VuV3JhcHBlZFZhbHVlX0NoZWNrRXhhY3QocmVzdWx0KSkgeworICAgICAgICAvKiBhc3luYyB5aWVsZCAqLworICAgICAgICBQeU9iamVjdCAqZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCisgICAgICAgICAgICBQeUV4Y19TdG9wSXRlcmF0aW9uLAorICAgICAgICAgICAgKChfUHlBc3luY0dlbldyYXBwZWRWYWx1ZSopcmVzdWx0KS0+YWd3X3ZhbCwKKyAgICAgICAgICAgIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgaWYgKGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX1N0b3BJdGVyYXRpb24sIGUpOworICAgICAgICBQeV9ERUNSRUYoZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogLS0tLS0tLS0tLSBBc3luYyBHZW5lcmF0b3IgQVNlbmQgQXdhaXRhYmxlIC0tLS0tLS0tLS0tLSAqLworCisKK3N0YXRpYyB2b2lkCithc3luY19nZW5fYXNlbmRfZGVhbGxvYyhQeUFzeW5jR2VuQVNlbmQgKm8pCit7CisgICAgUHlfQ0xFQVIoby0+YWdzX2dlbik7CisgICAgUHlfQ0xFQVIoby0+YWdzX3NlbmR2YWwpOworICAgIGlmIChhZ19hc2VuZF9mcmVlbGlzdF9mcmVlIDwgX1B5QXN5bmNHZW5fTUFYRlJFRUxJU1QpIHsKKyAgICAgICAgYXNzZXJ0KFB5QXN5bmNHZW5BU2VuZF9DaGVja0V4YWN0KG8pKTsKKyAgICAgICAgYWdfYXNlbmRfZnJlZWxpc3RbYWdfYXNlbmRfZnJlZWxpc3RfZnJlZSsrXSA9IG87CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlPYmplY3RfRGVsKG8pOworICAgIH0KK30KKworCitzdGF0aWMgUHlPYmplY3QgKgorYXN5bmNfZ2VuX2FzZW5kX3NlbmQoUHlBc3luY0dlbkFTZW5kICpvLCBQeU9iamVjdCAqYXJnKQoreworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBpZiAoby0+YWdzX3N0YXRlID09IEFXQUlUQUJMRV9TVEFURV9DTE9TRUQpIHsKKyAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG8tPmFnc19zdGF0ZSA9PSBBV0FJVEFCTEVfU1RBVEVfSU5JVCkgeworICAgICAgICBpZiAoYXJnID09IE5VTEwgfHwgYXJnID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGFyZyA9IG8tPmFnc19zZW5kdmFsOworICAgICAgICB9CisgICAgICAgIG8tPmFnc19zdGF0ZSA9IEFXQUlUQUJMRV9TVEFURV9JVEVSOworICAgIH0KKworICAgIHJlc3VsdCA9IGdlbl9zZW5kX2V4KChQeUdlbk9iamVjdCopby0+YWdzX2dlbiwgYXJnLCAwLCAwKTsKKyAgICByZXN1bHQgPSBhc3luY19nZW5fdW53cmFwX3ZhbHVlKG8tPmFnc19nZW4sIHJlc3VsdCk7CisKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgby0+YWdzX3N0YXRlID0gQVdBSVRBQkxFX1NUQVRFX0NMT1NFRDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBQeU9iamVjdCAqCithc3luY19nZW5fYXNlbmRfaXRlcm5leHQoUHlBc3luY0dlbkFTZW5kICpvKQoreworICAgIHJldHVybiBhc3luY19nZW5fYXNlbmRfc2VuZChvLCBOVUxMKTsKK30KKworCitzdGF0aWMgUHlPYmplY3QgKgorYXN5bmNfZ2VuX2FzZW5kX3Rocm93KFB5QXN5bmNHZW5BU2VuZCAqbywgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgIGlmIChvLT5hZ3Nfc3RhdGUgPT0gQVdBSVRBQkxFX1NUQVRFX0NMT1NFRCkgeworICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBnZW5fdGhyb3coKFB5R2VuT2JqZWN0KilvLT5hZ3NfZ2VuLCBhcmdzKTsKKyAgICByZXN1bHQgPSBhc3luY19nZW5fdW53cmFwX3ZhbHVlKG8tPmFnc19nZW4sIHJlc3VsdCk7CisKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgby0+YWdzX3N0YXRlID0gQVdBSVRBQkxFX1NUQVRFX0NMT1NFRDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBQeU9iamVjdCAqCithc3luY19nZW5fYXNlbmRfY2xvc2UoUHlBc3luY0dlbkFTZW5kICpvLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBvLT5hZ3Nfc3RhdGUgPSBBV0FJVEFCTEVfU1RBVEVfQ0xPU0VEOworICAgIFB5X1JFVFVSTl9OT05FOworfQorCisKK3N0YXRpYyBQeU1ldGhvZERlZiBhc3luY19nZW5fYXNlbmRfbWV0aG9kc1tdID0geworICAgIHsic2VuZCIsIChQeUNGdW5jdGlvbilhc3luY19nZW5fYXNlbmRfc2VuZCwgTUVUSF9PLCBzZW5kX2RvY30sCisgICAgeyJ0aHJvdyIsIChQeUNGdW5jdGlvbilhc3luY19nZW5fYXNlbmRfdGhyb3csIE1FVEhfVkFSQVJHUywgdGhyb3dfZG9jfSwKKyAgICB7ImNsb3NlIiwgKFB5Q0Z1bmN0aW9uKWFzeW5jX2dlbl9hc2VuZF9jbG9zZSwgTUVUSF9OT0FSR1MsIGNsb3NlX2RvY30sCisgICAge05VTEwsIE5VTEx9ICAgICAgICAvKiBTZW50aW5lbCAqLworfTsKKworCitzdGF0aWMgUHlBc3luY01ldGhvZHMgYXN5bmNfZ2VuX2FzZW5kX2FzX2FzeW5jID0geworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW1fYXdhaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFtX2FpdGVyICovCisgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbV9hbmV4dCAqLworfTsKKworCitQeVR5cGVPYmplY3QgX1B5QXN5bmNHZW5BU2VuZF9UeXBlID0geworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImFzeW5jX2dlbmVyYXRvcl9hc2VuZCIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5QXN5bmNHZW5BU2VuZCksICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWFzeW5jX2dlbl9hc2VuZF9kZWFsbG9jLCAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAmYXN5bmNfZ2VuX2FzZW5kX2FzX2FzeW5jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2FzeW5jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpYXN5bmNfZ2VuX2FzZW5kX2l0ZXJuZXh0LCAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBhc3luY19nZW5fYXNlbmRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KK307CisKKworc3RhdGljIFB5T2JqZWN0ICoKK2FzeW5jX2dlbl9hc2VuZF9uZXcoUHlBc3luY0dlbk9iamVjdCAqZ2VuLCBQeU9iamVjdCAqc2VuZHZhbCkKK3sKKyAgICBQeUFzeW5jR2VuQVNlbmQgKm87CisgICAgaWYgKGFnX2FzZW5kX2ZyZWVsaXN0X2ZyZWUpIHsKKyAgICAgICAgYWdfYXNlbmRfZnJlZWxpc3RfZnJlZS0tOworICAgICAgICBvID0gYWdfYXNlbmRfZnJlZWxpc3RbYWdfYXNlbmRfZnJlZWxpc3RfZnJlZV07CisgICAgICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbyA9IFB5T2JqZWN0X05ldyhQeUFzeW5jR2VuQVNlbmQsICZfUHlBc3luY0dlbkFTZW5kX1R5cGUpOworICAgICAgICBpZiAobyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFB5X0lOQ1JFRihnZW4pOworICAgIG8tPmFnc19nZW4gPSBnZW47CisKKyAgICBQeV9YSU5DUkVGKHNlbmR2YWwpOworICAgIG8tPmFnc19zZW5kdmFsID0gc2VuZHZhbDsKKworICAgIG8tPmFnc19zdGF0ZSA9IEFXQUlUQUJMRV9TVEFURV9JTklUOworICAgIHJldHVybiAoUHlPYmplY3QqKW87Cit9CisKKworLyogLS0tLS0tLS0tLSBBc3luYyBHZW5lcmF0b3IgVmFsdWUgV3JhcHBlciAtLS0tLS0tLS0tLS0gKi8KKworCitzdGF0aWMgdm9pZAorYXN5bmNfZ2VuX3dyYXBwZWRfdmFsX2RlYWxsb2MoX1B5QXN5bmNHZW5XcmFwcGVkVmFsdWUgKm8pCit7CisgICAgUHlfQ0xFQVIoby0+YWd3X3ZhbCk7CisgICAgaWYgKGFnX3ZhbHVlX2ZyZWVsaXN0X2ZyZWUgPCBfUHlBc3luY0dlbl9NQVhGUkVFTElTVCkgeworICAgICAgICBhc3NlcnQoX1B5QXN5bmNHZW5XcmFwcGVkVmFsdWVfQ2hlY2tFeGFjdChvKSk7CisgICAgICAgIGFnX3ZhbHVlX2ZyZWVsaXN0W2FnX3ZhbHVlX2ZyZWVsaXN0X2ZyZWUrK10gPSBvOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5T2JqZWN0X0RlbChvKTsKKyAgICB9Cit9CisKKworUHlUeXBlT2JqZWN0IF9QeUFzeW5jR2VuV3JhcHBlZFZhbHVlX1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiYXN5bmNfZ2VuZXJhdG9yX3dyYXBwZWRfdmFsdWUiLCAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoX1B5QXN5bmNHZW5XcmFwcGVkVmFsdWUpLCAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpYXN5bmNfZ2VuX3dyYXBwZWRfdmFsX2RlYWxsb2MsICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYXN5bmMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworfTsKKworCitQeU9iamVjdCAqCitfUHlBc3luY0dlblZhbHVlV3JhcHBlck5ldyhQeU9iamVjdCAqdmFsKQoreworICAgIF9QeUFzeW5jR2VuV3JhcHBlZFZhbHVlICpvOworICAgIGFzc2VydCh2YWwpOworCisgICAgaWYgKGFnX3ZhbHVlX2ZyZWVsaXN0X2ZyZWUpIHsKKyAgICAgICAgYWdfdmFsdWVfZnJlZWxpc3RfZnJlZS0tOworICAgICAgICBvID0gYWdfdmFsdWVfZnJlZWxpc3RbYWdfdmFsdWVfZnJlZWxpc3RfZnJlZV07CisgICAgICAgIGFzc2VydChfUHlBc3luY0dlbldyYXBwZWRWYWx1ZV9DaGVja0V4YWN0KG8pKTsKKyAgICAgICAgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QqKW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIG8gPSBQeU9iamVjdF9OZXcoX1B5QXN5bmNHZW5XcmFwcGVkVmFsdWUsICZfUHlBc3luY0dlbldyYXBwZWRWYWx1ZV9UeXBlKTsKKyAgICAgICAgaWYgKG8gPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgby0+YWd3X3ZhbCA9IHZhbDsKKyAgICBQeV9JTkNSRUYodmFsKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0KilvOworfQorCisKKy8qIC0tLS0tLS0tLS0gQXN5bmMgR2VuZXJhdG9yIEFUaHJvdyBhd2FpdGFibGUgLS0tLS0tLS0tLS0tICovCisKKworc3RhdGljIHZvaWQKK2FzeW5jX2dlbl9hdGhyb3dfZGVhbGxvYyhQeUFzeW5jR2VuQVRocm93ICpvKQoreworICAgIFB5X0NMRUFSKG8tPmFndF9nZW4pOworICAgIFB5X0NMRUFSKG8tPmFndF9hcmdzKTsKKyAgICBQeU9iamVjdF9EZWwobyk7Cit9CisKKworc3RhdGljIFB5T2JqZWN0ICoKK2FzeW5jX2dlbl9hdGhyb3dfc2VuZChQeUFzeW5jR2VuQVRocm93ICpvLCBQeU9iamVjdCAqYXJnKQoreworICAgIFB5R2VuT2JqZWN0ICpnZW4gPSAoUHlHZW5PYmplY3QqKW8tPmFndF9nZW47CisgICAgUHlGcmFtZU9iamVjdCAqZiA9IGdlbi0+Z2lfZnJhbWU7CisgICAgUHlPYmplY3QgKnJldHZhbDsKKworICAgIGlmIChmID09IE5VTEwgfHwgZi0+Zl9zdGFja3RvcCA9PSBOVUxMIHx8CisgICAgICAgICAgICBvLT5hZ3Rfc3RhdGUgPT0gQVdBSVRBQkxFX1NUQVRFX0NMT1NFRCkgeworICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoby0+YWd0X3N0YXRlID09IEFXQUlUQUJMRV9TVEFURV9JTklUKSB7CisgICAgICAgIGlmIChvLT5hZ3RfZ2VuLT5hZ19jbG9zZWQpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcmcgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgTk9OX0lOSVRfQ09ST19NU0cpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBvLT5hZ3Rfc3RhdGUgPSBBV0FJVEFCTEVfU1RBVEVfSVRFUjsKKworICAgICAgICBpZiAoby0+YWd0X2FyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogYWNsb3NlKCkgbW9kZSAqLworICAgICAgICAgICAgby0+YWd0X2dlbi0+YWdfY2xvc2VkID0gMTsKKworICAgICAgICAgICAgcmV0dmFsID0gX2dlbl90aHJvdygoUHlHZW5PYmplY3QgKilnZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvKiBEbyBub3QgY2xvc2UgZ2VuZXJhdG9yIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX0dlbmVyYXRvckV4aXQgaXMgcGFzc2VkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX0dlbmVyYXRvckV4aXQsIE5VTEwsIE5VTEwpOworCisgICAgICAgICAgICBpZiAocmV0dmFsICYmIF9QeUFzeW5jR2VuV3JhcHBlZFZhbHVlX0NoZWNrRXhhY3QocmV0dmFsKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgICAgIGdvdG8geWllbGRfY2xvc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdHlwOworICAgICAgICAgICAgUHlPYmplY3QgKnRiID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2YWwgPSBOVUxMOworCisgICAgICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKG8tPmFndF9hcmdzLCAiYXRocm93IiwgMSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cCwgJnZhbCwgJnRiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR2YWwgPSBfZ2VuX3Rocm93KChQeUdlbk9iamVjdCAqKWdlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8qIERvIG5vdCBjbG9zZSBnZW5lcmF0b3Igd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfR2VuZXJhdG9yRXhpdCBpcyBwYXNzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwLCB2YWwsIHRiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IGFzeW5jX2dlbl91bndyYXBfdmFsdWUoby0+YWd0X2dlbiwgcmV0dmFsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0dmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gY2hlY2tfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICBhc3NlcnQoby0+YWd0X3N0YXRlID09IEFXQUlUQUJMRV9TVEFURV9JVEVSKTsKKworICAgIHJldHZhbCA9IGdlbl9zZW5kX2V4KChQeUdlbk9iamVjdCAqKWdlbiwgYXJnLCAwLCAwKTsKKyAgICBpZiAoby0+YWd0X2FyZ3MpIHsKKyAgICAgICAgcmV0dXJuIGFzeW5jX2dlbl91bndyYXBfdmFsdWUoby0+YWd0X2dlbiwgcmV0dmFsKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBhY2xvc2UoKSBtb2RlICovCisgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgIGlmIChfUHlBc3luY0dlbldyYXBwZWRWYWx1ZV9DaGVja0V4YWN0KHJldHZhbCkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICAgICAgICAgICAgICBnb3RvIHlpZWxkX2Nsb3NlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGdvdG8gY2hlY2tfZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKK3lpZWxkX2Nsb3NlOgorICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgUHlFeGNfUnVudGltZUVycm9yLCBBU1lOQ19HRU5fSUdOT1JFRF9FWElUX01TRyk7CisgICAgcmV0dXJuIE5VTEw7CisKK2NoZWNrX2Vycm9yOgorICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BBc3luY0l0ZXJhdGlvbikKKyAgICAgICAgfHwgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19HZW5lcmF0b3JFeGl0KQorICAgICkgeworICAgICAgICBvLT5hZ3Rfc3RhdGUgPSBBV0FJVEFCTEVfU1RBVEVfQ0xPU0VEOworICAgICAgICBQeUVycl9DbGVhcigpOyAgICAgICAgICAvKiBpZ25vcmUgdGhlc2UgZXJyb3JzICovCisgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyBQeU9iamVjdCAqCithc3luY19nZW5fYXRocm93X3Rocm93KFB5QXN5bmNHZW5BVGhyb3cgKm8sIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5T2JqZWN0ICpyZXR2YWw7CisKKyAgICBpZiAoby0+YWd0X3N0YXRlID09IEFXQUlUQUJMRV9TVEFURV9JTklUKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIE5PTl9JTklUX0NPUk9fTVNHKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG8tPmFndF9zdGF0ZSA9PSBBV0FJVEFCTEVfU1RBVEVfQ0xPU0VEKSB7CisgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHZhbCA9IGdlbl90aHJvdygoUHlHZW5PYmplY3QqKW8tPmFndF9nZW4sIGFyZ3MpOworICAgIGlmIChvLT5hZ3RfYXJncykgeworICAgICAgICByZXR1cm4gYXN5bmNfZ2VuX3Vud3JhcF92YWx1ZShvLT5hZ3RfZ2VuLCByZXR2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFjbG9zZSgpIG1vZGUgKi8KKyAgICAgICAgaWYgKHJldHZhbCAmJiBfUHlBc3luY0dlbldyYXBwZWRWYWx1ZV9DaGVja0V4YWN0KHJldHZhbCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgQVNZTkNfR0VOX0lHTk9SRURfRVhJVF9NU0cpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9Cit9CisKKworc3RhdGljIFB5T2JqZWN0ICoKK2FzeW5jX2dlbl9hdGhyb3dfaXRlcm5leHQoUHlBc3luY0dlbkFUaHJvdyAqbykKK3sKKyAgICByZXR1cm4gYXN5bmNfZ2VuX2F0aHJvd19zZW5kKG8sIFB5X05vbmUpOworfQorCisKK3N0YXRpYyBQeU9iamVjdCAqCithc3luY19nZW5fYXRocm93X2Nsb3NlKFB5QXN5bmNHZW5BVGhyb3cgKm8sIFB5T2JqZWN0ICphcmdzKQoreworICAgIG8tPmFndF9zdGF0ZSA9IEFXQUlUQUJMRV9TVEFURV9DTE9TRUQ7CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKKworc3RhdGljIFB5TWV0aG9kRGVmIGFzeW5jX2dlbl9hdGhyb3dfbWV0aG9kc1tdID0geworICAgIHsic2VuZCIsIChQeUNGdW5jdGlvbilhc3luY19nZW5fYXRocm93X3NlbmQsIE1FVEhfTywgc2VuZF9kb2N9LAorICAgIHsidGhyb3ciLCAoUHlDRnVuY3Rpb24pYXN5bmNfZ2VuX2F0aHJvd190aHJvdywgTUVUSF9WQVJBUkdTLCB0aHJvd19kb2N9LAorICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pYXN5bmNfZ2VuX2F0aHJvd19jbG9zZSwgTUVUSF9OT0FSR1MsIGNsb3NlX2RvY30sCisgICAge05VTEwsIE5VTEx9ICAgICAgICAvKiBTZW50aW5lbCAqLworfTsKKworCitzdGF0aWMgUHlBc3luY01ldGhvZHMgYXN5bmNfZ2VuX2F0aHJvd19hc19hc3luYyA9IHsKKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFtX2F3YWl0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbV9haXRlciAqLworICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW1fYW5leHQgKi8KK307CisKKworUHlUeXBlT2JqZWN0IF9QeUFzeW5jR2VuQVRocm93X1R5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiYXN5bmNfZ2VuZXJhdG9yX2F0aHJvdyIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlBc3luY0dlbkFUaHJvdyksICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpYXN5bmNfZ2VuX2F0aHJvd19kZWFsbG9jLCAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgICZhc3luY19nZW5fYXRocm93X2FzX2FzeW5jLCAgICAgICAgICAgICAgICAgLyogdHBfYXNfYXN5bmMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylhc3luY19nZW5fYXRocm93X2l0ZXJuZXh0LCAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGFzeW5jX2dlbl9hdGhyb3dfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworfTsKKworCitzdGF0aWMgUHlPYmplY3QgKgorYXN5bmNfZ2VuX2F0aHJvd19uZXcoUHlBc3luY0dlbk9iamVjdCAqZ2VuLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeUFzeW5jR2VuQVRocm93ICpvOworICAgIG8gPSBQeU9iamVjdF9OZXcoUHlBc3luY0dlbkFUaHJvdywgJl9QeUFzeW5jR2VuQVRocm93X1R5cGUpOworICAgIGlmIChvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG8tPmFndF9nZW4gPSBnZW47CisgICAgby0+YWd0X2FyZ3MgPSBhcmdzOworICAgIG8tPmFndF9zdGF0ZSA9IEFXQUlUQUJMRV9TVEFURV9JTklUOworICAgIFB5X0lOQ1JFRihnZW4pOworICAgIFB5X1hJTkNSRUYoYXJncyk7CisgICAgcmV0dXJuIChQeU9iamVjdCopbzsKK30KZGlmZiAtLWdpdCBhL09iamVjdHMvaXRlcm9iamVjdC5jIGIvT2JqZWN0cy9pdGVyb2JqZWN0LmMKaW5kZXggYWIyOWZmOC4uNzViMmZjYiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9pdGVyb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9pdGVyb2JqZWN0LmMKQEAgLTIwOCwzMCArMjA4LDMyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbGl0ZXJfaXRlcm5leHQoY2FsbGl0ZXJvYmplY3QgKml0KQogewotICAgIGlmIChpdC0+aXRfY2FsbGFibGUgIT0gTlVMTCkgewotICAgICAgICBQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KDApOwotICAgICAgICBQeU9iamVjdCAqcmVzdWx0OwotICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoaXQtPml0X2NhbGxhYmxlLCBhcmdzLCBOVUxMKTsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGludCBvazsKLSAgICAgICAgICAgIG9rID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0LT5pdF9zZW50aW5lbCwgcmVzdWx0LCBQeV9FUSk7Ci0gICAgICAgICAgICBpZiAob2sgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAvKiBDb21tb24gY2FzZSwgZmFzdCBwYXRoICovCi0gICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgIGlmIChvayA+IDApIHsKLSAgICAgICAgICAgICAgICBQeV9DTEVBUihpdC0+aXRfY2FsbGFibGUpOwotICAgICAgICAgICAgICAgIFB5X0NMRUFSKGl0LT5pdF9zZW50aW5lbCk7Ci0gICAgICAgICAgICB9CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgIGlmIChpdC0+aXRfY2FsbGFibGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBfUHlPYmplY3RfQ2FsbE5vQXJnKGl0LT5pdF9jYWxsYWJsZSk7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIGludCBvazsKKworICAgICAgICBvayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdC0+aXRfc2VudGluZWwsIHJlc3VsdCwgUHlfRVEpOworICAgICAgICBpZiAob2sgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsgLyogQ29tbW9uIGNhc2UsIGZhc3QgcGF0aCAqLwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpIHsKLSAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIGlmIChvayA+IDApIHsKICAgICAgICAgICAgIFB5X0NMRUFSKGl0LT5pdF9jYWxsYWJsZSk7CiAgICAgICAgICAgICBQeV9DTEVBUihpdC0+aXRfc2VudGluZWwpOwogICAgICAgICB9CiAgICAgfQorICAgIGVsc2UgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfQ0xFQVIoaXQtPml0X2NhbGxhYmxlKTsKKyAgICAgICAgUHlfQ0xFQVIoaXQtPml0X3NlbnRpbmVsKTsKKyAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvbGlzdG9iamVjdC5jIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKaW5kZXggODE1YTFiOS4uZGNkN2I1ZSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9saXN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICBuZXdfYWxsb2NhdGVkID0gKG5ld3NpemUgPj4gMykgKyAobmV3c2l6ZSA8IDkgPyAzIDogNik7CiAKICAgICAvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLwotICAgIGlmIChuZXdfYWxsb2NhdGVkID4gUFlfU0laRV9NQVggLSBuZXdzaXplKSB7CisgICAgaWYgKG5ld19hbGxvY2F0ZWQgPiBTSVpFX01BWCAtIG5ld3NpemUpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0gZWxzZSB7CkBAIC01OSw3ICs1OSw3IEBACiAgICAgaWYgKG5ld3NpemUgPT0gMCkKICAgICAgICAgbmV3X2FsbG9jYXRlZCA9IDA7CiAgICAgaXRlbXMgPSBzZWxmLT5vYl9pdGVtOwotICAgIGlmIChuZXdfYWxsb2NhdGVkIDw9IChQWV9TSVpFX01BWCAvIHNpemVvZihQeU9iamVjdCAqKSkpCisgICAgaWYgKG5ld19hbGxvY2F0ZWQgPD0gKFNJWkVfTUFYIC8gc2l6ZW9mKFB5T2JqZWN0ICopKSkKICAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW1zLCBQeU9iamVjdCAqLCBuZXdfYWxsb2NhdGVkKTsKICAgICBlbHNlCiAgICAgICAgIGl0ZW1zID0gTlVMTDsKQEAgLTgyLDYgKzgyLDE2IEBACiBzdGF0aWMgdm9pZAogc2hvd19hbGxvYyh2b2lkKQogeworICAgIFB5T2JqZWN0ICp4b3B0aW9ucywgKnZhbHVlOworICAgIF9QeV9JREVOVElGSUVSKHNob3dhbGxvY2NvdW50KTsKKworICAgIHhvcHRpb25zID0gUHlTeXNfR2V0WE9wdGlvbnMoKTsKKyAgICBpZiAoeG9wdGlvbnMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIHZhbHVlID0gX1B5RGljdF9HZXRJdGVtSWQoeG9wdGlvbnMsICZQeUlkX3Nob3dhbGxvY2NvdW50KTsKKyAgICBpZiAodmFsdWUgIT0gUHlfVHJ1ZSkKKyAgICAgICAgcmV0dXJuOworCiAgICAgZnByaW50ZihzdGRlcnIsICJMaXN0IGFsbG9jYXRpb25zOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAogICAgICAgICBjb3VudF9hbGxvYyk7CiAgICAgZnByaW50ZihzdGRlcnIsICJMaXN0IHJldXNlIHRocm91Z2ggZnJlZWxpc3Q6ICUiIFBZX0ZPUk1BVF9TSVpFX1QKQEAgLTEzMCw3ICsxNDAsNiBAQAogUHlMaXN0X05ldyhQeV9zc2l6ZV90IHNpemUpCiB7CiAgICAgUHlMaXN0T2JqZWN0ICpvcDsKLSAgICBzaXplX3QgbmJ5dGVzOwogI2lmZGVmIFNIT1dfQUxMT0NfQ09VTlQKICAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKICAgICBpZiAoIWluaXRpYWxpemVkKSB7CkBAIC0xNDMsMTEgKzE1Miw2IEBACiAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93IHdpdGhvdXQgYW4gYWN0dWFsIG92ZXJmbG93LAotICAgICAqICB3aGljaCBjYW4gY2F1c2UgY29tcGlsZXIgdG8gb3B0aW1pc2Ugb3V0ICovCi0gICAgaWYgKChzaXplX3Qpc2l6ZSA+IFBZX1NJWkVfTUFYIC8gc2l6ZW9mKFB5T2JqZWN0ICopKQotICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICBuYnl0ZXMgPSBzaXplICogc2l6ZW9mKFB5T2JqZWN0ICopOwogICAgIGlmIChudW1mcmVlKSB7CiAgICAgICAgIG51bWZyZWUtLTsKICAgICAgICAgb3AgPSBmcmVlX2xpc3RbbnVtZnJlZV07CkBAIC0xNjYsMTIgKzE3MCwxMSBAQAogICAgIGlmIChzaXplIDw9IDApCiAgICAgICAgIG9wLT5vYl9pdGVtID0gTlVMTDsKICAgICBlbHNlIHsKLSAgICAgICAgb3AtPm9iX2l0ZW0gPSAoUHlPYmplY3QgKiopIFB5TWVtX01BTExPQyhuYnl0ZXMpOworICAgICAgICBvcC0+b2JfaXRlbSA9IChQeU9iamVjdCAqKikgUHlNZW1fQ2FsbG9jKHNpemUsIHNpemVvZihQeU9iamVjdCAqKSk7CiAgICAgICAgIGlmIChvcC0+b2JfaXRlbSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYob3ApOwogICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIH0KLSAgICAgICAgbWVtc2V0KG9wLT5vYl9pdGVtLCAwLCBuYnl0ZXMpOwogICAgIH0KICAgICBQeV9TSVpFKG9wKSA9IHNpemU7CiAgICAgb3AtPmFsbG9jYXRlZCA9IHNpemU7CkBAIC0yMTYsNyArMjE5LDYgQEAKIFB5TGlzdF9TZXRJdGVtKFB5T2JqZWN0ICpvcCwgUHlfc3NpemVfdCBpLAogICAgICAgICAgICAgICAgUHlPYmplY3QgKm5ld2l0ZW0pCiB7Ci0gICAgUHlPYmplY3QgKm9sZGl0ZW07CiAgICAgUHlPYmplY3QgKipwOwogICAgIGlmICghUHlMaXN0X0NoZWNrKG9wKSkgewogICAgICAgICBQeV9YREVDUkVGKG5ld2l0ZW0pOwpAQCAtMjMwLDkgKzIzMiw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcCA9ICgoUHlMaXN0T2JqZWN0ICopb3ApIC0+IG9iX2l0ZW0gKyBpOwotICAgIG9sZGl0ZW0gPSAqcDsKLSAgICAqcCA9IG5ld2l0ZW07Ci0gICAgUHlfWERFQ1JFRihvbGRpdGVtKTsKKyAgICBQeV9YU0VUUkVGKCpwLCBuZXdpdGVtKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjUxLDcgKzI1MSw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbisxKSA9PSAtMSkKKyAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbisxKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIGlmICh3aGVyZSA8IDApIHsKQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIG4rMSkgPT0gLTEpCisgICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIG4rMSkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBQeV9JTkNSRUYodik7CkBAIC00ODEsOSArNDgxLDkgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogI2RlZmluZSBiICgoUHlMaXN0T2JqZWN0ICopYmIpCi0gICAgc2l6ZSA9IFB5X1NJWkUoYSkgKyBQeV9TSVpFKGIpOwotICAgIGlmIChzaXplIDwgMCkKKyAgICBpZiAoUHlfU0laRShhKSA+IFBZX1NTSVpFX1RfTUFYIC0gUHlfU0laRShiKSkKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgc2l6ZSA9IFB5X1NJWkUoYSkgKyBQeV9TSVpFKGIpOwogICAgIG5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KHNpemUpOwogICAgIGlmIChucCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNzE0LDcgKzcxNCw3IEBACiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogICAgIH0KIAotICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBzaXplKm4pID09IC0xKQorICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBzaXplKm4pIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBwID0gc2l6ZTsKQEAgLTczMyw3ICs3MzMsNiBAQAogc3RhdGljIGludAogbGlzdF9hc3NfaXRlbShQeUxpc3RPYmplY3QgKmEsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0gICAgUHlPYmplY3QgKm9sZF92YWx1ZTsKICAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKQEAgLTc0Miw5ICs3NDEsNyBAQAogICAgIGlmICh2ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBsaXN0X2Fzc19zbGljZShhLCBpLCBpKzEsIHYpOwogICAgIFB5X0lOQ1JFRih2KTsKLSAgICBvbGRfdmFsdWUgPSBhLT5vYl9pdGVtW2ldOwotICAgIGEtPm9iX2l0ZW1baV0gPSB2OwotICAgIFB5X0RFQ1JFRihvbGRfdmFsdWUpOworICAgIFB5X1NFVFJFRihhLT5vYl9pdGVtW2ldLCB2KTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtODA3LDcgKzgwNCw3IEBACiAgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICAgICAgfQogICAgICAgICBtID0gUHlfU0laRShzZWxmKTsKLSAgICAgICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIG0gKyBuKSA9PSAtMSkgeworICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbSArIG4pIDwgMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTgzNSwyMyArODMyLDI1IEBACiAKICAgICAvKiBHdWVzcyBhIHJlc3VsdCBsaXN0IHNpemUuICovCiAgICAgbiA9IFB5T2JqZWN0X0xlbmd0aEhpbnQoYiwgOCk7Ci0gICAgaWYgKG4gPT0gLTEpIHsKKyAgICBpZiAobiA8IDApIHsKICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIG0gPSBQeV9TSVpFKHNlbGYpOwotICAgIG1uID0gbSArIG47Ci0gICAgaWYgKG1uID49IG0pIHsKKyAgICBpZiAobSA+IFBZX1NTSVpFX1RfTUFYIC0gbikgeworICAgICAgICAvKiBtICsgbiBvdmVyZmxvd2VkOyBvbiB0aGUgY2hhbmNlIHRoYXQgbiBsaWVkLCBhbmQgdGhlcmUgcmVhbGx5CisgICAgICAgICAqIGlzIGVub3VnaCByb29tLCBpZ25vcmUgaXQuICBJZiBuIHdhcyB0ZWxsaW5nIHRoZSB0cnV0aCwgd2UnbGwKKyAgICAgICAgICogZXZlbnR1YWxseSBydW4gb3V0IG9mIG1lbW9yeSBkdXJpbmcgdGhlIGxvb3AuCisgICAgICAgICAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbW4gPSBtICsgbjsKICAgICAgICAgLyogTWFrZSByb29tLiAqLwotICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbW4pID09IC0xKQorICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbW4pIDwgMCkKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIC8qIE1ha2UgdGhlIGxpc3Qgc2FuZSBhZ2Fpbi4gKi8KICAgICAgICAgUHlfU0laRShzZWxmKSA9IG07CiAgICAgfQotICAgIC8qIEVsc2UgbSArIG4gb3ZlcmZsb3dlZDsgb24gdGhlIGNoYW5jZSB0aGF0IG4gbGllZCwgYW5kIHRoZXJlIHJlYWxseQotICAgICAqIGlzIGVub3VnaCByb29tLCBpZ25vcmUgaXQuICBJZiBuIHdhcyB0ZWxsaW5nIHRoZSB0cnV0aCwgd2UnbGwKLSAgICAgKiBldmVudHVhbGx5IHJ1biBvdXQgb2YgbWVtb3J5IGR1cmluZyB0aGUgbG9vcC4KLSAgICAgKi8KIAogICAgIC8qIFJ1biBpdGVyYXRvciB0byBleGhhdXN0aW9uLiAqLwogICAgIGZvciAoOzspIHsKQEAgLTI1MDAsOSArMjQ5OSw2IEBACiAgICAgICAgICAgICAgICAgc3RlcCA9IC1zdGVwOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhc3NlcnQoKHNpemVfdClzbGljZWxlbmd0aCA8PQotICAgICAgICAgICAgICAgICAgIFBZX1NJWkVfTUFYIC8gc2l6ZW9mKFB5T2JqZWN0KikpOwotCiAgICAgICAgICAgICBnYXJiYWdlID0gKFB5T2JqZWN0KiopCiAgICAgICAgICAgICAgICAgUHlNZW1fTUFMTE9DKHNsaWNlbGVuZ3RoKnNpemVvZihQeU9iamVjdCopKTsKICAgICAgICAgICAgIGlmICghZ2FyYmFnZSkgewpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9saXN0c29ydC50eHQgYi9PYmplY3RzL2xpc3Rzb3J0LnR4dAppbmRleCAxNTJhMjcwLi4xN2QyNzk3IDEwMDY0NAotLS0gYS9PYmplY3RzL2xpc3Rzb3J0LnR4dAorKysgYi9PYmplY3RzL2xpc3Rzb3J0LnR4dApAQCAtNDg2LDcgKzQ4Niw3IEBACiBJIGZpcnN0IGxlYXJuZWQgYWJvdXQgdGhlIGdhbGxvcGluZyBzdHJhdGVneSBpbiBhIHJlbGF0ZWQgY29udGV4dDsgc2VlOgogCiAgICAgIkFkYXB0aXZlIFNldCBJbnRlcnNlY3Rpb25zLCBVbmlvbnMsIGFuZCBEaWZmZXJlbmNlcyIgKDIwMDApCi0gICAgRXJpayBELiBEZW1haW5lLCBBbGVqYW5kcm8gTPNwZXotT3J0aXosIEouIElhbiBNdW5ybworICAgIEVyaWsgRC4gRGVtYWluZSwgQWxlamFuZHJvIEzDs3Blei1PcnRpeiwgSi4gSWFuIE11bnJvCiAKIGFuZCBpdHMgZm9sbG93dXAocykuICBBbiBlYXJsaWVyIHBhcGVyIGNhbGxlZCB0aGUgc2FtZSBzdHJhdGVneQogImV4cG9uZW50aWFsIHNlYXJjaCI6CmRpZmYgLS1naXQgYS9PYmplY3RzL2xub3RhYl9ub3Rlcy50eHQgYi9PYmplY3RzL2xub3RhYl9ub3Rlcy50eHQKaW5kZXggZDI0N2VkZC4uNTE1Mzc1NyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9sbm90YWJfbm90ZXMudHh0CisrKyBiL09iamVjdHMvbG5vdGFiX25vdGVzLnR4dApAQCAtMTIsNDIgKzEyLDQ3IEBACiAgICAgICAgIDAJCSAgICAxCiAgICAgICAgIDYJCSAgICAyCiAgICAgICAgNTAJCSAgICA3Ci0gICAgICAzNTAgICAgICAgICAgICAgICAgIDMwNwotICAgICAgMzYxICAgICAgICAgICAgICAgICAzMDgKKyAgICAgIDM1MCAgICAgICAgICAgICAgICAgMjA3CisgICAgICAzNjEgICAgICAgICAgICAgICAgIDIwOAogCiBJbnN0ZWFkIG9mIHN0b3JpbmcgdGhlc2UgbnVtYmVycyBsaXRlcmFsbHksIHdlIGNvbXByZXNzIHRoZSBsaXN0IGJ5IHN0b3Jpbmcgb25seQotdGhlIGluY3JlbWVudHMgZnJvbSBvbmUgcm93IHRvIHRoZSBuZXh0LiAgQ29uY2VwdHVhbGx5LCB0aGUgc3RvcmVkIGxpc3QgbWlnaHQKK3RoZSBkaWZmZXJlbmNlIGZyb20gb25lIHJvdyB0byB0aGUgbmV4dC4gIENvbmNlcHR1YWxseSwgdGhlIHN0b3JlZCBsaXN0IG1pZ2h0CiBsb29rIGxpa2U6CiAKLSAgICAwLCAxLCAgNiwgMSwgIDQ0LCA1LCAgMzAwLCAzMDAsICAxMSwgMQorICAgIDAsIDEsICA2LCAxLCAgNDQsIDUsICAzMDAsIDIwMCwgIDExLCAxCiAKLVRoZSBhYm92ZSBkb2Vzbid0IHJlYWxseSB3b3JrLCBidXQgaXQncyBhIHN0YXJ0LiBOb3RlIHRoYXQgYW4gdW5zaWduZWQgYnl0ZQotY2FuJ3QgaG9sZCBuZWdhdGl2ZSB2YWx1ZXMsIG9yIHZhbHVlcyBsYXJnZXIgdGhhbiAyNTUsIGFuZCB0aGUgYWJvdmUgZXhhbXBsZQotY29udGFpbnMgdHdvIHN1Y2ggdmFsdWVzLiBTbyB3ZSBtYWtlIHR3byB0d2Vha3M6CitUaGUgYWJvdmUgZG9lc24ndCByZWFsbHkgd29yaywgYnV0IGl0J3MgYSBzdGFydC4gQW4gdW5zaWduZWQgYnl0ZSAoYnl0ZSBjb2RlCitvZmZzZXQpIGNhbid0IGhvbGQgbmVnYXRpdmUgdmFsdWVzLCBvciB2YWx1ZXMgbGFyZ2VyIHRoYW4gMjU1LCBhIHNpZ25lZCBieXRlCisobGluZSBudW1iZXIpIGNhbid0IGhvbGQgdmFsdWVzIGxhcmdlciB0aGFuIDEyNyBvciBsZXNzIHRoYW4gLTEyOCwgYW5kIHRoZQorYWJvdmUgZXhhbXBsZSBjb250YWlucyB0d28gc3VjaCB2YWx1ZXMuIFNvIHdlIG1ha2UgdHdvIHR3ZWFrczoKIAotIChhKSB0aGVyZSdzIGEgZGVlcCBhc3N1bXB0aW9uIHRoYXQgYnl0ZSBjb2RlIG9mZnNldHMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcKLSBsaW5lICNzIGJvdGggaW5jcmVhc2UgbW9ub3RvbmljYWxseSwgYW5kCi0gKGIpIGlmIGF0IGxlYXN0IG9uZSBjb2x1bW4ganVtcHMgYnkgbW9yZSB0aGFuIDI1NSBmcm9tIG9uZSByb3cgdG8gdGhlIG5leHQsCi0gbW9yZSB0aGFuIG9uZSBwYWlyIGlzIHdyaXR0ZW4gdG8gdGhlIHRhYmxlLiBJbiBjYXNlICNiLCB0aGVyZSdzIG5vIHdheSB0byBrbm93Ci0gZnJvbSBsb29raW5nIGF0IHRoZSB0YWJsZSBsYXRlciBob3cgbWFueSB3ZXJlIHdyaXR0ZW4uICBUaGF0J3MgdGhlIGRlbGljYXRlCi0gcGFydC4gIEEgdXNlciBvZiBjb19sbm90YWIgZGVzaXJpbmcgdG8gZmluZCB0aGUgc291cmNlIGxpbmUgbnVtYmVyCi0gY29ycmVzcG9uZGluZyB0byBhIGJ5dGVjb2RlIGFkZHJlc3MgQSBzaG91bGQgZG8gc29tZXRoaW5nIGxpa2UgdGhpcworIChhKSB0aGVyZSdzIGEgZGVlcCBhc3N1bXB0aW9uIHRoYXQgYnl0ZSBjb2RlIG9mZnNldHMgaW5jcmVhc2UgbW9ub3RvbmljYWxseSwKKyBhbmQKKyAoYikgaWYgYnl0ZSBjb2RlIG9mZnNldCBqdW1wcyBieSBtb3JlIHRoYW4gMjU1IGZyb20gb25lIHJvdyB0byB0aGUgbmV4dCwgb3IgaWYKKyBzb3VyY2UgY29kZSBsaW5lIG51bWJlciBqdW1wcyBieSBtb3JlIHRoYW4gMTI3IG9yIGxlc3MgdGhhbiAtMTI4IGZyb20gb25lIHJvdworIHRvIHRoZSBuZXh0LCBtb3JlIHRoYW4gb25lIHBhaXIgaXMgd3JpdHRlbiB0byB0aGUgdGFibGUuIEluIGNhc2UgI2IsCisgdGhlcmUncyBubyB3YXkgdG8ga25vdyBmcm9tIGxvb2tpbmcgYXQgdGhlIHRhYmxlIGxhdGVyIGhvdyBtYW55IHdlcmUgd3JpdHRlbi4KKyBUaGF0J3MgdGhlIGRlbGljYXRlIHBhcnQuICBBIHVzZXIgb2YgY29fbG5vdGFiIGRlc2lyaW5nIHRvIGZpbmQgdGhlIHNvdXJjZQorIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gYSBieXRlY29kZSBhZGRyZXNzIEEgc2hvdWxkIGRvIHNvbWV0aGluZyBsaWtlCisgdGhpczoKIAogICAgIGxpbmVubyA9IGFkZHIgPSAwCiAgICAgZm9yIGFkZHJfaW5jciwgbGluZV9pbmNyIGluIGNvX2xub3RhYjoKICAgICAgICAgYWRkciArPSBhZGRyX2luY3IKICAgICAgICAgaWYgYWRkciA+IEE6CiAgICAgICAgICAgICByZXR1cm4gbGluZW5vCisgICAgICAgIGlmIGxpbmVfaW5jciA+PSAweDgwOgorICAgICAgICAgICAgbGluZV9pbmNyIC09IDB4MTAwCiAgICAgICAgIGxpbmVubyArPSBsaW5lX2luY3IKIAogKEluIEMsIHRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgUHlDb2RlX0FkZHIyTGluZSgpLikgIEluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmssCiB3aGVuIHRoZSBhZGRyIGZpZWxkIGluY3JlbWVudHMgYnkgbW9yZSB0aGFuIDI1NSwgdGhlIGxpbmUgIyBpbmNyZW1lbnQgaW4gZWFjaAogcGFpciBnZW5lcmF0ZWQgbXVzdCBiZSAwIHVudGlsIHRoZSByZW1haW5pbmcgYWRkciBpbmNyZW1lbnQgaXMgPCAyNTYuICBTbywgaW4KIHRoZSBleGFtcGxlIGFib3ZlLCBhc3NlbWJsZV9sbm90YWIgaW4gY29tcGlsZS5jIHNob3VsZCBub3QgKGFzIHdhcyBhY3R1YWxseSBkb25lCi11bnRpbCAyLjIpIGV4cGFuZCAzMDAsIDMwMCB0bwordW50aWwgMi4yKSBleHBhbmQgMzAwLCAyMDAgdG8KICAgICAyNTUsIDI1NSwgNDUsIDQ1LAogYnV0IHRvCi0gICAgMjU1LCAwLCA0NSwgMjU1LCAwLCA0NS4KKyAgICAyNTUsIDAsIDQ1LCAxMjgsIDAsIDcyLgogCiBUaGUgYWJvdmUgaXMgc3VmZmljaWVudCB0byByZWNvbnN0cnVjdCBsaW5lIG51bWJlcnMgZm9yIHRyYWNlYmFja3MsIGJ1dCBub3QgZm9yCiBsaW5lIHRyYWNpbmcuICBUcmFjaW5nIGlzIGhhbmRsZWQgYnkgUHlDb2RlX0NoZWNrTGluZU51bWJlcigpIGluIGNvZGVvYmplY3QuYwpAQCAtOTAsMTYgKzk1LDE2IEBACiAgICAgICAgICAgICAgIDYgUE9QX0pVTVBfSUZfRkFMU0UgICAgICAgMTcKIAogICAzICAgICAgICAgICA5IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgICAgIDEyIFBSSU5UX0lURU0gICAgICAgICAgCisgICAgICAgICAgICAgMTIgUFJJTlRfSVRFTQogCi0gIDQgICAgICAgICAgMTMgQlJFQUtfTE9PUCAgICAgICAgICAKKyAgNCAgICAgICAgICAxMyBCUkVBS19MT09QCiAgICAgICAgICAgICAgMTQgSlVNUF9BQlNPTFVURSAgICAgICAgICAgIDMKLSAgICAgICAgPj4gICAxNyBQT1BfQkxPQ0sgICAgICAgICAgIAorICAgICAgICA+PiAgIDE3IFBPUF9CTE9DSwogCiAgIDYgICAgICAgICAgMTggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDIpCi0gICAgICAgICAgICAgMjEgUFJJTlRfSVRFTSAgICAgICAgICAKKyAgICAgICAgICAgICAyMSBQUklOVF9JVEVNCiAgICAgICAgID4+ICAgMjIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMjUgUkVUVVJOX1ZBTFVFICAgICAgICAKKyAgICAgICAgICAgICAyNSBSRVRVUk5fVkFMVUUKIAogSWYgJ2EnIGlzIGZhbHNlLCBleGVjdXRpb24gd2lsbCBqdW1wIHRvIHRoZSBQT1BfQkxPQ0sgaW5zdHJ1Y3Rpb24gYXQgb2Zmc2V0IDE3CiBhbmQgdGhlIGNvX2xub3RhYiB3aWxsIGNsYWltIHRoYXQgZXhlY3V0aW9uIGhhcyBtb3ZlZCB0byBsaW5lIDQsIHdoaWNoIGlzIHdyb25nLgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9sb25nb2JqZWN0LmMgYi9PYmplY3RzL2xvbmdvYmplY3QuYwppbmRleCA5YjYyZDkyLi43NDBiN2Y1IDEwMDY0NAotLS0gYS9PYmplY3RzL2xvbmdvYmplY3QuYworKysgYi9PYmplY3RzL2xvbmdvYmplY3QuYwpAQCAtNzIxLDcgKzcyMSw3IEBACiAgICAgYXNzZXJ0KG5kaWdpdHMgPT0gMCB8fCB2LT5vYl9kaWdpdFtuZGlnaXRzIC0gMV0gIT0gMCk7CiAgICAgaWYgKG5kaWdpdHMgPiAwKSB7CiAgICAgICAgIGRpZ2l0IG1zZCA9IHYtPm9iX2RpZ2l0W25kaWdpdHMgLSAxXTsKLSAgICAgICAgaWYgKChzaXplX3QpKG5kaWdpdHMgLSAxKSA+IFBZX1NJWkVfTUFYIC8gKHNpemVfdClQeUxvbmdfU0hJRlQpCisgICAgICAgIGlmICgoc2l6ZV90KShuZGlnaXRzIC0gMSkgPiBTSVpFX01BWCAvIChzaXplX3QpUHlMb25nX1NISUZUKQogICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKICAgICAgICAgcmVzdWx0ID0gKHNpemVfdCkobmRpZ2l0cyAtIDEpICogKHNpemVfdClQeUxvbmdfU0hJRlQ7CiAgICAgICAgIGRvIHsKQEAgLTk4OSwxNiArOTg5LDEzIEBACiBQeUxvbmdfRnJvbVZvaWRQdHIodm9pZCAqcCkKIHsKICNpZiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HCi0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKShQeV91aW50cHRyX3QpcCk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKSh1aW50cHRyX3QpcCk7CiAjZWxzZQogCi0jaWZuZGVmIEhBVkVfTE9OR19MT05HCi0jICAgZXJyb3IgIlB5TG9uZ19Gcm9tVm9pZFB0cjogc2l6ZW9mKHZvaWQqKSA+IHNpemVvZihsb25nKSwgYnV0IG5vIGxvbmcgbG9uZyIKLSNlbmRpZgogI2lmIFNJWkVPRl9MT05HX0xPTkcgPCBTSVpFT0ZfVk9JRF9QCi0jICAgZXJyb3IgIlB5TG9uZ19Gcm9tVm9pZFB0cjogc2l6ZW9mKFBZX0xPTkdfTE9ORykgPCBzaXplb2Yodm9pZCopIgorIyAgIGVycm9yICJQeUxvbmdfRnJvbVZvaWRQdHI6IHNpemVvZihsb25nIGxvbmcpIDwgc2l6ZW9mKHZvaWQqKSIKICNlbmRpZgotICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoUHlfdWludHB0cl90KXApOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoKHVuc2lnbmVkIGxvbmcgbG9uZykodWludHB0cl90KXApOwogI2VuZGlmIC8qIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcgKi8KIAogfQpAQCAtMTAxNywxMyArMTAxNCwxMCBAQAogICAgICAgICB4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHZ2KTsKICNlbHNlCiAKLSNpZm5kZWYgSEFWRV9MT05HX0xPTkcKLSMgICBlcnJvciAiUHlMb25nX0FzVm9pZFB0cjogc2l6ZW9mKHZvaWQqKSA+IHNpemVvZihsb25nKSwgYnV0IG5vIGxvbmcgbG9uZyIKLSNlbmRpZgogI2lmIFNJWkVPRl9MT05HX0xPTkcgPCBTSVpFT0ZfVk9JRF9QCi0jICAgZXJyb3IgIlB5TG9uZ19Bc1ZvaWRQdHI6IHNpemVvZihQWV9MT05HX0xPTkcpIDwgc2l6ZW9mKHZvaWQqKSIKKyMgICBlcnJvciAiUHlMb25nX0FzVm9pZFB0cjogc2l6ZW9mKGxvbmcgbG9uZykgPCBzaXplb2Yodm9pZCopIgogI2VuZGlmCi0gICAgUFlfTE9OR19MT05HIHg7CisgICAgbG9uZyBsb25nIHg7CiAKICAgICBpZiAoUHlMb25nX0NoZWNrKHZ2KSAmJiBfUHlMb25nX1NpZ24odnYpIDwgMCkKICAgICAgICAgeCA9IFB5TG9uZ19Bc0xvbmdMb25nKHZ2KTsKQEAgLTEwMzcsMjIgKzEwMzEsMjAgQEAKICAgICByZXR1cm4gKHZvaWQgKil4OwogfQogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQotLyogSW5pdGlhbCBQWV9MT05HX0xPTkcgc3VwcG9ydCBieSBDaHJpcyBIZXJib3J0aCAoY2hyaXNoQHFueC5jb20pLCBsYXRlcgorLyogSW5pdGlhbCBsb25nIGxvbmcgc3VwcG9ydCBieSBDaHJpcyBIZXJib3J0aCAoY2hyaXNoQHFueC5jb20pLCBsYXRlcgogICogcmV3cml0dGVuIHRvIHVzZSB0aGUgbmV3ZXIgUHlMb25nX3tBcyxGcm9tfUJ5dGVBcnJheSBBUEkuCiAgKi8KIAotI2RlZmluZSBQWV9BQlNfTExPTkdfTUlOICgwLSh1bnNpZ25lZCBQWV9MT05HX0xPTkcpUFlfTExPTkdfTUlOKQorI2RlZmluZSBQWV9BQlNfTExPTkdfTUlOICgwLSh1bnNpZ25lZCBsb25nIGxvbmcpUFlfTExPTkdfTUlOKQogCi0vKiBDcmVhdGUgYSBuZXcgaW50IG9iamVjdCBmcm9tIGEgQyBQWV9MT05HX0xPTkcgaW50LiAqLworLyogQ3JlYXRlIGEgbmV3IGludCBvYmplY3QgZnJvbSBhIEMgbG9uZyBsb25nIGludC4gKi8KIAogUHlPYmplY3QgKgotUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MT05HX0xPTkcgaXZhbCkKK1B5TG9uZ19Gcm9tTG9uZ0xvbmcobG9uZyBsb25nIGl2YWwpCiB7CiAgICAgUHlMb25nT2JqZWN0ICp2OwotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBhYnNfaXZhbDsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdDsgIC8qIHVuc2lnbmVkIHNvID4+IGRvZXNuJ3QgcHJvcGFnYXRlIHNpZ24gYml0ICovCisgICAgdW5zaWduZWQgbG9uZyBsb25nIGFic19pdmFsOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0OyAgLyogdW5zaWduZWQgc28gPj4gZG9lc24ndCBwcm9wYWdhdGUgc2lnbiBiaXQgKi8KICAgICBpbnQgbmRpZ2l0cyA9IDA7CiAgICAgaW50IG5lZ2F0aXZlID0gMDsKIApAQCAtMTA2MCwxMSArMTA1MiwxMSBAQAogICAgIGlmIChpdmFsIDwgMCkgewogICAgICAgICAvKiBhdm9pZCBzaWduZWQgb3ZlcmZsb3cgb24gbmVnYXRpb247ICBzZWUgY29tbWVudHMKICAgICAgICAgICAgaW4gUHlMb25nX0Zyb21Mb25nIGFib3ZlLiAqLwotICAgICAgICBhYnNfaXZhbCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpKC0xLWl2YWwpICsgMTsKKyAgICAgICAgYWJzX2l2YWwgPSAodW5zaWduZWQgbG9uZyBsb25nKSgtMS1pdmFsKSArIDE7CiAgICAgICAgIG5lZ2F0aXZlID0gMTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGFic19pdmFsID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylpdmFsOworICAgICAgICBhYnNfaXZhbCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpaXZhbDsKICAgICB9CiAKICAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIFB5dGhvbiBkaWdpdHMuCkBAIC0xMDg5LDE5ICsxMDgxLDE5IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXY7CiB9CiAKLS8qIENyZWF0ZSBhIG5ldyBpbnQgb2JqZWN0IGZyb20gYSBDIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBpbnQuICovCisvKiBDcmVhdGUgYSBuZXcgaW50IG9iamVjdCBmcm9tIGEgQyB1bnNpZ25lZCBsb25nIGxvbmcgaW50LiAqLwogCiBQeU9iamVjdCAqCi1QeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodW5zaWduZWQgUFlfTE9OR19MT05HIGl2YWwpCitQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodW5zaWduZWQgbG9uZyBsb25nIGl2YWwpCiB7CiAgICAgUHlMb25nT2JqZWN0ICp2OwotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB0OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0OwogICAgIGludCBuZGlnaXRzID0gMDsKIAogICAgIGlmIChpdmFsIDwgUHlMb25nX0JBU0UpCiAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpaXZhbCk7CiAgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLiAqLwotICAgIHQgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKWl2YWw7CisgICAgdCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpaXZhbDsKICAgICB3aGlsZSAodCkgewogICAgICAgICArK25kaWdpdHM7CiAgICAgICAgIHQgPj49IFB5TG9uZ19TSElGVDsKQEAgLTExOTAsMTEgKzExODIsMTEgQEAKIC8qIEdldCBhIEMgbG9uZyBsb25nIGludCBmcm9tIGFuIGludCBvYmplY3Qgb3IgYW55IG9iamVjdCB0aGF0IGhhcyBhbgogICAgX19pbnRfXyBtZXRob2QuICBSZXR1cm4gLTEgYW5kIHNldCBhbiBlcnJvciBpZiBvdmVyZmxvdyBvY2N1cnMuICovCiAKLVBZX0xPTkdfTE9ORworbG9uZyBsb25nCiBQeUxvbmdfQXNMb25nTG9uZyhQeU9iamVjdCAqdnYpCiB7CiAgICAgUHlMb25nT2JqZWN0ICp2OwotICAgIFBZX0xPTkdfTE9ORyBieXRlczsKKyAgICBsb25nIGxvbmcgYnl0ZXM7CiAgICAgaW50IHJlczsKICAgICBpbnQgZG9fZGVjcmVmID0gMDsgLyogaWYgbmJfaW50IHdhcyBjYWxsZWQgKi8KIApAQCAtMTIzMiwzMCArMTIyNCwzMCBAQAogICAgICAgICBQeV9ERUNSRUYodik7CiAgICAgfQogCi0gICAgLyogUGxhbiA5IGNhbid0IGhhbmRsZSBQWV9MT05HX0xPTkcgaW4gPyA6IGV4cHJlc3Npb25zICovCisgICAgLyogUGxhbiA5IGNhbid0IGhhbmRsZSBsb25nIGxvbmcgaW4gPyA6IGV4cHJlc3Npb25zICovCiAgICAgaWYgKHJlcyA8IDApCi0gICAgICAgIHJldHVybiAoUFlfTE9OR19MT05HKS0xOworICAgICAgICByZXR1cm4gKGxvbmcgbG9uZyktMTsKICAgICBlbHNlCiAgICAgICAgIHJldHVybiBieXRlczsKIH0KIAotLyogR2V0IGEgQyB1bnNpZ25lZCBQWV9MT05HX0xPTkcgaW50IGZyb20gYW4gaW50IG9iamVjdC4KKy8qIEdldCBhIEMgdW5zaWduZWQgbG9uZyBsb25nIGludCBmcm9tIGFuIGludCBvYmplY3QuCiAgICBSZXR1cm4gLTEgYW5kIHNldCBhbiBlcnJvciBpZiBvdmVyZmxvdyBvY2N1cnMuICovCiAKLXVuc2lnbmVkIFBZX0xPTkdfTE9ORwordW5zaWduZWQgbG9uZyBsb25nCiBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKFB5T2JqZWN0ICp2dikKIHsKICAgICBQeUxvbmdPYmplY3QgKnY7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIGJ5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBieXRlczsKICAgICBpbnQgcmVzOwogCiAgICAgaWYgKHZ2ID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0gICAgICAgIHJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcgbG9uZyktMTsKICAgICB9CiAgICAgaWYgKCFQeUxvbmdfQ2hlY2sodnYpKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7Ci0gICAgICAgIHJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcgbG9uZyktMTsKICAgICB9CiAKICAgICB2ID0gKFB5TG9uZ09iamVjdCopdnY7CkBAIC0xMjY3LDkgKzEyNTksOSBAQAogICAgIHJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKXZ2LCAodW5zaWduZWQgY2hhciAqKSZieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVPRl9MT05HX0xPTkcsIFBZX0xJVFRMRV9FTkRJQU4sIDApOwogCi0gICAgLyogUGxhbiA5IGNhbid0IGhhbmRsZSBQWV9MT05HX0xPTkcgaW4gPyA6IGV4cHJlc3Npb25zICovCisgICAgLyogUGxhbiA5IGNhbid0IGhhbmRsZSBsb25nIGxvbmcgaW4gPyA6IGV4cHJlc3Npb25zICovCiAgICAgaWYgKHJlcyA8IDApCi0gICAgICAgIHJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKXJlczsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzOwogICAgIGVsc2UKICAgICAgICAgcmV0dXJuIGJ5dGVzOwogfQpAQCAtMTI3NywxMSArMTI2OSwxMSBAQAogLyogR2V0IGEgQyB1bnNpZ25lZCBsb25nIGludCBmcm9tIGFuIGludCBvYmplY3QsIGlnbm9yaW5nIHRoZSBoaWdoIGJpdHMuCiAgICBSZXR1cm5zIC0xIGFuZCBzZXRzIGFuIGVycm9yIGNvbmRpdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuICovCiAKLXN0YXRpYyB1bnNpZ25lZCBQWV9MT05HX0xPTkcKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcKIF9QeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzayhQeU9iamVjdCAqdnYpCiB7CiAgICAgUHlMb25nT2JqZWN0ICp2OwotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB4OwogICAgIFB5X3NzaXplX3QgaTsKICAgICBpbnQgc2lnbjsKIApAQCAtMTMwNywxMSArMTI5OSwxMSBAQAogICAgIHJldHVybiB4ICogc2lnbjsKIH0KIAotdW5zaWduZWQgUFlfTE9OR19MT05HCit1bnNpZ25lZCBsb25nIGxvbmcKIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKFB5T2JqZWN0ICpvcCkKIHsKICAgICBQeUxvbmdPYmplY3QgKmxvOwotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKIAogICAgIGlmIChvcCA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwpAQCAtMTMyNCw3ICsxMzE2LDcgQEAKIAogICAgIGxvID0gX1B5TG9uZ19Gcm9tTmJJbnQob3ApOwogICAgIGlmIChsbyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpLTE7CiAKICAgICB2YWwgPSBfUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soKFB5T2JqZWN0ICopbG8pOwogICAgIFB5X0RFQ1JFRihsbyk7CkBAIC0xMzQxLDEzICsxMzMzLDEzIEBACiAgICBJbiB0aGlzIGNhc2UgKm92ZXJmbG93IHdpbGwgYmUgMC4KICovCiAKLVBZX0xPTkdfTE9ORworbG9uZyBsb25nCiBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93KFB5T2JqZWN0ICp2diwgaW50ICpvdmVyZmxvdykKIHsKICAgICAvKiBUaGlzIHZlcnNpb24gYnkgVGltIFBldGVycyAqLwogICAgIFB5TG9uZ09iamVjdCAqdjsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeCwgcHJldjsKLSAgICBQWV9MT05HX0xPTkcgcmVzOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB4LCBwcmV2OworICAgIGxvbmcgbG9uZyByZXM7CiAgICAgUHlfc3NpemVfdCBpOwogICAgIGludCBzaWduOwogICAgIGludCBkb19kZWNyZWYgPSAwOyAvKiBpZiBuYl9pbnQgd2FzIGNhbGxlZCAqLwpAQCAtMTM5OSw4ICsxMzkxLDggQEAKICAgICAgICAgLyogSGF2ZW4ndCBsb3N0IGFueSBiaXRzLCBidXQgY2FzdGluZyB0byBsb25nIHJlcXVpcmVzIGV4dHJhCiAgICAgICAgICAqIGNhcmUgKHNlZSBjb21tZW50IGFib3ZlKS4KICAgICAgICAgICovCi0gICAgICAgIGlmICh4IDw9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpUFlfTExPTkdfTUFYKSB7Ci0gICAgICAgICAgICByZXMgPSAoUFlfTE9OR19MT05HKXggKiBzaWduOworICAgICAgICBpZiAoeCA8PSAodW5zaWduZWQgbG9uZyBsb25nKVBZX0xMT05HX01BWCkgeworICAgICAgICAgICAgcmVzID0gKGxvbmcgbG9uZyl4ICogc2lnbjsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChzaWduIDwgMCAmJiB4ID09IFBZX0FCU19MTE9OR19NSU4pIHsKICAgICAgICAgICAgIHJlcyA9IFBZX0xMT05HX01JTjsKQEAgLTE0MTcsOCArMTQwOSw2IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCi0KICNkZWZpbmUgQ0hFQ0tfQklOT1Aodix3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmICghUHlMb25nX0NoZWNrKHYpIHx8ICFQeUxvbmdfQ2hlY2sodykpICAgICAgIFwKQEAgLTE1ODIsMTMgKzE1NzIsMTYgQEAKIHN0YXRpYyBpbnQKIGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwoUHlPYmplY3QgKmFhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKnBfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5Qnl0ZXNXcml0ZXIgKmJ5dGVzX3dyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmJ5dGVzX3N0cikKIHsKICAgICBQeUxvbmdPYmplY3QgKnNjcmF0Y2gsICphOwotICAgIFB5T2JqZWN0ICpzdHI7CisgICAgUHlPYmplY3QgKnN0ciA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBzaXplLCBzdHJsZW4sIHNpemVfYSwgaSwgajsKICAgICBkaWdpdCAqcG91dCwgKnBpbiwgcmVtLCB0ZW5wb3c7CiAgICAgaW50IG5lZ2F0aXZlOworICAgIGludCBkOwogICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZDsKIAogICAgIGEgPSAoUHlMb25nT2JqZWN0ICopYWE7CkBAIC0xNjA2LDE1ICsxNTk5LDE3IEBACiAKICAgICAgICBCdXQgbG9nMihhKSA8IHNpemVfYSAqIFB5TG9uZ19TSElGVCwgYW5kCiAgICAgICAgbG9nMihfUHlMb25nX0RFQ0lNQUxfQkFTRSkgPSBsb2cyKDEwKSAqIF9QeUxvbmdfREVDSU1BTF9TSElGVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gMyAqIF9QeUxvbmdfREVDSU1BTF9TSElGVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gMy4zICogX1B5TG9uZ19ERUNJTUFMX1NISUZUCisKKyAgICAgICAgIHNpemVfYSAqIFB5TG9uZ19TSElGVCAvICgzLjMgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQpID0KKyAgICAgICAgICAgICBzaXplX2EgKyBzaXplX2EgLyBkIDwgc2l6ZV9hICsgc2l6ZV9hIC8gZmxvb3IoZCksCisgICAgICAgd2hlcmUgZCA9ICgzLjMgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQpIC8KKyAgICAgICAgICAgICAgICAgKFB5TG9uZ19TSElGVCAtIDMuMyAqIF9QeUxvbmdfREVDSU1BTF9TSElGVCkKICAgICAqLwotICAgIGlmIChzaXplX2EgPiBQWV9TU0laRV9UX01BWCAvIFB5TG9uZ19TSElGVCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgdG9vIGxhcmdlIHRvIGZvcm1hdCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIC8qIHRoZSBleHByZXNzaW9uIHNpemVfYSAqIFB5TG9uZ19TSElGVCBpcyBub3cgc2FmZSBmcm9tIG92ZXJmbG93ICovCi0gICAgc2l6ZSA9IDEgKyBzaXplX2EgKiBQeUxvbmdfU0hJRlQgLyAoMyAqIF9QeUxvbmdfREVDSU1BTF9TSElGVCk7CisgICAgZCA9ICgzMyAqIF9QeUxvbmdfREVDSU1BTF9TSElGVCkgLworICAgICAgICAoMTAgKiBQeUxvbmdfU0hJRlQgLSAzMyAqIF9QeUxvbmdfREVDSU1BTF9TSElGVCk7CisgICAgYXNzZXJ0KHNpemVfYSA8IFBZX1NTSVpFX1RfTUFYLzIpOworICAgIHNpemUgPSAxICsgc2l6ZV9hICsgc2l6ZV9hIC8gZDsKICAgICBzY3JhdGNoID0gX1B5TG9uZ19OZXcoc2l6ZSk7CiAgICAgaWYgKHNjcmF0Y2ggPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTY2Miw3ICsxNjU3LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAga2luZCA9IHdyaXRlci0+a2luZDsKLSAgICAgICAgc3RyID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgICpieXRlc19zdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKGJ5dGVzX3dyaXRlciwgKmJ5dGVzX3N0ciwgc3RybGVuKTsKKyAgICAgICAgaWYgKCpieXRlc19zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNjcmF0Y2gpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICBzdHIgPSBQeVVuaWNvZGVfTmV3KHN0cmxlbiwgJzknKTsKQEAgLTE2NzMsMTMgKzE2NzQsOCBAQAogICAgICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyKTsKICAgICB9CiAKLSNkZWZpbmUgV1JJVEVfRElHSVRTKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFdSSVRFX0RJR0lUUyhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHdyaXRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHdyaXRlci0+YnVmZmVyKSArIHdyaXRlci0+cG9zICsgc3RybGVuOyBcCi0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQShzdHIpICsgc3RybGVuOyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIC8qIHBvdXRbMF0gdGhyb3VnaCBwb3V0W3NpemUtMl0gY29udHJpYnV0ZSBleGFjdGx5ICAgICAgICAgICAgXAogICAgICAgICAgICBfUHlMb25nX0RFQ0lNQUxfU0hJRlQgZGlnaXRzIGVhY2ggKi8gICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZm9yIChpPTA7IGkgPCBzaXplIC0gMTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xNjk5LDYgKzE2OTUsMTYgQEAKICAgICAgICAgLyogYW5kIHNpZ24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmIChuZWdhdGl2ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgKi0tcCA9ICctJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFdSSVRFX1VOSUNPREVfRElHSVRTKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHdyaXRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHdyaXRlci0+YnVmZmVyKSArIHdyaXRlci0+cG9zICsgc3RybGVuOyBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQShzdHIpICsgc3RybGVuOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdSSVRFX0RJR0lUUyhwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgLyogY2hlY2sgd2UndmUgY291bnRlZCBjb3JyZWN0bHkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTcwOCwyNSArMTcxNCwzNCBAQAogICAgIH0gd2hpbGUgKDApCiAKICAgICAvKiBmaWxsIHRoZSBzdHJpbmcgcmlnaHQtdG8tbGVmdCAqLwotICAgIGlmIChraW5kID09IFB5VW5pY29kZV8xQllURV9LSU5EKSB7CisgICAgaWYgKGJ5dGVzX3dyaXRlcikgeworICAgICAgICBjaGFyICpwID0gKmJ5dGVzX3N0ciArIHN0cmxlbjsKKyAgICAgICAgV1JJVEVfRElHSVRTKHApOworICAgICAgICBhc3NlcnQocCA9PSAqYnl0ZXNfc3RyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgewogICAgICAgICBQeV9VQ1MxICpwOwotICAgICAgICBXUklURV9ESUdJVFMoUHlfVUNTMSk7CisgICAgICAgIFdSSVRFX1VOSUNPREVfRElHSVRTKFB5X1VDUzEpOwogICAgIH0KICAgICBlbHNlIGlmIChraW5kID09IFB5VW5pY29kZV8yQllURV9LSU5EKSB7CiAgICAgICAgIFB5X1VDUzIgKnA7Ci0gICAgICAgIFdSSVRFX0RJR0lUUyhQeV9VQ1MyKTsKKyAgICAgICAgV1JJVEVfVU5JQ09ERV9ESUdJVFMoUHlfVUNTMik7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICBQeV9VQ1M0ICpwOwogICAgICAgICBhc3NlcnQgKGtpbmQgPT0gUHlVbmljb2RlXzRCWVRFX0tJTkQpOwotICAgICAgICBXUklURV9ESUdJVFMoUHlfVUNTNCk7CisgICAgICAgIFdSSVRFX1VOSUNPREVfRElHSVRTKFB5X1VDUzQpOwogICAgIH0KICN1bmRlZiBXUklURV9ESUdJVFMKKyN1bmRlZiBXUklURV9VTklDT0RFX0RJR0lUUwogCiAgICAgUHlfREVDUkVGKHNjcmF0Y2gpOwogICAgIGlmICh3cml0ZXIpIHsKICAgICAgICAgd3JpdGVyLT5wb3MgKz0gc3RybGVuOwogICAgIH0KKyAgICBlbHNlIGlmIChieXRlc193cml0ZXIpIHsKKyAgICAgICAgKCpieXRlc19zdHIpICs9IHN0cmxlbjsKKyAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIGFzc2VydChfUHlVbmljb2RlX0NoZWNrQ29uc2lzdGVuY3koc3RyLCAxKSk7CiAgICAgICAgICpwX291dHB1dCA9IChQeU9iamVjdCAqKXN0cjsKQEAgLTE3MzgsNyArMTc1Myw3IEBACiBsb25nX3RvX2RlY2ltYWxfc3RyaW5nKFB5T2JqZWN0ICphYSkKIHsKICAgICBQeU9iamVjdCAqdjsKLSAgICBpZiAobG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChhYSwgJnYsIE5VTEwpID09IC0xKQorICAgIGlmIChsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKGFhLCAmdiwgTlVMTCwgTlVMTCwgTlVMTCkgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiB2OwogfQpAQCAtMTc1MCwxMCArMTc2NSwxMSBAQAogCiBzdGF0aWMgaW50CiBsb25nX2Zvcm1hdF9iaW5hcnkoUHlPYmplY3QgKmFhLCBpbnQgYmFzZSwgaW50IGFsdGVybmF0ZSwKLSAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKnBfb3V0cHV0LCBfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIpCisgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipwX291dHB1dCwgX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIF9QeUJ5dGVzV3JpdGVyICpieXRlc193cml0ZXIsIGNoYXIgKipieXRlc19zdHIpCiB7CiAgICAgUHlMb25nT2JqZWN0ICphID0gKFB5TG9uZ09iamVjdCAqKWFhOwotICAgIFB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICp2ID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHN6OwogICAgIFB5X3NzaXplX3Qgc2l6ZV9hOwogICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZDsKQEAgLTE4MTAsNyArMTgyNiwxMSBAQAogICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3osICd4JykgPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIGtpbmQgPSB3cml0ZXItPmtpbmQ7Ci0gICAgICAgIHYgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChieXRlc193cml0ZXIpIHsKKyAgICAgICAgKmJ5dGVzX3N0ciA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoYnl0ZXNfd3JpdGVyLCAqYnl0ZXNfc3RyLCBzeik7CisgICAgICAgIGlmICgqYnl0ZXNfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICB2ID0gUHlVbmljb2RlX05ldyhzeiwgJ3gnKTsKQEAgLTE4MTksMTMgKzE4MzksOCBAQAogICAgICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodik7CiAgICAgfQogCi0jZGVmaW5lIFdSSVRFX0RJR0lUUyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFdSSVRFX0RJR0lUUyhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHdyaXRlci0+YnVmZmVyKSArIHdyaXRlci0+cG9zICsgc3o7IFwKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEodikgKyBzejsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKHNpemVfYSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICotLXAgPSAnMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE4NjAsMzAgKzE4NzUsNTAgQEAKICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKG5lZ2F0aXZlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICotLXAgPSAnLSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFdSSVRFX1VOSUNPREVfRElHSVRTKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHdyaXRlci0+YnVmZmVyKSArIHdyaXRlci0+cG9zICsgc3o7IFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEodikgKyBzejsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgV1JJVEVfRElHSVRTKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKHdyaXRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIGFzc2VydChwID09ICgoVFlQRSopUHlVbmljb2RlX0RBVEEod3JpdGVyLT5idWZmZXIpICsgd3JpdGVyLT5wb3MpKTsgXAogICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgYXNzZXJ0KHAgPT0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHYpKTsgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKLSAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgeworICAgIGlmIChieXRlc193cml0ZXIpIHsKKyAgICAgICAgY2hhciAqcCA9ICpieXRlc19zdHIgKyBzejsKKyAgICAgICAgV1JJVEVfRElHSVRTKHApOworICAgICAgICBhc3NlcnQocCA9PSAqYnl0ZXNfc3RyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgewogICAgICAgICBQeV9VQ1MxICpwOwotICAgICAgICBXUklURV9ESUdJVFMoUHlfVUNTMSk7CisgICAgICAgIFdSSVRFX1VOSUNPREVfRElHSVRTKFB5X1VDUzEpOwogICAgIH0KICAgICBlbHNlIGlmIChraW5kID09IFB5VW5pY29kZV8yQllURV9LSU5EKSB7CiAgICAgICAgIFB5X1VDUzIgKnA7Ci0gICAgICAgIFdSSVRFX0RJR0lUUyhQeV9VQ1MyKTsKKyAgICAgICAgV1JJVEVfVU5JQ09ERV9ESUdJVFMoUHlfVUNTMik7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICBQeV9VQ1M0ICpwOwogICAgICAgICBhc3NlcnQgKGtpbmQgPT0gUHlVbmljb2RlXzRCWVRFX0tJTkQpOwotICAgICAgICBXUklURV9ESUdJVFMoUHlfVUNTNCk7CisgICAgICAgIFdSSVRFX1VOSUNPREVfRElHSVRTKFB5X1VDUzQpOwogICAgIH0KICN1bmRlZiBXUklURV9ESUdJVFMKKyN1bmRlZiBXUklURV9VTklDT0RFX0RJR0lUUwogCiAgICAgaWYgKHdyaXRlcikgewogICAgICAgICB3cml0ZXItPnBvcyArPSBzejsKICAgICB9CisgICAgZWxzZSBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgICgqYnl0ZXNfc3RyKSArPSBzejsKKyAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIGFzc2VydChfUHlVbmljb2RlX0NoZWNrQ29uc2lzdGVuY3kodiwgMSkpOwogICAgICAgICAqcF9vdXRwdXQgPSB2OwpAQCAtMTg5Nyw5ICsxOTMyLDkgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGludCBlcnI7CiAgICAgaWYgKGJhc2UgPT0gMTApCi0gICAgICAgIGVyciA9IGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwob2JqLCAmc3RyLCBOVUxMKTsKKyAgICAgICAgZXJyID0gbG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChvYmosICZzdHIsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgIGVsc2UKLSAgICAgICAgZXJyID0gbG9uZ19mb3JtYXRfYmluYXJ5KG9iaiwgYmFzZSwgMSwgJnN0ciwgTlVMTCk7CisgICAgICAgIGVyciA9IGxvbmdfZm9ybWF0X2JpbmFyeShvYmosIGJhc2UsIDEsICZzdHIsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgIGlmIChlcnIgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBzdHI7CkBAIC0xOTExLDkgKzE5NDYsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlLCBpbnQgYWx0ZXJuYXRlKQogewogICAgIGlmIChiYXNlID09IDEwKQotICAgICAgICByZXR1cm4gbG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChvYmosIE5VTEwsIHdyaXRlcik7CisgICAgICAgIHJldHVybiBsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKG9iaiwgTlVMTCwgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKICAgICBlbHNlCi0gICAgICAgIHJldHVybiBsb25nX2Zvcm1hdF9iaW5hcnkob2JqLCBiYXNlLCBhbHRlcm5hdGUsIE5VTEwsIHdyaXRlcik7CisgICAgICAgIHJldHVybiBsb25nX2Zvcm1hdF9iaW5hcnkob2JqLCBiYXNlLCBhbHRlcm5hdGUsIE5VTEwsIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKK30KKworY2hhcioKK19QeUxvbmdfRm9ybWF0Qnl0ZXNXcml0ZXIoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZSwgaW50IGFsdGVybmF0ZSkKK3sKKyAgICBjaGFyICpzdHIyOworICAgIGludCByZXM7CisgICAgc3RyMiA9IHN0cjsKKyAgICBpZiAoYmFzZSA9PSAxMCkKKyAgICAgICAgcmVzID0gbG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChvYmosIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLCAmc3RyMik7CisgICAgZWxzZQorICAgICAgICByZXMgPSBsb25nX2Zvcm1hdF9iaW5hcnkob2JqLCBiYXNlLCBhbHRlcm5hdGUsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsICZzdHIyKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KHN0cjIgIT0gTlVMTCk7CisgICAgcmV0dXJuIHN0cjI7CiB9CiAKIC8qIFRhYmxlIG9mIGRpZ2l0IHZhbHVlcyBmb3IgOC1iaXQgc3RyaW5nIC0+IGludGVnZXIgY29udmVyc2lvbi4KQEAgLTIzOTQsOCArMjQ1MSwxMSBAQAogICAgICAgICAqcGRpdiA9IChQeUxvbmdPYmplY3QqKVB5TG9uZ19Gcm9tTG9uZygwKTsKICAgICAgICAgaWYgKCpwZGl2ID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIFB5X0lOQ1JFRihhKTsKLSAgICAgICAgKnByZW0gPSAoUHlMb25nT2JqZWN0ICopIGE7CisgICAgICAgICpwcmVtID0gKFB5TG9uZ09iamVjdCAqKWxvbmdfbG9uZygoUHlPYmplY3QgKilhKTsKKyAgICAgICAgaWYgKCpwcmVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0NMRUFSKCpwZGl2KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgaWYgKHNpemVfYiA9PSAxKSB7CkBAIC0yNzA1LDYgKzI3NjUsMTMgQEAKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKICAgICAgICAgcmV0dXJuIC0xLjA7CiAgICAgfQorICAgIGlmIChQeV9BQlMoUHlfU0laRSh2KSkgPD0gMSkgeworICAgICAgICAvKiBGYXN0IHBhdGg7IHNpbmdsZSBkaWdpdCBsb25nICgzMSBiaXRzKSB3aWxsIGNhc3Qgc2FmZWx5CisgICAgICAgICAgIHRvIGRvdWJsZS4gIFRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb2YgRlAvbG9uZyBvcGVyYXRpb25zCisgICAgICAgICAgIGJ5IDIwJS4KKyAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIChkb3VibGUpTUVESVVNX1ZBTFVFKChQeUxvbmdPYmplY3QgKil2KTsKKyAgICB9CiAgICAgeCA9IF9QeUxvbmdfRnJleHAoKFB5TG9uZ09iamVjdCAqKXYsICZleHBvbmVudCk7CiAgICAgaWYgKCh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgfHwgZXhwb25lbnQgPiBEQkxfTUFYX0VYUCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKQEAgLTI5MjksOSArMjk5Niw3IEBACiAgICAgfQogICAgIGFzc2VydChib3Jyb3cgPT0gMCk7CiAgICAgaWYgKHNpZ24gPCAwKSB7Ci0gICAgICAgIF9QeUxvbmdfTmVnYXRlKCZ6KTsKLSAgICAgICAgaWYgKHogPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9TSVpFKHopID0gLVB5X1NJWkUoeik7CiAgICAgfQogICAgIHJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKIH0KQEAgLTI5NTEsOCArMzAxNiwxNCBAQAogICAgIGlmIChQeV9TSVpFKGEpIDwgMCkgewogICAgICAgICBpZiAoUHlfU0laRShiKSA8IDApIHsKICAgICAgICAgICAgIHogPSB4X2FkZChhLCBiKTsKLSAgICAgICAgICAgIGlmICh6ICE9IE5VTEwgJiYgUHlfU0laRSh6KSAhPSAwKQorICAgICAgICAgICAgaWYgKHogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8qIHhfYWRkIHJlY2VpdmVkIGF0IGxlYXN0IG9uZSBtdWx0aXBsZS1kaWdpdCBpbnQsCisgICAgICAgICAgICAgICAgICAgYW5kIHRodXMgeiBtdXN0IGJlIGEgbXVsdGlwbGUtZGlnaXQgaW50LgorICAgICAgICAgICAgICAgICAgIFRoYXQgYWxzbyBtZWFucyB6IGlzIG5vdCBhbiBlbGVtZW50IG9mCisgICAgICAgICAgICAgICAgICAgc21hbGxfaW50cywgc28gbmVnYXRpbmcgaXQgaW4tcGxhY2UgaXMgc2FmZS4gKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlfUkVGQ05UKHopID09IDEpOwogICAgICAgICAgICAgICAgIFB5X1NJWkUoeikgPSAtKFB5X1NJWkUoeikpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHogPSB4X3N1YihiLCBhKTsKQEAgLTI5ODMsOCArMzA1NCwxMCBAQAogICAgICAgICAgICAgeiA9IHhfc3ViKGEsIGIpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICB6ID0geF9hZGQoYSwgYik7Ci0gICAgICAgIGlmICh6ICE9IE5VTEwgJiYgUHlfU0laRSh6KSAhPSAwKQorICAgICAgICBpZiAoeiAhPSBOVUxMKSB7CisgICAgICAgICAgICBhc3NlcnQoUHlfU0laRSh6KSA9PSAwIHx8IFB5X1JFRkNOVCh6KSA9PSAxKTsKICAgICAgICAgICAgIFB5X1NJWkUoeikgPSAtKFB5X1NJWkUoeikpOworICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICBpZiAoUHlfU0laRShiKSA8IDApCkBAIC0zNDA4LDE3ICszNDgxLDcgQEAKICAgICAvKiBmYXN0IHBhdGggZm9yIHNpbmdsZS1kaWdpdCBtdWx0aXBsaWNhdGlvbiAqLwogICAgIGlmIChQeV9BQlMoUHlfU0laRShhKSkgPD0gMSAmJiBQeV9BQlMoUHlfU0laRShiKSkgPD0gMSkgewogICAgICAgICBzdHdvZGlnaXRzIHYgPSAoc3R3b2RpZ2l0cykoTUVESVVNX1ZBTFVFKGEpKSAqIE1FRElVTV9WQUxVRShiKTsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXYpOwotI2Vsc2UKLSAgICAgICAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBsb25nIGxvbmcgdGhlbiB3ZSdyZSBhbG1vc3QgY2VydGFpbmx5Ci0gICAgICAgICAgIHVzaW5nIDE1LWJpdCBkaWdpdHMsIHNvIHYgd2lsbCBmaXQgaW4gYSBsb25nLiAgSW4gdGhlCi0gICAgICAgICAgIHVubGlrZWx5IGV2ZW50IHRoYXQgd2UncmUgdXNpbmcgMzAtYml0IGRpZ2l0cyBvbiBhIHBsYXRmb3JtCi0gICAgICAgICAgIHdpdGhvdXQgbG9uZyBsb25nLCBhIGxhcmdlIHYgd2lsbCBqdXN0IGNhdXNlIHVzIHRvIGZhbGwKLSAgICAgICAgICAgdGhyb3VnaCB0byB0aGUgZ2VuZXJhbCBtdWx0aXBsaWNhdGlvbiBjb2RlIGJlbG93LiAqLwotICAgICAgICBpZiAodiA+PSBMT05HX01JTiAmJiB2IDw9IExPTkdfTUFYKQotICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygobG9uZyl2KTsKLSNlbmRpZgorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKXYpOwogICAgIH0KIAogICAgIHogPSBrX211bChhLCBiKTsKQEAgLTM0MzEsNiArMzQ5NCw1MiBAQAogICAgIHJldHVybiAoUHlPYmplY3QgKil6OwogfQogCisvKiBGYXN0IG1vZHVsbyBkaXZpc2lvbiBmb3Igc2luZ2xlLWRpZ2l0IGxvbmdzLiAqLworc3RhdGljIFB5T2JqZWN0ICoKK2Zhc3RfbW9kKFB5TG9uZ09iamVjdCAqYSwgUHlMb25nT2JqZWN0ICpiKQoreworICAgIHNkaWdpdCBsZWZ0ID0gYS0+b2JfZGlnaXRbMF07CisgICAgc2RpZ2l0IHJpZ2h0ID0gYi0+b2JfZGlnaXRbMF07CisgICAgc2RpZ2l0IG1vZDsKKworICAgIGFzc2VydChQeV9BQlMoUHlfU0laRShhKSkgPT0gMSk7CisgICAgYXNzZXJ0KFB5X0FCUyhQeV9TSVpFKGIpKSA9PSAxKTsKKworICAgIGlmIChQeV9TSVpFKGEpID09IFB5X1NJWkUoYikpIHsKKyAgICAgICAgLyogJ2EnIGFuZCAnYicgaGF2ZSB0aGUgc2FtZSBzaWduLiAqLworICAgICAgICBtb2QgPSBsZWZ0ICUgcmlnaHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBFaXRoZXIgJ2EnIG9yICdiJyBpcyBuZWdhdGl2ZS4gKi8KKyAgICAgICAgbW9kID0gcmlnaHQgLSAxIC0gKGxlZnQgLSAxKSAlIHJpZ2h0OworICAgIH0KKworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcobW9kICogKHNkaWdpdClQeV9TSVpFKGIpKTsKK30KKworLyogRmFzdCBmbG9vciBkaXZpc2lvbiBmb3Igc2luZ2xlLWRpZ2l0IGxvbmdzLiAqLworc3RhdGljIFB5T2JqZWN0ICoKK2Zhc3RfZmxvb3JfZGl2KFB5TG9uZ09iamVjdCAqYSwgUHlMb25nT2JqZWN0ICpiKQoreworICAgIHNkaWdpdCBsZWZ0ID0gYS0+b2JfZGlnaXRbMF07CisgICAgc2RpZ2l0IHJpZ2h0ID0gYi0+b2JfZGlnaXRbMF07CisgICAgc2RpZ2l0IGRpdjsKKworICAgIGFzc2VydChQeV9BQlMoUHlfU0laRShhKSkgPT0gMSk7CisgICAgYXNzZXJ0KFB5X0FCUyhQeV9TSVpFKGIpKSA9PSAxKTsKKworICAgIGlmIChQeV9TSVpFKGEpID09IFB5X1NJWkUoYikpIHsKKyAgICAgICAgLyogJ2EnIGFuZCAnYicgaGF2ZSB0aGUgc2FtZSBzaWduLiAqLworICAgICAgICBkaXYgPSBsZWZ0IC8gcmlnaHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBFaXRoZXIgJ2EnIG9yICdiJyBpcyBuZWdhdGl2ZS4gKi8KKyAgICAgICAgZGl2ID0gLTEgLSAobGVmdCAtIDEpIC8gcmlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhkaXYpOworfQorCiAvKiBUaGUgLyBhbmQgJSBvcGVyYXRvcnMgYXJlIG5vdyBkZWZpbmVkIGluIHRlcm1zIG9mIGRpdm1vZCgpLgogICAgVGhlIGV4cHJlc3Npb24gYSBtb2QgYiBoYXMgdGhlIHZhbHVlIGEgLSBiKmZsb29yKGEvYikuCiAgICBUaGUgbG9uZ19kaXZyZW0gZnVuY3Rpb24gZ2l2ZXMgdGhlIHJlbWFpbmRlciBhZnRlciBkaXZpc2lvbiBvZgpAQCAtMzQ1OCw2ICszNTY3LDMwIEBACiB7CiAgICAgUHlMb25nT2JqZWN0ICpkaXYsICptb2Q7CiAKKyAgICBpZiAoUHlfQUJTKFB5X1NJWkUodikpID09IDEgJiYgUHlfQUJTKFB5X1NJWkUodykpID09IDEpIHsKKyAgICAgICAgLyogRmFzdCBwYXRoIGZvciBzaW5nbGUtZGlnaXQgbG9uZ3MgKi8KKyAgICAgICAgZGl2ID0gTlVMTDsKKyAgICAgICAgaWYgKHBkaXYgIT0gTlVMTCkgeworICAgICAgICAgICAgZGl2ID0gKFB5TG9uZ09iamVjdCAqKWZhc3RfZmxvb3JfZGl2KHYsIHcpOworICAgICAgICAgICAgaWYgKGRpdiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwbW9kICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1vZCA9IChQeUxvbmdPYmplY3QgKilmYXN0X21vZCh2LCB3KTsKKyAgICAgICAgICAgIGlmIChtb2QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoZGl2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcG1vZCA9IG1vZDsKKyAgICAgICAgfQorICAgICAgICBpZiAocGRpdiAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiBXZSBvbmx5IHdhbnQgdG8gc2V0IGAqcGRpdmAgd2hlbiBgKnBtb2RgIGlzCisgICAgICAgICAgICAgICBzZXQgc3VjY2Vzc2Z1bGx5LiAqLworICAgICAgICAgICAgKnBkaXYgPSBkaXY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIGlmIChsb25nX2RpdnJlbSh2LCB3LCAmZGl2LCAmbW9kKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAoKFB5X1NJWkUobW9kKSA8IDAgJiYgUHlfU0laRSh3KSA+IDApIHx8CkBAIC0zNTAyLDYgKzM2MzUsMTEgQEAKICAgICBQeUxvbmdPYmplY3QgKmRpdjsKIAogICAgIENIRUNLX0JJTk9QKGEsIGIpOworCisgICAgaWYgKFB5X0FCUyhQeV9TSVpFKGEpKSA9PSAxICYmIFB5X0FCUyhQeV9TSVpFKGIpKSA9PSAxKSB7CisgICAgICAgIHJldHVybiBmYXN0X2Zsb29yX2RpdigoUHlMb25nT2JqZWN0KilhLCAoUHlMb25nT2JqZWN0KiliKTsKKyAgICB9CisKICAgICBpZiAobF9kaXZtb2QoKFB5TG9uZ09iamVjdCopYSwgKFB5TG9uZ09iamVjdCopYiwgJmRpdiwgTlVMTCkgPCAwKQogICAgICAgICBkaXYgPSBOVUxMOwogICAgIHJldHVybiAoUHlPYmplY3QgKilkaXY7CkBAIC0zNzQxLDkgKzM4NzksOSBAQAogICAgIC8qIFJvdW5kIGJ5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgbG93IGRpZ2l0IG9mIHguICovCiAgICAgbWFzayA9IChkaWdpdCkxIDw8IChleHRyYV9iaXRzIC0gMSk7CiAgICAgbG93ID0geC0+b2JfZGlnaXRbMF0gfCBpbmV4YWN0OwotICAgIGlmIChsb3cgJiBtYXNrICYmIGxvdyAmICgzKm1hc2stMSkpCisgICAgaWYgKChsb3cgJiBtYXNrKSAmJiAobG93ICYgKDNVKm1hc2stMVUpKSkKICAgICAgICAgbG93ICs9IG1hc2s7Ci0gICAgeC0+b2JfZGlnaXRbMF0gPSBsb3cgJiB+KG1hc2stMVUpOworICAgIHgtPm9iX2RpZ2l0WzBdID0gbG93ICYgfigyVSptYXNrLTFVKTsKIAogICAgIC8qIENvbnZlcnQgeCB0byBhIGRvdWJsZSBkeDsgdGhlIGNvbnZlcnNpb24gaXMgZXhhY3QuICovCiAgICAgZHggPSB4LT5vYl9kaWdpdFstLXhfc2l6ZV07CkBAIC0zNzc3LDYgKzM5MTUsMTAgQEAKIAogICAgIENIRUNLX0JJTk9QKGEsIGIpOwogCisgICAgaWYgKFB5X0FCUyhQeV9TSVpFKGEpKSA9PSAxICYmIFB5X0FCUyhQeV9TSVpFKGIpKSA9PSAxKSB7CisgICAgICAgIHJldHVybiBmYXN0X21vZCgoUHlMb25nT2JqZWN0KilhLCAoUHlMb25nT2JqZWN0KiliKTsKKyAgICB9CisKICAgICBpZiAobF9kaXZtb2QoKFB5TG9uZ09iamVjdCopYSwgKFB5TG9uZ09iamVjdCopYiwgTlVMTCwgJm1vZCkgPCAwKQogICAgICAgICBtb2QgPSBOVUxMOwogICAgIHJldHVybiAoUHlPYmplY3QgKiltb2Q7CkBAIC00MDExLDggKzQxNTMsMTAgQEAKICAgICBQeV9ERUNSRUYodyk7CiAgICAgaWYgKHggPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgUHlfU0laRSh4KSA9IC0oUHlfU0laRSh4KSk7Ci0gICAgcmV0dXJuIChQeU9iamVjdCAqKW1heWJlX3NtYWxsX2xvbmcoeCk7CisgICAgX1B5TG9uZ19OZWdhdGUoJngpOworICAgIC8qIE5vIG5lZWQgZm9yIG1heWJlX3NtYWxsX2xvbmcgaGVyZSwgc2luY2UgYW55IHNtYWxsCisgICAgICAgbG9uZ3Mgd2lsbCBoYXZlIGJlZW4gY2F1Z2h0IGluIHRoZSBQeV9TSVpFIDw9IDEgZmFzdCBwYXRoLiAqLworICAgIHJldHVybiAoUHlPYmplY3QgKil4OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDExNyw2ICs0MjYxLDExIEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgc2hpZnQgY291bnQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCisgICAgaWYgKFB5X1NJWkUoYSkgPT0gMCkgeworICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKDApOworICAgIH0KKwogICAgIC8qIHdvcmRzaGlmdCwgcmVtc2hpZnQgPSBkaXZtb2Qoc2hpZnRieSwgUHlMb25nX1NISUZUKSAqLwogICAgIHdvcmRzaGlmdCA9IHNoaWZ0YnkgLyBQeUxvbmdfU0hJRlQ7CiAgICAgcmVtc2hpZnQgID0gc2hpZnRieSAtIHdvcmRzaGlmdCAqIFB5TG9uZ19TSElGVDsKQEAgLTQ1MDEsNyArNDY1MCw3IEBACiAgICAgLyogYSBmaXRzIGludG8gYSBsb25nLCBzbyBiIG11c3QgdG9vICovCiAgICAgeCA9IFB5TG9uZ19Bc0xvbmcoKFB5T2JqZWN0ICopYSk7CiAgICAgeSA9IFB5TG9uZ19Bc0xvbmcoKFB5T2JqZWN0ICopYik7Ci0jZWxpZiBkZWZpbmVkKFBZX0xPTkdfTE9ORykgJiYgUFlfTExPTkdfTUFYID4+IFB5TG9uZ19TSElGVCA+PiBQeUxvbmdfU0hJRlQKKyNlbGlmIFBZX0xMT05HX01BWCA+PiBQeUxvbmdfU0hJRlQgPj4gUHlMb25nX1NISUZUCiAgICAgeCA9IFB5TG9uZ19Bc0xvbmdMb25nKChQeU9iamVjdCAqKWEpOwogICAgIHkgPSBQeUxvbmdfQXNMb25nTG9uZygoUHlPYmplY3QgKiliKTsKICNlbHNlCkBAIC00NTIwLDcgKzQ2NjksNyBAQAogICAgIH0KICNpZiBMT05HX01BWCA+PiBQeUxvbmdfU0hJRlQgPj4gUHlMb25nX1NISUZUCiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh4KTsKLSNlbGlmIGRlZmluZWQoUFlfTE9OR19MT05HKSAmJiBQWV9MTE9OR19NQVggPj4gUHlMb25nX1NISUZUID4+IFB5TG9uZ19TSElGVAorI2VsaWYgUFlfTExPTkdfTUFYID4+IFB5TG9uZ19TSElGVCA+PiBQeUxvbmdfU0hJRlQKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh4KTsKICNlbHNlCiAjIGVycm9yICJfUHlMb25nX0dDRCIKZGlmZiAtLWdpdCBhL09iamVjdHMvbWVtb3J5b2JqZWN0LmMgYi9PYmplY3RzL21lbW9yeW9iamVjdC5jCmluZGV4IDEwMTYyY2IuLjQyOGQ4M2MgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbWVtb3J5b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9tZW1vcnlvYmplY3QuYwpAQCAtNTcsNyArNTcsNyBAQAogICAgIH0KIAogCi1QeV9MT0NBTF9JTkxJTkUoX1B5TWFuYWdlZEJ1ZmZlck9iamVjdCAqKQorc3RhdGljIGlubGluZSBfUHlNYW5hZ2VkQnVmZmVyT2JqZWN0ICoKIG1idWZfYWxsb2Modm9pZCkKIHsKICAgICBfUHlNYW5hZ2VkQnVmZmVyT2JqZWN0ICptYnVmOwpAQCAtMjQzLDcgKzI0Myw3IEBACiAjZGVmaW5lIEhBVkVfU1VCT0ZGU0VUU19JTl9MQVNUX0RJTSh2aWV3KSBcCiAgICAgKHZpZXctPnN1Ym9mZnNldHMgJiYgdmlldy0+c3Vib2Zmc2V0c1tkZXN0LT5uZGltLTFdID49IDApCiAKLVB5X0xPQ0FMX0lOTElORShpbnQpCitzdGF0aWMgaW5saW5lIGludAogbGFzdF9kaW1faXNfY29udGlndW91cyhjb25zdCBQeV9idWZmZXIgKmRlc3QsIGNvbnN0IFB5X2J1ZmZlciAqc3JjKQogewogICAgIGFzc2VydChkZXN0LT5uZGltID4gMCAmJiBzcmMtPm5kaW0gPiAwKTsKQEAgLTI1OSw3ICsyNTksNyBAQAogICAgYXNzaWdubWVudHMsIHdoZXJlIHRoZSBsdmFsdWUgaXMgYWxyZWFkeSBrbm93biB0byBoYXZlIGEgc2luZ2xlIGNoYXJhY3RlcgogICAgZm9ybWF0LiBUaGlzIGlzIGEgcGVyZm9ybWFuY2UgaGFjayB0aGF0IGNvdWxkIGJlIHJld3JpdHRlbiAoaWYgcHJvcGVybHkKICAgIGJlbmNobWFya2VkKS4gKi8KLVB5X0xPQ0FMX0lOTElORShpbnQpCitzdGF0aWMgaW5saW5lIGludAogZXF1aXZfZm9ybWF0KGNvbnN0IFB5X2J1ZmZlciAqZGVzdCwgY29uc3QgUHlfYnVmZmVyICpzcmMpCiB7CiAgICAgY29uc3QgY2hhciAqZGZtdCwgKnNmbXQ7CkBAIC0yNzksNyArMjc5LDcgQEAKIC8qIFR3byBzaGFwZXMgYXJlIGVxdWl2YWxlbnQgaWYgdGhleSBhcmUgZWl0aGVyIGVxdWFsIG9yIGlkZW50aWNhbCB1cAogICAgdG8gYSB6ZXJvIGVsZW1lbnQgYXQgdGhlIHNhbWUgcG9zaXRpb24uIEZvciBleGFtcGxlLCBpbiBOdW1QeSBhcnJheXMKICAgIHRoZSBzaGFwZXMgWzEsIDAsIDVdIGFuZCBbMSwgMCwgN10gYXJlIGVxdWl2YWxlbnQuICovCi1QeV9MT0NBTF9JTkxJTkUoaW50KQorc3RhdGljIGlubGluZSBpbnQKIGVxdWl2X3NoYXBlKGNvbnN0IFB5X2J1ZmZlciAqZGVzdCwgY29uc3QgUHlfYnVmZmVyICpzcmMpCiB7CiAgICAgaW50IGk7CkBAIC00MzgsNyArNDM4LDcgQEAKIH0KIAogLyogSW5pdGlhbGl6ZSBzdHJpZGVzIGZvciBhIEMtY29udGlndW91cyBhcnJheS4gKi8KLVB5X0xPQ0FMX0lOTElORSh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkCiBpbml0X3N0cmlkZXNfZnJvbV9zaGFwZShQeV9idWZmZXIgKnZpZXcpCiB7CiAgICAgUHlfc3NpemVfdCBpOwpAQCAtNDUxLDcgKzQ1MSw3IEBACiB9CiAKIC8qIEluaXRpYWxpemUgc3RyaWRlcyBmb3IgYSBGb3J0cmFuLWNvbnRpZ3VvdXMgYXJyYXkuICovCi1QeV9MT0NBTF9JTkxJTkUodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZAogaW5pdF9mb3J0cmFuX3N0cmlkZXNfZnJvbV9zaGFwZShQeV9idWZmZXIgKnZpZXcpCiB7CiAgICAgUHlfc3NpemVfdCBpOwpAQCAtNTEzLDcgKzUxMyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogSW5pdGlhbGl6ZSB2YWx1ZXMgdGhhdCBhcmUgc2hhcmVkIHdpdGggdGhlIG1hbmFnZWQgYnVmZmVyLiAqLwotUHlfTE9DQUxfSU5MSU5FKHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQKIGluaXRfc2hhcmVkX3ZhbHVlcyhQeV9idWZmZXIgKmRlc3QsIGNvbnN0IFB5X2J1ZmZlciAqc3JjKQogewogICAgIGRlc3QtPm9iaiA9IHNyYy0+b2JqOwpAQCAtNTUzLDcgKzU1Myw3IEBACiAgICAgfQogfQogCi1QeV9MT0NBTF9JTkxJTkUodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZAogaW5pdF9zdWJvZmZzZXRzKFB5X2J1ZmZlciAqZGVzdCwgY29uc3QgUHlfYnVmZmVyICpzcmMpCiB7CiAgICAgUHlfc3NpemVfdCBpOwpAQCAtNTY3LDcgKzU2Nyw3IEBACiB9CiAKIC8qIGxlbiA9IHByb2R1Y3Qoc2hhcGUpICogaXRlbXNpemUgKi8KLVB5X0xPQ0FMX0lOTElORSh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkCiBpbml0X2xlbihQeV9idWZmZXIgKnZpZXcpCiB7CiAgICAgUHlfc3NpemVfdCBpLCBsZW47CkBAIC02MTQsNyArNjE0LDcgQEAKIAogLyogQWxsb2NhdGUgYSBuZXcgbWVtb3J5dmlldyBhbmQgcGVyZm9ybSBiYXNpYyBpbml0aWFsaXphdGlvbi4gTmV3IG1lbW9yeXZpZXdzCiAgICBhcmUgZXhjbHVzaXZlbHkgY3JlYXRlZCB0aHJvdWdoIHRoZSBtYnVmX2FkZCBmdW5jdGlvbnMuICovCi1QeV9MT0NBTF9JTkxJTkUoUHlNZW1vcnlWaWV3T2JqZWN0ICopCitzdGF0aWMgaW5saW5lIFB5TWVtb3J5Vmlld09iamVjdCAqCiBtZW1vcnlfYWxsb2MoaW50IG5kaW0pCiB7CiAgICAgUHlNZW1vcnlWaWV3T2JqZWN0ICptdjsKQEAgLTEwOTksNyArMTA5OSw3IEBACiAKICNkZWZpbmUgSVNfQllURV9GT1JNQVQoZikgKGYgPT0gJ2InIHx8IGYgPT0gJ0InIHx8IGYgPT0gJ2MnKQogCi1QeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKK3N0YXRpYyBpbmxpbmUgUHlfc3NpemVfdAogZ2V0X25hdGl2ZV9mbXRjaGFyKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqZm10KQogewogICAgIFB5X3NzaXplX3Qgc2l6ZSA9IC0xOwpAQCAtMTExMSwxNyArMTExMSwxMSBAQAogICAgIGNhc2UgJ2gnOiBjYXNlICdIJzogc2l6ZSA9IHNpemVvZihzaG9ydCk7IGJyZWFrOwogICAgIGNhc2UgJ2knOiBjYXNlICdJJzogc2l6ZSA9IHNpemVvZihpbnQpOyBicmVhazsKICAgICBjYXNlICdsJzogY2FzZSAnTCc6IHNpemUgPSBzaXplb2YobG9uZyk7IGJyZWFrOwotICAgICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIGNhc2UgJ3EnOiBjYXNlICdRJzogc2l6ZSA9IHNpemVvZihQWV9MT05HX0xPTkcpOyBicmVhazsKLSAgICAjZW5kaWYKKyAgICBjYXNlICdxJzogY2FzZSAnUSc6IHNpemUgPSBzaXplb2YobG9uZyBsb25nKTsgYnJlYWs7CiAgICAgY2FzZSAnbic6IGNhc2UgJ04nOiBzaXplID0gc2l6ZW9mKFB5X3NzaXplX3QpOyBicmVhazsKICAgICBjYXNlICdmJzogc2l6ZSA9IHNpemVvZihmbG9hdCk7IGJyZWFrOwogICAgIGNhc2UgJ2QnOiBzaXplID0gc2l6ZW9mKGRvdWJsZSk7IGJyZWFrOwotICAgICNpZmRlZiBIQVZFX0M5OV9CT09MCiAgICAgY2FzZSAnPyc6IHNpemUgPSBzaXplb2YoX0Jvb2wpOyBicmVhazsKLSAgICAjZWxzZQotICAgIGNhc2UgJz8nOiBzaXplID0gc2l6ZW9mKGNoYXIpOyBicmVhazsKLSAgICAjZW5kaWYKICAgICBjYXNlICdQJzogc2l6ZSA9IHNpemVvZih2b2lkICopOyBicmVhazsKICAgICB9CiAKQEAgLTExMzMsNyArMTEyNyw3IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1QeV9MT0NBTF9JTkxJTkUoY2hhciAqKQorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKIGdldF9uYXRpdmVfZm10c3RyKGNvbnN0IGNoYXIgKmZtdCkKIHsKICAgICBpbnQgYXQgPSAwOwpAQCAtMTE1OCwxOSArMTE1MiwxMyBAQAogICAgIGNhc2UgJ0knOiBSRVRVUk4oIkkiKTsKICAgICBjYXNlICdsJzogUkVUVVJOKCJsIik7CiAgICAgY2FzZSAnTCc6IFJFVFVSTigiTCIpOwotICAgICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgIGNhc2UgJ3EnOiBSRVRVUk4oInEiKTsKICAgICBjYXNlICdRJzogUkVUVVJOKCJRIik7Ci0gICAgI2VuZGlmCiAgICAgY2FzZSAnbic6IFJFVFVSTigibiIpOwogICAgIGNhc2UgJ04nOiBSRVRVUk4oIk4iKTsKICAgICBjYXNlICdmJzogUkVUVVJOKCJmIik7CiAgICAgY2FzZSAnZCc6IFJFVFVSTigiZCIpOwotICAgICNpZmRlZiBIQVZFX0M5OV9CT09MCiAgICAgY2FzZSAnPyc6IFJFVFVSTigiPyIpOwotICAgICNlbHNlCi0gICAgY2FzZSAnPyc6IFJFVFVSTigiPyIpOwotICAgICNlbmRpZgogICAgIGNhc2UgJ1AnOiBSRVRVUk4oIlAiKTsKICAgICB9CiAKQEAgLTEyMjEsNyArMTIwOSw3IEBACiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KIAotICAgIHZpZXctPmZvcm1hdCA9IGdldF9uYXRpdmVfZm10c3RyKFB5Qnl0ZXNfQVNfU1RSSU5HKGFzY2lpZm10KSk7CisgICAgdmlldy0+Zm9ybWF0ID0gKGNoYXIgKilnZXRfbmF0aXZlX2ZtdHN0cihQeUJ5dGVzX0FTX1NUUklORyhhc2NpaWZtdCkpOwogICAgIGlmICh2aWV3LT5mb3JtYXQgPT0gTlVMTCkgewogICAgICAgICAvKiBOT1RfUkVBQ0hFRDogZ2V0X25hdGl2ZV9mbXRjaGFyKCkgYWxyZWFkeSB2YWxpZGF0ZXMgdGhlIGZvcm1hdC4gKi8KICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKQEAgLTE1ODEsMTIgKzE1NjksMTEgQEAKICAgICByZXR1cm4gbHU7CiB9CiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotc3RhdGljIFBZX0xPTkdfTE9ORworc3RhdGljIGxvbmcgbG9uZwogcHlsb25nX2FzX2xsZChQeU9iamVjdCAqaXRlbSkKIHsKICAgICBQeU9iamVjdCAqdG1wOwotICAgIFBZX0xPTkdfTE9ORyBsbGQ7CisgICAgbG9uZyBsb25nIGxsZDsKIAogICAgIHRtcCA9IFB5TnVtYmVyX0luZGV4KGl0ZW0pOwogICAgIGlmICh0bXAgPT0gTlVMTCkKQEAgLTE1OTcsMjEgKzE1ODQsMjAgQEAKICAgICByZXR1cm4gbGxkOwogfQogCi1zdGF0aWMgdW5zaWduZWQgUFlfTE9OR19MT05HCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nCiBweWxvbmdfYXNfbGx1KFB5T2JqZWN0ICppdGVtKQogewogICAgIFB5T2JqZWN0ICp0bXA7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIGxsdTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgbGx1OwogCiAgICAgdG1wID0gUHlOdW1iZXJfSW5kZXgoaXRlbSk7CiAgICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpLTE7CiAKICAgICBsbHUgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKHRtcCk7CiAgICAgUHlfREVDUkVGKHRtcCk7CiAgICAgcmV0dXJuIGxsdTsKIH0KLSNlbmRpZgogCiBzdGF0aWMgUHlfc3NpemVfdAogcHlsb25nX2FzX3pkKFB5T2JqZWN0ICppdGVtKQpAQCAtMTY1NiwxMyArMTY0MiwxMyBAQAogLyogVW5wYWNrIGEgc2luZ2xlIGl0ZW0uICdmbXQnIGNhbiBiZSBhbnkgbmF0aXZlIGZvcm1hdCBjaGFyYWN0ZXIgaW4gc3RydWN0CiAgICBtb2R1bGUgc3ludGF4LiBUaGlzIGZ1bmN0aW9uIGlzIHZlcnkgc2Vuc2l0aXZlIHRvIHNtYWxsIGNoYW5nZXMuIFdpdGggdGhpcwogICAgbGF5b3V0IGdjYyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBhIGZhc3QganVtcCB0YWJsZS4gKi8KLVB5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQorc3RhdGljIGlubGluZSBQeU9iamVjdCAqCiB1bnBhY2tfc2luZ2xlKGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZm10KQogewotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBsbHU7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGxsdTsKICAgICB1bnNpZ25lZCBsb25nIGx1OwogICAgIHNpemVfdCB6dTsKLSAgICBQWV9MT05HX0xPTkcgbGxkOworICAgIGxvbmcgbG9uZyBsbGQ7CiAgICAgbG9uZyBsZDsKICAgICBQeV9zc2l6ZV90IHpkOwogICAgIGRvdWJsZSBkOwpAQCAtMTY3OSwxMSArMTY2NSw3IEBACiAgICAgY2FzZSAnbCc6IFVOUEFDS19TSU5HTEUobGQsIHB0ciwgbG9uZyk7IGdvdG8gY29udmVydF9sZDsKIAogICAgIC8qIGJvb2xlYW4gKi8KLSAgICAjaWZkZWYgSEFWRV9DOTlfQk9PTAogICAgIGNhc2UgJz8nOiBVTlBBQ0tfU0lOR0xFKGxkLCBwdHIsIF9Cb29sKTsgZ290byBjb252ZXJ0X2Jvb2w7Ci0gICAgI2Vsc2UKLSAgICBjYXNlICc/JzogVU5QQUNLX1NJTkdMRShsZCwgcHRyLCBjaGFyKTsgZ290byBjb252ZXJ0X2Jvb2w7Ci0gICAgI2VuZGlmCiAKICAgICAvKiB1bnNpZ25lZCBpbnRlZ2VycyAqLwogICAgIGNhc2UgJ0gnOiBVTlBBQ0tfU0lOR0xFKGx1LCBwdHIsIHVuc2lnbmVkIHNob3J0KTsgZ290byBjb252ZXJ0X2x1OwpAQCAtMTY5MSwxMCArMTY3Myw4IEBACiAgICAgY2FzZSAnTCc6IFVOUEFDS19TSU5HTEUobHUsIHB0ciwgdW5zaWduZWQgbG9uZyk7IGdvdG8gY29udmVydF9sdTsKIAogICAgIC8qIG5hdGl2ZSA2NC1iaXQgKi8KLSAgICAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICBjYXNlICdxJzogVU5QQUNLX1NJTkdMRShsbGQsIHB0ciwgUFlfTE9OR19MT05HKTsgZ290byBjb252ZXJ0X2xsZDsKLSAgICBjYXNlICdRJzogVU5QQUNLX1NJTkdMRShsbHUsIHB0ciwgdW5zaWduZWQgUFlfTE9OR19MT05HKTsgZ290byBjb252ZXJ0X2xsdTsKLSAgICAjZW5kaWYKKyAgICBjYXNlICdxJzogVU5QQUNLX1NJTkdMRShsbGQsIHB0ciwgbG9uZyBsb25nKTsgZ290byBjb252ZXJ0X2xsZDsKKyAgICBjYXNlICdRJzogVU5QQUNLX1NJTkdMRShsbHUsIHB0ciwgdW5zaWduZWQgbG9uZyBsb25nKTsgZ290byBjb252ZXJ0X2xsdTsKIAogICAgIC8qIHNzaXplX3QgYW5kIHNpemVfdCAqLwogICAgIGNhc2UgJ24nOiBVTlBBQ0tfU0lOR0xFKHpkLCBwdHIsIFB5X3NzaXplX3QpOyBnb3RvIGNvbnZlcnRfemQ7CkBAIC0xNzU1LDEwICsxNzM1LDEwIEBACiBzdGF0aWMgaW50CiBwYWNrX3NpbmdsZShjaGFyICpwdHIsIFB5T2JqZWN0ICppdGVtLCBjb25zdCBjaGFyICpmbXQpCiB7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIGxsdTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgbGx1OwogICAgIHVuc2lnbmVkIGxvbmcgbHU7CiAgICAgc2l6ZV90IHp1OwotICAgIFBZX0xPTkdfTE9ORyBsbGQ7CisgICAgbG9uZyBsb25nIGxsZDsKICAgICBsb25nIGxkOwogICAgIFB5X3NzaXplX3QgemQ7CiAgICAgZG91YmxlIGQ7CkBAIC0xODA2LDIwICsxNzg2LDE4IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgLyogbmF0aXZlIDY0LWJpdCAqLwotICAgICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgIGNhc2UgJ3EnOgogICAgICAgICBsbGQgPSBweWxvbmdfYXNfbGxkKGl0ZW0pOwogICAgICAgICBpZiAobGxkID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICBnb3RvIGVycl9vY2N1cnJlZDsKLSAgICAgICAgUEFDS19TSU5HTEUocHRyLCBsbGQsIFBZX0xPTkdfTE9ORyk7CisgICAgICAgIFBBQ0tfU0lOR0xFKHB0ciwgbGxkLCBsb25nIGxvbmcpOwogICAgICAgICBicmVhazsKICAgICBjYXNlICdRJzoKICAgICAgICAgbGx1ID0gcHlsb25nX2FzX2xsdShpdGVtKTsKLSAgICAgICAgaWYgKGxsdSA9PSAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGlmIChsbHUgPT0gKHVuc2lnbmVkIGxvbmcgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgZ290byBlcnJfb2NjdXJyZWQ7Ci0gICAgICAgIFBBQ0tfU0lOR0xFKHB0ciwgbGx1LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcpOworICAgICAgICBQQUNLX1NJTkdMRShwdHIsIGxsdSwgdW5zaWduZWQgbG9uZyBsb25nKTsKICAgICAgICAgYnJlYWs7Ci0gICAgI2VuZGlmCiAKICAgICAvKiBzc2l6ZV90IGFuZCBzaXplX3QgKi8KICAgICBjYXNlICduJzoKQEAgLTE4NTMsMTEgKzE4MzEsNyBAQAogICAgICAgICBsZCA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKICAgICAgICAgaWYgKGxkIDwgMCkKICAgICAgICAgICAgIHJldHVybiAtMTsgLyogcHJlc2VydmUgb3JpZ2luYWwgZXJyb3IgKi8KLSAgICAjaWZkZWYgSEFWRV9DOTlfQk9PTAogICAgICAgICBQQUNLX1NJTkdMRShwdHIsIGxkLCBfQm9vbCk7Ci0gICAgI2Vsc2UKLSAgICAgICAgUEFDS19TSU5HTEUocHRyLCBsZCwgY2hhcik7Ci0gICAgI2VuZGlmCiAgICAgICAgICBicmVhazsKIAogICAgIC8qIGJ5dGVzIG9iamVjdCAqLwpAQCAtMjAyNCw3ICsxOTk4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBhbGxvdyBleHBsaWNpdCBmb3JtIG9mIG5hdGl2ZSBmb3JtYXQgKi8KLVB5X0xPQ0FMX0lOTElORShjb25zdCBjaGFyICopCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKgogYWRqdXN0X2ZtdChjb25zdCBQeV9idWZmZXIgKnZpZXcpCiB7CiAgICAgY29uc3QgY2hhciAqZm10OwpAQCAtMjMwNiw3ICsyMjgwLDcgQEAKICAgICByZXR1cm4gdW5wYWNrX3NpbmdsZShwdHIsIGZtdCk7CiB9CiAKLVB5X0xPQ0FMX0lOTElORShpbnQpCitzdGF0aWMgaW5saW5lIGludAogaW5pdF9zbGljZShQeV9idWZmZXIgKmJhc2UsIFB5T2JqZWN0ICprZXksIGludCBkaW0pCiB7CiAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGg7CkBAIC0yNjI4LDcgKzI2MDIsNyBAQAogICAgICAgICBlcXVhbCA9ICh4ID09IHkpOyAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKIAotUHlfTE9DQUxfSU5MSU5FKGludCkKK3N0YXRpYyBpbmxpbmUgaW50CiB1bnBhY2tfY21wKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKnEsIGNoYXIgZm10LAogICAgICAgICAgICBzdHJ1Y3QgdW5wYWNrZXIgKnVucGFja19wLCBzdHJ1Y3QgdW5wYWNrZXIgKnVucGFja19xKQogewpAQCAtMjY0NCwxMSArMjYxOCw3IEBACiAgICAgY2FzZSAnbCc6IENNUF9TSU5HTEUocCwgcSwgbG9uZyk7IHJldHVybiBlcXVhbDsKIAogICAgIC8qIGJvb2xlYW4gKi8KLSAgICAjaWZkZWYgSEFWRV9DOTlfQk9PTAogICAgIGNhc2UgJz8nOiBDTVBfU0lOR0xFKHAsIHEsIF9Cb29sKTsgcmV0dXJuIGVxdWFsOwotICAgICNlbHNlCi0gICAgY2FzZSAnPyc6IENNUF9TSU5HTEUocCwgcSwgY2hhcik7IHJldHVybiBlcXVhbDsKLSAgICAjZW5kaWYKIAogICAgIC8qIHVuc2lnbmVkIGludGVnZXJzICovCiAgICAgY2FzZSAnSCc6IENNUF9TSU5HTEUocCwgcSwgdW5zaWduZWQgc2hvcnQpOyByZXR1cm4gZXF1YWw7CkBAIC0yNjU2LDEwICsyNjI2LDggQEAKICAgICBjYXNlICdMJzogQ01QX1NJTkdMRShwLCBxLCB1bnNpZ25lZCBsb25nKTsgcmV0dXJuIGVxdWFsOwogCiAgICAgLyogbmF0aXZlIDY0LWJpdCAqLwotICAgICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIGNhc2UgJ3EnOiBDTVBfU0lOR0xFKHAsIHEsIFBZX0xPTkdfTE9ORyk7IHJldHVybiBlcXVhbDsKLSAgICBjYXNlICdRJzogQ01QX1NJTkdMRShwLCBxLCB1bnNpZ25lZCBQWV9MT05HX0xPTkcpOyByZXR1cm4gZXF1YWw7Ci0gICAgI2VuZGlmCisgICAgY2FzZSAncSc6IENNUF9TSU5HTEUocCwgcSwgbG9uZyBsb25nKTsgcmV0dXJuIGVxdWFsOworICAgIGNhc2UgJ1EnOiBDTVBfU0lOR0xFKHAsIHEsIHVuc2lnbmVkIGxvbmcgbG9uZyk7IHJldHVybiBlcXVhbDsKIAogICAgIC8qIHNzaXplX3QgYW5kIHNpemVfdCAqLwogICAgIGNhc2UgJ24nOiBDTVBfU0lOR0xFKHAsIHEsIFB5X3NzaXplX3QpOyByZXR1cm4gZXF1YWw7CmRpZmYgLS1naXQgYS9PYmplY3RzL21ldGhvZG9iamVjdC5jIGIvT2JqZWN0cy9tZXRob2RvYmplY3QuYwppbmRleCA5NDYzNTdmLi4zOTRmMWY0IDEwMDY0NAotLS0gYS9PYmplY3RzL21ldGhvZG9iamVjdC5jCisrKyBiL09iamVjdHMvbWV0aG9kb2JqZWN0LmMKQEAgLTE0NSw2ICsxNDUsMTA0IEBACiAgICAgcmV0dXJuIF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KGZ1bmMsIHJlcywgTlVMTCk7CiB9CiAKK1B5T2JqZWN0ICoKK19QeUNGdW5jdGlvbl9GYXN0Q2FsbERpY3QoUHlPYmplY3QgKmZ1bmNfb2JqLCBQeU9iamVjdCAqKmFyZ3MsIFB5X3NzaXplX3QgbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgICAgUHlDRnVuY3Rpb25PYmplY3QgKmZ1bmMgPSAoUHlDRnVuY3Rpb25PYmplY3QqKWZ1bmNfb2JqOworICAgIFB5Q0Z1bmN0aW9uIG1ldGggPSBQeUNGdW5jdGlvbl9HRVRfRlVOQ1RJT04oZnVuYyk7CisgICAgUHlPYmplY3QgKnNlbGYgPSBQeUNGdW5jdGlvbl9HRVRfU0VMRihmdW5jKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBmbGFnczsKKworICAgIGFzc2VydChmdW5jICE9IE5VTEwpOworICAgIGFzc2VydChuYXJncyA+PSAwKTsKKyAgICBhc3NlcnQobmFyZ3MgPT0gMCB8fCBhcmdzICE9IE5VTEwpOworICAgIGFzc2VydChrd2FyZ3MgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa3dhcmdzKSk7CisKKyAgICAvKiBfUHlDRnVuY3Rpb25fRmFzdENhbGxEaWN0KCkgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYW4gZXhjZXB0aW9uIHNldCwKKyAgICAgICBiZWNhdXNlIGl0IG1heSBjbGVhciBpdCAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgYW5kIHNvIHRoZQorICAgICAgIGNhbGxlciBsb3NlcyBpdHMgZXhjZXB0aW9uICovCisgICAgYXNzZXJ0KCFQeUVycl9PY2N1cnJlZCgpKTsKKworICAgIGZsYWdzID0gUHlDRnVuY3Rpb25fR0VUX0ZMQUdTKGZ1bmMpICYgfihNRVRIX0NMQVNTIHwgTUVUSF9TVEFUSUMgfCBNRVRIX0NPRVhJU1QpOworCisgICAgc3dpdGNoIChmbGFncykKKyAgICB7CisgICAgY2FzZSBNRVRIX05PQVJHUzoKKyAgICAgICAgaWYgKGt3YXJncyAhPSBOVUxMICYmIFB5RGljdF9TaXplKGt3YXJncykgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiUuMjAwcygpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLT5tX21sLT5tbF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hcmdzICE9IDApIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIiUuMjAwcygpIHRha2VzIG5vIGFyZ3VtZW50cyAoJXpkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgZnVuYy0+bV9tbC0+bWxfbmFtZSwgbmFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSAoKm1ldGgpIChzZWxmLCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1FVEhfTzoKKyAgICAgICAgaWYgKGt3YXJncyAhPSBOVUxMICYmIFB5RGljdF9TaXplKGt3YXJncykgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiUuMjAwcygpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLT5tX21sLT5tbF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hcmdzICE9IDEpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIiUuMjAwcygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICglemQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICBmdW5jLT5tX21sLT5tbF9uYW1lLCBuYXJncyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9ICgqbWV0aCkgKHNlbGYsIGFyZ3NbMF0pOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTUVUSF9WQVJBUkdTOgorICAgIGNhc2UgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUzoKKyAgICB7CisgICAgICAgIC8qIFNsb3ctcGF0aDogY3JlYXRlIGEgdGVtcG9yYXJ5IHR1cGxlICovCisgICAgICAgIFB5T2JqZWN0ICp0dXBsZTsKKworICAgICAgICBpZiAoIShmbGFncyAmIE1FVEhfS0VZV09SRFMpICYmIGt3YXJncyAhPSBOVUxMICYmIFB5RGljdF9TaXplKGt3YXJncykgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMtPm1fbWwtPm1sX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB0dXBsZSA9IF9QeVN0YWNrX0FzVHVwbGUoYXJncywgbmFyZ3MpOworICAgICAgICBpZiAodHVwbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ3MgJiBNRVRIX0tFWVdPUkRTKSB7CisgICAgICAgICAgICByZXN1bHQgPSAoKihQeUNGdW5jdGlvbldpdGhLZXl3b3JkcyltZXRoKSAoc2VsZiwgdHVwbGUsIGt3YXJncyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSAoKm1ldGgpIChzZWxmLCB0dXBsZSk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBjYWxsIGZsYWdzIGluIFB5Q0Z1bmN0aW9uX0NhbGwuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJNRVRIX09MREFSR1MgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmVzdWx0ID0gX1B5X0NoZWNrRnVuY3Rpb25SZXN1bHQoZnVuY19vYmosIHJlc3VsdCwgTlVMTCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiAvKiBNZXRob2RzICh0aGUgc3RhbmRhcmQgYnVpbHQtaW4gbWV0aG9kcywgdGhhdCBpcykgKi8KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL09iamVjdHMvbW9kdWxlb2JqZWN0LmMgYi9PYmplY3RzL21vZHVsZW9iamVjdC5jCmluZGV4IGFjMDc2NDIuLmQ4OGIwNmEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbW9kdWxlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9tb2R1bGVvYmplY3QuYwpAQCAtNDUwLDggKzQ1MCw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBkID0gKChQeU1vZHVsZU9iamVjdCAqKW0pIC0+IG1kX2RpY3Q7Ci0gICAgaWYgKGQgPT0gTlVMTCkKLSAgICAgICAgKChQeU1vZHVsZU9iamVjdCAqKW0pIC0+IG1kX2RpY3QgPSBkID0gUHlEaWN0X05ldygpOworICAgIGFzc2VydChkICE9IE5VTEwpOwogICAgIHJldHVybiBkOwogfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL25hbWVzcGFjZW9iamVjdC5jIGIvT2JqZWN0cy9uYW1lc3BhY2VvYmplY3QuYwppbmRleCAzZDI3YTk1Li4wYmIzMDYzIDEwMDY0NAotLS0gYS9PYmplY3RzL25hbWVzcGFjZW9iamVjdC5jCisrKyBiL09iamVjdHMvbmFtZXNwYWNlb2JqZWN0LmMKQEAgLTEsNCArMSw0IEBACi0vKiBuYW1lc3BhY2Ugb2JqZWN0IGltcGxlbWVudGF0aW9uICovCisvLyBuYW1lc3BhY2Ugb2JqZWN0IGltcGxlbWVudGF0aW9uCiAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKQEAgLTE2LDcgKzE2LDcgQEAKIH07CiAKIAotLyogTWV0aG9kcyAqLworLy8gTWV0aG9kcwogCiBzdGF0aWMgUHlPYmplY3QgKgogbmFtZXNwYWNlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKQEAgLTQwLDcgKzQwLDcgQEAKIHN0YXRpYyBpbnQKIG5hbWVzcGFjZV9pbml0KF9QeU5hbWVzcGFjZU9iamVjdCAqbnMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLSAgICAvKiBpZ25vcmUgYXJncyBpZiBpdCdzIE5VTEwgb3IgZW1wdHkgKi8KKyAgICAvLyBpZ25vcmUgYXJncyBpZiBpdCdzIE5VTEwgb3IgZW1wdHkKICAgICBpZiAoYXJncyAhPSBOVUxMKSB7CiAgICAgICAgIFB5X3NzaXplX3QgYXJnY291bnQgPSBQeU9iamVjdF9TaXplKGFyZ3MpOwogICAgICAgICBpZiAoYXJnY291bnQgPCAwKQpAQCAtMTkxLDcgKzE5MSw3IEBACiBzdGF0aWMgUHlNZXRob2REZWYgbmFtZXNwYWNlX21ldGhvZHNbXSA9IHsKICAgICB7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pbmFtZXNwYWNlX3JlZHVjZSwgTUVUSF9OT0FSR1MsCiAgICAgIG5hbWVzcGFjZV9yZWR1Y2VfX2RvY19ffSwKLSAgICB7TlVMTCwgICAgICAgICBOVUxMfSAgLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICBOVUxMfSAgLy8gc2VudGluZWwKIH07CiAKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9vYmplY3QuYyBiL09iamVjdHMvb2JqZWN0LmMKaW5kZXggODAyNDg4OS4uZTA4ZjlhOSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9vYmplY3QuYworKysgYi9PYmplY3RzL29iamVjdC5jCkBAIC0yMiwxMiArMjIsNiBAQAogewogICAgIFB5T2JqZWN0ICpvOwogICAgIFB5X3NzaXplX3QgdG90YWwgPSBfUHlfUmVmVG90YWw7Ci0gICAgLyogaWdub3JlIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBkdW1teSBvYmplY3Qgb2YgdGhlIGRpY3RzIGFuZCBzZXRzCi0gICAgICAgYmVjYXVzZSB0aGV5IGFyZSBub3QgcmVsaWFibGUgYW5kIG5vdCB1c2VmdWwgKG5vdyB0aGF0IHRoZQotICAgICAgIGhhc2ggdGFibGUgY29kZSBpcyB3ZWxsLXRlc3RlZCkgKi8KLSAgICBvID0gX1B5RGljdF9EdW1teSgpOwotICAgIGlmIChvICE9IE5VTEwpCi0gICAgICAgIHRvdGFsIC09IG8tPm9iX3JlZmNudDsKICAgICBvID0gX1B5U2V0X0R1bW15OwogICAgIGlmIChvICE9IE5VTEwpCiAgICAgICAgIHRvdGFsIC09IG8tPm9iX3JlZmNudDsKQEAgLTEwOSw2ICsxMDMsMTUgQEAKIGR1bXBfY291bnRzKEZJTEUqIGYpCiB7CiAgICAgUHlUeXBlT2JqZWN0ICp0cDsKKyAgICBQeU9iamVjdCAqeG9wdGlvbnMsICp2YWx1ZTsKKyAgICBfUHlfSURFTlRJRklFUihzaG93YWxsb2Njb3VudCk7CisKKyAgICB4b3B0aW9ucyA9IFB5U3lzX0dldFhPcHRpb25zKCk7CisgICAgaWYgKHhvcHRpb25zID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICB2YWx1ZSA9IF9QeURpY3RfR2V0SXRlbUlkKHhvcHRpb25zLCAmUHlJZF9zaG93YWxsb2Njb3VudCk7CisgICAgaWYgKHZhbHVlICE9IFB5X1RydWUpCisgICAgICAgIHJldHVybjsKIAogICAgIGZvciAodHAgPSB0eXBlX2xpc3Q7IHRwOyB0cCA9IHRwLT50cF9uZXh0KQogICAgICAgICBmcHJpbnRmKGYsICIlcyBhbGxvYydkOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkLCAiCkBAIC02NDQsNyArNjQ3LDcgQEAKIC8qIE1hcCByaWNoIGNvbXBhcmlzb24gb3BlcmF0b3JzIHRvIHRoZWlyIHN3YXBwZWQgdmVyc2lvbiwgZS5nLiBMVCA8LS0+IEdUICovCiBpbnQgX1B5X1N3YXBwZWRPcFtdID0ge1B5X0dULCBQeV9HRSwgUHlfRVEsIFB5X05FLCBQeV9MVCwgUHlfTEV9OwogCi1zdGF0aWMgY2hhciAqb3BzdHJpbmdzW10gPSB7IjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPiIsICI+PSJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvcHN0cmluZ3NbXSA9IHsiPCIsICI8PSIsICI9PSIsICIhPSIsICI+IiwgIj49In07CiAKIC8qIFBlcmZvcm0gYSByaWNoIGNvbXBhcmlzb24sIHJhaXNpbmcgVHlwZUVycm9yIHdoZW4gdGhlIHJlcXVlc3RlZCBjb21wYXJpc29uCiAgICBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkLiAqLwpAQCAtNjg2LDExICs2ODksMTAgQEAKICAgICAgICAgcmVzID0gKHYgIT0gdykgPyBQeV9UcnVlIDogUHlfRmFsc2U7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIFhYWCBTcGVjaWFsLWNhc2UgTm9uZSBzbyBpdCBkb2Vzbid0IHNob3cgYXMgTm9uZVR5cGUoKSAqLwogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgInVub3JkZXJhYmxlIHR5cGVzOiAlLjEwMHMoKSAlcyAlLjEwMHMoKSIsCi0gICAgICAgICAgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIiclcycgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnJS4xMDBzJyBhbmQgJyUuMTAwcyciLAogICAgICAgICAgICAgICAgICAgICAgb3BzdHJpbmdzW29wXSwKKyAgICAgICAgICAgICAgICAgICAgIHYtPm9iX3R5cGUtPnRwX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICB3LT5vYl90eXBlLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTA0MSw4ICsxMDQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPm9iX3R5cGUtPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZWxzZQotICAgICAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgUHlfSU5DUkVGKG5hbWUpOwogCiAgICAgaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKICAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSh0cCkgPCAwKQpAQCAtMTA1MCwxMCArMTA1MSwxMCBAQAogICAgIH0KIAogICAgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOwotICAgIFB5X1hJTkNSRUYoZGVzY3IpOwogCiAgICAgZiA9IE5VTEw7CiAgICAgaWYgKGRlc2NyICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlc2NyKTsKICAgICAgICAgZiA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9nZXQ7CiAgICAgICAgIGlmIChmICE9IE5VTEwgJiYgUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKSB7CiAgICAgICAgICAgICByZXMgPSBmKGRlc2NyLCBvYmosIChQeU9iamVjdCAqKW9iai0+b2JfdHlwZSk7CkBAIC0xMDczLDggKzEwNzQsOSBAQAogICAgICAgICAgICAgICAgIGlmICh0c2l6ZSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHRzaXplID0gLXRzaXplOwogICAgICAgICAgICAgICAgIHNpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUodHAsIHRzaXplKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoc2l6ZSA8PSBQWV9TU0laRV9UX01BWCk7CiAKLSAgICAgICAgICAgICAgICBkaWN0b2Zmc2V0ICs9IChsb25nKXNpemU7CisgICAgICAgICAgICAgICAgZGljdG9mZnNldCArPSAoUHlfc3NpemVfdClzaXplOwogICAgICAgICAgICAgICAgIGFzc2VydChkaWN0b2Zmc2V0ID4gMCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0KGRpY3RvZmZzZXQgJSBTSVpFT0ZfVk9JRF9QID09IDApOwogICAgICAgICAgICAgfQpAQCAtMTE0MiwxMiArMTE0NCwxMSBAQAogICAgIFB5X0lOQ1JFRihuYW1lKTsKIAogICAgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOwotICAgIFB5X1hJTkNSRUYoZGVzY3IpOwogCi0gICAgZiA9IE5VTEw7CiAgICAgaWYgKGRlc2NyICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlc2NyKTsKICAgICAgICAgZiA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9zZXQ7Ci0gICAgICAgIGlmIChmICE9IE5VTEwgJiYgUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKSB7CisgICAgICAgIGlmIChmICE9IE5VTEwpIHsKICAgICAgICAgICAgIHJlcyA9IGYoZGVzY3IsIG9iaiwgdmFsdWUpOwogICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICB9CkBAIC0xMTU1LDQwICsxMTU2LDMyIEBACiAKICAgICBpZiAoZGljdCA9PSBOVUxMKSB7CiAgICAgICAgIGRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihvYmopOwotICAgICAgICBpZiAoZGljdHB0ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXMgPSBfUHlPYmplY3REaWN0X1NldEl0ZW0oUHlfVFlQRShvYmopLCBkaWN0cHRyLCBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAocmVzIDwgMCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworICAgICAgICBpZiAoZGljdHB0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclLjEwMHMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclVSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJS41MHMnIG9iamVjdCBhdHRyaWJ1dGUgJyVVJyBpcyByZWFkLW9ubHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgbmFtZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgIH0KKyAgICAgICAgcmVzID0gX1B5T2JqZWN0RGljdF9TZXRJdGVtKHRwLCBkaWN0cHRyLCBuYW1lLCB2YWx1ZSk7CiAgICAgfQotICAgIGlmIChkaWN0ICE9IE5VTEwpIHsKKyAgICBlbHNlIHsKICAgICAgICAgUHlfSU5DUkVGKGRpY3QpOwogICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKICAgICAgICAgICAgIHJlcyA9IFB5RGljdF9EZWxJdGVtKGRpY3QsIG5hbWUpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICByZXMgPSBQeURpY3RfU2V0SXRlbShkaWN0LCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKLSAgICAgICAgaWYgKHJlcyA8IDAgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCi0gICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQorICAgIGlmIChyZXMgPCAwICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQorICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwogCi0gICAgaWYgKGYgIT0gTlVMTCkgewotICAgICAgICByZXMgPSBmKGRlc2NyLCBvYmosIHZhbHVlKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLQotICAgIGlmIChkZXNjciA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJVUnIiwKLSAgICAgICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLCBuYW1lKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLQotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICAgICAgIiclLjUwcycgb2JqZWN0IGF0dHJpYnV0ZSAnJVUnIGlzIHJlYWQtb25seSIsCi0gICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLCBuYW1lKTsKICAgZG9uZToKICAgICBQeV9YREVDUkVGKGRlc2NyKTsKICAgICBQeV9ERUNSRUYobmFtZSk7CkBAIC0xMjA0LDcgKzExOTcsNyBAQAogaW50CiBQeU9iamVjdF9HZW5lcmljU2V0RGljdChQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCiB7Ci0gICAgUHlPYmplY3QgKmRpY3QsICoqZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKG9iaik7CisgICAgUHlPYmplY3QgKipkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIob2JqKTsKICAgICBpZiAoZGljdHB0ciA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIG9iamVjdCBoYXMgbm8gX19kaWN0X18iKTsKQEAgLTEyMjAsMTAgKzEyMTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgIm5vdCBhICclLjIwMHMnIiwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGRpY3QgPSAqZGljdHB0cjsKLSAgICBQeV9YSU5DUkVGKHZhbHVlKTsKLSAgICAqZGljdHB0ciA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9YU0VUUkVGKCpkaWN0cHRyLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvb2JtYWxsb2MuYyBiL09iamVjdHMvb2JtYWxsb2MuYwppbmRleCA3Y2M4ODlmLi41NGQ2OGI3IDEwMDY0NAotLS0gYS9PYmplY3RzL29ibWFsbG9jLmMKKysrIGIvT2JqZWN0cy9vYm1hbGxvYy5jCkBAIC0xLDE3ICsxLDM4IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKKworLyogRGVmaW5lZCBpbiB0cmFjZW1hbGxvYy5jICovCitleHRlcm4gdm9pZCBfUHlNZW1fRHVtcFRyYWNlYmFjayhpbnQgZmQsIGNvbnN0IHZvaWQgKnB0cik7CisKKwogLyogUHl0aG9uJ3MgbWFsbG9jIHdyYXBwZXJzIChzZWUgcHltZW0uaCkgKi8KIAotI2lmZGVmIFBZTUFMTE9DX0RFQlVHICAgLyogV0lUSF9QWU1BTExPQyAmJiBQWU1BTExPQ19ERUJVRyAqLworLyoKKyAqIEJhc2ljIHR5cGVzCisgKiBJIGRvbid0IGNhcmUgaWYgdGhlc2UgYXJlIGRlZmluZWQgaW4gPHN5cy90eXBlcy5oPiBvciBlbHNld2hlcmUuIEF4aW9tLgorICovCisjdW5kZWYgIHVjaGFyCisjZGVmaW5lIHVjaGFyICAgdW5zaWduZWQgY2hhciAgIC8qIGFzc3VtaW5nID09IDggYml0cyAgKi8KKworI3VuZGVmICB1aW50CisjZGVmaW5lIHVpbnQgICAgdW5zaWduZWQgaW50ICAgIC8qIGFzc3VtaW5nID49IDE2IGJpdHMgKi8KKworI3VuZGVmIHVwdHIKKyNkZWZpbmUgdXB0ciAgICB1aW50cHRyX3QKKwogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z1Jhd01hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkKiBfUHlNZW1fRGVidWdSYXdDYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpOworc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z1Jhd1JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkIF9QeU1lbV9EZWJ1Z1Jhd0ZyZWUodm9pZCAqY3R4LCB2b2lkICpwKTsKKwogc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z01hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBzaXplKTsKIHN0YXRpYyB2b2lkKiBfUHlNZW1fRGVidWdDYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpOwotc3RhdGljIHZvaWQgX1B5TWVtX0RlYnVnRnJlZSh2b2lkICpjdHgsIHZvaWQgKnApOwogc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z1JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkIF9QeU1lbV9EZWJ1Z0ZyZWUodm9pZCAqY3R4LCB2b2lkICpwKTsKIAogc3RhdGljIHZvaWQgX1B5T2JqZWN0X0RlYnVnRHVtcEFkZHJlc3MoY29uc3Qgdm9pZCAqcCk7CiBzdGF0aWMgdm9pZCBfUHlNZW1fRGVidWdDaGVja0FkZHJlc3MoY2hhciBhcGlfaWQsIGNvbnN0IHZvaWQgKnApOwotI2VuZGlmCiAKICNpZiBkZWZpbmVkKF9faGFzX2ZlYXR1cmUpICAvKiBDbGFuZyAqLwogICNpZiBfX2hhc19mZWF0dXJlKGFkZHJlc3Nfc2FuaXRpemVyKSAgLyogaXMgQVNBTiBlbmFibGVkPyAqLwpAQCAtMTQ1LDkgKzE2Niw4IEBACiAjZWxzZQogIyAgZGVmaW5lIFBZT0JKX0ZVTkNTIFBZUkFXX0ZVTkNTCiAjZW5kaWYKLSNkZWZpbmUgUFlNRU1fRlVOQ1MgUFlSQVdfRlVOQ1MKKyNkZWZpbmUgUFlNRU1fRlVOQ1MgUFlPQkpfRlVOQ1MKIAotI2lmZGVmIFBZTUFMTE9DX0RFQlVHCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogV2UgdGFnIGVhY2ggYmxvY2sgd2l0aCBhbiBBUEkgSUQgaW4gb3JkZXIgdG8gdGFnIEFQSSB2aW9sYXRpb25zICovCiAgICAgY2hhciBhcGlfaWQ7CkBAIC0xNjMsMTkgKzE4MywyMSBAQAogICAgIHsnbycsIHtOVUxMLCBQWU9CSl9GVU5DU319CiAgICAgfTsKIAotI2RlZmluZSBQWURCR19GVU5DUyBfUHlNZW1fRGVidWdNYWxsb2MsIF9QeU1lbV9EZWJ1Z0NhbGxvYywgX1B5TWVtX0RlYnVnUmVhbGxvYywgX1B5TWVtX0RlYnVnRnJlZQotI2VuZGlmCisjZGVmaW5lIFBZUkFXREJHX0ZVTkNTIFwKKyAgICBfUHlNZW1fRGVidWdSYXdNYWxsb2MsIF9QeU1lbV9EZWJ1Z1Jhd0NhbGxvYywgX1B5TWVtX0RlYnVnUmF3UmVhbGxvYywgX1B5TWVtX0RlYnVnUmF3RnJlZQorI2RlZmluZSBQWURCR19GVU5DUyBcCisgICAgX1B5TWVtX0RlYnVnTWFsbG9jLCBfUHlNZW1fRGVidWdDYWxsb2MsIF9QeU1lbV9EZWJ1Z1JlYWxsb2MsIF9QeU1lbV9EZWJ1Z0ZyZWUKIAogc3RhdGljIFB5TWVtQWxsb2NhdG9yRXggX1B5TWVtX1JhdyA9IHsKLSNpZmRlZiBQWU1BTExPQ19ERUJVRwotICAgICZfUHlNZW1fRGVidWcucmF3LCBQWURCR19GVU5DUworI2lmZGVmIFB5X0RFQlVHCisgICAgJl9QeU1lbV9EZWJ1Zy5yYXcsIFBZUkFXREJHX0ZVTkNTCiAjZWxzZQogICAgIE5VTEwsIFBZUkFXX0ZVTkNTCiAjZW5kaWYKICAgICB9OwogCiBzdGF0aWMgUHlNZW1BbGxvY2F0b3JFeCBfUHlNZW0gPSB7Ci0jaWZkZWYgUFlNQUxMT0NfREVCVUcKKyNpZmRlZiBQeV9ERUJVRwogICAgICZfUHlNZW1fRGVidWcubWVtLCBQWURCR19GVU5DUwogI2Vsc2UKICAgICBOVUxMLCBQWU1FTV9GVU5DUwpAQCAtMTgzLDE2ICsyMDUsNzYgQEAKICAgICB9OwogCiBzdGF0aWMgUHlNZW1BbGxvY2F0b3JFeCBfUHlPYmplY3QgPSB7Ci0jaWZkZWYgUFlNQUxMT0NfREVCVUcKKyNpZmRlZiBQeV9ERUJVRwogICAgICZfUHlNZW1fRGVidWcub2JqLCBQWURCR19GVU5DUwogI2Vsc2UKICAgICBOVUxMLCBQWU9CSl9GVU5DUwogI2VuZGlmCiAgICAgfTsKIAoraW50CitfUHlNZW1fU2V0dXBBbGxvY2F0b3JzKGNvbnN0IGNoYXIgKm9wdCkKK3sKKyAgICBpZiAob3B0ID09IE5VTEwgfHwgKm9wdCA9PSAnXDAnKSB7CisgICAgICAgIC8qIFBZVEhPTk1BTExPQyBpcyBlbXB0eSBvciBpcyBub3Qgc2V0IG9yIGlnbm9yZWQgKC1FLy1JIGNvbW1hbmQgbGluZQorICAgICAgICAgICBvcHRpb25zKTogdXNlIGRlZmF1bHQgYWxsb2NhdG9ycyAqLworI2lmZGVmIFB5X0RFQlVHCisjICBpZmRlZiBXSVRIX1BZTUFMTE9DCisgICAgICAgIG9wdCA9ICJweW1hbGxvY19kZWJ1ZyI7CisjICBlbHNlCisgICAgICAgIG9wdCA9ICJtYWxsb2NfZGVidWciOworIyAgZW5kaWYKKyNlbHNlCisgICAvKiAhUHlfREVCVUcgKi8KKyMgIGlmZGVmIFdJVEhfUFlNQUxMT0MKKyAgICAgICAgb3B0ID0gInB5bWFsbG9jIjsKKyMgIGVsc2UKKyAgICAgICAgb3B0ID0gIm1hbGxvYyI7CisjICBlbmRpZgorI2VuZGlmCisgICAgfQorCisgICAgaWYgKHN0cmNtcChvcHQsICJkZWJ1ZyIpID09IDApIHsKKyAgICAgICAgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKCk7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChvcHQsICJtYWxsb2MiKSA9PSAwIHx8IHN0cmNtcChvcHQsICJtYWxsb2NfZGVidWciKSA9PSAwKQorICAgIHsKKyAgICAgICAgUHlNZW1BbGxvY2F0b3JFeCBhbGxvYyA9IHtOVUxMLCBQWVJBV19GVU5DU307CisKKyAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9SQVcsICZhbGxvYyk7CisgICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fTUVNLCAmYWxsb2MpOworICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX09CSiwgJmFsbG9jKTsKKworICAgICAgICBpZiAoc3RyY21wKG9wdCwgIm1hbGxvY19kZWJ1ZyIpID09IDApCisgICAgICAgICAgICBQeU1lbV9TZXR1cERlYnVnSG9va3MoKTsKKyAgICB9CisjaWZkZWYgV0lUSF9QWU1BTExPQworICAgIGVsc2UgaWYgKHN0cmNtcChvcHQsICJweW1hbGxvYyIpID09IDAKKyAgICAgICAgICAgICB8fCBzdHJjbXAob3B0LCAicHltYWxsb2NfZGVidWciKSA9PSAwKQorICAgIHsKKyAgICAgICAgUHlNZW1BbGxvY2F0b3JFeCByYXdfYWxsb2MgPSB7TlVMTCwgUFlSQVdfRlVOQ1N9OworICAgICAgICBQeU1lbUFsbG9jYXRvckV4IG1lbV9hbGxvYyA9IHtOVUxMLCBQWU1FTV9GVU5DU307CisgICAgICAgIFB5TWVtQWxsb2NhdG9yRXggb2JqX2FsbG9jID0ge05VTEwsIFBZT0JKX0ZVTkNTfTsKKworICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX1JBVywgJnJhd19hbGxvYyk7CisgICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fTUVNLCAmbWVtX2FsbG9jKTsKKyAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZvYmpfYWxsb2MpOworCisgICAgICAgIGlmIChzdHJjbXAob3B0LCAicHltYWxsb2NfZGVidWciKSA9PSAwKQorICAgICAgICAgICAgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKCk7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIC8qIHVua25vd24gYWxsb2NhdG9yICovCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKICN1bmRlZiBQWVJBV19GVU5DUwogI3VuZGVmIFBZTUVNX0ZVTkNTCiAjdW5kZWYgUFlPQkpfRlVOQ1MKKyN1bmRlZiBQWVJBV0RCR19GVU5DUwogI3VuZGVmIFBZREJHX0ZVTkNTCiAKIHN0YXRpYyBQeU9iamVjdEFyZW5hQWxsb2NhdG9yIF9QeU9iamVjdF9BcmVuYSA9IHtOVUxMLApAQCAtMjA1LDIzICsyODcsNDYgQEAKICNlbmRpZgogICAgIH07CiAKKyNpZmRlZiBXSVRIX1BZTUFMTE9DCitzdGF0aWMgaW50CitfUHlNZW1fRGVidWdFbmFibGVkKHZvaWQpCit7CisgICAgcmV0dXJuIChfUHlPYmplY3QubWFsbG9jID09IF9QeU1lbV9EZWJ1Z01hbGxvYyk7Cit9CisKK2ludAorX1B5TWVtX1B5bWFsbG9jRW5hYmxlZCh2b2lkKQoreworICAgIGlmIChfUHlNZW1fRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChfUHlNZW1fRGVidWcub2JqLmFsbG9jLm1hbGxvYyA9PSBfUHlPYmplY3RfTWFsbG9jKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAoX1B5T2JqZWN0Lm1hbGxvYyA9PSBfUHlPYmplY3RfTWFsbG9jKTsKKyAgICB9Cit9CisjZW5kaWYKKwogdm9pZAogUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKHZvaWQpCiB7Ci0jaWZkZWYgUFlNQUxMT0NfREVCVUcKICAgICBQeU1lbUFsbG9jYXRvckV4IGFsbG9jOwogCisgICAgYWxsb2MubWFsbG9jID0gX1B5TWVtX0RlYnVnUmF3TWFsbG9jOworICAgIGFsbG9jLmNhbGxvYyA9IF9QeU1lbV9EZWJ1Z1Jhd0NhbGxvYzsKKyAgICBhbGxvYy5yZWFsbG9jID0gX1B5TWVtX0RlYnVnUmF3UmVhbGxvYzsKKyAgICBhbGxvYy5mcmVlID0gX1B5TWVtX0RlYnVnUmF3RnJlZTsKKworICAgIGlmIChfUHlNZW1fUmF3Lm1hbGxvYyAhPSBfUHlNZW1fRGVidWdSYXdNYWxsb2MpIHsKKyAgICAgICAgYWxsb2MuY3R4ID0gJl9QeU1lbV9EZWJ1Zy5yYXc7CisgICAgICAgIFB5TWVtX0dldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fUkFXLCAmX1B5TWVtX0RlYnVnLnJhdy5hbGxvYyk7CisgICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fUkFXLCAmYWxsb2MpOworICAgIH0KKwogICAgIGFsbG9jLm1hbGxvYyA9IF9QeU1lbV9EZWJ1Z01hbGxvYzsKICAgICBhbGxvYy5jYWxsb2MgPSBfUHlNZW1fRGVidWdDYWxsb2M7CiAgICAgYWxsb2MucmVhbGxvYyA9IF9QeU1lbV9EZWJ1Z1JlYWxsb2M7CiAgICAgYWxsb2MuZnJlZSA9IF9QeU1lbV9EZWJ1Z0ZyZWU7CiAKLSAgICBpZiAoX1B5TWVtX1Jhdy5tYWxsb2MgIT0gX1B5TWVtX0RlYnVnTWFsbG9jKSB7Ci0gICAgICAgIGFsbG9jLmN0eCA9ICZfUHlNZW1fRGVidWcucmF3OwotICAgICAgICBQeU1lbV9HZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX1JBVywgJl9QeU1lbV9EZWJ1Zy5yYXcuYWxsb2MpOwotICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX1JBVywgJmFsbG9jKTsKLSAgICB9Ci0KICAgICBpZiAoX1B5TWVtLm1hbGxvYyAhPSBfUHlNZW1fRGVidWdNYWxsb2MpIHsKICAgICAgICAgYWxsb2MuY3R4ID0gJl9QeU1lbV9EZWJ1Zy5tZW07CiAgICAgICAgIFB5TWVtX0dldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fTUVNLCAmX1B5TWVtX0RlYnVnLm1lbS5hbGxvYyk7CkBAIC0yMzMsNyArMzM4LDYgQEAKICAgICAgICAgUHlNZW1fR2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZfUHlNZW1fRGVidWcub2JqLmFsbG9jKTsKICAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZhbGxvYyk7CiAgICAgfQotI2VuZGlmCiB9CiAKIHZvaWQKQEAgLTI2NCw3ICszNjgsNiBAQAogICAgIGNhc2UgUFlNRU1fRE9NQUlOX09CSjogX1B5T2JqZWN0ID0gKmFsbG9jYXRvcjsgYnJlYWs7CiAgICAgLyogaWdub3JlIHVua25vd24gZG9tYWluICovCiAgICAgfQotCiB9CiAKIHZvaWQKQEAgLTY0MiwyMiArNzQ1LDYgQEAKICNkZWZpbmUgU0lNUExFTE9DS19MT0NLKGxvY2spICAgLyogYWNxdWlyZSByZWxlYXNlZCBsb2NrICovCiAjZGVmaW5lIFNJTVBMRUxPQ0tfVU5MT0NLKGxvY2spIC8qIHJlbGVhc2UgYWNxdWlyZWQgbG9jayAqLwogCi0vKgotICogQmFzaWMgdHlwZXMKLSAqIEkgZG9uJ3QgY2FyZSBpZiB0aGVzZSBhcmUgZGVmaW5lZCBpbiA8c3lzL3R5cGVzLmg+IG9yIGVsc2V3aGVyZS4gQXhpb20uCi0gKi8KLSN1bmRlZiAgdWNoYXIKLSNkZWZpbmUgdWNoYXIgICB1bnNpZ25lZCBjaGFyICAgLyogYXNzdW1pbmcgPT0gOCBiaXRzICAqLwotCi0jdW5kZWYgIHVpbnQKLSNkZWZpbmUgdWludCAgICB1bnNpZ25lZCBpbnQgICAgLyogYXNzdW1pbmcgPj0gMTYgYml0cyAqLwotCi0jdW5kZWYgIHVsb25nCi0jZGVmaW5lIHVsb25nICAgdW5zaWduZWQgbG9uZyAgIC8qIGFzc3VtaW5nID49IDMyIGJpdHMgKi8KLQotI3VuZGVmIHVwdHIKLSNkZWZpbmUgdXB0ciAgICBQeV91aW50cHRyX3QKLQogLyogV2hlbiB5b3Ugc2F5IG1lbW9yeSwgbXkgbWluZCByZWFzb25zIGluIHRlcm1zIG9mIChwb2ludGVycyB0bykgYmxvY2tzICovCiB0eXBlZGVmIHVjaGFyIGJsb2NrOwogCkBAIC05NDksMTEgKzEwMzYsMTUgQEAKICAgICBzdHJ1Y3QgYXJlbmFfb2JqZWN0KiBhcmVuYW9iajsKICAgICB1aW50IGV4Y2VzczsgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyBhYm92ZSBwb29sIGFsaWdubWVudCAqLwogICAgIHZvaWQgKmFkZHJlc3M7CisgICAgc3RhdGljIGludCBkZWJ1Z19zdGF0cyA9IC0xOwogCi0jaWZkZWYgUFlNQUxMT0NfREVCVUcKLSAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpKQorICAgIGlmIChkZWJ1Z19zdGF0cyA9PSAtMSkgeworICAgICAgICBjaGFyICpvcHQgPSBQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIik7CisgICAgICAgIGRlYnVnX3N0YXRzID0gKG9wdCAhPSBOVUxMICYmICpvcHQgIT0gJ1wwJyk7CisgICAgfQorICAgIGlmIChkZWJ1Z19zdGF0cykKICAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHMoc3RkZXJyKTsKLSNlbmRpZgorCiAgICAgaWYgKHVudXNlZF9hcmVuYV9vYmplY3RzID09IE5VTEwpIHsKICAgICAgICAgdWludCBpOwogICAgICAgICB1aW50IG51bWFyZW5hczsKQEAgLTk2Niw3ICsxMDU3LDcgQEAKICAgICAgICAgaWYgKG51bWFyZW5hcyA8PSBtYXhhcmVuYXMpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogb3ZlcmZsb3cgKi8KICNpZiBTSVpFT0ZfU0laRV9UIDw9IFNJWkVPRl9JTlQKLSAgICAgICAgaWYgKG51bWFyZW5hcyA+IFBZX1NJWkVfTUFYIC8gc2l6ZW9mKCphcmVuYXMpKQorICAgICAgICBpZiAobnVtYXJlbmFzID4gU0laRV9NQVggLyBzaXplb2YoKmFyZW5hcykpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogb3ZlcmZsb3cgKi8KICNlbmRpZgogICAgICAgICBuYnl0ZXMgPSBudW1hcmVuYXMgKiBzaXplb2YoKmFyZW5hcyk7CkBAIC0xNzA5LDcgKzE4MDAsNyBAQAogCiAjZW5kaWYgLyogV0lUSF9QWU1BTExPQyAqLwogCi0jaWZkZWYgUFlNQUxMT0NfREVCVUcKKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBBIHgtcGxhdGZvcm0gZGVidWdnaW5nIGFsbG9jYXRvci4gIFRoaXMgZG9lc24ndCBtYW5hZ2UgbWVtb3J5IGRpcmVjdGx5LAogICogaXQgd3JhcHMgYSByZWFsIGFsbG9jYXRvciwgYWRkaW5nIGV4dHJhIGRlYnVnZ2luZyBpbmZvIHRvIHRoZSBtZW1vcnkgYmxvY2tzLgpAQCAtMTc2NywzMSArMTg1OCw2IEBACiAgICAgfQogfQogCi0jaWZkZWYgUHlfREVCVUcKLS8qIElzIHRhcmdldCBpbiB0aGUgbGlzdD8gIFRoZSBsaXN0IGlzIHRyYXZlcnNlZCB2aWEgdGhlIG5leHRwb29sIHBvaW50ZXJzLgotICogVGhlIGxpc3QgbWF5IGJlIE5VTEwtdGVybWluYXRlZCwgb3IgY2lyY3VsYXIuICBSZXR1cm4gMSBpZiB0YXJnZXQgaXMgaW4KLSAqIGxpc3QsIGVsc2UgMC4KLSAqLwotc3RhdGljIGludAotcG9vbF9pc19pbl9saXN0KGNvbnN0IHBvb2xwIHRhcmdldCwgcG9vbHAgbGlzdCkKLXsKLSAgICBwb29scCBvcmlnbGlzdCA9IGxpc3Q7Ci0gICAgYXNzZXJ0KHRhcmdldCAhPSBOVUxMKTsKLSAgICBpZiAobGlzdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLSAgICBkbyB7Ci0gICAgICAgIGlmICh0YXJnZXQgPT0gbGlzdCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dHBvb2w7Ci0gICAgfSB3aGlsZSAobGlzdCAhPSBOVUxMICYmIGxpc3QgIT0gb3JpZ2xpc3QpOwotICAgIHJldHVybiAwOwotfQotCi0jZWxzZQotI2RlZmluZSBwb29sX2lzX2luX2xpc3QoWCwgWSkgMQotCi0jZW5kaWYgIC8qIFB5X0RFQlVHICovCi0KIC8qIExldCBTID0gc2l6ZW9mKHNpemVfdCkuICBUaGUgZGVidWcgbWFsbG9jIGFza3MgZm9yIDQqUyBleHRyYSBieXRlcyBhbmQKICAgIGZpbGxzIHRoZW0gd2l0aCB1c2VmdWwgc3R1ZmYsIGhlcmUgY2FsbGluZyB0aGUgdW5kZXJseWluZyBtYWxsb2MncyByZXN1bHQgcDoKIApAQCAtMTgxOSw3ICsxODg1LDcgQEAKICovCiAKIHN0YXRpYyB2b2lkICoKLV9QeU1lbV9EZWJ1Z0FsbG9jKGludCB1c2VfY2FsbG9jLCB2b2lkICpjdHgsIHNpemVfdCBuYnl0ZXMpCitfUHlNZW1fRGVidWdSYXdBbGxvYyhpbnQgdXNlX2NhbGxvYywgdm9pZCAqY3R4LCBzaXplX3QgbmJ5dGVzKQogewogICAgIGRlYnVnX2FsbG9jX2FwaV90ICphcGkgPSAoZGVidWdfYWxsb2NfYXBpX3QgKiljdHg7CiAgICAgdWNoYXIgKnA7ICAgICAgICAgICAvKiBiYXNlIGFkZHJlc3Mgb2YgbWFsbG9jJ2VkIGJsb2NrICovCkBAIC0xODU2LDE4ICsxOTIyLDE4IEBACiB9CiAKIHN0YXRpYyB2b2lkICoKLV9QeU1lbV9EZWJ1Z01hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBuYnl0ZXMpCitfUHlNZW1fRGVidWdSYXdNYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmJ5dGVzKQogewotICAgIHJldHVybiBfUHlNZW1fRGVidWdBbGxvYygwLCBjdHgsIG5ieXRlcyk7CisgICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z1Jhd0FsbG9jKDAsIGN0eCwgbmJ5dGVzKTsKIH0KIAogc3RhdGljIHZvaWQgKgotX1B5TWVtX0RlYnVnQ2FsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKQorX1B5TWVtX0RlYnVnUmF3Q2FsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKQogewogICAgIHNpemVfdCBuYnl0ZXM7CiAgICAgYXNzZXJ0KGVsc2l6ZSA9PSAwIHx8IG5lbGVtIDw9IFBZX1NTSVpFX1RfTUFYIC8gZWxzaXplKTsKICAgICBuYnl0ZXMgPSBuZWxlbSAqIGVsc2l6ZTsKLSAgICByZXR1cm4gX1B5TWVtX0RlYnVnQWxsb2MoMSwgY3R4LCBuYnl0ZXMpOworICAgIHJldHVybiBfUHlNZW1fRGVidWdSYXdBbGxvYygxLCBjdHgsIG5ieXRlcyk7CiB9CiAKIC8qIFRoZSBkZWJ1ZyBmcmVlIGZpcnN0IGNoZWNrcyB0aGUgMipTU1QgYnl0ZXMgb24gZWFjaCBlbmQgZm9yIHNhbml0eSAoaW4KQEAgLTE4NzYsNyArMTk0Miw3IEBACiAgICBUaGVuIGNhbGxzIHRoZSB1bmRlcmx5aW5nIGZyZWUuCiAqLwogc3RhdGljIHZvaWQKLV9QeU1lbV9EZWJ1Z0ZyZWUodm9pZCAqY3R4LCB2b2lkICpwKQorX1B5TWVtX0RlYnVnUmF3RnJlZSh2b2lkICpjdHgsIHZvaWQgKnApCiB7CiAgICAgZGVidWdfYWxsb2NfYXBpX3QgKmFwaSA9IChkZWJ1Z19hbGxvY19hcGlfdCAqKWN0eDsKICAgICB1Y2hhciAqcSA9ICh1Y2hhciAqKXAgLSAyKlNTVDsgIC8qIGFkZHJlc3MgcmV0dXJuZWQgZnJvbSBtYWxsb2MgKi8KQEAgLTE4OTMsNyArMTk1OSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkICoKLV9QeU1lbV9EZWJ1Z1JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwLCBzaXplX3QgbmJ5dGVzKQorX1B5TWVtX0RlYnVnUmF3UmVhbGxvYyh2b2lkICpjdHgsIHZvaWQgKnAsIHNpemVfdCBuYnl0ZXMpCiB7CiAgICAgZGVidWdfYWxsb2NfYXBpX3QgKmFwaSA9IChkZWJ1Z19hbGxvY19hcGlfdCAqKWN0eDsKICAgICB1Y2hhciAqcSA9ICh1Y2hhciAqKXAsICpvbGRxOwpAQCAtMTkwMyw3ICsxOTY5LDcgQEAKICAgICBpbnQgaTsKIAogICAgIGlmIChwID09IE5VTEwpCi0gICAgICAgIHJldHVybiBfUHlNZW1fRGVidWdBbGxvYygwLCBjdHgsIG5ieXRlcyk7CisgICAgICAgIHJldHVybiBfUHlNZW1fRGVidWdSYXdBbGxvYygwLCBjdHgsIG5ieXRlcyk7CiAKICAgICBfUHlNZW1fRGVidWdDaGVja0FkZHJlc3MoYXBpLT5hcGlfaWQsIHApOwogICAgIGJ1bXBzZXJpYWxubygpOwpAQCAtMTk0Niw2ICsyMDEyLDQ0IEBACiAgICAgcmV0dXJuIHE7CiB9CiAKK3N0YXRpYyB2b2lkCitfUHlNZW1fRGVidWdDaGVja0dJTCh2b2lkKQoreworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgaWYgKCFQeUdJTFN0YXRlX0NoZWNrKCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yIGNhbGxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgaG9sZGluZyB0aGUgR0lMIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgKgorX1B5TWVtX0RlYnVnTWFsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IG5ieXRlcykKK3sKKyAgICBfUHlNZW1fRGVidWdDaGVja0dJTCgpOworICAgIHJldHVybiBfUHlNZW1fRGVidWdSYXdNYWxsb2MoY3R4LCBuYnl0ZXMpOworfQorCitzdGF0aWMgdm9pZCAqCitfUHlNZW1fRGVidWdDYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCit7CisgICAgX1B5TWVtX0RlYnVnQ2hlY2tHSUwoKTsKKyAgICByZXR1cm4gX1B5TWVtX0RlYnVnUmF3Q2FsbG9jKGN0eCwgbmVsZW0sIGVsc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitfUHlNZW1fRGVidWdGcmVlKHZvaWQgKmN0eCwgdm9pZCAqcHRyKQoreworICAgIF9QeU1lbV9EZWJ1Z0NoZWNrR0lMKCk7CisgICAgX1B5TWVtX0RlYnVnUmF3RnJlZShjdHgsIHB0cik7Cit9CisKK3N0YXRpYyB2b2lkICoKK19QeU1lbV9EZWJ1Z1JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBuYnl0ZXMpCit7CisgICAgX1B5TWVtX0RlYnVnQ2hlY2tHSUwoKTsKKyAgICByZXR1cm4gX1B5TWVtX0RlYnVnUmF3UmVhbGxvYyhjdHgsIHB0ciwgbmJ5dGVzKTsKK30KKwogLyogQ2hlY2sgdGhlIGZvcmJpZGRlbiBieXRlcyBvbiBib3RoIGVuZHMgb2YgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHAuCiAgKiBJZiBhbnl0aGluZyBpcyB3cm9uZywgcHJpbnQgaW5mbyB0byBzdGRlcnIgdmlhIF9QeU9iamVjdF9EZWJ1Z0R1bXBBZGRyZXNzLAogICogYW5kIGNhbGwgUHlfRmF0YWxFcnJvciB0byBraWxsIHRoZSBwcm9ncmFtLgpAQCAtMjEwNCw5ICsyMjA4LDEyIEBACiAgICAgICAgIH0KICAgICAgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKICAgICB9CisgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKKworICAgIGZmbHVzaChzdGRlcnIpOworICAgIF9QeU1lbV9EdW1wVHJhY2ViYWNrKGZpbGVubyhzdGRlcnIpLCBwKTsKIH0KIAotI2VuZGlmICAvKiBQWU1BTExPQ19ERUJVRyAqLwogCiBzdGF0aWMgc2l6ZV90CiBwcmludG9uZShGSUxFICpvdXQsIGNvbnN0IGNoYXIqIG1zZywgc2l6ZV90IHZhbHVlKQpAQCAtMjE1OCw4ICsyMjY1LDMwIEBACiAgICAgKHZvaWQpcHJpbnRvbmUob3V0LCBidWYyLCBudW1fYmxvY2tzICogc2l6ZW9mX2Jsb2NrKTsKIH0KIAorCiAjaWZkZWYgV0lUSF9QWU1BTExPQwogCisjaWZkZWYgUHlfREVCVUcKKy8qIElzIHRhcmdldCBpbiB0aGUgbGlzdD8gIFRoZSBsaXN0IGlzIHRyYXZlcnNlZCB2aWEgdGhlIG5leHRwb29sIHBvaW50ZXJzLgorICogVGhlIGxpc3QgbWF5IGJlIE5VTEwtdGVybWluYXRlZCwgb3IgY2lyY3VsYXIuICBSZXR1cm4gMSBpZiB0YXJnZXQgaXMgaW4KKyAqIGxpc3QsIGVsc2UgMC4KKyAqLworc3RhdGljIGludAorcG9vbF9pc19pbl9saXN0KGNvbnN0IHBvb2xwIHRhcmdldCwgcG9vbHAgbGlzdCkKK3sKKyAgICBwb29scCBvcmlnbGlzdCA9IGxpc3Q7CisgICAgYXNzZXJ0KHRhcmdldCAhPSBOVUxMKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBkbyB7CisgICAgICAgIGlmICh0YXJnZXQgPT0gbGlzdCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dHBvb2w7CisgICAgfSB3aGlsZSAobGlzdCAhPSBOVUxMICYmIGxpc3QgIT0gb3JpZ2xpc3QpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKIC8qIFByaW50IHN1bW1hcnkgaW5mbyB0byAib3V0IiBhYm91dCB0aGUgc3RhdGUgb2YgcHltYWxsb2MncyBzdHJ1Y3R1cmVzLgogICogSW4gUHlfREVCVUcgbW9kZSwgYWxzbyBwZXJmb3JtIHNvbWUgZXhwZW5zaXZlIGludGVybmFsIGNvbnNpc3RlbmN5CiAgKiBjaGVja3MuCkBAIC0yMjMzLDcgKzIzNjIsOSBAQAogCiAgICAgICAgICAgICBpZiAocC0+cmVmLmNvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICAvKiBjdXJyZW50bHkgdW51c2VkICovCisjaWZkZWYgUHlfREVCVUcKICAgICAgICAgICAgICAgICBhc3NlcnQocG9vbF9pc19pbl9saXN0KHAsIGFyZW5hc1tpXS5mcmVlcG9vbHMpKTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKytudW1wb29sc1tzel07CkBAIC0yMjczLDkgKzI0MDQsOCBAQAogICAgICAgICBxdWFudGl6YXRpb24gKz0gcCAqICgoUE9PTF9TSVpFIC0gUE9PTF9PVkVSSEVBRCkgJSBzaXplKTsKICAgICB9CiAgICAgZnB1dGMoJ1xuJywgb3V0KTsKLSNpZmRlZiBQWU1BTExPQ19ERUJVRwotICAgICh2b2lkKXByaW50b25lKG91dCwgIiMgdGltZXMgb2JqZWN0IG1hbGxvYyBjYWxsZWQiLCBzZXJpYWxubyk7Ci0jZW5kaWYKKyAgICBpZiAoX1B5TWVtX0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAodm9pZClwcmludG9uZShvdXQsICIjIHRpbWVzIG9iamVjdCBtYWxsb2MgY2FsbGVkIiwgc2VyaWFsbm8pOwogICAgICh2b2lkKXByaW50b25lKG91dCwgIiMgYXJlbmFzIGFsbG9jYXRlZCB0b3RhbCIsIG50aW1lc19hcmVuYV9hbGxvY2F0ZWQpOwogICAgICh2b2lkKXByaW50b25lKG91dCwgIiMgYXJlbmFzIHJlY2xhaW1lZCIsIG50aW1lc19hcmVuYV9hbGxvY2F0ZWQgLSBuYXJlbmFzKTsKICAgICAodm9pZClwcmludG9uZShvdXQsICIjIGFyZW5hcyBoaWdod2F0ZXIgbWFyayIsIG5hcmVuYXNfaGlnaHdhdGVyKTsKQEAgLTIzMDMsNiArMjQzMyw3IEBACiAKICNlbmRpZiAvKiAjaWZkZWYgV0lUSF9QWU1BTExPQyAqLwogCisKICNpZmRlZiBQeV9VU0lOR19NRU1PUllfREVCVUdHRVIKIC8qIE1ha2UgdGhpcyBmdW5jdGlvbiBsYXN0IHNvIGdjYyB3b24ndCBpbmxpbmUgaXQgc2luY2UgdGhlIGRlZmluaXRpb24gaXMKICAqIGFmdGVyIHRoZSByZWZlcmVuY2UuCmRpZmYgLS1naXQgYS9PYmplY3RzL29kaWN0b2JqZWN0LmMgYi9PYmplY3RzL29kaWN0b2JqZWN0LmMKaW5kZXggYTY5NjNkNy4uMjJiMWYxZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9vZGljdG9iamVjdC5jCisrKyBiL09iamVjdHMvb2RpY3RvYmplY3QuYwpAQCAtMzksNyArMzksNyBAQAogICAgX19nZXRpdGVtX18oKSwgZ2V0KCksIGV0Yy4gYWNjb3JkaW5nbHkuCiAKIFRoZSBhcHByb2FjaCB3aXRoIHRoZSBsZWFzdCBwZXJmb3JtYW5jZSBpbXBhY3QgKHRpbWUgYW5kIHNwYWNlKSBpcyAjMiwKLW1pcnJvcmluZyB0aGUga2V5IG9yZGVyIG9mIGRpY3QncyBka19lbnRpZXMgd2l0aCBhbiBhcnJheSBvZiBub2RlIHBvaW50ZXJzLgorbWlycm9yaW5nIHRoZSBrZXkgb3JkZXIgb2YgZGljdCdzIGRrX2VudHJpZXMgd2l0aCBhbiBhcnJheSBvZiBub2RlIHBvaW50ZXJzLgogV2hpbGUgbG9va2RpY3QoKSBhbmQgZnJpZW5kcyAoZGtfbG9va3VwKSBkb24ndCBnaXZlIHVzIHRoZSBpbmRleCBpbnRvIHRoZQogYXJyYXksIHdlIG1ha2UgdXNlIG9mIHBvaW50ZXIgYXJpdGhtZXRpYyB0byBnZXQgdGhhdCBpbmRleC4gIEFuIGFsdGVybmF0aXZlCiB3b3VsZCBiZSB0byByZWZhY3RvciBsb29rZGljdCgpIHRvIHByb3ZpZGUgdGhlIGluZGV4LCBleHBsaWNpdGx5IGV4cG9zaW5nCkBAIC01MzYsMTQgKzUzNiwxNyBAQAogX29kaWN0X2dldF9pbmRleF9yYXcoUHlPRGljdE9iamVjdCAqb2QsIFB5T2JqZWN0ICprZXksIFB5X2hhc2hfdCBoYXNoKQogewogICAgIFB5T2JqZWN0ICoqdmFsdWVfYWRkciA9IE5VTEw7Ci0gICAgUHlEaWN0S2V5RW50cnkgKmVwOwogICAgIFB5RGljdEtleXNPYmplY3QgKmtleXMgPSAoKFB5RGljdE9iamVjdCAqKW9kKS0+bWFfa2V5czsKKyAgICBQeV9zc2l6ZV90IGl4OwogCi0gICAgZXAgPSAoa2V5cy0+ZGtfbG9va3VwKSgoUHlEaWN0T2JqZWN0ICopb2QsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOwotICAgIGlmIChlcCA9PSBOVUxMKQorICAgIGl4ID0gKGtleXMtPmRrX2xvb2t1cCkoKFB5RGljdE9iamVjdCAqKW9kLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyLCBOVUxMKTsKKyAgICBpZiAoaXggPT0gREtJWF9FTVBUWSkgeworICAgICAgICByZXR1cm4ga2V5cy0+ZGtfbmVudHJpZXM7ICAvKiBpbmRleCBvZiBuZXcgZW50cnkgKi8KKyAgICB9CisgICAgaWYgKGl4IDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIC8qIFdlIHVzZSBwb2ludGVyIGFyaXRobWV0aWMgdG8gZ2V0IHRoZSBlbnRyeSdzIGluZGV4IGludG8gdGhlIHRhYmxlLiAqLwotICAgIHJldHVybiBlcCAtIGtleXMtPmRrX2VudHJpZXM7CisgICAgcmV0dXJuIGl4OwogfQogCiAvKiBSZXBsYWNlIG9kLT5vZF9mYXN0X25vZGVzIHdpdGggYSBuZXcgdGFibGUgbWF0Y2hpbmcgdGhlIHNpemUgb2YgZGljdCdzLiAqLwpAQCAtNTY1LDcgKzU2OCw3IEBACiAgICAgLyogQ29weSB0aGUgY3VycmVudCBub2RlcyBpbnRvIHRoZSB0YWJsZS4gKi8KICAgICBfb2RpY3RfRk9SRUFDSChvZCwgbm9kZSkgewogICAgICAgICBpID0gX29kaWN0X2dldF9pbmRleF9yYXcob2QsIF9vZGljdG5vZGVfS0VZKG5vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vZGljdG5vZGVfSEFTSChub2RlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb2RpY3Rub2RlX0hBU0gobm9kZSkpOwogICAgICAgICBpZiAoaSA8IDApIHsKICAgICAgICAgICAgIFB5TWVtX0ZSRUUoZmFzdF9ub2Rlcyk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0xNDI0LDE0ICsxNDI3LDEzIEBACiAgKiBPcmRlcmVkRGljdCBtZW1iZXJzCiAgKi8KIAotLyogdHBfbWVtYmVycyAqLworLyogdHBfZ2V0c2V0ICovCiAKLXN0YXRpYyBQeU1lbWJlckRlZiBvZGljdF9tZW1iZXJzW10gPSB7Ci0gICAgeyJfX2RpY3RfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeU9EaWN0T2JqZWN0LCBvZF9pbnN0X2RpY3QpLCBSRUFET05MWX0sCi0gICAgezB9CitzdGF0aWMgUHlHZXRTZXREZWYgb2RpY3RfZ2V0c2V0W10gPSB7CisgICAgeyJfX2RpY3RfXyIsIFB5T2JqZWN0X0dlbmVyaWNHZXREaWN0LCBQeU9iamVjdF9HZW5lcmljU2V0RGljdH0sCisgICAge05VTEx9CiB9OwogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE9yZGVyZWREaWN0IHR5cGUgc2xvdCBtZXRob2RzCiAgKi8KQEAgLTE0NjMsNyArMTQ2NSw3IEBACiAgICAgKyt0c3RhdGUtPnRyYXNoX2RlbGV0ZV9uZXN0aW5nOwogCiAgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQoc2VsZikKLX07Cit9CiAKIC8qIHRwX3JlcHIgKi8KIApAQCAtMTU0MCw3ICsxNTQyLDcgQEAKICAgICBQeV9YREVDUkVGKHBpZWNlcyk7CiAgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCAqKXNlbGYpOwogICAgIHJldHVybiByZXN1bHQ7Ci19OworfQogCiAvKiB0cF9kb2MgKi8KIApAQCAtMTYxMiw3ICsxNjE0LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBQeV9SRVRVUk5fTk9USU1QTEVNRU5URUQ7CiAgICAgfQotfTsKK30KIAogLyogdHBfaXRlciAqLwogCkBAIC0xNjIwLDcgKzE2MjIsNyBAQAogb2RpY3RfaXRlcihQeU9EaWN0T2JqZWN0ICpvZCkKIHsKICAgICByZXR1cm4gb2RpY3RpdGVyX25ldyhvZCwgX29kaWN0X0lURVJfS0VZUyk7Ci19OworfQogCiAvKiB0cF9pbml0ICovCiAKQEAgLTE2NDYsMjcgKzE2NDgsMTkgQEAKICAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLX07Cit9CiAKIC8qIHRwX25ldyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogb2RpY3RfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIFB5T2JqZWN0ICpkaWN0OwogICAgIFB5T0RpY3RPYmplY3QgKm9kOwogCi0gICAgZGljdCA9IFB5RGljdF9OZXcoKTsKLSAgICBpZiAoZGljdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQogICAgIG9kID0gKFB5T0RpY3RPYmplY3QgKilQeURpY3RfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0gICAgaWYgKG9kID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgIGlmIChvZCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICBvZC0+b2RfaW5zdF9kaWN0ID0gZGljdDsKICAgICAvKiB0eXBlIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSBtZW1vcnkgd2l0aCB6ZXJvcyAoc2VlCiAgICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYygpKSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgdGhlbSB0byB6ZXJvIGFnYWluICovCiAgICAgaWYgKF9vZGljdF9yZXNpemUob2QpIDwgMCkgewpAQCAtMTcwOCw4ICsxNzAyLDggQEAKICAgICAoZ2V0aXRlcmZ1bmMpb2RpY3RfaXRlciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgb2RpY3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCi0gICAgb2RpY3RfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBvZGljdF9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogICAgICZQeURpY3RfVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCkBAIC0xNzI5LDcgKzE3MjMsNyBAQAogUHlPYmplY3QgKgogUHlPRGljdF9OZXcodm9pZCkgewogICAgIHJldHVybiBvZGljdF9uZXcoJlB5T0RpY3RfVHlwZSwgTlVMTCwgTlVMTCk7Ci19OworfQogCiBzdGF0aWMgaW50CiBfUHlPRGljdF9TZXRJdGVtX0tub3duSGFzaChQeU9iamVjdCAqb2QsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSwKQEAgLTE3NDcsNyArMTc0MSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlczsKLX07Cit9CiAKIGludAogUHlPRGljdF9TZXRJdGVtKFB5T2JqZWN0ICpvZCwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZhbHVlKQpAQCAtMTc1Niw3ICsxNzUwLDcgQEAKICAgICBpZiAoaGFzaCA9PSAtMSkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIHJldHVybiBfUHlPRGljdF9TZXRJdGVtX0tub3duSGFzaChvZCwga2V5LCB2YWx1ZSwgaGFzaCk7Ci19OworfQogCiBpbnQKIFB5T0RpY3RfRGVsSXRlbShQeU9iamVjdCAqb2QsIFB5T2JqZWN0ICprZXkpCkBAIC0xNzY5LDcgKzE3NjMsNyBAQAogICAgIGlmIChyZXMgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgcmV0dXJuIF9QeURpY3RfRGVsSXRlbV9Lbm93bkhhc2gob2QsIGtleSwgaGFzaCk7Ci19OworfQogCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIzNjIsOCArMjM1Niw3IEBACiAgICAgICAgIFB5T2JqZWN0ICpvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7ICAvKiBib3Jyb3dlZCByZWZlcmVuY2UgKi8KICAgICAgICAgYXNzZXJ0KG90aGVyICE9IE5VTEwpOwogICAgICAgICBQeV9JTkNSRUYob3RoZXIpOwotICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpIHx8Ci0gICAgICAgICAgICBfUHlPYmplY3RfSGFzQXR0cklkKG90aGVyLCAmUHlJZF9pdGVtcykpIHsgIC8qIG5ldmVyIGZhaWxzICovCisgICAgICAgIGlmIFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqaXRlbXM7CiAgICAgICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKQogICAgICAgICAgICAgICAgIGl0ZW1zID0gUHlEaWN0X0l0ZW1zKG90aGVyKTsKQEAgLTI0MDYsNiArMjM5OSwyMCBAQAogICAgICAgICAgICAgaWYgKHJlcyAhPSAwIHx8IFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoX1B5T2JqZWN0X0hhc0F0dHJJZChvdGhlciwgJlB5SWRfaXRlbXMpKSB7ICAvKiBuZXZlciBmYWlscyAqLworICAgICAgICAgICAgUHlPYmplY3QgKml0ZW1zOworICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkKKyAgICAgICAgICAgICAgICBpdGVtcyA9IFB5RGljdF9JdGVtcyhvdGhlcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaXRlbXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKG90aGVyLCAmUHlJZF9pdGVtcywgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYob3RoZXIpOworICAgICAgICAgICAgaWYgKGl0ZW1zID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXMgPSBtdXRhYmxlbWFwcGluZ19hZGRfcGFpcnMoc2VsZiwgaXRlbXMpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW1zKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICByZXMgPSBtdXRhYmxlbWFwcGluZ19hZGRfcGFpcnMoc2VsZiwgb3RoZXIpOwogICAgICAgICAgICAgUHlfREVDUkVGKG90aGVyKTsKZGlmZiAtLWdpdCBhL09iamVjdHMvcmFuZ2VvYmplY3QuYyBiL09iamVjdHMvcmFuZ2VvYmplY3QuYwppbmRleCAwZTllYjIwLi44ZTc0MTMyIDEwMDY0NAotLS0gYS9PYmplY3RzL3Jhbmdlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9yYW5nZW9iamVjdC5jCkBAIC02LDcgKzYsNyBAQAogLyogU3VwcG9ydCBvYmplY3RzIHdob3NlIGxlbmd0aCBpcyA+IFBZX1NTSVpFX1RfTUFYLgogCiAgICBUaGlzIGNvdWxkIGJlIHNwZWQgdXAgZm9yIHNtYWxsIFB5TG9uZ3MgaWYgdGhleSBmaXQgaW4gYSBQeV9zc2l6ZV90LgotICAgVGhpcyBvbmx5IG1hdHRlcnMgb24gV2luNjQuICBUaG91Z2ggd2UgY291bGQgdXNlIFBZX0xPTkdfTE9ORyB3aGljaAorICAgVGhpcyBvbmx5IG1hdHRlcnMgb24gV2luNjQuICBUaG91Z2ggd2UgY291bGQgdXNlIGxvbmcgbG9uZyB3aGljaAogICAgd291bGQgcHJlc3VtYWJseSBoZWxwIHBlcmYuCiAqLwogCkBAIC0yOSwxNyArMjksMTAgQEAKICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygxKTsKIAogICAgIHN0ZXAgPSBQeU51bWJlcl9JbmRleChzdGVwKTsKLSAgICBpZiAoc3RlcCkgewotICAgICAgICBQeV9zc2l6ZV90IGlzdGVwID0gUHlOdW1iZXJfQXNTc2l6ZV90KHN0ZXAsIE5VTEwpOwotICAgICAgICBpZiAoaXN0ZXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgLyogSWdub3JlIE92ZXJmbG93RXJyb3IsIHdlIGtub3cgdGhlIHZhbHVlIGlzbid0IDAuICovCi0gICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGlzdGVwID09IDApIHsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZSgpIGFyZyAzIG11c3Qgbm90IGJlIHplcm8iKTsKLSAgICAgICAgICAgIFB5X0NMRUFSKHN0ZXApOwotICAgICAgICB9CisgICAgaWYgKHN0ZXAgJiYgX1B5TG9uZ19TaWduKHN0ZXApID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2UoKSBhcmcgMyBtdXN0IG5vdCBiZSB6ZXJvIik7CisgICAgICAgIFB5X0NMRUFSKHN0ZXApOwogICAgIH0KIAogICAgIHJldHVybiBzdGVwOwpAQCAtMTI5LDkgKzEyMiw5IEBACiAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKikgb2JqOwogCiAgICAgLyogRmFpbGVkIHRvIGNyZWF0ZSBvYmplY3QsIHJlbGVhc2UgYXR0cmlidXRlcyAqLwotICAgIFB5X1hERUNSRUYoc3RhcnQpOwotICAgIFB5X1hERUNSRUYoc3RvcCk7Ci0gICAgUHlfWERFQ1JFRihzdGVwKTsKKyAgICBQeV9ERUNSRUYoc3RhcnQpOworICAgIFB5X0RFQ1JFRihzdG9wKTsKKyAgICBQeV9ERUNSRUYoc3RlcCk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTE5Niw3ICsxODksNyBAQAogICAgIC8qIGlmIChsbyA+PSBoaSksIHJldHVybiBsZW5ndGggb2YgMC4gKi8KICAgICBjbXBfcmVzdWx0ID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGxvLCBoaSwgUHlfR0UpOwogICAgIGlmIChjbXBfcmVzdWx0ICE9IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdGVwKTsKKyAgICAgICAgUHlfREVDUkVGKHN0ZXApOwogICAgICAgICBpZiAoY21wX3Jlc3VsdCA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwKTsKQEAgLTIyNSw5ICsyMTgsOSBAQAogICAgIHJldHVybiByZXN1bHQ7CiAKICAgRmFpbDoKKyAgICBQeV9ERUNSRUYoc3RlcCk7CiAgICAgUHlfWERFQ1JFRih0bXAyKTsKICAgICBQeV9YREVDUkVGKGRpZmYpOwotICAgIFB5X1hERUNSRUYoc3RlcCk7CiAgICAgUHlfWERFQ1JFRih0bXAxKTsKICAgICBQeV9YREVDUkVGKG9uZSk7CiAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9PYmplY3RzL3NldG9iamVjdC5jIGIvT2JqZWN0cy9zZXRvYmplY3QuYwppbmRleCA0ZWY2OTJkLi42ZGQ0MDNmIDEwMDY0NAotLS0gYS9PYmplY3RzL3NldG9iamVjdC5jCisrKyBiL09iamVjdHMvc2V0b2JqZWN0LmMKQEAgLTI2LDcgKzI2LDYgQEAKIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgotI2luY2x1ZGUgInN0cmluZ2xpYi9lcS5oIgogCiAvKiBPYmplY3QgdXNlZCBhcyBkdW1teSBrZXkgdG8gZmlsbCBkZWxldGVkIGVudHJpZXMgKi8KIHN0YXRpYyBQeU9iamVjdCBfZHVtbXlfc3RydWN0OwpAQCAtNDgsMTkgKzQ3LDIwIEBACiBzdGF0aWMgc2V0ZW50cnkgKgogc2V0X2xvb2trZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKIHsKLSAgICBzZXRlbnRyeSAqdGFibGUgPSBzby0+dGFibGU7Ci0gICAgc2V0ZW50cnkgKmZyZWVzbG90ID0gTlVMTDsKKyAgICBzZXRlbnRyeSAqdGFibGU7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwotICAgIHNpemVfdCBwZXJ0dXJiID0gaGFzaDsKKyAgICBzaXplX3QgcGVydHVyYjsKICAgICBzaXplX3QgbWFzayA9IHNvLT5tYXNrOwogICAgIHNpemVfdCBpID0gKHNpemVfdCloYXNoICYgbWFzazsgLyogVW5zaWduZWQgZm9yIGRlZmluZWQgb3ZlcmZsb3cgYmVoYXZpb3IgKi8KICAgICBzaXplX3QgajsKICAgICBpbnQgY21wOwogCi0gICAgZW50cnkgPSAmdGFibGVbaV07CisgICAgZW50cnkgPSAmc28tPnRhYmxlW2ldOwogICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBlbnRyeTsKIAorICAgIHBlcnR1cmIgPSBoYXNoOworCiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IGhhc2gpIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpzdGFydGtleSA9IGVudHJ5LT5rZXk7CkBAIC03MCw4ICs3MCw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHN0YXJ0a2V5KQogICAgICAgICAgICAgICAgICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkKLSAgICAgICAgICAgICAgICAmJiB1bmljb2RlX2VxKHN0YXJ0a2V5LCBrZXkpKQorICAgICAgICAgICAgICAgICYmIF9QeVVuaWNvZGVfRVEoc3RhcnRrZXksIGtleSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICAgICAgdGFibGUgPSBzby0+dGFibGU7CiAgICAgICAgICAgICBQeV9JTkNSRUYoc3RhcnRrZXkpOwogICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHN0YXJ0a2V5LCBrZXksIFB5X0VRKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFydGtleSk7CkBAIC04MywxNCArODQsMTIgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICBtYXNrID0gc28tPm1hc2s7ICAgICAgICAgICAgICAgICAvKiBoZWxwIGF2b2lkIGEgcmVnaXN0ZXIgc3BpbGwgKi8KICAgICAgICAgfQotICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gLTEgJiYgZnJlZXNsb3QgPT0gTlVMTCkKLSAgICAgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CiAKICAgICAgICAgaWYgKGkgKyBMSU5FQVJfUFJPQkVTIDw9IG1hc2spIHsKICAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTElORUFSX1BST0JFUyA7IGorKykgewogICAgICAgICAgICAgICAgIGVudHJ5Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZF9udWxsOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSAwICYmIGVudHJ5LT5rZXkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdGFydGtleSA9IGVudHJ5LT5rZXk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydChzdGFydGtleSAhPSBkdW1teSk7CkBAIC05OCw4ICs5Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdGFydGtleSkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHVuaWNvZGVfZXEoc3RhcnRrZXksIGtleSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBfUHlVbmljb2RlX0VRKHN0YXJ0a2V5LCBrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHNvLT50YWJsZTsKICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKICAgICAgICAgICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHN0YXJ0a2V5LCBrZXksIFB5X0VRKTsKICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKQEAgLTExMSw3ICsxMTEsMTA0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBzby0+bWFzazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IC0xICYmIGZyZWVzbG90ID09IE5VTEwpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUOworICAgICAgICBpID0gKGkgKiA1ICsgMSArIHBlcnR1cmIpICYgbWFzazsKKworICAgICAgICBlbnRyeSA9ICZzby0+dGFibGVbaV07CisgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHNldF90YWJsZV9yZXNpemUoUHlTZXRPYmplY3QgKiwgUHlfc3NpemVfdCk7CisKK3N0YXRpYyBpbnQKK3NldF9hZGRfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKK3sKKyAgICBzZXRlbnRyeSAqdGFibGU7CisgICAgc2V0ZW50cnkgKmZyZWVzbG90OworICAgIHNldGVudHJ5ICplbnRyeTsKKyAgICBzaXplX3QgcGVydHVyYjsKKyAgICBzaXplX3QgbWFzazsKKyAgICBzaXplX3QgaTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuc2lnbmVkIGZvciBkZWZpbmVkIG92ZXJmbG93IGJlaGF2aW9yICovCisgICAgc2l6ZV90IGo7CisgICAgaW50IGNtcDsKKworICAgIC8qIFByZS1pbmNyZW1lbnQgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgYXJiaXRyYXJ5IGNvZGUgaW4gdGhlIHJpY2gKKyAgICAgICBjb21wYXJpc29uIGZyb20gZGVhbGxvY2F0aW5nIHRoZSBrZXkganVzdCBiZWZvcmUgdGhlIGluc2VydGlvbi4gKi8KKyAgICBQeV9JTkNSRUYoa2V5KTsKKworICByZXN0YXJ0OgorCisgICAgbWFzayA9IHNvLT5tYXNrOworICAgIGkgPSAoc2l6ZV90KWhhc2ggJiBtYXNrOworCisgICAgZW50cnkgPSAmc28tPnRhYmxlW2ldOworICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgIGdvdG8gZm91bmRfdW51c2VkOworCisgICAgZnJlZXNsb3QgPSBOVUxMOworICAgIHBlcnR1cmIgPSBoYXNoOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IGhhc2gpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzdGFydGtleSA9IGVudHJ5LT5rZXk7CisgICAgICAgICAgICAvKiBzdGFydGtleSBjYW5ub3QgYmUgYSBkdW1teSBiZWNhdXNlIHRoZSBkdW1teSBoYXNoIGZpZWxkIGlzIC0xICovCisgICAgICAgICAgICBhc3NlcnQoc3RhcnRrZXkgIT0gZHVtbXkpOworICAgICAgICAgICAgaWYgKHN0YXJ0a2V5ID09IGtleSkKKyAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2FjdGl2ZTsKKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdGFydGtleSkKKyAgICAgICAgICAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpCisgICAgICAgICAgICAgICAgJiYgX1B5VW5pY29kZV9FUShzdGFydGtleSwga2V5KSkKKyAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2FjdGl2ZTsKKyAgICAgICAgICAgIHRhYmxlID0gc28tPnRhYmxlOworICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcnRrZXkpOworICAgICAgICAgICAgaWYgKGNtcCA+IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGlrZWx5ICovCisgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGNvbXBhcmlzb25fZXJyb3I7CisgICAgICAgICAgICAvKiBDb250aW51aW5nIHRoZSBzZWFyY2ggZnJvbSB0aGUgY3VycmVudCBlbnRyeSBvbmx5IG1ha2VzCisgICAgICAgICAgICAgICBzZW5zZSBpZiB0aGUgdGFibGUgYW5kIGVudHJ5IGFyZSB1bmNoYW5nZWQ7IG90aGVyd2lzZSwKKyAgICAgICAgICAgICAgIHdlIGhhdmUgdG8gcmVzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KKyAgICAgICAgICAgIGlmICh0YWJsZSAhPSBzby0+dGFibGUgfHwgZW50cnktPmtleSAhPSBzdGFydGtleSkKKyAgICAgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgICAgICBtYXNrID0gc28tPm1hc2s7ICAgICAgICAgICAgICAgICAvKiBoZWxwIGF2b2lkIGEgcmVnaXN0ZXIgc3BpbGwgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlbnRyeS0+aGFzaCA9PSAtMSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgZnJlZXNsb3QgPSBlbnRyeTsKKworICAgICAgICBpZiAoaSArIExJTkVBUl9QUk9CRVMgPD0gbWFzaykgeworICAgICAgICAgICAgZm9yIChqID0gMCA7IGogPCBMSU5FQVJfUFJPQkVTIDsgaisrKSB7CisgICAgICAgICAgICAgICAgZW50cnkrKzsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gMCAmJiBlbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfdW51c2VkX29yX2R1bW15OworICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdGFydGtleSA9IGVudHJ5LT5rZXk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChzdGFydGtleSAhPSBkdW1teSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGtleSA9PSBrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2FjdGl2ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHN0YXJ0a2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgX1B5VW5pY29kZV9FUShzdGFydGtleSwga2V5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfYWN0aXZlOworICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHNvLT50YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHN0YXJ0a2V5LCBrZXksIFB5X0VRKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2FjdGl2ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNvbXBhcmlzb25fZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZSAhPSBzby0+dGFibGUgfHwgZW50cnktPmtleSAhPSBzdGFydGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgbWFzayA9IHNvLT5tYXNrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyeS0+aGFzaCA9PSAtMSAmJiBmcmVlc2xvdCA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBmcmVlc2xvdCA9IGVudHJ5OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTksMjkgKzIxNiw1MSBAQAogICAgICAgICBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUOwogICAgICAgICBpID0gKGkgKiA1ICsgMSArIHBlcnR1cmIpICYgbWFzazsKIAotICAgICAgICBlbnRyeSA9ICZ0YWJsZVtpXTsKKyAgICAgICAgZW50cnkgPSAmc28tPnRhYmxlW2ldOwogICAgICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQotICAgICAgICAgICAgZ290byBmb3VuZF9udWxsOworICAgICAgICAgICAgZ290byBmb3VuZF91bnVzZWRfb3JfZHVtbXk7CiAgICAgfQotICBmb3VuZF9udWxsOgotICAgIHJldHVybiBmcmVlc2xvdCA9PSBOVUxMID8gZW50cnkgOiBmcmVlc2xvdDsKKworICBmb3VuZF91bnVzZWRfb3JfZHVtbXk6CisgICAgaWYgKGZyZWVzbG90ID09IE5VTEwpCisgICAgICAgIGdvdG8gZm91bmRfdW51c2VkOworICAgIHNvLT51c2VkKys7CisgICAgZnJlZXNsb3QtPmtleSA9IGtleTsKKyAgICBmcmVlc2xvdC0+aGFzaCA9IGhhc2g7CisgICAgcmV0dXJuIDA7CisKKyAgZm91bmRfdW51c2VkOgorICAgIHNvLT5maWxsKys7CisgICAgc28tPnVzZWQrKzsKKyAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgIGVudHJ5LT5oYXNoID0gaGFzaDsKKyAgICBpZiAoKHNpemVfdClzby0+ZmlsbCozIDwgbWFzayoyKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc2V0X3RhYmxlX3Jlc2l6ZShzbywgc28tPnVzZWQpOworCisgIGZvdW5kX2FjdGl2ZToKKyAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICByZXR1cm4gMDsKKworICBjb21wYXJpc29uX2Vycm9yOgorICAgIFB5X0RFQ1JFRihrZXkpOworICAgIHJldHVybiAtMTsKIH0KIAogLyoKIEludGVybmFsIHJvdXRpbmUgdXNlZCBieSBzZXRfdGFibGVfcmVzaXplKCkgdG8gaW5zZXJ0IGFuIGl0ZW0gd2hpY2ggaXMKIGtub3duIHRvIGJlIGFic2VudCBmcm9tIHRoZSBzZXQuICBUaGlzIHJvdXRpbmUgYWxzbyBhc3N1bWVzIHRoYXQKIHRoZSBzZXQgY29udGFpbnMgbm8gZGVsZXRlZCBlbnRyaWVzLiAgQmVzaWRlcyB0aGUgcGVyZm9ybWFuY2UgYmVuZWZpdCwKLXVzaW5nIHNldF9pbnNlcnRfY2xlYW4oKSBpbiBzZXRfdGFibGVfcmVzaXplKCkgaXMgZGFuZ2Vyb3VzIChTRiBidWcgIzE0NTYyMDkpLgotTm90ZSB0aGF0IG5vIHJlZmNvdW50cyBhcmUgY2hhbmdlZCBieSB0aGlzIHJvdXRpbmU7IGlmIG5lZWRlZCwgdGhlIGNhbGxlcgotaXMgcmVzcG9uc2libGUgZm9yIGluY3JlZidpbmcgYGtleWAuCit0aGVyZSBpcyBhbHNvIHNhZmV0eSBiZW5lZml0IHNpbmNlIHVzaW5nIHNldF9hZGRfZW50cnkoKSByaXNrcyBtYWtpbmcKK2EgY2FsbGJhY2sgaW4gdGhlIG1pZGRsZSBvZiBhIHNldF90YWJsZV9yZXNpemUoKSwgc2VlIGlzc3VlIDE0NTYyMDkuCitUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyB0aGUga2V5J3MgcmVmZXJlbmNlIGNvdW50IGFuZAordGhlIHNldG9iamVjdCdzIGZpbGwgYW5kIHVzZWQgZmllbGRzLgogKi8KIHN0YXRpYyB2b2lkCi1zZXRfaW5zZXJ0X2NsZWFuKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCitzZXRfaW5zZXJ0X2NsZWFuKHNldGVudHJ5ICp0YWJsZSwgc2l6ZV90IG1hc2ssIFB5T2JqZWN0ICprZXksIFB5X2hhc2hfdCBoYXNoKQogewotICAgIHNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKICAgICBzZXRlbnRyeSAqZW50cnk7CiAgICAgc2l6ZV90IHBlcnR1cmIgPSBoYXNoOwotICAgIHNpemVfdCBtYXNrID0gKHNpemVfdClzby0+bWFzazsKICAgICBzaXplX3QgaSA9IChzaXplX3QpaGFzaCAmIG1hc2s7CiAgICAgc2l6ZV90IGo7CiAKQEAgLTE2Miw0NSArMjgxLDExIEBACiAgIGZvdW5kX251bGw6CiAgICAgZW50cnktPmtleSA9IGtleTsKICAgICBlbnRyeS0+aGFzaCA9IGhhc2g7Ci0gICAgc28tPmZpbGwrKzsKLSAgICBzby0+dXNlZCsrOwogfQogCiAvKiA9PT09PT09PSBFbmQgbG9naWMgZm9yIHByb2JpbmcgdGhlIGhhc2ggdGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0KLS8qCi1JbnRlcm5hbCByb3V0aW5lIHRvIGluc2VydCBhIG5ldyBrZXkgaW50byB0aGUgdGFibGUuCi1Vc2VkIGJ5IHRoZSBwdWJsaWMgaW5zZXJ0IHJvdXRpbmUuCi1FYXRzIGEgcmVmZXJlbmNlIHRvIGtleS4KLSovCi1zdGF0aWMgaW50Ci1zZXRfaW5zZXJ0X2tleShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIFB5X2hhc2hfdCBoYXNoKQotewotICAgIHNldGVudHJ5ICplbnRyeTsKLQotICAgIGVudHJ5ID0gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7Ci0gICAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIFVOVVNFRCAqLwotICAgICAgICBlbnRyeS0+a2V5ID0ga2V5OwotICAgICAgICBlbnRyeS0+aGFzaCA9IGhhc2g7Ci0gICAgICAgIHNvLT5maWxsKys7Ci0gICAgICAgIHNvLT51c2VkKys7Ci0gICAgfSBlbHNlIGlmIChlbnRyeS0+a2V5ID09IGR1bW15KSB7Ci0gICAgICAgIC8qIERVTU1ZICovCi0gICAgICAgIGVudHJ5LT5rZXkgPSBrZXk7Ci0gICAgICAgIGVudHJ5LT5oYXNoID0gaGFzaDsKLSAgICAgICAgc28tPnVzZWQrKzsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBBQ1RJVkUgKi8KLSAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCiAvKgogUmVzdHJ1Y3R1cmUgdGhlIHRhYmxlIGJ5IGFsbG9jYXRpbmcgYSBuZXcgdGFibGUgYW5kIHJlaW5zZXJ0aW5nIGFsbAoga2V5cyBhZ2Fpbi4gIFdoZW4gZW50cmllcyBoYXZlIGJlZW4gZGVsZXRlZCwgdGhlIG5ldyB0YWJsZSBtYXkKQEAgLTIxMywxMCArMjk4LDEzIEBACiAgICAgc2V0ZW50cnkgKm9sZHRhYmxlLCAqbmV3dGFibGUsICplbnRyeTsKICAgICBQeV9zc2l6ZV90IG9sZGZpbGwgPSBzby0+ZmlsbDsKICAgICBQeV9zc2l6ZV90IG9sZHVzZWQgPSBzby0+dXNlZDsKKyAgICBQeV9zc2l6ZV90IG9sZG1hc2sgPSBzby0+bWFzazsKKyAgICBzaXplX3QgbmV3bWFzazsKICAgICBpbnQgaXNfb2xkdGFibGVfbWFsbG9jZWQ7CiAgICAgc2V0ZW50cnkgc21hbGxfY29weVtQeVNldF9NSU5TSVpFXTsKIAogICAgIGFzc2VydChtaW51c2VkID49IDApOworICAgIG1pbnVzZWQgPSAobWludXNlZCA+IDUwMDAwKSA/IG1pbnVzZWQgKiAyIDogbWludXNlZCAqIDQ7CiAKICAgICAvKiBGaW5kIHRoZSBzbWFsbGVzdCB0YWJsZSBzaXplID4gbWludXNlZC4gKi8KICAgICAvKiBYWFggc3BlZWQtdXAgd2l0aCBpbnRyaW5zaWNzICovCkBAIC0yNjQsMjUgKzM1MiwyNCBAQAogICAgIC8qIE1ha2UgdGhlIHNldCBlbXB0eSwgdXNpbmcgdGhlIG5ldyB0YWJsZS4gKi8KICAgICBhc3NlcnQobmV3dGFibGUgIT0gb2xkdGFibGUpOwogICAgIG1lbXNldChuZXd0YWJsZSwgMCwgc2l6ZW9mKHNldGVudHJ5KSAqIG5ld3NpemUpOwotICAgIHNvLT5maWxsID0gMDsKLSAgICBzby0+dXNlZCA9IDA7CisgICAgc28tPmZpbGwgPSBvbGR1c2VkOworICAgIHNvLT51c2VkID0gb2xkdXNlZDsKICAgICBzby0+bWFzayA9IG5ld3NpemUgLSAxOwogICAgIHNvLT50YWJsZSA9IG5ld3RhYmxlOwogCiAgICAgLyogQ29weSB0aGUgZGF0YSBvdmVyOyB0aGlzIGlzIHJlZmNvdW50LW5ldXRyYWwgZm9yIGFjdGl2ZSBlbnRyaWVzOwogICAgICAgIGR1bW15IGVudHJpZXMgYXJlbid0IGNvcGllZCBvdmVyLCBvZiBjb3Vyc2UgKi8KKyAgICBuZXdtYXNrID0gKHNpemVfdClzby0+bWFzazsKICAgICBpZiAob2xkZmlsbCA9PSBvbGR1c2VkKSB7Ci0gICAgICAgIGZvciAoZW50cnkgPSBvbGR0YWJsZTsgb2xkdXNlZCA+IDA7IGVudHJ5KyspIHsKKyAgICAgICAgZm9yIChlbnRyeSA9IG9sZHRhYmxlOyBlbnRyeSA8PSBvbGR0YWJsZSArIG9sZG1hc2s7IGVudHJ5KyspIHsKICAgICAgICAgICAgIGlmIChlbnRyeS0+a2V5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBvbGR1c2VkLS07Ci0gICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgICAgICAgICAgICAgIHNldF9pbnNlcnRfY2xlYW4obmV3dGFibGUsIG5ld21hc2ssIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoZW50cnkgPSBvbGR0YWJsZTsgb2xkdXNlZCA+IDA7IGVudHJ5KyspIHsKKyAgICAgICAgZm9yIChlbnRyeSA9IG9sZHRhYmxlOyBlbnRyeSA8PSBvbGR0YWJsZSArIG9sZG1hc2s7IGVudHJ5KyspIHsKICAgICAgICAgICAgIGlmIChlbnRyeS0+a2V5ICE9IE5VTEwgJiYgZW50cnktPmtleSAhPSBkdW1teSkgewotICAgICAgICAgICAgICAgIG9sZHVzZWQtLTsKLSAgICAgICAgICAgICAgICBzZXRfaW5zZXJ0X2NsZWFuKHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CisgICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihuZXd0YWJsZSwgbmV3bWFzaywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjkyLDU3ICszNzksMzAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLyogQ0FVVElPTjogc2V0X2FkZF9rZXkvZW50cnkoKSBtdXN0IGd1YXJhbnRlZSBpdCB3b24ndCByZXNpemUgdGhlIHRhYmxlICovCi0KIHN0YXRpYyBpbnQKLXNldF9hZGRfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBzZXRlbnRyeSAqZW50cnkpCitzZXRfY29udGFpbnNfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKIHsKLSAgICBQeV9zc2l6ZV90IG5fdXNlZDsKLSAgICBQeU9iamVjdCAqa2V5ID0gZW50cnktPmtleTsKLSAgICBQeV9oYXNoX3QgaGFzaCA9IGVudHJ5LT5oYXNoOworICAgIHNldGVudHJ5ICplbnRyeTsKIAotICAgIGFzc2VydChzby0+ZmlsbCA8PSBzby0+bWFzayk7ICAvKiBhdCBsZWFzdCBvbmUgZW1wdHkgc2xvdCAqLwotICAgIG5fdXNlZCA9IHNvLT51c2VkOwotICAgIFB5X0lOQ1JFRihrZXkpOwotICAgIGlmIChzZXRfaW5zZXJ0X2tleShzbywga2V5LCBoYXNoKSkgewotICAgICAgICBQeV9ERUNSRUYoa2V5KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoIShzby0+dXNlZCA+IG5fdXNlZCAmJiBzby0+ZmlsbCozID49IChzby0+bWFzaysxKSoyKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkPjUwMDAwID8gc28tPnVzZWQqMiA6IHNvLT51c2VkKjQpOwotfQotCi1zdGF0aWMgaW50Ci1zZXRfYWRkX2tleShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCi17Ci0gICAgc2V0ZW50cnkgZW50cnk7Ci0gICAgUHlfaGFzaF90IGhhc2g7Ci0KLSAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkgfHwKLSAgICAgICAgKGhhc2ggPSAoKFB5QVNDSUlPYmplY3QgKikga2V5KS0+aGFzaCkgPT0gLTEpIHsKLSAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLSAgICAgICAgaWYgKGhhc2ggPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGVudHJ5LmtleSA9IGtleTsKLSAgICBlbnRyeS5oYXNoID0gaGFzaDsKLSAgICByZXR1cm4gc2V0X2FkZF9lbnRyeShzbywgJmVudHJ5KTsKKyAgICBlbnRyeSA9IHNldF9sb29ra2V5KHNvLCBrZXksIGhhc2gpOworICAgIGlmIChlbnRyeSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gZW50cnktPmtleSAhPSBOVUxMOworICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBESVNDQVJEX05PVEZPVU5EIDAKICNkZWZpbmUgRElTQ0FSRF9GT1VORCAxCiAKIHN0YXRpYyBpbnQKLXNldF9kaXNjYXJkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKm9sZGVudHJ5KQorc2V0X2Rpc2NhcmRfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKIHsKICAgICBzZXRlbnRyeSAqZW50cnk7CiAgICAgUHlPYmplY3QgKm9sZF9rZXk7CiAKLSAgICBlbnRyeSA9IHNldF9sb29ra2V5KHNvLCBvbGRlbnRyeS0+a2V5LCBvbGRlbnRyeS0+aGFzaCk7CisgICAgZW50cnkgPSBzZXRfbG9va2tleShzbywga2V5LCBoYXNoKTsKICAgICBpZiAoZW50cnkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwgIHx8ICBlbnRyeS0+a2V5ID09IGR1bW15KQorICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBESVNDQVJEX05PVEZPVU5EOwogICAgIG9sZF9rZXkgPSBlbnRyeS0+a2V5OwogICAgIGVudHJ5LT5rZXkgPSBkdW1teTsKQEAgLTM1MywyMiArNDEzLDQ1IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNldF9kaXNjYXJkX2tleShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCitzZXRfYWRkX2tleShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCiB7Ci0gICAgc2V0ZW50cnkgZW50cnk7CiAgICAgUHlfaGFzaF90IGhhc2g7CiAKLSAgICBhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7Ci0KICAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkgfHwKICAgICAgICAgKGhhc2ggPSAoKFB5QVNDSUlPYmplY3QgKikga2V5KS0+aGFzaCkgPT0gLTEpIHsKICAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKICAgICAgICAgaWYgKGhhc2ggPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGVudHJ5LmtleSA9IGtleTsKLSAgICBlbnRyeS5oYXNoID0gaGFzaDsKLSAgICByZXR1cm4gc2V0X2Rpc2NhcmRfZW50cnkoc28sICZlbnRyeSk7CisgICAgcmV0dXJuIHNldF9hZGRfZW50cnkoc28sIGtleSwgaGFzaCk7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9jb250YWluc19rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQoreworICAgIFB5X2hhc2hfdCBoYXNoOworCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBrZXksIGhhc2gpOworfQorCitzdGF0aWMgaW50CitzZXRfZGlzY2FyZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQoreworICAgIFB5X2hhc2hfdCBoYXNoOworCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc2V0X2Rpc2NhcmRfZW50cnkoc28sIGtleSwgaGFzaCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC00NDksMjAgKzUzMiwyMiBAQAogewogICAgIFB5X3NzaXplX3QgaTsKICAgICBQeV9zc2l6ZV90IG1hc2s7Ci0gICAgc2V0ZW50cnkgKnRhYmxlOworICAgIHNldGVudHJ5ICplbnRyeTsKIAogICAgIGFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKICAgICBpID0gKnBvc19wdHI7CiAgICAgYXNzZXJ0KGkgPj0gMCk7Ci0gICAgdGFibGUgPSBzby0+dGFibGU7CiAgICAgbWFzayA9IHNvLT5tYXNrOwotICAgIHdoaWxlIChpIDw9IG1hc2sgJiYgKHRhYmxlW2ldLmtleSA9PSBOVUxMIHx8IHRhYmxlW2ldLmtleSA9PSBkdW1teSkpCisgICAgZW50cnkgPSAmc28tPnRhYmxlW2ldOworICAgIHdoaWxlIChpIDw9IG1hc2sgJiYgKGVudHJ5LT5rZXkgPT0gTlVMTCB8fCBlbnRyeS0+a2V5ID09IGR1bW15KSkgewogICAgICAgICBpKys7CisgICAgICAgIGVudHJ5Kys7CisgICAgfQogICAgICpwb3NfcHRyID0gaSsxOwogICAgIGlmIChpID4gbWFzaykKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgYXNzZXJ0KHRhYmxlW2ldLmtleSAhPSBOVUxMKTsKLSAgICAqZW50cnlfcHRyID0gJnRhYmxlW2ldOworICAgIGFzc2VydChlbnRyeSAhPSBOVUxMKTsKKyAgICAqZW50cnlfcHRyID0gZW50cnk7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTU2MCw4ICs2NDUsOCBAQAogICAgICAqIGluY3JlbWVudGFsbHkgcmVzaXppbmcgYXMgd2UgaW5zZXJ0IG5ldyBrZXlzLiAgRXhwZWN0CiAgICAgICogdGhhdCB0aGVyZSB3aWxsIGJlIG5vIChvciBmZXcpIG92ZXJsYXBwaW5nIGtleXMuCiAgICAgICovCi0gICAgaWYgKChzby0+ZmlsbCArIG90aGVyLT51c2VkKSozID49IChzby0+bWFzaysxKSoyKSB7Ci0gICAgICAgaWYgKHNldF90YWJsZV9yZXNpemUoc28sIChzby0+dXNlZCArIG90aGVyLT51c2VkKSoyKSAhPSAwKQorICAgIGlmICgoc28tPmZpbGwgKyBvdGhlci0+dXNlZCkqMyA+PSBzby0+bWFzayoyKSB7CisgICAgICAgaWYgKHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkICsgb3RoZXItPnVzZWQpICE9IDApCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgc29fZW50cnkgPSBzby0+dGFibGU7CkBAIC01ODYsMTEgKzY3MSwxNSBAQAogCiAgICAgLyogSWYgb3VyIHRhYmxlIGlzIGVtcHR5LCB3ZSBjYW4gdXNlIHNldF9pbnNlcnRfY2xlYW4oKSAqLwogICAgIGlmIChzby0+ZmlsbCA9PSAwKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPD0gb3RoZXItPm1hc2s7IGkrKywgb3RoZXJfZW50cnkrKykgeworICAgICAgICBzZXRlbnRyeSAqbmV3dGFibGUgPSBzby0+dGFibGU7CisgICAgICAgIHNpemVfdCBuZXdtYXNrID0gKHNpemVfdClzby0+bWFzazsKKyAgICAgICAgc28tPmZpbGwgPSBvdGhlci0+dXNlZDsKKyAgICAgICAgc28tPnVzZWQgPSBvdGhlci0+dXNlZDsKKyAgICAgICAgZm9yIChpID0gb3RoZXItPm1hc2sgKyAxOyBpID4gMCA7IGktLSwgb3RoZXJfZW50cnkrKykgewogICAgICAgICAgICAga2V5ID0gb3RoZXJfZW50cnktPmtleTsKICAgICAgICAgICAgIGlmIChrZXkgIT0gTlVMTCAmJiBrZXkgIT0gZHVtbXkpIHsKICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKLSAgICAgICAgICAgICAgICBzZXRfaW5zZXJ0X2NsZWFuKHNvLCBrZXksIG90aGVyX2VudHJ5LT5oYXNoKTsKKyAgICAgICAgICAgICAgICBzZXRfaW5zZXJ0X2NsZWFuKG5ld3RhYmxlLCBuZXdtYXNrLCBrZXksIG90aGVyX2VudHJ5LT5oYXNoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKQEAgLTYwMSw0NiArNjkwLDEzIEBACiAgICAgICAgIG90aGVyX2VudHJ5ID0gJm90aGVyLT50YWJsZVtpXTsKICAgICAgICAga2V5ID0gb3RoZXJfZW50cnktPmtleTsKICAgICAgICAgaWYgKGtleSAhPSBOVUxMICYmIGtleSAhPSBkdW1teSkgewotICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7Ci0gICAgICAgICAgICBpZiAoc2V0X2luc2VydF9rZXkoc28sIGtleSwgb3RoZXJfZW50cnktPmhhc2gpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShzbywga2V5LCBvdGhlcl9lbnRyeS0+aGFzaCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1zZXRfY29udGFpbnNfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBzZXRlbnRyeSAqZW50cnkpCi17Ci0gICAgUHlPYmplY3QgKmtleTsKLSAgICBzZXRlbnRyeSAqbHVfZW50cnk7Ci0KLSAgICBsdV9lbnRyeSA9IHNldF9sb29ra2V5KHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7Ci0gICAgaWYgKGx1X2VudHJ5ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBrZXkgPSBsdV9lbnRyeS0+a2V5OwotICAgIHJldHVybiBrZXkgIT0gTlVMTCAmJiBrZXkgIT0gZHVtbXk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNldF9jb250YWluc19rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQotewotICAgIHNldGVudHJ5IGVudHJ5OwotICAgIFB5X2hhc2hfdCBoYXNoOwotCi0gICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8Ci0gICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7Ci0gICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0gICAgICAgIGlmIChoYXNoID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgZW50cnkuaGFzaCA9IGhhc2g7Ci0gICAgcmV0dXJuIHNldF9jb250YWluc19lbnRyeShzbywgJmVudHJ5KTsKLX0KLQogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9wb3AoUHlTZXRPYmplY3QgKnNvKQogewpAQCAtNjgyLDQzICs3MzgsNjQgQEAKICAgICByZXR1cm4gMDsKIH0KIAorLyogV29yayB0byBpbmNyZWFzZSB0aGUgYml0IGRpc3BlcnNpb24gZm9yIGNsb3NlbHkgc3BhY2VkIGhhc2ggdmFsdWVzLgorICAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHVzZSBjYXNlcyBoYXZlIG1hbnkgY29tYmluYXRpb25zIG9mIGEKKyAgIHNtYWxsIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIG5lYXJieSBoYXNoZXMgc28gdGhhdCBtYW55IGRpc3RpbmN0CisgICBjb21iaW5hdGlvbnMgY29sbGFwc2UgdG8gb25seSBhIGhhbmRmdWwgb2YgZGlzdGluY3QgaGFzaCB2YWx1ZXMuICovCisKK3N0YXRpYyBQeV91aGFzaF90Citfc2h1ZmZsZV9iaXRzKFB5X3VoYXNoX3QgaCkKK3sKKyAgICByZXR1cm4gKChoIF4gODk4Njk3NDdVTCkgXiAoaCA8PCAxNikpICogMzY0NDc5ODE2N1VMOworfQorCisvKiBNb3N0IG9mIHRoZSBjb25zdGFudHMgaW4gdGhpcyBoYXNoIGFsZ29yaXRobSBhcmUgcmFuZG9tbHkgY2hvc2VuCisgICBsYXJnZSBwcmltZXMgd2l0aCAiaW50ZXJlc3RpbmcgYml0IHBhdHRlcm5zIiBhbmQgdGhhdCBwYXNzZWQgdGVzdHMKKyAgIGZvciBnb29kIGNvbGxpc2lvbiBzdGF0aXN0aWNzIG9uIGEgdmFyaWV0eSBvZiBwcm9ibGVtYXRpYyBkYXRhc2V0cworICAgaW5jbHVkaW5nIHBvd2Vyc2V0cyBhbmQgZ3JhcGggc3RydWN0dXJlcyAoc3VjaCBhcyBEYXZpZCBFcHBzdGVpbidzCisgICBncmFwaCByZWNpcGVzIGluIExpYi90ZXN0L3Rlc3Rfc2V0LnB5KSAqLworCiBzdGF0aWMgUHlfaGFzaF90CiBmcm96ZW5zZXRfaGFzaChQeU9iamVjdCAqc2VsZikKIHsKLSAgICAvKiBNb3N0IG9mIHRoZSBjb25zdGFudHMgaW4gdGhpcyBoYXNoIGFsZ29yaXRobSBhcmUgcmFuZG9tbHkgY2hvb3NlbgotICAgICAgIGxhcmdlIHByaW1lcyB3aXRoICJpbnRlcmVzdGluZyBiaXQgcGF0dGVybnMiIGFuZCB0aGF0IHBhc3NlZAotICAgICAgIHRlc3RzIGZvciBnb29kIGNvbGxpc2lvbiBzdGF0aXN0aWNzIG9uIGEgdmFyaWV0eSBvZiBwcm9ibGVtYXRpYwotICAgICAgIGRhdGFzZXRzIHN1Y2ggYXM6Ci0KLSAgICAgICAgICBwcyA9IFtdCi0gICAgICAgICAgZm9yIHIgaW4gcmFuZ2UoMjEpOgotICAgICAgICAgICAgICBwcyArPSBpdGVydG9vbHMuY29tYmluYXRpb25zKHJhbmdlKDIwKSwgcikKLSAgICAgICAgICBudW1fZGlzdGluY3RfaGFzaGVzID0gbGVuKHtoYXNoKGZyb3plbnNldChzKSkgZm9yIHMgaW4gcHN9KQotCi0gICAgKi8KICAgICBQeVNldE9iamVjdCAqc28gPSAoUHlTZXRPYmplY3QgKilzZWxmOwotICAgIFB5X3VoYXNoX3QgaCwgaGFzaCA9IDE5Mjc4NjgyMzdVTDsKKyAgICBQeV91aGFzaF90IGhhc2ggPSAwOwogICAgIHNldGVudHJ5ICplbnRyeTsKLSAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAKICAgICBpZiAoc28tPmhhc2ggIT0gLTEpCiAgICAgICAgIHJldHVybiBzby0+aGFzaDsKIAotICAgIGhhc2ggKj0gKFB5X3VoYXNoX3QpUHlTZXRfR0VUX1NJWkUoc2VsZikgKyAxOwotICAgIHdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgewotICAgICAgICAvKiBXb3JrIHRvIGluY3JlYXNlIHRoZSBiaXQgZGlzcGVyc2lvbiBmb3IgY2xvc2VseSBzcGFjZWQgaGFzaAotICAgICAgICAgICB2YWx1ZXMuICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHNvbWUgdXNlIGNhc2VzIGhhdmUgbWFueQotICAgICAgICAgICBjb21iaW5hdGlvbnMgb2YgYSBzbWFsbCBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBuZWFyYnkKLSAgICAgICAgICAgaGFzaGVzIHNvIHRoYXQgbWFueSBkaXN0aW5jdCBjb21iaW5hdGlvbnMgY29sbGFwc2UgdG8gb25seQotICAgICAgICAgICBhIGhhbmRmdWwgb2YgZGlzdGluY3QgaGFzaCB2YWx1ZXMuICovCi0gICAgICAgIGggPSBlbnRyeS0+aGFzaDsKLSAgICAgICAgaGFzaCBePSAoKGggXiA4OTg2OTc0N1VMKSBeIChoIDw8IDE2KSkgKiAzNjQ0Nzk4MTY3VUw7Ci0gICAgfQotICAgIC8qIE1ha2UgdGhlIGZpbmFsIHJlc3VsdCBzcHJlYWQtb3V0IGluIGEgZGlmZmVyZW50IHBhdHRlcm4KLSAgICAgICB0aGFuIHRoZSBhbGdvcml0aG0gZm9yIHR1cGxlcyBvciBvdGhlciBweXRob24gb2JqZWN0cy4gKi8KKyAgICAvKiBYb3ItaW4gc2h1ZmZsZWQgYml0cyBmcm9tIGV2ZXJ5IGVudHJ5J3MgaGFzaCBmaWVsZCBiZWNhdXNlIHhvciBpcworICAgICAgIGNvbW11dGF0aXZlIGFuZCBhIGZyb3plbnNldCBoYXNoIHNob3VsZCBiZSBpbmRlcGVuZGVudCBvZiBvcmRlci4KKworICAgICAgIEZvciBzcGVlZCwgaW5jbHVkZSBudWxsIGVudHJpZXMgYW5kIGR1bW15IGVudHJpZXMgYW5kIHRoZW4KKyAgICAgICBzdWJ0cmFjdCBvdXQgdGhlaXIgZWZmZWN0IGFmdGVyd2FyZHMgc28gdGhhdCB0aGUgZmluYWwgaGFzaAorICAgICAgIGRlcGVuZHMgb25seSBvbiBhY3RpdmUgZW50cmllcy4gIFRoaXMgYWxsb3dzIHRoZSBjb2RlIHRvIGJlCisgICAgICAgdmVjdG9yaXplZCBieSB0aGUgY29tcGlsZXIgYW5kIGl0IHNhdmVzIHRoZSB1bnByZWRpY3RhYmxlCisgICAgICAgYnJhbmNoZXMgdGhhdCB3b3VsZCBhcmlzZSB3aGVuIHRyeWluZyB0byBleGNsdWRlIG51bGwgYW5kIGR1bW15CisgICAgICAgZW50cmllcyBvbiBldmVyeSBpdGVyYXRpb24uICovCisKKyAgICBmb3IgKGVudHJ5ID0gc28tPnRhYmxlOyBlbnRyeSA8PSAmc28tPnRhYmxlW3NvLT5tYXNrXTsgZW50cnkrKykKKyAgICAgICAgaGFzaCBePSBfc2h1ZmZsZV9iaXRzKGVudHJ5LT5oYXNoKTsKKworICAgIC8qIFJlbW92ZSB0aGUgZWZmZWN0IG9mIGFuIG9kZCBudW1iZXIgb2YgTlVMTCBlbnRyaWVzICovCisgICAgaWYgKChzby0+bWFzayArIDEgLSBzby0+ZmlsbCkgJiAxKQorICAgICAgICBoYXNoIF49IF9zaHVmZmxlX2JpdHMoMCk7CisKKyAgICAvKiBSZW1vdmUgdGhlIGVmZmVjdCBvZiBhbiBvZGQgbnVtYmVyIG9mIGR1bW15IGVudHJpZXMgKi8KKyAgICBpZiAoKHNvLT5maWxsIC0gc28tPnVzZWQpICYgMSkKKyAgICAgICAgaGFzaCBePSBfc2h1ZmZsZV9iaXRzKC0xKTsKKworICAgIC8qIEZhY3RvciBpbiB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBlbnRyaWVzICovCisgICAgaGFzaCBePSAoKFB5X3VoYXNoX3QpUHlTZXRfR0VUX1NJWkUoc2VsZikgKyAxKSAqIDE5Mjc4NjgyMzdVTDsKKworICAgIC8qIERpc3BlcnNlIHBhdHRlcm5zIGFyaXNpbmcgaW4gbmVzdGVkIGZyb3plbnNldHMgKi8KICAgICBoYXNoID0gaGFzaCAqIDY5MDY5VSArIDkwNzEzMzkyM1VMOworCisgICAgLyogLTEgaXMgcmVzZXJ2ZWQgYXMgYW4gZXJyb3IgY29kZSAqLwogICAgIGlmIChoYXNoID09IChQeV91aGFzaF90KS0xKQogICAgICAgICBoYXNoID0gNTkwOTIzNzEzVUw7CisKICAgICBzby0+aGFzaCA9IGhhc2g7CiAgICAgcmV0dXJuIGhhc2g7CiB9CkBAIC04NjUsNyArOTQyLDcgQEAKICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAvKiB0cF9mbGFncyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgKHRyYXZlcnNlcHJvYylzZXRpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KQEAgLTkxMCwxOCArOTg3LDE0IEBACiAgICAgICAgICogaW5jcmVtZW50YWxseSByZXNpemluZyBhcyB3ZSBpbnNlcnQgbmV3IGtleXMuICBFeHBlY3QKICAgICAgICAgKiB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gKG9yIGZldykgb3ZlcmxhcHBpbmcga2V5cy4KICAgICAgICAgKi8KLSAgICAgICAgaWYgKGRpY3RzaXplID09IC0xKQorICAgICAgICBpZiAoZGljdHNpemUgPCAwKQogICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoKHNvLT5maWxsICsgZGljdHNpemUpKjMgPj0gKHNvLT5tYXNrKzEpKjIpIHsKLSAgICAgICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCAoc28tPnVzZWQgKyBkaWN0c2l6ZSkqMikgIT0gMCkKKyAgICAgICAgaWYgKChzby0+ZmlsbCArIGRpY3RzaXplKSozID49IHNvLT5tYXNrKjIpIHsKKyAgICAgICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZCArIGRpY3RzaXplKSAhPSAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICB3aGlsZSAoX1B5RGljdF9OZXh0KG90aGVyLCAmcG9zLCAma2V5LCAmdmFsdWUsICZoYXNoKSkgewotICAgICAgICAgICAgc2V0ZW50cnkgYW5fZW50cnk7Ci0KLSAgICAgICAgICAgIGFuX2VudHJ5Lmhhc2ggPSBoYXNoOwotICAgICAgICAgICAgYW5fZW50cnkua2V5ID0ga2V5OwotICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sICZhbl9lbnRyeSkpCisgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShzbywga2V5LCBoYXNoKSkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CkBAIC05NzAsOSArMTA0Myw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWFrZV9uZXdfc2V0KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKml0ZXJhYmxlKQogewotICAgIFB5U2V0T2JqZWN0ICpzbyA9IE5VTEw7CisgICAgUHlTZXRPYmplY3QgKnNvOwogCi0gICAgLyogY3JlYXRlIFB5U2V0T2JqZWN0IHN0cnVjdHVyZSAqLwogICAgIHNvID0gKFB5U2V0T2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CiAgICAgaWYgKHNvID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTAxNSw3ICsxMDg3LDggQEAKIHsKICAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMLCAqcmVzdWx0OwogCi0gICAgaWYgKHR5cGUgPT0gJlB5RnJvemVuU2V0X1R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJmcm96ZW5zZXQoKSIsIGt3ZHMpKQorICAgIGlmIChrd2RzICE9IE5VTEwgJiYgdHlwZSA9PSAmUHlGcm96ZW5TZXRfVHlwZQorICAgICAgICAmJiAhX1B5QXJnX05vS2V5d29yZHMoImZyb3plbnNldCgpIiwga3dkcykpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCB0eXBlLT50cF9uYW1lLCAwLCAxLCAmaXRlcmFibGUpKQpAQCAtMTA0MiwyNCArMTExNSw5IEBACiAgICAgcmV0dXJuIGVtcHR5ZnJvemVuc2V0OwogfQogCi1pbnQKLVB5U2V0X0NsZWFyRnJlZUxpc3Qodm9pZCkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZAotUHlTZXRfRmluaSh2b2lkKQotewotICAgIFB5X0NMRUFSKGVtcHR5ZnJvemVuc2V0KTsKLX0KLQogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0gICAgaWYgKHR5cGUgPT0gJlB5U2V0X1R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJzZXQoKSIsIGt3ZHMpKQotICAgICAgICByZXR1cm4gTlVMTDsKLQogICAgIHJldHVybiBtYWtlX25ld19zZXQodHlwZSwgTlVMTCk7CiB9CiAKQEAgLTEyMDEsNiArMTI1OSw4IEBACiB7CiAgICAgUHlTZXRPYmplY3QgKnJlc3VsdDsKICAgICBQeU9iamVjdCAqa2V5LCAqaXQsICp0bXA7CisgICAgUHlfaGFzaF90IGhhc2g7CisgICAgaW50IHJ2OwogCiAgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQogICAgICAgICByZXR1cm4gc2V0X2NvcHkoc28pOwpAQCAtMTIyMCwxMyArMTI4MCwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5KTsKLSAgICAgICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgICAgIGhhc2ggPSBlbnRyeS0+aGFzaDsKKyAgICAgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBrZXksIGhhc2gpOworICAgICAgICAgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJ2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkocmVzdWx0LCBlbnRyeSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsIGtleSwgaGFzaCkpIHsKICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KQEAgLTEyNDIsMzIgKzEzMDQsMTUgQEAKICAgICB9CiAKICAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICBpbnQgcnY7Ci0gICAgICAgIHNldGVudHJ5IGVudHJ5OwotICAgICAgICBQeV9oYXNoX3QgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQotICAgICAgICBpZiAoaGFzaCA9PSAtMSkgewotICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbnRyeS5oYXNoID0gaGFzaDsKLSAgICAgICAgZW50cnkua2V5ID0ga2V5OwotICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgJmVudHJ5KTsKLSAgICAgICAgaWYgKHJ2ID09IC0xKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGtleSwgaGFzaCk7CisgICAgICAgIGlmIChydiA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICBpZiAocnYpIHsKLSAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHJlc3VsdCwgJmVudHJ5KSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsIGtleSwgaGFzaCkpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICB9CkBAIC0xMjc3LDYgKzEzMjIsMTEgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgIGVycm9yOgorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMzYzLDYgKzE0MTMsNyBAQAogc2V0X2lzZGlzam9pbnQoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7CiAgICAgUHlPYmplY3QgKmtleSwgKml0LCAqdG1wOworICAgIGludCBydjsKIAogICAgIGlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikgewogICAgICAgICBpZiAoUHlTZXRfR0VUX1NJWkUoc28pID09IDApCkBAIC0xMzgxLDggKzE0MzIsOCBAQAogICAgICAgICAgICAgb3RoZXIgPSB0bXA7CiAgICAgICAgIH0KICAgICAgICAgd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5KTsKLSAgICAgICAgICAgIGlmIChydiA9PSAtMSkKKyAgICAgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CisgICAgICAgICAgICBpZiAocnYgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgaWYgKHJ2KQogICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKQEAgLTEzOTUsOCArMTQ0Niw2IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLSAgICAgICAgaW50IHJ2OwotICAgICAgICBzZXRlbnRyeSBlbnRyeTsKICAgICAgICAgUHlfaGFzaF90IGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CiAKICAgICAgICAgaWYgKGhhc2ggPT0gLTEpIHsKQEAgLTE0MDQsMTEgKzE0NTMsOSBAQAogICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGVudHJ5Lmhhc2ggPSBoYXNoOwotICAgICAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCAmZW50cnkpOworICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywga2V5LCBoYXNoKTsKICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTE0MzcsNyArMTQ4NCw3IEBACiAgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAogICAgICAgICB3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpCi0gICAgICAgICAgICBpZiAoc2V0X2Rpc2NhcmRfZW50cnkoc28sIGVudHJ5KSA9PSAtMSkKKyAgICAgICAgICAgIGlmIChzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgUHlPYmplY3QgKmtleSwgKml0OwpAQCAtMTQ0Niw3ICsxNDkzLDcgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHNldF9kaXNjYXJkX2tleShzbywga2V5KSA9PSAtMSkgeworICAgICAgICAgICAgaWYgKHNldF9kaXNjYXJkX2tleShzbywga2V5KSA8IDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTE0NTcsMTAgKzE1MDQsMTAgQEAKICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIC8qIElmIG1vcmUgdGhhbiAxLzUgYXJlIGR1bW1pZXMsIHRoZW4gcmVzaXplIHRoZW0gYXdheS4gKi8KLSAgICBpZiAoKHNvLT5maWxsIC0gc28tPnVzZWQpICogNSA8IHNvLT5tYXNrKQorICAgIC8qIElmIG1vcmUgdGhhbiAxLzR0aCBhcmUgZHVtbWllcywgdGhlbiByZXNpemUgdGhlbSBhd2F5LiAqLworICAgIGlmICgoc2l6ZV90KShzby0+ZmlsbCAtIHNvLT51c2VkKSA8PSAoc2l6ZV90KXNvLT5tYXNrIC8gNCkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkPjUwMDAwID8gc28tPnVzZWQqMiA6IHNvLT51c2VkKjQpOworICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNDg3LDcgKzE1MzQsNyBAQAogICAgIHJlc3VsdCA9IHNldF9jb3B5KHNvKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopIHJlc3VsdCwgb3RoZXIpICE9IC0xKQorICAgIGlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopIHJlc3VsdCwgb3RoZXIpID09IDApCiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC0xNDk3LDggKzE1NDQsMTEgQEAKIHNldF9kaWZmZXJlbmNlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmtleTsKKyAgICBQeV9oYXNoX3QgaGFzaDsKICAgICBzZXRlbnRyeSAqZW50cnk7CiAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIGludCBydjsKIAogICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpICAmJiAhUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7CiAgICAgICAgIHJldHVybiBzZXRfY29weV9hbmRfZGlmZmVyZW5jZShzbywgb3RoZXIpOwpAQCAtMTUxNiwxNyArMTU2NiwxNSBAQAogCiAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgewogICAgICAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKLSAgICAgICAgICAgIHNldGVudHJ5IGVudHJ5Y29weTsKLSAgICAgICAgICAgIGludCBydjsKLSAgICAgICAgICAgIGVudHJ5Y29weS5oYXNoID0gZW50cnktPmhhc2g7Ci0gICAgICAgICAgICBlbnRyeWNvcHkua2V5ID0gZW50cnktPmtleTsKLSAgICAgICAgICAgIHJ2ID0gX1B5RGljdF9Db250YWlucyhvdGhlciwgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgICAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgICAgIGhhc2ggPSBlbnRyeS0+aGFzaDsKKyAgICAgICAgICAgIHJ2ID0gX1B5RGljdF9Db250YWlucyhvdGhlciwga2V5LCBoYXNoKTsKICAgICAgICAgICAgIGlmIChydiA8IDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghcnYpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeSgoUHlTZXRPYmplY3QgKilyZXN1bHQsICZlbnRyeWNvcHkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBrZXksIGhhc2gpKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CkBAIC0xNTM3LDEzICsxNTg1LDE1IEBACiAKICAgICAvKiBJdGVyYXRlIG92ZXIgc28sIGNoZWNraW5nIGZvciBjb21tb24gZWxlbWVudHMgaW4gb3RoZXIuICovCiAgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOwotICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgaGFzaCA9IGVudHJ5LT5oYXNoOworICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwga2V5LCBoYXNoKTsKKyAgICAgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXJ2KSB7Ci0gICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeSgoUHlTZXRPYmplY3QgKilyZXN1bHQsIGVudHJ5KSkgeworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBrZXksIGhhc2gpKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CkBAIC0xNjA1LDI5ICsxNjU1LDI0IEBACiAgICAgUHlTZXRPYmplY3QgKm90aGVyc2V0OwogICAgIFB5T2JqZWN0ICprZXk7CiAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5X2hhc2hfdCBoYXNoOwogICAgIHNldGVudHJ5ICplbnRyeTsKKyAgICBpbnQgcnY7CiAKICAgICBpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCiAgICAgICAgIHJldHVybiBzZXRfY2xlYXIoc28pOwogCiAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgewogICAgICAgICBQeU9iamVjdCAqdmFsdWU7Ci0gICAgICAgIGludCBydjsKLSAgICAgICAgUHlfaGFzaF90IGhhc2g7CiAgICAgICAgIHdoaWxlIChfUHlEaWN0X05leHQob3RoZXIsICZwb3MsICZrZXksICZ2YWx1ZSwgJmhhc2gpKSB7Ci0gICAgICAgICAgICBzZXRlbnRyeSBhbl9lbnRyeTsKLQogICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7Ci0gICAgICAgICAgICBhbl9lbnRyeS5oYXNoID0gaGFzaDsKLSAgICAgICAgICAgIGFuX2VudHJ5LmtleSA9IGtleTsKLQotICAgICAgICAgICAgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywgJmFuX2VudHJ5KTsKLSAgICAgICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICAgICAgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywga2V5LCBoYXNoKTsKKyAgICAgICAgICAgIGlmIChydiA8IDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChydiA9PSBESVNDQVJEX05PVEZPVU5EKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sICZhbl9lbnRyeSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShzbywga2V5LCBoYXNoKSkgewogICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTY0NywxMyArMTY5MiwxNSBAQAogICAgIH0KIAogICAgIHdoaWxlIChzZXRfbmV4dChvdGhlcnNldCwgJnBvcywgJmVudHJ5KSkgewotICAgICAgICBpbnQgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnkpOwotICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgaGFzaCA9IGVudHJ5LT5oYXNoOworICAgICAgICBydiA9IHNldF9kaXNjYXJkX2VudHJ5KHNvLCBrZXksIGhhc2gpOworICAgICAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYob3RoZXJzZXQpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHJ2ID09IERJU0NBUkRfTk9URk9VTkQpIHsKLSAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCBlbnRyeSkpIHsKKyAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCBrZXksIGhhc2gpKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG90aGVyc2V0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KQEAgLTE3MTUsNiArMTc2Miw3IEBACiB7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwogICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBpbnQgcnY7CiAKICAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewogICAgICAgICBQeU9iamVjdCAqdG1wLCAqcmVzdWx0OwpAQCAtMTcyOSw4ICsxNzc3LDggQEAKICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogCiAgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOwotICAgICAgICBpZiAocnYgPT0gLTEpCisgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KChQeVNldE9iamVjdCAqKW90aGVyLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CisgICAgICAgIGlmIChydiA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgaWYgKCFydikKICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKQEAgLTE4MjEsNyArMTg2OSw3IEBACiAgICAgaW50IHJ2OwogCiAgICAgcnYgPSBzZXRfY29udGFpbnNfa2V5KHNvLCBrZXkpOwotICAgIGlmIChydiA9PSAtMSkgeworICAgIGlmIChydiA8IDApIHsKICAgICAgICAgaWYgKCFQeVNldF9DaGVjayhrZXkpIHx8ICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0xODQwLDcgKzE4ODgsNyBAQAogICAgIGxvbmcgcmVzdWx0OwogCiAgICAgcmVzdWx0ID0gc2V0X2NvbnRhaW5zKHNvLCBrZXkpOwotICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgaWYgKHJlc3VsdCA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KQEAgLTE4NTQsNyArMTkwMiw3IEBACiAgICAgaW50IHJ2OwogCiAgICAgcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIGtleSk7Ci0gICAgaWYgKHJ2ID09IC0xKSB7CisgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICBpZiAoIVB5U2V0X0NoZWNrKGtleSkgfHwgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBQeUVycl9DbGVhcigpOwpAQCAtMTg2Myw3ICsxOTExLDcgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBydiA9IHNldF9kaXNjYXJkX2tleShzbywgdG1wa2V5KTsKICAgICAgICAgUHlfREVDUkVGKHRtcGtleSk7Ci0gICAgICAgIGlmIChydiA9PSAtMSkKKyAgICAgICAgaWYgKHJ2IDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMTg4Niw3ICsxOTM0LDcgQEAKICAgICBpbnQgcnY7CiAKICAgICBydiA9IHNldF9kaXNjYXJkX2tleShzbywga2V5KTsKLSAgICBpZiAocnYgPT0gLTEpIHsKKyAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgIGlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0xODk1LDcgKzE5NDMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHJ2ID0gc2V0X2Rpc2NhcmRfa2V5KHNvLCB0bXBrZXkpOwogICAgICAgICBQeV9ERUNSRUYodG1wa2V5KTsKLSAgICAgICAgaWYgKHJ2ID09IC0xKQorICAgICAgICBpZiAocnYgPCAwKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X1JFVFVSTl9OT05FOwpAQCAtMTk0OSwxMyArMTk5NywxMiBAQAogewogICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNlbGYpKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKFB5U2V0X0NoZWNrKHNlbGYpICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic2V0KCkiLCBrd2RzKSkKKyAgICBpZiAoa3dkcyAhPSBOVUxMICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic2V0KCkiLCBrd2RzKSkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwgMCwgMSwgJml0ZXJhYmxlKSkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIHNldF9jbGVhcl9pbnRlcm5hbChzZWxmKTsKKyAgICBpZiAoc2VsZi0+ZmlsbCkKKyAgICAgICAgc2V0X2NsZWFyX2ludGVybmFsKHNlbGYpOwogICAgIHNlbGYtPmhhc2ggPSAtMTsKICAgICBpZiAoaXRlcmFibGUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMTIyLDcgKzIxNjksNyBAQAogICAgICBjb3B5X2RvY30sCiAgICAgeyJkaWZmZXJlbmNlIiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2RpZmZlcmVuY2VfbXVsdGksICAgICAgTUVUSF9WQVJBUkdTLAogICAgICBkaWZmZXJlbmNlX2RvY30sCi0gICAgeyJpbnRlcnNlY3Rpb24iLChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX211bHRpLCAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgIHsiaW50ZXJzZWN0aW9uIiwgICAgKFB5Q0Z1bmN0aW9uKXNldF9pbnRlcnNlY3Rpb25fbXVsdGksICAgIE1FVEhfVkFSQVJHUywKICAgICAgaW50ZXJzZWN0aW9uX2RvY30sCiAgICAgeyJpc2Rpc2pvaW50IiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2lzZGlzam9pbnQsICAgIE1FVEhfTywKICAgICAgaXNkaXNqb2ludF9kb2N9LApAQCAtMjE5Myw3ICsyMjQwLDcgQEAKICAgICAodHJhdmVyc2Vwcm9jKXNldF90cmF2ZXJzZSwgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIChpbnF1aXJ5KXNldF9jbGVhcl9pbnRlcm5hbCwgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgKHJpY2hjbXBmdW5jKXNldF9yaWNoY29tcGFyZSwgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLSAgICBvZmZzZXRvZihQeVNldE9iamVjdCwgd2Vha3JlZmxpc3QpLCAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgb2Zmc2V0b2YoUHlTZXRPYmplY3QsIHdlYWtyZWZsaXN0KSwgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAoZ2V0aXRlcmZ1bmMpc2V0X2l0ZXIsICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KICAgICBmcm96ZW5zZXRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCkBAIC0yMjc3LDYgKzIzMjQsMTggQEAKIH0KIAogaW50CitQeVNldF9DbGVhckZyZWVMaXN0KHZvaWQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK1B5U2V0X0Zpbmkodm9pZCkKK3sKKyAgICBQeV9DTEVBUihlbXB0eWZyb3plbnNldCk7Cit9CisKK2ludAogX1B5U2V0X05leHRFbnRyeShQeU9iamVjdCAqc2V0LCBQeV9zc2l6ZV90ICpwb3MsIFB5T2JqZWN0ICoqa2V5LCBQeV9oYXNoX3QgKmhhc2gpCiB7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvY29kZWNzLmggYi9PYmplY3RzL3N0cmluZ2xpYi9jb2RlY3MuaAppbmRleCAwZmM2YjU4Li5hOWQwYTM0IDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9jb2RlY3MuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9jb2RlY3MuaApAQCAtMSw2ICsxLDggQEAKIC8qIHN0cmluZ2xpYjogY29kZWMgaW1wbGVtZW50YXRpb25zICovCiAKLSNpZiBTVFJJTkdMSUJfSVNfVU5JQ09ERQorI2lmICFTVFJJTkdMSUJfSVNfVU5JQ09ERQorIyBlcnJvciAiY29kZWNzLmggaXMgc3BlY2lmaWMgdG8gVW5pY29kZSIKKyNlbmRpZgogCiAvKiBNYXNrIHRvIHF1aWNrbHkgY2hlY2sgd2hldGhlciBhIEMgJ2xvbmcnIGNvbnRhaW5zIGEKICAgIG5vbi1BU0NJSSwgVVRGOC1lbmNvZGVkIGNoYXIuICovCkBAIC0yNjMsNDkgKzI2NSwzMyBAQAogI2RlZmluZSBNQVhfU0hPUlRfVU5JQ0hBUlMgMzAwICAvKiBsYXJnZXN0IHNpemUgd2UnbGwgZG8gb24gdGhlIHN0YWNrICovCiAKICAgICBQeV9zc2l6ZV90IGk7ICAgICAgICAgICAgICAgIC8qIGluZGV4IGludG8gcyBvZiBuZXh0IGlucHV0IGJ5dGUgKi8KLSAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAgICAgIC8qIHJlc3VsdCBzdHJpbmcgb2JqZWN0ICovCiAgICAgY2hhciAqcDsgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGZyZWUgYnl0ZSBpbiBvdXRwdXQgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBuYWxsb2NhdGVkOyAgICAgIC8qIG51bWJlciBvZiByZXN1bHQgYnl0ZXMgYWxsb2NhdGVkICovCi0gICAgUHlfc3NpemVfdCBubmVlZGVkOyAgICAgICAgICAgIC8qIG51bWJlciBvZiByZXN1bHQgYnl0ZXMgbmVlZGVkICovCiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMQotICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICplcnJvcl9oYW5kbGVyX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJlcCA9IE5VTEw7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IF9QeV9FUlJPUl9VTktOT1dOOwogI2VuZGlmCiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID09IDEKICAgICBjb25zdCBQeV9zc2l6ZV90IG1heF9jaGFyX3NpemUgPSAyOwotICAgIGNoYXIgc3RhY2tidWZbTUFYX1NIT1JUX1VOSUNIQVJTICogMl07CiAjZWxpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gMgogICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4X2NoYXJfc2l6ZSA9IDM7Ci0gICAgY2hhciBzdGFja2J1ZltNQVhfU0hPUlRfVU5JQ0hBUlMgKiAzXTsKICNlbHNlIC8qICBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gNCAqLwogICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4X2NoYXJfc2l6ZSA9IDQ7Ci0gICAgY2hhciBzdGFja2J1ZltNQVhfU0hPUlRfVU5JQ0hBUlMgKiA0XTsKICNlbmRpZgorICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGFzc2VydChzaXplID49IDApOworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CiAKLSAgICBpZiAoc2l6ZSA8PSBNQVhfU0hPUlRfVU5JQ0hBUlMpIHsKLSAgICAgICAgLyogV3JpdGUgaW50byB0aGUgc3RhY2sgYnVmZmVyOyBuYWxsb2NhdGVkIGNhbid0IG92ZXJmbG93LgotICAgICAgICAgKiBBdCB0aGUgZW5kLCB3ZSdsbCBhbGxvY2F0ZSBleGFjdGx5IGFzIG11Y2ggaGVhcCBzcGFjZSBhcyBpdAotICAgICAgICAgKiB0dXJucyBvdXQgd2UgbmVlZC4KLSAgICAgICAgICovCi0gICAgICAgIG5hbGxvY2F0ZWQgPSBQeV9TQUZFX0RPV05DQVNUKHNpemVvZihzdGFja2J1ZiksIHNpemVfdCwgaW50KTsKLSAgICAgICAgcmVzdWx0ID0gTlVMTDsgICAvKiB3aWxsIGFsbG9jYXRlIGFmdGVyIHdlJ3JlIGRvbmUgKi8KLSAgICAgICAgcCA9IHN0YWNrYnVmOworICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLyBtYXhfY2hhcl9zaXplKSB7CisgICAgICAgIC8qIGludGVnZXIgb3ZlcmZsb3cgKi8KKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gbWF4X2NoYXJfc2l6ZSkgewotICAgICAgICAgICAgLyogaW50ZWdlciBvdmVyZmxvdyAqLwotICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogT3ZlcmFsbG9jYXRlIG9uIHRoZSBoZWFwLCBhbmQgZ2l2ZSB0aGUgZXhjZXNzIGJhY2sgYXQgdGhlIGVuZC4gKi8KLSAgICAgICAgbmFsbG9jYXRlZCA9IHNpemUgKiBtYXhfY2hhcl9zaXplOwotICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5hbGxvY2F0ZWQpOwotICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgcCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgfQorCisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHNpemUgKiBtYXhfY2hhcl9zaXplKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOykgewogICAgICAgICBQeV9VQ1M0IGNoID0gZGF0YVtpKytdOwpAQCAtMzI2LDcyICszMTIsMTE5IEBACiAgICAgICAgIH0KICNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxCiAgICAgICAgIGVsc2UgaWYgKFB5X1VOSUNPREVfSVNfU1VSUk9HQVRFKGNoKSkgewotICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdwb3M7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IHJlcHNpemUsIGssIHN0YXJ0cG9zOwotICAgICAgICAgICAgc3RhcnRwb3MgPSBpLTE7Ci0gICAgICAgICAgICByZXAgPSB1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcigKLSAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwgInV0Zi04IiwgInN1cnJvZ2F0ZXMgbm90IGFsbG93ZWQiLAotICAgICAgICAgICAgICAgICAgdW5pY29kZSwgJmV4Yywgc3RhcnRwb3MsIHN0YXJ0cG9zKzEsICZuZXdwb3MpOwotICAgICAgICAgICAgaWYgKCFyZXApCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLQotICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2socmVwKSkKLSAgICAgICAgICAgICAgICByZXBzaXplID0gUHlCeXRlc19HRVRfU0laRShyZXApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlcHNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXApOwotCi0gICAgICAgICAgICBpZiAocmVwc2l6ZSA+IG1heF9jaGFyX3NpemUpIHsKLSAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG9mZnNldDsKLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcCAtIHN0YWNrYnVmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcCAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsbG9jYXRlZCA+IFBZX1NTSVpFX1RfTUFYIC0gcmVwc2l6ZSArIG1heF9jaGFyX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogaW50ZWdlciBvdmVyZmxvdyAqLwotICAgICAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuYWxsb2NhdGVkICs9IHJlcHNpemUgLSBtYXhfY2hhcl9zaXplOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXN1bHQsIG5hbGxvY2F0ZWQpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuYWxsb2NhdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgUHlfTUVNQ1BZKFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCksIHN0YWNrYnVmLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KSArIG9mZnNldDsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIGVuZHBvcywgbmV3cG9zOworICAgICAgICAgICAgUHlfc3NpemVfdCBrOworICAgICAgICAgICAgaWYgKGVycm9yX2hhbmRsZXIgPT0gX1B5X0VSUk9SX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2socmVwKSkgewotICAgICAgICAgICAgICAgIGNoYXIgKnByZXAgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXApOwotICAgICAgICAgICAgICAgIGZvcihrID0gcmVwc2l6ZTsgayA+IDA7IGstLSkKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9ICpwcmVwKys7Ci0gICAgICAgICAgICB9IGVsc2UgLyogcmVwIGlzIHVuaWNvZGUgKi8gewotICAgICAgICAgICAgICAgIGVudW0gUHlVbmljb2RlX0tpbmQgcmVwa2luZDsKLSAgICAgICAgICAgICAgICB2b2lkICpyZXBkYXRhOworICAgICAgICAgICAgc3RhcnRwb3MgPSBpLTE7CisgICAgICAgICAgICBlbmRwb3MgPSBzdGFydHBvcysxOwogCi0gICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShyZXApIDwgMCkKKyAgICAgICAgICAgIHdoaWxlICgoZW5kcG9zIDwgc2l6ZSkgJiYgUHlfVU5JQ09ERV9JU19TVVJST0dBVEUoZGF0YVtlbmRwb3NdKSkKKyAgICAgICAgICAgICAgICBlbmRwb3MrKzsKKworICAgICAgICAgICAgLyogT25seSBvdmVyYWxsb2NhdGUgdGhlIGJ1ZmZlciBpZiBpdCdzIG5vdCB0aGUgbGFzdCB3cml0ZSAqLworICAgICAgICAgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IChlbmRwb3MgPCBzaXplKTsKKworICAgICAgICAgICAgc3dpdGNoIChlcnJvcl9oYW5kbGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfUkVQTEFDRToKKyAgICAgICAgICAgICAgICBtZW1zZXQocCwgJz8nLCBlbmRwb3MgLSBzdGFydHBvcyk7CisgICAgICAgICAgICAgICAgcCArPSAoZW5kcG9zIC0gc3RhcnRwb3MpOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0aGUgaWdub3JlIGhhbmRsZXIgKi8KKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX0lHTk9SRToKKyAgICAgICAgICAgICAgICBpICs9IChlbmRwb3MgLSBzdGFydHBvcyAtIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVQQVNTOgorICAgICAgICAgICAgICAgIGZvciAoaz1zdGFydHBvczsgazxlbmRwb3M7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBjaCA9IGRhdGFba107CisgICAgICAgICAgICAgICAgICAgICpwKysgPSAoY2hhcikoMHhlMCB8IChjaCA+PiAxMikpOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGNoYXIpKDB4ODAgfCAoKGNoID4+IDYpICYgMHgzZikpOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGNoYXIpKDB4ODAgfCAoY2ggJiAweDNmKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gKGVuZHBvcyAtIHN0YXJ0cG9zIC0gMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX0JBQ0tTTEFTSFJFUExBQ0U6CisgICAgICAgICAgICAgICAgLyogc3VidHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IG1heF9jaGFyX3NpemUgKiAoZW5kcG9zIC0gc3RhcnRwb3MpOworICAgICAgICAgICAgICAgIHAgPSBiYWNrc2xhc2hyZXBsYWNlKCZ3cml0ZXIsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgc3RhcnRwb3MsIGVuZHBvcyk7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICByZXBraW5kID0gUHlVbmljb2RlX0tJTkQocmVwKTsKLSAgICAgICAgICAgICAgICByZXBkYXRhID0gUHlVbmljb2RlX0RBVEEocmVwKTsKKyAgICAgICAgICAgICAgICBpICs9IChlbmRwb3MgLSBzdGFydHBvcyAtIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgZm9yKGs9MDsgazxyZXBzaXplOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfVUNTNCBjID0gUHlVbmljb2RlX1JFQUQocmVwa2luZCwgcmVwZGF0YSwgayk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgweDgwIDw9IGMpIHsKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1hNTENIQVJSRUZSRVBMQUNFOgorICAgICAgICAgICAgICAgIC8qIHN1YnRyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSBtYXhfY2hhcl9zaXplICogKGVuZHBvcyAtIHN0YXJ0cG9zKTsKKyAgICAgICAgICAgICAgICBwID0geG1sY2hhcnJlZnJlcGxhY2UoJndyaXRlciwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgc3RhcnRwb3MsIGVuZHBvcyk7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpICs9IChlbmRwb3MgLSBzdGFydHBvcyAtIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CisgICAgICAgICAgICAgICAgZm9yIChrPXN0YXJ0cG9zOyBrPGVuZHBvczsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gZGF0YVtrXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoMHhEQzgwIDw9IGNoICYmIGNoIDw9IDB4RENGRikpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IChjaGFyKShjaCAmIDB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoayA+PSBlbmRwb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgaSArPSAoZW5kcG9zIC0gc3RhcnRwb3MgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXJ0cG9zID0gazsKKyAgICAgICAgICAgICAgICBhc3NlcnQoc3RhcnRwb3MgPCBlbmRwb3MpOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0aGUgZGVmYXVsdCBoYW5kbGVyICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlcCA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKAorICAgICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9yX2hhbmRsZXJfb2JqLCAidXRmLTgiLCAic3Vycm9nYXRlcyBub3QgYWxsb3dlZCIsCisgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgJmV4Yywgc3RhcnRwb3MsIGVuZHBvcywgJm5ld3Bvcyk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgICAgICAgICAvKiBzdWJ0cmFjdCBwcmVhbGxvY2F0ZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gbWF4X2NoYXJfc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHJlcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcocmVwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShyZXApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJlcCBpcyB1bmljb2RlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRFkocmVwKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgICAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0lTX0FTQ0lJKHJlcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlX2VuY29kZV9leGNlcHRpb24oJmV4YywgInV0Zi04IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0xLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Vycm9nYXRlcyBub3QgYWxsb3dlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGNoYXIpYzsKKworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0tJTkQocmVwKSA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCk7CisgICAgICAgICAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKCZ3cml0ZXIsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9EQVRBKHJlcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHJlcCkpOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgUHlfQ0xFQVIocmVwKTsKKworICAgICAgICAgICAgICAgIGkgPSBuZXdwb3M7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeV9DTEVBUihyZXApOworCisgICAgICAgICAgICAvKiBJZiBvdmVyYWxsb2NhdGlvbiB3YXMgZGlzYWJsZWQsIGVuc3VyZSB0aGF0IGl0IHdhcyB0aGUgbGFzdAorICAgICAgICAgICAgICAgd3JpdGUuIE90aGVyd2lzZSwgd2UgbWlzc2VkIGFuIG9wdGltaXphdGlvbiAqLworICAgICAgICAgICAgYXNzZXJ0KHdyaXRlci5vdmVyYWxsb2NhdGUgfHwgaSA9PSBzaXplKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMgpAQCAtNDE2LDMxICs0NDksMTggQEAKICNlbmRpZiAvKiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxICovCiAgICAgfQogCi0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIFRoaXMgd2FzIHN0YWNrIGFsbG9jYXRlZC4gKi8KLSAgICAgICAgbm5lZWRlZCA9IHAgLSBzdGFja2J1ZjsKLSAgICAgICAgYXNzZXJ0KG5uZWVkZWQgPD0gbmFsbG9jYXRlZCk7Ci0gICAgICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoc3RhY2tidWYsIG5uZWVkZWQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogQ3V0IGJhY2sgdG8gc2l6ZSBhY3R1YWxseSBuZWVkZWQuICovCi0gICAgICAgIG5uZWVkZWQgPSBwIC0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0KG5uZWVkZWQgPD0gbmFsbG9jYXRlZCk7Ci0gICAgICAgIF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCBubmVlZGVkKTsKLSAgICB9Ci0KICNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxCi0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICNlbmRpZgotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBwKTsKIAogI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA+IDEKICBlcnJvcjoKICAgICBQeV9YREVDUkVGKHJlcCk7Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKLSAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgogCkBAIC04MDYsNSArODI2LDMgQEAKICN1bmRlZiBTV0FCNAogCiAjZW5kaWYKLQotI2VuZGlmIC8qIFNUUklOR0xJQl9JU19VTklDT0RFICovCmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9jdHlwZS5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvY3R5cGUuaAppbmRleCA3MzljZjNkLi5mMDU0NjI1IDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9jdHlwZS5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL2N0eXBlLmgKQEAgLTEsNSArMSw2IEBACi0vKiBOT1RFOiB0aGlzIEFQSSBpcyAtT05MWS0gZm9yIHVzZSB3aXRoIHNpbmdsZSBieXRlIGNoYXJhY3RlciBzdHJpbmdzLiAqLwotLyogRG8gbm90IHVzZSBpdCB3aXRoIFVuaWNvZGUuICovCisjaWYgU1RSSU5HTElCX0lTX1VOSUNPREUKKyMgZXJyb3IgImN0eXBlLmggb25seSBjb21wYXRpYmxlIHdpdGggYnl0ZS13aXNlIHN0cmluZ3MiCisjZW5kaWYKIAogI2luY2x1ZGUgImJ5dGVzX21ldGhvZHMuaCIKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvZmFzdHNlYXJjaC5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvZmFzdHNlYXJjaC5oCmluZGV4IGNkYTY4ZTcuLjk4MTY1YWQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL2Zhc3RzZWFyY2guaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9mYXN0c2VhcmNoLmgKQEAgLTMyLDUyICszMiw5OCBAQAogI2RlZmluZSBTVFJJTkdMSUJfQkxPT00obWFzaywgY2gpICAgICBcCiAgICAgKChtYXNrICYgICgxVUwgPDwgKChjaCkgJiAoU1RSSU5HTElCX0JMT09NX1dJRFRIIC0xKSkpKSkKIAorUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCitTVFJJTkdMSUIoZmluZF9jaGFyKShjb25zdCBTVFJJTkdMSUJfQ0hBUiogcywgUHlfc3NpemVfdCBuLCBTVFJJTkdMSUJfQ0hBUiBjaCkKK3sKKyAgICBjb25zdCBTVFJJTkdMSUJfQ0hBUiAqcCwgKmU7CisKKyAgICBwID0gczsKKyAgICBlID0gcyArIG47CisgICAgaWYgKG4gPiAxMCkgeworI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA9PSAxCisgICAgICAgIHAgPSBtZW1jaHIocywgY2gsIG4pOworICAgICAgICBpZiAocCAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIChwIC0gcyk7CisgICAgICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgICAgIC8qIHVzZSBtZW1jaHIgaWYgd2UgY2FuIGNob29zZSBhIG5lZWRsZSB3aXRob3V0IHR3byBtYW55IGxpa2VseQorICAgICAgICAgICBmYWxzZSBwb3NpdGl2ZXMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBuZWVkbGUgPSBjaCAmIDB4ZmY7CisgICAgICAgIC8qIElmIGxvb2tpbmcgZm9yIGEgbXVsdGlwbGUgb2YgMjU2LCB3ZSdkIGhhdmUgdG9vCisgICAgICAgICAgIG1hbnkgZmFsc2UgcG9zaXRpdmVzIGxvb2tpbmcgZm9yIHRoZSAnXDAnIGJ5dGUgaW4gVUNTMgorICAgICAgICAgICBhbmQgVUNTNCByZXByZXNlbnRhdGlvbnMuICovCisgICAgICAgIGlmIChuZWVkbGUgIT0gMCkgeworICAgICAgICAgICAgd2hpbGUgKHAgPCBlKSB7CisgICAgICAgICAgICAgICAgdm9pZCAqY2FuZGlkYXRlID0gbWVtY2hyKHAsIG5lZWRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgLSBwKSAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOworICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHAgPSAoY29uc3QgU1RSSU5HTElCX0NIQVIgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9BTElHTl9ET1dOKGNhbmRpZGF0ZSwgc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7CisgICAgICAgICAgICAgICAgaWYgKCpwID09IGNoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHAgLSBzKTsKKyAgICAgICAgICAgICAgICAvKiBGYWxzZSBwb3NpdGl2ZSAqLworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHdoaWxlIChwIDwgZSkgeworICAgICAgICBpZiAoKnAgPT0gY2gpCisgICAgICAgICAgICByZXR1cm4gKHAgLSBzKTsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CiAKIFB5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQotU1RSSU5HTElCKGZhc3RzZWFyY2hfbWVtY2hyXzFjaGFyKShjb25zdCBTVFJJTkdMSUJfQ0hBUiogcywgUHlfc3NpemVfdCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFJJTkdMSUJfQ0hBUiBjaCwgdW5zaWduZWQgY2hhciBuZWVkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKQorU1RSSU5HTElCKHJmaW5kX2NoYXIpKGNvbnN0IFNUUklOR0xJQl9DSEFSKiBzLCBQeV9zc2l6ZV90IG4sIFNUUklOR0xJQl9DSEFSIGNoKQogewotICAgIGlmIChtb2RlID09IEZBU1RfU0VBUkNIKSB7Ci0gICAgICAgIGNvbnN0IFNUUklOR0xJQl9DSEFSICpwdHIgPSBzOwotICAgICAgICBjb25zdCBTVFJJTkdMSUJfQ0hBUiAqZSA9IHMgKyBuOwotICAgICAgICB3aGlsZSAocHRyIDwgZSkgewotICAgICAgICAgICAgdm9pZCAqY2FuZGlkYXRlID0gbWVtY2hyKChjb25zdCB2b2lkICopIHB0ciwgbmVlZGxlLCAoZSAtIHB0cikgKiBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBwdHIgPSAoY29uc3QgU1RSSU5HTElCX0NIQVIgKikgX1B5X0FMSUdOX0RPV04oY2FuZGlkYXRlLCBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKLSAgICAgICAgICAgIGlmIChzaXplb2YoU1RSSU5HTElCX0NIQVIpID09IDEgfHwgKnB0ciA9PSBjaCkKLSAgICAgICAgICAgICAgICByZXR1cm4gKHB0ciAtIHMpOwotICAgICAgICAgICAgLyogRmFsc2UgcG9zaXRpdmUgKi8KLSAgICAgICAgICAgIHB0cisrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgY29uc3QgU1RSSU5HTElCX0NIQVIgKnA7CiAjaWZkZWYgSEFWRV9NRU1SQ0hSCiAgICAgLyogbWVtcmNocigpIGlzIGEgR05VIGV4dGVuc2lvbiwgYXZhaWxhYmxlIHNpbmNlIGdsaWJjIDIuMS45MS4KICAgICAgICBpdCBkb2Vzbid0IHNlZW0gYXMgb3B0aW1pemVkIGFzIG1lbWNocigpLCBidXQgaXMgc3RpbGwgcXVpdGUKLSAgICAgICBmYXN0ZXIgdGhhbiBvdXIgaGFuZC13cml0dGVuIGxvb3AgaW4gRkFTVFNFQVJDSCBiZWxvdyAqLwotICAgIGVsc2UgaWYgKG1vZGUgPT0gRkFTVF9SU0VBUkNIKSB7Ci0gICAgICAgIHdoaWxlIChuID4gMCkgewotICAgICAgICAgICAgY29uc3QgU1RSSU5HTElCX0NIQVIgKmZvdW5kOwotICAgICAgICAgICAgdm9pZCAqY2FuZGlkYXRlID0gbWVtcmNocigoY29uc3Qgdm9pZCAqKSBzLCBuZWVkbGUsIG4gKiBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBmb3VuZCA9IChjb25zdCBTVFJJTkdMSUJfQ0hBUiAqKSBfUHlfQUxJR05fRE9XTihjYW5kaWRhdGUsIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOwotICAgICAgICAgICAgbiA9IGZvdW5kIC0gczsKLSAgICAgICAgICAgIGlmIChzaXplb2YoU1RSSU5HTElCX0NIQVIpID09IDEgfHwgKmZvdW5kID09IGNoKQotICAgICAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICAgICAgLyogRmFsc2UgcG9zaXRpdmUgKi8KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotI2VuZGlmCi0gICAgZWxzZSB7Ci0gICAgICAgIGFzc2VydCgwKTsgLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlICovCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICAgICBmYXN0ZXIgdGhhbiBvdXIgaGFuZC13cml0dGVuIGxvb3AgYmVsb3cgKi8KIAotI3VuZGVmIERPX01FTUNIUgorICAgIGlmIChuID4gMTApIHsKKyNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gMQorICAgICAgICBwID0gbWVtcmNocihzLCBjaCwgbik7CisgICAgICAgIGlmIChwICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gKHAgLSBzKTsKKyAgICAgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICAgICAgLyogdXNlIG1lbXJjaHIgaWYgd2UgY2FuIGNob29zZSBhIG5lZWRsZSB3aXRob3V0IHR3byBtYW55IGxpa2VseQorICAgICAgICAgICBmYWxzZSBwb3NpdGl2ZXMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBuZWVkbGUgPSBjaCAmIDB4ZmY7CisgICAgICAgIC8qIElmIGxvb2tpbmcgZm9yIGEgbXVsdGlwbGUgb2YgMjU2LCB3ZSdkIGhhdmUgdG9vCisgICAgICAgICAgIG1hbnkgZmFsc2UgcG9zaXRpdmVzIGxvb2tpbmcgZm9yIHRoZSAnXDAnIGJ5dGUgaW4gVUNTMgorICAgICAgICAgICBhbmQgVUNTNCByZXByZXNlbnRhdGlvbnMuICovCisgICAgICAgIGlmIChuZWVkbGUgIT0gMCkgeworICAgICAgICAgICAgd2hpbGUgKG4gPiAwKSB7CisgICAgICAgICAgICAgICAgdm9pZCAqY2FuZGlkYXRlID0gbWVtcmNocihzLCBuZWVkbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICogc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7CisgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcCA9IChjb25zdCBTVFJJTkdMSUJfQ0hBUiAqKQorICAgICAgICAgICAgICAgICAgICAgICAgX1B5X0FMSUdOX0RPV04oY2FuZGlkYXRlLCBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKKyAgICAgICAgICAgICAgICBuID0gcCAtIHM7CisgICAgICAgICAgICAgICAgaWYgKCpwID09IGNoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgICAgICAvKiBGYWxzZSBwb3NpdGl2ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisjZW5kaWYgIC8qIEhBVkVfTUVNUkNIUiAqLworICAgIHAgPSBzICsgbjsKKyAgICB3aGlsZSAocCA+IHMpIHsKKyAgICAgICAgcC0tOworICAgICAgICBpZiAoKnAgPT0gY2gpCisgICAgICAgICAgICByZXR1cm4gKHAgLSBzKTsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKQEAgLTk5LDI1ICsxNDUsMTEgQEAKICAgICAgICAgaWYgKG0gPD0gMCkKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgLyogdXNlIHNwZWNpYWwgY2FzZSBmb3IgMS1jaGFyYWN0ZXIgc3RyaW5ncyAqLwotICAgICAgICBpZiAobiA+IDEwICYmIChtb2RlID09IEZBU1RfU0VBUkNICi0jaWZkZWYgSEFWRV9NRU1SQ0hSCi0gICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRkFTVF9SU0VBUkNICi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgKSkgewotICAgICAgICAgICAgLyogdXNlIG1lbWNociBpZiB3ZSBjYW4gY2hvb3NlIGEgbmVlZGxlIHdpdGhvdXQgdHdvIG1hbnkgbGlrZWx5Ci0gICAgICAgICAgICAgICBmYWxzZSBwb3NpdGl2ZXMgKi8KLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlOwotICAgICAgICAgICAgbmVlZGxlID0gcFswXSAmIDB4ZmY7Ci0jaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMQotICAgICAgICAgICAgLyogSWYgbG9va2luZyBmb3IgYSBtdWx0aXBsZSBvZiAyNTYsIHdlJ2QgaGF2ZSB0b28KLSAgICAgICAgICAgICAgIG1hbnkgZmFsc2UgcG9zaXRpdmVzIGxvb2tpbmcgZm9yIHRoZSAnXDAnIGJ5dGUgaW4gVUNTMgotICAgICAgICAgICAgICAgYW5kIFVDUzQgcmVwcmVzZW50YXRpb25zLiAqLwotICAgICAgICAgICAgaWYgKG5lZWRsZSAhPSAwKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgcmV0dXJuIFNUUklOR0xJQihmYXN0c2VhcmNoX21lbWNocl8xY2hhcikKLSAgICAgICAgICAgICAgICAgICAgICAgKHMsIG4sIHBbMF0sIG5lZWRsZSwgbW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGUgPT0gRkFTVF9DT1VOVCkgeworICAgICAgICBpZiAobW9kZSA9PSBGQVNUX1NFQVJDSCkKKyAgICAgICAgICAgIHJldHVybiBTVFJJTkdMSUIoZmluZF9jaGFyKShzLCBuLCBwWzBdKTsKKyAgICAgICAgZWxzZSBpZiAobW9kZSA9PSBGQVNUX1JTRUFSQ0gpCisgICAgICAgICAgICByZXR1cm4gU1RSSU5HTElCKHJmaW5kX2NoYXIpKHMsIG4sIHBbMF0pOworICAgICAgICBlbHNlIHsgIC8qIEZBU1RfQ09VTlQgKi8KICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgICAgICAgICAgaWYgKHNbaV0gPT0gcFswXSkgewogICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwpAQCAtMTI1LDE0ICsxNTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1heGNvdW50OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IEZBU1RfU0VBUkNIKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChzW2ldID09IHBbMF0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9IGVsc2UgeyAgICAvKiBGQVNUX1JTRUFSQ0ggKi8KLSAgICAgICAgICAgIGZvciAoaSA9IG4gLSAxOyBpID4gLTE7IGktLSkKLSAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PSBwWzBdKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvZmluZC5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvZmluZC5oCmluZGV4IDE0ODE1ZjYuLjUwOWI5MjkgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL2ZpbmQuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9maW5kLmgKQEAgLTExNyw4NSArMTE3LDMgQEAKIH0KIAogI3VuZGVmIEZPUk1BVF9CVUZGRVJfU0laRQotCi0jaWYgU1RSSU5HTElCX0lTX1VOSUNPREUKLQotLyoKLVdyYXBzIHN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCkgYW5kIGFkZGl0aW9uYWxseSBlbnN1cmVzIHRoYXQgdGhlCi1maXJzdCBhcmd1bWVudCBpcyBhIHVuaWNvZGUgb2JqZWN0LgotCi1Ob3RlIHRoYXQgd2UgcmVjZWl2ZSBhIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgb2YgdGhlIHN1YnN0cmluZyBvYmplY3QsCi1zbyB3aGVuIHdlIGNyZWF0ZSB0aGF0IG9iamVjdCBpbiB0aGlzIGZ1bmN0aW9uIHdlIGRvbid0IERFQ1JFRiBpdCwKLWJlY2F1c2UgaXQgY29udGludWVzIGxpdmluZyBpbiB0aGUgY2FsbGVyIGZ1bmN0aW9ucyAodGhvc2UgZnVuY3Rpb25zLAotYWZ0ZXIgZmluaXNoaW5nIHVzaW5nIHRoZSBzdWJzdHJpbmcsIG11c3QgREVDUkVGIGl0KS4KLSovCi0KLVB5X0xPQ0FMX0lOTElORShpbnQpCi1TVFJJTkdMSUIocGFyc2VfYXJnc19maW5kc191bmljb2RlKShjb25zdCBjaGFyICogZnVuY3Rpb25fbmFtZSwgUHlPYmplY3QgKmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqc3Vic3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqZW5kKQotewotICAgIFB5T2JqZWN0ICp0bXBfc3Vic3RyaW5nOwotCi0gICAgaWYoU1RSSU5HTElCKHBhcnNlX2FyZ3NfZmluZHMpKGZ1bmN0aW9uX25hbWUsIGFyZ3MsICZ0bXBfc3Vic3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQpKSB7Ci0gICAgICAgIHRtcF9zdWJzdHJpbmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdCh0bXBfc3Vic3RyaW5nKTsKLSAgICAgICAgaWYgKCF0bXBfc3Vic3RyaW5nKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICpzdWJzdHJpbmcgPSB0bXBfc3Vic3RyaW5nOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbHNlIC8qICFTVFJJTkdMSUJfSVNfVU5JQ09ERSAqLwotCi0vKgotV3JhcHMgc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoKSBhbmQgYWRkaXRpb25hbGx5IGNoZWNrcyB3aGV0aGVyIHRoZQotZmlyc3QgYXJndW1lbnQgaXMgYW4gaW50ZWdlciBpbiByYW5nZSgwLCAyNTYpLgotCi1JZiB0aGlzIGlzIHRoZSBjYXNlLCB3cml0ZXMgdGhlIGludGVnZXIgdmFsdWUgdG8gdGhlIGJ5dGUgcGFyYW1ldGVyCi1hbmQgc2V0cyBzdWJvYmogdG8gTlVMTC4gT3RoZXJ3aXNlLCBzZXRzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzdWJvYmoKLWFuZCBkb2Vzbid0IHRvdWNoIGJ5dGUuIFRoZSBvdGhlciBwYXJhbWV0ZXJzIGFyZSBzaW1pbGFyIHRvIHRob3NlIG9mCi1zdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygpLgotKi8KLQotUHlfTE9DQUxfSU5MSU5FKGludCkKLVNUUklOR0xJQihwYXJzZV9hcmdzX2ZpbmRzX2J5dGUpKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIFB5T2JqZWN0ICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipzdWJvYmosIGNoYXIgKmJ5dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqZW5kKQotewotICAgIFB5T2JqZWN0ICp0bXBfc3Vib2JqOwotICAgIFB5X3NzaXplX3QgaXZhbDsKLSAgICBQeU9iamVjdCAqZXJyOwotCi0gICAgaWYoIVNUUklOR0xJQihwYXJzZV9hcmdzX2ZpbmRzKShmdW5jdGlvbl9uYW1lLCBhcmdzLCAmdG1wX3N1Ym9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmICghUHlOdW1iZXJfQ2hlY2sodG1wX3N1Ym9iaikpIHsKLSAgICAgICAgKnN1Ym9iaiA9IHRtcF9zdWJvYmo7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGl2YWwgPSBQeU51bWJlcl9Bc1NzaXplX3QodG1wX3N1Ym9iaiwgUHlFeGNfT3ZlcmZsb3dFcnJvcik7Ci0gICAgaWYgKGl2YWwgPT0gLTEpIHsKLSAgICAgICAgZXJyID0gUHlFcnJfT2NjdXJyZWQoKTsKLSAgICAgICAgaWYgKGVyciAmJiAhUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKGVyciwgUHlFeGNfT3ZlcmZsb3dFcnJvcikpIHsKLSAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgICAgICAqc3Vib2JqID0gdG1wX3N1Ym9iajsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGl2YWwgPCAwIHx8IGl2YWwgPiAyNTUpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJieXRlIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KSIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAqc3Vib2JqID0gTlVMTDsKLSAgICAqYnl0ZSA9IChjaGFyKWl2YWw7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLSNlbmRpZiAvKiBTVFJJTkdMSUJfSVNfVU5JQ09ERSAqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvZmluZF9tYXhfY2hhci5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvZmluZF9tYXhfY2hhci5oCmluZGV4IGViM2ZlODguLjhjY2JjMzAgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL2ZpbmRfbWF4X2NoYXIuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9maW5kX21heF9jaGFyLmgKQEAgLTEsNiArMSw4IEBACiAvKiBGaW5kaW5nIHRoZSBvcHRpbWFsIHdpZHRoIG9mIHVuaWNvZGUgY2hhcmFjdGVycyBpbiBhIGJ1ZmZlciAqLwogCi0jaWYgU1RSSU5HTElCX0lTX1VOSUNPREUKKyNpZiAhU1RSSU5HTElCX0lTX1VOSUNPREUKKyMgZXJyb3IgImZpbmRfbWF4X2NoYXIuaCBpcyBzcGVjaWZpYyB0byBVbmljb2RlIgorI2VuZGlmCiAKIC8qIE1hc2sgdG8gcXVpY2tseSBjaGVjayB3aGV0aGVyIGEgQyAnbG9uZycgY29udGFpbnMgYQogICAgbm9uLUFTQ0lJLCBVVEY4LWVuY29kZWQgY2hhci4gKi8KQEAgLTEyOSw1ICsxMzEsNCBAQAogI3VuZGVmIE1BWF9DSEFSX1VDUzQKIAogI2VuZGlmIC8qIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA9PSAxICovCi0jZW5kaWYgLyogU1RSSU5HTElCX0lTX1VOSUNPREUgKi8KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvam9pbi5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvam9pbi5oCmluZGV4IGNiZjgxYmUuLjkwZjk2NmQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL2pvaW4uaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9qb2luLmgKQEAgLTEsNiArMSw2IEBACiAvKiBzdHJpbmdsaWI6IGJ5dGVzIGpvaW5pbmcgaW1wbGVtZW50YXRpb24gKi8KIAotI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiAhPSAxCisjaWYgU1RSSU5HTElCX0lTX1VOSUNPREUKICNlcnJvciBqb2luLmggb25seSBjb21wYXRpYmxlIHdpdGggYnl0ZS13aXNlIHN0cmluZ3MKICNlbmRpZgogCmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9sb2NhbGV1dGlsLmggYi9PYmplY3RzL3N0cmluZ2xpYi9sb2NhbGV1dGlsLmgKaW5kZXggNmUyZjA3My4uZGY1MDFlZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvbG9jYWxldXRpbC5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL2xvY2FsZXV0aWwuaApAQCAtMiw4ICsyLDggQEAKIAogI2luY2x1ZGUgPGxvY2FsZS5oPgogCi0jaWZuZGVmIFNUUklOR0xJQl9JU19VTklDT0RFCi0jICAgZXJyb3IgImxvY2FsZXV0aWwgaXMgc3BlY2lmaWMgdG8gVW5pY29kZSIKKyNpZiAhU1RSSU5HTElCX0lTX1VOSUNPREUKKyMgICBlcnJvciAibG9jYWxldXRpbC5oIGlzIHNwZWNpZmljIHRvIFVuaWNvZGUiCiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvdHJhbnNtb2dyaWZ5LmggYi9PYmplY3RzL3N0cmluZ2xpYi90cmFuc21vZ3JpZnkuaAppbmRleCBiNTU5YjUzLi42MjU1MDdkIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi90cmFuc21vZ3JpZnkuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi90cmFuc21vZ3JpZnkuaApAQCAtMSwxNCArMSwyMSBAQAotLyogTk9URTogdGhpcyBBUEkgaXMgLU9OTFktIGZvciB1c2Ugd2l0aCBzaW5nbGUgYnl0ZSBjaGFyYWN0ZXIgc3RyaW5ncy4gKi8KLS8qIERvIG5vdCB1c2UgaXQgd2l0aCBVbmljb2RlLiAqLworI2lmIFNUUklOR0xJQl9JU19VTklDT0RFCisjIGVycm9yICJ0cmFuc21vZ3JpZnkuaCBvbmx5IGNvbXBhdGlibGUgd2l0aCBieXRlLXdpc2Ugc3RyaW5ncyIKKyNlbmRpZgogCiAvKiB0aGUgbW9yZSBjb21wbGljYXRlZCBtZXRob2RzLiAgcGFydHMgb2YgdGhlc2Ugc2hvdWxkIGJlIHB1bGxlZCBvdXQgaW50byB0aGUKICAgIHNoYXJlZCBjb2RlIGluIGJ5dGVzX21ldGhvZHMuYyB0byBjdXQgZG93biBvbiBkdXBsaWNhdGUgY29kZSBibG9hdC4gICovCiAKLVB5RG9jX1NUUlZBUihleHBhbmR0YWJzX19kb2NfXywKLSJCLmV4cGFuZHRhYnModGFic2l6ZT04KSAtPiBjb3B5IG9mIEJcblwKLVxuXAotUmV0dXJuIGEgY29weSBvZiBCIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgZXhwYW5kZWQgdXNpbmcgc3BhY2VzLlxuXAotSWYgdGFic2l6ZSBpcyBub3QgZ2l2ZW4sIGEgdGFiIHNpemUgb2YgOCBjaGFyYWN0ZXJzIGlzIGFzc3VtZWQuIik7CitQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKK3JldHVybl9zZWxmKFB5T2JqZWN0ICpzZWxmKQoreworI2lmICFTVFJJTkdMSUJfTVVUQUJMRQorICAgIGlmIChTVFJJTkdMSUJfQ0hFQ0tfRVhBQ1Qoc2VsZikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gc2VsZjsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gU1RSSU5HTElCX05FVyhTVFJJTkdMSUJfU1RSKHNlbGYpLCBTVFJJTkdMSUJfTEVOKHNlbGYpKTsKK30KIAogc3RhdGljIFB5T2JqZWN0Kgogc3RyaW5nbGliX2V4cGFuZHRhYnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKQEAgLTkzLDM5ICsxMDAsMjUgQEAKICAgICBpZiAocmlnaHQgPCAwKQogICAgICAgICByaWdodCA9IDA7CiAKLSAgICBpZiAobGVmdCA9PSAwICYmIHJpZ2h0ID09IDAgJiYgU1RSSU5HTElCX0NIRUNLX0VYQUNUKHNlbGYpKSB7Ci0jaWYgU1RSSU5HTElCX01VVEFCTEUKLSAgICAgICAgLyogV2UncmUgZGVmaW5lZCBhcyByZXR1cm5pbmcgYSBjb3B5OyAgSWYgdGhlIG9iamVjdCBpcyBtdXRhYmxlCi0gICAgICAgICAqIHRoYXQgbWVhbnMgd2UgbXVzdCBtYWtlIGFuIGlkZW50aWNhbCBjb3B5LiAqLwotICAgICAgICByZXR1cm4gU1RSSU5HTElCX05FVyhTVFJJTkdMSUJfU1RSKHNlbGYpLCBTVFJJTkdMSUJfTEVOKHNlbGYpKTsKLSNlbHNlCi0gICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Ci0jZW5kaWYgLyogU1RSSU5HTElCX01VVEFCTEUgKi8KKyAgICBpZiAobGVmdCA9PSAwICYmIHJpZ2h0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwogICAgIH0KIAotICAgIHUgPSBTVFJJTkdMSUJfTkVXKE5VTEwsCi0JCQkJICAgbGVmdCArIFNUUklOR0xJQl9MRU4oc2VsZikgKyByaWdodCk7CisgICAgdSA9IFNUUklOR0xJQl9ORVcoTlVMTCwgbGVmdCArIFNUUklOR0xJQl9MRU4oc2VsZikgKyByaWdodCk7CiAgICAgaWYgKHUpIHsKICAgICAgICAgaWYgKGxlZnQpCiAgICAgICAgICAgICBtZW1zZXQoU1RSSU5HTElCX1NUUih1KSwgZmlsbCwgbGVmdCk7CiAgICAgICAgIFB5X01FTUNQWShTVFJJTkdMSUJfU1RSKHUpICsgbGVmdCwKLQkgICAgICAgU1RSSU5HTElCX1NUUihzZWxmKSwKLQkgICAgICAgU1RSSU5HTElCX0xFTihzZWxmKSk7CisgICAgICAgICAgICAgICBTVFJJTkdMSUJfU1RSKHNlbGYpLAorICAgICAgICAgICAgICAgU1RSSU5HTElCX0xFTihzZWxmKSk7CiAgICAgICAgIGlmIChyaWdodCkKICAgICAgICAgICAgIG1lbXNldChTVFJJTkdMSUJfU1RSKHUpICsgbGVmdCArIFNUUklOR0xJQl9MRU4oc2VsZiksCi0JCSAgIGZpbGwsIHJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICBmaWxsLCByaWdodCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHU7CiB9CiAKLVB5RG9jX1NUUlZBUihsanVzdF9fZG9jX18sCi0iQi5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXG4iCi0iXG4iCi0iUmV0dXJuIEIgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiBQYWRkaW5nIGlzXG4iCi0iZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nbGliX2xqdXN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKQEAgLTEzNSwyNyArMTI4LDE0IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGM6bGp1c3QiLCAmd2lkdGgsICZmaWxsY2hhcikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKFNUUklOR0xJQl9MRU4oc2VsZikgPj0gd2lkdGggJiYgU1RSSU5HTElCX0NIRUNLX0VYQUNUKHNlbGYpKSB7Ci0jaWYgU1RSSU5HTElCX01VVEFCTEUKLSAgICAgICAgLyogV2UncmUgZGVmaW5lZCBhcyByZXR1cm5pbmcgYSBjb3B5OyAgSWYgdGhlIG9iamVjdCBpcyBtdXRhYmxlCi0gICAgICAgICAqIHRoYXQgbWVhbnMgd2UgbXVzdCBtYWtlIGFuIGlkZW50aWNhbCBjb3B5LiAqLwotICAgICAgICByZXR1cm4gU1RSSU5HTElCX05FVyhTVFJJTkdMSUJfU1RSKHNlbGYpLCBTVFJJTkdMSUJfTEVOKHNlbGYpKTsKLSNlbHNlCi0gICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7Ci0jZW5kaWYKKyAgICBpZiAoU1RSSU5HTElCX0xFTihzZWxmKSA+PSB3aWR0aCkgeworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CiAgICAgfQogCiAgICAgcmV0dXJuIHBhZChzZWxmLCAwLCB3aWR0aCAtIFNUUklOR0xJQl9MRU4oc2VsZiksIGZpbGxjaGFyKTsKIH0KIAogCi1QeURvY19TVFJWQVIocmp1c3RfX2RvY19fLAotIkIucmp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxuIgotIlxuIgotIlJldHVybiBCIHJpZ2h0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggd2lkdGguIFBhZGRpbmcgaXNcbiIKLSJkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkiKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ2xpYl9yanVzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CkBAIC0xNjUsMjcgKzE0NSwxNCBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxjOnJqdXN0IiwgJndpZHRoLCAmZmlsbGNoYXIpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChTVFJJTkdMSUJfTEVOKHNlbGYpID49IHdpZHRoICYmIFNUUklOR0xJQl9DSEVDS19FWEFDVChzZWxmKSkgewotI2lmIFNUUklOR0xJQl9NVVRBQkxFCi0gICAgICAgIC8qIFdlJ3JlIGRlZmluZWQgYXMgcmV0dXJuaW5nIGEgY29weTsgIElmIHRoZSBvYmplY3QgaXMgbXV0YWJsZQotICAgICAgICAgKiB0aGF0IG1lYW5zIHdlIG11c3QgbWFrZSBhbiBpZGVudGljYWwgY29weS4gKi8KLSAgICAgICAgcmV0dXJuIFNUUklOR0xJQl9ORVcoU1RSSU5HTElCX1NUUihzZWxmKSwgU1RSSU5HTElCX0xFTihzZWxmKSk7Ci0jZWxzZQotICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwotI2VuZGlmCisgICAgaWYgKFNUUklOR0xJQl9MRU4oc2VsZikgPj0gd2lkdGgpIHsKKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwogICAgIH0KIAogICAgIHJldHVybiBwYWQoc2VsZiwgd2lkdGggLSBTVFJJTkdMSUJfTEVOKHNlbGYpLCAwLCBmaWxsY2hhcik7CiB9CiAKIAotUHlEb2NfU1RSVkFSKGNlbnRlcl9fZG9jX18sCi0iQi5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxuIgotIlxuIgotIlJldHVybiBCIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gIFBhZGRpbmcgaXNcbiIKLSJkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdsaWJfY2VudGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKQEAgLTE5NiwxNSArMTYzLDggQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58YzpjZW50ZXIiLCAmd2lkdGgsICZmaWxsY2hhcikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKFNUUklOR0xJQl9MRU4oc2VsZikgPj0gd2lkdGggJiYgU1RSSU5HTElCX0NIRUNLX0VYQUNUKHNlbGYpKSB7Ci0jaWYgU1RSSU5HTElCX01VVEFCTEUKLSAgICAgICAgLyogV2UncmUgZGVmaW5lZCBhcyByZXR1cm5pbmcgYSBjb3B5OyAgSWYgdGhlIG9iamVjdCBpcyBtdXRhYmxlCi0gICAgICAgICAqIHRoYXQgbWVhbnMgd2UgbXVzdCBtYWtlIGFuIGlkZW50aWNhbCBjb3B5LiAqLwotICAgICAgICByZXR1cm4gU1RSSU5HTElCX05FVyhTVFJJTkdMSUJfU1RSKHNlbGYpLCBTVFJJTkdMSUJfTEVOKHNlbGYpKTsKLSNlbHNlCi0gICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7Ci0jZW5kaWYKKyAgICBpZiAoU1RSSU5HTElCX0xFTihzZWxmKSA+PSB3aWR0aCkgeworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CiAgICAgfQogCiAgICAgbWFyZyA9IHdpZHRoIC0gU1RSSU5HTElCX0xFTihzZWxmKTsKQEAgLTIxMywxMiArMTczLDYgQEAKICAgICByZXR1cm4gcGFkKHNlbGYsIGxlZnQsIG1hcmcgLSBsZWZ0LCBmaWxsY2hhcik7CiB9CiAKLVB5RG9jX1NUUlZBUih6ZmlsbF9fZG9jX18sCi0iQi56ZmlsbCh3aWR0aCkgLT4gY29weSBvZiBCXG4iCi0iXG4iCi0iUGFkIGEgbnVtZXJpYyBzdHJpbmcgQiB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0LCB0byBmaWxsIGEgZmllbGRcbiIKLSJvZiB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgQiBpcyBuZXZlciB0cnVuY2F0ZWQuIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdsaWJfemZpbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewpAQCAtMjMxLDIxICsxODUsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChTVFJJTkdMSUJfTEVOKHNlbGYpID49IHdpZHRoKSB7Ci0gICAgICAgIGlmIChTVFJJTkdMSUJfQ0hFQ0tfRVhBQ1Qoc2VsZikpIHsKLSNpZiBTVFJJTkdMSUJfTVVUQUJMRQotICAgICAgICAgICAgLyogV2UncmUgZGVmaW5lZCBhcyByZXR1cm5pbmcgYSBjb3B5OyAgSWYgdGhlIG9iamVjdCBpcyBtdXRhYmxlCi0gICAgICAgICAgICAgKiB0aGF0IG1lYW5zIHdlIG11c3QgbWFrZSBhbiBpZGVudGljYWwgY29weS4gKi8KLSAgICAgICAgICAgIHJldHVybiBTVFJJTkdMSUJfTkVXKFNUUklOR0xJQl9TVFIoc2VsZiksIFNUUklOR0xJQl9MRU4oc2VsZikpOwotI2Vsc2UKLSAgICAgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFNUUklOR0xJQl9ORVcoCi0gICAgICAgICAgICAgICAgU1RSSU5HTElCX1NUUihzZWxmKSwKLSAgICAgICAgICAgICAgICBTVFJJTkdMSUJfTEVOKHNlbGYpCi0gICAgICAgICAgICApOworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CiAgICAgfQogCiAgICAgZmlsbCA9IHdpZHRoIC0gU1RSSU5HTElCX0xFTihzZWxmKTsKQEAgLTI2Miw1ICsyMDIsNTAwIEBACiAgICAgICAgIHBbZmlsbF0gPSAnMCc7CiAgICAgfQogCi0gICAgcmV0dXJuIChQeU9iamVjdCopIHM7CisgICAgcmV0dXJuIHM7CiB9CisKKworLyogZmluZCBhbmQgY291bnQgY2hhcmFjdGVycyBhbmQgc3Vic3RyaW5ncyAqLworCisjZGVmaW5lIGZpbmRjaGFyKHRhcmdldCwgdGFyZ2V0X2xlbiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGNoYXIgKiltZW1jaHIoKGNvbnN0IHZvaWQgKikodGFyZ2V0KSwgYywgdGFyZ2V0X2xlbikpCisKKworUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCitjb3VudGNoYXIoY29uc3QgY2hhciAqdGFyZ2V0LCBQeV9zc2l6ZV90IHRhcmdldF9sZW4sIGNoYXIgYywKKyAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQoreworICAgIFB5X3NzaXplX3QgY291bnQgPSAwOworICAgIGNvbnN0IGNoYXIgKnN0YXJ0ID0gdGFyZ2V0OworICAgIGNvbnN0IGNoYXIgKmVuZCA9IHRhcmdldCArIHRhcmdldF9sZW47CisKKyAgICB3aGlsZSAoKHN0YXJ0ID0gZmluZGNoYXIoc3RhcnQsIGVuZCAtIHN0YXJ0LCBjKSkgIT0gTlVMTCkgeworICAgICAgICBjb3VudCsrOworICAgICAgICBpZiAoY291bnQgPj0gbWF4Y291bnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc3RhcnQgKz0gMTsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCisKKy8qIEFsZ29yaXRobXMgZm9yIGRpZmZlcmVudCBjYXNlcyBvZiBzdHJpbmcgcmVwbGFjZW1lbnQgKi8KKworLyogbGVuKHNlbGYpPj0xLCBmcm9tPSIiLCBsZW4odG8pPj0xLCBtYXhjb3VudD49MSAqLworUHlfTE9DQUwoUHlPYmplY3QgKikKK3N0cmluZ2xpYl9yZXBsYWNlX2ludGVybGVhdmUoUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQoreworICAgIGNvbnN0IGNoYXIgKnNlbGZfczsKKyAgICBjaGFyICpyZXN1bHRfczsKKyAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOworICAgIFB5X3NzaXplX3QgY291bnQsIGk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgIHNlbGZfbGVuID0gU1RSSU5HTElCX0xFTihzZWxmKTsKKworICAgIC8qIDEgYXQgdGhlIGVuZCBwbHVzIDEgYWZ0ZXIgZXZlcnkgY2hhcmFjdGVyOworICAgICAgIGNvdW50ID0gbWluKG1heGNvdW50LCBzZWxmX2xlbiArIDEpICovCisgICAgaWYgKG1heGNvdW50IDw9IHNlbGZfbGVuKSB7CisgICAgICAgIGNvdW50ID0gbWF4Y291bnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBDYW4ndCBvdmVyZmxvdzogc2VsZl9sZW4gKyAxIDw9IG1heGNvdW50IDw9IFBZX1NTSVpFX1RfTUFYLiAqLworICAgICAgICBjb3VudCA9IHNlbGZfbGVuICsgMTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICAvKiAgIHJlc3VsdF9sZW4gPSBjb3VudCAqIHRvX2xlbiArIHNlbGZfbGVuOyAqLworICAgIGFzc2VydChjb3VudCA+IDApOworICAgIGlmICh0b19sZW4gPiAoUFlfU1NJWkVfVF9NQVggLSBzZWxmX2xlbikgLyBjb3VudCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlIGJ5dGVzIGFyZSB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X2xlbiA9IGNvdW50ICogdG9fbGVuICsgc2VsZl9sZW47CisgICAgcmVzdWx0ID0gU1RSSU5HTElCX05FVyhOVUxMLCByZXN1bHRfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc2VsZl9zID0gU1RSSU5HTElCX1NUUihzZWxmKTsKKyAgICByZXN1bHRfcyA9IFNUUklOR0xJQl9TVFIocmVzdWx0KTsKKworICAgIGlmICh0b19sZW4gPiAxKSB7CisgICAgICAgIC8qIExheSB0aGUgZmlyc3Qgb25lIGRvd24gKGd1YXJhbnRlZWQgdGhpcyB3aWxsIG9jY3VyKSAqLworICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgY291bnQgLT0gMTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgKnJlc3VsdF9zKysgPSAqc2VsZl9zKys7CisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisgICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdF9zWzBdID0gdG9fc1swXTsKKyAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICBjb3VudCAtPSAxOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgKnJlc3VsdF9zKysgPSAqc2VsZl9zKys7CisgICAgICAgICAgICByZXN1bHRfc1swXSA9IHRvX3NbMF07CisgICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4gLSBpKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIFNwZWNpYWwgY2FzZSBmb3IgZGVsZXRpbmcgYSBzaW5nbGUgY2hhcmFjdGVyICovCisvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09MSwgdG89IiIsIG1heGNvdW50Pj0xICovCitQeV9MT0NBTChQeU9iamVjdCAqKQorc3RyaW5nbGliX3JlcGxhY2VfZGVsZXRlX3NpbmdsZV9jaGFyYWN0ZXIoUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpzZWxmX3MsICpzdGFydCwgKm5leHQsICplbmQ7CisgICAgY2hhciAqcmVzdWx0X3M7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBzZWxmX2xlbiA9IFNUUklOR0xJQl9MRU4oc2VsZik7CisgICAgc2VsZl9zID0gU1RSSU5HTElCX1NUUihzZWxmKTsKKworICAgIGNvdW50ID0gY291bnRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYywgbWF4Y291bnQpOworICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CisKKyAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gLSBjb3VudDsgIC8qIGZyb21fbGVuID09IDEgKi8KKyAgICBhc3NlcnQocmVzdWx0X2xlbj49MCk7CisKKyAgICByZXN1bHQgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIHJlc3VsdF9sZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X3MgPSBTVFJJTkdMSUJfU1RSKHJlc3VsdCk7CisKKyAgICBzdGFydCA9IHNlbGZfczsKKyAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKKyAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQgLSBzdGFydCwgZnJvbV9jKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0IC0gc3RhcnQpOworICAgICAgICByZXN1bHRfcyArPSAobmV4dCAtIHN0YXJ0KTsKKyAgICAgICAgc3RhcnQgPSBuZXh0ICsgMTsKKyAgICB9CisgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kIC0gc3RhcnQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk+PTIsIHRvPSIiLCBtYXhjb3VudD49MSAqLworCitQeV9MT0NBTChQeU9iamVjdCAqKQorc3RyaW5nbGliX3JlcGxhY2VfZGVsZXRlX3N1YnN0cmluZyhQeU9iamVjdCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQoreworICAgIGNvbnN0IGNoYXIgKnNlbGZfcywgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKKyAgICBjaGFyICpyZXN1bHRfczsKKyAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOworICAgIFB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgc2VsZl9sZW4gPSBTVFJJTkdMSUJfTEVOKHNlbGYpOworICAgIHNlbGZfcyA9IFNUUklOR0xJQl9TVFIoc2VsZik7CisKKyAgICBjb3VudCA9IHN0cmluZ2xpYl9jb3VudChzZWxmX3MsIHNlbGZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y291bnQpOworCisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgLyogbm8gbWF0Y2hlcyAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQorCisgICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gKGNvdW50ICogZnJvbV9sZW4pOworICAgIGFzc2VydCAocmVzdWx0X2xlbj49MCk7CisKKyAgICByZXN1bHQgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIHJlc3VsdF9sZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X3MgPSBTVFJJTkdMSUJfU1RSKHJlc3VsdCk7CisKKyAgICBzdGFydCA9IHNlbGZfczsKKyAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKKyAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuZXh0ID0gc3RhcnQgKyBvZmZzZXQ7CisKKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dCAtIHN0YXJ0KTsKKworICAgICAgICByZXN1bHRfcyArPSAobmV4dCAtIHN0YXJ0KTsKKyAgICAgICAgc3RhcnQgPSBuZXh0ICsgZnJvbV9sZW47CisgICAgfQorICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT09MSwgbWF4Y291bnQ+PTEgKi8KK1B5X0xPQ0FMKFB5T2JqZWN0ICopCitzdHJpbmdsaWJfcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyX2luX3BsYWNlKFB5T2JqZWN0ICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywgY2hhciB0b19jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQoreworICAgIGNvbnN0IGNoYXIgKnNlbGZfcywgKmVuZDsKKyAgICBjaGFyICpyZXN1bHRfcywgKnN0YXJ0LCAqbmV4dDsKKyAgICBQeV9zc2l6ZV90IHNlbGZfbGVuOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICAvKiBUaGUgcmVzdWx0IHN0cmluZyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KKyAgICBzZWxmX3MgPSBTVFJJTkdMSUJfU1RSKHNlbGYpOworICAgIHNlbGZfbGVuID0gU1RSSU5HTElCX0xFTihzZWxmKTsKKworICAgIG5leHQgPSBmaW5kY2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MpOworCisgICAgaWYgKG5leHQgPT0gTlVMTCkgeworICAgICAgICAvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIGJ5dGVzICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CisKKyAgICAvKiBOZWVkIHRvIG1ha2UgYSBuZXcgYnl0ZXMgKi8KKyAgICByZXN1bHQgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIHNlbGZfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9zID0gU1RSSU5HTElCX1NUUihyZXN1bHQpOworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7CisKKyAgICAvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLworICAgIHN0YXJ0ID0gIHJlc3VsdF9zICsgKG5leHQgLSBzZWxmX3MpOworICAgICpzdGFydCA9IHRvX2M7CisgICAgc3RhcnQrKzsKKyAgICBlbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOworCisgICAgd2hpbGUgKC0tbWF4Y291bnQgPiAwKSB7CisgICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kIC0gc3RhcnQsIGZyb21fYyk7CisgICAgICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKm5leHQgPSB0b19jOworICAgICAgICBzdGFydCA9IG5leHQgKyAxOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT1sZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLworUHlfTE9DQUwoUHlPYmplY3QgKikKK3N0cmluZ2xpYl9yZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZShQeU9iamVjdCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpzZWxmX3MsICplbmQ7CisgICAgY2hhciAqcmVzdWx0X3MsICpzdGFydDsKKyAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCBvZmZzZXQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgIC8qIFRoZSByZXN1bHQgYnl0ZXMgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCisKKyAgICBzZWxmX3MgPSBTVFJJTkdMSUJfU1RSKHNlbGYpOworICAgIHNlbGZfbGVuID0gU1RSSU5HTElCX0xFTihzZWxmKTsKKworICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHNlbGZfcywgc2VsZl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAob2Zmc2V0ID09IC0xKSB7CisgICAgICAgIC8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgYnl0ZXMgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KKworICAgIC8qIE5lZWQgdG8gbWFrZSBhIG5ldyBieXRlcyAqLworICAgIHJlc3VsdCA9IFNUUklOR0xJQl9ORVcoTlVMTCwgc2VsZl9sZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X3MgPSBTVFJJTkdMSUJfU1RSKHJlc3VsdCk7CisgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKKworICAgIC8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCisgICAgc3RhcnQgPSAgcmVzdWx0X3MgKyBvZmZzZXQ7CisgICAgUHlfTUVNQ1BZKHN0YXJ0LCB0b19zLCBmcm9tX2xlbik7CisgICAgc3RhcnQgKz0gZnJvbV9sZW47CisgICAgZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKKworICAgIHdoaWxlICggLS1tYXhjb3VudCA+IDApIHsKKyAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBQeV9NRU1DUFkoc3RhcnQgKyBvZmZzZXQsIHRvX3MsIGZyb21fbGVuKTsKKyAgICAgICAgc3RhcnQgKz0gb2Zmc2V0ICsgZnJvbV9sZW47CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PTEsIGxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCitQeV9MT0NBTChQeU9iamVjdCAqKQorc3RyaW5nbGliX3JlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihQeU9iamVjdCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQoreworICAgIGNvbnN0IGNoYXIgKnNlbGZfcywgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKKyAgICBjaGFyICpyZXN1bHRfczsKKyAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOworICAgIFB5X3NzaXplX3QgY291bnQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgIHNlbGZfcyA9IFNUUklOR0xJQl9TVFIoc2VsZik7CisgICAgc2VsZl9sZW4gPSBTVFJJTkdMSUJfTEVOKHNlbGYpOworCisgICAgY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQorCisgICAgLyogdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBhbmQgbmV3LCBoZW5jZSB0aGUgIi0xIiAqLworICAgIC8qICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLTEpICAqLworICAgIGFzc2VydChjb3VudCA+IDApOworICAgIGlmICh0b19sZW4gLSAxID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIGJ5dGVzIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4gLSAxKTsKKworICAgIHJlc3VsdCA9IFNUUklOR0xJQl9ORVcoTlVMTCwgcmVzdWx0X2xlbik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfcyA9IFNUUklOR0xJQl9TVFIocmVzdWx0KTsKKworICAgIHN0YXJ0ID0gc2VsZl9zOworICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOworICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZCAtIHN0YXJ0LCBmcm9tX2MpOworICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQpIHsKKyAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICAgICAgc3RhcnQgKz0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dCAtIHN0YXJ0KTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IChuZXh0IC0gc3RhcnQpOworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICAgICAgc3RhcnQgPSBuZXh0ICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBieXRlcyAqLworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPj0yLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLworUHlfTE9DQUwoUHlPYmplY3QgKikKK3N0cmluZ2xpYl9yZXBsYWNlX3N1YnN0cmluZyhQeU9iamVjdCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpzZWxmX3MsICpzdGFydCwgKm5leHQsICplbmQ7CisgICAgY2hhciAqcmVzdWx0X3M7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgIHNlbGZfcyA9IFNUUklOR0xJQl9TVFIoc2VsZik7CisgICAgc2VsZl9sZW4gPSBTVFJJTkdMSUJfTEVOKHNlbGYpOworCisgICAgY291bnQgPSBzdHJpbmdsaWJfY291bnQoc2VsZl9zLCBzZWxmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvdW50KTsKKworICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIC8qIG5vIG1hdGNoZXMsIHJldHVybiB1bmNoYW5nZWQgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLworICAgIC8qICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi1mcm9tX2xlbikgKi8KKyAgICBhc3NlcnQoY291bnQgPiAwKTsKKyAgICBpZiAodG9fbGVuIC0gZnJvbV9sZW4gPiAoUFlfU1NJWkVfVF9NQVggLSBzZWxmX2xlbikgLyBjb3VudCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2UgYnl0ZXMgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbiAtIGZyb21fbGVuKTsKKworICAgIHJlc3VsdCA9IFNUUklOR0xJQl9ORVcoTlVMTCwgcmVzdWx0X2xlbik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfcyA9IFNUUklOR0xJQl9TVFIocmVzdWx0KTsKKworICAgIHN0YXJ0ID0gc2VsZl9zOworICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOworICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG5leHQgPSBzdGFydCArIG9mZnNldDsKKyAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQpIHsKKyAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICAgICAgc3RhcnQgKz0gZnJvbV9sZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQgLSBzdGFydCk7CisgICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dCAtIHN0YXJ0KTsKKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgICAgIHN0YXJ0ID0gbmV4dCArIGZyb21fbGVuOworICAgICAgICB9CisgICAgfQorICAgIC8qIENvcHkgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVtYWluaW5nIGJ5dGVzICovCisgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kIC0gc3RhcnQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitQeV9MT0NBTChQeU9iamVjdCAqKQorc3RyaW5nbGliX3JlcGxhY2UoUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKKyAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCit7CisgICAgaWYgKG1heGNvdW50IDwgMCkgeworICAgICAgICBtYXhjb3VudCA9IFBZX1NTSVpFX1RfTUFYOworICAgIH0gZWxzZSBpZiAobWF4Y291bnQgPT0gMCB8fCBTVFJJTkdMSUJfTEVOKHNlbGYpID09IDApIHsKKyAgICAgICAgLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBieXRlcyAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQorCisgICAgLyogSGFuZGxlIHplcm8tbGVuZ3RoIHNwZWNpYWwgY2FzZXMgKi8KKyAgICBpZiAoZnJvbV9sZW4gPT0gMCkgeworICAgICAgICBpZiAodG9fbGVuID09IDApIHsKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgYnl0ZXMgKi8KKyAgICAgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICAgICAgfQorICAgICAgICAvKiBpbnNlcnQgdGhlICd0bycgYnl0ZXMgZXZlcnl3aGVyZS4gICAgKi8KKyAgICAgICAgLyogICAgPj4+IGIiUHl0aG9uIi5yZXBsYWNlKGIiIiwgYiIuIikgICovCisgICAgICAgIC8qICAgIGInLlAueS50Lmguby5uLicgICAgICAgICAgICAgICAgICAqLworICAgICAgICByZXR1cm4gc3RyaW5nbGliX3JlcGxhY2VfaW50ZXJsZWF2ZShzZWxmLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKKyAgICB9CisKKyAgICAvKiBFeGNlcHQgZm9yIGIiIi5yZXBsYWNlKGIiIiwgYiJBIikgPT0gYiJBIiB0aGVyZSBpcyBubyB3YXkgYmV5b25kIHRoaXMgKi8KKyAgICAvKiBwb2ludCBmb3IgYW4gZW1wdHkgc2VsZiBieXRlcyB0byBnZW5lcmF0ZSBhIG5vbi1lbXB0eSBieXRlcyAqLworICAgIC8qIFNwZWNpYWwgY2FzZSBzbyB0aGUgcmVtYWluaW5nIGNvZGUgYWx3YXlzIGdldHMgYSBub24tZW1wdHkgYnl0ZXMgKi8KKyAgICBpZiAoU1RSSU5HTElCX0xFTihzZWxmKSA9PSAwKSB7CisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CisKKyAgICBpZiAodG9fbGVuID09IDApIHsKKyAgICAgICAgLyogZGVsZXRlIGFsbCBvY2N1cnJlbmNlcyBvZiAnZnJvbScgYnl0ZXMgKi8KKyAgICAgICAgaWYgKGZyb21fbGVuID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmdsaWJfcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcigKKyAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3NbMF0sIG1heGNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmdsaWJfcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKAorICAgICAgICAgICAgICAgIHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIG1heGNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlcmUgYm90aCBieXRlcyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAqLworCisgICAgaWYgKGZyb21fbGVuID09IHRvX2xlbikgeworICAgICAgICBpZiAoZnJvbV9sZW4gPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoCisgICAgICAgICAgICAgICAgc2VsZiwgZnJvbV9zWzBdLCB0b19zWzBdLCBtYXhjb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nbGliX3JlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKAorICAgICAgICAgICAgICAgIHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogT3RoZXJ3aXNlIHVzZSB0aGUgbW9yZSBnZW5lcmljIGFsZ29yaXRobXMgKi8KKyAgICBpZiAoZnJvbV9sZW4gPT0gMSkgeworICAgICAgICByZXR1cm4gc3RyaW5nbGliX3JlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcigKKyAgICAgICAgICAgIHNlbGYsIGZyb21fc1swXSwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbGVuKCdmcm9tJyk+PTIsIGxlbigndG8nKT49MSAqLworICAgICAgICByZXR1cm4gc3RyaW5nbGliX3JlcGxhY2Vfc3Vic3RyaW5nKAorICAgICAgICAgICAgc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7CisgICAgfQorfQorCisjdW5kZWYgZmluZGNoYXIKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL3VuaWNvZGVfZm9ybWF0LmggYi9PYmplY3RzL3N0cmluZ2xpYi91bmljb2RlX2Zvcm1hdC5oCmluZGV4IGJlMDliNWYuLjE0ZmEyOGUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL3VuaWNvZGVfZm9ybWF0LmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvdW5pY29kZV9mb3JtYXQuaApAQCAtNjcsNyArNjcsNyBAQAogICAgIHJldHVybiBQeVVuaWNvZGVfU3Vic3RyaW5nKHN0ci0+c3RyLCBzdHItPnN0YXJ0LCBzdHItPmVuZCk7CiB9CiAKLS8qIHJldHVybiBhIG5ldyBzdHJpbmcuICBpZiBzdHItPnN0ciBpcyBOVUxMLCByZXR1cm4gTm9uZSAqLworLyogcmV0dXJuIGEgbmV3IHN0cmluZy4gIGlmIHN0ci0+c3RyIGlzIE5VTEwsIHJldHVybiBhIG5ldyBlbXB0eSBzdHJpbmcgKi8KIFB5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogU3ViU3RyaW5nX25ld19vYmplY3Rfb3JfZW1wdHkoU3ViU3RyaW5nICpzdHIpCiB7CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cnVjdHNlcS5jIGIvT2JqZWN0cy9zdHJ1Y3RzZXEuYwppbmRleCA2NjQzNDRiLi5lMzE1Y2JhIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cnVjdHNlcS5jCisrKyBiL09iamVjdHMvc3RydWN0c2VxLmMKQEAgLTQsOSArNCw5IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCiAKLXN0YXRpYyBjaGFyIHZpc2libGVfbGVuZ3RoX2tleVtdID0gIm5fc2VxdWVuY2VfZmllbGRzIjsKLXN0YXRpYyBjaGFyIHJlYWxfbGVuZ3RoX2tleVtdID0gIm5fZmllbGRzIjsKLXN0YXRpYyBjaGFyIHVubmFtZWRfZmllbGRzX2tleVtdID0gIm5fdW5uYW1lZF9maWVsZHMiOworc3RhdGljIGNvbnN0IGNoYXIgdmlzaWJsZV9sZW5ndGhfa2V5W10gPSAibl9zZXF1ZW5jZV9maWVsZHMiOworc3RhdGljIGNvbnN0IGNoYXIgcmVhbF9sZW5ndGhfa2V5W10gPSAibl9maWVsZHMiOworc3RhdGljIGNvbnN0IGNoYXIgdW5uYW1lZF9maWVsZHNfa2V5W10gPSAibl91bm5hbWVkX2ZpZWxkcyI7CiAKIC8qIEZpZWxkcyB3aXRoIHRoaXMgbmFtZSBoYXZlIG9ubHkgYSBmaWVsZCBpbmRleCwgbm90IGEgZmllbGQgbmFtZS4KICAgIFRoZXkgYXJlIG9ubHkgYWxsb3dlZCBmb3IgaW5kaWNlcyA8IG5fdmlzaWJsZV9maWVsZHMuICovCkBAIC0xNiwxNCArMTYsMTQgQEAKIF9QeV9JREVOVElGSUVSKG5fdW5uYW1lZF9maWVsZHMpOwogCiAjZGVmaW5lIFZJU0lCTEVfU0laRShvcCkgUHlfU0laRShvcCkKLSNkZWZpbmUgVklTSUJMRV9TSVpFX1RQKHRwKSBQeUxvbmdfQXNMb25nKCBcCisjZGVmaW5lIFZJU0lCTEVfU0laRV9UUCh0cCkgUHlMb25nX0FzU3NpemVfdCggXAogICAgICAgICAgICAgICAgICAgICAgIF9QeURpY3RfR2V0SXRlbUlkKCh0cCktPnRwX2RpY3QsICZQeUlkX25fc2VxdWVuY2VfZmllbGRzKSkKIAotI2RlZmluZSBSRUFMX1NJWkVfVFAodHApIFB5TG9uZ19Bc0xvbmcoIFwKKyNkZWZpbmUgUkVBTF9TSVpFX1RQKHRwKSBQeUxvbmdfQXNTc2l6ZV90KCBcCiAgICAgICAgICAgICAgICAgICAgICAgX1B5RGljdF9HZXRJdGVtSWQoKHRwKS0+dHBfZGljdCwgJlB5SWRfbl9maWVsZHMpKQogI2RlZmluZSBSRUFMX1NJWkUob3ApIFJFQUxfU0laRV9UUChQeV9UWVBFKG9wKSkKIAotI2RlZmluZSBVTk5BTUVEX0ZJRUxEU19UUCh0cCkgUHlMb25nX0FzTG9uZyggXAorI2RlZmluZSBVTk5BTUVEX0ZJRUxEU19UUCh0cCkgUHlMb25nX0FzU3NpemVfdCggXAogICAgICAgICAgICAgICAgICAgICAgIF9QeURpY3RfR2V0SXRlbUlkKCh0cCktPnRwX2RpY3QsICZQeUlkX25fdW5uYW1lZF9maWVsZHMpKQogI2RlZmluZSBVTk5BTUVEX0ZJRUxEUyhvcCkgVU5OQU1FRF9GSUVMRFNfVFAoUHlfVFlQRShvcCkpCiAKQEAgLTE2NCw3ICsxNjQsOCBAQAogI2RlZmluZSBUWVBFX01BWFNJWkUgMTAwCiAKICAgICBQeVR5cGVPYmplY3QgKnR5cCA9IFB5X1RZUEUob2JqKTsKLSAgICBpbnQgaSwgcmVtb3ZlbGFzdCA9IDA7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCByZW1vdmVsYXN0ID0gMDsKICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICBjaGFyIGJ1ZltSRVBSX0JVRkZFUl9TSVpFXTsKICAgICBjaGFyICplbmRvZmJ1ZiwgKnBidWYgPSBidWY7CkBAIC0yMzYsOCArMjM3LDcgQEAKICAgICBQeU9iamVjdCogdHVwID0gTlVMTDsKICAgICBQeU9iamVjdCogZGljdCA9IE5VTEw7CiAgICAgUHlPYmplY3QqIHJlc3VsdDsKLSAgICBQeV9zc2l6ZV90IG5fZmllbGRzLCBuX3Zpc2libGVfZmllbGRzLCBuX3VubmFtZWRfZmllbGRzOwotICAgIGludCBpOworICAgIFB5X3NzaXplX3Qgbl9maWVsZHMsIG5fdmlzaWJsZV9maWVsZHMsIG5fdW5uYW1lZF9maWVsZHMsIGk7CiAKICAgICBuX2ZpZWxkcyA9IFJFQUxfU0laRShzZWxmKTsKICAgICBuX3Zpc2libGVfZmllbGRzID0gVklTSUJMRV9TSVpFKHNlbGYpOwpAQCAtMzI1LDcgKzMyNSw3IEBACiB7CiAgICAgUHlPYmplY3QgKmRpY3Q7CiAgICAgUHlNZW1iZXJEZWYqIG1lbWJlcnM7Ci0gICAgaW50IG5fbWVtYmVycywgbl91bm5hbWVkX21lbWJlcnMsIGksIGs7CisgICAgUHlfc3NpemVfdCBuX21lbWJlcnMsIG5fdW5uYW1lZF9tZW1iZXJzLCBpLCBrOwogICAgIFB5T2JqZWN0ICp2OwogCiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwpAQCAtMzczLDkgKzM3Myw5IEBACiAgICAgUHlfSU5DUkVGKHR5cGUpOwogCiAgICAgZGljdCA9IHR5cGUtPnRwX2RpY3Q7Ci0jZGVmaW5lIFNFVF9ESUNUX0ZST01fSU5UKGtleSwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBTRVRfRElDVF9GUk9NX1NJWkUoa2V5LCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHYgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ID0gUHlMb25nX0Zyb21Tc2l6ZV90KHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKHYgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwga2V5LCB2KSA8IDApIHsgICAgICAgICAgIFwKQEAgLTM4NSw5ICszODUsOSBAQAogICAgICAgICBQeV9ERUNSRUYodik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlICgwKQogCi0gICAgU0VUX0RJQ1RfRlJPTV9JTlQodmlzaWJsZV9sZW5ndGhfa2V5LCBkZXNjLT5uX2luX3NlcXVlbmNlKTsKLSAgICBTRVRfRElDVF9GUk9NX0lOVChyZWFsX2xlbmd0aF9rZXksIG5fbWVtYmVycyk7Ci0gICAgU0VUX0RJQ1RfRlJPTV9JTlQodW5uYW1lZF9maWVsZHNfa2V5LCBuX3VubmFtZWRfbWVtYmVycyk7CisgICAgU0VUX0RJQ1RfRlJPTV9TSVpFKHZpc2libGVfbGVuZ3RoX2tleSwgZGVzYy0+bl9pbl9zZXF1ZW5jZSk7CisgICAgU0VUX0RJQ1RfRlJPTV9TSVpFKHJlYWxfbGVuZ3RoX2tleSwgbl9tZW1iZXJzKTsKKyAgICBTRVRfRElDVF9GUk9NX1NJWkUodW5uYW1lZF9maWVsZHNfa2V5LCBuX3VubmFtZWRfbWVtYmVycyk7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvdHVwbGVvYmplY3QuYyBiL09iamVjdHMvdHVwbGVvYmplY3QuYwppbmRleCA3OTIwZmVjLi5jMGZmNDk5IDEwMDY0NAotLS0gYS9PYmplY3RzL3R1cGxlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy90dXBsZW9iamVjdC5jCkBAIC0zNiw2ICszNiwxNiBAQAogc3RhdGljIHZvaWQKIHNob3dfdHJhY2sodm9pZCkKIHsKKyAgICBQeU9iamVjdCAqeG9wdGlvbnMsICp2YWx1ZTsKKyAgICBfUHlfSURFTlRJRklFUihzaG93YWxsb2Njb3VudCk7CisKKyAgICB4b3B0aW9ucyA9IFB5U3lzX0dldFhPcHRpb25zKCk7CisgICAgaWYgKHhvcHRpb25zID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICB2YWx1ZSA9IF9QeURpY3RfR2V0SXRlbUlkKHhvcHRpb25zLCAmUHlJZF9zaG93YWxsb2Njb3VudCk7CisgICAgaWYgKHZhbHVlICE9IFB5X1RydWUpCisgICAgICAgIHJldHVybjsKKwogICAgIGZwcmludGYoc3RkZXJyLCAiVHVwbGVzIGNyZWF0ZWQ6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCiAgICAgICAgIGNvdW50X3RyYWNrZWQgKyBjb3VudF91bnRyYWNrZWQpOwogICAgIGZwcmludGYoc3RkZXJyLCAiVHVwbGVzIHRyYWNrZWQgYnkgdGhlIEdDOiAlIiBQWV9GT1JNQVRfU0laRV9UCkBAIC0xNDksNyArMTU5LDYgQEAKIGludAogUHlUdXBsZV9TZXRJdGVtKFB5T2JqZWN0ICpvcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqbmV3aXRlbSkKIHsKLSAgICBQeU9iamVjdCAqb2xkaXRlbTsKICAgICBQeU9iamVjdCAqKnA7CiAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKG9wKSB8fCBvcC0+b2JfcmVmY250ICE9IDEpIHsKICAgICAgICAgUHlfWERFQ1JFRihuZXdpdGVtKTsKQEAgLTE2Myw5ICsxNzIsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHAgPSAoKFB5VHVwbGVPYmplY3QgKilvcCkgLT4gb2JfaXRlbSArIGk7Ci0gICAgb2xkaXRlbSA9ICpwOwotICAgICpwID0gbmV3aXRlbTsKLSAgICBQeV9YREVDUkVGKG9sZGl0ZW0pOworICAgIFB5X1hTRVRSRUYoKnAsIG5ld2l0ZW0pOwogICAgIHJldHVybiAwOwogfQogCkBAIC00NDYsOSArNDUzLDkgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogI2RlZmluZSBiICgoUHlUdXBsZU9iamVjdCAqKWJiKQotICAgIHNpemUgPSBQeV9TSVpFKGEpICsgUHlfU0laRShiKTsKLSAgICBpZiAoc2l6ZSA8IDApCisgICAgaWYgKFB5X1NJWkUoYSkgPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoYikpCiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIHNpemUgPSBQeV9TSVpFKGEpICsgUHlfU0laRShiKTsKICAgICBucCA9IChQeVR1cGxlT2JqZWN0ICopIFB5VHVwbGVfTmV3KHNpemUpOwogICAgIGlmIChucCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy90eXBlb2JqZWN0LmMgYi9PYmplY3RzL3R5cGVvYmplY3QuYwppbmRleCBjY2RlM2RlLi5kZjA0ODFkIDEwMDY0NAotLS0gYS9PYmplY3RzL3R5cGVvYmplY3QuYworKysgYi9PYmplY3RzL3R5cGVvYmplY3QuYwpAQCAtNTMsMTAgKzUzLDEyIEBACiBfUHlfSURFTlRJRklFUihfX2dldGF0dHJpYnV0ZV9fKTsKIF9QeV9JREVOVElGSUVSKF9fZ2V0aXRlbV9fKTsKIF9QeV9JREVOVElGSUVSKF9faGFzaF9fKTsKK19QeV9JREVOVElGSUVSKF9faW5pdF9zdWJjbGFzc19fKTsKIF9QeV9JREVOVElGSUVSKF9fbGVuX18pOwogX1B5X0lERU5USUZJRVIoX19tb2R1bGVfXyk7CiBfUHlfSURFTlRJRklFUihfX25hbWVfXyk7CiBfUHlfSURFTlRJRklFUihfX25ld19fKTsKK19QeV9JREVOVElGSUVSKF9fc2V0X25hbWVfXyk7CiBfUHlfSURFTlRJRklFUihfX3NldGl0ZW1fXyk7CiBfUHlfSURFTlRJRklFUihidWlsdGlucyk7CiAKQEAgLTQ2MCw3ICs0NjIsNyBAQAogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiX19tb2R1bGVfXyIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgUHlfWElOQ1JFRihtb2QpOworICAgICAgICBQeV9JTkNSRUYobW9kKTsKICAgICAgICAgcmV0dXJuIG1vZDsKICAgICB9CiAgICAgZWxzZSB7CkBAIC01MDAsNyArNTAyLDcgQEAKICAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbWVzc2FnZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBQeV9YSU5DUkVGKG1vZCk7CisgICAgUHlfSU5DUkVGKG1vZCk7CiAgICAgcmV0dXJuIG1vZDsKIH0KIApAQCAtNTQ3LDggKzU0OSw4IEBACiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgKmJlc3RfYmFzZShQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgbXJvX2ludGVybmFsKFB5VHlwZU9iamVjdCAqLCBQeU9iamVjdCAqKik7Ci1QeV9MT0NBTF9JTkxJTkUoaW50KSB0eXBlX2lzX3N1YnR5cGVfYmFzZV9jaGFpbihQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwotc3RhdGljIGludCBjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KFB5VHlwZU9iamVjdCAqLCBQeVR5cGVPYmplY3QgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgdHlwZV9pc19zdWJ0eXBlX2Jhc2VfY2hhaW4oUHlUeXBlT2JqZWN0ICosIFB5VHlwZU9iamVjdCAqKTsKK3N0YXRpYyBpbnQgY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgaW50IGFkZF9zdWJjbGFzcyhQeVR5cGVPYmplY3QqLCBQeVR5cGVPYmplY3QqKTsKIHN0YXRpYyBpbnQgYWRkX2FsbF9zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmJhc2VzKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9zdWJjbGFzcyhQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwpAQCAtODg4LDI1ICs4OTAsMzMgQEAKICNlbmRpZgogCiAgICAgb2JqID0gdHlwZS0+dHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotICAgIGlmIChvYmogIT0gTlVMTCkgewotICAgICAgICAvKiBVZ2x5IGV4Y2VwdGlvbjogd2hlbiB0aGUgY2FsbCB3YXMgdHlwZShzb21ldGhpbmcpLAotICAgICAgICAgICBkb24ndCBjYWxsIHRwX2luaXQgb24gdGhlIHJlc3VsdC4gKi8KLSAgICAgICAgaWYgKHR5cGUgPT0gJlB5VHlwZV9UeXBlICYmCi0gICAgICAgICAgICBQeVR1cGxlX0NoZWNrKGFyZ3MpICYmIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSAmJgotICAgICAgICAgICAgKGt3ZHMgPT0gTlVMTCB8fAotICAgICAgICAgICAgIChQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgPT0gMCkpKQotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgLyogSWYgdGhlIHJldHVybmVkIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdHlwZSwKLSAgICAgICAgICAgaXQgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuICovCi0gICAgICAgIGlmICghUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iaiksIHR5cGUpKQotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgdHlwZSA9IFB5X1RZUEUob2JqKTsKLSAgICAgICAgaWYgKHR5cGUtPnRwX2luaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgaW50IHJlcyA9IHR5cGUtPnRwX2luaXQob2JqLCBhcmdzLCBrd2RzKTsKLSAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7Ci0gICAgICAgICAgICAgICAgb2JqID0gTlVMTDsKLSAgICAgICAgICAgIH0KKyAgICBvYmogPSBfUHlfQ2hlY2tGdW5jdGlvblJlc3VsdCgoUHlPYmplY3QqKXR5cGUsIG9iaiwgTlVMTCk7CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFVnbHkgZXhjZXB0aW9uOiB3aGVuIHRoZSBjYWxsIHdhcyB0eXBlKHNvbWV0aGluZyksCisgICAgICAgZG9uJ3QgY2FsbCB0cF9pbml0IG9uIHRoZSByZXN1bHQuICovCisgICAgaWYgKHR5cGUgPT0gJlB5VHlwZV9UeXBlICYmCisgICAgICAgIFB5VHVwbGVfQ2hlY2soYXJncykgJiYgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxICYmCisgICAgICAgIChrd2RzID09IE5VTEwgfHwKKyAgICAgICAgIChQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgPT0gMCkpKQorICAgICAgICByZXR1cm4gb2JqOworCisgICAgLyogSWYgdGhlIHJldHVybmVkIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdHlwZSwKKyAgICAgICBpdCB3b24ndCBiZSBpbml0aWFsaXplZC4gKi8KKyAgICBpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYmopLCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIG9iajsKKworICAgIHR5cGUgPSBQeV9UWVBFKG9iaik7CisgICAgaWYgKHR5cGUtPnRwX2luaXQgIT0gTlVMTCkgeworICAgICAgICBpbnQgcmVzID0gdHlwZS0+dHBfaW5pdChvYmosIGFyZ3MsIGt3ZHMpOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOworICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgICAgICBvYmogPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KCFQeUVycl9PY2N1cnJlZCgpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb2JqOwpAQCAtMTMyMyw3ICsxMzMzLDcgQEAKIAogLyogdHlwZSB0ZXN0IHdpdGggc3ViY2xhc3Npbmcgc3VwcG9ydCAqLwogCi1QeV9MT0NBTF9JTkxJTkUoaW50KQorc3RhdGljIGludAogdHlwZV9pc19zdWJ0eXBlX2Jhc2VfY2hhaW4oUHlUeXBlT2JqZWN0ICphLCBQeVR5cGVPYmplY3QgKmIpCiB7CiAgICAgZG8gewpAQCAtMTQxMSwzNiArMTQyMSwzOCBAQAogICAgYXMgbG9va3VwX21ldGhvZCB0byBjYWNoZSB0aGUgaW50ZXJuZWQgbmFtZSBzdHJpbmcgb2JqZWN0LiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgotY2FsbF9tZXRob2QoUHlPYmplY3QgKm8sIF9QeV9JZGVudGlmaWVyICpuYW1laWQsIGNoYXIgKmZvcm1hdCwgLi4uKQorY2FsbF9tZXRob2QoUHlPYmplY3QgKm8sIF9QeV9JZGVudGlmaWVyICpuYW1laWQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogICAgIHZhX2xpc3QgdmE7Ci0gICAgUHlPYmplY3QgKmFyZ3MsICpmdW5jID0gMCwgKnJldHZhbDsKLSAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICBQeU9iamVjdCAqZnVuYyA9IE5VTEwsICpyZXR2YWw7CiAKICAgICBmdW5jID0gbG9va3VwX21heWJlKG8sIG5hbWVpZCk7CiAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgewotICAgICAgICB2YV9lbmQodmEpOwogICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWVpZC0+b2JqZWN0KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKGZvcm1hdCAmJiAqZm9ybWF0KQorICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkgeworICAgICAgICBQeU9iamVjdCAqYXJnczsKKworICAgICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKICAgICAgICAgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKLSAgICBlbHNlCi0gICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgdmFfZW5kKHZhKTsKIAotICAgIHZhX2VuZCh2YSk7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKIAotICAgIGlmIChhcmdzID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dmFsID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dmFsID0gX1B5T2JqZWN0X0NhbGxOb0FyZyhmdW5jKTsKICAgICB9CiAKLSAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0gICAgcmV0dmFsID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLQotICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICBQeV9ERUNSRUYoZnVuYyk7CiAKICAgICByZXR1cm4gcmV0dmFsOwpAQCAtMTQ0OSwzNiArMTQ2MSwzOCBAQAogLyogQ2xvbmUgb2YgY2FsbF9tZXRob2QoKSB0aGF0IHJldHVybnMgTm90SW1wbGVtZW50ZWQgd2hlbiB0aGUgbG9va3VwIGZhaWxzLiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgotY2FsbF9tYXliZShQeU9iamVjdCAqbywgX1B5X0lkZW50aWZpZXIgKm5hbWVpZCwgY2hhciAqZm9ybWF0LCAuLi4pCitjYWxsX21heWJlKFB5T2JqZWN0ICpvLCBfUHlfSWRlbnRpZmllciAqbmFtZWlkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKICAgICB2YV9saXN0IHZhOwotICAgIFB5T2JqZWN0ICphcmdzLCAqZnVuYyA9IDAsICpyZXR2YWw7Ci0gICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgUHlPYmplY3QgKmZ1bmMgPSBOVUxMLCAqcmV0dmFsOwogCiAgICAgZnVuYyA9IGxvb2t1cF9tYXliZShvLCBuYW1laWQpOwogICAgIGlmIChmdW5jID09IE5VTEwpIHsKLSAgICAgICAgdmFfZW5kKHZhKTsKICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgUHlfUkVUVVJOX05PVElNUExFTUVOVEVEOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpCisgICAgaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7CisgICAgICAgIFB5T2JqZWN0ICphcmdzOworCisgICAgICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOwogICAgICAgICBhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOwotICAgIGVsc2UKLSAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICB2YV9lbmQodmEpOwogCi0gICAgdmFfZW5kKHZhKTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwogCi0gICAgaWYgKGFyZ3MgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR2YWwgPSBfUHlPYmplY3RfQ2FsbE5vQXJnKGZ1bmMpOwogICAgIH0KIAotICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLSAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotCi0gICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIFB5X0RFQ1JFRihmdW5jKTsKIAogICAgIHJldHVybiByZXR2YWw7CkBAIC0xNTMwLDcgKzE1NDQsNiBAQAogICAgIFB5T2JqZWN0ICpuYW1lID0gX1B5T2JqZWN0X0dldEF0dHJJZChjbHMsICZQeUlkX19fbmFtZV9fKTsKICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIFB5X1hERUNSRUYobmFtZSk7CiAgICAgICAgIG5hbWUgPSBQeU9iamVjdF9SZXByKGNscyk7CiAgICAgfQogICAgIGlmIChuYW1lID09IE5VTEwpCkBAIC0yMDI0LDYgKzIwMzcsOCBAQAogc3RhdGljIGludCBvYmplY3RfaW5pdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgdXBkYXRlX3Nsb3QoUHlUeXBlT2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIHZvaWQgZml4dXBfc2xvdF9kaXNwYXRjaGVycyhQeVR5cGVPYmplY3QgKik7CitzdGF0aWMgaW50IHNldF9uYW1lcyhQeVR5cGVPYmplY3QgKik7CitzdGF0aWMgaW50IGluaXRfc3ViY2xhc3MoUHlUeXBlT2JqZWN0ICosIFB5T2JqZWN0ICopOwogCiAvKgogICogSGVscGVycyBmb3IgIF9fZGljdF9fIGRlc2NyaXB0b3IuICBXZSBkb24ndCB3YW50IHRvIGV4cG9zZSB0aGUgZGljdHMKQEAgLTIwODgsNyArMjEwMyw3IEBACiBzdGF0aWMgaW50CiBzdWJ0eXBlX3NldGRpY3QoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjb250ZXh0KQogewotICAgIFB5T2JqZWN0ICpkaWN0LCAqKmRpY3RwdHI7CisgICAgUHlPYmplY3QgKipkaWN0cHRyOwogICAgIFB5VHlwZU9iamVjdCAqYmFzZTsKIAogICAgIGJhc2UgPSBnZXRfYnVpbHRpbl9iYXNlX3dpdGhfZGljdChQeV9UWVBFKG9iaikpOwpAQCAtMjExOSwxMCArMjEzNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAibm90IGEgJyUuMjAwcyciLCBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgZGljdCA9ICpkaWN0cHRyOwogICAgIFB5X1hJTkNSRUYodmFsdWUpOwotICAgICpkaWN0cHRyID0gdmFsdWU7Ci0gICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICBQeV9YU0VUUkVGKCpkaWN0cHRyLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTIyMDEsNyArMjIxNCw4IEBACiAgICAgYXNzZXJ0KGFyZ3MgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKICAgICBhc3NlcnQoa3dkcyA9PSBOVUxMIHx8IFB5RGljdF9DaGVjayhrd2RzKSk7CiAKLSAgICBpZiAoa3dkcyAhPSBOVUxMICYmIFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSAhPSAwKSB7CisgICAgaWYgKGt3ZHMgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpICYmIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSAmJgorICAgICAgICBQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgIT0gMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUuX19pbml0X18oKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50cyIpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yMjY4LDcgKzIyODIsNiBAQAogdHlwZV9uZXcoUHlUeXBlT2JqZWN0ICptZXRhdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewogICAgIFB5T2JqZWN0ICpuYW1lLCAqYmFzZXMgPSBOVUxMLCAqb3JpZ19kaWN0LCAqZGljdCA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJuYW1lIiwgImJhc2VzIiwgImRpY3QiLCAwfTsKICAgICBQeU9iamVjdCAqcXVhbG5hbWUsICpzbG90cyA9IE5VTEwsICp0bXAsICpuZXdzbG90czsKICAgICBQeVR5cGVPYmplY3QgKnR5cGUgPSBOVUxMLCAqYmFzZSwgKnRtcHR5cGUsICp3aW5uZXI7CiAgICAgUHlIZWFwVHlwZU9iamVjdCAqZXQ7CkBAIC0yMjgyLDExICsyMjk1LDEzIEBACiAgICAgYXNzZXJ0KGt3ZHMgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa3dkcykpOwogCiAgICAgLyogU3BlY2lhbCBjYXNlOiB0eXBlKHgpIHNob3VsZCByZXR1cm4geC0+b2JfdHlwZSAqLwotICAgIHsKKyAgICAvKiBXZSBvbmx5IHdhbnQgdHlwZSBpdHNlbGYgdG8gYWNjZXB0IHRoZSBvbmUtYXJndW1lbnQgZm9ybSAoIzI3MTU3KQorICAgICAgIE5vdGU6IFdlIGRvbid0IGNhbGwgUHlUeXBlX0NoZWNrRXhhY3QgYXMgdGhhdCBhbHNvIGFsbG93cyBzdWJjbGFzc2VzICovCisgICAgaWYgKG1ldGF0eXBlID09ICZQeVR5cGVfVHlwZSkgewogICAgICAgICBjb25zdCBQeV9zc2l6ZV90IG5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKICAgICAgICAgY29uc3QgUHlfc3NpemVfdCBua3dkcyA9IGt3ZHMgPT0gTlVMTCA/IDAgOiBQeURpY3RfU2l6ZShrd2RzKTsKIAotICAgICAgICBpZiAoUHlUeXBlX0NoZWNrRXhhY3QobWV0YXR5cGUpICYmIG5hcmdzID09IDEgJiYgbmt3ZHMgPT0gMCkgeworICAgICAgICBpZiAobmFyZ3MgPT0gMSAmJiBua3dkcyA9PSAwKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqeCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CiAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfVFlQRSh4KSk7CiAgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIFB5X1RZUEUoeCk7CkBAIC0yMjk1LDcgKzIzMTAsNyBAQAogICAgICAgICAvKiBTRiBidWcgNDc1MzI3IC0tIGlmIHRoYXQgZGlkbid0IHRyaWdnZXIsIHdlIG5lZWQgMwogICAgICAgICAgICBhcmd1bWVudHMuIGJ1dCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMgYmVsb3cgbWF5IGdpdmUKICAgICAgICAgICAgYSBtc2cgc2F5aW5nIHR5cGUoKSBuZWVkcyBleGFjdGx5IDMuICovCi0gICAgICAgIGlmIChuYXJncyArIG5rd2RzICE9IDMpIHsKKyAgICAgICAgaWYgKG5hcmdzICE9IDMpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUoKSB0YWtlcyAxIG9yIDMgYXJndW1lbnRzIik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTIzMDMsMTAgKzIzMTgsOCBAQAogICAgIH0KIAogICAgIC8qIENoZWNrIGFyZ3VtZW50czogKG5hbWUsIGJhc2VzLCBkaWN0KSAqLwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJVTyFPITp0eXBlIiwga3dsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVR1cGxlX1R5cGUsICZiYXNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlEaWN0X1R5cGUsICZvcmlnX2RpY3QpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVU8hTyE6dHlwZS5fX25ld19fIiwgJm5hbWUsICZQeVR1cGxlX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXNlcywgJlB5RGljdF9UeXBlLCAmb3JpZ19kaWN0KSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAvKiBEZXRlcm1pbmUgdGhlIHByb3BlciBtZXRhdHlwZSB0byBkZWFsIHdpdGggdGhpczogKi8KQEAgLTI1ODYsNiArMjU5OSwyMCBAQAogICAgICAgICBQeV9ERUNSRUYodG1wKTsKICAgICB9CiAKKyAgICAvKiBTcGVjaWFsLWNhc2UgX19pbml0X3N1YmNsYXNzX186IGlmIGl0J3MgYSBwbGFpbiBmdW5jdGlvbiwKKyAgICAgICBtYWtlIGl0IGEgY2xhc3NtZXRob2QgKi8KKyAgICB0bXAgPSBfUHlEaWN0X0dldEl0ZW1JZChkaWN0LCAmUHlJZF9fX2luaXRfc3ViY2xhc3NfXyk7CisgICAgaWYgKHRtcCAhPSBOVUxMICYmIFB5RnVuY3Rpb25fQ2hlY2sodG1wKSkgeworICAgICAgICB0bXAgPSBQeUNsYXNzTWV0aG9kX05ldyh0bXApOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAoX1B5RGljdF9TZXRJdGVtSWQoZGljdCwgJlB5SWRfX19pbml0X3N1YmNsYXNzX18sIHRtcCkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgfQorCiAgICAgLyogQWRkIGRlc2NyaXB0b3JzIGZvciBjdXN0b20gc2xvdHMgZnJvbSBfX3Nsb3RzX18sIG9yIGZvciBfX2RpY3RfXyAqLwogICAgIG1wID0gUHlIZWFwVHlwZV9HRVRfTUVNQkVSUyhldCk7CiAgICAgc2xvdG9mZnNldCA9IGJhc2UtPnRwX2Jhc2ljc2l6ZTsKQEAgLTI2NjYsNiArMjY5MywxMiBAQAogICAgICAgICBldC0+aHRfY2FjaGVkX2tleXMgPSBfUHlEaWN0X05ld0tleXNGb3JDbGFzcygpOwogICAgIH0KIAorICAgIGlmIChzZXRfbmFtZXModHlwZSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKGluaXRfc3ViY2xhc3ModHlwZSwga3dkcykgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCiAgICAgUHlfREVDUkVGKGRpY3QpOwogICAgIHJldHVybiAoUHlPYmplY3QgKil0eXBlOwogCkBAIC0yNjc3LDcgKzI3MTAsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc2hvcnQgc2xvdG9mZnNldHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzaG9ydCBzbG90b2Zmc2V0c1tdID0gewogICAgIC0xLCAvKiBpbnZhbGlkIHNsb3QgKi8KICNpbmNsdWRlICJ0eXBlc2xvdHMuaW5jIgogfTsKQEAgLTM1OTYsNyArMzYyOSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQoUHlUeXBlT2JqZWN0KiBvbGR0bywgUHlUeXBlT2JqZWN0KiBuZXd0bywgY2hhciogYXR0cikKK2NvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQoUHlUeXBlT2JqZWN0KiBvbGR0bywgUHlUeXBlT2JqZWN0KiBuZXd0bywgY29uc3QgY2hhciogYXR0cikKIHsKICAgICBQeVR5cGVPYmplY3QgKm5ld2Jhc2UsICpvbGRiYXNlOwogCkBAIC0zNzcyLDcgKzM4MDUsNyBAQAogICAgIHJldHVybiBQeUltcG9ydF9JbXBvcnQoY29weXJlZ19zdHIpOwogfQogCi1QeV9MT0NBTChQeU9iamVjdCAqKQorc3RhdGljIFB5T2JqZWN0ICoKIF9QeVR5cGVfR2V0U2xvdE5hbWVzKFB5VHlwZU9iamVjdCAqY2xzKQogewogICAgIFB5T2JqZWN0ICpjb3B5cmVnOwpAQCAtMzgyNSw3ICszODU4LDcgQEAKICAgICByZXR1cm4gc2xvdG5hbWVzOwogfQogCi1QeV9MT0NBTChQeU9iamVjdCAqKQorc3RhdGljIFB5T2JqZWN0ICoKIF9QeU9iamVjdF9HZXRTdGF0ZShQeU9iamVjdCAqb2JqLCBpbnQgcmVxdWlyZWQpCiB7CiAgICAgUHlPYmplY3QgKnN0YXRlOwpAQCAtMzg3Miw2ICszOTA1LDI0IEBACiAgICAgICAgIH0KIAogICAgICAgICBhc3NlcnQoc2xvdG5hbWVzID09IFB5X05vbmUgfHwgUHlMaXN0X0NoZWNrKHNsb3RuYW1lcykpOworICAgICAgICBpZiAocmVxdWlyZWQpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgYmFzaWNzaXplID0gUHlCYXNlT2JqZWN0X1R5cGUudHBfYmFzaWNzaXplOworICAgICAgICAgICAgaWYgKG9iai0+b2JfdHlwZS0+dHBfZGljdG9mZnNldCkKKyAgICAgICAgICAgICAgICBiYXNpY3NpemUgKz0gc2l6ZW9mKFB5T2JqZWN0ICopOworICAgICAgICAgICAgaWYgKG9iai0+b2JfdHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQpCisgICAgICAgICAgICAgICAgYmFzaWNzaXplICs9IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICAgICAgICAgIGlmIChzbG90bmFtZXMgIT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICBiYXNpY3NpemUgKz0gc2l6ZW9mKFB5T2JqZWN0ICopICogUHlfU0laRShzbG90bmFtZXMpOworICAgICAgICAgICAgaWYgKG9iai0+b2JfdHlwZS0+dHBfYmFzaWNzaXplID4gYmFzaWNzaXplKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNsb3RuYW1lcyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0YXRlKTsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgcGlja2xlICUuMjAwcyBvYmplY3RzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChzbG90bmFtZXMgIT0gUHlfTm9uZSAmJiBQeV9TSVpFKHNsb3RuYW1lcykgPiAwKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqc2xvdHM7CiAgICAgICAgICAgICBQeV9zc2l6ZV90IHNsb3RuYW1lc19zaXplLCBpOwpAQCAtMzkyNiw3ICszOTc3LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogSWYgd2UgZm91bmQgc29tZSBzbG90IGF0dHJpYnV0ZXMsIHBhY2sgdGhlbSBpbiBhIHR1cGxlIGFsb25nCi0gICAgICAgICAgICAgICB0aGUgb3JnaW5hbCBhdHRyaWJ1dGUgZGljdGlvbmFyeS4gKi8KKyAgICAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBhdHRyaWJ1dGUgZGljdGlvbmFyeS4gKi8KICAgICAgICAgICAgIGlmIChQeURpY3RfU2l6ZShzbG90cykgPiAwKSB7CiAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnN0YXRlMjsKIApAQCAtMzk1Myw3ICs0MDA0LDcgQEAKICAgICByZXR1cm4gc3RhdGU7CiB9CiAKLVB5X0xPQ0FMKGludCkKK3N0YXRpYyBpbnQKIF9QeU9iamVjdF9HZXROZXdBcmd1bWVudHMoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKiphcmdzLCBQeU9iamVjdCAqKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqZ2V0bmV3YXJncywgKmdldG5ld2FyZ3NfZXg7CkBAIC00MDQ5LDcgKzQxMDAsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1QeV9MT0NBTChpbnQpCitzdGF0aWMgaW50CiBfUHlPYmplY3RfR2V0SXRlbXNJdGVyKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICoqbGlzdGl0ZW1zLAogICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKmRpY3RpdGVtcykKIHsKQEAgLTQwOTUsNyArNDE0Niw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1yZWR1Y2VfbmV3b2JqKFB5T2JqZWN0ICpvYmosIGludCBwcm90bykKK3JlZHVjZV9uZXdvYmooUHlPYmplY3QgKm9iaikKIHsKICAgICBQeU9iamVjdCAqYXJncyA9IE5VTEwsICprd2FyZ3MgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpjb3B5cmVnOwpAQCAtNDE0OCw3ICs0MTk5LDcgQEAKICAgICAgICAgfQogICAgICAgICBQeV9YREVDUkVGKGFyZ3MpOwogICAgIH0KLSAgICBlbHNlIGlmIChwcm90byA+PSA0KSB7CisgICAgZWxzZSBpZiAoYXJncyAhPSBOVUxMKSB7CiAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3b2JqX2V4X18pOwogCiAgICAgICAgIG5ld29iaiA9IF9QeU9iamVjdF9HZXRBdHRySWQoY29weXJlZywgJlB5SWRfX19uZXdvYmpfZXhfXyk7CkBAIC00MTY3LDEzICs0MjE4LDkgQEAKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAibXVzdCB1c2UgcHJvdG9jb2wgNCBvciBncmVhdGVyIHRvIGNvcHkgdGhpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0OyBzaW5jZSBfX2dldG5ld2FyZ3NfZXhfXyByZXR1cm5lZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZCBhcmd1bWVudHMuIik7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgLyogYXJncyA9PSBOVUxMICovCiAgICAgICAgIFB5X0RFQ1JFRihrd2FyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoY29weXJlZyk7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTQyMjEsNyArNDI2OCw3IEBACiAgICAgUHlPYmplY3QgKmNvcHlyZWcsICpyZXM7CiAKICAgICBpZiAocHJvdG8gPj0gMikKLSAgICAgICAgcmV0dXJuIHJlZHVjZV9uZXdvYmooc2VsZiwgcHJvdG8pOworICAgICAgICByZXR1cm4gcmVkdWNlX25ld29iaihzZWxmKTsKIAogICAgIGNvcHlyZWcgPSBpbXBvcnRfY29weXJlZygpOwogICAgIGlmICghY29weXJlZykKQEAgLTQzMDMsNiArNDM1MCwxOCBAQAogIk5vdEltcGxlbWVudGVkLCB0aGUgbm9ybWFsIGFsZ29yaXRobSBpcyB1c2VkLiAgT3RoZXJ3aXNlLCBpdFxuIgogIm92ZXJyaWRlcyB0aGUgbm9ybWFsIGFsZ29yaXRobSAoYW5kIHRoZSBvdXRjb21lIGlzIGNhY2hlZCkuXG4iKTsKIAorc3RhdGljIFB5T2JqZWN0ICoKK29iamVjdF9pbml0X3N1YmNsYXNzKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmcpCit7CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK1B5RG9jX1NUUlZBUihvYmplY3RfaW5pdF9zdWJjbGFzc19kb2MsCisiVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBjbGFzcyBpcyBzdWJjbGFzc2VkLlxuIgorIlxuIgorIlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gSXQgbWF5IGJlXG4iCisib3ZlcnJpZGRlbiB0byBleHRlbmQgc3ViY2xhc3Nlcy5cbiIpOworCiAvKgogICAgZnJvbSBQRVAgMzEwMSwgdGhpcyBjb2RlIGltcGxlbWVudHM6CiAKQEAgLTQ0MDcsNiArNDQ2Niw4IEBACiAgICAgIFB5RG9jX1NUUigiaGVscGVyIGZvciBwaWNrbGUiKX0sCiAgICAgeyJfX3N1YmNsYXNzaG9va19fIiwgb2JqZWN0X3N1YmNsYXNzaG9vaywgTUVUSF9DTEFTUyB8IE1FVEhfVkFSQVJHUywKICAgICAgb2JqZWN0X3N1YmNsYXNzaG9va19kb2N9LAorICAgIHsiX19pbml0X3N1YmNsYXNzX18iLCBvYmplY3RfaW5pdF9zdWJjbGFzcywgTUVUSF9DTEFTUyB8IE1FVEhfTk9BUkdTLAorICAgICBvYmplY3RfaW5pdF9zdWJjbGFzc19kb2N9LAogICAgIHsiX19mb3JtYXRfXyIsIG9iamVjdF9mb3JtYXQsIE1FVEhfVkFSQVJHUywKICAgICAgUHlEb2NfU1RSKCJkZWZhdWx0IG9iamVjdCBmb3JtYXR0ZXIiKX0sCiAgICAgeyJfX3NpemVvZl9fIiwgb2JqZWN0X3NpemVvZiwgTUVUSF9OT0FSR1MsCkBAIC01MzUyLDcgKzU0MTMsNyBAQAogLyogSGVscGVyIHRvIGNoZWNrIGZvciBvYmplY3QuX19zZXRhdHRyX18gb3IgX19kZWxhdHRyX18gYXBwbGllZCB0byBhIHR5cGUuCiAgICBUaGlzIGlzIGNhbGxlZCB0aGUgQ2FybG8gVmVycmUgaGFjayBhZnRlciBpdHMgZGlzY292ZXJlci4gKi8KIHN0YXRpYyBpbnQKLWhhY2tjaGVjayhQeU9iamVjdCAqc2VsZiwgc2V0YXR0cm9mdW5jIGZ1bmMsIGNoYXIgKndoYXQpCitoYWNrY2hlY2soUHlPYmplY3QgKnNlbGYsIHNldGF0dHJvZnVuYyBmdW5jLCBjb25zdCBjaGFyICp3aGF0KQogewogICAgIFB5VHlwZU9iamVjdCAqdHlwZSA9IFB5X1RZUEUoc2VsZik7CiAgICAgd2hpbGUgKHR5cGUgJiYgdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQpAQCAtNTYzOSw3ICs1NzAwLDcgQEAKIEZVTkNOQU1FKFB5T2JqZWN0ICpzZWxmKSBcCiB7IFwKICAgICBfUHlfc3RhdGljX3N0cmluZyhpZCwgT1BTVFIpOyBcCi0gICAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICZpZCwgIigpIik7IFwKKyAgICByZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgJmlkLCBOVUxMKTsgXAogfQogCiAjZGVmaW5lIFNMT1QxKEZVTkNOQU1FLCBPUFNUUiwgQVJHMVRZUEUsIEFSR0NPREVTKSBcCkBAIC01NzMyLDcgKzU3OTMsNyBAQAogc3RhdGljIFB5X3NzaXplX3QKIHNsb3Rfc3FfbGVuZ3RoKFB5T2JqZWN0ICpzZWxmKQogewotICAgIFB5T2JqZWN0ICpyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAmUHlJZF9fX2xlbl9fLCAiKCkiKTsKKyAgICBQeU9iamVjdCAqcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgJlB5SWRfX19sZW5fXywgTlVMTCk7CiAgICAgUHlfc3NpemVfdCBsZW47CiAKICAgICBpZiAocmVzID09IE5VTEwpCkBAIC01NzUzLDM4ICs1ODE0LDM5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF9zcV9pdGVtKFB5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGkpCiB7Ci0gICAgUHlPYmplY3QgKmZ1bmMsICphcmdzID0gTlVMTCwgKml2YWwgPSBOVUxMLCAqcmV0dmFsID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZnVuYywgKml2YWwgPSBOVUxMLCAqcmV0dmFsID0gTlVMTDsKICAgICBkZXNjcmdldGZ1bmMgZjsKIAogICAgIGZ1bmMgPSBfUHlUeXBlX0xvb2t1cElkKFB5X1RZUEUoc2VsZiksICZQeUlkX19fZ2V0aXRlbV9fKTsKLSAgICBpZiAoZnVuYyAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgoZiA9IFB5X1RZUEUoZnVuYyktPnRwX2Rlc2NyX2dldCkgPT0gTlVMTCkKLSAgICAgICAgICAgIFB5X0lOQ1JFRihmdW5jKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmdW5jID0gZihmdW5jLCBzZWxmLCAoUHlPYmplY3QgKikoUHlfVFlQRShzZWxmKSkpOwotICAgICAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGl2YWwgPSBQeUxvbmdfRnJvbVNzaXplX3QoaSk7Ci0gICAgICAgIGlmIChpdmFsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygxKTsKLSAgICAgICAgICAgIGlmIChhcmdzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDAsIGl2YWwpOwotICAgICAgICAgICAgICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgUHlfWERFQ1JFRihhcmdzKTsKLSAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgewogICAgICAgICBQeU9iamVjdCAqZ2V0aXRlbV9zdHIgPSBfUHlVbmljb2RlX0Zyb21JZCgmUHlJZF9fX2dldGl0ZW1fXyk7CiAgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgZ2V0aXRlbV9zdHIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlfWERFQ1JFRihhcmdzKTsKLSAgICBQeV9YREVDUkVGKGl2YWwpOwotICAgIFB5X1hERUNSRUYoZnVuYyk7CisKKyAgICBmID0gUHlfVFlQRShmdW5jKS0+dHBfZGVzY3JfZ2V0OworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnVuYyA9IGYoZnVuYywgc2VsZiwgKFB5T2JqZWN0ICopKFB5X1RZUEUoc2VsZikpKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpdmFsID0gUHlMb25nX0Zyb21Tc2l6ZV90KGkpOworICAgIGlmIChpdmFsID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXR2YWwgPSBfUHlPYmplY3RfQ2FsbEFyZzEoZnVuYywgaXZhbCk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIFB5X0RFQ1JFRihpdmFsKTsKKyAgICByZXR1cm4gcmV0dmFsOworCitlcnJvcjoKKyAgICBQeV9ERUNSRUYoZnVuYyk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTU4MDYsMTkgKzU4NjgsMjAgQEAKIHN0YXRpYyBpbnQKIHNsb3Rfc3FfY29udGFpbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBQeU9iamVjdCAqZnVuYywgKnJlcywgKmFyZ3M7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXM7CiAgICAgaW50IHJlc3VsdCA9IC0xOwogICAgIF9QeV9JREVOVElGSUVSKF9fY29udGFpbnNfXyk7CiAKICAgICBmdW5jID0gbG9va3VwX21heWJlKHNlbGYsICZQeUlkX19fY29udGFpbnNfXyk7CisgICAgaWYgKGZ1bmMgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBhIGNvbnRhaW5lciIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICAgICBpZiAoZnVuYyAhPSBOVUxMKSB7Ci0gICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdmFsdWUpOwotICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICAgICAgcmVzID0gTlVMTDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICB9CisgICAgICAgIHJlcyA9IF9QeU9iamVjdF9DYWxsQXJnMShmdW5jLCB2YWx1ZSk7CiAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKICAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKQEAgLTU4ODksNDQgKzU5NTIsNTQgQEAKIHN0YXRpYyBpbnQKIHNsb3RfbmJfYm9vbChQeU9iamVjdCAqc2VsZikKIHsKLSAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3M7Ci0gICAgaW50IHJlc3VsdCA9IC0xOworICAgIFB5T2JqZWN0ICpmdW5jLCAqdmFsdWU7CisgICAgaW50IHJlc3VsdDsKICAgICBpbnQgdXNpbmdfbGVuID0gMDsKICAgICBfUHlfSURFTlRJRklFUihfX2Jvb2xfXyk7CiAKICAgICBmdW5jID0gbG9va3VwX21heWJlKHNlbGYsICZQeUlkX19fYm9vbF9fKTsKICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKICAgICAgICAgZnVuYyA9IGxvb2t1cF9tYXliZShzZWxmLCAmUHlJZF9fX2xlbl9fKTsKLSAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBQeUVycl9PY2N1cnJlZCgpID8gLTEgOiAxOworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAgICAgICAgIHVzaW5nX2xlbiA9IDE7CiAgICAgfQotICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLSAgICBpZiAoYXJncyAhPSBOVUxMKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAodGVtcCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAodXNpbmdfbGVuKSB7Ci0gICAgICAgICAgICAgICAgLyogZW5mb3JjZWQgYnkgc2xvdF9uYl9sZW4gKi8KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9Jc1RydWUodGVtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChQeUJvb2xfQ2hlY2sodGVtcCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9Jc1RydWUodGVtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19ib29sX18gc2hvdWxkIHJldHVybiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJib29sLCByZXR1cm5lZCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodGVtcCktPnRwX25hbWUpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOwotICAgICAgICB9CisKKyAgICB2YWx1ZSA9IF9QeU9iamVjdF9DYWxsTm9BcmcoZnVuYyk7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CisKKyAgICBpZiAodXNpbmdfbGVuKSB7CisgICAgICAgIC8qIGJvb2wgdHlwZSBlbmZvcmNlZCBieSBzbG90X25iX2xlbiAqLworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9Jc1RydWUodmFsdWUpOworICAgIH0KKyAgICBlbHNlIGlmIChQeUJvb2xfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIl9fYm9vbF9fIHNob3VsZCByZXR1cm4gIgorICAgICAgICAgICAgICAgICAgICAgImJvb2wsIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgfQorCisgICAgUHlfREVDUkVGKHZhbHVlKTsKICAgICBQeV9ERUNSRUYoZnVuYyk7CiAgICAgcmV0dXJuIHJlc3VsdDsKKworZXJyb3I6CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiAtMTsKIH0KIAogCkBAIC01OTM0LDcgKzYwMDcsNyBAQAogc2xvdF9uYl9pbmRleChQeU9iamVjdCAqc2VsZikKIHsKICAgICBfUHlfSURFTlRJRklFUihfX2luZGV4X18pOwotICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAmUHlJZF9fX2luZGV4X18sICIoKSIpOworICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAmUHlJZF9fX2luZGV4X18sIE5VTEwpOwogfQogCiAKQEAgLTYxNzEsMjAgKzYyNDQsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX3JpY2hjb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLSAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3MsICpyZXM7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXM7CiAKICAgICBmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAmbmFtZV9vcFtvcF0pOwogICAgIGlmIChmdW5jID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgUHlfUkVUVVJOX05PVElNUExFTUVOVEVEOwogICAgIH0KLSAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIG90aGVyKTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICByZXMgPSBOVUxMOwotICAgIGVsc2UgewotICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgfQorICAgIHJlcyA9IF9QeU9iamVjdF9DYWxsQXJnMShmdW5jLCBvdGhlcik7CiAgICAgUHlfREVDUkVGKGZ1bmMpOwogICAgIHJldHVybiByZXM7CiB9CkBAIC02MTk2LDE2ICs2MjYzLDIwIEBACiAgICAgX1B5X0lERU5USUZJRVIoX19pdGVyX18pOwogCiAgICAgZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgJlB5SWRfX19pdGVyX18pOworICAgIGlmIChmdW5jID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclLjIwMHMnIG9iamVjdCBpcyBub3QgaXRlcmFibGUiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIGlmIChmdW5jICE9IE5VTEwpIHsKLSAgICAgICAgUHlPYmplY3QgKmFyZ3M7Ci0gICAgICAgIGFyZ3MgPSByZXMgPSBQeVR1cGxlX05ldygwKTsKLSAgICAgICAgaWYgKGFyZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgfQorICAgICAgICByZXMgPSBfUHlPYmplY3RfQ2FsbE5vQXJnKGZ1bmMpOwogICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQorCiAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICBmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAmUHlJZF9fX2dldGl0ZW1fXyk7CiAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgewpAQCAtNjIyMiw3ICs2MjkzLDcgQEAKIHNsb3RfdHBfaXRlcm5leHQoUHlPYmplY3QgKnNlbGYpCiB7CiAgICAgX1B5X0lERU5USUZJRVIoX19uZXh0X18pOwotICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAmUHlJZF9fX25leHRfXywgIigpIik7CisgICAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICZQeUlkX19fbmV4dF9fLCBOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTYyOTEsMjkgKzYzNjIsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLSAgICBQeU9iamVjdCAqZnVuYzsKLSAgICBQeU9iamVjdCAqbmV3YXJncywgKng7Ci0gICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzdWx0OwogCiAgICAgZnVuYyA9IF9QeU9iamVjdF9HZXRBdHRySWQoKFB5T2JqZWN0ICopdHlwZSwgJlB5SWRfX19uZXdfXyk7Ci0gICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLSAgICBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLSAgICBuZXdhcmdzID0gUHlUdXBsZV9OZXcobisxKTsKLSAgICBpZiAobmV3YXJncyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBQeV9JTkNSRUYodHlwZSk7Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmdzLCAwLCAoUHlPYmplY3QgKil0eXBlKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIHggPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotICAgICAgICBQeV9JTkNSRUYoeCk7Ci0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgaSsxLCB4KTsKICAgICB9Ci0gICAgeCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgbmV3YXJncywga3dkcyk7Ci0gICAgUHlfREVDUkVGKG5ld2FyZ3MpOworCisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0NhbGxfUHJlcGVuZChmdW5jLCAoUHlPYmplY3QgKil0eXBlLCBhcmdzLCBrd2RzKTsKICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgcmV0dXJuIHg7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTY5MTYsNiArNjk3NCw1NyBAQAogICAgIH0KIH0KIAorLyogQ2FsbCBfX3NldF9uYW1lX18gb24gYWxsIGRlc2NyaXB0b3JzIGluIGEgbmV3bHkgZ2VuZXJhdGVkIHR5cGUgKi8KK3N0YXRpYyBpbnQKK3NldF9uYW1lcyhQeVR5cGVPYmplY3QgKnR5cGUpCit7CisgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlLCAqdG1wOworICAgIFB5X3NzaXplX3QgaSA9IDA7CisKKyAgICB3aGlsZSAoUHlEaWN0X05leHQodHlwZS0+dHBfZGljdCwgJmksICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHIodmFsdWUsIF9QeVVuaWNvZGVfRnJvbUlkKCZQeUlkX19fc2V0X25hbWVfXykpKSB7CisgICAgICAgICAgICB0bXAgPSBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncygKKyAgICAgICAgICAgICAgICB2YWx1ZSwgX1B5VW5pY29kZV9Gcm9tSWQoJlB5SWRfX19zZXRfbmFtZV9fKSwKKyAgICAgICAgICAgICAgICB0eXBlLCBrZXksIE5VTEwpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiBDYWxsIF9faW5pdF9zdWJjbGFzc19fIG9uIHRoZSBwYXJlbnQgb2YgYSBuZXdseSBnZW5lcmF0ZWQgdHlwZSAqLworc3RhdGljIGludAoraW5pdF9zdWJjbGFzcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqZWN0ICpzdXBlciwgKmZ1bmMsICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmFyZ3NbMl0gPSB7KFB5T2JqZWN0ICopdHlwZSwgKFB5T2JqZWN0ICopdHlwZX07CisKKyAgICBzdXBlciA9IF9QeU9iamVjdF9GYXN0Q2FsbCgoUHlPYmplY3QgKikmUHlTdXBlcl9UeXBlLCBhcmdzLCAyKTsKKyAgICBpZiAoc3VwZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZnVuYyA9IF9QeU9iamVjdF9HZXRBdHRySWQoc3VwZXIsICZQeUlkX19faW5pdF9zdWJjbGFzc19fKTsKKyAgICBQeV9ERUNSRUYoc3VwZXIpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworCisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0Zhc3RDYWxsRGljdChmdW5jLCBOVUxMLCAwLCBrd2RzKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gMDsKK30KKwogLyogcmVjdXJzZV9kb3duX3N1YmNsYXNzZXMoKSBhbmQgdXBkYXRlX3N1YmNsYXNzZXMoKSBhcmUgbXV0dWFsbHkKICAgIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdG8gY2FsbCBhIGNhbGxiYWNrIGZvciBhbGwgc3ViY2xhc3NlcywKICAgIGJ1dCByZWZyYWluaW5nIGZyb20gcmVjdXJzaW5nIGludG8gc3ViY2xhc3NlcyB0aGF0IGRlZmluZSAnbmFtZScuICovCmRpZmYgLS1naXQgYS9PYmplY3RzL3VuaWNvZGVvYmplY3QuYyBiL09iamVjdHMvdW5pY29kZW9iamVjdC5jCmluZGV4IGFmMDQ1NjQuLmUwYzNiZmUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvdW5pY29kZW9iamVjdC5jCisrKyBiL09iamVjdHMvdW5pY29kZW9iamVjdC5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAidWNuaGFzaC5oIgogI2luY2x1ZGUgImJ5dGVzX21ldGhvZHMuaCIKKyNpbmNsdWRlICJzdHJpbmdsaWIvZXEuaCIKIAogI2lmZGVmIE1TX1dJTkRPV1MKICNpbmNsdWRlIDx3aW5kb3dzLmg+CkBAIC0xNjIsNiArMTYzLDE0IEBACiAgICAgICAgICAgICAqX3RvKysgPSAodG9fdHlwZSkgKl9pdGVyKys7ICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlICgwKQogCisjaWZkZWYgTVNfV0lORE9XUworICAgLyogT24gV2luZG93cywgb3ZlcmFsbG9jYXRlIGJ5IDUwJSBpcyB0aGUgYmVzdCBmYWN0b3IgKi8KKyMgIGRlZmluZSBPVkVSQUxMT0NBVEVfRkFDVE9SIDIKKyNlbHNlCisgICAvKiBPbiBMaW51eCwgb3ZlcmFsbG9jYXRlIGJ5IDI1JSBpcyB0aGUgYmVzdCBmYWN0b3IgKi8KKyMgIGRlZmluZSBPVkVSQUxMT0NBVEVfRkFDVE9SIDQKKyNlbmRpZgorCiAvKiBUaGlzIGRpY3Rpb25hcnkgaG9sZHMgYWxsIGludGVybmVkIHVuaWNvZGUgc3RyaW5ncy4gIE5vdGUgdGhhdCByZWZlcmVuY2VzCiAgICB0byBzdHJpbmdzIGluIHRoaXMgZGljdGlvbmFyeSBhcmUgKm5vdCogY291bnRlZCBpbiB0aGUgc3RyaW5nJ3Mgb2JfcmVmY250LgogICAgV2hlbiB0aGUgaW50ZXJuZWQgc3RyaW5nIHJlYWNoZXMgYSByZWZjbnQgb2YgMCB0aGUgc3RyaW5nIGRlYWxsb2NhdGlvbgpAQCAtMTk1LDcgKzIwNCw3IEBACiAgICAgfSB3aGlsZSAoMCkKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotUHlfTE9DQUxfSU5MSU5FKGludCkKK3N0YXRpYyBpbmxpbmUgaW50CiBfUHlVbmljb2RlV3JpdGVyX1dyaXRlQ2hhcklubGluZShfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsIFB5X1VDUzQgY2gpOwogCiAvKiBMaXN0IG9mIHN0YXRpYyBzdHJpbmdzLiAqLwpAQCAtMjYzLDcgKzI3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7CiAKIC8qIFNhbWUgZm9yIGxpbmVicmVha3MgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzY2lpX2xpbmVicmVha1tdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXNjaWlfbGluZWJyZWFrW10gPSB7CiAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIC8qICAgICAgICAgMHgwMDBBLCAqIExJTkUgRkVFRCAqLwogLyogICAgICAgICAweDAwMEIsICogTElORSBUQUJVTEFUSU9OICovCkBAIC0yOTIsNiArMzAxLDQ1IEBACiAKICNpbmNsdWRlICJjbGluaWMvdW5pY29kZW9iamVjdC5jLmgiCiAKK3R5cGVkZWYgZW51bSB7CisgICAgX1B5X0VSUk9SX1VOS05PV049MCwKKyAgICBfUHlfRVJST1JfU1RSSUNULAorICAgIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEUsCisgICAgX1B5X0VSUk9SX1JFUExBQ0UsCisgICAgX1B5X0VSUk9SX0lHTk9SRSwKKyAgICBfUHlfRVJST1JfQkFDS1NMQVNIUkVQTEFDRSwKKyAgICBfUHlfRVJST1JfU1VSUk9HQVRFUEFTUywKKyAgICBfUHlfRVJST1JfWE1MQ0hBUlJFRlJFUExBQ0UsCisgICAgX1B5X0VSUk9SX09USEVSCit9IF9QeV9lcnJvcl9oYW5kbGVyOworCitzdGF0aWMgX1B5X2Vycm9yX2hhbmRsZXIKK2dldF9lcnJvcl9oYW5kbGVyKGNvbnN0IGNoYXIgKmVycm9ycykKK3sKKyAgICBpZiAoZXJyb3JzID09IE5VTEwgfHwgc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIF9QeV9FUlJPUl9TVFJJQ1Q7CisgICAgfQorICAgIGlmIChzdHJjbXAoZXJyb3JzLCAic3Vycm9nYXRlZXNjYXBlIikgPT0gMCkgeworICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRTsKKyAgICB9CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJyZXBsYWNlIikgPT0gMCkgeworICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1JFUExBQ0U7CisgICAgfQorICAgIGlmIChzdHJjbXAoZXJyb3JzLCAiaWdub3JlIikgPT0gMCkgeworICAgICAgICByZXR1cm4gX1B5X0VSUk9SX0lHTk9SRTsKKyAgICB9CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJiYWNrc2xhc2hyZXBsYWNlIikgPT0gMCkgeworICAgICAgICByZXR1cm4gX1B5X0VSUk9SX0JBQ0tTTEFTSFJFUExBQ0U7CisgICAgfQorICAgIGlmIChzdHJjbXAoZXJyb3JzLCAic3Vycm9nYXRlcGFzcyIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIF9QeV9FUlJPUl9TVVJST0dBVEVQQVNTOworICAgIH0KKyAgICBpZiAoc3RyY21wKGVycm9ycywgInhtbGNoYXJyZWZyZXBsYWNlIikgPT0gMCkgeworICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1hNTENIQVJSRUZSRVBMQUNFOworICAgIH0KKyAgICByZXR1cm4gX1B5X0VSUk9SX09USEVSOworfQorCiAvKiBUaGUgbWF4IHVuaWNvZGUgdmFsdWUgaXMgYWx3YXlzIDB4MTBGRkZGIHdoaWxlIHVzaW5nIHRoZSBQRVAtMzkzIEFQSS4KICAgIFRoaXMgZnVuY3Rpb24gaXMga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQgQVBJLiAqLwogUHlfVU5JQ09ERQpAQCAtNTIxLDYgKzU2OSwxMjkgQEAKICAgICAgICAgcmV0dXJuIF9QeVVuaWNvZGVfQ29weSh1bmljb2RlKTsKIH0KIAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlICJiYWNrc2xhc2hyZXBsYWNlIiBlcnJvciBoYW5kbGVyIGZvciA4LWJpdCBlbmNvZGluZ3M6CisgICBBU0NJSSwgTGF0aW4xLCBVVEYtOCwgZXRjLiAqLworc3RhdGljIGNoYXIqCitiYWNrc2xhc2hyZXBsYWNlKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnVuaWNvZGUsIFB5X3NzaXplX3QgY29sbHN0YXJ0LCBQeV9zc2l6ZV90IGNvbGxlbmQpCit7CisgICAgUHlfc3NpemVfdCBzaXplLCBpOworICAgIFB5X1VDUzQgY2g7CisgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kOworICAgIHZvaWQgKmRhdGE7CisKKyAgICBhc3NlcnQoUHlVbmljb2RlX0lTX1JFQURZKHVuaWNvZGUpKTsKKyAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodW5pY29kZSk7CisgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHVuaWNvZGUpOworCisgICAgc2l6ZSA9IDA7CisgICAgLyogZGV0ZXJtaW5lIHJlcGxhY2VtZW50IHNpemUgKi8KKyAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpbmNyOworCisgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CisgICAgICAgIGlmIChjaCA8IDB4MTAwKQorICAgICAgICAgICAgaW5jciA9IDIrMjsKKyAgICAgICAgZWxzZSBpZiAoY2ggPCAweDEwMDAwKQorICAgICAgICAgICAgaW5jciA9IDIrNDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoY2ggPD0gTUFYX1VOSUNPREUpOworICAgICAgICAgICAgaW5jciA9IDIrODsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gaW5jcikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kZWQgcmVzdWx0IGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gaW5jcjsKKyAgICB9CisKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3RyLCBzaXplKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKi8KKyAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKKyAgICAgICAgKnN0cisrID0gJ1xcJzsKKyAgICAgICAgaWYgKGNoID49IDB4MDAwMTAwMDApIHsKKyAgICAgICAgICAgICpzdHIrKyA9ICdVJzsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjI4KSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MjQpJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4yMCkmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjE2KSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MTIpJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj44KSYweGZdOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNoID49IDB4MTAwKSB7CisgICAgICAgICAgICAqc3RyKysgPSAndSc7CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4xMikmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjgpJjB4Zl07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnN0cisrID0gJ3gnOworICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj40KSYweGZdOworICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbY2gmMHhmXTsKKyAgICB9CisgICAgcmV0dXJuIHN0cjsKK30KKworLyogSW1wbGVtZW50YXRpb24gb2YgdGhlICJ4bWxjaGFycmVmcmVwbGFjZSIgZXJyb3IgaGFuZGxlciBmb3IgOC1iaXQgZW5jb2RpbmdzOgorICAgQVNDSUksIExhdGluMSwgVVRGLTgsIGV0Yy4gKi8KK3N0YXRpYyBjaGFyKgoreG1sY2hhcnJlZnJlcGxhY2UoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnVuaWNvZGUsIFB5X3NzaXplX3QgY29sbHN0YXJ0LCBQeV9zc2l6ZV90IGNvbGxlbmQpCit7CisgICAgUHlfc3NpemVfdCBzaXplLCBpOworICAgIFB5X1VDUzQgY2g7CisgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kOworICAgIHZvaWQgKmRhdGE7CisKKyAgICBhc3NlcnQoUHlVbmljb2RlX0lTX1JFQURZKHVuaWNvZGUpKTsKKyAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodW5pY29kZSk7CisgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHVuaWNvZGUpOworCisgICAgc2l6ZSA9IDA7CisgICAgLyogZGV0ZXJtaW5lIHJlcGxhY2VtZW50IHNpemUgKi8KKyAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpbmNyOworCisgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CisgICAgICAgIGlmIChjaCA8IDEwKQorICAgICAgICAgICAgaW5jciA9IDIrMSsxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMCkKKyAgICAgICAgICAgIGluY3IgPSAyKzIrMTsKKyAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwKQorICAgICAgICAgICAgaW5jciA9IDIrMysxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwKQorICAgICAgICAgICAgaW5jciA9IDIrNCsxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMCkKKyAgICAgICAgICAgIGluY3IgPSAyKzUrMTsKKyAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwMDAwKQorICAgICAgICAgICAgaW5jciA9IDIrNisxOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChjaCA8PSBNQVhfVU5JQ09ERSk7CisgICAgICAgICAgICBpbmNyID0gMis3KzE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIGluY3IpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGVkIHJlc3VsdCBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzaXplICs9IGluY3I7CisgICAgfQorCisgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSh3cml0ZXIsIHN0ciwgc2l6ZSk7CisgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICovCisgICAgZm9yIChpID0gY29sbHN0YXJ0OyBpIDwgY29sbGVuZDsgKytpKSB7CisgICAgICAgIHN0ciArPSBzcHJpbnRmKHN0ciwgIiYjJWQ7IiwgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkpOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCiAvKiAtLS0gQmxvb20gRmlsdGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBzdHVmZiB0byBpbXBsZW1lbnQgc2ltcGxlICJibG9vbSBmaWx0ZXJzIiBmb3IgVW5pY29kZSBjaGFyYWN0ZXJzLgpAQCAtNTQ5LDcgKzcyMCw3IEBACiAgICAgKChjaCkgPCAxMjhVID8gYXNjaWlfbGluZWJyZWFrWyhjaCldIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIChCTE9PTShibG9vbV9saW5lYnJlYWssIChjaCkpICYmIFB5X1VOSUNPREVfSVNMSU5FQlJFQUsoY2gpKSkKIAotUHlfTE9DQUxfSU5MSU5FKEJMT09NX01BU0spCitzdGF0aWMgaW5saW5lIEJMT09NX01BU0sKIG1ha2VfYmxvb21fbWFzayhpbnQga2luZCwgdm9pZCogcHRyLCBQeV9zc2l6ZV90IGxlbikKIHsKICNkZWZpbmUgQkxPT01fVVBEQVRFKFRZUEUsIE1BU0ssIFBUUiwgTEVOKSAgICAgICAgICAgICBcCkBAIC01ODcsNiArNzU4LDE4IEBACiAjdW5kZWYgQkxPT01fVVBEQVRFCiB9CiAKK3N0YXRpYyBpbnQKK2Vuc3VyZV91bmljb2RlKFB5T2JqZWN0ICpvYmopCit7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2sob2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgc3RyLCBub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIFB5VW5pY29kZV9SRUFEWShvYmopOworfQorCiAvKiBDb21waWxhdGlvbiBvZiB0ZW1wbGF0ZWQgcm91dGluZXMgKi8KIAogI2luY2x1ZGUgInN0cmluZ2xpYi9hc2NpaWxpYi5oIgpAQCAtNjQzLDMxICs4MjYsMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaXh1cChQeU9iamVjdCAqc2VsZiwgUHlfVUNTNCAoKmZpeGZjdCkoUHlPYmplY3QgKnMpKTsKIAotUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpIGZpbmRjaGFyKGNvbnN0IHZvaWQgKnMsIGludCBraW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSwgUHlfVUNTNCBjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQorc3RhdGljIGlubGluZSBQeV9zc2l6ZV90CitmaW5kY2hhcihjb25zdCB2b2lkICpzLCBpbnQga2luZCwKKyAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSwgUHlfVUNTNCBjaCwKKyAgICAgICAgIGludCBkaXJlY3Rpb24pCiB7Ci0gICAgaW50IG1vZGUgPSAoZGlyZWN0aW9uID09IDEpID8gRkFTVF9TRUFSQ0ggOiBGQVNUX1JTRUFSQ0g7Ci0KICAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICBjYXNlIFB5VW5pY29kZV8xQllURV9LSU5EOgotICAgICAgICB7Ci0gICAgICAgICAgICBQeV9VQ1MxIGNoMSA9IChQeV9VQ1MxKSBjaDsKLSAgICAgICAgICAgIGlmIChjaDEgPT0gY2gpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHVjczFsaWJfZmFzdHNlYXJjaCgoUHlfVUNTMSAqKSBzLCBzaXplLCAmY2gxLCAxLCAwLCBtb2RlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKChQeV9VQ1MxKSBjaCAhPSBjaCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDApCisgICAgICAgICAgICByZXR1cm4gdWNzMWxpYl9maW5kX2NoYXIoKFB5X1VDUzEgKikgcywgc2l6ZSwgKFB5X1VDUzEpIGNoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHVjczFsaWJfcmZpbmRfY2hhcigoUHlfVUNTMSAqKSBzLCBzaXplLCAoUHlfVUNTMSkgY2gpOwogICAgIGNhc2UgUHlVbmljb2RlXzJCWVRFX0tJTkQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFB5X1VDUzIgY2gyID0gKFB5X1VDUzIpIGNoOwotICAgICAgICAgICAgaWYgKGNoMiA9PSBjaCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdWNzMmxpYl9mYXN0c2VhcmNoKChQeV9VQ1MyICopIHMsIHNpemUsICZjaDIsIDEsIDAsIG1vZGUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQorICAgICAgICBpZiAoKFB5X1VDUzIpIGNoICE9IGNoKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoZGlyZWN0aW9uID4gMCkKKyAgICAgICAgICAgIHJldHVybiB1Y3MybGliX2ZpbmRfY2hhcigoUHlfVUNTMiAqKSBzLCBzaXplLCAoUHlfVUNTMikgY2gpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gdWNzMmxpYl9yZmluZF9jaGFyKChQeV9VQ1MyICopIHMsIHNpemUsIChQeV9VQ1MyKSBjaCk7CiAgICAgY2FzZSBQeVVuaWNvZGVfNEJZVEVfS0lORDoKLSAgICAgICAgcmV0dXJuIHVjczRsaWJfZmFzdHNlYXJjaCgoUHlfVUNTNCAqKSBzLCBzaXplLCAmY2gsIDEsIDAsIG1vZGUpOworICAgICAgICBpZiAoZGlyZWN0aW9uID4gMCkKKyAgICAgICAgICAgIHJldHVybiB1Y3M0bGliX2ZpbmRfY2hhcigoUHlfVUNTNCAqKSBzLCBzaXplLCBjaCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB1Y3M0bGliX3JmaW5kX2NoYXIoKFB5X1VDUzQgKikgcywgc2l6ZSwgY2gpOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGFzc2VydCgwKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTk1Niw3ICsyMTM5LDcgQEAKICAgICB9CiB9CiAKLVB5X0xPQ0FMX0lOTElORShQeV9VQ1M0KQorc3RhdGljIGlubGluZSBQeV9VQ1M0CiBhbGlnbl9tYXhjaGFyKFB5X1VDUzQgbWF4Y2hhcikKIHsKICAgICBpZiAobWF4Y2hhciA8PSAxMjcpCkBAIC0yNDU0LDEzICsyNjM3LDExIEBACiAgICAgICAgICAgICBsb25nZmxhZyA9IDE7CiAgICAgICAgICAgICArK2Y7CiAgICAgICAgIH0KLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgICAgICBlbHNlIGlmIChmWzFdID09ICdsJyAmJgogICAgICAgICAgICAgICAgICAoZlsyXSA9PSAnZCcgfHwgZlsyXSA9PSAndScgfHwgZlsyXSA9PSAnaScpKSB7CiAgICAgICAgICAgICBsb25nbG9uZ2ZsYWcgPSAxOwogICAgICAgICAgICAgZiArPSAyOwogICAgICAgICB9Ci0jZW5kaWYKICAgICB9CiAgICAgLyogaGFuZGxlIHRoZSBzaXplX3QgZmxhZy4gKi8KICAgICBlbHNlIGlmICgqZiA9PSAneicgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnIHx8IGZbMV0gPT0gJ2knKSkgewpAQCAtMjQ5OCwxMSArMjY3OSw5IEBACiAgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCiAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihidWZmZXIsICIlbHUiLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKCp2YXJncywgdW5zaWduZWQgbG9uZykpOwotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgICAgICAgICBlbHNlIGlmIChsb25nbG9uZ2ZsYWcpCi0gICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihidWZmZXIsICIlIiBQWV9GT1JNQVRfTE9OR19MT05HICJ1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZygqdmFyZ3MsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORykpOwotI2VuZGlmCisgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihidWZmZXIsICIlbGx1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZygqdmFyZ3MsIHVuc2lnbmVkIGxvbmcgbG9uZykpOwogICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZV90ZmxhZykKICAgICAgICAgICAgICAgICBsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgInUiLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKCp2YXJncywgc2l6ZV90KSk7CkBAIC0yNTE3LDExICsyNjk2LDkgQEAKICAgICAgICAgICAgIGlmIChsb25nZmxhZykKICAgICAgICAgICAgICAgICBsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiVsaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcoKnZhcmdzLCBsb25nKSk7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgICAgICAgICAgIGVsc2UgaWYgKGxvbmdsb25nZmxhZykKLSAgICAgICAgICAgICAgICBsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiUiIFBZX0ZPUk1BVF9MT05HX0xPTkcgImkiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKCp2YXJncywgUFlfTE9OR19MT05HKSk7Ci0jZW5kaWYKKyAgICAgICAgICAgICAgICBsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiVsbGkiLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKCp2YXJncywgbG9uZyBsb25nKSk7CiAgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQogICAgICAgICAgICAgICAgIGxlbiA9IHNwcmludGYoYnVmZmVyLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAiaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcoKnZhcmdzLCBQeV9zc2l6ZV90KSk7CkBAIC0yOTAzLDcgKzMwODAsNyBAQAogICAgIC8qIFJldHJpZXZlIGEgYnl0ZXMgYnVmZmVyIHZpZXcgdGhyb3VnaCB0aGUgUEVQIDMxMTggYnVmZmVyIGludGVyZmFjZSAqLwogICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIob2JqLCAmYnVmZmVyLCBQeUJVRl9TSU1QTEUpIDwgMCkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgImNvZXJjaW5nIHRvIHN0cjogbmVlZCBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCAlLjgwcyBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAiZGVjb2RpbmcgdG8gc3RyOiBuZWVkIGEgYnl0ZXMtbGlrZSBvYmplY3QsICUuODBzIGZvdW5kIiwKICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTI5MTgsOSArMzA5NSw5IEBACiAgICAgcmV0dXJuIHY7CiB9CiAKLS8qIENvbnZlcnQgZW5jb2RpbmcgdG8gbG93ZXIgY2FzZSBhbmQgcmVwbGFjZSAnXycgd2l0aCAnLScgaW4gb3JkZXIgdG8KLSAgIGNhdGNoIGUuZy4gVVRGXzguIFJldHVybiAwIG9uIGVycm9yIChlbmNvZGluZyBpcyBsb25nZXIgdGhhbiBsb3dlcl9sZW4tMSksCi0gICAxIG9uIHN1Y2Nlc3MuICovCisvKiBOb3JtYWxpemUgYW4gZW5jb2RpbmcgbmFtZTogQyBpbXBsZW1lbnRhdGlvbiBvZgorICAgZW5jb2RpbmdzLm5vcm1hbGl6ZV9lbmNvZGluZygpLiBSZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGVycm9yIChlbmNvZGluZworICAgaXMgbG9uZ2VyIHRoYW4gbG93ZXJfbGVuLTEpLiAqLwogaW50CiBfUHlfbm9ybWFsaXplX2VuY29kaW5nKGNvbnN0IGNoYXIgKmVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpsb3dlciwKQEAgLTI5MjksMzAgKzMxMDYsMzkgQEAKICAgICBjb25zdCBjaGFyICplOwogICAgIGNoYXIgKmw7CiAgICAgY2hhciAqbF9lbmQ7CisgICAgaW50IHB1bmN0OwogCi0gICAgaWYgKGVuY29kaW5nID09IE5VTEwpIHsKLSAgICAgICAgLyogNiA9PSBzdHJsZW4oInV0Zi04IikgKyAxICovCi0gICAgICAgIGlmIChsb3dlcl9sZW4gPCA2KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHN0cmNweShsb3dlciwgInV0Zi04Iik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KKyAgICBhc3NlcnQoZW5jb2RpbmcgIT0gTlVMTCk7CisKICAgICBlID0gZW5jb2Rpbmc7CiAgICAgbCA9IGxvd2VyOwogICAgIGxfZW5kID0gJmxvd2VyW2xvd2VyX2xlbiAtIDFdOwotICAgIHdoaWxlICgqZSkgewotICAgICAgICBpZiAobCA9PSBsX2VuZCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoUHlfSVNVUFBFUigqZSkpIHsKLSAgICAgICAgICAgICpsKysgPSBQeV9UT0xPV0VSKCplKyspOworICAgIHB1bmN0ID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBjaGFyIGMgPSAqZTsKKyAgICAgICAgaWYgKGMgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKmUgPT0gJ18nKSB7Ci0gICAgICAgICAgICAqbCsrID0gJy0nOwotICAgICAgICAgICAgZSsrOworCisgICAgICAgIGlmIChQeV9JU0FMTlVNKGMpIHx8IGMgPT0gJy4nKSB7CisgICAgICAgICAgICBpZiAocHVuY3QgJiYgbCAhPSBsb3dlcikgeworICAgICAgICAgICAgICAgIGlmIChsID09IGxfZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqbCsrID0gJ18nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVuY3QgPSAwOworCisgICAgICAgICAgICBpZiAobCA9PSBsX2VuZCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmwrKyA9IFB5X1RPTE9XRVIoYyk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAqbCsrID0gKmUrKzsKKyAgICAgICAgICAgIHB1bmN0ID0gMTsKICAgICAgICAgfQorCisgICAgICAgIGUrKzsKICAgICB9CiAgICAgKmwgPSAnXDAnOwogICAgIHJldHVybiAxOwpAQCAtMjk2NiwyOCArMzE1Miw1MSBAQAogewogICAgIFB5T2JqZWN0ICpidWZmZXIgPSBOVUxMLCAqdW5pY29kZTsKICAgICBQeV9idWZmZXIgaW5mbzsKLSAgICBjaGFyIGxvd2VyWzExXTsgIC8qIEVub3VnaCBmb3IgYW55IGVuY29kaW5nIHNob3J0Y3V0ICovCisgICAgY2hhciBidWZsb3dlclsxMV07ICAgLyogc3RybGVuKCJpc28tODg1OS0xXDAiKSA9PSAxMSwgbG9uZ2VzdCBzaG9ydGN1dCAqLworCisgICAgaWYgKGVuY29kaW5nID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwocywgc2l6ZSwgZXJyb3JzLCBOVUxMKTsKKyAgICB9CiAKICAgICAvKiBTaG9ydGN1dHMgZm9yIGNvbW1vbiBkZWZhdWx0IGVuY29kaW5ncyAqLwotICAgIGlmIChfUHlfbm9ybWFsaXplX2VuY29kaW5nKGVuY29kaW5nLCBsb3dlciwgc2l6ZW9mKGxvd2VyKSkpIHsKLSAgICAgICAgaWYgKChzdHJjbXAobG93ZXIsICJ1dGYtOCIpID09IDApIHx8Ci0gICAgICAgICAgICAoc3RyY21wKGxvd2VyLCAidXRmOCIpID09IDApKQotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwocywgc2l6ZSwgZXJyb3JzLCBOVUxMKTsKLSAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChsb3dlciwgImxhdGluLTEiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGxvd2VyLCAibGF0aW4xIikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgKHN0cmNtcChsb3dlciwgImlzby04ODU5LTEiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGxvd2VyLCAiaXNvODg1OS0xIikgPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZUxhdGluMShzLCBzaXplLCBlcnJvcnMpOwotI2lmZGVmIEhBVkVfTUJDUwotICAgICAgICBlbHNlIGlmIChzdHJjbXAobG93ZXIsICJtYmNzIikgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlTUJDUyhzLCBzaXplLCBlcnJvcnMpOwotI2VuZGlmCi0gICAgICAgIGVsc2UgaWYgKHN0cmNtcChsb3dlciwgImFzY2lpIikgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlQVNDSUkocywgc2l6ZSwgZXJyb3JzKTsKLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKGxvd2VyLCAidXRmLTE2IikgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGMTYocywgc2l6ZSwgZXJyb3JzLCAwKTsKLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKGxvd2VyLCAidXRmLTMyIikgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGMzIocywgc2l6ZSwgZXJyb3JzLCAwKTsKKyAgICBpZiAoX1B5X25vcm1hbGl6ZV9lbmNvZGluZyhlbmNvZGluZywgYnVmbG93ZXIsIHNpemVvZihidWZsb3dlcikpKSB7CisgICAgICAgIGNoYXIgKmxvd2VyID0gYnVmbG93ZXI7CisKKyAgICAgICAgLyogRmFzdCBwYXRocyAqLworICAgICAgICBpZiAobG93ZXJbMF0gPT0gJ3UnICYmIGxvd2VyWzFdID09ICd0JyAmJiBsb3dlclsyXSA9PSAnZicpIHsKKyAgICAgICAgICAgIGxvd2VyICs9IDM7CisgICAgICAgICAgICBpZiAoKmxvd2VyID09ICdfJykgeworICAgICAgICAgICAgICAgIC8qIE1hdGNoICJ1dGY4IiBhbmQgInV0Zl84IiAqLworICAgICAgICAgICAgICAgIGxvd2VyKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsb3dlclswXSA9PSAnOCcgJiYgbG93ZXJbMV0gPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsKHMsIHNpemUsIGVycm9ycywgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsb3dlclswXSA9PSAnMScgJiYgbG93ZXJbMV0gPT0gJzYnICYmIGxvd2VyWzJdID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZVVURjE2KHMsIHNpemUsIGVycm9ycywgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsb3dlclswXSA9PSAnMycgJiYgbG93ZXJbMV0gPT0gJzInICYmIGxvd2VyWzJdID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZVVURjMyKHMsIHNpemUsIGVycm9ycywgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKGxvd2VyLCAiYXNjaWkiKSA9PSAwCisgICAgICAgICAgICAgICAgfHwgc3RyY21wKGxvd2VyLCAidXNfYXNjaWkiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVBU0NJSShzLCBzaXplLCBlcnJvcnMpOworICAgICAgICAgICAgfQorICAgICNpZmRlZiBNU19XSU5ET1dTCisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAobG93ZXIsICJtYmNzIikgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlTUJDUyhzLCBzaXplLCBlcnJvcnMpOworICAgICAgICAgICAgfQorICAgICNlbmRpZgorICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGxvd2VyLCAibGF0aW4xIikgPT0gMAorICAgICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKGxvd2VyLCAibGF0aW5fMSIpID09IDAKKyAgICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChsb3dlciwgImlzb184ODU5XzEiKSA9PSAwCisgICAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAobG93ZXIsICJpc284ODU5XzEiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVMYXRpbjEocywgc2l6ZSwgZXJyb3JzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qIERlY29kZSB2aWEgdGhlIGNvZGVjIHJlZ2lzdHJ5ICovCkBAIC0zMTY3LDI0ICszMzc2LDIyIEBACiBzdGF0aWMgaW50CiBsb2NhbGVfZXJyb3JfaGFuZGxlcihjb25zdCBjaGFyICplcnJvcnMsIGludCAqc3Vycm9nYXRlZXNjYXBlKQogewotICAgIGlmIChlcnJvcnMgPT0gTlVMTCkgeworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikKKyAgICB7CisgICAgY2FzZSBfUHlfRVJST1JfU1RSSUNUOgogICAgICAgICAqc3Vycm9nYXRlZXNjYXBlID0gMDsKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKSB7Ci0gICAgICAgICpzdXJyb2dhdGVlc2NhcGUgPSAwOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHN0cmNtcChlcnJvcnMsICJzdXJyb2dhdGVlc2NhcGUiKSA9PSAwKSB7CisgICAgY2FzZSBfUHlfRVJST1JfU1VSUk9HQVRFRVNDQVBFOgogICAgICAgICAqc3Vycm9nYXRlZXNjYXBlID0gMTsKICAgICAgICAgcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAib25seSAnc3RyaWN0JyBhbmQgJ3N1cnJvZ2F0ZWVzY2FwZScgZXJyb3IgaGFuZGxlcnMgIgorICAgICAgICAgICAgICAgICAgICAgImFyZSBzdXBwb3J0ZWQsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9ycyk7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICJvbmx5ICdzdHJpY3QnIGFuZCAnc3Vycm9nYXRlZXNjYXBlJyBlcnJvciBoYW5kbGVycyAiCi0gICAgICAgICAgICAgICAgICJhcmUgc3VwcG9ydGVkLCBub3QgJyVzJyIsCi0gICAgICAgICAgICAgICAgIGVycm9ycyk7Ci0gICAgcmV0dXJuIC0xOwogfQogCiBQeU9iamVjdCAqCkBAIC0zMzAwLDEwICszNTA3LDggQEAKIFB5T2JqZWN0ICoKIFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQoUHlPYmplY3QgKnVuaWNvZGUpCiB7Ci0jaWZkZWYgSEFWRV9NQkNTCi0gICAgcmV0dXJuIFB5VW5pY29kZV9FbmNvZGVDb2RlUGFnZShDUF9BQ1AsIHVuaWNvZGUsIE5VTEwpOwotI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCi0gICAgcmV0dXJuIF9QeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHVuaWNvZGUsICJzdXJyb2dhdGVlc2NhcGUiKTsKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICByZXR1cm4gX1B5VW5pY29kZV9Bc1VURjhTdHJpbmcodW5pY29kZSwgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGVFcnJvcnMpOwogI2Vsc2UKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICAvKiBCb290c3RyYXAgY2hlY2s6IGlmIHRoZSBmaWxlc3lzdGVtIGNvZGVjIGlzIGltcGxlbWVudGVkIGluIFB5dGhvbiwgd2UKQEAgLTMzMTgsMTAgKzM1MjMsMTAgQEAKICAgICBpZiAoUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyAmJiBpbnRlcnAtPmZzY29kZWNfaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodW5pY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cnJvZ2F0ZWVzY2FwZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kZUVycm9ycyk7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICByZXR1cm4gUHlVbmljb2RlX0VuY29kZUxvY2FsZSh1bmljb2RlLCAic3Vycm9nYXRlZXNjYXBlIik7CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRW5jb2RlTG9jYWxlKHVuaWNvZGUsIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RlRXJyb3JzKTsKICAgICB9CiAjZW5kaWYKIH0KQEAgLTMzMzIsMzQgKzM1MzcsNTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICp2OwotICAgIGNoYXIgbG93ZXJbMTFdOyAgLyogRW5vdWdoIGZvciBhbnkgZW5jb2Rpbmcgc2hvcnRjdXQgKi8KKyAgICBjaGFyIGJ1Zmxvd2VyWzExXTsgICAvKiBzdHJsZW4oImlzb184ODU5XzFcMCIpID09IDExLCBsb25nZXN0IHNob3J0Y3V0ICovCiAKICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayh1bmljb2RlKSkgewogICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBpZiAoZW5jb2RpbmcgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9Bc1VURjhTdHJpbmcodW5pY29kZSwgZXJyb3JzKTsKKyAgICB9CisKICAgICAvKiBTaG9ydGN1dHMgZm9yIGNvbW1vbiBkZWZhdWx0IGVuY29kaW5ncyAqLwotICAgIGlmIChfUHlfbm9ybWFsaXplX2VuY29kaW5nKGVuY29kaW5nLCBsb3dlciwgc2l6ZW9mKGxvd2VyKSkpIHsKLSAgICAgICAgaWYgKChzdHJjbXAobG93ZXIsICJ1dGYtOCIpID09IDApIHx8Ci0gICAgICAgICAgICAoc3RyY21wKGxvd2VyLCAidXRmOCIpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZXJyb3JzID09IE5VTEwgfHwgc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIF9QeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHVuaWNvZGUsIE5VTEwpOwotICAgICAgICAgICAgZWxzZQorICAgIGlmIChfUHlfbm9ybWFsaXplX2VuY29kaW5nKGVuY29kaW5nLCBidWZsb3dlciwgc2l6ZW9mKGJ1Zmxvd2VyKSkpIHsKKyAgICAgICAgY2hhciAqbG93ZXIgPSBidWZsb3dlcjsKKworICAgICAgICAvKiBGYXN0IHBhdGhzICovCisgICAgICAgIGlmIChsb3dlclswXSA9PSAndScgJiYgbG93ZXJbMV0gPT0gJ3QnICYmIGxvd2VyWzJdID09ICdmJykgeworICAgICAgICAgICAgbG93ZXIgKz0gMzsKKyAgICAgICAgICAgIGlmICgqbG93ZXIgPT0gJ18nKSB7CisgICAgICAgICAgICAgICAgLyogTWF0Y2ggInV0ZjgiIGFuZCAidXRmXzgiICovCisgICAgICAgICAgICAgICAgbG93ZXIrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxvd2VyWzBdID09ICc4JyAmJiBsb3dlclsxXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIF9QeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHVuaWNvZGUsIGVycm9ycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsb3dlclswXSA9PSAnMScgJiYgbG93ZXJbMV0gPT0gJzYnICYmIGxvd2VyWzJdID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9FbmNvZGVVVEYxNih1bmljb2RlLCBlcnJvcnMsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobG93ZXJbMF0gPT0gJzMnICYmIGxvd2VyWzFdID09ICcyJyAmJiBsb3dlclsyXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9QeVVuaWNvZGVfRW5jb2RlVVRGMzIodW5pY29kZSwgZXJyb3JzLCAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoc3RyY21wKGxvd2VyLCAibGF0aW4tMSIpID09IDApIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAobG93ZXIsICJsYXRpbjEiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGxvd2VyLCAiaXNvLTg4NTktMSIpID09IDApIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAobG93ZXIsICJpc284ODU5LTEiKSA9PSAwKSkKLSAgICAgICAgICAgIHJldHVybiBfUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nKHVuaWNvZGUsIGVycm9ycyk7Ci0jaWZkZWYgSEFWRV9NQkNTCi0gICAgICAgIGVsc2UgaWYgKHN0cmNtcChsb3dlciwgIm1iY3MiKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9FbmNvZGVDb2RlUGFnZShDUF9BQ1AsIHVuaWNvZGUsIGVycm9ycyk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHN0cmNtcChsb3dlciwgImFzY2lpIikgPT0gMAorICAgICAgICAgICAgICAgIHx8IHN0cmNtcChsb3dlciwgInVzX2FzY2lpIikgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBfUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcodW5pY29kZSwgZXJyb3JzKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBNU19XSU5ET1dTCisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAobG93ZXIsICJtYmNzIikgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRW5jb2RlQ29kZVBhZ2UoQ1BfQUNQLCB1bmljb2RlLCBlcnJvcnMpOworICAgICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgIGVsc2UgaWYgKHN0cmNtcChsb3dlciwgImFzY2lpIikgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBfUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcodW5pY29kZSwgZXJyb3JzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChsb3dlciwgImxhdGluMSIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChsb3dlciwgImxhdGluXzEiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICBzdHJjbXAobG93ZXIsICJpc29fODg1OV8xIikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGxvd2VyLCAiaXNvODg1OV8xIikgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBfUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nKHVuaWNvZGUsIGVycm9ycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBFbmNvZGUgdmlhIHRoZSBjb2RlYyByZWdpc3RyeSAqLwpAQCAtMzU4NCwxMCArMzgxMSw4IEBACiBQeU9iamVjdCoKIFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLSNpZmRlZiBIQVZFX01CQ1MKLSAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZU1CQ1Mocywgc2l6ZSwgTlVMTCk7Ci0jZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKLSAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bChzLCBzaXplLCAic3Vycm9nYXRlZXNjYXBlIiwgTlVMTCk7CisjaWYgZGVmaW5lZChfX0FQUExFX18pCisgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwocywgc2l6ZSwgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGVFcnJvcnMsIE5VTEwpOwogI2Vsc2UKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICAvKiBCb290c3RyYXAgY2hlY2s6IGlmIHRoZSBmaWxlc3lzdGVtIGNvZGVjIGlzIGltcGxlbWVudGVkIGluIFB5dGhvbiwgd2UKQEAgLTM2MDAsMTIgKzM4MjUsMjQgQEAKICAgICAgICBjYW5ub3Qgb25seSByZWx5IG9uIGl0OiBjaGVjayBhbHNvIGludGVycC0+ZnNjb2RlY19pbml0aWFsaXplZCBmb3IKICAgICAgICBzdWJpbnRlcnByZXRlcnMuICovCiAgICAgaWYgKFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgJiYgaW50ZXJwLT5mc2NvZGVjX2luaXRpYWxpemVkKSB7Ci0gICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlKHMsIHNpemUsCisgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeVVuaWNvZGVfRGVjb2RlKHMsIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXJyb2dhdGVlc2NhcGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGVFcnJvcnMpOworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgaWYgKCFyZXMgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqZXhjLCAqdmFsLCAqdGI7CisgICAgICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZmlsZXN5c3RlbSBwYXRoIGJ5dGVzIHdlcmUgbm90IGNvcnJlY3RseSBlbmNvZGVkIHdpdGggJyVzJy4gIiBcCisgICAgICAgICAgICAgICAgIlBsZWFzZSByZXBvcnQgdGhpcyBhdCBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjc3ODEiLAorICAgICAgICAgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpOworICAgICAgICAgICAgX1B5RXJyX0NoYWluRXhjZXB0aW9ucyhleGMsIHZhbCwgdGIpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlTG9jYWxlQW5kU2l6ZShzLCBzaXplLCAic3Vycm9nYXRlZXNjYXBlIik7CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlTG9jYWxlQW5kU2l6ZShzLCBzaXplLCBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kZUVycm9ycyk7CiAgICAgfQogI2VuZGlmCiB9CkBAIC0zNjE0LDYgKzM4NTEsNyBAQAogaW50CiBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIoUHlPYmplY3QqIGFyZywgdm9pZCogYWRkcikKIHsKKyAgICBQeU9iamVjdCAqcGF0aCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm91dHB1dCA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBzaXplOwogICAgIHZvaWQgKmRhdGE7CkBAIC0zNjIyLDI0ICszODYwLDIyIEBACiAgICAgICAgICooUHlPYmplY3QqKilhZGRyID0gTlVMTDsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIGlmIChQeUJ5dGVzX0NoZWNrKGFyZykpIHsKLSAgICAgICAgb3V0cHV0ID0gYXJnOwotICAgICAgICBQeV9JTkNSRUYob3V0cHV0KTsKKyAgICBwYXRoID0gUHlPU19GU1BhdGgoYXJnKTsKKyAgICBpZiAocGF0aCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYXJnID0gUHlVbmljb2RlX0Zyb21PYmplY3QoYXJnKTsKLSAgICAgICAgaWYgKCFhcmcpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgb3V0cHV0ID0gUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdChhcmcpOwotICAgICAgICBQeV9ERUNSRUYoYXJnKTsKLSAgICAgICAgaWYgKCFvdXRwdXQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrKG91dHB1dCkpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihvdXRwdXQpOwotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImVuY29kZXIgZmFpbGVkIHRvIHJldHVybiBieXRlcyIpOworICAgIGlmIChQeUJ5dGVzX0NoZWNrKHBhdGgpKSB7CisgICAgICAgIG91dHB1dCA9IHBhdGg7CisgICAgfQorICAgIGVsc2UgeyAgLy8gUHlPU19GU1BhdGgoKSBndWFyYW50ZWVzIGl0cyByZXR1cm5lZCB2YWx1ZSBpcyBieXRlcyBvciBzdHIuCisgICAgICAgIG91dHB1dCA9IFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQocGF0aCk7CisgICAgICAgIFB5X0RFQ1JFRihwYXRoKTsKKyAgICAgICAgaWYgKCFvdXRwdXQpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CisgICAgICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKG91dHB1dCkpOwogICAgIH0KKwogICAgIHNpemUgPSBQeUJ5dGVzX0dFVF9TSVpFKG91dHB1dCk7CiAgICAgZGF0YSA9IFB5Qnl0ZXNfQVNfU1RSSU5HKG91dHB1dCk7CiAgICAgaWYgKChzaXplX3Qpc2l6ZSAhPSBzdHJsZW4oZGF0YSkpIHsKQEAgLTM2NTUsMzYgKzM4OTEsNjAgQEAKIGludAogUHlVbmljb2RlX0ZTRGVjb2RlcihQeU9iamVjdCogYXJnLCB2b2lkKiBhZGRyKQogeworICAgIGludCBpc19idWZmZXIgPSAwOworICAgIFB5T2JqZWN0ICpwYXRoID0gTlVMTDsKICAgICBQeU9iamVjdCAqb3V0cHV0ID0gTlVMTDsKICAgICBpZiAoYXJnID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKCooUHlPYmplY3QqKilhZGRyKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotICAgICAgICBpZiAoUHlVbmljb2RlX1JFQURZKGFyZykgPT0gLTEpCisKKyAgICBpc19idWZmZXIgPSBQeU9iamVjdF9DaGVja0J1ZmZlcihhcmcpOworICAgIGlmICghaXNfYnVmZmVyKSB7CisgICAgICAgIHBhdGggPSBQeU9TX0ZTUGF0aChhcmcpOworICAgICAgICBpZiAocGF0aCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgb3V0cHV0ID0gYXJnOwotICAgICAgICBQeV9JTkNSRUYob3V0cHV0KTsKKyAgICAgICAgfQogICAgIH0KLSAgICBlbHNlIGlmIChQeU9iamVjdF9DaGVja0J1ZmZlcihhcmcpKSB7Ci0gICAgICAgIGFyZyA9IFB5Qnl0ZXNfRnJvbU9iamVjdChhcmcpOwotICAgICAgICBpZiAoIWFyZykKKyAgICBlbHNlIHsKKyAgICAgICAgcGF0aCA9IGFyZzsKKyAgICAgICAgUHlfSU5DUkVGKGFyZyk7CisgICAgfQorCisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhwYXRoKSkgeworICAgICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHBhdGgpID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocGF0aCk7CiAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgb3V0cHV0ID0gUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdEFuZFNpemUoUHlCeXRlc19BU19TVFJJTkcoYXJnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShhcmcpKTsKLSAgICAgICAgUHlfREVDUkVGKGFyZyk7Ci0gICAgICAgIGlmICghb3V0cHV0KQorICAgICAgICB9CisgICAgICAgIG91dHB1dCA9IHBhdGg7CisgICAgfQorICAgIGVsc2UgaWYgKFB5Qnl0ZXNfQ2hlY2socGF0aCkgfHwgaXNfYnVmZmVyKSB7CisgICAgICAgIFB5T2JqZWN0ICpwYXRoX2J5dGVzID0gTlVMTDsKKworICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2socGF0aCkgJiYKKyAgICAgICAgICAgIFB5RXJyX1dhcm5Gb3JtYXQoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAxLAorICAgICAgICAgICAgInBhdGggc2hvdWxkIGJlIHN0cmluZywgYnl0ZXMsIG9yIG9zLlBhdGhMaWtlLCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGF0aCk7CiAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2sob3V0cHV0KSkgewotICAgICAgICAgICAgUHlfREVDUkVGKG91dHB1dCk7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGVjb2RlciBmYWlsZWQgdG8gcmV0dXJuIHVuaWNvZGUiKTsKKyAgICAgICAgfQorICAgICAgICBwYXRoX2J5dGVzID0gUHlCeXRlc19Gcm9tT2JqZWN0KHBhdGgpOworICAgICAgICBQeV9ERUNSRUYocGF0aCk7CisgICAgICAgIGlmICghcGF0aF9ieXRlcykgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0ID0gUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdEFuZFNpemUoUHlCeXRlc19BU19TVFJJTkcocGF0aF9ieXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUocGF0aF9ieXRlcykpOworICAgICAgICBQeV9ERUNSRUYocGF0aF9ieXRlcyk7CisgICAgICAgIGlmICghb3V0cHV0KSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJwYXRoIHNob3VsZCBiZSBzdHJpbmcgb3IgYnl0ZXMsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgInBhdGggc2hvdWxkIGJlIHN0cmluZywgYnl0ZXMsIG9yIG9zLlBhdGhMaWtlLCBub3QgJS4yMDBzIiwKICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihwYXRoKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChQeVVuaWNvZGVfUkVBRFkob3V0cHV0KSA9PSAtMSkgewpAQCAtMzcxNiw3ICszOTc2LDcgQEAKIAogICAgIGlmIChQeVVuaWNvZGVfVVRGOCh1bmljb2RlKSA9PSBOVUxMKSB7CiAgICAgICAgIGFzc2VydCghUHlVbmljb2RlX0lTX0NPTVBBQ1RfQVNDSUkodW5pY29kZSkpOwotICAgICAgICBieXRlcyA9IF9QeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHVuaWNvZGUsICJzdHJpY3QiKTsKKyAgICAgICAgYnl0ZXMgPSBfUHlVbmljb2RlX0FzVVRGOFN0cmluZyh1bmljb2RlLCBOVUxMKTsKICAgICAgICAgaWYgKGJ5dGVzID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgX1B5VW5pY29kZV9VVEY4KHVuaWNvZGUpID0gUHlPYmplY3RfTUFMTE9DKFB5Qnl0ZXNfR0VUX1NJWkUoYnl0ZXMpICsgMSk7CkBAIC0zOTY2LDcgKzQyMjYsNyBAQAogICAgIFB5X0NMRUFSKCpleGNlcHRpb25PYmplY3QpOwogfQogCi0jaWZkZWYgSEFWRV9NQkNTCisjaWZkZWYgTVNfV0lORE9XUwogLyogZXJyb3IgaGFuZGxpbmcgY2FsbGJhY2sgaGVscGVyOgogICAgYnVpbGQgYXJndW1lbnRzLCBjYWxsIHRoZSBjYWxsYmFjayBhbmQgY2hlY2sgdGhlIGFyZ3VtZW50cywKICAgIGlmIG5vIGV4Y2VwdGlvbiBvY2N1cnJlZCwgY29weSB0aGUgcmVwbGFjZW1lbnQgdG8gdGhlIG91dHB1dApAQCAtMzk4Miw3ICs0MjQyLDcgQEAKICAgICBQeV9zc2l6ZV90ICplbmRpbnBvcywgUHlPYmplY3QgKipleGNlcHRpb25PYmplY3QsIGNvbnN0IGNoYXIgKippbnB0ciwKICAgICBQeU9iamVjdCAqKm91dHB1dCwgUHlfc3NpemVfdCAqb3V0cG9zKQogewotICAgIHN0YXRpYyBjaGFyICphcmdwYXJzZSA9ICJPIW47ZGVjb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYXJncGFyc2UgPSAiTyFuO2RlY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CiAKICAgICBQeU9iamVjdCAqcmVzdHVwbGUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZXB1bmljb2RlID0gTlVMTDsKQEAgLTQwODAsNyArNDM0MCw3IEBACiAgICAgUHlfWERFQ1JFRihyZXN0dXBsZSk7CiAgICAgcmV0dXJuIC0xOwogfQotI2VuZGlmICAgLyogSEFWRV9NQkNTICovCisjZW5kaWYgICAvKiBNU19XSU5ET1dTICovCiAKIHN0YXRpYyBpbnQKIHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyX3dyaXRlcigKQEAgLTQwOTAsNyArNDM1MCw3IEBACiAgICAgUHlfc3NpemVfdCAqZW5kaW5wb3MsIFB5T2JqZWN0ICoqZXhjZXB0aW9uT2JqZWN0LCBjb25zdCBjaGFyICoqaW5wdHIsCiAgICAgX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyIC8qIFB5T2JqZWN0ICoqb3V0cHV0LCBQeV9zc2l6ZV90ICpvdXRwb3MgKi8pCiB7Ci0gICAgc3RhdGljIGNoYXIgKmFyZ3BhcnNlID0gIk8hbjtkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIsIGludCkgdHVwbGUiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphcmdwYXJzZSA9ICJPIW47ZGVjb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKIAogICAgIFB5T2JqZWN0ICpyZXN0dXBsZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJlcHVuaWNvZGUgPSBOVUxMOwpAQCAtNDY5Niw4ICs0OTU2LDkgQEAKICAgICBQeV9zc2l6ZV90IHN0YXJ0aW5wb3M7CiAgICAgUHlfc3NpemVfdCBlbmRpbnBvczsKICAgICBjb25zdCBjaGFyICplcnJtc2cgPSAiIjsKLSAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZXJyb3JfaGFuZGxlcl9vYmogPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBfUHlfRVJST1JfVU5LTk9XTjsKIAogICAgIGlmIChzaXplID09IDApIHsKICAgICAgICAgaWYgKGNvbnN1bWVkKQpAQCAtNDcyMiw2ICs0OTgzLDcgQEAKICAgICB3aGlsZSAocyA8IGVuZCkgewogICAgICAgICBQeV9VQ1M0IGNoOwogICAgICAgICBpbnQga2luZCA9IHdyaXRlci5raW5kOworCiAgICAgICAgIGlmIChraW5kID09IFB5VW5pY29kZV8xQllURV9LSU5EKSB7CiAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0lTX0FTQ0lJKHdyaXRlci5idWZmZXIpKQogICAgICAgICAgICAgICAgIGNoID0gYXNjaWlsaWJfdXRmOF9kZWNvZGUoJnMsIGVuZCwgd3JpdGVyLmRhdGEsICZ3cml0ZXIucG9zKTsKQEAgLTQ3NjAsMjQgKzUwMjIsNTYgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyX3dyaXRlcigKLSAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvckhhbmRsZXIsCi0gICAgICAgICAgICAgICAgInV0Zi04IiwgZXJybXNnLAotICAgICAgICAgICAgICAgICZzdGFydHMsICZlbmQsICZzdGFydGlucG9zLCAmZW5kaW5wb3MsICZleGMsICZzLAotICAgICAgICAgICAgICAgICZ3cml0ZXIpKQotICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICBpZiAoZXJyb3JfaGFuZGxlciA9PSBfUHlfRVJST1JfVU5LTk9XTikKKyAgICAgICAgICAgIGVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworCisgICAgICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikgeworICAgICAgICBjYXNlIF9QeV9FUlJPUl9JR05PUkU6CisgICAgICAgICAgICBzICs9IChlbmRpbnBvcyAtIHN0YXJ0aW5wb3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBfUHlfRVJST1JfUkVQTEFDRToKKyAgICAgICAgICAgIGlmIChfUHlVbmljb2RlV3JpdGVyX1dyaXRlQ2hhcklubGluZSgmd3JpdGVyLCAweGZmZmQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICBzICs9IChlbmRpbnBvcyAtIHN0YXJ0aW5wb3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBfUHlfRVJST1JfU1VSUk9HQVRFRVNDQVBFOgorICAgICAgICB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisKKyAgICAgICAgICAgIGlmIChfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kKCZ3cml0ZXIsIFB5VW5pY29kZV8yQllURV9LSU5EKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgZm9yIChpPXN0YXJ0aW5wb3M7IGk8ZW5kaW5wb3M7IGkrKykgeworICAgICAgICAgICAgICAgIGNoID0gKFB5X1VDUzQpKHVuc2lnbmVkIGNoYXIpKHN0YXJ0c1tpXSk7CisgICAgICAgICAgICAgICAgUHlVbmljb2RlX1dSSVRFKHdyaXRlci5raW5kLCB3cml0ZXIuZGF0YSwgd3JpdGVyLnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggKyAweGRjMDApOworICAgICAgICAgICAgICAgIHdyaXRlci5wb3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMgKz0gKGVuZGlucG9zIC0gc3RhcnRpbnBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXJfd3JpdGVyKAorICAgICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvcl9oYW5kbGVyX29iaiwKKyAgICAgICAgICAgICAgICAgICAgInV0Zi04IiwgZXJybXNnLAorICAgICAgICAgICAgICAgICAgICAmc3RhcnRzLCAmZW5kLCAmc3RhcnRpbnBvcywgJmVuZGlucG9zLCAmZXhjLCAmcywKKyAgICAgICAgICAgICAgICAgICAgJndyaXRlcikpCisgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICB9CiAgICAgfQogCiBFbmQ6CiAgICAgaWYgKGNvbnN1bWVkKQogICAgICAgICAqY29uc3VtZWQgPSBzIC0gc3RhcnRzOwogCi0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICAgICByZXR1cm4gX1B5VW5pY29kZVdyaXRlcl9GaW5pc2goJndyaXRlcik7CiAKIG9uRXJyb3I6Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICAgICBfUHlVbmljb2RlV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC01MDY5LDcgKzUzNjMsNyBAQAogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgUHlfc3NpemVfdCBsZW47CiAgICAgUHlPYmplY3QgKnY7Ci0gICAgUFlfVUlOVDMyX1QgKm91dDsKKyAgICB1aW50MzJfdCAqb3V0OwogI2lmIFBZX0xJVFRMRV9FTkRJQU4KICAgICBpbnQgbmF0aXZlX29yZGVyaW5nID0gYnl0ZW9yZGVyIDw9IDA7CiAjZWxzZQpAQCAtNTEwMCw3ICs1Mzk0LDcgQEAKIAogICAgIC8qIG91dHB1dCBidWZmZXIgaXMgNC1ieXRlcyBhbGlnbmVkICovCiAgICAgYXNzZXJ0KF9QeV9JU19BTElHTkVEKFB5Qnl0ZXNfQVNfU1RSSU5HKHYpLCA0KSk7Ci0gICAgb3V0ID0gKFBZX1VJTlQzMl9UICopUHlCeXRlc19BU19TVFJJTkcodik7CisgICAgb3V0ID0gKHVpbnQzMl90ICopUHlCeXRlc19BU19TVFJJTkcodik7CiAgICAgaWYgKGJ5dGVvcmRlciA9PSAwKQogICAgICAgICAqb3V0KysgPSAweEZFRkY7CiAgICAgaWYgKGxlbiA9PSAwKQpAQCAtNTE2Niw3ICs1NDYwLDcgQEAKIAogICAgICAgICAvKiBmb3VyIGJ5dGVzIGFyZSByZXNlcnZlZCBmb3IgZWFjaCBzdXJyb2dhdGUgKi8KICAgICAgICAgaWYgKG1vcmV1bml0cyA+IDEpIHsKLSAgICAgICAgICAgIFB5X3NzaXplX3Qgb3V0cG9zID0gb3V0IC0gKFBZX1VJTlQzMl9UKikgUHlCeXRlc19BU19TVFJJTkcodik7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG91dHBvcyA9IG91dCAtICh1aW50MzJfdCopIFB5Qnl0ZXNfQVNfU1RSSU5HKHYpOwogICAgICAgICAgICAgUHlfc3NpemVfdCBtb3JlYnl0ZXMgPSA0ICogKG1vcmV1bml0cyAtIDEpOwogICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfR0VUX1NJWkUodikgPiBQWV9TU0laRV9UX01BWCAtIG1vcmVieXRlcykgewogICAgICAgICAgICAgICAgIC8qIGludGVnZXIgb3ZlcmZsb3cgKi8KQEAgLTUxNzUsNyArNTQ2OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZ2LCBQeUJ5dGVzX0dFVF9TSVpFKHYpICsgbW9yZWJ5dGVzKSA8IDApCiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIG91dCA9IChQWV9VSU5UMzJfVCopIFB5Qnl0ZXNfQVNfU1RSSU5HKHYpICsgb3V0cG9zOworICAgICAgICAgICAgb3V0ID0gKHVpbnQzMl90KikgUHlCeXRlc19BU19TVFJJTkcodikgKyBvdXRwb3M7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoUHlCeXRlc19DaGVjayhyZXApKSB7CkBAIC01NDMwLDM2ICs1NzI0LDQ1IEBACiAgICAgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzRCWVRFX0tJTkQpIHsKICAgICAgICAgY29uc3QgUHlfVUNTNCAqaW4gPSAoY29uc3QgUHlfVUNTNCAqKWRhdGE7CiAgICAgICAgIGNvbnN0IFB5X1VDUzQgKmVuZCA9IGluICsgbGVuOwotICAgICAgICB3aGlsZSAoaW4gPCBlbmQpCi0gICAgICAgICAgICBpZiAoKmluKysgPj0gMHgxMDAwMCkKKyAgICAgICAgd2hpbGUgKGluIDwgZW5kKSB7CisgICAgICAgICAgICBpZiAoKmluKysgPj0gMHgxMDAwMCkgewogICAgICAgICAgICAgICAgIHBhaXJzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMiAtIHBhaXJzIC0gKGJ5dGVvcmRlciA9PSAwKSkKKyAgICBpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLyAyIC0gcGFpcnMgLSAoYnl0ZW9yZGVyID09IDApKSB7CiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KICAgICBuc2l6ZSA9IGxlbiArIHBhaXJzICsgKGJ5dGVvcmRlciA9PSAwKTsKICAgICB2ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuc2l6ZSAqIDIpOwotICAgIGlmICh2ID09IE5VTEwpCisgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICAvKiBvdXRwdXQgYnVmZmVyIGlzIDItYnl0ZXMgYWxpZ25lZCAqLwogICAgIGFzc2VydChfUHlfSVNfQUxJR05FRChQeUJ5dGVzX0FTX1NUUklORyh2KSwgMikpOwogICAgIG91dCA9ICh1bnNpZ25lZCBzaG9ydCAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHYpOwotICAgIGlmIChieXRlb3JkZXIgPT0gMCkKKyAgICBpZiAoYnl0ZW9yZGVyID09IDApIHsKICAgICAgICAgKm91dCsrID0gMHhGRUZGOwotICAgIGlmIChsZW4gPT0gMCkKKyAgICB9CisgICAgaWYgKGxlbiA9PSAwKSB7CiAgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKICAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgewogICAgICAgICB1Y3MxbGliX3V0ZjE2X2VuY29kZSgoY29uc3QgUHlfVUNTMSAqKWRhdGEsIGxlbiwgJm91dCwgbmF0aXZlX29yZGVyaW5nKTsKICAgICAgICAgZ290byBkb25lOwogICAgIH0KIAotICAgIGlmIChieXRlb3JkZXIgPCAwKQorICAgIGlmIChieXRlb3JkZXIgPCAwKSB7CiAgICAgICAgIGVuY29kaW5nID0gInV0Zi0xNi1sZSI7Ci0gICAgZWxzZSBpZiAoYnl0ZW9yZGVyID4gMCkKKyAgICB9CisgICAgZWxzZSBpZiAoYnl0ZW9yZGVyID4gMCkgewogICAgICAgICBlbmNvZGluZyA9ICJ1dGYtMTYtYmUiOwotICAgIGVsc2UKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAgIGVuY29kaW5nID0gInV0Zi0xNiI7CisgICAgfQogCiAgICAgcG9zID0gMDsKICAgICB3aGlsZSAocG9zIDwgbGVuKSB7CkBAIC01NTc1LDYxICs1ODc4LDYgQEAKIAogLyogLS0tIFVuaWNvZGUgRXNjYXBlIENvZGVjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qIEhlbHBlciBmdW5jdGlvbiBmb3IgUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUsIGRldGVybWluZXMKLSAgIGlmIGFsbCB0aGUgZXNjYXBlcyBpbiB0aGUgc3RyaW5nIG1ha2UgaXQgc3RpbGwgYSB2YWxpZCBBU0NJSSBzdHJpbmcuCi0gICBSZXR1cm5zIC0xIGlmIGFueSBlc2NhcGVzIHdlcmUgZm91bmQgd2hpY2ggY2F1c2UgdGhlIHN0cmluZyB0bwotICAgcG9wIG91dCBvZiBBU0NJSSByYW5nZS4gIE90aGVyd2lzZSByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlCi0gICByZXF1aXJlZCBidWZmZXIgdG8gaG9sZCB0aGUgc3RyaW5nLgotICAgKi8KLXN0YXRpYyBQeV9zc2l6ZV90Ci1sZW5ndGhfb2ZfZXNjYXBlZF9hc2NpaV9zdHJpbmcoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBzaXplKQotewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXM7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gcCArIHNpemU7Ci0gICAgUHlfc3NpemVfdCBsZW5ndGggPSAwOwotCi0gICAgaWYgKHNpemUgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBmb3IgKDsgcCA8IGVuZDsgKytwKSB7Ci0gICAgICAgIGlmICgqcCA+IDEyNykgewotICAgICAgICAgICAgLyogTm9uLUFTQ0lJICovCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKnAgIT0gJ1xcJykgewotICAgICAgICAgICAgLyogTm9ybWFsIGNoYXJhY3RlciAqLwotICAgICAgICAgICAgKytsZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBCYWNrc2xhc2gtZXNjYXBlLCBjaGVjayBuZXh0IGNoYXIgKi8KLSAgICAgICAgICAgICsrcDsKLSAgICAgICAgICAgIC8qIEVzY2FwZSBzZXF1ZW5jZSByZWFjaGVzIHRpbGwgZW5kIG9mIHN0cmluZyBvcgotICAgICAgICAgICAgICAgbm9uLUFTQ0lJIGZvbGxvdy11cC4gKi8KLSAgICAgICAgICAgIGlmIChwID49IGVuZCB8fCAqcCA+IDEyNykKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBzd2l0Y2ggKCpwKSB7Ci0gICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgLyogYmFja3NsYXNoICsgXG4gcmVzdWx0IGluIHplcm8gY2hhcmFjdGVycyAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnXFwnOiBjYXNlICdcJyc6IGNhc2UgJ1wiJzoKLSAgICAgICAgICAgIGNhc2UgJ2InOiBjYXNlICdmJzogY2FzZSAndCc6Ci0gICAgICAgICAgICBjYXNlICduJzogY2FzZSAncic6IGNhc2UgJ3YnOiBjYXNlICdhJzoKLSAgICAgICAgICAgICAgICArK2xlbmd0aDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOgotICAgICAgICAgICAgY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6Ci0gICAgICAgICAgICBjYXNlICd4JzogY2FzZSAndSc6IGNhc2UgJ1UnOiBjYXNlICdOJzoKLSAgICAgICAgICAgICAgICAvKiB0aGVzZSBkbyBub3QgZ3VhcmFudGVlIEFTQ0lJIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8qIGNvdW50IHRoZSBiYWNrc2xhc2ggKyB0aGUgb3RoZXIgY2hhcmFjdGVyICovCi0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxlbmd0aDsKLX0KLQogc3RhdGljIF9QeVVuaWNvZGVfTmFtZV9DQVBJICp1Y25oYXNoX0NBUEkgPSBOVUxMOwogCiBQeU9iamVjdCAqCkBAIC01NjM4LDIxOCArNTg4NiwyMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBjb25zdCBjaGFyICpzdGFydHMgPSBzOwotICAgIFB5X3NzaXplX3Qgc3RhcnRpbnBvczsKLSAgICBQeV9zc2l6ZV90IGVuZGlucG9zOwogICAgIF9QeVVuaWNvZGVXcml0ZXIgd3JpdGVyOwogICAgIGNvbnN0IGNoYXIgKmVuZDsKLSAgICBjaGFyKiBtZXNzYWdlOwotICAgIFB5X1VDUzQgY2hyID0gMHhmZmZmZmZmZjsgLyogaW4gY2FzZSAnZ2V0Y29kZScgbWVzc2VzIHVwICovCiAgICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7Ci0gICAgUHlfc3NpemVfdCBsZW47CiAKLSAgICBsZW4gPSBsZW5ndGhfb2ZfZXNjYXBlZF9hc2NpaV9zdHJpbmcocywgc2l6ZSk7Ci0gICAgaWYgKGxlbiA9PSAwKQorICAgIGlmIChzaXplID09IDApIHsKICAgICAgICAgX1B5X1JFVFVSTl9VTklDT0RFX0VNUFRZKCk7Ci0KLSAgICAvKiBBZnRlciBsZW5ndGhfb2ZfZXNjYXBlZF9hc2NpaV9zdHJpbmcoKSB0aGVyZSBhcmUgdHdvIGFsdGVybmF0aXZlcywKLSAgICAgICBlaXRoZXIgdGhlIHN0cmluZyBpcyBwdXJlIEFTQ0lJIHdpdGggbmFtZWQgZXNjYXBlcyBsaWtlIFxuLCBldGMuCi0gICAgICAgYW5kIHdlIGRldGVybWluZWQgaXQncyBleGFjdCBzaXplIChjb21tb24gY2FzZSkKLSAgICAgICBvciBpdCBjb250YWlucyBceCwgXHUsIC4uLiBlc2NhcGUgc2VxdWVuY2VzLiAgdGhlbiB3ZSBjcmVhdGUgYQotICAgICAgIGxlZ2FjeSB3Y2hhciBzdHJpbmcgYW5kIHJlc2l6ZSBpdCBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24uICovCisgICAgfQorICAgIC8qIEVzY2FwZWQgc3RyaW5ncyB3aWxsIGFsd2F5cyBiZSBsb25nZXIgdGhhbiB0aGUgcmVzdWx0aW5nCisgICAgICAgVW5pY29kZSBzdHJpbmcsIHNvIHdlIHN0YXJ0IHdpdGggc2l6ZSBoZXJlIGFuZCB0aGVuIHJlZHVjZSB0aGUKKyAgICAgICBsZW5ndGggYWZ0ZXIgY29udmVyc2lvbiB0byB0aGUgdHJ1ZSB2YWx1ZS4KKyAgICAgICAoYnV0IGlmIHRoZSBlcnJvciBjYWxsYmFjayByZXR1cm5zIGEgbG9uZyByZXBsYWNlbWVudCBzdHJpbmcKKyAgICAgICB3ZSdsbCBoYXZlIHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UpICovCiAgICAgX1B5VW5pY29kZVdyaXRlcl9Jbml0KCZ3cml0ZXIpOwotICAgIGlmIChsZW4gPiAwKSB7Ci0gICAgICAgIHdyaXRlci5taW5fbGVuZ3RoID0gbGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogRXNjYXBlZCBzdHJpbmdzIHdpbGwgYWx3YXlzIGJlIGxvbmdlciB0aGFuIHRoZSByZXN1bHRpbmcKLSAgICAgICAgICAgVW5pY29kZSBzdHJpbmcsIHNvIHdlIHN0YXJ0IHdpdGggc2l6ZSBoZXJlIGFuZCB0aGVuIHJlZHVjZSB0aGUKLSAgICAgICAgICAgbGVuZ3RoIGFmdGVyIGNvbnZlcnNpb24gdG8gdGhlIHRydWUgdmFsdWUuCi0gICAgICAgICAgIChidXQgaWYgdGhlIGVycm9yIGNhbGxiYWNrIHJldHVybnMgYSBsb25nIHJlcGxhY2VtZW50IHN0cmluZwotICAgICAgICAgICB3ZSdsbCBoYXZlIHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UpICovCi0gICAgICAgIHdyaXRlci5taW5fbGVuZ3RoID0gc2l6ZTsKKyAgICB3cml0ZXIubWluX2xlbmd0aCA9IHNpemU7CisgICAgaWYgKF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBzaXplLCAxMjcpIDwgMCkgeworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPT0gMCkKLSAgICAgICAgcmV0dXJuIF9QeVVuaWNvZGVXcml0ZXJfRmluaXNoKCZ3cml0ZXIpOwogICAgIGVuZCA9IHMgKyBzaXplOwotCiAgICAgd2hpbGUgKHMgPCBlbmQpIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBjOwotICAgICAgICBQeV9VQ1M0IHg7Ci0gICAgICAgIGludCBkaWdpdHM7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9ICh1bnNpZ25lZCBjaGFyKSAqcysrOworICAgICAgICBQeV9VQ1M0IGNoOworICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnRpbnBvczsKKyAgICAgICAgUHlfc3NpemVfdCBlbmRpbnBvczsKKyAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKKworI2RlZmluZSBXUklURV9BU0NJSV9DSEFSKGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGFzc2VydChjaCA8PSAxMjcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGFzc2VydCh3cml0ZXIucG9zIDwgd3JpdGVyLnNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURSh3cml0ZXIua2luZCwgd3JpdGVyLmRhdGEsIHdyaXRlci5wb3MrKywgY2gpOyAgXAorICAgICAgICAgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIFdSSVRFX0NIQVIoY2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGNoIDw9IHdyaXRlci5tYXhjaGFyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh3cml0ZXIucG9zIDwgd3JpdGVyLnNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURSh3cml0ZXIua2luZCwgd3JpdGVyLmRhdGEsIHdyaXRlci5wb3MrKywgY2gpOyBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX1B5VW5pY29kZVdyaXRlcl9Xcml0ZUNoYXJJbmxpbmUoJndyaXRlciwgY2gpIDwgMCkgeyBcCisgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IHdoaWxlKDApCiAKICAgICAgICAgLyogTm9uLWVzY2FwZSBjaGFyYWN0ZXJzIGFyZSBpbnRlcnByZXRlZCBhcyBVbmljb2RlIG9yZGluYWxzICovCi0gICAgICAgIGlmICgqcyAhPSAnXFwnKSB7Ci0gICAgICAgICAgICB4ID0gKHVuc2lnbmVkIGNoYXIpKnM7Ci0gICAgICAgICAgICBzKys7Ci0gICAgICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9Xcml0ZUNoYXJJbmxpbmUoJndyaXRlciwgeCkgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgaWYgKGMgIT0gJ1xcJykgeworICAgICAgICAgICAgV1JJVEVfQ0hBUihjKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgc3RhcnRpbnBvcyA9IHMtc3RhcnRzOworICAgICAgICBzdGFydGlucG9zID0gcyAtIHN0YXJ0cyAtIDE7CiAgICAgICAgIC8qIFwgLSBFc2NhcGVzICovCi0gICAgICAgIHMrKzsKLSAgICAgICAgYyA9ICpzKys7Ci0gICAgICAgIGlmIChzID4gZW5kKQotICAgICAgICAgICAgYyA9ICdcMCc7IC8qIEludmFsaWQgYWZ0ZXIgXCAqLworICAgICAgICBpZiAocyA+PSBlbmQpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiXFwgYXQgZW5kIG9mIHN0cmluZyI7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGMgPSAodW5zaWduZWQgY2hhcikgKnMrKzsKIAorICAgICAgICBhc3NlcnQod3JpdGVyLnBvcyA8IHdyaXRlci5zaXplKTsKICAgICAgICAgc3dpdGNoIChjKSB7CiAKICAgICAgICAgICAgIC8qIFx4IGVzY2FwZXMgKi8KLSNkZWZpbmUgV1JJVEVDSEFSKGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9Xcml0ZUNoYXJJbmxpbmUoJndyaXRlciwgKGNoKSkgPCAwKSAgICBcCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9IHdoaWxlKDApCi0KLSAgICAgICAgY2FzZSAnXG4nOiBicmVhazsKLSAgICAgICAgY2FzZSAnXFwnOiBXUklURUNIQVIoJ1xcJyk7IGJyZWFrOwotICAgICAgICBjYXNlICdcJyc6IFdSSVRFQ0hBUignXCcnKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1wiJzogV1JJVEVDSEFSKCdcIicpOyBicmVhazsKLSAgICAgICAgY2FzZSAnYic6IFdSSVRFQ0hBUignXGInKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xuJzogY29udGludWU7CisgICAgICAgIGNhc2UgJ1xcJzogV1JJVEVfQVNDSUlfQ0hBUignXFwnKTsgY29udGludWU7CisgICAgICAgIGNhc2UgJ1wnJzogV1JJVEVfQVNDSUlfQ0hBUignXCcnKTsgY29udGludWU7CisgICAgICAgIGNhc2UgJ1wiJzogV1JJVEVfQVNDSUlfQ0hBUignXCInKTsgY29udGludWU7CisgICAgICAgIGNhc2UgJ2InOiBXUklURV9BU0NJSV9DSEFSKCdcYicpOyBjb250aW51ZTsKICAgICAgICAgLyogRkYgKi8KLSAgICAgICAgY2FzZSAnZic6IFdSSVRFQ0hBUignXDAxNCcpOyBicmVhazsKLSAgICAgICAgY2FzZSAndCc6IFdSSVRFQ0hBUignXHQnKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ24nOiBXUklURUNIQVIoJ1xuJyk7IGJyZWFrOwotICAgICAgICBjYXNlICdyJzogV1JJVEVDSEFSKCdccicpOyBicmVhazsKKyAgICAgICAgY2FzZSAnZic6IFdSSVRFX0FTQ0lJX0NIQVIoJ1wwMTQnKTsgY29udGludWU7CisgICAgICAgIGNhc2UgJ3QnOiBXUklURV9BU0NJSV9DSEFSKCdcdCcpOyBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnbic6IFdSSVRFX0FTQ0lJX0NIQVIoJ1xuJyk7IGNvbnRpbnVlOworICAgICAgICBjYXNlICdyJzogV1JJVEVfQVNDSUlfQ0hBUignXHInKTsgY29udGludWU7CiAgICAgICAgIC8qIFZUICovCi0gICAgICAgIGNhc2UgJ3YnOiBXUklURUNIQVIoJ1wwMTMnKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ3YnOiBXUklURV9BU0NJSV9DSEFSKCdcMDEzJyk7IGNvbnRpbnVlOwogICAgICAgICAvKiBCRUwsIG5vdCBjbGFzc2ljIEMgKi8KLSAgICAgICAgY2FzZSAnYSc6IFdSSVRFQ0hBUignXDAwNycpOyBicmVhazsKKyAgICAgICAgY2FzZSAnYSc6IFdSSVRFX0FTQ0lJX0NIQVIoJ1wwMDcnKTsgY29udGludWU7CiAKICAgICAgICAgICAgIC8qIFxPT08gKG9jdGFsKSBlc2NhcGVzICovCiAgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOgogICAgICAgICBjYXNlICc0JzogY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzoKLSAgICAgICAgICAgIHggPSBzWy0xXSAtICcwJzsKKyAgICAgICAgICAgIGNoID0gYyAtICcwJzsKICAgICAgICAgICAgIGlmIChzIDwgZW5kICYmICcwJyA8PSAqcyAmJiAqcyA8PSAnNycpIHsKLSAgICAgICAgICAgICAgICB4ID0gKHg8PDMpICsgKnMrKyAtICcwJzsKLSAgICAgICAgICAgICAgICBpZiAocyA8IGVuZCAmJiAnMCcgPD0gKnMgJiYgKnMgPD0gJzcnKQotICAgICAgICAgICAgICAgICAgICB4ID0gKHg8PDMpICsgKnMrKyAtICcwJzsKKyAgICAgICAgICAgICAgICBjaCA9IChjaDw8MykgKyAqcysrIC0gJzAnOworICAgICAgICAgICAgICAgIGlmIChzIDwgZW5kICYmICcwJyA8PSAqcyAmJiAqcyA8PSAnNycpIHsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSAoY2g8PDMpICsgKnMrKyAtICcwJzsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBXUklURUNIQVIoeCk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFdSSVRFX0NIQVIoY2gpOworICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICAgIC8qIGhleCBlc2NhcGVzICovCiAgICAgICAgICAgICAvKiBceFhYICovCiAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgZGlnaXRzID0gMjsKKyAgICAgICAgICAgIGNvdW50ID0gMjsKICAgICAgICAgICAgIG1lc3NhZ2UgPSAidHJ1bmNhdGVkIFxceFhYIGVzY2FwZSI7CiAgICAgICAgICAgICBnb3RvIGhleGVzY2FwZTsKIAogICAgICAgICAgICAgLyogXHVYWFhYICovCiAgICAgICAgIGNhc2UgJ3UnOgotICAgICAgICAgICAgZGlnaXRzID0gNDsKKyAgICAgICAgICAgIGNvdW50ID0gNDsKICAgICAgICAgICAgIG1lc3NhZ2UgPSAidHJ1bmNhdGVkIFxcdVhYWFggZXNjYXBlIjsKICAgICAgICAgICAgIGdvdG8gaGV4ZXNjYXBlOwogCiAgICAgICAgICAgICAvKiBcVVhYWFhYWFhYICovCiAgICAgICAgIGNhc2UgJ1UnOgotICAgICAgICAgICAgZGlnaXRzID0gODsKKyAgICAgICAgICAgIGNvdW50ID0gODsKICAgICAgICAgICAgIG1lc3NhZ2UgPSAidHJ1bmNhdGVkIFxcVVhYWFhYWFhYIGVzY2FwZSI7CiAgICAgICAgIGhleGVzY2FwZToKLSAgICAgICAgICAgIGNociA9IDA7Ci0gICAgICAgICAgICBpZiAoZW5kIC0gcyA8IGRpZ2l0cykgewotICAgICAgICAgICAgICAgIC8qIGNvdW50IG9ubHkgaGV4IGRpZ2l0cyAqLwotICAgICAgICAgICAgICAgIGZvciAoOyBzIDwgZW5kOyArK3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYyA9ICh1bnNpZ25lZCBjaGFyKSpzOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVB5X0lTWERJR0lUKGMpKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoOyBkaWdpdHMtLTsgKytzKSB7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY291bnQgJiYgcyA8IGVuZDsgKytzLCAtLWNvdW50KSB7CiAgICAgICAgICAgICAgICAgYyA9ICh1bnNpZ25lZCBjaGFyKSpzOwotICAgICAgICAgICAgICAgIGlmICghUHlfSVNYRElHSVQoYykpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgY2hyID0gKGNocjw8NCkgJiB+MHhGOwotICAgICAgICAgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgY2hyICs9IGMgLSAnMCc7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCi0gICAgICAgICAgICAgICAgICAgIGNociArPSAxMCArIGMgLSAnYSc7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjaHIgKz0gMTAgKyBjIC0gJ0EnOworICAgICAgICAgICAgICAgIGNoIDw8PSA0OworICAgICAgICAgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICBjaCArPSBjIC0gJzAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykgeworICAgICAgICAgICAgICAgICAgICBjaCArPSBjIC0gKCdhJyAtIDEwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpIHsKKyAgICAgICAgICAgICAgICAgICAgY2ggKz0gYyAtICgnQScgLSAxMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hyID09IDB4ZmZmZmZmZmYgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgICAgICAvKiBfZGVjb2RpbmdfZXJyb3Igd2lsbCBoYXZlIGFscmVhZHkgd3JpdHRlbiBpbnRvIHRoZQotICAgICAgICAgICAgICAgICAgIHRhcmdldCBidWZmZXIuICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHN0b3JlOgotICAgICAgICAgICAgLyogd2hlbiB3ZSBnZXQgaGVyZSwgY2hyIGlzIGEgMzItYml0IHVuaWNvZGUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICBtZXNzYWdlID0gImlsbGVnYWwgVW5pY29kZSBjaGFyYWN0ZXIiOwotICAgICAgICAgICAgaWYgKGNociA+IE1BWF9VTklDT0RFKQorICAgICAgICAgICAgaWYgKGNvdW50KSB7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIFdSSVRFQ0hBUihjaHIpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHdoZW4gd2UgZ2V0IGhlcmUsIGNoIGlzIGEgMzItYml0IHVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgICAgICAgICBpZiAoY2ggPiBNQVhfVU5JQ09ERSkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiaWxsZWdhbCBVbmljb2RlIGNoYXJhY3RlciI7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgV1JJVEVfQ0hBUihjaCk7CisgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgLyogXE57bmFtZX0gKi8KICAgICAgICAgY2FzZSAnTic6Ci0gICAgICAgICAgICBtZXNzYWdlID0gIm1hbGZvcm1lZCBcXE4gY2hhcmFjdGVyIGVzY2FwZSI7CiAgICAgICAgICAgICBpZiAodWNuaGFzaF9DQVBJID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAvKiBsb2FkIHRoZSB1bmljb2RlIGRhdGEgbW9kdWxlICovCiAgICAgICAgICAgICAgICAgdWNuaGFzaF9DQVBJID0gKF9QeVVuaWNvZGVfTmFtZV9DQVBJICopUHlDYXBzdWxlX0ltcG9ydCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZURhdGFfQ0FQU1VMRV9OQU1FLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAodWNuaGFzaF9DQVBJID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gdWNuaGFzaEVycm9yOworICAgICAgICAgICAgICAgIGlmICh1Y25oYXNoX0NBUEkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19Vbmljb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiXFxOIGVzY2FwZXMgbm90IHN1cHBvcnRlZCAoY2FuJ3QgbG9hZCB1bmljb2RlZGF0YSBtb2R1bGUpIgorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVzc2FnZSA9ICJtYWxmb3JtZWQgXFxOIGNoYXJhY3RlciBlc2NhcGUiOwogICAgICAgICAgICAgaWYgKCpzID09ICd7JykgewotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0ID0gcysxOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0ID0gKytzOworICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lbGVuOwogICAgICAgICAgICAgICAgIC8qIGxvb2sgZm9yIHRoZSBjbG9zaW5nIGJyYWNlICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKCpzICE9ICd9JyAmJiBzIDwgZW5kKQorICAgICAgICAgICAgICAgIHdoaWxlIChzIDwgZW5kICYmICpzICE9ICd9JykKICAgICAgICAgICAgICAgICAgICAgcysrOwotICAgICAgICAgICAgICAgIGlmIChzID4gc3RhcnQgJiYgcyA8IGVuZCAmJiAqcyA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICBuYW1lbGVuID0gcyAtIHN0YXJ0OworICAgICAgICAgICAgICAgIGlmIChuYW1lbGVuICYmIHMgPCBlbmQpIHsKICAgICAgICAgICAgICAgICAgICAgLyogZm91bmQgYSBuYW1lLiAgbG9vayBpdCB1cCBpbiB0aGUgdW5pY29kZSBkYXRhYmFzZSAqLwotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gInVua25vd24gVW5pY29kZSBjaGFyYWN0ZXIgbmFtZSI7CiAgICAgICAgICAgICAgICAgICAgIHMrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMgLSBzdGFydCAtIDEgPD0gSU5UX01BWCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgdWNuaGFzaF9DQVBJLT5nZXRjb2RlKE5VTEwsIHN0YXJ0LCAoaW50KShzLXN0YXJ0LTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaHIsIDApKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzdG9yZTsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSAweGZmZmZmZmZmOyAvKiBpbiBjYXNlICdnZXRjb2RlJyBtZXNzZXMgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVsZW4gPD0gSU5UX01BWCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgdWNuaGFzaF9DQVBJLT5nZXRjb2RlKE5VTEwsIHN0YXJ0LCAoaW50KW5hbWVsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFX0NIQVIoY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJ1bmtub3duIFVuaWNvZGUgY2hhcmFjdGVyIG5hbWUiOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChzID4gZW5kKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJcXCBhdCBlbmQgb2Ygc3RyaW5nIjsKLSAgICAgICAgICAgICAgICBzLS07Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFdSSVRFQ0hBUignXFwnKTsKLSAgICAgICAgICAgICAgICBXUklURUNIQVIoKHVuc2lnbmVkIGNoYXIpc1stMV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgJ1xcJWMnIiwgYykgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgIFdSSVRFX0FTQ0lJX0NIQVIoJ1xcJyk7CisgICAgICAgICAgICBXUklURV9DSEFSKGMpOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgY29udGludWU7CiAKICAgICAgIGVycm9yOgogICAgICAgICBlbmRpbnBvcyA9IHMtc3RhcnRzOworICAgICAgICB3cml0ZXIubWluX2xlbmd0aCA9IGVuZCAtIHMgKyB3cml0ZXIucG9zOwogICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXJfd3JpdGVyKAogICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwKICAgICAgICAgICAgICAgICAidW5pY29kZWVzY2FwZSIsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgJnN0YXJ0cywgJmVuZCwgJnN0YXJ0aW5wb3MsICZlbmRpbnBvcywgJmV4YywgJnMsCi0gICAgICAgICAgICAgICAgJndyaXRlcikpCisgICAgICAgICAgICAgICAgJndyaXRlcikpIHsKICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCB3cml0ZXIubWluX2xlbmd0aCwgMTI3KSA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgfQorCisjdW5kZWYgV1JJVEVfQVNDSUlfQ0hBUgorI3VuZGVmIFdSSVRFX0NIQVIKICAgICB9Ci0jdW5kZWYgV1JJVEVDSEFSCiAKICAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CiAgICAgUHlfWERFQ1JFRihleGMpOwogICAgIHJldHVybiBfUHlVbmljb2RlV3JpdGVyX0ZpbmlzaCgmd3JpdGVyKTsKIAotICB1Y25oYXNoRXJyb3I6Ci0gICAgUHlFcnJfU2V0U3RyaW5nKAotICAgICAgICBQeUV4Y19Vbmljb2RlRXJyb3IsCi0gICAgICAgICJcXE4gZXNjYXBlcyBub3Qgc3VwcG9ydGVkIChjYW4ndCBsb2FkIHVuaWNvZGVkYXRhIG1vZHVsZSkiCi0gICAgICAgICk7Ci0gICAgX1B5VW5pY29kZVdyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKLSAgICBQeV9YREVDUkVGKGV4Yyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0KICAgb25FcnJvcjoKICAgICBfUHlVbmljb2RlV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOwpAQCAtNTg3MCw5ICs2MTE1LDkgQEAKICAgICBQeV9zc2l6ZV90IGksIGxlbjsKICAgICBQeU9iamVjdCAqcmVwcjsKICAgICBjaGFyICpwOwotICAgIGludCBraW5kOworICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZDsKICAgICB2b2lkICpkYXRhOwotICAgIFB5X3NzaXplX3QgZXhwYW5kc2l6ZSA9IDA7CisgICAgUHlfc3NpemVfdCBleHBhbmRzaXplOwogCiAgICAgLyogSW5pdGlhbCBhbGxvY2F0aW9uIGlzIGJhc2VkIG9uIHRoZSBsb25nZXN0LXBvc3NpYmxlIGNoYXJhY3RlcgogICAgICAgIGVzY2FwZS4KQEAgLTU4ODYsNjAgKzYxMzEsNzEgQEAKICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkodW5pY29kZSkgPT0gLTEpCisgICAgaWYgKFB5VW5pY29kZV9SRUFEWSh1bmljb2RlKSA9PSAtMSkgewogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh1bmljb2RlKTsKLSAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodW5pY29kZSk7Ci0gICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHVuaWNvZGUpOwotICAgIHN3aXRjaCAoa2luZCkgewotICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6IGV4cGFuZHNpemUgPSA0OyBicmVhazsKLSAgICBjYXNlIFB5VW5pY29kZV8yQllURV9LSU5EOiBleHBhbmRzaXplID0gNjsgYnJlYWs7Ci0gICAgY2FzZSBQeVVuaWNvZGVfNEJZVEVfS0lORDogZXhwYW5kc2l6ZSA9IDEwOyBicmVhazsKICAgICB9CiAKLSAgICBpZiAobGVuID09IDApCisgICAgbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgodW5pY29kZSk7CisgICAgaWYgKGxlbiA9PSAwKSB7CiAgICAgICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOworICAgIH0KIAotICAgIGlmIChsZW4gPiAoUFlfU1NJWkVfVF9NQVggLSAyIC0gMSkgLyBleHBhbmRzaXplKQorICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh1bmljb2RlKTsKKyAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodW5pY29kZSk7CisgICAgLyogNCBieXRlIGNoYXJhY3RlcnMgY2FuIHRha2UgdXAgMTAgYnl0ZXMsIDIgYnl0ZSBjaGFyYWN0ZXJzIGNhbiB0YWtlIHVwIDYKKyAgICAgICBieXRlcywgYW5kIDEgYnl0ZSBjaGFyYWN0ZXJzIDQuICovCisgICAgZXhwYW5kc2l6ZSA9IGtpbmQgKiAyICsgMjsKKyAgICBpZiAobGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gMiAtIDEpIC8gZXhwYW5kc2l6ZSkgewogICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQotICAgIHJlcHIgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXhwYW5kc2l6ZSpsZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEpOwotICAgIGlmIChyZXByID09IE5VTEwpCisgICAgfQorICAgIHJlcHIgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDIgKyBleHBhbmRzaXplICogbGVuICsgMSk7CisgICAgaWYgKHJlcHIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICBwID0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7Ci0KICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOwogCi0gICAgICAgIC8qIEVzY2FwZSBiYWNrc2xhc2hlcyAqLwotICAgICAgICBpZiAoY2ggPT0gJ1xcJykgewotICAgICAgICAgICAgKnArKyA9ICdcXCc7Ci0gICAgICAgICAgICAqcCsrID0gKGNoYXIpIGNoOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KKyAgICAgICAgLyogVSswMDAwLVUrMDBmZiByYW5nZSAqLworICAgICAgICBpZiAoY2ggPCAweDEwMCkgeworICAgICAgICAgICAgaWYgKGNoID49ICcgJyAmJiBjaCA8IDEyNykgeworICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgcHJpbnRhYmxlIFVTIEFTQ0lJIGFzLWlzICovCisgICAgICAgICAgICAgICAgICAgICpwKysgPSAoY2hhcikgY2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEVzY2FwZSBiYWNrc2xhc2hlcyAqLworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9ICdcXCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0gICAgICAgIC8qIE1hcCAyMS1iaXQgY2hhcmFjdGVycyB0byAnXFUwMHh4eHh4eCcgKi8KLSAgICAgICAgZWxzZSBpZiAoY2ggPj0gMHgxMDAwMCkgewotICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKLSAgICAgICAgICAgICpwKysgPSAnXFwnOwotICAgICAgICAgICAgKnArKyA9ICdVJzsKLSAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDI4KSAmIDB4MDAwMDAwMEZdOwotICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMjQpICYgMHgwMDAwMDAwRl07Ci0gICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAyMCkgJiAweDAwMDAwMDBGXTsKLSAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDE2KSAmIDB4MDAwMDAwMEZdOwotICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMTIpICYgMHgwMDAwMDAwRl07Ci0gICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiA4KSAmIDB4MDAwMDAwMEZdOwotICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gNCkgJiAweDAwMDAwMDBGXTsKLSAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbY2ggJiAweDAwMDAwMDBGXTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CisgICAgICAgICAgICAvKiBNYXAgc3BlY2lhbCB3aGl0ZXNwYWNlIHRvICdcdCcsIFxuJywgJ1xyJyAqLworICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1x0JykgeworICAgICAgICAgICAgICAgICpwKysgPSAnXFwnOworICAgICAgICAgICAgICAgICpwKysgPSAndCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgKnArKyA9ICdcXCc7CisgICAgICAgICAgICAgICAgKnArKyA9ICduJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKKyAgICAgICAgICAgICAgICAqcCsrID0gJ3InOworICAgICAgICAgICAgfQogCi0gICAgICAgIC8qIE1hcCAxNi1iaXQgY2hhcmFjdGVycyB0byAnXHV4eHh4JyAqLwotICAgICAgICBpZiAoY2ggPj0gMjU2KSB7CisgICAgICAgICAgICAvKiBNYXAgbm9uLXByaW50YWJsZSBVUyBBU0NJSSBhbmQgOC1iaXQgY2hhcmFjdGVycyB0byAnXHhISCcgKi8KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICpwKysgPSAnXFwnOworICAgICAgICAgICAgICAgICpwKysgPSAneCc7CisgICAgICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gNCkgJiAweDAwMEZdOworICAgICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbY2ggJiAweDAwMEZdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFUrMDAwMC1VKzAwZmYgcmFuZ2U6IE1hcCAxNi1iaXQgY2hhcmFjdGVycyB0byAnXHVISEhIJyAqLworICAgICAgICBlbHNlIGlmIChjaCA8IDB4MTAwMDApIHsKKyAgICAgICAgICAgIC8qIFUrMDEwMC1VK2ZmZmYgKi8KICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICd1JzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDEyKSAmIDB4MDAwRl07CkBAIC01OTQ3LDM3ICs2MjAzLDI4IEBACiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiA0KSAmIDB4MDAwRl07CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzW2NoICYgMHgwMDBGXTsKICAgICAgICAgfQorICAgICAgICAvKiBVKzAxMDAwMC1VKzEwZmZmZiByYW5nZTogTWFwIDIxLWJpdCBjaGFyYWN0ZXJzIHRvICdcVTAwSEhISEhIJyAqLworICAgICAgICBlbHNlIHsKIAotICAgICAgICAvKiBNYXAgc3BlY2lhbCB3aGl0ZXNwYWNlIHRvICdcdCcsIFxuJywgJ1xyJyAqLwotICAgICAgICBlbHNlIGlmIChjaCA9PSAnXHQnKSB7CisgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgdHdvIGRpZ2l0cyBhcmUgemVybyAqLworICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFICYmIE1BWF9VTklDT0RFIDw9IDB4MTBmZmZmKTsKICAgICAgICAgICAgICpwKysgPSAnXFwnOwotICAgICAgICAgICAgKnArKyA9ICd0JzsKKyAgICAgICAgICAgICpwKysgPSAnVSc7CisgICAgICAgICAgICAqcCsrID0gJzAnOworICAgICAgICAgICAgKnArKyA9ICcwJzsKKyAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDIwKSAmIDB4MDAwMDAwMEZdOworICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMTYpICYgMHgwMDAwMDAwRl07CisgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAxMikgJiAweDAwMDAwMDBGXTsKKyAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDgpICYgMHgwMDAwMDAwRl07CisgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiA0KSAmIDB4MDAwMDAwMEZdOworICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1tjaCAmIDB4MDAwMDAwMEZdOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICpwKysgPSAnXFwnOwotICAgICAgICAgICAgKnArKyA9ICduJzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaCA9PSAnXHInKSB7Ci0gICAgICAgICAgICAqcCsrID0gJ1xcJzsKLSAgICAgICAgICAgICpwKysgPSAncic7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBNYXAgbm9uLXByaW50YWJsZSBVUyBBU0NJSSB0byAnXHhoaCcgKi8KLSAgICAgICAgZWxzZSBpZiAoY2ggPCAnICcgfHwgY2ggPj0gMHg3RikgewotICAgICAgICAgICAgKnArKyA9ICdcXCc7Ci0gICAgICAgICAgICAqcCsrID0gJ3gnOwotICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gNCkgJiAweDAwMEZdOwotICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1tjaCAmIDB4MDAwRl07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBhcy1pcyAqLwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqcCsrID0gKGNoYXIpIGNoOwogICAgIH0KIAogICAgIGFzc2VydChwIC0gUHlCeXRlc19BU19TVFJJTkcocmVwcikgPiAwKTsKLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXByLCBwIC0gUHlCeXRlc19BU19TVFJJTkcocmVwcikpIDwgMCkKKyAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXByLCBwIC0gUHlCeXRlc19BU19TVFJJTkcocmVwcikpIDwgMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgcmV0dXJuIHJlcHI7CiB9CiAKQEAgLTU5ODcsOCArNjIzNCwxMCBAQAogewogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgUHlPYmplY3QgKnRtcCA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShzLCBzaXplKTsKLSAgICBpZiAodG1wID09IE5VTEwpCisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcodG1wKTsKICAgICBQeV9ERUNSRUYodG1wKTsKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNjAwMiw5NSArNjI1MSwxMDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBjb25zdCBjaGFyICpzdGFydHMgPSBzOwotICAgIFB5X3NzaXplX3Qgc3RhcnRpbnBvczsKLSAgICBQeV9zc2l6ZV90IGVuZGlucG9zOwogICAgIF9QeVVuaWNvZGVXcml0ZXIgd3JpdGVyOwogICAgIGNvbnN0IGNoYXIgKmVuZDsKLSAgICBjb25zdCBjaGFyICpiczsKICAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKIAotICAgIGlmIChzaXplID09IDApCisgICAgaWYgKHNpemUgPT0gMCkgewogICAgICAgICBfUHlfUkVUVVJOX1VOSUNPREVfRU1QVFkoKTsKKyAgICB9CiAKICAgICAvKiBFc2NhcGVkIHN0cmluZ3Mgd2lsbCBhbHdheXMgYmUgbG9uZ2VyIHRoYW4gdGhlIHJlc3VsdGluZwogICAgICAgIFVuaWNvZGUgc3RyaW5nLCBzbyB3ZSBzdGFydCB3aXRoIHNpemUgaGVyZSBhbmQgdGhlbiByZWR1Y2UgdGhlCiAgICAgICAgbGVuZ3RoIGFmdGVyIGNvbnZlcnNpb24gdG8gdGhlIHRydWUgdmFsdWUuIChCdXQgZGVjb2RpbmcgZXJyb3IKICAgICAgICBoYW5kbGVyIG1pZ2h0IGhhdmUgdG8gcmVzaXplIHRoZSBzdHJpbmcpICovCiAgICAgX1B5VW5pY29kZVdyaXRlcl9Jbml0KCZ3cml0ZXIpOwotICAgIHdyaXRlci5taW5fbGVuZ3RoID0gc2l6ZTsKKyAgICAgd3JpdGVyLm1pbl9sZW5ndGggPSBzaXplOworICAgIGlmIChfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgc2l6ZSwgMTI3KSA8IDApIHsKKyAgICAgICAgZ290byBvbkVycm9yOworICAgIH0KIAogICAgIGVuZCA9IHMgKyBzaXplOwogICAgIHdoaWxlIChzIDwgZW5kKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgYzsKLSAgICAgICAgUHlfVUNTNCB4OwotICAgICAgICBpbnQgaTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gKHVuc2lnbmVkIGNoYXIpICpzKys7CisgICAgICAgIFB5X1VDUzQgY2g7CiAgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydGlucG9zOworICAgICAgICBQeV9zc2l6ZV90IGVuZGlucG9zOworICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlOworCisjZGVmaW5lIFdSSVRFX0NIQVIoY2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGNoIDw9IHdyaXRlci5tYXhjaGFyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh3cml0ZXIucG9zIDwgd3JpdGVyLnNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURSh3cml0ZXIua2luZCwgd3JpdGVyLmRhdGEsIHdyaXRlci5wb3MrKywgY2gpOyBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX1B5VW5pY29kZVdyaXRlcl9Xcml0ZUNoYXJJbmxpbmUoJndyaXRlciwgY2gpIDwgMCkgeyBcCisgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IHdoaWxlKDApCiAKICAgICAgICAgLyogTm9uLWVzY2FwZSBjaGFyYWN0ZXJzIGFyZSBpbnRlcnByZXRlZCBhcyBVbmljb2RlIG9yZGluYWxzICovCi0gICAgICAgIGlmICgqcyAhPSAnXFwnKSB7Ci0gICAgICAgICAgICB4ID0gKHVuc2lnbmVkIGNoYXIpKnMrKzsKLSAgICAgICAgICAgIGlmIChfUHlVbmljb2RlV3JpdGVyX1dyaXRlQ2hhcklubGluZSgmd3JpdGVyLCB4KSA8IDApCi0gICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICBpZiAoYyAhPSAnXFwnIHx8IHMgPj0gZW5kKSB7CisgICAgICAgICAgICBXUklURV9DSEFSKGMpOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgc3RhcnRpbnBvcyA9IHMtc3RhcnRzOwogCi0gICAgICAgIC8qIFx1LWVzY2FwZXMgYXJlIG9ubHkgaW50ZXJwcmV0ZWQgaWZmIHRoZSBudW1iZXIgb2YgbGVhZGluZwotICAgICAgICAgICBiYWNrc2xhc2hlcyBpZiBvZGQgKi8KLSAgICAgICAgYnMgPSBzOwotICAgICAgICBmb3IgKDtzIDwgZW5kOykgewotICAgICAgICAgICAgaWYgKCpzICE9ICdcXCcpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB4ID0gKHVuc2lnbmVkIGNoYXIpKnMrKzsKLSAgICAgICAgICAgIGlmIChfUHlVbmljb2RlV3JpdGVyX1dyaXRlQ2hhcklubGluZSgmd3JpdGVyLCB4KSA8IDApCi0gICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICBjID0gKHVuc2lnbmVkIGNoYXIpICpzKys7CisgICAgICAgIGlmIChjID09ICd1JykgeworICAgICAgICAgICAgY291bnQgPSA0OworICAgICAgICAgICAgbWVzc2FnZSA9ICJ0cnVuY2F0ZWQgXFx1WFhYWCBlc2NhcGUiOwogICAgICAgICB9Ci0gICAgICAgIGlmICgoKHMgLSBicykgJiAxKSA9PSAwIHx8Ci0gICAgICAgICAgICBzID49IGVuZCB8fAotICAgICAgICAgICAgKCpzICE9ICd1JyAmJiAqcyAhPSAnVScpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXIucG9zLS07Ci0gICAgICAgIGNvdW50ID0gKnM9PSd1JyA/IDQgOiA4OwotICAgICAgICBzKys7Ci0KLSAgICAgICAgLyogXHVYWFhYIHdpdGggNCBoZXggZGlnaXRzLCBcVXh4eHh4eHh4IHdpdGggOCAqLwotICAgICAgICBmb3IgKHggPSAwLCBpID0gMDsgaSA8IGNvdW50OyArK2ksICsrcykgewotICAgICAgICAgICAgYyA9ICh1bnNpZ25lZCBjaGFyKSpzOwotICAgICAgICAgICAgaWYgKCFQeV9JU1hESUdJVChjKSkgewotICAgICAgICAgICAgICAgIGVuZGlucG9zID0gcy1zdGFydHM7Ci0gICAgICAgICAgICAgICAgaWYgKHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyX3dyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJyYXd1bmljb2RlZXNjYXBlIiwgInRydW5jYXRlZCBcXHVYWFhYIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydHMsICZlbmQsICZzdGFydGlucG9zLCAmZW5kaW5wb3MsICZleGMsICZzLAotICAgICAgICAgICAgICAgICAgICAgICAgJndyaXRlcikpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgICAgICBnb3RvIG5leHRCeXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeCA9ICh4PDw0KSAmIH4weEY7Ci0gICAgICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0gICAgICAgICAgICAgICAgeCArPSBjIC0gJzAnOwotICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCi0gICAgICAgICAgICAgICAgeCArPSAxMCArIGMgLSAnYSc7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeCArPSAxMCArIGMgLSAnQSc7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHggPD0gTUFYX1VOSUNPREUpIHsKLSAgICAgICAgICAgIGlmIChfUHlVbmljb2RlV3JpdGVyX1dyaXRlQ2hhcklubGluZSgmd3JpdGVyLCB4KSA8IDApCi0gICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICBlbHNlIGlmIChjID09ICdVJykgeworICAgICAgICAgICAgY291bnQgPSA4OworICAgICAgICAgICAgbWVzc2FnZSA9ICJ0cnVuY2F0ZWQgXFxVWFhYWFhYWFggZXNjYXBlIjsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGVuZGlucG9zID0gcy1zdGFydHM7Ci0gICAgICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXJfd3JpdGVyKAotICAgICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvckhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICJyYXd1bmljb2RlZXNjYXBlIiwgIlxcVXh4eHh4eHh4IG91dCBvZiByYW5nZSIsCi0gICAgICAgICAgICAgICAgICAgICZzdGFydHMsICZlbmQsICZzdGFydGlucG9zLCAmZW5kaW5wb3MsICZleGMsICZzLAotICAgICAgICAgICAgICAgICAgICAmd3JpdGVyKSkKLSAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICBhc3NlcnQod3JpdGVyLnBvcyA8IHdyaXRlci5zaXplKTsKKyAgICAgICAgICAgIFB5VW5pY29kZV9XUklURSh3cml0ZXIua2luZCwgd3JpdGVyLmRhdGEsIHdyaXRlci5wb3MrKywgJ1xcJyk7CisgICAgICAgICAgICBXUklURV9DSEFSKGMpOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgIG5leHRCeXRlOgotICAgICAgICA7CisgICAgICAgIHN0YXJ0aW5wb3MgPSBzIC0gc3RhcnRzIC0gMjsKKworICAgICAgICAvKiBcdUhISEggd2l0aCA0IGhleCBkaWdpdHMsIFxVMDBISEhISEggd2l0aCA4ICovCisgICAgICAgIGZvciAoY2ggPSAwOyBjb3VudCAmJiBzIDwgZW5kOyArK3MsIC0tY291bnQpIHsKKyAgICAgICAgICAgIGMgPSAodW5zaWduZWQgY2hhcikqczsKKyAgICAgICAgICAgIGNoIDw8PSA0OworICAgICAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICAgICAgY2ggKz0gYyAtICcwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB7CisgICAgICAgICAgICAgICAgY2ggKz0gYyAtICgnYScgLSAxMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykgeworICAgICAgICAgICAgICAgIGNoICs9IGMgLSAoJ0EnIC0gMTApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb3VudCkgeworICAgICAgICAgICAgaWYgKGNoIDw9IE1BWF9VTklDT0RFKSB7CisgICAgICAgICAgICAgICAgV1JJVEVfQ0hBUihjaCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlID0gIlxcVXh4eHh4eHh4IG91dCBvZiByYW5nZSI7CisgICAgICAgIH0KKworICAgICAgICBlbmRpbnBvcyA9IHMtc3RhcnRzOworICAgICAgICB3cml0ZXIubWluX2xlbmd0aCA9IGVuZCAtIHMgKyB3cml0ZXIucG9zOworICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXJfd3JpdGVyKAorICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwKKyAgICAgICAgICAgICAgICAicmF3dW5pY29kZWVzY2FwZSIsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgJnN0YXJ0cywgJmVuZCwgJnN0YXJ0aW5wb3MsICZlbmRpbnBvcywgJmV4YywgJnMsCisgICAgICAgICAgICAgICAgJndyaXRlcikpIHsKKyAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHdyaXRlci5taW5fbGVuZ3RoLCAxMjcpIDwgMCkgeworICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICB9CisKKyN1bmRlZiBXUklURV9DSEFSCiAgICAgfQogICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CkBAIC02MTAxLDYgKzYzNjIsNyBAQAogICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIE5VTEw7CisKIH0KIAogCkBAIC02MTA5LDcgKzYzNzEsNiBAQAogewogICAgIFB5T2JqZWN0ICpyZXByOwogICAgIGNoYXIgKnA7Ci0gICAgY2hhciAqcTsKICAgICBQeV9zc2l6ZV90IGV4cGFuZHNpemUsIHBvczsKICAgICBpbnQga2luZDsKICAgICB2b2lkICpkYXRhOwpAQCAtNjExOSw0MyArNjM4MCw0MSBAQAogICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWSh1bmljb2RlKSA9PSAtMSkKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKHVuaWNvZGUpID09IC0xKSB7CiAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodW5pY29kZSk7CiAgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHVuaWNvZGUpOwogICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHVuaWNvZGUpOworICAgIGlmIChraW5kID09IFB5VW5pY29kZV8xQllURV9LSU5EKSB7CisgICAgICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIGxlbik7CisgICAgfQorCiAgICAgLyogNCBieXRlIGNoYXJhY3RlcnMgY2FuIHRha2UgdXAgMTAgYnl0ZXMsIDIgYnl0ZSBjaGFyYWN0ZXJzIGNhbiB0YWtlIHVwIDYKICAgICAgICBieXRlcywgYW5kIDEgYnl0ZSBjaGFyYWN0ZXJzIDQuICovCiAgICAgZXhwYW5kc2l6ZSA9IGtpbmQgKiAyICsgMjsKIAotICAgIGlmIChsZW4gPiBQWV9TU0laRV9UX01BWCAvIGV4cGFuZHNpemUpCisgICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gZXhwYW5kc2l6ZSkgewogICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQorICAgIH0KICAgICByZXByID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBleHBhbmRzaXplICogbGVuKTsKLSAgICBpZiAocmVwciA9PSBOVUxMKQorICAgIGlmIChyZXByID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGxlbiA9PSAwKQorICAgIH0KKyAgICBpZiAobGVuID09IDApIHsKICAgICAgICAgcmV0dXJuIHJlcHI7CisgICAgfQogCi0gICAgcCA9IHEgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXByKTsKKyAgICBwID0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7CiAgICAgZm9yIChwb3MgPSAwOyBwb3MgPCBsZW47IHBvcysrKSB7CiAgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBwb3MpOwotICAgICAgICAvKiBNYXAgMzItYml0IGNoYXJhY3RlcnMgdG8gJ1xVeHh4eHh4eHgnICovCi0gICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSB7Ci0gICAgICAgICAgICBhc3NlcnQoY2ggPD0gTUFYX1VOSUNPREUpOwotICAgICAgICAgICAgKnArKyA9ICdcXCc7Ci0gICAgICAgICAgICAqcCsrID0gJ1UnOwotICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMjgpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDI0KSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAyMCkgJiAweGZdOwotICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMTYpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDEyKSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiA4KSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiA0KSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzW2NoICYgMTVdOworCisgICAgICAgIC8qIFUrMDAwMC1VKzAwZmYgcmFuZ2U6IENvcHkgOC1iaXQgY2hhcmFjdGVycyBhcy1pcyAqLworICAgICAgICBpZiAoY2ggPCAweDEwMCkgeworICAgICAgICAgICAgKnArKyA9IChjaGFyKSBjaDsKICAgICAgICAgfQotICAgICAgICAvKiBNYXAgMTYtYml0IGNoYXJhY3RlcnMgdG8gJ1x1eHh4eCcgKi8KLSAgICAgICAgZWxzZSBpZiAoY2ggPj0gMjU2KSB7CisgICAgICAgIC8qIFUrMDAwMC1VKzAwZmYgcmFuZ2U6IE1hcCAxNi1iaXQgY2hhcmFjdGVycyB0byAnXHVISEhIJyAqLworICAgICAgICBlbHNlIGlmIChjaCA8IDB4MTAwMDApIHsKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICd1JzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDEyKSAmIDB4Zl07CkBAIC02MTYzLDE0ICs2NDIyLDI2IEBACiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiA0KSAmIDB4Zl07CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzW2NoICYgMTVdOwogICAgICAgICB9Ci0gICAgICAgIC8qIENvcHkgZXZlcnl0aGluZyBlbHNlIGFzLWlzICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICpwKysgPSAoY2hhcikgY2g7CisgICAgICAgIC8qIFUrMDEwMDAwLVUrMTBmZmZmIHJhbmdlOiBNYXAgMzItYml0IGNoYXJhY3RlcnMgdG8gJ1xVMDBISEhISEgnICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFICYmIE1BWF9VTklDT0RFIDw9IDB4MTBmZmZmKTsKKyAgICAgICAgICAgICpwKysgPSAnXFwnOworICAgICAgICAgICAgKnArKyA9ICdVJzsKKyAgICAgICAgICAgICpwKysgPSAnMCc7CisgICAgICAgICAgICAqcCsrID0gJzAnOworICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMjApICYgMHhmXTsKKyAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDE2KSAmIDB4Zl07CisgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAxMikgJiAweGZdOworICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gOCkgJiAweGZdOworICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gNCkgJiAweGZdOworICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1tjaCAmIDE1XTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGFzc2VydChwID4gcSk7Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVwciwgcCAtIHEpIDwgMCkKKyAgICBhc3NlcnQocCA+IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpKTsKKyAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXByLCBwIC0gUHlCeXRlc19BU19TVFJJTkcocmVwcikpIDwgMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgcmV0dXJuIHJlcHI7CiB9CiAKQEAgLTYzNDgsNyArNjYxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IGVuZHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKm5ld3BvcykKIHsKLSAgICBzdGF0aWMgY2hhciAqYXJncGFyc2UgPSAiT247ZW5jb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyL2J5dGVzLCBpbnQpIHR1cGxlIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYXJncGFyc2UgPSAiT247ZW5jb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyL2J5dGVzLCBpbnQpIHR1cGxlIjsKICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICBQeU9iamVjdCAqcmVzdHVwbGU7CiAgICAgUHlPYmplY3QgKnJlc3VuaWNvZGU7CkBAIC02NDAyLDI1ICs2NjczLDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdW5pY29kZV9lbmNvZGVfdWNzMShQeU9iamVjdCAqdW5pY29kZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGltaXQpCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFB5X1VDUzQgbGltaXQpCiB7CiAgICAgLyogaW5wdXQgc3RhdGUgKi8KICAgICBQeV9zc2l6ZV90IHBvcz0wLCBzaXplOwogICAgIGludCBraW5kOwogICAgIHZvaWQgKmRhdGE7Ci0gICAgLyogb3V0cHV0IG9iamVjdCAqLwotICAgIFB5T2JqZWN0ICpyZXM7CiAgICAgLyogcG9pbnRlciBpbnRvIHRoZSBvdXRwdXQgKi8KICAgICBjaGFyICpzdHI7Ci0gICAgLyogY3VycmVudCBvdXRwdXQgcG9zaXRpb24gKi8KLSAgICBQeV9zc2l6ZV90IHJlc3NpemU7CiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSAobGltaXQgPT0gMjU2KSA/ICJsYXRpbi0xIiA6ICJhc2NpaSI7CiAgICAgY29uc3QgY2hhciAqcmVhc29uID0gKGxpbWl0ID09IDI1NikgPyAib3JkaW5hbCBub3QgaW4gcmFuZ2UoMjU2KSIgOiAib3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KSI7Ci0gICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVycm9yX2hhbmRsZXJfb2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKLSAgICAvKiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGNhY2hpbmcgc3RyaW5nIGNvbXBhcmlzb25zCi0gICAgICogLTE9bm90IGluaXRpYWxpemVkLCAwPXVua25vd24sIDE9c3RyaWN0LCAyPXJlcGxhY2UsIDM9aWdub3JlLCA0PXhtbGNoYXJyZWZyZXBsYWNlICovCi0gICAgaW50IGtub3duX2Vycm9ySGFuZGxlciA9IC0xOworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBfUHlfRVJST1JfVU5LTk9XTjsKKyAgICBQeU9iamVjdCAqcmVwID0gTlVMTDsKKyAgICAvKiBvdXRwdXQgb2JqZWN0ICovCisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWSh1bmljb2RlKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC02NDMxLDE4NiArNjY5OSwxNTcgQEAKICAgICAgICByZXBsYWNlbWVudHMsIGlmIHdlIG5lZWQgbW9yZSwgd2UnbGwgcmVzaXplICovCiAgICAgaWYgKHNpemUgPT0gMCkKICAgICAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7Ci0gICAgcmVzID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKTsKLSAgICBpZiAocmVzID09IE5VTEwpCisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHNpemUpOworICAgIGlmIChzdHIgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3RyID0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICByZXNzaXplID0gc2l6ZTsKIAogICAgIHdoaWxlIChwb3MgPCBzaXplKSB7Ci0gICAgICAgIFB5X1VDUzQgYyA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIHBvcyk7CisgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBwb3MpOwogCiAgICAgICAgIC8qIGNhbiB3ZSBlbmNvZGUgdGhpcz8gKi8KLSAgICAgICAgaWYgKGM8bGltaXQpIHsKKyAgICAgICAgaWYgKGNoIDwgbGltaXQpIHsKICAgICAgICAgICAgIC8qIG5vIG92ZXJmbG93IGNoZWNrLCBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgc3BhY2UgaXMgZW5vdWdoICovCi0gICAgICAgICAgICAqc3RyKysgPSAoY2hhciljOworICAgICAgICAgICAgKnN0cisrID0gKGNoYXIpY2g7CiAgICAgICAgICAgICArK3BvczsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgcmVxdWlyZWRzaXplOwotICAgICAgICAgICAgUHlPYmplY3QgKnJlcHVuaWNvZGU7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IHJlcHNpemUsIG5ld3BvcywgcmVzcG9zLCBpOworICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdwb3MsIGk7CiAgICAgICAgICAgICAvKiBzdGFydHBvcyBmb3IgY29sbGVjdGluZyB1bmVuY29kYWJsZSBjaGFycyAqLwogICAgICAgICAgICAgUHlfc3NpemVfdCBjb2xsc3RhcnQgPSBwb3M7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IGNvbGxlbmQgPSBwb3M7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGNvbGxlbmQgPSBjb2xsc3RhcnQgKyAxOwogICAgICAgICAgICAgLyogZmluZCBhbGwgdW5lY29kYWJsZSBjaGFyYWN0ZXJzICovCisKICAgICAgICAgICAgIHdoaWxlICgoY29sbGVuZCA8IHNpemUpICYmIChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBjb2xsZW5kKSA+PSBsaW1pdCkpCiAgICAgICAgICAgICAgICAgKytjb2xsZW5kOworCisgICAgICAgICAgICAvKiBPbmx5IG92ZXJhbGxvY2F0ZSB0aGUgYnVmZmVyIGlmIGl0J3Mgbm90IHRoZSBsYXN0IHdyaXRlICovCisgICAgICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gKGNvbGxlbmQgPCBzaXplKTsKKwogICAgICAgICAgICAgLyogY2FjaGUgY2FsbGJhY2sgbmFtZSBsb29rdXAgKGlmIG5vdCBkb25lIHlldCwgaS5lLiBpdCdzIHRoZSBmaXJzdCBlcnJvcikgKi8KLSAgICAgICAgICAgIGlmIChrbm93bl9lcnJvckhhbmRsZXI9PS0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChlcnJvcnM9PU5VTEwpIHx8ICghc3RyY21wKGVycm9ycywgInN0cmljdCIpKSkKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSkKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gMjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgImlnbm9yZSIpKQotICAgICAgICAgICAgICAgICAgICBrbm93bl9lcnJvckhhbmRsZXIgPSAzOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAieG1sY2hhcnJlZnJlcGxhY2UiKSkKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gNDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGtub3duX2Vycm9ySGFuZGxlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGtub3duX2Vycm9ySGFuZGxlcikgewotICAgICAgICAgICAgY2FzZSAxOiAvKiBzdHJpY3QgKi8KKyAgICAgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9VTktOT1dOKQorICAgICAgICAgICAgICAgIGVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworCisgICAgICAgICAgICBzd2l0Y2ggKGVycm9yX2hhbmRsZXIpIHsKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1NUUklDVDoKICAgICAgICAgICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKCZleGMsIGVuY29kaW5nLCB1bmljb2RlLCBjb2xsc3RhcnQsIGNvbGxlbmQsIHJlYXNvbik7CiAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgY2FzZSAyOiAvKiByZXBsYWNlICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKGNvbGxzdGFydCsrIDwgY29sbGVuZCkKLSAgICAgICAgICAgICAgICAgICAgKnN0cisrID0gJz8nOyAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgIGNhc2UgMzogLyogaWdub3JlICovCisKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CisgICAgICAgICAgICAgICAgbWVtc2V0KHN0ciwgJz8nLCBjb2xsZW5kIC0gY29sbHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBzdHIgKz0gKGNvbGxlbmQgLSBjb2xsc3RhcnQpOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCBpZ25vcmUgZXJyb3IgaGFuZGxlciAqLworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfSUdOT1JFOgogICAgICAgICAgICAgICAgIHBvcyA9IGNvbGxlbmQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6IC8qIHhtbGNoYXJyZWZyZXBsYWNlICovCi0gICAgICAgICAgICAgICAgcmVzcG9zID0gc3RyIC0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgPSByZXNwb3M7Ci0gICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHJlcGxhY2VtZW50IHNpemUgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOwotICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGluY3I7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA8IDEwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrMSsxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzIrMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrMysxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrNCsxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzUrMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrNisxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChjaCA8PSBNQVhfVU5JQ09ERSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMis3KzE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gaW5jcikKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSArPSBpbmNyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gUFlfU1NJWkVfVF9NQVggLSAoc2l6ZSAtIGNvbGxlbmQpKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSArPSBzaXplIC0gY29sbGVuZDsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gcmVzc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzc2l6ZSA8PSBQWV9TU0laRV9UX01BWC8yICYmIHJlcXVpcmVkc2l6ZSA8IDIqcmVzc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSA9IDIqcmVzc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzLCByZXF1aXJlZHNpemUpKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgICAgICBzdHIgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpICsgcmVzcG9zOwotICAgICAgICAgICAgICAgICAgICByZXNzaXplID0gcmVxdWlyZWRzaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBnZW5lcmF0ZSByZXBsYWNlbWVudCAqLwotICAgICAgICAgICAgICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzdHIgKz0gc3ByaW50ZihzdHIsICImIyVkOyIsIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcG9zID0gY29sbGVuZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmVwdW5pY29kZSA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKGVycm9ycywgJmVycm9ySGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIHJlYXNvbiwgdW5pY29kZSwgJmV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbHN0YXJ0LCBjb2xsZW5kLCAmbmV3cG9zKTsKLSAgICAgICAgICAgICAgICBpZiAocmVwdW5pY29kZSA9PSBOVUxMIHx8IChQeVVuaWNvZGVfQ2hlY2socmVwdW5pY29kZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRFkocmVwdW5pY29kZSkgPT0gLTEpKQorCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9CQUNLU0xBU0hSRVBMQUNFOgorICAgICAgICAgICAgICAgIC8qIHN1YnRyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAoY29sbGVuZCAtIGNvbGxzdGFydCk7CisgICAgICAgICAgICAgICAgc3RyID0gYmFja3NsYXNocmVwbGFjZSgmd3JpdGVyLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCBjb2xsc3RhcnQsIGNvbGxlbmQpOworICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHJlcHVuaWNvZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIERpcmVjdGx5IGNvcHkgYnl0ZXMgcmVzdWx0IHRvIG91dHB1dC4gKi8KLSAgICAgICAgICAgICAgICAgICAgcmVwc2l6ZSA9IFB5Qnl0ZXNfU2l6ZShyZXB1bmljb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcHNpemUgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIHJvb20gZm9yIGFsbCBhZGRpdGlvbmFsIGJ5dGVzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9zID0gc3RyIC0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNzaXplID4gUFlfU1NJWkVfVF9NQVggLSByZXBzaXplIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzLCByZXNzaXplK3JlcHNpemUtMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gUHlCeXRlc19BU19TVFJJTkcocmVzKSArIHJlc3BvczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gcmVwc2l6ZS0xOworICAgICAgICAgICAgICAgIHBvcyA9IGNvbGxlbmQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1hNTENIQVJSRUZSRVBMQUNFOgorICAgICAgICAgICAgICAgIC8qIHN1YnRyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAoY29sbGVuZCAtIGNvbGxzdGFydCk7CisgICAgICAgICAgICAgICAgc3RyID0geG1sY2hhcnJlZnJlcGxhY2UoJndyaXRlciwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsIGNvbGxzdGFydCwgY29sbGVuZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICAgICAgcG9zID0gY29sbGVuZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfU1VSUk9HQVRFRVNDQVBFOgorICAgICAgICAgICAgICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPCAweGRjODAgfHwgMHhkY2ZmIDwgY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBhIFVURi04YiBzdXJyb2dhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShzdHIsIFB5Qnl0ZXNfQXNTdHJpbmcocmVwdW5pY29kZSksIHJlcHNpemUpOwotICAgICAgICAgICAgICAgICAgICBzdHIgKz0gcmVwc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgcG9zID0gbmV3cG9zOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7CisgICAgICAgICAgICAgICAgICAgICpzdHIrKyA9IChjaGFyKShjaCAtIDB4ZGMwMCk7CisgICAgICAgICAgICAgICAgICAgICsrcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBjb2xsZW5kKQogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogbmVlZCBtb3JlIHNwYWNlPyAoYXQgbGVhc3QgZW5vdWdoIGZvciB3aGF0IHdlCi0gICAgICAgICAgICAgICAgICAgaGF2ZSt0aGUgcmVwbGFjZW1lbnQrdGhlIHJlc3Qgb2YgdGhlIHN0cmluZywgc28KLSAgICAgICAgICAgICAgICAgICB3ZSB3b24ndCBoYXZlIHRvIGNoZWNrIHNwYWNlIGZvciBlbmNvZGFibGUgY2hhcmFjdGVycykgKi8KLSAgICAgICAgICAgICAgICByZXNwb3MgPSBzdHIgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpOwotICAgICAgICAgICAgICAgIHJlcHNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXB1bmljb2RlKTsKLSAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgPSByZXNwb3M7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gcmVwc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKLSAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgKz0gcmVwc2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gUFlfU1NJWkVfVF9NQVggLSAoc2l6ZSAtIGNvbGxlbmQpKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSArPSBzaXplIC0gY29sbGVuZDsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gcmVzc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzc2l6ZSA8PSBQWV9TU0laRV9UX01BWC8yICYmIHJlcXVpcmVkc2l6ZSA8IDIqcmVzc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSA9IDIqcmVzc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzLCByZXF1aXJlZHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7CisgICAgICAgICAgICAgICAgY29sbHN0YXJ0ID0gcG9zOworICAgICAgICAgICAgICAgIGFzc2VydChjb2xsc3RhcnQgIT0gY29sbGVuZCk7CisgICAgICAgICAgICAgICAgLyogZmFsbGJhY2sgdG8gZ2VuZXJhbCBlcnJvciBoYW5kbGluZyAqLworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlcCA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKGVycm9ycywgJmVycm9yX2hhbmRsZXJfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLCByZWFzb24sIHVuaWNvZGUsICZleGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbHN0YXJ0LCBjb2xsZW5kLCAmbmV3cG9zKTsKKyAgICAgICAgICAgICAgICBpZiAocmVwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKworICAgICAgICAgICAgICAgIC8qIHN1YnRyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAxOworCisgICAgICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2socmVwKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RseSBjb3B5IGJ5dGVzIHJlc3VsdCB0byBvdXRwdXQuICovCisgICAgICAgICAgICAgICAgICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShyZXApKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcykgKyByZXNwb3M7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3NpemUgPSByZXF1aXJlZHNpemU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIHVuZW5jb2RhYmxlIGluIHRoZSByZXBsYWNlbWVudAotICAgICAgICAgICAgICAgICAgIGFuZCBjb3B5IGl0IHRvIHRoZSBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyByZXBzaXplLS0+MDsgKytpLCArK3N0cikgewotICAgICAgICAgICAgICAgICAgICBjID0gUHlVbmljb2RlX1JFQURfQ0hBUihyZXB1bmljb2RlLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gbGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlX2VuY29kZV9leGNlcHRpb24oJmV4YywgZW5jb2RpbmcsIHVuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcywgcG9zKzEsIHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2socmVwKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShyZXApIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0lTX0FTQ0lJKHJlcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgcGF0aDogYWxsIGNoYXJhY3RlcnMgYXJlIHNtYWxsZXIgdGhhbiBsaW1pdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGxpbWl0ID49IDEyOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0tJTkQocmVwKSA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKCZ3cml0ZXIsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0RBVEEocmVwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKnN0ciA9IChjaGFyKWM7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCByZXBzaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBzdHIsIHJlcHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgdW5lbmNvZGFibGUgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCBhbmQgY29weSBpdCB0byB0aGUgb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyByZXBzaXplLS0+MDsgKytpLCArK3N0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQURfQ0hBUihyZXAsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSBsaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKCZleGMsIGVuY29kaW5nLCB1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcywgcG9zKzEsIHJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciA9IChjaGFyKWNoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBvcyA9IG5ld3BvczsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7CisgICAgICAgICAgICAgICAgUHlfQ0xFQVIocmVwKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgb3ZlcmFsbG9jYXRpb24gd2FzIGRpc2FibGVkLCBlbnN1cmUgdGhhdCBpdCB3YXMgdGhlIGxhc3QKKyAgICAgICAgICAgICAgIHdyaXRlLiBPdGhlcndpc2UsIHdlIG1pc3NlZCBhbiBvcHRpbWl6YXRpb24gKi8KKyAgICAgICAgICAgIGFzc2VydCh3cml0ZXIub3ZlcmFsbG9jYXRlIHx8IHBvcyA9PSBzaXplKTsKICAgICAgICAgfQogICAgIH0KLSAgICAvKiBSZXNpemUgaWYgd2UgYWxsb2NhdGVkIHRvIG11Y2ggKi8KLSAgICBzaXplID0gc3RyIC0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICBpZiAoc2l6ZSA8IHJlc3NpemUpIHsgLyogSWYgdGhpcyBmYWxscyByZXMgd2lsbCBiZSBOVUxMICovCi0gICAgICAgIGFzc2VydChzaXplID49IDApOwotICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXMsIHNpemUpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICB9CiAKLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgUHlfWERFQ1JFRihleGMpOwotICAgIHJldHVybiByZXM7Ci0KLSAgb3ZlcmZsb3c6Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICJlbmNvZGVkIHJlc3VsdCBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzdHIpOwogCiAgIG9uRXJyb3I6Ci0gICAgUHlfWERFQ1JFRihyZXMpOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKHJlcCk7CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CkBAIC02NjcwLDggKzY5MDksOSBAQAogICAgIFB5X3NzaXplX3QgZW5kaW5wb3M7CiAgICAgUHlfc3NpemVfdCBvdXRwb3M7CiAgICAgY29uc3QgY2hhciAqZTsKLSAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZXJyb3JfaGFuZGxlcl9vYmogPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBfUHlfRVJST1JfVU5LTk9XTjsKIAogICAgIGlmIChzaXplID09IDApCiAgICAgICAgIF9QeV9SRVRVUk5fVU5JQ09ERV9FTVBUWSgpOwpAQCAtNjcwMCwxMiArNjk0MCw0MiBAQAogICAgICAgICAgICAgUHlVbmljb2RlX1dSSVRFKGtpbmQsIGRhdGEsIHdyaXRlci5wb3MsIGMpOwogICAgICAgICAgICAgd3JpdGVyLnBvcysrOwogICAgICAgICAgICAgKytzOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisKKyAgICAgICAgLyogYnl0ZSBvdXRzaXplIHJhbmdlIDB4MDAuLjB4N2Y6IGNhbGwgdGhlIGVycm9yIGhhbmRsZXIgKi8KKworICAgICAgICBpZiAoZXJyb3JfaGFuZGxlciA9PSBfUHlfRVJST1JfVU5LTk9XTikKKyAgICAgICAgICAgIGVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworCisgICAgICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikKKyAgICAgICAgeworICAgICAgICBjYXNlIF9QeV9FUlJPUl9SRVBMQUNFOgorICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CisgICAgICAgICAgICAvKiBGYXN0LXBhdGg6IHRoZSBlcnJvciBoYW5kbGVyIG9ubHkgd3JpdGVzIG9uZSBjaGFyYWN0ZXIsCisgICAgICAgICAgICAgICBidXQgd2UgbWF5IHN3aXRjaCB0byBVQ1MyIGF0IHRoZSBmaXJzdCB3cml0ZSAqLworICAgICAgICAgICAgaWYgKF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoJndyaXRlciwgUHlVbmljb2RlXzJCWVRFX0tJTkQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICBraW5kID0gd3JpdGVyLmtpbmQ7CisgICAgICAgICAgICBkYXRhID0gd3JpdGVyLmRhdGE7CisKKyAgICAgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9SRVBMQUNFKQorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURShraW5kLCBkYXRhLCB3cml0ZXIucG9zLCAweGZmZmQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURShraW5kLCBkYXRhLCB3cml0ZXIucG9zLCBjICsgMHhkYzAwKTsKKyAgICAgICAgICAgIHdyaXRlci5wb3MrKzsKKyAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX1B5X0VSUk9SX0lHTk9SRToKKyAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGFydGlucG9zID0gcy1zdGFydHM7CiAgICAgICAgICAgICBlbmRpbnBvcyA9IHN0YXJ0aW5wb3MgKyAxOwogICAgICAgICAgICAgaWYgKHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyX3dyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvcl9oYW5kbGVyX29iaiwKICAgICAgICAgICAgICAgICAgICAgImFzY2lpIiwgIm9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkiLAogICAgICAgICAgICAgICAgICAgICAmc3RhcnRzLCAmZSwgJnN0YXJ0aW5wb3MsICZlbmRpbnBvcywgJmV4YywgJnMsCiAgICAgICAgICAgICAgICAgICAgICZ3cml0ZXIpKQpAQCAtNjcxNCwxMyArNjk4NCwxMyBAQAogICAgICAgICAgICAgZGF0YSA9IHdyaXRlci5kYXRhOwogICAgICAgICB9CiAgICAgfQotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIF9QeVVuaWNvZGVXcml0ZXJfRmluaXNoKCZ3cml0ZXIpOwogCiAgIG9uRXJyb3I6CiAgICAgX1B5VW5pY29kZVdyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CkBAIC02NzYzLDcgKzcwMzMsNyBAQAogICAgIHJldHVybiBfUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcodW5pY29kZSwgTlVMTCk7CiB9CiAKLSNpZmRlZiBIQVZFX01CQ1MKKyNpZmRlZiBNU19XSU5ET1dTCiAKIC8qIC0tLSBNQkNTIGNvZGVjcyBmb3IgV2luZG93cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC02Nzc1LDcgKzcwNDUsNyBAQAogIyAgZGVmaW5lIFdDX0VSUl9JTlZBTElEX0NIQVJTIDB4MDA4MAogI2VuZGlmCiAKLXN0YXRpYyBjaGFyKgorc3RhdGljIGNvbnN0IGNoYXIqCiBjb2RlX3BhZ2VfbmFtZShVSU5UIGNvZGVfcGFnZSwgUHlPYmplY3QgKipvYmopCiB7CiAgICAgKm9iaiA9IE5VTEw7CkBAIC02ODgzLDcgKzcxNTMsNyBAQAogICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICplbmNvZGluZ19vYmogPSBOVUxMOwotICAgIGNoYXIgKmVuY29kaW5nOworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nOwogICAgIERXT1JEIGVycjsKICAgICBpbnQgcmV0ID0gLTE7CiAKQEAgLTcxMTksNyArNzM4OSw2IEBACiAgICAgQk9PTCB1c2VkRGVmYXVsdENoYXIgPSBGQUxTRTsKICAgICBCT09MICpwdXNlZERlZmF1bHRDaGFyID0gJnVzZWREZWZhdWx0Q2hhcjsKICAgICBpbnQgb3V0c2l6ZTsKLSAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKICAgICB3Y2hhcl90ICpwOwogICAgIFB5X3NzaXplX3Qgc2l6ZTsKICAgICBjb25zdCBEV09SRCBmbGFncyA9IGVuY29kZV9jb2RlX3BhZ2VfZmxhZ3MoY29kZV9wYWdlLCBOVUxMKTsKQEAgLTcyMjgsNyArNzQ5Nyw3IEBACiAgICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmVuY29kaW5nX29iaiA9IE5VTEw7Ci0gICAgY2hhciAqZW5jb2Rpbmc7CisgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CiAgICAgUHlfc3NpemVfdCBuZXdwb3MsIG5ld291dHNpemU7CiAgICAgUHlPYmplY3QgKnJlcDsKICAgICBpbnQgcmV0ID0gLTE7CkBAIC03NDgzLDcgKzc3NTIsNyBAQAogCiAjdW5kZWYgTkVFRF9SRVRSWQogCi0jZW5kaWYgLyogSEFWRV9NQkNTICovCisjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiAvKiAtLS0gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtODA4Niw3ICs4MzU1LDcgQEAKIGNoYXJtYXBfZW5jb2RpbmdfZXJyb3IoCiAgICAgUHlPYmplY3QgKnVuaWNvZGUsIFB5X3NzaXplX3QgKmlucG9zLCBQeU9iamVjdCAqbWFwcGluZywKICAgICBQeU9iamVjdCAqKmV4Y2VwdGlvbk9iamVjdCwKLSAgICBpbnQgKmtub3duX2Vycm9ySGFuZGxlciwgUHlPYmplY3QgKiplcnJvckhhbmRsZXIsIGNvbnN0IGNoYXIgKmVycm9ycywKKyAgICBfUHlfZXJyb3JfaGFuZGxlciAqZXJyb3JfaGFuZGxlciwgUHlPYmplY3QgKiplcnJvcl9oYW5kbGVyX29iaiwgY29uc3QgY2hhciAqZXJyb3JzLAogICAgIFB5T2JqZWN0ICoqcmVzLCBQeV9zc2l6ZV90ICpyZXNwb3MpCiB7CiAgICAgUHlPYmplY3QgKnJlcHVuaWNvZGUgPSBOVUxMOyAvKiBpbml0aWFsaXplIHRvIHByZXZlbnQgZ2NjIHdhcm5pbmcgKi8KQEAgLTgxMzMsMjMgKzg0MDIsMTUgQEAKICAgICB9CiAgICAgLyogY2FjaGUgY2FsbGJhY2sgbmFtZSBsb29rdXAKICAgICAgKiAoaWYgbm90IGRvbmUgeWV0LCBpLmUuIGl0J3MgdGhlIGZpcnN0IGVycm9yKSAqLwotICAgIGlmICgqa25vd25fZXJyb3JIYW5kbGVyPT0tMSkgewotICAgICAgICBpZiAoKGVycm9ycz09TlVMTCkgfHwgKCFzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikpKQotICAgICAgICAgICAgKmtub3duX2Vycm9ySGFuZGxlciA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAicmVwbGFjZSIpKQotICAgICAgICAgICAgKmtub3duX2Vycm9ySGFuZGxlciA9IDI7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAiaWdub3JlIikpCi0gICAgICAgICAgICAqa25vd25fZXJyb3JIYW5kbGVyID0gMzsKLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJ4bWxjaGFycmVmcmVwbGFjZSIpKQotICAgICAgICAgICAgKmtub3duX2Vycm9ySGFuZGxlciA9IDQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICprbm93bl9lcnJvckhhbmRsZXIgPSAwOwotICAgIH0KLSAgICBzd2l0Y2ggKCprbm93bl9lcnJvckhhbmRsZXIpIHsKLSAgICBjYXNlIDE6IC8qIHN0cmljdCAqLworICAgIGlmICgqZXJyb3JfaGFuZGxlciA9PSBfUHlfRVJST1JfVU5LTk9XTikKKyAgICAgICAgKmVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworCisgICAgc3dpdGNoICgqZXJyb3JfaGFuZGxlcikgeworICAgIGNhc2UgX1B5X0VSUk9SX1NUUklDVDoKICAgICAgICAgcmFpc2VfZW5jb2RlX2V4Y2VwdGlvbihleGNlcHRpb25PYmplY3QsIGVuY29kaW5nLCB1bmljb2RlLCBjb2xsc3RhcnRwb3MsIGNvbGxlbmRwb3MsIHJlYXNvbik7CiAgICAgICAgIHJldHVybiAtMTsKLSAgICBjYXNlIDI6IC8qIHJlcGxhY2UgKi8KKworICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CiAgICAgICAgIGZvciAoY29sbHBvcyA9IGNvbGxzdGFydHBvczsgY29sbHBvczxjb2xsZW5kcG9zOyArK2NvbGxwb3MpIHsKICAgICAgICAgICAgIHggPSBjaGFybWFwZW5jb2RlX291dHB1dCgnPycsIG1hcHBpbmcsIHJlcywgcmVzcG9zKTsKICAgICAgICAgICAgIGlmICh4PT1lbmNfRVhDRVBUSU9OKSB7CkBAIC04MTYxLDEwICs4NDIyLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSAzOiAvKiBpZ25vcmUgKi8KKyAgICBjYXNlIF9QeV9FUlJPUl9JR05PUkU6CiAgICAgICAgICppbnBvcyA9IGNvbGxlbmRwb3M7CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDogLyogeG1sY2hhcnJlZnJlcGxhY2UgKi8KKworICAgIGNhc2UgX1B5X0VSUk9SX1hNTENIQVJSRUZSRVBMQUNFOgogICAgICAgICAvKiBnZW5lcmF0ZSByZXBsYWNlbWVudCAodGVtcG9yYXJpbHkgKG1pcyl1c2VzIHApICovCiAgICAgICAgIGZvciAoY29sbHBvcyA9IGNvbGxzdGFydHBvczsgY29sbHBvcyA8IGNvbGxlbmRwb3M7ICsrY29sbHBvcykgewogICAgICAgICAgICAgY2hhciBidWZmZXJbMisyOSsxKzFdOwpAQCAtODE4Miw4ICs4NDQ0LDkgQEAKICAgICAgICAgfQogICAgICAgICAqaW5wb3MgPSBjb2xsZW5kcG9zOwogICAgICAgICBicmVhazsKKwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJlcHVuaWNvZGUgPSB1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcihlcnJvcnMsIGVycm9ySGFuZGxlciwKKyAgICAgICAgcmVwdW5pY29kZSA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKGVycm9ycywgZXJyb3JfaGFuZGxlcl9vYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgcmVhc29uLCB1bmljb2RlLCBleGNlcHRpb25PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsc3RhcnRwb3MsIGNvbGxlbmRwb3MsICZuZXdwb3MpOwogICAgICAgICBpZiAocmVwdW5pY29kZSA9PSBOVUxMKQpAQCAtODI0NiwxMiArODUwOSw5IEBACiAgICAgUHlfc3NpemVfdCBzaXplOwogICAgIC8qIGN1cnJlbnQgb3V0cHV0IHBvc2l0aW9uICovCiAgICAgUHlfc3NpemVfdCByZXNwb3MgPSAwOwotICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICplcnJvcl9oYW5kbGVyX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7Ci0gICAgLyogdGhlIGZvbGxvd2luZyB2YXJpYWJsZSBpcyB1c2VkIGZvciBjYWNoaW5nIHN0cmluZyBjb21wYXJpc29ucwotICAgICAqIC0xPW5vdCBpbml0aWFsaXplZCwgMD11bmtub3duLCAxPXN0cmljdCwgMj1yZXBsYWNlLAotICAgICAqIDM9aWdub3JlLCA0PXhtbGNoYXJyZWZyZXBsYWNlICovCi0gICAgaW50IGtub3duX2Vycm9ySGFuZGxlciA9IC0xOworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBfUHlfRVJST1JfVU5LTk9XTjsKICAgICB2b2lkICpkYXRhOwogICAgIGludCBraW5kOwogCkBAIC04MjgyLDcgKzg1NDIsNyBAQAogICAgICAgICBpZiAoeD09ZW5jX0ZBSUxFRCkgeyAvKiB1bmVuY29kYWJsZSBjaGFyYWN0ZXIgKi8KICAgICAgICAgICAgIGlmIChjaGFybWFwX2VuY29kaW5nX2Vycm9yKHVuaWNvZGUsICZpbnBvcywgbWFwcGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma25vd25fZXJyb3JIYW5kbGVyLCAmZXJyb3JIYW5kbGVyLCBlcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JfaGFuZGxlciwgJmVycm9yX2hhbmRsZXJfb2JqLCBlcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzLCAmcmVzcG9zKSkgewogICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICAgICAgICAgIH0KQEAgLTgyOTgsMTMgKzg1NTgsMTMgQEAKICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKIAogICAgIFB5X1hERUNSRUYoZXhjKTsKLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgcmV0dXJuIHJlczsKIAogICBvbkVycm9yOgogICAgIFB5X1hERUNSRUYocmVzKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC04MzcxLDcgKzg2MzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydHBvcywgUHlfc3NpemVfdCBlbmRwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpuZXdwb3MpCiB7Ci0gICAgc3RhdGljIGNoYXIgKmFyZ3BhcnNlID0gIk8hbjt0cmFuc2xhdGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIsIGludCkgdHVwbGUiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphcmdwYXJzZSA9ICJPIW47dHJhbnNsYXRpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKIAogICAgIFB5X3NzaXplX3QgaV9uZXdwb3M7CiAgICAgUHlPYmplY3QgKnJlc3R1cGxlOwpAQCAtODYyOCw3ICs4ODg4LDcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1QeU9iamVjdCAqCitzdGF0aWMgUHlPYmplY3QgKgogX1B5VW5pY29kZV9UcmFuc2xhdGVDaGFybWFwKFB5T2JqZWN0ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbWFwcGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCkBAIC04NjU3LDEwICs4OTE3LDggQEAKICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQoaW5wdXQpOwogICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChpbnB1dCk7CiAKLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihpbnB1dCk7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9CisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tT2JqZWN0KGlucHV0KTsKIAogICAgIC8qIGFsbG9jYXRlIGVub3VnaCBmb3IgYSBzaW1wbGUgMToxIHRyYW5zbGF0aW9uIHdpdGhvdXQKICAgICAgICByZXBsYWNlbWVudHMsIGlmIHdlIG5lZWQgbW9yZSwgd2UnbGwgcmVzaXplICovCkBAIC04NzcxLDE0ICs5MDI5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm1hcHBpbmcsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cikgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHQgPSBfUHlVbmljb2RlX1RyYW5zbGF0ZUNoYXJtYXAoc3RyLCBtYXBwaW5nLCBlcnJvcnMpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIF9QeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcChzdHIsIG1hcHBpbmcsIGVycm9ycyk7CiB9CiAKIHN0YXRpYyBQeV9VQ1M0CkBAIC04OTYwLDkgKzkyMTMsMTAgQEAKICAgICB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90Ci1hbnlfZmluZF9zbGljZShpbnQgZGlyZWN0aW9uLCBQeU9iamVjdCogczEsIFB5T2JqZWN0KiBzMiwKK2FueV9maW5kX3NsaWNlKFB5T2JqZWN0KiBzMSwgUHlPYmplY3QqIHMyLAogICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydCwKLSAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kKQorICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsCisgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQogewogICAgIGludCBraW5kMSwga2luZDI7CiAgICAgdm9pZCAqYnVmMSwgKmJ1ZjI7CkBAIC05MTMxLDU0ICs5Mzg1LDM1IEBACiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQpCiB7CiAgICAgUHlfc3NpemVfdCByZXN1bHQ7Ci0gICAgUHlPYmplY3QqIHN0cl9vYmo7Ci0gICAgUHlPYmplY3QqIHN1Yl9vYmo7CiAgICAgaW50IGtpbmQxLCBraW5kMjsKICAgICB2b2lkICpidWYxID0gTlVMTCwgKmJ1ZjIgPSBOVUxMOwogICAgIFB5X3NzaXplX3QgbGVuMSwgbGVuMjsKIAotICAgIHN0cl9vYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmICghc3RyX29iaikKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyKSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUoc3Vic3RyKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBzdWJfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vic3RyKTsKLSAgICBpZiAoIXN1Yl9vYmopIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3ViX29iaikgPT0gLTEgfHwgUHlVbmljb2RlX1JFQURZKHN0cl9vYmopID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJfb2JqKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQogCi0gICAga2luZDEgPSBQeVVuaWNvZGVfS0lORChzdHJfb2JqKTsKLSAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHN1Yl9vYmopOwotICAgIGlmIChraW5kMSA8IGtpbmQyKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJfb2JqKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOworICAgIGtpbmQxID0gUHlVbmljb2RlX0tJTkQoc3RyKTsKKyAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHN1YnN0cik7CisgICAgaWYgKGtpbmQxIDwga2luZDIpCiAgICAgICAgIHJldHVybiAwOwotICAgIH0KIAotICAgIGxlbjEgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHJfb2JqKTsKLSAgICBsZW4yID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3ViX29iaik7CisgICAgbGVuMSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cik7CisgICAgbGVuMiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN1YnN0cik7CiAgICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuMSk7Ci0gICAgaWYgKGVuZCAtIHN0YXJ0IDwgbGVuMikgewotICAgICAgICBQeV9ERUNSRUYoc3ViX29iaik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKKyAgICBpZiAoZW5kIC0gc3RhcnQgPCBsZW4yKQogICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAKLSAgICBidWYxID0gUHlVbmljb2RlX0RBVEEoc3RyX29iaik7Ci0gICAgYnVmMiA9IFB5VW5pY29kZV9EQVRBKHN1Yl9vYmopOworICAgIGJ1ZjEgPSBQeVVuaWNvZGVfREFUQShzdHIpOworICAgIGJ1ZjIgPSBQeVVuaWNvZGVfREFUQShzdWJzdHIpOwogICAgIGlmIChraW5kMiAhPSBraW5kMSkgewotICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc3ViX29iaiwga2luZDEpOworICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc3Vic3RyLCBraW5kMSk7CiAgICAgICAgIGlmICghYnVmMikKICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAKICAgICBzd2l0Y2ggKGtpbmQxKSB7CiAgICAgY2FzZSBQeVVuaWNvZGVfMUJZVEVfS0lORDoKLSAgICAgICAgaWYgKFB5VW5pY29kZV9JU19BU0NJSShzdHJfb2JqKSAmJiBQeVVuaWNvZGVfSVNfQVNDSUkoc3ViX29iaikpCisgICAgICAgIGlmIChQeVVuaWNvZGVfSVNfQVNDSUkoc3RyKSAmJiBQeVVuaWNvZGVfSVNfQVNDSUkoc3Vic3RyKSkKICAgICAgICAgICAgIHJlc3VsdCA9IGFzY2lpbGliX2NvdW50KAogICAgICAgICAgICAgICAgICgoUHlfVUNTMSopYnVmMSkgKyBzdGFydCwgZW5kIC0gc3RhcnQsCiAgICAgICAgICAgICAgICAgYnVmMiwgbGVuMiwgUFlfU1NJWkVfVF9NQVgKQEAgLTkyMDUsMTYgKzk0NDAsMTEgQEAKICAgICAgICAgYXNzZXJ0KDApOyByZXN1bHQgPSAwOwogICAgIH0KIAotICAgIFB5X0RFQ1JFRihzdWJfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0KICAgICBpZiAoa2luZDIgIT0ga2luZDEpCiAgICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7CiAKICAgICByZXR1cm4gcmVzdWx0OwogICBvbkVycm9yOgotICAgIFB5X0RFQ1JFRihzdWJfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7CiAgICAgaWYgKGtpbmQyICE9IGtpbmQxICYmIGJ1ZjIpCiAgICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7CiAgICAgcmV0dXJuIC0xOwpAQCAtOTIyMiwzNSArOTQ1MiwxNSBAQAogCiBQeV9zc2l6ZV90CiBQeVVuaWNvZGVfRmluZChQeU9iamVjdCAqc3RyLAotICAgICAgICAgICAgICAgUHlPYmplY3QgKnN1YiwKKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJzdHIsCiAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LAogICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsCiAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoIXN0cikKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyKSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUoc3Vic3RyKSA8IDApCiAgICAgICAgIHJldHVybiAtMjsKLSAgICBzdWIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdWIpOwotICAgIGlmICghc3ViKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gLTI7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3ViKSA9PSAtMSB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3ViKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiAtMjsKLSAgICB9CiAKLSAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZShkaXJlY3Rpb24sCi0gICAgICAgIHN0ciwgc3ViLCBzdGFydCwgZW5kCi0gICAgICAgICk7Ci0KLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICBQeV9ERUNSRUYoc3ViKTsKLQotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIGFueV9maW5kX3NsaWNlKHN0ciwgc3Vic3RyLCBzdGFydCwgZW5kLCBkaXJlY3Rpb24pOwogfQogCiBQeV9zc2l6ZV90CkBAIC05MzUzLDIyICs5NTYzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kLAogICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cikgPCAwIHx8IGVuc3VyZV91bmljb2RlKHN1YnN0cikgPCAwKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3Vic3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vic3RyKTsKLSAgICBpZiAoc3Vic3RyID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CiAKLSAgICByZXN1bHQgPSB0YWlsbWF0Y2goc3RyLCBzdWJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIGRpcmVjdGlvbik7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgUHlfREVDUkVGKHN1YnN0cik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gdGFpbG1hdGNoKHN0ciwgc3Vic3RyLCBzdGFydCwgZW5kLCBkaXJlY3Rpb24pOwogfQogCiAvKiBBcHBseSBmaXhmY3QgZmlsdGVyIHRvIHRoZSBVbmljb2RlIG9iamVjdCBzZWxmIGFuZCByZXR1cm4gYQpAQCAtOTY3MCwyMCArOTg2OCwxMCBAQAogUHlPYmplY3QgKgogUHlVbmljb2RlX0pvaW4oUHlPYmplY3QgKnNlcGFyYXRvciwgUHlPYmplY3QgKnNlcSkKIHsKLSAgICBQeU9iamVjdCAqc2VwID0gTlVMTDsKLSAgICBQeV9zc2l6ZV90IHNlcGxlbjsKLSAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsgLyogdGhlIHJlc3VsdCAqLwotICAgIFB5T2JqZWN0ICpmc2VxOyAgICAgICAgICAvKiBQeVNlcXVlbmNlX0Zhc3Qoc2VxKSAqLwotICAgIFB5X3NzaXplX3Qgc2VxbGVuOyAgICAgICAvKiBsZW4oZnNlcSkgLS0gbnVtYmVyIG9mIGl0ZW1zIGluIHNlcXVlbmNlICovCisgICAgUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqZnNlcTsKKyAgICBQeV9zc2l6ZV90IHNlcWxlbjsKICAgICBQeU9iamVjdCAqKml0ZW1zOwotICAgIFB5T2JqZWN0ICppdGVtOwotICAgIFB5X3NzaXplX3Qgc3osIGksIHJlc19vZmZzZXQ7Ci0gICAgUHlfVUNTNCBtYXhjaGFyOwotICAgIFB5X1VDUzQgaXRlbV9tYXhjaGFyOwotICAgIGludCB1c2VfbWVtY3B5OwotICAgIHVuc2lnbmVkIGNoYXIgKnJlc19kYXRhID0gTlVMTCwgKnNlcF9kYXRhID0gTlVMTDsKLSAgICBQeU9iamVjdCAqbGFzdF9vYmo7Ci0gICAgdW5zaWduZWQgaW50IGtpbmQgPSAwOwogCiAgICAgZnNlcSA9IFB5U2VxdWVuY2VfRmFzdChzZXEsICJjYW4gb25seSBqb2luIGFuIGl0ZXJhYmxlIik7CiAgICAgaWYgKGZzZXEgPT0gTlVMTCkgewpAQCAtOTY5NCwyMSArOTg4MiwzOSBAQAogICAgICAqIHNvIHdlIGFyZSBzdXJlIHRoYXQgZnNlcSB3b24ndCBiZSBtdXRhdGVkLgogICAgICAqLwogCisgICAgaXRlbXMgPSBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMoZnNlcSk7CiAgICAgc2VxbGVuID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKGZzZXEpOworICAgIHJlcyA9IF9QeVVuaWNvZGVfSm9pbkFycmF5KHNlcGFyYXRvciwgaXRlbXMsIHNlcWxlbik7CisgICAgUHlfREVDUkVGKGZzZXEpOworICAgIHJldHVybiByZXM7Cit9CisKK1B5T2JqZWN0ICoKK19QeVVuaWNvZGVfSm9pbkFycmF5KFB5T2JqZWN0ICpzZXBhcmF0b3IsIFB5T2JqZWN0ICoqaXRlbXMsIFB5X3NzaXplX3Qgc2VxbGVuKQoreworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOyAvKiB0aGUgcmVzdWx0ICovCisgICAgUHlPYmplY3QgKnNlcCA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBzZXBsZW47CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgUHlfc3NpemVfdCBzeiwgaSwgcmVzX29mZnNldDsKKyAgICBQeV9VQ1M0IG1heGNoYXI7CisgICAgUHlfVUNTNCBpdGVtX21heGNoYXI7CisgICAgaW50IHVzZV9tZW1jcHk7CisgICAgdW5zaWduZWQgY2hhciAqcmVzX2RhdGEgPSBOVUxMLCAqc2VwX2RhdGEgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsYXN0X29iajsKKyAgICB1bnNpZ25lZCBpbnQga2luZCA9IDA7CisKICAgICAvKiBJZiBlbXB0eSBzZXF1ZW5jZSwgcmV0dXJuIHUiIi4gKi8KICAgICBpZiAoc2VxbGVuID09IDApIHsKLSAgICAgICAgUHlfREVDUkVGKGZzZXEpOwogICAgICAgICBfUHlfUkVUVVJOX1VOSUNPREVfRU1QVFkoKTsKICAgICB9CiAKICAgICAvKiBJZiBzaW5nbGV0b24gc2VxdWVuY2Ugd2l0aCBhbiBleGFjdCBVbmljb2RlLCByZXR1cm4gdGhhdC4gKi8KICAgICBsYXN0X29iaiA9IE5VTEw7Ci0gICAgaXRlbXMgPSBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMoZnNlcSk7CiAgICAgaWYgKHNlcWxlbiA9PSAxKSB7CiAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChpdGVtc1swXSkpIHsKICAgICAgICAgICAgIHJlcyA9IGl0ZW1zWzBdOwogICAgICAgICAgICAgUHlfSU5DUkVGKHJlcyk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoZnNlcSk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIHNlcGxlbiA9IDA7CkBAIC05ODQzLDEzICsxMDA0OSwxMSBAQAogICAgICAgICBhc3NlcnQocmVzX29mZnNldCA9PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXMpKTsKICAgICB9CiAKLSAgICBQeV9ERUNSRUYoZnNlcSk7CiAgICAgUHlfWERFQ1JFRihzZXApOwogICAgIGFzc2VydChfUHlVbmljb2RlX0NoZWNrQ29uc2lzdGVuY3kocmVzLCAxKSk7CiAgICAgcmV0dXJuIHJlczsKIAogICBvbkVycm9yOgotICAgIFB5X0RFQ1JFRihmc2VxKTsKICAgICBQeV9YREVDUkVGKHNlcCk7CiAgICAgUHlfWERFQ1JFRihyZXMpOwogICAgIHJldHVybiBOVUxMOwpAQCAtOTk3NCwxMyArMTAxNzgsOCBAQAogewogICAgIFB5T2JqZWN0ICpsaXN0OwogCi0gICAgc3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyaW5nKTsKLSAgICBpZiAoc3RyaW5nID09IE5VTEwpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cmluZykgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN0cmluZykgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cmluZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAogICAgIHN3aXRjaCAoUHlVbmljb2RlX0tJTkQoc3RyaW5nKSkgewogICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6CkBAIC0xMDAwNyw3ICsxMDIwNiw2IEBACiAgICAgICAgIGFzc2VydCgwKTsKICAgICAgICAgbGlzdCA9IDA7CiAgICAgfQotICAgIFB5X0RFQ1JFRihzdHJpbmcpOwogICAgIHJldHVybiBsaXN0OwogfQogCkBAIC0xMDU2OCwyOCArMTA3NjYsMjcgQEAKIH0KIAogCi0vKiBBcmd1bWVudCBjb252ZXJ0ZXIuICBDb2VyY2VzIHRvIGEgc2luZ2xlIHVuaWNvZGUgY2hhcmFjdGVyICovCisvKiBBcmd1bWVudCBjb252ZXJ0ZXIuIEFjY2VwdHMgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXIuICovCiAKIHN0YXRpYyBpbnQKIGNvbnZlcnRfdWMoUHlPYmplY3QgKm9iaiwgdm9pZCAqYWRkcikKIHsKICAgICBQeV9VQ1M0ICpmaWxsY2hhcmxvYyA9IChQeV9VQ1M0ICopYWRkcjsKLSAgICBQeU9iamVjdCAqdW5pb2JqOwogCi0gICAgdW5pb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qob2JqKTsKLSAgICBpZiAodW5pb2JqID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZmlsbCBjaGFyYWN0ZXIgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBVbmljb2RlIik7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2sob2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIlRoZSBmaWxsIGNoYXJhY3RlciBtdXN0IGJlIGEgdW5pY29kZSBjaGFyYWN0ZXIsICIKKyAgICAgICAgICAgICAgICAgICAgICJub3QgJS4xMDBzIiwgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChQeVVuaWNvZGVfR0VUX0xFTkdUSCh1bmlvYmopICE9IDEpIHsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKG9iaikgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgob2JqKSAhPSAxKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGZpbGwgY2hhcmFjdGVyIG11c3QgYmUgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGxvbmciKTsKLSAgICAgICAgUHlfREVDUkVGKHVuaW9iaik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICAqZmlsbGNoYXJsb2MgPSBQeVVuaWNvZGVfUkVBRF9DSEFSKHVuaW9iaiwgMCk7Ci0gICAgUHlfREVDUkVGKHVuaW9iaik7CisgICAgKmZpbGxjaGFybG9jID0gUHlVbmljb2RlX1JFQURfQ0hBUihvYmosIDApOwogICAgIHJldHVybiAxOwogfQogCkBAIC0xMDkwNSw1OSArMTExMDIsNDkgQEAKIH0KIAogaW50Ci1QeVVuaWNvZGVfQ29udGFpbnMoUHlPYmplY3QgKmNvbnRhaW5lciwgUHlPYmplY3QgKmVsZW1lbnQpCitfUHlVbmljb2RlX0VRKFB5T2JqZWN0ICphYSwgUHlPYmplY3QgKmJiKQogewotICAgIFB5T2JqZWN0ICpzdHIsICpzdWI7CisgICAgcmV0dXJuIHVuaWNvZGVfZXEoYWEsIGJiKTsKK30KKworaW50CitQeVVuaWNvZGVfQ29udGFpbnMoUHlPYmplY3QgKnN0ciwgUHlPYmplY3QgKnN1YnN0cikKK3sKICAgICBpbnQga2luZDEsIGtpbmQyOwogICAgIHZvaWQgKmJ1ZjEsICpidWYyOwogICAgIFB5X3NzaXplX3QgbGVuMSwgbGVuMjsKICAgICBpbnQgcmVzdWx0OwogCi0gICAgLyogQ29lcmNlIHRoZSB0d28gYXJndW1lbnRzICovCi0gICAgc3ViID0gUHlVbmljb2RlX0Zyb21PYmplY3QoZWxlbWVudCk7Ci0gICAgaWYgKCFzdWIpIHsKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhzdWJzdHIpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiJ2luIDxzdHJpbmc+JyByZXF1aXJlcyBzdHJpbmcgYXMgbGVmdCBvcGVyYW5kLCBub3QgJXMiLAotICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAiJ2luIDxzdHJpbmc+JyByZXF1aXJlcyBzdHJpbmcgYXMgbGVmdCBvcGVyYW5kLCBub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc3Vic3RyKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChjb250YWluZXIpOwotICAgIGlmICghc3RyKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWIpOworICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3Vic3RyKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAogICAgIGtpbmQxID0gUHlVbmljb2RlX0tJTkQoc3RyKTsKLSAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHN1Yik7Ci0gICAgaWYgKGtpbmQxIDwga2luZDIpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1Yik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgIGtpbmQyID0gUHlVbmljb2RlX0tJTkQoc3Vic3RyKTsKKyAgICBpZiAoa2luZDEgPCBraW5kMikKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQogICAgIGxlbjEgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpOwotICAgIGxlbjIgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdWIpOwotICAgIGlmIChsZW4xIDwgbGVuMikgewotICAgICAgICBQeV9ERUNSRUYoc3ViKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgbGVuMiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN1YnN0cik7CisgICAgaWYgKGxlbjEgPCBsZW4yKQogICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAgICAgYnVmMSA9IFB5VW5pY29kZV9EQVRBKHN0cik7Ci0gICAgYnVmMiA9IFB5VW5pY29kZV9EQVRBKHN1Yik7CisgICAgYnVmMiA9IFB5VW5pY29kZV9EQVRBKHN1YnN0cik7CiAgICAgaWYgKGxlbjIgPT0gMSkgewogICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZDIsIGJ1ZjIsIDApOwogICAgICAgICByZXN1bHQgPSBmaW5kY2hhcigoY29uc3QgY2hhciAqKWJ1ZjEsIGtpbmQxLCBsZW4xLCBjaCwgMSkgIT0gLTE7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWIpOwotICAgICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKSB7Ci0gICAgICAgIGJ1ZjIgPSBfUHlVbmljb2RlX0FzS2luZChzdWIsIGtpbmQxKTsKLSAgICAgICAgaWYgKCFidWYyKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc3ViKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc3Vic3RyLCBraW5kMSk7CisgICAgICAgIGlmICghYnVmMikKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHN3aXRjaCAoa2luZDEpIHsKQEAgLTEwOTc1LDkgKzExMTYyLDYgQEAKICAgICAgICAgYXNzZXJ0KDApOwogICAgIH0KIAotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIFB5X0RFQ1JFRihzdWIpOwotCiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKQogICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwogCkBAIC0xMDk4OSw1NiArMTExNzMsNDAgQEAKIFB5T2JqZWN0ICoKIFB5VW5pY29kZV9Db25jYXQoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLSAgICBQeU9iamVjdCAqdSA9IE5VTEwsICp2ID0gTlVMTCwgKnc7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBQeV9VQ1M0IG1heGNoYXIsIG1heGNoYXIyOwotICAgIFB5X3NzaXplX3QgdV9sZW4sIHZfbGVuLCBuZXdfbGVuOworICAgIFB5X3NzaXplX3QgbGVmdF9sZW4sIHJpZ2h0X2xlbiwgbmV3X2xlbjsKIAotICAgIC8qIENvZXJjZSB0aGUgdHdvIGFyZ3VtZW50cyAqLwotICAgIHUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChsZWZ0KTsKLSAgICBpZiAodSA9PSBOVUxMKQotICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgdiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHJpZ2h0KTsKLSAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgaWYgKGVuc3VyZV91bmljb2RlKGxlZnQpIDwgMCB8fCBlbnN1cmVfdW5pY29kZShyaWdodCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIFNob3J0Y3V0cyAqLwotICAgIGlmICh2ID09IHVuaWNvZGVfZW1wdHkpIHsKLSAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICByZXR1cm4gdTsKLSAgICB9Ci0gICAgaWYgKHUgPT0gdW5pY29kZV9lbXB0eSkgewotICAgICAgICBQeV9ERUNSRUYodSk7Ci0gICAgICAgIHJldHVybiB2OwotICAgIH0KKyAgICBpZiAobGVmdCA9PSB1bmljb2RlX2VtcHR5KQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21PYmplY3QocmlnaHQpOworICAgIGlmIChyaWdodCA9PSB1bmljb2RlX2VtcHR5KQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21PYmplY3QobGVmdCk7CiAKLSAgICB1X2xlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHUpOwotICAgIHZfbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgodik7Ci0gICAgaWYgKHVfbGVuID4gUFlfU1NJWkVfVF9NQVggLSB2X2xlbikgeworICAgIGxlZnRfbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgobGVmdCk7CisgICAgcmlnaHRfbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgocmlnaHQpOworICAgIGlmIChsZWZ0X2xlbiA+IFBZX1NTSVpFX1RfTUFYIC0gcmlnaHRfbGVuKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ3MgYXJlIHRvbyBsYXJnZSB0byBjb25jYXQiKTsKLSAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgbmV3X2xlbiA9IHVfbGVuICsgdl9sZW47CisgICAgbmV3X2xlbiA9IGxlZnRfbGVuICsgcmlnaHRfbGVuOwogCi0gICAgbWF4Y2hhciA9IFB5VW5pY29kZV9NQVhfQ0hBUl9WQUxVRSh1KTsKLSAgICBtYXhjaGFyMiA9IFB5VW5pY29kZV9NQVhfQ0hBUl9WQUxVRSh2KTsKKyAgICBtYXhjaGFyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKGxlZnQpOworICAgIG1heGNoYXIyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKHJpZ2h0KTsKICAgICBtYXhjaGFyID0gUHlfTUFYKG1heGNoYXIsIG1heGNoYXIyKTsKIAogICAgIC8qIENvbmNhdCB0aGUgdHdvIFVuaWNvZGUgc3RyaW5ncyAqLwotICAgIHcgPSBQeVVuaWNvZGVfTmV3KG5ld19sZW4sIG1heGNoYXIpOwotICAgIGlmICh3ID09IE5VTEwpCi0gICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICBfUHlVbmljb2RlX0Zhc3RDb3B5Q2hhcmFjdGVycyh3LCAwLCB1LCAwLCB1X2xlbik7Ci0gICAgX1B5VW5pY29kZV9GYXN0Q29weUNoYXJhY3RlcnModywgdV9sZW4sIHYsIDAsIHZfbGVuKTsKLSAgICBQeV9ERUNSRUYodSk7Ci0gICAgUHlfREVDUkVGKHYpOwotICAgIGFzc2VydChfUHlVbmljb2RlX0NoZWNrQ29uc2lzdGVuY3kodywgMSkpOwotICAgIHJldHVybiB3OwotCi0gIG9uRXJyb3I6Ci0gICAgUHlfWERFQ1JFRih1KTsKLSAgICBQeV9YREVDUkVGKHYpOwotICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5VW5pY29kZV9OZXcobmV3X2xlbiwgbWF4Y2hhcik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfUHlVbmljb2RlX0Zhc3RDb3B5Q2hhcmFjdGVycyhyZXN1bHQsIDAsIGxlZnQsIDAsIGxlZnRfbGVuKTsKKyAgICBfUHlVbmljb2RlX0Zhc3RDb3B5Q2hhcmFjdGVycyhyZXN1bHQsIGxlZnRfbGVuLCByaWdodCwgMCwgcmlnaHRfbGVuKTsKKyAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHJlc3VsdCwgMSkpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHZvaWQKQEAgLTExMTI5LDYgKzExMjk3LDI1IEBACiAgICAgUHlfWERFQ1JFRihyaWdodCk7CiB9CiAKKy8qCitXcmFwcyBzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygpIGFuZCBhZGRpdGlvbmFsbHkgZW5zdXJlcyB0aGF0IHRoZQorZmlyc3QgYXJndW1lbnQgaXMgYSB1bmljb2RlIG9iamVjdC4KKyovCisKK3N0YXRpYyBpbmxpbmUgaW50CitwYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoY29uc3QgY2hhciAqIGZ1bmN0aW9uX25hbWUsIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqc3Vic3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICplbmQpCit7CisgICAgaWYoc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoZnVuY3Rpb25fbmFtZSwgYXJncywgc3Vic3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQpKSB7CisgICAgICAgIGlmIChlbnN1cmVfdW5pY29kZSgqc3Vic3RyaW5nKSA8IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBQeURvY19TVFJWQVIoY291bnRfX2RvY19fLAogICAgICAgICAgICAgICJTLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAogXG5cCkBAIC0xMTE0NywzMSArMTEzMzQsMjYgQEAKICAgICB2b2lkICpidWYxLCAqYnVmMjsKICAgICBQeV9zc2l6ZV90IGxlbjEsIGxlbjIsIGlyZXN1bHQ7CiAKLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoImNvdW50IiwgYXJncywgJnN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKKyAgICBpZiAoIXBhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgiY291bnQiLCBhcmdzLCAmc3Vic3RyaW5nLCAmc3RhcnQsICZlbmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGtpbmQxID0gUHlVbmljb2RlX0tJTkQoc2VsZik7CiAgICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzdWJzdHJpbmcpOwotICAgIGlmIChraW5kMSA8IGtpbmQyKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChraW5kMSA8IGtpbmQyKQogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKDApOwotICAgIH0KKwogICAgIGxlbjEgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzZWxmKTsKICAgICBsZW4yID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3Vic3RyaW5nKTsKICAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4xKTsKLSAgICBpZiAoZW5kIC0gc3RhcnQgPCBsZW4yKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChlbmQgLSBzdGFydCA8IGxlbjIpCiAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoMCk7Ci0gICAgfQorCiAgICAgYnVmMSA9IFB5VW5pY29kZV9EQVRBKHNlbGYpOwogICAgIGJ1ZjIgPSBQeVVuaWNvZGVfREFUQShzdWJzdHJpbmcpOwogICAgIGlmIChraW5kMiAhPSBraW5kMSkgewogICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc3Vic3RyaW5nLCBraW5kMSk7Ci0gICAgICAgIGlmICghYnVmMikgewotICAgICAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgICAgIGlmICghYnVmMikKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CiAgICAgfQogICAgIHN3aXRjaCAoa2luZDEpIHsKICAgICBjYXNlIFB5VW5pY29kZV8xQllURV9LSU5EOgpAQCAtMTEyMDEsOCArMTEzODMsNiBAQAogICAgIGlmIChraW5kMiAhPSBraW5kMSkKICAgICAgICAgUHlNZW1fRnJlZShidWYyKTsKIAotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTEzMzYsMjIgKzExNTE2LDEzIEBACiAgICAgUHlfc3NpemVfdCBlbmQgPSAwOwogICAgIFB5X3NzaXplX3QgcmVzdWx0OwogCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJmaW5kIiwgYXJncywgJnN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKKyAgICBpZiAoIXBhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgiZmluZCIsIGFyZ3MsICZzdWJzdHJpbmcsICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdWJzdHJpbmcpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZSgxLCBzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQpOwotCi0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2Uoc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAxKTsKIAogICAgIGlmIChyZXN1bHQgPT0gLTIpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTE0MjQsMjIgKzExNTk1LDEzIEBACiAgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7CiAgICAgUHlfc3NpemVfdCBlbmQgPSAwOwogCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJpbmRleCIsIGFyZ3MsICZzdWJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCisgICAgaWYgKCFwYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoImluZGV4IiwgYXJncywgJnN1YnN0cmluZywgJnN0YXJ0LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1YnN0cmluZykgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAotICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKDEsIHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCk7Ci0KLSAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZShzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIDEpOwogCiAgICAgaWYgKHJlc3VsdCA9PSAtMikKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMTk1Myw3ICsxMjExNSw3IEBACiAjZGVmaW5lIEJPVEhTVFJJUCAyCiAKIC8qIEFycmF5cyBpbmRleGVkIGJ5IGFib3ZlICovCi1zdGF0aWMgY29uc3QgY2hhciAqc3RyaXBmb3JtYXRbXSA9IHsifE86bHN0cmlwIiwgInxPOnJzdHJpcCIsICJ8TzpzdHJpcCJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpcGZvcm1hdFtdID0geyJ8Tzpsc3RyaXAiLCAifE86cnN0cmlwIiwgInxPOnN0cmlwIn07CiAKICNkZWZpbmUgU1RSSVBOQU1FKGkpIChzdHJpcGZvcm1hdFtpXSszKQogCkBAIC0xMjI0OCw0MCArMTI0MTAsMTUgQEAKIH0KIAogUHlPYmplY3QgKgotUHlVbmljb2RlX1JlcGxhY2UoUHlPYmplY3QgKm9iaiwKLSAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJvYmosCi0gICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVwbG9iaiwKK1B5VW5pY29kZV9SZXBsYWNlKFB5T2JqZWN0ICpzdHIsCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3Vic3RyLAorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlcGxzdHIsCiAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQogewotICAgIFB5T2JqZWN0ICpzZWxmOwotICAgIFB5T2JqZWN0ICpzdHIxOwotICAgIFB5T2JqZWN0ICpzdHIyOwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmID0gUHlVbmljb2RlX0Zyb21PYmplY3Qob2JqKTsKLSAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHIpIDwgMCB8fCBlbnN1cmVfdW5pY29kZShzdWJzdHIpIDwgMCB8fAorICAgICAgICAgICAgZW5zdXJlX3VuaWNvZGUocmVwbHN0cikgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzdHIxID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vib2JqKTsKLSAgICBpZiAoc3RyMSA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHN0cjIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChyZXBsb2JqKTsKLSAgICBpZiAoc3RyMiA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cjEpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSB8fAotICAgICAgICBQeVVuaWNvZGVfUkVBRFkoc3RyMSkgPT0gLTEgfHwKLSAgICAgICAgUHlVbmljb2RlX1JFQURZKHN0cjIpID09IC0xKQotICAgICAgICByZXN1bHQgPSBOVUxMOwotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gcmVwbGFjZShzZWxmLCBzdHIxLCBzdHIyLCBtYXhjb3VudCk7Ci0gICAgUHlfREVDUkVGKHNlbGYpOwotICAgIFB5X0RFQ1JFRihzdHIxKTsKLSAgICBQeV9ERUNSRUYoc3RyMik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVwbGFjZShzdHIsIHN1YnN0ciwgcmVwbHN0ciwgbWF4Y291bnQpOwogfQogCiBQeURvY19TVFJWQVIocmVwbGFjZV9fZG9jX18sCkBAIC0xMjI5NywyOCArMTI0MzQsMTIgQEAKICAgICBQeU9iamVjdCAqc3RyMTsKICAgICBQeU9iamVjdCAqc3RyMjsKICAgICBQeV9zc2l6ZV90IG1heGNvdW50ID0gLTE7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098bjpyZXBsYWNlIiwgJnN0cjEsICZzdHIyLCAmbWF4Y291bnQpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVVV8bjpyZXBsYWNlIiwgJnN0cjEsICZzdHIyLCAmbWF4Y291bnQpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzdHIxID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyMSk7Ci0gICAgaWYgKHN0cjEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3RyMiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cjIpOwotICAgIGlmIChzdHIyID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cjEpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdHIxKSA9PSAtMSB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyMikgPT0gLTEpCi0gICAgICAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSByZXBsYWNlKHNlbGYsIHN0cjEsIHN0cjIsIG1heGNvdW50KTsKLQotICAgIFB5X0RFQ1JFRihzdHIxKTsKLSAgICBQeV9ERUNSRUYoc3RyMik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVwbGFjZShzZWxmLCBzdHIxLCBzdHIyLCBtYXhjb3VudCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMjUwMywyMiArMTI2MjQsMTMgQEAKICAgICBQeV9zc2l6ZV90IGVuZCA9IDA7CiAgICAgUHlfc3NpemVfdCByZXN1bHQ7CiAKLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoInJmaW5kIiwgYXJncywgJnN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKKyAgICBpZiAoIXBhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgicmZpbmQiLCBhcmdzLCAmc3Vic3RyaW5nLCAmc3RhcnQsICZlbmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3Vic3RyaW5nKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2UoLTEsIHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCk7Ci0KLSAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZShzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIC0xKTsKIAogICAgIGlmIChyZXN1bHQgPT0gLTIpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTI1NDAsMjIgKzEyNjUyLDEzIEBACiAgICAgUHlfc3NpemVfdCBlbmQgPSAwOwogICAgIFB5X3NzaXplX3QgcmVzdWx0OwogCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJyaW5kZXgiLCBhcmdzLCAmc3Vic3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZlbmQpKQorICAgIGlmICghcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJyaW5kZXgiLCBhcmdzLCAmc3Vic3RyaW5nLCAmc3RhcnQsICZlbmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3Vic3RyaW5nKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2UoLTEsIHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCk7Ci0KLSAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZShzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIC0xKTsKIAogICAgIGlmIChyZXN1bHQgPT0gLTIpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTI1OTUsMjQgKzEyNjk4LDEwIEBACiBQeU9iamVjdCAqCiBQeVVuaWNvZGVfU3BsaXQoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpCiB7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLQotICAgIHMgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzKTsKLSAgICBpZiAocyA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzKSA8IDAgfHwgKHNlcCAhPSBOVUxMICYmIGVuc3VyZV91bmljb2RlKHNlcCkgPCAwKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHNlcCAhPSBOVUxMKSB7Ci0gICAgICAgIHNlcCA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHNlcCk7Ci0gICAgICAgIGlmIChzZXAgPT0gTlVMTCkgewotICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9CiAKLSAgICByZXN1bHQgPSBzcGxpdChzLCBzZXAsIG1heHNwbGl0KTsKLQotICAgIFB5X0RFQ1JFRihzKTsKLSAgICBQeV9YREVDUkVGKHNlcCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gc3BsaXQocywgc2VwLCBtYXhzcGxpdCk7CiB9CiAKIFB5RG9jX1NUUlZBUihzcGxpdF9fZG9jX18sCkBAIC0xMjYzNywzNSArMTI3MjYsMjYgQEAKIAogICAgIGlmIChzdWJzdHJpbmcgPT0gUHlfTm9uZSkKICAgICAgICAgcmV0dXJuIHNwbGl0KHNlbGYsIE5VTEwsIG1heGNvdW50KTsKLSAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkKKworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkKICAgICAgICAgcmV0dXJuIHNwbGl0KHNlbGYsIHN1YnN0cmluZywgbWF4Y291bnQpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9TcGxpdChzZWxmLCBzdWJzdHJpbmcsIG1heGNvdW50KTsKKworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJtdXN0IGJlIHN0ciBvciBOb25lLCBub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRShzdWJzdHJpbmcpLT50cF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlPYmplY3QgKgotUHlVbmljb2RlX1BhcnRpdGlvbihQeU9iamVjdCAqc3RyX2luLCBQeU9iamVjdCAqc2VwX2luKQorUHlVbmljb2RlX1BhcnRpdGlvbihQeU9iamVjdCAqc3RyX29iaiwgUHlPYmplY3QgKnNlcF9vYmopCiB7Ci0gICAgUHlPYmplY3QqIHN0cl9vYmo7Ci0gICAgUHlPYmplY3QqIHNlcF9vYmo7CiAgICAgUHlPYmplY3QqIG91dDsKICAgICBpbnQga2luZDEsIGtpbmQyOwogICAgIHZvaWQgKmJ1ZjEsICpidWYyOwogICAgIFB5X3NzaXplX3QgbGVuMSwgbGVuMjsKIAotICAgIHN0cl9vYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHJfaW4pOwotICAgIGlmICghc3RyX29iaikKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyX29iaikgPCAwIHx8IGVuc3VyZV91bmljb2RlKHNlcF9vYmopIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc2VwX29iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHNlcF9pbik7Ci0gICAgaWYgKCFzZXBfb2JqKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VwX29iaikgPT0gLTEgfHwgUHlVbmljb2RlX1JFQURZKHN0cl9vYmopID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKICAgICBraW5kMSA9IFB5VW5pY29kZV9LSU5EKHN0cl9vYmopOwogICAgIGtpbmQyID0gUHlVbmljb2RlX0tJTkQoc2VwX29iaik7CkBAIC0xMjY3OSw4ICsxMjc1OSw2IEBACiAgICAgICAgICAgICBvdXQgPSBQeVR1cGxlX1BhY2soMywgc3RyX29iaiwgdW5pY29kZV9lbXB0eSwgdW5pY29kZV9lbXB0eSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYodW5pY29kZV9lbXB0eSk7CiAgICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHNlcF9vYmopOwotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7CiAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgfQogICAgIGJ1ZjEgPSBQeVVuaWNvZGVfREFUQShzdHJfb2JqKTsKQEAgLTEyNjg4LDcgKzEyNzY2LDcgQEAKICAgICBpZiAoa2luZDIgIT0ga2luZDEpIHsKICAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHNlcF9vYmosIGtpbmQxKTsKICAgICAgICAgaWYgKCFidWYyKQotICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgc3dpdGNoIChraW5kMSkgewpAQCAtMTI3MDksMzkgKzEyNzg3LDIzIEBACiAgICAgICAgIG91dCA9IDA7CiAgICAgfQogCi0gICAgUHlfREVDUkVGKHNlcF9vYmopOwotICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKICAgICBpZiAoa2luZDIgIT0ga2luZDEpCiAgICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7CiAKICAgICByZXR1cm4gb3V0OwotICBvbkVycm9yOgotICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0gICAgaWYgKGtpbmQyICE9IGtpbmQxICYmIGJ1ZjIpCi0gICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7Ci0gICAgcmV0dXJuIE5VTEw7CiB9CiAKIAogUHlPYmplY3QgKgotUHlVbmljb2RlX1JQYXJ0aXRpb24oUHlPYmplY3QgKnN0cl9pbiwgUHlPYmplY3QgKnNlcF9pbikKK1B5VW5pY29kZV9SUGFydGl0aW9uKFB5T2JqZWN0ICpzdHJfb2JqLCBQeU9iamVjdCAqc2VwX29iaikKIHsKLSAgICBQeU9iamVjdCogc3RyX29iajsKLSAgICBQeU9iamVjdCogc2VwX29iajsKICAgICBQeU9iamVjdCogb3V0OwogICAgIGludCBraW5kMSwga2luZDI7CiAgICAgdm9pZCAqYnVmMSwgKmJ1ZjI7CiAgICAgUHlfc3NpemVfdCBsZW4xLCBsZW4yOwogCi0gICAgc3RyX29iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cl9pbik7Ci0gICAgaWYgKCFzdHJfb2JqKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHJfb2JqKSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUoc2VwX29iaikgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzZXBfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc2VwX2luKTsKLSAgICBpZiAoIXNlcF9vYmopIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKICAgICBraW5kMSA9IFB5VW5pY29kZV9LSU5EKHN0cl9vYmopOwogICAgIGtpbmQyID0gUHlVbmljb2RlX0tJTkQoc2VwX29iaik7CkBAIC0xMjc1NSw4ICsxMjgxNyw2IEBACiAgICAgICAgICAgICBvdXQgPSBQeVR1cGxlX1BhY2soMywgdW5pY29kZV9lbXB0eSwgdW5pY29kZV9lbXB0eSwgc3RyX29iaik7CiAgICAgICAgICAgICBQeV9ERUNSRUYodW5pY29kZV9lbXB0eSk7CiAgICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHNlcF9vYmopOwotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7CiAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgfQogICAgIGJ1ZjEgPSBQeVVuaWNvZGVfREFUQShzdHJfb2JqKTsKQEAgLTEyNzY0LDcgKzEyODI0LDcgQEAKICAgICBpZiAoa2luZDIgIT0ga2luZDEpIHsKICAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHNlcF9vYmosIGtpbmQxKTsKICAgICAgICAgaWYgKCFidWYyKQotICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgc3dpdGNoIChraW5kMSkgewpAQCAtMTI3ODUsMTggKzEyODQ1LDEwIEBACiAgICAgICAgIG91dCA9IDA7CiAgICAgfQogCi0gICAgUHlfREVDUkVGKHNlcF9vYmopOwotICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKICAgICBpZiAoa2luZDIgIT0ga2luZDEpCiAgICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7CiAKICAgICByZXR1cm4gb3V0OwotICBvbkVycm9yOgotICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0gICAgaWYgKGtpbmQyICE9IGtpbmQxICYmIGJ1ZjIpCi0gICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7Ci0gICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihwYXJ0aXRpb25fX2RvY19fLApAQCAtMTI4MjgsMjQgKzEyODgwLDEwIEBACiBQeU9iamVjdCAqCiBQeVVuaWNvZGVfUlNwbGl0KFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KQogewotICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzID0gUHlVbmljb2RlX0Zyb21PYmplY3Qocyk7Ci0gICAgaWYgKHMgPT0gTlVMTCkKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUocykgPCAwIHx8IChzZXAgIT0gTlVMTCAmJiBlbnN1cmVfdW5pY29kZShzZXApIDwgMCkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChzZXAgIT0gTlVMTCkgewotICAgICAgICBzZXAgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzZXApOwotICAgICAgICBpZiAoc2VwID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gcnNwbGl0KHMsIHNlcCwgbWF4c3BsaXQpOwotCi0gICAgUHlfREVDUkVGKHMpOwotICAgIFB5X1hERUNSRUYoc2VwKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByc3BsaXQocywgc2VwLCBtYXhzcGxpdCk7CiB9CiAKIFB5RG9jX1NUUlZBUihyc3BsaXRfX2RvY19fLApAQCAtMTI4NzAsMTAgKzEyOTA4LDE0IEBACiAKICAgICBpZiAoc3Vic3RyaW5nID09IFB5X05vbmUpCiAgICAgICAgIHJldHVybiByc3BsaXQoc2VsZiwgTlVMTCwgbWF4Y291bnQpOwotICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJzdHJpbmcpKQorCisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJzdHJpbmcpKQogICAgICAgICByZXR1cm4gcnNwbGl0KHNlbGYsIHN1YnN0cmluZywgbWF4Y291bnQpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9SU3BsaXQoc2VsZiwgc3Vic3RyaW5nLCBtYXhjb3VudCk7CisKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAibXVzdCBiZSBzdHIgb3IgTm9uZSwgbm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUoc3Vic3RyaW5nKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihzcGxpdGxpbmVzX19kb2NfXywKQEAgLTEzMTU0LDExICsxMzE5NiwxNSBAQAogICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKICAgICAgICAgUHlfc3NpemVfdCBpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLSAgICAgICAgICAgIHN1YnN0cmluZyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSk7Ci0gICAgICAgICAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpCisgICAgICAgICAgICBzdWJzdHJpbmcgPSBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSk7CisgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhzdWJzdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR1cGxlIGZvciBzdGFydHN3aXRoIG11c3Qgb25seSBjb250YWluIHN0ciwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc3Vic3RyaW5nKS0+dHBfbmFtZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAtMSk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CkBAIC0xMzE2OCwxNSArMTMyMTQsMTMgQEAKICAgICAgICAgLyogbm90aGluZyBtYXRjaGVkICovCiAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKICAgICB9Ci0gICAgc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vib2JqKTsKLSAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJzdGFydHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImEgdHVwbGUgb2Ygc3RyLCBub3QgJXMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOworICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJzdGFydHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciAiCisgICAgICAgICAgICAgICAgICAgICAiYSB0dXBsZSBvZiBzdHIsIG5vdCAlLjEwMHMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgLTEpOwotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsIC0xKTsKICAgICBpZiAocmVzdWx0ID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CkBAIC0xMzIwNiwxMiArMTMyNTAsMTUgQEAKICAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7CiAgICAgICAgIFB5X3NzaXplX3QgaTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7Ci0gICAgICAgICAgICBzdWJzdHJpbmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdCgKLSAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSkpOwotICAgICAgICAgICAgaWYgKHN1YnN0cmluZyA9PSBOVUxMKQorICAgICAgICAgICAgc3Vic3RyaW5nID0gUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpOworICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0dXBsZSBmb3IgZW5kc3dpdGggbXVzdCBvbmx5IGNvbnRhaW4gc3RyLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzdWJzdHJpbmcpLT50cF9uYW1lKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsICsxKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKQEAgLTEzMjIwLDYxICsxMzI2Nyw2NyBAQAogICAgICAgICB9CiAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKICAgICB9Ci0gICAgc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vib2JqKTsKLSAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJlbmRzd2l0aCBmaXJzdCBhcmcgbXVzdCBiZSBzdHIgb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJhIHR1cGxlIG9mIHN0ciwgbm90ICVzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhzdWJvYmopKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZW5kc3dpdGggZmlyc3QgYXJnIG11c3QgYmUgc3RyIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICJhIHR1cGxlIG9mIHN0ciwgbm90ICUuMTAwcyIsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCArMSk7Ci0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgKzEpOwogICAgIGlmIChyZXN1bHQgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KIAotUHlfTE9DQUxfSU5MSU5FKHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQKIF9QeVVuaWNvZGVXcml0ZXJfVXBkYXRlKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlcikKIHsKLSAgICBpZiAoIXdyaXRlci0+cmVhZG9ubHkpCisgICAgd3JpdGVyLT5tYXhjaGFyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKHdyaXRlci0+YnVmZmVyKTsKKyAgICB3cml0ZXItPmRhdGEgPSBQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcik7CisKKyAgICBpZiAoIXdyaXRlci0+cmVhZG9ubHkpIHsKKyAgICAgICAgd3JpdGVyLT5raW5kID0gUHlVbmljb2RlX0tJTkQod3JpdGVyLT5idWZmZXIpOwogICAgICAgICB3cml0ZXItPnNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh3cml0ZXItPmJ1ZmZlcik7CisgICAgfQogICAgIGVsc2UgeworICAgICAgICAvKiB1c2UgYSB2YWx1ZSBzbWFsbGVyIHRoYW4gUHlVbmljb2RlXzFCWVRFX0tJTkQoKSBzbworICAgICAgICAgICBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kKCkgd2lsbCBjb3B5IHRoZSBidWZmZXIuICovCisgICAgICAgIHdyaXRlci0+a2luZCA9IFB5VW5pY29kZV9XQ0hBUl9LSU5EOworICAgICAgICBhc3NlcnQod3JpdGVyLT5raW5kIDw9IFB5VW5pY29kZV8xQllURV9LSU5EKTsKKwogICAgICAgICAvKiBDb3B5LW9uLXdyaXRlIG1vZGU6IHNldCBidWZmZXIgc2l6ZSB0byAwIHNvCiAgICAgICAgICAqIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZSgpIHdpbGwgY29weSAoYW5kIGVubGFyZ2UpIHRoZSBidWZmZXIgb24KICAgICAgICAgICogbmV4dCB3cml0ZS4gKi8KICAgICAgICAgd3JpdGVyLT5zaXplID0gMDsKICAgICB9Ci0gICAgd3JpdGVyLT5tYXhjaGFyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKHdyaXRlci0+YnVmZmVyKTsKLSAgICB3cml0ZXItPmRhdGEgPSBQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcik7Ci0gICAgd3JpdGVyLT5raW5kID0gUHlVbmljb2RlX0tJTkQod3JpdGVyLT5idWZmZXIpOwogfQogCiB2b2lkCiBfUHlVbmljb2RlV3JpdGVyX0luaXQoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyKQogewogICAgIG1lbXNldCh3cml0ZXIsIDAsIHNpemVvZigqd3JpdGVyKSk7Ci0jaWZkZWYgUHlfREVCVUcKLSAgICB3cml0ZXItPmtpbmQgPSA1OyAgICAvKiBpbnZhbGlkIGtpbmQgKi8KLSNlbmRpZgorCisgICAgLyogQVNDSUkgaXMgdGhlIGJhcmUgbWluaW11bSAqLwogICAgIHdyaXRlci0+bWluX2NoYXIgPSAxMjc7CisKKyAgICAvKiB1c2UgYSB2YWx1ZSBzbWFsbGVyIHRoYW4gUHlVbmljb2RlXzFCWVRFX0tJTkQoKSBzbworICAgICAgIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoKSB3aWxsIGNvcHkgdGhlIGJ1ZmZlci4gKi8KKyAgICB3cml0ZXItPmtpbmQgPSBQeVVuaWNvZGVfV0NIQVJfS0lORDsKKyAgICBhc3NlcnQod3JpdGVyLT5raW5kIDw9IFB5VW5pY29kZV8xQllURV9LSU5EKTsKIH0KIAogaW50CiBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVJbnRlcm5hbChfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbmd0aCwgUHlfVUNTNCBtYXhjaGFyKQogewotI2lmZGVmIE1TX1dJTkRPV1MKLSAgIC8qIE9uIFdpbmRvd3MsIG92ZXJhbGxvY2F0ZSBieSA1MCUgaXMgdGhlIGJlc3QgZmFjdG9yICovCi0jICBkZWZpbmUgT1ZFUkFMTE9DQVRFX0ZBQ1RPUiAyCi0jZWxzZQotICAgLyogT24gTGludXgsIG92ZXJhbGxvY2F0ZSBieSAyNSUgaXMgdGhlIGJlc3QgZmFjdG9yICovCi0jICBkZWZpbmUgT1ZFUkFMTE9DQVRFX0ZBQ1RPUiA0Ci0jZW5kaWYKICAgICBQeV9zc2l6ZV90IG5ld2xlbjsKICAgICBQeU9iamVjdCAqbmV3YnVmZmVyOwogCi0gICAgYXNzZXJ0KGxlbmd0aCA+IDApOworICAgIGFzc2VydChtYXhjaGFyIDw9IE1BWF9VTklDT0RFKTsKKworICAgIC8qIGVuc3VyZSB0aGF0IHRoZSBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmUgbWFjcm8gd2FzIHVzZWQgKi8KKyAgICBhc3NlcnQoKG1heGNoYXIgPiB3cml0ZXItPm1heGNoYXIgJiYgbGVuZ3RoID49IDApCisgICAgICAgICAgIHx8IGxlbmd0aCA+IDApOwogCiAgICAgaWYgKGxlbmd0aCA+IFBZX1NTSVpFX1RfTUFYIC0gd3JpdGVyLT5wb3MpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKQEAgLTEzMzQwLDkgKzEzMzkzLDMyIEBACiAjdW5kZWYgT1ZFUkFMTE9DQVRFX0ZBQ1RPUgogfQogCi1QeV9MT0NBTF9JTkxJTkUoaW50KQoraW50CitfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kSW50ZXJuYWwoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZCkKK3sKKyAgICBQeV9VQ1M0IG1heGNoYXI7CisKKyAgICAvKiBlbnN1cmUgdGhhdCB0aGUgX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCBtYWNybyB3YXMgdXNlZCAqLworICAgIGFzc2VydCh3cml0ZXItPmtpbmQgPCBraW5kKTsKKworICAgIHN3aXRjaCAoa2luZCkKKyAgICB7CisgICAgY2FzZSBQeVVuaWNvZGVfMUJZVEVfS0lORDogbWF4Y2hhciA9IDB4ZmY7IGJyZWFrOworICAgIGNhc2UgUHlVbmljb2RlXzJCWVRFX0tJTkQ6IG1heGNoYXIgPSAweGZmZmY7IGJyZWFrOworICAgIGNhc2UgUHlVbmljb2RlXzRCWVRFX0tJTkQ6IG1heGNoYXIgPSAweDEwZmZmZjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KDAgJiYgImludmFsaWQga2luZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUludGVybmFsKHdyaXRlciwgMCwgbWF4Y2hhcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CiBfUHlVbmljb2RlV3JpdGVyX1dyaXRlQ2hhcklubGluZShfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsIFB5X1VDUzQgY2gpCiB7CisgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlKHdyaXRlciwgMSwgY2gpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIFB5VW5pY29kZV9XUklURSh3cml0ZXItPmtpbmQsIHdyaXRlci0+ZGF0YSwgd3JpdGVyLT5wb3MsIGNoKTsKQEAgLTEzNTEwLDE3ICsxMzU4NiwyNiBAQAogICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSA9PSB3cml0ZXItPnBvcyk7CiAgICAgICAgIHJldHVybiBzdHI7CiAgICAgfQotICAgIGlmIChQeVVuaWNvZGVfR0VUX0xFTkdUSCh3cml0ZXItPmJ1ZmZlcikgIT0gd3JpdGVyLT5wb3MpIHsKLSAgICAgICAgUHlPYmplY3QgKm5ld2J1ZmZlcjsKLSAgICAgICAgbmV3YnVmZmVyID0gcmVzaXplX2NvbXBhY3Qod3JpdGVyLT5idWZmZXIsIHdyaXRlci0+cG9zKTsKLSAgICAgICAgaWYgKG5ld2J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9DTEVBUih3cml0ZXItPmJ1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXItPmJ1ZmZlciA9IG5ld2J1ZmZlcjsKKyAgICBpZiAod3JpdGVyLT5wb3MgPT0gMCkgeworICAgICAgICBQeV9DTEVBUih3cml0ZXItPmJ1ZmZlcik7CisKKyAgICAgICAgLyogR2V0IHRoZSBlbXB0eSBVbmljb2RlIHN0cmluZyBzaW5nbGV0b24gKCcnKSAqLworICAgICAgICBfUHlfSU5DUkVGX1VOSUNPREVfRU1QVFkoKTsKKyAgICAgICAgc3RyICA9IHVuaWNvZGVfZW1wdHk7CiAgICAgfQotICAgIHN0ciA9IHdyaXRlci0+YnVmZmVyOwotICAgIHdyaXRlci0+YnVmZmVyID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgc3RyID0gd3JpdGVyLT5idWZmZXI7CisgICAgICAgIHdyaXRlci0+YnVmZmVyID0gTlVMTDsKKworICAgICAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAhPSB3cml0ZXItPnBvcykgeworICAgICAgICAgICAgUHlPYmplY3QgKnN0cjI7CisgICAgICAgICAgICBzdHIyID0gcmVzaXplX2NvbXBhY3Qoc3RyLCB3cml0ZXItPnBvcyk7CisgICAgICAgICAgICBpZiAoc3RyMiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgc3RyID0gc3RyMjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGFzc2VydChfUHlVbmljb2RlX0NoZWNrQ29uc2lzdGVuY3koc3RyLCAxKSk7CiAgICAgcmV0dXJuIHVuaWNvZGVfcmVzdWx0X3JlYWR5KHN0cik7CiB9CkBAIC0xNDY2MSwxMyArMTQ3NDYsMTAgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgY3R4LmZtdHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KGZvcm1hdCk7Ci0gICAgaWYgKGN0eC5mbXRzdHIgPT0gTlVMTCkKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoZm9ybWF0KSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoY3R4LmZtdHN0cikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKGN0eC5mbXRzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisKKyAgICBjdHguZm10c3RyID0gZm9ybWF0OwogICAgIGN0eC5mbXRkYXRhID0gUHlVbmljb2RlX0RBVEEoY3R4LmZtdHN0cik7CiAgICAgY3R4LmZtdGtpbmQgPSBQeVVuaWNvZGVfS0lORChjdHguZm10c3RyKTsKICAgICBjdHguZm10Y250ID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoY3R4LmZtdHN0cik7CkBAIC0xNDcyNywxMSArMTQ4MDksOSBAQAogICAgIGlmIChjdHguYXJnc19vd25lZCkgewogICAgICAgICBQeV9ERUNSRUYoY3R4LmFyZ3MpOwogICAgIH0KLSAgICBQeV9ERUNSRUYoY3R4LmZtdHN0cik7CiAgICAgcmV0dXJuIF9QeVVuaWNvZGVXcml0ZXJfRmluaXNoKCZjdHgud3JpdGVyKTsKIAogICBvbkVycm9yOgotICAgIFB5X0RFQ1JFRihjdHguZm10c3RyKTsKICAgICBfUHlVbmljb2RlV3JpdGVyX0RlYWxsb2MoJmN0eC53cml0ZXIpOwogICAgIGlmIChjdHguYXJnc19vd25lZCkgewogICAgICAgICBQeV9ERUNSRUYoY3R4LmFyZ3MpOwpAQCAtMTUwMDksMjYgKzE1MDg5LDE4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0gICAgLyogSXQgbWlnaHQgYmUgdGhhdCB0aGUgR2V0SXRlbSBjYWxsIGZhaWxzIGV2ZW4KLSAgICAgICB0aG91Z2ggdGhlIGtleSBpcyBwcmVzZW50IGluIHRoZSBkaWN0aW9uYXJ5LAotICAgICAgIG5hbWVseSB3aGVuIHRoaXMgaGFwcGVucyBkdXJpbmcgYSBzdGFjayBvdmVyZmxvdy4gKi8KICAgICBQeV9BTExPV19SRUNVUlNJT04KLSAgICB0ID0gUHlEaWN0X0dldEl0ZW0oaW50ZXJuZWQsIHMpOworICAgIHQgPSBQeURpY3RfU2V0RGVmYXVsdChpbnRlcm5lZCwgcywgcyk7CiAgICAgUHlfRU5EX0FMTE9XX1JFQ1VSU0lPTgotCi0gICAgaWYgKHQpIHsKKyAgICBpZiAodCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHQgIT0gcykgewogICAgICAgICBQeV9JTkNSRUYodCk7CiAgICAgICAgIFB5X1NFVFJFRigqcCwgdCk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0KLSAgICBQeVRocmVhZFN0YXRlX0dFVCgpLT5yZWN1cnNpb25fY3JpdGljYWwgPSAxOwotICAgIGlmIChQeURpY3RfU2V0SXRlbShpbnRlcm5lZCwgcywgcykgPCAwKSB7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIFB5VGhyZWFkU3RhdGVfR0VUKCktPnJlY3Vyc2lvbl9jcml0aWNhbCA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgUHlUaHJlYWRTdGF0ZV9HRVQoKS0+cmVjdXJzaW9uX2NyaXRpY2FsID0gMDsKICAgICAvKiBUaGUgdHdvIHJlZmVyZW5jZXMgaW4gaW50ZXJuZWQgYXJlIG5vdCBjb3VudGVkIGJ5IHJlZmNudC4KICAgICAgICBUaGUgZGVhbGxvY2F0b3Igd2lsbCB0YWtlIGNhcmUgb2YgdGhpcyAqLwogICAgIFB5X1JFRkNOVChzKSAtPSAyOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwppbmRleCA3ZTZmMzY0Li5hYjZiMjM1IDEwMDY0NAotLS0gYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYworKysgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXBhcnNlX3dlYWtyZWZfaW5pdF9hcmdzKGNoYXIgKmZ1bmNuYW1lLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncywKK3BhcnNlX3dlYWtyZWZfaW5pdF9hcmdzKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncywKICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqb2JwLCBQeU9iamVjdCAqKmNhbGxiYWNrcCkKIHsKICAgICByZXR1cm4gUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgZnVuY25hbWUsIDEsIDIsIG9icCwgY2FsbGJhY2twKTsKQEAgLTQ1Myw3ICs0NTMsNyBAQAogICAgIG1ldGhvZChQeU9iamVjdCAqcHJveHkpIHsgXAogICAgICAgICAgICAgX1B5X0lERU5USUZJRVIoc3BlY2lhbCk7IFwKICAgICAgICAgICAgIFVOV1JBUChwcm94eSk7IFwKLSAgICAgICAgICAgICAgICByZXR1cm4gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChwcm94eSwgJlB5SWRfIyNzcGVjaWFsLCAiIik7IFwKKyAgICAgICAgICAgICAgICByZXR1cm4gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChwcm94eSwgJlB5SWRfIyNzcGVjaWFsLCBOVUxMKTsgXAogICAgICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvUEMvX21zaS5jIGIvUEMvX21zaS5jCmluZGV4IDllN2UzNmQuLjc4OWIwNGYgMTAwNjQ0Ci0tLSBhL1BDL19tc2kuYworKysgYi9QQy9fbXNpLmMKQEAgLTEwNDYsMTIgKzEwNDYsMTIgQEAKICAgICBpZiAobSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFRElSRUNUIiwgKGludClNU0lEQk9QRU5fQ1JFQVRFRElSRUNUKTsKLSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0NSRUFURSIsIChpbnQpTVNJREJPUEVOX0NSRUFURSk7Ci0gICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9ESVJFQ1QiLCAoaW50KU1TSURCT1BFTl9ESVJFQ1QpOwotICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fUkVBRE9OTFkiLCAoaW50KU1TSURCT1BFTl9SRUFET05MWSk7Ci0gICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9UUkFOU0FDVCIsIChpbnQpTVNJREJPUEVOX1RSQU5TQUNUKTsKLSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1BBVENIRklMRSIsIChpbnQpTVNJREJPUEVOX1BBVENIRklMRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9DUkVBVEVESVJFQ1QiLCAobG9uZylNU0lEQk9QRU5fQ1JFQVRFRElSRUNUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0NSRUFURSIsIChsb25nKU1TSURCT1BFTl9DUkVBVEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fRElSRUNUIiwgKGxvbmcpTVNJREJPUEVOX0RJUkVDVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9SRUFET05MWSIsIChsb25nKU1TSURCT1BFTl9SRUFET05MWSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9UUkFOU0FDVCIsIChsb25nKU1TSURCT1BFTl9UUkFOU0FDVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9QQVRDSEZJTEUiLCAobG9uZylNU0lEQk9QRU5fUEFUQ0hGSUxFKTsKIAogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIE1TSUNPTElORk9fTkFNRVMpOwogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIE1TSUNPTElORk9fVFlQRVMpOwpkaWZmIC0tZ2l0IGEvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMgYi9QQy9iZGlzdF93aW5pbnN0L2luc3RhbGwuYwppbmRleCBjYjAzN2ZmLi5lMDFkYmE2IDEwMDY0NAotLS0gYS9QQy9iZGlzdF93aW5pbnN0L2luc3RhbGwuYworKysgYi9QQy9iZGlzdF93aW5pbnN0L2luc3RhbGwuYwpAQCAtNzE4LDcgKzcxOCw3IEBACiAgKiAxIGlmIHRoZSBQeXRob24tZGxsIGRvZXMgbm90IGV4cG9ydCB0aGUgZnVuY3Rpb25zIHdlIG5lZWQKICAqIDIgaWYgbm8gaW5zdGFsbC1zY3JpcHQgaXMgc3BlY2lmaWVkIGluIHBhdGhuYW1lCiAgKiAzIGlmIHRoZSBpbnN0YWxsLXNjcmlwdCBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQKLSAqIHRoZSByZXR1cm4gdmFsdWUgb2YgUHlSdW5fU2ltcGxlU3RyaW5nKCkgb3RoZXJ3aXNlLAorICogdGhlIHJldHVybiB2YWx1ZSBvZiBQeVJ1bl9TaW1wbGVTdHJpbmcoKSBvciBQeV9GaW5hbGl6ZUV4KCkgb3RoZXJ3aXNlLAogICogd2hpY2ggaXMgMCBpZiBldmVyeXRoaW5nIGlzIG9rLCAtMSBpZiBhbiBleGNlcHRpb24gaGFkIG9jY3VycmVkCiAgKiBpbiB0aGUgaW5zdGFsbC1zY3JpcHQuCiAgKi8KQEAgLTczMSw3ICs3MzEsNyBAQAogICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0luaXRpYWxpemUsICh2b2lkKSk7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVN5c19TZXRBcmd2LCAoaW50LCB3Y2hhcl90ICoqKSk7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVJ1bl9TaW1wbGVTdHJpbmcsIChjaGFyICopKTsKLSAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9GaW5hbGl6ZSwgKHZvaWQpKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5X0ZpbmFsaXplRXgsICh2b2lkKSk7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlfQnVpbGRWYWx1ZSwgKGNoYXIgKiwgLi4uKSk7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlDRnVuY3Rpb25fTmV3LAogICAgICAgICAgICAgIChQeU1ldGhvZERlZiAqLCBQeU9iamVjdCAqKSk7CkBAIC03MzksNyArNzM5LDcgQEAKICAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUVycl9Gb3JtYXQsIChQeU9iamVjdCAqLCBjaGFyICopKTsKIAogICAgIGlmICghUHlfSW5pdGlhbGl6ZSB8fCAhUHlTeXNfU2V0QXJndgotICAgICAgICB8fCAhUHlSdW5fU2ltcGxlU3RyaW5nIHx8ICFQeV9GaW5hbGl6ZSkKKyAgICAgICAgfHwgIVB5UnVuX1NpbXBsZVN0cmluZyB8fCAhUHlfRmluYWxpemVFeCkKICAgICAgICAgcmV0dXJuIDE7CiAKICAgICBpZiAoIVB5X0J1aWxkVmFsdWUgfHwgIVB5QXJnX1BhcnNlVHVwbGUgfHwgIVB5RXJyX0Zvcm1hdCkKQEAgLTc4Niw3ICs3ODYsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIFB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgfQogCiAgICAgY2xvc2UoZmgpOwogICAgIHJldHVybiByZXN1bHQ7CkBAIC04NDgsMTEgKzg1MCwxMSBAQAogICAgIGludCByYzsKICAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9Jbml0aWFsaXplLCAodm9pZCkpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X1NldFByb2dyYW1OYW1lLCAod2NoYXJfdCAqKSk7Ci0gICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfRmluYWxpemUsICh2b2lkKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeV9GaW5hbGl6ZUV4LCAodm9pZCkpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlSdW5fU2ltcGxlU3RyaW5nLCAoY2hhciAqKSk7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlFcnJfUHJpbnQsICh2b2lkKSk7CiAKLSAgICBpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5X1NldFByb2dyYW1OYW1lIHx8ICFQeV9GaW5hbGl6ZSB8fAorICAgIGlmICghUHlfSW5pdGlhbGl6ZSB8fCAhUHlfU2V0UHJvZ3JhbU5hbWUgfHwgIVB5X0ZpbmFsaXplRXggfHwKICAgICAgICAgIVB5UnVuX1NpbXBsZVN0cmluZyB8fCAhUHlFcnJfUHJpbnQpCiAgICAgICAgIHJldHVybiAtMTsKIApAQCAtODYyLDcgKzg2NCw5IEBACiAgICAgcmMgPSBQeVJ1bl9TaW1wbGVTdHJpbmcoc2NyaXB0KTsKICAgICBpZiAocmMpCiAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICByYyA9IC0xOworICAgIH0KICAgICByZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL1BDL2NsaW5pYy9tc3ZjcnRtb2R1bGUuYy5oIGIvUEMvY2xpbmljL21zdmNydG1vZHVsZS5jLmgKaW5kZXggZTdhNzJjNC4uNjkzNWNhZCAxMDA2NDQKLS0tIGEvUEMvY2xpbmljL21zdmNydG1vZHVsZS5jLmgKKysrIGIvUEMvY2xpbmljL21zdmNydG1vZHVsZS5jLmgKQEAgLTUxLDggKzUxLDkgQEAKICAgICBsb25nIG5ieXRlczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlsOmxvY2tpbmciLAotICAgICAgICAmZmQsICZtb2RlLCAmbmJ5dGVzKSkKKyAgICAgICAgJmZkLCAmbW9kZSwgJm5ieXRlcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBtc3ZjcnRfbG9ja2luZ19pbXBsKG1vZHVsZSwgZmQsIG1vZGUsIG5ieXRlcyk7CiAKIGV4aXQ6CkBAIC04NSwxMSArODYsMTMgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOnNldG1vZGUiLAotICAgICAgICAmZmQsICZmbGFncykpCisgICAgICAgICZmZCwgJmZsYWdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfc2V0bW9kZV9pbXBsKG1vZHVsZSwgZmQsIGZsYWdzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTEwLDIyICsxMTMsMjQgQEAKICAgICB7Im9wZW5fb3NmaGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKW1zdmNydF9vcGVuX29zZmhhbmRsZSwgTUVUSF9WQVJBUkdTLCBtc3ZjcnRfb3Blbl9vc2ZoYW5kbGVfX2RvY19ffSwKIAogc3RhdGljIGxvbmcKLW1zdmNydF9vcGVuX29zZmhhbmRsZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2ludHB0cl90IGhhbmRsZSwgaW50IGZsYWdzKTsKK21zdmNydF9vcGVuX29zZmhhbmRsZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludHB0cl90IGhhbmRsZSwgaW50IGZsYWdzKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9vcGVuX29zZmhhbmRsZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBQeV9pbnRwdHJfdCBoYW5kbGU7CisgICAgaW50cHRyX3QgaGFuZGxlOwogICAgIGludCBmbGFnczsKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiJfUHlfUEFSU0VfSU5UUFRSImk6b3Blbl9vc2ZoYW5kbGUiLAotICAgICAgICAmaGFuZGxlLCAmZmxhZ3MpKQorICAgICAgICAmaGFuZGxlLCAmZmxhZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG1zdmNydF9vcGVuX29zZmhhbmRsZV9pbXBsKG1vZHVsZSwgaGFuZGxlLCBmbGFncyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTE0Myw3ICsxNDgsNyBAQAogI2RlZmluZSBNU1ZDUlRfR0VUX09TRkhBTkRMRV9NRVRIT0RERUYgICAgXAogICAgIHsiZ2V0X29zZmhhbmRsZSIsIChQeUNGdW5jdGlvbiltc3ZjcnRfZ2V0X29zZmhhbmRsZSwgTUVUSF9PLCBtc3ZjcnRfZ2V0X29zZmhhbmRsZV9fZG9jX199LAogCi1zdGF0aWMgUHlfaW50cHRyX3QKK3N0YXRpYyBpbnRwdHJfdAogbXN2Y3J0X2dldF9vc2ZoYW5kbGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnQgZmQpOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTUxLDEzICsxNTYsMTUgQEAKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgZmQ7Ci0gICAgUHlfaW50cHRyX3QgX3JldHVybl92YWx1ZTsKKyAgICBpbnRwdHJfdCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldF9vc2ZoYW5kbGUiLCAmZmQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRfb3NmaGFuZGxlIiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfZ2V0X29zZmhhbmRsZV9pbXBsKG1vZHVsZSwgZmQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTE4Myw4ICsxOTAsOSBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfa2JoaXRfaW1wbChtb2R1bGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMTEsOCArMzE5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjaGFyIGNoYXJfdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImM6cHV0Y2giLCAmY2hhcl92YWx1ZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJjOnB1dGNoIiwgJmNoYXJfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X3B1dGNoX2ltcGwobW9kdWxlLCBjaGFyX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTMzNyw4ICszNDYsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCB1bmljb2RlX2NoYXI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6cHV0d2NoIiwgJnVuaWNvZGVfY2hhcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOnB1dHdjaCIsICZ1bmljb2RlX2NoYXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X3B1dHdjaF9pbXBsKG1vZHVsZSwgdW5pY29kZV9jaGFyKTsKIAogZXhpdDoKQEAgLTM2Nyw4ICszNzcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNoYXIgY2hhcl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiYzp1bmdldGNoIiwgJmNoYXJfdmFsdWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiYzp1bmdldGNoIiwgJmNoYXJfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X3VuZ2V0Y2hfaW1wbChtb2R1bGUsIGNoYXJfdmFsdWUpOwogCiBleGl0OgpAQCAtMzkzLDggKzQwNCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IHVuaWNvZGVfY2hhcjsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzp1bmdldHdjaCIsICZ1bmljb2RlX2NoYXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzp1bmdldHdjaCIsICZ1bmljb2RlX2NoYXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X3VuZ2V0d2NoX2ltcGwobW9kdWxlLCB1bmljb2RlX2NoYXIpOwogCiBleGl0OgpAQCAtNDI2LDExICs0MzgsMTMgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOkNydFNldFJlcG9ydEZpbGUiLAotICAgICAgICAmdHlwZSwgJmZpbGUpKQorICAgICAgICAmdHlwZSwgJmZpbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG1zdmNydF9DcnRTZXRSZXBvcnRGaWxlX2ltcGwobW9kdWxlLCB0eXBlLCBmaWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDY0LDExICs0NzgsMTMgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOkNydFNldFJlcG9ydE1vZGUiLAotICAgICAgICAmdHlwZSwgJm1vZGUpKQorICAgICAgICAmdHlwZSwgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG1zdmNydF9DcnRTZXRSZXBvcnRNb2RlX2ltcGwobW9kdWxlLCB0eXBlLCBtb2RlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNTAwLDExICs1MTYsMTMgQEAKICAgICBpbnQgbW9kZTsKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6c2V0X2Vycm9yX21vZGUiLCAmbW9kZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnNldF9lcnJvcl9tb2RlIiwgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG1zdmNydF9zZXRfZXJyb3JfbW9kZV9pbXBsKG1vZHVsZSwgbW9kZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTUzMSw4ICs1NDksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHVuc2lnbmVkIGludCBtb2RlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJJOlNldEVycm9yTW9kZSIsICZtb2RlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkk6U2V0RXJyb3JNb2RlIiwgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X1NldEVycm9yTW9kZV9pbXBsKG1vZHVsZSwgbW9kZSk7CiAKIGV4aXQ6CkBAIC01NTAsNCArNTY5LDQgQEAKICNpZm5kZWYgTVNWQ1JUX1NFVF9FUlJPUl9NT0RFX01FVEhPRERFRgogICAgICNkZWZpbmUgTVNWQ1JUX1NFVF9FUlJPUl9NT0RFX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKE1TVkNSVF9TRVRfRVJST1JfTU9ERV9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmE3OTRjNTIwZDZhZTg4NyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YWUwNGUyYjUwZWVmOGI2MyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9QQy9jbGluaWMvd2lucmVnLmMuaCBiL1BDL2NsaW5pYy93aW5yZWcuYy5oCmluZGV4IGY2YWUyYzAuLmU3ODM2ZTQgMTAwNjQ0Ci0tLSBhL1BDL2NsaW5pYy93aW5yZWcuYy5oCisrKyBiL1BDL2NsaW5pYy93aW5yZWcuYy5oCkBAIC04NywxNCArODcsMTYgQEAKIHdpbnJlZ19IS0VZVHlwZV9fX2V4aXRfXyhQeUhLRVlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZXhjX3R5cGUiLCAiZXhjX3ZhbHVlIiwgInRyYWNlYmFjayIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImV4Y190eXBlIiwgImV4Y192YWx1ZSIsICJ0cmFjZWJhY2siLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPT086X19leGl0X18iLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpleGNfdHlwZTsKICAgICBQeU9iamVjdCAqZXhjX3ZhbHVlOwogICAgIFB5T2JqZWN0ICp0cmFjZWJhY2s7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPT086X19leGl0X18iLCBfa2V5d29yZHMsCi0gICAgICAgICZleGNfdHlwZSwgJmV4Y192YWx1ZSwgJnRyYWNlYmFjaykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZXhjX3R5cGUsICZleGNfdmFsdWUsICZ0cmFjZWJhY2spKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0hLRVlUeXBlX19fZXhpdF9fX2ltcGwoc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKTsKIAogZXhpdDoKQEAgLTE0NywxMSArMTQ5LDEzIEBACiAgICAgSEtFWSBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJaTyY6Q29ubmVjdFJlZ2lzdHJ5IiwKLSAgICAgICAgJmNvbXB1dGVyX25hbWUsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpCisgICAgICAgICZjb21wdXRlcl9uYW1lLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IHdpbnJlZ19Db25uZWN0UmVnaXN0cnlfaW1wbChtb2R1bGUsIGNvbXB1dGVyX25hbWUsIGtleSk7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlIS0VZX0Zyb21IS0VZKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTkyLDExICsxOTYsMTMgQEAKICAgICBIS0VZIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mWjpDcmVhdGVLZXkiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5KSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gd2lucmVnX0NyZWF0ZUtleV9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5KTsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUhLRVlfRnJvbUhLRVkoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0yMzksMTkgKzI0NSwyMiBAQAogd2lucmVnX0NyZWF0ZUtleUV4KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsia2V5IiwgInN1Yl9rZXkiLCAicmVzZXJ2ZWQiLCAiYWNjZXNzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsia2V5IiwgInN1Yl9rZXkiLCAicmVzZXJ2ZWQiLCAiYWNjZXNzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZafGlpOkNyZWF0ZUtleUV4IiwgX2tleXdvcmRzLCAwfTsKICAgICBIS0VZIGtleTsKICAgICBQeV9VTklDT0RFICpzdWJfa2V5OwogICAgIGludCByZXNlcnZlZCA9IDA7CiAgICAgUkVHU0FNIGFjY2VzcyA9IEtFWV9XUklURTsKICAgICBIS0VZIF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJlp8aWk6Q3JlYXRlS2V5RXgiLCBfa2V5d29yZHMsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZyZXNlcnZlZCwgJmFjY2VzcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmcmVzZXJ2ZWQsICZhY2Nlc3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IHdpbnJlZ19DcmVhdGVLZXlFeF9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCByZXNlcnZlZCwgYWNjZXNzKTsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUhLRVlfRnJvbUhLRVkoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0yOTAsOCArMjk5LDkgQEAKICAgICBQeV9VTklDT0RFICpzdWJfa2V5OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnU6RGVsZXRlS2V5IiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0RlbGV0ZUtleV9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5KTsKIAogZXhpdDoKQEAgLTMzNCwxNSArMzQ0LDE3IEBACiB3aW5yZWdfRGVsZXRlS2V5RXgoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJrZXkiLCAic3ViX2tleSIsICJhY2Nlc3MiLCAicmVzZXJ2ZWQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJrZXkiLCAic3ViX2tleSIsICJhY2Nlc3MiLCAicmVzZXJ2ZWQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJnV8aWk6RGVsZXRlS2V5RXgiLCBfa2V5d29yZHMsIDB9OwogICAgIEhLRVkga2V5OwogICAgIFB5X1VOSUNPREUgKnN1Yl9rZXk7CiAgICAgUkVHU0FNIGFjY2VzcyA9IEtFWV9XT1c2NF82NEtFWTsKICAgICBpbnQgcmVzZXJ2ZWQgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ1fGlpOkRlbGV0ZUtleUV4IiwgX2tleXdvcmRzLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmYWNjZXNzLCAmcmVzZXJ2ZWQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJmFjY2VzcywgJnJlc2VydmVkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19EZWxldGVLZXlFeF9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCBhY2Nlc3MsIHJlc2VydmVkKTsKIAogZXhpdDoKQEAgLTM3NCw4ICszODYsOSBAQAogICAgIFB5X1VOSUNPREUgKnZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJlo6RGVsZXRlVmFsdWUiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZ2YWx1ZSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19EZWxldGVWYWx1ZV9pbXBsKG1vZHVsZSwga2V5LCB2YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MTEsOCArNDI0LDkgQEAKICAgICBpbnQgaW5kZXg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTpFbnVtS2V5IiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmaW5kZXgpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZpbmRleCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRW51bUtleV9pbXBsKG1vZHVsZSwga2V5LCBpbmRleCk7CiAKIGV4aXQ6CkBAIC00NTcsOCArNDcxLDkgQEAKICAgICBpbnQgaW5kZXg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTpFbnVtVmFsdWUiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZpbmRleCkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJmluZGV4KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19FbnVtVmFsdWVfaW1wbChtb2R1bGUsIGtleSwgaW5kZXgpOwogCiBleGl0OgpAQCAtNDgzLDggKzQ5OCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfVU5JQ09ERSAqc3RyaW5nOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ1OkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyIsICZzdHJpbmcpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidTpFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiLCAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NfaW1wbChtb2R1bGUsIHN0cmluZyk7CiAKIGV4aXQ6CkBAIC01MjIsOCArNTM4LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBIS0VZIGtleTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6Rmx1c2hLZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6Rmx1c2hLZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0ZsdXNoS2V5X2ltcGwobW9kdWxlLCBrZXkpOwogCiBleGl0OgpAQCAtNTc0LDggKzU5MSw5IEBACiAgICAgUHlfVU5JQ09ERSAqZmlsZV9uYW1lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnV1OkxvYWRLZXkiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmZmlsZV9uYW1lKSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJmZpbGVfbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfTG9hZEtleV9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCBmaWxlX25hbWUpOwogCiBleGl0OgpAQCAtNjEyLDE5ICs2MzAsMjIgQEAKIHdpbnJlZ19PcGVuS2V5KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsia2V5IiwgInN1Yl9rZXkiLCAicmVzZXJ2ZWQiLCAiYWNjZXNzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsia2V5IiwgInN1Yl9rZXkiLCAicmVzZXJ2ZWQiLCAiYWNjZXNzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZafGlpOk9wZW5LZXkiLCBfa2V5d29yZHMsIDB9OwogICAgIEhLRVkga2V5OwogICAgIFB5X1VOSUNPREUgKnN1Yl9rZXk7CiAgICAgaW50IHJlc2VydmVkID0gMDsKICAgICBSRUdTQU0gYWNjZXNzID0gS0VZX1JFQUQ7CiAgICAgSEtFWSBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZafGlpOk9wZW5LZXkiLCBfa2V5d29yZHMsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZyZXNlcnZlZCwgJmFjY2VzcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmcmVzZXJ2ZWQsICZhY2Nlc3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IHdpbnJlZ19PcGVuS2V5X2ltcGwobW9kdWxlLCBrZXksIHN1Yl9rZXksIHJlc2VydmVkLCBhY2Nlc3MpOwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5SEtFWV9Gcm9tSEtFWShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTY2MSwxOSArNjgyLDIyIEBACiB3aW5yZWdfT3BlbktleUV4KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsia2V5IiwgInN1Yl9rZXkiLCAicmVzZXJ2ZWQiLCAiYWNjZXNzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsia2V5IiwgInN1Yl9rZXkiLCAicmVzZXJ2ZWQiLCAiYWNjZXNzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZafGlpOk9wZW5LZXlFeCIsIF9rZXl3b3JkcywgMH07CiAgICAgSEtFWSBrZXk7CiAgICAgUHlfVU5JQ09ERSAqc3ViX2tleTsKICAgICBpbnQgcmVzZXJ2ZWQgPSAwOwogICAgIFJFR1NBTSBhY2Nlc3MgPSBLRVlfUkVBRDsKICAgICBIS0VZIF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJlp8aWk6T3BlbktleUV4IiwgX2tleXdvcmRzLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmcmVzZXJ2ZWQsICZhY2Nlc3MpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJnJlc2VydmVkLCAmYWNjZXNzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSB3aW5yZWdfT3BlbktleUV4X2ltcGwobW9kdWxlLCBrZXksIHN1Yl9rZXksIHJlc2VydmVkLCBhY2Nlc3MpOwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5SEtFWV9Gcm9tSEtFWShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTcwNyw4ICs3MzEsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIEhLRVkga2V5OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpRdWVyeUluZm9LZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6UXVlcnlJbmZvS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19RdWVyeUluZm9LZXlfaW1wbChtb2R1bGUsIGtleSk7CiAKIGV4aXQ6CkBAIC03NDksOCArNzc0LDkgQEAKICAgICBQeV9VTklDT0RFICpzdWJfa2V5OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJlo6UXVlcnlWYWx1ZSIsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXkpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19RdWVyeVZhbHVlX2ltcGwobW9kdWxlLCBrZXksIHN1Yl9rZXkpOwogCiBleGl0OgpAQCAtNzg3LDggKzgxMyw5IEBACiAgICAgUHlfVU5JQ09ERSAqbmFtZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZaOlF1ZXJ5VmFsdWVFeCIsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJm5hbWUpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19RdWVyeVZhbHVlRXhfaW1wbChtb2R1bGUsIGtleSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC04MzAsOCArODU3LDkgQEAKICAgICBQeV9VTklDT0RFICpmaWxlX25hbWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mdTpTYXZlS2V5IiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmZmlsZV9uYW1lKSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmZmlsZV9uYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19TYXZlS2V5X2ltcGwobW9kdWxlLCBrZXksIGZpbGVfbmFtZSk7CiAKIGV4aXQ6CkBAIC04ODMsOCArOTExLDkgQEAKICAgICBQeV9zc2l6ZV9jbGVhbl90IHZhbHVlX2xlbmd0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZaa3UjOlNldFZhbHVlIiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJnR5cGUsICZ2YWx1ZSwgJnZhbHVlX2xlbmd0aCkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZ0eXBlLCAmdmFsdWUsICZ2YWx1ZV9sZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX1NldFZhbHVlX2ltcGwobW9kdWxlLCBrZXksIHN1Yl9rZXksIHR5cGUsIHZhbHVlLCB2YWx1ZV9sZW5ndGgpOwogCiBleGl0OgpAQCAtOTA3LDcgKzkzNiw3IEBACiAiICAgIEFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEsIG9uZSBvZjpcbiIKICIgICAgUkVHX0JJTkFSWSAtLSBCaW5hcnkgZGF0YSBpbiBhbnkgZm9ybS5cbiIKICIgICAgUkVHX0RXT1JEIC0tIEEgMzItYml0IG51bWJlci5cbiIKLSIgICAgUkVHX0RXT1JEX0xJVFRMRV9FTkRJQU4gLS0gQSAzMi1iaXQgbnVtYmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LlxuIgorIiAgICBSRUdfRFdPUkRfTElUVExFX0VORElBTiAtLSBBIDMyLWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuIEVxdWl2YWxlbnQgdG8gUkVHX0RXT1JEXG4iCiAiICAgIFJFR19EV09SRF9CSUdfRU5ESUFOIC0tIEEgMzItYml0IG51bWJlciBpbiBiaWctZW5kaWFuIGZvcm1hdC5cbiIKICIgICAgUkVHX0VYUEFORF9TWiAtLSBBIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdGhhdCBjb250YWlucyB1bmV4cGFuZGVkXG4iCiAiICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGZvciBleGFtcGxlLFxuIgpAQCAtOTE3LDYgKzk0Niw4IEBACiAiICAgICAgICAgICAgICAgICAgICBieSB0d28gbnVsbCBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0IFB5dGhvbiBoYW5kbGVzXG4iCiAiICAgICAgICAgICAgICAgICAgICB0aGlzIHRlcm1pbmF0aW9uIGF1dG9tYXRpY2FsbHkuXG4iCiAiICAgIFJFR19OT05FIC0tIE5vIGRlZmluZWQgdmFsdWUgdHlwZS5cbiIKKyIgICAgUkVHX1FXT1JEIC0tIEEgNjQtYml0IG51bWJlci5cbiIKKyIgICAgUkVHX1FXT1JEX0xJVFRMRV9FTkRJQU4gLS0gQSA2NC1iaXQgbnVtYmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiBFcXVpdmFsZW50IHRvIFJFR19RV09SRC5cbiIKICIgICAgUkVHX1JFU09VUkNFX0xJU1QgLS0gQSBkZXZpY2UtZHJpdmVyIHJlc291cmNlIGxpc3QuXG4iCiAiICAgIFJFR19TWiAtLSBBIG51bGwtdGVybWluYXRlZCBzdHJpbmcuXG4iCiAiICB2YWx1ZVxuIgpAQCAtOTUwLDggKzk4MSw5IEBACiAgICAgUHlPYmplY3QgKnZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJlpPa086U2V0VmFsdWVFeCIsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnZhbHVlX25hbWUsICZyZXNlcnZlZCwgJnR5cGUsICZ2YWx1ZSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnZhbHVlX25hbWUsICZyZXNlcnZlZCwgJnR5cGUsICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfU2V0VmFsdWVFeF9pbXBsKG1vZHVsZSwga2V5LCB2YWx1ZV9uYW1lLCByZXNlcnZlZCwgdHlwZSwgdmFsdWUpOwogCiBleGl0OgpAQCAtOTg1LDggKzEwMTcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIEhLRVkga2V5OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpEaXNhYmxlUmVmbGVjdGlvbktleSIsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpEaXNhYmxlUmVmbGVjdGlvbktleSIsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRGlzYWJsZVJlZmxlY3Rpb25LZXlfaW1wbChtb2R1bGUsIGtleSk7CiAKIGV4aXQ6CkBAIC0xMDE4LDggKzEwNTEsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIEhLRVkga2V5OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpFbmFibGVSZWZsZWN0aW9uS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOkVuYWJsZVJlZmxlY3Rpb25LZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0VuYWJsZVJlZmxlY3Rpb25LZXlfaW1wbChtb2R1bGUsIGtleSk7CiAKIGV4aXQ6CkBAIC0xMDQ5LDExICsxMDgzLDEyIEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgSEtFWSBrZXk7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOlF1ZXJ5UmVmbGVjdGlvbktleSIsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpRdWVyeVJlZmxlY3Rpb25LZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX1F1ZXJ5UmVmbGVjdGlvbktleV9pbXBsKG1vZHVsZSwga2V5KTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTdiODk0MGEyM2Y2MDVkZGMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTViNTNkMTljYmUzZjM3Y2QgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvUEMvY2xpbmljL3dpbnNvdW5kLmMuaCBiL1BDL2NsaW5pYy93aW5zb3VuZC5jLmgKaW5kZXggYjAwYjQ0Mi4uNzY2NDc5YSAxMDA2NDQKLS0tIGEvUEMvY2xpbmljL3dpbnNvdW5kLmMuaAorKysgYi9QQy9jbGluaWMvd2luc291bmQuYy5oCkBAIC0zLDcgKzMsNyBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBQeURvY19TVFJWQVIod2luc291bmRfUGxheVNvdW5kX19kb2NfXywKLSJQbGF5U291bmQoJG1vZHVsZSwgc291bmQsIGZsYWdzLCAvKVxuIgorIlBsYXlTb3VuZCgkbW9kdWxlLCAvLCBzb3VuZCwgZmxhZ3MpXG4iCiAiLS1cbiIKICJcbiIKICJBIHdyYXBwZXIgYXJvdW5kIHRoZSBXaW5kb3dzIFBsYXlTb3VuZCBBUEkuXG4iCkBAIC0xNCwyMSArMTQsMjQgQEAKICIgICAgRmxhZyB2YWx1ZXMsIG9yZWQgdG9nZXRoZXIuICBTZWUgbW9kdWxlIGRvY3VtZW50YXRpb24uIik7CiAKICNkZWZpbmUgV0lOU09VTkRfUExBWVNPVU5EX01FVEhPRERFRiAgICBcCi0gICAgeyJQbGF5U291bmQiLCAoUHlDRnVuY3Rpb24pd2luc291bmRfUGxheVNvdW5kLCBNRVRIX1ZBUkFSR1MsIHdpbnNvdW5kX1BsYXlTb3VuZF9fZG9jX199LAorICAgIHsiUGxheVNvdW5kIiwgKFB5Q0Z1bmN0aW9uKXdpbnNvdW5kX1BsYXlTb3VuZCwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIHdpbnNvdW5kX1BsYXlTb3VuZF9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotd2luc291bmRfUGxheVNvdW5kX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfVU5JQ09ERSAqc291bmQsIGludCBmbGFncyk7Cit3aW5zb3VuZF9QbGF5U291bmRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc291bmQsIGludCBmbGFncyk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi13aW5zb3VuZF9QbGF5U291bmQoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MpCit3aW5zb3VuZF9QbGF5U291bmQoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgUHlfVU5JQ09ERSAqc291bmQ7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic291bmQiLCAiZmxhZ3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPaTpQbGF5U291bmQiLCBfa2V5d29yZHMsIDB9OworICAgIFB5T2JqZWN0ICpzb3VuZDsKICAgICBpbnQgZmxhZ3M7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlppOlBsYXlTb3VuZCIsCi0gICAgICAgICZzb3VuZCwgJmZsYWdzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzb3VuZCwgJmZsYWdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnNvdW5kX1BsYXlTb3VuZF9pbXBsKG1vZHVsZSwgc291bmQsIGZsYWdzKTsKIAogZXhpdDoKQEAgLTM2LDcgKzM5LDcgQEAKIH0KIAogUHlEb2NfU1RSVkFSKHdpbnNvdW5kX0JlZXBfX2RvY19fLAotIkJlZXAoJG1vZHVsZSwgZnJlcXVlbmN5LCBkdXJhdGlvbiwgLylcbiIKKyJCZWVwKCRtb2R1bGUsIC8sIGZyZXF1ZW5jeSwgZHVyYXRpb24pXG4iCiAiLS1cbiIKICJcbiIKICJBIHdyYXBwZXIgYXJvdW5kIHRoZSBXaW5kb3dzIEJlZXAgQVBJLlxuIgpAQCAtNDgsMjEgKzUxLDI0IEBACiAiICAgIEhvdyBsb25nIHRoZSBzb3VuZCBzaG91bGQgcGxheSwgaW4gbWlsbGlzZWNvbmRzLiIpOwogCiAjZGVmaW5lIFdJTlNPVU5EX0JFRVBfTUVUSE9EREVGICAgIFwKLSAgICB7IkJlZXAiLCAoUHlDRnVuY3Rpb24pd2luc291bmRfQmVlcCwgTUVUSF9WQVJBUkdTLCB3aW5zb3VuZF9CZWVwX19kb2NfX30sCisgICAgeyJCZWVwIiwgKFB5Q0Z1bmN0aW9uKXdpbnNvdW5kX0JlZXAsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCB3aW5zb3VuZF9CZWVwX19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW5zb3VuZF9CZWVwX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50IGZyZXF1ZW5jeSwgaW50IGR1cmF0aW9uKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLXdpbnNvdW5kX0JlZXAoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MpCit3aW5zb3VuZF9CZWVwKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZyZXF1ZW5jeSIsICJkdXJhdGlvbiIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7ImlpOkJlZXAiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBmcmVxdWVuY3k7CiAgICAgaW50IGR1cmF0aW9uOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpCZWVwIiwKLSAgICAgICAgJmZyZXF1ZW5jeSwgJmR1cmF0aW9uKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZmcmVxdWVuY3ksICZkdXJhdGlvbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5zb3VuZF9CZWVwX2ltcGwobW9kdWxlLCBmcmVxdWVuY3ksIGR1cmF0aW9uKTsKIAogZXhpdDoKQEAgLTcwLDcgKzc2LDcgQEAKIH0KIAogUHlEb2NfU1RSVkFSKHdpbnNvdW5kX01lc3NhZ2VCZWVwX19kb2NfXywKLSJNZXNzYWdlQmVlcCgkbW9kdWxlLCB4PU1CX09LLCAvKVxuIgorIk1lc3NhZ2VCZWVwKCRtb2R1bGUsIC8sIHR5cGU9TUJfT0spXG4iCiAiLS1cbiIKICJcbiIKICJDYWxsIFdpbmRvd3MgTWVzc2FnZUJlZXAoeCkuXG4iCkBAIC03OCwyMyArODQsMjYgQEAKICJ4IGRlZmF1bHRzIHRvIE1CX09LLiIpOwogCiAjZGVmaW5lIFdJTlNPVU5EX01FU1NBR0VCRUVQX01FVEhPRERFRiAgICBcCi0gICAgeyJNZXNzYWdlQmVlcCIsIChQeUNGdW5jdGlvbil3aW5zb3VuZF9NZXNzYWdlQmVlcCwgTUVUSF9WQVJBUkdTLCB3aW5zb3VuZF9NZXNzYWdlQmVlcF9fZG9jX199LAorICAgIHsiTWVzc2FnZUJlZXAiLCAoUHlDRnVuY3Rpb24pd2luc291bmRfTWVzc2FnZUJlZXAsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCB3aW5zb3VuZF9NZXNzYWdlQmVlcF9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotd2luc291bmRfTWVzc2FnZUJlZXBfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnQgeCk7Cit3aW5zb3VuZF9NZXNzYWdlQmVlcF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludCB0eXBlKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLXdpbnNvdW5kX01lc3NhZ2VCZWVwKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzKQord2luc291bmRfTWVzc2FnZUJlZXAoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgaW50IHggPSBNQl9PSzsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJ0eXBlIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifGk6TWVzc2FnZUJlZXAiLCBfa2V5d29yZHMsIDB9OworICAgIGludCB0eXBlID0gTUJfT0s7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOk1lc3NhZ2VCZWVwIiwKLSAgICAgICAgJngpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnR5cGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICByZXR1cm5fdmFsdWUgPSB3aW5zb3VuZF9NZXNzYWdlQmVlcF9pbXBsKG1vZHVsZSwgeCk7CisgICAgfQorICAgIHJldHVybl92YWx1ZSA9IHdpbnNvdW5kX01lc3NhZ2VCZWVwX2ltcGwobW9kdWxlLCB0eXBlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWMwYjI5MGRhZjIzMzBkYzkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQwYjNkM2VmMmZhZWZiMTUgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvUEMvY29uZmlnLmMgYi9QQy9jb25maWcuYwppbmRleCA2NmJmNDU4Li40M2Q5ZTIwIDEwMDY0NAotLS0gYS9QQy9jb25maWcuYworKysgYi9QQy9jb25maWcuYwpAQCAtMjMsNiArMjMsOCBAQAogZXh0ZXJuIFB5T2JqZWN0KiBQeUluaXRfX3NoYTEodm9pZCk7CiBleHRlcm4gUHlPYmplY3QqIFB5SW5pdF9fc2hhMjU2KHZvaWQpOwogZXh0ZXJuIFB5T2JqZWN0KiBQeUluaXRfX3NoYTUxMih2b2lkKTsKK2V4dGVybiBQeU9iamVjdCogUHlJbml0X19zaGEzKHZvaWQpOworZXh0ZXJuIFB5T2JqZWN0KiBQeUluaXRfX2JsYWtlMih2b2lkKTsKIGV4dGVybiBQeU9iamVjdCogUHlJbml0X3RpbWUodm9pZCk7CiBleHRlcm4gUHlPYmplY3QqIFB5SW5pdF9fdGhyZWFkKHZvaWQpOwogI2lmZGVmIFdJTjMyCkBAIC05Niw2ICs5OCw4IEBACiAgICAgeyJfc2hhMSIsIFB5SW5pdF9fc2hhMX0sCiAgICAgeyJfc2hhMjU2IiwgUHlJbml0X19zaGEyNTZ9LAogICAgIHsiX3NoYTUxMiIsIFB5SW5pdF9fc2hhNTEyfSwKKyAgICB7Il9zaGEzIiwgUHlJbml0X19zaGEzfSwKKyAgICB7Il9ibGFrZTIiLCBQeUluaXRfX2JsYWtlMn0sCiAgICAgeyJ0aW1lIiwgUHlJbml0X3RpbWV9LAogI2lmZGVmIFdJVEhfVEhSRUFECiAgICAgeyJfdGhyZWFkIiwgUHlJbml0X190aHJlYWR9LApkaWZmIC0tZ2l0IGEvUEMvZ2V0cGF0aHAuYyBiL1BDL2dldHBhdGhwLmMKaW5kZXggYzdkZGYxZS4uNWRmOWQ3ZCAxMDA2NDQKLS0tIGEvUEMvZ2V0cGF0aHAuYworKysgYi9QQy9nZXRwYXRocC5jCkBAIC02LDcgKzYsOCBAQAogICAgUEFUSCBSVUxFUyBGT1IgV0lORE9XUzoKICAgIFRoaXMgZGVzY3JpYmVzIGhvdyBzeXMucGF0aCBpcyBmb3JtZWQgb24gV2luZG93cy4gIEl0IGRlc2NyaWJlcyB0aGUKICAgIGZ1bmN0aW9uYWxpdHksIG5vdCB0aGUgaW1wbGVtZW50YXRpb24gKGllLCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlc2UKLSAgIGFyZSBhY3R1YWxseSBmZXRjaGVkIGlzIGRpZmZlcmVudCkKKyAgIGFyZSBhY3R1YWxseSBmZXRjaGVkIGlzIGRpZmZlcmVudCkuIFRoZSBwcmVzZW5jZSBvZiBhIHN5cy5wYXRoIGZpbGUKKyAgIGFsb25nc2lkZSB0aGUgcHJvZ3JhbSBvdmVycmlkZXMgdGhlc2UgcnVsZXMgLSBzZWUgYmVsb3cuCiAKICAgICogUHl0aG9uIGFsd2F5cyBhZGRzIGFuIGVtcHR5IGVudHJ5IGF0IHRoZSBzdGFydCwgd2hpY2ggY29ycmVzcG9uZHMKICAgICAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgpAQCAtMzYsNiArMzcsMTIgQEAKICAgICAgdXNlZCAoZWcuIC5cTGliOy5ccGxhdC13aW4sIGV0YykKIAogCisgICBJZiBhIHN5cy5wYXRoIGZpbGUgZXhpc3RzIGFkamFjZW50IHRvIHB5dGhvbi5leGUsIGl0IG11c3QgY29udGFpbiBhCisgICBsaXN0IG9mIHBhdGhzIHRvIGFkZCB0byBzeXMucGF0aCwgb25lIHBlciBsaW5lIChsaWtlIGEgLnB0aCBmaWxlIGJ1dCB3aXRob3V0CisgICB0aGUgYWJpbGl0eSB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlKS4gRWFjaCBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZQorICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpbGUuIE5vIG90aGVyIHBhdGhzIGFyZSBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGgsCisgICBhbmQgdGhlIHJlZ2lzdHJ5IGZpbmRlciBpcyBub3QgZW5hYmxlZC4KKwogICBUaGUgZW5kIHJlc3VsdCBvZiBhbGwgdGhpcyBpczoKICAgKiBXaGVuIHJ1bm5pbmcgcHl0aG9uLmV4ZSwgb3IgYW55IG90aGVyIC5leGUgaW4gdGhlIG1haW4gUHl0aG9uIGRpcmVjdG9yeQogICAgIChlaXRoZXIgYW4gaW5zdGFsbGVkIHZlcnNpb24sIG9yIGRpcmVjdGx5IGZyb20gdGhlIFBDYnVpbGQgZGlyZWN0b3J5KSwKQEAgLTUyLDcgKzU5LDEwIEBACiAgICAgc29tZSBkZWZhdWx0LCBidXQgcmVsYXRpdmUsIHBhdGhzLgogCiAgICogQW4gZW1iZWRkaW5nIGFwcGxpY2F0aW9uIGNhbiB1c2UgUHlfU2V0UGF0aCgpIHRvIG92ZXJyaWRlIGFsbCBvZgotICAgIHRoZXNlIGF1dGhvbWF0aWMgcGF0aCBjb21wdXRhdGlvbnMuCisgICAgdGhlc2UgYXV0b21hdGljIHBhdGggY29tcHV0YXRpb25zLgorCisgICogQW4gaXNvbGF0aW9uIGluc3RhbGwgb2YgUHl0aG9uIGNhbiBkaXNhYmxlIGFsbCBpbXBsaWNpdCBwYXRocyBieQorICAgIHByb3ZpZGluZyBhIHN5cy5wYXRoIGZpbGUuCiAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNjEsMTAgKzcxLDEzIEBACiAjaW5jbHVkZSAib3NkZWZzLmgiCiAjaW5jbHVkZSA8d2NoYXIuaD4KIAotI2lmZGVmIE1TX1dJTkRPV1MKLSNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaWZuZGVmIE1TX1dJTkRPV1MKKyNlcnJvciBnZXRwYXRocC5jIHNob3VsZCBvbmx5IGJlIGJ1aWx0IG9uIFdpbmRvd3MKICNlbmRpZgogCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPFNobHdhcGkuaD4KKwogI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNlbmRpZiAvKiBIQVZFX1NZU19UWVBFU19IICovCkBAIC0xMzUsNyArMTQ4LDcgQEAKIHN0YXRpYyBpbnQKIGlzbW9kdWxlKHdjaGFyX3QgKmZpbGVuYW1lLCBpbnQgdXBkYXRlX2ZpbGVuYW1lKSAvKiBJcyBtb2R1bGUgLS0gY2hlY2sgZm9yIC5weWMvLnB5byB0b28gKi8KIHsKLSAgICBpbnQgbjsKKyAgICBzaXplX3QgbjsKIAogICAgIGlmIChleGlzdHMoZmlsZW5hbWUpKQogICAgICAgICByZXR1cm4gMTsKQEAgLTE2MywyNCArMTc2LDMwIEBACiAgICB0aGFuIE1BWFBBVEhMRU4gY2hhcmFjdGVycyBhdCBleGl0LiAgSWYgc3R1ZmYgaXMgdG9vIGxvbmcsIG9ubHkgYXMgbXVjaCBvZgogICAgc3R1ZmYgYXMgZml0cyB3aWxsIGJlIGFwcGVuZGVkLgogKi8KKworc3RhdGljIGludCBfUGF0aENjaENvbWJpbmVFeF9Jbml0aWFsaXplZCA9IDA7Cit0eXBlZGVmIEhSRVNVTFQoX19zdGRjYWxsICpQUGF0aENjaENvbWJpbmVFeCkoUFdTVFIgcHN6UGF0aE91dCwgc2l6ZV90IGNjaFBhdGhPdXQsIFBDV1NUUiBwc3pQYXRoSW4sIFBDV1NUUiBwc3pNb3JlLCB1bnNpZ25lZCBsb25nIGR3RmxhZ3MpOworc3RhdGljIFBQYXRoQ2NoQ29tYmluZUV4IF9QYXRoQ2NoQ29tYmluZUV4OworCiBzdGF0aWMgdm9pZAogam9pbih3Y2hhcl90ICpidWZmZXIsIGNvbnN0IHdjaGFyX3QgKnN0dWZmKQogewotICAgIHNpemVfdCBuOwotICAgIGlmIChpc19zZXAoc3R1ZmZbMF0pIHx8Ci0gICAgICAgICh3Y3NubGVuX3Moc3R1ZmYsIDQpID49IDMgJiYgc3R1ZmZbMV0gPT0gJzonICYmIGlzX3NlcChzdHVmZlsyXSkpKSB7Ci0gICAgICAgIGlmICh3Y3NjcHlfcyhidWZmZXIsIE1BWFBBVEhMRU4rMSwgc3R1ZmYpICE9IDApCi0gICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJidWZmZXIgb3ZlcmZsb3cgaW4gZ2V0cGF0aHAuYydzIGpvaW4oKSIpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKF9QYXRoQ2NoQ29tYmluZUV4X0luaXRpYWxpemVkID09IDApIHsKKyAgICAgICAgSE1PRFVMRSBwYXRoYXBpID0gTG9hZExpYnJhcnlXKEwiYXBpLW1zLXdpbi1jb3JlLXBhdGgtbDEtMS0wLmRsbCIpOworICAgICAgICBpZiAocGF0aGFwaSkKKyAgICAgICAgICAgIF9QYXRoQ2NoQ29tYmluZUV4ID0gKFBQYXRoQ2NoQ29tYmluZUV4KUdldFByb2NBZGRyZXNzKHBhdGhhcGksICJQYXRoQ2NoQ29tYmluZUV4Iik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9QYXRoQ2NoQ29tYmluZUV4ID0gTlVMTDsKKyAgICAgICAgX1BhdGhDY2hDb21iaW5lRXhfSW5pdGlhbGl6ZWQgPSAxOwogICAgIH0KIAotICAgIG4gPSB3Y3NubGVuX3MoYnVmZmVyLCBNQVhQQVRITEVOKzEpOwotICAgIGlmIChuID4gMCAmJiAhaXNfc2VwKGJ1ZmZlcltuIC0gMV0pICYmIG4gPCBNQVhQQVRITEVOKSB7Ci0gICAgICAgIGJ1ZmZlcltuXSA9IFNFUDsKLSAgICAgICAgYnVmZmVyW24gKyAxXSA9ICdcMCc7CisgICAgaWYgKF9QYXRoQ2NoQ29tYmluZUV4KSB7CisgICAgICAgIGlmIChGQUlMRUQoX1BhdGhDY2hDb21iaW5lRXgoYnVmZmVyLCBNQVhQQVRITEVOKzEsIGJ1ZmZlciwgc3R1ZmYsIDApKSkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImJ1ZmZlciBvdmVyZmxvdyBpbiBnZXRwYXRocC5jJ3Mgam9pbigpIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFQYXRoQ29tYmluZVcoYnVmZmVyLCBOVUxMLCBzdHVmZikpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJidWZmZXIgb3ZlcmZsb3cgaW4gZ2V0cGF0aHAuYydzIGpvaW4oKSIpOwogICAgIH0KLSAgICBpZiAod2NzY2F0X3MoYnVmZmVyLCBNQVhQQVRITEVOKzEsIHN0dWZmKSAhPSAwKQotICAgICAgICBQeV9GYXRhbEVycm9yKCJidWZmZXIgb3ZlcmZsb3cgaW4gZ2V0cGF0aHAuYydzIGpvaW4oKSIpOwogfQogCiAvKiBnb3RsYW5kbWFyayBvbmx5IGNhbGxlZCBieSBzZWFyY2hfZm9yX3ByZWZpeCwgd2hpY2ggZW5zdXJlcwpAQCAtMjE0LDcgKzIzMyw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBNU19XSU5ET1dTCiAjaWZkZWYgUHlfRU5BQkxFX1NIQVJFRAogCiAvKiBhIHN0cmluZyBsb2FkZWQgZnJvbSB0aGUgRExMIGF0IHN0YXJ0dXAuKi8KQEAgLTM2OSw3ICszODcsNiBAQAogICAgIHJldHVybiByZXR2YWw7CiB9CiAjZW5kaWYgLyogUHlfRU5BQkxFX1NIQVJFRCAqLwotI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogc3RhdGljIHZvaWQKIGdldF9wcm9ncGF0aCh2b2lkKQpAQCAtMzc4LDcgKzM5NSw2IEBACiAgICAgd2NoYXJfdCAqcGF0aCA9IF93Z2V0ZW52KEwiUEFUSCIpOwogICAgIHdjaGFyX3QgKnByb2cgPSBQeV9HZXRQcm9ncmFtTmFtZSgpOwogCi0jaWZkZWYgTVNfV0lORE9XUwogI2lmZGVmIFB5X0VOQUJMRV9TSEFSRUQKICAgICBleHRlcm4gSEFORExFIFB5V2luX0RMTGhNb2R1bGU7CiAgICAgLyogc3RhdGljIGluaXQgb2YgcHJvZ3BhdGggZW5zdXJlcyBmaW5hbCBjaGFyIHJlbWFpbnMgXDAgKi8KQEAgLTM5MCw3ICs0MDYsNiBAQAogI2VuZGlmCiAgICAgaWYgKEdldE1vZHVsZUZpbGVOYW1lVyhOVUxMLCBwcm9ncGF0aCwgTUFYUEFUSExFTikpCiAgICAgICAgIHJldHVybjsKLSNlbmRpZgogICAgIGlmIChwcm9nID09IE5VTEwgfHwgKnByb2cgPT0gJ1wwJykKICAgICAgICAgcHJvZyA9IEwicHl0aG9uIjsKIApAQCAtNDgzLDYgKzQ5OCw2NyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQKK3JlYWRfc3lzX3BhdGhfZmlsZShjb25zdCB3Y2hhcl90ICpwYXRoLCBjb25zdCB3Y2hhcl90ICpwcmVmaXgpCit7CisgICAgRklMRSAqc3BfZmlsZSA9IF9QeV93Zm9wZW4ocGF0aCwgTCJyIik7CisgICAgaWYgKHNwX2ZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgc2l6ZV90IGJ1ZnNpeiA9IE1BWFBBVEhMRU47CisgICAgc2l6ZV90IHByZWZpeGxlbiA9IHdjc2xlbihwcmVmaXgpOworCisgICAgd2NoYXJfdCAqYnVmID0gKHdjaGFyX3QqKVB5TWVtX1Jhd01hbGxvYyhidWZzaXogKiBzaXplb2Yod2NoYXJfdCkpOworICAgIGJ1ZlswXSA9ICdcMCc7CisKKyAgICB3aGlsZSAoIWZlb2Yoc3BfZmlsZSkpIHsKKyAgICAgICAgY2hhciBsaW5lW01BWFBBVEhMRU4gKyAxXTsKKyAgICAgICAgY2hhciAqcCA9IGZnZXRzKGxpbmUsIE1BWFBBVEhMRU4gKyAxLCBzcF9maWxlKTsKKyAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgRFdPUkQgbiA9IHN0cmxlbihsaW5lKTsKKyAgICAgICAgaWYgKG4gPT0gMCB8fCBwW24gLSAxXSAhPSAnXG4nKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChuID4gMiAmJiBwW24gLSAxXSA9PSAnXHInKQorICAgICAgICAgICAgLS1uOworCisgICAgICAgIERXT1JEIHduID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAwLCBsaW5lLCBuIC0gMSwgTlVMTCwgMCk7CisgICAgICAgIHdjaGFyX3QgKndsaW5lID0gKHdjaGFyX3QqKVB5TWVtX1Jhd01hbGxvYygod24gKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgICAgIHduID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAwLCBsaW5lLCBuIC0gMSwgd2xpbmUsIHduKTsKKyAgICAgICAgd2xpbmVbd25dID0gJ1wwJzsKKworICAgICAgICB3aGlsZSAod24gKyBwcmVmaXhsZW4gKyA0ID4gYnVmc2l6KSB7CisgICAgICAgICAgICBidWZzaXogKz0gTUFYUEFUSExFTjsKKyAgICAgICAgICAgIGJ1ZiA9ICh3Y2hhcl90KilQeU1lbV9SYXdSZWFsbG9jKGJ1ZiwgKGJ1ZnNpeiArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICAgICAgICAgIGlmICghYnVmKSB7CisgICAgICAgICAgICAgICAgUHlNZW1fUmF3RnJlZSh3bGluZSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChidWZbMF0pCisgICAgICAgICAgICB3Y3NjYXRfcyhidWYsIGJ1ZnNpeiwgTCI7Iik7CisgICAgICAgIHdjaGFyX3QgKmIgPSAmYnVmW3djc2xlbihidWYpXTsKKyAgICAgICAgCisgICAgICAgIHdjc2NhdF9zKGJ1ZiwgYnVmc2l6LCBwcmVmaXgpOworICAgICAgICBqb2luKGIsIHdsaW5lKTsKKworICAgICAgICBQeU1lbV9SYXdGcmVlKHdsaW5lKTsKKyAgICB9CisKKyAgICBtb2R1bGVfc2VhcmNoX3BhdGggPSBidWY7CisKKyAgICBmY2xvc2Uoc3BfZmlsZSk7CisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIFB5TWVtX1Jhd0ZyZWUoYnVmKTsKKyAgICBmY2xvc2Uoc3BfZmlsZSk7CisgICAgcmV0dXJuIC0xOworfQorCisKIHN0YXRpYyB2b2lkCiBjYWxjdWxhdGVfcGF0aCh2b2lkKQogewpAQCAtNDkyLDMyICs1NjgsMzQgQEAKICAgICB3Y2hhcl90ICpweXRob25ob21lID0gUHlfR2V0UHl0aG9uSG9tZSgpOwogICAgIHdjaGFyX3QgKmVudnBhdGggPSBOVUxMOwogCi0jaWZkZWYgTVNfV0lORE9XUwogICAgIGludCBza2lwaG9tZSwgc2tpcGRlZmF1bHQ7CiAgICAgd2NoYXJfdCAqbWFjaGluZXBhdGggPSBOVUxMOwogICAgIHdjaGFyX3QgKnVzZXJwYXRoID0gTlVMTDsKICAgICB3Y2hhcl90IHppcF9wYXRoW01BWFBBVEhMRU4rMV07Ci0gICAgaW50IGFwcGxvY2FsID0gMDsKIAogICAgIGlmICghUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnKSB7CiAgICAgICAgIGVudnBhdGggPSBfd2dldGVudihMIlBZVEhPTlBBVEgiKTsKICAgICB9Ci0jZWxzZQotICAgIGNoYXIgKl9lbnZwYXRoID0gUHlfR0VURU5WKCJQWVRIT05QQVRIIik7Ci0gICAgd2NoYXJfdCB3ZW52cGF0aFtNQVhQQVRITEVOKzFdOwotICAgIGlmIChfZW52cGF0aCkgewotICAgICAgICBzaXplX3QgciA9IG1ic3Rvd2NzKHdlbnZwYXRoLCBfZW52cGF0aCwgTUFYUEFUSExFTisxKTsKLSAgICAgICAgZW52cGF0aCA9IHdlbnZwYXRoOwotICAgICAgICBpZiAociA9PSAoc2l6ZV90KS0xIHx8IHIgPj0gTUFYUEFUSExFTikKLSAgICAgICAgICAgIGVudnBhdGggPSBOVUxMOwotICAgIH0KLSNlbmRpZgogCiAgICAgZ2V0X3Byb2dwYXRoKCk7CiAgICAgLyogcHJvZ3BhdGggZ3VhcmFudGVlZCBcMCB0ZXJtaW5hdGVkIGluIE1BWFBBVEgrMSBieXRlcy4gKi8KICAgICB3Y3NjcHlfcyhhcmd2MF9wYXRoLCBNQVhQQVRITEVOKzEsIHByb2dwYXRoKTsKICAgICByZWR1Y2UoYXJndjBfcGF0aCk7CiAKKyAgICAvKiBTZWFyY2ggZm9yIGEgc3lzLnBhdGggZmlsZSAqLworICAgIHsKKyAgICAgICAgd2NoYXJfdCBzcGJ1ZmZlcltNQVhQQVRITEVOKzFdOworCisgICAgICAgIHdjc2NweV9zKHNwYnVmZmVyLCBNQVhQQVRITEVOKzEsIGFyZ3YwX3BhdGgpOworICAgICAgICBqb2luKHNwYnVmZmVyLCBMInN5cy5wYXRoIik7CisgICAgICAgIGlmIChleGlzdHMoc3BidWZmZXIpICYmIHJlYWRfc3lzX3BhdGhfZmlsZShzcGJ1ZmZlciwgYXJndjBfcGF0aCkgPT0gMCkgeworICAgICAgICAgICAgd2NzY3B5X3MocHJlZml4LCBNQVhQQVRITEVOICsgMSwgYXJndjBfcGF0aCk7CisgICAgICAgICAgICBQeV9Jc29sYXRlZEZsYWcgPSAxOworICAgICAgICAgICAgUHlfTm9TaXRlRmxhZyA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiBTZWFyY2ggZm9yIGFuIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gZmlsZSwgZmlyc3QgaW4gdGhlCiAgICAgICAgZXhlY3V0YWJsZSdzIGRpcmVjdG9yeSBhbmQgdGhlbiBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KICAgICAgICBJZiBmb3VuZCwgb3BlbiBpdCBmb3IgdXNlIHdoZW4gc2VhcmNoaW5nIGZvciBwcmVmaXhlcy4KQEAgLTU0MywxNyArNjIxLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoZW52X2ZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgLyogTG9vayBmb3IgYW4gJ2FwcGxvY2FsJyB2YXJpYWJsZSBhbmQsIGlmIHRydWUsIGlnbm9yZSBhbGwgcmVnaXN0cnkKLSAgICAgICAgICAgICAqIGtleXMgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcywgYnV0IHJldGFpbiB0aGUgZGVmYXVsdCBwYXRocwotICAgICAgICAgICAgICogKERMTHMsIExpYikgYW5kIHRoZSB6aXAgZmlsZS4gU2V0dGluZyBweXRob25ob21lIGhlcmUgc3VwcHJlc3NlcwotICAgICAgICAgICAgICogdGhlIHNlYXJjaCBmb3IgTEFORE1BUksgYmVsb3cgYW5kIG92ZXJyaWRlcyAlUFlUSE9OSE9NRSUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChmaW5kX2Vudl9jb25maWdfdmFsdWUoZW52X2ZpbGUsIEwiYXBwbG9jYWwiLCB0bXBidWZmZXIpICYmCi0gICAgICAgICAgICAgICAgKGFwcGxvY2FsID0gKHdjc2ljbXAodG1wYnVmZmVyLCBMInRydWUiKSA9PSAwKSkpIHsKLSAgICAgICAgICAgICAgICBlbnZwYXRoID0gTlVMTDsKLSAgICAgICAgICAgICAgICBweXRob25ob21lID0gYXJndjBfcGF0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAogICAgICAgICAgICAgLyogTG9vayBmb3IgYSAnaG9tZScgdmFyaWFibGUgYW5kIHNldCBhcmd2MF9wYXRoIHRvIGl0LCBpZiBmb3VuZCAqLwogICAgICAgICAgICAgaWYgKGZpbmRfZW52X2NvbmZpZ192YWx1ZShlbnZfZmlsZSwgTCJob21lIiwgdG1wYnVmZmVyKSkgewogICAgICAgICAgICAgICAgIHdjc2NweV9zKGFyZ3YwX3BhdGgsIE1BWFBBVEhMRU4rMSwgdG1wYnVmZmVyKTsKQEAgLTU3Niw3ICs2NDMsNiBAQAogICAgICAgICBlbnZwYXRoID0gTlVMTDsKIAogCi0jaWZkZWYgTVNfV0lORE9XUwogICAgIC8qIENhbGN1bGF0ZSB6aXAgYXJjaGl2ZSBwYXRoIGZyb20gRExMIG9yIGV4ZSBwYXRoICovCiAgICAgaWYgKHdjc2NweV9zKHppcF9wYXRoLCBNQVhQQVRITEVOKzEsIGRsbHBhdGhbMF0gPyBkbGxwYXRoIDogcHJvZ3BhdGgpKQogICAgICAgICAvKiBleGNlZWRlZCBidWZmZXIgbGVuZ3RoIC0gaWdub3JlIHppcF9wYXRoICovCkBAIC01OTAsMTYgKzY1NiwxMyBAQAogCiAgICAgc2tpcGhvbWUgPSBweXRob25ob21lPT1OVUxMID8gMCA6IDE7CiAjaWZkZWYgUHlfRU5BQkxFX1NIQVJFRAotICAgIGlmICghYXBwbG9jYWwpIHsKLSAgICAgICAgbWFjaGluZXBhdGggPSBnZXRweXRob25yZWdwYXRoKEhLRVlfTE9DQUxfTUFDSElORSwgc2tpcGhvbWUpOwotICAgICAgICB1c2VycGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9DVVJSRU5UX1VTRVIsIHNraXBob21lKTsKLSAgICB9CisgICAgbWFjaGluZXBhdGggPSBnZXRweXRob25yZWdwYXRoKEhLRVlfTE9DQUxfTUFDSElORSwgc2tpcGhvbWUpOworICAgIHVzZXJwYXRoID0gZ2V0cHl0aG9ucmVncGF0aChIS0VZX0NVUlJFTlRfVVNFUiwgc2tpcGhvbWUpOwogI2VuZGlmCiAgICAgLyogV2Ugb25seSB1c2UgdGhlIGRlZmF1bHQgcmVsYXRpdmUgUFlUSE9OUEFUSCBpZiB3ZSBoYXZlbnQKICAgICAgICBhbnl0aGluZyBiZXR0ZXIgdG8gdXNlISAqLwogICAgIHNraXBkZWZhdWx0ID0gZW52cGF0aCE9TlVMTCB8fCBweXRob25ob21lIT1OVUxMIHx8IFwKICAgICAgICAgICAgICAgICAgIG1hY2hpbmVwYXRoIT1OVUxMIHx8IHVzZXJwYXRoIT1OVUxMOwotI2VuZGlmCiAKICAgICAvKiBXZSBuZWVkIHRvIGNvbnN0cnVjdCBhIHBhdGggZnJvbSB0aGUgZm9sbG93aW5nIHBhcnRzLgogICAgICAgICgxKSB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0OwpAQCAtNjEyLDcgKzY3NSw2IEBACiAgICAgICAgRXh0cmEgcnVsZXM6CiAgICAgICAgLSBJZiBQWVRIT05IT01FIGlzIHNldCAoaW4gYW55IHdheSkgaXRlbSAoMykgaXMgaWdub3JlZC4KICAgICAgICAtIElmIHJlZ2lzdHJ5IHZhbHVlcyBhcmUgdXNlZCwgKDQpIGFuZCAoNSkgYXJlIGlnbm9yZWQuCi0gICAgICAgLSBJZiBhcHBsb2NhbCBpcyBzZXQsICgxKSwgKDMpLCBhbmQgcmVnaXN0cnkgdmFsdWVzIGFyZSBpZ25vcmVkCiAgICAgKi8KIAogICAgIC8qIENhbGN1bGF0ZSBzaXplIG9mIHJldHVybiBidWZmZXIgKi8KQEAgLTYyOSwxMyArNjkxLDExIEBACiAgICAgICAgIGJ1ZnN6ID0gMDsKICAgICBidWZzeiArPSB3Y3NsZW4oUFlUSE9OUEFUSCkgKyAxOwogICAgIGJ1ZnN6ICs9IHdjc2xlbihhcmd2MF9wYXRoKSArIDE7Ci0jaWZkZWYgTVNfV0lORE9XUwotICAgIGlmICghYXBwbG9jYWwgJiYgdXNlcnBhdGgpCisgICAgaWYgKHVzZXJwYXRoKQogICAgICAgICBidWZzeiArPSB3Y3NsZW4odXNlcnBhdGgpICsgMTsKLSAgICBpZiAoIWFwcGxvY2FsICYmIG1hY2hpbmVwYXRoKQorICAgIGlmIChtYWNoaW5lcGF0aCkKICAgICAgICAgYnVmc3ogKz0gd2NzbGVuKG1hY2hpbmVwYXRoKSArIDE7CiAgICAgYnVmc3ogKz0gd2NzbGVuKHppcF9wYXRoKSArIDE7Ci0jZW5kaWYKICAgICBpZiAoZW52cGF0aCAhPSBOVUxMKQogICAgICAgICBidWZzeiArPSB3Y3NsZW4oZW52cGF0aCkgKyAxOwogCkBAIC02NTEsMTAgKzcxMSw4IEBACiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGRlZmF1bHQgc3RhdGljIHBhdGguXG4iKTsKICAgICAgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IFBZVEhPTlBBVEg7CiAgICAgICAgIH0KLSNpZmRlZiBNU19XSU5ET1dTCiAgICAgICAgIFB5TWVtX1Jhd0ZyZWUobWFjaGluZXBhdGgpOwogICAgICAgICBQeU1lbV9SYXdGcmVlKHVzZXJwYXRoKTsKLSNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTY2NCw3ICs3MjIsNiBAQAogICAgICAgICBidWYgPSB3Y3NjaHIoYnVmLCBMJ1wwJyk7CiAgICAgICAgICpidWYrKyA9IERFTElNOwogICAgIH0KLSNpZmRlZiBNU19XSU5ET1dTCiAgICAgaWYgKHppcF9wYXRoWzBdKSB7CiAgICAgICAgIGlmICh3Y3NjcHlfcyhidWYsIGJ1ZnN6IC0gKGJ1ZiAtIG1vZHVsZV9zZWFyY2hfcGF0aCksIHppcF9wYXRoKSkKICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImJ1ZmZlciBvdmVyZmxvdyBpbiBnZXRwYXRocC5jJ3MgY2FsY3VsYXRlX3BhdGgoKSIpOwpAQCAtNjkyLDE1ICs3NDksNyBAQAogICAgICAgICAgICAgYnVmID0gd2NzY2hyKGJ1ZiwgTCdcMCcpOwogICAgICAgICAgICAgKmJ1ZisrID0gREVMSU07CiAgICAgICAgIH0KLSAgICB9Ci0jZWxzZQotICAgIGlmIChweXRob25ob21lID09IE5VTEwpIHsKLSAgICAgICAgd2NzY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7Ci0gICAgICAgIGJ1ZiA9IHdjc2NocihidWYsIEwnXDAnKTsKLSAgICAgICAgKmJ1ZisrID0gREVMSU07Ci0gICAgfQotI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgICB3Y2hhcl90ICpwID0gUFlUSE9OUEFUSDsKICAgICAgICAgd2NoYXJfdCAqcTsKICAgICAgICAgc2l6ZV90IG47CmRpZmYgLS1naXQgYS9QQy9pY29ucy9sYXVuY2hlci5pY25zIGIvUEMvaWNvbnMvbGF1bmNoZXIuaWNucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWE5MTdmCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvbGF1bmNoZXIuaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9sYXVuY2hlci5pY28gYi9QQy9pY29ucy9sYXVuY2hlci5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlM2M2OQotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL2xhdW5jaGVyLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9sYXVuY2hlci5zdmcgYi9QQy9pY29ucy9sYXVuY2hlci5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5MGIwZAotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL2xhdW5jaGVyLnN2ZwpAQCAtMCwwICsxIEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyIDMyIj48c3R5bGU+Lmljb24tY2FudmFzLXRyYW5zcGFyZW50e29wYWNpdHk6MDtmaWxsOiNmNmY2ZjZ9Lmljb24tdnMtb3V0e2ZpbGw6I2Y2ZjZmNn0uaWNvbi13aGl0ZXtmaWxsOiNmZmZ9Lmljb24tdnNvLWJne2ZpbGw6IzY1NjU2NX0uaWNvbi12aXN1YWxzdHVkaW8tb25saW5le2ZpbGw6IzAwN2FjY30uZ3JhcGgtbGlnaHRncmV5e2ZpbGw6I2RmZGZkZn0uc3Qwe2ZpbGw6IzAwNzhkN30uc3Qxe2ZpbGw6I2ZmZn0uc3Qye2ZpbGw6dXJsKCNwYXRoMTk0OF8xXyl9LnN0M3tmaWxsOnVybCgjcGF0aDE5NTBfMV8pfTwvc3R5bGU+PHBhdGggY2xhc3M9Imljb24tY2FudmFzLXRyYW5zcGFyZW50IiBkPSJNMzIgMzJIMFYwaDMydjMyeiIgaWQ9ImNhbnZhcyIvPjxnIGlkPSJpY29uQmciPjxwYXRoIGNsYXNzPSJpY29uLXZpc3VhbHN0dWRpby1vbmxpbmUiIGQ9Ik0zMCA1SDVWM2gyNXYyeiIvPjxwYXRoIGNsYXNzPSJpY29uLXZzby1iZyIgZD0iTTI5Ljk3MiAyNi45NzJINS4wMjlWNWguOTQydjIxLjAyOGgyMy4wNTdWNWguOTQzdjIxLjk3MnoiLz48cGF0aCBjbGFzcz0iaWNvbi12cy1vdXQiIGQ9Ik0yOSA1djIxSDZWNWgyM3oiLz48cGF0aCBjbGFzcz0iaWNvbi13aGl0ZSIgZD0iTTI5LjE0MSA0bC40MjkuNDI5LS4xNC4xNDItLjQzLS40My0uNDMuNDMtLjE0LS4xNDIuNDI5LS40MjktLjQyOS0uNDI5LjE0MS0uMTQyLjQyOS40My40My0uNDMuMTQxLjE0Mi0uNDMuNDI5ek0yNy42IDMuNGgtMS4ydjEuMmgxLjJWMy40em0tMSAuMmguOHYuOGgtLjh2LS44em0tMS4xMzkuOGgtMXYuMmgxdi0uMnoiLz48cGF0aCBjbGFzcz0iZ3JhcGgtbGlnaHRncmV5IiBkPSJNNiA1aDIzdjJINnoiLz48L2c+PGcgaWQ9Imljb25GZyI+PHBhdGggY2xhc3M9InN0MCIgZD0iTTQuNSAyM3Y2Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTExLjQyOSAxMy4wMTlhMTkuODggMTkuODggMCAwIDAgLjA3MS0xLjY0NWMwLTQuMjIzLTEuMzI5LTguMTY1LTMuNTU2LTEwLjU0NUw3LjE3IDBINS44M2wtLjc3NC44MjlDMi44MjkgMy4yMDkgMS41IDcuMTUxIDEuNSAxMS4zNzRjMCAuNDUzLjAyMy45LjA1MyAxLjM0NUMuODg3IDEzLjQ3Mi4zNTcgMTQuNDM4IDAgMTUuNTMzdjYuNjAzTC4yMjkgMjNIM3Y3aDJ2Mmgzdi0xaDJ2LThoMi43NzJsLjM5NC0xLjQ4OGMuMjIyLS44NDIuMzM1LTEuNzE0LjMzNS0yLjU5Mi0uMDAxLTIuNDE5LS44MDMtNC41MzQtMi4wNzItNS45MDF6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTYuNSAyMnY5TTguNSAyM3Y3Ii8+PHBhdGggY2xhc3M9Imljb24tdmlzdWFsc3R1ZGlvLW9ubGluZSIgZD0iTTUgMjlINHYtNmgxdjZ6bTItNkg2djhoMXYtOHptMiAwSDh2N2gxdi03eiIvPjxwYXRoIGNsYXNzPSJpY29uLXZzby1iZyIgZD0iTTEwLjM4MSAxMy4zOGMuMDctLjY1OC4xMTktMS4zMjUuMTE5LTIuMDA2IDAtMy45NzUtMS4yMjktNy42NjItMy4yODYtOS44NjJMNi41Ljc0OGwtLjcxNC43NjNDMy43MjkgMy43MTIgMi41IDcuMzk5IDIuNSAxMS4zNzRjMCAuNjgxLjA0OSAxLjM0OC4xMTkgMi4wMDZDMS4zMzkgMTQuNTIxLjUgMTYuNTUyLjUgMTguOTJjMCAuNzkzLjEwMiAxLjU3OC4zMDIgMi4zMzZMLjk5OSAyMmgxLjk2NmwuMDcyLS45MjJjLjA4MS0xLjA0Ni40NzEtMS45NjYuOTkzLTIuNTAzLjQ4NyAxLjAxOSAxLjA3IDEuOTI5IDEuNzU2IDIuNjYyTDYuNSAyMmwuNzE0LS43NjNjLjY4Ni0uNzMzIDEuMjY5LTEuNjQzIDEuNzU2LTIuNjYyLjUyMi41MzcuOTEyIDEuNDU3Ljk5MyAyLjUwM2wuMDcyLjkyMmgxLjk2NmwuMTk3LS43NDRjLjItLjc1OC4zMDItMS41NDMuMzAyLTIuMzM2IDAtMi4zNjgtLjgzOS00LjM5OS0yLjExOS01LjU0eiIvPjxwYXRoIGNsYXNzPSJpY29uLXZzLW91dCIgZD0iTTMuNjE5IDE3LjYxNWMtLjg1NC42NzItMS40NjQgMS45MTMtMS41NzkgMy4zODVoLS4yNzJhOC4xODQgOC4xODQgMCAwIDEtLjI2OC0yLjA4YzAtMS43MjIuNTA1LTMuMjU5IDEuMjk3LTQuMjcyLjE4NyAxLjA1LjQ2NSAyLjA0NS44MjIgMi45Njd6bTYuNTg1LTIuOTY3YTE2LjE0NSAxNi4xNDUgMCAwIDEtLjgyMiAyLjk2N2MuODU0LjY3MSAxLjQ2NCAxLjkxMyAxLjU3OSAzLjM4NWguMjcyYTguMTg0IDguMTg0IDAgMCAwIC4yNjgtMi4wOGMtLjAwMS0xLjcyMi0uNTA2LTMuMjU5LTEuMjk3LTQuMjcyek0zLjUgMTEuMzc0YzAgMy44MzcgMS4xOTggNy4yIDMgOS4xMjggMS44MDItMS45MjcgMy01LjI5MSAzLTkuMTI4cy0xLjE5OC03LjItMy05LjEyOGMtMS44MDIgMS45MjgtMyA1LjI5MS0zIDkuMTI4eiIvPjxwYXRoIGNsYXNzPSJpY29uLXZpc3VhbHN0dWRpby1vbmxpbmUiIGQ9Ik03LjUgN2ExIDEgMCAxIDEtMiAwIDEgMSAwIDAgMSAyIDB6Ii8+PC9nPjxnIGlkPSJjb2xvckltcG9ydGFuY2UiPjxwYXRoIGNsYXNzPSJpY29uLXdoaXRlIiBkPSJNMzEuNTk2IDIzLjk2MWMtLjM1IDEuMDUzLTEuMDAxIDMuMDE1LTMuMjQ3IDMuMDE1aC0xLjN2MS4zMzdjMCAuOTA1LS4zOTIgMi41MzctMy4wMjEgMy4yOThhOS4yMTMgOS4yMTMgMCAwIDEtMi41OS4zOWMtLjgzIDAtMS42NjgtLjEyOC0yLjU2NC0uMzkyLTEuOTE4LS41NjMtMy4wMTctMS43NjUtMy4wMTctMy4yOTZ2LTEuMzM3aC0xLjE1NWMtMS42OTggMC0yLjk0My0xLjEyOS0zLjQxNi0zLjA5OC0uNDY5LTEuOTQ2LS40NjktMy4xOTUgMC01LjE0MS40NTEtMS44ODEgMS45Ni0zLjA5OCAzLjg0NS0zLjA5OGguNzI2di0xLjMzN2MwLTIuMDA1LjkwNS0yLjk4MiAzLjEyNi0zLjM3NC43MjktLjEzIDEuNTQ5LS4yIDIuMzY3LS4yMDNoLjAwNGMuOTI1IDAgMS43NjEuMDY3IDIuNTYuMjAxIDEuODE2LjMwMyAzLjEzNCAxLjcyMyAzLjEzNCAzLjM3NnYxLjMzN2gxLjNjMS4xNDIgMCAyLjYzNi41MzYgMy4yNyAzLjA5Mi41MTYgMi4wNzMuNTEgMy42MzctLjAyMiA1LjIzeiIvPjxsaW5lYXJHcmFkaWVudCBpZD0icGF0aDE5NDhfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTIyLjIwNSIgeTE9Ii0yODguNjY4IiB4Mj0iNTQwLjkwMiIgeTI9Ii0zMDQuNzU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC41NjI1IDAgMCAtLjU2OCAtMjgyLjI3MiAtMTUxLjY5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNWE5ZmQ0Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzA2OTk4Ii8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBpZD0icGF0aDE5NDhfN18iIGNsYXNzPSJzdDIiIGQ9Ik0yMS4zNTQgMTEuNzI1Yy0uNzg2LjAwNC0xLjUzNy4wNzEtMi4xOTcuMTg4LTEuOTQ2LjM0NC0yLjI5OSAxLjA2My0yLjI5OSAyLjM5djEuNzUzaDQuNTk4di41ODRoLTYuMzI0Yy0xLjMzNiAwLTIuNTA3LjgwMy0yLjg3MyAyLjMzMS0uNDIyIDEuNzUxLS40NDEgMi44NDQgMCA0LjY3My4zMjcgMS4zNjEgMS4xMDcgMi4zMzEgMi40NDQgMi4zMzFoMS41ODF2LTIuMTAxYzAtMS41MTggMS4zMTMtMi44NTcgMi44NzMtMi44NTdoNC41OTNjMS4yNzkgMCAyLjI5OS0xLjA1MyAyLjI5OS0yLjMzN3YtNC4zNzljMC0xLjI0Ni0xLjA1MS0yLjE4Mi0yLjI5OS0yLjM5LS43OS0uMTMtMS42MS0uMTg5LTIuMzk2LS4xODZ6bS0yLjQ4NiAxLjQxYy40NzUgMCAuODYzLjM5NC44NjMuODc5YS44Ny44NyAwIDAgMS0uODYzLjg3NC44NjguODY4IDAgMCAxLS44NjMtLjg3NGMwLS40ODUuMzg2LS44NzkuODYzLS44Nzl6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJwYXRoMTk1MF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1NDguMTMiIHkxPSItMzE0LjQ4OSIgeDI9IjU0MS40NTQiIHkyPSItMzA1LjA0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNTYyNSAwIDAgLS41NjggLTI4Mi4yNzIgLTE1MS42OSkiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZDQzYiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZTg3MyIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggaWQ9InBhdGgxOTUwXzdfIiBjbGFzcz0ic3QzIiBkPSJNMjYuNjIzIDE2LjY0djIuMDQyYzAgMS41ODMtMS4zNDIgMi45MTUtMi44NzMgMi45MTVoLTQuNTkzYy0xLjI1OCAwLTIuMjk5IDEuMDc3LTIuMjk5IDIuMzM3djQuMzc5YzAgMS4yNDYgMS4wODQgMS45NzkgMi4yOTkgMi4zMzcgMS40NTYuNDI4IDIuODUxLjUwNSA0LjU5MyAwIDEuMTU4LS4zMzUgMi4yOTktMS4wMSAyLjI5OS0yLjMzN1YyNi41NmgtNC41OTN2LS41ODRIMjguMzQ4YzEuMzM2IDAgMS44MzQtLjkzMiAyLjI5OS0yLjMzMS40OC0xLjQ0LjQ2LTIuODI2IDAtNC42NzMtLjMzLTEuMzMtLjk2MS0yLjMzMS0yLjI5OS0yLjMzMWgtMS43MjV6bS0yLjU4NCAxMS4wODljLjQ3NyAwIC44NjMuMzkxLjg2My44NzRhLjg3MS44NzEgMCAwIDEtLjg2My44NzkuODcyLjg3MiAwIDAgMS0uODYzLS44NzkuODcuODcgMCAwIDEgLjg2My0uODc0eiIvPjwvZz48L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weS5pY25zIGIvUEMvaWNvbnMvcHkuaWNucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGM0ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHkuaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weS5pY28gYi9QQy9pY29ucy9weS5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4YTc5YgotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL3B5LmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weS5zdmcgYi9QQy9pY29ucy9weS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyNGU4MwotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL3B5LnN2ZwpAQCAtMCwwICsxIEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyIDMyIj48c3R5bGU+Lmljb24tY2FudmFzLXRyYW5zcGFyZW50e29wYWNpdHk6MDtmaWxsOiNmNmY2ZjZ9Lmljb24tdnMtb3V0e2ZpbGw6I2Y2ZjZmNn0uaWNvbi12c28tYmd7ZmlsbDojNjU2NTY1fS5pY29uLXZzby1saWdodGdyZXl7ZmlsbDojYmZiZmJmfS5pY29uLXdoaXRle2ZpbGw6I2ZmZn0uc3Qwe2ZpbGw6dXJsKCNwYXRoMTk0OF8xXyl9LnN0MXtmaWxsOnVybCgjcGF0aDE5NTBfMV8pfTwvc3R5bGU+PHBhdGggY2xhc3M9Imljb24tY2FudmFzLXRyYW5zcGFyZW50IiBkPSJNMzIgMzJIMFYwaDMydjMyeiIgaWQ9ImNhbnZhcyIvPjxnIGlkPSJpY29uQmciPjxwYXRoIGNsYXNzPSJpY29uLXZzLW91dCIgZD0iTTI2IDguMDA5VjI5SDdWM2gxNC4wNTNMMjYgOC4wMDl6Ii8+PHBhdGggY2xhc3M9Imljb24tdnNvLWJnIiBkPSJNMjEuNDcxIDJINnYyOGgyMVY3LjU5OUwyMS40NzEgMnpNMjEgM2guMDUzbDQuOTM5IDVIMjFWM3ptNSAyNkg3VjNoMTN2Nmg2djIweiIvPjwvZz48cGF0aCBjbGFzcz0iaWNvbi12c28tbGlnaHRncmV5IiBkPSJNMTcgN0g5VjZoOHYxem0wIDJIOXYxaDhWOXptNyAzSDl2MWgxNXYtMXptMCAzSDl2MWgxNXYtMXptMCAzSDl2MWgxNXYtMXptMCAzSDl2MWgxNXYtMXptMCAzSDl2MWgxNXYtMXoiIGlkPSJpY29uRmciLz48ZyBpZD0iY29sb3JJbXBvcnRhbmNlIj48cGF0aCBjbGFzcz0iaWNvbi13aGl0ZSIgZD0iTTMxLjY2IDI0LjA2M0MzMS4zMTIgMjUuMTE2IDMwLjY2MSAyNyAyOC40MTMgMjdIMjd2MS4zMTNjMCAuOTA1LS4zMzUgMi41MzctMi45NjUgMy4yOTgtLjkwNC4yNjEtMS42OTQuMzg5LTIuNTMxLjM4OS0uODMgMC0xLjYzLS4xMjgtMi41MjYtLjM5MkMxNy4wNjEgMzEuMDQ1IDE2IDI5Ljg0NCAxNiAyOC4zMTNWMjdoLTEuMjMyYy0xLjY5OSAwLTIuOTQ0LTEuMTQxLTMuNDE2LTMuMTEtLjQ2OS0xLjk0Ni0uNDY5LTMuMDIxIDAtNC45NjcuNDUxLTEuODgxIDEuOTYtMi45MjMgMy44NDUtMi45MjNIMTZ2LTEuNjk3YzAtMi4wMDUuODY2LTIuODQ1IDMuMDg3LTMuMjM4LjcyNy0uMTI4IDEuNTA2LS4wNjUgMi4zMjctLjA2NWguMDAzYy45MjEgMCAxLjcwMy0uMDcgMi41MDQuMDY0IDEuODE4LjMwMiAzLjA3OSAxLjU4NSAzLjA3OSAzLjIzOVYxNmgxLjQxM2MxLjE0MiAwIDIuNjM2LjM1NiAzLjI3IDIuOTEyLjUxNSAyLjA3Mi41MDkgMy41NTktLjAyMyA1LjE1MXoiLz48bGluZWFyR3JhZGllbnQgaWQ9InBhdGgxOTQ4XzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUyMi4zMiIgeTE9Ii0yODguNjY4IiB4Mj0iNTQxLjAxNyIgeTI9Ii0zMDQuNzU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC41NjI1IDAgMCAtLjU2OCAtMjgyLjI3MiAtMTUxLjY5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNWE5ZmQ0Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzA2OTk4Ii8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBpZD0icGF0aDE5NDhfMl8iIGNsYXNzPSJzdDAiIGQ9Ik0yMS40MTkgMTEuNzI1Yy0uNzg2LjAwNC0xLjUzNy4wNzEtMi4xOTcuMTg4LTEuOTQ2LjM0NC0yLjI5OSAxLjA2My0yLjI5OSAyLjM5djEuNzUzaDQuNTk4di41ODRoLTYuMzI0Yy0xLjMzNiAwLTIuNTA3LjgwMy0yLjg3MyAyLjMzMS0uNDIyIDEuNzUxLS40NDEgMi44NDQgMCA0LjY3My4zMjcgMS4zNjEgMS4xMDggMi4zMzEgMi40NDQgMi4zMzFoMS41ODF2LTIuMTAxYzAtMS41MTggMS4zMTMtMi44NTcgMi44NzMtMi44NTdoNC41OTNjMS4yNzggMCAyLjI5OS0xLjA1MyAyLjI5OS0yLjMzN3YtNC4zNzljMC0xLjI0Ni0xLjA1MS0yLjE4Mi0yLjI5OS0yLjM5LS43OS0uMTMtMS42MS0uMTg5LTIuMzk2LS4xODZ6bS0yLjQ4NyAxLjQxYy40NzUgMCAuODYzLjM5NC44NjMuODc5YS44Ny44NyAwIDAgMS0uODYzLjg3NC44NjguODY4IDAgMCAxLS44NjMtLjg3NGMwLS40ODUuMzg3LS44NzkuODYzLS44Nzl6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJwYXRoMTk1MF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1NDguMjQ1IiB5MT0iLTMxNC40ODkiIHgyPSI1NDEuNTY5IiB5Mj0iLTMwNS4wNDMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjU2MjUgMCAwIC0uNTY4IC0yODIuMjcyIC0xNTEuNjkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmQ0M2IiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmU4NzMiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJwYXRoMTk1MF8yXyIgY2xhc3M9InN0MSIgZD0iTTI2LjY4NyAxNi42NHYyLjA0MmMwIDEuNTgzLTEuMzQyIDIuOTE1LTIuODczIDIuOTE1aC00LjU5M2MtMS4yNTggMC0yLjI5OSAxLjA3Ny0yLjI5OSAyLjMzN3Y0LjM3OWMwIDEuMjQ2IDEuMDg0IDEuOTc5IDIuMjk5IDIuMzM3IDEuNDU2LjQyOCAyLjg1MS41MDUgNC41OTMgMCAxLjE1OC0uMzM1IDIuMjk5LTEuMDEgMi4yOTktMi4zMzdWMjYuNTZIMjEuNTJ2LS41ODRIMjguNDEyYzEuMzM2IDAgMS44MzQtLjkzMiAyLjI5OS0yLjMzMS40OC0xLjQ0LjQ2LTIuODI2IDAtNC42NzMtLjMzLTEuMzMtLjk2MS0yLjMzMS0yLjI5OS0yLjMzMWgtMS43MjV6bS0yLjU4MyAxMS4wODljLjQ3NyAwIC44NjMuMzkxLjg2My44NzRhLjg3MS44NzEgMCAwIDEtLjg2My44NzkuODcyLjg3MiAwIDAgMS0uODYzLS44NzljMC0uNDg0LjM4OC0uODc0Ljg2My0uODc0eiIvPjwvZz48L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weWMuaWNucyBiL1BDL2ljb25zL3B5Yy5pY25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGE5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9weWMuaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weWMuaWNvIGIvUEMvaWNvbnMvcHljLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGRkZTgxCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHljLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weWMuc3ZnIGIvUEMvaWNvbnMvcHljLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzNlOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHljLnN2ZwpAQCAtMCwwICsxIEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyIDMyIj48c3R5bGU+Lmljb24tY2FudmFzLXRyYW5zcGFyZW50e29wYWNpdHk6MDtmaWxsOiNmNmY2ZjZ9Lmljb24tdnNvLWJne2ZpbGw6IzY1NjU2NX0uaWNvbi12cy1iZ3tmaWxsOiM0MjQyNDJ9Lmljb24tdnMtZ3JlZW57ZmlsbDojMzkzfS5pY29uLXdoaXRle2ZpbGw6I2ZmZn0uc3Qwe2ZpbGw6dXJsKCNwYXRoMTk0OF8xXyl9LnN0MXtmaWxsOnVybCgjcGF0aDE5NTBfMV8pfTwvc3R5bGU+PHBhdGggY2xhc3M9Imljb24tY2FudmFzLXRyYW5zcGFyZW50IiBkPSJNMzIgMzJIMFYwaDMydjMyeiIgaWQ9ImNhbnZhcyIvPjxnIGlkPSJpY29uQmciPjxwYXRoIGNsYXNzPSJpY29uLXZzLWJnIiBkPSJNMjEuMDUzIDNIN3YyNmgxOVY4LjAwOXoiLz48cGF0aCBjbGFzcz0iaWNvbi12c28tYmciIGQ9Ik0yMS40NzEgMkg2djI4aDIxVjcuNTk5TDIxLjQ3MSAyek0yMSAzaC4wNTNsNC45MzkgNUgyMVYzem01IDI2SDdWM2gxM3Y2aDZ2MjB6Ii8+PC9nPjxwYXRoIGNsYXNzPSJpY29uLXZzLWdyZWVuIiBkPSJNMTAgMTZIOXYtMWgxdjF6bTEuMDExIDVIOXYxaDIuMDMyYTguMzY4IDguMzY4IDAgMCAxLS4wMjEtMXpNMTQgMTBoMlY5aC0ydjF6bS0zLTRIOXYxaDJWNnptMCA2SDl2MWgydi0xem0yLTNIOXYxaDRWOXptNC0zdjFoMVY2aC0xem0tMyA2aC0ydjFoMnYtMXptMS02aC0ydjFoMlY2em0tNCAxMGgxdi0xaC0xdjF6bTQtNHYxaDJ2LTFoLTJ6bS0yIDRoM3YtMWgtM3Yxem0tNCAydjFoM3YtMUg5em0wIDZ2MWgzdi0xSDl6IiBpZD0iaWNvbkZnIi8+PGcgaWQ9ImNvbG9ySW1wb3J0YW5jZSI+PHBhdGggY2xhc3M9Imljb24td2hpdGUiIGQ9Ik0zMS42NiAyNC4wNjNDMzEuMzEyIDI1LjExNiAzMC42NjEgMjcgMjguNDEzIDI3SDI3djEuMzEzYzAgLjkwNS0uMzM1IDIuNTM3LTIuOTY1IDMuMjk4LS45MDQuMjYxLTEuNjk0LjM4OS0yLjUzMS4zODktLjgzIDAtMS42My0uMTI4LTIuNTI2LS4zOTJDMTcuMDYxIDMxLjA0NSAxNiAyOS44NDQgMTYgMjguMzEzVjI3aC0xLjIzMmMtMS42OTkgMC0yLjk0NC0xLjE0MS0zLjQxNi0zLjExLS40NjktMS45NDYtLjQ2OS0zLjAyMSAwLTQuOTY3LjQ1MS0xLjg4MSAxLjk2LTIuOTIzIDMuODQ1LTIuOTIzSDE2di0xLjY5N2MwLTIuMDA1Ljg2Ni0yLjg0NSAzLjA4Ny0zLjIzOC43MjctLjEyOCAxLjUwNi0uMDY1IDIuMzI3LS4wNjVoLjAwM2MuOTIxIDAgMS43MDMtLjA3IDIuNTA0LjA2NCAxLjgxOC4zMDIgMy4wNzkgMS41ODUgMy4wNzkgMy4yMzlWMTZoMS40MTNjMS4xNDIgMCAyLjYzNi4zNTYgMy4yNyAyLjkxMi41MTUgMi4wNzIuNTA5IDMuNTU4LS4wMjMgNS4xNTF6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJwYXRoMTk0OF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1MjIuMzIiIHkxPSItMjg4LjY2OCIgeDI9IjU0MS4wMTciIHkyPSItMzA0Ljc1NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNTYyNSAwIDAgLS41NjggLTI4Mi4yNzIgLTE1MS42OSkiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzVhOWZkNCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzMwNjk5OCIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggaWQ9InBhdGgxOTQ4XzRfIiBjbGFzcz0ic3QwIiBkPSJNMjEuNDE5IDExLjcyNWMtLjc4Ni4wMDQtMS41MzcuMDcxLTIuMTk3LjE4OC0xLjk0Ni4zNDQtMi4yOTkgMS4wNjMtMi4yOTkgMi4zOXYxLjc1M2g0LjU5OHYuNTg0aC02LjMyNGMtMS4zMzYgMC0yLjUwNy44MDMtMi44NzMgMi4zMzEtLjQyMiAxLjc1MS0uNDQxIDIuODQ0IDAgNC42NzMuMzI3IDEuMzYxIDEuMTA4IDIuMzMxIDIuNDQ0IDIuMzMxaDEuNTgxdi0yLjEwMWMwLTEuNTE4IDEuMzEzLTIuODU3IDIuODczLTIuODU3aDQuNTkzYzEuMjc4IDAgMi4yOTktMS4wNTMgMi4yOTktMi4zMzd2LTQuMzc5YzAtMS4yNDYtMS4wNTEtMi4xODItMi4yOTktMi4zOS0uNzktLjEzLTEuNjEtLjE4OS0yLjM5Ni0uMTg2em0tMi40ODcgMS40MWMuNDc1IDAgLjg2My4zOTQuODYzLjg3OWEuODcuODcgMCAwIDEtLjg2My44NzQuODY4Ljg2OCAwIDAgMS0uODYzLS44NzRjMC0uNDg1LjM4Ny0uODc5Ljg2My0uODc5eiIvPjxsaW5lYXJHcmFkaWVudCBpZD0icGF0aDE5NTBfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTQ4LjI0NSIgeTE9Ii0zMTQuNDg5IiB4Mj0iNTQxLjU2OSIgeTI9Ii0zMDUuMDQzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC41NjI1IDAgMCAtLjU2OCAtMjgyLjI3MiAtMTUxLjY5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZkNDNiIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZlODczIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBpZD0icGF0aDE5NTBfNF8iIGNsYXNzPSJzdDEiIGQ9Ik0yNi42ODcgMTYuNjR2Mi4wNDJjMCAxLjU4My0xLjM0MiAyLjkxNS0yLjg3MyAyLjkxNWgtNC41OTNjLTEuMjU4IDAtMi4yOTkgMS4wNzctMi4yOTkgMi4zMzd2NC4zNzljMCAxLjI0NiAxLjA4NCAxLjk3OSAyLjI5OSAyLjMzNyAxLjQ1Ni40MjggMi44NTEuNTA1IDQuNTkzIDAgMS4xNTgtLjMzNSAyLjI5OS0xLjAxIDIuMjk5LTIuMzM3VjI2LjU2SDIxLjUydi0uNTg0SDI4LjQxMmMxLjMzNiAwIDEuODM0LS45MzIgMi4yOTktMi4zMzEuNDgtMS40NC40Ni0yLjgyNiAwLTQuNjczLS4zMy0xLjMzLS45NjEtMi4zMzEtMi4yOTktMi4zMzFoLTEuNzI1em0tMi41ODMgMTEuMDg5Yy40NzcgMCAuODYzLjM5MS44NjMuODc0YS44NzEuODcxIDAgMCAxLS44NjMuODc5Ljg3Mi44NzIgMCAwIDEtLjg2My0uODc5YzAtLjQ4NC4zODgtLjg3NC44NjMtLjg3NHoiLz48L2c+PC9zdmc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUEMvaWNvbnMvcHlkLmljbnMgYi9QQy9pY29ucy9weWQuaWNucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDNkMjRlCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHlkLmljbnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvUEMvaWNvbnMvcHlkLmljbyBiL1BDL2ljb25zL3B5ZC5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2Y2I2MAotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL3B5ZC5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvUEMvaWNvbnMvcHlkLnN2ZyBiL1BDL2ljb25zL3B5ZC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlZmY2YQotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL3B5ZC5zdmcKQEAgLTAsMCArMSBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PHN0eWxlPi5pY29uLWNhbnZhcy10cmFuc3BhcmVudHtvcGFjaXR5OjA7ZmlsbDojZjZmNmY2fS5pY29uLXZzby1iZ3tmaWxsOiM2NTY1NjV9Lmljb24tdnMtb3V0e2ZpbGw6I2Y2ZjZmNn0uaWNvbi1mMTItaG92ZXItYmd7ZmlsbDojZDllYmY3fS5pY29uLWYxMi1sdGdyZXktZGlzYWJsZWR7ZmlsbDojYWJhYmFjfS5pY29uLXdoaXRle2ZpbGw6I2ZmZn0uc3Qwe2ZpbGw6IzljYTJhN30uc3Qxe2ZpbGw6dXJsKCNwYXRoMTk0OF8xXyl9LnN0MntmaWxsOnVybCgjcGF0aDE5NTBfMV8pfTwvc3R5bGU+PHBhdGggY2xhc3M9Imljb24tY2FudmFzLXRyYW5zcGFyZW50IiBkPSJNMzIgMzJIMFYwaDMydjMyeiIgaWQ9ImNhbnZhcyIvPjxnIGlkPSJpY29uQmciPjxwYXRoIGNsYXNzPSJpY29uLXZzLW91dCIgZD0iTTIxLjA1MyAzSDd2MjZoMTlWOC4wMDl6Ii8+PHBhdGggY2xhc3M9Imljb24tdnNvLWJnIiBkPSJNMjEuNDcxIDJINnYyOGgyMVY3LjU5OUwyMS40NzEgMnpNMjEgM2guMDUzbDQuOTM5IDVIMjFWM3ptNSAyNkg3VjNoMTN2Nmg2djIweiIvPjwvZz48ZyBpZD0iaWNvbkZnIj48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTMuNzg0IDE3LjcwNWMtMS4yOTYgMC0yLjM1LTEuMDU0LTIuMzUtMi4zNXMxLjA1NC0yLjM1IDIuMzUtMi4zNSAyLjM1IDEuMDU0IDIuMzUgMi4zNS0xLjA1NCAyLjM1LTIuMzUgMi4zNXptMC00LjVjLTEuMTg2IDAtMi4xNS45NjQtMi4xNSAyLjE1cy45NjQgMi4xNTEgMi4xNSAyLjE1MSAyLjE1LS45NjUgMi4xNS0yLjE1MS0uOTY0LTIuMTUtMi4xNS0yLjE1eiIvPjxwYXRoIGNsYXNzPSJpY29uLWYxMi1ob3Zlci1iZyIgZD0iTTE4LjA1IDE2LjEyMmMuMDE2LS4wNjkuMDMxLS4xMzkuMDQzLS4yMDlsMS4zNzYtLjYxOC0uMTAzLTEuMDE1LTEuNDctLjMzYy0uMDI1LS4wNjgtLjA1Ni0uMTM0LS4wODYtLjE5OWwtLjAyNi0uMDU2Ljg5Mi0xLjIzNi0uNTk1LS44MjctMS40NS40NTNjLS4wNjktLjA2MS0uMTQxLS4xMTgtLjIxMy0uMTc1bC4xNTEtMS41MTEtLjkyOS0uNDE4LTEuMDMyIDEuMTIxLS4wNTYtLjAxM2EzLjA4OSAzLjA4OSAwIDAgMC0uMjE3LS4wNDVsLS42MTgtMS4zNzQtMS4wMTUuMTA0LS4zMjkgMS40NzJjLS4wNDkuMDE5LS4wOTYuMDQtLjE0My4wNjNsLS4wNTYuMDI1LTEuMjI1LS45MDctLjgzNS41ODYuNDM1IDEuNDU3Yy0uMDYuMDY3LS4xMjMuMTM4LS4xODIuMjEybC0xLjUwNi0uMTcyLS40MjkuOTI1TDkuNTQgMTQuNDhsLS4wMDUuMDI0YTQuMTI3IDQuMTI3IDAgMCAwLS4wNTEuMjQ2bC0xLjM4Ny42MDYuMDkyIDEuMDE1IDEuNDYzLjM0NmMuMDI0LjA2Ny4wNTUuMTMyLjA4NC4xOTRsLjAzLjA2Ny0uODYgMS4xNy0uMDQyLjA1OS41ODguODMyIDEuNDU2LS40NGMuMDcuMDYzLjEzOC4xMjIuMjA5LjE3OGwtLjE2NyAxLjUwOC45MjYuNDI3TDEyLjkyIDE5LjZsLjA0OC4wMWMuMDc0LjAxNy4xNDkuMDM0LjIyNi4wNDZsLjYwOSAxLjM4NSAxLjAxNS0uMDk1LjM0Mi0xLjQ2NmMuMDc1LS4wMjcuMTQ3LS4wNjEuMjE2LS4wOTNsLjA2Ny0uMDMxIDEuMjM1Ljg5Mi44MjctLjU5NS0uNDUyLTEuNDVjLjA2Mi0uMDcxLjEyLS4xNDIuMTc2LS4yMTVsMS41MTIuMTUxLjQxOC0uOTI5LTEuMTIyLTEuMDMzLjAxMy0uMDU1em0tNC4yNjYgMS41ODNjLTEuMjk2IDAtMi4zNS0xLjA1NC0yLjM1LTIuMzVzMS4wNTQtMi4zNSAyLjM1LTIuMzUgMi4zNSAxLjA1NCAyLjM1IDIuMzUtMS4wNTQgMi4zNS0yLjM1IDIuMzV6Ii8+PHBhdGggY2xhc3M9Imljb24tZjEyLWx0Z3JleS1kaXNhYmxlZCIgZD0iTTEzLjgwMyAyMS4wNGwtLjYwOS0xLjM4NGEzLjA4IDMuMDggMCAwIDEtLjIzNi0uMDQ4bC0uMDM4LS4wMDgtMS4wNDMgMS4xMTEtLjkyNS0uNDI3LjE2Ny0xLjUwN2E0LjAxMyA0LjAxMyAwIDAgMS0uMjA5LS4xNzlsLTEuNDU2LjQzOS0uNTg4LS44MzIuOTAyLTEuMjI4LS4wMzMtLjA3MmMtLjAyOC0uMDYxLS4wNTgtLjEyNC0uMDgyLS4xOWwtMS40NjMtLjM0NC0uMDkxLTEuMDE1IDEuMzg3LS42MDVjLjAxMi0uMDc4LjAzLS4xNTQuMDQ3LS4yMzFsLjAwOS0uMDM5LTEuMTA5LTEuMDQ1LjQyOC0uOTI1IDEuNTA3LjE3Yy4wNTgtLjA3Mi4xMTgtLjE0LjE4My0uMjExbC0uNDM1LTEuNDU4LjgzNC0uNTg1IDEuMjI1LjkwNy4wNTItLjAyNGMuMDQ4LS4wMjIuMDk3LS4wNDQuMTQ3LS4wNjNsLjMyOS0xLjQ3MyAxLjAxNC0uMTA0LjYyIDEuMzc1YTIuMzg5IDIuMzg5IDAgMCAxIC4yNzEuMDU4bDEuMDMyLTEuMTIyLjkzLjQxOC0uMTUzIDEuNTExYy4wNzMuMDU1LjE0My4xMTMuMjE0LjE3NGwxLjQ1LS40NTMuNTk1LjgyNy0uODkyIDEuMjM2YS44LjggMCAwIDEgLjAyNC4wNTNjLjAzLjA2NC4wNjIuMTMxLjA4Ny4yMDFsMS40NzEuMzMyLjEwMyAxLjAxNC0xLjM3Ni42MThjLS4wMTIuMDcxLS4wMjcuMTQtLjA0My4yMDhsLS4wMTQuMDU4IDEuMTIyIDEuMDMzLS40MTkuOTI5LTEuNTExLS4xNTJhMy44NTEgMy44NTEgMCAwIDEtLjE3Ni4yMTVsLjQ1MiAxLjQ1LS44MjcuNTk1LTEuMjM2LS44OTItLjA3LjAzMmEyLjk0IDIuOTQgMCAwIDEtLjIxMi4wOTJsLS4zNDEgMS40NjUtMS4wMTUuMDk1em0tLjk1MS0xLjY2bC4xNTEuMDMzYy4wODkuMDIxLjE3OS4wNDIuMjcyLjA1M2wuMDU2LjAwNy41OTcgMS4zNTQuNzI4LS4wNjcuMzMzLTEuNDM1LjA1NC0uMDE4Yy4wODMtLjAyNS4xNjEtLjA2Mi4yNDQtLjEwMS4wNDItLjAyLjA4NC0uMDM5LjEyNy0uMDU3bC4wNTItLjAyMiAxLjIxMS44NzQuNTkzLS40MjctLjQ0Mi0xLjQyMS4wMzgtLjA0M2MuMDg1LS4wOTQuMTYzLS4xODguMjM2LS4yODhsLjAzMy0uMDQ2IDEuNDguMTUuMy0uNjY3LTEuMDk5LTEuMDEyLjAxMi0uMDU1LjAyNS0uMTE3Yy4wMTktLjA4LjAzNy0uMTYuMDQ3LS4yNDRsLjAwNy0uMDU2IDEuMzQ4LS42MDUtLjA3My0uNzI4LTEuNDQxLS4zMjQtLjAxOC0uMDU1Yy0uMDI1LS4wODEtLjA2MS0uMTU3LS4wOTYtLjIzM2EyLjE0NSAyLjE0NSAwIDAgMS0uMDUtLjEwOWwtLjAyMi0uMDUyLjg3NC0xLjIxMi0uNDI3LS41OTMtMS40Mi40NDMtLjA0Mi0uMDM4YTMuODk2IDMuODk2IDAgMCAwLS4yODgtLjIzNUwxNi4yMDcgMTJsLjE0OS0xLjQ4LS42NjctLjMtMS4wMTIgMS4xLS4wNTYtLjAxMWMtLjA0LS4wMDgtLjA4LS4wMTgtLjExOS0uMDI3LS4wODItLjAxOS0uMTYyLS4wMzgtLjI0Ni0uMDQ4bC0uMDU2LS4wMDUtLjYwNy0xLjM0Ni0uNzI3LjA3NC0uMzIzIDEuNDQxLS4wNTQuMDE4Yy0uMDYzLjAyLS4xMjEuMDQ3LS4xOC4wNzQtLjAzNy4wMTctLjA3My4wMzQtLjExMS4wNDlsLS4wNTIuMDIyLTEuMi0uODktLjU5OS40Mi40MjYgMS40MjktLjAzOC4wNDJhNC4wNyA0LjA3IDAgMCAwLS4yNDQuMjg0bC0uMDM0LjA0NS0xLjQ3Ni0uMTY3LS4zMDcuNjYzIDEuMDg2IDEuMDI0LS4wMzQuMTUxYy0uMDIuMDg5LS4wNDEuMTc3LS4wNTIuMjY5bC0uMDA3LjA1Ni0xLjM1OC41OTMuMDY2LjcyOCAxLjQzMS4zMzcuMDE3LjA1NWMuMDI0LjA3Ny4wNTguMTQ4LjA5MS4yMi4wMjEuMDQzLjA0MS4wODYuMDU5LjEzMWwuMDIyLjA1Mi0uODg1IDEuMjAzLjQyMi41OTggMS40MjYtLjQzMi4wNDIuMDM4Yy4wODMuMDc1LjE3OS4xNjMuMjgyLjI0bC4wNDUuMDM1LS4xNjMgMS40NzYuNjY0LjMwNiAxLjAyNC0xLjA4N3pNMjAuOTE4IDIyLjk3MmExLjM1IDEuMzUgMCAxIDEgLjAwMS0yLjY5OSAxLjM1IDEuMzUgMCAwIDEtLjAwMSAyLjY5OXptMC0yLjVjLS42MzQgMC0xLjE1LjUxNy0xLjE1IDEuMTVzLjUxNyAxLjE1IDEuMTUgMS4xNSAxLjE1LS41MTcgMS4xNS0xLjE1LS41MTYtMS4xNS0xLjE1LTEuMTV6Ii8+PHBhdGggY2xhc3M9Imljb24tZjEyLWhvdmVyLWJnIiBkPSJNMjQuOTAxIDIyLjAyOHYtLjgxMmwtMS4yNjktLjQyM2EyLjc0NyAyLjc0NyAwIDAgMC0uMjEtLjUwNWwuNTk5LTEuMTk2LS41NzQtLjU3NC0xLjE5Ni41OTlhMi44MSAyLjgxIDAgMCAwLS41MDUtLjIwOWwtLjQyMy0xLjI2OGgtLjgxMWwtLjQyMyAxLjI2OGEyLjgxIDIuODEgMCAwIDAtLjUwNS4yMDlsLTEuMTk3LS41OTktLjU3My41NzQuNTk5IDEuMTk2YTIuNzQ3IDIuNzQ3IDAgMCAwLS4yMS41MDVsLTEuMjY4LjQyM3YuODEybDEuMjY4LjQyMmMuMDU0LjE3NS4xMjQuMzQ1LjIxLjUwNmwtLjU5OSAxLjE5Ni41NzMuNTc0IDEuMTk3LS42Yy4xNjEuMDg3LjMzMS4xNTcuNTA1LjIxbC40MjMgMS4yNjloLjgxMWwuNDIzLTEuMjY5Yy4xNzQtLjA1My4zNDMtLjEyMy41MDUtLjIxbDEuMTk2LjYuNTc0LS41NzQtLjU5OS0xLjE5NmMuMDg2LS4xNjEuMTU2LS4zMzEuMjEtLjUwNmwxLjI2OS0uNDIyem0tMy45ODMuOTQzYy0uNzQ0IDAtMS4zNS0uNjA2LTEuMzUtMS4zNSAwLS43NDQuNjA1LTEuMzUgMS4zNS0xLjM1Ljc0NCAwIDEuMzUuNjA1IDEuMzUgMS4zNSAwIC43NDUtLjYwNiAxLjM1LTEuMzUgMS4zNXoiLz48cGF0aCBjbGFzcz0iaWNvbi1mMTItbHRncmV5LWRpc2FibGVkIiBkPSJNMjEuMzIzIDI1LjYwNGgtLjgxMWwtLjQyMy0xLjI2OWEyLjgxNCAyLjgxNCAwIDAgMS0uNTA1LS4yMDlsLTEuMTk3LjU5OS0uNTczLS41NzQuNTk5LTEuMTk2YTIuNzQ3IDIuNzQ3IDAgMCAxLS4yMS0uNTA1bC0xLjI2OS0uNDIzdi0uODEybDEuMjY5LS40MjJjLjA1NC0uMTc1LjEyNC0uMzQ1LjIxLS41MDZsLS41OTktMS4xOTYuNTczLS41NzMgMS4xOTcuNTk5Yy4xNjEtLjA4Ny4zMzEtLjE1Ny41MDUtLjIxbC40MjMtMS4yNjloLjgxMWwuNDIzIDEuMjY5Yy4xNzQuMDUzLjM0NC4xMjMuNTA1LjIxbDEuMTk2LS41OTkuNTc0LjU3My0uNTk5IDEuMTk2Yy4wODYuMTYxLjE1Ni4zMzEuMjEuNTA2bDEuMjY5LjQyMnYuODEybC0xLjI2OS40MjNhMi43NDcgMi43NDcgMCAwIDEtLjIxLjUwNWwuNTk5IDEuMTk2LS41NzQuNTc0LTEuMTk2LS41OTlhMi44MTQgMi44MTQgMCAwIDEtLjUwNS4yMDlsLS40MjMgMS4yNjl6bS0uNjY2LS4xOTloLjUyMWwuNDExLTEuMjMyLjA1MS0uMDE1Yy4xOTMtLjA1NC4zODItLjEzMi41Ni0uMjMxbC4wNDYtLjAyNiAxLjE2Mi41ODEuMzY5LS4zNjktLjU4LTEuMTYyLjAyNi0uMDQ2Yy4wOTktLjE3OC4xNzctLjM2Ni4yMzItLjU2bC4wMTQtLjA1MSAxLjIzMi0uNDExdi0uNTIzbC0xLjIzMi0uNDEtLjAxNC0uMDUxYTIuODEgMi44MSAwIDAgMC0uMjMyLS41NjFsLS4wMjYtLjA0Ni41OC0xLjE2Mi0uMzY5LS4zNjgtMS4xNjIuNTgtLjA0Ni0uMDI2YTIuNjI3IDIuNjI3IDAgMCAwLS41Ni0uMjMybC0uMDUtLjAxNC0uNDExLTEuMjMyaC0uNTIxbC0uNDExIDEuMjMyLS4wNTEuMDE0YTIuNzU4IDIuNzU4IDAgMCAwLS41Ni4yMzJsLS4wNDYuMDI2LTEuMTYzLS41OC0uMzY4LjM2OC41OCAxLjE2Mi0uMDI2LjA0NmEyLjY3NSAyLjY3NSAwIDAgMC0uMjMyLjU2MWwtLjAxNC4wNTEtMS4yMzIuNDF2LjUyMmwxLjIzMi40MTEuMDE0LjA1MWMuMDU2LjE5My4xMzQuMzgyLjIzMi41NmwuMDI2LjA0Ni0uNTggMS4xNjIuMzY4LjM2OSAxLjE2My0uNTgxLjA0Ni4wMjZjLjE3OC4xLjM2Ni4xNzguNTYuMjMxbC4wNTEuMDE1LjQxIDEuMjMzeiIvPjwvZz48ZyBpZD0iY29sb3JJbXBvcnRhbmNlIj48cGF0aCBjbGFzcz0iaWNvbi13aGl0ZSIgZD0iTTMxLjY2IDI0LjA2M0MzMS4zMTIgMjUuMTE2IDMwLjY2MSAyNyAyOC40MTMgMjdIMjd2MS4zMTNjMCAuOTA1LS4zMzUgMi41MzctMi45NjUgMy4yOTgtLjkwNC4yNjEtMS42OTQuMzg5LTIuNTMxLjM4OS0uODMgMC0xLjYzLS4xMjgtMi41MjYtLjM5MkMxNy4wNjEgMzEuMDQ1IDE2IDI5Ljg0NCAxNiAyOC4zMTNWMjdoLTEuMjMyYy0xLjY5OSAwLTIuOTQ0LTEuMTQxLTMuNDE2LTMuMTEtLjQ2OS0xLjk0Ni0uNDY5LTMuMDIxIDAtNC45NjcuNDUxLTEuODgxIDEuOTYtMi45MjMgMy44NDUtMi45MjNIMTZ2LTEuNjk3YzAtMi4wMDUuODY2LTIuODQ1IDMuMDg3LTMuMjM4LjcyNy0uMTI4IDEuNTA2LS4wNjUgMi4zMjctLjA2NWguMDAzYy45MjEgMCAxLjcwMy0uMDcgMi41MDQuMDY0IDEuODE4LjMwMiAzLjA3OSAxLjU4NSAzLjA3OSAzLjIzOVYxNmgxLjQxM2MxLjE0MiAwIDIuNjM2LjM1NiAzLjI3IDIuOTEyLjUxNSAyLjA3Mi41MDkgMy41NTgtLjAyMyA1LjE1MXoiLz48bGluZWFyR3JhZGllbnQgaWQ9InBhdGgxOTQ4XzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUyMi4zMiIgeTE9Ii0yODguNjY4IiB4Mj0iNTQxLjAxNyIgeTI9Ii0zMDQuNzU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC41NjI1IDAgMCAtLjU2OCAtMjgyLjI3MiAtMTUxLjY5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNWE5ZmQ0Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzA2OTk4Ii8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBpZD0icGF0aDE5NDhfNV8iIGNsYXNzPSJzdDEiIGQ9Ik0yMS40MTkgMTEuNzI1Yy0uNzg2LjAwNC0xLjUzNy4wNzEtMi4xOTcuMTg4LTEuOTQ2LjM0NC0yLjI5OSAxLjA2My0yLjI5OSAyLjM5djEuNzUzaDQuNTk4di41ODRoLTYuMzI0Yy0xLjMzNiAwLTIuNTA3LjgwMy0yLjg3MyAyLjMzMS0uNDIyIDEuNzUxLS40NDEgMi44NDQgMCA0LjY3My4zMjcgMS4zNjEgMS4xMDggMi4zMzEgMi40NDQgMi4zMzFoMS41ODF2LTIuMTAxYzAtMS41MTggMS4zMTMtMi44NTcgMi44NzMtMi44NTdoNC41OTNjMS4yNzggMCAyLjI5OS0xLjA1MyAyLjI5OS0yLjMzN3YtNC4zNzljMC0xLjI0Ni0xLjA1MS0yLjE4Mi0yLjI5OS0yLjM5LS43OS0uMTMtMS42MS0uMTg5LTIuMzk2LS4xODZ6bS0yLjQ4NyAxLjQxYy40NzUgMCAuODYzLjM5NC44NjMuODc5YS44Ny44NyAwIDAgMS0uODYzLjg3NC44NjguODY4IDAgMCAxLS44NjMtLjg3NGMwLS40ODUuMzg3LS44NzkuODYzLS44Nzl6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJwYXRoMTk1MF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1NDguMjQ1IiB5MT0iLTMxNC40ODkiIHgyPSI1NDEuNTY5IiB5Mj0iLTMwNS4wNDMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjU2MjUgMCAwIC0uNTY4IC0yODIuMjcyIC0xNTEuNjkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmQ0M2IiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmU4NzMiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJwYXRoMTk1MF81XyIgY2xhc3M9InN0MiIgZD0iTTI2LjY4NyAxNi42NHYyLjA0MmMwIDEuNTgzLTEuMzQyIDIuOTE1LTIuODczIDIuOTE1aC00LjU5M2MtMS4yNTggMC0yLjI5OSAxLjA3Ny0yLjI5OSAyLjMzN3Y0LjM3OWMwIDEuMjQ2IDEuMDg0IDEuOTc5IDIuMjk5IDIuMzM3IDEuNDU2LjQyOCAyLjg1MS41MDUgNC41OTMgMCAxLjE1OC0uMzM1IDIuMjk5LTEuMDEgMi4yOTktMi4zMzdWMjYuNTZIMjEuNTJ2LS41ODRIMjguNDEyYzEuMzM2IDAgMS44MzQtLjkzMiAyLjI5OS0yLjMzMS40OC0xLjQ0LjQ2LTIuODI2IDAtNC42NzMtLjMzLTEuMzMtLjk2MS0yLjMzMS0yLjI5OS0yLjMzMWgtMS43MjV6bS0yLjU4MyAxMS4wODljLjQ3NyAwIC44NjMuMzkxLjg2My44NzRhLjg3MS44NzEgMCAwIDEtLjg2My44NzkuODcyLjg3MiAwIDAgMS0uODYzLS44NzljMC0uNDg0LjM4OC0uODc0Ljg2My0uODc0eiIvPjwvZz48L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weXRob24uaWNucyBiL1BDL2ljb25zL3B5dGhvbi5pY25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTNlMDIKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9weXRob24uaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weXRob24uaWNvIGIvUEMvaWNvbnMvcHl0aG9uLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGEzOGVmCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHl0aG9uLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weXRob24uc3ZnIGIvUEMvaWNvbnMvcHl0aG9uLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjNlNWEzCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHl0aG9uLnN2ZwpAQCAtMCwwICsxIEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyIDMyIj48c3R5bGU+Lmljb24tY2FudmFzLXRyYW5zcGFyZW50e29wYWNpdHk6MDtmaWxsOiNmNmY2ZjZ9Lmljb24td2hpdGV7ZmlsbDojZmZmfS5pY29uLXZzby1iZ3tmaWxsOiM2NTY1NjV9Lmljb24tdmlzdWFsc3R1ZGlvLW9ubGluZXtmaWxsOiMwMDdhY2N9Lmljb24tdnMtYmd7ZmlsbDojNDI0MjQyfS5pY29uLXZzLWdyZWVue2ZpbGw6IzM5M30uc3Qwe2ZpbGw6dXJsKCNwYXRoMTk0OF8xXyl9LnN0MXtmaWxsOnVybCgjcGF0aDE5NTBfMV8pfTwvc3R5bGU+PHBhdGggY2xhc3M9Imljb24tY2FudmFzLXRyYW5zcGFyZW50IiBkPSJNMzIgMzJIMFYwaDMydjMyeiIgaWQ9ImNhbnZhcyIvPjxnIGlkPSJpY29uQmciPjxwYXRoIGNsYXNzPSJpY29uLXZpc3VhbHN0dWRpby1vbmxpbmUiIGQ9Ik0zMCA0SDJWMmgyOHYyeiIvPjxwYXRoIGNsYXNzPSJpY29uLXZzby1iZyIgZD0iTTI5IDR2MjFIM1Y0SDJ2MjJoMjhWNHoiLz48cGF0aCBjbGFzcz0iaWNvbi12cy1iZyIgZD0iTTEwIDRIM3YyMWgyNlY0eiIvPjwvZz48ZyBpZD0iaWNvbkZnIj48cGF0aCBjbGFzcz0iaWNvbi13aGl0ZSIgZD0iTTI5LjE0MSAzbC40MjkuNDI5LS4xNC4xNDItLjQzLS40My0uNDMuNDMtLjE0LS4xNDIuNDI5LS40MjktLjQyOS0uNDI5LjE0MS0uMTQyLjQyOS40My40My0uNDMuMTQxLjE0Mi0uNDMuNDI5ek0yNy42IDIuNGgtMS4ydjEuMmgxLjJWMi40em0tMSAuMmguOHYuOGgtLjh2LS44em0tMS4xMzkuOGgtMXYuMmgxdi0uMnoiLz48cGF0aCBjbGFzcz0iaWNvbi12cy1ncmVlbiIgZD0iTTE2IDE0SDV2LTFoMTEuMDMxYy0uMDE0LjA0NC0uMDMxIDEtLjAzMSAxem0tNC01SDV2MWg3Vjl6bS03IDh2MWg4di0xSDV6Ii8+PC9nPjxnIGlkPSJjb2xvckltcG9ydGFuY2UiPjxwYXRoIGNsYXNzPSJpY29uLXdoaXRlIiBkPSJNMzEuNTk2IDI0LjA2M0MzMS4yNDYgMjUuMTE2IDMwLjU5NSAyNyAyOC4zNDkgMjdIMjd2MS4zMTNjMCAuOTA1LS4zNjggMi41MzctMi45OTYgMy4yOTgtLjkwNC4yNjEtMS43MjguMzg5LTIuNTY2LjM4OS0uODMgMC0xLjU5Ny0uMTI4LTIuNDkyLS4zOTJDMTcuMDI5IDMxLjA0NSAxNiAyOS44NDQgMTYgMjguMzEzVjI3aC0xLjI5N2MtMS42OTggMC0yLjk0My0xLjE0MS0zLjQxNi0zLjExLS40NjktMS45NDYtLjQ2OS0zLjAyMSAwLTQuOTY3LjQ1MS0xLjg4MSAxLjk2LTIuOTIzIDMuODQ1LTIuOTIzSDE2di0xLjY5N2MwLTIuMDA1LjgzNC0yLjg0NSAzLjA1NC0zLjIzOC43MjgtLjEyOCAxLjQ3NC0uMDY1IDIuMjk2LS4wNjVoLjAwM2MuOTIxIDAgMS43MzUtLjA3IDIuNTM3LjA2NCAxLjgxNi4zMDMgMy4xMSAxLjU4NSAzLjExIDMuMjRWMTZoMS4zNDljMS4xNDIgMCAyLjYzNi4zNTYgMy4yNyAyLjkxMi41MTUgMi4wNzIuNTA5IDMuNTU4LS4wMjMgNS4xNTF6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJwYXRoMTk0OF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1MjIuMjA1IiB5MT0iLTI4OC42NjgiIHgyPSI1NDAuOTAyIiB5Mj0iLTMwNC43NTQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjU2MjUgMCAwIC0uNTY4IC0yODIuMjcyIC0xNTEuNjkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1YTlmZDQiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMDY5OTgiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJwYXRoMTk0OF8zXyIgY2xhc3M9InN0MCIgZD0iTTIxLjM1NCAxMS43MjVjLS43ODYuMDA0LTEuNTM3LjA3MS0yLjE5Ny4xODgtMS45NDYuMzQ0LTIuMjk5IDEuMDYzLTIuMjk5IDIuMzl2MS43NTNoNC41OTh2LjU4NGgtNi4zMjRjLTEuMzM2IDAtMi41MDcuODAzLTIuODczIDIuMzMxLS40MjIgMS43NTEtLjQ0MSAyLjg0NCAwIDQuNjczLjMyNyAxLjM2MSAxLjEwNyAyLjMzMSAyLjQ0NCAyLjMzMWgxLjU4MXYtMi4xMDFjMC0xLjUxOCAxLjMxMy0yLjg1NyAyLjg3My0yLjg1N2g0LjU5M2MxLjI3OSAwIDIuMjk5LTEuMDUzIDIuMjk5LTIuMzM3di00LjM3OWMwLTEuMjQ2LTEuMDUxLTIuMTgyLTIuMjk5LTIuMzktLjc5LS4xMy0xLjYxLS4xODktMi4zOTYtLjE4NnptLTIuNDg2IDEuNDFjLjQ3NSAwIC44NjMuMzk0Ljg2My44NzlhLjg3Ljg3IDAgMCAxLS44NjMuODc0Ljg2OC44NjggMCAwIDEtLjg2My0uODc0YzAtLjQ4NS4zODYtLjg3OS44NjMtLjg3OXoiLz48bGluZWFyR3JhZGllbnQgaWQ9InBhdGgxOTUwXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjU0OC4xMyIgeTE9Ii0zMTQuNDg5IiB4Mj0iNTQxLjQ1NCIgeTI9Ii0zMDUuMDQzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC41NjI1IDAgMCAtLjU2OCAtMjgyLjI3MiAtMTUxLjY5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZkNDNiIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZlODczIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBpZD0icGF0aDE5NTBfM18iIGNsYXNzPSJzdDEiIGQ9Ik0yNi42MjMgMTYuNjR2Mi4wNDJjMCAxLjU4My0xLjM0MiAyLjkxNS0yLjg3MyAyLjkxNWgtNC41OTNjLTEuMjU4IDAtMi4yOTkgMS4wNzctMi4yOTkgMi4zMzd2NC4zNzljMCAxLjI0NiAxLjA4NCAxLjk3OSAyLjI5OSAyLjMzNyAxLjQ1Ni40MjggMi44NTEuNTA1IDQuNTkzIDAgMS4xNTgtLjMzNSAyLjI5OS0xLjAxIDIuMjk5LTIuMzM3VjI2LjU2aC00LjU5M3YtLjU4NGg2Ljg5MmMxLjMzNiAwIDEuODM0LS45MzIgMi4yOTktMi4zMzEuNDgtMS40NC40Ni0yLjgyNiAwLTQuNjczLS4zMy0xLjMzLS45NjEtMi4zMzEtMi4yOTktMi4zMzFoLTEuNzI1em0tMi41ODQgMTEuMDg5Yy40NzcgMCAuODYzLjM5MS44NjMuODc0YS44NzEuODcxIDAgMCAxLS44NjMuODc5Ljg3Mi44NzIgMCAwIDEtLjg2My0uODc5Ljg3Ljg3IDAgMCAxIC44NjMtLjg3NHoiLz48L2c+PC9zdmc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUEMvaWNvbnMvcHl0aG9udy5pY25zIGIvUEMvaWNvbnMvcHl0aG9udy5pY25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNTRjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9weXRob253LmljbnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvUEMvaWNvbnMvcHl0aG9udy5pY28gYi9QQy9pY29ucy9weXRob253LmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTk1ZDQzCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHl0aG9udy5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvUEMvaWNvbnMvcHl0aG9udy5zdmcgYi9QQy9pY29ucy9weXRob253LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2IyNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHl0aG9udy5zdmcKQEAgLTAsMCArMSBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PHN0eWxlPi5pY29uLWNhbnZhcy10cmFuc3BhcmVudHtvcGFjaXR5OjA7ZmlsbDojZjZmNmY2fS5pY29uLXdoaXRle2ZpbGw6I2ZmZn0uaWNvbi12aXN1YWxzdHVkaW8tb25saW5le2ZpbGw6IzAwN2FjY30uZ3JhcGgtbGlnaHRncmV5e2ZpbGw6I2RmZGZkZn0uc3Qwe2ZpbGw6I2Y2ZjZmNn0uc3Qxe2ZpbGw6IzY1NjU2NX0uc3Qye2ZpbGw6I2JmYmZiZn0uc3Qze2ZpbGw6I2ZmZn0uc3Q0e2ZpbGw6dXJsKCNwYXRoMTk0OF8xXyl9LnN0NXtmaWxsOnVybCgjcGF0aDE5NTBfMV8pfTwvc3R5bGU+PHBhdGggY2xhc3M9Imljb24tY2FudmFzLXRyYW5zcGFyZW50IiBkPSJNMzIgMzJIMFYwaDMydjMyeiIgaWQ9ImNhbnZhcyIvPjxnIGlkPSJpY29uQmciPjxwYXRoIGNsYXNzPSJncmFwaC1saWdodGdyZXkiIGQ9Ik0yOSA3SDNWNWgyNnYyeiIvPjxwYXRoIGNsYXNzPSJpY29uLXZpc3VhbHN0dWRpby1vbmxpbmUiIGQ9Ik0zMCA1SDJWM2gyOHYyeiIvPjxwYXRoIGNsYXNzPSJpY29uLXdoaXRlIiBkPSJNMjkuMTQxIDRsLjQyOS40MjktLjE0LjE0Mi0uNDMtLjQzLS40My40My0uMTQtLjE0Mi40MjktLjQyOS0uNDI5LS40MjkuMTQxLS4xNDIuNDI5LjQzLjQzLS40My4xNDEuMTQyLS40My40Mjl6TTI3LjYgMy40aC0xLjJ2MS4yaDEuMlYzLjR6bS0xIC4yaC44di44aC0uOHYtLjh6bS0xLjEzOS44aC0xdi4yaDF2LS4yeiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0zIDdoMjZ2MTlIM3oiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNMjkgNXYyMUgzVjVIMnYyMmgyOFY1eiIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik00IDUuNzVoMnYuNUg0eiIvPjwvZz48cGF0aCBjbGFzcz0ic3QyIiBkPSJNMTIgMTFINXYtMWg3djF6bS03IDd2MWgxMXYtMUg1em0wLTR2MWgxMXYtMUg1eiIgaWQ9Imljb25GZyIvPjxnIGlkPSJjb2xvckltcG9ydGFuY2UiPjxwYXRoIGNsYXNzPSJzdDMiIGQ9Ik0zMS42MTggMTguOTEyQzMwLjk4NCAxNi4zNTYgMjkuNDkgMTYgMjguMzQ5IDE2SDI3di0xLjY5N2MwLTEuNjU0LTEuMjk0LTIuOTM3LTMuMTEtMy4yNC0uODAyLS4xMzMtMS42MTctLjA2My0yLjUzNy0uMDYzaC0uMDAzYy0uODIxIDAtMS41NjgtLjA2My0yLjI5NS4wNjUtMi4yMjEuMzkzLTMuMDU1IDEuMjMzLTMuMDU1IDMuMjM4VjE2aC0uODY4Yy0xLjg4NSAwLTMuMzk0IDEuMDQyLTMuODQ1IDIuOTI0LS40NjkgMS45NDYtLjQ2OSAzLjAyMiAwIDQuOTY3QzExLjc2IDI1Ljg1OSAxMy4wMDUgMjcgMTQuNzAzIDI3SDE2djEuMzEzYzAgMS41MzEgMS4wMjkgMi43MzIgMi45NDYgMy4yOTYuODk2LjI2MyAxLjY2Mi4zOTEgMi40OTIuMzkxLjgzOCAwIDEuNjYxLS4xMjggMi41NjUtLjM5QzI2LjYzMiAzMC44NSAyNyAyOS4yMTggMjcgMjguMzEzVjI3aDEuMzQ5YzIuMjQ2IDAgMi44OTctMS44ODQgMy4yNDctMi45MzcuNTMyLTEuNTkyLjUzOC0zLjA3OS4wMjItNS4xNTF6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJwYXRoMTk0OF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1MjIuMjA1IiB5MT0iLTI4OC42NjgiIHgyPSI1NDAuOTAyIiB5Mj0iLTMwNC43NTQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjU2MjUgMCAwIC0uNTY4IC0yODIuMjcyIC0xNTEuNjkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1YTlmZDQiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMDY5OTgiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJwYXRoMTk0OF82XyIgY2xhc3M9InN0NCIgZD0iTTIxLjM1NCAxMS43MjVjLS43ODYuMDA0LTEuNTM3LjA3MS0yLjE5Ny4xODgtMS45NDYuMzQ0LTIuMjk5IDEuMDYzLTIuMjk5IDIuMzl2MS43NTNoNC41OTh2LjU4NGgtNi4zMjRjLTEuMzM2IDAtMi41MDcuODAzLTIuODczIDIuMzMxLS40MjIgMS43NTEtLjQ0MSAyLjg0NCAwIDQuNjczLjMyNyAxLjM2MSAxLjEwNyAyLjMzMSAyLjQ0NCAyLjMzMWgxLjU4MXYtMi4xMDFjMC0xLjUxOCAxLjMxMy0yLjg1NyAyLjg3My0yLjg1N2g0LjU5M2MxLjI3OCAwIDIuMjk5LTEuMDUzIDIuMjk5LTIuMzM3di00LjM3OWMwLTEuMjQ2LTEuMDUxLTIuMTgyLTIuMjk5LTIuMzktLjc5LS4xMy0xLjYxLS4xODktMi4zOTYtLjE4NnptLTIuNDg2IDEuNDFjLjQ3NSAwIC44NjMuMzk0Ljg2My44NzlhLjg3Ljg3IDAgMCAxLS44NjMuODc0Ljg2OC44NjggMCAwIDEtLjg2My0uODc0YzAtLjQ4NS4zODYtLjg3OS44NjMtLjg3OXoiLz48bGluZWFyR3JhZGllbnQgaWQ9InBhdGgxOTUwXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjU0OC4xMyIgeTE9Ii0zMTQuNDg5IiB4Mj0iNTQxLjQ1NCIgeTI9Ii0zMDUuMDQzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC41NjI1IDAgMCAtLjU2OCAtMjgyLjI3MiAtMTUxLjY5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZkNDNiIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZlODczIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBpZD0icGF0aDE5NTBfNl8iIGNsYXNzPSJzdDUiIGQ9Ik0yNi42MjMgMTYuNjR2Mi4wNDJjMCAxLjU4My0xLjM0MiAyLjkxNS0yLjg3MyAyLjkxNWgtNC41OTNjLTEuMjU4IDAtMi4yOTkgMS4wNzctMi4yOTkgMi4zMzd2NC4zNzljMCAxLjI0NiAxLjA4NCAxLjk3OSAyLjI5OSAyLjMzNyAxLjQ1Ni40MjggMi44NTEuNTA1IDQuNTkzIDAgMS4xNTgtLjMzNSAyLjI5OS0xLjAxIDIuMjk5LTIuMzM3VjI2LjU2aC00LjU5M3YtLjU4NGg2Ljg5MmMxLjMzNiAwIDEuODM0LS45MzIgMi4yOTktMi4zMzEuNDgtMS40NC40Ni0yLjgyNiAwLTQuNjczLS4zMy0xLjMzLS45NjEtMi4zMzEtMi4yOTktMi4zMzFoLTEuNzI1em0tMi41ODQgMTEuMDg5Yy40NzcgMCAuODYzLjM5MS44NjMuODc0YS44NzEuODcxIDAgMCAxLS44NjMuODc5Ljg3Mi44NzIgMCAwIDEtLjg2My0uODc5Ljg3Ljg3IDAgMCAxIC44NjMtLjg3NHoiLz48L2c+PC9zdmc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUEMvaWNvbnMvc2V0dXAuaWNucyBiL1BDL2ljb25zL3NldHVwLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwZTZiMAotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL3NldHVwLmljbnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvUEMvaWNvbnMvc2V0dXAuaWNvIGIvUEMvaWNvbnMvc2V0dXAuaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NDM2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9zZXR1cC5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvUEMvaWNvbnMvc2V0dXAuc3ZnIGIvUEMvaWNvbnMvc2V0dXAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTM4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9zZXR1cC5zdmcKQEAgLTAsMCArMSBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PHN0eWxlPi5pY29uLWNhbnZhcy10cmFuc3BhcmVudHtvcGFjaXR5OjA7ZmlsbDojZjZmNmY2fS5pY29uLXZpc3VhbHN0dWRpby1vbmxpbmV7ZmlsbDojMDA3YWNjfS5pY29uLWRpc2FibGVkLWdyZXl7ZmlsbDojODQ4NDg0fS5pY29uLXdoaXRle2ZpbGw6I2ZmZn0uc3Qwe2ZpbGw6I2YwZWZmMX0uc3Qxe2ZpbGw6IzQyNDI0Mn0uc3Qye2ZpbGw6dXJsKCNwYXRoMTk0OF8xXyl9LnN0M3tmaWxsOnVybCgjcGF0aDE5NTBfMV8pfTwvc3R5bGU+PHBhdGggY2xhc3M9Imljb24tY2FudmFzLXRyYW5zcGFyZW50IiBkPSJNMzIgMzJIMFYwaDMydjMyeiIgaWQ9ImNhbnZhcyIvPjxnIGlkPSJpY29uQmciPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xOCA4djEwSDFWOGgxN3ptLTEuMTkxIDE1LjU3MmExLjAwNCAxLjAwNCAwIDAgMC0uOTAzLS41NzJIMi45MDdjLS4zODUgMC0uNzQuMjI1LS45MDMuNTcyTC44ODYgMjUuOTI4QS43NDguNzQ4IDAgMCAwIDEuNTYzIDI3SDE3LjI1YS43NDguNzQ4IDAgMCAwIC42NzctMS4wNzJsLTEuMTE4LTIuMzU2eiIvPjxwYXRoIGNsYXNzPSJpY29uLWRpc2FibGVkLWdyZXkiIGQ9Ik0xNy45MjcgMjUuOTI5bC0xLjExOC0yLjM1NmExLjAwMyAxLjAwMyAwIDAgMC0uOTAzLS41NzNIMi45MDdjLS4zODUgMC0uNzQuMjI1LS45MDMuNTcyTC44ODYgMjUuOTI4QS43NDguNzQ4IDAgMCAwIDEuNTYzIDI3SDE3LjI1YS43NDcuNzQ3IDAgMCAwIC42MzMtLjM0OS43NDYuNzQ2IDAgMCAwIC4wNDQtLjcyMnpNMS45NTkgMjZsLjk0OS0yaDEyLjk5OGwuOTQ5IDJIMS45NTl6TTYgMjJ2LTFoM3YtMmgxdjJoM3YxSDZ6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTAgN3YxMmgxOVY3SDB6bTE4IDExSDFWOGgxN3YxMHoiLz48L2c+PGcgaWQ9Imljb25GZyI+PHBhdGggY2xhc3M9Imljb24td2hpdGUiIGQ9Ik0xMiA2VjBIN3Y2SDIuNzU1TDkuNSAxMy40OTUgMTYuMjQ1IDZ6Ii8+PHBhdGggY2xhc3M9Imljb24tdmlzdWFsc3R1ZGlvLW9ubGluZSIgZD0iTTggNGgzdjNoM2wtNC41IDVMNSA3aDNWNHptMy0ySDh2MWgzVjJ6bTAtMkg4djFoM1YweiIvPjwvZz48ZyBpZD0iY29sb3JJbXBvcnRhbmNlIj48cGF0aCBjbGFzcz0iaWNvbi13aGl0ZSIgZD0iTTMxLjU5NiAyNC4wNjNDMzEuMjQ2IDI1LjExNiAzMC41OTUgMjcgMjguMzQ5IDI3SDI3djEuMzEzYzAgLjkwNS0uMzY4IDIuNTM3LTIuOTk3IDMuMjk4LS45MDMuMjYxLTEuNzI3LjM4OS0yLjU2NS4zODktLjgzIDAtMS41OTctLjEyOC0yLjQ5My0uMzkyQzE3LjAyOSAzMS4wNDUgMTYgMjkuODQ0IDE2IDI4LjMxM1YyN2gtMS4yOTZjLTEuNjk4IDAtMi45NDQtMS4xNDEtMy40MTctMy4xMS0uNDY5LTEuOTQ0LS40NjktMy4wMiAwLTQuOTY3LjQ1MS0xLjg4MSAxLjk2MS0yLjkyMyAzLjg0NS0yLjkyM0gxNnYtMS42OTdjMC0yLjAwNS44MzQtMi44NDUgMy4wNTQtMy4yMzguNzI4LS4xMjggMS40NzQtLjA2NSAyLjI5Ni0uMDY1aC4wMDNjLjkyMSAwIDEuNzM1LS4wNyAyLjUzNy4wNjQgMS44MTYuMzAzIDMuMTEgMS41ODUgMy4xMSAzLjI0VjE2aDEuMzQ5YzEuMTQyIDAgMi42MzYuMzU2IDMuMjcgMi45MTIuNTE1IDIuMDcyLjUwOSAzLjU1OS0uMDIzIDUuMTUxeiIvPjxsaW5lYXJHcmFkaWVudCBpZD0icGF0aDE5NDhfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTIyLjIwNSIgeTE9Ii0yODguNjY4IiB4Mj0iNTQwLjkwMiIgeTI9Ii0zMDQuNzU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC41NjI1IDAgMCAtLjU2OCAtMjgyLjI3MiAtMTUxLjY5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNWE5ZmQ0Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzA2OTk4Ii8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBpZD0icGF0aDE5NDhfOV8iIGNsYXNzPSJzdDIiIGQ9Ik0yMS4zNTQgMTEuNzI1Yy0uNzg2LjAwNC0xLjUzNy4wNzEtMi4xOTcuMTg4LTEuOTQ2LjM0NC0yLjI5OSAxLjA2My0yLjI5OSAyLjM5djEuNzUzaDQuNTk4di41ODRoLTYuMzI0Yy0xLjMzNiAwLTIuNTA3LjgwMy0yLjg3MyAyLjMzMS0uNDIyIDEuNzUxLS40NDEgMi44NDQgMCA0LjY3My4zMjcgMS4zNjEgMS4xMDggMi4zMzEgMi40NDQgMi4zMzFoMS41ODF2LTIuMTAxYzAtMS41MTggMS4zMTMtMi44NTcgMi44NzMtMi44NTdoNC41OTNjMS4yNzkgMCAyLjI5OS0xLjA1MyAyLjI5OS0yLjMzN3YtNC4zNzljMC0xLjI0Ni0xLjA1MS0yLjE4Mi0yLjI5OS0yLjM5LS43OS0uMTMtMS42MS0uMTg5LTIuMzk2LS4xODZ6bS0yLjQ4NiAxLjQxYy40NzUgMCAuODYzLjM5NC44NjMuODc5YS44Ny44NyAwIDAgMS0uODYzLjg3NC44NjguODY4IDAgMCAxLS44NjMtLjg3NGMwLS40ODUuMzg2LS44NzkuODYzLS44Nzl6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJwYXRoMTk1MF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1NDguMTMiIHkxPSItMzE0LjQ4OSIgeDI9IjU0MS40NTQiIHkyPSItMzA1LjA0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNTYyNSAwIDAgLS41NjggLTI4Mi4yNzIgLTE1MS42OSkiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZDQzYiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZTg3MyIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggaWQ9InBhdGgxOTUwXzlfIiBjbGFzcz0ic3QzIiBkPSJNMjYuNjIzIDE2LjY0djIuMDQyYzAgMS41ODMtMS4zNDIgMi45MTUtMi44NzMgMi45MTVoLTQuNTkzYy0xLjI1OCAwLTIuMjk5IDEuMDc3LTIuMjk5IDIuMzM3djQuMzc5YzAgMS4yNDYgMS4wODQgMS45NzkgMi4yOTkgMi4zMzcgMS40NTYuNDI4IDIuODUxLjUwNSA0LjU5MyAwIDEuMTU4LS4zMzUgMi4yOTktMS4wMSAyLjI5OS0yLjMzN1YyNi41NmgtNC41OTN2LS41ODRIMjguMzQ4YzEuMzM2IDAgMS44MzQtLjkzMiAyLjI5OS0yLjMzMS40OC0xLjQ0LjQ2LTIuODI2IDAtNC42NzMtLjMzLTEuMzMtLjk2MS0yLjMzMS0yLjI5OS0yLjMzMWgtMS43MjV6bS0yLjU4NCAxMS4wODljLjQ3NyAwIC44NjMuMzkxLjg2My44NzRhLjg3MS44NzEgMCAwIDEtLjg2My44NzkuODcyLjg3MiAwIDAgMS0uODYzLS44NzkuODcuODcgMCAwIDEgLjg2My0uODc0eiIvPjwvZz48L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QQy9sYXVuY2hlci5jIGIvUEMvbGF1bmNoZXIuYwppbmRleCA0MGQ0Y2I1Li45MmYyYzJhIDEwMDY0NAotLS0gYS9QQy9sYXVuY2hlci5jCisrKyBiL1BDL2xhdW5jaGVyLmMKQEAgLTk4LDcgKzk4LDcgQEAKICAgICBNZXNzYWdlQm94KE5VTEwsIG1lc3NhZ2UsIFRFWFQoIlB5dGhvbiBMYXVuY2hlciBpcyBzb3JyeSB0byBzYXkgLi4uIiksCiAgICAgICAgICAgICAgICBNQl9PSyk7CiAjZW5kaWYKLSAgICBFeGl0UHJvY2VzcyhyYyk7CisgICAgZXhpdChyYyk7CiB9CiAKIC8qCkBAIC00NjUsNyArNDY1LDcgQEAKIH0KIAogc3RhdGljIElOU1RBTExFRF9QWVRIT04gKgotbG9jYXRlX3B5dGhvbih3Y2hhcl90ICogd2FudGVkX3ZlcikKK2xvY2F0ZV9weXRob24od2NoYXJfdCAqIHdhbnRlZF92ZXIsIEJPT0wgZnJvbV9zaGViYW5nKQogewogICAgIHN0YXRpYyB3Y2hhcl90IGNvbmZpZ19rZXkgW10gPSB7IEwicHl0aG9uWCIgfTsKICAgICBzdGF0aWMgd2NoYXJfdCAqIGxhc3RfY2hhciA9ICZjb25maWdfa2V5W3NpemVvZihjb25maWdfa2V5KSAvCkBAIC00OTcsMTAgKzQ5NywxNyBAQAogICAgICAgICBjb25maWd1cmVkX3ZhbHVlID0gZ2V0X2NvbmZpZ3VyZWRfdmFsdWUoY29uZmlnX2tleSk7CiAgICAgICAgIGlmIChjb25maWd1cmVkX3ZhbHVlKQogICAgICAgICAgICAgcmVzdWx0ID0gZmluZF9weXRob25fYnlfdmVyc2lvbihjb25maWd1cmVkX3ZhbHVlKTsKKyAgICAgICAgLyogTm90IGZvdW5kIGEgdmFsdWUgeWV0IC0gdHJ5IGJ5IG1ham9yIHZlcnNpb24uCisgICAgICAgICAqIElmIHdlJ3JlIGxvb2tpbmcgZm9yIGFuIGludGVycHJldGVyIHNwZWNpZmllZCBpbiBhIHNoZWJhbmcgbGluZSwKKyAgICAgICAgICogd2Ugd2FudCB0byB0cnkgUHl0aG9uIDIgZmlyc3QsIHRoZW4gUHl0aG9uIDMgKGZvciBVbml4IGFuZCBiYWNrd2FyZAorICAgICAgICAgKiBjb21wYXRpYmlsaXR5KS4gSWYgd2UncmUgYmVpbmcgY2FsbGVkIGludGVyYWN0aXZlbHksIGFzc3VtZSB0aGUgdXNlcgorICAgICAgICAgKiB3YW50cyB0aGUgbGF0ZXN0IHZlcnNpb24gYXZhaWxhYmxlLCBzbyB0cnkgUHl0aG9uIDMgZmlyc3QsIHRoZW4KKyAgICAgICAgICogUHl0aG9uIDIuCisgICAgICAgICAqLwogICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICByZXN1bHQgPSBmaW5kX3B5dGhvbl9ieV92ZXJzaW9uKEwiMiIpOworICAgICAgICAgICAgcmVzdWx0ID0gZmluZF9weXRob25fYnlfdmVyc2lvbihmcm9tX3NoZWJhbmcgPyBMIjIiIDogTCIzIik7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRfcHl0aG9uX2J5X3ZlcnNpb24oTCIzIik7CisgICAgICAgICAgICByZXN1bHQgPSBmaW5kX3B5dGhvbl9ieV92ZXJzaW9uKGZyb21fc2hlYmFuZyA/IEwiMyIgOiBMIjIiKTsKICAgICAgICAgZGVidWcoTCJzZWFyY2ggZm9yIGRlZmF1bHQgUHl0aG9uIGZvdW5kICIpOwogICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICBkZWJ1ZyhMInZlcnNpb24gJWxzIGF0ICclbHMnXG4iLApAQCAtNjU1LDcgKzY2Miw3IEBACiAgICAgaWYgKCFvaykKICAgICAgICAgZXJyb3IoUkNfQ1JFQVRFX1BST0NFU1MsIEwiRmFpbGVkIHRvIGdldCBleGl0IGNvZGUgb2YgcHJvY2VzcyIpOwogICAgIGRlYnVnKEwiY2hpbGQgcHJvY2VzcyBleGl0IGNvZGU6ICVkXG4iLCByYyk7Ci0gICAgRXhpdFByb2Nlc3MocmMpOworICAgIGV4aXQocmMpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTA4Miw3ICsxMDg5LDcgQEAKICAgICB7IDMxOTAsIDMyMzAsIEwiMy4zIiB9LAogICAgIHsgMzI1MCwgMzMxMCwgTCIzLjQiIH0sCiAgICAgeyAzMzIwLCAzMzUxLCBMIjMuNSIgfSwKLSAgICB7IDMzNjAsIDMzNjEsIEwiMy42IiB9LAorICAgIHsgMzM2MCwgMzM3NSwgTCIzLjYiIH0sCiAgICAgeyAwIH0KIH07CiAKQEAgLTEwOTQsNyArMTEwMSw3IEBACiAKICAgICBmb3IgKG1wID0gbWFnaWNfdmFsdWVzOyBtcC0+bWluOyBtcCsrKSB7CiAgICAgICAgIGlmICgobWFnaWMgPj0gbXAtPm1pbikgJiYgKG1hZ2ljIDw9IG1wLT5tYXgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBsb2NhdGVfcHl0aG9uKG1wLT52ZXJzaW9uKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGxvY2F0ZV9weXRob24obXAtPnZlcnNpb24sIEZBTFNFKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTExNCw3ICsxMTIxLDcgQEAKICAqLwogICAgIEZJTEUgKiBmcDsKICAgICBlcnJub190IHJjID0gX3dmb3Blbl9zKCZmcCwgKmFyZ3YsIEwicmIiKTsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltCVUZTSVpFXTsKKyAgICBjaGFyIGJ1ZmZlcltCVUZTSVpFXTsKICAgICB3Y2hhcl90IHNoZWJhbmdfbGluZVtCVUZTSVpFICsgMV07CiAgICAgc2l6ZV90IHJlYWQ7CiAgICAgY2hhciAqcDsKQEAgLTExMzYsNyArMTE0Myw4IEBACiAgICAgICAgIGZjbG9zZShmcCk7CiAKICAgICAgICAgaWYgKChyZWFkID49IDQpICYmIChidWZmZXJbM10gPT0gJ1xuJykgJiYgKGJ1ZmZlclsyXSA9PSAnXHInKSkgewotICAgICAgICAgICAgaXAgPSBmaW5kX2J5X21hZ2ljKChidWZmZXJbMV0gPDwgOCB8IGJ1ZmZlclswXSkgJiAweEZGRkYpOworICAgICAgICAgICAgaXAgPSBmaW5kX2J5X21hZ2ljKCgoKHVuc2lnbmVkIGNoYXIpYnVmZmVyWzFdKSA8PCA4IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpYnVmZmVyWzBdKSAmIDB4RkZGRik7CiAgICAgICAgICAgICBpZiAoaXAgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGRlYnVnKEwic2NyaXB0IGZpbGUgaXMgY29tcGlsZWQgYWdhaW5zdCBQeXRob24gJWxzXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGlwLT52ZXJzaW9uKTsKQEAgLTEyNzgsNyArMTI4Niw3IEBACiBmb2xsb3dlZCBieSBhIHZhbGlkIHZlcnNpb24gc3BlY2lmaWVyLlxuUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIGNvdWxkIGNhbGwgdmFsaWRhdGVfdmVyc2lvbihjb21tYW5kKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaXAgPSBsb2NhdGVfcHl0aG9uKGNvbW1hbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgaXAgPSBsb2NhdGVfcHl0aG9uKGNvbW1hbmQsIFRSVUUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlwID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihSQ19OT19QWVRIT04sIEwiUmVxdWVzdGVkIFB5dGhvbiB2ZXJzaW9uIFwKICglbHMpIGlzIG5vdCBpbnN0YWxsZWQiLCBjb21tYW5kKTsKQEAgLTEzNjIsNiArMTM3MCw3IEBACiAgICAgd2NoYXJfdCAqIGF2WzJdOwogI2VuZGlmCiAKKyAgICBzZXR2YnVmKHN0ZGVyciwgKGNoYXIgKilOVUxMLCBfSU9OQkYsIDApOwogICAgIHdwID0gZ2V0X2VudihMIlBZTEFVTkNIX0RFQlVHIik7CiAgICAgaWYgKCh3cCAhPSBOVUxMKSAmJiAoKndwICE9IEwnXDAnKSkKICAgICAgICAgbG9nX2ZwID0gc3RkZXJyOwpAQCAtMTQ4Myw3ICsxNDkyLDcgQEAKICAgICAgICAgcGxlbiA9IHdjc2xlbihwKTsKICAgICAgICAgdmFsaWQgPSAoKnAgPT0gTCctJykgJiYgdmFsaWRhdGVfdmVyc2lvbigmcFsxXSk7CiAgICAgICAgIGlmICh2YWxpZCkgewotICAgICAgICAgICAgaXAgPSBsb2NhdGVfcHl0aG9uKCZwWzFdKTsKKyAgICAgICAgICAgIGlwID0gbG9jYXRlX3B5dGhvbigmcFsxXSwgRkFMU0UpOwogICAgICAgICAgICAgaWYgKGlwID09IE5VTEwpCiAgICAgICAgICAgICAgICAgZXJyb3IoUkNfTk9fUFlUSE9OLCBMIlJlcXVlc3RlZCBQeXRob24gdmVyc2lvbiAoJWxzKSBub3QgXAogaW5zdGFsbGVkIiwgJnBbMV0pOwpAQCAtMTUxMCw3ICsxNTE5LDcgQEAKIAogICAgICAgICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBvbmUsIGxvb2sgZm9yIHRoZSBkZWZhdWx0IFB5dGhvbiAqLwogICAgICAgICBpZiAoZXhlY3V0YWJsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpcCA9IGxvY2F0ZV9weXRob24oTCIiKTsKKyAgICAgICAgICAgIGlwID0gbG9jYXRlX3B5dGhvbihMIiIsIEZBTFNFKTsKICAgICAgICAgICAgIGlmIChpcCA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGVycm9yKFJDX05PX1BZVEhPTiwgTCJDYW4ndCBmaW5kIGEgZGVmYXVsdCBQeXRob24uIik7CiAgICAgICAgICAgICBleGVjdXRhYmxlID0gaXAtPmV4ZWN1dGFibGU7CmRpZmYgLS1naXQgYS9QQy9sYXVuY2hlci5pY28gYi9QQy9sYXVuY2hlci5pY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZDdkNTcuLjAwMDAwMDAKLS0tIGEvUEMvbGF1bmNoZXIuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvUEMvbXN2Y3J0bW9kdWxlLmMgYi9QQy9tc3ZjcnRtb2R1bGUuYwppbmRleCBiMDczOWQwLi5jOWQxZTZjIDEwMDY0NAotLS0gYS9QQy9tc3ZjcnRtb2R1bGUuYworKysgYi9QQy9tc3ZjcnRtb2R1bGUuYwpAQCAtMzMsMTIgKzMzLDEyIEBACiAjZW5kaWYKIAogLypbcHl0aG9uIGlucHV0XQotY2xhc3MgUHlfaW50cHRyX3RfY29udmVydGVyKENDb252ZXJ0ZXIpOgotICAgIHR5cGUgPSAnUHlfaW50cHRyX3QnCitjbGFzcyBpbnRwdHJfdF9jb252ZXJ0ZXIoQ0NvbnZlcnRlcik6CisgICAgdHlwZSA9ICdpbnRwdHJfdCcKICAgICBmb3JtYXRfdW5pdCA9ICciX1B5X1BBUlNFX0lOVFBUUiInCiAKIGNsYXNzIGhhbmRsZV9yZXR1cm5fY29udmVydGVyKGxvbmdfcmV0dXJuX2NvbnZlcnRlcik6Ci0gICAgdHlwZSA9ICdQeV9pbnRwdHJfdCcKKyAgICB0eXBlID0gJ2ludHB0cl90JwogICAgIGNhc3QgPSAnKHZvaWQgKiknCiAgICAgY29udmVyc2lvbl9mbiA9ICdQeUxvbmdfRnJvbVZvaWRQdHInCiAKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoCiAgICAgICAgICAgICAncmV0dXJuX3ZhbHVlID0gUHlVbmljb2RlX0Zyb21PcmRpbmFsKF9yZXR1cm5fdmFsdWUpO1xuJykKIFtweXRob24gc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KLS8qW3B5dGhvbiBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTM5YTNlZTVlNmI0YjBkIGlucHV0PTZhNTRmYzRlNzNkMGIzNjddKi8KKy8qW3B5dGhvbiBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTM5YTNlZTVlNmI0YjBkIGlucHV0PWI1OWYxNjYzZGJhMTE5OTddKi8KIAogLypbY2xpbmljIGlucHV0XQogbW9kdWxlIG1zdmNydApAQCAtMTQ4LDcgKzE0OCw3IEBACiAvKltjbGluaWMgaW5wdXRdCiBtc3ZjcnQub3Blbl9vc2ZoYW5kbGUgLT4gbG9uZwogCi0gICAgaGFuZGxlOiBQeV9pbnRwdHJfdAorICAgIGhhbmRsZTogaW50cHRyX3QKICAgICBmbGFnczogaW50CiAgICAgLwogCkBAIC0xNjAsOCArMTYwLDggQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIGxvbmcKLW1zdmNydF9vcGVuX29zZmhhbmRsZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2ludHB0cl90IGhhbmRsZSwgaW50IGZsYWdzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJmNjVlNDIyMjQzYTM5ZjkgaW5wdXQ9NGQ4NTE2ZWQzMmRiOGY2NV0qLworbXN2Y3J0X29wZW5fb3NmaGFuZGxlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50cHRyX3QgaGFuZGxlLCBpbnQgZmxhZ3MpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Y2VkZTg3MWJmOTM5ZDZlMyBpbnB1dD1jYjIxMDhiYmVhODQ1MTRlXSovCiB7CiAgICAgaW50IGZkOwogCkBAIC0xODMsMjIgKzE4MywxNyBAQAogUmFpc2VzIElPRXJyb3IgaWYgZmQgaXMgbm90IHJlY29nbml6ZWQuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKLXN0YXRpYyBQeV9pbnRwdHJfdAorc3RhdGljIGludHB0cl90CiBtc3ZjcnRfZ2V0X29zZmhhbmRsZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludCBmZCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lYWM0NzY0MzMzOGMwYmFhIGlucHV0PWM3ZDE4ZDAyYzgwMTdlYzFdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03Y2U3NjFkZDBkZTJiNTAzIGlucHV0PWM3ZDE4ZDAyYzgwMTdlYzFdKi8KIHsKLSAgICBQeV9pbnRwdHJfdCBoYW5kbGUgPSAtMTsKKyAgICBpbnRwdHJfdCBoYW5kbGUgPSAtMTsKIAotICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkKSkgewotICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0gICAgfQotICAgIGVsc2UgewogICAgIF9QeV9CRUdJTl9TVVBQUkVTU19JUEgKLSAgICAgICAgaGFuZGxlID0gX2dldF9vc2ZoYW5kbGUoZmQpOworICAgIGhhbmRsZSA9IF9nZXRfb3NmaGFuZGxlKGZkKTsKICAgICBfUHlfRU5EX1NVUFBSRVNTX0lQSAotICAgICAgICBpZiAoaGFuZGxlID09IC0xKQotICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotICAgIH0KKyAgICBpZiAoaGFuZGxlID09IC0xKQorICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CiAKICAgICByZXR1cm4gaGFuZGxlOwogfQpAQCAtNTQwLDcgKzUzNSw2IEBACiAjZW5kaWYKIAogICAgIC8qIGNvbnN0YW50cyBmb3IgdGhlIGNydCB2ZXJzaW9ucyAqLwotICAgICh2b2lkKXN0OwogI2lmZGVmIF9WQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTgogICAgIHN0ID0gUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIlZDX0FTU0VNQkxZX1BVQkxJQ0tFWVRPS0VOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTik7CkBAIC01NjYsNiArNTYwLDggQEAKICAgICBzdCA9IFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ1JUX0FTU0VNQkxZX1ZFUlNJT04iLCB2ZXJzaW9uKTsKICAgICBpZiAoc3QgPCAwKSByZXR1cm4gTlVMTDsKICNlbmRpZgorICAgIC8qIG1ha2UgY29tcGlsZXIgd2FybmluZyBxdWlldCBpZiBzdCBpcyB1bnVzZWQgKi8KKyAgICAodm9pZClzdDsKIAogICAgIHJldHVybiBtOwogfQpkaWZmIC0tZ2l0IGEvUEMvcHkuaWNvIGIvUEMvcHkuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzU3YWVmLi4wMDAwMDAwCi0tLSBhL1BDL3B5LmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL3B5Yy5pY28gYi9QQy9weWMuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2JkMmIxLi4wMDAwMDAwCi0tLSBhL1BDL3B5Yy5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9weWNvbi5pY28gYi9QQy9weWNvbi5pY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjYyOWUuLjAwMDAwMDAKLS0tIGEvUEMvcHljb24uaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvUEMvcHljb25maWcuaCBiL1BDL3B5Y29uZmlnLmgKaW5kZXggYWM0ZjhmMi4uNjRlN2FlYyAxMDA2NDQKLS0tIGEvUEMvcHljb25maWcuaAorKysgYi9QQy9weWNvbmZpZy5oCkBAIC0xNCw3ICsxNCw2IEBACiBNU19XSU42NCAtIENvZGUgc3BlY2lmaWMgdG8gdGhlIE1TIFdpbjY0IEFQSQogTVNfV0lOMzIgLSBDb2RlIHNwZWNpZmljIHRvIHRoZSBNUyBXaW4zMiAoYW5kIFdpbjY0KSBBUEkgKG9ic29sZXRlLCB0aGlzIGNvdmVycyBhbGwgc3VwcG9ydGVkIEFQSXMpCiBNU19XSU5ET1dTIC0gQ29kZSBzcGVjaWZpYyB0byBXaW5kb3dzLCBidXQgYWxsIHZlcnNpb25zLgotTVNfV0lOQ0UgLSBDb2RlIHNwZWNpZmljIHRvIFdpbmRvd3MgQ0UKIFB5X0VOQUJMRV9TSEFSRUQgLSBDb2RlIGlmIHRoZSBQeXRob24gY29yZSBpcyBidWlsdCBhcyBhIERMTC4KIAogQWxzbyBub3RlIHRoYXQgbmVpdGhlciAiX01fSVg4NiIgb3IgIl9NU0NfVkVSIiBzaG91bGQgYmUgdXNlZCBmb3IKQEAgLTMwLDEwICsyOSw2IEBACiAKICovCiAKLSNpZmRlZiBfV0lOMzJfV0NFCi0jZGVmaW5lIE1TX1dJTkNFCi0jZW5kaWYKLQogLyogRGVwcmVjYXRlZCBVU0VfRExfRVhQT1JUIG1hY3JvIC0gcGxlYXNlIHVzZSBQeV9CVUlMRF9DT1JFICovCiAjaWZkZWYgVVNFX0RMX0VYUE9SVAogIwlkZWZpbmUgUHlfQlVJTERfQ09SRQpAQCAtNTMsOCArNDgsNiBAQAogI2RlZmluZSBfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFIDEKICNlbmRpZgogCi0vKiBXaW5kb3dzIENFIGRvZXMgbm90IGhhdmUgdGhlc2UgKi8KLSNpZm5kZWYgTVNfV0lOQ0UKICNkZWZpbmUgSEFWRV9JT19ICiAjZGVmaW5lIEhBVkVfU1lTX1VUSU1FX0gKICNkZWZpbmUgSEFWRV9URU1QTkFNCkBAIC02MiwxMSArNTUsOCBAQAogI2RlZmluZSBIQVZFX1RNUE5BTQogI2RlZmluZSBIQVZFX0NMT0NLCiAjZGVmaW5lIEhBVkVfU1RSRVJST1IKLSNlbmRpZgogCi0jaWZkZWYgSEFWRV9JT19ICiAjaW5jbHVkZSA8aW8uaD4KLSNlbmRpZgogCiAjZGVmaW5lIEhBVkVfSFlQT1QKICNkZWZpbmUgSEFWRV9TVFJGVElNRQpAQCAtODYsMTcgKzc2LDYgQEAKICNkZWZpbmUgVVNFX1NPQ0tFVAogI2VuZGlmCiAKLS8qIENFNiBkb2Vzbid0IGhhdmUgc3RyZHVwKCkgYnV0IF9zdHJkdXAoKS4gQXNzdW1lIHRoZSBzYW1lIGZvciBlYXJsaWVyIHZlcnNpb25zLiAqLwotI2lmIGRlZmluZWQoTVNfV0lOQ0UpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgIGRlZmluZSBzdHJkdXAgX3N0cmR1cAotI2VuZGlmCi0KLSNpZmRlZiBNU19XSU5DRQotLyogV2luZG93cyBDRSBkb2VzIG5vdCBzdXBwb3J0IGVudmlyb25tZW50IHZhcmlhYmxlcyAqLwotI2RlZmluZSBnZXRlbnYodikgKE5VTEwpCi0jZGVmaW5lIGVudmlyb24gKE5VTEwpCi0jZW5kaWYKIAogLyogQ29tcGlsZXIgc3BlY2lmaWMgZGVmaW5lcyAqLwogCkBAIC0yODYsNyArMjY1LDYgQEAKICNlbmRpZgogCiAvKiA2NCBiaXQgaW50cyBhcmUgdXN1YWxseSBzcGVsdCBfX2ludDY0IHVubGVzcyBjb21waWxlciBoYXMgb3ZlcnJpZGRlbiAqLwotI2RlZmluZSBIQVZFX0xPTkdfTE9ORyAxCiAjaWZuZGVmIFBZX0xPTkdfTE9ORwogIwlkZWZpbmUgUFlfTE9OR19MT05HIF9faW50NjQKICMJZGVmaW5lIFBZX0xMT05HX01BWCBfSTY0X01BWApAQCAtMzEyLDExICsyOTAsMTEgQEAKIAkJCXRoZWlyIE1ha2VmaWxlIChvdGhlciBjb21waWxlcnMgYXJlIGdlbmVyYWxseQogCQkJdGFrZW4gY2FyZSBvZiBieSBkaXN0dXRpbHMuKSAqLwogIwkJCWlmIGRlZmluZWQoX0RFQlVHKQotIwkJCQlwcmFnbWEgY29tbWVudChsaWIsInB5dGhvbjM1X2QubGliIikKKyMJCQkJcHJhZ21hIGNvbW1lbnQobGliLCJweXRob24zNl9kLmxpYiIpCiAjCQkJZWxpZiBkZWZpbmVkKFB5X0xJTUlURURfQVBJKQogIwkJCQlwcmFnbWEgY29tbWVudChsaWIsInB5dGhvbjMubGliIikKICMJCQllbHNlCi0jCQkJCXByYWdtYSBjb21tZW50KGxpYiwicHl0aG9uMzUubGliIikKKyMJCQkJcHJhZ21hIGNvbW1lbnQobGliLCJweXRob24zNi5saWIiKQogIwkJCWVuZGlmIC8qIF9ERUJVRyAqLwogIwkJZW5kaWYgLyogX01TQ19WRVIgKi8KICMJZW5kaWYgLyogUHlfQlVJTERfQ09SRSAqLwpAQCAtMzg3LDM5ICszNjUsMTAgQEAKIAogLyogZGVmaW5lIHNpZ25lZCBhbmQgdW5zaWduZWQgZXhhY3Qtd2lkdGggMzItYml0IGFuZCA2NC1iaXQgdHlwZXMsIHVzZWQgaW4gdGhlCiAgICBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gaW50ZWdlcnMuICovCi0jaWZuZGVmIFBZX1VJTlQzMl9UCi0jaWYgU0laRU9GX0lOVCA9PSA0Ci0jZGVmaW5lIEhBVkVfVUlOVDMyX1QgMQotI2RlZmluZSBQWV9VSU5UMzJfVCB1bnNpZ25lZCBpbnQKLSNlbGlmIFNJWkVPRl9MT05HID09IDQKLSNkZWZpbmUgSEFWRV9VSU5UMzJfVCAxCi0jZGVmaW5lIFBZX1VJTlQzMl9UIHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgUFlfVUlOVDY0X1QKLSNpZiBTSVpFT0ZfTE9OR19MT05HID09IDgKLSNkZWZpbmUgSEFWRV9VSU5UNjRfVCAxCi0jZGVmaW5lIFBZX1VJTlQ2NF9UIHVuc2lnbmVkIFBZX0xPTkdfTE9ORwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBQWV9JTlQzMl9UCi0jaWYgU0laRU9GX0lOVCA9PSA0Ci0jZGVmaW5lIEhBVkVfSU5UMzJfVCAxCi0jZGVmaW5lIFBZX0lOVDMyX1QgaW50Ci0jZWxpZiBTSVpFT0ZfTE9ORyA9PSA0Ci0jZGVmaW5lIEhBVkVfSU5UMzJfVCAxCi0jZGVmaW5lIFBZX0lOVDMyX1QgbG9uZwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBQWV9JTlQ2NF9UCi0jaWYgU0laRU9GX0xPTkdfTE9ORyA9PSA4Ci0jZGVmaW5lIEhBVkVfSU5UNjRfVCAxCi0jZGVmaW5lIFBZX0lOVDY0X1QgUFlfTE9OR19MT05HCi0jZW5kaWYKLSNlbmRpZgorI2RlZmluZSBQWV9VSU5UMzJfVCB1aW50MzJfdAorI2RlZmluZSBQWV9VSU5UNjRfVCB1aW50NjRfdAorI2RlZmluZSBQWV9JTlQzMl9UIGludDMyX3QKKyNkZWZpbmUgUFlfSU5UNjRfVCBpbnQ2NF90CiAKIC8qIEZhaXJseSBzdGFuZGFyZCBmcm9tIGhlcmUhICovCiAKQEAgLTQ0OCwxNCArMzk3LDEwIEBACiAvKiAjZGVmaW5lIGNvbnN0ICAqLwogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNvbmlvLmg+IGhlYWRlciBmaWxlLiAqLwotI2lmbmRlZiBNU19XSU5DRQogI2RlZmluZSBIQVZFX0NPTklPX0ggMQotI2VuZGlmCiAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZWN0Lmg+IGhlYWRlciBmaWxlLiAqLwotI2lmbmRlZiBNU19XSU5DRQogI2RlZmluZSBIQVZFX0RJUkVDVF9IIDEKLSNlbmRpZgogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgZGlyZW50LmguICAqLwogLyogI2RlZmluZSBESVJFTlQgMSAqLwpAQCAtNTI4LDkgKzQ3Myw3IEBACiAvKiAjZGVmaW5lIEhBVkVfQUxUWk9ORSAqLwogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfUFVURU5WCi0jZW5kaWYKIAogLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwogI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKQEAgLTU1OCw5ICs1MDEsNyBAQAogI2RlZmluZSBIQVZFX0RZTkFNSUNfTE9BRElORwogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgZnRpbWUuICAqLwotI2lmbmRlZiBNU19XSU5DRQogI2RlZmluZSBIQVZFX0ZUSU1FCi0jZW5kaWYKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIGdldHBlZXJuYW1lLiAgKi8KICNkZWZpbmUgSEFWRV9HRVRQRUVSTkFNRQpAQCAtNTY5LDkgKzUxMCw3IEBACiAvKiAjdW5kZWYgSEFWRV9HRVRQR1JQICovCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSBnZXRwaWQuICAqLwotI2lmbmRlZiBNU19XSU5DRQogI2RlZmluZSBIQVZFX0dFVFBJRAotI2VuZGlmCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSBnZXR0aW1lb2ZkYXkuICAqLwogLyogI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZICovCkBAIC02MzMsMTQgKzU3MiwxMCBAQAogI2VuZGlmCiAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgd2NzY29sbCcgZnVuY3Rpb24uICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfV0NTQ09MTCAxCi0jZW5kaWYKIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3Y3N4ZnJtJyBmdW5jdGlvbi4gKi8KLSNpZm5kZWYgTVNfV0lOQ0UKICNkZWZpbmUgSEFWRV9XQ1NYRlJNIDEKLSNlbmRpZgogCiAvKiBEZWZpbmUgaWYgdGhlIHpsaWIgbGlicmFyeSBoYXMgaW5mbGF0ZUNvcHkgKi8KICNkZWZpbmUgSEFWRV9aTElCX0NPUFkgMQpAQCAtNjQ5LDI0ICs1ODQsMTYgQEAKIC8qICN1bmRlZiBIQVZFX0RMRkNOX0ggKi8KIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KLSNpZm5kZWYgTVNfV0lOQ0UKICNkZWZpbmUgSEFWRV9FUlJOT19IIDEKLSNlbmRpZgogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfRkNOVExfSCAxCi0jZW5kaWYKIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwcm9jZXNzLmg+IGhlYWRlciBmaWxlLiAqLwotI2lmbmRlZiBNU19XSU5DRQogI2RlZmluZSBIQVZFX1BST0NFU1NfSCAxCi0jZW5kaWYKIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfU0lHTkFMX0ggMQotI2VuZGlmCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBwcm90b3R5cGVzLiAgKi8KICNkZWZpbmUgSEFWRV9TVERBUkdfUFJPVE9UWVBFUwpAQCAtNjg0LDkgKzYxMSw3IEBACiAvKiAjZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9IIDEgKi8KIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCi0jZW5kaWYKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwogLyogI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMSAqLwpAQCAtNjk1LDkgKzYyMCw3IEBACiAvKiAjZGVmaW5lIEhBVkVfU1lTX1RJTUVTX0ggMSAqLwogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotI2VuZGlmCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy91bi5oPiBoZWFkZXIgZmlsZS4gICovCiAvKiAjZGVmaW5lIEhBVkVfU1lTX1VOX0ggMSAqLwpAQCAtNzIwLDYgKzY0Myw5IEBACiAvKiBUaGUgc2l6ZSBvZiBgd2NoYXJfdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KICNkZWZpbmUgU0laRU9GX1dDSEFSX1QgMgogCisvKiBUaGUgc2l6ZSBvZiBgX0Jvb2wnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9fQk9PTCAxCisKIC8qIFRoZSBzaXplIG9mIGBwaWRfdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KICNkZWZpbmUgU0laRU9GX1BJRF9UIFNJWkVPRl9JTlQKIApkaWZmIC0tZ2l0IGEvUEMvcHlsYXVuY2hlci5yYyBiL1BDL3B5bGF1bmNoZXIucmMKaW5kZXggYThkYjBhOC4uM2RhMzQ0NSAxMDA2NDQKLS0tIGEvUEMvcHlsYXVuY2hlci5yYworKysgYi9QQy9weWxhdW5jaGVyLnJjCkBAIC03LDkgKzcsMTMgQEAKICNpbmNsdWRlIDx3aW51c2VyLmg+CiAxIFJUX01BTklGRVNUICJweXRob24ubWFuaWZlc3QiCiAKLTEgSUNPTiBESVNDQVJEQUJMRSAibGF1bmNoZXIuaWNvIiAKLTIgSUNPTiBESVNDQVJEQUJMRSAicHkuaWNvIiAKLTMgSUNPTiBESVNDQVJEQUJMRSAicHljLmljbyIgCisxIElDT04gRElTQ0FSREFCTEUgImljb25zXGxhdW5jaGVyLmljbyIgCisyIElDT04gRElTQ0FSREFCTEUgImljb25zXHB5LmljbyIgCiszIElDT04gRElTQ0FSREFCTEUgImljb25zXHB5Yy5pY28iIAorNCBJQ09OIERJU0NBUkRBQkxFICJpY29uc1xweWQuaWNvIiAKKzUgSUNPTiBESVNDQVJEQUJMRSAiaWNvbnNccHl0aG9uLmljbyIKKzYgSUNPTiBESVNDQVJEQUJMRSAiaWNvbnNccHl0aG9udy5pY28iCis3IElDT04gRElTQ0FSREFCTEUgImljb25zXHNldHVwLmljbyIgCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLwpkaWZmIC0tZ2l0IGEvUEMvcHl0aG9uLm1hbmlmZXN0IGIvUEMvcHl0aG9uLm1hbmlmZXN0CmluZGV4IGQ2ZTRiYmEuLjRlNzNkNjAgMTAwNjQ0Ci0tLSBhL1BDL3B5dGhvbi5tYW5pZmVzdAorKysgYi9QQy9weXRob24ubWFuaWZlc3QKQEAgLTE2LDEwICsxNiwxNSBAQAogICAgICAgPHN1cHBvcnRlZE9TIElkPSJ7OGUwZjdhMTItYmZiMy00ZmU4LWI5YTUtNDhmZDUwYTE1YTlhfSIvPgogICAgIDwvYXBwbGljYXRpb24+IAogICA8L2NvbXBhdGliaWxpdHk+CisgIDxhcHBsaWNhdGlvbiB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjMiPgorICAgIDx3aW5kb3dzU2V0dGluZ3M+CisgICAgICA8bG9uZ1BhdGhBd2FyZSB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9TTUkvMjAxNi9XaW5kb3dzU2V0dGluZ3MiPnRydWU8L2xvbmdQYXRoQXdhcmU+CisgICAgPC93aW5kb3dzU2V0dGluZ3M+CisgIDwvYXBwbGljYXRpb24+CiAgIDxkZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KICAgICAgIDxhc3NlbWJseUlkZW50aXR5IHR5cGU9IndpbjMyIiBuYW1lPSJNaWNyb3NvZnQuV2luZG93cy5Db21tb24tQ29udHJvbHMiCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPSI2LjAuMC4wIiBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9IioiIHB1YmxpY0tleVRva2VuPSI2NTk1YjY0MTQ0Y2NmMWRmIiBsYW5ndWFnZT0iKiIgLz4KICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgogICA8L2RlcGVuZGVuY3k+Ci08L2Fzc2VtYmx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9QQy9weXRob24zLmRlZiBiL1BDL3B5dGhvbjMuZGVmCmluZGV4IDg4YzA3NDIuLmU4ZDJkOGMgMTAwNjQ0Ci0tLSBhL1BDL3B5dGhvbjMuZGVmCisrKyBiL1BDL3B5dGhvbjMuZGVmCkBAIC0yLDcxMiArMiw3MTMgQEAKIDsgSXQgaXMgdXNlZCB3aGVuIGJ1aWxkaW5nIHB5dGhvbjNkbGwudmN4cHJvagogTElCUkFSWQkicHl0aG9uMyIKIEVYUE9SVFMKLSAgUHlBcmdfUGFyc2U9cHl0aG9uMzUuUHlBcmdfUGFyc2UKLSAgUHlBcmdfUGFyc2VUdXBsZT1weXRob24zNS5QeUFyZ19QYXJzZVR1cGxlCi0gIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcz1weXRob24zNS5QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMKLSAgUHlBcmdfVW5wYWNrVHVwbGU9cHl0aG9uMzUuUHlBcmdfVW5wYWNrVHVwbGUKLSAgUHlBcmdfVmFQYXJzZT1weXRob24zNS5QeUFyZ19WYVBhcnNlCi0gIFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzPXB5dGhvbjM1LlB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzCi0gIFB5QXJnX1ZhbGlkYXRlS2V5d29yZEFyZ3VtZW50cz1weXRob24zNS5QeUFyZ19WYWxpZGF0ZUtleXdvcmRBcmd1bWVudHMKLSAgUHlCYXNlT2JqZWN0X1R5cGU9cHl0aG9uMzUuUHlCYXNlT2JqZWN0X1R5cGUgREFUQQotICBQeUJvb2xfRnJvbUxvbmc9cHl0aG9uMzUuUHlCb29sX0Zyb21Mb25nCi0gIFB5Qm9vbF9UeXBlPXB5dGhvbjM1LlB5Qm9vbF9UeXBlIERBVEEKLSAgUHlCeXRlQXJyYXlJdGVyX1R5cGU9cHl0aG9uMzUuUHlCeXRlQXJyYXlJdGVyX1R5cGUgREFUQQotICBQeUJ5dGVBcnJheV9Bc1N0cmluZz1weXRob24zNS5QeUJ5dGVBcnJheV9Bc1N0cmluZwotICBQeUJ5dGVBcnJheV9Db25jYXQ9cHl0aG9uMzUuUHlCeXRlQXJyYXlfQ29uY2F0Ci0gIFB5Qnl0ZUFycmF5X0Zyb21PYmplY3Q9cHl0aG9uMzUuUHlCeXRlQXJyYXlfRnJvbU9iamVjdAotICBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNS5QeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZQotICBQeUJ5dGVBcnJheV9SZXNpemU9cHl0aG9uMzUuUHlCeXRlQXJyYXlfUmVzaXplCi0gIFB5Qnl0ZUFycmF5X1NpemU9cHl0aG9uMzUuUHlCeXRlQXJyYXlfU2l6ZQotICBQeUJ5dGVBcnJheV9UeXBlPXB5dGhvbjM1LlB5Qnl0ZUFycmF5X1R5cGUgREFUQQotICBQeUJ5dGVzSXRlcl9UeXBlPXB5dGhvbjM1LlB5Qnl0ZXNJdGVyX1R5cGUgREFUQQotICBQeUJ5dGVzX0FzU3RyaW5nPXB5dGhvbjM1LlB5Qnl0ZXNfQXNTdHJpbmcKLSAgUHlCeXRlc19Bc1N0cmluZ0FuZFNpemU9cHl0aG9uMzUuUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUKLSAgUHlCeXRlc19Db25jYXQ9cHl0aG9uMzUuUHlCeXRlc19Db25jYXQKLSAgUHlCeXRlc19Db25jYXRBbmREZWw9cHl0aG9uMzUuUHlCeXRlc19Db25jYXRBbmREZWwKLSAgUHlCeXRlc19EZWNvZGVFc2NhcGU9cHl0aG9uMzUuUHlCeXRlc19EZWNvZGVFc2NhcGUKLSAgUHlCeXRlc19Gcm9tRm9ybWF0PXB5dGhvbjM1LlB5Qnl0ZXNfRnJvbUZvcm1hdAotICBQeUJ5dGVzX0Zyb21Gb3JtYXRWPXB5dGhvbjM1LlB5Qnl0ZXNfRnJvbUZvcm1hdFYKLSAgUHlCeXRlc19Gcm9tT2JqZWN0PXB5dGhvbjM1LlB5Qnl0ZXNfRnJvbU9iamVjdAotICBQeUJ5dGVzX0Zyb21TdHJpbmc9cHl0aG9uMzUuUHlCeXRlc19Gcm9tU3RyaW5nCi0gIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzUuUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZQotICBQeUJ5dGVzX1JlcHI9cHl0aG9uMzUuUHlCeXRlc19SZXByCi0gIFB5Qnl0ZXNfU2l6ZT1weXRob24zNS5QeUJ5dGVzX1NpemUKLSAgUHlCeXRlc19UeXBlPXB5dGhvbjM1LlB5Qnl0ZXNfVHlwZSBEQVRBCi0gIFB5Q0Z1bmN0aW9uX0NhbGw9cHl0aG9uMzUuUHlDRnVuY3Rpb25fQ2FsbAotICBQeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0PXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3QKLSAgUHlDRnVuY3Rpb25fR2V0RmxhZ3M9cHl0aG9uMzUuUHlDRnVuY3Rpb25fR2V0RmxhZ3MKLSAgUHlDRnVuY3Rpb25fR2V0RnVuY3Rpb249cHl0aG9uMzUuUHlDRnVuY3Rpb25fR2V0RnVuY3Rpb24KLSAgUHlDRnVuY3Rpb25fR2V0U2VsZj1weXRob24zNS5QeUNGdW5jdGlvbl9HZXRTZWxmCi0gIFB5Q0Z1bmN0aW9uX05ldz1weXRob24zNS5QeUNGdW5jdGlvbl9OZXcKLSAgUHlDRnVuY3Rpb25fTmV3RXg9cHl0aG9uMzUuUHlDRnVuY3Rpb25fTmV3RXgKLSAgUHlDRnVuY3Rpb25fVHlwZT1weXRob24zNS5QeUNGdW5jdGlvbl9UeXBlIERBVEEKLSAgUHlDYWxsSXRlcl9OZXc9cHl0aG9uMzUuUHlDYWxsSXRlcl9OZXcKLSAgUHlDYWxsSXRlcl9UeXBlPXB5dGhvbjM1LlB5Q2FsbEl0ZXJfVHlwZSBEQVRBCi0gIFB5Q2FsbGFibGVfQ2hlY2s9cHl0aG9uMzUuUHlDYWxsYWJsZV9DaGVjawotICBQeUNhcHN1bGVfR2V0Q29udGV4dD1weXRob24zNS5QeUNhcHN1bGVfR2V0Q29udGV4dAotICBQeUNhcHN1bGVfR2V0RGVzdHJ1Y3Rvcj1weXRob24zNS5QeUNhcHN1bGVfR2V0RGVzdHJ1Y3RvcgotICBQeUNhcHN1bGVfR2V0TmFtZT1weXRob24zNS5QeUNhcHN1bGVfR2V0TmFtZQotICBQeUNhcHN1bGVfR2V0UG9pbnRlcj1weXRob24zNS5QeUNhcHN1bGVfR2V0UG9pbnRlcgotICBQeUNhcHN1bGVfSW1wb3J0PXB5dGhvbjM1LlB5Q2Fwc3VsZV9JbXBvcnQKLSAgUHlDYXBzdWxlX0lzVmFsaWQ9cHl0aG9uMzUuUHlDYXBzdWxlX0lzVmFsaWQKLSAgUHlDYXBzdWxlX05ldz1weXRob24zNS5QeUNhcHN1bGVfTmV3Ci0gIFB5Q2Fwc3VsZV9TZXRDb250ZXh0PXB5dGhvbjM1LlB5Q2Fwc3VsZV9TZXRDb250ZXh0Ci0gIFB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yPXB5dGhvbjM1LlB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yCi0gIFB5Q2Fwc3VsZV9TZXROYW1lPXB5dGhvbjM1LlB5Q2Fwc3VsZV9TZXROYW1lCi0gIFB5Q2Fwc3VsZV9TZXRQb2ludGVyPXB5dGhvbjM1LlB5Q2Fwc3VsZV9TZXRQb2ludGVyCi0gIFB5Q2Fwc3VsZV9UeXBlPXB5dGhvbjM1LlB5Q2Fwc3VsZV9UeXBlIERBVEEKLSAgUHlDbGFzc01ldGhvZERlc2NyX1R5cGU9cHl0aG9uMzUuUHlDbGFzc01ldGhvZERlc2NyX1R5cGUgREFUQQotICBQeUNvZGVjX0JhY2tzbGFzaFJlcGxhY2VFcnJvcnM9cHl0aG9uMzUuUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzCi0gIFB5Q29kZWNfRGVjb2RlPXB5dGhvbjM1LlB5Q29kZWNfRGVjb2RlCi0gIFB5Q29kZWNfRGVjb2Rlcj1weXRob24zNS5QeUNvZGVjX0RlY29kZXIKLSAgUHlDb2RlY19FbmNvZGU9cHl0aG9uMzUuUHlDb2RlY19FbmNvZGUKLSAgUHlDb2RlY19FbmNvZGVyPXB5dGhvbjM1LlB5Q29kZWNfRW5jb2RlcgotICBQeUNvZGVjX0lnbm9yZUVycm9ycz1weXRob24zNS5QeUNvZGVjX0lnbm9yZUVycm9ycwotICBQeUNvZGVjX0luY3JlbWVudGFsRGVjb2Rlcj1weXRob24zNS5QeUNvZGVjX0luY3JlbWVudGFsRGVjb2RlcgotICBQeUNvZGVjX0luY3JlbWVudGFsRW5jb2Rlcj1weXRob24zNS5QeUNvZGVjX0luY3JlbWVudGFsRW5jb2RlcgotICBQeUNvZGVjX0tub3duRW5jb2Rpbmc9cHl0aG9uMzUuUHlDb2RlY19Lbm93bkVuY29kaW5nCi0gIFB5Q29kZWNfTG9va3VwRXJyb3I9cHl0aG9uMzUuUHlDb2RlY19Mb29rdXBFcnJvcgotICBQeUNvZGVjX1JlZ2lzdGVyPXB5dGhvbjM1LlB5Q29kZWNfUmVnaXN0ZXIKLSAgUHlDb2RlY19SZWdpc3RlckVycm9yPXB5dGhvbjM1LlB5Q29kZWNfUmVnaXN0ZXJFcnJvcgotICBQeUNvZGVjX1JlcGxhY2VFcnJvcnM9cHl0aG9uMzUuUHlDb2RlY19SZXBsYWNlRXJyb3JzCi0gIFB5Q29kZWNfU3RyZWFtUmVhZGVyPXB5dGhvbjM1LlB5Q29kZWNfU3RyZWFtUmVhZGVyCi0gIFB5Q29kZWNfU3RyZWFtV3JpdGVyPXB5dGhvbjM1LlB5Q29kZWNfU3RyZWFtV3JpdGVyCi0gIFB5Q29kZWNfU3RyaWN0RXJyb3JzPXB5dGhvbjM1LlB5Q29kZWNfU3RyaWN0RXJyb3JzCi0gIFB5Q29kZWNfWE1MQ2hhclJlZlJlcGxhY2VFcnJvcnM9cHl0aG9uMzUuUHlDb2RlY19YTUxDaGFyUmVmUmVwbGFjZUVycm9ycwotICBQeUNvbXBsZXhfRnJvbURvdWJsZXM9cHl0aG9uMzUuUHlDb21wbGV4X0Zyb21Eb3VibGVzCi0gIFB5Q29tcGxleF9JbWFnQXNEb3VibGU9cHl0aG9uMzUuUHlDb21wbGV4X0ltYWdBc0RvdWJsZQotICBQeUNvbXBsZXhfUmVhbEFzRG91YmxlPXB5dGhvbjM1LlB5Q29tcGxleF9SZWFsQXNEb3VibGUKLSAgUHlDb21wbGV4X1R5cGU9cHl0aG9uMzUuUHlDb21wbGV4X1R5cGUgREFUQQotICBQeURlc2NyX05ld0NsYXNzTWV0aG9kPXB5dGhvbjM1LlB5RGVzY3JfTmV3Q2xhc3NNZXRob2QKLSAgUHlEZXNjcl9OZXdHZXRTZXQ9cHl0aG9uMzUuUHlEZXNjcl9OZXdHZXRTZXQKLSAgUHlEZXNjcl9OZXdNZW1iZXI9cHl0aG9uMzUuUHlEZXNjcl9OZXdNZW1iZXIKLSAgUHlEZXNjcl9OZXdNZXRob2Q9cHl0aG9uMzUuUHlEZXNjcl9OZXdNZXRob2QKLSAgUHlEaWN0SXRlbXNfVHlwZT1weXRob24zNS5QeURpY3RJdGVtc19UeXBlIERBVEEKLSAgUHlEaWN0SXRlckl0ZW1fVHlwZT1weXRob24zNS5QeURpY3RJdGVySXRlbV9UeXBlIERBVEEKLSAgUHlEaWN0SXRlcktleV9UeXBlPXB5dGhvbjM1LlB5RGljdEl0ZXJLZXlfVHlwZSBEQVRBCi0gIFB5RGljdEl0ZXJWYWx1ZV9UeXBlPXB5dGhvbjM1LlB5RGljdEl0ZXJWYWx1ZV9UeXBlIERBVEEKLSAgUHlEaWN0S2V5c19UeXBlPXB5dGhvbjM1LlB5RGljdEtleXNfVHlwZSBEQVRBCi0gIFB5RGljdFByb3h5X05ldz1weXRob24zNS5QeURpY3RQcm94eV9OZXcKLSAgUHlEaWN0UHJveHlfVHlwZT1weXRob24zNS5QeURpY3RQcm94eV9UeXBlIERBVEEKLSAgUHlEaWN0VmFsdWVzX1R5cGU9cHl0aG9uMzUuUHlEaWN0VmFsdWVzX1R5cGUgREFUQQotICBQeURpY3RfQ2xlYXI9cHl0aG9uMzUuUHlEaWN0X0NsZWFyCi0gIFB5RGljdF9Db250YWlucz1weXRob24zNS5QeURpY3RfQ29udGFpbnMKLSAgUHlEaWN0X0NvcHk9cHl0aG9uMzUuUHlEaWN0X0NvcHkKLSAgUHlEaWN0X0RlbEl0ZW09cHl0aG9uMzUuUHlEaWN0X0RlbEl0ZW0KLSAgUHlEaWN0X0RlbEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlEaWN0X0RlbEl0ZW1TdHJpbmcKLSAgUHlEaWN0X0dldEl0ZW09cHl0aG9uMzUuUHlEaWN0X0dldEl0ZW0KLSAgUHlEaWN0X0dldEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlEaWN0X0dldEl0ZW1TdHJpbmcKLSAgUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3I9cHl0aG9uMzUuUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3IKLSAgUHlEaWN0X0l0ZW1zPXB5dGhvbjM1LlB5RGljdF9JdGVtcwotICBQeURpY3RfS2V5cz1weXRob24zNS5QeURpY3RfS2V5cwotICBQeURpY3RfTWVyZ2U9cHl0aG9uMzUuUHlEaWN0X01lcmdlCi0gIFB5RGljdF9NZXJnZUZyb21TZXEyPXB5dGhvbjM1LlB5RGljdF9NZXJnZUZyb21TZXEyCi0gIFB5RGljdF9OZXc9cHl0aG9uMzUuUHlEaWN0X05ldwotICBQeURpY3RfTmV4dD1weXRob24zNS5QeURpY3RfTmV4dAotICBQeURpY3RfU2V0SXRlbT1weXRob24zNS5QeURpY3RfU2V0SXRlbQotICBQeURpY3RfU2V0SXRlbVN0cmluZz1weXRob24zNS5QeURpY3RfU2V0SXRlbVN0cmluZwotICBQeURpY3RfU2l6ZT1weXRob24zNS5QeURpY3RfU2l6ZQotICBQeURpY3RfVHlwZT1weXRob24zNS5QeURpY3RfVHlwZSBEQVRBCi0gIFB5RGljdF9VcGRhdGU9cHl0aG9uMzUuUHlEaWN0X1VwZGF0ZQotICBQeURpY3RfVmFsdWVzPXB5dGhvbjM1LlB5RGljdF9WYWx1ZXMKLSAgUHlFbGxpcHNpc19UeXBlPXB5dGhvbjM1LlB5RWxsaXBzaXNfVHlwZSBEQVRBCi0gIFB5RW51bV9UeXBlPXB5dGhvbjM1LlB5RW51bV9UeXBlIERBVEEKLSAgUHlFcnJfQmFkQXJndW1lbnQ9cHl0aG9uMzUuUHlFcnJfQmFkQXJndW1lbnQKLSAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsPXB5dGhvbjM1LlB5RXJyX0JhZEludGVybmFsQ2FsbAotICBQeUVycl9DaGVja1NpZ25hbHM9cHl0aG9uMzUuUHlFcnJfQ2hlY2tTaWduYWxzCi0gIFB5RXJyX0NsZWFyPXB5dGhvbjM1LlB5RXJyX0NsZWFyCi0gIFB5RXJyX0Rpc3BsYXk9cHl0aG9uMzUuUHlFcnJfRGlzcGxheQotICBQeUVycl9FeGNlcHRpb25NYXRjaGVzPXB5dGhvbjM1LlB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMKLSAgUHlFcnJfRmV0Y2g9cHl0aG9uMzUuUHlFcnJfRmV0Y2gKLSAgUHlFcnJfRm9ybWF0PXB5dGhvbjM1LlB5RXJyX0Zvcm1hdAotICBQeUVycl9Gb3JtYXRWPXB5dGhvbjM1LlB5RXJyX0Zvcm1hdFYKLSAgUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzPXB5dGhvbjM1LlB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcwotICBQeUVycl9OZXdFeGNlcHRpb249cHl0aG9uMzUuUHlFcnJfTmV3RXhjZXB0aW9uCi0gIFB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2M9cHl0aG9uMzUuUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYwotICBQeUVycl9Ob01lbW9yeT1weXRob24zNS5QeUVycl9Ob01lbW9yeQotICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb249cHl0aG9uMzUuUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uCi0gIFB5RXJyX09jY3VycmVkPXB5dGhvbjM1LlB5RXJyX09jY3VycmVkCi0gIFB5RXJyX1ByaW50PXB5dGhvbjM1LlB5RXJyX1ByaW50Ci0gIFB5RXJyX1ByaW50RXg9cHl0aG9uMzUuUHlFcnJfUHJpbnRFeAotICBQeUVycl9Qcm9ncmFtVGV4dD1weXRob24zNS5QeUVycl9Qcm9ncmFtVGV4dAotICBQeUVycl9SZXN0b3JlPXB5dGhvbjM1LlB5RXJyX1Jlc3RvcmUKLSAgUHlFcnJfU2V0RnJvbUVycm5vPXB5dGhvbjM1LlB5RXJyX1NldEZyb21FcnJubwotICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWU9cHl0aG9uMzUuUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lCi0gIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdD1weXRob24zNS5QeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QKLSAgUHlFcnJfU2V0SW50ZXJydXB0PXB5dGhvbjM1LlB5RXJyX1NldEludGVycnVwdAotICBQeUVycl9TZXROb25lPXB5dGhvbjM1LlB5RXJyX1NldE5vbmUKLSAgUHlFcnJfU2V0T2JqZWN0PXB5dGhvbjM1LlB5RXJyX1NldE9iamVjdAotICBQeUVycl9TZXRTdHJpbmc9cHl0aG9uMzUuUHlFcnJfU2V0U3RyaW5nCi0gIFB5RXJyX1N5bnRheExvY2F0aW9uPXB5dGhvbjM1LlB5RXJyX1N5bnRheExvY2F0aW9uCi0gIFB5RXJyX1dhcm5FeD1weXRob24zNS5QeUVycl9XYXJuRXgKLSAgUHlFcnJfV2FybkV4cGxpY2l0PXB5dGhvbjM1LlB5RXJyX1dhcm5FeHBsaWNpdAotICBQeUVycl9XYXJuRm9ybWF0PXB5dGhvbjM1LlB5RXJyX1dhcm5Gb3JtYXQKLSAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlPXB5dGhvbjM1LlB5RXJyX1dyaXRlVW5yYWlzYWJsZQotICBQeUV2YWxfQWNxdWlyZUxvY2s9cHl0aG9uMzUuUHlFdmFsX0FjcXVpcmVMb2NrCi0gIFB5RXZhbF9BY3F1aXJlVGhyZWFkPXB5dGhvbjM1LlB5RXZhbF9BY3F1aXJlVGhyZWFkCi0gIFB5RXZhbF9DYWxsRnVuY3Rpb249cHl0aG9uMzUuUHlFdmFsX0NhbGxGdW5jdGlvbgotICBQeUV2YWxfQ2FsbE1ldGhvZD1weXRob24zNS5QeUV2YWxfQ2FsbE1ldGhvZAotICBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3Jkcz1weXRob24zNS5QeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcwotICBQeUV2YWxfRXZhbENvZGU9cHl0aG9uMzUuUHlFdmFsX0V2YWxDb2RlCi0gIFB5RXZhbF9FdmFsQ29kZUV4PXB5dGhvbjM1LlB5RXZhbF9FdmFsQ29kZUV4Ci0gIFB5RXZhbF9FdmFsRnJhbWU9cHl0aG9uMzUuUHlFdmFsX0V2YWxGcmFtZQotICBQeUV2YWxfRXZhbEZyYW1lRXg9cHl0aG9uMzUuUHlFdmFsX0V2YWxGcmFtZUV4Ci0gIFB5RXZhbF9HZXRCdWlsdGlucz1weXRob24zNS5QeUV2YWxfR2V0QnVpbHRpbnMKLSAgUHlFdmFsX0dldENhbGxTdGF0cz1weXRob24zNS5QeUV2YWxfR2V0Q2FsbFN0YXRzCi0gIFB5RXZhbF9HZXRGcmFtZT1weXRob24zNS5QeUV2YWxfR2V0RnJhbWUKLSAgUHlFdmFsX0dldEZ1bmNEZXNjPXB5dGhvbjM1LlB5RXZhbF9HZXRGdW5jRGVzYwotICBQeUV2YWxfR2V0RnVuY05hbWU9cHl0aG9uMzUuUHlFdmFsX0dldEZ1bmNOYW1lCi0gIFB5RXZhbF9HZXRHbG9iYWxzPXB5dGhvbjM1LlB5RXZhbF9HZXRHbG9iYWxzCi0gIFB5RXZhbF9HZXRMb2NhbHM9cHl0aG9uMzUuUHlFdmFsX0dldExvY2FscwotICBQeUV2YWxfSW5pdFRocmVhZHM9cHl0aG9uMzUuUHlFdmFsX0luaXRUaHJlYWRzCi0gIFB5RXZhbF9SZUluaXRUaHJlYWRzPXB5dGhvbjM1LlB5RXZhbF9SZUluaXRUaHJlYWRzCi0gIFB5RXZhbF9SZWxlYXNlTG9jaz1weXRob24zNS5QeUV2YWxfUmVsZWFzZUxvY2sKLSAgUHlFdmFsX1JlbGVhc2VUaHJlYWQ9cHl0aG9uMzUuUHlFdmFsX1JlbGVhc2VUaHJlYWQKLSAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQ9cHl0aG9uMzUuUHlFdmFsX1Jlc3RvcmVUaHJlYWQKLSAgUHlFdmFsX1NhdmVUaHJlYWQ9cHl0aG9uMzUuUHlFdmFsX1NhdmVUaHJlYWQKLSAgUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZD1weXRob24zNS5QeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkCi0gIFB5RXhjX0FyaXRobWV0aWNFcnJvcj1weXRob24zNS5QeUV4Y19Bcml0aG1ldGljRXJyb3IgREFUQQotICBQeUV4Y19Bc3NlcnRpb25FcnJvcj1weXRob24zNS5QeUV4Y19Bc3NlcnRpb25FcnJvciBEQVRBCi0gIFB5RXhjX0F0dHJpYnV0ZUVycm9yPXB5dGhvbjM1LlB5RXhjX0F0dHJpYnV0ZUVycm9yIERBVEEKLSAgUHlFeGNfQmFzZUV4Y2VwdGlvbj1weXRob24zNS5QeUV4Y19CYXNlRXhjZXB0aW9uIERBVEEKLSAgUHlFeGNfQnVmZmVyRXJyb3I9cHl0aG9uMzUuUHlFeGNfQnVmZmVyRXJyb3IgREFUQQotICBQeUV4Y19CeXRlc1dhcm5pbmc9cHl0aG9uMzUuUHlFeGNfQnl0ZXNXYXJuaW5nIERBVEEKLSAgUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nPXB5dGhvbjM1LlB5RXhjX0RlcHJlY2F0aW9uV2FybmluZyBEQVRBCi0gIFB5RXhjX0VPRkVycm9yPXB5dGhvbjM1LlB5RXhjX0VPRkVycm9yIERBVEEKLSAgUHlFeGNfRW52aXJvbm1lbnRFcnJvcj1weXRob24zNS5QeUV4Y19FbnZpcm9ubWVudEVycm9yIERBVEEKLSAgUHlFeGNfRXhjZXB0aW9uPXB5dGhvbjM1LlB5RXhjX0V4Y2VwdGlvbiBEQVRBCi0gIFB5RXhjX0Zsb2F0aW5nUG9pbnRFcnJvcj1weXRob24zNS5QeUV4Y19GbG9hdGluZ1BvaW50RXJyb3IgREFUQQotICBQeUV4Y19GdXR1cmVXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX0Z1dHVyZVdhcm5pbmcgREFUQQotICBQeUV4Y19HZW5lcmF0b3JFeGl0PXB5dGhvbjM1LlB5RXhjX0dlbmVyYXRvckV4aXQgREFUQQotICBQeUV4Y19JT0Vycm9yPXB5dGhvbjM1LlB5RXhjX0lPRXJyb3IgREFUQQotICBQeUV4Y19JbXBvcnRFcnJvcj1weXRob24zNS5QeUV4Y19JbXBvcnRFcnJvciBEQVRBCi0gIFB5RXhjX0ltcG9ydFdhcm5pbmc9cHl0aG9uMzUuUHlFeGNfSW1wb3J0V2FybmluZyBEQVRBCi0gIFB5RXhjX0luZGVudGF0aW9uRXJyb3I9cHl0aG9uMzUuUHlFeGNfSW5kZW50YXRpb25FcnJvciBEQVRBCi0gIFB5RXhjX0luZGV4RXJyb3I9cHl0aG9uMzUuUHlFeGNfSW5kZXhFcnJvciBEQVRBCi0gIFB5RXhjX0tleUVycm9yPXB5dGhvbjM1LlB5RXhjX0tleUVycm9yIERBVEEKLSAgUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQ9cHl0aG9uMzUuUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQgREFUQQotICBQeUV4Y19Mb29rdXBFcnJvcj1weXRob24zNS5QeUV4Y19Mb29rdXBFcnJvciBEQVRBCi0gIFB5RXhjX01lbW9yeUVycm9yPXB5dGhvbjM1LlB5RXhjX01lbW9yeUVycm9yIERBVEEKLSAgUHlFeGNfTWVtb3J5RXJyb3JJbnN0PXB5dGhvbjM1LlB5RXhjX01lbW9yeUVycm9ySW5zdCBEQVRBCi0gIFB5RXhjX05hbWVFcnJvcj1weXRob24zNS5QeUV4Y19OYW1lRXJyb3IgREFUQQotICBQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yPXB5dGhvbjM1LlB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IgREFUQQotICBQeUV4Y19PU0Vycm9yPXB5dGhvbjM1LlB5RXhjX09TRXJyb3IgREFUQQotICBQeUV4Y19PdmVyZmxvd0Vycm9yPXB5dGhvbjM1LlB5RXhjX092ZXJmbG93RXJyb3IgREFUQQotICBQeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgREFUQQotICBQeUV4Y19SZWN1cnNpb25FcnJvckluc3Q9cHl0aG9uMzUuUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0IERBVEEKLSAgUHlFeGNfUmVmZXJlbmNlRXJyb3I9cHl0aG9uMzUuUHlFeGNfUmVmZXJlbmNlRXJyb3IgREFUQQotICBQeUV4Y19SdW50aW1lRXJyb3I9cHl0aG9uMzUuUHlFeGNfUnVudGltZUVycm9yIERBVEEKLSAgUHlFeGNfUnVudGltZVdhcm5pbmc9cHl0aG9uMzUuUHlFeGNfUnVudGltZVdhcm5pbmcgREFUQQotICBQeUV4Y19TdG9wSXRlcmF0aW9uPXB5dGhvbjM1LlB5RXhjX1N0b3BJdGVyYXRpb24gREFUQQotICBQeUV4Y19TeW50YXhFcnJvcj1weXRob24zNS5QeUV4Y19TeW50YXhFcnJvciBEQVRBCi0gIFB5RXhjX1N5bnRheFdhcm5pbmc9cHl0aG9uMzUuUHlFeGNfU3ludGF4V2FybmluZyBEQVRBCi0gIFB5RXhjX1N5c3RlbUVycm9yPXB5dGhvbjM1LlB5RXhjX1N5c3RlbUVycm9yIERBVEEKLSAgUHlFeGNfU3lzdGVtRXhpdD1weXRob24zNS5QeUV4Y19TeXN0ZW1FeGl0IERBVEEKLSAgUHlFeGNfVGFiRXJyb3I9cHl0aG9uMzUuUHlFeGNfVGFiRXJyb3IgREFUQQotICBQeUV4Y19UeXBlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVHlwZUVycm9yIERBVEEKLSAgUHlFeGNfVW5ib3VuZExvY2FsRXJyb3I9cHl0aG9uMzUuUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IgREFUQQotICBQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVW5pY29kZURlY29kZUVycm9yIERBVEEKLSAgUHlFeGNfVW5pY29kZUVuY29kZUVycm9yPXB5dGhvbjM1LlB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvciBEQVRBCi0gIFB5RXhjX1VuaWNvZGVFcnJvcj1weXRob24zNS5QeUV4Y19Vbmljb2RlRXJyb3IgREFUQQotICBQeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yIERBVEEKLSAgUHlFeGNfVW5pY29kZVdhcm5pbmc9cHl0aG9uMzUuUHlFeGNfVW5pY29kZVdhcm5pbmcgREFUQQotICBQeUV4Y19Vc2VyV2FybmluZz1weXRob24zNS5QeUV4Y19Vc2VyV2FybmluZyBEQVRBCi0gIFB5RXhjX1ZhbHVlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVmFsdWVFcnJvciBEQVRBCi0gIFB5RXhjX1dhcm5pbmc9cHl0aG9uMzUuUHlFeGNfV2FybmluZyBEQVRBCi0gIFB5RXhjX1plcm9EaXZpc2lvbkVycm9yPXB5dGhvbjM1LlB5RXhjX1plcm9EaXZpc2lvbkVycm9yIERBVEEKLSAgUHlFeGNlcHRpb25fR2V0Q2F1c2U9cHl0aG9uMzUuUHlFeGNlcHRpb25fR2V0Q2F1c2UKLSAgUHlFeGNlcHRpb25fR2V0Q29udGV4dD1weXRob24zNS5QeUV4Y2VwdGlvbl9HZXRDb250ZXh0Ci0gIFB5RXhjZXB0aW9uX0dldFRyYWNlYmFjaz1weXRob24zNS5QeUV4Y2VwdGlvbl9HZXRUcmFjZWJhY2sKLSAgUHlFeGNlcHRpb25fU2V0Q2F1c2U9cHl0aG9uMzUuUHlFeGNlcHRpb25fU2V0Q2F1c2UKLSAgUHlFeGNlcHRpb25fU2V0Q29udGV4dD1weXRob24zNS5QeUV4Y2VwdGlvbl9TZXRDb250ZXh0Ci0gIFB5RXhjZXB0aW9uX1NldFRyYWNlYmFjaz1weXRob24zNS5QeUV4Y2VwdGlvbl9TZXRUcmFjZWJhY2sKLSAgUHlGaWxlX0Zyb21GZD1weXRob24zNS5QeUZpbGVfRnJvbUZkCi0gIFB5RmlsZV9HZXRMaW5lPXB5dGhvbjM1LlB5RmlsZV9HZXRMaW5lCi0gIFB5RmlsZV9Xcml0ZU9iamVjdD1weXRob24zNS5QeUZpbGVfV3JpdGVPYmplY3QKLSAgUHlGaWxlX1dyaXRlU3RyaW5nPXB5dGhvbjM1LlB5RmlsZV9Xcml0ZVN0cmluZwotICBQeUZpbHRlcl9UeXBlPXB5dGhvbjM1LlB5RmlsdGVyX1R5cGUgREFUQQotICBQeUZsb2F0X0FzRG91YmxlPXB5dGhvbjM1LlB5RmxvYXRfQXNEb3VibGUKLSAgUHlGbG9hdF9Gcm9tRG91YmxlPXB5dGhvbjM1LlB5RmxvYXRfRnJvbURvdWJsZQotICBQeUZsb2F0X0Zyb21TdHJpbmc9cHl0aG9uMzUuUHlGbG9hdF9Gcm9tU3RyaW5nCi0gIFB5RmxvYXRfR2V0SW5mbz1weXRob24zNS5QeUZsb2F0X0dldEluZm8KLSAgUHlGbG9hdF9HZXRNYXg9cHl0aG9uMzUuUHlGbG9hdF9HZXRNYXgKLSAgUHlGbG9hdF9HZXRNaW49cHl0aG9uMzUuUHlGbG9hdF9HZXRNaW4KLSAgUHlGbG9hdF9UeXBlPXB5dGhvbjM1LlB5RmxvYXRfVHlwZSBEQVRBCi0gIFB5RnJvemVuU2V0X05ldz1weXRob24zNS5QeUZyb3plblNldF9OZXcKLSAgUHlGcm96ZW5TZXRfVHlwZT1weXRob24zNS5QeUZyb3plblNldF9UeXBlIERBVEEKLSAgUHlHQ19Db2xsZWN0PXB5dGhvbjM1LlB5R0NfQ29sbGVjdAotICBQeUdJTFN0YXRlX0Vuc3VyZT1weXRob24zNS5QeUdJTFN0YXRlX0Vuc3VyZQotICBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZT1weXRob24zNS5QeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZQotICBQeUdJTFN0YXRlX1JlbGVhc2U9cHl0aG9uMzUuUHlHSUxTdGF0ZV9SZWxlYXNlCi0gIFB5R2V0U2V0RGVzY3JfVHlwZT1weXRob24zNS5QeUdldFNldERlc2NyX1R5cGUgREFUQQotICBQeUltcG9ydF9BZGRNb2R1bGU9cHl0aG9uMzUuUHlJbXBvcnRfQWRkTW9kdWxlCi0gIFB5SW1wb3J0X0FwcGVuZEluaXR0YWI9cHl0aG9uMzUuUHlJbXBvcnRfQXBwZW5kSW5pdHRhYgotICBQeUltcG9ydF9DbGVhbnVwPXB5dGhvbjM1LlB5SW1wb3J0X0NsZWFudXAKLSAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGU9cHl0aG9uMzUuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGUKLSAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeD1weXRob24zNS5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4Ci0gIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlV2l0aFBhdGhuYW1lcz1weXRob24zNS5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZVdpdGhQYXRobmFtZXMKLSAgUHlJbXBvcnRfR2V0SW1wb3J0ZXI9cHl0aG9uMzUuUHlJbXBvcnRfR2V0SW1wb3J0ZXIKLSAgUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXI9cHl0aG9uMzUuUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIKLSAgUHlJbXBvcnRfR2V0TWFnaWNUYWc9cHl0aG9uMzUuUHlJbXBvcnRfR2V0TWFnaWNUYWcKLSAgUHlJbXBvcnRfR2V0TW9kdWxlRGljdD1weXRob24zNS5QeUltcG9ydF9HZXRNb2R1bGVEaWN0Ci0gIFB5SW1wb3J0X0ltcG9ydD1weXRob24zNS5QeUltcG9ydF9JbXBvcnQKLSAgUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlPXB5dGhvbjM1LlB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZQotICBQeUltcG9ydF9JbXBvcnRNb2R1bGU9cHl0aG9uMzUuUHlJbXBvcnRfSW1wb3J0TW9kdWxlCi0gIFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsPXB5dGhvbjM1LlB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsCi0gIFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2s9cHl0aG9uMzUuUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jawotICBQeUltcG9ydF9SZWxvYWRNb2R1bGU9cHl0aG9uMzUuUHlJbXBvcnRfUmVsb2FkTW9kdWxlCi0gIFB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcj1weXRob24zNS5QeUludGVycHJldGVyU3RhdGVfQ2xlYXIKLSAgUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZT1weXRob24zNS5QeUludGVycHJldGVyU3RhdGVfRGVsZXRlCi0gIFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXc9cHl0aG9uMzUuUHlJbnRlcnByZXRlclN0YXRlX05ldwotICBQeUl0ZXJfTmV4dD1weXRob24zNS5QeUl0ZXJfTmV4dAotICBQeUxpc3RJdGVyX1R5cGU9cHl0aG9uMzUuUHlMaXN0SXRlcl9UeXBlIERBVEEKLSAgUHlMaXN0UmV2SXRlcl9UeXBlPXB5dGhvbjM1LlB5TGlzdFJldkl0ZXJfVHlwZSBEQVRBCi0gIFB5TGlzdF9BcHBlbmQ9cHl0aG9uMzUuUHlMaXN0X0FwcGVuZAotICBQeUxpc3RfQXNUdXBsZT1weXRob24zNS5QeUxpc3RfQXNUdXBsZQotICBQeUxpc3RfR2V0SXRlbT1weXRob24zNS5QeUxpc3RfR2V0SXRlbQotICBQeUxpc3RfR2V0U2xpY2U9cHl0aG9uMzUuUHlMaXN0X0dldFNsaWNlCi0gIFB5TGlzdF9JbnNlcnQ9cHl0aG9uMzUuUHlMaXN0X0luc2VydAotICBQeUxpc3RfTmV3PXB5dGhvbjM1LlB5TGlzdF9OZXcKLSAgUHlMaXN0X1JldmVyc2U9cHl0aG9uMzUuUHlMaXN0X1JldmVyc2UKLSAgUHlMaXN0X1NldEl0ZW09cHl0aG9uMzUuUHlMaXN0X1NldEl0ZW0KLSAgUHlMaXN0X1NldFNsaWNlPXB5dGhvbjM1LlB5TGlzdF9TZXRTbGljZQotICBQeUxpc3RfU2l6ZT1weXRob24zNS5QeUxpc3RfU2l6ZQotICBQeUxpc3RfU29ydD1weXRob24zNS5QeUxpc3RfU29ydAotICBQeUxpc3RfVHlwZT1weXRob24zNS5QeUxpc3RfVHlwZSBEQVRBCi0gIFB5TG9uZ1JhbmdlSXRlcl9UeXBlPXB5dGhvbjM1LlB5TG9uZ1JhbmdlSXRlcl9UeXBlIERBVEEKLSAgUHlMb25nX0FzRG91YmxlPXB5dGhvbjM1LlB5TG9uZ19Bc0RvdWJsZQotICBQeUxvbmdfQXNMb25nPXB5dGhvbjM1LlB5TG9uZ19Bc0xvbmcKLSAgUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93PXB5dGhvbjM1LlB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdwotICBQeUxvbmdfQXNMb25nTG9uZz1weXRob24zNS5QeUxvbmdfQXNMb25nTG9uZwotICBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93PXB5dGhvbjM1LlB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3cKLSAgUHlMb25nX0FzU2l6ZV90PXB5dGhvbjM1LlB5TG9uZ19Bc1NpemVfdAotICBQeUxvbmdfQXNTc2l6ZV90PXB5dGhvbjM1LlB5TG9uZ19Bc1NzaXplX3QKLSAgUHlMb25nX0FzVW5zaWduZWRMb25nPXB5dGhvbjM1LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZwotICBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nPXB5dGhvbjM1LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcKLSAgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2s9cHl0aG9uMzUuUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2sKLSAgUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaz1weXRob24zNS5QeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrCi0gIFB5TG9uZ19Bc1ZvaWRQdHI9cHl0aG9uMzUuUHlMb25nX0FzVm9pZFB0cgotICBQeUxvbmdfRnJvbURvdWJsZT1weXRob24zNS5QeUxvbmdfRnJvbURvdWJsZQotICBQeUxvbmdfRnJvbUxvbmc9cHl0aG9uMzUuUHlMb25nX0Zyb21Mb25nCi0gIFB5TG9uZ19Gcm9tTG9uZ0xvbmc9cHl0aG9uMzUuUHlMb25nX0Zyb21Mb25nTG9uZwotICBQeUxvbmdfRnJvbVNpemVfdD1weXRob24zNS5QeUxvbmdfRnJvbVNpemVfdAotICBQeUxvbmdfRnJvbVNzaXplX3Q9cHl0aG9uMzUuUHlMb25nX0Zyb21Tc2l6ZV90Ci0gIFB5TG9uZ19Gcm9tU3RyaW5nPXB5dGhvbjM1LlB5TG9uZ19Gcm9tU3RyaW5nCi0gIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nPXB5dGhvbjM1LlB5TG9uZ19Gcm9tVW5zaWduZWRMb25nCi0gIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZz1weXRob24zNS5QeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcKLSAgUHlMb25nX0Zyb21Wb2lkUHRyPXB5dGhvbjM1LlB5TG9uZ19Gcm9tVm9pZFB0cgotICBQeUxvbmdfR2V0SW5mbz1weXRob24zNS5QeUxvbmdfR2V0SW5mbwotICBQeUxvbmdfVHlwZT1weXRob24zNS5QeUxvbmdfVHlwZSBEQVRBCi0gIFB5TWFwX1R5cGU9cHl0aG9uMzUuUHlNYXBfVHlwZSBEQVRBCi0gIFB5TWFwcGluZ19DaGVjaz1weXRob24zNS5QeU1hcHBpbmdfQ2hlY2sKLSAgUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcKLSAgUHlNYXBwaW5nX0hhc0tleT1weXRob24zNS5QeU1hcHBpbmdfSGFzS2V5Ci0gIFB5TWFwcGluZ19IYXNLZXlTdHJpbmc9cHl0aG9uMzUuUHlNYXBwaW5nX0hhc0tleVN0cmluZwotICBQeU1hcHBpbmdfSXRlbXM9cHl0aG9uMzUuUHlNYXBwaW5nX0l0ZW1zCi0gIFB5TWFwcGluZ19LZXlzPXB5dGhvbjM1LlB5TWFwcGluZ19LZXlzCi0gIFB5TWFwcGluZ19MZW5ndGg9cHl0aG9uMzUuUHlNYXBwaW5nX0xlbmd0aAotICBQeU1hcHBpbmdfU2V0SXRlbVN0cmluZz1weXRob24zNS5QeU1hcHBpbmdfU2V0SXRlbVN0cmluZwotICBQeU1hcHBpbmdfU2l6ZT1weXRob24zNS5QeU1hcHBpbmdfU2l6ZQotICBQeU1hcHBpbmdfVmFsdWVzPXB5dGhvbjM1LlB5TWFwcGluZ19WYWx1ZXMKLSAgUHlNZW1fRnJlZT1weXRob24zNS5QeU1lbV9GcmVlCi0gIFB5TWVtX01hbGxvYz1weXRob24zNS5QeU1lbV9NYWxsb2MKLSAgUHlNZW1fUmVhbGxvYz1weXRob24zNS5QeU1lbV9SZWFsbG9jCi0gIFB5TWVtYmVyRGVzY3JfVHlwZT1weXRob24zNS5QeU1lbWJlckRlc2NyX1R5cGUgREFUQQotICBQeU1lbW9yeVZpZXdfRnJvbU9iamVjdD1weXRob24zNS5QeU1lbW9yeVZpZXdfRnJvbU9iamVjdAotICBQeU1lbW9yeVZpZXdfR2V0Q29udGlndW91cz1weXRob24zNS5QeU1lbW9yeVZpZXdfR2V0Q29udGlndW91cwotICBQeU1lbW9yeVZpZXdfVHlwZT1weXRob24zNS5QeU1lbW9yeVZpZXdfVHlwZSBEQVRBCi0gIFB5TWV0aG9kRGVzY3JfVHlwZT1weXRob24zNS5QeU1ldGhvZERlc2NyX1R5cGUgREFUQQotICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudD1weXRob24zNS5QeU1vZHVsZV9BZGRJbnRDb25zdGFudAotICBQeU1vZHVsZV9BZGRPYmplY3Q9cHl0aG9uMzUuUHlNb2R1bGVfQWRkT2JqZWN0Ci0gIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50PXB5dGhvbjM1LlB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50Ci0gIFB5TW9kdWxlX0NyZWF0ZTI9cHl0aG9uMzUuUHlNb2R1bGVfQ3JlYXRlMgotICBQeU1vZHVsZV9HZXREZWY9cHl0aG9uMzUuUHlNb2R1bGVfR2V0RGVmCi0gIFB5TW9kdWxlX0dldERpY3Q9cHl0aG9uMzUuUHlNb2R1bGVfR2V0RGljdAotICBQeU1vZHVsZV9HZXRGaWxlbmFtZT1weXRob24zNS5QeU1vZHVsZV9HZXRGaWxlbmFtZQotICBQeU1vZHVsZV9HZXRGaWxlbmFtZU9iamVjdD1weXRob24zNS5QeU1vZHVsZV9HZXRGaWxlbmFtZU9iamVjdAotICBQeU1vZHVsZV9HZXROYW1lPXB5dGhvbjM1LlB5TW9kdWxlX0dldE5hbWUKLSAgUHlNb2R1bGVfR2V0U3RhdGU9cHl0aG9uMzUuUHlNb2R1bGVfR2V0U3RhdGUKLSAgUHlNb2R1bGVfTmV3PXB5dGhvbjM1LlB5TW9kdWxlX05ldwotICBQeU1vZHVsZV9UeXBlPXB5dGhvbjM1LlB5TW9kdWxlX1R5cGUgREFUQQotICBQeU1vZHVsZURlZl9Jbml0PXB5dGhvbjM1LlB5TW9kdWxlRGVmX0luaXQKLSAgUHlNb2R1bGVEZWZfVHlwZT1weXRob24zNS5QeU1vZHVsZURlZl9UeXBlIERBVEEKLSAgUHlOdWxsSW1wb3J0ZXJfVHlwZT1weXRob24zNS5QeU51bGxJbXBvcnRlcl9UeXBlIERBVEEKLSAgUHlOdW1iZXJfQWJzb2x1dGU9cHl0aG9uMzUuUHlOdW1iZXJfQWJzb2x1dGUKLSAgUHlOdW1iZXJfQWRkPXB5dGhvbjM1LlB5TnVtYmVyX0FkZAotICBQeU51bWJlcl9BbmQ9cHl0aG9uMzUuUHlOdW1iZXJfQW5kCi0gIFB5TnVtYmVyX0FzU3NpemVfdD1weXRob24zNS5QeU51bWJlcl9Bc1NzaXplX3QKLSAgUHlOdW1iZXJfQ2hlY2s9cHl0aG9uMzUuUHlOdW1iZXJfQ2hlY2sKLSAgUHlOdW1iZXJfRGl2bW9kPXB5dGhvbjM1LlB5TnVtYmVyX0Rpdm1vZAotICBQeU51bWJlcl9GbG9hdD1weXRob24zNS5QeU51bWJlcl9GbG9hdAotICBQeU51bWJlcl9GbG9vckRpdmlkZT1weXRob24zNS5QeU51bWJlcl9GbG9vckRpdmlkZQotICBQeU51bWJlcl9JblBsYWNlQWRkPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VBZGQKLSAgUHlOdW1iZXJfSW5QbGFjZUFuZD1weXRob24zNS5QeU51bWJlcl9JblBsYWNlQW5kCi0gIFB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZT1weXRob24zNS5QeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGUKLSAgUHlOdW1iZXJfSW5QbGFjZUxzaGlmdD1weXRob24zNS5QeU51bWJlcl9JblBsYWNlTHNoaWZ0Ci0gIFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseT1weXRob24zNS5QeU51bWJlcl9JblBsYWNlTXVsdGlwbHkKLSAgUHlOdW1iZXJfSW5QbGFjZU9yPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VPcgotICBQeU51bWJlcl9JblBsYWNlUG93ZXI9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVBvd2VyCi0gIFB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXI9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcgotICBQeU51bWJlcl9JblBsYWNlUnNoaWZ0PXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VSc2hpZnQKLSAgUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0PXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdAotICBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZT1weXRob24zNS5QeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZQotICBQeU51bWJlcl9JblBsYWNlWG9yPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VYb3IKLSAgUHlOdW1iZXJfSW5kZXg9cHl0aG9uMzUuUHlOdW1iZXJfSW5kZXgKLSAgUHlOdW1iZXJfSW52ZXJ0PXB5dGhvbjM1LlB5TnVtYmVyX0ludmVydAotICBQeU51bWJlcl9Mb25nPXB5dGhvbjM1LlB5TnVtYmVyX0xvbmcKLSAgUHlOdW1iZXJfTHNoaWZ0PXB5dGhvbjM1LlB5TnVtYmVyX0xzaGlmdAotICBQeU51bWJlcl9NdWx0aXBseT1weXRob24zNS5QeU51bWJlcl9NdWx0aXBseQotICBQeU51bWJlcl9OZWdhdGl2ZT1weXRob24zNS5QeU51bWJlcl9OZWdhdGl2ZQotICBQeU51bWJlcl9Pcj1weXRob24zNS5QeU51bWJlcl9PcgotICBQeU51bWJlcl9Qb3NpdGl2ZT1weXRob24zNS5QeU51bWJlcl9Qb3NpdGl2ZQotICBQeU51bWJlcl9Qb3dlcj1weXRob24zNS5QeU51bWJlcl9Qb3dlcgotICBQeU51bWJlcl9SZW1haW5kZXI9cHl0aG9uMzUuUHlOdW1iZXJfUmVtYWluZGVyCi0gIFB5TnVtYmVyX1JzaGlmdD1weXRob24zNS5QeU51bWJlcl9Sc2hpZnQKLSAgUHlOdW1iZXJfU3VidHJhY3Q9cHl0aG9uMzUuUHlOdW1iZXJfU3VidHJhY3QKLSAgUHlOdW1iZXJfVG9CYXNlPXB5dGhvbjM1LlB5TnVtYmVyX1RvQmFzZQotICBQeU51bWJlcl9UcnVlRGl2aWRlPXB5dGhvbjM1LlB5TnVtYmVyX1RydWVEaXZpZGUKLSAgUHlOdW1iZXJfWG9yPXB5dGhvbjM1LlB5TnVtYmVyX1hvcgotICBQeU9TX0FmdGVyRm9yaz1weXRob24zNS5QeU9TX0FmdGVyRm9yawotICBQeU9TX0luaXRJbnRlcnJ1cHRzPXB5dGhvbjM1LlB5T1NfSW5pdEludGVycnVwdHMKLSAgUHlPU19JbnB1dEhvb2s9cHl0aG9uMzUuUHlPU19JbnB1dEhvb2sgREFUQQotICBQeU9TX0ludGVycnVwdE9jY3VycmVkPXB5dGhvbjM1LlB5T1NfSW50ZXJydXB0T2NjdXJyZWQKLSAgUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlcj1weXRob24zNS5QeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyIERBVEEKLSAgUHlPU19kb3VibGVfdG9fc3RyaW5nPXB5dGhvbjM1LlB5T1NfZG91YmxlX3RvX3N0cmluZwotICBQeU9TX2dldHNpZz1weXRob24zNS5QeU9TX2dldHNpZwotICBQeU9TX215c3RyaWNtcD1weXRob24zNS5QeU9TX215c3RyaWNtcAotICBQeU9TX215c3RybmljbXA9cHl0aG9uMzUuUHlPU19teXN0cm5pY21wCi0gIFB5T1Nfc2V0c2lnPXB5dGhvbjM1LlB5T1Nfc2V0c2lnCi0gIFB5T1Nfc25wcmludGY9cHl0aG9uMzUuUHlPU19zbnByaW50ZgotICBQeU9TX3N0cmluZ190b19kb3VibGU9cHl0aG9uMzUuUHlPU19zdHJpbmdfdG9fZG91YmxlCi0gIFB5T1Nfc3RydG9sPXB5dGhvbjM1LlB5T1Nfc3RydG9sCi0gIFB5T1Nfc3RydG91bD1weXRob24zNS5QeU9TX3N0cnRvdWwKLSAgUHlPU192c25wcmludGY9cHl0aG9uMzUuUHlPU192c25wcmludGYKLSAgUHlPYmplY3RfQVNDSUk9cHl0aG9uMzUuUHlPYmplY3RfQVNDSUkKLSAgUHlPYmplY3RfQXNDaGFyQnVmZmVyPXB5dGhvbjM1LlB5T2JqZWN0X0FzQ2hhckJ1ZmZlcgotICBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yPXB5dGhvbjM1LlB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IKLSAgUHlPYmplY3RfQXNSZWFkQnVmZmVyPXB5dGhvbjM1LlB5T2JqZWN0X0FzUmVhZEJ1ZmZlcgotICBQeU9iamVjdF9Bc1dyaXRlQnVmZmVyPXB5dGhvbjM1LlB5T2JqZWN0X0FzV3JpdGVCdWZmZXIKLSAgUHlPYmplY3RfQnl0ZXM9cHl0aG9uMzUuUHlPYmplY3RfQnl0ZXMKLSAgUHlPYmplY3RfQ2FsbD1weXRob24zNS5QeU9iamVjdF9DYWxsCi0gIFB5T2JqZWN0X0NhbGxGdW5jdGlvbj1weXRob24zNS5QeU9iamVjdF9DYWxsRnVuY3Rpb24KLSAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncz1weXRob24zNS5QeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzCi0gIFB5T2JqZWN0X0NhbGxNZXRob2Q9cHl0aG9uMzUuUHlPYmplY3RfQ2FsbE1ldGhvZAotICBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncz1weXRob24zNS5QeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncwotICBQeU9iamVjdF9DYWxsT2JqZWN0PXB5dGhvbjM1LlB5T2JqZWN0X0NhbGxPYmplY3QKLSAgUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyPXB5dGhvbjM1LlB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcgotICBQeU9iamVjdF9DbGVhcldlYWtSZWZzPXB5dGhvbjM1LlB5T2JqZWN0X0NsZWFyV2Vha1JlZnMKLSAgUHlPYmplY3RfRGVsSXRlbT1weXRob24zNS5QeU9iamVjdF9EZWxJdGVtCi0gIFB5T2JqZWN0X0RlbEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlPYmplY3RfRGVsSXRlbVN0cmluZwotICBQeU9iamVjdF9EaXI9cHl0aG9uMzUuUHlPYmplY3RfRGlyCi0gIFB5T2JqZWN0X0Zvcm1hdD1weXRob24zNS5QeU9iamVjdF9Gb3JtYXQKLSAgUHlPYmplY3RfRnJlZT1weXRob24zNS5QeU9iamVjdF9GcmVlCi0gIFB5T2JqZWN0X0dDX0RlbD1weXRob24zNS5QeU9iamVjdF9HQ19EZWwKLSAgUHlPYmplY3RfR0NfVHJhY2s9cHl0aG9uMzUuUHlPYmplY3RfR0NfVHJhY2sKLSAgUHlPYmplY3RfR0NfVW5UcmFjaz1weXRob24zNS5QeU9iamVjdF9HQ19VblRyYWNrCi0gIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyPXB5dGhvbjM1LlB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyCi0gIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyPXB5dGhvbjM1LlB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyCi0gIFB5T2JqZWN0X0dldEF0dHI9cHl0aG9uMzUuUHlPYmplY3RfR2V0QXR0cgotICBQeU9iamVjdF9HZXRBdHRyU3RyaW5nPXB5dGhvbjM1LlB5T2JqZWN0X0dldEF0dHJTdHJpbmcKLSAgUHlPYmplY3RfR2V0SXRlbT1weXRob24zNS5QeU9iamVjdF9HZXRJdGVtCi0gIFB5T2JqZWN0X0dldEl0ZXI9cHl0aG9uMzUuUHlPYmplY3RfR2V0SXRlcgotICBQeU9iamVjdF9IYXNBdHRyPXB5dGhvbjM1LlB5T2JqZWN0X0hhc0F0dHIKLSAgUHlPYmplY3RfSGFzQXR0clN0cmluZz1weXRob24zNS5QeU9iamVjdF9IYXNBdHRyU3RyaW5nCi0gIFB5T2JqZWN0X0hhc2g9cHl0aG9uMzUuUHlPYmplY3RfSGFzaAotICBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQ9cHl0aG9uMzUuUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkCi0gIFB5T2JqZWN0X0luaXQ9cHl0aG9uMzUuUHlPYmplY3RfSW5pdAotICBQeU9iamVjdF9Jbml0VmFyPXB5dGhvbjM1LlB5T2JqZWN0X0luaXRWYXIKLSAgUHlPYmplY3RfSXNJbnN0YW5jZT1weXRob24zNS5QeU9iamVjdF9Jc0luc3RhbmNlCi0gIFB5T2JqZWN0X0lzU3ViY2xhc3M9cHl0aG9uMzUuUHlPYmplY3RfSXNTdWJjbGFzcwotICBQeU9iamVjdF9Jc1RydWU9cHl0aG9uMzUuUHlPYmplY3RfSXNUcnVlCi0gIFB5T2JqZWN0X0xlbmd0aD1weXRob24zNS5QeU9iamVjdF9MZW5ndGgKLSAgUHlPYmplY3RfTWFsbG9jPXB5dGhvbjM1LlB5T2JqZWN0X01hbGxvYwotICBQeU9iamVjdF9Ob3Q9cHl0aG9uMzUuUHlPYmplY3RfTm90Ci0gIFB5T2JqZWN0X1JlYWxsb2M9cHl0aG9uMzUuUHlPYmplY3RfUmVhbGxvYwotICBQeU9iamVjdF9SZXByPXB5dGhvbjM1LlB5T2JqZWN0X1JlcHIKLSAgUHlPYmplY3RfUmljaENvbXBhcmU9cHl0aG9uMzUuUHlPYmplY3RfUmljaENvbXBhcmUKLSAgUHlPYmplY3RfUmljaENvbXBhcmVCb29sPXB5dGhvbjM1LlB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbAotICBQeU9iamVjdF9TZWxmSXRlcj1weXRob24zNS5QeU9iamVjdF9TZWxmSXRlcgotICBQeU9iamVjdF9TZXRBdHRyPXB5dGhvbjM1LlB5T2JqZWN0X1NldEF0dHIKLSAgUHlPYmplY3RfU2V0QXR0clN0cmluZz1weXRob24zNS5QeU9iamVjdF9TZXRBdHRyU3RyaW5nCi0gIFB5T2JqZWN0X1NldEl0ZW09cHl0aG9uMzUuUHlPYmplY3RfU2V0SXRlbQotICBQeU9iamVjdF9TaXplPXB5dGhvbjM1LlB5T2JqZWN0X1NpemUKLSAgUHlPYmplY3RfU3RyPXB5dGhvbjM1LlB5T2JqZWN0X1N0cgotICBQeU9iamVjdF9UeXBlPXB5dGhvbjM1LlB5T2JqZWN0X1R5cGUgREFUQQotICBQeU9EaWN0X0RlbEl0ZW09cHl0aG9uMzUuUHlPRGljdF9EZWxJdGVtCi0gIFB5T0RpY3RfTmV3PXB5dGhvbjM1LlB5T0RpY3RfTmV3Ci0gIFB5T0RpY3RfU2V0SXRlbT1weXRob24zNS5QeU9EaWN0X1NldEl0ZW0KLSAgUHlPRGljdF9UeXBlPXB5dGhvbjM1LlB5T0RpY3RfVHlwZSBEQVRBCi0gIFB5T0RpY3RJdGVtc19UeXBlPXB5dGhvbjM1LlB5T0RpY3RJdGVtc19UeXBlIERBVEEKLSAgUHlPRGljdEl0ZXJfVHlwZT1weXRob24zNS5QeU9EaWN0SXRlcl9UeXBlIERBVEEKLSAgUHlPRGljdEtleXNfVHlwZT1weXRob24zNS5QeU9EaWN0S2V5c19UeXBlIERBVEEKLSAgUHlPRGljdFZhbHVlc19UeXBlPXB5dGhvbjM1LlB5T0RpY3RWYWx1ZXNfVHlwZSBEQVRBCi0gIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzPXB5dGhvbjM1LlB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzCi0gIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3M9cHl0aG9uMzUuUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncwotICBQeVByb3BlcnR5X1R5cGU9cHl0aG9uMzUuUHlQcm9wZXJ0eV9UeXBlIERBVEEKLSAgUHlSYW5nZUl0ZXJfVHlwZT1weXRob24zNS5QeVJhbmdlSXRlcl9UeXBlIERBVEEKLSAgUHlSYW5nZV9UeXBlPXB5dGhvbjM1LlB5UmFuZ2VfVHlwZSBEQVRBCi0gIFB5UmV2ZXJzZWRfVHlwZT1weXRob24zNS5QeVJldmVyc2VkX1R5cGUgREFUQQotICBQeVNlcUl0ZXJfTmV3PXB5dGhvbjM1LlB5U2VxSXRlcl9OZXcKLSAgUHlTZXFJdGVyX1R5cGU9cHl0aG9uMzUuUHlTZXFJdGVyX1R5cGUgREFUQQotICBQeVNlcXVlbmNlX0NoZWNrPXB5dGhvbjM1LlB5U2VxdWVuY2VfQ2hlY2sKLSAgUHlTZXF1ZW5jZV9Db25jYXQ9cHl0aG9uMzUuUHlTZXF1ZW5jZV9Db25jYXQKLSAgUHlTZXF1ZW5jZV9Db250YWlucz1weXRob24zNS5QeVNlcXVlbmNlX0NvbnRhaW5zCi0gIFB5U2VxdWVuY2VfQ291bnQ9cHl0aG9uMzUuUHlTZXF1ZW5jZV9Db3VudAotICBQeVNlcXVlbmNlX0RlbEl0ZW09cHl0aG9uMzUuUHlTZXF1ZW5jZV9EZWxJdGVtCi0gIFB5U2VxdWVuY2VfRGVsU2xpY2U9cHl0aG9uMzUuUHlTZXF1ZW5jZV9EZWxTbGljZQotICBQeVNlcXVlbmNlX0Zhc3Q9cHl0aG9uMzUuUHlTZXF1ZW5jZV9GYXN0Ci0gIFB5U2VxdWVuY2VfR2V0SXRlbT1weXRob24zNS5QeVNlcXVlbmNlX0dldEl0ZW0KLSAgUHlTZXF1ZW5jZV9HZXRTbGljZT1weXRob24zNS5QeVNlcXVlbmNlX0dldFNsaWNlCi0gIFB5U2VxdWVuY2VfSW49cHl0aG9uMzUuUHlTZXF1ZW5jZV9JbgotICBQeVNlcXVlbmNlX0luUGxhY2VDb25jYXQ9cHl0aG9uMzUuUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0Ci0gIFB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdD1weXRob24zNS5QeVNlcXVlbmNlX0luUGxhY2VSZXBlYXQKLSAgUHlTZXF1ZW5jZV9JbmRleD1weXRob24zNS5QeVNlcXVlbmNlX0luZGV4Ci0gIFB5U2VxdWVuY2VfTGVuZ3RoPXB5dGhvbjM1LlB5U2VxdWVuY2VfTGVuZ3RoCi0gIFB5U2VxdWVuY2VfTGlzdD1weXRob24zNS5QeVNlcXVlbmNlX0xpc3QKLSAgUHlTZXF1ZW5jZV9SZXBlYXQ9cHl0aG9uMzUuUHlTZXF1ZW5jZV9SZXBlYXQKLSAgUHlTZXF1ZW5jZV9TZXRJdGVtPXB5dGhvbjM1LlB5U2VxdWVuY2VfU2V0SXRlbQotICBQeVNlcXVlbmNlX1NldFNsaWNlPXB5dGhvbjM1LlB5U2VxdWVuY2VfU2V0U2xpY2UKLSAgUHlTZXF1ZW5jZV9TaXplPXB5dGhvbjM1LlB5U2VxdWVuY2VfU2l6ZQotICBQeVNlcXVlbmNlX1R1cGxlPXB5dGhvbjM1LlB5U2VxdWVuY2VfVHVwbGUKLSAgUHlTZXRJdGVyX1R5cGU9cHl0aG9uMzUuUHlTZXRJdGVyX1R5cGUgREFUQQotICBQeVNldF9BZGQ9cHl0aG9uMzUuUHlTZXRfQWRkCi0gIFB5U2V0X0NsZWFyPXB5dGhvbjM1LlB5U2V0X0NsZWFyCi0gIFB5U2V0X0NvbnRhaW5zPXB5dGhvbjM1LlB5U2V0X0NvbnRhaW5zCi0gIFB5U2V0X0Rpc2NhcmQ9cHl0aG9uMzUuUHlTZXRfRGlzY2FyZAotICBQeVNldF9OZXc9cHl0aG9uMzUuUHlTZXRfTmV3Ci0gIFB5U2V0X1BvcD1weXRob24zNS5QeVNldF9Qb3AKLSAgUHlTZXRfU2l6ZT1weXRob24zNS5QeVNldF9TaXplCi0gIFB5U2V0X1R5cGU9cHl0aG9uMzUuUHlTZXRfVHlwZSBEQVRBCi0gIFB5U2xpY2VfR2V0SW5kaWNlcz1weXRob24zNS5QeVNsaWNlX0dldEluZGljZXMKLSAgUHlTbGljZV9HZXRJbmRpY2VzRXg9cHl0aG9uMzUuUHlTbGljZV9HZXRJbmRpY2VzRXgKLSAgUHlTbGljZV9OZXc9cHl0aG9uMzUuUHlTbGljZV9OZXcKLSAgUHlTbGljZV9UeXBlPXB5dGhvbjM1LlB5U2xpY2VfVHlwZSBEQVRBCi0gIFB5U29ydFdyYXBwZXJfVHlwZT1weXRob24zNS5QeVNvcnRXcmFwcGVyX1R5cGUgREFUQQotICBQeVN0YXRlX0ZpbmRNb2R1bGU9cHl0aG9uMzUuUHlTdGF0ZV9GaW5kTW9kdWxlCi0gIFB5U3RhdGVfQWRkTW9kdWxlPXB5dGhvbjM1LlB5U3RhdGVfQWRkTW9kdWxlCi0gIFB5U3RhdGVfUmVtb3ZlTW9kdWxlPXB5dGhvbjM1LlB5U3RhdGVfUmVtb3ZlTW9kdWxlCi0gIFB5U3RydWN0U2VxdWVuY2VfR2V0SXRlbT1weXRob24zNS5QeVN0cnVjdFNlcXVlbmNlX0dldEl0ZW0KLSAgUHlTdHJ1Y3RTZXF1ZW5jZV9OZXc9cHl0aG9uMzUuUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcKLSAgUHlTdHJ1Y3RTZXF1ZW5jZV9OZXdUeXBlPXB5dGhvbjM1LlB5U3RydWN0U2VxdWVuY2VfTmV3VHlwZQotICBQeVN0cnVjdFNlcXVlbmNlX1NldEl0ZW09cHl0aG9uMzUuUHlTdHJ1Y3RTZXF1ZW5jZV9TZXRJdGVtCi0gIFB5U3VwZXJfVHlwZT1weXRob24zNS5QeVN1cGVyX1R5cGUgREFUQQotICBQeVN5c19BZGRXYXJuT3B0aW9uPXB5dGhvbjM1LlB5U3lzX0FkZFdhcm5PcHRpb24KLSAgUHlTeXNfQWRkV2Fybk9wdGlvblVuaWNvZGU9cHl0aG9uMzUuUHlTeXNfQWRkV2Fybk9wdGlvblVuaWNvZGUKLSAgUHlTeXNfRm9ybWF0U3RkZXJyPXB5dGhvbjM1LlB5U3lzX0Zvcm1hdFN0ZGVycgotICBQeVN5c19Gb3JtYXRTdGRvdXQ9cHl0aG9uMzUuUHlTeXNfRm9ybWF0U3Rkb3V0Ci0gIFB5U3lzX0dldE9iamVjdD1weXRob24zNS5QeVN5c19HZXRPYmplY3QKLSAgUHlTeXNfSGFzV2Fybk9wdGlvbnM9cHl0aG9uMzUuUHlTeXNfSGFzV2Fybk9wdGlvbnMKLSAgUHlTeXNfUmVzZXRXYXJuT3B0aW9ucz1weXRob24zNS5QeVN5c19SZXNldFdhcm5PcHRpb25zCi0gIFB5U3lzX1NldEFyZ3Y9cHl0aG9uMzUuUHlTeXNfU2V0QXJndgotICBQeVN5c19TZXRBcmd2RXg9cHl0aG9uMzUuUHlTeXNfU2V0QXJndkV4Ci0gIFB5U3lzX1NldE9iamVjdD1weXRob24zNS5QeVN5c19TZXRPYmplY3QKLSAgUHlTeXNfU2V0UGF0aD1weXRob24zNS5QeVN5c19TZXRQYXRoCi0gIFB5U3lzX1dyaXRlU3RkZXJyPXB5dGhvbjM1LlB5U3lzX1dyaXRlU3RkZXJyCi0gIFB5U3lzX1dyaXRlU3Rkb3V0PXB5dGhvbjM1LlB5U3lzX1dyaXRlU3Rkb3V0Ci0gIFB5VGhyZWFkU3RhdGVfQ2xlYXI9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9DbGVhcgotICBQeVRocmVhZFN0YXRlX0RlbGV0ZT1weXRob24zNS5QeVRocmVhZFN0YXRlX0RlbGV0ZQotICBQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQ9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50Ci0gIFB5VGhyZWFkU3RhdGVfR2V0PXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfR2V0Ci0gIFB5VGhyZWFkU3RhdGVfR2V0RGljdD1weXRob24zNS5QeVRocmVhZFN0YXRlX0dldERpY3QKLSAgUHlUaHJlYWRTdGF0ZV9OZXc9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9OZXcKLSAgUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4Yz1weXRob24zNS5QeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjCi0gIFB5VGhyZWFkU3RhdGVfU3dhcD1weXRob24zNS5QeVRocmVhZFN0YXRlX1N3YXAKLSAgUHlUcmFjZUJhY2tfSGVyZT1weXRob24zNS5QeVRyYWNlQmFja19IZXJlCi0gIFB5VHJhY2VCYWNrX1ByaW50PXB5dGhvbjM1LlB5VHJhY2VCYWNrX1ByaW50Ci0gIFB5VHJhY2VCYWNrX1R5cGU9cHl0aG9uMzUuUHlUcmFjZUJhY2tfVHlwZSBEQVRBCi0gIFB5VHVwbGVJdGVyX1R5cGU9cHl0aG9uMzUuUHlUdXBsZUl0ZXJfVHlwZSBEQVRBCi0gIFB5VHVwbGVfQ2xlYXJGcmVlTGlzdD1weXRob24zNS5QeVR1cGxlX0NsZWFyRnJlZUxpc3QKLSAgUHlUdXBsZV9HZXRJdGVtPXB5dGhvbjM1LlB5VHVwbGVfR2V0SXRlbQotICBQeVR1cGxlX0dldFNsaWNlPXB5dGhvbjM1LlB5VHVwbGVfR2V0U2xpY2UKLSAgUHlUdXBsZV9OZXc9cHl0aG9uMzUuUHlUdXBsZV9OZXcKLSAgUHlUdXBsZV9QYWNrPXB5dGhvbjM1LlB5VHVwbGVfUGFjawotICBQeVR1cGxlX1NldEl0ZW09cHl0aG9uMzUuUHlUdXBsZV9TZXRJdGVtCi0gIFB5VHVwbGVfU2l6ZT1weXRob24zNS5QeVR1cGxlX1NpemUKLSAgUHlUdXBsZV9UeXBlPXB5dGhvbjM1LlB5VHVwbGVfVHlwZSBEQVRBCi0gIFB5VHlwZV9DbGVhckNhY2hlPXB5dGhvbjM1LlB5VHlwZV9DbGVhckNhY2hlCi0gIFB5VHlwZV9Gcm9tU3BlYz1weXRob24zNS5QeVR5cGVfRnJvbVNwZWMKLSAgUHlUeXBlX0Zyb21TcGVjV2l0aEJhc2VzPXB5dGhvbjM1LlB5VHlwZV9Gcm9tU3BlY1dpdGhCYXNlcwotICBQeVR5cGVfR2VuZXJpY0FsbG9jPXB5dGhvbjM1LlB5VHlwZV9HZW5lcmljQWxsb2MKLSAgUHlUeXBlX0dlbmVyaWNOZXc9cHl0aG9uMzUuUHlUeXBlX0dlbmVyaWNOZXcKLSAgUHlUeXBlX0dldEZsYWdzPXB5dGhvbjM1LlB5VHlwZV9HZXRGbGFncwotICBQeVR5cGVfR2V0U2xvdD1weXRob24zNS5QeVR5cGVfR2V0U2xvdAotICBQeVR5cGVfSXNTdWJ0eXBlPXB5dGhvbjM1LlB5VHlwZV9Jc1N1YnR5cGUKLSAgUHlUeXBlX01vZGlmaWVkPXB5dGhvbjM1LlB5VHlwZV9Nb2RpZmllZAotICBQeVR5cGVfUmVhZHk9cHl0aG9uMzUuUHlUeXBlX1JlYWR5Ci0gIFB5VHlwZV9UeXBlPXB5dGhvbjM1LlB5VHlwZV9UeXBlIERBVEEKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZQotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmNvZGluZz1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmNvZGluZwotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kCi0gIFB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRPYmplY3QKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0dldFJlYXNvbgotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRTdGFydAotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kCi0gIFB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb24KLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5jb2Rpbmc9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5jb2RpbmcKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZAotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0T2JqZWN0Ci0gIFB5VW5pY29kZUVuY29kZUVycm9yX0dldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRSZWFzb24KLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX1NldEVuZAotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0UmVhc29uCi0gIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0Ci0gIFB5VW5pY29kZUl0ZXJfVHlwZT1weXRob24zNS5QeVVuaWNvZGVJdGVyX1R5cGUgREFUQQotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kCi0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRPYmplY3QKLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFJlYXNvbgotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRTdGFydAotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0RW5kCi0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb24KLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0U3RhcnQKLSAgUHlVbmljb2RlX0FwcGVuZD1weXRob24zNS5QeVVuaWNvZGVfQXBwZW5kCi0gIFB5VW5pY29kZV9BcHBlbmRBbmREZWw9cHl0aG9uMzUuUHlVbmljb2RlX0FwcGVuZEFuZERlbAotICBQeVVuaWNvZGVfQXNBU0NJSVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNBU0NJSVN0cmluZwotICBQeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0NoYXJtYXBTdHJpbmcKLSAgUHlVbmljb2RlX0FzRGVjb2RlZE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVfQXNEZWNvZGVkT2JqZWN0Ci0gIFB5VW5pY29kZV9Bc0RlY29kZWRVbmljb2RlPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0RlY29kZWRVbmljb2RlCi0gIFB5VW5pY29kZV9Bc0VuY29kZWRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdAotICBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcKLSAgUHlVbmljb2RlX0FzRW5jb2RlZFVuaWNvZGU9cHl0aG9uMzUuUHlVbmljb2RlX0FzRW5jb2RlZFVuaWNvZGUKLSAgUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0xhdGluMVN0cmluZwotICBQeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcKLSAgUHlVbmljb2RlX0FzVVRGMTZTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzVVRGMTZTdHJpbmcKLSAgUHlVbmljb2RlX0FzVVRGMzJTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzVVRGMzJTdHJpbmcKLSAgUHlVbmljb2RlX0FzVVRGOFN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNVVEY4U3RyaW5nCi0gIFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZwotICBQeVVuaWNvZGVfQXNXaWRlQ2hhcj1weXRob24zNS5QeVVuaWNvZGVfQXNXaWRlQ2hhcgotICBQeVVuaWNvZGVfQ2xlYXJGcmVlbGlzdD1weXRob24zNS5QeVVuaWNvZGVfQ2xlYXJGcmVlbGlzdAotICBQeVVuaWNvZGVfQ29tcGFyZT1weXRob24zNS5QeVVuaWNvZGVfQ29tcGFyZQotICBQeVVuaWNvZGVfQ29uY2F0PXB5dGhvbjM1LlB5VW5pY29kZV9Db25jYXQKLSAgUHlVbmljb2RlX0NvbnRhaW5zPXB5dGhvbjM1LlB5VW5pY29kZV9Db250YWlucwotICBQeVVuaWNvZGVfQ291bnQ9cHl0aG9uMzUuUHlVbmljb2RlX0NvdW50Ci0gIFB5VW5pY29kZV9EZWNvZGU9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZQotICBQeVVuaWNvZGVfRGVjb2RlQVNDSUk9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZUFTQ0lJCi0gIFB5VW5pY29kZV9EZWNvZGVDaGFybWFwPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVDaGFybWFwCi0gIFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQ9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdAotICBQeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0QW5kU2l6ZT1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0QW5kU2l6ZQotICBQeVVuaWNvZGVfRGVjb2RlTGF0aW4xPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVMYXRpbjEKLSAgUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGU9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUKLSAgUHlVbmljb2RlX0RlY29kZVVURjE2PXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEYxNgotICBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bAotICBQeVVuaWNvZGVfRGVjb2RlVVRGMzI9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjMyCi0gIFB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsCi0gIFB5VW5pY29kZV9EZWNvZGVVVEY4PXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEY4Ci0gIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWw9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bAotICBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZT1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZQotICBQeVVuaWNvZGVfRlNDb252ZXJ0ZXI9cHl0aG9uMzUuUHlVbmljb2RlX0ZTQ29udmVydGVyCi0gIFB5VW5pY29kZV9GU0RlY29kZXI9cHl0aG9uMzUuUHlVbmljb2RlX0ZTRGVjb2RlcgotICBQeVVuaWNvZGVfRmluZD1weXRob24zNS5QeVVuaWNvZGVfRmluZAotICBQeVVuaWNvZGVfRm9ybWF0PXB5dGhvbjM1LlB5VW5pY29kZV9Gb3JtYXQKLSAgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdAotICBQeVVuaWNvZGVfRnJvbUZvcm1hdD1weXRob24zNS5QeVVuaWNvZGVfRnJvbUZvcm1hdAotICBQeVVuaWNvZGVfRnJvbUZvcm1hdFY9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21Gb3JtYXRWCi0gIFB5VW5pY29kZV9Gcm9tT2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tT2JqZWN0Ci0gIFB5VW5pY29kZV9Gcm9tT3JkaW5hbD1weXRob24zNS5QeVVuaWNvZGVfRnJvbU9yZGluYWwKLSAgUHlVbmljb2RlX0Zyb21TdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21TdHJpbmcKLSAgUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZQotICBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyPXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tV2lkZUNoYXIKLSAgUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZz1weXRob24zNS5QeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nCi0gIFB5VW5pY29kZV9HZXRTaXplPXB5dGhvbjM1LlB5VW5pY29kZV9HZXRTaXplCi0gIFB5VW5pY29kZV9Jc0lkZW50aWZpZXI9cHl0aG9uMzUuUHlVbmljb2RlX0lzSWRlbnRpZmllcgotICBQeVVuaWNvZGVfSm9pbj1weXRob24zNS5QeVVuaWNvZGVfSm9pbgotICBQeVVuaWNvZGVfUGFydGl0aW9uPXB5dGhvbjM1LlB5VW5pY29kZV9QYXJ0aXRpb24KLSAgUHlVbmljb2RlX1JQYXJ0aXRpb249cHl0aG9uMzUuUHlVbmljb2RlX1JQYXJ0aXRpb24KLSAgUHlVbmljb2RlX1JTcGxpdD1weXRob24zNS5QeVVuaWNvZGVfUlNwbGl0Ci0gIFB5VW5pY29kZV9SZXBsYWNlPXB5dGhvbjM1LlB5VW5pY29kZV9SZXBsYWNlCi0gIFB5VW5pY29kZV9SZXNpemU9cHl0aG9uMzUuUHlVbmljb2RlX1Jlc2l6ZQotICBQeVVuaWNvZGVfUmljaENvbXBhcmU9cHl0aG9uMzUuUHlVbmljb2RlX1JpY2hDb21wYXJlCi0gIFB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzUuUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZwotICBQeVVuaWNvZGVfU3BsaXQ9cHl0aG9uMzUuUHlVbmljb2RlX1NwbGl0Ci0gIFB5VW5pY29kZV9TcGxpdGxpbmVzPXB5dGhvbjM1LlB5VW5pY29kZV9TcGxpdGxpbmVzCi0gIFB5VW5pY29kZV9UYWlsbWF0Y2g9cHl0aG9uMzUuUHlVbmljb2RlX1RhaWxtYXRjaAotICBQeVVuaWNvZGVfVHJhbnNsYXRlPXB5dGhvbjM1LlB5VW5pY29kZV9UcmFuc2xhdGUKLSAgUHlVbmljb2RlX0J1aWxkRW5jb2RpbmdNYXA9cHl0aG9uMzUuUHlVbmljb2RlX0J1aWxkRW5jb2RpbmdNYXAKLSAgUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcKLSAgUHlVbmljb2RlX0RlY29kZVVURjc9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjcKLSAgUHlVbmljb2RlX0RlY29kZVVURjdTdGF0ZWZ1bD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGN1N0YXRlZnVsCi0gIFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQ9cHl0aG9uMzUuUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdAotICBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZwotICBQeVVuaWNvZGVfSW50ZXJuSW1tb3J0YWw9cHl0aG9uMzUuUHlVbmljb2RlX0ludGVybkltbW9ydGFsCi0gIFB5VW5pY29kZV9JbnRlcm5JblBsYWNlPXB5dGhvbjM1LlB5VW5pY29kZV9JbnRlcm5JblBsYWNlCi0gIFB5VW5pY29kZV9UeXBlPXB5dGhvbjM1LlB5VW5pY29kZV9UeXBlIERBVEEKLSAgUHlXZWFrcmVmX0dldE9iamVjdD1weXRob24zNS5QeVdlYWtyZWZfR2V0T2JqZWN0IERBVEEKLSAgUHlXZWFrcmVmX05ld1Byb3h5PXB5dGhvbjM1LlB5V2Vha3JlZl9OZXdQcm94eQotICBQeVdlYWtyZWZfTmV3UmVmPXB5dGhvbjM1LlB5V2Vha3JlZl9OZXdSZWYKLSAgUHlXcmFwcGVyRGVzY3JfVHlwZT1weXRob24zNS5QeVdyYXBwZXJEZXNjcl9UeXBlIERBVEEKLSAgUHlXcmFwcGVyX05ldz1weXRob24zNS5QeVdyYXBwZXJfTmV3Ci0gIFB5WmlwX1R5cGU9cHl0aG9uMzUuUHlaaXBfVHlwZSBEQVRBCi0gIFB5X0FkZFBlbmRpbmdDYWxsPXB5dGhvbjM1LlB5X0FkZFBlbmRpbmdDYWxsCi0gIFB5X0F0RXhpdD1weXRob24zNS5QeV9BdEV4aXQKLSAgUHlfQnVpbGRWYWx1ZT1weXRob24zNS5QeV9CdWlsZFZhbHVlCi0gIFB5X0NvbXBpbGVTdHJpbmc9cHl0aG9uMzUuUHlfQ29tcGlsZVN0cmluZwotICBQeV9EZWNSZWY9cHl0aG9uMzUuUHlfRGVjUmVmCi0gIFB5X0VuZEludGVycHJldGVyPXB5dGhvbjM1LlB5X0VuZEludGVycHJldGVyCi0gIFB5X0V4aXQ9cHl0aG9uMzUuUHlfRXhpdAotICBQeV9GYXRhbEVycm9yPXB5dGhvbjM1LlB5X0ZhdGFsRXJyb3IKLSAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZz1weXRob24zNS5QeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIERBVEEKLSAgUHlfRmluYWxpemU9cHl0aG9uMzUuUHlfRmluYWxpemUKLSAgUHlfR2V0QnVpbGRJbmZvPXB5dGhvbjM1LlB5X0dldEJ1aWxkSW5mbwotICBQeV9HZXRDb21waWxlcj1weXRob24zNS5QeV9HZXRDb21waWxlcgotICBQeV9HZXRDb3B5cmlnaHQ9cHl0aG9uMzUuUHlfR2V0Q29weXJpZ2h0Ci0gIFB5X0dldEV4ZWNQcmVmaXg9cHl0aG9uMzUuUHlfR2V0RXhlY1ByZWZpeAotICBQeV9HZXRQYXRoPXB5dGhvbjM1LlB5X0dldFBhdGgKLSAgUHlfR2V0UGxhdGZvcm09cHl0aG9uMzUuUHlfR2V0UGxhdGZvcm0KLSAgUHlfR2V0UHJlZml4PXB5dGhvbjM1LlB5X0dldFByZWZpeAotICBQeV9HZXRQcm9ncmFtRnVsbFBhdGg9cHl0aG9uMzUuUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoCi0gIFB5X0dldFByb2dyYW1OYW1lPXB5dGhvbjM1LlB5X0dldFByb2dyYW1OYW1lCi0gIFB5X0dldFB5dGhvbkhvbWU9cHl0aG9uMzUuUHlfR2V0UHl0aG9uSG9tZQotICBQeV9HZXRSZWN1cnNpb25MaW1pdD1weXRob24zNS5QeV9HZXRSZWN1cnNpb25MaW1pdAotICBQeV9HZXRWZXJzaW9uPXB5dGhvbjM1LlB5X0dldFZlcnNpb24KLSAgUHlfSGFzRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZz1weXRob24zNS5QeV9IYXNGaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIERBVEEKLSAgUHlfSW5jUmVmPXB5dGhvbjM1LlB5X0luY1JlZgotICBQeV9Jbml0aWFsaXplPXB5dGhvbjM1LlB5X0luaXRpYWxpemUKLSAgUHlfSW5pdGlhbGl6ZUV4PXB5dGhvbjM1LlB5X0luaXRpYWxpemVFeAotICBQeV9Jc0luaXRpYWxpemVkPXB5dGhvbjM1LlB5X0lzSW5pdGlhbGl6ZWQKLSAgUHlfTWFpbj1weXRob24zNS5QeV9NYWluCi0gIFB5X01ha2VQZW5kaW5nQ2FsbHM9cHl0aG9uMzUuUHlfTWFrZVBlbmRpbmdDYWxscwotICBQeV9OZXdJbnRlcnByZXRlcj1weXRob24zNS5QeV9OZXdJbnRlcnByZXRlcgotICBQeV9SZXByRW50ZXI9cHl0aG9uMzUuUHlfUmVwckVudGVyCi0gIFB5X1JlcHJMZWF2ZT1weXRob24zNS5QeV9SZXByTGVhdmUKLSAgUHlfU2V0UHJvZ3JhbU5hbWU9cHl0aG9uMzUuUHlfU2V0UHJvZ3JhbU5hbWUKLSAgUHlfU2V0UHl0aG9uSG9tZT1weXRob24zNS5QeV9TZXRQeXRob25Ib21lCi0gIFB5X1NldFJlY3Vyc2lvbkxpbWl0PXB5dGhvbjM1LlB5X1NldFJlY3Vyc2lvbkxpbWl0Ci0gIFB5X1N5bXRhYmxlU3RyaW5nPXB5dGhvbjM1LlB5X1N5bXRhYmxlU3RyaW5nCi0gIFB5X1ZhQnVpbGRWYWx1ZT1weXRob24zNS5QeV9WYUJ1aWxkVmFsdWUKLSAgX1B5RXJyX0JhZEludGVybmFsQ2FsbD1weXRob24zNS5fUHlFcnJfQmFkSW50ZXJuYWxDYWxsCi0gIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQ9cHl0aG9uMzUuX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVAotICBfUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVD1weXRob24zNS5fUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVAotICBfUHlPYmplY3RfR0NfTWFsbG9jPXB5dGhvbjM1Ll9QeU9iamVjdF9HQ19NYWxsb2MKLSAgX1B5T2JqZWN0X0dDX05ldz1weXRob24zNS5fUHlPYmplY3RfR0NfTmV3Ci0gIF9QeU9iamVjdF9HQ19OZXdWYXI9cHl0aG9uMzUuX1B5T2JqZWN0X0dDX05ld1ZhcgotICBfUHlPYmplY3RfR0NfUmVzaXplPXB5dGhvbjM1Ll9QeU9iamVjdF9HQ19SZXNpemUKLSAgX1B5T2JqZWN0X05ldz1weXRob24zNS5fUHlPYmplY3RfTmV3Ci0gIF9QeU9iamVjdF9OZXdWYXI9cHl0aG9uMzUuX1B5T2JqZWN0X05ld1ZhcgotICBfUHlTdGF0ZV9BZGRNb2R1bGU9cHl0aG9uMzUuX1B5U3RhdGVfQWRkTW9kdWxlCi0gIF9QeVRocmVhZFN0YXRlX0luaXQ9cHl0aG9uMzUuX1B5VGhyZWFkU3RhdGVfSW5pdAotICBfUHlUaHJlYWRTdGF0ZV9QcmVhbGxvYz1weXRob24zNS5fUHlUaHJlYWRTdGF0ZV9QcmVhbGxvYwotICBfUHlUcmFzaF9kZWxldGVfbGF0ZXI9cHl0aG9uMzUuX1B5VHJhc2hfZGVsZXRlX2xhdGVyIERBVEEKLSAgX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc9cHl0aG9uMzUuX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgREFUQQotICBfUHlUcmFzaF9kZXBvc2l0X29iamVjdD1weXRob24zNS5fUHlUcmFzaF9kZXBvc2l0X29iamVjdAotICBfUHlUcmFzaF9kZXN0cm95X2NoYWluPXB5dGhvbjM1Ll9QeVRyYXNoX2Rlc3Ryb3lfY2hhaW4KLSAgX1B5V2Vha3JlZl9DYWxsYWJsZVByb3h5VHlwZT1weXRob24zNS5fUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlIERBVEEKLSAgX1B5V2Vha3JlZl9Qcm94eVR5cGU9cHl0aG9uMzUuX1B5V2Vha3JlZl9Qcm94eVR5cGUgREFUQQotICBfUHlXZWFrcmVmX1JlZlR5cGU9cHl0aG9uMzUuX1B5V2Vha3JlZl9SZWZUeXBlIERBVEEKLSAgX1B5X0J1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzUuX1B5X0J1aWxkVmFsdWVfU2l6ZVQKLSAgX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQ9cHl0aG9uMzUuX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQgREFUQQotICBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsPXB5dGhvbjM1Ll9QeV9DaGVja1JlY3Vyc2l2ZUNhbGwKLSAgX1B5X0RlYWxsb2M9cHl0aG9uMzUuX1B5X0RlYWxsb2MKLSAgX1B5X0VsbGlwc2lzT2JqZWN0PXB5dGhvbjM1Ll9QeV9FbGxpcHNpc09iamVjdCBEQVRBCi0gIF9QeV9GYWxzZVN0cnVjdD1weXRob24zNS5fUHlfRmFsc2VTdHJ1Y3QgREFUQQotICBfUHlfTm9uZVN0cnVjdD1weXRob24zNS5fUHlfTm9uZVN0cnVjdCBEQVRBCi0gIF9QeV9Ob3RJbXBsZW1lbnRlZFN0cnVjdD1weXRob24zNS5fUHlfTm90SW1wbGVtZW50ZWRTdHJ1Y3QgREFUQQotICBfUHlfU3dhcHBlZE9wPXB5dGhvbjM1Ll9QeV9Td2FwcGVkT3AgREFUQQotICBfUHlfVHJ1ZVN0cnVjdD1weXRob24zNS5fUHlfVHJ1ZVN0cnVjdCBEQVRBCi0gIF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzUuX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVAotICBfUHlBcmdfUGFyc2VfU2l6ZVQ9cHl0aG9uMzUuX1B5QXJnX1BhcnNlX1NpemVUCi0gIF9QeUFyZ19QYXJzZVR1cGxlX1NpemVUPXB5dGhvbjM1Ll9QeUFyZ19QYXJzZVR1cGxlX1NpemVUCi0gIF9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQ9cHl0aG9uMzUuX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVAotICBfUHlBcmdfVmFQYXJzZV9TaXplVD1weXRob24zNS5fUHlBcmdfVmFQYXJzZV9TaXplVAotICBfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQ9cHl0aG9uMzUuX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUCi0gIF9QeV9CdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM1Ll9QeV9CdWlsZFZhbHVlX1NpemVUCisgIFB5QXJnX1BhcnNlPXB5dGhvbjM2LlB5QXJnX1BhcnNlCisgIFB5QXJnX1BhcnNlVHVwbGU9cHl0aG9uMzYuUHlBcmdfUGFyc2VUdXBsZQorICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHM9cHl0aG9uMzYuUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzCisgIFB5QXJnX1VucGFja1R1cGxlPXB5dGhvbjM2LlB5QXJnX1VucGFja1R1cGxlCisgIFB5QXJnX1ZhUGFyc2U9cHl0aG9uMzYuUHlBcmdfVmFQYXJzZQorICBQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkcz1weXRob24zNi5QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3JkcworICBQeUFyZ19WYWxpZGF0ZUtleXdvcmRBcmd1bWVudHM9cHl0aG9uMzYuUHlBcmdfVmFsaWRhdGVLZXl3b3JkQXJndW1lbnRzCisgIFB5QmFzZU9iamVjdF9UeXBlPXB5dGhvbjM2LlB5QmFzZU9iamVjdF9UeXBlIERBVEEKKyAgUHlCb29sX0Zyb21Mb25nPXB5dGhvbjM2LlB5Qm9vbF9Gcm9tTG9uZworICBQeUJvb2xfVHlwZT1weXRob24zNi5QeUJvb2xfVHlwZSBEQVRBCisgIFB5Qnl0ZUFycmF5SXRlcl9UeXBlPXB5dGhvbjM2LlB5Qnl0ZUFycmF5SXRlcl9UeXBlIERBVEEKKyAgUHlCeXRlQXJyYXlfQXNTdHJpbmc9cHl0aG9uMzYuUHlCeXRlQXJyYXlfQXNTdHJpbmcKKyAgUHlCeXRlQXJyYXlfQ29uY2F0PXB5dGhvbjM2LlB5Qnl0ZUFycmF5X0NvbmNhdAorICBQeUJ5dGVBcnJheV9Gcm9tT2JqZWN0PXB5dGhvbjM2LlB5Qnl0ZUFycmF5X0Zyb21PYmplY3QKKyAgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzYuUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUKKyAgUHlCeXRlQXJyYXlfUmVzaXplPXB5dGhvbjM2LlB5Qnl0ZUFycmF5X1Jlc2l6ZQorICBQeUJ5dGVBcnJheV9TaXplPXB5dGhvbjM2LlB5Qnl0ZUFycmF5X1NpemUKKyAgUHlCeXRlQXJyYXlfVHlwZT1weXRob24zNi5QeUJ5dGVBcnJheV9UeXBlIERBVEEKKyAgUHlCeXRlc0l0ZXJfVHlwZT1weXRob24zNi5QeUJ5dGVzSXRlcl9UeXBlIERBVEEKKyAgUHlCeXRlc19Bc1N0cmluZz1weXRob24zNi5QeUJ5dGVzX0FzU3RyaW5nCisgIFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplPXB5dGhvbjM2LlB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplCisgIFB5Qnl0ZXNfQ29uY2F0PXB5dGhvbjM2LlB5Qnl0ZXNfQ29uY2F0CisgIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsPXB5dGhvbjM2LlB5Qnl0ZXNfQ29uY2F0QW5kRGVsCisgIFB5Qnl0ZXNfRGVjb2RlRXNjYXBlPXB5dGhvbjM2LlB5Qnl0ZXNfRGVjb2RlRXNjYXBlCisgIFB5Qnl0ZXNfRnJvbUZvcm1hdD1weXRob24zNi5QeUJ5dGVzX0Zyb21Gb3JtYXQKKyAgUHlCeXRlc19Gcm9tRm9ybWF0Vj1weXRob24zNi5QeUJ5dGVzX0Zyb21Gb3JtYXRWCisgIFB5Qnl0ZXNfRnJvbU9iamVjdD1weXRob24zNi5QeUJ5dGVzX0Zyb21PYmplY3QKKyAgUHlCeXRlc19Gcm9tU3RyaW5nPXB5dGhvbjM2LlB5Qnl0ZXNfRnJvbVN0cmluZworICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM2LlB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUKKyAgUHlCeXRlc19SZXByPXB5dGhvbjM2LlB5Qnl0ZXNfUmVwcgorICBQeUJ5dGVzX1NpemU9cHl0aG9uMzYuUHlCeXRlc19TaXplCisgIFB5Qnl0ZXNfVHlwZT1weXRob24zNi5QeUJ5dGVzX1R5cGUgREFUQQorICBQeUNGdW5jdGlvbl9DYWxsPXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX0NhbGwKKyAgUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdD1weXRob24zNi5QeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0CisgIFB5Q0Z1bmN0aW9uX0dldEZsYWdzPXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX0dldEZsYWdzCisgIFB5Q0Z1bmN0aW9uX0dldEZ1bmN0aW9uPXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX0dldEZ1bmN0aW9uCisgIFB5Q0Z1bmN0aW9uX0dldFNlbGY9cHl0aG9uMzYuUHlDRnVuY3Rpb25fR2V0U2VsZgorICBQeUNGdW5jdGlvbl9OZXc9cHl0aG9uMzYuUHlDRnVuY3Rpb25fTmV3CisgIFB5Q0Z1bmN0aW9uX05ld0V4PXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX05ld0V4CisgIFB5Q0Z1bmN0aW9uX1R5cGU9cHl0aG9uMzYuUHlDRnVuY3Rpb25fVHlwZSBEQVRBCisgIFB5Q2FsbEl0ZXJfTmV3PXB5dGhvbjM2LlB5Q2FsbEl0ZXJfTmV3CisgIFB5Q2FsbEl0ZXJfVHlwZT1weXRob24zNi5QeUNhbGxJdGVyX1R5cGUgREFUQQorICBQeUNhbGxhYmxlX0NoZWNrPXB5dGhvbjM2LlB5Q2FsbGFibGVfQ2hlY2sKKyAgUHlDYXBzdWxlX0dldENvbnRleHQ9cHl0aG9uMzYuUHlDYXBzdWxlX0dldENvbnRleHQKKyAgUHlDYXBzdWxlX0dldERlc3RydWN0b3I9cHl0aG9uMzYuUHlDYXBzdWxlX0dldERlc3RydWN0b3IKKyAgUHlDYXBzdWxlX0dldE5hbWU9cHl0aG9uMzYuUHlDYXBzdWxlX0dldE5hbWUKKyAgUHlDYXBzdWxlX0dldFBvaW50ZXI9cHl0aG9uMzYuUHlDYXBzdWxlX0dldFBvaW50ZXIKKyAgUHlDYXBzdWxlX0ltcG9ydD1weXRob24zNi5QeUNhcHN1bGVfSW1wb3J0CisgIFB5Q2Fwc3VsZV9Jc1ZhbGlkPXB5dGhvbjM2LlB5Q2Fwc3VsZV9Jc1ZhbGlkCisgIFB5Q2Fwc3VsZV9OZXc9cHl0aG9uMzYuUHlDYXBzdWxlX05ldworICBQeUNhcHN1bGVfU2V0Q29udGV4dD1weXRob24zNi5QeUNhcHN1bGVfU2V0Q29udGV4dAorICBQeUNhcHN1bGVfU2V0RGVzdHJ1Y3Rvcj1weXRob24zNi5QeUNhcHN1bGVfU2V0RGVzdHJ1Y3RvcgorICBQeUNhcHN1bGVfU2V0TmFtZT1weXRob24zNi5QeUNhcHN1bGVfU2V0TmFtZQorICBQeUNhcHN1bGVfU2V0UG9pbnRlcj1weXRob24zNi5QeUNhcHN1bGVfU2V0UG9pbnRlcgorICBQeUNhcHN1bGVfVHlwZT1weXRob24zNi5QeUNhcHN1bGVfVHlwZSBEQVRBCisgIFB5Q2xhc3NNZXRob2REZXNjcl9UeXBlPXB5dGhvbjM2LlB5Q2xhc3NNZXRob2REZXNjcl9UeXBlIERBVEEKKyAgUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzPXB5dGhvbjM2LlB5Q29kZWNfQmFja3NsYXNoUmVwbGFjZUVycm9ycworICBQeUNvZGVjX0RlY29kZT1weXRob24zNi5QeUNvZGVjX0RlY29kZQorICBQeUNvZGVjX0RlY29kZXI9cHl0aG9uMzYuUHlDb2RlY19EZWNvZGVyCisgIFB5Q29kZWNfRW5jb2RlPXB5dGhvbjM2LlB5Q29kZWNfRW5jb2RlCisgIFB5Q29kZWNfRW5jb2Rlcj1weXRob24zNi5QeUNvZGVjX0VuY29kZXIKKyAgUHlDb2RlY19JZ25vcmVFcnJvcnM9cHl0aG9uMzYuUHlDb2RlY19JZ25vcmVFcnJvcnMKKyAgUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXI9cHl0aG9uMzYuUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIKKyAgUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXI9cHl0aG9uMzYuUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXIKKyAgUHlDb2RlY19Lbm93bkVuY29kaW5nPXB5dGhvbjM2LlB5Q29kZWNfS25vd25FbmNvZGluZworICBQeUNvZGVjX0xvb2t1cEVycm9yPXB5dGhvbjM2LlB5Q29kZWNfTG9va3VwRXJyb3IKKyAgUHlDb2RlY19SZWdpc3Rlcj1weXRob24zNi5QeUNvZGVjX1JlZ2lzdGVyCisgIFB5Q29kZWNfUmVnaXN0ZXJFcnJvcj1weXRob24zNi5QeUNvZGVjX1JlZ2lzdGVyRXJyb3IKKyAgUHlDb2RlY19SZXBsYWNlRXJyb3JzPXB5dGhvbjM2LlB5Q29kZWNfUmVwbGFjZUVycm9ycworICBQeUNvZGVjX1N0cmVhbVJlYWRlcj1weXRob24zNi5QeUNvZGVjX1N0cmVhbVJlYWRlcgorICBQeUNvZGVjX1N0cmVhbVdyaXRlcj1weXRob24zNi5QeUNvZGVjX1N0cmVhbVdyaXRlcgorICBQeUNvZGVjX1N0cmljdEVycm9ycz1weXRob24zNi5QeUNvZGVjX1N0cmljdEVycm9ycworICBQeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzPXB5dGhvbjM2LlB5Q29kZWNfWE1MQ2hhclJlZlJlcGxhY2VFcnJvcnMKKyAgUHlDb21wbGV4X0Zyb21Eb3VibGVzPXB5dGhvbjM2LlB5Q29tcGxleF9Gcm9tRG91YmxlcworICBQeUNvbXBsZXhfSW1hZ0FzRG91YmxlPXB5dGhvbjM2LlB5Q29tcGxleF9JbWFnQXNEb3VibGUKKyAgUHlDb21wbGV4X1JlYWxBc0RvdWJsZT1weXRob24zNi5QeUNvbXBsZXhfUmVhbEFzRG91YmxlCisgIFB5Q29tcGxleF9UeXBlPXB5dGhvbjM2LlB5Q29tcGxleF9UeXBlIERBVEEKKyAgUHlEZXNjcl9OZXdDbGFzc01ldGhvZD1weXRob24zNi5QeURlc2NyX05ld0NsYXNzTWV0aG9kCisgIFB5RGVzY3JfTmV3R2V0U2V0PXB5dGhvbjM2LlB5RGVzY3JfTmV3R2V0U2V0CisgIFB5RGVzY3JfTmV3TWVtYmVyPXB5dGhvbjM2LlB5RGVzY3JfTmV3TWVtYmVyCisgIFB5RGVzY3JfTmV3TWV0aG9kPXB5dGhvbjM2LlB5RGVzY3JfTmV3TWV0aG9kCisgIFB5RGljdEl0ZW1zX1R5cGU9cHl0aG9uMzYuUHlEaWN0SXRlbXNfVHlwZSBEQVRBCisgIFB5RGljdEl0ZXJJdGVtX1R5cGU9cHl0aG9uMzYuUHlEaWN0SXRlckl0ZW1fVHlwZSBEQVRBCisgIFB5RGljdEl0ZXJLZXlfVHlwZT1weXRob24zNi5QeURpY3RJdGVyS2V5X1R5cGUgREFUQQorICBQeURpY3RJdGVyVmFsdWVfVHlwZT1weXRob24zNi5QeURpY3RJdGVyVmFsdWVfVHlwZSBEQVRBCisgIFB5RGljdEtleXNfVHlwZT1weXRob24zNi5QeURpY3RLZXlzX1R5cGUgREFUQQorICBQeURpY3RQcm94eV9OZXc9cHl0aG9uMzYuUHlEaWN0UHJveHlfTmV3CisgIFB5RGljdFByb3h5X1R5cGU9cHl0aG9uMzYuUHlEaWN0UHJveHlfVHlwZSBEQVRBCisgIFB5RGljdFZhbHVlc19UeXBlPXB5dGhvbjM2LlB5RGljdFZhbHVlc19UeXBlIERBVEEKKyAgUHlEaWN0X0NsZWFyPXB5dGhvbjM2LlB5RGljdF9DbGVhcgorICBQeURpY3RfQ29udGFpbnM9cHl0aG9uMzYuUHlEaWN0X0NvbnRhaW5zCisgIFB5RGljdF9Db3B5PXB5dGhvbjM2LlB5RGljdF9Db3B5CisgIFB5RGljdF9EZWxJdGVtPXB5dGhvbjM2LlB5RGljdF9EZWxJdGVtCisgIFB5RGljdF9EZWxJdGVtU3RyaW5nPXB5dGhvbjM2LlB5RGljdF9EZWxJdGVtU3RyaW5nCisgIFB5RGljdF9HZXRJdGVtPXB5dGhvbjM2LlB5RGljdF9HZXRJdGVtCisgIFB5RGljdF9HZXRJdGVtU3RyaW5nPXB5dGhvbjM2LlB5RGljdF9HZXRJdGVtU3RyaW5nCisgIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yPXB5dGhvbjM2LlB5RGljdF9HZXRJdGVtV2l0aEVycm9yCisgIFB5RGljdF9JdGVtcz1weXRob24zNi5QeURpY3RfSXRlbXMKKyAgUHlEaWN0X0tleXM9cHl0aG9uMzYuUHlEaWN0X0tleXMKKyAgUHlEaWN0X01lcmdlPXB5dGhvbjM2LlB5RGljdF9NZXJnZQorICBQeURpY3RfTWVyZ2VGcm9tU2VxMj1weXRob24zNi5QeURpY3RfTWVyZ2VGcm9tU2VxMgorICBQeURpY3RfTmV3PXB5dGhvbjM2LlB5RGljdF9OZXcKKyAgUHlEaWN0X05leHQ9cHl0aG9uMzYuUHlEaWN0X05leHQKKyAgUHlEaWN0X1NldEl0ZW09cHl0aG9uMzYuUHlEaWN0X1NldEl0ZW0KKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlEaWN0X1NldEl0ZW1TdHJpbmcKKyAgUHlEaWN0X1NpemU9cHl0aG9uMzYuUHlEaWN0X1NpemUKKyAgUHlEaWN0X1R5cGU9cHl0aG9uMzYuUHlEaWN0X1R5cGUgREFUQQorICBQeURpY3RfVXBkYXRlPXB5dGhvbjM2LlB5RGljdF9VcGRhdGUKKyAgUHlEaWN0X1ZhbHVlcz1weXRob24zNi5QeURpY3RfVmFsdWVzCisgIFB5RWxsaXBzaXNfVHlwZT1weXRob24zNi5QeUVsbGlwc2lzX1R5cGUgREFUQQorICBQeUVudW1fVHlwZT1weXRob24zNi5QeUVudW1fVHlwZSBEQVRBCisgIFB5RXJyX0JhZEFyZ3VtZW50PXB5dGhvbjM2LlB5RXJyX0JhZEFyZ3VtZW50CisgIFB5RXJyX0JhZEludGVybmFsQ2FsbD1weXRob24zNi5QeUVycl9CYWRJbnRlcm5hbENhbGwKKyAgUHlFcnJfQ2hlY2tTaWduYWxzPXB5dGhvbjM2LlB5RXJyX0NoZWNrU2lnbmFscworICBQeUVycl9DbGVhcj1weXRob24zNi5QeUVycl9DbGVhcgorICBQeUVycl9EaXNwbGF5PXB5dGhvbjM2LlB5RXJyX0Rpc3BsYXkKKyAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcz1weXRob24zNi5QeUVycl9FeGNlcHRpb25NYXRjaGVzCisgIFB5RXJyX0ZldGNoPXB5dGhvbjM2LlB5RXJyX0ZldGNoCisgIFB5RXJyX0Zvcm1hdD1weXRob24zNi5QeUVycl9Gb3JtYXQKKyAgUHlFcnJfRm9ybWF0Vj1weXRob24zNi5QeUVycl9Gb3JtYXRWCisgIFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcz1weXRob24zNi5QeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMKKyAgUHlFcnJfTmV3RXhjZXB0aW9uPXB5dGhvbjM2LlB5RXJyX05ld0V4Y2VwdGlvbgorICBQeUVycl9OZXdFeGNlcHRpb25XaXRoRG9jPXB5dGhvbjM2LlB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2MKKyAgUHlFcnJfTm9NZW1vcnk9cHl0aG9uMzYuUHlFcnJfTm9NZW1vcnkKKyAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uPXB5dGhvbjM2LlB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbgorICBQeUVycl9PY2N1cnJlZD1weXRob24zNi5QeUVycl9PY2N1cnJlZAorICBQeUVycl9QcmludD1weXRob24zNi5QeUVycl9QcmludAorICBQeUVycl9QcmludEV4PXB5dGhvbjM2LlB5RXJyX1ByaW50RXgKKyAgUHlFcnJfUHJvZ3JhbVRleHQ9cHl0aG9uMzYuUHlFcnJfUHJvZ3JhbVRleHQKKyAgUHlFcnJfUmVzdG9yZT1weXRob24zNi5QeUVycl9SZXN0b3JlCisgIFB5RXJyX1NldEZyb21FcnJubz1weXRob24zNi5QeUVycl9TZXRGcm9tRXJybm8KKyAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lPXB5dGhvbjM2LlB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZQorICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3Q9cHl0aG9uMzYuUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0CisgIFB5RXJyX1NldEludGVycnVwdD1weXRob24zNi5QeUVycl9TZXRJbnRlcnJ1cHQKKyAgUHlFcnJfU2V0Tm9uZT1weXRob24zNi5QeUVycl9TZXROb25lCisgIFB5RXJyX1NldE9iamVjdD1weXRob24zNi5QeUVycl9TZXRPYmplY3QKKyAgUHlFcnJfU2V0U3RyaW5nPXB5dGhvbjM2LlB5RXJyX1NldFN0cmluZworICBQeUVycl9TeW50YXhMb2NhdGlvbj1weXRob24zNi5QeUVycl9TeW50YXhMb2NhdGlvbgorICBQeUVycl9XYXJuRXg9cHl0aG9uMzYuUHlFcnJfV2FybkV4CisgIFB5RXJyX1dhcm5FeHBsaWNpdD1weXRob24zNi5QeUVycl9XYXJuRXhwbGljaXQKKyAgUHlFcnJfV2FybkZvcm1hdD1weXRob24zNi5QeUVycl9XYXJuRm9ybWF0CisgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZT1weXRob24zNi5QeUVycl9Xcml0ZVVucmFpc2FibGUKKyAgUHlFdmFsX0FjcXVpcmVMb2NrPXB5dGhvbjM2LlB5RXZhbF9BY3F1aXJlTG9jaworICBQeUV2YWxfQWNxdWlyZVRocmVhZD1weXRob24zNi5QeUV2YWxfQWNxdWlyZVRocmVhZAorICBQeUV2YWxfQ2FsbEZ1bmN0aW9uPXB5dGhvbjM2LlB5RXZhbF9DYWxsRnVuY3Rpb24KKyAgUHlFdmFsX0NhbGxNZXRob2Q9cHl0aG9uMzYuUHlFdmFsX0NhbGxNZXRob2QKKyAgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHM9cHl0aG9uMzYuUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMKKyAgUHlFdmFsX0V2YWxDb2RlPXB5dGhvbjM2LlB5RXZhbF9FdmFsQ29kZQorICBQeUV2YWxfRXZhbENvZGVFeD1weXRob24zNi5QeUV2YWxfRXZhbENvZGVFeAorICBQeUV2YWxfRXZhbEZyYW1lPXB5dGhvbjM2LlB5RXZhbF9FdmFsRnJhbWUKKyAgUHlFdmFsX0V2YWxGcmFtZUV4PXB5dGhvbjM2LlB5RXZhbF9FdmFsRnJhbWVFeAorICBQeUV2YWxfR2V0QnVpbHRpbnM9cHl0aG9uMzYuUHlFdmFsX0dldEJ1aWx0aW5zCisgIFB5RXZhbF9HZXRDYWxsU3RhdHM9cHl0aG9uMzYuUHlFdmFsX0dldENhbGxTdGF0cworICBQeUV2YWxfR2V0RnJhbWU9cHl0aG9uMzYuUHlFdmFsX0dldEZyYW1lCisgIFB5RXZhbF9HZXRGdW5jRGVzYz1weXRob24zNi5QeUV2YWxfR2V0RnVuY0Rlc2MKKyAgUHlFdmFsX0dldEZ1bmNOYW1lPXB5dGhvbjM2LlB5RXZhbF9HZXRGdW5jTmFtZQorICBQeUV2YWxfR2V0R2xvYmFscz1weXRob24zNi5QeUV2YWxfR2V0R2xvYmFscworICBQeUV2YWxfR2V0TG9jYWxzPXB5dGhvbjM2LlB5RXZhbF9HZXRMb2NhbHMKKyAgUHlFdmFsX0luaXRUaHJlYWRzPXB5dGhvbjM2LlB5RXZhbF9Jbml0VGhyZWFkcworICBQeUV2YWxfUmVJbml0VGhyZWFkcz1weXRob24zNi5QeUV2YWxfUmVJbml0VGhyZWFkcworICBQeUV2YWxfUmVsZWFzZUxvY2s9cHl0aG9uMzYuUHlFdmFsX1JlbGVhc2VMb2NrCisgIFB5RXZhbF9SZWxlYXNlVGhyZWFkPXB5dGhvbjM2LlB5RXZhbF9SZWxlYXNlVGhyZWFkCisgIFB5RXZhbF9SZXN0b3JlVGhyZWFkPXB5dGhvbjM2LlB5RXZhbF9SZXN0b3JlVGhyZWFkCisgIFB5RXZhbF9TYXZlVGhyZWFkPXB5dGhvbjM2LlB5RXZhbF9TYXZlVGhyZWFkCisgIFB5RXZhbF9UaHJlYWRzSW5pdGlhbGl6ZWQ9cHl0aG9uMzYuUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZAorICBQeUV4Y19Bcml0aG1ldGljRXJyb3I9cHl0aG9uMzYuUHlFeGNfQXJpdGhtZXRpY0Vycm9yIERBVEEKKyAgUHlFeGNfQXNzZXJ0aW9uRXJyb3I9cHl0aG9uMzYuUHlFeGNfQXNzZXJ0aW9uRXJyb3IgREFUQQorICBQeUV4Y19BdHRyaWJ1dGVFcnJvcj1weXRob24zNi5QeUV4Y19BdHRyaWJ1dGVFcnJvciBEQVRBCisgIFB5RXhjX0Jhc2VFeGNlcHRpb249cHl0aG9uMzYuUHlFeGNfQmFzZUV4Y2VwdGlvbiBEQVRBCisgIFB5RXhjX0J1ZmZlckVycm9yPXB5dGhvbjM2LlB5RXhjX0J1ZmZlckVycm9yIERBVEEKKyAgUHlFeGNfQnl0ZXNXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX0J5dGVzV2FybmluZyBEQVRBCisgIFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZz1weXRob24zNi5QeUV4Y19EZXByZWNhdGlvbldhcm5pbmcgREFUQQorICBQeUV4Y19FT0ZFcnJvcj1weXRob24zNi5QeUV4Y19FT0ZFcnJvciBEQVRBCisgIFB5RXhjX0Vudmlyb25tZW50RXJyb3I9cHl0aG9uMzYuUHlFeGNfRW52aXJvbm1lbnRFcnJvciBEQVRBCisgIFB5RXhjX0V4Y2VwdGlvbj1weXRob24zNi5QeUV4Y19FeGNlcHRpb24gREFUQQorICBQeUV4Y19GbG9hdGluZ1BvaW50RXJyb3I9cHl0aG9uMzYuUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yIERBVEEKKyAgUHlFeGNfRnV0dXJlV2FybmluZz1weXRob24zNi5QeUV4Y19GdXR1cmVXYXJuaW5nIERBVEEKKyAgUHlFeGNfR2VuZXJhdG9yRXhpdD1weXRob24zNi5QeUV4Y19HZW5lcmF0b3JFeGl0IERBVEEKKyAgUHlFeGNfSU9FcnJvcj1weXRob24zNi5QeUV4Y19JT0Vycm9yIERBVEEKKyAgUHlFeGNfSW1wb3J0RXJyb3I9cHl0aG9uMzYuUHlFeGNfSW1wb3J0RXJyb3IgREFUQQorICBQeUV4Y19JbXBvcnRXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX0ltcG9ydFdhcm5pbmcgREFUQQorICBQeUV4Y19JbmRlbnRhdGlvbkVycm9yPXB5dGhvbjM2LlB5RXhjX0luZGVudGF0aW9uRXJyb3IgREFUQQorICBQeUV4Y19JbmRleEVycm9yPXB5dGhvbjM2LlB5RXhjX0luZGV4RXJyb3IgREFUQQorICBQeUV4Y19LZXlFcnJvcj1weXRob24zNi5QeUV4Y19LZXlFcnJvciBEQVRBCisgIFB5RXhjX0tleWJvYXJkSW50ZXJydXB0PXB5dGhvbjM2LlB5RXhjX0tleWJvYXJkSW50ZXJydXB0IERBVEEKKyAgUHlFeGNfTG9va3VwRXJyb3I9cHl0aG9uMzYuUHlFeGNfTG9va3VwRXJyb3IgREFUQQorICBQeUV4Y19NZW1vcnlFcnJvcj1weXRob24zNi5QeUV4Y19NZW1vcnlFcnJvciBEQVRBCisgIFB5RXhjX01lbW9yeUVycm9ySW5zdD1weXRob24zNi5QeUV4Y19NZW1vcnlFcnJvckluc3QgREFUQQorICBQeUV4Y19OYW1lRXJyb3I9cHl0aG9uMzYuUHlFeGNfTmFtZUVycm9yIERBVEEKKyAgUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcj1weXRob24zNi5QeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yIERBVEEKKyAgUHlFeGNfT1NFcnJvcj1weXRob24zNi5QeUV4Y19PU0Vycm9yIERBVEEKKyAgUHlFeGNfT3ZlcmZsb3dFcnJvcj1weXRob24zNi5QeUV4Y19PdmVyZmxvd0Vycm9yIERBVEEKKyAgUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZz1weXRob24zNi5QeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIERBVEEKKyAgUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0PXB5dGhvbjM2LlB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdCBEQVRBCisgIFB5RXhjX1JlZmVyZW5jZUVycm9yPXB5dGhvbjM2LlB5RXhjX1JlZmVyZW5jZUVycm9yIERBVEEKKyAgUHlFeGNfUnVudGltZUVycm9yPXB5dGhvbjM2LlB5RXhjX1J1bnRpbWVFcnJvciBEQVRBCisgIFB5RXhjX1J1bnRpbWVXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1J1bnRpbWVXYXJuaW5nIERBVEEKKyAgUHlFeGNfU3RvcEl0ZXJhdGlvbj1weXRob24zNi5QeUV4Y19TdG9wSXRlcmF0aW9uIERBVEEKKyAgUHlFeGNfU3ludGF4RXJyb3I9cHl0aG9uMzYuUHlFeGNfU3ludGF4RXJyb3IgREFUQQorICBQeUV4Y19TeW50YXhXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1N5bnRheFdhcm5pbmcgREFUQQorICBQeUV4Y19TeXN0ZW1FcnJvcj1weXRob24zNi5QeUV4Y19TeXN0ZW1FcnJvciBEQVRBCisgIFB5RXhjX1N5c3RlbUV4aXQ9cHl0aG9uMzYuUHlFeGNfU3lzdGVtRXhpdCBEQVRBCisgIFB5RXhjX1RhYkVycm9yPXB5dGhvbjM2LlB5RXhjX1RhYkVycm9yIERBVEEKKyAgUHlFeGNfVHlwZUVycm9yPXB5dGhvbjM2LlB5RXhjX1R5cGVFcnJvciBEQVRBCisgIFB5RXhjX1VuYm91bmRMb2NhbEVycm9yPXB5dGhvbjM2LlB5RXhjX1VuYm91bmRMb2NhbEVycm9yIERBVEEKKyAgUHlFeGNfVW5pY29kZURlY29kZUVycm9yPXB5dGhvbjM2LlB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvciBEQVRBCisgIFB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvcj1weXRob24zNi5QeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IgREFUQQorICBQeUV4Y19Vbmljb2RlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVW5pY29kZUVycm9yIERBVEEKKyAgUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yPXB5dGhvbjM2LlB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvciBEQVRBCisgIFB5RXhjX1VuaWNvZGVXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1VuaWNvZGVXYXJuaW5nIERBVEEKKyAgUHlFeGNfVXNlcldhcm5pbmc9cHl0aG9uMzYuUHlFeGNfVXNlcldhcm5pbmcgREFUQQorICBQeUV4Y19WYWx1ZUVycm9yPXB5dGhvbjM2LlB5RXhjX1ZhbHVlRXJyb3IgREFUQQorICBQeUV4Y19XYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1dhcm5pbmcgREFUQQorICBQeUV4Y19aZXJvRGl2aXNpb25FcnJvcj1weXRob24zNi5QeUV4Y19aZXJvRGl2aXNpb25FcnJvciBEQVRBCisgIFB5RXhjZXB0aW9uX0dldENhdXNlPXB5dGhvbjM2LlB5RXhjZXB0aW9uX0dldENhdXNlCisgIFB5RXhjZXB0aW9uX0dldENvbnRleHQ9cHl0aG9uMzYuUHlFeGNlcHRpb25fR2V0Q29udGV4dAorICBQeUV4Y2VwdGlvbl9HZXRUcmFjZWJhY2s9cHl0aG9uMzYuUHlFeGNlcHRpb25fR2V0VHJhY2ViYWNrCisgIFB5RXhjZXB0aW9uX1NldENhdXNlPXB5dGhvbjM2LlB5RXhjZXB0aW9uX1NldENhdXNlCisgIFB5RXhjZXB0aW9uX1NldENvbnRleHQ9cHl0aG9uMzYuUHlFeGNlcHRpb25fU2V0Q29udGV4dAorICBQeUV4Y2VwdGlvbl9TZXRUcmFjZWJhY2s9cHl0aG9uMzYuUHlFeGNlcHRpb25fU2V0VHJhY2ViYWNrCisgIFB5RmlsZV9Gcm9tRmQ9cHl0aG9uMzYuUHlGaWxlX0Zyb21GZAorICBQeUZpbGVfR2V0TGluZT1weXRob24zNi5QeUZpbGVfR2V0TGluZQorICBQeUZpbGVfV3JpdGVPYmplY3Q9cHl0aG9uMzYuUHlGaWxlX1dyaXRlT2JqZWN0CisgIFB5RmlsZV9Xcml0ZVN0cmluZz1weXRob24zNi5QeUZpbGVfV3JpdGVTdHJpbmcKKyAgUHlGaWx0ZXJfVHlwZT1weXRob24zNi5QeUZpbHRlcl9UeXBlIERBVEEKKyAgUHlGbG9hdF9Bc0RvdWJsZT1weXRob24zNi5QeUZsb2F0X0FzRG91YmxlCisgIFB5RmxvYXRfRnJvbURvdWJsZT1weXRob24zNi5QeUZsb2F0X0Zyb21Eb3VibGUKKyAgUHlGbG9hdF9Gcm9tU3RyaW5nPXB5dGhvbjM2LlB5RmxvYXRfRnJvbVN0cmluZworICBQeUZsb2F0X0dldEluZm89cHl0aG9uMzYuUHlGbG9hdF9HZXRJbmZvCisgIFB5RmxvYXRfR2V0TWF4PXB5dGhvbjM2LlB5RmxvYXRfR2V0TWF4CisgIFB5RmxvYXRfR2V0TWluPXB5dGhvbjM2LlB5RmxvYXRfR2V0TWluCisgIFB5RmxvYXRfVHlwZT1weXRob24zNi5QeUZsb2F0X1R5cGUgREFUQQorICBQeUZyb3plblNldF9OZXc9cHl0aG9uMzYuUHlGcm96ZW5TZXRfTmV3CisgIFB5RnJvemVuU2V0X1R5cGU9cHl0aG9uMzYuUHlGcm96ZW5TZXRfVHlwZSBEQVRBCisgIFB5R0NfQ29sbGVjdD1weXRob24zNi5QeUdDX0NvbGxlY3QKKyAgUHlHSUxTdGF0ZV9FbnN1cmU9cHl0aG9uMzYuUHlHSUxTdGF0ZV9FbnN1cmUKKyAgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGU9cHl0aG9uMzYuUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUKKyAgUHlHSUxTdGF0ZV9SZWxlYXNlPXB5dGhvbjM2LlB5R0lMU3RhdGVfUmVsZWFzZQorICBQeUdldFNldERlc2NyX1R5cGU9cHl0aG9uMzYuUHlHZXRTZXREZXNjcl9UeXBlIERBVEEKKyAgUHlJbXBvcnRfQWRkTW9kdWxlPXB5dGhvbjM2LlB5SW1wb3J0X0FkZE1vZHVsZQorICBQeUltcG9ydF9BcHBlbmRJbml0dGFiPXB5dGhvbjM2LlB5SW1wb3J0X0FwcGVuZEluaXR0YWIKKyAgUHlJbXBvcnRfQ2xlYW51cD1weXRob24zNi5QeUltcG9ydF9DbGVhbnVwCisgIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlPXB5dGhvbjM2LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlCisgIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXg9cHl0aG9uMzYuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeAorICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZVdpdGhQYXRobmFtZXM9cHl0aG9uMzYuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVXaXRoUGF0aG5hbWVzCisgIFB5SW1wb3J0X0dldEltcG9ydGVyPXB5dGhvbjM2LlB5SW1wb3J0X0dldEltcG9ydGVyCisgIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyPXB5dGhvbjM2LlB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyCisgIFB5SW1wb3J0X0dldE1hZ2ljVGFnPXB5dGhvbjM2LlB5SW1wb3J0X0dldE1hZ2ljVGFnCisgIFB5SW1wb3J0X0dldE1vZHVsZURpY3Q9cHl0aG9uMzYuUHlJbXBvcnRfR2V0TW9kdWxlRGljdAorICBQeUltcG9ydF9JbXBvcnQ9cHl0aG9uMzYuUHlJbXBvcnRfSW1wb3J0CisgIFB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZT1weXRob24zNi5QeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUKKyAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlPXB5dGhvbjM2LlB5SW1wb3J0X0ltcG9ydE1vZHVsZQorICBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbD1weXRob24zNi5QeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbAorICBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrPXB5dGhvbjM2LlB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2sKKyAgUHlJbXBvcnRfUmVsb2FkTW9kdWxlPXB5dGhvbjM2LlB5SW1wb3J0X1JlbG9hZE1vZHVsZQorICBQeUludGVycHJldGVyU3RhdGVfQ2xlYXI9cHl0aG9uMzYuUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyCisgIFB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGU9cHl0aG9uMzYuUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZQorICBQeUludGVycHJldGVyU3RhdGVfTmV3PXB5dGhvbjM2LlB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcKKyAgUHlJdGVyX05leHQ9cHl0aG9uMzYuUHlJdGVyX05leHQKKyAgUHlMaXN0SXRlcl9UeXBlPXB5dGhvbjM2LlB5TGlzdEl0ZXJfVHlwZSBEQVRBCisgIFB5TGlzdFJldkl0ZXJfVHlwZT1weXRob24zNi5QeUxpc3RSZXZJdGVyX1R5cGUgREFUQQorICBQeUxpc3RfQXBwZW5kPXB5dGhvbjM2LlB5TGlzdF9BcHBlbmQKKyAgUHlMaXN0X0FzVHVwbGU9cHl0aG9uMzYuUHlMaXN0X0FzVHVwbGUKKyAgUHlMaXN0X0dldEl0ZW09cHl0aG9uMzYuUHlMaXN0X0dldEl0ZW0KKyAgUHlMaXN0X0dldFNsaWNlPXB5dGhvbjM2LlB5TGlzdF9HZXRTbGljZQorICBQeUxpc3RfSW5zZXJ0PXB5dGhvbjM2LlB5TGlzdF9JbnNlcnQKKyAgUHlMaXN0X05ldz1weXRob24zNi5QeUxpc3RfTmV3CisgIFB5TGlzdF9SZXZlcnNlPXB5dGhvbjM2LlB5TGlzdF9SZXZlcnNlCisgIFB5TGlzdF9TZXRJdGVtPXB5dGhvbjM2LlB5TGlzdF9TZXRJdGVtCisgIFB5TGlzdF9TZXRTbGljZT1weXRob24zNi5QeUxpc3RfU2V0U2xpY2UKKyAgUHlMaXN0X1NpemU9cHl0aG9uMzYuUHlMaXN0X1NpemUKKyAgUHlMaXN0X1NvcnQ9cHl0aG9uMzYuUHlMaXN0X1NvcnQKKyAgUHlMaXN0X1R5cGU9cHl0aG9uMzYuUHlMaXN0X1R5cGUgREFUQQorICBQeUxvbmdSYW5nZUl0ZXJfVHlwZT1weXRob24zNi5QeUxvbmdSYW5nZUl0ZXJfVHlwZSBEQVRBCisgIFB5TG9uZ19Bc0RvdWJsZT1weXRob24zNi5QeUxvbmdfQXNEb3VibGUKKyAgUHlMb25nX0FzTG9uZz1weXRob24zNi5QeUxvbmdfQXNMb25nCisgIFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdz1weXRob24zNi5QeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cKKyAgUHlMb25nX0FzTG9uZ0xvbmc9cHl0aG9uMzYuUHlMb25nX0FzTG9uZ0xvbmcKKyAgUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdz1weXRob24zNi5QeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93CisgIFB5TG9uZ19Bc1NpemVfdD1weXRob24zNi5QeUxvbmdfQXNTaXplX3QKKyAgUHlMb25nX0FzU3NpemVfdD1weXRob24zNi5QeUxvbmdfQXNTc2l6ZV90CisgIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZz1weXRob24zNi5QeUxvbmdfQXNVbnNpZ25lZExvbmcKKyAgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZz1weXRob24zNi5QeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nCisgIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrPXB5dGhvbjM2LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrCisgIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2s9cHl0aG9uMzYuUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaworICBQeUxvbmdfQXNWb2lkUHRyPXB5dGhvbjM2LlB5TG9uZ19Bc1ZvaWRQdHIKKyAgUHlMb25nX0Zyb21Eb3VibGU9cHl0aG9uMzYuUHlMb25nX0Zyb21Eb3VibGUKKyAgUHlMb25nX0Zyb21Mb25nPXB5dGhvbjM2LlB5TG9uZ19Gcm9tTG9uZworICBQeUxvbmdfRnJvbUxvbmdMb25nPXB5dGhvbjM2LlB5TG9uZ19Gcm9tTG9uZ0xvbmcKKyAgUHlMb25nX0Zyb21TaXplX3Q9cHl0aG9uMzYuUHlMb25nX0Zyb21TaXplX3QKKyAgUHlMb25nX0Zyb21Tc2l6ZV90PXB5dGhvbjM2LlB5TG9uZ19Gcm9tU3NpemVfdAorICBQeUxvbmdfRnJvbVN0cmluZz1weXRob24zNi5QeUxvbmdfRnJvbVN0cmluZworICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZz1weXRob24zNi5QeUxvbmdfRnJvbVVuc2lnbmVkTG9uZworICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmc9cHl0aG9uMzYuUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nCisgIFB5TG9uZ19Gcm9tVm9pZFB0cj1weXRob24zNi5QeUxvbmdfRnJvbVZvaWRQdHIKKyAgUHlMb25nX0dldEluZm89cHl0aG9uMzYuUHlMb25nX0dldEluZm8KKyAgUHlMb25nX1R5cGU9cHl0aG9uMzYuUHlMb25nX1R5cGUgREFUQQorICBQeU1hcF9UeXBlPXB5dGhvbjM2LlB5TWFwX1R5cGUgREFUQQorICBQeU1hcHBpbmdfQ2hlY2s9cHl0aG9uMzYuUHlNYXBwaW5nX0NoZWNrCisgIFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nPXB5dGhvbjM2LlB5TWFwcGluZ19HZXRJdGVtU3RyaW5nCisgIFB5TWFwcGluZ19IYXNLZXk9cHl0aG9uMzYuUHlNYXBwaW5nX0hhc0tleQorICBQeU1hcHBpbmdfSGFzS2V5U3RyaW5nPXB5dGhvbjM2LlB5TWFwcGluZ19IYXNLZXlTdHJpbmcKKyAgUHlNYXBwaW5nX0l0ZW1zPXB5dGhvbjM2LlB5TWFwcGluZ19JdGVtcworICBQeU1hcHBpbmdfS2V5cz1weXRob24zNi5QeU1hcHBpbmdfS2V5cworICBQeU1hcHBpbmdfTGVuZ3RoPXB5dGhvbjM2LlB5TWFwcGluZ19MZW5ndGgKKyAgUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmcKKyAgUHlNYXBwaW5nX1NpemU9cHl0aG9uMzYuUHlNYXBwaW5nX1NpemUKKyAgUHlNYXBwaW5nX1ZhbHVlcz1weXRob24zNi5QeU1hcHBpbmdfVmFsdWVzCisgIFB5TWVtX0ZyZWU9cHl0aG9uMzYuUHlNZW1fRnJlZQorICBQeU1lbV9NYWxsb2M9cHl0aG9uMzYuUHlNZW1fTWFsbG9jCisgIFB5TWVtX1JlYWxsb2M9cHl0aG9uMzYuUHlNZW1fUmVhbGxvYworICBQeU1lbWJlckRlc2NyX1R5cGU9cHl0aG9uMzYuUHlNZW1iZXJEZXNjcl9UeXBlIERBVEEKKyAgUHlNZW1vcnlWaWV3X0Zyb21PYmplY3Q9cHl0aG9uMzYuUHlNZW1vcnlWaWV3X0Zyb21PYmplY3QKKyAgUHlNZW1vcnlWaWV3X0dldENvbnRpZ3VvdXM9cHl0aG9uMzYuUHlNZW1vcnlWaWV3X0dldENvbnRpZ3VvdXMKKyAgUHlNZW1vcnlWaWV3X1R5cGU9cHl0aG9uMzYuUHlNZW1vcnlWaWV3X1R5cGUgREFUQQorICBQeU1ldGhvZERlc2NyX1R5cGU9cHl0aG9uMzYuUHlNZXRob2REZXNjcl9UeXBlIERBVEEKKyAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQ9cHl0aG9uMzYuUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQKKyAgUHlNb2R1bGVfQWRkT2JqZWN0PXB5dGhvbjM2LlB5TW9kdWxlX0FkZE9iamVjdAorICBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudD1weXRob24zNi5QeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudAorICBQeU1vZHVsZV9DcmVhdGUyPXB5dGhvbjM2LlB5TW9kdWxlX0NyZWF0ZTIKKyAgUHlNb2R1bGVfR2V0RGVmPXB5dGhvbjM2LlB5TW9kdWxlX0dldERlZgorICBQeU1vZHVsZV9HZXREaWN0PXB5dGhvbjM2LlB5TW9kdWxlX0dldERpY3QKKyAgUHlNb2R1bGVfR2V0RmlsZW5hbWU9cHl0aG9uMzYuUHlNb2R1bGVfR2V0RmlsZW5hbWUKKyAgUHlNb2R1bGVfR2V0RmlsZW5hbWVPYmplY3Q9cHl0aG9uMzYuUHlNb2R1bGVfR2V0RmlsZW5hbWVPYmplY3QKKyAgUHlNb2R1bGVfR2V0TmFtZT1weXRob24zNi5QeU1vZHVsZV9HZXROYW1lCisgIFB5TW9kdWxlX0dldFN0YXRlPXB5dGhvbjM2LlB5TW9kdWxlX0dldFN0YXRlCisgIFB5TW9kdWxlX05ldz1weXRob24zNi5QeU1vZHVsZV9OZXcKKyAgUHlNb2R1bGVfVHlwZT1weXRob24zNi5QeU1vZHVsZV9UeXBlIERBVEEKKyAgUHlNb2R1bGVEZWZfSW5pdD1weXRob24zNi5QeU1vZHVsZURlZl9Jbml0CisgIFB5TW9kdWxlRGVmX1R5cGU9cHl0aG9uMzYuUHlNb2R1bGVEZWZfVHlwZSBEQVRBCisgIFB5TnVsbEltcG9ydGVyX1R5cGU9cHl0aG9uMzYuUHlOdWxsSW1wb3J0ZXJfVHlwZSBEQVRBCisgIFB5TnVtYmVyX0Fic29sdXRlPXB5dGhvbjM2LlB5TnVtYmVyX0Fic29sdXRlCisgIFB5TnVtYmVyX0FkZD1weXRob24zNi5QeU51bWJlcl9BZGQKKyAgUHlOdW1iZXJfQW5kPXB5dGhvbjM2LlB5TnVtYmVyX0FuZAorICBQeU51bWJlcl9Bc1NzaXplX3Q9cHl0aG9uMzYuUHlOdW1iZXJfQXNTc2l6ZV90CisgIFB5TnVtYmVyX0NoZWNrPXB5dGhvbjM2LlB5TnVtYmVyX0NoZWNrCisgIFB5TnVtYmVyX0Rpdm1vZD1weXRob24zNi5QeU51bWJlcl9EaXZtb2QKKyAgUHlOdW1iZXJfRmxvYXQ9cHl0aG9uMzYuUHlOdW1iZXJfRmxvYXQKKyAgUHlOdW1iZXJfRmxvb3JEaXZpZGU9cHl0aG9uMzYuUHlOdW1iZXJfRmxvb3JEaXZpZGUKKyAgUHlOdW1iZXJfSW5QbGFjZUFkZD1weXRob24zNi5QeU51bWJlcl9JblBsYWNlQWRkCisgIFB5TnVtYmVyX0luUGxhY2VBbmQ9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZUFuZAorICBQeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGU9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlCisgIFB5TnVtYmVyX0luUGxhY2VMc2hpZnQ9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZUxzaGlmdAorICBQeU51bWJlcl9JblBsYWNlTXVsdGlwbHk9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZU11bHRpcGx5CisgIFB5TnVtYmVyX0luUGxhY2VPcj1weXRob24zNi5QeU51bWJlcl9JblBsYWNlT3IKKyAgUHlOdW1iZXJfSW5QbGFjZVBvd2VyPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VQb3dlcgorICBQeU51bWJlcl9JblBsYWNlUmVtYWluZGVyPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXIKKyAgUHlOdW1iZXJfSW5QbGFjZVJzaGlmdD1weXRob24zNi5QeU51bWJlcl9JblBsYWNlUnNoaWZ0CisgIFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdD1weXRob24zNi5QeU51bWJlcl9JblBsYWNlU3VidHJhY3QKKyAgUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGU9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGUKKyAgUHlOdW1iZXJfSW5QbGFjZVhvcj1weXRob24zNi5QeU51bWJlcl9JblBsYWNlWG9yCisgIFB5TnVtYmVyX0luZGV4PXB5dGhvbjM2LlB5TnVtYmVyX0luZGV4CisgIFB5TnVtYmVyX0ludmVydD1weXRob24zNi5QeU51bWJlcl9JbnZlcnQKKyAgUHlOdW1iZXJfTG9uZz1weXRob24zNi5QeU51bWJlcl9Mb25nCisgIFB5TnVtYmVyX0xzaGlmdD1weXRob24zNi5QeU51bWJlcl9Mc2hpZnQKKyAgUHlOdW1iZXJfTXVsdGlwbHk9cHl0aG9uMzYuUHlOdW1iZXJfTXVsdGlwbHkKKyAgUHlOdW1iZXJfTmVnYXRpdmU9cHl0aG9uMzYuUHlOdW1iZXJfTmVnYXRpdmUKKyAgUHlOdW1iZXJfT3I9cHl0aG9uMzYuUHlOdW1iZXJfT3IKKyAgUHlOdW1iZXJfUG9zaXRpdmU9cHl0aG9uMzYuUHlOdW1iZXJfUG9zaXRpdmUKKyAgUHlOdW1iZXJfUG93ZXI9cHl0aG9uMzYuUHlOdW1iZXJfUG93ZXIKKyAgUHlOdW1iZXJfUmVtYWluZGVyPXB5dGhvbjM2LlB5TnVtYmVyX1JlbWFpbmRlcgorICBQeU51bWJlcl9Sc2hpZnQ9cHl0aG9uMzYuUHlOdW1iZXJfUnNoaWZ0CisgIFB5TnVtYmVyX1N1YnRyYWN0PXB5dGhvbjM2LlB5TnVtYmVyX1N1YnRyYWN0CisgIFB5TnVtYmVyX1RvQmFzZT1weXRob24zNi5QeU51bWJlcl9Ub0Jhc2UKKyAgUHlOdW1iZXJfVHJ1ZURpdmlkZT1weXRob24zNi5QeU51bWJlcl9UcnVlRGl2aWRlCisgIFB5TnVtYmVyX1hvcj1weXRob24zNi5QeU51bWJlcl9Yb3IKKyAgUHlPU19BZnRlckZvcms9cHl0aG9uMzYuUHlPU19BZnRlckZvcmsKKyAgUHlPU19Jbml0SW50ZXJydXB0cz1weXRob24zNi5QeU9TX0luaXRJbnRlcnJ1cHRzCisgIFB5T1NfSW5wdXRIb29rPXB5dGhvbjM2LlB5T1NfSW5wdXRIb29rIERBVEEKKyAgUHlPU19JbnRlcnJ1cHRPY2N1cnJlZD1weXRob24zNi5QeU9TX0ludGVycnVwdE9jY3VycmVkCisgIFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXI9cHl0aG9uMzYuUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciBEQVRBCisgIFB5T1NfZG91YmxlX3RvX3N0cmluZz1weXRob24zNi5QeU9TX2RvdWJsZV90b19zdHJpbmcKKyAgUHlPU19nZXRzaWc9cHl0aG9uMzYuUHlPU19nZXRzaWcKKyAgUHlPU19teXN0cmljbXA9cHl0aG9uMzYuUHlPU19teXN0cmljbXAKKyAgUHlPU19teXN0cm5pY21wPXB5dGhvbjM2LlB5T1NfbXlzdHJuaWNtcAorICBQeU9TX3NldHNpZz1weXRob24zNi5QeU9TX3NldHNpZworICBQeU9TX3NucHJpbnRmPXB5dGhvbjM2LlB5T1Nfc25wcmludGYKKyAgUHlPU19zdHJpbmdfdG9fZG91YmxlPXB5dGhvbjM2LlB5T1Nfc3RyaW5nX3RvX2RvdWJsZQorICBQeU9TX3N0cnRvbD1weXRob24zNi5QeU9TX3N0cnRvbAorICBQeU9TX3N0cnRvdWw9cHl0aG9uMzYuUHlPU19zdHJ0b3VsCisgIFB5T1NfdnNucHJpbnRmPXB5dGhvbjM2LlB5T1NfdnNucHJpbnRmCisgIFB5T2JqZWN0X0FTQ0lJPXB5dGhvbjM2LlB5T2JqZWN0X0FTQ0lJCisgIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcj1weXRob24zNi5QeU9iamVjdF9Bc0NoYXJCdWZmZXIKKyAgUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcj1weXRob24zNi5QeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yCisgIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcj1weXRob24zNi5QeU9iamVjdF9Bc1JlYWRCdWZmZXIKKyAgUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcj1weXRob24zNi5QeU9iamVjdF9Bc1dyaXRlQnVmZmVyCisgIFB5T2JqZWN0X0J5dGVzPXB5dGhvbjM2LlB5T2JqZWN0X0J5dGVzCisgIFB5T2JqZWN0X0NhbGw9cHl0aG9uMzYuUHlPYmplY3RfQ2FsbAorICBQeU9iamVjdF9DYWxsRnVuY3Rpb249cHl0aG9uMzYuUHlPYmplY3RfQ2FsbEZ1bmN0aW9uCisgIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3M9cHl0aG9uMzYuUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncworICBQeU9iamVjdF9DYWxsTWV0aG9kPXB5dGhvbjM2LlB5T2JqZWN0X0NhbGxNZXRob2QKKyAgUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3M9cHl0aG9uMzYuUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MKKyAgUHlPYmplY3RfQ2FsbE9iamVjdD1weXRob24zNi5QeU9iamVjdF9DYWxsT2JqZWN0CisgIFB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcj1weXRob24zNi5QeU9iamVjdF9DaGVja1JlYWRCdWZmZXIKKyAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcz1weXRob24zNi5QeU9iamVjdF9DbGVhcldlYWtSZWZzCisgIFB5T2JqZWN0X0RlbEl0ZW09cHl0aG9uMzYuUHlPYmplY3RfRGVsSXRlbQorICBQeU9iamVjdF9EZWxJdGVtU3RyaW5nPXB5dGhvbjM2LlB5T2JqZWN0X0RlbEl0ZW1TdHJpbmcKKyAgUHlPYmplY3RfRGlyPXB5dGhvbjM2LlB5T2JqZWN0X0RpcgorICBQeU9iamVjdF9Gb3JtYXQ9cHl0aG9uMzYuUHlPYmplY3RfRm9ybWF0CisgIFB5T2JqZWN0X0ZyZWU9cHl0aG9uMzYuUHlPYmplY3RfRnJlZQorICBQeU9iamVjdF9HQ19EZWw9cHl0aG9uMzYuUHlPYmplY3RfR0NfRGVsCisgIFB5T2JqZWN0X0dDX1RyYWNrPXB5dGhvbjM2LlB5T2JqZWN0X0dDX1RyYWNrCisgIFB5T2JqZWN0X0dDX1VuVHJhY2s9cHl0aG9uMzYuUHlPYmplY3RfR0NfVW5UcmFjaworICBQeU9iamVjdF9HZW5lcmljR2V0QXR0cj1weXRob24zNi5QeU9iamVjdF9HZW5lcmljR2V0QXR0cgorICBQeU9iamVjdF9HZW5lcmljU2V0QXR0cj1weXRob24zNi5QeU9iamVjdF9HZW5lcmljU2V0QXR0cgorICBQeU9iamVjdF9HZXRBdHRyPXB5dGhvbjM2LlB5T2JqZWN0X0dldEF0dHIKKyAgUHlPYmplY3RfR2V0QXR0clN0cmluZz1weXRob24zNi5QeU9iamVjdF9HZXRBdHRyU3RyaW5nCisgIFB5T2JqZWN0X0dldEl0ZW09cHl0aG9uMzYuUHlPYmplY3RfR2V0SXRlbQorICBQeU9iamVjdF9HZXRJdGVyPXB5dGhvbjM2LlB5T2JqZWN0X0dldEl0ZXIKKyAgUHlPYmplY3RfSGFzQXR0cj1weXRob24zNi5QeU9iamVjdF9IYXNBdHRyCisgIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmc9cHl0aG9uMzYuUHlPYmplY3RfSGFzQXR0clN0cmluZworICBQeU9iamVjdF9IYXNoPXB5dGhvbjM2LlB5T2JqZWN0X0hhc2gKKyAgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkPXB5dGhvbjM2LlB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZAorICBQeU9iamVjdF9Jbml0PXB5dGhvbjM2LlB5T2JqZWN0X0luaXQKKyAgUHlPYmplY3RfSW5pdFZhcj1weXRob24zNi5QeU9iamVjdF9Jbml0VmFyCisgIFB5T2JqZWN0X0lzSW5zdGFuY2U9cHl0aG9uMzYuUHlPYmplY3RfSXNJbnN0YW5jZQorICBQeU9iamVjdF9Jc1N1YmNsYXNzPXB5dGhvbjM2LlB5T2JqZWN0X0lzU3ViY2xhc3MKKyAgUHlPYmplY3RfSXNUcnVlPXB5dGhvbjM2LlB5T2JqZWN0X0lzVHJ1ZQorICBQeU9iamVjdF9MZW5ndGg9cHl0aG9uMzYuUHlPYmplY3RfTGVuZ3RoCisgIFB5T2JqZWN0X01hbGxvYz1weXRob24zNi5QeU9iamVjdF9NYWxsb2MKKyAgUHlPYmplY3RfTm90PXB5dGhvbjM2LlB5T2JqZWN0X05vdAorICBQeU9iamVjdF9SZWFsbG9jPXB5dGhvbjM2LlB5T2JqZWN0X1JlYWxsb2MKKyAgUHlPYmplY3RfUmVwcj1weXRob24zNi5QeU9iamVjdF9SZXByCisgIFB5T2JqZWN0X1JpY2hDb21wYXJlPXB5dGhvbjM2LlB5T2JqZWN0X1JpY2hDb21wYXJlCisgIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbD1weXRob24zNi5QeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wKKyAgUHlPYmplY3RfU2VsZkl0ZXI9cHl0aG9uMzYuUHlPYmplY3RfU2VsZkl0ZXIKKyAgUHlPYmplY3RfU2V0QXR0cj1weXRob24zNi5QeU9iamVjdF9TZXRBdHRyCisgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmc9cHl0aG9uMzYuUHlPYmplY3RfU2V0QXR0clN0cmluZworICBQeU9iamVjdF9TZXRJdGVtPXB5dGhvbjM2LlB5T2JqZWN0X1NldEl0ZW0KKyAgUHlPYmplY3RfU2l6ZT1weXRob24zNi5QeU9iamVjdF9TaXplCisgIFB5T2JqZWN0X1N0cj1weXRob24zNi5QeU9iamVjdF9TdHIKKyAgUHlPYmplY3RfVHlwZT1weXRob24zNi5QeU9iamVjdF9UeXBlIERBVEEKKyAgUHlPRGljdF9EZWxJdGVtPXB5dGhvbjM2LlB5T0RpY3RfRGVsSXRlbQorICBQeU9EaWN0X05ldz1weXRob24zNi5QeU9EaWN0X05ldworICBQeU9EaWN0X1NldEl0ZW09cHl0aG9uMzYuUHlPRGljdF9TZXRJdGVtCisgIFB5T0RpY3RfVHlwZT1weXRob24zNi5QeU9EaWN0X1R5cGUgREFUQQorICBQeU9EaWN0SXRlbXNfVHlwZT1weXRob24zNi5QeU9EaWN0SXRlbXNfVHlwZSBEQVRBCisgIFB5T0RpY3RJdGVyX1R5cGU9cHl0aG9uMzYuUHlPRGljdEl0ZXJfVHlwZSBEQVRBCisgIFB5T0RpY3RLZXlzX1R5cGU9cHl0aG9uMzYuUHlPRGljdEtleXNfVHlwZSBEQVRBCisgIFB5T0RpY3RWYWx1ZXNfVHlwZT1weXRob24zNi5QeU9EaWN0VmFsdWVzX1R5cGUgREFUQQorICBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncz1weXRob24zNi5QeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncworICBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzPXB5dGhvbjM2LlB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3MKKyAgUHlQcm9wZXJ0eV9UeXBlPXB5dGhvbjM2LlB5UHJvcGVydHlfVHlwZSBEQVRBCisgIFB5UmFuZ2VJdGVyX1R5cGU9cHl0aG9uMzYuUHlSYW5nZUl0ZXJfVHlwZSBEQVRBCisgIFB5UmFuZ2VfVHlwZT1weXRob24zNi5QeVJhbmdlX1R5cGUgREFUQQorICBQeVJldmVyc2VkX1R5cGU9cHl0aG9uMzYuUHlSZXZlcnNlZF9UeXBlIERBVEEKKyAgUHlTZXFJdGVyX05ldz1weXRob24zNi5QeVNlcUl0ZXJfTmV3CisgIFB5U2VxSXRlcl9UeXBlPXB5dGhvbjM2LlB5U2VxSXRlcl9UeXBlIERBVEEKKyAgUHlTZXF1ZW5jZV9DaGVjaz1weXRob24zNi5QeVNlcXVlbmNlX0NoZWNrCisgIFB5U2VxdWVuY2VfQ29uY2F0PXB5dGhvbjM2LlB5U2VxdWVuY2VfQ29uY2F0CisgIFB5U2VxdWVuY2VfQ29udGFpbnM9cHl0aG9uMzYuUHlTZXF1ZW5jZV9Db250YWlucworICBQeVNlcXVlbmNlX0NvdW50PXB5dGhvbjM2LlB5U2VxdWVuY2VfQ291bnQKKyAgUHlTZXF1ZW5jZV9EZWxJdGVtPXB5dGhvbjM2LlB5U2VxdWVuY2VfRGVsSXRlbQorICBQeVNlcXVlbmNlX0RlbFNsaWNlPXB5dGhvbjM2LlB5U2VxdWVuY2VfRGVsU2xpY2UKKyAgUHlTZXF1ZW5jZV9GYXN0PXB5dGhvbjM2LlB5U2VxdWVuY2VfRmFzdAorICBQeVNlcXVlbmNlX0dldEl0ZW09cHl0aG9uMzYuUHlTZXF1ZW5jZV9HZXRJdGVtCisgIFB5U2VxdWVuY2VfR2V0U2xpY2U9cHl0aG9uMzYuUHlTZXF1ZW5jZV9HZXRTbGljZQorICBQeVNlcXVlbmNlX0luPXB5dGhvbjM2LlB5U2VxdWVuY2VfSW4KKyAgUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0PXB5dGhvbjM2LlB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdAorICBQeVNlcXVlbmNlX0luUGxhY2VSZXBlYXQ9cHl0aG9uMzYuUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0CisgIFB5U2VxdWVuY2VfSW5kZXg9cHl0aG9uMzYuUHlTZXF1ZW5jZV9JbmRleAorICBQeVNlcXVlbmNlX0xlbmd0aD1weXRob24zNi5QeVNlcXVlbmNlX0xlbmd0aAorICBQeVNlcXVlbmNlX0xpc3Q9cHl0aG9uMzYuUHlTZXF1ZW5jZV9MaXN0CisgIFB5U2VxdWVuY2VfUmVwZWF0PXB5dGhvbjM2LlB5U2VxdWVuY2VfUmVwZWF0CisgIFB5U2VxdWVuY2VfU2V0SXRlbT1weXRob24zNi5QeVNlcXVlbmNlX1NldEl0ZW0KKyAgUHlTZXF1ZW5jZV9TZXRTbGljZT1weXRob24zNi5QeVNlcXVlbmNlX1NldFNsaWNlCisgIFB5U2VxdWVuY2VfU2l6ZT1weXRob24zNi5QeVNlcXVlbmNlX1NpemUKKyAgUHlTZXF1ZW5jZV9UdXBsZT1weXRob24zNi5QeVNlcXVlbmNlX1R1cGxlCisgIFB5U2V0SXRlcl9UeXBlPXB5dGhvbjM2LlB5U2V0SXRlcl9UeXBlIERBVEEKKyAgUHlTZXRfQWRkPXB5dGhvbjM2LlB5U2V0X0FkZAorICBQeVNldF9DbGVhcj1weXRob24zNi5QeVNldF9DbGVhcgorICBQeVNldF9Db250YWlucz1weXRob24zNi5QeVNldF9Db250YWlucworICBQeVNldF9EaXNjYXJkPXB5dGhvbjM2LlB5U2V0X0Rpc2NhcmQKKyAgUHlTZXRfTmV3PXB5dGhvbjM2LlB5U2V0X05ldworICBQeVNldF9Qb3A9cHl0aG9uMzYuUHlTZXRfUG9wCisgIFB5U2V0X1NpemU9cHl0aG9uMzYuUHlTZXRfU2l6ZQorICBQeVNldF9UeXBlPXB5dGhvbjM2LlB5U2V0X1R5cGUgREFUQQorICBQeVNsaWNlX0dldEluZGljZXM9cHl0aG9uMzYuUHlTbGljZV9HZXRJbmRpY2VzCisgIFB5U2xpY2VfR2V0SW5kaWNlc0V4PXB5dGhvbjM2LlB5U2xpY2VfR2V0SW5kaWNlc0V4CisgIFB5U2xpY2VfTmV3PXB5dGhvbjM2LlB5U2xpY2VfTmV3CisgIFB5U2xpY2VfVHlwZT1weXRob24zNi5QeVNsaWNlX1R5cGUgREFUQQorICBQeVNvcnRXcmFwcGVyX1R5cGU9cHl0aG9uMzYuUHlTb3J0V3JhcHBlcl9UeXBlIERBVEEKKyAgUHlTdGF0ZV9GaW5kTW9kdWxlPXB5dGhvbjM2LlB5U3RhdGVfRmluZE1vZHVsZQorICBQeVN0YXRlX0FkZE1vZHVsZT1weXRob24zNi5QeVN0YXRlX0FkZE1vZHVsZQorICBQeVN0YXRlX1JlbW92ZU1vZHVsZT1weXRob24zNi5QeVN0YXRlX1JlbW92ZU1vZHVsZQorICBQeVN0cnVjdFNlcXVlbmNlX0dldEl0ZW09cHl0aG9uMzYuUHlTdHJ1Y3RTZXF1ZW5jZV9HZXRJdGVtCisgIFB5U3RydWN0U2VxdWVuY2VfTmV3PXB5dGhvbjM2LlB5U3RydWN0U2VxdWVuY2VfTmV3CisgIFB5U3RydWN0U2VxdWVuY2VfTmV3VHlwZT1weXRob24zNi5QeVN0cnVjdFNlcXVlbmNlX05ld1R5cGUKKyAgUHlTdHJ1Y3RTZXF1ZW5jZV9TZXRJdGVtPXB5dGhvbjM2LlB5U3RydWN0U2VxdWVuY2VfU2V0SXRlbQorICBQeVN1cGVyX1R5cGU9cHl0aG9uMzYuUHlTdXBlcl9UeXBlIERBVEEKKyAgUHlTeXNfQWRkV2Fybk9wdGlvbj1weXRob24zNi5QeVN5c19BZGRXYXJuT3B0aW9uCisgIFB5U3lzX0FkZFdhcm5PcHRpb25Vbmljb2RlPXB5dGhvbjM2LlB5U3lzX0FkZFdhcm5PcHRpb25Vbmljb2RlCisgIFB5U3lzX0Zvcm1hdFN0ZGVycj1weXRob24zNi5QeVN5c19Gb3JtYXRTdGRlcnIKKyAgUHlTeXNfRm9ybWF0U3Rkb3V0PXB5dGhvbjM2LlB5U3lzX0Zvcm1hdFN0ZG91dAorICBQeVN5c19HZXRPYmplY3Q9cHl0aG9uMzYuUHlTeXNfR2V0T2JqZWN0CisgIFB5U3lzX0hhc1dhcm5PcHRpb25zPXB5dGhvbjM2LlB5U3lzX0hhc1dhcm5PcHRpb25zCisgIFB5U3lzX1Jlc2V0V2Fybk9wdGlvbnM9cHl0aG9uMzYuUHlTeXNfUmVzZXRXYXJuT3B0aW9ucworICBQeVN5c19TZXRBcmd2PXB5dGhvbjM2LlB5U3lzX1NldEFyZ3YKKyAgUHlTeXNfU2V0QXJndkV4PXB5dGhvbjM2LlB5U3lzX1NldEFyZ3ZFeAorICBQeVN5c19TZXRPYmplY3Q9cHl0aG9uMzYuUHlTeXNfU2V0T2JqZWN0CisgIFB5U3lzX1NldFBhdGg9cHl0aG9uMzYuUHlTeXNfU2V0UGF0aAorICBQeVN5c19Xcml0ZVN0ZGVycj1weXRob24zNi5QeVN5c19Xcml0ZVN0ZGVycgorICBQeVN5c19Xcml0ZVN0ZG91dD1weXRob24zNi5QeVN5c19Xcml0ZVN0ZG91dAorICBQeVRocmVhZFN0YXRlX0NsZWFyPXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfQ2xlYXIKKyAgUHlUaHJlYWRTdGF0ZV9EZWxldGU9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9EZWxldGUKKyAgUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50PXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudAorICBQeVRocmVhZFN0YXRlX0dldD1weXRob24zNi5QeVRocmVhZFN0YXRlX0dldAorICBQeVRocmVhZFN0YXRlX0dldERpY3Q9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9HZXREaWN0CisgIFB5VGhyZWFkU3RhdGVfTmV3PXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfTmV3CisgIFB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGM9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4YworICBQeVRocmVhZFN0YXRlX1N3YXA9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9Td2FwCisgIFB5VHJhY2VCYWNrX0hlcmU9cHl0aG9uMzYuUHlUcmFjZUJhY2tfSGVyZQorICBQeVRyYWNlQmFja19QcmludD1weXRob24zNi5QeVRyYWNlQmFja19QcmludAorICBQeVRyYWNlQmFja19UeXBlPXB5dGhvbjM2LlB5VHJhY2VCYWNrX1R5cGUgREFUQQorICBQeVR1cGxlSXRlcl9UeXBlPXB5dGhvbjM2LlB5VHVwbGVJdGVyX1R5cGUgREFUQQorICBQeVR1cGxlX0NsZWFyRnJlZUxpc3Q9cHl0aG9uMzYuUHlUdXBsZV9DbGVhckZyZWVMaXN0CisgIFB5VHVwbGVfR2V0SXRlbT1weXRob24zNi5QeVR1cGxlX0dldEl0ZW0KKyAgUHlUdXBsZV9HZXRTbGljZT1weXRob24zNi5QeVR1cGxlX0dldFNsaWNlCisgIFB5VHVwbGVfTmV3PXB5dGhvbjM2LlB5VHVwbGVfTmV3CisgIFB5VHVwbGVfUGFjaz1weXRob24zNi5QeVR1cGxlX1BhY2sKKyAgUHlUdXBsZV9TZXRJdGVtPXB5dGhvbjM2LlB5VHVwbGVfU2V0SXRlbQorICBQeVR1cGxlX1NpemU9cHl0aG9uMzYuUHlUdXBsZV9TaXplCisgIFB5VHVwbGVfVHlwZT1weXRob24zNi5QeVR1cGxlX1R5cGUgREFUQQorICBQeVR5cGVfQ2xlYXJDYWNoZT1weXRob24zNi5QeVR5cGVfQ2xlYXJDYWNoZQorICBQeVR5cGVfRnJvbVNwZWM9cHl0aG9uMzYuUHlUeXBlX0Zyb21TcGVjCisgIFB5VHlwZV9Gcm9tU3BlY1dpdGhCYXNlcz1weXRob24zNi5QeVR5cGVfRnJvbVNwZWNXaXRoQmFzZXMKKyAgUHlUeXBlX0dlbmVyaWNBbGxvYz1weXRob24zNi5QeVR5cGVfR2VuZXJpY0FsbG9jCisgIFB5VHlwZV9HZW5lcmljTmV3PXB5dGhvbjM2LlB5VHlwZV9HZW5lcmljTmV3CisgIFB5VHlwZV9HZXRGbGFncz1weXRob24zNi5QeVR5cGVfR2V0RmxhZ3MKKyAgUHlUeXBlX0dldFNsb3Q9cHl0aG9uMzYuUHlUeXBlX0dldFNsb3QKKyAgUHlUeXBlX0lzU3VidHlwZT1weXRob24zNi5QeVR5cGVfSXNTdWJ0eXBlCisgIFB5VHlwZV9Nb2RpZmllZD1weXRob24zNi5QeVR5cGVfTW9kaWZpZWQKKyAgUHlUeXBlX1JlYWR5PXB5dGhvbjM2LlB5VHlwZV9SZWFkeQorICBQeVR5cGVfVHlwZT1weXRob24zNi5QeVR5cGVfVHlwZSBEQVRBCisgIFB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZT1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9DcmVhdGUKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5jb2Rpbmc9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5jb2RpbmcKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZAorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0T2JqZWN0CisgIFB5VW5pY29kZURlY29kZUVycm9yX0dldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRSZWFzb24KKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZAorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uCisgIFB5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0CisgIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nPXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nCisgIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZD1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdAorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0UmVhc29uCisgIFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0CisgIFB5VW5pY29kZUVuY29kZUVycm9yX1NldEVuZD1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbgorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRTdGFydAorICBQeVVuaWNvZGVJdGVyX1R5cGU9cHl0aG9uMzYuUHlVbmljb2RlSXRlcl9UeXBlIERBVEEKKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZAorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0T2JqZWN0CisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRSZWFzb24KKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0U3RhcnQKKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldEVuZAorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0UmVhc29uCisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFN0YXJ0CisgIFB5VW5pY29kZV9BcHBlbmQ9cHl0aG9uMzYuUHlVbmljb2RlX0FwcGVuZAorICBQeVVuaWNvZGVfQXBwZW5kQW5kRGVsPXB5dGhvbjM2LlB5VW5pY29kZV9BcHBlbmRBbmREZWwKKyAgUHlVbmljb2RlX0FzQVNDSUlTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcKKyAgUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nCisgIFB5VW5pY29kZV9Bc0RlY29kZWRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlX0FzRGVjb2RlZE9iamVjdAorICBQeVVuaWNvZGVfQXNEZWNvZGVkVW5pY29kZT1weXRob24zNi5QeVVuaWNvZGVfQXNEZWNvZGVkVW5pY29kZQorICBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZV9Bc0VuY29kZWRPYmplY3QKKyAgUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nCisgIFB5VW5pY29kZV9Bc0VuY29kZWRVbmljb2RlPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0VuY29kZWRVbmljb2RlCisgIFB5VW5pY29kZV9Bc0xhdGluMVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmcKKyAgUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nCisgIFB5VW5pY29kZV9Bc1VURjE2U3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1VURjE2U3RyaW5nCisgIFB5VW5pY29kZV9Bc1VURjMyU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1VURjMyU3RyaW5nCisgIFB5VW5pY29kZV9Bc1VURjhTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzVVRGOFN0cmluZworICBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcKKyAgUHlVbmljb2RlX0FzV2lkZUNoYXI9cHl0aG9uMzYuUHlVbmljb2RlX0FzV2lkZUNoYXIKKyAgUHlVbmljb2RlX0NsZWFyRnJlZWxpc3Q9cHl0aG9uMzYuUHlVbmljb2RlX0NsZWFyRnJlZWxpc3QKKyAgUHlVbmljb2RlX0NvbXBhcmU9cHl0aG9uMzYuUHlVbmljb2RlX0NvbXBhcmUKKyAgUHlVbmljb2RlX0NvbmNhdD1weXRob24zNi5QeVVuaWNvZGVfQ29uY2F0CisgIFB5VW5pY29kZV9Db250YWlucz1weXRob24zNi5QeVVuaWNvZGVfQ29udGFpbnMKKyAgUHlVbmljb2RlX0NvdW50PXB5dGhvbjM2LlB5VW5pY29kZV9Db3VudAorICBQeVVuaWNvZGVfRGVjb2RlPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGUKKyAgUHlVbmljb2RlX0RlY29kZUFTQ0lJPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVBU0NJSQorICBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcAorICBQeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0PXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQKKyAgUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdEFuZFNpemU9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdEFuZFNpemUKKyAgUHlVbmljb2RlX0RlY29kZUxhdGluMT1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlTGF0aW4xCisgIFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlCisgIFB5VW5pY29kZV9EZWNvZGVVVEYxNj1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGMTYKKyAgUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWw9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwKKyAgUHlVbmljb2RlX0RlY29kZVVURjMyPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEYzMgorICBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bAorICBQeVVuaWNvZGVfRGVjb2RlVVRGOD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGOAorICBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwKKyAgUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGU9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUKKyAgUHlVbmljb2RlX0ZTQ29udmVydGVyPXB5dGhvbjM2LlB5VW5pY29kZV9GU0NvbnZlcnRlcgorICBQeVVuaWNvZGVfRlNEZWNvZGVyPXB5dGhvbjM2LlB5VW5pY29kZV9GU0RlY29kZXIKKyAgUHlVbmljb2RlX0ZpbmQ9cHl0aG9uMzYuUHlVbmljb2RlX0ZpbmQKKyAgUHlVbmljb2RlX0Zvcm1hdD1weXRob24zNi5QeVVuaWNvZGVfRm9ybWF0CisgIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QKKyAgUHlVbmljb2RlX0Zyb21Gb3JtYXQ9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21Gb3JtYXQKKyAgUHlVbmljb2RlX0Zyb21Gb3JtYXRWPXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tRm9ybWF0VgorICBQeVVuaWNvZGVfRnJvbU9iamVjdD1weXRob24zNi5QeVVuaWNvZGVfRnJvbU9iamVjdAorICBQeVVuaWNvZGVfRnJvbU9yZGluYWw9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21PcmRpbmFsCisgIFB5VW5pY29kZV9Gcm9tU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tU3RyaW5nCisgIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNi5QeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUKKyAgUHlVbmljb2RlX0Zyb21XaWRlQ2hhcj1weXRob24zNi5QeVVuaWNvZGVfRnJvbVdpZGVDaGFyCisgIFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZworICBQeVVuaWNvZGVfR2V0U2l6ZT1weXRob24zNi5QeVVuaWNvZGVfR2V0U2l6ZQorICBQeVVuaWNvZGVfSXNJZGVudGlmaWVyPXB5dGhvbjM2LlB5VW5pY29kZV9Jc0lkZW50aWZpZXIKKyAgUHlVbmljb2RlX0pvaW49cHl0aG9uMzYuUHlVbmljb2RlX0pvaW4KKyAgUHlVbmljb2RlX1BhcnRpdGlvbj1weXRob24zNi5QeVVuaWNvZGVfUGFydGl0aW9uCisgIFB5VW5pY29kZV9SUGFydGl0aW9uPXB5dGhvbjM2LlB5VW5pY29kZV9SUGFydGl0aW9uCisgIFB5VW5pY29kZV9SU3BsaXQ9cHl0aG9uMzYuUHlVbmljb2RlX1JTcGxpdAorICBQeVVuaWNvZGVfUmVwbGFjZT1weXRob24zNi5QeVVuaWNvZGVfUmVwbGFjZQorICBQeVVuaWNvZGVfUmVzaXplPXB5dGhvbjM2LlB5VW5pY29kZV9SZXNpemUKKyAgUHlVbmljb2RlX1JpY2hDb21wYXJlPXB5dGhvbjM2LlB5VW5pY29kZV9SaWNoQ29tcGFyZQorICBQeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2RpbmcKKyAgUHlVbmljb2RlX1NwbGl0PXB5dGhvbjM2LlB5VW5pY29kZV9TcGxpdAorICBQeVVuaWNvZGVfU3BsaXRsaW5lcz1weXRob24zNi5QeVVuaWNvZGVfU3BsaXRsaW5lcworICBQeVVuaWNvZGVfVGFpbG1hdGNoPXB5dGhvbjM2LlB5VW5pY29kZV9UYWlsbWF0Y2gKKyAgUHlVbmljb2RlX1RyYW5zbGF0ZT1weXRob24zNi5QeVVuaWNvZGVfVHJhbnNsYXRlCisgIFB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwPXB5dGhvbjM2LlB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwCisgIFB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nCisgIFB5VW5pY29kZV9EZWNvZGVVVEY3PXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEY3CisgIFB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWw9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjdTdGF0ZWZ1bAorICBQeVVuaWNvZGVfRW5jb2RlRlNEZWZhdWx0PXB5dGhvbjM2LlB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQKKyAgUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcKKyAgUHlVbmljb2RlX0ludGVybkltbW9ydGFsPXB5dGhvbjM2LlB5VW5pY29kZV9JbnRlcm5JbW1vcnRhbAorICBQeVVuaWNvZGVfSW50ZXJuSW5QbGFjZT1weXRob24zNi5QeVVuaWNvZGVfSW50ZXJuSW5QbGFjZQorICBQeVVuaWNvZGVfVHlwZT1weXRob24zNi5QeVVuaWNvZGVfVHlwZSBEQVRBCisgIFB5V2Vha3JlZl9HZXRPYmplY3Q9cHl0aG9uMzYuUHlXZWFrcmVmX0dldE9iamVjdCBEQVRBCisgIFB5V2Vha3JlZl9OZXdQcm94eT1weXRob24zNi5QeVdlYWtyZWZfTmV3UHJveHkKKyAgUHlXZWFrcmVmX05ld1JlZj1weXRob24zNi5QeVdlYWtyZWZfTmV3UmVmCisgIFB5V3JhcHBlckRlc2NyX1R5cGU9cHl0aG9uMzYuUHlXcmFwcGVyRGVzY3JfVHlwZSBEQVRBCisgIFB5V3JhcHBlcl9OZXc9cHl0aG9uMzYuUHlXcmFwcGVyX05ldworICBQeVppcF9UeXBlPXB5dGhvbjM2LlB5WmlwX1R5cGUgREFUQQorICBQeV9BZGRQZW5kaW5nQ2FsbD1weXRob24zNi5QeV9BZGRQZW5kaW5nQ2FsbAorICBQeV9BdEV4aXQ9cHl0aG9uMzYuUHlfQXRFeGl0CisgIFB5X0J1aWxkVmFsdWU9cHl0aG9uMzYuUHlfQnVpbGRWYWx1ZQorICBQeV9Db21waWxlU3RyaW5nPXB5dGhvbjM2LlB5X0NvbXBpbGVTdHJpbmcKKyAgUHlfRGVjUmVmPXB5dGhvbjM2LlB5X0RlY1JlZgorICBQeV9FbmRJbnRlcnByZXRlcj1weXRob24zNi5QeV9FbmRJbnRlcnByZXRlcgorICBQeV9FeGl0PXB5dGhvbjM2LlB5X0V4aXQKKyAgUHlfRmF0YWxFcnJvcj1weXRob24zNi5QeV9GYXRhbEVycm9yCisgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzYuUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyBEQVRBCisgIFB5X0ZpbmFsaXplPXB5dGhvbjM2LlB5X0ZpbmFsaXplCisgIFB5X0ZpbmFsaXplRXg9cHl0aG9uMzYuUHlfRmluYWxpemVFeAorICBQeV9HZXRCdWlsZEluZm89cHl0aG9uMzYuUHlfR2V0QnVpbGRJbmZvCisgIFB5X0dldENvbXBpbGVyPXB5dGhvbjM2LlB5X0dldENvbXBpbGVyCisgIFB5X0dldENvcHlyaWdodD1weXRob24zNi5QeV9HZXRDb3B5cmlnaHQKKyAgUHlfR2V0RXhlY1ByZWZpeD1weXRob24zNi5QeV9HZXRFeGVjUHJlZml4CisgIFB5X0dldFBhdGg9cHl0aG9uMzYuUHlfR2V0UGF0aAorICBQeV9HZXRQbGF0Zm9ybT1weXRob24zNi5QeV9HZXRQbGF0Zm9ybQorICBQeV9HZXRQcmVmaXg9cHl0aG9uMzYuUHlfR2V0UHJlZml4CisgIFB5X0dldFByb2dyYW1GdWxsUGF0aD1weXRob24zNi5QeV9HZXRQcm9ncmFtRnVsbFBhdGgKKyAgUHlfR2V0UHJvZ3JhbU5hbWU9cHl0aG9uMzYuUHlfR2V0UHJvZ3JhbU5hbWUKKyAgUHlfR2V0UHl0aG9uSG9tZT1weXRob24zNi5QeV9HZXRQeXRob25Ib21lCisgIFB5X0dldFJlY3Vyc2lvbkxpbWl0PXB5dGhvbjM2LlB5X0dldFJlY3Vyc2lvbkxpbWl0CisgIFB5X0dldFZlcnNpb249cHl0aG9uMzYuUHlfR2V0VmVyc2lvbgorICBQeV9IYXNGaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nPXB5dGhvbjM2LlB5X0hhc0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgREFUQQorICBQeV9JbmNSZWY9cHl0aG9uMzYuUHlfSW5jUmVmCisgIFB5X0luaXRpYWxpemU9cHl0aG9uMzYuUHlfSW5pdGlhbGl6ZQorICBQeV9Jbml0aWFsaXplRXg9cHl0aG9uMzYuUHlfSW5pdGlhbGl6ZUV4CisgIFB5X0lzSW5pdGlhbGl6ZWQ9cHl0aG9uMzYuUHlfSXNJbml0aWFsaXplZAorICBQeV9NYWluPXB5dGhvbjM2LlB5X01haW4KKyAgUHlfTWFrZVBlbmRpbmdDYWxscz1weXRob24zNi5QeV9NYWtlUGVuZGluZ0NhbGxzCisgIFB5X05ld0ludGVycHJldGVyPXB5dGhvbjM2LlB5X05ld0ludGVycHJldGVyCisgIFB5X1JlcHJFbnRlcj1weXRob24zNi5QeV9SZXByRW50ZXIKKyAgUHlfUmVwckxlYXZlPXB5dGhvbjM2LlB5X1JlcHJMZWF2ZQorICBQeV9TZXRQcm9ncmFtTmFtZT1weXRob24zNi5QeV9TZXRQcm9ncmFtTmFtZQorICBQeV9TZXRQeXRob25Ib21lPXB5dGhvbjM2LlB5X1NldFB5dGhvbkhvbWUKKyAgUHlfU2V0UmVjdXJzaW9uTGltaXQ9cHl0aG9uMzYuUHlfU2V0UmVjdXJzaW9uTGltaXQKKyAgUHlfU3ltdGFibGVTdHJpbmc9cHl0aG9uMzYuUHlfU3ltdGFibGVTdHJpbmcKKyAgUHlfVmFCdWlsZFZhbHVlPXB5dGhvbjM2LlB5X1ZhQnVpbGRWYWx1ZQorICBfUHlFcnJfQmFkSW50ZXJuYWxDYWxsPXB5dGhvbjM2Ll9QeUVycl9CYWRJbnRlcm5hbENhbGwKKyAgX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVD1weXRob24zNi5fUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUCisgIF9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUPXB5dGhvbjM2Ll9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUCisgIF9QeU9iamVjdF9HQ19NYWxsb2M9cHl0aG9uMzYuX1B5T2JqZWN0X0dDX01hbGxvYworICBfUHlPYmplY3RfR0NfTmV3PXB5dGhvbjM2Ll9QeU9iamVjdF9HQ19OZXcKKyAgX1B5T2JqZWN0X0dDX05ld1Zhcj1weXRob24zNi5fUHlPYmplY3RfR0NfTmV3VmFyCisgIF9QeU9iamVjdF9HQ19SZXNpemU9cHl0aG9uMzYuX1B5T2JqZWN0X0dDX1Jlc2l6ZQorICBfUHlPYmplY3RfTmV3PXB5dGhvbjM2Ll9QeU9iamVjdF9OZXcKKyAgX1B5T2JqZWN0X05ld1Zhcj1weXRob24zNi5fUHlPYmplY3RfTmV3VmFyCisgIF9QeVN0YXRlX0FkZE1vZHVsZT1weXRob24zNi5fUHlTdGF0ZV9BZGRNb2R1bGUKKyAgX1B5VGhyZWFkU3RhdGVfSW5pdD1weXRob24zNi5fUHlUaHJlYWRTdGF0ZV9Jbml0CisgIF9QeVRocmVhZFN0YXRlX1ByZWFsbG9jPXB5dGhvbjM2Ll9QeVRocmVhZFN0YXRlX1ByZWFsbG9jCisgIF9QeVRyYXNoX2RlbGV0ZV9sYXRlcj1weXRob24zNi5fUHlUcmFzaF9kZWxldGVfbGF0ZXIgREFUQQorICBfUHlUcmFzaF9kZWxldGVfbmVzdGluZz1weXRob24zNi5fUHlUcmFzaF9kZWxldGVfbmVzdGluZyBEQVRBCisgIF9QeVRyYXNoX2RlcG9zaXRfb2JqZWN0PXB5dGhvbjM2Ll9QeVRyYXNoX2RlcG9zaXRfb2JqZWN0CisgIF9QeVRyYXNoX2Rlc3Ryb3lfY2hhaW49cHl0aG9uMzYuX1B5VHJhc2hfZGVzdHJveV9jaGFpbgorICBfUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlPXB5dGhvbjM2Ll9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGUgREFUQQorICBfUHlXZWFrcmVmX1Byb3h5VHlwZT1weXRob24zNi5fUHlXZWFrcmVmX1Byb3h5VHlwZSBEQVRBCisgIF9QeVdlYWtyZWZfUmVmVHlwZT1weXRob24zNi5fUHlXZWFrcmVmX1JlZlR5cGUgREFUQQorICBfUHlfQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNi5fUHlfQnVpbGRWYWx1ZV9TaXplVAorICBfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdD1weXRob24zNi5fUHlfQ2hlY2tSZWN1cnNpb25MaW1pdCBEQVRBCisgIF9QeV9DaGVja1JlY3Vyc2l2ZUNhbGw9cHl0aG9uMzYuX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbAorICBfUHlfRGVhbGxvYz1weXRob24zNi5fUHlfRGVhbGxvYworICBfUHlfRWxsaXBzaXNPYmplY3Q9cHl0aG9uMzYuX1B5X0VsbGlwc2lzT2JqZWN0IERBVEEKKyAgX1B5X0ZhbHNlU3RydWN0PXB5dGhvbjM2Ll9QeV9GYWxzZVN0cnVjdCBEQVRBCisgIF9QeV9Ob25lU3RydWN0PXB5dGhvbjM2Ll9QeV9Ob25lU3RydWN0IERBVEEKKyAgX1B5X05vdEltcGxlbWVudGVkU3RydWN0PXB5dGhvbjM2Ll9QeV9Ob3RJbXBsZW1lbnRlZFN0cnVjdCBEQVRBCisgIF9QeV9Td2FwcGVkT3A9cHl0aG9uMzYuX1B5X1N3YXBwZWRPcCBEQVRBCisgIF9QeV9UcnVlU3RydWN0PXB5dGhvbjM2Ll9QeV9UcnVlU3RydWN0IERBVEEKKyAgX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNi5fUHlfVmFCdWlsZFZhbHVlX1NpemVUCisgIF9QeUFyZ19QYXJzZV9TaXplVD1weXRob24zNi5fUHlBcmdfUGFyc2VfU2l6ZVQKKyAgX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQ9cHl0aG9uMzYuX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQKKyAgX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVD1weXRob24zNi5fUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUCisgIF9QeUFyZ19WYVBhcnNlX1NpemVUPXB5dGhvbjM2Ll9QeUFyZ19WYVBhcnNlX1NpemVUCisgIF9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVD1weXRob24zNi5fUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKKyAgX1B5X0J1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzYuX1B5X0J1aWxkVmFsdWVfU2l6ZVQKZGlmZiAtLWdpdCBhL1BDL3B5dGhvbl9leGUucmMgYi9QQy9weXRob25fZXhlLnJjCmluZGV4IDkxNzg1YTEuLmFlMGIwMjkgMTAwNjQ0Ci0tLSBhL1BDL3B5dGhvbl9leGUucmMKKysrIGIvUEMvcHl0aG9uX2V4ZS5yYwpAQCAtNyw3ICs3LDcgQEAKICNpbmNsdWRlIDx3aW51c2VyLmg+CiAxIFJUX01BTklGRVNUICJweXRob24ubWFuaWZlc3QiCiAKLTEgSUNPTiBESVNDQVJEQUJMRSAicHljb24uaWNvIiAKKzEgSUNPTiBESVNDQVJEQUJMRSAiaWNvbnNccHl0aG9uLmljbyIgCiAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL1BDL3B5dGhvbndfZXhlLnJjIGIvUEMvcHl0aG9ud19leGUucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiZjM1OQotLS0gL2Rldi9udWxsCisrKyBiL1BDL3B5dGhvbndfZXhlLnJjCkBAIC0wLDAgKzEsNDkgQEAKKy8vIFJlc291cmNlIHNjcmlwdCBmb3IgUHl0aG9uIGNvbnNvbGUgRVhFcy4KKworI2luY2x1ZGUgInB5dGhvbl92ZXJfcmMuaCIKKworLy8gSW5jbHVkZSB0aGUgbWFuaWZlc3QgZmlsZSB0aGF0IGluZGljYXRlcyB3ZSBzdXBwb3J0IGFsbAorLy8gY3VycmVudCB2ZXJzaW9ucyBvZiBXaW5kb3dzLgorI2luY2x1ZGUgPHdpbnVzZXIuaD4KKzEgUlRfTUFOSUZFU1QgInB5dGhvbi5tYW5pZmVzdCIKKworMSBJQ09OIERJU0NBUkRBQkxFICJpY29uc1xweXRob253LmljbyIgCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBWZXJzaW9uCisvLworCitWU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KKyBGSUxFVkVSU0lPTiBQWVZFUlNJT042NAorIFBST0RVQ1RWRVJTSU9OIFBZVkVSU0lPTjY0CisgRklMRUZMQUdTTUFTSyAweDNmTAorI2lmZGVmIF9ERUJVRworIEZJTEVGTEFHUyBWU19GRl9ERUJVRworI2Vsc2UKKyBGSUxFRkxBR1MgMHgwTAorI2VuZGlmCisgRklMRU9TIFZPU19fV0lORE9XUzMyCisgRklMRVRZUEUgVkZUX0FQUAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwMDAwMDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsIFBZVEhPTl9DT01QQU5ZICJcMCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiUHl0aG9uXDAiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCBQWVRIT05fVkVSU0lPTgorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJQeXRob24gQXBwbGljYXRpb25cMCIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsIFBZVEhPTl9DT1BZUklHSFQgIlwwIgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAicHl0aG9udyIgUFlUSE9OX0RFQlVHX0VYVCAiLmV4ZVwwIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIlB5dGhvblwwIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgUFlUSE9OX1ZFUlNJT04KKyAgICAgICAgRU5ECisgICAgRU5ECisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4MCwgMTIwMAorICAgIEVORAorRU5ECmRpZmYgLS1naXQgYS9QQy90ZXN0cHkucHkgYi9QQy90ZXN0cHkucHkKaW5kZXggNGVmM2Q0Zi4uNzA5ZjM1YyAxMDA2NDQKLS0tIGEvUEMvdGVzdHB5LnB5CisrKyBiL1BDL3Rlc3RweS5weQpAQCAtMjYsNSArMjYsNSBAQAogICAgICAgICAgICAgIyBBZGQgdGhlICJ0ZXN0IiBkaXJlY3RvcnkgdG8gUFlUSE9OUEFUSC4KICAgICAgICAgICAgIHN5cy5wYXRoID0gc3lzLnBhdGggKyBbdGVzdF0KIAotaW1wb3J0IHJlZ3J0ZXN0ICMgU3RhbmRhcmQgUHl0aG9uIHRlc3Rlci4KLXJlZ3J0ZXN0Lm1haW4oKQoraW1wb3J0IGxpYnJlZ3J0ZXN0ICMgU3RhbmRhcmQgUHl0aG9uIHRlc3Rlci4KK2xpYnJlZ3J0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvUEMvd2lucmVnLmMgYi9QQy93aW5yZWcuYwppbmRleCBmMDhkOWE0Li45NTI0ODM4IDEwMDY0NAotLS0gYS9QQy93aW5yZWcuYworKysgYi9QQy93aW5yZWcuYwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAgICAgICAgICAgICBpZiAodmFsdWUgIT0gUHlfTm9uZSAmJiAhUHlMb25nX0NoZWNrKHZhbHVlKSkKICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKERXT1JELCAxKTsKLSAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7CisgICAgICAgICAgICBpZiAoKnJldERhdGFCdWYgPT0gTlVMTCl7CiAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICB9CkBAIC01NjMsNiArNTYzLDI0IEBACiAgICAgICAgICAgICAgICAgbWVtY3B5KCpyZXREYXRhQnVmLCAmZCwgc2l6ZW9mKERXT1JEKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfUVdPUkQ6CisgICAgICAgICAgaWYgKHZhbHVlICE9IFB5X05vbmUgJiYgIVB5TG9uZ19DaGVjayh2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhEV09SRDY0LCAxKTsKKyAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1ZiA9PSBOVUxMKXsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpyZXREYXRhU2l6ZSA9IHNpemVvZihEV09SRDY0KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgRFdPUkQ2NCB6ZXJvID0gMDsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKnJldERhdGFCdWYsICZ6ZXJvLCBzaXplb2YoRFdPUkQ2NCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgRFdPUkQ2NCBkID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCpyZXREYXRhQnVmLCAmZCwgc2l6ZW9mKERXT1JENjQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFR19TWjoKICAgICAgICAgY2FzZSBSRUdfRVhQQU5EX1NaOgogICAgICAgICAgICAgewpAQCAtNjE5LDcgKzYzNyw3IEBACiAgICAgICAgICAgICAgICAgKnJldERhdGFTaXplID0gc2l6ZSArIDI7CiAgICAgICAgICAgICAgICAgKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhjaGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJldERhdGFTaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoKnJldERhdGFCdWY9PU5VTEwpeworICAgICAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1ZiA9PSBOVUxMKXsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgIH0KQEAgLTY2NSw3ICs2ODMsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICAgICAgICAgICAgICAqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKGNoYXIsIHZpZXcubGVuKTsKLSAgICAgICAgICAgICAgICBpZiAoKnJldERhdGFCdWY9PU5VTEwpeworICAgICAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1ZiA9PSBOVUxMKXsKICAgICAgICAgICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTY5MCw3ICs3MDgsMTMgQEAKICAgICAgICAgICAgIGlmIChyZXREYXRhU2l6ZSA9PSAwKQogICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKDApOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCooaW50ICopcmV0RGF0YUJ1Zik7CisgICAgICAgICAgICAgICAgb2JEYXRhID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKihEV09SRCAqKXJldERhdGFCdWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX1FXT1JEOgorICAgICAgICAgICAgaWYgKHJldERhdGFTaXplID09IDApCisgICAgICAgICAgICAgICAgb2JEYXRhID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygqKERXT1JENjQgKilyZXREYXRhQnVmKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFR19TWjoKICAgICAgICAgY2FzZSBSRUdfRVhQQU5EX1NaOgpAQCAtMTU5OSw3ICsxNjIzLDcgQEAKICAgICAgICAgQW4gaW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSwgb25lIG9mOgogICAgICAgICBSRUdfQklOQVJZIC0tIEJpbmFyeSBkYXRhIGluIGFueSBmb3JtLgogICAgICAgICBSRUdfRFdPUkQgLS0gQSAzMi1iaXQgbnVtYmVyLgotICAgICAgICBSRUdfRFdPUkRfTElUVExFX0VORElBTiAtLSBBIDMyLWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisgICAgICAgIFJFR19EV09SRF9MSVRUTEVfRU5ESUFOIC0tIEEgMzItYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gRXF1aXZhbGVudCB0byBSRUdfRFdPUkQKICAgICAgICAgUkVHX0RXT1JEX0JJR19FTkRJQU4gLS0gQSAzMi1iaXQgbnVtYmVyIGluIGJpZy1lbmRpYW4gZm9ybWF0LgogICAgICAgICBSRUdfRVhQQU5EX1NaIC0tIEEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0aGF0IGNvbnRhaW5zIHVuZXhwYW5kZWQKICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VzIHRvIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZm9yIGV4YW1wbGUsCkBAIC0xNjA5LDYgKzE2MzMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgdHdvIG51bGwgY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBQeXRob24gaGFuZGxlcwogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB0ZXJtaW5hdGlvbiBhdXRvbWF0aWNhbGx5LgogICAgICAgICBSRUdfTk9ORSAtLSBObyBkZWZpbmVkIHZhbHVlIHR5cGUuCisgICAgICAgIFJFR19RV09SRCAtLSBBIDY0LWJpdCBudW1iZXIuCisgICAgICAgIFJFR19RV09SRF9MSVRUTEVfRU5ESUFOIC0tIEEgNjQtYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gRXF1aXZhbGVudCB0byBSRUdfUVdPUkQuCiAgICAgICAgIFJFR19SRVNPVVJDRV9MSVNUIC0tIEEgZGV2aWNlLWRyaXZlciByZXNvdXJjZSBsaXN0LgogICAgICAgICBSRUdfU1ogLS0gQSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgogICAgIHZhbHVlOiBvYmplY3QKQEAgLTE2MzEsNyArMTY1Nyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogd2lucmVnX1NldFZhbHVlRXhfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBIS0VZIGtleSwgUHlfVU5JQ09ERSAqdmFsdWVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlc2VydmVkLCBEV09SRCB0eXBlLCBQeU9iamVjdCAqdmFsdWUpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Yzg4Yzg0MjZiNmMwMGVjNyBpbnB1dD1mMWIxNmNiY2MzZWQ0MTAxXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Yzg4Yzg0MjZiNmMwMGVjNyBpbnB1dD05MDBhOWUzOTkwYmZiMTk2XSovCiB7CiAgICAgQllURSAqZGF0YTsKICAgICBEV09SRCBsZW47CkBAIC0xOTE4LDYgKzE5NDQsOCBAQAogICAgIEFERF9JTlQoUkVHX0RXT1JEKTsKICAgICBBRERfSU5UKFJFR19EV09SRF9MSVRUTEVfRU5ESUFOKTsKICAgICBBRERfSU5UKFJFR19EV09SRF9CSUdfRU5ESUFOKTsKKyAgICBBRERfSU5UKFJFR19RV09SRCk7CisgICAgQUREX0lOVChSRUdfUVdPUkRfTElUVExFX0VORElBTik7CiAgICAgQUREX0lOVChSRUdfTElOSyk7CiAgICAgQUREX0lOVChSRUdfTVVMVElfU1opOwogICAgIEFERF9JTlQoUkVHX1JFU09VUkNFX0xJU1QpOwpkaWZmIC0tZ2l0IGEvUEMvd2luc291bmQuYyBiL1BDL3dpbnNvdW5kLmMKaW5kZXggNmI3OWQyMy4uN2ZlZWJjYiAxMDA2NDQKLS0tIGEvUEMvd2luc291bmQuYworKysgYi9QQy93aW5zb3VuZC5jCkBAIC01Miw3ICs1Miw3IEBACiAiU05EX05PV0FJVCAtIFJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgc291bmQgZHJpdmVyIGlzIGJ1c3lcbiIgLy8gV2l0aG91dCBhbnkgZXJyb3JzCiAiXG4iCiAiQmVlcChmcmVxdWVuY3ksIGR1cmF0aW9uKSAtIE1ha2UgYSBiZWVwIHRocm91Z2ggdGhlIFBDIHNwZWFrZXIuXG4iCi0iTWVzc2FnZUJlZXAoeCkgLSBDYWxsIFdpbmRvd3MgTWVzc2FnZUJlZXAuIik7CisiTWVzc2FnZUJlZXAodHlwZSkgLSBDYWxsIFdpbmRvd3MgTWVzc2FnZUJlZXAuIik7CiAKIC8qW2NsaW5pYyBpbnB1dF0KIG1vZHVsZSB3aW5zb3VuZApAQCAtNjQsMzIgKzY0LDU4IEBACiAvKltjbGluaWMgaW5wdXRdCiB3aW5zb3VuZC5QbGF5U291bmQKIAotICAgIHNvdW5kOiBQeV9VTklDT0RFKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pCisgICAgc291bmQ6IG9iamVjdAogICAgICAgICBUaGUgc291bmQgdG8gcGxheTsgYSBmaWxlbmFtZSwgZGF0YSwgb3IgTm9uZS4KICAgICBmbGFnczogaW50CiAgICAgICAgIEZsYWcgdmFsdWVzLCBvcmVkIHRvZ2V0aGVyLiAgU2VlIG1vZHVsZSBkb2N1bWVudGF0aW9uLgotICAgIC8KIAogQSB3cmFwcGVyIGFyb3VuZCB0aGUgV2luZG93cyBQbGF5U291bmQgQVBJLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotd2luc291bmRfUGxheVNvdW5kX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfVU5JQ09ERSAqc291bmQsIGludCBmbGFncykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lYzI0YjNhMmI0MzY4Mzc4IGlucHV0PTM0MTFiMWI3YzFmMzZkOTNdKi8KK3dpbnNvdW5kX1BsYXlTb3VuZF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzb3VuZCwgaW50IGZsYWdzKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQ5YTBmZDE2YTM3MmViZWIgaW5wdXQ9YzYzZTFmMmQ4NDhkYTJmMl0qLwogewogICAgIGludCBvazsKKyAgICB3Y2hhcl90ICp3c291bmQ7CisgICAgUHlfYnVmZmVyIHZpZXcgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoZmxhZ3MgJiBTTkRfQVNZTkMgJiYgZmxhZ3MgJiBTTkRfTUVNT1JZKSB7Ci0gICAgICAgIC8qIFNpZGVzdGVwIHJlZmVyZW5jZSBjb3VudGluZyBoZWFkYWNoZTsgdW5mb3J0dW5hdGVseSB0aGlzIGFsc28KLSAgICAgICAgICAgIHByZXZlbnQgU05EX0xPT1AgZnJvbSBtZW1vcnkuICovCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHBsYXkgYXN5bmNocm9ub3VzbHkgZnJvbSBtZW1vcnkiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNvdW5kID09IFB5X05vbmUpIHsKKyAgICAgICAgd3NvdW5kID0gTlVMTDsKKyAgICB9IGVsc2UgaWYgKGZsYWdzICYgU05EX01FTU9SWSkgeworICAgICAgICBpZiAoZmxhZ3MgJiBTTkRfQVNZTkMpIHsKKyAgICAgICAgICAgIC8qIFNpZGVzdGVwIHJlZmVyZW5jZSBjb3VudGluZyBoZWFkYWNoZTsgdW5mb3J0dW5hdGVseSB0aGlzIGFsc28KKyAgICAgICAgICAgICAgICBwcmV2ZW50IFNORF9MT09QIGZyb20gbWVtb3J5LiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHBsYXkgYXN5bmNocm9ub3VzbHkgZnJvbSBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc291bmQsICZ2aWV3LCBQeUJVRl9TSU1QTEUpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgd3NvdW5kID0gKHdjaGFyX3QgKil2aWV3LmJ1ZjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhzb3VuZCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIidzb3VuZCcgbXVzdCBiZSBzdHIgb3IgTm9uZSwgbm90ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc291bmQpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHdzb3VuZCA9IFB5VW5pY29kZV9Bc1dpZGVDaGFyU3RyaW5nKHNvdW5kLCBOVUxMKTsKKyAgICAgICAgaWYgKHdzb3VuZCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgIH0KIAorCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgIG9rID0gUGxheVNvdW5kVyhzb3VuZCwgTlVMTCwgZmxhZ3MpOworICAgIG9rID0gUGxheVNvdW5kVyh3c291bmQsIE5VTEwsIGZsYWdzKTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmICh2aWV3Lm9iaikgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKKyAgICB9IGVsc2UgaWYgKHNvdW5kICE9IFB5X05vbmUpIHsKKyAgICAgICAgUHlNZW1fRnJlZSh3c291bmQpOworICAgIH0KICAgICBpZiAoIW9rKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJGYWlsZWQgdG8gcGxheSBzb3VuZCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEwNSwxNCArMTMxLDEzIEBACiAgICAgICAgIE11c3QgYmUgaW4gdGhlIHJhbmdlIDM3IHRocm91Z2ggMzIsNzY3LgogICAgIGR1cmF0aW9uOiBpbnQKICAgICAgICAgSG93IGxvbmcgdGhlIHNvdW5kIHNob3VsZCBwbGF5LCBpbiBtaWxsaXNlY29uZHMuCi0gICAgLwogCiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBXaW5kb3dzIEJlZXAgQVBJLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luc291bmRfQmVlcF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludCBmcmVxdWVuY3ksIGludCBkdXJhdGlvbikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mMzIzODJlNTJlZTliMmZiIGlucHV0PTYyOGE5OWQyZGRmNzM3OThdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mMzIzODJlNTJlZTliMmZiIGlucHV0PTQwZTM2MGNmYTAwYTVjZjBdKi8KIHsKICAgICBCT09MIG9rOwogCkBAIC0xMzYsOCArMTYxLDcgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIHdpbnNvdW5kLk1lc3NhZ2VCZWVwCiAKLSAgICB4OiBpbnQoY19kZWZhdWx0PSJNQl9PSyIpID0gTUJfT0sKLSAgICAvCisgICAgdHlwZTogaW50KGNfZGVmYXVsdD0iTUJfT0siKSA9IE1CX09LCiAKIENhbGwgV2luZG93cyBNZXNzYWdlQmVlcCh4KS4KIApAQCAtMTQ1LDEwICsxNjksMjAgQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLXdpbnNvdW5kX01lc3NhZ2VCZWVwX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50IHgpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MWFkODllNGQ4ZDMwYTk1NyBpbnB1dD1hNzc2YzhhODVjOTg1M2Y2XSovCit3aW5zb3VuZF9NZXNzYWdlQmVlcF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludCB0eXBlKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTEyMDg3NTQ1NTEyMTEyMWYgaW5wdXQ9ZGIxODVmNzQxYWUyMTQwMV0qLwogewotICAgIE1lc3NhZ2VCZWVwKHgpOworICAgIEJPT0wgb2s7CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgb2sgPSBNZXNzYWdlQmVlcCh0eXBlKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgaWYgKCFvaykgeworICAgICAgICBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycihQeUV4Y19SdW50aW1lRXJyb3IsIDApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIApkaWZmIC0tZ2l0IGEvUENidWlsZC9idWlsZF9wZ28uYmF0IGIvUENidWlsZC9idWlsZF9wZ28uYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzJjMzgyLi4wMDAwMDAwCi0tLSBhL1BDYnVpbGQvYnVpbGRfcGdvLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQGVjaG8gb2ZmDQotZWNoby5EZXByZWNhdGlvbldhcm5pbmc6DQotZWNoby4gICAgVGhpcyBzY3JpcHQgaXMgZGVwcmVjYXRlZCwgdXNlIGBidWlsZC5iYXQgLS1wZ29gIGluc3RlYWQuDQotZWNoby4NCi0NCi1jYWxsICIlfmRwMGJ1aWxkLmJhdCIgLS1wZ28gJSoNCmRpZmYgLS1naXQgYS9QQ2J1aWxkL2dldF9leHRlcm5hbHMuYmF0IGIvUENidWlsZC9nZXRfZXh0ZXJuYWxzLmJhdAppbmRleCA5YjJhMDg0Li5hNDVlNzNkIDEwMDY0NAotLS0gYS9QQ2J1aWxkL2dldF9leHRlcm5hbHMuYmF0CisrKyBiL1BDYnVpbGQvZ2V0X2V4dGVybmFscy5iYXQKQEAgLTU1LDkgKzU1LDkgQEAKIHNldCBsaWJyYXJpZXM9JWxpYnJhcmllcyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemlwMi0xLjAuNg0KIGlmIE5PVCAiJUluY2x1ZGVTU0wlIj09ImZhbHNlIiBzZXQgbGlicmFyaWVzPSVsaWJyYXJpZXMlICAgICBuYXNtLTIuMTEuMDYNCiBpZiBOT1QgIiVJbmNsdWRlU1NMJSI9PSJmYWxzZSIgc2V0IGxpYnJhcmllcz0lbGlicmFyaWVzJSAgICAgb3BlbnNzbC0xLjAuMmgNCi1zZXQgbGlicmFyaWVzPSVsaWJyYXJpZXMlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLTMuOC4xMS4wDQotaWYgTk9UICIlSW5jbHVkZVRraW50ZXIlIj09ImZhbHNlIiBzZXQgbGlicmFyaWVzPSVsaWJyYXJpZXMlIHRjbC1jb3JlLTguNi40LjINCi1pZiBOT1QgIiVJbmNsdWRlVGtpbnRlciUiPT0iZmFsc2UiIHNldCBsaWJyYXJpZXM9JWxpYnJhcmllcyUgdGstOC42LjQuMg0KK3NldCBsaWJyYXJpZXM9JWxpYnJhcmllcyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUtMy4xNC4xLjANCitpZiBOT1QgIiVJbmNsdWRlVGtpbnRlciUiPT0iZmFsc2UiIHNldCBsaWJyYXJpZXM9JWxpYnJhcmllcyUgdGNsLWNvcmUtOC42LjYuMA0KK2lmIE5PVCAiJUluY2x1ZGVUa2ludGVyJSI9PSJmYWxzZSIgc2V0IGxpYnJhcmllcz0lbGlicmFyaWVzJSB0ay04LjYuNi4wDQogaWYgTk9UICIlSW5jbHVkZVRraW50ZXIlIj09ImZhbHNlIiBzZXQgbGlicmFyaWVzPSVsaWJyYXJpZXMlIHRpeC04LjQuMy42DQogc2V0IGxpYnJhcmllcz0lbGlicmFyaWVzJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh6LTUuMC41DQogDQpkaWZmIC0tZ2l0IGEvUENidWlsZC9wcmVwYXJlX3NzbC5iYXQgYi9QQ2J1aWxkL3ByZXBhcmVfc3NsLmJhdAppbmRleCAxYmU3M2U2Li4yZjQxYWU4IDEwMDY0NAotLS0gYS9QQ2J1aWxkL3ByZXBhcmVfc3NsLmJhdAorKysgYi9QQ2J1aWxkL3ByZXBhcmVfc3NsLmJhdApAQCAtMywxMCArMywxMCBAQAogICBpZiAiJTEiIEVRVSAiRGVidWciICgNCiAgICAgc2hpZnQNCiAgICAgc2V0IEhPU1RfUFlUSE9OPXB5dGhvbl9kLmV4ZQ0KLSAgICBpZiBub3QgZXhpc3QgcHl0aG9uMzVfZC5kbGwgZXhpdCAxDQorICAgIGlmIG5vdCBleGlzdCBweXRob24zNl9kLmRsbCBleGl0IDENCiAgICkgRUxTRSAoDQogICAgIHNldCBIT1NUX1BZVEhPTj1weXRob24uZXhlDQotICAgIGlmIG5vdCBleGlzdCBweXRob24zNS5kbGwgZXhpdCAxDQorICAgIGlmIG5vdCBleGlzdCBweXRob24zNi5kbGwgZXhpdCAxDQogICApDQogKQ0KICVIT1NUX1BZVEhPTiUgIiV+ZHAwcHJlcGFyZV9zc2wucHkiICUxDQpkaWZmIC0tZ2l0IGEvUENidWlsZC9weXRob24ucHJvcHMgYi9QQ2J1aWxkL3B5dGhvbi5wcm9wcwppbmRleCBlZTcwMjEwLi41ZjVlNzU2IDEwMDY0NAotLS0gYS9QQ2J1aWxkL3B5dGhvbi5wcm9wcworKysgYi9QQ2J1aWxkL3B5dGhvbi5wcm9wcwpAQCAtNDMsNyArNDMsNyBAQAogICAgIAogICAgIDwhLS0gRGlyZWN0b3JpZXMgb2YgZXh0ZXJuYWwgcHJvamVjdHMuIHRjbHRrIGlzIGhhbmRsZWQgaW4gdGNsdGsucHJvcHMgLS0+CiAgICAgPEV4dGVybmFsc0Rpcj4kKFtTeXN0ZW0uSU8uUGF0aF06OkdldEZ1bGxQYXRoKGAkKFB5U291cmNlUGF0aClleHRlcm5hbHNcYCkpPC9FeHRlcm5hbHNEaXI+Ci0gICAgPHNxbGl0ZTNEaXI+JChFeHRlcm5hbHNEaXIpc3FsaXRlLTMuOC4xMS4wXDwvc3FsaXRlM0Rpcj4KKyAgICA8c3FsaXRlM0Rpcj4kKEV4dGVybmFsc0RpcilzcWxpdGUtMy4xNC4xLjBcPC9zcWxpdGUzRGlyPgogICAgIDxiejJEaXI+JChFeHRlcm5hbHNEaXIpYnppcDItMS4wLjZcPC9iejJEaXI+CiAgICAgPGx6bWFEaXI+JChFeHRlcm5hbHNEaXIpeHotNS4wLjVcPC9sem1hRGlyPgogICAgIDxvcGVuc3NsRGlyPiQoRXh0ZXJuYWxzRGlyKW9wZW5zc2wtMS4wLjJoXDwvb3BlbnNzbERpcj4KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qIGIvUENidWlsZC9weXRob25jb3JlLnZjeHByb2oKaW5kZXggM2ExYjViYS4uY2FkNzQ3ZSAxMDA2NDQKLS0tIGEvUENidWlsZC9weXRob25jb3JlLnZjeHByb2oKKysrIGIvUENidWlsZC9weXRob25jb3JlLnZjeHByb2oKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fVVNSRExMO1B5X0JVSUxEX0NPUkU7UHlfRU5BQkxFX1NIQVJFRDtNU19ETExfSUQ9IiQoU3lzV2luVmVyKSI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+d3MyXzMyLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+c2hsd2FwaS5saWI7d3MyXzMyLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgogICAgICAgPEJhc2VBZGRyZXNzPjB4MWUwMDAwMDA8L0Jhc2VBZGRyZXNzPgogICAgIDwvTGluaz4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgpAQCAtMTI0LDYgKzEyNCw3IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXG9kaWN0b2JqZWN0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXG9wY29kZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxvc2RlZnMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVcb3Ntb2R1bGUuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVccGFyc2V0b2suaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVccGF0Y2hsZXZlbC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxwZ2VuLmgiIC8+CkBAIC0yMDksOSArMjEwLDEzIEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25cY29uZHZhci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUHl0aG9uXGltcG9ydGRsLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25cdGhyZWFkX250LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25cd29yZGNvZGVfaGVscGVycy5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX2Jpc2VjdG1vZHVsZS5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfYmxha2UyXGJsYWtlMm1vZHVsZS5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfYmxha2UyXGJsYWtlMmJfaW1wbC5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfYmxha2UyXGJsYWtlMnNfaW1wbC5jIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfY29kZWNzbW9kdWxlLmMiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNb2R1bGVzXF9jb2xsZWN0aW9uc21vZHVsZS5jIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfY3N2LmMiIC8+CkBAIC0yMjMsNiArMjI4LDcgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX21hdGguYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX3BpY2tsZS5jIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfcmFuZG9tbW9kdWxlLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNb2R1bGVzXF9zaGEzXHNoYTNtb2R1bGUuYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX3NyZS5jIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfc3RhdC5jIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfc3RydWN0LmMiIC8+CkBAIC0yNjQsNiArMjcwLDcgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX2lvXGJ1ZmZlcmVkaW8uYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX2lvXGlvYmFzZS5jIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfaW9cdGV4dGlvLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNb2R1bGVzXF9pb1x3aW5jb25zb2xlaW8uYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX2lvXF9pb21vZHVsZS5jIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1x6bGliXGFkbGVyMzIuYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcemxpYlxjb21wcmVzcy5jIiAvPgpAQCAtNDE2LDQgKzQyMyw0IEBACiAgIDxUYXJnZXQgTmFtZT0iX1dhcm5BYm91dFRvb2xzZXQiIEJlZm9yZVRhcmdldHM9IlByZXBhcmVGb3JCdWlsZCIgQ29uZGl0aW9uPSIkKFBsYXRmb3JtVG9vbHNldCkgIT0gJ3YxNDAnIj4KICAgICA8V2FybmluZyBUZXh0PSJUb29sc2V0ICQoUGxhdGZvcm1Ub29sc2V0KSBpcyBub3QgdXNlZCBmb3Igb2ZmaWNpYWwgYnVpbGRzLiBZb3VyIGJ1aWxkIG1heSBoYXZlIGVycm9ycyBvciBpbmNvbXBhdGliaWxpdGllcy4iIC8+CiAgIDwvVGFyZ2V0PgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qLmZpbHRlcnMgYi9QQ2J1aWxkL3B5dGhvbmNvcmUudmN4cHJvai5maWx0ZXJzCmluZGV4IDgzN2I3MzYuLmU0Zjk4YTAgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qLmZpbHRlcnMKKysrIGIvUENidWlsZC9weXRob25jb3JlLnZjeHByb2ouZmlsdGVycwpAQCAtMTc3LDYgKzE3Nyw5IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXG9zZGVmcy5oIj4KICAgICAgIDxGaWx0ZXI+SW5jbHVkZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxvc21vZHVsZS5oIj4KKyAgICAgIDxGaWx0ZXI+SW5jbHVkZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxwYXJzZXRvay5oIj4KICAgICAgIDxGaWx0ZXI+SW5jbHVkZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgpAQCAtNDIwLDYgKzQyMyw5IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25cdGhyZWFkX250LmgiPgogICAgICAgPEZpbHRlcj5QeXRob248L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFB5dGhvblx3b3JkY29kZV9oZWxwZXJzLmgiPgorICAgICAgPEZpbHRlcj5QeXRob248L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFB5dGhvblxjb25kdmFyLmgiPgogICAgICAgPEZpbHRlcj5QeXRob248L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KQEAgLTQ0Myw2ICs0NDksMTUgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX2Jpc2VjdG1vZHVsZS5jIj4KICAgICAgIDxGaWx0ZXI+TW9kdWxlczwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfYmxha2UyXGJsYWtlMm1vZHVsZS5jIj4KKyAgICAgIDxGaWx0ZXI+TW9kdWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfYmxha2UyXGJsYWtlMmJfaW1wbC5jIj4KKyAgICAgIDxGaWx0ZXI+TW9kdWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfYmxha2UyXGJsYWtlMnNfaW1wbC5jIj4KKyAgICAgIDxGaWx0ZXI+TW9kdWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfY29kZWNzbW9kdWxlLmMiPgogICAgICAgPEZpbHRlcj5Nb2R1bGVzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CkBAIC00NzYsNiArNDkxLDkgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX3JhbmRvbW1vZHVsZS5jIj4KICAgICAgIDxGaWx0ZXI+TW9kdWxlczwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfc2hhM1xzaGEzbW9kdWxlLmMiPgorICAgICAgPEZpbHRlcj5Nb2R1bGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNb2R1bGVzXF9zcmUuYyI+CiAgICAgICA8RmlsdGVyPk1vZHVsZXM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KQEAgLTU4Nyw2ICs2MDUsOSBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfaW9cdGV4dGlvLmMiPgogICAgICAgPEZpbHRlcj5Nb2R1bGVzXF9pbzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfaW9cd2luY29uc29sZWlvLmMiPgorICAgICAgPEZpbHRlcj5Nb2R1bGVzXF9pbzwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfaW9cX2lvbW9kdWxlLmMiPgogICAgICAgPEZpbHRlcj5Nb2R1bGVzXF9pbzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtOTgwLDQgKzEwMDEsNCBAQAogICAgICAgPEZpbHRlcj5SZXNvdXJjZSBGaWxlczwvRmlsdGVyPgogICAgIDwvUmVzb3VyY2VDb21waWxlPgogICA8L0l0ZW1Hcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9QQ2J1aWxkL3B5dGhvbncudmN4cHJvaiBiL1BDYnVpbGQvcHl0aG9udy52Y3hwcm9qCmluZGV4IGNhZWQxZTguLmU0MGY2NmMgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcHl0aG9udy52Y3hwcm9qCisrKyBiL1BDYnVpbGQvcHl0aG9udy52Y3hwcm9qCkBAIC02Miw3ICs2Miw3IEBACiAgICAgPC9MaW5rPgogICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPFJlc291cmNlQ29tcGlsZSBJbmNsdWRlPSIuLlxQQ1xweXRob25fZXhlLnJjIiAvPgorICAgIDxSZXNvdXJjZUNvbXBpbGUgSW5jbHVkZT0iLi5cUENccHl0aG9ud19leGUucmMiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUENcV2luTWFpbi5jIiAvPgpkaWZmIC0tZ2l0IGEvUENidWlsZC9yZWFkbWUudHh0IGIvUENidWlsZC9yZWFkbWUudHh0CmluZGV4IGQ0NWViMjcuLjM0YzJlZmUgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcmVhZG1lLnR4dAorKysgYi9QQ2J1aWxkL3JlYWRtZS50eHQKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICBVc2VkIHRvIGJ1aWxkIFB5dGhvbiB3aXRoIGV4dHJhIGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMsIGVxdWl2YWxlbnQNCiAgICAgdG8gdXNpbmcgLi9jb25maWd1cmUgLS13aXRoLXB5ZGVidWcgb24gVU5JWC4gIEFsbCBiaW5hcmllcyBidWlsdA0KICAgICB1c2luZyB0aGlzIGNvbmZpZ3VyYXRpb24gaGF2ZSAiX2QiIGFkZGVkIHRvIHRoZWlyIG5hbWU6DQotICAgIHB5dGhvbjM1X2QuZGxsLCBweXRob25fZC5leGUsIHBhcnNlcl9kLnB5ZCwgYW5kIHNvIG9uLiAgQm90aCB0aGUNCisgICAgcHl0aG9uMzZfZC5kbGwsIHB5dGhvbl9kLmV4ZSwgcGFyc2VyX2QucHlkLCBhbmQgc28gb24uICBCb3RoIHRoZQ0KICAgICBidWlsZCBhbmQgcnQgKHJ1biB0ZXN0KSBiYXRjaCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhY2NlcHQgYSAtZA0KICAgICBvcHRpb24gZm9yIGRlYnVnIGJ1aWxkcy4gIElmIHlvdSBhcmUgYnVpbGRpbmcgUHl0aG9uIHRvIGhlbHAgd2l0aA0KICAgICBkZXZlbG9wbWVudCBvZiBDUHl0aG9uLCB5b3Ugd2lsbCBtb3N0IGxpa2VseSB1c2UgdGhpcyBjb25maWd1cmF0aW9uLg0KQEAgLTIwNCwxMSArMjA0LDExIEBACiAgICAgZnVuY3Rpb25hbGl0eSB0byBfc3NsIG9yIF9oYXNobGliLiBUaGV5IHdpbGwgbm90IGNsZWFuIHVwIHRoZWlyIG91dHB1dA0KICAgICB3aXRoIHRoZSBub3JtYWwgQ2xlYW4gdGFyZ2V0OyBDbGVhbkFsbCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLg0KIF9zcWxpdGUzDQotICAgIFdyYXBzIFNRTGl0ZSAzLjguMTEuMCwgd2hpY2ggaXMgaXRzZWxmIGJ1aWx0IGJ5IHNxbGl0ZTMudmN4cHJvag0KKyAgICBXcmFwcyBTUUxpdGUgMy4xNC4xLjAsIHdoaWNoIGlzIGl0c2VsZiBidWlsdCBieSBzcWxpdGUzLnZjeHByb2oNCiAgICAgSG9tZXBhZ2U6DQogICAgICAgICBodHRwOi8vd3d3LnNxbGl0ZS5vcmcvDQogX3RraW50ZXINCi0gICAgV3JhcHMgdmVyc2lvbiA4LjYuNCBvZiB0aGUgVGsgd2luZG93aW5nIHN5c3RlbS4NCisgICAgV3JhcHMgdmVyc2lvbiA4LjYuNiBvZiB0aGUgVGsgd2luZG93aW5nIHN5c3RlbS4NCiAgICAgSG9tZXBhZ2U6DQogICAgICAgICBodHRwOi8vd3d3LnRjbC50ay8NCiANCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3J0LmJhdCBiL1BDYnVpbGQvcnQuYmF0CmluZGV4IDJkOTNiODAuLjdkNGQwNzEgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcnQuYmF0CisrKyBiL1BDYnVpbGQvcnQuYmF0CkBAIC00Miw3ICs0Miw3IEBACiBpZiBOT1QgIiUxIj09IiIgKHNldCByZWdydGVzdGFyZ3M9JXJlZ3J0ZXN0YXJncyUgJTEpICYgc2hpZnQgJiBnb3RvIENoZWNrT3B0cw0KIA0KIHNldCBleGU9JXByZWZpeCVweXRob24lc3VmZml4JS5leGUNCi1zZXQgY21kPSIlZXhlJSIgJWRhc2hPJSAtV2QgLUUgLWJiICIlcGNidWlsZCUuLlxsaWJcdGVzdFxyZWdydGVzdC5weSIgJXJlZ3J0ZXN0YXJncyUNCitzZXQgY21kPSIlZXhlJSIgJWRhc2hPJSAtV2QgLUUgLWJiIC1tIHRlc3QgJXJlZ3J0ZXN0YXJncyUNCiBpZiBkZWZpbmVkIHFtb2RlIGdvdG8gUW1vZGUNCiANCiBlY2hvIERlbGV0aW5nIC5weWMvLnB5byBmaWxlcyAuLi4NCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3NxbGl0ZTMudmN4cHJvaiBiL1BDYnVpbGQvc3FsaXRlMy52Y3hwcm9qCmluZGV4IGM4NDFjNWEuLjRmNWIxOTYgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvc3FsaXRlMy52Y3hwcm9qCisrKyBiL1BDYnVpbGQvc3FsaXRlMy52Y3hwcm9qCkBAIC02Niw3ICs2Niw3IEBACiAgIDxJdGVtRGVmaW5pdGlvbkdyb3VwPgogICAgIDxDbENvbXBpbGU+CiAgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKHNxbGl0ZTNEaXIpOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+U1FMSVRFX0FQST1fX2RlY2xzcGVjKGRsbGV4cG9ydCk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlNRTElURV9FTkFCTEVfRlRTNDtTUUxJVEVfRU5BQkxFX0ZUUzU7U1FMSVRFX0FQST1fX2RlY2xzcGVjKGRsbGV4cG9ydCk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDE8L1dhcm5pbmdMZXZlbD4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8UmVzb3VyY2VDb21waWxlPgpAQCAtODYsNCArODYsNCBAQAogICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgogICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgogICA8L0ltcG9ydEdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL1BDYnVpbGQvdGNsdGsucHJvcHMgYi9QQ2J1aWxkL3RjbHRrLnByb3BzCmluZGV4IDExZGJmZmIuLjU3YmI5OGEgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvdGNsdGsucHJvcHMKKysrIGIvUENidWlsZC90Y2x0ay5wcm9wcwpAQCAtNCw4ICs0LDggQEAKICAgPFByb3BlcnR5R3JvdXA+CiAgICAgPFRjbE1ham9yVmVyc2lvbj44PC9UY2xNYWpvclZlcnNpb24+CiAgICAgPFRjbE1pbm9yVmVyc2lvbj42PC9UY2xNaW5vclZlcnNpb24+Ci0gICAgPFRjbFBhdGNoTGV2ZWw+NDwvVGNsUGF0Y2hMZXZlbD4KLSAgICA8VGNsUmV2aXNpb24+MjwvVGNsUmV2aXNpb24+CisgICAgPFRjbFBhdGNoTGV2ZWw+NjwvVGNsUGF0Y2hMZXZlbD4KKyAgICA8VGNsUmV2aXNpb24+MDwvVGNsUmV2aXNpb24+CiAgICAgPFRrTWFqb3JWZXJzaW9uPiQoVGNsTWFqb3JWZXJzaW9uKTwvVGtNYWpvclZlcnNpb24+CiAgICAgPFRrTWlub3JWZXJzaW9uPiQoVGNsTWlub3JWZXJzaW9uKTwvVGtNaW5vclZlcnNpb24+CiAgICAgPFRrUGF0Y2hMZXZlbD4kKFRjbFBhdGNoTGV2ZWwpPC9Ua1BhdGNoTGV2ZWw+CkBAIC00Miw0ICs0Miw0IEBACiAgICAgPEJ1aWxkRGlyVG9wIENvbmRpdGlvbj0iJChQbGF0Zm9ybVRvb2xzZXQpID09ICd2MTEwJyI+JChCdWlsZERpclRvcClfVkMxMTwvQnVpbGREaXJUb3A+CiAgICAgPEJ1aWxkRGlyVG9wIENvbmRpdGlvbj0iJChQbGF0Zm9ybVRvb2xzZXQpID09ICd2MTAwJyI+JChCdWlsZERpclRvcClfVkMxMDwvQnVpbGREaXJUb3A+CiAgIDwvUHJvcGVydHlHcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9QQ2J1aWxkL3h4bGltaXRlZC52Y3hwcm9qIGIvUENidWlsZC94eGxpbWl0ZWQudmN4cHJvagppbmRleCAwMTQ0ZmE5Li45ZGJkYzc3IDEwMDY0NAotLS0gYS9QQ2J1aWxkL3h4bGltaXRlZC52Y3hwcm9qCisrKyBiL1BDYnVpbGQveHhsaW1pdGVkLnZjeHByb2oKQEAgLTYyLDcgKzYyLDcgQEAKICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cD4KICAgICA8Q2xDb21waWxlPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpO1B5X0xJTUlURURfQVBJPTB4MDMwNTAwMDA8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpO1B5X0xJTUlURURfQVBJPTB4MDMwNjAwMDA8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgogICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+d3NvY2szMi5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KZGlmZiAtLWdpdCBhL1BhcnNlci9QeXRob24uYXNkbCBiL1BhcnNlci9QeXRob24uYXNkbAppbmRleCBjZDA4MzJkLi5mNDcwYWQxIDEwMDY0NAotLS0gYS9QYXJzZXIvUHl0aG9uLmFzZGwKKysrIGIvUGFyc2VyL1B5dGhvbi5hc2RsCkBAIC0xLDQgKzEsOCBAQAotLS0gQVNETCdzIHNpeCBidWlsdGluIHR5cGVzIGFyZSBpZGVudGlmaWVyLCBpbnQsIHN0cmluZywgYnl0ZXMsIG9iamVjdCwgc2luZ2xldG9uCistLSBBU0RMJ3MgNyBidWlsdGluIHR5cGVzIGFyZToKKy0tIGlkZW50aWZpZXIsIGludCwgc3RyaW5nLCBieXRlcywgb2JqZWN0LCBzaW5nbGV0b24sIGNvbnN0YW50CistLQorLS0gc2luZ2xldG9uOiBOb25lLCBUcnVlIG9yIEZhbHNlCistLSBjb25zdGFudCBjYW4gYmUgTm9uZSwgd2hlcmVhcyBOb25lIG1lYW5zICJubyB2YWx1ZSIgZm9yIG9iamVjdC4KIAogbW9kdWxlIFB5dGhvbgogewpAQCAtMjQsNiArMjgsOCBAQAogICAgICAgICAgIHwgRGVsZXRlKGV4cHIqIHRhcmdldHMpCiAgICAgICAgICAgfCBBc3NpZ24oZXhwciogdGFyZ2V0cywgZXhwciB2YWx1ZSkKICAgICAgICAgICB8IEF1Z0Fzc2lnbihleHByIHRhcmdldCwgb3BlcmF0b3Igb3AsIGV4cHIgdmFsdWUpCisgICAgICAgICAgLS0gJ3NpbXBsZScgaW5kaWNhdGVzIHRoYXQgd2UgYW5ub3RhdGUgc2ltcGxlIG5hbWUgd2l0aG91dCBwYXJlbnMKKyAgICAgICAgICB8IEFubkFzc2lnbihleHByIHRhcmdldCwgZXhwciBhbm5vdGF0aW9uLCBleHByPyB2YWx1ZSwgaW50IHNpbXBsZSkKIAogICAgICAgICAgIC0tIHVzZSAnb3JlbHNlJyBiZWNhdXNlIGVsc2UgaXMgYSBrZXl3b3JkIGluIHRhcmdldCBsYW5ndWFnZXMKICAgICAgICAgICB8IEZvcihleHByIHRhcmdldCwgZXhwciBpdGVyLCBzdG10KiBib2R5LCBzdG10KiBvcmVsc2UpCkBAIC03MSw5ICs3NywxMiBAQAogICAgICAgICAgfCBDYWxsKGV4cHIgZnVuYywgZXhwciogYXJncywga2V5d29yZCoga2V5d29yZHMpCiAgICAgICAgICB8IE51bShvYmplY3QgbikgLS0gYSBudW1iZXIgYXMgYSBQeU9iamVjdC4KICAgICAgICAgIHwgU3RyKHN0cmluZyBzKSAtLSBuZWVkIHRvIHNwZWNpZnkgcmF3LCB1bmljb2RlLCBldGM/CisgICAgICAgICB8IEZvcm1hdHRlZFZhbHVlKGV4cHIgdmFsdWUsIGludD8gY29udmVyc2lvbiwgZXhwcj8gZm9ybWF0X3NwZWMpCisgICAgICAgICB8IEpvaW5lZFN0cihleHByKiB2YWx1ZXMpCiAgICAgICAgICB8IEJ5dGVzKGJ5dGVzIHMpCiAgICAgICAgICB8IE5hbWVDb25zdGFudChzaW5nbGV0b24gdmFsdWUpCiAgICAgICAgICB8IEVsbGlwc2lzCisgICAgICAgICB8IENvbnN0YW50KGNvbnN0YW50IHZhbHVlKQogCiAgICAgICAgICAtLSB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24gY2FuIGFwcGVhciBpbiBhc3NpZ25tZW50IGNvbnRleHQKICAgICAgICAgIHwgQXR0cmlidXRlKGV4cHIgdmFsdWUsIGlkZW50aWZpZXIgYXR0ciwgZXhwcl9jb250ZXh0IGN0eCkKQEAgLTEwMSw3ICsxMTAsNyBAQAogCiAgICAgY21wb3AgPSBFcSB8IE5vdEVxIHwgTHQgfCBMdEUgfCBHdCB8IEd0RSB8IElzIHwgSXNOb3QgfCBJbiB8IE5vdEluCiAKLSAgICBjb21wcmVoZW5zaW9uID0gKGV4cHIgdGFyZ2V0LCBleHByIGl0ZXIsIGV4cHIqIGlmcykKKyAgICBjb21wcmVoZW5zaW9uID0gKGV4cHIgdGFyZ2V0LCBleHByIGl0ZXIsIGV4cHIqIGlmcywgaW50IGlzX2FzeW5jKQogCiAgICAgZXhjZXB0aGFuZGxlciA9IEV4Y2VwdEhhbmRsZXIoZXhwcj8gdHlwZSwgaWRlbnRpZmllcj8gbmFtZSwgc3RtdCogYm9keSkKICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyAoaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQpCmRpZmYgLS1naXQgYS9QYXJzZXIvYXNkbC5weSBiL1BhcnNlci9hc2RsLnB5CmluZGV4IDEyMWNkYWIuLjYyZjVjMTkgMTAwNjQ0Ci0tLSBhL1BhcnNlci9hc2RsLnB5CisrKyBiL1BhcnNlci9hc2RsLnB5CkBAIC0zMyw3ICszMyw4IEBACiAjIFNlZSB0aGUgRUJORiBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljYWwgY29ubmVjdGlvbgogIyBiZXR3ZWVuIHRoZSB2YXJpb3VzIG5vZGUgdHlwZXMuCiAKLWJ1aWx0aW5fdHlwZXMgPSB7J2lkZW50aWZpZXInLCAnc3RyaW5nJywgJ2J5dGVzJywgJ2ludCcsICdvYmplY3QnLCAnc2luZ2xldG9uJ30KK2J1aWx0aW5fdHlwZXMgPSB7J2lkZW50aWZpZXInLCAnc3RyaW5nJywgJ2J5dGVzJywgJ2ludCcsICdvYmplY3QnLCAnc2luZ2xldG9uJywKKyAgICAgICAgICAgICAgICAgJ2NvbnN0YW50J30KIAogY2xhc3MgQVNUOgogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKZGlmZiAtLWdpdCBhL1BhcnNlci9hc2RsX2MucHkgYi9QYXJzZXIvYXNkbF9jLnB5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjM4YzI1My4uMTdjODUxNwotLS0gYS9QYXJzZXIvYXNkbF9jLnB5CisrKyBiL1BhcnNlci9hc2RsX2MucHkKQEAgLTgzNCw2ICs4MzQsNyBAQAogICAgIHJldHVybiAoUHlPYmplY3QqKW87CiB9CiAjZGVmaW5lIGFzdDJvYmpfc2luZ2xldG9uIGFzdDJvYmpfb2JqZWN0CisjZGVmaW5lIGFzdDJvYmpfY29uc3RhbnQgYXN0Mm9ial9vYmplY3QKICNkZWZpbmUgYXN0Mm9ial9pZGVudGlmaWVyIGFzdDJvYmpfb2JqZWN0CiAjZGVmaW5lIGFzdDJvYmpfc3RyaW5nIGFzdDJvYmpfb2JqZWN0CiAjZGVmaW5lIGFzdDJvYmpfYnl0ZXMgYXN0Mm9ial9vYmplY3QKQEAgLTg3MSw2ICs4NzIsMTkgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvYmoyYXN0X2NvbnN0YW50KFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0Kiogb3V0LCBQeUFyZW5hKiBhcmVuYSkKK3sKKyAgICBpZiAob2JqKSB7CisgICAgICAgIGlmIChQeUFyZW5hX0FkZFB5T2JqZWN0KGFyZW5hLCBvYmopIDwgMCkgeworICAgICAgICAgICAgKm91dCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgfQorICAgICpvdXQgPSBvYmo7CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgb2JqMmFzdF9pZGVudGlmaWVyKFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0Kiogb3V0LCBQeUFyZW5hKiBhcmVuYSkKIHsKICAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KG9iaikgJiYgb2JqICE9IFB5X05vbmUpIHsKQEAgLTkwNiw3ICs5MjAsNyBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICBpID0gKGludClQeUxvbmdfQXNMb25nKG9iaik7CisgICAgaSA9IF9QeUxvbmdfQXNJbnQob2JqKTsKICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gMTsKICAgICAqb3V0ID0gaTsKZGlmZiAtLWdpdCBhL1BhcnNlci9ncmFtbWFyLmMgYi9QYXJzZXIvZ3JhbW1hci5jCmluZGV4IGI1OTgyOTQuLjg0MjIzYzYgMTAwNjQ0Ci0tLSBhL1BhcnNlci9ncmFtbWFyLmMKKysrIGIvUGFyc2VyL2dyYW1tYXIuYwpAQCAtNjMsNyArNjMsNyBAQAogICAgIHMtPnNfdXBwZXIgPSAwOwogICAgIHMtPnNfYWNjZWwgPSBOVUxMOwogICAgIHMtPnNfYWNjZXB0ID0gMDsKLSAgICByZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChzIC0gZC0+ZF9zdGF0ZSwgUHlfaW50cHRyX3QsIGludCk7CisgICAgcmV0dXJuIFB5X1NBRkVfRE9XTkNBU1QocyAtIGQtPmRfc3RhdGUsIGludHB0cl90LCBpbnQpOwogfQogCiB2b2lkCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICBpZiAoUHlfRGVidWdGbGFnKQogICAgICAgICBwcmludGYoIkxhYmVsIEAgJThwLCAlZDogJXNcbiIsIGxsLCBsbC0+bGxfbmxhYmVscywKICAgICAgICAgICAgICAgIFB5R3JhbW1hcl9MYWJlbFJlcHIobGIpKTsKLSAgICByZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChsYiAtIGxsLT5sbF9sYWJlbCwgUHlfaW50cHRyX3QsIGludCk7CisgICAgcmV0dXJuIFB5X1NBRkVfRE9XTkNBU1QobGIgLSBsbC0+bGxfbGFiZWwsIGludHB0cl90LCBpbnQpOwogfQogCiAvKiBTYW1lLCBidXQgcmF0aGVyIGRpZXMgdGhhbiBhZGRzICovCkBAIC0xMjIsNyArMTIyLDEzIEBACiAgICAgfQogICAgIGZwcmludGYoc3RkZXJyLCAiTGFiZWwgJWQvJyVzJyBub3QgZm91bmRcbiIsIHR5cGUsIHN0cik7CiAgICAgUHlfRmF0YWxFcnJvcigiZ3JhbW1hci5jOmZpbmRsYWJlbCgpIik7CisKKyAgICAvKiBQeV9GYXRhbEVycm9yKCkgaXMgZGVjbGFyZWQgd2l0aCBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKS4KKyAgICAgICBHQ0MgZW1pdHMgYSB3YXJuaW5nIHdpdGhvdXQgInJldHVybiAwOyIgKGNvbXBpbGVyIGJ1ZyEpLCBidXQgQ2xhbmcgaXMKKyAgICAgICBzbWFydGVyIGFuZCBlbWl0cyBhIHdhcm5pbmcgb24gdGhlIHJldHVybi4uLiAqLworI2lmbmRlZiBfX2NsYW5nX18KICAgICByZXR1cm4gMDsgLyogTWFrZSBnY2MgLVdhbGwgaGFwcHkgKi8KKyNlbmRpZgogfQogCiAvKiBGb3J3YXJkICovCmRpZmYgLS1naXQgYS9QYXJzZXIvbXlyZWFkbGluZS5jIGIvUGFyc2VyL215cmVhZGxpbmUuYwppbmRleCAyOGM3YjZkLi5jOGI5MmRhIDEwMDY0NAotLS0gYS9QYXJzZXIvbXlyZWFkbGluZS5jCisrKyBiL1BhcnNlci9teXJlYWRsaW5lLmMKQEAgLTQxLDEwICs0MSw3IEBACiAgICAgICAgICAgICAodm9pZCkoUHlPU19JbnB1dEhvb2spKCk7CiAgICAgICAgIGVycm5vID0gMDsKICAgICAgICAgY2xlYXJlcnIoZnApOwotICAgICAgICBpZiAoX1B5VmVyaWZ5X2ZkKGZpbGVubyhmcCkpKQotICAgICAgICAgICAgcCA9IGZnZXRzKGJ1ZiwgbGVuLCBmcCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHAgPSBOVUxMOworICAgICAgICBwID0gZmdldHMoYnVmLCBsZW4sIGZwKTsKICAgICAgICAgaWYgKHAgIT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiAwOyAvKiBObyBlcnJvciAqLwogICAgICAgICBlcnIgPSBlcnJubzsKQEAgLTEwMSw2ICs5OCwxMDAgQEAKICAgICAvKiBOT1RSRUFDSEVEICovCiB9CiAKKyNpZmRlZiBNU19XSU5ET1dTCisvKiBSZWFkbGluZSBpbXBsZW1lbnRhdGlvbiB1c2luZyBSZWFkQ29uc29sZVcgKi8KKworZXh0ZXJuIGNoYXIgX2dldF9jb25zb2xlX3R5cGUoSEFORExFIGhhbmRsZSk7CisKK2NoYXIgKgorX1B5T1NfV2luZG93c0NvbnNvbGVSZWFkbGluZShIQU5ETEUgaFN0ZEluKQoreworICAgIHN0YXRpYyB3Y2hhcl90IHdidWZfbG9jYWxbMTAyNCAqIDE2XTsKKyAgICBjb25zdCBEV09SRCBjaHVua19zaXplID0gMTAyNDsKKworICAgIERXT1JEIG5fcmVhZCwgdG90YWxfcmVhZCwgd2J1ZmxlbiwgdThsZW47CisgICAgd2NoYXJfdCAqd2J1ZjsKKyAgICBjaGFyICpidWYgPSBOVUxMOworICAgIGludCBlcnIgPSAwOworCisgICAgbl9yZWFkID0gMDsKKyAgICB0b3RhbF9yZWFkID0gMDsKKyAgICB3YnVmID0gd2J1Zl9sb2NhbDsKKyAgICB3YnVmbGVuID0gc2l6ZW9mKHdidWZfbG9jYWwpIC8gc2l6ZW9mKHdidWZfbG9jYWxbMF0pIC0gMTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIVJlYWRDb25zb2xlVyhoU3RkSW4sICZ3YnVmW3RvdGFsX3JlYWRdLCB3YnVmbGVuIC0gdG90YWxfcmVhZCwgJm5fcmVhZCwgTlVMTCkpIHsKKyAgICAgICAgICAgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIGlmIChuX3JlYWQgPT0gMCkgeworICAgICAgICAgICAgaW50IHM7CisgICAgICAgICAgICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gRVJST1JfT1BFUkFUSU9OX0FCT1JURUQpCisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgIEhBTkRMRSBoSW50ZXJydXB0RXZlbnQgPSBfUHlPU19TaWdpbnRFdmVudCgpOworICAgICAgICAgICAgaWYgKFdhaXRGb3JTaW5nbGVPYmplY3RFeChoSW50ZXJydXB0RXZlbnQsIDEwMCwgRkFMU0UpCisgICAgICAgICAgICAgICAgICAgID09IFdBSVRfT0JKRUNUXzApIHsKKyAgICAgICAgICAgICAgICBSZXNldEV2ZW50KGhJbnRlcnJ1cHRFdmVudCk7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICAgICAgICAgICAgICBQeUV2YWxfUmVzdG9yZVRocmVhZChfUHlPU19SZWFkbGluZVRTdGF0ZSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBzID0gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICAgICAgICAgICAgICBQeUV2YWxfU2F2ZVRocmVhZCgpOworI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKHMgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRvdGFsX3JlYWQgKz0gbl9yZWFkOworICAgICAgICBpZiAodG90YWxfcmVhZCA9PSAwIHx8IHdidWZbdG90YWxfcmVhZCAtIDFdID09IEwnXG4nKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3YnVmbGVuICs9IGNodW5rX3NpemU7CisgICAgICAgIGlmICh3YnVmID09IHdidWZfbG9jYWwpIHsKKyAgICAgICAgICAgIHdidWZbdG90YWxfcmVhZF0gPSAnXDAnOworICAgICAgICAgICAgd2J1ZiA9ICh3Y2hhcl90KilQeU1lbV9SYXdNYWxsb2Mod2J1ZmxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgICAgICAgICBpZiAod2J1ZikKKyAgICAgICAgICAgICAgICB3Y3NjcHlfcyh3YnVmLCB3YnVmbGVuLCB3YnVmX2xvY2FsKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB3YnVmID0gKHdjaGFyX3QqKVB5TWVtX1Jhd1JlYWxsb2Mod2J1Ziwgd2J1ZmxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgfQorCisgICAgaWYgKHdidWZbMF0gPT0gJ1x4MWEnKSB7CisgICAgICAgIGJ1ZiA9IFB5TWVtX1Jhd01hbGxvYygxKTsKKyAgICAgICAgaWYgKGJ1ZikKKyAgICAgICAgICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICB1OGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgd2J1ZiwgdG90YWxfcmVhZCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgICAgYnVmID0gUHlNZW1fUmF3TWFsbG9jKHU4bGVuICsgMSk7CisgICAgdThsZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsIDAsIHdidWYsIHRvdGFsX3JlYWQsIGJ1ZiwgdThsZW4sIE5VTEwsIE5VTEwpOworICAgIGJ1Zlt1OGxlbl0gPSAnXDAnOworICAgIAorZXhpdDoKKyAgICBpZiAod2J1ZiAhPSB3YnVmX2xvY2FsKQorICAgICAgICBQeU1lbV9SYXdGcmVlKHdidWYpOworCisgICAgaWYgKGVycikgeworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKF9QeU9TX1JlYWRsaW5lVFN0YXRlKTsKKyNlbmRpZgorICAgICAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycihlcnIpOworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgICAgIFB5RXZhbF9TYXZlVGhyZWFkKCk7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gYnVmOworfQorCisjZW5kaWYKKwogCiAvKiBSZWFkbGluZSBpbXBsZW1lbnRhdGlvbiB1c2luZyBmZ2V0cygpICovCiAKQEAgLTExMCw2ICsyMDEsMjUgQEAKICAgICBzaXplX3QgbjsKICAgICBjaGFyICpwLCAqcHI7CiAKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgaWYgKCFQeV9MZWdhY3lXaW5kb3dzU3RkaW9GbGFnICYmIHN5c19zdGRpbiA9PSBzdGRpbikgeworICAgICAgICBIQU5ETEUgaFN0ZEluOworICAgICAgICAKKyAgICAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAorICAgICAgICBoU3RkSW4gPSAoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZpbGVubyhzeXNfc3RkaW4pKTsKKyAgICAgICAgX1B5X0VORF9TVVBQUkVTU19JUEgKKyAgICAgICAgCisgICAgICAgIGlmIChfZ2V0X2NvbnNvbGVfdHlwZShoU3RkSW4pID09ICdyJykgeworICAgICAgICAgICAgZmZsdXNoKHN5c19zdGRvdXQpOworICAgICAgICAgICAgaWYgKHByb21wdCkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgcHJvbXB0KTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgICAgICAgY2xlYXJlcnIoc3lzX3N0ZGluKTsKKyAgICAgICAgICAgIHJldHVybiBfUHlPU19XaW5kb3dzQ29uc29sZVJlYWRsaW5lKGhTdGRJbik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKwogICAgIG4gPSAxMDA7CiAgICAgcCA9IChjaGFyICopUHlNZW1fUmF3TWFsbG9jKG4pOwogICAgIGlmIChwID09IE5VTEwpCmRpZmYgLS1naXQgYS9QYXJzZXIvbm9kZS5jIGIvUGFyc2VyL25vZGUuYwppbmRleCAwMDEwMzI0Li4yNDBkMjkwIDEwMDY0NAotLS0gYS9QYXJzZXIvbm9kZS5jCisrKyBiL1BhcnNlci9ub2RlLmMKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBpZiAoY3VycmVudF9jYXBhY2l0eSA8IDAgfHwgcmVxdWlyZWRfY2FwYWNpdHkgPCAwKQogICAgICAgICByZXR1cm4gRV9PVkVSRkxPVzsKICAgICBpZiAoY3VycmVudF9jYXBhY2l0eSA8IHJlcXVpcmVkX2NhcGFjaXR5KSB7Ci0gICAgICAgIGlmICgoc2l6ZV90KXJlcXVpcmVkX2NhcGFjaXR5ID4gUFlfU0laRV9NQVggLyBzaXplb2Yobm9kZSkpIHsKKyAgICAgICAgaWYgKChzaXplX3QpcmVxdWlyZWRfY2FwYWNpdHkgPiBTSVpFX01BWCAvIHNpemVvZihub2RlKSkgewogICAgICAgICAgICAgcmV0dXJuIEVfTk9NRU07CiAgICAgICAgIH0KICAgICAgICAgbiA9IG4xLT5uX2NoaWxkOwpkaWZmIC0tZ2l0IGEvUGFyc2VyL3BhcnNlci5jIGIvUGFyc2VyL3BhcnNlci5jCmluZGV4IDU2ZWM1MTQuLjQxMDcyYzQgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wYXJzZXIuYworKysgYi9QYXJzZXIvcGFyc2VyLmMKQEAgLTE0MCwyMSArMTQwLDIwIEBACiAgICAgaW50IG4gPSBnLT5nX2xsLmxsX25sYWJlbHM7CiAKICAgICBpZiAodHlwZSA9PSBOQU1FKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnMgPSBzdHI7CiAgICAgICAgIGxhYmVsICpsID0gZy0+Z19sbC5sbF9sYWJlbDsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGZvciAoaSA9IG47IGkgPiAwOyBpLS0sIGwrKykgewogICAgICAgICAgICAgaWYgKGwtPmxiX3R5cGUgIT0gTkFNRSB8fCBsLT5sYl9zdHIgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgIGwtPmxiX3N0clswXSAhPSBzWzBdIHx8Ci0gICAgICAgICAgICAgICAgc3RyY21wKGwtPmxiX3N0ciwgcykgIT0gMCkKKyAgICAgICAgICAgICAgICBsLT5sYl9zdHJbMF0gIT0gc3RyWzBdIHx8CisgICAgICAgICAgICAgICAgc3RyY21wKGwtPmxiX3N0ciwgc3RyKSAhPSAwKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAogI2lmIDAKICAgICAgICAgICAgIC8qIExlYXZpbmcgdGhpcyBpbiBhcyBhbiBleGFtcGxlICovCiAgICAgICAgICAgICBpZiAoIShwcy0+cF9mbGFncyAmIENPX0ZVVFVSRV9XSVRIX1NUQVRFTUVOVCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc1swXSA9PSAndycgJiYgc3RyY21wKHMsICJ3aXRoIikgPT0gMCkKKyAgICAgICAgICAgICAgICBpZiAoc3RyWzBdID09ICd3JyAmJiBzdHJjbXAoc3RyLCAid2l0aCIpID09IDApCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBub3QgYSBrZXl3b3JkIHlldCAqLwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNbMF0gPT0gJ2EnICYmIHN0cmNtcChzLCAiYXMiKSA9PSAwKQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0clswXSA9PSAnYScgJiYgc3RyY21wKHN0ciwgImFzIikgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIG5vdCBhIGtleXdvcmQgeWV0ICovCiAgICAgICAgICAgICB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1BhcnNlci9wYXJzZXRvay5jIGIvUGFyc2VyL3BhcnNldG9rLmMKaW5kZXggNjI5ZGVlNS4uMWY0NjdkNiAxMDA2NDQKLS0tIGEvUGFyc2VyL3BhcnNldG9rLmMKKysrIGIvUGFyc2VyL3BhcnNldG9rLmMKQEAgLTE2MSwxMCArMTYxLDEwIEBACiAKICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKICNpZiAwCi1zdGF0aWMgY2hhciB3aXRoX21zZ1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIHdpdGhfbXNnW10gPQogIiVzOiVkOiBXYXJuaW5nOiAnd2l0aCcgd2lsbCBiZWNvbWUgYSByZXNlcnZlZCBrZXl3b3JkIGluIFB5dGhvbiAyLjZcbiI7CiAKLXN0YXRpYyBjaGFyIGFzX21zZ1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGFzX21zZ1tdID0KICIlczolZDogV2FybmluZzogJ2FzJyB3aWxsIGJlY29tZSBhIHJlc2VydmVkIGtleXdvcmQgaW4gUHl0aG9uIDIuNlxuIjsKIAogc3RhdGljIHZvaWQKQEAgLTI1NSw3ICsyNTUsNyBAQAogI2VuZGlmCiAgICAgICAgIGlmIChhID49IHRvay0+bGluZV9zdGFydCkKICAgICAgICAgICAgIGNvbF9vZmZzZXQgPSBQeV9TQUZFX0RPV05DQVNUKGEgLSB0b2stPmxpbmVfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9pbnRwdHJfdCwgaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90LCBpbnQpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBjb2xfb2Zmc2V0ID0gLTE7CiAKZGlmZiAtLWdpdCBhL1BhcnNlci9wZ2VuLmMgYi9QYXJzZXIvcGdlbi5jCmluZGV4IGYzMDMxYWUuLmJlMzVlMDIgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wZ2VuLmMKKysrIGIvUGFyc2VyL3BnZW4uYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKICNpZmRlZiBQeV9ERUJVRwogCi1zdGF0aWMgY2hhciBSRVFORk1UW10gPSAibWV0YWNvbXBpbGU6IGxlc3MgdGhhbiAlZCBjaGlsZHJlblxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIFJFUU5GTVRbXSA9ICJtZXRhY29tcGlsZTogbGVzcyB0aGFuICVkIGNoaWxkcmVuXG4iOwogCiAjZGVmaW5lIFJFUU4oaSwgY291bnQpIGRvIHsgXAogICAgIGlmIChpIDwgY291bnQpIHsgXApAQCAtMzc5LDcgKzM3OSw3IEBACiAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyB2b2lkIHByaW50c3NkZmEoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSwgaW50IG5iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGxpc3QgKmxsLCBjaGFyICptc2cpOworICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGxpc3QgKmxsLCBjb25zdCBjaGFyICptc2cpOwogc3RhdGljIHZvaWQgc2ltcGxpZnkoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSk7CiBzdGF0aWMgdm9pZCBjb252ZXJ0KGRmYSAqZCwgaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSk7CiAKQEAgLTQ5NCw3ICs0OTQsNyBAQAogCiBzdGF0aWMgdm9pZAogcHJpbnRzc2RmYShpbnQgeHhfbnN0YXRlcywgc3Nfc3RhdGUgKnh4X3N0YXRlLCBpbnQgbmJpdHMsCi0gICAgICAgICAgIGxhYmVsbGlzdCAqbGwsIGNoYXIgKm1zZykKKyAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY29uc3QgY2hhciAqbXNnKQogewogICAgIGludCBpLCBpYml0LCBpYXJjOwogICAgIHNzX3N0YXRlICp5eTsKZGlmZiAtLWdpdCBhL1BhcnNlci9wZ2VubWFpbi5jIGIvUGFyc2VyL3BnZW5tYWluLmMKaW5kZXggMGYwNTVkNi4uZTlkMzA4MiAxMDA2NDQKLS0tIGEvUGFyc2VyL3BnZW5tYWluLmMKKysrIGIvUGFyc2VyL3BnZW5tYWluLmMKQEAgLTI3LDcgKzI3LDcgQEAKIGludCBQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWc7CiAKIC8qIEZvcndhcmQgKi8KLWdyYW1tYXIgKmdldGdyYW1tYXIoY2hhciAqZmlsZW5hbWUpOworZ3JhbW1hciAqZ2V0Z3JhbW1hcihjb25zdCBjaGFyICpmaWxlbmFtZSk7CiAKIHZvaWQgUHlfRXhpdChpbnQpIF9QeV9OT19SRVRVUk47CiAKQEAgLTM3LDYgKzM3LDE1IEBACiAgICAgZXhpdChzdHMpOwogfQogCisjaWZkZWYgV0lUSF9USFJFQUQKKy8qIE5lZWRlZCBieSBvYm1hbGxvYy5jICovCitpbnQgUHlHSUxTdGF0ZV9DaGVjayh2b2lkKQoreyByZXR1cm4gMTsgfQorI2VuZGlmCisKK3ZvaWQgX1B5TWVtX0R1bXBUcmFjZWJhY2soaW50IGZkLCBjb25zdCB2b2lkICpwdHIpCit7fQorCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewpAQCAtNzYsNyArODUsNyBAQAogfQogCiBncmFtbWFyICoKLWdldGdyYW1tYXIoY2hhciAqZmlsZW5hbWUpCitnZXRncmFtbWFyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewogICAgIEZJTEUgKmZwOwogICAgIG5vZGUgKm47CmRpZmYgLS1naXQgYS9QYXJzZXIvdG9rZW5pemVyLmMgYi9QYXJzZXIvdG9rZW5pemVyLmMKaW5kZXggMTg0ZmZlNy4uZDFlNWQzNSAxMDA2NDQKLS0tIGEvUGFyc2VyL3Rva2VuaXplci5jCisrKyBiL1BhcnNlci90b2tlbml6ZXIuYwpAQCAtMjAyLDggKzIwMiw4IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKgotZ2V0X25vcm1hbF9uYW1lKGNoYXIgKnMpICAgICAgICAvKiBmb3IgdXRmLTggYW5kIGxhdGluLTEgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2dldF9ub3JtYWxfbmFtZShjb25zdCBjaGFyICpzKSAgLyogZm9yIHV0Zi04IGFuZCBsYXRpbi0xICovCiB7CiAgICAgY2hhciBidWZbMTNdOwogICAgIGludCBpOwpAQCAtMjY0LDcgKzI2NCw3IEBACiAKICAgICAgICAgICAgIGlmIChiZWdpbiA8IHQpIHsKICAgICAgICAgICAgICAgICBjaGFyKiByID0gbmV3X3N0cmluZyhiZWdpbiwgdCAtIGJlZ2luLCB0b2spOwotICAgICAgICAgICAgICAgIGNoYXIqIHE7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcTsKICAgICAgICAgICAgICAgICBpZiAoIXIpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgIHEgPSBnZXRfbm9ybWFsX25hbWUocik7CkBAIC0xNDc1LDE3ICsxNDc1LDE5IEBACiAgICAgbm9uYXNjaWkgPSAwOwogICAgIGlmIChpc19wb3RlbnRpYWxfaWRlbnRpZmllcl9zdGFydChjKSkgewogICAgICAgICAvKiBQcm9jZXNzIGIiIiwgciIiLCB1IiIsIGJyIiIgYW5kIHJiIiIgKi8KLSAgICAgICAgaW50IHNhd19iID0gMCwgc2F3X3IgPSAwLCBzYXdfdSA9IDA7CisgICAgICAgIGludCBzYXdfYiA9IDAsIHNhd19yID0gMCwgc2F3X3UgPSAwLCBzYXdfZiA9IDA7CiAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBpZiAoIShzYXdfYiB8fCBzYXdfdSkgJiYgKGMgPT0gJ2InIHx8IGMgPT0gJ0InKSkKKyAgICAgICAgICAgIGlmICghKHNhd19iIHx8IHNhd191IHx8IHNhd19mKSAmJiAoYyA9PSAnYicgfHwgYyA9PSAnQicpKQogICAgICAgICAgICAgICAgIHNhd19iID0gMTsKICAgICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzdXBwb3J0IGxpdGVyYWwgd2UgZG9uJ3QKICAgICAgICAgICAgICAgIHdhbnQgdG8gc3VwcG9ydCBpdCBpbiBhcmJpdHJhcnkgb3JkZXIgbGlrZSBieXRlIGxpdGVyYWxzLiAqLwotICAgICAgICAgICAgZWxzZSBpZiAoIShzYXdfYiB8fCBzYXdfdSB8fCBzYXdfcikgJiYgKGMgPT0gJ3UnIHx8IGMgPT0gJ1UnKSkKKyAgICAgICAgICAgIGVsc2UgaWYgKCEoc2F3X2IgfHwgc2F3X3UgfHwgc2F3X3IgfHwgc2F3X2YpICYmIChjID09ICd1JyB8fCBjID09ICdVJykpCiAgICAgICAgICAgICAgICAgc2F3X3UgPSAxOwogICAgICAgICAgICAgLyogdXIiIiBhbmQgcnUiIiBhcmUgbm90IHN1cHBvcnRlZCAqLwogICAgICAgICAgICAgZWxzZSBpZiAoIShzYXdfciB8fCBzYXdfdSkgJiYgKGMgPT0gJ3InIHx8IGMgPT0gJ1InKSkKICAgICAgICAgICAgICAgICBzYXdfciA9IDE7CisgICAgICAgICAgICBlbHNlIGlmICghKHNhd19mIHx8IHNhd19iIHx8IHNhd191KSAmJiAoYyA9PSAnZicgfHwgYyA9PSAnRicpKQorICAgICAgICAgICAgICAgIHNhd19mID0gMTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKQEAgLTE1ODUsMTAgKzE1ODcsNiBAQAogICAgICAgICBpZiAoYyA9PSAnMCcpIHsKICAgICAgICAgICAgIC8qIEhleCwgb2N0YWwgb3IgYmluYXJ5IC0tIG1heWJlLiAqLwogICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOwotICAgICAgICAgICAgaWYgKGMgPT0gJy4nKQotICAgICAgICAgICAgICAgIGdvdG8gZnJhY3Rpb247Ci0gICAgICAgICAgICBpZiAoYyA9PSAnaicgfHwgYyA9PSAnSicpCi0gICAgICAgICAgICAgICAgZ290byBpbWFnaW5hcnk7CiAgICAgICAgICAgICBpZiAoYyA9PSAneCcgfHwgYyA9PSAnWCcpIHsKIAogICAgICAgICAgICAgICAgIC8qIEhleCAqLwpAQCAtMTczOSw3ICsxNzM3LDcgQEAKICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGVuZF9xdW90ZV9zaXplID0gMDsKICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXFwnKQotICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsgIC8qIHNraXAgZXNjYXBlZCBjaGFyICovCisgICAgICAgICAgICAgICAgICAgIHRva19uZXh0Yyh0b2spOyAgLyogc2tpcCBlc2NhcGVkIGNoYXIgKi8KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9Qcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYi5jIGIvUHJvZ3JhbXMvX2ZyZWV6ZV9pbXBvcnRsaWIuYwppbmRleCAwNzkzOTg0Li4xMDY5OTY2IDEwMDY0NAotLS0gYS9Qcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYi5jCisrKyBiL1Byb2dyYW1zL19mcmVlemVfaW1wb3J0bGliLmMKQEAgLTU4LDcgKzU4LDcgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjYW5ub3QgZnN0YXQgJyVzJ1xuIiwgaW5wYXRoKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9Ci0gICAgdGV4dF9zaXplID0gc3RhdHVzLnN0X3NpemU7CisgICAgdGV4dF9zaXplID0gKHNpemVfdClzdGF0dXMuc3Rfc2l6ZTsKICAgICB0ZXh0ID0gKGNoYXIgKikgbWFsbG9jKHRleHRfc2l6ZSArIDEpOwogICAgIGlmICh0ZXh0ID09IE5VTEwpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgYWxsb2NhdGUgJWxkIGJ5dGVzXG4iLCAobG9uZykgdGV4dF9zaXplKTsKZGlmZiAtLWdpdCBhL1Byb2dyYW1zL190ZXN0ZW1iZWQuYyBiL1Byb2dyYW1zL190ZXN0ZW1iZWQuYwppbmRleCBhYjZhOGM3Li4zOTY4Mzk5IDEwMDY0NAotLS0gYS9Qcm9ncmFtcy9fdGVzdGVtYmVkLmMKKysrIGIvUHJvZ3JhbXMvX3Rlc3RlbWJlZC5jCkBAIC00MSw3ICs0MSw3IEBACiAjZW5kaWYKICAgICBpbnQgaSwgajsKIAotICAgIGZvciAoaT0wOyBpPDM7IGkrKykgeworICAgIGZvciAoaT0wOyBpPDE1OyBpKyspIHsKICAgICAgICAgcHJpbnRmKCItLS0gUGFzcyAlZCAtLS1cbiIsIGkpOwogICAgICAgICBfdGVzdGVtYmVkX1B5X0luaXRpYWxpemUoKTsKICAgICAgICAgbWFpbnN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKZGlmZiAtLWdpdCBhL1Byb2dyYW1zL3B5dGhvbi5jIGIvUHJvZ3JhbXMvcHl0aG9uLmMKaW5kZXggMzdiMTBiOC4uYTdhZmJjNyAxMDA2NDQKLS0tIGEvUHJvZ3JhbXMvcHl0aG9uLmMKKysrIGIvUHJvZ3JhbXMvcHl0aG9uLmMKQEAgLTI0LDYgKzI0LDkgQEAKICAgICBpbnQgaSwgcmVzOwogICAgIGNoYXIgKm9sZGxvYzsKIAorICAgIC8qIEZvcmNlIG1hbGxvYygpIGFsbG9jYXRvciB0byBib290c3RyYXAgUHl0aG9uICovCisgICAgKHZvaWQpX1B5TWVtX1NldHVwQWxsb2NhdG9ycygibWFsbG9jIik7CisKICAgICBhcmd2X2NvcHkgPSAod2NoYXJfdCAqKilQeU1lbV9SYXdNYWxsb2Moc2l6ZW9mKHdjaGFyX3QqKSAqIChhcmdjKzEpKTsKICAgICBhcmd2X2NvcHkyID0gKHdjaGFyX3QgKiopUHlNZW1fUmF3TWFsbG9jKHNpemVvZih3Y2hhcl90KikgKiAoYXJnYysxKSk7CiAgICAgaWYgKCFhcmd2X2NvcHkgfHwgIWFyZ3ZfY29weTIpIHsKQEAgLTYyLDcgKzY1LDEzIEBACiAKICAgICBzZXRsb2NhbGUoTENfQUxMLCBvbGRsb2MpOwogICAgIFB5TWVtX1Jhd0ZyZWUob2xkbG9jKTsKKwogICAgIHJlcyA9IFB5X01haW4oYXJnYywgYXJndl9jb3B5KTsKKworICAgIC8qIEZvcmNlIGFnYWluIG1hbGxvYygpIGFsbG9jYXRvciB0byByZWxlYXNlIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkCisgICAgICAgYmVmb3JlIFB5X01haW4oKSAqLworICAgICh2b2lkKV9QeU1lbV9TZXR1cEFsbG9jYXRvcnMoIm1hbGxvYyIpOworCiAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBQeU1lbV9SYXdGcmVlKGFyZ3ZfY29weTJbaV0pOwogICAgIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9QeXRob24tYXN0LmMgYi9QeXRob24vUHl0aG9uLWFzdC5jCmluZGV4IGVkZmNiYWQuLmYxMGUzMTUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9QeXRob24tYXN0LmMKKysrIGIvUHl0aG9uL1B5dGhvbi1hc3QuYwpAQCAtODYsNiArODYsMTUgQEAKICAgICAib3AiLAogICAgICJ2YWx1ZSIsCiB9Oworc3RhdGljIFB5VHlwZU9iamVjdCAqQW5uQXNzaWduX3R5cGU7CitfUHlfSURFTlRJRklFUihhbm5vdGF0aW9uKTsKK19QeV9JREVOVElGSUVSKHNpbXBsZSk7CitzdGF0aWMgY2hhciAqQW5uQXNzaWduX2ZpZWxkc1tdPXsKKyAgICAidGFyZ2V0IiwKKyAgICAiYW5ub3RhdGlvbiIsCisgICAgInZhbHVlIiwKKyAgICAic2ltcGxlIiwKK307CiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpGb3JfdHlwZTsKIF9QeV9JREVOVElGSUVSKGl0ZXIpOwogX1B5X0lERU5USUZJRVIob3JlbHNlKTsKQEAgLTI4NSw2ICsyOTQsMTggQEAKIHN0YXRpYyBjaGFyICpTdHJfZmllbGRzW109ewogICAgICJzIiwKIH07CitzdGF0aWMgUHlUeXBlT2JqZWN0ICpGb3JtYXR0ZWRWYWx1ZV90eXBlOworX1B5X0lERU5USUZJRVIoY29udmVyc2lvbik7CitfUHlfSURFTlRJRklFUihmb3JtYXRfc3BlYyk7CitzdGF0aWMgY2hhciAqRm9ybWF0dGVkVmFsdWVfZmllbGRzW109eworICAgICJ2YWx1ZSIsCisgICAgImNvbnZlcnNpb24iLAorICAgICJmb3JtYXRfc3BlYyIsCit9Oworc3RhdGljIFB5VHlwZU9iamVjdCAqSm9pbmVkU3RyX3R5cGU7CitzdGF0aWMgY2hhciAqSm9pbmVkU3RyX2ZpZWxkc1tdPXsKKyAgICAidmFsdWVzIiwKK307CiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpCeXRlc190eXBlOwogc3RhdGljIGNoYXIgKkJ5dGVzX2ZpZWxkc1tdPXsKICAgICAicyIsCkBAIC0yOTQsNiArMzE1LDEwIEBACiAgICAgInZhbHVlIiwKIH07CiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpFbGxpcHNpc190eXBlOworc3RhdGljIFB5VHlwZU9iamVjdCAqQ29uc3RhbnRfdHlwZTsKK3N0YXRpYyBjaGFyICpDb25zdGFudF9maWVsZHNbXT17CisgICAgInZhbHVlIiwKK307CiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpBdHRyaWJ1dGVfdHlwZTsKIF9QeV9JREVOVElGSUVSKGF0dHIpOwogX1B5X0lERU5USUZJRVIoY3R4KTsKQEAgLTQxMCwxMCArNDM1LDEyIEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpjb21wcmVoZW5zaW9uX3R5cGU7CiBzdGF0aWMgUHlPYmplY3QqIGFzdDJvYmpfY29tcHJlaGVuc2lvbih2b2lkKik7CiBfUHlfSURFTlRJRklFUihpZnMpOworX1B5X0lERU5USUZJRVIoaXNfYXN5bmMpOwogc3RhdGljIGNoYXIgKmNvbXByZWhlbnNpb25fZmllbGRzW109ewogICAgICJ0YXJnZXQiLAogICAgICJpdGVyIiwKICAgICAiaWZzIiwKKyAgICAiaXNfYXN5bmMiLAogfTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgKmV4Y2VwdGhhbmRsZXJfdHlwZTsKIHN0YXRpYyBjaGFyICpleGNlcHRoYW5kbGVyX2F0dHJpYnV0ZXNbXSA9IHsKQEAgLTQ1MCw3ICs0NzcsNiBAQAogICAgICJjb2xfb2Zmc2V0IiwKIH07CiBfUHlfSURFTlRJRklFUihhcmcpOwotX1B5X0lERU5USUZJRVIoYW5ub3RhdGlvbik7CiBzdGF0aWMgY2hhciAqYXJnX2ZpZWxkc1tdPXsKICAgICAiYXJnIiwKICAgICAiYW5ub3RhdGlvbiIsCkBAIC02OTcsNiArNzIzLDcgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0KilvOwogfQogI2RlZmluZSBhc3Qyb2JqX3NpbmdsZXRvbiBhc3Qyb2JqX29iamVjdAorI2RlZmluZSBhc3Qyb2JqX2NvbnN0YW50IGFzdDJvYmpfb2JqZWN0CiAjZGVmaW5lIGFzdDJvYmpfaWRlbnRpZmllciBhc3Qyb2JqX29iamVjdAogI2RlZmluZSBhc3Qyb2JqX3N0cmluZyBhc3Qyb2JqX29iamVjdAogI2RlZmluZSBhc3Qyb2JqX2J5dGVzIGFzdDJvYmpfb2JqZWN0CkBAIC03MzQsNiArNzYxLDE5IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgb2JqMmFzdF9jb25zdGFudChQeU9iamVjdCogb2JqLCBQeU9iamVjdCoqIG91dCwgUHlBcmVuYSogYXJlbmEpCit7CisgICAgaWYgKG9iaikgeworICAgICAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChhcmVuYSwgb2JqKSA8IDApIHsKKyAgICAgICAgICAgICpvdXQgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgIH0KKyAgICAqb3V0ID0gb2JqOworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG9iajJhc3RfaWRlbnRpZmllcihQeU9iamVjdCogb2JqLCBQeU9iamVjdCoqIG91dCwgUHlBcmVuYSogYXJlbmEpCiB7CiAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChvYmopICYmIG9iaiAhPSBQeV9Ob25lKSB7CkBAIC03NjksNyArODA5LDcgQEAKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCi0gICAgaSA9IChpbnQpUHlMb25nX0FzTG9uZyhvYmopOworICAgIGkgPSBfUHlMb25nX0FzSW50KG9iaik7CiAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuIDE7CiAgICAgKm91dCA9IGk7CkBAIC04NDMsNiArODgzLDggQEAKICAgICBpZiAoIUFzc2lnbl90eXBlKSByZXR1cm4gMDsKICAgICBBdWdBc3NpZ25fdHlwZSA9IG1ha2VfdHlwZSgiQXVnQXNzaWduIiwgc3RtdF90eXBlLCBBdWdBc3NpZ25fZmllbGRzLCAzKTsKICAgICBpZiAoIUF1Z0Fzc2lnbl90eXBlKSByZXR1cm4gMDsKKyAgICBBbm5Bc3NpZ25fdHlwZSA9IG1ha2VfdHlwZSgiQW5uQXNzaWduIiwgc3RtdF90eXBlLCBBbm5Bc3NpZ25fZmllbGRzLCA0KTsKKyAgICBpZiAoIUFubkFzc2lnbl90eXBlKSByZXR1cm4gMDsKICAgICBGb3JfdHlwZSA9IG1ha2VfdHlwZSgiRm9yIiwgc3RtdF90eXBlLCBGb3JfZmllbGRzLCA0KTsKICAgICBpZiAoIUZvcl90eXBlKSByZXR1cm4gMDsKICAgICBBc3luY0Zvcl90eXBlID0gbWFrZV90eXBlKCJBc3luY0ZvciIsIHN0bXRfdHlwZSwgQXN5bmNGb3JfZmllbGRzLCA0KTsKQEAgLTkxNyw2ICs5NTksMTEgQEAKICAgICBpZiAoIU51bV90eXBlKSByZXR1cm4gMDsKICAgICBTdHJfdHlwZSA9IG1ha2VfdHlwZSgiU3RyIiwgZXhwcl90eXBlLCBTdHJfZmllbGRzLCAxKTsKICAgICBpZiAoIVN0cl90eXBlKSByZXR1cm4gMDsKKyAgICBGb3JtYXR0ZWRWYWx1ZV90eXBlID0gbWFrZV90eXBlKCJGb3JtYXR0ZWRWYWx1ZSIsIGV4cHJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdHRlZFZhbHVlX2ZpZWxkcywgMyk7CisgICAgaWYgKCFGb3JtYXR0ZWRWYWx1ZV90eXBlKSByZXR1cm4gMDsKKyAgICBKb2luZWRTdHJfdHlwZSA9IG1ha2VfdHlwZSgiSm9pbmVkU3RyIiwgZXhwcl90eXBlLCBKb2luZWRTdHJfZmllbGRzLCAxKTsKKyAgICBpZiAoIUpvaW5lZFN0cl90eXBlKSByZXR1cm4gMDsKICAgICBCeXRlc190eXBlID0gbWFrZV90eXBlKCJCeXRlcyIsIGV4cHJfdHlwZSwgQnl0ZXNfZmllbGRzLCAxKTsKICAgICBpZiAoIUJ5dGVzX3R5cGUpIHJldHVybiAwOwogICAgIE5hbWVDb25zdGFudF90eXBlID0gbWFrZV90eXBlKCJOYW1lQ29uc3RhbnQiLCBleHByX3R5cGUsCkBAIC05MjQsNiArOTcxLDggQEAKICAgICBpZiAoIU5hbWVDb25zdGFudF90eXBlKSByZXR1cm4gMDsKICAgICBFbGxpcHNpc190eXBlID0gbWFrZV90eXBlKCJFbGxpcHNpcyIsIGV4cHJfdHlwZSwgTlVMTCwgMCk7CiAgICAgaWYgKCFFbGxpcHNpc190eXBlKSByZXR1cm4gMDsKKyAgICBDb25zdGFudF90eXBlID0gbWFrZV90eXBlKCJDb25zdGFudCIsIGV4cHJfdHlwZSwgQ29uc3RhbnRfZmllbGRzLCAxKTsKKyAgICBpZiAoIUNvbnN0YW50X3R5cGUpIHJldHVybiAwOwogICAgIEF0dHJpYnV0ZV90eXBlID0gbWFrZV90eXBlKCJBdHRyaWJ1dGUiLCBleHByX3R5cGUsIEF0dHJpYnV0ZV9maWVsZHMsIDMpOwogICAgIGlmICghQXR0cmlidXRlX3R5cGUpIHJldHVybiAwOwogICAgIFN1YnNjcmlwdF90eXBlID0gbWFrZV90eXBlKCJTdWJzY3JpcHQiLCBleHByX3R5cGUsIFN1YnNjcmlwdF9maWVsZHMsIDMpOwpAQCAtMTEwMSw3ICsxMTUwLDcgQEAKICAgICBOb3RJbl9zaW5nbGV0b24gPSBQeVR5cGVfR2VuZXJpY05ldyhOb3RJbl90eXBlLCBOVUxMLCBOVUxMKTsKICAgICBpZiAoIU5vdEluX3NpbmdsZXRvbikgcmV0dXJuIDA7CiAgICAgY29tcHJlaGVuc2lvbl90eXBlID0gbWFrZV90eXBlKCJjb21wcmVoZW5zaW9uIiwgJkFTVF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVoZW5zaW9uX2ZpZWxkcywgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZWhlbnNpb25fZmllbGRzLCA0KTsKICAgICBpZiAoIWNvbXByZWhlbnNpb25fdHlwZSkgcmV0dXJuIDA7CiAgICAgaWYgKCFhZGRfYXR0cmlidXRlcyhjb21wcmVoZW5zaW9uX3R5cGUsIE5VTEwsIDApKSByZXR1cm4gMDsKICAgICBleGNlcHRoYW5kbGVyX3R5cGUgPSBtYWtlX3R5cGUoImV4Y2VwdGhhbmRsZXIiLCAmQVNUX3R5cGUsIE5VTEwsIDApOwpAQCAtMTM3MCw2ICsxNDE5LDM0IEBACiB9CiAKIHN0bXRfdHkKK0FubkFzc2lnbihleHByX3R5IHRhcmdldCwgZXhwcl90eSBhbm5vdGF0aW9uLCBleHByX3R5IHZhbHVlLCBpbnQgc2ltcGxlLCBpbnQKKyAgICAgICAgICBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSkKK3sKKyAgICBzdG10X3R5IHA7CisgICAgaWYgKCF0YXJnZXQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGQgdGFyZ2V0IGlzIHJlcXVpcmVkIGZvciBBbm5Bc3NpZ24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghYW5ub3RhdGlvbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZCBhbm5vdGF0aW9uIGlzIHJlcXVpcmVkIGZvciBBbm5Bc3NpZ24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHAgPSAoc3RtdF90eSlQeUFyZW5hX01hbGxvYyhhcmVuYSwgc2l6ZW9mKCpwKSk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT5raW5kID0gQW5uQXNzaWduX2tpbmQ7CisgICAgcC0+di5Bbm5Bc3NpZ24udGFyZ2V0ID0gdGFyZ2V0OworICAgIHAtPnYuQW5uQXNzaWduLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOworICAgIHAtPnYuQW5uQXNzaWduLnZhbHVlID0gdmFsdWU7CisgICAgcC0+di5Bbm5Bc3NpZ24uc2ltcGxlID0gc2ltcGxlOworICAgIHAtPmxpbmVubyA9IGxpbmVubzsKKyAgICBwLT5jb2xfb2Zmc2V0ID0gY29sX29mZnNldDsKKyAgICByZXR1cm4gcDsKK30KKworc3RtdF90eQogRm9yKGV4cHJfdHkgdGFyZ2V0LCBleHByX3R5IGl0ZXIsIGFzZGxfc2VxICogYm9keSwgYXNkbF9zZXEgKiBvcmVsc2UsIGludAogICAgIGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQogewpAQCAtMjA2Myw2ICsyMTQwLDQyIEBACiB9CiAKIGV4cHJfdHkKK0Zvcm1hdHRlZFZhbHVlKGV4cHJfdHkgdmFsdWUsIGludCBjb252ZXJzaW9uLCBleHByX3R5IGZvcm1hdF9zcGVjLCBpbnQgbGluZW5vLAorICAgICAgICAgICAgICAgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGV4cHJfdHkgcDsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkIHZhbHVlIGlzIHJlcXVpcmVkIGZvciBGb3JtYXR0ZWRWYWx1ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcCA9IChleHByX3R5KVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBzaXplb2YoKnApKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPmtpbmQgPSBGb3JtYXR0ZWRWYWx1ZV9raW5kOworICAgIHAtPnYuRm9ybWF0dGVkVmFsdWUudmFsdWUgPSB2YWx1ZTsKKyAgICBwLT52LkZvcm1hdHRlZFZhbHVlLmNvbnZlcnNpb24gPSBjb252ZXJzaW9uOworICAgIHAtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMgPSBmb3JtYXRfc3BlYzsKKyAgICBwLT5saW5lbm8gPSBsaW5lbm87CisgICAgcC0+Y29sX29mZnNldCA9IGNvbF9vZmZzZXQ7CisgICAgcmV0dXJuIHA7Cit9CisKK2V4cHJfdHkKK0pvaW5lZFN0cihhc2RsX3NlcSAqIHZhbHVlcywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGV4cHJfdHkgcDsKKyAgICBwID0gKGV4cHJfdHkpUHlBcmVuYV9NYWxsb2MoYXJlbmEsIHNpemVvZigqcCkpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcC0+a2luZCA9IEpvaW5lZFN0cl9raW5kOworICAgIHAtPnYuSm9pbmVkU3RyLnZhbHVlcyA9IHZhbHVlczsKKyAgICBwLT5saW5lbm8gPSBsaW5lbm87CisgICAgcC0+Y29sX29mZnNldCA9IGNvbF9vZmZzZXQ7CisgICAgcmV0dXJuIHA7Cit9CisKK2V4cHJfdHkKIEJ5dGVzKGJ5dGVzIHMsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSkKIHsKICAgICBleHByX3R5IHA7CkBAIC0yMTE0LDYgKzIyMjcsMjUgQEAKIH0KIAogZXhwcl90eQorQ29uc3RhbnQoY29uc3RhbnQgdmFsdWUsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSkKK3sKKyAgICBleHByX3R5IHA7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgQ29uc3RhbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHAgPSAoZXhwcl90eSlQeUFyZW5hX01hbGxvYyhhcmVuYSwgc2l6ZW9mKCpwKSk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT5raW5kID0gQ29uc3RhbnRfa2luZDsKKyAgICBwLT52LkNvbnN0YW50LnZhbHVlID0gdmFsdWU7CisgICAgcC0+bGluZW5vID0gbGluZW5vOworICAgIHAtPmNvbF9vZmZzZXQgPSBjb2xfb2Zmc2V0OworICAgIHJldHVybiBwOworfQorCitleHByX3R5CiBBdHRyaWJ1dGUoZXhwcl90eSB2YWx1ZSwgaWRlbnRpZmllciBhdHRyLCBleHByX2NvbnRleHRfdHkgY3R4LCBpbnQgbGluZW5vLCBpbnQKICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSkKIHsKQEAgLTIzMTUsNyArMjQ0Nyw4IEBACiB9CiAKIGNvbXByZWhlbnNpb25fdHkKLWNvbXByZWhlbnNpb24oZXhwcl90eSB0YXJnZXQsIGV4cHJfdHkgaXRlciwgYXNkbF9zZXEgKiBpZnMsIFB5QXJlbmEgKmFyZW5hKQorY29tcHJlaGVuc2lvbihleHByX3R5IHRhcmdldCwgZXhwcl90eSBpdGVyLCBhc2RsX3NlcSAqIGlmcywgaW50IGlzX2FzeW5jLAorICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSkKIHsKICAgICBjb21wcmVoZW5zaW9uX3R5IHA7CiAgICAgaWYgKCF0YXJnZXQpIHsKQEAgLTIzMzQsNiArMjQ2Nyw3IEBACiAgICAgcC0+dGFyZ2V0ID0gdGFyZ2V0OwogICAgIHAtPml0ZXIgPSBpdGVyOwogICAgIHAtPmlmcyA9IGlmczsKKyAgICBwLT5pc19hc3luYyA9IGlzX2FzeW5jOwogICAgIHJldHVybiBwOwogfQogCkBAIC0yNjQ4LDYgKzI3ODIsMzAgQEAKICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwogICAgICAgICBQeV9ERUNSRUYodmFsdWUpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFubkFzc2lnbl9raW5kOgorICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhBbm5Bc3NpZ25fdHlwZSwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2V4cHIoby0+di5Bbm5Bc3NpZ24udGFyZ2V0KTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChfUHlPYmplY3RfU2V0QXR0cklkKHJlc3VsdCwgJlB5SWRfdGFyZ2V0LCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2V4cHIoby0+di5Bbm5Bc3NpZ24uYW5ub3RhdGlvbik7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX2Fubm90YXRpb24sIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfZXhwcihvLT52LkFubkFzc2lnbi52YWx1ZSk7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX3ZhbHVlLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2ludChvLT52LkFubkFzc2lnbi5zaW1wbGUpOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQocmVzdWx0LCAmUHlJZF9zaW1wbGUsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBicmVhazsKICAgICBjYXNlIEZvcl9raW5kOgogICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhGb3JfdHlwZSwgTlVMTCwgTlVMTCk7CiAgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKQEAgLTMxNjQsNiArMzMyMiwzNCBAQAogICAgICAgICAgICAgZ290byBmYWlsZWQ7CiAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgRm9ybWF0dGVkVmFsdWVfa2luZDoKKyAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoRm9ybWF0dGVkVmFsdWVfdHlwZSwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2V4cHIoby0+di5Gb3JtYXR0ZWRWYWx1ZS52YWx1ZSk7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX3ZhbHVlLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2ludChvLT52LkZvcm1hdHRlZFZhbHVlLmNvbnZlcnNpb24pOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQocmVzdWx0LCAmUHlJZF9jb252ZXJzaW9uLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2V4cHIoby0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYyk7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX2Zvcm1hdF9zcGVjLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKb2luZWRTdHJfa2luZDoKKyAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoSm9pbmVkU3RyX3R5cGUsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoIXJlc3VsdCkgZ290byBmYWlsZWQ7CisgICAgICAgIHZhbHVlID0gYXN0Mm9ial9saXN0KG8tPnYuSm9pbmVkU3RyLnZhbHVlcywgYXN0Mm9ial9leHByKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChfUHlPYmplY3RfU2V0QXR0cklkKHJlc3VsdCwgJlB5SWRfdmFsdWVzLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBCeXRlc19raW5kOgogICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhCeXRlc190eXBlLCBOVUxMLCBOVUxMKTsKICAgICAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZmFpbGVkOwpAQCAtMzE4Niw2ICszMzcyLDE1IEBACiAgICAgICAgIHJlc3VsdCA9IFB5VHlwZV9HZW5lcmljTmV3KEVsbGlwc2lzX3R5cGUsIE5VTEwsIE5VTEwpOwogICAgICAgICBpZiAoIXJlc3VsdCkgZ290byBmYWlsZWQ7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29uc3RhbnRfa2luZDoKKyAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoQ29uc3RhbnRfdHlwZSwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2NvbnN0YW50KG8tPnYuQ29uc3RhbnQudmFsdWUpOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQocmVzdWx0LCAmUHlJZF92YWx1ZSwgdmFsdWUpID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQXR0cmlidXRlX2tpbmQ6CiAgICAgICAgIHJlc3VsdCA9IFB5VHlwZV9HZW5lcmljTmV3KEF0dHJpYnV0ZV90eXBlLCBOVUxMLCBOVUxMKTsKICAgICAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZmFpbGVkOwpAQCAtMzUzMSw2ICszNzI2LDExIEBACiAgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQocmVzdWx0LCAmUHlJZF9pZnMsIHZhbHVlKSA9PSAtMSkKICAgICAgICAgZ290byBmYWlsZWQ7CiAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICB2YWx1ZSA9IGFzdDJvYmpfaW50KG8tPmlzX2FzeW5jKTsKKyAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX2lzX2FzeW5jLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIGZhaWxlZDoKICAgICBQeV9YREVDUkVGKHZhbHVlKTsKQEAgLTQ0MDYsNiArNDYwNiw2NCBAQAogICAgICAgICBpZiAoKm91dCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIGlzaW5zdGFuY2UgPSBQeU9iamVjdF9Jc0luc3RhbmNlKG9iaiwgKFB5T2JqZWN0KilBbm5Bc3NpZ25fdHlwZSk7CisgICAgaWYgKGlzaW5zdGFuY2UgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChpc2luc3RhbmNlKSB7CisgICAgICAgIGV4cHJfdHkgdGFyZ2V0OworICAgICAgICBleHByX3R5IGFubm90YXRpb247CisgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgIGludCBzaW1wbGU7CisKKyAgICAgICAgaWYgKF9QeU9iamVjdF9IYXNBdHRySWQob2JqLCAmUHlJZF90YXJnZXQpKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX3RhcmdldCk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9leHByKHRtcCwgJnRhcmdldCwgYXJlbmEpOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVxdWlyZWQgZmllbGQgXCJ0YXJnZXRcIiBtaXNzaW5nIGZyb20gQW5uQXNzaWduIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX1B5T2JqZWN0X0hhc0F0dHJJZChvYmosICZQeUlkX2Fubm90YXRpb24pKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX2Fubm90YXRpb24pOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIHJlcyA9IG9iajJhc3RfZXhwcih0bXAsICZhbm5vdGF0aW9uLCBhcmVuYSk7CisgICAgICAgICAgICBpZiAocmVzICE9IDApIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIodG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZXF1aXJlZCBmaWVsZCBcImFubm90YXRpb25cIiBtaXNzaW5nIGZyb20gQW5uQXNzaWduIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhpc3RzX25vdF9ub25lKG9iaiwgJlB5SWRfdmFsdWUpKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX3ZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICByZXMgPSBvYmoyYXN0X2V4cHIodG1wLCAmdmFsdWUsIGFyZW5hKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBQeV9DTEVBUih0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChfUHlPYmplY3RfSGFzQXR0cklkKG9iaiwgJlB5SWRfc2ltcGxlKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9HZXRBdHRySWQob2JqLCAmUHlJZF9zaW1wbGUpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIHJlcyA9IG9iajJhc3RfaW50KHRtcCwgJnNpbXBsZSwgYXJlbmEpOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVxdWlyZWQgZmllbGQgXCJzaW1wbGVcIiBtaXNzaW5nIGZyb20gQW5uQXNzaWduIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gQW5uQXNzaWduKHRhcmdldCwgYW5ub3RhdGlvbiwgdmFsdWUsIHNpbXBsZSwgbGluZW5vLCBjb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZW5hKTsKKyAgICAgICAgaWYgKCpvdXQgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBpc2luc3RhbmNlID0gUHlPYmplY3RfSXNJbnN0YW5jZShvYmosIChQeU9iamVjdCopRm9yX3R5cGUpOwogICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CiAgICAgICAgIHJldHVybiAxOwpAQCAtNjAyNSw2ICs2MjgzLDg2IEBACiAgICAgICAgIGlmICgqb3V0ID09IE5VTEwpIGdvdG8gZmFpbGVkOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgaXNpbnN0YW5jZSA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uob2JqLCAoUHlPYmplY3QqKUZvcm1hdHRlZFZhbHVlX3R5cGUpOworICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoaXNpbnN0YW5jZSkgeworICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICBpbnQgY29udmVyc2lvbjsKKyAgICAgICAgZXhwcl90eSBmb3JtYXRfc3BlYzsKKworICAgICAgICBpZiAoX1B5T2JqZWN0X0hhc0F0dHJJZChvYmosICZQeUlkX3ZhbHVlKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9HZXRBdHRySWQob2JqLCAmUHlJZF92YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9leHByKHRtcCwgJnZhbHVlLCBhcmVuYSk7CisgICAgICAgICAgICBpZiAocmVzICE9IDApIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIodG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZXF1aXJlZCBmaWVsZCBcInZhbHVlXCIgbWlzc2luZyBmcm9tIEZvcm1hdHRlZFZhbHVlIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhpc3RzX25vdF9ub25lKG9iaiwgJlB5SWRfY29udmVyc2lvbikpIHsKKyAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICB0bXAgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfY29udmVyc2lvbik7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9pbnQodG1wLCAmY29udmVyc2lvbiwgYXJlbmEpOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb252ZXJzaW9uID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhpc3RzX25vdF9ub25lKG9iaiwgJlB5SWRfZm9ybWF0X3NwZWMpKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX2Zvcm1hdF9zcGVjKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICByZXMgPSBvYmoyYXN0X2V4cHIodG1wLCAmZm9ybWF0X3NwZWMsIGFyZW5hKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBQeV9DTEVBUih0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9ybWF0X3NwZWMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgICpvdXQgPSBGb3JtYXR0ZWRWYWx1ZSh2YWx1ZSwgY29udmVyc2lvbiwgZm9ybWF0X3NwZWMsIGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIGFyZW5hKTsKKyAgICAgICAgaWYgKCpvdXQgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpc2luc3RhbmNlID0gUHlPYmplY3RfSXNJbnN0YW5jZShvYmosIChQeU9iamVjdCopSm9pbmVkU3RyX3R5cGUpOworICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoaXNpbnN0YW5jZSkgeworICAgICAgICBhc2RsX3NlcSogdmFsdWVzOworCisgICAgICAgIGlmIChfUHlPYmplY3RfSGFzQXR0cklkKG9iaiwgJlB5SWRfdmFsdWVzKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuOworICAgICAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX3ZhbHVlcyk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgaWYgKCFQeUxpc3RfQ2hlY2sodG1wKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJKb2luZWRTdHIgZmllbGQgXCJ2YWx1ZXNcIiBtdXN0IGJlIGEgbGlzdCwgbm90IGEgJS4yMDBzIiwgdG1wLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbiA9IFB5TGlzdF9HRVRfU0laRSh0bXApOworICAgICAgICAgICAgdmFsdWVzID0gX1B5X2FzZGxfc2VxX25ldyhsZW4sIGFyZW5hKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgICAgIHJlcyA9IG9iajJhc3RfZXhwcihQeUxpc3RfR0VUX0lURU0odG1wLCBpKSwgJnZhbHVlLCBhcmVuYSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQodmFsdWVzLCBpLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9DTEVBUih0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlcXVpcmVkIGZpZWxkIFwidmFsdWVzXCIgbWlzc2luZyBmcm9tIEpvaW5lZFN0ciIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgKm91dCA9IEpvaW5lZFN0cih2YWx1ZXMsIGxpbmVubywgY29sX29mZnNldCwgYXJlbmEpOworICAgICAgICBpZiAoKm91dCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIGlzaW5zdGFuY2UgPSBQeU9iamVjdF9Jc0luc3RhbmNlKG9iaiwgKFB5T2JqZWN0KilCeXRlc190eXBlKTsKICAgICBpZiAoaXNpbnN0YW5jZSA9PSAtMSkgewogICAgICAgICByZXR1cm4gMTsKQEAgLTYwNzksNiArNjQxNywyOCBAQAogICAgICAgICBpZiAoKm91dCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIGlzaW5zdGFuY2UgPSBQeU9iamVjdF9Jc0luc3RhbmNlKG9iaiwgKFB5T2JqZWN0KilDb25zdGFudF90eXBlKTsKKyAgICBpZiAoaXNpbnN0YW5jZSA9PSAtMSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGlzaW5zdGFuY2UpIHsKKyAgICAgICAgY29uc3RhbnQgdmFsdWU7CisKKyAgICAgICAgaWYgKF9QeU9iamVjdF9IYXNBdHRySWQob2JqLCAmUHlJZF92YWx1ZSkpIHsKKyAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICB0bXAgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfdmFsdWUpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIHJlcyA9IG9iajJhc3RfY29uc3RhbnQodG1wLCAmdmFsdWUsIGFyZW5hKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBQeV9DTEVBUih0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlcXVpcmVkIGZpZWxkIFwidmFsdWVcIiBtaXNzaW5nIGZyb20gQ29uc3RhbnQiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgICpvdXQgPSBDb25zdGFudCh2YWx1ZSwgbGluZW5vLCBjb2xfb2Zmc2V0LCBhcmVuYSk7CisgICAgICAgIGlmICgqb3V0ID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgaXNpbnN0YW5jZSA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uob2JqLCAoUHlPYmplY3QqKUF0dHJpYnV0ZV90eXBlKTsKICAgICBpZiAoaXNpbnN0YW5jZSA9PSAtMSkgewogICAgICAgICByZXR1cm4gMTsKQEAgLTY3OTUsNiArNzE1NSw3IEBACiAgICAgZXhwcl90eSB0YXJnZXQ7CiAgICAgZXhwcl90eSBpdGVyOwogICAgIGFzZGxfc2VxKiBpZnM7CisgICAgaW50IGlzX2FzeW5jOwogCiAgICAgaWYgKF9QeU9iamVjdF9IYXNBdHRySWQob2JqLCAmUHlJZF90YXJnZXQpKSB7CiAgICAgICAgIGludCByZXM7CkBAIC02ODQyLDcgKzcyMDMsMTggQEAKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlcXVpcmVkIGZpZWxkIFwiaWZzXCIgbWlzc2luZyBmcm9tIGNvbXByZWhlbnNpb24iKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgICpvdXQgPSBjb21wcmVoZW5zaW9uKHRhcmdldCwgaXRlciwgaWZzLCBhcmVuYSk7CisgICAgaWYgKF9QeU9iamVjdF9IYXNBdHRySWQob2JqLCAmUHlJZF9pc19hc3luYykpIHsKKyAgICAgICAgaW50IHJlczsKKyAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX2lzX2FzeW5jKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgcmVzID0gb2JqMmFzdF9pbnQodG1wLCAmaXNfYXN5bmMsIGFyZW5hKTsKKyAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfQ0xFQVIodG1wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVxdWlyZWQgZmllbGQgXCJpc19hc3luY1wiIG1pc3NpbmcgZnJvbSBjb21wcmVoZW5zaW9uIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAqb3V0ID0gY29tcHJlaGVuc2lvbih0YXJnZXQsIGl0ZXIsIGlmcywgaXNfYXN5bmMsIGFyZW5hKTsKICAgICByZXR1cm4gMDsKIGZhaWxlZDoKICAgICBQeV9YREVDUkVGKHRtcCk7CkBAIC03Mjg2LDYgKzc2NTgsOCBAQAogICAgICAgICBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXVnQXNzaWduIiwgKFB5T2JqZWN0KilBdWdBc3NpZ25fdHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFubkFzc2lnbiIsIChQeU9iamVjdCopQW5uQXNzaWduX3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGb3IiLCAoUHlPYmplY3QqKUZvcl90eXBlKSA8IDApIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXN5bmNGb3IiLCAoUHlPYmplY3QqKUFzeW5jRm9yX3R5cGUpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC03MzQ2LDEyICs3NzIwLDE4IEBACiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDYWxsIiwgKFB5T2JqZWN0KilDYWxsX3R5cGUpIDwgMCkgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOdW0iLCAoUHlPYmplY3QqKU51bV90eXBlKSA8IDApIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU3RyIiwgKFB5T2JqZWN0KilTdHJfdHlwZSkgPCAwKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZvcm1hdHRlZFZhbHVlIiwKKyAgICAgICAgKFB5T2JqZWN0KilGb3JtYXR0ZWRWYWx1ZV90eXBlKSA8IDApIHJldHVybiBOVUxMOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSm9pbmVkU3RyIiwgKFB5T2JqZWN0KilKb2luZWRTdHJfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJ5dGVzIiwgKFB5T2JqZWN0KilCeXRlc190eXBlKSA8IDApIHJldHVybgogICAgICAgICBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTmFtZUNvbnN0YW50IiwgKFB5T2JqZWN0KilOYW1lQ29uc3RhbnRfdHlwZSkgPAogICAgICAgICAwKSByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVsbGlwc2lzIiwgKFB5T2JqZWN0KilFbGxpcHNpc190eXBlKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ29uc3RhbnQiLCAoUHlPYmplY3QqKUNvbnN0YW50X3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBdHRyaWJ1dGUiLCAoUHlPYmplY3QqKUF0dHJpYnV0ZV90eXBlKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU3Vic2NyaXB0IiwgKFB5T2JqZWN0KilTdWJzY3JpcHRfdHlwZSkgPCAwKQpkaWZmIC0tZ2l0IGEvUHl0aG9uL193YXJuaW5ncy5jIGIvUHl0aG9uL193YXJuaW5ncy5jCmluZGV4IDk3OGJhZDEuLjQwZjVjOGUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9fd2FybmluZ3MuYworKysgYi9QeXRob24vX3dhcm5pbmdzLmMKQEAgLTQwLDEyICs0MCwxMSBAQAogICAgQSBOVUxMIHJldHVybiB2YWx1ZSBjYW4gbWVhbiBmYWxzZSBvciBhbiBlcnJvci4KICovCiBzdGF0aWMgUHlPYmplY3QgKgotZ2V0X3dhcm5pbmdzX2F0dHIoY29uc3QgY2hhciAqYXR0cikKK2dldF93YXJuaW5nc19hdHRyKGNvbnN0IGNoYXIgKmF0dHIsIGludCB0cnlfaW1wb3J0KQogewogICAgIHN0YXRpYyBQeU9iamVjdCAqd2FybmluZ3Nfc3RyID0gTlVMTDsKICAgICBQeU9iamVjdCAqYWxsX21vZHVsZXM7Ci0gICAgUHlPYmplY3QgKndhcm5pbmdzX21vZHVsZTsKLSAgICBpbnQgcmVzdWx0OworICAgIFB5T2JqZWN0ICp3YXJuaW5nc19tb2R1bGUsICpvYmo7CiAKICAgICBpZiAod2FybmluZ3Nfc3RyID09IE5VTEwpIHsKICAgICAgICAgd2FybmluZ3Nfc3RyID0gUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcoIndhcm5pbmdzIik7CkBAIC01MywxNSArNTIsMzQgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGFsbF9tb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOwotICAgIHJlc3VsdCA9IFB5RGljdF9Db250YWlucyhhbGxfbW9kdWxlcywgd2FybmluZ3Nfc3RyKTsKLSAgICBpZiAocmVzdWx0ID09IC0xIHx8IHJlc3VsdCA9PSAwKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHdhcm5pbmdzX21vZHVsZSA9IFB5RGljdF9HZXRJdGVtKGFsbF9tb2R1bGVzLCB3YXJuaW5nc19zdHIpOwotICAgIGlmICghUHlPYmplY3RfSGFzQXR0clN0cmluZyh3YXJuaW5nc19tb2R1bGUsIGF0dHIpKQorICAgIC8qIGRvbid0IHRyeSB0byBpbXBvcnQgYWZ0ZXIgdGhlIHN0YXJ0IG9mIHRoZSBQeXRob24gZmluYWxsaXphdGlvbiAqLworICAgIGlmICh0cnlfaW1wb3J0ICYmIF9QeV9GaW5hbGl6aW5nID09IE5VTEwpIHsKKyAgICAgICAgd2FybmluZ3NfbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0KHdhcm5pbmdzX3N0cik7CisgICAgICAgIGlmICh3YXJuaW5nc19tb2R1bGUgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogRmFsbGJhY2sgdG8gdGhlIEMgaW1wbGVtZW50YXRpb24gaWYgd2UgY2Fubm90IGdldAorICAgICAgICAgICAgICAgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiAqLworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHdhcm5pbmdzX21vZHVsZSwgYXR0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsbF9tb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOworCisgICAgICAgIHdhcm5pbmdzX21vZHVsZSA9IFB5RGljdF9HZXRJdGVtKGFsbF9tb2R1bGVzLCB3YXJuaW5nc19zdHIpOworICAgICAgICBpZiAod2FybmluZ3NfbW9kdWxlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBQeV9JTkNSRUYod2FybmluZ3NfbW9kdWxlKTsKKyAgICB9CisKKyAgICBpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcod2FybmluZ3NfbW9kdWxlLCBhdHRyKSkgeworICAgICAgICBQeV9ERUNSRUYod2FybmluZ3NfbW9kdWxlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgb2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh3YXJuaW5nc19tb2R1bGUsIGF0dHIpOworICAgIFB5X0RFQ1JFRih3YXJuaW5nc19tb2R1bGUpOworICAgIHJldHVybiBvYmo7CiB9CiAKIApAQCAtNzAsNyArODgsNyBAQAogewogICAgIFB5T2JqZWN0ICpyZWdpc3RyeTsKIAotICAgIHJlZ2lzdHJ5ID0gZ2V0X3dhcm5pbmdzX2F0dHIoIm9uY2VyZWdpc3RyeSIpOworICAgIHJlZ2lzdHJ5ID0gZ2V0X3dhcm5pbmdzX2F0dHIoIm9uY2VyZWdpc3RyeSIsIDApOwogICAgIGlmIChyZWdpc3RyeSA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC04Nyw3ICsxMDUsNyBAQAogewogICAgIFB5T2JqZWN0ICpkZWZhdWx0X2FjdGlvbjsKIAotICAgIGRlZmF1bHRfYWN0aW9uID0gZ2V0X3dhcm5pbmdzX2F0dHIoImRlZmF1bHRhY3Rpb24iKTsKKyAgICBkZWZhdWx0X2FjdGlvbiA9IGdldF93YXJuaW5nc19hdHRyKCJkZWZhdWx0YWN0aW9uIiwgMCk7CiAgICAgaWYgKGRlZmF1bHRfYWN0aW9uID09IE5VTEwpIHsKICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTEwLDcgKzEyOCw3IEBACiAgICAgUHlfc3NpemVfdCBpOwogICAgIFB5T2JqZWN0ICp3YXJuaW5nc19maWx0ZXJzOwogCi0gICAgd2FybmluZ3NfZmlsdGVycyA9IGdldF93YXJuaW5nc19hdHRyKCJmaWx0ZXJzIik7CisgICAgd2FybmluZ3NfZmlsdGVycyA9IGdldF93YXJuaW5nc19hdHRyKCJmaWx0ZXJzIiwgMCk7CiAgICAgaWYgKHdhcm5pbmdzX2ZpbHRlcnMgPT0gTlVMTCkgewogICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjg3LDggKzMwNSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1zaG93X3dhcm5pbmcoUHlPYmplY3QgKmZpbGVuYW1lLCBpbnQgbGluZW5vLCBQeU9iamVjdCAqdGV4dCwgUHlPYmplY3QKLSAgICAgICAgICAgICAgICAqY2F0ZWdvcnksIFB5T2JqZWN0ICpzb3VyY2VsaW5lKQorc2hvd193YXJuaW5nKFB5T2JqZWN0ICpmaWxlbmFtZSwgaW50IGxpbmVubywgUHlPYmplY3QgKnRleHQsCisgICAgICAgICAgICAgUHlPYmplY3QgKmNhdGVnb3J5LCBQeU9iamVjdCAqc291cmNlbGluZSkKIHsKICAgICBQeU9iamVjdCAqZl9zdGRlcnI7CiAgICAgUHlPYmplY3QgKm5hbWU7CkBAIC0zNTksMTAgKzM3Nyw2NCBAQAogICAgIFB5RXJyX0NsZWFyKCk7CiB9CiAKK3N0YXRpYyBpbnQKK2NhbGxfc2hvd193YXJuaW5nKFB5T2JqZWN0ICpjYXRlZ29yeSwgUHlPYmplY3QgKnRleHQsIFB5T2JqZWN0ICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZpbGVuYW1lLCBpbnQgbGluZW5vLCBQeU9iamVjdCAqbGluZW5vX29iaiwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzb3VyY2VsaW5lLCBQeU9iamVjdCAqc291cmNlKQoreworICAgIFB5T2JqZWN0ICpzaG93X2ZuLCAqbXNnLCAqcmVzLCAqd2Fybm1zZ19jbHMgPSBOVUxMOworCisgICAgLyogSWYgdGhlIHNvdXJjZSBwYXJhbWV0ZXIgaXMgc2V0LCB0cnkgdG8gZ2V0IHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24uCisgICAgICAgVGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBpcyBhYmxlIHRvIGxvZyB0aGUgdHJhY2ViYWNrIHdoZXJlIHRoZSBzb3VyY2UKKyAgICAgICB3YXMgYWxsb2NhdGVkLCB3aGVyZWFzIHRoZSBDIGltcGxlbWVudGF0aW9uIGRvZXNudC4gKi8KKyAgICBzaG93X2ZuID0gZ2V0X3dhcm5pbmdzX2F0dHIoIl9zaG93d2Fybm1zZyIsIHNvdXJjZSAhPSBOVUxMKTsKKyAgICBpZiAoc2hvd19mbiA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzaG93X3dhcm5pbmcoZmlsZW5hbWUsIGxpbmVubywgdGV4dCwgY2F0ZWdvcnksIHNvdXJjZWxpbmUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soc2hvd19mbikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAid2FybmluZ3MuX3Nob3d3YXJubXNnKCkgbXVzdCBiZSBzZXQgdG8gYSBjYWxsYWJsZSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHdhcm5tc2dfY2xzID0gZ2V0X3dhcm5pbmdzX2F0dHIoIldhcm5pbmdNZXNzYWdlIiwgMCk7CisgICAgaWYgKHdhcm5tc2dfY2xzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGdldCB3YXJuaW5ncy5XYXJuaW5nTWVzc2FnZSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIG1zZyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Mod2Fybm1zZ19jbHMsIG1lc3NhZ2UsIGNhdGVnb3J5LAorICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVub19vYmosIFB5X05vbmUsIFB5X05vbmUsIHNvdXJjZSwKKyAgICAgICAgICAgIE5VTEwpOworICAgIFB5X0RFQ1JFRih3YXJubXNnX2Nscyk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhzaG93X2ZuLCBtc2csIE5VTEwpOworICAgIFB5X0RFQ1JFRihzaG93X2ZuKTsKKyAgICBQeV9ERUNSRUYobXNnKTsKKworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYoc2hvd19mbik7CisgICAgcmV0dXJuIC0xOworfQorCiBzdGF0aWMgUHlPYmplY3QgKgogd2Fybl9leHBsaWNpdChQeU9iamVjdCAqY2F0ZWdvcnksIFB5T2JqZWN0ICptZXNzYWdlLAogICAgICAgICAgICAgICBQeU9iamVjdCAqZmlsZW5hbWUsIGludCBsaW5lbm8sCi0gICAgICAgICAgICAgIFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpyZWdpc3RyeSwgUHlPYmplY3QgKnNvdXJjZWxpbmUpCisgICAgICAgICAgICAgIFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpyZWdpc3RyeSwgUHlPYmplY3QgKnNvdXJjZWxpbmUsCisgICAgICAgICAgICAgIFB5T2JqZWN0ICpzb3VyY2UpCiB7CiAgICAgUHlPYmplY3QgKmtleSA9IE5VTEwsICp0ZXh0ID0gTlVMTCwgKnJlc3VsdCA9IE5VTEwsICpsaW5lbm9fb2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqaXRlbSA9IE5VTEw7CkBAIC00NzAsMzEgKzU0Miw5IEBACiAgICAgaWYgKHJjID09IDEpICAvKiBBbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBtb2R1bGUuICovCiAgICAgICAgIGdvdG8gcmV0dXJuX25vbmU7CiAgICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgUHlPYmplY3QgKnNob3dfZnhuID0gZ2V0X3dhcm5pbmdzX2F0dHIoInNob3d3YXJuaW5nIik7Ci0gICAgICAgIGlmIChzaG93X2Z4biA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICBzaG93X3dhcm5pbmcoZmlsZW5hbWUsIGxpbmVubywgdGV4dCwgY2F0ZWdvcnksIHNvdXJjZWxpbmUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgUHlPYmplY3QgKnJlczsKLQotICAgICAgICAgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKHNob3dfZnhuKSkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJuaW5ncy5zaG93d2FybmluZygpIG11c3QgYmUgc2V0IHRvIGEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGFibGUiKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2hvd19meG4pOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhzaG93X2Z4biwgbWVzc2FnZSwgY2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZW5vX29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICAgICAgUHlfREVDUkVGKHNob3dfZnhuKTsKLSAgICAgICAgICAgIFB5X1hERUNSRUYocmVzKTsKLSAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGxfc2hvd193YXJuaW5nKGNhdGVnb3J5LCB0ZXh0LCBtZXNzYWdlLCBmaWxlbmFtZSwgbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vX29iaiwgc291cmNlbGluZSwgc291cmNlKSA8IDApCisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgfQogICAgIGVsc2UgLyogaWYgKHJjID09IC0xKSAqLwogICAgICAgICBnb3RvIGNsZWFudXA7CkBAIC03MzgsNyArNzg4LDggQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRvX3dhcm4oUHlPYmplY3QgKm1lc3NhZ2UsIFB5T2JqZWN0ICpjYXRlZ29yeSwgUHlfc3NpemVfdCBzdGFja19sZXZlbCkKK2RvX3dhcm4oUHlPYmplY3QgKm1lc3NhZ2UsIFB5T2JqZWN0ICpjYXRlZ29yeSwgUHlfc3NpemVfdCBzdGFja19sZXZlbCwKKyAgICAgICAgUHlPYmplY3QgKnNvdXJjZSkKIHsKICAgICBQeU9iamVjdCAqZmlsZW5hbWUsICptb2R1bGUsICpyZWdpc3RyeSwgKnJlczsKICAgICBpbnQgbGluZW5vOwpAQCAtNzQ3LDcgKzc5OCw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgcmVzID0gd2Fybl9leHBsaWNpdChjYXRlZ29yeSwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLCByZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgc291cmNlKTsKICAgICBQeV9ERUNSRUYoZmlsZW5hbWUpOwogICAgIFB5X0RFQ1JFRihyZWdpc3RyeSk7CiAgICAgUHlfREVDUkVGKG1vZHVsZSk7CkBAIC03NTcsMjUgKzgwOCwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdhcm5pbmdzX3dhcm4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLSAgICBzdGF0aWMgY2hhciAqa3dfbGlzdFtdID0geyAibWVzc2FnZSIsICJjYXRlZ29yeSIsICJzdGFja2xldmVsIiwgMCB9OwotICAgIFB5T2JqZWN0ICptZXNzYWdlLCAqY2F0ZWdvcnkgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprd19saXN0W10gPSB7Im1lc3NhZ2UiLCAiY2F0ZWdvcnkiLCAic3RhY2tsZXZlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIiwgTlVMTH07CisgICAgUHlPYmplY3QgKm1lc3NhZ2UsICpjYXRlZ29yeSA9IE5VTEwsICpzb3VyY2UgPSBOVUxMOwogICAgIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwgPSAxOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98T246d2FybiIsIGt3X2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UsICZjYXRlZ29yeSwgJnN0YWNrX2xldmVsKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPbk86d2FybiIsIGt3X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UsICZjYXRlZ29yeSwgJnN0YWNrX2xldmVsLCAmc291cmNlKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBjYXRlZ29yeSA9IGdldF9jYXRlZ29yeShtZXNzYWdlLCBjYXRlZ29yeSk7CiAgICAgaWYgKGNhdGVnb3J5ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBkb193YXJuKG1lc3NhZ2UsIGNhdGVnb3J5LCBzdGFja19sZXZlbCk7CisgICAgcmV0dXJuIGRvX3dhcm4obWVzc2FnZSwgY2F0ZWdvcnksIHN0YWNrX2xldmVsLCBzb3VyY2UpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2FybmluZ3Nfd2Fybl9leHBsaWNpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewogICAgIHN0YXRpYyBjaGFyICprd2RfbGlzdFtdID0geyJtZXNzYWdlIiwgImNhdGVnb3J5IiwgImZpbGVuYW1lIiwgImxpbmVubyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUiLCAicmVnaXN0cnkiLCAibW9kdWxlX2dsb2JhbHMiLCAwfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSIsICJyZWdpc3RyeSIsICJtb2R1bGVfZ2xvYmFscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2UiLCAwfTsKICAgICBQeU9iamVjdCAqbWVzc2FnZTsKICAgICBQeU9iamVjdCAqY2F0ZWdvcnk7CiAgICAgUHlPYmplY3QgKmZpbGVuYW1lOwpAQCAtNzgzLDEwICs4MzYsMTEgQEAKICAgICBQeU9iamVjdCAqbW9kdWxlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmVnaXN0cnkgPSBOVUxMOwogICAgIFB5T2JqZWN0ICptb2R1bGVfZ2xvYmFscyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnNvdXJjZW9iaiA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT09VaXxPT086d2Fybl9leHBsaWNpdCIsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9PVWl8T09PTzp3YXJuX2V4cGxpY2l0IiwKICAgICAgICAgICAgICAgICBrd2RfbGlzdCwgJm1lc3NhZ2UsICZjYXRlZ29yeSwgJmZpbGVuYW1lLCAmbGluZW5vLCAmbW9kdWxlLAotICAgICAgICAgICAgICAgICZyZWdpc3RyeSwgJm1vZHVsZV9nbG9iYWxzKSkKKyAgICAgICAgICAgICAgICAmcmVnaXN0cnksICZtb2R1bGVfZ2xvYmFscywgJnNvdXJjZW9iaikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKG1vZHVsZV9nbG9iYWxzKSB7CkBAIC04NDIsMTQgKzg5NiwxNCBAQAogCiAgICAgICAgIC8qIEhhbmRsZSB0aGUgd2FybmluZy4gKi8KICAgICAgICAgcmV0dXJuZWQgPSB3YXJuX2V4cGxpY2l0KGNhdGVnb3J5LCBtZXNzYWdlLCBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSwgc291cmNlX2xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnksIHNvdXJjZV9saW5lLCBzb3VyY2VvYmopOwogICAgICAgICBQeV9ERUNSRUYoc291cmNlX2xpc3QpOwogICAgICAgICByZXR1cm4gcmV0dXJuZWQ7CiAgICAgfQogCiAgc3RhbmRhcmRfY2FsbDoKICAgICByZXR1cm4gd2Fybl9leHBsaWNpdChjYXRlZ29yeSwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSwgTlVMTCwgc291cmNlb2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTg2NCwxNCArOTE4LDE0IEBACiAKIHN0YXRpYyBpbnQKIHdhcm5fdW5pY29kZShQeU9iamVjdCAqY2F0ZWdvcnksIFB5T2JqZWN0ICptZXNzYWdlLAotICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwpCisgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFja19sZXZlbCwgUHlPYmplY3QgKnNvdXJjZSkKIHsKICAgICBQeU9iamVjdCAqcmVzOwogCiAgICAgaWYgKGNhdGVnb3J5ID09IE5VTEwpCiAgICAgICAgIGNhdGVnb3J5ID0gUHlFeGNfUnVudGltZVdhcm5pbmc7CiAKLSAgICByZXMgPSBkb193YXJuKG1lc3NhZ2UsIGNhdGVnb3J5LCBzdGFja19sZXZlbCk7CisgICAgcmVzID0gZG9fd2FybihtZXNzYWdlLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwsIHNvdXJjZSk7CiAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgUHlfREVDUkVGKHJlcyk7CkBAIC04NzksMTIgKzkzMywyOCBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50CitfUHlFcnJfV2FybkZvcm1hdFYoUHlPYmplY3QgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2F0ZWdvcnksIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhcmdzKQoreworICAgIFB5T2JqZWN0ICptZXNzYWdlOworICAgIGludCByZXM7CisKKyAgICBtZXNzYWdlID0gUHlVbmljb2RlX0Zyb21Gb3JtYXRWKGZvcm1hdCwgdmFyZ3MpOworICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJlcyA9IHdhcm5fdW5pY29kZShjYXRlZ29yeSwgbWVzc2FnZSwgc3RhY2tfbGV2ZWwsIHNvdXJjZSk7CisgICAgUHlfREVDUkVGKG1lc3NhZ2UpOworICAgIHJldHVybiByZXM7Cit9CisKIGludAogUHlFcnJfV2FybkZvcm1hdChQeU9iamVjdCAqY2F0ZWdvcnksIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotICAgIGludCByZXQ7Ci0gICAgUHlPYmplY3QgKm1lc3NhZ2U7CisgICAgaW50IHJlczsKICAgICB2YV9saXN0IHZhcmdzOwogCiAjaWZkZWYgSEFWRV9TVERBUkdfUFJPVE9UWVBFUwpAQCAtODkyLDI1ICs5NjIsMzggQEAKICNlbHNlCiAgICAgdmFfc3RhcnQodmFyZ3MpOwogI2VuZGlmCi0gICAgbWVzc2FnZSA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0Vihmb3JtYXQsIHZhcmdzKTsKLSAgICBpZiAobWVzc2FnZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldCA9IHdhcm5fdW5pY29kZShjYXRlZ29yeSwgbWVzc2FnZSwgc3RhY2tfbGV2ZWwpOwotICAgICAgICBQeV9ERUNSRUYobWVzc2FnZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0ID0gLTE7CisgICAgcmVzID0gX1B5RXJyX1dhcm5Gb3JtYXRWKE5VTEwsIGNhdGVnb3J5LCBzdGFja19sZXZlbCwgZm9ybWF0LCB2YXJncyk7CiAgICAgdmFfZW5kKHZhcmdzKTsKLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiByZXM7CiB9CiAKIGludAorUHlFcnJfUmVzb3VyY2VXYXJuaW5nKFB5T2JqZWN0ICpzb3VyY2UsIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgaW50IHJlczsKKyAgICB2YV9saXN0IHZhcmdzOworCisjaWZkZWYgSEFWRV9TVERBUkdfUFJPVE9UWVBFUworICAgIHZhX3N0YXJ0KHZhcmdzLCBmb3JtYXQpOworI2Vsc2UKKyAgICB2YV9zdGFydCh2YXJncyk7CisjZW5kaWYKKyAgICByZXMgPSBfUHlFcnJfV2FybkZvcm1hdFYoc291cmNlLCBQeUV4Y19SZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrX2xldmVsLCBmb3JtYXQsIHZhcmdzKTsKKyAgICB2YV9lbmQodmFyZ3MpOworICAgIHJldHVybiByZXM7Cit9CisKKworaW50CiBQeUVycl9XYXJuRXgoUHlPYmplY3QgKmNhdGVnb3J5LCBjb25zdCBjaGFyICp0ZXh0LCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsKQogewogICAgIGludCByZXQ7CiAgICAgUHlPYmplY3QgKm1lc3NhZ2UgPSBQeVVuaWNvZGVfRnJvbVN0cmluZyh0ZXh0KTsKICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgcmV0ID0gd2Fybl91bmljb2RlKGNhdGVnb3J5LCBtZXNzYWdlLCBzdGFja19sZXZlbCk7CisgICAgcmV0ID0gd2Fybl91bmljb2RlKGNhdGVnb3J5LCBtZXNzYWdlLCBzdGFja19sZXZlbCwgTlVMTCk7CiAgICAgUHlfREVDUkVGKG1lc3NhZ2UpOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC05MjEsNyArMTAwNCw3IEBACiAjdW5kZWYgUHlFcnJfV2FybgogCiBQeUFQSV9GVU5DKGludCkKLVB5RXJyX1dhcm4oUHlPYmplY3QgKmNhdGVnb3J5LCBjaGFyICp0ZXh0KQorUHlFcnJfV2FybihQeU9iamVjdCAqY2F0ZWdvcnksIGNvbnN0IGNoYXIgKnRleHQpCiB7CiAgICAgcmV0dXJuIFB5RXJyX1dhcm5FeChjYXRlZ29yeSwgdGV4dCwgMSk7CiB9CkBAIC05MzYsNyArMTAxOSw3IEBACiAgICAgaWYgKGNhdGVnb3J5ID09IE5VTEwpCiAgICAgICAgIGNhdGVnb3J5ID0gUHlFeGNfUnVudGltZVdhcm5pbmc7CiAgICAgcmVzID0gd2Fybl9leHBsaWNpdChjYXRlZ29yeSwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSwgcmVnaXN0cnksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCByZWdpc3RyeSwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgUHlfREVDUkVGKHJlcyk7CkBAIC0xMDAwLDcgKzEwODMsNyBAQAogICAgIGlmIChtZXNzYWdlICE9IE5VTEwpIHsKICAgICAgICAgUHlPYmplY3QgKnJlczsKICAgICAgICAgcmVzID0gd2Fybl9leHBsaWNpdChjYXRlZ29yeSwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUsIHJlZ2lzdHJ5LCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUsIHJlZ2lzdHJ5LCBOVUxMLCBOVUxMKTsKICAgICAgICAgUHlfREVDUkVGKG1lc3NhZ2UpOwogICAgICAgICBpZiAocmVzICE9IE5VTEwpIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2FzZGwuYyBiL1B5dGhvbi9hc2RsLmMKaW5kZXggZGYzODdiMi4uYzIxMTA3OCAxMDA2NDQKLS0tIGEvUHl0aG9uL2FzZGwuYworKysgYi9QeXRob24vYXNkbC5jCkBAIC05LDE0ICs5LDE0IEBACiAKICAgICAvKiBjaGVjayBzaXplIGlzIHNhbmUgKi8KICAgICBpZiAoc2l6ZSA8IDAgfHwKLSAgICAgICAgKHNpemUgJiYgKCgoc2l6ZV90KXNpemUgLSAxKSA+IChQWV9TSVpFX01BWCAvIHNpemVvZih2b2lkICopKSkpKSB7CisgICAgICAgIChzaXplICYmICgoKHNpemVfdClzaXplIC0gMSkgPiAoU0laRV9NQVggLyBzaXplb2Yodm9pZCAqKSkpKSkgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgbiA9IChzaXplID8gKHNpemVvZih2b2lkICopICogKHNpemUgLSAxKSkgOiAwKTsKIAogICAgIC8qIGNoZWNrIGlmIHNpemUgY2FuIGJlIGFkZGVkIHNhZmVseSAqLwotICAgIGlmIChuID4gUFlfU0laRV9NQVggLSBzaXplb2YoYXNkbF9zZXEpKSB7CisgICAgaWYgKG4gPiBTSVpFX01BWCAtIHNpemVvZihhc2RsX3NlcSkpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNDAsMTQgKzQwLDE0IEBACiAKICAgICAvKiBjaGVjayBzaXplIGlzIHNhbmUgKi8KICAgICBpZiAoc2l6ZSA8IDAgfHwKLSAgICAgICAgKHNpemUgJiYgKCgoc2l6ZV90KXNpemUgLSAxKSA+IChQWV9TSVpFX01BWCAvIHNpemVvZih2b2lkICopKSkpKSB7CisgICAgICAgIChzaXplICYmICgoKHNpemVfdClzaXplIC0gMSkgPiAoU0laRV9NQVggLyBzaXplb2Yodm9pZCAqKSkpKSkgewogICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBuID0gKHNpemUgPyAoc2l6ZW9mKHZvaWQgKikgKiAoc2l6ZSAtIDEpKSA6IDApOwogCiAgICAgLyogY2hlY2sgaWYgc2l6ZSBjYW4gYmUgYWRkZWQgc2FmZWx5ICovCi0gICAgaWYgKG4gPiBQWV9TSVpFX01BWCAtIHNpemVvZihhc2RsX3NlcSkpIHsKKyAgICBpZiAobiA+IFNJWkVfTUFYIC0gc2l6ZW9mKGFzZGxfc2VxKSkgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CmRpZmYgLS1naXQgYS9QeXRob24vYXN0LmMgYi9QeXRob24vYXN0LmMKaW5kZXggNmRhMzNmNy4uMzcxOTMzMiAxMDA2NDQKLS0tIGEvUHl0aG9uL2FzdC5jCisrKyBiL1B5dGhvbi9hc3QuYwpAQCAtMTMyLDYgKzEzMiw1MiBAQAogfQogCiBzdGF0aWMgaW50Cit2YWxpZGF0ZV9jb25zdGFudChQeU9iamVjdCAqdmFsdWUpCit7CisgICAgaWYgKHZhbHVlID09IFB5X05vbmUgfHwgdmFsdWUgPT0gUHlfRWxsaXBzaXMpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHZhbHVlKQorICAgICAgICAgICAgfHwgUHlGbG9hdF9DaGVja0V4YWN0KHZhbHVlKQorICAgICAgICAgICAgfHwgUHlDb21wbGV4X0NoZWNrRXhhY3QodmFsdWUpCisgICAgICAgICAgICB8fCBQeUJvb2xfQ2hlY2sodmFsdWUpCisgICAgICAgICAgICB8fCBQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2YWx1ZSkKKyAgICAgICAgICAgIHx8IFB5Qnl0ZXNfQ2hlY2tFeGFjdCh2YWx1ZSkpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh2YWx1ZSkgfHwgUHlGcm96ZW5TZXRfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKKyAgICAgICAgUHlPYmplY3QgKml0OworCisgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih2YWx1ZSk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZV9jb25zdGFudChpdGVtKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKIHZhbGlkYXRlX2V4cHIoZXhwcl90eSBleHAsIGV4cHJfY29udGV4dF90eSBjdHgpCiB7CiAgICAgaW50IGNoZWNrX2N0eCA9IDE7CkBAIC0yNDAsNiArMjg2LDE0IEBACiAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9leHByKGV4cC0+di5DYWxsLmZ1bmMsIExvYWQpICYmCiAgICAgICAgICAgICB2YWxpZGF0ZV9leHBycyhleHAtPnYuQ2FsbC5hcmdzLCBMb2FkLCAwKSAmJgogICAgICAgICAgICAgdmFsaWRhdGVfa2V5d29yZHMoZXhwLT52LkNhbGwua2V5d29yZHMpOworICAgIGNhc2UgQ29uc3RhbnRfa2luZDoKKyAgICAgICAgaWYgKCF2YWxpZGF0ZV9jb25zdGFudChleHAtPnYuQ29uc3RhbnQudmFsdWUpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnb3QgYW4gaW52YWxpZCB0eXBlIGluIENvbnN0YW50OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShleHAtPnYuQ29uc3RhbnQudmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOwogICAgIGNhc2UgTnVtX2tpbmQ6IHsKICAgICAgICAgUHlPYmplY3QgKm4gPSBleHAtPnYuTnVtLm47CiAgICAgICAgIGlmICghUHlMb25nX0NoZWNrRXhhY3QobikgJiYgIVB5RmxvYXRfQ2hlY2tFeGFjdChuKSAmJgpAQCAtMjU3LDYgKzMxMSwxNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KKyAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICByZXR1cm4gdmFsaWRhdGVfZXhwcnMoZXhwLT52LkpvaW5lZFN0ci52YWx1ZXMsIExvYWQsIDApOworICAgIGNhc2UgRm9ybWF0dGVkVmFsdWVfa2luZDoKKyAgICAgICAgaWYgKHZhbGlkYXRlX2V4cHIoZXhwLT52LkZvcm1hdHRlZFZhbHVlLnZhbHVlLCBMb2FkKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChleHAtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpCisgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVfZXhwcihleHAtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMsIExvYWQpOworICAgICAgICByZXR1cm4gMTsKICAgICBjYXNlIEJ5dGVzX2tpbmQ6IHsKICAgICAgICAgUHlPYmplY3QgKmIgPSBleHAtPnYuQnl0ZXMuczsKICAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrRXhhY3QoYikpIHsKQEAgLTMzNSw2ICszOTcsMTcgQEAKICAgICBjYXNlIEF1Z0Fzc2lnbl9raW5kOgogICAgICAgICByZXR1cm4gdmFsaWRhdGVfZXhwcihzdG10LT52LkF1Z0Fzc2lnbi50YXJnZXQsIFN0b3JlKSAmJgogICAgICAgICAgICAgdmFsaWRhdGVfZXhwcihzdG10LT52LkF1Z0Fzc2lnbi52YWx1ZSwgTG9hZCk7CisgICAgY2FzZSBBbm5Bc3NpZ25fa2luZDoKKyAgICAgICAgaWYgKHN0bXQtPnYuQW5uQXNzaWduLnRhcmdldC0+a2luZCAhPSBOYW1lX2tpbmQgJiYKKyAgICAgICAgICAgIHN0bXQtPnYuQW5uQXNzaWduLnNpbXBsZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5uQXNzaWduIHdpdGggc2ltcGxlIG5vbi1OYW1lIHRhcmdldCIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbGlkYXRlX2V4cHIoc3RtdC0+di5Bbm5Bc3NpZ24udGFyZ2V0LCBTdG9yZSkgJiYKKyAgICAgICAgICAgICAgICghc3RtdC0+di5Bbm5Bc3NpZ24udmFsdWUgfHwKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZV9leHByKHN0bXQtPnYuQW5uQXNzaWduLnZhbHVlLCBMb2FkKSkgJiYKKyAgICAgICAgICAgICAgIHZhbGlkYXRlX2V4cHIoc3RtdC0+di5Bbm5Bc3NpZ24uYW5ub3RhdGlvbiwgTG9hZCk7CiAgICAgY2FzZSBGb3Jfa2luZDoKICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX2V4cHIoc3RtdC0+di5Gb3IudGFyZ2V0LCBTdG9yZSkgJiYKICAgICAgICAgICAgIHZhbGlkYXRlX2V4cHIoc3RtdC0+di5Gb3IuaXRlciwgTG9hZCkgJiYKQEAgLTQxMyw4ICs0ODYsOCBAQAogICAgIGNhc2UgSW1wb3J0X2tpbmQ6CiAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9ub25lbXB0eV9zZXEoc3RtdC0+di5JbXBvcnQubmFtZXMsICJuYW1lcyIsICJJbXBvcnQiKTsKICAgICBjYXNlIEltcG9ydEZyb21fa2luZDoKLSAgICAgICAgaWYgKHN0bXQtPnYuSW1wb3J0RnJvbS5sZXZlbCA8IC0xKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkltcG9ydEZyb20gbGV2ZWwgbGVzcyB0aGFuIC0xIik7CisgICAgICAgIGlmIChzdG10LT52LkltcG9ydEZyb20ubGV2ZWwgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk5lZ2F0aXZlIEltcG9ydEZyb20gbGV2ZWwiKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9ub25lbXB0eV9zZXEoc3RtdC0+di5JbXBvcnRGcm9tLm5hbWVzLCAibmFtZXMiLCAiSW1wb3J0RnJvbSIpOwpAQCAtNTEyLDggKzU4NSw3IEBACiAKIC8qIERhdGEgc3RydWN0dXJlIHVzZWQgaW50ZXJuYWxseSAqLwogc3RydWN0IGNvbXBpbGluZyB7Ci0gICAgY2hhciAqY19lbmNvZGluZzsgLyogc291cmNlIGVuY29kaW5nICovCi0gICAgUHlBcmVuYSAqY19hcmVuYTsgLyogYXJlbmEgZm9yIGFsbG9jYXRpbmcgbWVtZW9yeSAqLworICAgIFB5QXJlbmEgKmNfYXJlbmE7IC8qIEFyZW5hIGZvciBhbGxvY2F0aW5nIG1lbW9yeS4gKi8KICAgICBQeU9iamVjdCAqY19maWxlbmFtZTsgLyogZmlsZW5hbWUgKi8KICAgICBQeU9iamVjdCAqY19ub3JtYWxpemU7IC8qIE5vcm1hbGl6YXRpb24gZnVuY3Rpb24gZnJvbSB1bmljb2RlZGF0YS4gKi8KICAgICBQeU9iamVjdCAqY19ub3JtYWxpemVfYXJnczsgLyogTm9ybWFsaXphdGlvbiBhcmd1bWVudCB0dXBsZS4gKi8KQEAgLTUzNSw5ICs2MDcsNyBAQAogc3RhdGljIGV4cHJfdHkgYXN0X2Zvcl9jYWxsKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqLCBleHByX3R5KTsKIAogc3RhdGljIFB5T2JqZWN0ICpwYXJzZW51bWJlcihzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgUHlPYmplY3QgKnBhcnNlc3RyKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqbiwgaW50ICpieXRlc21vZGUpOwotc3RhdGljIFB5T2JqZWN0ICpwYXJzZXN0cnBsdXMoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICpuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpieXRlc21vZGUpOworc3RhdGljIGV4cHJfdHkgcGFyc2VzdHJwbHVzKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqbik7CiAKICNkZWZpbmUgQ09NUF9HRU5FWFAgICAwCiAjZGVmaW5lIENPTVBfTElTVENPTVAgMQpAQCAtNzAxLDIzICs3NzEsMTEgQEAKICAgICBjLmNfYXJlbmEgPSBhcmVuYTsKICAgICAvKiBib3Jyb3dlZCByZWZlcmVuY2UgKi8KICAgICBjLmNfZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgICBjLmNfbm9ybWFsaXplID0gYy5jX25vcm1hbGl6ZV9hcmdzID0gTlVMTDsKLSAgICBpZiAoZmxhZ3MgJiYgZmxhZ3MtPmNmX2ZsYWdzICYgUHlDRl9TT1VSQ0VfSVNfVVRGOCkgewotICAgICAgICBjLmNfZW5jb2RpbmcgPSAidXRmLTgiOwotICAgICAgICBpZiAoVFlQRShuKSA9PSBlbmNvZGluZ19kZWNsKSB7Ci0jaWYgMAotICAgICAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJlbmNvZGluZyBkZWNsYXJhdGlvbiBpbiBVbmljb2RlIHN0cmluZyIpOwotICAgICAgICAgICAgZ290byBvdXQ7Ci0jZW5kaWYKLSAgICAgICAgICAgIG4gPSBDSElMRChuLCAwKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoVFlQRShuKSA9PSBlbmNvZGluZ19kZWNsKSB7Ci0gICAgICAgIGMuY19lbmNvZGluZyA9IFNUUihuKTsKKyAgICBjLmNfbm9ybWFsaXplID0gTlVMTDsKKyAgICBjLmNfbm9ybWFsaXplX2FyZ3MgPSBOVUxMOworCisgICAgaWYgKFRZUEUobikgPT0gZW5jb2RpbmdfZGVjbCkKICAgICAgICAgbiA9IENISUxEKG4sIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFBFUCAzMTIwICovCi0gICAgICAgIGMuY19lbmNvZGluZyA9ICJ1dGYtOCI7Ci0gICAgfQogCiAgICAgayA9IDA7CiAgICAgc3dpdGNoIChUWVBFKG4pKSB7CkBAIC04NjQsNyArOTIyLDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyKiBGT1JCSURERU5bXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgRk9SQklEREVOW10gPSB7CiAgICAgIk5vbmUiLAogICAgICJUcnVlIiwKICAgICAiRmFsc2UiLApAQCAtODgxLDcgKzkzOSw3IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgICBpZiAoZnVsbF9jaGVja3MpIHsKLSAgICAgICAgY29uc3QgY2hhciAqKnA7CisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqcDsKICAgICAgICAgZm9yIChwID0gRk9SQklEREVOOyAqcDsgcCsrKSB7CiAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcobmFtZSwgKnApID09IDApIHsKICAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImFzc2lnbm1lbnQgdG8ga2V5d29yZCIpOwpAQCAtOTQzLDEzICsxMDAxLDggQEAKICAgICAgICAgICAgIHMgPSBlLT52Lkxpc3QuZWx0czsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFR1cGxlX2tpbmQ6Ci0gICAgICAgICAgICBpZiAoYXNkbF9zZXFfTEVOKGUtPnYuVHVwbGUuZWx0cykpICB7Ci0gICAgICAgICAgICAgICAgZS0+di5UdXBsZS5jdHggPSBjdHg7Ci0gICAgICAgICAgICAgICAgcyA9IGUtPnYuVHVwbGUuZWx0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGV4cHJfbmFtZSA9ICIoKSI7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBlLT52LlR1cGxlLmN0eCA9IGN0eDsKKyAgICAgICAgICAgIHMgPSBlLT52LlR1cGxlLmVsdHM7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBMYW1iZGFfa2luZDoKICAgICAgICAgICAgIGV4cHJfbmFtZSA9ICJsYW1iZGEiOwpAQCAtOTg2LDYgKzEwMzksOCBAQAogICAgICAgICBjYXNlIE51bV9raW5kOgogICAgICAgICBjYXNlIFN0cl9raW5kOgogICAgICAgICBjYXNlIEJ5dGVzX2tpbmQ6CisgICAgICAgIGNhc2UgSm9pbmVkU3RyX2tpbmQ6CisgICAgICAgIGNhc2UgRm9ybWF0dGVkVmFsdWVfa2luZDoKICAgICAgICAgICAgIGV4cHJfbmFtZSA9ICJsaXRlcmFsIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE5hbWVDb25zdGFudF9raW5kOgpAQCAtMTI1OSwxNiArMTMxNCwyMCBAQAogICAgICAgIGFuZCB2YXJhcmdzbGlzdCAobGFtYmRhIGRlZmluaXRpb24pLgogCiAgICAgICAgcGFyYW1ldGVyczogJygnIFt0eXBlZGFyZ3NsaXN0XSAnKScKLSAgICAgICB0eXBlZGFyZ3NsaXN0OiAoKHRmcGRlZiBbJz0nIHRlc3RdICcsJykqCi0gICAgICAgICAgICgnKicgW3RmcGRlZl0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB0ZnBkZWZdCi0gICAgICAgICAgIHwgJyoqJyB0ZnBkZWYpCi0gICAgICAgICAgIHwgdGZwZGVmIFsnPScgdGVzdF0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddKQorICAgICAgIHR5cGVkYXJnc2xpc3Q6ICh0ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbCisgICAgICAgICAgICAgICAnKicgW3RmcGRlZl0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdGZwZGVmIFsnLCddXV0KKyAgICAgICAgICAgICB8ICcqKicgdGZwZGVmIFsnLCddXV0KKyAgICAgICAgIHwgJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHRmcGRlZiBbJywnXV1dCisgICAgICAgICB8ICcqKicgdGZwZGVmIFsnLCddKQogICAgICAgIHRmcGRlZjogTkFNRSBbJzonIHRlc3RdCi0gICAgICAgdmFyYXJnc2xpc3Q6ICgodmZwZGVmIFsnPScgdGVzdF0gJywnKSoKLSAgICAgICAgICAgKCcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogIFsnLCcgJyoqJyB2ZnBkZWZdCi0gICAgICAgICAgIHwgJyoqJyB2ZnBkZWYpCi0gICAgICAgICAgIHwgdmZwZGVmIFsnPScgdGVzdF0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddKQorICAgICAgIHZhcmFyZ3NsaXN0OiAodmZwZGVmIFsnPScgdGVzdF0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWworICAgICAgICAgICAgICAgJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHZmcGRlZiBbJywnXV1dCisgICAgICAgICAgICAgfCAnKionIHZmcGRlZiBbJywnXV1dCisgICAgICAgICB8ICcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB2ZnBkZWYgWycsJ11dXQorICAgICAgICAgfCAnKionIHZmcGRlZiBbJywnXQorICAgICAgICkKICAgICAgICB2ZnBkZWY6IE5BTUUKKwogICAgICovCiAgICAgaW50IGksIGosIGssIG5wb3NhcmdzID0gMCwgbmt3b25seWFyZ3MgPSAwOwogICAgIGludCBucG9zZGVmYXVsdHMgPSAwLCBmb3VuZF9kZWZhdWx0ID0gMDsKQEAgLTEzNzAsNyArMTQyOSw4IEBACiAgICAgICAgICAgICAgICAgaSArPSAyOyAvKiB0aGUgbmFtZSBhbmQgdGhlIGNvbW1hICovCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFNUQVI6Ci0gICAgICAgICAgICAgICAgaWYgKGkrMSA+PSBOQ0gobikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSsxID49IE5DSChuKSB8fAorICAgICAgICAgICAgICAgICAgICAoaSsyID09IE5DSChuKSAmJiBUWVBFKENISUxEKG4sIGkrMSkpID09IENPTU1BKSkgewogICAgICAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgQ0hJTEQobiwgaSksCiAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZWQgYXJndW1lbnRzIG11c3QgZm9sbG93IGJhcmUgKiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTE2ODcsMTQgKzE3NDcsMjEgQEAKIGNvdW50X2NvbXBfZm9ycyhzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQogewogICAgIGludCBuX2ZvcnMgPSAwOworICAgIGludCBpc19hc3luYzsKIAogICBjb3VudF9jb21wX2ZvcjoKKyAgICBpc19hc3luYyA9IDA7CiAgICAgbl9mb3JzKys7CiAgICAgUkVRKG4sIGNvbXBfZm9yKTsKLSAgICBpZiAoTkNIKG4pID09IDUpCi0gICAgICAgIG4gPSBDSElMRChuLCA0KTsKLSAgICBlbHNlCisgICAgaWYgKFRZUEUoQ0hJTEQobiwgMCkpID09IEFTWU5DKSB7CisgICAgICAgIGlzX2FzeW5jID0gMTsKKyAgICB9CisgICAgaWYgKE5DSChuKSA9PSAoNSArIGlzX2FzeW5jKSkgeworICAgICAgICBuID0gQ0hJTEQobiwgNCArIGlzX2FzeW5jKTsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAgIHJldHVybiBuX2ZvcnM7CisgICAgfQogICBjb3VudF9jb21wX2l0ZXI6CiAgICAgUkVRKG4sIGNvbXBfaXRlcik7CiAgICAgbiA9IENISUxEKG4sIDApOwpAQCAtMTc1NywxNCArMTgyNCwxOSBAQAogICAgICAgICBhc2RsX3NlcSAqdDsKICAgICAgICAgZXhwcl90eSBleHByZXNzaW9uLCBmaXJzdDsKICAgICAgICAgbm9kZSAqZm9yX2NoOworICAgICAgICBpbnQgaXNfYXN5bmMgPSAwOwogCiAgICAgICAgIFJFUShuLCBjb21wX2Zvcik7CiAKLSAgICAgICAgZm9yX2NoID0gQ0hJTEQobiwgMSk7CisgICAgICAgIGlmIChUWVBFKENISUxEKG4sIDApKSA9PSBBU1lOQykgeworICAgICAgICAgICAgaXNfYXN5bmMgPSAxOworICAgICAgICB9CisKKyAgICAgICAgZm9yX2NoID0gQ0hJTEQobiwgMSArIGlzX2FzeW5jKTsKICAgICAgICAgdCA9IGFzdF9mb3JfZXhwcmxpc3QoYywgZm9yX2NoLCBTdG9yZSk7CiAgICAgICAgIGlmICghdCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBleHByZXNzaW9uID0gYXN0X2Zvcl9leHByKGMsIENISUxEKG4sIDMpKTsKKyAgICAgICAgZXhwcmVzc2lvbiA9IGFzdF9mb3JfZXhwcihjLCBDSElMRChuLCAzICsgaXNfYXN5bmMpKTsKICAgICAgICAgaWYgKCFleHByZXNzaW9uKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTE3NzIsMTkgKzE4NDQsMjAgQEAKICAgICAgICAgICAgKHggZm9yIHgsIGluIC4uLikgaGFzIDEgZWxlbWVudCBpbiB0LCBidXQgc3RpbGwgcmVxdWlyZXMgYSBUdXBsZS4gKi8KICAgICAgICAgZmlyc3QgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQodCwgMCk7CiAgICAgICAgIGlmIChOQ0goZm9yX2NoKSA9PSAxKQotICAgICAgICAgICAgY29tcCA9IGNvbXByZWhlbnNpb24oZmlyc3QsIGV4cHJlc3Npb24sIE5VTEwsIGMtPmNfYXJlbmEpOworICAgICAgICAgICAgY29tcCA9IGNvbXByZWhlbnNpb24oZmlyc3QsIGV4cHJlc3Npb24sIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19hc3luYywgYy0+Y19hcmVuYSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbXAgPSBjb21wcmVoZW5zaW9uKFR1cGxlKHQsIFN0b3JlLCBmaXJzdC0+bGluZW5vLCBmaXJzdC0+Y29sX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLCBOVUxMLCBjLT5jX2FyZW5hKTsKKyAgICAgICAgICAgIGNvbXAgPSBjb21wcmVoZW5zaW9uKFR1cGxlKHQsIFN0b3JlLCBmaXJzdC0+bGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QtPmNvbF9vZmZzZXQsIGMtPmNfYXJlbmEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgTlVMTCwgaXNfYXN5bmMsIGMtPmNfYXJlbmEpOwogICAgICAgICBpZiAoIWNvbXApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAoTkNIKG4pID09IDUpIHsKKyAgICAgICAgaWYgKE5DSChuKSA9PSAoNSArIGlzX2FzeW5jKSkgewogICAgICAgICAgICAgaW50IGosIG5faWZzOwogICAgICAgICAgICAgYXNkbF9zZXEgKmlmczsKIAotICAgICAgICAgICAgbiA9IENISUxEKG4sIDQpOworICAgICAgICAgICAgbiA9IENISUxEKG4sIDQgKyBpc19hc3luYyk7CiAgICAgICAgICAgICBuX2lmcyA9IGNvdW50X2NvbXBfaWZzKGMsIG4pOwogICAgICAgICAgICAgaWYgKG5faWZzID09IC0xKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTk5Myw3ICsyMDY2LDYgQEAKICAgICAgICB8ICcuLi4nIHwgJ05vbmUnIHwgJ1RydWUnIHwgJ0ZhbHNlJwogICAgICovCiAgICAgbm9kZSAqY2ggPSBDSElMRChuLCAwKTsKLSAgICBpbnQgYnl0ZXNtb2RlID0gMDsKIAogICAgIHN3aXRjaCAoVFlQRShjaCkpIHsKICAgICBjYXNlIE5BTUU6IHsKQEAgLTIwMTUsNyArMjA4Nyw3IEBACiAgICAgICAgIHJldHVybiBOYW1lKG5hbWUsIExvYWQsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKICAgICB9CiAgICAgY2FzZSBTVFJJTkc6IHsKLSAgICAgICAgUHlPYmplY3QgKnN0ciA9IHBhcnNlc3RycGx1cyhjLCBuLCAmYnl0ZXNtb2RlKTsKKyAgICAgICAgZXhwcl90eSBzdHIgPSBwYXJzZXN0cnBsdXMoYywgbik7CiAgICAgICAgIGlmICghc3RyKSB7CiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJ0eXBlID0gTlVMTDsKICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1VuaWNvZGVFcnJvcikpCkBAIC0yMDMyLDYgKzIxMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIoJXMpICVzIiwgZXJydHlwZSwgcyk7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlcnJzdHIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiglcykgdW5rbm93biBlcnJvciIsIGVycnR5cGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgYnVmKTsKQEAgLTIwNDEsMTQgKzIxMTQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKFB5QXJlbmFfQWRkUHlPYmplY3QoYy0+Y19hcmVuYSwgc3RyKSA8IDApIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ5dGVzbW9kZSkKLSAgICAgICAgICAgIHJldHVybiBCeXRlcyhzdHIsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFN0cihzdHIsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgcmV0dXJuIHN0cjsKICAgICB9CiAgICAgY2FzZSBOVU1CRVI6IHsKICAgICAgICAgUHlPYmplY3QgKnB5bnVtID0gcGFyc2VudW1iZXIoYywgU1RSKGNoKSk7CkBAIC0yODA1LDggKzI4NzEsOSBAQAogYXN0X2Zvcl9leHByX3N0bXQoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKIHsKICAgICBSRVEobiwgZXhwcl9zdG10KTsKLSAgICAvKiBleHByX3N0bXQ6IHRlc3RsaXN0X3N0YXJfZXhwciAoYXVnYXNzaWduICh5aWVsZF9leHByfHRlc3RsaXN0KQotICAgICAgICAgICAgICAgIHwgKCc9JyAoeWllbGRfZXhwcnx0ZXN0bGlzdCkpKikKKyAgICAvKiBleHByX3N0bXQ6IHRlc3RsaXN0X3N0YXJfZXhwciAoYW5uYXNzaWduIHwgYXVnYXNzaWduICh5aWVsZF9leHByfHRlc3RsaXN0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCc9JyAoeWllbGRfZXhwcnx0ZXN0bGlzdF9zdGFyX2V4cHIpKSopCisgICAgICAgYW5uYXNzaWduOiAnOicgdGVzdCBbJz0nIHRlc3RdCiAgICAgICAgdGVzdGxpc3Rfc3Rhcl9leHByOiAodGVzdHxzdGFyX2V4cHIpICgnLCcgdGVzdHxzdGFyX2V4cHIpKiBbJywnXQogICAgICAgIGF1Z2Fzc2lnbjogJys9JyB8ICctPScgfCAnKj0nIHwgJ0A9JyB8ICcvPScgfCAnJT0nIHwgJyY9JyB8ICd8PScgfCAnXj0nCiAgICAgICAgICAgICAgICAgfCAnPDw9JyB8ICc+Pj0nIHwgJyoqPScgfCAnLy89JwpAQCAtMjg1OCw2ICsyOTI1LDc2IEBACiAKICAgICAgICAgcmV0dXJuIEF1Z0Fzc2lnbihleHByMSwgbmV3b3BlcmF0b3IsIGV4cHIyLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiAgICAgfQorICAgIGVsc2UgaWYgKFRZUEUoQ0hJTEQobiwgMSkpID09IGFubmFzc2lnbikgeworICAgICAgICBleHByX3R5IGV4cHIxLCBleHByMiwgZXhwcjM7CisgICAgICAgIG5vZGUgKmNoID0gQ0hJTEQobiwgMCk7CisgICAgICAgIG5vZGUgKmRlZXAsICphbm4gPSBDSElMRChuLCAxKTsKKyAgICAgICAgaW50IHNpbXBsZSA9IDE7CisKKyAgICAgICAgLyogd2Uga2VlcCB0cmFjayBvZiBwYXJlbnMgdG8gcXVhbGlmeSAoeCkgYXMgZXhwcmVzc2lvbiBub3QgbmFtZSAqLworICAgICAgICBkZWVwID0gY2g7CisgICAgICAgIHdoaWxlIChOQ0goZGVlcCkgPT0gMSkgeworICAgICAgICAgICAgZGVlcCA9IENISUxEKGRlZXAsIDApOworICAgICAgICB9CisgICAgICAgIGlmIChOQ0goZGVlcCkgPiAwICYmIFRZUEUoQ0hJTEQoZGVlcCwgMCkpID09IExQQVIpIHsKKyAgICAgICAgICAgIHNpbXBsZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZXhwcjEgPSBhc3RfZm9yX3Rlc3RsaXN0KGMsIGNoKTsKKyAgICAgICAgaWYgKCFleHByMSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChleHByMS0+a2luZCkgeworICAgICAgICAgICAgY2FzZSBOYW1lX2tpbmQ6CisgICAgICAgICAgICAgICAgaWYgKGZvcmJpZGRlbl9uYW1lKGMsIGV4cHIxLT52Lk5hbWUuaWQsIG4sIDApKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBleHByMS0+di5OYW1lLmN0eCA9IFN0b3JlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVfa2luZDoKKyAgICAgICAgICAgICAgICBpZiAoZm9yYmlkZGVuX25hbWUoYywgZXhwcjEtPnYuQXR0cmlidXRlLmF0dHIsIG4sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBleHByMS0+di5BdHRyaWJ1dGUuY3R4ID0gU3RvcmU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFN1YnNjcmlwdF9raW5kOgorICAgICAgICAgICAgICAgIGV4cHIxLT52LlN1YnNjcmlwdC5jdHggPSBTdG9yZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTGlzdF9raW5kOgorICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IGxpc3QpIGNhbiBiZSBhbm5vdGF0ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGNhc2UgVHVwbGVfa2luZDoKKyAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmx5IHNpbmdsZSB0YXJnZXQgKG5vdCB0dXBsZSkgY2FuIGJlIGFubm90YXRlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHRhcmdldCBmb3IgYW5ub3RhdGlvbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4cHIxLT5raW5kICE9IE5hbWVfa2luZCkgeworICAgICAgICAgICAgc2ltcGxlID0gMDsKKyAgICAgICAgfQorICAgICAgICBjaCA9IENISUxEKGFubiwgMSk7CisgICAgICAgIGV4cHIyID0gYXN0X2Zvcl9leHByKGMsIGNoKTsKKyAgICAgICAgaWYgKCFleHByMikgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE5DSChhbm4pID09IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBBbm5Bc3NpZ24oZXhwcjEsIGV4cHIyLCBOVUxMLCBzaW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoID0gQ0hJTEQoYW5uLCAzKTsKKyAgICAgICAgICAgIGV4cHIzID0gYXN0X2Zvcl9leHByKGMsIGNoKTsKKyAgICAgICAgICAgIGlmICghZXhwcjMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBbm5Bc3NpZ24oZXhwcjEsIGV4cHIyLCBleHByMywgc2ltcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisgICAgICAgIH0KKyAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBhc2RsX3NlcSAqdGFyZ2V0czsKQEAgLTMyMDgsMTQgKzMzNDUsMTQgQEAKICAgICAgICAgICAgIGFsaWFzX3R5IGltcG9ydF9hbGlhcyA9IGFsaWFzX2Zvcl9pbXBvcnRfbmFtZShjLCBuLCAxKTsKICAgICAgICAgICAgIGlmICghaW1wb3J0X2FsaWFzKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChhbGlhc2VzLCAwLCBpbXBvcnRfYWxpYXMpOworICAgICAgICAgICAgYXNkbF9zZXFfU0VUKGFsaWFzZXMsIDAsIGltcG9ydF9hbGlhcyk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkNIKG4pOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgICBhbGlhc190eSBpbXBvcnRfYWxpYXMgPSBhbGlhc19mb3JfaW1wb3J0X25hbWUoYywgQ0hJTEQobiwgaSksIDEpOwogICAgICAgICAgICAgICAgIGlmICghaW1wb3J0X2FsaWFzKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXFfU0VUKGFsaWFzZXMsIGkgLyAyLCBpbXBvcnRfYWxpYXMpOworICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChhbGlhc2VzLCBpIC8gMiwgaW1wb3J0X2FsaWFzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAobW9kICE9IE5VTEwpCkBAIC0zOTM1LDgyICs0MDcyLDkzMiBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZGVjb2RlX3VuaWNvZGUoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgaW50IHJhd21vZGUsIGNvbnN0IGNoYXIgKmVuY29kaW5nKQorZGVjb2RlX3VuaWNvZGVfd2l0aF9lc2NhcGVzKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pCiB7CiAgICAgUHlPYmplY3QgKnYsICp1OwogICAgIGNoYXIgKmJ1ZjsKICAgICBjaGFyICpwOwogICAgIGNvbnN0IGNoYXIgKmVuZDsKIAotICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKSB7Ci0gICAgICAgIHUgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCi0gICAgICAgIGlmIChsZW4gPiBQWV9TSVpFX01BWCAvIDYpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgLyogIsOkIiAoMiBieXRlcykgbWF5IGJlY29tZSAiXFUwMDAwMDBFNCIgKDEwIGJ5dGVzKSwgb3IgMTo1Ci0gICAgICAgICAgICJcw6QiICgzIGJ5dGVzKSBtYXkgYmVjb21lICJcdTAwNWNcVTAwMDAwMEU0IiAoMTYgYnl0ZXMpLCBvciB+MTo2ICovCi0gICAgICAgIHUgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbGVuICogNik7Ci0gICAgICAgIGlmICh1ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgcCA9IGJ1ZiA9IFB5Qnl0ZXNfQXNTdHJpbmcodSk7Ci0gICAgICAgIGVuZCA9IHMgKyBsZW47Ci0gICAgICAgIHdoaWxlIChzIDwgZW5kKSB7Ci0gICAgICAgICAgICBpZiAoKnMgPT0gJ1xcJykgewotICAgICAgICAgICAgICAgICpwKysgPSAqcysrOwotICAgICAgICAgICAgICAgIGlmICgqcyAmIDB4ODApIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHAsICJ1MDA1YyIpOwotICAgICAgICAgICAgICAgICAgICBwICs9IDU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCpzICYgMHg4MCkgeyAvKiBYWFggaW5lZmZpY2llbnQgKi8KLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdzsKLSAgICAgICAgICAgICAgICBpbnQga2luZDsKLSAgICAgICAgICAgICAgICB2b2lkICpkYXRhOwotICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLCBpOwotICAgICAgICAgICAgICAgIHcgPSBkZWNvZGVfdXRmOChjLCAmcywgZW5kKTsKLSAgICAgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh3KTsKLSAgICAgICAgICAgICAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodyk7Ci0gICAgICAgICAgICAgICAgbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgodyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X1VDUzQgY2hyID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYocCwgIlxcVSUwOHgiLCBjaHIpOwotICAgICAgICAgICAgICAgICAgICBwICs9IDEwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBTaG91bGQgYmUgaW1wb3NzaWJsZSB0byBvdmVyZmxvdyAqLwotICAgICAgICAgICAgICAgIGFzc2VydChwIC0gYnVmIDw9IFB5X1NJWkUodSkpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnArKyA9ICpzKys7CisgICAgLyogY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi8KKyAgICBpZiAobGVuID4gU0laRV9NQVggLyA2KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiAiw6QiICgyIGJ5dGVzKSBtYXkgYmVjb21lICJcVTAwMDAwMEU0IiAoMTAgYnl0ZXMpLCBvciAxOjUKKyAgICAgICAiXMOkIiAoMyBieXRlcykgbWF5IGJlY29tZSAiXHUwMDVjXFUwMDAwMDBFNCIgKDE2IGJ5dGVzKSwgb3IgfjE6NiAqLworICAgIHUgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbGVuICogNik7CisgICAgaWYgKHUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IGJ1ZiA9IFB5Qnl0ZXNfQXNTdHJpbmcodSk7CisgICAgZW5kID0gcyArIGxlbjsKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICBpZiAoKnMgPT0gJ1xcJykgeworICAgICAgICAgICAgKnArKyA9ICpzKys7CisgICAgICAgICAgICBpZiAoKnMgJiAweDgwKSB7CisgICAgICAgICAgICAgICAgc3RyY3B5KHAsICJ1MDA1YyIpOworICAgICAgICAgICAgICAgIHAgKz0gNTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBsZW4gPSBwIC0gYnVmOwotICAgICAgICBzID0gYnVmOworICAgICAgICBpZiAoKnMgJiAweDgwKSB7IC8qIFhYWCBpbmVmZmljaWVudCAqLworICAgICAgICAgICAgUHlPYmplY3QgKnc7CisgICAgICAgICAgICBpbnQga2luZDsKKyAgICAgICAgICAgIHZvaWQgKmRhdGE7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwgaTsKKyAgICAgICAgICAgIHcgPSBkZWNvZGVfdXRmOChjLCAmcywgZW5kKTsKKyAgICAgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodyk7CisgICAgICAgICAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodyk7CisgICAgICAgICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh3KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIFB5X1VDUzQgY2hyID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CisgICAgICAgICAgICAgICAgc3ByaW50ZihwLCAiXFxVJTA4eCIsIGNocik7CisgICAgICAgICAgICAgICAgcCArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNob3VsZCBiZSBpbXBvc3NpYmxlIHRvIG92ZXJmbG93ICovCisgICAgICAgICAgICBhc3NlcnQocCAtIGJ1ZiA8PSBQeV9TSVpFKHUpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwKysgPSAqcysrOworICAgICAgICB9CiAgICAgfQotICAgIGlmIChyYXdtb2RlKQotICAgICAgICB2ID0gUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUocywgbGVuLCBOVUxMKTsKLSAgICBlbHNlCi0gICAgICAgIHYgPSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZShzLCBsZW4sIE5VTEwpOworICAgIGxlbiA9IHAgLSBidWY7CisgICAgcyA9IGJ1ZjsKKworICAgIHYgPSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZShzLCBsZW4sIE5VTEwpOwogICAgIFB5X1hERUNSRUYodSk7CiAgICAgcmV0dXJuIHY7CiB9CiAKLS8qIHMgaXMgYSBQeXRob24gc3RyaW5nIGxpdGVyYWwsIGluY2x1ZGluZyB0aGUgYnJhY2tldGluZyBxdW90ZSBjaGFyYWN0ZXJzLAotICogYW5kIHIgJi9vciBiIHByZWZpeGVzIChpZiBhbnkpLCBhbmQgZW1iZWRkZWQgZXNjYXBlIHNlcXVlbmNlcyAoaWYgYW55KS4KLSAqIHBhcnNlc3RyIHBhcnNlcyBpdCwgYW5kIHJldHVybnMgdGhlIGRlY29kZWQgUHl0aG9uIHN0cmluZyBvYmplY3QuCi0gKi8KKy8qIENvbXBpbGUgdGhpcyBleHByZXNzaW9uIGluIHRvIGFuIGV4cHJfdHkuIFdlIGtub3cgdGhhdCB3ZSBjYW4KKyAgIHRlbXBvcmFyaWx5IG1vZGlmeSB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhpcyBzdHJpbmcKKyAgIChpdCdzICd7JyksIGFuZCB3ZSBrbm93IHdlIGNhbiB0ZW1wb3JhcmlseSBtb2RpZnkgdGhlIGNoYXJhY3RlcgorICAgYWZ0ZXIgdGhpcyBzdHJpbmcgKGl0IGlzIGEgJ30nKS4gIExldmVyYWdlIHRoaXMgdG8gY3JlYXRlIGEKKyAgIHN1Yi1zdHJpbmcgd2l0aCBlbm91Z2ggcm9vbSBmb3IgdXMgdG8gYWRkIHBhcmVucyBhcm91bmQgdGhlCisgICBleHByZXNzaW9uLiBUaGlzIGlzIHRvIGFsbG93IHN0cmluZ3Mgd2l0aCBlbWJlZGRlZCBuZXdsaW5lcywgZm9yCisgICBleGFtcGxlLiAqLworc3RhdGljIGV4cHJfdHkKK2ZzdHJpbmdfY29tcGlsZV9leHByKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgZXhwcl9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZXhwcl9lbmQsIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCisKK3sKKyAgICBQeUNvbXBpbGVyRmxhZ3MgY2Y7CisgICAgbW9kX3R5IG1vZDsKKyAgICBjaGFyICp1dGZfZXhwcjsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfVUNTNCBlbmRfY2ggPSAtMTsKKyAgICBpbnQgYWxsX3doaXRlc3BhY2U7CisgICAgUHlPYmplY3QgKnN1YiA9IE5VTEw7CisKKyAgICAvKiBXZSBvbmx5IGRlY3JlZiBzdWIgaWYgd2UgYWxsb2NhdGVkIGl0IHdpdGggYSBQeVVuaWNvZGVfU3Vic3RyaW5nLgorICAgICAgIGRlY3JlZl9zdWIgcmVjb3JkcyB0aGF0LiAqLworICAgIGludCBkZWNyZWZfc3ViID0gMDsKKworICAgIGFzc2VydChzdHIpOworCisgICAgYXNzZXJ0KGV4cHJfc3RhcnQgPj0gMCAmJiBleHByX3N0YXJ0IDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CisgICAgYXNzZXJ0KGV4cHJfZW5kID49IDAgJiYgZXhwcl9lbmQgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKKyAgICBhc3NlcnQoZXhwcl9lbmQgPj0gZXhwcl9zdGFydCk7CisKKyAgICAvKiBUaGVyZSBoYXMgdG8gYmUgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBvbiBlYWNoIHNpZGUgb2YgdGhlCisgICAgICAgZXhwcmVzc2lvbiBpbnNpZGUgdGhpcyBzdHIuIFRoaXMgd2lsbCBoYXZlIGJlZW4gY2F1Z2h0IGJlZm9yZQorICAgICAgIHdlJ3JlIGNhbGxlZC4gKi8KKyAgICBhc3NlcnQoZXhwcl9zdGFydCA+PSAxKTsKKyAgICBhc3NlcnQoZXhwcl9lbmQgPD0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKS0xKTsKKworICAgIC8qIElmIHRoZSBzdWJzdHJpbmcgaXMgYWxsIHdoaXRlc3BhY2UsIGl0J3MgYW4gZXJyb3IuIFdlIG5lZWQgdG8KKyAgICAgICAgY2F0Y2ggdGhpcyBoZXJlLCBhbmQgbm90IHdoZW4gd2UgY2FsbCBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nLAorICAgICAgICBiZWNhdXNlIHR1cm5pbmcgdGhlIGV4cHJlc3Npb24gJycgaW4gdG8gJygpJyB3b3VsZCBnbyBmcm9tCisgICAgICAgIGJlaW5nIGludmFsaWQgdG8gdmFsaWQuICovCisgICAgLyogTm90ZSB0aGF0IHRoaXMgY29kZSBzYXlzIGFuIGVtcHR5IHN0cmluZyBpcyBhbGwKKyAgICAgICAgd2hpdGVzcGFjZS4gVGhhdCdzIGltcG9ydGFudC4gVGhlcmUncyBhIHRlc3QgZm9yIGl0OiBmJ3t9Jy4gKi8KKyAgICBhbGxfd2hpdGVzcGFjZSA9IDE7CisgICAgZm9yIChpID0gZXhwcl9zdGFydDsgaSA8IGV4cHJfZW5kOyBpKyspIHsKKyAgICAgICAgaWYgKCFQeV9VTklDT0RFX0lTU1BBQ0UoUHlVbmljb2RlX1JFQURfQ0hBUihzdHIsIGkpKSkgeworICAgICAgICAgICAgYWxsX3doaXRlc3BhY2UgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFsbF93aGl0ZXNwYWNlKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWQiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBJZiB0aGUgc3Vic3RyaW5nIHdpbGwgYmUgdGhlIGVudGlyZSBzb3VyY2Ugc3RyaW5nLCB3ZSBjYW4ndCB1c2UKKyAgICAgICAgUHlVbmljb2RlX1N1YnN0cmluZywgc2luY2UgaXQgd2lsbCByZXR1cm4gYW5vdGhlciByZWZlcmVuY2UgdG8KKyAgICAgICAgb3VyIG9yaWdpbmFsIHN0cmluZy4gQmVjYXVzZSB3ZSdyZSBtb2RpZnlpbmcgdGhlIHN0cmluZyBpbgorICAgICAgICBwbGFjZSwgdGhhdCdzIGEgbm8tbm8uIFNvLCBkZXRlY3QgdGhhdCBjYXNlIGFuZCBqdXN0IHVzZSBvdXIKKyAgICAgICAgc3RyaW5nIGRpcmVjdGx5LiAqLworCisgICAgaWYgKGV4cHJfc3RhcnQtMSA9PSAwICYmIGV4cHJfZW5kKzEgPT0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkgeworICAgICAgICAvKiBJZiBzdHIgaXMgd2VsbCBmb3JtZWQsIHRoZW4gdGhlIGZpcnN0IGFuZCBsYXN0IGNoYXJzIG11c3QKKyAgICAgICAgICAgYmUgJ3snIGFuZCAnfScsIHJlc3BlY3RpdmVseS4gQnV0LCBpZiB0aGVyZSdzIGEgc3ludGF4CisgICAgICAgICAgIGVycm9yLCBmb3IgZXhhbXBsZSBmJ3szIScsIHRoZW4gdGhlIGxhc3QgY2hhciB3b24ndCBiZSBhCisgICAgICAgICAgIGNsb3NpbmcgYnJhY2UuIFNvLCByZW1lbWJlciB0aGUgbGFzdCBjaGFyYWN0ZXIgd2UgcmVhZCBpbgorICAgICAgICAgICBvcmRlciBmb3IgdXMgdG8gcmVzdG9yZSBpdC4gKi8KKyAgICAgICAgZW5kX2NoID0gUHlVbmljb2RlX1JlYWRDaGFyKHN0ciwgZXhwcl9lbmQtZXhwcl9zdGFydCsxKTsKKyAgICAgICAgYXNzZXJ0KGVuZF9jaCAhPSAoUHlfVUNTNCktMSk7CisKKyAgICAgICAgLyogSW4gYWxsIGNhc2VzLCBob3dldmVyLCBzdGFydF9jaCBtdXN0IGJlICd7Jy4gKi8KKyAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9SZWFkQ2hhcihzdHIsIDApID09ICd7Jyk7CisKKyAgICAgICAgc3ViID0gc3RyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENyZWF0ZSBhIHN1YnN0cmluZyBvYmplY3QuIEl0IG11c3QgYmUgYSBuZXcgb2JqZWN0LCB3aXRoCisgICAgICAgICAgIHJlZmNvdW50PT0xLCBzbyB0aGF0IHdlIGNhbiBtb2RpZnkgaXQuICovCisgICAgICAgIHN1YiA9IFB5VW5pY29kZV9TdWJzdHJpbmcoc3RyLCBleHByX3N0YXJ0LTEsIGV4cHJfZW5kKzEpOworICAgICAgICBpZiAoIXN1YikKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGFzc2VydChzdWIgIT0gc3RyKTsgIC8qIE1ha2Ugc3VyZSBpdCdzIGEgbmV3IHN0cmluZy4gKi8KKyAgICAgICAgZGVjcmVmX3N1YiA9IDE7ICAgICAgLyogUmVtZW1iZXIgdG8gZGVhbGxvY2F0ZSBpdCBvbiBlcnJvci4gKi8KKyAgICB9CisKKyAgICAvKiBQdXQgKCkgYXJvdW5kIHRoZSBleHByZXNzaW9uLiAqLworICAgIGlmIChQeVVuaWNvZGVfV3JpdGVDaGFyKHN1YiwgMCwgJygnKSA8IDAgfHwKKyAgICAgICAgUHlVbmljb2RlX1dyaXRlQ2hhcihzdWIsIGV4cHJfZW5kLWV4cHJfc3RhcnQrMSwgJyknKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBObyBuZWVkIHRvIGZyZWUgdGhlIG1lbW9yeSByZXR1cm5lZCBoZXJlOiBpdCdzIG1hbmFnZWQgYnkgdGhlCisgICAgICAgc3RyaW5nLiAqLworICAgIHV0Zl9leHByID0gUHlVbmljb2RlX0FzVVRGOChzdWIpOworICAgIGlmICghdXRmX2V4cHIpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBjZi5jZl9mbGFncyA9IFB5Q0ZfT05MWV9BU1Q7CisgICAgbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyh1dGZfZXhwciwgIjxmc3RyaW5nPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ldmFsX2lucHV0LCAmY2YsIGMtPmNfYXJlbmEpOworICAgIGlmICghbW9kKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKHN1YiAhPSBzdHIpCisgICAgICAgIC8qIENsZWFyIGluc3RlYWQgb2YgZGVjcmVmIGluIGNhc2Ugd2UgZXZlciBtb2RpZnkgdGhpcyBjb2RlIHRvIGNoYW5nZQorICAgICAgICAgICB0aGUgZXJyb3IgaGFuZGxpbmc6IHRoaXMgaXMgc2FmZXN0IGJlY2F1c2UgdGhlIFhERUNSRUYgd29uJ3QgdHJ5CisgICAgICAgICAgIGFuZCBkZWNyZWYgaXQgd2hlbiBpdCdzIE5VTEwuICovCisgICAgICAgIC8qIE5vIG5lZWQgdG8gcmVzdG9yZSB0aGUgY2hhcnMgaW4gc3ViLCBzaW5jZSB3ZSBrbm93IGl0J3MgZ2V0dGluZworICAgICAgICAgICByZWFkeSB0byBnZXQgZGVsZXRlZCAocmVmY291bnQgbXVzdCBiZSAxLCBzaW5jZSB3ZSBnb3QgYSBuZXcgc3RyaW5nCisgICAgICAgICAgIGluIFB5VW5pY29kZV9TdWJzdHJpbmcpLiAqLworICAgICAgICBQeV9DTEVBUihzdWIpOworICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoIWRlY3JlZl9zdWIpOworICAgICAgICBhc3NlcnQoZW5kX2NoICE9IChQeV9VQ1M0KS0xKTsKKyAgICAgICAgLyogUmVzdG9yZSBzdHIsIHdoaWNoIHdlIGVhcmxpZXIgbW9kaWZpZWQgZGlyZWN0bHkuICovCisgICAgICAgIGlmIChQeVVuaWNvZGVfV3JpdGVDaGFyKHN0ciwgMCwgJ3snKSA8IDAgfHwKKyAgICAgICAgICAgIFB5VW5pY29kZV9Xcml0ZUNoYXIoc3RyLCBleHByX2VuZC1leHByX3N0YXJ0KzEsIGVuZF9jaCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIG1vZC0+di5FeHByZXNzaW9uLmJvZHk7CisKK2Vycm9yOgorICAgIC8qIE9ubHkgZGVjcmVmIHN1YiBpZiBpdCB3YXMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8gU3ViU3RyaW5nLiAqLworICAgIGlmIChkZWNyZWZfc3ViKQorICAgICAgICBQeV9YREVDUkVGKHN1Yik7CisKKyAgICBpZiAoZW5kX2NoICE9IChQeV9VQ1M0KS0xKSB7CisgICAgICAgIC8qIFdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgbW9kaWZpZWQgc3RyLiBNYWtlIHN1cmUgdGhhdCdzIHRoZQorICAgICAgICAgICBjYXNlOiBzdHIgd2lsbCBiZSBlcXVhbCB0byBzdWIuICovCisgICAgICAgIGlmIChzdHIgPT0gc3ViKSB7CisgICAgICAgICAgICAvKiBEb24ndCBjaGVjayB0aGUgZXJyb3IsIGJlY2F1c2Ugd2UndmUgYWxyZWFkeSBzZXQgdGhlCisgICAgICAgICAgICAgICBlcnJvciBzdGF0ZSAodGhhdCdzIHdoeSB3ZSdyZSBpbiAnZXJyb3InLCBhZnRlcgorICAgICAgICAgICAgICAgYWxsKS4gKi8KKyAgICAgICAgICAgIFB5VW5pY29kZV9Xcml0ZUNoYXIoc3RyLCAwLCAneycpOworICAgICAgICAgICAgUHlVbmljb2RlX1dyaXRlQ2hhcihzdHIsIGV4cHJfZW5kLWV4cHJfc3RhcnQrMSwgZW5kX2NoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIC0xIG9uIGVycm9yLgorCisgICBSZXR1cm4gMCBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGxpdGVyYWwuCisKKyAgIFJldHVybiAxIGlmIHdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXRlcmFsLCBidXQgd2Ugd2FudAorICAgdGhlIGNhbGxlciB0byBwcm9jZXNzIHRoZSBsaXRlcmFsIHVwIHRvIHRoaXMgcG9pbnQuIFVzZWQgZm9yCisgICBkb3VibGVkIGJyYWNlcy4KKyovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfbGl0ZXJhbChQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIFB5T2JqZWN0ICoqbGl0ZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgIGludCByZWN1cnNlX2x2bCwgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKK3sKKyAgICAvKiBHZXQgYW55IGxpdGVyYWwgc3RyaW5nLiBJdCBlbmRzIHdoZW4gd2UgaGl0IGFuIHVuLWRvdWJsZWQgYnJhY2UsIG9yIHRoZQorICAgICAgIGVuZCBvZiB0aGUgc3RyaW5nLiAqLworCisgICAgUHlfc3NpemVfdCBsaXRlcmFsX3N0YXJ0LCBsaXRlcmFsX2VuZDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cik7CisgICAgdm9pZCAqZGF0YSA9IFB5VW5pY29kZV9EQVRBKHN0cik7CisKKyAgICBhc3NlcnQoKmxpdGVyYWwgPT0gTlVMTCk7CisKKyAgICBsaXRlcmFsX3N0YXJ0ID0gKm9mczsKKyAgICBmb3IgKDsgKm9mcyA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cik7ICpvZnMgKz0gMSkgeworICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcyk7CisgICAgICAgIGlmIChjaCA9PSAneycgfHwgY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAvKiBDaGVjayBmb3IgZG91YmxlZCBicmFjZXMsIGJ1dCBvbmx5IGF0IHRoZSB0b3AgbGV2ZWwuIElmCisgICAgICAgICAgICAgICB3ZSBjaGVja2VkIGF0IGV2ZXJ5IGxldmVsLCB0aGVuIGYnezA6ezN9fScgd291bGQgZmFpbAorICAgICAgICAgICAgICAgd2l0aCB0aGUgdHdvIGNsb3NpbmcgYnJhY2VzLiAqLworICAgICAgICAgICAgaWYgKHJlY3Vyc2VfbHZsID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKm9mcyArIDEgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICYmCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMgKyAxKSA9PSBjaCkgeworICAgICAgICAgICAgICAgICAgICAvKiBXZSdyZSBnb2luZyB0byB0ZWxsIHRoZSBjYWxsZXIgdGhhdCB0aGUgbGl0ZXJhbCBlbmRzCisgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGJ1dCB0aGF0IHRoZXkgc2hvdWxkIGNvbnRpbnVlIHNjYW5uaW5nLiBCdXQgYWxzbworICAgICAgICAgICAgICAgICAgICAgICBza2lwIG92ZXIgdGhlIHNlY29uZCBicmFjZSB3aGVuIHdlIHJlc3VtZSBzY2FubmluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbF9lbmQgPSAqb2ZzICsgMTsKKyAgICAgICAgICAgICAgICAgICAgKm9mcyArPSAyOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogV2hlcmUgYSBzaW5nbGUgJ3snIGlzIHRoZSBzdGFydCBvZiBhIG5ldyBleHByZXNzaW9uLCBhCisgICAgICAgICAgICAgICAgICAgc2luZ2xlICd9JyBpcyBub3QgYWxsb3dlZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHNpbmdsZSAnfScgaXMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV2UncmUgZWl0aGVyIGF0IGEgJ3snLCB3aGljaCBtZWFucyB3ZSdyZSBzdGFydGluZyBhbm90aGVyCisgICAgICAgICAgICAgICBleHByZXNzaW9uOyBvciBhICd9Jywgd2hpY2ggbWVhbnMgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgICAgICAgICBmLXN0cmluZyAoZm9yIGEgbmVzdGVkIGZvcm1hdF9zcGVjKS4gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGxpdGVyYWxfZW5kID0gKm9mczsKKworICAgIGFzc2VydCgqb2ZzID09IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgfHwKKyAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJ3snIHx8CisgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICd9Jyk7Citkb25lOgorICAgIGlmIChsaXRlcmFsX3N0YXJ0ICE9IGxpdGVyYWxfZW5kKSB7CisgICAgICAgICpsaXRlcmFsID0gUHlVbmljb2RlX1N1YnN0cmluZyhzdHIsIGxpdGVyYWxfc3RhcnQsIGxpdGVyYWxfZW5kKTsKKyAgICAgICAgaWYgKCEqbGl0ZXJhbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGJlY2F1c2UgcGFyc2luZyBpcyByZWN1cnNpdmUuICovCitzdGF0aWMgZXhwcl90eQorZnN0cmluZ19wYXJzZShQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbik7CisKKy8qIFBhcnNlIHRoZSBmLXN0cmluZyBzdHIsIHN0YXJ0aW5nIGF0IG9mcy4gV2Uga25vdyAqb2ZzIHN0YXJ0cyBhbgorICAgZXhwcmVzc2lvbiAoc28gaXQgbXVzdCBiZSBhICd7JykuIFJldHVybnMgdGhlIEZvcm1hdHRlZFZhbHVlIG5vZGUsCisgICB3aGljaCBpbmNsdWRlcyB0aGUgZXhwcmVzc2lvbiwgY29udmVyc2lvbiBjaGFyYWN0ZXIsIGFuZAorICAgZm9ybWF0X3NwZWMgZXhwcmVzc2lvbi4KKworICAgTm90ZSB0aGF0IEkgZG9uJ3QgZG8gYSBwZXJmZWN0IGpvYiBoZXJlOiBJIGRvbid0IG1ha2Ugc3VyZSB0aGF0IGEKKyAgIGNsb3NpbmcgYnJhY2UgZG9lc24ndCBtYXRjaCBhbiBvcGVuaW5nIHBhcmVuLCBmb3IgZXhhbXBsZS4gSXQKKyAgIGRvZXNuJ3QgbmVlZCB0byBlcnJvciBvbiBhbGwgaW52YWxpZCBleHByZXNzaW9ucywganVzdCBjb3JyZWN0bHkKKyAgIGZpbmQgdGhlIGVuZCBvZiBhbGwgdmFsaWQgb25lcy4gQW55IGVycm9ycyBpbnNpZGUgdGhlIGV4cHJlc3Npb24KKyAgIHdpbGwgYmUgY2F1Z2h0IHdoZW4gd2UgcGFyc2UgaXQgbGF0ZXIuICovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfZXhwcihQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgIGV4cHJfdHkgKmV4cHJlc3Npb24sIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgLyogUmV0dXJuIC0xIG9uIGVycm9yLCBlbHNlIDAuICovCisKKyAgICBQeV9zc2l6ZV90IGV4cHJfc3RhcnQ7CisgICAgUHlfc3NpemVfdCBleHByX2VuZDsKKyAgICBleHByX3R5IHNpbXBsZV9leHByZXNzaW9uOworICAgIGV4cHJfdHkgZm9ybWF0X3NwZWMgPSBOVUxMOyAvKiBPcHRpb25hbCBmb3JtYXQgc3BlY2lmaWVyLiAqLworICAgIFB5X1VDUzQgY29udmVyc2lvbiA9IC0xOyAvKiBUaGUgY29udmVyc2lvbiBjaGFyLiAtMSBpZiBub3Qgc3BlY2lmaWVkLiAqLworCisgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyKTsKKyAgICB2b2lkICpkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyKTsKKworICAgIC8qIDAgaWYgd2UncmUgbm90IGluIGEgc3RyaW5nLCBlbHNlIHRoZSBxdW90ZSBjaGFyIHdlJ3JlIHRyeWluZyB0bworICAgICAgIG1hdGNoIChzaW5nbGUgb3IgZG91YmxlIHF1b3RlKS4gKi8KKyAgICBQeV9VQ1M0IHF1b3RlX2NoYXIgPSAwOworCisgICAgLyogSWYgd2UncmUgaW5zaWRlIGEgc3RyaW5nLCAxPW5vcm1hbCwgMz10cmlwbGUtcXVvdGVkLiAqLworICAgIGludCBzdHJpbmdfdHlwZSA9IDA7CisKKyAgICAvKiBLZWVwIHRyYWNrIG9mIG5lc3RpbmcgbGV2ZWwgZm9yIGJyYWNlcy9wYXJlbnMvYnJhY2tldHMgaW4KKyAgICAgICBleHByZXNzaW9ucy4gKi8KKyAgICBQeV9zc2l6ZV90IG5lc3RlZF9kZXB0aCA9IDA7CisKKyAgICAvKiBDYW4gb25seSBuZXN0IG9uZSBsZXZlbCBkZWVwLiAqLworICAgIGlmIChyZWN1cnNlX2x2bCA+PSAyKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGV4cHJlc3Npb25zIG5lc3RlZCB0b28gZGVlcGx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBUaGUgZmlyc3QgY2hhciBtdXN0IGJlIGEgbGVmdCBicmFjZSwgb3Igd2Ugd291bGRuJ3QgaGF2ZSBnb3R0ZW4KKyAgICAgICBoZXJlLiBTa2lwIG92ZXIgaXQuICovCisgICAgYXNzZXJ0KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICd7Jyk7CisgICAgKm9mcyArPSAxOworCisgICAgZXhwcl9zdGFydCA9ICpvZnM7CisgICAgZm9yICg7ICpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpOyAqb2ZzICs9IDEpIHsKKyAgICAgICAgUHlfVUNTNCBjaDsKKworICAgICAgICAvKiBMb29wIGludmFyaWFudHMuICovCisgICAgICAgIGFzc2VydChuZXN0ZWRfZGVwdGggPj0gMCk7CisgICAgICAgIGFzc2VydCgqb2ZzID49IGV4cHJfc3RhcnQpOworICAgICAgICBpZiAocXVvdGVfY2hhcikKKyAgICAgICAgICAgIGFzc2VydChzdHJpbmdfdHlwZSA9PSAxIHx8IHN0cmluZ190eXBlID09IDMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoc3RyaW5nX3R5cGUgPT0gMCk7CisKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKTsKKyAgICAgICAgaWYgKHF1b3RlX2NoYXIpIHsKKyAgICAgICAgICAgIC8qIFdlJ3JlIGluc2lkZSBhIHN0cmluZy4gU2VlIGlmIHdlJ3JlIGF0IHRoZSBlbmQuICovCisgICAgICAgICAgICAvKiBUaGlzIGNvZGUgbmVlZHMgdG8gaW1wbGVtZW50IHRoZSBzYW1lIG5vbi1lcnJvciBsb2dpYworICAgICAgICAgICAgICAgYXMgdG9rX2dldCBmcm9tIHRva2VuaXplci5jLCBhdCB0aGUgbGV0dGVyX3F1b3RlCisgICAgICAgICAgICAgICBsYWJlbC4gVG8gYWN0dWFsbHkgc2hhcmUgdGhhdCBjb2RlIHdvdWxkIGJlIGEKKyAgICAgICAgICAgICAgIG5pZ2h0bWFyZS4gQnV0LCBpdCdzIHVubGlrZWx5IHRvIGNoYW5nZSBhbmQgaXMgc21hbGwsCisgICAgICAgICAgICAgICBzbyBkdXBsaWNhdGUgaXQgaGVyZS4gTm90ZSB3ZSBkb24ndCBuZWVkIHRvIGNhdGNoIGFsbAorICAgICAgICAgICAgICAgb2YgdGhlIGVycm9ycywgc2luY2UgdGhleSdsbCBiZSBjYXVnaHQgd2hlbiBwYXJzaW5nIHRoZQorICAgICAgICAgICAgICAgZXhwcmVzc2lvbi4gV2UganVzdCBuZWVkIHRvIG1hdGNoIHRoZSBub24tZXJyb3IKKyAgICAgICAgICAgICAgIGNhc2VzLiBUaHVzIHdlIGNhbiBpZ25vcmUgXG4gaW4gc2luZ2xlLXF1b3RlZCBzdHJpbmdzLAorICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUuIE9yIG5vbi10ZXJtaW5hdGVkIHN0cmluZ3MuICovCisgICAgICAgICAgICBpZiAoY2ggPT0gcXVvdGVfY2hhcikgeworICAgICAgICAgICAgICAgIC8qIERvZXMgdGhpcyBtYXRjaCB0aGUgc3RyaW5nX3R5cGUgKHNpbmdsZSBvciB0cmlwbGUKKyAgICAgICAgICAgICAgICAgICBxdW90ZWQpPyAqLworICAgICAgICAgICAgICAgIGlmIChzdHJpbmdfdHlwZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqb2ZzKzIgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzEpID09IGNoICYmCisgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzIpID09IGNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSdyZSBhdCB0aGUgZW5kIG9mIGEgdHJpcGxlIHF1b3RlZCBzdHJpbmcuICovCisgICAgICAgICAgICAgICAgICAgICAgICAqb2ZzICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogV2UncmUgYXQgdGhlIGVuZCBvZiBhIG5vcm1hbCBzdHJpbmcuICovCisgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAwOworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdlJ3JlIGluc2lkZSBhIHN0cmluZywgYW5kIG5vdCBmaW5pc2hlZCB3aXRoIHRoZQorICAgICAgICAgICAgICAgc3RyaW5nLiBJZiB0aGlzIGlzIGEgYmFja3NsYXNoLCBza2lwIHRoZSBuZXh0IGNoYXIgKGl0CisgICAgICAgICAgICAgICBtaWdodCBiZSBhbiBlbmQgcXVvdGUgdGhhdCBuZWVkcyBza2lwcGluZykuIE90aGVyd2lzZSwKKyAgICAgICAgICAgICAgIGp1c3QgY29uc3VtZSB0aGlzIGNoYXJhY3RlciBub3JtYWxseS4gKi8KKyAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmICpvZnMrMSA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpIHsKKyAgICAgICAgICAgICAgICAvKiBKdXN0IHNraXAgdGhlIG5leHQgY2hhciwgd2hhdGV2ZXIgaXQgaXMuICovCisgICAgICAgICAgICAgICAgKm9mcyArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcJycgfHwgY2ggPT0gJyInKSB7CisgICAgICAgICAgICAvKiBJcyB0aGlzIGEgdHJpcGxlIHF1b3RlZCBzdHJpbmc/ICovCisgICAgICAgICAgICBpZiAoKm9mcysyIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMrMSkgPT0gY2ggJiYKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzIpID09IGNoKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGUgPSAzOworICAgICAgICAgICAgICAgICpvZnMgKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogU3RhcnQgb2YgYSBub3JtYWwgc3RyaW5nLiAqLworICAgICAgICAgICAgICAgIHN0cmluZ190eXBlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFN0YXJ0IGxvb2tpbmcgZm9yIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gKi8KKyAgICAgICAgICAgIHF1b3RlX2NoYXIgPSBjaDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnWycgfHwgY2ggPT0gJ3snIHx8IGNoID09ICcoJykgeworICAgICAgICAgICAgbmVzdGVkX2RlcHRoKys7CisgICAgICAgIH0gZWxzZSBpZiAobmVzdGVkX2RlcHRoICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAoY2ggPT0gJ10nIHx8IGNoID09ICd9JyB8fCBjaCA9PSAnKScpKSB7CisgICAgICAgICAgICBuZXN0ZWRfZGVwdGgtLTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIycpIHsKKyAgICAgICAgICAgIC8qIEVycm9yOiBjYW4ndCBpbmNsdWRlIGEgY29tbWVudCBjaGFyYWN0ZXIsIGluc2lkZSBwYXJlbnMKKyAgICAgICAgICAgICAgIG9yIG5vdC4gKi8KKyAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmcgY2Fubm90IGluY2x1ZGUgJyMnIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobmVzdGVkX2RlcHRoID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAoY2ggPT0gJyEnIHx8IGNoID09ICc6JyB8fCBjaCA9PSAnfScpKSB7CisgICAgICAgICAgICAvKiBGaXJzdCwgdGVzdCBmb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiAiIT0iLiBTaW5jZSAnPScgaXMKKyAgICAgICAgICAgICAgIG5vdCBhbiBhbGxvd2VkIGNvbnZlcnNpb24gY2hhcmFjdGVyLCBub3RoaW5nIGlzIGxvc3QgaW4KKyAgICAgICAgICAgICAgIHRoaXMgdGVzdC4gKi8KKyAgICAgICAgICAgIGlmIChjaCA9PSAnIScgJiYgKm9mcysxIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcysxKSA9PSAnPScpCisgICAgICAgICAgICAgICAgLyogVGhpcyBpc24ndCBhIGNvbnZlcnNpb24gY2hhcmFjdGVyLCBqdXN0IGNvbnRpbnVlLiAqLworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvKiBOb3JtYWwgd2F5IG91dCBvZiB0aGlzIGxvb3AuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEp1c3QgY29uc3VtZSB0aGlzIGNoYXIgYW5kIGxvb3AgYXJvdW5kLiAqLworICAgICAgICB9CisgICAgfQorICAgIGV4cHJfZW5kID0gKm9mczsKKyAgICAvKiBJZiB3ZSBsZWF2ZSB0aGlzIGxvb3AgaW4gYSBzdHJpbmcgb3Igd2l0aCBtaXNtYXRjaGVkIHBhcmVucywgd2UKKyAgICAgICBkb24ndCBjYXJlLiBXZSdsbCBnZXQgYSBzeW50YXggZXJyb3Igd2hlbiBjb21waWxpbmcgdGhlCisgICAgICAgZXhwcmVzc2lvbi4gQnV0LCB3ZSBjYW4gcHJvZHVjZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLCBzbworICAgICAgIGxldCdzIGp1c3QgZG8gdGhhdC4qLworICAgIGlmIChxdW90ZV9jaGFyKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHVudGVybWluYXRlZCBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobmVzdGVkX2RlcHRoKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IG1pc21hdGNoZWQgJygnLCAneycsIG9yICdbJyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgZ290byB1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc7CisKKyAgICAvKiBDb21waWxlIHRoZSBleHByZXNzaW9uIGFzIHNvb24gYXMgcG9zc2libGUsIHNvIHdlIHNob3cgZXJyb3JzCisgICAgICAgcmVsYXRlZCB0byB0aGUgZXhwcmVzc2lvbiBiZWZvcmUgZXJyb3JzIHJlbGF0ZWQgdG8gdGhlCisgICAgICAgY29udmVyc2lvbiBvciBmb3JtYXRfc3BlYy4gKi8KKyAgICBzaW1wbGVfZXhwcmVzc2lvbiA9IGZzdHJpbmdfY29tcGlsZV9leHByKHN0ciwgZXhwcl9zdGFydCwgZXhwcl9lbmQsIGMsIG4pOworICAgIGlmICghc2ltcGxlX2V4cHJlc3Npb24pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIENoZWNrIGZvciBhIGNvbnZlcnNpb24gY2hhciwgaWYgcHJlc2VudC4gKi8KKyAgICBpZiAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJyEnKSB7CisgICAgICAgICpvZnMgKz0gMTsKKyAgICAgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgICAgIGdvdG8gdW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOworCisgICAgICAgIGNvbnZlcnNpb24gPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKTsKKyAgICAgICAgKm9mcyArPSAxOworCisgICAgICAgIC8qIFZhbGlkYXRlIHRoZSBjb252ZXJzaW9uLiAqLworICAgICAgICBpZiAoIShjb252ZXJzaW9uID09ICdzJyB8fCBjb252ZXJzaW9uID09ICdyJworICAgICAgICAgICAgICB8fCBjb252ZXJzaW9uID09ICdhJykpIHsKKyAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGludmFsaWQgY29udmVyc2lvbiBjaGFyYWN0ZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJ3MnLCAncicsIG9yICdhJyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIHRoZSBmb3JtYXQgc3BlYywgaWYgcHJlc2VudC4gKi8KKyAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKQorICAgICAgICBnb3RvIHVuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzsKKyAgICBpZiAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJzonKSB7CisgICAgICAgICpvZnMgKz0gMTsKKyAgICAgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgICAgIGdvdG8gdW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOworCisgICAgICAgIC8qIFBhcnNlIHRoZSBmb3JtYXQgc3BlYy4gKi8KKyAgICAgICAgZm9ybWF0X3NwZWMgPSBmc3RyaW5nX3BhcnNlKHN0ciwgb2ZzLCByZWN1cnNlX2x2bCsxLCBjLCBuKTsKKyAgICAgICAgaWYgKCFmb3JtYXRfc3BlYykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpIHx8CisgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgIT0gJ30nKQorICAgICAgICBnb3RvIHVuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzsKKworICAgIC8qIFdlJ3JlIGF0IGEgcmlnaHQgYnJhY2UuIENvbnN1bWUgaXQuICovCisgICAgYXNzZXJ0KCpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKKyAgICBhc3NlcnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJ30nKTsKKyAgICAqb2ZzICs9IDE7CisKKyAgICAvKiBBbmQgbm93IGNyZWF0ZSB0aGUgRm9ybWF0dGVkVmFsdWUgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhpcyBlbnRpcmUKKyAgICAgICBleHByZXNzaW9uIHdpdGggdGhlIGNvbnZlcnNpb24gYW5kIGZvcm1hdCBzcGVjLiAqLworICAgICpleHByZXNzaW9uID0gRm9ybWF0dGVkVmFsdWUoc2ltcGxlX2V4cHJlc3Npb24sIChpbnQpY29udmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOworICAgIGlmICghKmV4cHJlc3Npb24pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworCit1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc6CisgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIpOworICAgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJuIC0xIG9uIGVycm9yLgorCisgICBSZXR1cm4gMCBpZiB3ZSBoYXZlIGEgbGl0ZXJhbCAocG9zc2libGUgemVybyBsZW5ndGgpIGFuZCBhbgorICAgZXhwcmVzc2lvbiAoemVybyBsZW5ndGggaWYgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorCisgICBSZXR1cm4gMSBpZiB3ZSBoYXZlIGEgbGl0ZXJhbCwgYnV0IG5vIGV4cHJlc3Npb24sIGFuZCB3ZSB3YW50IHRoZQorICAgY2FsbGVyIHRvIGNhbGwgdXMgYWdhaW4uIFRoaXMgaXMgdXNlZCB0byBkZWFsIHdpdGggZG91YmxlZAorICAgYnJhY2VzLgorCisgICBXaGVuIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc3RyaW5nICdhe3tiezB9YycsIHRoaXMgZnVuY3Rpb24KKyAgIHdpbGwgcmV0dXJuOgorCisgICAxLiB0aGUgbGl0ZXJhbCAnYXsnIHdpdGggbm8gZXhwcmVzc2lvbiwgYW5kIGEgcmV0dXJuIHZhbHVlCisgICAgICBvZiAxLiBEZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlcmUncyBubyBleHByZXNzaW9uLCB0aGUgcmV0dXJuCisgICAgICB2YWx1ZSBvZiAxIG1lYW5zIHdlJ3JlIG5vdCBmaW5pc2hlZCB5ZXQuCisKKyAgIDIuIHRoZSBsaXRlcmFsICdiJyBhbmQgdGhlIGV4cHJlc3Npb24gJzAnLCB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mCisgICAgICAwLiBUaGUgZmFjdCB0aGF0IHRoZXJlJ3MgYW4gZXhwcmVzc2lvbiBtZWFucyB3ZSdyZSBub3QgZmluaXNoZWQuCisKKyAgIDMuIGxpdGVyYWwgJ2MnIHdpdGggbm8gZXhwcmVzc2lvbiBhbmQgYSByZXR1cm4gdmFsdWUgb2YgMC4gVGhlCisgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIDAgd2l0aCBubyBleHByZXNzaW9uIG1lYW5zCisgICAgICB3ZSdyZSBmaW5pc2hlZC4KKyovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfbGl0ZXJhbF9hbmRfZXhwcihQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqbGl0ZXJhbCwgZXhwcl90eSAqZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgaW50IHJlc3VsdDsKKworICAgIGFzc2VydCgqbGl0ZXJhbCA9PSBOVUxMICYmICpleHByZXNzaW9uID09IE5VTEwpOworCisgICAgLyogR2V0IGFueSBsaXRlcmFsIHN0cmluZy4gKi8KKyAgICByZXN1bHQgPSBmc3RyaW5nX2ZpbmRfbGl0ZXJhbChzdHIsIG9mcywgbGl0ZXJhbCwgcmVjdXJzZV9sdmwsIGMsIG4pOworICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgYXNzZXJ0KHJlc3VsdCA9PSAwIHx8IHJlc3VsdCA9PSAxKTsKKworICAgIGlmIChyZXN1bHQgPT0gMSkKKyAgICAgICAgLyogV2UgaGF2ZSBhIGxpdGVyYWwsIGJ1dCBkb24ndCBsb29rIGF0IHRoZSBleHByZXNzaW9uLiAqLworICAgICAgICByZXR1cm4gMTsKKworICAgIGFzc2VydCgqb2ZzIDw9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOworCisgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSB8fAorICAgICAgICBQeVVuaWNvZGVfUkVBRF9DSEFSKHN0ciwgKm9mcykgPT0gJ30nKQorICAgICAgICAvKiBXZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgb3IgdGhlIGVuZCBvZiBhIG5lc3RlZAorICAgICAgICAgICBmLXN0cmluZzogbm8gZXhwcmVzc2lvbi4gVGhlIHRvcC1sZXZlbCBlcnJvciBjYXNlIHdoZXJlIHdlCisgICAgICAgICAgIGV4cGVjdCB0byBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgYnV0IHdlJ3JlIGF0IGEgJ30nIGlzCisgICAgICAgICAgIGhhbmRsZWQgbGF0ZXIuICovCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogV2UgbXVzdCBub3cgYmUgdGhlIHN0YXJ0IG9mIGFuIGV4cHJlc3Npb24sIG9uIGEgJ3snLiAqLworICAgIGFzc2VydCgqb2ZzIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICBQeVVuaWNvZGVfUkVBRF9DSEFSKHN0ciwgKm9mcykgPT0gJ3snKTsKKworICAgIGlmIChmc3RyaW5nX2ZpbmRfZXhwcihzdHIsIG9mcywgcmVjdXJzZV9sdmwsIGV4cHJlc3Npb24sIGMsIG4pIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBQeV9DTEVBUigqbGl0ZXJhbCk7CisgICAgcmV0dXJuIC0xOworfQorCisjZGVmaW5lIEVYUFJMSVNUX05fQ0FDSEVEICA2NAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogSW5jcmVtZW50YWxseSBidWlsZCBhbiBhcnJheSBvZiBleHByX3R5LCBzbyBiZSB1c2VkIGluIGFuCisgICAgICAgYXNkbF9zZXEuIENhY2hlIHNvbWUgc21hbGwgYnV0IHJlYXNvbmFibHkgc2l6ZWQgbnVtYmVyIG9mCisgICAgICAgZXhwcl90eSdzLCBhbmQgdGhlbiBhZnRlciB0aGF0IHN0YXJ0IGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcsCisgICAgICAgZG91YmxpbmcgdGhlIG51bWJlciBhbGxvY2F0ZWQgZWFjaCB0aW1lLiBOb3RlIHRoYXQgdGhlIGYtc3RyaW5nCisgICAgICAgZid7MH1hezF9JyBjb250YWlucyAzIGV4cHJfdHknczogMiBGb3JtYXR0ZWRWYWx1ZSdzLCBhbmQgb25lCisgICAgICAgU3RyIGZvciB0aGUgbGl0ZXJhbCAnYScuIFNvIHlvdSBhZGQgZXhwcl90eSdzIGFib3V0IHR3aWNlIGFzCisgICAgICAgZmFzdCBhcyB5b3UgYWRkIGV4cmVzc2lvbnMgaW4gYW4gZi1zdHJpbmcuICovCisKKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsgIC8qIE51bWJlciB3ZSd2ZSBhbGxvY2F0ZWQuICovCisgICAgUHlfc3NpemVfdCBzaXplOyAgICAgICAvKiBOdW1iZXIgd2UndmUgdXNlZC4gKi8KKyAgICBleHByX3R5ICAgICpwOyAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSB3ZSdyZSBhY3R1YWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcuIFdpbGwgcG9pbnQgdG8gJ2RhdGEnIHVudGlsIHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCBkeW5hbWljYWxseSBhbGxvY2F0aW5nLiAqLworICAgIGV4cHJfdHkgICAgZGF0YVtFWFBSTElTVF9OX0NBQ0hFRF07Cit9IEV4cHJMaXN0OworCisjaWZkZWYgTkRFQlVHCisjZGVmaW5lIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCkKKyNlbHNlCitzdGF0aWMgdm9pZAorRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhFeHByTGlzdCAqbCkKK3sKKyAgICAvKiBDaGVjayBvdXIgaW52YXJpYW50cy4gTWFrZSBzdXJlIHRoaXMgb2JqZWN0IGlzICJsaXZlIiwgYW5kCisgICAgICAgaGFzbid0IGJlZW4gZGVhbGxvY2F0ZWQuICovCisgICAgYXNzZXJ0KGwtPnNpemUgPj0gMCk7CisgICAgYXNzZXJ0KGwtPnAgIT0gTlVMTCk7CisgICAgaWYgKGwtPnNpemUgPD0gRVhQUkxJU1RfTl9DQUNIRUQpCisgICAgICAgIGFzc2VydChsLT5kYXRhID09IGwtPnApOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitFeHByTGlzdF9Jbml0KEV4cHJMaXN0ICpsKQoreworICAgIGwtPmFsbG9jYXRlZCA9IEVYUFJMSVNUX05fQ0FDSEVEOworICAgIGwtPnNpemUgPSAwOworCisgICAgLyogVW50aWwgd2Ugc3RhcnQgYWxsb2NhdGluZyBkeW5hbWljYWxseSwgcCBwb2ludHMgdG8gZGF0YS4gKi8KKyAgICBsLT5wID0gbC0+ZGF0YTsKKworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7Cit9CisKK3N0YXRpYyBpbnQKK0V4cHJMaXN0X0FwcGVuZChFeHByTGlzdCAqbCwgZXhwcl90eSBleHApCit7CisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhsKTsKKyAgICBpZiAobC0+c2l6ZSA+PSBsLT5hbGxvY2F0ZWQpIHsKKyAgICAgICAgLyogV2UgbmVlZCB0byBhbGxvYyAob3IgcmVhbGxvYykgdGhlIG1lbW9yeS4gKi8KKyAgICAgICAgUHlfc3NpemVfdCBuZXdfc2l6ZSA9IGwtPmFsbG9jYXRlZCAqIDI7CisKKyAgICAgICAgLyogU2VlIGlmIHdlJ3ZlIGV2ZXIgYWxsb2NhdGVkIGFueXRoaW5nIGR5bmFtaWNhbGx5LiAqLworICAgICAgICBpZiAobC0+cCA9PSBsLT5kYXRhKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICAvKiBXZSdyZSBzdGlsbCB1c2luZyB0aGUgY2FjaGVkIGRhdGEuIFN3aXRjaCB0bworICAgICAgICAgICAgICAgYWxsb2MtaW5nLiAqLworICAgICAgICAgICAgbC0+cCA9IFB5TWVtX1Jhd01hbGxvYyhzaXplb2YoZXhwcl90eSkgKiBuZXdfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWwtPnApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgLyogQ29weSB0aGUgY2FjaGVkIGRhdGEgaW50byB0aGUgbmV3IGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsLT5zaXplOyBpKyspCisgICAgICAgICAgICAgICAgbC0+cFtpXSA9IGwtPmRhdGFbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBKdXN0IHJlYWxsb2MuICovCisgICAgICAgICAgICBleHByX3R5ICp0bXAgPSBQeU1lbV9SYXdSZWFsbG9jKGwtPnAsIHNpemVvZihleHByX3R5KSAqIG5ld19zaXplKTsKKyAgICAgICAgICAgIGlmICghdG1wKSB7CisgICAgICAgICAgICAgICAgUHlNZW1fUmF3RnJlZShsLT5wKTsKKyAgICAgICAgICAgICAgICBsLT5wID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsLT5wID0gdG1wOworICAgICAgICB9CisKKyAgICAgICAgbC0+YWxsb2NhdGVkID0gbmV3X3NpemU7CisgICAgICAgIGFzc2VydChsLT5hbGxvY2F0ZWQgPT0gMiAqIGwtPnNpemUpOworICAgIH0KKworICAgIGwtPnBbbC0+c2l6ZSsrXSA9IGV4cDsKKworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitFeHByTGlzdF9EZWFsbG9jKEV4cHJMaXN0ICpsKQoreworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7CisKKyAgICAvKiBJZiB0aGVyZSdzIGJlZW4gYW4gZXJyb3IsIG9yIHdlJ3ZlIG5ldmVyIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCwKKyAgICAgICBkbyBub3RoaW5nLiAqLworICAgIGlmICghbC0+cCB8fCBsLT5wID09IGwtPmRhdGEpIHsKKyAgICAgICAgLyogRG8gbm90aGluZy4gKi8KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSBoYXZlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gRnJlZSB0aGUgbWVtb3J5LiAqLworICAgICAgICBQeU1lbV9SYXdGcmVlKGwtPnApOworICAgIH0KKyAgICBsLT5wID0gTlVMTDsKKyAgICBsLT5zaXplID0gLTE7Cit9CisKK3N0YXRpYyBhc2RsX3NlcSAqCitFeHByTGlzdF9GaW5pc2goRXhwckxpc3QgKmwsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGFzZGxfc2VxICpzZXE7CisKKyAgICBFeHByTGlzdF9jaGVja19pbnZhcmlhbnRzKGwpOworCisgICAgLyogQWxsb2NhdGUgdGhlIGFzZGxfc2VxIGFuZCBjb3B5IHRoZSBleHByZXNzaW9ucyBpbiB0byBpdC4gKi8KKyAgICBzZXEgPSBfUHlfYXNkbF9zZXFfbmV3KGwtPnNpemUsIGFyZW5hKTsKKyAgICBpZiAoc2VxKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGwtPnNpemU7IGkrKykKKyAgICAgICAgICAgIGFzZGxfc2VxX1NFVChzZXEsIGksIGwtPnBbaV0pOworICAgIH0KKyAgICBFeHByTGlzdF9EZWFsbG9jKGwpOworICAgIHJldHVybiBzZXE7Cit9CisKKy8qIFRoZSBGc3RyaW5nUGFyc2VyIGlzIGRlc2lnbmVkIHRvIGFkZCBhIG1peCBvZiBzdHJpbmdzIGFuZAorICAgZi1zdHJpbmdzLCBhbmQgY29uY2F0IHRoZW0gdG9nZXRoZXIgYXMgbmVlZGVkLiBVbHRpbWF0ZWx5LCBpdAorICAgZ2VuZXJhdGVzIGFuIGV4cHJfdHkuICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3QgKmxhc3Rfc3RyOworICAgIEV4cHJMaXN0IGV4cHJfbGlzdDsKK30gRnN0cmluZ1BhcnNlcjsKKworI2lmZGVmIE5ERUJVRworI2RlZmluZSBGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoc3RhdGUpCisjZWxzZQorc3RhdGljIHZvaWQKK0ZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhGc3RyaW5nUGFyc2VyICpzdGF0ZSkKK3sKKyAgICBpZiAoc3RhdGUtPmxhc3Rfc3RyKQorICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RhdGUtPmxhc3Rfc3RyKSk7CisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cygmc3RhdGUtPmV4cHJfbGlzdCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK0ZzdHJpbmdQYXJzZXJfSW5pdChGc3RyaW5nUGFyc2VyICpzdGF0ZSkKK3sKKyAgICBzdGF0ZS0+bGFzdF9zdHIgPSBOVUxMOworICAgIEV4cHJMaXN0X0luaXQoJnN0YXRlLT5leHByX2xpc3QpOworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitGc3RyaW5nUGFyc2VyX0RlYWxsb2MoRnN0cmluZ1BhcnNlciAqc3RhdGUpCit7CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKworICAgIFB5X1hERUNSRUYoc3RhdGUtPmxhc3Rfc3RyKTsKKyAgICBFeHByTGlzdF9EZWFsbG9jKCZzdGF0ZS0+ZXhwcl9saXN0KTsKK30KKworLyogTWFrZSBhIFN0ciBub2RlLCBidXQgZGVjcmVmIHRoZSBQeVVuaWNvZGUgb2JqZWN0IGJlaW5nIGFkZGVkLiAqLworc3RhdGljIGV4cHJfdHkKK21ha2Vfc3RyX25vZGVfYW5kX2RlbChQeU9iamVjdCAqKnN0ciwgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSogbikKK3sKKyAgICBQeU9iamVjdCAqcyA9ICpzdHI7CisgICAgKnN0ciA9IE5VTEw7CisgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVja0V4YWN0KHMpKTsKKyAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCBzKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFN0cihzLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7Cit9CisKKy8qIEFkZCBhIG5vbi1mLXN0cmluZyAodGhhdCBpcywgYSByZWd1bGFyIGxpdGVyYWwgc3RyaW5nKS4gc3RyIGlzCisgICBkZWNyZWYnZC4gKi8KK3N0YXRpYyBpbnQKK0ZzdHJpbmdQYXJzZXJfQ29uY2F0QW5kRGVsKEZzdHJpbmdQYXJzZXIgKnN0YXRlLCBQeU9iamVjdCAqc3RyKQoreworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisKKyAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RyKSk7CisKKyAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSA9PSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIXN0YXRlLT5sYXN0X3N0cikgeworICAgICAgICAvKiBXZSBkaWRuJ3QgaGF2ZSBhIHN0cmluZyBiZWZvcmUsIHNvIGp1c3QgcmVtZW1iZXIgdGhpcyBvbmUuICovCisgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IHN0cjsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBDb25jYXRlbmF0ZSB0aGlzIHdpdGggdGhlIHByZXZpb3VzIHN0cmluZy4gKi8KKyAgICAgICAgUHlVbmljb2RlX0FwcGVuZEFuZERlbCgmc3RhdGUtPmxhc3Rfc3RyLCBzdHIpOworICAgICAgICBpZiAoIXN0YXRlLT5sYXN0X3N0cikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogUGFyc2UgYW4gZi1zdHJpbmcuIFRoZSBmLXN0cmluZyBpcyBpbiBzdHIsIHN0YXJ0aW5nIGF0IG9mcywgd2l0aCBubyAnZicKKyAgIG9yIHF1b3Rlcy4gc3RyIGlzIG5vdCBkZWNyZWYnZCwgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiBpdCdzIHVzZWQgZWxzZXdoZXJlLgorICAgQW5kIGlmIHdlJ3JlIG9ubHkgbG9va2luZyBhdCBhIHBhcnQgb2YgYSBzdHJpbmcsIHRoZW4gZGVjcmVmJ2luZyBpcworICAgZGVmaW5pdGVseSBub3QgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvISAqLworc3RhdGljIGludAorRnN0cmluZ1BhcnNlcl9Db25jYXRGc3RyaW5nKEZzdHJpbmdQYXJzZXIgKnN0YXRlLCBQeU9iamVjdCAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKm9mcywgaW50IHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKworICAgIC8qIFBhcnNlIHRoZSBmLXN0cmluZy4gKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBQeU9iamVjdCAqbGl0ZXJhbCA9IE5VTEw7CisgICAgICAgIGV4cHJfdHkgZXhwcmVzc2lvbiA9IE5VTEw7CisKKyAgICAgICAgLyogSWYgdGhlcmUncyBhIHplcm8gbGVuZ3RoIGxpdGVyYWwgaW4gZnJvbnQgb2YgdGhlCisgICAgICAgICAgIGV4cHJlc3Npb24sIGxpdGVyYWwgd2lsbCBiZSBOVUxMLiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mCisgICAgICAgICAgIHRoZSBmLXN0cmluZywgZXhwcmVzc2lvbiB3aWxsIGJlIE5VTEwgKHVubGVzcyByZXN1bHQgPT0gMSwKKyAgICAgICAgICAgc2VlIGJlbG93KS4gKi8KKyAgICAgICAgaW50IHJlc3VsdCA9IGZzdHJpbmdfZmluZF9saXRlcmFsX2FuZF9leHByKHN0ciwgb2ZzLCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXRlcmFsLCAmZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsIG4pOworICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAvKiBBZGQgdGhlIGxpdGVyYWwsIGlmIGFueS4gKi8KKyAgICAgICAgaWYgKCFsaXRlcmFsKSB7CisgICAgICAgICAgICAvKiBEbyBub3RoaW5nLiBKdXN0IGxlYXZlIGxhc3Rfc3RyIGFsb25lIChhbmQgcG9zc2libHkKKyAgICAgICAgICAgICAgIE5VTEwpLiAqLworICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IGxpdGVyYWw7CisgICAgICAgICAgICBsaXRlcmFsID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFdlIGhhdmUgYSBsaXRlcmFsLCBjb25jYXRlbmF0ZSBpdC4gKi8KKyAgICAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfR0VUX0xFTkdUSChsaXRlcmFsKSAhPSAwKTsKKyAgICAgICAgICAgIGlmIChGc3RyaW5nUGFyc2VyX0NvbmNhdEFuZERlbChzdGF0ZSwgbGl0ZXJhbCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGxpdGVyYWwgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGFzc2VydCghc3RhdGUtPmxhc3Rfc3RyIHx8CisgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdGF0ZS0+bGFzdF9zdHIpICE9IDApOworCisgICAgICAgIC8qIFdlJ3ZlIGRlYWx0IHdpdGggdGhlIGxpdGVyYWwgbm93LiBJdCBjYW4ndCBiZSBsZWFrZWQgb24gZnVydGhlcgorICAgICAgICAgICBlcnJvcnMuICovCisgICAgICAgIGFzc2VydChsaXRlcmFsID09IE5VTEwpOworCisgICAgICAgIC8qIFNlZSBpZiB3ZSBzaG91bGQganVzdCBsb29wIGFyb3VuZCB0byBnZXQgdGhlIG5leHQgbGl0ZXJhbAorICAgICAgICAgICBhbmQgZXhwcmVzc2lvbiwgd2hpbGUgaWdub3JpbmcgdGhlIGV4cHJlc3Npb24gdGhpcworICAgICAgICAgICB0aW1lLiBUaGlzIGlzIHVzZWQgZm9yIHVuLWRvdWJsaW5nIGJyYWNlcywgYXMgYW4KKyAgICAgICAgICAgb3B0aW1pemF0aW9uLiAqLworICAgICAgICBpZiAocmVzdWx0ID09IDEpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoIWV4cHJlc3Npb24pCisgICAgICAgICAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhpcyBmLXN0cmluZy4gKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIFdlIGtub3cgd2UgaGF2ZSBhbiBleHByZXNzaW9uLiBDb252ZXJ0IGFueSBleGlzdGluZyBzdHJpbmcKKyAgICAgICAgICAgdG8gYSBTdHIgbm9kZS4gKi8KKyAgICAgICAgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIC8qIERvIG5vdGhpbmcuIE5vIHByZXZpb3VzIGxpdGVyYWwuICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDb252ZXJ0IHRoZSBleGlzdGluZyBsYXN0X3N0ciBsaXRlcmFsIHRvIGEgU3RyIG5vZGUuICovCisgICAgICAgICAgICBleHByX3R5IHN0ciA9IG1ha2Vfc3RyX25vZGVfYW5kX2RlbCgmc3RhdGUtPmxhc3Rfc3RyLCBjLCBuKTsKKyAgICAgICAgICAgIGlmICghc3RyIHx8IEV4cHJMaXN0X0FwcGVuZCgmc3RhdGUtPmV4cHJfbGlzdCwgc3RyKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEV4cHJMaXN0X0FwcGVuZCgmc3RhdGUtPmV4cHJfbGlzdCwgZXhwcmVzc2lvbikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGFzc2VydCgqb2ZzIDw9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOworCisgICAgLyogSWYgcmVjdXJzZV9sdmwgaXMgemVybywgdGhlbiB3ZSBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgc3RyaW5nLiBPdGhlcndpc2UsIHdlIG11c3QgYmUgYXQgYSByaWdodCBicmFjZS4gKi8KKworICAgIGlmIChyZWN1cnNlX2x2bCA9PSAwICYmICpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyZWN1cnNlX2x2bCAhPSAwICYmIFB5VW5pY29kZV9SRUFEX0NIQVIoc3RyLCAqb2ZzKSAhPSAnfScpIHsKKyAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogQ29udmVydCB0aGUgcGFydGlhbCBzdGF0ZSByZWZsZWN0ZWQgaW4gbGFzdF9zdHIgYW5kIGV4cHJfbGlzdCB0byBhbgorICAgZXhwcl90eS4gVGhlIGV4cHJfdHkgY2FuIGJlIGEgU3RyLCBvciBhIEpvaW5lZFN0ci4gKi8KK3N0YXRpYyBleHByX3R5CitGc3RyaW5nUGFyc2VyX0ZpbmlzaChGc3RyaW5nUGFyc2VyICpzdGF0ZSwgc3RydWN0IGNvbXBpbGluZyAqYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgKm4pCit7CisgICAgYXNkbF9zZXEgKnNlcTsKKworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisKKyAgICAvKiBJZiB3ZSdyZSBqdXN0IGEgY29uc3RhbnQgc3RyaW5nIHdpdGggbm8gZXhwcmVzc2lvbnMsIHJldHVybgorICAgICAgIHRoYXQuICovCisgICAgaWYoc3RhdGUtPmV4cHJfbGlzdC5zaXplID09IDApIHsKKyAgICAgICAgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIC8qIENyZWF0ZSBhIHplcm8gbGVuZ3RoIHN0cmluZy4gKi8KKyAgICAgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmICghc3RhdGUtPmxhc3Rfc3RyKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ha2Vfc3RyX25vZGVfYW5kX2RlbCgmc3RhdGUtPmxhc3Rfc3RyLCBjLCBuKTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgYSBTdHIgbm9kZSBvdXQgb2YgbGFzdF9zdHIsIGlmIG5lZWRlZC4gSXQgd2lsbCBiZSB0aGUKKyAgICAgICBsYXN0IG5vZGUgaW4gb3VyIGV4cHJlc3Npb24gbGlzdC4gKi8KKyAgICBpZiAoc3RhdGUtPmxhc3Rfc3RyKSB7CisgICAgICAgIGV4cHJfdHkgc3RyID0gbWFrZV9zdHJfbm9kZV9hbmRfZGVsKCZzdGF0ZS0+bGFzdF9zdHIsIGMsIG4pOworICAgICAgICBpZiAoIXN0ciB8fCBFeHByTGlzdF9BcHBlbmQoJnN0YXRlLT5leHByX2xpc3QsIHN0cikgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgLyogVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGZyZWVkLiAqLworICAgIGFzc2VydChzdGF0ZS0+bGFzdF9zdHIgPT0gTlVMTCk7CisKKyAgICBzZXEgPSBFeHByTGlzdF9GaW5pc2goJnN0YXRlLT5leHByX2xpc3QsIGMtPmNfYXJlbmEpOworICAgIGlmICghc2VxKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgLyogSWYgdGhlcmUncyBvbmx5IG9uZSBleHByZXNzaW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSwgd2UgbmVlZAorICAgICAgIHRvIGpvaW4gdGhlbSB0b2dldGhlci4gKi8KKyAgICBpZiAoc2VxLT5zaXplID09IDEpCisgICAgICAgIHJldHVybiBzZXEtPmVsZW1lbnRzWzBdOworCisgICAgcmV0dXJuIEpvaW5lZFN0cihzZXEsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKworZXJyb3I6CisgICAgRnN0cmluZ1BhcnNlcl9EZWFsbG9jKHN0YXRlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogR2l2ZW4gYW4gZi1zdHJpbmcgKHdpdGggbm8gJ2YnIG9yIHF1b3RlcykgdGhhdCdzIGluIHN0ciBzdGFydGluZyBhdAorICAgb2ZzLCBwYXJzZSBpdCBpbnRvIGFuIGV4cHJfdHkuIFJldHVybiBOVUxMIG9uIGVycm9yLiBEb2VzIG5vdAorICAgZGVjcmVmIHN0ci4gKi8KK3N0YXRpYyBleHByX3R5Citmc3RyaW5nX3BhcnNlKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgKm9mcywgaW50IHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQoreworICAgIEZzdHJpbmdQYXJzZXIgc3RhdGU7CisKKyAgICBGc3RyaW5nUGFyc2VyX0luaXQoJnN0YXRlKTsKKyAgICBpZiAoRnN0cmluZ1BhcnNlcl9Db25jYXRGc3RyaW5nKCZzdGF0ZSwgc3RyLCBvZnMsIHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywgbikgPCAwKSB7CisgICAgICAgIEZzdHJpbmdQYXJzZXJfRGVhbGxvYygmc3RhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gRnN0cmluZ1BhcnNlcl9GaW5pc2goJnN0YXRlLCBjLCBuKTsKK30KKworLyogbiBpcyBhIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbCwgaW5jbHVkaW5nIHRoZSBicmFja2V0aW5nIHF1b3RlCisgICBjaGFyYWN0ZXJzLCBhbmQgciwgYiwgdSwgJi9vciBmIHByZWZpeGVzIChpZiBhbnkpLCBhbmQgZW1iZWRkZWQKKyAgIGVzY2FwZSBzZXF1ZW5jZXMgKGlmIGFueSkuIHBhcnNlc3RyIHBhcnNlcyBpdCwgYW5kIHJldHVybnMgdGhlCisgICBkZWNvZGVkIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiAgSWYgdGhlIHN0cmluZyBpcyBhbiBmLXN0cmluZywgc2V0CisgICAqZm1vZGUgYW5kIHJldHVybiB0aGUgdW5wYXJzZWQgc3RyaW5nIG9iamVjdC4KKyovCiBzdGF0aWMgUHlPYmplY3QgKgotcGFyc2VzdHIoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbiwgaW50ICpieXRlc21vZGUpCitwYXJzZXN0cihzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuLCBpbnQgKmJ5dGVzbW9kZSwgaW50ICpmbW9kZSkKIHsKICAgICBzaXplX3QgbGVuOwogICAgIGNvbnN0IGNoYXIgKnMgPSBTVFIobik7CiAgICAgaW50IHF1b3RlID0gUHlfQ0hBUk1BU0soKnMpOwogICAgIGludCByYXdtb2RlID0gMDsKLSAgICBpbnQgbmVlZF9lbmNvZGluZzsKICAgICBpZiAoUHlfSVNBTFBIQShxdW90ZSkpIHsKICAgICAgICAgd2hpbGUgKCEqYnl0ZXNtb2RlIHx8ICFyYXdtb2RlKSB7CiAgICAgICAgICAgICBpZiAocXVvdGUgPT0gJ2InIHx8IHF1b3RlID09ICdCJykgewpAQCAtNDAyNCwxNSArNTAxMSwyNCBAQAogICAgICAgICAgICAgICAgIHF1b3RlID0gKisrczsKICAgICAgICAgICAgICAgICByYXdtb2RlID0gMTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1b3RlID09ICdmJyB8fCBxdW90ZSA9PSAnRicpIHsKKyAgICAgICAgICAgICAgICBxdW90ZSA9ICorK3M7CisgICAgICAgICAgICAgICAgKmZtb2RlID0gMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorICAgIGlmICgqZm1vZGUgJiYgKmJ5dGVzbW9kZSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGlmIChxdW90ZSAhPSAnXCcnICYmIHF1b3RlICE9ICdcIicpIHsKICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICAvKiBTa2lwIHRoZSBsZWFkaW5nIHF1b3RlIGNoYXIuICovCiAgICAgcysrOwogICAgIGxlbiA9IHN0cmxlbihzKTsKICAgICBpZiAobGVuID4gSU5UX01BWCkgewpAQCAtNDA0MSwyMiArNTAzNywzNiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKHNbLS1sZW5dICE9IHF1b3RlKSB7CisgICAgICAgIC8qIExhc3QgcXVvdGUgY2hhciBtdXN0IG1hdGNoIHRoZSBmaXJzdC4gKi8KICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAobGVuID49IDQgJiYgc1swXSA9PSBxdW90ZSAmJiBzWzFdID09IHF1b3RlKSB7CisgICAgICAgIC8qIEEgdHJpcGxlIHF1b3RlZCBzdHJpbmcuIFdlJ3ZlIGFscmVhZHkgc2tpcHBlZCBvbmUgcXVvdGUgYXQKKyAgICAgICAgICAgdGhlIHN0YXJ0IGFuZCBvbmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiBOb3cgc2tpcCB0aGUKKyAgICAgICAgICAgdHdvIGF0IHRoZSBzdGFydC4gKi8KICAgICAgICAgcyArPSAyOwogICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgLyogQW5kIGNoZWNrIHRoYXQgdGhlIGxhc3QgdHdvIG1hdGNoLiAqLwogICAgICAgICBpZiAoc1stLWxlbl0gIT0gcXVvdGUgfHwgc1stLWxlbl0gIT0gcXVvdGUpIHsKICAgICAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCEqYnl0ZXNtb2RlICYmICFyYXdtb2RlKSB7Ci0gICAgICAgIHJldHVybiBkZWNvZGVfdW5pY29kZShjLCBzLCBsZW4sIHJhd21vZGUsIGMtPmNfZW5jb2RpbmcpOworCisgICAgLyogVGVtcG9yYXJ5IGhhY2s6IGlmIHRoaXMgaXMgYW4gZi1zdHJpbmcsIG5vIGJhY2tzbGFzaGVzIGFyZSBhbGxvd2VkLiAqLworICAgIC8qIFNlZSBpc3N1ZSAyNzkyMS4gKi8KKyAgICBpZiAoKmZtb2RlICYmIHN0cmNocihzLCAnXFwnKSAhPSBOVUxMKSB7CisgICAgICAgIC8qIFN5bnRheCBlcnJvci4gQXQgYSBsYXRlciBkYXRlIGZpeCB0aGlzIHNvIGl0IG9ubHkgY2hlY2tzIGZvcgorICAgICAgICAgICBiYWNrc2xhc2hlcyB3aXRoaW4gdGhlIGJyYWNlcy4gKi8KKyAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJiYWNrc2xhc2hlcyBub3QgYWxsb3dlZCBpbiBmLXN0cmluZ3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCisgICAgLyogQXZvaWQgaW52b2tpbmcgZXNjYXBlIGRlY29kaW5nIHJvdXRpbmVzIGlmIHBvc3NpYmxlLiAqLworICAgIHJhd21vZGUgPSByYXdtb2RlIHx8IHN0cmNocihzLCAnXFwnKSA9PSBOVUxMOwogICAgIGlmICgqYnl0ZXNtb2RlKSB7Ci0gICAgICAgIC8qIERpc2FsbG93IG5vbi1hc2NpaSBjaGFyYWN0ZXJzIChidXQgbm90IGVzY2FwZXMpICovCisgICAgICAgIC8qIERpc2FsbG93IG5vbi1BU0NJSSBjaGFyYWN0ZXJzLiAqLwogICAgICAgICBjb25zdCBjaGFyICpjaDsKICAgICAgICAgZm9yIChjaCA9IHM7ICpjaDsgY2grKykgewogICAgICAgICAgICAgaWYgKFB5X0NIQVJNQVNLKCpjaCkgPj0gMHg4MCkgewpAQCAtNDA2NSw3MSArNTA3NSw5MyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIG5lZWRfZW5jb2RpbmcgPSAoISpieXRlc21vZGUgJiYgYy0+Y19lbmNvZGluZyAhPSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICBzdHJjbXAoYy0+Y19lbmNvZGluZywgInV0Zi04IikgIT0gMCk7Ci0gICAgaWYgKHJhd21vZGUgfHwgc3RyY2hyKHMsICdcXCcpID09IE5VTEwpIHsKLSAgICAgICAgaWYgKG5lZWRfZW5jb2RpbmcpIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICp2LCAqdSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIGxlbiwgTlVMTCk7Ci0gICAgICAgICAgICBpZiAodSA9PSBOVUxMIHx8ICEqYnl0ZXNtb2RlKQotICAgICAgICAgICAgICAgIHJldHVybiB1OwotICAgICAgICAgICAgdiA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwgYy0+Y19lbmNvZGluZywgTlVMTCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodSk7Ci0gICAgICAgICAgICByZXR1cm4gdjsKLSAgICAgICAgfSBlbHNlIGlmICgqYnl0ZXNtb2RlKSB7CisgICAgICAgIGlmIChyYXdtb2RlKQogICAgICAgICAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYy0+Y19lbmNvZGluZywgInV0Zi04IikgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVMYXRpbjEocywgbGVuLCBOVUxMKTsKLSAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlCeXRlc19EZWNvZGVFc2NhcGUocywgbGVuLCBOVUxMLCAvKiBpZ25vcmVkICovIDAsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyYXdtb2RlKQorICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwocywgbGVuLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZV91bmljb2RlX3dpdGhfZXNjYXBlcyhjLCBzLCBsZW4pOwogICAgIH0KLSAgICByZXR1cm4gUHlCeXRlc19EZWNvZGVFc2NhcGUocywgbGVuLCBOVUxMLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9lbmNvZGluZyA/IGMtPmNfZW5jb2RpbmcgOiBOVUxMKTsKIH0KIAotLyogQnVpbGQgYSBQeXRob24gc3RyaW5nIG9iamVjdCBvdXQgb2YgYSBTVFJJTkcrIGF0b20uICBUaGlzIHRha2VzIGNhcmUgb2YKLSAqIGNvbXBpbGUtdGltZSBsaXRlcmFsIGNhdGVuYXRpb24sIGNhbGxpbmcgcGFyc2VzdHIoKSBvbiBlYWNoIHBpZWNlLCBhbmQKLSAqIHBhc3RpbmcgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIHRvZ2V0aGVyLgotICovCi1zdGF0aWMgUHlPYmplY3QgKgotcGFyc2VzdHJwbHVzKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4sIGludCAqYnl0ZXNtb2RlKQorLyogQWNjZXB0cyBhIFNUUklORysgYXRvbSwgYW5kIHByb2R1Y2VzIGFuIGV4cHJfdHkgbm9kZS4gUnVuIHRocm91Z2gKKyAgIGVhY2ggU1RSSU5HIGF0b20sIGFuZCBwcm9jZXNzIGl0IGFzIG5lZWRlZC4gRm9yIGJ5dGVzLCBqdXN0CisgICBjb25jYXRlbmF0ZSB0aGVtIHRvZ2V0aGVyLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlIGEgQnl0ZXMgbm9kZS4gRm9yCisgICBub3JtYWwgc3RyaW5ncyBhbmQgZi1zdHJpbmdzLCBjb25jYXRlbmF0ZSB0aGVtIHRvZ2V0aGVyLiBUaGUgcmVzdWx0CisgICB3aWxsIGJlIGEgU3RyIG5vZGUgaWYgdGhlcmUgd2VyZSBubyBmLXN0cmluZ3M7IGEgRm9ybWF0dGVkVmFsdWUKKyAgIG5vZGUgaWYgdGhlcmUncyBqdXN0IGFuIGYtc3RyaW5nICh3aXRoIG5vIGxlYWRpbmcgb3IgdHJhaWxpbmcKKyAgIGxpdGVyYWxzKSwgb3IgYSBKb2luZWRTdHIgbm9kZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZi1zdHJpbmdzIG9yCisgICBhbnkgbGl0ZXJhbHMgaW52b2x2ZWQuICovCitzdGF0aWMgZXhwcl90eQorcGFyc2VzdHJwbHVzKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCiB7Ci0gICAgUHlPYmplY3QgKnY7CisgICAgaW50IGJ5dGVzbW9kZSA9IDA7CisgICAgUHlPYmplY3QgKmJ5dGVzX3N0ciA9IE5VTEw7CiAgICAgaW50IGk7Ci0gICAgUkVRKENISUxEKG4sIDApLCBTVFJJTkcpOwotICAgIHYgPSBwYXJzZXN0cihjLCBDSElMRChuLCAwKSwgYnl0ZXNtb2RlKTsKLSAgICBpZiAodiAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIFN0cmluZyBsaXRlcmFsIGNvbmNhdGVuYXRpb24gKi8KLSAgICAgICAgZm9yIChpID0gMTsgaSA8IE5DSChuKTsgaSsrKSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqczsKLSAgICAgICAgICAgIGludCBzdWJibSA9IDA7Ci0gICAgICAgICAgICBzID0gcGFyc2VzdHIoYywgQ0hJTEQobiwgaSksICZzdWJibSk7Ci0gICAgICAgICAgICBpZiAocyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgIGlmICgqYnl0ZXNtb2RlICE9IHN1YmJtKSB7Ci0gICAgICAgICAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJjYW5ub3QgbWl4IGJ5dGVzIGFuZCBub25ieXRlcyBsaXRlcmFscyIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisKKyAgICBGc3RyaW5nUGFyc2VyIHN0YXRlOworICAgIEZzdHJpbmdQYXJzZXJfSW5pdCgmc3RhdGUpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5DSChuKTsgaSsrKSB7CisgICAgICAgIGludCB0aGlzX2J5dGVzbW9kZSA9IDA7CisgICAgICAgIGludCB0aGlzX2Ztb2RlID0gMDsKKyAgICAgICAgUHlPYmplY3QgKnM7CisKKyAgICAgICAgUkVRKENISUxEKG4sIGkpLCBTVFJJTkcpOworICAgICAgICBzID0gcGFyc2VzdHIoYywgQ0hJTEQobiwgaSksICZ0aGlzX2J5dGVzbW9kZSwgJnRoaXNfZm1vZGUpOworICAgICAgICBpZiAoIXMpCisgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIC8qIENoZWNrIHRoYXQgd2UncmUgbm90IG1peGluZyBieXRlcyB3aXRoIHVuaWNvZGUuICovCisgICAgICAgIGlmIChpICE9IDAgJiYgYnl0ZXNtb2RlICE9IHRoaXNfYnl0ZXNtb2RlKSB7CisgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImNhbm5vdCBtaXggYnl0ZXMgYW5kIG5vbmJ5dGVzIGxpdGVyYWxzIik7CisgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGJ5dGVzbW9kZSA9IHRoaXNfYnl0ZXNtb2RlOworCisgICAgICAgIGFzc2VydChieXRlc21vZGUgPyBQeUJ5dGVzX0NoZWNrRXhhY3QocykgOiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChzKSk7CisKKyAgICAgICAgaWYgKGJ5dGVzbW9kZSkgeworICAgICAgICAgICAgLyogRm9yIGJ5dGVzLCBjb25jYXQgYXMgd2UgZ28uICovCisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogRmlyc3QgdGltZSwganVzdCByZW1lbWJlciB0aGlzIHZhbHVlLiAqLworICAgICAgICAgICAgICAgIGJ5dGVzX3N0ciA9IHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsKCZieXRlc19zdHIsIHMpOworICAgICAgICAgICAgICAgIGlmICghYnl0ZXNfc3RyKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2sodikgJiYgUHlCeXRlc19DaGVjayhzKSkgewotICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsKCZ2LCBzKTsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGVtcCA9IFB5VW5pY29kZV9Db25jYXQodiwgcyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgICAgICAgICB2ID0gdGVtcDsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodGhpc19mbW9kZSkgeworICAgICAgICAgICAgLyogVGhpcyBpcyBhbiBmLXN0cmluZy4gQ29uY2F0ZW5hdGUgYW5kIGRlY3JlZiBpdC4gKi8KKyAgICAgICAgICAgIFB5X3NzaXplX3Qgb2ZzID0gMDsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBGc3RyaW5nUGFyc2VyX0NvbmNhdEZzdHJpbmcoJnN0YXRlLCBzLCAmb2ZzLCAwLCBjLCBuKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIGEgcmVndWxhciBzdHJpbmcuIENvbmNhdGVuYXRlIGl0LiAqLworICAgICAgICAgICAgaWYgKEZzdHJpbmdQYXJzZXJfQ29uY2F0QW5kRGVsKCZzdGF0ZSwgcykgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHY7CisgICAgaWYgKGJ5dGVzbW9kZSkgeworICAgICAgICAvKiBKdXN0IHJldHVybiB0aGUgYnl0ZXMgb2JqZWN0IGFuZCB3ZSdyZSBkb25lLiAqLworICAgICAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCBieXRlc19zdHIpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHJldHVybiBCeXRlcyhieXRlc19zdHIsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICB9CiAKLSAgb25FcnJvcjoKLSAgICBQeV9YREVDUkVGKHYpOworICAgIC8qIFdlJ3JlIG5vdCBhIGJ5dGVzIHN0cmluZywgYnl0ZXNfc3RyIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gc2V0LiAqLworICAgIGFzc2VydChieXRlc19zdHIgPT0gTlVMTCk7CisKKyAgICByZXR1cm4gRnN0cmluZ1BhcnNlcl9GaW5pc2goJnN0YXRlLCBjLCBuKTsKKworZXJyb3I6CisgICAgUHlfWERFQ1JFRihieXRlc19zdHIpOworICAgIEZzdHJpbmdQYXJzZXJfRGVhbGxvYygmc3RhdGUpOwogICAgIHJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2JsdGlubW9kdWxlLmMgYi9QeXRob24vYmx0aW5tb2R1bGUuYwppbmRleCA5ZjVkYjJhLi5kYTlhZDU1IDEwMDY0NAotLS0gYS9QeXRob24vYmx0aW5tb2R1bGUuYworKysgYi9QeXRob24vYmx0aW5tb2R1bGUuYwpAQCAtMjEsMTYgKzIxLDE4IEBACiAgICBEb24ndCBmb3JnZXQgdG8gbW9kaWZ5IFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQoKSBpZiB5b3UgdG91Y2ggYW55IG9mIHRoZQogICAgdmFsdWVzIGZvciBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIQogKi8KLSNpZmRlZiBIQVZFX01CQ1MKLWNvbnN0IGNoYXIgKlB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgPSAibWJjcyI7CisjaWYgZGVmaW5lZChfX0FQUExFX18pCitjb25zdCBjaGFyICpQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nID0gInV0Zi04IjsKIGludCBQeV9IYXNGaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nID0gMTsKLSNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorI2VsaWYgZGVmaW5lZChNU19XSU5ET1dTKQorLyogbWF5IGJlIGNoYW5nZWQgYnkgaW5pdGZzZW5jb2RpbmcoKSwgYnV0IHNob3VsZCBuZXZlciBiZSBmcmVlKClkICovCiBjb25zdCBjaGFyICpQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nID0gInV0Zi04IjsKIGludCBQeV9IYXNGaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nID0gMTsKICNlbHNlCiBjb25zdCBjaGFyICpQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nID0gTlVMTDsgLyogc2V0IGJ5IGluaXRmc2VuY29kaW5nKCkgKi8KIGludCBQeV9IYXNGaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nID0gMDsKICNlbmRpZgorY29uc3QgY2hhciAqUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGVFcnJvcnMgPSAic3Vycm9nYXRlZXNjYXBlIjsKIAogX1B5X0lERU5USUZJRVIoX19idWlsdGluc19fKTsKIF9QeV9JREVOVElGSUVSKF9fZGljdF9fKTsKQEAgLTE1NSwxNiArMTU3LDggQEAKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgUHlPYmplY3QgKnBhcmdzID0gUHlUdXBsZV9QYWNrKDIsIG5hbWUsIGJhc2VzKTsKLSAgICAgICAgaWYgKHBhcmdzID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihwcmVwKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihtZXRhKTsKLSAgICAgICAgICAgIFB5X1hERUNSRUYobWt3KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBucyA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKHByZXAsIHBhcmdzLCBta3cpOwotICAgICAgICBQeV9ERUNSRUYocGFyZ3MpOworICAgICAgICBQeU9iamVjdCAqcGFyZ3NbMl0gPSB7bmFtZSwgYmFzZXN9OworICAgICAgICBucyA9IF9QeU9iamVjdF9GYXN0Q2FsbERpY3QocHJlcCwgcGFyZ3MsIDIsIG1rdyk7CiAgICAgICAgIFB5X0RFQ1JFRihwcmVwKTsKICAgICB9CiAgICAgaWYgKG5zID09IE5VTEwpIHsKQEAgLTE3NywxMiArMTcxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9HRVRfQ0xPU1VSRShmdW5jKSk7CiAgICAgaWYgKGNlbGwgIT0gTlVMTCkgewotICAgICAgICBQeU9iamVjdCAqbWFyZ3M7Ci0gICAgICAgIG1hcmdzID0gUHlUdXBsZV9QYWNrKDMsIG5hbWUsIGJhc2VzLCBucyk7Ci0gICAgICAgIGlmIChtYXJncyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjbHMgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhtZXRhLCBtYXJncywgbWt3KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihtYXJncyk7Ci0gICAgICAgIH0KKyAgICAgICAgUHlPYmplY3QgKm1hcmdzWzNdID0ge25hbWUsIGJhc2VzLCBuc307CisgICAgICAgIGNscyA9IF9QeU9iamVjdF9GYXN0Q2FsbERpY3QobWV0YSwgbWFyZ3MsIDMsIG1rdyk7CiAgICAgICAgIGlmIChjbHMgIT0gTlVMTCAmJiBQeUNlbGxfQ2hlY2soY2VsbCkpCiAgICAgICAgICAgICBQeUNlbGxfU2V0KGNlbGwsIGNscyk7CiAgICAgICAgIFB5X0RFQ1JFRihjZWxsKTsKQEAgLTMzMSw3ICszMjEsNyBAQAogICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjbXAgPT0gMSkgeworICAgICAgICBpZiAoY21wID4gMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOwogICAgICAgICB9CkBAIC00NjksNiArNDU5LDcgQEAKICAgICBQeU9iamVjdCAqaXQgPSBsei0+aXQ7CiAgICAgbG9uZyBvazsKICAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CisgICAgaW50IGNoZWNrdHJ1ZSA9IGx6LT5mdW5jID09IFB5X05vbmUgfHwgbHotPmZ1bmMgPT0gKFB5T2JqZWN0ICopJlB5Qm9vbF9UeXBlOwogCiAgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OwogICAgIGZvciAoOzspIHsKQEAgLTQ3NiwxMiArNDY3LDExIEBACiAgICAgICAgIGlmIChpdGVtID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAobHotPmZ1bmMgPT0gUHlfTm9uZSB8fCBsei0+ZnVuYyA9PSAoUHlPYmplY3QgKikmUHlCb29sX1R5cGUpIHsKKyAgICAgICAgaWYgKGNoZWNrdHJ1ZSkgewogICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqZ29vZDsKLSAgICAgICAgICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwgTlVMTCk7CisgICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywgaXRlbSwgTlVMTCk7CiAgICAgICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTE2OCwyNiArMTE1OCw0MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hcF9uZXh0KG1hcG9iamVjdCAqbHopCiB7Ci0gICAgUHlPYmplY3QgKnZhbDsKLSAgICBQeU9iamVjdCAqYXJndHVwbGU7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLSAgICBQeV9zc2l6ZV90IG51bWFyZ3MsIGk7CisgICAgUHlPYmplY3QgKnNtYWxsX3N0YWNrWzVdOworICAgIFB5T2JqZWN0ICoqc3RhY2s7CisgICAgUHlfc3NpemVfdCBuaXRlcnMsIG5hcmdzLCBpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0gICAgbnVtYXJncyA9IFB5VHVwbGVfU2l6ZShsei0+aXRlcnMpOwotICAgIGFyZ3R1cGxlID0gUHlUdXBsZV9OZXcobnVtYXJncyk7Ci0gICAgaWYgKGFyZ3R1cGxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZm9yIChpPTAgOyBpPG51bWFyZ3MgOyBpKyspIHsKLSAgICAgICAgdmFsID0gUHlJdGVyX05leHQoUHlUdXBsZV9HRVRfSVRFTShsei0+aXRlcnMsIGkpKTsKLSAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoYXJndHVwbGUpOworICAgIG5pdGVycyA9IFB5VHVwbGVfR0VUX1NJWkUobHotPml0ZXJzKTsKKyAgICBpZiAobml0ZXJzIDw9IChQeV9zc2l6ZV90KVB5X0FSUkFZX0xFTkdUSChzbWFsbF9zdGFjaykpIHsKKyAgICAgICAgc3RhY2sgPSBzbWFsbF9zdGFjazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YWNrID0gUHlNZW1fTWFsbG9jKG5pdGVycyAqIHNpemVvZihzdGFja1swXSkpOworICAgICAgICBpZiAoc3RhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJndHVwbGUsIGksIHZhbCk7CiAgICAgfQotICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwobHotPmZ1bmMsIGFyZ3R1cGxlLCBOVUxMKTsKLSAgICBQeV9ERUNSRUYoYXJndHVwbGUpOworCisgICAgbmFyZ3MgPSAwOworICAgIGZvciAoaT0wOyBpIDwgbml0ZXJzOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKml0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXRlcnMsIGkpOworICAgICAgICBQeU9iamVjdCAqdmFsID0gUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KGl0KTsKKyAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RhY2tbaV0gPSB2YWw7CisgICAgICAgIG5hcmdzKys7CisgICAgfQorCisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0Zhc3RDYWxsKGx6LT5mdW5jLCBzdGFjaywgbmFyZ3MpOworCitleGl0OgorICAgIGZvciAoaT0wOyBpIDwgbmFyZ3M7IGkrKykgeworICAgICAgICBQeV9ERUNSRUYoc3RhY2tbaV0pOworICAgIH0KKyAgICBpZiAoc3RhY2sgIT0gc21hbGxfc3RhY2spIHsKKyAgICAgICAgUHlNZW1fRnJlZShzdGFjayk7CisgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE3NzksNyArMTc4Niw3IEBACiAgICAgICAgIGlmIChkb19mbHVzaCA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBlbHNlIGlmIChkb19mbHVzaCkgewotICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmaWxlLCAmUHlJZF9mbHVzaCwgIiIpOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmaWxlLCAmUHlJZF9mbHVzaCwgTlVMTCk7CiAgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBlbHNlCkBAIC0xODQ1LDcgKzE4NTIsNyBAQAogICAgIH0KIAogICAgIC8qIEZpcnN0IG9mIGFsbCwgZmx1c2ggc3RkZXJyICovCi0gICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmZXJyLCAmUHlJZF9mbHVzaCwgIiIpOworICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZmVyciwgJlB5SWRfZmx1c2gsIE5VTEwpOwogICAgIGlmICh0bXAgPT0gTlVMTCkKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICBlbHNlCkBAIC0xODU0LDcgKzE4NjEsNyBAQAogICAgIC8qIFdlIHNob3VsZCBvbmx5IHVzZSAoR05VKSByZWFkbGluZSBpZiBQeXRob24ncyBzeXMuc3RkaW4gYW5kCiAgICAgICAgc3lzLnN0ZG91dCBhcmUgdGhlIHNhbWUgYXMgQydzIHN0ZGluIGFuZCBzdGRvdXQsIGJlY2F1c2Ugd2UKICAgICAgICBuZWVkIHRvIHBhc3MgaXQgdGhvc2UuICovCi0gICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmaW4sICZQeUlkX2ZpbGVubywgIiIpOworICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZmluLCAmUHlJZF9maWxlbm8sIE5VTEwpOwogICAgIGlmICh0bXAgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICB0dHkgPSAwOwpAQCAtMTg2Nyw3ICsxODc0LDcgQEAKICAgICAgICAgdHR5ID0gZmQgPT0gZmlsZW5vKHN0ZGluKSAmJiBpc2F0dHkoZmQpOwogICAgIH0KICAgICBpZiAodHR5KSB7Ci0gICAgICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm91dCwgJlB5SWRfZmlsZW5vLCAiIik7CisgICAgICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm91dCwgJlB5SWRfZmlsZW5vLCBOVUxMKTsKICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgdHR5ID0gMDsKQEAgLTE5MDIsNyArMTkwOSw3IEBACiAgICAgICAgIHN0ZGluX2Vycm9yc19zdHIgPSBfUHlVbmljb2RlX0FzU3RyaW5nKHN0ZGluX2Vycm9ycyk7CiAgICAgICAgIGlmICghc3RkaW5fZW5jb2Rpbmdfc3RyIHx8ICFzdGRpbl9lcnJvcnNfc3RyKQogICAgICAgICAgICAgZ290byBfcmVhZGxpbmVfZXJyb3JzOwotICAgICAgICB0bXAgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGZvdXQsICZQeUlkX2ZsdXNoLCAiIik7CisgICAgICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm91dCwgJlB5SWRfZmx1c2gsIE5VTEwpOwogICAgICAgICBpZiAodG1wID09IE5VTEwpCiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICBlbHNlCkBAIC0xOTI5LDkgKzE5MzYsOCBAQAogICAgICAgICAgICAgUHlfQ0xFQVIoc3RyaW5ncG8pOwogICAgICAgICAgICAgaWYgKHBvID09IE5VTEwpCiAgICAgICAgICAgICAgICAgZ290byBfcmVhZGxpbmVfZXJyb3JzOwotICAgICAgICAgICAgcHJvbXB0c3RyID0gUHlCeXRlc19Bc1N0cmluZyhwbyk7Ci0gICAgICAgICAgICBpZiAocHJvbXB0c3RyID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBfcmVhZGxpbmVfZXJyb3JzOworICAgICAgICAgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2socG8pKTsKKyAgICAgICAgICAgIHByb21wdHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHBvKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHBvID0gTlVMTDsKQEAgLTE5ODMsNyArMTk4OSw3IEBACiAgICAgICAgIGlmIChQeUZpbGVfV3JpdGVPYmplY3QocHJvbXB0LCBmb3V0LCBQeV9QUklOVF9SQVcpICE9IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmb3V0LCAmUHlJZF9mbHVzaCwgIiIpOworICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm91dCwgJlB5SWRfZmx1c2gsIE5VTEwpOwogICAgIGlmICh0bXAgPT0gTlVMTCkKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICBlbHNlCkBAIC0yMDg3LDEwICsyMDkzLDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9zb3J0ZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLSAgICBQeU9iamVjdCAqbmV3bGlzdCwgKnYsICpzZXEsICprZXlmdW5jPU5VTEwsICpuZXdhcmdzOworICAgIFB5T2JqZWN0ICpuZXdsaXN0LCAqdiwgKnNlcSwgKmtleWZ1bmM9TlVMTCwgKipuZXdhcmdzOwogICAgIFB5T2JqZWN0ICpjYWxsYWJsZTsKICAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Iml0ZXJhYmxlIiwgImtleSIsICJyZXZlcnNlIiwgMH07CiAgICAgaW50IHJldmVyc2U7CisgICAgUHlfc3NpemVfdCBuYXJnczsKIAogICAgIC8qIGFyZ3MgMS0zIHNob3VsZCBtYXRjaCBsaXN0c29ydCBpbiBPYmplY3RzL2xpc3RvYmplY3QuYyAqLwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE9pOnNvcnRlZCIsCkBAIC0yMTA3LDE1ICsyMTE0LDkgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgNCk7Ci0gICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYobmV3bGlzdCk7Ci0gICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHYgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBuZXdhcmdzLCBrd2RzKTsKLSAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgbmV3YXJncyA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOworICAgIG5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKSAtIDE7CisgICAgdiA9IF9QeU9iamVjdF9GYXN0Q2FsbERpY3QoY2FsbGFibGUsIG5ld2FyZ3MsIG5hcmdzLCBrd2RzKTsKICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOwogICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKG5ld2xpc3QpOwpAQCAtMjcxMCwxMCArMjcxMSwxMCBAQAogICAgIFNFVEJVSUxUSU4oInppcCIsICAgICAgICAgICAgICAgICAgICZQeVppcF9UeXBlKTsKICAgICBkZWJ1ZyA9IFB5Qm9vbF9Gcm9tTG9uZyhQeV9PcHRpbWl6ZUZsYWcgPT0gMCk7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RlYnVnX18iLCBkZWJ1ZykgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoZGVidWcpOworICAgICAgICBQeV9ERUNSRUYoZGVidWcpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlfWERFQ1JFRihkZWJ1Zyk7CisgICAgUHlfREVDUkVGKGRlYnVnKTsKIAogICAgIHJldHVybiBtb2Q7CiAjdW5kZWYgQUREX1RPX0FMTApkaWZmIC0tZ2l0IGEvUHl0aG9uL2NldmFsLmMgYi9QeXRob24vY2V2YWwuYwppbmRleCA0NTE3OTFjLi4wZTg3NGI3IDEwMDY0NAotLS0gYS9QeXRob24vY2V2YWwuYworKysgYi9QeXRob24vY2V2YWwuYwpAQCAtMTA5LDIzICsxMDksMTggQEAKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KICNpZmRlZiBXSVRIX1RTQwotc3RhdGljIFB5T2JqZWN0ICogY2FsbF9mdW5jdGlvbihQeU9iamVjdCAqKiosIGludCwgdWludDY0KiwgdWludDY0Kik7CitzdGF0aWMgUHlPYmplY3QgKiBjYWxsX2Z1bmN0aW9uKFB5T2JqZWN0ICoqKiwgUHlfc3NpemVfdCwgUHlPYmplY3QgKiwgdWludDY0KiwgdWludDY0Kik7CiAjZWxzZQotc3RhdGljIFB5T2JqZWN0ICogY2FsbF9mdW5jdGlvbihQeU9iamVjdCAqKiosIGludCk7CitzdGF0aWMgUHlPYmplY3QgKiBjYWxsX2Z1bmN0aW9uKFB5T2JqZWN0ICoqKiwgUHlfc3NpemVfdCwgUHlPYmplY3QgKik7CiAjZW5kaWYKLXN0YXRpYyBQeU9iamVjdCAqIGZhc3RfZnVuY3Rpb24oUHlPYmplY3QgKiwgUHlPYmplY3QgKioqLCBpbnQsIGludCwgaW50KTsKLXN0YXRpYyBQeU9iamVjdCAqIGRvX2NhbGwoUHlPYmplY3QgKiwgUHlPYmplY3QgKioqLCBpbnQsIGludCk7Ci1zdGF0aWMgUHlPYmplY3QgKiBleHRfZG9fY2FsbChQeU9iamVjdCAqLCBQeU9iamVjdCAqKiosIGludCwgaW50LCBpbnQpOwotc3RhdGljIFB5T2JqZWN0ICogdXBkYXRlX2tleXdvcmRfYXJncyhQeU9iamVjdCAqLCBpbnQsIFB5T2JqZWN0ICoqKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKik7Ci1zdGF0aWMgUHlPYmplY3QgKiB1cGRhdGVfc3Rhcl9hcmdzKGludCwgaW50LCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKiopOwotc3RhdGljIFB5T2JqZWN0ICogbG9hZF9hcmdzKFB5T2JqZWN0ICoqKiwgaW50KTsKLSNkZWZpbmUgQ0FMTF9GTEFHX1ZBUiAxCi0jZGVmaW5lIENBTExfRkxBR19LVyAyCitzdGF0aWMgUHlPYmplY3QgKiBmYXN0X2Z1bmN0aW9uKFB5T2JqZWN0ICosIFB5T2JqZWN0ICoqLCBQeV9zc2l6ZV90LCBQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqIGRvX2NhbGxfY29yZShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqIGNyZWF0ZV9rZXl3b3JkX2FyZ3MoUHlPYmplY3QgKiwgUHlPYmplY3QgKioqLCBQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqIGxvYWRfYXJncyhQeU9iamVjdCAqKiosIFB5X3NzaXplX3QpOwogCiAjaWZkZWYgTExUUkFDRQogc3RhdGljIGludCBsbHRyYWNlOwotc3RhdGljIGludCBwcnRyYWNlKFB5T2JqZWN0ICosIGNoYXIgKik7CitzdGF0aWMgaW50IHBydHJhY2UoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKICNlbmRpZgogc3RhdGljIGludCBjYWxsX3RyYWNlKFB5X3RyYWNlZnVuYywgUHlPYmplY3QgKiwKICAgICAgICAgICAgICAgICAgICAgICBQeVRocmVhZFN0YXRlICosIFB5RnJhbWVPYmplY3QgKiwKQEAgLTEzOSwxMiArMTM0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVRocmVhZFN0YXRlICosIFB5RnJhbWVPYmplY3QgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiAKIHN0YXRpYyBQeU9iamVjdCAqIGNtcF9vdXRjb21lKGludCwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitzdGF0aWMgUHlPYmplY3QgKiBpbXBvcnRfbmFtZShQeUZyYW1lT2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIFB5T2JqZWN0ICogaW1wb3J0X2Zyb20oUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgaW50IGltcG9ydF9hbGxfZnJvbShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyB2b2lkIGZvcm1hdF9leGNfY2hlY2tfYXJnKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgdm9pZCBmb3JtYXRfZXhjX3VuYm91bmQoUHlDb2RlT2JqZWN0ICpjbywgaW50IG9wYXJnKTsKIHN0YXRpYyBQeU9iamVjdCAqIHVuaWNvZGVfY29uY2F0ZW5hdGUoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqLCB1bnNpZ25lZCBjaGFyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICosIGNvbnN0IHVuc2lnbmVkIHNob3J0ICopOwogc3RhdGljIFB5T2JqZWN0ICogc3BlY2lhbF9sb29rdXAoUHlPYmplY3QgKiwgX1B5X0lkZW50aWZpZXIgKik7CiAKICNkZWZpbmUgTkFNRV9FUlJPUl9NU0cgXApAQCAtNzk2LDExICs3OTIsMTggQEAKIFB5T2JqZWN0ICoKIFB5RXZhbF9FdmFsRnJhbWVFeChQeUZyYW1lT2JqZWN0ICpmLCBpbnQgdGhyb3dmbGFnKQogeworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgcmV0dXJuIHRzdGF0ZS0+aW50ZXJwLT5ldmFsX2ZyYW1lKGYsIHRocm93ZmxhZyk7Cit9CisKK1B5T2JqZWN0ICoKK19QeUV2YWxfRXZhbEZyYW1lRGVmYXVsdChQeUZyYW1lT2JqZWN0ICpmLCBpbnQgdGhyb3dmbGFnKQorewogI2lmZGVmIERYUEFJUlMKICAgICBpbnQgbGFzdG9wY29kZSA9IDA7CiAjZW5kaWYKICAgICBQeU9iamVjdCAqKnN0YWNrX3BvaW50ZXI7ICAvKiBOZXh0IGZyZWUgc2xvdCBpbiB2YWx1ZSBzdGFjayAqLwotICAgIHVuc2lnbmVkIGNoYXIgKm5leHRfaW5zdHI7CisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKm5leHRfaW5zdHI7CiAgICAgaW50IG9wY29kZTsgICAgICAgIC8qIEN1cnJlbnQgb3Bjb2RlICovCiAgICAgaW50IG9wYXJnOyAgICAgICAgIC8qIEN1cnJlbnQgb3Bjb2RlIGFyZ3VtZW50LCBpZiBhbnkgKi8KICAgICBlbnVtIHdoeV9jb2RlIHdoeTsgLyogUmVhc29uIGZvciBibG9jayBzdGFjayB1bndpbmQgKi8KQEAgLTgxOCw3ICs4MjEsNyBAQAogICAgICAgIHRpbWUgaXQgaXMgdGVzdGVkLiAqLwogICAgIGludCBpbnN0cl91YiA9IC0xLCBpbnN0cl9sYiA9IDAsIGluc3RyX3ByZXYgPSAtMTsKIAotICAgIHVuc2lnbmVkIGNoYXIgKmZpcnN0X2luc3RyOworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpmaXJzdF9pbnN0cjsKICAgICBQeU9iamVjdCAqbmFtZXM7CiAgICAgUHlPYmplY3QgKmNvbnN0czsKIApAQCAtODg2LDI0ICs4ODksMTAgQEAKIC8qIEltcG9ydCB0aGUgc3RhdGljIGp1bXAgdGFibGUgKi8KICNpbmNsdWRlICJvcGNvZGVfdGFyZ2V0cy5oIgogCi0vKiBUaGlzIG1hY3JvIGlzIHVzZWQgd2hlbiBzZXZlcmFsIG9wY29kZXMgZGVmZXIgdG8gdGhlIHNhbWUgaW1wbGVtZW50YXRpb24KLSAgIChlLmcuIFNFVFVQX0xPT1AsIFNFVFVQX0ZJTkFMTFkpICovCi0jZGVmaW5lIFRBUkdFVF9XSVRIX0lNUEwob3AsIGltcGwpIFwKLSAgICBUQVJHRVRfIyNvcDogXAotICAgICAgICBvcGNvZGUgPSBvcDsgXAotICAgICAgICBpZiAoSEFTX0FSRyhvcCkpIFwKLSAgICAgICAgICAgIG9wYXJnID0gTkVYVEFSRygpOyBcCi0gICAgY2FzZSBvcDogXAotICAgICAgICBnb3RvIGltcGw7IFwKLQogI2RlZmluZSBUQVJHRVQob3ApIFwKICAgICBUQVJHRVRfIyNvcDogXAotICAgICAgICBvcGNvZGUgPSBvcDsgXAotICAgICAgICBpZiAoSEFTX0FSRyhvcCkpIFwKLSAgICAgICAgICAgIG9wYXJnID0gTkVYVEFSRygpOyBcCiAgICAgY2FzZSBvcDoKIAotCiAjZGVmaW5lIERJU1BBVENIKCkgXAogICAgIHsgXAogICAgICAgICBpZiAoIV9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZldmFsX2JyZWFrZXIpKSB7ICAgICAgXApAQCAtOTE3LDcgKzkwNiw4IEBACiAgICAgeyBcCiAgICAgICAgIGlmICghbGx0cmFjZSAmJiAhX1B5X1RyYWNpbmdQb3NzaWJsZSkgeyBcCiAgICAgICAgICAgICBmLT5mX2xhc3RpID0gSU5TVFJfT0ZGU0VUKCk7IFwKLSAgICAgICAgICAgIGdvdG8gKm9wY29kZV90YXJnZXRzWypuZXh0X2luc3RyKytdOyBcCisgICAgICAgICAgICBORVhUT1BBUkcoKTsgXAorICAgICAgICAgICAgZ290byAqb3Bjb2RlX3RhcmdldHNbb3Bjb2RlXTsgXAogICAgICAgICB9IFwKICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOyBcCiAgICAgfQpAQCAtOTI2LDcgKzkxNiw4IEBACiAgICAgeyBcCiAgICAgICAgIGlmICghX1B5X1RyYWNpbmdQb3NzaWJsZSkgeyBcCiAgICAgICAgICAgICBmLT5mX2xhc3RpID0gSU5TVFJfT0ZGU0VUKCk7IFwKLSAgICAgICAgICAgIGdvdG8gKm9wY29kZV90YXJnZXRzWypuZXh0X2luc3RyKytdOyBcCisgICAgICAgICAgICBORVhUT1BBUkcoKTsgXAorICAgICAgICAgICAgZ290byAqb3Bjb2RlX3RhcmdldHNbb3Bjb2RlXTsgXAogICAgICAgICB9IFwKICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOyBcCiAgICAgfQpAQCAtOTM1LDEwICs5MjYsNyBAQAogI2Vsc2UKICNkZWZpbmUgVEFSR0VUKG9wKSBcCiAgICAgY2FzZSBvcDoKLSNkZWZpbmUgVEFSR0VUX1dJVEhfSU1QTChvcCwgaW1wbCkgXAotICAgIC8qIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgYGltcGxgIHVudXNlZCAqLyBcCi0gICAgaWYgKDApIGdvdG8gaW1wbDsgXAotICAgIGNhc2Ugb3A6CisKICNkZWZpbmUgRElTUEFUQ0goKSBjb250aW51ZQogI2RlZmluZSBGQVNUX0RJU1BBVENIKCkgZ290byBmYXN0X25leHRfb3Bjb2RlCiAjZW5kaWYKQEAgLTk5NCwyOCArOTgyLDM4IEBACiAKIC8qIENvZGUgYWNjZXNzIG1hY3JvcyAqLwogCi0jZGVmaW5lIElOU1RSX09GRlNFVCgpICAoKGludCkobmV4dF9pbnN0ciAtIGZpcnN0X2luc3RyKSkKLSNkZWZpbmUgTkVYVE9QKCkgICAgICAgICgqbmV4dF9pbnN0cisrKQotI2RlZmluZSBORVhUQVJHKCkgICAgICAgKG5leHRfaW5zdHIgKz0gMiwgKG5leHRfaW5zdHJbLTFdPDw4KSArIG5leHRfaW5zdHJbLTJdKQotI2RlZmluZSBQRUVLQVJHKCkgICAgICAgKChuZXh0X2luc3RyWzJdPDw4KSArIG5leHRfaW5zdHJbMV0pCi0jZGVmaW5lIEpVTVBUTyh4KSAgICAgICAobmV4dF9pbnN0ciA9IGZpcnN0X2luc3RyICsgKHgpKQotI2RlZmluZSBKVU1QQlkoeCkgICAgICAgKG5leHRfaW5zdHIgKz0gKHgpKQorI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICAgICNkZWZpbmUgT1BDT0RFKHdvcmQpICgod29yZCkgPj4gOCkKKyAgICAjZGVmaW5lIE9QQVJHKHdvcmQpICgod29yZCkgJiAyNTUpCisjZWxzZQorICAgICNkZWZpbmUgT1BDT0RFKHdvcmQpICgod29yZCkgJiAyNTUpCisgICAgI2RlZmluZSBPUEFSRyh3b3JkKSAoKHdvcmQpID4+IDgpCisjZW5kaWYKKy8qIFRoZSBpbnRlZ2VyIG92ZXJmbG93IGlzIGNoZWNrZWQgYnkgYW4gYXNzZXJ0aW9uIGJlbG93LiAqLworI2RlZmluZSBJTlNUUl9PRkZTRVQoKSAgKDIqKGludCkobmV4dF9pbnN0ciAtIGZpcnN0X2luc3RyKSkKKyNkZWZpbmUgTkVYVE9QQVJHKCkgIGRvIHsgXAorICAgICAgICB1bnNpZ25lZCBzaG9ydCB3b3JkID0gKm5leHRfaW5zdHI7IFwKKyAgICAgICAgb3Bjb2RlID0gT1BDT0RFKHdvcmQpOyBcCisgICAgICAgIG9wYXJnID0gT1BBUkcod29yZCk7IFwKKyAgICAgICAgbmV4dF9pbnN0cisrOyBcCisgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSlVNUFRPKHgpICAgICAgIChuZXh0X2luc3RyID0gZmlyc3RfaW5zdHIgKyAoeCkvMikKKyNkZWZpbmUgSlVNUEJZKHgpICAgICAgIChuZXh0X2luc3RyICs9ICh4KS8yKQogCiAvKiBPcENvZGUgcHJlZGljdGlvbiBtYWNyb3MKICAgICBTb21lIG9wY29kZXMgdGVuZCB0byBjb21lIGluIHBhaXJzIHRodXMgbWFraW5nIGl0IHBvc3NpYmxlIHRvCiAgICAgcHJlZGljdCB0aGUgc2Vjb25kIGNvZGUgd2hlbiB0aGUgZmlyc3QgaXMgcnVuLiAgRm9yIGV4YW1wbGUsCi0gICAgQ09NUEFSRV9PUCBpcyBvZnRlbiBmb2xsb3dlZCBieSBKVU1QX0lGX0ZBTFNFIG9yIEpVTVBfSUZfVFJVRS4gIEFuZCwKLSAgICB0aG9zZSBvcGNvZGVzIGFyZSBvZnRlbiBmb2xsb3dlZCBieSBhIFBPUF9UT1AuCisgICAgQ09NUEFSRV9PUCBpcyBvZnRlbiBmb2xsb3dlZCBieSBQT1BfSlVNUF9JRl9GQUxTRSBvciBQT1BfSlVNUF9JRl9UUlVFLgogCiAgICAgVmVyaWZ5aW5nIHRoZSBwcmVkaWN0aW9uIGNvc3RzIGEgc2luZ2xlIGhpZ2gtc3BlZWQgdGVzdCBvZiBhIHJlZ2lzdGVyCiAgICAgdmFyaWFibGUgYWdhaW5zdCBhIGNvbnN0YW50LiAgSWYgdGhlIHBhaXJpbmcgd2FzIGdvb2QsIHRoZW4gdGhlCiAgICAgcHJvY2Vzc29yJ3Mgb3duIGludGVybmFsIGJyYW5jaCBwcmVkaWNhdGlvbiBoYXMgYSBoaWdoIGxpa2VsaWhvb2Qgb2YKICAgICBzdWNjZXNzLCByZXN1bHRpbmcgaW4gYSBuZWFybHkgemVyby1vdmVyaGVhZCB0cmFuc2l0aW9uIHRvIHRoZQogICAgIG5leHQgb3Bjb2RlLiAgQSBzdWNjZXNzZnVsIHByZWRpY3Rpb24gc2F2ZXMgYSB0cmlwIHRocm91Z2ggdGhlIGV2YWwtbG9vcAotICAgIGluY2x1ZGluZyBpdHMgdHdvIHVucHJlZGljdGFibGUgYnJhbmNoZXMsIHRoZSBIQVNfQVJHIHRlc3QgYW5kIHRoZQotICAgIHN3aXRjaC1jYXNlLiAgQ29tYmluZWQgd2l0aCB0aGUgcHJvY2Vzc29yJ3MgaW50ZXJuYWwgYnJhbmNoIHByZWRpY3Rpb24sCi0gICAgYSBzdWNjZXNzZnVsIFBSRURJQ1QgaGFzIHRoZSBlZmZlY3Qgb2YgbWFraW5nIHRoZSB0d28gb3Bjb2RlcyBydW4gYXMgaWYKLSAgICB0aGV5IHdlcmUgYSBzaW5nbGUgbmV3IG9wY29kZSB3aXRoIHRoZSBib2RpZXMgY29tYmluZWQuCisgICAgaW5jbHVkaW5nIGl0cyB1bnByZWRpY3RhYmxlIHN3aXRjaC1jYXNlIGJyYW5jaC4gIENvbWJpbmVkIHdpdGggdGhlCisgICAgcHJvY2Vzc29yJ3MgaW50ZXJuYWwgYnJhbmNoIHByZWRpY3Rpb24sIGEgc3VjY2Vzc2Z1bCBQUkVESUNUIGhhcyB0aGUKKyAgICBlZmZlY3Qgb2YgbWFraW5nIHRoZSB0d28gb3Bjb2RlcyBydW4gYXMgaWYgdGhleSB3ZXJlIGEgc2luZ2xlIG5ldyBvcGNvZGUKKyAgICB3aXRoIHRoZSBib2RpZXMgY29tYmluZWQuCiAKICAgICBJZiBjb2xsZWN0aW5nIG9wY29kZSBzdGF0aXN0aWNzLCB5b3VyIGNob2ljZXMgYXJlIHRvIGVpdGhlciBrZWVwIHRoZQogICAgIHByZWRpY3Rpb25zIHR1cm5lZC1vbiBhbmQgaW50ZXJwcmV0IHRoZSByZXN1bHRzIGFzIGlmIHNvbWUgb3Bjb2RlcwpAQCAtMTAzMCwxMyArMTAyOCwxOSBAQAogCiAjaWYgZGVmaW5lZChEWU5BTUlDX0VYRUNVVElPTl9QUk9GSUxFKSB8fCBVU0VfQ09NUFVURURfR09UT1MKICNkZWZpbmUgUFJFRElDVChvcCkgICAgICAgICAgICAgaWYgKDApIGdvdG8gUFJFRF8jI29wCi0jZGVmaW5lIFBSRURJQ1RFRChvcCkgICAgICAgICAgIFBSRURfIyNvcDoKLSNkZWZpbmUgUFJFRElDVEVEX1dJVEhfQVJHKG9wKSAgUFJFRF8jI29wOgogI2Vsc2UKLSNkZWZpbmUgUFJFRElDVChvcCkgICAgICAgICAgICAgaWYgKCpuZXh0X2luc3RyID09IG9wKSBnb3RvIFBSRURfIyNvcAotI2RlZmluZSBQUkVESUNURUQob3ApICAgICAgICAgICBQUkVEXyMjb3A6IG5leHRfaW5zdHIrKwotI2RlZmluZSBQUkVESUNURURfV0lUSF9BUkcob3ApICBQUkVEXyMjb3A6IG9wYXJnID0gUEVFS0FSRygpOyBuZXh0X2luc3RyICs9IDMKKyNkZWZpbmUgUFJFRElDVChvcCkgXAorICAgIGRveyBcCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHdvcmQgPSAqbmV4dF9pbnN0cjsgXAorICAgICAgICBvcGNvZGUgPSBPUENPREUod29yZCk7IFwKKyAgICAgICAgaWYgKG9wY29kZSA9PSBvcCl7IFwKKyAgICAgICAgICAgIG9wYXJnID0gT1BBUkcod29yZCk7IFwKKyAgICAgICAgICAgIG5leHRfaW5zdHIrKzsgXAorICAgICAgICAgICAgZ290byBQUkVEXyMjb3A7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSgwKQogI2VuZGlmCisjZGVmaW5lIFBSRURJQ1RFRChvcCkgICAgICAgICAgIFBSRURfIyNvcDoKIAogCiAvKiBTdGFjayBtYW5pcHVsYXRpb24gbWFjcm9zICovCkBAIC0xMTAwLDcgKzExMDQsNyBAQAogICAgIH0KIAogI2RlZmluZSBVTldJTkRfRVhDRVBUX0hBTkRMRVIoYikgXAotICAgIHsgXAorICAgIGRvIHsgXAogICAgICAgICBQeU9iamVjdCAqdHlwZSwgKnZhbHVlLCAqdHJhY2ViYWNrOyBcCiAgICAgICAgIGFzc2VydChTVEFDS19MRVZFTCgpID49IChiKS0+Yl9sZXZlbCArIDMpOyBcCiAgICAgICAgIHdoaWxlIChTVEFDS19MRVZFTCgpID4gKGIpLT5iX2xldmVsICsgMykgeyBcCkBAIC0xMTE2LDcgKzExMjAsNyBAQAogICAgICAgICBQeV9YREVDUkVGKHR5cGUpOyBcCiAgICAgICAgIFB5X1hERUNSRUYodmFsdWUpOyBcCiAgICAgICAgIFB5X1hERUNSRUYodHJhY2ViYWNrKTsgXAotICAgIH0KKyAgICB9IHdoaWxlKDApCiAKIC8qIFN0YXJ0IG9mIGNvZGUgKi8KIApAQCAtMTE2NSwxNiArMTE2OSwxNiBAQAogICAgIGNvbnN0cyA9IGNvLT5jb19jb25zdHM7CiAgICAgZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKICAgICBmcmVldmFycyA9IGYtPmZfbG9jYWxzcGx1cyArIGNvLT5jb19ubG9jYWxzOwotICAgIGZpcnN0X2luc3RyID0gKHVuc2lnbmVkIGNoYXIqKSBQeUJ5dGVzX0FTX1NUUklORyhjby0+Y29fY29kZSk7Ci0gICAgLyogQW4gZXhwbGFuYXRpb24gaXMgaW4gb3JkZXIgZm9yIHRoZSBuZXh0IGxpbmUuCisgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2soY28tPmNvX2NvZGUpKTsKKyAgICBhc3NlcnQoUHlCeXRlc19HRVRfU0laRShjby0+Y29fY29kZSkgPD0gSU5UX01BWCk7CisgICAgYXNzZXJ0KFB5Qnl0ZXNfR0VUX1NJWkUoY28tPmNvX2NvZGUpICUgMiA9PSAwKTsKKyAgICBhc3NlcnQoX1B5X0lTX0FMSUdORUQoUHlCeXRlc19BU19TVFJJTkcoY28tPmNvX2NvZGUpLCAyKSk7CisgICAgZmlyc3RfaW5zdHIgPSAodW5zaWduZWQgc2hvcnQqKSBQeUJ5dGVzX0FTX1NUUklORyhjby0+Y29fY29kZSk7CisgICAgLyoKKyAgICAgICBmLT5mX2xhc3RpIHJlZmVycyB0byB0aGUgaW5kZXggb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24sCisgICAgICAgdW5sZXNzIGl0J3MgLTEgaW4gd2hpY2ggY2FzZSBuZXh0X2luc3RyIHNob3VsZCBiZSBmaXJzdF9pbnN0ci4KIAotICAgICAgIGYtPmZfbGFzdGkgbm93IHJlZmVycyB0byB0aGUgaW5kZXggb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24KLSAgICAgICBleGVjdXRlZC4gIFlvdSBtaWdodCB0aGluayB0aGlzIHdhcyBvYnZpb3VzIGZyb20gdGhlIG5hbWUsIGJ1dAotICAgICAgIHRoaXMgd2Fzbid0IGFsd2F5cyB0cnVlIGJlZm9yZSAyLjMhICBQeUZyYW1lX05ldyBub3cgc2V0cwotICAgICAgIGYtPmZfbGFzdGkgdG8gLTEgKGkuZS4gdGhlIGluZGV4ICpiZWZvcmUqIHRoZSBmaXJzdCBpbnN0cnVjdGlvbikKLSAgICAgICBhbmQgWUlFTERfVkFMVUUgZG9lc24ndCBmaWRkbGUgd2l0aCBmX2xhc3RpIGFueSBtb3JlLiAgU28gdGhpcwotICAgICAgIGRvZXMgd29yay4gIFByb21pc2UuCi0gICAgICAgWUlFTERfRlJPTSBzZXRzIGZfbGFzdGkgdG8gaXRzZWxmLCBpbiBvcmRlciB0byByZXBlYXRlZCB5aWVsZAorICAgICAgIFlJRUxEX0ZST00gc2V0cyBmX2xhc3RpIHRvIGl0c2VsZiwgaW4gb3JkZXIgdG8gcmVwZWF0ZWRseSB5aWVsZAogICAgICAgIG11bHRpcGxlIHZhbHVlcy4KIAogICAgICAgIFdoZW4gdGhlIFBSRURJQ1QoKSBtYWNyb3MgYXJlIGVuYWJsZWQsIHNvbWUgb3Bjb2RlIHBhaXJzIGZvbGxvdyBpbgpAQCAtMTE4MywxNSArMTE4NywxOSBAQAogICAgICAgIHdlcmUgYSBzaW5nbGUgbmV3IG9wY29kZTsgYWNjb3JkaW5nbHksZi0+Zl9sYXN0aSB3aWxsIHBvaW50IHRvCiAgICAgICAgdGhlIGZpcnN0IGNvZGUgaW4gdGhlIHBhaXIgKGZvciBpbnN0YW5jZSwgR0VUX0lURVIgZm9sbG93ZWQgYnkKICAgICAgICBGT1JfSVRFUiBpcyBlZmZlY3RpdmVseSBhIHNpbmdsZSBvcGNvZGUgYW5kIGYtPmZfbGFzdGkgd2lsbCBwb2ludAotICAgICAgIGF0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbWJpbmVkIHBhaXIuKQorICAgICAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbWJpbmVkIHBhaXIuKQogICAgICovCi0gICAgbmV4dF9pbnN0ciA9IGZpcnN0X2luc3RyICsgZi0+Zl9sYXN0aSArIDE7CisgICAgbmV4dF9pbnN0ciA9IGZpcnN0X2luc3RyOworICAgIGlmIChmLT5mX2xhc3RpID49IDApIHsKKyAgICAgICAgYXNzZXJ0KGYtPmZfbGFzdGkgJSAyID09IDApOworICAgICAgICBuZXh0X2luc3RyICs9IGYtPmZfbGFzdGkvMiArIDE7CisgICAgfQogICAgIHN0YWNrX3BvaW50ZXIgPSBmLT5mX3N0YWNrdG9wOwogICAgIGFzc2VydChzdGFja19wb2ludGVyICE9IE5VTEwpOwogICAgIGYtPmZfc3RhY2t0b3AgPSBOVUxMOyAgICAgICAvKiByZW1haW5zIE5VTEwgdW5sZXNzIHlpZWxkIHN1c3BlbmRzIGZyYW1lICovCiAgICAgZi0+Zl9leGVjdXRpbmcgPSAxOwogCi0gICAgaWYgKGNvLT5jb19mbGFncyAmIChDT19HRU5FUkFUT1IgfCBDT19DT1JPVVRJTkUpKSB7CisgICAgaWYgKGNvLT5jb19mbGFncyAmIChDT19HRU5FUkFUT1IgfCBDT19DT1JPVVRJTkUgfCBDT19BU1lOQ19HRU5FUkFUT1IpKSB7CiAgICAgICAgIGlmICghdGhyb3dmbGFnICYmIGYtPmZfZXhjX3R5cGUgIT0gTlVMTCAmJiBmLT5mX2V4Y190eXBlICE9IFB5X05vbmUpIHsKICAgICAgICAgICAgIC8qIFdlIHdlcmUgaW4gYW4gZXhjZXB0IGhhbmRsZXIgd2hlbiB3ZSBsZWZ0LAogICAgICAgICAgICAgICAgcmVzdG9yZSB0aGUgZXhjZXB0aW9uIHN0YXRlIHdoaWNoIHdhcyBwdXQgYXNpZGUKQEAgLTEyNDksNyArMTI1Nyw3IEBACiAgICAgICAgICAgIFB5X01ha2VQZW5kaW5nQ2FsbHMoKSBhYm92ZS4gKi8KIAogICAgICAgICBpZiAoX1B5X2F0b21pY19sb2FkX3JlbGF4ZWQoJmV2YWxfYnJlYWtlcikpIHsKLSAgICAgICAgICAgIGlmICgqbmV4dF9pbnN0ciA9PSBTRVRVUF9GSU5BTExZKSB7CisgICAgICAgICAgICBpZiAoT1BDT0RFKCpuZXh0X2luc3RyKSA9PSBTRVRVUF9GSU5BTExZKSB7CiAgICAgICAgICAgICAgICAgLyogTWFrZSB0aGUgbGFzdCBvcGNvZGUgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgYSB0cnk6IGZpbmFsbHk6IGJsb2NrIHVuaW50ZXJydXB0aWJsZS4gKi8KICAgICAgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CkBAIC0xMzIyLDExICsxMzMwLDcgQEAKIAogICAgICAgICAvKiBFeHRyYWN0IG9wY29kZSBhbmQgYXJndW1lbnQgKi8KIAotICAgICAgICBvcGNvZGUgPSBORVhUT1AoKTsKLSAgICAgICAgb3BhcmcgPSAwOyAgIC8qIGFsbG93cyBvcGFyZyB0byBiZSBzdG9yZWQgaW4gYSByZWdpc3RlciBiZWNhdXNlCi0gICAgICAgICAgICBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgcmVtZW1iZXJlZCBhY3Jvc3MgYSBmdWxsIGxvb3AgKi8KLSAgICAgICAgaWYgKEhBU19BUkcob3Bjb2RlKSkKLSAgICAgICAgICAgIG9wYXJnID0gTkVYVEFSRygpOworICAgICAgICBORVhUT1BBUkcoKTsKICAgICBkaXNwYXRjaF9vcGNvZGU6CiAjaWZkZWYgRFlOQU1JQ19FWEVDVVRJT05fUFJPRklMRQogI2lmZGVmIERYUEFJUlMKQEAgLTEzNzcsNiArMTM4MSw3IEBACiAgICAgICAgICAgICBGQVNUX0RJU1BBVENIKCk7CiAgICAgICAgIH0KIAorICAgICAgICBQUkVESUNURUQoTE9BRF9DT05TVCk7CiAgICAgICAgIFRBUkdFVChMT0FEX0NPTlNUKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWUgPSBHRVRJVEVNKGNvbnN0cywgb3BhcmcpOwogICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKQEAgLTEzODQsNyArMTM4OSw3IEBACiAgICAgICAgICAgICBGQVNUX0RJU1BBVENIKCk7CiAgICAgICAgIH0KIAotICAgICAgICBQUkVESUNURURfV0lUSF9BUkcoU1RPUkVfRkFTVCk7CisgICAgICAgIFBSRURJQ1RFRChTVE9SRV9GQVNUKTsKICAgICAgICAgVEFSR0VUKFNUT1JFX0ZBU1QpIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IFBPUCgpOwogICAgICAgICAgICAgU0VUTE9DQUwob3BhcmcsIHZhbHVlKTsKQEAgLTE4NjMsNiArMTg2OCw2MSBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCisgICAgICAgIFRBUkdFVChTVE9SRV9BTk5PVEFUSU9OKSB7CisgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX2Fubm90YXRpb25zX18pOworICAgICAgICAgICAgUHlPYmplY3QgKmFubl9kaWN0OworICAgICAgICAgICAgUHlPYmplY3QgKmFubiA9IFBPUCgpOworICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7CisgICAgICAgICAgICBpbnQgZXJyOworICAgICAgICAgICAgaWYgKGYtPmZfbG9jYWxzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBsb2NhbHMgZm91bmQgd2hlbiBzdG9yaW5nIGFubm90YXRpb24iKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYW5uKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZmlyc3QgdHJ5IHRvIGdldCBfX2Fubm90YXRpb25zX18gZnJvbSBsb2NhbHMuLi4gKi8KKyAgICAgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChmLT5mX2xvY2FscykpIHsKKyAgICAgICAgICAgICAgICBhbm5fZGljdCA9IF9QeURpY3RfR2V0SXRlbUlkKGYtPmZfbG9jYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5SWRfX19hbm5vdGF0aW9uc19fKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5uX2RpY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTmFtZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fYW5ub3RhdGlvbnNfXyBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFubik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihhbm5fZGljdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqYW5uX3N0ciA9IF9QeVVuaWNvZGVfRnJvbUlkKCZQeUlkX19fYW5ub3RhdGlvbnNfXyk7CisgICAgICAgICAgICAgICAgaWYgKGFubl9zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYW5uKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYW5uX2RpY3QgPSBQeU9iamVjdF9HZXRJdGVtKGYtPmZfbG9jYWxzLCBhbm5fc3RyKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5uX2RpY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19OYW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fYW5ub3RhdGlvbnNfXyBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYW5uKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiAuLi5pZiBzdWNjZWVkZWQsIF9fYW5ub3RhdGlvbnNfX1tuYW1lXSA9IGFubiAqLworICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KGFubl9kaWN0KSkgeworICAgICAgICAgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKGFubl9kaWN0LCBuYW1lLCBhbm4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfU2V0SXRlbShhbm5fZGljdCwgbmFtZSwgYW5uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihhbm5fZGljdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYW5uKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBESVNQQVRDSCgpOworICAgICAgICB9CisKICAgICAgICAgVEFSR0VUKERFTEVURV9TVUJTQ1IpIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWIgPSBUT1AoKTsKICAgICAgICAgICAgIFB5T2JqZWN0ICpjb250YWluZXIgPSBTRUNPTkQoKTsKQEAgLTIwMDYsNiArMjA2Niw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFNFVF9UT1AoYXdhaXRhYmxlKTsKKyAgICAgICAgICAgIFBSRURJQ1QoTE9BRF9DT05TVCk7CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKQEAgLTIwMTYsNDEgKzIwNzcsNTIgQEAKICAgICAgICAgICAgIFB5T2JqZWN0ICphaXRlciA9IFRPUCgpOwogICAgICAgICAgICAgUHlUeXBlT2JqZWN0ICp0eXBlID0gUHlfVFlQRShhaXRlcik7CiAKLSAgICAgICAgICAgIGlmICh0eXBlLT50cF9hc19hc3luYyAhPSBOVUxMKQotICAgICAgICAgICAgICAgIGdldHRlciA9IHR5cGUtPnRwX2FzX2FzeW5jLT5hbV9hbmV4dDsKLQotICAgICAgICAgICAgaWYgKGdldHRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbmV4dF9pdGVyID0gKCpnZXR0ZXIpKGFpdGVyKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dF9pdGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUFzeW5jR2VuX0NoZWNrRXhhY3QoYWl0ZXIpKSB7CisgICAgICAgICAgICAgICAgYXdhaXRhYmxlID0gdHlwZS0+dHBfYXNfYXN5bmMtPmFtX2FuZXh0KGFpdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoYXdhaXRhYmxlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgIidhc3luYyBmb3InIHJlcXVpcmVzIGFuIGl0ZXJhdG9yIHdpdGggIgotICAgICAgICAgICAgICAgICAgICAiX19hbmV4dF9fIG1ldGhvZCwgZ290ICUuMTAwcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0eXBlLT50cF9hc19hc3luYyAhPSBOVUxMKXsKKyAgICAgICAgICAgICAgICAgICAgZ2V0dGVyID0gdHlwZS0+dHBfYXNfYXN5bmMtPmFtX2FuZXh0OworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYXdhaXRhYmxlID0gX1B5Q29yb19HZXRBd2FpdGFibGVJdGVyKG5leHRfaXRlcik7Ci0gICAgICAgICAgICBpZiAoYXdhaXRhYmxlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgIidhc3luYyBmb3InIHJlY2VpdmVkIGFuIGludmFsaWQgb2JqZWN0ICIKLSAgICAgICAgICAgICAgICAgICAgImZyb20gX19hbmV4dF9fOiAlLjEwMHMiLAotICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG5leHRfaXRlciktPnRwX25hbWUpOworICAgICAgICAgICAgICAgIGlmIChnZXR0ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBuZXh0X2l0ZXIgPSAoKmdldHRlcikoYWl0ZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV4dF9pdGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICInYXN5bmMgZm9yJyByZXF1aXJlcyBhbiBpdGVyYXRvciB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2FuZXh0X18gbWV0aG9kLCBnb3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0X2l0ZXIpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV4dF9pdGVyKTsKKyAgICAgICAgICAgICAgICBhd2FpdGFibGUgPSBfUHlDb3JvX0dldEF3YWl0YWJsZUl0ZXIobmV4dF9pdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoYXdhaXRhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIidhc3luYyBmb3InIHJlY2VpdmVkIGFuIGludmFsaWQgb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIF9fYW5leHRfXzogJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUobmV4dF9pdGVyKS0+dHBfbmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5leHRfaXRlcik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5leHRfaXRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBQVVNIKGF3YWl0YWJsZSk7CisgICAgICAgICAgICBQUkVESUNUKExPQURfQ09OU1QpOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCisgICAgICAgIFBSRURJQ1RFRChHRVRfQVdBSVRBQkxFKTsKICAgICAgICAgVEFSR0VUKEdFVF9BV0FJVEFCTEUpIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IFRPUCgpOwogICAgICAgICAgICAgUHlPYmplY3QgKml0ZXIgPSBfUHlDb3JvX0dldEF3YWl0YWJsZUl0ZXIoaXRlcmFibGUpOwpAQCAtMjA3OCwyMSArMjE1MCwyMiBAQAogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIFBSRURJQ1QoTE9BRF9DT05TVCk7CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKICAgICAgICAgVEFSR0VUKFlJRUxEX0ZST00pIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUE9QKCk7Ci0gICAgICAgICAgICBQeU9iamVjdCAqcmVjaWV2ZXIgPSBUT1AoKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZWNlaXZlciA9IFRPUCgpOwogICAgICAgICAgICAgaW50IGVycjsKLSAgICAgICAgICAgIGlmIChQeUdlbl9DaGVja0V4YWN0KHJlY2lldmVyKSB8fCBQeUNvcm9fQ2hlY2tFeGFjdChyZWNpZXZlcikpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSBfUHlHZW5fU2VuZCgoUHlHZW5PYmplY3QgKilyZWNpZXZlciwgdik7CisgICAgICAgICAgICBpZiAoUHlHZW5fQ2hlY2tFeGFjdChyZWNlaXZlcikgfHwgUHlDb3JvX0NoZWNrRXhhY3QocmVjZWl2ZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gX1B5R2VuX1NlbmQoKFB5R2VuT2JqZWN0ICopcmVjZWl2ZXIsIHYpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBfUHlfSURFTlRJRklFUihzZW5kKTsKICAgICAgICAgICAgICAgICBpZiAodiA9PSBQeV9Ob25lKQotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBQeV9UWVBFKHJlY2lldmVyKS0+dHBfaXRlcm5leHQocmVjaWV2ZXIpOworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBQeV9UWVBFKHJlY2VpdmVyKS0+dHBfaXRlcm5leHQocmVjZWl2ZXIpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZE9iakFyZ3MocmVjaWV2ZXIsICZQeUlkX3NlbmQsIHYsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkT2JqQXJncyhyZWNlaXZlciwgJlB5SWRfc2VuZCwgdiwgTlVMTCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBQeV9ERUNSRUYodik7CiAgICAgICAgICAgICBpZiAocmV0dmFsID09IE5VTEwpIHsKQEAgLTIxMDMsNyArMjE3Niw3IEBACiAgICAgICAgICAgICAgICAgZXJyID0gX1B5R2VuX0ZldGNoU3RvcEl0ZXJhdGlvblZhbHVlKCZ2YWwpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZWNpZXZlcik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlY2VpdmVyKTsKICAgICAgICAgICAgICAgICBTRVRfVE9QKHZhbCk7CiAgICAgICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgICAgIH0KQEAgLTIxMTEsMTIgKzIxODQsMjMgQEAKICAgICAgICAgICAgIGYtPmZfc3RhY2t0b3AgPSBzdGFja19wb2ludGVyOwogICAgICAgICAgICAgd2h5ID0gV0hZX1lJRUxEOwogICAgICAgICAgICAgLyogYW5kIHJlcGVhdC4uLiAqLwotICAgICAgICAgICAgZi0+Zl9sYXN0aS0tOworICAgICAgICAgICAgZi0+Zl9sYXN0aSAtPSAyOwogICAgICAgICAgICAgZ290byBmYXN0X3lpZWxkOwogICAgICAgICB9CiAKICAgICAgICAgVEFSR0VUKFlJRUxEX1ZBTFVFKSB7CiAgICAgICAgICAgICByZXR2YWwgPSBQT1AoKTsKKworICAgICAgICAgICAgaWYgKGNvLT5jb19mbGFncyAmIENPX0FTWU5DX0dFTkVSQVRPUikgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp3ID0gX1B5QXN5bmNHZW5WYWx1ZVdyYXBwZXJOZXcocmV0dmFsKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICAgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHZhbCA9IHc7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGYtPmZfc3RhY2t0b3AgPSBzdGFja19wb2ludGVyOwogICAgICAgICAgICAgd2h5ID0gV0hZX1lJRUxEOwogICAgICAgICAgICAgZ290byBmYXN0X3lpZWxkOwpAQCAtMjEzMyw2ICsyMjE3LDcgQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAorICAgICAgICBQUkVESUNURUQoUE9QX0JMT0NLKTsKICAgICAgICAgVEFSR0VUKFBPUF9CTE9DSykgewogICAgICAgICAgICAgUHlUcnlCbG9jayAqYiA9IFB5RnJhbWVfQmxvY2tQb3AoZik7CiAgICAgICAgICAgICBVTldJTkRfQkxPQ0soYik7CkBAIC0yMjQ5LDcgKzIzMzQsNyBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhVTlBBQ0tfU0VRVUVOQ0UpOworICAgICAgICBQUkVESUNURUQoVU5QQUNLX1NFUVVFTkNFKTsKICAgICAgICAgVEFSR0VUKFVOUEFDS19TRVFVRU5DRSkgewogICAgICAgICAgICAgUHlPYmplY3QgKnNlcSA9IFBPUCgpLCAqaXRlbSwgKippdGVtczsKICAgICAgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3Qoc2VxKSAmJgpAQCAtMjM1OCw3ICsyNDQzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHYgPSBQeU9iamVjdF9HZXRJdGVtKGxvY2FscywgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCAmJiBfUHlFcnJfT0NDVVJSRUQoKSkgeworICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0yMzk4LDI2ICsyNDgzLDMzIEBACiAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2OwogICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KGYtPmZfZ2xvYmFscykKLSAgICAgICAgICAgICAgICAmJiBQeURpY3RfQ2hlY2tFeGFjdChmLT5mX2J1aWx0aW5zKSkgeworICAgICAgICAgICAgICAgICYmIFB5RGljdF9DaGVja0V4YWN0KGYtPmZfYnVpbHRpbnMpKQorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHYgPSBfUHlEaWN0X0xvYWRHbG9iYWwoKFB5RGljdE9iamVjdCAqKWYtPmZfZ2xvYmFscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURpY3RPYmplY3QgKilmLT5mX2J1aWx0aW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIV9QeUVycl9PQ0NVUlJFRCgpKQorICAgICAgICAgICAgICAgICAgICBpZiAoIV9QeUVycl9PQ0NVUlJFRCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBfUHlEaWN0X0xvYWRHbG9iYWwoKSByZXR1cm5zIE5VTEwgd2l0aG91dCByYWlzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbiBleGNlcHRpb24gaWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeUV4Y19OYW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FX0VSUk9SX01TRywgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHYpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogU2xvdy1wYXRoIGlmIGdsb2JhbHMgb3IgYnVpbHRpbnMgaXMgbm90IGEgZGljdCAqLworCisgICAgICAgICAgICAgICAgLyogbmFtZXNwYWNlIDE6IGdsb2JhbHMgKi8KICAgICAgICAgICAgICAgICB2ID0gUHlPYmplY3RfR2V0SXRlbShmLT5mX2dsb2JhbHMsIG5hbWUpOwogICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAKKyAgICAgICAgICAgICAgICAgICAgLyogbmFtZXNwYWNlIDI6IGJ1aWx0aW5zICovCiAgICAgICAgICAgICAgICAgICAgIHYgPSBQeU9iamVjdF9HZXRJdGVtKGYtPmZfYnVpbHRpbnMsIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCkBAIC0yNDc3LDcgKzI1NjksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgdmFsdWUgPSBQeU9iamVjdF9HZXRJdGVtKGxvY2FscywgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwpAQCAtMjUxNiw2ICsyNjA4LDI0IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKKyAgICAgICAgVEFSR0VUKEJVSUxEX1NUUklORykgeworICAgICAgICAgICAgUHlPYmplY3QgKnN0cjsKKyAgICAgICAgICAgIFB5T2JqZWN0ICplbXB0eSA9IFB5VW5pY29kZV9OZXcoMCwgMCk7CisgICAgICAgICAgICBpZiAoZW1wdHkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHIgPSBfUHlVbmljb2RlX0pvaW5BcnJheShlbXB0eSwgc3RhY2tfcG9pbnRlciAtIG9wYXJnLCBvcGFyZyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZW1wdHkpOworICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB3aGlsZSAoLS1vcGFyZyA+PSAwKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQT1AoKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQVVNIKHN0cik7CisgICAgICAgICAgICBESVNQQVRDSCgpOworICAgICAgICB9CisKICAgICAgICAgVEFSR0VUKEJVSUxEX1RVUExFKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdHVwID0gUHlUdXBsZV9OZXcob3BhcmcpOwogICAgICAgICAgICAgaWYgKHR1cCA9PSBOVUxMKQpAQCAtMjU0MCwxMyArMjY1MCwxOCBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFRBUkdFVF9XSVRIX0lNUEwoQlVJTERfVFVQTEVfVU5QQUNLLCBfYnVpbGRfbGlzdF91bnBhY2spCi0gICAgICAgIFRBUkdFVChCVUlMRF9MSVNUX1VOUEFDSykKLSAgICAgICAgX2J1aWxkX2xpc3RfdW5wYWNrOiB7CisgICAgICAgIFRBUkdFVChCVUlMRF9UVVBMRV9VTlBBQ0spCisgICAgICAgIFRBUkdFVChCVUlMRF9MSVNUX1VOUEFDSykgewogICAgICAgICAgICAgaW50IGNvbnZlcnRfdG9fdHVwbGUgPSBvcGNvZGUgPT0gQlVJTERfVFVQTEVfVU5QQUNLOwotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBQeU9iamVjdCAqc3VtID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzdW07CiAgICAgICAgICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlOworCisgICAgICAgICAgICBpZiAoY29udmVydF90b190dXBsZSAmJiBvcGFyZyA9PSAxICYmIFB5VHVwbGVfQ2hlY2tFeGFjdChUT1AoKSkpIHsKKyAgICAgICAgICAgICAgICBESVNQQVRDSCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdW0gPSBQeUxpc3RfTmV3KDApOwogICAgICAgICAgICAgaWYgKHN1bSA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKQEAgLTI1OTksNyArMjcxNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBUQVJHRVQoQlVJTERfU0VUX1VOUEFDSykgewotICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CiAgICAgICAgICAgICBQeU9iamVjdCAqc3VtID0gUHlTZXRfTmV3KE5VTEwpOwogICAgICAgICAgICAgaWYgKHN1bSA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0yNjE4LDcgKzI3MzMsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgVEFSR0VUKEJVSUxEX01BUCkgewotICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CiAgICAgICAgICAgICBQeU9iamVjdCAqbWFwID0gX1B5RGljdF9OZXdQcmVzaXplZCgoUHlfc3NpemVfdClvcGFyZyk7CiAgICAgICAgICAgICBpZiAobWFwID09IE5VTEwpCiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTI2NDEsMzMgKzI3NTYsMTE3IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgVEFSR0VUX1dJVEhfSU1QTChCVUlMRF9NQVBfVU5QQUNLX1dJVEhfQ0FMTCwgX2J1aWxkX21hcF91bnBhY2spCi0gICAgICAgIFRBUkdFVChCVUlMRF9NQVBfVU5QQUNLKQotICAgICAgICBfYnVpbGRfbWFwX3VucGFjazogewotICAgICAgICAgICAgaW50IHdpdGhfY2FsbCA9IG9wY29kZSA9PSBCVUlMRF9NQVBfVU5QQUNLX1dJVEhfQ0FMTDsKLSAgICAgICAgICAgIGludCBudW1fbWFwczsKLSAgICAgICAgICAgIGludCBmdW5jdGlvbl9sb2NhdGlvbjsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgUHlPYmplY3QgKnN1bSA9IFB5RGljdF9OZXcoKTsKLSAgICAgICAgICAgIGlmIChzdW0gPT0gTlVMTCkKKyAgICAgICAgVEFSR0VUKFNFVFVQX0FOTk9UQVRJT05TKSB7CisgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX2Fubm90YXRpb25zX18pOworICAgICAgICAgICAgaW50IGVycjsKKyAgICAgICAgICAgIFB5T2JqZWN0ICphbm5fZGljdDsKKyAgICAgICAgICAgIGlmIChmLT5mX2xvY2FscyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gbG9jYWxzIGZvdW5kIHdoZW4gc2V0dGluZyB1cCBhbm5vdGF0aW9ucyIpOwogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICBpZiAod2l0aF9jYWxsKSB7Ci0gICAgICAgICAgICAgICAgbnVtX21hcHMgPSBvcGFyZyAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgZnVuY3Rpb25fbG9jYXRpb24gPSAob3Bhcmc+PjgpICYgMHhmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIF9fYW5ub3RhdGlvbnNfXyBpbiBsb2NhbHMoKS4uLiAqLworICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KGYtPmZfbG9jYWxzKSkgeworICAgICAgICAgICAgICAgIGFubl9kaWN0ID0gX1B5RGljdF9HZXRJdGVtSWQoZi0+Zl9sb2NhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlJZF9fX2Fubm90YXRpb25zX18pOworICAgICAgICAgICAgICAgIGlmIChhbm5fZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIC4uLmlmIG5vdCwgY3JlYXRlIGEgbmV3IG9uZSAqLworICAgICAgICAgICAgICAgICAgICBhbm5fZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFubl9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gX1B5RGljdF9TZXRJdGVtSWQoZi0+Zl9sb2NhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUlkX19fYW5ub3RhdGlvbnNfXywgYW5uX2RpY3QpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYW5uX2RpY3QpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBudW1fbWFwcyA9IG9wYXJnOworICAgICAgICAgICAgICAgIC8qIGRvIHRoZSBzYW1lIGlmIGxvY2FscygpIGlzIG5vdCBhIGRpY3QgKi8KKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqYW5uX3N0ciA9IF9QeVVuaWNvZGVfRnJvbUlkKCZQeUlkX19fYW5ub3RhdGlvbnNfXyk7CisgICAgICAgICAgICAgICAgaWYgKGFubl9zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYW5uX2RpY3QgPSBQeU9iamVjdF9HZXRJdGVtKGYtPmZfbG9jYWxzLCBhbm5fc3RyKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5uX2RpY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGFubl9kaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgICAgICAgICBpZiAoYW5uX2RpY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSBQeU9iamVjdF9TZXRJdGVtKGYtPmZfbG9jYWxzLCBhbm5fc3RyLCBhbm5fZGljdCk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhbm5fZGljdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFubl9kaWN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBESVNQQVRDSCgpOworICAgICAgICB9CisKKyAgICAgICAgVEFSR0VUKEJVSUxEX0NPTlNUX0tFWV9NQVApIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICptYXA7CisgICAgICAgICAgICBQeU9iamVjdCAqa2V5cyA9IFRPUCgpOworICAgICAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrRXhhY3Qoa2V5cykgfHwKKyAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKGtleXMpICE9IChQeV9zc2l6ZV90KW9wYXJnKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIEJVSUxEX0NPTlNUX0tFWV9NQVAga2V5cyBhcmd1bWVudCIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXAgPSBfUHlEaWN0X05ld1ByZXNpemVkKChQeV9zc2l6ZV90KW9wYXJnKTsKKyAgICAgICAgICAgIGlmIChtYXAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSBvcGFyZzsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGludCBlcnI7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKmtleSA9IFB5VHVwbGVfR0VUX0lURU0oa2V5cywgb3BhcmcgLSBpKTsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWUgPSBQRUVLKGkgKyAxKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbShtYXAsIGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWFwKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoaSA9IG51bV9tYXBzOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoUE9QKCkpOworICAgICAgICAgICAgd2hpbGUgKG9wYXJnLS0pIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoUE9QKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUFVTSChtYXApOworICAgICAgICAgICAgRElTUEFUQ0goKTsKKyAgICAgICAgfQorCisgICAgICAgIFRBUkdFVChCVUlMRF9NQVBfVU5QQUNLX1dJVEhfQ0FMTCkKKyAgICAgICAgVEFSR0VUKEJVSUxEX01BUF9VTlBBQ0spIHsKKyAgICAgICAgICAgIGludCB3aXRoX2NhbGwgPSBvcGNvZGUgPT0gQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEw7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICBQeU9iamVjdCAqc3VtOworCisgICAgICAgICAgICBpZiAod2l0aF9jYWxsICYmIG9wYXJnID09IDEgJiYgUHlEaWN0X0NoZWNrRXhhY3QoVE9QKCkpKSB7CisgICAgICAgICAgICAgICAgRElTUEFUQ0goKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3VtID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKHN1bSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgICAgIGZvciAoaSA9IG9wYXJnOyBpID4gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZyA9IFBFRUsoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHdpdGhfY2FsbCkgeworICAgICAgICAgICAgICAgIGlmICh3aXRoX2NhbGwgJiYgUHlEaWN0X1NpemUoc3VtKSkgewogICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqaW50ZXJzZWN0aW9uID0gX1B5RGljdFZpZXdfSW50ZXJzZWN0KHN1bSwgYXJnKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpmdW5jID0gKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVFSyhmdW5jdGlvbl9sb2NhdGlvbiArIG51bV9tYXBzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZ1bmMgPSBQRUVLKDIgKyBvcGFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMlLjIwMHMgYXJndW1lbnQgYWZ0ZXIgKiogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgYSBtYXBwaW5nLCBub3QgJS4yMDBzIiwKQEAgLTI2ODIsNyArMjg4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChQeVNldF9HRVRfU0laRShpbnRlcnNlY3Rpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGlkeCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5OwotICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZ1bmMgPSBQRUVLKGZ1bmN0aW9uX2xvY2F0aW9uICsgbnVtX21hcHMpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZ1bmMgPSBQRUVLKDIgKyBvcGFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBQeV9oYXNoX3QgaGFzaDsKICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVNldF9OZXh0RW50cnkoaW50ZXJzZWN0aW9uLCAmaWR4LCAma2V5LCAmaGFzaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhrZXkpKSB7CkBAIC0yNzE2LDcgKzI5MTUsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgd2hpbGUgKG51bV9tYXBzLS0pCisgICAgICAgICAgICB3aGlsZSAob3BhcmctLSkKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoUE9QKCkpOwogICAgICAgICAgICAgUFVTSChzdW0pOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKQEAgLTI3NjUsNDUgKzI5NjQsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIFRBUkdFVChJTVBPUlRfTkFNRSkgewotICAgICAgICAgICAgX1B5X0lERU5USUZJRVIoX19pbXBvcnRfXyk7CiAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpmdW5jID0gX1B5RGljdF9HZXRJdGVtSWQoZi0+Zl9idWlsdGlucywgJlB5SWRfX19pbXBvcnRfXyk7Ci0gICAgICAgICAgICBQeU9iamVjdCAqZnJvbSwgKmxldmVsLCAqYXJncywgKnJlczsKLSAgICAgICAgICAgIGlmIChmdW5jID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ltcG9ydF9fIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeV9JTkNSRUYoZnVuYyk7Ci0gICAgICAgICAgICBmcm9tID0gUE9QKCk7Ci0gICAgICAgICAgICBsZXZlbCA9IFRPUCgpOwotICAgICAgICAgICAgaWYgKFB5TG9uZ19Bc0xvbmcobGV2ZWwpICE9IC0xIHx8IFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjayg1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9nbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfbG9jYWxzID09IE5VTEwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUgOiBmLT5mX2xvY2FscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2dsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9sb2NhbHMgPT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSA6IGYtPmZfbG9jYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20pOwotICAgICAgICAgICAgUHlfREVDUkVGKGxldmVsKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihmcm9tKTsKLSAgICAgICAgICAgIGlmIChhcmdzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgU1RBQ0tBREooLTEpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBQeU9iamVjdCAqZnJvbWxpc3QgPSBQT1AoKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpsZXZlbCA9IFRPUCgpOworICAgICAgICAgICAgUHlPYmplY3QgKnJlczsKICAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIwKTsKLSAgICAgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOworICAgICAgICAgICAgcmVzID0gaW1wb3J0X25hbWUoZiwgbmFtZSwgZnJvbWxpc3QsIGxldmVsKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsZXZlbCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnJvbWxpc3QpOwogICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjEpOwotICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwogICAgICAgICAgICAgU0VUX1RPUChyZXMpOwogICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0yODUwLDcgKzMwMTksNyBAQAogICAgICAgICAgICAgRkFTVF9ESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKFBPUF9KVU1QX0lGX0ZBTFNFKTsKKyAgICAgICAgUFJFRElDVEVEKFBPUF9KVU1QX0lGX0ZBTFNFKTsKICAgICAgICAgVEFSR0VUKFBPUF9KVU1QX0lGX0ZBTFNFKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqY29uZCA9IFBPUCgpOwogICAgICAgICAgICAgaW50IGVycjsKQEAgLTI4NzQsNyArMzA0Myw3IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKFBPUF9KVU1QX0lGX1RSVUUpOworICAgICAgICBQUkVESUNURUQoUE9QX0pVTVBfSUZfVFJVRSk7CiAgICAgICAgIFRBUkdFVChQT1BfSlVNUF9JRl9UUlVFKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqY29uZCA9IFBPUCgpOwogICAgICAgICAgICAgaW50IGVycjsKQEAgLTI5NTEsNyArMzEyMCw3IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKEpVTVBfQUJTT0xVVEUpOworICAgICAgICBQUkVESUNURUQoSlVNUF9BQlNPTFVURSk7CiAgICAgICAgIFRBUkdFVChKVU1QX0FCU09MVVRFKSB7CiAgICAgICAgICAgICBKVU1QVE8ob3BhcmcpOwogI2lmIEZBU1RfTE9PUFMKQEAgLTI5NzcsNiArMzE0Niw3IEBACiAgICAgICAgICAgICBpZiAoaXRlciA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICBQUkVESUNUKEZPUl9JVEVSKTsKKyAgICAgICAgICAgIFBSRURJQ1QoQ0FMTF9GVU5DVElPTik7CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKQEAgLTMwMDUsMTAgKzMxNzUsMTEgQEAKICAgICAgICAgICAgICAgICBpZiAoaXRlciA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgUFJFRElDVChMT0FEX0NPTlNUKTsKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAotICAgICAgICBQUkVESUNURURfV0lUSF9BUkcoRk9SX0lURVIpOworICAgICAgICBQUkVESUNURUQoRk9SX0lURVIpOwogICAgICAgICBUQVJHRVQoRk9SX0lURVIpIHsKICAgICAgICAgICAgIC8qIGJlZm9yZTogW2l0ZXJdOyBhZnRlcjogW2l0ZXIsIGl0ZXIoKV0gKm9yKiBbXSAqLwogICAgICAgICAgICAgUHlPYmplY3QgKml0ZXIgPSBUT1AoKTsKQEAgLTMwMzAsNiArMzIwMSw3IEBACiAgICAgICAgICAgICBTVEFDS0FESigtMSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlcik7CiAgICAgICAgICAgICBKVU1QQlkob3BhcmcpOworICAgICAgICAgICAgUFJFRElDVChQT1BfQkxPQ0spOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCkBAIC0zMDQ2LDEwICszMjE4LDkgQEAKICAgICAgICAgICAgIGdvdG8gZmFzdF9ibG9ja19lbmQ7CiAgICAgICAgIH0KIAotICAgICAgICBUQVJHRVRfV0lUSF9JTVBMKFNFVFVQX0xPT1AsIF9zZXR1cF9maW5hbGx5KQotICAgICAgICBUQVJHRVRfV0lUSF9JTVBMKFNFVFVQX0VYQ0VQVCwgX3NldHVwX2ZpbmFsbHkpCi0gICAgICAgIFRBUkdFVChTRVRVUF9GSU5BTExZKQotICAgICAgICBfc2V0dXBfZmluYWxseTogeworICAgICAgICBUQVJHRVQoU0VUVVBfTE9PUCkKKyAgICAgICAgVEFSR0VUKFNFVFVQX0VYQ0VQVCkKKyAgICAgICAgVEFSR0VUKFNFVFVQX0ZJTkFMTFkpIHsKICAgICAgICAgICAgIC8qIE5PVEU6IElmIHlvdSBhZGQgYW55IG5ldyBibG9jay1zZXR1cCBvcGNvZGVzIHRoYXQKICAgICAgICAgICAgICAgIGFyZSBub3QgdHJ5L2V4Y2VwdC9maW5hbGx5IGhhbmRsZXJzLCB5b3UgbWF5IG5lZWQKICAgICAgICAgICAgICAgIHRvIHVwZGF0ZSB0aGUgUHlHZW5fTmVlZHNGaW5hbGl6aW5nKCkgZnVuY3Rpb24uCkBAIC0zMDgwLDYgKzMyNTEsNyBAQAogICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICBQVVNIKHJlcyk7CisgICAgICAgICAgICBQUkVESUNUKEdFVF9BV0FJVEFCTEUpOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCkBAIC0zMjI4LDE3OCArMzQwMCwxMDEgQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAorICAgICAgICBQUkVESUNURUQoQ0FMTF9GVU5DVElPTik7CiAgICAgICAgIFRBUkdFVChDQUxMX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqKnNwLCAqcmVzOwogICAgICAgICAgICAgUENBTEwoUENBTExfQUxMKTsKICAgICAgICAgICAgIHNwID0gc3RhY2tfcG9pbnRlcjsKICNpZmRlZiBXSVRIX1RTQwotICAgICAgICAgICAgcmVzID0gY2FsbF9mdW5jdGlvbigmc3AsIG9wYXJnLCAmaW50cjAsICZpbnRyMSk7CisgICAgICAgICAgICByZXMgPSBjYWxsX2Z1bmN0aW9uKCZzcCwgb3BhcmcsIE5VTEwsICZpbnRyMCwgJmludHIxKTsKICNlbHNlCi0gICAgICAgICAgICByZXMgPSBjYWxsX2Z1bmN0aW9uKCZzcCwgb3BhcmcpOworICAgICAgICAgICAgcmVzID0gY2FsbF9mdW5jdGlvbigmc3AsIG9wYXJnLCBOVUxMKTsKICNlbmRpZgogICAgICAgICAgICAgc3RhY2tfcG9pbnRlciA9IHNwOwogICAgICAgICAgICAgUFVTSChyZXMpOwotICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAotICAgICAgICBUQVJHRVRfV0lUSF9JTVBMKENBTExfRlVOQ1RJT05fVkFSLCBfY2FsbF9mdW5jdGlvbl92YXJfa3cpCi0gICAgICAgIFRBUkdFVF9XSVRIX0lNUEwoQ0FMTF9GVU5DVElPTl9LVywgX2NhbGxfZnVuY3Rpb25fdmFyX2t3KQotICAgICAgICBUQVJHRVQoQ0FMTF9GVU5DVElPTl9WQVJfS1cpCi0gICAgICAgIF9jYWxsX2Z1bmN0aW9uX3Zhcl9rdzogewotICAgICAgICAgICAgaW50IG5hID0gb3BhcmcgJiAweGZmOwotICAgICAgICAgICAgaW50IG5rID0gKG9wYXJnPj44KSAmIDB4ZmY7Ci0gICAgICAgICAgICBpbnQgZmxhZ3MgPSAob3Bjb2RlIC0gQ0FMTF9GVU5DVElPTikgJiAzOwotICAgICAgICAgICAgaW50IG4gPSBuYSArIDIgKiBuazsKLSAgICAgICAgICAgIFB5T2JqZWN0ICoqcGZ1bmMsICpmdW5jLCAqKnNwLCAqcmVzOworICAgICAgICBUQVJHRVQoQ0FMTF9GVU5DVElPTl9LVykgeworICAgICAgICAgICAgUHlPYmplY3QgKipzcCwgKnJlcywgKm5hbWVzOworCisgICAgICAgICAgICBuYW1lcyA9IFBPUCgpOworICAgICAgICAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2tFeGFjdChuYW1lcykgJiYgUHlUdXBsZV9HRVRfU0laRShuYW1lcykgPD0gb3BhcmcpOwogICAgICAgICAgICAgUENBTEwoUENBTExfQUxMKTsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIENBTExfRkxBR19WQVIpCi0gICAgICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgaWYgKGZsYWdzICYgQ0FMTF9GTEFHX0tXKQotICAgICAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgIHBmdW5jID0gc3RhY2tfcG9pbnRlciAtIG4gLSAxOwotICAgICAgICAgICAgZnVuYyA9ICpwZnVuYzsKLQotICAgICAgICAgICAgaWYgKFB5TWV0aG9kX0NoZWNrKGZ1bmMpCi0gICAgICAgICAgICAgICAgJiYgUHlNZXRob2RfR0VUX1NFTEYoZnVuYykgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzZWxmID0gUHlNZXRob2RfR0VUX1NFTEYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICAgICAgICAgIGZ1bmMgPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oZnVuYyk7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgIFB5X1NFVFJFRigqcGZ1bmMsIHNlbGYpOwotICAgICAgICAgICAgICAgIG5hKys7Ci0gICAgICAgICAgICAgICAgLyogbisrOyAqLwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOwogICAgICAgICAgICAgc3AgPSBzdGFja19wb2ludGVyOwotICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjApOwotICAgICAgICAgICAgcmVzID0gZXh0X2RvX2NhbGwoZnVuYywgJnNwLCBmbGFncywgbmEsIG5rKTsKLSAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIxKTsKKyNpZmRlZiBXSVRIX1RTQworICAgICAgICAgICAgcmVzID0gY2FsbF9mdW5jdGlvbigmc3AsIG9wYXJnLCBuYW1lcywgJmludHIwLCAmaW50cjEpOworI2Vsc2UKKyAgICAgICAgICAgIHJlcyA9IGNhbGxfZnVuY3Rpb24oJnNwLCBvcGFyZywgbmFtZXMpOworI2VuZGlmCiAgICAgICAgICAgICBzdGFja19wb2ludGVyID0gc3A7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChzdGFja19wb2ludGVyID4gcGZ1bmMpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqbyA9IFBPUCgpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIFBVU0gocmVzKTsKLSAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7CisKKyAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgVEFSR0VUX1dJVEhfSU1QTChNQUtFX0NMT1NVUkUsIF9tYWtlX2Z1bmN0aW9uKQotICAgICAgICBUQVJHRVQoTUFLRV9GVU5DVElPTikKLSAgICAgICAgX21ha2VfZnVuY3Rpb246IHsKLSAgICAgICAgICAgIGludCBwb3NkZWZhdWx0cyA9IG9wYXJnICYgMHhmZjsKLSAgICAgICAgICAgIGludCBrd2RlZmF1bHRzID0gKG9wYXJnPj44KSAmIDB4ZmY7Ci0gICAgICAgICAgICBpbnQgbnVtX2Fubm90YXRpb25zID0gKG9wYXJnID4+IDE2KSAmIDB4N2ZmZjsKKyAgICAgICAgVEFSR0VUKENBTExfRlVOQ1RJT05fRVgpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmdW5jLCAqY2FsbGFyZ3MsICprd2FyZ3MgPSBOVUxMLCAqcmVzdWx0OworICAgICAgICAgICAgUENBTEwoUENBTExfQUxMKTsKKyAgICAgICAgICAgIGlmIChvcGFyZyAmIDB4MDEpIHsKKyAgICAgICAgICAgICAgICBrd2FyZ3MgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlEaWN0X0NoZWNrRXhhY3Qoa3dhcmdzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWxsYXJncyA9IFBPUCgpOworICAgICAgICAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2tFeGFjdChjYWxsYXJncykpOworICAgICAgICAgICAgZnVuYyA9IFRPUCgpOwogCi0gICAgICAgICAgICBQeU9iamVjdCAqcXVhbG5hbWUgPSBQT1AoKTsgLyogcXVhbG5hbWUgKi8KLSAgICAgICAgICAgIFB5T2JqZWN0ICpjb2RlID0gUE9QKCk7IC8qIGNvZGUgb2JqZWN0ICovCi0gICAgICAgICAgICBQeU9iamVjdCAqZnVuYyA9IFB5RnVuY3Rpb25fTmV3V2l0aFF1YWxOYW1lKGNvZGUsIGYtPmZfZ2xvYmFscywgcXVhbG5hbWUpOwotICAgICAgICAgICAgUHlfREVDUkVGKGNvZGUpOwotICAgICAgICAgICAgUHlfREVDUkVGKHF1YWxuYW1lKTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIwKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGRvX2NhbGxfY29yZShmdW5jLCBjYWxsYXJncywga3dhcmdzKTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIxKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjYWxsYXJncyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGt3YXJncyk7CiAKLSAgICAgICAgICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgICAgICBTRVRfVE9QKHJlc3VsdCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRElTUEFUQ0goKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAob3Bjb2RlID09IE1BS0VfQ0xPU1VSRSkgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjbG9zdXJlID0gUE9QKCk7Ci0gICAgICAgICAgICAgICAgaWYgKFB5RnVuY3Rpb25fU2V0Q2xvc3VyZShmdW5jLCBjbG9zdXJlKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGhhcHBlbiB1bmxlc3MgYnl0ZWNvZGUgaXMgY29ycnVwdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY2xvc3VyZSk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjbG9zdXJlKTsKKyAgICAgICAgVEFSR0VUKE1BS0VfRlVOQ1RJT04pIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpxdWFsbmFtZSA9IFBPUCgpOworICAgICAgICAgICAgUHlPYmplY3QgKmNvZGVvYmogPSBQT1AoKTsKKyAgICAgICAgICAgIFB5RnVuY3Rpb25PYmplY3QgKmZ1bmMgPSAoUHlGdW5jdGlvbk9iamVjdCAqKQorICAgICAgICAgICAgICAgIFB5RnVuY3Rpb25fTmV3V2l0aFF1YWxOYW1lKGNvZGVvYmosIGYtPmZfZ2xvYmFscywgcXVhbG5hbWUpOworCisgICAgICAgICAgICBQeV9ERUNSRUYoY29kZW9iaik7CisgICAgICAgICAgICBQeV9ERUNSRUYocXVhbG5hbWUpOworICAgICAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChudW1fYW5ub3RhdGlvbnMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuYW1lX2l4OwotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcyA9IFBPUCgpOyAvKiBuYW1lcyBvZiBhcmdzIHdpdGggYW5ub3RhdGlvbnMgKi8KLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqYW5ucyA9IFB5RGljdF9OZXcoKTsKLSAgICAgICAgICAgICAgICBpZiAoYW5ucyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5hbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmFtZV9peCA9IFB5VHVwbGVfU2l6ZShuYW1lcyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KG51bV9hbm5vdGF0aW9ucyA9PSBuYW1lX2l4KzEpOwotICAgICAgICAgICAgICAgIHdoaWxlIChuYW1lX2l4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSwgKnZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpbnQgZXJyOwotICAgICAgICAgICAgICAgICAgICAtLW5hbWVfaXg7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKG5hbWVzLCBuYW1lX2l4KTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBQT1AoKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oYW5ucywgbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhbm5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXRBbm5vdGF0aW9ucyhmdW5jLCBhbm5zKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGhhcHBlbiB1bmxlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9TZXRBbm5vdGF0aW9ucyBjaGFuZ2VzLiAqLwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYW5ucyk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGFubnMpOworICAgICAgICAgICAgaWYgKG9wYXJnICYgMHgwOCkgeworICAgICAgICAgICAgICAgIGFzc2VydChQeVR1cGxlX0NoZWNrRXhhY3QoVE9QKCkpKTsKKyAgICAgICAgICAgICAgICBmdW5jIC0+ZnVuY19jbG9zdXJlID0gUE9QKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3BhcmcgJiAweDA0KSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KFB5RGljdF9DaGVja0V4YWN0KFRPUCgpKSk7CisgICAgICAgICAgICAgICAgZnVuYy0+ZnVuY19hbm5vdGF0aW9ucyA9IFBPUCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wYXJnICYgMHgwMikgeworICAgICAgICAgICAgICAgIGFzc2VydChQeURpY3RfQ2hlY2tFeGFjdChUT1AoKSkpOworICAgICAgICAgICAgICAgIGZ1bmMtPmZ1bmNfa3dkZWZhdWx0cyA9IFBPUCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wYXJnICYgMHgwMSkgeworICAgICAgICAgICAgICAgIGFzc2VydChQeVR1cGxlX0NoZWNrRXhhY3QoVE9QKCkpKTsKKyAgICAgICAgICAgICAgICBmdW5jLT5mdW5jX2RlZmF1bHRzID0gUE9QKCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8qIFhYWCBNYXliZSB0aGlzIHNob3VsZCBiZSBhIHNlcGFyYXRlIG9wY29kZT8gKi8KLSAgICAgICAgICAgIGlmIChrd2RlZmF1bHRzID4gMCkgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpkZWZzID0gUHlEaWN0X05ldygpOwotICAgICAgICAgICAgICAgIGlmIChkZWZzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoLS1rd2RlZmF1bHRzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQT1AoKTsgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5ID0gUE9QKCk7IC8qIGt3IG9ubHkgYXJnIG5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IFB5RGljdF9TZXRJdGVtKGRlZnMsIGtleSwgdik7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGRlZnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXRLd0RlZmF1bHRzKGZ1bmMsIGRlZnMpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgaGFwcGVuIHVubGVzcwotICAgICAgICAgICAgICAgICAgICAgICBQeUZ1bmN0aW9uX1NldEt3RGVmYXVsdHMgY2hhbmdlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGVmcyk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkZWZzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwb3NkZWZhdWx0cyA+IDApIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqZGVmcyA9IFB5VHVwbGVfTmV3KHBvc2RlZmF1bHRzKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKC0tcG9zZGVmYXVsdHMgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShkZWZzLCBwb3NkZWZhdWx0cywgUE9QKCkpOwotICAgICAgICAgICAgICAgIGlmIChQeUZ1bmN0aW9uX1NldERlZmF1bHRzKGZ1bmMsIGRlZnMpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgaGFwcGVuIHVubGVzcwotICAgICAgICAgICAgICAgICAgICAgICBQeUZ1bmN0aW9uX1NldERlZmF1bHRzIGNoYW5nZXMuICovCi0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkZWZzKTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGVmcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQVVNIKGZ1bmMpOworICAgICAgICAgICAgUFVTSCgoUHlPYmplY3QgKilmdW5jKTsKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIApAQCAtMzQyMSw5ICszNTE2LDY4IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKKyAgICAgICAgVEFSR0VUKEZPUk1BVF9WQUxVRSkgeworICAgICAgICAgICAgLyogSGFuZGxlcyBmLXN0cmluZyB2YWx1ZSBmb3JtYXR0aW5nLiAqLworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmbXRfc3BlYzsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICooKmNvbnZfZm4pKFB5T2JqZWN0ICopOworICAgICAgICAgICAgaW50IHdoaWNoX2NvbnZlcnNpb24gPSBvcGFyZyAmIEZWQ19NQVNLOworICAgICAgICAgICAgaW50IGhhdmVfZm10X3NwZWMgPSAob3BhcmcgJiBGVlNfTUFTSykgPT0gRlZTX0hBVkVfU1BFQzsKKworICAgICAgICAgICAgZm10X3NwZWMgPSBoYXZlX2ZtdF9zcGVjID8gUE9QKCkgOiBOVUxMOworICAgICAgICAgICAgdmFsdWUgPSBQT1AoKTsKKworICAgICAgICAgICAgLyogU2VlIGlmIGFueSBjb252ZXJzaW9uIGlzIHNwZWNpZmllZC4gKi8KKyAgICAgICAgICAgIHN3aXRjaCAod2hpY2hfY29udmVyc2lvbikgeworICAgICAgICAgICAgY2FzZSBGVkNfU1RSOiAgIGNvbnZfZm4gPSBQeU9iamVjdF9TdHI7ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZWQ19SRVBSOiAgY29udl9mbiA9IFB5T2JqZWN0X1JlcHI7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRlZDX0FTQ0lJOiBjb252X2ZuID0gUHlPYmplY3RfQVNDSUk7IGJyZWFrOworCisgICAgICAgICAgICAvKiBNdXN0IGJlIDAgKG1lYW5pbmcgbm8gY29udmVyc2lvbiksIHNpbmNlIG9ubHkgZm91cgorICAgICAgICAgICAgICAgdmFsdWVzIGFyZSBhbGxvd2VkIGJ5IChvcGFyZyAmIEZWQ19NQVNLKS4gKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICBjb252X2ZuID0gTlVMTDsgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiB0aGVyZSdzIGEgY29udmVyc2lvbiBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgcmVwbGFjZQorICAgICAgICAgICAgICAgdmFsdWUgd2l0aCB0aGF0IHJlc3VsdC4gT3RoZXJ3aXNlLCBqdXN0IHVzZSB2YWx1ZSwKKyAgICAgICAgICAgICAgIHdpdGhvdXQgY29udmVyc2lvbi4gKi8KKyAgICAgICAgICAgIGlmIChjb252X2ZuICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjb252X2ZuKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGZtdF9zcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIHZhbHVlIGlzIGEgdW5pY29kZSBvYmplY3QsIGFuZCB0aGVyZSdzIG5vIGZtdF9zcGVjLAorICAgICAgICAgICAgICAgdGhlbiB3ZSBrbm93IHRoZSByZXN1bHQgb2YgZm9ybWF0KHZhbHVlKSBpcyB2YWx1ZQorICAgICAgICAgICAgICAgaXRzZWxmLiBJbiB0aGF0IGNhc2UsIHNraXAgY2FsbGluZyBmb3JtYXQoKS4gSSBwbGFuIHRvCisgICAgICAgICAgICAgICBtb3ZlIHRoaXMgb3B0aW1pemF0aW9uIGluIHRvIFB5T2JqZWN0X0Zvcm1hdCgpCisgICAgICAgICAgICAgICBpdHNlbGYuICovCisgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3QodmFsdWUpICYmIGZtdF9zcGVjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBEbyBub3RoaW5nLCBqdXN0IHRyYW5zZmVyIG93bmVyc2hpcCB0byByZXN1bHQuICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEFjdHVhbGx5IGNhbGwgZm9ybWF0KCkuICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfRm9ybWF0KHZhbHVlLCBmbXRfc3BlYyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGZtdF9zcGVjKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBVU0gocmVzdWx0KTsKKyAgICAgICAgICAgIERJU1BBVENIKCk7CisgICAgICAgIH0KKwogICAgICAgICBUQVJHRVQoRVhURU5ERURfQVJHKSB7Ci0gICAgICAgICAgICBvcGNvZGUgPSBORVhUT1AoKTsKLSAgICAgICAgICAgIG9wYXJnID0gb3Bhcmc8PDE2IHwgTkVYVEFSRygpOworICAgICAgICAgICAgaW50IG9sZG9wYXJnID0gb3Bhcmc7CisgICAgICAgICAgICBORVhUT1BBUkcoKTsKKyAgICAgICAgICAgIG9wYXJnIHw9IG9sZG9wYXJnIDw8IDg7CiAgICAgICAgICAgICBnb3RvIGRpc3BhdGNoX29wY29kZTsKICAgICAgICAgfQogCkBAIC0zNTczLDcgKzM3MjcsNyBAQAogICAgIGFzc2VydCgocmV0dmFsICE9IE5VTEwpIF4gKFB5RXJyX09jY3VycmVkKCkgIT0gTlVMTCkpOwogCiBmYXN0X3lpZWxkOgotICAgIGlmIChjby0+Y29fZmxhZ3MgJiAoQ09fR0VORVJBVE9SIHwgQ09fQ09ST1VUSU5FKSkgeworICAgIGlmIChjby0+Y29fZmxhZ3MgJiAoQ09fR0VORVJBVE9SIHwgQ09fQ09ST1VUSU5FIHwgQ09fQVNZTkNfR0VORVJBVE9SKSkgewogCiAgICAgICAgIC8qIFRoZSBwdXJwb3NlIG9mIHRoaXMgYmxvY2sgaXMgdG8gcHV0IGFzaWRlIHRoZSBnZW5lcmF0b3IncyBleGNlcHRpb24KICAgICAgICAgICAgc3RhdGUgYW5kIHJlc3RvcmUgdGhhdCBvZiB0aGUgY2FsbGluZyBmcmFtZS4gSWYgdGhlIGN1cnJlbnQKQEAgLTM1ODQsOSArMzczOCwxMSBAQAogICAgICAgICAgICBzdGF0ZSBjYW1lIGludG8gZXhpc3RlbmNlIGluIHRoaXMgZnJhbWUuIChBbiB1bmNhdWdodCBleGNlcHRpb24KICAgICAgICAgICAgd291bGQgaGF2ZSB3aHkgPT0gV0hZX0VYQ0VQVElPTiwgYW5kIHdlIHdvdWxkbid0IGJlIGhlcmUpLiAqLwogICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGYtPmZfaWJsb2NrOyBpKyspCi0gICAgICAgICAgICBpZiAoZi0+Zl9ibG9ja3N0YWNrW2ldLmJfdHlwZSA9PSBFWENFUFRfSEFORExFUikKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGYtPmZfaWJsb2NrOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmLT5mX2Jsb2Nrc3RhY2tbaV0uYl90eXBlID09IEVYQ0VQVF9IQU5ETEVSKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaWYgKGkgPT0gZi0+Zl9pYmxvY2spCiAgICAgICAgICAgICAvKiBXZSBkaWQgbm90IGNyZWF0ZSB0aGlzIGV4Y2VwdGlvbi4gKi8KICAgICAgICAgICAgIHJlc3RvcmVfYW5kX2NsZWFyX2V4Y19zdGF0ZSh0c3RhdGUsIGYpOwpAQCAtMzY5NywxMiArMzg1MywxMiBAQAogfQogCiBzdGF0aWMgdm9pZAotbWlzc2luZ19hcmd1bWVudHMoUHlDb2RlT2JqZWN0ICpjbywgaW50IG1pc3NpbmcsIGludCBkZWZjb3VudCwKK21pc3NpbmdfYXJndW1lbnRzKFB5Q29kZU9iamVjdCAqY28sIFB5X3NzaXplX3QgbWlzc2luZywgUHlfc3NpemVfdCBkZWZjb3VudCwKICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqZmFzdGxvY2FscykKIHsKLSAgICBpbnQgaSwgaiA9IDA7Ci0gICAgaW50IHN0YXJ0LCBlbmQ7Ci0gICAgaW50IHBvc2l0aW9uYWwgPSBkZWZjb3VudCAhPSAtMTsKKyAgICBQeV9zc2l6ZV90IGksIGogPSAwOworICAgIFB5X3NzaXplX3Qgc3RhcnQsIGVuZDsKKyAgICBpbnQgcG9zaXRpb25hbCA9IChkZWZjb3VudCAhPSAtMSk7CiAgICAgY29uc3QgY2hhciAqa2luZCA9IHBvc2l0aW9uYWwgPyAicG9zaXRpb25hbCIgOiAia2V5d29yZC1vbmx5IjsKICAgICBQeU9iamVjdCAqbWlzc2luZ19uYW1lczsKIApAQCAtMzczNSwzMyArMzg5MSwzOSBAQAogfQogCiBzdGF0aWMgdm9pZAotdG9vX21hbnlfcG9zaXRpb25hbChQeUNvZGVPYmplY3QgKmNvLCBpbnQgZ2l2ZW4sIGludCBkZWZjb3VudCwgUHlPYmplY3QgKipmYXN0bG9jYWxzKQordG9vX21hbnlfcG9zaXRpb25hbChQeUNvZGVPYmplY3QgKmNvLCBQeV9zc2l6ZV90IGdpdmVuLCBQeV9zc2l6ZV90IGRlZmNvdW50LAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMpCiB7CiAgICAgaW50IHBsdXJhbDsKLSAgICBpbnQga3dvbmx5X2dpdmVuID0gMDsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IGt3b25seV9naXZlbiA9IDA7CisgICAgUHlfc3NpemVfdCBpOwogICAgIFB5T2JqZWN0ICpzaWcsICprd29ubHlfc2lnOworICAgIFB5X3NzaXplX3QgY29fYXJnY291bnQgPSBjby0+Y29fYXJnY291bnQ7CiAKICAgICBhc3NlcnQoKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpID09IDApOwogICAgIC8qIENvdW50IG1pc3Npbmcga2V5d29yZC1vbmx5IGFyZ3MuICovCi0gICAgZm9yIChpID0gY28tPmNvX2FyZ2NvdW50OyBpIDwgY28tPmNvX2FyZ2NvdW50ICsgY28tPmNvX2t3b25seWFyZ2NvdW50OyBpKyspCi0gICAgICAgIGlmIChHRVRMT0NBTChpKSAhPSBOVUxMKQorICAgIGZvciAoaSA9IGNvX2FyZ2NvdW50OyBpIDwgY29fYXJnY291bnQgKyBjby0+Y29fa3dvbmx5YXJnY291bnQ7IGkrKykgeworICAgICAgICBpZiAoR0VUTE9DQUwoaSkgIT0gTlVMTCkgewogICAgICAgICAgICAga3dvbmx5X2dpdmVuKys7CisgICAgICAgIH0KKyAgICB9CiAgICAgaWYgKGRlZmNvdW50KSB7Ci0gICAgICAgIGludCBhdGxlYXN0ID0gY28tPmNvX2FyZ2NvdW50IC0gZGVmY291bnQ7CisgICAgICAgIFB5X3NzaXplX3QgYXRsZWFzdCA9IGNvX2FyZ2NvdW50IC0gZGVmY291bnQ7CiAgICAgICAgIHBsdXJhbCA9IDE7Ci0gICAgICAgIHNpZyA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCJmcm9tICVkIHRvICVkIiwgYXRsZWFzdCwgY28tPmNvX2FyZ2NvdW50KTsKKyAgICAgICAgc2lnID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoImZyb20gJXpkIHRvICV6ZCIsIGF0bGVhc3QsIGNvX2FyZ2NvdW50KTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIHBsdXJhbCA9IGNvLT5jb19hcmdjb3VudCAhPSAxOwotICAgICAgICBzaWcgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJWQiLCBjby0+Y29fYXJnY291bnQpOworICAgICAgICBwbHVyYWwgPSAoY29fYXJnY291bnQgIT0gMSk7CisgICAgICAgIHNpZyA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCIlemQiLCBjb19hcmdjb3VudCk7CiAgICAgfQogICAgIGlmIChzaWcgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwogICAgIGlmIChrd29ubHlfZ2l2ZW4pIHsKLSAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0ID0gIiBwb3NpdGlvbmFsIGFyZ3VtZW50JXMgKGFuZCAlZCBrZXl3b3JkLW9ubHkgYXJndW1lbnQlcykiOwotICAgICAgICBrd29ubHlfc2lnID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoZm9ybWF0LCBnaXZlbiAhPSAxID8gInMiIDogIiIsIGt3b25seV9naXZlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd29ubHlfZ2l2ZW4gIT0gMSA/ICJzIiA6ICIiKTsKKyAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0ID0gIiBwb3NpdGlvbmFsIGFyZ3VtZW50JXMgKGFuZCAlemQga2V5d29yZC1vbmx5IGFyZ3VtZW50JXMpIjsKKyAgICAgICAga3dvbmx5X3NpZyA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuICE9IDEgPyAicyIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3b25seV9naXZlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3b25seV9naXZlbiAhPSAxID8gInMiIDogIiIpOwogICAgICAgICBpZiAoa3dvbmx5X3NpZyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoc2lnKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTM3NzMsNyArMzkzNSw3IEBACiAgICAgICAgIGFzc2VydChrd29ubHlfc2lnICE9IE5VTEwpOwogICAgIH0KICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAiJVUoKSB0YWtlcyAlVSBwb3NpdGlvbmFsIGFyZ3VtZW50JXMgYnV0ICVkJVUgJXMgZ2l2ZW4iLAorICAgICAgICAgICAgICAgICAiJVUoKSB0YWtlcyAlVSBwb3NpdGlvbmFsIGFyZ3VtZW50JXMgYnV0ICV6ZCVVICVzIGdpdmVuIiwKICAgICAgICAgICAgICAgICAgY28tPmNvX25hbWUsCiAgICAgICAgICAgICAgICAgIHNpZywKICAgICAgICAgICAgICAgICAgcGx1cmFsID8gInMiIDogIiIsCkBAIC0zNzkwLDIwICszOTUyLDI1IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfUHlFdmFsX0V2YWxDb2RlV2l0aE5hbWUoUHlPYmplY3QgKl9jbywgUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMsCi0gICAgICAgICAgIFB5T2JqZWN0ICoqYXJncywgaW50IGFyZ2NvdW50LCBQeU9iamVjdCAqKmt3cywgaW50IGt3Y291bnQsCi0gICAgICAgICAgIFB5T2JqZWN0ICoqZGVmcywgaW50IGRlZmNvdW50LCBQeU9iamVjdCAqa3dkZWZzLCBQeU9iamVjdCAqY2xvc3VyZSwKKyAgICAgICAgICAgUHlPYmplY3QgKiphcmdzLCBQeV9zc2l6ZV90IGFyZ2NvdW50LAorICAgICAgICAgICBQeU9iamVjdCAqKmt3cywgUHlfc3NpemVfdCBrd2NvdW50LAorICAgICAgICAgICBQeU9iamVjdCAqa3duYW1lcywgUHlPYmplY3QgKiprd3N0YWNrLAorICAgICAgICAgICBQeU9iamVjdCAqKmRlZnMsIFB5X3NzaXplX3QgZGVmY291bnQsCisgICAgICAgICAgIFB5T2JqZWN0ICprd2RlZnMsIFB5T2JqZWN0ICpjbG9zdXJlLAogICAgICAgICAgICBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnF1YWxuYW1lKQogewogICAgIFB5Q29kZU9iamVjdCogY28gPSAoUHlDb2RlT2JqZWN0KilfY287CiAgICAgUHlGcmFtZU9iamVjdCAqZjsKICAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKICAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqZnJlZXZhcnM7Ci0gICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CiAgICAgUHlPYmplY3QgKngsICp1OwotICAgIGludCB0b3RhbF9hcmdzID0gY28tPmNvX2FyZ2NvdW50ICsgY28tPmNvX2t3b25seWFyZ2NvdW50OwotICAgIGludCBpOwotICAgIGludCBuID0gYXJnY291bnQ7Ci0gICAgUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7CisgICAgY29uc3QgUHlfc3NpemVfdCB0b3RhbF9hcmdzID0gY28tPmNvX2FyZ2NvdW50ICsgY28tPmNvX2t3b25seWFyZ2NvdW50OworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqa3dkaWN0OworICAgIFB5X3NzaXplX3Qga3djb3VudDIgPSBrd25hbWVzID09IE5VTEwgPyAwIDogUHlUdXBsZV9HRVRfU0laRShrd25hbWVzKTsKKworICAgIGFzc2VydCgoa3djb3VudCA9PSAwKSB8fCAoa3dzICE9IE5VTEwpKTsKIAogICAgIGlmIChnbG9iYWxzID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLApAQCAtMzgxMSwzNiArMzk3OCw1MCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICAvKiBDcmVhdGUgdGhlIGZyYW1lICovCisgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKICAgICBhc3NlcnQodHN0YXRlICE9IE5VTEwpOwotICAgIGFzc2VydChnbG9iYWxzICE9IE5VTEwpOwogICAgIGYgPSBQeUZyYW1lX05ldyh0c3RhdGUsIGNvLCBnbG9iYWxzLCBsb2NhbHMpOwotICAgIGlmIChmID09IE5VTEwpCisgICAgaWYgKGYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKLQorICAgIH0KICAgICBmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwogICAgIGZyZWV2YXJzID0gZi0+Zl9sb2NhbHNwbHVzICsgY28tPmNvX25sb2NhbHM7CiAKLSAgICAvKiBQYXJzZSBhcmd1bWVudHMuICovCisgICAgLyogQ3JlYXRlIGEgZGljdGlvbmFyeSBmb3Iga2V5d29yZCBwYXJhbWV0ZXJzICgqKmt3YWdzKSAqLwogICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJLRVlXT1JEUykgewogICAgICAgICBrd2RpY3QgPSBQeURpY3RfTmV3KCk7CiAgICAgICAgIGlmIChrd2RpY3QgPT0gTlVMTCkKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgaSA9IHRvdGFsX2FyZ3M7Ci0gICAgICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKQorICAgICAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykgewogICAgICAgICAgICAgaSsrOworICAgICAgICB9CiAgICAgICAgIFNFVExPQ0FMKGksIGt3ZGljdCk7CiAgICAgfQotICAgIGlmIChhcmdjb3VudCA+IGNvLT5jb19hcmdjb3VudCkKKyAgICBlbHNlIHsKKyAgICAgICAga3dkaWN0ID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBDb3B5IHBvc2l0aW9uYWwgYXJndW1lbnRzIGludG8gbG9jYWwgdmFyaWFibGVzICovCisgICAgaWYgKGFyZ2NvdW50ID4gY28tPmNvX2FyZ2NvdW50KSB7CiAgICAgICAgIG4gPSBjby0+Y29fYXJnY291bnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuID0gYXJnY291bnQ7CisgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgeCA9IGFyZ3NbaV07CiAgICAgICAgIFB5X0lOQ1JFRih4KTsKICAgICAgICAgU0VUTE9DQUwoaSwgeCk7CiAgICAgfQorCisgICAgLyogUGFjayBvdGhlciBwb3NpdGlvbmFsIGFyZ3VtZW50cyBpbnRvIHRoZSAqYXJncyBhcmd1bWVudCAqLwogICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKSB7CiAgICAgICAgIHUgPSBQeVR1cGxlX05ldyhhcmdjb3VudCAtIG4pOwotICAgICAgICBpZiAodSA9PSBOVUxMKQorICAgICAgICBpZiAodSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KICAgICAgICAgU0VUTE9DQUwodG90YWxfYXJncywgdSk7CiAgICAgICAgIGZvciAoaSA9IG47IGkgPCBhcmdjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICB4ID0gYXJnc1tpXTsKQEAgLTM4NDgsMTAgKzQwMjksNzEgQEAKICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odSwgaS1uLCB4KTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qIEhhbmRsZSBrZXl3b3JkIGFyZ3VtZW50cyBwYXNzZWQgYXMgYW4gYXJyYXkgb2YgKGtleSwgdmFsdWUpIHBhaXJzICovCiAgICAgZm9yIChpID0gMDsgaSA8IGt3Y291bnQ7IGkrKykgewogICAgICAgICBQeU9iamVjdCAqKmNvX3Zhcm5hbWVzOwogICAgICAgICBQeU9iamVjdCAqa2V5d29yZCA9IGt3c1syKmldOwogICAgICAgICBQeU9iamVjdCAqdmFsdWUgPSBrd3NbMippICsgMV07CisgICAgICAgIFB5X3NzaXplX3QgajsKKworICAgICAgICBpZiAoa2V5d29yZCA9PSBOVUxMIHx8ICFQeVVuaWNvZGVfQ2hlY2soa2V5d29yZCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVVKCkga2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjby0+Y29fbmFtZSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICAvKiBTcGVlZCBoYWNrOiBkbyByYXcgcG9pbnRlciBjb21wYXJlcy4gQXMgbmFtZXMgYXJlCisgICAgICAgICAgIG5vcm1hbGx5IGludGVybmVkIHRoaXMgc2hvdWxkIGFsbW9zdCBhbHdheXMgaGl0LiAqLworICAgICAgICBjb192YXJuYW1lcyA9ICgoUHlUdXBsZU9iamVjdCAqKShjby0+Y29fdmFybmFtZXMpKS0+b2JfaXRlbTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHRvdGFsX2FyZ3M7IGorKykgeworICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBjb192YXJuYW1lc1tqXTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IGtleXdvcmQpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGt3X2ZvdW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogU2xvdyBmYWxsYmFjaywganVzdCBpbiBjYXNlICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB0b3RhbF9hcmdzOyBqKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gY29fdmFybmFtZXNbal07CisgICAgICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKCBrZXl3b3JkLCBuYW1lLCBQeV9FUSk7CisgICAgICAgICAgICBpZiAoY21wID4gMCkgeworICAgICAgICAgICAgICAgIGdvdG8ga3dfZm91bmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjbXAgPCAwKSB7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGogPj0gdG90YWxfYXJncyAmJiBrd2RpY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJVUoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICclUyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvLT5jb19uYW1lLCBrZXl3b3JkKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShrd2RpY3QsIGtleXdvcmQsIHZhbHVlKSA9PSAtMSkgeworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBrd19mb3VuZDoKKyAgICAgICAgaWYgKEdFVExPQ0FMKGopICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVVKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3IgYXJndW1lbnQgJyVTJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY28tPmNvX25hbWUsIGtleXdvcmQpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIFNFVExPQ0FMKGosIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUga2V5d29yZCBhcmd1bWVudHMgcGFzc2VkIGFzIGtleXMgdHVwbGUgKyB2YWx1ZXMgYXJyYXkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwga3djb3VudDI7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqKmNvX3Zhcm5hbWVzOworICAgICAgICBQeU9iamVjdCAqa2V5d29yZCA9IFB5VHVwbGVfR0VUX0lURU0oa3duYW1lcywgaSk7CisgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IGt3c3RhY2tbaV07CiAgICAgICAgIGludCBqOwogICAgICAgICBpZiAoa2V5d29yZCA9PSBOVUxMIHx8ICFQeVVuaWNvZGVfQ2hlY2soa2V5d29yZCkpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCkBAIC0zODY1LDcgKzQxMDcsNyBAQAogICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG90YWxfYXJnczsgaisrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqbm0gPSBjb192YXJuYW1lc1tqXTsKICAgICAgICAgICAgIGlmIChubSA9PSBrZXl3b3JkKQotICAgICAgICAgICAgICAgIGdvdG8ga3dfZm91bmQ7CisgICAgICAgICAgICAgICAgZ290byBrd19mb3VuZDI7CiAgICAgICAgIH0KICAgICAgICAgLyogU2xvdyBmYWxsYmFjaywganVzdCBpbiBjYXNlICovCiAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0b3RhbF9hcmdzOyBqKyspIHsKQEAgLTM4NzMsNyArNDExNSw3IEBACiAgICAgICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKAogICAgICAgICAgICAgICAgIGtleXdvcmQsIG5tLCBQeV9FUSk7CiAgICAgICAgICAgICBpZiAoY21wID4gMCkKLSAgICAgICAgICAgICAgICBnb3RvIGt3X2ZvdW5kOworICAgICAgICAgICAgICAgIGdvdG8ga3dfZm91bmQyOwogICAgICAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KQEAgLTM4ODksNyArNDEzMSw3IEBACiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KICAgICAgICAgY29udGludWU7Ci0gICAgICBrd19mb3VuZDoKKyAgICAgIGt3X2ZvdW5kMjoKICAgICAgICAgaWYgKEdFVExPQ0FMKGopICE9IE5VTEwpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiVVKCkgZ290IG11bHRpcGxlICIKQEAgLTM5MDEsMTYgKzQxNDMsMjIgQEAKICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKICAgICAgICAgU0VUTE9DQUwoaiwgdmFsdWUpOwogICAgIH0KKworICAgIC8qIENoZWNrIHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgKi8KICAgICBpZiAoYXJnY291bnQgPiBjby0+Y29fYXJnY291bnQgJiYgIShjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKSkgewogICAgICAgICB0b29fbWFueV9wb3NpdGlvbmFsKGNvLCBhcmdjb3VudCwgZGVmY291bnQsIGZhc3Rsb2NhbHMpOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQorCisgICAgLyogQWRkIG1pc3NpbmcgcG9zaXRpb25hbCBhcmd1bWVudHMgKGNvcHkgZGVmYXVsdCB2YWx1ZXMgZnJvbSBkZWZzKSAqLwogICAgIGlmIChhcmdjb3VudCA8IGNvLT5jb19hcmdjb3VudCkgewotICAgICAgICBpbnQgbSA9IGNvLT5jb19hcmdjb3VudCAtIGRlZmNvdW50OwotICAgICAgICBpbnQgbWlzc2luZyA9IDA7Ci0gICAgICAgIGZvciAoaSA9IGFyZ2NvdW50OyBpIDwgbTsgaSsrKQotICAgICAgICAgICAgaWYgKEdFVExPQ0FMKGkpID09IE5VTEwpCisgICAgICAgIFB5X3NzaXplX3QgbSA9IGNvLT5jb19hcmdjb3VudCAtIGRlZmNvdW50OworICAgICAgICBQeV9zc2l6ZV90IG1pc3NpbmcgPSAwOworICAgICAgICBmb3IgKGkgPSBhcmdjb3VudDsgaSA8IG07IGkrKykgeworICAgICAgICAgICAgaWYgKEdFVExPQ0FMKGkpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtaXNzaW5nKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaWYgKG1pc3NpbmcpIHsKICAgICAgICAgICAgIG1pc3NpbmdfYXJndW1lbnRzKGNvLCBtaXNzaW5nLCBkZWZjb3VudCwgZmFzdGxvY2Fscyk7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CkBAIC0zOTI3LDggKzQxNzUsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKworICAgIC8qIEFkZCBtaXNzaW5nIGtleXdvcmQgYXJndW1lbnRzIChjb3B5IGRlZmF1bHQgdmFsdWVzIGZyb20ga3dkZWZzKSAqLwogICAgIGlmIChjby0+Y29fa3dvbmx5YXJnY291bnQgPiAwKSB7Ci0gICAgICAgIGludCBtaXNzaW5nID0gMDsKKyAgICAgICAgUHlfc3NpemVfdCBtaXNzaW5nID0gMDsKICAgICAgICAgZm9yIChpID0gY28tPmNvX2FyZ2NvdW50OyBpIDwgdG90YWxfYXJnczsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZTsKICAgICAgICAgICAgIGlmIChHRVRMT0NBTChpKSAhPSBOVUxMKQpAQCAtMzk2OSwxMyArNDIxOSwxNiBAQAogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICBTRVRMT0NBTChjby0+Y29fbmxvY2FscyArIGksIGMpOwogICAgIH0KKworICAgIC8qIENvcHkgY2xvc3VyZSB2YXJpYWJsZXMgdG8gZnJlZSB2YXJpYWJsZXMgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOyArK2kpIHsKICAgICAgICAgUHlPYmplY3QgKm8gPSBQeVR1cGxlX0dFVF9JVEVNKGNsb3N1cmUsIGkpOwogICAgICAgICBQeV9JTkNSRUYobyk7CiAgICAgICAgIGZyZWV2YXJzW1B5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSArIGldID0gbzsKICAgICB9CiAKLSAgICBpZiAoY28tPmNvX2ZsYWdzICYgKENPX0dFTkVSQVRPUiB8IENPX0NPUk9VVElORSkpIHsKKyAgICAvKiBIYW5kbGUgZ2VuZXJhdG9yL2Nvcm91dGluZS9hc3luY2hyb25vdXMgZ2VuZXJhdG9yICovCisgICAgaWYgKGNvLT5jb19mbGFncyAmIChDT19HRU5FUkFUT1IgfCBDT19DT1JPVVRJTkUgfCBDT19BU1lOQ19HRU5FUkFUT1IpKSB7CiAgICAgICAgIFB5T2JqZWN0ICpnZW47CiAgICAgICAgIFB5T2JqZWN0ICpjb3JvX3dyYXBwZXIgPSB0c3RhdGUtPmNvcm91dGluZV93cmFwcGVyOwogICAgICAgICBpbnQgaXNfY29ybyA9IGNvLT5jb19mbGFncyAmIENPX0NPUk9VVElORTsKQEAgLTQwMDAsNiArNDI1Myw4IEBACiAgICAgICAgICAqIGFuZCByZXR1cm4gdGhhdCBhcyB0aGUgdmFsdWUuICovCiAgICAgICAgIGlmIChpc19jb3JvKSB7CiAgICAgICAgICAgICBnZW4gPSBQeUNvcm9fTmV3KGYsIG5hbWUsIHF1YWxuYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmIChjby0+Y29fZmxhZ3MgJiBDT19BU1lOQ19HRU5FUkFUT1IpIHsKKyAgICAgICAgICAgIGdlbiA9IFB5QXN5bmNHZW5fTmV3KGYsIG5hbWUsIHF1YWxuYW1lKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGdlbiA9IFB5R2VuX05ld1dpdGhRdWFsTmFtZShmLCBuYW1lLCBxdWFsbmFtZSk7CiAgICAgICAgIH0KQEAgLTQwMzksOCArNDI5NCwxMSBAQAogICAgICAgICAgICBQeU9iamVjdCAqKmRlZnMsIGludCBkZWZjb3VudCwgUHlPYmplY3QgKmt3ZGVmcywgUHlPYmplY3QgKmNsb3N1cmUpCiB7CiAgICAgcmV0dXJuIF9QeUV2YWxfRXZhbENvZGVXaXRoTmFtZShfY28sIGdsb2JhbHMsIGxvY2FscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsIGFyZ2NvdW50LCBrd3MsIGt3Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZzLCBkZWZjb3VudCwga3dkZWZzLCBjbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywgYXJnY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd3MsIGt3Y291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmcywgZGVmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2RlZnMsIGNsb3N1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKIH0KIApAQCAtNDI5OSw3ICs0NTU3LDcgQEAKIAogI2lmZGVmIExMVFJBQ0UKIHN0YXRpYyBpbnQKLXBydHJhY2UoUHlPYmplY3QgKnYsIGNoYXIgKnN0cikKK3BydHJhY2UoUHlPYmplY3QgKnYsIGNvbnN0IGNoYXIgKnN0cikKIHsKICAgICBwcmludGYoIiVzICIsIHN0cik7CiAgICAgaWYgKFB5T2JqZWN0X1ByaW50KHYsIHN0ZG91dCwgMCkgIT0gMCkKQEAgLTQ0NzYsNiArNDczNCwzOCBAQAogICAgIHJldHVybiB0c3RhdGUtPmNvcm91dGluZV93cmFwcGVyOwogfQogCit2b2lkCitfUHlFdmFsX1NldEFzeW5jR2VuRmlyc3RpdGVyKFB5T2JqZWN0ICpmaXJzdGl0ZXIpCit7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKworICAgIFB5X1hJTkNSRUYoZmlyc3RpdGVyKTsKKyAgICBQeV9YU0VUUkVGKHRzdGF0ZS0+YXN5bmNfZ2VuX2ZpcnN0aXRlciwgZmlyc3RpdGVyKTsKK30KKworUHlPYmplY3QgKgorX1B5RXZhbF9HZXRBc3luY0dlbkZpcnN0aXRlcih2b2lkKQoreworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgcmV0dXJuIHRzdGF0ZS0+YXN5bmNfZ2VuX2ZpcnN0aXRlcjsKK30KKwordm9pZAorX1B5RXZhbF9TZXRBc3luY0dlbkZpbmFsaXplcihQeU9iamVjdCAqZmluYWxpemVyKQoreworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisKKyAgICBQeV9YSU5DUkVGKGZpbmFsaXplcik7CisgICAgUHlfWFNFVFJFRih0c3RhdGUtPmFzeW5jX2dlbl9maW5hbGl6ZXIsIGZpbmFsaXplcik7Cit9CisKK1B5T2JqZWN0ICoKK19QeUV2YWxfR2V0QXN5bmNHZW5GaW5hbGl6ZXIodm9pZCkKK3sKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIHJldHVybiB0c3RhdGUtPmFzeW5jX2dlbl9maW5hbGl6ZXI7Cit9CisKIFB5T2JqZWN0ICoKIFB5RXZhbF9HZXRCdWlsdGlucyh2b2lkKQogewpAQCAtNDU0OCwxMCArNDgzOCw4IEBACiAgICBUaGUgYXJnIG11c3QgYmUgYSB0dXBsZSBvciBOVUxMLiAgVGhlIGt3IG11c3QgYmUgYSBkaWN0IG9yIE5VTEwuICovCiAKIFB5T2JqZWN0ICoKLVB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCitQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLQogI2lmZGVmIFB5X0RFQlVHCiAgICAgLyogUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoKSBtdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhbiBleGNlcHRpb24KICAgICAgICBzZXQuIEl0IHJhaXNlcyBhIG5ldyBleGNlcHRpb24gaWYgcGFyYW1ldGVycyBhcmUgaW52YWxpZCBvciBpZgpAQCAtNDU1OSwzMCArNDg0NywyMyBAQAogICAgIGFzc2VydCghUHlFcnJfT2NjdXJyZWQoKSk7CiAjZW5kaWYKIAotICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICBhcmcgPSBQeVR1cGxlX05ldygwKTsKLSAgICAgICAgaWYgKGFyZyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gX1B5T2JqZWN0X0Zhc3RDYWxsRGljdChmdW5jLCBOVUxMLCAwLCBrd2FyZ3MpOwogICAgIH0KLSAgICBlbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmcpKSB7CisKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBsaXN0IG11c3QgYmUgYSB0dXBsZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZWxzZQotICAgICAgICBQeV9JTkNSRUYoYXJnKTsKIAotICAgIGlmIChrdyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa3cpKSB7CisgICAgaWYgKGt3YXJncyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa3dhcmdzKSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImtleXdvcmQgbGlzdCBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOwotICAgICAgICBQeV9ERUNSRUYoYXJnKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmcsIGt3KTsKLSAgICBQeV9ERUNSRUYoYXJnKTsKLQotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywga3dhcmdzKTsKIH0KIAogY29uc3QgY2hhciAqCkBAIC00NjEyLDE2ICs0ODkzLDE2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1lcnJfYXJncyhQeU9iamVjdCAqZnVuYywgaW50IGZsYWdzLCBpbnQgbmFyZ3MpCitlcnJfYXJncyhQeU9iamVjdCAqZnVuYywgaW50IGZsYWdzLCBQeV9zc2l6ZV90IG5hcmdzKQogewogICAgIGlmIChmbGFncyAmIE1FVEhfTk9BUkdTKQogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcygpIHRha2VzIG5vIGFyZ3VtZW50cyAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBubyBhcmd1bWVudHMgKCV6ZCBnaXZlbikiLAogICAgICAgICAgICAgICAgICAgICAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWZ1bmMpLT5tX21sLT5tbF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgbmFyZ3MpOwogICAgIGVsc2UKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAoJXpkIGdpdmVuKSIsCiAgICAgICAgICAgICAgICAgICAgICAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopZnVuYyktPm1fbWwtPm1sX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICBuYXJncyk7CiB9CkBAIC00NjU4LDM2ICs0OTM5LDM1IEBACiAgICAgfQogCiBzdGF0aWMgUHlPYmplY3QgKgotY2FsbF9mdW5jdGlvbihQeU9iamVjdCAqKipwcF9zdGFjaywgaW50IG9wYXJnCitjYWxsX2Z1bmN0aW9uKFB5T2JqZWN0ICoqKnBwX3N0YWNrLCBQeV9zc2l6ZV90IG9wYXJnLCBQeU9iamVjdCAqa3duYW1lcwogI2lmZGVmIFdJVEhfVFNDCiAgICAgICAgICAgICAgICAgLCB1aW50NjQqIHBpbnRyMCwgdWludDY0KiBwaW50cjEKICNlbmRpZgogICAgICAgICAgICAgICAgICkKIHsKLSAgICBpbnQgbmEgPSBvcGFyZyAmIDB4ZmY7Ci0gICAgaW50IG5rID0gKG9wYXJnPj44KSAmIDB4ZmY7Ci0gICAgaW50IG4gPSBuYSArIDIgKiBuazsKLSAgICBQeU9iamVjdCAqKnBmdW5jID0gKCpwcF9zdGFjaykgLSBuIC0gMTsKKyAgICBQeU9iamVjdCAqKnBmdW5jID0gKCpwcF9zdGFjaykgLSBvcGFyZyAtIDE7CiAgICAgUHlPYmplY3QgKmZ1bmMgPSAqcGZ1bmM7CiAgICAgUHlPYmplY3QgKngsICp3OworICAgIFB5X3NzaXplX3Qgbmt3YXJncyA9IChrd25hbWVzID09IE5VTEwpID8gMCA6IFB5VHVwbGVfR0VUX1NJWkUoa3duYW1lcyk7CisgICAgUHlfc3NpemVfdCBuYXJncyA9IG9wYXJnIC0gbmt3YXJnczsKIAogICAgIC8qIEFsd2F5cyBkaXNwYXRjaCBQeUNGdW5jdGlvbiBmaXJzdCwgYmVjYXVzZSB0aGVzZSBhcmUKICAgICAgICBwcmVzdW1lZCB0byBiZSB0aGUgbW9zdCBmcmVxdWVudCBjYWxsYWJsZSBvYmplY3QuCiAgICAgKi8KLSAgICBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykgJiYgbmsgPT0gMCkgeworICAgIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkgewogICAgICAgICBpbnQgZmxhZ3MgPSBQeUNGdW5jdGlvbl9HRVRfRkxBR1MoZnVuYyk7CiAgICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CiAKICAgICAgICAgUENBTEwoUENBTExfQ0ZVTkNUSU9OKTsKLSAgICAgICAgaWYgKGZsYWdzICYgKE1FVEhfTk9BUkdTIHwgTUVUSF9PKSkgeworICAgICAgICBpZiAoa3duYW1lcyA9PSBOVUxMICYmIGZsYWdzICYgKE1FVEhfTk9BUkdTIHwgTUVUSF9PKSkgewogICAgICAgICAgICAgUHlDRnVuY3Rpb24gbWV0aCA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihmdW5jKTsKICAgICAgICAgICAgIFB5T2JqZWN0ICpzZWxmID0gUHlDRnVuY3Rpb25fR0VUX1NFTEYoZnVuYyk7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBNRVRIX05PQVJHUyAmJiBuYSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNRVRIX05PQVJHUyAmJiBuYXJncyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQ19UUkFDRSh4LCAoKm1ldGgpKHNlbGYsTlVMTCkpOwogCiAgICAgICAgICAgICAgICAgeCA9IF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KGZ1bmMsIHgsIE5VTEwpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBNRVRIX08gJiYgbmEgPT0gMSkgeworICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBNRVRIX08gJiYgbmFyZ3MgPT0gMSkgewogICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmcgPSBFWFRfUE9QKCpwcF9zdGFjayk7CiAgICAgICAgICAgICAgICAgQ19UUkFDRSh4LCAoKm1ldGgpKHNlbGYsYXJnKSk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CkBAIC00Njk1LDQ5ICs0OTc1LDY4IEBACiAgICAgICAgICAgICAgICAgeCA9IF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KGZ1bmMsIHgsIE5VTEwpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyX2FyZ3MoZnVuYywgZmxhZ3MsIG5hKTsKKyAgICAgICAgICAgICAgICBlcnJfYXJncyhmdW5jLCBmbGFncywgbmFyZ3MpOwogICAgICAgICAgICAgICAgIHggPSBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgUHlPYmplY3QgKmNhbGxhcmdzOwotICAgICAgICAgICAgY2FsbGFyZ3MgPSBsb2FkX2FyZ3MocHBfc3RhY2ssIG5hKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpjYWxsYXJncywgKmt3ZGljdCA9IE5VTEw7CisgICAgICAgICAgICBpZiAoa3duYW1lcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAga3dkaWN0ID0gY3JlYXRlX2tleXdvcmRfYXJncyhrd25hbWVzLCBwcF9zdGFjaywgZnVuYyk7CisgICAgICAgICAgICAgICAgaWYgKGt3ZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBnb3RvIGNmdW5jZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FsbGFyZ3MgPSBsb2FkX2FyZ3MocHBfc3RhY2ssIG5hcmdzKTsKICAgICAgICAgICAgIGlmIChjYWxsYXJncyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoKnBpbnRyMCk7Ci0gICAgICAgICAgICAgICAgQ19UUkFDRSh4LCBQeUNGdW5jdGlvbl9DYWxsKGZ1bmMsY2FsbGFyZ3MsTlVMTCkpOworICAgICAgICAgICAgICAgIENfVFJBQ0UoeCwgUHlDRnVuY3Rpb25fQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KSk7CiAgICAgICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoKnBpbnRyMSk7Ci0gICAgICAgICAgICAgICAgUHlfWERFQ1JFRihjYWxsYXJncyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHggPSBOVUxMOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRihrd2RpY3QpOwogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykgJiYgUHlNZXRob2RfR0VUX1NFTEYoZnVuYykgIT0gTlVMTCkgewotICAgICAgICAgICAgLyogb3B0aW1pemUgYWNjZXNzIHRvIGJvdW5kIG1ldGhvZHMgKi8KLSAgICAgICAgICAgIFB5T2JqZWN0ICpzZWxmID0gUHlNZXRob2RfR0VUX1NFTEYoZnVuYyk7Ci0gICAgICAgICAgICBQQ0FMTChQQ0FMTF9NRVRIT0QpOwotICAgICAgICAgICAgUENBTEwoUENBTExfQk9VTkRfTUVUSE9EKTsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgICAgIGZ1bmMgPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oZnVuYyk7Ci0gICAgICAgICAgICBQeV9JTkNSRUYoZnVuYyk7Ci0gICAgICAgICAgICBQeV9TRVRSRUYoKnBmdW5jLCBzZWxmKTsKLSAgICAgICAgICAgIG5hKys7Ci0gICAgICAgICAgICBuKys7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOwotICAgICAgICBSRUFEX1RJTUVTVEFNUCgqcGludHIwKTsKLSAgICAgICAgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCi0gICAgICAgICAgICB4ID0gZmFzdF9mdW5jdGlvbihmdW5jLCBwcF9zdGFjaywgbiwgbmEsIG5rKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgeCA9IGRvX2NhbGwoZnVuYywgcHBfc3RhY2ssIG5hLCBuayk7Ci0gICAgICAgIFJFQURfVElNRVNUQU1QKCpwaW50cjEpOwotICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICBQeV9zc2l6ZV90IG5rd2FyZ3MgPSAoa3duYW1lcyA9PSBOVUxMKSA/IDAgOiBQeVR1cGxlX0dFVF9TSVpFKGt3bmFtZXMpOworICAgICAgUHlPYmplY3QgKipzdGFjazsKIAotICAgICAgICBhc3NlcnQoKHggIT0gTlVMTCkgXiAoUHlFcnJfT2NjdXJyZWQoKSAhPSBOVUxMKSk7CisgICAgICBpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykgJiYgUHlNZXRob2RfR0VUX1NFTEYoZnVuYykgIT0gTlVMTCkgeworICAgICAgICAgIC8qIG9wdGltaXplIGFjY2VzcyB0byBib3VuZCBtZXRob2RzICovCisgICAgICAgICAgUHlPYmplY3QgKnNlbGYgPSBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKTsKKyAgICAgICAgICBQQ0FMTChQQ0FMTF9NRVRIT0QpOworICAgICAgICAgIFBDQUxMKFBDQUxMX0JPVU5EX01FVEhPRCk7CisgICAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICAgIGZ1bmMgPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oZnVuYyk7CisgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgICAgICAgIFB5X1NFVFJFRigqcGZ1bmMsIHNlbGYpOworICAgICAgICAgIG5hcmdzKys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgICB9CisKKyAgICAgIHN0YWNrID0gKCpwcF9zdGFjaykgLSBuYXJncyAtIG5rd2FyZ3M7CisKKyAgICAgIFJFQURfVElNRVNUQU1QKCpwaW50cjApOworICAgICAgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpIHsKKyAgICAgICAgICB4ID0gZmFzdF9mdW5jdGlvbihmdW5jLCBzdGFjaywgbmFyZ3MsIGt3bmFtZXMpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICAgeCA9IF9QeU9iamVjdF9GYXN0Q2FsbEtleXdvcmRzKGZ1bmMsIHN0YWNrLCBuYXJncywga3duYW1lcyk7CisgICAgICB9CisgICAgICBSRUFEX1RJTUVTVEFNUCgqcGludHIxKTsKKworICAgICAgUHlfREVDUkVGKGZ1bmMpOwogICAgIH0KIAorY2Z1bmNlcnJvcjoKKyAgICBhc3NlcnQoKHggIT0gTlVMTCkgXiAoUHlFcnJfT2NjdXJyZWQoKSAhPSBOVUxMKSk7CisKICAgICAvKiBDbGVhciB0aGUgc3RhY2sgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIEFsc28gcmVtb3ZlcwogICAgICAgIHRoZSBhcmd1bWVudHMgaW4gY2FzZSB0aGV5IHdlcmVuJ3QgY29uc3VtZWQgYWxyZWFkeQogICAgICAgIChmYXN0X2Z1bmN0aW9uKCkgYW5kIGVycl9hcmdzKCkgbGVhdmUgdGhlbSBvbiB0aGUgc3RhY2spLgpAQCAtNDc0OCw3ICs1MDQ3LDYgQEAKICAgICAgICAgUENBTEwoUENBTExfUE9QKTsKICAgICB9CiAKLSAgICBhc3NlcnQoKHggIT0gTlVMTCkgXiAoUHlFcnJfT2NjdXJyZWQoKSAhPSBOVUxMKSk7CiAgICAgcmV0dXJuIHg7CiB9CiAKQEAgLTQ3NjEsODEgKzUwNTksMjAxIEBACiAgICBkb25lIGJlZm9yZSBldmFsdWF0aW5nIHRoZSBmcmFtZS4KICovCiAKK3N0YXRpYyBQeU9iamVjdCoKK19QeUZ1bmN0aW9uX0Zhc3RDYWxsKFB5Q29kZU9iamVjdCAqY28sIFB5T2JqZWN0ICoqYXJncywgUHlfc3NpemVfdCBuYXJncywKKyAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpnbG9iYWxzKQoreworICAgIFB5RnJhbWVPYmplY3QgKmY7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHM7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBQQ0FMTChQQ0FMTF9GQVNURVJfRlVOQ1RJT04pOworICAgIGFzc2VydChnbG9iYWxzICE9IE5VTEwpOworICAgIC8qIFhYWCBQZXJoYXBzIHdlIHNob3VsZCBjcmVhdGUgYSBzcGVjaWFsaXplZAorICAgICAgIFB5RnJhbWVfTmV3KCkgdGhhdCBkb2Vzbid0IHRha2UgbG9jYWxzLCBidXQgZG9lcworICAgICAgIHRha2UgYnVpbHRpbnMgd2l0aG91dCBzYW5pdHkgY2hlY2tpbmcgdGhlbS4KKyAgICAgICAqLworICAgIGFzc2VydCh0c3RhdGUgIT0gTlVMTCk7CisgICAgZiA9IFB5RnJhbWVfTmV3KHRzdGF0ZSwgY28sIGdsb2JhbHMsIE5VTEwpOworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKSB7CisgICAgICAgIFB5X0lOQ1JFRigqYXJncyk7CisgICAgICAgIGZhc3Rsb2NhbHNbaV0gPSAqYXJncysrOworICAgIH0KKyAgICByZXN1bHQgPSBQeUV2YWxfRXZhbEZyYW1lRXgoZiwwKTsKKworICAgICsrdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgUHlfREVDUkVGKGYpOworICAgIC0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBzdGF0aWMgUHlPYmplY3QgKgotZmFzdF9mdW5jdGlvbihQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKioqcHBfc3RhY2ssIGludCBuLCBpbnQgbmEsIGludCBuaykKK2Zhc3RfZnVuY3Rpb24oUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICoqc3RhY2ssCisgICAgICAgICAgICAgIFB5X3NzaXplX3QgbmFyZ3MsIFB5T2JqZWN0ICprd25hbWVzKQogewogICAgIFB5Q29kZU9iamVjdCAqY28gPSAoUHlDb2RlT2JqZWN0ICopUHlGdW5jdGlvbl9HRVRfQ09ERShmdW5jKTsKICAgICBQeU9iamVjdCAqZ2xvYmFscyA9IFB5RnVuY3Rpb25fR0VUX0dMT0JBTFMoZnVuYyk7CiAgICAgUHlPYmplY3QgKmFyZ2RlZnMgPSBQeUZ1bmN0aW9uX0dFVF9ERUZBVUxUUyhmdW5jKTsKLSAgICBQeU9iamVjdCAqa3dkZWZzID0gUHlGdW5jdGlvbl9HRVRfS1dfREVGQVVMVFMoZnVuYyk7Ci0gICAgUHlPYmplY3QgKm5hbWUgPSAoKFB5RnVuY3Rpb25PYmplY3QgKilmdW5jKSAtPiBmdW5jX25hbWU7Ci0gICAgUHlPYmplY3QgKnF1YWxuYW1lID0gKChQeUZ1bmN0aW9uT2JqZWN0ICopZnVuYykgLT4gZnVuY19xdWFsbmFtZTsKLSAgICBQeU9iamVjdCAqKmQgPSBOVUxMOwotICAgIGludCBuZCA9IDA7CisgICAgUHlPYmplY3QgKmt3ZGVmcywgKmNsb3N1cmUsICpuYW1lLCAqcXVhbG5hbWU7CisgICAgUHlPYmplY3QgKipkOworICAgIFB5X3NzaXplX3Qgbmt3YXJncyA9IChrd25hbWVzID09IE5VTEwpID8gMCA6IFB5VHVwbGVfR0VUX1NJWkUoa3duYW1lcyk7CisgICAgUHlfc3NpemVfdCBuZDsKKworICAgIGFzc2VydCgobmFyZ3MgPT0gMCAmJiBua3dhcmdzID09IDApIHx8IHN0YWNrICE9IE5VTEwpOwogCiAgICAgUENBTEwoUENBTExfRlVOQ1RJT04pOwogICAgIFBDQUxMKFBDQUxMX0ZBU1RfRlVOQ1RJT04pOwotICAgIGlmIChhcmdkZWZzID09IE5VTEwgJiYgY28tPmNvX2FyZ2NvdW50ID09IG4gJiYKLSAgICAgICAgY28tPmNvX2t3b25seWFyZ2NvdW50ID09IDAgJiYgbms9PTAgJiYKLSAgICAgICAgY28tPmNvX2ZsYWdzID09IChDT19PUFRJTUlaRUQgfCBDT19ORVdMT0NBTFMgfCBDT19OT0ZSRUUpKSB7Ci0gICAgICAgIFB5RnJhbWVPYmplY3QgKmY7Ci0gICAgICAgIFB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOwotICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotICAgICAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqc3RhY2s7Ci0gICAgICAgIGludCBpOwogCi0gICAgICAgIFBDQUxMKFBDQUxMX0ZBU1RFUl9GVU5DVElPTik7Ci0gICAgICAgIGFzc2VydChnbG9iYWxzICE9IE5VTEwpOwotICAgICAgICAvKiBYWFggUGVyaGFwcyB3ZSBzaG91bGQgY3JlYXRlIGEgc3BlY2lhbGl6ZWQKLSAgICAgICAgICAgUHlGcmFtZV9OZXcoKSB0aGF0IGRvZXNuJ3QgdGFrZSBsb2NhbHMsIGJ1dCBkb2VzCi0gICAgICAgICAgIHRha2UgYnVpbHRpbnMgd2l0aG91dCBzYW5pdHkgY2hlY2tpbmcgdGhlbS4KLSAgICAgICAgKi8KLSAgICAgICAgYXNzZXJ0KHRzdGF0ZSAhPSBOVUxMKTsKLSAgICAgICAgZiA9IFB5RnJhbWVfTmV3KHRzdGF0ZSwgY28sIGdsb2JhbHMsIE5VTEwpOwotICAgICAgICBpZiAoZiA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICAgZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKLSAgICAgICAgc3RhY2sgPSAoKnBwX3N0YWNrKSAtIG47Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgUHlfSU5DUkVGKCpzdGFjayk7Ci0gICAgICAgICAgICBmYXN0bG9jYWxzW2ldID0gKnN0YWNrKys7CisgICAgaWYgKGNvLT5jb19rd29ubHlhcmdjb3VudCA9PSAwICYmIG5rd2FyZ3MgPT0gMCAmJgorICAgICAgICBjby0+Y29fZmxhZ3MgPT0gKENPX09QVElNSVpFRCB8IENPX05FV0xPQ0FMUyB8IENPX05PRlJFRSkpCisgICAgeworICAgICAgICBpZiAoYXJnZGVmcyA9PSBOVUxMICYmIGNvLT5jb19hcmdjb3VudCA9PSBuYXJncykgeworICAgICAgICAgICAgcmV0dXJuIF9QeUZ1bmN0aW9uX0Zhc3RDYWxsKGNvLCBzdGFjaywgbmFyZ3MsIGdsb2JhbHMpOwogICAgICAgICB9Ci0gICAgICAgIHJldHZhbCA9IFB5RXZhbF9FdmFsRnJhbWVFeChmLDApOwotICAgICAgICArK3RzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOwotICAgICAgICBQeV9ERUNSRUYoZik7Ci0gICAgICAgIC0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7Ci0gICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIGVsc2UgaWYgKG5hcmdzID09IDAgJiYgYXJnZGVmcyAhPSBOVUxMCisgICAgICAgICAgICAgICAgICYmIGNvLT5jb19hcmdjb3VudCA9PSBQeV9TSVpFKGFyZ2RlZnMpKSB7CisgICAgICAgICAgICAvKiBmdW5jdGlvbiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsIGJ1dCBhbGwgcGFyYW1ldGVycyBoYXZlCisgICAgICAgICAgICAgICBhIGRlZmF1bHQgdmFsdWU6IHVzZSBkZWZhdWx0IHZhbHVlcyBhcyBhcmd1bWVudHMgLiovCisgICAgICAgICAgICBzdGFjayA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ2RlZnMsIDApOworICAgICAgICAgICAgcmV0dXJuIF9QeUZ1bmN0aW9uX0Zhc3RDYWxsKGNvLCBzdGFjaywgUHlfU0laRShhcmdkZWZzKSwgZ2xvYmFscyk7CisgICAgICAgIH0KICAgICB9CisKKyAgICBrd2RlZnMgPSBQeUZ1bmN0aW9uX0dFVF9LV19ERUZBVUxUUyhmdW5jKTsKKyAgICBjbG9zdXJlID0gUHlGdW5jdGlvbl9HRVRfQ0xPU1VSRShmdW5jKTsKKyAgICBuYW1lID0gKChQeUZ1bmN0aW9uT2JqZWN0ICopZnVuYykgLT4gZnVuY19uYW1lOworICAgIHF1YWxuYW1lID0gKChQeUZ1bmN0aW9uT2JqZWN0ICopZnVuYykgLT4gZnVuY19xdWFsbmFtZTsKKwogICAgIGlmIChhcmdkZWZzICE9IE5VTEwpIHsKICAgICAgICAgZCA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ2RlZnMsIDApOwogICAgICAgICBuZCA9IFB5X1NJWkUoYXJnZGVmcyk7CiAgICAgfQotICAgIHJldHVybiBfUHlFdmFsX0V2YWxDb2RlV2l0aE5hbWUoKFB5T2JqZWN0KiljbywgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKU5VTEwsICgqcHBfc3RhY2spLW4sIG5hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwcF9zdGFjayktMipuaywgbmssIGQsIG5kLCBrd2RlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUZ1bmN0aW9uX0dFVF9DTE9TVVJFKGZ1bmMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgcXVhbG5hbWUpOworICAgIGVsc2UgeworICAgICAgICBkID0gTlVMTDsKKyAgICAgICAgbmQgPSAwOworICAgIH0KKyAgICByZXR1cm4gX1B5RXZhbF9FdmFsQ29kZVdpdGhOYW1lKChQeU9iamVjdCopY28sIGdsb2JhbHMsIChQeU9iamVjdCAqKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjaywgbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3duYW1lcywgc3RhY2sgKyBuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQsIChpbnQpbmQsIGt3ZGVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmUsIG5hbWUsIHF1YWxuYW1lKTsKK30KKworUHlPYmplY3QgKgorX1B5RnVuY3Rpb25fRmFzdENhbGxLZXl3b3JkcyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKipzdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuYXJncywgUHlPYmplY3QgKmt3bmFtZXMpCit7CisgICAgcmV0dXJuIGZhc3RfZnVuY3Rpb24oZnVuYywgc3RhY2ssIG5hcmdzLCBrd25hbWVzKTsKK30KKworUHlPYmplY3QgKgorX1B5RnVuY3Rpb25fRmFzdENhbGxEaWN0KFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqKmFyZ3MsIFB5X3NzaXplX3QgbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmt3YXJncykKK3sKKyAgICBQeUNvZGVPYmplY3QgKmNvID0gKFB5Q29kZU9iamVjdCAqKVB5RnVuY3Rpb25fR0VUX0NPREUoZnVuYyk7CisgICAgUHlPYmplY3QgKmdsb2JhbHMgPSBQeUZ1bmN0aW9uX0dFVF9HTE9CQUxTKGZ1bmMpOworICAgIFB5T2JqZWN0ICphcmdkZWZzID0gUHlGdW5jdGlvbl9HRVRfREVGQVVMVFMoZnVuYyk7CisgICAgUHlPYmplY3QgKmt3ZGVmcywgKmNsb3N1cmUsICpuYW1lLCAqcXVhbG5hbWU7CisgICAgUHlPYmplY3QgKmt3dHVwbGUsICoqazsKKyAgICBQeU9iamVjdCAqKmQ7CisgICAgUHlfc3NpemVfdCBuZCwgbms7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgIGFzc2VydChmdW5jICE9IE5VTEwpOworICAgIGFzc2VydChuYXJncyA+PSAwKTsKKyAgICBhc3NlcnQobmFyZ3MgPT0gMCB8fCBhcmdzICE9IE5VTEwpOworICAgIGFzc2VydChrd2FyZ3MgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa3dhcmdzKSk7CisKKyAgICBQQ0FMTChQQ0FMTF9GVU5DVElPTik7CisgICAgUENBTEwoUENBTExfRkFTVF9GVU5DVElPTik7CisKKyAgICBpZiAoY28tPmNvX2t3b25seWFyZ2NvdW50ID09IDAgJiYKKyAgICAgICAgKGt3YXJncyA9PSBOVUxMIHx8IFB5RGljdF9TaXplKGt3YXJncykgPT0gMCkgJiYKKyAgICAgICAgY28tPmNvX2ZsYWdzID09IChDT19PUFRJTUlaRUQgfCBDT19ORVdMT0NBTFMgfCBDT19OT0ZSRUUpKQorICAgIHsKKyAgICAgICAgLyogRmFzdCBwYXRocyAqLworICAgICAgICBpZiAoYXJnZGVmcyA9PSBOVUxMICYmIGNvLT5jb19hcmdjb3VudCA9PSBuYXJncykgeworICAgICAgICAgICAgcmV0dXJuIF9QeUZ1bmN0aW9uX0Zhc3RDYWxsKGNvLCBhcmdzLCBuYXJncywgZ2xvYmFscyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobmFyZ3MgPT0gMCAmJiBhcmdkZWZzICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgJiYgY28tPmNvX2FyZ2NvdW50ID09IFB5X1NJWkUoYXJnZGVmcykpIHsKKyAgICAgICAgICAgIC8qIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgYnV0IGFsbCBwYXJhbWV0ZXJzIGhhdmUKKyAgICAgICAgICAgICAgIGEgZGVmYXVsdCB2YWx1ZTogdXNlIGRlZmF1bHQgdmFsdWVzIGFzIGFyZ3VtZW50cyAuKi8KKyAgICAgICAgICAgIGFyZ3MgPSAmUHlUdXBsZV9HRVRfSVRFTShhcmdkZWZzLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBfUHlGdW5jdGlvbl9GYXN0Q2FsbChjbywgYXJncywgUHlfU0laRShhcmdkZWZzKSwgZ2xvYmFscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoa3dhcmdzICE9IE5VTEwpIHsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MsIGk7CisgICAgICAgIG5rID0gUHlEaWN0X1NpemUoa3dhcmdzKTsKKworICAgICAgICBrd3R1cGxlID0gUHlUdXBsZV9OZXcoMiAqIG5rKTsKKyAgICAgICAgaWYgKGt3dHVwbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBrID0gJlB5VHVwbGVfR0VUX0lURU0oa3d0dXBsZSwgMCk7CisgICAgICAgIHBvcyA9IGkgPSAwOworICAgICAgICB3aGlsZSAoUHlEaWN0X05leHQoa3dhcmdzLCAmcG9zLCAma1tpXSwgJmtbaSsxXSkpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihrW2ldKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihrW2krMV0pOworICAgICAgICAgICAgaSArPSAyOworICAgICAgICB9CisgICAgICAgIG5rID0gaSAvIDI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBrd3R1cGxlID0gTlVMTDsKKyAgICAgICAgayA9IE5VTEw7CisgICAgICAgIG5rID0gMDsKKyAgICB9CisKKyAgICBrd2RlZnMgPSBQeUZ1bmN0aW9uX0dFVF9LV19ERUZBVUxUUyhmdW5jKTsKKyAgICBjbG9zdXJlID0gUHlGdW5jdGlvbl9HRVRfQ0xPU1VSRShmdW5jKTsKKyAgICBuYW1lID0gKChQeUZ1bmN0aW9uT2JqZWN0ICopZnVuYykgLT4gZnVuY19uYW1lOworICAgIHF1YWxuYW1lID0gKChQeUZ1bmN0aW9uT2JqZWN0ICopZnVuYykgLT4gZnVuY19xdWFsbmFtZTsKKworICAgIGlmIChhcmdkZWZzICE9IE5VTEwpIHsKKyAgICAgICAgZCA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ2RlZnMsIDApOworICAgICAgICBuZCA9IFB5X1NJWkUoYXJnZGVmcyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkID0gTlVMTDsKKyAgICAgICAgbmQgPSAwOworICAgIH0KKworICAgIHJlc3VsdCA9IF9QeUV2YWxfRXZhbENvZGVXaXRoTmFtZSgoUHlPYmplY3QqKWNvLCBnbG9iYWxzLCAoUHlPYmplY3QgKilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLCBuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaywgbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQsIG5kLCBrd2RlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmUsIG5hbWUsIHF1YWxuYW1lKTsKKyAgICBQeV9YREVDUkVGKGt3dHVwbGUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi11cGRhdGVfa2V5d29yZF9hcmdzKFB5T2JqZWN0ICpvcmlnX2t3ZGljdCwgaW50IG5rLCBQeU9iamVjdCAqKipwcF9zdGFjaywKK2NyZWF0ZV9rZXl3b3JkX2FyZ3MoUHlPYmplY3QgKm5hbWVzLCBQeU9iamVjdCAqKipwcF9zdGFjaywKICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZ1bmMpCiB7Ci0gICAgUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7Ci0gICAgaWYgKG9yaWdfa3dkaWN0ID09IE5VTEwpCi0gICAgICAgIGt3ZGljdCA9IFB5RGljdF9OZXcoKTsKLSAgICBlbHNlIHsKLSAgICAgICAga3dkaWN0ID0gUHlEaWN0X0NvcHkob3JpZ19rd2RpY3QpOwotICAgICAgICBQeV9ERUNSRUYob3JpZ19rd2RpY3QpOwotICAgIH0KKyAgICBQeV9zc2l6ZV90IG5rID0gUHlUdXBsZV9HRVRfU0laRShuYW1lcyk7CisgICAgUHlPYmplY3QgKmt3ZGljdCA9IF9QeURpY3RfTmV3UHJlc2l6ZWQobmspOwogICAgIGlmIChrd2RpY3QgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgd2hpbGUgKC0tbmsgPj0gMCkgewogICAgICAgICBpbnQgZXJyOworICAgICAgICBQeU9iamVjdCAqa2V5ID0gUHlUdXBsZV9HRVRfSVRFTShuYW1lcywgbmspOwogICAgICAgICBQeU9iamVjdCAqdmFsdWUgPSBFWFRfUE9QKCpwcF9zdGFjayk7Ci0gICAgICAgIFB5T2JqZWN0ICprZXkgPSBFWFRfUE9QKCpwcF9zdGFjayk7CiAgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbShrd2RpY3QsIGtleSkgIT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzJXMgZ290IG11bHRpcGxlIHZhbHVlcyAiCkBAIC00ODQzLDEzICs1MjYxLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRGdW5jRGVzYyhmdW5jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkpOwotICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOwogICAgICAgICAgICAgUHlfREVDUkVGKGt3ZGljdCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbShrd2RpY3QsIGtleSwgdmFsdWUpOwotICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgUHlfREVDUkVGKGt3ZGljdCk7CkBAIC00ODYwLDYwICs1Mjc2LDI0IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi11cGRhdGVfc3Rhcl9hcmdzKGludCBuc3RhY2ssIGludCBuc3RhciwgUHlPYmplY3QgKnN0YXJhcmcsCi0gICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqKnBwX3N0YWNrKQorbG9hZF9hcmdzKFB5T2JqZWN0ICoqKnBwX3N0YWNrLCBQeV9zc2l6ZV90IG5hcmdzKQogewotICAgIFB5T2JqZWN0ICpjYWxsYXJncywgKnc7CisgICAgUHlPYmplY3QgKmFyZ3MgPSBQeVR1cGxlX05ldyhuYXJncyk7CiAKLSAgICBjYWxsYXJncyA9IFB5VHVwbGVfTmV3KG5zdGFjayArIG5zdGFyKTsKLSAgICBpZiAoY2FsbGFyZ3MgPT0gTlVMTCkgeworICAgIGlmIChhcmdzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmIChuc3RhcikgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zdGFyOyBpKyspIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICphID0gUHlUdXBsZV9HRVRfSVRFTShzdGFyYXJnLCBpKTsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihhKTsKLSAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIG5zdGFjayArIGksIGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHdoaWxlICgtLW5zdGFjayA+PSAwKSB7Ci0gICAgICAgIHcgPSBFWFRfUE9QKCpwcF9zdGFjayk7Ci0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIG5zdGFjaywgdyk7Ci0gICAgfQotICAgIHJldHVybiBjYWxsYXJnczsKLX0KIAotc3RhdGljIFB5T2JqZWN0ICoKLWxvYWRfYXJncyhQeU9iamVjdCAqKipwcF9zdGFjaywgaW50IG5hKQotewotICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcobmEpOwotICAgIFB5T2JqZWN0ICp3OwotCi0gICAgaWYgKGFyZ3MgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgd2hpbGUgKC0tbmEgPj0gMCkgewotICAgICAgICB3ID0gRVhUX1BPUCgqcHBfc3RhY2spOwotICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIG5hLCB3KTsKKyAgICB3aGlsZSAoLS1uYXJncyA+PSAwKSB7CisgICAgICAgIFB5T2JqZWN0ICphcmc9IEVYVF9QT1AoKnBwX3N0YWNrKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCBuYXJncywgYXJnKTsKICAgICB9CiAgICAgcmV0dXJuIGFyZ3M7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kb19jYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqKipwcF9zdGFjaywgaW50IG5hLCBpbnQgbmspCitkb19jYWxsX2NvcmUoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICpjYWxsYXJncywgUHlPYmplY3QgKmt3ZGljdCkKIHsKLSAgICBQeU9iamVjdCAqY2FsbGFyZ3MgPSBOVUxMOwotICAgIFB5T2JqZWN0ICprd2RpY3QgPSBOVUxMOwotICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCi0gICAgaWYgKG5rID4gMCkgewotICAgICAgICBrd2RpY3QgPSB1cGRhdGVfa2V5d29yZF9hcmdzKE5VTEwsIG5rLCBwcF9zdGFjaywgZnVuYyk7Ci0gICAgICAgIGlmIChrd2RpY3QgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gY2FsbF9mYWlsOwotICAgIH0KLSAgICBjYWxsYXJncyA9IGxvYWRfYXJncyhwcF9zdGFjaywgbmEpOwotICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKQotICAgICAgICBnb3RvIGNhbGxfZmFpbDsKICNpZmRlZiBDQUxMX1BST0ZJTEUKICAgICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHRvIGxvb2sgYXQgdGhlIHR5cGUgb2YgZnVuYyB0bwogICAgICAgIHVwZGF0ZSB0aGUgY2FsbCBzdGF0cyBwcm9wZXJseS4gIERvIGl0IGhlcmUgc28gYXMgdG8gYXZvaWQKQEAgLTQ5MzAsMTE1ICs1MzEwLDE2IEBACiAgICAgZWxzZQogICAgICAgICBQQ0FMTChQQ0FMTF9PVEhFUik7CiAjZW5kaWYKKwogICAgIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkgeworICAgICAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwogICAgICAgICBDX1RSQUNFKHJlc3VsdCwgUHlDRnVuY3Rpb25fQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KTsKLWNhbGxfZmFpbDoKLSAgICBQeV9YREVDUkVGKGNhbGxhcmdzKTsKLSAgICBQeV9YREVDUkVGKGt3ZGljdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWV4dF9kb19jYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqKipwcF9zdGFjaywgaW50IGZsYWdzLCBpbnQgbmEsIGludCBuaykKLXsKLSAgICBpbnQgbnN0YXIgPSAwOwotICAgIFB5T2JqZWN0ICpjYWxsYXJncyA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKnN0YXJhcmcgPSBOVUxMOwotICAgIFB5T2JqZWN0ICprd2RpY3QgPSBOVUxMOwotICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCi0gICAgaWYgKGZsYWdzICYgQ0FMTF9GTEFHX0tXKSB7Ci0gICAgICAgIGt3ZGljdCA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKLSAgICAgICAgaWYgKCFQeURpY3RfQ2hlY2soa3dkaWN0KSkgewotICAgICAgICAgICAgUHlPYmplY3QgKmQ7Ci0gICAgICAgICAgICBkID0gUHlEaWN0X05ldygpOwotICAgICAgICAgICAgaWYgKGQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGV4dF9jYWxsX2ZhaWw7Ci0gICAgICAgICAgICBpZiAoUHlEaWN0X1VwZGF0ZShkLCBrd2RpY3QpICE9IDApIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZCk7Ci0gICAgICAgICAgICAgICAgLyogUHlEaWN0X1VwZGF0ZSByYWlzZXMgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICogZXJyb3IgKHBlcmNvbGF0ZWQgZnJvbSBhbiBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgICogdG8gZ2V0ICdrZXlzJyBhdHRyaWJ1dGUpIGluc3RlYWQgb2YKLSAgICAgICAgICAgICAgICAgKiBhIHR5cGUgZXJyb3IgaWYgaXRzIHNlY29uZCBhcmd1bWVudAotICAgICAgICAgICAgICAgICAqIGlzIG5vdCBhIG1hcHBpbmcuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzJS4yMDBzIGFyZ3VtZW50IGFmdGVyICoqICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGEgbWFwcGluZywgbm90ICUuMjAwcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0RnVuY05hbWUoZnVuYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0RnVuY0Rlc2MoZnVuYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2RpY3QtPm9iX3R5cGUtPnRwX25hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnb3RvIGV4dF9jYWxsX2ZhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeV9ERUNSRUYoa3dkaWN0KTsKLSAgICAgICAgICAgIGt3ZGljdCA9IGQ7Ci0gICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGwoZnVuYywgY2FsbGFyZ3MsIGt3ZGljdCk7CiAgICAgfQotICAgIGlmIChuayA+IDApIHsKLSAgICAgICAga3dkaWN0ID0gdXBkYXRlX2tleXdvcmRfYXJncyhrd2RpY3QsIG5rLCBwcF9zdGFjaywgZnVuYyk7Ci0gICAgICAgIGlmIChrd2RpY3QgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gZXh0X2NhbGxfZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBDQUxMX0ZMQUdfVkFSKSB7Ci0gICAgICAgIHN0YXJhcmcgPSBFWFRfUE9QKCpwcF9zdGFjayk7Ci0gICAgICAgIGlmICghUHlUdXBsZV9DaGVjayhzdGFyYXJnKSkgewotICAgICAgICAgICAgUHlPYmplY3QgKnQgPSBOVUxMOwotICAgICAgICAgICAgaWYgKFB5X1RZUEUoc3RhcmFyZyktPnRwX2l0ZXIgPT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAhUHlTZXF1ZW5jZV9DaGVjayhzdGFyYXJnKSkgewotICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMlLjIwMHMgYXJndW1lbnQgYWZ0ZXIgKiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGFuIGl0ZXJhYmxlLCBub3QgJS4yMDBzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0RnVuY0Rlc2MoZnVuYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJhcmctPm9iX3R5cGUtPnRwX25hbWUpOwotICAgICAgICAgICAgICAgIGdvdG8gZXh0X2NhbGxfZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHQgPSBQeVNlcXVlbmNlX1R1cGxlKHN0YXJhcmcpOwotICAgICAgICAgICAgaWYgKHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGdvdG8gZXh0X2NhbGxfZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFyYXJnKTsKLSAgICAgICAgICAgIHN0YXJhcmcgPSB0OwotICAgICAgICB9Ci0gICAgICAgIG5zdGFyID0gUHlUdXBsZV9HRVRfU0laRShzdGFyYXJnKTsKLSAgICB9Ci0gICAgY2FsbGFyZ3MgPSB1cGRhdGVfc3Rhcl9hcmdzKG5hLCBuc3Rhciwgc3RhcmFyZywgcHBfc3RhY2spOwotICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKQotICAgICAgICBnb3RvIGV4dF9jYWxsX2ZhaWw7Ci0jaWZkZWYgQ0FMTF9QUk9GSUxFCi0gICAgLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB0byBsb29rIGF0IHRoZSB0eXBlIG9mIGZ1bmMgdG8KLSAgICAgICB1cGRhdGUgdGhlIGNhbGwgc3RhdHMgcHJvcGVybHkuICBEbyBpdCBoZXJlIHNvIGFzIHRvIGF2b2lkCi0gICAgICAgZXhwb3NpbmcgdGhlIGNhbGwgc3RhdHMgbWFjaGluZXJ5IG91dHNpZGUgY2V2YWwuYwotICAgICovCi0gICAgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCi0gICAgICAgIFBDQUxMKFBDQUxMX0ZVTkNUSU9OKTsKLSAgICBlbHNlIGlmIChQeU1ldGhvZF9DaGVjayhmdW5jKSkKLSAgICAgICAgUENBTEwoUENBTExfTUVUSE9EKTsKLSAgICBlbHNlIGlmIChQeVR5cGVfQ2hlY2soZnVuYykpCi0gICAgICAgIFBDQUxMKFBDQUxMX1RZUEUpOwotICAgIGVsc2UgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKQotICAgICAgICBQQ0FMTChQQ0FMTF9DRlVOQ1RJT04pOwotICAgIGVsc2UKLSAgICAgICAgUENBTEwoUENBTExfT1RIRVIpOwotI2VuZGlmCi0gICAgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKSB7Ci0gICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0gICAgICAgIENfVFJBQ0UocmVzdWx0LCBQeUNGdW5jdGlvbl9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpOwotZXh0X2NhbGxfZmFpbDoKLSAgICBQeV9YREVDUkVGKGNhbGxhcmdzKTsKLSAgICBQeV9YREVDUkVGKGt3ZGljdCk7Ci0gICAgUHlfWERFQ1JFRihzdGFyYXJnKTsKLSAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBFeHRyYWN0IGEgc2xpY2UgaW5kZXggZnJvbSBhIFB5TG9uZyBvciBhbiBvYmplY3Qgd2l0aCB0aGUKQEAgLTUxMjgsNiArNTQwOSw0NiBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgoraW1wb3J0X25hbWUoUHlGcmFtZU9iamVjdCAqZiwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICpmcm9tbGlzdCwgUHlPYmplY3QgKmxldmVsKQoreworICAgIF9QeV9JREVOVElGSUVSKF9faW1wb3J0X18pOworICAgIFB5T2JqZWN0ICppbXBvcnRfZnVuYywgKnJlczsKKyAgICBQeU9iamVjdCogc3RhY2tbNV07CisKKyAgICBpbXBvcnRfZnVuYyA9IF9QeURpY3RfR2V0SXRlbUlkKGYtPmZfYnVpbHRpbnMsICZQeUlkX19faW1wb3J0X18pOworICAgIGlmIChpbXBvcnRfZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgIl9faW1wb3J0X18gbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIEZhc3QgcGF0aCBmb3Igbm90IG92ZXJsb2FkZWQgX19pbXBvcnRfXy4gKi8KKyAgICBpZiAoaW1wb3J0X2Z1bmMgPT0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwLT5pbXBvcnRfZnVuYykgeworICAgICAgICBpbnQgaWxldmVsID0gX1B5TG9uZ19Bc0ludChsZXZlbCk7CisgICAgICAgIGlmIChpbGV2ZWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWxPYmplY3QoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9nbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9sb2NhbHMgPT0gTlVMTCA/IFB5X05vbmUgOiBmLT5mX2xvY2FscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb21saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaWxldmVsKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoaW1wb3J0X2Z1bmMpOworCisgICAgc3RhY2tbMF0gPSBuYW1lOworICAgIHN0YWNrWzFdID0gZi0+Zl9nbG9iYWxzOworICAgIHN0YWNrWzJdID0gZi0+Zl9sb2NhbHMgPT0gTlVMTCA/IFB5X05vbmUgOiBmLT5mX2xvY2FsczsKKyAgICBzdGFja1szXSA9IGZyb21saXN0OworICAgIHN0YWNrWzRdID0gbGV2ZWw7CisgICAgcmVzID0gX1B5T2JqZWN0X0Zhc3RDYWxsKGltcG9ydF9mdW5jLCBzdGFjaywgNSk7CisgICAgUHlfREVDUkVGKGltcG9ydF9mdW5jKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKgogaW1wb3J0X2Zyb20oUHlPYmplY3QgKnYsIFB5T2JqZWN0ICpuYW1lKQogewogICAgIFB5T2JqZWN0ICp4OwpAQCAtNTI2Myw3ICs1NTg0LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHVuaWNvZGVfY29uY2F0ZW5hdGUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LAotICAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICpmLCB1bnNpZ25lZCBjaGFyICpuZXh0X2luc3RyKQorICAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICpmLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqbmV4dF9pbnN0cikKIHsKICAgICBQeU9iamVjdCAqcmVzOwogICAgIGlmIChQeV9SRUZDTlQodikgPT0gMikgewpAQCAtNTI3MywxMCArNTU5NCwxMSBAQAogICAgICAgICAgKiAndmFyaWFibGUnLiAgV2UgdHJ5IHRvIGRlbGV0ZSB0aGUgdmFyaWFibGUgbm93IHRvIHJlZHVjZQogICAgICAgICAgKiB0aGUgcmVmY250IHRvIDEuCiAgICAgICAgICAqLwotICAgICAgICBzd2l0Y2ggKCpuZXh0X2luc3RyKSB7CisgICAgICAgIGludCBvcGNvZGUsIG9wYXJnOworICAgICAgICBORVhUT1BBUkcoKTsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKICAgICAgICAgY2FzZSBTVE9SRV9GQVNUOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgb3BhcmcgPSBQRUVLQVJHKCk7CiAgICAgICAgICAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CiAgICAgICAgICAgICBpZiAoR0VUTE9DQUwob3BhcmcpID09IHYpCiAgICAgICAgICAgICAgICAgU0VUTE9DQUwob3BhcmcsIE5VTEwpOwpAQCAtNTI4Niw3ICs1NjA4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgUHlPYmplY3QgKipmcmVldmFycyA9IChmLT5mX2xvY2Fsc3BsdXMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2NvZGUtPmNvX25sb2NhbHMpOwotICAgICAgICAgICAgUHlPYmplY3QgKmMgPSBmcmVldmFyc1tQRUVLQVJHKCldOworICAgICAgICAgICAgUHlPYmplY3QgKmMgPSBmcmVldmFyc1tvcGFyZ107CiAgICAgICAgICAgICBpZiAoUHlDZWxsX0dFVChjKSA9PSB2KQogICAgICAgICAgICAgICAgIFB5Q2VsbF9TZXQoYywgTlVMTCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTUyOTQsNyArNTYxNiw3IEBACiAgICAgICAgIGNhc2UgU1RPUkVfTkFNRToKICAgICAgICAgewogICAgICAgICAgICAgUHlPYmplY3QgKm5hbWVzID0gZi0+Zl9jb2RlLT5jb19uYW1lczsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gR0VUSVRFTShuYW1lcywgUEVFS0FSRygpKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwogICAgICAgICAgICAgUHlPYmplY3QgKmxvY2FscyA9IGYtPmZfbG9jYWxzOwogICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KGxvY2FscykgJiYKICAgICAgICAgICAgICAgICBQeURpY3RfR2V0SXRlbShsb2NhbHMsIG5hbWUpID09IHYpIHsKQEAgLTUzNTQsMyArNTY3NiwxNyBAQAogfQogCiAjZW5kaWYKKworUHlfc3NpemVfdAorX1B5RXZhbF9SZXF1ZXN0Q29kZUV4dHJhSW5kZXgoZnJlZWZ1bmMgZnJlZSkKK3sKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgIFB5X3NzaXplX3QgbmV3X2luZGV4OworCisgICAgaWYgKHRzdGF0ZS0+Y29fZXh0cmFfdXNlcl9jb3VudCA9PSBNQVhfQ09fRVhUUkFfVVNFUlMgLSAxKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbmV3X2luZGV4ID0gdHN0YXRlLT5jb19leHRyYV91c2VyX2NvdW50Kys7CisgICAgdHN0YXRlLT5jb19leHRyYV9mcmVlZnVuY3NbbmV3X2luZGV4XSA9IGZyZWU7CisgICAgcmV0dXJuIG5ld19pbmRleDsKK30KZGlmZiAtLWdpdCBhL1B5dGhvbi9jZXZhbF9naWwuaCBiL1B5dGhvbi9jZXZhbF9naWwuaAppbmRleCA4ZDM4ZWU5Li5hM2I0NTBiIDEwMDY0NAotLS0gYS9QeXRob24vY2V2YWxfZ2lsLmgKKysrIGIvUHl0aG9uL2NldmFsX2dpbC5oCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgLyogU3ViLWludGVycHJldGVyIHN1cHBvcnQ6IHRocmVhZHMgbWlnaHQgaGF2ZSBiZWVuIHN3aXRjaGVkCiAgICAgICAgICAgIHVuZGVyIG91ciBmZWV0IHVzaW5nIFB5VGhyZWFkU3RhdGVfU3dhcCgpLiBGaXggdGhlIEdJTCBsYXN0CiAgICAgICAgICAgIGhvbGRlciB2YXJpYWJsZSBzbyB0aGF0IG91ciBoZXVyaXN0aWNzIHdvcmsuICovCi0gICAgICAgIF9QeV9hdG9taWNfc3RvcmVfcmVsYXhlZCgmZ2lsX2xhc3RfaG9sZGVyLCAoUHlfdWludHB0cl90KXRzdGF0ZSk7CisgICAgICAgIF9QeV9hdG9taWNfc3RvcmVfcmVsYXhlZCgmZ2lsX2xhc3RfaG9sZGVyLCAodWludHB0cl90KXRzdGF0ZSk7CiAgICAgfQogCiAgICAgTVVURVhfTE9DSyhnaWxfbXV0ZXgpOwpAQCAtMjQwLDcgKzI0MCw3IEBACiAgICAgX1B5X0FOTk9UQVRFX1JXTE9DS19BQ1FVSVJFRCgmZ2lsX2xvY2tlZCwgLyppc193cml0ZT0qLzEpOwogCiAgICAgaWYgKHRzdGF0ZSAhPSAoUHlUaHJlYWRTdGF0ZSopX1B5X2F0b21pY19sb2FkX3JlbGF4ZWQoJmdpbF9sYXN0X2hvbGRlcikpIHsKLSAgICAgICAgX1B5X2F0b21pY19zdG9yZV9yZWxheGVkKCZnaWxfbGFzdF9ob2xkZXIsIChQeV91aW50cHRyX3QpdHN0YXRlKTsKKyAgICAgICAgX1B5X2F0b21pY19zdG9yZV9yZWxheGVkKCZnaWxfbGFzdF9ob2xkZXIsICh1aW50cHRyX3QpdHN0YXRlKTsKICAgICAgICAgKytnaWxfc3dpdGNoX251bWJlcjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9jbGluaWMvYmx0aW5tb2R1bGUuYy5oIGIvUHl0aG9uL2NsaW5pYy9ibHRpbm1vZHVsZS5jLmgKaW5kZXggNGUyYjFmMS4uNGM0NDM0MCAxMDA2NDQKLS0tIGEvUHl0aG9uL2NsaW5pYy9ibHRpbm1vZHVsZS5jLmgKKysrIGIvUHl0aG9uL2NsaW5pYy9ibHRpbm1vZHVsZS5jLmgKQEAgLTkzLDggKzkzLDkgQEAKICAgICBQeU9iamVjdCAqZm9ybWF0X3NwZWMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfFU6Zm9ybWF0IiwKLSAgICAgICAgJnZhbHVlLCAmZm9ybWF0X3NwZWMpKQorICAgICAgICAmdmFsdWUsICZmb3JtYXRfc3BlYykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2Zvcm1hdF9pbXBsKG1vZHVsZSwgdmFsdWUsIGZvcm1hdF9zcGVjKTsKIAogZXhpdDoKQEAgLTExOSw4ICsxMjAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBpOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmNociIsICZpKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6Y2hyIiwgJmkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9jaHJfaW1wbChtb2R1bGUsIGkpOwogCiBleGl0OgpAQCAtMTU3LDcgKzE1OSw4IEBACiBidWlsdGluX2NvbXBpbGUoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzb3VyY2UiLCAiZmlsZW5hbWUiLCAibW9kZSIsICJmbGFncyIsICJkb250X2luaGVyaXQiLCAib3B0aW1pemUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzb3VyY2UiLCAiZmlsZW5hbWUiLCAibW9kZSIsICJmbGFncyIsICJkb250X2luaGVyaXQiLCAib3B0aW1pemUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPTyZzfGlpaTpjb21waWxlIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc291cmNlOwogICAgIFB5T2JqZWN0ICpmaWxlbmFtZTsKICAgICBjb25zdCBjaGFyICptb2RlOwpAQCAtMTY1LDkgKzE2OCwxMCBAQAogICAgIGludCBkb250X2luaGVyaXQgPSAwOwogICAgIGludCBvcHRpbWl6ZSA9IC0xOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT08mc3xpaWk6Y29tcGlsZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnNvdXJjZSwgUHlVbmljb2RlX0ZTRGVjb2RlciwgJmZpbGVuYW1lLCAmbW9kZSwgJmZsYWdzLCAmZG9udF9pbmhlcml0LCAmb3B0aW1pemUpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnNvdXJjZSwgUHlVbmljb2RlX0ZTRGVjb2RlciwgJmZpbGVuYW1lLCAmbW9kZSwgJmZsYWdzLCAmZG9udF9pbmhlcml0LCAmb3B0aW1pemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9jb21waWxlX2ltcGwobW9kdWxlLCBzb3VyY2UsIGZpbGVuYW1lLCBtb2RlLCBmbGFncywgZG9udF9pbmhlcml0LCBvcHRpbWl6ZSk7CiAKIGV4aXQ6CkBAIC0xOTUsOCArMTk5LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRpdm1vZCIsCiAgICAgICAgIDIsIDIsCi0gICAgICAgICZ4LCAmeSkpCisgICAgICAgICZ4LCAmeSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2Rpdm1vZF9pbXBsKG1vZHVsZSwgeCwgeSk7CiAKIGV4aXQ6CkBAIC0yMzIsOCArMjM3LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImV2YWwiLAogICAgICAgICAxLCAzLAotICAgICAgICAmc291cmNlLCAmZ2xvYmFscywgJmxvY2FscykpCisgICAgICAgICZzb3VyY2UsICZnbG9iYWxzLCAmbG9jYWxzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fZXZhbF9pbXBsKG1vZHVsZSwgc291cmNlLCBnbG9iYWxzLCBsb2NhbHMpOwogCiBleGl0OgpAQCAtMjY5LDggKzI3NSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJleGVjIiwKICAgICAgICAgMSwgMywKLSAgICAgICAgJnNvdXJjZSwgJmdsb2JhbHMsICZsb2NhbHMpKQorICAgICAgICAmc291cmNlLCAmZ2xvYmFscywgJmxvY2FscykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2V4ZWNfaW1wbChtb2R1bGUsIHNvdXJjZSwgZ2xvYmFscywgbG9jYWxzKTsKIAogZXhpdDoKQEAgLTMyMSw4ICszMjgsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGFzYXR0ciIsCiAgICAgICAgIDIsIDIsCi0gICAgICAgICZvYmosICZuYW1lKSkKKyAgICAgICAgJm9iaiwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9oYXNhdHRyX2ltcGwobW9kdWxlLCBvYmosIG5hbWUpOwogCiBleGl0OgpAQCAtMzY2LDggKzM3NCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZXRhdHRyIiwKICAgICAgICAgMywgMywKLSAgICAgICAgJm9iaiwgJm5hbWUsICZ2YWx1ZSkpCisgICAgICAgICZvYmosICZuYW1lLCAmdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9zZXRhdHRyX2ltcGwobW9kdWxlLCBvYmosIG5hbWUsIHZhbHVlKTsKIAogZXhpdDoKQEAgLTM5Nyw4ICs0MDYsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZGVsYXR0ciIsCiAgICAgICAgIDIsIDIsCi0gICAgICAgICZvYmosICZuYW1lKSkKKyAgICAgICAgJm9iaiwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9kZWxhdHRyX2ltcGwobW9kdWxlLCBvYmosIG5hbWUpOwogCiBleGl0OgpAQCAtNTA2LDggKzUxNiw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJwb3ciLAogICAgICAgICAyLCAzLAotICAgICAgICAmeCwgJnksICZ6KSkKKyAgICAgICAgJngsICZ5LCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX3Bvd19pbXBsKG1vZHVsZSwgeCwgeSwgeik7CiAKIGV4aXQ6CkBAIC01NDAsOCArNTUxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImlucHV0IiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJnByb21wdCkpCisgICAgICAgICZwcm9tcHQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9pbnB1dF9pbXBsKG1vZHVsZSwgcHJvbXB0KTsKIAogZXhpdDoKQEAgLTU4NCw4ICs1OTYsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3VtIiwKICAgICAgICAgMSwgMiwKLSAgICAgICAgJml0ZXJhYmxlLCAmc3RhcnQpKQorICAgICAgICAmaXRlcmFibGUsICZzdGFydCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX3N1bV9pbXBsKG1vZHVsZSwgaXRlcmFibGUsIHN0YXJ0KTsKIAogZXhpdDoKQEAgLTYxOCw4ICs2MzEsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaXNpbnN0YW5jZSIsCiAgICAgICAgIDIsIDIsCi0gICAgICAgICZvYmosICZjbGFzc19vcl90dXBsZSkpCisgICAgICAgICZvYmosICZjbGFzc19vcl90dXBsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2lzaW5zdGFuY2VfaW1wbChtb2R1bGUsIG9iaiwgY2xhc3Nfb3JfdHVwbGUpOwogCiBleGl0OgpAQCAtNjUyLDExICs2NjYsMTIgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImlzc3ViY2xhc3MiLAogICAgICAgICAyLCAyLAotICAgICAgICAmY2xzLCAmY2xhc3Nfb3JfdHVwbGUpKQorICAgICAgICAmY2xzLCAmY2xhc3Nfb3JfdHVwbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9pc3N1YmNsYXNzX2ltcGwobW9kdWxlLCBjbHMsIGNsYXNzX29yX3R1cGxlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTkwMzEyNzBiNjRjNzk0YjggaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTc5MGNiM2QyNjUzMWRmZGEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NsaW5pYy9pbXBvcnQuYy5oIGIvUHl0aG9uL2NsaW5pYy9pbXBvcnQuYy5oCmluZGV4IDA1ZDc5YWMuLmIzNDYwYjAgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jbGluaWMvaW1wb3J0LmMuaAorKysgYi9QeXRob24vY2xpbmljL2ltcG9ydC5jLmgKQEAgLTg5LDggKzg5LDkgQEAKICAgICBQeU9iamVjdCAqcGF0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyFVOl9maXhfY29fZmlsZW5hbWUiLAotICAgICAgICAmUHlDb2RlX1R5cGUsICZjb2RlLCAmcGF0aCkpCisgICAgICAgICZQeUNvZGVfVHlwZSwgJmNvZGUsICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pbXBfX2ZpeF9jb19maWxlbmFtZV9pbXBsKG1vZHVsZSwgY29kZSwgcGF0aCk7CiAKIGV4aXQ6CkBAIC0xNDIsOCArMTQzLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTppbml0X2Zyb3plbiIsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6aW5pdF9mcm96ZW4iLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW1wX2luaXRfZnJvemVuX2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTE2OCw4ICsxNzAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpuYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmdldF9mcm96ZW5fb2JqZWN0IiwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpnZXRfZnJvemVuX29iamVjdCIsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pbXBfZ2V0X2Zyb3plbl9vYmplY3RfaW1wbChtb2R1bGUsIG5hbWUpOwogCiBleGl0OgpAQCAtMTk0LDggKzE5Nyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6aXNfZnJvemVuX3BhY2thZ2UiLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmlzX2Zyb3plbl9wYWNrYWdlIiwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2ltcF9pc19mcm96ZW5fcGFja2FnZV9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0yMjAsOCArMjI0LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTppc19idWlsdGluIiwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTppc19idWlsdGluIiwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2ltcF9pc19idWlsdGluX2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTI0Niw4ICsyNTEsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpuYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmlzX2Zyb3plbiIsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6aXNfZnJvemVuIiwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2ltcF9pc19mcm96ZW5faW1wbChtb2R1bGUsIG5hbWUpOwogCiBleGl0OgpAQCAtMjc3LDggKzI4Myw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjcmVhdGVfZHluYW1pYyIsCiAgICAgICAgIDEsIDIsCi0gICAgICAgICZzcGVjLCAmZmlsZSkpCisgICAgICAgICZzcGVjLCAmZmlsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW1wX2NyZWF0ZV9keW5hbWljX2ltcGwobW9kdWxlLCBzcGVjLCBmaWxlKTsKIAogZXhpdDoKQEAgLTMwOCw4ICszMTUsOSBAQAogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgX3JldHVybl92YWx1ZSA9IF9pbXBfZXhlY19keW5hbWljX2ltcGwobW9kdWxlLCBtb2QpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMzcsOCArMzQ1LDkgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfaW1wX2V4ZWNfYnVpbHRpbl9pbXBsKG1vZHVsZSwgbW9kKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzUyLDQgKzM2MSw0IEBACiAjaWZuZGVmIF9JTVBfRVhFQ19EWU5BTUlDX01FVEhPRERFRgogICAgICNkZWZpbmUgX0lNUF9FWEVDX0RZTkFNSUNfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX0lNUF9FWEVDX0RZTkFNSUNfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTkwYWQ2ZTU4MzNlNjE3MGQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQyNGQ3ZjczNzAyYTkwN2YgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NvbXBpbGUuYyBiL1B5dGhvbi9jb21waWxlLmMKaW5kZXggOTNmNDdlMC4uMzY2ODNkMyAxMDA2NDQKLS0tIGEvUHl0aG9uL2NvbXBpbGUuYworKysgYi9QeXRob24vY29tcGlsZS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAiY29kZS5oIgogI2luY2x1ZGUgInN5bXRhYmxlLmgiCiAjaW5jbHVkZSAib3Bjb2RlLmgiCisjaW5jbHVkZSAid29yZGNvZGVfaGVscGVycy5oIgogCiAjZGVmaW5lIERFRkFVTFRfQkxPQ0tfU0laRSAxNgogI2RlZmluZSBERUZBVUxUX0JMT0NLUyA4CkBAIC00Myw3ICs0NCw2IEBACiBzdHJ1Y3QgaW5zdHIgewogICAgIHVuc2lnbmVkIGlfamFicyA6IDE7CiAgICAgdW5zaWduZWQgaV9qcmVsIDogMTsKLSAgICB1bnNpZ25lZCBpX2hhc2FyZyA6IDE7CiAgICAgdW5zaWduZWQgY2hhciBpX29wY29kZTsKICAgICBpbnQgaV9vcGFyZzsKICAgICBzdHJ1Y3QgYmFzaWNibG9ja18gKmlfdGFyZ2V0OyAvKiB0YXJnZXQgYmxvY2sgKGlmIGp1bXAgaW5zdHJ1Y3Rpb24pICovCkBAIC0xNzEsNyArMTcxLDYgQEAKIHN0YXRpYyBpbnQgY29tcGlsZXJfYWRkb3BfbyhzdHJ1Y3QgY29tcGlsZXIgKiwgaW50LCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfYWRkb3BfaShzdHJ1Y3QgY29tcGlsZXIgKiwgaW50LCBQeV9zc2l6ZV90KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfYWRkb3BfaihzdHJ1Y3QgY29tcGlsZXIgKiwgaW50LCBiYXNpY2Jsb2NrICosIGludCk7Ci1zdGF0aWMgYmFzaWNibG9jayAqY29tcGlsZXJfdXNlX25ld19ibG9jayhzdHJ1Y3QgY29tcGlsZXIgKik7CiBzdGF0aWMgaW50IGNvbXBpbGVyX2Vycm9yKHN0cnVjdCBjb21waWxlciAqLCBjb25zdCBjaGFyICopOwogc3RhdGljIGludCBjb21waWxlcl9uYW1lb3Aoc3RydWN0IGNvbXBpbGVyICosIGlkZW50aWZpZXIsIGV4cHJfY29udGV4dF90eSk7CiAKQEAgLTE4MCw2ICsxNzksNyBAQAogc3RhdGljIGludCBjb21waWxlcl92aXNpdF9rZXl3b3JkKHN0cnVjdCBjb21waWxlciAqLCBrZXl3b3JkX3R5KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfdmlzaXRfZXhwcihzdHJ1Y3QgY29tcGlsZXIgKiwgZXhwcl90eSk7CiBzdGF0aWMgaW50IGNvbXBpbGVyX2F1Z2Fzc2lnbihzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSk7CitzdGF0aWMgaW50IGNvbXBpbGVyX2FubmFzc2lnbihzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSk7CiBzdGF0aWMgaW50IGNvbXBpbGVyX3Zpc2l0X3NsaWNlKHN0cnVjdCBjb21waWxlciAqLCBzbGljZV90eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5KTsKIApAQCAtMTk2LDEyICsxOTYsMjIgQEAKIHN0YXRpYyBpbnQgY29tcGlsZXJfd2l0aChzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSwgaW50KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfYXN5bmNfd2l0aChzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSwgaW50KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfYXN5bmNfZm9yKHN0cnVjdCBjb21waWxlciAqLCBzdG10X3R5KTsKLXN0YXRpYyBpbnQgY29tcGlsZXJfY2FsbF9oZWxwZXIoc3RydWN0IGNvbXBpbGVyICpjLCBQeV9zc2l6ZV90IG4sCitzdGF0aWMgaW50IGNvbXBpbGVyX2NhbGxfaGVscGVyKHN0cnVjdCBjb21waWxlciAqYywgaW50IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICphcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqa2V5d29yZHMpOwogc3RhdGljIGludCBjb21waWxlcl90cnlfZXhjZXB0KHN0cnVjdCBjb21waWxlciAqLCBzdG10X3R5KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfc2V0X3F1YWxuYW1lKHN0cnVjdCBjb21waWxlciAqKTsKIAorc3RhdGljIGludCBjb21waWxlcl9zeW5jX2NvbXByZWhlbnNpb25fZ2VuZXJhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsZXIgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpnZW5lcmF0b3JzLCBpbnQgZ2VuX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGVsdCwgZXhwcl90eSB2YWwsIGludCB0eXBlKTsKKworc3RhdGljIGludCBjb21waWxlcl9hc3luY19jb21wcmVoZW5zaW9uX2dlbmVyYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbXBpbGVyICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqZ2VuZXJhdG9ycywgaW50IGdlbl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBlbHQsIGV4cHJfdHkgdmFsLCBpbnQgdHlwZSk7CisKIHN0YXRpYyBQeUNvZGVPYmplY3QgKmFzc2VtYmxlKHN0cnVjdCBjb21waWxlciAqLCBpbnQgYWRkTm9uZSk7CiBzdGF0aWMgUHlPYmplY3QgKl9fZG9jX187CiAKQEAgLTQ3Nyw5ICs0ODcsOSBAQAogewogICAgIGJhc2ljYmxvY2sgKmJsb2NrOwogICAgIGZvciAoYmxvY2sgPSB1LT51X2Jsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+Yl9saXN0KSB7Ci0gICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhjYmNiY2JjYik7Ci0gICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhmYmZiZmJmYik7Ci0gICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhkYmRiZGJkYik7CisgICAgICAgIGFzc2VydCgodWludHB0cl90KWJsb2NrICE9IDB4Y2JjYmNiY2JVKTsKKyAgICAgICAgYXNzZXJ0KCh1aW50cHRyX3QpYmxvY2sgIT0gMHhmYmZiZmJmYlUpOworICAgICAgICBhc3NlcnQoKHVpbnRwdHJfdClibG9jayAhPSAweGRiZGJkYmRiVSk7CiAgICAgICAgIGlmIChibG9jay0+Yl9pbnN0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBhc3NlcnQoYmxvY2stPmJfaWFsbG9jID4gMCk7CiAgICAgICAgICAgICBhc3NlcnQoYmxvY2stPmJfaXVzZWQgPiAwKTsKQEAgLTUyMyw2ICs1MzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgaW50IHNjb3BlX3R5cGUsIHZvaWQgKmtleSwgaW50IGxpbmVubykKIHsKICAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdTsKKyAgICBiYXNpY2Jsb2NrICpibG9jazsKIAogICAgIHUgPSAoc3RydWN0IGNvbXBpbGVyX3VuaXQgKilQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCkpOwpAQCAtNjIwLDggKzYzMSwxMSBAQAogICAgIGMtPnUgPSB1OwogCiAgICAgYy0+Y19uZXN0bGV2ZWwrKzsKLSAgICBpZiAoY29tcGlsZXJfdXNlX25ld19ibG9jayhjKSA9PSBOVUxMKQorCisgICAgYmxvY2sgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGJsb2NrID09IE5VTEwpCiAgICAgICAgIHJldHVybiAwOworICAgIGMtPnUtPnVfY3VyYmxvY2sgPSBibG9jazsKIAogICAgIGlmICh1LT51X3Njb3BlX3R5cGUgIT0gQ09NUElMRVJfU0NPUEVfTU9EVUxFKSB7CiAgICAgICAgIGlmICghY29tcGlsZXJfc2V0X3F1YWxuYW1lKGMpKQpAQCAtNzMxLDYgKzc0NSw3IEBACiAgICAgcmV0dXJuIDE7CiB9CiAKKwogLyogQWxsb2NhdGUgYSBuZXcgYmxvY2sgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCiAgICBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAqLwpAQCAtNzU1LDE2ICs3NzAsNiBAQAogfQogCiBzdGF0aWMgYmFzaWNibG9jayAqCi1jb21waWxlcl91c2VfbmV3X2Jsb2NrKHN0cnVjdCBjb21waWxlciAqYykKLXsKLSAgICBiYXNpY2Jsb2NrICpibG9jayA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLSAgICBpZiAoYmxvY2sgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOwotICAgIHJldHVybiBibG9jazsKLX0KLQotc3RhdGljIGJhc2ljYmxvY2sgKgogY29tcGlsZXJfbmV4dF9ibG9jayhzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7CiAgICAgYmFzaWNibG9jayAqYmxvY2sgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CkBAIC04MTAsNyArODE1LDcgQEAKICAgICAgICAgb2xkc2l6ZSA9IGItPmJfaWFsbG9jICogc2l6ZW9mKHN0cnVjdCBpbnN0cik7CiAgICAgICAgIG5ld3NpemUgPSBvbGRzaXplIDw8IDE7CiAKLSAgICAgICAgaWYgKG9sZHNpemUgPiAoUFlfU0laRV9NQVggPj4gMSkpIHsKKyAgICAgICAgaWYgKG9sZHNpemUgPiAoU0laRV9NQVggPj4gMSkpIHsKICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KQEAgLTkzOSw2ICs5NDQsOCBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICBjYXNlIElNUE9SVF9TVEFSOgogICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIFNFVFVQX0FOTk9UQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIGNhc2UgWUlFTERfVkFMVUU6CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgY2FzZSBZSUVMRF9GUk9NOgpAQCAtOTc2LDYgKzk4Myw3IEBACiAgICAgICAgIGNhc2UgQlVJTERfVFVQTEU6CiAgICAgICAgIGNhc2UgQlVJTERfTElTVDoKICAgICAgICAgY2FzZSBCVUlMRF9TRVQ6CisgICAgICAgIGNhc2UgQlVJTERfU1RSSU5HOgogICAgICAgICAgICAgcmV0dXJuIDEtb3Bhcmc7CiAgICAgICAgIGNhc2UgQlVJTERfTElTVF9VTlBBQ0s6CiAgICAgICAgIGNhc2UgQlVJTERfVFVQTEVfVU5QQUNLOgpAQCAtOTgzLDkgKzk5MSwxMSBAQAogICAgICAgICBjYXNlIEJVSUxEX01BUF9VTlBBQ0s6CiAgICAgICAgICAgICByZXR1cm4gMSAtIG9wYXJnOwogICAgICAgICBjYXNlIEJVSUxEX01BUF9VTlBBQ0tfV0lUSF9DQUxMOgotICAgICAgICAgICAgcmV0dXJuIDEgLSAob3BhcmcgJiAweEZGKTsKKyAgICAgICAgICAgIHJldHVybiAxIC0gb3Bhcmc7CiAgICAgICAgIGNhc2UgQlVJTERfTUFQOgogICAgICAgICAgICAgcmV0dXJuIDEgLSAyKm9wYXJnOworICAgICAgICBjYXNlIEJVSUxEX0NPTlNUX0tFWV9NQVA6CisgICAgICAgICAgICByZXR1cm4gLW9wYXJnOwogICAgICAgICBjYXNlIExPQURfQVRUUjoKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBjYXNlIENPTVBBUkVfT1A6CkBAIC0xMDIzLDIyICsxMDMzLDIwIEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIGNhc2UgREVMRVRFX0ZBU1Q6CiAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBTVE9SRV9BTk5PVEFUSU9OOgorICAgICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgICAgIGNhc2UgUkFJU0VfVkFSQVJHUzoKICAgICAgICAgICAgIHJldHVybiAtb3Bhcmc7Ci0jZGVmaW5lIE5BUkdTKG8pICgoKG8pICUgMjU2KSArIDIqKCgobykgLyAyNTYpICUgMjU2KSkKICAgICAgICAgY2FzZSBDQUxMX0ZVTkNUSU9OOgotICAgICAgICAgICAgcmV0dXJuIC1OQVJHUyhvcGFyZyk7Ci0gICAgICAgIGNhc2UgQ0FMTF9GVU5DVElPTl9WQVI6CisgICAgICAgICAgICByZXR1cm4gLW9wYXJnOwogICAgICAgICBjYXNlIENBTExfRlVOQ1RJT05fS1c6Ci0gICAgICAgICAgICByZXR1cm4gLU5BUkdTKG9wYXJnKS0xOwotICAgICAgICBjYXNlIENBTExfRlVOQ1RJT05fVkFSX0tXOgotICAgICAgICAgICAgcmV0dXJuIC1OQVJHUyhvcGFyZyktMjsKKyAgICAgICAgICAgIHJldHVybiAtb3BhcmctMTsKKyAgICAgICAgY2FzZSBDQUxMX0ZVTkNUSU9OX0VYOgorICAgICAgICAgICAgcmV0dXJuIC0gKChvcGFyZyAmIDB4MDEpICE9IDApIC0gKChvcGFyZyAmIDB4MDIpICE9IDApOwogICAgICAgICBjYXNlIE1BS0VfRlVOQ1RJT046Ci0gICAgICAgICAgICByZXR1cm4gLTEgLU5BUkdTKG9wYXJnKSAtICgob3BhcmcgPj4gMTYpICYgMHhmZmZmKTsKLSAgICAgICAgY2FzZSBNQUtFX0NMT1NVUkU6Ci0gICAgICAgICAgICByZXR1cm4gLTIgLSBOQVJHUyhvcGFyZykgLSAoKG9wYXJnID4+IDE2KSAmIDB4ZmZmZik7Ci0jdW5kZWYgTkFSR1MKKyAgICAgICAgICAgIHJldHVybiAtMSAtICgob3BhcmcgJiAweDAxKSAhPSAwKSAtICgob3BhcmcgJiAweDAyKSAhPSAwKSAtCisgICAgICAgICAgICAgICAgKChvcGFyZyAmIDB4MDQpICE9IDApIC0gKChvcGFyZyAmIDB4MDgpICE9IDApOwogICAgICAgICBjYXNlIEJVSUxEX1NMSUNFOgogICAgICAgICAgICAgaWYgKG9wYXJnID09IDMpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0yOwpAQCAtMTA2Niw2ICsxMDc0LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgY2FzZSBHRVRfWUlFTERfRlJPTV9JVEVSOgogICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgRk9STUFUX1ZBTFVFOgorICAgICAgICAgICAgLyogSWYgdGhlcmUncyBhIGZtdF9zcGVjIG9uIHRoZSBzdGFjaywgd2UgZ28gZnJvbSAyLT4xLAorICAgICAgICAgICAgICAgZWxzZSAxLT4xLiAqLworICAgICAgICAgICAgcmV0dXJuIChvcGFyZyAmIEZWU19NQVNLKSA9PSBGVlNfSEFWRV9TUEVDID8gLTEgOiAwOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIFBZX0lOVkFMSURfU1RBQ0tfRUZGRUNUOwogICAgIH0KQEAgLTEwODIsMTMgKzEwOTQsMTQgQEAKICAgICBiYXNpY2Jsb2NrICpiOwogICAgIHN0cnVjdCBpbnN0ciAqaTsKICAgICBpbnQgb2ZmOworICAgIGFzc2VydCghSEFTX0FSRyhvcGNvZGUpKTsKICAgICBvZmYgPSBjb21waWxlcl9uZXh0X2luc3RyKGMsIGMtPnUtPnVfY3VyYmxvY2spOwogICAgIGlmIChvZmYgPCAwKQogICAgICAgICByZXR1cm4gMDsKICAgICBiID0gYy0+dS0+dV9jdXJibG9jazsKICAgICBpID0gJmItPmJfaW5zdHJbb2ZmXTsKICAgICBpLT5pX29wY29kZSA9IG9wY29kZTsKLSAgICBpLT5pX2hhc2FyZyA9IDA7CisgICAgaS0+aV9vcGFyZyA9IDA7CiAgICAgaWYgKG9wY29kZSA9PSBSRVRVUk5fVkFMVUUpCiAgICAgICAgIGItPmJfcmV0dXJuID0gMTsKICAgICBjb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7CkBAIC0xMTY1LDEwICsxMTc4LDE1IEBACiAgICAgc3RydWN0IGluc3RyICppOwogICAgIGludCBvZmY7CiAKLSAgICAvKiBJbnRlZ2VyIGFyZ3VtZW50cyBhcmUgbGltaXQgdG8gMTYtYml0LiBUaGVyZSBpcyBhbiBleHRlbnNpb24gZm9yIDMyLWJpdAotICAgICAgIGludGVnZXIgYXJndW1lbnRzLiAqLwotICAgIGFzc2VydCgoLTIxNDc0ODM2NDctMSkgPD0gb3BhcmcpOwotICAgIGFzc2VydChvcGFyZyA8PSAyMTQ3NDgzNjQ3KTsKKyAgICAvKiBvcGFyZyB2YWx1ZSBpcyB1bnNpZ25lZCwgYnV0IGEgc2lnbmVkIEMgaW50IGlzIHVzdWFsbHkgdXNlZCB0byBzdG9yZQorICAgICAgIGl0IGluIHRoZSBDIGNvZGUgKGxpa2UgUHl0aG9uL2NldmFsLmMpLgorCisgICAgICAgTGltaXQgdG8gMzItYml0IHNpZ25lZCBDIGludCAocmF0aGVyIHRoYW4gSU5UX01BWCkgZm9yIHBvcnRhYmlsaXR5LgorCisgICAgICAgVGhlIGFyZ3VtZW50IG9mIGEgY29uY3JldGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gaXMgbGltaXRlZCB0byA4LWJpdC4KKyAgICAgICBFWFRFTkRFRF9BUkcgaXMgdXNlZCBmb3IgMTYsIDI0LCBhbmQgMzItYml0IGFyZ3VtZW50cy4gKi8KKyAgICBhc3NlcnQoSEFTX0FSRyhvcGNvZGUpKTsKKyAgICBhc3NlcnQoMCA8PSBvcGFyZyAmJiBvcGFyZyA8PSAyMTQ3NDgzNjQ3KTsKIAogICAgIG9mZiA9IGNvbXBpbGVyX25leHRfaW5zdHIoYywgYy0+dS0+dV9jdXJibG9jayk7CiAgICAgaWYgKG9mZiA8IDApCkBAIC0xMTc2LDcgKzExOTQsNiBAQAogICAgIGkgPSAmYy0+dS0+dV9jdXJibG9jay0+Yl9pbnN0cltvZmZdOwogICAgIGktPmlfb3Bjb2RlID0gb3Bjb2RlOwogICAgIGktPmlfb3BhcmcgPSBQeV9TQUZFX0RPV05DQVNUKG9wYXJnLCBQeV9zc2l6ZV90LCBpbnQpOwotICAgIGktPmlfaGFzYXJnID0gMTsKICAgICBjb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7CiAgICAgcmV0dXJuIDE7CiB9CkBAIC0xMTg3LDYgKzEyMDQsNyBAQAogICAgIHN0cnVjdCBpbnN0ciAqaTsKICAgICBpbnQgb2ZmOwogCisgICAgYXNzZXJ0KEhBU19BUkcob3Bjb2RlKSk7CiAgICAgYXNzZXJ0KGIgIT0gTlVMTCk7CiAgICAgb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKICAgICBpZiAob2ZmIDwgMCkKQEAgLTExOTQsNyArMTIxMiw2IEBACiAgICAgaSA9ICZjLT51LT51X2N1cmJsb2NrLT5iX2luc3RyW29mZl07CiAgICAgaS0+aV9vcGNvZGUgPSBvcGNvZGU7CiAgICAgaS0+aV90YXJnZXQgPSBiOwotICAgIGktPmlfaGFzYXJnID0gMTsKICAgICBpZiAoYWJzb2x1dGUpCiAgICAgICAgIGktPmlfamFicyA9IDE7CiAgICAgZWxzZQpAQCAtMTIwMywyMiArMTIyMCwxMiBAQAogICAgIHJldHVybiAxOwogfQogCi0vKiBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBORVdfQkxPQ0sgYW5kIE5FWFRfQkxPQ0sgaXMgc3VidGxlLiAgKEknZAotICAgbGlrZSB0byBmaW5kIGJldHRlciBuYW1lcy4pICBORVdfQkxPQ0soKSBjcmVhdGVzIGEgbmV3IGJsb2NrIGFuZCBzZXRzCi0gICBpdCBhcyB0aGUgY3VycmVudCBibG9jay4gIE5FWFRfQkxPQ0soKSBhbHNvIGNyZWF0ZXMgYW4gaW1wbGljaXQganVtcAotICAgZnJvbSB0aGUgY3VycmVudCBibG9jayB0byB0aGUgbmV3IGJsb2NrLgorLyogTkVYVF9CTE9DSygpIGNyZWF0ZXMgYW4gaW1wbGljaXQganVtcCBmcm9tIHRoZSBjdXJyZW50IGJsb2NrCisgICB0byB0aGUgbmV3IGJsb2NrLgorCisgICBUaGUgcmV0dXJucyBpbnNpZGUgdGhpcyBtYWNybyBtYWtlIGl0IGltcG9zc2libGUgdG8gZGVjcmVmIG9iamVjdHMKKyAgIGNyZWF0ZWQgaW4gdGhlIGxvY2FsIGZ1bmN0aW9uLiBMb2NhbCBvYmplY3RzIHNob3VsZCB1c2UgdGhlIGFyZW5hLgogKi8KLQotLyogVGhlIHJldHVybnMgaW5zaWRlIHRoZXNlIG1hY3JvcyBtYWtlIGl0IGltcG9zc2libGUgdG8gZGVjcmVmIG9iamVjdHMKLSAgIGNyZWF0ZWQgaW4gdGhlIGxvY2FsIGZ1bmN0aW9uLiAgTG9jYWwgb2JqZWN0cyBzaG91bGQgdXNlIHRoZSBhcmVuYS4KLSovCi0KLQotI2RlZmluZSBORVdfQkxPQ0soQykgeyBcCi0gICAgaWYgKGNvbXBpbGVyX3VzZV9uZXdfYmxvY2soKEMpKSA9PSBOVUxMKSBcCi0gICAgICAgIHJldHVybiAwOyBcCi19Ci0KICNkZWZpbmUgTkVYVF9CTE9DSyhDKSB7IFwKICAgICBpZiAoY29tcGlsZXJfbmV4dF9ibG9jaygoQykpID09IE5VTEwpIFwKICAgICAgICAgcmV0dXJuIDA7IFwKQEAgLTEyNDEsNiArMTI0OCwxNSBAQAogICAgICAgICByZXR1cm4gMDsgXAogfQogCisvKiBTYW1lIGFzIEFERE9QX08sIGJ1dCBzdGVhbHMgYSByZWZlcmVuY2UuICovCisjZGVmaW5lIEFERE9QX04oQywgT1AsIE8sIFRZUEUpIHsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3BfbygoQyksIChPUCksIChDKS0+dS0+dV8gIyMgVFlQRSwgKE8pKSkgeyBcCisgICAgICAgIFB5X0RFQ1JFRigoTykpOyBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisgICAgUHlfREVDUkVGKChPKSk7IFwKK30KKwogI2RlZmluZSBBRERPUF9OQU1FKEMsIE9QLCBPLCBUWVBFKSB7IFwKICAgICBpZiAoIWNvbXBpbGVyX2FkZG9wX25hbWUoKEMpLCAoT1ApLCAoQyktPnUtPnVfICMjIFRZUEUsIChPKSkpIFwKICAgICAgICAgcmV0dXJuIDA7IFwKQEAgLTEzMDksMTAgKzEzMjUsMTEwIEBACiB7CiAgICAgaWYgKHMtPmtpbmQgIT0gRXhwcl9raW5kKQogICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gcy0+di5FeHByLnZhbHVlLT5raW5kID09IFN0cl9raW5kOworICAgIGlmIChzLT52LkV4cHIudmFsdWUtPmtpbmQgPT0gU3RyX2tpbmQpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChzLT52LkV4cHIudmFsdWUtPmtpbmQgPT0gQ29uc3RhbnRfa2luZCkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9DaGVja0V4YWN0KHMtPnYuRXhwci52YWx1ZS0+di5Db25zdGFudC52YWx1ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKLS8qIENvbXBpbGUgYSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzLCBjaGVja2luZyBmb3IgYSBkb2NzdHJpbmcuICovCitzdGF0aWMgaW50Citpc19jb25zdChleHByX3R5IGUpCit7CisgICAgc3dpdGNoIChlLT5raW5kKSB7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgIGNhc2UgTnVtX2tpbmQ6CisgICAgY2FzZSBTdHJfa2luZDoKKyAgICBjYXNlIEJ5dGVzX2tpbmQ6CisgICAgY2FzZSBFbGxpcHNpc19raW5kOgorICAgIGNhc2UgTmFtZUNvbnN0YW50X2tpbmQ6CisgICAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2dldF9jb25zdF92YWx1ZShleHByX3R5IGUpCit7CisgICAgc3dpdGNoIChlLT5raW5kKSB7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICByZXR1cm4gZS0+di5Db25zdGFudC52YWx1ZTsKKyAgICBjYXNlIE51bV9raW5kOgorICAgICAgICByZXR1cm4gZS0+di5OdW0ubjsKKyAgICBjYXNlIFN0cl9raW5kOgorICAgICAgICByZXR1cm4gZS0+di5TdHIuczsKKyAgICBjYXNlIEJ5dGVzX2tpbmQ6CisgICAgICAgIHJldHVybiBlLT52LkJ5dGVzLnM7CisgICAgY2FzZSBFbGxpcHNpc19raW5kOgorICAgICAgICByZXR1cm4gUHlfRWxsaXBzaXM7CisgICAgY2FzZSBOYW1lQ29uc3RhbnRfa2luZDoKKyAgICAgICAgcmV0dXJuIGUtPnYuTmFtZUNvbnN0YW50LnZhbHVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCghaXNfY29uc3QoZSkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKKy8qIFNlYXJjaCBpZiB2YXJpYWJsZSBhbm5vdGF0aW9ucyBhcmUgcHJlc2VudCBzdGF0aWNhbGx5IGluIGEgYmxvY2suICovCisKK3N0YXRpYyBpbnQKK2ZpbmRfYW5uKGFzZGxfc2VxICpzdG10cykKK3sKKyAgICBpbnQgaSwgaiwgcmVzID0gMDsKKyAgICBzdG10X3R5IHN0OworCisgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzdG10cyk7IGkrKykgeworICAgICAgICBzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzdG10cywgaSk7CisgICAgICAgIHN3aXRjaCAoc3QtPmtpbmQpIHsKKyAgICAgICAgY2FzZSBBbm5Bc3NpZ25fa2luZDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEZvcl9raW5kOgorICAgICAgICAgICAgcmVzID0gZmluZF9hbm4oc3QtPnYuRm9yLmJvZHkpIHx8CisgICAgICAgICAgICAgICAgICBmaW5kX2FubihzdC0+di5Gb3Iub3JlbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFzeW5jRm9yX2tpbmQ6CisgICAgICAgICAgICByZXMgPSBmaW5kX2FubihzdC0+di5Bc3luY0Zvci5ib2R5KSB8fAorICAgICAgICAgICAgICAgICAgZmluZF9hbm4oc3QtPnYuQXN5bmNGb3Iub3JlbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdoaWxlX2tpbmQ6CisgICAgICAgICAgICByZXMgPSBmaW5kX2FubihzdC0+di5XaGlsZS5ib2R5KSB8fAorICAgICAgICAgICAgICAgICAgZmluZF9hbm4oc3QtPnYuV2hpbGUub3JlbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElmX2tpbmQ6CisgICAgICAgICAgICByZXMgPSBmaW5kX2FubihzdC0+di5JZi5ib2R5KSB8fAorICAgICAgICAgICAgICAgICAgZmluZF9hbm4oc3QtPnYuSWYub3JlbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdpdGhfa2luZDoKKyAgICAgICAgICAgIHJlcyA9IGZpbmRfYW5uKHN0LT52LldpdGguYm9keSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBc3luY1dpdGhfa2luZDoKKyAgICAgICAgICAgIHJlcyA9IGZpbmRfYW5uKHN0LT52LkFzeW5jV2l0aC5ib2R5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRyeV9raW5kOgorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGFzZGxfc2VxX0xFTihzdC0+di5UcnkuaGFuZGxlcnMpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBleGNlcHRoYW5kbGVyX3R5IGhhbmRsZXIgPSAoZXhjZXB0aGFuZGxlcl90eSlhc2RsX3NlcV9HRVQoCisgICAgICAgICAgICAgICAgICAgIHN0LT52LlRyeS5oYW5kbGVycywgaik7CisgICAgICAgICAgICAgICAgaWYgKGZpbmRfYW5uKGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci5ib2R5KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBmaW5kX2FubihzdC0+di5UcnkuYm9keSkgfHwKKyAgICAgICAgICAgICAgICAgIGZpbmRfYW5uKHN0LT52LlRyeS5maW5hbGJvZHkpIHx8CisgICAgICAgICAgICAgICAgICBmaW5kX2FubihzdC0+di5Ucnkub3JlbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKiBDb21waWxlIGEgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cywgY2hlY2tpbmcgZm9yIGEgZG9jc3RyaW5nCisgICBhbmQgZm9yIGFubm90YXRpb25zLiAqLwogCiBzdGF0aWMgaW50CiBjb21waWxlcl9ib2R5KHN0cnVjdCBjb21waWxlciAqYywgYXNkbF9zZXEgKnN0bXRzKQpAQCAtMTMyMCw2ICsxNDM2LDE5IEBACiAgICAgaW50IGkgPSAwOwogICAgIHN0bXRfdHkgc3Q7CiAKKyAgICAvKiBTZXQgY3VycmVudCBsaW5lIG51bWJlciB0byB0aGUgbGluZSBudW1iZXIgb2YgZmlyc3Qgc3RhdGVtZW50LgorICAgICAgIFRoaXMgd2F5IGxpbmUgbnVtYmVyIGZvciBTRVRVUF9BTk5PVEFUSU9OUyB3aWxsIGFsd2F5cworICAgICAgIGNvaW5jaWRlIHdpdGggdGhlIGxpbmUgbnVtYmVyIG9mIGZpcnN0ICJyZWFsIiBzdGF0ZW1lbnQgaW4gbW9kdWxlLgorICAgICAgIElmIGJvZHkgaXMgZW1weSwgdGhlbiBsaW5lbm8gd2lsbCBiZSBzZXQgbGF0ZXIgaW4gYXNzZW1ibGUuICovCisgICAgaWYgKGMtPnUtPnVfc2NvcGVfdHlwZSA9PSBDT01QSUxFUl9TQ09QRV9NT0RVTEUgJiYKKyAgICAgICAgIWMtPnUtPnVfbGluZW5vICYmIGFzZGxfc2VxX0xFTihzdG10cykpIHsKKyAgICAgICAgc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQoc3RtdHMsIDApOworICAgICAgICBjLT51LT51X2xpbmVubyA9IHN0LT5saW5lbm87CisgICAgfQorICAgIC8qIEV2ZXJ5IGFubm90YXRlZCBjbGFzcyBhbmQgbW9kdWxlIHNob3VsZCBoYXZlIF9fYW5ub3RhdGlvbnNfXy4gKi8KKyAgICBpZiAoZmluZF9hbm4oc3RtdHMpKSB7CisgICAgICAgIEFERE9QKGMsIFNFVFVQX0FOTk9UQVRJT05TKTsKKyAgICB9CiAgICAgaWYgKCFhc2RsX3NlcV9MRU4oc3RtdHMpKQogICAgICAgICByZXR1cm4gMTsKICAgICBzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzdG10cywgMCk7CkBAIC0xMzU3LDYgKzE0ODYsOSBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgSW50ZXJhY3RpdmVfa2luZDoKKyAgICAgICAgaWYgKGZpbmRfYW5uKG1vZC0+di5JbnRlcmFjdGl2ZS5ib2R5KSkgeworICAgICAgICAgICAgQURET1AoYywgU0VUVVBfQU5OT1RBVElPTlMpOworICAgICAgICB9CiAgICAgICAgIGMtPmNfaW50ZXJhY3RpdmUgPSAxOwogICAgICAgICBWSVNJVF9TRVFfSU5fU0NPUEUoYywgc3RtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLT52LkludGVyYWN0aXZlLmJvZHkpOwpAQCAtMTQyNiw1MyArMTU1OCw1MCBAQAogfQogCiBzdGF0aWMgaW50Ci1jb21waWxlcl9tYWtlX2Nsb3N1cmUoc3RydWN0IGNvbXBpbGVyICpjLCBQeUNvZGVPYmplY3QgKmNvLCBQeV9zc2l6ZV90IGFyZ3MsIFB5T2JqZWN0ICpxdWFsbmFtZSkKK2NvbXBpbGVyX21ha2VfY2xvc3VyZShzdHJ1Y3QgY29tcGlsZXIgKmMsIFB5Q29kZU9iamVjdCAqY28sIFB5X3NzaXplX3QgZmxhZ3MsIFB5T2JqZWN0ICpxdWFsbmFtZSkKIHsKICAgICBQeV9zc2l6ZV90IGksIGZyZWUgPSBQeUNvZGVfR2V0TnVtRnJlZShjbyk7CiAgICAgaWYgKHF1YWxuYW1lID09IE5VTEwpCiAgICAgICAgIHF1YWxuYW1lID0gY28tPmNvX25hbWU7CiAKLSAgICBpZiAoZnJlZSA9PSAwKSB7Ci0gICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgKFB5T2JqZWN0KiljbywgY29uc3RzKTsKLSAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBxdWFsbmFtZSwgY29uc3RzKTsKLSAgICAgICAgQURET1BfSShjLCBNQUtFX0ZVTkNUSU9OLCBhcmdzKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBmcmVlOyArK2kpIHsKLSAgICAgICAgLyogQnlwYXNzIGNvbV9hZGRvcF92YXJuYW1lIGJlY2F1c2UgaXQgd2lsbCBnZW5lcmF0ZQotICAgICAgICAgICBMT0FEX0RFUkVGIGJ1dCBMT0FEX0NMT1NVUkUgaXMgbmVlZGVkLgotICAgICAgICAqLwotICAgICAgICBQeU9iamVjdCAqbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX2ZyZWV2YXJzLCBpKTsKLSAgICAgICAgaW50IGFyZywgcmVmdHlwZTsKKyAgICBpZiAoZnJlZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJlZTsgKytpKSB7CisgICAgICAgICAgICAvKiBCeXBhc3MgY29tX2FkZG9wX3Zhcm5hbWUgYmVjYXVzZSBpdCB3aWxsIGdlbmVyYXRlCisgICAgICAgICAgICAgICBMT0FEX0RFUkVGIGJ1dCBMT0FEX0NMT1NVUkUgaXMgbmVlZGVkLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fZnJlZXZhcnMsIGkpOworICAgICAgICAgICAgaW50IGFyZywgcmVmdHlwZTsKIAotICAgICAgICAvKiBTcGVjaWFsIGNhc2U6IElmIGEgY2xhc3MgY29udGFpbnMgYSBtZXRob2Qgd2l0aCBhCi0gICAgICAgICAgIGZyZWUgdmFyaWFibGUgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIG1ldGhvZCwKLSAgICAgICAgICAgdGhlIG5hbWUgd2lsbCBiZSBjb25zaWRlcmVkIGZyZWUgKmFuZCogbG9jYWwgaW4gdGhlCi0gICAgICAgICAgIGNsYXNzLiAgSXQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGNsb3N1cmUsIGFzCi0gICAgICAgICAgIHdlbGwgYXMgYnkgdGhlIG5vcm1hbCBuYW1lIGxvb29rdXAgbG9naWMuCi0gICAgICAgICovCi0gICAgICAgIHJlZnR5cGUgPSBnZXRfcmVmX3R5cGUoYywgbmFtZSk7Ci0gICAgICAgIGlmIChyZWZ0eXBlID09IENFTEwpCi0gICAgICAgICAgICBhcmcgPSBjb21waWxlcl9sb29rdXBfYXJnKGMtPnUtPnVfY2VsbHZhcnMsIG5hbWUpOwotICAgICAgICBlbHNlIC8qIChyZWZ0eXBlID09IEZSRUUpICovCi0gICAgICAgICAgICBhcmcgPSBjb21waWxlcl9sb29rdXBfYXJnKGMtPnUtPnVfZnJlZXZhcnMsIG5hbWUpOwotICAgICAgICBpZiAoYXJnID09IC0xKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAibG9va3VwICVzIGluICVzICVkICVkXG4iCi0gICAgICAgICAgICAgICAgImZyZWV2YXJzIG9mICVzOiAlc1xuIiwKLSAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KFB5T2JqZWN0X1JlcHIobmFtZSkpLAotICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjgoYy0+dS0+dV9uYW1lKSwKLSAgICAgICAgICAgICAgICByZWZ0eXBlLCBhcmcsCi0gICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOChjby0+Y29fbmFtZSksCi0gICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOChQeU9iamVjdF9SZXByKGNvLT5jb19mcmVldmFycykpKTsKLSAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNvbXBpbGVyX21ha2VfY2xvc3VyZSgpIik7CisgICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2U6IElmIGEgY2xhc3MgY29udGFpbnMgYSBtZXRob2Qgd2l0aCBhCisgICAgICAgICAgICAgICBmcmVlIHZhcmlhYmxlIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBtZXRob2QsCisgICAgICAgICAgICAgICB0aGUgbmFtZSB3aWxsIGJlIGNvbnNpZGVyZWQgZnJlZSAqYW5kKiBsb2NhbCBpbiB0aGUKKyAgICAgICAgICAgICAgIGNsYXNzLiAgSXQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGNsb3N1cmUsIGFzCisgICAgICAgICAgICAgICB3ZWxsIGFzIGJ5IHRoZSBub3JtYWwgbmFtZSBsb29va3VwIGxvZ2ljLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlZnR5cGUgPSBnZXRfcmVmX3R5cGUoYywgbmFtZSk7CisgICAgICAgICAgICBpZiAocmVmdHlwZSA9PSBDRUxMKQorICAgICAgICAgICAgICAgIGFyZyA9IGNvbXBpbGVyX2xvb2t1cF9hcmcoYy0+dS0+dV9jZWxsdmFycywgbmFtZSk7CisgICAgICAgICAgICBlbHNlIC8qIChyZWZ0eXBlID09IEZSRUUpICovCisgICAgICAgICAgICAgICAgYXJnID0gY29tcGlsZXJfbG9va3VwX2FyZyhjLT51LT51X2ZyZWV2YXJzLCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChhcmcgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgImxvb2t1cCAlcyBpbiAlcyAlZCAlZFxuIgorICAgICAgICAgICAgICAgICAgICAiZnJlZXZhcnMgb2YgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KFB5T2JqZWN0X1JlcHIobmFtZSkpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KGMtPnUtPnVfbmFtZSksCisgICAgICAgICAgICAgICAgICAgIHJlZnR5cGUsIGFyZywKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOChjby0+Y29fbmFtZSksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjgoUHlPYmplY3RfUmVwcihjby0+Y29fZnJlZXZhcnMpKSk7CisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiY29tcGlsZXJfbWFrZV9jbG9zdXJlKCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFERE9QX0koYywgTE9BRF9DTE9TVVJFLCBhcmcpOwogICAgICAgICB9Ci0gICAgICAgIEFERE9QX0koYywgTE9BRF9DTE9TVVJFLCBhcmcpOworICAgICAgICBmbGFncyB8PSAweDA4OworICAgICAgICBBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBmcmVlKTsKICAgICB9Ci0gICAgQURET1BfSShjLCBCVUlMRF9UVVBMRSwgZnJlZSk7CiAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCAoUHlPYmplY3QqKWNvLCBjb25zdHMpOwogICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgcXVhbG5hbWUsIGNvbnN0cyk7Ci0gICAgQURET1BfSShjLCBNQUtFX0NMT1NVUkUsIGFyZ3MpOworICAgIEFERE9QX0koYywgTUFLRV9GVU5DVElPTiwgZmxhZ3MpOwogICAgIHJldHVybiAxOwogfQogCkBAIC0xNDk0LDI2ICsxNjIzLDYwIEBACiBjb21waWxlcl92aXNpdF9rd29ubHlkZWZhdWx0cyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFzZGxfc2VxICprd29ubHlhcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmt3X2RlZmF1bHRzKQogewotICAgIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGRlZmF1bHRzICsgMS4KLSAgICAgICBSZXR1cm5zIDAgb24gZXJyb3IuCi0gICAgICovCi0gICAgaW50IGksIGRlZmF1bHRfY291bnQgPSAwOworICAgIC8qIFB1c2ggYSBkaWN0IG9mIGtleXdvcmQtb25seSBkZWZhdWx0IHZhbHVlcy4KKworICAgICAgIFJldHVybiAwIG9uIGVycm9yLCAtMSBpZiBubyBkaWN0IHB1c2hlZCwgMSBpZiBhIGRpY3QgaXMgcHVzaGVkLgorICAgICAgICovCisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKmtleXMgPSBOVUxMOworCiAgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihrd29ubHlhcmdzKTsgaSsrKSB7CiAgICAgICAgIGFyZ190eSBhcmcgPSBhc2RsX3NlcV9HRVQoa3dvbmx5YXJncywgaSk7CiAgICAgICAgIGV4cHJfdHkgZGVmYXVsdF8gPSBhc2RsX3NlcV9HRVQoa3dfZGVmYXVsdHMsIGkpOwogICAgICAgICBpZiAoZGVmYXVsdF8pIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICptYW5nbGVkID0gX1B5X01hbmdsZShjLT51LT51X3ByaXZhdGUsIGFyZy0+YXJnKTsKLSAgICAgICAgICAgIGlmICghbWFuZ2xlZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgbWFuZ2xlZCwgY29uc3RzKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKLSAgICAgICAgICAgIGlmICghY29tcGlsZXJfdmlzaXRfZXhwcihjLCBkZWZhdWx0XykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICghbWFuZ2xlZCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0X2NvdW50Kys7CisgICAgICAgICAgICBpZiAoa2V5cyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAga2V5cyA9IFB5TGlzdF9OZXcoMSk7CisgICAgICAgICAgICAgICAgaWYgKGtleXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0oa2V5cywgMCwgbWFuZ2xlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVzID0gUHlMaXN0X0FwcGVuZChrZXlzLCBtYW5nbGVkKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY29tcGlsZXJfdmlzaXRfZXhwcihjLCBkZWZhdWx0XykpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBkZWZhdWx0X2NvdW50ICsgMTsKKyAgICBpZiAoa2V5cyAhPSBOVUxMKSB7CisgICAgICAgIFB5X3NzaXplX3QgZGVmYXVsdF9jb3VudCA9IFB5TGlzdF9HRVRfU0laRShrZXlzKTsKKyAgICAgICAgUHlPYmplY3QgKmtleXNfdHVwbGUgPSBQeUxpc3RfQXNUdXBsZShrZXlzKTsKKyAgICAgICAgUHlfREVDUkVGKGtleXMpOworICAgICAgICBpZiAoa2V5c190dXBsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBBRERPUF9OKGMsIExPQURfQ09OU1QsIGtleXNfdHVwbGUsIGNvbnN0cyk7CisgICAgICAgIEFERE9QX0koYywgQlVJTERfQ09OU1RfS0VZX01BUCwgZGVmYXVsdF9jb3VudCk7CisgICAgICAgIGFzc2VydChkZWZhdWx0X2NvdW50ID4gMCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworZXJyb3I6CisgICAgUHlfWERFQ1JFRihrZXlzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludApAQCAtMTU1NiwxMSArMTcxOSwxMCBAQAogY29tcGlsZXJfdmlzaXRfYW5ub3RhdGlvbnMoc3RydWN0IGNvbXBpbGVyICpjLCBhcmd1bWVudHNfdHkgYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgcmV0dXJucykKIHsKLSAgICAvKiBQdXNoIGFyZyBhbm5vdGF0aW9ucyBhbmQgYSBsaXN0IG9mIHRoZSBhcmd1bWVudCBuYW1lcy4gUmV0dXJuIHRoZSAjCi0gICAgICAgb2YgaXRlbXMgcHVzaGVkICsgMS4gVGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgb3V0LW9mLW9yZGVyIHdydCB0aGUKLSAgICAgICBzb3VyY2UgY29kZS4KKyAgICAvKiBQdXNoIGFyZyBhbm5vdGF0aW9uIGRpY3QuCisgICAgICAgVGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgb3V0LW9mLW9yZGVyIHdydCB0aGUgc291cmNlIGNvZGUuCiAKLSAgICAgICBNb3JlIHRoYW4gMl4xNi0xIGFubm90YXRpb25zIGlzIGEgU3ludGF4RXJyb3IuIFJldHVybnMgMCBvbiBlcnJvci4KKyAgICAgICBSZXR1cm4gMCBvbiBlcnJvciwgLTEgaWYgbm8gZGljdCBwdXNoZWQsIDEgaWYgYSBkaWN0IGlzIHB1c2hlZC4KICAgICAgICAqLwogICAgIHN0YXRpYyBpZGVudGlmaWVyIHJldHVybl9zdHI7CiAgICAgUHlPYmplY3QgKm5hbWVzOwpAQCAtMTU5MiwzMiArMTc1NCwyMCBAQAogICAgIH0KIAogICAgIGxlbiA9IFB5TGlzdF9HRVRfU0laRShuYW1lcyk7Ci0gICAgaWYgKGxlbiA+IDY1NTM0KSB7Ci0gICAgICAgIC8qIGxlbiBtdXN0IGZpdCBpbiAxNiBiaXRzLCBhbmQgbGVuIGlzIGluY3JlbWVudGVkIGJlbG93ICovCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBhbm5vdGF0aW9ucyIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KICAgICBpZiAobGVuKSB7Ci0gICAgICAgIC8qIGNvbnZlcnQgbmFtZXMgdG8gYSB0dXBsZSBhbmQgcGxhY2Ugb24gc3RhY2sgKi8KLSAgICAgICAgUHlPYmplY3QgKmVsdDsKLSAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBQeU9iamVjdCAqcyA9IFB5VHVwbGVfTmV3KGxlbik7Ci0gICAgICAgIGlmICghcykKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgZWx0ID0gUHlMaXN0X0dFVF9JVEVNKG5hbWVzLCBpKTsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihlbHQpOwotICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShzLCBpLCBlbHQpOworICAgICAgICBQeU9iamVjdCAqa2V5dHVwbGUgPSBQeUxpc3RfQXNUdXBsZShuYW1lcyk7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7CisgICAgICAgIGlmIChrZXl0dXBsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIHMsIGNvbnN0cyk7Ci0gICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgbGVuKys7IC8qIGluY2x1ZGUgdGhlIGp1c3QtcHVzaGVkIHR1cGxlICovCisgICAgICAgIEFERE9QX04oYywgTE9BRF9DT05TVCwga2V5dHVwbGUsIGNvbnN0cyk7CisgICAgICAgIEFERE9QX0koYywgQlVJTERfQ09OU1RfS0VZX01BUCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIFB5X0RFQ1JFRihuYW1lcyk7Ci0KLSAgICAvKiBXZSBqdXN0IGNoZWNrZWQgdGhhdCBsZW4gPD0gNjU1MzUsIHNlZSBhYm92ZSAqLwotICAgIHJldHVybiBQeV9TQUZFX0RPV05DQVNUKGxlbiArIDEsIFB5X3NzaXplX3QsIGludCk7CisgICAgZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKIGVycm9yOgogICAgIFB5X0RFQ1JFRihuYW1lcyk7CkBAIC0xNjI1LDYgKzE3NzUsMzYgQEAKIH0KIAogc3RhdGljIGludAorY29tcGlsZXJfdmlzaXRfZGVmYXVsdHMoc3RydWN0IGNvbXBpbGVyICpjLCBhcmd1bWVudHNfdHkgYXJncykKK3sKKyAgICBWSVNJVF9TRVEoYywgZXhwciwgYXJncy0+ZGVmYXVsdHMpOworICAgIEFERE9QX0koYywgQlVJTERfVFVQTEUsIGFzZGxfc2VxX0xFTihhcmdzLT5kZWZhdWx0cykpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgUHlfc3NpemVfdAorY29tcGlsZXJfZGVmYXVsdF9hcmd1bWVudHMoc3RydWN0IGNvbXBpbGVyICpjLCBhcmd1bWVudHNfdHkgYXJncykKK3sKKyAgICBQeV9zc2l6ZV90IGZ1bmNmbGFncyA9IDA7CisgICAgaWYgKGFyZ3MtPmRlZmF1bHRzICYmIGFzZGxfc2VxX0xFTihhcmdzLT5kZWZhdWx0cykgPiAwKSB7CisgICAgICAgIGlmICghY29tcGlsZXJfdmlzaXRfZGVmYXVsdHMoYywgYXJncykpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGZ1bmNmbGFncyB8PSAweDAxOworICAgIH0KKyAgICBpZiAoYXJncy0+a3dvbmx5YXJncykgeworICAgICAgICBpbnQgcmVzID0gY29tcGlsZXJfdmlzaXRfa3dvbmx5ZGVmYXVsdHMoYywgYXJncy0+a3dvbmx5YXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MtPmt3X2RlZmF1bHRzKTsKKyAgICAgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocmVzID4gMCkgeworICAgICAgICAgICAgZnVuY2ZsYWdzIHw9IDB4MDI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZ1bmNmbGFnczsKK30KKworc3RhdGljIGludAogY29tcGlsZXJfZnVuY3Rpb24oc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMsIGludCBpc19hc3luYykKIHsKICAgICBQeUNvZGVPYmplY3QgKmNvOwpAQCAtMTYzNSwxMiArMTgxNSwxMSBAQAogICAgIGFzZGxfc2VxKiBkZWNvczsKICAgICBhc2RsX3NlcSAqYm9keTsKICAgICBzdG10X3R5IHN0OwotICAgIFB5X3NzaXplX3QgaSwgbiwgYXJnbGVuZ3RoOwotICAgIGludCBkb2NzdHJpbmcsIGt3X2RlZmF1bHRfY291bnQgPSAwOwotICAgIGludCBudW1fYW5ub3RhdGlvbnM7CisgICAgUHlfc3NpemVfdCBpLCBuLCBmdW5jZmxhZ3M7CisgICAgaW50IGRvY3N0cmluZzsKKyAgICBpbnQgYW5ub3RhdGlvbnM7CiAgICAgaW50IHNjb3BlX3R5cGU7CiAKLQogICAgIGlmIChpc19hc3luYykgewogICAgICAgICBhc3NlcnQocy0+a2luZCA9PSBBc3luY0Z1bmN0aW9uRGVmX2tpbmQpOwogCkBAIC0xNjY1LDMwICsxODQ0LDMyIEBACiAKICAgICBpZiAoIWNvbXBpbGVyX2RlY29yYXRvcnMoYywgZGVjb3MpKQogICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoYXJncy0+ZGVmYXVsdHMpCi0gICAgICAgIFZJU0lUX1NFUShjLCBleHByLCBhcmdzLT5kZWZhdWx0cyk7Ci0gICAgaWYgKGFyZ3MtPmt3b25seWFyZ3MpIHsKLSAgICAgICAgaW50IHJlcyA9IGNvbXBpbGVyX3Zpc2l0X2t3b25seWRlZmF1bHRzKGMsIGFyZ3MtPmt3b25seWFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLT5rd19kZWZhdWx0cyk7Ci0gICAgICAgIGlmIChyZXMgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBrd19kZWZhdWx0X2NvdW50ID0gcmVzIC0gMTsKLSAgICB9Ci0gICAgbnVtX2Fubm90YXRpb25zID0gY29tcGlsZXJfdmlzaXRfYW5ub3RhdGlvbnMoYywgYXJncywgcmV0dXJucyk7Ci0gICAgaWYgKG51bV9hbm5vdGF0aW9ucyA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICBudW1fYW5ub3RhdGlvbnMtLTsKLSAgICBhc3NlcnQoKG51bV9hbm5vdGF0aW9ucyAmIDB4RkZGRikgPT0gbnVtX2Fubm90YXRpb25zKTsKIAotICAgIGlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlX3R5cGUsICh2b2lkICopcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVubykpCisgICAgZnVuY2ZsYWdzID0gY29tcGlsZXJfZGVmYXVsdF9hcmd1bWVudHMoYywgYXJncyk7CisgICAgaWYgKGZ1bmNmbGFncyA9PSAtMSkgewogICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhbm5vdGF0aW9ucyA9IGNvbXBpbGVyX3Zpc2l0X2Fubm90YXRpb25zKGMsIGFyZ3MsIHJldHVybnMpOworICAgIGlmIChhbm5vdGF0aW9ucyA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChhbm5vdGF0aW9ucyA+IDApIHsKKyAgICAgICAgZnVuY2ZsYWdzIHw9IDB4MDQ7CisgICAgfQorCisgICAgaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBuYW1lLCBzY29wZV90eXBlLCAodm9pZCAqKXMsIHMtPmxpbmVubykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAgICAgc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQoYm9keSwgMCk7CiAgICAgZG9jc3RyaW5nID0gY29tcGlsZXJfaXNkb2NzdHJpbmcoc3QpOwotICAgIGlmIChkb2NzdHJpbmcgJiYgYy0+Y19vcHRpbWl6ZSA8IDIpCi0gICAgICAgIGZpcnN0X2NvbnN0ID0gc3QtPnYuRXhwci52YWx1ZS0+di5TdHIuczsKKyAgICBpZiAoZG9jc3RyaW5nICYmIGMtPmNfb3B0aW1pemUgPCAyKSB7CisgICAgICAgIGlmIChzdC0+di5FeHByLnZhbHVlLT5raW5kID09IENvbnN0YW50X2tpbmQpCisgICAgICAgICAgICBmaXJzdF9jb25zdCA9IHN0LT52LkV4cHIudmFsdWUtPnYuQ29uc3RhbnQudmFsdWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpcnN0X2NvbnN0ID0gc3QtPnYuRXhwci52YWx1ZS0+di5TdHIuczsKKyAgICB9CiAgICAgaWYgKGNvbXBpbGVyX2FkZF9vKGMsIGMtPnUtPnVfY29uc3RzLCBmaXJzdF9jb25zdCkgPCAwKSAgICAgIHsKICAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xNzEyLDEyICsxODkzLDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgYXJnbGVuZ3RoID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKTsKLSAgICBhcmdsZW5ndGggfD0ga3dfZGVmYXVsdF9jb3VudCA8PCA4OwotICAgIGFyZ2xlbmd0aCB8PSBudW1fYW5ub3RhdGlvbnMgPDwgMTY7Ci0gICAgaWYgKGlzX2FzeW5jKQotICAgICAgICBjby0+Y29fZmxhZ3MgfD0gQ09fQ09ST1VUSU5FOwotICAgIGNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgYXJnbGVuZ3RoLCBxdWFsbmFtZSk7CisgICAgY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBmdW5jZmxhZ3MsIHF1YWxuYW1lKTsKICAgICBQeV9ERUNSRUYocXVhbG5hbWUpOwogICAgIFB5X0RFQ1JFRihjbyk7CiAKQEAgLTE4NzcsOCArMjA1Myw3IEBACiAgICAgUHlDb2RlT2JqZWN0ICpjbzsKICAgICBQeU9iamVjdCAqcXVhbG5hbWU7CiAgICAgc3RhdGljIGlkZW50aWZpZXIgbmFtZTsKLSAgICBpbnQga3dfZGVmYXVsdF9jb3VudCA9IDA7Ci0gICAgUHlfc3NpemVfdCBhcmdsZW5ndGg7CisgICAgUHlfc3NpemVfdCBmdW5jZmxhZ3M7CiAgICAgYXJndW1lbnRzX3R5IGFyZ3MgPSBlLT52LkxhbWJkYS5hcmdzOwogICAgIGFzc2VydChlLT5raW5kID09IExhbWJkYV9raW5kKTsKIApAQCAtMTg4OCwxNCArMjA2MywxMSBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaWYgKGFyZ3MtPmRlZmF1bHRzKQotICAgICAgICBWSVNJVF9TRVEoYywgZXhwciwgYXJncy0+ZGVmYXVsdHMpOwotICAgIGlmIChhcmdzLT5rd29ubHlhcmdzKSB7Ci0gICAgICAgIGludCByZXMgPSBjb21waWxlcl92aXNpdF9rd29ubHlkZWZhdWx0cyhjLCBhcmdzLT5rd29ubHlhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy0+a3dfZGVmYXVsdHMpOwotICAgICAgICBpZiAocmVzID09IDApIHJldHVybiAwOwotICAgICAgICBrd19kZWZhdWx0X2NvdW50ID0gcmVzIC0gMTsKKyAgICBmdW5jZmxhZ3MgPSBjb21waWxlcl9kZWZhdWx0X2FyZ3VtZW50cyhjLCBhcmdzKTsKKyAgICBpZiAoZnVuY2ZsYWdzID09IC0xKSB7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KKwogICAgIGlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbmFtZSwgQ09NUElMRVJfU0NPUEVfTEFNQkRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKillLCBlLT5saW5lbm8pKQogICAgICAgICByZXR1cm4gMDsKQEAgLTE5MjEsOSArMjA5Myw3IEBACiAgICAgaWYgKGNvID09IE5VTEwpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgYXJnbGVuZ3RoID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKTsKLSAgICBhcmdsZW5ndGggfD0ga3dfZGVmYXVsdF9jb3VudCA8PCA4OwotICAgIGNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgYXJnbGVuZ3RoLCBxdWFsbmFtZSk7CisgICAgY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBmdW5jZmxhZ3MsIHF1YWxuYW1lKTsKICAgICBQeV9ERUNSRUYocXVhbG5hbWUpOwogICAgIFB5X0RFQ1JFRihjbyk7CiAKQEAgLTIwMDIsMTQgKzIxNzIsMTQgQEAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2FzeW5jX2ZvcihzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKLSAgICBzdGF0aWMgUHlPYmplY3QgKnN0b3BpdGVyX2Vycm9yID0gTlVMTDsKKyAgICBfUHlfSURFTlRJRklFUihTdG9wQXN5bmNJdGVyYXRpb24pOworCiAgICAgYmFzaWNibG9jayAqdHJ5LCAqZXhjZXB0LCAqZW5kLCAqYWZ0ZXJfdHJ5LCAqdHJ5X2NsZWFudXAsCiAgICAgICAgICAgICAgICAqYWZ0ZXJfbG9vcCwgKmFmdGVyX2xvb3BfZWxzZTsKIAotICAgIGlmIChzdG9waXRlcl9lcnJvciA9PSBOVUxMKSB7Ci0gICAgICAgIHN0b3BpdGVyX2Vycm9yID0gUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcoIlN0b3BBc3luY0l0ZXJhdGlvbiIpOwotICAgICAgICBpZiAoc3RvcGl0ZXJfZXJyb3IgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAwOworICAgIFB5T2JqZWN0ICpzdG9wX2FpdGVyX2Vycm9yID0gX1B5VW5pY29kZV9Gcm9tSWQoJlB5SWRfU3RvcEFzeW5jSXRlcmF0aW9uKTsKKyAgICBpZiAoc3RvcF9haXRlcl9lcnJvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIHRyeSA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKQEAgLTIwNTEsNyArMjIyMSw3IEBACiAKICAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBleGNlcHQpOwogICAgIEFERE9QKGMsIERVUF9UT1ApOwotICAgIEFERE9QX08oYywgTE9BRF9HTE9CQUwsIHN0b3BpdGVyX2Vycm9yLCBuYW1lcyk7CisgICAgQURET1BfTyhjLCBMT0FEX0dMT0JBTCwgc3RvcF9haXRlcl9lcnJvciwgbmFtZXMpOwogICAgIEFERE9QX0koYywgQ09NUEFSRV9PUCwgUHlDbXBfRVhDX01BVENIKTsKICAgICBBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX0ZBTFNFLCB0cnlfY2xlYW51cCk7CiAKQEAgLTI1OTksNiArMjc2OSwyNSBAQAogfQogCiBzdGF0aWMgaW50Citjb21waWxlcl92aXNpdF9zdG10X2V4cHIoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IHZhbHVlKQoreworICAgIGlmIChjLT5jX2ludGVyYWN0aXZlICYmIGMtPmNfbmVzdGxldmVsIDw9IDEpIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgdmFsdWUpOworICAgICAgICBBRERPUChjLCBQUklOVF9FWFBSKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGlzX2NvbnN0KHZhbHVlKSkgeworICAgICAgICAvKiBpZ25vcmUgY29uc3RhbnQgc3RhdGVtZW50ICovCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIFZJU0lUKGMsIGV4cHIsIHZhbHVlKTsKKyAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAogY29tcGlsZXJfdmlzaXRfc3RtdChzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKICAgICBQeV9zc2l6ZV90IGksIG47CkBAIC0yNjE3LDYgKzI4MDYsOSBAQAogICAgICAgICBpZiAoYy0+dS0+dV9zdGUtPnN0ZV90eXBlICE9IEZ1bmN0aW9uQmxvY2spCiAgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgIidyZXR1cm4nIG91dHNpZGUgZnVuY3Rpb24iKTsKICAgICAgICAgaWYgKHMtPnYuUmV0dXJuLnZhbHVlKSB7CisgICAgICAgICAgICBpZiAoYy0+dS0+dV9zdGUtPnN0ZV9jb3JvdXRpbmUgJiYgYy0+dS0+dV9zdGUtPnN0ZV9nZW5lcmF0b3IpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKAorICAgICAgICAgICAgICAgICAgICBjLCAiJ3JldHVybicgd2l0aCB2YWx1ZSBpbiBhc3luYyBnZW5lcmF0b3IiKTsKICAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuUmV0dXJuLnZhbHVlKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCkBAIC0yNjM4LDYgKzI4MzAsOCBAQAogICAgICAgICBicmVhazsKICAgICBjYXNlIEF1Z0Fzc2lnbl9raW5kOgogICAgICAgICByZXR1cm4gY29tcGlsZXJfYXVnYXNzaWduKGMsIHMpOworICAgIGNhc2UgQW5uQXNzaWduX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9hbm5hc3NpZ24oYywgcyk7CiAgICAgY2FzZSBGb3Jfa2luZDoKICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2ZvcihjLCBzKTsKICAgICBjYXNlIFdoaWxlX2tpbmQ6CkBAIC0yNjY4LDE2ICsyODYyLDcgQEAKICAgICBjYXNlIE5vbmxvY2FsX2tpbmQ6CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRXhwcl9raW5kOgotICAgICAgICBpZiAoYy0+Y19pbnRlcmFjdGl2ZSAmJiBjLT5jX25lc3RsZXZlbCA8PSAxKSB7Ci0gICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkV4cHIudmFsdWUpOwotICAgICAgICAgICAgQURET1AoYywgUFJJTlRfRVhQUik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocy0+di5FeHByLnZhbHVlLT5raW5kICE9IFN0cl9raW5kICYmCi0gICAgICAgICAgICAgICAgIHMtPnYuRXhwci52YWx1ZS0+a2luZCAhPSBOdW1fa2luZCkgewotICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKLSAgICAgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gY29tcGlsZXJfdmlzaXRfc3RtdF9leHByKGMsIHMtPnYuRXhwci52YWx1ZSk7CiAgICAgY2FzZSBQYXNzX2tpbmQ6CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQnJlYWtfa2luZDoKQEAgLTMwNzksOSArMzI2NCw1MyBAQAogfQogCiBzdGF0aWMgaW50CithcmVfYWxsX2l0ZW1zX2NvbnN0KGFzZGxfc2VxICpzZXEsIFB5X3NzaXplX3QgYmVnaW4sIFB5X3NzaXplX3QgZW5kKQoreworICAgIFB5X3NzaXplX3QgaTsKKyAgICBmb3IgKGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgIGV4cHJfdHkga2V5ID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7CisgICAgICAgIGlmIChrZXkgPT0gTlVMTCB8fCAhaXNfY29uc3Qoa2V5KSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY29tcGlsZXJfc3ViZGljdChzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSwgUHlfc3NpemVfdCBiZWdpbiwgUHlfc3NpemVfdCBlbmQpCit7CisgICAgUHlfc3NpemVfdCBpLCBuID0gZW5kIC0gYmVnaW47CisgICAgUHlPYmplY3QgKmtleXMsICprZXk7CisgICAgaWYgKG4gPiAxICYmIGFyZV9hbGxfaXRlbXNfY29uc3QoZS0+di5EaWN0LmtleXMsIGJlZ2luLCBlbmQpKSB7CisgICAgICAgIGZvciAoaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3QudmFsdWVzLCBpKSk7CisgICAgICAgIH0KKyAgICAgICAga2V5cyA9IFB5VHVwbGVfTmV3KG4pOworICAgICAgICBpZiAoa2V5cyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBrZXkgPSBnZXRfY29uc3RfdmFsdWUoKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC5rZXlzLCBpKSk7CisgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oa2V5cywgaSAtIGJlZ2luLCBrZXkpOworICAgICAgICB9CisgICAgICAgIEFERE9QX04oYywgTE9BRF9DT05TVCwga2V5cywgY29uc3RzKTsKKyAgICAgICAgQURET1BfSShjLCBCVUlMRF9DT05TVF9LRVlfTUFQLCBuKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3Qua2V5cywgaSkpOworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC52YWx1ZXMsIGkpKTsKKyAgICAgICAgfQorICAgICAgICBBRERPUF9JKGMsIEJVSUxEX01BUCwgbik7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CiBjb21waWxlcl9kaWN0KHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotICAgIFB5X3NzaXplX3QgaSwgbiwgY29udGFpbmVycywgZWxlbWVudHM7CisgICAgUHlfc3NpemVfdCBpLCBuLCBlbGVtZW50czsKKyAgICBpbnQgY29udGFpbmVyczsKICAgICBpbnQgaXNfdW5wYWNraW5nID0gMDsKICAgICBuID0gYXNkbF9zZXFfTEVOKGUtPnYuRGljdC52YWx1ZXMpOwogICAgIGNvbnRhaW5lcnMgPSAwOwpAQCAtMzA4OSw3ICszMzE4LDggQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgIGlzX3VucGFja2luZyA9IChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3Qua2V5cywgaSkgPT0gTlVMTDsKICAgICAgICAgaWYgKGVsZW1lbnRzID09IDB4RkZGRiB8fCAoZWxlbWVudHMgJiYgaXNfdW5wYWNraW5nKSkgewotICAgICAgICAgICAgQURET1BfSShjLCBCVUlMRF9NQVAsIGVsZW1lbnRzKTsKKyAgICAgICAgICAgIGlmICghY29tcGlsZXJfc3ViZGljdChjLCBlLCBpIC0gZWxlbWVudHMsIGkpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgY29udGFpbmVycysrOwogICAgICAgICAgICAgZWxlbWVudHMgPSAwOwogICAgICAgICB9CkBAIC0zMDk4LDEzICszMzI4LDEyIEBACiAgICAgICAgICAgICBjb250YWluZXJzKys7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5EaWN0LmtleXMsIGkpKTsKLSAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3QudmFsdWVzLCBpKSk7CiAgICAgICAgICAgICBlbGVtZW50cysrOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChlbGVtZW50cyB8fCBjb250YWluZXJzID09IDApIHsKLSAgICAgICAgQURET1BfSShjLCBCVUlMRF9NQVAsIGVsZW1lbnRzKTsKKyAgICAgICAgaWYgKCFjb21waWxlcl9zdWJkaWN0KGMsIGUsIG4gLSBlbGVtZW50cywgbikpCisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgY29udGFpbmVycysrOwogICAgIH0KICAgICAvKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGRpY3QsIHRoZXkgbmVlZCB0byBiZSBtZXJnZWQgaW50byBhIG5ldwpAQCAtMzE3MywyOCArMzQwMiwxMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5DYWxsLmtleXdvcmRzKTsKIH0KIAorc3RhdGljIGludAorY29tcGlsZXJfam9pbmVkX3N0cihzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKK3sKKyAgICBWSVNJVF9TRVEoYywgZXhwciwgZS0+di5Kb2luZWRTdHIudmFsdWVzKTsKKyAgICBBRERPUF9JKGMsIEJVSUxEX1NUUklORywgYXNkbF9zZXFfTEVOKGUtPnYuSm9pbmVkU3RyLnZhbHVlcykpOworICAgIHJldHVybiAxOworfQorCisvKiBVc2VkIHRvIGltcGxlbWVudCBmLXN0cmluZ3MuIEZvcm1hdCBhIHNpbmdsZSB2YWx1ZS4gKi8KK3N0YXRpYyBpbnQKK2NvbXBpbGVyX2Zvcm1hdHRlZF92YWx1ZShzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKK3sKKyAgICAvKiBPdXIgb3BhcmcgZW5jb2RlcyAyIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjogdGhlIGNvbnZlcnNpb24KKyAgICAgICBjaGFyYWN0ZXIsIGFuZCB3aGV0aGVyIG9yIG5vdCBhIGZvcm1hdF9zcGVjIHdhcyBwcm92aWRlZC4KKworICAgICAgIENvbnZlcnQgdGhlIGNvbnZlcnNpb24gY2hhciB0byAyIGJpdHM6CisgICAgICAgTm9uZTogMDAwICAweDAgIEZWQ19OT05FCisgICAgICAgIXMgIDogMDAxICAweDEgIEZWQ19TVFIKKyAgICAgICAhciAgOiAwMTAgIDB4MiAgRlZDX1JFUFIKKyAgICAgICAhYSAgOiAwMTEgIDB4MyAgRlZDX0FTQ0lJCisKKyAgICAgICBuZXh0IGJpdCBpcyB3aGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGEgZm9ybWF0IHNwZWM6CisgICAgICAgeWVzIDogMTAwICAweDQKKyAgICAgICBubyAgOiAwMDAgIDB4MAorICAgICovCisKKyAgICBpbnQgb3Bhcmc7CisKKyAgICAvKiBFdmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiB0byBiZSBmb3JtYXR0ZWQuICovCisgICAgVklTSVQoYywgZXhwciwgZS0+di5Gb3JtYXR0ZWRWYWx1ZS52YWx1ZSk7CisKKyAgICBzd2l0Y2ggKGUtPnYuRm9ybWF0dGVkVmFsdWUuY29udmVyc2lvbikgeworICAgIGNhc2UgJ3MnOiBvcGFyZyA9IEZWQ19TVFI7ICAgYnJlYWs7CisgICAgY2FzZSAncic6IG9wYXJnID0gRlZDX1JFUFI7ICBicmVhazsKKyAgICBjYXNlICdhJzogb3BhcmcgPSBGVkNfQVNDSUk7IGJyZWFrOworICAgIGNhc2UgLTE6ICBvcGFyZyA9IEZWQ19OT05FOyAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBjb252ZXJzaW9uIGNoYXJhY3RlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGUtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpIHsKKyAgICAgICAgLyogRXZhbHVhdGUgdGhlIGZvcm1hdCBzcGVjLCBhbmQgdXBkYXRlIG91ciBvcGNvZGUgYXJnLiAqLworICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LkZvcm1hdHRlZFZhbHVlLmZvcm1hdF9zcGVjKTsKKyAgICAgICAgb3BhcmcgfD0gRlZTX0hBVkVfU1BFQzsKKyAgICB9CisKKyAgICAvKiBBbmQgcHVzaCBvdXIgb3Bjb2RlIGFuZCBvcGFyZyAqLworICAgIEFERE9QX0koYywgRk9STUFUX1ZBTFVFLCBvcGFyZyk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2NvbXBpbGVyX3N1Ymt3YXJncyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFzZGxfc2VxICprZXl3b3JkcywgUHlfc3NpemVfdCBiZWdpbiwgUHlfc3NpemVfdCBlbmQpCit7CisgICAgUHlfc3NpemVfdCBpLCBuID0gZW5kIC0gYmVnaW47CisgICAga2V5d29yZF90eSBrdzsKKyAgICBQeU9iamVjdCAqa2V5cywgKmtleTsKKyAgICBhc3NlcnQobiA+IDApOworICAgIGlmIChuID4gMSkgeworICAgICAgICBmb3IgKGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBrdyA9IGFzZGxfc2VxX0dFVChrZXl3b3JkcywgaSk7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBrdy0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIGtleXMgPSBQeVR1cGxlX05ldyhuKTsKKyAgICAgICAgaWYgKGtleXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAga2V5ID0gKChrZXl3b3JkX3R5KSBhc2RsX3NlcV9HRVQoa2V5d29yZHMsIGkpKS0+YXJnOworICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGtleXMsIGkgLSBiZWdpbiwga2V5KTsKKyAgICAgICAgfQorICAgICAgICBBRERPUF9OKGMsIExPQURfQ09OU1QsIGtleXMsIGNvbnN0cyk7CisgICAgICAgIEFERE9QX0koYywgQlVJTERfQ09OU1RfS0VZX01BUCwgbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBhIGZvciBsb29wIG9ubHkgZXhlY3V0ZXMgb25jZSAqLworICAgICAgICBmb3IgKGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBrdyA9IGFzZGxfc2VxX0dFVChrZXl3b3JkcywgaSk7CisgICAgICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGt3LT5hcmcsIGNvbnN0cyk7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBrdy0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIEFERE9QX0koYywgQlVJTERfTUFQLCBuKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKIC8qIHNoYXJlZCBjb2RlIGJldHdlZW4gY29tcGlsZXJfY2FsbCBhbmQgY29tcGlsZXJfY2xhc3MgKi8KIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2NhbGxfaGVscGVyKHN0cnVjdCBjb21waWxlciAqYywKLSAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbiwgLyogQXJncyBhbHJlYWR5IHB1c2hlZCAqLworICAgICAgICAgICAgICAgICAgICAgaW50IG4sIC8qIEFyZ3MgYWxyZWFkeSBwdXNoZWQgKi8KICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICphcmdzLAogICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmtleXdvcmRzKQogewotICAgIGludCBjb2RlID0gMDsKLSAgICBQeV9zc2l6ZV90IG5lbHRzLCBpLCBuc2Vlbiwgbmt3OworICAgIFB5X3NzaXplX3QgaSwgbnNlZW4sIG5lbHRzLCBua3dlbHRzOworICAgIGludCBtdXN0dHVwbGV1bnBhY2sgPSAwLCBtdXN0ZGljdHVucGFjayA9IDA7CiAKICAgICAvKiB0aGUgbnVtYmVyIG9mIHR1cGxlcyBhbmQgZGljdGlvbmFyaWVzIG9uIHRoZSBzdGFjayAqLwogICAgIFB5X3NzaXplX3QgbnN1YmFyZ3MgPSAwLCBuc3Via3dhcmdzID0gMDsKIAotICAgIG5rdyA9IDA7Ci0gICAgbnNlZW4gPSAwOyAgLyogdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sgKi8KICAgICBuZWx0cyA9IGFzZGxfc2VxX0xFTihhcmdzKTsKKyAgICBua3dlbHRzID0gYXNkbF9zZXFfTEVOKGtleXdvcmRzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBua3dlbHRzOyBpKyspIHsKKyAgICAgICAga2V5d29yZF90eSBrdyA9IGFzZGxfc2VxX0dFVChrZXl3b3JkcywgaSk7CisgICAgICAgIGlmIChrdy0+YXJnID09IE5VTEwpIHsKKyAgICAgICAgICAgIG11c3RkaWN0dW5wYWNrID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgbnNlZW4gPSBuOyAgLyogdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgbmVsdHM7IGkrKykgewogICAgICAgICBleHByX3R5IGVsdCA9IGFzZGxfc2VxX0dFVChhcmdzLCBpKTsKICAgICAgICAgaWYgKGVsdC0+a2luZCA9PSBTdGFycmVkX2tpbmQpIHsKICAgICAgICAgICAgIC8qIEEgc3Rhci1hcmcuIElmIHdlJ3ZlIHNlZW4gcG9zaXRpb25hbCBhcmd1bWVudHMsCi0gICAgICAgICAgICAgICBwYWNrIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBpbnRvIGEKLSAgICAgICAgICAgICAgIHR1cGxlLiAqLworICAgICAgICAgICAgICAgcGFjayB0aGUgcG9zaXRpb25hbCBhcmd1bWVudHMgaW50byBhIHR1cGxlLiAqLwogICAgICAgICAgICAgaWYgKG5zZWVuKSB7CiAgICAgICAgICAgICAgICAgQURET1BfSShjLCBCVUlMRF9UVVBMRSwgbnNlZW4pOwogICAgICAgICAgICAgICAgIG5zZWVuID0gMDsKQEAgLTMyMDIsOTMgKzM1MjcsODAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGVsdC0+di5TdGFycmVkLnZhbHVlKTsKICAgICAgICAgICAgIG5zdWJhcmdzKys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobnN1YmFyZ3MpIHsKLSAgICAgICAgICAgIC8qIFdlJ3ZlIHNlZW4gc3Rhci1hcmdzIGFscmVhZHksIHNvIHdlCi0gICAgICAgICAgICAgICBjb3VudCB0b3dhcmRzIGl0ZW1zLXRvLXBhY2staW50by10dXBsZS4gKi8KLSAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGVsdCk7Ci0gICAgICAgICAgICBuc2VlbisrOworICAgICAgICAgICAgbXVzdHR1cGxldW5wYWNrID0gMTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIFBvc2l0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBzdGFyLWFyZ3VtZW50cwotICAgICAgICAgICAgICAgYXJlIGxlZnQgb24gdGhlIHN0YWNrLiAqLwogICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZWx0KTsKLSAgICAgICAgICAgIG4rKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobnNlZW4pIHsKLSAgICAgICAgLyogUGFjayB1cCBhbnkgdHJhaWxpbmcgcG9zaXRpb25hbCBhcmd1bWVudHMuICovCi0gICAgICAgIEFERE9QX0koYywgQlVJTERfVFVQTEUsIG5zZWVuKTsKLSAgICAgICAgbnN1YmFyZ3MrKzsKLSAgICB9Ci0gICAgaWYgKG5zdWJhcmdzKSB7Ci0gICAgICAgIGNvZGUgfD0gMTsKLSAgICAgICAgaWYgKG5zdWJhcmdzID4gMSkgewotICAgICAgICAgICAgLyogSWYgd2UgZW5kZWQgdXAgd2l0aCBtb3JlIHRoYW4gb25lIHN0YXJhcmcsIHdlIG5lZWQKLSAgICAgICAgICAgICAgIHRvIGNvbmNhdGVuYXRlIHRoZW0gaW50byBhIHNpbmdsZSBzZXF1ZW5jZS4gKi8KLSAgICAgICAgICAgIEFERE9QX0koYywgQlVJTERfTElTVF9VTlBBQ0ssIG5zdWJhcmdzKTsKKyAgICAgICAgICAgIG5zZWVuKys7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBTYW1lIGRhbmNlIGFnYWluIGZvciBrZXl3b3JkIGFyZ3VtZW50cyAqLwotICAgIG5zZWVuID0gMDsgIC8qIHRoZSBudW1iZXIgb2Yga2V5d29yZCBhcmd1bWVudHMgb24gdGhlIHN0YWNrIGZvbGxvd2luZyAqLwotICAgIG5lbHRzID0gYXNkbF9zZXFfTEVOKGtleXdvcmRzKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmVsdHM7IGkrKykgewotICAgICAgICBrZXl3b3JkX3R5IGt3ID0gYXNkbF9zZXFfR0VUKGtleXdvcmRzLCBpKTsKLSAgICAgICAgaWYgKGt3LT5hcmcgPT0gTlVMTCkgewotICAgICAgICAgICAgLyogQSBrZXl3b3JkIGFyZ3VtZW50IHVucGFja2luZy4gKi8KLSAgICAgICAgICAgIGlmIChuc2VlbikgewotICAgICAgICAgICAgICAgIEFERE9QX0koYywgQlVJTERfTUFQLCBuc2Vlbik7Ci0gICAgICAgICAgICAgICAgbnNlZW4gPSAwOworICAgIGlmIChtdXN0dHVwbGV1bnBhY2sgfHwgbXVzdGRpY3R1bnBhY2spIHsKKyAgICAgICAgaWYgKG5zZWVuKSB7CisgICAgICAgICAgICAvKiBQYWNrIHVwIGFueSB0cmFpbGluZyBwb3NpdGlvbmFsIGFyZ3VtZW50cy4gKi8KKyAgICAgICAgICAgIEFERE9QX0koYywgQlVJTERfVFVQTEUsIG5zZWVuKTsKKyAgICAgICAgICAgIG5zdWJhcmdzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG11c3R0dXBsZXVucGFjayB8fCBuc3ViYXJncyA+IDEpIHsKKyAgICAgICAgICAgIC8qIElmIHdlIGVuZGVkIHVwIHdpdGggbW9yZSB0aGFuIG9uZSBzdGFyYXJnLCB3ZSBuZWVkCisgICAgICAgICAgICAgICB0byBjb25jYXRlbmF0ZSB0aGVtIGludG8gYSBzaW5nbGUgc2VxdWVuY2UuICovCisgICAgICAgICAgICBBRERPUF9JKGMsIEJVSUxEX1RVUExFX1VOUEFDSywgbnN1YmFyZ3MpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5zdWJhcmdzID09IDApIHsKKyAgICAgICAgICAgIEFERE9QX0koYywgQlVJTERfVFVQTEUsIDApOworICAgICAgICB9CisgICAgICAgIG5zZWVuID0gMDsgIC8qIHRoZSBudW1iZXIgb2Yga2V5d29yZCBhcmd1bWVudHMgb24gdGhlIHN0YWNrIGZvbGxvd2luZyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmt3ZWx0czsgaSsrKSB7CisgICAgICAgICAgICBrZXl3b3JkX3R5IGt3ID0gYXNkbF9zZXFfR0VUKGtleXdvcmRzLCBpKTsKKyAgICAgICAgICAgIGlmIChrdy0+YXJnID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBBIGtleXdvcmQgYXJndW1lbnQgdW5wYWNraW5nLiAqLworICAgICAgICAgICAgICAgIGlmIChuc2VlbikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBpbGVyX3N1Ymt3YXJncyhjLCBrZXl3b3JkcywgaSAtIG5zZWVuLCBpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICBuc3Via3dhcmdzKys7CisgICAgICAgICAgICAgICAgICAgIG5zZWVuID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVklTSVQoYywgZXhwciwga3ctPnZhbHVlKTsKICAgICAgICAgICAgICAgICBuc3Via3dhcmdzKys7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBWSVNJVChjLCBleHByLCBrdy0+dmFsdWUpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbnNlZW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobnNlZW4pIHsKKyAgICAgICAgICAgIC8qIFBhY2sgdXAgYW55IHRyYWlsaW5nIGtleXdvcmQgYXJndW1lbnRzLiAqLworICAgICAgICAgICAgaWYgKCFjb21waWxlcl9zdWJrd2FyZ3MoYywga2V5d29yZHMsIG5rd2VsdHMgLSBuc2Vlbiwgbmt3ZWx0cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICBuc3Via3dhcmdzKys7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobnN1Ymt3YXJncykgewotICAgICAgICAgICAgLyogQSBrZXl3b3JkIGFyZ3VtZW50IGFuZCB3ZSBhbHJlYWR5IGhhdmUgYSBkaWN0LiAqLwotICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBrdy0+YXJnLCBjb25zdHMpOwotICAgICAgICAgICAgVklTSVQoYywgZXhwciwga3ctPnZhbHVlKTsKLSAgICAgICAgICAgIG5zZWVuKys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBrZXl3b3JkIGFyZ3VtZW50ICovCi0gICAgICAgICAgICBWSVNJVChjLCBrZXl3b3JkLCBrdykKLSAgICAgICAgICAgIG5rdysrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChuc2VlbikgewotICAgICAgICAvKiBQYWNrIHVwIGFueSB0cmFpbGluZyBrZXl3b3JkIGFyZ3VtZW50cy4gKi8KLSAgICAgICAgQURET1BfSShjLCBCVUlMRF9NQVAsIG5zZWVuKTsKLSAgICAgICAgbnN1Ymt3YXJncysrOwotICAgIH0KLSAgICBpZiAobnN1Ymt3YXJncykgewotICAgICAgICBjb2RlIHw9IDI7Ci0gICAgICAgIGlmIChuc3Via3dhcmdzID4gMSkgeworICAgICAgICBpZiAobXVzdGRpY3R1bnBhY2sgfHwgbnN1Ymt3YXJncyA+IDEpIHsKICAgICAgICAgICAgIC8qIFBhY2sgaXQgYWxsIHVwICovCi0gICAgICAgICAgICBpbnQgZnVuY3Rpb25fcG9zID0gbiArIChjb2RlICYgMSkgKyAyICogbmt3ICsgMTsKLSAgICAgICAgICAgIEFERE9QX0koYywgQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEwsIG5zdWJrd2FyZ3MgfCAoZnVuY3Rpb25fcG9zIDw8IDgpKTsKKyAgICAgICAgICAgIEFERE9QX0koYywgQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEwsIG5zdWJrd2FyZ3MpOwogICAgICAgICB9CisgICAgICAgIEFERE9QX0koYywgQ0FMTF9GVU5DVElPTl9FWCwgbnN1Ymt3YXJncyA+IDApOworICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgYXNzZXJ0KG4gPCAxPDw4KTsKLSAgICBhc3NlcnQobmt3IDwgMTw8MjQpOwotICAgIG4gfD0gbmt3IDw8IDg7Ci0KLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIEFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OX1ZBUiwgbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OX0tXLCBuKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT05fVkFSX0tXLCBuKTsKLSAgICAgICAgYnJlYWs7CisgICAgZWxzZSBpZiAobmt3ZWx0cykgeworICAgICAgICBQeU9iamVjdCAqbmFtZXM7CisgICAgICAgIFZJU0lUX1NFUShjLCBrZXl3b3JkLCBrZXl3b3Jkcyk7CisgICAgICAgIG5hbWVzID0gUHlUdXBsZV9OZXcobmt3ZWx0cyk7CisgICAgICAgIGlmIChuYW1lcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmt3ZWx0czsgaSsrKSB7CisgICAgICAgICAgICBrZXl3b3JkX3R5IGt3ID0gYXNkbF9zZXFfR0VUKGtleXdvcmRzLCBpKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihrdy0+YXJnKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmFtZXMsIGksIGt3LT5hcmcpOworICAgICAgICB9CisgICAgICAgIEFERE9QX04oYywgTE9BRF9DT05TVCwgbmFtZXMsIGNvbnN0cyk7CisgICAgICAgIEFERE9QX0koYywgQ0FMTF9GVU5DVElPTl9LVywgbiArIG5lbHRzICsgbmt3ZWx0cyk7CisgICAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICByZXR1cm4gMTsKKyAgICBlbHNlIHsKKyAgICAgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCBuICsgbmVsdHMpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiB9CiAKIApAQCAtMzMwNywxMSArMzYxOSwyOCBAQAogICAgIC0gaXRlcmF0ZSBvdmVyIHRoZSBnZW5lcmF0b3Igc2VxdWVuY2UgaW5zdGVhZCBvZiB1c2luZyByZWN1cnNpb24KICovCiAKKwogc3RhdGljIGludAogY29tcGlsZXJfY29tcHJlaGVuc2lvbl9nZW5lcmF0b3Ioc3RydWN0IGNvbXBpbGVyICpjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmdlbmVyYXRvcnMsIGludCBnZW5faW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGVsdCwgZXhwcl90eSB2YWwsIGludCB0eXBlKQogeworICAgIGNvbXByZWhlbnNpb25fdHkgZ2VuOworICAgIGdlbiA9IChjb21wcmVoZW5zaW9uX3R5KWFzZGxfc2VxX0dFVChnZW5lcmF0b3JzLCBnZW5faW5kZXgpOworICAgIGlmIChnZW4tPmlzX2FzeW5jKSB7CisgICAgICAgIHJldHVybiBjb21waWxlcl9hc3luY19jb21wcmVoZW5zaW9uX2dlbmVyYXRvcigKKyAgICAgICAgICAgIGMsIGdlbmVyYXRvcnMsIGdlbl9pbmRleCwgZWx0LCB2YWwsIHR5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBjb21waWxlcl9zeW5jX2NvbXByZWhlbnNpb25fZ2VuZXJhdG9yKAorICAgICAgICAgICAgYywgZ2VuZXJhdG9ycywgZ2VuX2luZGV4LCBlbHQsIHZhbCwgdHlwZSk7CisgICAgfQorfQorCitzdGF0aWMgaW50Citjb21waWxlcl9zeW5jX2NvbXByZWhlbnNpb25fZ2VuZXJhdG9yKHN0cnVjdCBjb21waWxlciAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmdlbmVyYXRvcnMsIGludCBnZW5faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgZWx0LCBleHByX3R5IHZhbCwgaW50IHR5cGUpCit7CiAgICAgLyogZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGl0ZXJhdG9yLCB0aGVuIGVhY2ggb2YgdGhlIGlmcywKICAgICAgICBhbmQgdGhlbiB3cml0ZSB0byB0aGUgZWxlbWVudCAqLwogCkBAIC0zMzk4LDIwICszNzI3LDE2NyBAQAogfQogCiBzdGF0aWMgaW50Citjb21waWxlcl9hc3luY19jb21wcmVoZW5zaW9uX2dlbmVyYXRvcihzdHJ1Y3QgY29tcGlsZXIgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpnZW5lcmF0b3JzLCBpbnQgZ2VuX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGVsdCwgZXhwcl90eSB2YWwsIGludCB0eXBlKQoreworICAgIF9QeV9JREVOVElGSUVSKFN0b3BBc3luY0l0ZXJhdGlvbik7CisKKyAgICBjb21wcmVoZW5zaW9uX3R5IGdlbjsKKyAgICBiYXNpY2Jsb2NrICphbmNob3IsICpza2lwLCAqaWZfY2xlYW51cCwgKnRyeSwKKyAgICAgICAgICAgICAgICphZnRlcl90cnksICpleGNlcHQsICp0cnlfY2xlYW51cDsKKyAgICBQeV9zc2l6ZV90IGksIG47CisKKyAgICBQeU9iamVjdCAqc3RvcF9haXRlcl9lcnJvciA9IF9QeVVuaWNvZGVfRnJvbUlkKCZQeUlkX1N0b3BBc3luY0l0ZXJhdGlvbik7CisgICAgaWYgKHN0b3BfYWl0ZXJfZXJyb3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB0cnkgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgYWZ0ZXJfdHJ5ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIHRyeV9jbGVhbnVwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGV4Y2VwdCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBza2lwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmX2NsZWFudXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgYW5jaG9yID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworCisgICAgaWYgKHNraXAgPT0gTlVMTCB8fCBpZl9jbGVhbnVwID09IE5VTEwgfHwgYW5jaG9yID09IE5VTEwgfHwKKyAgICAgICAgICAgIHRyeSA9PSBOVUxMIHx8IGFmdGVyX3RyeSA9PSBOVUxMIHx8CisgICAgICAgICAgICBleGNlcHQgPT0gTlVMTCB8fCBhZnRlcl90cnkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBnZW4gPSAoY29tcHJlaGVuc2lvbl90eSlhc2RsX3NlcV9HRVQoZ2VuZXJhdG9ycywgZ2VuX2luZGV4KTsKKworICAgIGlmIChnZW5faW5kZXggPT0gMCkgeworICAgICAgICAvKiBSZWNlaXZlIG91dGVybW9zdCBpdGVyIGFzIGFuIGltcGxpY2l0IGFyZ3VtZW50ICovCisgICAgICAgIGMtPnUtPnVfYXJnY291bnQgPSAxOworICAgICAgICBBRERPUF9JKGMsIExPQURfRkFTVCwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBTdWItaXRlciAtIGNhbGN1bGF0ZSBvbiB0aGUgZmx5ICovCisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGdlbi0+aXRlcik7CisgICAgICAgIEFERE9QKGMsIEdFVF9BSVRFUik7CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKKyAgICAgICAgQURET1AoYywgWUlFTERfRlJPTSk7CisgICAgfQorCisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgdHJ5KTsKKworCisgICAgQURET1BfSlJFTChjLCBTRVRVUF9FWENFUFQsIGV4Y2VwdCk7CisgICAgaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBFWENFUFQsIHRyeSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgQURET1AoYywgR0VUX0FORVhUKTsKKyAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7CisgICAgQURET1AoYywgWUlFTERfRlJPTSk7CisgICAgVklTSVQoYywgZXhwciwgZ2VuLT50YXJnZXQpOworICAgIEFERE9QKGMsIFBPUF9CTE9DSyk7CisgICAgY29tcGlsZXJfcG9wX2ZibG9jayhjLCBFWENFUFQsIHRyeSk7CisgICAgQURET1BfSlJFTChjLCBKVU1QX0ZPUldBUkQsIGFmdGVyX3RyeSk7CisKKworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGV4Y2VwdCk7CisgICAgQURET1AoYywgRFVQX1RPUCk7CisgICAgQURET1BfTyhjLCBMT0FEX0dMT0JBTCwgc3RvcF9haXRlcl9lcnJvciwgbmFtZXMpOworICAgIEFERE9QX0koYywgQ09NUEFSRV9PUCwgUHlDbXBfRVhDX01BVENIKTsKKyAgICBBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX0ZBTFNFLCB0cnlfY2xlYW51cCk7CisKKyAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICBBRERPUChjLCBQT1BfRVhDRVBUKTsgLyogZm9yIFNFVFVQX0VYQ0VQVCAqLworICAgIEFERE9QX0pBQlMoYywgSlVNUF9BQlNPTFVURSwgYW5jaG9yKTsKKworCisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgdHJ5X2NsZWFudXApOworICAgIEFERE9QKGMsIEVORF9GSU5BTExZKTsKKworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGFmdGVyX3RyeSk7CisKKyAgICBuID0gYXNkbF9zZXFfTEVOKGdlbi0+aWZzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGV4cHJfdHkgZSA9IChleHByX3R5KWFzZGxfc2VxX0dFVChnZW4tPmlmcywgaSk7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUpOworICAgICAgICBBRERPUF9KQUJTKGMsIFBPUF9KVU1QX0lGX0ZBTFNFLCBpZl9jbGVhbnVwKTsKKyAgICAgICAgTkVYVF9CTE9DSyhjKTsKKyAgICB9CisKKyAgICBpZiAoKytnZW5faW5kZXggPCBhc2RsX3NlcV9MRU4oZ2VuZXJhdG9ycykpCisgICAgICAgIGlmICghY29tcGlsZXJfY29tcHJlaGVuc2lvbl9nZW5lcmF0b3IoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3JzLCBnZW5faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWx0LCB2YWwsIHR5cGUpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIG9ubHkgYXBwZW5kIGFmdGVyIHRoZSBsYXN0IGZvciBnZW5lcmF0b3IgKi8KKyAgICBpZiAoZ2VuX2luZGV4ID49IGFzZGxfc2VxX0xFTihnZW5lcmF0b3JzKSkgeworICAgICAgICAvKiBjb21wcmVoZW5zaW9uIHNwZWNpZmljIGNvZGUgKi8KKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgQ09NUF9HRU5FWFA6CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBlbHQpOworICAgICAgICAgICAgQURET1AoYywgWUlFTERfVkFMVUUpOworICAgICAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT01QX0xJU1RDT01QOgorICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZWx0KTsKKyAgICAgICAgICAgIEFERE9QX0koYywgTElTVF9BUFBFTkQsIGdlbl9pbmRleCArIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ09NUF9TRVRDT01QOgorICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZWx0KTsKKyAgICAgICAgICAgIEFERE9QX0koYywgU0VUX0FERCwgZ2VuX2luZGV4ICsgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT01QX0RJQ1RDT01QOgorICAgICAgICAgICAgLyogV2l0aCAnZFtrXSA9IHYnLCB2IGlzIGV2YWx1YXRlZCBiZWZvcmUgaywgc28gd2UgZG8KKyAgICAgICAgICAgICAgIHRoZSBzYW1lLiAqLworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgdmFsKTsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGVsdCk7CisgICAgICAgICAgICBBRERPUF9JKGMsIE1BUF9BREQsIGdlbl9pbmRleCArIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIHNraXApOworICAgIH0KKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBpZl9jbGVhbnVwKTsKKyAgICBBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIHRyeSk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgYW5jaG9yKTsKKyAgICBBRERPUChjLCBQT1BfVE9QKTsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CiBjb21waWxlcl9jb21wcmVoZW5zaW9uKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlLCBpbnQgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBuYW1lLCBhc2RsX3NlcSAqZ2VuZXJhdG9ycywgZXhwcl90eSBlbHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsKQogewogICAgIFB5Q29kZU9iamVjdCAqY28gPSBOVUxMOwotICAgIGV4cHJfdHkgb3V0ZXJtb3N0X2l0ZXI7CisgICAgY29tcHJlaGVuc2lvbl90eSBvdXRlcm1vc3Q7CiAgICAgUHlPYmplY3QgKnF1YWxuYW1lID0gTlVMTDsKKyAgICBpbnQgaXNfYXN5bmNfZnVuY3Rpb24gPSBjLT51LT51X3N0ZS0+c3RlX2Nvcm91dGluZTsKKyAgICBpbnQgaXNfYXN5bmNfZ2VuZXJhdG9yID0gMDsKIAotICAgIG91dGVybW9zdF9pdGVyID0gKChjb21wcmVoZW5zaW9uX3R5KQotICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxX0dFVChnZW5lcmF0b3JzLCAwKSktPml0ZXI7CisgICAgb3V0ZXJtb3N0ID0gKGNvbXByZWhlbnNpb25fdHkpIGFzZGxfc2VxX0dFVChnZW5lcmF0b3JzLCAwKTsKIAogICAgIGlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbmFtZSwgQ09NUElMRVJfU0NPUEVfQ09NUFJFSEVOU0lPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopZSwgZS0+bGluZW5vKSkKKyAgICB7CiAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaXNfYXN5bmNfZ2VuZXJhdG9yID0gYy0+dS0+dV9zdGUtPnN0ZV9jb3JvdXRpbmU7CisKKyAgICBpZiAoaXNfYXN5bmNfZ2VuZXJhdG9yICYmICFpc19hc3luY19mdW5jdGlvbikgeworICAgICAgICBpZiAoZS0+bGluZW5vID4gYy0+dS0+dV9saW5lbm8pIHsKKyAgICAgICAgICAgIGMtPnUtPnVfbGluZW5vID0gZS0+bGluZW5vOworICAgICAgICAgICAgYy0+dS0+dV9saW5lbm9fc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBjb21waWxlcl9lcnJvcihjLCAiYXN5bmNocm9ub3VzIGNvbXByZWhlbnNpb24gb3V0c2lkZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24iKTsKKyAgICAgICAgZ290byBlcnJvcl9pbl9zY29wZTsKKyAgICB9CiAKICAgICBpZiAodHlwZSAhPSBDT01QX0dFTkVYUCkgewogICAgICAgICBpbnQgb3A7CkBAIC0zNDU0LDkgKzM5MzAsMjQgQEAKICAgICBQeV9ERUNSRUYocXVhbG5hbWUpOwogICAgIFB5X0RFQ1JFRihjbyk7CiAKLSAgICBWSVNJVChjLCBleHByLCBvdXRlcm1vc3RfaXRlcik7Ci0gICAgQURET1AoYywgR0VUX0lURVIpOworICAgIFZJU0lUKGMsIGV4cHIsIG91dGVybW9zdC0+aXRlcik7CisKKyAgICBpZiAob3V0ZXJtb3N0LT5pc19hc3luYykgeworICAgICAgICBBRERPUChjLCBHRVRfQUlURVIpOworICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7CisgICAgICAgIEFERE9QKGMsIFlJRUxEX0ZST00pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFERE9QKGMsIEdFVF9JVEVSKTsKKyAgICB9CisKICAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDEpOworCisgICAgaWYgKGlzX2FzeW5jX2dlbmVyYXRvciAmJiB0eXBlICE9IENPTVBfR0VORVhQKSB7CisgICAgICAgIEFERE9QKGMsIEdFVF9BV0FJVEFCTEUpOworICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7CisgICAgICAgIEFERE9QKGMsIFlJRUxEX0ZST00pOworICAgIH0KKwogICAgIHJldHVybiAxOwogZXJyb3JfaW5fc2NvcGU6CiAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKQEAgLTM1MzEsNyArNDAyMiw2IEBACiBzdGF0aWMgaW50CiBjb21waWxlcl92aXNpdF9rZXl3b3JkKHN0cnVjdCBjb21waWxlciAqYywga2V5d29yZF90eSBrKQogewotICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgay0+YXJnLCBjb25zdHMpOwogICAgIFZJU0lUKGMsIGV4cHIsIGstPnZhbHVlKTsKICAgICByZXR1cm4gMTsKIH0KQEAgLTM1NDksNiArNDAzOSw4IEBACiAgICAgc3dpdGNoIChlLT5raW5kKSB7CiAgICAgY2FzZSBFbGxpcHNpc19raW5kOgogICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIENvbnN0YW50X2tpbmQ6CisgICAgICAgIHJldHVybiBQeU9iamVjdF9Jc1RydWUoZS0+di5Db25zdGFudC52YWx1ZSk7CiAgICAgY2FzZSBOdW1fa2luZDoKICAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0lzVHJ1ZShlLT52Lk51bS5uKTsKICAgICBjYXNlIFN0cl9raW5kOgpAQCAtMzU5Miw5ICs0MDg0LDkgQEAKICAgICAgICBCTE9DSwogICAgZmluYWxseToKICAgICAgICBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZDoKLSAgICAgICBleGMgPSBjb3B5IG9mIChleGNlcHRpb24sIGluc3RhbmNlLCB0cmFjZWJhY2spCisgICAgICAgICAgIGV4YyA9IGNvcHkgb2YgKGV4Y2VwdGlvbiwgaW5zdGFuY2UsIHRyYWNlYmFjaykKICAgICAgICBlbHNlOgotICAgICAgIGV4YyA9IChOb25lLCBOb25lLCBOb25lKQorICAgICAgICAgICBleGMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKICAgICAgICBpZiBub3QgKGF3YWl0IGV4aXQoKmV4YykpOgogICAgICAgICAgICByYWlzZQogICovCkBAIC0zNzk0LDggKzQyODYsNiBAQAogICAgIGNhc2UgWWllbGRfa2luZDoKICAgICAgICAgaWYgKGMtPnUtPnVfc3RlLT5zdGVfdHlwZSAhPSBGdW5jdGlvbkJsb2NrKQogICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICIneWllbGQnIG91dHNpZGUgZnVuY3Rpb24iKTsKLSAgICAgICAgaWYgKGMtPnUtPnVfc2NvcGVfdHlwZSA9PSBDT01QSUxFUl9TQ09QRV9BU1lOQ19GVU5DVElPTikKLSAgICAgICAgICAgIHJldHVybiBjb21waWxlcl9lcnJvcihjLCAiJ3lpZWxkJyBpbnNpZGUgYXN5bmMgZnVuY3Rpb24iKTsKICAgICAgICAgaWYgKGUtPnYuWWllbGQudmFsdWUpIHsKICAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuWWllbGQudmFsdWUpOwogICAgICAgICB9CkBAIC0zODIwLDExICs0MzEwLDggQEAKICAgICAgICAgaWYgKGMtPnUtPnVfc3RlLT5zdGVfdHlwZSAhPSBGdW5jdGlvbkJsb2NrKQogICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICInYXdhaXQnIG91dHNpZGUgZnVuY3Rpb24iKTsKIAotICAgICAgICBpZiAoYy0+dS0+dV9zY29wZV90eXBlID09IENPTVBJTEVSX1NDT1BFX0NPTVBSRUhFTlNJT04pCi0gICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoCi0gICAgICAgICAgICAgICAgYywgIidhd2FpdCcgZXhwcmVzc2lvbnMgaW4gY29tcHJlaGVuc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKLQotICAgICAgICBpZiAoYy0+dS0+dV9zY29wZV90eXBlICE9IENPTVBJTEVSX1NDT1BFX0FTWU5DX0ZVTkNUSU9OKQorICAgICAgICBpZiAoYy0+dS0+dV9zY29wZV90eXBlICE9IENPTVBJTEVSX1NDT1BFX0FTWU5DX0ZVTkNUSU9OICYmCisgICAgICAgICAgICAgICAgYy0+dS0+dV9zY29wZV90eXBlICE9IENPTVBJTEVSX1NDT1BFX0NPTVBSRUhFTlNJT04pCiAgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgIidhd2FpdCcgb3V0c2lkZSBhc3luYyBmdW5jdGlvbiIpOwogCiAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuQXdhaXQudmFsdWUpOwpAQCAtMzgzNiwxMiArNDMyMywxOSBAQAogICAgICAgICByZXR1cm4gY29tcGlsZXJfY29tcGFyZShjLCBlKTsKICAgICBjYXNlIENhbGxfa2luZDoKICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2NhbGwoYywgZSk7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuQ29uc3RhbnQudmFsdWUsIGNvbnN0cyk7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTnVtX2tpbmQ6CiAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgZS0+di5OdW0ubiwgY29uc3RzKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTdHJfa2luZDoKICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52LlN0ci5zLCBjb25zdHMpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfam9pbmVkX3N0cihjLCBlKTsKKyAgICBjYXNlIEZvcm1hdHRlZFZhbHVlX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9mb3JtYXR0ZWRfdmFsdWUoYywgZSk7CiAgICAgY2FzZSBCeXRlc19raW5kOgogICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuQnl0ZXMucywgY29uc3RzKTsKICAgICAgICAgYnJlYWs7CkBAIC0zOTc2LDYgKzQ0NzAsMTM4IEBACiB9CiAKIHN0YXRpYyBpbnQKK2NoZWNrX2Fubl9leHByKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQoreworICAgIFZJU0lUKGMsIGV4cHIsIGUpOworICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitjaGVja19hbm5vdGF0aW9uKHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQoreworICAgIC8qIEFubm90YXRpb25zIGFyZSBvbmx5IGV2YWx1YXRlZCBpbiBhIG1vZHVsZSBvciBjbGFzcy4gKi8KKyAgICBpZiAoYy0+dS0+dV9zY29wZV90eXBlID09IENPTVBJTEVSX1NDT1BFX01PRFVMRSB8fAorICAgICAgICBjLT51LT51X3Njb3BlX3R5cGUgPT0gQ09NUElMRVJfU0NPUEVfQ0xBU1MpIHsKKyAgICAgICAgcmV0dXJuIGNoZWNrX2Fubl9leHByKGMsIHMtPnYuQW5uQXNzaWduLmFubm90YXRpb24pOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY2hlY2tfYW5uX3NsaWNlKHN0cnVjdCBjb21waWxlciAqYywgc2xpY2VfdHkgc2wpCit7CisgICAgc3dpdGNoKHNsLT5raW5kKSB7CisgICAgY2FzZSBJbmRleF9raW5kOgorICAgICAgICByZXR1cm4gY2hlY2tfYW5uX2V4cHIoYywgc2wtPnYuSW5kZXgudmFsdWUpOworICAgIGNhc2UgU2xpY2Vfa2luZDoKKyAgICAgICAgaWYgKHNsLT52LlNsaWNlLmxvd2VyICYmICFjaGVja19hbm5fZXhwcihjLCBzbC0+di5TbGljZS5sb3dlcikpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChzbC0+di5TbGljZS51cHBlciAmJiAhY2hlY2tfYW5uX2V4cHIoYywgc2wtPnYuU2xpY2UudXBwZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2wtPnYuU2xpY2Uuc3RlcCAmJiAhY2hlY2tfYW5uX2V4cHIoYywgc2wtPnYuU2xpY2Uuc3RlcCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHNsaWNlIGtpbmQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitjaGVja19hbm5fc3Vic2NyKHN0cnVjdCBjb21waWxlciAqYywgc2xpY2VfdHkgc2wpCit7CisgICAgLyogV2UgY2hlY2sgdGhhdCBldmVyeXRoaW5nIGluIGEgc3Vic2NyaXB0IGlzIGRlZmluZWQgYXQgcnVudGltZS4gKi8KKyAgICBQeV9zc2l6ZV90IGksIG47CisKKyAgICBzd2l0Y2ggKHNsLT5raW5kKSB7CisgICAgY2FzZSBJbmRleF9raW5kOgorICAgIGNhc2UgU2xpY2Vfa2luZDoKKyAgICAgICAgaWYgKCFjaGVja19hbm5fc2xpY2UoYywgc2wpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEV4dFNsaWNlX2tpbmQ6CisgICAgICAgIG4gPSBhc2RsX3NlcV9MRU4oc2wtPnYuRXh0U2xpY2UuZGltcyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHNsaWNlX3R5IHN1YnNsID0gKHNsaWNlX3R5KWFzZGxfc2VxX0dFVChzbC0+di5FeHRTbGljZS5kaW1zLCBpKTsKKyAgICAgICAgICAgIHN3aXRjaCAoc3Vic2wtPmtpbmQpIHsKKyAgICAgICAgICAgIGNhc2UgSW5kZXhfa2luZDoKKyAgICAgICAgICAgIGNhc2UgU2xpY2Vfa2luZDoKKyAgICAgICAgICAgICAgICBpZiAoIWNoZWNrX2Fubl9zbGljZShjLCBzdWJzbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFeHRTbGljZV9raW5kOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbmRlZCBzbGljZSBpbnZhbGlkIGluIG5lc3RlZCBzbGljZSIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHN1YnNjcmlwdCBraW5kICVkIiwgc2wtPmtpbmQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2NvbXBpbGVyX2FubmFzc2lnbihzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKK3sKKyAgICBleHByX3R5IHRhcmcgPSBzLT52LkFubkFzc2lnbi50YXJnZXQ7CisKKyAgICBhc3NlcnQocy0+a2luZCA9PSBBbm5Bc3NpZ25fa2luZCk7CisKKyAgICAvKiBXZSBwZXJmb3JtIHRoZSBhY3R1YWwgYXNzaWdubWVudCBmaXJzdC4gKi8KKyAgICBpZiAocy0+di5Bbm5Bc3NpZ24udmFsdWUpIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5Bbm5Bc3NpZ24udmFsdWUpOworICAgICAgICBWSVNJVChjLCBleHByLCB0YXJnKTsKKyAgICB9CisgICAgc3dpdGNoICh0YXJnLT5raW5kKSB7CisgICAgY2FzZSBOYW1lX2tpbmQ6CisgICAgICAgIC8qIElmIHdlIGhhdmUgYSBzaW1wbGUgbmFtZSBpbiBhIG1vZHVsZSBvciBjbGFzcywgc3RvcmUgYW5ub3RhdGlvbi4gKi8KKyAgICAgICAgaWYgKHMtPnYuQW5uQXNzaWduLnNpbXBsZSAmJgorICAgICAgICAgICAgKGMtPnUtPnVfc2NvcGVfdHlwZSA9PSBDT01QSUxFUl9TQ09QRV9NT0RVTEUgfHwKKyAgICAgICAgICAgICBjLT51LT51X3Njb3BlX3R5cGUgPT0gQ09NUElMRVJfU0NPUEVfQ0xBU1MpKSB7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkFubkFzc2lnbi5hbm5vdGF0aW9uKTsKKyAgICAgICAgICAgIEFERE9QX08oYywgU1RPUkVfQU5OT1RBVElPTiwgdGFyZy0+di5OYW1lLmlkLCBuYW1lcykKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEF0dHJpYnV0ZV9raW5kOgorICAgICAgICBpZiAoIXMtPnYuQW5uQXNzaWduLnZhbHVlICYmCisgICAgICAgICAgICAhY2hlY2tfYW5uX2V4cHIoYywgdGFyZy0+di5BdHRyaWJ1dGUudmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFN1YnNjcmlwdF9raW5kOgorICAgICAgICBpZiAoIXMtPnYuQW5uQXNzaWduLnZhbHVlICYmCisgICAgICAgICAgICAoIWNoZWNrX2Fubl9leHByKGMsIHRhcmctPnYuU3Vic2NyaXB0LnZhbHVlKSB8fAorICAgICAgICAgICAgICFjaGVja19hbm5fc3Vic2NyKGMsIHRhcmctPnYuU3Vic2NyaXB0LnNsaWNlKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBub2RlIHR5cGUgKCVkKSBmb3IgYW5ub3RhdGVkIGFzc2lnbm1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgdGFyZy0+a2luZCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogQW5ub3RhdGlvbiBpcyBldmFsdWF0ZWQgbGFzdC4gKi8KKyAgICBpZiAoIXMtPnYuQW5uQXNzaWduLnNpbXBsZSAmJiAhY2hlY2tfYW5ub3RhdGlvbihjLCBzKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKIGNvbXBpbGVyX3B1c2hfZmJsb2NrKHN0cnVjdCBjb21waWxlciAqYywgZW51bSBmYmxvY2t0eXBlIHQsIGJhc2ljYmxvY2sgKmIpCiB7CiAgICAgc3RydWN0IGZibG9ja2luZm8gKmY7CkBAIC00MjczLDcgKzQ4OTksNyBAQAogICAgIGEtPmFfbG5vdGFiID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBERUZBVUxUX0xOT1RBQl9TSVpFKTsKICAgICBpZiAoIWEtPmFfbG5vdGFiKQogICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoKHNpemVfdCluYmxvY2tzID4gUFlfU0laRV9NQVggLyBzaXplb2YoYmFzaWNibG9jayAqKSkgeworICAgIGlmICgoc2l6ZV90KW5ibG9ja3MgPiBTSVpFX01BWCAvIHNpemVvZihiYXNpY2Jsb2NrICopKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTQyOTUsMTggKzQ5MjEsNiBAQAogICAgICAgICBQeU9iamVjdF9GcmVlKGEtPmFfcG9zdG9yZGVyKTsKIH0KIAotLyogUmV0dXJuIHRoZSBzaXplIG9mIGEgYmFzaWMgYmxvY2sgaW4gYnl0ZXMuICovCi0KLXN0YXRpYyBpbnQKLWluc3Ryc2l6ZShzdHJ1Y3QgaW5zdHIgKmluc3RyKQotewotICAgIGlmICghaW5zdHItPmlfaGFzYXJnKQotICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAvKiAxIGJ5dGUgZm9yIHRoZSBvcGNvZGUqLwotICAgIGlmIChpbnN0ci0+aV9vcGFyZyA+IDB4ZmZmZikKLSAgICAgICAgcmV0dXJuIDY7ICAgICAgICAgICAgICAgLyogMSAob3Bjb2RlKSArIDEgKEVYVEVOREVEX0FSRyBvcGNvZGUpICsgMiAob3BhcmcpICsgMihvcGFyZyBleHRlbmRlZCkgKi8KLSAgICByZXR1cm4gMzsgICAgICAgICAgICAgICAgICAgLyogMSAob3Bjb2RlKSArIDIgKG9wYXJnKSAqLwotfQotCiBzdGF0aWMgaW50CiBibG9ja3NpemUoYmFzaWNibG9jayAqYikKIHsKQEAgLTQzMTQsNyArNDkyOCw3IEBACiAgICAgaW50IHNpemUgPSAwOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykKLSAgICAgICAgc2l6ZSArPSBpbnN0cnNpemUoJmItPmJfaW5zdHJbaV0pOworICAgICAgICBzaXplICs9IGluc3Ryc2l6ZShiLT5iX2luc3RyW2ldLmlfb3BhcmcpOwogICAgIHJldHVybiBzaXplOwogfQogCkBAIC00MzMzLDcgKzQ5NDcsNiBAQAogICAgIGRfbGluZW5vID0gaS0+aV9saW5lbm8gLSBhLT5hX2xpbmVubzsKIAogICAgIGFzc2VydChkX2J5dGVjb2RlID49IDApOwotICAgIGFzc2VydChkX2xpbmVubyA+PSAwKTsKIAogICAgIGlmKGRfYnl0ZWNvZGUgPT0gMCAmJiBkX2xpbmVubyA9PSAwKQogICAgICAgICByZXR1cm4gMTsKQEAgLTQzNjMsOSArNDk3NiwyMSBAQAogICAgICAgICBkX2J5dGVjb2RlIC09IG5jb2RlcyAqIDI1NTsKICAgICAgICAgYS0+YV9sbm90YWJfb2ZmICs9IG5jb2RlcyAqIDI7CiAgICAgfQotICAgIGFzc2VydChkX2J5dGVjb2RlIDw9IDI1NSk7Ci0gICAgaWYgKGRfbGluZW5vID4gMjU1KSB7Ci0gICAgICAgIGludCBqLCBuYnl0ZXMsIG5jb2RlcyA9IGRfbGluZW5vIC8gMjU1OworICAgIGFzc2VydCgwIDw9IGRfYnl0ZWNvZGUgJiYgZF9ieXRlY29kZSA8PSAyNTUpOworCisgICAgaWYgKGRfbGluZW5vIDwgLTEyOCB8fCAxMjcgPCBkX2xpbmVubykgeworICAgICAgICBpbnQgaiwgbmJ5dGVzLCBuY29kZXMsIGs7CisgICAgICAgIGlmIChkX2xpbmVubyA8IDApIHsKKyAgICAgICAgICAgIGsgPSAtMTI4OworICAgICAgICAgICAgLyogdXNlIGRpdmlzaW9uIG9uIHBvc2l0aXZlIG51bWJlcnMgKi8KKyAgICAgICAgICAgIG5jb2RlcyA9ICgtZF9saW5lbm8pIC8gMTI4OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgayA9IDEyNzsKKyAgICAgICAgICAgIG5jb2RlcyA9IGRfbGluZW5vIC8gMTI3OworICAgICAgICB9CisgICAgICAgIGRfbGluZW5vIC09IG5jb2RlcyAqIGs7CisgICAgICAgIGFzc2VydChuY29kZXMgPj0gMSk7CiAgICAgICAgIG5ieXRlcyA9IGEtPmFfbG5vdGFiX29mZiArIDIgKiBuY29kZXM7CiAgICAgICAgIGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoYS0+YV9sbm90YWIpOwogICAgICAgICBpZiAobmJ5dGVzID49IGxlbikgewpAQCAtNDM4MywxNSArNTAwOCwxNSBAQAogICAgICAgICBsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKQogICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKICAgICAgICAgKmxub3RhYisrID0gZF9ieXRlY29kZTsKLSAgICAgICAgKmxub3RhYisrID0gMjU1OworICAgICAgICAqbG5vdGFiKysgPSBrOwogICAgICAgICBkX2J5dGVjb2RlID0gMDsKICAgICAgICAgZm9yIChqID0gMTsgaiA8IG5jb2RlczsgaisrKSB7CiAgICAgICAgICAgICAqbG5vdGFiKysgPSAwOwotICAgICAgICAgICAgKmxub3RhYisrID0gMjU1OworICAgICAgICAgICAgKmxub3RhYisrID0gazsKICAgICAgICAgfQotICAgICAgICBkX2xpbmVubyAtPSBuY29kZXMgKiAyNTU7CiAgICAgICAgIGEtPmFfbG5vdGFiX29mZiArPSBuY29kZXMgKiAyOwogICAgIH0KKyAgICBhc3NlcnQoLTEyOCA8PSBkX2xpbmVubyAmJiBkX2xpbmVubyA8PSAxMjcpOwogCiAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShhLT5hX2xub3RhYik7CiAgICAgaWYgKGEtPmFfbG5vdGFiX29mZiArIDIgPj0gbGVuKSB7CkBAIC00NDIzLDE1ICs1MDQ4LDEyIEBACiBzdGF0aWMgaW50CiBhc3NlbWJsZV9lbWl0KHN0cnVjdCBhc3NlbWJsZXIgKmEsIHN0cnVjdCBpbnN0ciAqaSkKIHsKLSAgICBpbnQgc2l6ZSwgYXJnID0gMCwgZXh0ID0gMDsKKyAgICBpbnQgc2l6ZSwgYXJnID0gMDsKICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoYS0+YV9ieXRlY29kZSk7CiAgICAgY2hhciAqY29kZTsKIAotICAgIHNpemUgPSBpbnN0cnNpemUoaSk7Ci0gICAgaWYgKGktPmlfaGFzYXJnKSB7Ci0gICAgICAgIGFyZyA9IGktPmlfb3Bhcmc7Ci0gICAgICAgIGV4dCA9IGFyZyA+PiAxNjsKLSAgICB9CisgICAgYXJnID0gaS0+aV9vcGFyZzsKKyAgICBzaXplID0gaW5zdHJzaXplKGFyZyk7CiAgICAgaWYgKGktPmlfbGluZW5vICYmICFhc3NlbWJsZV9sbm90YWIoYSwgaSkpCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmIChhLT5hX29mZnNldCArIHNpemUgPj0gbGVuKSB7CkBAIC00NDQyLDE5ICs1MDY0LDcgQEAKICAgICB9CiAgICAgY29kZSA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGEtPmFfYnl0ZWNvZGUpICsgYS0+YV9vZmZzZXQ7CiAgICAgYS0+YV9vZmZzZXQgKz0gc2l6ZTsKLSAgICBpZiAoc2l6ZSA9PSA2KSB7Ci0gICAgICAgIGFzc2VydChpLT5pX2hhc2FyZyk7Ci0gICAgICAgICpjb2RlKysgPSAoY2hhcilFWFRFTkRFRF9BUkc7Ci0gICAgICAgICpjb2RlKysgPSBleHQgJiAweGZmOwotICAgICAgICAqY29kZSsrID0gZXh0ID4+IDg7Ci0gICAgICAgIGFyZyAmPSAweGZmZmY7Ci0gICAgfQotICAgICpjb2RlKysgPSBpLT5pX29wY29kZTsKLSAgICBpZiAoaS0+aV9oYXNhcmcpIHsKLSAgICAgICAgYXNzZXJ0KHNpemUgPT0gMyB8fCBzaXplID09IDYpOwotICAgICAgICAqY29kZSsrID0gYXJnICYgMHhmZjsKLSAgICAgICAgKmNvZGUrKyA9IGFyZyA+PiA4OwotICAgIH0KKyAgICB3cml0ZV9vcF9hcmcoKHVuc2lnbmVkIGNoYXIqKWNvZGUsIGktPmlfb3Bjb2RlLCBhcmcsIHNpemUpOwogICAgIHJldHVybiAxOwogfQogCkBAIC00NDYyLDcgKzUwNzIsNyBAQAogYXNzZW1ibGVfanVtcF9vZmZzZXRzKHN0cnVjdCBhc3NlbWJsZXIgKmEsIHN0cnVjdCBjb21waWxlciAqYykKIHsKICAgICBiYXNpY2Jsb2NrICpiOwotICAgIGludCBic2l6ZSwgdG90c2l6ZSwgZXh0ZW5kZWRfYXJnX2NvdW50ID0gMCwgbGFzdF9leHRlbmRlZF9hcmdfY291bnQ7CisgICAgaW50IGJzaXplLCB0b3RzaXplLCBleHRlbmRlZF9hcmdfcmVjb21waWxlOwogICAgIGludCBpOwogCiAgICAgLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIGJsb2NrIGFuZCBmaXh1cCBqdW1wIGFyZ3MuCkBAIC00NDc1LDI3ICs1MDg1LDI2IEBACiAgICAgICAgICAgICBiLT5iX29mZnNldCA9IHRvdHNpemU7CiAgICAgICAgICAgICB0b3RzaXplICs9IGJzaXplOwogICAgICAgICB9Ci0gICAgICAgIGxhc3RfZXh0ZW5kZWRfYXJnX2NvdW50ID0gZXh0ZW5kZWRfYXJnX2NvdW50OwotICAgICAgICBleHRlbmRlZF9hcmdfY291bnQgPSAwOworICAgICAgICBleHRlbmRlZF9hcmdfcmVjb21waWxlID0gMDsKICAgICAgICAgZm9yIChiID0gYy0+dS0+dV9ibG9ja3M7IGIgIT0gTlVMTDsgYiA9IGItPmJfbGlzdCkgewogICAgICAgICAgICAgYnNpemUgPSBiLT5iX29mZnNldDsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5zdHIgKmluc3RyID0gJmItPmJfaW5zdHJbaV07CisgICAgICAgICAgICAgICAgaW50IGlzaXplID0gaW5zdHJzaXplKGluc3RyLT5pX29wYXJnKTsKICAgICAgICAgICAgICAgICAvKiBSZWxhdGl2ZSBqdW1wcyBhcmUgY29tcHV0ZWQgcmVsYXRpdmUgdG8KICAgICAgICAgICAgICAgICAgICB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBhZnRlciBmZXRjaGluZwogICAgICAgICAgICAgICAgICAgIHRoZSBqdW1wIGluc3RydWN0aW9uLgogICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYnNpemUgKz0gaW5zdHJzaXplKGluc3RyKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5zdHItPmlfamFicykKKyAgICAgICAgICAgICAgICBic2l6ZSArPSBpc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdHItPmlfamFicyB8fCBpbnN0ci0+aV9qcmVsKSB7CiAgICAgICAgICAgICAgICAgICAgIGluc3RyLT5pX29wYXJnID0gaW5zdHItPmlfdGFyZ2V0LT5iX29mZnNldDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnN0ci0+aV9qcmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IGluc3RyLT5pX3RhcmdldC0+Yl9vZmZzZXQgLSBic2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaW5zdHItPmlfb3BhcmcgPSBkZWx0YTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RyLT5pX2pyZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RyLT5pX29wYXJnIC09IGJzaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnNpemUoaW5zdHItPmlfb3BhcmcpICE9IGlzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZF9hcmdfcmVjb21waWxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChpbnN0ci0+aV9vcGFyZyA+IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfYXJnX2NvdW50Kys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNDUwNSw3ICs1MTE0LDcgQEAKIAogICAgICAgICBUaGUgaXNzdWUgaXMgdGhhdCBpbiB0aGUgZmlyc3QgbG9vcCBibG9ja3NpemUoKSBpcyBjYWxsZWQKICAgICAgICAgd2hpY2ggY2FsbHMgaW5zdHJzaXplKCkgd2hpY2ggcmVxdWlyZXMgaV9vcGFyZyBiZSBzZXQKLSAgICAgICAgYXBwcm9wcmlhdGVseS4gICAgICAgICAgVGhlcmUgaXMgYSBib290c3RyYXAgcHJvYmxlbSBiZWNhdXNlCisgICAgICAgIGFwcHJvcHJpYXRlbHkuIFRoZXJlIGlzIGEgYm9vdHN0cmFwIHByb2JsZW0gYmVjYXVzZQogICAgICAgICBpX29wYXJnIGlzIGNhbGN1bGF0ZWQgaW4gdGhlIHNlY29uZCBsb29wIGFib3ZlLgogCiAgICAgICAgIFNvIHdlIGxvb3AgdW50aWwgd2Ugc3RvcCBzZWVpbmcgbmV3IEVYVEVOREVEX0FSR3MuCkBAIC00NTEzLDcgKzUxMjIsNyBAQAogICAgICAgICBvbmVzIGluIGp1bXAgaW5zdHJ1Y3Rpb25zLiAgU28gdGhpcyBzaG91bGQgY29udmVyZ2UKICAgICAgICAgZmFpcmx5IHF1aWNrbHkuCiAgICAgKi8KLSAgICB9IHdoaWxlIChsYXN0X2V4dGVuZGVkX2FyZ19jb3VudCAhPSBleHRlbmRlZF9hcmdfY291bnQpOworICAgIH0gd2hpbGUgKGV4dGVuZGVkX2FyZ19yZWNvbXBpbGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDU0OSw4ICs1MTU4LDEyIEBACiAgICAgICAgIGZsYWdzIHw9IENPX05FV0xPQ0FMUyB8IENPX09QVElNSVpFRDsKICAgICAgICAgaWYgKHN0ZS0+c3RlX25lc3RlZCkKICAgICAgICAgICAgIGZsYWdzIHw9IENPX05FU1RFRDsKLSAgICAgICAgaWYgKHN0ZS0+c3RlX2dlbmVyYXRvcikKKyAgICAgICAgaWYgKHN0ZS0+c3RlX2dlbmVyYXRvciAmJiAhc3RlLT5zdGVfY29yb3V0aW5lKQogICAgICAgICAgICAgZmxhZ3MgfD0gQ09fR0VORVJBVE9SOworICAgICAgICBpZiAoIXN0ZS0+c3RlX2dlbmVyYXRvciAmJiBzdGUtPnN0ZV9jb3JvdXRpbmUpCisgICAgICAgICAgICBmbGFncyB8PSBDT19DT1JPVVRJTkU7CisgICAgICAgIGlmIChzdGUtPnN0ZV9nZW5lcmF0b3IgJiYgc3RlLT5zdGVfY29yb3V0aW5lKQorICAgICAgICAgICAgZmxhZ3MgfD0gQ09fQVNZTkNfR0VORVJBVE9SOwogICAgICAgICBpZiAoc3RlLT5zdGVfdmFyYXJncykKICAgICAgICAgICAgIGZsYWdzIHw9IENPX1ZBUkFSR1M7CiAgICAgICAgIGlmIChzdGUtPnN0ZV92YXJrZXl3b3JkcykKQEAgLTQ2NTksOSArNTI3Miw5IEBACiAgICAgY2hhciBhcmdbMTI4XTsKIAogICAgICphcmcgPSAnXDAnOwotICAgIGlmIChpLT5pX2hhc2FyZykKKyAgICBpZiAoSEFTX0FSRyhpLT5pX29wY29kZSkpIHsKICAgICAgICAgc3ByaW50ZihhcmcsICJhcmc6ICVkICIsIGktPmlfb3BhcmcpOwotCisgICAgfQogICAgIGZwcmludGYoc3RkZXJyLCAibGluZTogJWQsIG9wY29kZTogJWQgJXMlcyVzXG4iLAogICAgICAgICAgICAgICAgICAgICBpLT5pX2xpbmVubywgaS0+aV9vcGNvZGUsIGFyZywgamFicywganJlbCk7CiB9CkBAIC00NzExLDcgKzUzMjQsNyBAQAogCiAgICAgLyogU2V0IGZpcnN0bGluZW5vIGlmIGl0IHdhc24ndCBleHBsaWNpdGx5IHNldC4gKi8KICAgICBpZiAoIWMtPnUtPnVfZmlyc3RsaW5lbm8pIHsKLSAgICAgICAgaWYgKGVudHJ5YmxvY2sgJiYgZW50cnlibG9jay0+Yl9pbnN0cikKKyAgICAgICAgaWYgKGVudHJ5YmxvY2sgJiYgZW50cnlibG9jay0+Yl9pbnN0ciAmJiBlbnRyeWJsb2NrLT5iX2luc3RyLT5pX2xpbmVubykKICAgICAgICAgICAgIGMtPnUtPnVfZmlyc3RsaW5lbm8gPSBlbnRyeWJsb2NrLT5iX2luc3RyLT5pX2xpbmVubzsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgYy0+dS0+dV9maXJzdGxpbmVubyA9IDE7CkBAIC00NzQ5LDQgKzUzNjIsMyBAQAogewogICAgIHJldHVybiBQeUFTVF9Db21waWxlRXgobW9kLCBmaWxlbmFtZSwgZmxhZ3MsIC0xLCBhcmVuYSk7CiB9Ci0KZGlmZiAtLWdpdCBhL1B5dGhvbi9jb25kdmFyLmggYi9QeXRob24vY29uZHZhci5oCmluZGV4IGNlZDkxMGYuLjlhNzFiMTcgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb25kdmFyLmgKKysrIGIvUHl0aG9uL2NvbmR2YXIuaApAQCAtODksNyArODksNyBAQAogCiAvKiByZXR1cm4gMCBmb3Igc3VjY2VzcywgMSBvbiB0aW1lb3V0LCAtMSBvbiBlcnJvciAqLwogUHlfTE9DQUxfSU5MSU5FKGludCkKLVB5Q09ORF9USU1FRFdBSVQoUHlDT05EX1QgKmNvbmQsIFB5TVVURVhfVCAqbXV0LCBQWV9MT05HX0xPTkcgdXMpCitQeUNPTkRfVElNRURXQUlUKFB5Q09ORF9UICpjb25kLCBQeU1VVEVYX1QgKm11dCwgbG9uZyBsb25nIHVzKQogewogICAgIGludCByOwogICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKQEAgLTI3MCw3ICsyNzAsNyBAQAogfQogCiBQeV9MT0NBTF9JTkxJTkUoaW50KQotUHlDT05EX1RJTUVEV0FJVChQeUNPTkRfVCAqY3YsIFB5TVVURVhfVCAqY3MsIFBZX0xPTkdfTE9ORyB1cykKK1B5Q09ORF9USU1FRFdBSVQoUHlDT05EX1QgKmN2LCBQeU1VVEVYX1QgKmNzLCBsb25nIGxvbmcgdXMpCiB7CiAgICAgcmV0dXJuIF9QeUNPTkRfV0FJVF9NUyhjdiwgY3MsIChEV09SRCkodXMvMTAwMCkpOwogfQpAQCAtMzYzLDcgKzM2Myw3IEBACiAgKiAyIHRvIGluZGljYXRlIHRoYXQgd2UgZG9uJ3Qga25vdy4KICAqLwogUHlfTE9DQUxfSU5MSU5FKGludCkKLVB5Q09ORF9USU1FRFdBSVQoUHlDT05EX1QgKmN2LCBQeU1VVEVYX1QgKmNzLCBQWV9MT05HX0xPTkcgdXMpCitQeUNPTkRfVElNRURXQUlUKFB5Q09ORF9UICpjdiwgUHlNVVRFWF9UICpjcywgbG9uZyBsb25nIHVzKQogewogICAgIHJldHVybiBTbGVlcENvbmRpdGlvblZhcmlhYmxlU1JXKGN2LCBjcywgKERXT1JEKSh1cy8xMDAwKSwgMCkgPyAyIDogLTE7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZHRvYS5jIGIvUHl0aG9uL2R0b2EuYwppbmRleCAzZGE1NDZlLi5lZmNhZGMzIDEwMDY0NAotLS0gYS9QeXRob24vZHRvYS5jCisrKyBiL1B5dGhvbi9kdG9hLmMKQEAgLTE1MSwxOCArMTUxLDkgQEAKICNlbmRpZgogCiAKLSNpZiBkZWZpbmVkKEhBVkVfVUlOVDMyX1QpICYmIGRlZmluZWQoSEFWRV9JTlQzMl9UKQotdHlwZWRlZiBQWV9VSU5UMzJfVCBVTG9uZzsKLXR5cGVkZWYgUFlfSU5UMzJfVCBMb25nOwotI2Vsc2UKLSNlcnJvciAiRmFpbGVkIHRvIGZpbmQgYW4gZXhhY3Qtd2lkdGggMzItYml0IGludGVnZXIgdHlwZSIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIQVZFX1VJTlQ2NF9UKQotI2RlZmluZSBVTExvbmcgUFlfVUlOVDY0X1QKLSNlbHNlCi0jdW5kZWYgVUxMb25nCi0jZW5kaWYKK3R5cGVkZWYgdWludDMyX3QgVUxvbmc7Cit0eXBlZGVmIGludDMyX3QgTG9uZzsKK3R5cGVkZWYgdWludDY0X3QgVUxMb25nOwogCiAjdW5kZWYgREVCVUcKICNpZmRlZiBQeV9ERUJVRwpAQCAtNDU3LDEzICs0NDgsOCBAQAogbXVsdGFkZChCaWdpbnQgKmIsIGludCBtLCBpbnQgYSkgICAgICAgLyogbXVsdGlwbHkgYnkgbSBhbmQgYWRkIGEgKi8KIHsKICAgICBpbnQgaSwgd2RzOwotI2lmZGVmIFVMTG9uZwogICAgIFVMb25nICp4OwogICAgIFVMTG9uZyBjYXJyeSwgeTsKLSNlbHNlCi0gICAgVUxvbmcgY2FycnksICp4LCB5OwotICAgIFVMb25nIHhpLCB6OwotI2VuZGlmCiAgICAgQmlnaW50ICpiMTsKIAogICAgIHdkcyA9IGItPndkczsKQEAgLTQ3MSwxNyArNDU3LDkgQEAKICAgICBpID0gMDsKICAgICBjYXJyeSA9IGE7CiAgICAgZG8gewotI2lmZGVmIFVMTG9uZwogICAgICAgICB5ID0gKnggKiAoVUxMb25nKW0gKyBjYXJyeTsKICAgICAgICAgY2FycnkgPSB5ID4+IDMyOwogICAgICAgICAqeCsrID0gKFVMb25nKSh5ICYgRkZGRkZGRkYpOwotI2Vsc2UKLSAgICAgICAgeGkgPSAqeDsKLSAgICAgICAgeSA9ICh4aSAmIDB4ZmZmZikgKiBtICsgY2Fycnk7Ci0gICAgICAgIHogPSAoeGkgPj4gMTYpICogbSArICh5ID4+IDE2KTsKLSAgICAgICAgY2FycnkgPSB6ID4+IDE2OwotICAgICAgICAqeCsrID0gKHogPDwgMTYpICsgKHkgJiAweGZmZmYpOwotI2VuZGlmCiAgICAgfQogICAgIHdoaWxlKCsraSA8IHdkcyk7CiAgICAgaWYgKGNhcnJ5KSB7CkBAIC02NDIsMTIgKzYyMCw3IEBACiAgICAgaW50IGssIHdhLCB3Yiwgd2M7CiAgICAgVUxvbmcgKngsICp4YSwgKnhhZSwgKnhiLCAqeGJlLCAqeGMsICp4YzA7CiAgICAgVUxvbmcgeTsKLSNpZmRlZiBVTExvbmcKICAgICBVTExvbmcgY2FycnksIHo7Ci0jZWxzZQotICAgIFVMb25nIGNhcnJ5LCB6OwotICAgIFVMb25nIHoyOwotI2VuZGlmCiAKICAgICBpZiAoKCFhLT54WzBdICYmIGEtPndkcyA9PSAxKSB8fCAoIWItPnhbMF0gJiYgYi0+d2RzID09IDEpKSB7CiAgICAgICAgIGMgPSBCYWxsb2MoMCk7CkBAIC02NzksNyArNjUyLDYgQEAKICAgICB4YiA9IGItPng7CiAgICAgeGJlID0geGIgKyB3YjsKICAgICB4YzAgPSBjLT54OwotI2lmZGVmIFVMTG9uZwogICAgIGZvcig7IHhiIDwgeGJlOyB4YzArKykgewogICAgICAgICBpZiAoKHkgPSAqeGIrKykpIHsKICAgICAgICAgICAgIHggPSB4YTsKQEAgLTY5NCwzOSArNjY2LDYgQEAKICAgICAgICAgICAgICp4YyA9IChVTG9uZyljYXJyeTsKICAgICAgICAgfQogICAgIH0KLSNlbHNlCi0gICAgZm9yKDsgeGIgPCB4YmU7IHhiKyssIHhjMCsrKSB7Ci0gICAgICAgIGlmICh5ID0gKnhiICYgMHhmZmZmKSB7Ci0gICAgICAgICAgICB4ID0geGE7Ci0gICAgICAgICAgICB4YyA9IHhjMDsKLSAgICAgICAgICAgIGNhcnJ5ID0gMDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB6ID0gKCp4ICYgMHhmZmZmKSAqIHkgKyAoKnhjICYgMHhmZmZmKSArIGNhcnJ5OwotICAgICAgICAgICAgICAgIGNhcnJ5ID0geiA+PiAxNjsKLSAgICAgICAgICAgICAgICB6MiA9ICgqeCsrID4+IDE2KSAqIHkgKyAoKnhjID4+IDE2KSArIGNhcnJ5OwotICAgICAgICAgICAgICAgIGNhcnJ5ID0gejIgPj4gMTY7Ci0gICAgICAgICAgICAgICAgU3RvcmVpbmMoeGMsIHoyLCB6KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlKHggPCB4YWUpOwotICAgICAgICAgICAgKnhjID0gY2Fycnk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHkgPSAqeGIgPj4gMTYpIHsKLSAgICAgICAgICAgIHggPSB4YTsKLSAgICAgICAgICAgIHhjID0geGMwOwotICAgICAgICAgICAgY2FycnkgPSAwOwotICAgICAgICAgICAgejIgPSAqeGM7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgeiA9ICgqeCAmIDB4ZmZmZikgKiB5ICsgKCp4YyA+PiAxNikgKyBjYXJyeTsKLSAgICAgICAgICAgICAgICBjYXJyeSA9IHogPj4gMTY7Ci0gICAgICAgICAgICAgICAgU3RvcmVpbmMoeGMsIHosIHoyKTsKLSAgICAgICAgICAgICAgICB6MiA9ICgqeCsrID4+IDE2KSAqIHkgKyAoKnhjICYgMHhmZmZmKSArIGNhcnJ5OwotICAgICAgICAgICAgICAgIGNhcnJ5ID0gejIgPj4gMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSh4IDwgeGFlKTsKLSAgICAgICAgICAgICp4YyA9IHoyOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCiAgICAgZm9yKHhjMCA9IGMtPngsIHhjID0geGMwICsgd2M7IHdjID4gMCAmJiAhKi0teGM7IC0td2MpIDsKICAgICBjLT53ZHMgPSB3YzsKICAgICByZXR1cm4gYzsKQEAgLTc0Nyw3ICs2ODYsNyBAQAogewogICAgIEJpZ2ludCAqYjEsICpwNSwgKnA1MTsKICAgICBpbnQgaTsKLSAgICBzdGF0aWMgaW50IHAwNVszXSA9IHsgNSwgMjUsIDEyNSB9OworICAgIHN0YXRpYyBjb25zdCBpbnQgcDA1WzNdID0geyA1LCAyNSwgMTI1IH07CiAKICAgICBpZiAoKGkgPSBrICYgMykpIHsKICAgICAgICAgYiA9IG11bHRhZGQoYiwgcDA1W2ktMV0sIDApOwpAQCAtODAzLDcgKzc0Miw3IEBACiB7CiAgICAgQmlnaW50ICpiMSwgKnA1LCAqcDUxOwogICAgIGludCBpOwotICAgIHN0YXRpYyBpbnQgcDA1WzNdID0geyA1LCAyNSwgMTI1IH07CisgICAgc3RhdGljIGNvbnN0IGludCBwMDVbM10gPSB7IDUsIDI1LCAxMjUgfTsKIAogICAgIGlmICgoaSA9IGsgJiAzKSkgewogICAgICAgICBiID0gbXVsdGFkZChiLCBwMDVbaS0xXSwgMCk7CkBAIC05MzUsMTIgKzg3NCw3IEBACiAgICAgQmlnaW50ICpjOwogICAgIGludCBpLCB3YSwgd2I7CiAgICAgVUxvbmcgKnhhLCAqeGFlLCAqeGIsICp4YmUsICp4YzsKLSNpZmRlZiBVTExvbmcKICAgICBVTExvbmcgYm9ycm93LCB5OwotI2Vsc2UKLSAgICBVTG9uZyBib3Jyb3csIHk7Ci0gICAgVUxvbmcgejsKLSNlbmRpZgogCiAgICAgaSA9IGNtcChhLGIpOwogICAgIGlmICghaSkgewpAQCAtOTcxLDcgKzkwNSw2IEBACiAgICAgeGJlID0geGIgKyB3YjsKICAgICB4YyA9IGMtPng7CiAgICAgYm9ycm93ID0gMDsKLSNpZmRlZiBVTExvbmcKICAgICBkbyB7CiAgICAgICAgIHkgPSAoVUxMb25nKSp4YSsrIC0gKnhiKysgLSBib3Jyb3c7CiAgICAgICAgIGJvcnJvdyA9IHkgPj4gMzIgJiAoVUxvbmcpMTsKQEAgLTk4MywyMyArOTE2LDYgQEAKICAgICAgICAgYm9ycm93ID0geSA+PiAzMiAmIChVTG9uZykxOwogICAgICAgICAqeGMrKyA9IChVTG9uZykoeSAmIEZGRkZGRkZGKTsKICAgICB9Ci0jZWxzZQotICAgIGRvIHsKLSAgICAgICAgeSA9ICgqeGEgJiAweGZmZmYpIC0gKCp4YiAmIDB4ZmZmZikgLSBib3Jyb3c7Ci0gICAgICAgIGJvcnJvdyA9ICh5ICYgMHgxMDAwMCkgPj4gMTY7Ci0gICAgICAgIHogPSAoKnhhKysgPj4gMTYpIC0gKCp4YisrID4+IDE2KSAtIGJvcnJvdzsKLSAgICAgICAgYm9ycm93ID0gKHogJiAweDEwMDAwKSA+PiAxNjsKLSAgICAgICAgU3RvcmVpbmMoeGMsIHosIHkpOwotICAgIH0KLSAgICB3aGlsZSh4YiA8IHhiZSk7Ci0gICAgd2hpbGUoeGEgPCB4YWUpIHsKLSAgICAgICAgeSA9ICgqeGEgJiAweGZmZmYpIC0gYm9ycm93OwotICAgICAgICBib3Jyb3cgPSAoeSAmIDB4MTAwMDApID4+IDE2OwotICAgICAgICB6ID0gKCp4YSsrID4+IDE2KSAtIGJvcnJvdzsKLSAgICAgICAgYm9ycm93ID0gKHogJiAweDEwMDAwKSA+PiAxNjsKLSAgICAgICAgU3RvcmVpbmMoeGMsIHosIHkpOwotICAgIH0KLSNlbmRpZgogICAgIHdoaWxlKCEqLS14YykKICAgICAgICAgd2EtLTsKICAgICBjLT53ZHMgPSB3YTsKQEAgLTEyNDQsMTIgKzExNjAsNyBAQAogewogICAgIGludCBuOwogICAgIFVMb25nICpieCwgKmJ4ZSwgcSwgKnN4LCAqc3hlOwotI2lmZGVmIFVMTG9uZwogICAgIFVMTG9uZyBib3Jyb3csIGNhcnJ5LCB5LCB5czsKLSNlbHNlCi0gICAgVUxvbmcgYm9ycm93LCBjYXJyeSwgeSwgeXM7Ci0gICAgVUxvbmcgc2ksIHosIHpzOwotI2VuZGlmCiAKICAgICBuID0gUy0+d2RzOwogI2lmZGVmIERFQlVHCkBAIC0xMjcxLDIzICsxMTgyLDExIEBACiAgICAgICAgIGJvcnJvdyA9IDA7CiAgICAgICAgIGNhcnJ5ID0gMDsKICAgICAgICAgZG8gewotI2lmZGVmIFVMTG9uZwogICAgICAgICAgICAgeXMgPSAqc3grKyAqIChVTExvbmcpcSArIGNhcnJ5OwogICAgICAgICAgICAgY2FycnkgPSB5cyA+PiAzMjsKICAgICAgICAgICAgIHkgPSAqYnggLSAoeXMgJiBGRkZGRkZGRikgLSBib3Jyb3c7CiAgICAgICAgICAgICBib3Jyb3cgPSB5ID4+IDMyICYgKFVMb25nKTE7CiAgICAgICAgICAgICAqYngrKyA9IChVTG9uZykoeSAmIEZGRkZGRkZGKTsKLSNlbHNlCi0gICAgICAgICAgICBzaSA9ICpzeCsrOwotICAgICAgICAgICAgeXMgPSAoc2kgJiAweGZmZmYpICogcSArIGNhcnJ5OwotICAgICAgICAgICAgenMgPSAoc2kgPj4gMTYpICogcSArICh5cyA+PiAxNik7Ci0gICAgICAgICAgICBjYXJyeSA9IHpzID4+IDE2OwotICAgICAgICAgICAgeSA9ICgqYnggJiAweGZmZmYpIC0gKHlzICYgMHhmZmZmKSAtIGJvcnJvdzsKLSAgICAgICAgICAgIGJvcnJvdyA9ICh5ICYgMHgxMDAwMCkgPj4gMTY7Ci0gICAgICAgICAgICB6ID0gKCpieCA+PiAxNikgLSAoenMgJiAweGZmZmYpIC0gYm9ycm93OwotICAgICAgICAgICAgYm9ycm93ID0gKHogJiAweDEwMDAwKSA+PiAxNjsKLSAgICAgICAgICAgIFN0b3JlaW5jKGJ4LCB6LCB5KTsKLSNlbmRpZgogICAgICAgICB9CiAgICAgICAgIHdoaWxlKHN4IDw9IHN4ZSk7CiAgICAgICAgIGlmICghKmJ4ZSkgewpAQCAtMTMwNCwyMyArMTIwMywxMSBAQAogICAgICAgICBieCA9IGItPng7CiAgICAgICAgIHN4ID0gUy0+eDsKICAgICAgICAgZG8gewotI2lmZGVmIFVMTG9uZwogICAgICAgICAgICAgeXMgPSAqc3grKyArIGNhcnJ5OwogICAgICAgICAgICAgY2FycnkgPSB5cyA+PiAzMjsKICAgICAgICAgICAgIHkgPSAqYnggLSAoeXMgJiBGRkZGRkZGRikgLSBib3Jyb3c7CiAgICAgICAgICAgICBib3Jyb3cgPSB5ID4+IDMyICYgKFVMb25nKTE7CiAgICAgICAgICAgICAqYngrKyA9IChVTG9uZykoeSAmIEZGRkZGRkZGKTsKLSNlbHNlCi0gICAgICAgICAgICBzaSA9ICpzeCsrOwotICAgICAgICAgICAgeXMgPSAoc2kgJiAweGZmZmYpICsgY2Fycnk7Ci0gICAgICAgICAgICB6cyA9IChzaSA+PiAxNikgKyAoeXMgPj4gMTYpOwotICAgICAgICAgICAgY2FycnkgPSB6cyA+PiAxNjsKLSAgICAgICAgICAgIHkgPSAoKmJ4ICYgMHhmZmZmKSAtICh5cyAmIDB4ZmZmZikgLSBib3Jyb3c7Ci0gICAgICAgICAgICBib3Jyb3cgPSAoeSAmIDB4MTAwMDApID4+IDE2OwotICAgICAgICAgICAgeiA9ICgqYnggPj4gMTYpIC0gKHpzICYgMHhmZmZmKSAtIGJvcnJvdzsKLSAgICAgICAgICAgIGJvcnJvdyA9ICh6ICYgMHgxMDAwMCkgPj4gMTY7Ci0gICAgICAgICAgICBTdG9yZWluYyhieCwgeiwgeSk7Ci0jZW5kaWYKICAgICAgICAgfQogICAgICAgICB3aGlsZShzeCA8PSBzeGUpOwogICAgICAgICBieCA9IGItPng7CkBAIC0yMzE1LDcgKzIyMDIsNyBAQAogfQogCiBzdGF0aWMgY2hhciAqCi1ucnZfYWxsb2MoY2hhciAqcywgY2hhciAqKnJ2ZSwgaW50IG4pCitucnZfYWxsb2MoY29uc3QgY2hhciAqcywgY2hhciAqKnJ2ZSwgaW50IG4pCiB7CiAgICAgY2hhciAqcnYsICp0OwogCmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF93aW4uYyBiL1B5dGhvbi9keW5sb2FkX3dpbi5jCmluZGV4IGYyYzc5NmUuLjA1MDUwY2YgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9keW5sb2FkX3dpbi5jCisrKyBiL1B5dGhvbi9keW5sb2FkX3dpbi5jCkBAIC0yNCwxMiArMjQsMTAgQEAKICNkZWZpbmUgUFlEX0RFQlVHX1NVRkZJWCAiIgogI2VuZGlmCiAKLSNkZWZpbmUgU1RSSU5HSVpFMih4KSAjeAotI2RlZmluZSBTVFJJTkdJWkUoeCkgU1RSSU5HSVpFMih4KQogI2lmZGVmIFBZRF9QTEFURk9STV9UQUcKLSNkZWZpbmUgUFlEX1RBR0dFRF9TVUZGSVggUFlEX0RFQlVHX1NVRkZJWCAiLmNwIiBTVFJJTkdJWkUoUFlfTUFKT1JfVkVSU0lPTikgU1RSSU5HSVpFKFBZX01JTk9SX1ZFUlNJT04pICItIiBQWURfUExBVEZPUk1fVEFHICIucHlkIgorI2RlZmluZSBQWURfVEFHR0VEX1NVRkZJWCBQWURfREVCVUdfU1VGRklYICIuY3AiIFB5X1NUUklOR0lGWShQWV9NQUpPUl9WRVJTSU9OKSBQeV9TVFJJTkdJRlkoUFlfTUlOT1JfVkVSU0lPTikgIi0iIFBZRF9QTEFURk9STV9UQUcgIi5weWQiCiAjZWxzZQotI2RlZmluZSBQWURfVEFHR0VEX1NVRkZJWCBQWURfREVCVUdfU1VGRklYICIuY3AiIFNUUklOR0laRShQWV9NQUpPUl9WRVJTSU9OKSBTVFJJTkdJWkUoUFlfTUlOT1JfVkVSU0lPTikgIi5weWQiCisjZGVmaW5lIFBZRF9UQUdHRURfU1VGRklYIFBZRF9ERUJVR19TVUZGSVggIi5jcCIgUHlfU1RSSU5HSUZZKFBZX01BSk9SX1ZFUlNJT04pIFB5X1NUUklOR0lGWShQWV9NSU5PUl9WRVJTSU9OKSAiLnB5ZCIKICNlbmRpZgogCiAjZGVmaW5lIFBZRF9VTlRBR0dFRF9TVUZGSVggUFlEX0RFQlVHX1NVRkZJWCAiLnB5ZCIKQEAgLTQzLDcgKzQxLDcgQEAKIC8qIENhc2UgaW5zZW5zaXRpdmUgc3RyaW5nIGNvbXBhcmUsIHRvIGF2b2lkIGFueSBkZXBlbmRlbmNpZXMgb24gcGFydGljdWxhcgogICAgQyBSVEwgaW1wbGVtZW50YXRpb25zICovCiAKLXN0YXRpYyBpbnQgc3RyY2FzZWNtcCAoY2hhciAqc3RyaW5nMSwgY2hhciAqc3RyaW5nMikKK3N0YXRpYyBpbnQgc3RyY2FzZWNtcCAoY29uc3QgY2hhciAqc3RyaW5nMSwgY29uc3QgY2hhciAqc3RyaW5nMikKIHsKICAgICBpbnQgZmlyc3QsIHNlY29uZDsKIApkaWZmIC0tZ2l0IGEvUHl0aG9uL2Vycm9ycy5jIGIvUHl0aG9uL2Vycm9ycy5jCmluZGV4IGUxNTFjYWIuLjEzYWU2YjQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9lcnJvcnMuYworKysgYi9QeXRob24vZXJyb3JzLmMKQEAgLTUyLDYgKzUyLDIwIEBACiAgICAgUHlfWERFQ1JFRihvbGR0cmFjZWJhY2spOwogfQogCitzdGF0aWMgUHlPYmplY3QqCitfUHlFcnJfQ3JlYXRlRXhjZXB0aW9uKFB5T2JqZWN0ICpleGNlcHRpb24sIFB5T2JqZWN0ICp2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCB2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE5vQXJnKGV4Y2VwdGlvbik7CisgICAgfQorICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsKGV4Y2VwdGlvbiwgdmFsdWUsIE5VTEwpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIF9QeU9iamVjdF9DYWxsQXJnMShleGNlcHRpb24sIHZhbHVlKTsKKyAgICB9Cit9CisKIHZvaWQKIFB5RXJyX1NldE9iamVjdChQeU9iamVjdCAqZXhjZXB0aW9uLCBQeU9iamVjdCAqdmFsdWUpCiB7CkBAIC02Niw2ICs4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24pOwogICAgICAgICByZXR1cm47CiAgICAgfQorCiAgICAgUHlfWElOQ1JFRih2YWx1ZSk7CiAgICAgZXhjX3ZhbHVlID0gdHN0YXRlLT5leGNfdmFsdWU7CiAgICAgaWYgKGV4Y192YWx1ZSAhPSBOVUxMICYmIGV4Y192YWx1ZSAhPSBQeV9Ob25lKSB7CkBAIC03MywyOCArODgsMjEgQEAKICAgICAgICAgUHlfSU5DUkVGKGV4Y192YWx1ZSk7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMIHx8ICFQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHZhbHVlKSkgewogICAgICAgICAgICAgLyogV2UgbXVzdCBub3JtYWxpemUgdGhlIHZhbHVlIHJpZ2h0IG5vdyAqLwotICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpmaXhlZF92YWx1ZTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmaXhlZF92YWx1ZTsKIAotICAgICAgICAgICAgLyogSXNzdWUgIzIzNTcxOiBQeUV2YWxfQ2FsbE9iamVjdCgpIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGFuCisgICAgICAgICAgICAvKiBJc3N1ZSAjMjM1NzE6IGZ1bmN0aW9ucyBtdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhbgogICAgICAgICAgICAgICAgZXhjZXB0aW9uIHNldCAqLwogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIAotICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgdmFsdWUgPT0gUHlfTm9uZSkKLSAgICAgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChQeVR1cGxlX0NoZWNrKHZhbHVlKSkgewotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgYXJncyA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdmFsdWUpOwotICAgICAgICAgICAgZml4ZWRfdmFsdWUgPSBhcmdzID8KLSAgICAgICAgICAgICAgICBQeUV2YWxfQ2FsbE9iamVjdChleGNlcHRpb24sIGFyZ3MpIDogTlVMTDsKLSAgICAgICAgICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgICAgICAgICBmaXhlZF92YWx1ZSA9IF9QeUVycl9DcmVhdGVFeGNlcHRpb24oZXhjZXB0aW9uLCB2YWx1ZSk7CiAgICAgICAgICAgICBQeV9YREVDUkVGKHZhbHVlKTsKLSAgICAgICAgICAgIGlmIChmaXhlZF92YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgaWYgKGZpeGVkX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHZhbHVlID0gZml4ZWRfdmFsdWU7CiAgICAgICAgIH0KKwogICAgICAgICAvKiBBdm9pZCByZWZlcmVuY2UgY3ljbGVzIHRocm91Z2ggdGhlIGNvbnRleHQgY2hhaW4uCiAgICAgICAgICAgIFRoaXMgaXMgTyhjaGFpbiBsZW5ndGgpIGJ1dCBjb250ZXh0IGNoYWlucyBhcmUKICAgICAgICAgICAgdXN1YWxseSB2ZXJ5IHNob3J0LiBTZW5zaXRpdmUgcmVhZGVycyBtYXkgdHJ5CkBAIC0xMTAsNyArMTE4LDggQEAKICAgICAgICAgICAgICAgICBvID0gY29udGV4dDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFB5RXhjZXB0aW9uX1NldENvbnRleHQodmFsdWUsIGV4Y192YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoZXhjX3ZhbHVlKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI1OCwyNSArMjY3LDE1IEBACiAgICAgICAgICAgIGNsYXNzLgogICAgICAgICAqLwogICAgICAgICBpZiAoIWluY2xhc3MgfHwgIWlzX3N1YmNsYXNzKSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqYXJncywgKnJlczsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmaXhlZF92YWx1ZTsKIAotICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCi0gICAgICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwotICAgICAgICAgICAgZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgICAgICAgICAgICAgIGFyZ3MgPSB2YWx1ZTsKKyAgICAgICAgICAgIGZpeGVkX3ZhbHVlID0gX1B5RXJyX0NyZWF0ZUV4Y2VwdGlvbih0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAoZml4ZWRfdmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHZhbHVlKTsKIAotICAgICAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdCh0eXBlLCBhcmdzKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOwotICAgICAgICAgICAgdmFsdWUgPSByZXM7CisgICAgICAgICAgICB2YWx1ZSA9IGZpeGVkX3ZhbHVlOwogICAgICAgICB9CiAgICAgICAgIC8qIGlmIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGFjdGx5IG1hdGNoIHRoZQogICAgICAgICAgICBjbGFzcyBvZiB0aGUgdHlwZSwgYmVsaWV2ZSB0aGUgaW5zdGFuY2UKQEAgLTY5OCw1MSArNjk3LDYxIEBACiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiBQeU9iamVjdCAqCi1QeUVycl9TZXRJbXBvcnRFcnJvcihQeU9iamVjdCAqbXNnLCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnBhdGgpCitQeUVycl9TZXRJbXBvcnRFcnJvclN1YmNsYXNzKFB5T2JqZWN0ICpleGNlcHRpb24sIFB5T2JqZWN0ICptc2csCisgICAgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICpwYXRoKQogewotICAgIFB5T2JqZWN0ICphcmdzLCAqa3dhcmdzLCAqZXJyb3I7CisgICAgaW50IGlzc3ViY2xhc3M7CisgICAgUHlPYmplY3QgKmt3YXJncywgKmVycm9yOwogCi0gICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIGlzc3ViY2xhc3MgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGV4Y2VwdGlvbiwgUHlFeGNfSW1wb3J0RXJyb3IpOworICAgIGlmIChpc3N1YmNsYXNzIDwgMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGFyZ3MgPSBQeVR1cGxlX05ldygxKTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgIH0KKyAgICBlbHNlIGlmICghaXNzdWJjbGFzcykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0ZWQgYSBzdWJjbGFzcyBvZiBJbXBvcnRFcnJvciIpOwogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICBrd2FyZ3MgPSBQeURpY3RfTmV3KCk7Ci0gICAgaWYgKGt3YXJncyA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBpZiAobXNnID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGVkIGEgbWVzc2FnZSBhcmd1bWVudCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIG5hbWUgPSBQeV9Ob25lOwogICAgIH0KLQogICAgIGlmIChwYXRoID09IE5VTEwpIHsKICAgICAgICAgcGF0aCA9IFB5X05vbmU7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKG1zZyk7Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBtc2cpOwotCi0gICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGt3YXJncywgIm5hbWUiLCBuYW1lKSA8IDApCisgICAga3dhcmdzID0gUHlEaWN0X05ldygpOworICAgIGlmIChrd2FyZ3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGt3YXJncywgIm5hbWUiLCBuYW1lKSA8IDApIHsKICAgICAgICAgZ290byBkb25lOwotICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhrd2FyZ3MsICJwYXRoIiwgcGF0aCkgPCAwKQorICAgIH0KKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoa3dhcmdzLCAicGF0aCIsIHBhdGgpIDwgMCkgewogICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0gICAgZXJyb3IgPSBQeU9iamVjdF9DYWxsKFB5RXhjX0ltcG9ydEVycm9yLCBhcmdzLCBrd2FyZ3MpOworICAgIGVycm9yID0gX1B5T2JqZWN0X0Zhc3RDYWxsRGljdChleGNlcHRpb24sICZtc2csIDEsIGt3YXJncyk7CiAgICAgaWYgKGVycm9yICE9IE5VTEwpIHsKICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KChQeU9iamVjdCAqKVB5X1RZUEUoZXJyb3IpLCBlcnJvcik7CiAgICAgICAgIFB5X0RFQ1JFRihlcnJvcik7CiAgICAgfQogCiBkb25lOgotICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICBQeV9ERUNSRUYoa3dhcmdzKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIAorUHlPYmplY3QgKgorUHlFcnJfU2V0SW1wb3J0RXJyb3IoUHlPYmplY3QgKm1zZywgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICpwYXRoKQoreworICAgIHJldHVybiBQeUVycl9TZXRJbXBvcnRFcnJvclN1YmNsYXNzKFB5RXhjX0ltcG9ydEVycm9yLCBtc2csIG5hbWUsIHBhdGgpOworfQorCiB2b2lkCiBfUHlFcnJfQmFkSW50ZXJuYWxDYWxsKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKQogewpkaWZmIC0tZ2l0IGEvUHl0aG9uL2ZpbGV1dGlscy5jIGIvUHl0aG9uL2ZpbGV1dGlscy5jCmluZGV4IDIzZWVkNzEuLjdjZTNiNjMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9maWxldXRpbHMuYworKysgYi9QeXRob24vZmlsZXV0aWxzLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKICNlbmRpZgogICAgIGludCB2YWxpZDsKICAgICBfUHlfQkVHSU5fU1VQUFJFU1NfSVBICi0gICAgdmFsaWQgPSBfUHlWZXJpZnlfZmQoZmQpICYmIGlzYXR0eShmZCk7CisgICAgdmFsaWQgPSBpc2F0dHkoZmQpOwogICAgIF9QeV9FTkRfU1VQUFJFU1NfSVBICiAgICAgaWYgKCF2YWxpZCkKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CkBAIC02MTMsMTMgKzYxMyw5IEBACiAgICAgSEFORExFIGg7CiAgICAgaW50IHR5cGU7CiAKLSAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpCi0gICAgICAgIGggPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLSAgICBlbHNlIHsKLSAgICAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAotICAgICAgICBoID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmZCk7Ci0gICAgICAgIF9QeV9FTkRfU1VQUFJFU1NfSVBICi0gICAgfQorICAgIF9QeV9CRUdJTl9TVVBQUkVTU19JUEgKKyAgICBoID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmZCk7CisgICAgX1B5X0VORF9TVVBQUkVTU19JUEgKIAogICAgIGlmIChoID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CiAgICAgICAgIC8qIGVycm5vIGlzIGFscmVhZHkgc2V0IGJ5IF9nZXRfb3NmaGFuZGxlLCBidXQgd2UgYWxzbyBzZXQKQEAgLTY4Myw2ICs2NzksMTAgQEAKIHsKICAgICBpbnQgcmVzOwogCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBhc3NlcnQoUHlHSUxTdGF0ZV9DaGVjaygpKTsKKyNlbmRpZgorCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgIHJlcyA9IF9QeV9mc3RhdF9ub3JhaXNlKGZkLCBzdGF0dXMpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCkBAIC03MzgsMTIgKzczOCw2IEBACiAgICAgSEFORExFIGhhbmRsZTsKICAgICBEV09SRCBmbGFnczsKIAotICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkKSkgewotICAgICAgICBpZiAocmFpc2UpCi0gICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KICAgICBfUHlfQkVHSU5fU1VQUFJFU1NfSVBICiAgICAgaGFuZGxlID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmZCk7CiAgICAgX1B5X0VORF9TVVBQUkVTU19JUEgKQEAgLTc5NCw3ICs3ODgsNyBAQAogICAgIGludCByZXF1ZXN0OwogICAgIGludCBlcnI7CiAjZW5kaWYKLSAgICBpbnQgZmxhZ3M7CisgICAgaW50IGZsYWdzLCBuZXdfZmxhZ3M7CiAgICAgaW50IHJlczsKICNlbmRpZgogCkBAIC04MTUsMTIgKzgwOSw2IEBACiAgICAgfQogCiAjaWZkZWYgTVNfV0lORE9XUwotICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkKSkgewotICAgICAgICBpZiAocmFpc2UpCi0gICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KICAgICBfUHlfQkVHSU5fU1VQUFJFU1NfSVBICiAgICAgaGFuZGxlID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmZCk7CiAgICAgX1B5X0VORF9TVVBQUkVTU19JUEgKQEAgLTg4NSwxMCArODczLDE4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAoaW5oZXJpdGFibGUpCi0gICAgICAgIGZsYWdzICY9IH5GRF9DTE9FWEVDOwotICAgIGVsc2UKLSAgICAgICAgZmxhZ3MgfD0gRkRfQ0xPRVhFQzsKKyAgICBpZiAoaW5oZXJpdGFibGUpIHsKKyAgICAgICAgbmV3X2ZsYWdzID0gZmxhZ3MgJiB+RkRfQ0xPRVhFQzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5ld19mbGFncyA9IGZsYWdzIHwgRkRfQ0xPRVhFQzsKKyAgICB9CisKKyAgICBpZiAobmV3X2ZsYWdzID09IGZsYWdzKSB7CisgICAgICAgIC8qIEZEX0NMT0VYRUMgZmxhZyBhbHJlYWR5IHNldC9jbGVhcmVkOiBub3RoaW5nIHRvIGRvICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKwogICAgIHJlcyA9IGZjbnRsKGZkLCBGX1NFVEZELCBmbGFncyk7CiAgICAgaWYgKHJlcyA8IDApIHsKICAgICAgICAgaWYgKHJhaXNlKQpAQCAtMTE2OSwxOSArMTE2NSwxNSBAQAogICAgIGludCBlcnI7CiAgICAgaW50IGFzeW5jX2VyciA9IDA7CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGFzc2VydChQeUdJTFN0YXRlX0NoZWNrKCkpOworI2VuZGlmCisKICAgICAvKiBfUHlfcmVhZCgpIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQsIG90aGVyd2lzZSB0aGUKICAgICAgKiBjYWxsZXIgbWF5IHRoaW5rIHRoYXQgcmVhZCgpIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBhbmQgdGhlIHNpZ25hbAogICAgICAqIGhhbmRsZXIgcmFpc2VkIGFuIGV4Y2VwdGlvbi4gKi8KICAgICBhc3NlcnQoIVB5RXJyX09jY3VycmVkKCkpOwogCi0gICAgaWYgKCFfUHlWZXJpZnlfZmQoZmQpKSB7Ci0gICAgICAgIC8qIHNhdmUvcmVzdG9yZSBlcnJubyBiZWNhdXNlIFB5RXJyX1NldEZyb21FcnJubygpIGNhbiBtb2RpZnkgaXQgKi8KLSAgICAgICAgZXJyID0gZXJybm87Ci0gICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLSAgICAgICAgZXJybm8gPSBlcnI7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KICNpZmRlZiBNU19XSU5ET1dTCiAgICAgaWYgKGNvdW50ID4gSU5UX01BWCkgewogICAgICAgICAvKiBPbiBXaW5kb3dzLCB0aGUgY291bnQgcGFyYW1ldGVyIG9mIHJlYWQoKSBpcyBhbiBpbnQgKi8KQEAgLTEyMzUsMTYgKzEyMjcsNiBAQAogICAgIGludCBlcnI7CiAgICAgaW50IGFzeW5jX2VyciA9IDA7CiAKLSAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpIHsKLSAgICAgICAgaWYgKGdpbF9oZWxkKSB7Ci0gICAgICAgICAgICAvKiBzYXZlL3Jlc3RvcmUgZXJybm8gYmVjYXVzZSBQeUVycl9TZXRGcm9tRXJybm8oKSBjYW4gbW9kaWZ5IGl0ICovCi0gICAgICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLSAgICAgICAgICAgIGVycm5vID0gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KICAgICBfUHlfQkVHSU5fU1VQUFJFU1NfSVBICiAjaWZkZWYgTVNfV0lORE9XUwogICAgIGlmIChjb3VudCA+IDMyNzY3ICYmIGlzYXR0eShmZCkpIHsKQEAgLTEzMjQsNiArMTMwNiwxMCBAQAogUHlfc3NpemVfdAogX1B5X3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCiB7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBhc3NlcnQoUHlHSUxTdGF0ZV9DaGVjaygpKTsKKyNlbmRpZgorCiAgICAgLyogX1B5X3dyaXRlKCkgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYW4gZXhjZXB0aW9uIHNldCwgb3RoZXJ3aXNlIHRoZQogICAgICAqIGNhbGxlciBtYXkgdGhpbmsgdGhhdCB3cml0ZSgpIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBhbmQgdGhlIHNpZ25hbAogICAgICAqIGhhbmRsZXIgcmFpc2VkIGFuIGV4Y2VwdGlvbi4gKi8KQEAgLTE0NzMsMTAgKzE0NTksOSBAQAogICAgIERXT1JEIGZ0eXBlOwogI2VuZGlmCiAKLSAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpIHsKLSAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgYXNzZXJ0KFB5R0lMU3RhdGVfQ2hlY2soKSk7CisjZW5kaWYKIAogI2lmZGVmIE1TX1dJTkRPV1MKICAgICBfUHlfQkVHSU5fU1VQUFJFU1NfSVBICkBAIC0xNjAwLDg0ICsxNTg1LDMgQEAKICAgICByZXR1cm4gLTE7CiB9CiAjZW5kaWYKLQotI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTQwMCAmJiBfTVNDX1ZFUiA8IDE5MDAKLS8qIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBvZiBfUHlWZXJpZnlfZmQgd2hpbGUgdHJhbnNpdGlvbmluZyB0bwotICogTVNWQyAxNC4wLiBUaGlzIHNob3VsZCBldmVudHVhbGx5IGJlIHJlbW92ZWQuIChpc3N1ZTIzNTI0KQotICovCi0KLS8qIE1pY3Jvc29mdCBDUlQgaW4gVlMyMDA1IGFuZCBoaWdoZXIgd2lsbCB2ZXJpZnkgdGhhdCBhIGZpbGVoYW5kbGUgaXMKLSAqIHZhbGlkIGFuZCByYWlzZSBhbiBhc3NlcnRpb24gaWYgaXQgaXNuJ3QuCi0gKiBOb3JtYWxseSwgYW4gaW52YWxpZCBmZCBpcyBsaWtlbHkgdG8gYmUgYSBDIHByb2dyYW0gZXJyb3IgYW5kIHRoZXJlZm9yZQotICogYW4gYXNzZXJ0aW9uIGNhbiBiZSB1c2VmdWwsIGJ1dCBpdCBkb2VzIGNvbnRyYWRpY3QgdGhlIFBPU0lYIHN0YW5kYXJkCi0gKiB3aGljaCBmb3Igd3JpdGUoMikgc3RhdGVzOgotICogICAgIk90aGVyd2lzZSwgLTEgc2hhbGwgYmUgcmV0dXJuZWQgYW5kIGVycm5vIHNldCB0byBpbmRpY2F0ZSB0aGUgZXJyb3IuIgotICogICAgIltFQkFERl0gVGhlIGZpbGRlcyBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3Igb3BlbiBmb3IKLSAqICAgICB3cml0aW5nLiIKLSAqIEZ1cnRoZXJtb3JlLCBweXRob24gYWxsb3dzIHRoZSB1c2VyIHRvIGVudGVyIGFueSBvbGQgaW50ZWdlcgotICogYXMgYSBmZCBhbmQgc2hvdWxkIG1lcmVseSByYWlzZSBhIHB5dGhvbiBleGNlcHRpb24gb24gZXJyb3IuCi0gKiBUaGUgTWljcm9zb2Z0IENSVCBkb2Vzbid0IHByb3ZpZGUgYW4gb2ZmaWNpYWwgd2F5IHRvIGNoZWNrIGZvciB0aGUKLSAqIHZhbGlkaXR5IG9mIGEgZmlsZSBkZXNjcmlwdG9yLCBidXQgd2UgY2FuIGVtdWxhdGUgaXRzIGludGVybmFsIGJlaGF2aW91cgotICogYnkgdXNpbmcgdGhlIGV4cG9ydGVkIF9fcGluZm8gZGF0YSBtZW1iZXIgYW5kIGtub3dsZWRnZSBvZiB0aGUKLSAqIGludGVybmFsIHN0cnVjdHVyZXMgaW52b2x2ZWQuCi0gKiBUaGUgc3RydWN0dXJlcyBiZWxvdyBtdXN0IGJlIHVwZGF0ZWQgZm9yIGVhY2ggdmVyc2lvbiBvZiB2aXN1YWwgc3R1ZGlvCi0gKiBhY2NvcmRpbmcgdG8gdGhlIGZpbGUgaW50ZXJuYWwuaCBpbiB0aGUgQ1JUIHNvdXJjZSwgdW50aWwgTVMgY29tZXMKLSAqIHVwIHdpdGggYSBsZXNzIGhhY2t5IHdheSB0byBkbyB0aGlzLgotICogKGFsbCBvZiB0aGlzIGlzIHRvIGF2b2lkIGdsb2JhbGx5IG1vZGlmeWluZyB0aGUgQ1JUIGJlaGF2aW91ciB1c2luZwotICogX3NldF9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyKCkgYW5kIF9DcnRTZXRSZXBvcnRNb2RlKCkpCi0gKi8KLS8qIFRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGlzIGRldGVybWluZWQgYXQgcnVudGltZS4KLSAqIE9ubHkgdGhlIGZpcnN0IGl0ZW1zIG11c3QgYmUgcHJlc2VudC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludHB0cl90IG9zZmhuZDsKLSAgICBjaGFyIG9zZmlsZTsKLX0gbXlfaW9pbmZvOwotCi1leHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpIGNoYXIgKiBfX3Bpb2luZm9bXTsKLSNkZWZpbmUgSU9JTkZPX0wyRSA1Ci0jZGVmaW5lIElPSU5GT19BUlJBWVMgNjQKLSNkZWZpbmUgSU9JTkZPX0FSUkFZX0VMVFMgICAoMSA8PCBJT0lORk9fTDJFKQotI2RlZmluZSBfTkhBTkRMRV8gICAgICAgICAgIChJT0lORk9fQVJSQVlTICogSU9JTkZPX0FSUkFZX0VMVFMpCi0jZGVmaW5lIEZPUEVOIDB4MDEKLSNkZWZpbmUgX05PX0NPTlNPTEVfRklMRU5PIChpbnRwdHJfdCktMgotCi0vKiBUaGlzIGZ1bmN0aW9uIGVtdWxhdGVzIHdoYXQgdGhlIHdpbmRvd3MgQ1JUIGRvZXMgdG8gdmFsaWRhdGUgZmlsZSBoYW5kbGVzICovCi1pbnQKLV9QeVZlcmlmeV9mZChpbnQgZmQpCi17Ci0gICAgY29uc3QgaW50IGkxID0gZmQgPj4gSU9JTkZPX0wyRTsKLSAgICBjb25zdCBpbnQgaTIgPSBmZCAmICgoMSA8PCBJT0lORk9fTDJFKSAtIDEpOwotCi0gICAgc3RhdGljIHNpemVfdCBzaXplb2ZfaW9pbmZvID0gMDsKLQotICAgIC8qIERldGVybWluZSB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGlvaW5mbyBzdHJ1Y3R1cmUsCi0gICAgICogYXMgdXNlZCBieSB0aGUgQ1JUIGxvYWRlZCBpbiBtZW1vcnkKLSAgICAgKi8KLSAgICBpZiAoc2l6ZW9mX2lvaW5mbyA9PSAwICYmIF9fcGlvaW5mb1swXSAhPSBOVUxMKSB7Ci0gICAgICAgIHNpemVvZl9pb2luZm8gPSBfbXNpemUoX19waW9pbmZvWzBdKSAvIElPSU5GT19BUlJBWV9FTFRTOwotICAgIH0KLSAgICBpZiAoc2l6ZW9mX2lvaW5mbyA9PSAwKSB7Ci0gICAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uLi4gKi8KLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIC8qIFNlZSB0aGF0IGl0IGlzbid0IGEgc3BlY2lhbCBDTEVBUiBmaWxlbm8gKi8KLSAgICBpZiAoZmQgIT0gX05PX0NPTlNPTEVfRklMRU5PKSB7Ci0gICAgICAgIC8qIE1pY3Jvc29mdCBDUlQgd291bGQgY2hlY2sgdGhhdCAwPD1mZDxfbmhhbmRsZSBidXQgd2UgY2FuJ3QgZG8gdGhhdC4gIEluc3RlYWQKLSAgICAgICAgICogd2UgY2hlY2sgcG9pbnRlciB2YWxpZGl0eSBhbmQgb3RoZXIgaW5mbwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKDAgPD0gaTEgJiYgaTEgPCBJT0lORk9fQVJSQVlTICYmIF9fcGlvaW5mb1tpMV0gIT0gTlVMTCkgewotICAgICAgICAgICAgLyogZmluYWxseSwgY2hlY2sgdGhhdCB0aGUgZmlsZSBpcyBvcGVuICovCi0gICAgICAgICAgICBteV9pb2luZm8qIGluZm8gPSAobXlfaW9pbmZvKikoX19waW9pbmZvW2kxXSArIGkyICogc2l6ZW9mX2lvaW5mbyk7Ci0gICAgICAgICAgICBpZiAoaW5mby0+b3NmaWxlICYgRk9QRU4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgZmFpbDoKLSAgICBlcnJubyA9IEVCQURGOwotICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNDAwICYmIF9NU0NfVkVSIDwgMTkwMCAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Zvcm1hdHRlcl91bmljb2RlLmMgYi9QeXRob24vZm9ybWF0dGVyX3VuaWNvZGUuYwppbmRleCBlN2M2YTRmLi5kYjlmNWI4IDEwMDY0NAotLS0gYS9QeXRob24vZm9ybWF0dGVyX3VuaWNvZGUuYworKysgYi9QeXRob24vZm9ybWF0dGVyX3VuaWNvZGUuYwpAQCAtNDgsMTYgKzQ4LDE3IEBACiAgICAgcmV0dXJucyAtMSBvbiBlcnJvci4KICovCiBzdGF0aWMgaW50Ci1nZXRfaW50ZWdlcihQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpwb3MsIFB5X3NzaXplX3QgZW5kLAorZ2V0X2ludGVnZXIoUHlPYmplY3QgKnN0ciwgUHlfc3NpemVfdCAqcHBvcywgUHlfc3NpemVfdCBlbmQsCiAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpyZXN1bHQpCiB7Ci0gICAgUHlfc3NpemVfdCBhY2N1bXVsYXRvciwgZGlnaXR2YWw7CisgICAgUHlfc3NpemVfdCBhY2N1bXVsYXRvciwgZGlnaXR2YWwsIHBvcyA9ICpwcG9zOwogICAgIGludCBudW1kaWdpdHM7CisgICAgaW50IGtpbmQgPSBQeVVuaWNvZGVfS0lORChzdHIpOworICAgIHZvaWQgKmRhdGEgPSBQeVVuaWNvZGVfREFUQShzdHIpOworCiAgICAgYWNjdW11bGF0b3IgPSBudW1kaWdpdHMgPSAwOwotICAgIGZvciAoOzsoKnBvcykrKywgbnVtZGlnaXRzKyspIHsKLSAgICAgICAgaWYgKCpwb3MgPj0gZW5kKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRpZ2l0dmFsID0gUHlfVU5JQ09ERV9UT0RFQ0lNQUwoUHlVbmljb2RlX1JFQURfQ0hBUihzdHIsICpwb3MpKTsKKyAgICBmb3IgKDsgcG9zIDwgZW5kOyBwb3MrKywgbnVtZGlnaXRzKyspIHsKKyAgICAgICAgZGlnaXR2YWwgPSBQeV9VTklDT0RFX1RPREVDSU1BTChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBwb3MpKTsKICAgICAgICAgaWYgKGRpZ2l0dmFsIDwgMCkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAvKgpAQCAtNjksMTAgKzcwLDEyIEBACiAgICAgICAgIGlmIChhY2N1bXVsYXRvciA+IChQWV9TU0laRV9UX01BWCAtIGRpZ2l0dmFsKSAvIDEwKSB7CiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9vIG1hbnkgZGVjaW1hbCBkaWdpdHMgaW4gZm9ybWF0IHN0cmluZyIpOworICAgICAgICAgICAgKnBwb3MgPSBwb3M7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgYWNjdW11bGF0b3IgPSBhY2N1bXVsYXRvciAqIDEwICsgZGlnaXR2YWw7CiAgICAgfQorICAgICpwcG9zID0gcG9zOwogICAgICpyZXN1bHQgPSBhY2N1bXVsYXRvcjsKICAgICByZXR1cm4gbnVtZGlnaXRzOwogfQpAQCAtMTUwLDkgKzE1MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGVmYXVsdF9hbGlnbikKIHsKICAgICBQeV9zc2l6ZV90IHBvcyA9IHN0YXJ0OworICAgIGludCBraW5kID0gUHlVbmljb2RlX0tJTkQoZm9ybWF0X3NwZWMpOworICAgIHZvaWQgKmRhdGEgPSBQeVVuaWNvZGVfREFUQShmb3JtYXRfc3BlYyk7CiAgICAgLyogZW5kLXBvcyBpcyB1c2VkIHRocm91Z2hvdXQgdGhpcyBjb2RlIHRvIHNwZWNpZnkgdGhlIGxlbmd0aCBvZgogICAgICAgIHRoZSBpbnB1dCBzdHJpbmcgKi8KLSNkZWZpbmUgUkVBRF9zcGVjKGluZGV4KSBQeVVuaWNvZGVfUkVBRF9DSEFSKGZvcm1hdF9zcGVjLCBpbmRleCkKKyNkZWZpbmUgUkVBRF9zcGVjKGluZGV4KSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpbmRleCkKIAogICAgIFB5X3NzaXplX3QgY29uc3VtZWQ7CiAgICAgaW50IGFsaWduX3NwZWNpZmllZCA9IDA7CkBAIC00MDIsMTMgKzQwNywxNSBAQAogICAgICAgICAgICAgIFB5X3NzaXplX3QgKm5fcmVtYWluZGVyLCBpbnQgKmhhc19kZWNpbWFsKQogewogICAgIFB5X3NzaXplX3QgcmVtYWluZGVyOworICAgIGludCBraW5kID0gUHlVbmljb2RlX0tJTkQocyk7CisgICAgdm9pZCAqZGF0YSA9IFB5VW5pY29kZV9EQVRBKHMpOwogCi0gICAgd2hpbGUgKHBvczxlbmQgJiYgUHlfSVNESUdJVChQeVVuaWNvZGVfUkVBRF9DSEFSKHMsIHBvcykpKQorICAgIHdoaWxlIChwb3M8ZW5kICYmIFB5X0lTRElHSVQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgcG9zKSkpCiAgICAgICAgICsrcG9zOwogICAgIHJlbWFpbmRlciA9IHBvczsKIAogICAgIC8qIERvZXMgcmVtYWluZGVyIHN0YXJ0IHdpdGggYSBkZWNpbWFsIHBvaW50PyAqLwotICAgICpoYXNfZGVjaW1hbCA9IHBvczxlbmQgJiYgUHlVbmljb2RlX1JFQURfQ0hBUihzLCByZW1haW5kZXIpID09ICcuJzsKKyAgICAqaGFzX2RlY2ltYWwgPSBwb3M8ZW5kICYmIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIHJlbWFpbmRlcikgPT0gJy4nOwogCiAgICAgLyogU2tpcCB0aGUgZGVjaW1hbCBwb2ludC4gKi8KICAgICBpZiAoKmhhc19kZWNpbWFsKQpAQCAtNjU2LDcgKzY2Myw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjaGFyIG5vX2dyb3VwaW5nWzFdID0ge0NIQVJfTUFYfTsKK3N0YXRpYyBjb25zdCBjaGFyIG5vX2dyb3VwaW5nWzFdID0ge0NIQVJfTUFYfTsKIAogLyogRmluZCB0aGUgZGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIocz8pLCB0aG91c2FuZHNfc2VwYXJhdG9yKHM/KSwgYW5kCiAgICBncm91cGluZyBkZXNjcmlwdGlvbiwgZWl0aGVyIGZvciB0aGUgY3VycmVudCBsb2NhbGUgaWYgdHlwZSBpcwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Zyb3plbi5jIGIvUHl0aG9uL2Zyb3plbi5jCmluZGV4IDY3NmYzOTUuLjdlMDRmM2MgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mcm96ZW4uYworKysgYi9QeXRob24vZnJvemVuLmMKQEAgLTE0LDE3ICsxNCwxNSBAQAogICAgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGZyb20gTV9fX21haW5fXy5jLiAqLwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBNX19faGVsbG9fX1tdID0gewotICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLAotICAgIDAsNjQsMCwwLDAsMTE1LDIwLDAsMCwwLDEwMCwyLDAsOTAsMSwwLAotICAgIDEwMSwyLDAsMTAwLDAsMCwxMzEsMSwwLDEsMTAwLDEsMCw4Myw0MCwzLAotICAgIDAsMCwwLDExNywxMiwwLDAsMCw3MiwxMDEsMTA4LDEwOCwxMTEsMzIsMTE5LDExMSwKLSAgICAxMTQsMTA4LDEwMCwzMyw3OCw4NCw0MCwzLDAsMCwwLDExNyw0LDAsMCwwLAotICAgIDg0LDExNCwxMTcsMTAxLDExNywxMSwwLDAsMCwxMDUsMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwKLSAgICAxMDUsMTIyLDEwMSwxMDAsMTE3LDUsMCwwLDAsMTEyLDExNCwxMDUsMTEwLDExNiw0MCwwLAotICAgIDAsMCwwLDQwLDAsMCwwLDAsNDAsMCwwLDAsMCwxMTcsNywwLAotICAgIDAsMCwxMDIsMTA4LDk3LDEwMyw0NiwxMTIsMTIxLDExNyw4LDAsMCwwLDYwLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDYyLDEsMCwwLDAsMTE1LDIsMCwwLDAsNiwKLSAgICAxLAorICAgIDIyNywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDY0LDAsMCwwLDExNSwxNiwwLDAsMCwxMDAsMCw5MCwwLDEwMSwxLAorICAgIDEwMCwxLDEzMSwxLDEsMCwxMDAsMiw4MywwLDQxLDMsODQsMTIyLDEyLDcyLAorICAgIDEwMSwxMDgsMTA4LDExMSwzMiwxMTksMTExLDExNCwxMDgsMTAwLDMzLDc4LDQxLDIsMjE4LDExLAorICAgIDEwNSwxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDEwMCwyMTgsNSwxMTIsMTE0LDEwNSwKKyAgICAxMTAsMTE2LDE2OSwwLDExNCwzLDAsMCwwLDExNCwzLDAsMCwwLDI1MCwyMiwKKyAgICA0Niw0Nyw4NCwxMTEsMTExLDEwOCwxMTUsNDcsMTAyLDExNCwxMDEsMTAxLDEyMiwxMDEsNDcsMTAyLAorICAgIDEwOCw5NywxMDMsNDYsMTEyLDEyMSwyMTgsOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw2MiwKKyAgICAxLDAsMCwwLDExNSwyLDAsMCwwLDQsMSwKIH07CiAKICNkZWZpbmUgU0laRSAoaW50KXNpemVvZihNX19faGVsbG9fXykKZGlmZiAtLWdpdCBhL1B5dGhvbi9mcm96ZW5tYWluLmMgYi9QeXRob24vZnJvemVubWFpbi5jCmluZGV4IGRlOGJkMzUuLjc2OWIzM2QgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mcm96ZW5tYWluLmMKKysrIGIvUHl0aG9uL2Zyb3plbm1haW4uYwpAQCAtOTksNyArOTksOSBAQAogI2lmZGVmIE1TX1dJTkRPV1MKICAgICBQeVdpbkZyZWV6ZV9FeGVUZXJtKCk7CiAjZW5kaWYKLSAgICBQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgIHN0cyA9IDEyMDsKKyAgICB9CiAKIGVycm9yOgogICAgIFB5TWVtX1Jhd0ZyZWUoYXJndl9jb3B5KTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9mdXR1cmUuYyBiL1B5dGhvbi9mdXR1cmUuYwppbmRleCAxNjNmODdmLi43NWYyMTA3IDEwMDY0NAotLS0gYS9QeXRob24vZnV0dXJlLmMKKysrIGIvUHl0aG9uL2Z1dHVyZS5jCkBAIC03OSw3ICs3OSwxMCBAQAogCiAgICAgaSA9IDA7CiAgICAgZmlyc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQobW9kLT52Lk1vZHVsZS5ib2R5LCBpKTsKLSAgICBpZiAoZmlyc3QtPmtpbmQgPT0gRXhwcl9raW5kICYmIGZpcnN0LT52LkV4cHIudmFsdWUtPmtpbmQgPT0gU3RyX2tpbmQpCisgICAgaWYgKGZpcnN0LT5raW5kID09IEV4cHJfa2luZAorICAgICAgICAmJiAoZmlyc3QtPnYuRXhwci52YWx1ZS0+a2luZCA9PSBTdHJfa2luZAorICAgICAgICAgICAgfHwgKGZpcnN0LT52LkV4cHIudmFsdWUtPmtpbmQgPT0gQ29uc3RhbnRfa2luZAorICAgICAgICAgICAgICAgICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KGZpcnN0LT52LkV4cHIudmFsdWUtPnYuQ29uc3RhbnQudmFsdWUpKSkpCiAgICAgICAgIGkrKzsKIAogCmRpZmYgLS1naXQgYS9QeXRob24vZ2V0YXJncy5jIGIvUHl0aG9uL2dldGFyZ3MuYwppbmRleCA4YWFiMDY3Li4wODU0Y2M0IDEwMDY0NAotLS0gYS9QeXRob24vZ2V0YXJncy5jCisrKyBiL1B5dGhvbi9nZXRhcmdzLmMKQEAgLTE4LDE2ICsxOCwyNiBAQAogaW50IFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCk7CiAKK2ludCBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX1B5QXJnX1BhcnNlciAqLCAuLi4pOworaW50IF9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9QeUFyZ19QYXJzZXIgKiwgdmFfbGlzdCk7CisKICNpZmRlZiBIQVZFX0RFQ0xTUEVDX0RMTAogLyogRXhwb3J0IGZ1bmN0aW9ucyAqLwotUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19QYXJzZV9TaXplVChQeU9iamVjdCAqLCBjaGFyICosIC4uLik7Ci1QeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQoUHlPYmplY3QgKiwgY2hhciAqLCAuLi4pOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19QYXJzZV9TaXplVChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIC4uLik7CitQeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCAuLi4pOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlfQnVpbGRWYWx1ZV9TaXplVChjb25zdCBjaGFyICosIC4uLik7Ci1QeUFQSV9GVU5DKGludCkgX1B5QXJnX1ZhUGFyc2VfU2l6ZVQoUHlPYmplY3QgKiwgY2hhciAqLCB2YV9saXN0KTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwogUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCk7CisKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdF9TaXplVChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX1B5QXJnX1BhcnNlciAqLCAuLi4pOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3RfU2l6ZVQoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9QeUFyZ19QYXJzZXIgKiwgdmFfbGlzdCk7CiAjZW5kaWYKIAogI2RlZmluZSBGTEFHX0NPTVBBVCAxCkBAIC01NiwxOCArNjYsMjAgQEAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyBpbnQgdmdldGFyZ3MxKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCAqLCBpbnQpOwogc3RhdGljIHZvaWQgc2V0ZXJyb3IoUHlfc3NpemVfdCwgY29uc3QgY2hhciAqLCBpbnQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGNoYXIgKmNvbnZlcnRpdGVtKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LCBpbnQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKLXN0YXRpYyBjaGFyICpjb252ZXJ0dHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqLCBjaGFyICosIHNpemVfdCwgaW50LCBmcmVlbGlzdF90ICopOwotc3RhdGljIGNoYXIgKmNvbnZlcnRzaW1wbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsIGNoYXIgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKLXN0YXRpYyBQeV9zc2l6ZV90IGNvbnZlcnRidWZmZXIoUHlPYmplY3QgKiwgdm9pZCAqKnAsIGNoYXIgKiopOwotc3RhdGljIGludCBnZXRidWZmZXIoUHlPYmplY3QgKiwgUHlfYnVmZmVyICosIGNoYXIqKik7CitzdGF0aWMgY29uc3QgY2hhciAqY29udmVydGl0ZW0oUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsIGludCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBmcmVlbGlzdF90ICopOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnZlcnR0dXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICosIGNoYXIgKiwgc2l6ZV90LCBpbnQsIGZyZWVsaXN0X3QgKik7CitzdGF0aWMgY29uc3QgY2hhciAqY29udmVydHNpbXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBmcmVlbGlzdF90ICopOworc3RhdGljIFB5X3NzaXplX3QgY29udmVydGJ1ZmZlcihQeU9iamVjdCAqLCB2b2lkICoqcCwgY29uc3QgY2hhciAqKik7CitzdGF0aWMgaW50IGdldGJ1ZmZlcihQeU9iamVjdCAqLCBQeV9idWZmZXIgKiwgY29uc3QgY2hhcioqKTsKIAogc3RhdGljIGludCB2Z2V0YXJnc2tleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0ICosIGludCk7Ci1zdGF0aWMgY2hhciAqc2tpcGl0ZW0oY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQpOworc3RhdGljIGludCB2Z2V0YXJnc2tleXdvcmRzZmFzdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICosIHZhX2xpc3QgKiwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpza2lwaXRlbShjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCk7CiAKIGludAogUHlBcmdfUGFyc2UoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQpAQCAtODIsNyArOTQsNyBAQAogfQogCiBpbnQKLV9QeUFyZ19QYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCAuLi4pCitfUHlBcmdfUGFyc2VfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogICAgIGludCByZXR2YWw7CiAgICAgdmFfbGlzdCB2YTsKQEAgLTEwNyw3ICsxMTksNyBAQAogfQogCiBpbnQKLV9QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIC4uLikKK19QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKICAgICBpbnQgcmV0dmFsOwogICAgIHZhX2xpc3QgdmE7CkBAIC0xMzAsNyArMTQyLDcgQEAKIH0KIAogaW50Ci1fUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQorX1B5QXJnX1ZhUGFyc2VfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKIHsKICAgICB2YV9saXN0IGx2YTsKIApAQCAtMjA4LDcgKzIyMCw3IEBACiAgICAgaW50IGVuZGZtdCA9IDA7CiAgICAgY29uc3QgY2hhciAqZm9ybWF0c2F2ZSA9IGZvcm1hdDsKICAgICBQeV9zc2l6ZV90IGksIGxlbjsKLSAgICBjaGFyICptc2c7CisgICAgY29uc3QgY2hhciAqbXNnOwogICAgIGludCBjb21wYXQgPSBmbGFncyAmIEZMQUdfQ09NUEFUOwogICAgIGZyZWVsaXN0ZW50cnlfdCBzdGF0aWNfZW50cmllc1tTVEFUSUNfRlJFRUxJU1RfRU5UUklFU107CiAgICAgZnJlZWxpc3RfdCBmcmVlbGlzdDsKQEAgLTM5NCw3ICs0MDYsMTIgQEAKICAgICAgICAgUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChwIC0gYnVmKSwgIiAlLjI1NnMiLCBtc2cpOwogICAgICAgICBtZXNzYWdlID0gYnVmOwogICAgIH0KLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtZXNzYWdlKTsKKyAgICBpZiAobXNnWzBdID09ICcoJykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsIG1lc3NhZ2UpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbWVzc2FnZSk7CisgICAgfQogfQogCiAKQEAgLTQxNiw3ICs0MzMsNyBAQAogICAgICAgYW5kIG1zZ2J1ZiBpcyByZXR1cm5lZC4KICovCiAKLXN0YXRpYyBjaGFyICoKK3N0YXRpYyBjb25zdCBjaGFyICoKIGNvbnZlcnR0dXBsZShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgICBpbnQgKmxldmVscywgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSwgaW50IHRvcGxldmVsLAogICAgICAgICAgICAgIGZyZWVsaXN0X3QgKmZyZWVsaXN0KQpAQCAtNDc0LDcgKzQ5MSw3IEBACiAKICAgICBmb3JtYXQgPSAqcF9mb3JtYXQ7CiAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICBjaGFyICptc2c7CisgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgUHlPYmplY3QgKml0ZW07CiAgICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXJnLCBpKTsKICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgewpAQCAtNTAxLDExICs1MTgsMTEgQEAKIAogLyogQ29udmVydCBhIHNpbmdsZSBpdGVtLiAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBjb252ZXJ0aXRlbShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgIGludCAqbGV2ZWxzLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBmcmVlbGlzdF90ICpmcmVlbGlzdCkKIHsKLSAgICBjaGFyICptc2c7CisgICAgY29uc3QgY2hhciAqbXNnOwogICAgIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKIAogICAgIGlmICgqZm9ybWF0ID09ICcoJyAvKiAnKScgKi8pIHsKQEAgLTUzMCw3ICs1NDcsNyBAQAogCiAvKiBGb3JtYXQgYW4gZXJyb3IgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgY29udmVydHNpbXBsZSgpLiAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBjb252ZXJ0ZXJyKGNvbnN0IGNoYXIgKmV4cGVjdGVkLCBQeU9iamVjdCAqYXJnLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplKQogewogICAgIGFzc2VydChleHBlY3RlZCAhPSBOVUxMKTsKQEAgLTU3Miw3ICs1ODksNyBAQAogICAgV2hlbiB5b3UgYWRkIG5ldyBmb3JtYXQgY29kZXMsIHBsZWFzZSBkb24ndCBmb3JnZXQgcG9vciBza2lwaXRlbSgpIGJlbG93LgogKi8KIAotc3RhdGljIGNoYXIgKgorc3RhdGljIGNvbnN0IGNoYXIgKgogY29udmVydHNpbXBsZShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgICAgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSwgZnJlZWxpc3RfdCAqZnJlZWxpc3QpCiB7CkBAIC03NTIsMTQgKzc2OSwxMyBAQAogICAgICAgICBicmVhazsKICAgICB9CiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIGNhc2UgJ0wnOiB7LyogUFlfTE9OR19MT05HICovCi0gICAgICAgIFBZX0xPTkdfTE9ORyAqcCA9IHZhX2FyZyggKnBfdmEsIFBZX0xPTkdfTE9ORyAqICk7Ci0gICAgICAgIFBZX0xPTkdfTE9ORyBpdmFsOworICAgIGNhc2UgJ0wnOiB7LyogbG9uZyBsb25nICovCisgICAgICAgIGxvbmcgbG9uZyAqcCA9IHZhX2FyZyggKnBfdmEsIGxvbmcgbG9uZyAqICk7CisgICAgICAgIGxvbmcgbG9uZyBpdmFsOwogICAgICAgICBpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKICAgICAgICAgICAgIFJFVFVSTl9FUlJfT0NDVVJSRUQ7CiAgICAgICAgIGl2YWwgPSBQeUxvbmdfQXNMb25nTG9uZyhhcmcpOwotICAgICAgICBpZiAoaXZhbCA9PSAoUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGlmIChpdmFsID09IChsb25nIGxvbmcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIFJFVFVSTl9FUlJfT0NDVVJSRUQ7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgICpwID0gaXZhbDsKQEAgLTc2Nyw4ICs3ODMsOCBAQAogICAgIH0KIAogICAgIGNhc2UgJ0snOiB7IC8qIGxvbmcgbG9uZyBzaXplZCBiaXRmaWVsZCAqLwotICAgICAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKnAgPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKTsKLSAgICAgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIGl2YWw7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgbG9uZyBsb25nICopOworICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgaXZhbDsKICAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhhcmcpKQogICAgICAgICAgICAgaXZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKGFyZyk7CiAgICAgICAgIGVsc2UKQEAgLTc3Niw3ICs3OTIsNiBAQAogICAgICAgICAqcCA9IGl2YWw7CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSNlbmRpZgogCiAgICAgY2FzZSAnZic6IHsvKiBmbG9hdCAqLwogICAgICAgICBmbG9hdCAqcCA9IHZhX2FyZygqcF92YSwgZmxvYXQgKik7CkBAIC04NTcsNyArODcyLDcgQEAKIAogICAgIGNhc2UgJ3knOiB7LyogYW55IGJ5dGVzLWxpa2Ugb2JqZWN0ICovCiAgICAgICAgIHZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLSAgICAgICAgY2hhciAqYnVmOworICAgICAgICBjb25zdCBjaGFyICpidWY7CiAgICAgICAgIFB5X3NzaXplX3QgY291bnQ7CiAgICAgICAgIGlmICgqZm9ybWF0ID09ICcqJykgewogICAgICAgICAgICAgaWYgKGdldGJ1ZmZlcihhcmcsIChQeV9idWZmZXIqKXAsICZidWYpIDwgMCkKQEAgLTkwNCw3ICs5MTksNyBAQAogICAgICAgICAgICAgICAgIFB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywgc2FyZywgbGVuLCAxLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgeyAvKiBhbnkgYnl0ZXMtbGlrZSBvYmplY3QgKi8KLSAgICAgICAgICAgICAgICBjaGFyICpidWY7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmOwogICAgICAgICAgICAgICAgIGlmIChnZXRidWZmZXIoYXJnLCBwLCAmYnVmKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKGJ1ZiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogICAgICAgICAgICAgfQpAQCAtOTM0LDcgKzk0OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsgLyogcmVhZC1vbmx5IGJ5dGVzLWxpa2Ugb2JqZWN0ICovCiAgICAgICAgICAgICAgICAgLyogWFhYIFJlYWxseT8gKi8KLSAgICAgICAgICAgICAgICBjaGFyICpidWY7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmOwogICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7CiAgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CkBAIC0xMDUxLDM1ICsxMDY2LDI1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoIihBc0NoYXJCdWZmZXIgZmFpbGVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgUHlPYmplY3QgKnU7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgb2JqZWN0IHRvIFVuaWNvZGUgKi8KLSAgICAgICAgICAgIHUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChhcmcpOwotICAgICAgICAgICAgaWYgKHUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKLSAgICAgICAgICAgICAgICAgICAgInN0cmluZyBvciB1bmljb2RlIG9yIHRleHQgYnVmZmVyIiwKLSAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCisgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CiAgICAgICAgICAgICAvKiBFbmNvZGUgb2JqZWN0OyB1c2UgZGVmYXVsdCBlcnJvciBoYW5kbGluZyAqLwotICAgICAgICAgICAgcyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwKKyAgICAgICAgICAgIHMgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKGFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodSk7CiAgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIoZW5jb2RpbmcgZmFpbGVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotICAgICAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrKHMpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAotICAgICAgICAgICAgICAgICAgICAiKGVuY29kZXIgZmFpbGVkIHRvIHJldHVybiBieXRlcykiLAotICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhzKSk7CiAgICAgICAgICAgICBzaXplID0gUHlCeXRlc19HRVRfU0laRShzKTsKICAgICAgICAgICAgIHB0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHMpOwogICAgICAgICAgICAgaWYgKHB0ciA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHB0ciA9ICIiOwogICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgcmVjb2RlX3N0cmluZ3MgPyAic3RyIiA6ICJzdHIsIGJ5dGVzIG9yIGJ5dGVhcnJheSIsCisgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CiAKICAgICAgICAgLyogV3JpdGUgb3V0cHV0OyBvdXRwdXQgaXMgZ3VhcmFudGVlZCB0byBiZSAwLXRlcm1pbmF0ZWQgKi8KICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7CkBAIC0xMTI5LDcgKzExMzQsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc2l6ZSArIDEgPiBCVUZGRVJfTEVOKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RlZCBzdHJpbmcgdG9vIGxvbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglemQsIG1heGltdW0gbGVuZ3RoICV6ZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3Qpc2l6ZSwgKFB5X3NzaXplX3QpKEJVRkZFUl9MRU4tMSkpOwpAQCAtMTI4Myw3ICsxMjg4LDcgQEAKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKLWNvbnZlcnRidWZmZXIoUHlPYmplY3QgKmFyZywgdm9pZCAqKnAsIGNoYXIgKiplcnJtc2cpCitjb252ZXJ0YnVmZmVyKFB5T2JqZWN0ICphcmcsIHZvaWQgKipwLCBjb25zdCBjaGFyICoqZXJybXNnKQogewogICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gUHlfVFlQRShhcmcpLT50cF9hc19idWZmZXI7CiAgICAgUHlfc3NpemVfdCBjb3VudDsKQEAgLTEzMDUsNyArMTMxMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWdldGJ1ZmZlcihQeU9iamVjdCAqYXJnLCBQeV9idWZmZXIgKnZpZXcsIGNoYXIgKiplcnJtc2cpCitnZXRidWZmZXIoUHlPYmplY3QgKmFyZywgUHlfYnVmZmVyICp2aWV3LCBjb25zdCBjaGFyICoqZXJybXNnKQogewogICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoYXJnLCB2aWV3LCBQeUJVRl9TSU1QTEUpICE9IDApIHsKICAgICAgICAgKmVycm1zZyA9ICJieXRlcy1saWtlIG9iamVjdCI7CkBAIC0xNDIzLDYgKzE0MjgsOTEgQEAKIH0KIAogaW50CitfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICpwYXJzZXIsIC4uLikKK3sKKyAgICBpbnQgcmV0dmFsOworICAgIHZhX2xpc3QgdmE7CisKKyAgICBpZiAoKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSkgfHwKKyAgICAgICAgKGtleXdvcmRzICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrZXl3b3JkcykpIHx8CisgICAgICAgIHBhcnNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZhX3N0YXJ0KHZhLCBwYXJzZXIpOworICAgIHJldHZhbCA9IHZnZXRhcmdza2V5d29yZHNmYXN0KGFyZ3MsIGtleXdvcmRzLCBwYXJzZXIsICZ2YSwgMCk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQKK19QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0X1NpemVUKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9QeUFyZ19QYXJzZXIgKnBhcnNlciwgLi4uKQoreworICAgIGludCByZXR2YWw7CisgICAgdmFfbGlzdCB2YTsKKworICAgIGlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAorICAgICAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKKyAgICAgICAgcGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmFfc3RhcnQodmEsIHBhcnNlcik7CisgICAgcmV0dmFsID0gdmdldGFyZ3NrZXl3b3Jkc2Zhc3QoYXJncywga2V5d29yZHMsIHBhcnNlciwgJnZhLCBGTEFHX1NJWkVfVCk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKK2ludAorX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICpwYXJzZXIsIHZhX2xpc3QgdmEpCit7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IGx2YTsKKworICAgIGlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAorICAgICAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKKyAgICAgICAgcGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgUHlfVkFfQ09QWShsdmEsIHZhKTsKKworICAgIHJldHZhbCA9IHZnZXRhcmdza2V5d29yZHNmYXN0KGFyZ3MsIGtleXdvcmRzLCBwYXJzZXIsICZsdmEsIDApOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK2ludAorX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdF9TaXplVChQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICpwYXJzZXIsIHZhX2xpc3QgdmEpCit7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IGx2YTsKKworICAgIGlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAorICAgICAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKKyAgICAgICAgcGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgUHlfVkFfQ09QWShsdmEsIHZhKTsKKworICAgIHJldHZhbCA9IHZnZXRhcmdza2V5d29yZHNmYXN0KGFyZ3MsIGtleXdvcmRzLCBwYXJzZXIsICZsdmEsIEZMQUdfU0laRV9UKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQKIFB5QXJnX1ZhbGlkYXRlS2V5d29yZEFyZ3VtZW50cyhQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGlmICghUHlEaWN0X0NoZWNrKGt3YXJncykpIHsKQEAgLTE0NDgsNyArMTUzOCw4IEBACiAgICAgY29uc3QgY2hhciAqZm5hbWUsICptc2csICpjdXN0b21fbXNnLCAqa2V5d29yZDsKICAgICBpbnQgbWluID0gSU5UX01BWDsKICAgICBpbnQgbWF4ID0gSU5UX01BWDsKLSAgICBpbnQgaSwgbGVuOworICAgIGludCBpLCBwb3MsIGxlbjsKKyAgICBpbnQgc2tpcCA9IDA7CiAgICAgUHlfc3NpemVfdCBuYXJncywgbmtleXdvcmRzOwogICAgIFB5T2JqZWN0ICpjdXJyZW50X2FyZzsKICAgICBmcmVlbGlzdGVudHJ5X3Qgc3RhdGljX2VudHJpZXNbU1RBVElDX0ZSRUVMSVNUX0VOVFJJRVNdOwpAQCAtMTQ3Niw5ICsxNTY3LDE3IEBACiAgICAgICAgICAgICBjdXN0b21fbXNnKys7CiAgICAgfQogCisgICAgLyogc2NhbiBrd2xpc3QgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMgKi8KKyAgICBmb3IgKHBvcyA9IDA7IGt3bGlzdFtwb3NdICYmICEqa3dsaXN0W3Bvc107IHBvcysrKSB7CisgICAgfQogICAgIC8qIHNjYW4ga3dsaXN0IGFuZCBnZXQgZ3JlYXRlc3QgcG9zc2libGUgbmJyIG9mIGFyZ3MgKi8KLSAgICBmb3IgKGxlbj0wOyBrd2xpc3RbbGVuXTsgbGVuKyspCi0gICAgICAgIGNvbnRpbnVlOworICAgIGZvciAobGVuID0gcG9zOyBrd2xpc3RbbGVuXTsgbGVuKyspIHsKKyAgICAgICAgaWYgKCEqa3dsaXN0W2xlbl0pIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW1wdHkga2V5d29yZCBwYXJhbWV0ZXIgbmFtZSIpOworICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAobGVuID4gU1RBVElDX0ZSRUVMSVNUX0VOVFJJRVMpIHsKICAgICAgICAgZnJlZWxpc3QuZW50cmllcyA9IFB5TWVtX05FVyhmcmVlbGlzdGVudHJ5X3QsIGxlbik7CkBAIC0xNTA3LDcgKzE2MDYsNyBAQAogICAgICAgICBrZXl3b3JkID0ga3dsaXN0W2ldOwogICAgICAgICBpZiAoKmZvcm1hdCA9PSAnfCcpIHsKICAgICAgICAgICAgIGlmIChtaW4gIT0gSU5UX01BWCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmb3JtYXQgc3RyaW5nICh8IHNwZWNpZmllZCB0d2ljZSkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KQEAgLTE1MTYsMTQgKzE2MTUsMTQgQEAKICAgICAgICAgICAgIGZvcm1hdCsrOwogCiAgICAgICAgICAgICBpZiAobWF4ICE9IElOVF9NQVgpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZm9ybWF0IHN0cmluZyAoJCBiZWZvcmUgfCkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoKmZvcm1hdCA9PSAnJCcpIHsKICAgICAgICAgICAgIGlmIChtYXggIT0gSU5UX01BWCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmb3JtYXQgc3RyaW5nICgkIHNwZWNpZmllZCB0d2ljZSkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KQEAgLTE1MzEsNiArMTYzMCwxNyBAQAogICAgICAgICAgICAgbWF4ID0gaTsKICAgICAgICAgICAgIGZvcm1hdCsrOwogCisgICAgICAgICAgICBpZiAobWF4IDwgcG9zKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW1wdHkgcGFyYW1ldGVyIG5hbWUgYWZ0ZXIgJCIpOworICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNraXApIHsKKyAgICAgICAgICAgICAgICAvKiBOb3cgd2Uga25vdyB0aGUgbWluaW1hbCBhbmQgdGhlIG1heGltYWwgbnVtYmVycyBvZgorICAgICAgICAgICAgICAgICAqIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFuZCBjYW4gcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgKiBpbmZvcm1hdGl2ZSBtZXNzYWdlIChzZWUgYmVsb3cpLiAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1heCA8IG5hcmdzKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1bmN0aW9uIHRha2VzICVzICVkIHBvc2l0aW9uYWwgYXJndW1lbnRzIgpAQCAtMTU0MSw2NiArMTY1MSw5MCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICJNb3JlIGtleXdvcmQgbGlzdCBlbnRyaWVzICglZCkgdGhhbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCBzcGVjaWZpZXJzICglZCkiLCBsZW4sIGkpOwogICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CiAgICAgICAgIH0KLSAgICAgICAgY3VycmVudF9hcmcgPSBOVUxMOwotICAgICAgICBpZiAobmtleXdvcmRzKSB7Ci0gICAgICAgICAgICBjdXJyZW50X2FyZyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGtleXdvcmRzLCBrZXl3b3JkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudF9hcmcpIHsKLSAgICAgICAgICAgIC0tbmtleXdvcmRzOwotICAgICAgICAgICAgaWYgKGkgPCBuYXJncykgewotICAgICAgICAgICAgICAgIC8qIGFyZyBwcmVzZW50IGluIHR1cGxlIGFuZCBpbiBkaWN0ICovCi0gICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50IGdpdmVuIGJ5IG5hbWUgKCclcycpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBwb3NpdGlvbiAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKKyAgICAgICAgaWYgKCFza2lwKSB7CisgICAgICAgICAgICBjdXJyZW50X2FyZyA9IE5VTEw7CisgICAgICAgICAgICBpZiAobmtleXdvcmRzICYmIGkgPj0gcG9zKSB7CisgICAgICAgICAgICAgICAgY3VycmVudF9hcmcgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhrZXl3b3Jkcywga2V5d29yZCk7CisgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50X2FyZyAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdXJyZW50X2FyZykgeworICAgICAgICAgICAgICAgIC0tbmtleXdvcmRzOworICAgICAgICAgICAgICAgIGlmIChpIDwgbmFyZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYXJnIHByZXNlbnQgaW4gdHVwbGUgYW5kIGluIGRpY3QgKi8KKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBnaXZlbiBieSBuYW1lICgnJXMnKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHBvc2l0aW9uICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaSA8IG5hcmdzKQorICAgICAgICAgICAgICAgIGN1cnJlbnRfYXJnID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRfYXJnKSB7CisgICAgICAgICAgICAgICAgbXNnID0gY29udmVydGl0ZW0oY3VycmVudF9hcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICBsZXZlbHMsIG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksICZmcmVlbGlzdCk7CisgICAgICAgICAgICAgICAgaWYgKG1zZykgeworICAgICAgICAgICAgICAgICAgICBzZXRlcnJvcihpKzEsIG1zZywgbGV2ZWxzLCBmbmFtZSwgY3VzdG9tX21zZyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGkgPCBtaW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IHBvcykgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKG1pbiA9PSBJTlRfTUFYKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChtYXggPT0gSU5UX01BWCk7CisgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxOworICAgICAgICAgICAgICAgICAgICAvKiBBdCB0aGF0IG1vbWVudCB3ZSBzdGlsbCBkb24ndCBrbm93IHRoZSBtaW5pbWFsIGFuZAorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbWF4aW1hbCBudW1iZXJzIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzLiAgUmFpc2luZworICAgICAgICAgICAgICAgICAgICAgKiBhbiBleGNlcHRpb24gaXMgZGVmZXJyZWQgdW50aWwgd2UgZW5jb3VudGVyIHwgYW5kICQKKyAgICAgICAgICAgICAgICAgICAgICogb3IgdGhlIGVuZCBvZiB0aGUgZm9ybWF0LiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlJlcXVpcmVkIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgKHBvcyAlZCkgbm90IGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY3VycmVudCBjb2RlIHJlcG9ydHMgc3VjY2VzcyB3aGVuIGFsbCByZXF1aXJlZCBhcmdzCisgICAgICAgICAgICAgKiBmdWxmaWxsZWQgYW5kIG5vIGtleXdvcmQgYXJncyBsZWZ0LCB3aXRoIG5vIGZ1cnRoZXIKKyAgICAgICAgICAgICAqIHZhbGlkYXRpb24uIFhYWCBNYXliZSBza2lwIHRoaXMgaW4gZGVidWcgYnVpbGQgPworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIW5rZXl3b3JkcyAmJiAhc2tpcCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigxLCAmZnJlZWxpc3QpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5rZXl3b3JkcyAmJiBQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7Ci0gICAgICAgIGVsc2UgaWYgKGkgPCBuYXJncykKLSAgICAgICAgICAgIGN1cnJlbnRfYXJnID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQotICAgICAgICBpZiAoY3VycmVudF9hcmcpIHsKLSAgICAgICAgICAgIG1zZyA9IGNvbnZlcnRpdGVtKGN1cnJlbnRfYXJnLCAmZm9ybWF0LCBwX3ZhLCBmbGFncywKLSAgICAgICAgICAgICAgICBsZXZlbHMsIG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksICZmcmVlbGlzdCk7Ci0gICAgICAgICAgICBpZiAobXNnKSB7Ci0gICAgICAgICAgICAgICAgc2V0ZXJyb3IoaSsxLCBtc2csIGxldmVscywgZm5hbWUsIGN1c3RvbV9tc2cpOwotICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA8IG1pbikgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlJlcXVpcmVkIGFyZ3VtZW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyAocG9zICVkKSBub3QgZm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQsIGkrMSk7Ci0gICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKLSAgICAgICAgfQotICAgICAgICAvKiBjdXJyZW50IGNvZGUgcmVwb3J0cyBzdWNjZXNzIHdoZW4gYWxsIHJlcXVpcmVkIGFyZ3MKLSAgICAgICAgICogZnVsZmlsbGVkIGFuZCBubyBrZXl3b3JkIGFyZ3MgbGVmdCwgd2l0aCBubyBmdXJ0aGVyCi0gICAgICAgICAqIHZhbGlkYXRpb24uIFhYWCBNYXliZSBza2lwIHRoaXMgaW4gZGVidWcgYnVpbGQgPwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFua2V5d29yZHMpCi0gICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMSwgJmZyZWVsaXN0KTsKIAogICAgICAgICAvKiBXZSBhcmUgaW50byBvcHRpb25hbCBhcmdzLCBza2lwIHRocnUgdG8gYW55IHJlbWFpbmluZwogICAgICAgICAgKiBrZXl3b3JkIGFyZ3MgKi8KICAgICAgICAgbXNnID0gc2tpcGl0ZW0oJmZvcm1hdCwgcF92YSwgZmxhZ3MpOwogICAgICAgICBpZiAobXNnKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLCAiJXM6ICclcyciLCBtc2csCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICIlczogJyVzJyIsIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOwogICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoc2tpcCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkZ1bmN0aW9uIHRha2VzICVzICVkIHBvc2l0aW9uYWwgYXJndW1lbnRzIgorICAgICAgICAgICAgICAgICAgICAgIiAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgIChQeV9NSU4ocG9zLCBtaW4pIDwgaSkgPyAiYXQgbGVhc3QiIDogImV4YWN0bHkiLAorICAgICAgICAgICAgICAgICAgICAgUHlfTUlOKHBvcywgbWluKSwgbmFyZ3MpOworICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKKyAgICB9CisKICAgICBpZiAoIUlTX0VORF9PRl9GT1JNQVQoKmZvcm1hdCkgJiYgKCpmb3JtYXQgIT0gJ3wnKSAmJiAoKmZvcm1hdCAhPSAnJCcpKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICJtb3JlIGFyZ3VtZW50IHNwZWNpZmllcnMgdGhhbiBrZXl3b3JkIGxpc3QgZW50cmllcyAiCiAgICAgICAgICAgICAiKHJlbWFpbmluZyBmb3JtYXQ6JyVzJykiLCBmb3JtYXQpOwogICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKQEAgLTE2MTgsNyArMTc1Miw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nKGtleSwga3dsaXN0W2ldKSkgeworICAgICAgICAgICAgICAgIGlmICgqa3dsaXN0W2ldICYmICFQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhrZXksIGt3bGlzdFtpXSkpIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAxOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0xNjM3LDcgKzE3NzEsMzAxIEBACiB9CiAKIAotc3RhdGljIGNoYXIgKgorLyogTGlzdCBvZiBzdGF0aWMgcGFyc2Vycy4gKi8KK3N0YXRpYyBzdHJ1Y3QgX1B5QXJnX1BhcnNlciAqc3RhdGljX2FyZ19wYXJzZXJzID0gTlVMTDsKKworc3RhdGljIGludAorcGFyc2VyX2luaXQoc3RydWN0IF9QeUFyZ19QYXJzZXIgKnBhcnNlcikKK3sKKyAgICBjb25zdCBjaGFyICogY29uc3QgKmtleXdvcmRzOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgKm1zZzsKKyAgICBpbnQgaSwgbGVuLCBtaW4sIG1heCwgbmt3OworICAgIFB5T2JqZWN0ICprd3R1cGxlOworCisgICAgYXNzZXJ0KHBhcnNlci0+Zm9ybWF0ICE9IE5VTEwpOworICAgIGFzc2VydChwYXJzZXItPmtleXdvcmRzICE9IE5VTEwpOworICAgIGlmIChwYXJzZXItPmt3dHVwbGUgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBncmFiIHRoZSBmdW5jdGlvbiBuYW1lIG9yIGN1c3RvbSBlcnJvciBtc2cgZmlyc3QgKG11dHVhbGx5IGV4Y2x1c2l2ZSkgKi8KKyAgICBwYXJzZXItPmZuYW1lID0gc3RyY2hyKHBhcnNlci0+Zm9ybWF0LCAnOicpOworICAgIGlmIChwYXJzZXItPmZuYW1lKSB7CisgICAgICAgIHBhcnNlci0+Zm5hbWUrKzsKKyAgICAgICAgcGFyc2VyLT5jdXN0b21fbXNnID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHBhcnNlci0+Y3VzdG9tX21zZyA9IHN0cmNocihwYXJzZXItPmZvcm1hdCwnOycpOworICAgICAgICBpZiAocGFyc2VyLT5jdXN0b21fbXNnKQorICAgICAgICAgICAgcGFyc2VyLT5jdXN0b21fbXNnKys7CisgICAgfQorCisgICAga2V5d29yZHMgPSBwYXJzZXItPmtleXdvcmRzOworICAgIC8qIHNjYW4ga2V5d29yZHMgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBrZXl3b3Jkc1tpXSAmJiAhKmtleXdvcmRzW2ldOyBpKyspIHsKKyAgICB9CisgICAgcGFyc2VyLT5wb3MgPSBpOworICAgIC8qIHNjYW4ga2V5d29yZHMgYW5kIGdldCBncmVhdGVzdCBwb3NzaWJsZSBuYnIgb2YgYXJncyAqLworICAgIGZvciAoOyBrZXl3b3Jkc1tpXTsgaSsrKSB7CisgICAgICAgIGlmICghKmtleXdvcmRzW2ldKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtcHR5IGtleXdvcmQgcGFyYW1ldGVyIG5hbWUiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGxlbiA9IGk7CisKKyAgICBtaW4gPSBtYXggPSBJTlRfTUFYOworICAgIGZvcm1hdCA9IHBhcnNlci0+Zm9ybWF0OworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnfCcpIHsKKyAgICAgICAgICAgIGlmIChtaW4gIT0gSU5UX01BWCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZm9ybWF0IHN0cmluZyAofCBzcGVjaWZpZWQgdHdpY2UpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF4ICE9IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZvcm1hdCBzdHJpbmcgKCQgYmVmb3JlIHwpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtaW4gPSBpOworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyQnKSB7CisgICAgICAgICAgICBpZiAobWF4ICE9IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZvcm1hdCBzdHJpbmcgKCQgc3BlY2lmaWVkIHR3aWNlKSIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPCBwYXJzZXItPnBvcykgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtcHR5IHBhcmFtZXRlciBuYW1lIGFmdGVyICQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heCA9IGk7CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJNb3JlIGtleXdvcmQgbGlzdCBlbnRyaWVzICglZCkgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCBzcGVjaWZpZXJzICglZCkiLCBsZW4sIGkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBtc2cgPSBza2lwaXRlbSgmZm9ybWF0LCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKG1zZykgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAiJXM6ICclcyciLCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHBhcnNlci0+bWluID0gUHlfTUlOKG1pbiwgbGVuKTsKKyAgICBwYXJzZXItPm1heCA9IFB5X01JTihtYXgsIGxlbik7CisKKyAgICBpZiAoIUlTX0VORF9PRl9GT1JNQVQoKmZvcm1hdCkgJiYgKCpmb3JtYXQgIT0gJ3wnKSAmJiAoKmZvcm1hdCAhPSAnJCcpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJtb3JlIGFyZ3VtZW50IHNwZWNpZmllcnMgdGhhbiBrZXl3b3JkIGxpc3QgZW50cmllcyAiCisgICAgICAgICAgICAiKHJlbWFpbmluZyBmb3JtYXQ6JyVzJykiLCBmb3JtYXQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBua3cgPSBsZW4gLSBwYXJzZXItPnBvczsKKyAgICBrd3R1cGxlID0gUHlUdXBsZV9OZXcobmt3KTsKKyAgICBpZiAoa3d0dXBsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBrZXl3b3JkcyA9IHBhcnNlci0+a2V5d29yZHMgKyBwYXJzZXItPnBvczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmt3OyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnN0ciA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKGtleXdvcmRzW2ldKTsKKyAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoa3d0dXBsZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBQeVVuaWNvZGVfSW50ZXJuSW5QbGFjZSgmc3RyKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShrd3R1cGxlLCBpLCBzdHIpOworICAgIH0KKyAgICBwYXJzZXItPmt3dHVwbGUgPSBrd3R1cGxlOworCisgICAgYXNzZXJ0KHBhcnNlci0+bmV4dCA9PSBOVUxMKTsKKyAgICBwYXJzZXItPm5leHQgPSBzdGF0aWNfYXJnX3BhcnNlcnM7CisgICAgc3RhdGljX2FyZ19wYXJzZXJzID0gcGFyc2VyOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VyX2NsZWFyKHN0cnVjdCBfUHlBcmdfUGFyc2VyICpwYXJzZXIpCit7CisgICAgUHlfQ0xFQVIocGFyc2VyLT5rd3R1cGxlKTsKK30KKworc3RhdGljIGludAordmdldGFyZ3NrZXl3b3Jkc2Zhc3QoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICpwX3ZhLCBpbnQgZmxhZ3MpCit7CisgICAgUHlPYmplY3QgKmt3dHVwbGU7CisgICAgY2hhciBtc2didWZbNTEyXTsKKyAgICBpbnQgbGV2ZWxzWzMyXTsKKyAgICBjb25zdCBjaGFyICpmb3JtYXQ7CisgICAgY29uc3QgY2hhciAqbXNnOworICAgIFB5T2JqZWN0ICprZXl3b3JkOworICAgIGludCBpLCBwb3MsIGxlbjsKKyAgICBQeV9zc2l6ZV90IG5hcmdzLCBua2V5d29yZHM7CisgICAgUHlPYmplY3QgKmN1cnJlbnRfYXJnOworICAgIGZyZWVsaXN0ZW50cnlfdCBzdGF0aWNfZW50cmllc1tTVEFUSUNfRlJFRUxJU1RfRU5UUklFU107CisgICAgZnJlZWxpc3RfdCBmcmVlbGlzdDsKKworICAgIGZyZWVsaXN0LmVudHJpZXMgPSBzdGF0aWNfZW50cmllczsKKyAgICBmcmVlbGlzdC5maXJzdF9hdmFpbGFibGUgPSAwOworICAgIGZyZWVsaXN0LmVudHJpZXNfbWFsbG9jZWQgPSAwOworCisgICAgYXNzZXJ0KGFyZ3MgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICBhc3NlcnQoa2V5d29yZHMgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa2V5d29yZHMpKTsKKyAgICBhc3NlcnQocGFyc2VyICE9IE5VTEwpOworICAgIGFzc2VydChwX3ZhICE9IE5VTEwpOworCisgICAgaWYgKCFwYXJzZXJfaW5pdChwYXJzZXIpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGt3dHVwbGUgPSBwYXJzZXItPmt3dHVwbGU7CisgICAgcG9zID0gcGFyc2VyLT5wb3M7CisgICAgbGVuID0gcG9zICsgUHlUdXBsZV9HRVRfU0laRShrd3R1cGxlKTsKKworICAgIGlmIChsZW4gPiBTVEFUSUNfRlJFRUxJU1RfRU5UUklFUykgeworICAgICAgICBmcmVlbGlzdC5lbnRyaWVzID0gUHlNZW1fTkVXKGZyZWVsaXN0ZW50cnlfdCwgbGVuKTsKKyAgICAgICAgaWYgKGZyZWVsaXN0LmVudHJpZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGZyZWVsaXN0LmVudHJpZXNfbWFsbG9jZWQgPSAxOworICAgIH0KKworICAgIG5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBua2V5d29yZHMgPSAoa2V5d29yZHMgPT0gTlVMTCkgPyAwIDogUHlEaWN0X1NpemUoa2V5d29yZHMpOworICAgIGlmIChuYXJncyArIG5rZXl3b3JkcyA+IGxlbikgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiVzJXMgdGFrZXMgYXQgbW9zdCAlZCBhcmd1bWVudCVzICglemQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgIChwYXJzZXItPmZuYW1lID09IE5VTEwpID8gImZ1bmN0aW9uIiA6IHBhcnNlci0+Zm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAocGFyc2VyLT5mbmFtZSA9PSBOVUxMKSA/ICIiIDogIigpIiwKKyAgICAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIChsZW4gPT0gMSkgPyAiIiA6ICJzIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hcmdzICsgbmtleXdvcmRzKTsKKyAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgfQorICAgIGlmIChwYXJzZXItPm1heCA8IG5hcmdzKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiRnVuY3Rpb24gdGFrZXMgJXMgJWQgcG9zaXRpb25hbCBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAocGFyc2VyLT5taW4gIT0gSU5UX01BWCkgPyAiYXQgbW9zdCIgOiAiZXhhY3RseSIsCisgICAgICAgICAgICAgICAgICAgICBwYXJzZXItPm1heCwgbmFyZ3MpOworICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKKyAgICB9CisKKyAgICBmb3JtYXQgPSBwYXJzZXItPmZvcm1hdDsKKyAgICAvKiBjb252ZXJ0IHR1cGxlIGFyZ3MgYW5kIGtleXdvcmQgYXJncyBpbiBzYW1lIGxvb3AsIHVzaW5nIGt3dHVwbGUgdG8gZHJpdmUgcHJvY2VzcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBrZXl3b3JkID0gKGkgPj0gcG9zKSA/IFB5VHVwbGVfR0VUX0lURU0oa3d0dXBsZSwgaSAtIHBvcykgOiBOVUxMOworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnfCcpIHsKKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICB9CisgICAgICAgIGlmICgqZm9ybWF0ID09ICckJykgeworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KCFJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpKTsKKworICAgICAgICBjdXJyZW50X2FyZyA9IE5VTEw7CisgICAgICAgIGlmIChua2V5d29yZHMgJiYgaSA+PSBwb3MpIHsKKyAgICAgICAgICAgIGN1cnJlbnRfYXJnID0gUHlEaWN0X0dldEl0ZW0oa2V5d29yZHMsIGtleXdvcmQpOworICAgICAgICAgICAgaWYgKCFjdXJyZW50X2FyZyAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRfYXJnKSB7CisgICAgICAgICAgICAtLW5rZXl3b3JkczsKKyAgICAgICAgICAgIGlmIChpIDwgbmFyZ3MpIHsKKyAgICAgICAgICAgICAgICAvKiBhcmcgcHJlc2VudCBpbiB0dXBsZSBhbmQgaW4gZGljdCAqLworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBnaXZlbiBieSBuYW1lICgnJVUnKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgcG9zaXRpb24gKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQsIGkrMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaSA8IG5hcmdzKQorICAgICAgICAgICAgY3VycmVudF9hcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworCisgICAgICAgIGlmIChjdXJyZW50X2FyZykgeworICAgICAgICAgICAgbXNnID0gY29udmVydGl0ZW0oY3VycmVudF9hcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLAorICAgICAgICAgICAgICAgIGxldmVscywgbXNnYnVmLCBzaXplb2YobXNnYnVmKSwgJmZyZWVsaXN0KTsKKyAgICAgICAgICAgIGlmIChtc2cpIHsKKyAgICAgICAgICAgICAgICBzZXRlcnJvcihpKzEsIG1zZywgbGV2ZWxzLCBwYXJzZXItPmZuYW1lLCBwYXJzZXItPmN1c3RvbV9tc2cpOworICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IHBhcnNlci0+bWluKSB7CisgICAgICAgICAgICAvKiBMZXNzIGFyZ3VtZW50cyB0aGFuIHJlcXVpcmVkICovCisgICAgICAgICAgICBpZiAoaSA8IHBvcykgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdW5jdGlvbiB0YWtlcyAlcyAlZCBwb3NpdGlvbmFsIGFyZ3VtZW50cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X01JTihwb3MsIHBhcnNlci0+bWluKSA8IHBhcnNlci0+bWF4KSA/ICJhdCBsZWFzdCIgOiAiZXhhY3RseSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X01JTihwb3MsIHBhcnNlci0+bWluKSwgbmFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlJlcXVpcmVkIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclVScgKHBvcyAlZCkgbm90IGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICB9CisgICAgICAgIC8qIGN1cnJlbnQgY29kZSByZXBvcnRzIHN1Y2Nlc3Mgd2hlbiBhbGwgcmVxdWlyZWQgYXJncworICAgICAgICAgKiBmdWxmaWxsZWQgYW5kIG5vIGtleXdvcmQgYXJncyBsZWZ0LCB3aXRoIG5vIGZ1cnRoZXIKKyAgICAgICAgICogdmFsaWRhdGlvbi4gWFhYIE1heWJlIHNraXAgdGhpcyBpbiBkZWJ1ZyBidWlsZCA/CisgICAgICAgICAqLworICAgICAgICBpZiAoIW5rZXl3b3JkcykgeworICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDEsICZmcmVlbGlzdCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBhcmUgaW50byBvcHRpb25hbCBhcmdzLCBza2lwIHRocnUgdG8gYW55IHJlbWFpbmluZworICAgICAgICAgKiBrZXl3b3JkIGFyZ3MgKi8KKyAgICAgICAgbXNnID0gc2tpcGl0ZW0oJmZvcm1hdCwgcF92YSwgZmxhZ3MpOworICAgICAgICBhc3NlcnQobXNnID09IE5VTEwpOworICAgIH0KKworICAgIGFzc2VydChJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpIHx8ICgqZm9ybWF0ID09ICd8JykgfHwgKCpmb3JtYXQgPT0gJyQnKSk7CisKKyAgICAvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGV4dHJhbmVvdXMga2V5d29yZCBhcmd1bWVudHMgKi8KKyAgICBpZiAobmtleXdvcmRzID4gMCkgeworICAgICAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KGtleXdvcmRzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBpbnQgbWF0Y2g7CisgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhrZXkpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleXdvcmRzIG11c3QgYmUgc3RyaW5ncyIpOworICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2ggPSBQeVNlcXVlbmNlX0NvbnRhaW5zKGt3dHVwbGUsIGtleSk7CisgICAgICAgICAgICBpZiAobWF0Y2ggPD0gMCkgeworICAgICAgICAgICAgICAgIGlmICghbWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJVUnIGlzIGFuIGludmFsaWQga2V5d29yZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgZm9yIHRoaXMgZnVuY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2xlYW5yZXR1cm4oMSwgJmZyZWVsaXN0KTsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqCiBza2lwaXRlbShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncykKIHsKICAgICBjb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7CkBAIC0xNjU4LDEwICsyMDg2LDggQEAKICAgICBjYXNlICdJJzogLyogaW50IHNpemVkIGJpdGZpZWxkICovCiAgICAgY2FzZSAnbCc6IC8qIGxvbmcgaW50ICovCiAgICAgY2FzZSAnayc6IC8qIGxvbmcgaW50IHNpemVkIGJpdGZpZWxkICovCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICBjYXNlICdMJzogLyogUFlfTE9OR19MT05HICovCi0gICAgY2FzZSAnSyc6IC8qIFBZX0xPTkdfTE9ORyBzaXplZCBiaXRmaWVsZCAqLwotI2VuZGlmCisgICAgY2FzZSAnTCc6IC8qIGxvbmcgbG9uZyAqLworICAgIGNhc2UgJ0snOiAvKiBsb25nIGxvbmcgc2l6ZWQgYml0ZmllbGQgKi8KICAgICBjYXNlICduJzogLyogUHlfc3NpemVfdCAqLwogICAgIGNhc2UgJ2YnOiAvKiBmbG9hdCAqLwogICAgIGNhc2UgJ2QnOiAvKiBkb3VibGUgKi8KQEAgLTE2NzMsNyArMjA5OSw5IEBACiAgICAgY2FzZSAnWSc6IC8qIHN0cmluZyBvYmplY3QgKi8KICAgICBjYXNlICdVJzogLyogdW5pY29kZSBzdHJpbmcgb2JqZWN0ICovCiAgICAgICAgIHsKLSAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7CisgICAgICAgICAgICBpZiAocF92YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgdm9pZCAqKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE2ODEsNyArMjEwOSw5IEBACiAKICAgICBjYXNlICdlJzogLyogc3RyaW5nIHdpdGggZW5jb2RpbmcgKi8KICAgICAgICAgewotICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgY29uc3QgY2hhciAqKTsKKyAgICAgICAgICAgIGlmIChwX3ZhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCEoKmZvcm1hdCA9PSAncycgfHwgKmZvcm1hdCA9PSAndCcpKQogICAgICAgICAgICAgICAgIC8qIGFmdGVyICdlJywgb25seSAncycgYW5kICd0JyBpcyBhbGxvd2VkICovCiAgICAgICAgICAgICAgICAgZ290byBlcnI7CkBAIC0xNjk2LDEyICsyMTI2LDE2IEBACiAgICAgY2FzZSAnWic6IC8qIHVuaWNvZGUgc3RyaW5nIG9yIE5vbmUgKi8KICAgICBjYXNlICd3JzogLyogYnVmZmVyLCByZWFkLXdyaXRlICovCiAgICAgICAgIHsKLSAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOworICAgICAgICAgICAgaWYgKHBfdmEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpCi0gICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QgKik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBpbnQgKik7CisgICAgICAgICAgICAgICAgaWYgKHBfdmEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QgKik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGludCAqKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9ybWF0Kys7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKChjID09ICdzJyB8fCBjID09ICd6JyB8fCBjID09ICd5JykgJiYgKmZvcm1hdCA9PSAnKicpIHsKICAgICAgICAgICAgICAgICBmb3JtYXQrKzsKQEAgLTE3MTMsMjQgKzIxNDcsMzAgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyEnKSB7CiAgICAgICAgICAgICAgICAgZm9ybWF0Kys7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlUeXBlT2JqZWN0Kik7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgICAgIGlmIChwX3ZhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlUeXBlT2JqZWN0Kik7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmICgqZm9ybWF0ID09ICcmJykgewogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqY29udmVydGVyKShQeU9iamVjdCAqLCB2b2lkICopOwotICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGNvbnZlcnRlcik7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgdm9pZCAqKTsKKyAgICAgICAgICAgICAgICBpZiAocF92YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGNvbnZlcnRlcik7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvcm1hdCsrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgICAgIGlmIChwX3ZhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICBjYXNlICcoJzogICAgICAgICAgIC8qIGJ5cGFzcyB0dXBsZSwgbm90IGhhbmRsZWQgYXQgYWxsIHByZXZpb3VzbHkgKi8KICAgICAgICAgewotICAgICAgICAgICAgY2hhciAqbXNnOworICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnOwogICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgIGlmICgqZm9ybWF0PT0nKScpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTc2NiwxNiArMjIwNiw5IEBACiAgICAgUHlPYmplY3QgKipvOwogICAgIHZhX2xpc3QgdmFyZ3M7CiAKLSNpZmRlZiBIQVZFX1NUREFSR19QUk9UT1RZUEVTCi0gICAgdmFfc3RhcnQodmFyZ3MsIG1heCk7Ci0jZWxzZQotICAgIHZhX3N0YXJ0KHZhcmdzKTsKLSNlbmRpZgotCiAgICAgYXNzZXJ0KG1pbiA+PSAwKTsKICAgICBhc3NlcnQobWluIDw9IG1heCk7CiAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0gICAgICAgIHZhX2VuZCh2YXJncyk7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICJQeUFyZ19VbnBhY2tUdXBsZSgpIGFyZ3VtZW50IGxpc3QgaXMgbm90IGEgdHVwbGUiKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xNzkzLDkgKzIyMjYsMTAgQEAKICAgICAgICAgICAgICAgICAidW5wYWNrZWQgdHVwbGUgc2hvdWxkIGhhdmUgJXMlemQgZWxlbWVudHMsIgogICAgICAgICAgICAgICAgICIgYnV0IGhhcyAlemQiLAogICAgICAgICAgICAgICAgIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbGVhc3QgIiksIG1pbiwgbCk7Ci0gICAgICAgIHZhX2VuZCh2YXJncyk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBpZiAobCA9PSAwKQorICAgICAgICByZXR1cm4gMTsKICAgICBpZiAobCA+IG1heCkgewogICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KApAQCAtMTgwOCw5ICsyMjQyLDE0IEBACiAgICAgICAgICAgICAgICAgInVucGFja2VkIHR1cGxlIHNob3VsZCBoYXZlICVzJXpkIGVsZW1lbnRzLCIKICAgICAgICAgICAgICAgICAiIGJ1dCBoYXMgJXpkIiwKICAgICAgICAgICAgICAgICAobWluID09IG1heCA/ICIiIDogImF0IG1vc3QgIiksIG1heCwgbCk7Ci0gICAgICAgIHZhX2VuZCh2YXJncyk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKworI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKKyAgICB2YV9zdGFydCh2YXJncywgbWF4KTsKKyNlbHNlCisgICAgdmFfc3RhcnQodmFyZ3MpOworI2VuZGlmCiAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICBvID0gdmFfYXJnKHZhcmdzLCBQeU9iamVjdCAqKik7CiAgICAgICAgICpvID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKQEAgLTE4NjAsNiArMjI5OSwxOSBAQAogICAgIHJldHVybiAwOwogfQogCit2b2lkCitfUHlBcmdfRmluaSh2b2lkKQoreworICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICp0bXAsICpzID0gc3RhdGljX2FyZ19wYXJzZXJzOworICAgIHdoaWxlIChzKSB7CisgICAgICAgIHRtcCA9IHMtPm5leHQ7CisgICAgICAgIHMtPm5leHQgPSBOVUxMOworICAgICAgICBwYXJzZXJfY2xlYXIocyk7CisgICAgICAgIHMgPSB0bXA7CisgICAgfQorICAgIHN0YXRpY19hcmdfcGFyc2VycyA9IE5VTEw7Cit9CisKICNpZmRlZiBfX2NwbHVzcGx1cwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dyYW1pbml0LmMgYi9QeXRob24vZ3JhbWluaXQuYwppbmRleCA4MjEyYjJhLi5mMjU4NGUwIDEwMDY0NAotLS0gYS9QeXRob24vZ3JhbWluaXQuYworKysgYi9QeXRob24vZ3JhbWluaXQuYwpAQCAtMjA0LDExICsyMDQsMTMgQEAKICAgICB7MzIsIDd9LAogICAgIHswLCA2fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV83WzJdID0geworc3RhdGljIGFyYyBhcmNzXzlfN1szXSA9IHsKICAgICB7MzAsIDEyfSwKICAgICB7MzQsIDN9LAorICAgIHswLCA3fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV84WzFdID0geworc3RhdGljIGFyYyBhcmNzXzlfOFsyXSA9IHsKKyAgICB7MzIsIDEzfSwKICAgICB7MCwgOH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzlfOVsyXSA9IHsKQEAgLTIyMSwzNSArMjIzLDM5IEBACiAgICAgezAsIDEwfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfOV8xMVszXSA9IHsKLSAgICB7MzAsIDEzfSwKLSAgICB7MzIsIDE0fSwKKyAgICB7MzAsIDE0fSwKKyAgICB7MzIsIDE1fSwKICAgICB7MCwgMTF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc185XzEyWzNdID0gewogICAgIHszMiwgN30sCi0gICAgezMxLCAxNX0sCisgICAgezMxLCAxNn0sCiAgICAgezAsIDEyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV8xM1syXSA9IHsKLSAgICB7MzIsIDE0fSwKK3N0YXRpYyBhcmMgYXJjc185XzEzWzFdID0gewogICAgIHswLCAxM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzlfMTRbMl0gPSB7Ci0gICAgezMwLCAxNn0sCi0gICAgezM0LCAzfSwKKyAgICB7MzIsIDE1fSwKKyAgICB7MCwgMTR9LAogfTsKLXN0YXRpYyBhcmMgYXJjc185XzE1WzFdID0geworc3RhdGljIGFyYyBhcmNzXzlfMTVbM10gPSB7CisgICAgezMwLCAxN30sCisgICAgezM0LCAzfSwKKyAgICB7MCwgMTV9LAorfTsKK3N0YXRpYyBhcmMgYXJjc185XzE2WzFdID0gewogICAgIHsyNiwgNn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfMTZbM10gPSB7Ci0gICAgezMyLCAxNH0sCi0gICAgezMxLCAxN30sCi0gICAgezAsIDE2fSwKK3N0YXRpYyBhcmMgYXJjc185XzE3WzNdID0geworICAgIHszMiwgMTV9LAorICAgIHszMSwgMTh9LAorICAgIHswLCAxN30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfMTdbMV0gPSB7Ci0gICAgezI2LCAxM30sCitzdGF0aWMgYXJjIGFyY3NfOV8xOFsxXSA9IHsKKyAgICB7MjYsIDE0fSwKIH07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzlbMThdID0geworc3RhdGljIHN0YXRlIHN0YXRlc185WzE5XSA9IHsKICAgICB7MywgYXJjc185XzB9LAogICAgIHszLCBhcmNzXzlfMX0sCiAgICAgezMsIGFyY3NfOV8yfSwKQEAgLTI1NywxNyArMjYzLDE4IEBACiAgICAgezEsIGFyY3NfOV80fSwKICAgICB7NCwgYXJjc185XzV9LAogICAgIHsyLCBhcmNzXzlfNn0sCi0gICAgezIsIGFyY3NfOV83fSwKLSAgICB7MSwgYXJjc185Xzh9LAorICAgIHszLCBhcmNzXzlfN30sCisgICAgezIsIGFyY3NfOV84fSwKICAgICB7MiwgYXJjc185Xzl9LAogICAgIHszLCBhcmNzXzlfMTB9LAogICAgIHszLCBhcmNzXzlfMTF9LAogICAgIHszLCBhcmNzXzlfMTJ9LAotICAgIHsyLCBhcmNzXzlfMTN9LAorICAgIHsxLCBhcmNzXzlfMTN9LAogICAgIHsyLCBhcmNzXzlfMTR9LAotICAgIHsxLCBhcmNzXzlfMTV9LAotICAgIHszLCBhcmNzXzlfMTZ9LAotICAgIHsxLCBhcmNzXzlfMTd9LAorICAgIHszLCBhcmNzXzlfMTV9LAorICAgIHsxLCBhcmNzXzlfMTZ9LAorICAgIHszLCBhcmNzXzlfMTd9LAorICAgIHsxLCBhcmNzXzlfMTh9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMF8wWzFdID0gewogICAgIHsyMywgMX0sCkBAIC0zMTksMTEgKzMyNiwxMyBAQAogICAgIHszMiwgN30sCiAgICAgezAsIDZ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV83WzJdID0geworc3RhdGljIGFyYyBhcmNzXzExXzdbM10gPSB7CiAgICAgezM2LCAxMn0sCiAgICAgezM0LCAzfSwKKyAgICB7MCwgN30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzhbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfMTFfOFsyXSA9IHsKKyAgICB7MzIsIDEzfSwKICAgICB7MCwgOH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzExXzlbMl0gPSB7CkBAIC0zMzYsMzUgKzM0NSwzOSBAQAogICAgIHswLCAxMH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzExXzExWzNdID0gewotICAgIHszNiwgMTN9LAotICAgIHszMiwgMTR9LAorICAgIHszNiwgMTR9LAorICAgIHszMiwgMTV9LAogICAgIHswLCAxMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzExXzEyWzNdID0gewogICAgIHszMiwgN30sCi0gICAgezMxLCAxNX0sCisgICAgezMxLCAxNn0sCiAgICAgezAsIDEyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfMTNbMl0gPSB7Ci0gICAgezMyLCAxNH0sCitzdGF0aWMgYXJjIGFyY3NfMTFfMTNbMV0gPSB7CiAgICAgezAsIDEzfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMTFfMTRbMl0gPSB7Ci0gICAgezM2LCAxNn0sCi0gICAgezM0LCAzfSwKKyAgICB7MzIsIDE1fSwKKyAgICB7MCwgMTR9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV8xNVsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18xMV8xNVszXSA9IHsKKyAgICB7MzYsIDE3fSwKKyAgICB7MzQsIDN9LAorICAgIHswLCAxNX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzExXzE2WzFdID0gewogICAgIHsyNiwgNn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzE2WzNdID0gewotICAgIHszMiwgMTR9LAotICAgIHszMSwgMTd9LAotICAgIHswLCAxNn0sCitzdGF0aWMgYXJjIGFyY3NfMTFfMTdbM10gPSB7CisgICAgezMyLCAxNX0sCisgICAgezMxLCAxOH0sCisgICAgezAsIDE3fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfMTdbMV0gPSB7Ci0gICAgezI2LCAxM30sCitzdGF0aWMgYXJjIGFyY3NfMTFfMThbMV0gPSB7CisgICAgezI2LCAxNH0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc18xMVsxOF0gPSB7CitzdGF0aWMgc3RhdGUgc3RhdGVzXzExWzE5XSA9IHsKICAgICB7MywgYXJjc18xMV8wfSwKICAgICB7MywgYXJjc18xMV8xfSwKICAgICB7MywgYXJjc18xMV8yfSwKQEAgLTM3MiwxNyArMzg1LDE4IEBACiAgICAgezEsIGFyY3NfMTFfNH0sCiAgICAgezQsIGFyY3NfMTFfNX0sCiAgICAgezIsIGFyY3NfMTFfNn0sCi0gICAgezIsIGFyY3NfMTFfN30sCi0gICAgezEsIGFyY3NfMTFfOH0sCisgICAgezMsIGFyY3NfMTFfN30sCisgICAgezIsIGFyY3NfMTFfOH0sCiAgICAgezIsIGFyY3NfMTFfOX0sCiAgICAgezMsIGFyY3NfMTFfMTB9LAogICAgIHszLCBhcmNzXzExXzExfSwKICAgICB7MywgYXJjc18xMV8xMn0sCi0gICAgezIsIGFyY3NfMTFfMTN9LAorICAgIHsxLCBhcmNzXzExXzEzfSwKICAgICB7MiwgYXJjc18xMV8xNH0sCi0gICAgezEsIGFyY3NfMTFfMTV9LAotICAgIHszLCBhcmNzXzExXzE2fSwKLSAgICB7MSwgYXJjc18xMV8xN30sCisgICAgezMsIGFyY3NfMTFfMTV9LAorICAgIHsxLCBhcmNzXzExXzE2fSwKKyAgICB7MywgYXJjc18xMV8xN30sCisgICAgezEsIGFyY3NfMTFfMTh9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMl8wWzFdID0gewogICAgIHsyMywgMX0sCkBAIC00NDUsNTQgKzQ1OSw3NyBAQAogc3RhdGljIGFyYyBhcmNzXzE2XzBbMV0gPSB7CiAgICAgezQ3LCAxfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTZfMVszXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18xNl8xWzRdID0gewogICAgIHs0OCwgMn0sCi0gICAgezMxLCAzfSwKKyAgICB7NDksIDN9LAorICAgIHszMSwgNH0sCiAgICAgezAsIDF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xNl8yWzJdID0gewotICAgIHs0OSwgNH0sCi0gICAgezksIDR9LAorc3RhdGljIGFyYyBhcmNzXzE2XzJbMV0gPSB7CisgICAgezAsIDJ9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xNl8zWzJdID0gewotICAgIHs0OSwgNX0sCisgICAgezUwLCAyfSwKKyAgICB7OSwgMn0sCit9Oworc3RhdGljIGFyYyBhcmNzXzE2XzRbMl0gPSB7CisgICAgezUwLCA1fSwKICAgICB7NDcsIDV9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xNl80WzFdID0gewotICAgIHswLCA0fSwKLX07CiBzdGF0aWMgYXJjIGFyY3NfMTZfNVsyXSA9IHsKLSAgICB7MzEsIDN9LAorICAgIHszMSwgNH0sCiAgICAgezAsIDV9LAogfTsKIHN0YXRpYyBzdGF0ZSBzdGF0ZXNfMTZbNl0gPSB7CiAgICAgezEsIGFyY3NfMTZfMH0sCi0gICAgezMsIGFyY3NfMTZfMX0sCi0gICAgezIsIGFyY3NfMTZfMn0sCisgICAgezQsIGFyY3NfMTZfMX0sCisgICAgezEsIGFyY3NfMTZfMn0sCiAgICAgezIsIGFyY3NfMTZfM30sCi0gICAgezEsIGFyY3NfMTZfNH0sCisgICAgezIsIGFyY3NfMTZfNH0sCiAgICAgezIsIGFyY3NfMTZfNX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzE3XzBbMl0gPSB7Ci0gICAgezI2LCAxfSwKLSAgICB7NTAsIDF9LAorc3RhdGljIGFyYyBhcmNzXzE3XzBbMV0gPSB7CisgICAgezI3LCAxfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTdfMVsyXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18xN18xWzFdID0geworICAgIHsyNiwgMn0sCit9Oworc3RhdGljIGFyYyBhcmNzXzE3XzJbMl0gPSB7CisgICAgezMxLCAzfSwKKyAgICB7MCwgMn0sCit9Oworc3RhdGljIGFyYyBhcmNzXzE3XzNbMV0gPSB7CisgICAgezI2LCA0fSwKK307CitzdGF0aWMgYXJjIGFyY3NfMTdfNFsxXSA9IHsKKyAgICB7MCwgNH0sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc18xN1s1XSA9IHsKKyAgICB7MSwgYXJjc18xN18wfSwKKyAgICB7MSwgYXJjc18xN18xfSwKKyAgICB7MiwgYXJjc18xN18yfSwKKyAgICB7MSwgYXJjc18xN18zfSwKKyAgICB7MSwgYXJjc18xN180fSwKK307CitzdGF0aWMgYXJjIGFyY3NfMThfMFsyXSA9IHsKKyAgICB7MjYsIDF9LAorICAgIHs1MSwgMX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzE4XzFbMl0gPSB7CiAgICAgezMyLCAyfSwKICAgICB7MCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzE3XzJbM10gPSB7CitzdGF0aWMgYXJjIGFyY3NfMThfMlszXSA9IHsKICAgICB7MjYsIDF9LAotICAgIHs1MCwgMX0sCisgICAgezUxLCAxfSwKICAgICB7MCwgMn0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc18xN1szXSA9IHsKLSAgICB7MiwgYXJjc18xN18wfSwKLSAgICB7MiwgYXJjc18xN18xfSwKLSAgICB7MywgYXJjc18xN18yfSwKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfMThbM10gPSB7CisgICAgezIsIGFyY3NfMThfMH0sCisgICAgezIsIGFyY3NfMThfMX0sCisgICAgezMsIGFyY3NfMThfMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzE4XzBbMTNdID0gewotICAgIHs1MSwgMX0sCitzdGF0aWMgYXJjIGFyY3NfMTlfMFsxM10gPSB7CiAgICAgezUyLCAxfSwKICAgICB7NTMsIDF9LAogICAgIHs1NCwgMX0sCkBAIC01MDUsNjAgKzU0Miw1MSBAQAogICAgIHs2MSwgMX0sCiAgICAgezYyLCAxfSwKICAgICB7NjMsIDF9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18xOF8xWzFdID0gewotICAgIHswLCAxfSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzE4WzJdID0gewotICAgIHsxMywgYXJjc18xOF8wfSwKLSAgICB7MSwgYXJjc18xOF8xfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfMTlfMFsxXSA9IHsKICAgICB7NjQsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xOV8xWzFdID0gewotICAgIHs2NSwgMn0sCi19Owotc3RhdGljIGFyYyBhcmNzXzE5XzJbMV0gPSB7Ci0gICAgezAsIDJ9LAotfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfMTlbM10gPSB7Ci0gICAgezEsIGFyY3NfMTlfMH0sCi0gICAgezEsIGFyY3NfMTlfMX0sCi0gICAgezEsIGFyY3NfMTlfMn0sCi19Owotc3RhdGljIGFyYyBhcmNzXzIwXzBbMV0gPSB7Ci0gICAgezY2LCAxfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfMjBfMVsxXSA9IHsKICAgICB7MCwgMX0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc18yMFsyXSA9IHsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfMTlbMl0gPSB7CisgICAgezEzLCBhcmNzXzE5XzB9LAorICAgIHsxLCBhcmNzXzE5XzF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18yMF8wWzFdID0geworICAgIHs2NSwgMX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzIwXzFbMV0gPSB7CisgICAgezY2LCAyfSwKK307CitzdGF0aWMgYXJjIGFyY3NfMjBfMlsxXSA9IHsKKyAgICB7MCwgMn0sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc18yMFszXSA9IHsKICAgICB7MSwgYXJjc18yMF8wfSwKICAgICB7MSwgYXJjc18yMF8xfSwKKyAgICB7MSwgYXJjc18yMF8yfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMjFfMFs1XSA9IHsKK3N0YXRpYyBhcmMgYXJjc18yMV8wWzFdID0gewogICAgIHs2NywgMX0sCi0gICAgezY4LCAxfSwKLSAgICB7NjksIDF9LAotICAgIHs3MCwgMX0sCi0gICAgezcxLCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMjFfMVsxXSA9IHsKICAgICB7MCwgMX0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc18yMVsyXSA9IHsKLSAgICB7NSwgYXJjc18yMV8wfSwKKyAgICB7MSwgYXJjc18yMV8wfSwKICAgICB7MSwgYXJjc18yMV8xfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMjJfMFsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18yMl8wWzVdID0geworICAgIHs2OCwgMX0sCisgICAgezY5LCAxfSwKKyAgICB7NzAsIDF9LAorICAgIHs3MSwgMX0sCiAgICAgezcyLCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMjJfMVsxXSA9IHsKICAgICB7MCwgMX0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc18yMlsyXSA9IHsKLSAgICB7MSwgYXJjc18yMl8wfSwKKyAgICB7NSwgYXJjc18yMl8wfSwKICAgICB7MSwgYXJjc18yMl8xfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMjNfMFsxXSA9IHsKQEAgLTU3NCwxNDIgKzYwMiwxMzMgQEAKIHN0YXRpYyBhcmMgYXJjc18yNF8wWzFdID0gewogICAgIHs3NCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzI0XzFbMl0gPSB7CitzdGF0aWMgYXJjIGFyY3NfMjRfMVsxXSA9IHsKKyAgICB7MCwgMX0sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc18yNFsyXSA9IHsKKyAgICB7MSwgYXJjc18yNF8wfSwKKyAgICB7MSwgYXJjc18yNF8xfSwKK307CitzdGF0aWMgYXJjIGFyY3NfMjVfMFsxXSA9IHsKKyAgICB7NzUsIDF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18yNV8xWzJdID0gewogICAgIHs5LCAyfSwKICAgICB7MCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzI0XzJbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfMjVfMlsxXSA9IHsKICAgICB7MCwgMn0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc18yNFszXSA9IHsKLSAgICB7MSwgYXJjc18yNF8wfSwKLSAgICB7MiwgYXJjc18yNF8xfSwKLSAgICB7MSwgYXJjc18yNF8yfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfMjVfMFsxXSA9IHsKLSAgICB7NDksIDF9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18yNV8xWzFdID0gewotICAgIHswLCAxfSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzI1WzJdID0geworc3RhdGljIHN0YXRlIHN0YXRlc18yNVszXSA9IHsKICAgICB7MSwgYXJjc18yNV8wfSwKLSAgICB7MSwgYXJjc18yNV8xfSwKKyAgICB7MiwgYXJjc18yNV8xfSwKKyAgICB7MSwgYXJjc18yNV8yfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMjZfMFsxXSA9IHsKLSAgICB7NzUsIDF9LAorICAgIHs1MCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzI2XzFbMl0gPSB7CitzdGF0aWMgYXJjIGFyY3NfMjZfMVsxXSA9IHsKKyAgICB7MCwgMX0sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc18yNlsyXSA9IHsKKyAgICB7MSwgYXJjc18yNl8wfSwKKyAgICB7MSwgYXJjc18yNl8xfSwKK307CitzdGF0aWMgYXJjIGFyY3NfMjdfMFsxXSA9IHsKKyAgICB7NzYsIDF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18yN18xWzJdID0gewogICAgIHsyNiwgMn0sCiAgICAgezAsIDF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18yNl8yWzJdID0gewotICAgIHs3NiwgM30sCitzdGF0aWMgYXJjIGFyY3NfMjdfMlsyXSA9IHsKKyAgICB7NzcsIDN9LAogICAgIHswLCAyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMjZfM1sxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18yN18zWzFdID0gewogICAgIHsyNiwgNH0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzI2XzRbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfMjdfNFsxXSA9IHsKICAgICB7MCwgNH0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc18yNls1XSA9IHsKLSAgICB7MSwgYXJjc18yNl8wfSwKLSAgICB7MiwgYXJjc18yNl8xfSwKLSAgICB7MiwgYXJjc18yNl8yfSwKLSAgICB7MSwgYXJjc18yNl8zfSwKLSAgICB7MSwgYXJjc18yNl80fSwKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfMjdbNV0gPSB7CisgICAgezEsIGFyY3NfMjdfMH0sCisgICAgezIsIGFyY3NfMjdfMX0sCisgICAgezIsIGFyY3NfMjdfMn0sCisgICAgezEsIGFyY3NfMjdfM30sCisgICAgezEsIGFyY3NfMjdfNH0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzI3XzBbMl0gPSB7Ci0gICAgezc3LCAxfSwKK3N0YXRpYyBhcmMgYXJjc18yOF8wWzJdID0gewogICAgIHs3OCwgMX0sCi19Owotc3RhdGljIGFyYyBhcmNzXzI3XzFbMV0gPSB7Ci0gICAgezAsIDF9LAotfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfMjdbMl0gPSB7Ci0gICAgezIsIGFyY3NfMjdfMH0sCi0gICAgezEsIGFyY3NfMjdfMX0sCi19Owotc3RhdGljIGFyYyBhcmNzXzI4XzBbMV0gPSB7CiAgICAgezc5LCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMjhfMVsxXSA9IHsKLSAgICB7ODAsIDJ9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18yOF8yWzFdID0gewotICAgIHswLCAyfSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzI4WzNdID0gewotICAgIHsxLCBhcmNzXzI4XzB9LAotICAgIHsxLCBhcmNzXzI4XzF9LAotICAgIHsxLCBhcmNzXzI4XzJ9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18yOV8wWzFdID0gewotICAgIHs3NiwgMX0sCi19Owotc3RhdGljIGFyYyBhcmNzXzI5XzFbM10gPSB7Ci0gICAgezgxLCAyfSwKLSAgICB7ODIsIDJ9LAotICAgIHsxMiwgM30sCi19Owotc3RhdGljIGFyYyBhcmNzXzI5XzJbNF0gPSB7Ci0gICAgezgxLCAyfSwKLSAgICB7ODIsIDJ9LAotICAgIHsxMiwgM30sCi0gICAgezc5LCA0fSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfMjlfM1sxXSA9IHsKLSAgICB7NzksIDR9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18yOV80WzNdID0gewotICAgIHszMywgNX0sCi0gICAgezEzLCA2fSwKLSAgICB7ODMsIDV9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18yOV81WzFdID0gewotICAgIHswLCA1fSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfMjlfNlsxXSA9IHsKLSAgICB7ODMsIDd9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18yOV83WzFdID0gewotICAgIHsxNSwgNX0sCi19Owotc3RhdGljIHN0YXRlIHN0YXRlc18yOVs4XSA9IHsKLSAgICB7MSwgYXJjc18yOV8wfSwKLSAgICB7MywgYXJjc18yOV8xfSwKLSAgICB7NCwgYXJjc18yOV8yfSwKLSAgICB7MSwgYXJjc18yOV8zfSwKLSAgICB7MywgYXJjc18yOV80fSwKLSAgICB7MSwgYXJjc18yOV81fSwKLSAgICB7MSwgYXJjc18yOV82fSwKLSAgICB7MSwgYXJjc18yOV83fSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfMzBfMFsxXSA9IHsKLSAgICB7MjMsIDF9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18zMF8xWzJdID0gewotICAgIHs4NSwgMn0sCiAgICAgezAsIDF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18zMF8yWzFdID0gewotICAgIHsyMywgM30sCitzdGF0aWMgc3RhdGUgc3RhdGVzXzI4WzJdID0geworICAgIHsyLCBhcmNzXzI4XzB9LAorICAgIHsxLCBhcmNzXzI4XzF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18yOV8wWzFdID0geworICAgIHs4MCwgMX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzI5XzFbMV0gPSB7CisgICAgezgxLCAyfSwKK307CitzdGF0aWMgYXJjIGFyY3NfMjlfMlsxXSA9IHsKKyAgICB7MCwgMn0sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc18yOVszXSA9IHsKKyAgICB7MSwgYXJjc18yOV8wfSwKKyAgICB7MSwgYXJjc18yOV8xfSwKKyAgICB7MSwgYXJjc18yOV8yfSwKK307CitzdGF0aWMgYXJjIGFyY3NfMzBfMFsxXSA9IHsKKyAgICB7NzcsIDF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18zMF8xWzNdID0geworICAgIHs4MiwgMn0sCisgICAgezgzLCAyfSwKKyAgICB7MTIsIDN9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18zMF8yWzRdID0geworICAgIHs4MiwgMn0sCisgICAgezgzLCAyfSwKKyAgICB7MTIsIDN9LAorICAgIHs4MCwgNH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzMwXzNbMV0gPSB7Ci0gICAgezAsIDN9LAorICAgIHs4MCwgNH0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc18zMFs0XSA9IHsKK3N0YXRpYyBhcmMgYXJjc18zMF80WzNdID0geworICAgIHszMywgNX0sCisgICAgezEzLCA2fSwKKyAgICB7ODQsIDV9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18zMF81WzFdID0geworICAgIHswLCA1fSwKK307CitzdGF0aWMgYXJjIGFyY3NfMzBfNlsxXSA9IHsKKyAgICB7ODQsIDd9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18zMF83WzFdID0geworICAgIHsxNSwgNX0sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc18zMFs4XSA9IHsKICAgICB7MSwgYXJjc18zMF8wfSwKLSAgICB7MiwgYXJjc18zMF8xfSwKLSAgICB7MSwgYXJjc18zMF8yfSwKKyAgICB7MywgYXJjc18zMF8xfSwKKyAgICB7NCwgYXJjc18zMF8yfSwKICAgICB7MSwgYXJjc18zMF8zfSwKKyAgICB7MywgYXJjc18zMF80fSwKKyAgICB7MSwgYXJjc18zMF81fSwKKyAgICB7MSwgYXJjc18zMF82fSwKKyAgICB7MSwgYXJjc18zMF83fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMzFfMFsxXSA9IHsKLSAgICB7MTIsIDF9LAorICAgIHsyMywgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzMxXzFbMl0gPSB7Ci0gICAgezg1LCAyfSwKKyAgICB7ODYsIDJ9LAogICAgIHswLCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMzFfMlsxXSA9IHsKQEAgLTcyNSwzNyArNzQ0LDQ1IEBACiAgICAgezEsIGFyY3NfMzFfM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzMyXzBbMV0gPSB7Ci0gICAgezg0LCAxfSwKKyAgICB7MTIsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18zMl8xWzJdID0geworICAgIHs4NiwgMn0sCisgICAgezAsIDF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18zMl8yWzFdID0geworICAgIHsyMywgM30sCit9Oworc3RhdGljIGFyYyBhcmNzXzMyXzNbMV0gPSB7CisgICAgezAsIDN9LAorfTsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfMzJbNF0gPSB7CisgICAgezEsIGFyY3NfMzJfMH0sCisgICAgezIsIGFyY3NfMzJfMX0sCisgICAgezEsIGFyY3NfMzJfMn0sCisgICAgezEsIGFyY3NfMzJfM30sCit9Oworc3RhdGljIGFyYyBhcmNzXzMzXzBbMV0gPSB7CisgICAgezg1LCAxfSwKK307CitzdGF0aWMgYXJjIGFyY3NfMzNfMVsyXSA9IHsKICAgICB7MzIsIDJ9LAogICAgIHswLCAxfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMzJfMlsyXSA9IHsKLSAgICB7ODQsIDF9LAorc3RhdGljIGFyYyBhcmNzXzMzXzJbMl0gPSB7CisgICAgezg1LCAxfSwKICAgICB7MCwgMn0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc18zMlszXSA9IHsKLSAgICB7MSwgYXJjc18zMl8wfSwKLSAgICB7MiwgYXJjc18zMl8xfSwKLSAgICB7MiwgYXJjc18zMl8yfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfMzNfMFsxXSA9IHsKLSAgICB7ODYsIDF9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18zM18xWzJdID0gewotICAgIHszMiwgMH0sCi0gICAgezAsIDF9LAotfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfMzNbMl0gPSB7CitzdGF0aWMgc3RhdGUgc3RhdGVzXzMzWzNdID0gewogICAgIHsxLCBhcmNzXzMzXzB9LAogICAgIHsyLCBhcmNzXzMzXzF9LAorICAgIHsyLCBhcmNzXzMzXzJ9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18zNF8wWzFdID0gewotICAgIHsyMywgMX0sCisgICAgezg3LCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMzRfMVsyXSA9IHsKLSAgICB7ODEsIDB9LAorICAgIHszMiwgMH0sCiAgICAgezAsIDF9LAogfTsKIHN0YXRpYyBzdGF0ZSBzdGF0ZXNfMzRbMl0gPSB7CkBAIC03NjMsMTkgKzc5MCwxNSBAQAogICAgIHsyLCBhcmNzXzM0XzF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18zNV8wWzFdID0gewotICAgIHs4NywgMX0sCisgICAgezIzLCAxfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMzVfMVsxXSA9IHsKLSAgICB7MjMsIDJ9LAorc3RhdGljIGFyYyBhcmNzXzM1XzFbMl0gPSB7CisgICAgezgyLCAwfSwKKyAgICB7MCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzM1XzJbMl0gPSB7Ci0gICAgezMyLCAxfSwKLSAgICB7MCwgMn0sCi19Owotc3RhdGljIHN0YXRlIHN0YXRlc18zNVszXSA9IHsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfMzVbMl0gPSB7CiAgICAgezEsIGFyY3NfMzVfMH0sCi0gICAgezEsIGFyY3NfMzVfMX0sCi0gICAgezIsIGFyY3NfMzVfMn0sCisgICAgezIsIGFyY3NfMzVfMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzM2XzBbMV0gPSB7CiAgICAgezg4LCAxfSwKQEAgLTc5Niw5NyArODE5LDc2IEBACiAgICAgezg5LCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMzdfMVsxXSA9IHsKLSAgICB7MjYsIDJ9LAorICAgIHsyMywgMn0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzM3XzJbMl0gPSB7Ci0gICAgezMyLCAzfSwKKyAgICB7MzIsIDF9LAogICAgIHswLCAyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMzdfM1sxXSA9IHsKLSAgICB7MjYsIDR9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18zN180WzFdID0gewotICAgIHswLCA0fSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzM3WzVdID0geworc3RhdGljIHN0YXRlIHN0YXRlc18zN1szXSA9IHsKICAgICB7MSwgYXJjc18zN18wfSwKICAgICB7MSwgYXJjc18zN18xfSwKICAgICB7MiwgYXJjc18zN18yfSwKLSAgICB7MSwgYXJjc18zN18zfSwKLSAgICB7MSwgYXJjc18zN180fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMzhfMFs5XSA9IHsKK3N0YXRpYyBhcmMgYXJjc18zOF8wWzFdID0gewogICAgIHs5MCwgMX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzM4XzFbMV0gPSB7CisgICAgezI2LCAyfSwKK307CitzdGF0aWMgYXJjIGFyY3NfMzhfMlsyXSA9IHsKKyAgICB7MzIsIDN9LAorICAgIHswLCAyfSwKK307CitzdGF0aWMgYXJjIGFyY3NfMzhfM1sxXSA9IHsKKyAgICB7MjYsIDR9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18zOF80WzFdID0geworICAgIHswLCA0fSwKK307CitzdGF0aWMgc3RhdGUgc3RhdGVzXzM4WzVdID0geworICAgIHsxLCBhcmNzXzM4XzB9LAorICAgIHsxLCBhcmNzXzM4XzF9LAorICAgIHsyLCBhcmNzXzM4XzJ9LAorICAgIHsxLCBhcmNzXzM4XzN9LAorICAgIHsxLCBhcmNzXzM4XzR9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18zOV8wWzldID0gewogICAgIHs5MSwgMX0sCiAgICAgezkyLCAxfSwKICAgICB7OTMsIDF9LAogICAgIHs5NCwgMX0sCisgICAgezk1LCAxfSwKICAgICB7MTksIDF9LAogICAgIHsxOCwgMX0sCiAgICAgezE3LCAxfSwKLSAgICB7OTUsIDF9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18zOF8xWzFdID0gewotICAgIHswLCAxfSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzM4WzJdID0gewotICAgIHs5LCBhcmNzXzM4XzB9LAotICAgIHsxLCBhcmNzXzM4XzF9LAotfTsKLXN0YXRpYyBhcmMgYXJjc18zOV8wWzFdID0gewotICAgIHsyMSwgMX0sCi19Owotc3RhdGljIGFyYyBhcmNzXzM5XzFbM10gPSB7Ci0gICAgezE5LCAyfSwKLSAgICB7OTQsIDJ9LAotICAgIHs5MiwgMn0sCi19Owotc3RhdGljIGFyYyBhcmNzXzM5XzJbMV0gPSB7Ci0gICAgezAsIDJ9LAotfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfMzlbM10gPSB7Ci0gICAgezEsIGFyY3NfMzlfMH0sCi0gICAgezMsIGFyY3NfMzlfMX0sCi0gICAgezEsIGFyY3NfMzlfMn0sCi19Owotc3RhdGljIGFyYyBhcmNzXzQwXzBbMV0gPSB7CiAgICAgezk2LCAxfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNDBfMVsxXSA9IHsKLSAgICB7MjYsIDJ9LAorc3RhdGljIGFyYyBhcmNzXzM5XzFbMV0gPSB7CisgICAgezAsIDF9LAorfTsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfMzlbMl0gPSB7CisgICAgezksIGFyY3NfMzlfMH0sCisgICAgezEsIGFyY3NfMzlfMX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzQwXzBbMV0gPSB7CisgICAgezIxLCAxfSwKK307CitzdGF0aWMgYXJjIGFyY3NfNDBfMVszXSA9IHsKKyAgICB7MTksIDJ9LAorICAgIHs5NSwgMn0sCisgICAgezkzLCAyfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDBfMlsxXSA9IHsKLSAgICB7MjcsIDN9LAorICAgIHswLCAyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNDBfM1sxXSA9IHsKLSAgICB7MjgsIDR9LAotfTsKLXN0YXRpYyBhcmMgYXJjc180MF80WzNdID0gewotICAgIHs5NywgMX0sCi0gICAgezk4LCA1fSwKLSAgICB7MCwgNH0sCi19Owotc3RhdGljIGFyYyBhcmNzXzQwXzVbMV0gPSB7Ci0gICAgezI3LCA2fSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNDBfNlsxXSA9IHsKLSAgICB7MjgsIDd9LAotfTsKLXN0YXRpYyBhcmMgYXJjc180MF83WzFdID0gewotICAgIHswLCA3fSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzQwWzhdID0geworc3RhdGljIHN0YXRlIHN0YXRlc180MFszXSA9IHsKICAgICB7MSwgYXJjc180MF8wfSwKLSAgICB7MSwgYXJjc180MF8xfSwKKyAgICB7MywgYXJjc180MF8xfSwKICAgICB7MSwgYXJjc180MF8yfSwKLSAgICB7MSwgYXJjc180MF8zfSwKLSAgICB7MywgYXJjc180MF80fSwKLSAgICB7MSwgYXJjc180MF81fSwKLSAgICB7MSwgYXJjc180MF82fSwKLSAgICB7MSwgYXJjc180MF83fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDFfMFsxXSA9IHsKLSAgICB7OTksIDF9LAorICAgIHs5NywgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzQxXzFbMV0gPSB7CiAgICAgezI2LCAyfSwKQEAgLTg5Nyw4ICs4OTksOSBAQAogc3RhdGljIGFyYyBhcmNzXzQxXzNbMV0gPSB7CiAgICAgezI4LCA0fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNDFfNFsyXSA9IHsKLSAgICB7OTgsIDV9LAorc3RhdGljIGFyYyBhcmNzXzQxXzRbM10gPSB7CisgICAgezk4LCAxfSwKKyAgICB7OTksIDV9LAogICAgIHswLCA0fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDFfNVsxXSA9IHsKQEAgLTkxNSw3ICs5MTgsNyBAQAogICAgIHsxLCBhcmNzXzQxXzF9LAogICAgIHsxLCBhcmNzXzQxXzJ9LAogICAgIHsxLCBhcmNzXzQxXzN9LAotICAgIHsyLCBhcmNzXzQxXzR9LAorICAgIHszLCBhcmNzXzQxXzR9LAogICAgIHsxLCBhcmNzXzQxXzV9LAogICAgIHsxLCBhcmNzXzQxXzZ9LAogICAgIHsxLCBhcmNzXzQxXzd9LApAQCAtOTI0LDI1OCArOTI3LDI3MCBAQAogICAgIHsxMDAsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180Ml8xWzFdID0gewotICAgIHs2NSwgMn0sCisgICAgezI2LCAyfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDJfMlsxXSA9IHsKLSAgICB7MTAxLCAzfSwKKyAgICB7MjcsIDN9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180Ml8zWzFdID0gewotICAgIHs5LCA0fSwKKyAgICB7MjgsIDR9LAogfTsKLXN0YXRpYyBhcmMgYXJjc180Ml80WzFdID0gewotICAgIHsyNywgNX0sCitzdGF0aWMgYXJjIGFyY3NfNDJfNFsyXSA9IHsKKyAgICB7OTksIDV9LAorICAgIHswLCA0fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDJfNVsxXSA9IHsKLSAgICB7MjgsIDZ9LAorICAgIHsyNywgNn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzQyXzZbMl0gPSB7Ci0gICAgezk4LCA3fSwKLSAgICB7MCwgNn0sCitzdGF0aWMgYXJjIGFyY3NfNDJfNlsxXSA9IHsKKyAgICB7MjgsIDd9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180Ml83WzFdID0gewotICAgIHsyNywgOH0sCisgICAgezAsIDd9LAogfTsKLXN0YXRpYyBhcmMgYXJjc180Ml84WzFdID0gewotICAgIHsyOCwgOX0sCi19Owotc3RhdGljIGFyYyBhcmNzXzQyXzlbMV0gPSB7Ci0gICAgezAsIDl9LAotfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNDJbMTBdID0geworc3RhdGljIHN0YXRlIHN0YXRlc180Mls4XSA9IHsKICAgICB7MSwgYXJjc180Ml8wfSwKICAgICB7MSwgYXJjc180Ml8xfSwKICAgICB7MSwgYXJjc180Ml8yfSwKICAgICB7MSwgYXJjc180Ml8zfSwKLSAgICB7MSwgYXJjc180Ml80fSwKKyAgICB7MiwgYXJjc180Ml80fSwKICAgICB7MSwgYXJjc180Ml81fSwKLSAgICB7MiwgYXJjc180Ml82fSwKKyAgICB7MSwgYXJjc180Ml82fSwKICAgICB7MSwgYXJjc180Ml83fSwKLSAgICB7MSwgYXJjc180Ml84fSwKLSAgICB7MSwgYXJjc180Ml85fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDNfMFsxXSA9IHsKLSAgICB7MTAyLCAxfSwKKyAgICB7MTAxLCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDNfMVsxXSA9IHsKLSAgICB7MjcsIDJ9LAorICAgIHs2NiwgMn0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzQzXzJbMV0gPSB7Ci0gICAgezI4LCAzfSwKKyAgICB7MTAyLCAzfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNDNfM1syXSA9IHsKLSAgICB7MTAzLCA0fSwKLSAgICB7MTA0LCA1fSwKK3N0YXRpYyBhcmMgYXJjc180M18zWzFdID0geworICAgIHs5LCA0fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDNfNFsxXSA9IHsKLSAgICB7MjcsIDZ9LAorICAgIHsyNywgNX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzQzXzVbMV0gPSB7Ci0gICAgezI3LCA3fSwKKyAgICB7MjgsIDZ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc180M182WzFdID0gewotICAgIHsyOCwgOH0sCitzdGF0aWMgYXJjIGFyY3NfNDNfNlsyXSA9IHsKKyAgICB7OTksIDd9LAorICAgIHswLCA2fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDNfN1sxXSA9IHsKLSAgICB7MjgsIDl9LAorICAgIHsyNywgOH0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzQzXzhbNF0gPSB7Ci0gICAgezEwMywgNH0sCi0gICAgezk4LCAxMH0sCi0gICAgezEwNCwgNX0sCi0gICAgezAsIDh9LAorc3RhdGljIGFyYyBhcmNzXzQzXzhbMV0gPSB7CisgICAgezI4LCA5fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDNfOVsxXSA9IHsKICAgICB7MCwgOX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzQzXzEwWzFdID0gewotICAgIHsyNywgMTF9LAotfTsKLXN0YXRpYyBhcmMgYXJjc180M18xMVsxXSA9IHsKLSAgICB7MjgsIDEyfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNDNfMTJbMl0gPSB7Ci0gICAgezEwNCwgNX0sCi0gICAgezAsIDEyfSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzQzWzEzXSA9IHsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfNDNbMTBdID0gewogICAgIHsxLCBhcmNzXzQzXzB9LAogICAgIHsxLCBhcmNzXzQzXzF9LAogICAgIHsxLCBhcmNzXzQzXzJ9LAotICAgIHsyLCBhcmNzXzQzXzN9LAorICAgIHsxLCBhcmNzXzQzXzN9LAogICAgIHsxLCBhcmNzXzQzXzR9LAogICAgIHsxLCBhcmNzXzQzXzV9LAotICAgIHsxLCBhcmNzXzQzXzZ9LAorICAgIHsyLCBhcmNzXzQzXzZ9LAogICAgIHsxLCBhcmNzXzQzXzd9LAotICAgIHs0LCBhcmNzXzQzXzh9LAorICAgIHsxLCBhcmNzXzQzXzh9LAogICAgIHsxLCBhcmNzXzQzXzl9LAotICAgIHsxLCBhcmNzXzQzXzEwfSwKLSAgICB7MSwgYXJjc180M18xMX0sCi0gICAgezIsIGFyY3NfNDNfMTJ9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180NF8wWzFdID0gewotICAgIHsxMDUsIDF9LAorICAgIHsxMDMsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180NF8xWzFdID0gewotICAgIHsxMDYsIDJ9LAorICAgIHsyNywgMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzQ0XzJbMl0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNDRfMlsxXSA9IHsKKyAgICB7MjgsIDN9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180NF8zWzJdID0geworICAgIHsxMDQsIDR9LAorICAgIHsxMDUsIDV9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180NF80WzFdID0geworICAgIHsyNywgNn0sCit9Oworc3RhdGljIGFyYyBhcmNzXzQ0XzVbMV0gPSB7CisgICAgezI3LCA3fSwKK307CitzdGF0aWMgYXJjIGFyY3NfNDRfNlsxXSA9IHsKKyAgICB7MjgsIDh9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180NF83WzFdID0geworICAgIHsyOCwgOX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzQ0XzhbNF0gPSB7CisgICAgezEwNCwgNH0sCisgICAgezk5LCAxMH0sCisgICAgezEwNSwgNX0sCisgICAgezAsIDh9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180NF85WzFdID0geworICAgIHswLCA5fSwKK307CitzdGF0aWMgYXJjIGFyY3NfNDRfMTBbMV0gPSB7CisgICAgezI3LCAxMX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzQ0XzExWzFdID0geworICAgIHsyOCwgMTJ9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180NF8xMlsyXSA9IHsKKyAgICB7MTA1LCA1fSwKKyAgICB7MCwgMTJ9LAorfTsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfNDRbMTNdID0geworICAgIHsxLCBhcmNzXzQ0XzB9LAorICAgIHsxLCBhcmNzXzQ0XzF9LAorICAgIHsxLCBhcmNzXzQ0XzJ9LAorICAgIHsyLCBhcmNzXzQ0XzN9LAorICAgIHsxLCBhcmNzXzQ0XzR9LAorICAgIHsxLCBhcmNzXzQ0XzV9LAorICAgIHsxLCBhcmNzXzQ0XzZ9LAorICAgIHsxLCBhcmNzXzQ0Xzd9LAorICAgIHs0LCBhcmNzXzQ0Xzh9LAorICAgIHsxLCBhcmNzXzQ0Xzl9LAorICAgIHsxLCBhcmNzXzQ0XzEwfSwKKyAgICB7MSwgYXJjc180NF8xMX0sCisgICAgezIsIGFyY3NfNDRfMTJ9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180NV8wWzFdID0geworICAgIHsxMDYsIDF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180NV8xWzFdID0geworICAgIHsxMDcsIDJ9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180NV8yWzJdID0gewogICAgIHszMiwgMX0sCiAgICAgezI3LCAzfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNDRfM1sxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc180NV8zWzFdID0gewogICAgIHsyOCwgNH0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzQ0XzRbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNDVfNFsxXSA9IHsKICAgICB7MCwgNH0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc180NFs1XSA9IHsKLSAgICB7MSwgYXJjc180NF8wfSwKLSAgICB7MSwgYXJjc180NF8xfSwKLSAgICB7MiwgYXJjc180NF8yfSwKLSAgICB7MSwgYXJjc180NF8zfSwKLSAgICB7MSwgYXJjc180NF80fSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNDVfMFsxXSA9IHsKLSAgICB7MjYsIDF9LAotfTsKLXN0YXRpYyBhcmMgYXJjc180NV8xWzJdID0gewotICAgIHs4NSwgMn0sCi0gICAgezAsIDF9LAotfTsKLXN0YXRpYyBhcmMgYXJjc180NV8yWzFdID0gewotICAgIHsxMDcsIDN9LAotfTsKLXN0YXRpYyBhcmMgYXJjc180NV8zWzFdID0gewotICAgIHswLCAzfSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzQ1WzRdID0geworc3RhdGljIHN0YXRlIHN0YXRlc180NVs1XSA9IHsKICAgICB7MSwgYXJjc180NV8wfSwKLSAgICB7MiwgYXJjc180NV8xfSwKLSAgICB7MSwgYXJjc180NV8yfSwKKyAgICB7MSwgYXJjc180NV8xfSwKKyAgICB7MiwgYXJjc180NV8yfSwKICAgICB7MSwgYXJjc180NV8zfSwKKyAgICB7MSwgYXJjc180NV80fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDZfMFsxXSA9IHsKLSAgICB7MTA4LCAxfSwKKyAgICB7MjYsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180Nl8xWzJdID0geworICAgIHs4NiwgMn0sCisgICAgezAsIDF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180Nl8yWzFdID0geworICAgIHsxMDgsIDN9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180Nl8zWzFdID0geworICAgIHswLCAzfSwKK307CitzdGF0aWMgc3RhdGUgc3RhdGVzXzQ2WzRdID0geworICAgIHsxLCBhcmNzXzQ2XzB9LAorICAgIHsyLCBhcmNzXzQ2XzF9LAorICAgIHsxLCBhcmNzXzQ2XzJ9LAorICAgIHsxLCBhcmNzXzQ2XzN9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180N18wWzFdID0geworICAgIHsxMDksIDF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180N18xWzJdID0gewogICAgIHsyNiwgMn0sCiAgICAgezAsIDF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc180Nl8yWzJdID0gewotICAgIHs4NSwgM30sCitzdGF0aWMgYXJjIGFyY3NfNDdfMlsyXSA9IHsKKyAgICB7ODYsIDN9LAogICAgIHswLCAyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNDZfM1sxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc180N18zWzFdID0gewogICAgIHsyMywgNH0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzQ2XzRbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNDdfNFsxXSA9IHsKICAgICB7MCwgNH0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc180Nls1XSA9IHsKLSAgICB7MSwgYXJjc180Nl8wfSwKLSAgICB7MiwgYXJjc180Nl8xfSwKLSAgICB7MiwgYXJjc180Nl8yfSwKLSAgICB7MSwgYXJjc180Nl8zfSwKLSAgICB7MSwgYXJjc180Nl80fSwKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfNDdbNV0gPSB7CisgICAgezEsIGFyY3NfNDdfMH0sCisgICAgezIsIGFyY3NfNDdfMX0sCisgICAgezIsIGFyY3NfNDdfMn0sCisgICAgezEsIGFyY3NfNDdfM30sCisgICAgezEsIGFyY3NfNDdfNH0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzQ3XzBbMl0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNDhfMFsyXSA9IHsKICAgICB7MywgMX0sCiAgICAgezIsIDJ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc180N18xWzFdID0gewotICAgIHswLCAxfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNDdfMlsxXSA9IHsKLSAgICB7MTA5LCAzfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNDdfM1sxXSA9IHsKLSAgICB7NiwgNH0sCi19Owotc3RhdGljIGFyYyBhcmNzXzQ3XzRbMl0gPSB7Ci0gICAgezYsIDR9LAotICAgIHsxMTAsIDF9LAotfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNDdbNV0gPSB7Ci0gICAgezIsIGFyY3NfNDdfMH0sCi0gICAgezEsIGFyY3NfNDdfMX0sCi0gICAgezEsIGFyY3NfNDdfMn0sCi0gICAgezEsIGFyY3NfNDdfM30sCi0gICAgezIsIGFyY3NfNDdfNH0sCi19Owotc3RhdGljIGFyYyBhcmNzXzQ4XzBbMl0gPSB7Ci0gICAgezExMSwgMX0sCi0gICAgezExMiwgMn0sCi19Owotc3RhdGljIGFyYyBhcmNzXzQ4XzFbMl0gPSB7Ci0gICAgezk2LCAzfSwKK3N0YXRpYyBhcmMgYXJjc180OF8xWzFdID0gewogICAgIHswLCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDhfMlsxXSA9IHsKLSAgICB7MCwgMn0sCisgICAgezExMCwgM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzQ4XzNbMV0gPSB7Ci0gICAgezExMSwgNH0sCisgICAgezYsIDR9LAogfTsKLXN0YXRpYyBhcmMgYXJjc180OF80WzFdID0gewotICAgIHs5OCwgNX0sCitzdGF0aWMgYXJjIGFyY3NfNDhfNFsyXSA9IHsKKyAgICB7NiwgNH0sCisgICAgezExMSwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzQ4XzVbMV0gPSB7Ci0gICAgezI2LCAyfSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzQ4WzZdID0geworc3RhdGljIHN0YXRlIHN0YXRlc180OFs1XSA9IHsKICAgICB7MiwgYXJjc180OF8wfSwKLSAgICB7MiwgYXJjc180OF8xfSwKKyAgICB7MSwgYXJjc180OF8xfSwKICAgICB7MSwgYXJjc180OF8yfSwKICAgICB7MSwgYXJjc180OF8zfSwKLSAgICB7MSwgYXJjc180OF80fSwKLSAgICB7MSwgYXJjc180OF81fSwKKyAgICB7MiwgYXJjc180OF80fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNDlfMFsyXSA9IHsKLSAgICB7MTExLCAxfSwKLSAgICB7MTE0LCAxfSwKKyAgICB7MTEyLCAxfSwKKyAgICB7MTEzLCAyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNDlfMVsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc180OV8xWzJdID0geworICAgIHs5NywgM30sCiAgICAgezAsIDF9LAogfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNDlbMl0gPSB7Ci0gICAgezIsIGFyY3NfNDlfMH0sCi0gICAgezEsIGFyY3NfNDlfMX0sCitzdGF0aWMgYXJjIGFyY3NfNDlfMlsxXSA9IHsKKyAgICB7MCwgMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzUwXzBbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNDlfM1sxXSA9IHsKKyAgICB7MTEyLCA0fSwKK307CitzdGF0aWMgYXJjIGFyY3NfNDlfNFsxXSA9IHsKKyAgICB7OTksIDV9LAorfTsKK3N0YXRpYyBhcmMgYXJjc180OV81WzFdID0geworICAgIHsyNiwgMn0sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc180OVs2XSA9IHsKKyAgICB7MiwgYXJjc180OV8wfSwKKyAgICB7MiwgYXJjc180OV8xfSwKKyAgICB7MSwgYXJjc180OV8yfSwKKyAgICB7MSwgYXJjc180OV8zfSwKKyAgICB7MSwgYXJjc180OV80fSwKKyAgICB7MSwgYXJjc180OV81fSwKK307CitzdGF0aWMgYXJjIGFyY3NfNTBfMFsyXSA9IHsKKyAgICB7MTEyLCAxfSwKICAgICB7MTE1LCAxfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNTBfMVsyXSA9IHsKLSAgICB7MzUsIDJ9LAotICAgIHsyNywgM30sCitzdGF0aWMgYXJjIGFyY3NfNTBfMVsxXSA9IHsKKyAgICB7MCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzUwXzJbMV0gPSB7Ci0gICAgezI3LCAzfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNTBfM1sxXSA9IHsKLSAgICB7MjYsIDR9LAotfTsKLXN0YXRpYyBhcmMgYXJjc181MF80WzFdID0gewotICAgIHswLCA0fSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzUwWzVdID0gewotICAgIHsxLCBhcmNzXzUwXzB9LAotICAgIHsyLCBhcmNzXzUwXzF9LAotICAgIHsxLCBhcmNzXzUwXzJ9LAotICAgIHsxLCBhcmNzXzUwXzN9LAotICAgIHsxLCBhcmNzXzUwXzR9LAorc3RhdGljIHN0YXRlIHN0YXRlc181MFsyXSA9IHsKKyAgICB7MiwgYXJjc181MF8wfSwKKyAgICB7MSwgYXJjc181MF8xfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNTFfMFsxXSA9IHsKLSAgICB7MTE1LCAxfSwKKyAgICB7MTE2LCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNTFfMVsyXSA9IHsKICAgICB7MzUsIDJ9LApAQCAtMTE4NSw3ICsxMjAwLDcgQEAKICAgICB7MjcsIDN9LAogfTsKIHN0YXRpYyBhcmMgYXJjc181MV8zWzFdID0gewotICAgIHsxMTMsIDR9LAorICAgIHsyNiwgNH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzUxXzRbMV0gPSB7CiAgICAgezAsIDR9LApAQCAtMTIwMSwxMDggKzEyMTYsMTIwIEBACiAgICAgezExNiwgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzUyXzFbMl0gPSB7Ci0gICAgezExNywgMH0sCi0gICAgezAsIDF9LAorICAgIHszNSwgMn0sCisgICAgezI3LCAzfSwKIH07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzUyWzJdID0geworc3RhdGljIGFyYyBhcmNzXzUyXzJbMV0gPSB7CisgICAgezI3LCAzfSwKK307CitzdGF0aWMgYXJjIGFyY3NfNTJfM1sxXSA9IHsKKyAgICB7MTE0LCA0fSwKK307CitzdGF0aWMgYXJjIGFyY3NfNTJfNFsxXSA9IHsKKyAgICB7MCwgNH0sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc181Mls1XSA9IHsKICAgICB7MSwgYXJjc181Ml8wfSwKICAgICB7MiwgYXJjc181Ml8xfSwKKyAgICB7MSwgYXJjc181Ml8yfSwKKyAgICB7MSwgYXJjc181Ml8zfSwKKyAgICB7MSwgYXJjc181Ml80fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNTNfMFsxXSA9IHsKLSAgICB7MTE4LCAxfSwKKyAgICB7MTE3LCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNTNfMVsyXSA9IHsKLSAgICB7MTE5LCAwfSwKKyAgICB7MTE4LCAwfSwKICAgICB7MCwgMX0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc181M1syXSA9IHsKICAgICB7MSwgYXJjc181M18wfSwKICAgICB7MiwgYXJjc181M18xfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNTRfMFsyXSA9IHsKLSAgICB7MTIwLCAxfSwKLSAgICB7MTIxLCAyfSwKK3N0YXRpYyBhcmMgYXJjc181NF8wWzFdID0geworICAgIHsxMTksIDF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc181NF8xWzFdID0gewotICAgIHsxMTgsIDJ9LAotfTsKLXN0YXRpYyBhcmMgYXJjc181NF8yWzFdID0gewotICAgIHswLCAyfSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzU0WzNdID0gewotICAgIHsyLCBhcmNzXzU0XzB9LAotICAgIHsxLCBhcmNzXzU0XzF9LAotICAgIHsxLCBhcmNzXzU0XzJ9LAotfTsKLXN0YXRpYyBhcmMgYXJjc181NV8wWzFdID0gewotICAgIHsxMDcsIDF9LAotfTsKLXN0YXRpYyBhcmMgYXJjc181NV8xWzJdID0gewotICAgIHsxMjIsIDB9LAorc3RhdGljIGFyYyBhcmNzXzU0XzFbMl0gPSB7CisgICAgezEyMCwgMH0sCiAgICAgezAsIDF9LAogfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNTVbMl0gPSB7Ci0gICAgezEsIGFyY3NfNTVfMH0sCi0gICAgezIsIGFyY3NfNTVfMX0sCitzdGF0aWMgc3RhdGUgc3RhdGVzXzU0WzJdID0geworICAgIHsxLCBhcmNzXzU0XzB9LAorICAgIHsyLCBhcmNzXzU0XzF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc181Nl8wWzEwXSA9IHsKLSAgICB7MTIzLCAxfSwKK3N0YXRpYyBhcmMgYXJjc181NV8wWzJdID0geworICAgIHsxMjEsIDF9LAorICAgIHsxMjIsIDJ9LAorfTsKK3N0YXRpYyBhcmMgYXJjc181NV8xWzFdID0geworICAgIHsxMTksIDJ9LAorfTsKK3N0YXRpYyBhcmMgYXJjc181NV8yWzFdID0geworICAgIHswLCAyfSwKK307CitzdGF0aWMgc3RhdGUgc3RhdGVzXzU1WzNdID0geworICAgIHsyLCBhcmNzXzU1XzB9LAorICAgIHsxLCBhcmNzXzU1XzF9LAorICAgIHsxLCBhcmNzXzU1XzJ9LAorfTsKK3N0YXRpYyBhcmMgYXJjc181Nl8wWzFdID0geworICAgIHsxMDgsIDF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc181Nl8xWzJdID0geworICAgIHsxMjMsIDB9LAorICAgIHswLCAxfSwKK307CitzdGF0aWMgc3RhdGUgc3RhdGVzXzU2WzJdID0geworICAgIHsxLCBhcmNzXzU2XzB9LAorICAgIHsyLCBhcmNzXzU2XzF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc181N18wWzEwXSA9IHsKICAgICB7MTI0LCAxfSwKICAgICB7MTI1LCAxfSwKICAgICB7MTI2LCAxfSwKICAgICB7MTI3LCAxfSwKICAgICB7MTI4LCAxfSwKICAgICB7MTI5LCAxfSwKLSAgICB7MTAxLCAxfSwKLSAgICB7MTIwLCAyfSwKLSAgICB7MTMwLCAzfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNTZfMVsxXSA9IHsKLSAgICB7MCwgMX0sCi19Owotc3RhdGljIGFyYyBhcmNzXzU2XzJbMV0gPSB7Ci0gICAgezEwMSwgMX0sCi19Owotc3RhdGljIGFyYyBhcmNzXzU2XzNbMl0gPSB7Ci0gICAgezEyMCwgMX0sCi0gICAgezAsIDN9LAotfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNTZbNF0gPSB7Ci0gICAgezEwLCBhcmNzXzU2XzB9LAotICAgIHsxLCBhcmNzXzU2XzF9LAotICAgIHsxLCBhcmNzXzU2XzJ9LAotICAgIHsyLCBhcmNzXzU2XzN9LAotfTsKLXN0YXRpYyBhcmMgYXJjc181N18wWzFdID0gewotICAgIHszMywgMX0sCisgICAgezEzMCwgMX0sCisgICAgezEwMiwgMX0sCisgICAgezEyMSwgMn0sCisgICAgezEzMSwgM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzU3XzFbMV0gPSB7Ci0gICAgezEwNywgMn0sCi19Owotc3RhdGljIGFyYyBhcmNzXzU3XzJbMV0gPSB7Ci0gICAgezAsIDJ9LAotfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNTdbM10gPSB7Ci0gICAgezEsIGFyY3NfNTdfMH0sCi0gICAgezEsIGFyY3NfNTdfMX0sCi0gICAgezEsIGFyY3NfNTdfMn0sCi19Owotc3RhdGljIGFyYyBhcmNzXzU4XzBbMV0gPSB7Ci0gICAgezEzMSwgMX0sCi19Owotc3RhdGljIGFyYyBhcmNzXzU4XzFbMl0gPSB7Ci0gICAgezEzMiwgMH0sCiAgICAgezAsIDF9LAogfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNThbMl0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNTdfMlsxXSA9IHsKKyAgICB7MTAyLCAxfSwKK307CitzdGF0aWMgYXJjIGFyY3NfNTdfM1syXSA9IHsKKyAgICB7MTIxLCAxfSwKKyAgICB7MCwgM30sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc181N1s0XSA9IHsKKyAgICB7MTAsIGFyY3NfNTdfMH0sCisgICAgezEsIGFyY3NfNTdfMX0sCisgICAgezEsIGFyY3NfNTdfMn0sCisgICAgezIsIGFyY3NfNTdfM30sCit9Oworc3RhdGljIGFyYyBhcmNzXzU4XzBbMV0gPSB7CisgICAgezMzLCAxfSwKK307CitzdGF0aWMgYXJjIGFyY3NfNThfMVsxXSA9IHsKKyAgICB7MTA4LCAyfSwKK307CitzdGF0aWMgYXJjIGFyY3NfNThfMlsxXSA9IHsKKyAgICB7MCwgMn0sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc181OFszXSA9IHsKICAgICB7MSwgYXJjc181OF8wfSwKLSAgICB7MiwgYXJjc181OF8xfSwKKyAgICB7MSwgYXJjc181OF8xfSwKKyAgICB7MSwgYXJjc181OF8yfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNTlfMFsxXSA9IHsKLSAgICB7MTMzLCAxfSwKKyAgICB7MTMyLCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNTlfMVsyXSA9IHsKLSAgICB7MTM0LCAwfSwKKyAgICB7MTMzLCAwfSwKICAgICB7MCwgMX0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc181OVsyXSA9IHsKQEAgLTEzMTAsMTAgKzEzMzcsMTAgQEAKICAgICB7MiwgYXJjc181OV8xfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNjBfMFsxXSA9IHsKLSAgICB7MTM1LCAxfSwKKyAgICB7MTM0LCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNjBfMVsyXSA9IHsKLSAgICB7MTM2LCAwfSwKKyAgICB7MTM1LCAwfSwKICAgICB7MCwgMX0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc182MFsyXSA9IHsKQEAgLTEzMjEsMjMgKzEzNDgsMjIgQEAKICAgICB7MiwgYXJjc182MF8xfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNjFfMFsxXSA9IHsKLSAgICB7MTM3LCAxfSwKKyAgICB7MTM2LCAxfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNjFfMVszXSA9IHsKLSAgICB7MTM4LCAwfSwKLSAgICB7MTM5LCAwfSwKK3N0YXRpYyBhcmMgYXJjc182MV8xWzJdID0geworICAgIHsxMzcsIDB9LAogICAgIHswLCAxfSwKIH07CiBzdGF0aWMgc3RhdGUgc3RhdGVzXzYxWzJdID0gewogICAgIHsxLCBhcmNzXzYxXzB9LAotICAgIHszLCBhcmNzXzYxXzF9LAorICAgIHsyLCBhcmNzXzYxXzF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc182Ml8wWzFdID0gewotICAgIHsxNDAsIDF9LAorICAgIHsxMzgsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc182Ml8xWzNdID0gewotICAgIHsxNDEsIDB9LAotICAgIHsxNDIsIDB9LAorICAgIHsxMzksIDB9LAorICAgIHsxNDAsIDB9LAogICAgIHswLCAxfSwKIH07CiBzdGF0aWMgc3RhdGUgc3RhdGVzXzYyWzJdID0gewpAQCAtMTM0NSw1MjggKzEzNzEsNTQ1IEBACiAgICAgezMsIGFyY3NfNjJfMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzYzXzBbMV0gPSB7Ci0gICAgezE0MywgMX0sCisgICAgezE0MSwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzYzXzFbNl0gPSB7Ci0gICAgezMzLCAwfSwKLSAgICB7MTEsIDB9LAotICAgIHsxNDQsIDB9LAotICAgIHsxNDUsIDB9LAotICAgIHsxNDYsIDB9LAorc3RhdGljIGFyYyBhcmNzXzYzXzFbM10gPSB7CisgICAgezE0MiwgMH0sCisgICAgezE0MywgMH0sCiAgICAgezAsIDF9LAogfTsKIHN0YXRpYyBzdGF0ZSBzdGF0ZXNfNjNbMl0gPSB7CiAgICAgezEsIGFyY3NfNjNfMH0sCi0gICAgezYsIGFyY3NfNjNfMX0sCisgICAgezMsIGFyY3NfNjNfMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzY0XzBbNF0gPSB7Ci0gICAgezE0MSwgMX0sCitzdGF0aWMgYXJjIGFyY3NfNjRfMFsxXSA9IHsKKyAgICB7MTQ0LCAxfSwKK307CitzdGF0aWMgYXJjIGFyY3NfNjRfMVs2XSA9IHsKKyAgICB7MzMsIDB9LAorICAgIHsxMSwgMH0sCisgICAgezE0NSwgMH0sCisgICAgezE0NiwgMH0sCisgICAgezE0NywgMH0sCisgICAgezAsIDF9LAorfTsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfNjRbMl0gPSB7CisgICAgezEsIGFyY3NfNjRfMH0sCisgICAgezYsIGFyY3NfNjRfMX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzY1XzBbNF0gPSB7CiAgICAgezE0MiwgMX0sCi0gICAgezE0NywgMX0sCi0gICAgezE0OCwgMn0sCisgICAgezE0MywgMX0sCisgICAgezE0OCwgMX0sCisgICAgezE0OSwgMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzY0XzFbMV0gPSB7Ci0gICAgezE0MywgMn0sCitzdGF0aWMgYXJjIGFyY3NfNjVfMVsxXSA9IHsKKyAgICB7MTQ0LCAyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNjRfMlsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc182NV8yWzFdID0gewogICAgIHswLCAyfSwKIH07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzY0WzNdID0gewotICAgIHs0LCBhcmNzXzY0XzB9LAotICAgIHsxLCBhcmNzXzY0XzF9LAotICAgIHsxLCBhcmNzXzY0XzJ9LAorc3RhdGljIHN0YXRlIHN0YXRlc182NVszXSA9IHsKKyAgICB7NCwgYXJjc182NV8wfSwKKyAgICB7MSwgYXJjc182NV8xfSwKKyAgICB7MSwgYXJjc182NV8yfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNjVfMFsxXSA9IHsKLSAgICB7MTQ5LCAxfSwKK3N0YXRpYyBhcmMgYXJjc182Nl8wWzFdID0geworICAgIHsxNTAsIDF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc182NV8xWzJdID0geworc3RhdGljIGFyYyBhcmNzXzY2XzFbMl0gPSB7CiAgICAgezM0LCAyfSwKICAgICB7MCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzY1XzJbMV0gPSB7Ci0gICAgezE0MywgM30sCitzdGF0aWMgYXJjIGFyY3NfNjZfMlsxXSA9IHsKKyAgICB7MTQ0LCAzfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNjVfM1sxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc182Nl8zWzFdID0gewogICAgIHswLCAzfSwKIH07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzY1WzRdID0gewotICAgIHsxLCBhcmNzXzY1XzB9LAotICAgIHsyLCBhcmNzXzY1XzF9LAotICAgIHsxLCBhcmNzXzY1XzJ9LAotICAgIHsxLCBhcmNzXzY1XzN9LAorc3RhdGljIHN0YXRlIHN0YXRlc182Nls0XSA9IHsKKyAgICB7MSwgYXJjc182Nl8wfSwKKyAgICB7MiwgYXJjc182Nl8xfSwKKyAgICB7MSwgYXJjc182Nl8yfSwKKyAgICB7MSwgYXJjc182Nl8zfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNjZfMFsyXSA9IHsKLSAgICB7MTUwLCAxfSwKLSAgICB7MTUxLCAyfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNjZfMVsxXSA9IHsKLSAgICB7MTUxLCAyfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNjZfMlsyXSA9IHsKK3N0YXRpYyBhcmMgYXJjc182N18wWzJdID0geworICAgIHsxNTEsIDF9LAogICAgIHsxNTIsIDJ9LAotICAgIHswLCAyfSwKIH07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzY2WzNdID0gewotICAgIHsyLCBhcmNzXzY2XzB9LAotICAgIHsxLCBhcmNzXzY2XzF9LAotICAgIHsyLCBhcmNzXzY2XzJ9LAotfTsKLXN0YXRpYyBhcmMgYXJjc182N18wWzEwXSA9IHsKLSAgICB7MTMsIDF9LAotICAgIHsxNTQsIDJ9LAotICAgIHsxNTYsIDN9LAotICAgIHsyMywgNH0sCi0gICAgezE1OSwgNH0sCi0gICAgezE2MCwgNX0sCi0gICAgezgyLCA0fSwKLSAgICB7MTYxLCA0fSwKLSAgICB7MTYyLCA0fSwKLSAgICB7MTYzLCA0fSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNjdfMVszXSA9IHsKLSAgICB7NDksIDZ9LAotICAgIHsxNTMsIDZ9LAotICAgIHsxNSwgNH0sCitzdGF0aWMgYXJjIGFyY3NfNjdfMVsxXSA9IHsKKyAgICB7MTUyLCAyfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNjdfMlsyXSA9IHsKLSAgICB7MTUzLCA3fSwKLSAgICB7MTU1LCA0fSwKKyAgICB7MTUzLCAyfSwKKyAgICB7MCwgMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzY3XzNbMl0gPSB7Ci0gICAgezE1NywgOH0sCi0gICAgezE1OCwgNH0sCi19Owotc3RhdGljIGFyYyBhcmNzXzY3XzRbMV0gPSB7Ci0gICAgezAsIDR9LAotfTsKLXN0YXRpYyBhcmMgYXJjc182N181WzJdID0gewotICAgIHsxNjAsIDV9LAotICAgIHswLCA1fSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNjdfNlsxXSA9IHsKLSAgICB7MTUsIDR9LAotfTsKLXN0YXRpYyBhcmMgYXJjc182N183WzFdID0gewotICAgIHsxNTUsIDR9LAotfTsKLXN0YXRpYyBhcmMgYXJjc182N184WzFdID0gewotICAgIHsxNTgsIDR9LAotfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNjdbOV0gPSB7Ci0gICAgezEwLCBhcmNzXzY3XzB9LAotICAgIHszLCBhcmNzXzY3XzF9LAorc3RhdGljIHN0YXRlIHN0YXRlc182N1szXSA9IHsKKyAgICB7MiwgYXJjc182N18wfSwKKyAgICB7MSwgYXJjc182N18xfSwKICAgICB7MiwgYXJjc182N18yfSwKLSAgICB7MiwgYXJjc182N18zfSwKLSAgICB7MSwgYXJjc182N180fSwKLSAgICB7MiwgYXJjc182N181fSwKLSAgICB7MSwgYXJjc182N182fSwKLSAgICB7MSwgYXJjc182N183fSwKLSAgICB7MSwgYXJjc182N184fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNjhfMFsyXSA9IHsKLSAgICB7MjYsIDF9LAotICAgIHs1MCwgMX0sCitzdGF0aWMgYXJjIGFyY3NfNjhfMFsxMF0gPSB7CisgICAgezEzLCAxfSwKKyAgICB7MTU1LCAyfSwKKyAgICB7MTU3LCAzfSwKKyAgICB7MjMsIDR9LAorICAgIHsxNjAsIDR9LAorICAgIHsxNjEsIDV9LAorICAgIHs4MywgNH0sCisgICAgezE2MiwgNH0sCisgICAgezE2MywgNH0sCisgICAgezE2NCwgNH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzY4XzFbM10gPSB7Ci0gICAgezE2NCwgMn0sCisgICAgezUwLCA2fSwKKyAgICB7MTU0LCA2fSwKKyAgICB7MTUsIDR9LAorfTsKK3N0YXRpYyBhcmMgYXJjc182OF8yWzJdID0geworICAgIHsxNTQsIDd9LAorICAgIHsxNTYsIDR9LAorfTsKK3N0YXRpYyBhcmMgYXJjc182OF8zWzJdID0geworICAgIHsxNTgsIDh9LAorICAgIHsxNTksIDR9LAorfTsKK3N0YXRpYyBhcmMgYXJjc182OF80WzFdID0geworICAgIHswLCA0fSwKK307CitzdGF0aWMgYXJjIGFyY3NfNjhfNVsyXSA9IHsKKyAgICB7MTYxLCA1fSwKKyAgICB7MCwgNX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzY4XzZbMV0gPSB7CisgICAgezE1LCA0fSwKK307CitzdGF0aWMgYXJjIGFyY3NfNjhfN1sxXSA9IHsKKyAgICB7MTU2LCA0fSwKK307CitzdGF0aWMgYXJjIGFyY3NfNjhfOFsxXSA9IHsKKyAgICB7MTU5LCA0fSwKK307CitzdGF0aWMgc3RhdGUgc3RhdGVzXzY4WzldID0geworICAgIHsxMCwgYXJjc182OF8wfSwKKyAgICB7MywgYXJjc182OF8xfSwKKyAgICB7MiwgYXJjc182OF8yfSwKKyAgICB7MiwgYXJjc182OF8zfSwKKyAgICB7MSwgYXJjc182OF80fSwKKyAgICB7MiwgYXJjc182OF81fSwKKyAgICB7MSwgYXJjc182OF82fSwKKyAgICB7MSwgYXJjc182OF83fSwKKyAgICB7MSwgYXJjc182OF84fSwKK307CitzdGF0aWMgYXJjIGFyY3NfNjlfMFsyXSA9IHsKKyAgICB7MjYsIDF9LAorICAgIHs1MSwgMX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzY5XzFbM10gPSB7CisgICAgezE2NSwgMn0sCiAgICAgezMyLCAzfSwKICAgICB7MCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzY4XzJbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNjlfMlsxXSA9IHsKICAgICB7MCwgMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzY4XzNbM10gPSB7CitzdGF0aWMgYXJjIGFyY3NfNjlfM1szXSA9IHsKICAgICB7MjYsIDR9LAotICAgIHs1MCwgNH0sCisgICAgezUxLCA0fSwKICAgICB7MCwgM30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzY4XzRbMl0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNjlfNFsyXSA9IHsKICAgICB7MzIsIDN9LAogICAgIHswLCA0fSwKIH07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzY4WzVdID0gewotICAgIHsyLCBhcmNzXzY4XzB9LAotICAgIHszLCBhcmNzXzY4XzF9LAotICAgIHsxLCBhcmNzXzY4XzJ9LAotICAgIHszLCBhcmNzXzY4XzN9LAotICAgIHsyLCBhcmNzXzY4XzR9LAorc3RhdGljIHN0YXRlIHN0YXRlc182OVs1XSA9IHsKKyAgICB7MiwgYXJjc182OV8wfSwKKyAgICB7MywgYXJjc182OV8xfSwKKyAgICB7MSwgYXJjc182OV8yfSwKKyAgICB7MywgYXJjc182OV8zfSwKKyAgICB7MiwgYXJjc182OV80fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNjlfMFszXSA9IHsKK3N0YXRpYyBhcmMgYXJjc183MF8wWzNdID0gewogICAgIHsxMywgMX0sCi0gICAgezE1NCwgMn0sCi0gICAgezgxLCAzfSwKKyAgICB7MTU1LCAyfSwKKyAgICB7ODIsIDN9LAogfTsKLXN0YXRpYyBhcmMgYXJjc182OV8xWzJdID0geworc3RhdGljIGFyYyBhcmNzXzcwXzFbMl0gPSB7CiAgICAgezE0LCA0fSwKICAgICB7MTUsIDV9LAogfTsKLXN0YXRpYyBhcmMgYXJjc182OV8yWzFdID0gewotICAgIHsxNjUsIDZ9LAorc3RhdGljIGFyYyBhcmNzXzcwXzJbMV0gPSB7CisgICAgezE2NiwgNn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzY5XzNbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNzBfM1sxXSA9IHsKICAgICB7MjMsIDV9LAogfTsKLXN0YXRpYyBhcmMgYXJjc182OV80WzFdID0geworc3RhdGljIGFyYyBhcmNzXzcwXzRbMV0gPSB7CiAgICAgezE1LCA1fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNjlfNVsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc183MF81WzFdID0gewogICAgIHswLCA1fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNjlfNlsxXSA9IHsKLSAgICB7MTU1LCA1fSwKK3N0YXRpYyBhcmMgYXJjc183MF82WzFdID0geworICAgIHsxNTYsIDV9LAogfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNjlbN10gPSB7Ci0gICAgezMsIGFyY3NfNjlfMH0sCi0gICAgezIsIGFyY3NfNjlfMX0sCi0gICAgezEsIGFyY3NfNjlfMn0sCi0gICAgezEsIGFyY3NfNjlfM30sCi0gICAgezEsIGFyY3NfNjlfNH0sCi0gICAgezEsIGFyY3NfNjlfNX0sCi0gICAgezEsIGFyY3NfNjlfNn0sCitzdGF0aWMgc3RhdGUgc3RhdGVzXzcwWzddID0geworICAgIHszLCBhcmNzXzcwXzB9LAorICAgIHsyLCBhcmNzXzcwXzF9LAorICAgIHsxLCBhcmNzXzcwXzJ9LAorICAgIHsxLCBhcmNzXzcwXzN9LAorICAgIHsxLCBhcmNzXzcwXzR9LAorICAgIHsxLCBhcmNzXzcwXzV9LAorICAgIHsxLCBhcmNzXzcwXzZ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc183MF8wWzFdID0gewotICAgIHsxNjYsIDF9LAorc3RhdGljIGFyYyBhcmNzXzcxXzBbMV0gPSB7CisgICAgezE2NywgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzcwXzFbMl0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNzFfMVsyXSA9IHsKICAgICB7MzIsIDJ9LAogICAgIHswLCAxfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzBfMlsyXSA9IHsKLSAgICB7MTY2LCAxfSwKK3N0YXRpYyBhcmMgYXJjc183MV8yWzJdID0geworICAgIHsxNjcsIDF9LAogICAgIHswLCAyfSwKIH07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzcwWzNdID0gewotICAgIHsxLCBhcmNzXzcwXzB9LAotICAgIHsyLCBhcmNzXzcwXzF9LAotICAgIHsyLCBhcmNzXzcwXzJ9LAorc3RhdGljIHN0YXRlIHN0YXRlc183MVszXSA9IHsKKyAgICB7MSwgYXJjc183MV8wfSwKKyAgICB7MiwgYXJjc183MV8xfSwKKyAgICB7MiwgYXJjc183MV8yfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzFfMFsyXSA9IHsKK3N0YXRpYyBhcmMgYXJjc183Ml8wWzJdID0gewogICAgIHsyNiwgMX0sCiAgICAgezI3LCAyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzFfMVsyXSA9IHsKK3N0YXRpYyBhcmMgYXJjc183Ml8xWzJdID0gewogICAgIHsyNywgMn0sCiAgICAgezAsIDF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc183MV8yWzNdID0geworc3RhdGljIGFyYyBhcmNzXzcyXzJbM10gPSB7CiAgICAgezI2LCAzfSwKLSAgICB7MTY3LCA0fSwKKyAgICB7MTY4LCA0fSwKICAgICB7MCwgMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzcxXzNbMl0gPSB7Ci0gICAgezE2NywgNH0sCitzdGF0aWMgYXJjIGFyY3NfNzJfM1syXSA9IHsKKyAgICB7MTY4LCA0fSwKICAgICB7MCwgM30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzcxXzRbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNzJfNFsxXSA9IHsKICAgICB7MCwgNH0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc183MVs1XSA9IHsKLSAgICB7MiwgYXJjc183MV8wfSwKLSAgICB7MiwgYXJjc183MV8xfSwKLSAgICB7MywgYXJjc183MV8yfSwKLSAgICB7MiwgYXJjc183MV8zfSwKLSAgICB7MSwgYXJjc183MV80fSwKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfNzJbNV0gPSB7CisgICAgezIsIGFyY3NfNzJfMH0sCisgICAgezIsIGFyY3NfNzJfMX0sCisgICAgezMsIGFyY3NfNzJfMn0sCisgICAgezIsIGFyY3NfNzJfM30sCisgICAgezEsIGFyY3NfNzJfNH0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzcyXzBbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNzNfMFsxXSA9IHsKICAgICB7MjcsIDF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc183Ml8xWzJdID0geworc3RhdGljIGFyYyBhcmNzXzczXzFbMl0gPSB7CiAgICAgezI2LCAyfSwKICAgICB7MCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzcyXzJbMV0gPSB7Ci0gICAgezAsIDJ9LAotfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNzJbM10gPSB7Ci0gICAgezEsIGFyY3NfNzJfMH0sCi0gICAgezIsIGFyY3NfNzJfMX0sCi0gICAgezEsIGFyY3NfNzJfMn0sCi19Owotc3RhdGljIGFyYyBhcmNzXzczXzBbMl0gPSB7Ci0gICAgezEwNywgMX0sCi0gICAgezUwLCAxfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNzNfMVsyXSA9IHsKLSAgICB7MzIsIDJ9LAotICAgIHswLCAxfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNzNfMlszXSA9IHsKLSAgICB7MTA3LCAxfSwKLSAgICB7NTAsIDF9LAorc3RhdGljIGFyYyBhcmNzXzczXzJbMV0gPSB7CiAgICAgezAsIDJ9LAogfTsKIHN0YXRpYyBzdGF0ZSBzdGF0ZXNfNzNbM10gPSB7Ci0gICAgezIsIGFyY3NfNzNfMH0sCisgICAgezEsIGFyY3NfNzNfMH0sCiAgICAgezIsIGFyY3NfNzNfMX0sCi0gICAgezMsIGFyY3NfNzNfMn0sCisgICAgezEsIGFyY3NfNzNfMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzc0XzBbMV0gPSB7Ci0gICAgezI2LCAxfSwKK3N0YXRpYyBhcmMgYXJjc183NF8wWzJdID0geworICAgIHsxMDgsIDF9LAorICAgIHs1MSwgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzc0XzFbMl0gPSB7CiAgICAgezMyLCAyfSwKICAgICB7MCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzc0XzJbMl0gPSB7Ci0gICAgezI2LCAxfSwKK3N0YXRpYyBhcmMgYXJjc183NF8yWzNdID0geworICAgIHsxMDgsIDF9LAorICAgIHs1MSwgMX0sCiAgICAgezAsIDJ9LAogfTsKIHN0YXRpYyBzdGF0ZSBzdGF0ZXNfNzRbM10gPSB7Ci0gICAgezEsIGFyY3NfNzRfMH0sCisgICAgezIsIGFyY3NfNzRfMH0sCiAgICAgezIsIGFyY3NfNzRfMX0sCi0gICAgezIsIGFyY3NfNzRfMn0sCisgICAgezMsIGFyY3NfNzRfMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzc1XzBbM10gPSB7CitzdGF0aWMgYXJjIGFyY3NfNzVfMFsxXSA9IHsKKyAgICB7MjYsIDF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc183NV8xWzJdID0geworICAgIHszMiwgMn0sCisgICAgezAsIDF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc183NV8yWzJdID0geworICAgIHsyNiwgMX0sCisgICAgezAsIDJ9LAorfTsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfNzVbM10gPSB7CisgICAgezEsIGFyY3NfNzVfMH0sCisgICAgezIsIGFyY3NfNzVfMX0sCisgICAgezIsIGFyY3NfNzVfMn0sCit9Oworc3RhdGljIGFyYyBhcmNzXzc2XzBbM10gPSB7CiAgICAgezI2LCAxfSwKICAgICB7MzQsIDJ9LAotICAgIHs1MCwgM30sCisgICAgezUxLCAzfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzVfMVs0XSA9IHsKK3N0YXRpYyBhcmMgYXJjc183Nl8xWzRdID0gewogICAgIHsyNywgNH0sCi0gICAgezE2NCwgNX0sCisgICAgezE2NSwgNX0sCiAgICAgezMyLCA2fSwKICAgICB7MCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzc1XzJbMV0gPSB7Ci0gICAgezEwNywgN30sCitzdGF0aWMgYXJjIGFyY3NfNzZfMlsxXSA9IHsKKyAgICB7MTA4LCA3fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzVfM1szXSA9IHsKLSAgICB7MTY0LCA1fSwKK3N0YXRpYyBhcmMgYXJjc183Nl8zWzNdID0geworICAgIHsxNjUsIDV9LAogICAgIHszMiwgNn0sCiAgICAgezAsIDN9LAogfTsKLXN0YXRpYyBhcmMgYXJjc183NV80WzFdID0geworc3RhdGljIGFyYyBhcmNzXzc2XzRbMV0gPSB7CiAgICAgezI2LCA3fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzVfNVsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc183Nl81WzFdID0gewogICAgIHswLCA1fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzVfNlszXSA9IHsKK3N0YXRpYyBhcmMgYXJjc183Nl82WzNdID0gewogICAgIHsyNiwgOH0sCi0gICAgezUwLCA4fSwKKyAgICB7NTEsIDh9LAogICAgIHswLCA2fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzVfN1szXSA9IHsKLSAgICB7MTY0LCA1fSwKK3N0YXRpYyBhcmMgYXJjc183Nl83WzNdID0geworICAgIHsxNjUsIDV9LAogICAgIHszMiwgOX0sCiAgICAgezAsIDd9LAogfTsKLXN0YXRpYyBhcmMgYXJjc183NV84WzJdID0geworc3RhdGljIGFyYyBhcmNzXzc2XzhbMl0gPSB7CiAgICAgezMyLCA2fSwKICAgICB7MCwgOH0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzc1XzlbM10gPSB7CitzdGF0aWMgYXJjIGFyY3NfNzZfOVszXSA9IHsKICAgICB7MjYsIDEwfSwKICAgICB7MzQsIDExfSwKICAgICB7MCwgOX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzc1XzEwWzFdID0geworc3RhdGljIGFyYyBhcmNzXzc2XzEwWzFdID0gewogICAgIHsyNywgMTJ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc183NV8xMVsxXSA9IHsKLSAgICB7MTA3LCAxM30sCitzdGF0aWMgYXJjIGFyY3NfNzZfMTFbMV0gPSB7CisgICAgezEwOCwgMTN9LAogfTsKLXN0YXRpYyBhcmMgYXJjc183NV8xMlsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc183Nl8xMlsxXSA9IHsKICAgICB7MjYsIDEzfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzVfMTNbMl0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNzZfMTNbMl0gPSB7CiAgICAgezMyLCA5fSwKICAgICB7MCwgMTN9LAogfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNzVbMTRdID0gewotICAgIHszLCBhcmNzXzc1XzB9LAotICAgIHs0LCBhcmNzXzc1XzF9LAotICAgIHsxLCBhcmNzXzc1XzJ9LAotICAgIHszLCBhcmNzXzc1XzN9LAotICAgIHsxLCBhcmNzXzc1XzR9LAotICAgIHsxLCBhcmNzXzc1XzV9LAotICAgIHszLCBhcmNzXzc1XzZ9LAotICAgIHszLCBhcmNzXzc1Xzd9LAotICAgIHsyLCBhcmNzXzc1Xzh9LAotICAgIHszLCBhcmNzXzc1Xzl9LAotICAgIHsxLCBhcmNzXzc1XzEwfSwKLSAgICB7MSwgYXJjc183NV8xMX0sCi0gICAgezEsIGFyY3NfNzVfMTJ9LAotICAgIHsyLCBhcmNzXzc1XzEzfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNzZfMFsxXSA9IHsKLSAgICB7MTY4LCAxfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNzZfMVsxXSA9IHsKLSAgICB7MjMsIDJ9LAotfTsKLXN0YXRpYyBhcmMgYXJjc183Nl8yWzJdID0gewotICAgIHsxMywgM30sCi0gICAgezI3LCA0fSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNzZfM1syXSA9IHsKLSAgICB7MTQsIDV9LAotICAgIHsxNSwgNn0sCi19Owotc3RhdGljIGFyYyBhcmNzXzc2XzRbMV0gPSB7Ci0gICAgezI4LCA3fSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNzZfNVsxXSA9IHsKLSAgICB7MTUsIDZ9LAotfTsKLXN0YXRpYyBhcmMgYXJjc183Nl82WzFdID0gewotICAgIHsyNywgNH0sCi19Owotc3RhdGljIGFyYyBhcmNzXzc2XzdbMV0gPSB7Ci0gICAgezAsIDd9LAotfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfNzZbOF0gPSB7Ci0gICAgezEsIGFyY3NfNzZfMH0sCi0gICAgezEsIGFyY3NfNzZfMX0sCi0gICAgezIsIGFyY3NfNzZfMn0sCi0gICAgezIsIGFyY3NfNzZfM30sCitzdGF0aWMgc3RhdGUgc3RhdGVzXzc2WzE0XSA9IHsKKyAgICB7MywgYXJjc183Nl8wfSwKKyAgICB7NCwgYXJjc183Nl8xfSwKKyAgICB7MSwgYXJjc183Nl8yfSwKKyAgICB7MywgYXJjc183Nl8zfSwKICAgICB7MSwgYXJjc183Nl80fSwKICAgICB7MSwgYXJjc183Nl81fSwKLSAgICB7MSwgYXJjc183Nl82fSwKLSAgICB7MSwgYXJjc183Nl83fSwKKyAgICB7MywgYXJjc183Nl82fSwKKyAgICB7MywgYXJjc183Nl83fSwKKyAgICB7MiwgYXJjc183Nl84fSwKKyAgICB7MywgYXJjc183Nl85fSwKKyAgICB7MSwgYXJjc183Nl8xMH0sCisgICAgezEsIGFyY3NfNzZfMTF9LAorICAgIHsxLCBhcmNzXzc2XzEyfSwKKyAgICB7MiwgYXJjc183Nl8xM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzc3XzBbMV0gPSB7CiAgICAgezE2OSwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzc3XzFbMl0gPSB7CitzdGF0aWMgYXJjIGFyY3NfNzdfMVsxXSA9IHsKKyAgICB7MjMsIDJ9LAorfTsKK3N0YXRpYyBhcmMgYXJjc183N18yWzJdID0geworICAgIHsxMywgM30sCisgICAgezI3LCA0fSwKK307CitzdGF0aWMgYXJjIGFyY3NfNzdfM1syXSA9IHsKKyAgICB7MTQsIDV9LAorICAgIHsxNSwgNn0sCit9Oworc3RhdGljIGFyYyBhcmNzXzc3XzRbMV0gPSB7CisgICAgezI4LCA3fSwKK307CitzdGF0aWMgYXJjIGFyY3NfNzdfNVsxXSA9IHsKKyAgICB7MTUsIDZ9LAorfTsKK3N0YXRpYyBhcmMgYXJjc183N182WzFdID0geworICAgIHsyNywgNH0sCit9Oworc3RhdGljIGFyYyBhcmNzXzc3XzdbMV0gPSB7CisgICAgezAsIDd9LAorfTsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfNzdbOF0gPSB7CisgICAgezEsIGFyY3NfNzdfMH0sCisgICAgezEsIGFyY3NfNzdfMX0sCisgICAgezIsIGFyY3NfNzdfMn0sCisgICAgezIsIGFyY3NfNzdfM30sCisgICAgezEsIGFyY3NfNzdfNH0sCisgICAgezEsIGFyY3NfNzdfNX0sCisgICAgezEsIGFyY3NfNzdfNn0sCisgICAgezEsIGFyY3NfNzdfN30sCit9Oworc3RhdGljIGFyYyBhcmNzXzc4XzBbMV0gPSB7CisgICAgezE3MCwgMX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzc4XzFbMl0gPSB7CiAgICAgezMyLCAyfSwKICAgICB7MCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzc3XzJbMl0gPSB7Ci0gICAgezE2OSwgMX0sCitzdGF0aWMgYXJjIGFyY3NfNzhfMlsyXSA9IHsKKyAgICB7MTcwLCAxfSwKICAgICB7MCwgMn0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc183N1szXSA9IHsKLSAgICB7MSwgYXJjc183N18wfSwKLSAgICB7MiwgYXJjc183N18xfSwKLSAgICB7MiwgYXJjc183N18yfSwKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfNzhbM10gPSB7CisgICAgezEsIGFyY3NfNzhfMH0sCisgICAgezIsIGFyY3NfNzhfMX0sCisgICAgezIsIGFyY3NfNzhfMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzc4XzBbM10gPSB7CitzdGF0aWMgYXJjIGFyY3NfNzlfMFszXSA9IHsKICAgICB7MjYsIDF9LAogICAgIHszNCwgMn0sCiAgICAgezMzLCAyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzhfMVszXSA9IHsKLSAgICB7MTY0LCAzfSwKK3N0YXRpYyBhcmMgYXJjc183OV8xWzNdID0geworICAgIHsxNjUsIDN9LAogICAgIHszMSwgMn0sCiAgICAgezAsIDF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc183OF8yWzFdID0geworc3RhdGljIGFyYyBhcmNzXzc5XzJbMV0gPSB7CiAgICAgezI2LCAzfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzhfM1sxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc183OV8zWzFdID0gewogICAgIHswLCAzfSwKIH07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzc4WzRdID0gewotICAgIHszLCBhcmNzXzc4XzB9LAotICAgIHszLCBhcmNzXzc4XzF9LAotICAgIHsxLCBhcmNzXzc4XzJ9LAotICAgIHsxLCBhcmNzXzc4XzN9LAorc3RhdGljIHN0YXRlIHN0YXRlc183OVs0XSA9IHsKKyAgICB7MywgYXJjc183OV8wfSwKKyAgICB7MywgYXJjc183OV8xfSwKKyAgICB7MSwgYXJjc183OV8yfSwKKyAgICB7MSwgYXJjc183OV8zfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfNzlfMFsyXSA9IHsKLSAgICB7MTY0LCAxfSwKLSAgICB7MTcxLCAxfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfNzlfMVsxXSA9IHsKLSAgICB7MCwgMX0sCi19Owotc3RhdGljIHN0YXRlIHN0YXRlc183OVsyXSA9IHsKLSAgICB7MiwgYXJjc183OV8wfSwKLSAgICB7MSwgYXJjc183OV8xfSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfODBfMFsxXSA9IHsKLSAgICB7MTAwLCAxfSwKK3N0YXRpYyBhcmMgYXJjc184MF8wWzJdID0geworICAgIHsxNjUsIDF9LAorICAgIHsxNzIsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc184MF8xWzFdID0gewotICAgIHs2NSwgMn0sCisgICAgezAsIDF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc184MF8yWzFdID0gewotICAgIHsxMDEsIDN9LAotfTsKLXN0YXRpYyBhcmMgYXJjc184MF8zWzFdID0gewotICAgIHsxMTEsIDR9LAotfTsKLXN0YXRpYyBhcmMgYXJjc184MF80WzJdID0gewotICAgIHsxNzAsIDV9LAotICAgIHswLCA0fSwKLX07Ci1zdGF0aWMgYXJjIGFyY3NfODBfNVsxXSA9IHsKLSAgICB7MCwgNX0sCi19Owotc3RhdGljIHN0YXRlIHN0YXRlc184MFs2XSA9IHsKLSAgICB7MSwgYXJjc184MF8wfSwKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfODBbMl0gPSB7CisgICAgezIsIGFyY3NfODBfMH0sCiAgICAgezEsIGFyY3NfODBfMX0sCi0gICAgezEsIGFyY3NfODBfMn0sCi0gICAgezEsIGFyY3NfODBfM30sCi0gICAgezIsIGFyY3NfODBfNH0sCi0gICAgezEsIGFyY3NfODBfNX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzgxXzBbMV0gPSB7Ci0gICAgezk2LCAxfSwKK3N0YXRpYyBhcmMgYXJjc184MV8wWzJdID0geworICAgIHsyMSwgMX0sCisgICAgezEwMSwgMn0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzgxXzFbMV0gPSB7Ci0gICAgezExMywgMn0sCisgICAgezEwMSwgMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzgxXzJbMl0gPSB7Ci0gICAgezE3MCwgM30sCi0gICAgezAsIDJ9LAorc3RhdGljIGFyYyBhcmNzXzgxXzJbMV0gPSB7CisgICAgezY2LCAzfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfODFfM1sxXSA9IHsKLSAgICB7MCwgM30sCisgICAgezEwMiwgNH0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc184MVs0XSA9IHsKLSAgICB7MSwgYXJjc184MV8wfSwKK3N0YXRpYyBhcmMgYXJjc184MV80WzFdID0geworICAgIHsxMTIsIDV9LAorfTsKK3N0YXRpYyBhcmMgYXJjc184MV81WzJdID0geworICAgIHsxNzEsIDZ9LAorICAgIHswLCA1fSwKK307CitzdGF0aWMgYXJjIGFyY3NfODFfNlsxXSA9IHsKKyAgICB7MCwgNn0sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc184MVs3XSA9IHsKKyAgICB7MiwgYXJjc184MV8wfSwKICAgICB7MSwgYXJjc184MV8xfSwKLSAgICB7MiwgYXJjc184MV8yfSwKKyAgICB7MSwgYXJjc184MV8yfSwKICAgICB7MSwgYXJjc184MV8zfSwKKyAgICB7MSwgYXJjc184MV80fSwKKyAgICB7MiwgYXJjc184MV81fSwKKyAgICB7MSwgYXJjc184MV82fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfODJfMFsxXSA9IHsKLSAgICB7MjMsIDF9LAorICAgIHs5NywgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzgyXzFbMV0gPSB7Ci0gICAgezAsIDF9LAorICAgIHsxMTQsIDJ9LAogfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfODJbMl0gPSB7Ci0gICAgezEsIGFyY3NfODJfMH0sCi0gICAgezEsIGFyY3NfODJfMX0sCi19Owotc3RhdGljIGFyYyBhcmNzXzgzXzBbMV0gPSB7Ci0gICAgezE3MywgMX0sCi19Owotc3RhdGljIGFyYyBhcmNzXzgzXzFbMl0gPSB7Ci0gICAgezE3NCwgMn0sCi0gICAgezAsIDF9LAotfTsKLXN0YXRpYyBhcmMgYXJjc184M18yWzFdID0geworc3RhdGljIGFyYyBhcmNzXzgyXzJbMl0gPSB7CisgICAgezE3MSwgM30sCiAgICAgezAsIDJ9LAogfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfODNbM10gPSB7CitzdGF0aWMgYXJjIGFyY3NfODJfM1sxXSA9IHsKKyAgICB7MCwgM30sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc184Mls0XSA9IHsKKyAgICB7MSwgYXJjc184Ml8wfSwKKyAgICB7MSwgYXJjc184Ml8xfSwKKyAgICB7MiwgYXJjc184Ml8yfSwKKyAgICB7MSwgYXJjc184Ml8zfSwKK307CitzdGF0aWMgYXJjIGFyY3NfODNfMFsxXSA9IHsKKyAgICB7MjMsIDF9LAorfTsKK3N0YXRpYyBhcmMgYXJjc184M18xWzFdID0geworICAgIHswLCAxfSwKK307CitzdGF0aWMgc3RhdGUgc3RhdGVzXzgzWzJdID0gewogICAgIHsxLCBhcmNzXzgzXzB9LAotICAgIHsyLCBhcmNzXzgzXzF9LAotICAgIHsxLCBhcmNzXzgzXzJ9LAorICAgIHsxLCBhcmNzXzgzXzF9LAogfTsKLXN0YXRpYyBhcmMgYXJjc184NF8wWzJdID0gewotICAgIHs3NiwgMX0sCi0gICAgezksIDJ9LAorc3RhdGljIGFyYyBhcmNzXzg0XzBbMV0gPSB7CisgICAgezE3NCwgMX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzg0XzFbMV0gPSB7Ci0gICAgezI2LCAyfSwKK3N0YXRpYyBhcmMgYXJjc184NF8xWzJdID0geworICAgIHsxNzUsIDJ9LAorICAgIHswLCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfODRfMlsxXSA9IHsKICAgICB7MCwgMn0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc184NFszXSA9IHsKLSAgICB7MiwgYXJjc184NF8wfSwKLSAgICB7MSwgYXJjc184NF8xfSwKKyAgICB7MSwgYXJjc184NF8wfSwKKyAgICB7MiwgYXJjc184NF8xfSwKICAgICB7MSwgYXJjc184NF8yfSwKIH07Ci1zdGF0aWMgZGZhIGRmYXNbODVdID0geworc3RhdGljIGFyYyBhcmNzXzg1XzBbMl0gPSB7CisgICAgezc3LCAxfSwKKyAgICB7OSwgMn0sCit9Oworc3RhdGljIGFyYyBhcmNzXzg1XzFbMV0gPSB7CisgICAgezI2LCAyfSwKK307CitzdGF0aWMgYXJjIGFyY3NfODVfMlsxXSA9IHsKKyAgICB7MCwgMn0sCit9Oworc3RhdGljIHN0YXRlIHN0YXRlc184NVszXSA9IHsKKyAgICB7MiwgYXJjc184NV8wfSwKKyAgICB7MSwgYXJjc184NV8xfSwKKyAgICB7MSwgYXJjc184NV8yfSwKK307CitzdGF0aWMgZGZhIGRmYXNbODZdID0gewogICAgIHsyNTYsICJzaW5nbGVfaW5wdXQiLCAwLCAzLCBzdGF0ZXNfMCwKLSAgICAgIlwwMDRcMDUwXDM0MFwwMDBcMDAyXDAwMFwwMDBcMDAwXDAwNVwyMzdcMjA0XDAwM1wxMzFcMDAyXDAxMFwwMDFcMDAwXDE0MFwxMTBcMjI0XDAxN1wwNDEifSwKKyAgICAgIlwwMDRcMDUwXDM0MFwwMDBcMDAyXDAwMFwwMDBcMDAwXDAxMlwwNzZcMDExXDAwN1wyNjJcMDA0XDAyMFwwMDJcMDAwXDMwMFwyMjBcMDUwXDAzN1wxMDIifSwKICAgICB7MjU3LCAiZmlsZV9pbnB1dCIsIDAsIDIsIHN0YXRlc18xLAotICAgICAiXDIwNFwwNTBcMzQwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDA1XDIzN1wyMDRcMDAzXDEzMVwwMDJcMDEwXDAwMVwwMDBcMTQwXDExMFwyMjRcMDE3XDA0MSJ9LAorICAgICAiXDIwNFwwNTBcMzQwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDEyXDA3NlwwMTFcMDA3XDI2MlwwMDRcMDIwXDAwMlwwMDBcMzAwXDIyMFwwNTBcMDM3XDEwMiJ9LAogICAgIHsyNTgsICJldmFsX2lucHV0IiwgMCwgMywgc3RhdGVzXzIsCi0gICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMTBcMDAxXDAwMFwxNDBcMTEwXDIyNFwwMTdcMDAwIn0sCisgICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAxMFwwMDBcMDAwXDAwMFwwMjBcMDAyXDAwMFwzMDBcMjIwXDA1MFwwMzdcMDAwIn0sCiAgICAgezI1OSwgImRlY29yYXRvciIsIDAsIDcsIHN0YXRlc18zLAogICAgICAiXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAogICAgIHsyNjAsICJkZWNvcmF0b3JzIiwgMCwgMiwgc3RhdGVzXzQsCkBAIC0xODc5LDE3OSArMTkyMiwxODEgQEAKICAgICAgIlwwMDBcMDAwXDEwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKICAgICB7MjY0LCAicGFyYW1ldGVycyIsIDAsIDQsIHN0YXRlc184LAogICAgICAiXDAwMFwwNDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyNjUsICJ0eXBlZGFyZ3NsaXN0IiwgMCwgMTgsIHN0YXRlc185LAorICAgIHsyNjUsICJ0eXBlZGFyZ3NsaXN0IiwgMCwgMTksIHN0YXRlc185LAogICAgICAiXDAwMFwwMDBcMjAwXDAwMFwwMDZcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAogICAgIHsyNjYsICJ0ZnBkZWYiLCAwLCA0LCBzdGF0ZXNfMTAsCiAgICAgICJcMDAwXDAwMFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezI2NywgInZhcmFyZ3NsaXN0IiwgMCwgMTgsIHN0YXRlc18xMSwKKyAgICB7MjY3LCAidmFyYXJnc2xpc3QiLCAwLCAxOSwgc3RhdGVzXzExLAogICAgICAiXDAwMFwwMDBcMjAwXDAwMFwwMDZcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAogICAgIHsyNjgsICJ2ZnBkZWYiLCAwLCAyLCBzdGF0ZXNfMTIsCiAgICAgICJcMDAwXDAwMFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCiAgICAgezI2OSwgInN0bXQiLCAwLCAyLCBzdGF0ZXNfMTMsCi0gICAgICJcMDAwXDA1MFwzNDBcMDAwXDAwMlwwMDBcMDAwXDAwMFwwMDVcMjM3XDIwNFwwMDNcMTMxXDAwMlwwMTBcMDAxXDAwMFwxNDBcMTEwXDIyNFwwMTdcMDQxIn0sCisgICAgICJcMDAwXDA1MFwzNDBcMDAwXDAwMlwwMDBcMDAwXDAwMFwwMTJcMDc2XDAxMVwwMDdcMjYyXDAwNFwwMjBcMDAyXDAwMFwzMDBcMjIwXDA1MFwwMzdcMTAyIn0sCiAgICAgezI3MCwgInNpbXBsZV9zdG10IiwgMCwgNCwgc3RhdGVzXzE0LAotICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDA1XDIzN1wyMDRcMDAzXDAwMFwwMDBcMDEwXDAwMVwwMDBcMTQwXDExMFwyMjRcMDE3XDA0MCJ9LAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDEyXDA3NlwwMTFcMDA3XDAwMFwwMDBcMDIwXDAwMlwwMDBcMzAwXDIyMFwwNTBcMDM3XDEwMCJ9LAogICAgIHsyNzEsICJzbWFsbF9zdG10IiwgMCwgMiwgc3RhdGVzXzE1LAotICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDA1XDIzN1wyMDRcMDAzXDAwMFwwMDBcMDEwXDAwMVwwMDBcMTQwXDExMFwyMjRcMDE3XDA0MCJ9LAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDEyXDA3NlwwMTFcMDA3XDAwMFwwMDBcMDIwXDAwMlwwMDBcMzAwXDIyMFwwNTBcMDM3XDEwMCJ9LAogICAgIHsyNzIsICJleHByX3N0bXQiLCAwLCA2LCBzdGF0ZXNfMTYsCi0gICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMTBcMDAxXDAwMFwxNDBcMTEwXDIyNFwwMTdcMDAwIn0sCi0gICAgezI3MywgInRlc3RsaXN0X3N0YXJfZXhwciIsIDAsIDMsIHN0YXRlc18xNywKLSAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAyXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAxMFwwMDFcMDAwXDE0MFwxMTBcMjI0XDAxN1wwMDAifSwKLSAgICB7Mjc0LCAiYXVnYXNzaWduIiwgMCwgMiwgc3RhdGVzXzE4LAotICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDM3MFwzNzdcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyNzUsICJkZWxfc3RtdCIsIDAsIDMsIHN0YXRlc18xOSwKLSAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMVwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7Mjc2LCAicGFzc19zdG10IiwgMCwgMiwgc3RhdGVzXzIwLAotICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyNzcsICJmbG93X3N0bXQiLCAwLCAyLCBzdGF0ZXNfMjEsCi0gICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDE3XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDQwIn0sCi0gICAgezI3OCwgImJyZWFrX3N0bXQiLCAwLCAyLCBzdGF0ZXNfMjIsCi0gICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAxXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezI3OSwgImNvbnRpbnVlX3N0bXQiLCAwLCAyLCBzdGF0ZXNfMjMsCi0gICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAyXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezI4MCwgInJldHVybl9zdG10IiwgMCwgMywgc3RhdGVzXzI0LAotICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyODEsICJ5aWVsZF9zdG10IiwgMCwgMiwgc3RhdGVzXzI1LAotICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDA0MCJ9LAotICAgIHsyODIsICJyYWlzZV9zdG10IiwgMCwgNSwgc3RhdGVzXzI2LAotICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAxMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyODMsICJpbXBvcnRfc3RtdCIsIDAsIDIsIHN0YXRlc18yNywKLSAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwyMjBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7Mjg0LCAiaW1wb3J0X25hbWUiLCAwLCAzLCBzdGF0ZXNfMjgsCi0gICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezI4NSwgImltcG9ydF9mcm9tIiwgMCwgOCwgc3RhdGVzXzI5LAotICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAyMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyODYsICJpbXBvcnRfYXNfbmFtZSIsIDAsIDQsIHN0YXRlc18zMCwKLSAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7Mjg3LCAiZG90dGVkX2FzX25hbWUiLCAwLCA0LCBzdGF0ZXNfMzEsCi0gICAgICJcMDAwXDAwMFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezI4OCwgImltcG9ydF9hc19uYW1lcyIsIDAsIDMsIHN0YXRlc18zMiwKLSAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7Mjg5LCAiZG90dGVkX2FzX25hbWVzIiwgMCwgMiwgc3RhdGVzXzMzLAotICAgICAiXDAwMFwwMDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyOTAsICJkb3R0ZWRfbmFtZSIsIDAsIDIsIHN0YXRlc18zNCwKLSAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7MjkxLCAiZ2xvYmFsX3N0bXQiLCAwLCAzLCBzdGF0ZXNfMzUsCi0gICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezI5MiwgIm5vbmxvY2FsX3N0bXQiLCAwLCAzLCBzdGF0ZXNfMzYsCi0gICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDFcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezI5MywgImFzc2VydF9zdG10IiwgMCwgNSwgc3RhdGVzXzM3LAotICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAyXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyOTQsICJjb21wb3VuZF9zdG10IiwgMCwgMiwgc3RhdGVzXzM4LAotICAgICAiXDAwMFwwMTBcMTQwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDEzMVwwMDJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMSJ9LAotICAgIHsyOTUsICJhc3luY19zdG10IiwgMCwgMywgc3RhdGVzXzM5LAotICAgICAiXDAwMFwwMDBcMDQwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyOTYsICJpZl9zdG10IiwgMCwgOCwgc3RhdGVzXzQwLAotICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMVwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyOTcsICJ3aGlsZV9zdG10IiwgMCwgOCwgc3RhdGVzXzQxLAotICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAxMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyOTgsICJmb3Jfc3RtdCIsIDAsIDEwLCBzdGF0ZXNfNDIsCi0gICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDIwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezI5OSwgInRyeV9zdG10IiwgMCwgMTMsIHN0YXRlc180MywKLSAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwxMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7MzAwLCAid2l0aF9zdG10IiwgMCwgNSwgc3RhdGVzXzQ0LAotICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHszMDEsICJ3aXRoX2l0ZW0iLCAwLCA0LCBzdGF0ZXNfNDUsCi0gICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMTBcMDAxXDAwMFwxNDBcMTEwXDIyNFwwMTdcMDAwIn0sCi0gICAgezMwMiwgImV4Y2VwdF9jbGF1c2UiLCAwLCA1LCBzdGF0ZXNfNDYsCi0gICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAyMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezMwMywgInN1aXRlIiwgMCwgNSwgc3RhdGVzXzQ3LAotICAgICAiXDAwNFwwNDBcMjAwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDA1XDIzN1wyMDRcMDAzXDAwMFwwMDBcMDEwXDAwMVwwMDBcMTQwXDExMFwyMjRcMDE3XDA0MCJ9LAotICAgIHszMDQsICJ0ZXN0IiwgMCwgNiwgc3RhdGVzXzQ4LAotICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDRcMDAwXDAwMFwwMDBcMDEwXDAwMVwwMDBcMTQwXDExMFwyMjRcMDE3XDAwMCJ9LAotICAgIHszMDUsICJ0ZXN0X25vY29uZCIsIDAsIDIsIHN0YXRlc180OSwKLSAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAxMFwwMDFcMDAwXDE0MFwxMTBcMjI0XDAxN1wwMDAifSwKLSAgICB7MzA2LCAibGFtYmRlZiIsIDAsIDUsIHN0YXRlc181MCwKLSAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAxMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7MzA3LCAibGFtYmRlZl9ub2NvbmQiLCAwLCA1LCBzdGF0ZXNfNTEsCi0gICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezMwOCwgIm9yX3Rlc3QiLCAwLCAyLCBzdGF0ZXNfNTIsCi0gICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMDBcMDAxXDAwMFwxNDBcMTEwXDIyNFwwMTdcMDAwIn0sCi0gICAgezMwOSwgImFuZF90ZXN0IiwgMCwgMiwgc3RhdGVzXzUzLAotICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDRcMDAwXDAwMFwwMDBcMDAwXDAwMVwwMDBcMTQwXDExMFwyMjRcMDE3XDAwMCJ9LAotICAgIHszMTAsICJub3RfdGVzdCIsIDAsIDMsIHN0YXRlc181NCwKLSAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAwMFwwMDFcMDAwXDE0MFwxMTBcMjI0XDAxN1wwMDAifSwKLSAgICB7MzExLCAiY29tcGFyaXNvbiIsIDAsIDIsIHN0YXRlc181NSwKLSAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDE0MFwxMTBcMjI0XDAxN1wwMDAifSwKLSAgICB7MzEyLCAiY29tcF9vcCIsIDAsIDQsIHN0YXRlc181NiwKLSAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwNDBcMDAwXDAwMFwzNzFcMDA3XDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7MzEzLCAic3Rhcl9leHByIiwgMCwgMywgc3RhdGVzXzU3LAotICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHszMTQsICJleHByIiwgMCwgMiwgc3RhdGVzXzU4LAotICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDRcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMTQwXDExMFwyMjRcMDE3XDAwMCJ9LAotICAgIHszMTUsICJ4b3JfZXhwciIsIDAsIDIsIHN0YXRlc181OSwKLSAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDE0MFwxMTBcMjI0XDAxN1wwMDAifSwKLSAgICB7MzE2LCAiYW5kX2V4cHIiLCAwLCAyLCBzdGF0ZXNfNjAsCi0gICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwxNDBcMTEwXDIyNFwwMTdcMDAwIn0sCi0gICAgezMxNywgInNoaWZ0X2V4cHIiLCAwLCAyLCBzdGF0ZXNfNjEsCi0gICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwxNDBcMTEwXDIyNFwwMTdcMDAwIn0sCi0gICAgezMxOCwgImFyaXRoX2V4cHIiLCAwLCAyLCBzdGF0ZXNfNjIsCi0gICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwxNDBcMTEwXDIyNFwwMTdcMDAwIn0sCi0gICAgezMxOSwgInRlcm0iLCAwLCAyLCBzdGF0ZXNfNjMsCi0gICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwxNDBcMTEwXDIyNFwwMTdcMDAwIn0sCi0gICAgezMyMCwgImZhY3RvciIsIDAsIDMsIHN0YXRlc182NCwKLSAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDE0MFwxMTBcMjI0XDAxN1wwMDAifSwKLSAgICB7MzIxLCAicG93ZXIiLCAwLCA0LCBzdGF0ZXNfNjUsCi0gICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMTAwXDIyNFwwMTdcMDAwIn0sCi0gICAgezMyMiwgImF0b21fZXhwciIsIDAsIDMsIHN0YXRlc182NiwKLSAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwxMDBcMjI0XDAxN1wwMDAifSwKLSAgICB7MzIzLCAiYXRvbSIsIDAsIDksIHN0YXRlc182NywKLSAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMjI0XDAxN1wwMDAifSwKLSAgICB7MzI0LCAidGVzdGxpc3RfY29tcCIsIDAsIDUsIHN0YXRlc182OCwKLSAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAyXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAxMFwwMDFcMDAwXDE0MFwxMTBcMjI0XDAxN1wwMDAifSwKLSAgICB7MzI1LCAidHJhaWxlciIsIDAsIDcsIHN0YXRlc182OSwKLSAgICAgIlwwMDBcMDQwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAyXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDAifSwKLSAgICB7MzI2LCAic3Vic2NyaXB0bGlzdCIsIDAsIDMsIHN0YXRlc183MCwKLSAgICAgIlwwMDBcMDQwXDIwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAxMFwwMDFcMDAwXDE0MFwxMTBcMjI0XDAxN1wwMDAifSwKLSAgICB7MzI3LCAic3Vic2NyaXB0IiwgMCwgNSwgc3RhdGVzXzcxLAotICAgICAiXDAwMFwwNDBcMjAwXDAxMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDRcMDAwXDAwMFwwMDBcMDEwXDAwMVwwMDBcMTQwXDExMFwyMjRcMDE3XDAwMCJ9LAotICAgIHszMjgsICJzbGljZW9wIiwgMCwgMywgc3RhdGVzXzcyLAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDIwXDAwMlwwMDBcMzAwXDIyMFwwNTBcMDM3XDAwMCJ9LAorICAgIHsyNzMsICJhbm5hc3NpZ24iLCAwLCA1LCBzdGF0ZXNfMTcsCiAgICAgICJcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezMyOSwgImV4cHJsaXN0IiwgMCwgMywgc3RhdGVzXzczLAotICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDRcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMTQwXDExMFwyMjRcMDE3XDAwMCJ9LAotICAgIHszMzAsICJ0ZXN0bGlzdCIsIDAsIDMsIHN0YXRlc183NCwKLSAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAxMFwwMDFcMDAwXDE0MFwxMTBcMjI0XDAxN1wwMDAifSwKLSAgICB7MzMxLCAiZGljdG9yc2V0bWFrZXIiLCAwLCAxNCwgc3RhdGVzXzc1LAotICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDZcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDRcMDAwXDAwMFwwMDBcMDEwXDAwMVwwMDBcMTQwXDExMFwyMjRcMDE3XDAwMCJ9LAotICAgIHszMzIsICJjbGFzc2RlZiIsIDAsIDgsIHN0YXRlc183NiwKLSAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDEifSwKLSAgICB7MzMzLCAiYXJnbGlzdCIsIDAsIDMsIHN0YXRlc183NywKLSAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDA2XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAxMFwwMDFcMDAwXDE0MFwxMTBcMjI0XDAxN1wwMDAifSwKLSAgICB7MzM0LCAiYXJndW1lbnQiLCAwLCA0LCBzdGF0ZXNfNzgsCi0gICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwNlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMTBcMDAxXDAwMFwxNDBcMTEwXDIyNFwwMTdcMDAwIn0sCi0gICAgezMzNSwgImNvbXBfaXRlciIsIDAsIDIsIHN0YXRlc183OSwKLSAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMjFcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7MzM2LCAiY29tcF9mb3IiLCAwLCA2LCBzdGF0ZXNfODAsCi0gICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDIwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezMzNywgImNvbXBfaWYiLCAwLCA0LCBzdGF0ZXNfODEsCi0gICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAxXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezMzOCwgImVuY29kaW5nX2RlY2wiLCAwLCAyLCBzdGF0ZXNfODIsCisgICAgezI3NCwgInRlc3RsaXN0X3N0YXJfZXhwciIsIDAsIDMsIHN0YXRlc18xOCwKKyAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAyXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAyMFwwMDJcMDAwXDMwMFwyMjBcMDUwXDAzN1wwMDAifSwKKyAgICB7Mjc1LCAiYXVnYXNzaWduIiwgMCwgMiwgc3RhdGVzXzE5LAorICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDM2MFwzNzdcMDAxXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAorICAgIHsyNzYsICJkZWxfc3RtdCIsIDAsIDMsIHN0YXRlc18yMCwKKyAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKKyAgICB7Mjc3LCAicGFzc19zdG10IiwgMCwgMiwgc3RhdGVzXzIxLAorICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAorICAgIHsyNzgsICJmbG93X3N0bXQiLCAwLCAyLCBzdGF0ZXNfMjIsCisgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDM2XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMTAwIn0sCisgICAgezI3OSwgImJyZWFrX3N0bXQiLCAwLCAyLCBzdGF0ZXNfMjMsCisgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAyXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezI4MCwgImNvbnRpbnVlX3N0bXQiLCAwLCAyLCBzdGF0ZXNfMjQsCisgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezI4MSwgInJldHVybl9zdG10IiwgMCwgMywgc3RhdGVzXzI1LAorICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAxMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAorICAgIHsyODIsICJ5aWVsZF9zdG10IiwgMCwgMiwgc3RhdGVzXzI2LAorICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDEwMCJ9LAorICAgIHsyODMsICJyYWlzZV9zdG10IiwgMCwgNSwgc3RhdGVzXzI3LAorICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAyMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAorICAgIHsyODQsICJpbXBvcnRfc3RtdCIsIDAsIDIsIHN0YXRlc18yOCwKKyAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwNDBcMDAxXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKKyAgICB7Mjg1LCAiaW1wb3J0X25hbWUiLCAwLCAzLCBzdGF0ZXNfMjksCisgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMVwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezI4NiwgImltcG9ydF9mcm9tIiwgMCwgOCwgc3RhdGVzXzMwLAorICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDA0MFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAorICAgIHsyODcsICJpbXBvcnRfYXNfbmFtZSIsIDAsIDQsIHN0YXRlc18zMSwKICAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7MzM5LCAieWllbGRfZXhwciIsIDAsIDMsIHN0YXRlc184MywKLSAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwNDAifSwKLSAgICB7MzQwLCAieWllbGRfYXJnIiwgMCwgMywgc3RhdGVzXzg0LAotICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAyMFwwMDRcMDAwXDAwMFwwMDBcMDEwXDAwMVwwMDBcMTQwXDExMFwyMjRcMDE3XDAwMCJ9LAorICAgIHsyODgsICJkb3R0ZWRfYXNfbmFtZSIsIDAsIDQsIHN0YXRlc18zMiwKKyAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKKyAgICB7Mjg5LCAiaW1wb3J0X2FzX25hbWVzIiwgMCwgMywgc3RhdGVzXzMzLAorICAgICAiXDAwMFwwMDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAorICAgIHsyOTAsICJkb3R0ZWRfYXNfbmFtZXMiLCAwLCAyLCBzdGF0ZXNfMzQsCisgICAgICJcMDAwXDAwMFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezI5MSwgImRvdHRlZF9uYW1lIiwgMCwgMiwgc3RhdGVzXzM1LAorICAgICAiXDAwMFwwMDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAorICAgIHsyOTIsICJnbG9iYWxfc3RtdCIsIDAsIDMsIHN0YXRlc18zNiwKKyAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMVwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKKyAgICB7MjkzLCAibm9ubG9jYWxfc3RtdCIsIDAsIDMsIHN0YXRlc18zNywKKyAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKKyAgICB7Mjk0LCAiYXNzZXJ0X3N0bXQiLCAwLCA1LCBzdGF0ZXNfMzgsCisgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDRcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezI5NSwgImNvbXBvdW5kX3N0bXQiLCAwLCAyLCBzdGF0ZXNfMzksCisgICAgICJcMDAwXDAxMFwxNDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMjYyXDAwNFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAyIn0sCisgICAgezI5NiwgImFzeW5jX3N0bXQiLCAwLCAzLCBzdGF0ZXNfNDAsCisgICAgICJcMDAwXDAwMFwwNDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezI5NywgImlmX3N0bXQiLCAwLCA4LCBzdGF0ZXNfNDEsCisgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAyXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezI5OCwgIndoaWxlX3N0bXQiLCAwLCA4LCBzdGF0ZXNfNDIsCisgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDIwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezI5OSwgImZvcl9zdG10IiwgMCwgMTAsIHN0YXRlc180MywKKyAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwNDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKKyAgICB7MzAwLCAidHJ5X3N0bXQiLCAwLCAxMywgc3RhdGVzXzQ0LAorICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAorICAgIHszMDEsICJ3aXRoX3N0bXQiLCAwLCA1LCBzdGF0ZXNfNDUsCisgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezMwMiwgIndpdGhfaXRlbSIsIDAsIDQsIHN0YXRlc180NiwKKyAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAyMFwwMDJcMDAwXDMwMFwyMjBcMDUwXDAzN1wwMDAifSwKKyAgICB7MzAzLCAiZXhjZXB0X2NsYXVzZSIsIDAsIDUsIHN0YXRlc180NywKKyAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDQwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKKyAgICB7MzA0LCAic3VpdGUiLCAwLCA1LCBzdGF0ZXNfNDgsCisgICAgICJcMDA0XDA0MFwyMDBcMDAwXDAwMlwwMDBcMDAwXDAwMFwwMTJcMDc2XDAxMVwwMDdcMDAwXDAwMFwwMjBcMDAyXDAwMFwzMDBcMjIwXDA1MFwwMzdcMTAwIn0sCisgICAgezMwNSwgInRlc3QiLCAwLCA2LCBzdGF0ZXNfNDksCisgICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAxMFwwMDBcMDAwXDAwMFwwMjBcMDAyXDAwMFwzMDBcMjIwXDA1MFwwMzdcMDAwIn0sCisgICAgezMwNiwgInRlc3Rfbm9jb25kIiwgMCwgMiwgc3RhdGVzXzUwLAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDIwXDAwMlwwMDBcMzAwXDIyMFwwNTBcMDM3XDAwMCJ9LAorICAgIHszMDcsICJsYW1iZGVmIiwgMCwgNSwgc3RhdGVzXzUxLAorICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDIwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAorICAgIHszMDgsICJsYW1iZGVmX25vY29uZCIsIDAsIDUsIHN0YXRlc181MiwKKyAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAyMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKKyAgICB7MzA5LCAib3JfdGVzdCIsIDAsIDIsIHN0YXRlc181MywKKyAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAwMFwwMDJcMDAwXDMwMFwyMjBcMDUwXDAzN1wwMDAifSwKKyAgICB7MzEwLCAiYW5kX3Rlc3QiLCAwLCAyLCBzdGF0ZXNfNTQsCisgICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAxMFwwMDBcMDAwXDAwMFwwMDBcMDAyXDAwMFwzMDBcMjIwXDA1MFwwMzdcMDAwIn0sCisgICAgezMxMSwgIm5vdF90ZXN0IiwgMCwgMywgc3RhdGVzXzU1LAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMlwwMDBcMzAwXDIyMFwwNTBcMDM3XDAwMCJ9LAorICAgIHszMTIsICJjb21wYXJpc29uIiwgMCwgMiwgc3RhdGVzXzU2LAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMzAwXDIyMFwwNTBcMDM3XDAwMCJ9LAorICAgIHszMTMsICJjb21wX29wIiwgMCwgNCwgc3RhdGVzXzU3LAorICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDEwMFwwMDBcMDAwXDM2MlwwMTdcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAorICAgIHszMTQsICJzdGFyX2V4cHIiLCAwLCAzLCBzdGF0ZXNfNTgsCisgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezMxNSwgImV4cHIiLCAwLCAyLCBzdGF0ZXNfNTksCisgICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAxMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwzMDBcMjIwXDA1MFwwMzdcMDAwIn0sCisgICAgezMxNiwgInhvcl9leHByIiwgMCwgMiwgc3RhdGVzXzYwLAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMzAwXDIyMFwwNTBcMDM3XDAwMCJ9LAorICAgIHszMTcsICJhbmRfZXhwciIsIDAsIDIsIHN0YXRlc182MSwKKyAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDMwMFwyMjBcMDUwXDAzN1wwMDAifSwKKyAgICB7MzE4LCAic2hpZnRfZXhwciIsIDAsIDIsIHN0YXRlc182MiwKKyAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDMwMFwyMjBcMDUwXDAzN1wwMDAifSwKKyAgICB7MzE5LCAiYXJpdGhfZXhwciIsIDAsIDIsIHN0YXRlc182MywKKyAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDMwMFwyMjBcMDUwXDAzN1wwMDAifSwKKyAgICB7MzIwLCAidGVybSIsIDAsIDIsIHN0YXRlc182NCwKKyAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDMwMFwyMjBcMDUwXDAzN1wwMDAifSwKKyAgICB7MzIxLCAiZmFjdG9yIiwgMCwgMywgc3RhdGVzXzY1LAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMzAwXDIyMFwwNTBcMDM3XDAwMCJ9LAorICAgIHszMjIsICJwb3dlciIsIDAsIDQsIHN0YXRlc182NiwKKyAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwyMDBcMDUwXDAzN1wwMDAifSwKKyAgICB7MzIzLCAiYXRvbV9leHByIiwgMCwgMywgc3RhdGVzXzY3LAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDIwMFwwNTBcMDM3XDAwMCJ9LAorICAgIHszMjQsICJhdG9tIiwgMCwgOSwgc3RhdGVzXzY4LAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwNTBcMDM3XDAwMCJ9LAorICAgIHszMjUsICJ0ZXN0bGlzdF9jb21wIiwgMCwgNSwgc3RhdGVzXzY5LAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDIwXDAwMlwwMDBcMzAwXDIyMFwwNTBcMDM3XDAwMCJ9LAorICAgIHszMjYsICJ0cmFpbGVyIiwgMCwgNywgc3RhdGVzXzcwLAorICAgICAiXDAwMFwwNDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDRcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMCJ9LAorICAgIHszMjcsICJzdWJzY3JpcHRsaXN0IiwgMCwgMywgc3RhdGVzXzcxLAorICAgICAiXDAwMFwwNDBcMjAwXDAxMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDIwXDAwMlwwMDBcMzAwXDIyMFwwNTBcMDM3XDAwMCJ9LAorICAgIHszMjgsICJzdWJzY3JpcHQiLCAwLCA1LCBzdGF0ZXNfNzIsCisgICAgICJcMDAwXDA0MFwyMDBcMDEwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAxMFwwMDBcMDAwXDAwMFwwMjBcMDAyXDAwMFwzMDBcMjIwXDA1MFwwMzdcMDAwIn0sCisgICAgezMyOSwgInNsaWNlb3AiLCAwLCAzLCBzdGF0ZXNfNzMsCisgICAgICJcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezMzMCwgImV4cHJsaXN0IiwgMCwgMywgc3RhdGVzXzc0LAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMzAwXDIyMFwwNTBcMDM3XDAwMCJ9LAorICAgIHszMzEsICJ0ZXN0bGlzdCIsIDAsIDMsIHN0YXRlc183NSwKKyAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAyMFwwMDJcMDAwXDMwMFwyMjBcMDUwXDAzN1wwMDAifSwKKyAgICB7MzMyLCAiZGljdG9yc2V0bWFrZXIiLCAwLCAxNCwgc3RhdGVzXzc2LAorICAgICAiXDAwMFwwNDBcMjAwXDAwMFwwMDZcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDIwXDAwMlwwMDBcMzAwXDIyMFwwNTBcMDM3XDAwMCJ9LAorICAgIHszMzMsICJjbGFzc2RlZiIsIDAsIDgsIHN0YXRlc183NywKKyAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDIifSwKKyAgICB7MzM0LCAiYXJnbGlzdCIsIDAsIDMsIHN0YXRlc183OCwKKyAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDA2XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAyMFwwMDJcMDAwXDMwMFwyMjBcMDUwXDAzN1wwMDAifSwKKyAgICB7MzM1LCAiYXJndW1lbnQiLCAwLCA0LCBzdGF0ZXNfNzksCisgICAgICJcMDAwXDA0MFwyMDBcMDAwXDAwNlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAxMFwwMDBcMDAwXDAwMFwwMjBcMDAyXDAwMFwzMDBcMjIwXDA1MFwwMzdcMDAwIn0sCisgICAgezMzNiwgImNvbXBfaXRlciIsIDAsIDIsIHN0YXRlc184MCwKKyAgICAgIlwwMDBcMDAwXDA0MFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwNDJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKKyAgICB7MzM3LCAiY29tcF9mb3IiLCAwLCA3LCBzdGF0ZXNfODEsCisgICAgICJcMDAwXDAwMFwwNDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDQwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezMzOCwgImNvbXBfaWYiLCAwLCA0LCBzdGF0ZXNfODIsCisgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAyXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezMzOSwgImVuY29kaW5nX2RlY2wiLCAwLCAyLCBzdGF0ZXNfODMsCisgICAgICJcMDAwXDAwMFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCisgICAgezM0MCwgInlpZWxkX2V4cHIiLCAwLCAzLCBzdGF0ZXNfODQsCisgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMTAwIn0sCisgICAgezM0MSwgInlpZWxkX2FyZyIsIDAsIDMsIHN0YXRlc184NSwKKyAgICAgIlwwMDBcMDQwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwNDBcMDEwXDAwMFwwMDBcMDAwXDAyMFwwMDJcMDAwXDMwMFwyMjBcMDUwXDAzN1wwMDAifSwKIH07Ci1zdGF0aWMgbGFiZWwgbGFiZWxzWzE3NV0gPSB7CitzdGF0aWMgbGFiZWwgbGFiZWxzWzE3Nl0gPSB7CiAgICAgezAsICJFTVBUWSJ9LAogICAgIHsyNTYsIDB9LAogICAgIHs0LCAwfSwKICAgICB7MjcwLCAwfSwKLSAgICB7Mjk0LCAwfSwKKyAgICB7Mjk1LCAwfSwKICAgICB7MjU3LCAwfSwKICAgICB7MjY5LCAwfSwKICAgICB7MCwgMH0sCiAgICAgezI1OCwgMH0sCi0gICAgezMzMCwgMH0sCisgICAgezMzMSwgMH0sCiAgICAgezI1OSwgMH0sCiAgICAgezQ5LCAwfSwKLSAgICB7MjkwLCAwfSwKKyAgICB7MjkxLCAwfSwKICAgICB7NywgMH0sCi0gICAgezMzMywgMH0sCisgICAgezMzNCwgMH0sCiAgICAgezgsIDB9LAogICAgIHsyNjAsIDB9LAogICAgIHsyNjEsIDB9LAotICAgIHszMzIsIDB9LAorICAgIHszMzMsIDB9LAogICAgIHsyNjMsIDB9LAogICAgIHsyNjIsIDB9LAogICAgIHs1NSwgMH0sCkBAIC0yMDU5LDkgKzIxMDQsOSBAQAogICAgIHsxLCAwfSwKICAgICB7MjY0LCAwfSwKICAgICB7NTEsIDB9LAotICAgIHszMDQsIDB9LAorICAgIHszMDUsIDB9LAogICAgIHsxMSwgMH0sCi0gICAgezMwMywgMH0sCisgICAgezMwNCwgMH0sCiAgICAgezI2NSwgMH0sCiAgICAgezI2NiwgMH0sCiAgICAgezIyLCAwfSwKQEAgLTIwNzMsMTcgKzIxMTgsMTggQEAKICAgICB7MjcxLCAwfSwKICAgICB7MTMsIDB9LAogICAgIHsyNzIsIDB9LAotICAgIHsyNzUsIDB9LAogICAgIHsyNzYsIDB9LAogICAgIHsyNzcsIDB9LAotICAgIHsyODMsIDB9LAotICAgIHsyOTEsIDB9LAorICAgIHsyNzgsIDB9LAorICAgIHsyODQsIDB9LAogICAgIHsyOTIsIDB9LAogICAgIHsyOTMsIDB9LAotICAgIHsyNzMsIDB9LAorICAgIHsyOTQsIDB9LAogICAgIHsyNzQsIDB9LAotICAgIHszMzksIDB9LAotICAgIHszMTMsIDB9LAorICAgIHsyNzMsIDB9LAorICAgIHsyNzUsIDB9LAorICAgIHszNDAsIDB9LAorICAgIHszMTQsIDB9LAogICAgIHszNiwgMH0sCiAgICAgezM3LCAwfSwKICAgICB7MzgsIDB9LApAQCAtMjA5OCwzNyArMjE0NCwzNyBAQAogICAgIHs0NiwgMH0sCiAgICAgezQ4LCAwfSwKICAgICB7MSwgImRlbCJ9LAotICAgIHszMjksIDB9LAorICAgIHszMzAsIDB9LAogICAgIHsxLCAicGFzcyJ9LAotICAgIHsyNzgsIDB9LAogICAgIHsyNzksIDB9LAogICAgIHsyODAsIDB9LAotICAgIHsyODIsIDB9LAogICAgIHsyODEsIDB9LAorICAgIHsyODMsIDB9LAorICAgIHsyODIsIDB9LAogICAgIHsxLCAiYnJlYWsifSwKICAgICB7MSwgImNvbnRpbnVlIn0sCiAgICAgezEsICJyZXR1cm4ifSwKICAgICB7MSwgInJhaXNlIn0sCiAgICAgezEsICJmcm9tIn0sCi0gICAgezI4NCwgMH0sCiAgICAgezI4NSwgMH0sCisgICAgezI4NiwgMH0sCiAgICAgezEsICJpbXBvcnQifSwKLSAgICB7Mjg5LCAwfSwKKyAgICB7MjkwLCAwfSwKICAgICB7MjMsIDB9LAogICAgIHs1MiwgMH0sCi0gICAgezI4OCwgMH0sCi0gICAgezI4NiwgMH0sCi0gICAgezEsICJhcyJ9LAorICAgIHsyODksIDB9LAogICAgIHsyODcsIDB9LAorICAgIHsxLCAiYXMifSwKKyAgICB7Mjg4LCAwfSwKICAgICB7MSwgImdsb2JhbCJ9LAogICAgIHsxLCAibm9ubG9jYWwifSwKICAgICB7MSwgImFzc2VydCJ9LAotICAgIHsyOTYsIDB9LAogICAgIHsyOTcsIDB9LAogICAgIHsyOTgsIDB9LAogICAgIHsyOTksIDB9LAogICAgIHszMDAsIDB9LAotICAgIHsyOTUsIDB9LAorICAgIHszMDEsIDB9LAorICAgIHsyOTYsIDB9LAogICAgIHsxLCAiaWYifSwKICAgICB7MSwgImVsaWYifSwKICAgICB7MSwgImVsc2UifSwKQEAgLTIxMzYsMjYgKzIxODIsMjYgQEAKICAgICB7MSwgImZvciJ9LAogICAgIHsxLCAiaW4ifSwKICAgICB7MSwgInRyeSJ9LAotICAgIHszMDIsIDB9LAorICAgIHszMDMsIDB9LAogICAgIHsxLCAiZmluYWxseSJ9LAogICAgIHsxLCAid2l0aCJ9LAotICAgIHszMDEsIDB9LAotICAgIHszMTQsIDB9LAorICAgIHszMDIsIDB9LAorICAgIHszMTUsIDB9LAogICAgIHsxLCAiZXhjZXB0In0sCiAgICAgezUsIDB9LAogICAgIHs2LCAwfSwKLSAgICB7MzA4LCAwfSwKLSAgICB7MzA2LCAwfSwKLSAgICB7MzA1LCAwfSwKLSAgICB7MzA3LCAwfSwKLSAgICB7MSwgImxhbWJkYSJ9LAogICAgIHszMDksIDB9LAotICAgIHsxLCAib3IifSwKKyAgICB7MzA3LCAwfSwKKyAgICB7MzA2LCAwfSwKKyAgICB7MzA4LCAwfSwKKyAgICB7MSwgImxhbWJkYSJ9LAogICAgIHszMTAsIDB9LAorICAgIHsxLCAib3IifSwKKyAgICB7MzExLCAwfSwKICAgICB7MSwgImFuZCJ9LAogICAgIHsxLCAibm90In0sCi0gICAgezMxMSwgMH0sCiAgICAgezMxMiwgMH0sCisgICAgezMxMywgMH0sCiAgICAgezIwLCAwfSwKICAgICB7MjEsIDB9LAogICAgIHsyNywgMH0sCkBAIC0yMTY0LDU0ICsyMjEwLDU0IEBACiAgICAgezI4LCAwfSwKICAgICB7MjgsIDB9LAogICAgIHsxLCAiaXMifSwKLSAgICB7MzE1LCAwfSwKLSAgICB7MTgsIDB9LAogICAgIHszMTYsIDB9LAotICAgIHszMiwgMH0sCisgICAgezE4LCAwfSwKICAgICB7MzE3LCAwfSwKLSAgICB7MTksIDB9LAorICAgIHszMiwgMH0sCiAgICAgezMxOCwgMH0sCisgICAgezE5LCAwfSwKKyAgICB7MzE5LCAwfSwKICAgICB7MzMsIDB9LAogICAgIHszNCwgMH0sCi0gICAgezMxOSwgMH0sCisgICAgezMyMCwgMH0sCiAgICAgezE0LCAwfSwKICAgICB7MTUsIDB9LAotICAgIHszMjAsIDB9LAorICAgIHszMjEsIDB9LAogICAgIHsxNywgMH0sCiAgICAgezI0LCAwfSwKICAgICB7NDcsIDB9LAogICAgIHszMSwgMH0sCi0gICAgezMyMSwgMH0sCiAgICAgezMyMiwgMH0sCi0gICAgezU0LCAwfSwKICAgICB7MzIzLCAwfSwKLSAgICB7MzI1LCAwfSwKKyAgICB7NTQsIDB9LAogICAgIHszMjQsIDB9LAorICAgIHszMjYsIDB9LAorICAgIHszMjUsIDB9LAogICAgIHs5LCAwfSwKICAgICB7MTAsIDB9LAogICAgIHsyNSwgMH0sCi0gICAgezMzMSwgMH0sCisgICAgezMzMiwgMH0sCiAgICAgezI2LCAwfSwKICAgICB7MiwgMH0sCiAgICAgezMsIDB9LAogICAgIHsxLCAiTm9uZSJ9LAogICAgIHsxLCAiVHJ1ZSJ9LAogICAgIHsxLCAiRmFsc2UifSwKLSAgICB7MzM2LCAwfSwKLSAgICB7MzI2LCAwfSwKKyAgICB7MzM3LCAwfSwKICAgICB7MzI3LCAwfSwKICAgICB7MzI4LCAwfSwKKyAgICB7MzI5LCAwfSwKICAgICB7MSwgImNsYXNzIn0sCi0gICAgezMzNCwgMH0sCiAgICAgezMzNSwgMH0sCi0gICAgezMzNywgMH0sCisgICAgezMzNiwgMH0sCiAgICAgezMzOCwgMH0sCisgICAgezMzOSwgMH0sCiAgICAgezEsICJ5aWVsZCJ9LAotICAgIHszNDAsIDB9LAorICAgIHszNDEsIDB9LAogfTsKIGdyYW1tYXIgX1B5UGFyc2VyX0dyYW1tYXIgPSB7Ci0gICAgODUsCisgICAgODYsCiAgICAgZGZhcywKLSAgICB7MTc1LCBsYWJlbHN9LAorICAgIHsxNzYsIGxhYmVsc30sCiAgICAgMjU2CiB9OwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydC5jIGIvUHl0aG9uL2ltcG9ydC5jCmluZGV4IDdlOTQ3ZWMuLmRmZGQ5NDAgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnQuYworKysgYi9QeXRob24vaW1wb3J0LmMKQEAgLTM4LDE0ICszOCw2IEBACiAKICNpbmNsdWRlICJjbGluaWMvaW1wb3J0LmMuaCIKIAotLypbcHl0aG9uIGlucHV0XQotY2xhc3MgZnNfdW5pY29kZV9jb252ZXJ0ZXIoQ0NvbnZlcnRlcik6Ci0gICAgdHlwZSA9ICdQeU9iamVjdCAqJwotICAgIGNvbnZlcnRlciA9ICdQeVVuaWNvZGVfRlNEZWNvZGVyJwotCi1bcHl0aG9uIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCi0vKltweXRob24gZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD05ZDY3ODYyMzAxNjYwMDZlXSovCi0KIC8qIEluaXRpYWxpemUgdGhpbmdzICovCiAKIHZvaWQKQEAgLTMyMCw3ICszMTIsNyBAQAogCiAKIC8qIExpc3Qgb2YgbmFtZXMgdG8gY2xlYXIgaW4gc3lzICovCi1zdGF0aWMgY2hhciogc3lzX2RlbGV0ZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3lzX2RlbGV0ZXNbXSA9IHsKICAgICAicGF0aCIsICJhcmd2IiwgInBzMSIsICJwczIiLAogICAgICJsYXN0X3R5cGUiLCAibGFzdF92YWx1ZSIsICJsYXN0X3RyYWNlYmFjayIsCiAgICAgInBhdGhfaG9va3MiLCAicGF0aF9pbXBvcnRlcl9jYWNoZSIsICJtZXRhX3BhdGgiLApAQCAtMzMwLDcgKzMyMiw3IEBACiAgICAgTlVMTAogfTsKIAotc3RhdGljIGNoYXIqIHN5c19maWxlc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNfZmlsZXNbXSA9IHsKICAgICAic3RkaW4iLCAiX19zdGRpbl9fIiwKICAgICAic3Rkb3V0IiwgIl9fc3Rkb3V0X18iLAogICAgICJzdGRlcnIiLCAiX19zdGRlcnJfXyIsCkBAIC0zNDcsNyArMzM5LDcgQEAKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICBQeU9iamVjdCAqbW9kdWxlcyA9IGludGVycC0+bW9kdWxlczsKICAgICBQeU9iamVjdCAqd2Vha2xpc3QgPSBOVUxMOwotICAgIGNoYXIgKipwOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqcDsKIAogICAgIGlmIChtb2R1bGVzID09IE5VTEwpCiAgICAgICAgIHJldHVybjsgLyogQWxyZWFkeSBkb25lICovCkBAIC04ODMsMTAgKzg3NSw4IEBACiAgICAgaWYgKFB5VW5pY29kZV9Db21wYXJlKGNvLT5jb19maWxlbmFtZSwgb2xkbmFtZSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIHRtcCA9IGNvLT5jb19maWxlbmFtZTsKLSAgICBjby0+Y29fZmlsZW5hbWUgPSBuZXduYW1lOwotICAgIFB5X0lOQ1JFRihjby0+Y29fZmlsZW5hbWUpOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X0lOQ1JFRihuZXduYW1lKTsKKyAgICBQeV9YU0VUUkVGKGNvLT5jb19maWxlbmFtZSwgbmV3bmFtZSk7CiAKICAgICBjb25zdGFudHMgPSBjby0+Y29fY29uc3RzOwogICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGNvbnN0YW50cyk7CkBAIC0xMDg3LDYgKzEwNzcsMTAgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogUmVtZW1iZXIgcG9pbnRlciB0byBtb2R1bGUgaW5pdCBmdW5jdGlvbi4gKi8KICAgICAgICAgICAgICAgICBkZWYgPSBQeU1vZHVsZV9HZXREZWYobW9kKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGVmLT5tX2Jhc2UubV9pbml0ID0gcC0+aW5pdGZ1bmM7CiAgICAgICAgICAgICAgICAgaWYgKF9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbk9iamVjdChtb2QsIG5hbWUsIG5hbWUpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmFtZSk7CkBAIC0xMzMyLDEwICsxMzI2LDggQEAKICAgICAgICAgICAgIChhbHdheXNfdHJpbSB8fAogICAgICAgICAgICAgIFB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nKGNvZGUtPmNvX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2ZyYW1lcykgPT0gMCkpIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICp0bXAgPSAqb3V0ZXJfbGluazsKLSAgICAgICAgICAgICpvdXRlcl9saW5rID0gbmV4dDsKICAgICAgICAgICAgIFB5X1hJTkNSRUYobmV4dCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIFB5X1hTRVRSRUYoKm91dGVyX2xpbmssIG5leHQpOwogICAgICAgICAgICAgcHJldl9saW5rID0gb3V0ZXJfbGluazsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKQEAgLTEzNDgsNjEgKzEzNDAsMTcwIEBACiB9CiAKIAotUHlPYmplY3QgKgotUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWxPYmplY3QoUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICpnaXZlbl9nbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmxvY2FscywgUHlPYmplY3QgKmdpdmVuX2Zyb21saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKQorc3RhdGljIFB5T2JqZWN0ICoKK3Jlc29sdmVfbmFtZShQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKmdsb2JhbHMsIGludCBsZXZlbCkKIHsKLSAgICBfUHlfSURFTlRJRklFUihfX2ltcG9ydF9fKTsKICAgICBfUHlfSURFTlRJRklFUihfX3NwZWNfXyk7Ci0gICAgX1B5X0lERU5USUZJRVIoX2luaXRpYWxpemluZyk7CiAgICAgX1B5X0lERU5USUZJRVIoX19wYWNrYWdlX18pOwogICAgIF9QeV9JREVOVElGSUVSKF9fcGF0aF9fKTsKICAgICBfUHlfSURFTlRJRklFUihfX25hbWVfXyk7CisgICAgX1B5X0lERU5USUZJRVIocGFyZW50KTsKKyAgICBQeU9iamVjdCAqYWJzX25hbWU7CisgICAgUHlPYmplY3QgKnBhY2thZ2UgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzcGVjOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOworICAgIFB5X3NzaXplX3QgbGFzdF9kb3Q7CisgICAgUHlPYmplY3QgKmJhc2U7CisgICAgaW50IGxldmVsX3VwOworCisgICAgaWYgKGdsb2JhbHMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICInX19uYW1lX18nIG5vdCBpbiBnbG9iYWxzIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGlmICghUHlEaWN0X0NoZWNrKGdsb2JhbHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJnbG9iYWxzIG11c3QgYmUgYSBkaWN0Iik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIHBhY2thZ2UgPSBfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX3BhY2thZ2VfXyk7CisgICAgaWYgKHBhY2thZ2UgPT0gUHlfTm9uZSkgeworICAgICAgICBwYWNrYWdlID0gTlVMTDsKKyAgICB9CisgICAgc3BlYyA9IF9QeURpY3RfR2V0SXRlbUlkKGdsb2JhbHMsICZQeUlkX19fc3BlY19fKTsKKworICAgIGlmIChwYWNrYWdlICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKHBhY2thZ2UpOworICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhwYWNrYWdlKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInBhY2thZ2UgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzcGVjICE9IE5VTEwgJiYgc3BlYyAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICBpbnQgZXF1YWw7CisgICAgICAgICAgICBQeU9iamVjdCAqcGFyZW50ID0gX1B5T2JqZWN0X0dldEF0dHJJZChzcGVjLCAmUHlJZF9wYXJlbnQpOworICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXF1YWwgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wocGFja2FnZSwgcGFyZW50LCBQeV9FUSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocGFyZW50KTsKKyAgICAgICAgICAgIGlmIChlcXVhbCA8IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZXF1YWwgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfSW1wb3J0V2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX3BhY2thZ2VfXyAhPSBfX3NwZWNfXy5wYXJlbnQiLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoc3BlYyAhPSBOVUxMICYmIHNwZWMgIT0gUHlfTm9uZSkgeworICAgICAgICBwYWNrYWdlID0gX1B5T2JqZWN0X0dldEF0dHJJZChzcGVjLCAmUHlJZF9wYXJlbnQpOworICAgICAgICBpZiAocGFja2FnZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2socGFja2FnZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJfX3NwZWNfXy5wYXJlbnQgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19JbXBvcnRXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgcmVzb2x2ZSBwYWNrYWdlIGZyb20gX19zcGVjX18gb3IgX19wYWNrYWdlX18sICIKKyAgICAgICAgICAgICAgICAgICAgImZhbGxpbmcgYmFjayBvbiBfX25hbWVfXyBhbmQgX19wYXRoX18iLCAxKSA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBwYWNrYWdlID0gX1B5RGljdF9HZXRJdGVtSWQoZ2xvYmFscywgJlB5SWRfX19uYW1lX18pOworICAgICAgICBpZiAocGFja2FnZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICInX19uYW1lX18nIG5vdCBpbiBnbG9iYWxzIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgUHlfSU5DUkVGKHBhY2thZ2UpOworICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhwYWNrYWdlKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fbmFtZV9fIG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX1B5RGljdF9HZXRJdGVtSWQoZ2xvYmFscywgJlB5SWRfX19wYXRoX18pID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgZG90OworCisgICAgICAgICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHBhY2thZ2UpIDwgMCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRvdCA9IFB5VW5pY29kZV9GaW5kQ2hhcihwYWNrYWdlLCAnLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUHlVbmljb2RlX0dFVF9MRU5HVEgocGFja2FnZSksIC0xKTsKKyAgICAgICAgICAgIGlmIChkb3QgPT0gLTIpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZG90ID49IDApIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3Vic3RyID0gUHlVbmljb2RlX1N1YnN0cmluZyhwYWNrYWdlLCAwLCBkb3QpOworICAgICAgICAgICAgICAgIGlmIChzdWJzdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9TRVRSRUYocGFja2FnZSwgc3Vic3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGxhc3RfZG90ID0gUHlVbmljb2RlX0dFVF9MRU5HVEgocGFja2FnZSk7CisgICAgaWYgKGxhc3RfZG90ID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICJhdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IHdpdGggbm8ga25vd24gcGFyZW50IHBhY2thZ2UiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlEaWN0X0dldEl0ZW0oaW50ZXJwLT5tb2R1bGVzLCBwYWNrYWdlKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAiUGFyZW50IG1vZHVsZSAlUiBub3QgbG9hZGVkLCBjYW5ub3QgcGVyZm9ybSByZWxhdGl2ZSAiCisgICAgICAgICAgICAgICAgImltcG9ydCIsIHBhY2thZ2UpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGZvciAobGV2ZWxfdXAgPSAxOyBsZXZlbF91cCA8IGxldmVsOyBsZXZlbF91cCArPSAxKSB7CisgICAgICAgIGxhc3RfZG90ID0gUHlVbmljb2RlX0ZpbmRDaGFyKHBhY2thZ2UsICcuJywgMCwgbGFzdF9kb3QsIC0xKTsKKyAgICAgICAgaWYgKGxhc3RfZG90ID09IC0yKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxhc3RfZG90ID09IC0xKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBiZXlvbmQgdG9wLWxldmVsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJhc2UgPSBQeVVuaWNvZGVfU3Vic3RyaW5nKHBhY2thZ2UsIDAsIGxhc3RfZG90KTsKKyAgICBQeV9ERUNSRUYocGFja2FnZSk7CisgICAgaWYgKGJhc2UgPT0gTlVMTCB8fCBQeVVuaWNvZGVfR0VUX0xFTkdUSChuYW1lKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBiYXNlOworICAgIH0KKworICAgIGFic19uYW1lID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiVVLiVVIiwgYmFzZSwgbmFtZSk7CisgICAgUHlfREVDUkVGKGJhc2UpOworICAgIHJldHVybiBhYnNfbmFtZTsKKworICBlcnJvcjoKKyAgICBQeV9YREVDUkVGKHBhY2thZ2UpOworICAgIHJldHVybiBOVUxMOworfQorCitQeU9iamVjdCAqCitQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbE9iamVjdChQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKmdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzLCBQeU9iamVjdCAqZnJvbWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpCit7CiAgICAgX1B5X0lERU5USUZJRVIoX2ZpbmRfYW5kX2xvYWQpOwogICAgIF9QeV9JREVOVElGSUVSKF9oYW5kbGVfZnJvbWxpc3QpOwotICAgIF9QeV9JREVOVElGSUVSKF9sb2NrX3VubG9ja19tb2R1bGUpOwotICAgIF9QeV9zdGF0aWNfc3RyaW5nKHNpbmdsZV9kb3QsICIuIik7CiAgICAgUHlPYmplY3QgKmFic19uYW1lID0gTlVMTDsKLSAgICBQeU9iamVjdCAqYnVpbHRpbnNfaW1wb3J0ID0gTlVMTDsKICAgICBQeU9iamVjdCAqZmluYWxfbW9kID0gTlVMTDsKICAgICBQeU9iamVjdCAqbW9kID0gTlVMTDsKICAgICBQeU9iamVjdCAqcGFja2FnZSA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKmdsb2JhbHMgPSBOVUxMOwotICAgIFB5T2JqZWN0ICpmcm9tbGlzdCA9IE5VTEw7CiAgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CiAgICAgaW50IGhhc19mcm9tOwogCi0gICAgLyogTWFrZSBzdXJlIHRvIHVzZSBkZWZhdWx0IHZhbHVlcyBzbyBhcyB0byBub3QgaGF2ZQotICAgICAgIFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKCkgdHJ1bmNhdGUgdGhlIHBhcmFtZXRlciBsaXN0IGJlY2F1c2Ugb2YgYQotICAgICAgIE5VTEwgYXJndW1lbnQuICovCi0gICAgaWYgKGdpdmVuX2dsb2JhbHMgPT0gTlVMTCkgewotICAgICAgICBnbG9iYWxzID0gUHlEaWN0X05ldygpOwotICAgICAgICBpZiAoZ2xvYmFscyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKiBPbmx5IGhhdmUgdG8gY2FyZSB3aGF0IGdpdmVuX2dsb2JhbHMgaXMgaWYgaXQgd2lsbCBiZSB1c2VkCi0gICAgICAgICAgIGZvciBzb21ldGhpbmcuICovCi0gICAgICAgIGlmIChsZXZlbCA+IDAgJiYgIVB5RGljdF9DaGVjayhnaXZlbl9nbG9iYWxzKSkgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdsb2JhbHMgbXVzdCBiZSBhIGRpY3QiKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgZ2xvYmFscyA9IGdpdmVuX2dsb2JhbHM7Ci0gICAgICAgIFB5X0lOQ1JFRihnbG9iYWxzKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2l2ZW5fZnJvbWxpc3QgPT0gTlVMTCkgewotICAgICAgICBmcm9tbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0gICAgICAgIGlmIChmcm9tbGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBmcm9tbGlzdCA9IGdpdmVuX2Zyb21saXN0OwotICAgICAgICBQeV9JTkNSRUYoZnJvbWxpc3QpOwotICAgIH0KICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiRW1wdHkgbW9kdWxlIG5hbWUiKTsKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTE0MTUsMTQwICsxNTE2LDQ0IEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtb2R1bGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIik7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQotICAgIGVsc2UgaWYgKFB5VW5pY29kZV9SRUFEWShuYW1lKSA8IDApIHsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKG5hbWUpIDwgMCkgewogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KICAgICBpZiAobGV2ZWwgPCAwKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibGV2ZWwgbXVzdCBiZSA+PSAwIik7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQotICAgIGVsc2UgaWYgKGxldmVsID4gMCkgewotICAgICAgICBwYWNrYWdlID0gX1B5RGljdF9HZXRJdGVtSWQoZ2xvYmFscywgJlB5SWRfX19wYWNrYWdlX18pOwotICAgICAgICBpZiAocGFja2FnZSAhPSBOVUxMICYmIHBhY2thZ2UgIT0gUHlfTm9uZSkgewotICAgICAgICAgICAgUHlfSU5DUkVGKHBhY2thZ2UpOwotICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2socGFja2FnZSkpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicGFja2FnZSBtdXN0IGJlIGEgc3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBhY2thZ2UgPSBfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX25hbWVfXyk7Ci0gICAgICAgICAgICBpZiAocGFja2FnZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLCAiJ19fbmFtZV9fJyBub3QgaW4gZ2xvYmFscyIpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHBhY2thZ2UpKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fbmFtZV9fIG11c3QgYmUgYSBzdHJpbmciKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlfSU5DUkVGKHBhY2thZ2UpOwogCi0gICAgICAgICAgICBpZiAoX1B5RGljdF9HZXRJdGVtSWQoZ2xvYmFscywgJlB5SWRfX19wYXRoX18pID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqcGFydGl0aW9uID0gTlVMTDsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqYm9ycm93ZWRfZG90ID0gX1B5VW5pY29kZV9Gcm9tSWQoJnNpbmdsZV9kb3QpOwotICAgICAgICAgICAgICAgIGlmIChib3Jyb3dlZF9kb3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXJ0aXRpb24gPSBQeVVuaWNvZGVfUlBhcnRpdGlvbihwYWNrYWdlLCBib3Jyb3dlZF9kb3QpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBpZiAocGFydGl0aW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGFja2FnZSA9IFB5VHVwbGVfR0VUX0lURU0ocGFydGl0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYocGFja2FnZSk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHBhcnRpdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW0oaW50ZXJwLT5tb2R1bGVzLCBwYWNrYWdlKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICJQYXJlbnQgbW9kdWxlICVSIG5vdCBsb2FkZWQsIGNhbm5vdCBwZXJmb3JtIHJlbGF0aXZlICIKLSAgICAgICAgICAgICAgICAgICAgImltcG9ydCIsIHBhY2thZ2UpOworICAgIGlmIChsZXZlbCA+IDApIHsKKyAgICAgICAgYWJzX25hbWUgPSByZXNvbHZlX25hbWUobmFtZSwgZ2xvYmFscywgbGV2ZWwpOworICAgICAgICBpZiAoYWJzX25hbWUgPT0gTlVMTCkKICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7ICAvKiBsZXZlbCA9PSAwICovCiAgICAgICAgIGlmIChQeVVuaWNvZGVfR0VUX0xFTkdUSChuYW1lKSA9PSAwKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkVtcHR5IG1vZHVsZSBuYW1lIik7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgIHBhY2thZ2UgPSBQeV9Ob25lOwotICAgICAgICBQeV9JTkNSRUYocGFja2FnZSk7Ci0gICAgfQotCi0gICAgaWYgKGxldmVsID4gMCkgewotICAgICAgICBQeV9zc2l6ZV90IGxhc3RfZG90ID0gUHlVbmljb2RlX0dFVF9MRU5HVEgocGFja2FnZSk7Ci0gICAgICAgIFB5T2JqZWN0ICpiYXNlID0gTlVMTDsKLSAgICAgICAgaW50IGxldmVsX3VwID0gMTsKLQotICAgICAgICBmb3IgKGxldmVsX3VwID0gMTsgbGV2ZWxfdXAgPCBsZXZlbDsgbGV2ZWxfdXAgKz0gMSkgewotICAgICAgICAgICAgbGFzdF9kb3QgPSBQeVVuaWNvZGVfRmluZENoYXIocGFja2FnZSwgJy4nLCAwLCBsYXN0X2RvdCwgLTEpOwotICAgICAgICAgICAgaWYgKGxhc3RfZG90ID09IC0yKSB7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGxhc3RfZG90ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGJleW9uZCB0b3AtbGV2ZWwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSIpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBiYXNlID0gUHlVbmljb2RlX1N1YnN0cmluZyhwYWNrYWdlLCAwLCBsYXN0X2RvdCk7Ci0gICAgICAgIGlmIChiYXNlID09IE5VTEwpCi0gICAgICAgICAgICBnb3RvIGVycm9yOwotCi0gICAgICAgIGlmIChQeVVuaWNvZGVfR0VUX0xFTkdUSChuYW1lKSA+IDApIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpib3Jyb3dlZF9kb3QsICpzZXEgPSBOVUxMOwotCi0gICAgICAgICAgICBib3Jyb3dlZF9kb3QgPSBfUHlVbmljb2RlX0Zyb21JZCgmc2luZ2xlX2RvdCk7Ci0gICAgICAgICAgICBzZXEgPSBQeVR1cGxlX1BhY2soMiwgYmFzZSwgbmFtZSk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoYmFzZSk7Ci0gICAgICAgICAgICBpZiAoYm9ycm93ZWRfZG90ID09IE5VTEwgfHwgc2VxID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhYnNfbmFtZSA9IFB5VW5pY29kZV9Kb2luKGJvcnJvd2VkX2RvdCwgc2VxKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzZXEpOwotICAgICAgICAgICAgaWYgKGFic19uYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYWJzX25hbWUgPSBiYXNlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewogICAgICAgICBhYnNfbmFtZSA9IG5hbWU7CiAgICAgICAgIFB5X0lOQ1JFRihhYnNfbmFtZSk7CiAgICAgfQogCi0jaWZkZWYgV0lUSF9USFJFQUQKLSAgICBfUHlJbXBvcnRfQWNxdWlyZUxvY2soKTsKLSNlbmRpZgotICAgLyogRnJvbSB0aGlzIHBvaW50IGZvcndhcmQsIGdvdG8gZXJyb3Jfd2l0aF91bmxvY2shICovCi0gICAgLyogWFhYIGludGVycC0+YnVpbHRpbnNfY29weSBpcyBOVUxMIGluIHN1YmludGVycHJldGVyISAqLwotICAgIGJ1aWx0aW5zX2ltcG9ydCA9IF9QeURpY3RfR2V0SXRlbUlkKGludGVycC0+YnVpbHRpbnNfY29weSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwLT5idWlsdGluc19jb3B5IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnAtPmJ1aWx0aW5zLCAmUHlJZF9fX2ltcG9ydF9fKTsKLSAgICBpZiAoYnVpbHRpbnNfaW1wb3J0ID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiX19pbXBvcnRfXyBub3QgZm91bmQiKTsKLSAgICAgICAgZ290byBlcnJvcl93aXRoX3VubG9jazsKLSAgICB9Ci0gICAgUHlfSU5DUkVGKGJ1aWx0aW5zX2ltcG9ydCk7Ci0KICAgICBtb2QgPSBQeURpY3RfR2V0SXRlbShpbnRlcnAtPm1vZHVsZXMsIGFic19uYW1lKTsKICAgICBpZiAobW9kID09IFB5X05vbmUpIHsKICAgICAgICAgUHlPYmplY3QgKm1zZyA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCJpbXBvcnQgb2YgJVIgaGFsdGVkOyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uZSBpbiBzeXMubW9kdWxlcyIsIGFic19uYW1lKTsKICAgICAgICAgaWYgKG1zZyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRJbXBvcnRFcnJvcihtc2csIGFic19uYW1lLCBOVUxMKTsKKyAgICAgICAgICAgIFB5RXJyX1NldEltcG9ydEVycm9yU3ViY2xhc3MoUHlFeGNfTW9kdWxlTm90Rm91bmRFcnJvciwgbXNnLAorICAgICAgICAgICAgICAgICAgICBhYnNfbmFtZSwgTlVMTCk7CiAgICAgICAgICAgICBQeV9ERUNSRUYobXNnKTsKICAgICAgICAgfQogICAgICAgICBtb2QgPSBOVUxMOwotICAgICAgICBnb3RvIGVycm9yX3dpdGhfdW5sb2NrOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KICAgICBlbHNlIGlmIChtb2QgIT0gTlVMTCkgeworICAgICAgICBfUHlfSURFTlRJRklFUihfX3NwZWNfXyk7CisgICAgICAgIF9QeV9JREVOVElGSUVSKF9pbml0aWFsaXppbmcpOworICAgICAgICBfUHlfSURFTlRJRklFUihfbG9ja191bmxvY2tfbW9kdWxlKTsKICAgICAgICAgUHlPYmplY3QgKnZhbHVlID0gTlVMTDsKICAgICAgICAgUHlPYmplY3QgKnNwZWM7CiAgICAgICAgIGludCBpbml0aWFsaXppbmcgPSAwOwpAQCAtMTU3MSw5MSArMTU3Niw4MyBAQAogICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKICAgICAgICAgICAgIGlmIChpbml0aWFsaXppbmcgPT0gLTEpCiAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5pdGlhbGl6aW5nID4gMCkgewotICAgICAgICAgICAgLyogX2Jvb3RzdHJhcC5fbG9ja191bmxvY2tfbW9kdWxlKCkgcmVsZWFzZXMgdGhlIGltcG9ydCBsb2NrICovCi0gICAgICAgICAgICB2YWx1ZSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWRPYmpBcmdzKGludGVycC0+aW1wb3J0bGliLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlJZF9fbG9ja191bmxvY2tfbW9kdWxlLCBhYnNfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpbml0aWFsaXppbmcgPiAwKSB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLSAgICAgICAgICAgIGlmIChfUHlJbXBvcnRfUmVsZWFzZUxvY2soKSA8IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibm90IGhvbGRpbmcgdGhlIGltcG9ydCBsb2NrIik7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfUHlJbXBvcnRfQWNxdWlyZUxvY2soKTsKICNlbmRpZgorICAgICAgICAgICAgICAgIC8qIF9ib290c3RyYXAuX2xvY2tfdW5sb2NrX21vZHVsZSgpIHJlbGVhc2VzIHRoZSBpbXBvcnQgbG9jayAqLworICAgICAgICAgICAgICAgIHZhbHVlID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZE9iakFyZ3MoaW50ZXJwLT5pbXBvcnRsaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlJZF9fbG9ja191bmxvY2tfbW9kdWxlLCBhYnNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICAgICAgX1B5SW1wb3J0X0FjcXVpcmVMb2NrKCk7CisjZW5kaWYKICAgICAgICAgLyogX2Jvb3RzdHJhcC5fZmluZF9hbmRfbG9hZCgpIHJlbGVhc2VzIHRoZSBpbXBvcnQgbG9jayAqLwogICAgICAgICBtb2QgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkT2JqQXJncyhpbnRlcnAtPmltcG9ydGxpYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5SWRfX2ZpbmRfYW5kX2xvYWQsIGFic19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsdGluc19pbXBvcnQsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnAtPmltcG9ydF9mdW5jLCBOVUxMKTsKICAgICAgICAgaWYgKG1vZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgfQotICAgIC8qIEZyb20gbm93IG9uIHdlIGRvbid0IGhvbGQgdGhlIGltcG9ydCBsb2NrIGFueW1vcmUuICovCiAKLSAgICBoYXNfZnJvbSA9IFB5T2JqZWN0X0lzVHJ1ZShmcm9tbGlzdCk7Ci0gICAgaWYgKGhhc19mcm9tIDwgMCkKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICBoYXNfZnJvbSA9IDA7CisgICAgaWYgKGZyb21saXN0ICE9IE5VTEwgJiYgZnJvbWxpc3QgIT0gUHlfTm9uZSkgeworICAgICAgICBoYXNfZnJvbSA9IFB5T2JqZWN0X0lzVHJ1ZShmcm9tbGlzdCk7CisgICAgICAgIGlmIChoYXNfZnJvbSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KICAgICBpZiAoIWhhc19mcm9tKSB7Ci0gICAgICAgIGlmIChsZXZlbCA9PSAwIHx8IFB5VW5pY29kZV9HRVRfTEVOR1RIKG5hbWUpID4gMCkgewotICAgICAgICAgICAgUHlPYmplY3QgKmZyb250ID0gTlVMTDsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpwYXJ0aXRpb24gPSBOVUxMOwotICAgICAgICAgICAgUHlPYmplY3QgKmJvcnJvd2VkX2RvdCA9IF9QeVVuaWNvZGVfRnJvbUlkKCZzaW5nbGVfZG90KTsKKyAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChuYW1lKTsKKyAgICAgICAgaWYgKGxldmVsID09IDAgfHwgbGVuID4gMCkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBkb3Q7CiAKLSAgICAgICAgICAgIGlmIChib3Jyb3dlZF9kb3QgPT0gTlVMTCkgeworICAgICAgICAgICAgZG90ID0gUHlVbmljb2RlX0ZpbmRDaGFyKG5hbWUsICcuJywgMCwgbGVuLCAxKTsKKyAgICAgICAgICAgIGlmIChkb3QgPT0gLTIpIHsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwYXJ0aXRpb24gPSBQeVVuaWNvZGVfUGFydGl0aW9uKG5hbWUsIGJvcnJvd2VkX2RvdCk7Ci0gICAgICAgICAgICBpZiAocGFydGl0aW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgoUHlUdXBsZV9HRVRfSVRFTShwYXJ0aXRpb24sIDEpKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZG90ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgLyogTm8gZG90IGluIG1vZHVsZSBuYW1lLCBzaW1wbGUgZXhpdCAqLwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwYXJ0aXRpb24pOwogICAgICAgICAgICAgICAgIGZpbmFsX21vZCA9IG1vZDsKICAgICAgICAgICAgICAgICBQeV9JTkNSRUYobW9kKTsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmcm9udCA9IFB5VHVwbGVfR0VUX0lURU0ocGFydGl0aW9uLCAwKTsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihmcm9udCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocGFydGl0aW9uKTsKLQogICAgICAgICAgICAgaWYgKGxldmVsID09IDApIHsKLSAgICAgICAgICAgICAgICBmaW5hbF9tb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGJ1aWx0aW5zX2ltcG9ydCwgZnJvbnQsIE5VTEwpOworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpmcm9udCA9IFB5VW5pY29kZV9TdWJzdHJpbmcobmFtZSwgMCwgZG90KTsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmFsX21vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsT2JqZWN0KGZyb250LCBOVUxMLCBOVUxMLCBOVUxMLCAwKTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnJvbnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlfc3NpemVfdCBjdXRfb2ZmID0gUHlVbmljb2RlX0dFVF9MRU5HVEgobmFtZSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKGZyb250KTsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGN1dF9vZmYgPSBsZW4gLSBkb3Q7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBhYnNfbmFtZV9sZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChhYnNfbmFtZSk7CiAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnRvX3JldHVybiA9IFB5VW5pY29kZV9TdWJzdHJpbmcoYWJzX25hbWUsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic19uYW1lX2xlbiAtIGN1dF9vZmYpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmcm9udCk7CiAgICAgICAgICAgICAgICAgaWYgKHRvX3JldHVybiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZmluYWxfbW9kID0gUHlEaWN0X0dldEl0ZW0oaW50ZXJwLT5tb2R1bGVzLCB0b19yZXR1cm4pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0b19yZXR1cm4pOwogICAgICAgICAgICAgICAgIGlmIChmaW5hbF9tb2QgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJVIgbm90IGluIHN5cy5tb2R1bGVzIGFzIGV4cGVjdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3JldHVybik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZmluYWxfbW9kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRvX3JldHVybik7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGZpbmFsX21vZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CkBAIC0xNjY2LDI0ICsxNjYzLDE0IEBACiAgICAgZWxzZSB7CiAgICAgICAgIGZpbmFsX21vZCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWRPYmpBcmdzKGludGVycC0+aW1wb3J0bGliLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlJZF9faGFuZGxlX2Zyb21saXN0LCBtb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21saXN0LCBidWlsdGluc19pbXBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21saXN0LCBpbnRlcnAtPmltcG9ydF9mdW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICB9Ci0gICAgZ290byBlcnJvcjsKIAotICBlcnJvcl93aXRoX3VubG9jazoKLSNpZmRlZiBXSVRIX1RIUkVBRAotICAgIGlmIChfUHlJbXBvcnRfUmVsZWFzZUxvY2soKSA8IDApIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIm5vdCBob2xkaW5nIHRoZSBpbXBvcnQgbG9jayIpOwotICAgIH0KLSNlbmRpZgogICBlcnJvcjoKICAgICBQeV9YREVDUkVGKGFic19uYW1lKTsKLSAgICBQeV9YREVDUkVGKGJ1aWx0aW5zX2ltcG9ydCk7CiAgICAgUHlfWERFQ1JFRihtb2QpOwogICAgIFB5X1hERUNSRUYocGFja2FnZSk7Ci0gICAgUHlfWERFQ1JFRihnbG9iYWxzKTsKLSAgICBQeV9YREVDUkVGKGZyb21saXN0KTsKICAgICBpZiAoZmluYWxfbW9kID09IE5VTEwpCiAgICAgICAgIHJlbW92ZV9pbXBvcnRsaWJfZnJhbWVzKCk7CiAgICAgcmV0dXJuIGZpbmFsX21vZDsKQEAgLTE5NTksMTkgKzE5NDYsMTUgQEAKIAogICAgIGRlZiA9IFB5TW9kdWxlX0dldERlZihtb2QpOwogICAgIGlmIChkZWYgPT0gTlVMTCkgewotICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKwogICAgIHN0YXRlID0gUHlNb2R1bGVfR2V0U3RhdGUobW9kKTsKLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQogICAgIGlmIChzdGF0ZSkgewogICAgICAgICAvKiBBbHJlYWR5IGluaXRpYWxpemVkOyBza2lwIHJlbG9hZCAqLwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisKICAgICByZXR1cm4gUHlNb2R1bGVfRXhlY0RlZihtb2QsIGRlZik7CiB9CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnRkbC5jIGIvUHl0aG9uL2ltcG9ydGRsLmMKaW5kZXggMWFhNTg1ZC4uYWMwMzI4OSAxMDA2NDQKLS0tIGEvUHl0aG9uL2ltcG9ydGRsLmMKKysrIGIvUHl0aG9uL2ltcG9ydGRsLmMKQEAgLTIzLDggKzIzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApOwogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBjaGFyICphc2NpaV9vbmx5X3ByZWZpeCA9ICJQeUluaXQiOwotc3RhdGljIGNvbnN0IGNoYXIgKm5vbmFzY2lpX3ByZWZpeCA9ICJQeUluaXRVIjsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXNjaWlfb25seV9wcmVmaXggPSAiUHlJbml0IjsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgbm9uYXNjaWlfcHJlZml4ID0gIlB5SW5pdFUiOwogCiAvKiBHZXQgdGhlIHZhcmlhYmxlIHBhcnQgb2YgYSBtb2R1bGUncyBleHBvcnQgc3ltYm9sIG5hbWUuCiAgKiBSZXR1cm5zIGEgYnl0ZXMgaW5zdGFuY2UuIEZvciBub24tQVNDSUktbmFtZWQgbW9kdWxlcywgdGhlIG5hbWUgaXMKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnRsaWIuaCBiL1B5dGhvbi9pbXBvcnRsaWIuaAppbmRleCA3ZjZiNzUzLi5jNjM2MjFlIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0bGliLmgKKysrIGIvUHl0aG9uL2ltcG9ydGxpYi5oCkBAIC0xLDg1ICsxLDcyIEBACiAvKiBBdXRvLWdlbmVyYXRlZCBieSBQcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYi5jICovCiBjb25zdCB1bnNpZ25lZCBjaGFyIF9QeV9NX19pbXBvcnRsaWJbXSA9IHsKLSAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw2LDAsMCwKLSAgICAwLDY0LDAsMCwwLDExNSwxNjksMiwwLDAsMTAwLDAsMCw5MCwwLDAsCi0gICAgMTAwLDEsMCw5NywxLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsCi0gICAgMiwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDMsMCw3MSwxMDAsCi0gICAgNiwwLDEwMCw3LDAsMTMyLDAsMCwxMDAsNywwLDEzMSwyLDAsOTAsNCwKLSAgICAwLDEwNSwwLDAsOTAsNSwwLDEwNSwwLDAsOTAsNiwwLDcxLDEwMCw4LAotICAgIDAsMTAwLDksMCwxMzIsMCwwLDEwMCw5LDAsMTAxLDcsMCwxMzEsMywwLAotICAgIDkwLDgsMCw3MSwxMDAsMTAsMCwxMDAsMTEsMCwxMzIsMCwwLDEwMCwxMSwwLAotICAgIDEzMSwyLDAsOTAsOSwwLDcxLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLDAsCi0gICAgMTAwLDEzLDAsMTMxLDIsMCw5MCwxMCwwLDcxLDEwMCwxNCwwLDEwMCwxNSwwLAotICAgIDEzMiwwLDAsMTAwLDE1LDAsMTMxLDIsMCw5MCwxMSwwLDEwMCwxNiwwLDEwMCwKLSAgICAxNywwLDEzMiwwLDAsOTAsMTIsMCwxMDAsMTgsMCwxMDAsMTksMCwxMzIsMCwKLSAgICAwLDkwLDEzLDAsMTAwLDIwLDAsMTAwLDIxLDAsMTMyLDAsMCw5MCwxNCwwLAotICAgIDEwMCwyMiwwLDEwMCwyMywwLDEwMCwyNCwwLDEwMCwyNSwwLDEzMiwwLDEsOTAsCi0gICAgMTUsMCwxMDAsMjYsMCwxMDAsMjcsMCwxMzIsMCwwLDkwLDE2LDAsMTAwLDI4LAotICAgIDAsMTAwLDI5LDAsMTMyLDAsMCw5MCwxNywwLDEwMCwzMCwwLDEwMCwzMSwwLAotICAgIDEzMiwwLDAsOTAsMTgsMCwxMDAsMzIsMCwxMDAsMzMsMCwxMzIsMCwwLDkwLAotICAgIDE5LDAsNzEsMTAwLDM0LDAsMTAwLDM1LDAsMTMyLDAsMCwxMDAsMzUsMCwxMzEsCi0gICAgMiwwLDkwLDIwLDAsNzEsMTAwLDM2LDAsMTAwLDM3LDAsMTMyLDAsMCwxMDAsCi0gICAgMzcsMCwxMzEsMiwwLDkwLDIxLDAsMTAwLDM4LDAsMTAwLDEsMCwxMDAsMzksCi0gICAgMCwxMDAsMSwwLDEwMCw0MCwwLDEwMCw0MSwwLDEzMiwwLDIsOTAsMjIsMCwKLSAgICAxMDEsMjMsMCwxMzEsMCwwLDkwLDI0LDAsMTAwLDEsMCwxMDAsMSwwLDEwMCwKLSAgICA0MiwwLDEwMCw0MywwLDEzMiwyLDAsOTAsMjUsMCwxMDAsNDQsMCwxMDAsNDUsCi0gICAgMCwxMDAsNDYsMCwxMDAsNDcsMCwxMzIsMCwxLDkwLDI2LDAsMTAwLDQ4LDAsCi0gICAgMTAwLDQ5LDAsMTMyLDAsMCw5MCwyNywwLDEwMCw1MCwwLDEwMCw1MSwwLDEzMiwKLSAgICAwLDAsOTAsMjgsMCwxMDAsNTIsMCwxMDAsNTMsMCwxMzIsMCwwLDkwLDI5LAotICAgIDAsMTAwLDU0LDAsMTAwLDU1LDAsMTMyLDAsMCw5MCwzMCwwLDEwMCw1NiwwLAotICAgIDEwMCw1NywwLDEzMiwwLDAsOTAsMzEsMCwxMDAsNTgsMCwxMDAsNTksMCwxMzIsCi0gICAgMCwwLDkwLDMyLDAsNzEsMTAwLDYwLDAsMTAwLDYxLDAsMTMyLDAsMCwxMDAsCi0gICAgNjEsMCwxMzEsMiwwLDkwLDMzLDAsNzEsMTAwLDYyLDAsMTAwLDYzLDAsMTMyLAotICAgIDAsMCwxMDAsNjMsMCwxMzEsMiwwLDkwLDM0LDAsNzEsMTAwLDY0LDAsMTAwLAotICAgIDY1LDAsMTMyLDAsMCwxMDAsNjUsMCwxMzEsMiwwLDkwLDM1LDAsMTAwLDY2LAotICAgIDAsMTAwLDY3LDAsMTMyLDAsMCw5MCwzNiwwLDEwMCw2OCwwLDEwMCw2OSwwLAotICAgIDEzMiwwLDAsOTAsMzcsMCwxMDAsMSwwLDEwMCw3MCwwLDEwMCw3MSwwLDEzMiwKLSAgICAxLDAsOTAsMzgsMCwxMDAsNzIsMCwxMDAsNzMsMCwxMzIsMCwwLDkwLDM5LAotICAgIDAsMTAwLDc0LDAsOTAsNDAsMCwxMDEsNDAsMCwxMDAsNzUsMCwyMyw5MCw0MSwKLSAgICAwLDEwMCw3NiwwLDEwMCw3NywwLDEzMiwwLDAsOTAsNDIsMCwxMDAsNzgsMCwKLSAgICAxMDAsNzksMCwxMzIsMCwwLDkwLDQzLDAsMTAwLDEsMCwxMDAsODAsMCwxMDAsCi0gICAgODEsMCwxMDAsODIsMCwxMzIsMiwwLDkwLDQ0LDAsMTAwLDgzLDAsMTAwLDg0LAotICAgIDAsMTMyLDAsMCw5MCw0NSwwLDEwMCw4NSwwLDEwMCw4NiwwLDEzMiwwLDAsCi0gICAgOTAsNDYsMCwxMDAsMSwwLDEwMCwxLDAsMTAyLDAsMCwxMDAsODAsMCwxMDAsCi0gICAgODcsMCwxMDAsODgsMCwxMzIsNCwwLDkwLDQ3LDAsMTAwLDg5LDAsMTAwLDkwLAotICAgIDAsMTMyLDAsMCw5MCw0OCwwLDEwMCw5MSwwLDEwMCw5MiwwLDEzMiwwLDAsCi0gICAgOTAsNDksMCwxMDAsOTMsMCwxMDAsOTQsMCwxMzIsMCwwLDkwLDUwLDAsMTAwLAotICAgIDEsMCw4Myw0MSw5NSw5Nyw4MywxLDAsMCw2NywxMTEsMTE0LDEwMSwzMiwxMDUsCi0gICAgMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwKLSAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwxMCwxMCw4NCwxMDQsMTA1LDExNSwzMiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDc4LDc5LDg0LDMyLDEwOSwxMDEsOTcsCi0gICAgMTEwLDExNiwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDEwOCwKLSAgICAxMjEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwzMywzMiw3MywxMTYsMzIsMTA0LAotICAgIDk3LDExNSwzMiw5OCwxMDEsMTAxLDExMCwzMiwxMDAsMTAxLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLAotICAgIDMyLDExNSwxMTcsOTksMTA0LDEwLDExNiwxMDQsOTcsMTE2LDMyLDEwNSwxMTYsMzIsOTksOTcsCi0gICAgMTEwLDMyLDk4LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMTEyLDEwMSwKLSAgICAxMDAsMzIsMTA1LDExMCwxMTYsMTExLDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsOTcsMTE1LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwKLSAgICAxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDMyLDY1LAotICAgIDExNSwxMCwxMTUsMTE3LDk5LDEwNCwzMiwxMDUsMTE2LDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LAotICAgIDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDExMCwxMDYsMTAxLDk5LDExNiwxMDUsMTExLDExMCwKLSAgICAzMiwxMTEsMTAyLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDk5LDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsCi0gICAgMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMTEsMTE0LDEwMCwxMDEsMTE0LDMyLDExNiwxMTEsMTAsCi0gICAgMTE5LDExMSwxMTQsMTA3LDQ2LDMyLDc5LDExMCwxMDEsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsCi0gICAgMzIsMTE3LDExNSwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5NywKLSAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNyw5OCwxMDgsMTA1LDk5LDQ1LDEwMiw5Nyw5OSwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTYsCi0gICAgMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsNzgsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNywwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsOTIsMCwwLDAsMTIwLDY2LDAsMTAwLDEsMCwxMDAsMiwKLSAgICAwLDEwMCwzLDAsMTAwLDQsMCwxMDMsNCwwLDY4LDkzLDQ2LDAsMTI1LDIsCi0gICAgMCwxMTYsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDExNCwxOSwwLAotICAgIDExNiwxLDAsMTI0LDAsMCwxMjQsMiwwLDExNiwyLDAsMTI0LDEsMCwxMjQsCi0gICAgMiwwLDEzMSwyLDAsMTMxLDMsMCwxLDExMywxOSwwLDg3LDEyNCwwLDAsCi0gICAgMTA2LDMsMCwxMDYsNCwwLDEyNCwxLDAsMTA2LDMsMCwxMzEsMSwwLDEsCi0gICAgMTAwLDUsMCw4Myw0MSw2LDEyMiw0Nyw4MywxMDUsMTA5LDExMiwxMDgsMTAxLDMyLDExNSwKLSAgICAxMTcsOTgsMTE1LDExNiwxMDUsMTE2LDExNywxMTYsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEwMiwxMTcsCi0gICAgMTEwLDk5LDExNiwxMTEsMTExLDEwOCwxMTUsNDYsMTE3LDExMiwxMDAsOTcsMTE2LDEwMSw5NSwxMTksCi0gICAgMTE0LDk3LDExMiwxMTIsMTAxLDExNCw0NiwyMTgsMTAsOTUsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsOTUsOTUsMjE4LDgsOTUsOTUsMTEwLDk3LDEwOSwxMDEsOTUsOTUsMjE4LDEyLDk1LAotICAgIDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksMTAxLDk1LDk1LDIxOCw3LDk1LDk1LDEwMCwKLSAgICAxMTEsOTksOTUsOTUsNzgsNDEsNSwyMTgsNywxMDQsOTcsMTE1LDk3LDExNiwxMTYsMTE0LAorICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQsMCwwLAorICAgIDAsNjQsMCwwLDAsMTE1LDIwMiwxLDAsMCwxMDAsMCw5MCwwLDEwMCwxLAorICAgIDk3LDEsMTAwLDIsMTAwLDMsMTMyLDAsOTAsMiwxMDAsNCwxMDAsNSwxMzIsMCwKKyAgICA5MCwzLDEwNSwwLDkwLDQsMTA1LDAsOTAsNSw3MSwwLDEwMCw2LDEwMCw3LAorICAgIDEzMiwwLDEwMCw3LDEwMSw2LDEzMSwzLDkwLDcsNzEsMCwxMDAsOCwxMDAsOSwKKyAgICAxMzIsMCwxMDAsOSwxMzEsMiw5MCw4LDcxLDAsMTAwLDEwLDEwMCwxMSwxMzIsMCwKKyAgICAxMDAsMTEsMTMxLDIsOTAsOSw3MSwwLDEwMCwxMiwxMDAsMTMsMTMyLDAsMTAwLDEzLAorICAgIDEzMSwyLDkwLDEwLDEwMCwxNCwxMDAsMTUsMTMyLDAsOTAsMTEsMTAwLDE2LDEwMCwxNywKKyAgICAxMzIsMCw5MCwxMiwxMDAsMTgsMTAwLDE5LDEzMiwwLDkwLDEzLDEwMCwyMCwxMDAsMjEsCisgICAgMTU2LDEsMTAwLDIyLDEwMCwyMywxMzIsMiw5MCwxNCwxMDAsMjQsMTAwLDI1LDEzMiwwLAorICAgIDkwLDE1LDEwMCwyNiwxMDAsMjcsMTMyLDAsOTAsMTYsMTAwLDI4LDEwMCwyOSwxMzIsMCwKKyAgICA5MCwxNywxMDAsMzAsMTAwLDMxLDEzMiwwLDkwLDE4LDcxLDAsMTAwLDMyLDEwMCwzMywKKyAgICAxMzIsMCwxMDAsMzMsMTMxLDIsOTAsMTksNzEsMCwxMDAsMzQsMTAwLDM1LDEzMiwwLAorICAgIDEwMCwzNSwxMzEsMiw5MCwyMCwxMDAsMSwxMDAsMSwxMDAsMzYsMTU2LDIsMTAwLDM3LAorICAgIDEwMCwzOCwxMzIsMiw5MCwyMSwxMDEsMjIsMTMxLDAsOTAsMjMsMTAwLDkyLDEwMCwzOSwKKyAgICAxMDAsNDAsMTMyLDEsOTAsMjQsMTAwLDQxLDEwMCw0MiwxNTYsMSwxMDAsNDMsMTAwLDQ0LAorICAgIDEzMiwyLDkwLDI1LDEwMCw0NSwxMDAsNDYsMTMyLDAsOTAsMjYsMTAwLDQ3LDEwMCw0OCwKKyAgICAxMzIsMCw5MCwyNywxMDAsNDksMTAwLDUwLDEzMiwwLDkwLDI4LDEwMCw1MSwxMDAsNTIsCisgICAgMTMyLDAsOTAsMjksMTAwLDUzLDEwMCw1NCwxMzIsMCw5MCwzMCwxMDAsNTUsMTAwLDU2LAorICAgIDEzMiwwLDkwLDMxLDcxLDAsMTAwLDU3LDEwMCw1OCwxMzIsMCwxMDAsNTgsMTMxLDIsCisgICAgOTAsMzIsNzEsMCwxMDAsNTksMTAwLDYwLDEzMiwwLDEwMCw2MCwxMzEsMiw5MCwzMywKKyAgICA3MSwwLDEwMCw2MSwxMDAsNjIsMTMyLDAsMTAwLDYyLDEzMSwyLDkwLDM0LDEwMCw2MywKKyAgICAxMDAsNjQsMTMyLDAsOTAsMzUsMTAwLDY1LDEwMCw2NiwxMzIsMCw5MCwzNiwxMDAsOTMsCisgICAgMTAwLDY3LDEwMCw2OCwxMzIsMSw5MCwzNywxMDAsNjksMTAwLDcwLDEzMiwwLDkwLDM4LAorICAgIDEwMCw3MSw5MCwzOSwxMDEsMzksMTAwLDcyLDIzLDAsOTAsNDAsMTAwLDczLDEwMCw3NCwKKyAgICAxMzIsMCw5MCw0MSwxMDAsNzUsMTAwLDc2LDEzMiwwLDkwLDQyLDEwMCw5NCwxMDAsNzgsCisgICAgMTAwLDc5LDEzMiwxLDkwLDQzLDEwMCw4MCwxMDAsODEsMTMyLDAsOTAsNDQsMTAwLDgyLAorICAgIDEwMCw4MywxMzIsMCw5MCw0NSwxMDAsMSwxMDAsMSwxMDIsMCwxMDAsNzcsMTAyLDQsCisgICAgMTAwLDg0LDEwMCw4NSwxMzIsMSw5MCw0NiwxMDAsODYsMTAwLDg3LDEzMiwwLDkwLDQ3LAorICAgIDEwMCw4OCwxMDAsODksMTMyLDAsOTAsNDgsMTAwLDkwLDEwMCw5MSwxMzIsMCw5MCw0OSwKKyAgICAxMDAsMSw4MywwLDQxLDk1LDk3LDgzLDEsMCwwLDY3LDExMSwxMTQsMTAxLDMyLAorICAgIDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsCisgICAgMTAyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDEwLDEwLDg0LDEwNCwxMDUsMTE1LDMyLAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsNzgsNzksODQsMzIsMTA5LDEwMSwKKyAgICA5NywxMTAsMTE2LDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsCisgICAgMTA4LDEyMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDMzLDMyLDczLDExNiwzMiwKKyAgICAxMDQsOTcsMTE1LDMyLDk4LDEwMSwxMDEsMTEwLDMyLDEwMCwxMDEsMTE1LDEwNSwxMDMsMTEwLDEwMSwKKyAgICAxMDAsMzIsMTE1LDExNyw5OSwxMDQsMTAsMTE2LDEwNCw5NywxMTYsMzIsMTA1LDExNiwzMiw5OSwKKyAgICA5NywxMTAsMzIsOTgsMTAxLDMyLDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiwxMTIsCisgICAgMTAxLDEwMCwzMiwxMDUsMTEwLDExNiwxMTEsMzIsODAsMTIxLDExNiwxMDQsMTExLDExMCwzMiw5NywKKyAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsCisgICAgMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsNDYsMzIsCisgICAgNjUsMTE1LDEwLDExNSwxMTcsOTksMTA0LDMyLDEwNSwxMTYsMzIsMTE0LDEwMSwxMTMsMTE3LDEwNSwKKyAgICAxMTQsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTEwLDEwNiwxMDEsOTksMTE2LDEwNSwxMTEsCisgICAgMTEwLDMyLDExMSwxMDIsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsOTksMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LAorICAgIDExNywxMTYsMTAxLDExNSwzMiwxMDUsMTEwLDMyLDExMSwxMTQsMTAwLDEwMSwxMTQsMzIsMTE2LDExMSwKKyAgICAxMCwxMTksMTExLDExNCwxMDcsNDYsMzIsNzksMTEwLDEwMSwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LAorICAgIDEwMCwzMiwxMTcsMTE1LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLAorICAgIDk3LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsMTE3LDk4LDEwOCwxMDUsOTksNDUsMTAyLDk3LAorICAgIDk5LDEwNSwxMTAsMTAzLDMyLDExOCwxMDEsMTE0LDExNSwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLAorICAgIDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCw3OCw5OSwKKyAgICAyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCw3LDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSw2MCwwLDAsMCwxMjAsNDAsMTAwLDYsNjgsMCw5MywKKyAgICAzMiwxMjUsMiwxMTYsMCwxMjQsMSwxMjQsMiwxMzEsMiwxMTQsNiwxMTYsMSwxMjQsCisgICAgMCwxMjQsMiwxMTYsMiwxMjQsMSwxMjQsMiwxMzEsMiwxMzEsMywxLDAsMTEzLAorICAgIDYsODcsMCwxMjQsMCwxMDYsMywxMDYsNCwxMjQsMSwxMDYsMywxMzEsMSwxLAorICAgIDAsMTAwLDUsODMsMCw0MSw3LDEyMiw0Nyw4MywxMDUsMTA5LDExMiwxMDgsMTAxLDMyLAorICAgIDExNSwxMTcsOTgsMTE1LDExNiwxMDUsMTE2LDExNywxMTYsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEwMiwKKyAgICAxMTcsMTEwLDk5LDExNiwxMTEsMTExLDEwOCwxMTUsNDYsMTE3LDExMiwxMDAsOTcsMTE2LDEwMSw5NSwKKyAgICAxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw0NiwyMTgsMTAsOTUsOTUsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsOTUsOTUsMjE4LDgsOTUsOTUsMTEwLDk3LDEwOSwxMDEsOTUsOTUsMjE4LDEyLAorICAgIDk1LDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksMTAxLDk1LDk1LDIxOCw3LDk1LDk1LAorICAgIDEwMCwxMTEsOTksOTUsOTUsNzgsNDEsNCwxMjIsMTAsOTUsOTUsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsOTUsOTUsMTIyLDgsOTUsOTUsMTEwLDk3LDEwOSwxMDEsOTUsOTUsMTIyLDEyLAorICAgIDk1LDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksMTAxLDk1LDk1LDEyMiw3LDk1LDk1LAorICAgIDEwMCwxMTEsOTksOTUsOTUsNDEsNSwyMTgsNywxMDQsOTcsMTE1LDk3LDExNiwxMTYsMTE0LAogICAgIDIxOCw3LDExNSwxMDEsMTE2LDk3LDExNiwxMTYsMTE0LDIxOCw3LDEwMywxMDEsMTE2LDk3LDExNiwKICAgICAxMTYsMTE0LDIxOCw4LDk1LDk1LDEwMCwxMDUsOTksMTE2LDk1LDk1LDIxOCw2LDExNywxMTIsCiAgICAgMTAwLDk3LDExNiwxMDEsNDEsMyw5MCwzLDExMCwxMDEsMTE5LDkwLDMsMTExLDEwOCwxMDAsCkBAIC04NywxOTAzICs3NCwxNzUzIEBACiAgICAgMjUwLDI5LDYwLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAogICAgIDEwOCwxMDUsOTgsNDYsOTUsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDYyLDIxOCwKICAgICA1LDk1LDExOSwxMTQsOTcsMTEyLDI3LDAsMCwwLDExNSw4LDAsMCwwLDAsCi0gICAgMiwyNSwxLDE1LDEsMjksMSwxMTQsMTIsMCwwLDAsOTksMSwwLDAsCisgICAgMiwxMCwxLDEwLDEsMjIsMSwxMTQsMTIsMCwwLDAsOTksMSwwLDAsCiAgICAgMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMTYsMCwwLDAsMTE2LDAsMCwxMTYsMSwwLDEzMSwxLDAsMTI0LAotICAgIDAsMCwxMzEsMSwwLDgzLDQxLDEsNzgsNDEsMiwyMTgsNCwxMTYsMTIxLDExMiwKLSAgICAxMDEsMjE4LDMsMTE1LDEyMSwxMTUsNDEsMSwyMTgsNCwxMTAsOTcsMTA5LDEwMSwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTEsOTUsCi0gICAgMTEwLDEwMSwxMTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzUsMCwwLDAsMTE1LDIsCi0gICAgMCwwLDAsMCwxLDExNCwxNiwwLDAsMCw5OSwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLDExNSwKLSAgICA1OCwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwKLSAgICAxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCw5MCwKLSAgICA0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLDEwMCw2LAotICAgIDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOCwwLDgzLDQxLDksCi0gICAgMjE4LDEzLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCwxMjIsCi0gICAgNjMsNzcsOTcsMTEwLDk3LDEwMywxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiwxMTEsMTE1LAotICAgIDExNSwxMDUsOTgsMTA4LDEwMSwzMiw5OSwxMDgsMTAxLDk3LDExMCw0NSwxMTcsMTEyLDMyLDExMSwKLSAgICAxMDIsMzIsMTE1LDEyMSwxMTUsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwMiwxMTEsCi0gICAgMTE0LDMyLDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDQ2LAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDEzLDAsMCwwLDEyNCwxLDAsMTI0LDAsMCwKLSAgICA5NSwwLDAsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDEsMjE4LDUsOTUsMTEwLAotICAgIDk3LDEwOSwxMDEsNDEsMiwyMTgsNCwxMTUsMTAxLDEwOCwxMDIsMTE0LDE1LDAsMCwwLAotICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwKLSAgICA4LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0MywwLDAsMCwxMTUsMiwwLAotICAgIDAsMCwwLDEsMTIyLDIyLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsCi0gICAgMTExLDk3LDEwMCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMjUsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDExNiwxLDAsMTA2LAotICAgIDIsMCwxMDcsNiwwLDEyNCwwLDAsOTUsMywwLDEwMCwwLDAsODMsNDEsCi0gICAgMSw3OCw0MSw0LDExNCwxOCwwLDAsMCwxMTQsMTQsMCwwLDAsMjE4LDcsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDIxOCwxMCw5NSwxMDUsMTE1LDk1LDExNCwxMDEsMTA4LAotICAgIDExMSw5NywxMDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDksOTUsOTUsMTAxLDExMCwxMTYsCi0gICAgMTAxLDExNCw5NSw5NSw0NiwwLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLAotICAgIDIzLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCw0Niw5NSwKLSAgICA5NSwxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwyLDAsMCwwLDExLDAsMCwwLDcxLDAsMCwwLDExNSw3NywwLAotICAgIDAsMCwxMTYsMCwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDEyNCwxLAotICAgIDAsNjgsMTMxLDEsMCwxMzEsMSwwLDExNCw3MywwLDEyNCwwLDAsMTA2LDEsCi0gICAgMCwxMiwxMTQsNzMsMCwxMjEsMTcsMCwxMTYsMiwwLDEwNiwzLDAsMTI0LDAsCi0gICAgMCwxMDYsNCwwLDYxLDg3LDExMCwxOCwwLDQsMTE2LDUsMCwxMDcsMTAsMCwKLSAgICAxMTQsNzIsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDEwMCwwLDAsODMsNDEsCi0gICAgMyw3OCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLAotICAgIDAsMCwwLDExNSwwLDAsMCwxMTUsMjcsMCwwLDAsMTI0LDAsMCw5MywKLSAgICAxNywwLDEyNSwxLDAsMTI0LDEsMCwxMDAsMCwwLDEwNyw5LDAsODYsMSwKLSAgICAxMTMsMywwLDEwMCwwLDAsODMsNDEsMSw3OCwxMTQsMTAsMCwwLDAsNDEsCi0gICAgMiwyMTgsMiw0Niw0OCwyMTgsMyw5NywxMTQsMTAzLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDI1MCw5LDYwLDEwMywxMDEsMTEwLDEwMSwKLSAgICAxMjAsMTEyLDExNCw2Miw1MCwwLDAsMCwxMTUsMiwwLDAsMCw2LDAsMTIyLAotICAgIDQxLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCw0Niw5NSwKLSAgICA5NSwxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLAotICAgIDQ2LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2Miw0MSw2LDIxOCwzLDk3LDExMCwKLSAgICAxMjEsMTE0LDIyLDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsCi0gICAgMTE0LDE4LDAsMCwwLDIxOCw4LDc1LDEwMSwxMjEsNjksMTE0LDExNCwxMTEsMTE0LDQxLAotICAgIDIsMTE0LDE5LDAsMCwwLDIxOCw0LDk3LDExNCwxMDMsMTE1LDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCw4LDk1LDk1LDEwMSwKLSAgICAxMjAsMTA1LDExNiw5NSw5NSw0OSwwLDAsMCwxMTUsMTAsMCwwLDAsMCwxLAotICAgIDM1LDEsMywxLDE3LDEsMTMsMSwxMjIsMjIsOTUsNzcsOTcsMTEwLDk3LDEwMywKLSAgICAxMDEsODIsMTAxLDEwOCwxMTEsOTcsMTAwLDQ2LDk1LDk1LDEwMSwxMjAsMTA1LDExNiw5NSw5NSwKLSAgICA3OCw0MSw3LDExNCwxLDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsCi0gICAgMCwwLDExNCwzLDAsMCwwLDExNCwyMCwwLDAsMCwxMTQsMjMsMCwwLAotICAgIDAsMTE0LDMwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTcsMCwwLDAsMzksCi0gICAgMCwwLDAsMTE1LDgsMCwwLDAsMTIsMiw2LDIsMTIsMywxMiwzLAotICAgIDExNCwxNywwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDY0LDAsMCwwLDExNSwxNiwwLDAsMCwxMDEsCi0gICAgMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDgzLDQxLAotICAgIDIsMjE4LDE0LDk1LDY4LDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsNjksMTE0LDExNCwxMTEsCi0gICAgMTE0LDc4LDQxLDMsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDExNCwzMSwwLDAsMCw2NCwwLDAsMCwKLSAgICAxMTUsMiwwLDAsMCwxMiwxLDExNCwzMSwwLDAsMCw5OSwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwKLSAgICAwLDExNSw4MiwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLAotICAgIDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsCi0gICAgMCw5MCw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLAotICAgIDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOCwwLDEwMCwKLSAgICA5LDAsMTMyLDAsMCw5MCw3LDAsMTAwLDEwLDAsMTAwLDExLDAsMTMyLDAsCi0gICAgMCw5MCw4LDAsMTAwLDEyLDAsODMsNDEsMTMsMjE4LDExLDk1LDc3LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywxMjIsMTY5LDY1LDMyLDExNCwxMDEsOTksMTE3LDExNCwKLSAgICAxMTUsMTA1LDExOCwxMDEsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksCi0gICAgMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMDUsCi0gICAgMTE1LDMyLDk3LDk4LDEwOCwxMDEsMzIsMTE2LDExMSwzMiwxMDAsMTAxLDExNiwxMDEsOTksMTE2LAotICAgIDMyLDEwMCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LDExNSwxMCwzMiwzMiwzMiwzMiw0MCwKLSAgICAxMDEsNDYsMTAzLDQ2LDMyLDExNiwxMDQsMTE0LDEwMSw5NywxMDAsMzIsNDksMzIsMTE2LDExNCwKLSAgICAxMjEsMTA1LDExMCwxMDMsMzIsMTE2LDExMSwzMiwxMTYsOTcsMTA3LDEwMSwzMiwxMDgsMTExLDk5LAotICAgIDEwNywxMTUsMzIsNjUsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDY2LDQ0LDMyLDk3LDExMCwxMDAsCi0gICAgMzIsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCwzMiw1MCwzMiwxMTYsMTE0LDEyMSwxMDUsMTEwLDEwMywKLSAgICAzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDExNiw5NywxMDcsMTAxLDMyLDEwOCwxMTEsOTksCi0gICAgMTA3LDExNSwzMiw2NiwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsNjUsNDEsNDYsMTAsMzIsMzIsCi0gICAgMzIsMzIsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsNzAsMCwwLDAsMTE2LDAsMCwxMDYsCi0gICAgMSwwLDEzMSwwLDAsMTI0LDAsMCw5NSwyLDAsMTE2LDAsMCwxMDYsMSwKLSAgICAwLDEzMSwwLDAsMTI0LDAsMCw5NSwzLDAsMTI0LDEsMCwxMjQsMCwwLAotICAgIDk1LDQsMCwxMDAsMCwwLDEyNCwwLDAsOTUsNSwwLDEwMCwxLDAsMTI0LAotICAgIDAsMCw5NSw2LDAsMTAwLDEsMCwxMjQsMCwwLDk1LDcsMCwxMDAsMCwKLSAgICAwLDgzLDQxLDIsNzgsMjMzLDAsMCwwLDAsNDEsOCwyMTgsNyw5NSwxMTYsCi0gICAgMTA0LDExNCwxMDEsOTcsMTAwLDkwLDEzLDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMDEsOTUsCi0gICAgMTA4LDExMSw5OSwxMDcsMjE4LDQsMTA4LDExMSw5OSwxMDcsMjE4LDYsMTE5LDk3LDEwNywxMDEsCi0gICAgMTE3LDExMiwxMTQsMTUsMCwwLDAsMjE4LDUsMTExLDExOSwxMTAsMTAxLDExNCwyMTgsNSwKLSAgICA5OSwxMTEsMTE3LDExMCwxMTYsMjE4LDcsMTE5LDk3LDEwNSwxMTYsMTAxLDExNCwxMTUsNDEsMiwKLSAgICAxMTQsMTksMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwyMCwwLDAsMCw3NCwwLAotICAgIDAsMCwxMTUsMTIsMCwwLDAsMCwxLDE1LDEsMTUsMSw5LDEsOSwKLSAgICAxLDksMSwxMjIsMjAsOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LAotICAgIDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwxLDAsMCwwLDAsMCwKLSAgICAwLDAsNCwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSw4OCwKLSAgICAwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTMxLDAsMCwxMjUsMSwwLDEyNCwKLSAgICAwLDAsMTA2LDIsMCwxMjUsMiwwLDEyMCw2MCwwLDExNiwzLDAsMTA2LDQsCi0gICAgMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwxMjQsMywwLDEwMCwwLDAsCi0gICAgMTA3LDgsMCwxMTQsNTUsMCwxMDAsMSwwLDgzLDEyNCwzLDAsMTA2LDIsMCwKLSAgICAxMjUsMiwwLDEyNCwyLDAsMTI0LDEsMCwxMDcsMiwwLDExNCwyNCwwLDEwMCwKLSAgICAyLDAsODMsMTEzLDI0LDAsODcsMTAwLDAsMCw4Myw0MSwzLDc4LDcwLDg0LAotICAgIDQxLDUsMTE0LDM0LDAsMCwwLDIxOCw5LDEwMywxMDEsMTE2LDk1LDEwNSwxMDAsMTAxLAotICAgIDExMCwxMTYsMTE0LDM3LDAsMCwwLDIxOCwxMiw5NSw5OCwxMDgsMTExLDk5LDEwNywxMDUsCi0gICAgMTEwLDEwMyw5NSwxMTEsMTEwLDIxOCwzLDEwMywxMDEsMTE2LDQxLDQsMTE0LDE5LDAsMCwKLSAgICAwLDkwLDIsMTA5LDEwMSwyMTgsMywxMTYsMTA1LDEwMCwxMTQsMzUsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEyLAotICAgIDEwNCw5NywxMTUsOTUsMTAwLDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsODIsMCwwLDAsCi0gICAgMTE1LDE4LDAsMCwwLDAsMiwxMiwxLDksMSwzLDEsMTUsMSwxMiwKLSAgICAxLDQsMSw5LDEsMTIsMSwxMjIsMjQsOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA3NiwxMTEsOTksMTA3LDQ2LDEwNCw5NywxMTUsOTUsMTAwLDEwMSw5NywxMDAsMTA4LDExMSw5OSwKLSAgICAxMDcsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMTYsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDIxMCwwLDAsMCwxMTYsMCwwLDEwNiwxLAotICAgIDAsMTMxLDAsMCwxMjUsMSwwLDEyNCwwLDAsMTE2LDIsMCwxMjQsMSwwLAotICAgIDYwLDEyMiwxNzMsMCwxMjAsMTY2LDAsMTI0LDAsMCwxMDYsMywwLDE0MywxMjQsMCwKLSAgICAxLDEyNCwwLDAsMTA2LDQsMCwxMDAsMSwwLDEwNywyLDAsMTE1LDY4LDAsCi0gICAgMTI0LDAsMCwxMDYsNSwwLDEyNCwxLDAsMTA3LDIsMCwxMTQsOTYsMCwxMjQsCi0gICAgMSwwLDEyNCwwLDAsOTUsNSwwLDEyNCwwLDAsNCwxMDYsNCwwLDEwMCwKLSAgICAyLDAsNTUsMiw5NSw0LDAsMTAwLDMsMCw4MywxMjQsMCwwLDEwNiw2LAotICAgIDAsMTMxLDAsMCwxMTQsMTI0LDAsMTE2LDcsMCwxMDAsNCwwLDEyNCwwLDAsCi0gICAgMjIsMTMxLDEsMCwxMzAsMSwwLDEyNCwwLDAsMTA2LDgsMCwxMDYsOSwwLAotICAgIDEwMCw1LDAsMTMxLDEsMCwxMTQsMTU3LDAsMTI0LDAsMCw0LDEwNiwxMCwwLAotICAgIDEwMCwyLDAsNTUsMiw5NSwxMCwwLDg3LDEwMCw2LDAsODEsODIsODgsMTI0LAotICAgIDAsMCwxMDYsOCwwLDEwNiw5LDAsMTMxLDAsMCwxLDEyNCwwLDAsMTA2LAotICAgIDgsMCwxMDYsMTEsMCwxMzEsMCwwLDEsMTEzLDI4LDAsODcsODcsMTAwLDYsCi0gICAgMCwxMTYsMiwwLDEyNCwxLDAsNjEsODgsMTAwLDYsMCw4Myw0MSw3LDEyMiwKLSAgICAxODUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNjUsOTksMTEzLDExNywxMDUsMTE0LAotICAgIDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDgsMTExLDk5LAotICAgIDEwNyw0NiwzMiwzMiw3MywxMDIsMzIsOTcsMzIsMTEyLDExMSwxMTYsMTAxLDExMCwxMTYsMTA1LAotICAgIDk3LDEwOCwzMiwxMDAsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNywzMiwxMDUsMTE1LDMyLDEwMCwKLSAgICAxMDEsMTE2LDEwMSw5OSwxMTYsMTAxLDEwMCw0NCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiw5NywzMiw5NSw2OCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LDY5LDExNCwxMTQsMTExLAotICAgIDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsNzksMTE2LDEwNCwxMDEsMTE0LDExOSwxMDUsMTE1LDEwMSw0NCwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk5LDEwNywzMiwxMDUsMTE1LDMyLDk3LDEwOCwxMTksOTcsCi0gICAgMTIxLDExNSwzMiw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDEwMCwzMiw5NywxMTAsMTAwLDMyLAotICAgIDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMTUsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTAxLDEwMCwKLSAgICA0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMzMsMCwwLDAsMjMzLAotICAgIDEsMCwwLDAsODQsMTIyLDIzLDEwMCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LDMyLAotICAgIDEwMCwxMDEsMTE2LDEwMSw5OSwxMTYsMTAxLDEwMCwzMiw5OCwxMjEsMzIsMzcsMTE0LDcwLDc4LAotICAgIDQxLDEyLDExNCwzNCwwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDQxLDAsMCwKLSAgICAwLDExNCwzNSwwLDAsMCwxMTQsMzgsMCwwLDAsMTE0LDM3LDAsMCwwLAotICAgIDExNCw0NCwwLDAsMCwxMTQsMzEsMCwwLDAsMTE0LDM2LDAsMCwwLDIxOCwKLSAgICA3LDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsMTE0LDM5LDAsMCwwLDIxOCw3LDExNCwKLSAgICAxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDQxLDIsMTE0LDE5LDAsMCwwLDExNCw0MywwLAorICAgIDAsMTE1LDEyLDAsMCwwLDExNiwwLDExNiwxLDEzMSwxLDEyNCwwLDEzMSwxLAorICAgIDgzLDAsNDEsMSw3OCw0MSwyLDIxOCw0LDExNiwxMjEsMTEyLDEwMSwyMTgsMywxMTUsCisgICAgMTIxLDExNSw0MSwxLDIxOCw0LDExMCw5NywxMDksMTAxLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMSw5NSwxMTAsMTAxLDExOSw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzNSwwLDAsMCwxMTUsMiwwLDAsMCwwLAorICAgIDEsMTE0LDE2LDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDEsMCwwLDAsNjQsMCwwLDAsMTE1LDEyLDAsMCwwLAorICAgIDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw4MywwLDQxLDIsMjE4LDE0LAorICAgIDk1LDY4LDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsNjksMTE0LDExNCwxMTEsMTE0LDc4LDQxLAorICAgIDMsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLDAsCisgICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDExLDAsMCwwLDExNCwxNywwLDAsMCw0NywwLDAsMCwxMTUsMiwwLAorICAgIDAsMCw4LDEsMTE0LDE3LDAsMCwwLDk5LDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLDAsMTE1LDU2LAorICAgIDAsMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwKKyAgICAyLDEwMCwzLDEzMiwwLDkwLDQsMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwxMDAsCisgICAgNiwxMDAsNywxMzIsMCw5MCw2LDEwMCw4LDEwMCw5LDEzMiwwLDkwLDcsMTAwLAorICAgIDEwLDEwMCwxMSwxMzIsMCw5MCw4LDEwMCwxMiw4MywwLDQxLDEzLDIxOCwxMSw5NSwKKyAgICA3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsMTIyLDE2OSw2NSwzMiwxMTQsMTAxLAorICAgIDk5LDExNywxMTQsMTE1LDEwNSwxMTgsMTAxLDMyLDEwOCwxMTEsOTksMTA3LDMyLDEwNSwxMDksMTEyLAorICAgIDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTksMTA0LDEwNSw5OSwKKyAgICAxMDQsMzIsMTA1LDExNSwzMiw5Nyw5OCwxMDgsMTAxLDMyLDExNiwxMTEsMzIsMTAwLDEwMSwxMTYsCisgICAgMTAxLDk5LDExNiwzMiwxMDAsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNywxMTUsMTAsMzIsMzIsCisgICAgMzIsMzIsNDAsMTAxLDQ2LDEwMyw0NiwzMiwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDMyLDQ5LAorICAgIDMyLDExNiwxMTQsMTIxLDEwNSwxMTAsMTAzLDMyLDExNiwxMTEsMzIsMTE2LDk3LDEwNywxMDEsMzIsCisgICAgMTA4LDExMSw5OSwxMDcsMTE1LDMyLDY1LDMyLDExNiwxMDQsMTAxLDExMCwzMiw2Niw0NCwzMiwKKyAgICA5NywxMTAsMTAwLDMyLDExNiwxMDQsMTE0LDEwMSw5NywxMDAsMzIsNTAsMzIsMTE2LDExNCwxMjEsCisgICAgMTA1LDExMCwxMDMsMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMTYsOTcsMTA3LDEwMSwzMiwKKyAgICAxMDgsMTExLDk5LDEwNywxMTUsMzIsNjYsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDY1LDQxLDQ2LAorICAgIDEwLDMyLDMyLDMyLDMyLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDQ4LDAsMCwwLDExNiwKKyAgICAwLDEwNiwxLDEzMSwwLDEyNCwwLDk1LDIsMTE2LDAsMTA2LDEsMTMxLDAsMTI0LAorICAgIDAsOTUsMywxMjQsMSwxMjQsMCw5NSw0LDEwMCwwLDEyNCwwLDk1LDUsMTAwLAorICAgIDEsMTI0LDAsOTUsNiwxMDAsMSwxMjQsMCw5NSw3LDEwMCwwLDgzLDAsNDEsCisgICAgMiw3OCwyMzMsMCwwLDAsMCw0MSw4LDIxOCw3LDk1LDExNiwxMDQsMTE0LDEwMSwKKyAgICA5NywxMDAsOTAsMTMsOTcsMTA4LDEwOCwxMTEsOTksOTcsMTE2LDEwMSw5NSwxMDgsMTExLDk5LAorICAgIDEwNywyMTgsNCwxMDgsMTExLDk5LDEwNywyMTgsNiwxMTksOTcsMTA3LDEwMSwxMTcsMTEyLDExNCwKKyAgICAxNSwwLDAsMCwyMTgsNSwxMTEsMTE5LDExMCwxMDEsMTE0LDIxOCw1LDk5LDExMSwxMTcsCisgICAgMTEwLDExNiwyMTgsNywxMTksOTcsMTA1LDExNiwxMDEsMTE0LDExNSw0MSwyLDIxOCw0LDExNSwKKyAgICAxMDEsMTA4LDEwMiwxMTQsMTUsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMjE4LDgsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LAorICAgIDk1LDU3LDAsMCwwLDExNSwxMiwwLDAsMCwwLDEsMTAsMSwxMCwxLAorICAgIDYsMSw2LDEsNiwxLDEyMiwyMCw5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LAorICAgIDExMSw5OSwxMDcsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLAorICAgIDAsMCwwLDAsMCw0LDAsMCwwLDIsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDY0LDAsMCwwLDExNiwwLDEwNiwxLDEzMSwwLDEyNSwxLDEyNCwwLAorICAgIDEwNiwyLDEyNSwyLDEyMCw0NCwxMTYsMywxMDYsNCwxMjQsMiwxMzEsMSwxMjUsMywKKyAgICAxMjQsMywxMDAsMCwxMDcsOCwxMTQsMzgsMTAwLDEsODMsMCwxMjQsMywxMDYsMiwKKyAgICAxMjUsMiwxMjQsMiwxMjQsMSwxMDcsMiwxMTQsMTYsMTAwLDIsODMsMCwxMTMsMTYsCisgICAgODcsMCwxMDAsMCw4MywwLDQxLDMsNzgsNzAsODQsNDEsNSwxMTQsMjAsMCwKKyAgICAwLDAsMjE4LDksMTAzLDEwMSwxMTYsOTUsMTA1LDEwMCwxMDEsMTEwLDExNiwxMTQsMjMsMCwKKyAgICAwLDAsMjE4LDEyLDk1LDk4LDEwOCwxMTEsOTksMTA3LDEwNSwxMTAsMTAzLDk1LDExMSwxMTAsCisgICAgMjE4LDMsMTAzLDEwMSwxMTYsNDEsNCwxMTQsMjYsMCwwLDAsOTAsMiwxMDksMTAxLAorICAgIDIxOCwzLDExNiwxMDUsMTAwLDExNCwyMSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTIsMTA0LDk3LDExNSw5NSwxMDAsCisgICAgMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNyw2NSwwLDAsMCwxMTUsMTgsMCwwLDAsCisgICAgMCwyLDgsMSw2LDEsMiwxLDEwLDEsOCwxLDQsMSw2LDEsCisgICAgOCwxLDEyMiwyNCw5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsCisgICAgMTA0LDk3LDExNSw5NSwxMDAsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNyw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwxNiwwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsMTY4LDAsMCwwLDExNiwwLDEwNiwxLDEzMSwwLDEyNSwxLDEyNCwwLAorICAgIDExNiwyLDEyNCwxLDYwLDAsMTIyLDEzOCwxMjAsMTMyLDEyNCwwLDEwNiwzLDE0Myw5NiwKKyAgICAxLDAsMTI0LDAsMTA2LDQsMTAwLDEsMTA3LDIsMTE1LDQ4LDEyNCwwLDEwNiw1LAorICAgIDEyNCwxLDEwNywyLDExNCw3MiwxMjQsMSwxMjQsMCw5NSw1LDEyNCwwLDQsMCwKKyAgICAxMDYsNCwxMDAsMiw1NSwwLDIsMCw5NSw0LDEwMCwzLDgzLDAsMTI0LDAsCisgICAgMTA2LDYsMTMxLDAsMTE0LDkyLDExNiw3LDEwMCw0LDEyNCwwLDIyLDAsMTMxLDEsCisgICAgMTMwLDEsMTI0LDAsMTA2LDgsMTA2LDksMTAwLDUsMTMxLDEsMTE0LDExOCwxMjQsMCwKKyAgICA0LDAsMTA2LDEwLDEwMCwyLDU1LDAsMiwwLDk1LDEwLDg3LDAsMTAwLDYsCisgICAgODEsMCw4MiwwLDg4LDAsMTI0LDAsMTA2LDgsMTA2LDksMTMxLDAsMSwwLAorICAgIDEyNCwwLDEwNiw4LDEwNiwxMSwxMzEsMCwxLDAsMTEzLDIwLDg3LDAsODcsMCwKKyAgICAxMDAsNiwxMTYsMiwxMjQsMSw2MSwwLDg4LDAsMTAwLDYsODMsMCw0MSw3LAorICAgIDEyMiwxODUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNjUsOTksMTEzLDExNywxMDUsCisgICAgMTE0LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDgsMTExLAorICAgIDk5LDEwNyw0NiwzMiwzMiw3MywxMDIsMzIsOTcsMzIsMTEyLDExMSwxMTYsMTAxLDExMCwxMTYsCisgICAgMTA1LDk3LDEwOCwzMiwxMDAsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNywzMiwxMDUsMTE1LDMyLAorICAgIDEwMCwxMDEsMTE2LDEwMSw5OSwxMTYsMTAxLDEwMCw0NCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiw5NywzMiw5NSw2OCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LDY5LDExNCwxMTQsCisgICAgMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsNzksMTE2LDEwNCwxMDEsMTE0LDExOSwxMDUsMTE1LDEwMSw0NCwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk5LDEwNywzMiwxMDUsMTE1LDMyLDk3LDEwOCwxMTksCisgICAgOTcsMTIxLDExNSwzMiw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDEwMCwzMiw5NywxMTAsMTAwLAorICAgIDMyLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMTUsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTAxLAorICAgIDEwMCw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMTksMCwwLDAsCisgICAgMjMzLDEsMCwwLDAsODQsMTIyLDIzLDEwMCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LAorICAgIDMyLDEwMCwxMDEsMTE2LDEwMSw5OSwxMTYsMTAxLDEwMCwzMiw5OCwxMjEsMzIsMzcsMTE0LDcwLAorICAgIDc4LDQxLDEyLDExNCwyMCwwLDAsMCwxMTQsMjgsMCwwLDAsMTE0LDI5LDAsCisgICAgMCwwLDExNCwyMSwwLDAsMCwxMTQsMjQsMCwwLDAsMTE0LDIzLDAsMCwKKyAgICAwLDExNCwzMiwwLDAsMCwxMTQsMTcsMCwwLDAsMTE0LDIyLDAsMCwwLAorICAgIDIxOCw3LDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsMTE0LDI1LDAsMCwwLDIxOCw3LAorICAgIDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDQxLDIsMTE0LDI2LDAsMCwwLDExNCwzMSwKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAorICAgIDAsMCwxMTQsMzQsMCwwLDAsNzcsMCwwLDAsMTE1LDMyLDAsMCwwLAorICAgIDAsNiw4LDEsOCwxLDIsMSwyLDEsOCwxLDIwLDEsNiwxLAorICAgIDE0LDEsNCwxLDgsMSwxMiwxLDEyLDEsMjQsMiwxMCwxLDE4LDIsCisgICAgMTIyLDE5LDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0Niw5Nyw5OSwKKyAgICAxMTMsMTE3LDEwNSwxMTQsMTAxLDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDEwLDAsMCwwLDY3LDAsMCwwLDExNSwxMjIsMCwwLDAsMTE2LAorICAgIDAsMTA2LDEsMTMxLDAsMTI1LDEsMTI0LDAsMTA2LDIsMTQzLDk4LDEsMCwxMjQsCisgICAgMCwxMDYsMywxMjQsMSwxMDcsMywxMTQsMzQsMTE2LDQsMTAwLDEsMTMxLDEsMTMwLAorICAgIDEsMTI0LDAsMTA2LDUsMTAwLDIsMTA3LDQsMTE1LDQ4LDExNiw2LDEzMCwxLDEyNCwKKyAgICAwLDQsMCwxMDYsNSwxMDAsMyw1NiwwLDIsMCw5NSw1LDEyNCwwLDEwNiwKKyAgICA1LDEwMCwyLDEwNywyLDExNCwxMDgsMTAwLDAsMTI0LDAsOTUsMywxMjQsMCwxMDYsCisgICAgNywxMTQsMTA4LDEyNCwwLDQsMCwxMDYsNywxMDAsMyw1NiwwLDIsMCw5NSwKKyAgICA3LDEyNCwwLDEwNiw4LDEwNiw5LDEzMSwwLDEsMCw4NywwLDEwMCwwLDgxLAorICAgIDAsODIsMCw4OCwwLDEwMCwwLDgzLDAsNDEsNCw3OCwxMjIsMzEsOTksOTcsCisgICAgMTEwLDExMCwxMTEsMTE2LDMyLDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDMyLDExNywxMTAsNDUsCisgICAgOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSwxMDAsMzIsMTA4LDExMSw5OSwxMDcsMTE0LDE5LDAsCisgICAgMCwwLDExNCwzMywwLDAsMCw0MSwxMCwxMTQsMjAsMCwwLDAsMTE0LDI4LAorICAgIDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsMjMsMCwwLDAsMjE4LDEyLDgyLAorICAgIDExNywxMTAsMTE2LDEwNSwxMDksMTAxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsMjQsMCwwLDAsCisgICAgMjE4LDE0LDY1LDExNSwxMTUsMTAxLDExNCwxMTYsMTA1LDExMSwxMTAsNjksMTE0LDExNCwxMTEsMTE0LAorICAgIDExNCwyNSwwLDAsMCwxMTQsMjIsMCwwLDAsMTE0LDM1LDAsMCwwLDQxLAorICAgIDIsMTE0LDI2LDAsMCwwLDExNCwzMSwwLDAsMCwxMTQsMTAsMCwwLDAsCisgICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzUsMCwwLDAsMTAyLAorICAgIDAsMCwwLDExNSwyMiwwLDAsMCwwLDEsOCwxLDgsMSwxMCwxLAorICAgIDgsMSwxNCwxLDE0LDEsMTAsMSw2LDEsNiwxLDE0LDEsMTIyLDE5LAorICAgIDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0NiwxMTQsMTAxLDEwOCwxMDEsCisgICAgOTcsMTE1LDEwMSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKyAgICA0LDAsMCwwLDY3LDAsMCwwLDExNSwxOCwwLDAsMCwxMDAsMSwxMDYsCisgICAgMCwxMjQsMCwxMDYsMSwxMTYsMiwxMjQsMCwxMzEsMSwxMzEsMiw4MywwLDQxLAorICAgIDIsNzgsMTIyLDIzLDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0MCwKKyAgICAxMjMsMzMsMTE0LDEyNSw0MSwzMiw5NywxMTYsMzIsMTIzLDEyNSw0MSwzLDIxOCw2LDEwMiwKKyAgICAxMTEsMTE0LDEwOSw5NywxMTYsMTE0LDE1LDAsMCwwLDIxOCwyLDEwNSwxMDAsNDEsMSwKKyAgICAxMTQsMjYsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMjE4LDgsOTUsOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDExNSwwLAorICAgIDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDIwLDk1LDc3LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0Niw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsNzgsCisgICAgNDEsOSwxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsCisgICAgMCwxMTQsMywwLDAsMCwxMTQsMjcsMCwwLDAsMTE0LDMyLDAsMCwwLAorICAgIDExNCwzNCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDQwLDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwKKyAgICAwLDAsMCwxMTQsMTgsMCwwLDAsNTEsMCwwLDAsMTE1LDEyLDAsMCwKKyAgICAwLDgsNCw0LDIsOCw4LDgsMTIsOCwyNSw4LDEzLDExNCwxOCwwLAorICAgIDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLAorICAgIDAsMCwwLDY0LDAsMCwwLDExNSw0OCwwLDAsMCwxMDEsMCw5MCwxLAorICAgIDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDAsMiwxMDAsMywxMzIsMCw5MCw0LAorICAgIDEwMCw0LDEwMCw1LDEzMiwwLDkwLDUsMTAwLDYsMTAwLDcsMTMyLDAsOTAsNiwKKyAgICAxMDAsOCwxMDAsOSwxMzIsMCw5MCw3LDEwMCwxMCw4MywwLDQxLDExLDIxOCwxNiwKKyAgICA5NSw2OCwxMTcsMTA5LDEwOSwxMjEsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LAorICAgIDEyMiw4Niw2NSwzMiwxMTUsMTA1LDEwOSwxMTIsMTA4LDEwMSwzMiw5NSw3NywxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDc2LDExMSw5OSwxMDcsMzIsMTAxLDExMywxMTcsMTA1LDExOCw5NywxMDgsMTAxLDExMCwKKyAgICAxMTYsMzIsMTAyLDExMSwxMTQsMzIsODAsMTIxLDExNiwxMDQsMTExLDExMCwzMiw5OCwxMTcsMTA1LAorICAgIDEwOCwxMDAsMTE1LDMyLDExOSwxMDUsMTE2LDEwNCwxMTEsMTE3LDExNiwxMCwzMiwzMiwzMiwzMiwKKyAgICAxMDksMTE3LDEwOCwxMTYsMTA1LDQ1LDExNiwxMDQsMTE0LDEwMSw5NywxMDAsMTA1LDExMCwxMDMsMzIsCisgICAgMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDQ2LDk5LDIsMCwwLDAsMCwwLDAsCisgICAgMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LDAsCisgICAgMCwwLDEyNCwxLDEyNCwwLDk1LDAsMTAwLDEsMTI0LDAsOTUsMSwxMDAsMCwKKyAgICA4MywwLDQxLDIsNzgsMTE0LDE5LDAsMCwwLDQxLDIsMTE0LDE1LDAsMCwKKyAgICAwLDExNCwyNCwwLDAsMCw0MSwyLDExNCwyNiwwLDAsMCwxMTQsMTUsMCwKICAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAotICAgIDAsMTE0LDQ2LDAsMCwwLDk0LDAsMCwwLDExNSwzMiwwLDAsMCwwLAotICAgIDYsMTIsMSwxMCwxLDMsMSwzLDEsMTAsMSwzMCwxLDksMSwxNSwKLSAgICAxLDQsMSwxMiwxLDE2LDEsMTgsMSwyMiwyLDEzLDEsMjEsMiwxMjIsCi0gICAgMTksOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LDk3LDk5LDExMywKLSAgICAxMTcsMTA1LDExNCwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLAotICAgIDAsMTAsMCwwLDAsNjcsMCwwLDAsMTE1LDE1NywwLDAsMCwxMTYsMCwKLSAgICAwLDEwNiwxLDAsMTMxLDAsMCwxMjUsMSwwLDEyNCwwLDAsMTA2LDIsMCwKLSAgICAxNDMsMTI5LDAsMSwxMjQsMCwwLDEwNiwzLDAsMTI0LDEsMCwxMDcsMywwLAotICAgIDExNCw0OSwwLDExNiw0LDAsMTAwLDEsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LAotICAgIDAsMCwxMDYsNSwwLDEwMCwyLDAsMTA3LDQsMCwxMTUsNzAsMCwxMTYsNiwKLSAgICAwLDEzMCwxLDAsMTI0LDAsMCw0LDEwNiw1LDAsMTAwLDMsMCw1NiwyLAotICAgIDk1LDUsMCwxMjQsMCwwLDEwNiw1LDAsMTAwLDIsMCwxMDcsMiwwLDExNCwKLSAgICAxNDYsMCwxMDAsMCwwLDEyNCwwLDAsOTUsMywwLDEyNCwwLDAsMTA2LDcsCi0gICAgMCwxMTQsMTQ2LDAsMTI0LDAsMCw0LDEwNiw3LDAsMTAwLDMsMCw1NiwyLAotICAgIDk1LDcsMCwxMjQsMCwwLDEwNiw4LDAsMTA2LDksMCwxMzEsMCwwLDEsCi0gICAgODcsMTAwLDAsMCw4MSw4Miw4OCwxMDAsMCwwLDgzLDQxLDQsNzgsMTIyLDMxLAotICAgIDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTcsCi0gICAgMTEwLDQ1LDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsMTAwLDMyLDEwOCwxMTEsOTksMTA3LDExNCwKLSAgICAzMywwLDAsMCwxMTQsNDUsMCwwLDAsNDEsMTAsMTE0LDM0LDAsMCwwLAotICAgIDExNCw0MCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDM3LDAsMCwwLDIxOCwKLSAgICAxMiw4MiwxMTcsMTEwLDExNiwxMDUsMTA5LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDM4LDAsCi0gICAgMCwwLDIxOCwxNCw2NSwxMTUsMTE1LDEwMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDY5LDExNCwxMTQsCi0gICAgMTExLDExNCwxMTQsMzksMCwwLDAsMTE0LDM2LDAsMCwwLDExNCw0NywwLDAsCi0gICAgMCw0MSwyLDExNCwxOSwwLDAsMCwxMTQsNDMsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDQ3LDAsMCwKLSAgICAwLDExOSwwLDAsMCwxMTUsMjIsMCwwLDAsMCwxLDEyLDEsMTAsMSwKLSAgICAxNSwxLDEyLDEsMjEsMSwxNSwxLDE1LDEsOSwxLDksMSwxNSwxLAotICAgIDEyMiwxOSw5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsMTE0LDEwMSwKLSAgICAxMDgsMTAxLDk3LDExNSwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwKLSAgICAwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMjUsMCwwLDAsMTAwLAotICAgIDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMTYsMiwwLDEyNCwwLAotICAgIDAsMTMxLDEsMCwxMzEsMiwwLDgzLDQxLDIsNzgsMTIyLDIzLDk1LDc3LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0MCwxMjMsMzMsMTE0LDEyNSw0MSwzMiw5NywKLSAgICAxMTYsMzIsMTIzLDEyNSw0MSwzLDIxOCw2LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE0LDE1LAotICAgIDAsMCwwLDIxOCwyLDEwNSwxMDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDgsOTUsCi0gICAgOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDEzMiwwLDAsMCwxMTUsMiwwLDAsMCwKLSAgICAwLDEsMTIyLDIwLDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0NiwKLSAgICA5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsNzgsNDEsOSwxMTQsMSwwLDAsMCwKLSAgICAxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMywwLDAsMCwxMTQsCi0gICAgMjAsMCwwLDAsMTE0LDQ0LDAsMCwwLDExNCw0NiwwLDAsMCwxMTQsNDcsCi0gICAgMCwwLDAsMTE0LDUyLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzIsMCwwLAotICAgIDAsNjgsMCwwLDAsMTE1LDEyLDAsMCwwLDEyLDQsNiwyLDEyLDgsCi0gICAgMTIsMTIsMTIsMjUsMTIsMTMsMTE0LDMyLDAsMCwwLDk5LDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLDAsCi0gICAgMTE1LDcwLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsMiwKLSAgICAwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwxMzIsMCwwLAotICAgIDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCw1LDAsMTAwLAotICAgIDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLDEwMCw4LDAsMTAwLDksCi0gICAgMCwxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCw4Myw0MSwxMSwyMTgsMTYsOTUsCi0gICAgNjgsMTE3LDEwOSwxMDksMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywxMjIsCi0gICAgODYsNjUsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMDEsMzIsOTUsNzcsMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSw3NiwxMTEsOTksMTA3LDMyLDEwMSwxMTMsMTE3LDEwNSwxMTgsOTcsMTA4LDEwMSwxMTAsMTE2LAotICAgIDMyLDEwMiwxMTEsMTE0LDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsOTgsMTE3LDEwNSwxMDgsCi0gICAgMTAwLDExNSwzMiwxMTksMTA1LDExNiwxMDQsMTExLDExNywxMTYsMTAsMzIsMzIsMzIsMzIsMTA5LAotICAgIDExNywxMDgsMTE2LDEwNSw0NSwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNSwKLSAgICAxMTcsMTEyLDExMiwxMTEsMTE0LDExNiw0Niw5OSwyLDAsMCwwLDAsMCwwLDAsCi0gICAgMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwyMiwwLDAsCi0gICAgMCwxMjQsMSwwLDEyNCwwLDAsOTUsMCwwLDEwMCwxLDAsMTI0LDAsMCwKLSAgICA5NSwxLDAsMTAwLDAsMCw4Myw0MSwyLDc4LDExNCwzMywwLDAsMCw0MSwKLSAgICAyLDExNCwxNSwwLDAsMCwxMTQsMzgsMCwwLDAsNDEsMiwxMTQsMTksMCwKLSAgICAwLDAsMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDExLDAsMCwwLDExNCwyMCwwLDAsMCwxNDAsMCwwLDAsMTE1LAotICAgIDQsMCwwLDAsMCwxLDksMSwxMjIsMjUsOTUsNjgsMTE3LDEwOSwxMDksMTIxLAotICAgIDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0Niw5NSw5NSwxMDUsMTEwLDEwNSwKLSAgICAxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCi0gICAgMywwLDAsMCw2NywwLDAsMCwxMTUsMTksMCwwLDAsMTI0LDAsMCwKLSAgICA0LDEwNiwwLDAsMTAwLDEsMCw1NSwyLDk1LDAsMCwxMDAsMiwwLDgzLAotICAgIDQxLDMsNzgsMTE0LDQ1LDAsMCwwLDg0LDQxLDEsMTE0LDM4LDAsMCwwLAotICAgIDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDExLDAsMCwwLDExNCw0NiwwLDAsMCwxNDQsMCwwLDAsMTE1LAotICAgIDQsMCwwLDAsMCwxLDE1LDEsMTIyLDI0LDk1LDY4LDExNywxMDksMTA5LDEyMSwKLSAgICA3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsOTcsOTksMTEzLDExNywxMDUsCi0gICAgMTE0LDEwMSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwzLAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSw0NiwwLDAsMCwxMjQsMCwwLDEwNiwKLSAgICAwLDAsMTAwLDEsMCwxMDcsMiwwLDExNCwyNywwLDExNiwxLDAsMTAwLDIsCi0gICAgMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDAsMCw0LDEwNiwwLDAsMTAwLDMsCi0gICAgMCw1NiwyLDk1LDAsMCwxMDAsMCwwLDgzLDQxLDQsNzgsMTE0LDMzLDAsCisgICAgMCwxMTQsMjcsMCwwLDAsMTIzLDAsMCwwLDExNSw0LDAsMCwwLDAsCisgICAgMSw2LDEsMTIyLDI1LDk1LDY4LDExNywxMDksMTA5LDEyMSw3NywxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDc2LDExMSw5OSwxMDcsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsCisgICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDE4LDAsMCwwLDEyNCwwLDQsMCwxMDYsMCwxMDAsMSwKKyAgICA1NSwwLDIsMCw5NSwwLDEwMCwyLDgzLDAsNDEsMyw3OCwxMTQsMzMsMCwKKyAgICAwLDAsODQsNDEsMSwxMTQsMjQsMCwwLDAsNDEsMSwxMTQsMjYsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCisgICAgMTE0LDM0LDAsMCwwLDEyNywwLDAsMCwxMTUsNCwwLDAsMCwwLDEsCisgICAgMTQsMSwxMjIsMjQsOTUsNjgsMTE3LDEwOSwxMDksMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgNzYsMTExLDk5LDEwNyw0Niw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDk5LDEsMCwwLAorICAgIDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDM2LDAsMCwwLDEyNCwwLDEwNiwwLDEwMCwxLDEwNywyLDExNCwxOCwKKyAgICAxMTYsMSwxMDAsMiwxMzEsMSwxMzAsMSwxMjQsMCw0LDAsMTA2LDAsMTAwLDMsCisgICAgNTYsMCwyLDAsOTUsMCwxMDAsMCw4MywwLDQxLDQsNzgsMTE0LDE5LDAsCiAgICAgMCwwLDEyMiwzMSw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsMTE0LDEwMSwxMDgsMTAxLDk3LAogICAgIDExNSwxMDEsMzIsMTE3LDExMCw0NSw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDEwMCwzMiwxMDgsCi0gICAgMTExLDk5LDEwNywxMTQsNDUsMCwwLDAsNDEsMiwxMTQsMzgsMCwwLDAsMTE0LAotICAgIDQ4LDAsMCwwLDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw0NywwLDAsMCwxNDgsCi0gICAgMCwwLDAsMTE1LDYsMCwwLDAsMCwxLDE1LDEsMTIsMSwxMjIsMjQsCisgICAgMTExLDk5LDEwNywxMTQsMzMsMCwwLDAsNDEsMiwxMTQsMjQsMCwwLDAsMTE0LAorICAgIDM2LDAsMCwwLDQxLDEsMTE0LDI2LDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwzNSwwLDAsMCwxMzEsCisgICAgMCwwLDAsMTE1LDYsMCwwLDAsMCwxLDEwLDEsOCwxLDEyMiwyNCwKICAgICA5NSw2OCwxMTcsMTA5LDEwOSwxMjEsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LAogICAgIDQ2LDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwxLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDI1LDAsCi0gICAgMCwwLDEwMCwxLDAsMTA2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTE2LDIsCi0gICAgMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDIsMCw4Myw0MSwyLDc4LDEyMiwyOCwKLSAgICA5NSw2OCwxMTcsMTA5LDEwOSwxMjEsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LAotICAgIDQwLDEyMywzMywxMTQsMTI1LDQxLDMyLDk3LDExNiwzMiwxMjMsMTI1LDQxLDMsMTE0LDUwLAotICAgIDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsNTEsMCwwLDAsNDEsMSwxMTQsCi0gICAgMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsCi0gICAgMCwwLDAsMTE0LDUyLDAsMCwwLDE1MywwLDAsMCwxMTUsMiwwLDAsCi0gICAgMCwwLDEsMTIyLDI1LDk1LDY4LDExNywxMDksMTA5LDEyMSw3NywxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDc2LDExMSw5OSwxMDcsNDYsOTUsOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDc4LDQxLAotICAgIDgsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLDAsCi0gICAgMTE0LDMsMCwwLDAsMTE0LDIwLDAsMCwwLDExNCw0NiwwLDAsMCwxMTQsCi0gICAgNDcsMCwwLDAsMTE0LDUyLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsNTMsMCwKLSAgICAwLDAsMTM2LDAsMCwwLDExNSwxMCwwLDAsMCwxMiwyLDYsMiwxMiwKLSAgICA0LDEyLDQsMTIsNSwxMTQsNTMsMCwwLDAsOTksMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsCi0gICAgNTIsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsCi0gICAgMTAwLDEsMCwxMDAsMiwwLDEzMiwwLDAsOTAsMywwLDEwMCwzLDAsMTAwLAotICAgIDQsMCwxMzIsMCwwLDkwLDQsMCwxMDAsNSwwLDEwMCw2LDAsMTMyLDAsCi0gICAgMCw5MCw1LDAsMTAwLDcsMCw4Myw0MSw4LDIxOCwxOCw5NSw3NywxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNzcsOTcsMTEwLDk3LDEwMywxMDEsMTE0LDk5LDIsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDIyLDAsMCwwLDEyNCwxLDAsMTI0LDAsMCw5NSwwLAotICAgIDAsMTAwLDAsMCwxMjQsMCwwLDk1LDEsMCwxMDAsMCwwLDgzLDQxLDEsCi0gICAgNzgsNDEsMiwxMTQsMTgsMCwwLDAsMjE4LDUsOTUsMTA4LDExMSw5OSwxMDcsNDEsCi0gICAgMiwxMTQsMTksMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwyMCwwLDAsMCwxNTksCi0gICAgMCwwLDAsMTE1LDQsMCwwLDAsMCwxLDksMSwxMjIsMjcsOTUsNzcsCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLDExNCwKLSAgICA0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDEsMCwwLDAsMTAsMCwwLDAsNjcsMCwwLDAsMTE1LDUzLAotICAgIDAsMCwwLDEyMiwyMiwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwKLSAgICAxLDAsMTI0LDAsMCw5NSwyLDAsODcsMTAwLDAsMCwxMTYsMywwLDEwNiwKLSAgICA0LDAsMTMxLDAsMCwxLDg4LDEyNCwwLDAsMTA2LDIsMCwxMDYsNSwwLAotICAgIDEzMSwwLDAsMSwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsNiwyMTgsMTYsOTUsCi0gICAgMTAzLDEwMSwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTA4LDExMSw5OSwxMDcsMTE0LAotICAgIDE4LDAsMCwwLDExNCw1NSwwLDAsMCwyMTgsNCw5NSwxMDUsMTA5LDExMiwyMTgsCi0gICAgMTIsMTE0LDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsOTUsMTA4LDExMSw5OSwxMDcsMTE0LDQ2LDAsCi0gICAgMCwwLDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwyMywwLDAsMCwxNjMsMCwwLAotICAgIDAsMTE1LDgsMCwwLDAsMCwxLDMsMSwyMiwyLDExLDEsMTIyLDI4LAorICAgIDAsMSwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwxOCwwLAorICAgIDAsMCwxMDAsMSwxMDYsMCwxMjQsMCwxMDYsMSwxMTYsMiwxMjQsMCwxMzEsMSwKKyAgICAxMzEsMiw4MywwLDQxLDIsNzgsMTIyLDI4LDk1LDY4LDExNywxMDksMTA5LDEyMSw3NywKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDAsMTIzLDMzLDExNCwxMjUsNDEsMzIsCisgICAgOTcsMTE2LDMyLDEyMywxMjUsNDEsMywxMTQsMzgsMCwwLDAsMTE0LDE1LDAsMCwKKyAgICAwLDExNCwzOSwwLDAsMCw0MSwxLDExNCwyNiwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsNDAsMCwwLAorICAgIDAsMTM2LDAsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjUsOTUsNjgsCisgICAgMTE3LDEwOSwxMDksMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0Niw5NSwKKyAgICA5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsNzgsNDEsOCwxMTQsMSwwLDAsMCwxMTQsCisgICAgMCwwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMywwLDAsMCwxMTQsMjcsCisgICAgMCwwLDAsMTE0LDM0LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsNDAsMCwKKyAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDExLDAsMCwwLDExNCw0MSwwLDAsMCwxMTksMCwwLDAsMTE1LAorICAgIDEwLDAsMCwwLDgsMiw0LDIsOCw0LDgsNCw4LDUsMTE0LDQxLAorICAgIDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDIsMCwwLDAsNjQsMCwwLDAsMTE1LDM2LDAsMCwwLDEwMSwwLDkwLAorICAgIDEsMTAwLDAsOTAsMiwxMDAsMSwxMDAsMiwxMzIsMCw5MCwzLDEwMCwzLDEwMCwKKyAgICA0LDEzMiwwLDkwLDQsMTAwLDUsMTAwLDYsMTMyLDAsOTAsNSwxMDAsNyw4MywKKyAgICAwLDQxLDgsMjE4LDE4LDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywKKyAgICA3Nyw5NywxMTAsOTcsMTAzLDEwMSwxMTQsOTksMiwwLDAsMCwwLDAsMCwwLAorICAgIDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLAorICAgIDAsMTI0LDEsMTI0LDAsOTUsMCwxMDAsMCwxMjQsMCw5NSwxLDEwMCwwLDgzLAorICAgIDAsNDEsMSw3OCw0MSwyLDIxOCw1LDk1LDExMCw5NywxMDksMTAxLDIxOCw1LDk1LAorICAgIDEwOCwxMTEsOTksMTA3LDQxLDIsMTE0LDI2LDAsMCwwLDExNCwxNSwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsCisgICAgMjcsMCwwLDAsMTQyLDAsMCwwLDExNSw0LDAsMCwwLDAsMSw2LAorICAgIDEsMTIyLDI3LDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw3Nyw5NywKKyAgICAxMTAsOTcsMTAzLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsCisgICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEwLDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSw0MiwwLDAsMCwxMjIsMTYsMTE2LDAsMTI0LDAsMTA2LDEsCisgICAgMTMxLDEsMTI0LDAsOTUsMiw4NywwLDEwMCwwLDExNiwzLDEwNiw0LDEzMSwwLAorICAgIDEsMCw4OCwwLDEyNCwwLDEwNiwyLDEwNiw1LDEzMSwwLDEsMCwxMDAsMCwKKyAgICA4MywwLDQxLDEsNzgsNDEsNiwyMTgsMTYsOTUsMTAzLDEwMSwxMTYsOTUsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsOTUsMTA4LDExMSw5OSwxMDcsMTE0LDQzLDAsMCwwLDExNCw0NCwKKyAgICAwLDAsMCwyMTgsNCw5NSwxMDUsMTA5LDExMiwyMTgsMTIsMTE0LDEwMSwxMDgsMTAxLDk3LAorICAgIDExNSwxMDEsOTUsMTA4LDExMSw5OSwxMDcsMTE0LDM0LDAsMCwwLDQxLDEsMTE0LDI2LAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCisgICAgMCwwLDIxOCw5LDk1LDk1LDEwMSwxMTAsMTE2LDEwMSwxMTQsOTUsOTUsMTQ2LDAsMCwKKyAgICAwLDExNSw4LDAsMCwwLDAsMSwyLDEsMTYsMiwxMCwxLDEyMiwyOCwKICAgICA5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNzcsOTcsMTEwLDk3LDEwMywKICAgICAxMDEsMTE0LDQ2LDk1LDk1LDEwMSwxMTAsMTE2LDEwMSwxMTQsOTUsOTUsOTksMSwwLDAsCiAgICAgMCwwLDAsMCwwLDMsMCwwLDAsMSwwLDAsMCw3OSwwLDAsCi0gICAgMCwxMTUsMTcsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEwNiwxLDAsMTMxLAotICAgIDAsMCwxLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwyLDExNCw1NSwwLDAsCi0gICAgMCwxMTQsNDcsMCwwLDAsNDEsMywxMTQsMTksMCwwLDAsMTE0LDI5LDAsCi0gICAgMCwwLDkwLDYsMTA3LDExOSw5NywxMTQsMTAzLDExNSwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzAsMCwwLDAsMTcwLDAsCi0gICAgMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjcsOTUsNzcsMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSw3NiwxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLDExNCw0Niw5NSw5NSwKLSAgICAxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNzgsNDEsNiwxMTQsMSwwLDAsMCwxMTQsMCwKLSAgICAwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMjAsMCwwLDAsMTE0LDIzLDAsCi0gICAgMCwwLDExNCwzMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDU0LDAsMCwwLAotICAgIDE1NywwLDAsMCwxMTUsNiwwLDAsMCwxMiwyLDEyLDQsMTIsNywxMTQsCi0gICAgNTQsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwwLAotICAgIDAsMTEsMCwwLDAsMywwLDAsMCwxMTUsMTM5LDAsMCwwLDEwMCwxLAotICAgIDAsMTI1LDEsMCwxMjEsMTcsMCwxMTYsMCwwLDEzNiwwLDAsMjUsMTMxLDAsCi0gICAgMCwxMjUsMSwwLDg3LDExMCwxOCwwLDQsMTE2LDEsMCwxMDcsMTAsMCwxMTQsCi0gICAgNDMsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCwxLDAsMTAwLDEsMCwKLSAgICAxMDcsOCwwLDExNCwxMzUsMCwxMTYsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsCi0gICAgODMsMCwxMTYsMywwLDEzNiwwLDAsMTMxLDEsMCwxMjUsMSwwLDExMCwxMiwKLSAgICAwLDExNiw0LDAsMTM2LDAsMCwxMzEsMSwwLDEyNSwxLDAsMTM1LDAsMCwKLSAgICAxMDIsMSwwLDEwMCwyLDAsMTAwLDMsMCwxMzQsMCwwLDEyNSwyLDAsMTE2LAotICAgIDUsMCwxMDYsNiwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDExNiwwLAotICAgIDAsMTM2LDAsMCw2MCwxMjQsMSwwLDgzLDQxLDQsMTIyLDEwOSw3MSwxMDEsMTE2LAotICAgIDMyLDExMSwxMTQsMzIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwOCwxMTEsOTksMTA3LDMyLDEwMiwxMTEsMTE0LDMyLDk3LAotICAgIDMyLDEwMywxMDUsMTE4LDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LAotICAgIDEwOSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODMsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwKLSAgICAxMTEsMTEwLDEwOCwxMjEsMzIsOTgsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwxMTksCi0gICAgMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA4LAotICAgIDExMSw5OSwxMDcsMzIsMTE2LDk3LDEwNywxMDEsMTEwLDQ2LDc4LDk5LDEsMCwwLDAsCi0gICAgMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsMTksMCwwLDAsCi0gICAgMTE1LDExLDAsMCwwLDExNiwwLDAsMTM2LDAsMCw2MSwxMDAsMCwwLDgzLAotICAgIDQxLDEsNzgsNDEsMSwyMTgsMTMsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTA4LAotICAgIDExMSw5OSwxMDcsMTE1LDQxLDEsMjE4LDEsOTUsNDEsMSwxMTQsMTUsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMiw5OSw5OCwxOTAsMCwKLSAgICAwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyOCw5NSwxMDMsMTAxLDExNiw5NSwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMDgsMTExLDk5LDEwNyw0Niw2MCwxMDgsMTExLDk5LAotICAgIDk3LDEwOCwxMTUsNjIsNDYsOTksOTgsNDEsNywxMTQsNTksMCwwLDAsMTE0LDI4LAotICAgIDAsMCwwLDExNCwzNCwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LDMyLDAsCi0gICAgMCwwLDIxOCw4LDk1LDExOSwxMDEsOTcsMTA3LDExNCwxMDEsMTAyLDkwLDMsMTE0LDEwMSwKLSAgICAxMDIsNDEsMywxMTQsMTUsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw2MSwwLAotICAgIDAsMCwxMTQsMTAsMCwwLDAsNDEsMSwxMTQsMTUsMCwwLDAsMTE0LDExLAotICAgIDAsMCwwLDExNCw1NiwwLDAsMCwxNzYsMCwwLDAsMTE1LDI0LDAsMCwKLSAgICAwLDAsNCw2LDEsMywxLDE3LDEsMTMsMSw1LDEsMTIsMSwxMiwKLSAgICAxLDE1LDIsMTIsMSwxOCwyLDIyLDEsMTE0LDU2LDAsMCwwLDk5LDEsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDExLDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSw3MSwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTMxLDEsCi0gICAgMCwxMjUsMSwwLDExNiwxLDAsMTA2LDIsMCwxMzEsMCwwLDEsMTIxLDE0LAotICAgIDAsMTI0LDEsMCwxMDYsMywwLDEzMSwwLDAsMSw4NywxMTAsMTgsMCw0LAotICAgIDExNiw0LDAsMTA3LDEwLDAsMTE0LDU2LDAsMSwxLDEsODksMTEwLDExLDAsCi0gICAgODgsMTI0LDEsMCwxMDYsNSwwLDEzMSwwLDAsMSwxMDAsMSwwLDgzLDQxLAotICAgIDIsOTcsMjEsMSwwLDAsODIsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMDMsMTA4LDExMSw5OCw5NywxMDgsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgMTA4LDExMSw5OSwxMDcsNDQsMzIsOTcsMTEwLDEwMCwzMiw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsCi0gICAgMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsMTE0LDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsCi0gICAgMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LAotICAgIDExMSw5OSwxMDcsMzIsMTAyLDExMSwxMTQsMzIsOTcsMzIsMTAzLDEwNSwxMTgsMTAxLDExMCwzMiwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSw0NiwxMCwzMiwzMiwzMiwKLSAgICAzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDUsMTE1LDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMTYsMTExLAotICAgIDMyLDEwMSwxMTAsMTE1LDExNywxMTQsMTAxLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDMyLDEwNSwxMTUsMzIsOTksMTExLDEwOSwxMTIsMTA4LDEwMSwxMTYsMTAxLDEwOCwxMjEsMzIsMTA1LAotICAgIDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDEsMTAwLDQ0LDMyLDEwNSwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTAxLDExOCwxMDEsMTEwLDExNiwzMiwxMDUsMTE2LDMyLAotICAgIDEwNSwxMTUsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwKLSAgICAxMDAsMzIsOTgsMTIxLDMyLDk3LDExMCwxMTEsMTE2LDEwNCwxMDEsMTE0LDMyLDExNiwxMDQsMTE0LAotICAgIDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODMsMTA0LDExMSwxMTcsMTA4LDEwMCwKLSAgICAzMiwxMTEsMTEwLDEwOCwxMjEsMzIsOTgsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwKLSAgICAxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgMTA4LDExMSw5OSwxMDcsMzIsMTE2LDk3LDEwNywxMDEsMTEwLDQ2LDc4LDQxLDYsMTE0LDU2LAotICAgIDAsMCwwLDExNCw1NywwLDAsMCwxMTQsNTgsMCwwLDAsMTE0LDQ2LDAsCi0gICAgMCwwLDExNCwzMSwwLDAsMCwxMTQsNDcsMCwwLDAsNDEsMiwxMTQsMTUsCi0gICAgMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxOSw5NSwxMDgsMTExLDk5LDEwNyw5NSwxMTcsCi0gICAgMTEwLDEwOCwxMTEsOTksMTA3LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE5NSwwLDAsMCwKLSAgICAxMTUsMTQsMCwwLDAsMCw3LDEyLDEsMTAsMSwzLDEsMTQsMSwxMywKLSAgICAzLDUsMiwxMTQsNjMsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDMsMCwwLDAsMywwLDAsMCw3OSwwLDAsMCwxMTUsMTMsMCwKLSAgICAwLDAsMTI0LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTQyLDAsMCw4Myw0MSwKLSAgICAxLDk3LDQ2LDEsMCwwLDExNCwxMDEsMTA5LDExMSwxMTgsMTAxLDk1LDEwNSwxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsOTUsMTAyLDExNCw5NywxMDksMTAxLDExNSwzMiwxMDUsMTEwLAotICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDk5LDMyLDExOSwxMDUsMTA4LDEwOCwzMiw5NywKLSAgICAxMDgsMTE5LDk3LDEyMSwxMTUsMzIsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMzIsMTE1LDEwMSwxMTMsCi0gICAgMTE3LDEwMSwxMTAsOTksMTAxLDExNSwxMCwzMiwzMiwzMiwzMiwxMTEsMTAyLDMyLDEwNSwxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsMTAyLDExNCw5NywxMDksMTAxLDExNSwzMiwxMTYsCi0gICAgMTA0LDk3LDExNiwzMiwxMDEsMTEwLDEwMCwzMiwxMTksMTA1LDExNiwxMDQsMzIsOTcsMzIsOTksCi0gICAgOTcsMTA4LDEwOCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDIsMTE3LDExMCw5OSwKLSAgICAxMTYsMTA1LDExMSwxMTAsMTAsMTAsMzIsMzIsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDUsMTE2LAotICAgIDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDMyLDExMSwxMDIsMzIsOTcsMzIsMTEwLDExMSwKLSAgICAxMTQsMTA5LDk3LDEwOCwzMiw5OSw5NywxMDgsMTA4LDMyLDEwNSwxMTAsMzIsMTEyLDEwOCw5NywKLSAgICA5OSwxMDEsMTE1LDMyLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDExMCw5OSwxMDgsMTE3LDEwMCwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LAotICAgIDk4LDEwLDMyLDMyLDMyLDMyLDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsMzIsMTA1LDExMCwxMTYsCi0gICAgMTE0LDExMSwxMDAsMTE3LDk5LDEwMSwxMTUsMzIsMTE3LDExMCwxMTksOTcsMTEwLDExNiwxMDEsMTAwLAotICAgIDMyLDExMCwxMTEsMTA1LDExNSwxMDEsMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDExNiwxMTQsOTcsOTksMTAxLDk4LDk3LDk5LDEwNywzMiw0MCwxMDEsNDYsMTAzLDQ2LDMyLAotICAgIDExOSwxMDQsMTAxLDExMCwzMiwxMDEsMTIwLDEwMSw5OSwxMTcsMTE2LDEwNSwxMTAsMTAzLDEwLDMyLAotICAgIDMyLDMyLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQxLDEwLAotICAgIDMyLDMyLDMyLDMyLDExNCwxMCwwLDAsMCw0MSwzLDIxOCwxLDEwMiwxMTQsMjksCi0gICAgMCwwLDAsOTAsNCwxMDcsMTE5LDEwMCwxMTUsMTE0LDEwLDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDI1LDk1LDk5LDk3LDEwOCwxMDgsOTUsCi0gICAgMTE5LDEwNSwxMTYsMTA0LDk1LDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsOTUsMTE0LDEwMSwxMDksMTExLAotICAgIDExOCwxMDEsMTAwLDIxNCwwLDAsMCwxMTUsMiwwLDAsMCwwLDgsMTE0LDY1LAotICAgIDAsMCwwLDIxOCw5LDExOCwxMDEsMTE0LDk4LDExMSwxMTUsMTA1LDExNiwxMjEsMTE0LDQ1LAotICAgIDAsMCwwLDk5LDEsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLAotICAgIDQsMCwwLDAsNzEsMCwwLDAsMTE1LDc1LDAsMCwwLDExNiwwLDAsCi0gICAgMTA2LDEsMCwxMDYsMiwwLDEyNCwxLDAsMTA3LDUsMCwxMTQsNzEsMCwxMjQsCi0gICAgMCwwLDEwNiwzLDAsMTAwLDYsMCwxMzEsMSwwLDExNSw0MywwLDEwMCwzLAotICAgIDAsMTI0LDAsMCwyMywxMjUsMCwwLDExNiw0LDAsMTI0LDAsMCwxMDYsNSwKLSAgICAwLDEyNCwyLDAsMTQwLDAsMCwxMDAsNCwwLDExNiwwLDAsMTA2LDYsMCwKLSAgICAxMzEsMSwxLDEsMTAwLDUsMCw4Myw0MSw3LDEyMiw2MSw4MCwxMTQsMTA1LDExMCwKLSAgICAxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMzIsMTE2LDExMSwKLSAgICAzMiwxMTUsMTE2LDEwMCwxMDEsMTE0LDExNCwzMiwxMDUsMTAyLDMyLDQ1LDExOCw0Nyw4MCw4OSwKLSAgICA4NCw3Miw3OSw3OCw4Niw2OSw4Miw2Niw3OSw4Myw2OSwzMiwxMDUsMTE1LDMyLDExNiwKLSAgICAxMTcsMTE0LDExMCwxMDEsMTAwLDMyLDExMSwxMTAsNDYsMjUwLDEsMzUsMjUwLDcsMTA1LDEwOSwKLSAgICAxMTIsMTExLDExNCwxMTYsMzIsMTIyLDIsMzUsMzIsOTAsNCwxMDIsMTA1LDEwOCwxMDEsNzgsCi0gICAgNDEsMiwxMTQsNjcsMCwwLDAsMTE0LDY4LDAsMCwwLDQxLDcsMTE0LDE0LAotICAgIDAsMCwwLDIxOCw1LDEwMiwxMDgsOTcsMTAzLDExNSwyMTgsNywxMTgsMTAxLDExNCw5OCwKLSAgICAxMTEsMTE1LDEwMSwyMTgsMTAsMTE1LDExNiw5NywxMTQsMTE2LDExNSwxMTksMTA1LDExNiwxMDQsMjE4LAotICAgIDUsMTEyLDExNCwxMDUsMTEwLDExNiwxMTQsNTAsMCwwLDAsMjE4LDYsMTE1LDExNiwxMDAsCi0gICAgMTAxLDExNCwxMTQsNDEsMywyMTgsNywxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTQsNjYsCi0gICAgMCwwLDAsMTE0LDI5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxNiw5NSwxMTgsMTAxLDExNCw5OCwxMTEsMTE1LAotICAgIDEwMSw5NSwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwyMjUsMCwwLDAsMTE1LDgsMCwKLSAgICAwLDAsMCwyLDE4LDEsMTUsMSwxMCwxLDExNCw3NSwwLDAsMCw5OSwKLSAgICAxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLAotICAgIDMsMCwwLDAsMTE1LDM1LDAsMCwwLDEzNSwwLDAsMTAyLDEsMCwxMDAsCi0gICAgMSwwLDEwMCwyLDAsMTM0LDAsMCwxMjUsMSwwLDExNiwwLDAsMTI0LDEsCi0gICAgMCwxMzYsMCwwLDEzMSwyLDAsMSwxMjQsMSwwLDgzLDQxLDMsMTIyLDQ5LAotICAgIDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LDMyLDExNiwxMTEsMzIsMTE4LDEwMSwxMTQsCi0gICAgMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsCi0gICAgNDYsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNCwwLAotICAgIDAsMCwxOSwwLDAsMCwxMTUsNTUsMCwwLDAsMTI0LDEsMCwxMTYsMCwKLSAgICAwLDEwNiwxLDAsMTA3LDcsMCwxMTQsNDIsMCwxMTYsMiwwLDEwMCwxLDAsCi0gICAgMTA2LDMsMCwxMjQsMSwwLDEzMSwxLDAsMTAwLDIsMCwxMjQsMSwwLDEzMSwKLSAgICAxLDEsMTMwLDEsMCwxMzYsMCwwLDEyNCwwLDAsMTI0LDEsMCwxMzEsMiwKLSAgICAwLDgzLDQxLDMsNzgsMTIyLDI5LDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLAotICAgIDExMSwxMTYsMzIsOTcsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMTE0LDE1LDAsMCwwLDQxLDQsMTE0LDE0LDAsMCwwLAotICAgIDIxOCwyMCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMjE4LDExLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LAotICAgIDExNCwxMTEsMTE0LDExNCw1MCwwLDAsMCw0MSwyLDExNCwxOSwwLDAsMCwyMTgsCi0gICAgOCwxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsNDEsMSwyMTgsMywxMDIsMTIwLDExMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwyNSw5NSwxMTQsMTAxLDExMywKLSAgICAxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExOSwxMTQsCi0gICAgOTcsMTEyLDExMiwxMDEsMTE0LDIzNSwwLDAsMCwxMTUsOCwwLDAsMCwwLDEsCi0gICAgMTUsMSwxOCwxLDksMSwxMjIsNTIsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLAotICAgIDExNSw5NSw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwKLSAgICAxMTUsNjIsNDYsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSw5OCwxMTcsMTA1LAotICAgIDEwOCwxMTYsMTA1LDExMCw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw0MSwxLDExNCwxMiwKLSAgICAwLDAsMCw0MSwyLDExNCw3OSwwLDAsMCwxMTQsODAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDQxLDEsMTE0LDc5LDAsMCwwLDExNCwxMSwwLDAsMCwKLSAgICAyMTgsMTcsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSw5OCwxMTcsMTA1LDEwOCwKLSAgICAxMTYsMTA1LDExMCwyMzMsMCwwLDAsMTE1LDYsMCwwLDAsMCwyLDE4LDUsCi0gICAgMTMsMSwxMTQsODEsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLAotICAgIDIsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDExNSwzNSwwLDAsCi0gICAgMCwxMzUsMCwwLDEwMiwxLDAsMTAwLDEsMCwxMDAsMiwwLDEzNCwwLDAsCi0gICAgMTI1LDEsMCwxMTYsMCwwLDEyNCwxLDAsMTM2LDAsMCwxMzEsMiwwLDEsCi0gICAgMTI0LDEsMCw4Myw0MSwzLDEyMiw0Nyw2OCwxMDEsOTksMTExLDExNCw5NywxMTYsMTExLAotICAgIDExNCwzMiwxMTYsMTExLDMyLDExOCwxMDEsMTE0LDEwNSwxMDIsMTIxLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDExMCw5NywxMDksMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLAotICAgIDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDQ2LDk5LDIsMCwwLDAsMCwwLDAsMCwKLSAgICAyLDAsMCwwLDQsMCwwLDAsMTksMCwwLDAsMTE1LDU1LDAsMCwKLSAgICAwLDExNiwwLDAsMTA2LDEsMCwxMjQsMSwwLDEzMSwxLDAsMTE1LDQyLDAsCi0gICAgMTE2LDIsMCwxMDAsMSwwLDEwNiwzLDAsMTI0LDEsMCwxMzEsMSwwLDEwMCwKLSAgICAyLDAsMTI0LDEsMCwxMzEsMSwxLDEzMCwxLDAsMTM2LDAsMCwxMjQsMCwKLSAgICAwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwzLDc4LDEyMiwyNywxMjMsMzMsMTE0LAotICAgIDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsCi0gICAgMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxNSwwLDAsMCw0MSw0LDExNCwKLSAgICA1NywwLDAsMCwyMTgsOSwxMDUsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDExNCwKLSAgICA3NywwLDAsMCwxMTQsNTAsMCwwLDAsNDEsMiwxMTQsMTksMCwwLDAsCi0gICAgMTE0LDc4LDAsMCwwLDQxLDEsMTE0LDc5LDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMjE4LDI0LDk1LDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwKLSAgICAxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsCi0gICAgMjQ2LDAsMCwwLDExNSw4LDAsMCwwLDAsMSwxNSwxLDE4LDEsOSwKLSAgICAxLDEyMiw1MCw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDEwMiwxMTQsMTExLAotICAgIDEyMiwxMDEsMTEwLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw5NSwxMTQsMTAxLAotICAgIDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDk1LDExOSwxMTQsCi0gICAgOTcsMTEyLDExMiwxMDEsMTE0LDQxLDEsMTE0LDEyLDAsMCwwLDQxLDIsMTE0LDc5LAotICAgIDAsMCwwLDExNCw4MywwLDAsMCwxMTQsMTAsMCwwLDAsNDEsMSwxMTQsCi0gICAgNzksMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxNiw5NSwxMTQsMTAxLDExMywxMTcsCi0gICAgMTA1LDExNCwxMDEsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDI0NCwwLDAsMCwxMTUsCi0gICAgNiwwLDAsMCwwLDIsMTgsNSwxMywxLDExNCw4NCwwLDAsMCw5OSwKLSAgICAyLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSw4MSwwLDAsMCwxMTYsMCwwLDEyNCwxLDAsMTI0LAotICAgIDAsMCwxMzEsMiwwLDEyNSwyLDAsMTI0LDEsMCwxMTYsMSwwLDEwNiwyLAotICAgIDAsMTA3LDYsMCwxMTQsNjcsMCwxMTYsMSwwLDEwNiwyLDAsMTI0LDEsMCwKLSAgICAyNSwxMjUsMywwLDExNiwzLDAsMTI0LDIsMCwxMjQsMywwLDEzMSwyLDAsCi0gICAgMSwxMTYsMSwwLDEwNiwyLDAsMTI0LDEsMCwyNSw4MywxMTYsNCwwLDEyNCwKLSAgICAyLDAsMTMxLDEsMCw4MywxMDAsMSwwLDgzLDQxLDIsMTIyLDEyOCw3NiwxMTEsCi0gICAgOTcsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNSwxMjEsMTE1LAotICAgIDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LAotICAgIDExNywxMTQsMTEwLDMyLDEwNSwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwKLSAgICAxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsCi0gICAgMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTA4LDExMSw5NywKLSAgICAxMDAsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKLSAgICAxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCw0MSwKLSAgICA1LDIxOCwxNiwxMTUsMTEyLDEwMSw5OSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTA4LDExMSw5NywKLSAgICAxMDAsMTAxLDExNCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwwLDIxOCw1LDk1LAotICAgIDEwMSwxMjAsMTAxLDk5LDIxOCw1LDk1LDEwOCwxMTEsOTcsMTAwLDQxLDQsMTE0LDE5LDAsCi0gICAgMCwwLDExNCw3OCwwLDAsMCwyMTgsNCwxMTUsMTEyLDEwMSw5OSwyMTgsNiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMSwwLDAsMCwyMTgsMTcsOTUsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsOTUsMTE1LDEwNCwxMDUsMTA5LDAsMSwwLDAsMTE1LDEyLDAsMCwwLAotICAgIDAsNiwxNSwxLDE1LDEsMTMsMSwxMywxLDExLDIsMTE0LDkwLDAsMCwKLSAgICAwLDk5LDEsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDM1LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSw2LDEsMCwwLDExNiwwLDAsMTI0LDAsCi0gICAgMCwxMDAsMSwwLDEwMCwwLDAsMTMxLDMsMCwxMjUsMSwwLDExNiwxLDAsCi0gICAgMTI0LDEsMCwxMDAsMiwwLDEzMSwyLDAsMTE0LDcxLDAsMTIxLDE3LDAsMTI0LAotICAgIDEsMCwxMDYsMiwwLDEyNCwwLDAsMTMxLDEsMCw4Myw4NywxMTAsMTgsMCwKLSAgICA0LDExNiwzLDAsMTA3LDEwLDAsMTE0LDcwLDAsMSwxLDEsODksMTEwLDEsCi0gICAgMCw4OCwxMjEsMTMsMCwxMjQsMCwwLDEwNiw0LDAsMTI1LDIsMCw4NywxMTAsCi0gICAgMTgsMCw0LDExNiw1LDAsMTA3LDEwLDAsMTE0LDEwNCwwLDEsMSwxLDg5LAotICAgIDExMCwyMywwLDg4LDEyNCwyLDAsMTAwLDAsMCwxMDcsOSwwLDExNCwxMjcsMCwKLSAgICAxMTYsNiwwLDEyNCwyLDAsMTMxLDEsMCw4MywxMjEsMTMsMCwxMjQsMCwwLAotICAgIDEwNiw3LDAsMTI1LDMsMCw4NywxMTAsMjQsMCw0LDExNiw1LDAsMTA3LDEwLAotICAgIDAsMTE0LDE2NiwwLDEsMSwxLDEwMCwzLDAsMTI1LDMsMCw4OSwxMTAsMSwKLSAgICAwLDg4LDEyMSwxMywwLDEyNCwwLDAsMTA2LDgsMCwxMjUsNCwwLDg3LDExMCwKLSAgICA1OSwwLDQsMTE2LDUsMCwxMDcsMTAsMCwxMTQsMjQxLDAsMSwxLDEsMTI0LAotICAgIDEsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDIyMSwwLDEwMCw0LDAsMTA2LDksCi0gICAgMCwxMjQsMywwLDEzMSwxLDAsODMsMTAwLDUsMCwxMDYsOSwwLDEyNCwzLAotICAgIDAsMTI0LDEsMCwxMzEsMiwwLDgzLDg5LDExMCwxNywwLDg4LDEwMCw2LDAsCi0gICAgMTA2LDksMCwxMjQsMywwLDEyNCw0LDAsMTMxLDIsMCw4MywxMDAsMCwwLAotICAgIDgzLDQxLDcsNzgsMjE4LDEwLDk1LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTUsOTUsCi0gICAgMjE4LDExLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCwyNTAsMSw2MywKLSAgICAxMjIsMTMsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsNjIsMTIyLAotICAgIDIwLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLDEyMywKLSAgICAzMywxMTQsMTI1LDQxLDYyLDEyMiwyMyw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsCi0gICAgMzMsMTE0LDEyNSwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDMzLDExNCwxMjUsNjIsNDEsMTAsCi0gICAgMTE0LDYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDkyLDAsMCwwLDIxOCwKLSAgICA5LDY5LDEyMCw5OSwxMDEsMTEyLDExNiwxMDUsMTExLDExMCwyMTgsOCw5NSw5NSwxMTUsMTEyLAotICAgIDEwMSw5OSw5NSw5NSwyMTgsMTQsNjUsMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsMTAxLDY5LAotICAgIDExNCwxMTQsMTExLDExNCwyMTgsMjIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE0LDEwMSwKLSAgICAxMTIsMTE0LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMTUsMTEyLDEwMSw5OSwxMTQsMSwwLDAsCi0gICAgMCwyMTgsOCw5NSw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsOTUsMTE0LDUwLDAsMCwwLAotICAgIDQxLDUsMTE0LDg5LDAsMCwwLDIxOCw2LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE0LAotICAgIDg4LDAsMCwwLDExNCwxNSwwLDAsMCwyMTgsOCwxMDIsMTA1LDEwOCwxMDEsMTEwLAotICAgIDk3LDEwOSwxMDEsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwKLSAgICAwLDAsMjE4LDEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCwKLSAgICAxNiwxLDAsMCwxMTUsNDYsMCwwLDAsMCwyLDE4LDEsMTUsNCwzLAotICAgIDEsMTcsMSwxMywxLDUsMSwzLDEsMTMsMSwxMywxLDUsMiwxMiwKLSAgICAxLDEwLDQsMywxLDEzLDEsMTMsMSwxMSwxLDMsMSwxMywxLDEzLAotICAgIDEsMTIsMSwxMywyLDIxLDIsMTE0LDEwMSwwLDAsMCw5OSwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwKLSAgICAwLDExNSw1MiwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLAotICAgIDIsMCwxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCw5MCwzLDAsMTAwLDMsCi0gICAgMCwxMDAsNCwwLDEzMiwwLDAsOTAsNCwwLDEwMCw1LDAsMTAwLDYsMCwKLSAgICAxMzIsMCwwLDkwLDUsMCwxMDAsNywwLDgzLDQxLDgsMjE4LDE3LDk1LDEwNSwKLSAgICAxMTAsMTE1LDExNiw5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LDEyMSw5OSwKLSAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSwyNSwwLDAsMCwxMjQsMSwwLDEyNCwwLDAsOTUsCi0gICAgMCwwLDEyNCwxLDAsMTA2LDEsMCwxMjQsMCwwLDk1LDIsMCwxMDAsMCwKLSAgICAwLDgzLDQxLDEsNzgsNDEsMywyMTgsNyw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAxMTQsOTUsMCwwLDAsMjE4LDUsOTUsMTE1LDExMiwxMDEsOTksNDEsMiwxMTQsMTksCi0gICAgMCwwLDAsMTE0LDg5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDExNCwyMCwwLDAsMCw1NCwxLDAsMCwKLSAgICAxMTUsNCwwLDAsMCwwLDEsOSwxLDEyMiwyNiw5NSwxMDUsMTEwLDExNSwxMTYsCi0gICAgOTcsMTA4LDEwOCwxMDEsMTAwLDk1LDExNSw5NywxMDIsMTAxLDEwOCwxMjEsNDYsOTUsOTUsMTA1LAotICAgIDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsCi0gICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDM4LDAsMCwwLDEwMCwKLSAgICAxLDAsMTI0LDAsMCwxMDYsMCwwLDk1LDEsMCwxMjQsMCwwLDEwNiwyLAotICAgIDAsMTE2LDMsMCwxMDYsNCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsNSwwLAotICAgIDYwLDEwMCwwLDAsODMsNDEsMiw3OCw4NCw0MSw2LDExNCwxMDQsMCwwLDAsCi0gICAgMjE4LDEzLDk1LDEwNSwxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTA1LDExMCwxMDMsMTE0LAotICAgIDEwMywwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwwLDExNCwxNSwKLSAgICAwLDAsMCw0MSwxLDExNCwxOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjMsMCwwLDAsNTgsMSwKLSAgICAwLDAsMTE1LDQsMCwwLDAsMCw0LDEyLDEsMTIyLDI3LDk1LDEwNSwxMTAsCi0gICAgMTE1LDExNiw5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LDEyMSw0Niw5NSwKLSAgICA5NSwxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwzLDAsMCwwLDE3LDAsMCwwLDcxLDAsMCwwLDExNSwxMjEsMCwKLSAgICAwLDAsMTIyLDEwMSwwLDEyNCwwLDAsMTA2LDAsMCwxMjUsMiwwLDExNiwxLAotICAgIDAsMTAwLDEsMCwxMDAsMiwwLDEzMiwwLDAsMTI0LDEsMCw2OCwxMzEsMSwKLSAgICAwLDEzMSwxLDAsMTE0LDc4LDAsMTIxLDE3LDAsMTE2LDIsMCwxMDYsMywwLAotICAgIDEyNCwyLDAsMTA2LDQsMCw2MSw4NywxMTMsMTAwLDAsNCwxMTYsNSwwLDEwNywKLSAgICAxMCwwLDExNCw3NCwwLDEsMSwxLDg5LDExMywxMDAsMCw4OCwxMTAsMjIsMCwKLSAgICAxMTYsNiwwLDEwMCwzLDAsMTI0LDIsMCwxMDYsNCwwLDEyNCwyLDAsMTA2LAotICAgIDcsMCwxMzEsMywwLDEsODcsMTAwLDAsMCwxMDAsNCwwLDEyNCwwLDAsCi0gICAgMTA2LDAsMCw5NSw4LDAsODgsMTAwLDAsMCw4Myw0MSw1LDc4LDk5LDEsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsMTE1LAotICAgIDAsMCwwLDExNSwyNywwLDAsMCwxMjQsMCwwLDkzLDE3LDAsMTI1LDEsCi0gICAgMCwxMjQsMSwwLDEwMCwwLDAsMTA3LDksMCw4NiwxLDExMywzLDAsMTAwLAotICAgIDAsMCw4Myw0MSwxLDc4LDExNCwxMCwwLDAsMCw0MSwyLDExNCwyNCwwLAotICAgIDAsMCwxMTQsMjUsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMTE0LDI2LDAsMCwwLDY4LDEsMCwwLDExNSwKLSAgICAyLDAsMCwwLDYsMCwxMjIsNDUsOTUsMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsCi0gICAgMTAxLDEwMCw5NSwxMTUsOTcsMTAyLDEwMSwxMDgsMTIxLDQ2LDk1LDk1LDEwMSwxMjAsMTA1LDExNiwKLSAgICA5NSw5NSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTAzLDEwMSwxMTAsCi0gICAgMTAxLDEyMCwxMTIsMTE0LDYyLDEyMiwxOCwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMjMsMzMsCi0gICAgMTE0LDEyNSwzMiwzNSwzMiwxMjMsMzMsMTE0LDEyNSw3MCw0MSw5LDExNCwxMDQsMCwwLAotICAgIDAsMTE0LDI3LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsCi0gICAgMTE0LDE1LDAsMCwwLDExNCwyOCwwLDAsMCwxMTQsNzUsMCwwLDAsMTE0LAotICAgIDk5LDAsMCwwLDExNCwxMDUsMCwwLDAsNDEsMywxMTQsMTksMCwwLDAsCi0gICAgMTE0LDI5LDAsMCwwLDExNCw4OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzAsMCwwLDAsNjUsMSwKLSAgICAwLDAsMTE1LDE4LDAsMCwwLDAsMSwzLDEsOSwxLDI1LDEsMywKLSAgICAxLDE3LDEsMTMsMSw4LDIsMjYsMiwxMjIsMjYsOTUsMTA1LDExMCwxMTUsMTE2LAotICAgIDk3LDEwOCwxMDgsMTAxLDEwMCw5NSwxMTUsOTcsMTAyLDEwMSwxMDgsMTIxLDQ2LDk1LDk1LDEwMSwKLSAgICAxMjAsMTA1LDExNiw5NSw5NSw3OCw0MSw2LDExNCwxLDAsMCwwLDExNCwwLDAsCi0gICAgMCwwLDExNCwyLDAsMCwwLDExNCwyMCwwLDAsMCwxMTQsMjMsMCwwLAotICAgIDAsMTE0LDMwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTAyLDAsMCwwLDUyLAotICAgIDEsMCwwLDExNSw2LDAsMCwwLDEyLDIsMTIsNCwxMiw3LDExNCwxMDIsCi0gICAgMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgOCwwLDAsMCw2NCwwLDAsMCwxMTUsMTcyLDAsMCwwLDEwMSwwLDAsCi0gICAgOTAsMSwwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwKLSAgICAyLDAsMTAwLDMsMCwxMDAsNCwwLDEwMCwzLDAsMTAwLDUsMCwxMDAsMywKLSAgICAwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwzLDkwLDQsMCwxMDAsOCwwLAotICAgIDEwMCw5LDAsMTMyLDAsMCw5MCw1LDAsMTAwLDEwLDAsMTAwLDExLDAsMTMyLAotICAgIDAsMCw5MCw2LDAsMTAxLDcsMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwKLSAgICAwLDEzMSwxLDAsOTAsOCwwLDEwMSw4LDAsMTA2LDksMCwxMDAsMTQsMCwKLSAgICAxMDAsMTMsMCwxMzIsMCwwLDEzMSwxLDAsOTAsOCwwLDEwMSw3LDAsMTAwLAotICAgIDE1LDAsMTAwLDE2LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDEwLDAsMTAxLDcsCi0gICAgMCwxMDAsMTcsMCwxMDAsMTgsMCwxMzIsMCwwLDEzMSwxLDAsOTAsMTEsMCwKLSAgICAxMDEsMTEsMCwxMDYsOSwwLDEwMCwxOSwwLDEwMCwxOCwwLDEzMiwwLDAsMTMxLAotICAgIDEsMCw5MCwxMSwwLDEwMCwzLDAsODMsNDEsMjAsMjE4LDEwLDc3LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw5NywyMDgsNSwwLDAsODQsMTA0LDEwMSwzMiwKLSAgICAxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTAyLDExMSwKLSAgICAxMTQsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTE3LDExNSwxMDEsMTAwLAotICAgIDMyLDEwMiwxMTEsMTE0LDMyLDEwOCwxMTEsOTcsMTAwLDEwNSwxMTAsMTAzLDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDY1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTUsMTEyLAotICAgIDEwMSw5OSwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgMzIsMTAyLDExMSwxMTQsMzIsMTA1LDExMCwxMDIsMTExLDExNCwxMDksOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDMyLDk3LDk4LDExMSwxMTcsMTE2LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDQ2LDMyLDMyLDcwLDExMSwxMTQsMTAsMzIsMzIsMzIsMzIsMTAwLDk3LDExNiw5NywKLSAgICAzMiw5NywxMTUsMTE1LDExMSw5OSwxMDUsOTcsMTE2LDEwMSwxMDAsMzIsMTE5LDEwNSwxMTYsMTA0LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDEwNSwxMTAsOTksCi0gICAgMTA4LDExNywxMDAsMTA1LDExMCwxMDMsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw0NCwzMiwxMTcsCi0gICAgMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwzOSwxMTUsMTAsMzIsMzIsCi0gICAgMzIsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NiwKLSAgICAxMTAsOTcsMTA5LDEwMSw5NiwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDk3LDk4LDExNSwKLSAgICAxMTEsMTA4LDExNywxMTYsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMzIsMzIsOTYsMTA4LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCw5NiwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsMTAsMzIsMzIsMzIsMzIsMTE2LDExMSwzMiwxMTcsMTE1LDEwMSwzMiwxMTksMTA0LDEwMSwKLSAgICAxMTAsMzIsMTA4LDExMSw5NywxMDAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsNDYsMzIsMzIsOTYsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NiwzMiwKLSAgICAxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsMzIsMTE2LAotICAgIDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsMTA1LDExMCw0NiwKLSAgICAzMiwzMiw4NCwxMDQsMTAxLDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsMzIsMTA1LDExNSwzMiwKLSAgICAxMDAsMTAxLDExNCwxMDUsMTE4LDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDExMCw5NywxMDksMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk2LDEwNSwxMTUsOTUsCi0gICAgMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk2LDMyLDEwMCwxMDEsMTE2LDEwMSwxMTQsMTA5LDEwNSwKLSAgICAxMTAsMTAxLDExNSwzMiwxMDUsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDMyLDEwNSwxMTUsMzIsOTksMTExLDExMCwxMTUsMTA1LDEwMCwxMDEsMTE0LDEwMSwxMDAsMzIsCi0gICAgOTcsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDExMSwxMTQsMTAsMzIsMzIsMzIsCi0gICAgMzIsMTEwLDExMSwxMTYsNDYsMzIsMzIsNzksMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNSwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA1LDExNSwzMiwxMTQsMTAxLDEwMiwxMDgsMTAxLDk5LAotICAgIDExNiwxMDEsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiw5Niw5NSw5NSwxMTIsOTcsCi0gICAgMTE2LDEwNCw5NSw5NSw5NiwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsNDYsCi0gICAgMTAsMTAsMzIsMzIsMzIsMzIsOTYsMTExLDExNCwxMDUsMTAzLDEwNSwxMTAsOTYsMzIsMTA1LAotICAgIDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSw5OSwzMiwxMDgsCi0gICAgMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsOTgsMTIxLDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTAyLDExNCwxMTEsMTA5LDMyLAotICAgIDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDEwOCwxMTEsOTcsCi0gICAgMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDEwNSwxMDIsCi0gICAgMzIsMTE2LDEwNCw5NywxMTYsMzIsMTA1LDExMCwxMDIsMTExLDExNCwxMDksOTcsMTE2LDEwNSwxMTEsCi0gICAgMTEwLDMyLDEwNSwxMTUsMzIsOTcsMTE4LDk3LDEwNSwxMDgsOTcsOTgsMTA4LDEwMSw0NiwzMiwKLSAgICAzMiw4NywxMDQsMTAxLDExMCwzMiwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMzIsMTA1LAotICAgIDExNSwxMCwzMiwzMiwzMiwzMiwxMTUsMTAxLDExNiw0NCwzMiwxMTEsMTE0LDEwNSwxMDMsMTA1LAotICAgIDExMCwzMiwxMTksMTA1LDEwOCwxMDgsMzIsMTA5LDk3LDExNiw5OSwxMDQsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsOTYsMTA0LDk3LDExNSw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwKLSAgICA5NiwzMiwxMDUsMTEwLDEwMCwxMDUsOTksOTcsMTE2LDEwMSwxMTUsMzIsMTE2LDEwNCw5NywxMTYsCi0gICAgMzIsOTcsMzIsMTE1LDExMiwxMDEsOTksMzksMTE1LDMyLDM0LDExMSwxMTQsMTA1LDEwMywxMDUsCi0gICAgMTEwLDM0LDMyLDExNCwxMDEsMTAyLDEwOCwxMDEsOTksMTE2LDExNSwzMiw5NywzMiwxMDgsMTExLAotICAgIDk5LDk3LDExNiwxMDUsMTExLDExMCw0NiwxMCwzMiwzMiwzMiwzMiw4NywxMDQsMTAxLDExMCwKLSAgICAzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA1LDExNSwzMiw4NCwxMTQsMTE3LDEwMSw0NCwzMiw5NiwKLSAgICA5NSw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsOTUsOTYsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LAotICAgIDExNywxMTYsMTAxLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMzIsMTA1LDExNSwzMiwxMTUsMTAxLDExNiw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NiwKLSAgICA5OSw5Nyw5OSwxMDQsMTAxLDEwMCw5NiwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwKLSAgICAxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsOTksCi0gICAgOTcsOTksMTA0LDEwMSwxMDAsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLAotICAgIDEwNSwxMDgsMTAxLDQ0LDMyLDEwNSwxMDIsMzIsOTcsMTEwLDEyMSw0NiwzMiwzMiw3MywxMTYsCi0gICAgMTAsMzIsMzIsMzIsMzIsOTksMTExLDExNCwxMTQsMTAxLDExNSwxMTIsMTExLDExMCwxMDAsMTE1LAotICAgIDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsOTYsOTUsOTUsOTksOTcsOTksMTA0LDEwMSwKLSAgICAxMDAsOTUsOTUsOTYsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsMTAxLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDk2LDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsCi0gICAgMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSwKLSAgICA5NiwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMDEsMTEzLDExNywxMDEsMTEwLDk5LAotICAgIDEwMSwzMiwxMTEsMTAyLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMSwxMTAsMTE2LDExNCwxMDUsMTAxLAotICAgIDExNSwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDExNSwxMDEsOTcsMTE0LDk5LDEwNCwzMiwKLSAgICAxMTksMTA0LDEwMSwxMTAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA1LDExMCwxMDMsMzIsMTE1LAotICAgIDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDYsMzIsMzIsNzMsMTAyLDMyLDExNSwKLSAgICAxMDEsMTE2LDQ0LDMyLDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDExNSwKLSAgICAxMDQsMTExLDExNywxMDgsMTAwLDMyLDk4LDEwMSwxMCwzMiwzMiwzMiwzMiw4NCwxMTQsMTE3LAotICAgIDEwMSw0NSw0NSw5NywxMTAsMTAwLDMyLDcwLDk3LDEwOCwxMTUsMTAxLDMyLDExMSwxMTYsMTA0LAotICAgIDEwMSwxMTQsMTE5LDEwNSwxMTUsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDgwLDk3LDk5LAotICAgIDEwNyw5NywxMDMsMTAxLDExNSwzMiw5NywxMTQsMTAxLDMyLDExNSwxMDUsMTA5LDExMiwxMDgsMTIxLAotICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMTYsMTA0LDk3LDExNiwzMiw0MCwxMDksCi0gICAgOTcsMTIxLDQxLDMyLDEwNCw5NywxMTgsMTAxLDMyLDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsMTE1LDQ2LDMyLDMyLDczLDEwMiwzMiw5NywzMiwxMTUsMTEyLDEwMSw5OSwxMCwKLSAgICAzMiwzMiwzMiwzMiwxMDQsOTcsMTE1LDMyLDk3LDMyLDExMCwxMTEsMTEwLDQ1LDc4LDExMSwKLSAgICAxMTAsMTAxLDMyLDExOCw5NywxMDgsMTE3LDEwMSwzMiwxMDUsMTEwLDMyLDk2LDExNSwxMTcsOTgsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsCi0gICAgOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSw5Niw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LAotICAgIDExMiwxMTEsMTE0LDExNiwxMCwzMiwzMiwzMiwzMiwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSwzMiwKLSAgICAxMTksMTA1LDEwOCwxMDgsMzIsOTksMTExLDExMCwxMTUsMTA1LDEwMCwxMDEsMTE0LDMyLDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLAotICAgIDEwOSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwzMiw5NywxMTUsMzIsMTEyLDk3LAotICAgIDk5LDEwNyw5NywxMDMsMTAxLDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OSwxMTAsMTA4LAotICAgIDEyMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTUsMzIsNDAsMTE1LDEwMSwxMDEsMzIsMTA1LAotICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCw0Niw5Nyw5OCw5OSw0Niw3NywxMDEsMTE2LAotICAgIDk3LDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwzMiw5NywxMTAsMTAwLDEwLAotICAgIDMyLDMyLDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsNDYsOTcsOTgsCi0gICAgOTksNDYsODAsOTcsMTE2LDEwNCw2OSwxMTAsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLAotICAgIDExNCw0MSwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMDksMTExLDEwMCwxMDUsMTAyLDEyMSwKLSAgICAzMiw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksMzIsMTA1LDExMCwxMTUsMTE2LAotICAgIDk3LDExMCw5OSwxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDIxOCw2LDExMSwxMTQsCi0gICAgMTA1LDEwMywxMDUsMTEwLDc4LDIxOCwxMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LDExNSwxMTYsCi0gICAgOTcsMTE2LDEwMSwyMTgsMTAsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTksCi0gICAgMywwLDAsMCwzLDAsMCwwLDYsMCwwLDAsMiwwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsNzksMCwwLDAsMTI0LDEsMCwxMjQsMCwwLDk1LAotICAgIDAsMCwxMjQsMiwwLDEyNCwwLDAsOTUsMSwwLDEyNCwzLDAsMTI0LDAsCi0gICAgMCw5NSwyLDAsMTI0LDQsMCwxMjQsMCwwLDk1LDMsMCwxMjQsNSwwLAotICAgIDExNCw0OCwwLDEwMywwLDAsMTEwLDMsMCwxMDAsMCwwLDEyNCwwLDAsOTUsCi0gICAgNCwwLDEwMCwxLDAsMTI0LDAsMCw5NSw1LDAsMTAwLDAsMCwxMjQsMCwKLSAgICAwLDk1LDYsMCwxMDAsMCwwLDgzLDQxLDIsNzgsNzAsNDEsNywxMTQsMTUsCi0gICAgMCwwLDAsMTE0LDk5LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEwOCwwLAotICAgIDAsMCwyMTgsMjYsMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLAotICAgIDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LDIxOCwxMywKLSAgICA5NSwxMTUsMTAxLDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsOTcsMTE2LDExNiwxMTQsMjE4LDcsOTUsCi0gICAgOTksOTcsOTksMTA0LDEwMSwxMDAsNDEsNiwxMTQsMTksMCwwLDAsMTE0LDE1LDAsCi0gICAgMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDEwOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLAotICAgIDExNCwxMSwwLDAsMCwxMTQsMjAsMCwwLDAsMTE2LDEsMCwwLDExNSwxNCwKLSAgICAwLDAsMCwwLDIsOSwxLDksMSw5LDEsOSwxLDIxLDMsOSwKLSAgICAxLDEyMiwxOSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksNDYsOTUsOTUsCi0gICAgMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwyLAotICAgIDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDE0NywwLDAsMCwKLSAgICAxMDAsMSwwLDEwNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwxLDAsMTAwLAotICAgIDIsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDIsMCwxMzEsMSwwLDEwMywyLAotICAgIDAsMTI1LDEsMCwxMjQsMCwwLDEwNiwzLDAsMTAwLDAsMCwxMDcsOSwwLAotICAgIDExNCw3NiwwLDEyNCwxLDAsMTA2LDQsMCwxMDAsMywwLDEwNiwwLDAsMTI0LAotICAgIDAsMCwxMDYsMywwLDEzMSwxLDAsMTMxLDEsMCwxLDEyNCwwLDAsMTA2LAotICAgIDUsMCwxMDAsMCwwLDEwNyw5LDAsMTE0LDExNiwwLDEyNCwxLDAsMTA2LDQsCi0gICAgMCwxMDAsNCwwLDEwNiwwLDAsMTI0LDAsMCwxMDYsNSwwLDEzMSwxLDAsCi0gICAgMTMxLDEsMCwxLDEwMCw1LDAsMTA2LDAsMCwxMjQsMCwwLDEwNiw2LDAsCi0gICAgMTA2LDcsMCwxMDAsNiwwLDEwNiw4LDAsMTI0LDEsMCwxMzEsMSwwLDEzMSwKLSAgICAyLDAsODMsNDEsNyw3OCwxMjIsOSwxMTAsOTcsMTA5LDEwMSw2MSwxMjMsMzMsMTE0LAorICAgIDAsMTE1LDE0LDAsMCwwLDEyNCwwLDEwNiwwLDEwNiwxLDEzMSwwLDEsMCwKKyAgICAxMDAsMCw4MywwLDQxLDEsNzgsNDEsMiwxMTQsNDQsMCwwLDAsMTE0LDM1LAorICAgIDAsMCwwLDQxLDMsMTE0LDI2LDAsMCwwLDIxOCw0LDk3LDExNCwxMDMsMTE1LAorICAgIDkwLDYsMTA3LDExOSw5NywxMTQsMTAzLDExNSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMSwwLDAsMCwyMTgsOCw5NSw5NSwxMDEsMTIwLDEwNSwxMTYsOTUsCisgICAgOTUsMTUzLDAsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjcsOTUsNzcsCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLDExNCwKKyAgICA0Niw5NSw5NSwxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNzgsNDEsNiwxMTQsMSwwLDAsCisgICAgMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMjcsMCwwLDAsCisgICAgMTE0LDQ4LDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDQyLAorICAgIDAsMCwwLDE0MCwwLDAsMCwxMTUsNiwwLDAsMCw4LDIsOCw0LAorICAgIDgsNywxMTQsNDIsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLAorICAgIDMsMCwwLDAsMTEsMCwwLDAsMywwLDAsMCwxMTUsMTA2LDAsMCwKKyAgICAwLDEwMCwxLDEyNSwxLDEyMSwxNCwxMTYsMCwxMzYsMCwyNSwwLDEzMSwwLDEyNSwKKyAgICAxLDg3LDAsMTEwLDIwLDQsMCwxMTYsMSwxMDcsMTAsMTE0LDM4LDEsMCwxLAorICAgIDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMjQsMSwxMDAsMSwxMDcsOCwxMTQsCisgICAgMTAyLDExNiwyLDEwMCwxLDEwNyw4LDExNCw2NiwxMTYsMywxMzYsMCwxMzEsMSwxMjUsCisgICAgMSwxMTAsOCwxMTYsNCwxMzYsMCwxMzEsMSwxMjUsMSwxMzUsMCwxMDIsMSwxMDAsCisgICAgMiwxMDAsMywxMzIsOCwxMjUsMiwxMTYsNSwxMDYsNiwxMjQsMSwxMjQsMiwxMzEsCisgICAgMiwxMTYsMCwxMzYsMCw2MCwwLDEyNCwxLDgzLDAsNDEsNCwxMjIsMTA5LDcxLAorICAgIDEwMSwxMTYsMzIsMTExLDExNCwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTAyLDExMSwxMTQsCisgICAgMzIsOTcsMzIsMTAzLDEwNSwxMTgsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKKyAgICAxMTAsOTcsMTA5LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4MywxMDQsMTExLDExNywxMDgsCisgICAgMTAwLDMyLDExMSwxMTAsMTA4LDEyMSwzMiw5OCwxMDEsMzIsOTksOTcsMTA4LDEwOCwxMDEsMTAwLAorICAgIDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICAzMiwxMDgsMTExLDk5LDEwNywzMiwxMTYsOTcsMTA3LDEwMSwxMTAsNDYsNzgsOTksMSwwLAorICAgIDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCwxOSwwLAorICAgIDAsMCwxMTUsMTAsMCwwLDAsMTE2LDAsMTM2LDAsNjEsMCwxMDAsMCw4MywKKyAgICAwLDQxLDEsNzgsNDEsMSwyMTgsMTMsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsCisgICAgMTA4LDExMSw5OSwxMDcsMTE1LDQxLDEsMjE4LDEsOTUsNDEsMSwxMTQsMTUsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMiw5OSw5OCwxNzMsCisgICAgMCwwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyOCw5NSwxMDMsMTAxLDExNiwKKyAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMDgsMTExLDk5LDEwNyw0Niw2MCwxMDgsMTExLAorICAgIDk5LDk3LDEwOCwxMTUsNjIsNDYsOTksOTgsNDEsNywxMTQsNTEsMCwwLDAsMjE4LAorICAgIDgsNzUsMTAxLDEyMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDIwLDAsMCwwLDExNCw0MSwKKyAgICAwLDAsMCwxMTQsMTgsMCwwLDAsMjE4LDgsOTUsMTE5LDEwMSw5NywxMDcsMTE0LAorICAgIDEwMSwxMDIsOTAsMywxMTQsMTAxLDEwMiw0MSwzLDExNCwxNSwwLDAsMCwxMTQsMjEsCisgICAgMCwwLDAsMTE0LDUzLDAsMCwwLDExNCwxMCwwLDAsMCw0MSwxLDExNCwKKyAgICAxNSwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDQ1LDAsMCwwLDE1OSwwLAorICAgIDAsMCwxMTUsMjQsMCwwLDAsMCw0LDQsMSwyLDEsMTQsMSwxNCwKKyAgICAxLDYsMSw4LDEsOCwxLDEwLDIsOCwxLDEyLDIsMTYsMSwxMTQsCisgICAgNDUsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLAorICAgIDAsMTEsMCwwLDAsNjcsMCwwLDAsMTE1LDYyLDAsMCwwLDExNiwwLAorICAgIDEyNCwwLDEzMSwxLDEyNSwxLDExNiwxLDEwNiwyLDEzMSwwLDEsMCwxMjEsMTIsCisgICAgMTI0LDEsMTA2LDMsMTMxLDAsMSwwLDg3LDAsMTEwLDIwLDQsMCwxMTYsNCwKKyAgICAxMDcsMTAsMTE0LDQ4LDEsMCwxLDAsMSwwLDg5LDAsMTEwLDEwLDg4LDAsCisgICAgMTI0LDEsMTA2LDUsMTMxLDAsMSwwLDEwMCwxLDgzLDAsNDEsMiw5NywyMSwKKyAgICAxLDAsMCw4MiwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwMywKKyAgICAxMDgsMTExLDk4LDk3LDEwOCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LAorICAgIDEwNyw0NCwzMiw5NywxMTAsMTAwLDMyLDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDMyLAorICAgIDExNiwxMDQsMTAxLDExMCwzMiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwKKyAgICAxMCwzMiwzMiwzMiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDgsMTExLDk5LDEwNywKKyAgICAzMiwxMDIsMTExLDExNCwzMiw5NywzMiwxMDMsMTA1LDExOCwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDQ2LDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwKKyAgICAxMDUsMTE1LDMyLDEwNSwxMTUsMzIsMTE3LDExNSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTAxLDExMCwKKyAgICAxMTUsMTE3LDExNCwxMDEsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwKKyAgICAzMiw5OSwxMTEsMTA5LDExMiwxMDgsMTAxLDExNiwxMDEsMTA4LDEyMSwzMiwxMDUsMTEwLDEwNSwxMTYsCisgICAgMTA1LDk3LDEwOCwxMDUsMTIyLDEwMSwxMDAsNDQsMzIsMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwxMCwKKyAgICAzMiwzMiwzMiwzMiwxMDEsMTE4LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTYsMzIsMTA1LDExNSwzMiwKKyAgICA5OCwxMDEsMTA1LDExMCwxMDMsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwzMiw5OCwKKyAgICAxMjEsMzIsOTcsMTEwLDExMSwxMTYsMTA0LDEwMSwxMTQsMzIsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw4MywxMDQsMTExLDExNywxMDgsMTAwLDMyLDExMSwxMTAsCisgICAgMTA4LDEyMSwzMiw5OCwxMDEsMzIsOTksOTcsMTA4LDEwOCwxMDEsMTAwLDMyLDExOSwxMDUsMTE2LAorICAgIDEwNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LAorICAgIDEwNywzMiwxMTYsOTcsMTA3LDEwMSwxMTAsNDYsNzgsNDEsNiwxMTQsNDUsMCwwLDAsCisgICAgMTE0LDQ2LDAsMCwwLDExNCw0NywwLDAsMCwxMTQsMzQsMCwwLDAsMTE0LAorICAgIDE3LDAsMCwwLDExNCwzNSwwLDAsMCw0MSwyLDExNCwxNSwwLDAsMCwKKyAgICAxMTQsMjEsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMjE4LDE5LDk1LDEwOCwxMTEsOTksMTA3LDk1LDExNywxMTAsMTA4LDExMSwKKyAgICA5OSwxMDcsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTc4LDAsMCwwLDExNSwxNCwwLAorICAgIDAsMCwwLDcsOCwxLDgsMSwyLDEsMTIsMSwxNCwzLDYsMiwKKyAgICAxMTQsNTYsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwKKyAgICAwLDAsMywwLDAsMCw3OSwwLDAsMCwxMTUsMTQsMCwwLDAsMTI0LAorICAgIDAsMTI0LDEsMTUyLDEsMTI0LDIsMTUxLDEsMTQyLDEsODMsMCw0MSwxLDk3LAorICAgIDQ2LDEsMCwwLDExNCwxMDEsMTA5LDExMSwxMTgsMTAxLDk1LDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDEwOCwxMDUsOTgsOTUsMTAyLDExNCw5NywxMDksMTAxLDExNSwzMiwxMDUsMTEwLDMyLDEwNSwKKyAgICAxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDk5LDMyLDExOSwxMDUsMTA4LDEwOCwzMiw5NywxMDgsMTE5LAorICAgIDk3LDEyMSwxMTUsMzIsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMzIsMTE1LDEwMSwxMTMsMTE3LDEwMSwKKyAgICAxMTAsOTksMTAxLDExNSwxMCwzMiwzMiwzMiwzMiwxMTEsMTAyLDMyLDEwNSwxMDksMTEyLDExMSwKKyAgICAxMTQsMTE2LDEwOCwxMDUsOTgsMzIsMTAyLDExNCw5NywxMDksMTAxLDExNSwzMiwxMTYsMTA0LDk3LAorICAgIDExNiwzMiwxMDEsMTEwLDEwMCwzMiwxMTksMTA1LDExNiwxMDQsMzIsOTcsMzIsOTksOTcsMTA4LAorICAgIDEwOCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LAorICAgIDExMSwxMTAsMTAsMTAsMzIsMzIsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDUsMTE2LDMyLDEwNSwKKyAgICAxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDMyLDExMSwxMDIsMzIsOTcsMzIsMTEwLDExMSwxMTQsMTA5LAorICAgIDk3LDEwOCwzMiw5OSw5NywxMDgsMTA4LDMyLDEwNSwxMTAsMzIsMTEyLDEwOCw5Nyw5OSwxMDEsCisgICAgMTE1LDMyLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDExMCw5OSwxMDgsMTE3LDEwMCwxMDUsMTEwLAorICAgIDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDEwLAorICAgIDMyLDMyLDMyLDMyLDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsMzIsMTA1LDExMCwxMTYsMTE0LDExMSwKKyAgICAxMDAsMTE3LDk5LDEwMSwxMTUsMzIsMTE3LDExMCwxMTksOTcsMTEwLDExNiwxMDEsMTAwLDMyLDExMCwKKyAgICAxMTEsMTA1LDExNSwxMDEsMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDExNiwxMTQsCisgICAgOTcsOTksMTAxLDk4LDk3LDk5LDEwNywzMiw0MCwxMDEsNDYsMTAzLDQ2LDMyLDExOSwxMDQsCisgICAgMTAxLDExMCwzMiwxMDEsMTIwLDEwMSw5OSwxMTcsMTE2LDEwNSwxMTAsMTAzLDEwLDMyLDMyLDMyLAorICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQxLDEwLDMyLDMyLAorICAgIDMyLDMyLDExNCwxMCwwLDAsMCw0MSwzLDIxOCwxLDEwMiwxMTQsNDksMCwwLAorICAgIDAsOTAsNCwxMDcsMTE5LDEwMCwxMTUsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCisgICAgMCwxMTQsMTEsMCwwLDAsMjE4LDI1LDk1LDk5LDk3LDEwOCwxMDgsOTUsMTE5LDEwNSwKKyAgICAxMTYsMTA0LDk1LDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsOTUsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsCisgICAgMTAwLDE5NywwLDAsMCwxMTUsMiwwLDAsMCwwLDgsMTE0LDU4LDAsMCwKKyAgICAwLDExNCwzMywwLDAsMCw0MSwxLDIxOCw5LDExOCwxMDEsMTE0LDk4LDExMSwxMTUsCisgICAgMTA1LDExNiwxMjEsOTksMSwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsCisgICAgNSwwLDAsMCw3MSwwLDAsMCwxMTUsNTYsMCwwLDAsMTE2LDAsMTA2LAorICAgIDEsMTA2LDIsMTI0LDEsMTA3LDUsMTE0LDUyLDEyNCwwLDEwNiwzLDEwMCw2LDEzMSwKKyAgICAxLDExNSwzMCwxMDAsMywxMjQsMCwyMywwLDEyNSwwLDExNiw0LDEyNCwwLDEwNiwKKyAgICA1LDEyNCwyLDE1MiwxLDE0MiwwLDExNiwwLDEwNiw2LDEwMCw0LDE0MSwyLDEsCisgICAgMCwxMDAsNSw4MywwLDQxLDcsMTIyLDYxLDgwLDExNCwxMDUsMTEwLDExNiwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwzMiwxMTYsMTExLDMyLDExNSwxMTYsCisgICAgMTAwLDEwMSwxMTQsMTE0LDMyLDEwNSwxMDIsMzIsNDUsMTE4LDQ3LDgwLDg5LDg0LDcyLDc5LAorICAgIDc4LDg2LDY5LDgyLDY2LDc5LDgzLDY5LDMyLDEwNSwxMTUsMzIsMTE2LDExNywxMTQsMTEwLAorICAgIDEwMSwxMDAsMzIsMTExLDExMCw0NiwyNTAsMSwzNSwyNTAsNywxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiwzMiwxMjIsMiwzNSwzMiw0MSwxLDkwLDQsMTAyLDEwNSwxMDgsMTAxLDc4LDQxLAorICAgIDIsMTE0LDYwLDAsMCwwLDExNCw2MSwwLDAsMCw0MSw3LDExNCwxNCwwLAorICAgIDAsMCwyMTgsNSwxMDIsMTA4LDk3LDEwMywxMTUsMjE4LDcsMTE4LDEwMSwxMTQsOTgsMTExLAorICAgIDExNSwxMDEsMjE4LDEwLDExNSwxMTYsOTcsMTE0LDExNiwxMTUsMTE5LDEwNSwxMTYsMTA0LDIxOCw1LAorICAgIDExMiwxMTQsMTA1LDExMCwxMTYsMTE0LDM4LDAsMCwwLDIxOCw2LDExNSwxMTYsMTAwLDEwMSwKKyAgICAxMTQsMTE0LDQxLDMsMjE4LDcsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMTE0LDU5LDAsCisgICAgMCwwLDExNCw0OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMSwwLDAsMCwyMTgsMTYsOTUsMTE4LDEwMSwxMTQsOTgsMTExLDExNSwxMDEsCisgICAgOTUsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMjA4LDAsMCwwLDExNSw4LDAsMCwKKyAgICAwLDAsMiwxMiwxLDEwLDEsOCwxLDExNCw2OCwwLDAsMCw5OSwxLAorICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDMsCisgICAgMCwwLDAsMTE1LDI2LDAsMCwwLDEzNSwwLDEwMiwxLDEwMCwxLDEwMCwyLAorICAgIDEzMiw4LDEyNSwxLDExNiwwLDEyNCwxLDEzNiwwLDEzMSwyLDEsMCwxMjQsMSwKKyAgICA4MywwLDQxLDMsMTIyLDQ5LDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LDMyLAorICAgIDExNiwxMTEsMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LAorICAgIDEwOSwxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTgsMTE3LAorICAgIDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsNDYsOTksMiwwLDAsMCwwLDAsMCwwLAorICAgIDIsMCwwLDAsNCwwLDAsMCwxOSwwLDAsMCwxMTUsMzgsMCwwLAorICAgIDAsMTI0LDEsMTE2LDAsMTA2LDEsMTA3LDcsMTE0LDI4LDExNiwyLDEwMCwxLDEwNiwKKyAgICAzLDEyNCwxLDEzMSwxLDEyNCwxLDEwMCwyLDE0MSwyLDEzMCwxLDEzNiwwLDEyNCwKKyAgICAwLDEyNCwxLDEzMSwyLDgzLDAsNDEsMyw3OCwxMjIsMjksMTIzLDMzLDExNCwxMjUsCisgICAgMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsCisgICAgMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MSwxLDExNCwxNSwwLDAsMCwKKyAgICA0MSw0LDExNCwxNCwwLDAsMCwyMTgsMjAsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsCisgICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDIxOCwxMSw3MywKKyAgICAxMDksMTEyLDExMSwxMTQsMTE2LDY5LDExNCwxMTQsMTExLDExNCwxMTQsMzgsMCwwLDAsNDEsCisgICAgMiwxMTQsMjYsMCwwLDAsMjE4LDgsMTAyLDExNywxMDgsMTA4LDExMCw5NywxMDksMTAxLAorICAgIDQxLDEsMjE4LDMsMTAyLDEyMCwxMTAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsCisgICAgMCwyMTgsMjUsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSw5OCwxMTcsMTA1LAorICAgIDEwOCwxMTYsMTA1LDExMCw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCwyMTgsMCwwLDAsCisgICAgMTE1LDgsMCwwLDAsMCwxLDEwLDEsMTAsMSw4LDEsMTIyLDUyLDk1LAorICAgIDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsCisgICAgNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LDExNCwxMDEsMTEzLDExNywxMDUsCisgICAgMTE0LDEwMSwxMTUsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTE5LDExNCw5NywxMTIsCisgICAgMTEyLDEwMSwxMTQsNDEsMSwxMTQsMTIsMCwwLDAsNDEsMiwxMTQsNzIsMCwwLAorICAgIDAsMTE0LDczLDAsMCwwLDExNCwxMCwwLDAsMCw0MSwxLDExNCw3MiwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE3LDk1LDExNCwxMDEsMTEzLDExNywxMDUsMTE0LAorICAgIDEwMSwxMTUsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsMjE2LDAsMCwwLDExNSw2LAorICAgIDAsMCwwLDAsMiwxMiw1LDEwLDEsMTE0LDc0LDAsMCwwLDk5LDEsCisgICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsMywKKyAgICAwLDAsMCwxMTUsMjYsMCwwLDAsMTM1LDAsMTAyLDEsMTAwLDEsMTAwLDIsCisgICAgMTMyLDgsMTI1LDEsMTE2LDAsMTI0LDEsMTM2LDAsMTMxLDIsMSwwLDEyNCwxLAorICAgIDgzLDAsNDEsMywxMjIsNDcsNjgsMTAxLDk5LDExMSwxMTQsOTcsMTE2LDExMSwxMTQsMzIsCisgICAgMTE2LDExMSwzMiwxMTgsMTAxLDExNCwxMDUsMTAyLDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMTAsOTcsCisgICAgMTA5LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiwxMDIsMTE0LAorICAgIDExMSwxMjIsMTAxLDExMCw0Niw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLAorICAgIDAsMCw0LDAsMCwwLDE5LDAsMCwwLDExNSwzOCwwLDAsMCwxMTYsCisgICAgMCwxMDYsMSwxMjQsMSwxMzEsMSwxMTUsMjgsMTE2LDIsMTAwLDEsMTA2LDMsMTI0LAorICAgIDEsMTMxLDEsMTI0LDEsMTAwLDIsMTQxLDIsMTMwLDEsMTM2LDAsMTI0LDAsMTI0LAorICAgIDEsMTMxLDIsODMsMCw0MSwzLDc4LDEyMiwyNywxMjMsMzMsMTE0LDEyNSwzMiwxMDUsCisgICAgMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDQxLDEsMTE0LDE1LDAsMCwwLDQxLDQsMTE0LDQ2LAorICAgIDAsMCwwLDIxOCw5LDEwNSwxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMTE0LDcwLAorICAgIDAsMCwwLDExNCwzOCwwLDAsMCw0MSwyLDExNCwyNiwwLDAsMCwxMTQsCisgICAgNzEsMCwwLDAsNDEsMSwxMTQsNzIsMCwwLDAsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMSwwLDAsMCwyMTgsMjQsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwKKyAgICA5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCwyMjksCisgICAgMCwwLDAsMTE1LDgsMCwwLDAsMCwxLDEwLDEsMTAsMSw4LDEsCisgICAgMTIyLDUwLDk1LDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsOTUsMTAyLDExNCwxMTEsMTIyLAorICAgIDEwMSwxMTAsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LDExNCwxMDEsMTEzLAorICAgIDExNywxMDUsMTE0LDEwMSwxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTE5LDExNCw5NywKKyAgICAxMTIsMTEyLDEwMSwxMTQsNDEsMSwxMTQsMTIsMCwwLDAsNDEsMiwxMTQsNzIsMCwKKyAgICAwLDAsMTE0LDc2LDAsMCwwLDExNCwxMCwwLDAsMCw0MSwxLDExNCw3MiwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE2LDk1LDExNCwxMDEsMTEzLDExNywxMDUsCisgICAgMTE0LDEwMSwxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMjI3LDAsMCwwLDExNSw2LAorICAgIDAsMCwwLDAsMiwxMiw1LDEwLDEsMTE0LDc3LDAsMCwwLDk5LDIsCisgICAgMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDY0LDAsMCwwLDExNiwwLDEyNCwxLDEyNCwwLDEzMSwyLAorICAgIDEyNSwyLDEyNCwxLDExNiwxLDEwNiwyLDEwNyw2LDExNCw1MiwxMTYsMSwxMDYsMiwKKyAgICAxMjQsMSwyNSwwLDEyNSwzLDExNiwzLDEyNCwyLDEyNCwzLDEzMSwyLDEsMCwKKyAgICAxMTYsMSwxMDYsMiwxMjQsMSwyNSwwLDgzLDAsMTEwLDgsMTE2LDQsMTI0LDIsCisgICAgMTMxLDEsODMsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDEyOCw3NiwxMTEsOTcsMTAwLAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsCisgICAgMTEwLDMyLDEwNSwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsCisgICAgMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LAorICAgIDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLAorICAgIDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTEwLAorICAgIDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCw0MSw1LDIxOCwKKyAgICAxNiwxMTUsMTEyLDEwMSw5OSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTA4LDExMSw5NywxMDAsMTAxLAorICAgIDExNCwxMTQsMTQsMCwwLDAsMjE4LDcsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDIxOCwKKyAgICA1LDk1LDEwMSwxMjAsMTAxLDk5LDIxOCw1LDk1LDEwOCwxMTEsOTcsMTAwLDQxLDQsMTE0LAorICAgIDI2LDAsMCwwLDExNCw3MSwwLDAsMCwyMTgsNCwxMTUsMTEyLDEwMSw5OSwyMTgsCisgICAgNiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMSwwLDAsMCwyMTgsMTcsOTUsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwNCwxMDUsMTA5LDIzOSwwLDAsMCwxMTUsMTIsMCwKKyAgICAwLDAsMCw2LDEwLDEsMTAsMSwxMCwxLDEwLDEsMTIsMiwxMTQsODQsCisgICAgMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsCisgICAgMzUsMCwwLDAsNjcsMCwwLDAsMTE1LDIxOCwwLDAsMCwxMTYsMCwxMjQsCisgICAgMCwxMDAsMSwxMDAsMCwxMzEsMywxMjUsMSwxMTYsMSwxMjQsMSwxMDAsMiwxMzEsCisgICAgMiwxMTQsNTQsMTIxLDEwLDEyNCwxLDEwNiwyLDEyNCwwLDEzMSwxLDgzLDAsNCwKKyAgICAwLDExNiwzLDEwNywxMCwxMTQsNTIsMSwwLDEsMCwxLDAsODksMCwxMTAsCisgICAgMiw4OCwwLDEyMSwxMCwxMjQsMCwxMDYsNCwxMjUsMiw4NywwLDExMCwyMCw0LAorICAgIDAsMTE2LDUsMTA3LDEwLDExNCw4NCwxLDAsMSwwLDEsMCw4OSwwLDExMCwKKyAgICAxOCw4OCwwLDEyNCwyLDEwMCwwLDEwNyw5LDExNCwxMDIsMTE2LDYsMTI0LDIsMTMxLAorICAgIDEsODMsMCwxMjEsMTAsMTI0LDAsMTA2LDcsMTI1LDMsODcsMCwxMTAsMjQsNCwKKyAgICAwLDExNiw1LDEwNywxMCwxMTQsMTM2LDEsMCwxLDAsMSwwLDEwMCwzLDEyNSwKKyAgICAzLDg5LDAsMTEwLDIsODgsMCwxMjEsMTAsMTI0LDAsMTA2LDgsMTI1LDQsODcsCisgICAgMCwxMTAsNTIsNCwwLDExNiw1LDEwNywxMCwxMTQsMjAwLDEsMCwxLDAsMSwKKyAgICAwLDEyNCwxLDEwMCwwLDEwNyw4LDExNCwxODQsMTAwLDQsMTA2LDksMTI0LDMsMTMxLAorICAgIDEsODMsMCwxMTAsMTIsMTAwLDUsMTA2LDksMTI0LDMsMTI0LDEsMTMxLDIsODMsCisgICAgMCw4OSwwLDExMCwxNCw4OCwwLDEwMCw2LDEwNiw5LDEyNCwzLDEyNCw0LDEzMSwKKyAgICAyLDgzLDAsMTAwLDAsODMsMCw0MSw3LDc4LDIxOCwxMCw5NSw5NSwxMDgsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDk1LDk1LDIxOCwxMSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsCisgICAgMTAxLDExMiwxMTQsMjUwLDEsNjMsMTIyLDEzLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAorICAgIDEyMywzMywxMTQsMTI1LDYyLDEyMiwyMCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsCisgICAgMzMsMTE0LDEyNSwzMiw0MCwxMjMsMzMsMTE0LDEyNSw0MSw2MiwxMjIsMjMsNjAsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywKKyAgICAzMywxMTQsMTI1LDYyLDQxLDEwLDExNCw2LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw4NiwwLDAsMCwyMTgsOSw2OSwxMjAsOTksMTAxLDExMiwxMTYsMTA1LDExMSwxMTAsCisgICAgMjE4LDgsOTUsOTUsMTE1LDExMiwxMDEsOTksOTUsOTUsMjE4LDE0LDY1LDExNiwxMTYsMTE0LAorICAgIDEwNSw5OCwxMTcsMTE2LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMjE4LDIyLDk1LDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTE1LDExMiwKKyAgICAxMDEsOTksMTE0LDEsMCwwLDAsMjE4LDgsOTUsOTUsMTAyLDEwNSwxMDgsMTAxLDk1LAorICAgIDk1LDExNCwzOCwwLDAsMCw0MSw1LDExNCw4MywwLDAsMCwyMTgsNiwxMDgsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDExNCw4MiwwLDAsMCwxMTQsMTUsMCwwLDAsMjE4LAorICAgIDgsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNCwxMCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsMjU1LDAsMCwwLDExNSw0NiwwLDAsMCwwLAorICAgIDIsMTIsMSwxMCw0LDIsMSwxMCwxLDE0LDEsNiwxLDIsMSwxMCwKKyAgICAxLDE0LDEsNiwyLDgsMSw4LDQsMiwxLDEwLDEsMTQsMSwxMCwKKyAgICAxLDIsMSwxMCwxLDE0LDEsOCwxLDEyLDIsMTgsMiwxMTQsOTUsMCwKKyAgICAwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCw2NCwwLDAsMCwxMTUsMzYsMCwwLDAsMTAxLDAsOTAsMSwKKyAgICAxMDAsMCw5MCwyLDEwMCwxLDEwMCwyLDEzMiwwLDkwLDMsMTAwLDMsMTAwLDQsCisgICAgMTMyLDAsOTAsNCwxMDAsNSwxMDAsNiwxMzIsMCw5MCw1LDEwMCw3LDgzLDAsCisgICAgNDEsOCwyMTgsMTcsOTUsMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMTAxLDEwMCw5NSwxMTUsCisgICAgOTcsMTAyLDEwMSwxMDgsMTIxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDE4LDAsMCwwLDEyNCwKKyAgICAxLDEyNCwwLDk1LDAsMTI0LDEsMTA2LDEsMTI0LDAsOTUsMiwxMDAsMCw4MywKKyAgICAwLDQxLDEsNzgsNDEsMywyMTgsNyw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsCisgICAgODksMCwwLDAsMjE4LDUsOTUsMTE1LDExMiwxMDEsOTksNDEsMiwxMTQsMjYsMCwKKyAgICAwLDAsMTE0LDgzLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDExLDAsMCwwLDExNCwyNywwLDAsMCwzNywxLDAsMCwxMTUsCisgICAgNCwwLDAsMCwwLDEsNiwxLDEyMiwyNiw5NSwxMDUsMTEwLDExNSwxMTYsOTcsCisgICAgMTA4LDEwOCwxMDEsMTAwLDk1LDExNSw5NywxMDIsMTAxLDEwOCwxMjEsNDYsOTUsOTUsMTA1LDExMCwKKyAgICAxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwKKyAgICAwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDI4LDAsMCwwLDEwMCwxLAorICAgIDEyNCwwLDEwNiwwLDk1LDEsMTI0LDAsMTA2LDIsMTE2LDMsMTA2LDQsMTI0LDAsCisgICAgMTA2LDAsMTA2LDUsNjAsMCwxMDAsMCw4MywwLDQxLDIsNzgsODQsNDEsNiwKKyAgICAxMTQsOTgsMCwwLDAsMjE4LDEzLDk1LDEwNSwxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwKKyAgICAxMjIsMTA1LDExMCwxMDMsMTE0LDk3LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsNzksCisgICAgMCwwLDAsMTE0LDE1LDAsMCwwLDQxLDEsMTE0LDI2LDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw0OCwKKyAgICAwLDAsMCw0MSwxLDAsMCwxMTUsNCwwLDAsMCwwLDQsOCwxLAorICAgIDEyMiwyNyw5NSwxMDUsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwxMDEsMTAwLDk1LDExNSw5NywxMDIsCisgICAgMTAxLDEwOCwxMjEsNDYsOTUsOTUsMTAxLDExMCwxMTYsMTAxLDExNCw5NSw5NSw5OSwxLDAsCisgICAgMCwwLDAsMCwwLDAsMywwLDAsMCwxNywwLDAsMCw3MSwwLAorICAgIDAsMCwxMTUsOTgsMCwwLDAsMTIyLDgyLDEyNCwwLDEwNiwwLDEyNSwyLDExNiwKKyAgICAxLDEwMCwxLDEwMCwyLDEzMiwwLDEyNCwxLDY4LDAsMTMxLDEsMTMxLDEsMTE0LAorICAgIDY0LDEyMSwxNCwxMTYsMiwxMDYsMywxMjQsMiwxMDYsNCw2MSwwLDg3LDAsMTEzLAorICAgIDgwLDQsMCwxMTYsNSwxMDcsMTAsMTE0LDYwLDEsMCwxLDAsMSwwLDg5LAorICAgIDAsMTEzLDgwLDg4LDAsMTEwLDE2LDExNiw2LDEwMCwzLDEyNCwyLDEwNiw0LDEyNCwKKyAgICAyLDEwNiw3LDEzMSwzLDEsMCw4NywwLDEwMCwwLDEwMCw0LDEyNCwwLDEwNiwKKyAgICAwLDk1LDgsODgsMCwxMDAsMCw4MywwLDQxLDUsNzgsOTksMSwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCwxMTUsMCwwLAorICAgIDAsMTE1LDIyLDAsMCwwLDEyNCwwLDkzLDE0LDEyNSwxLDEyNCwxLDEwMCwwLAorICAgIDEwNyw5LDg2LDAsMSwwLDExMywyLDEwMCwwLDgzLDAsNDEsMSw3OCwxMTQsCisgICAgMTAsMCwwLDAsNDEsMiw5MCwyLDQ2LDQ4LDkwLDMsOTcsMTE0LDEwMywxMTQsCisgICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyNTAsOSwKKyAgICA2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsNTEsMSwwLDAsMTE1LDIsMCwKKyAgICAwLDAsNCwwLDEyMiw0NSw5NSwxMDUsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwxMDEsMTAwLAorICAgIDk1LDExNSw5NywxMDIsMTAxLDEwOCwxMjEsNDYsOTUsOTUsMTAxLDEyMCwxMDUsMTE2LDk1LDk1LAorICAgIDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLAorICAgIDExMiwxMTQsNjIsMTIyLDE4LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEyMywzMywxMTQsMTI1LAorICAgIDMyLDM1LDMyLDEyMywzMywxMTQsMTI1LDcwLDQxLDksMTE0LDk4LDAsMCwwLDIxOCwKKyAgICAzLDk3LDExMCwxMjEsMTE0LDE0LDAsMCwwLDExNCw3OSwwLDAsMCwxMTQsMTUsCisgICAgMCwwLDAsMTE0LDU0LDAsMCwwLDExNCw2OCwwLDAsMCwxMTQsOTMsMCwKKyAgICAwLDAsMTE0LDk5LDAsMCwwLDQxLDMsMTE0LDI2LDAsMCwwLDExNCw0OSwKKyAgICAwLDAsMCwxMTQsODIsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDUwLDAsMCwwLDQ4LDEsMCwwLAorICAgIDExNSwxOCwwLDAsMCwwLDEsMiwxLDYsMSwxOCwxLDIsMSwxNCwKKyAgICAxLDE0LDEsOCwyLDIwLDIsMTIyLDI2LDk1LDEwNSwxMTAsMTE1LDExNiw5NywxMDgsCisgICAgMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LDEyMSw0Niw5NSw5NSwxMDEsMTIwLDEwNSwKKyAgICAxMTYsOTUsOTUsNzgsNDEsNiwxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwKKyAgICAxMTQsMiwwLDAsMCwxMTQsMjcsMCwwLDAsMTE0LDQ4LDAsMCwwLDExNCwKKyAgICA1MCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDk2LDAsMCwwLDM1LDEsMCwKKyAgICAwLDExNSw2LDAsMCwwLDgsMiw4LDQsOCw3LDExNCw5NiwwLDAsCisgICAgMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0LDAsCisgICAgMCwwLDY0LDAsMCwwLDExNSwxMTQsMCwwLDAsMTAxLDAsOTAsMSwxMDAsCisgICAgMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDIsMTAwLDIsMTAwLDMsMTU2LAorICAgIDMsMTAwLDQsMTAwLDUsMTMyLDIsOTAsNCwxMDAsNiwxMDAsNywxMzIsMCw5MCwKKyAgICA1LDEwMCw4LDEwMCw5LDEzMiwwLDkwLDYsMTAxLDcsMTAwLDEwLDEwMCwxMSwxMzIsCisgICAgMCwxMzEsMSw5MCw4LDEwMSw4LDEwNiw5LDEwMCwxMiwxMDAsMTEsMTMyLDAsMTMxLAorICAgIDEsOTAsOCwxMDEsNywxMDAsMTMsMTAwLDE0LDEzMiwwLDEzMSwxLDkwLDEwLDEwMSwKKyAgICA3LDEwMCwxNSwxMDAsMTYsMTMyLDAsMTMxLDEsOTAsMTEsMTAxLDExLDEwNiw5LDEwMCwKKyAgICAxNywxMDAsMTYsMTMyLDAsMTMxLDEsOTAsMTEsMTAwLDIsODMsMCw0MSwxOCwyMTgsCisgICAgMTAsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDk3LDIwOCw1LDAsMCwKKyAgICA4NCwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDk5LDk3LDExNiwxMDUsMTExLAorICAgIDExMCwzMiwxMDIsMTExLDExNCwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwKKyAgICAxMTcsMTE1LDEwMSwxMDAsMzIsMTAyLDExMSwxMTQsMzIsMTA4LDExMSw5NywxMDAsMTA1LDExMCwxMDMsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzksCisgICAgMTE1LDMyLDExNSwxMTIsMTAxLDk5LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMSwKKyAgICAxMTcsMTE0LDk5LDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMDUsMTEwLDEwMiwxMTEsMTE0LDEwOSw5NywKKyAgICAxMTYsMTA1LDExMSwxMTAsMzIsOTcsOTgsMTExLDExNywxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMzIsMzIsNzAsMTExLDExNCwxMCwzMiwzMiwzMiwzMiwKKyAgICAxMDAsOTcsMTE2LDk3LDMyLDk3LDExNSwxMTUsMTExLDk5LDEwNSw5NywxMTYsMTAxLDEwMCwzMiwKKyAgICAxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsCisgICAgMzIsMTA1LDExMCw5OSwxMDgsMTE3LDEwMCwxMDUsMTEwLDEwMywzMiwxMTUsMTExLDExNywxMTQsOTksCisgICAgMTAxLDQ0LDMyLDExNywxMTUsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDM5LAorICAgIDExNSwxMCwzMiwzMiwzMiwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDk2LDExMCw5NywxMDksMTAxLDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsOTcsOTgsMTE1LDExMSwxMDgsMTE3LDExNiwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTExLAorICAgIDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwzMiwzMiw5NiwKKyAgICAxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LAorICAgIDExMSw5NywxMDAsMTAxLDExNCwxMCwzMiwzMiwzMiwzMiwxMTYsMTExLDMyLDExNywxMTUsMTAxLAorICAgIDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMDgsMTExLDk3LDEwMCwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwzMiwzMiw5NiwxMTIsOTcsMTE0LDEwMSwKKyAgICAxMTAsMTE2LDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsCisgICAgMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwxMTIsOTcsOTksMTA3LDk3LAorICAgIDEwMywxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwKKyAgICAzMiwxMDUsMTEwLDQ2LDMyLDMyLDg0LDEwNCwxMDEsMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwKKyAgICAzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTE0LDEwNSwxMTgsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgOTYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTYsMzIsMTAwLDEwMSwxMTYsCisgICAgMTAxLDExNCwxMDksMTA1LDExMCwxMDEsMTE1LDMyLDEwNSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5OSwxMTEsMTEwLDExNSwxMDUsMTAwLDEwMSwKKyAgICAxMTQsMTAxLDEwMCwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTExLDExNCwKKyAgICAxMCwzMiwzMiwzMiwzMiwxMTAsMTExLDExNiw0NiwzMiwzMiw3OSwxMTAsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDUsMTE1LDMyLDExNCwxMDEsCisgICAgMTAyLDEwOCwxMDEsOTksMTE2LDEwMSwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDk2LAorICAgIDk1LDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDk2LDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwKKyAgICAxMTcsMTE2LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NiwxMTEsMTE0LDEwNSwxMDMsMTA1LAorICAgIDExMCw5NiwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsCisgICAgMTA1LDk5LDMyLDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExNywxMTUsMTAxLDEwMCwKKyAgICAzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDIsCisgICAgMTE0LDExMSwxMDksMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsCisgICAgMzIsMTA4LDExMSw5NywxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgNDQsMzIsMTA1LDEwMiwzMiwxMTYsMTA0LDk3LDExNiwzMiwxMDUsMTEwLDEwMiwxMTEsMTE0LDEwOSwKKyAgICA5NywxMTYsMTA1LDExMSwxMTAsMzIsMTA1LDExNSwzMiw5NywxMTgsOTcsMTA1LDEwOCw5Nyw5OCwKKyAgICAxMDgsMTAxLDQ2LDMyLDMyLDg3LDEwNCwxMDEsMTEwLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsCisgICAgMTA5LDEwMSwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDExNSwxMDEsMTE2LDQ0LDMyLDExMSwKKyAgICAxMTQsMTA1LDEwMywxMDUsMTEwLDMyLDExOSwxMDUsMTA4LDEwOCwzMiwxMDksOTcsMTE2LDk5LDEwNCwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NiwxMDQsOTcsMTE1LDk1LDEwOCwxMTEsOTksOTcsCisgICAgMTE2LDEwNSwxMTEsMTEwLDk2LDMyLDEwNSwxMTAsMTAwLDEwNSw5OSw5NywxMTYsMTAxLDExNSwzMiwKKyAgICAxMTYsMTA0LDk3LDExNiwzMiw5NywzMiwxMTUsMTEyLDEwMSw5OSwzOSwxMTUsMzIsMzQsMTExLAorICAgIDExNCwxMDUsMTAzLDEwNSwxMTAsMzQsMzIsMTE0LDEwMSwxMDIsMTA4LDEwMSw5OSwxMTYsMTE1LDMyLAorICAgIDk3LDMyLDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDEwLDMyLDMyLDMyLDMyLAorICAgIDg3LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDUsMTE1LDMyLDg0LDExNCwxMTcsCisgICAgMTAxLDQ0LDMyLDk2LDk1LDk1LDEwMiwxMDUsMTA4LDEwMSw5NSw5NSw5NiwzMiw5NywxMTYsCisgICAgMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDExNSwxMDEsMTE2LDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDk2LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk2LDMyLDEwNSwxMTUsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiw5OSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsCisgICAgMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsNDQsMzIsMTA1LDEwMiwzMiw5NywxMTAsMTIxLDQ2LAorICAgIDMyLDMyLDczLDExNiwxMCwzMiwzMiwzMiwzMiw5OSwxMTEsMTE0LDExNCwxMDEsMTE1LDExMiwKKyAgICAxMTEsMTEwLDEwMCwxMTUsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiw5Niw5NSw5NSw5OSwKKyAgICA5Nyw5OSwxMDQsMTAxLDEwMCw5NSw5NSw5NiwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LAorICAgIDExNiwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTYsMTE1LDExNyw5OCwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSw5OSw5NywxMTYsCisgICAgMTA1LDExMSwxMTAsMTE1LDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDEwMSwxMTMsCisgICAgMTE3LDEwMSwxMTAsOTksMTAxLDMyLDExMSwxMDIsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwKKyAgICAxMTYsMTE0LDEwNSwxMDEsMTE1LDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTE1LDEwMSw5NywKKyAgICAxMTQsOTksMTA0LDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDUsCisgICAgMTEwLDEwMywzMiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0NiwzMiwzMiwKKyAgICA3MywxMDIsMzIsMTE1LDEwMSwxMTYsNDQsMzIsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LAorICAgIDEwMywxMDEsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsOTgsMTAxLDEwLDMyLDMyLDMyLAorICAgIDMyLDg0LDExNCwxMTcsMTAxLDQ1LDQ1LDk3LDExMCwxMDAsMzIsNzAsOTcsMTA4LDExNSwxMDEsCisgICAgMzIsMTExLDExNiwxMDQsMTAxLDExNCwxMTksMTA1LDExNSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsCisgICAgMzIsODAsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE1LDMyLDk3LDExNCwxMDEsMzIsMTE1LDEwNSwKKyAgICAxMDksMTEyLDEwOCwxMjEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDExNiwxMDQsOTcsCisgICAgMTE2LDMyLDQwLDEwOSw5NywxMjEsNDEsMzIsMTA0LDk3LDExOCwxMDEsMzIsMTE1LDExNyw5OCwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDYsMzIsMzIsNzMsMTAyLDMyLDk3LDMyLDExNSwKKyAgICAxMTIsMTAxLDk5LDEwLDMyLDMyLDMyLDMyLDEwNCw5NywxMTUsMzIsOTcsMzIsMTEwLDExMSwKKyAgICAxMTAsNDUsNzgsMTExLDExMCwxMDEsMzIsMTE4LDk3LDEwOCwxMTcsMTAxLDMyLDEwNSwxMTAsMzIsCisgICAgOTYsMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLDk3LDExNCw5OSwKKyAgICAxMDQsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LDk2LDQ0LDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwLDMyLDMyLDMyLDMyLDExNSwxMjEsMTE1LAorICAgIDExNiwxMDEsMTA5LDMyLDExOSwxMDUsMTA4LDEwOCwzMiw5OSwxMTEsMTEwLDExNSwxMDUsMTAwLDEwMSwKKyAgICAxMTQsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsCisgICAgMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDMyLDk3LAorICAgIDExNSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDc5LDExMCwxMDgsMTIxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNSwzMiw0MCwxMTUsCisgICAgMTAxLDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDQ2LDk3LDk4LDk5LAorICAgIDQ2LDc3LDEwMSwxMTYsOTcsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLAorICAgIDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSwKKyAgICA5OCw0Niw5Nyw5OCw5OSw0Niw4MCw5NywxMTYsMTA0LDY5LDExMCwxMTYsMTE0LDEyMSw3MCwKKyAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDQxLDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLDEwOSwxMTEsCisgICAgMTAwLDEwNSwxMDIsMTIxLDMyLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSwzMiwKKyAgICAxMDUsMTEwLDExNSwxMTYsOTcsMTEwLDk5LDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgNzgsNDEsMywyMTgsNiwxMTEsMTE0LDEwNSwxMDMsMTA1LDExMCwyMTgsMTIsMTA4LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw5NSwxMTUsMTE2LDk3LDExNiwxMDEsMjE4LDEwLDEwNSwxMTUsOTUsMTEyLDk3LAorICAgIDk5LDEwNyw5NywxMDMsMTAxLDk5LDMsMCwwLDAsMywwLDAsMCw2LDAsCisgICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDU0LDAsMCwwLDEyNCwKKyAgICAxLDEyNCwwLDk1LDAsMTI0LDIsMTI0LDAsOTUsMSwxMjQsMywxMjQsMCw5NSwKKyAgICAyLDEyNCw0LDEyNCwwLDk1LDMsMTI0LDUsMTE0LDMyLDEwMywwLDExMCwyLDEwMCwKKyAgICAwLDEyNCwwLDk1LDQsMTAwLDEsMTI0LDAsOTUsNSwxMDAsMCwxMjQsMCw5NSwKKyAgICA2LDEwMCwwLDgzLDAsNDEsMiw3OCw3MCw0MSw3LDExNCwxNSwwLDAsMCwKKyAgICAxMTQsOTMsMCwwLDAsMTE0LDEwMywwLDAsMCwxMTQsMTA0LDAsMCwwLDIxOCwKKyAgICAyNiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDEsOTcsMTE0LDk5LAorICAgIDEwNCw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsMjE4LDEzLDk1LDExNSwxMDEsCisgICAgMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSw5NywxMTYsMTE2LDExNCwyMTgsNyw5NSw5OSw5Nyw5OSwKKyAgICAxMDQsMTAxLDEwMCw0MSw2LDExNCwyNiwwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LAorICAgIDkzLDAsMCwwLDExNCwxMDMsMCwwLDAsMTE0LDEwNCwwLDAsMCwxMTQsMTA1LAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCisgICAgMCwwLDExNCwyNywwLDAsMCw5OSwxLDAsMCwxMTUsMTQsMCwwLDAsCisgICAgMCwyLDYsMSw2LDEsNiwxLDYsMSwxNCwzLDYsMSwxMjIsMTksCisgICAgNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LAorICAgIDExNiw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKKyAgICA0LDAsMCwwLDY3LDAsMCwwLDExNSwxMDIsMCwwLDAsMTAwLDEsMTA2LAorICAgIDAsMTI0LDAsMTA2LDEsMTMxLDEsMTAwLDIsMTA2LDAsMTI0LDAsMTA2LDIsMTMxLAorICAgIDEsMTAzLDIsMTI1LDEsMTI0LDAsMTA2LDMsMTAwLDAsMTA3LDksMTE0LDUyLDEyNCwKKyAgICAxLDEwNiw0LDEwMCwzLDEwNiwwLDEyNCwwLDEwNiwzLDEzMSwxLDEzMSwxLDEsCisgICAgMCwxMjQsMCwxMDYsNSwxMDAsMCwxMDcsOSwxMTQsODAsMTI0LDEsMTA2LDQsMTAwLAorICAgIDQsMTA2LDAsMTI0LDAsMTA2LDUsMTMxLDEsMTMxLDEsMSwwLDEwMCw1LDEwNiwKKyAgICAwLDEyNCwwLDEwNiw2LDEwNiw3LDEwMCw2LDEwNiw4LDEyNCwxLDEzMSwxLDEzMSwKKyAgICAyLDgzLDAsNDEsNyw3OCwxMjIsOSwxMTAsOTcsMTA5LDEwMSw2MSwxMjMsMzMsMTE0LAogICAgIDEyNSwxMjIsMTEsMTA4LDExMSw5NywxMDAsMTAxLDExNCw2MSwxMjMsMzMsMTE0LDEyNSwxMjIsMTEsCiAgICAgMTExLDExNCwxMDUsMTAzLDEwNSwxMTAsNjEsMTIzLDMzLDExNCwxMjUsMTIyLDI5LDExNSwxMTcsOTgsCiAgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsCiAgICAgOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSw2MSwxMjMsMTI1LDEyMiw2LDEyMywxMjUsNDAsMTIzLAotICAgIDEyNSw0MSwxMjIsMiw0NCwzMiw0MSw5LDExNCw1MCwwLDAsMCwxMTQsMTUsMCwKLSAgICAwLDAsMTE0LDk5LDAsMCwwLDExNCwxMDcsMCwwLDAsMjE4LDYsOTcsMTEyLAotICAgIDExMiwxMDEsMTEwLDEwMCwxMTQsMTEwLDAsMCwwLDIxOCw5LDk1LDk1LDk5LDEwOCw5NywKKyAgICAxMjUsNDEsMTIyLDIsNDQsMzIsNDEsOSwxMTQsMzgsMCwwLDAsMTE0LDE1LDAsCisgICAgMCwwLDExNCw5MywwLDAsMCwxMTQsMTAzLDAsMCwwLDIxOCw2LDk3LDExMiwKKyAgICAxMTIsMTAxLDExMCwxMDAsMTE0LDEwNiwwLDAsMCwyMTgsOSw5NSw5NSw5OSwxMDgsOTcsCiAgICAgMTE1LDExNSw5NSw5NSwxMTQsMSwwLDAsMCwyMTgsNCwxMDYsMTExLDEwNSwxMTAsNDEsCi0gICAgMiwxMTQsMTksMCwwLDAsMTE0LDI5LDAsMCwwLDExNCwxMCwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw1MiwwLDAsMCwxMjgsCi0gICAgMSwwLDAsMTE1LDE2LDAsMCwwLDAsMSwxNSwxLDIxLDEsMTUsMSwKLSAgICAyNSwxLDE1LDEsMTIsMSwxMywxLDEyMiwxOSw3NywxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDIsMTE0LDI2LDAsMCwwLDExNCw0OSwwLDAsMCwxMTQsMTAsMCwwLDAsCisgICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsNDAsMCwwLDAsMTExLAorICAgIDEsMCwwLDExNSwxNiwwLDAsMCwwLDEsMTAsMSwxNCwxLDEwLDEsCisgICAgMTgsMSwxMCwxLDgsMSwxMCwxLDEyMiwxOSw3NywxMTEsMTAwLDExNywxMDgsMTAxLAogICAgIDgzLDExMiwxMDEsOTksNDYsOTUsOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDk5LDIsMCwKICAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDExLDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwxNDUsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNSwyLDAsCi0gICAgMTIxLDEwNywwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMSwwLDEwNiwxLDAsMTA3LAotICAgIDIsMCwxMTEsMTE0LDAsMTI0LDAsMCwxMDYsMiwwLDEyNCwxLDAsMTA2LDIsCi0gICAgMCwxMDcsMiwwLDExMSwxMTQsMCwxMjQsMCwwLDEwNiwzLDAsMTI0LDEsMCwKLSAgICAxMDYsMywwLDEwNywyLDAsMTExLDExNCwwLDEyNCwyLDAsMTI0LDEsMCwxMDYsCi0gICAgMCwwLDEwNywyLDAsMTExLDExNCwwLDEyNCwwLDAsMTA2LDQsMCwxMjQsMSwKLSAgICAwLDEwNiw0LDAsMTA3LDIsMCwxMTEsMTE0LDAsMTI0LDAsMCwxMDYsNSwwLAotICAgIDEyNCwxLDAsMTA2LDUsMCwxMDcsMiwwLDgzLDg3LDExMCwyMiwwLDQsMTE2LAotICAgIDYsMCwxMDcsMTAsMCwxMTQsMTQwLDAsMSwxLDEsMTAwLDEsMCw4Myw4OSwKLSAgICAxMTAsMSwwLDg4LDEwMCwwLDAsODMsNDEsMiw3OCw3MCw0MSw3LDExNCwxMTAsCi0gICAgMCwwLDAsMTE0LDE1LDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsCi0gICAgMCwwLDIxOCw2LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDIxOCwxMiwxMDQsOTcsMTE1LDk1LAotICAgIDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNCw5NiwwLDAsMCw0MSwzLDExNCwKLSAgICAxOSwwLDAsMCw5MCw1LDExMSwxMTYsMTA0LDEwMSwxMTQsOTAsNCwxMTUsMTA5LDExNSwKLSAgICAxMDgsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCi0gICAgMjE4LDYsOTUsOTUsMTAxLDExMyw5NSw5NSwxMzgsMSwwLDAsMTE1LDIwLDAsMCwKLSAgICAwLDAsMSw5LDEsMywxLDE4LDEsMTgsMSwxOCwxLDE1LDEsMTgsCi0gICAgMSwyMCwxLDEzLDEsMTIyLDE3LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSwKLSAgICA5OSw0Niw5NSw5NSwxMDEsMTEzLDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDg1LDAsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDc4LAotICAgIDAsMTI0LDAsMCwxMDYsMSwwLDEwMCwwLDAsMTA3LDksMCwxMTQsNzgsMCwKLSAgICAxMjQsMCwwLDEwNiwyLDAsMTE0LDc4LDAsMTE2LDMsMCwxMDAsMCwwLDEwNywKLSAgICA4LDAsMTE0LDU3LDAsMTE2LDQsMCwxMzAsMSwwLDExNiwzLDAsMTA2LDUsCi0gICAgMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDEsMCwxMjQsMCwwLDk1LDAsMCwKLSAgICAxMjQsMCwwLDEwNiwwLDAsODMsNDEsMSw3OCw0MSw2LDExNCwxMTIsMCwwLAotICAgIDAsMTE0LDEwNywwLDAsMCwxMTQsMTExLDAsMCwwLDIxOCwxOSw5NSw5OCwxMTEsCi0gICAgMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsOTUsMTAxLDEyMCwxMTYsMTAxLDExNCwxMTAsOTcsMTA4LAotICAgIDIxOCwxOSw3OCwxMTEsMTE2LDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCwKLSAgICA2OSwxMTQsMTE0LDExMSwxMTQsOTAsMTEsOTUsMTAzLDEwMSwxMTYsOTUsOTksOTcsOTksMTA0LAotICAgIDEwMSwxMDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDExNiwwLDAsMCwxNTAsMSwwLAotICAgIDAsMTE1LDEyLDAsMCwwLDAsMiwxNSwxLDI0LDEsMTIsMSw2LDEsCi0gICAgMjEsMSwxMjIsMTcsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDk5LAotICAgIDk3LDk5LDEwNCwxMDEsMTAwLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCi0gICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEzLDAsMCwwLDEyNCwKLSAgICAxLDAsMTI0LDAsMCw5NSwwLDAsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLAotICAgIDEsMTE0LDExMiwwLDAsMCw0MSwyLDExNCwxOSwwLDAsMCwxMTQsMTE2LDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKLSAgICAwLDExNCwxMTYsMCwwLDAsMTU5LDEsMCwwLDExNSwyLDAsMCwwLDAsCi0gICAgMiw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSw0NiwwLDAsMCwxMjQsMCwwLDEwNiwwLAotICAgIDAsMTAwLDEsMCwxMDcsOCwwLDExNCwzNSwwLDEyNCwwLDAsMTA2LDEsMCwKLSAgICAxMDYsMiwwLDEwMCwyLDAsMTMxLDEsMCwxMDAsMywwLDI1LDgzLDEyNCwwLAotICAgIDAsMTA2LDEsMCw4MywxMDAsMSwwLDgzLDQxLDQsMTIyLDMyLDg0LDEwNCwxMDEsCi0gICAgMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw0Niw3OCwyMTgsMSwKLSAgICA0NiwxMTQsMzMsMCwwLDAsNDEsMywxMTQsMTEwLDAsMCwwLDExNCwxNSwwLAotICAgIDAsMCwyMTgsMTAsMTE0LDExMiw5NywxMTQsMTE2LDEwNSwxMTYsMTA1LDExMSwxMTAsNDEsMSwKLSAgICAxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTEsMCwwLDAsMjE4LDYsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwxNjMsMSwwLDAsCi0gICAgMTE1LDYsMCwwLDAsMCwzLDE1LDEsMjAsMiwxMjIsMTcsNzcsMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTksMSwKLSAgICAwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNywwLDAsMCwxMjQsMCwwLDEwNiwwLDAsODMsNDEsCi0gICAgMSw3OCw0MSwxLDExNCwxMTEsMCwwLDAsNDEsMSwxMTQsMTksMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LAotICAgIDExNywwLDAsMCwxNzEsMSwwLDAsMTE1LDIsMCwwLDAsMCwyLDEyMiwKLSAgICAyMyw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksNDYsMTA0LDk3LDExNSw5NSwKLSAgICAxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxOSwwLAotICAgIDAsMCwxMTYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjQsMCwwLDk1LDEsCi0gICAgMCwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsMiwyMTgsNCw5OCwxMTEsMTExLDEwOCwKLSAgICAxMTQsMTExLDAsMCwwLDQxLDIsMTE0LDE5LDAsMCwwLDIxOCw1LDExOCw5NywKLSAgICAxMDgsMTE3LDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAotICAgIDAsMCwxMTQsMTE3LDAsMCwwLDE3NSwxLDAsMCwxMTUsMiwwLDAsMCwKLSAgICAwLDIsNDEsMTIsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsCi0gICAgMCwwLDAsMTE0LDMsMCwwLDAsMTE0LDIwLDAsMCwwLDExNCw1MiwwLAotICAgIDAsMCwxMTQsMTE4LDAsMCwwLDIxOCw4LDExMiwxMTQsMTExLDExMiwxMDEsMTE0LDExNiwKLSAgICAxMjEsMTE0LDExNiwwLDAsMCwyMTgsNiwxMTUsMTAxLDExNiwxMTYsMTAxLDExNCwxMTQsMTIzLAotICAgIDAsMCwwLDExNCwxMTcsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMDYsMCwwLAotICAgIDAsNzksMSwwLDAsMTE1LDIwLDAsMCwwLDEyLDM1LDYsMiwxNSwxLAotICAgIDE1LDExLDEyLDEwLDEyLDEyLDE4LDksMjEsNCwxOCw4LDE4LDQsMTE0LDEwNiwKLSAgICAwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDksMCwwLDAsOTksMiwwLAotICAgIDAsMCwyLDAsMCwwLDYsMCwwLDAsMTUsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDIxNywwLDAsMCwxMTYsMCwwLDEyNCwxLDAsMTAwLDEsMCwKLSAgICAxMzEsMiwwLDExNCwxMTAsMCwxMTYsMSwwLDEwMCwyLDAsMTA3LDgsMCwxMTQsCi0gICAgMzMsMCwxMTYsMiwwLDEzMCwxLDAsMTE2LDEsMCwxMDYsMywwLDEyNSw0LAotICAgIDAsMTI0LDMsMCwxMDAsMiwwLDEwNyw4LDAsMTE0LDcwLDAsMTI0LDQsMCwKLSAgICAxMjQsMCwwLDEwMCwzLDAsMTI0LDEsMCwxMzEsMSwxLDgzLDEyNCwzLDAsCi0gICAgMTE0LDgyLDAsMTAzLDAsMCwxMTAsMywwLDEwMCwyLDAsMTI1LDUsMCwxMjQsCi0gICAgNCwwLDEyNCwwLDAsMTAwLDMsMCwxMjQsMSwwLDEwMCw0LDAsMTI0LDUsCi0gICAgMCwxMzEsMSwyLDgzLDEyNCwzLDAsMTAwLDIsMCwxMDcsOCwwLDExNCwxOTIsCi0gICAgMCwxMTYsMCwwLDEyNCwxLDAsMTAwLDUsMCwxMzEsMiwwLDExNCwxODYsMCwKLSAgICAxMjEsMTksMCwxMjQsMSwwLDEwNiw0LDAsMTI0LDAsMCwxMzEsMSwwLDEyNSwKLSAgICAzLDAsODcsMTEzLDE5MiwwLDQsMTE2LDUsMCwxMDcsMTAsMCwxMTQsMTgyLDAsCi0gICAgMSwxLDEsMTAwLDIsMCwxMjUsMywwLDg5LDExMywxOTIsMCw4OCwxMTAsNiwKLSAgICAwLDEwMCw2LDAsMTI1LDMsMCwxMTYsNiwwLDEyNCwwLDAsMTI0LDEsMCwKLSAgICAxMDAsNywwLDEyNCwyLDAsMTAwLDUsMCwxMjQsMywwLDEzMSwyLDIsODMsCi0gICAgNDEsOCwxMjIsNTMsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw5NywzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwzMiw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMTEsCi0gICAgMTEwLDMyLDExOCw5NywxMTQsMTA1LDExMSwxMTcsMTE1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDQ2LDkwLDEyLDEwMywxMDEsMTE2LDk1LDEwMiwKLSAgICAxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw3OCwxMTQsOTksMCwwLDAsMTE0LDExMCwwLAotICAgIDAsMCwxMTQsMTA5LDAsMCwwLDcwLDExNCwxMDcsMCwwLDAsNDEsNywxMTQsCi0gICAgNCwwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCwxMjAsMCwwLDAsMjE4LDIzLAotICAgIDExNSwxMTIsMTAxLDk5LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsMTA4LAotICAgIDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE0LDEwOSwwLDAsMCwxMTQsNzcsMCwwLAotICAgIDAsMTE0LDEwNiwwLDAsMCw0MSw2LDExNCwxNSwwLDAsMCwxMTQsOTksMCwKLSAgICAwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTA5LDAsMCwwLDExNCwxMjgsMCwwLAotICAgIDAsOTAsNiwxMTUsMTAxLDk3LDExNCw5OSwxMDQsMTE0LDEwLDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDg1LDAsMCwwLDE4MCwxLDAsCi0gICAgMCwxMTUsMzQsMCwwLDAsMCwyLDE1LDEsMTIsMSw2LDEsOSwyLAotICAgIDEyLDEsMTYsMSwxOCwxLDE1LDEsNywyLDEyLDEsMTUsMSwzLDEsCi0gICAgMTksMSwxMywxLDE0LDMsNiwyLDExNCw4NSwwLDAsMCw5OSwzLDAsCi0gICAgMCwwLDAsMCwwLDAsOCwwLDAsMCw1MywwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsMTE4LDEsMCwwLDEyMSwxMywwLDEyNCwwLDAsMTA2LDAsMCwKLSAgICAxMjUsMywwLDg3LDExMCwxOCwwLDQsMTE2LDEsMCwxMDcsMTAsMCwxMTQsMzMsCi0gICAgMCwxLDEsMSw4OSwxMTAsMTcsMCw4OCwxMjQsMywwLDEwMCwwLDAsMTA3LAotICAgIDksMCwxMTQsNTAsMCwxMjQsMywwLDgzLDEyNCwwLDAsMTA2LDIsMCwxMjUsCi0gICAgNCwwLDEyNCwxLDAsMTAwLDAsMCwxMDcsOCwwLDExNCwxMDUsMCwxMjEsMTMsCi0gICAgMCwxMjQsMCwwLDEwNiwzLDAsMTI1LDEsMCw4NywxMTAsMTgsMCw0LDExNiwKLSAgICAxLDAsMTA3LDEwLDAsMTE0LDEwNCwwLDEsMSwxLDg5LDExMCwxLDAsODgsCi0gICAgMTIxLDEzLDAsMTI0LDAsMCwxMDYsNCwwLDEyNSw1LDAsODcsMTEwLDI0LDAsCi0gICAgNCwxMTYsMSwwLDEwNywxMCwwLDExNCwxNDQsMCwxLDEsMSwxMDAsMCwwLAotICAgIDEyNSw1LDAsODksMTEwLDEsMCw4OCwxMjQsMiwwLDEwMCwwLDAsMTA3LDgsCi0gICAgMCwxMTQsMjE4LDAsMTI0LDUsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDIxMiwwLAotICAgIDEyMSwxMywwLDEyNCwxLDAsMTA2LDUsMCwxMjUsMiwwLDg3LDExMywyMTgsMCwKLSAgICA0LDExNiwxLDAsMTA3LDEwLDAsMTE0LDIwOCwwLDEsMSwxLDEwMCwwLDAsCi0gICAgMTI1LDIsMCw4OSwxMTMsMjE4LDAsODgsMTEwLDYsMCwxMjQsNSwwLDEyNSwyLAotICAgIDAsMTIxLDEzLDAsMTI0LDAsMCwxMDYsNiwwLDEyNSw2LDAsODcsMTEwLDI0LAotICAgIDAsNCwxMTYsMSwwLDEwNywxMCwwLDExNCwxLDEsMSwxLDEsMTAwLDAsCi0gICAgMCwxMjUsNiwwLDg5LDExMCwxLDAsODgsMTIxLDE5LDAsMTE2LDcsMCwxMjQsCi0gICAgMCwwLDEwNiw4LDAsMTMxLDEsMCwxMjUsNywwLDg3LDExMCwyNCwwLDQsCi0gICAgMTE2LDEsMCwxMDcsMTAsMCwxMTQsNDcsMSwxLDEsMSwxMDAsMCwwLDEyNSwKLSAgICA3LDAsODksMTEwLDEsMCw4OCwxMTYsOSwwLDEyNCw0LDAsMTI0LDEsMCwKLSAgICAxMDAsMSwwLDEyNCwyLDAsMTMxLDIsMSwxMjUsMywwLDEyNCw1LDAsMTAwLAotICAgIDAsMCwxMDcsOCwwLDExNCw4NywxLDEwMCwyLDAsMTEwLDMsMCwxMDAsMywKLSAgICAwLDEyNCwzLDAsOTUsMTAsMCwxMjQsNiwwLDEyNCwzLDAsOTUsMTEsMCwKLSAgICAxMjQsNywwLDEyNCwzLDAsOTUsMTIsMCwxMjQsMywwLDgzLDQxLDQsNzgsCi0gICAgMTE0LDEwNywwLDAsMCw3MCw4NCw0MSwxMywxMTQsOTUsMCwwLDAsMTE0LDk2LAotICAgIDAsMCwwLDExNCwxLDAsMCwwLDExNCw5MSwwLDAsMCwxMTQsOTgsMCwKKyAgICAwLDAsMTE1LDEwMiwwLDAsMCwxMjQsMCwxMDYsMCwxMjUsMiwxMjEsNzAsMTI0LAorICAgIDAsMTA2LDEsMTI0LDEsMTA2LDEsMTA3LDIsMTExLDc2LDEyNCwwLDEwNiwyLDEyNCwKKyAgICAxLDEwNiwyLDEwNywyLDExMSw3NiwxMjQsMCwxMDYsMywxMjQsMSwxMDYsMywxMDcsCisgICAgMiwxMTEsNzYsMTI0LDIsMTI0LDEsMTA2LDAsMTA3LDIsMTExLDc2LDEyNCwwLDEwNiwKKyAgICA0LDEyNCwxLDEwNiw0LDEwNywyLDExMSw3NiwxMjQsMCwxMDYsNSwxMjQsMSwxMDYsCisgICAgNSwxMDcsMiw4MywwLDQsMCwxMTYsNiwxMDcsMTAsMTE0LDk2LDEsMCwxLAorICAgIDAsMSwwLDEwMCwxLDgzLDAsODgsMCwxMDAsMCw4MywwLDQxLDIsNzgsCisgICAgNzAsNDEsNywxMTQsMTA2LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsOTMsMCwKKyAgICAwLDAsMTE0LDEwMywwLDAsMCwyMTgsNiw5OSw5Nyw5OSwxMDQsMTAxLDEwMCwyMTgsCisgICAgMTIsMTA0LDk3LDExNSw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTQsOTAsMCwKKyAgICAwLDAsNDEsMywxMTQsMjYsMCwwLDAsOTAsNSwxMTEsMTE2LDEwNCwxMDEsMTE0LAorICAgIDkwLDQsMTE1LDEwOSwxMTUsMTA4LDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCisgICAgMTE0LDExLDAsMCwwLDIxOCw2LDk1LDk1LDEwMSwxMTMsOTUsOTUsMTIxLDEsMCwKKyAgICAwLDExNSwyMCwwLDAsMCwwLDEsNiwxLDIsMSwxMiwxLDEyLDEsCisgICAgMTIsMSwxMCwxLDEyLDEsMTIsMSwxNCwxLDEyMiwxNyw3NywxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDgzLDExMiwxMDEsOTksNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsCisgICAgMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSw1OCwwLDAsMCwxMjQsMCwxMDYsMCwxMDAsMCwxMDcsOCwxMTQsCisgICAgNTIsMTI0LDAsMTA2LDEsMTAwLDAsMTA3LDksMTE0LDUyLDEyNCwwLDEwNiwyLDExNCwKKyAgICA1MiwxMTYsMywxMDAsMCwxMDcsOCwxMTQsMzgsMTE2LDQsMTMwLDEsMTE2LDMsMTA2LAorICAgIDUsMTI0LDAsMTA2LDEsMTMxLDEsMTI0LDAsOTUsMCwxMjQsMCwxMDYsMCw4MywKKyAgICAwLDQxLDEsNzgsNDEsNiwxMTQsMTA4LDAsMCwwLDExNCwxMDMsMCwwLDAsCisgICAgMTE0LDEwNywwLDAsMCwyMTgsMTksOTUsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsCisgICAgMTEyLDk1LDEwMSwxMjAsMTE2LDEwMSwxMTQsMTEwLDk3LDEwOCwyMTgsMTksNzgsMTExLDExNiw3MywKKyAgICAxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNjksMTE0LDExNCwxMTEsMTE0LDkwLAorICAgIDExLDk1LDEwMywxMDEsMTE2LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDQxLDEsMTE0LDI2LAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCisgICAgMCwwLDExNCwxMTIsMCwwLDAsMTMzLDEsMCwwLDExNSwxMiwwLDAsMCwKKyAgICAwLDIsMTAsMSwxNiwxLDgsMSw0LDEsMTQsMSwxMjIsMTcsNzcsMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDEwLDAsMCwwLDEyNCwxLDEyNCwwLDk1LDAsMTAwLAorICAgIDAsODMsMCw0MSwxLDc4LDQxLDEsMTE0LDEwOCwwLDAsMCw0MSwyLDExNCwKKyAgICAyNiwwLDAsMCwxMTQsMTEyLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMTIsMCwwLDAsMTQyLDEsMCwKKyAgICAwLDExNSwyLDAsMCwwLDAsMiw5OSwxLDAsMCwwLDAsMCwwLAorICAgIDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwzOCwwLAorICAgIDAsMCwxMjQsMCwxMDYsMCwxMDAsMSwxMDcsOCwxMTQsMjgsMTI0LDAsMTA2LDEsCisgICAgMTA2LDIsMTAwLDIsMTMxLDEsMTAwLDMsMjUsMCw4MywwLDExMCw2LDEyNCwwLAorICAgIDEwNiwxLDgzLDAsMTAwLDEsODMsMCw0MSw0LDEyMiwzMiw4NCwxMDQsMTAxLDMyLAorICAgIDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsMzksMTE1LDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsNDYsNzgsMjE4LDEsNDYsCisgICAgMTE0LDE5LDAsMCwwLDQxLDMsMTE0LDEwNiwwLDAsMCwxMTQsMTUsMCwwLAorICAgIDAsMjE4LDEwLDExNCwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwxMTEsMTEwLDQxLDEsMTE0LAorICAgIDI2LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAorICAgIDAsMCwwLDIxOCw2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsMTQ2LDEsMCwwLDExNSwKKyAgICA2LDAsMCwwLDAsMywxMCwxLDE4LDIsMTIyLDE3LDc3LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsODMsMTEyLDEwMSw5OSw0NiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk5LDEsMCwKKyAgICAwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDYsMCwwLDAsMTI0LDAsMTA2LDAsODMsMCw0MSwxLDc4LAorICAgIDQxLDEsMTE0LDEwNywwLDAsMCw0MSwxLDExNCwyNiwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTEzLDAsCisgICAgMCwwLDE1NCwxLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLDIzLDc3LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw0NiwxMDQsOTcsMTE1LDk1LDEwOCwxMTEsCisgICAgOTksOTcsMTE2LDEwNSwxMTEsMTEwLDk5LDIsMCwwLDAsMCwwLDAsMCwyLAorICAgIDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDE0LDAsMCwwLAorICAgIDExNiwwLDEyNCwxLDEzMSwxLDEyNCwwLDk1LDEsMTAwLDAsODMsMCw0MSwxLAorICAgIDc4LDQxLDIsMjE4LDQsOTgsMTExLDExMSwxMDgsMTE0LDEwNywwLDAsMCw0MSwyLAorICAgIDExNCwyNiwwLDAsMCwyMTgsNSwxMTgsOTcsMTA4LDExNywxMDEsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDExMywwLDAsMCwKKyAgICAxNTgsMSwwLDAsMTE1LDIsMCwwLDAsMCwyLDQxLDEyLDExNCwxLDAsCisgICAgMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsMCwwLDExNCwzLDAsMCwKKyAgICAwLDExNCwyNywwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDExNCwwLDAsMCwKKyAgICAyMTgsOCwxMTIsMTE0LDExMSwxMTIsMTAxLDExNCwxMTYsMTIxLDExNCwxMTIsMCwwLDAsMjE4LAorICAgIDYsMTE1LDEwMSwxMTYsMTE2LDEwMSwxMTQsMTE0LDExOSwwLDAsMCwxMTQsMTEzLDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMSwwLDAsMCwxMTQsMTAyLDAsMCwwLDYyLDEsMCwwLDExNSwyMCwKKyAgICAwLDAsMCw4LDM1LDQsMiw0LDEsMTQsMTEsOCwxMCw4LDEyLDEyLAorICAgIDksMTQsNCwxMiw4LDEyLDQsMTE0LDEwMiwwLDAsMCw0MSwyLDExNCwxMDMsCisgICAgMCwwLDAsMTE0LDEwNSwwLDAsMCw5OSwyLDAsMCwwLDIsMCwwLAorICAgIDAsNiwwLDAsMCwxNCwwLDAsMCw2NywwLDAsMCwxMTUsMTU0LDAsCisgICAgMCwwLDExNiwwLDEyNCwxLDEwMCwxLDEzMSwyLDExNCw3NCwxMTYsMSwxMDAsMiwKKyAgICAxMDcsOCwxMTQsMjIsMTE2LDIsMTMwLDEsMTE2LDEsMTA2LDMsMTI1LDQsMTI0LDMsCisgICAgMTAwLDIsMTA3LDgsMTE0LDQ4LDEyNCw0LDEyNCwwLDEyNCwxLDEwMCwzLDE0MSwyLAorICAgIDgzLDAsMTI0LDMsMTE0LDU2LDEwMywwLDExMCwyLDEwMCwyLDEyNSw1LDEyNCw0LAorICAgIDEyNCwwLDEyNCwxLDEyNCw1LDEwMCw0LDE0MSwzLDgzLDAsMTI0LDMsMTAwLDIsCisgICAgMTA3LDgsMTE0LDEzOCwxMTYsMCwxMjQsMSwxMDAsNSwxMzEsMiwxMTQsMTM0LDEyMSwxNCwKKyAgICAxMjQsMSwxMDYsNCwxMjQsMCwxMzEsMSwxMjUsMyw4NywwLDExMywxMzgsNCwwLAorICAgIDExNiw1LDEwNywxMCwxMTQsMTMwLDEsMCwxLDAsMSwwLDEwMCwyLDEyNSwzLAorICAgIDg5LDAsMTEzLDEzOCw4OCwwLDExMCw0LDEwMCw2LDEyNSwzLDExNiw2LDEyNCwwLAorICAgIDEyNCwxLDEyNCwyLDEyNCwzLDEwMCw3LDE0MSw0LDgzLDAsNDEsOCwxMjIsNTMsCisgICAgODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKKyAgICAxMTUsMTEyLDEwMSw5OSwzMiw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExOCw5NywKKyAgICAxMTQsMTA1LDExMSwxMTcsMTE1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTA5LDEwMSwxMTYsCisgICAgMTA0LDExMSwxMDAsMTE1LDQ2LDkwLDEyLDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsCisgICAgOTcsMTA5LDEwMSw3OCw0MSwxLDExNCw5MywwLDAsMCw0MSwyLDExNCw5MywwLAorICAgIDAsMCwxMTQsMTA2LDAsMCwwLDExNCwxMDUsMCwwLDAsNzAsNDEsMiwxMTQsCisgICAgMTAzLDAsMCwwLDExNCwxMDUsMCwwLDAsNDEsNywxMTQsNCwwLDAsMCwKKyAgICAxMTQsMTE1LDAsMCwwLDExNCwxMTYsMCwwLDAsMjE4LDIzLDExNSwxMTIsMTAxLDk5LAorICAgIDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsMTA4LDExMSw5OSw5NywxMTYsCisgICAgMTA1LDExMSwxMTAsMTE0LDEwNSwwLDAsMCwxMTQsNzAsMCwwLDAsMTE0LDEwMiwwLAorICAgIDAsMCw0MSw2LDExNCwxNSwwLDAsMCwxMTQsOTMsMCwwLDAsMTE0LDEwMywKKyAgICAwLDAsMCwxMTQsMTA1LDAsMCwwLDExNCwxMjQsMCwwLDAsOTAsNiwxMTUsCisgICAgMTAxLDk3LDExNCw5OSwxMDQsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMTE0LDc4LDAsMCwwLDE2MywxLDAsMCwxMTUsMzQsMCwKKyAgICAwLDAsMCwyLDEwLDEsOCwxLDQsMSw2LDIsOCwxLDEyLDEsCisgICAgMTIsMSw2LDEsOCwyLDgsMSwxMCwxLDIsMSwxNCwxLDE0LDEsCisgICAgMTIsMyw0LDIsMTE0LDc4LDAsMCwwLDk5LDMsMCwwLDAsMCwwLAorICAgIDAsMCw4LDAsMCwwLDUzLDAsMCwwLDY3LDAsMCwwLDExNSw1NiwKKyAgICAxLDAsMCwxMjEsMTAsMTI0LDAsMTA2LDAsMTI1LDMsODcsMCwxMTAsMjAsNCwKKyAgICAwLDExNiwxLDEwNywxMCwxMTQsMzAsMSwwLDEsMCwxLDAsODksMCwxMTAsCisgICAgMTQsODgsMCwxMjQsMywxMDAsMCwxMDcsOSwxMTQsNDQsMTI0LDMsODMsMCwxMjQsCisgICAgMCwxMDYsMiwxMjUsNCwxMjQsMSwxMDAsMCwxMDcsOCwxMTQsOTAsMTIxLDEwLDEyNCwKKyAgICAwLDEwNiwzLDEyNSwxLDg3LDAsMTEwLDIwLDQsMCwxMTYsMSwxMDcsMTAsMTE0LAorICAgIDg4LDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMjEsMTAsMTI0LAorICAgIDAsMTA2LDQsMTI1LDUsODcsMCwxMTAsMjQsNCwwLDExNiwxLDEwNywxMCwxMTQsCisgICAgMTI0LDEsMCwxLDAsMSwwLDEwMCwwLDEyNSw1LDg5LDAsMTEwLDIsODgsCisgICAgMCwxMjQsMiwxMDAsMCwxMDcsOCwxMTQsMTg0LDEyNCw1LDEwMCwwLDEwNyw4LDExNCwKKyAgICAxODAsMTIxLDEwLDEyNCwxLDEwNiw1LDEyNSwyLDg3LDAsMTEzLDE4NCw0LDAsMTE2LAorICAgIDEsMTA3LDEwLDExNCwxNzYsMSwwLDEsMCwxLDAsMTAwLDAsMTI1LDIsODksCisgICAgMCwxMTMsMTg0LDg4LDAsMTEwLDQsMTI0LDUsMTI1LDIsMTIxLDEwLDEyNCwwLDEwNiwKKyAgICA2LDEyNSw2LDg3LDAsMTEwLDI0LDQsMCwxMTYsMSwxMDcsMTAsMTE0LDIxOCwxLAorICAgIDAsMSwwLDEsMCwxMDAsMCwxMjUsNiw4OSwwLDExMCwyLDg4LDAsMTIxLAorICAgIDE0LDExNiw3LDEyNCwwLDEwNiw4LDEzMSwxLDEyNSw3LDg3LDAsMTEwLDI2LDQsCisgICAgMCwxMTYsMSwxMDcsMTAsMTQ0LDEsMTE0LDQsMSwwLDEsMCwxLDAsMTAwLAorICAgIDAsMTI1LDcsODksMCwxMTAsMiw4OCwwLDExNiw5LDEyNCw0LDEyNCwxLDEyNCwKKyAgICAyLDEwMCwxLDE0MSwzLDEyNSwzLDEyNCw1LDEwMCwwLDEwNyw4LDE0NCwxLDExNCwKKyAgICAzNCwxMDAsMiwxMTAsMiwxMDAsMywxMjQsMyw5NSwxMCwxMjQsNiwxMjQsMyw5NSwKKyAgICAxMSwxMjQsNywxMjQsMyw5NSwxMiwxMjQsMyw4MywwLDQxLDQsNzgsNDEsMSwKKyAgICAxMTQsMTAzLDAsMCwwLDcwLDg0LDQxLDEzLDExNCw4OSwwLDAsMCwxMTQsOTAsCisgICAgMCwwLDAsMTE0LDEsMCwwLDAsMTE0LDg1LDAsMCwwLDExNCw5MiwwLAogICAgIDAsMCw5MCw3LDk1LDc5LDgyLDczLDcxLDczLDc4LDIxOCwxMCw5NSw5NSw5OSwKICAgICA5Nyw5OSwxMDQsMTAxLDEwMCw5NSw5NSwyMTgsNCwxMDgsMTA1LDExNSwxMTYsMjE4LDgsOTUsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsMTE0LDEwNiwwLDAsMCwxMTQsMTExLDAsMCwKLSAgICAwLDExNCwxMTYsMCwwLDAsMTE0LDExMCwwLDAsMCw0MSw4LDExNCw4OSwwLAotICAgIDAsMCwxMTQsOTksMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsODgsMCwwLAorICAgIDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDExNCwxMDIsMCwwLDAsMTE0LDEwNywwLDAsCisgICAgMCwxMTQsMTEyLDAsMCwwLDExNCwxMDYsMCwwLDAsNDEsOCwxMTQsODMsMCwKKyAgICAwLDAsMTE0LDkzLDAsMCwwLDExNCwxMDMsMCwwLDAsMTE0LDgyLDAsMCwKICAgICAwLDExNCwxNSwwLDAsMCw5MCw4LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDExNCwxMTYsMCwwLDAsMTE0LDExMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDExNCwxMTIsMCwwLDAsMTE0LDEwNiwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAogICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTcsOTUsMTE1LDExMiwxMDEsOTksCi0gICAgOTUsMTAyLDExNCwxMTEsMTA5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDIwOSwxLDAsMCwKLSAgICAxMTUsNzIsMCwwLDAsMCwyLDMsMSwxMywxLDEzLDEsNSwyLDEyLAotICAgIDEsNCwyLDksMSwxMiwxLDMsMSwxMywxLDEzLDIsNSwxLDMsCi0gICAgMSwxMywxLDEzLDEsMTEsMSwxMiwxLDEyLDEsMywxLDEzLDEsMTMsCi0gICAgMSwxNCwyLDYsMSwzLDEsMTMsMSwxMywxLDExLDEsMywxLDE5LAotICAgIDEsMTMsMSwxMSwyLDIxLDEsMjcsMSw5LDEsOSwxLDExNCwxMzIsMCwKLSAgICAwLDAsMjE4LDgsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSw3MCw5OSwyLDAsCi0gICAgMCwwLDEsMCwwLDAsNSwwLDAsMCw1OSwwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsNTQsMiwwLDAsMTI0LDIsMCwxMTUsMzAsMCwxMTYsMCwwLAotICAgIDEyNCwxLDAsMTAwLDEsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsMCwxMDcsCi0gICAgOCwwLDExNCw2NywwLDEyMSwxNiwwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMSwKLSAgICAwLDk1LDIsMCw4NywxMTAsMTgsMCw0LDExNiwzLDAsMTA3LDEwLDAsMTE0LAotICAgIDY2LDAsMSwxLDEsODksMTEwLDEsMCw4OCwxMjQsMiwwLDExNSw5NywwLAotICAgIDExNiwwLDAsMTI0LDEsMCwxMDAsMiwwLDEwMCwwLDAsMTMxLDMsMCwxMDAsCi0gICAgMCwwLDEwNyw4LDAsMTE0LDIyMSwwLDEyNCwwLDAsMTA2LDQsMCwxMjUsMywKLSAgICAwLDEyNCwzLDAsMTAwLDAsMCwxMDcsOCwwLDExNCwxODcsMCwxMjQsMCwwLAotICAgIDEwNiw1LDAsMTAwLDAsMCwxMDcsOSwwLDExNCwxODcsMCwxMTYsNiwwLDEwMCwKLSAgICAwLDAsMTA3LDgsMCwxMTQsMTUxLDAsMTE2LDcsMCwxMzAsMSwwLDExNiw2LAotICAgIDAsMTA2LDgsMCwxMjUsNCwwLDEyNCw0LDAsMTA2LDksMCwxMjQsNCwwLAotICAgIDEzMSwxLDAsMTI1LDMsMCwxMjQsMCwwLDEwNiw1LDAsMTI0LDMsMCw5NSwKLSAgICAxMCwwLDEyMSwxMywwLDEyNCwzLDAsMTI0LDEsMCw5NSwxMSwwLDg3LDExMCwKLSAgICAxOCwwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsMjIwLDAsMSwxLDEsODksCi0gICAgMTEwLDEsMCw4OCwxMjQsMiwwLDExNSwyNTEsMCwxMTYsMCwwLDEyNCwxLDAsCi0gICAgMTAwLDMsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsMCwxMDcsOCwwLDExNCwKLSAgICAzMiwxLDEyMSwxNiwwLDEyNCwwLDAsMTA2LDEyLDAsMTI0LDEsMCw5NSwxMywKLSAgICAwLDg3LDExMCwxOCwwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsMzEsMSwxLAotICAgIDEsMSw4OSwxMTAsMSwwLDg4LDEyMSwxMywwLDEyNCwwLDAsMTI0LDEsMCwKLSAgICA5NSwxNCwwLDg3LDExMCwxOCwwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsNjUsCi0gICAgMSwxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCwyLDAsMTE1LDk2LDEsMTE2LAotICAgIDAsMCwxMjQsMSwwLDEwMCw0LDAsMTAwLDAsMCwxMzEsMywwLDEwMCwwLAotICAgIDAsMTA3LDgsMCwxMTQsMTQ4LDEsMTI0LDAsMCwxMDYsNSwwLDEwMCwwLDAsCi0gICAgMTA3LDksMCwxMTQsMTQ4LDEsMTIxLDE2LDAsMTI0LDAsMCwxMDYsNSwwLDEyNCwKLSAgICAxLDAsOTUsMTUsMCw4NywxMTAsMTgsMCw0LDExNiwzLDAsMTA3LDEwLDAsCi0gICAgMTE0LDE0NywxLDEsMSwxLDg5LDExMCwxLDAsODgsMTI0LDAsMCwxMDYsMTYsCi0gICAgMCwxMTQsNTAsMiwxMjQsMiwwLDExNSwxODcsMSwxMTYsMCwwLDEyNCwxLDAsCi0gICAgMTAwLDUsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsMCwxMDcsOCwwLDExNCwKLSAgICAyMjQsMSwxMjEsMTYsMCwxMjQsMCwwLDEwNiwxNywwLDEyNCwxLDAsOTUsMTgsCi0gICAgMCw4NywxMTAsMTgsMCw0LDExNiwzLDAsMTA3LDEwLDAsMTE0LDIyMywxLDEsCi0gICAgMSwxLDg5LDExMCwxLDAsODgsMTI0LDIsMCwxMTUsMjU0LDEsMTE2LDAsMCwKLSAgICAxMjQsMSwwLDEwMCw2LDAsMTAwLDAsMCwxMzEsMywwLDEwMCwwLDAsMTA3LAotICAgIDgsMCwxMTQsNTAsMiwxMjQsMCwwLDEwNiwxOSwwLDEwMCwwLDAsMTA3LDksCi0gICAgMCwxMTQsNTAsMiwxMjEsMTYsMCwxMjQsMCwwLDEwNiwxOSwwLDEyNCwxLDAsCi0gICAgOTUsMjAsMCw4NywxMTAsMTgsMCw0LDExNiwzLDAsMTA3LDEwLDAsMTE0LDQ5LAotICAgIDIsMSwxLDEsODksMTEwLDEsMCw4OCwxMjQsMSwwLDgzLDQxLDcsNzgsCi0gICAgMTE0LDEsMCwwLDAsMTE0LDkxLDAsMCwwLDIxOCwxMSw5NSw5NSwxMTIsOTcsCi0gICAgOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsMTE0LDEzMSwwLDAsMCwxMTQsOTgsMCwwLAotICAgIDAsMTE0LDEyOSwwLDAsMCw0MSwyMSwxMTQsNiwwLDAsMCwxMTQsMTUsMCwKLSAgICAwLDAsMTE0LDEsMCwwLDAsMTE0LDk2LDAsMCwwLDExNCw5OSwwLDAsCi0gICAgMCwxMTQsMTEwLDAsMCwwLDExNCwxMTksMCwwLDAsMTE0LDEyMCwwLDAsMCwKKyAgICA5NSwxMDIsMTE0LDExMSwxMDksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTkyLDEsMCwwLAorICAgIDExNSw3MiwwLDAsMCwwLDIsMiwxLDEwLDEsMTQsMSw2LDIsOCwKKyAgICAxLDQsMiw2LDEsOCwxLDIsMSwxMCwxLDE0LDIsNiwxLDIsCisgICAgMSwxMCwxLDE0LDEsMTAsMSw4LDEsOCwxLDIsMSwxMCwxLDE0LAorICAgIDEsMTIsMiw0LDEsMiwxLDEwLDEsMTQsMSwxMCwxLDIsMSwxNCwKKyAgICAxLDE2LDEsMTAsMiwxNCwxLDIwLDEsNiwxLDYsMSwxMTQsMTI4LDAsCisgICAgMCwwLDcwLDQxLDEsMjE4LDgsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSw5OSwKKyAgICAyLDAsMCwwLDEsMCwwLDAsNSwwLDAsMCw1OSwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsMjEyLDEsMCwwLDEyNCwyLDExNSwyMCwxMTYsMCwxMjQsCisgICAgMSwxMDAsMSwxMDAsMCwxMzEsMywxMDAsMCwxMDcsOCwxMTQsNTQsMTIxLDEyLDEyNCwKKyAgICAwLDEwNiwxLDEyNCwxLDk1LDIsODcsMCwxMTAsMjAsNCwwLDExNiwzLDEwNywKKyAgICAxMCwxMTQsNTIsMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLDEyNCwKKyAgICAyLDExNSw3NCwxMTYsMCwxMjQsMSwxMDAsMiwxMDAsMCwxMzEsMywxMDAsMCwxMDcsCisgICAgOCwxMTQsMTY2LDEyNCwwLDEwNiw0LDEyNSwzLDEyNCwzLDEwMCwwLDEwNyw4LDExNCwKKyAgICAxMzQsMTI0LDAsMTA2LDUsMTAwLDAsMTA3LDksMTE0LDEzNCwxMTYsNiwxMDAsMCwxMDcsCisgICAgOCwxMTQsMTEwLDExNiw3LDEzMCwxLDExNiw2LDEwNiw4LDEyNSw0LDEyNCw0LDEwNiwKKyAgICA5LDEyNCw0LDEzMSwxLDEyNSwzLDEyNCwwLDEwNiw1LDEyNCwzLDk1LDEwLDEyMSwKKyAgICAxMCwxMjQsMywxMjQsMSw5NSwxMSw4NywwLDExMCwyMCw0LDAsMTE2LDMsMTA3LAorICAgIDEwLDExNCwxNjQsMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLDEyNCwKKyAgICAyLDExNSwxODYsMTE2LDAsMTI0LDEsMTAwLDMsMTAwLDAsMTMxLDMsMTAwLDAsMTA3LAorICAgIDgsMTE0LDIyMCwxMjEsMTIsMTI0LDAsMTA2LDEyLDEyNCwxLDk1LDEzLDg3LDAsMTEwLAorICAgIDIwLDQsMCwxMTYsMywxMDcsMTAsMTE0LDIxOCwxLDAsMSwwLDEsMCw4OSwKKyAgICAwLDExMCwyLDg4LDAsMTIxLDEwLDEyNCwwLDEyNCwxLDk1LDE0LDg3LDAsMTEwLAorICAgIDIwLDQsMCwxMTYsMywxMDcsMTAsMTE0LDI1MCwxLDAsMSwwLDEsMCw4OSwKKyAgICAwLDExMCwyLDg4LDAsMTI0LDIsMTQ0LDEsMTE1LDIwLDExNiwwLDEyNCwxLDEwMCwKKyAgICA0LDEwMCwwLDEzMSwzLDEwMCwwLDEwNyw4LDE0NCwxLDExNCw2OCwxMjQsMCwxMDYsCisgICAgNSwxMDAsMCwxMDcsOSwxNDQsMSwxMTQsNjgsMTIxLDEyLDEyNCwwLDEwNiw1LDEyNCwKKyAgICAxLDk1LDE1LDg3LDAsMTEwLDIyLDQsMCwxMTYsMywxMDcsMTAsMTQ0LDEsMTE0LAorICAgIDY2LDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMjQsMCwxMDYsCisgICAgMTYsMTQ0LDEsMTE0LDIwOCwxMjQsMiwxNDQsMSwxMTUsMTAwLDExNiwwLDEyNCwxLDEwMCwKKyAgICA1LDEwMCwwLDEzMSwzLDEwMCwwLDEwNyw4LDE0NCwxLDExNCwxMzYsMTIxLDEyLDEyNCwKKyAgICAwLDEwNiwxNywxMjQsMSw5NSwxOCw4NywwLDExMCwyMiw0LDAsMTE2LDMsMTA3LAorICAgIDEwLDE0NCwxLDExNCwxMzQsMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwKKyAgICAwLDEyNCwyLDE0NCwxLDExNSwxNjAsMTE2LDAsMTI0LDEsMTAwLDYsMTAwLDAsMTMxLAorICAgIDMsMTAwLDAsMTA3LDgsMTQ0LDEsMTE0LDIwOCwxMjQsMCwxMDYsMTksMTAwLDAsMTA3LAorICAgIDksMTQ0LDEsMTE0LDIwOCwxMjEsMTIsMTI0LDAsMTA2LDE5LDEyNCwxLDk1LDIwLDg3LAorICAgIDAsMTEwLDIyLDQsMCwxMTYsMywxMDcsMTAsMTQ0LDEsMTE0LDIwNiwxLDAsMSwKKyAgICAwLDEsMCw4OSwwLDExMCwyLDg4LDAsMTI0LDEsODMsMCw0MSw3LDc4LAorICAgIDExNCwxLDAsMCwwLDExNCw4NSwwLDAsMCwyMTgsMTEsOTUsOTUsMTEyLDk3LAorICAgIDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDExNCwxMjcsMCwwLDAsMTE0LDkyLDAsMCwKKyAgICAwLDExNCwxMjUsMCwwLDAsNDEsMjEsMTE0LDYsMCwwLDAsMTE0LDE1LDAsCisgICAgMCwwLDExNCwxLDAsMCwwLDExNCw5MCwwLDAsMCwxMTQsOTMsMCwwLAorICAgIDAsMTE0LDEwNiwwLDAsMCwxMTQsMTE1LDAsMCwwLDExNCwxMTYsMCwwLDAsCiAgICAgMjE4LDE2LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwKICAgICAxMDEsMTE0LDIxOCw3LDk1LDk1LDExMCwxMDEsMTE5LDk1LDk1LDkwLDUsOTUsMTEyLDk3LAotICAgIDExNiwxMDQsMTE0LDkxLDAsMCwwLDExNCwxMjMsMCwwLDAsMTE0LDEzNCwwLDAsCi0gICAgMCwxMTQsOTUsMCwwLDAsMTE0LDEzMSwwLDAsMCwxMTQsMTE3LDAsMCwwLAotICAgIDExNCwxMDcsMCwwLDAsMTE0LDk4LDAsMCwwLDExNCwxMTYsMCwwLDAsMTE0LAotICAgIDEyOSwwLDAsMCw0MSw1LDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsCi0gICAgMTE0LDEzMywwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDEzNSwwLDAsMCwxMTQsCisgICAgMTE2LDEwNCwxMTQsODUsMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsMTMwLDAsMCwKKyAgICAwLDExNCw4OSwwLDAsMCwxMTQsMTI3LDAsMCwwLDExNCwxMTMsMCwwLDAsCisgICAgMTE0LDEwMywwLDAsMCwxMTQsOTIsMCwwLDAsMTE0LDExMiwwLDAsMCwxMTQsCisgICAgMTI1LDAsMCwwLDQxLDUsMTE0LDgyLDAsMCwwLDExNCw4MywwLDAsMCwKKyAgICAxMTQsMTI5LDAsMCwwLDExNCw5MywwLDAsMCwxMTQsMTMxLDAsMCwwLDExNCwKICAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxOCwKICAgICA5NSwxMDUsMTEwLDEwNSwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsOTcsMTE2LDExNiwKLSAgICAxMTQsMTE1LDI1NCwxLDAsMCwxMTUsOTIsMCwwLDAsMCw0LDMwLDEsMywKLSAgICAxLDE2LDEsMTMsMSw1LDIsMzAsMSw5LDEsMTIsMiwxNSwxLDEyLAotICAgIDEsNiwxLDksMiwxNSwxLDEyLDEsMywxLDEzLDEsMTMsMSw1LAotICAgIDIsMzAsMSwzLDEsMTYsMSwxMywxLDUsMiwzLDEsMTMsMSwxMywKLSAgICAxLDUsMiwzMCwxLDE1LDEsMywxLDE2LDEsMTMsMSw1LDIsOSwKLSAgICAxLDMwLDEsMywxLDE2LDEsMTMsMSw1LDIsMzAsMSwxNSwxLDMsCi0gICAgMSwxNiwxLDEzLDEsNSwxLDExNCwxMzcsMCwwLDAsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDIsMCwwLDAsNSwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMTI5LDAsMCwwLDEwMCwxLDAsMTI1LDEsMCwxMTYsMCwwLDEyNCwKLSAgICAwLDAsMTA2LDEsMCwxMDAsMiwwLDEzMSwyLDAsMTE0LDQ1LDAsMTI0LDAsCi0gICAgMCwxMDYsMSwwLDEwNiwyLDAsMTI0LDAsMCwxMzEsMSwwLDEyNSwxLDAsCi0gICAgMTEwLDQwLDAsMTE2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTAwLDMsMCwxMzEsCi0gICAgMiwwLDExNCw4NSwwLDExNiwzLDAsMTA2LDQsMCwxMDAsNCwwLDExNiw1LAotICAgIDAsMTAwLDUsMCwxMDAsNiwwLDEzMSwyLDEsMSwxMjQsMSwwLDEwMCwxLAotICAgIDAsMTA3LDgsMCwxMTQsMTEyLDAsMTE2LDYsMCwxMjQsMCwwLDEwNiw3LDAsCi0gICAgMTMxLDEsMCwxMjUsMSwwLDExNiw4LDAsMTI0LDAsMCwxMjQsMSwwLDEzMSwKLSAgICAyLDAsMSwxMjQsMSwwLDgzLDQxLDcsMTIyLDQzLDY3LDExNCwxMDEsOTcsMTE2LAotICAgIDEwMSwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OCw5NywxMTUsMTAxLDEwMCwKLSAgICAzMiwxMTEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiwxMTQsMTExLDExOCwxMDUsMTAwLDEwMSwxMDAsCi0gICAgMzIsMTE1LDExMiwxMDEsOTksNDYsNzgsMjE4LDEzLDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwyMTgsMTEsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTIyLDg3LDExNSwxMTYsOTcsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMDUsMTEwLAotICAgIDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsNTEsNDYsNTQsNDQsMzIsMTA4LDExMSw5NywKLSAgICAxMDAsMTAxLDExNCwxMTUsMzIsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDUsMTEwLDEwMywzMiwxMDEsMTIwLAotICAgIDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDksMTE3LDExNSwxMTYsCi0gICAgMzIsOTcsMTA4LDExNSwxMTEsMzIsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDEsMzIsOTksMTE0LDEwMSwKLSAgICA5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDkwLDEwLDExNSwxMTYsCi0gICAgOTcsOTksMTA3LDEwOCwxMDEsMTE4LDEwMSwxMDgsMjMzLDIsMCwwLDAsNDEsOSwxMTQsCi0gICAgNCwwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDEzOCwwLDAsMCwyMTgsOSwKLSAgICA5NSwxMTksOTcsMTE0LDExMCwxMDUsMTEwLDEwMywxMTUsMjE4LDQsMTE5LDk3LDExNCwxMTAsMjE4LAotICAgIDE4LDY4LDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsODcsOTcsMTE0LDExMCwKLSAgICAxMDUsMTEwLDEwMywxMTQsMTYsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxMzcsMCwKLSAgICAwLDAsNDEsMiwxMTQsODgsMCwwLDAsMTE0LDg5LDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxNiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTE1LDExMiwxMDEsOTksNTgsCi0gICAgMiwwLDAsMTE1LDIwLDAsMCwwLDAsMyw2LDEsMTgsMywyMSwxLAotICAgIDE4LDEsOSwyLDEzLDEsMTIsMSwxNSwxLDEzLDEsMTE0LDE0NCwwLDAsCi0gICAgMCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSwxNDksMCwwLDAsMTI0LDAsMCwxMDYsMCwKLSAgICAwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMjEsMCwxMDAsMiwwLDExMCw2LDAsCi0gICAgMTI0LDAsMCwxMDYsMCwwLDEyNSwxLDAsMTI0LDAsMCwxMDYsMSwwLDEwMCwKLSAgICAxLDAsMTA3LDgsMCwxMTQsOTUsMCwxMjQsMCwwLDEwNiwyLDAsMTAwLDEsCi0gICAgMCwxMDcsOCwwLDExNCw3MywwLDEwMCwzLDAsMTA2LDMsMCwxMjQsMSwwLAotICAgIDEzMSwxLDAsODMsMTAwLDQsMCwxMDYsMywwLDEyNCwxLDAsMTI0LDAsMCwKLSAgICAxMDYsMiwwLDEzMSwyLDAsODMsMTEwLDUwLDAsMTI0LDAsMCwxMDYsNCwwLAotICAgIDExNCwxMjMsMCwxMDAsNSwwLDEwNiwzLDAsMTI0LDEsMCwxMjQsMCwwLDEwNiwKLSAgICAxLDAsMTMxLDIsMCw4MywxMDAsNiwwLDEwNiwzLDAsMTI0LDAsMCwxMDYsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMiwwLDgzLDEwMCwxLDAsODMsCi0gICAgNDEsNywxMjIsMzgsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTQsCi0gICAgMTAxLDExMiwxMTQsMzIsMTE2LDExMSwzMiwxMTcsMTE1LDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0Niw3OCwxMTQsOTMsMCwwLDAsCi0gICAgMTIyLDEzLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDYyLDEyMiwKLSAgICAyMCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCwxMjMsCi0gICAgMzMsMTE0LDEyNSw0MSw2MiwxMjIsMjMsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLAotICAgIDMzLDExNCwxMjUsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LDYyLDEyMiwxOCwKLSAgICA2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCwxMjMsMTI1LAotICAgIDQxLDYyLDQxLDUsMTE0LDE1LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDk5LAotICAgIDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsMTE3LDAsMCwwLDQxLDIsMTE0LAotICAgIDg4LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsOTcsMCwwLDAsNzYsMiwwLAotICAgIDAsMTE1LDE2LDAsMCwwLDAsMywzMCwxLDE1LDEsMTUsMSwxMywyLAotICAgIDIyLDIsOSwxLDE5LDIsMTE0LDk3LDAsMCwwLDk5LDIsMCwwLDAsCi0gICAgMCwwLDAsMCw0LDAsMCwwLDEyLDAsMCwwLDY3LDAsMCwwLAotICAgIDExNSwyNTMsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNSwyLDAsMTE2LDEsCi0gICAgMCwxMDYsMiwwLDEzMSwwLDAsMSwxMTYsMywwLDEyNCwyLDAsMTMxLDEsCi0gICAgMCwxNDMsMjA4LDAsMSwxMTYsNCwwLDEwNiw1LDAsMTA2LDYsMCwxMjQsMiwKLSAgICAwLDEzMSwxLDAsMTI0LDEsMCwxMDcsOSwwLDExNCw4OSwwLDEwMCwxLDAsCi0gICAgMTA2LDcsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwxMTYsOCwwLDEyNCwKLSAgICAzLDAsMTAwLDIsMCwxMjQsMiwwLDEzMSwxLDEsMTMwLDEsMCwxMjQsMCwKLSAgICAwLDEwNiw5LDAsMTAwLDMsMCwxMDcsOCwwLDExNCwxNjMsMCwxMjQsMCwwLAotICAgIDEwNiwxMCwwLDEwMCwzLDAsMTA3LDgsMCwxMTQsMTQwLDAsMTE2LDgsMCwxMDAsCi0gICAgNCwwLDEwMCwyLDAsMTI0LDAsMCwxMDYsMCwwLDEzMSwxLDEsMTMwLDEsCi0gICAgMCwxMTYsMTEsMCwxMjQsMCwwLDEyNCwxLDAsMTAwLDUsMCwxMDAsNiwwLAotICAgIDEzMSwyLDEsMSwxMjQsMSwwLDgzLDExNiwxMSwwLDEyNCwwLDAsMTI0LDEsCi0gICAgMCwxMDAsNSwwLDEwMCw2LDAsMTMxLDIsMSwxLDExNiwxMiwwLDEyNCwwLAotICAgIDAsMTA2LDksMCwxMDAsNywwLDEzMSwyLDAsMTE1LDIxOSwwLDEyNCwwLDAsCi0gICAgMTA2LDksMCwxMDYsMTMsMCwxMjQsMiwwLDEzMSwxLDAsMSwxMTAsMTYsMCwKLSAgICAxMjQsMCwwLDEwNiw5LDAsMTA2LDE0LDAsMTI0LDEsMCwxMzEsMSwwLDEsCi0gICAgODcsMTAwLDMsMCw4MSw4Miw4OCwxMTYsNCwwLDEwNiw1LDAsMTI0LDIsMCwKLSAgICAyNSw4Myw0MSw4LDEyMiw1MSw2OSwxMjAsMTAxLDk5LDExNywxMTYsMTAxLDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDExNSwxMTIsMTAxLDk5LDMyLDEwNSwxMTAsMzIsOTcsMTEwLDMyLDEwMSwxMjAsMTA1LAotICAgIDExNSwxMTYsMTA1LDExMCwxMDMsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzksMTE1LDMyLDExMCwKLSAgICA5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQ2LDEyMiwzMCwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMTAsMTExLDExNiwzMiwxMDUsMTEwLDMyLDExNSwxMjEsCi0gICAgMTE1LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwxMTQsMTUsMCwwLDAsNzgsMTIyLAotICAgIDE0LDEwOSwxMDUsMTE1LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNCwKLSAgICAxMzMsMCwwLDAsODQsMTE0LDEzOSwwLDAsMCw0MSwxNSwxMTQsMTUsMCwwLAotICAgIDAsMTE0LDU3LDAsMCwwLDIxOCwxMiw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDk1LAotICAgIDEwOCwxMTEsOTksMTA3LDExNCw1NCwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLAotICAgIDAsMCwwLDExNCw0MiwwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LDc3LDAsCi0gICAgMCwwLDExNCw5OSwwLDAsMCwxMTQsMTEwLDAsMCwwLDExNCwxMzcsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMjE4LDExLDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDExNCwxMzksMCwwLDAsNDEsNCwxMTQsODgsMCwwLDAsMTE0LAotICAgIDg5LDAsMCwwLDExNCwxNSwwLDAsMCwyMTgsMywxMDksMTE1LDEwMywxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsODYsMCwKLSAgICAwLDAsOTMsMiwwLDAsMTE1LDMyLDAsMCwwLDAsMiw5LDEsMTAsCi0gICAgMSwxMywxLDI0LDEsMTUsMSwxOCwxLDE1LDEsMTUsMSwyMSwyLDE5LAotICAgIDEsNCwxLDE5LDEsMTgsNCwxOSwyLDIzLDEsMTE0LDg2LDAsMCwwLAotICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDI3LDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSwzLDEsMCwwLDEyNCwwLDAsMTA2LDAsMCwKLSAgICAxMDYsMSwwLDEyNCwwLDAsMTA2LDIsMCwxMzEsMSwwLDEsMTE2LDMsMCwKLSAgICAxMDYsNCwwLDEyNCwwLDAsMTA2LDIsMCwyNSwxMjUsMSwwLDExNiw1LDAsCi0gICAgMTI0LDEsMCwxMDAsMSwwLDEwMCwwLDAsMTMxLDMsMCwxMDAsMCwwLDEwNywKLSAgICA4LDAsMTE0LDk2LDAsMTIxLDE2LDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLAotICAgIDAsOTUsNiwwLDg3LDExMCwxOCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwxMTQsCi0gICAgOTUsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDExNiw1LDAsMTI0LDEsMCwKLSAgICAxMDAsMiwwLDEwMCwwLDAsMTMxLDMsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LAotICAgIDE5NywwLDEyMSw1NiwwLDEyNCwxLDAsMTA2LDgsMCwxMjQsMSwwLDk1LDksCi0gICAgMCwxMTYsMTAsMCwxMjQsMSwwLDEwMCwzLDAsMTMxLDIsMCwxMTUsMTc1LDAsCi0gICAgMTI0LDAsMCwxMDYsMiwwLDEwNiwxMSwwLDEwMCw0LDAsMTMxLDEsMCwxMDAsCi0gICAgNSwwLDI1LDEyNCwxLDAsOTUsOSwwLDg3LDExMCwxOCwwLDQsMTE2LDcsCi0gICAgMCwxMDcsMTAsMCwxMTQsMTk2LDAsMSwxLDEsODksMTEwLDEsMCw4OCwxMTYsCi0gICAgNSwwLDEyNCwxLDAsMTAwLDYsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsCi0gICAgMCwxMDcsOCwwLDExNCwyNTUsMCwxMjEsMTMsMCwxMjQsMCwwLDEyNCwxLDAsCi0gICAgOTUsMTIsMCw4NywxMTAsMTgsMCw0LDExNiw3LDAsMTA3LDEwLDAsMTE0LDI1NCwKLSAgICAwLDEsMSwxLDg5LDExMCwxLDAsODgsMTI0LDEsMCw4Myw0MSw3LDc4LAotICAgIDExNCw5MSwwLDAsMCwxMTQsMTM0LDAsMCwwLDExNCwxMzEsMCwwLDAsMTE0LAotICAgIDEyMSwwLDAsMCwxMTQsMzMsMCwwLDAsMTE0LDk1LDAsMCwwLDQxLDEzLAotICAgIDExNCw5OSwwLDAsMCwxMTQsMTQ2LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsCi0gICAgMTQsMCwwLDAsMTE0LDIxLDAsMCwwLDExNCw2LDAsMCwwLDExNCw5MSwKLSAgICAwLDAsMCwxMTQsOTYsMCwwLDAsMTE0LDEsMCwwLDAsMTE0LDEzNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCw5NSwwLDAsCi0gICAgMCw0MSwyLDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDI1LDk1LDEwOCwKLSAgICAxMTEsOTcsMTAwLDk1LDk4LDk3LDk5LDEwNywxMTksOTcsMTE0LDEwMCw5NSw5OSwxMTEsMTA5LAotICAgIDExMiw5NywxMTYsMTA1LDk4LDEwOCwxMDEsMTE4LDIsMCwwLDExNSw0MCwwLDAsMCwKLSAgICAwLDQsMTksMiwxNiwxLDI0LDEsMywxLDE2LDEsMTMsMSw1LDEsCi0gICAgMjQsMSwzLDQsMTIsMSwxNSwxLDI5LDEsMTMsMSw1LDEsMjQsMSwKLSAgICAzLDEsMTMsMSwxMywxLDUsMSwxMTQsMTQ4LDAsMCwwLDk5LDEsMCwKLSAgICAwLDAsMCwwLDAsMCwyLDAsMCwwLDExLDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwxNTksMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEwMCwwLDAsCi0gICAgMTA3LDksMCwxMTQsNDMsMCwxMTYsMSwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsCi0gICAgMSwwLDEzMSwyLDAsMTE1LDQzLDAsMTE2LDIsMCwxMjQsMCwwLDEzMSwxLAotICAgIDAsODMsMTE2LDMsMCwxMjQsMCwwLDEzMSwxLDAsMTI1LDEsMCwxMTYsNCwKLSAgICAwLDEyNCwxLDAsMTMxLDEsMCwxNDMsNzUsMCwxLDEyNCwwLDAsMTA2LDAsCi0gICAgMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDEyMiwwLDEyNCwwLDAsMTA2LDUsMCwKLSAgICAxMDAsMCwwLDEwNyw4LDAsMTE0LDEzOCwwLDExNiw2LDAsMTAwLDIsMCwxMDAsCi0gICAgMywwLDEyNCwwLDAsMTA2LDcsMCwxMzEsMSwxLDEzMCwxLDAsMTEwLDE2LAotICAgIDAsMTI0LDAsMCwxMDYsMCwwLDEwNiw4LDAsMTI0LDEsMCwxMzEsMSwwLAotICAgIDEsODcsMTAwLDAsMCw4MSw4Miw4OCwxMTYsOSwwLDEwNiwxMCwwLDEyNCwwLAotICAgIDAsMTA2LDcsMCwyNSw4Myw0MSw0LDc4LDExNCwxMzksMCwwLDAsMTIyLDE0LAotICAgIDEwOSwxMDUsMTE1LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNCwxNSwKLSAgICAwLDAsMCw0MSwxMSwxMTQsOTksMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDE0OCwwLDAsMCwxMTQsMTQ0LDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LDExMCwKLSAgICAwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxMzksMCwKLSAgICAwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCw0MSwyLDExNCw4OCwKLSAgICAwLDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE0LDk1LDEwOCwxMTEsOTcsMTAwLDk1LDExNywKLSAgICAxMTAsMTA4LDExMSw5OSwxMDcsMTAxLDEwMCwxNDcsMiwwLDAsMTE1LDIwLDAsMCwwLAotICAgIDAsMiwxNSwyLDE4LDEsMTAsMiwxMiwxLDEzLDEsMTUsMSwxNSwxLAotICAgIDI0LDMsMjMsNSwxMTQsMTQ5LDAsMCwwLDk5LDEsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDksMCwwLDAsNjcsMCwwLDAsMTE1LDQ3LAotICAgIDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMzEsMCwwLDEsMTE2LDIsMCwKLSAgICAxMjQsMCwwLDEwNiwzLDAsMTMxLDEsMCwxNDMsMTUsMCwxLDExNiw0LDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDgzLDg3LDEwMCwxLDAsODEsODIsODgsMTAwLDEsCi0gICAgMCw4Myw0MSwyLDEyMiwxOTEsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw5NywzMiwxMTAsCi0gICAgMTAxLDExOSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsCi0gICAgNDQsMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTE1LDExMiwxMDEsOTksMzksMTE1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAsMTAsCi0gICAgMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsCi0gICAgMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDEwMCwxMDAsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwNSwKLSAgICAxMTYsMTE1LDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCi0gICAgNzMsMTAyLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsCi0gICAgMTA4LDExNCwxMDEsOTcsMTAwLDEyMSwzMiwxMDUsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDExNSw0NCwzMiwxMTYsMTA0LDk3LDExNiwzMiwxMDEsMTIwLDEwNSwxMTUsCi0gICAgMTE2LDEwNSwxMTAsMTAzLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwMywxMDEsMTE2LDExNSwKLSAgICAxMCwzMiwzMiwzMiwzMiw5OSwxMDgsMTExLDk4LDk4LDEwMSwxMTQsMTAxLDEwMCw0NiwxMCwKLSAgICAxMCwzMiwzMiwzMiwzMiw3OCw0MSw1LDExNCw1NywwLDAsMCwxMTQsMTQ1LDAsCi0gICAgMCwwLDExNCw1NCwwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDE0OSwwLDAsCi0gICAgMCw0MSwxLDExNCw4OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMSwwLDAsMCwxMTQsODcsMCwwLDAsMTcwLDIsMCwwLAotICAgIDExNSw2LDAsMCwwLDAsOSwxMCwxLDE2LDEsMTE0LDg3LDAsMCwwLAotICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDUsMCwwLAotICAgIDAsNjQsMCwwLDAsMTE1LDIwNSwwLDAsMCwxMDEsMCwwLDkwLDEsMCwKLSAgICAxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDEsNCwwLDEwMCwKLSAgICAyLDAsMTAwLDMsMCwxMzIsMCwwLDEzMSwxLDAsOTAsNSwwLDEwMSw2LAotICAgIDAsMTAwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTAwLDYsMCwxMzIsMiwwLAotICAgIDEzMSwxLDAsOTAsNywwLDEwMSw2LDAsMTAwLDQsMCwxMDAsNywwLDEwMCwKLSAgICA4LDAsMTMyLDEsMCwxMzEsMSwwLDkwLDgsMCwxMDEsNiwwLDEwMCw5LAotICAgIDAsMTAwLDEwLDAsMTMyLDAsMCwxMzEsMSwwLDkwLDksMCwxMDEsNiwwLAotICAgIDEwMCwxMSwwLDEwMCwxMiwwLDEzMiwwLDAsMTMxLDEsMCw5MCwxMCwwLDEwMSwKLSAgICA2LDAsMTAxLDExLDAsMTAwLDEzLDAsMTAwLDE0LDAsMTMyLDAsMCwxMzEsMSwKLSAgICAwLDEzMSwxLDAsOTAsMTIsMCwxMDEsNiwwLDEwMSwxMSwwLDEwMCwxNSwwLAotICAgIDEwMCwxNiwwLDEzMiwwLDAsMTMxLDEsMCwxMzEsMSwwLDkwLDEzLDAsMTAxLAotICAgIDYsMCwxMDEsMTEsMCwxMDAsMTcsMCwxMDAsMTgsMCwxMzIsMCwwLDEzMSwxLAotICAgIDAsMTMxLDEsMCw5MCwxNCwwLDEwMSw2LDAsMTAxLDE1LDAsMTMxLDEsMCwKLSAgICA5MCwxNiwwLDEwMCw0LDAsODMsNDEsMTksMjE4LDE1LDY2LDExNywxMDUsMTA4LDExNiwKLSAgICAxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwxMjIsMTQ0LDc3LDEwMSwxMTYsOTcsCi0gICAgMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTAyLDExMSwxMTQsCi0gICAgMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDY1LDEwOCwxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LAotICAgIDExMSwxMDAsMTE1LDMyLDk3LDExNCwxMDEsMzIsMTAxLDEwNSwxMTYsMTA0LDEwMSwxMTQsMzIsOTksCi0gICAgMTA4LDk3LDExNSwxMTUsMzIsMTExLDExNCwzMiwxMTUsMTE2LDk3LDExNiwxMDUsOTksMzIsMTA5LAotICAgIDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDMyLDExNiwxMTEsMzIsOTcsMTE4LDExMSwxMDUsMTAwLDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLAotICAgIDEwNSwxMTAsMTE1LDExNiw5NywxMTAsMTE2LDEwNSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDk5LDEwOCw5NywxMTUsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk5LDEsMCwwLAotICAgIDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDE2LDAsMCwwLDEwMCwxLDAsMTA2LDAsMCwxMjQsMCwwLDEwNiwKLSAgICAxLDAsMTMxLDEsMCw4Myw0MSwyLDEyMiwxMTUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwKLSAgICAzMiwxMTQsMTAxLDExMiwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsCi0gICAgMTA0LDEwMSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLAotICAgIDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDUsMTA5LAotICAgIDExMiwxMTEsMTE0LDExNiwzMiwxMDksOTcsOTksMTA0LDEwNSwxMTAsMTAxLDExNCwxMjEsMzIsMTAwLAotICAgIDExMSwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNiwxMTEsOTgsMzIsMTA1LDExNiwxMTUsMTAxLAotICAgIDEwOCwxMDIsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTIyLDI0LDYwLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLDk4LDExNywxMDUsCi0gICAgMTA4LDExNiw0NSwxMDUsMTEwLDQxLDYyLDQxLDIsMTE0LDUwLDAsMCwwLDExNCwxLAotICAgIDAsMCwwLDQxLDEsMTE0LDg5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw5MiwwLDAsMCwxOTUsMiwKLSAgICAwLDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwyNyw2NiwxMTcsMTA1LDEwOCwxMTYsCi0gICAgMTA1LDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsOTUsMTE0LDEwMSwxMTIsMTE0LDc4LDk5LDQsMCwwLDAsMCwwLDAsMCwKLSAgICA0LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDU4LDAsMCwKLSAgICAwLDEyNCwyLDAsMTAwLDAsMCwxMDcsOSwwLDExNCwxNiwwLDEwMCwwLDAsCi0gICAgODMsMTE2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCwxMTQsNTAsMCwKLSAgICAxMTYsMiwwLDEyNCwxLDAsMTI0LDAsMCwxMDAsMSwwLDEwMCwyLDAsMTMxLAotICAgIDIsMSw4MywxMDAsMCwwLDgzLDEwMCwwLDAsODMsNDEsMyw3OCwxMTQsMTA3LAotICAgIDAsMCwwLDEyMiw4LDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDQxLDMsMTE0LAotICAgIDU3LDAsMCwwLDkwLDEwLDEwNSwxMTUsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsCi0gICAgMTE0LDg1LDAsMCwwLDQxLDQsMjE4LDMsOTksMTA4LDExNSwxMTQsNzgsMCwwLAotICAgIDAsMjE4LDQsMTEyLDk3LDExNiwxMDQsMjE4LDYsMTE2LDk3LDExNCwxMDMsMTAxLDExNiwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsOSwKLSAgICAxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksMjA0LDIsMCwwLDExNSwxMCwwLAotICAgIDAsMCwwLDIsMTIsMSw0LDEsMTUsMSwxOSwyLDEyMiwyNSw2NiwxMTcsCisgICAgMTE0LDExNSwyMzcsMSwwLDAsMTE1LDkyLDAsMCwwLDAsNCwyMCwxLDIsCisgICAgMSwxMiwxLDE0LDEsNiwyLDIwLDEsNiwxLDgsMiwxMCwxLDgsCisgICAgMSw0LDEsNiwyLDEwLDEsOCwxLDIsMSwxMCwxLDE0LDEsNiwKKyAgICAyLDIwLDEsMiwxLDEyLDEsMTQsMSw2LDIsMiwxLDEwLDEsMTQsCisgICAgMSw2LDIsMjQsMSwxMiwxLDIsMSwxMiwxLDE2LDEsNiwyLDgsCisgICAgMSwyNCwxLDIsMSwxMiwxLDE2LDEsNiwyLDI0LDEsMTIsMSwyLAorICAgIDEsMTIsMSwxNiwxLDYsMSwxMTQsMTMzLDAsMCwwLDk5LDEsMCwwLAorICAgIDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDgyLDAsMCwwLDEwMCwxLDEyNSwxLDExNiwwLDEyNCwwLDEwNiwxLAorICAgIDEwMCwyLDEzMSwyLDExNCwzMCwxMjQsMCwxMDYsMSwxMDYsMiwxMjQsMCwxMzEsMSwKKyAgICAxMjUsMSwxMTAsMjAsMTE2LDAsMTI0LDAsMTA2LDEsMTAwLDMsMTMxLDIsMTE0LDUwLAorICAgIDExNiwzLDEwMCw0LDEzMSwxLDEzMCwxLDEyNCwxLDEwMCwxLDEwNyw4LDExNCw2OCwKKyAgICAxMTYsNCwxMjQsMCwxMDYsNSwxMzEsMSwxMjUsMSwxMTYsNiwxMjQsMCwxMjQsMSwKKyAgICAxMzEsMiwxLDAsMTI0LDEsODMsMCw0MSw1LDEyMiw0Myw2NywxMTQsMTAxLDk3LAorICAgIDExNiwxMDEsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsOTcsMTE1LDEwMSwKKyAgICAxMDAsMzIsMTExLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsMTE0LDExMSwxMTgsMTA1LDEwMCwxMDEsCisgICAgMTAwLDMyLDExNSwxMTIsMTAxLDk5LDQ2LDc4LDIxOCwxMyw5OSwxMTQsMTAxLDk3LDExNiwxMDEsCisgICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMjE4LDExLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDEyMiw2NiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwzMiwxMTYsMTA0LAorICAgIDk3LDExNiwzMiwxMDAsMTAxLDEwMiwxMDUsMTEwLDEwMSwzMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDksMTE3LDExNSwxMTYsMzIsOTcsMTA4LDExNSwKKyAgICAxMTEsMzIsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDEsMzIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDQxLDcsMTE0LDQsMCwwLDAsMTE0LAorICAgIDkzLDAsMCwwLDExNCwxMzQsMCwwLDAsMTE0LDcwLDAsMCwwLDExNCwxNiwKKyAgICAwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDEzMywwLDAsMCw0MSwyLDExNCwKKyAgICA4MiwwLDAsMCwxMTQsODMsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMTUsMTEyLDEwMSw5OSw0MSwyLDAsMCwxMTUsMTgsCisgICAgMCwwLDAsMCwzLDQsMSwxMiwzLDE0LDEsMTIsMSw4LDIsOCwKKyAgICAxLDEwLDEsMTAsMSwxMTQsMTM2LDAsMCwwLDk5LDEsMCwwLDAsMCwKKyAgICAwLDAsMCwyLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDExMCwwLDAsMCwxMjQsMCwxMDYsMCwxMDAsMSwxMDcsOCwxMTQsMTQsMTAwLDIsCisgICAgMTEwLDQsMTI0LDAsMTA2LDAsMTI1LDEsMTI0LDAsMTA2LDEsMTAwLDEsMTA3LDgsCisgICAgMTE0LDY4LDEyNCwwLDEwNiwyLDEwMCwxLDEwNyw4LDExNCw1MiwxMDAsMywxMDYsMywKKyAgICAxMjQsMSwxMzEsMSw4MywwLDExMywxMDYsMTAwLDQsMTA2LDMsMTI0LDEsMTI0LDAsCisgICAgMTA2LDIsMTMxLDIsODMsMCwxMTAsMzgsMTI0LDAsMTA2LDQsMTE0LDkwLDEwMCw1LAorICAgIDEwNiwzLDEyNCwxLDEyNCwwLDEwNiwxLDEzMSwyLDgzLDAsMTEwLDE2LDEwMCw2LAorICAgIDEwNiwzLDEyNCwwLDEwNiwwLDEyNCwwLDEwNiwxLDEzMSwyLDgzLDAsMTAwLDEsCisgICAgODMsMCw0MSw3LDEyMiwzOCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDExNCwxMDEsMTEyLDExNCwzMiwxMTYsMTExLDMyLDExNywxMTUsMTAxLDMyLDEwMiwxMTEsMTE0LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDc4LDExNCw4NywwLAorICAgIDAsMCwxMjIsMTMsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsCisgICAgNjIsMTIyLDIwLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLAorICAgIDQwLDEyMywzMywxMTQsMTI1LDQxLDYyLDEyMiwyMyw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDMzLDExNCwxMjUsNjIsCisgICAgMTIyLDE4LDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLAorICAgIDEyMywxMjUsNDEsNjIsNDEsNSwxMTQsMTUsMCwwLDAsMTE0LDEwMywwLDAsMCwKKyAgICAxMTQsOTMsMCwwLDAsMTE0LDM4LDAsMCwwLDExNCwxMTMsMCwwLDAsNDEsCisgICAgMiwxMTQsODIsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw5MSwwLDAsMCw1OCwKKyAgICAyLDAsMCwxMTUsMTYsMCwwLDAsMCwzLDIwLDEsMTAsMSwxMCwxLAorICAgIDEyLDIsMTYsMiw2LDEsMTYsMiwxMTQsOTEsMCwwLDAsOTksMiwwLAorICAgIDAsMCwwLDAsMCwwLDQsMCwwLDAsMTIsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDE4NiwwLDAsMCwxMjQsMCwxMDYsMCwxMjUsMiwxMTYsMSwxMDYsCisgICAgMiwxMzEsMCwxLDAsMTE2LDMsMTI0LDIsMTMxLDEsMTQzLDE0OCwxLDAsMTE2LAorICAgIDQsMTA2LDUsMTA2LDYsMTI0LDIsMTMxLDEsMTI0LDEsMTA3LDksMTE0LDYyLDEwMCwKKyAgICAxLDEwNiw3LDEyNCwyLDEzMSwxLDEyNSwzLDExNiw4LDEyNCwzLDEyNCwyLDEwMCwKKyAgICAyLDE0MSwyLDEzMCwxLDEyNCwwLDEwNiw5LDEwMCwzLDEwNyw4LDExNCwxMTQsMTI0LAorICAgIDAsMTA2LDEwLDEwMCwzLDEwNyw4LDExNCw5NiwxMTYsOCwxMDAsNCwxMjQsMCwxMDYsCisgICAgMCwxMDAsMiwxNDEsMiwxMzAsMSwxMTYsMTEsMTI0LDAsMTI0LDEsMTAwLDUsMTAwLAorICAgIDYsMTQxLDMsMSwwLDEyNCwxLDgzLDAsMTE2LDExLDEyNCwwLDEyNCwxLDEwMCwKKyAgICA1LDEwMCw2LDE0MSwzLDEsMCwxMTYsMTIsMTI0LDAsMTA2LDksMTAwLDcsMTMxLAorICAgIDIsMTE1LDE1NCwxMjQsMCwxMDYsOSwxMDYsMTMsMTI0LDIsMTMxLDEsMSwwLDExMCwKKyAgICAxMiwxMjQsMCwxMDYsOSwxMDYsMTQsMTI0LDEsMTMxLDEsMSwwLDg3LDAsMTAwLAorICAgIDMsODEsMCw4MiwwLDg4LDAsMTE2LDQsMTA2LDUsMTI0LDIsMjUsMCw4MywKKyAgICAwLDQxLDgsMTIyLDcwLDY5LDEyMCwxMDEsOTksMTE3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTE1LDExMiwxMDEsOTksMzksMTE1LDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwKKyAgICAxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExMCwzMiw5NywxMTAsMzIsMTAxLAorICAgIDEyMCwxMDUsMTE1LDExNiwxMDUsMTEwLDEwMywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsCisgICAgMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNDYsMTIyLDMwLDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDExMCwxMTEsMTE2LDMyLDEwNSwxMTAsMzIsCisgICAgMTE1LDEyMSwxMTUsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQxLDEsMTE0LDE1LDAsCisgICAgMCwwLDc4LDEyMiwxNCwxMDksMTA1LDExNSwxMTUsMTA1LDExMCwxMDMsMzIsMTA4LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw4NCw0MSwxLDExNCwxMjksMCwwLDAsMTE0LDEzNSwwLDAsMCwKKyAgICA0MSwxNSwxMTQsMTUsMCwwLDAsMTE0LDQ2LDAsMCwwLDIxOCwxMiw5Nyw5OSwKKyAgICAxMTMsMTE3LDEwNSwxMTQsMTAxLDk1LDEwOCwxMTEsOTksMTA3LDExNCw0MiwwLDAsMCwxMTQsCisgICAgMTQsMCwwLDAsMTE0LDc5LDAsMCwwLDExNCwzMCwwLDAsMCwxMTQsMzgsCisgICAgMCwwLDAsMTE0LDcwLDAsMCwwLDExNCw5MywwLDAsMCwxMTQsMTA2LDAsCisgICAgMCwwLDExNCwxMzMsMCwwLDAsMTE0LDQsMCwwLDAsMjE4LDExLDEwOCwxMTEsCisgICAgOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxMzUsMCwwLDAsNDEsNCwKKyAgICAxMTQsODIsMCwwLDAsMTE0LDgzLDAsMCwwLDExNCwxNSwwLDAsMCwyMTgsCisgICAgMywxMDksMTE1LDEwMywxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwKKyAgICAwLDAsMCwxMTQsODAsMCwwLDAsNzUsMiwwLDAsMTE1LDMyLDAsMCwKKyAgICAwLDAsMiw2LDEsOCwxLDEwLDEsMTYsMSwxMCwxLDEyLDEsMTAsCisgICAgMSwxMCwxLDE0LDIsMTQsMSw0LDEsMTQsMSwxMiw0LDE0LDIsMjIsCisgICAgMSwxMTQsODAsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDIsCisgICAgMCwwLDAsMjcsMCwwLDAsNjcsMCwwLDAsMTE1LDIwNiwwLDAsMCwKKyAgICAxMjQsMCwxMDYsMCwxMDYsMSwxMjQsMCwxMDYsMiwxMzEsMSwxLDAsMTE2LDMsCisgICAgMTA2LDQsMTI0LDAsMTA2LDIsMjUsMCwxMjUsMSwxMTYsNSwxMjQsMSwxMDAsMSwKKyAgICAxMDAsMCwxMzEsMywxMDAsMCwxMDcsOCwxMTQsNzYsMTIxLDEyLDEyNCwwLDEwNiwwLAorICAgIDEyNCwxLDk1LDYsODcsMCwxMTAsMjAsNCwwLDExNiw3LDEwNywxMCwxMTQsNzQsCisgICAgMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLDExNiw1LDEyNCwxLAorICAgIDEwMCwyLDEwMCwwLDEzMSwzLDEwMCwwLDEwNyw4LDExNCwxNTQsMTIxLDQwLDEyNCwxLAorICAgIDEwNiw4LDEyNCwxLDk1LDksMTE2LDEwLDEyNCwxLDEwMCwzLDEzMSwyLDExNSwxMzAsCisgICAgMTI0LDAsMTA2LDIsMTA2LDExLDEwMCw0LDEzMSwxLDEwMCw1LDI1LDAsMTI0LDEsCisgICAgOTUsOSw4NywwLDExMCwyMCw0LDAsMTE2LDcsMTA3LDEwLDExNCwxNTIsMSwwLAorICAgIDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLDExNiw1LDEyNCwxLDEwMCw2LAorICAgIDEwMCwwLDEzMSwzLDEwMCwwLDEwNyw4LDExNCwyMDIsMTIxLDEwLDEyNCwwLDEyNCwxLAorICAgIDk1LDEyLDg3LDAsMTEwLDIwLDQsMCwxMTYsNywxMDcsMTAsMTE0LDIwMCwxLDAsCisgICAgMSwwLDEsMCw4OSwwLDExMCwyLDg4LDAsMTI0LDEsODMsMCw0MSw3LAorICAgIDc4LDExNCw4NSwwLDAsMCwxMTQsMTMwLDAsMCwwLDExNCwxMjcsMCwwLDAsCisgICAgMTE0LDExNywwLDAsMCwxMTQsMTksMCwwLDAsMTE0LDg5LDAsMCwwLDQxLAorICAgIDEzLDExNCw5MywwLDAsMCwxMTQsMTM4LDAsMCwwLDExNCwxNSwwLDAsMCwKKyAgICAxMTQsMTQsMCwwLDAsMTE0LDc5LDAsMCwwLDExNCw2LDAsMCwwLDExNCwKKyAgICA4NSwwLDAsMCwxMTQsOTAsMCwwLDAsMTE0LDEsMCwwLDAsMTE0LDEzMCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsMTE4LDAsMCwwLDExNCw4OSwwLAorICAgIDAsMCw0MSwyLDExNCw4MiwwLDAsMCwxMTQsODMsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDI1LDk1LAorICAgIDEwOCwxMTEsOTcsMTAwLDk1LDk4LDk3LDk5LDEwNywxMTksOTcsMTE0LDEwMCw5NSw5OSwxMTEsCisgICAgMTA5LDExMiw5NywxMTYsMTA1LDk4LDEwOCwxMDEsMTAwLDIsMCwwLDExNSw0MCwwLDAsCisgICAgMCwwLDQsMTQsMiwxMiwxLDE2LDEsMiwxLDEyLDEsMTQsMSw2LAorICAgIDEsMTYsMSwyLDQsOCwxLDEwLDEsMjIsMSwxNCwxLDYsMSwxNiwKKyAgICAxLDIsMSwxMCwxLDE0LDEsNiwxLDExNCwxNDAsMCwwLDAsOTksMSwKKyAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMTEsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDExOCwwLDAsMCwxMjQsMCwxMDYsMCwxMDAsMCwxMDcsOSwKKyAgICAxMTQsMzAsMTE2LDEsMTI0LDAsMTA2LDAsMTAwLDEsMTMxLDIsMTE1LDMwLDExNiwyLAorICAgIDEyNCwwLDEzMSwxLDgzLDAsMTE2LDMsMTI0LDAsMTMxLDEsMTI1LDEsMTE2LDQsCisgICAgMTI0LDEsMTMxLDEsMTQzLDU0LDEsMCwxMjQsMCwxMDYsMCwxMDAsMCwxMDcsOCwKKyAgICAxMTQsODQsMTI0LDAsMTA2LDUsMTAwLDAsMTA3LDgsMTE0LDk2LDExNiw2LDEwMCwyLAorICAgIDEyNCwwLDEwNiw3LDEwMCwzLDE0MSwyLDEzMCwxLDExMCwxMiwxMjQsMCwxMDYsMCwKKyAgICAxMDYsOCwxMjQsMSwxMzEsMSwxLDAsODcsMCwxMDAsMCw4MSwwLDgyLDAsCisgICAgODgsMCwxMTYsOSwxMDYsMTAsMTI0LDAsMTA2LDcsMjUsMCw4MywwLDQxLDQsCisgICAgNzgsMTE0LDEzNSwwLDAsMCwxMjIsMTQsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTAsMTAzLDMyLAorICAgIDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDEsMSwxMTQsMTUsMCwwLDAsNDEsMTEsMTE0LAorICAgIDkzLDAsMCwwLDExNCw0LDAsMCwwLDExNCwxNDAsMCwwLDAsMTE0LDEzNiwKKyAgICAwLDAsMCwxMTQsOTYsMCwwLDAsMTE0LDEwNiwwLDAsMCwxMTQsNzAsMCwKKyAgICAwLDAsMTE0LDE1LDAsMCwwLDExNCwxMzUsMCwwLDAsMTE0LDE0LDAsMCwKKyAgICAwLDExNCw3OSwwLDAsMCw0MSwyLDExNCw4MiwwLDAsMCwxMTQsODMsMCwKKyAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAorICAgIDAsMjE4LDE0LDk1LDEwOCwxMTEsOTcsMTAwLDk1LDExNywxMTAsMTA4LDExMSw5OSwxMDcsMTAxLAorICAgIDEwMCwxMjksMiwwLDAsMTE1LDIwLDAsMCwwLDAsMiwxMCwyLDEyLDEsCisgICAgOCwyLDgsMSwxMCwxLDEwLDEsMTAsMSwxNiwzLDIyLDUsMTE0LDE0MSwKKyAgICAwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKyAgICA5LDAsMCwwLDY3LDAsMCwwLDExNSwzOCwwLDAsMCwxMTYsMCwxMDYsCisgICAgMSwxMzEsMCwxLDAsMTE2LDIsMTI0LDAsMTA2LDMsMTMxLDEsMTQzLDEwLDEsCisgICAgMCwxMTYsNCwxMjQsMCwxMzEsMSw4MywwLDgxLDAsODIsMCw4OCwwLDEwMCwKKyAgICAxLDgzLDAsNDEsMiwxMjIsMTkxLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsOTcsMzIsCisgICAgMTEwLDEwMSwxMTksMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksCisgICAgMTE2LDQ0LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDExNSwxMTIsMTAxLDk5LDM5LDExNSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsCisgICAgMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywxMDAsMTAwLDEwMSwxMDAsMzIsMTE2LDExMSwzMiwKKyAgICAxMDUsMTE2LDExNSwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDczLDEwMiwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLAorICAgIDk3LDEwOCwxMTQsMTAxLDk3LDEwMCwxMjEsMzIsMTA1LDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDQsMzIsMTE2LDEwNCw5NywxMTYsMzIsMTAxLDEyMCwxMDUsCisgICAgMTE1LDExNiwxMDUsMTEwLDEwMywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDMsMTAxLDExNiwKKyAgICAxMTUsMTAsMzIsMzIsMzIsMzIsOTksMTA4LDExMSw5OCw5OCwxMDEsMTE0LDEwMSwxMDAsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsNzgsNDEsNSwxMTQsNDYsMCwwLDAsMTE0LDEzNywKKyAgICAwLDAsMCwxMTQsNDIsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxNDEsMCwKKyAgICAwLDAsNDEsMSwxMTQsODIsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDgxLDAsMCwwLDE1MiwyLDAsCisgICAgMCwxMTUsNiwwLDAsMCwwLDksOCwxLDEyLDEsMTE0LDgxLDAsMCwKKyAgICAwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQsMCwKKyAgICAwLDAsNjQsMCwwLDAsMTE1LDEzNiwwLDAsMCwxMDEsMCw5MCwxLDEwMCwKKyAgICAwLDkwLDIsMTAwLDEsOTAsMywxMDEsNCwxMDAsMiwxMDAsMywxMzIsMCwxMzEsCisgICAgMSw5MCw1LDEwMSw2LDEwMCwxOSwxMDAsNSwxMDAsNiwxMzIsMSwxMzEsMSw5MCwKKyAgICA3LDEwMSw2LDEwMCwyMCwxMDAsNywxMDAsOCwxMzIsMSwxMzEsMSw5MCw4LDEwMSwKKyAgICA2LDEwMCw5LDEwMCwxMCwxMzIsMCwxMzEsMSw5MCw5LDEwMSw2LDEwMCwxMSwxMDAsCisgICAgMTIsMTMyLDAsMTMxLDEsOTAsMTAsMTAxLDYsMTAxLDExLDEwMCwxMywxMDAsMTQsMTMyLAorICAgIDAsMTMxLDEsMTMxLDEsOTAsMTIsMTAxLDYsMTAxLDExLDEwMCwxNSwxMDAsMTYsMTMyLAorICAgIDAsMTMxLDEsMTMxLDEsOTAsMTMsMTAxLDYsMTAxLDExLDEwMCwxNywxMDAsMTgsMTMyLAorICAgIDAsMTMxLDEsMTMxLDEsOTAsMTQsMTAxLDYsMTAxLDE1LDEzMSwxLDkwLDE2LDEwMCwKKyAgICA0LDgzLDAsNDEsMjEsMjE4LDE1LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwKKyAgICAxMTIsMTExLDExNCwxMTYsMTAxLDExNCwxMjIsMTQ0LDc3LDEwMSwxMTYsOTcsMzIsMTEyLDk3LDExNiwKKyAgICAxMDQsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTAyLDExMSwxMTQsMzIsOTgsMTE3LDEwNSwKKyAgICAxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ2LDEwLDEwLAorICAgIDMyLDMyLDMyLDMyLDY1LDEwOCwxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDMyLAorICAgIDk3LDExNCwxMDEsMzIsMTAxLDEwNSwxMTYsMTA0LDEwMSwxMTQsMzIsOTksMTA4LDk3LDExNSwxMTUsCisgICAgMzIsMTExLDExNCwzMiwxMTUsMTE2LDk3LDExNiwxMDUsOTksMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwKKyAgICAxMDAsMTE1LDMyLDExNiwxMTEsMzIsOTcsMTE4LDExMSwxMDUsMTAwLDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDEwNSwxMTAsMTE1LDExNiwKKyAgICA5NywxMTAsMTE2LDEwNSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDk5LDEwOCw5NywxMTUsCisgICAgMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk5LDEsMCwwLDAsMCwwLDAsCisgICAgMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEyLDAsCisgICAgMCwwLDEwMCwxLDEwNiwwLDEyNCwwLDEwNiwxLDEzMSwxLDgzLDAsNDEsMiwKKyAgICAxMjIsMTE1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE0LDEwMSwxMTIsMTE0LDMyLDEwMiwxMTEsCisgICAgMTE0LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwKKyAgICAxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LAorICAgIDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA5LDk3LDk5LAorICAgIDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICAxMDYsMTExLDk4LDMyLDEwNSwxMTYsMTE1LDEwMSwxMDgsMTAyLDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDEyMiwyNCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsCisgICAgMzMsMTE0LDEyNSwzMiw0MCw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCw0MSw2Miw0MSwKKyAgICAyLDExNCwzOCwwLDAsMCwxMTQsMSwwLDAsMCw0MSwxLDExNCw4MywwLAorICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsCisgICAgMCwxMTQsODYsMCwwLDAsMTc3LDIsMCwwLDExNSwyLDAsMCwwLDAsCisgICAgNywxMjIsMjcsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICAxMDEsMTE0LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCw3OCw5OSwKKyAgICA0LDAsMCwwLDAsMCwwLDAsNCwwLDAsMCw1LDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSw0NiwwLDAsMCwxMjQsMiwxMDAsMCwxMDcsOSwxMTQsCisgICAgMTIsMTAwLDAsODMsMCwxMTYsMCwxMDYsMSwxMjQsMSwxMzEsMSwxMTQsMzgsMTE2LAorICAgIDIsMTI0LDEsMTI0LDAsMTAwLDEsMTAwLDIsMTQxLDMsODMsMCwxMTAsNCwxMDAsCisgICAgMCw4MywwLDEwMCwwLDgzLDAsNDEsMyw3OCwxMjIsOCw5OCwxMTcsMTA1LDEwOCwKKyAgICAxMTYsNDUsMTA1LDExMCw0MSwxLDExNCwxMDMsMCwwLDAsNDEsMywxMTQsNDYsMCwKKyAgICAwLDAsOTAsMTAsMTA1LDExNSw5NSw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCwxMTQsNzgsCisgICAgMCwwLDAsNDEsNCwyMTgsMyw5OSwxMDgsMTE1LDExNCw3MSwwLDAsMCwyMTgsCisgICAgNCwxMTIsOTcsMTE2LDEwNCwyMTgsNiwxMTYsOTcsMTE0LDEwMywxMDEsMTE2LDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCw5LDEwMiwxMDUsCisgICAgMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSwxODYsMiwwLDAsMTE1LDEwLDAsMCwwLAorICAgIDAsMiw4LDEsNCwxLDEwLDEsMTYsMiwxMjIsMjUsNjYsMTE3LDEwNSwxMDgsCisgICAgMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCwKKyAgICA5NSwxMTUsMTEyLDEwMSw5OSw5OSwzLDAsMCwwLDAsMCwwLDAsNCwwLAorICAgIDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwzMCwwLDAsMCwxMjQsCisgICAgMCwxMDYsMCwxMjQsMSwxMjQsMiwxMzEsMiwxMjUsMywxMjQsMywxMDAsMSwxMDcsCisgICAgOSwxMTQsMjYsMTI0LDMsMTA2LDEsODMsMCwxMDAsMSw4MywwLDQxLDIsMTIyLAorICAgIDE3NSw3MCwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsCisgICAgMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiw3MywxMDIsMzIsMzksMTEyLDk3LDExNiwxMDQsMzksMzIsMTA1LDExNSwKKyAgICAzMiwxMDEsMTE4LDEwMSwxMTQsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwKKyAgICAxMTYsMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDEwMSw5NywxMTQsOTksMTA0LDMyLAorICAgIDEwNSwxMTUsMzIsOTksMTExLDExMCwxMTUsMTA1LDEwMCwxMDEsMTE0LDEwMSwxMDAsMzIsOTcsMzIsCisgICAgMTAyLDk3LDEwNSwxMDgsMTE3LDExNCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwKKyAgICAzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwKKyAgICAxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsCisgICAgMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDc4LDQxLDIsMTE0LDE0NiwwLDAsMCwxMTQsOTMsMCwwLDAsNDEsNCwxMTQsCisgICAgMTQzLDAsMCwwLDExNCw3MSwwLDAsMCwxMTQsMTQ0LDAsMCwwLDExNCw4MiwKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAorICAgIDAsMCwyMTgsMTEsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE5NSwKKyAgICAyLDAsMCwxMTUsNCwwLDAsMCwwLDksMTIsMSwxMjIsMjcsNjYsMTE3LAogICAgIDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsCi0gICAgMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw5OSwzLDAsMCwwLDAsMCwwLDAsCi0gICAgNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw0MSwwLDAsCi0gICAgMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwyLDAsCi0gICAgMTI1LDMsMCwxMjQsMywwLDEwMCwxLDAsMTA3LDksMCwxMTQsMzcsMCwxMjQsCi0gICAgMywwLDEwNiwxLDAsODMsMTAwLDEsMCw4Myw0MSwyLDEyMiwxNzUsNzAsMTA1LAotICAgIDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsNzMsMTAyLDMyLDM5LDExMiw5NywxMTYsMTA0LDM5LDMyLDEwNSwxMTUsMzIsMTAxLDExOCwKLSAgICAxMDEsMTE0LDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTE2LDEwNCwxMDEsCi0gICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMDUsMTE1LDMyLAotICAgIDk5LDExMSwxMTAsMTE1LDEwNSwxMDAsMTAxLDExNCwxMDEsMTAwLDMyLDk3LDMyLDEwMiw5NywxMDUsCi0gICAgMTA4LDExNywxMTQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LAotICAgIDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwKLSAgICAxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwKLSAgICAxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLAotICAgIDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLAotICAgIDExNCwxNTQsMCwwLDAsMTE0LDk5LDAsMCwwLDQxLDQsMTE0LDE1MSwwLDAsCi0gICAgMCwxMTQsNzgsMCwwLDAsMTE0LDE1MiwwLDAsMCwxMTQsODgsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LAotICAgIDExLDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwyMTMsMiwwLDAsCi0gICAgMTE1LDQsMCwwLDAsMCw5LDE4LDEsMTIyLDI3LDY2LDExNywxMDUsMTA4LDExNiwKLSAgICAxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsCi0gICAgMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsNjcsMCwwLDAsCi0gICAgMTI0LDEsMCwxMDYsMCwwLDExNiwxLDAsMTA2LDIsMCwxMDcsNywwLDExNCwKLSAgICA1MSwwLDExNiwzLDAsMTAwLDEsMCwxMDYsNCwwLDEyNCwxLDAsMTA2LDAsCi0gICAgMCwxMzEsMSwwLDEwMCwyLDAsMTI0LDEsMCwxMDYsMCwwLDEzMSwxLDEsCi0gICAgMTMwLDEsMCwxMTYsNSwwLDExNiw2LDAsMTA2LDcsMCwxMjQsMSwwLDEzMSwKLSAgICAyLDAsODMsNDEsMywxMjIsMjQsNjcsMTE0LDEwMSw5NywxMTYsMTAxLDMyLDk3LDMyLAotICAgIDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDEyMiwKLSAgICAyOSwxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLDk4LAotICAgIDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxNSwKKyAgICAxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLAorICAgIDAsMCwyLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDQ2LAorICAgIDAsMCwwLDEyNCwxLDEwNiwwLDExNiwxLDEwNiwyLDEwNyw3LDExNCwzNCwxMTYsCisgICAgMywxMDAsMSwxMDYsNCwxMjQsMSwxMDYsMCwxMzEsMSwxMjQsMSwxMDYsMCwxMDAsCisgICAgMiwxNDEsMiwxMzAsMSwxMTYsNSwxMTYsNiwxMDYsNywxMjQsMSwxMzEsMiw4MywKKyAgICAwLDQxLDMsMTIyLDI0LDY3LDExNCwxMDEsOTcsMTE2LDEwMSwzMiw5NywzMiw5OCwxMTcsCisgICAgMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMjIsMjksMTIzLAorICAgIDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiw5OCwxMTcsMTA1LAorICAgIDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MSwxLDExNCwxNSwKICAgICAwLDAsMCw0MSw4LDExNCwxNSwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LAotICAgIDc2LDAsMCwwLDExNCw3NywwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LDY1LAotICAgIDAsMCwwLDExNCw1NywwLDAsMCw5MCwxNCw5OSwxMTQsMTAxLDk3LDExNiwxMDEsCi0gICAgOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNDEsMiwxMTQsMTksMCwwLDAsMTE0LAotICAgIDg4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAotICAgIDAsMCwwLDExNCwxMzgsMCwwLDAsMjI1LDIsMCwwLDExNSw4LDAsMCwKLSAgICAwLDAsMywxOCwxLDIxLDEsMTIsMSwxMjIsMjksNjYsMTE3LDEwNSwxMDgsMTE2LAorICAgIDY5LDAsMCwwLDExNCw3MCwwLDAsMCwxMTQsMzgsMCwwLDAsMTE0LDU4LAorICAgIDAsMCwwLDExNCw0NiwwLDAsMCw5MCwxNCw5OSwxMTQsMTAxLDk3LDExNiwxMDEsCisgICAgOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNDEsMiwxMTQsMjYsMCwwLDAsMTE0LAorICAgIDgyLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAorICAgIDAsMCwwLDExNCwxMzQsMCwwLDAsMjA3LDIsMCwwLDExNSw4LDAsMCwKKyAgICAwLDAsMywxMiwxLDEyLDEsMTAsMSwxMjIsMjksNjYsMTE3LDEwNSwxMDgsMTE2LAogICAgIDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDk5LDExNCwxMDEsOTcsMTE2LAogICAgIDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyMCwwLAotICAgIDAsMCwxMTYsMCwwLDExNiwxLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwyLAotICAgIDAsMSwxMDAsMSwwLDgzLDQxLDIsMTIyLDIyLDY5LDEyMCwxMDEsOTksMzIsOTcsCi0gICAgMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgNzgsNDEsMywxMTQsNjUsMCwwLDAsMTE0LDU3LDAsMCwwLDkwLDEyLDEwMSwKLSAgICAxMjAsMTAxLDk5LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDQxLDIsMTE0LDE5LDAsCi0gICAgMCwwLDExNCw4OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwxMTQsMTM5LDAsMCwwLDIzMywyLDAsMCwxMTUsCi0gICAgMiwwLDAsMCwwLDMsMTIyLDI3LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLAotICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKLSAgICAxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsCi0gICAgODMsNDEsMiwxMjIsNTcsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwKLSAgICAzMiw5NywxMTUsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTE1LDMyLDEwMCwxMTEsMzIsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExOCwxMDEsCi0gICAgMzIsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNSw0Niw3OCwxMTQsCi0gICAgMTAsMCwwLDAsNDEsMiwxMTQsMTUxLDAsMCwwLDExNCw3OCwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsCi0gICAgOCwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwyMzgsMiwwLDAsMTE1LDIsMCwKLSAgICAwLDAsMCw0LDEyMiwyNCw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDU2LAotICAgIDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDk4LAotICAgIDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwKLSAgICAxMDAsMTExLDMyLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTgsMTAxLDMyLDExNSwxMTEsMTE3LDExNCwKLSAgICA5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsNDYsNzgsMTE0LDEwLDAsMCwwLDQxLDIsCi0gICAgMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEwLDEwMywxMDEsMTE2LDk1LDExNSwKLSAgICAxMTEsMTE3LDExNCw5OSwxMDEsMjQ0LDIsMCwwLDExNSwyLDAsMCwwLDAsNCwKLSAgICAxMjIsMjYsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsCi0gICAgMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTksMiwwLDAsCi0gICAgMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDUyLDgyLDEwMSwKLSAgICAxMTYsMTE3LDExNCwxMTAsMzIsNzAsOTcsMTA4LDExNSwxMDEsMzIsOTcsMTE1LDMyLDk4LDExNywKLSAgICAxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywKLSAgICAxMTQsMTAxLDMyLDExMCwxMDEsMTE4LDEwMSwxMTQsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLAotICAgIDExNSw0Niw3MCwxMTQsMTAsMCwwLDAsNDEsMiwxMTQsMTUxLDAsMCwwLDExNCwKLSAgICA3OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwKLSAgICAwLDAsMCwxMTQsMTA5LDAsMCwwLDI1MCwyLDAsMCwxMTUsMiwwLDAsCi0gICAgMCwwLDQsMTIyLDI2LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwxMTIsMTExLAotICAgIDExNCwxMTYsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwKLSAgICAxNywxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwKLSAgICAxMTQsMywwLDAsMCwyMTgsMTIsMTE1LDExNiw5NywxMTYsMTA1LDk5LDEwOSwxMDEsMTE2LAotICAgIDEwNCwxMTEsMTAwLDExNCw5MiwwLDAsMCwyMTgsMTEsOTksMTA4LDk3LDExNSwxMTUsMTA5LAotICAgIDEwMSwxMTYsMTA0LDExMSwxMDAsMTE0LDE1NCwwLDAsMCwxMTQsMTU1LDAsMCwwLDExNCwKLSAgICAxMzgsMCwwLDAsMTE0LDEzOSwwLDAsMCwxMTQsODEsMCwwLDAsMTE0LDE1NiwKLSAgICAwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDkwLDAsCi0gICAgMCwwLDExNCwxNDYsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTAsMCwwLDAsCi0gICAgMTg2LDIsMCwwLDExNSwzMCwwLDAsMCwxMiw3LDYsMiwxOCw5LDMsCi0gICAgMSwyMSw4LDMsMSwxOCwxMSwxOCw4LDE4LDUsMywxLDIxLDUsMywKLSAgICAxLDIxLDUsMywxLDIxLDUsMTE0LDE1MCwwLDAsMCw5OSwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDY0LDAsMCwKLSAgICAwLDExNSwyMTEsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwKLSAgICAyLDAsMTAwLDEsMCw5MCwzLDAsMTAxLDQsMCwxMDAsMiwwLDEwMCwzLAotICAgIDAsMTMyLDAsMCwxMzEsMSwwLDkwLDUsMCwxMDEsNiwwLDEwMCw0LDAsCi0gICAgMTAwLDQsMCwxMDAsNSwwLDEwMCw2LDAsMTMyLDIsMCwxMzEsMSwwLDkwLAotICAgIDcsMCwxMDEsNiwwLDEwMCw0LDAsMTAwLDcsMCwxMDAsOCwwLDEzMiwxLAotICAgIDAsMTMxLDEsMCw5MCw4LDAsMTAxLDYsMCwxMDAsOSwwLDEwMCwxMCwwLAotICAgIDEzMiwwLDAsMTMxLDEsMCw5MCw5LDAsMTAxLDQsMCwxMDAsMTEsMCwxMDAsCi0gICAgMTIsMCwxMzIsMCwwLDEzMSwxLDAsOTAsMTAsMCwxMDEsNiwwLDEwMCwxMywKLSAgICAwLDEwMCwxNCwwLDEzMiwwLDAsMTMxLDEsMCw5MCwxMSwwLDEwMSw2LDAsCi0gICAgMTAxLDEyLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLDAsMCwxMzEsMSwwLDEzMSwKLSAgICAxLDAsOTAsMTMsMCwxMDEsNiwwLDEwMSwxMiwwLDEwMCwxNywwLDEwMCwxOCwKLSAgICAwLDEzMiwwLDAsMTMxLDEsMCwxMzEsMSwwLDkwLDE0LDAsMTAxLDYsMCwKLSAgICAxMDEsMTIsMCwxMDAsMTksMCwxMDAsMjAsMCwxMzIsMCwwLDEzMSwxLDAsMTMxLAotICAgIDEsMCw5MCwxNSwwLDEwMCw0LDAsODMsNDEsMjEsMjE4LDE0LDcwLDExNCwxMTEsCi0gICAgMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDEyMiwxNDIsNzcsMTAxLDExNiwKLSAgICA5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDIsMTExLAotICAgIDExNCwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsMTA4LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLAotICAgIDEwMCwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMDEsMTA1LDExNiwxMDQsMTAxLDExNCwzMiw5OSwxMDgsCi0gICAgOTcsMTE1LDExNSwzMiwxMTEsMTE0LDMyLDExNSwxMTYsOTcsMTE2LDEwNSw5OSwzMiwxMDksMTAxLAotICAgIDExNiwxMDQsMTExLDEwMCwxMTUsMzIsMTE2LDExMSwzMiw5NywxMTgsMTExLDEwNSwxMDAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTA1LAotICAgIDExMCwxMTUsMTE2LDk3LDExMCwxMTYsMTA1LDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsOTksCi0gICAgMTA4LDk3LDExNSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTksMSwwLDAsMCwKLSAgICAwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsMTYsMCwwLDAsMTAwLDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDEsCi0gICAgMCwxMzEsMSwwLDgzLDQxLDIsMTIyLDExNSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLAotICAgIDExNCwxMDEsMTEyLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsCi0gICAgMTAxLDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LAotICAgIDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDMyLDEwOSw5Nyw5OSwxMDQsMTA1LDExMCwxMDEsMTE0LDEyMSwzMiwxMDAsMTExLAotICAgIDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA2LDExMSw5OCwzMiwxMDUsMTE2LDExNSwxMDEsMTA4LAotICAgIDEwMiw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMjIsMjIsNjAsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsNDAsMTAyLDExNCwxMTEsMTIyLAotICAgIDEwMSwxMTAsNDEsNjIsNDEsMiwxMTQsNTAsMCwwLDAsMTE0LDEsMCwwLDAsCi0gICAgNDEsMSwyMTgsMSwxMDksMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTEsMCwwLDAsMTE0LDkyLDAsMCwwLDEyLDMsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsNywxMjIsMjYsNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwMSwxMTQsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE0LDEwMSwxMTIsMTE0LAotICAgIDc4LDk5LDQsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDUsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDQyLDAsMCwwLDExNiwwLDAsMTA2LDEsCi0gICAgMCwxMjQsMSwwLDEzMSwxLDAsMTE0LDM0LDAsMTE2LDIsMCwxMjQsMSwwLAotICAgIDEyNCwwLDAsMTAwLDEsMCwxMDAsMiwwLDEzMSwyLDEsODMsMTAwLDAsMCwKLSAgICA4MywxMDAsMCwwLDgzLDQxLDMsNzgsMTE0LDEwNywwLDAsMCw5MCw2LDEwMiwKLSAgICAxMTQsMTExLDEyMiwxMDEsMTEwLDQxLDMsMTE0LDU3LDAsMCwwLDExNCw4MiwwLDAsCi0gICAgMCwxMTQsODUsMCwwLDAsNDEsNCwxMTQsMTUxLDAsMCwwLDExNCw3OCwwLAotICAgIDAsMCwxMTQsMTUyLDAsMCwwLDExNCwxNTMsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NCwwLDAsMCwKLSAgICAyMSwzLDAsMCwxMTUsNiwwLDAsMCwwLDIsMTUsMSwxOSwyLDEyMiwKLSAgICAyNCw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwKLSAgICAxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTksMywwLDAsMCwwLDAsCi0gICAgMCwwLDMsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMjMsCi0gICAgMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCwxMTQsCi0gICAgMTksMCwxMjQsMCwwLDgzLDEwMCwxLDAsODMsNDEsMiwxMjIsOTMsNzAsMTA1LAotICAgIDExMCwxMDAsMzIsOTcsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwKLSAgICAxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsCi0gICAgMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAyLDEwNSwxMTAsCi0gICAgMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDIsMTE0LDU3LAotICAgIDAsMCwwLDExNCw4MiwwLDAsMCw0MSwzLDExNCwxNTEsMCwwLDAsMTE0LAotICAgIDc4LDAsMCwwLDExNCwxNTIsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NSwwLDAsMCwyOCwzLDAsCi0gICAgMCwxMTUsMiwwLDAsMCwwLDcsMTIyLDI2LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsCi0gICAgNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLAotICAgIDAsODMsNDEsMiwxMjIsNDIsODUsMTE1LDEwMSwzMiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LAotICAgIDExNiwzMiwxMTUsMTAxLDEwOSw5NywxMTAsMTE2LDEwNSw5OSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTksMTE0LDEwMSw5NywxMTYsMTA1LDExMSwxMTAsNDYsCi0gICAgNzgsMTE0LDEwLDAsMCwwLDQxLDIsMTE0LDE1MSwwLDAsMCwxMTQsODgsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAotICAgIDAsMTE0LDEzOCwwLDAsMCwzNywzLDAsMCwxMTUsMCwwLDAsMCwxMjIsCi0gICAgMjgsNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsCi0gICAgOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDEsMCwKLSAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDQsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDkyLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsMSwwLAotICAgIDEyNSwxLDAsMTE2LDIsMCwxMDYsMywwLDEyNCwxLDAsMTMxLDEsMCwxMTUsCi0gICAgNTQsMCwxMTYsNCwwLDEwMCwxLDAsMTA2LDUsMCwxMjQsMSwwLDEzMSwxLAotICAgIDAsMTAwLDIsMCwxMjQsMSwwLDEzMSwxLDEsMTMwLDEsMCwxMTYsNiwwLAotICAgIDExNiwyLDAsMTA2LDcsMCwxMjQsMSwwLDEzMSwyLDAsMTI1LDIsMCwxMTYsCi0gICAgOCwwLDEyNCwyLDAsMTI0LDAsMCwxMDYsOSwwLDEzMSwyLDAsMSwxMDAsCi0gICAgMCwwLDgzLDQxLDMsNzgsMTIyLDI3LDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsCi0gICAgMTEwLDExMSwxMTYsMzIsOTcsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTE0LDE1LDAsMCwwLDQxLDEwLDExNCw5NSwwLDAsMCwxMTQsCi0gICAgMTUsMCwwLDAsMTE0LDU3LDAsMCwwLDExNCw4MiwwLDAsMCwxMTQsNzcsCi0gICAgMCwwLDAsMTE0LDUwLDAsMCwwLDExNCw2NSwwLDAsMCwyMTgsMTcsMTAzLAotICAgIDEwMSwxMTYsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTExLDk4LDEwNiwxMDEsOTksMTE2LAotICAgIDIxOCw0LDEwMSwxMjAsMTAxLDk5LDExNCw3LDAsMCwwLDQxLDMsMTE0LDg5LDAsCi0gICAgMCwwLDExNCwxNSwwLDAsMCwyMTgsNCw5OSwxMTEsMTAwLDEwMSwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTM5LDAsMCwKLSAgICAwLDQxLDMsMCwwLDExNSwxMiwwLDAsMCwwLDIsMTIsMSwxNSwxLAotICAgIDE4LDEsOSwxLDE4LDEsMTIyLDI2LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LAotICAgIDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDEzLDAsMCwwLDExNiwwLDAsMTI0LAotICAgIDAsMCwxMjQsMSwwLDEzMSwyLDAsODMsNDEsMSwxMjIsOTUsNzYsMTExLDk3LAorICAgIDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLAorICAgIDAsMCwxMTYsMCwxMTYsMSwxMDYsMiwxMjQsMSwxMzEsMiwxLDAsMTAwLDEsCisgICAgODMsMCw0MSwyLDEyMiwyMiw2OSwxMjAsMTAxLDk5LDMyLDk3LDMyLDk4LDExNywxMDUsCisgICAgMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDc4LDQxLDMsMTE0LAorICAgIDU4LDAsMCwwLDExNCw0NiwwLDAsMCw5MCwxMiwxMDEsMTIwLDEwMSw5OSw5NSwKKyAgICA5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw0MSwyLDExNCwyNiwwLDAsMCwxMTQsODMsCisgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwKKyAgICAwLDAsMTE0LDEzNSwwLDAsMCwyMTUsMiwwLDAsMTE1LDIsMCwwLDAsCisgICAgMCwzLDEyMiwyNyw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDEwMSwxMTQsNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSw4MywwLDQxLDIsMTIyLAorICAgIDU3LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLAorICAgIDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwKKyAgICAzMiwxMDAsMTExLDMyLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTgsMTAxLDMyLDk5LDExMSwxMDAsCisgICAgMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwxMTUsNDYsNzgsMTE0LDEwLDAsMCwwLAorICAgIDQxLDIsMTE0LDE0MywwLDAsMCwxMTQsNzEsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDgsMTAzLDEwMSwxMTYsCisgICAgOTUsOTksMTExLDEwMCwxMDEsMjIwLDIsMCwwLDExNSwyLDAsMCwwLDAsNCwKKyAgICAxMjIsMjQsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsCisgICAgMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsMCwKKyAgICAwLDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiw1Niw4MiwxMDEsMTE2LDExNywKKyAgICAxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsCisgICAgNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTAwLDExMSwzMiwxMTAsCisgICAgMTExLDExNiwzMiwxMDQsOTcsMTE4LDEwMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LAorICAgIDExMSwxMDAsMTAxLDQ2LDc4LDExNCwxMCwwLDAsMCw0MSwyLDExNCwxNDMsMCwwLAorICAgIDAsMTE0LDcxLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCisgICAgMTE0LDExLDAsMCwwLDIxOCwxMCwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksCisgICAgMTAxLDIyNiwyLDAsMCwxMTUsMiwwLDAsMCwwLDQsMTIyLDI2LDY2LDExNywKKyAgICAxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDMsMTAxLAorICAgIDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk5LDIsMCwwLDAsMCwwLDAsCisgICAgMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwKKyAgICAwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiw1Miw4MiwxMDEsMTE2LDExNywxMTQsMTEwLAorICAgIDMyLDcwLDk3LDEwOCwxMTUsMTAxLDMyLDk3LDExNSwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsCisgICAgMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMTAsCisgICAgMTAxLDExOCwxMDEsMTE0LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTUsNDYsNzAsMTE0LAorICAgIDEwLDAsMCwwLDQxLDIsMTE0LDE0MywwLDAsMCwxMTQsNzEsMCwwLDAsCisgICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LAorICAgIDEwNSwwLDAsMCwyMzIsMiwwLDAsMTE1LDIsMCwwLDAsMCw0LDEyMiwKKyAgICAyNiw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsCisgICAgNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDEsMiw3OCw3OCw0MSwKKyAgICAxLDc4LDQxLDE3LDExNCwxLDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLAorICAgIDAsMCwwLDExNCwzLDAsMCwwLDIxOCwxMiwxMTUsMTE2LDk3LDExNiwxMDUsOTksCisgICAgMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE0LDg2LDAsMCwwLDIxOCwxMSw5OSwxMDgsOTcsCisgICAgMTE1LDExNSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTQsMTQ2LDAsMCwwLDExNCwxNDcsMCwKKyAgICAwLDAsMTE0LDEzNCwwLDAsMCwxMTQsMTM1LDAsMCwwLDExNCw3NCwwLDAsCisgICAgMCwxMTQsMTQ4LDAsMCwwLDExNCwxNDksMCwwLDAsMTE0LDEwNSwwLDAsMCwKKyAgICAxMTQsODQsMCwwLDAsMTE0LDEzOCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE0MiwKKyAgICAwLDAsMCwxNjgsMiwwLDAsMTE1LDMwLDAsMCwwLDgsNyw0LDIsCisgICAgMTIsOSwyLDEsMTIsOCwyLDEsMTIsMTEsMTIsOCwxMiw1LDIsMSwKKyAgICAxNCw1LDIsMSwxNCw1LDIsMSwxNCw1LDExNCwxNDIsMCwwLDAsOTksCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwKKyAgICA2NCwwLDAsMCwxMTUsMTQwLDAsMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsCisgICAgMiwxMDAsMSw5MCwzLDEwMSw0LDEwMCwyLDEwMCwzLDEzMiwwLDEzMSwxLDkwLAorICAgIDUsMTAxLDYsMTAwLDIxLDEwMCw1LDEwMCw2LDEzMiwxLDEzMSwxLDkwLDcsMTAxLAorICAgIDYsMTAwLDIyLDEwMCw3LDEwMCw4LDEzMiwxLDEzMSwxLDkwLDgsMTAxLDYsMTAwLAorICAgIDksMTAwLDEwLDEzMiwwLDEzMSwxLDkwLDksMTAxLDQsMTAwLDExLDEwMCwxMiwxMzIsCisgICAgMCwxMzEsMSw5MCwxMCwxMDEsNiwxMDAsMTMsMTAwLDE0LDEzMiwwLDEzMSwxLDkwLAorICAgIDExLDEwMSw2LDEwMSwxMiwxMDAsMTUsMTAwLDE2LDEzMiwwLDEzMSwxLDEzMSwxLDkwLAorICAgIDEzLDEwMSw2LDEwMSwxMiwxMDAsMTcsMTAwLDE4LDEzMiwwLDEzMSwxLDEzMSwxLDkwLAorICAgIDE0LDEwMSw2LDEwMSwxMiwxMDAsMTksMTAwLDIwLDEzMiwwLDEzMSwxLDEzMSwxLDkwLAorICAgIDE1LDEwMCw0LDgzLDAsNDEsMjMsMjE4LDE0LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDEyMiwxNDIsNzcsMTAxLDExNiw5NywzMiwxMTIsOTcsCisgICAgMTE2LDEwNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDIsMTExLDExNCwzMiwxMDIsMTE0LAorICAgIDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDYsMTAsMTAsMzIsCisgICAgMzIsMzIsMzIsNjUsMTA4LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTUsMzIsOTcsCisgICAgMTE0LDEwMSwzMiwxMDEsMTA1LDExNiwxMDQsMTAxLDExNCwzMiw5OSwxMDgsOTcsMTE1LDExNSwzMiwKKyAgICAxMTEsMTE0LDMyLDExNSwxMTYsOTcsMTE2LDEwNSw5OSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwKKyAgICAxMTUsMzIsMTE2LDExMSwzMiw5NywxMTgsMTExLDEwNSwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLAorICAgIDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTA1LDExMCwxMTUsMTE2LDk3LAorICAgIDExMCwxMTYsMTA1LDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsOTksMTA4LDk3LDExNSwxMTUsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTksMSwwLDAsMCwwLDAsMCwwLAorICAgIDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTIsMCwwLAorICAgIDAsMTAwLDEsMTA2LDAsMTI0LDAsMTA2LDEsMTMxLDEsODMsMCw0MSwyLDEyMiwKKyAgICAxMTUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTQsMTAxLDExMiwxMTQsMzIsMTAyLDExMSwxMTQsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwKKyAgICAzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsCisgICAgMzIsODQsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDksOTcsOTksMTA0LAorICAgIDEwNSwxMTAsMTAxLDExNCwxMjEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNiwKKyAgICAxMTEsOTgsMzIsMTA1LDExNiwxMTUsMTAxLDEwOCwxMDIsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMTIyLDIyLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywKKyAgICAxMTQsMTI1LDMyLDQwLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDQxLDYyLDQxLDIsMTE0LDM4LAorICAgIDAsMCwwLDExNCwxLDAsMCwwLDQxLDEsMjE4LDEsMTA5LDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw4NiwwLDAsCisgICAgMCwyNTAsMiwwLDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwyNiw3MCwxMTQsCisgICAgMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsNzgsOTksNCwwLDAsMCwwLDAsCisgICAgMCwwLDQsMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsMzQsCisgICAgMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDEsMTMxLDEsMTE0LDI2LDExNiwyLDEyNCwKKyAgICAxLDEyNCwwLDEwMCwxLDEwMCwyLDE0MSwzLDgzLDAsMTEwLDQsMTAwLDAsODMsCisgICAgMCwxMDAsMCw4MywwLDQxLDMsNzgsOTAsNiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwKKyAgICA0MSwxLDExNCwxMDMsMCwwLDAsNDEsMywxMTQsNDYsMCwwLDAsMTE0LDc1LAorICAgIDAsMCwwLDExNCw3OCwwLDAsMCw0MSw0LDExNCwxNDMsMCwwLDAsMTE0LAorICAgIDcxLDAsMCwwLDExNCwxNDQsMCwwLDAsMTE0LDE0NSwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTQ2LDAsCisgICAgMCwwLDMsMywwLDAsMTE1LDYsMCwwLDAsMCwyLDEwLDEsMTYsCisgICAgMiwxMjIsMjQsNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwKKyAgICAxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LDMsMCwwLDAsCisgICAgMCwwLDAsMCwzLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsCisgICAgMTE1LDE4LDAsMCwwLDExNiwwLDEwNiwxLDEyNCwxLDEzMSwxLDExNCwxNCwxMjQsCisgICAgMCw4MywwLDEwMCwxLDgzLDAsNDEsMiwxMjIsOTMsNzAsMTA1LDExMCwxMDAsMzIsCisgICAgOTcsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LAorICAgIDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LAorICAgIDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwKKyAgICAxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDIsMTE0LDQ2LDAsMCwwLAorICAgIDExNCw3NSwwLDAsMCw0MSwzLDExNCwxNDMsMCwwLDAsMTE0LDcxLDAsMCwKKyAgICAwLDExNCwxNDQsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTEsMCwwLDAsMTE0LDE0NywwLDAsMCwxMCwzLDAsMCwxMTUsMiwKKyAgICAwLDAsMCwwLDcsMTIyLDI2LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwKKyAgICAxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDgzLDAsNDEsCisgICAgMiwxMjIsNDIsODUsMTE1LDEwMSwzMiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiwzMiwxMTUsCisgICAgMTAxLDEwOSw5NywxMTAsMTE2LDEwNSw5OSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsMzIsOTksMTE0LDEwMSw5NywxMTYsMTA1LDExMSwxMTAsNDYsNzgsMTE0LDEwLAorICAgIDAsMCwwLDQxLDIsMTE0LDE0MywwLDAsMCwxMTQsODIsMCwwLDAsMTE0LAorICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDEzNCwKKyAgICAwLDAsMCwxOSwzLDAsMCwxMTUsMCwwLDAsMCwxMjIsMjgsNzAsMTE0LAorICAgIDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsOTksMTE0LDEwMSwKKyAgICA5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDEsMCwwLDAsMCwKKyAgICAwLDAsMCwzLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDY0LDAsMCwwLDEyNCwwLDEwNiwwLDEwNiwxLDEyNSwxLDExNiwyLDEwNiwzLAorICAgIDEyNCwxLDEzMSwxLDExNSwzNiwxMTYsNCwxMDAsMSwxMDYsNSwxMjQsMSwxMzEsMSwKKyAgICAxMjQsMSwxMDAsMiwxNDEsMiwxMzAsMSwxMTYsNiwxMTYsMiwxMDYsNywxMjQsMSwKKyAgICAxMzEsMiwxMjUsMiwxMTYsOCwxMjQsMiwxMjQsMCwxMDYsOSwxMzEsMiwxLDAsCisgICAgMTAwLDAsODMsMCw0MSwzLDc4LDEyMiwyNywxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LAorICAgIDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDQxLDEsMTE0LDE1LDAsMCwwLDQxLDEwLDExNCw4OSwwLAorICAgIDAsMCwxMTQsMTUsMCwwLDAsMTE0LDQ2LDAsMCwwLDExNCw3NSwwLDAsCisgICAgMCwxMTQsNzAsMCwwLDAsMTE0LDM4LDAsMCwwLDExNCw1OCwwLDAsMCwKKyAgICAyMTgsMTcsMTAzLDEwMSwxMTYsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTExLDk4LDEwNiwKKyAgICAxMDEsOTksMTE2LDIxOCw0LDEwMSwxMjAsMTAxLDk5LDExNCw3LDAsMCwwLDQxLDMsCisgICAgMTE0LDgzLDAsMCwwLDExNCwxNSwwLDAsMCwyMTgsNCw5OSwxMTEsMTAwLDEwMSwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsCisgICAgMTM1LDAsMCwwLDIzLDMsMCwwLDExNSwxMiwwLDAsMCwwLDIsOCwKKyAgICAxLDEwLDEsMTAsMSw4LDEsMTIsMSwxMjIsMjYsNzAsMTE0LDExMSwxMjIsMTAxLAorICAgIDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwKKyAgICAwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMTAsMCwwLDAsMTE2LAorICAgIDAsMTI0LDAsMTI0LDEsMTMxLDIsODMsMCw0MSwxLDEyMiw5NSw3NiwxMTEsOTcsCiAgICAgMTAwLDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCiAgICAgMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LAogICAgIDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSwKICAgICA5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMSwxMjAsMTAxLDk5LAogICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsCi0gICAgMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQxLDEsMTE0LDkwLAotICAgIDAsMCwwLDQxLDIsMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE0NiwKLSAgICAwLDAsMCw1MCwzLDAsMCwxMTUsMiwwLDAsMCwwLDcsMTIyLDI2LAorICAgIDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0MSwxLDExNCw4NCwKKyAgICAwLDAsMCw0MSwyLDExNCwxNDMsMCwwLDAsMTE0LDcxLDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMzgsCisgICAgMCwwLDAsMzIsMywwLDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwyNiwKICAgICA3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDgsCiAgICAgMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsCiAgICAgMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwKLSAgICAxMywwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMzEsMSwwLAotICAgIDgzLDQxLDEsMTIyLDQ1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDQ2LDQxLDIsMTE0LDU3LDAsMCwwLDExNCwxNjIsMCwwLDAsNDEsMiwKLSAgICAxMTQsMTUxLDAsMCwwLDExNCw3OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTU2LDAsMCwwLDU5LDMsCi0gICAgMCwwLDExNSwyLDAsMCwwLDAsNCwxMjIsMjMsNzAsMTE0LDExMSwxMjIsMTAxLAotICAgIDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLAotICAgIDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLAotICAgIDQxLDIsMTIyLDU0LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsCi0gICAgOTcsMTE1LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNSwzMiwxMDAsMTExLDMyLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTgsMTAxLDMyLDExNSwxMTEsCi0gICAgMTE3LDExNCw5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsNDYsNzgsMTE0LDEwLDAsMCwwLAotICAgIDQxLDIsMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NywwLDAsMCwKLSAgICA2NSwzLDAsMCwxMTUsMiwwLDAsMCwwLDQsMTIyLDI1LDcwLDExNCwxMTEsCi0gICAgMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LAotICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsCi0gICAgMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTMsMCwwLDAsCi0gICAgMTE2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCw4Myw0MSwxLDEyMiwKLSAgICA0Niw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMzIsMTA1LDExNSwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDYsNDEsCi0gICAgMiwxMTQsNTcsMCwwLDAsOTAsMTcsMTA1LDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLAotICAgIDExMCw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDEsMiwxMTQsMTUxLDAsMCwwLAotICAgIDExNCw3OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMSwwLDAsMCwxMTQsMTA5LDAsMCwwLDcxLDMsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsNCwxMjIsMjUsNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDEsCi0gICAgMTYsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLDAsCi0gICAgMTE0LDMsMCwwLDAsMTE0LDE1OCwwLDAsMCwxMTQsOTIsMCwwLDAsMTE0LAotICAgIDE1OSwwLDAsMCwxMTQsMTU0LDAsMCwwLDExNCwxNTUsMCwwLDAsMTE0LDEzOCwKLSAgICAwLDAsMCwxMTQsMTM5LDAsMCwwLDExNCwxNDYsMCwwLDAsMTE0LDg0LDAsCi0gICAgMCwwLDExNCwxNTYsMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsMTA5LDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLAotICAgIDExNCwxMSwwLDAsMCwxMTQsMTYwLDAsMCwwLDMsMywwLDAsMTE1LDMwLAotICAgIDAsMCwwLDEyLDcsNiwyLDE4LDksMywxLDIxLDYsMywxLDE4LAotICAgIDgsMTgsNCwxOCw5LDE4LDksMywxLDIxLDUsMywxLDIxLDUsMywKLSAgICAxLDExNCwxNjAsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsNDYsMCwwLDAsCi0gICAgMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwKLSAgICAzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwwLDEwMCw0LAotICAgIDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwwLDgzLDQxLDcsCi0gICAgMjE4LDE4LDk1LDczLDEwOSwxMTIsMTExLDExNCwxMTYsNzYsMTExLDk5LDEwNyw2NywxMTEsMTEwLAotICAgIDExNiwxMDEsMTIwLDExNiwxMjIsMzYsNjcsMTExLDExMCwxMTYsMTAxLDEyMCwxMTYsMzIsMTA5LDk3LAotICAgIDExMCw5NywxMDMsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LAotICAgIDExMiwxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNyw0Niw5OSwxLDAsMCwwLDAsCi0gICAgMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSwKLSAgICAxNCwwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTMxLDAsMCwxLDEwMCwxLAotICAgIDAsODMsNDEsMiwxMjIsMjQsNjUsOTksMTEzLDExNywxMDUsMTE0LDEwMSwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNyw0Niw3OCw0MSwKLSAgICAyLDExNCw1NywwLDAsMCwxMTQsMTQ1LDAsMCwwLDQxLDEsMTE0LDE5LDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKLSAgICAwLDExNCwyMywwLDAsMCw4NCwzLDAsMCwxMTUsMiwwLDAsMCwwLAotICAgIDIsMTIyLDI4LDk1LDczLDEwOSwxMTIsMTExLDExNCwxMTYsNzYsMTExLDk5LDEwNyw2NywxMTEsCi0gICAgMTEwLDExNiwxMDEsMTIwLDExNiw0Niw5NSw5NSwxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LAotICAgIDQsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDEsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDE0LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMzEsCi0gICAgMCwwLDEsMTAwLDEsMCw4Myw0MSwyLDEyMiw2MCw4MiwxMDEsMTA4LDEwMSw5NywKLSAgICAxMTUsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsCi0gICAgOTksMTA3LDMyLDExNCwxMDEsMTAzLDk3LDExNCwxMDAsMTA4LDEwMSwxMTUsMTE1LDMyLDExMSwxMDIsCi0gICAgMzIsOTcsMTEwLDEyMSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDMyLDEwMSwxMjAsOTksMTAxLAotICAgIDExMiwxMTYsMTA1LDExMSwxMTAsMTE1LDQ2LDc4LDQxLDIsMTE0LDU3LDAsMCwwLDExNCwKLSAgICA1OCwwLDAsMCw0MSw0LDExNCwxOSwwLDAsMCw5MCw4LDEwMSwxMjAsOTksCi0gICAgOTUsMTE2LDEyMSwxMTIsMTAxLDkwLDksMTAxLDEyMCw5OSw5NSwxMTgsOTcsMTA4LDExNywxMDEsCi0gICAgOTAsMTMsMTAxLDEyMCw5OSw5NSwxMTYsMTE0LDk3LDk5LDEwMSw5OCw5Nyw5OSwxMDcsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDMwLAotICAgIDAsMCwwLDg4LDMsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMjcsCi0gICAgOTUsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw3NiwxMTEsOTksMTA3LDY3LDExMSwxMTAsMTE2LDEwMSwKLSAgICAxMjAsMTE2LDQ2LDk1LDk1LDEwMSwxMjAsMTA1LDExNiw5NSw5NSw3OCw0MSw2LDExNCwxLAotICAgIDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsMCwwLDExNCwzLDAsCi0gICAgMCwwLDExNCwyMywwLDAsMCwxMTQsMzAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAotICAgIDExNCwxNjUsMCwwLDAsODAsMywwLDAsMTE1LDYsMCwwLDAsMTIsMiwKLSAgICA2LDIsMTIsNCwxMTQsMTY1LDAsMCwwLDk5LDMsMCwwLDAsMCwwLAotICAgIDAsMCw1LDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDg4LAotICAgIDAsMCwwLDEyNCwxLDAsMTA2LDAsMCwxMDAsMSwwLDEyNCwyLDAsMTAwLAotICAgIDIsMCwyNCwxMzEsMiwwLDEyNSwzLDAsMTE2LDEsMCwxMjQsMywwLDEzMSwKLSAgICAxLDAsMTI0LDIsMCwxMDcsMCwwLDExNCw1MiwwLDExNiwyLDAsMTAwLDMsCi0gICAgMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDMsMCwxMDAsNCwwLDI1LDEyNSw0LAotICAgIDAsMTI0LDAsMCwxMTQsODQsMCwxMDAsNSwwLDEwNiwzLDAsMTI0LDQsMCwKLSAgICAxMjQsMCwwLDEzMSwyLDAsODMsMTI0LDQsMCw4Myw0MSw2LDEyMiw1MCw4MiwKLSAgICAxMDEsMTE1LDExMSwxMDgsMTE4LDEwMSwzMiw5NywzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LDExOCwKLSAgICAxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTE2LDExMSwKLSAgICAzMiw5NywxMTAsMzIsOTcsOTgsMTE1LDExMSwxMDgsMTE3LDExNiwxMDEsMzIsMTExLDExMCwxMDEsCi0gICAgNDYsMTE0LDEyMSwwLDAsMCwxMTQsNDUsMCwwLDAsMTIyLDUwLDk3LDExNiwxMTYsCi0gICAgMTAxLDEwOSwxMTIsMTE2LDEwMSwxMDAsMzIsMTE0LDEwMSwxMDgsOTcsMTE2LDEwNSwxMTgsMTAxLDMyLAotICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDk4LDEwMSwxMjEsMTExLDExMCwxMDAsMzIsMTE2LDExMSwKLSAgICAxMTIsNDUsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE0LAotICAgIDMzLDAsMCwwLDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSw0MSw0LDIxOCw2LDExNCwKLSAgICAxMTUsMTEyLDEwOCwxMDUsMTE2LDIxOCwzLDEwOCwxMDEsMTEwLDIxOCwxMCw4Niw5NywxMDgsMTE3LAotICAgIDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDUwLDAsMCwwLDQxLDUsMTE0LDE1LDAsCi0gICAgMCwwLDIxOCw3LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwyMTgsNSwxMDgsMTAxLDExOCwKLSAgICAxMDEsMTA4LDkwLDQsOTgsMTA1LDExNiwxMTUsOTAsNCw5OCw5NywxMTUsMTAxLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMyw5NSwKLSAgICAxMTQsMTAxLDExNSwxMTEsMTA4LDExOCwxMDEsOTUsMTEwLDk3LDEwOSwxMDEsOTMsMywwLDAsCi0gICAgMTE1LDEwLDAsMCwwLDAsMiwyMiwxLDE4LDEsMTIsMSwxMCwxLDExNCwKLSAgICAxNzEsMCwwLDAsOTksMywwLDAsMCwwLDAsMCwwLDQsMCwwLAotICAgIDAsMywwLDAsMCw2NywwLDAsMCwxMTUsNDcsMCwwLDAsMTI0LDAsCi0gICAgMCwxMDYsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDEyNSwzLDAsCi0gICAgMTI0LDMsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDM0LDAsMTAwLDAsMCw4MywKLSAgICAxMTYsMSwwLDEyNCwxLDAsMTI0LDMsMCwxMzEsMiwwLDgzLDQxLDEsNzgsCi0gICAgNDEsMiwxMTQsMTU1LDAsMCwwLDExNCw4NSwwLDAsMCw0MSw0LDIxOCw2LAotICAgIDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCwxNSwwLDAsMCwxMTQsMTUyLDAsMCwwLAotICAgIDExNCw5OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMSwwLDAsMCwyMTgsMTcsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LAotICAgIDk1LDEwOCwxMDEsMTAzLDk3LDk5LDEyMSwxMDIsMywwLDAsMTE1LDgsMCwwLDAsCi0gICAgMCwzLDE4LDEsMTIsMSw0LDEsMTE0LDE3MywwLDAsMCw5OSwzLDAsCi0gICAgMCwwLDAsMCwwLDAsOSwwLDAsMCwyNywwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsNDIsMSwwLDAsMTE2LDAsMCwxMDYsMSwwLDEwMCwxLDAsCi0gICAgMTA3LDksMCwxMTQsNDEsMCwxMTYsMCwwLDEwNiwxLDAsMTIsMTE0LDQxLDAsCi0gICAgMTE2LDIsMCwxMDYsMywwLDEwMCwyLDAsMTE2LDQsMCwxMzEsMiwwLDEsCi0gICAgMTI0LDAsMCwxMTYsMCwwLDEwNiw1LDAsMTA3LDYsMCwxMjUsMywwLDEyMCwKLSAgICAyMzUsMCwxMTYsMCwwLDEwNiwxLDAsNjgsOTMsMjIwLDAsMTI1LDQsMCwxMTYsCi0gICAgNiwwLDEzMSwwLDAsMTQzLDkwLDAsMSwxMjEsMTMsMCwxMjQsNCwwLDEwNiwKLSAgICA3LDAsMTI1LDUsMCw4NywxMTAsNTEsMCw0LDExNiw4LDAsMTA3LDEwLDAsCi0gICAgMTE0LDE0OCwwLDEsMSwxLDExNiw5LDAsMTI0LDQsMCwxMjQsMCwwLDEyNCwKLSAgICAxLDAsMTMxLDMsMCwxMjUsNiwwLDEyNCw2LDAsMTAwLDEsMCwxMDcsOCwKLSAgICAwLDExNCwxNDQsMCwxMTksNjYsMCw4OSwxMTAsMTksMCw4OCwxMjQsNSwwLDEyNCwKLSAgICAwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwzLDAsMTI1LDYsMCw4NywxMDAsCi0gICAgMSwwLDgxLDgyLDg4LDEyNCw2LDAsMTAwLDEsMCwxMDcsOSwwLDExNCw2NiwKLSAgICAwLDEyNCwzLDAsMTIsMTE0LDI2LDEsMTI0LDAsMCwxMTYsMCwwLDEwNiw1LAotICAgIDAsMTA3LDYsMCwxMTQsMjYsMSwxMTYsMCwwLDEwNiw1LDAsMTI0LDAsMCwKLSAgICAyNSwxMjUsNywwLDEyMSwxMywwLDEyNCw3LDAsMTA2LDEwLDAsMTI1LDgsMCwKLSAgICA4NywxMTAsMjIsMCw0LDExNiw4LDAsMTA3LDEwLDAsMTE0LDIsMSwxLDEsCi0gICAgMSwxMjQsNiwwLDgzLDg5LDExMywzMCwxLDg4LDEyNCw4LDAsMTAwLDEsMCwKLSAgICAxMDcsOCwwLDExNCwxOSwxLDEyNCw2LDAsODMsMTI0LDgsMCw4MywxMTMsNjYsCi0gICAgMCwxMjQsNiwwLDgzLDExMyw2NiwwLDg3LDEwMCwxLDAsODMsMTAwLDEsMCwKLSAgICA4Myw0MSwzLDEyMiwyMyw3MCwxMDUsMTEwLDEwMCwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSwzOSwxMTUsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCw0Niw3OCwxMjIsMjIsMTE1LAotICAgIDEyMSwxMTUsNDYsMTA5LDEwMSwxMTYsOTcsOTUsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiwKLSAgICAxMDEsMTA5LDExMiwxMTYsMTIxLDQxLDExLDExNCwxNCwwLDAsMCwyMTgsOSwxMDksMTAxLAotICAgIDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMTQxLDAsMCwwLDExNCwxNDIsMCwwLAotICAgIDAsMjE4LDEzLDczLDEwOSwxMTIsMTExLDExNCwxMTYsODcsOTcsMTE0LDExMCwxMDUsMTEwLDEwMywKLSAgICAxMTQsMjEsMCwwLDAsMTE0LDE2NSwwLDAsMCwxMTQsMTU0LDAsMCwwLDExNCwKLSAgICA5NiwwLDAsMCwxMTQsMTczLDAsMCwwLDExNCw5NSwwLDAsMCw0MSw5LAotICAgIDExNCwxNSwwLDAsMCwxMTQsMTUyLDAsMCwwLDExNCwxNTMsMCwwLDAsOTAsCi0gICAgOSwxMDUsMTE1LDk1LDExNCwxMDEsMTA4LDExMSw5NywxMDAsMTE0LDE3MiwwLDAsMCwxMTQsCi0gICAgMTU0LDAsMCwwLDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsMTE0LDk1LAorICAgIDEwLDAsMCwwLDExNiwwLDEwNiwxLDEyNCwxLDEzMSwxLDgzLDAsNDEsMSwKKyAgICAxMjIsNDUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMTEsMTAwLAorICAgIDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsNDEsCisgICAgMiwxMTQsNDYsMCwwLDAsMTE0LDE1NCwwLDAsMCw0MSwyLDExNCwxNDMsMCwKKyAgICAwLDAsMTE0LDcxLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDExLDAsMCwwLDExNCwxNDgsMCwwLDAsNDEsMywwLDAsMTE1LAorICAgIDIsMCwwLDAsMCw0LDEyMiwyMyw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwKKyAgICAxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw5OSwKKyAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsCisgICAgNTQsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiw5NywxMTUsMzIsCisgICAgMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwMCwKKyAgICAxMTEsMzIsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExOCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LAorICAgIDEwMSwzMiw5OSwxMTEsMTAwLDEwMSw0Niw3OCwxMTQsMTAsMCwwLDAsNDEsMiwxMTQsCisgICAgMTQzLDAsMCwwLDExNCw3MSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTQ5LDAsMCwwLDQ3LDMsMCwKKyAgICAwLDExNSwyLDAsMCwwLDAsNCwxMjIsMjUsNzAsMTE0LDExMSwxMjIsMTAxLDExMCwKKyAgICA3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsCisgICAgMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKKyAgICAyLDAsMCwwLDY3LDAsMCwwLDExNSwxMCwwLDAsMCwxMTYsMCwxMDYsCisgICAgMSwxMjQsMSwxMzEsMSw4MywwLDQxLDEsMTIyLDQ2LDgyLDEwMSwxMTYsMTE3LDExNCwKKyAgICAxMTAsMzIsODQsMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTE0LAorICAgIDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDk3LAorICAgIDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0Niw0MSwyLDExNCw0NiwwLDAsMCwKKyAgICA5MCwxNywxMDUsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDk1LDExMiw5Nyw5OSwxMDcsCisgICAgOTcsMTAzLDEwMSw0MSwyLDExNCwxNDMsMCwwLDAsMTE0LDcxLDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMDUsCisgICAgMCwwLDAsNTMsMywwLDAsMTE1LDIsMCwwLDAsMCw0LDEyMiwyNSwKKyAgICA3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDUsCisgICAgMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwyLDc4LDc4LDQxLDEsNzgsCisgICAgNDEsMTYsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLAorICAgIDAsMTE0LDMsMCwwLDAsMTE0LDE1MCwwLDAsMCwxMTQsODYsMCwwLDAsCisgICAgMTE0LDE1MSwwLDAsMCwxMTQsMTQ2LDAsMCwwLDExNCwxNDcsMCwwLDAsMTE0LAorICAgIDEzNCwwLDAsMCwxMTQsMTM1LDAsMCwwLDExNCwxMzgsMCwwLDAsMTE0LDc3LAorICAgIDAsMCwwLDExNCwxNDgsMCwwLDAsMTE0LDE0OSwwLDAsMCwxMTQsMTA1LDAsCisgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMSwwLDAsMCwxMTQsMTUyLDAsMCwwLDI0MSwyLDAsMCwxMTUsCisgICAgMzAsMCwwLDAsOCw3LDQsMiwxMiw5LDIsMSwxMiw2LDIsMSwKKyAgICAxMiw4LDEyLDQsMTIsOSwxMiw5LDIsMSwxNCw1LDIsMSwxNCw1LAorICAgIDIsMSwxMTQsMTUyLDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLDAsMTE1LDMyLDAsMCwKKyAgICAwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwyLDEwMCwKKyAgICAzLDEzMiwwLDkwLDQsMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwxMDAsNiw4MywKKyAgICAwLDQxLDcsMjE4LDE4LDk1LDczLDEwOSwxMTIsMTExLDExNCwxMTYsNzYsMTExLDk5LDEwNywKKyAgICA2NywxMTEsMTEwLDExNiwxMDEsMTIwLDExNiwxMjIsMzYsNjcsMTExLDExMCwxMTYsMTAxLDEyMCwxMTYsCisgICAgMzIsMTA5LDk3LDExMCw5NywxMDMsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNyw0Niw5OSwxLDAsCisgICAgMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwxMiwwLDAsMCwxMTYsMCwxMDYsMSwxMzEsMCwxLDAsMTAwLAorICAgIDEsODMsMCw0MSwyLDEyMiwyNCw2NSw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksMTA3LDQ2LDc4LAorICAgIDQxLDIsMTE0LDQ2LDAsMCwwLDExNCwxMzcsMCwwLDAsNDEsMSwxMTQsMjYsCiAgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwKLSAgICAwLDAsMjE4LDEwLDk1LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSwxMTEsMywKLSAgICAwLDAsMTE1LDQ4LDAsMCwwLDAsMiwyNSwxLDE2LDQsMTUsMSwxNiwKLSAgICAxLDEwLDEsMywxLDEzLDEsMTMsMSwxOCwxLDEyLDEsOCwyLDI1LAotICAgIDEsMTIsMiwyMiwxLDEzLDEsMywxLDEzLDEsMTMsNCw5LDIsMTIsCi0gICAgMSw0LDIsNywyLDgsMiwxMTQsMTc2LDAsMCwwLDk5LDMsMCwwLAorICAgIDAsMCwxMTQsNDgsMCwwLDAsNjYsMywwLDAsMTE1LDIsMCwwLDAsCisgICAgMCwyLDEyMiwyOCw5NSw3MywxMDksMTEyLDExMSwxMTQsMTE2LDc2LDExMSw5OSwxMDcsNjcsCisgICAgMTExLDExMCwxMTYsMTAxLDEyMCwxMTYsNDYsOTUsOTUsMTAxLDExMCwxMTYsMTAxLDExNCw5NSw5NSwKKyAgICA5OSw0LDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwxLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwxMiwwLDAsMCwxMTYsMCwxMDYsMSwxMzEsMCwKKyAgICAxLDAsMTAwLDEsODMsMCw0MSwyLDEyMiw2MCw4MiwxMDEsMTA4LDEwMSw5NywxMTUsCisgICAgMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksCisgICAgMTA3LDMyLDExNCwxMDEsMTAzLDk3LDExNCwxMDAsMTA4LDEwMSwxMTUsMTE1LDMyLDExMSwxMDIsMzIsCisgICAgOTcsMTEwLDEyMSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDMyLDEwMSwxMjAsOTksMTAxLDExMiwKKyAgICAxMTYsMTA1LDExMSwxMTAsMTE1LDQ2LDc4LDQxLDIsMTE0LDQ2LDAsMCwwLDExNCw0NywKKyAgICAwLDAsMCw0MSw0LDExNCwyNiwwLDAsMCw5MCw4LDEwMSwxMjAsOTksOTUsCisgICAgMTE2LDEyMSwxMTIsMTAxLDkwLDksMTAxLDEyMCw5OSw5NSwxMTgsOTcsMTA4LDExNywxMDEsOTAsCisgICAgMTMsMTAxLDEyMCw5OSw5NSwxMTYsMTE0LDk3LDk5LDEwMSw5OCw5Nyw5OSwxMDcsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDUwLDAsCisgICAgMCwwLDcwLDMsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMjcsOTUsCisgICAgNzMsMTA5LDExMiwxMTEsMTE0LDExNiw3NiwxMTEsOTksMTA3LDY3LDExMSwxMTAsMTE2LDEwMSwxMjAsCisgICAgMTE2LDQ2LDk1LDk1LDEwMSwxMjAsMTA1LDExNiw5NSw5NSw3OCw0MSw2LDExNCwxLDAsCisgICAgMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsMCwwLDExNCwzLDAsMCwKKyAgICAwLDExNCw0OCwwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwKKyAgICAxNTcsMCwwLDAsNjIsMywwLDAsMTE1LDYsMCwwLDAsOCwyLDQsCisgICAgMiw4LDQsMTE0LDE1NywwLDAsMCw5OSwzLDAsMCwwLDAsMCwwLAorICAgIDAsNSwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw2NCwwLAorICAgIDAsMCwxMjQsMSwxMDYsMCwxMDAsMSwxMjQsMiwxMDAsMiwyNCwwLDEzMSwyLAorICAgIDEyNSwzLDExNiwxLDEyNCwzLDEzMSwxLDEyNCwyLDEwNywwLDExNCwzNiwxMTYsMiwKKyAgICAxMDAsMywxMzEsMSwxMzAsMSwxMjQsMywxMDAsNCwyNSwwLDEyNSw0LDEyNCwwLAorICAgIDExNCw2MCwxMDAsNSwxMDYsMywxMjQsNCwxMjQsMCwxMzEsMiw4MywwLDEyNCw0LAorICAgIDgzLDAsNDEsNiwxMjIsNTAsODIsMTAxLDExNSwxMTEsMTA4LDExOCwxMDEsMzIsOTcsMzIsCisgICAgMTE0LDEwMSwxMDgsOTcsMTE2LDEwNSwxMTgsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAorICAgIDExMCw5NywxMDksMTAxLDMyLDExNiwxMTEsMzIsOTcsMTEwLDMyLDk3LDk4LDExNSwxMTEsMTA4LAorICAgIDExNywxMTYsMTAxLDMyLDExMSwxMTAsMTAxLDQ2LDExNCwxMTcsMCwwLDAsMTE0LDMzLDAsCisgICAgMCwwLDEyMiw1MCw5NywxMTYsMTE2LDEwMSwxMDksMTEyLDExNiwxMDEsMTAwLDMyLDExNCwxMDEsCisgICAgMTA4LDk3LDExNiwxMDUsMTE4LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiw5OCwxMDEsCisgICAgMTIxLDExMSwxMTAsMTAwLDMyLDExNiwxMTEsMTEyLDQ1LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsMTEyLAorICAgIDk3LDk5LDEwNyw5NywxMDMsMTAxLDExNCwxOSwwLDAsMCwxMjIsNSwxMjMsMTI1LDQ2LAorICAgIDEyMywxMjUsNDEsNCwyMTgsNiwxMTQsMTE1LDExMiwxMDgsMTA1LDExNiwyMTgsMywxMDgsMTAxLAorICAgIDExMCwyMTgsMTAsODYsOTcsMTA4LDExNywxMDEsNjksMTE0LDExNCwxMTEsMTE0LDExNCwzOCwwLAorICAgIDAsMCw0MSw1LDExNCwxNSwwLDAsMCwyMTgsNywxMTIsOTcsOTksMTA3LDk3LAorICAgIDEwMywxMDEsMjE4LDUsMTA4LDEwMSwxMTgsMTAxLDEwOCw5MCw0LDk4LDEwNSwxMTYsMTE1LDkwLAorICAgIDQsOTgsOTcsMTE1LDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMSwwLDAsMCwyMTgsMTMsOTUsMTE0LDEwMSwxMTUsMTExLDEwOCwxMTgsMTAxLDk1LDExMCwKKyAgICA5NywxMDksMTAxLDc1LDMsMCwwLDExNSwxMCwwLDAsMCwwLDIsMTYsMSwKKyAgICAxMiwxLDgsMSw4LDEsMTE0LDE2MywwLDAsMCw5OSwzLDAsMCwwLAorICAgIDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSwzNCwwLDAsMCwxMjQsMCwxMDYsMCwxMjQsMSwxMjQsMiwxMzEsMiwxMjUsCisgICAgMywxMjQsMywxMDAsMCwxMDcsOCwxMTQsMjQsMTAwLDAsODMsMCwxMTYsMSwxMjQsCisgICAgMSwxMjQsMywxMzEsMiw4MywwLDQxLDEsNzgsNDEsMiwxMTQsMTQ3LDAsMCwKKyAgICAwLDExNCw3OCwwLDAsMCw0MSw0LDIxOCw2LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LAorICAgIDExNCwxNSwwLDAsMCwxMTQsMTQ0LDAsMCwwLDExNCw5MywwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTcsCisgICAgOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk1LDEwOCwxMDEsMTAzLDk3LDk5LAorICAgIDEyMSw4NCwzLDAsMCwxMTUsOCwwLDAsMCwwLDMsMTIsMSw4LDEsCisgICAgNCwxLDExNCwxNjUsMCwwLDAsOTksMywwLDAsMCwwLDAsMCwwLAorICAgIDEwLDAsMCwwLDI3LDAsMCwwLDY3LDAsMCwwLDExNSwyNDQsMCwwLAorICAgIDAsMTE2LDAsMTA2LDEsMTI1LDMsMTI0LDMsMTAwLDEsMTA3LDgsMTE0LDIyLDExNiwKKyAgICAyLDEwMCwyLDEzMSwxLDEzMCwxLDEyNCwzLDExNSwzOCwxMTYsMywxMDYsNCwxMDAsCisgICAgMywxMTYsNSwxMzEsMiwxLDAsMTI0LDAsMTE2LDAsMTA2LDYsMTA3LDYsMTI1LAorICAgIDQsMTIwLDE5MCwxMjQsMyw2OCwwLDkzLDE3OCwxMjUsNSwxMTYsNywxMzEsMCwxNDMsCisgICAgNzIsMSwwLDEyMSwxMCwxMjQsNSwxMDYsOCwxMjUsNiw4NywwLDExMCw0Miw0LAorICAgIDAsMTE2LDksMTA3LDEwLDExNCwxMTgsMSwwLDEsMCwxLDAsMTE2LDEwLDEyNCwKKyAgICA1LDEyNCwwLDEyNCwxLDEzMSwzLDEyNSw3LDEyNCw3LDEwMCwxLDEwNyw4LDExNCwKKyAgICAxMTQsMTE5LDU0LDg5LDAsMTEwLDE0LDg4LDAsMTI0LDYsMTI0LDAsMTI0LDEsMTI0LAorICAgIDIsMTMxLDMsMTI1LDcsODcsMCwxMDAsMSw4MSwwLDgyLDAsODgsMCwxMjQsCisgICAgNywxMDAsMSwxMDcsOSwxMTQsNTQsMTI0LDQsMTIsMCwxMTQsMjI4LDEyNCwwLDExNiwKKyAgICAwLDEwNiw2LDEwNyw2LDExNCwyMjgsMTE2LDAsMTA2LDYsMTI0LDAsMjUsMCwxMjUsCisgICAgOCwxMjEsMTAsMTI0LDgsMTA2LDExLDEyNSw5LDg3LDAsMTEwLDIwLDQsMCwxMTYsCisgICAgOSwxMDcsMTAsMTE0LDIwNiwxLDAsMSwwLDEsMCwxMjQsNyw4MywwLDg4LAorICAgIDAsMTI0LDksMTAwLDEsMTA3LDgsMTE0LDIyMiwxMjQsNyw4MywwLDExMywyMzIsMTI0LAorICAgIDksODMsMCwxMTMsNTQsMTI0LDcsODMsMCwxMTMsNTQsODcsMCwxMDAsMSw4MywKKyAgICAwLDEwMCwxLDgzLDAsNDEsNCwxMjIsMjEsNzAsMTA1LDExMCwxMDAsMzIsOTcsMzIsCisgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzksMTE1LDMyLDExNSwxMTIsMTAxLDk5LDQ2LDc4LDEyMiwKKyAgICA1MywxMTUsMTIxLDExNSw0NiwxMDksMTAxLDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsCisgICAgMTE1LDMyLDc4LDExMSwxMTAsMTAxLDQ0LDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsMTA1LAorICAgIDExNSwzMiwxMDgsMTA1LDEwNywxMDEsMTA4LDEyMSwzMiwxMTUsMTA0LDExNywxMTYsMTE2LDEwNSwxMTAsCisgICAgMTAzLDMyLDEwMCwxMTEsMTE5LDExMCwxMjIsMjIsMTE1LDEyMSwxMTUsNDYsMTA5LDEwMSwxMTYsOTcsCisgICAgOTUsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiwxMDEsMTA5LDExMiwxMTYsMTIxLDQxLDEyLAorICAgIDExNCwxNCwwLDAsMCwyMTgsOSwxMDksMTAxLDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwKKyAgICAxMTQsNzAsMCwwLDAsMjE4LDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LAorICAgIDIxOCw0LDExOSw5NywxMTQsMTEwLDIxOCwxMyw3MywxMDksMTEyLDExMSwxMTQsMTE2LDg3LDk3LAorICAgIDExNCwxMTAsMTA1LDExMCwxMDMsMTE0LDc5LDAsMCwwLDExNCwxNTcsMCwwLDAsMTE0LAorICAgIDE0NiwwLDAsMCwxMTQsOTAsMCwwLDAsMTE0LDE2NSwwLDAsMCwxMTQsODksCisgICAgMCwwLDAsNDEsMTAsMTE0LDE1LDAsMCwwLDExNCwxNDQsMCwwLDAsMTE0LAorICAgIDE0NSwwLDAsMCwxMTQsMTY2LDAsMCwwLDkwLDksMTA1LDExNSw5NSwxMTQsMTAxLAorICAgIDEwOCwxMTEsOTcsMTAwLDExNCwxNjQsMCwwLDAsMTE0LDE0NiwwLDAsMCwxMTQsODIsCisgICAgMCwwLDAsMTE0LDgzLDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTAsOTUsMTAyLAorICAgIDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDkzLDMsMCwwLDExNSw1NCwwLDAsCisgICAgMCwwLDIsNiwxLDgsMiw4LDMsNCwxLDEyLDUsMTAsMSwxMCwKKyAgICAxLDgsMSwyLDEsMTAsMSwxNCwxLDEyLDEsOCwxLDgsMiwyMiwKKyAgICAxLDgsMiwxNiwxLDEwLDEsMiwxLDEwLDEsMTQsNCw2LDIsOCwKKyAgICAxLDYsMiw2LDIsOCwyLDExNCwxNzAsMCwwLDAsOTksMywwLDAsCiAgICAgMCwwLDAsMCwwLDQsMCwwLDAsNCwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMTg1LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMTYsMSwwLDEzMSwKLSAgICAyLDAsMTE1LDQyLDAsMTE2LDIsMCwxMDAsMSwwLDEwNiwzLDAsMTE2LDQsCi0gICAgMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDEsMCwxMzEsMSwwLDEzMCwxLDAsCi0gICAgMTI0LDIsMCwxMDAsMiwwLDEwNywwLDAsMTE0LDY2LDAsMTE2LDUsMCwxMDAsCi0gICAgMywwLDEzMSwxLDAsMTMwLDEsMCwxMjQsMiwwLDEwMCwyLDAsMTA3LDQsCi0gICAgMCwxMTQsMTUwLDAsMTE2LDAsMCwxMjQsMSwwLDExNiwxLDAsMTMxLDIsMCwKLSAgICAxMTUsMTA4LDAsMTE2LDIsMCwxMDAsNCwwLDEzMSwxLDAsMTMwLDEsMCwxMTAsCi0gICAgNDIsMCwxMjQsMSwwLDExNiw2LDAsMTA2LDcsMCwxMDcsNywwLDExNCwxNTAsCi0gICAgMCwxMDAsNSwwLDEyNSwzLDAsMTE2LDgsMCwxMjQsMywwLDEwNiwzLDAsCi0gICAgMTI0LDEsMCwxMzEsMSwwLDEzMSwxLDAsMTMwLDEsMCwxMjQsMCwwLDEyLAotICAgIDExNCwxODEsMCwxMjQsMiwwLDEwMCwyLDAsMTA3LDIsMCwxMTQsMTgxLDAsMTE2LAotICAgIDUsMCwxMDAsNiwwLDEzMSwxLDAsMTMwLDEsMCwxMDAsNywwLDgzLDQxLAotICAgIDgsMTIyLDI4LDg2LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwKLSAgICAxMTAsMTE2LDExNSwzMiw5NywxMTQsMTAxLDMyLDM0LDExNSw5NywxMTAsMTAxLDM0LDQ2LDEyMiwKLSAgICAzMSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwzMiwxMDksMTE3LDExNSwKLSAgICAxMTYsMzIsOTgsMTAxLDMyLDExNSwxMTYsMTE0LDQ0LDMyLDExMCwxMTEsMTE2LDMyLDEyMywxMjUsCi0gICAgMTE0LDMzLDAsMCwwLDEyMiwxOCwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDEwOSwxMTcsMTE1LAotICAgIDExNiwzMiw5OCwxMDEsMzIsNjIsNjEsMzIsNDgsMTIyLDMxLDk1LDk1LDExMiw5Nyw5OSwKLSAgICAxMDcsOTcsMTAzLDEwMSw5NSw5NSwzMiwxMTAsMTExLDExNiwzMiwxMTUsMTAxLDExNiwzMiwxMTYsCi0gICAgMTExLDMyLDk3LDMyLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDEyMiw2MSw4MCw5NywxMTQsMTAxLAotICAgIDExMCwxMTYsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTEwLAotICAgIDExMSwxMTYsMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCw0NCwzMiw5OSw5NywxMTAsMTEwLDExMSwKLSAgICAxMTYsMzIsMTEyLDEwMSwxMTQsMTAyLDExMSwxMTQsMTA5LDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsCi0gICAgMTE4LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMjIsMTcsNjksMTA5LDExMiwxMTYsMTIxLAotICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDc4LDQxLDksMjE4LAotICAgIDEwLDEwNSwxMTUsMTA1LDExMCwxMTUsMTE2LDk3LDExMCw5OSwxMDEsMjE4LDMsMTE1LDExNiwxMTQsCi0gICAgMjE4LDksODQsMTIxLDExMiwxMDEsNjksMTE0LDExNCwxMTEsMTE0LDExNCw1MCwwLDAsMCwKLSAgICAxMTQsMTMsMCwwLDAsMTE0LDE2OCwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LAotICAgIDIxLDAsMCwwLDIxOCwxMSw4MywxMjEsMTE1LDExNiwxMDEsMTA5LDY5LDExNCwxMTQsMTExLAotICAgIDExNCw0MSw0LDExNCwxNSwwLDAsMCwxMTQsMTY5LDAsMCwwLDExNCwxNzAsMCwKLSAgICAwLDAsMTE0LDE0NywwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNSwxNDAsMCwwLDAsMTE2LDAsMTI0LDAsMTE2LDEsMTMxLDIsMTE1LDI4LAorICAgIDExNiwyLDEwMCwxLDEwNiwzLDExNiw0LDEyNCwwLDEzMSwxLDEzMSwxLDEzMSwxLAorICAgIDEzMCwxLDEyNCwyLDEwMCwyLDEwNywwLDExNCw0NCwxMTYsNSwxMDAsMywxMzEsMSwKKyAgICAxMzAsMSwxMjQsMiwxMDAsMiwxMDcsNCwxMTQsMTE0LDExNiwwLDEyNCwxLDExNiwxLAorICAgIDEzMSwyLDExNSw3MiwxMTYsMiwxMDAsNCwxMzEsMSwxMzAsMSwxMTAsNDIsMTI0LDEsCisgICAgMTE1LDg2LDExNiw2LDEwMCw1LDEzMSwxLDEzMCwxLDExMCwyOCwxMjQsMSwxMTYsNywKKyAgICAxMDYsOCwxMDcsNywxMTQsMTE0LDEwMCw2LDEyNSwzLDExNiw5LDEyNCwzLDEwNiwzLAorICAgIDEyNCwxLDEzMSwxLDEzMSwxLDEzMCwxLDEyNCwwLDEyLDAsMTE0LDEzNiwxMjQsMiwKKyAgICAxMDAsMiwxMDcsMiwxMTQsMTM2LDExNiw1LDEwMCw3LDEzMSwxLDEzMCwxLDEwMCw4LAorICAgIDgzLDAsNDEsOSwxMjIsMjgsODYsMTAxLDExNCwxMDUsMTAyLDEyMSwzMiw5NywxMTQsMTAzLAorICAgIDExNywxMDksMTAxLDExMCwxMTYsMTE1LDMyLDk3LDExNCwxMDEsMzIsMzQsMTE1LDk3LDExMCwxMDEsCisgICAgMzQsNDYsMTIyLDMxLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLAorICAgIDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsMTE1LDExNiwxMTQsNDQsMzIsMTEwLDExMSwxMTYsCisgICAgMzIsMTIzLDEyNSwxMTQsMTksMCwwLDAsMTIyLDE4LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsCisgICAgMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwzMiw2Miw2MSwzMiw0OCwxMjIsMzEsOTUsOTUsCisgICAgMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDExMCwxMTEsMTE2LDMyLDExNSwxMDEsCisgICAgMTE2LDMyLDExNiwxMTEsMzIsOTcsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMTIyLDU0LDk3LAorICAgIDExNiwxMTYsMTAxLDEwOSwxMTIsMTE2LDEwMSwxMDAsMzIsMTE0LDEwMSwxMDgsOTcsMTE2LDEwNSwxMTgsCisgICAgMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTAsMTExLAorICAgIDMyLDEwNywxMTAsMTExLDExOSwxMTAsMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwzMiwxMTIsOTcsCisgICAgOTksMTA3LDk3LDEwMywxMDEsMTIyLDYxLDgwLDk3LDExNCwxMDEsMTEwLDExNiwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMTAsMTExLDExNiwzMiwxMDgsMTExLAorICAgIDk3LDEwMCwxMDEsMTAwLDQ0LDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiwxMTIsMTAxLDExNCwKKyAgICAxMDIsMTExLDExNCwxMDksMzIsMTE0LDEwMSwxMDgsOTcsMTE2LDEwNSwxMTgsMTAxLDMyLDEwNSwxMDksCisgICAgMTEyLDExMSwxMTQsMTE2LDEyMiwxNyw2OSwxMDksMTEyLDExNiwxMjEsMzIsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNzgsNDEsMTAsMjE4LDEwLDEwNSwxMTUsMTA1LDExMCwKKyAgICAxMTUsMTE2LDk3LDExMCw5OSwxMDEsMjE4LDMsMTE1LDExNiwxMTQsMjE4LDksODQsMTIxLDExMiwKKyAgICAxMDEsNjksMTE0LDExNCwxMTEsMTE0LDExNCwzOCwwLDAsMCwxMTQsMTMsMCwwLDAsCisgICAgMTE0LDE2MCwwLDAsMCwxMTQsNzAsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwKKyAgICA3OSwwLDAsMCwyMTgsMTEsODMsMTIxLDExNSwxMTYsMTAxLDEwOSw2OSwxMTQsMTE0LDExMSwKKyAgICAxMTQsNDEsNCwxMTQsMTUsMCwwLDAsMTE0LDE2MSwwLDAsMCwxMTQsMTYyLDAsCisgICAgMCwwLDExNCwxMzksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCiAgICAgMCwxMTQsMTEsMCwwLDAsMjE4LDEzLDk1LDExNSw5NywxMTAsMTA1LDExNiwxMjEsOTUsCi0gICAgOTksMTA0LDEwMSw5OSwxMDcsMTUxLDMsMCwwLDExNSwyNCwwLDAsMCwwLDIsCi0gICAgMTUsMSwyNywxLDEyLDEsMTIsMSwxMiwxLDE1LDEsMTUsMSwxNSwxLAotICAgIDYsMiwyMSwxLDE5LDEsMTE0LDE4MSwwLDAsMCwxMjIsMTYsNzgsMTExLDMyLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDEwMCwzMiwxMjIsNCwxMjMsCi0gICAgMzMsMTE0LDEyNSw5OSwyLDAsMCwwLDAsMCwwLDAsOCwwLDAsMCwKLSAgICAxMiwwLDAsMCw2NywwLDAsMCwxMTUsNDAsMSwwLDAsMTAwLDAsMCwKLSAgICAxMjUsMiwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMSwwLDEzMSwxLDAsMTAwLAotICAgIDIsMCwyNSwxMjUsMywwLDEyNCwzLDAsMTE0LDE3NSwwLDEyNCwzLDAsMTE2LAotICAgIDEsMCwxMDYsMiwwLDEwNyw3LDAsMTE0LDU5LDAsMTE2LDMsMCwxMjQsMSwKLSAgICAwLDEyNCwzLDAsMTMxLDIsMCwxLDEyNCwwLDAsMTE2LDEsMCwxMDYsMiwKLSAgICAwLDEwNyw2LDAsMTE0LDg1LDAsMTE2LDEsMCwxMDYsMiwwLDEyNCwwLDAsCi0gICAgMjUsODMsMTE2LDEsMCwxMDYsMiwwLDEyNCwzLDAsMjUsMTI1LDQsMCwxMjEsCi0gICAgMTMsMCwxMjQsNCwwLDEwNiw0LDAsMTI1LDIsMCw4NywxMTAsNjEsMCw0LAotICAgIDExNiw1LDAsMTA3LDEwLDAsMTE0LDE3NCwwLDEsMSwxLDExNiw2LDAsMTAwLAotICAgIDMsMCwyMywxMDYsNywwLDEyNCwwLDAsMTI0LDMsMCwxMzEsMiwwLDEyNSwKLSAgICA1LDAsMTE2LDgsMCwxMjQsNSwwLDEwMCw0LDAsMTI0LDAsMCwxMzEsMSwKLSAgICAxLDEwMCwwLDAsMTMwLDIsMCw4OSwxMTAsMSwwLDg4LDExNiw5LDAsMTI0LAotICAgIDAsMCwxMjQsMiwwLDEzMSwyLDAsMTI1LDYsMCwxMjQsNiwwLDEwMCwwLAotICAgIDAsMTA3LDgsMCwxMTQsMjMyLDAsMTE2LDgsMCwxMTYsNiwwLDEwNiw3LDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDEwMCw0LDAsMTI0LDAsMCwxMzEsMSwxLDEzMCwKLSAgICAxLDAsMTEwLDEyLDAsMTE2LDEwLDAsMTI0LDYsMCwxMzEsMSwwLDEyNSw3LAotICAgIDAsMTI0LDMsMCwxMTQsMzYsMSwxMTYsMSwwLDEwNiwyLDAsMTI0LDMsMCwKLSAgICAyNSwxMjUsNCwwLDExNiwxMSwwLDEyNCw0LDAsMTI0LDAsMCwxMDYsMCwwLAotICAgIDEwMCwxLDAsMTMxLDEsMCwxMDAsNSwwLDI1LDEyNCw3LDAsMTMxLDMsMCwKLSAgICAxLDEyNCw3LDAsODMsNDEsNiw3OCwxMTQsMTIxLDAsMCwwLDExNCwzMywwLAotICAgIDAsMCwxMjIsMjMsNTksMzIsMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLAotICAgIDExNiwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE0LDE1LDAsMCwwLAotICAgIDExNCwxNDAsMCwwLDAsNDEsMTIsMTE0LDEyMiwwLDAsMCwxMTQsMTQsMCwwLAotICAgIDAsMTE0LDIxLDAsMCwwLDExNCw2NSwwLDAsMCwxMTQsMTMxLDAsMCwwLAotICAgIDExNCw5NiwwLDAsMCwyMTgsOCw5NSw2OSw4Miw4Miw5NSw3Nyw4Myw3MSwxMTQsCi0gICAgNTAsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwxNzYsMCwwLDAsMTE0LDE0OSwKLSAgICAwLDAsMCwxMTQsNSwwLDAsMCw0MSw4LDExNCwxNSwwLDAsMCwyMTgsCi0gICAgNywxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSwxMTQsMTUyLDAsMCwwLDExNCwxMjMsMCwKLSAgICAwLDAsOTAsMTMsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwxMTQsMTQ3LDAsMCwwLDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LAotICAgIDIzLDk1LDEwMiwxMDUsMTEwLDEwMCw5NSw5NywxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDk1LAotICAgIDExNywxMTAsMTA4LDExMSw5OSwxMDcsMTAxLDEwMCwxNzEsMywwLDAsMTE1LDQyLDAsMCwKLSAgICAwLDAsMSw2LDEsMTksMSw2LDEsMTUsMSwxMywyLDE1LDEsMTEsCi0gICAgMSwxMywxLDMsMSwxMywxLDEzLDEsMjIsMSwyNiwxLDE1LDEsMTIsCi0gICAgMSwzMCwyLDEyLDEsNiwyLDEzLDEsMjksMSwxMTQsMTg0LDAsMCwwLAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEwLDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSwzNywwLDAsMCwxMTYsMCwwLDEyNCwwLDAsCi0gICAgMTMxLDEsMCwxNDMsMTgsMCwxLDExNiwxLDAsMTI0LDAsMCwxMjQsMSwwLAotICAgIDEzMSwyLDAsODMsODcsMTAwLDEsMCw4MSw4Miw4OCwxMDAsMSwwLDgzLDQxLAotICAgIDIsMTIyLDU0LDcwLDEwNSwxMTAsMTAwLDMyLDk3LDExMCwxMDAsMzIsMTA4LDExMSw5NywxMDAsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsOTcsMTEwLDEwMCwKLSAgICAzMiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNyw0Niw3OCw0MSwyLDExNCw1NCwwLDAsCi0gICAgMCwxMTQsMTg0LDAsMCwwLDQxLDIsMTE0LDE1LDAsMCwwLDExNCwxODMsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAotICAgIDAsMjE4LDE0LDk1LDEwMiwxMDUsMTEwLDEwMCw5NSw5NywxMTAsMTAwLDk1LDEwOCwxMTEsOTcsCi0gICAgMTAwLDE5OCwzLDAsMCwxMTUsNCwwLDAsMCwwLDIsMTMsMSwxMTQsMTg1LAotICAgIDAsMCwwLDExNCwzMywwLDAsMCw5OSwzLDAsMCwwLDAsMCwwLAotICAgIDAsNSwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwxNjYsMCwKLSAgICAwLDAsMTE2LDAsMCwxMjQsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMywKLSAgICAwLDEsMTI0LDIsMCwxMDAsMSwwLDEwNyw0LDAsMTE0LDQ2LDAsMTE2LDEsCi0gICAgMCwxMjQsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMywwLDEyNSwwLDAsCi0gICAgMTE2LDIsMCwxMDYsMywwLDEzMSwwLDAsMSwxMjQsMCwwLDExNiw0LDAsCi0gICAgMTA2LDUsMCwxMDcsNywwLDExNCw4NCwwLDExNiw2LDAsMTI0LDAsMCwxMTYsCi0gICAgNywwLDEzMSwyLDAsODMsMTE2LDQsMCwxMDYsNSwwLDEyNCwwLDAsMjUsCi0gICAgMTI1LDMsMCwxMjQsMywwLDEwMCwyLDAsMTA3LDgsMCwxMTQsMTUyLDAsMTE2LAotICAgIDIsMCwxMDYsOCwwLDEzMSwwLDAsMSwxMDAsMywwLDEwNiw5LDAsMTI0LAotICAgIDAsMCwxMzEsMSwwLDEyNSw0LDAsMTE2LDEwLDAsMTI0LDQsMCwxMDAsNCwKLSAgICAwLDEyNCwwLDAsMTMxLDEsMSwxMzAsMSwwLDExNiwxMSwwLDEyNCwwLDAsCi0gICAgMTMxLDEsMCwxLDEyNCwzLDAsODMsNDEsNSw5Nyw1MCwxLDAsMCw3MywKLSAgICAxMDksMTEyLDExMSwxMTQsMTE2LDMyLDk3LDExMCwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsOTcsMTE1LDEwMSwKLSAgICAxMDAsMzIsMTExLDExMCwzMiwxMDUsMTE2LDExNSwzMiwxMTAsOTcsMTA5LDEwMSw0NCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTE2LDEwNCwxMDEsMzIsOTksCi0gICAgOTcsMTA4LDEwOCwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDk4LDEwMSwxMDUsMTEwLDEwMywKLSAgICAzMiwxMDksOTcsMTAwLDEwMSwzMiwxMDIsMTE0LDExMSwxMDksNDQsMzIsOTcsMTEwLDEwMCwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDk3LDEwMCwxMDYsMTE3LDExNSwxMTYsCi0gICAgMTA5LDEwMSwxMTAsMTE2LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLAotICAgIDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsCi0gICAgMTEwLDExNiwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTAzLDExNCwxMDEsOTcsMTE2LDEwMSwxMTUsMTE2LAotICAgIDMyLDk5LDExMSwxMDksMTA5LDExMSwxMTAsMzIsMTAwLDEwMSwxMTAsMTExLDEwOSwxMDUsMTEwLDk3LAotICAgIDExNiwxMTEsMTE0LDMyLDExMSwxMDIsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDk3LAotICAgIDEwOCwxMDUsMTE2LDEyMSwxMCwzMiwzMiwzMiwzMiw5OCwxMDEsMTE2LDExOSwxMDEsMTAxLDExMCwKLSAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5NywKLSAgICAxMTAsMTAwLDMyLDk1LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDk1LDk1LDQ2LDMyLDg0LAotICAgIDEwNCwxMDUsMTE1LDMyLDEwNSwxMTAsOTksMTA4LDExNywxMDAsMTAxLDExNSwzMiwxMTUsMTAxLDExNiwKLSAgICAxMTYsMTA1LDExMCwxMDMsMzIsOTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LAotICAgIDMyLDEwNSwxMDIsMTAsMzIsMzIsMzIsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCwzMiwxMDAsMTA1LDEwMCwzMiwxMTAsMTExLDExNiw0NiwxMCwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMTQsMzMsMCwwLDAsNzgsMTIyLDQwLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLAotICAgIDExMSwxMDIsMzIsMTIzLDEyNSwzMiwxMDQsOTcsMTA4LDExNiwxMDEsMTAwLDU5LDMyLDc4LDExMSwKLSAgICAxMTAsMTAxLDMyLDEwNSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE1LDExNCwxNSwwLDAsMCw0MSwxMiwxMTQsMTgxLDAsMCwwLDExNCwxNzEsMCwKLSAgICAwLDAsMTE0LDU3LDAsMCwwLDExNCwxNDUsMCwwLDAsMTE0LDE0LDAsMCwKLSAgICAwLDExNCwyMSwwLDAsMCwxMTQsMTg1LDAsMCwwLDIxOCwxMSw5NSwxMDMsOTksCi0gICAgMTAwLDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDExNCw1OCwwLDAsMCwxMTQsNTAsMCwKLSAgICAwLDAsMTE0LDc3LDAsMCwwLDExNCw2MywwLDAsMCw0MSw1LDExNCwxNSwKLSAgICAwLDAsMCwxMTQsMTY5LDAsMCwwLDExNCwxNzAsMCwwLDAsMTE0LDg5LDAsCi0gICAgMCwwLDExNCw3NCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwxMTQsMTg2LDAsMCwwLDIwNCwzLDAsMCwxMTUsCi0gICAgMjgsMCwwLDAsMCw5LDE2LDEsMTIsMSwxOCwxLDEwLDEsMTUsMSwKLSAgICAxMywxLDEzLDEsMTIsMSwxMCwxLDYsMSw5LDEsMTgsMSwxMCwxLAotICAgIDExNCwxODYsMCwwLDAsOTksMywwLDAsMCwwLDAsMCwwLDYsMCwKLSAgICAwLDAsMTcsMCwwLDAsNjcsMCwwLDAsMTE1LDIzOSwwLDAsMCwxMTYsCi0gICAgMCwwLDEyNCwwLDAsMTAwLDEsMCwxMzEsMiwwLDExNCwyMzUsMCwxMDAsMiwKLSAgICAwLDEyNCwxLDAsMTA3LDYsMCwxMTQsODMsMCwxMTYsMSwwLDEyNCwxLDAsCi0gICAgMTMxLDEsMCwxMjUsMSwwLDEyNCwxLDAsMTA2LDIsMCwxMDAsMiwwLDEzMSwKLSAgICAxLDAsMSwxMTYsMCwwLDEyNCwwLDAsMTAwLDMsMCwxMzEsMiwwLDExNCwKLSAgICA4MywwLDEyNCwxLDAsMTA2LDMsMCwxMjQsMCwwLDEwNiw0LDAsMTMxLDEsCi0gICAgMCwxLDEyMCwxNDksMCwxMjQsMSwwLDY4LDkzLDE0MSwwLDEyNSwzLDAsMTE2LAotICAgIDAsMCwxMjQsMCwwLDEyNCwzLDAsMTMxLDIsMCwxMTUsOTAsMCwxMDAsNCwKLSAgICAwLDEwNiw1LDAsMTI0LDAsMCwxMDYsNiwwLDEyNCwzLDAsMTMxLDIsMCwKLSAgICAxMjUsNCwwLDEyMSwxNywwLDExNiw3LDAsMTI0LDIsMCwxMjQsNCwwLDEzMSwKLSAgICAyLDAsMSw4NywxMTMsOTAsMCw0LDExNiw4LDAsMTA3LDEwLDAsMTE0LDIzMCwKLSAgICAwLDEsMTI1LDUsMCwxLDEyMiw0NywwLDExNiw5LDAsMTI0LDUsMCwxMzEsCi0gICAgMSwwLDEwNiwxMCwwLDExNiwxMSwwLDEzMSwxLDAsMTE0LDIwOSwwLDEyNCw1LAotICAgIDAsMTA2LDEyLDAsMTI0LDQsMCwxMDcsMiwwLDExNCwyMDksMCwxMTksOTAsMCwKLSAgICAxMzAsMCwwLDg3LDg5LDEwMCw1LDAsMTAwLDUsMCwxMjUsNSwwLDEyNiw1LAotICAgIDAsODgsMTEzLDkwLDAsODgsMTEzLDkwLDAsODcsMTI0LDAsMCw4Myw0MSw2LAotICAgIDEyMiwyMzgsNzAsMTA1LDEwMywxMTcsMTE0LDEwMSwzMiwxMTEsMTE3LDExNiwzMiwxMTksMTA0LDk3LAotICAgIDExNiwzMiw5NSw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSw5NSwzMiwxMTUsMTA0LDExMSwKLSAgICAxMTcsMTA4LDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCw0NiwxMCwxMCwzMiwzMiwzMiwKLSAgICAzMiw4NCwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDk1LDMyLDExMiw5NywxMTQsCi0gICAgOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDk3LDMyLDk5LDk3LDEwOCwxMDgsCi0gICAgOTcsOTgsMTA4LDEwMSwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE2LDk3LDEwNywxMDEsMTE1LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAotICAgIDExNiw0NiwzMiw3MywxMTYsMzIsMTA1LDExNSwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsCi0gICAgMTAwLDMyLDExNiwxMTEsMzIsMTAwLDEwMSw5OSwxMTEsMTE3LDExMiwxMDgsMTAxLDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsCi0gICAgOTcsMTE1LDExNSwxMTcsMTA5LDEwNSwxMTAsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwKLSAgICAxMDUsOTgsMzksMTE1LDEwLDMyLDMyLDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLAotICAgIDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDUsCi0gICAgMTE1LDMyLDEwMCwxMDEsMTE1LDEwNSwxMTQsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKLSAgICAxMTQsMTMxLDAsMCwwLDI1MCwxLDQyLDIxOCw3LDk1LDk1LDk3LDEwOCwxMDgsOTUsCi0gICAgOTUsMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LDc4LDQxLDEzLDExNCw0LDAsMCwwLAotICAgIDExNCwxMzAsMCwwLDAsMjE4LDYsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMjE4LDYsMTAxLAotICAgIDEyMCwxMTYsMTAxLDExMCwxMDAsMTE0LDE4OCwwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LAotICAgIDEsMCwwLDAsMTE0LDY1LDAsMCwwLDExNCw3NywwLDAsMCwxMTQsMTc4LAotICAgIDAsMCwwLDExNCw3MSwwLDAsMCwyMTgsMTUsOTUsNjksODIsODIsOTUsNzcsCi0gICAgODMsNzEsOTUsODAsODIsNjksNzAsNzMsODgsMTE0LDE1LDAsMCwwLDQxLDYsCi0gICAgMTE0LDg5LDAsMCwwLDIxOCw4LDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsMTE0LAotICAgIDE4MywwLDAsMCwyMTgsMSwxMjAsOTAsOSwxMDIsMTE0LDExMSwxMDksOTUsMTEwLDk3LAotICAgIDEwOSwxMDEsOTAsMywxMDEsMTIwLDk5LDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDExLDAsMCwwLDIxOCwxNiw5NSwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDk1LAotICAgIDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsMjI4LDMsMCwwLDExNSwzNCwwLDAsCi0gICAgMCwwLDEwLDE1LDEsMTIsMSwxMiwxLDEzLDEsMTUsMSwxNiwxLDEzLAotICAgIDEsMTUsMSwyMSwxLDMsMSwxNywxLDE4LDQsMjEsMSwxNSwxLDMsCi0gICAgMSwyNiwxLDExNCwxOTQsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsNzIsMCwKLSAgICAwLDAsMTI0LDAsMCwxMDYsMCwwLDEwMCwxLDAsMTMxLDEsMCwxMjUsMSwKLSAgICAwLDEyNCwxLDAsMTAwLDIsMCwxMDcsOCwwLDExNCw2OCwwLDEyNCwwLDAsCi0gICAgMTAwLDMsMCwyNSwxMjUsMSwwLDEwMCw0LDAsMTI0LDAsMCwxMDcsNywwLAotICAgIDExNCw2OCwwLDEyNCwxLDAsMTA2LDEsMCwxMDAsNSwwLDEzMSwxLDAsMTAwLAotICAgIDYsMCwyNSwxMjUsMSwwLDEyNCwxLDAsODMsNDEsNywxMjIsMTY3LDY3LDk3LAotICAgIDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMzIsMTE5LDEwNCw5NywxMTYsMzIsOTUsOTUsMTEyLAotICAgIDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLAotICAgIDk4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NSw5NSwxMTIsOTcsOTksMTA3LDk3LAotICAgIDEwMywxMDEsOTUsOTUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwxMDMsMTE3LDk3LDExNCwKLSAgICA5NywxMTAsMTE2LDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLDEwMCwxMDEsMTAyLAotICAgIDEwNSwxMTAsMTAxLDEwMCwzMiwxMTEsMTE0LDMyLDk5LDExMSwxMTcsMTA4LDEwMCwzMiw5OCwxMDEsCi0gICAgMzIsMTE1LDEwMSwxMTYsMzIsMTE2LDExMSwzMiw3OCwxMTEsMTEwLDEwMSwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMTYsMTExLDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsMTE2LDMyLDExNiwxMDQsCi0gICAgOTcsMTE2LDMyLDEwNSwxMTYsMTE1LDMyLDExMiwxMTQsMTExLDExMiwxMDEsMTE0LDMyLDExOCw5NywKLSAgICAxMDgsMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDExNywxMTAsMTA3LDExMCwxMTEsMTE5LDExMCw0NiwxMCwKLSAgICAxMCwzMiwzMiwzMiwzMiwxMTQsMTM0LDAsMCwwLDc4LDExNCwxLDAsMCwwLAotICAgIDExNCwxMzEsMCwwLDAsMTE0LDEyMSwwLDAsMCwxMTQsMzMsMCwwLDAsNDEsCi0gICAgMiwxMTQsNDIsMCwwLDAsMTE0LDEyMiwwLDAsMCw0MSwyLDIxOCw3LDEwMywKLSAgICAxMDgsMTExLDk4LDk3LDEwOCwxMTUsMTE0LDE2OSwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTcsOTUsOTksOTcsMTA4LAotICAgIDk5LDk1LDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSw5NSw0LDQsMCwKLSAgICAwLDExNSwxMiwwLDAsMCwwLDcsMTUsMSwxMiwxLDEwLDEsMTIsMSwKLSAgICAxOSwxLDExNCwxOTYsMCwwLDAsOTksNSwwLDAsMCwwLDAsMCwwLAotICAgIDksMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsMjI3LDAsMCwKLSAgICAwLDEyNCw0LDAsMTAwLDEsMCwxMDcsMiwwLDExNCwyNywwLDExNiwwLDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDEyNSw1LDAsMTEwLDU0LDAsMTI0LDEsMCwxMDAsCi0gICAgMiwwLDEwNyw5LDAsMTE0LDQ1LDAsMTI0LDEsMCwxMTAsMywwLDEwNSwwLAotICAgIDAsMTI1LDYsMCwxMTYsMSwwLDEyNCw2LDAsMTMxLDEsMCwxMjUsNywwLAotICAgIDExNiwwLDAsMTI0LDAsMCwxMjQsNywwLDEyNCw0LDAsMTMxLDMsMCwxMjUsCi0gICAgNSwwLDEyNCwzLDAsMTE1LDIwNywwLDEyNCw0LDAsMTAwLDEsMCwxMDcsMiwKLSAgICAwLDExNCwxMjIsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDIsMCwxMDAsMywwLAotICAgIDEzMSwxLDAsMTAwLDEsMCwyNSwxMzEsMSwwLDgzLDEyNCwwLDAsMTE1LDEzMiwKLSAgICAwLDEyNCw1LDAsODMsMTE2LDMsMCwxMjQsMCwwLDEzMSwxLDAsMTE2LDMsCi0gICAgMCwxMjQsMCwwLDEwNiwyLDAsMTAwLDMsMCwxMzEsMSwwLDEwMCwxLDAsCi0gICAgMjUsMTMxLDEsMCwyNCwxMjUsOCwwLDExNiw0LDAsMTA2LDUsMCwxMjQsNSwKLSAgICAwLDEwNiw2LDAsMTAwLDIsMCwxMTYsMywwLDEyNCw1LDAsMTA2LDYsMCwKLSAgICAxMzEsMSwwLDEyNCw4LDAsMjQsMTMzLDIsMCwyNSwyNSw4MywxMTAsMTYsMCwKLSAgICAxMTYsNywwLDEyNCw1LDAsMTI0LDMsMCwxMTYsMCwwLDEzMSwzLDAsODMsCi0gICAgMTAwLDIsMCw4Myw0MSw0LDk3LDIxNSwxLDAsMCw3MywxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLAotICAgIDMyLDg0LDEwNCwxMDEsMzIsMzksMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDExNSwzOSwzMiw5NywKLSAgICAxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTA1LDExNSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsCi0gICAgMTE2LDExMSwzMiwxMDUsMTEwLDEwMiwxMDEsMTE0LDMyLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA1LDExNSwzMiwxMTEsOTksOTksCi0gICAgMTE3LDExNCwxMTQsMTA1LDExMCwxMDMsMzIsMTAyLDExNCwxMTEsMTA5LDEwLDMyLDMyLDMyLDMyLAotICAgIDExNiwxMTEsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSwzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LAotICAgIDExOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTE1LDQ2LDMyLDg0LDEwNCwxMDEsMzIsCi0gICAgMzksMTA4LDExMSw5OSw5NywxMDgsMTE1LDM5LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLAotICAgIDExNiwzMiwxMDUsMTE1LDMyLDEwNSwxMDMsMTEwLDExMSwxMTQsMTAxLDEwMCw0NiwzMiw4NCwxMDQsCi0gICAgMTAxLDEwLDMyLDMyLDMyLDMyLDM5LDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsMzksCi0gICAgMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsCi0gICAgMTA1LDEwMSwxMTUsMzIsMTE5LDEwNCw5NywxMTYsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsCi0gICAgMTAxLDEyMCwxMDUsMTE1LDExNiwzMiw5NywxMTUsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LDExNywKLSAgICAxMTYsMTAxLDExNSwzMiwxMTEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDEwLDMyLDMyLDMyLDMyLDk4LDEwMSwxMDUsMTEwLDEwMywzMiwxMDUsMTA5LDExMiwxMTEsCi0gICAgMTE0LDExNiwxMDEsMTAwLDMyLDQwLDEwMSw0NiwxMDMsNDYsMzIsOTYsOTYsMTAyLDExNCwxMTEsCi0gICAgMTA5LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLAotICAgIDYwLDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsNjIsOTYsOTYsNDEsNDYsMzIsMzIsCi0gICAgODQsMTA0LDEwMSwzMiwzOSwxMDgsMTAxLDExOCwxMDEsMTA4LDM5LDEwLDMyLDMyLDMyLDMyLAotICAgIDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsCi0gICAgMTEwLDExNiwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLAotICAgIDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExNiwxMTEsMzIsMTA1LDEwOSwxMTIsMTExLAotICAgIDExNCwxMTYsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEwNSwxMTAsMzIsOTcsMzIsMTE0LDEwMSwxMDgsCi0gICAgOTcsMTE2LDEwNSwxMTgsMTAxLDEwLDMyLDMyLDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAotICAgIDMyLDQwLDEwMSw0NiwxMDMsNDYsMzIsOTYsOTYsMTAyLDExNCwxMTEsMTA5LDMyLDQ2LDQ2LAotICAgIDExMiwxMDcsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOSwxMTEsMTAwLDk2LDk2LAotICAgIDMyLDExOSwxMTEsMTE3LDEwOCwxMDAsMzIsMTA0LDk3LDExOCwxMDEsMzIsOTcsMzIsMzksMTA4LAotICAgIDEwMSwxMTgsMTAxLDEwOCwzOSwzMiwxMTEsMTAyLDMyLDUwLDQxLDQ2LDEwLDEwLDMyLDMyLAotICAgIDMyLDMyLDExNCwzMywwLDAsMCw3OCwxMTQsMTIxLDAsMCwwLDQxLDgsMTE0LAotICAgIDE4NiwwLDAsMCwxMTQsMTk2LDAsMCwwLDIxOCw5LDExMiw5NywxMTQsMTE2LDEwNSwKLSAgICAxMTYsMTA1LDExMSwxMTAsMTE0LDE2NywwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLAotICAgIDAsMCwwLDExNCwxLDAsMCwwLDExNCwxOTQsMCwwLDAsNDEsOSwxMTQsCi0gICAgMTUsMCwwLDAsMTE0LDE5NSwwLDAsMCwyMTgsNiwxMDgsMTExLDk5LDk3LDEwOCwKLSAgICAxMTUsMTE0LDE5MiwwLDAsMCwxMTQsMTcwLDAsMCwwLDExNCw4OSwwLDAsMCwKLSAgICA5MCw4LDEwMywxMDgsMTExLDk4LDk3LDEwOCwxMTUsOTUsMTE0LDE2OSwwLDAsMCw5MCwKLSAgICA3LDk5LDExNywxMTYsOTUsMTExLDEwMiwxMDIsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEwLDk1LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDk1LDk1LDE5LDQsMCwwLDExNSwyNiwwLDAsMCwwLDExLDEyLDEsCi0gICAgMTUsMiwyNCwxLDEyLDEsMTgsMSw2LDMsMTIsMSwyMywxLDYsMSwKLSAgICA0LDQsMzUsMyw0MCwyLDExNCwxOTksMCwwLDAsOTksMSwwLDAsMCwKLSAgICAwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsNTMsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwwLDAsMTMxLDEsCi0gICAgMCwxMjUsMSwwLDEyNCwxLDAsMTAwLDAsMCwxMDcsOCwwLDExNCw0MywwLAotICAgIDExNiwyLDAsMTAwLDEsMCwxMjQsMCwwLDIzLDEzMSwxLDAsMTMwLDEsMCwKLSAgICAxMTYsMywwLDEyNCwxLDAsMTMxLDEsMCw4Myw0MSwyLDc4LDEyMiwyNSwxMTAsCi0gICAgMTExLDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDMyLDExMCw5NywxMDksMTAxLDEwMCwzMiw0MSw0LDExNCwxNTAsMCwwLDAsMTE0LAotICAgIDE1NCwwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDE0OSwwLDAsMCw0MSwyLAotICAgIDExNCwxNSwwLDAsMCwxMTQsODgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE4LDk1LDk4LDExNywxMDUsMTA4LAotICAgIDExNiwxMDUsMTEwLDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMTAsOTcsMTA5LDEwMSw1NCw0LDAsCi0gICAgMCwxMTUsOCwwLDAsMCwwLDEsMTUsMSwxMiwxLDE2LDEsMTE0LDIwMCwKLSAgICAwLDAsMCw5OSwyLDAsMCwwLDAsMCwwLDAsMTIsMCwwLDAsCi0gICAgMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDc0LDEsMCwwLDEyNCwxLDAsCi0gICAgOTcsMCwwLDEyNCwwLDAsOTcsMSwwLDExNiwyLDAsMTE2LDEsMCwxMzEsCi0gICAgMSwwLDEyNSwyLDAsMTIwLDEyMywwLDExNiwxLDAsMTA2LDMsMCwxMDYsNCwKLSAgICAwLDEzMSwwLDAsNjgsOTMsMTA2LDAsOTIsMiwwLDEyNSwzLDAsMTI1LDQsCi0gICAgMCwxMTYsNSwwLDEyNCw0LDAsMTI0LDIsMCwxMzEsMiwwLDExNCw0MCwwLAotICAgIDEyNCwzLDAsMTE2LDEsMCwxMDYsNiwwLDEwNyw2LDAsMTE0LDkxLDAsMTE2LAotICAgIDcsMCwxMjUsNSwwLDExMCwyNywwLDExNiwwLDAsMTA2LDgsMCwxMjQsMywKLSAgICAwLDEzMSwxLDAsMTE0LDQwLDAsMTE2LDksMCwxMjUsNSwwLDExMCwzLDAsCi0gICAgMTEzLDQwLDAsMTE2LDEwLDAsMTI0LDQsMCwxMjQsNSwwLDEzMSwyLDAsMTI1LAotICAgIDYsMCwxMTYsMTEsMCwxMjQsNiwwLDEyNCw0LDAsMTMxLDIsMCwxLDExMywKLSAgICA0MCwwLDg3LDExNiwxLDAsMTA2LDMsMCwxMTYsMTIsMCwyNSwxMjUsNywwLAotICAgIDEyMCw3MywwLDEwMCw1LDAsNjgsOTMsNjUsMCwxMjUsOCwwLDEyNCw4LDAsCi0gICAgMTE2LDEsMCwxMDYsMywwLDEwNyw3LDAsMTE0LDIwNiwwLDExNiwxMywwLDEyNCwKLSAgICA4LDAsMTMxLDEsMCwxMjUsOSwwLDExMCwxMywwLDExNiwxLDAsMTA2LDMsCi0gICAgMCwxMjQsOCwwLDI1LDEyNSw5LDAsMTE2LDE0LDAsMTI0LDcsMCwxMjQsOCwKLSAgICAwLDEyNCw5LDAsMTMxLDMsMCwxLDExMywxNzAsMCw4NywxMjEsMTYsMCwxMTYsCi0gICAgMTMsMCwxMDAsMiwwLDEzMSwxLDAsMTI1LDEwLDAsODcsMTEwLDI0LDAsNCwKLSAgICAxMTYsMTUsMCwxMDcsMTAsMCwxMTQsMjUsMSwxLDEsMSwxMDAsMywwLDEyNSwKLSAgICAxMCwwLDg5LDExMCwxLDAsODgsMTE2LDE0LDAsMTI0LDcsMCwxMDAsMiwwLAotICAgIDEyNCwxMCwwLDEzMSwzLDAsMSwxMTYsMTMsMCwxMDAsNCwwLDEzMSwxLDAsCi0gICAgMTI1LDExLDAsMTE2LDE0LDAsMTI0LDcsMCwxMDAsNCwwLDEyNCwxMSwwLDEzMSwKLSAgICAzLDAsMSwxMDAsMywwLDgzLDQxLDYsMTIyLDI1MCw4MywxMDEsMTE2LDExNywxMTIsCi0gICAgMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5OCwxMjEsMzIsMTA1LDEwOSwKLSAgICAxMTIsMTExLDExNCwxMTYsMTA1LDExMCwxMDMsMzIsMTEwLDEwMSwxMDEsMTAwLDEwMSwxMDAsMzIsOTgsCi0gICAgMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLAotICAgIDk3LDExMCwxMDAsMzIsMTA1LDExMCwxMDYsMTAxLDk5LDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LAotICAgIDEwMSwxMDksMTAsMzIsMzIsMzIsMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDEwMywxMDgsMTExLDk4LDk3LDEwOCwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKLSAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw2NSwxMTUsMzIsMTE1LDEyMSwxMTUsMzIsMTA1LDExNSwKLSAgICAzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiwxMDIsMTExLDExNCwzMiwxMTUsMTIxLDExNSw0NiwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsOTksOTksMTAxLDExNSwxMTUsMzIsOTcsCi0gICAgMTEwLDEwMCwzMiw5NSwxMDUsMTA5LDExMiwzMiwxMDUsMTE1LDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsCi0gICAgMTAwLDMyLDExNiwxMTEsMzIsMTA4LDExMSw5NywxMDAsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LAotICAgIDEwNSwxMTAsMTAsMzIsMzIsMzIsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ0LDMyLAotICAgIDExNiwxMDQsMTExLDExNSwxMDEsMzIsMTE2LDExOSwxMTEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE1LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsMTAxLDEyMCwxMTIsMTA4LDEwNSw5OSwKLSAgICAxMDUsMTE2LDEwOCwxMjEsMzIsMTEyLDk3LDExNSwxMTUsMTAxLDEwMCwzMiwxMDUsMTEwLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDExNCwxNDEsMCwwLDAsMTE0LDM0LDAsMCwwLDc4LAotICAgIDExNCw2MiwwLDAsMCw0MSwxLDEyMiw5LDk1LDExOSw5NywxMTQsMTEwLDEwNSwxMTAsCi0gICAgMTAzLDExNSw0MSwxNiwxMTQsNTcsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwxMywKLSAgICAwLDAsMCwxMTQsMjEsMCwwLDAsMjE4LDUsMTA1LDExNiwxMDEsMTA5LDExNSwxMTQsCi0gICAgMTc3LDAsMCwwLDExNCw3NiwwLDAsMCwxMTQsMTUwLDAsMCwwLDExNCw4MiwKLSAgICAwLDAsMCwxMTQsMTYwLDAsMCwwLDExNCwxMzIsMCwwLDAsMTE0LDEzNywwLAotICAgIDAsMCwxMTQsMSwwLDAsMCwxMTQsMjAwLDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDExNCw3NywwLDAsMCw0MSwxMiwyMTgsMTAsMTE1LDEyMSwxMTUsOTUsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMjE4LDExLDk1LDEwNSwxMDksMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDkwLDExLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNiwxMjEsMTEyLDEwMSwxMTQsMTUsCi0gICAgMCwwLDAsMTE0LDg5LDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsODgsMCwKLSAgICAwLDAsOTAsMTEsMTE1LDEwMSwxMDgsMTAyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLAotICAgIDEyLDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExMCw5NywxMDksMTAxLDkwLDE0LDk4LAotICAgIDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEzLDExNiwKLSAgICAxMDQsMTE0LDEwMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTQsMTE5LDEwMSwKLSAgICA5NywxMDcsMTE0LDEwMSwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDYsOTUsMTE1LDEwMSwKLSAgICAxMTYsMTE3LDExMiw2MSw0LDAsMCwxMTUsNTAsMCwwLDAsMCw5LDYsMSwKLSAgICA2LDMsMTIsMSwyOCwxLDE1LDEsMTUsMSw5LDEsMTUsMSw5LDIsCi0gICAgMywxLDE1LDEsMTcsMywxMywxLDEzLDEsMTUsMSwxNSwyLDEzLDEsCi0gICAgMjAsMywzLDEsMTYsMSwxMywyLDExLDEsMTYsMywxMiwxLDExNCwyMDQsCi0gICAgMCwwLDAsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsCi0gICAgMywwLDAsMCw2NywwLDAsMCwxMTUsODcsMCwwLDAsMTE2LDAsMCwKLSAgICAxMjQsMCwwLDEyNCwxLDAsMTMxLDIsMCwxLDExNiwxLDAsMTA2LDIsMCwKLSAgICAxMDYsMywwLDExNiw0LDAsMTMxLDEsMCwxLDExNiwxLDAsMTA2LDIsMCwKLSAgICAxMDYsMywwLDExNiw1LDAsMTMxLDEsMCwxLDEwMCwxLDAsMTAwLDIsMCwKLSAgICAxMDgsNiwwLDEyNSwyLDAsMTI0LDIsMCw5Nyw3LDAsMTI0LDIsMCwxMDYsCi0gICAgOCwwLDExNiwxLDAsMTA2LDksMCwxMTYsMTAsMCwyNSwxMzEsMSwwLDEsCi0gICAgMTAwLDIsMCw4Myw0MSwzLDEyMiw1MCw3MywxMTAsMTE1LDExNiw5NywxMDgsMTA4LDMyLAotICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwKLSAgICAxMTEsMTAyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDExNCwzMywwLDAsMCw3OCwKLSAgICA0MSwxMSwxMTQsMjA0LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMTc0LDAsMCwKLSAgICAwLDExNCwxMTMsMCwwLDAsMTE0LDE1MCwwLDAsMCwxMTQsMTYwLDAsMCwwLAotICAgIDIxOCwyNiw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKLSAgICAxMDgsMTA1LDk4LDk1LDEwMSwxMjAsMTE2LDEwMSwxMTQsMTEwLDk3LDEwOCwxMTQsMTE5LDAsMCwKLSAgICAwLDIxOCw4LDk1LDEwNSwxMTAsMTE1LDExNiw5NywxMDgsMTA4LDExNCwyMSwwLDAsMCwKLSAgICAxMTQsMSwwLDAsMCw0MSwzLDExNCwyMDIsMCwwLDAsMTE0LDIwMywwLDAsCi0gICAgMCwxMTQsMjA1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDExLDAsMCwwLDExNCwyMDYsMCwwLDAsMTA4LDQsMCwwLDExNSwxMiwKLSAgICAwLDAsMCwwLDIsMTMsMiwxNiwxLDE2LDMsMTIsMSw2LDEsMTE0LAotICAgIDIwNiwwLDAsMCw0MSw1MSwxMTQsMywwLDAsMCwxMTQsMTE5LDAsMCwwLAotICAgIDExNCwxMiwwLDAsMCwxMTQsMTYsMCwwLDAsMTE0LDE3LDAsMCwwLDExNCwKLSAgICA1OSwwLDAsMCwxMTQsNDEsMCwwLDAsMTE0LDQ4LDAsMCwwLDExNCwzMSwKLSAgICAwLDAsMCwxMTQsMzIsMCwwLDAsMTE0LDUzLDAsMCwwLDExNCw1NCwwLAotICAgIDAsMCwxMTQsNTYsMCwwLDAsMTE0LDYzLDAsMCwwLDExNCw2NSwwLDAsCi0gICAgMCwxMTQsNzUsMCwwLDAsMTE0LDgxLDAsMCwwLDExNCw4NCwwLDAsMCwKLSAgICAxMTQsOTAsMCwwLDAsMTE0LDEwMSwwLDAsMCwxMTQsMTAyLDAsMCwwLDExNCwKLSAgICAxMDYsMCwwLDAsMTE0LDg1LDAsMCwwLDIxOCw2LDExMSw5OCwxMDYsMTAxLDk5LAotICAgIDExNiw5MCw5LDk1LDgwLDc5LDgwLDg1LDc2LDY1LDg0LDY5LDExNCwxMzIsMCwwLAotICAgIDAsMTE0LDEzNywwLDAsMCwxMTQsMTQ0LDAsMCwwLDExNCw5NywwLDAsMCwKLSAgICAxMTQsODYsMCwwLDAsMTE0LDE0OCwwLDAsMCwxMTQsMTQ5LDAsMCwwLDExNCwKLSAgICA4NywwLDAsMCwxMTQsMTUwLDAsMCwwLDExNCwxNjAsMCwwLDAsMTE0LDE2NSwKLSAgICAwLDAsMCwxMTQsMTcxLDAsMCwwLDExNCwxNzMsMCwwLDAsMTE0LDE3NiwwLAotICAgIDAsMCwxMTQsMTgxLDAsMCwwLDExNCwxOTEsMCwwLDAsMTE0LDE4MiwwLDAsCi0gICAgMCwxMTQsMTg0LDAsMCwwLDExNCwxODUsMCwwLDAsMTE0LDE4NiwwLDAsMCwKLSAgICAxMTQsMTk0LDAsMCwwLDExNCwxOTYsMCwwLDAsMTE0LDE5OSwwLDAsMCwxMTQsCi0gICAgMjAwLDAsMCwwLDExNCwyMDQsMCwwLDAsMTE0LDIwNiwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwKLSAgICAwLDAsMjE4LDgsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNjIsOCwwLDAsMCwKLSAgICAxMTUsOTYsMCwwLDAsNiwxNyw2LDIsMTIsOCwxMiw0LDE5LDIwLDYsCi0gICAgMiw2LDMsMjIsNCwxOSw2OCwxOSwyMSwxOSwxOSwxMiwxOSwxMiwxOSwxMiwKLSAgICAxMSwxOCw4LDEyLDExLDEyLDEyLDEyLDE2LDEyLDM2LDE5LDI3LDE5LDEwMSwyNCwKLSAgICAyNiw5LDMsMTgsNDUsMTgsNjAsMTIsMTgsMTIsMTcsMTIsMjUsMTIsMjksMTIsCi0gICAgMjMsMTIsMTYsMTksNzMsMTksNzcsMTksMTMsMTIsOSwxMiw5LDE1LDQwLDEyLAotICAgIDE3LDYsMSwxMCwyLDEyLDI3LDEyLDYsMTgsMjQsMTIsMzIsMTIsMTUsMjQsCi0gICAgMzUsMTIsNywxMiw0NywKKyAgICA5OSwxMDQsMTAxLDk5LDEwNywxNDAsMywwLDAsMTE1LDI4LDAsMCwwLDAsMiwKKyAgICAxMCwxLDE4LDEsOCwxLDgsMSw4LDEsMTAsMSwxMCwxLDQsMSwKKyAgICAxMCwyLDEwLDEsNCwyLDE0LDEsMTQsMSwxMTQsMTc1LDAsMCwwLDEyMiwKKyAgICAxNiw3OCwxMTEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAwLAorICAgIDMyLDEyMiw0LDEyMywzMywxMTQsMTI1LDk5LDIsMCwwLDAsMCwwLDAsMCwKKyAgICA4LDAsMCwwLDEyLDAsMCwwLDY3LDAsMCwwLDExNSwyMjAsMCwwLAorICAgIDAsMTAwLDAsMTI1LDIsMTI0LDAsMTA2LDAsMTAwLDEsMTMxLDEsMTAwLDIsMjUsCisgICAgMCwxMjUsMywxMjQsMywxMTQsMTM0LDEyNCwzLDExNiwxLDEwNiwyLDEwNyw3LDExNCwKKyAgICA0MiwxMTYsMywxMjQsMSwxMjQsMywxMzEsMiwxLDAsMTI0LDAsMTE2LDEsMTA2LAorICAgIDIsMTA3LDYsMTE0LDYyLDExNiwxLDEwNiwyLDEyNCwwLDI1LDAsODMsMCwxMTYsCisgICAgMSwxMDYsMiwxMjQsMywyNSwwLDEyNSw0LDEyMSwxMCwxMjQsNCwxMDYsNCwxMjUsCisgICAgMiw4NywwLDExMCw1MCw0LDAsMTE2LDUsMTA3LDEwLDExNCwxMzIsMSwwLDEsCisgICAgMCwxLDAsMTE2LDYsMTAwLDMsMjMsMCwxMDYsNywxMjQsMCwxMjQsMywxMzEsCisgICAgMiwxMjUsNSwxMTYsOCwxMjQsNSwxMjQsMCwxMDAsNCwxNDEsMiwxMDAsMCwxMzAsCisgICAgMiw4OSwwLDExMCwyLDg4LDAsMTE2LDksMTI0LDAsMTI0LDIsMTMxLDIsMTI1LAorICAgIDYsMTI0LDYsMTAwLDAsMTA3LDgsMTE0LDE3MiwxMTYsOCwxMTYsNiwxMDYsNywxMjQsCisgICAgMCwxMzEsMSwxMjQsMCwxMDAsNCwxNDEsMiwxMzAsMSwxMTAsOCwxMTYsMTAsMTI0LAorICAgIDYsMTMxLDEsMTI1LDcsMTI0LDMsMTE0LDIxNiwxMTYsMSwxMDYsMiwxMjQsMywyNSwKKyAgICAwLDEyNSw0LDExNiwxMSwxMjQsNCwxMjQsMCwxMDYsMCwxMDAsMSwxMzEsMSwxMDAsCisgICAgNSwyNSwwLDEyNCw3LDEzMSwzLDEsMCwxMjQsNyw4MywwLDQxLDYsNzgsCisgICAgMTE0LDExNywwLDAsMCwxMTQsMTksMCwwLDAsMTIyLDIzLDU5LDMyLDEyMywzMywKKyAgICAxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMzIsMTEyLDk3LDk5LDEwNywKKyAgICA5NywxMDMsMTAxLDQxLDEsMTE0LDE1LDAsMCwwLDIzMywyLDAsMCwwLDQxLAorICAgIDEyLDExNCwxMTgsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCw3OSwwLDAsMCwKKyAgICAxMTQsNTgsMCwwLDAsMTE0LDEyNywwLDAsMCwxMTQsOTAsMCwwLDAsMjE4LAorICAgIDgsOTUsNjksODIsODIsOTUsNzcsODMsNzEsMTE0LDM4LDAsMCwwLDIxOCwxOSwKKyAgICA3NywxMTEsMTAwLDExNywxMDgsMTAxLDc4LDExMSwxMTYsNzAsMTExLDExNywxMTAsMTAwLDY5LDExNCwKKyAgICAxMTQsMTExLDExNCwxMTQsMTcwLDAsMCwwLDExNCwxNDEsMCwwLDAsMTE0LDUsMCwKKyAgICAwLDAsNDEsOCwxMTQsMTUsMCwwLDAsMjE4LDcsMTA1LDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsOTUsMTE0LDE0NCwwLDAsMCwxMTQsMTE5LDAsMCwwLDkwLDEzLDExMiw5NywKKyAgICAxMTQsMTAxLDExMCwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDEzOSwwLDAsMCwKKyAgICAxMTQsODIsMCwwLDAsMTE0LDgzLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwyMyw5NSwxMDIsMTA1LDExMCwxMDAsCisgICAgOTUsOTcsMTEwLDEwMCw5NSwxMDgsMTExLDk3LDEwMCw5NSwxMTcsMTEwLDEwOCwxMTEsOTksMTA3LAorICAgIDEwMSwxMDAsMTYzLDMsMCwwLDExNSw0MiwwLDAsMCwwLDEsNCwxLDE0LAorICAgIDEsNCwxLDEwLDEsMTAsMiwxMCwxLDEwLDEsMTAsMSwyLDEsMTAsCisgICAgMSwxNCwxLDE2LDEsMjAsMSwxMCwxLDgsMSwyMCwyLDgsMSw0LAorICAgIDIsMTAsMSwyMiwxLDExNCwxODAsMCwwLDAsOTksMiwwLDAsMCwwLAorICAgIDAsMCwwLDIsMCwwLDAsMTAsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDMwLDAsMCwwLDExNiwwLDEyNCwwLDEzMSwxLDE0MywxMiwxLDAsMTE2LDEsCisgICAgMTI0LDAsMTI0LDEsMTMxLDIsODMsMCw4MSwwLDgyLDAsODgsMCwxMDAsMSwKKyAgICA4MywwLDQxLDIsMTIyLDU0LDcwLDEwNSwxMTAsMTAwLDMyLDk3LDExMCwxMDAsMzIsMTA4LAorICAgIDExMSw5NywxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsCisgICAgOTcsMTEwLDEwMCwzMiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNyw0Niw3OCw0MSwyLDExNCwKKyAgICA0MiwwLDAsMCwxMTQsMTgwLDAsMCwwLDQxLDIsMTE0LDE1LDAsMCwwLAorICAgIDExNCwxNzksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMjE4LDE0LDk1LDEwMiwxMDUsMTEwLDEwMCw5NSw5NywxMTAsMTAwLDk1LAorICAgIDEwOCwxMTEsOTcsMTAwLDE5MCwzLDAsMCwxMTUsNCwwLDAsMCwwLDIsMTAsCisgICAgMSwxMTQsMTgxLDAsMCwwLDExNCwxOSwwLDAsMCw5OSwzLDAsMCwwLAorICAgIDAsMCwwLDAsNSwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSwxMjAsMCwwLDAsMTE2LDAsMTI0LDAsMTI0LDEsMTI0LDIsMTMxLDMsMSwKKyAgICAwLDEyNCwyLDEwMCwxLDEwNyw0LDExNCwzMiwxMTYsMSwxMjQsMCwxMjQsMSwxMjQsCisgICAgMiwxMzEsMywxMjUsMCwxMTYsMiwxMDYsMywxMzEsMCwxLDAsMTI0LDAsMTE2LAorICAgIDQsMTA2LDUsMTA3LDcsMTE0LDYwLDExNiw2LDEyNCwwLDExNiw3LDEzMSwyLDgzLAorICAgIDAsMTE2LDQsMTA2LDUsMTI0LDAsMjUsMCwxMjUsMywxMjQsMywxMDAsMiwxMDcsCisgICAgOCwxMTQsMTA4LDExNiwyLDEwNiw4LDEzMSwwLDEsMCwxMDAsMywxMDYsOSwxMjQsCisgICAgMCwxMzEsMSwxMjUsNCwxMTYsMTAsMTI0LDQsMTI0LDAsMTAwLDQsMTQxLDIsMTMwLAorICAgIDEsMTE2LDExLDEyNCwwLDEzMSwxLDEsMCwxMjQsMyw4MywwLDQxLDUsOTcsCisgICAgNTAsMSwwLDAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwzMiw5NywxMTAsMTAwLDMyLDExNCwKKyAgICAxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDMyLDk4LDk3LDExNSwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTA1LDExNiwxMTUsMzIsMTEwLDk3LAorICAgIDEwOSwxMDEsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMzIsMTA1LDExNSwxMCwzMiwzMiwzMiwzMiwKKyAgICA5OCwxMDEsMTA1LDExMCwxMDMsMzIsMTA5LDk3LDEwMCwxMDEsMzIsMTAyLDExNCwxMTEsMTA5LDQ0LAorICAgIDMyLDk3LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiw5NywKKyAgICAxMDAsMTA2LDExNywxMTUsMTE2LDEwOSwxMDEsMTEwLDExNiw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICA4NCwxMDQsMTA1LDExNSwzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTE0LDEwMSwKKyAgICAxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwMywxMTQsMTAxLAorICAgIDk3LDExNiwxMDEsMTE1LDExNiwzMiw5OSwxMTEsMTA5LDEwOSwxMTEsMTEwLDMyLDEwMCwxMDEsMTEwLAorICAgIDExMSwxMDksMTA1LDExMCw5NywxMTYsMTExLDExNCwzMiwxMTEsMTAyLDMyLDEwMiwxMTcsMTEwLDk5LAorICAgIDExNiwxMDUsMTExLDExMCw5NywxMDgsMTA1LDExNiwxMjEsMTAsMzIsMzIsMzIsMzIsOTgsMTAxLAorICAgIDExNiwxMTksMTAxLDEwMSwxMTAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsMzIsOTcsMTEwLDEwMCwzMiw5NSw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICA5NSw5NSw0NiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDUsMTEwLDk5LDEwOCwxMTcsMTAwLDEwMSwKKyAgICAxMTUsMzIsMTE1LDEwMSwxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDk1LDk1LDExMiw5Nyw5OSwxMDcsCisgICAgOTcsMTAzLDEwMSw5NSw5NSwzMiwxMDUsMTAyLDEwLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTAwLDEwNSwxMDAsMzIsMTEwLDExMSwxMTYsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsMTE0LDE5LDAsMCwwLDc4LDEyMiw0MCwxMDUsMTA5LAorICAgIDExMiwxMTEsMTE0LDExNiwzMiwxMTEsMTAyLDMyLDEyMywxMjUsMzIsMTA0LDk3LDEwOCwxMTYsMTAxLAorICAgIDEwMCw1OSwzMiw3OCwxMTEsMTEwLDEwMSwzMiwxMDUsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0MSwxLDExNCwxNSwwLDAsMCw0MSwxMiwxMTQsCisgICAgMTc1LDAsMCwwLDExNCwxNjMsMCwwLDAsMTE0LDQ2LDAsMCwwLDExNCwxMzcsCisgICAgMCwwLDAsMTE0LDE0LDAsMCwwLDExNCw3OSwwLDAsMCwxMTQsMTgxLDAsCisgICAgMCwwLDIxOCwxMSw5NSwxMDMsOTksMTAwLDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDExNCwKKyAgICA0NywwLDAsMCwxMTQsMzgsMCwwLDAsMTE0LDE3OCwwLDAsMCwxMTQsNTYsCisgICAgMCwwLDAsNDEsNSwxMTQsMTUsMCwwLDAsMTE0LDE2MSwwLDAsMCwxMTQsCisgICAgMTYyLDAsMCwwLDExNCw4MywwLDAsMCwxMTQsNjcsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE4MiwwLAorICAgIDAsMCwxOTYsMywwLDAsMTE1LDI4LDAsMCwwLDAsOSwxMiwxLDgsCisgICAgMSwxMiwxLDgsMSwxMCwxLDEwLDEsMTAsMSw4LDEsOCwxLDQsCisgICAgMSw2LDEsMTIsMSw4LDEsMTE0LDE4MiwwLDAsMCw5OSwzLDAsMCwKKyAgICAwLDAsMCwwLDAsNiwwLDAsMCwxNywwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsMTY0LDAsMCwwLDExNiwwLDEyNCwwLDEwMCwxLDEzMSwyLDExNCwxNjAsCisgICAgMTAwLDIsMTI0LDEsMTA3LDYsMTE0LDU4LDExNiwxLDEyNCwxLDEzMSwxLDEyNSwxLAorICAgIDEyNCwxLDEwNiwyLDEwMCwyLDEzMSwxLDEsMCwxMTYsMCwxMjQsMCwxMDAsMywKKyAgICAxMzEsMiwxMTQsNTgsMTI0LDEsMTA2LDMsMTI0LDAsMTA2LDQsMTMxLDEsMSwwLAorICAgIDEyMCwxMDAsMTI0LDEsNjgsMCw5Myw5MiwxMjUsMywxMTYsMCwxMjQsMCwxMjQsMywKKyAgICAxMzEsMiwxMTUsNjQsMTAwLDQsMTA2LDUsMTI0LDAsMTA2LDYsMTI0LDMsMTMxLDIsCisgICAgMTI1LDQsMTIxLDE0LDExNiw3LDEyNCwyLDEyNCw0LDEzMSwyLDEsMCw4NywwLAorICAgIDExMyw2NCw0LDAsMTE2LDgsMTA3LDEwLDExNCwxNTQsMSwwLDEyNSw1LDEsMCwKKyAgICAxMjIsMjAsMTI0LDUsMTA2LDksMTI0LDQsMTA3LDIsMTE0LDEzNiwxMTksNjQsMTMwLDAsCisgICAgODcsMCw4OSwwLDEwMCw1LDEwMCw1LDEyNSw1LDEyNiw1LDg4LDAsMTEzLDY0LAorICAgIDg4LDAsMTEzLDY0LDg3LDAsMTI0LDAsODMsMCw0MSw2LDEyMiwyMzgsNzAsMTA1LAorICAgIDEwMywxMTcsMTE0LDEwMSwzMiwxMTEsMTE3LDExNiwzMiwxMTksMTA0LDk3LDExNiwzMiw5NSw5NSwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSw5NSwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwKKyAgICAxMTQsMTAxLDExNiwxMTcsMTE0LDExMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLAorICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDk1LDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwxMTYsCisgICAgMTAxLDExNCwzMiwxMDUsMTE1LDMyLDk3LDMyLDk5LDk3LDEwOCwxMDgsOTcsOTgsMTA4LDEwMSwKKyAgICAzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE2LDk3LDEwNywxMDEsMTE1LDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsCisgICAgMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwzMiw3MywKKyAgICAxMTYsMzIsMTA1LDExNSwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTAwLDMyLDExNiwxMTEsCisgICAgMzIsMTAwLDEwMSw5OSwxMTEsMTE3LDExMiwxMDgsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMTcsCisgICAgMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsOTcsMTE1LDExNSwxMTcsCisgICAgMTA5LDEwNSwxMTAsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzksMTE1LAorICAgIDEwLDMyLDMyLDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwNSwxMDksMTEyLDEwOCwKKyAgICAxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsCisgICAgMTE1LDEwNSwxMTQsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsMTI3LDAsMCwKKyAgICAwLDI1MCwxLDQyLDIxOCw3LDk1LDk1LDk3LDEwOCwxMDgsOTUsOTUsMTIyLDUsMTIzLAorICAgIDEyNSw0NiwxMjMsMTI1LDc4LDQxLDEwLDExNCw0LDAsMCwwLDExNCwxMjYsMCwwLAorICAgIDAsMjE4LDYsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMjE4LDYsMTAxLDEyMCwxMTYsMTAxLDExMCwKKyAgICAxMDAsMTE0LDE4NCwwLDAsMCwxMTQsMzgsMCwwLDAsMTE0LDEsMCwwLDAsCisgICAgMTE0LDU4LDAsMCwwLDExNCwxNzgsMCwwLDAsMTE0LDE1LDAsMCwwLDQxLAorICAgIDYsMTE0LDgzLDAsMCwwLDIxOCw4LDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsCisgICAgMTE0LDE3OSwwLDAsMCwyMTgsMSwxMjAsOTAsOSwxMDIsMTE0LDExMSwxMDksOTUsMTEwLAorICAgIDk3LDEwOSwxMDEsOTAsMywxMDEsMTIwLDk5LDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxNiw5NSwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLAorICAgIDk1LDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsMjIxLDMsMCwwLDExNSwzMiwwLAorICAgIDAsMCwwLDEwLDEwLDEsOCwxLDgsMSwxMCwxLDEwLDEsMTIsMSwKKyAgICAxMCwxLDEwLDEsMTQsMSwyLDEsMTQsMSwxNiw0LDEwLDEsMiwxLAorICAgIDI0LDEsMTE0LDE4OSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsCisgICAgMywwLDAsMCw2LDAsMCwwLDY3LDAsMCwwLDExNSwxNTAsMCwwLAorICAgIDAsMTI0LDAsMTA2LDAsMTAwLDEsMTMxLDEsMTI1LDEsMTI0LDAsMTA2LDAsMTAwLAorICAgIDIsMTMxLDEsMTI1LDIsMTI0LDEsMTAwLDMsMTA3LDksMTE0LDg0LDEyNCwyLDEwMCwKKyAgICAzLDEwNyw5LDExNCw3OCwxMjQsMSwxMjQsMiwxMDYsMSwxMDcsMywxMTQsNzgsMTE2LAorICAgIDIsMTA2LDMsMTAwLDQsMTI0LDEsMTU1LDIsMTAwLDUsMTI0LDIsMTA2LDEsMTU1LAorICAgIDIsMTAwLDYsMTU3LDUsMTE2LDQsMTAwLDcsMTAwLDgsMTQxLDMsMSwwLDEyNCwKKyAgICAxLDgzLDAsMTEwLDYyLDEyNCwyLDEwMCwzLDEwNyw5LDExNCwxMDAsMTI0LDIsMTA2LAorICAgIDEsODMsMCwxMTAsNDYsMTE2LDIsMTA2LDMsMTAwLDksMTE2LDQsMTAwLDcsMTAwLAorICAgIDgsMTQxLDMsMSwwLDEyNCwwLDEwMCwxMCwyNSwwLDEyNSwxLDEwMCwxMSwxMjQsCisgICAgMCwxMDcsNywxMTQsMTQ2LDEyNCwxLDEwNiw1LDEwMCwxMiwxMzEsMSwxMDAsMTMsMjUsCisgICAgMCwxMjUsMSwxMjQsMSw4MywwLDQxLDE0LDEyMiwxNjcsNjcsOTcsMTA4LDk5LDExNywKKyAgICAxMDgsOTcsMTE2LDEwMSwzMiwxMTksMTA0LDk3LDExNiwzMiw5NSw5NSwxMTIsOTcsOTksMTA3LAorICAgIDk3LDEwMywxMDEsOTUsOTUsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsOTgsMTAxLDQ2LAorICAgIDEwLDEwLDMyLDMyLDMyLDMyLDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSwKKyAgICA5NSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDEwMywxMTcsOTcsMTE0LDk3LDExMCwxMTYsCisgICAgMTAxLDEwMSwxMDAsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDEsCisgICAgMTAwLDMyLDExMSwxMTQsMzIsOTksMTExLDExNywxMDgsMTAwLDMyLDk4LDEwMSwzMiwxMTUsMTAxLAorICAgIDExNiwzMiwxMTYsMTExLDMyLDc4LDExMSwxMTAsMTAxLDEwLDMyLDMyLDMyLDMyLDExNiwxMTEsCisgICAgMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsMzIsMTE2LDEwNCw5NywxMTYsMzIsCisgICAgMTA1LDExNiwxMTUsMzIsMTEyLDExNCwxMTEsMTEyLDEwMSwxMTQsMzIsMTE4LDk3LDEwOCwxMTcsMTAxLAorICAgIDMyLDEwNSwxMTUsMzIsMTE3LDExMCwxMDcsMTEwLDExMSwxMTksMTEwLDQ2LDEwLDEwLDMyLDMyLAorICAgIDMyLDMyLDExNCwxMzAsMCwwLDAsMTE0LDg5LDAsMCwwLDc4LDEyMiwzMiw5NSwKKyAgICA5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsMzIsMzMsNjEsMzIsOTUsOTUsCisgICAgMTE1LDExMiwxMDEsOTksOTUsOTUsNDYsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwzMiw0MCwxMjIsCisgICAgNCwzMiwzMyw2MSwzMiwyNTAsMSw0MSwyMzMsMywwLDAsMCw0MSwxLDkwLAorICAgIDEwLDExNSwxMTYsOTcsOTksMTA3LDEwOCwxMDEsMTE4LDEwMSwxMDgsMTIyLDg5LDk5LDk3LDExMCwKKyAgICAzOSwxMTYsMzIsMTE0LDEwMSwxMTUsMTExLDEwOCwxMTgsMTAxLDMyLDExMiw5Nyw5OSwxMDcsOTcsCisgICAgMTAzLDEwMSwzMiwxMDIsMTE0LDExMSwxMDksMzIsOTUsOTUsMTE1LDExMiwxMDEsOTksOTUsOTUsCisgICAgMzIsMTExLDExNCwzMiw5NSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsNDQsCisgICAgMzIsMTAyLDk3LDEwOCwxMDgsMTA1LDExMCwxMDMsMzIsOTgsOTcsOTksMTA3LDMyLDExMSwxMTAsCisgICAgMzIsOTUsOTUsMTEwLDk3LDEwOSwxMDEsOTUsOTUsMzIsOTcsMTEwLDEwMCwzMiw5NSw5NSwKKyAgICAxMTIsOTcsMTE2LDEwNCw5NSw5NSwxMTQsMSwwLDAsMCwxMTQsMTI3LDAsMCwwLAorICAgIDExNCwxMTcsMCwwLDAsMTE0LDE5LDAsMCwwLDQxLDYsMTE0LDMwLDAsMCwKKyAgICAwLDExNCwxMTksMCwwLDAsMTE0LDE2NywwLDAsMCwxMTQsMTY4LDAsMCwwLAorICAgIDExNCwxNjksMCwwLDAsMTE0LDExOCwwLDAsMCw0MSwzLDIxOCw3LDEwMywxMDgsCisgICAgMTExLDk4LDk3LDEwOCwxMTUsMTE0LDE2MSwwLDAsMCwxMTQsODIsMCwwLDAsMTE0LAorICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE3LAorICAgIDk1LDk5LDk3LDEwOCw5OSw5NSw5NSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsCisgICAgOTUsMjUyLDMsMCwwLDExNSwzMCwwLDAsMCwwLDcsMTAsMSwxMCwxLAorICAgIDgsMSwxOCwxLDIyLDIsMTAsMSw2LDEsOCwxLDgsMiw2LDIsCisgICAgMTAsMSw4LDEsOCwxLDE0LDEsMTE0LDE5MywwLDAsMCw5OSw1LDAsCisgICAgMCwwLDAsMCwwLDAsOSwwLDAsMCw1LDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwxNzAsMCwwLDAsMTI0LDQsMTAwLDEsMTA3LDIsMTE0LDE4LDExNiwKKyAgICAwLDEyNCwwLDEzMSwxLDEyNSw1LDExMCwzNiwxMjQsMSwxMDAsMiwxMDcsOSwxMTQsCisgICAgMzAsMTI0LDEsMTEwLDIsMTA1LDAsMTI1LDYsMTE2LDEsMTI0LDYsMTMxLDEsMTI1LAorICAgIDcsMTE2LDAsMTI0LDAsMTI0LDcsMTI0LDQsMTMxLDMsMTI1LDUsMTI0LDMsMTE1LAorICAgIDE1NCwxMjQsNCwxMDAsMSwxMDcsMiwxMTQsODYsMTE2LDAsMTI0LDAsMTA2LDIsMTAwLAorICAgIDMsMTMxLDEsMTAwLDEsMjUsMCwxMzEsMSw4MywwLDExMywxNjYsMTI0LDAsMTE1LAorICAgIDk2LDEyNCw1LDgzLDAsMTEzLDE2NiwxMTYsMywxMjQsMCwxMzEsMSwxMTYsMywxMjQsCisgICAgMCwxMDYsMiwxMDAsMywxMzEsMSwxMDAsMSwyNSwwLDEzMSwxLDI0LDAsMTI1LAorICAgIDgsMTE2LDQsMTA2LDUsMTI0LDUsMTA2LDYsMTAwLDIsMTE2LDMsMTI0LDUsMTA2LAorICAgIDYsMTMxLDEsMTI0LDgsMjQsMCwxMzMsMiwyNSwwLDI1LDAsODMsMCwxMTAsCisgICAgMTIsMTE2LDcsMTI0LDUsMTI0LDMsMTE2LDAsMTMxLDMsODMsMCwxMDAsMiw4MywKKyAgICAwLDQxLDQsOTcsMjE1LDEsMCwwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMzIsOTcsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LAorICAgIDEwMSwzMiwzOSwxMDMsMTA4LDExMSw5OCw5NywxMDgsMTE1LDM5LDMyLDk3LDExNCwxMDMsMTE3LAorICAgIDEwOSwxMDEsMTEwLDExNiwzMiwxMDUsMTE1LDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMTYsMTExLDMyLAorICAgIDEwNSwxMTAsMTAyLDEwMSwxMTQsMzIsMTE5LDEwNCwxMDEsMTE0LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDUsMTE1LDMyLDExMSw5OSw5OSwxMTcsMTE0LDExNCwKKyAgICAxMDUsMTEwLDEwMywzMiwxMDIsMTE0LDExMSwxMDksMTAsMzIsMzIsMzIsMzIsMTE2LDExMSwzMiwKKyAgICAxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsMTE4LDEwMSwzMiwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMTUsNDYsMzIsODQsMTA0LDEwMSwzMiwzOSwxMDgsMTExLAorICAgIDk5LDk3LDEwOCwxMTUsMzksMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDEwNSwKKyAgICAxMTUsMzIsMTA1LDEwMywxMTAsMTExLDExNCwxMDEsMTAwLDQ2LDMyLDg0LDEwNCwxMDEsMTAsMzIsCisgICAgMzIsMzIsMzIsMzksMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiwzOSwzMiw5NywxMTQsCisgICAgMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDExNSwKKyAgICAzMiwxMTksMTA0LDk3LDExNiwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMDEsMTIwLDEwNSwKKyAgICAxMTUsMTE2LDMyLDk3LDExNSwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMTE1LAorICAgIDMyLDExMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTAsMzIsCisgICAgMzIsMzIsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwKKyAgICAxMDAsMzIsNDAsMTAxLDQ2LDEwMyw0NiwzMiw5Niw5NiwxMDIsMTE0LDExMSwxMDksMzIsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsNjAsMTAyLDExNCwKKyAgICAxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiw2Miw5Niw5Niw0MSw0NiwzMiwzMiw4NCwxMDQsMTAxLAorICAgIDMyLDM5LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzksMTAsMzIsMzIsMzIsMzIsOTcsMTE0LDEwMywKKyAgICAxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsMTE2LDExNSwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTA4LDExMSw5OSwKKyAgICA5NywxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDExMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwKKyAgICAxMDIsMTE0LDExMSwxMDksMzIsMTA1LDExMCwzMiw5NywzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LAorICAgIDExOCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsNDAsMTAxLAorICAgIDQ2LDEwMyw0NiwzMiw5Niw5NiwxMDIsMTE0LDExMSwxMDksMzIsNDYsNDYsMTEyLDEwNywxMDMsCisgICAgMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA5LDExMSwxMDAsOTYsOTYsMzIsMTE5LDExMSwKKyAgICAxMTcsMTA4LDEwMCwzMiwxMDQsOTcsMTE4LDEwMSwzMiw5NywzMiwzOSwxMDgsMTAxLDExOCwxMDEsCisgICAgMTA4LDM5LDMyLDExMSwxMDIsMzIsNTAsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMTE0LAorICAgIDE5LDAsMCwwLDc4LDExNCwxMTcsMCwwLDAsNDEsOCwxMTQsMTgyLDAsMCwKKyAgICAwLDExNCwxOTMsMCwwLDAsMjE4LDksMTEyLDk3LDExNCwxMTYsMTA1LDExNiwxMDUsMTExLAorICAgIDExMCwxMTQsMTU5LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsNzksMCwwLDAsCisgICAgMTE0LDEsMCwwLDAsMTE0LDE4OSwwLDAsMCw0MSw5LDExNCwxNSwwLDAsCisgICAgMCwxMTQsMTkyLDAsMCwwLDIxOCw2LDEwOCwxMTEsOTksOTcsMTA4LDExNSwxMTQsMTg3LAorICAgIDAsMCwwLDExNCwxNjIsMCwwLDAsMTE0LDgzLDAsMCwwLDkwLDgsMTAzLAorICAgIDEwOCwxMTEsOTgsOTcsMTA4LDExNSw5NSwxMTQsMTYxLDAsMCwwLDkwLDcsOTksMTE3LAorICAgIDExNiw5NSwxMTEsMTAyLDEwMiwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMSwwLDAsMCwyMTgsMTAsOTUsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsOTUsCisgICAgMjMsNCwwLDAsMTE1LDI2LDAsMCwwLDAsMTEsOCwxLDEwLDIsMTYsCisgICAgMSw4LDEsMTIsMSw0LDMsOCwxLDIwLDEsNCwxLDYsNCwyNiwKKyAgICAzLDMyLDIsMTE0LDE5NiwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwzOCwwLAorICAgIDAsMCwxMTYsMCwxMDYsMSwxMjQsMCwxMzEsMSwxMjUsMSwxMjQsMSwxMDAsMCwKKyAgICAxMDcsOCwxMTQsMzAsMTE2LDIsMTAwLDEsMTI0LDAsMjMsMCwxMzEsMSwxMzAsMSwKKyAgICAxMTYsMywxMjQsMSwxMzEsMSw4MywwLDQxLDIsNzgsMTIyLDI1LDExMCwxMTEsMzIsCisgICAgOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsCisgICAgMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDQxLDQsMTE0LDE0MiwwLDAsMCwxMTQsMTQ2LDAsCisgICAgMCwwLDExNCw3MCwwLDAsMCwxMTQsMTQxLDAsMCwwLDQxLDIsMTE0LDE1LAorICAgIDAsMCwwLDExNCw4MiwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMSwwLDAsMCwyMTgsMTgsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwKKyAgICAxMTAsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExMCw5NywxMDksMTAxLDU4LDQsMCwwLDExNSwKKyAgICA4LDAsMCwwLDAsMSwxMCwxLDgsMSwxMiwxLDExNCwxOTcsMCwwLAorICAgIDAsOTksMiwwLDAsMCwwLDAsMCwwLDEyLDAsMCwwLDEyLDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwyNDQsMCwwLDAsMTI0LDEsOTcsMCwxMjQsCisgICAgMCw5NywxLDExNiwyLDExNiwxLDEzMSwxLDEyNSwyLDEyMCw4NiwxMTYsMSwxMDYsCisgICAgMywxMDYsNCwxMzEsMCw2OCwwLDkzLDcyLDkyLDIsMTI1LDMsMTI1LDQsMTE2LAorICAgIDUsMTI0LDQsMTI0LDIsMTMxLDIsMTE0LDI4LDEyNCwzLDExNiwxLDEwNiw2LDEwNywKKyAgICA2LDExNCw2MiwxMTYsNywxMjUsNSwxMTAsMTgsMTE2LDAsMTA2LDgsMTI0LDMsMTMxLAorICAgIDEsMTE0LDI4LDExNiw5LDEyNSw1LDExMCwyLDExMywyOCwxMTYsMTAsMTI0LDQsMTI0LAorICAgIDUsMTMxLDIsMTI1LDYsMTE2LDExLDEyNCw2LDEyNCw0LDEzMSwyLDEsMCwxMTMsCisgICAgMjgsODcsMCwxMTYsMSwxMDYsMywxMTYsMTIsMjUsMCwxMjUsNywxMjAsNTQsMTAwLAorICAgIDUsNjgsMCw5Myw0NiwxMjUsOCwxMjQsOCwxMTYsMSwxMDYsMywxMDcsNywxMTQsCisgICAgMTQ0LDExNiwxMywxMjQsOCwxMzEsMSwxMjUsOSwxMTAsMTAsMTE2LDEsMTA2LDMsMTI0LAorICAgIDgsMjUsMCwxMjUsOSwxMTYsMTQsMTI0LDcsMTI0LDgsMTI0LDksMTMxLDMsMSwKKyAgICAwLDExMywxMjAsODcsMCwxMjEsMTIsMTE2LDEzLDEwMCwyLDEzMSwxLDEyNSwxMCw4NywKKyAgICAwLDExMCwyNCw0LDAsMTE2LDE1LDEwNywxMCwxMTQsMjA2LDEsMCwxLDAsMSwKKyAgICAwLDEwMCwzLDEyNSwxMCw4OSwwLDExMCwyLDg4LDAsMTE2LDE0LDEyNCw3LDEwMCwKKyAgICAyLDEyNCwxMCwxMzEsMywxLDAsMTE2LDEzLDEwMCw0LDEzMSwxLDEyNSwxMSwxMTYsCisgICAgMTQsMTI0LDcsMTAwLDQsMTI0LDExLDEzMSwzLDEsMCwxMDAsMyw4MywwLDQxLAorICAgIDYsMTIyLDI1MCw4MywxMDEsMTE2LDExNywxMTIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LAorICAgIDEwNSw5OCwzMiw5OCwxMjEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA1LDExMCwxMDMsMzIsCisgICAgMTEwLDEwMSwxMDEsMTAwLDEwMSwxMDAsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsCisgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsMTA1LDExMCwxMDYsMTAxLAorICAgIDk5LDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwxMDksMTAsMzIsMzIsMzIsMzIsMTA1LAorICAgIDExMCwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDEwMywxMDgsMTExLDk4LDk3LDEwOCwzMiwxMTAsCisgICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw2NSwKKyAgICAxMTUsMzIsMTE1LDEyMSwxMTUsMzIsMTA1LDExNSwzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiwKKyAgICAxMDIsMTExLDExNCwzMiwxMTUsMTIxLDExNSw0NiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsCisgICAgOTcsOTksOTksMTAxLDExNSwxMTUsMzIsOTcsMTEwLDEwMCwzMiw5NSwxMDUsMTA5LDExMiwzMiwKKyAgICAxMDUsMTE1LDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTA4LDExMSw5NywKKyAgICAxMDAsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMTAsMzIsMzIsMzIsMzIsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ0LDMyLDExNiwxMDQsMTExLDExNSwxMDEsMzIsMTE2LDExOSwKKyAgICAxMTEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwKKyAgICAxMDEsMzIsMTAxLDEyMCwxMTIsMTA4LDEwNSw5OSwxMDUsMTE2LDEwOCwxMjEsMzIsMTEyLDk3LDExNSwKKyAgICAxMTUsMTAxLDEwMCwzMiwxMDUsMTEwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDExNCwxNjcsMCwKKyAgICAwLDAsMTE0LDIwLDAsMCwwLDc4LDExNCw1NSwwLDAsMCw0MSwxLDEyMiwKKyAgICA5LDk1LDExOSw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDExNSw0MSwxNiwxMTQsNDYsMCwwLAorICAgIDAsMTE0LDE0LDAsMCwwLDExNCwxMywwLDAsMCwxMTQsNzksMCwwLDAsCisgICAgMjE4LDUsMTA1LDExNiwxMDEsMTA5LDExNSwxMTQsMTcxLDAsMCwwLDExNCw2OSwwLDAsCisgICAgMCwxMTQsMTQyLDAsMCwwLDExNCw3NSwwLDAsMCwxMTQsMTUyLDAsMCwwLAorICAgIDExNCwxMjgsMCwwLDAsMTE0LDEzMywwLDAsMCwxMTQsMSwwLDAsMCwxMTQsCisgICAgMTk3LDAsMCwwLDExNCw1LDAsMCwwLDExNCw3MCwwLDAsMCw0MSwxMiwKKyAgICAyMTgsMTAsMTE1LDEyMSwxMTUsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMjE4LDExLDk1LDEwNSwKKyAgICAxMDksMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDExLDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDk1LDExNiwxMjEsMTEyLDEwMSwxMTQsMTUsMCwwLDAsMTE0LDgzLDAsMCwwLAorICAgIDExNCw5MywwLDAsMCwxMTQsODIsMCwwLDAsOTAsMTEsMTE1LDEwMSwxMDgsMTAyLAorICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEyLDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLAorICAgIDk1LDExMCw5NywxMDksMTAxLDkwLDE0LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEzLDExNiwxMDQsMTE0LDEwMSw5NywxMDAsOTUsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsOTAsMTQsMTE5LDEwMSw5NywxMDcsMTE0LDEwMSwxMDIsOTUsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsCisgICAgMCwwLDAsMjE4LDYsOTUsMTE1LDEwMSwxMTYsMTE3LDExMiw2NSw0LDAsMCwxMTUsCisgICAgNTAsMCwwLDAsMCw5LDQsMSw0LDMsOCwxLDIwLDEsMTAsMSwKKyAgICAxMCwxLDYsMSwxMCwxLDYsMiwyLDEsMTAsMSwxNCwzLDEwLDEsCisgICAgMTAsMSwxMCwxLDEwLDIsMTAsMSwxNiwzLDIsMSwxMiwxLDE0LDIsCisgICAgMTAsMSwxMiwzLDgsMSwxMTQsMjAxLDAsMCwwLDk5LDIsMCwwLDAsCisgICAgMCwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsCisgICAgMTE1LDY2LDAsMCwwLDExNiwwLDEyNCwwLDEyNCwxLDEzMSwyLDEsMCwxMTYsCisgICAgMSwxMDYsMiwxMDYsMywxMTYsNCwxMzEsMSwxLDAsMTE2LDEsMTA2LDIsMTA2LAorICAgIDMsMTE2LDUsMTMxLDEsMSwwLDEwMCwxLDEwMCwyLDEwOCw2LDEyNSwyLDEyNCwKKyAgICAyLDk3LDcsMTI0LDIsMTA2LDgsMTE2LDEsMTA2LDksMTE2LDEwLDI1LDAsMTMxLAorICAgIDEsMSwwLDEwMCwyLDgzLDAsNDEsMywxMjIsNTAsNzMsMTEwLDExNSwxMTYsOTcsCisgICAgMTA4LDEwOCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDk3LDExNSwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LAorICAgIDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwxMTQsMTksMCwKKyAgICAwLDAsNzgsNDEsMTEsMTE0LDIwMSwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LAorICAgIDE2NiwwLDAsMCwxMTQsMTA5LDAsMCwwLDExNCwxNDIsMCwwLDAsMTE0LDE1MiwKKyAgICAwLDAsMCwyMTgsMjYsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTA1LDEwOSwxMTIsCisgICAgMTExLDExNCwxMTYsMTA4LDEwNSw5OCw5NSwxMDEsMTIwLDExNiwxMDEsMTE0LDExMCw5NywxMDgsMTE0LAorICAgIDExNSwwLDAsMCwyMTgsOCw5NSwxMDUsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwxMTQsNzksCisgICAgMCwwLDAsMTE0LDEsMCwwLDAsNDEsMywxMTQsMTk5LDAsMCwwLDExNCwKKyAgICAyMDAsMCwwLDAsMTE0LDIwMiwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjAzLDAsMCwwLDExMiw0LDAsCisgICAgMCwxMTUsMTIsMCwwLDAsMCwyLDEwLDIsMTIsMSwxMiwzLDgsMSwKKyAgICA0LDEsMTE0LDIwMywwLDAsMCw0MSwyLDc4LDc4LDQxLDEsNzgsNDEsMiwKKyAgICA3OCwxMTQsMTksMCwwLDAsNDEsNTAsMTE0LDMsMCwwLDAsMTE0LDExNSwwLAorICAgIDAsMCwxMTQsMTIsMCwwLDAsMTE0LDE2LDAsMCwwLDExNCw1MSwwLDAsCisgICAgMCwxMTQsMjksMCwwLDAsMTE0LDM2LDAsMCwwLDExNCwxNywwLDAsMCwKKyAgICAxMTQsMTgsMCwwLDAsMTE0LDQxLDAsMCwwLDExNCw0MiwwLDAsMCwxMTQsCisgICAgNDUsMCwwLDAsMTE0LDU2LDAsMCwwLDExNCw1OCwwLDAsMCwxMTQsNjgsCisgICAgMCwwLDAsMTE0LDc0LDAsMCwwLDExNCw3NywwLDAsMCwxMTQsODQsMCwKKyAgICAwLDAsMTE0LDk1LDAsMCwwLDExNCw5NiwwLDAsMCwxMTQsMTAyLDAsMCwKKyAgICAwLDExNCw3OCwwLDAsMCwyMTgsNiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsOTAsOSwKKyAgICA5NSw4MCw3OSw4MCw4NSw3Niw2NSw4NCw2OSwxMTQsMTI4LDAsMCwwLDExNCwxMzMsCisgICAgMCwwLDAsMTE0LDEzNiwwLDAsMCwxMTQsOTEsMCwwLDAsMTE0LDgwLDAsCisgICAgMCwwLDExNCwxNDAsMCwwLDAsMTE0LDE0MSwwLDAsMCwxMTQsODEsMCwwLAorICAgIDAsMTE0LDE0MiwwLDAsMCwxMTQsMTUyLDAsMCwwLDExNCwxNTcsMCwwLDAsCisgICAgMTE0LDE2MywwLDAsMCwxMTQsMTY1LDAsMCwwLDExNCwxNzAsMCwwLDAsMTE0LAorICAgIDE3NSwwLDAsMCw5MCwxNSw5NSw2OSw4Miw4Miw5NSw3Nyw4Myw3MSw5NSw4MCwKKyAgICA4Miw2OSw3MCw3Myw4OCwxMTQsMTc3LDAsMCwwLDExNCwxODAsMCwwLDAsMTE0LAorICAgIDE4MSwwLDAsMCwxMTQsMTgyLDAsMCwwLDExNCwxODksMCwwLDAsMTE0LDE5MywKKyAgICAwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCwxOTcsMCwwLDAsMTE0LDIwMSwwLAorICAgIDAsMCwxMTQsMjAzLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsOCw2MCwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSw2Miw4LDAsMCwwLDExNSw5NCwwLDAsMCw0LDE3LAorICAgIDQsMiw4LDgsOCw3LDQsMiw0LDMsMTYsNCwxNCw2OCwxNCwyMSwKKyAgICAxNCwxOSw4LDE5LDgsMTksOCwxMSwxNCw4LDgsMTEsOCwxMiw4LDE2LAorICAgIDgsMzYsMTQsMjcsMTQsMTAxLDE2LDI2LDYsMywxMCw0NSwxNCw2MCw4LDE3LAorICAgIDgsMTcsOCwyNSw4LDI5LDgsMjMsOCwxNiwxNCw3MywxNCw3NywxNCwxMywKKyAgICA4LDksOCw5LDEwLDQ3LDgsMjAsNCwxLDgsMiw4LDI3LDgsNiwKKyAgICAxMCwyNSw4LDMxLDgsMjcsMTgsMzUsOCw3LDgsNDcsCiB9OwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydGxpYl9leHRlcm5hbC5oIGIvUHl0aG9uL2ltcG9ydGxpYl9leHRlcm5hbC5oCmluZGV4IDI3ZDdjOGEuLmYyYmNiMjggMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnRsaWJfZXh0ZXJuYWwuaAorKysgYi9QeXRob24vaW1wb3J0bGliX2V4dGVybmFsLmgKQEAgLTEsODM4ICsxLDc2MiBAQAogLyogQXV0by1nZW5lcmF0ZWQgYnkgUHJvZ3JhbXMvX2ZyZWV6ZV9pbXBvcnRsaWIuYyAqLwogY29uc3QgdW5zaWduZWQgY2hhciBfUHlfTV9faW1wb3J0bGliX2V4dGVybmFsW10gPSB7Ci0gICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNywwLDAsCi0gICAgMCw2NCwwLDAsMCwxMTUsMjQ0LDIsMCwwLDEwMCwwLDAsOTAsMCwwLAotICAgIDEwMCw5NiwwLDkwLDEsMCwxMDAsOTcsMCw5MCwyLDAsMTAxLDIsMCwxMDEsCi0gICAgMSwwLDIzLDkwLDMsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCwKLSAgICA0LDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNSwwLDEwMCw4LAotICAgIDAsMTAwLDksMCwxMzIsMCwwLDkwLDYsMCwxMDAsMTAsMCwxMDAsMTEsMCwKLSAgICAxMzIsMCwwLDkwLDcsMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwwLDkwLAotICAgIDgsMCwxMDAsMTQsMCwxMDAsMTUsMCwxMzIsMCwwLDkwLDksMCwxMDAsMTYsCi0gICAgMCwxMDAsMTcsMCwxMzIsMCwwLDkwLDEwLDAsMTAwLDE4LDAsMTAwLDE5LDAsCi0gICAgMTMyLDAsMCw5MCwxMSwwLDEwMCwyMCwwLDEwMCwyMSwwLDEzMiwwLDAsOTAsCi0gICAgMTIsMCwxMDAsMjIsMCwxMDAsMjMsMCwxMDAsMjQsMCwxMzIsMSwwLDkwLDEzLAotICAgIDAsMTAxLDE0LDAsMTAxLDEzLDAsMTA2LDE1LDAsMTMxLDEsMCw5MCwxNiwwLAotICAgIDEwMCwyNSwwLDEwNiwxNywwLDEwMCwyNiwwLDEwMCwyNywwLDEzMSwyLDAsMTAwLAotICAgIDI4LDAsMjMsOTAsMTgsMCwxMDEsMTksMCwxMDYsMjAsMCwxMDEsMTgsMCwxMDAsCi0gICAgMjcsMCwxMzEsMiwwLDkwLDIxLDAsMTAwLDI5LDAsOTAsMjIsMCwxMDAsMzAsCi0gICAgMCw5MCwyMywwLDEwMCwzMSwwLDEwMywxLDAsOTAsMjQsMCwxMDAsMzIsMCwKLSAgICAxMDMsMSwwLDkwLDI1LDAsMTAxLDI1LDAsNCw5MCwyNiwwLDkwLDI3LDAsCi0gICAgMTAwLDMzLDAsMTAwLDM0LDAsMTAwLDMzLDAsMTAwLDM1LDAsMTAwLDM2LDAsMTMyLAotICAgIDEsMSw5MCwyOCwwLDEwMCwzNywwLDEwMCwzOCwwLDEzMiwwLDAsOTAsMjksCi0gICAgMCwxMDAsMzksMCwxMDAsNDAsMCwxMzIsMCwwLDkwLDMwLDAsMTAwLDQxLDAsCi0gICAgMTAwLDQyLDAsMTMyLDAsMCw5MCwzMSwwLDEwMCw0MywwLDEwMCw0NCwwLDEzMiwKLSAgICAwLDAsOTAsMzIsMCwxMDAsNDUsMCwxMDAsNDYsMCwxMDAsNDcsMCwxMDAsNDgsCi0gICAgMCwxMzIsMCwxLDkwLDMzLDAsMTAwLDQ5LDAsMTAwLDUwLDAsMTMyLDAsMCwKLSAgICA5MCwzNCwwLDEwMCw1MSwwLDEwMCw1MiwwLDEzMiwwLDAsOTAsMzUsMCwxMDAsCi0gICAgMzMsMCwxMDAsMzMsMCwxMDAsMzMsMCwxMDAsNTMsMCwxMDAsNTQsMCwxMzIsMywKLSAgICAwLDkwLDM2LDAsMTAwLDMzLDAsMTAwLDMzLDAsMTAwLDMzLDAsMTAwLDU1LDAsCi0gICAgMTAwLDU2LDAsMTMyLDMsMCw5MCwzNywwLDEwMCw1NywwLDEwMCw1NywwLDEwMCwKLSAgICA1OCwwLDEwMCw1OSwwLDEzMiwyLDAsOTAsMzgsMCwxMDAsNjAsMCwxMDAsNjEsCi0gICAgMCwxMzIsMCwwLDkwLDM5LDAsMTAxLDQwLDAsMTMxLDAsMCw5MCw0MSwwLAotICAgIDEwMCwzMywwLDEwMCw2MiwwLDEwMCwzMywwLDEwMCw2MywwLDEwMSw0MSwwLDEwMCwKLSAgICA2NCwwLDEwMCw2NSwwLDEzMiwxLDIsOTAsNDIsMCw3MSwxMDAsNjYsMCwxMDAsCi0gICAgNjcsMCwxMzIsMCwwLDEwMCw2NywwLDEzMSwyLDAsOTAsNDMsMCw3MSwxMDAsCi0gICAgNjgsMCwxMDAsNjksMCwxMzIsMCwwLDEwMCw2OSwwLDEzMSwyLDAsOTAsNDQsCi0gICAgMCw3MSwxMDAsNzAsMCwxMDAsNzEsMCwxMzIsMCwwLDEwMCw3MSwwLDEwMSw0NCwKLSAgICAwLDEzMSwzLDAsOTAsNDUsMCw3MSwxMDAsNzIsMCwxMDAsNzMsMCwxMzIsMCwKLSAgICAwLDEwMCw3MywwLDEzMSwyLDAsOTAsNDYsMCw3MSwxMDAsNzQsMCwxMDAsNzUsCi0gICAgMCwxMzIsMCwwLDEwMCw3NSwwLDEwMSw0NiwwLDEwMSw0NSwwLDEzMSw0LDAsCi0gICAgOTAsNDcsMCw3MSwxMDAsNzYsMCwxMDAsNzcsMCwxMzIsMCwwLDEwMCw3NywwLAotICAgIDEwMSw0NiwwLDEwMSw0NCwwLDEzMSw0LDAsOTAsNDgsMCwxMDMsMCwwLDkwLAotICAgIDQ5LDAsNzEsMTAwLDc4LDAsMTAwLDc5LDAsMTMyLDAsMCwxMDAsNzksMCwxMDEsCi0gICAgNDYsMCwxMDEsNDQsMCwxMzEsNCwwLDkwLDUwLDAsNzEsMTAwLDgwLDAsMTAwLAotICAgIDgxLDAsMTMyLDAsMCwxMDAsODEsMCwxMzEsMiwwLDkwLDUxLDAsNzEsMTAwLAotICAgIDgyLDAsMTAwLDgzLDAsMTMyLDAsMCwxMDAsODMsMCwxMzEsMiwwLDkwLDUyLAotICAgIDAsNzEsMTAwLDg0LDAsMTAwLDg1LDAsMTMyLDAsMCwxMDAsODUsMCwxMzEsMiwKLSAgICAwLDkwLDUzLDAsNzEsMTAwLDg2LDAsMTAwLDg3LDAsMTMyLDAsMCwxMDAsODcsCi0gICAgMCwxMzEsMiwwLDkwLDU0LDAsMTAwLDMzLDAsMTAwLDg4LDAsMTAwLDg5LDAsCi0gICAgMTMyLDEsMCw5MCw1NSwwLDEwMCw5MCwwLDEwMCw5MSwwLDEzMiwwLDAsOTAsCi0gICAgNTYsMCwxMDAsOTIsMCwxMDAsOTMsMCwxMzIsMCwwLDkwLDU3LDAsMTAwLDk0LAotICAgIDAsMTAwLDk1LDAsMTMyLDAsMCw5MCw1OCwwLDEwMCwzMywwLDgzLDQxLDk4LAotICAgIDk3LDk0LDEsMCwwLDY3LDExMSwxMTQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LAotICAgIDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDExMiw5NywxMTYsMTA0LAotICAgIDQ1LDk4LDk3LDExNSwxMDEsMTAwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDEwLDEwLAotICAgIDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsNzgsCi0gICAgNzksODQsMzIsMTA5LDEwMSw5NywxMTAsMTE2LDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLDEwMCwKLSAgICAxMDUsMTE0LDEwMSw5OSwxMTYsMTA4LDEyMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLAotICAgIDMzLDMyLDczLDExNiwzMiwxMDQsOTcsMTE1LDMyLDk4LDEwMSwxMDEsMTEwLDMyLDEwMCwxMDEsCi0gICAgMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTE1LDExNyw5OSwxMDQsMTAsMTE2LDEwNCw5NywxMTYsCi0gICAgMzIsMTA1LDExNiwzMiw5OSw5NywxMTAsMzIsOTgsMTAxLDMyLDk4LDExMSwxMTEsMTE2LDExNSwKLSAgICAxMTYsMTE0LDk3LDExMiwxMTIsMTAxLDEwMCwzMiwxMDUsMTEwLDExNiwxMTEsMzIsODAsMTIxLDExNiwKLSAgICAxMDQsMTExLDExMCwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwKLSAgICAxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTA1LDEwOSwxMTIsCi0gICAgMTExLDExNCwxMTYsNDYsMzIsNjUsMTE1LDEwLDExNSwxMTcsOTksMTA0LDMyLDEwNSwxMTYsMzIsCi0gICAgMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTEwLDEwNiwKLSAgICAxMDEsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwKLSAgICAxMDUsOTksMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsOTcsCi0gICAgMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsMTAxLDExNSwzMiwxMDUsMTEwLDMyLDExMSwxMTQsMTAwLAotICAgIDEwMSwxMTQsMzIsMTE2LDExMSwxMCwxMTksMTExLDExNCwxMDcsNDYsMzIsNzksMTEwLDEwMSwzMiwKLSAgICAxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMTcsMTE1LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAotICAgIDExNiwxMDgsMTA1LDk4LDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsMTE3LDk4LDEwOCwKLSAgICAxMDUsOTksNDUsMTAyLDk3LDk5LDEwNSwxMTAsMTAzLDMyLDExOCwxMDEsMTE0LDExNSwxMDUsMTExLAotICAgIDExMCwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA0NiwxMCwxMCwyMTgsMywxMTksMTA1LDExMCwyMTgsNiw5OSwxMjEsMTAzLDExOSwxMDUsMTEwLAotICAgIDIxOCw2LDEwMCw5NywxMTQsMTE5LDEwNSwxMTAsOTksMCwwLDAsMCwwLDAsMCwKLSAgICAwLDEsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDExNSw4OCwwLAotICAgIDAsMCwxMTYsMCwwLDEwNiwxLDAsMTA2LDIsMCwxMTYsMywwLDEzMSwxLAotICAgIDAsMTE0LDcyLDAsMTE2LDAsMCwxMDYsMSwwLDEwNiwyLDAsMTE2LDQsMCwKLSAgICAxMzEsMSwwLDExNCw0NSwwLDEwMCwxLDAsMTM3LDAsMCwxMTAsNiwwLDEwMCwKLSAgICAyLDAsMTM3LDAsMCwxMzUsMCwwLDEwMiwxLDAsMTAwLDMsMCwxMDAsNCwKLSAgICAwLDEzNCwwLDAsMTI1LDAsMCwxMTAsMTIsMCwxMDAsNSwwLDEwMCw0LDAsCi0gICAgMTMyLDAsMCwxMjUsMCwwLDEyNCwwLDAsODMsNDEsNiw3OCw5MCwxMiw4MCwKLSAgICA4OSw4NCw3Miw3OSw3OCw2Nyw2NSw4Myw2OSw3OSw3NSwxMTUsMTIsMCwwLDAsCi0gICAgODAsODksODQsNzIsNzksNzgsNjcsNjUsODMsNjksNzksNzUsOTksMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxOSwwLDAsCi0gICAgMCwxMTUsMTMsMCwwLDAsMTM2LDAsMCwxMTYsMCwwLDEwNiwxLDAsMTA3LAotICAgIDYsMCw4Myw0MSwxLDEyMiw1Myw4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTAyLDMyLDEwMiwKLSAgICAxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTUsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwKLSAgICAzMiw5OSwxMDQsMTAxLDk5LDEwNywxMDEsMTAwLDMyLDk5LDk3LDExNSwxMDEsNDUsMTA1LDExMCwKLSAgICAxMTUsMTAxLDExMCwxMTUsMTA1LDExNiwxMDUsMTE4LDEwMSwxMDgsMTIxLDQ2LDQxLDIsMjE4LDMsCi0gICAgOTUsMTExLDExNSw5MCw3LDEwMSwxMTAsMTE4LDEwNSwxMTQsMTExLDExMCwxNjksMCw0MSwxLAotICAgIDIxOCwzLDEwNywxMDEsMTIxLDExNCw0LDAsMCwwLDI1MCwzOCw2MCwxMDIsMTE0LDExMSwKLSAgICAxMjIsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDQ2LDk1LDk4LAotICAgIDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiw5NSwxMDEsMTIwLDExNiwxMDEsMTE0LDExMCw5NywKLSAgICAxMDgsNjIsMjE4LDExLDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsMTAxLDM3LAotICAgIDAsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMzcsOTUsMTA5LDk3LDEwNywKLSAgICAxMDEsOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDk1LDk5LDk3LDExNSwxMDEsNDYsNjAsMTA4LDExMSwKLSAgICA5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsCi0gICAgMTAxLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKLSAgICAwLDAsODMsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwKLSAgICAyLDEyMiw1Myw4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTAyLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsCi0gICAgOTcsMTA5LDEwMSwxMTUsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwzMiw5OSwxMDQsMTAxLAotICAgIDk5LDEwNywxMDEsMTAwLDMyLDk5LDk3LDExNSwxMDEsNDUsMTA1LDExMCwxMTUsMTAxLDExMCwxMTUsCi0gICAgMTA1LDExNiwxMDUsMTE4LDEwMSwxMDgsMTIxLDQ2LDcwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsCi0gICAgMCwwLDExNCw3LDAsMCwwLDQxLDAsMCwwLDExNSwyLDAsMCwwLAotICAgIDAsMiw0MSw1LDIxOCwzLDExNSwxMjEsMTE1LDIxOCw4LDExMiwxMDgsOTcsMTE2LDEwMiwKLSAgICAxMTEsMTE0LDEwOSwyMTgsMTAsMTE1LDExNiw5NywxMTQsMTE2LDExNSwxMTksMTA1LDExNiwxMDQsMjE4LAotICAgIDI3LDk1LDY3LDY1LDgzLDY5LDk1LDczLDc4LDgzLDY5LDc4LDgzLDczLDg0LDczLAotICAgIDg2LDY5LDk1LDgwLDc2LDY1LDg0LDcwLDc5LDgyLDc3LDgzLDIxOCwzNSw5NSw2NywKLSAgICA2NSw4Myw2OSw5NSw3Myw3OCw4Myw2OSw3OCw4Myw3Myw4NCw3Myw4Niw2OSw5NSwKLSAgICA4MCw3Niw2NSw4NCw3MCw3OSw4Miw3Nyw4Myw5NSw4Myw4NCw4Miw5NSw3NSw2OSwKLSAgICA4OSw0MSwxLDExNCw3LDAsMCwwLDExNCw0LDAsMCwwLDQxLDEsMTE0LAotICAgIDUsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE2LDk1LDEwOSw5NywxMDcsMTAxLAotICAgIDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsMTAxLDMwLDAsMCwwLDExNSwKLSAgICAxNCwwLDAsMCwwLDEsMTgsMSwxOCwxLDksMiw2LDIsMjEsNCwKLSAgICAxMiwzLDExNCwxMywwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsCi0gICAgMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyNiwwLDAsCi0gICAgMCwxMTYsMCwwLDEyNCwwLDAsMTMxLDEsMCwxMDAsMSwwLDY0LDEwNiwxLAotICAgIDAsMTAwLDIsMCwxMDAsMywwLDEzMSwyLDAsODMsNDEsNCwxMjIsNDIsNjcsCi0gICAgMTExLDExMCwxMTgsMTAxLDExNCwxMTYsMzIsOTcsMzIsNTEsNTAsNDUsOTgsMTA1LDExNiwzMiwKLSAgICAxMDUsMTEwLDExNiwxMDEsMTAzLDEwMSwxMTQsMzIsMTE2LDExMSwzMiwxMDgsMTA1LDExNiwxMTYsMTA4LAotICAgIDEwMSw0NSwxMDEsMTEwLDEwMCwxMDUsOTcsMTEwLDQ2LDEwOCwzLDAsMCwwLDI1NSwxMjcsCi0gICAgMjU1LDEyNywzLDAsMjMzLDQsMCwwLDAsMjE4LDYsMTA4LDEwNSwxMTYsMTE2LDEwOCwKLSAgICAxMDEsNDEsMiwyMTgsMywxMDUsMTEwLDExNiwyMTgsOCwxMTYsMTExLDk1LDk4LDEyMSwxMTYsCi0gICAgMTAxLDExNSw0MSwxLDIxOCwxLDEyMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNiwwLDAsMCwyMTgsNyw5NSwxMTksOTUsMTA4LDExMSwxMTAsMTAzLDQ3LAotICAgIDAsMCwwLDExNSwyLDAsMCwwLDAsMiwxMTQsMTksMCwwLDAsOTksCi0gICAgMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMywwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwKLSAgICAwLDAsMTAwLDEsMCwxMzEsMiwwLDgzLDQxLDIsMTIyLDQ3LDY3LDExMSwxMTAsCi0gICAgMTE4LDEwMSwxMTQsMTE2LDMyLDUyLDMyLDk4LDEyMSwxMTYsMTAxLDExNSwzMiwxMDUsMTEwLDMyLAotICAgIDEwOCwxMDUsMTE2LDExNiwxMDgsMTAxLDQ1LDEwMSwxMTAsMTAwLDEwNSw5NywxMTAsMzIsMTE2LDExMSwKLSAgICAzMiw5NywxMTAsMzIsMTA1LDExMCwxMTYsMTAxLDEwMywxMDEsMTE0LDQ2LDExNCwxNSwwLDAsCi0gICAgMCw0MSwyLDExNCwxNiwwLDAsMCwyMTgsMTAsMTAyLDExNCwxMTEsMTA5LDk1LDk4LAotICAgIDEyMSwxMTYsMTAxLDExNSw0MSwxLDkwLDksMTA1LDExMCwxMTYsOTUsOTgsMTIxLDExNiwxMDEsCi0gICAgMTE1LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLAotICAgIDIxOCw3LDk1LDExNCw5NSwxMDgsMTExLDExMCwxMDMsNTIsMCwwLDAsMTE1LDIsMCwKLSAgICAwLDAsMCwyLDExNCwyMSwwLDAsMCw5OSwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMSwwLDAsMCwzLDAsMCwwLDcxLDAsMCwwLDExNSwyNiwKLSAgICAwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTAwLDEsMCwxMDAsMiwwLDEzMiwKLSAgICAwLDAsMTI0LDAsMCw2OCwxMzEsMSwwLDEzMSwxLDAsODMsNDEsMywxMjIsCi0gICAgMzEsODIsMTAxLDExMiwxMDgsOTcsOTksMTAxLDEwOSwxMDEsMTEwLDExNiwzMiwxMDIsMTExLDExNCwKLSAgICAzMiwxMTEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LDEwNiwxMTEsMTA1LDExMCw0MCw0MSw0NiwKLSAgICA5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw0LDAsMCwKLSAgICAwLDgzLDAsMCwwLDExNSwzNywwLDAsMCwxMDMsMCwwLDEyNCwwLDAsCi0gICAgOTMsMjcsMCwxMjUsMSwwLDEyNCwxLDAsMTE0LDYsMCwxMjQsMSwwLDEwNiwKLSAgICAwLDAsMTE2LDEsMCwxMzEsMSwwLDE0NSwyLDAsMTEzLDYsMCw4MywxMTQsCi0gICAgNCwwLDAsMCw0MSwyLDIxOCw2LDExNCwxMTUsMTE2LDExNCwxMDUsMTEyLDIxOCwxNSwKLSAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTAxLDExMiw5NywxMTQsOTcsMTE2LDExMSwxMTQsMTE1LDQxLAotICAgIDIsMjE4LDIsNDYsNDgsMjE4LDQsMTEyLDk3LDExNCwxMTYsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjUwLDEwLDYwLDEwOCwxMDUsMTE1LAotICAgIDExNiw5OSwxMTEsMTA5LDExMiw2Miw1OSwwLDAsMCwxMTUsMiwwLDAsMCw5LAotICAgIDEsMTIyLDMwLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNiwxMTEsMTA1LDExMCw0Niw2MCwxMDgsCi0gICAgMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTA4LDEwNSwxMTUsMTE2LDk5LDExMSwxMDksMTEyLAotICAgIDYyLDQxLDIsMjE4LDgsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDEwMSwxMTIsMjE4LDQsMTA2LAotICAgIDExMSwxMDUsMTEwLDQxLDEsMjE4LDEwLDExMiw5NywxMTYsMTA0LDk1LDExMiw5NywxMTQsMTE2LAotICAgIDExNSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAyMTgsMTAsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA2LDExMSwxMDUsMTEwLDU3LDAsMCwwLAotICAgIDExNSw0LDAsMCwwLDAsMiwxNSwxLDExNCwzMCwwLDAsMCw5OSwxLAotICAgIDAsMCwwLDAsMCwwLDAsNSwwLDAsMCw1LDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSwxMzQsMCwwLDAsMTE2LDAsMCwxMTYsMSwwLDEzMSwxLAotICAgIDAsMTAwLDEsMCwxMDcsMiwwLDExNCw1MiwwLDEyNCwwLDAsMTA2LDIsMCwKLSAgICAxMTYsMywwLDEzMSwxLDAsOTIsMywwLDEyNSwxLDAsMTI1LDIsMCwxMjUsCi0gICAgMywwLDEyNCwxLDAsMTI0LDMsMCwxMDIsMiwwLDgzLDEyMCw2OSwwLDExNiwKLSAgICA0LDAsMTI0LDAsMCwxMzEsMSwwLDY4LDkzLDU1LDAsMTI1LDQsMCwxMjQsCi0gICAgNCwwLDExNiwxLDAsMTA3LDYsMCwxMTQsNjUsMCwxMjQsMCwwLDEwNiw1LAotICAgIDAsMTI0LDQsMCwxMDAsMiwwLDEwMCwxLDAsMTMxLDEsMSw5MiwyLDAsCi0gICAgMTI1LDEsMCwxMjUsMywwLDEyNCwxLDAsMTI0LDMsMCwxMDIsMiwwLDgzLAotICAgIDExMyw2NSwwLDg3LDEwMCwzLDAsMTI0LDAsMCwxMDIsMiwwLDgzLDQxLDQsCi0gICAgMTIyLDMyLDgyLDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxMDksMTAxLDExMCwxMTYsMzIsMTAyLDExMSwKLSAgICAxMTQsMzIsMTExLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw0NiwxMTUsMTEyLDEwOCwxMDUsMTE2LDQwLAotICAgIDQxLDQ2LDIzMywxLDAsMCwwLDkwLDgsMTA5LDk3LDEyMCwxMTUsMTEyLDEwOCwxMDUsCi0gICAgMTE2LDIxOCwwLDQxLDYsMjE4LDMsMTA4LDEwMSwxMTAsMTE0LDIzLDAsMCwwLDIxOCwKLSAgICAxMCwxMTQsMTEyLDk3LDExNCwxMTYsMTA1LDExNiwxMDUsMTExLDExMCwxMTQsMjcsMCwwLDAsCi0gICAgMjE4LDgsMTE0LDEwMSwxMTgsMTAxLDExNCwxMTUsMTAxLDEwMCwyMTgsNiwxMTQsMTE1LDExMiwxMDgsCi0gICAgMTA1LDExNiw0MSw1LDIxOCw0LDExMiw5NywxMTYsMTA0LDkwLDUsMTAyLDExNCwxMTEsMTEwLAotICAgIDExNiwyMTgsMSw5NSwyMTgsNCwxMTYsOTcsMTA1LDEwOCwxMTQsMTgsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDExLAotICAgIDk1LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTIsMTA4LDEwNSwxMTYsNjMsMCwwLDAsMTE1LAotICAgIDE2LDAsMCwwLDAsMiwxOCwxLDI0LDEsMTAsMSwxOSwxLDEyLDEsCi0gICAgMjcsMSwxNCwxLDExNCw0MCwwLDAsMCw5OSwxLDAsMCwwLDAsMCwKLSAgICAwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxMywKLSAgICAwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDAsMCwxMzEsMSwwLDgzLAotICAgIDQxLDEsMTIyLDEyNiw4MywxMTYsOTcsMTE2LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsCi0gICAgMTA0LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc3LDk3LDEwMCwxMDEsMzIsOTcsMzIsMTE1LAotICAgIDEwMSwxMTIsOTcsMTE0LDk3LDExNiwxMDEsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLAotICAgIDMyLDExNiwxMTEsMzIsMTA5LDk3LDEwNywxMDEsMzIsMTA1LDExNiwzMiwxMDEsOTcsMTE1LDEwNSwKLSAgICAxMDEsMTE0LDMyLDExNiwxMTEsMzIsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwzMiwxMDUsCi0gICAgMTEwLDMyLDEwMSwxMjAsMTEyLDEwMSwxMTQsMTA1LDEwOSwxMDEsMTEwLDExNiwxMTUsMTAsMzIsMzIsCi0gICAgMzIsMzIsNDAsMTAxLDQ2LDEwMyw0NiwzMiw5OSw5Nyw5OSwxMDQsMTAxLDMyLDExNSwxMTYsCi0gICAgOTcsMTE2LDMyLDExNCwxMDEsMTE1LDExNywxMDgsMTE2LDExNSw0MSw0NiwxMCwxMCwzMiwzMiwKLSAgICAzMiwzMiw0MSwyLDExNCwzLDAsMCwwLDkwLDQsMTE1LDExNiw5NywxMTYsNDEsCi0gICAgMSwxMTQsMzcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDYsMCwwLDAsMjE4LDEwLDk1LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTYsOTcsCi0gICAgMTE2LDc1LDAsMCwwLDExNSwyLDAsMCwwLDAsNywxMTQsNDEsMCwwLAotICAgIDAsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMTEsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDU4LDAsMCwwLDEyMSwxNiwwLDExNiwwLAotICAgIDAsMTI0LDAsMCwxMzEsMSwwLDEyNSwyLDAsODcsMTEwLDIyLDAsNCwxMTYsCi0gICAgMSwwLDEwNywxMCwwLDExNCw0MCwwLDEsMSwxLDEwMCwxLDAsODMsODksCi0gICAgMTEwLDEsMCw4OCwxMjQsMiwwLDEwNiwyLDAsMTAwLDIsMCw2NCwxMjQsMSwKLSAgICAwLDEwNywyLDAsODMsNDEsMywxMjIsNDksODQsMTAxLDExNSwxMTYsMzIsMTE5LDEwNCwKLSAgICAxMDEsMTE2LDEwNCwxMDEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwNSwKLSAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwKLSAgICAxMDksMTExLDEwMCwxMDEsMzIsMTE2LDEyMSwxMTIsMTAxLDQ2LDcwLDEwNSwwLDI0MCwwLDAsCi0gICAgNDEsMywxMTQsNDEsMCwwLDAsMjE4LDcsNzksODMsNjksMTE0LDExNCwxMTEsMTE0LAotICAgIDIxOCw3LDExNSwxMTYsOTUsMTA5LDExMSwxMDAsMTAxLDQxLDMsMTE0LDM3LDAsMCwwLAotICAgIDIxOCw0LDEwOSwxMTEsMTAwLDEwMSw5MCw5LDExNSwxMTYsOTcsMTE2LDk1LDEwNSwxMTAsMTAyLAotICAgIDExMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAyMTgsMTgsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDExNSw5NSwxMDksMTExLDEwMCwxMDEsOTUsCi0gICAgMTE2LDEyMSwxMTIsMTAxLDg1LDAsMCwwLDExNSwxMCwwLDAsMCwwLDIsMywKLSAgICAxLDE2LDEsMTMsMSw5LDEsMTE0LDQ1LDAsMCwwLDk5LDEsMCwwLAorICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDUsMCwwLAorICAgIDAsNjQsMCwwLDAsMTE1LDI0OCwxLDAsMCwxMDAsMCw5MCwwLDEwMCw5MSwKKyAgICA5MCwxLDEwMCw5Miw5MCwyLDEwMSwyLDEwMSwxLDIzLDAsOTAsMywxMDAsNCwKKyAgICAxMDAsNSwxMzIsMCw5MCw0LDEwMCw2LDEwMCw3LDEzMiwwLDkwLDUsMTAwLDgsCisgICAgMTAwLDksMTMyLDAsOTAsNiwxMDAsMTAsMTAwLDExLDEzMiwwLDkwLDcsMTAwLDEyLAorICAgIDEwMCwxMywxMzIsMCw5MCw4LDEwMCwxNCwxMDAsMTUsMTMyLDAsOTAsOSwxMDAsMTYsCisgICAgMTAwLDE3LDEzMiwwLDkwLDEwLDEwMCwxOCwxMDAsMTksMTMyLDAsOTAsMTEsMTAwLDIwLAorICAgIDEwMCwyMSwxMzIsMCw5MCwxMiwxMDAsOTMsMTAwLDIzLDEwMCwyNCwxMzIsMSw5MCwxMywKKyAgICAxMDEsMTQsMTAxLDEzLDEwNiwxNSwxMzEsMSw5MCwxNiwxMDAsMjUsMTA2LDE3LDEwMCwyNiwKKyAgICAxMDAsMjcsMTMxLDIsMTAwLDI4LDIzLDAsOTAsMTgsMTAxLDE5LDEwNiwyMCwxMDEsMTgsCisgICAgMTAwLDI3LDEzMSwyLDkwLDIxLDEwMCwyOSw5MCwyMiwxMDAsMzAsOTAsMjMsMTAwLDMxLAorICAgIDEwMywxLDkwLDI0LDEwMCwzMiwxMDMsMSw5MCwyNSwxMDEsMjUsNCwwLDkwLDI2LAorICAgIDkwLDI3LDEwMCw5NCwxMDAsMzMsMTAwLDM0LDE1NiwxLDEwMCwzNSwxMDAsMzYsMTMyLDMsCisgICAgOTAsMjgsMTAwLDM3LDEwMCwzOCwxMzIsMCw5MCwyOSwxMDAsMzksMTAwLDQwLDEzMiwwLAorICAgIDkwLDMwLDEwMCw0MSwxMDAsNDIsMTMyLDAsOTAsMzEsMTAwLDQzLDEwMCw0NCwxMzIsMCwKKyAgICA5MCwzMiwxMDAsNDUsMTAwLDQ2LDEzMiwwLDkwLDMzLDEwMCw0NywxMDAsNDgsMTMyLDAsCisgICAgOTAsMzQsMTAwLDk1LDEwMCw0OSwxMDAsNTAsMTMyLDEsOTAsMzUsMTAwLDk2LDEwMCw1MSwKKyAgICAxMDAsNTIsMTMyLDEsOTAsMzYsMTAwLDk3LDEwMCw1NCwxMDAsNTUsMTMyLDEsOTAsMzcsCisgICAgMTAwLDU2LDEwMCw1NywxMzIsMCw5MCwzOCwxMDEsMzksMTMxLDAsOTAsNDAsMTAwLDk4LAorICAgIDEwMCwzMywxMDEsNDAsMTAwLDU4LDE1NiwyLDEwMCw1OSwxMDAsNjAsMTMyLDMsOTAsNDEsCisgICAgNzEsMCwxMDAsNjEsMTAwLDYyLDEzMiwwLDEwMCw2MiwxMzEsMiw5MCw0Miw3MSwwLAorICAgIDEwMCw2MywxMDAsNjQsMTMyLDAsMTAwLDY0LDEzMSwyLDkwLDQzLDcxLDAsMTAwLDY1LAorICAgIDEwMCw2NiwxMzIsMCwxMDAsNjYsMTAxLDQzLDEzMSwzLDkwLDQ0LDcxLDAsMTAwLDY3LAorICAgIDEwMCw2OCwxMzIsMCwxMDAsNjgsMTMxLDIsOTAsNDUsNzEsMCwxMDAsNjksMTAwLDcwLAorICAgIDEzMiwwLDEwMCw3MCwxMDEsNDUsMTAxLDQ0LDEzMSw0LDkwLDQ2LDcxLDAsMTAwLDcxLAorICAgIDEwMCw3MiwxMzIsMCwxMDAsNzIsMTAxLDQ1LDEwMSw0MywxMzEsNCw5MCw0NywxMDMsMCwKKyAgICA5MCw0OCw3MSwwLDEwMCw3MywxMDAsNzQsMTMyLDAsMTAwLDc0LDEwMSw0NSwxMDEsNDMsCisgICAgMTMxLDQsOTAsNDksNzEsMCwxMDAsNzUsMTAwLDc2LDEzMiwwLDEwMCw3NiwxMzEsMiwKKyAgICA5MCw1MCw3MSwwLDEwMCw3NywxMDAsNzgsMTMyLDAsMTAwLDc4LDEzMSwyLDkwLDUxLAorICAgIDcxLDAsMTAwLDc5LDEwMCw4MCwxMzIsMCwxMDAsODAsMTMxLDIsOTAsNTIsNzEsMCwKKyAgICAxMDAsODEsMTAwLDgyLDEzMiwwLDEwMCw4MiwxMzEsMiw5MCw1MywxMDAsOTksMTAwLDgzLAorICAgIDEwMCw4NCwxMzIsMSw5MCw1NCwxMDAsODUsMTAwLDg2LDEzMiwwLDkwLDU1LDEwMCw4NywKKyAgICAxMDAsODgsMTMyLDAsOTAsNTYsMTAwLDg5LDEwMCw5MCwxMzIsMCw5MCw1NywxMDAsMzMsCisgICAgODMsMCw0MSwxMDAsOTcsOTQsMSwwLDAsNjcsMTExLDExNCwxMDEsMzIsMTA1LDEwOSwKKyAgICAxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsCisgICAgMTEyLDk3LDExNiwxMDQsNDUsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsNDYsMTAsMTAsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsCisgICAgMTA1LDExNSwzMiw3OCw3OSw4NCwzMiwxMDksMTAxLDk3LDExMCwxMTYsMzIsMTE2LDExMSwzMiwKKyAgICA5OCwxMDEsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMDgsMTIxLDMyLDEwNSwxMDksMTEyLDExMSwKKyAgICAxMTQsMTE2LDEwMSwxMDAsMzMsMzIsNzMsMTE2LDMyLDEwNCw5NywxMTUsMzIsOTgsMTAxLDEwMSwKKyAgICAxMTAsMzIsMTAwLDEwMSwxMTUsMTA1LDEwMywxMTAsMTAxLDEwMCwzMiwxMTUsMTE3LDk5LDEwNCwxMCwKKyAgICAxMTYsMTA0LDk3LDExNiwzMiwxMDUsMTE2LDMyLDk5LDk3LDExMCwzMiw5OCwxMDEsMzIsOTgsCisgICAgMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDExMiwxMDEsMTAwLDMyLDEwNSwxMTAsMTE2LDExMSwKKyAgICAzMiw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsCisgICAgMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwKKyAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwzMiw2NSwxMTUsMTAsMTE1LDExNyw5OSwxMDQsCisgICAgMzIsMTA1LDExNiwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDEwNSwxMTAsMTA2LDEwMSw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTUsMTEyLAorICAgIDEwMSw5OSwxMDUsMTAyLDEwNSw5OSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsCisgICAgMTEwLDEwMCwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMTE1LDMyLDEwNSwxMTAsCisgICAgMzIsMTExLDExNCwxMDAsMTAxLDExNCwzMiwxMTYsMTExLDEwLDExOSwxMTEsMTE0LDEwNyw0NiwzMiwKKyAgICA3OSwxMTAsMTAxLDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLDExNywxMTUsMTAxLDMyLDEwNSwKKyAgICAxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDExMiwxMTcsOTgsMTA4LDEwNSw5OSw0NSwxMDIsOTcsOTksMTA1LDExMCwxMDMsMzIsMTE4LDEwMSwKKyAgICAxMTQsMTE1LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDIxOCwzLDExOSwxMDUsMTEwLDIxOCw2LDk5LDEyMSwKKyAgICAxMDMsMTE5LDEwNSwxMTAsMjE4LDYsMTAwLDk3LDExNCwxMTksMTA1LDExMCw5OSwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDMsMCwwLAorICAgIDAsMTE1LDYwLDAsMCwwLDExNiwwLDEwNiwxLDEwNiwyLDExNiwzLDEzMSwxLAorICAgIDExNCw0OCwxMTYsMCwxMDYsMSwxMDYsMiwxMTYsNCwxMzEsMSwxMTQsMzAsMTAwLDEsCisgICAgMTM3LDAsMTEwLDQsMTAwLDIsMTM3LDAsMTM1LDAsMTAyLDEsMTAwLDMsMTAwLDQsCisgICAgMTMyLDgsMTI1LDAsMTEwLDgsMTAwLDUsMTAwLDQsMTMyLDAsMTI1LDAsMTI0LDAsCisgICAgODMsMCw0MSw2LDc4LDkwLDEyLDgwLDg5LDg0LDcyLDc5LDc4LDY3LDY1LDgzLAorICAgIDY5LDc5LDc1LDExNSwxMiwwLDAsMCw4MCw4OSw4NCw3Miw3OSw3OCw2Nyw2NSwKKyAgICA4Myw2OSw3OSw3NSw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwyLDAsMCwwLDE5LDAsMCwwLDExNSwxMCwwLDAsMCwxMzYsMCwKKyAgICAxMTYsMCwxMDYsMSwxMDcsNiw4MywwLDQxLDEsMTIyLDUzLDg0LDExNCwxMTcsMTAxLAorICAgIDMyLDEwNSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNSwzMiwxMDksMTE3LAorICAgIDExNSwxMTYsMzIsOTgsMTAxLDMyLDk5LDEwNCwxMDEsOTksMTA3LDEwMSwxMDAsMzIsOTksOTcsCisgICAgMTE1LDEwMSw0NSwxMDUsMTEwLDExNSwxMDEsMTEwLDExNSwxMDUsMTE2LDEwNSwxMTgsMTAxLDEwOCwxMjEsCisgICAgNDYsNDEsMiwyMTgsMyw5NSwxMTEsMTE1LDkwLDcsMTAxLDExMCwxMTgsMTA1LDExNCwxMTEsCisgICAgMTEwLDE2OSwwLDQxLDEsMjE4LDMsMTA3LDEwMSwxMjEsMTE0LDQsMCwwLDAsMjUwLAorICAgIDM4LDYwLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwKKyAgICAxMDUsOTgsNDYsOTUsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDk1LDEwMSwxMjAsCisgICAgMTE2LDEwMSwxMTQsMTEwLDk3LDEwOCw2MiwyMTgsMTEsOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDk1LAorICAgIDk5LDk3LDExNSwxMDEsMzcsMCwwLDAsMTE1LDIsMCwwLDAsMCwyLDEyMiwKKyAgICAzNyw5NSwxMDksOTcsMTA3LDEwMSw5NSwxMTQsMTAxLDEwOCw5NywxMjAsOTUsOTksOTcsMTE1LAorICAgIDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsOTUsMTE0LDEwMSwxMDgsOTcsCisgICAgMTIwLDk1LDk5LDk3LDExNSwxMDEsOTksMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMSwwLDAsMCw4MywwLDAsMCwxMTUsNCwwLDAsMCwKKyAgICAxMDAsMSw4MywwLDQxLDIsMTIyLDUzLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsCisgICAgMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNSwzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsCisgICAgMTAxLDMyLDk5LDEwNCwxMDEsOTksMTA3LDEwMSwxMDAsMzIsOTksOTcsMTE1LDEwMSw0NSwxMDUsCisgICAgMTEwLDExNSwxMDEsMTEwLDExNSwxMDUsMTE2LDEwNSwxMTgsMTAxLDEwOCwxMjEsNDYsNzAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDYsMCwwLDAsMTE0LDcsMCwwLDAsNDEsMCwwLDAsCisgICAgMTE1LDIsMCwwLDAsMCwyLDQxLDUsMjE4LDMsMTE1LDEyMSwxMTUsMjE4LDgsCisgICAgMTEyLDEwOCw5NywxMTYsMTAyLDExMSwxMTQsMTA5LDIxOCwxMCwxMTUsMTE2LDk3LDExNCwxMTYsMTE1LAorICAgIDExOSwxMDUsMTE2LDEwNCwyMTgsMjcsOTUsNjcsNjUsODMsNjksOTUsNzMsNzgsODMsNjksCisgICAgNzgsODMsNzMsODQsNzMsODYsNjksOTUsODAsNzYsNjUsODQsNzAsNzksODIsNzcsCisgICAgODMsMjE4LDM1LDk1LDY3LDY1LDgzLDY5LDk1LDczLDc4LDgzLDY5LDc4LDgzLDczLAorICAgIDg0LDczLDg2LDY5LDk1LDgwLDc2LDY1LDg0LDcwLDc5LDgyLDc3LDgzLDk1LDgzLAorICAgIDg0LDgyLDk1LDc1LDY5LDg5LDQxLDEsMTE0LDcsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsNDEsMSwxMTQsNSwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTYsCisgICAgOTUsMTA5LDk3LDEwNywxMDEsOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDk1LDk5LDk3LDExNSwxMDEsCisgICAgMzAsMCwwLDAsMTE1LDE0LDAsMCwwLDAsMSwxMiwxLDEyLDEsNiwKKyAgICAyLDQsMiwxNCw0LDgsMywxMTQsMTMsMCwwLDAsOTksMSwwLDAsCiAgICAgMCwwLDAsMCwwLDEsMCwwLDAsMywwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMTMsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLDEwMCwxLDAsMTMxLAotICAgIDIsMCw4Myw0MSwyLDEyMiwzMSw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwKLSAgICAxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTA1LAotICAgIDExNSwxMDIsMTA1LDEwOCwxMDEsNDYsMTA1LDAsMTI4LDAsMCw0MSwxLDExNCw0NSwwLAotICAgIDAsMCw0MSwxLDExNCwzNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTIsOTUsMTEyLDk3LDExNiwxMDQsOTUsCi0gICAgMTA1LDExNSwxMDIsMTA1LDEwOCwxMDEsOTQsMCwwLDAsMTE1LDIsMCwwLDAsMCwKLSAgICAyLDExNCw0NiwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMSwKLSAgICAwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwzMSwwLDAsMCwKLSAgICAxMjQsMCwwLDExNSwxOCwwLDExNiwwLDAsMTA2LDEsMCwxMzEsMCwwLDEyNSwKLSAgICAwLDAsMTE2LDIsMCwxMjQsMCwwLDEwMCwxLDAsMTMxLDIsMCw4Myw0MSwKLSAgICAyLDEyMiwzMCw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTA1LDExNSwxMDAsMTA1LDExNCwKLSAgICA0NiwxMDUsMCw2NCwwLDAsNDEsMywxMTQsMywwLDAsMCwyMTgsNiwxMDMsCi0gICAgMTAxLDExNiw5OSwxMTksMTAwLDExNCw0NSwwLDAsMCw0MSwxLDExNCwzNywwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDExNSwxMDAsMTA1LDExNCw5OSwwLDAsCi0gICAgMCwxMTUsNiwwLDAsMCwwLDIsNiwxLDEyLDEsMTE0LDQ4LDAsMCwKLSAgICAwLDEwNSwxODIsMSwwLDAsOTksMywwLDAsMCwwLDAsMCwwLDYsCi0gICAgMCwwLDAsMTcsMCwwLDAsNjcsMCwwLDAsMTE1LDE5MywwLDAsMCwKLSAgICAxMDAsMSwwLDEwNiwwLDAsMTI0LDAsMCwxMTYsMSwwLDEyNCwwLDAsMTMxLAotICAgIDEsMCwxMzEsMiwwLDEyNSwzLDAsMTE2LDIsMCwxMDYsMywwLDEyNCwzLAotICAgIDAsMTE2LDIsMCwxMDYsNCwwLDExNiwyLDAsMTA2LDUsMCw2NiwxMTYsMiwKLSAgICAwLDEwNiw2LDAsNjYsMTI0LDIsMCwxMDAsMiwwLDY0LDEzMSwzLDAsMTI1LAotICAgIDQsMCwxMjEsNjEsMCwxMTYsNywwLDEwNiw4LDAsMTI0LDQsMCwxMDAsMywKLSAgICAwLDEzMSwyLDAsMTQzLDIwLDAsMTI1LDUsMCwxMjQsNSwwLDEwNiw5LDAsCi0gICAgMTI0LDEsMCwxMzEsMSwwLDEsODcsMTAwLDQsMCw4MSw4Miw4OCwxMTYsMiwKLSAgICAwLDEwNiwxMCwwLDEyNCwzLDAsMTI0LDAsMCwxMzEsMiwwLDEsODcsMTEwLAotICAgIDU5LDAsNCwxMTYsMTEsMCwxMDcsMTAsMCwxMTQsMTg4LDAsMSwxLDEsMTIxLAotICAgIDE3LDAsMTE2LDIsMCwxMDYsMTIsMCwxMjQsMywwLDEzMSwxLDAsMSw4NywKLSAgICAxMTAsMTgsMCw0LDExNiwxMSwwLDEwNywxMCwwLDExNCwxODAsMCwxLDEsMSwKLSAgICA4OSwxMTAsMSwwLDg4LDEzMCwwLDAsODksMTEwLDEsMCw4OCwxMDAsNCwwLAotICAgIDgzLDQxLDUsMTIyLDE2Miw2NiwxMDEsMTE1LDExNiw0NSwxMDEsMTAyLDEwMiwxMTEsMTE0LDExNiwKLSAgICAzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDExMSwzMiwxMTksMTE0LDEwNSwKLSAgICAxMTYsMTAxLDMyLDEwMCw5NywxMTYsOTcsMzIsMTE2LDExMSwzMiw5NywzMiwxMTIsOTcsMTE2LAotICAgIDEwNCwzMiw5NywxMTYsMTExLDEwOSwxMDUsOTksOTcsMTA4LDEwOCwxMjEsNDYsMTAsMzIsMzIsCi0gICAgMzIsMzIsNjYsMTAxLDMyLDExMiwxMTQsMTAxLDExMiw5NywxMTQsMTAxLDEwMCwzMiwxMTYsMTExLAotICAgIDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMzIsOTcsMzIsNzAsMTA1LDEwOCwxMDEsNjksMTIwLAotICAgIDEwNSwxMTUsMTE2LDExNSw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDEwMiwzMiw5OSwxMTEsMTEwLAotICAgIDk5LDExNywxMTQsMTE0LDEwMSwxMTAsMTE2LDMyLDExOSwxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwKLSAgICAxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDExNiwxMDEsMTA5LDExMiwxMTEsCi0gICAgMTE0LDk3LDExNCwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsMTE2LDExNiwKLSAgICAxMDEsMTA5LDExMiwxMTYsMTAxLDEwMCw0NiwxMjIsNSwxMjMsMTI1LDQ2LDEyMywxMjUsMTA1LDE4MiwKLSAgICAxLDAsMCw5MCwyLDExOSw5OCw3OCw0MSwxMywyMTgsNiwxMDIsMTExLDExNCwxMDksCi0gICAgOTcsMTE2LDIxOCwyLDEwNSwxMDAsMTE0LDMsMCwwLDAsOTAsNCwxMTEsMTEyLDEwMSwKLSAgICAxMTAsOTAsNiw3OSw5NSw2OSw4OCw2Nyw3Niw5MCw3LDc5LDk1LDY3LDgyLDY5LAotICAgIDY1LDg0LDkwLDgsNzksOTUsODcsODIsNzksNzgsNzYsODksMjE4LDMsOTUsMTA1LAotICAgIDExMSwyMTgsNiw3MCwxMDUsMTA4LDEwMSw3Myw3OSwyMTgsNSwxMTksMTE0LDEwNSwxMTYsMTAxLAotICAgIDIxOCw3LDExNCwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTE0LDQyLDAsMCwwLDkwLDYsCi0gICAgMTE3LDExMCwxMDgsMTA1LDExMCwxMDcsNDEsNiwxMTQsMzcsMCwwLDAsMjE4LDQsMTAwLAotICAgIDk3LDExNiw5NywxMTQsNDQsMCwwLDAsOTAsOCwxMTIsOTcsMTE2LDEwNCw5NSwxMTYsCi0gICAgMTA5LDExMiw5MCwyLDEwMiwxMDAsMjE4LDQsMTAyLDEwNSwxMDgsMTAxLDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMyw5NSwxMTksMTE0LAotICAgIDEwNSwxMTYsMTAxLDk1LDk3LDExNiwxMTEsMTA5LDEwNSw5OSwxMDYsMCwwLDAsMTE1LDI2LAotICAgIDAsMCwwLDAsNSwyNCwxLDksMSwzMywxLDMsMywyMSwxLDIwLAotICAgIDEsMjAsMSwxMywxLDMsMSwxNywxLDEzLDEsNSwxLDExNCw1NywwLAotICAgIDAsMCwxMDUsMjMsMTMsMCwwLDIzMywyLDAsMCwwLDExNCwxNSwwLDAsCi0gICAgMCwxMTUsMiwwLDAsMCwxMywxMCw5MCwxMSw5NSw5NSwxMTIsMTIxLDk5LDk3LAotICAgIDk5LDEwNCwxMDEsOTUsOTUsMTIyLDQsMTExLDExMiwxMTYsNDUsMTIyLDMsNDYsMTEyLDEyMSwKLSAgICAxMjIsNCw0NiwxMTIsMTIxLDk5LDc4LDIxOCwxMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsCisgICAgMCwxMTUsMjAsMCwwLDAsMTE2LDAsMTI0LDAsMTMxLDEsMTAwLDEsNjQsMCwKKyAgICAxMDYsMSwxMDAsMiwxMDAsMywxMzEsMiw4MywwLDQxLDQsMTIyLDQyLDY3LDExMSwKKyAgICAxMTAsMTE4LDEwMSwxMTQsMTE2LDMyLDk3LDMyLDUxLDUwLDQ1LDk4LDEwNSwxMTYsMzIsMTA1LAorICAgIDExMCwxMTYsMTAxLDEwMywxMDEsMTE0LDMyLDExNiwxMTEsMzIsMTA4LDEwNSwxMTYsMTE2LDEwOCwxMDEsCisgICAgNDUsMTAxLDExMCwxMDAsMTA1LDk3LDExMCw0NiwxMDgsMywwLDAsMCwyNTUsMTI3LDI1NSwKKyAgICAxMjcsMywwLDIzMyw0LDAsMCwwLDIxOCw2LDEwOCwxMDUsMTE2LDExNiwxMDgsMTAxLAorICAgIDQxLDIsMjE4LDMsMTA1LDExMCwxMTYsMjE4LDgsMTE2LDExMSw5NSw5OCwxMjEsMTE2LDEwMSwKKyAgICAxMTUsNDEsMSwyMTgsMSwxMjAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDYsMCwwLDAsMjE4LDcsOTUsMTE5LDk1LDEwOCwxMTEsMTEwLDEwMyw0NywwLAorICAgIDAsMCwxMTUsMiwwLDAsMCwwLDIsMTE0LDE5LDAsMCwwLDk5LDEsCisgICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDEyLDAsMCwwLDExNiwwLDEwNiwxLDEyNCwwLDEwMCwxLAorICAgIDEzMSwyLDgzLDAsNDEsMiwxMjIsNDcsNjcsMTExLDExMCwxMTgsMTAxLDExNCwxMTYsMzIsCisgICAgNTIsMzIsOTgsMTIxLDExNiwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsMTA4LDEwNSwxMTYsMTE2LDEwOCwKKyAgICAxMDEsNDUsMTAxLDExMCwxMDAsMTA1LDk3LDExMCwzMiwxMTYsMTExLDMyLDk3LDExMCwzMiwxMDUsCisgICAgMTEwLDExNiwxMDEsMTAzLDEwMSwxMTQsNDYsMTE0LDE1LDAsMCwwLDQxLDIsMTE0LDE2LAorICAgIDAsMCwwLDIxOCwxMCwxMDIsMTE0LDExMSwxMDksOTUsOTgsMTIxLDExNiwxMDEsMTE1LDQxLAorICAgIDEsOTAsOSwxMDUsMTEwLDExNiw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDcsOTUsMTE0LDk1LAorICAgIDEwOCwxMTEsMTEwLDEwMyw1MiwwLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTE0LAorICAgIDIxLDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwKKyAgICAwLDMsMCwwLDAsNzEsMCwwLDAsMTE1LDIwLDAsMCwwLDExNiwwLAorICAgIDEwNiwxLDEwMCwxLDEwMCwyLDEzMiwwLDEyNCwwLDY4LDAsMTMxLDEsMTMxLDEsCisgICAgODMsMCw0MSwzLDEyMiwzMSw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsCisgICAgMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTA2LDExMSwKKyAgICAxMDUsMTEwLDQwLDQxLDQ2LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDQsMCwwLDAsODMsMCwwLDAsMTE1LDI2LDAsMCwwLDEwMywKKyAgICAwLDEyNCwwLDkzLDE4LDEyNSwxLDEyNCwxLDExNCw0LDEyNCwxLDEwNiwwLDExNiwKKyAgICAxLDEzMSwxLDE0NSwyLDExMyw0LDgzLDAsMTE0LDQsMCwwLDAsNDEsMiwKKyAgICAyMTgsNiwxMTQsMTE1LDExNiwxMTQsMTA1LDExMiwyMTgsMTUsMTEyLDk3LDExNiwxMDQsOTUsMTE1LAorICAgIDEwMSwxMTIsOTcsMTE0LDk3LDExNiwxMTEsMTE0LDExNSw0MSwyLDIxOCwyLDQ2LDQ4LDIxOCwKKyAgICA0LDExMiw5NywxMTQsMTE2LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA2LDAsMCwwLDI1MCwxMCw2MCwxMDgsMTA1LDExNSwxMTYsOTksMTExLDEwOSwxMTIsNjIsCisgICAgNTksMCwwLDAsMTE1LDIsMCwwLDAsNiwxLDEyMiwzMCw5NSwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSwxMDYsMTExLDEwNSwxMTAsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLAorICAgIDQ2LDYwLDEwOCwxMDUsMTE1LDExNiw5OSwxMTEsMTA5LDExMiw2Miw0MSwyLDIxOCw4LDExMiwKKyAgICA5NywxMTYsMTA0LDk1LDExNSwxMDEsMTEyLDIxOCw0LDEwNiwxMTEsMTA1LDExMCw0MSwxLDIxOCwKKyAgICAxMCwxMTIsOTcsMTE2LDEwNCw5NSwxMTIsOTcsMTE0LDExNiwxMTUsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEwLDk1LDExMiw5NywxMTYsCisgICAgMTA0LDk1LDEwNiwxMTEsMTA1LDExMCw1NywwLDAsMCwxMTUsNCwwLDAsMCwwLAorICAgIDIsMTAsMSwxMTQsMzAsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwKKyAgICAwLDUsMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsOTYsMCwKKyAgICAwLDAsMTE2LDAsMTE2LDEsMTMxLDEsMTAwLDEsMTA3LDIsMTE0LDM2LDEyNCwwLAorICAgIDEwNiwyLDExNiwzLDEzMSwxLDkyLDMsMTI1LDEsMTI1LDIsMTI1LDMsMTI0LDEsCisgICAgMTI0LDMsMTAyLDIsODMsMCwxMjAsNTAsMTE2LDQsMTI0LDAsMTMxLDEsNjgsMCwKKyAgICA5MywzOCwxMjUsNCwxMjQsNCwxMTYsMSwxMDcsNiwxMTQsNDYsMTI0LDAsMTA2LDUsCisgICAgMTI0LDQsMTAwLDEsMTAwLDIsMTQxLDIsOTIsMiwxMjUsMSwxMjUsMywxMjQsMSwKKyAgICAxMjQsMywxMDIsMiw4MywwLDExMyw0Niw4NywwLDEwMCwzLDEyNCwwLDEwMiwyLAorICAgIDgzLDAsNDEsNCwxMjIsMzIsODIsMTAxLDExMiwxMDgsOTcsOTksMTAxLDEwOSwxMDEsMTEwLAorICAgIDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LDExNSwxMTIsCisgICAgMTA4LDEwNSwxMTYsNDAsNDEsNDYsMjMzLDEsMCwwLDAsNDEsMSw5MCw4LDEwOSwKKyAgICA5NywxMjAsMTE1LDExMiwxMDgsMTA1LDExNiwyMTgsMCw0MSw2LDIxOCwzLDEwOCwxMDEsMTEwLAorICAgIDExNCwyMywwLDAsMCwyMTgsMTAsMTE0LDExMiw5NywxMTQsMTE2LDEwNSwxMTYsMTA1LDExMSwKKyAgICAxMTAsMTE0LDI3LDAsMCwwLDIxOCw4LDExNCwxMDEsMTE4LDEwMSwxMTQsMTE1LDEwMSwxMDAsCisgICAgMjE4LDYsMTE0LDExNSwxMTIsMTA4LDEwNSwxMTYsNDEsNSwyMTgsNCwxMTIsOTcsMTE2LDEwNCwKKyAgICA5MCw1LDEwMiwxMTQsMTExLDExMCwxMTYsMjE4LDEsOTUsMjE4LDQsMTE2LDk3LDEwNSwxMDgsCisgICAgMTE0LDE4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA2LDAsMCwwLDIxOCwxMSw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTEyLDEwOCwxMDUsCisgICAgMTE2LDYzLDAsMCwwLDExNSwxNiwwLDAsMCwwLDIsMTIsMSwxNiwxLAorICAgIDgsMSwxNCwxLDgsMSwxOCwxLDEyLDEsMTE0LDQwLDAsMCwwLDk5LAorICAgIDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDEwLDAsMCwwLDExNiwwLDEwNiwxLDEyNCwwLDEzMSwKKyAgICAxLDgzLDAsNDEsMSwxMjIsMTI2LDgzLDExNiw5NywxMTYsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTEyLDk3LDExNiwxMDQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzcsOTcsMTAwLDEwMSwzMiwKKyAgICA5NywzMiwxMTUsMTAxLDExMiw5NywxMTQsOTcsMTE2LDEwMSwzMiwxMDIsMTE3LDExMCw5OSwxMTYsCisgICAgMTA1LDExMSwxMTAsMzIsMTE2LDExMSwzMiwxMDksOTcsMTA3LDEwMSwzMiwxMDUsMTE2LDMyLDEwMSwKKyAgICA5NywxMTUsMTA1LDEwMSwxMTQsMzIsMTE2LDExMSwzMiwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsCisgICAgMTAxLDMyLDEwNSwxMTAsMzIsMTAxLDEyMCwxMTIsMTAxLDExNCwxMDUsMTA5LDEwMSwxMTAsMTE2LDExNSwKKyAgICAxMCwzMiwzMiwzMiwzMiw0MCwxMDEsNDYsMTAzLDQ2LDMyLDk5LDk3LDk5LDEwNCwxMDEsCisgICAgMzIsMTE1LDExNiw5NywxMTYsMzIsMTE0LDEwMSwxMTUsMTE3LDEwOCwxMTYsMTE1LDQxLDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDQxLDIsMTE0LDMsMCwwLDAsOTAsNCwxMTUsMTE2LAorICAgIDk3LDExNiw0MSwxLDExNCwzNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTAsOTUsMTEyLDk3LDExNiwxMDQsOTUsCisgICAgMTE1LDExNiw5NywxMTYsNzUsMCwwLDAsMTE1LDIsMCwwLDAsMCw3LDExNCwKKyAgICA0MSwwLDAsMCw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsCisgICAgMCwxMSwwLDAsMCw2NywwLDAsMCwxMTUsNDgsMCwwLDAsMTIxLDEyLAorICAgIDExNiwwLDEyNCwwLDEzMSwxLDEyNSwyLDg3LDAsMTEwLDIwLDQsMCwxMTYsMSwKKyAgICAxMDcsMTAsMTE0LDMyLDEsMCwxLDAsMSwwLDEwMCwxLDgzLDAsODgsMCwKKyAgICAxMjQsMiwxMDYsMiwxMDAsMiw2NCwwLDEyNCwxLDEwNywyLDgzLDAsNDEsMywKKyAgICAxMjIsNDksODQsMTAxLDExNSwxMTYsMzIsMTE5LDEwNCwxMDEsMTE2LDEwNCwxMDEsMTE0LDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LAorICAgIDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMDEsMzIsMTE2LDEyMSwKKyAgICAxMTIsMTAxLDQ2LDcwLDEwNSwwLDI0MCwwLDAsNDEsMywxMTQsNDEsMCwwLDAsCisgICAgMjE4LDcsNzksODMsNjksMTE0LDExNCwxMTEsMTE0LDIxOCw3LDExNSwxMTYsOTUsMTA5LDExMSwKKyAgICAxMDAsMTAxLDQxLDMsMTE0LDM3LDAsMCwwLDIxOCw0LDEwOSwxMTEsMTAwLDEwMSw5MCwKKyAgICA5LDExNSwxMTYsOTcsMTE2LDk1LDEwNSwxMTAsMTAyLDExMSwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTgsOTUsMTEyLDk3LDExNiwxMDQsCisgICAgOTUsMTA1LDExNSw5NSwxMDksMTExLDEwMCwxMDEsOTUsMTE2LDEyMSwxMTIsMTAxLDg1LDAsMCwKKyAgICAwLDExNSwxMCwwLDAsMCwwLDIsMiwxLDEyLDEsMTQsMSw2LDEsCisgICAgMTE0LDQ1LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsCisgICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDEwLDAsMCwwLDExNiwKKyAgICAwLDEyNCwwLDEwMCwxLDEzMSwyLDgzLDAsNDEsMiwxMjIsMzEsODIsMTAxLDExMiwKKyAgICAxMDgsOTcsOTksMTAxLDEwOSwxMDEsMTEwLDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTEsMTE1LDQ2LAorICAgIDExMiw5NywxMTYsMTA0LDQ2LDEwNSwxMTUsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwNSwwLDEyOCwwLAorICAgIDAsNDEsMSwxMTQsNDUsMCwwLDAsNDEsMSwxMTQsMzcsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEyLAorICAgIDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMTUsMTAyLDEwNSwxMDgsMTAxLDk0LDAsMCwwLAorICAgIDExNSwyLDAsMCwwLDAsMiwxMTQsNDYsMCwwLDAsOTksMSwwLDAsCisgICAgMCwwLDAsMCwwLDEsMCwwLDAsMywwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsMjIsMCwwLDAsMTI0LDAsMTE1LDEyLDExNiwwLDEwNiwxLDEzMSwwLAorICAgIDEyNSwwLDExNiwyLDEyNCwwLDEwMCwxLDEzMSwyLDgzLDAsNDEsMiwxMjIsMzAsCisgICAgODIsMTAxLDExMiwxMDgsOTcsOTksMTAxLDEwOSwxMDEsMTEwLDExNiwzMiwxMDIsMTExLDExNCwzMiwKKyAgICAxMTEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LDEwNSwxMTUsMTAwLDEwNSwxMTQsNDYsMTA1LDAsCisgICAgNjQsMCwwLDQxLDMsMTE0LDMsMCwwLDAsMjE4LDYsMTAzLDEwMSwxMTYsOTksCisgICAgMTE5LDEwMCwxMTQsNDUsMCwwLDAsNDEsMSwxMTQsMzcsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDExLDk1LAorICAgIDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMTUsMTAwLDEwNSwxMTQsOTksMCwwLDAsMTE1LDYsCisgICAgMCwwLDAsMCwyLDQsMSw4LDEsMTE0LDQ4LDAsMCwwLDIzMywxODIsCisgICAgMSwwLDAsOTksMywwLDAsMCwwLDAsMCwwLDYsMCwwLDAsCisgICAgMTcsMCwwLDAsNjcsMCwwLDAsMTE1LDE2MiwwLDAsMCwxMDAsMSwxMDYsCisgICAgMCwxMjQsMCwxMTYsMSwxMjQsMCwxMzEsMSwxMzEsMiwxMjUsMywxMTYsMiwxMDYsCisgICAgMywxMjQsMywxMTYsMiwxMDYsNCwxMTYsMiwxMDYsNSw2NiwwLDExNiwyLDEwNiwKKyAgICA2LDY2LDAsMTI0LDIsMTAwLDIsNjQsMCwxMzEsMywxMjUsNCwxMjEsNTAsMTE2LAorICAgIDcsMTA2LDgsMTI0LDQsMTAwLDMsMTMxLDIsMTQzLDE2LDEyNSw1LDEyNCw1LDEwNiwKKyAgICA5LDEyNCwxLDEzMSwxLDEsMCw4NywwLDEwMCw0LDgxLDAsODIsMCw4OCwKKyAgICAwLDExNiwyLDEwNiwxMCwxMjQsMywxMjQsMCwxMzEsMiwxLDAsODcsMCwxMTAsCisgICAgNTgsNCwwLDExNiwxMSwxMDcsMTAsMTE0LDE1NiwxLDAsMSwwLDEsMCwxMjEsCisgICAgMTQsMTE2LDIsMTA2LDEyLDEyNCwzLDEzMSwxLDEsMCw4NywwLDExMCwyMCw0LAorICAgIDAsMTE2LDExLDEwNywxMCwxMTQsMTQ4LDEsMCwxLDAsMSwwLDg5LDAsMTEwLAorICAgIDIsODgsMCwxMzAsMCw4OSwwLDExMCwyLDg4LDAsMTAwLDQsODMsMCw0MSwKKyAgICA1LDEyMiwxNjIsNjYsMTAxLDExNSwxMTYsNDUsMTAxLDEwMiwxMDIsMTExLDExNCwxMTYsMzIsMTAyLAorICAgIDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDExNiwxMTEsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwKKyAgICAzMiwxMDAsOTcsMTE2LDk3LDMyLDExNiwxMTEsMzIsOTcsMzIsMTEyLDk3LDExNiwxMDQsMzIsCisgICAgOTcsMTE2LDExMSwxMDksMTA1LDk5LDk3LDEwOCwxMDgsMTIxLDQ2LDEwLDMyLDMyLDMyLDMyLAorICAgIDY2LDEwMSwzMiwxMTIsMTE0LDEwMSwxMTIsOTcsMTE0LDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDQsCisgICAgOTcsMTEwLDEwMCwxMDgsMTAxLDMyLDk3LDMyLDcwLDEwNSwxMDgsMTAxLDY5LDEyMCwxMDUsMTE1LAorICAgIDExNiwxMTUsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMDIsMzIsOTksMTExLDExMCw5OSwxMTcsCisgICAgMTE0LDExNCwxMDEsMTEwLDExNiwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDEwMiwKKyAgICAzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwxMTYsMTAxLDEwOSwxMTIsMTExLDExNCw5NywKKyAgICAxMTQsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDk3LDExNiwxMTYsMTAxLDEwOSwKKyAgICAxMTIsMTE2LDEwMSwxMDAsNDYsMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LDEwNSwxODIsMSwwLAorICAgIDAsOTAsMiwxMTksOTgsNzgsNDEsMTMsMjE4LDYsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwKKyAgICAyMTgsMiwxMDUsMTAwLDExNCwzLDAsMCwwLDkwLDQsMTExLDExMiwxMDEsMTEwLDkwLAorICAgIDYsNzksOTUsNjksODgsNjcsNzYsOTAsNyw3OSw5NSw2Nyw4Miw2OSw2NSw4NCwKKyAgICA5MCw4LDc5LDk1LDg3LDgyLDc5LDc4LDc2LDg5LDIxOCwzLDk1LDEwNSwxMTEsMjE4LAorICAgIDYsNzAsMTA1LDEwOCwxMDEsNzMsNzksMjE4LDUsMTE5LDExNCwxMDUsMTE2LDEwMSwyMTgsNywKKyAgICAxMTQsMTAxLDExMiwxMDgsOTcsOTksMTAxLDExNCw0MiwwLDAsMCw5MCw2LDExNywxMTAsCisgICAgMTA4LDEwNSwxMTAsMTA3LDQxLDYsMTE0LDM3LDAsMCwwLDIxOCw0LDEwMCw5NywxMTYsCisgICAgOTcsMTE0LDQ0LDAsMCwwLDkwLDgsMTEyLDk3LDExNiwxMDQsOTUsMTE2LDEwOSwxMTIsCisgICAgOTAsMiwxMDIsMTAwLDIxOCw0LDEwMiwxMDUsMTA4LDEwMSwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTMsOTUsMTE5LDExNCwxMDUsMTE2LAorICAgIDEwMSw5NSw5NywxMTYsMTExLDEwOSwxMDUsOTksMTA2LDAsMCwwLDExNSwyNiwwLDAsCisgICAgMCwwLDUsMTYsMSw2LDEsMjYsMSwyLDMsMTQsMSwyMCwxLDE2LAorICAgIDEsMTQsMSwyLDEsMTQsMSwxNCwxLDYsMSwxMTQsNTgsMCwwLDAsCisgICAgMTA1LDQ4LDEzLDAsMCwyMzMsMiwwLDAsMCwxMTQsMTUsMCwwLDAsMTE1LAorICAgIDIsMCwwLDAsMTMsMTAsOTAsMTEsOTUsOTUsMTEyLDEyMSw5OSw5Nyw5OSwxMDQsCisgICAgMTAxLDk1LDk1LDEyMiw0LDExMSwxMTIsMTE2LDQ1LDEyMiwzLDQ2LDExMiwxMjEsMTIyLDQsCisgICAgNDYsMTEyLDEyMSw5OSw3OCw0MSwxLDIxOCwxMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsCiAgICAgOTcsMTE2LDEwNSwxMTEsMTEwLDk5LDIsMCwwLDAsMSwwLDAsMCwxMSwwLAotICAgIDAsMCw2LDAsMCwwLDY3LDAsMCwwLDExNSw4NywxLDAsMCwxMjQsCi0gICAgMSwwLDEwMCwxLDAsMTA3LDksMCwxMTQsNzYsMCwxMTYsMCwwLDEwNiwxLAotICAgIDAsMTAwLDIsMCwxMTYsMiwwLDEzMSwyLDAsMSwxMjQsMiwwLDEwMCwxLAotICAgIDAsMTA3LDksMCwxMTQsNTgsMCwxMDAsMywwLDEyNSwzLDAsMTE2LDMsMCwKLSAgICAxMjQsMywwLDEzMSwxLDAsMTMwLDEsMCwxMjQsMSwwLDExNCw3MCwwLDEwMCwKLSAgICA0LDAsMTEwLDMsMCwxMDAsNSwwLDEyNSwyLDAsMTE2LDQsMCwxMjQsMCwKLSAgICAwLDEzMSwxLDAsOTIsMiwwLDEyNSw0LDAsMTI1LDUsMCwxMjQsNSwwLAotICAgIDEwNiw1LDAsMTAwLDYsMCwxMzEsMSwwLDkyLDMsMCwxMjUsNiwwLDEyNSwKLSAgICA3LDAsMTI1LDgsMCwxMTYsNiwwLDEwNiw3LDAsMTA2LDgsMCwxMjUsOSwKLSAgICAwLDEyNCw5LDAsMTAwLDEsMCwxMDcsOCwwLDExNCwxNTQsMCwxMTYsOSwwLAotICAgIDEwMCw3LDAsMTMxLDEsMCwxMzAsMSwwLDEwMCw0LDAsMTA2LDEwLDAsMTI0LAotICAgIDYsMCwxMTQsMTcyLDAsMTI0LDYsMCwxMTAsMywwLDEyNCw4LDAsMTI0LDcsCi0gICAgMCwxMjQsOSwwLDEwMywzLDAsMTMxLDEsMCwxMjUsMTAsMCwxMjQsMiwwLAotICAgIDEwMCwxLDAsMTA3LDgsMCwxMTQsMjQxLDAsMTE2LDYsMCwxMDYsMTEsMCwxMDYsCi0gICAgMTIsMCwxMDAsOCwwLDEwNywyLDAsMTE0LDIyOSwwLDEwMCw0LDAsMTI1LDIsCi0gICAgMCwxMTAsMTIsMCwxMTYsNiwwLDEwNiwxMSwwLDEwNiwxMiwwLDEyNSwyLDAsCi0gICAgMTE2LDEzLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwyLDAsMTI0LDIsMCwxMDAsCi0gICAgNCwwLDEwNywzLDAsMTE0LDYzLDEsMTI0LDIsMCwxMDYsMTQsMCwxMzEsMCwKLSAgICAwLDExNSw0MiwxLDExNiwxNSwwLDEwMCw5LDAsMTA2LDE2LDAsMTI0LDIsMCwKLSAgICAxMzEsMSwwLDEzMSwxLDAsMTMwLDEsMCwxMDAsMTAsMCwxMDYsMTYsMCwxMjQsCi0gICAgMTAsMCwxMTYsMTcsMCwxMjQsMiwwLDEzMSwzLDAsMTI1LDEwLDAsMTE2LDE4LAotICAgIDAsMTI0LDQsMCwxMTYsMTksMCwxMjQsMTAsMCwxMTYsMjAsMCwxMDAsOCwwLAotICAgIDI1LDIzLDEzMSwzLDAsODMsNDEsMTEsOTcsMjU0LDIsMCwwLDcxLDEwNSwxMTgsCi0gICAgMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDk3LAotICAgIDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDQ0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsCi0gICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTA1LDExNiwKLSAgICAxMTUsMzIsNDYsMTEyLDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsCi0gICAgMzIsMzIsODQsMTA0LDEwMSwzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDAsCi0gICAgMTExLDEwMSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsCi0gICAgMTAxLDEyMCwxMDUsMTE1LDExNiw1OSwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTE1LDEwNSwxMDksMTEyLAotICAgIDEwOCwxMjEsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiwKLSAgICA5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsNDYsCi0gICAgMTEyLDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTksOTcsMTA4LDk5LDExNywxMDgsOTcsCi0gICAgMTE2LDEwMSwxMDAsMzIsOTcsMTE1LDMyLDEwNSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsNDYsMTEyLAotICAgIDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE5LDEwMSwxMTQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwzOSwKLSAgICAxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDExMiw5NywKLSAgICAxMTQsOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiw5OSwxMTEsMTEwLDExNiwxMTQsMTExLDEwOCwxMTUsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNCwxMDEsMTE1LDExNywxMDksMTAxLDEwMCwzMiwxMTEsMTEyLAotICAgIDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwOCwxMDEsMTE4LDEwMSwxMDgsCi0gICAgMzIsMTExLDEwMiwxMCwzMiwzMiwzMiwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSwKLSAgICA5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMzIsNzMsMTAyLDMyLDM5LDExMSwKLSAgICAxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTA1LDExNSwzMiwKLSAgICAxMTAsMTExLDExNiwzMiw3OCwxMTEsMTEwLDEwMSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTE2LAotICAgIDExNCwxMDUsMTEwLDEwMywzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiw5NywxMTYsCi0gICAgMTA1LDExMSwxMTAsMTAsMzIsMzIsMzIsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiw5NywKLSAgICAxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTA1LDExNSwzMiwxMTYsOTcsMTA3LDEwMSwxMTAsCi0gICAgMzIsOTcsMTEwLDEwMCwzMiwxMTgsMTAxLDExNCwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDExNiwxMTEsCi0gICAgMzIsOTgsMTAxLDMyLDk3LDEwOCwxMTIsMTA0LDk3LDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LAotICAgIDMyLDQwLDEwMSwxMDgsMTE1LDEwMSwzMiw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwKLSAgICAxMTQsMTAsMzIsMzIsMzIsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQxLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTAwLDEwMSw5OCwxMTcsMTAzLAotICAgIDk1LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsMzIsMTEyLDk3LDExNCw5NywxMDksMTAxLAotICAgIDExNiwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLAotICAgIDEwMCw0NiwzMiw3MywxMDIsMzIsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwKLSAgICAxMTQsMTA1LDEwMCwxMDEsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw3OCwxMTEsMTEwLDEwMSwKLSAgICA0NCwxMCwzMiwzMiwzMiwzMiw5NywzMiw4NCwxMTQsMTE3LDEwMSwzMiwxMTgsOTcsMTA4LAotICAgIDExNywxMDEsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsOTcsMTA5LDEwMSwzMiw5NywKLSAgICAxMTUsMzIsMTE1LDEwMSwxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksCi0gICAgMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMDEsMTA5LDExMiwxMTYsMTIxLDMyLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDEwLDMyLDMyLDMyLAotICAgIDMyLDExOSwxMDQsMTA1LDEwOCwxMDEsMzIsOTcsMzIsNzAsOTcsMTA4LDExNSwxMDEsMzIsMTE4LAotICAgIDk3LDEwOCwxMTcsMTAxLDMyLDEwNSwxMTUsMzIsMTAxLDExMywxMTcsMTA1LDExOCw5NywxMDgsMTAxLAotICAgIDExMCwxMTYsMzIsMTE2LDExMSwzMiwxMTUsMTAxLDExNiwxMTYsMTA1LDExMCwxMDMsMzIsMzksMTExLAotICAgIDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMTYsMTExLDMyLAotICAgIDM5LDQ5LDM5LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDczLDEwMiwzMiwxMTUsMTIxLDExNSwKLSAgICA0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsCi0gICAgOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwKLSAgICAxMDEsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwKLSAgICAxMDEsMTEwLDExNiwxMDEsMTAwLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywKLSAgICAxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTIyLDcwLDExNiwxMDQsCi0gICAgMTAxLDMyLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLAotICAgIDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsCi0gICAgMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNTksMzIsMTE3LDExNSwxMDEsMzIsMzksMTExLAotICAgIDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMDUsMTEwLDExNSwKLSAgICAxMTYsMTAxLDk3LDEwMCwxMjIsNTAsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwKLSAgICAxMTQsMTA1LDEwMCwxMDEsMzIsMTExLDExNCwzMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsCi0gICAgMTE2LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsMTE1LDEwMSwxMTYsCi0gICAgMzIsMTE2LDExMSwzMiw3OCwxMTEsMTEwLDEwMSwxMTQsMzIsMCwwLDAsMTE0LDMxLDAsCi0gICAgMCwwLDIxOCwxLDQ2LDEyMiwzNiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLAotICAgIDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwKLSAgICAxMTYsOTcsMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMjMzLDAsMCwwLDAsCi0gICAgMTIyLDI0LDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMTA4LAotICAgIDExMiwxMDQsOTcsMTEwLDExNywxMDksMTAxLDExNCwxMDUsOTksMTIyLDcsMTIzLDEyNSw0NiwxMjMsCi0gICAgMTI1LDEyMywxMjUsNDEsMjEsMjE4LDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LAotICAgIDIxOCw0LDExOSw5NywxMTQsMTEwLDIxOCwxOCw2OCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LAotICAgIDEwNSwxMTEsMTEwLDg3LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMjE4LDksODQsMTIxLDExMiwxMDEsCi0gICAgNjksMTE0LDExNCwxMTEsMTE0LDExNCw0MCwwLDAsMCwxMTQsMzQsMCwwLDAsMTE0LAotICAgIDgsMCwwLDAsMjE4LDE0LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LAotICAgIDExNiwxMDUsMTExLDExMCwyMTgsOSw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywxMDMsMjE4LAotICAgIDE5LDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDY5LAotICAgIDExNCwxMTQsMTExLDExNCwxMTQsMjgsMCwwLDAsMjE4LDUsMTAyLDEwOCw5NywxMDMsMTE1LAotICAgIDIxOCw4LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwxMDEsMjE4LDMsMTE1LDExNiwxMTQsMjE4LAotICAgIDcsMTA1LDExNSw5NywxMDgsMTEwLDExNywxMDksMjE4LDEwLDg2LDk3LDEwOCwxMTcsMTAxLDY5LAotICAgIDExNCwxMTQsMTExLDExNCwxMTQsNDksMCwwLDAsMjE4LDQsOTUsNzksODAsODQsMTE0LAotICAgIDMwLDAsMCwwLDIxOCw4LDk1LDgwLDg5LDY3LDY1LDY3LDcyLDY5LDIxOCwxNywKLSAgICA2Niw4OSw4NCw2OSw2Nyw3OSw2OCw2OSw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSwKLSAgICA4Myw0MSwxMSwxMTQsMzcsMCwwLDAsOTAsMTQsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LAotICAgIDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsMTE0LDU5LDAsMCwwLDIxOCw3LDEwOSwKLSAgICAxMDEsMTE1LDExNSw5NywxMDMsMTAxLDIxOCw0LDEwNCwxMDEsOTcsMTAwLDExNCwzOSwwLDAsCi0gICAgMCw5MCw0LDk4LDk3LDExNSwxMDEsMjE4LDMsMTE1LDEwMSwxMTIsMjE4LDQsMTE0LDEwMSwKLSAgICAxMTUsMTE2LDkwLDMsMTE2LDk3LDEwMyw5MCwxNSw5NywxMDgsMTA5LDExMSwxMTUsMTE2LDk1LAotICAgIDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNiwwLDAsMCwyMTgsMTcsOTksOTcsOTksMTA0LDEwMSw5NSwxMDIsCi0gICAgMTE0LDExMSwxMDksOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwyNTQsMCwwLDAsMTE1LDQ2LAotICAgIDAsMCwwLDAsMTgsMTIsMSw5LDEsNywxLDEyLDEsNiwxLDEyLAotICAgIDEsMTgsMSwxOCwxLDI0LDEsMTIsMSwxMiwxLDEyLDEsMzYsMSwxMiwKLSAgICAxLDE4LDEsOSwyLDEyLDEsMTIsMSwxMiwxLDEyLDEsMjEsMSwyMSwKLSAgICAxLDExNCw4MSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsOCwKLSAgICAwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSw2MiwxLDAsMCwKLSAgICAxMTYsMCwwLDEwNiwxLDAsMTA2LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LAotICAgIDMwLDAsMTE2LDMsMCwxMDAsMiwwLDEzMSwxLDAsMTMwLDEsMCwxMTYsNCwKLSAgICAwLDEyNCwwLDAsMTMxLDEsMCw5MiwyLDAsMTI1LDEsMCwxMjUsMiwwLAotICAgIDExNiw0LDAsMTI0LDEsMCwxMzEsMSwwLDkyLDIsMCwxMjUsMSwwLDEyNSwKLSAgICAzLDAsMTI0LDMsMCwxMTYsNSwwLDEwNywzLDAsMTE0LDEwMiwwLDExNiw2LAotICAgIDAsMTAwLDMsMCwxMDYsNywwLDExNiw1LDAsMTI0LDAsMCwxMzEsMiwwLAotICAgIDEzMSwxLDAsMTMwLDEsMCwxMjQsMiwwLDEwNiw4LDAsMTAwLDQsMCwxMzEsCi0gICAgMSwwLDEyNSw0LDAsMTI0LDQsMCwxMDAsMTEsMCwxMDcsNywwLDExNCwxNTMsCi0gICAgMCwxMTYsNiwwLDEwMCw3LDAsMTA2LDcsMCwxMjQsMiwwLDEzMSwxLDAsCi0gICAgMTMxLDEsMCwxMzAsMSwwLDExMCwxMjUsMCwxMjQsNCwwLDEwMCw2LDAsMTA3LAotICAgIDIsMCwxMTQsMjIsMSwxMjQsMiwwLDEwNiw5LDAsMTAwLDQsMCwxMDAsNSwKLSAgICAwLDEzMSwyLDAsMTAwLDEyLDAsMjUsMTI1LDUsMCwxMjQsNSwwLDEwNiwxMCwKLSAgICAwLDExNiwxMSwwLDEzMSwxLDAsMTE1LDIyMywwLDExNiw2LDAsMTAwLDgsMCwKLSAgICAxMDYsNywwLDExNiwxMSwwLDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLDEyNCwKLSAgICA1LDAsMTE2LDEyLDAsMTE2LDExLDAsMTMxLDEsMCwxMDAsMSwwLDEzMywyLAotICAgIDAsMjUsMTI1LDYsMCwxMjQsNiwwLDEwNiwxMywwLDEzMSwwLDAsMTE1LDIyLAotICAgIDEsMTE2LDYsMCwxMDAsOSwwLDEwNiw3LDAsMTI0LDUsMCwxMzEsMSwwLAotICAgIDEzMSwxLDAsMTMwLDEsMCwxMjQsMiwwLDEwNiwxNCwwLDEwMCw0LDAsMTMxLAotICAgIDEsMCwxMDAsMTAsMCwyNSwxMjUsNywwLDExNiwxNSwwLDEyNCwxLDAsMTI0LAotICAgIDcsMCwxMTYsMTYsMCwxMDAsMTAsMCwyNSwyMywxMzEsMiwwLDgzLDQxLDEzLAotICAgIDk3LDExMCwxLDAsMCw3MSwxMDUsMTE4LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAotICAgIDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiw5NywzMiw0NiwxMTIsMTIxLDk5LDQ2LDMyLDEwMiwKLSAgICAxMDUsMTA4LDEwMSw0NCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDEwNSwxMTYsMTE1LDMyLDQ2LDExMiwxMjEsMzIsCi0gICAgMTAyLDEwNSwxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsNDYsCi0gICAgMTEyLDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwxMTEsCi0gICAgMTE2LDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsNTksCi0gICAgMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExNSwxMDUsMTA5LDExMiwxMDgsMTIxLDMyLDExNCwxMDEsMTE2LAotICAgIDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLAotICAgIDEwLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsCi0gICAgMTAxLDMyLDk5LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMTAwLDMyLDExNiwxMTEsMzIsCi0gICAgOTksMTExLDExNCwxMTQsMTAxLDExNSwxMTIsMTExLDExMCwxMDAsMzIsMTE2LDExMSwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiw0NiwxMTIsMTIxLDk5LDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwzMiwzMiw3MywxMDIsCi0gICAgMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAwLDExMSwxMDEsMTE1LDEwLDMyLDMyLDMyLDMyLDExMCwKLSAgICAxMTEsMTE2LDMyLDk5LDExMSwxMTAsMTAyLDExMSwxMTQsMTA5LDMyLDExNiwxMTEsMzIsODAsNjksCi0gICAgODAsMzIsNTEsNDksNTIsNTUsNDcsNTIsNTYsNTYsMzIsMTAyLDExMSwxMTQsMTA5LDk3LAotICAgIDExNiw0NCwzMiw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTE5LDEwNSwKLSAgICAxMDgsMTA4LDMyLDk4LDEwMSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDMyLDczLDEwMiwKLSAgICAxMCwzMiwzMiwzMiwzMiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsCi0gICAgMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsCi0gICAgMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDc4LAotICAgIDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDY5LDExNCwxMTQsCi0gICAgMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsNzgsMTIyLDM2LDExNSwxMjEsMTE1LDQ2LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LAotICAgIDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCw0Niw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiwKLSAgICA5NywxMDMsMzIsMTA1LDExNSwzMiw3OCwxMTEsMTEwLDEwMSwxMjIsMzcsMTIzLDEyNSwzMiwxMTAsCi0gICAgMTExLDExNiwzMiw5OCwxMTEsMTE2LDExNiwxMTEsMTA5LDQ1LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsCi0gICAgMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsCi0gICAgMTI1LDExNCw2MCwwLDAsMCwxMTQsNTgsMCwwLDAsMjMzLDMsMCwwLDAsCi0gICAgMTIyLDMzLDEwMSwxMjAsMTEyLDEwMSw5OSwxMTYsMTAxLDEwMCwzMiwxMTEsMTEwLDEwOCwxMjEsMzIsCi0gICAgNTAsMzIsMTExLDExNCwzMiw1MSwzMiwxMDAsMTExLDExNiwxMTUsMzIsMTA1LDExMCwzMiwxMjMsCi0gICAgMzMsMTE0LDEyNSwxMjIsNTcsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLAotICAgIDExMCwzMiwxMTIsMTExLDExNCwxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMDIsMTA1LDEwOCwKLSAgICAxMDEsMTEwLDk3LDEwOSwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExNSwKLSAgICAxMTYsOTcsMTE0LDExNiwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTIzLDMzLDExNCwxMjUsMTIyLDUyLAotICAgIDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTA4LDEwMSwxMTgsCi0gICAgMTAxLDEwOCwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LAotICAgIDExMCwzMiw5NywxMDgsMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwzMiwxMTgsCi0gICAgOTcsMTA4LDExNywxMDEsMTE0LDYxLDAsMCwwLDYyLDIsMCwwLDAsMTE0LDU4LAotICAgIDAsMCwwLDExNCw4MiwwLDAsMCwyMzMsMjU0LDI1NSwyNTUsMjU1LDQxLDE3LDExNCwKLSAgICA4LDAsMCwwLDExNCw2NiwwLDAsMCwxMTQsNjcsMCwwLDAsMTE0LDY4LAotICAgIDAsMCwwLDExNCw0MCwwLDAsMCwxMTQsNzUsMCwwLDAsMTE0LDczLDAsCi0gICAgMCwwLDExNCw0OSwwLDAsMCwyMTgsNSw5OSwxMTEsMTE3LDExMCwxMTYsMTE0LDM2LAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsNzQsMCwwLDAsMTE0LDMzLDAsCi0gICAgMCwwLDExNCw3MiwwLDAsMCwyMTgsOSwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwKLSAgICAxMTEsMTEwLDExNCwzMCwwLDAsMCwyMTgsMTUsODMsNzksODUsODIsNjcsNjksOTUsCi0gICAgODMsODUsNzAsNzAsNzMsODgsNjksODMsNDEsOCwxMTQsMzcsMCwwLDAsMTE0LAotICAgIDc4LDAsMCwwLDkwLDE2LDExMiwxMjEsOTksOTcsOTksMTA0LDEwMSw5NSwxMDIsMTA1LAotICAgIDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTAsNywxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsOTAsCi0gICAgOSwxMDAsMTExLDExNiw5NSw5OSwxMTEsMTE3LDExMCwxMTYsMTE0LDU5LDAsMCwwLDkwLAotICAgIDksMTExLDExMiwxMTYsOTUsMTA4LDEwMSwxMTgsMTAxLDEwOCw5MCwxMyw5OCw5NywxMTUsMTAxLAotICAgIDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTcsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKLSAgICA5NSwxMDIsMTE0LDExMSwxMDksOTUsOTksOTcsOTksMTA0LDEwMSw0MiwxLDAsMCwxMTUsCi0gICAgNDQsMCwwLDAsMCw5LDE4LDEsMTIsMSwxOCwxLDE4LDEsMTIsMSwKLSAgICA5LDEsMTUsMSwxNSwxLDEyLDEsOSwxLDE1LDEsMTIsMSwyMiwxLAotICAgIDE1LDEsOSwxLDEyLDEsMjIsMSwxMiwxLDksMSwxMiwxLDE5LDEsCi0gICAgMTE0LDg3LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCw1LDAsCi0gICAgMCwwLDEyLDAsMCwwLDY3LDAsMCwwLDExNSwxNjQsMCwwLDAsMTE2LAotICAgIDAsMCwxMjQsMCwwLDEzMSwxLDAsMTAwLDEsMCwxMDcsMiwwLDExNCwyMiwKLSAgICAwLDEwMCwyLDAsODMsMTI0LDAsMCwxMDYsMSwwLDEwMCwzLDAsMTMxLDEsCi0gICAgMCw5MiwzLDAsMTI1LDEsMCwxMjUsMiwwLDEyNSwzLDAsMTI0LDEsMCwKLSAgICAxMiwxMTUsODEsMCwxMjQsMywwLDEwNiwyLDAsMTMxLDAsMCwxMDAsNywwLAotICAgIDEwMCw4LDAsMTMzLDIsMCwyNSwxMDAsNiwwLDEwNywzLDAsMTE0LDg1LDAsCi0gICAgMTI0LDAsMCw4MywxMjEsMTYsMCwxMTYsMywwLDEyNCwwLDAsMTMxLDEsMCwKLSAgICAxMjUsNCwwLDg3LDExMCw0MCwwLDQsMTE2LDQsMCwxMTYsNSwwLDEwMiwyLAotICAgIDAsMTA3LDEwLDAsMTE0LDE0MywwLDEsMSwxLDEyNCwwLDAsMTAwLDIsMCwKLSAgICAxMDAsOSwwLDEzMywyLDAsMjUsMTI1LDQsMCw4OSwxMTAsMSwwLDg4LDExNiwKLSAgICA2LDAsMTI0LDQsMCwxMzEsMSwwLDExNCwxNjAsMCwxMjQsNCwwLDgzLDEyNCwKLSAgICAwLDAsODMsNDEsMTAsMTIyLDE4OCw2NywxMTEsMTEwLDExOCwxMDEsMTE0LDExNiwzMiw5NywKLSAgICAzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTEyLAotICAgIDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiw5NywzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLAotICAgIDExMiw5NywxMTYsMTA0LDMyLDQwLDEwNSwxMDIsMzIsMTEyLDExMSwxMTUsMTE1LDEwNSw5OCwxMDgsCi0gICAgMTAxLDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwMiwxMTcsCi0gICAgMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LDExNSwzMiwxMTIsMTE3LAotICAgIDExNCwxMDEsMTA4LDEyMSwzMiwxMDIsMTExLDExNCwzMiw5OCw5Nyw5OSwxMDcsMTE5LDk3LDExNCwKLSAgICAxMDAsMTE1LDQ1LDk5LDExMSwxMDksMTEyLDk3LDExNiwxMDUsOTgsMTA1LDEwOCwxMDUsMTE2LDEyMSwKLSAgICAzMiwxMDIsMTExLDExNCwxMCwzMiwzMiwzMiwzMiw4MCwxMjEsNzMsMTA5LDExMiwxMTEsMTE0LAotICAgIDExNiw5NSw2OSwxMjAsMTAxLDk5LDY3LDExMSwxMDAsMTAxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgODcsMTA1LDExNiwxMDQsNzAsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LDQwLDQxLDMyLAotICAgIDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsNjcsMzIsNjUsODAsNzMsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsMTE0LDYxLDAsMCwwLDc4LDExNCw2MCwwLDAsMCwxMTQsODIsCi0gICAgMCwwLDAsMTE0LDMxLDAsMCwwLDkwLDIsMTEyLDEyMSwyMzMsMjUzLDI1NSwyNTUsCi0gICAgMjU1LDIzMywyNTUsMjU1LDI1NSwyNTUsMTE0LDg5LDAsMCwwLDQxLDcsMTE0LDMzLDAsCi0gICAgMCwwLDExNCwzNCwwLDAsMCwyMTgsNSwxMDgsMTExLDExOSwxMDEsMTE0LDExNCw4NywKLSAgICAwLDAsMCwxMTQsNjgsMCwwLDAsMTE0LDczLDAsMCwwLDExNCw0NiwwLAotICAgIDAsMCw0MSw1LDIxOCwxMyw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw5NSwxMTIsCi0gICAgOTcsMTE2LDEwNCwxMTQsODAsMCwwLDAsMTE0LDM4LDAsMCwwLDkwLDksMTAxLAotICAgIDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMjE4LDExLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDYsMCwwLDAsMjE4LDE1LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwKLSAgICAxMDEsMTAyLDEwNSwxMDgsMTAxLDc1LDEsMCwwLDExNSwyMCwwLDAsMCwwLDcsCi0gICAgMTgsMSw0LDEsMjQsMSwzNSwxLDQsMSwzLDEsMTYsMSwxOSwxLAotICAgIDIxLDEsMTE0LDkzLDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwKLSAgICAxLDAsMCwwLDExLDAsMCwwLDY3LDAsMCwwLDExNSw5MiwwLDAsCi0gICAgMCwxMjQsMCwwLDEwNiwwLDAsMTE2LDEsMCwxMTYsMiwwLDEzMSwxLDAsCi0gICAgMTMxLDEsMCwxMTQsNTksMCwxMjEsMTQsMCwxMTYsMywwLDEyNCwwLDAsMTMxLAotICAgIDEsMCw4Myw4NywxMTMsODgsMCw0LDExNiw0LDAsMTA3LDEwLDAsMTE0LDU1LAotICAgIDAsMSwxLDEsODksMTEzLDg4LDAsODgsMTEwLDI5LDAsMTI0LDAsMCwxMDYsCi0gICAgMCwwLDExNiwxLDAsMTE2LDUsMCwxMzEsMSwwLDEzMSwxLDAsMTE0LDg0LAotICAgIDAsMTI0LDAsMCw4MywxMDAsMCwwLDgzLDEwMCwwLDAsODMsNDEsMSw3OCwKLSAgICA0MSw2LDIxOCw4LDEwMSwxMTAsMTAwLDExNSwxMTksMTA1LDExNiwxMDQsMjE4LDUsMTE2LDExNywKLSAgICAxMTIsMTA4LDEwMSwxMTQsODYsMCwwLDAsMTE0LDgxLDAsMCwwLDExNCw2OCwwLAotICAgIDAsMCwxMTQsNzYsMCwwLDAsNDEsMSwyMTgsOCwxMDIsMTA1LDEwOCwxMDEsMTEwLAotICAgIDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKLSAgICAwLDAsMjE4LDExLDk1LDEwMywxMDEsMTE2LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk0LAotICAgIDEsMCwwLDExNSwxNiwwLDAsMCwwLDEsMjEsMSwzLDEsMTQsMSwKLSAgICAxMywxLDgsMSwyMSwxLDQsMiwxMTQsOTcsMCwwLDAsOTksMSwwLAotICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsMTEsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDYwLDAsMCwwLDEyMSwxOSwwLDExNiwwLDAsMTI0LDAsMCwKLSAgICAxMzEsMSwwLDEwNiwxLDAsMTI1LDEsMCw4NywxMTAsMjQsMCw0LDExNiwyLAotICAgIDAsMTA3LDEwLDAsMTE0LDQ1LDAsMSwxLDEsMTAwLDEsMCwxMjUsMSwwLAotICAgIDg5LDExMCwxLDAsODgsMTI0LDEsMCwxMDAsMiwwLDc5LDEyNSwxLDAsMTI0LAotICAgIDEsMCw4Myw0MSwzLDEyMiw1MSw2Nyw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDEwMSwzMiwxMTIsMTAxLDExNCwxMDksMTA1LDExNSwKLSAgICAxMTUsMTA1LDExMSwxMTAsMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDk4LDEyMSwxMTYsMTAxLAotICAgIDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMDUsMTgyLDEsMCwwLDIzMywKLSAgICAxMjgsMCwwLDAsNDEsMywxMTQsNDEsMCwwLDAsMTE0LDQzLDAsMCwwLAotICAgIDExNCw0MiwwLDAsMCw0MSwyLDExNCwzNywwLDAsMCwxMTQsNDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsCi0gICAgMjE4LDEwLDk1LDk5LDk3LDEwOCw5OSw5NSwxMDksMTExLDEwMCwxMDEsMTA2LDEsMCwwLAotICAgIDExNSwxMiwwLDAsMCwwLDIsMywxLDE5LDEsMTMsMSwxMSwzLDEwLAotICAgIDEsMTE0LDk5LDAsMCwwLDIxOCw5LDExOCwxMDEsMTE0LDk4LDExMSwxMTUsMTA1LDExNiwKLSAgICAxMjEsMTE0LDMxLDAsMCwwLDk5LDEsMCwwLDAsMSwwLDAsMCwzLAotICAgIDAsMCwwLDQsMCwwLDAsNzEsMCwwLDAsMTE1LDc1LDAsMCwwLAotICAgIDExNiwwLDAsMTA2LDEsMCwxMDYsMiwwLDEyNCwxLDAsMTA3LDUsMCwxMTQsCi0gICAgNzEsMCwxMjQsMCwwLDEwNiwzLDAsMTAwLDYsMCwxMzEsMSwwLDExNSw0MywKLSAgICAwLDEwMCwzLDAsMTI0LDAsMCwyMywxMjUsMCwwLDExNiw0LDAsMTI0LDAsCi0gICAgMCwxMDYsNSwwLDEyNCwyLDAsMTQwLDAsMCwxMDAsNCwwLDExNiwwLDAsCi0gICAgMTA2LDYsMCwxMzEsMSwxLDEsMTAwLDUsMCw4Myw0MSw3LDEyMiw2MSw4MCwKLSAgICAxMTQsMTA1LDExMCwxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsCi0gICAgMzIsMTE2LDExMSwzMiwxMTUsMTE2LDEwMCwxMDEsMTE0LDExNCwzMiwxMDUsMTAyLDMyLDQ1LDExOCwKLSAgICA0Nyw4MCw4OSw4NCw3Miw3OSw3OCw4Niw2OSw4Miw2Niw3OSw4Myw2OSwzMiwxMDUsCi0gICAgMTE1LDMyLDExNiwxMTcsMTE0LDExMCwxMDEsMTAwLDMyLDExMSwxMTAsNDYsMjUwLDEsMzUsMjUwLAotICAgIDcsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTIyLDIsMzUsMzIsMTE0LDU2LDAsMCwKLSAgICAwLDc4LDQxLDIsMTE0LDEwMSwwLDAsMCwxMTQsMTAyLDAsMCwwLDQxLDcsCi0gICAgMTE0LDgsMCwwLDAsMTE0LDY5LDAsMCwwLDIxOCw3LDExOCwxMDEsMTE0LDk4LAotICAgIDExMSwxMTUsMTAxLDExNCwxMCwwLDAsMCwyMTgsNSwxMTIsMTE0LDEwNSwxMTAsMTE2LDExNCwKLSAgICA0OSwwLDAsMCwyMTgsNiwxMTUsMTE2LDEwMCwxMDEsMTE0LDExNCw0MSwzLDExNCw3NywKLSAgICAwLDAsMCwxMTQsMTAwLDAsMCwwLDIxOCw0LDk3LDExNCwxMDMsMTE1LDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNiw5NSwKLSAgICAxMTgsMTAxLDExNCw5OCwxMTEsMTE1LDEwMSw5NSwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTgsCi0gICAgMSwwLDAsMTE1LDgsMCwwLDAsMCwyLDE4LDEsMTUsMSwxMCwxLAotICAgIDExNCwxMDcsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwKLSAgICAwLDAsMTEsMCwwLDAsMywwLDAsMCwxMTUsODQsMCwwLDAsMTAwLAotICAgIDEsMCwxMzUsMCwwLDEwMiwxLDAsMTAwLDIsMCwxMDAsMywwLDEzNCwxLAotICAgIDAsMTI1LDEsMCwxMjEsMTMsMCwxMTYsMCwwLDEwNiwxLDAsMTI1LDIsMCwKLSAgICA4NywxMTAsMzAsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDY2LDAsMSwxLAotICAgIDEsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsMTI1LDIsMCw4OSwxMTAsMSwKLSAgICAwLDg4LDEyNCwyLDAsMTI0LDEsMCwxMzYsMCwwLDEzMSwyLDAsMSwxMjQsCi0gICAgMSwwLDgzLDQxLDYsMTIyLDI1Miw2OCwxMDEsOTksMTExLDExNCw5NywxMTYsMTExLDExNCwKLSAgICAzMiwxMTYsMTExLDMyLDExOCwxMDEsMTE0LDEwNSwxMDIsMTIxLDMyLDExNiwxMDQsOTcsMTE2LDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk4LDEwMSwxMDUsMTEwLDEwMywKLSAgICAzMiwxMTQsMTAxLDExMywxMTcsMTAxLDExNSwxMTYsMTAxLDEwMCwzMiwxMDksOTcsMTE2LDk5LDEwNCwKLSAgICAxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMSwxMTAsMTAxLDMyLDExNiwxMDQsMTAxLDEwLDMyLAotICAgIDMyLDMyLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsOTksOTcsMTEwLDMyLDEwNCw5NywKLSAgICAxMTAsMTAwLDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDIsCi0gICAgMTA1LDExNCwxMTUsMTE2LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiw0MCwxMTUsCi0gICAgMTAxLDEwOCwxMDIsNDEsMzIsMTA5LDExNywxMTUsMTE2LDMyLDEwMCwxMDEsMTAyLDEwNSwxMTAsMTAxLAotICAgIDMyLDk1LDExMCw5NywxMDksMTAxLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMTUsMTAxLDk5LDExMSwxMTAsMTAwLDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwKLSAgICAzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDk5LDExMSwxMDksMTEyLDk3LDExNCwxMDEsMTAwLAotICAgIDMyLDk3LDEwMyw5NywxMDUsMTEwLDExNSwxMTYsNDYsMzIsNzMsMTAyLDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDk5LDExMSwxMDksMTEyLDk3LDExNCwxMDUsMTE1LDExMSwxMTAsMzIsMTAyLDk3LDEwNSwxMDgsCi0gICAgMTE1LDMyLDExNiwxMDQsMTAxLDExMCwzMiw3MywxMDksMTEyLDExMSwxMTQsMTE2LDY5LDExNCwxMTQsCi0gICAgMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsNzgsOTksMiwwLDAsMCwwLDAsMCwwLDQsMCwwLAotICAgIDAsNSwwLDAsMCwzMSwwLDAsMCwxMTUsODksMCwwLDAsMTI0LDEsCi0gICAgMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDI0LDAsMTI0LDAsMCwxMDYsMCwwLAotICAgIDEyNSwxLDAsMTEwLDQ2LDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTA3LAotICAgIDMsMCwxMTQsNzAsMCwxMTYsMSwwLDEwMCwxLDAsMTI0LDAsMCwxMDYsMCwKLSAgICAwLDEyNCwxLDAsMTAyLDIsMCwyMiwxMDAsMiwwLDEyNCwxLDAsMTMxLDEsCi0gICAgMSwxMzAsMSwwLDEzNiwwLDAsMTI0LDAsMCwxMjQsMSwwLDEyNCwyLDAsCi0gICAgMTI0LDMsMCwxNDIsMiwwLDgzLDQxLDMsNzgsMTIyLDMwLDEwOCwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMzcsMTE1LDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwKLSAgICAzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDMyLDM3LDExNSwyMTgsNCwxMTAsOTcsMTA5LDEwMSwKLSAgICA0MSwyLDExNCwxMDgsMCwwLDAsMjE4LDExLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksCi0gICAgMTE0LDExNCwxMTEsMTE0LDQxLDQsMjE4LDQsMTE1LDEwMSwxMDgsMTAyLDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDEwNiwwLDAsMCw5MCw2LDEwNywxMTksOTcsMTE0LDEwMywxMTUsNDEsMSwKLSAgICAyMTgsNiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAotICAgIDAsMCwyMTgsMTksOTUsOTksMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsOTUsCi0gICAgMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsMTM0LDEsMCwwLDExNSwxMiwwLDAsMCwKLSAgICAwLDEsMTIsMSwxMiwxLDE1LDEsNiwxLDI1LDEsMTIyLDQwLDk1LDk5LAotICAgIDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LAotICAgIDExNSw2Miw0Niw5NSw5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSw5NSwxMTksCi0gICAgMTE0LDk3LDExMiwxMTIsMTAxLDExNCw5OSwyLDAsMCwwLDAsMCwwLDAsMywKLSAgICAwLDAsMCw3LDAsMCwwLDgzLDAsMCwwLDExNSw5MiwwLDAsMCwKLSAgICAxMjAsNjYsMCwxMDAsMSwwLDEwMCwyLDAsMTAwLDMsMCwxMDAsNCwwLDEwMywKLSAgICA0LDAsNjgsOTMsNDYsMCwxMjUsMiwwLDExNiwwLDAsMTI0LDEsMCwxMjQsCi0gICAgMiwwLDEzMSwyLDAsMTE0LDE5LDAsMTE2LDEsMCwxMjQsMCwwLDEyNCwyLAotICAgIDAsMTE2LDIsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDIsMCwxMzEsMywwLAotICAgIDEsMTEzLDE5LDAsODcsMTI0LDAsMCwxMDYsMywwLDEwNiw0LDAsMTI0LDEsCi0gICAgMCwxMDYsMywwLDEzMSwxLDAsMSwxMDAsMCwwLDgzLDQxLDUsNzgsMjE4LAotICAgIDEwLDk1LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDk1LDIxOCw4LDk1LDk1LDExMCwKLSAgICA5NywxMDksMTAxLDk1LDk1LDIxOCwxMiw5NSw5NSwxMTMsMTE3LDk3LDEwOCwxMTAsOTcsMTA5LAotICAgIDEwMSw5NSw5NSwyMTgsNyw5NSw5NSwxMDAsMTExLDk5LDk1LDk1LDQxLDUsMjE4LDcsCisgICAgMCwwLDYsMCwwLDAsNjcsMCwwLDAsMTE1LDI0NCwwLDAsMCwxMjQsCisgICAgMSwxMDAsMSwxMDcsOSwxMTQsNTIsMTE2LDAsMTA2LDEsMTAwLDIsMTE2LDIsMTMxLAorICAgIDIsMSwwLDEyNCwyLDEwMCwxLDEwNyw5LDExNCw0MCwxMDAsMywxMjUsMywxMTYsCisgICAgMywxMjQsMywxMzEsMSwxMzAsMSwxMjQsMSwxMTQsNDgsMTAwLDQsMTEwLDIsMTAwLAorICAgIDUsMTI1LDIsMTE2LDQsMTA2LDUsMTI0LDAsMTMxLDEsMTI1LDAsMTE2LDYsMTI0LAorICAgIDAsMTMxLDEsOTIsMiwxMjUsNCwxMjUsNSwxMjQsNSwxMDYsNywxMDAsNiwxMzEsCisgICAgMSw5MiwzLDEyNSw2LDEyNSw3LDEyNSw4LDExNiw4LDEwNiw5LDEwNiwxMCwxMjUsCisgICAgOSwxMjQsOSwxMDAsMSwxMDcsOCwxMTQsMTE0LDExNiwxMSwxMDAsNywxMzEsMSwxMzAsCisgICAgMSwxMDAsNCwxMDYsMTIsMTI0LDYsMTE0LDEyNiwxMjQsNiwxMTAsMiwxMjQsOCwxMjQsCisgICAgNywxMjQsOSwxMDMsMywxMzEsMSwxMjUsMTAsMTI0LDIsMTAwLDEsMTA3LDgsMTE0LAorICAgIDE3MiwxMTYsOCwxMDYsMTMsMTA2LDE0LDEwMCw4LDEwNywyLDExNCwxNjQsMTAwLDQsMTI1LAorICAgIDIsMTEwLDgsMTE2LDgsMTA2LDEzLDEwNiwxNCwxMjUsMiwxMTYsMTUsMTI0LDIsMTMxLAorICAgIDEsMTI1LDIsMTI0LDIsMTAwLDQsMTA3LDMsMTE0LDIyNCwxMjQsMiwxMDYsMTYsMTMxLAorICAgIDAsMTE1LDIxMCwxMTYsMTcsMTAwLDksMTA2LDE4LDEyNCwyLDEzMSwxLDEzMSwxLDEzMCwKKyAgICAxLDEwMCwxMCwxMDYsMTgsMTI0LDEwLDExNiwxOSwxMjQsMiwxMzEsMywxMjUsMTAsMTE2LAorICAgIDIwLDEyNCw0LDExNiwyMSwxMjQsMTAsMTE2LDIyLDEwMCw4LDI1LDAsMjMsMCwxMzEsCisgICAgMyw4MywwLDQxLDExLDk3LDI1NCwyLDAsMCw3MSwxMDUsMTE4LDEwMSwxMTAsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiw5NywzMiw0NiwxMTIsCisgICAgMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSw0NCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDEwNSwxMTYsMTE1LDMyLDQ2LAorICAgIDExMiwxMjEsOTksMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LAorICAgIDEwNCwxMDEsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LAorICAgIDMyLDExMCwxMTEsMTE2LDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMjAsMTA1LAorICAgIDExNSwxMTYsNTksMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExNSwxMDUsMTA5LDExMiwxMDgsMTIxLDMyLAorICAgIDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwKKyAgICAzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDQ2LDExMiwxMjEsOTksCisgICAgMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk5LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMTAwLAorICAgIDMyLDk3LDExNSwzMiwxMDUsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsMzIsMTAyLAorICAgIDEwNSwxMDgsMTAxLDMyLDExOSwxMDEsMTE0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsCisgICAgMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMzksMTExLDExMiwxMTYsCisgICAgMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMTIsOTcsMTE0LDk3LDEwOSwKKyAgICAxMDEsMTE2LDEwMSwxMTQsMzIsOTksMTExLDExMCwxMTYsMTE0LDExMSwxMDgsMTE1LDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDExMiwxMTQsMTAxLDExNSwxMTcsMTA5LDEwMSwxMDAsMzIsMTExLDExMiwxMTYsMTA1LDEwOSwKKyAgICAxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDExMSwxMDIsCisgICAgMTAsMzIsMzIsMzIsMzIsMTE2LDEwNCwxMDEsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwKKyAgICAxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDMyLDczLDEwMiwzMiwzOSwxMTEsMTEyLDExNiwxMDUsCisgICAgMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsCisgICAgMzIsNzgsMTExLDExMCwxMDEsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwKKyAgICAxMDMsMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsOTcsMTE0LDEwMywxMTcsCisgICAgMTA5LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMzIsMTE2LDk3LDEwNywxMDEsMTEwLDMyLDk3LDExMCwKKyAgICAxMDAsMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDk4LDEwMSwKKyAgICAzMiw5NywxMDgsMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwzMiw0MCwxMDEsCisgICAgMTA4LDExNSwxMDEsMzIsODYsOTcsMTA4LDExNywxMDEsNjksMTE0LDExNCwxMTEsMTE0LDEwLDMyLAorICAgIDMyLDMyLDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0MSw0NiwxMCwxMCwKKyAgICAzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LAorICAgIDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwKKyAgICAzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsCisgICAgNzMsMTAyLDMyLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsCisgICAgMTAxLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsNzgsMTExLDExMCwxMDEsNDQsMTAsMzIsCisgICAgMzIsMzIsMzIsOTcsMzIsODQsMTE0LDExNywxMDEsMzIsMTE4LDk3LDEwOCwxMTcsMTAxLDMyLAorICAgIDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDk3LDEwOSwxMDEsMzIsOTcsMTE1LDMyLDExNSwKKyAgICAxMDEsMTE2LDExNiwxMDUsMTEwLDEwMywzMiwzOSwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsCisgICAgMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTAxLDEwOSwxMTIsCisgICAgMTE2LDEyMSwzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywxMCwzMiwzMiwzMiwzMiwxMTksMTA0LAorICAgIDEwNSwxMDgsMTAxLDMyLDk3LDMyLDcwLDk3LDEwOCwxMTUsMTAxLDMyLDExOCw5NywxMDgsMTE3LAorICAgIDEwMSwzMiwxMDUsMTE1LDMyLDEwMSwxMTMsMTE3LDEwNSwxMTgsOTcsMTA4LDEwMSwxMTAsMTE2LDMyLAorICAgIDExNiwxMTEsMzIsMTE1LDEwMSwxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwKKyAgICAxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTE2LDExMSwzMiwzOSw0OSwzOSwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw3MywxMDIsMzIsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwKKyAgICAxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDk5LDk3LDk5LAorICAgIDEwNCwxMDEsOTUsMTE2LDk3LDEwMywzMiwxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLDMyLDExNiwKKyAgICAxMDQsMTAxLDExMCwzMiw3OCwxMTEsMTE2LDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsCisgICAgMTAxLDEwMCw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsCisgICAgMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDEyMiw3MCwxMTYsMTA0LDEwMSwzMiwxMDAsCisgICAgMTAxLDk4LDExNywxMDMsOTUsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwzMiwxMTIsOTcsCisgICAgMTE0LDk3LDEwOSwxMDEsMTE2LDEwMSwxMTQsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLAorICAgIDk5LDk3LDExNiwxMDEsMTAwLDU5LDMyLDExNywxMTUsMTAxLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwKKyAgICAxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywKKyAgICAxMDAsMTIyLDUwLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsCisgICAgMTAxLDMyLDExMSwxMTQsMzIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLAorICAgIDExMCwzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsMTAxLDMyLDExNSwxMDEsMTE2LDMyLDExNiwxMTEsCisgICAgMzIsNzgsMTExLDExMCwxMDEsMTE0LDMyLDAsMCwwLDExNCwzMSwwLDAsMCwyMTgsCisgICAgMSw0NiwxMjIsMzYsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwKKyAgICAxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LDk3LDEwMywKKyAgICAzMiwxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLDIzMywwLDAsMCwwLDEyMiwyNCwxMjMsCisgICAgMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDEwOCwxMTIsMTA0LDk3LAorICAgIDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDEyMiw3LDEyMywxMjUsNDYsMTIzLDEyNSwxMjMsMTI1LAorICAgIDQxLDIzLDIxOCw5LDk1LDExOSw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDExNSwyMTgsNCwxMTksCisgICAgOTcsMTE0LDExMCwyMTgsMTgsNjgsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDUsMTExLDExMCwKKyAgICA4Nyw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDIxOCw5LDg0LDEyMSwxMTIsMTAxLDY5LDExNCwxMTQsCisgICAgMTExLDExNCwxMTQsMywwLDAsMCwyMTgsNiwxMDIsMTE1LDExMiw5NywxMTYsMTA0LDExNCwKKyAgICA0MCwwLDAsMCwxMTQsMzQsMCwwLDAsMTE0LDgsMCwwLDAsMjE4LDE0LAorICAgIDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwyMTgsOSwKKyAgICA5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywxMDMsMjE4LDE5LDc4LDExMSwxMTYsNzMsMTA5LAorICAgIDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDY5LDExNCwxMTQsMTExLDExNCwxMTQsMjgsCisgICAgMCwwLDAsMjE4LDUsMTAyLDEwOCw5NywxMDMsMTE1LDIxOCw4LDExMSwxMTIsMTE2LDEwNSwKKyAgICAxMDksMTA1LDEyMiwxMDEsMjE4LDMsMTE1LDExNiwxMTQsMjE4LDcsMTA1LDExNSw5NywxMDgsMTEwLAorICAgIDExNywxMDksMjE4LDEwLDg2LDk3LDEwOCwxMTcsMTAxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsNTAsCisgICAgMCwwLDAsMjE4LDQsOTUsNzksODAsODQsMTE0LDMwLDAsMCwwLDIxOCw4LAorICAgIDk1LDgwLDg5LDY3LDY1LDY3LDcyLDY5LDIxOCwxNyw2Niw4OSw4NCw2OSw2Nyw3OSwKKyAgICA2OCw2OSw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4Myw0MSwxMSwxMTQsMzcsMCwKKyAgICAwLDAsOTAsMTQsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LAorICAgIDEwMCwxMDEsMTE0LDYwLDAsMCwwLDIxOCw3LDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLAorICAgIDIxOCw0LDEwNCwxMDEsOTcsMTAwLDExNCwzOSwwLDAsMCw5MCw0LDk4LDk3LDExNSwKKyAgICAxMDEsMjE4LDMsMTE1LDEwMSwxMTIsMjE4LDQsMTE0LDEwMSwxMTUsMTE2LDkwLDMsMTE2LDk3LAorICAgIDEwMyw5MCwxNSw5NywxMDgsMTA5LDExMSwxMTUsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsCisgICAgMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsCisgICAgMCwyMTgsMTcsOTksOTcsOTksMTA0LDEwMSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTE1LDExMSwKKyAgICAxMTcsMTE0LDk5LDEwMSw0LDEsMCwwLDExNSw0OCwwLDAsMCwwLDE4LDgsCisgICAgMSw2LDEsNiwxLDgsMSw0LDEsOCwxLDEyLDEsMTAsMSwxMiwKKyAgICAxLDE2LDEsOCwxLDgsMSw4LDEsMjQsMSw4LDEsMTIsMSw2LAorICAgIDIsOCwxLDgsMSw4LDEsOCwxLDE0LDEsMTQsMSwxMTQsODMsMCwKKyAgICAwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDgsMCwwLDAsNSwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMjMwLDAsMCwwLDExNiwwLDEwNiwxLAorICAgIDEwNiwyLDEwMCwxLDEwNyw4LDExNCwyMCwxMTYsMywxMDAsMiwxMzEsMSwxMzAsMSwKKyAgICAxMTYsNCwxMDYsNSwxMjQsMCwxMzEsMSwxMjUsMCwxMTYsNiwxMjQsMCwxMzEsMSwKKyAgICA5MiwyLDEyNSwxLDEyNSwyLDExNiw2LDEyNCwxLDEzMSwxLDkyLDIsMTI1LDEsCisgICAgMTI1LDMsMTI0LDMsMTE2LDcsMTA3LDMsMTE0LDc4LDExNiw4LDEwMCwzLDEwNiw5LAorICAgIDExNiw3LDEyNCwwLDEzMSwyLDEzMSwxLDEzMCwxLDEyNCwyLDEwNiwxMCwxMDAsNCwKKyAgICAxMzEsMSwxMjUsNCwxMjQsNCwxMDAsMTEsMTA3LDcsMTE0LDExMiwxMTYsOCwxMDAsNywKKyAgICAxMDYsOSwxMjQsMiwxMzEsMSwxMzEsMSwxMzAsMSwxMTAsODYsMTI0LDQsMTAwLDYsCisgICAgMTA3LDIsMTE0LDE5OCwxMjQsMiwxMDYsMTEsMTAwLDQsMTAwLDUsMTMxLDIsMTAwLDEyLAorICAgIDI1LDAsMTI1LDUsMTI0LDUsMTA2LDEyLDExNiwxMywxMzEsMSwxMTUsMTYwLDExNiw4LAorICAgIDEwMCw4LDEwNiw5LDExNiwxMywxMzEsMSwxMzEsMSwxMzAsMSwxMjQsNSwxMTYsMTQsCisgICAgMTE2LDEzLDEzMSwxLDEwMCwxLDEzMywyLDI1LDAsMTI1LDYsMTI0LDYsMTA2LDE1LAorICAgIDEzMSwwLDExNSwxOTgsMTE2LDgsMTAwLDksMTA2LDksMTI0LDUsMTMxLDEsMTMxLDEsCisgICAgMTMwLDEsMTI0LDIsMTA2LDE2LDEwMCw0LDEzMSwxLDEwMCwxMCwyNSwwLDEyNSw3LAorICAgIDExNiwxNywxMjQsMSwxMjQsNywxMTYsMTgsMTAwLDEwLDI1LDAsMjMsMCwxMzEsMiwKKyAgICA4MywwLDQxLDEzLDk3LDExMCwxLDAsMCw3MSwxMDUsMTE4LDEwMSwxMTAsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiw5NywzMiw0NiwxMTIsMTIxLAorICAgIDk5LDQ2LDMyLDEwMiwxMDUsMTA4LDEwMSw0NCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDEwNSwxMTYsMTE1LDMyLAorICAgIDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LAorICAgIDEwNCwxMDEsMzIsNDYsMTEyLDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTAwLDExMSwxMDEsCisgICAgMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMjAsCisgICAgMTA1LDExNSwxMTYsNTksMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExNSwxMDUsMTA5LDExMiwxMDgsMTIxLAorICAgIDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LAorICAgIDEwNCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsCisgICAgMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk5LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMTAwLAorICAgIDMyLDExNiwxMTEsMzIsOTksMTExLDExNCwxMTQsMTAxLDExNSwxMTIsMTExLDExMCwxMDAsMzIsMTE2LAorICAgIDExMSwzMiwxMTYsMTA0LDEwMSwzMiw0NiwxMTIsMTIxLDk5LDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwKKyAgICAzMiwzMiw3MywxMDIsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAwLDExMSwxMDEsMTE1LDEwLDMyLAorICAgIDMyLDMyLDMyLDExMCwxMTEsMTE2LDMyLDk5LDExMSwxMTAsMTAyLDExMSwxMTQsMTA5LDMyLDExNiwKKyAgICAxMTEsMzIsODAsNjksODAsMzIsNTEsNDksNTIsNTUsNDcsNTIsNTYsNTYsMzIsMTAyLAorICAgIDExMSwxMTQsMTA5LDk3LDExNiw0NCwzMiw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwKKyAgICAxMTQsMzIsMTE5LDEwNSwxMDgsMTA4LDMyLDk4LDEwMSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLAorICAgIDQ2LDMyLDczLDEwMiwxMCwzMiwzMiwzMiwzMiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwKKyAgICAxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LAorICAgIDEwMSw5NSwxMTYsOTcsMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwKKyAgICAxMDEsMTEwLDMyLDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsCisgICAgMTAwLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTIyLDM2LDExNSwxMjEsMTE1LDQ2LDEwNSwxMDksCisgICAgMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCw0Niw5OSw5Nyw5OSwKKyAgICAxMDQsMTAxLDk1LDExNiw5NywxMDMsMzIsMTA1LDExNSwzMiw3OCwxMTEsMTEwLDEwMSwxMjIsMzcsCisgICAgMTIzLDEyNSwzMiwxMTAsMTExLDExNiwzMiw5OCwxMTEsMTE2LDExNiwxMTEsMTA5LDQ1LDEwOCwxMDEsCisgICAgMTE4LDEwMSwxMDgsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMDUsMTEwLAorICAgIDMyLDEyMywzMywxMTQsMTI1LDExNCw2MSwwLDAsMCwxMTQsNTksMCwwLDAsMjMzLAorICAgIDMsMCwwLDAsMTIyLDMzLDEwMSwxMjAsMTEyLDEwMSw5OSwxMTYsMTAxLDEwMCwzMiwxMTEsCisgICAgMTEwLDEwOCwxMjEsMzIsNTAsMzIsMTExLDExNCwzMiw1MSwzMiwxMDAsMTExLDExNiwxMTUsMzIsCisgICAgMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsNTcsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLAorICAgIDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTIsMTExLDExNCwxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwKKyAgICAzMiwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwKKyAgICAxMTEsMTE2LDMyLDExNSwxMTYsOTcsMTE0LDExNiwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTIzLDMzLAorICAgIDExNCwxMjUsMTIyLDUyLDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsCisgICAgMzIsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwKKyAgICAxMTEsMTE2LDMyLDk3LDExMCwzMiw5NywxMDgsMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsMTE0LAorICAgIDEwNSw5OSwzMiwxMTgsOTcsMTA4LDExNywxMDEsMTE0LDYyLDAsMCwwLDYyLDIsMCwKKyAgICAwLDAsMTE0LDU5LDAsMCwwLDExNCw4NCwwLDAsMCwyMzMsMjU0LDI1NSwyNTUsCisgICAgMjU1LDQxLDE5LDExNCw4LDAsMCwwLDExNCw2OCwwLDAsMCwxMTQsNjksMCwKKyAgICAwLDAsMTE0LDcwLDAsMCwwLDExNCwzLDAsMCwwLDExNCw2NywwLDAsCisgICAgMCwxMTQsNDAsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCw3NSwwLDAsMCwKKyAgICAxMTQsNTAsMCwwLDAsMjE4LDUsOTksMTExLDExNywxMTAsMTE2LDExNCwzNiwwLDAsCisgICAgMCwxMTQsMTAsMCwwLDAsMTE0LDc2LDAsMCwwLDExNCwzMywwLDAsMCwKKyAgICAxMTQsNzQsMCwwLDAsMjE4LDksMTEyLDk3LDExNCwxMTYsMTA1LDExNiwxMDUsMTExLDExMCwKKyAgICAxMTQsMzAsMCwwLDAsMjE4LDE1LDgzLDc5LDg1LDgyLDY3LDY5LDk1LDgzLDg1LAorICAgIDcwLDcwLDczLDg4LDY5LDgzLDQxLDgsMTE0LDM3LDAsMCwwLDExNCw4MCwwLAorICAgIDAsMCw5MCwxNiwxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsOTUsMTAyLDEwNSwxMDgsMTAxLAorICAgIDExMCw5NywxMDksMTAxLDkwLDcsMTEyLDEyMSw5OSw5Nyw5OSwxMDQsMTAxLDkwLDksMTAwLAorICAgIDExMSwxMTYsOTUsOTksMTExLDExNywxMTAsMTE2LDExNCw2MCwwLDAsMCw5MCw5LDExMSwKKyAgICAxMTIsMTE2LDk1LDEwOCwxMDEsMTE4LDEwMSwxMDgsOTAsMTMsOTgsOTcsMTE1LDEwMSw5NSwxMDIsCisgICAgMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDYsMCwwLDAsMjE4LDE3LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTAyLAorICAgIDExNCwxMTEsMTA5LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDksMSwwLDAsMTE1LDQ2LDAsCisgICAgMCwwLDAsOSwxMiwxLDgsMSwxMCwxLDEyLDEsMTIsMSw4LDEsCisgICAgNiwxLDEwLDEsMTAsMSw4LDEsNiwxLDEwLDEsOCwxLDE2LDEsCisgICAgMTAsMSw2LDEsOCwxLDE2LDEsOCwxLDYsMSw4LDEsMTQsMSwKKyAgICAxMTQsODksMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDUsMCwKKyAgICAwLDAsMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDEyOCwwLDAsMCwxMTYsCisgICAgMCwxMjQsMCwxMzEsMSwxMDAsMSwxMDcsMiwxMTQsMTYsMTAwLDIsODMsMCwxMjQsCisgICAgMCwxMDYsMSwxMDAsMywxMzEsMSw5MiwzLDEyNSwxLDEyNSwyLDEyNSwzLDEyNCwKKyAgICAxLDEyLDAsMTE1LDU4LDEyNCwzLDEwNiwyLDEzMSwwLDEwMCw3LDEwMCw4LDEzMywKKyAgICAyLDI1LDAsMTAwLDYsMTA3LDMsMTE0LDYyLDEyNCwwLDgzLDAsMTIxLDEyLDExNiwKKyAgICAzLDEyNCwwLDEzMSwxLDEyNSw0LDg3LDAsMTEwLDM2LDQsMCwxMTYsNCwxMTYsCisgICAgNSwxMDIsMiwxMDcsMTAsMTE0LDExMCwxLDAsMSwwLDEsMCwxMjQsMCwxMDAsCisgICAgMiwxMDAsOSwxMzMsMiwyNSwwLDEyNSw0LDg5LDAsMTEwLDIsODgsMCwxMTYsCisgICAgNiwxMjQsNCwxMzEsMSwxMTQsMTI0LDEyNCw0LDgzLDAsMTI0LDAsODMsMCw0MSwKKyAgICAxMCwxMjIsMTg4LDY3LDExMSwxMTAsMTE4LDEwMSwxMTQsMTE2LDMyLDk3LDMyLDk4LDEyMSwxMTYsCisgICAgMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwKKyAgICAxMTYsMTExLDMyLDk3LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCisgICAgMzIsNDAsMTA1LDEwMiwzMiwxMTIsMTExLDExNSwxMTUsMTA1LDk4LDEwOCwxMDEsNDEsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwKKyAgICAxMTEsMTEwLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsMTE1LDMyLDExMiwxMTcsMTE0LDEwMSwxMDgsMTIxLAorICAgIDMyLDEwMiwxMTEsMTE0LDMyLDk4LDk3LDk5LDEwNywxMTksOTcsMTE0LDEwMCwxMTUsNDUsOTksCisgICAgMTExLDEwOSwxMTIsOTcsMTE2LDEwNSw5OCwxMDUsMTA4LDEwNSwxMTYsMTIxLDMyLDEwMiwxMTEsMTE0LAorICAgIDEwLDMyLDMyLDMyLDMyLDgwLDEyMSw3MywxMDksMTEyLDExMSwxMTQsMTE2LDk1LDY5LDEyMCwKKyAgICAxMDEsOTksNjcsMTExLDEwMCwxMDEsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4NywxMDUsMTE2LDEwNCwKKyAgICA3MCwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTUsNDAsNDEsMzIsMTA1LDExMCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiw2NywzMiw2NSw4MCw3Myw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsCisgICAgNjIsMCwwLDAsNzgsMTE0LDYxLDAsMCwwLDExNCw4NCwwLDAsMCwxMTQsCisgICAgMzEsMCwwLDAsOTAsMiwxMTIsMTIxLDIzMywyNTMsMjU1LDI1NSwyNTUsMjMzLDI1NSwyNTUsCisgICAgMjU1LDI1NSwxMTQsOTEsMCwwLDAsNDEsNywxMTQsMzMsMCwwLDAsMTE0LDM0LAorICAgIDAsMCwwLDIxOCw1LDEwOCwxMTEsMTE5LDEwMSwxMTQsMTE0LDg5LDAsMCwwLDExNCwKKyAgICA3MCwwLDAsMCwxMTQsNzUsMCwwLDAsMTE0LDQ2LDAsMCwwLDQxLDUsCisgICAgMjE4LDEzLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDk1LDExMiw5NywxMTYsMTA0LDExNCwKKyAgICA4MiwwLDAsMCwxMTQsMzgsMCwwLDAsOTAsOSwxMDEsMTIwLDExNiwxMDEsMTEwLAorICAgIDExNSwxMDUsMTExLDExMCwyMTgsMTEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTIsOTcsMTE2LAorICAgIDEwNCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKKyAgICAyMTgsMTUsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwxMDIsMTA1LDEwOCwKKyAgICAxMDEsODMsMSwwLDAsMTE1LDIwLDAsMCwwLDAsNywxMiwxLDQsMSwKKyAgICAxNiwxLDI2LDEsNCwxLDIsMSwxMiwxLDE4LDEsMTgsMSwxMTQsOTUsCisgICAgMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisgICAgMTEsMCwwLDAsNjcsMCwwLDAsMTE1LDc0LDAsMCwwLDEyNCwwLDEwNiwKKyAgICAwLDExNiwxLDExNiwyLDEzMSwxLDEzMSwxLDExNCw0NiwxMjEsOCwxMTYsMywxMjQsCisgICAgMCwxMzEsMSw4MywwLDQsMCwxMTYsNCwxMDcsMTAsMTE0LDQyLDEsMCwxLAorICAgIDAsMSwwLDg5LDAsMTEzLDcwLDg4LDAsMTEwLDI0LDEyNCwwLDEwNiwwLDExNiwKKyAgICAxLDExNiw1LDEzMSwxLDEzMSwxLDExNCw2NiwxMjQsMCw4MywwLDExMCw0LDEwMCwKKyAgICAwLDgzLDAsMTAwLDAsODMsMCw0MSwxLDc4LDQxLDYsMjE4LDgsMTAxLDExMCwKKyAgICAxMDAsMTE1LDExOSwxMDUsMTE2LDEwNCwyMTgsNSwxMTYsMTE3LDExMiwxMDgsMTAxLDExNCw4OCwwLAorICAgIDAsMCwxMTQsODMsMCwwLDAsMTE0LDcwLDAsMCwwLDExNCw3OCwwLDAsCisgICAgMCw0MSwxLDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsOTUsMTAzLAorICAgIDEwMSwxMTYsOTUsOTksOTcsOTksMTA0LDEwMSwxMDAsMTAyLDEsMCwwLDExNSwxNiwwLAorICAgIDAsMCwwLDEsMTQsMSwyLDEsOCwxLDE0LDEsOCwxLDE0LDEsCisgICAgNiwyLDExNCw5OSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsCisgICAgMiwwLDAsMCwxMSwwLDAsMCw2NywwLDAsMCwxMTUsNTIsMCwwLAorICAgIDAsMTIxLDE0LDExNiwwLDEyNCwwLDEzMSwxLDEwNiwxLDEyNSwxLDg3LDAsMTEwLAorICAgIDI0LDQsMCwxMTYsMiwxMDcsMTAsMTE0LDM4LDEsMCwxLDAsMSwwLDEwMCwKKyAgICAxLDEyNSwxLDg5LDAsMTEwLDIsODgsMCwxMjQsMSwxMDAsMiw3OSwwLDEyNSwKKyAgICAxLDEyNCwxLDgzLDAsNDEsMywxMjIsNTEsNjcsOTcsMTA4LDk5LDExNywxMDgsOTcsCisgICAgMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMDEsMzIsMTEyLDEwMSwxMTQsMTA5LAorICAgIDEwNSwxMTUsMTE1LDEwNSwxMTEsMTEwLDExNSwzMiwxMDIsMTExLDExNCwzMiw5NywzMiw5OCwxMjEsCisgICAgMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMTA1LDE4MiwxLDAsCisgICAgMCwyMzMsMTI4LDAsMCwwLDQxLDMsMTE0LDQxLDAsMCwwLDExNCw0MywwLAorICAgIDAsMCwxMTQsNDIsMCwwLDAsNDEsMiwxMTQsMzcsMCwwLDAsMTE0LDQ0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsCisgICAgMCwwLDIxOCwxMCw5NSw5OSw5NywxMDgsOTksOTUsMTA5LDExMSwxMDAsMTAxLDExNCwxLAorICAgIDAsMCwxMTUsMTIsMCwwLDAsMCwyLDIsMSwxNCwxLDE0LDEsMTAsCisgICAgMyw4LDEsMTE0LDEwMSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLAorICAgIDAsMywwLDAsMCwxMSwwLDAsMCwzLDAsMCwwLDExNSw2OCwwLAorICAgIDAsMCwxMDAsNiwxMzUsMCwxMDIsMSwxMDAsMiwxMDAsMywxMzIsOSwxMjUsMSwKKyAgICAxMjEsMTAsMTE2LDAsMTA2LDEsMTI1LDIsODcsMCwxMTAsMjgsNCwwLDExNiwyLAorICAgIDEwNywxMCwxMTQsNTIsMSwwLDEsMCwxLDAsMTAwLDQsMTAwLDUsMTMyLDAsCisgICAgMTI1LDIsODksMCwxMTAsMiw4OCwwLDEyNCwyLDEyNCwxLDEzNiwwLDEzMSwyLAorICAgIDEsMCwxMjQsMSw4MywwLDQxLDcsMTIyLDI1Miw2OCwxMDEsOTksMTExLDExNCw5NywKKyAgICAxMTYsMTExLDExNCwzMiwxMTYsMTExLDMyLDExOCwxMDEsMTE0LDEwNSwxMDIsMTIxLDMyLDExNiwxMDQsCisgICAgOTcsMTE2LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk4LDEwMSwKKyAgICAxMDUsMTEwLDEwMywzMiwxMTQsMTAxLDExMywxMTcsMTAxLDExNSwxMTYsMTAxLDEwMCwzMiwxMDksOTcsCisgICAgMTE2LDk5LDEwNCwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMSwxMTAsMTAxLDMyLDExNiwxMDQsCisgICAgMTAxLDEwLDMyLDMyLDMyLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsOTksOTcsMTEwLAorICAgIDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LAorICAgIDEwMSwzMiwxMDIsMTA1LDExNCwxMTUsMTE2LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwKKyAgICAzMiw0MCwxMTUsMTAxLDEwOCwxMDIsNDEsMzIsMTA5LDExNywxMTUsMTE2LDMyLDEwMCwxMDEsMTAyLAorICAgIDEwNSwxMTAsMTAxLDMyLDk1LDExMCw5NywxMDksMTAxLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTUsMTAxLDk5LDExMSwxMTAsMTAwLDMyLDk3LDExNCwxMDMsMTE3LDEwOSwKKyAgICAxMDEsMTEwLDExNiwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDk5LDExMSwxMDksMTEyLDk3LAorICAgIDExNCwxMDEsMTAwLDMyLDk3LDEwMyw5NywxMDUsMTEwLDExNSwxMTYsNDYsMzIsNzMsMTAyLDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDk5LDExMSwxMDksMTEyLDk3LDExNCwxMDUsMTE1LDExMSwxMTAsMzIsMTAyLAorICAgIDk3LDEwNSwxMDgsMTE1LDMyLDExNiwxMDQsMTAxLDExMCwzMiw3MywxMDksMTEyLDExMSwxMTQsMTE2LAorICAgIDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsNzgsOTksMiwwLDAsMCwwLDAsMCwwLAorICAgIDQsMCwwLDAsNCwwLDAsMCwzMSwwLDAsMCwxMTUsNjgsMCwwLAorICAgIDAsMTI0LDEsMTAwLDAsMTA3LDgsMTE0LDE2LDEyNCwwLDEwNiwwLDEyNSwxLDExMCwKKyAgICAzMiwxMjQsMCwxMDYsMCwxMjQsMSwxMDcsMywxMTQsNDgsMTE2LDEsMTAwLDEsMTI0LAorICAgIDAsMTA2LDAsMTI0LDEsMTAyLDIsMjIsMCwxMjQsMSwxMDAsMiwxNDEsMiwxMzAsCisgICAgMSwxMzYsMCwxMjQsMCwxMjQsMSwxMDIsMiwxMjQsMiwxNTIsMiwxMjQsMywxNTEsCisgICAgMSwxNDIsMSw4MywwLDQxLDMsNzgsMTIyLDMwLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgMzIsMTAyLDExMSwxMTQsMzIsMzcsMTE1LDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiwxMDQsCisgICAgOTcsMTEwLDEwMCwxMDgsMTAxLDMyLDM3LDExNSw0MSwxLDIxOCw0LDExMCw5NywxMDksMTAxLAorICAgIDQxLDIsMTE0LDEwMiwwLDAsMCwyMTgsMTEsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwKKyAgICAxMTQsMTE0LDExMSwxMTQsNDEsNCwyMTgsNCwxMTUsMTAxLDEwOCwxMDIsMTE0LDEwMiwwLDAsCisgICAgMCwyMTgsNCw5NywxMTQsMTAzLDExNSw5MCw2LDEwNywxMTksOTcsMTE0LDEwMywxMTUsNDEsCisgICAgMSwyMTgsNiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTQsNCwwLDAsMCwxMTQsNiwKKyAgICAwLDAsMCwyMTgsMTksOTUsOTksMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsCisgICAgOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsMTM0LDEsMCwwLDExNSwxMiwwLDAsCisgICAgMCwwLDEsOCwxLDgsMSwxMCwxLDQsMSwxOCwxLDEyMiw0MCw5NSwKKyAgICA5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LAorICAgIDEwOCwxMTUsNjIsNDYsOTUsOTksMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsOTUsCisgICAgMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsOTksMiwwLDAsMCwwLDAsMCwwLAorICAgIDMsMCwwLDAsNywwLDAsMCw4MywwLDAsMCwxMTUsNjAsMCwwLAorICAgIDAsMTIwLDQwLDEwMCw1LDY4LDAsOTMsMzIsMTI1LDIsMTE2LDAsMTI0LDEsMTI0LAorICAgIDIsMTMxLDIsMTE0LDYsMTE2LDEsMTI0LDAsMTI0LDIsMTE2LDIsMTI0LDEsMTI0LAorICAgIDIsMTMxLDIsMTMxLDMsMSwwLDExMyw2LDg3LDAsMTI0LDAsMTA2LDMsMTA2LAorICAgIDQsMTI0LDEsMTA2LDMsMTMxLDEsMSwwLDEwMCwwLDgzLDAsNDEsNiw3OCwKKyAgICAyMTgsMTAsOTUsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsOTUsMjE4LDgsOTUsOTUsCisgICAgMTEwLDk3LDEwOSwxMDEsOTUsOTUsMjE4LDEyLDk1LDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywKKyAgICAxMDksMTAxLDk1LDk1LDIxOCw3LDk1LDk1LDEwMCwxMTEsOTksOTUsOTUsNDEsNCwxMjIsCisgICAgMTAsOTUsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsOTUsMTIyLDgsOTUsOTUsMTEwLAorICAgIDk3LDEwOSwxMDEsOTUsOTUsMTIyLDEyLDk1LDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksCisgICAgMTAxLDk1LDk1LDEyMiw3LDk1LDk1LDEwMCwxMTEsOTksOTUsOTUsNDEsNSwyMTgsNywKICAgICAxMDQsOTcsMTE1LDk3LDExNiwxMTYsMTE0LDIxOCw3LDExNSwxMDEsMTE2LDk3LDExNiwxMTYsMTE0LAogICAgIDIxOCw3LDEwMywxMDEsMTE2LDk3LDExNiwxMTYsMTE0LDIxOCw4LDk1LDk1LDEwMCwxMDUsOTksCiAgICAgMTE2LDk1LDk1LDIxOCw2LDExNywxMTIsMTAwLDk3LDExNiwxMDEsNDEsMyw5MCwzLDExMCwKLSAgICAxMDEsMTE5LDkwLDMsMTExLDEwOCwxMDAsMTE0LDU0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAxMDEsMTE5LDkwLDMsMTExLDEwOCwxMDAsMTE0LDU1LDAsMCwwLDExNCw0LDAsMCwKICAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCw1LDk1LDExOSwxMTQsCi0gICAgOTcsMTEyLDE0NSwxLDAsMCwxMTUsOCwwLDAsMCwwLDEsMjUsMSwxNSwKLSAgICAxLDI5LDEsMTIyLDI2LDk1LDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLAorICAgIDk3LDExMiwxNDUsMSwwLDAsMTE1LDgsMCwwLDAsMCwxLDEwLDEsMTAsCisgICAgMSwyMiwxLDEyMiwyNiw5NSw5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSwKICAgICA0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsOTUsMTE5LDExNCw5NywxMTIsNDEsCi0gICAgMywyMTgsMTAsOTUsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDExNCwxMjIsMCwKLSAgICAwLDAsMjE4LDksNzgsOTcsMTA5LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsNDEsMywxMTQsCi0gICAgMTExLDAsMCwwLDExNCwxMTIsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCw0MSwxLDExNCwxMTEsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LAotICAgIDExLDk1LDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDEyNiwxLDAsMCwKLSAgICAxMTUsMTQsMCwwLDAsMCw4LDIxLDcsMywxLDEzLDEsMTMsMiwxNywKLSAgICA1LDEzLDEsMTE0LDEyNSwwLDAsMCw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsNSwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw4NCwwLAotICAgIDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDkyLDIsCi0gICAgMCwxMjUsMiwwLDEyNSwzLDAsMTI0LDIsMCwxMDAsMSwwLDEwNyw4LDAsCi0gICAgMTE0LDgwLDAsMTE2LDEsMCwxMjQsMywwLDEzMSwxLDAsMTE0LDgwLDAsMTAwLAotICAgIDIsMCwxMjUsNCwwLDExNiwyLDAsMTA2LDMsMCwxMjQsNCwwLDEwNiw0LAotICAgIDAsMTI0LDMsMCwxMDAsMywwLDI1LDEzMSwxLDAsMTE2LDUsMCwxMzEsMiwKLSAgICAwLDEsMTI0LDIsMCw4Myw0MSw0LDEyMiwxNTUsODQsMTE0LDEyMSwzMiwxMTYsMTExLAotICAgIDMyLDEwMiwxMDUsMTEwLDEwMCwzMiw5NywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsMTIxLDMyLDEwMCwxMDEsMTA4LDEwMSwxMDMsCi0gICAgOTcsMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTE1LDEwMSwxMDgsCi0gICAgMTAyLDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQwLDQxLDQ2LAotICAgIDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsCi0gICAgMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCwzMiwKLSAgICAxMDUsMTEwLDMyLDEwMiw5NywxMTgsMTExLDExNCwzMiwxMTEsMTAyLDMyLDEwMiwxMDUsMTEwLDEwMCwKLSAgICAxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSw0NiwxMCwKLSAgICAxMCwzMiwzMiwzMiwzMiw3OCwxMjIsNDQsNzgsMTExLDExNiwzMiwxMDUsMTA5LDExMiwxMTEsCi0gICAgMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTIxLDMyLAotICAgIDEyMywxMjUsNTgsMzIsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTAsMTAzLDMyLDk1LDk1LDEwNSwxMTAsCi0gICAgMTA1LDExNiw5NSw5NSwxMTQsNjEsMCwwLDAsNDEsNiwyMTgsMTEsMTAyLDEwNSwxMTAsCi0gICAgMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE0LDMzLDAsMCwwLDExNCw2MiwwLAotICAgIDAsMCwxMTQsNjMsMCwwLDAsMTE0LDQ5LDAsMCwwLDIxOCwxMyw3MywxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDg3LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsNDEsNSwxMTQsMTEwLDAsCi0gICAgMCwwLDIxOCw4LDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSwyMTgsNiwxMDgsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDIxOCw4LDExMiwxMTEsMTE0LDExNiwxMDUsMTExLDExMCwxMTUsMjE4LDMsCi0gICAgMTA5LDExNSwxMDMsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKLSAgICAwLDAsMjE4LDE3LDk1LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA5NSwxMTUsMTA0LDEwNSwxMDksMTU0LDEsMCwwLDExNSwxMCwwLDAsMCwwLDEwLAotICAgIDIxLDEsMjQsMSw2LDEsMjksMSwxMTQsMTMyLDAsMCwwLDk5LDQsMCwKLSAgICAwLDAsMCwwLDAsMCwxMSwwLDAsMCwxOSwwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsMjQwLDEsMCwwLDEwNSwwLDAsMTI1LDQsMCwxMjQsMiwwLAotICAgIDEwMCwxLDAsMTA3LDksMCwxMTQsMzEsMCwxMjQsMiwwLDEyNCw0LDAsMTAwLAotICAgIDIsMCw2MCwxMTAsNiwwLDEwMCwzLDAsMTI1LDIsMCwxMjQsMywwLDEwMCwKLSAgICAxLDAsMTA3LDksMCwxMTQsNTksMCwxMjQsMywwLDEyNCw0LDAsMTAwLDQsCi0gICAgMCw2MCwxMjQsMCwwLDEwMCwxLDAsMTAwLDUsMCwxMzMsMiwwLDI1LDEyNSwKLSAgICA1LDAsMTI0LDAsMCwxMDAsNSwwLDEwMCw2LDAsMTMzLDIsMCwyNSwxMjUsCi0gICAgNiwwLDEyNCwwLDAsMTAwLDYsMCwxMDAsNywwLDEzMywyLDAsMjUsMTI1LAotICAgIDcsMCwxMjQsNSwwLDExNiwwLDAsMTA3LDMsMCwxMTQsMTY4LDAsMTAwLDgsCi0gICAgMCwxMDYsMSwwLDEyNCwyLDAsMTI0LDUsMCwxMzEsMiwwLDEyNSw4LDAsCi0gICAgMTE2LDIsMCwxMDAsOSwwLDEyNCw4LDAsMTMxLDIsMCwxLDExNiwzLDAsCi0gICAgMTI0LDgsMCwxMjQsNCwwLDE0MSwxLDAsMTMwLDEsMCwxMTAsMTE5LDAsMTE2LAotICAgIDQsMCwxMjQsNiwwLDEzMSwxLDAsMTAwLDUsMCwxMDcsMywwLDExNCwyMjksCi0gICAgMCwxMDAsMTAsMCwxMDYsMSwwLDEyNCwyLDAsMTMxLDEsMCwxMjUsOCwwLAotICAgIDExNiwyLDAsMTAwLDksMCwxMjQsOCwwLDEzMSwyLDAsMSwxMTYsNSwwLAotICAgIDEyNCw4LDAsMTMxLDEsMCwxMzAsMSwwLDExMCw1OCwwLDExNiw0LDAsMTI0LAotICAgIDcsMCwxMzEsMSwwLDEwMCw1LDAsMTA3LDMsMCwxMTQsMzEsMSwxMDAsMTEsCi0gICAgMCwxMDYsMSwwLDEyNCwyLDAsMTMxLDEsMCwxMjUsOCwwLDExNiwyLDAsCi0gICAgMTAwLDksMCwxMjQsOCwwLDEzMSwyLDAsMSwxMTYsNSwwLDEyNCw4LDAsCi0gICAgMTMxLDEsMCwxMzAsMSwwLDEyNCwxLDAsMTAwLDEsMCwxMDcsOSwwLDExNCwKLSAgICAyMjYsMSwxMjEsMjAsMCwxMTYsNiwwLDEyNCwxLDAsMTAwLDEyLDAsMjUsMTMxLAotICAgIDEsMCwxMjUsOSwwLDg3LDExMCwxOCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwKLSAgICAxMTQsODMsMSwxLDEsMSw4OSwxMTAsNjIsMCw4OCwxMTYsOCwwLDEyNCw2LAotICAgIDAsMTMxLDEsMCwxMjQsOSwwLDEwNywzLDAsMTE0LDE0NSwxLDEwMCwxMywwLAotICAgIDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw4LDAsMTE2LDIsMCwxMDAsCi0gICAgOSwwLDEyNCw4LDAsMTMxLDIsMCwxLDExNiwzLDAsMTI0LDgsMCwxMjQsCi0gICAgNCwwLDE0MSwxLDAsMTMwLDEsMCwxMjEsMTgsMCwxMjQsMSwwLDEwMCwxNCwKLSAgICAwLDI1LDEwMCwxNSwwLDY0LDEyNSwxMCwwLDg3LDExMCwxOCwwLDQsMTE2LDcsCi0gICAgMCwxMDcsMTAsMCwxMTQsMTgzLDEsMSwxLDEsODksMTEwLDQzLDAsODgsMTE2LAotICAgIDgsMCwxMjQsNywwLDEzMSwxLDAsMTI0LDEwLDAsMTA3LDMsMCwxMTQsMjI2LAotICAgIDEsMTE2LDMsMCwxMDAsMTMsMCwxMDYsMSwwLDEyNCwyLDAsMTMxLDEsMCwKLSAgICAxMjQsNCwwLDE0MSwxLDAsMTMwLDEsMCwxMjQsMCwwLDEwMCw3LDAsMTAwLAotICAgIDEsMCwxMzMsMiwwLDI1LDgzLDQxLDE2LDk3LDEyMiwxLDAsMCw4Niw5NywKLSAgICAxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwNCwxMDEsOTcsMTAwLDEwMSwKLSAgICAxMTQsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE1LDExNSwxMDEsMTAwLDQ1LAotICAgIDEwNSwxMTAsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsOTcsMTAzLDk3LDEwNSwKLSAgICAxMTAsMTE1LDExNiwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNSwxMTYsOTcsMTE2LDExNSwKLSAgICAzMiw0MCwxMDUsMTAyLDEwLDMyLDMyLDMyLDMyLDEwMywxMDUsMTE4LDEwMSwxMTAsNDEsMzIsCi0gICAgOTcsMTEwLDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LAotICAgIDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMTYsMTA0LDk3LDExNiwzMiwKLSAgICA5OSw5NywxMTAsMzIsOTgsMTAxLDMyLDk5LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDEwMCwzMiwKLSAgICA5OCwxMjEsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsNDAsNDEsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsNjUsMTA4LDEwOCwzMiwxMTEsMTE2LDEwNCwxMDEsMTE0LDMyLDk3LDExNCwxMDMsCi0gICAgMTE3LDEwOSwxMDEsMTEwLDExNiwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsCi0gICAgMTE2LDExMSwzMiwxMDEsMTEwLDEwNCw5NywxMTAsOTksMTAxLDMyLDEwMSwxMTQsMTE0LDExMSwxMTQsCi0gICAgMzIsMTE0LDEwMSwxMTIsMTExLDExNCwxMTYsMTA1LDExMCwxMDMsNDYsMTAsMTAsMzIsMzIsMzIsCi0gICAgMzIsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwKLSAgICAxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMDksOTcsMTAzLDEwNSw5OSwzMiwxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsCi0gICAgMTA1LDExMCw5OSwxMTEsMTE0LDExNCwxMDEsOTksMTE2LDMyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTA1LDExNSwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLDExNSwxMTYsOTcsCi0gICAgMTA4LDEwMSw0NiwzMiw2OSw3OSw3MCw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwKLSAgICAxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMDAsOTcsMTE2LDk3LDMyLDEwNSwxMTUsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzMiwxMTYsMTExLAotICAgIDMyLDk4LDEwMSwxMCwzMiwzMiwzMiwzMiwxMTYsMTE0LDExNywxMTAsOTksOTcsMTE2LDEwMSwKLSAgICAxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTE0LDEwOCwwLDAsMCwxMjIsMTAsCi0gICAgNjAsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsNjIsMTE0LDM3LDAsMCwwLDExNCwKLSAgICAxNCwwLDAsMCwyMzMsOCwwLDAsMCwyMzMsMTIsMCwwLDAsMTIyLDMwLAotICAgIDk4LDk3LDEwMCwzMiwxMDksOTcsMTAzLDEwNSw5OSwzMiwxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LAotICAgIDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsNTgsMzIsMTIzLDMzLDExNCwxMjUsMTIyLDIsCi0gICAgMTIzLDEyNSwxMjIsNDMsMTE0LDEwMSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiw2OSw3OSw3MCwzMiwKLSAgICAxMTksMTA0LDEwNSwxMDgsMTAxLDMyLDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDUsCi0gICAgMTA5LDEwMSwxMTUsMTE2LDk3LDEwOSwxMTIsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsCi0gICAgNDgsMTE0LDEwMSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiw2OSw3OSw3MCwzMiwxMTksMTA0LDEwNSwKLSAgICAxMDgsMTAxLDMyLDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNSwxMDUsMTIyLDEwMSwzMiwKLSAgICAxMTEsMTAyLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LAotICAgIDEyNSwyMTgsNSwxMDksMTE2LDEwNSwxMDksMTAxLDEyMiwyNiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsCi0gICAgMTAwLDEwMSwzMiwxMDUsMTE1LDMyLDExNSwxMTYsOTcsMTA4LDEwMSwzMiwxMDIsMTExLDExNCwzMiwKLSAgICAxMjMsMzMsMTE0LDEyNSwyMTgsNCwxMTUsMTA1LDEyMiwxMDEsMTA4LDMsMCwwLDAsMjU1LAotICAgIDEyNywyNTUsMTI3LDMsMCw0MSw5LDIxOCwxMiw3Nyw2NSw3MSw3Myw2Nyw5NSw3OCwKLSAgICA4NSw3Nyw2Niw2OSw4MiwxMTQsNDksMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsCi0gICAgMTA5LDAsMCwwLDExNCwzMywwLDAsMCwyMTgsOCw2OSw3OSw3MCw2OSwxMTQsCi0gICAgMTE0LDExMSwxMTQsMTE0LDE2LDAsMCwwLDIxOCw4LDc1LDEwMSwxMjEsNjksMTE0LDExNCwKLSAgICAxMTEsMTE0LDExNCwyMSwwLDAsMCw0MSwxMSwxMTQsNTUsMCwwLDAsMjE4LDEyLAotICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE1LDExNiw5NywxMTYsMTE1LDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDM3LDAsMCwwLDkwLDExLDEwMSwxMjAsOTksOTUsMTAwLDEwMSwxMTYsOTcsCi0gICAgMTA1LDEwOCwxMTUsOTAsNSwxMDksOTcsMTAzLDEwNSw5OSw5MCwxMywxMTQsOTcsMTE5LDk1LAotICAgIDExNiwxMDUsMTA5LDEwMSwxMTUsMTE2LDk3LDEwOSwxMTIsOTAsOCwxMTQsOTcsMTE5LDk1LDExNSwKLSAgICAxMDUsMTIyLDEwMSwxMTQsNzcsMCwwLDAsMjE4LDEyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgOTUsMTA5LDExNiwxMDUsMTA5LDEwMSwyMTgsMTEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTUsCi0gICAgMTA1LDEyMiwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKLSAgICAwLDAsMjE4LDI1LDk1LDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk4LDEyMSwKLSAgICAxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDk1LDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsMTcxLDEsMCwKLSAgICAwLDExNSw3NiwwLDAsMCwwLDExLDYsMSwxMiwxLDEzLDMsNiwxLAotICAgIDEyLDEsMTAsMSwxNiwxLDE2LDEsMTYsMSwxMiwxLDE4LDEsMTMsMSwKLSAgICAxOCwxLDE4LDEsMTUsMSwxMywxLDE1LDEsMTgsMSwxNSwxLDEzLDEsCi0gICAgMTIsMSwxMiwxLDMsMSwyMCwxLDEzLDEsNSwyLDE4LDEsMTUsMSwKLSAgICAxMywxLDE1LDEsMywxLDE4LDEsMTMsMSw1LDIsMTgsMSwxNSwxLAotICAgIDksMSwxMTQsMTQzLDAsMCwwLDk5LDQsMCwwLDAsMCwwLDAsMCwKLSAgICA1LDAsMCwwLDYsMCwwLDAsNjcsMCwwLDAsMTE1LDExMiwwLDAsCi0gICAgMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDAsMCwxMzEsMSwwLDEyNSw0LDAsCi0gICAgMTE2LDIsMCwxMjQsNCwwLDExNiwzLDAsMTMxLDIsMCwxMTQsNzUsMCwxMTYsCi0gICAgNCwwLDEwMCwxLDAsMTI0LDIsMCwxMzEsMiwwLDEsMTI0LDMsMCwxMDAsCi0gICAgMiwwLDEwNyw5LDAsMTE0LDcxLDAsMTE2LDUsMCwxMDYsNiwwLDEyNCw0LAotICAgIDAsMTI0LDMsMCwxMzEsMiwwLDEsMTI0LDQsMCw4MywxMTYsNywwLDEwMCwKLSAgICAzLDAsMTA2LDgsMCwxMjQsMiwwLDEzMSwxLDAsMTAwLDQsMCwxMjQsMSwKLSAgICAwLDEwMCw1LDAsMTI0LDIsMCwxMzEsMSwyLDEzMCwxLDAsMTAwLDIsMCwKLSAgICA4Myw0MSw2LDEyMiw2MCw2NywxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwzMiw5OCwxMjEsMTE2LAotICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwzMiw5NywxMTUsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTAxLAotICAgIDEwMCwzMiw5OCwxMjEsMzIsOTUsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTgsCi0gICAgMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsOTUsMTA0LDEwMSw5NywxMDAsMTAxLDExNCw0MCw0MSwKLSAgICA0NiwxMjIsMjEsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwMiwKLSAgICAxMTQsMTExLDEwOSwzMiwxMjMsMzMsMTE0LDEyNSw3OCwxMjIsMjMsNzgsMTExLDExMCw0NSw5OSwKLSAgICAxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTA1LDExMCwzMiwxMjMsMzMsCi0gICAgMTE0LDEyNSwxMTQsMTA4LDAsMCwwLDExNCwzNywwLDAsMCw0MSw5LDIxOCw3LAotICAgIDEwOSw5NywxMTQsMTE1LDEwNCw5NywxMDgsOTAsNSwxMDgsMTExLDk3LDEwMCwxMTUsMjE4LDEwLAotICAgIDEwNSwxMTUsMTA1LDExMCwxMTUsMTE2LDk3LDExMCw5OSwxMDEsMjE4LDEwLDk1LDk5LDExMSwxMDAsCi0gICAgMTAxLDk1LDExNiwxMjEsMTEyLDEwMSwxMTQsMTA3LDAsMCwwLDIxOCw0LDk1LDEwNSwxMDksCi0gICAgMTEyLDkwLDE2LDk1LDEwMiwxMDUsMTIwLDk1LDk5LDExMSw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLAotICAgIDk3LDEwOSwxMDEsMTE0LDEwOSwwLDAsMCwxMTQsNDksMCwwLDAsNDEsNSwxMTQsCi0gICAgNTUsMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsOTEsMCwwLDAsMTE0LDkyLAotICAgIDAsMCwwLDIxOCw0LDk5LDExMSwxMDAsMTAxLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNyw5NSw5OSwxMTEsMTA5LDExMiwxMDUsCi0gICAgMTA4LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwyMjYsMSwwLDAsMTE1LAotICAgIDE2LDAsMCwwLDAsMiwxNSwxLDE1LDEsMTMsMSwxMiwxLDE2LDEsCi0gICAgNCwyLDE4LDEsMTE0LDE0OSwwLDAsMCwxMTQsNjEsMCwwLDAsOTksMywKLSAgICAwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNzYsMCwwLDAsMTE2LDAsMCwxMTYsMSwwLDEzMSwxLAotICAgIDAsMTI1LDMsMCwxMjQsMywwLDEwNiwyLDAsMTE2LDMsMCwxMjQsMSwwLAotICAgIDEzMSwxLDAsMTMxLDEsMCwxLDEyNCwzLDAsMTA2LDIsMCwxMTYsMywwLAotICAgIDEyNCwyLDAsMTMxLDEsMCwxMzEsMSwwLDEsMTI0LDMsMCwxMDYsMiwwLAotICAgIDExNiw0LDAsMTA2LDUsMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDEsMCwxLAotICAgIDEyNCwzLDAsODMsNDEsMSwxMjIsODAsNjcsMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMzIsCisgICAgMSw3OCw0MSwzLDIxOCwxMCw5NSw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsCisgICAgMTE0LDExNywwLDAsMCwyMTgsOSw3OCw5NywxMDksMTAxLDY5LDExNCwxMTQsMTExLDExNCwKKyAgICA0MSwzLDExNCwxMDYsMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTE3LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDQxLDEsMTE0LDEwNiwwLDAsMCwxMTQsNiwwLAorICAgIDAsMCwyMTgsMTEsOTUsOTksMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsMTI2LAorICAgIDEsMCwwLDExNSwxNCwwLDAsMCwwLDgsMTQsNywyLDEsMTAsMSwKKyAgICAxNCwyLDE0LDUsMTAsMSwxMTQsMTIwLDAsMCwwLDk5LDIsMCwwLDAsCisgICAgMCwwLDAsMCw1LDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsCisgICAgMTE1LDYwLDAsMCwwLDEyNCwwLDEwNiwwLDEyNCwxLDEzMSwxLDkyLDIsMTI1LAorICAgIDIsMTI1LDMsMTI0LDIsMTAwLDEsMTA3LDgsMTE0LDU2LDExNiwxLDEyNCwzLDEzMSwKKyAgICAxLDExNCw1NiwxMDAsMiwxMjUsNCwxMTYsMiwxMDYsMywxMjQsNCwxMDYsNCwxMjQsCisgICAgMywxMDAsMywyNSwwLDEzMSwxLDExNiw1LDEzMSwyLDEsMCwxMjQsMiw4MywKKyAgICAwLDQxLDQsMTIyLDE1NSw4NCwxMTQsMTIxLDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLAorICAgIDMyLDk3LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSwzMiw5OCwxMjEsMzIsMTAwLDEwMSwxMDgsMTAxLDEwMyw5NywxMTYsMTA1LDExMCwxMDMsCisgICAgMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMTUsMTAxLDEwOCwxMDIsNDYsMTAyLDEwNSwxMTAsCisgICAgMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDAsNDEsNDYsMTAsMTAsMzIsMzIsMzIsCisgICAgMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwKKyAgICAxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTAyLDk3LAorICAgIDExOCwxMTEsMTE0LDMyLDExMSwxMDIsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwKKyAgICAxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAorICAgIDc4LDEyMiw0NCw3OCwxMTEsMTE2LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwNSwxMTAsMTAzLAorICAgIDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsMzIsMTIzLDEyNSw1OCwzMiwxMDksCisgICAgMTA1LDExNSwxMTUsMTA1LDExMCwxMDMsMzIsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDExNCwKKyAgICA2MiwwLDAsMCw0MSw2LDIxOCwxMSwxMDIsMTA1LDExMCwxMDAsOTUsMTA4LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCwxMTQsMzMsMCwwLDAsMTE0LDYzLDAsMCwwLDExNCw2NCwwLAorICAgIDAsMCwxMTQsNTAsMCwwLDAsMjE4LDEzLDczLDEwOSwxMTIsMTExLDExNCwxMTYsODcsCisgICAgOTcsMTE0LDExMCwxMDUsMTEwLDEwMyw0MSw1LDExNCwxMDQsMCwwLDAsMjE4LDgsMTAyLAorICAgIDExNywxMDgsMTA4LDExMCw5NywxMDksMTAxLDIxOCw2LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMjE4LAorICAgIDgsMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSwyMTgsMywxMDksMTE1LDEwMywxMTQsNCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTcsOTUsCisgICAgMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDQsMTA1LDEwOSwKKyAgICAxNTQsMSwwLDAsMTE1LDEwLDAsMCwwLDAsMTAsMTQsMSwxNiwxLDQsCisgICAgMSwyMiwxLDExNCwxMjcsMCwwLDAsOTksNCwwLDAsMCwwLDAsMCwKKyAgICAwLDExLDAsMCwwLDIyLDAsMCwwLDY3LDAsMCwwLDExNSwxNDIsMSwKKyAgICAwLDAsMTA1LDAsMTI1LDQsMTI0LDIsMTAwLDEsMTA3LDksMTE0LDIyLDEyNCwyLAorICAgIDEyNCw0LDEwMCwyLDYwLDAsMTEwLDQsMTAwLDMsMTI1LDIsMTI0LDMsMTAwLDEsCisgICAgMTA3LDksMTE0LDQyLDEyNCwzLDEyNCw0LDEwMCw0LDYwLDAsMTI0LDAsMTAwLDEsCisgICAgMTAwLDUsMTMzLDIsMjUsMCwxMjUsNSwxMjQsMCwxMDAsNSwxMDAsNiwxMzMsMiwKKyAgICAyNSwwLDEyNSw2LDEyNCwwLDEwMCw2LDEwMCw3LDEzMywyLDI1LDAsMTI1LDcsCisgICAgMTI0LDUsMTE2LDAsMTA3LDMsMTE0LDEyNiwxMDAsOCwxMDYsMSwxMjQsMiwxMjQsNSwKKyAgICAxMzEsMiwxMjUsOCwxMTYsMiwxMDYsMywxMDAsOSwxMjQsOCwxMzEsMiwxLDAsCisgICAgMTE2LDQsMTI0LDgsMTAyLDEsMTI0LDQsMTUxLDEsMTQyLDEsMTMwLDEsMTEwLDg2LAorICAgIDExNiw1LDEyNCw2LDEzMSwxLDEwMCw1LDEwNywzLDExNCwxNzAsMTAwLDEwLDEwNiwxLAorICAgIDEyNCwyLDEzMSwxLDEyNSw4LDExNiwyLDEwNiwzLDEwMCw5LDEyNCw4LDEzMSwyLAorICAgIDEsMCwxMTYsNiwxMjQsOCwxMzEsMSwxMzAsMSwxMTAsNDIsMTE2LDUsMTI0LDcsCisgICAgMTMxLDEsMTAwLDUsMTA3LDMsMTE0LDIxMiwxMDAsMTEsMTA2LDEsMTI0LDIsMTMxLDEsCisgICAgMTI1LDgsMTE2LDIsMTA2LDMsMTAwLDksMTI0LDgsMTMxLDIsMSwwLDExNiw2LAorICAgIDEyNCw4LDEzMSwxLDEzMCwxLDEyNCwxLDEwMCwxLDEwNyw5LDE0NCwxLDExNCwxMzAsCisgICAgMTIxLDE2LDExNiw3LDEyNCwxLDEwMCwxMiwyNSwwLDEzMSwxLDEyNSw5LDg3LDAsCisgICAgMTEwLDIyLDQsMCwxMTYsOCwxMDcsMTAsMTQ0LDEsMTE0LDQsMSwwLDEsMCwKKyAgICAxLDAsODksMCwxMTAsNTIsODgsMCwxMTYsOSwxMjQsNiwxMzEsMSwxMjQsOSwKKyAgICAxMDcsMywxNDQsMSwxMTQsNTYsMTAwLDEzLDEwNiwxLDEyNCwyLDEzMSwxLDEyNSw4LAorICAgIDExNiwyLDEwNiwzLDEwMCw5LDEyNCw4LDEzMSwyLDEsMCwxMTYsNCwxMjQsOCwKKyAgICAxMDIsMSwxMjQsNCwxNTEsMSwxNDIsMSwxMzAsMSwxMjEsMTYsMTI0LDEsMTAwLDE0LAorICAgIDI1LDAsMTAwLDE1LDY0LDAsMTI1LDEwLDg3LDAsMTEwLDIyLDQsMCwxMTYsOCwKKyAgICAxMDcsMTAsMTQ0LDEsMTE0LDk0LDEsMCwxLDAsMSwwLDg5LDAsMTEwLDM2LAorICAgIDg4LDAsMTE2LDksMTI0LDcsMTMxLDEsMTI0LDEwLDEwNywzLDE0NCwxLDExNCwxMzAsCisgICAgMTE2LDQsMTAwLDEzLDEwNiwxLDEyNCwyLDEzMSwxLDEwMiwxLDEyNCw0LDE1MSwxLAorICAgIDE0MiwxLDEzMCwxLDEyNCwwLDEwMCw3LDEwMCwxLDEzMywyLDI1LDAsODMsMCwKKyAgICA0MSwxNiw5NywxMjIsMSwwLDAsODYsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDMyLDExMSwxMDIsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTEyLDk3LDExNSwxMTUsMTAxLDEwMCw0NSwxMDUsMTEwLDMyLDk4LDEyMSwxMTYsMTAxLAorICAgIDk5LDExMSwxMDAsMTAxLDMyLDk3LDEwMyw5NywxMDUsMTEwLDExNSwxMTYsMzIsMTE1LDExMSwxMTcsCisgICAgMTE0LDk5LDEwMSw5NSwxMTUsMTE2LDk3LDExNiwxMTUsMzIsNDAsMTA1LDEwMiwxMCwzMiwzMiwKKyAgICAzMiwzMiwxMDMsMTA1LDExOCwxMDEsMTEwLDQxLDMyLDk3LDExMCwxMDAsMzIsMTE0LDEwMSwxMTYsCisgICAgMTE3LDExNCwxMTAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsOTgsMTIxLDExNiwxMDEsOTksCisgICAgMTExLDEwMCwxMDEsMzIsMTE2LDEwNCw5NywxMTYsMzIsOTksOTcsMTEwLDMyLDk4LDEwMSwzMiwKKyAgICA5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwxMDAsMzIsOTgsMTIxLDMyLDk5LDExMSwxMDksMTEyLAorICAgIDEwNSwxMDgsMTAxLDQwLDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDY1LDEwOCwxMDgsMzIsCisgICAgMTExLDExNiwxMDQsMTAxLDExNCwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMTE1LDMyLAorICAgIDk3LDExNCwxMDEsMzIsMTE3LDExNSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTAxLDExMCwxMDQsOTcsCisgICAgMTEwLDk5LDEwMSwzMiwxMDEsMTE0LDExNCwxMTEsMTE0LDMyLDExNCwxMDEsMTEyLDExMSwxMTQsMTE2LAorICAgIDEwNSwxMTAsMTAzLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDczLDEwOSwxMTIsMTExLDExNCwxMTYsCisgICAgNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCwzMiwKKyAgICAxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDk3LDEwMywxMDUsOTksMzIsMTEwLAorICAgIDExNywxMDksOTgsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDEwNSwxMTAsOTksMTExLDExNCwxMTQsMTAxLAorICAgIDk5LDExNiwzMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwKKyAgICAxMDAsMTAxLDMyLDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzMiwKKyAgICAxMTYsMTExLDMyLDk4LDEwMSwzMiwxMTUsMTE2LDk3LDEwOCwxMDEsNDYsMzIsNjksNzksNzAsCisgICAgNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCwzMiwKKyAgICAxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDk3LDExNiw5NywzMiwxMDUsMTE1LAorICAgIDMyLDEwMiwxMTEsMTE3LDExMCwxMDAsMzIsMTE2LDExMSwzMiw5OCwxMDEsMTAsMzIsMzIsMzIsCisgICAgMzIsMTE2LDExNCwxMTcsMTEwLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDc4LDExNCwxMDIsMCwwLDAsMTIyLDEwLDYwLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwKKyAgICAxMDAsMTAxLDYyLDExNCwzNywwLDAsMCwxMTQsMTQsMCwwLDAsMjMzLDgsMCwKKyAgICAwLDAsMjMzLDEyLDAsMCwwLDEyMiwzMCw5OCw5NywxMDAsMzIsMTA5LDk3LDEwMywKKyAgICAxMDUsOTksMzIsMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsCisgICAgMTI1LDU4LDMyLDEyMywzMywxMTQsMTI1LDEyMiwyLDEyMywxMjUsMTIyLDQzLDExNCwxMDEsOTcsCisgICAgOTksMTA0LDEwMSwxMDAsMzIsNjksNzksNzAsMzIsMTE5LDEwNCwxMDUsMTA4LDEwMSwzMiwxMTQsCisgICAgMTAxLDk3LDEwMCwxMDUsMTEwLDEwMywzMiwxMTYsMTA1LDEwOSwxMDEsMTE1LDExNiw5NywxMDksMTEyLAorICAgIDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsMTIyLDQ4LDExNCwxMDEsOTcsOTksMTA0LDEwMSwKKyAgICAxMDAsMzIsNjksNzksNzAsMzIsMTE5LDEwNCwxMDUsMTA4LDEwMSwzMiwxMTQsMTAxLDk3LDEwMCwKKyAgICAxMDUsMTEwLDEwMywzMiwxMTUsMTA1LDEyMiwxMDEsMzIsMTExLDEwMiwzMiwxMTUsMTExLDExNywxMTQsCisgICAgOTksMTAxLDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsMjE4LDUsMTA5LDExNiwxMDUsMTA5LAorICAgIDEwMSwxMjIsMjYsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTA1LDExNSwzMiwxMTUsCisgICAgMTE2LDk3LDEwOCwxMDEsMzIsMTAyLDExMSwxMTQsMzIsMTIzLDMzLDExNCwxMjUsMjE4LDQsMTE1LAorICAgIDEwNSwxMjIsMTAxLDEwOCwzLDAsMCwwLDI1NSwxMjcsMjU1LDEyNywzLDAsNDEsMTAsCisgICAgMjE4LDEyLDc3LDY1LDcxLDczLDY3LDk1LDc4LDg1LDc3LDY2LDY5LDgyLDExNCw1MCwKKyAgICAwLDAsMCwxMTQsMTE4LDAsMCwwLDIxOCwxNiw5NSwxMTgsMTAxLDExNCw5OCwxMTEsCisgICAgMTE1LDEwMSw5NSwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTQsMTAzLDAsMCwwLDExNCwKKyAgICAzMywwLDAsMCwyMTgsOCw2OSw3OSw3MCw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDE2LAorICAgIDAsMCwwLDIxOCw4LDc1LDEwMSwxMjEsNjksMTE0LDExNCwxMTEsMTE0LDExNCwyMSwwLAorICAgIDAsMCw0MSwxMSwxMTQsNTYsMCwwLDAsMjE4LDEyLDExNSwxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsOTUsMTE1LDExNiw5NywxMTYsMTE1LDExNCwxMDIsMCwwLDAsMTE0LDM3LDAsMCwKKyAgICAwLDkwLDExLDEwMSwxMjAsOTksOTUsMTAwLDEwMSwxMTYsOTcsMTA1LDEwOCwxMTUsOTAsNSwKKyAgICAxMDksOTcsMTAzLDEwNSw5OSw5MCwxMywxMTQsOTcsMTE5LDk1LDExNiwxMDUsMTA5LDEwMSwxMTUsCisgICAgMTE2LDk3LDEwOSwxMTIsOTAsOCwxMTQsOTcsMTE5LDk1LDExNSwxMDUsMTIyLDEwMSwxMTQsNzksCisgICAgMCwwLDAsMjE4LDEyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTA5LDExNiwxMDUsMTA5LAorICAgIDEwMSwyMTgsMTEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTUsMTA1LDEyMiwxMDEsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDI1LDk1LAorICAgIDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsCisgICAgMTAxLDk1LDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsMTcxLDEsMCwwLDExNSw3NiwwLDAsCisgICAgMCwwLDExLDQsMSw4LDEsMTAsMyw0LDEsOCwxLDgsMSwxMiwKKyAgICAxLDEyLDEsMTIsMSw4LDEsMTIsMSwxMiwxLDE2LDEsMTIsMSwxMCwKKyAgICAxLDEyLDEsMTAsMSwxMiwxLDEwLDEsMTIsMSw4LDEsMTAsMSwyLAorICAgIDEsMTYsMSwxNiwxLDYsMiwxNCwxLDEwLDEsMTIsMSwxNCwxLDIsCisgICAgMSwxNiwxLDE2LDEsNiwyLDE0LDEsMTIsMSw4LDEsMTE0LDEzOSwwLAorICAgIDAsMCw5OSw0LDAsMCwwLDAsMCwwLDAsNSwwLDAsMCw1LAorICAgIDAsMCwwLDY3LDAsMCwwLDExNSw4MiwwLDAsMCwxMTYsMCwxMDYsMSwKKyAgICAxMjQsMCwxMzEsMSwxMjUsNCwxMTYsMiwxMjQsNCwxMTYsMywxMzEsMiwxMTQsNTgsCisgICAgMTE2LDQsMTA2LDUsMTAwLDEsMTI0LDIsMTMxLDIsMSwwLDEyNCwzLDEwMCwyLAorICAgIDEwNyw5LDExNCw1MiwxMTYsNiwxMDYsNywxMjQsNCwxMjQsMywxMzEsMiwxLDAsCisgICAgMTI0LDQsODMsMCwxMTAsMjAsMTE2LDgsMTAwLDMsMTA2LDksMTI0LDIsMTMxLDEsCisgICAgMTI0LDEsMTI0LDIsMTAwLDQsMTQxLDMsMTMwLDEsMTAwLDIsODMsMCw0MSw1LAorICAgIDEyMiw2MCw2NywxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsCisgICAgMTAwLDEwMSwzMiw5NywxMTUsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTAxLDEwMCwzMiw5OCwKKyAgICAxMjEsMzIsOTUsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTgsMTIxLDExNiwxMDEsCisgICAgOTksMTExLDEwMCwxMDEsOTUsMTA0LDEwMSw5NywxMDAsMTAxLDExNCw0MCw0MSw0NiwxMjIsMjEsCisgICAgOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwMiwxMTQsMTExLDEwOSwKKyAgICAzMiwxMjMsMzMsMTE0LDEyNSw3OCwxMjIsMjMsNzgsMTExLDExMCw0NSw5OSwxMTEsMTAwLDEwMSwKKyAgICAzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSw0MSwKKyAgICAyLDExNCwxMDIsMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDEwLDIxOCw3LDEwOSwKKyAgICA5NywxMTQsMTE1LDEwNCw5NywxMDgsOTAsNSwxMDgsMTExLDk3LDEwMCwxMTUsMjE4LDEwLDEwNSwKKyAgICAxMTUsMTA1LDExMCwxMTUsMTE2LDk3LDExMCw5OSwxMDEsMjE4LDEwLDk1LDk5LDExMSwxMDAsMTAxLAorICAgIDk1LDExNiwxMjEsMTEyLDEwMSwxMTQsMTE4LDAsMCwwLDExNCwxMzMsMCwwLDAsMjE4LAorICAgIDQsOTUsMTA1LDEwOSwxMTIsOTAsMTYsOTUsMTAyLDEwNSwxMjAsOTUsOTksMTExLDk1LDEwMiwKKyAgICAxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsMTAzLDAsMCwwLDExNCw1MCwwLDAsCisgICAgMCw0MSw1LDExNCw1NiwwLDAsMCwxMTQsMTAyLDAsMCwwLDExNCw5MywwLAorICAgIDAsMCwxMTQsOTQsMCwwLDAsMjE4LDQsOTksMTExLDEwMCwxMDEsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE3LDk1LDk5LAorICAgIDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDIyNiwKKyAgICAxLDAsMCwxMTUsMTYsMCwwLDAsMCwyLDEwLDEsMTAsMSwxMiwxLAorICAgIDgsMSwxMiwxLDYsMiwxMCwxLDExNCwxNDUsMCwwLDAsMTE0LDYyLDAsCisgICAgMCwwLDk5LDMsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDMsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDU2LDAsMCwwLDExNiwwLDExNiwxLAorICAgIDEzMSwxLDEyNSwzLDEyNCwzLDEwNiwyLDExNiwzLDEyNCwxLDEzMSwxLDEzMSwxLAorICAgIDEsMCwxMjQsMywxMDYsMiwxMTYsMywxMjQsMiwxMzEsMSwxMzEsMSwxLDAsCisgICAgMTI0LDMsMTA2LDIsMTE2LDQsMTA2LDUsMTI0LDAsMTMxLDEsMTMxLDEsMSwwLAorICAgIDEyNCwzLDgzLDAsNDEsMSwxMjIsODAsNjcsMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMzIsCiAgICAgOTcsMzIsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwNSwxMTAsCiAgICAgMTE2LDExMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTExLDExNCwzMiwKICAgICAxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDExNywxMTYsMzIsMTE2LDExMSwzMiw5NywKICAgICAzMiw5OCwxMjEsMTE2LDEwMSw0NSw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwxMDAsMTAsMzIsCiAgICAgMzIsMzIsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDQxLDYsMjE4LDksOTgsMTIxLDExNiwxMDEsCi0gICAgOTcsMTE0LDExNCw5NywxMjEsMTE0LDEzNywwLDAsMCwyMTgsNiwxMDEsMTIwLDExNiwxMDEsCi0gICAgMTEwLDEwMCwxMTQsMTksMCwwLDAsMTE0LDE0NCwwLDAsMCw5MCw1LDEwMCwxMTcsCi0gICAgMTA5LDExMiwxMTUsNDEsNCwxMTQsMTQ4LDAsMCwwLDExNCwxMzUsMCwwLDAsMTE0LAotICAgIDE0MiwwLDAsMCwxMTQsNTUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgOTcsMTE0LDExNCw5NywxMjEsMTE0LDEzMiwwLDAsMCwyMTgsNiwxMDEsMTIwLDExNiwxMDEsCisgICAgMTEwLDEwMCwxMTQsMTksMCwwLDAsMTE0LDE0MCwwLDAsMCw5MCw1LDEwMCwxMTcsCisgICAgMTA5LDExMiwxMTUsNDEsNCwxMTQsMTQ0LDAsMCwwLDExNCwxMzAsMCwwLDAsMTE0LAorICAgIDEzOCwwLDAsMCwxMTQsNTYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCiAgICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE3LDk1LDk5LDExMSwxMDAsMTAxLDk1LAogICAgIDExNiwxMTEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMjM4LDEsMCwwLDExNSwKLSAgICAxMCwwLDAsMCwwLDMsMTIsMSwxOSwxLDE5LDEsMjIsMSwxMTQsMTUyLAorICAgIDEwLDAsMCwwLDAsMyw4LDEsMTQsMSwxNCwxLDE2LDEsMTE0LDE0OCwKICAgICAwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCwKLSAgICA0LDAsMCwwLDY3LDAsMCwwLDExNSw4OSwwLDAsMCwxMDAsMSwwLAotICAgIDEwMCwyLDAsMTA4LDAsMCwxMjUsMSwwLDExNiwxLDAsMTA2LDIsMCwxMjQsCi0gICAgMCwwLDEzMSwxLDAsMTA2LDMsMCwxMjUsMiwwLDEyNCwxLDAsMTA2LDQsCi0gICAgMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwxMTYsMSwwLDEwNiw1LDAsCi0gICAgMTAwLDIsMCwxMDAsMywwLDEzMSwyLDAsMTI1LDQsMCwxMjQsNCwwLDEwNiwKLSAgICA2LDAsMTI0LDAsMCwxMDYsNiwwLDEyNCwzLDAsMTAwLDEsMCwyNSwxMzEsCi0gICAgMSwwLDEzMSwxLDAsODMsNDEsNCwxMjIsMTIxLDY4LDEwMSw5OSwxMTEsMTAwLDEwMSwKLSAgICAzMiw5OCwxMjEsMTE2LDEwMSwxMTUsMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsCi0gICAgMTA1LDExMCwxMDMsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSwzMiwKLSAgICA5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExNSwKLSAgICAxMTYsMTE0LDEwNSwxMTAsMTAzLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg1LDExMCwxMDUsMTE4LAotICAgIDEwMSwxMTQsMTE1LDk3LDEwOCwzMiwxMTAsMTAxLDExOSwxMDgsMTA1LDExMCwxMDEsMzIsMTE1LDExNywKLSAgICAxMTIsMTEyLDExMSwxMTQsMTE2LDMyLDEwNSwxMTUsMzIsMTE3LDExNSwxMDEsMTAwLDMyLDEwNSwxMTAsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDEwMSw5OSwxMTEsMTAwLDEwNSwxMTAsMTAzLDQ2LDEwLDMyLAotICAgIDMyLDMyLDMyLDExNCw2MSwwLDAsMCw3OCw4NCw0MSw3LDIxOCw4LDExNiwxMTEsCi0gICAgMTA3LDEwMSwxMTAsMTA1LDEyMiwxMDEsMTE0LDUxLDAsMCwwLDkwLDcsNjYsMTIxLDExNiwKLSAgICAxMDEsMTE1LDczLDc5LDkwLDgsMTE0LDEwMSw5NywxMDAsMTA4LDEwNSwxMTAsMTAxLDkwLDE1LAotICAgIDEwMCwxMDEsMTE2LDEwMSw5OSwxMTYsOTUsMTAxLDExMCw5OSwxMTEsMTAwLDEwNSwxMTAsMTAzLDkwLAotICAgIDI1LDczLDExMCw5OSwxMTQsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMDgsNzgsMTAxLDExOSwxMDgsCi0gICAgMTA1LDExMCwxMDEsNjgsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwyMTgsNiwxMDAsMTAxLDk5LDExMSwKLSAgICAxMDAsMTAxLDQxLDUsMjE4LDEyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsOTgsMTIxLDExNiwKLSAgICAxMDEsMTE1LDExNCwxNTMsMCwwLDAsOTAsMjEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwKLSAgICA5OCwxMjEsMTE2LDEwMSwxMTUsOTUsMTE0LDEwMSw5NywxMDAsMTA4LDEwNSwxMTAsMTAxLDIxOCw4LAotICAgIDEwMSwxMTAsOTksMTExLDEwMCwxMDUsMTEwLDEwMyw5MCwxNSwxMTAsMTAxLDExOSwxMDgsMTA1LDExMCwKLSAgICAxMDEsOTUsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEzLDEwMCwxMDEsOTksMTExLDEwMCwxMDEsCi0gICAgOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwyNDgsMSwwLDAsMTE1LDEwLDAsMCwwLAotICAgIDAsNSwxMiwxLDE4LDEsMTUsMSwxOCwxLDExNCwxNTcsMCwwLDAsMTE0LAotICAgIDEyOSwwLDAsMCwyMTgsMjYsMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwKLSAgICAxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LAotICAgIDk5LDIsMCwwLDAsMiwwLDAsMCw5LDAsMCwwLDE5LDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSw4OSwxLDAsMCwxMjQsMSwwLDEwMCwxLDAsCi0gICAgMTA3LDgsMCwxMTQsNzMsMCwxMDAsMiwwLDEyNSwxLDAsMTE2LDAsMCwxMjQsCi0gICAgMiwwLDEwMCwzLDAsMTMxLDIsMCwxMTQsNzMsMCwxMjEsMTksMCwxMjQsMiwKLSAgICAwLDEwNiwxLDAsMTI0LDAsMCwxMzEsMSwwLDEyNSwxLDAsODcsMTEwLDE4LAotICAgIDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCw3MiwwLDEsMSwxLDg5LDExMCwKLSAgICAxLDAsODgsMTE2LDMsMCwxMDYsNCwwLDEyNCwwLDAsMTI0LDIsMCwxMDAsCi0gICAgNCwwLDEyNCwxLDAsMTMxLDIsMSwxMjUsNCwwLDEwMCw1LDAsMTI0LDQsCi0gICAgMCw5NSw1LDAsMTI0LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDE5NCwwLAotICAgIDEyMCw3MywwLDExNiw2LDAsMTMxLDAsMCw2OCw5Myw1OCwwLDkyLDIsMCwKLSAgICAxMjUsNSwwLDEyNSw2LDAsMTI0LDEsMCwxMDYsNywwLDExNiw4LDAsMTI0LAotICAgIDYsMCwxMzEsMSwwLDEzMSwxLDAsMTE0LDEyOCwwLDEyNCw1LDAsMTI0LDAsCi0gICAgMCwxMjQsMSwwLDEzMSwyLDAsMTI1LDIsMCwxMjQsMiwwLDEyNCw0LDAsCi0gICAgOTUsOSwwLDgwLDExMywxMjgsMCw4NywxMDAsMSwwLDgzLDEyNCwzLDAsMTE2LAotICAgIDEwLDAsMTA3LDgsMCwxMTQsMjMsMSwxMTYsMCwwLDEyNCwyLDAsMTAwLDYsCi0gICAgMCwxMzEsMiwwLDExNCwzMiwxLDEyMSwxOSwwLDEyNCwyLDAsMTA2LDExLDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDEyNSw3LDAsODcsMTEwLDE4LDAsNCwxMTYsMiwKLSAgICAwLDEwNywxMCwwLDExNCw0LDEsMSwxLDEsODksMTEzLDMyLDEsODgsMTI0LAotICAgIDcsMCwxMTQsMzIsMSwxMDMsMCwwLDEyNCw0LDAsOTUsMTIsMCwxMTAsOSwKLSAgICAwLDEyNCwzLDAsMTI0LDQsMCw5NSwxMiwwLDEyNCw0LDAsMTA2LDEyLDAsCi0gICAgMTAzLDAsMCwxMDcsMiwwLDExNCw4NSwxLDEyNCwxLDAsMTE0LDg1LDEsMTE2LAotICAgIDEzLDAsMTI0LDEsMCwxMzEsMSwwLDEwMCw3LDAsMjUsMTI1LDgsMCwxMjQsCi0gICAgNCwwLDEwNiwxMiwwLDEwNiwxNCwwLDEyNCw4LDAsMTMxLDEsMCwxLDEyNCwKLSAgICA0LDAsODMsNDEsOCw5Nyw2MSwxLDAsMCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLAorICAgIDQsMCwwLDAsNjcsMCwwLDAsMTE1LDYyLDAsMCwwLDEwMCwxLDEwMCwKKyAgICAyLDEwOCwwLDEyNSwxLDExNiwxLDEwNiwyLDEyNCwwLDEzMSwxLDEwNiwzLDEyNSwKKyAgICAyLDEyNCwxLDEwNiw0LDEyNCwyLDEzMSwxLDEyNSwzLDExNiwxLDEwNiw1LDEwMCwKKyAgICAyLDEwMCwzLDEzMSwyLDEyNSw0LDEyNCw0LDEwNiw2LDEyNCwwLDEwNiw2LDEyNCwKKyAgICAzLDEwMCwxLDI1LDAsMTMxLDEsMTMxLDEsODMsMCw0MSw0LDEyMiwxMjEsNjgsCisgICAgMTAxLDk5LDExMSwxMDAsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDExNSwzMiwxMTQsMTAxLDExMiwxMTQsCisgICAgMTAxLDExNSwxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLAorICAgIDk5LDExMSwxMDAsMTAxLDMyLDk3LDExMCwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNDYsMTAsMTAsMzIsMzIsMzIsCisgICAgMzIsODUsMTEwLDEwNSwxMTgsMTAxLDExNCwxMTUsOTcsMTA4LDMyLDExMCwxMDEsMTE5LDEwOCwxMDUsCisgICAgMTEwLDEwMSwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMzIsMTA1LDExNSwzMiwxMTcsMTE1LAorICAgIDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDAsMTAxLDk5LDExMSwxMDAsMTA1LAorICAgIDExMCwxMDMsNDYsMTAsMzIsMzIsMzIsMzIsMTE0LDYyLDAsMCwwLDc4LDg0LDQxLAorICAgIDcsMjE4LDgsMTE2LDExMSwxMDcsMTAxLDExMCwxMDUsMTIyLDEwMSwxMTQsNTIsMCwwLDAsCisgICAgOTAsNyw2NiwxMjEsMTE2LDEwMSwxMTUsNzMsNzksOTAsOCwxMTQsMTAxLDk3LDEwMCwxMDgsCisgICAgMTA1LDExMCwxMDEsOTAsMTUsMTAwLDEwMSwxMTYsMTAxLDk5LDExNiw5NSwxMDEsMTEwLDk5LDExMSwKKyAgICAxMDAsMTA1LDExMCwxMDMsOTAsMjUsNzMsMTEwLDk5LDExNCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LAorICAgIDEwOCw3OCwxMDEsMTE5LDEwOCwxMDUsMTEwLDEwMSw2OCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDIxOCwKKyAgICA2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsNDEsNSwyMTgsMTIsMTE1LDExMSwxMTcsMTE0LDk5LAorICAgIDEwMSw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsMTE0LDE0OSwwLDAsMCw5MCwyMSwxMTUsMTExLAorICAgIDExNywxMTQsOTksMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDExNSw5NSwxMTQsMTAxLDk3LDEwMCwxMDgsCisgICAgMTA1LDExMCwxMDEsMjE4LDgsMTAxLDExMCw5OSwxMTEsMTAwLDEwNSwxMTAsMTAzLDkwLDE1LDExMCwKKyAgICAxMDEsMTE5LDEwOCwxMDUsMTEwLDEwMSw5NSwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTMsMTAwLAorICAgIDEwMSw5OSwxMTEsMTAwLDEwMSw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDI0OCwxLDAsMCwKKyAgICAxMTUsMTAsMCwwLDAsMCw1LDgsMSwxMiwxLDEwLDEsMTIsMSwxMTQsCisgICAgMTUzLDAsMCwwLDQxLDIsMTE0LDEyNCwwLDAsMCwyMTgsMjYsMTE1LDExNyw5OCwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSwKKyAgICA5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LDk5LDIsMCwwLDAsMiwwLDAsMCwKKyAgICA5LDAsMCwwLDE5LDAsMCwwLDY3LDAsMCwwLDExNSwxOCwxLDAsCisgICAgMCwxMjQsMSwxMDAsMSwxMDcsOCwxMTQsNjAsMTAwLDIsMTI1LDEsMTE2LDAsMTI0LAorICAgIDIsMTAwLDMsMTMxLDIsMTE0LDcwLDEyMSwxNCwxMjQsMiwxMDYsMSwxMjQsMCwxMzEsCisgICAgMSwxMjUsMSw4NywwLDExMyw3MCw0LDAsMTE2LDIsMTA3LDEwLDExNCw1NiwxLAorICAgIDAsMSwwLDEsMCw4OSwwLDExMyw3MCw4OCwwLDExMCwxMCwxMTYsMywxMDYsCisgICAgNCwxMjQsMSwxMzEsMSwxMjUsMSwxMTYsNSwxMDYsNiwxMjQsMCwxMjQsMiwxMjQsCisgICAgMSwxMDAsNCwxNDEsMywxMjUsNCwxMDAsNSwxMjQsNCw5NSw3LDEyNCwyLDEwMCwKKyAgICAxLDEwNyw4LDExNCwxNTYsMTIwLDU0LDExNiw4LDEzMSwwLDY4LDAsOTMsNDAsOTIsCisgICAgMiwxMjUsNSwxMjUsNiwxMjQsMSwxMDYsOSwxMTYsMTAsMTI0LDYsMTMxLDEsMTMxLAorICAgIDEsMTE0LDEwOCwxMjQsNSwxMjQsMCwxMjQsMSwxMzEsMiwxMjUsMiwxMjQsMiwxMjQsCisgICAgNCw5NSwxMSw4MCwwLDExMywxMDgsODcsMCwxMDAsMSw4MywwLDEyNCwzLDExNiwKKyAgICAxMiwxMDcsOCwxMTQsMjIyLDExNiwwLDEyNCwyLDEwMCw2LDEzMSwyLDExNCwyMjgsMTIxLAorICAgIDE0LDEyNCwyLDEwNiwxMywxMjQsMCwxMzEsMSwxMjUsNyw4NywwLDExMCwyMCw0LAorICAgIDAsMTE2LDIsMTA3LDEwLDExNCwyMDgsMSwwLDEsMCwxLDAsODksMCwxMTMsCisgICAgMjI4LDg4LDAsMTI0LDcsMTE0LDIyOCwxMDMsMCwxMjQsNCw5NSwxNCwxMTAsNiwxMjQsCisgICAgMywxMjQsNCw5NSwxNCwxMjQsNCwxMDYsMTQsMTAzLDAsMTA3LDIsMTQ0LDEsMTE0LAorICAgIDE0LDEyNCwxLDE0NCwxLDExNCwxNCwxMTYsMTUsMTI0LDEsMTMxLDEsMTAwLDcsMjUsCisgICAgMCwxMjUsOCwxMjQsNCwxMDYsMTQsMTA2LDE2LDEyNCw4LDEzMSwxLDEsMCwxMjQsCisgICAgNCw4MywwLDQxLDgsOTcsNjEsMSwwLDAsODIsMTAxLDExNiwxMTcsMTE0LDExMCwKICAgICAzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwzMiw5OCwKICAgICA5NywxMTUsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDgsCiAgICAgMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMTEsCkBAIC04NTQsNDYwICs3NzgsNDQwIEBACiAgICAgMTIxLDMyLDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0MCw0MSwzMiw5NywxMTQsMTAzLAogICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDEyMiw5LDYwLDExNywxMTAsMTA3LDExMCwxMTEsCiAgICAgMTE5LDExMCw2MiwyMTgsMTIsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksCi0gICAgMTAxLDIxOCw2LDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDg0LDIxOCwxMCwxMDUsMTE1LDk1LDExMiwKLSAgICA5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTQsNjEsMCwwLDAsNDEsMTUsMTE0LDExNywwLAotICAgIDAsMCwxMTQsMTU5LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDEyMywwLDAsCi0gICAgMCwyMTgsMTAsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDkwLDEzLDk1LAotICAgIDExNSwxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSw5NywxMTYsMTE2LDExNCwyMTgsMjcsOTUsMTAzLAotICAgIDEwMSwxMTYsOTUsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsOTUsMTAyLDEwNSwxMDgsCi0gICAgMTAxLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCw5NCwwLDAsMCwxMTQsOTUsCi0gICAgMCwwLDAsMTE0LDEyOSwwLDAsMCwyMTgsOSw5NSw4MCw3OSw4MCw4NSw3NiwKLSAgICA2NSw4NCw2OSwxMTQsMTYxLDAsMCwwLDExNCwxNTgsMCwwLDAsMTE0LDQwLDAsCi0gICAgMCwwLDIxOCw2LDk3LDExMiwxMTIsMTAxLDExMCwxMDAsNDEsOSwxMTQsMTA4LDAsMCwKLSAgICAwLDkwLDgsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE0LDEyOSwwLDAsMCwKLSAgICAxMTQsMTU4LDAsMCwwLDIxOCw0LDExNSwxMTIsMTAxLDk5LDIxOCwxMiwxMDgsMTExLDk3LAotICAgIDEwMCwxMDEsMTE0LDk1LDk5LDEwOCw5NywxMTUsMTE1LDIxOCw4LDExNSwxMTcsMTAyLDEwMiwxMDUsCi0gICAgMTIwLDEwMSwxMTUsMTE0LDE2MSwwLDAsMCw5MCw3LDEwMCwxMDUsMTE0LDExMCw5NywxMDksCi0gICAgMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLAotICAgIDIxOCwyMywxMTUsMTEyLDEwMSw5OSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTAyLDEwNSwxMDgsMTAxLAotICAgIDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDksMiwwLDAsMTE1LDYwLDAsCi0gICAgMCwwLDAsMTIsMTIsNCw2LDEsMTUsMiwzLDEsMTksMSwxMywxLAotICAgIDUsOCwyNCwxLDksMywxMiwxLDIyLDEsMjEsMSwxNSwxLDksMSwKLSAgICA1LDIsNCwzLDEyLDIsMTUsMSwzLDEsMTksMSwxMywxLDUsMiwKLSAgICA2LDEsMTIsMiw5LDEsMTUsMSw2LDEsMTYsMSwxNiwyLDExNCwxNjksCi0gICAgMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgNSwwLDAsMCw2NCwwLDAsMCwxMTUsMTIxLDAsMCwwLDEwMSwwLDAsCi0gICAgOTAsMSwwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwKLSAgICAyLDAsOTAsNCwwLDEwMCwzLDAsOTAsNSwwLDEwMCw0LDAsOTAsNiwKLSAgICAwLDEwMSw3LDAsMTAwLDUsMCwxMDAsNiwwLDEzMiwwLDAsMTMxLDEsMCwKLSAgICA5MCw4LDAsMTAxLDcsMCwxMDAsNywwLDEwMCw4LDAsMTMyLDAsMCwxMzEsCi0gICAgMSwwLDkwLDksMCwxMDEsNywwLDEwMCw5LDAsMTAwLDksMCwxMDAsMTAsCi0gICAgMCwxMDAsMTEsMCwxMzIsMiwwLDEzMSwxLDAsOTAsMTAsMCwxMDEsNywwLAotICAgIDEwMCw5LDAsMTAwLDEyLDAsMTAwLDEzLDAsMTMyLDEsMCwxMzEsMSwwLDkwLAotICAgIDExLDAsMTAwLDksMCw4Myw0MSwxNCwyMTgsMjEsODcsMTA1LDExMCwxMDAsMTExLDExOSwKLSAgICAxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTIyLAotICAgIDYyLDc3LDEwMSwxMTYsOTcsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwMCwxMDEsCi0gICAgOTksMTA4LDk3LDExNCwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsODcsMTA1LAotICAgIDExMCwxMDAsMTExLDExOSwxMTUsMzIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw0NiwxMjIsCi0gICAgNTksODMsMTExLDEwMiwxMTYsMTE5LDk3LDExNCwxMDEsOTIsODAsMTIxLDExNiwxMDQsMTExLDExMCwKLSAgICA5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDY3LDExMSwxMTQsMTAxLDkyLDEyMywxMTUsMTIxLDExNSwKLSAgICA5NSwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMTI1LDkyLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE1LDkyLDEyMywxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsMTI1LDEyMiw2NSw4MywxMTEsCi0gICAgMTAyLDExNiwxMTksOTcsMTE0LDEwMSw5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDkyLDgwLDEyMSwKLSAgICAxMTYsMTA0LDExMSwxMTAsNjcsMTExLDExNCwxMDEsOTIsMTIzLDExNSwxMjEsMTE1LDk1LDExOCwxMDEsCi0gICAgMTE0LDExNSwxMDUsMTExLDExMCwxMjUsOTIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsOTIsMTIzLAotICAgIDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSwxMjUsOTIsNjgsMTAxLDk4LDExNywxMDMsNzAsCi0gICAgOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMTEsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDY3LDAsMCwwLDEyMSwyMywwLDExNiwwLDAsCi0gICAgMTA2LDEsMCwxMTYsMCwwLDEwNiwyLDAsMTI0LDEsMCwxMzEsMiwwLDgzLAotICAgIDg3LDExMCwzNywwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsNjIsMCwxLDEsCi0gICAgMSwxMTYsMCwwLDEwNiwxLDAsMTE2LDAsMCwxMDYsNCwwLDEyNCwxLDAsCi0gICAgMTMxLDIsMCw4Myw4OSwxMTAsMSwwLDg4LDEwMCwwLDAsODMsNDEsMSw3OCwKLSAgICA0MSw1LDIxOCw3LDk1LDExOSwxMDUsMTEwLDExNCwxMDEsMTAzLDkwLDcsNzksMTEyLDEwMSwKLSAgICAxMTAsNzUsMTAxLDEyMSw5MCwxNyw3Miw3NSw2OSw4OSw5NSw2Nyw4NSw4Miw4Miw2OSwKLSAgICA3OCw4NCw5NSw4NSw4Myw2OSw4MiwxMTQsNDIsMCwwLDAsOTAsMTgsNzIsNzUsCi0gICAgNjksODksOTUsNzYsNzksNjcsNjUsNzYsOTUsNzcsNjUsNjcsNzIsNzMsNzgsNjksCi0gICAgNDEsMiwyMTgsMyw5OSwxMDgsMTE1LDExNCw1LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNCw5NSwxMTEsMTEyLAotICAgIDEwMSwxMTAsOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw4NywyLDAsMCwxMTUsCi0gICAgOCwwLDAsMCwwLDIsMywxLDIzLDEsMTMsMSwxMjIsMzYsODcsMTA1LAotICAgIDExMCwxMDAsMTExLDExOSwxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsCi0gICAgMTAwLDEwMSwxMTQsNDYsOTUsMTExLDExMiwxMDEsMTEwLDk1LDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LAotICAgIDExNCwxMjEsOTksMiwwLDAsMCwwLDAsMCwwLDYsMCwwLDAsMTYsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDE0MywwLDAsMCwxMjQsMCwwLDEwNiwKLSAgICAwLDAsMTE0LDIxLDAsMTI0LDAsMCwxMDYsMSwwLDEyNSwyLDAsMTEwLDksCi0gICAgMCwxMjQsMCwwLDEwNiwyLDAsMTI1LDIsMCwxMjQsMiwwLDEwNiwzLDAsCi0gICAgMTAwLDEsMCwxMjQsMSwwLDEwMCwyLDAsMTE2LDQsMCwxMDYsNSwwLDEwMCwKLSAgICAwLDAsMTAwLDMsMCwxMzMsMiwwLDI1LDEzMSwwLDIsMTI1LDMsMCwxMjEsCi0gICAgNDcsMCwxMjQsMCwwLDEwNiw2LDAsMTI0LDMsMCwxMzEsMSwwLDE0MywyNSwKLSAgICAwLDEyNSw0LDAsMTE2LDcsMCwxMDYsOCwwLDEyNCw0LDAsMTAwLDQsMCwKLSAgICAxMzEsMiwwLDEyNSw1LDAsODcsMTAwLDAsMCw4MSw4Miw4OCw4NywxMTAsMjIsCi0gICAgMCw0LDExNiw5LDAsMTA3LDEwLDAsMTE0LDEzOCwwLDEsMSwxLDEwMCwwLAotICAgIDAsODMsODksMTEwLDEsMCw4OCwxMjQsNSwwLDgzLDQxLDUsNzgsMTE0LDEyOCwKLSAgICAwLDAsMCw5MCwxMSwxMTUsMTIxLDExNSw5NSwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsCi0gICAgMTE0LDgyLDAsMCwwLDExNCwzMiwwLDAsMCw0MSwxMCwyMTgsMTEsNjgsNjksCi0gICAgNjYsODUsNzEsOTUsNjYsODUsNzMsNzYsNjgsMjE4LDE4LDgyLDY5LDcxLDczLDgzLAotICAgIDg0LDgyLDg5LDk1LDc1LDY5LDg5LDk1LDY4LDY5LDY2LDg1LDcxLDIxOCwxMiw4MiwKLSAgICA2OSw3MSw3Myw4Myw4NCw4Miw4OSw5NSw3NSw2OSw4OSwxMTQsNDksMCwwLDAsCi0gICAgMTE0LDgsMCwwLDAsMjE4LDcsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLDExNCwxNzMsCi0gICAgMCwwLDAsMTE0LDE3MSwwLDAsMCw5MCwxMCw4MSwxMTcsMTAxLDExNCwxMjEsODYsCi0gICAgOTcsMTA4LDExNywxMDEsMTE0LDQyLDAsMCwwLDQxLDYsMTE0LDE3MiwwLDAsMCwKLSAgICAxMTQsMTI4LDAsMCwwLDkwLDEyLDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsOTUsCi0gICAgMTA3LDEwMSwxMjEsMTE0LDUsMCwwLDAsOTAsNCwxMDQsMTA3LDEwMSwxMjEsMjE4LDgsCi0gICAgMTAyLDEwNSwxMDgsMTAxLDExMiw5NywxMTYsMTA0LDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw2LDAsMCwwLDIxOCwxNiw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsCi0gICAgOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw5NCwyLDAsMCwxMTUsMjIsMCwKLSAgICAwLDAsMCwyLDksMSwxMiwyLDksMSwxNSwxLDIyLDEsMywxLAotICAgIDE4LDEsMjksMSwxMywxLDksMSwxMjIsMzgsODcsMTA1LDExMCwxMDAsMTExLDExOSwKLSAgICAxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsCi0gICAgOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsCi0gICAgNzgsOTksNCwwLDAsMCwwLDAsMCwwLDgsMCwwLDAsMTQsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDE1OCwwLDAsMCwxMjQsMCwwLDEwNiwwLAotICAgIDAsMTI0LDEsMCwxMzEsMSwwLDEyNSw0LDAsMTI0LDQsMCwxMDAsMCwwLAotICAgIDEwNyw4LDAsMTE0LDMxLDAsMTAwLDAsMCw4MywxMjEsMTQsMCwxMTYsMSwwLAotICAgIDEyNCw0LDAsMTMxLDEsMCwxLDg3LDExMCwyMiwwLDQsMTE2LDIsMCwxMDcsCi0gICAgMTAsMCwxMTQsNjksMCwxLDEsMSwxMDAsMCwwLDgzLDg5LDExMCwxLDAsCi0gICAgODgsMTIwLDgxLDAsMTE2LDMsMCwxMzEsMCwwLDY4LDkzLDcwLDAsOTIsMiwKLSAgICAwLDEyNSw1LDAsMTI1LDYsMCwxMjQsNCwwLDEwNiw0LDAsMTE2LDUsMCwKLSAgICAxMjQsNiwwLDEzMSwxLDAsMTMxLDEsMCwxMTQsODAsMCwxMTYsNiwwLDEwNiwKLSAgICA3LDAsMTI0LDEsMCwxMjQsNSwwLDEyNCwxLDAsMTI0LDQsMCwxMzEsMiwKLSAgICAwLDEwMCwxLDAsMTI0LDQsMCwxMzEsMiwxLDEyNSw3LDAsMTI0LDcsMCwKLSAgICA4MywxMTMsODAsMCw4NywxMDAsMCwwLDgzLDQxLDIsNzgsMTE0LDE2MCwwLDAsCi0gICAgMCw0MSw4LDExNCwxNzksMCwwLDAsMTE0LDQxLDAsMCwwLDExNCw0MiwwLAotICAgIDAsMCwxMTQsMTYzLDAsMCwwLDExNCw5NCwwLDAsMCwxMTQsOTUsMCwwLAotICAgIDAsMTE0LDEyMywwLDAsMCwyMTgsMTYsMTE1LDExMiwxMDEsOTksOTUsMTAyLDExNCwxMTEsCi0gICAgMTA5LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDEsOCwxMTQsMTcyLDAsMCwwLDExNCwKLSAgICAxMjgsMCwwLDAsMTE0LDM3LDAsMCwwLDIxOCw2LDExNiw5NywxMTQsMTAzLDEwMSwKLSAgICAxMTYsMTE0LDE3OCwwLDAsMCwxMTQsMTI5LDAsMCwwLDExNCwxNjgsMCwwLDAsCi0gICAgMTE0LDE2NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNiwwLDAsMCwyMTgsOSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksMTA5LAotICAgIDIsMCwwLDExNSwyNiwwLDAsMCwwLDIsMTUsMSwxMiwxLDQsMSwKLSAgICAzLDEsMTQsMSwxMywxLDksMSwyMiwxLDIxLDEsOSwxLDE1LDEsCi0gICAgOSwxLDEyMiwzMSw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsCi0gICAgMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LAotICAgIDExMiwxMDEsOTksOTksMywwLDAsMCwwLDAsMCwwLDQsMCwwLDAsCi0gICAgMywwLDAsMCw2NywwLDAsMCwxMTUsNDUsMCwwLDAsMTI0LDAsMCwKLSAgICAxMDYsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDEyNSwzLDAsMTI0LAotICAgIDMsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDM3LDAsMTI0LDMsMCwxMDYsMSwKLSAgICAwLDgzLDEwMCwxLDAsODMsMTAwLDEsMCw4Myw0MSwyLDEyMiwxMDgsNzAsMTA1LAotICAgIDExMCwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAwLDMyLAotICAgIDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw0NiwKLSAgICAxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksCi0gICAgMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsCi0gICAgMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwKLSAgICAxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCwxODIsMCwKLSAgICAwLDAsMTE0LDEyOSwwLDAsMCw0MSw0LDExNCwxNzIsMCwwLDAsMTE0LDEyOCwKLSAgICAwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDE2NiwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsMTAyLDEwNSwKLSAgICAxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDEyNSwyLDAsMCwxMTUsOCwwLAotICAgIDAsMCwwLDcsMTgsMSwxMiwxLDcsMiwxMjIsMzMsODcsMTA1LDExMCwxMDAsCi0gICAgMTExLDExOSwxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQxLDEyLDExNCwKLSAgICAxMTQsMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE1LDAsMCwwLDExNCwxMTYsCi0gICAgMCwwLDAsMTE0LDE3NiwwLDAsMCwxMTQsMTc1LDAsMCwwLDExNCwxNzQsMCwKLSAgICAwLDAsMjE4LDExLDk5LDEwOCw5NywxMTUsMTE1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNCwKLSAgICAxNzMsMCwwLDAsMTE0LDE3OSwwLDAsMCwxMTQsMTgyLDAsMCwwLDExNCwxODMsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDYsMCwwLDAsMTE0LDE3MCwwLDAsMCw3NSwyLDAsMCwKLSAgICAxMTUsMjAsMCwwLDAsMTIsMiw2LDMsNiwzLDYsMiw2LDIsMTgsCi0gICAgNywxOCwxNSwzLDEsMjEsMTUsMywxLDExNCwxNzAsMCwwLDAsOTksMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwKLSAgICAwLDAsMCwxMTUsNzAsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsCi0gICAgMCw5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLAotICAgIDEzMiwwLDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLAotICAgIDUsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDgsCi0gICAgMCwxMDAsOSwwLDEzMiwwLDAsOTAsNywwLDEwMCwxMCwwLDgzLDQxLDExLAotICAgIDIxOCwxMyw5NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsMTIyLAotICAgIDgzLDY2LDk3LDExNSwxMDEsMzIsOTksMTA4LDk3LDExNSwxMTUsMzIsMTExLDEwMiwzMiw5OSwKLSAgICAxMTEsMTA5LDEwOSwxMTEsMTEwLDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsCi0gICAgMTAwLDMyLDk4LDEyMSwzMiw5OCwxMTEsMTE2LDEwNCwzMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgNzYsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsODMsCi0gICAgMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsCi0gICAgMTAwLDEwMSwxMTQsNDYsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLAotICAgIDAsMywwLDAsMCw2NywwLDAsMCwxMTUsODgsMCwwLDAsMTE2LDAsCi0gICAgMCwxMjQsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMzEsMSwwLDEzMSwxLDAsCi0gICAgMTAwLDEsMCwyNSwxMjUsMiwwLDEyNCwyLDAsMTA2LDIsMCwxMDAsMiwwLAotICAgIDEwMCwxLDAsMTMxLDIsMCwxMDAsMywwLDI1LDEyNSwzLDAsMTI0LDEsMCwKLSAgICAxMDYsMywwLDEwMCwyLDAsMTMxLDEsMCwxMDAsNCwwLDI1LDEyNSw0LDAsCi0gICAgMTI0LDMsMCwxMDAsNSwwLDEwNywyLDAsMTExLDg3LDAsMTI0LDQsMCwxMDAsCi0gICAgNSwwLDEwNywzLDAsODMsNDEsNiwxMjIsMTQxLDY3LDExMSwxMTAsOTksMTE0LDEwMSwKLSAgICAxMTYsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLAotICAgIDExMCwzMiwxMTEsMTAyLDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwxMTYsNzYsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDk4LDEyMSwKLSAgICAzMiw5OSwxMDQsMTAxLDk5LDEwNywxMDUsMTEwLDEwMywzMiwxMDUsMTAyLDEwLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNCwxMDEsCi0gICAgMTE2LDExNywxMTQsMTEwLDEwMSwxMDAsMzIsOTgsMTIxLDMyLDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsCi0gICAgMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMDQsOTcsMTE1LDMyLDk3LDMyLDEwMiwxMDUsMTA4LAotICAgIDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDM5LDk1LDk1LDEwNSwxMTAsMTA1LDExNiwKLSAgICA5NSw5NSw0NiwxMTIsMTIxLDM5LDQ2LDExNCwzMSwwLDAsMCwxMTQsNjAsMCwwLAotICAgIDAsMTE0LDYxLDAsMCwwLDExNCw1OCwwLDAsMCwyMTgsOCw5NSw5NSwxMDUsCi0gICAgMTEwLDEwNSwxMTYsOTUsOTUsNDEsNCwxMTQsNDAsMCwwLDAsMTE0LDE1OSwwLDAsCi0gICAgMCwxMTQsMzYsMCwwLDAsMTE0LDM0LDAsMCwwLDQxLDUsMTE0LDExMCwwLAotICAgIDAsMCwxMTQsMTI4LDAsMCwwLDExNCw5NiwwLDAsMCw5MCwxMywxMDIsMTA1LAotICAgIDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTUsOTgsOTcsMTE1LDEwMSw5MCw5LDExNiw5NywxMDUsCi0gICAgMTA4LDk1LDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw2LDAsMCwwLDExNCwxNjEsMCwwLDAsMTQ0LDIsMCwwLDExNSw4LAotICAgIDAsMCwwLDAsMywyNSwxLDIyLDEsMTksMSwxMjIsMjQsOTUsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LAotICAgIDk5LDEwNyw5NywxMDMsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCi0gICAgMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLAotICAgIDEsMCw4Myw0MSwyLDEyMiw0Miw4NSwxMTUsMTAxLDMyLDEwMCwxMDEsMTAyLDk3LDExNywKLSAgICAxMDgsMTE2LDMyLDExNSwxMDEsMTA5LDk3LDExMCwxMTYsMTA1LDk5LDExNSwzMiwxMDIsMTExLDExNCwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDUsMTExLDExMCwKLSAgICA0Niw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMTAsMCwwLDAsMTE0LDE2NiwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAotICAgIDAsMCwyMTgsMTMsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDE1MiwyLDAsMCwxMTUsMCwwLDAsMCwxMjIsMjcsOTUsNzYsMTExLDk3LAotICAgIDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDk5LDExNCwxMDEsOTcsMTE2LDEwMSwKLSAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsCi0gICAgMywwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw4MCwwLDAsCi0gICAgMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMDYsMSwwLDEzMSwxLDAsCi0gICAgMTI1LDIsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsNTQsMCwxMTYsCi0gICAgMiwwLDEwMCwyLDAsMTA2LDMsMCwxMjQsMSwwLDEwNiwxLDAsMTMxLDEsCi0gICAgMCwxMzEsMSwwLDEzMCwxLDAsMTE2LDQsMCwxMDYsNSwwLDExNiw2LDAsCi0gICAgMTI0LDIsMCwxMjQsMSwwLDEwNiw3LDAsMTMxLDMsMCwxLDEwMCwxLDAsCi0gICAgODMsNDEsMywxMjIsMTksNjksMTIwLDEwMSw5OSwxMTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0Niw3OCwxMjIsNTIsOTksOTcsMTEwLDExMCwxMTEsCi0gICAgMTE2LDMyLDEwOCwxMTEsOTcsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywKLSAgICAxMTQsMTI1LDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwKLSAgICA0MCw0MSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsNzgsMTExLDExMCwxMDEsNDEsCi0gICAgOCwyMTgsOCwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE0LDAsMCwwLAotICAgIDExNCwxMDksMCwwLDAsMTE0LDQ5LDAsMCwwLDExNCwxMjMsMCwwLDAsMjE4LAotICAgIDI1LDk1LDk5LDk3LDEwOCwxMDgsOTUsMTE5LDEwNSwxMTYsMTA0LDk1LDEwMiwxMTQsOTcsMTA5LAotICAgIDEwMSwxMTUsOTUsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMTAwLDIxOCw0LDEwMSwxMjAsMTAxLDk5LAotICAgIDExNCwxMjAsMCwwLDAsNDEsMywxMTQsMTEwLDAsMCwwLDIxOCw2LDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDExNCwxNDgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDExLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDE1NSwyLDAsMCwxMTUsMTAsMCwwLDAsMCwyLAotICAgIDE4LDEsMTIsMSw5LDEsMTUsMSwxMjIsMjUsOTUsNzYsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAotICAgIDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDExNiwwLDAsCi0gICAgMTA2LDEsMCwxMjQsMCwwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwxLDc4LAotICAgIDQxLDIsMTE0LDEyMywwLDAsMCwyMTgsMTcsOTUsMTA4LDExMSw5NywxMDAsOTUsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwNCwxMDUsMTA5LDQxLDIsMTE0LDExMCwwLDAsCi0gICAgMCwxMTQsMTI4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw2LDAsMCwwLDIxOCwxMSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSwxNjMsMiwwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNSw5NSwKLSAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsNDYsMTA4LDExMSw5NywKLSAgICAxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNzgsNDEsOCwxMTQsMTE0LDAsMCwwLAotICAgIDExNCwxMTMsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTE2LDAsMCwwLDExNCwKLSAgICAxNjEsMCwwLDAsMTE0LDE4NywwLDAsMCwxMTQsMTkyLDAsMCwwLDExNCwxOTQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDYsMCwwLDAsMTE0LDE4NSwwLDAsMCwxMzksMiwwLDAsCi0gICAgMTE1LDEwLDAsMCwwLDEyLDMsNiwyLDEyLDgsMTIsMywxMiw4LDExNCwKLSAgICAxODUsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsNCwwLDAsMCw2NCwwLDAsMCwxMTUsMTA2LDAsMCwwLDEwMSwwLAotICAgIDAsOTAsMSwwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsMTAwLDIsMCwKLSAgICAxMzIsMCwwLDkwLDMsMCwxMDAsMywwLDEwMCw0LDAsMTMyLDAsMCw5MCwKLSAgICA0LDAsMTAwLDUsMCwxMDAsNiwwLDEzMiwwLDAsOTAsNSwwLDEwMCw3LAotICAgIDAsMTAwLDgsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOSwwLDEwMCwxMCwwLAotICAgIDEzMiwwLDAsOTAsNywwLDEwMCwxMSwwLDEwMCwxOCwwLDEwMCwxMywwLDEwMCwKLSAgICAxNCwwLDEzMiwwLDEsOTAsOCwwLDEwMCwxNSwwLDEwMCwxNiwwLDEzMiwwLAotICAgIDAsOTAsOSwwLDEwMCwxNywwLDgzLDQxLDE5LDIxOCwxMiw4MywxMTEsMTE3LDExNCwKLSAgICA5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDk5LDIsMCwwLDAsMCwwLDAsCi0gICAgMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDEwLDAsCi0gICAgMCwwLDExNiwwLDAsMTMwLDEsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDE3OCwKLSAgICA3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwKLSAgICAxMTYsMTA0LDk3LDExNiwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExNiwxMDUsCi0gICAgMTA5LDEwMSwzMiw0MCw5NywxMTAsMzIsMTA1LDExMCwxMTYsNDEsMzIsMTAyLDExMSwxMTQsMzIsCi0gICAgMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE1LDExMiwxMDEsOTksCi0gICAgMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMTIsOTcsMTE2LDEwNCw0NCwzMiwxMTksMTA0LDEwMSwxMTQsCi0gICAgMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwNSwxMTUsMzIsOTcsMzIsMTE1LDExNiwxMTQsNDYsCi0gICAgMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODIsOTcsMTA1LDExNSwxMDEsMTE1LAotICAgIDMyLDczLDc5LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDk4LDEwMSwKLSAgICAzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDEwMCw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiw3OCw0MSwxLDIxOCw3LDczLDc5LDY5LDExNCwxMTQsMTExLDExNCw0MSwyLAotICAgIDExNCwxMTAsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCw5NSwKLSAgICAxMDksMTE2LDEwNSwxMDksMTAxLDE2OSwyLDAsMCwxMTUsMiwwLDAsMCwwLDYsCi0gICAgMTIyLDIzLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTEyLAotICAgIDk3LDExNiwxMDQsOTUsMTA5LDExNiwxMDUsMTA5LDEwMSw5OSwyLDAsMCwwLDAsMCwKLSAgICAwLDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxOSwKLSAgICAwLDAsMCwxMDAsMSwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEzMSwKLSAgICAxLDAsMTA1LDEsMCw4Myw0MSwyLDk3LDE3MCwxLDAsMCw3OSwxMTIsMTE2LAotICAgIDEwNSwxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTQsMTAxLDExNiwKLSAgICAxMTcsMTE0LDExMCwxMDUsMTEwLDEwMywzMiw5NywzMiwxMDksMTAxLDExNiw5NywxMDAsOTcsMTE2LAotICAgIDk3LDMyLDEwMCwxMDUsOTksMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwKLSAgICAxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTEyLDk3LDExNiwxMDQsMTAsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMTE2LDExMSwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTEyLDk3LDExNiwxMDQsMzIsNDAsMTE1LDExNiwxMTQsNDEsNDYsMTAsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsODAsMTExLDExNSwxMTUsMTA1LDk4LDEwOCwxMDEsMzIsMTA3LDEwMSwxMjEsCi0gICAgMTE1LDU4LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQ1LDMyLDM5LDEwOSwxMTYsCi0gICAgMTA1LDEwOSwxMDEsMzksMzIsNDAsMTA5LDk3LDExMCwxMDAsOTcsMTE2LDExMSwxMTQsMTIxLDQxLAotICAgIDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDExNywxMDksMTAxLDExNCwxMDUsOTksMzIsCi0gICAgMTE2LDEwNSwxMDksMTAxLDExNSwxMTYsOTcsMTA5LDExMiwzMiwxMTEsMTAyLDMyLDEwOCw5NywxMTUsCi0gICAgMTE2LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsOTksMTExLDEwMCwxMDEsMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMDUsOTksOTcsCi0gICAgMTE2LDEwNSwxMTEsMTEwLDU5LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQ1LDMyLAotICAgIDM5LDExNSwxMDUsMTIyLDEwMSwzOSwzMiw0MCwxMTEsMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsCi0gICAgNDEsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTA1LDEyMiwxMDEsMzIsMTA1LDExMCwKLSAgICAzMiw5OCwxMjEsMTE2LDEwMSwxMTUsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTExLAotICAgIDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsCi0gICAgMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDk3LDEwOCwxMDgsCi0gICAgMTExLDExOSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTYsCi0gICAgMTExLDMyLDExNCwxMDEsOTcsMTAwLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLAotICAgIDEwMiwxMDUsMTA4LDEwMSwxMTUsNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODIsCi0gICAgOTcsMTA1LDExNSwxMDEsMTE1LDMyLDczLDc5LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA0LAotICAgIDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTksOTcsMTEwLDExMCwKLSAgICAxMTEsMTE2LDMyLDk4LDEwMSwzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDEwMCw0NiwxMCwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMTM1LDAsMCwwLDQxLDEsMTE0LDE5NywKLSAgICAwLDAsMCw0MSwyLDExNCwxMTAsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMCwKLSAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LDExNiwxMTUsMTc3LDIsMCwwLDExNSwyLAotICAgIDAsMCwwLDAsMTEsMTIyLDIzLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsCi0gICAgMTAwLDEwMSwxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDk5LDQsCi0gICAgMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDE2LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMiwKLSAgICAwLDEyNCwzLDAsMTMxLDIsMCw4Myw0MSwxLDEyMiwyMjgsNzksMTEyLDExNiwxMDUsCi0gICAgMTExLDExMCw5NywxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE5LDEwNCwxMDUsOTksCi0gICAgMTA0LDMyLDExOSwxMTQsMTA1LDExNiwxMDEsMTE1LDMyLDEwMCw5NywxMTYsOTcsMzIsNDAsOTgsCi0gICAgMTIxLDExNiwxMDEsMTE1LDQxLDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLAotICAgIDExMiw5NywxMTYsMTA0LDMyLDQwLDk3LDMyLDExNSwxMTYsMTE0LDQxLDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsCi0gICAgMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLAotICAgIDk3LDEwOCwxMDgsMTExLDExOSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE5LAotICAgIDExNCwxMDUsMTE2LDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLAotICAgIDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEyLDk3LAotICAgIDExNiwxMDQsMzIsMTA1LDExNSwzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiwxMDUsMTEwLDMyLAotICAgIDExMSwxMTQsMTAwLDEwMSwxMTQsMzIsMTE2LDExMSwzMiw5OSwxMTEsMTE0LDExNCwxMDEsOTksMTE2LAotICAgIDEwOCwxMjEsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMDEsMTE0LDMyLDExMiwxMDEsMTE0LDEwOSwKLSAgICAxMDUsMTE1LDExNSwxMDUsMTExLDExMCwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgNDEsMSwyMTgsOCwxMTUsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDQxLDQsMTE0LDExMCwKLSAgICAwLDAsMCwxMTQsOTIsMCwwLDAsOTAsMTAsOTksOTcsOTksMTA0LDEwMSw5NSwKLSAgICAxMTIsOTcsMTE2LDEwNCwxMTQsNTUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE1LDk1LDk5LDk3LDk5LDEwNCwxMDEsCi0gICAgOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMTkwLDIsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsOCwxMjIsMjgsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCw0Niw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwKLSAgICAxMDAsMTAxLDk5LDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDEsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4MywKLSAgICA0MSwyLDEyMiwxNTAsNzksMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsMzIsMTA5LDEwMSwxMTYsCi0gICAgMTA0LDExMSwxMDAsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExOSwxMTQsMTA1LDExNiwxMDEsMTE1LAotICAgIDMyLDEwMCw5NywxMTYsOTcsMzIsNDAsOTgsMTIxLDExNiwxMDEsMTE1LDQxLDMyLDExNiwxMTEsCi0gICAgMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDQwLDk3LDMyLAotICAgIDExNSwxMTYsMTE0LDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDczLAotICAgIDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDUsMTE1LAotICAgIDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDk3LDEwOCwxMDgsMTExLDExOSwxMTUsMzIsMTAyLAotICAgIDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwxMTAsMTAzLDMyLDExMSwKLSAgICAxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDExNSwKLSAgICA0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMTQsNCwwLDAsMCwKLSAgICA0MSwzLDExNCwxMTAsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw1NSwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAxMTQsMTk5LDAsMCwwLDIwMCwyLDAsMCwxMTUsMCwwLDAsMCwxMjIsMjEsCi0gICAgODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMTUsMTAxLDExNiwKLSAgICA5NSwxMDAsOTcsMTE2LDk3LDk5LDIsMCwwLDAsMCwwLDAsMCw1LDAsCi0gICAgMCwwLDE2LDAsMCwwLDY3LDAsMCwwLDExNSwxMDUsMCwwLDAsMTI0LAotICAgIDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwwLDEyMSwxOSwKLSAgICAwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwKLSAgICA4NywxMTAsNTgsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDk0LDAsMSwxMjUsCi0gICAgNCwwLDEsMTIyLDI2LDAsMTE2LDMsMCwxMDAsMSwwLDEwMCwyLDAsMTI0LAotICAgIDEsMCwxMzEsMSwxLDEyNCw0LDAsMTMwLDIsMCw4Nyw4OSwxMDAsMywwLAotICAgIDEwMCwzLDAsMTI1LDQsMCwxMjYsNCwwLDg4LDExMCwxLDAsODgsMTE2LDQsCi0gICAgMCwxMjQsMywwLDEzMSwxLDAsODMsNDEsNCwxMjIsNTIsNjcsMTExLDExMCw5OSwKLSAgICAxMTQsMTAxLDExNiwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LAotICAgIDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsNzMsMTEwLDExNSwxMTIsMTAxLDk5LDExNiw3NiwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw0NiwKLSAgICAxMjIsMzksMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMTAsMTExLDExNiwzMiw5NywxMTgsOTcsCi0gICAgMTA1LDEwOCw5Nyw5OCwxMDgsMTAxLDMyLDExNiwxMDQsMTE0LDExMSwxMTcsMTAzLDEwNCwzMiwxMDMsCi0gICAgMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDQwLDQxLDExNCwxMDgsMCwwLDAsNzgsNDEsCi0gICAgNSwxMTQsMTU5LDAsMCwwLDIxOCw4LDEwMywxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsCi0gICAgMTE0LDQyLDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDE1NywwLDAsMCw0MSwKLSAgICA1LDExNCwxMTAsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsMzcsMCwwLDAsCi0gICAgMTE0LDE1NSwwLDAsMCwyMTgsMywxMDEsMTIwLDk5LDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMCwxMDMsMTAxLDExNiw5NSwxMTUsCi0gICAgMTExLDExNywxMTQsOTksMTAxLDIwNywyLDAsMCwxMTUsMTQsMCwwLDAsMCwyLAotICAgIDE1LDEsMywxLDE5LDEsMTgsMSw5LDEsMzEsMSwxMjIsMjMsODMsMTExLAotICAgIDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsCi0gICAgMTExLDExNywxMTQsOTksMTAxLDIxOCw5LDk1LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwxMDEsCi0gICAgMTE0LDMxLDAsMCwwLDk5LDMsMCwwLDAsMSwwLDAsMCw0LDAsCi0gICAgMCwwLDksMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDExNiwKLSAgICAwLDAsMTA2LDEsMCwxMTYsMiwwLDEyNCwxLDAsMTI0LDIsMCwxMDAsMSwKLSAgICAwLDEwMCwyLDAsMTAwLDMsMCwxMDAsNCwwLDEyNCwzLDAsMTMxLDQsMiwKLSAgICA4Myw0MSw1LDEyMiwxMzAsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICA5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsOTksMTExLDEwOSwxMTIsCi0gICAgMTA1LDEwOCwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMzksCi0gICAgMTAwLDk3LDExNiw5NywzOSwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsOTksCi0gICAgOTcsMTEwLDMyLDk4LDEwMSwzMiw5NywxMTAsMTIxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwKLSAgICAzMiwxMTYsMTIxLDExMiwxMDEsMzIsMTE2LDEwNCw5NywxMTYsMzIsOTksMTExLDEwOSwxMTIsMTA1LAotICAgIDEwOCwxMDEsNDAsNDEsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDExNSw0NiwxMCwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMTkwLDAsMCwwLDIxOCwxMiwxMDAsMTExLAotICAgIDExMCwxMTYsOTUsMTA1LDExMCwxMDQsMTAxLDExNCwxMDUsMTE2LDg0LDExNCw3MCwwLDAsMCwKLSAgICA0MSwzLDExNCwxMjMsMCwwLDAsMTE0LDE4OSwwLDAsMCwyMTgsNyw5OSwxMTEsCi0gICAgMTA5LDExMiwxMDUsMTA4LDEwMSw0MSw0LDExNCwxMTAsMCwwLDAsMTE0LDU1LDAsMCwKLSAgICAwLDExNCwzNywwLDAsMCwxMTQsMjA0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNCwxMTUsMTExLDExNywxMTQsCi0gICAgOTksMTAxLDk1LDExNiwxMTEsOTUsOTksMTExLDEwMCwxMDEsMjE3LDIsMCwwLDExNSw0LAotICAgIDAsMCwwLDAsNSwyMSwxLDEyMiwyNyw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE2LDExMSw5NSwKLSAgICA5OSwxMTEsMTAwLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMTAsMCwwLAotICAgIDAsNDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE3NCwxLDAsMCwxMjQsMCwKLSAgICAwLDEwNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTAwLDEsMCwKLSAgICAxMjUsMywwLDEyMSwxNiwwLDExNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwKLSAgICA0LDAsODcsMTEwLDI0LDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCw2MywwLAotICAgIDEsMSwxLDEwMCwxLDAsMTI1LDQsMCw4OSwxMTAsMjAyLDAsODgsMTIxLDE5LAotICAgIDAsMTI0LDAsMCwxMDYsMywwLDEyNCwyLDAsMTMxLDEsMCwxMjUsNSwwLAotICAgIDg3LDExMCwxOCwwLDQsMTE2LDQsMCwxMDcsMTAsMCwxMTQsMTAzLDAsMSwxLAotICAgIDEsODksMTEwLDE2MiwwLDg4LDExNiw1LDAsMTI0LDUsMCwxMDAsMiwwLDI1LAotICAgIDEzMSwxLDAsMTI1LDMsMCwxMjEsMTksMCwxMjQsMCwwLDEwNiw2LDAsMTI0LAotICAgIDQsMCwxMzEsMSwwLDEyNSw2LDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLAotICAgIDEwNywxMCwwLDExNCwxNTksMCwxLDEsMSw4OSwxMTAsMTA2LDAsODgsMTIxLDM0LAotICAgIDAsMTE2LDgsMCwxMjQsNiwwLDEwMCwzLDAsMTI0LDUsMCwxMDAsNCwwLAotICAgIDEyNCwxLDAsMTAwLDUsMCwxMjQsNCwwLDEzMSwxLDMsMTI1LDcsMCw4NywKLSAgICAxMTAsMjQsMCw0LDExNiw5LDAsMTE2LDEwLDAsMTAyLDIsMCwxMDcsMTAsMCwKLSAgICAxMTQsMjIwLDAsMSwxLDEsODksMTEwLDQ1LDAsODgsMTE2LDExLDAsMTAwLDYsCi0gICAgMCwxMjQsNCwwLDEyNCwyLDAsMTMxLDMsMCwxLDExNiwxMiwwLDEyNCw3LAotICAgIDAsMTAwLDQsMCwxMjQsMSwwLDEwMCw3LDAsMTI0LDQsMCwxMDAsOCwwLAotICAgIDEyNCwyLDAsMTMxLDEsMyw4MywxMjQsMCwwLDEwNiw2LDAsMTI0LDIsMCwKLSAgICAxMzEsMSwwLDEyNSw4LDAsMTI0LDAsMCwxMDYsMTMsMCwxMjQsOCwwLDEyNCwKLSAgICAyLDAsMTMxLDIsMCwxMjUsOSwwLDExNiwxMSwwLDEwMCw5LDAsMTI0LDIsCi0gICAgMCwxMzEsMiwwLDEsMTE2LDE0LDAsMTA2LDE1LDAsMTIsMTE0LDE3MCwxLDEyNCwKLSAgICA0LDAsMTAwLDEsMCwxMDcsOSwwLDExNCwxNzAsMSwxMjQsMywwLDEwMCwxLAotICAgIDAsMTA3LDksMCwxMTQsMTcwLDEsMTE2LDE2LDAsMTI0LDksMCwxMjQsMywwLAotICAgIDExNiwxNywwLDEyNCw4LDAsMTMxLDEsMCwxMzEsMywwLDEyNSw2LDAsMTIxLAotICAgIDM2LDAsMTI0LDAsMCwxMDYsMTgsMCwxMjQsMiwwLDEyNCw0LDAsMTI0LDYsCi0gICAgMCwxMzEsMywwLDEsMTE2LDExLDAsMTAwLDEwLDAsMTI0LDQsMCwxMzEsMiwKLSAgICAwLDEsODcsMTEwLDE4LDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCwxNjksMSwKLSAgICAxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCw5LDAsODMsNDEsMTEsMTIyLDE5MCwKLSAgICA2NywxMTEsMTEwLDk5LDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsCi0gICAgMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiw3MywxMTAsMTE1LDExMiwxMDEsCi0gICAgOTksMTE2LDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLAotICAgIDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4MiwxMDEsOTcsMTAwLAotICAgIDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsCi0gICAgMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LAotICAgIDk3LDExNiwxMTUsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksCi0gICAgMTAxLDExMCwxMTYsMTAxLDEwMCw0NiwzMiw4NCwxMTEsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwxMCwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwKLSAgICA0NCwzMiwxMTUsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDMyLDEwOSwxMTcsMTE1LDExNiwzMiwKLSAgICA5NywxMDgsMTE1LDExMSwzMiw5OCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwKLSAgICAxMTYsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMTQsCi0gICAgMTM1LDAsMCwwLDExNCwxNDAsMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsMzcsCi0gICAgMCwwLDAsMTIyLDEzLDEyMywxMjUsMzIsMTA5LDk3LDExNiw5OSwxMDQsMTAxLDExNSwzMiwKLSAgICAxMjMsMTI1LDExNCw5MSwwLDAsMCwxMTQsOTIsMCwwLDAsMTIyLDE5LDk5LDExMSwKLSAgICAxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLAotICAgIDEyNSwxMjIsMTAsMTE5LDExNCwxMTEsMTE2LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw0MSwxOSwxMTQsCi0gICAgMTU5LDAsMCwwLDExNCw4MSwwLDAsMCwxMTQsNjgsMCwwLDAsMTE0LDE5OCwKLSAgICAwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCwxNiwwLDAsMCwxMTQsMjAxLDAsCi0gICAgMCwwLDExNCw0MiwwLDAsMCwxMTQsMTQzLDAsMCwwLDExNCwxMDksMCwwLAotICAgIDAsMTE0LDEzOCwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxNDksMCwwLDAsCi0gICAgMTE0LDIwNywwLDAsMCwxMTQsOCwwLDAsMCwyMTgsMTksMTAwLDExMSwxMTAsMTE2LAotICAgIDk1LDExOSwxMTQsMTA1LDExNiwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMTE0LAotICAgIDE1MiwwLDAsMCwxMTQsMzMsMCwwLDAsMTE0LDIwMCwwLDAsMCw0MSwxMCwKLSAgICAxMTQsMTEwLDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LDkyLDAsMCwwLDExNCwKLSAgICAxNDEsMCwwLDAsMTE0LDkxLDAsMCwwLDIxOCwyLDExNSwxMTYsMTE0LDU1LDAsCi0gICAgMCwwLDIxOCwxMCw5OCwxMjEsMTE2LDEwMSwxMTUsOTUsMTAwLDk3LDExNiw5NywxMTQsMTU1LAotICAgIDAsMCwwLDkwLDExLDk5LDExMSwxMDAsMTAxLDk1LDExMSw5OCwxMDYsMTAxLDk5LDExNiwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsCi0gICAgMTg4LDAsMCwwLDIyNSwyLDAsMCwxMTUsNzgsMCwwLDAsMCw3LDE1LAotICAgIDEsNiwxLDMsMSwxNiwxLDEzLDEsMTEsMiwzLDEsMTksMSwxMywKLSAgICAxLDUsMiwxNiwxLDMsMSwxOSwxLDEzLDEsNSwyLDMsMSw5LAotICAgIDEsMTIsMSwxMywxLDE5LDEsNSwyLDksMSw3LDEsMTUsMSw2LAotICAgIDEsNywxLDE1LDEsMTgsMSwxMywxLDIyLDEsMTIsMSw5LDEsMTUsCi0gICAgMSwzLDEsMTksMSwxNywxLDEzLDEsNSwxLDEyMiwyMSw4MywxMTEsMTE3LAotICAgIDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwKLSAgICAxMDAsMTAxLDc4LDExNCw4OSwwLDAsMCw0MSwxMCwxMTQsMTE0LDAsMCwwLDExNCwKLSAgICAxMTMsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTk3LDAsMCwwLDExNCwxOTgsCi0gICAgMCwwLDAsMTE0LDIwMCwwLDAsMCwxMTQsMTk5LDAsMCwwLDExNCwyMDMsMCwKLSAgICAwLDAsMTE0LDIwNywwLDAsMCwxMTQsMTg4LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLAotICAgIDExNCwxOTUsMCwwLDAsMTY3LDIsMCwwLDExNSwxNCwwLDAsMCwxMiwyLAotICAgIDEyLDgsMTIsMTMsMTIsMTAsMTIsNywxMiwxMCwxOCw4LDExNCwxOTUsMCwwLAorICAgIDEwMSw0MSwxLDIxOCw2LDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDg0LDIxOCwxMCwxMDUsMTE1LAorICAgIDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTQsNjIsMCwwLDAsNDEsMTcsMTE0LAorICAgIDExMiwwLDAsMCwxMTQsMTU1LDAsMCwwLDExNCwxMDMsMCwwLDAsMTE0LDMsCisgICAgMCwwLDAsMTE0LDY3LDAsMCwwLDExNCwxMTgsMCwwLDAsMjE4LDEwLDc3LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw5MCwxMyw5NSwxMTUsMTAxLDExNiw5NSwKKyAgICAxMDIsMTA1LDEwOCwxMDEsOTcsMTE2LDExNiwxMTQsMjE4LDI3LDk1LDEwMywxMDEsMTE2LDk1LDExNSwKKyAgICAxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDk1LDEwMiwxMDUsMTA4LDEwMSw5NSwxMDgsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDExNSwxMTQsOTYsMCwwLDAsMTE0LDk3LDAsMCwwLDExNCwKKyAgICAxMjQsMCwwLDAsMjE4LDksOTUsODAsNzksODAsODUsNzYsNjUsODQsNjksMTE0LAorICAgIDE1NywwLDAsMCwxMTQsMTU0LDAsMCwwLDExNCw0MCwwLDAsMCwyMTgsNiwKKyAgICA5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDQxLDksMTE0LDEwMiwwLDAsMCw5MCw4LDEwOCwKKyAgICAxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNCwxMjQsMCwwLDAsMTE0LDE1NCwwLDAsCisgICAgMCwyMTgsNCwxMTUsMTEyLDEwMSw5OSwyMTgsMTIsMTA4LDExMSw5NywxMDAsMTAxLDExNCw5NSwKKyAgICA5OSwxMDgsOTcsMTE1LDExNSwyMTgsOCwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDExNCwKKyAgICAxNTcsMCwwLDAsOTAsNywxMDAsMTA1LDExNCwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMjMsMTE1LDExMiwKKyAgICAxMDEsOTksOTUsMTAyLDExNCwxMTEsMTA5LDk1LDEwMiwxMDUsMTA4LDEwMSw5NSwxMDgsMTExLDk5LAorICAgIDk3LDExNiwxMDUsMTExLDExMCw5LDIsMCwwLDExNSw2MiwwLDAsMCwwLDEyLAorICAgIDgsNCw0LDEsMTAsMiwyLDEsMTQsMSwxNCwxLDgsMiwxMCw4LAorICAgIDE2LDEsNiwzLDgsMSwxNiwxLDE0LDEsMTAsMSw2LDEsNiwyLAorICAgIDQsMyw4LDIsMTAsMSwyLDEsMTQsMSwxNCwxLDYsMiw0LDEsCisgICAgOCwyLDYsMSwxMiwxLDYsMSwxMiwxLDEyLDIsMTE0LDE2NSwwLDAsCiAgICAgMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0LDAsCi0gICAgMCwwLDAsMCwwLDAsMTE1LDExMiwwLDAsMCwxMDEsMCwwLDkwLDEsCi0gICAgMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLAotICAgIDEwMCwzLDAsMTMyLDAsMCw5MCw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwKLSAgICAwLDAsOTAsNSwwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsCi0gICAgMCwxMDEsNywwLDEzNSwwLDAsMTAyLDEsMCwxMDAsOCwwLDEwMCw5LDAsCi0gICAgMTM0LDAsMCwxMzEsMSwwLDkwLDgsMCwxMDEsNywwLDEwMCwxMCwwLDEwMCwKLSAgICAxMSwwLDEzMiwwLDAsMTMxLDEsMCw5MCw5LDAsMTAwLDEyLDAsMTAwLDEzLAotICAgIDAsMTMyLDAsMCw5MCwxMCwwLDEzNSwwLDAsODMsNDEsMTQsMjE4LDEwLDcwLAorICAgIDAsMCw2NCwwLDAsMCwxMTUsODAsMCwwLDAsMTAxLDAsOTAsMSwxMDAsCisgICAgMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsOTAsNCwxMDAsMyw5MCw1LDEwMCwKKyAgICA0LDkwLDYsMTAxLDcsMTAwLDUsMTAwLDYsMTMyLDAsMTMxLDEsOTAsOCwxMDEsCisgICAgNywxMDAsNywxMDAsOCwxMzIsMCwxMzEsMSw5MCw5LDEwMSw3LDEwMCwxNCwxMDAsCisgICAgMTAsMTAwLDExLDEzMiwxLDEzMSwxLDkwLDEwLDEwMSw3LDEwMCwxNSwxMDAsMTIsMTAwLAorICAgIDEzLDEzMiwxLDEzMSwxLDkwLDExLDEwMCw5LDgzLDAsNDEsMTYsMjE4LDIxLDg3LAorICAgIDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDgyLDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsCisgICAgMTEwLDEwMCwxMDEsMTE0LDEyMiw2Miw3NywxMDEsMTE2LDk3LDMyLDExMiw5NywxMTYsMTA0LDMyLAorICAgIDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDExNSwzMiwxMDAsMTAxLDk5LDEwOCw5NywxMTQsMTAxLDEwMCwzMiwxMDUsMTEwLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDMyLDExNCwxMDEsMTAzLDEwNSwxMTUsCisgICAgMTE2LDExNCwxMjEsNDYsMTIyLDU5LDgzLDExMSwxMDIsMTE2LDExOSw5NywxMTQsMTAxLDkyLDgwLAorICAgIDEyMSwxMTYsMTA0LDExMSwxMTAsOTIsODAsMTIxLDExNiwxMDQsMTExLDExMCw2NywxMTEsMTE0LDEwMSwKKyAgICA5MiwxMjMsMTE1LDEyMSwxMTUsOTUsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLDEyNSw5Miw3NywKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDExNSw5MiwxMjMsMTAyLDExNywxMDgsMTA4LDExMCw5NywxMDksMTAxLAorICAgIDEyNSwxMjIsNjUsODMsMTExLDEwMiwxMTYsMTE5LDk3LDExNCwxMDEsOTIsODAsMTIxLDExNiwxMDQsCisgICAgMTExLDExMCw5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDY3LDExMSwxMTQsMTAxLDkyLDEyMywxMTUsCisgICAgMTIxLDExNSw5NSwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMTI1LDkyLDc3LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsMTE1LDkyLDEyMywxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsMTI1LDkyLDY4LAorICAgIDEwMSw5OCwxMTcsMTAzLDcwLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDExLDAsMCwwLDY3LDAsMCwwLDExNSw1MCwwLDAsMCwxMjEsCisgICAgMTQsMTE2LDAsMTA2LDEsMTE2LDAsMTA2LDIsMTI0LDEsMTMxLDIsODMsMCw0LAorICAgIDAsMTE2LDMsMTA3LDEwLDExNCw0NCwxLDAsMSwwLDEsMCwxMTYsMCwxMDYsCisgICAgMSwxMTYsMCwxMDYsNCwxMjQsMSwxMzEsMiw4MywwLDg4LDAsMTAwLDAsODMsCisgICAgMCw0MSwxLDc4LDQxLDUsMjE4LDcsOTUsMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsOTAsCisgICAgNyw3OSwxMTIsMTAxLDExMCw3NSwxMDEsMTIxLDkwLDE3LDcyLDc1LDY5LDg5LDk1LDY3LAorICAgIDg1LDgyLDgyLDY5LDc4LDg0LDk1LDg1LDgzLDY5LDgyLDExNCw0MiwwLDAsMCwKKyAgICA5MCwxOCw3Miw3NSw2OSw4OSw5NSw3Niw3OSw2Nyw2NSw3Niw5NSw3Nyw2NSw2NywKKyAgICA3Miw3Myw3OCw2OSw0MSwyLDIxOCwzLDk5LDEwOCwxMTUsMTE0LDUsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LAorICAgIDE0LDk1LDExMSwxMTIsMTAxLDExMCw5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDg5LAorICAgIDIsMCwwLDExNSw4LDAsMCwwLDAsMiwyLDEsMTQsMSwxNCwxLAorICAgIDEyMiwzNiw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwKKyAgICAxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMTEsMTEyLDEwMSwxMTAsOTUsMTE0LDEwMSwKKyAgICAxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw5OSwyLDAsMCwwLDAsMCwwLDAsNiwKKyAgICAwLDAsMCwxNiwwLDAsMCw2NywwLDAsMCwxMTUsMTEyLDAsMCwwLAorICAgIDEyNCwwLDEwNiwwLDExNCwxNCwxMjQsMCwxMDYsMSwxMjUsMiwxMTAsNiwxMjQsMCwKKyAgICAxMDYsMiwxMjUsMiwxMjQsMiwxMDYsMywxMjQsMSwxMDAsMSwxMTYsNCwxMDYsNSwKKyAgICAxMDAsMCwxMDAsMiwxMzMsMiwyNSwwLDIyLDAsMTAwLDMsMTQxLDIsMTI1LDMsCisgICAgMTIxLDM4LDEyNCwwLDEwNiw2LDEyNCwzLDEzMSwxLDE0MywxOCwxMjUsNCwxMTYsNywKKyAgICAxMDYsOCwxMjQsNCwxMDAsNCwxMzEsMiwxMjUsNSw4NywwLDEwMCwwLDgxLDAsCisgICAgODIsMCw4OCwwLDg3LDAsMTEwLDIwLDQsMCwxMTYsOSwxMDcsMTAsMTE0LDEwNiwKKyAgICAxLDAsMSwwLDEsMCwxMDAsMCw4MywwLDg4LDAsMTI0LDUsODMsMCwKKyAgICA0MSw1LDc4LDEyMiw1LDM3LDEwMCw0NiwzNywxMDAsMTE0LDU5LDAsMCwwLDQxLAorICAgIDIsMTE0LDEyMywwLDAsMCw5MCwxMSwxMTUsMTIxLDExNSw5NSwxMTgsMTAxLDExNCwxMTUsCisgICAgMTA1LDExMSwxMTAsMTE0LDMyLDAsMCwwLDQxLDEwLDIxOCwxMSw2OCw2OSw2Niw4NSwKKyAgICA3MSw5NSw2Niw4NSw3Myw3Niw2OCwyMTgsMTgsODIsNjksNzEsNzMsODMsODQsODIsCisgICAgODksOTUsNzUsNjksODksOTUsNjgsNjksNjYsODUsNzEsMjE4LDEyLDgyLDY5LDcxLAorICAgIDczLDgzLDg0LDgyLDg5LDk1LDc1LDY5LDg5LDExNCw1MCwwLDAsMCwxMTQsOCwKKyAgICAwLDAsMCwyMTgsMTIsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLDk1LDEwNSwxMTAsMTAyLAorICAgIDExMSwxMTQsMTY5LDAsMCwwLDExNCwxNjcsMCwwLDAsOTAsMTAsODEsMTE3LDEwMSwKKyAgICAxMTQsMTIxLDg2LDk3LDEwOCwxMTcsMTAxLDExNCw0MiwwLDAsMCw0MSw2LDExNCwxNjgsCisgICAgMCwwLDAsMTE0LDEyMywwLDAsMCw5MCwxMiwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwKKyAgICAxMTQsMTIxLDk1LDEwNywxMDEsMTIxLDExNCw1LDAsMCwwLDkwLDQsMTA0LDEwNywxMDEsCisgICAgMTIxLDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwxMTIsOTcsMTE2LDEwNCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTYsOTUsMTE1LDEwMSw5NywKKyAgICAxMTQsOTksMTA0LDk1LDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsOTYsMiwwLDAsCisgICAgMTE1LDIyLDAsMCwwLDAsMiw2LDEsOCwyLDYsMSw2LDEsMjIsCisgICAgMSwyLDEsMTIsMSwyNiwxLDE0LDEsNiwxLDEyMiwzOCw4NywxMDUsMTEwLAorICAgIDEwMCwxMTEsMTE5LDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsCisgICAgMTAxLDExNCw0Niw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwKKyAgICAxMTYsMTE0LDEyMSw3OCw5OSw0LDAsMCwwLDAsMCwwLDAsOCwwLDAsCisgICAgMCwxNCwwLDAsMCw2NywwLDAsMCwxMTUsMTIwLDAsMCwwLDEyNCwwLAorICAgIDEwNiwwLDEyNCwxLDEzMSwxLDEyNSw0LDEyNCw0LDEwMCwwLDEwNyw4LDExNCwyMiwKKyAgICAxMDAsMCw4MywwLDEyMSwxMiwxMTYsMSwxMjQsNCwxMzEsMSwxLDAsODcsMCwKKyAgICAxMTAsMjAsNCwwLDExNiwyLDEwNywxMCwxMTQsNTQsMSwwLDEsMCwxLDAsCisgICAgMTAwLDAsODMsMCw4OCwwLDEyMCw1OCwxMTYsMywxMzEsMCw2OCwwLDkzLDQ4LAorICAgIDkyLDIsMTI1LDUsMTI1LDYsMTI0LDQsMTA2LDQsMTE2LDUsMTI0LDYsMTMxLDEsCisgICAgMTMxLDEsMTE0LDY0LDExNiw2LDEwNiw3LDEyNCwxLDEyNCw1LDEyNCwxLDEyNCw0LAorICAgIDEzMSwyLDEyNCw0LDEwMCwxLDE0MSwzLDEyNSw3LDEyNCw3LDgzLDAsMTEzLDY0LAorICAgIDg3LDAsMTAwLDAsODMsMCw0MSwyLDc4LDQxLDEsMTE0LDE1NiwwLDAsMCwKKyAgICA0MSw4LDExNCwxNzUsMCwwLDAsMTE0LDQxLDAsMCwwLDExNCw0MiwwLDAsCisgICAgMCwxMTQsMTU5LDAsMCwwLDExNCw5NiwwLDAsMCwxMTQsOTcsMCwwLDAsCisgICAgMTE0LDExOCwwLDAsMCwyMTgsMTYsMTE1LDExMiwxMDEsOTksOTUsMTAyLDExNCwxMTEsMTA5LAorICAgIDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDEsOCwxMTQsMTY4LDAsMCwwLDExNCwxMjMsCisgICAgMCwwLDAsMTE0LDM3LDAsMCwwLDIxOCw2LDExNiw5NywxMTQsMTAzLDEwMSwxMTYsCisgICAgMTE0LDE3NCwwLDAsMCwxMTQsMTI0LDAsMCwwLDExNCwxNjQsMCwwLDAsMTE0LAorICAgIDE2MiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKKyAgICAwLDAsMCwyMTgsOSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksMTExLDIsCisgICAgMCwwLDExNSwyNiwwLDAsMCwwLDIsMTAsMSw4LDEsNCwxLDIsCisgICAgMSwxMiwxLDE0LDEsNiwxLDE2LDEsMTQsMSw2LDEsOCwxLDgsCisgICAgMSwxMjIsMzEsODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwKKyAgICAxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsCisgICAgMTAxLDk5LDk5LDMsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDMsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDM2LDAsMCwwLDEyNCwwLDEwNiwwLAorICAgIDEyNCwxLDEyNCwyLDEzMSwyLDEyNSwzLDEyNCwzLDEwMCwxLDEwNyw5LDExNCwyOCwKKyAgICAxMjQsMywxMDYsMSw4MywwLDExMCw0LDEwMCwxLDgzLDAsMTAwLDEsODMsMCwKKyAgICA0MSwyLDEyMiwxMDgsNzAsMTA1LDExMCwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsCisgICAgMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTE0LDEwMSwxMDMsCisgICAgMTA1LDExNSwxMTYsMTE0LDEyMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICA4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwKKyAgICAxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwKKyAgICAxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLAorICAgIDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICA3OCw0MSwyLDExNCwxNzgsMCwwLDAsMTE0LDEyNCwwLDAsMCw0MSw0LDExNCwKKyAgICAxNjgsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDE2MiwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAorICAgIDAsMCwyMTgsMTEsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDEyNywKKyAgICAyLDAsMCwxMTUsOCwwLDAsMCwwLDcsMTIsMSw4LDEsOCwyLAorICAgIDEyMiwzMyw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwKKyAgICAxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsNDEsMiw3OCw3OCw0MSwxLDc4LDQxLDEyLDExNCwxMDksMCwwLAorICAgIDAsMTE0LDEwOCwwLDAsMCwxMTQsMTEwLDAsMCwwLDExNCwxMTEsMCwwLDAsCisgICAgMTE0LDE3MiwwLDAsMCwxMTQsMTcxLDAsMCwwLDExNCwxNzAsMCwwLDAsMjE4LAorICAgIDExLDk5LDEwOCw5NywxMTUsMTE1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNCwxNjksMCwwLAorICAgIDAsMTE0LDE3NSwwLDAsMCwxMTQsMTc4LDAsMCwwLDExNCwxNzksMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDYsMCwwLDAsMTE0LDE2NiwwLDAsMCw3NywyLDAsMCwxMTUsMjAsMCwKKyAgICAwLDAsOCwyLDQsMyw0LDMsNCwyLDQsMiwxMiw3LDEyLDE1LAorICAgIDIsMSwxMiwxNSwyLDEsMTE0LDE2NiwwLDAsMCw5OSwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLAorICAgIDExNSw0OCwwLDAsMCwxMDEsMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsCisgICAgMywxMDAsMiwxMDAsMywxMzIsMCw5MCw0LDEwMCw0LDEwMCw1LDEzMiwwLDkwLAorICAgIDUsMTAwLDYsMTAwLDcsMTMyLDAsOTAsNiwxMDAsOCwxMDAsOSwxMzIsMCw5MCwKKyAgICA3LDEwMCwxMCw4MywwLDQxLDExLDIxOCwxMyw5NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgNjYsOTcsMTE1LDEwNSw5OSwxMTUsMTIyLDgzLDY2LDk3LDExNSwxMDEsMzIsOTksMTA4LDk3LAorICAgIDExNSwxMTUsMzIsMTExLDEwMiwzMiw5OSwxMTEsMTA5LDEwOSwxMTEsMTEwLDMyLDk5LDExMSwxMDAsCisgICAgMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDk4LDEyMSwzMiw5OCwxMTEsMTE2LDEwNCwKKyAgICAzMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk3LDExMCwKKyAgICAxMDAsMTAsMzIsMzIsMzIsMzIsODMsMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LDExNSwKKyAgICA3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTksMiwwLDAsMCwKKyAgICAwLDAsMCwwLDUsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsNjQsMCwwLDAsMTE2LDAsMTI0LDAsMTA2LDEsMTI0LDEsMTMxLDEsMTMxLAorICAgIDEsMTAwLDEsMjUsMCwxMjUsMiwxMjQsMiwxMDYsMiwxMDAsMiwxMDAsMSwxMzEsCisgICAgMiwxMDAsMywyNSwwLDEyNSwzLDEyNCwxLDEwNiwzLDEwMCwyLDEzMSwxLDEwMCwKKyAgICA0LDI1LDAsMTI1LDQsMTI0LDMsMTAwLDUsMTA3LDIsMTExLDYyLDEyNCw0LDEwMCwKKyAgICA1LDEwNywzLDgzLDAsNDEsNiwxMjIsMTQxLDY3LDExMSwxMTAsOTksMTE0LDEwMSwxMTYsCisgICAgMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwKKyAgICAzMiwxMTEsMTAyLDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwxMTYsNzYsMTExLDk3LDEwMCwxMDEsCisgICAgMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDk4LDEyMSwzMiwKKyAgICA5OSwxMDQsMTAxLDk5LDEwNywxMDUsMTEwLDEwMywzMiwxMDUsMTAyLDEwLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNCwxMDEsMTE2LAorICAgIDExNywxMTQsMTEwLDEwMSwxMDAsMzIsOTgsMTIxLDMyLDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LAorICAgIDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMDQsOTcsMTE1LDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwKKyAgICAxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDM5LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSwKKyAgICA5NSw0NiwxMTIsMTIxLDM5LDQ2LDExNCwzMSwwLDAsMCwxMTQsNjEsMCwwLDAsCisgICAgMTE0LDYyLDAsMCwwLDExNCw1OSwwLDAsMCwyMTgsOCw5NSw5NSwxMDUsMTEwLAorICAgIDEwNSwxMTYsOTUsOTUsNDEsNCwxMTQsNDAsMCwwLDAsMTE0LDE1NSwwLDAsMCwKKyAgICAxMTQsMzYsMCwwLDAsMTE0LDM0LDAsMCwwLDQxLDUsMTE0LDEwNCwwLDAsCisgICAgMCwxMTQsMTIzLDAsMCwwLDExNCw5OCwwLDAsMCw5MCwxMywxMDIsMTA1LDEwOCwKKyAgICAxMDEsMTEwLDk3LDEwOSwxMDEsOTUsOTgsOTcsMTE1LDEwMSw5MCw5LDExNiw5NywxMDUsMTA4LAorICAgIDk1LDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA2LDAsMCwwLDExNCwxNTcsMCwwLDAsMTQ2LDIsMCwwLDExNSw4LDAsCisgICAgMCwwLDAsMywxOCwxLDE2LDEsMTQsMSwxMjIsMjQsOTUsNzYsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LAorICAgIDEwNyw5NywxMDMsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsCisgICAgODMsMCw0MSwyLDEyMiw0Miw4NSwxMTUsMTAxLDMyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsCisgICAgMTE2LDMyLDExNSwxMDEsMTA5LDk3LDExMCwxMTYsMTA1LDk5LDExNSwzMiwxMDIsMTExLDExNCwzMiwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDUsMTExLDExMCw0NiwKKyAgICA3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDQsMCwwLDAsMTE0LDE2MiwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsCisgICAgMCwyMTgsMTMsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDE1NCwyLDAsMCwxMTUsMCwwLDAsMCwxMjIsMjcsOTUsNzYsMTExLDk3LDEwMCwKKyAgICAxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMywKKyAgICAwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw1NiwwLDAsMCwKKyAgICAxMjQsMCwxMDYsMCwxMjQsMSwxMDYsMSwxMzEsMSwxMjUsMiwxMjQsMiwxMDAsMSwKKyAgICAxMDcsOCwxMTQsMzYsMTE2LDIsMTAwLDIsMTA2LDMsMTI0LDEsMTA2LDEsMTMxLDEsCisgICAgMTMxLDEsMTMwLDEsMTE2LDQsMTA2LDUsMTE2LDYsMTI0LDIsMTI0LDEsMTA2LDcsCisgICAgMTMxLDMsMSwwLDEwMCwxLDgzLDAsNDEsMywxMjIsMTksNjksMTIwLDEwMSw5OSwKKyAgICAxMTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0Niw3OCwKKyAgICAxMjIsNTIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDEwOCwxMTEsOTcsMTAwLDMyLDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMDMsCisgICAgMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw0MCw0MSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwKKyAgICAxMTUsMzIsNzgsMTExLDExMCwxMDEsNDEsOCwyMTgsOCwxMDMsMTAxLDExNiw5NSw5OSwxMTEsCisgICAgMTAwLDEwMSwxMTQsMTA5LDAsMCwwLDExNCwxMDMsMCwwLDAsMTE0LDUwLDAsMCwKKyAgICAwLDExNCwxMTgsMCwwLDAsMjE4LDI1LDk1LDk5LDk3LDEwOCwxMDgsOTUsMTE5LDEwNSwKKyAgICAxMTYsMTA0LDk1LDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsOTUsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsCisgICAgMTAwLDIxOCw0LDEwMSwxMjAsMTAxLDk5LDExNCwxMTUsMCwwLDAsNDEsMywxMTQsMTA0LAorICAgIDAsMCwwLDIxOCw2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxNDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LAorICAgIDExLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE1NywyLDAsMCwKKyAgICAxMTUsMTAsMCwwLDAsMCwyLDEyLDEsOCwxLDYsMSwxMCwxLDEyMiwKKyAgICAyNSw5NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsNDYsMTAxLAorICAgIDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLAorICAgIDAsMCwwLDIsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsCisgICAgMTIsMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDAsMTI0LDEsMTMxLDIsODMsMCwKKyAgICA0MSwxLDEyMiwyNiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKKyAgICAxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsNDEsMiwKKyAgICAxMTQsMTE4LDAsMCwwLDIxOCwxNyw5NSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw5NSwxMTUsMTA0LDEwNSwxMDksNDEsMiwxMTQsMTA0LDAsMCwwLDExNCwKKyAgICAxMjMsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCisgICAgMCwwLDAsMjE4LDExLDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDE2NSwyLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLDI1LDk1LDc2LDExMSwKKyAgICA5NywxMDAsMTAxLDExNCw2Niw5NywxMTUsMTA1LDk5LDExNSw0NiwxMDgsMTExLDk3LDEwMCw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw3OCw0MSw4LDExNCwxMDksMCwwLDAsMTE0LDEwOCwKKyAgICAwLDAsMCwxMTQsMTEwLDAsMCwwLDExNCwxMTEsMCwwLDAsMTE0LDE1NywwLAorICAgIDAsMCwxMTQsMTgzLDAsMCwwLDExNCwxODgsMCwwLDAsMTE0LDE5MCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNiwwLDAsMCwxMTQsMTgxLDAsMCwwLDE0MSwyLDAsMCwxMTUsMTAsCisgICAgMCwwLDAsOCwzLDQsMiw4LDgsOCwzLDgsOCwxMTQsMTgxLDAsCisgICAgMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsCisgICAgMCwwLDAsNjQsMCwwLDAsMTE1LDc0LDAsMCwwLDEwMSwwLDkwLDEsCisgICAgMTAwLDAsOTAsMiwxMDAsMSwxMDAsMiwxMzIsMCw5MCwzLDEwMCwzLDEwMCw0LAorICAgIDEzMiwwLDkwLDQsMTAwLDUsMTAwLDYsMTMyLDAsOTAsNSwxMDAsNywxMDAsOCwKKyAgICAxMzIsMCw5MCw2LDEwMCw5LDEwMCwxMCwxMzIsMCw5MCw3LDEwMCwxOCwxMDAsMTIsCisgICAgMTU2LDEsMTAwLDEzLDEwMCwxNCwxMzIsMiw5MCw4LDEwMCwxNSwxMDAsMTYsMTMyLDAsCisgICAgOTAsOSwxMDAsMTcsODMsMCw0MSwxOSwyMTgsMTIsODMsMTExLDExNywxMTQsOTksMTAxLAorICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCw5OSwyLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw4LDAsMCwwLAorICAgIDExNiwwLDEzMCwxLDEwMCwxLDgzLDAsNDEsMiwxMjIsMTc4LDc5LDExMiwxMTYsMTA1LAorICAgIDExMSwxMTAsOTcsMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExNiwxMDQsOTcsMTE2LAorICAgIDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwKKyAgICAxMDUsMTAyLDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDEwNSwxMDksMTAxLDMyLDQwLAorICAgIDk3LDExMCwzMiwxMDUsMTEwLDExNiw0MSwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwxMCwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsCisgICAgMTAwLDMyLDExMiw5NywxMTYsMTA0LDQ0LDMyLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTEyLDk3LAorICAgIDExNiwxMDQsMzIsMTA1LDExNSwzMiw5NywzMiwxMTUsMTE2LDExNCw0NiwxMCwxMCwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiw4Miw5NywxMDUsMTE1LDEwMSwxMTUsMzIsNzMsNzksNjksCisgICAgMTE0LDExNCwxMTEsMTE0LDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsCisgICAgMTE2LDEwNCwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsOTgsMTAxLDMyLDEwNCw5NywxMTAsCisgICAgMTAwLDEwOCwxMDEsMTAwLDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLAorICAgIDEsMjE4LDcsNzMsNzksNjksMTE0LDExNCwxMTEsMTE0LDQxLDIsMTE0LDEwNCwwLDAsCisgICAgMCwxMTQsMzcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDYsMCwwLDAsMjE4LDEwLDExMiw5NywxMTYsMTA0LDk1LDEwOSwxMTYsMTA1LDEwOSwKKyAgICAxMDEsMTcyLDIsMCwwLDExNSwyLDAsMCwwLDAsNiwxMjIsMjMsODMsMTExLAorICAgIDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICAxMDksMTE2LDEwNSwxMDksMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE0LDAsMCwwLDEwMCwKKyAgICAxLDEyNCwwLDEwNiwwLDEyNCwxLDEzMSwxLDEwNSwxLDgzLDAsNDEsMiw5NywKKyAgICAxNzAsMSwwLDAsNzksMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsMzIsMTA5LDEwMSwxMTYsCisgICAgMTA0LDExMSwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTA1LDExMCwxMDMsMzIsOTcsMzIsCisgICAgMTA5LDEwMSwxMTYsOTcsMTAwLDk3LDExNiw5NywzMiwxMDAsMTA1LDk5LDExNiwzMiwxMDIsMTExLAorICAgIDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLAorICAgIDExMiw5NywxMTYsMTA0LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNiwxMTEsMzIsCisgICAgOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDQwLDExNSwxMTYsMTE0LAorICAgIDQxLDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDgwLDExMSwxMTUsMTE1LDEwNSwKKyAgICA5OCwxMDgsMTAxLDMyLDEwNywxMDEsMTIxLDExNSw1OCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiw0NSwzMiwzOSwxMDksMTE2LDEwNSwxMDksMTAxLDM5LDMyLDQwLDEwOSw5NywxMTAsCisgICAgMTAwLDk3LDExNiwxMTEsMTE0LDEyMSw0MSwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMCwKKyAgICAxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDMyLDExNiwxMDUsMTA5LDEwMSwxMTUsMTE2LDk3LDEwOSwxMTIsCisgICAgMzIsMTExLDEwMiwzMiwxMDgsOTcsMTE1LDExNiwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDEwLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDk5LDExMSwxMDAsMTAxLDMyLDEwOSwKKyAgICAxMTEsMTAwLDEwNSwxMDIsMTA1LDk5LDk3LDExNiwxMDUsMTExLDExMCw1OSwxMCwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiw0NSwzMiwzOSwxMTUsMTA1LDEyMiwxMDEsMzksMzIsNDAsMTExLAorICAgIDExMiwxMTYsMTA1LDExMSwxMTAsOTcsMTA4LDQxLDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTE1LDEwNSwxMjIsMTAxLDMyLDEwNSwxMTAsMzIsOTgsMTIxLDExNiwxMDEsMTE1LDMyLDExMSwxMDIsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDksMTEyLDEwOCwxMDEsCisgICAgMTA5LDEwMSwxMTAsMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwKKyAgICAxMDQsMTExLDEwMCwzMiw5NywxMDgsMTA4LDExMSwxMTksMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwKKyAgICAxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTE2LDExMSwzMiwxMTQsMTAxLDk3LDEwMCwzMiw5OCwxMjEsCisgICAgMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMTE1LDQ2LDEwLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDgyLDk3LDEwNSwxMTUsMTAxLDExNSwzMiw3Myw3OSw2OSwKKyAgICAxMTQsMTE0LDExMSwxMTQsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywKKyAgICAxMTYsMTA0LDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiw5OCwxMDEsMzIsMTA0LDk3LDExMCwKKyAgICAxMDAsMTA4LDEwMSwxMDAsNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDEzMCwKKyAgICAwLDAsMCw0MSwxLDExNCwxOTMsMCwwLDAsNDEsMiwxMTQsMTA0LDAsMCwKKyAgICAwLDExNCwzNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNiwwLDAsMCwyMTgsMTAsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsCisgICAgMTE1LDE4MCwyLDAsMCwxMTUsMiwwLDAsMCwwLDExLDEyMiwyMyw4MywxMTEsCisgICAgMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExMiw5NywxMTYsMTA0LDk1LAorICAgIDExNSwxMTYsOTcsMTE2LDExNSw5OSw0LDAsMCwwLDAsMCwwLDAsNCwwLAorICAgIDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxMiwwLDAsMCwxMjQsCisgICAgMCwxMDYsMCwxMjQsMiwxMjQsMywxMzEsMiw4MywwLDQxLDEsMTIyLDIyOCw3OSwKKyAgICAxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTksCisgICAgMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwxMTUsMzIsMTAwLDk3LDExNiw5NywKKyAgICAzMiw0MCw5OCwxMjEsMTE2LDEwMSwxMTUsNDEsMzIsMTE2LDExMSwzMiw5NywzMiwxMDIsMTA1LAorICAgIDEwOCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsNDAsOTcsMzIsMTE1LDExNiwxMTQsNDEsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwKKyAgICAxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LAorICAgIDExMSwxMDAsMzIsOTcsMTA4LDEwOCwxMTEsMTE5LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDEwMiwzMiw5OCwxMjEsMTE2LAorICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKKyAgICAzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLAorICAgIDEwNSwxMTAsMzIsMTExLDExNCwxMDAsMTAxLDExNCwzMiwxMTYsMTExLDMyLDk5LDExMSwxMTQsMTE0LAorICAgIDEwMSw5OSwxMTYsMTA4LDEyMSwzMiwxMTYsMTE0LDk3LDExMCwxMTUsMTAyLDEwMSwxMTQsMzIsMTEyLAorICAgIDEwMSwxMTQsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTEsMTEwLDExNSwxMCwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiw0MSwxLDIxOCw4LDExNSwxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNDEsCisgICAgNCwxMTQsMTA0LDAsMCwwLDExNCw5NCwwLDAsMCw5MCwxMCw5OSw5Nyw5OSwKKyAgICAxMDQsMTAxLDk1LDExMiw5NywxMTYsMTA0LDExNCw1NiwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTUsOTUsOTksOTcsCisgICAgOTksMTA0LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwxOTMsMiwwLDAsCisgICAgMTE1LDIsMCwwLDAsMCw4LDEyMiwyOCw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk5LDk3LDk5LDEwNCwxMDEsOTUsOTgsMTIxLDExNiwKKyAgICAxMDEsOTksMTExLDEwMCwxMDEsOTksMywwLDAsMCwwLDAsMCwwLDMsMCwKKyAgICAwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsCisgICAgMSw4MywwLDQxLDIsMTIyLDE1MCw3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwzMiwKKyAgICAxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDExNCwxMDUsCisgICAgMTE2LDEwMSwxMTUsMzIsMTAwLDk3LDExNiw5NywzMiw0MCw5OCwxMjEsMTE2LDEwMSwxMTUsNDEsCisgICAgMzIsMTE2LDExMSwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsCisgICAgNDAsOTcsMzIsMTE1LDExNiwxMTQsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywzMiwxMTYsCisgICAgMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsOTcsMTA4LDEwOCwxMTEsMTE5LAorICAgIDExNSwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwKKyAgICAxMDMsMzIsMTExLDEwMiwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LAorICAgIDEwOCwxMDEsMTE1LDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDExNCw0LAorICAgIDAsMCwwLDQxLDMsMTE0LDEwNCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LAorICAgIDU2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAorICAgIDAsMCwwLDExNCwxOTUsMCwwLDAsMjAzLDIsMCwwLDExNSwwLDAsMCwKKyAgICAwLDEyMiwyMSw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LAorICAgIDExNSwxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsOTksMiwwLDAsMCwwLDAsMCwKKyAgICAwLDUsMCwwLDAsMTYsMCwwLDAsNjcsMCwwLDAsMTE1LDgyLDAsCisgICAgMCwwLDEyNCwwLDEwNiwwLDEyNCwxLDEzMSwxLDEyNSwyLDEyMSwxNCwxMjQsMCwKKyAgICAxMDYsMSwxMjQsMiwxMzEsMSwxMjUsMyw4NywwLDExMCw0OCw0LDAsMTE2LDIsCisgICAgMTA3LDEwLDExNCw3MiwxLDAsMTI1LDQsMSwwLDEyMiwyMCwxMTYsMywxMDAsMSwKKyAgICAxMjQsMSwxMDAsMiwxNDEsMiwxMjQsNCwxMzAsMiw4NywwLDg5LDAsMTAwLDMsCisgICAgMTAwLDMsMTI1LDQsMTI2LDQsODgsMCwxMTAsMiw4OCwwLDExNiw0LDEyNCwzLAorICAgIDEzMSwxLDgzLDAsNDEsNCwxMjIsNTIsNjcsMTExLDExMCw5OSwxMTQsMTAxLDExNiwxMDEsCisgICAgMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLAorICAgIDExMSwxMDIsMzIsNzMsMTEwLDExNSwxMTIsMTAxLDk5LDExNiw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw0NiwxMjIsMzksMTE1LDExMSwKKyAgICAxMTcsMTE0LDk5LDEwMSwzMiwxMTAsMTExLDExNiwzMiw5NywxMTgsOTcsMTA1LDEwOCw5Nyw5OCwKKyAgICAxMDgsMTAxLDMyLDExNiwxMDQsMTE0LDExMSwxMTcsMTAzLDEwNCwzMiwxMDMsMTAxLDExNiw5NSwxMDAsCisgICAgOTcsMTE2LDk3LDQwLDQxLDQxLDEsMTE0LDEwMiwwLDAsMCw3OCw0MSw1LDExNCwKKyAgICAxNTUsMCwwLDAsMjE4LDgsMTAzLDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5NywxMTQsNDIsCisgICAgMCwwLDAsMTE0LDEwMywwLDAsMCwxMTQsMTUzLDAsMCwwLDQxLDUsMTE0LAorICAgIDEwNCwwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsMTUxLAorICAgIDAsMCwwLDIxOCwzLDEwMSwxMjAsOTksMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDYsMCwwLDAsMjE4LDEwLDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LAorICAgIDExNCw5OSwxMDEsMjEwLDIsMCwwLDExNSwxNCwwLDAsMCwwLDIsMTAsMSwKKyAgICAyLDEsMTQsMSwxNiwxLDQsMSwyOCwxLDEyMiwyMyw4MywxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LAorICAgIDExNCw5OSwxMDEsMTE0LDMxLDAsMCwwLDQxLDEsMjE4LDksOTUsMTExLDExMiwxMTYsCisgICAgMTA1LDEwOSwxMDUsMTIyLDEwMSw5OSwzLDAsMCwwLDEsMCwwLDAsNCwwLAorICAgIDAsMCw4LDAsMCwwLDY3LDAsMCwwLDExNSwyMiwwLDAsMCwxMTYsCisgICAgMCwxMDYsMSwxMTYsMiwxMjQsMSwxMjQsMiwxMDAsMSwxMDAsMiwxMjQsMywxMDAsCisgICAgMywxNDEsNiw4MywwLDQxLDQsMTIyLDEzMCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwKKyAgICA5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNSwxMTEsCisgICAgMTE3LDExNCw5OSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsCisgICAgMTA0LDEwMSwzMiwzOSwxMDAsOTcsMTE2LDk3LDM5LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsCisgICAgMTEwLDExNiwzMiw5OSw5NywxMTAsMzIsOTgsMTAxLDMyLDk3LDExMCwxMjEsMzIsMTExLDk4LAorICAgIDEwNiwxMDEsOTksMTE2LDMyLDExNiwxMjEsMTEyLDEwMSwzMiwxMTYsMTA0LDk3LDExNiwzMiw5OSwKKyAgICAxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSw0MCw0MSwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsCisgICAgMTE1LDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNCwxODYsMCwwLDAsCisgICAgODQsNDEsMiwyMTgsMTIsMTAwLDExMSwxMTAsMTE2LDk1LDEwNSwxMTAsMTA0LDEwMSwxMTQsMTA1LAorICAgIDExNiwxMTQsNzIsMCwwLDAsNDEsMywxMTQsMTE4LDAsMCwwLDExNCwxODUsMCwKKyAgICAwLDAsMjE4LDcsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsNDEsNCwxMTQsMTA0LDAsCisgICAgMCwwLDExNCw1NiwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDIwMCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKKyAgICAyMTgsMTQsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTYsMTExLDk1LDk5LDExMSwxMDAsMTAxLAorICAgIDIyMCwyLDAsMCwxMTUsNCwwLDAsMCwwLDUsMTIsMSwxMjIsMjcsODMsCisgICAgMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMTUsMTExLDExNywxMTQsCisgICAgOTksMTAxLDk1LDExNiwxMTEsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsMCwwLAorICAgIDAsMCwwLDEwLDAsMCwwLDQzLDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICA5NCwxLDAsMCwxMjQsMCwxMDYsMCwxMjQsMSwxMzEsMSwxMjUsMiwxMDAsMSwKKyAgICAxMjUsMywxMjEsMTIsMTE2LDEsMTI0LDIsMTMxLDEsMTI1LDQsODcsMCwxMTAsMjQsCisgICAgNCwwLDExNiwyLDEwNywxMCwxMTQsNTAsMSwwLDEsMCwxLDAsMTAwLDEsCisgICAgMTI1LDQsODksMCwxMTAsMTYyLDg4LDAsMTIxLDE0LDEyNCwwLDEwNiwzLDEyNCwyLAorICAgIDEzMSwxLDEyNSw1LDg3LDAsMTEwLDIwLDQsMCwxMTYsNCwxMDcsMTAsMTE0LDg2LAorICAgIDEsMCwxLDAsMSwwLDg5LDAsMTEwLDEyNiw4OCwwLDExNiw1LDEyNCw1LAorICAgIDEwMCwyLDI1LDAsMTMxLDEsMTI1LDMsMTIxLDE0LDEyNCwwLDEwNiw2LDEyNCw0LAorICAgIDEzMSwxLDEyNSw2LDg3LDAsMTEwLDIwLDQsMCwxMTYsNywxMDcsMTAsMTE0LDEzNCwKKyAgICAxLDAsMSwwLDEsMCw4OSwwLDExMCw3OCw4OCwwLDEyMSwyMCwxMTYsOCwKKyAgICAxMjQsNiwxMjQsNSwxMjQsMSwxMjQsNCwxMDAsMywxNDEsNCwxMjUsNyw4NywwLAorICAgIDExMCwyNCw0LDAsMTE2LDksMTE2LDEwLDEwMiwyLDEwNywxMCwxMTQsMTgwLDEsMCwKKyAgICAxLDAsMSwwLDg5LDAsMTEwLDMyLDg4LDAsMTE2LDExLDEwNiwxMiwxMDAsNCwKKyAgICAxMjQsNCwxMjQsMiwxMzEsMywxLDAsMTE2LDEzLDEyNCw3LDEyNCwxLDEyNCw0LAorICAgIDEyNCwyLDEwMCw1LDE0MSw0LDgzLDAsMTI0LDAsMTA2LDYsMTI0LDIsMTMxLDEsCisgICAgMTI1LDgsMTI0LDAsMTA2LDE0LDEyNCw4LDEyNCwyLDEzMSwyLDEyNSw5LDExNiwxMSwKKyAgICAxMDYsMTIsMTAwLDYsMTI0LDIsMTMxLDIsMSwwLDExNiwxNSwxMDYsMTYsMTIsMCwKKyAgICAxNDQsMSwxMTQsOTAsMTI0LDQsMTAwLDEsMTA3LDksMTQ0LDEsMTE0LDkwLDEyNCwzLAorICAgIDEwMCwxLDEwNyw5LDE0NCwxLDExNCw5MCwxMTYsMTcsMTI0LDksMTI0LDMsMTE2LDE4LAorICAgIDEyNCw4LDEzMSwxLDEzMSwzLDEyNSw2LDEyMSwzMCwxMjQsMCwxMDYsMTksMTI0LDIsCisgICAgMTI0LDQsMTI0LDYsMTMxLDMsMSwwLDExNiwxMSwxMDYsMTIsMTAwLDcsMTI0LDQsCisgICAgMTMxLDIsMSwwLDg3LDAsMTEwLDIyLDQsMCwxMTYsMiwxMDcsMTAsMTQ0LDEsCisgICAgMTE0LDg4LDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMjQsOSwKKyAgICA4MywwLDQxLDgsMTIyLDE5MCw2NywxMTEsMTEwLDk5LDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsCisgICAgMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwKKyAgICAzMiw3MywxMTAsMTE1LDExMiwxMDEsOTksMTE2LDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsCisgICAgMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiw4MiwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLDExNiwKKyAgICAxMDEsOTksMTExLDEwMCwxMDEsMzIsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LDExNiwxMTUsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsCisgICAgMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw0NiwzMiw4NCwxMTEsMzIsCisgICAgMTE5LDExNCwxMDUsMTE2LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw5OCwxMjEsCisgICAgMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw0NCwzMiwxMTUsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LAorICAgIDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5NywxMDgsMTE1LDExMSwzMiw5OCwxMDEsMzIsMTA1LDEwOSwKKyAgICAxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiw3OCwxMTQsMTMwLDAsMCwwLDQxLDMsMTE0LDEzNiwwLDAsCisgICAgMCwxMTQsMTAyLDAsMCwwLDExNCwzNywwLDAsMCwxMjIsMTMsMTIzLDEyNSwzMiwKKyAgICAxMDksOTcsMTE2LDk5LDEwNCwxMDEsMTE1LDMyLDEyMywxMjUsNDEsMywxMTQsMTAyLDAsMCwKKyAgICAwLDExNCw5MywwLDAsMCwxMTQsOTQsMCwwLDAsMTIyLDE5LDk5LDExMSwxMDAsCisgICAgMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDEyNSwKKyAgICAxMjIsMTAsMTE5LDExNCwxMTEsMTE2LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw0MSwyMCwxMTQsMTU1LAorICAgIDAsMCwwLDExNCw4MywwLDAsMCwxMTQsNzAsMCwwLDAsMTE0LDE5NCwwLAorICAgIDAsMCwxMTQsMTkyLDAsMCwwLDExNCwxNiwwLDAsMCwxMTQsMTk3LDAsMCwKKyAgICAwLDExNCw0MiwwLDAsMCwxMTQsMTM5LDAsMCwwLDExNCwxMDMsMCwwLDAsCisgICAgMTE0LDEzNCwwLDAsMCwxMTQsMTE4LDAsMCwwLDExNCwxMzMsMCwwLDAsMTE0LAorICAgIDE0NSwwLDAsMCwxMTQsMjAzLDAsMCwwLDExNCw4LDAsMCwwLDIxOCwxOSwKKyAgICAxMDAsMTExLDExMCwxMTYsOTUsMTE5LDExNCwxMDUsMTE2LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwKKyAgICAxMTEsMTAwLDEwMSwxMTQsMTQ4LDAsMCwwLDExNCwzMywwLDAsMCwxMTQsMTk2LDAsCisgICAgMCwwLDQxLDEwLDExNCwxMDQsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsOTQsCisgICAgMCwwLDAsMTE0LDEzNywwLDAsMCwxMTQsOTMsMCwwLDAsMjE4LDIsMTE1LAorICAgIDExNiwxMTQsNTYsMCwwLDAsMjE4LDEwLDk4LDEyMSwxMTYsMTAxLDExNSw5NSwxMDAsOTcsCisgICAgMTE2LDk3LDExNCwxNTEsMCwwLDAsOTAsMTEsOTksMTExLDEwMCwxMDEsOTUsMTExLDk4LAorICAgIDEwNiwxMDEsOTksMTE2LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAorICAgIDAsMCwwLDExNCwxODQsMCwwLDAsMjI4LDIsMCwwLDExNSw3OCwwLDAsCisgICAgMCwwLDcsMTAsMSw0LDEsMiwxLDEyLDEsMTQsMSwxMCwyLDIsCisgICAgMSwxNCwxLDE0LDEsNiwyLDEyLDEsMiwxLDE0LDEsMTQsMSw2LAorICAgIDIsMiwxLDQsMSw0LDEsMTIsMSwxOCwxLDYsMiw4LDEsNiwKKyAgICAxLDYsMSwyLDEsOCwxLDEwLDEsMTIsMSwxMiwxLDIwLDEsMTAsCisgICAgMSw2LDEsMTAsMSwyLDEsMTQsMSwxNiwxLDE2LDEsNiwxLDEyMiwKKyAgICAyMSw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsCisgICAgMTE2LDk1LDk5LDExMSwxMDAsMTAxLDc4LDExNCw5MSwwLDAsMCw0MSwxMCwxMTQsMTA5LAorICAgIDAsMCwwLDExNCwxMDgsMCwwLDAsMTE0LDExMCwwLDAsMCwxMTQsMTkzLDAsCisgICAgMCwwLDExNCwxOTQsMCwwLDAsMTE0LDE5NiwwLDAsMCwxMTQsMTk1LDAsMCwKKyAgICAwLDExNCwxOTksMCwwLDAsMTE0LDIwMywwLDAsMCwxMTQsMTg0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA2LDAsMCwwLDExNCwxOTEsMCwwLDAsMTcwLDIsMCwwLDExNSwxNCwwLAorICAgIDAsMCw4LDIsOCw4LDgsMTMsOCwxMCw4LDcsOCwxMCwxNCw4LAorICAgIDExNCwxOTEsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsNCwwLDAsMCwwLDAsMCwwLDExNSw3NiwwLDAsMCwxMDEsCisgICAgMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDAsMiwxMDAsMywxMzIsCisgICAgMCw5MCw0LDEwMCw0LDEwMCw1LDEzMiwwLDkwLDUsMTAwLDYsMTAwLDcsMTMyLAorICAgIDAsOTAsNiwxMDEsNywxMzUsMCwxMDIsMSwxMDAsOCwxMDAsOSwxMzIsOCwxMzEsCisgICAgMSw5MCw4LDEwMSw3LDEwMCwxMCwxMDAsMTEsMTMyLDAsMTMxLDEsOTAsOSwxMDAsCisgICAgMTIsMTAwLDEzLDEzMiwwLDkwLDEwLDEzNSwwLDgzLDAsNDEsMTQsMjE4LDEwLDcwLAogICAgIDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwxMjIsMTAzLDY2LDk3LDExNSwxMDEsMzIsCiAgICAgMTAyLDEwNSwxMDgsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsOTksMTA4LDk3LDExNSwKICAgICAxMTUsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsCkBAIC0xMzE2LDY3MCArMTIyMCw2NDAgQEAKICAgICAxMDQsOTcsMTE2LDEwLDMyLDMyLDMyLDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwzMiwKICAgICAxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksMzIsMTE3LDExNSw5NywxMDMsCiAgICAgMTAxLDQ2LDk5LDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDIsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDIyLDAsMCwwLDEyNCwxLDAsMTI0LAotICAgIDAsMCw5NSwwLDAsMTI0LDIsMCwxMjQsMCwwLDk1LDEsMCwxMDAsMSwKLSAgICAwLDgzLDQxLDIsMTIyLDc1LDY3LDk3LDk5LDEwNCwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsOTcsMTEwLDEwMCwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDEwMiwxMDUsMTA4LDEwMSwzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LAotICAgIDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwKLSAgICA0Niw3OCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDMsCi0gICAgMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCwzNywwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTg2LAotICAgIDAsMCwwLDI2LDMsMCwwLDExNSw0LDAsMCwwLDAsMyw5LDEsCi0gICAgMTIyLDE5LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDUsCi0gICAgMTEwLDEwNSwxMTYsOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwKLSAgICAwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMzQsMCwwLDAsMTI0LAotICAgIDAsMCwxMDYsMCwwLDEyNCwxLDAsMTA2LDAsMCwxMDcsMiwwLDExMSwzMywKLSAgICAwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMSwwLDEwNiwxLDAsMTA3LDIsMCwKLSAgICA4Myw0MSwxLDc4LDQxLDIsMjE4LDksOTUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsCi0gICAgOTUsMTE0LDEyMCwwLDAsMCw0MSwyLDExNCwxMTAsMCwwLDAsMjE4LDUsMTExLAorICAgIDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMjQsMSwxMjQsMCwKKyAgICA5NSwwLDEyNCwyLDEyNCwwLDk1LDEsMTAwLDEsODMsMCw0MSwyLDEyMiw3NSwKKyAgICA2Nyw5Nyw5OSwxMDQsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDMyLDExMCw5NywxMDksMTAxLDMyLDk3LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LAorICAgIDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTAyLAorICAgIDExMSwxMTcsMTEwLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsNzgsNDEsMiwxMTQsMTAyLAorICAgIDAsMCwwLDExNCwzNywwLDAsMCw0MSwzLDExNCwxMDQsMCwwLDAsMTE0LAorICAgIDEyMywwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4MiwwLDAsMCwyOSwzLDAsCisgICAgMCwxMTUsNCwwLDAsMCwwLDMsNiwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDI0LDAsMCwwLDEyNCwwLDEwNiwwLDEyNCwxLDEwNiwKKyAgICAwLDEwNywyLDExMSwyMiwxMjQsMCwxMDYsMSwxMjQsMSwxMDYsMSwxMDcsMiw4MywKKyAgICAwLDQxLDEsNzgsNDEsMiwyMTgsOSw5NSw5NSw5OSwxMDgsOTcsMTE1LDExNSw5NSwKKyAgICA5NSwxMTQsMTE1LDAsMCwwLDQxLDIsMTE0LDEwNCwwLDAsMCwyMTgsNSwxMTEsCiAgICAgMTE2LDEwNCwxMDEsMTE0LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAotICAgIDAsMCwwLDIxOCw2LDk1LDk1LDEwMSwxMTMsOTUsOTUsMzIsMywwLDAsMTE1LAotICAgIDQsMCwwLDAsMCwxLDE4LDEsMTIyLDE3LDcwLDEwNSwxMDgsMTAxLDc2LDExMSwKKyAgICAwLDAsMCwyMTgsNiw5NSw5NSwxMDEsMTEzLDk1LDk1LDM1LDMsMCwwLDExNSwKKyAgICA0LDAsMCwwLDAsMSwxMiwxLDEyMiwxNyw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCiAgICAgOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwwLAogICAgIDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLAotICAgIDExNSwyNiwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwKLSAgICAwLDExNiwwLDAsMTI0LDAsMCwxMDYsMiwwLDEzMSwxLDAsNjUsODMsNDEsCi0gICAgMSw3OCw0MSwzLDIxOCw0LDEwNCw5NywxMTUsMTA0LDExNCwxMDgsMCwwLDAsMTE0LAotICAgIDM3LDAsMCwwLDQxLDEsMTE0LDExMCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsOCw5NSw5NSwxMDQsOTcsCi0gICAgMTE1LDEwNCw5NSw5NSwzNiwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLAotICAgIDE5LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDQsOTcsCi0gICAgMTE1LDEwNCw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCwzLDAsMCwwLDMsMCwwLDAsMTE1LDIyLDAsMCwwLDExNiwwLAotICAgIDAsMTE2LDEsMCwxMjQsMCwwLDEzMSwyLDAsMTA2LDIsMCwxMjQsMSwwLAotICAgIDEzMSwxLDAsODMsNDEsMSwxMjIsMTAwLDc2LDExMSw5NywxMDAsMzIsOTcsMzIsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDk3LDMyLDEwMiwxMDUsMTA4LAotICAgIDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwKLSAgICAzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsCi0gICAgOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSwKLSAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LAotICAgIDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0MSwzLDIxOCw1LAotICAgIDExNSwxMTcsMTEyLDEwMSwxMTQsMTE0LDIxMSwwLDAsMCwxMTQsMTk0LDAsMCwwLDQxLAotICAgIDIsMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsMCwwLDQxLDEsMTE0LDIxMiwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTk0LDAsMCwKLSAgICAwLDM5LDMsMCwwLDExNSwyLDAsMCwwLDAsMTAsMTIyLDIyLDcwLDEwNSwKLSAgICAxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw3LDAsMCwwLDEyNCwwLAotICAgIDAsMTA2LDAsMCw4Myw0MSwxLDEyMiw1OCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTcsMTE1LDMyLDEwMiwKLSAgICAxMTEsMTE3LDExMCwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwKLSAgICAxMDEsMTE0LDQ2LDQxLDEsMTE0LDM3LDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsCi0gICAgMCwxMTQsMTI4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw2LDAsMCwwLDExNCwxNTksMCwwLDAsNTEsMywwLDAsMTE1LDIsCi0gICAgMCwwLDAsMCwzLDEyMiwyMyw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDk5LDIsCi0gICAgMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDksMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDQyLDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsMSwKLSAgICAwLDEwMCwxLDAsMTMxLDIsMCwxNDMsMTcsMCwxMjUsMiwwLDEyNCwyLDAsCi0gICAgMTA2LDIsMCwxMzEsMCwwLDgzLDg3LDEwMCwyLDAsODEsODIsODgsMTAwLDIsCi0gICAgMCw4Myw0MSwzLDEyMiwzOSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDEwMCw5NywxMTYsOTcsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExMiw5NywxMTYsMTA0LDMyLAotICAgIDk3LDExNSwzMiwxMTQsOTcsMTE5LDMyLDk4LDEyMSwxMTYsMTAxLDExNSw0NiwyMTgsMSwxMTQsCi0gICAgNzgsNDEsMywxMTQsNTEsMCwwLDAsMTE0LDUyLDAsMCwwLDkwLDQsMTE0LAotICAgIDEwMSw5NywxMDAsNDEsMywxMTQsMTEwLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsCi0gICAgNTYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCi0gICAgMCwwLDAsMTE0LDIwMSwwLDAsMCw1NiwzLDAsMCwxMTUsNCwwLDAsCi0gICAgMCwwLDIsMjEsMSwxMjIsMTksNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNDEsMTEsMTE0LDExNCwwLDAsCi0gICAgMCwxMTQsMTEzLDAsMCwwLDExNCwxMTUsMCwwLDAsMTE0LDExNiwwLDAsMCwKLSAgICAxMTQsMTg2LDAsMCwwLDExNCwyMTQsMCwwLDAsMTE0LDIxNiwwLDAsMCwxMTQsCi0gICAgMTI1LDAsMCwwLDExNCwxOTQsMCwwLDAsMTE0LDE1OSwwLDAsMCwxMTQsMjAxLAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDQxLDEsMTE0LAotICAgIDIxMiwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjExLDAsMCwwLDIxLDMsCi0gICAgMCwwLDExNSwxNCwwLDAsMCwxMiwzLDYsMiwxMiw2LDEyLDQsMTIsCi0gICAgMywyNCwxMiwxOCw1LDExNCwyMTEsMCwwLDAsOTksMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsNCwwLDAsMCw2NCwwLDAsMCwxMTUsCi0gICAgNjQsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsCi0gICAgMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsCi0gICAgNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwKLSAgICAwLDEwMCw3LDAsMTAwLDgsMCwxMDAsOSwwLDEzMiwwLDEsOTAsNiwwLAotICAgIDEwMCwxMCwwLDgzLDQxLDExLDIxOCwxNiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzAsMTA1LAotICAgIDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw2Miw2NywxMTEsMTEwLDk5LDExNCwxMDEsCi0gICAgMTE2LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwKLSAgICAxMTAsMzIsMTExLDEwMiwzMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDMyLDExNywxMTUsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLAotICAgIDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDQ2LDk5LDIsMCwwLDAsMCwwLDAsCi0gICAgMCwzLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsCi0gICAgMCwwLDExNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTAwLDEsCi0gICAgMCwxMjQsMiwwLDEwNiwxLDAsMTAwLDIsMCwxMjQsMiwwLDEwNiwyLDAsCi0gICAgMTA1LDIsMCw4Myw0MSwzLDEyMiwzMyw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDEwOSwxMDEsMTE2LDk3LDEwMCw5NywxMTYsOTcsMzIsMTAyLDExMSwxMTQsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsNDYsMTE0LDEzNSwwLDAsMCwxMTQsMTM2LAotICAgIDAsMCwwLDQxLDMsMTE0LDQxLDAsMCwwLDIxOCw4LDExNSwxMTYsOTUsMTA5LAorICAgIDExNSwyMCwwLDAsMCwxMTYsMCwxMjQsMCwxMDYsMSwxMzEsMSwxMTYsMCwxMjQsCisgICAgMCwxMDYsMiwxMzEsMSw2NSwwLDgzLDAsNDEsMSw3OCw0MSwzLDIxOCw0LAorICAgIDEwNCw5NywxMTUsMTA0LDExNCwxMDIsMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDEsCisgICAgMTE0LDEwNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNiwwLDAsMCwyMTgsOCw5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSwzOSwzLAorICAgIDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDE5LDcwLDEwNSwxMDgsMTAxLDc2LAorICAgIDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSw5OSwyLAorICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDMsCisgICAgMCwwLDAsMTE1LDE2LDAsMCwwLDExNiwwLDExNiwxLDEyNCwwLDEzMSwyLAorICAgIDEwNiwyLDEyNCwxLDEzMSwxLDgzLDAsNDEsMSwxMjIsMTAwLDc2LDExMSw5NywxMDAsCisgICAgMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDk3LAorICAgIDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICA4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwKKyAgICAxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwKKyAgICAxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLAorICAgIDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICA0MSwzLDIxOCw1LDExNSwxMTcsMTEyLDEwMSwxMTQsMTE0LDIwNywwLDAsMCwxMTQsMTkwLAorICAgIDAsMCwwLDQxLDIsMTE0LDEwNCwwLDAsMCwxMTQsMTIzLDAsMCwwLDQxLAorICAgIDEsMTE0LDIwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKKyAgICAxMTQsMTkwLDAsMCwwLDQyLDMsMCwwLDExNSwyLDAsMCwwLDAsMTAsCisgICAgMTIyLDIyLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDgsMTExLDk3LAorICAgIDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw2LDAsCisgICAgMCwwLDEyNCwwLDEwNiwwLDgzLDAsNDEsMSwxMjIsNTgsODIsMTAxLDExNiwxMTcsCisgICAgMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk3LAorICAgIDExNSwzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsCisgICAgMTA1LDExMCwxMDAsMTAxLDExNCw0Niw0MSwxLDExNCwzNywwLDAsMCw0MSwyLDExNCwKKyAgICAxMDQsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTU1LDAsMCwwLDU0LDMsMCwKKyAgICAwLDExNSwyLDAsMCwwLDAsMywxMjIsMjMsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LAorICAgIDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCw5LDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwzMiwwLDAsMCwxMTYsMCwxMDYsMSwxMjQsCisgICAgMSwxMDAsMSwxMzEsMiwxNDMsMTAsMTI1LDIsMTI0LDIsMTA2LDIsMTMxLDAsODMsCisgICAgMCw4MSwwLDgyLDAsODgsMCwxMDAsMiw4MywwLDQxLDMsMTIyLDM5LDgyLAorICAgIDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDk3LDExNiw5NywzMiwxMDIsCisgICAgMTE0LDExMSwxMDksMzIsMTEyLDk3LDExNiwxMDQsMzIsOTcsMTE1LDMyLDExNCw5NywxMTksMzIsCisgICAgOTgsMTIxLDExNiwxMDEsMTE1LDQ2LDIxOCwxLDExNCw3OCw0MSwzLDExNCw1MiwwLDAsCisgICAgMCwxMTQsNTMsMCwwLDAsOTAsNCwxMTQsMTAxLDk3LDEwMCw0MSwzLDExNCwxMDQsCisgICAgMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw1NywwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTk3LDAsMCwKKyAgICAwLDU5LDMsMCwwLDExNSw0LDAsMCwwLDAsMiwxNCwxLDEyMiwxOSwKKyAgICA3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTAwLAorICAgIDk3LDExNiw5Nyw0MSwxMSwxMTQsMTA5LDAsMCwwLDExNCwxMDgsMCwwLDAsMTE0LAorICAgIDExMCwwLDAsMCwxMTQsMTExLDAsMCwwLDExNCwxODIsMCwwLDAsMTE0LDIxMCwKKyAgICAwLDAsMCwxMTQsMjEyLDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LDE5MCwwLAorICAgIDAsMCwxMTQsMTU1LDAsMCwwLDExNCwxOTcsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsNDEsMSwxMTQsMjA4LDAsMCwwLDExNCw2LDAsCisgICAgMCwwLDExNCwyMDcsMCwwLDAsMjQsMywwLDAsMTE1LDE0LDAsMCwwLAorICAgIDgsMyw0LDIsOCw2LDgsNCw4LDMsMTYsMTIsMTIsNSwxMTQsMjA3LAorICAgIDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDMsMCwwLDAsNjQsMCwwLDAsMTE1LDQ2LDAsMCwwLDEwMSwwLDkwLAorICAgIDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwyLDEwMCwzLDEzMiwwLDkwLAorICAgIDQsMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwxMDAsNiwxMDAsNywxNTYsMSwxMDAsCisgICAgOCwxMDAsOSwxMzIsMiw5MCw2LDEwMCwxMCw4MywwLDQxLDExLDIxOCwxNiw4MywKKyAgICAxMTEsMTE3LDExNCw5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiwKKyAgICA2Miw2NywxMTEsMTEwLDk5LDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwKKyAgICAxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiw4MywxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDExNywxMTUsMTA1LDExMCwxMDMsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDQ2LDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDIyLDAsMCwwLDExNiwwLDEyNCwxLDEzMSwxLDEyNSwKKyAgICAyLDEyNCwyLDEwNiwxLDEyNCwyLDEwNiwyLDEwMCwxLDE1NiwyLDgzLDAsNDEsCisgICAgMiwxMjIsMzMsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTAxLAorICAgIDExNiw5NywxMDAsOTcsMTE2LDk3LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExMiwKKyAgICA5NywxMTYsMTA0LDQ2LDQxLDIsMTIyLDUsMTA5LDExNiwxMDUsMTA5LDEwMSwxMjIsNCwxMTUsCisgICAgMTA1LDEyMiwxMDEsNDEsMywxMTQsNDEsMCwwLDAsMjE4LDgsMTE1LDExNiw5NSwxMDksCiAgICAgMTE2LDEwNSwxMDksMTAxLDkwLDcsMTE1LDExNiw5NSwxMTUsMTA1LDEyMiwxMDEsNDEsMywxMTQsCi0gICAgMTEwLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsMjA5LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxOTgsMCwKLSAgICAwLDAsNjYsMywwLDAsMTE1LDQsMCwwLDAsMCwyLDEyLDEsMTIyLAorICAgIDEwNCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDIwNSwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTk0LDAsCisgICAgMCwwLDY5LDMsMCwwLDExNSw0LDAsMCwwLDAsMiw4LDEsMTIyLAogICAgIDI3LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKICAgICAxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDk5LDQsMCwwLAogICAgIDAsMCwwLDAsMCw1LDAsMCwwLDUsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDM0LDAsMCwwLDExNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwKLSAgICA0LDAsMTI0LDAsMCwxMDYsMSwwLDEyNCwyLDAsMTI0LDMsMCwxMDAsMSwKLSAgICAwLDEyNCw0LDAsMTMxLDIsMSw4Myw0MSwyLDc4LDIxOCw1LDk1LDEwOSwxMTEsCi0gICAgMTAwLDEwMSw0MSwyLDExNCw5OSwwLDAsMCwxMTQsMTk5LDAsMCwwLDQxLDUsCi0gICAgMTE0LDExMCwwLDAsMCwxMTQsOTIsMCwwLDAsMTE0LDkxLDAsMCwwLDExNCwKLSAgICA1NSwwLDAsMCwxMTQsNDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDIwMCwwLDAsMCw3MSwzLDAsCi0gICAgMCwxMTUsNCwwLDAsMCwwLDIsMTIsMSwxMjIsMzIsODMsMTExLDExNywxMTQsCi0gICAgOTksMTAxLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5OSw5NywKLSAgICA5OSwxMDQsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwyMjEsMCwwLAotICAgIDAsMTA1LDE4MiwxLDAsMCw5OSwzLDAsMCwwLDEsMCwwLDAsOSwKLSAgICAwLDAsMCwxNywwLDAsMCw2NywwLDAsMCwxMTUsNTMsMSwwLDAsCi0gICAgMTE2LDAsMCwxMjQsMSwwLDEzMSwxLDAsOTIsMiwwLDEyNSw0LDAsMTI1LAotICAgIDUsMCwxMDMsMCwwLDEyNSw2LDAsMTIwLDU0LDAsMTI0LDQsMCwxMTQsODAsCi0gICAgMCwxMTYsMSwwLDEyNCw0LDAsMTMxLDEsMCwxMiwxMTQsODAsMCwxMTYsMCwKLSAgICAwLDEyNCw0LDAsMTMxLDEsMCw5MiwyLDAsMTI1LDQsMCwxMjUsNywwLAotICAgIDEyNCw2LDAsMTA2LDIsMCwxMjQsNywwLDEzMSwxLDAsMSwxMTMsMjcsMCwKLSAgICA4NywxMjAsMTMyLDAsMTE2LDMsMCwxMjQsNiwwLDEzMSwxLDAsNjgsOTMsMTE4LAotICAgIDAsMTI1LDcsMCwxMTYsNCwwLDEyNCw0LDAsMTI0LDcsMCwxMzEsMiwwLAotICAgIDEyNSw0LDAsMTIxLDE3LDAsMTE2LDUsMCwxMDYsNiwwLDEyNCw0LDAsMTMxLAotICAgIDEsMCwxLDg3LDExMyw5NCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwxMTQsMTU1LAotICAgIDAsMSwxLDEsMTE5LDk0LDAsODksMTEzLDk0LDAsNCwxMTYsOCwwLDEwNywKLSAgICAxMCwwLDExNCwyMTEsMCwxLDEyNSw4LDAsMSwxMjIsMjUsMCwxMTYsOSwwLAotICAgIDEwMCwxLDAsMTI0LDQsMCwxMjQsOCwwLDEzMSwzLDAsMSwxMDAsMiwwLAotICAgIDgzLDg3LDg5LDEwMCwyLDAsMTAwLDIsMCwxMjUsOCwwLDEyNiw4LDAsODgsCi0gICAgMTEzLDk0LDAsODgsMTEzLDk0LDAsODcsMTIxLDMzLDAsMTE2LDEwLDAsMTI0LDEsCi0gICAgMCwxMjQsMiwwLDEyNCwzLDAsMTMxLDMsMCwxLDExNiw5LDAsMTAwLDMsCi0gICAgMCwxMjQsMSwwLDEzMSwyLDAsMSw4NywxMTAsNTMsMCw0LDExNiw4LDAsCi0gICAgMTA3LDEwLDAsMTE0LDQ4LDEsMSwxMjUsOCwwLDEsMTIyLDIxLDAsMTE2LDksCi0gICAgMCwxMDAsMSwwLDEyNCwxLDAsMTI0LDgsMCwxMzEsMywwLDEsODcsODksCi0gICAgMTAwLDIsMCwxMDAsMiwwLDEyNSw4LDAsMTI2LDgsMCw4OCwxMTAsMSwwLAotICAgIDg4LDEwMCwyLDAsODMsNDEsNCwxMjIsMjcsODcsMTE0LDEwNSwxMTYsMTAxLDMyLDk4LAotICAgIDEyMSwxMTYsMTAxLDExNSwzMiwxMDAsOTcsMTE2LDk3LDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLAotICAgIDEwNSwxMDgsMTAxLDQ2LDEyMiwyNyw5OSwxMTEsMTE3LDEwOCwxMDAsMzIsMTEwLDExMSwxMTYsMzIsCi0gICAgOTksMTE0LDEwMSw5NywxMTYsMTAxLDMyLDEyMywzMywxMTQsMTI1LDU4LDMyLDEyMywzMywxMTQsCi0gICAgMTI1LDc4LDEyMiwxMiw5OSwxMTQsMTAxLDk3LDExNiwxMDEsMTAwLDMyLDEyMywzMywxMTQsMTI1LAotICAgIDQxLDExLDExNCw0MCwwLDAsMCwxMTQsNDgsMCwwLDAsMTE0LDE2NSwwLDAsCi0gICAgMCwxMTQsMzUsMCwwLDAsMTE0LDMwLDAsMCwwLDExNCwzLDAsMCwwLAotICAgIDkwLDUsMTA5LDEwNywxMDAsMTA1LDExNCwyMTgsMTUsNzAsMTA1LDEwOCwxMDEsNjksMTIwLDEwNSwKLSAgICAxMTUsMTE2LDExNSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDQyLDAsMCwwLDExNCwxMDcsMCwKLSAgICAwLDAsMTE0LDU3LDAsMCwwLDQxLDksMTE0LDExMCwwLDAsMCwxMTQsMzcsCi0gICAgMCwwLDAsMTE0LDU1LDAsMCwwLDExNCwyMjEsMCwwLDAsMjE4LDYsMTEyLAotICAgIDk3LDExNCwxMDEsMTEwLDExNiwxMTQsOTYsMCwwLDAsMTE0LDI5LDAsMCwwLDExNCwKLSAgICAyNSwwLDAsMCwxMTQsMjAyLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDExNCwxOTksMCwwLDAsNzYsMywwLAotICAgIDAsMTE1LDM4LDAsMCwwLDAsMiwxOCwxLDYsMiwyMiwxLDE4LDEsCi0gICAgMTcsMiwxOSwxLDE1LDEsMywxLDE3LDEsMTMsMiw3LDEsMTgsMywKLSAgICAxNiwxLDI3LDEsMywxLDE2LDEsMTcsMSwxOCwyLDEyMiwyNSw4MywxMTEsCi0gICAgMTE3LDExNCw5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwKLSAgICAxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNzgsNDEsNywxMTQsMTE0LDAsMCwwLDExNCwKLSAgICAxMTMsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTE2LDAsMCwwLDExNCwxOTgsCi0gICAgMCwwLDAsMTE0LDIwMCwwLDAsMCwxMTQsMTk5LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwKLSAgICAwLDExNCwyMTksMCwwLDAsNjIsMywwLDAsMTE1LDgsMCwwLDAsMTIsCi0gICAgMiw2LDIsMTIsNSwxMiw1LDExNCwyMTksMCwwLDAsOTksMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsCi0gICAgMCwxMTUsNDYsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwKLSAgICAyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLAotICAgIDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwKLSAgICAxMDAsNiwwLDgzLDQxLDcsMjE4LDIwLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLAotICAgIDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw0NSw3NiwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwKLSAgICAxMDEsMTE1LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDMyLDEwMiwxMDUsCi0gICAgMTA4LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMTUsNDYsOTksMiwwLDAsMCwKLSAgICAwLDAsMCwwLDUsMCwwLDAsNiwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsNzYsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsCi0gICAgMCwxMjUsMiwwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsCi0gICAgMTI1LDMsMCwxMTYsMiwwLDEyNCwzLDAsMTAwLDEsMCwxMjQsMSwwLDEwMCwKLSAgICAyLDAsMTI0LDIsMCwxMzEsMSwyLDEyNSw0LDAsMTE2LDMsMCwxMjQsNCwKLSAgICAwLDEwMCwxLDAsMTI0LDEsMCwxMDAsMywwLDEyNCwyLDAsMTMxLDEsMiwKLSAgICA4Myw0MSw0LDc4LDExNCwxMDgsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw5MSwKLSAgICAwLDAsMCw0MSw0LDExNCwxNTksMCwwLDAsMTE0LDIwMSwwLDAsMCwxMTQsCi0gICAgMTQzLDAsMCwwLDExNCwxNDksMCwwLDAsNDEsNSwxMTQsMTEwLDAsMCwwLAotICAgIDExNCwxMjgsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw1NSwwLDAsMCwxMTQsCi0gICAgMjEwLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAotICAgIDAsMCwwLDExNCwxODgsMCwwLDAsMTA5LDMsMCwwLDExNSw4LDAsMCwKLSAgICAwLDAsMSwxNSwxLDE1LDEsMjQsMSwxMjIsMjksODMsMTExLDExNywxMTQsOTksCisgICAgMCwxMTUsMjQsMCwwLDAsMTE2LDAsMTI0LDEsMTMxLDEsMTI1LDQsMTI0LDAsCisgICAgMTA2LDEsMTI0LDIsMTI0LDMsMTI0LDQsMTAwLDEsMTQxLDMsODMsMCw0MSwyLAorICAgIDc4LDQxLDEsMjE4LDUsOTUsMTA5LDExMSwxMDAsMTAxLDQxLDIsMTE0LDEwMSwwLDAsCisgICAgMCwxMTQsMTk1LDAsMCwwLDQxLDUsMTE0LDEwNCwwLDAsMCwxMTQsOTQsMCwKKyAgICAwLDAsMTE0LDkzLDAsMCwwLDExNCw1NiwwLDAsMCwxMTQsNDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsCisgICAgMTE0LDE5NiwwLDAsMCw3NCwzLDAsMCwxMTUsNCwwLDAsMCwwLDIsCisgICAgOCwxLDEyMiwzMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk5LDk3LDk5LDEwNCwxMDEsOTUsOTgsMTIxLDExNiwxMDEsCisgICAgOTksMTExLDEwMCwxMDEsMTA1LDE4MiwxLDAsMCw0MSwxLDExNCwyMTcsMCwwLDAsCisgICAgOTksMywwLDAsMCwxLDAsMCwwLDksMCwwLDAsMTcsMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDI1MCwwLDAsMCwxMTYsMCwxMjQsMSwxMzEsMSwKKyAgICA5MiwyLDEyNSw0LDEyNSw1LDEwMywwLDEyNSw2LDEyMCw0MCwxMjQsNCwxMTQsNTYsCisgICAgMTE2LDEsMTI0LDQsMTMxLDEsMTIsMCwxMTQsNTYsMTE2LDAsMTI0LDQsMTMxLDEsCisgICAgOTIsMiwxMjUsNCwxMjUsNywxMjQsNiwxMDYsMiwxMjQsNywxMzEsMSwxLDAsCisgICAgMTEzLDE4LDg3LDAsMTIwLDEwOCwxMTYsMywxMjQsNiwxMzEsMSw2OCwwLDkzLDk2LAorICAgIDEyNSw3LDExNiw0LDEyNCw0LDEyNCw3LDEzMSwyLDEyNSw0LDEyMSwxNCwxMTYsNSwKKyAgICAxMDYsNiwxMjQsNCwxMzEsMSwxLDAsODcsMCwxMTMsNjgsNCwwLDExNiw3LAorICAgIDEwNywxMCwxMTQsMTE4LDEsMCwxLDAsMSwwLDExOSw2OCw4OSwwLDExMyw2OCwKKyAgICA0LDAsMTE2LDgsMTA3LDEwLDExNCwxNjIsMSwwLDEyNSw4LDEsMCwxMjIsMTgsCisgICAgMTE2LDksMTA2LDEwLDEwMCwxLDEyNCw0LDEyNCw4LDEzMSwzLDEsMCwxMDAsMiwKKyAgICA4MywwLDEwMCwyLDEyNSw4LDEyNiw4LDg4LDAsMTEzLDY4LDg4LDAsMTEzLDY4LAorICAgIDg3LDAsMTIxLDI4LDExNiwxMSwxMjQsMSwxMjQsMiwxMjQsMywxMzEsMywxLDAsCisgICAgMTE2LDksMTA2LDEwLDEwMCwzLDEyNCwxLDEzMSwyLDEsMCw4NywwLDExMCw0OCwKKyAgICA0LDAsMTE2LDgsMTA3LDEwLDExNCwyNDQsMSwwLDEyNSw4LDEsMCwxMjIsMjAsCisgICAgMTE2LDksMTA2LDEwLDEwMCwxLDEyNCwxLDEyNCw4LDEzMSwzLDEsMCw4NywwLAorICAgIDg5LDAsMTAwLDIsMTAwLDIsMTI1LDgsMTI2LDgsODgsMCwxMTAsMiw4OCwwLAorICAgIDEwMCwyLDgzLDAsNDEsNCwxMjIsMjcsODcsMTE0LDEwNSwxMTYsMTAxLDMyLDk4LDEyMSwKKyAgICAxMTYsMTAxLDExNSwzMiwxMDAsOTcsMTE2LDk3LDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLDEwNSwKKyAgICAxMDgsMTAxLDQ2LDEyMiwyNyw5OSwxMTEsMTE3LDEwOCwxMDAsMzIsMTEwLDExMSwxMTYsMzIsOTksCisgICAgMTE0LDEwMSw5NywxMTYsMTAxLDMyLDEyMywzMywxMTQsMTI1LDU4LDMyLDEyMywzMywxMTQsMTI1LAorICAgIDc4LDEyMiwxMiw5OSwxMTQsMTAxLDk3LDExNiwxMDEsMTAwLDMyLDEyMywzMywxMTQsMTI1LDQxLAorICAgIDEyLDExNCw0MCwwLDAsMCwxMTQsNDgsMCwwLDAsMTE0LDE2MSwwLDAsMCwKKyAgICAxMTQsMzUsMCwwLDAsMTE0LDMwLDAsMCwwLDExNCwzLDAsMCwwLDkwLAorICAgIDUsMTA5LDEwNywxMDAsMTA1LDExNCwyMTgsMTUsNzAsMTA1LDEwOCwxMDEsNjksMTIwLDEwNSwxMTUsCisgICAgMTE2LDExNSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDQyLDAsMCwwLDExNCwxMTgsMCwwLAorICAgIDAsMTE0LDEzMywwLDAsMCwxMTQsNTgsMCwwLDAsNDEsOSwxMTQsMTA0LDAsCisgICAgMCwwLDExNCwzNywwLDAsMCwxMTQsNTYsMCwwLDAsMTE0LDIxNywwLDAsCisgICAgMCwyMTgsNiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDExNCw5OCwwLDAsMCwxMTQsMjksCisgICAgMCwwLDAsMTE0LDI1LDAsMCwwLDExNCwxOTgsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE5NSwwLDAsCisgICAgMCw3OSwzLDAsMCwxMTUsNDIsMCwwLDAsMCwyLDEyLDEsNCwyLAorICAgIDE2LDEsMTIsMSwxNCwyLDE0LDEsMTAsMSwyLDEsMTQsMSwxNCwyLAorICAgIDYsMSwxNiwzLDYsMSw4LDEsMjAsMSwyLDEsMTIsMSwxNiwxLAorICAgIDE2LDIsOCwxLDEyMiwyNSw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzAsMTA1LDEwOCwxMDEsCisgICAgNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNzgsCisgICAgNDEsNywxMTQsMTA5LDAsMCwwLDExNCwxMDgsMCwwLDAsMTE0LDExMCwwLDAsCisgICAgMCwxMTQsMTExLDAsMCwwLDExNCwxOTQsMCwwLDAsMTE0LDE5NiwwLDAsMCwKKyAgICAxMTQsMTk1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMTUsMCwwLDAsNjUsMywKKyAgICAwLDAsMTE1LDgsMCwwLDAsOCwyLDQsMiw4LDUsOCw1LDExNCwKKyAgICAyMTUsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsMzIsMCwwLDAsMTAxLDAsCisgICAgOTAsMSwxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsMTMyLDAsCisgICAgOTAsNCwxMDAsNCwxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDgzLDAsNDEsNywKKyAgICAyMTgsMjAsODMsMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLDQ1LDc2LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTksCisgICAgMTA0LDEwNSw5OSwxMDQsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSwxMTUsMzIsMTE1LDExMSwxMTcsCisgICAgMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwNSwxMDksMTEyLAorICAgIDExMSwxMTQsMTE2LDExNSw0Niw5OSwyLDAsMCwwLDAsMCwwLDAsNSwwLAorICAgIDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSw0OCwwLDAsMCwxMjQsCisgICAgMCwxMDYsMCwxMjQsMSwxMzEsMSwxMjUsMiwxMjQsMCwxMDYsMSwxMjQsMiwxMzEsCisgICAgMSwxMjUsMywxMTYsMiwxMjQsMywxMjQsMSwxMjQsMiwxMDAsMSwxNDEsMywxMjUsCisgICAgNCwxMTYsMywxMjQsNCwxMjQsMSwxMjQsMiwxMDAsMiwxNDEsMyw4MywwLDQxLAorICAgIDMsNzgsNDEsMiwxMTQsMTAyLDAsMCwwLDExNCwzNywwLDAsMCw0MSwyLAorICAgIDExNCwxMDIsMCwwLDAsMTE0LDkzLDAsMCwwLDQxLDQsMTE0LDE1NSwwLDAsCisgICAgMCwxMTQsMTk3LDAsMCwwLDExNCwxMzksMCwwLDAsMTE0LDE0NSwwLDAsMCwKKyAgICA0MSw1LDExNCwxMDQsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMzcsMCwwLAorICAgIDAsMTE0LDU2LDAsMCwwLDExNCwyMDYsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4NCwwLDAsMCwxMTQsCisgICAgMywwLDAsMTE1LDgsMCwwLDAsMCwxLDEwLDEsMTAsMSwxNCwxLAorICAgIDEyMiwyOSw4MywxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDcwLDEwNSwxMDgsMTAxLAorICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw5OSwKKyAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsCisgICAgMzksODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiw5NywxMTUsMzIsCisgICAgMTE2LDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMzIsMTE1LDExMSwxMTcsMTE0LAorICAgIDk5LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSw0Niw3OCwxMTQsNCwwLDAsMCw0MSwyLAorICAgIDExNCwxMDQsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTk5LDAsMCwwLDEyMCwzLAorICAgIDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLDMxLDgzLDExMSwxMTcsMTE0LDk5LAogICAgIDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LAotICAgIDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLDAsCi0gICAgMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwKLSAgICAwLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiwzOSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLAotICAgIDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwKLSAgICAxMTUsMzIsMTEwLDExMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLAotICAgIDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsMCwxMTQsMTI4LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsCi0gICAgMCwwLDExNCwyMDMsMCwwLDAsMTE1LDMsMCwwLDExNSwyLDAsMCwwLAotICAgIDAsMiwxMjIsMzEsODMsMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsCi0gICAgMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsCi0gICAgMTE0LDk5LDEwMSw3OCw0MSw2LDExNCwxMTQsMCwwLDAsMTE0LDExMywwLDAsMCwKLSAgICAxMTQsMTE1LDAsMCwwLDExNCwxMTYsMCwwLDAsMTE0LDE4OCwwLDAsMCwxMTQsCi0gICAgMjAzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMjQsMCwwLDAsMTA1LDMsMCwKLSAgICAwLDExNSw2LDAsMCwwLDEyLDIsNiwyLDEyLDYsMTE0LDIyNCwwLDAsCi0gICAgMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsCi0gICAgMCwwLDY0LDAsMCwwLDExNSwxMzYsMCwwLDAsMTAxLDAsMCw5MCwxLAotICAgIDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwKLSAgICAxMDAsMywwLDEzMiwwLDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsCi0gICAgMCwwLDkwLDUsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LAotICAgIDAsMTAwLDgsMCwxMDAsOSwwLDEzMiwwLDAsOTAsNywwLDEwMCwxMCwwLAotICAgIDEwMCwxMSwwLDEzMiwwLDAsOTAsOCwwLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwKLSAgICAwLDAsOTAsOSwwLDEwMCwxNCwwLDEwMCwxNSwwLDEzMiwwLDAsOTAsMTAsCi0gICAgMCwxMDAsMTYsMCwxMDAsMTcsMCwxMzIsMCwwLDkwLDExLDAsMTAxLDEyLDAsCi0gICAgMTAwLDE4LDAsMTAwLDE5LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDEzLDAsMTAwLAotICAgIDIwLDAsODMsNDEsMjEsMjE4LDE5LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsCi0gICAgNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw5Myw3NiwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LAotICAgIDEwNCwxMDEsMzIsOTksMTExLDExMCwxMTUsMTE2LDExNCwxMTcsOTksMTE2LDExMSwxMTQsMzIsMTA1LAotICAgIDExNSwzMiwxMDAsMTAxLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTE5LDExMSwKLSAgICAxMTQsMTA3LDMyLDExOSwxMDUsMTE2LDEwNCwzMiw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwKLSAgICAxMDEsMTE0LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk5LDMsMCwwLDAsMCwwLAotICAgIDAsMCwzLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDIyLAotICAgIDAsMCwwLDEyNCwxLDAsMTI0LDAsMCw5NSwwLDAsMTI0LDIsMCwxMjQsCi0gICAgMCwwLDk1LDEsMCwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsMiwxMTQsMTA4LAotICAgIDAsMCwwLDExNCwzNywwLDAsMCw0MSwzLDExNCwxMTAsMCwwLDAsMTE0LAotICAgIDEwOCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4NiwwLDAsMCwxMzIsMywwLAotICAgIDAsMTE1LDQsMCwwLDAsMCwxLDksMSwxMjIsMjgsNjksMTIwLDExNiwxMDEsCi0gICAgMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsCi0gICAgMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEwNiwwLDAsMTA3LDIsCi0gICAgMCwxMTEsMzMsMCwxMjQsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMDYsMSwwLAotICAgIDEwNywyLDAsODMsNDEsMSw3OCw0MSwyLDExNCwyMTIsMCwwLDAsMTE0LDEyMCwKLSAgICAwLDAsMCw0MSwyLDExNCwxMTAsMCwwLDAsMTE0LDIxMywwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjE0LAotICAgIDAsMCwwLDEzNiwzLDAsMCwxMTUsNCwwLDAsMCwwLDEsMTgsMSwKLSAgICAxMjIsMjYsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwKLSAgICAwLDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSwyNiwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsCi0gICAgMSwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMiwwLDEzMSwxLDAsNjUsODMsCi0gICAgNDEsMSw3OCw0MSwzLDExNCwyMTUsMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsCi0gICAgMzcsMCwwLDAsNDEsMSwxMTQsMTEwLDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMTYsMCwwLDAsMTQwLAotICAgIDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjgsNjksMTIwLDExNiwxMDEsCi0gICAgMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgOTUsOTUsMTA0LDk3LDExNSwxMDQsOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwKLSAgICAwLDMsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsNDcsMCwKLSAgICAwLDAsMTE2LDAsMCwxMDYsMSwwLDExNiwyLDAsMTA2LDMsMCwxMjQsMSwKLSAgICAwLDEzMSwyLDAsMTI1LDIsMCwxMTYsNCwwLDEwMCwxLDAsMTI0LDEsMCwKLSAgICAxMDYsNSwwLDEyNCwwLDAsMTA2LDYsMCwxMzEsMywwLDEsMTI0LDIsMCwKLSAgICA4Myw0MSwyLDEyMiwzOCw2NywxMTQsMTAxLDk3LDExNiwxMDEsMzIsOTcsMTEwLDMyLDExNywKLSAgICAxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDEwMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLAotICAgIDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMjIsMzgsMTAxLDEyMCwxMTYsCi0gICAgMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLAotICAgIDExNCwxMjUsMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLAotICAgIDMzLDExNCwxMjUsNDEsNywxMTQsMTIzLDAsMCwwLDExNCwxODksMCwwLDAsMTE0LAotICAgIDE0NywwLDAsMCw5MCwxNCw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTAwLDEyMSwxMTAsCi0gICAgOTcsMTA5LDEwNSw5OSwxMTQsMTA3LDAsMCwwLDExNCwxMDgsMCwwLDAsMTE0LDM3LAotICAgIDAsMCwwLDQxLDMsMTE0LDExMCwwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCwKLSAgICAxOTEsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCi0gICAgMCwwLDAsMTE0LDE4NywwLDAsMCwxNDMsMywwLDAsMTE1LDEwLDAsMCwKLSAgICAwLDAsMiw2LDEsMTUsMSw2LDEsMTYsMSwxMjIsMzMsNjksMTIwLDExNiwKKyAgICAxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDc4LDQxLDYsMTE0LDEwOSwwLAorICAgIDAsMCwxMTQsMTA4LDAsMCwwLDExNCwxMTAsMCwwLDAsMTE0LDExMSwwLDAsCisgICAgMCwxMTQsMTg0LDAsMCwwLDExNCwxOTksMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LAorICAgIDIyMCwwLDAsMCwxMTAsMywwLDAsMTE1LDYsMCwwLDAsOCwyLDQsCisgICAgMiw4LDYsMTE0LDIyMCwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwzLDAsMCwwLDY0LDAsMCwwLDExNSw5MiwwLAorICAgIDAsMCwxMDEsMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDAsMiwKKyAgICAxMDAsMywxMzIsMCw5MCw0LDEwMCw0LDEwMCw1LDEzMiwwLDkwLDUsMTAwLDYsCisgICAgMTAwLDcsMTMyLDAsOTAsNiwxMDAsOCwxMDAsOSwxMzIsMCw5MCw3LDEwMCwxMCwKKyAgICAxMDAsMTEsMTMyLDAsOTAsOCwxMDAsMTIsMTAwLDEzLDEzMiwwLDkwLDksMTAwLDE0LAorICAgIDEwMCwxNSwxMzIsMCw5MCwxMCwxMDAsMTYsMTAwLDE3LDEzMiwwLDkwLDExLDEwMSwxMiwKKyAgICAxMDAsMTgsMTAwLDE5LDEzMiwwLDEzMSwxLDkwLDEzLDEwMCwyMCw4MywwLDQxLDIxLAorICAgIDIxOCwxOSw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LAorICAgIDExMSw5NywxMDAsMTAxLDExNCwxMjIsOTMsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsCisgICAgMTE0LDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDk5LDExMSwKKyAgICAxMTAsMTE1LDExNiwxMTQsMTE3LDk5LDExNiwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTUsCisgICAgMTA1LDEwMywxMTAsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDExOSwxMTEsMTE0LDEwNywzMiwxMTksMTA1LAorICAgIDExNiwxMDQsMzIsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMCwxMCwKKyAgICAzMiwzMiwzMiwzMiw5OSwzLDAsMCwwLDAsMCwwLDAsMywwLDAsCisgICAgMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMjQsMSwKKyAgICAxMjQsMCw5NSwwLDEyNCwyLDEyNCwwLDk1LDEsMTAwLDAsODMsMCw0MSwxLAorICAgIDc4LDQxLDIsMTE0LDEwMiwwLDAsMCwxMTQsMzcsMCwwLDAsNDEsMywxMTQsCisgICAgMTA0LDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxODIsMCwKKyAgICAwLDAsMTM3LDMsMCwwLDExNSw0LDAsMCwwLDAsMSw2LDEsMTIyLAorICAgIDI4LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwyLDAsCisgICAgMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwyNCwwLDAsMCwxMjQsMCwxMDYsMCwxMjQsMSwxMDYsMCwxMDcsCisgICAgMiwxMTEsMjIsMTI0LDAsMTA2LDEsMTI0LDEsMTA2LDEsMTA3LDIsODMsMCw0MSwKKyAgICAxLDc4LDQxLDIsMTE0LDIwOCwwLDAsMCwxMTQsMTE1LDAsMCwwLDQxLDIsCisgICAgMTE0LDEwNCwwLDAsMCwxMTQsMjA5LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMTAsMCwwLDAsMTQxLDMsCisgICAgMCwwLDExNSw0LDAsMCwwLDAsMSwxMiwxLDEyMiwyNiw2OSwxMjAsMTE2LAogICAgIDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICA0Niw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNCwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNDUsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDExNiwyLAotICAgIDAsMTA2LDMsMCwxMjQsMSwwLDEzMSwyLDAsMSwxMTYsNCwwLDEwMCwxLAotICAgIDAsMTI0LDAsMCwxMDYsNSwwLDEyNCwwLDAsMTA2LDYsMCwxMzEsMywwLAotICAgIDEsMTAwLDIsMCw4Myw0MSwzLDEyMiwzMCw3MywxMTAsMTA1LDExNiwxMDUsOTcsMTA4LAotICAgIDEwNSwxMjIsMTAxLDMyLDk3LDExMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMjIsNDAsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LAotICAgIDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTAxLAotICAgIDEyMCwxMDEsOTksMTE3LDExNiwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMjMsMzMsMTE0LAotICAgIDEyNSw3OCw0MSw3LDExNCwxMjMsMCwwLDAsMTE0LDE4OSwwLDAsMCwxMTQsMTQ3LAotICAgIDAsMCwwLDkwLDEyLDEwMSwxMjAsMTAxLDk5LDk1LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsCi0gICAgOTksMTE0LDEwNywwLDAsMCwxMTQsMTA4LDAsMCwwLDExNCwzNywwLDAsMCwKLSAgICA0MSwyLDExNCwxMTAsMCwwLDAsMTE0LDE5MSwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTkyLDAsMCwwLAotICAgIDE1MSwzLDAsMCwxMTUsNiwwLDAsMCwwLDIsMTksMSw2LDEsMTIyLAotICAgIDMxLDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLAotICAgIDAsMywwLDAsMCwxMTUsNDgsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLAotICAgIDEwNiwxLDAsMTMxLDEsMCwxMDAsMSwwLDI1LDEzNywwLDAsMTE2LDIsMCwKLSAgICAxMzUsMCwwLDEwMiwxLDAsMTAwLDIsMCwxMDAsMywwLDEzNCwwLDAsMTE2LAotICAgIDMsMCw2OCwxMzEsMSwwLDEzMSwxLDAsODMsNDEsNCwxMjIsNDksODIsMTAxLAotICAgIDExNiwxMTcsMTE0LDExMCwzMiw4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTAyLDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDMyLDEwNSwxMTUsMzIsOTcsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDQ2LDExNCwKLSAgICAzMSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCw0LDAsMCwwLDUxLDAsMCwwLDExNSwzMSwwLDAsMCwxMjQsMCwKLSAgICAwLDkzLDIxLDAsMTI1LDEsMCwxMzYsMCwwLDEwMCwwLDAsMTI0LDEsMCwKLSAgICAyMywxMDcsMiwwLDg2LDEsMTEzLDMsMCwxMDAsMSwwLDgzLDQxLDIsMTE0LAotICAgIDE4NiwwLDAsMCw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwyNCwwLDAsCisgICAgNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsCisgICAgMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyMCwwLDAsCisgICAgMCwxMTYsMCwxMjQsMCwxMDYsMSwxMzEsMSwxMTYsMCwxMjQsMCwxMDYsMiwxMzEsCisgICAgMSw2NSwwLDgzLDAsNDEsMSw3OCw0MSwzLDExNCwyMTEsMCwwLDAsMTE0LAorICAgIDEwMiwwLDAsMCwxMTQsMzcsMCwwLDAsNDEsMSwxMTQsMTA0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwKKyAgICAyMTIsMCwwLDAsMTQ1LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsCisgICAgMjgsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCisgICAgOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA0LDk3LDExNSwxMDQsOTUsOTUsOTksMiwwLAorICAgIDAsMCwwLDAsMCwwLDMsMCwwLDAsNCwwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsMzYsMCwwLDAsMTE2LDAsMTA2LDEsMTE2LDIsMTA2LDMsMTI0LAorICAgIDEsMTMxLDIsMTI1LDIsMTE2LDAsMTA2LDQsMTAwLDEsMTI0LDEsMTA2LDUsMTI0LAorICAgIDAsMTA2LDYsMTMxLDMsMSwwLDEyNCwyLDgzLDAsNDEsMiwxMjIsMzgsNjcsCisgICAgMTE0LDEwMSw5NywxMTYsMTAxLDMyLDk3LDExMCwzMiwxMTcsMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwKKyAgICAxMDUsMTIyLDEwMSwxMDAsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMTIyLDM4LDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLAorICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDEwOCwxMTEsOTcsCisgICAgMTAwLDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LDQxLDcsMTE0LAorICAgIDExOCwwLDAsMCwxMTQsMTg1LDAsMCwwLDExNCwxNDMsMCwwLDAsOTAsMTQsCisgICAgOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksMTE0LDEzMywKKyAgICAwLDAsMCwxMTQsMTAyLDAsMCwwLDExNCwzNywwLDAsMCw0MSwzLDExNCwKKyAgICAxMDQsMCwwLDAsMTE0LDE2MiwwLDAsMCwxMTQsMTg3LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxODMsMCwKKyAgICAwLDAsMTQ4LDMsMCwwLDExNSwxMCwwLDAsMCwwLDIsNCwxLDEwLAorICAgIDEsNiwxLDEyLDEsMTIyLDMzLDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsCisgICAgNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk5LDExNCwxMDEsOTcsMTE2LAorICAgIDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwzNiwwLAorICAgIDAsMCwxMTYsMCwxMDYsMSwxMTYsMiwxMDYsMywxMjQsMSwxMzEsMiwxLDAsCisgICAgMTE2LDAsMTA2LDQsMTAwLDEsMTI0LDAsMTA2LDUsMTI0LDAsMTA2LDYsMTMxLDMsCisgICAgMSwwLDEwMCwyLDgzLDAsNDEsMywxMjIsMzAsNzMsMTEwLDEwNSwxMTYsMTA1LDk3LAorICAgIDEwOCwxMDUsMTIyLDEwMSwzMiw5NywxMTAsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwKKyAgICAxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTIyLDQwLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LAorICAgIDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLAorICAgIDEwMSwxMjAsMTAxLDk5LDExNywxMTYsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDMzLAorICAgIDExNCwxMjUsNzgsNDEsNywxMTQsMTE4LDAsMCwwLDExNCwxODUsMCwwLDAsMTE0LAorICAgIDE0MywwLDAsMCw5MCwxMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDAsMTIxLDExMCw5NywxMDksCisgICAgMTA1LDk5LDExNCwxMzMsMCwwLDAsMTE0LDEwMiwwLDAsMCwxMTQsMzcsMCwwLAorICAgIDAsNDEsMiwxMTQsMTA0LDAsMCwwLDExNCwxODcsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4OCwwLDAsCisgICAgMCwxNTYsMywwLDAsMTE1LDYsMCwwLDAsMCwyLDE0LDEsNiwxLAorICAgIDEyMiwzMSw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LAorICAgIDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw0LDAsCisgICAgMCwwLDMsMCwwLDAsMTE1LDM2LDAsMCwwLDExNiwwLDEyNCwwLDEwNiwKKyAgICAxLDEzMSwxLDEwMCwxLDI1LDAsMTM3LDAsMTE2LDIsMTM1LDAsMTAyLDEsMTAwLAorICAgIDIsMTAwLDMsMTMyLDgsMTE2LDMsNjgsMCwxMzEsMSwxMzEsMSw4MywwLDQxLAorICAgIDQsMTIyLDQ5LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsODQsMTE0LDExNywxMDEsMzIsMTA1LAorICAgIDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDk3LDMyLDExMiw5Nyw5OSwxMDcsCisgICAgOTcsMTAzLDEwMSw0NiwxMTQsMzEsMCwwLDAsOTksMSwwLDAsMCwwLDAsCisgICAgMCwwLDIsMCwwLDAsNCwwLDAsMCw1MSwwLDAsMCwxMTUsMjYsCisgICAgMCwwLDAsMTI0LDAsOTMsMTgsMTI1LDEsMTM2LDAsMTAwLDAsMTI0LDEsMjMsCisgICAgMCwxMDcsMiw4NiwwLDEsMCwxMTMsMiwxMDAsMSw4MywwLDQxLDIsMTE0LAorICAgIDE4MiwwLDAsMCw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwyNCwwLDAsCiAgICAgMCwyMTgsNiwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCw0MSwxLDIxOCw5LDEwMiwxMDUsMTA4LAogICAgIDEwMSw5NSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAyNTAsOSw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsMTYwLDMsMCwwLDExNSwKLSAgICAyLDAsMCwwLDYsMSwxMjIsNDksNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLAorICAgIDI1MCw5LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxNjUsMywwLDAsMTE1LAorICAgIDIsMCwwLDAsNCwxLDEyMiw0OSw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsCiAgICAgMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiwKICAgICA5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsCiAgICAgNjAsMTAzLDEwMSwxMTAsMTAxLDEyMCwxMTIsMTE0LDYyLDQxLDQsMTE0LDQwLDAsMCwwLAogICAgIDExNCwzNywwLDAsMCwyMTgsMyw5NywxMTAsMTIxLDIxOCwxOCw2OSw4OCw4NCw2OSwKICAgICA3OCw4Myw3Myw3OSw3OCw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4Myw0MSwyLAotICAgIDExNCwxMTAsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsNCwwLDAsMCw0MSwKLSAgICAxLDExNCwyMjcsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE2MSwwLDAsMCwKLSAgICAxNTcsMywwLDAsMTE1LDYsMCwwLDAsMCwyLDE5LDEsMTgsMSwxMjIsCisgICAgMTE0LDEwNCwwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCw0LDAsMCwwLDQxLAorICAgIDEsMTE0LDIyMywwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTU3LDAsMCwwLAorICAgIDE2MiwzLDAsMCwxMTUsNiwwLDAsMCwwLDIsMTQsMSwxMiwxLDEyMiwKICAgICAzMCw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSwKICAgICA5NywxMDAsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5OSwKICAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsODMsNDEsMiwxMjIsCisgICAgNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiwKICAgICA2Myw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiwKICAgICA5NywxMTAsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsCiAgICAgMTE3LDEwOCwxMDEsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDk5LDExNCwxMDEsOTcsMTE2LAogICAgIDEwMSwzMiw5NywzMiw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsNDYsCi0gICAgNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTEwLDAsMCwwLDExNCwxMjgsMCwKKyAgICA3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDQsMCwwLDAsMTE0LDEyMywwLAogICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsCi0gICAgMCwxMTQsMTg4LDAsMCwwLDE2MywzLDAsMCwxMTUsMiwwLDAsMCwwLAorICAgIDAsMTE0LDE4NCwwLDAsMCwxNjgsMywwLDAsMTE1LDIsMCwwLDAsMCwKICAgICAyLDEyMiwyOCw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLAogICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw5OSwKICAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsODMsNDEsMiwxMjIsCisgICAgNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiwKICAgICA1Myw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiwKICAgICAxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKICAgICAxMTUsMzIsMTA0LDk3LDExOCwxMDEsMzIsMTEwLDExMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLAotICAgIDMyLDk5LDExMSwxMDAsMTAxLDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDExMCwKLSAgICAwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw2LDAsMCwwLDExNCwyMDMsMCwwLDAsMTY3LDMsMCwwLAorICAgIDMyLDk5LDExMSwxMDAsMTAxLDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwNCwKKyAgICAwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw2LDAsMCwwLDExNCwxOTksMCwwLDAsMTcyLDMsMCwwLAogICAgIDExNSwyLDAsMCwwLDAsMiwxMjIsMzAsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsCiAgICAgMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsCiAgICAgOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsCi0gICAgMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw3LDAsMCwKLSAgICAwLDEyNCwwLDAsMTA2LDAsMCw4Myw0MSwxLDEyMiw1OCw4MiwxMDEsMTE2LDExNywKLSAgICAxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTcsCi0gICAgMTE1LDMyLDEwMiwxMTEsMTE3LDExMCwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDQxLDEsMTE0LDM3LDAsMCwwLDQxLDIsMTE0LAotICAgIDExMCwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDExNCwxNTksMCwwLDAsMTcxLDMsMCwKLSAgICAwLDExNSwyLDAsMCwwLDAsMywxMjIsMzIsNjksMTIwLDExNiwxMDEsMTEwLDExNSwKLSAgICAxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwKLSAgICAxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDc4LDQxLDE0LDExNCwxMTQsMCwKLSAgICAwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE1LDAsMCwwLDExNCwxMTYsMCwwLAotICAgIDAsMTE0LDE4NiwwLDAsMCwxMTQsMjE0LDAsMCwwLDExNCwyMTYsMCwwLDAsCi0gICAgMTE0LDE4NywwLDAsMCwxMTQsMTkyLDAsMCwwLDExNCwxNjEsMCwwLDAsMTE0LAotICAgIDE4OCwwLDAsMCwxMTQsMjAzLDAsMCwwLDExNCwxMjUsMCwwLDAsMTE0LDE1OSwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNiwwLDAsMCwxMTQsMjI1LDAsMCwwLDEyNCwzLDAsMCwKLSAgICAxMTUsMjAsMCwwLDAsMTIsNiw2LDIsMTIsNCwxMiw0LDEyLDMsMTIsCi0gICAgOCwxMiw2LDEyLDYsMTIsNCwxMiw0LDExNCwyMjUsMCwwLDAsOTksMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwKLSAgICAwLDAsMCwxMTUsMTMwLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLAotICAgIDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwKLSAgICAxMzIsMCwwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCwKLSAgICA1LDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLDEwMCw4LAotICAgIDAsMTAwLDksMCwxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCwxMDAsMTEsMCwKLSAgICAxMzIsMCwwLDkwLDgsMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwwLDkwLAotICAgIDksMCwxMDAsMTQsMCwxMDAsMTUsMCwxMzIsMCwwLDkwLDEwLDAsMTAwLDE2LAotICAgIDAsMTAwLDE3LDAsMTMyLDAsMCw5MCwxMSwwLDEwMCwxOCwwLDEwMCwxOSwwLAotICAgIDEzMiwwLDAsOTAsMTIsMCwxMDAsMjAsMCw4Myw0MSwyMSwyMTgsMTQsOTUsNzgsCi0gICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDk3LDM4LDEsMCwKLSAgICAwLDgyLDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsMTE1LDMyLDk3LDMyLDExMCw5NywKLSAgICAxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzOSwKLSAgICAxMTUsMzIsMTEyLDk3LDExNiwxMDQsNDYsMzIsMzIsNzMsMTE2LDMyLDExNywxMTUsMTAxLDExNSwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwKLSAgICAxMCwzMiwzMiwzMiwzMiwxMTYsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiwxMDUsMTE2LDExNSwKLSAgICAzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLAotICAgIDk3LDExMCwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNiwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LAotICAgIDExNiwzMiwxMDgsMTExLDExMSwxMDcsMTE1LDMyLDExNywxMTIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAotICAgIDk3LDExNCwxMDEsMTEwLDExNiwzOSwxMTUsMTAsMzIsMzIsMzIsMzIsOTUsOTUsMTEyLDk3LAotICAgIDExNiwxMDQsOTUsOTUsNDYsMzIsMzIsODcsMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDUsMTE1LAotICAgIDMyLDk5LDEwNCw5NywxMTAsMTAzLDEwMSwxMTUsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMzksMTE1LDMyLDExMSwxMTksMTEwLDMyLDExMiw5NywxMTYsMTA0LDMyLAotICAgIDEwNSwxMTUsMzIsMTE0LDEwMSw5OSwxMTEsMTA5LDExMiwxMTcsMTE2LDEwMSwxMDAsNDQsMTAsMzIsCi0gICAgMzIsMzIsMzIsMTE3LDExNSwxMDUsMTEwLDEwMywzMiwxMTIsOTcsMTE2LDEwNCw5NSwxMDIsMTA1LAotICAgIDExMCwxMDAsMTAxLDExNCw0NiwzMiwzMiw3MCwxMTEsMTE0LDMyLDExNiwxMTEsMTEyLDQ1LDEwOCwKLSAgICAxMDEsMTE4LDEwMSwxMDgsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ0LDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzksCi0gICAgMTE1LDMyLDExMiw5NywxMTYsMTA0LDEwLDMyLDMyLDMyLDMyLDEwNSwxMTUsMzIsMTE1LDEyMSwKLSAgICAxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsOTksNCwwLDAsMCwwLDAsMCwwLAotICAgIDQsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsNTIsMCwwLAotICAgIDAsMTI0LDEsMCwxMjQsMCwwLDk1LDAsMCwxMjQsMiwwLDEyNCwwLDAsCi0gICAgOTUsMSwwLDExNiwyLDAsMTI0LDAsMCwxMDYsMywwLDEzMSwwLDAsMTMxLAotICAgIDEsMCwxMjQsMCwwLDk1LDQsMCwxMjQsMywwLDEyNCwwLDAsOTUsNSwKLSAgICAwLDEwMCwwLDAsODMsNDEsMSw3OCw0MSw2LDIxOCw1LDk1LDExMCw5NywxMDksCi0gICAgMTAxLDIxOCw1LDk1LDExMiw5NywxMTYsMTA0LDExNCw5NSwwLDAsMCwyMTgsMTYsOTUsCi0gICAgMTAzLDEwMSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCwyMTgsCi0gICAgMTcsOTUsMTA4LDk3LDExNSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsCi0gICAgMTE2LDEwNCwyMTgsMTIsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsCi0gICAgNDEsNCwxMTQsMTEwLDAsMCwwLDExNCwxMDgsMCwwLDAsMTE0LDM3LDAsMCwKLSAgICAwLDIxOCwxMSwxMTIsOTcsMTE2LDEwNCw5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTg2LDAsCi0gICAgMCwwLDE4NCwzLDAsMCwxMTUsOCwwLDAsMCwwLDEsOSwxLDksCi0gICAgMSwyMSwxLDEyMiwyMyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLAotICAgIDk3LDExNiwxMDQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLAotICAgIDAsMCwwLDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDUzLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsMSwwLDEwMCwKLSAgICAxLDAsMTMxLDEsMCw5MiwzLDAsMTI1LDEsMCwxMjUsMiwwLDEyNSwzLAotICAgIDAsMTI0LDIsMCwxMDAsMiwwLDEwNywyLDAsMTE0LDQzLDAsMTAwLDYsMCwKLSAgICA4MywxMjQsMSwwLDEwMCw1LDAsMTAyLDIsMCw4Myw0MSw3LDEyMiw2Miw4MiwKLSAgICAxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw5NywzMiwxMTYsMTE3LDExMiwxMDgsMTAxLDMyLDExMSwKLSAgICAxMDIsMzIsNDAsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw0NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA0NSwxMTAsOTcsMTA5LDEwMSw0NCwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ1LDExMiw5NywKLSAgICAxMTYsMTA0LDQ1LDk3LDExNiwxMTYsMTE0LDQ1LDExMCw5NywxMDksMTAxLDQxLDExNCw2MCwwLAotICAgIDAsMCwxMTQsMzIsMCwwLDAsMTE0LDgsMCwwLDAsMTE0LDM3LDAsMCwKLSAgICAwLDkwLDgsOTUsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsNDEsMiwxMjIsMywxMTUsCi0gICAgMTIxLDExNSwxMjIsNCwxMTIsOTcsMTE2LDEwNCw0MSwyLDExNCwyMzIsMCwwLDAsMTE0LAotICAgIDM0LDAsMCwwLDQxLDQsMTE0LDExMCwwLDAsMCwxMTQsMjIzLDAsMCwwLAotICAgIDIxOCwzLDEwMCwxMTEsMTE2LDkwLDIsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMjMsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LAotICAgIDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTEwLDk3LDEwOSwxMDEsCi0gICAgMTE1LDE5MCwzLDAsMCwxMTUsOCwwLDAsMCwwLDIsMjcsMSwxMiwyLAotICAgIDQsMywxMjIsMzgsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywKLSAgICAxMTYsMTA0LDQ2LDk1LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LAotICAgIDExMiw5NywxMTYsMTA0LDk1LDExMCw5NywxMDksMTAxLDExNSw5OSwxLDAsMCwwLDAsCi0gICAgMCwwLDAsMywwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwKLSAgICAzOCwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTMxLDAsMCw5MiwyLDAsCi0gICAgMTI1LDEsMCwxMjUsMiwwLDExNiwxLDAsMTE2LDIsMCwxMDYsMywwLDEyNCwKLSAgICAxLDAsMjUsMTI0LDIsMCwxMzEsMiwwLDgzLDQxLDEsNzgsNDEsNCwxMTQsCi0gICAgMjM5LDAsMCwwLDExNCwxMTksMCwwLDAsMTE0LDgsMCwwLDAsMjE4LDcsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQxLDMsMTE0LDExMCwwLDAsMCw5MCwxOCwKLSAgICAxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExMCw5NywKLSAgICAxMDksMTAxLDkwLDE0LDExMiw5NywxMTYsMTA0LDk1LDk3LDExNiwxMTYsMTE0LDk1LDExMCw5NywKLSAgICAxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwKLSAgICAwLDExNCwyMzQsMCwwLDAsMjAwLDMsMCwwLDExNSw0LDAsMCwwLDAsCi0gICAgMSwxOCwxLDEyMiwzMSw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLAotICAgIDk3LDExNiwxMDQsNDYsOTUsMTAzLDEwMSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwKLSAgICAxMTIsOTcsMTE2LDEwNCw5OSwxLDAsMCwwLDAsMCwwLDAsMywwLDAsCi0gICAgMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxMTgsMCwwLDAsMTE2LDAsCi0gICAgMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDAsMCwxMzEsMSwwLDEyNSwxLDAsCi0gICAgMTI0LDEsMCwxMjQsMCwwLDEwNiwyLDAsMTA3LDMsMCwxMTQsMTExLDAsMTI0LAotICAgIDAsMCwxMDYsMywwLDEyNCwwLDAsMTA2LDQsMCwxMjQsMSwwLDEzMSwyLAotICAgIDAsMTI1LDIsMCwxMjQsMiwwLDEwMCwwLDAsMTA3LDksMCwxMTQsMTAyLDAsCi0gICAgMTI0LDIsMCwxMDYsNSwwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMTAyLDAsMTI0LAotICAgIDIsMCwxMDYsNiwwLDExNCwxMDIsMCwxMjQsMiwwLDEwNiw2LDAsMTI0LDAsCi0gICAgMCw5NSw3LDAsMTI0LDEsMCwxMjQsMCwwLDk1LDIsMCwxMjQsMCwwLAotICAgIDEwNiw3LDAsODMsNDEsMSw3OCw0MSw4LDExNCw5NSwwLDAsMCwxMTQsMjM0LAotICAgIDAsMCwwLDExNCwyMzUsMCwwLDAsMTE0LDIzNiwwLDAsMCwxMTQsMjMyLDAsCi0gICAgMCwwLDExNCwxMjksMCwwLDAsMTE0LDE1OCwwLDAsMCwxMTQsMjMzLDAsMCwKLSAgICAwLDQxLDMsMTE0LDExMCwwLDAsMCw5MCwxMSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LAotICAgIDk1LDExMiw5NywxMTYsMTA0LDExNCwxNjYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEyLDk1LDExNCwxMDEsOTksOTcsCi0gICAgMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSwyMDQsMywwLDAsMTE1LDE2LDAsMCwwLAotICAgIDAsMiwxOCwxLDE1LDEsMjEsMywyNywxLDksMSwxMiwxLDksMSwKLSAgICAxMjIsMjcsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LAotICAgIDQ2LDk1LDExNCwxMDEsOTksOTcsMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSw5OSwxLDAsCi0gICAgMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwxNiwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwKLSAgICAxMzEsMCwwLDEzMSwxLDAsODMsNDEsMSw3OCw0MSwyLDIxOCw0LDEwNSwxMTYsCi0gICAgMTAxLDExNCwxMTQsMjQxLDAsMCwwLDQxLDEsMTE0LDExMCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsOCw5NSwKLSAgICA5NSwxMDUsMTE2LDEwMSwxMTQsOTUsOTUsMjE3LDMsMCwwLDExNSwyLDAsMCwwLAotICAgIDAsMSwxMjIsMjMsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywKLSAgICAxMTYsMTA0LDQ2LDk1LDk1LDEwNSwxMTYsMTAxLDExNCw5NSw5NSw5OSwxLDAsMCwwLAotICAgIDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLAotICAgIDExNSwxNiwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMCwKLSAgICAwLDEzMSwxLDAsODMsNDEsMSw3OCw0MSwyLDExNCwzMywwLDAsMCwxMTQsCi0gICAgMjQxLDAsMCwwLDQxLDEsMTE0LDExMCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsNyw5NSw5NSwxMDgsMTAxLAotICAgIDExMCw5NSw5NSwyMjAsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyMiwKLSAgICA5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsCi0gICAgOTUsMTA4LDEwMSwxMTAsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsCi0gICAgMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsCi0gICAgMTAwLDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDgzLAotICAgIDQxLDIsNzgsMTIyLDIwLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsCi0gICAgOTcsMTE2LDEwNCw0MCwxMjMsMzMsMTE0LDEyNSw0MSw0MSwyLDExNCw0OSwwLDAsMCwKLSAgICAxMTQsMjMzLDAsMCwwLDQxLDEsMTE0LDExMCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsOCw5NSw5NSwxMTQsCi0gICAgMTAxLDExMiwxMTQsOTUsOTUsMjIzLDMsMCwwLDExNSwyLDAsMCwwLDAsMSwKLSAgICAxMjIsMjMsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LAotICAgIDQ2LDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSw5OSwyLDAsMCwwLDAsMCwKLSAgICAwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwKLSAgICAwLDAsMCwxMjQsMSwwLDEyNCwwLDAsMTA2LDAsMCwxMzEsMCwwLDEwNywKLSAgICA2LDAsODMsNDEsMSw3OCw0MSwxLDExNCwyNDEsMCwwLDAsNDEsMiwxMTQsCi0gICAgMTEwLDAsMCwwLDIxOCw0LDEwNSwxMTYsMTAxLDEwOSwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTIsOTUsOTUsOTksMTExLDExMCwKLSAgICAxMTYsOTcsMTA1LDExMCwxMTUsOTUsOTUsMjI2LDMsMCwwLDExNSwyLDAsMCwwLAotICAgIDAsMSwxMjIsMjcsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywKLSAgICAxMTYsMTA0LDQ2LDk1LDk1LDk5LDExMSwxMTAsMTE2LDk3LDEwNSwxMTAsMTE1LDk1LDk1LDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDIwLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsCi0gICAgMSwwLDEyNCwxLDAsMTMxLDEsMCwxLDEwMCwwLDAsODMsNDEsMSw3OCwKLSAgICA0MSwyLDExNCwyMzMsMCwwLDAsMTE0LDE2NSwwLDAsMCw0MSwyLDExNCwxMTAsCi0gICAgMCwwLDAsMTE0LDI0NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNiwwLDAsMCwxMTQsMTY1LDAsMCwwLDIyOSwzLDAsMCwKLSAgICAxMTUsMiwwLDAsMCwwLDEsMTIyLDIxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiwKLSAgICA5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDc4LDQxLAotICAgIDEzLDExNCwxMTQsMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE1LDAsMCwwLAotICAgIDExNCwxMTYsMCwwLDAsMTE0LDE4NiwwLDAsMCwxMTQsMjM5LDAsMCwwLDExNCwKLSAgICAyMzQsMCwwLDAsMTE0LDI0MSwwLDAsMCwxMTQsMjQzLDAsMCwwLDExNCwyNDQsCi0gICAgMCwwLDAsMTE0LDI0NSwwLDAsMCwxMTQsMjQ3LDAsMCwwLDExNCwxNjUsMCwKKyAgICAyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDYsMCwwLAorICAgIDAsMTI0LDAsMTA2LDAsODMsMCw0MSwxLDEyMiw1OCw4MiwxMDEsMTE2LDExNywxMTQsCisgICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTcsMTE1LAorICAgIDMyLDEwMiwxMTEsMTE3LDExMCwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsCisgICAgMTEwLDEwMCwxMDEsMTE0LDQ2LDQxLDEsMTE0LDM3LDAsMCwwLDQxLDIsMTE0LDEwNCwKKyAgICAwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw2LDAsMCwwLDExNCwxNTUsMCwwLDAsMTc2LDMsMCwwLAorICAgIDExNSwyLDAsMCwwLDAsMywxMjIsMzIsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsCisgICAgMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsCisgICAgOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDc4LDQxLDE0LDExNCwxMDksMCwwLAorICAgIDAsMTE0LDEwOCwwLDAsMCwxMTQsMTEwLDAsMCwwLDExNCwxMTEsMCwwLDAsCisgICAgMTE0LDE4MiwwLDAsMCwxMTQsMjEwLDAsMCwwLDExNCwyMTIsMCwwLDAsMTE0LAorICAgIDE4MywwLDAsMCwxMTQsMTg4LDAsMCwwLDExNCwxNTcsMCwwLDAsMTE0LDE4NCwKKyAgICAwLDAsMCwxMTQsMTk5LDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LDE1NSwwLAogICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNiwwLDAsMCwxMTQsMjMxLDAsMCwwLDE3NywzLDAsMCwxMTUsCi0gICAgMjAsMCwwLDAsMTIsNSw2LDIsMTIsNiwxMiwxMCwxMiw0LDEyLDEzLAotICAgIDEyLDMsMTIsMywxMiwzLDEyLDMsMTE0LDIzMSwwLDAsMCw5OSwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDY0LDAsCi0gICAgMCwwLDExNSwxMTgsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCwKLSAgICA5MCwyLDAsMTAwLDEsMCwxMDAsMiwwLDEzMiwwLDAsOTAsMywwLDEwMSwKLSAgICA0LDAsMTAwLDMsMCwxMDAsNCwwLDEzMiwwLDAsMTMxLDEsMCw5MCw1LAotICAgIDAsMTAwLDUsMCwxMDAsNiwwLDEzMiwwLDAsOTAsNiwwLDEwMCw3LDAsCi0gICAgMTAwLDgsMCwxMzIsMCwwLDkwLDcsMCwxMDAsOSwwLDEwMCwxMCwwLDEzMiwKLSAgICAwLDAsOTAsOCwwLDEwMCwxMSwwLDEwMCwxMiwwLDEzMiwwLDAsOTAsOSwKLSAgICAwLDEwMCwxMywwLDEwMCwxNCwwLDEzMiwwLDAsOTAsMTAsMCwxMDAsMTUsMCwKLSAgICAxMDAsMTYsMCwxMzIsMCwwLDkwLDExLDAsMTAwLDE3LDAsODMsNDEsMTgsMjE4LAotICAgIDE2LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDk5LDQsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDQsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDI1LDAsMCwwLDExNiwwLDAsMTI0LDEsCi0gICAgMCwxMjQsMiwwLDEyNCwzLDAsMTMxLDMsMCwxMjQsMCwwLDk1LDEsMCwKLSAgICAxMDAsMCwwLDgzLDQxLDEsNzgsNDEsMiwxMTQsMjMxLDAsMCwwLDExNCwyMzMsCi0gICAgMCwwLDAsNDEsNCwxMTQsMTEwLDAsMCwwLDExNCwxMDgsMCwwLDAsMTE0LAotICAgIDM3LDAsMCwwLDExNCwyMzcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4NiwwLDAsMCwyMzUsMywwLAotICAgIDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNSw5NSw3OCw5NywxMDksMTAxLDExNSwKLSAgICAxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwKLSAgICAxMTYsOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCi0gICAgMiwwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTAwLDEsMCwKLSAgICAxMDYsMCwwLDEyNCwxLDAsMTA2LDEsMCwxMzEsMSwwLDgzLDQxLDIsMTIyLAotICAgIDExNSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNCwxMDEsMTEyLDExNCwzMiwxMDIsMTExLDExNCwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLAotICAgIDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwKLSAgICAzMiw4NCwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOSw5Nyw5OSwxMDQsCi0gICAgMTA1LDExMCwxMDEsMTE0LDEyMSwzMiwxMDAsMTExLDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA2LAotICAgIDExMSw5OCwzMiwxMDUsMTE2LDExNSwxMDEsMTA4LDEwMiw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwxMjIsMjUsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLAotICAgIDExNCwxMjUsMzIsNDAsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNDEsNjIsNDEsCi0gICAgMiwxMTQsNDksMCwwLDAsMTE0LDExNCwwLDAsMCw0MSwyLDExNCwxNzIsMCwKLSAgICAwLDAsMTE0LDE5MSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNiwwLDAsMCwyMTgsMTEsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE0LAotICAgIDEwMSwxMTIsMTE0LDIzOCwzLDAsMCwxMTUsMiwwLDAsMCwwLDcsMTIyLDI4LAotICAgIDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LAotICAgIDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCw5OSwyLDAsMCwKLSAgICAwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSw0LDAsMCwwLDEwMCwxLDAsODMsNDEsMiw3OCw4NCwxMTQsNCwKLSAgICAwLDAsMCw0MSwyLDExNCwxMTAsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTYxLAotICAgIDAsMCwwLDI0NywzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI3LAotICAgIDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LAotICAgIDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk5LDIsMCwwLDAsCi0gICAgMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwyLDc4LDExNCwzMiwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMTAsMCwwLDAsMTE0LDEyOCwwLAorICAgIDAsMTE0LDYsMCwwLDAsMTE0LDIyMSwwLDAsMCwxMjksMywwLDAsMTE1LAorICAgIDIwLDAsMCwwLDgsNiw0LDIsOCw0LDgsNCw4LDMsOCw4LAorICAgIDgsNiw4LDYsOCw0LDgsNCwxMTQsMjIxLDAsMCwwLDk5LDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwKKyAgICAwLDAsMTE1LDk2LDAsMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsCisgICAgMSw5MCwzLDEwMCwyLDEwMCwzLDEzMiwwLDkwLDQsMTAwLDQsMTAwLDUsMTMyLAorICAgIDAsOTAsNSwxMDAsNiwxMDAsNywxMzIsMCw5MCw2LDEwMCw4LDEwMCw5LDEzMiwKKyAgICAwLDkwLDcsMTAwLDEwLDEwMCwxMSwxMzIsMCw5MCw4LDEwMCwxMiwxMDAsMTMsMTMyLAorICAgIDAsOTAsOSwxMDAsMTQsMTAwLDE1LDEzMiwwLDkwLDEwLDEwMCwxNiwxMDAsMTcsMTMyLAorICAgIDAsOTAsMTEsMTAwLDE4LDEwMCwxOSwxMzIsMCw5MCwxMiwxMDAsMjAsMTAwLDIxLDEzMiwKKyAgICAwLDkwLDEzLDEwMCwyMiw4MywwLDQxLDIzLDIxOCwxNCw5NSw3OCw5NywxMDksMTAxLAorICAgIDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsOTcsMzgsMSwwLDAsODIsMTAxLAorICAgIDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiwxMTUsMzIsOTcsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LAorICAgIDExMiw5Nyw5OSwxMDEsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDM5LDExNSwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCw0NiwzMiwzMiw3MywxMTYsMzIsMTE3LDExNSwxMDEsMTE1LDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDEwLDMyLDMyLAorICAgIDMyLDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDEwNSwxMTYsMTE1LDMyLDExMiw5NywKKyAgICAxMTQsMTAxLDExMCwxMTYsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsOTcsMTEwLDEwMCwKKyAgICAzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE2LDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsMTE2LDMyLDEwOCwKKyAgICAxMTEsMTExLDEwNywxMTUsMzIsMTE3LDExMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE0LDEwMSwKKyAgICAxMTAsMTE2LDM5LDExNSwxMCwzMiwzMiwzMiwzMiw5NSw5NSwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICA5NSw0NiwzMiwzMiw4NywxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsOTksMTA0LAorICAgIDk3LDExMCwxMDMsMTAxLDExNSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwzOSwxMTUsMzIsMTExLDExOSwxMTAsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiwKKyAgICAxMTQsMTAxLDk5LDExMSwxMDksMTEyLDExNywxMTYsMTAxLDEwMCw0NCwxMCwzMiwzMiwzMiwzMiwKKyAgICAxMTcsMTE1LDEwNSwxMTAsMTAzLDMyLDExMiw5NywxMTYsMTA0LDk1LDEwMiwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDQ2LDMyLDMyLDcwLDExMSwxMTQsMzIsMTE2LDExMSwxMTIsNDUsMTA4LDEwMSwxMTgsMTAxLAorICAgIDEwOCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAorICAgIDk3LDExNCwxMDEsMTEwLDExNiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTEyLAorICAgIDk3LDExNiwxMDQsMTAsMzIsMzIsMzIsMzIsMTA1LDExNSwzMiwxMTUsMTIxLDExNSw0NiwxMTIsCisgICAgOTcsMTE2LDEwNCw0Niw5OSw0LDAsMCwwLDAsMCwwLDAsNCwwLDAsCisgICAgMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwzNiwwLDAsMCwxMjQsMSwKKyAgICAxMjQsMCw5NSwwLDEyNCwyLDEyNCwwLDk1LDEsMTE2LDIsMTI0LDAsMTA2LDMsCisgICAgMTMxLDAsMTMxLDEsMTI0LDAsOTUsNCwxMjQsMywxMjQsMCw5NSw1LDEwMCwwLAorICAgIDgzLDAsNDEsMSw3OCw0MSw2LDIxOCw1LDk1LDExMCw5NywxMDksMTAxLDIxOCw1LAorICAgIDk1LDExMiw5NywxMTYsMTA0LDExNCw5NywwLDAsMCwyMTgsMTYsOTUsMTAzLDEwMSwxMTYsCisgICAgOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCwyMTgsMTcsOTUsMTA4LAorICAgIDk3LDExNSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCwyMTgsCisgICAgMTIsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDEsNCwxMTQsCisgICAgMTA0LDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LDM3LDAsMCwwLDIxOCwxMSwKKyAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTgyLDAsMCwwLDE4OSwKKyAgICAzLDAsMCwxMTUsOCwwLDAsMCwwLDEsNiwxLDYsMSwxNCwxLAorICAgIDEyMiwyMyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsCisgICAgNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLAorICAgIDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDM4LAorICAgIDAsMCwwLDEyNCwwLDEwNiwwLDEwNiwxLDEwMCwxLDEzMSwxLDkyLDMsMTI1LAorICAgIDEsMTI1LDIsMTI1LDMsMTI0LDIsMTAwLDIsMTA3LDIsMTE0LDMwLDEwMCw2LDgzLAorICAgIDAsMTI0LDEsMTAwLDUsMTAyLDIsODMsMCw0MSw3LDEyMiw2Miw4MiwxMDEsMTE2LAorICAgIDExNywxMTQsMTEwLDExNSwzMiw5NywzMiwxMTYsMTE3LDExMiwxMDgsMTAxLDMyLDExMSwxMDIsMzIsCisgICAgNDAsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw0NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NSwxMTAsCisgICAgOTcsMTA5LDEwMSw0NCwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ1LDExMiw5NywxMTYsMTA0LAorICAgIDQ1LDk3LDExNiwxMTYsMTE0LDQ1LDExMCw5NywxMDksMTAxLDQxLDExNCw2MSwwLDAsMCwKKyAgICAxMTQsMzIsMCwwLDAsMTE0LDgsMCwwLDAsMTE0LDM3LDAsMCwwLDkwLAorICAgIDgsOTUsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsNDEsMiwxMjIsMywxMTUsMTIxLDExNSwKKyAgICAxMjIsNCwxMTIsOTcsMTE2LDEwNCw0MSwyLDExNCwyMjgsMCwwLDAsMTE0LDM0LDAsCisgICAgMCwwLDQxLDQsMTE0LDEwNCwwLDAsMCwxMTQsMjE5LDAsMCwwLDIxOCwzLAorICAgIDEwMCwxMTEsMTE2LDkwLDIsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwyMTgsMjMsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExMiw5NywKKyAgICAxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDE5NSwKKyAgICAzLDAsMCwxMTUsOCwwLDAsMCwwLDIsMTgsMSw4LDIsNCwzLAorICAgIDEyMiwzOCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsCisgICAgNDYsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LAorICAgIDExNiwxMDQsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDk5LDEsMCwwLDAsMCwwLDAsCisgICAgMCwzLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDI4LDAsCisgICAgMCwwLDEyNCwwLDEwNiwwLDEzMSwwLDkyLDIsMTI1LDEsMTI1LDIsMTE2LDEsCisgICAgMTE2LDIsMTA2LDMsMTI0LDEsMjUsMCwxMjQsMiwxMzEsMiw4MywwLDQxLDEsCisgICAgNzgsNDEsNCwxMTQsMjM1LDAsMCwwLDExNCwxMTQsMCwwLDAsMTE0LDgsMCwKKyAgICAwLDAsMjE4LDcsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQxLDMsMTE0LDEwNCwwLAorICAgIDAsMCw5MCwxOCwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDk1LDExMCw5NywxMDksMTAxLDkwLDE0LDExMiw5NywxMTYsMTA0LDk1LDk3LDExNiwxMTYsCisgICAgMTE0LDk1LDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw2LDAsMCwwLDExNCwyMzAsMCwwLDAsMjA1LDMsMCwwLDExNSw0LAorICAgIDAsMCwwLDAsMSwxMiwxLDEyMiwzMSw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsCisgICAgOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsMTAzLDEwMSwxMTYsOTUsMTEyLDk3LDExNCwKKyAgICAxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCw5OSwxLDAsMCwwLDAsMCwwLAorICAgIDAsMywwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw4MCwwLAorICAgIDAsMCwxMTYsMCwxMjQsMCwxMDYsMSwxMzEsMCwxMzEsMSwxMjUsMSwxMjQsMSwKKyAgICAxMjQsMCwxMDYsMiwxMDcsMywxMTQsNzQsMTI0LDAsMTA2LDMsMTI0LDAsMTA2LDQsCisgICAgMTI0LDEsMTMxLDIsMTI1LDIsMTI0LDIsMTAwLDAsMTA3LDksMTE0LDY4LDEyNCwyLAorICAgIDEwNiw1LDEwMCwwLDEwNyw4LDExNCw2OCwxMjQsMiwxMDYsNiwxMTQsNjgsMTI0LDIsCisgICAgMTA2LDYsMTI0LDAsOTUsNywxMjQsMSwxMjQsMCw5NSwyLDEyNCwwLDEwNiw3LAorICAgIDgzLDAsNDEsMSw3OCw0MSw4LDExNCw5NywwLDAsMCwxMTQsMjMwLDAsMCwKKyAgICAwLDExNCwyMzEsMCwwLDAsMTE0LDIzMiwwLDAsMCwxMTQsMjI4LDAsMCwwLAorICAgIDExNCwxMjQsMCwwLDAsMTE0LDE1NCwwLDAsMCwxMTQsMjI5LDAsMCwwLDQxLAorICAgIDMsMTE0LDEwNCwwLDAsMCw5MCwxMSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiwKKyAgICA5NywxMTYsMTA0LDExNCwxNjIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDYsMCwwLDAsMjE4LDEyLDk1LDExNCwxMDEsOTksOTcsMTA4LDk5LAorICAgIDExNywxMDgsOTcsMTE2LDEwMSwyMDksMywwLDAsMTE1LDE2LDAsMCwwLDAsMiwKKyAgICAxMiwxLDEwLDEsMTQsMywxOCwxLDYsMSw4LDEsNiwxLDEyMiwyNywKKyAgICA5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsCisgICAgMTE0LDEwMSw5OSw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDk5LDEsMCwwLDAsCisgICAgMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsCisgICAgMTE1LDEyLDAsMCwwLDExNiwwLDEyNCwwLDEwNiwxLDEzMSwwLDEzMSwxLDgzLAorICAgIDAsNDEsMSw3OCw0MSwyLDIxOCw0LDEwNSwxMTYsMTAxLDExNCwxMTQsMjM3LDAsMCwKKyAgICAwLDQxLDEsMTE0LDEwNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNiwwLDAsMCwyMTgsOCw5NSw5NSwxMDUsMTE2LDEwMSwxMTQsOTUsCisgICAgOTUsMjIyLDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjMsOTUsNzgsCisgICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDk1LDEwNSwKKyAgICAxMTYsMTAxLDExNCw5NSw5NSw5OSwzLDAsMCwwLDAsMCwwLDAsMywwLAorICAgIDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxNCwwLDAsMCwxMjQsCisgICAgMiwxMjQsMCwxMDYsMCwxMjQsMSw2MCwwLDEwMCwwLDgzLDAsNDEsMSw3OCwKKyAgICA0MSwxLDExNCwyMjksMCwwLDAsNDEsMywxMTQsMTA0LDAsMCwwLDIxOCw1LAorICAgIDEwNSwxMTAsMTAwLDEwMSwxMjAsMTE0LDM3LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMSw5NSw5NSwxMTUsMTAxLDExNiwKKyAgICAxMDUsMTE2LDEwMSwxMDksOTUsOTUsMjI1LDMsMCwwLDExNSwyLDAsMCwwLDAsCisgICAgMSwxMjIsMjYsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsCisgICAgMTA0LDQ2LDk1LDk1LDExNSwxMDEsMTE2LDEwNSwxMTYsMTAxLDEwOSw5NSw5NSw5OSwxLDAsCisgICAgMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwxMiwwLDAsMCwxMTYsMCwxMjQsMCwxMDYsMSwxMzEsMCwxMzEsCisgICAgMSw4MywwLDQxLDEsNzgsNDEsMiwxMTQsMzMsMCwwLDAsMTE0LDIzNywwLAorICAgIDAsMCw0MSwxLDExNCwxMDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDcsOTUsOTUsMTA4LDEwMSwxMTAsOTUsCisgICAgOTUsMjI4LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjIsOTUsNzgsCisgICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDk1LDEwOCwKKyAgICAxMDEsMTEwLDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwKKyAgICAwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEyLDAsMCwwLDEwMCwxLAorICAgIDEwNiwwLDEyNCwwLDEwNiwxLDEzMSwxLDgzLDAsNDEsMiw3OCwxMjIsMjAsOTUsCisgICAgNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQwLDEyMywzMywKKyAgICAxMTQsMTI1LDQxLDQxLDIsMTE0LDUwLDAsMCwwLDExNCwyMjksMCwwLDAsNDEsCisgICAgMSwxMTQsMTA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw2LDAsMCwwLDIxOCw4LDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSwyMzEsCisgICAgMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyMyw5NSw3OCw5NywxMDksCisgICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsMTE0LDEwMSwxMTIsCisgICAgMTE0LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAorICAgIDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEyLDAsMCwwLDEyNCwxLDEyNCwKKyAgICAwLDEwNiwwLDEzMSwwLDEwNyw2LDgzLDAsNDEsMSw3OCw0MSwxLDExNCwyMzcsCisgICAgMCwwLDAsNDEsMiwxMTQsMTA0LDAsMCwwLDIxOCw0LDEwNSwxMTYsMTAxLDEwOSwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsCisgICAgMTIsOTUsOTUsOTksMTExLDExMCwxMTYsOTcsMTA1LDExMCwxMTUsOTUsOTUsMjM0LDMsMCwKKyAgICAwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjcsOTUsNzgsOTcsMTA5LDEwMSwxMTUsCisgICAgMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDk1LDk5LDExMSwxMTAsMTE2LDk3LAorICAgIDEwNSwxMTAsMTE1LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDEyNCwKKyAgICAwLDEwNiwwLDEwNiwxLDEyNCwxLDEzMSwxLDEsMCwxMDAsMCw4MywwLDQxLAorICAgIDEsNzgsNDEsMiwxMTQsMjI5LDAsMCwwLDExNCwxNjEsMCwwLDAsNDEsMiwKKyAgICAxMTQsMTA0LDAsMCwwLDExNCwyNDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE2MSwwLDAsMCwyMzcsMywKKyAgICAwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyMSw5NSw3OCw5NywxMDksMTAxLAorICAgIDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTcsMTEyLDExMiwxMDEsMTEwLDEwMCwKKyAgICA3OCw0MSwxNCwxMTQsMTA5LDAsMCwwLDExNCwxMDgsMCwwLDAsMTE0LDExMCwwLAorICAgIDAsMCwxMTQsMTExLDAsMCwwLDExNCwxODIsMCwwLDAsMTE0LDIzNSwwLDAsCisgICAgMCwxMTQsMjMwLDAsMCwwLDExNCwyMzcsMCwwLDAsMTE0LDIzOSwwLDAsMCwKKyAgICAxMTQsMjQxLDAsMCwwLDExNCwyNDIsMCwwLDAsMTE0LDI0MywwLDAsMCwxMTQsCisgICAgMjQ1LDAsMCwwLDExNCwxNjEsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDIyNywwLAorICAgIDAsMCwxODIsMywwLDAsMTE1LDIyLDAsMCwwLDgsNSw0LDIsOCwKKyAgICA2LDgsMTAsOCw0LDgsMTMsOCwzLDgsMyw4LDMsOCwzLDgsCisgICAgMywxMTQsMjI3LDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDMsMCwwLDAsNjQsMCwwLDAsMTE1LDgwLDAsMCwwLAorICAgIDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSwxMDAsMiwxMzIsMCw5MCwzLAorICAgIDEwMSw0LDEwMCwzLDEwMCw0LDEzMiwwLDEzMSwxLDkwLDUsMTAwLDUsMTAwLDYsCisgICAgMTMyLDAsOTAsNiwxMDAsNywxMDAsOCwxMzIsMCw5MCw3LDEwMCw5LDEwMCwxMCwKKyAgICAxMzIsMCw5MCw4LDEwMCwxMSwxMDAsMTIsMTMyLDAsOTAsOSwxMDAsMTMsMTAwLDE0LAorICAgIDEzMiwwLDkwLDEwLDEwMCwxNSwxMDAsMTYsMTMyLDAsOTAsMTEsMTAwLDE3LDgzLDAsCisgICAgNDEsMTgsMjE4LDE2LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDk5LDQsMCwwLDAsMCwwLDAsMCw0LDAsMCwKKyAgICAwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDE4LDAsMCwwLDExNiwwLAorICAgIDEyNCwxLDEyNCwyLDEyNCwzLDEzMSwzLDEyNCwwLDk1LDEsMTAwLDAsODMsMCwKKyAgICA0MSwxLDc4LDQxLDIsMTE0LDIyNywwLDAsMCwxMTQsMjI5LDAsMCwwLDQxLAorICAgIDQsMTE0LDEwNCwwLDAsMCwxMTQsMTAyLDAsMCwwLDExNCwzNywwLDAsMCwKKyAgICAxMTQsMjMzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA2LDAsMCwwLDExNCwxODIsMCwwLDAsMjQzLDMsMCwwLDExNSwyLDAsCisgICAgMCwwLDAsMSwxMjIsMjUsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDEyLDAsMCwwLDEwMCwxLDEwNiwwLDEyNCwxLDEwNiwKKyAgICAxLDEzMSwxLDgzLDAsNDEsMiwxMjIsMTE1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsCisgICAgMTE0LDEwMSwxMTIsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwKKyAgICAxMDEsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsCisgICAgMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsCisgICAgMTExLDExNCwxMTYsMzIsMTA5LDk3LDk5LDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLDMyLDEwMCwxMTEsCisgICAgMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDYsMTExLDk4LDMyLDEwNSwxMTYsMTE1LDEwMSwxMDgsCisgICAgMTAyLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyMiwyNSw2MCwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCwxMTAsOTcsMTA5LDEwMSwKKyAgICAxMTUsMTEyLDk3LDk5LDEwMSw0MSw2Miw0MSwyLDExNCw1MCwwLDAsMCwxMTQsMTA5LAorICAgIDAsMCwwLDQxLDIsMTE0LDE2OCwwLDAsMCwxMTQsMTg3LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsMjQ2LDMsMCwwLDExNSwKKyAgICAyLDAsMCwwLDAsNywxMjIsMjgsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LAorICAgIDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsCisgICAgMTE0LDEwMSwxMTIsMTE0LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsCisgICAgODMsMCw0MSwyLDc4LDg0LDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwNCwwLAorICAgIDAsMCwxMTQsMTIzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw2LDAsMCwwLDExNCwxNTcsMCwwLDAsMjU1LDMsMCwwLDExNSwKKyAgICAyLDAsMCwwLDAsMSwxMjIsMjcsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LAorICAgIDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LAorICAgIDk3LDEwMywxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSw4MywKKyAgICAwLDQxLDIsNzgsMTE0LDMyLDAsMCwwLDExNCw0LDAsMCwwLDQxLDIsCisgICAgMTE0LDEwNCwwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxOTksMCwwLDAsMiw0LAorICAgIDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI3LDk1LDc4LDk3LDEwOSwxMDEsCisgICAgMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LAorICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsCisgICAgMCwwLDAsNiwwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsCisgICAgMTE2LDAsMTAwLDEsMTAwLDIsMTAwLDMsMTAwLDQsMTAwLDUsMTQxLDQsODMsMCwKKyAgICA0MSw2LDc4LDExNCwzMiwwLDAsMCwxMjIsOCw2MCwxMTUsMTE2LDExNCwxMDUsMTEwLAorICAgIDEwMyw2MiwxMTQsMTg2LDAsMCwwLDg0LDQxLDEsMTE0LDIwMSwwLDAsMCw0MSwKKyAgICAxLDExNCwyMDIsMCwwLDAsNDEsMiwxMTQsMTA0LDAsMCwwLDExNCwxMjMsMCwKICAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLAotICAgIDAsMTE0LDIwMywwLDAsMCwyNTAsMywwLDAsMTE1LDIsMCwwLDAsMCwKLSAgICAxLDEyMiwyNyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywKLSAgICAxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk5LDIsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDYsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDIyLDAsMCwwLDExNiwwLDAsMTAwLDEsMCwxMDAsMiwKLSAgICAwLDEwMCwzLDAsMTAwLDQsMCwxMDAsNSwwLDEzMSwzLDEsODMsNDEsNiwKLSAgICA3OCwxMTQsMzIsMCwwLDAsMTIyLDgsNjAsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNjIsCi0gICAgMTE0LDE5MCwwLDAsMCwxMTQsMjA1LDAsMCwwLDg0LDQxLDEsMTE0LDIwNiwwLAotICAgIDAsMCw0MSwyLDExNCwxMTAsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTg4LDAsCi0gICAgMCwwLDI1MywzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI1LDk1LAorICAgIDAsMTE0LDE4NCwwLDAsMCw1LDQsMCwwLDExNSwyLDAsMCwwLDAsCisgICAgMSwxMjIsMjUsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsNCwwLDAsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDQyLDg1LDExNSwKKyAgICAxMDEsMzIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsMzIsMTE1LDEwMSwxMDksOTcsMTEwLDExNiwKKyAgICAxMDUsOTksMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LAorICAgIDExNCwxMDEsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsCisgICAgMTE0LDEwNCwwLDAsMCwxMTQsMTYyLDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxODMsMCwwLDAsOCw0LAorICAgIDAsMCwxMTUsMCwwLDAsMCwxMjIsMzAsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLAorICAgIDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLAorICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwKKyAgICAyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLAorICAgIDAsMTAwLDAsODMsMCw0MSwxLDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LAorICAgIDEwNCwwLDAsMCwxMTQsMTg3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw2LDAsMCwwLDExNCwxODgsMCwwLDAsMTEsNCwwLAorICAgIDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyOCw5NSw3OCw5NywxMDksMTAxLDExNSwKKyAgICAxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyNiwwLDAsMCwKKyAgICAxMTYsMCwxMDYsMSwxMDAsMSwxMjQsMCwxMDYsMiwxMzEsMiwxLDAsMTE2LDAsCisgICAgMTA2LDMsMTI0LDAsMTI0LDEsMTMxLDIsODMsMCw0MSwyLDEyMiw5OCw3NiwxMTEsCisgICAgOTcsMTAwLDMyLDk3LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDMyLDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLAorICAgIDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLAorICAgIDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLDEwNSwxMTAsCisgICAgMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDEyMiwzOCwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCwzMiwxMjMsMzMsMTE0LDEyNSw0MSw0LDExNCwxMTgsMCwwLDAsMTE0LAorICAgIDEzMywwLDAsMCwxMTQsMjI5LDAsMCwwLDExNCwxODksMCwwLDAsNDEsMiwKKyAgICAxMTQsMTA0LDAsMCwwLDExNCwxMjMsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE5MCwwLDAsMCwxNCw0LAorICAgIDAsMCwxMTUsNiwwLDAsMCwwLDcsNiwxLDgsMSwxMjIsMjgsOTUsCiAgICAgNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsMCwKLSAgICAwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLAotICAgIDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDQyLDg1LDExNSwxMDEsMzIsMTAwLDEwMSwKLSAgICAxMDIsOTcsMTE3LDEwOCwxMTYsMzIsMTE1LDEwMSwxMDksOTcsMTEwLDExNiwxMDUsOTksMTE1LDMyLAotICAgIDEwMiwxMTEsMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExNCwxMDEsOTcsMTE2LAotICAgIDEwNSwxMTEsMTEwLDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsCi0gICAgMCwxMTQsMTY2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw2LDAsMCwwLDExNCwxODcsMCwwLDAsMCw0LDAsMCwxMTUsMCwKLSAgICAwLDAsMCwxMjIsMzAsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAotICAgIDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDAsMCwKLSAgICA4Myw0MSwxLDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsMCwKLSAgICAxMTQsMTkxLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA2LDAsMCwwLDExNCwxOTIsMCwwLDAsMyw0LDAsMCwxMTUsMiwwLAotICAgIDAsMCwwLDEsMTIyLDI4LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsCi0gICAgNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDMyLDAsMCwwLDExNiwwLDAsMTAwLAotICAgIDEsMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDIsMCwxLDExNiwyLDAsMTA2LAotICAgIDMsMCwxMjQsMCwwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwyLDEyMiw5OCwKLSAgICA3NiwxMTEsOTcsMTAwLDMyLDk3LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLAotICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsCi0gICAgMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsCi0gICAgMTAxLDMyLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLAotICAgIDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDEyMiwzOCwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwKLSAgICAzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMjMsMzMsMTE0LDEyNSw0MSw0LDExNCwxMDcsMCwwLAotICAgIDAsMTE0LDIzMywwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCwxOTMsMCwwLDAsCi0gICAgNDEsMiwxMTQsMTEwLDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE5NCwwLDAsMCwKLSAgICA2LDQsMCwwLDExNSw0LDAsMCwwLDAsNywxNiwxLDEyMiwyOCw5NSwKLSAgICA3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwKLSAgICAxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw3OCw0MSwxMiwxMTQsMTE0LAotICAgIDAsMCwwLDExNCwxMTMsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTg2LDAsCi0gICAgMCwwLDExNCwxODQsMCwwLDAsMTE0LDI0OSwwLDAsMCwxMTQsMTYxLDAsMCwKLSAgICAwLDExNCwyMDMsMCwwLDAsMTE0LDE4OCwwLDAsMCwxMTQsMTg3LDAsMCwwLAotICAgIDExNCwxOTIsMCwwLDAsMTE0LDE5NCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjQ4LAotICAgIDAsMCwwLDIzNCwzLDAsMCwxMTUsMTYsMCwwLDAsMTIsMSwxMiwzLAotICAgIDE4LDksMTIsMywxMiwzLDEyLDMsMTIsMywxMiwzLDExNCwyNDgsMCwwLAotICAgIDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNSwwLAotICAgIDAsMCw2NCwwLDAsMCwxMTUsMTYwLDAsMCwwLDEwMSwwLDAsOTAsMSwKLSAgICAwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMSw0LDAsCi0gICAgMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsMTMxLDEsMCw5MCw1LDAsMTAxLAotICAgIDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDYsCi0gICAgMCwxMDEsNCwwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDEzMSwxLDAsCi0gICAgOTAsNywwLDEwMSw0LDAsMTAwLDgsMCwxMDAsOSwwLDEzMiwwLDAsMTMxLAotICAgIDEsMCw5MCw4LDAsMTAxLDQsMCwxMDAsMTAsMCwxMDAsMTEsMCwxMDAsMTIsCi0gICAgMCwxMzIsMSwwLDEzMSwxLDAsOTAsOSwwLDEwMSw0LDAsMTAwLDEwLDAsCi0gICAgMTAwLDEwLDAsMTAwLDEzLDAsMTAwLDE0LDAsMTMyLDIsMCwxMzEsMSwwLDkwLAotICAgIDEwLDAsMTAxLDQsMCwxMDAsMTAsMCwxMDAsMTUsMCwxMDAsMTYsMCwxMzIsMSwKLSAgICAwLDEzMSwxLDAsOTAsMTEsMCwxMDAsMTAsMCw4Myw0MSwxNywyMTgsMTAsODAsCi0gICAgOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiw2Miw3NywxMDEsMTE2LDk3LDMyLAotICAgIDExMiw5NywxMTYsMTA0LDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDMyLDk3LDExMCwxMDAsMzIsMTEyLDk3LDk5LAotICAgIDEwNyw5NywxMDMsMTAxLDMyLDk1LDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDMyLDk3LDExNiwKLSAgICAxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSwxMTUsNDYsOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDIsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsNTUsCi0gICAgMCwwLDAsMTIwLDQ4LDAsMTE2LDAsMCwxMDYsMSwwLDEwNiwyLDAsMTMxLAotICAgIDAsMCw2OCw5MywzMSwwLDEyNSwxLDAsMTE2LDMsMCwxMjQsMSwwLDEwMCwKLSAgICAxLDAsMTMxLDIsMCwxMTQsMTYsMCwxMjQsMSwwLDEwNiw0LDAsMTMxLDAsCi0gICAgMCwxLDExMywxNiwwLDg3LDEwMCwyLDAsODMsNDEsMywxMjIsMTI1LDY3LDk3LAotICAgIDEwOCwxMDgsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LAotICAgIDEwMSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNSw0MCw0MSwzMiwxMDksMTAxLDExNiwxMDQsMTExLAotICAgIDEwMCwzMiwxMTEsMTEwLDMyLDk3LDEwOCwxMDgsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwKLSAgICAxMTYsMTE0LDEyMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTUsMTAsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMTE1LDExNiwxMTEsMTE0LDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTUsMTIxLAotICAgIDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LAotICAgIDk5LDk3LDk5LDEwNCwxMDEsMTE1LDMyLDQwLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDEwOSwKLSAgICAxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw0MSw0NiwyMTgsMTcsMTA1LDExMCwxMTgsCi0gICAgOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNSw3OCw0MSwKLSAgICA1LDExNCw4LDAsMCwwLDIxOCwxOSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsMjE4LDYsMTE4LDk3LDEwOCwKLSAgICAxMTcsMTAxLDExNSwxMTQsMTE3LDAsMCwwLDExNCwyNTEsMCwwLDAsNDEsMiwxMTQsCi0gICAgMTcyLDAsMCwwLDIxOCw2LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyNTEsMCwwLDAsCi0gICAgMjMsNCwwLDAsMTE1LDYsMCwwLDAsMCw0LDIyLDEsMTUsMSwxMjIsCi0gICAgMjgsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTAsMTE4LDk3LAotICAgIDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsOTksMiwwLAotICAgIDAsMCwwLDAsMCwwLDMsMCwwLDAsMTIsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDEwNywwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTAwLDEsMCwKLSAgICAxMDcsOSwwLDExNCw0MSwwLDExNiwwLDAsMTA2LDEsMCwxMiwxMTQsNDEsMCwKLSAgICAxMTYsMiwwLDEwNiwzLDAsMTAwLDIsMCwxMTYsNCwwLDEzMSwyLDAsMSwKLSAgICAxMjAsNTksMCwxMTYsMCwwLDEwNiwxLDAsNjgsOTMsNDQsMCwxMjUsMiwwLAotICAgIDEyMSwxNCwwLDEyNCwyLDAsMTI0LDEsMCwxMzEsMSwwLDgzLDg3LDExMyw1MSwKLSAgICAwLDQsMTE2LDUsMCwxMDcsMTAsMCwxMTQsOTQsMCwxLDEsMSwxMTksNTEsCi0gICAgMCw4OSwxMTMsNTEsMCw4OCwxMTMsNTEsMCw4NywxMDAsMSwwLDgzLDEwMCwxLAotICAgIDAsODMsNDEsMywxMjIsMTEzLDgzLDEwMSw5NywxMTQsOTksMTA0LDMyLDExNSwxMDEsMTEzLAotICAgIDExNywxMDEsMTEwLDk5LDEwMSwzMiwxMTEsMTAyLDMyLDEwNCwxMTEsMTExLDEwNywxMTUsMzIsMTAyLAotICAgIDExMSwxMTQsMzIsOTcsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsCi0gICAgMzksMTEyLDk3LDExNiwxMDQsMzksNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsNzMsMTAyLDMyLDM5LDEwNCwxMTEsMTExLDEwNywxMTUsMzksMzIsMTA1LDExNSwzMiwxMDIsCi0gICAgOTcsMTA4LDExNSwxMDEsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDExNywxMTUsMTAxLDMyLDExNSwxMjEsCi0gICAgMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsMTIyLDIzLDExNSwxMjEsMTE1LDQ2LDExMiw5NywKLSAgICAxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMzIsMTA1LDExNSwzMiwxMDEsMTA5LDExMiwxMTYsCi0gICAgMTIxLDQxLDYsMTE0LDgsMCwwLDAsMjE4LDEwLDExMiw5NywxMTYsMTA0LDk1LDEwNCwKLSAgICAxMTEsMTExLDEwNywxMTUsMTE0LDYyLDAsMCwwLDExNCw2MywwLDAsMCwxMTQsMTI3LAotICAgIDAsMCwwLDExNCwxMDksMCwwLDAsNDEsMywxMTQsMTcyLDAsMCwwLDExNCwKLSAgICAzNywwLDAsMCw5MCw0LDEwNCwxMTEsMTExLDEwNywxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsCi0gICAgOTUsMTA0LDExMSwxMTEsMTA3LDExNSwzMSw0LDAsMCwxMTUsMTYsMCwwLDAsMCwKLSAgICA3LDI1LDEsMTYsMSwxNiwxLDMsMSwxNCwxLDEzLDEsMTIsMiwxMjIsCi0gICAgMjIsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDExMiw5NywxMTYsCi0gICAgMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsOTksMiwwLDAsMCwwLDAsMCwwLAotICAgIDMsMCwwLDAsMTksMCwwLDAsNjcsMCwwLDAsMTE1LDEyMywwLDAsCi0gICAgMCwxMjQsMSwwLDEwMCwxLDAsMTA3LDIsMCwxMTQsNTMsMCwxMjEsMTYsMCwKLSAgICAxMTYsMCwwLDEwNiwxLDAsMTMxLDAsMCwxMjUsMSwwLDg3LDExMCwyMiwwLAotICAgIDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsNTIsMCwxLDEsMSwxMDAsMiwwLAotICAgIDgzLDg5LDExMCwxLDAsODgsMTIxLDE3LDAsMTE2LDMsMCwxMDYsNCwwLDEyNCwKLSAgICAxLDAsMjUsMTI1LDIsMCw4NywxMTAsNDYsMCw0LDExNiw1LDAsMTA3LDEwLAotICAgIDAsMTE0LDExOCwwLDEsMSwxLDEyNCwwLDAsMTA2LDYsMCwxMjQsMSwwLAotICAgIDEzMSwxLDAsMTI1LDIsMCwxMjQsMiwwLDExNiwzLDAsMTA2LDQsMCwxMjQsCi0gICAgMSwwLDYwLDg5LDExMCwxLDAsODgsMTI0LDIsMCw4Myw0MSwzLDEyMiwyMTAsCisgICAgMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNzgsNDEsMTIsMTE0LDEwOSwKKyAgICAwLDAsMCwxMTQsMTA4LDAsMCwwLDExNCwxMTAsMCwwLDAsMTE0LDE4MiwwLAorICAgIDAsMCwxMTQsMTgwLDAsMCwwLDExNCwyNDcsMCwwLDAsMTE0LDE1NywwLDAsCisgICAgMCwxMTQsMTk5LDAsMCwwLDExNCwxODQsMCwwLDAsMTE0LDE4MywwLDAsMCwKKyAgICAxMTQsMTg4LDAsMCwwLDExNCwxOTAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDI0NiwKKyAgICAwLDAsMCwyNDIsMywwLDAsMTE1LDE2LDAsMCwwLDgsMSw4LDMsCisgICAgMTIsOSw4LDMsOCwzLDgsMyw4LDMsOCwzLDExNCwyNDYsMCwwLAorICAgIDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCwwLAorICAgIDAsMCw2NCwwLDAsMCwxMTUsMTA2LDAsMCwwLDEwMSwwLDkwLDEsMTAwLAorICAgIDAsOTAsMiwxMDAsMSw5MCwzLDEwMSw0LDEwMCwyLDEwMCwzLDEzMiwwLDEzMSwKKyAgICAxLDkwLDUsMTAxLDQsMTAwLDQsMTAwLDUsMTMyLDAsMTMxLDEsOTAsNiwxMDEsCisgICAgNCwxMDAsNiwxMDAsNywxMzIsMCwxMzEsMSw5MCw3LDEwMSw0LDEwMCw4LDEwMCwKKyAgICA5LDEzMiwwLDEzMSwxLDkwLDgsMTAxLDQsMTAwLDE3LDEwMCwxMSwxMDAsMTIsMTMyLAorICAgIDEsMTMxLDEsOTAsOSwxMDEsNCwxMDAsMTgsMTAwLDEzLDEwMCwxNCwxMzIsMSwxMzEsCisgICAgMSw5MCwxMCwxMDEsNCwxMDAsMTksMTAwLDE1LDEwMCwxNiwxMzIsMSwxMzEsMSw5MCwKKyAgICAxMSwxMDAsMTAsODMsMCw0MSwyMCwyMTgsMTAsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLAorICAgIDEwMCwxMDEsMTE0LDEyMiw2Miw3NywxMDEsMTE2LDk3LDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMiwKKyAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywKKyAgICAxMTYsMTA0LDMyLDk3LDExMCwxMDAsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDk1LAorICAgIDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LAorICAgIDEwMSwxMTUsNDYsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgNCwwLDAsMCw2NywwLDAsMCwxMTUsNDIsMCwwLDAsMTIwLDM2LDExNiwKKyAgICAwLDEwNiwxLDEwNiwyLDEzMSwwLDY4LDAsOTMsMjIsMTI1LDEsMTE2LDMsMTI0LAorICAgIDEsMTAwLDEsMTMxLDIsMTE0LDEyLDEyNCwxLDEwNiw0LDEzMSwwLDEsMCwxMTMsCisgICAgMTIsODcsMCwxMDAsMiw4MywwLDQxLDMsMTIyLDEyNSw2Nyw5NywxMDgsMTA4LDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDEwNSwxMTAsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTksCisgICAgOTcsOTksMTA0LDEwMSwxMTUsNDAsNDEsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTExLAorICAgIDExMCwzMiw5NywxMDgsMTA4LDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMSwxMTAsMTE2LDExNCwxMjEsCisgICAgMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDExNSwxMTYsMTExLDExNCwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLAorICAgIDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwKKyAgICAxMDQsMTAxLDExNSwzMiw0MCwxMTksMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsCisgICAgMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNDEsNDYsMjE4LDE3LDEwNSwxMTAsMTE4LDk3LDEwOCwxMDUsCisgICAgMTAwLDk3LDExNiwxMDEsOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsNzgsNDEsNSwxMTQsOCwKKyAgICAwLDAsMCwyMTgsMTksMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsCisgICAgMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDIxOCw2LDExOCw5NywxMDgsMTE3LDEwMSwxMTUsCisgICAgMTE0LDExMiwwLDAsMCwxMTQsMjQ5LDAsMCwwLDQxLDIsMTE0LDE2OCwwLDAsCisgICAgMCwyMTgsNiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjQ5LDAsMCwwLDMyLDQsMCwKKyAgICAwLDExNSw2LDAsMCwwLDAsNCwxNiwxLDEwLDEsMTIyLDI4LDgwLDk3LAorICAgIDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDUsMTEwLDExOCw5NywxMDgsMTA1LDEwMCwKKyAgICA5NywxMTYsMTAxLDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDk5LDIsMCwwLDAsMCwKKyAgICAwLDAsMCwzLDAsMCwwLDEyLDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICA4NiwwLDAsMCwxMTYsMCwxMDYsMSwxMDAsMSwxMDcsOSwxMTQsMzAsMTE2LDAsCisgICAgMTA2LDEsMTIsMCwxMTQsMzAsMTE2LDIsMTA2LDMsMTAwLDIsMTE2LDQsMTMxLDIsCisgICAgMSwwLDEyMCw1MCwxMTYsMCwxMDYsMSw2OCwwLDkzLDM2LDEyNSwyLDEyMSw4LAorICAgIDEyNCwyLDEyNCwxLDEzMSwxLDgzLDAsNCwwLDExNiw1LDEwNywxMCwxMTQsNzIsCisgICAgMSwwLDEsMCwxLDAsMTE5LDM4LDg5LDAsMTEzLDM4LDg4LDAsMTEzLDM4LAorICAgIDg3LDAsMTAwLDEsODMsMCwxMDAsMSw4MywwLDQxLDMsMTIyLDQ2LDgzLDEwMSwKKyAgICA5NywxMTQsOTksMTA0LDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsCisgICAgMTExLDEwNywxMTUsMzIsMTAyLDExMSwxMTQsMzIsOTcsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsCisgICAgMzIsMTAyLDExMSwxMTQsMzIsMzksMTEyLDk3LDExNiwxMDQsMzksNDYsNzgsMTIyLDIzLDExNSwKKyAgICAxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMzIsMTA1LDExNSwKKyAgICAzMiwxMDEsMTA5LDExMiwxMTYsMTIxLDQxLDYsMTE0LDgsMCwwLDAsMjE4LDEwLDExMiwKKyAgICA5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMTE0LDYzLDAsMCwwLDExNCw2NCwKKyAgICAwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCwxMDMsMCwwLDAsNDEsMywxMTQsCisgICAgMTY4LDAsMCwwLDExNCwzNywwLDAsMCw5MCw0LDEwNCwxMTEsMTExLDEwNywxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsCisgICAgOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSw0MCw0LDAsMCwxMTUsCisgICAgMTYsMCwwLDAsMCwzLDE4LDEsMTIsMSwxMiwxLDIsMSw4LDEsCisgICAgMTQsMSwxMiwyLDEyMiwyMiw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsCisgICAgNDYsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSw5OSwyLDAsMCwKKyAgICAwLDAsMCwwLDAsMywwLDAsMCwxOSwwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsMTAyLDAsMCwwLDEyNCwxLDEwMCwxLDEwNywyLDExNCw0MiwxMjEsMTIsCisgICAgMTE2LDAsMTA2LDEsMTMxLDAsMTI1LDEsODcsMCwxMTAsMjAsNCwwLDExNiwyLAorICAgIDEwNywxMCwxMTQsNDAsMSwwLDEsMCwxLDAsMTAwLDIsODMsMCw4OCwwLAorICAgIDEyMSwxNCwxMTYsMywxMDYsNCwxMjQsMSwyNSwwLDEyNSwyLDg3LDAsMTEwLDQwLAorICAgIDQsMCwxMTYsNSwxMDcsMTAsMTE0LDk2LDEsMCwxLDAsMSwwLDEyNCwwLAorICAgIDEwNiw2LDEyNCwxLDEzMSwxLDEyNSwyLDEyNCwyLDExNiwzLDEwNiw0LDEyNCwxLAorICAgIDYwLDAsODksMCwxMTAsMiw4OCwwLDEyNCwyLDgzLDAsNDEsMywxMjIsMjEwLAogICAgIDcxLDEwMSwxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTAyLAogICAgIDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwxMTYsMTE0LAogICAgIDEyMSwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsCkBAIC0xOTk1LDYxMiArMTg2OSw1NzIgQEAKICAgICAxMTQsMTAxLDMyLDc4LDExMSwxMTAsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAogICAgIDMyLDMyLDExNCwzMiwwLDAsMCw3OCw0MSw3LDExNCwzLDAsMCwwLDExNCwKICAgICA0NywwLDAsMCwyMTgsMTcsNzAsMTA1LDEwOCwxMDEsNzgsMTExLDExNiw3MCwxMTEsMTE3LAotICAgIDExMCwxMDAsNjksMTE0LDExNCwxMTEsMTE0LDExNCw4LDAsMCwwLDExNCwyNTIsMCwwLAotICAgIDAsMTE0LDEzOSwwLDAsMCwxMTQsMCwxLDAsMCw0MSwzLDExNCwxNzIsMCwKLSAgICAwLDAsMTE0LDM3LDAsMCwwLDExNCwyNTQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDExMCwxMDAsNjksMTE0LDExNCwxMTEsMTE0LDExNCw4LDAsMCwwLDExNCwyNTAsMCwwLAorICAgIDAsMTE0LDEzNSwwLDAsMCwxMTQsMjU0LDAsMCwwLDQxLDMsMTE0LDE2OCwwLAorICAgIDAsMCwxMTQsMzcsMCwwLDAsMTE0LDI1MiwwLDAsMCwxMTQsNCwwLDAsCiAgICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMjAsOTUsMTEyLDk3LAogICAgIDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsCi0gICAgMTAxLDQ4LDQsMCwwLDExNSwyMiwwLDAsMCwwLDgsMTIsMSwzLDEsCi0gICAgMTYsMSwxMywzLDksMSwzLDEsMTcsMSwxMywxLDE1LDEsMTgsMSwKKyAgICAxMDEsNTMsNCwwLDAsMTE1LDIyLDAsMCwwLDAsOCw4LDEsMiwxLAorICAgIDEyLDEsMTQsMyw2LDEsMiwxLDE0LDEsMTQsMSwxMCwxLDE2LDEsCiAgICAgMTIyLDMxLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMTIsOTcsCiAgICAgMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwKICAgICAxMDEsOTksMywwLDAsMCwwLDAsMCwwLDYsMCwwLDAsMywwLAotICAgIDAsMCw2NywwLDAsMCwxMTUsMTE5LDAsMCwwLDExNiwwLDAsMTI0LDIsCi0gICAgMCwxMDAsMSwwLDEzMSwyLDAsMTE0LDM5LDAsMTI0LDIsMCwxMDYsMSwwLAotICAgIDEyNCwxLDAsMTMxLDEsMCw5MiwyLDAsMTI1LDMsMCwxMjUsNCwwLDExMCwKLSAgICAyMSwwLDEyNCwyLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDMsCi0gICAgMCwxMDMsMCwwLDEyNSw0LDAsMTI0LDMsMCwxMDAsMCwwLDEwNyw5LDAsCi0gICAgMTE0LDg4LDAsMTE2LDMsMCwxMDYsNCwwLDEyNCwxLDAsMTI0LDMsMCwxMzEsCi0gICAgMiwwLDgzLDExNiwzLDAsMTA2LDUsMCwxMjQsMSwwLDEwMCwwLDAsMTMxLAotICAgIDIsMCwxMjUsNSwwLDEyNCw0LDAsMTI0LDUsMCw5NSw2LDAsMTI0LDUsCi0gICAgMCw4Myw0MSwyLDc4LDExNCwxMjYsMCwwLDAsNDEsNywxMTQsMTE3LDAsMCwKLSAgICAwLDExNCwxMjYsMCwwLDAsMTE0LDE4MywwLDAsMCwxMTQsMTIzLDAsMCwwLAotICAgIDExNCwxODAsMCwwLDAsMTE0LDE2MiwwLDAsMCwxMTQsMTU4LDAsMCwwLDQxLAotICAgIDYsMTE0LDE3MiwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCwyNTQsMCwwLDAsCi0gICAgMTE0LDEyOSwwLDAsMCwxMTQsMTMwLDAsMCwwLDExNCwxNjYsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE2LAotICAgIDk1LDEwOCwxMDEsMTAzLDk3LDk5LDEyMSw5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSw5OSwKLSAgICA3MCw0LDAsMCwxMTUsMTgsMCwwLDAsMCw0LDE1LDEsMjQsMiwxNSwKLSAgICAxLDYsMSwxMiwxLDE2LDEsMTgsMSw5LDEsMTIyLDI3LDgwLDk3LDExNiwKLSAgICAxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMDgsMTAxLDEwMyw5Nyw5OSwxMjEsOTUsCi0gICAgMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksNzgsOTksNCwwLDAsMCwwLDAsCi0gICAgMCwwLDksMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsMjQzLAotICAgIDAsMCwwLDEwMywwLDAsMTI1LDQsMCwxMjAsMjMwLDAsMTI0LDIsMCw2OCwKLSAgICA5MywxOTEsMCwxMjUsNSwwLDExNiwwLDAsMTI0LDUsMCwxMTYsMSwwLDExNiwKLSAgICAyLDAsMTAyLDIsMCwxMzEsMiwwLDExNSw0MywwLDExMywxMywwLDEyNCwwLAotICAgIDAsMTA2LDMsMCwxMjQsNSwwLDEzMSwxLDAsMTI1LDYsMCwxMjQsNiwwLAotICAgIDEwMCwxLDAsMTA3LDksMCwxMTQsMTMsMCwxMTYsNCwwLDEyNCw2LDAsMTAwLAotICAgIDIsMCwxMzEsMiwwLDExNCwxMDYsMCwxMjQsNiwwLDEwNiw1LDAsMTI0LDEsCi0gICAgMCwxMjQsMywwLDEzMSwyLDAsMTI1LDcsMCwxMTAsMTgsMCwxMjQsMCwwLAotICAgIDEwNiw2LDAsMTI0LDEsMCwxMjQsNiwwLDEzMSwyLDAsMTI1LDcsMCwxMjQsCi0gICAgNywwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMTM5LDAsMTEzLDEzLDAsMTI0LDcsCi0gICAgMCwxMDYsNywwLDEwMCwxLDAsMTA3LDksMCwxMTQsMTU4LDAsMTI0LDcsMCwKLSAgICA4MywxMjQsNywwLDEwNiw4LDAsMTI1LDgsMCwxMjQsOCwwLDEwMCwxLDAsCi0gICAgMTA3LDgsMCwxMTQsMTkxLDAsMTE2LDksMCwxMDAsMywwLDEzMSwxLDAsMTMwLAotICAgIDEsMCwxMjQsNCwwLDEwNiwxMCwwLDEyNCw4LDAsMTMxLDEsMCwxLDExMywKLSAgICAxMywwLDg3LDExNiwxMSwwLDEwNiwxMiwwLDEyNCwxLDAsMTAwLDEsMCwxMzEsCi0gICAgMiwwLDEyNSw3LDAsMTI0LDQsMCwxMjQsNywwLDk1LDgsMCwxMjQsNywKLSAgICAwLDgzLDEwMCwxLDAsODMsNDEsNCwxMjIsNjMsNzAsMTA1LDExMCwxMDAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTEsMTE0LDMyLDExMCw5NywxMDksCi0gICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDk1LDExMiw5NywxMTYsMTA0LDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NywxMTIsOTcsOTksMTA3LAotICAgIDk3LDEwMywxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNDYsNzgsMTE0LDE4MiwwLDAsMCwxMjIsCi0gICAgMTksMTE1LDExMiwxMDEsOTksMzIsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTAsMTAzLDMyLDEwOCwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsNDEsMTMsMTE0LDE0NSwwLDAsMCwxMTQsNzEsMCwwLDAsCi0gICAgMjE4LDUsOTgsMTIxLDExNiwxMDEsMTE1LDExNCwyLDEsMCwwLDExNCwxMTcsMCwwLAotICAgIDAsMTE0LDE4MiwwLDAsMCwxMTQsMywxLDAsMCwxMTQsMTI5LDAsMCwwLAotICAgIDExNCwxNTgsMCwwLDAsMTE0LDEwOSwwLDAsMCwxMTQsMTUxLDAsMCwwLDExNCwKLSAgICAxMjMsMCwwLDAsMTE0LDE2MiwwLDAsMCw0MSw5LDExNCwxNzIsMCwwLDAsCi0gICAgMTE0LDEyOCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDE4MSwwLDAsMCwyMTgsCi0gICAgMTQsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsOTUsMTEyLDk3LDExNiwxMDQsOTAsCi0gICAgNSwxMDEsMTEwLDExNiwxMTQsMTIxLDExNCwyNTQsMCwwLDAsMTE0LDE2NiwwLDAsMCwKLSAgICAxMTQsMTMwLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA2LDAsMCwwLDIxOCw5LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LDg1LAotICAgIDQsMCwwLDExNSw0MCwwLDAsMCwwLDUsNiwxLDEzLDEsMjEsMSwKLSAgICAzLDEsMTUsMSwxMiwxLDE1LDEsMjEsMiwxOCwxLDEyLDEsMywxLAotICAgIDE1LDEsNCwxLDksMSwxMiwxLDEyLDUsMTcsMiwxOCwxLDksMSwKLSAgICAxMjIsMjAsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDEwMywxMDEsCi0gICAgMTE2LDk1LDExNSwxMTIsMTAxLDk5LDk5LDQsMCwwLDAsMCwwLDAsMCw2LAotICAgIDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDE0MCwwLDAsMCwKLSAgICAxMjQsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMjEsMCwxMTYsMCwwLDEwNiwKLSAgICAxLDAsMTI1LDIsMCwxMjQsMCwwLDEwNiwyLDAsMTI0LDEsMCwxMjQsMiwKLSAgICAwLDEyNCwzLDAsMTMxLDMsMCwxMjUsNCwwLDEyNCw0LDAsMTAwLDEsMCwKLSAgICAxMDcsOCwwLDExNCw1OCwwLDEwMCwxLDAsODMsMTI0LDQsMCwxMDYsMywwLAotICAgIDEwMCwxLDAsMTA3LDgsMCwxMTQsMTMyLDAsMTI0LDQsMCwxMDYsNCwwLDEyNSwKLSAgICA1LDAsMTI0LDUsMCwxMTQsMTI1LDAsMTAwLDIsMCwxMjQsNCwwLDk1LDUsCi0gICAgMCwxMTYsNiwwLDEyNCwxLDAsMTI0LDUsMCwxMjQsMCwwLDEwNiwyLDAsCi0gICAgMTMxLDMsMCwxMjQsNCwwLDk1LDQsMCwxMjQsNCwwLDgzLDEwMCwxLDAsCi0gICAgODMsMTEwLDQsMCwxMjQsNCwwLDgzLDEwMCwxLDAsODMsNDEsMywxMjIsOTgsCi0gICAgMTAyLDEwNSwxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAorICAgIDAsMCw2NywwLDAsMCwxMTUsODIsMCwwLDAsMTE2LDAsMTI0LDIsMTAwLAorICAgIDEsMTMxLDIsMTE0LDI2LDEyNCwyLDEwNiwxLDEyNCwxLDEzMSwxLDkyLDIsMTI1LAorICAgIDMsMTI1LDQsMTEwLDE0LDEyNCwyLDEwNiwyLDEyNCwxLDEzMSwxLDEyNSwzLDEwMywKKyAgICAwLDEyNSw0LDEyNCwzLDEwMCwwLDEwNyw5LDExNCw2MCwxMTYsMywxMDYsNCwxMjQsCisgICAgMSwxMjQsMywxMzEsMiw4MywwLDExNiwzLDEwNiw1LDEyNCwxLDEwMCwwLDEzMSwKKyAgICAyLDEyNSw1LDEyNCw0LDEyNCw1LDk1LDYsMTI0LDUsODMsMCw0MSwyLDc4LAorICAgIDExNCwxMjEsMCwwLDAsNDEsNywxMTQsMTEyLDAsMCwwLDExNCwxMjEsMCwwLAorICAgIDAsMTE0LDE3OSwwLDAsMCwxMTQsMTE4LDAsMCwwLDExNCwxNzYsMCwwLDAsCisgICAgMTE0LDE1OCwwLDAsMCwxMTQsMTU0LDAsMCwwLDQxLDYsMTE0LDE2OCwwLDAsCisgICAgMCwxMTQsMTIzLDAsMCwwLDExNCwyNTIsMCwwLDAsMTE0LDEyNCwwLDAsMCwKKyAgICAxMTQsMTI1LDAsMCwwLDExNCwxNjIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE2LDk1LDEwOCwxMDEsMTAzLDk3LAorICAgIDk5LDEyMSw5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSw5OSw3NSw0LDAsMCwxMTUsCisgICAgMTgsMCwwLDAsMCw0LDEwLDEsMTYsMiwxMCwxLDQsMSw4LDEsCisgICAgMTIsMSwxMiwxLDYsMSwxMjIsMjcsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwKKyAgICAxMDEsMTE0LDQ2LDk1LDEwOCwxMDEsMTAzLDk3LDk5LDEyMSw5NSwxMDMsMTAxLDExNiw5NSwxMTUsCisgICAgMTEyLDEwMSw5OSw3OCw5OSw0LDAsMCwwLDAsMCwwLDAsOSwwLDAsCisgICAgMCw1LDAsMCwwLDY3LDAsMCwwLDExNSwxNzAsMCwwLDAsMTAzLDAsCisgICAgMTI1LDQsMTIwLDE2MCwxMjQsMiw2OCwwLDkzLDEzMCwxMjUsNSwxMTYsMCwxMjQsNSwKKyAgICAxMTYsMSwxMTYsMiwxMDIsMiwxMzEsMiwxMTUsMzAsMTEzLDEwLDEyNCwwLDEwNiwzLAorICAgIDEyNCw1LDEzMSwxLDEyNSw2LDEyNCw2LDEwMCwxLDEwNyw5LDExNCwxMCwxMTYsNCwKKyAgICAxMjQsNiwxMDAsMiwxMzEsMiwxMTQsNzIsMTI0LDYsMTA2LDUsMTI0LDEsMTI0LDMsCisgICAgMTMxLDIsMTI1LDcsMTEwLDEyLDEyNCwwLDEwNiw2LDEyNCwxLDEyNCw2LDEzMSwyLAorICAgIDEyNSw3LDEyNCw3LDEwMCwxLDEwNyw4LDExNCw5NCwxMTMsMTAsMTI0LDcsMTA2LDcsCisgICAgMTAwLDEsMTA3LDksMTE0LDEwOCwxMjQsNyw4MywwLDEyNCw3LDEwNiw4LDEyNSw4LAorICAgIDEyNCw4LDEwMCwxLDEwNyw4LDExNCwxMzAsMTE2LDksMTAwLDMsMTMxLDEsMTMwLDEsCisgICAgMTI0LDQsMTA2LDEwLDEyNCw4LDEzMSwxLDEsMCwxMTMsMTAsODcsMCwxMTYsMTEsCisgICAgMTA2LDEyLDEyNCwxLDEwMCwxLDEzMSwyLDEyNSw3LDEyNCw0LDEyNCw3LDk1LDgsCisgICAgMTI0LDcsODMsMCwxMDAsMSw4MywwLDQxLDQsMTIyLDYzLDcwLDEwNSwxMTAsMTAwLAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTExLDExNCwzMiwxMTAsCisgICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwzMiwxMDIsMTExLAorICAgIDExNCwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDcsMTEyLDk3LAorICAgIDk5LDEwNyw5NywxMDMsMTAxLDMyLDExMCw5NywxMDksMTAxLDQ2LDc4LDExNCwxNzgsMCwwLAorICAgIDAsMTIyLDE5LDExNSwxMTIsMTAxLDk5LDMyLDEwOSwxMDUsMTE1LDExNSwxMDUsMTEwLDEwMywzMiwKKyAgICAxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQxLDEzLDExNCwxNDEsMCwwLDAsMTE0LDczLDAsCisgICAgMCwwLDIxOCw1LDk4LDEyMSwxMTYsMTAxLDExNSwxMTQsMCwxLDAsMCwxMTQsMTEyLAorICAgIDAsMCwwLDExNCwxNzgsMCwwLDAsMTE0LDEsMSwwLDAsMTE0LDEyNCwwLAorICAgIDAsMCwxMTQsMTU0LDAsMCwwLDExNCwxMDMsMCwwLDAsMTE0LDE0NywwLDAsCisgICAgMCwxMTQsMTE4LDAsMCwwLDExNCwxNTgsMCwwLDAsNDEsOSwxMTQsMTY4LDAsCisgICAgMCwwLDExNCwxMjMsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCwxNzcsMCwwLAorICAgIDAsMjE4LDE0LDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDk1LDExMiw5NywxMTYsCisgICAgMTA0LDkwLDUsMTAxLDExMCwxMTYsMTE0LDEyMSwxMTQsMjUyLDAsMCwwLDExNCwxNjIsMCwKKyAgICAwLDAsMTE0LDEyNSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwyMTgsOSw5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSwKKyAgICA5OSw5MCw0LDAsMCwxMTUsNDAsMCwwLDAsMCw1LDQsMSwxMCwxLAorICAgIDE0LDEsMiwxLDEwLDEsOCwxLDEwLDEsMTQsMiwxMiwxLDgsMSwKKyAgICAyLDEsMTAsMSw0LDEsNiwxLDgsMSw4LDUsMTQsMiwxMiwxLAorICAgIDYsMSwxMjIsMjAsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LAorICAgIDEwMywxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LDk5LDQsMCwwLDAsMCwwLDAsCisgICAgMCw2LDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDEwNCwwLAorICAgIDAsMCwxMjQsMiwxMDAsMSwxMDcsOCwxMTQsMTQsMTE2LDAsMTA2LDEsMTI1LDIsCisgICAgMTI0LDAsMTA2LDIsMTI0LDEsMTI0LDIsMTI0LDMsMTMxLDMsMTI1LDQsMTI0LDQsCisgICAgMTAwLDEsMTA3LDgsMTE0LDQyLDEwMCwxLDgzLDAsMTEwLDU4LDEyNCw0LDEwNiwzLAorICAgIDEwMCwxLDEwNyw4LDExNCw5NiwxMjQsNCwxMDYsNCwxMjUsNSwxMjQsNSwxMTQsOTAsCisgICAgMTAwLDIsMTI0LDQsOTUsNSwxMTYsNiwxMjQsMSwxMjQsNSwxMjQsMCwxMDYsMiwKKyAgICAxMzEsMywxMjQsNCw5NSw0LDEyNCw0LDgzLDAsMTEzLDEwMCwxMDAsMSw4MywwLAorICAgIDExMCw0LDEyNCw0LDgzLDAsMTAwLDEsODMsMCw0MSwzLDEyMiwxNDEsODQsMTE0LAorICAgIDEyMSwzMiwxMTYsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiw5NywzMiwxMTUsMTEyLDEwMSw5OSwKKyAgICAzMiwxMDIsMTExLDExNCwzMiwzOSwxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsMzksMzIsCiAgICAgMTExLDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCwzMiwxMTEsMTE0LDMyLDM5LAotICAgIDExMiw5NywxMTYsMTA0LDM5LDMyLDk4LDk3LDExNSwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTE1LAotICAgIDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwzMiw5NywxMTAsCi0gICAgMTAwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywKKyAgICAxMTIsOTcsMTE2LDEwNCwzOSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICA4NCwxMDQsMTAxLDMyLDExNSwxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMDUsMTE1LDMyLDk4LDk3LAorICAgIDExNSwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsCisgICAgMTA0LDExMSwxMTEsMTA3LDExNSwzMiw5NywxMTAsMTAwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywKICAgICAxMTYsMTA0LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LAotICAgIDEwMSw0Niw3OCw5MCw5LDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQxLDcsCi0gICAgMTE0LDgsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw2LDEsMCwwLDExNCwKLSAgICAxMjksMCwwLDAsMTE0LDE1OCwwLDAsMCwxMTQsMTYwLDAsMCwwLDExNCwyMzEsCi0gICAgMCwwLDAsNDEsNiwxMTQsMTcyLDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LAotICAgIDM3LDAsMCwwLDExNCwxODEsMCwwLDAsMTE0LDE2NiwwLDAsMCwxMTQsNSwKLSAgICAxLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAotICAgIDAsMCwxMTQsMTgyLDAsMCwwLDExNyw0LDAsMCwxMTUsMjYsMCwwLDAsCi0gICAgMCw0LDEyLDEsOSwxLDIxLDEsMTIsMSw0LDEsMTUsMSw5LDEsCi0gICAgNiwzLDksMSwyNCwxLDQsMiw3LDIsMTIyLDIwLDgwLDk3LDExNiwxMDQsCi0gICAgNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksCi0gICAgOTksMywwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsCi0gICAgMCw2NywwLDAsMCwxMTUsNDEsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLAotICAgIDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDEyNSwzLDAsMTI0LDMsMCwxMDAsCi0gICAgMSwwLDEwNyw4LDAsMTE0LDM0LDAsMTAwLDEsMCw4MywxMjQsMywwLDEwNiwKLSAgICAxLDAsODMsNDEsMiwxMjIsMTcwLDEwMiwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywKLSAgICAxMTYsMTA0LDMyLDExMSwxMTQsMzIsMzksMTEyLDk3LDExNiwxMDQsMzksMzIsOTgsOTcsMTE1LAotICAgIDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsCi0gICAgMTExLDExMSwxMDcsMTE1LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsCi0gICAgMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwKLSAgICAxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwKLSAgICAxMTUsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsCi0gICAgMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiw3OCw0MSwyLDExNCwxODIsMCwwLDAsMTE0LDEyOSwwLDAsMCw0MSw0LAotICAgIDExNCwxNzIsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LAotICAgIDE2NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKLSAgICAwLDAsMCwxMTQsMTgzLDAsMCwwLDEzOSw0LDAsMCwxMTUsOCwwLDAsCi0gICAgMCwwLDgsMTgsMSwxMiwxLDQsMSwxMjIsMjIsODAsOTcsMTE2LDEwNCw3MCwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSw0MSwxMiwxMTQsMTE0LDAsMCwwLDExNCwxMTMsMCwwLDAsMTE0LDExNSwwLAotICAgIDAsMCwxMTQsMTE2LDAsMCwwLDExNCwxODQsMCwwLDAsMTE0LDI1MSwwLDAsCi0gICAgMCwxMTQsMCwxLDAsMCwxMTQsMiwxLDAsMCwxMTQsMywxLDAsMCwKLSAgICAxMTQsNiwxLDAsMCwxMTQsMTgyLDAsMCwwLDExNCwxODMsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCi0gICAgMCwwLDAsMTE0LDI1MCwwLDAsMCwxOSw0LDAsMCwxMTUsMjIsMCwwLAotICAgIDAsMTIsMiw2LDIsMTgsOCwxOCwxNywxOCwyMiwxOCwxNSwzLDEsMTgsCi0gICAgMzEsMywxLDIxLDIxLDMsMSwxMTQsMjUwLDAsMCwwLDk5LDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNjQsMCwwLAotICAgIDAsMTE1LDEzMywwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLAotICAgIDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsCi0gICAgMCw5MCw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLAotICAgIDEwMSw2LDAsOTAsNywwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLAotICAgIDgsMCwxMDAsOCwwLDEwMCw5LDAsMTMyLDAsMCw5MCw5LDAsMTAwLDEwLAotICAgIDAsMTAwLDExLDAsMTAwLDEyLDAsMTMyLDEsMCw5MCwxMCwwLDEwMCwxMywwLAotICAgIDEwMCwxNCwwLDEzMiwwLDAsOTAsMTEsMCwxMDEsMTIsMCwxMDAsMTUsMCwxMDAsCi0gICAgMTYsMCwxMzIsMCwwLDEzMSwxLDAsOTAsMTMsMCwxMDAsMTcsMCwxMDAsMTgsCi0gICAgMCwxMzIsMCwwLDkwLDE0LDAsMTAwLDEwLDAsODMsNDEsMTksMjE4LDEwLDcwLAotICAgIDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTIyLDE3Miw3MCwxMDUsMTA4LDEwMSw0NSwKLSAgICA5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMCwxMCwzMiwKLSAgICAzMiwzMiwzMiw3MywxMTAsMTE2LDEwMSwxMTQsOTcsOTksMTE2LDEwNSwxMTEsMTEwLDExNSwzMiwKLSAgICAxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExNSwxMjEsCi0gICAgMTE1LDExNiwxMDEsMTA5LDMyLDk3LDExNCwxMDEsMzIsOTksOTcsOTksMTA0LDEwMSwxMDAsMzIsCi0gICAgMTAyLDExMSwxMTQsMzIsMTEyLDEwMSwxMTQsMTAyLDExMSwxMTQsMTA5LDk3LDExMCw5OSwxMDEsNDQsCi0gICAgMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDEwLDMyLDMyLDMyLDMyLDExNCwxMDEsMTAyLDExNCwxMDEsCi0gICAgMTE1LDEwNCwxMDEsMTAwLDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDAsMTA1LAotICAgIDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwKLSAgICAxMDEsMTE0LDMyLDEwNSwxMTUsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwNSwxMTAsMTAzLDMyLDEwNCwKLSAgICA5NywxMTUsMzIsOTgsMTAxLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMDUsMTAxLDEwMCwKLSAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw5OSwyLDAsMCwwLDAsMCwwLDAsCi0gICAgNSwwLDAsMCw1LDAsMCwwLDcsMCwwLDAsMTE1LDEyMiwwLDAsCi0gICAgMCwxMDMsMCwwLDEyNSwzLDAsMTIwLDUyLDAsMTI0LDIsMCw2OCw5Myw0NCwKLSAgICAwLDkyLDIsMCwxMzcsMCwwLDEyNSw0LDAsMTI0LDMsMCwxMDYsMCwwLAotICAgIDEzNSwwLDAsMTAyLDEsMCwxMDAsMSwwLDEwMCwyLDAsMTM0LDAsMCwxMjQsCi0gICAgNCwwLDY4LDEzMSwxLDAsMTMxLDEsMCwxLDExMywxMywwLDg3LDEyNCwzLAotICAgIDAsMTI0LDAsMCw5NSwxLDAsMTI0LDEsMCwxMTIsNzksMCwxMDAsMywwLAotICAgIDEyNCwwLDAsOTUsMiwwLDEwMCw2LDAsMTI0LDAsMCw5NSwzLDAsMTE2LAotICAgIDQsMCwxMzEsMCwwLDEyNCwwLDAsOTUsNSwwLDExNiw0LDAsMTMxLDAsCi0gICAgMCwxMjQsMCwwLDk1LDYsMCwxMDAsNSwwLDgzLDQxLDcsMTIyLDE1NCw3MywKLSAgICAxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNSwxMDEsOTcsMTE0LDk5LAotICAgIDEwNCwzMiwxMTEsMTEwLDMyLDk3LDExMCwxMDAsMzIsOTcsMzIsMTE4LDk3LDExNCwxMDUsOTcsCi0gICAgOTgsMTA4LDEwMSwzMiwxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LDMyLDExMSwxMDIsMTAsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsNTAsNDUsMTE2LDExNywxMTIsMTA4LDEwMSwxMTUsMzIsOTksCi0gICAgMTExLDExMCwxMTYsOTcsMTA1LDExMCwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDMyLDk3LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsCi0gICAgMTAxLDMyLDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LAotICAgIDExMSw5NywxMDAsMTAxLDExNCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMTAxLAotICAgIDk5LDExMSwxMDMsMTEwLDEwNSwxMjIsMTAxLDExNSw0Niw5OSwxLDAsMCwwLDAsMCwKLSAgICAwLDAsMiwwLDAsMCwzLDAsMCwwLDUxLDAsMCwwLDExNSwyNywKLSAgICAwLDAsMCwxMjQsMCwwLDkzLDE3LDAsMTI1LDEsMCwxMjQsMSwwLDEzNiwKLSAgICAwLDAsMTAyLDIsMCw4NiwxLDExMywzLDAsMTAwLDAsMCw4Myw0MSwxLAotICAgIDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDI0LDAsMCwwLDExNCwyMjYsMCwKLSAgICAwLDAsNDEsMSwxMTQsMTI5LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAotICAgIDAsMCwwLDExNCwyMjgsMCwwLDAsMTY4LDQsMCwwLDExNSwyLDAsMCwKLSAgICAwLDYsMCwxMjIsMzgsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKLSAgICA5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LAotICAgIDYyLDQ2LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxMTQsNjAsMCwwLDAsCi0gICAgMTE0LDMxLDAsMCwwLDc4LDExNCw4OSwwLDAsMCw0MSw3LDExNCwxNTEsMCwKLSAgICAwLDAsMjE4LDgsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMTE0LDM3LDAsMCwKLSAgICAwLDIxOCwxMSw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDksMTE2LDEwNSwxMDksMTAxLDIxOCwzLAotICAgIDExNSwxMDEsMTE2LDIxOCwxMSw5NSwxMTIsOTcsMTE2LDEwNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLAotICAgIDIxOCwxOSw5NSwxMTQsMTAxLDEwOCw5NywxMjAsMTAxLDEwMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwKLSAgICA5OSw5Nyw5OSwxMDQsMTAxLDQxLDUsMTE0LDExMCwwLDAsMCwxMTQsMzcsMCwwLAotICAgIDAsMjE4LDE0LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTUsMTAwLDEwMSwxMTYsOTcsMTA1LDEwOCwKLSAgICAxMTUsOTAsNywxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwxMTQsMTY4LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDQxLDEsMTE0LDEyOSwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAxMTQsMTg2LDAsMCwwLDE2Miw0LDAsMCwxMTUsMTYsMCwwLDAsMCw0LAotICAgIDYsMSwxOSwxLDM2LDEsOSwyLDE1LDEsOSwxLDEyLDEsMTIyLDE5LAotICAgIDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsCi0gICAgMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAotICAgIDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEzLDAsMCwwLDEwMCwzLDAsCi0gICAgMTI0LDAsMCw5NSwwLDAsMTAwLDIsMCw4Myw0MSw0LDEyMiwzMSw3MywxMTAsCi0gICAgMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDEwNSwxMTQsCi0gICAgMTAxLDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMDksMTE2LDEwNSwxMDksMTAxLDQ2LDExNCwzMSwwLAotICAgIDAsMCw3OCwxMTQsODksMCwwLDAsNDEsMSwxMTQsOSwxLDAsMCw0MSwKLSAgICAxLDExNCwxMTAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDYsMCwwLDAsMTE0LDI1MSwwLDAsMCwxNzYsNCwwLDAsMTE1LDIsCi0gICAgMCwwLDAsMCwyLDEyMiwyOCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsCi0gICAgMTE0LDQ2LDEwNSwxMTAsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTksOTcsOTksCi0gICAgMTA0LDEwMSwxMTUsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsCi0gICAgMiwwLDAsMCw2NywwLDAsMCwxMTUsNTksMCwwLDAsMTI0LDAsMCwKLSAgICAxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwwLDEyNCwyLDAsMTAwLAotICAgIDEsMCwxMDcsOCwwLDExNCwzNywwLDEwMCwxLDAsMTAzLDAsMCwxMDIsMiwKLSAgICAwLDgzLDEyNCwyLDAsMTA2LDEsMCwxMjQsMiwwLDEwNiwyLDAsMTEyLDU1LAotICAgIDAsMTAzLDAsMCwxMDIsMiwwLDgzLDQxLDIsMTIyLDE5Nyw4NCwxMTQsMTIxLDMyLAotICAgIDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsCi0gICAgMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwxMTEsMTE0LDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDEwLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTIsMTExLDExNCwxMTYsCi0gICAgMTA1LDExMSwxMTAsMTE1LDQ2LDMyLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDQwLDEwOCwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDQsMzIsMTA4LDEwNSwxMTUsMTE2LDQ1LDExMSwxMDIsNDUsMTEyLAotICAgIDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsCi0gICAgMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsCi0gICAgMTE1LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksNDAsNDEsMzIsMTA1LAotICAgIDExMCwxMTUsMTE2LDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsNzgsNDEsMywxMTQsMTgyLDAsMCwwLDExNCwxMjksMCwwLDAsMTE0LDE1OCwKLSAgICAwLDAsMCw0MSwzLDExNCwxMTAsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsCi0gICAgMTY2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAotICAgIDAsMCwwLDExNCwxMjYsMCwwLDAsMTgyLDQsMCwwLDExNSw4LDAsMCwKLSAgICAwLDAsNywxNSwxLDEyLDEsMTAsMSwxMjIsMjIsNzAsMTA1LDEwOCwxMDEsNzAsCi0gICAgMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA4LDExMSw5NywxMDAsMTAxLAotICAgIDExNCw5OSw2LDAsMCwwLDAsMCwwLDAsNywwLDAsMCw3LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSw0MCwwLDAsMCwxMjQsMSwwLDEyNCwyLAotICAgIDAsMTI0LDMsMCwxMzEsMiwwLDEyNSw2LDAsMTE2LDAsMCwxMjQsMiwwLAotICAgIDEyNCwzLDAsMTAwLDEsMCwxMjQsNiwwLDEwMCwyLDAsMTI0LDQsMCwxMzEsCi0gICAgMiwyLDgzLDQxLDMsNzgsMTE0LDEyOSwwLDAsMCwxMTQsMTU4LDAsMCwwLAotICAgIDQxLDEsMTE0LDE2OSwwLDAsMCw0MSw3LDExNCwxMTAsMCwwLDAsMTE0LDE2NywKLSAgICAwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCwzNywwLDAsMCw5MCw0LDExNSwKLSAgICAxMDksMTE1LDEwOCwxMTQsMTgxLDAsMCwwLDExNCwxMjksMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDYsMSwwLAotICAgIDAsMTk0LDQsMCwwLDExNSw2LDAsMCwwLDAsMSwxNSwxLDE4LDEsCi0gICAgMTIyLDIwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAzLDEwMSwKLSAgICAxMTYsOTUsMTE1LDExMiwxMDEsOTksNzgsOTksMywwLDAsMCwwLDAsMCwwLAotICAgIDE0LDAsMCwwLDE1LDAsMCwwLDY3LDAsMCwwLDExNSwyMzQsMSwwLAotICAgIDAsMTAwLDEsMCwxMjUsMywwLDEyNCwxLDAsMTA2LDAsMCwxMDAsMiwwLAotICAgIDEzMSwxLDAsMTAwLDMsMCwyNSwxMjUsNCwwLDEyMSwzNCwwLDExNiwxLDAsCi0gICAgMTI0LDAsMCwxMDYsMiwwLDExMiw0OSwwLDExNiwzLDAsMTA2LDQsMCwxMzEsCi0gICAgMCwwLDEzMSwxLDAsMTA2LDUsMCwxMjUsNSwwLDg3LDExMCwyNCwwLDQsCi0gICAgMTE2LDYsMCwxMDcsMTAsMCwxMTQsODUsMCwxLDEsMSwxMDAsMTAsMCwxMjUsCi0gICAgNSwwLDg5LDExMCwxLDAsODgsMTI0LDUsMCwxMjQsMCwwLDEwNiw3LDAsCi0gICAgMTA3LDMsMCwxMTQsMTIwLDAsMTI0LDAsMCwxMDYsOCwwLDEzMSwwLDAsMSwKLSAgICAxMjQsNSwwLDEyNCwwLDAsOTUsNywwLDExNiw5LDAsMTMxLDAsMCwxMTQsCi0gICAgMTUzLDAsMTI0LDAsMCwxMDYsMTAsMCwxMjUsNiwwLDEyNCw0LDAsMTA2LDExLAotICAgIDAsMTMxLDAsMCwxMjUsNywwLDExMCwxNSwwLDEyNCwwLDAsMTA2LDEyLDAsCi0gICAgMTI1LDYsMCwxMjQsNCwwLDEyNSw3LDAsMTI0LDcsMCwxMjQsNiwwLDEwNywKLSAgICA2LDAsMTE0LDQ1LDEsMTE2LDEzLDAsMTI0LDAsMCwxMDYsMiwwLDEyNCw0LAotICAgIDAsMTMxLDIsMCwxMjUsOCwwLDEyMCwxMDAsMCwxMjQsMCwwLDEwNiwxNCwwLAotICAgIDY4LDkzLDc3LDAsOTIsMiwwLDEyNSw5LDAsMTI1LDEwLDAsMTAwLDUsMCwKLSAgICAxMjQsOSwwLDIzLDEyNSwxMSwwLDExNiwxMywwLDEyNCw4LDAsMTI0LDExLDAsCi0gICAgMTMxLDIsMCwxMjUsMTIsMCwxMTYsMTUsMCwxMjQsMTIsMCwxMzEsMSwwLDExNCwKLSAgICAyMDgsMCwxMjQsMCwwLDEwNiwxNiwwLDEyNCwxMCwwLDEyNCwxLDAsMTI0LDEyLAotICAgIDAsMTI0LDgsMCwxMDMsMSwwLDEyNCwyLDAsMTMxLDUsMCw4MywxMTMsMjA4LAotICAgIDAsODcsMTE2LDE3LDAsMTI0LDgsMCwxMzEsMSwwLDEyNSwzLDAsMTIwLDEyMywKLSAgICAwLDEyNCwwLDAsMTA2LDE0LDAsNjgsOTMsMTEyLDAsOTIsMiwwLDEyNSw5LAotICAgIDAsMTI1LDEwLDAsMTE2LDEzLDAsMTI0LDAsMCwxMDYsMiwwLDEyNCw0LDAsCi0gICAgMTI0LDksMCwyMywxMzEsMiwwLDEyNSwxMiwwLDExNiwxOCwwLDEwMCw2LDAsCi0gICAgMTA2LDE5LDAsMTI0LDEyLDAsMTMxLDEsMCwxMDAsNywwLDEwMCwzLDAsMTMxLAotICAgIDEsMSwxLDEyNCw3LDAsMTI0LDksMCwyMywxMjQsNiwwLDEwNyw2LDAsCi0gICAgMTE0LDU1LDEsMTE2LDE1LDAsMTI0LDEyLDAsMTMxLDEsMCwxMTQsNTUsMSwxMjQsCi0gICAgMCwwLDEwNiwxNiwwLDEyNCwxMCwwLDEyNCwxLDAsMTI0LDEyLDAsMTAwLDgsCi0gICAgMCwxMjQsMiwwLDEzMSw1LDAsODMsMTEzLDU1LDEsODcsMTI0LDMsMCwxMTQsCi0gICAgMjMwLDEsMTE2LDE4LDAsMTAwLDksMCwxMDYsMTksMCwxMjQsOCwwLDEzMSwxLAotICAgIDAsMTMxLDEsMCwxLDExNiwyMCwwLDEwNiwyMSwwLDEyNCwxLDAsMTAwLDgsCi0gICAgMCwxMzEsMiwwLDEyNSwxMywwLDEyNCw4LDAsMTAzLDEsMCwxMjQsMTMsMCwKLSAgICA5NSwyMiwwLDEyNCwxMywwLDgzLDEwMCw4LDAsODMsNDEsMTEsMTIyLDEwMiw4NCwKLSAgICAxMTQsMTIxLDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDExNSwxMTIsMTAxLAotICAgIDk5LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsCi0gICAgMTA1LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMzIsMzIsODIsMTAxLDExNiwKLSAgICAxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMTA5LDk3LDExNiw5OSwxMDQsMTA1LDExMCwxMDMsMzIsMTE1LDExMiwxMDEsOTksNDQsMzIsCi0gICAgMTExLDExNCwzMiw3OCwxMTEsMTEwLDEwMSwzMiwxMDUsMTAyLDMyLDExMCwxMTEsMTE2LDMyLDEwMiwKLSAgICAxMTEsMTE3LDExMCwxMDAsNDYsNzAsMTE0LDYwLDAsMCwwLDExNCw1OCwwLDAsMCwKLSAgICAxMTQsMzEsMCwwLDAsMTE0LDE4NiwwLDAsMCwxMjIsOSwxMTYsMTE0LDEyMSwxMDUsCi0gICAgMTEwLDEwMywzMiwxMjMsMTI1LDExNCwxMDAsMCwwLDAsNzgsMTIyLDI1LDExMiwxMTEsMTE1LAotICAgIDExNSwxMDUsOTgsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwKLSAgICAxMDIsMTExLDExNCwzMiwxMjMsMTI1LDExNCw4OSwwLDAsMCw0MSwyMywxMTQsMzQsMCwKLSAgICAwLDAsMTE0LDQxLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsMywwLDAsCi0gICAgMCwxMTQsNDcsMCwwLDAsMTE0LDIyMCwwLDAsMCwxMTQsNDIsMCwwLDAsCi0gICAgMTE0LDksMSwwLDAsMjE4LDExLDk1LDEwMiwxMDUsMTA4LDEwOCw5NSw5OSw5Nyw5OSwKLSAgICAxMDQsMTAxLDExNCw3LDAsMCwwLDExNCwxMiwxLDAsMCwxMTQsOTAsMCwwLAotICAgIDAsMTE0LDExLDEsMCwwLDExNCwzMCwwLDAsMCwxMTQsOCwxLDAsMCwKLSAgICAxMTQsNDYsMCwwLDAsMTE0LDYsMSwwLDAsMTE0LDQ4LDAsMCwwLDExNCwKLSAgICAxMDcsMCwwLDAsMTE0LDQ5LDAsMCwwLDExNCwxMjMsMCwwLDAsMTE0LDE2MiwKLSAgICAwLDAsMCwxMTQsMTU4LDAsMCwwLDQxLDE0LDExNCwxMTAsMCwwLDAsMTE0LAotICAgIDEyOCwwLDAsMCwxMTQsMTgxLDAsMCwwLDkwLDEyLDEwNSwxMTUsOTUsMTEwLDk3LAotICAgIDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsOTAsMTEsMTE2LDk3LDEwNSwxMDgsOTUsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMTE0LDEzNSwwLDAsMCw5MCw1LDk5LDk3LDk5LDEwNCwxMDEsCi0gICAgOTAsMTIsOTksOTcsOTksMTA0LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCw5LAotICAgIDk4LDk3LDExNSwxMDEsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDIyNiwwLDAsMCwxMTQsMTY3LAotICAgIDAsMCwwLDkwLDEzLDEwNSwxMTAsMTA1LDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LAotICAgIDEwOSwxMDEsOTAsOSwxMDIsMTE3LDEwOCwxMDgsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDE2NiwwLAorICAgIDEwMSw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw5MCw5LDExMCw5NywKKyAgICAxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQxLDcsMTE0LDgsMCwwLDAsMTE0LDM3LAorICAgIDAsMCwwLDExNCw0LDEsMCwwLDExNCwxMjQsMCwwLDAsMTE0LDE1NCwwLAorICAgIDAsMCwxMTQsMTU2LDAsMCwwLDExNCwyMjcsMCwwLDAsNDEsNiwxMTQsMTY4LAorICAgIDAsMCwwLDExNCwxMjMsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCwxNzcsMCwKKyAgICAwLDAsMTE0LDE2MiwwLDAsMCwxMTQsMywxLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTc4LDAsMCwwLAorICAgIDEyMiw0LDAsMCwxMTUsMjYsMCwwLDAsMCw2LDgsMSw2LDEsMTQsCisgICAgMSw4LDEsNiwxLDEwLDEsNiwxLDQsMyw2LDEsMTYsMSw2LAorICAgIDIsNiwyLDEyMiwyMCw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsCisgICAgMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LDMsMCwwLDAsMCwwLAorICAgIDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDMwLAorICAgIDAsMCwwLDEyNCwwLDEwNiwwLDEyNCwxLDEyNCwyLDEzMSwyLDEyNSwzLDEyNCwKKyAgICAzLDEwMCwxLDEwNyw4LDExNCwyNCwxMDAsMSw4MywwLDEyNCwzLDEwNiwxLDgzLAorICAgIDAsNDEsMiwxMjIsMTcwLDEwMiwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LAorICAgIDMyLDExMSwxMTQsMzIsMzksMTEyLDk3LDExNiwxMDQsMzksMzIsOTgsOTcsMTE1LDEwMSwxMDAsCisgICAgMzIsMTExLDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwKKyAgICAxMDcsMTE1LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE1LAorICAgIDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwKKyAgICA5NSw5OSw5Nyw5OSwxMDQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsCisgICAgMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLAorICAgIDMyLDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwKKyAgICAxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCwKKyAgICA0MSwyLDExNCwxNzgsMCwwLDAsMTE0LDEyNCwwLDAsMCw0MSw0LDExNCwxNjgsCisgICAgMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDE2MiwwLAogICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsCi0gICAgMCwxMTQsMTgyLDAsMCwwLDE5OSw0LDAsMCwxMTUsNjgsMCwwLDAsMCwKLSAgICAzLDYsMSwxOSwxLDMsMSwzNCwxLDEzLDEsMTEsMSwxNSwxLDEwLAotICAgIDEsOSwyLDksMSw5LDEsMTUsMiw5LDEsNiwyLDEyLDEsMTgsCi0gICAgMSwyMiwxLDEwLDEsMTUsMSwxMiwxLDMyLDQsMTIsMiwyMiwxLDIyLAotICAgIDEsMjUsMSwxNiwxLDEyLDEsMjksMSw2LDEsMTksMSwxOCwxLDEyLAotICAgIDEsNCwxLDEyMiwyMCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LAotICAgIDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw5OSwxLDAsMCwwLDAsMCwKLSAgICAwLDAsOSwwLDAsMCwxMywwLDAsMCw2NywwLDAsMCwxMTUsMTEsCi0gICAgMSwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNSwxLDAsMTIxLDMxLDAsMTE2LAotICAgIDEsMCwxMDYsMiwwLDEyNCwxLDAsMTEyLDMzLDAsMTE2LDEsMCwxMDYsMywKLSAgICAwLDEzMSwwLDAsMTMxLDEsMCwxMjUsMiwwLDg3LDExMCwzMywwLDQsMTE2LAotICAgIDQsMCwxMTYsNSwwLDExNiw2LDAsMTAyLDMsMCwxMDcsMTAsMCwxMTQsNzUsCi0gICAgMCwxLDEsMSwxMDMsMCwwLDEyNSwyLDAsODksMTEwLDEsMCw4OCwxMTYsCi0gICAgNywwLDEwNiw4LDAsMTA2LDksMCwxMDAsMSwwLDEzMSwxLDAsMTE1LDExMiwKLSAgICAwLDExNiwxMCwwLDEyNCwyLDAsMTMxLDEsMCwxMjQsMCwwLDk1LDExLDAsCi0gICAgMTEwLDExMSwwLDExNiwxMCwwLDEzMSwwLDAsMTI1LDMsMCwxMjAsOTAsMCwxMjQsCi0gICAgMiwwLDY4LDkzLDgyLDAsMTI1LDQsMCwxMjQsNCwwLDEwNiwxMiwwLDEwMCwKLSAgICAyLDAsMTMxLDEsMCw5MiwzLDAsMTI1LDUsMCwxMjUsNiwwLDEyNSw3LAotICAgIDAsMTI0LDYsMCwxMTQsMTkxLDAsMTAwLDMsMCwxMDYsMTMsMCwxMjQsNSwwLAotICAgIDEyNCw3LDAsMTA2LDE0LDAsMTMxLDAsMCwxMzEsMiwwLDEyNSw4LDAsMTEwLAotICAgIDYsMCwxMjQsNSwwLDEyNSw4LDAsMTI0LDMsMCwxMDYsMTUsMCwxMjQsOCwKLSAgICAwLDEzMSwxLDAsMSwxMTMsMTI4LDAsODcsMTI0LDMsMCwxMjQsMCwwLDk1LAotICAgIDExLDAsMTE2LDcsMCwxMDYsOCwwLDEwNiw5LDAsMTE2LDE2LDAsMTMxLDEsCi0gICAgMCwxMTQsNywxLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDEyNCwyLDAsCi0gICAgNjgsMTMxLDEsMCwxMjQsMCwwLDk1LDE3LDAsMTAwLDYsMCw4Myw0MSw3LAotICAgIDEyMiw2OCw3MCwxMDUsMTA4LDEwOCwzMiwxMTYsMTA0LDEwMSwzMiw5OSw5Nyw5OSwxMDQsMTAxLAotICAgIDMyLDExMSwxMDIsMzIsMTEyLDExMSwxMTYsMTAxLDExMCwxMTYsMTA1LDk3LDEwOCwzMiwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywKLSAgICAxMDEsMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDAsMTA1LDExNCwxMDEsCi0gICAgOTksMTE2LDExMSwxMTQsMTIxLDQ2LDExNCwwLDAsMCwwLDExNCw2MCwwLDAsMCwKLSAgICAxMjIsNSwxMjMsMTI1LDQ2LDEyMywxMjUsOTksMSwwLDAsMCwwLDAsMCwwLAotICAgIDIsMCwwLDAsMywwLDAsMCw4MywwLDAsMCwxMTUsMjgsMCwwLAotICAgIDAsMTA0LDAsMCwxMjQsMCwwLDkzLDE4LDAsMTI1LDEsMCwxMjQsMSwwLAotICAgIDEwNiwwLDAsMTMxLDAsMCwxNDYsMiwwLDExMyw2LDAsODMsMTE0LDQsMCwKLSAgICAwLDAsNDEsMSwxMTQsOTAsMCwwLDAsNDEsMiwxMTQsMjQsMCwwLDAsCi0gICAgOTAsMiwxMDIsMTEwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAotICAgIDAsMCwwLDI1MCw5LDYwLDExNSwxMDEsMTE2LDk5LDExMSwxMDksMTEyLDYyLDE3LDUsCi0gICAgMCwwLDExNSwyLDAsMCwwLDksMCwxMjIsNDEsNzAsMTA1LDEwOCwxMDEsNzAsCi0gICAgMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMDIsMTA1LDEwOCwxMDgsOTUsOTksOTcsOTksMTA0LAotICAgIDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTE1LDEwMSwxMTYsOTksCi0gICAgMTExLDEwOSwxMTIsNjIsNzgsNDEsMTgsMTE0LDM3LDAsMCwwLDExNCwzLDAsMCwKLSAgICAwLDkwLDcsMTA4LDEwNSwxMTUsMTE2LDEwMCwxMDUsMTE0LDExNCw0NywwLDAsMCwxMTQsCi0gICAgMSwxLDAsMCwyMTgsMTUsODAsMTAxLDExNCwxMDksMTA1LDExNSwxMTUsMTA1LDExMSwxMTAsCi0gICAgNjksMTE0LDExNCwxMTEsMTE0LDIxOCwxOCw3OCwxMTEsMTE2LDY1LDY4LDEwNSwxMTQsMTAxLDk5LAotICAgIDExNiwxMTEsMTE0LDEyMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDgsMCwwLDAsMTE0LDksCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwxLDAsMCwxMTQsMTEsMSwKLSAgICAwLDAsMTE0LDg1LDAsMCwwLDExNCw0OSwwLDAsMCwxMTQsOTAsMCwwLAotICAgIDAsMjE4LDMsOTcsMTAwLDEwMCwxMTQsMTEsMCwwLDAsMTE0LDEyLDEsMCwwLAotICAgIDQxLDksMTE0LDExMCwwLDAsMCwxMTQsMzcsMCwwLDAsOTAsOCw5OSwxMTEsCi0gICAgMTEwLDExNiwxMDEsMTEwLDExNiwxMTUsOTAsMjEsMTA4LDExMSwxMTksMTAxLDExNCw5NSwxMTUsMTE3LAotICAgIDEwMiwxMDIsMTA1LDEyMCw5NSw5OSwxMTEsMTEwLDExNiwxMDEsMTEwLDExNiwxMTUsMTE0LDI0NiwwLAotICAgIDAsMCwxMTQsMTA4LDAsMCwwLDExNCwyMzgsMCwwLDAsMTE0LDIyNiwwLDAsCi0gICAgMCw5MCw4LDExMCwxMDEsMTE5LDk1LDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxNCwxLDAsMCwyNDQsCi0gICAgNCwwLDAsMTE1LDM0LDAsMCwwLDAsMiw5LDEsMywxLDMxLDEsCi0gICAgMjIsMywxMSwzLDE4LDEsMTgsNyw5LDEsMTMsMSwyNCwxLDYsMSwKLSAgICAyNywyLDYsMSwxNywxLDksMSwxOCwxLDEyMiwyMiw3MCwxMDUsMTA4LDEwMSwKLSAgICA3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDEwMiwxMDUsMTA4LDEwOCw5NSw5OSw5Nyw5OSwKLSAgICAxMDQsMTAxLDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDMsCi0gICAgMCwwLDAsNywwLDAsMCwxMTUsMjUsMCwwLDAsMTM1LDAsMCwxMzUsCi0gICAgMSwwLDEwMiwyLDAsMTAwLDEsMCwxMDAsMiwwLDEzNCwwLDAsMTI1LDIsCi0gICAgMCwxMjQsMiwwLDgzLDQxLDMsOTcsMjAsMSwwLDAsNjUsMzIsOTksMTA4LAotICAgIDk3LDExNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE5LDEwNCwxMDUsOTksMTA0LAotICAgIDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw5NywzMiw5OSwxMDgsMTExLDExNSwxMTcsCi0gICAgMTE0LDEwMSwzMiwxMTYsMTExLDMyLDExNywxMTUsMTAxLDMyLDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsCi0gICAgNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDEwLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTksMTA1LDEwOCwxMDgsMzIsMTE0LDEwMSwKLSAgICAxMTYsMTE3LDExNCwxMTAsMzIsOTcsMTEwLDMyLDEwNSwxMTAsMTE1LDExNiw5NywxMTAsOTksMTAxLAotICAgIDMyLDExNywxMTUsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LAotICAgIDEwMiwxMDUsMTAxLDEwMCwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwzMiw5NywxMTAsMTAwLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDk5LDEwOCwxMTEsMTE1LDExNywxMTQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDczLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw5OSw5NywKLSAgICAxMDgsMTA4LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMDgsMTExLDExNSwKLSAgICAxMTcsMTE0LDEwMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLDEwMCwxMDUsMTE0LAotICAgIDEwMSw5OSwxMTYsMTExLDExNCwxMjEsNDQsMzIsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsCi0gICAgMTE0LDExMSwxMTQsMzIsMTA1LDExNSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsCi0gICAgOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDQsMCwwLAotICAgIDAsMTksMCwwLDAsMTE1LDQzLDAsMCwwLDExNiwwLDAsMTI0LDAsMCwKLSAgICAxMzEsMSwwLDExNSwzMCwwLDExNiwxLDAsMTAwLDEsMCwxMDAsMiwwLDEyNCwKLSAgICAwLDAsMTMxLDEsMSwxMzAsMSwwLDEzNiwwLDAsMTI0LDAsMCwxMzYsMSwKLSAgICAwLDE0MCwxLDAsODMsNDEsMywxMjIsNDUsODAsOTcsMTE2LDEwNCwzMiwxMDQsMTExLAotICAgIDExMSwxMDcsMzIsMTAyLDExMSwxMTQsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwKLSAgICA0NiwxMDksOTcsOTksMTA0LDEwNSwxMTAsMTAxLDExNCwxMjEsNDYsNzAsMTA1LDEwOCwxMDEsNzAsCi0gICAgMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMjIsMzAsMTExLDExMCwxMDgsMTIxLDMyLDEwMCwxMDUsMTE0LAotICAgIDEwMSw5OSwxMTYsMTExLDExNCwxMDUsMTAxLDExNSwzMiw5NywxMTQsMTAxLDMyLDExNSwxMTcsMTEyLAotICAgIDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDExNCwzNywwLDAsMCw0MSwyLDExNCw0OCwwLAotICAgIDAsMCwxMTQsMTA5LDAsMCwwLDQxLDEsMTE0LDM3LDAsMCwwLDQxLDIsCi0gICAgMTE0LDE3MiwwLDAsMCwxMTQsMTMsMSwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDYsMCwwLDAsMjE4LDI0LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw5NSwKLSAgICAxMDIsMTExLDExNCw5NSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDI5LDUsCi0gICAgMCwwLDExNSw2LDAsMCwwLDAsMiwxMiwxLDE4LDEsMTIyLDU0LDcwLAotICAgIDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LAotICAgIDExMSwxMTEsMTA3LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0NiwxMTIsOTcsMTE2LAotICAgIDEwNCw5NSwxMDQsMTExLDExMSwxMDcsOTUsMTAyLDExMSwxMTQsOTUsNzAsMTA1LDEwOCwxMDEsNzAsCi0gICAgMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwwLDAsMCw0MSwzLDExNCwxNzIsMCwwLAotICAgIDAsMTE0LDEzLDEsMCwwLDExNCwxOSwxLDAsMCwxMTQsNCwwLDAsMCwKLSAgICA0MSwyLDExNCwxNzIsMCwwLDAsMTE0LDEzLDEsMCwwLDExNCw2LDAsMCwKLSAgICAwLDIxOCw5LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxOSw1LDAsMCwKLSAgICAxMTUsNCwwLDAsMCwwLDEwLDIxLDYsMTIyLDIwLDcwLDEwNSwxMDgsMTAxLDcwLAotICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDk5LAotICAgIDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDEwMCwxLDAsMTA2LDAsMCwxMjQsCi0gICAgMCwwLDEwNiwxLDAsMTMxLDEsMCw4Myw0MSwyLDc4LDEyMiwxNiw3MCwxMDUsCi0gICAgMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQwLDEyMywzMywxMTQsMTI1LDQxLDQxLDIsCi0gICAgMTE0LDQ5LDAsMCwwLDExNCwzNywwLDAsMCw0MSwxLDExNCwxMTAsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsCi0gICAgMTE0LDI0NSwwLDAsMCwzNyw1LDAsMCwxMTUsMiwwLDAsMCwwLDEsCi0gICAgMTIyLDE5LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTE0LAotICAgIDEwMSwxMTIsMTE0LDk1LDk1LDQxLDE1LDExNCwxMTQsMCwwLDAsMTE0LDExMywwLDAsCi0gICAgMCwxMTQsMTE1LDAsMCwwLDExNCwxMTYsMCwwLDAsMTE0LDE4NiwwLDAsMCwKLSAgICAxMTQsMjUxLDAsMCwwLDExNCwxMzIsMCwwLDAsMTE0LDE4MywwLDAsMCwxMTQsCi0gICAgMTI2LDAsMCwwLDExNCw2LDEsMCwwLDExNCwxODIsMCwwLDAsMTE0LDE0LAotICAgIDEsMCwwLDExNCwxODQsMCwwLDAsMTE0LDIwLDEsMCwwLDExNCwyNDUsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDYsMCwwLDAsMTE0LDcsMSwwLDAsMTUzLDQsMCwwLDExNSwKLSAgICAyMCwwLDAsMCwxMiw3LDYsMiwxMiwxNCwxMiw0LDYsMiwxMiwxMiwKLSAgICAxMiw1LDE1LDQ1LDEyLDMxLDE4LDE4LDExNCw3LDEsMCwwLDk5LDQsMCwKLSAgICAwLDAsMCwwLDAsMCw2LDAsMCwwLDExLDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwxOTUsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEwMCwxLDAsCi0gICAgMTMxLDEsMCwxMjUsNCwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMiwwLDEzMSwKLSAgICAxLDAsMTI1LDUsMCwxMjQsNCwwLDExNSw5OSwwLDEyNCw1LDAsMTE0LDU0LAotICAgIDAsMTI0LDUsMCwxMDYsMSwwLDEyNSw0LDAsMTEwLDQ1LDAsMTI0LDIsMCwKLSAgICAxMjQsMywwLDEwNywyLDAsMTE0LDg0LDAsMTE2LDIsMCwxMjQsMSwwLDEyNCwKLSAgICAyLDAsMTMxLDIsMCwxMjUsNCwwLDExMCwxNSwwLDExNiwzLDAsMTI0LDEsCi0gICAgMCwxMjQsMiwwLDEzMSwyLDAsMTI1LDQsMCwxMjQsNSwwLDExNSwxMjYsMCwKLSAgICAxMTYsNCwwLDEyNCwxLDAsMTI0LDIsMCwxMDAsMywwLDEyNCw0LDAsMTMxLAotICAgIDIsMSwxMjUsNSwwLDEyMSw0NCwwLDEyNCw1LDAsMTI0LDAsMCwxMDAsMiwKLSAgICAwLDYwLDEyNCw0LDAsMTI0LDAsMCwxMDAsMSwwLDYwLDEyNCwyLDAsMTI0LAotICAgIDAsMCwxMDAsNCwwLDYwLDEyNCwzLDAsMTI0LDAsMCwxMDAsNSwwLDYwLAotICAgIDg3LDExMCwxOCwwLDQsMTE2LDUsMCwxMDcsMTAsMCwxMTQsMTkwLDAsMSwxLAotICAgIDEsODksMTEwLDEsMCw4OCwxMDAsMCwwLDgzLDQxLDYsNzgsMjE4LDEwLDk1LAotICAgIDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTUsOTUsMjE4LDgsOTUsOTUsMTE1LDExMiwxMDEsCi0gICAgOTksOTUsOTUsMTE0LDEyOSwwLDAsMCw5MCw4LDk1LDk1LDEwMiwxMDUsMTA4LDEwMSwKLSAgICA5NSw5NSw5MCwxMCw5NSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDEwMCw5NSw5NSw0MSw2LAotICAgIDIxOCwzLDEwMywxMDEsMTE2LDExNCwxMjksMCwwLDAsMTE0LDIyNCwwLDAsMCwxMTQsCi0gICAgMjE5LDAsMCwwLDExNCwxNjksMCwwLDAsMjE4LDksNjksMTIwLDk5LDEwMSwxMTIsCi0gICAgMTE2LDEwNSwxMTEsMTEwLDQxLDYsOTAsMiwxMTAsMTE1LDExNCwxMDgsMCwwLDAsOTAsCi0gICAgOCwxMTIsOTcsMTE2LDEwNCwxMTAsOTcsMTA5LDEwMSw5MCw5LDk5LDExMiw5NywxMTYsMTA0LAotICAgIDExMCw5NywxMDksMTAxLDExNCwxMjksMCwwLDAsMTE0LDE2NiwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTQsOTUsCi0gICAgMTAyLDEwNSwxMjAsOTUsMTE3LDExMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0Myw1LDAsCi0gICAgMCwxMTUsMzQsMCwwLDAsMCwyLDE1LDEsMTUsMSw2LDEsNiwxLAotICAgIDEyLDEsMTIsMSwxOCwyLDE1LDEsNiwxLDIxLDEsMywxLDEwLDEsCi0gICAgMTAsMSwxMCwxLDE0LDEsMTMsMiwxMTQsMjUsMSwwLDAsOTksMCwwLAotICAgIDAsMCwwLDAsMCwwLDMsMCwwLDAsMywwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsNTUsMCwwLDAsMTE2LDAsMCwxMTYsMSwwLDEwNiwyLDAsCi0gICAgMTMxLDAsMCwxMDIsMiwwLDEyNSwwLDAsMTE2LDMsMCwxMTYsNCwwLDEwMiwKLSAgICAyLDAsMTI1LDEsMCwxMTYsNSwwLDExNiw2LDAsMTAyLDIsMCwxMjUsMiwKLSAgICAwLDEyNCwwLDAsMTI0LDEsMCwxMjQsMiwwLDEwMywzLDAsODMsNDEsMSwKLSAgICAxMjIsOTUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsOTcsMzIsMTA4LDEwNSwxMTUsMTE2LAotICAgIDMyLDExMSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDQ1LDk4LDk3LDExNSwxMDEsMTAwLDMyLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDQ2LDEwLDEwLAotICAgIDMyLDMyLDMyLDMyLDY5LDk3LDk5LDEwNCwzMiwxMDUsMTE2LDEwMSwxMDksMzIsMTA1LDExNSwKLSAgICAzMiw5NywzMiwxMTYsMTE3LDExMiwxMDgsMTAxLDMyLDQwLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDQsMzIsMTE1LDExNywxMDIsMTAyLDEwNSwxMjAsMTAxLDExNSw0MSw0NiwxMCwzMiwzMiwzMiwKLSAgICAzMiw0MSw3LDExNCwyMjUsMCwwLDAsMTE0LDE0NywwLDAsMCwyMTgsMTgsMTAxLAotICAgIDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsOTUsMTE1LDExNywxMDIsMTAyLDEwNSwxMjAsMTAxLAotICAgIDExNSwxMTQsMjE5LDAsMCwwLDExNCw4NiwwLDAsMCwxMTQsMjI0LDAsMCwwLAotICAgIDExNCw3NiwwLDAsMCw0MSwzLDkwLDEwLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwKLSAgICAxMTEsMTEwLDExNSw5MCw2LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTAsOCw5OCwxMjEsMTE2LAotICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNiwwLDAsMCwxMTQsMTYzLDAsMCwwLDY2LDUsMCwwLDExNSw4LDAsCi0gICAgMCwwLDAsNSwxOCwxLDEyLDEsMTIsMSwxMTQsMTYzLDAsMCwwLDk5LAotICAgIDEsMCwwLDAsMCwwLDAsMCwxMiwwLDAsMCwxMiwwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsNzAsMiwwLDAsMTI0LDAsMCw5NywwLDAsMTE2LAotICAgIDAsMCwxMDYsMSwwLDk3LDEsMCwxMTYsMCwwLDEwNiwyLDAsOTcsMiwKLSAgICAwLDExNiwxLDAsMTA2LDMsMCwxMTYsNCwwLDI1LDEyNSwxLDAsMTIwLDc2LAotICAgIDAsMTAwLDI2LDAsNjgsOTMsNjgsMCwxMjUsMiwwLDEyNCwyLDAsMTE2LDEsCi0gICAgMCwxMDYsMywwLDEwNyw3LDAsMTE0LDgzLDAsMTE2LDAsMCwxMDYsNSwwLAotICAgIDEyNCwyLDAsMTMxLDEsMCwxMjUsMywwLDExMCwxMywwLDExNiwxLDAsMTA2LAotICAgIDMsMCwxMjQsMiwwLDI1LDEyNSwzLDAsMTE2LDYsMCwxMjQsMSwwLDEyNCwKLSAgICAyLDAsMTI0LDMsMCwxMzEsMywwLDEsMTEzLDQ0LDAsODcsMTAwLDUsMCwKLSAgICAxMDAsNiwwLDEwMywxLDAsMTAyLDIsMCwxMDAsNywwLDEwMCw4LDAsMTAwLAotICAgIDYsMCwxMDMsMiwwLDEwMiwyLDAsMTAyLDIsMCwxMjUsNCwwLDEyMCwxNDksCi0gICAgMCwxMjQsNCwwLDY4LDkzLDEyOSwwLDkyLDIsMCwxMjUsNSwwLDEyNSw2LAotICAgIDAsMTE2LDcsMCwxMDAsOSwwLDEwMCwxMCwwLDEzMiwwLDAsMTI0LDYsMCwKLSAgICA2OCwxMzEsMSwwLDEzMSwxLDAsMTE1LDE5OSwwLDExNiw4LDAsMTMwLDEsMCwKLSAgICAxMjQsNiwwLDEwMCwxMSwwLDI1LDEyNSw3LDAsMTI0LDUsMCwxMTYsMSwwLAotICAgIDEwNiwzLDAsMTA3LDYsMCwxMTQsMjQxLDAsMTE2LDEsMCwxMDYsMywwLDEyNCwKLSAgICA1LDAsMjUsMTI1LDgsMCw4MCwxMTMsMTU2LDAsMTIxLDIwLDAsMTE2LDAsMCwKLSAgICAxMDYsNSwwLDEyNCw1LDAsMTMxLDEsMCwxMjUsOCwwLDgwLDg3LDExMywxNTYsCi0gICAgMCw0LDExNiw5LDAsMTA3LDEwLDAsMTE0LDI4LDEsMSwxLDEsMTE5LDE1NiwKLSAgICAwLDg5LDExMywxNTYsMCw4OCwxMTMsMTU2LDAsODcsMTE2LDksMCwxMDAsMTIsMCwKLSAgICAxMzEsMSwwLDEzMCwxLDAsMTE2LDYsMCwxMjQsMSwwLDEwMCwxMywwLDEyNCwKLSAgICA4LDAsMTMxLDMsMCwxLDExNiw2LDAsMTI0LDEsMCwxMDAsMTQsMCwxMjQsCi0gICAgNywwLDEzMSwzLDAsMSwxMTYsNiwwLDEyNCwxLDAsMTAwLDE1LDAsMTAwLAotICAgIDE2LDAsMTA2LDEwLDAsMTI0LDYsMCwxMzEsMSwwLDEzMSwzLDAsMSwxMjEsCi0gICAgMTksMCwxMTYsMCwwLDEwNiw1LDAsMTAwLDE3LDAsMTMxLDEsMCwxMjUsOSwKLSAgICAwLDg3LDExMCwyNCwwLDQsMTE2LDksMCwxMDcsMTAsMCwxMTQsMTQ3LDEsMSwKLSAgICAxLDEsMTAwLDE4LDAsMTI1LDksMCw4OSwxMTAsMSwwLDg4LDExNiw2LDAsCi0gICAgMTI0LDEsMCwxMDAsMTcsMCwxMjQsOSwwLDEzMSwzLDAsMSwxMTYsMCwwLAotICAgIDEwNiw1LDAsMTAwLDE5LDAsMTMxLDEsMCwxMjUsMTAsMCwxMTYsNiwwLDEyNCwKLSAgICAxLDAsMTAwLDE5LDAsMTI0LDEwLDAsMTMxLDMsMCwxLDEyNCw1LDAsMTAwLAotICAgIDcsMCwxMDcsMiwwLDExNCwyMzgsMSwxMTYsMCwwLDEwNiw1LDAsMTAwLDIwLAotICAgIDAsMTMxLDEsMCwxMjUsMTEsMCwxMTYsNiwwLDEyNCwxLDAsMTAwLDIxLDAsCi0gICAgMTI0LDExLDAsMTMxLDMsMCwxLDExNiw2LDAsMTI0LDEsMCwxMDAsMjIsMCwKLSAgICAxMTYsMTEsMCwxMzEsMCwwLDEzMSwzLDAsMSwxMTYsMTIsMCwxMDYsMTMsMCwKLSAgICAxMTYsMiwwLDEwNiwxNCwwLDEzMSwwLDAsMTMxLDEsMCwxLDEyNCw1LDAsCi0gICAgMTAwLDcsMCwxMDcsMiwwLDExNCw2NiwyLDExNiwxNSwwLDEwNiwxNiwwLDEwMCwKLSAgICAyMywwLDEzMSwxLDAsMSwxMDAsMjQsMCwxMTYsMTIsMCwxMDcsNiwwLDExNCwKLSAgICA2NiwyLDEwMCwyNSwwLDExNiwxNywwLDk1LDE4LDAsMTAwLDE4LDAsODMsNDEsCi0gICAgMjcsMTIyLDIwNSw4MywxMDEsMTE2LDExNywxMTIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwKLSAgICAxMDQsNDUsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwKLSAgICAxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiwKLSAgICA5OCwxMjEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA1LDExMCwxMDMsMzIsMTEwLDEwMSwxMDEsCi0gICAgMTAwLDEwMSwxMDAsMTAsMzIsMzIsMzIsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsMTA1LDExMCwxMDYsCi0gICAgMTAxLDk5LDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwxMDksMzIsMTA1LDExMCwxMTYsMTExLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwMywxMDgsMTExLDk4LDk3LDEwOCwzMiwxMTAsOTcsMTA5LDEwMSwKLSAgICAxMTUsMTEyLDk3LDk5LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OSwxMTYsMTA0LDEwMSwKLSAgICAxMTQsMzIsOTksMTExLDEwOSwxMTIsMTExLDExMCwxMDEsMTEwLDExNiwxMTUsMzIsOTcsMTE0LDEwMSwKLSAgICAzMiwxMDEsMTIwLDExNiwxMTQsOTcsOTksMTE2LDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDk5LDExMSwxMTQsMTAxLDMyLDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LAotICAgIDk3LDExMiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKLSAgICAxMTQsNTEsMCwwLDAsMTE0LDYyLDAsMCwwLDIxOCw4LDk4LDExNywxMDUsMTA4LAotICAgIDExNiwxMDUsMTEwLDExNSwxMTQsMTQ0LDAsMCwwLDkwLDUsMTEyLDExMSwxMTUsMTA1LDEyMCwKLSAgICAyNTAsMSw0NywyMTgsMiwxMTAsMTE2LDI1MCwxLDkyLDk5LDEsMCwwLDAsMCwKLSAgICAwLDAsMCwyLDAsMCwwLDMsMCwwLDAsMTE1LDAsMCwwLDExNSwKLSAgICAzMywwLDAsMCwxMjQsMCwwLDkzLDIzLDAsMTI1LDEsMCwxMTYsMCwwLAotICAgIDEyNCwxLDAsMTMxLDEsMCwxMDAsMCwwLDEwNywyLDAsODYsMSwxMTMsMywKLSAgICAwLDEwMCwxLDAsODMsNDEsMiwxMTQsMzEsMCwwLDAsNzgsNDEsMSwxMTQsCi0gICAgMzMsMCwwLDAsNDEsMiwxMTQsMjQsMCwwLDAsMTE0LDc5LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwKLSAgICAyMjgsMCwwLDAsMTAyLDUsMCwwLDExNSwyLDAsMCwwLDYsMCwxMjIsCi0gICAgMjUsOTUsMTE1LDEwMSwxMTYsMTE3LDExMiw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsCi0gICAgNDYsNjAsMTAzLDEwMSwxMTAsMTAxLDEyMCwxMTIsMTE0LDYyLDExNCw2MSwwLDAsMCwxMjIsCi0gICAgMzAsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiwxMTQsMTAxLDExMywxMTcsMTA1LAotICAgIDExNCwxMDEsMTE1LDMyLDExMiwxMTEsMTE1LDEwNSwxMjAsMzIsMTExLDExNCwzMiwxMTAsMTE2LDExNCwKLSAgICAzLDAsMCwwLDExNCwyNywwLDAsMCwxMTQsMjMsMCwwLDAsMTE0LDMyLAotICAgIDAsMCwwLDkwLDcsOTUsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCw3OCw5MCw4LDk1LAotICAgIDExOSwxMDEsOTcsMTA3LDExNCwxMDEsMTAyLDkwLDYsMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsMTE0LAotICAgIDE3MSwwLDAsMCwxMTQsNywwLDAsMCwxMjIsNCw0NiwxMTIsMTIxLDExOSwxMjIsCi0gICAgNiw5NSwxMDAsNDYsMTEyLDEyMSwxMDAsODQsNDEsNCwxMjIsMyw5NSwxMDUsMTExLDEyMiwKLSAgICA5LDk1LDExOSw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDExNSwxMjIsOCw5OCwxMTcsMTA1LDEwOCwKLSAgICAxMTYsMTA1LDExMCwxMTUsMTIyLDcsMTA5LDk3LDExNCwxMTUsMTA0LDk3LDEwOCw0MSwxOSwxMTQsCi0gICAgMTIzLDAsMCwwLDExNCw4LDAsMCwwLDExNCwxNDcsMCwwLDAsMTE0LDI0MCwKLSAgICAwLDAsMCwxMTQsMTE0LDAsMCwwLDkwLDE4LDk1LDk4LDExNywxMDUsMTA4LDExNiwKLSAgICAxMDUsMTEwLDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMTAsOTcsMTA5LDEwMSwxMTQsMTE4LDAsMCwKLSAgICAwLDIxOCwzLDk3LDEwOCwxMDgsMjE4LDE0LDY1LDExNSwxMTUsMTAxLDExNCwxMTYsMTA1LDExMSwKLSAgICAxMTAsNjksMTE0LDExNCwxMTEsMTE0LDExNCwxMDksMCwwLDAsMTE0LDI4LDAsMCwwLAotICAgIDExNCwxMywwLDAsMCwxMTQsMjMwLDAsMCwwLDExNCwxNTEsMCwwLDAsMTE0LAotICAgIDI2LDEsMCwwLDExNCw4NiwwLDAsMCwxMTQsMTY1LDAsMCwwLDExNCwxNzAsCi0gICAgMCwwLDAsMTE0LDE3NCwwLDAsMCw0MSwxMiwyMTgsMTcsOTUsOTgsMTExLDExMSwKLSAgICAxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDExLDExNSwKLSAgICAxMDEsMTA4LDEwMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMiw5OCwxMTcsMTA1LDEwOCwKLSAgICAxMTYsMTA1LDExMCw5NSwxMTAsOTcsMTA5LDEwMSw5MCwxNCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LAotICAgIDExMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMCwxMTEsMTE1LDk1LDEwMCwxMDEsMTE2LAotICAgIDk3LDEwNSwxMDgsMTE1LDkwLDEwLDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExMSwxMTUsCi0gICAgMTE0LDIzLDAsMCwwLDExNCwyNywwLDAsMCw5MCw5LDExMSwxMTUsOTUsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTMsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCw5NSwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSw5MCwxNCwxMTksMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5NSwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSw5MCwxMywxMTksMTA1LDExMCwxMTQsMTAxLDEwMyw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAotICAgIDAsMCwyMTgsNiw5NSwxMTUsMTAxLDExNiwxMTcsMTEyLDc3LDUsMCwwLDExNSw4MiwKLSAgICAwLDAsMCwwLDgsNiwxLDksMSw5LDMsMTMsMSwxMywxLDE1LAotICAgIDEsMTgsMiwxMywxLDIwLDMsMzMsMSwxOSwyLDMxLDEsMTAsMSwxNSwKLSAgICAxLDEzLDEsNCwyLDMsMSwxNSwxLDUsMSwxMywxLDEyLDIsMTIsCi0gICAgMSwxNiwxLDE2LDEsMjUsMywzLDEsMTksMSwxMywyLDExLDEsMTYsCi0gICAgMywxNSwxLDE2LDMsMTIsMSwxNSwxLDE2LDMsMTksMSwxOSwxLDEyLAotICAgIDEsMTMsMSwxMiwxLDExNCwzNCwxLDAsMCw5OSwxLDAsMCwwLDAsCi0gICAgMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwKLSAgICAxMTYsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLDEzMSwxLDAsMSwxMTYsMSwKLSAgICAwLDEzMSwwLDAsMTI1LDEsMCwxMTYsMiwwLDEwNiwzLDAsMTA2LDQsMCwKLSAgICAxMTYsNSwwLDEwNiw2LDAsMTI0LDEsMCwxNDAsMCwwLDEwMywxLDAsMTMxLAotICAgIDEsMCwxLDExNiw3LDAsMTA2LDgsMCwxMDAsMSwwLDEwNywyLDAsMTE0LAotICAgIDc4LDAsMTE2LDIsMCwxMDYsOSwwLDEwNiwxMCwwLDExNiwxMSwwLDEzMSwxLAotICAgIDAsMSwxMTYsMiwwLDEwNiw5LDAsMTA2LDEwLDAsMTE2LDEyLDAsMTMxLDEsCi0gICAgMCwxLDExNiw1LDAsMTI0LDAsMCw5NSw1LDAsMTE2LDEzLDAsMTI0LDAsCi0gICAgMCw5NSwxMywwLDEwMCwyLDAsODMsNDEsMywxMjIsNDEsNzMsMTEwLDExNSwxMTYsCi0gICAgOTcsMTA4LDEwOCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCw0NSw5OCw5NywxMTUsCi0gICAgMTAxLDEwMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiw5OSwxMTEsMTA5LDExMiwxMTEsMTEwLAotICAgIDEwMSwxMTAsMTE2LDExNSw0NiwxMTQsMjksMSwwLDAsNzgsNDEsMTQsMTE0LDM0LDEsCi0gICAgMCwwLDExNCwxNjMsMCwwLDAsMTE0LDgsMCwwLDAsMTE0LDI1NSwwLDAsCi0gICAgMCwxMTQsMTUxLDAsMCwwLDExNCw3LDEsMCwwLDExNCwyMCwxLDAsMCwKLSAgICAxMTQsMywwLDAsMCwxMTQsMTE0LDAsMCwwLDIxOCw5LDEwOSwxMDEsMTE2LDk3LAotICAgIDk1LDExMiw5NywxMTYsMTA0LDExNCwxNjUsMCwwLDAsMTE0LDE3MCwwLDAsMCwxMTQsCi0gICAgMjUwLDAsMCwwLDExNCwyMTksMCwwLDAsNDEsMiwxMTQsMzMsMSwwLDAsCi0gICAgOTAsMTcsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsOTUsMTA4LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCwxMTUsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKLSAgICAwLDAsMjE4LDgsOTUsMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMTQ1LDUsMCwwLAotICAgIDExNSwxNiwwLDAsMCwwLDIsMTAsMSw5LDEsMjgsMSwxNSwxLDE2LAotICAgIDEsMTYsNCw5LDEsMTE0LDM2LDEsMCwwLDQxLDEsMTIyLDMsMTE5LDEwNSwKLSAgICAxMTAsNDEsMiwxMTQsMSwwLDAsMCwxMTQsMiwwLDAsMCw0MSw1OSwxMTQsCi0gICAgMTE2LDAsMCwwLDExNCwxMiwwLDAsMCw5MCwzNyw5NSw2Nyw2NSw4Myw2OSwKLSAgICA5NSw3Myw3OCw4Myw2OSw3OCw4Myw3Myw4NCw3Myw4Niw2OSw5NSw4MCw3Niw2NSwKLSAgICA4NCw3MCw3OSw4Miw3Nyw4Myw5NSw2Niw4OSw4NCw2OSw4Myw5NSw3NSw2OSw4OSwKLSAgICAxMTQsMTEsMCwwLDAsMTE0LDEzLDAsMCwwLDExNCwxOSwwLDAsMCwxMTQsCi0gICAgMjEsMCwwLDAsMTE0LDMwLDAsMCwwLDExNCw0MCwwLDAsMCwxMTQsNDEsCi0gICAgMCwwLDAsMTE0LDQ1LDAsMCwwLDExNCw0NiwwLDAsMCwxMTQsNDgsMCwKLSAgICAwLDAsMTE0LDU3LDAsMCwwLDIxOCw0LDExNiwxMjEsMTEyLDEwMSwyMTgsOCw5NSwKLSAgICA5NSw5OSwxMTEsMTAwLDEwMSw5NSw5NSwxMTQsMTQ2LDAsMCwwLDExNCwxNywwLDAsCi0gICAgMCwxMTQsMTM3LDAsMCwwLDExNCwxNiwwLDAsMCwxMTQsMjAsMCwwLDAsCi0gICAgOTAsMTcsOTUsODIsNjUsODcsOTUsNzcsNjUsNzEsNzMsNjcsOTUsNzgsODUsNzcsCi0gICAgNjYsNjksODIsMTE0LDc1LDAsMCwwLDExNCw3NCwwLDAsMCwxMTQsODYsMCwKLSAgICAwLDAsMTE0LDc2LDAsMCwwLDkwLDIzLDY4LDY5LDY2LDg1LDcxLDk1LDY2LAotICAgIDg5LDg0LDY5LDY3LDc5LDY4LDY5LDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLAotICAgIDkwLDI3LDc5LDgwLDg0LDczLDc3LDczLDkwLDY5LDY4LDk1LDY2LDg5LDg0LDY5LAotICAgIDY3LDc5LDY4LDY5LDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLDExNCw4MSwwLAotICAgIDAsMCwxMTQsODcsMCwwLDAsMTE0LDkzLDAsMCwwLDExNCw5NywwLDAsCi0gICAgMCwxMTQsOTksMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTI1LDAsMCwwLAotICAgIDExNCwxMzIsMCwwLDAsMTE0LDE0MywwLDAsMCwxMTQsMTQ5LDAsMCwwLDExNCwKLSAgICAxNTIsMCwwLDAsMTE0LDE1NywwLDAsMCwyMTgsNiwxMTEsOTgsMTA2LDEwMSw5OSwKLSAgICAxMTYsMTE0LDE2NCwwLDAsMCwxMTQsMTY5LDAsMCwwLDExNCwxNzAsMCwwLDAsCi0gICAgMTE0LDE4NSwwLDAsMCwxMTQsMTk1LDAsMCwwLDExNCwyMTEsMCwwLDAsMTE0LAotICAgIDIxOSwwLDAsMCwxMTQsMjI0LDAsMCwwLDExNCwyMzAsMCwwLDAsMTE0LDIyNSwKLSAgICAwLDAsMCwxMTQsMjMxLDAsMCwwLDExNCwyNDgsMCwwLDAsMTE0LDI1MCwwLAotICAgIDAsMCwxMTQsNywxLDAsMCwxMTQsMjUsMSwwLDAsMTE0LDE2MywwLDAsCi0gICAgMCwxMTQsMzQsMSwwLDAsMTE0LDM2LDEsMCwwLDExNCw0LDAsMCwwLAorICAgIDAsMTE0LDE3OSwwLDAsMCwxNDYsNCwwLDAsMTE1LDgsMCwwLDAsMCwKKyAgICA4LDEyLDEsOCwxLDQsMSwxMjIsMjIsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLAorICAgIDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MSwKKyAgICAxLDc4LDQxLDIsNzgsNzgsNDEsMSw3OCw0MSwxMiwxMTQsMTA5LDAsMCwwLAorICAgIDExNCwxMDgsMCwwLDAsMTE0LDExMCwwLDAsMCwxMTQsMTExLDAsMCwwLDExNCwKKyAgICAxODAsMCwwLDAsMTE0LDI0OSwwLDAsMCwxMTQsMjU0LDAsMCwwLDExNCwwLAorICAgIDEsMCwwLDExNCwxLDEsMCwwLDExNCw0LDEsMCwwLDExNCwxNzgsMCwKKyAgICAwLDAsMTE0LDE3OSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjQ4LDAsMCwwLAorICAgIDI4LDQsMCwwLDExNSwyMiwwLDAsMCw4LDIsNCwyLDEyLDgsMTIsCisgICAgMTMsMTIsMjIsMTIsMTUsMiwxLDEyLDMxLDIsMSwxMiwyMywyLDEsMTE0LAorICAgIDI0OCwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwzLDAsMCwwLDY0LDAsMCwwLDExNSw5MCwwLDAsMCwxMDEsMCwKKyAgICA5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDAsMiwxMDAsMywxMzIsMCwKKyAgICA5MCw0LDEwMCw0LDEwMCw1LDEzMiwwLDkwLDUsMTAxLDYsOTAsNywxMDAsNiwKKyAgICAxMDAsNywxMzIsMCw5MCw4LDEwMCw4LDEwMCw5LDEzMiwwLDkwLDksMTAwLDE5LAorICAgIDEwMCwxMSwxMDAsMTIsMTMyLDEsOTAsMTAsMTAwLDEzLDEwMCwxNCwxMzIsMCw5MCwxMSwKKyAgICAxMDEsMTIsMTAwLDE1LDEwMCwxNiwxMzIsMCwxMzEsMSw5MCwxMywxMDAsMTcsMTAwLDE4LAorICAgIDEzMiwwLDkwLDE0LDEwMCwxMCw4MywwLDQxLDIwLDIxOCwxMCw3MCwxMDUsMTA4LDEwMSwKKyAgICA3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiwxNzIsNzAsMTA1LDEwOCwxMDEsNDUsOTgsOTcsMTE1LAorICAgIDEwMSwxMDAsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgNzMsMTEwLDExNiwxMDEsMTE0LDk3LDk5LDExNiwxMDUsMTExLDExMCwxMTUsMzIsMTE5LDEwNSwxMTYsCisgICAgMTA0LDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTUsMTIxLDExNSwxMTYsMTAxLAorICAgIDEwOSwzMiw5NywxMTQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsMTAwLDMyLDEwMiwxMTEsMTE0LAorICAgIDMyLDExMiwxMDEsMTE0LDEwMiwxMTEsMTE0LDEwOSw5NywxMTAsOTksMTAxLDQ0LDMyLDk4LDEwMSwKKyAgICAxMDUsMTEwLDEwMywxMCwzMiwzMiwzMiwzMiwxMTQsMTAxLDEwMiwxMTQsMTAxLDExNSwxMDQsMTAxLAorICAgIDEwMCwzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LAorICAgIDExNiwxMTEsMTE0LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwKKyAgICAxMDUsMTE1LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDUsMTEwLDEwMywzMiwxMDQsOTcsMTE1LDMyLAorICAgIDk4LDEwMSwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDEwNSwxMDIsMTA1LDEwMSwxMDAsNDYsMTAsMTAsCisgICAgMzIsMzIsMzIsMzIsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLAorICAgIDAsNSwwLDAsMCw3LDAsMCwwLDExNSw4OCwwLDAsMCwxMDMsMCwKKyAgICAxMjUsMywxMjAsNDAsMTI0LDIsNjgsMCw5MywzMiw5MiwyLDEzNywwLDEyNSw0LAorICAgIDEyNCwzLDEwNiwwLDEzNSwwLDEwMiwxLDEwMCwxLDEwMCwyLDEzMiw4LDEyNCw0LAorICAgIDY4LDAsMTMxLDEsMTMxLDEsMSwwLDExMywxMCw4NywwLDEyNCwzLDEyNCwwLAorICAgIDk1LDEsMTI0LDEsMTEyLDU4LDEwMCwzLDEyNCwwLDk1LDIsMTAwLDYsMTI0LDAsCisgICAgOTUsMywxMTYsNCwxMzEsMCwxMjQsMCw5NSw1LDExNiw0LDEzMSwwLDEyNCwwLAorICAgIDk1LDYsMTAwLDUsODMsMCw0MSw3LDEyMiwxNTQsNzMsMTEwLDEwNSwxMTYsMTA1LDk3LAorICAgIDEwOCwxMDUsMTIyLDEwMSwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LAorICAgIDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTUsMTAxLDk3LDExNCw5OSwxMDQsMzIsMTExLDExMCwzMiwKKyAgICA5NywxMTAsMTAwLDMyLDk3LDMyLDExOCw5NywxMTQsMTA1LDk3LDk4LDEwOCwxMDEsMzIsMTEwLAorICAgIDExNywxMDksOTgsMTAxLDExNCwzMiwxMTEsMTAyLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDUwLDQ1LDExNiwxMTcsMTEyLDEwOCwxMDEsMTE1LDMyLDk5LDExMSwxMTAsMTE2LDk3LDEwNSwKKyAgICAxMTAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwKKyAgICA5NywxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTUsMTE3LDEwMiwKKyAgICAxMDIsMTA1LDEyMCwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDEwMSw5OSwxMTEsMTAzLDExMCwxMDUsCisgICAgMTIyLDEwMSwxMTUsNDYsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLAorICAgIDAsMywwLDAsMCw1MSwwLDAsMCwxMTUsMjIsMCwwLDAsMTI0LDAsCisgICAgOTMsMTQsMTI1LDEsMTI0LDEsMTM2LDAsMTAyLDIsODYsMCwxLDAsMTEzLDIsCisgICAgMTAwLDAsODMsMCw0MSwxLDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDI0LAorICAgIDAsMCwwLDExNCwyMjIsMCwwLDAsNDEsMSwxMTQsMTI0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMjQsMCwwLDAsMTc1LDQsCisgICAgMCwwLDExNSwyLDAsMCwwLDQsMCwxMjIsMzgsNzAsMTA1LDEwOCwxMDEsNzAsCisgICAgMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsNDYsNjAsCisgICAgMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCwKKyAgICA2MiwxMTQsNjEsMCwwLDAsMTE0LDMxLDAsMCwwLDc4LDExNCw5MSwwLDAsCisgICAgMCw0MSw3LDExNCwxNDcsMCwwLDAsMjE4LDgsOTUsMTA4LDExMSw5NywxMDAsMTAxLAorICAgIDExNCwxMTUsMTE0LDM3LDAsMCwwLDIxOCwxMSw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDksCisgICAgMTE2LDEwNSwxMDksMTAxLDIxOCwzLDExNSwxMDEsMTE2LDIxOCwxMSw5NSwxMTIsOTcsMTE2LDEwNCwKKyAgICA5NSw5OSw5Nyw5OSwxMDQsMTAxLDIxOCwxOSw5NSwxMTQsMTAxLDEwOCw5NywxMjAsMTAxLDEwMCwKKyAgICA5NSwxMTIsOTcsMTE2LDEwNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQxLDUsMTE0LDEwNCwwLAorICAgIDAsMCwxMTQsMzcsMCwwLDAsMjE4LDE0LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTUsCisgICAgMTAwLDEwMSwxMTYsOTcsMTA1LDEwOCwxMTUsOTAsNywxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwKKyAgICAxMTQsMTY0LDAsMCwwLDExNCw0LDAsMCwwLDQxLDEsMTE0LDEyNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwxMTQsMTgyLDAsMCwwLDE2OSw0LDAsMCwxMTUsCisgICAgMTYsMCwwLDAsMCw0LDQsMSwxNCwxLDI4LDEsNiwyLDEwLDEsCisgICAgNiwxLDgsMSwxMjIsMTksNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwKKyAgICA0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsCisgICAgMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTAsCisgICAgMCwwLDAsMTAwLDMsMTI0LDAsOTUsMCwxMDAsMiw4MywwLDQxLDQsMTIyLAorICAgIDMxLDczLDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICAxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTIxLDMyLDEwOSwxMTYsMTA1LDEwOSwxMDEsNDYsCisgICAgMTE0LDMxLDAsMCwwLDc4LDExNCw5MSwwLDAsMCw0MSwxLDExNCw3LDEsCisgICAgMCwwLDQxLDEsMTE0LDEwNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjQ5LDAsMCwwLDE4Myw0LDAsCisgICAgMCwxMTUsMiwwLDAsMCwwLDIsMTIyLDI4LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwKKyAgICAxMTAsMTAwLDEwMSwxMTQsNDYsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSwKKyAgICA5OSw5Nyw5OSwxMDQsMTAxLDExNSw5OSwyLDAsMCwwLDAsMCwwLDAsMywKKyAgICAwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSw0MiwwLDAsMCwKKyAgICAxMjQsMCwxMDYsMCwxMjQsMSwxMzEsMSwxMjUsMiwxMjQsMiwxMDAsMSwxMDcsOCwKKyAgICAxMTQsMjYsMTAwLDEsMTAzLDAsMTAyLDIsODMsMCwxMjQsMiwxMDYsMSwxMjQsMiwKKyAgICAxMDYsMiwxMTIsMzgsMTAzLDAsMTAyLDIsODMsMCw0MSwyLDEyMiwxOTcsODQsMTE0LAorICAgIDEyMSwzMiwxMTYsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiw5NywzMiwxMDgsMTExLDk3LDEwMCwKKyAgICAxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwKKyAgICAxMDIsMTA1LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTExLDExNCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwxMCwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTEyLDExMSwKKyAgICAxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSw0NiwzMiw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwKKyAgICA0MCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ0LDMyLDEwOCwxMDUsMTE1LDExNiw0NSwxMTEsMTAyLAorICAgIDQ1LDExMiwxMTEsMTE0LDExNiwxMDUsMTExLDExMCwxMTUsNDEsNDYsMTAsMTAsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsCisgICAgMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLAorICAgIDMyLDg1LDExNSwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLAorICAgIDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDc4LDQxLDMsMTE0LDE3OCwwLDAsMCwxMTQsMTI0LDAsMCwwLAorICAgIDExNCwxNTQsMCwwLDAsNDEsMywxMTQsMTA0LDAsMCwwLDExNCwxMjMsMCwwLAorICAgIDAsMTE0LDE2MiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNiwwLDAsMCwxMTQsMTIxLDAsMCwwLDE4OSw0LDAsMCwxMTUsOCwKKyAgICAwLDAsMCwwLDcsMTAsMSw4LDEsOCwxLDEyMiwyMiw3MCwxMDUsMTA4LAorICAgIDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDgsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDk5LDYsMCwwLDAsMCwwLDAsMCw3LDAsMCwwLAorICAgIDYsMCwwLDAsNjcsMCwwLDAsMTE1LDI2LDAsMCwwLDEyNCwxLDEyNCwKKyAgICAyLDEyNCwzLDEzMSwyLDEyNSw2LDExNiwwLDEyNCwyLDEyNCwzLDEyNCw2LDEyNCwKKyAgICA0LDEwMCwxLDE0MSw0LDgzLDAsNDEsMiw3OCw0MSwyLDExNCwxMjQsMCwwLAorICAgIDAsMTE0LDE1NCwwLDAsMCw0MSwxLDExNCwxNjUsMCwwLDAsNDEsNywxMTQsCisgICAgMTA0LDAsMCwwLDExNCwxNjMsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMzcsCisgICAgMCwwLDAsOTAsNCwxMTUsMTA5LDExNSwxMDgsMTE0LDE3NywwLDAsMCwxMTQsMTI0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsCisgICAgMCwwLDExNCw0LDEsMCwwLDIwMSw0LDAsMCwxMTUsNiwwLDAsMCwKKyAgICAwLDEsMTAsMSw4LDEsMTIyLDIwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMTQsNDYsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksNzgsOTksMywwLAorICAgIDAsMCwwLDAsMCwwLDE0LDAsMCwwLDE1LDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSw5OCwxLDAsMCwxMDAsMSwxMjUsMywxMjQsMSwxMDYsMCwxMDAsCisgICAgMiwxMzEsMSwxMDAsMywyNSwwLDEyNSw0LDEyMSwyNCwxMTYsMSwxMjQsMCwxMDYsCisgICAgMiwxMTIsMzQsMTE2LDMsMTA2LDQsMTMxLDAsMTMxLDEsMTA2LDUsMTI1LDUsODcsCisgICAgMCwxMTAsMjQsNCwwLDExNiw2LDEwNywxMCwxMTQsNjYsMSwwLDEsMCwxLAorICAgIDAsMTAwLDEwLDEyNSw1LDg5LDAsMTEwLDIsODgsMCwxMjQsNSwxMjQsMCwxMDYsCisgICAgNywxMDcsMywxMTQsOTIsMTI0LDAsMTA2LDgsMTMxLDAsMSwwLDEyNCw1LDEyNCwKKyAgICAwLDk1LDcsMTE2LDksMTMxLDAsMTE0LDExNCwxMjQsMCwxMDYsMTAsMTI1LDYsMTI0LAorICAgIDQsMTA2LDExLDEzMSwwLDEyNSw3LDExMCwxMCwxMjQsMCwxMDYsMTIsMTI1LDYsMTI0LAorICAgIDQsMTI1LDcsMTI0LDcsMTI0LDYsMTA3LDYsMTE0LDIxOCwxMTYsMTMsMTI0LDAsMTA2LAorICAgIDIsMTI0LDQsMTMxLDIsMTI1LDgsMTIwLDcyLDEyNCwwLDEwNiwxNCw2OCwwLDkzLAorICAgIDU0LDkyLDIsMTI1LDksMTI1LDEwLDEwMCw1LDEyNCw5LDIzLDAsMTI1LDExLDExNiwKKyAgICAxMywxMjQsOCwxMjQsMTEsMTMxLDIsMTI1LDEyLDExNiwxNSwxMjQsMTIsMTMxLDEsMTE0LAorICAgIDE1MiwxMjQsMCwxMDYsMTYsMTI0LDEwLDEyNCwxLDEyNCwxMiwxMjQsOCwxMDMsMSwxMjQsCisgICAgMiwxMzEsNSw4MywwLDExMywxNTIsODcsMCwxMTYsMTcsMTI0LDgsMTMxLDEsMTI1LAorICAgIDMsMTIwLDg4LDEyNCwwLDEwNiwxNCw2OCwwLDkzLDc4LDkyLDIsMTI1LDksMTI1LAorICAgIDEwLDExNiwxMywxMjQsMCwxMDYsMiwxMjQsNCwxMjQsOSwyMywwLDEzMSwyLDEyNSwKKyAgICAxMiwxMTYsMTgsMTA2LDE5LDEwMCw2LDEyNCwxMiwxMDAsMywxMDAsNywxNDEsMywxLAorICAgIDAsMTI0LDcsMTI0LDksMjMsMCwxMjQsNiwxMDcsNiwxMTQsMjI2LDExNiwxNSwxMjQsCisgICAgMTIsMTMxLDEsMTE0LDIyNiwxMjQsMCwxMDYsMTYsMTI0LDEwLDEyNCwxLDEyNCwxMiwxMDAsCisgICAgOCwxMjQsMiwxMzEsNSw4MywwLDExMywyMjYsODcsMCwxMjQsMywxNDQsMSwxMTQsCisgICAgOTQsMTE2LDE4LDEwNiwxOSwxMDAsOSwxMjQsOCwxMzEsMiwxLDAsMTE2LDE4LDEwNiwKKyAgICAyMCwxMjQsMSwxMDAsOCwxMzEsMiwxMjUsMTMsMTI0LDgsMTAzLDEsMTI0LDEzLDk1LAorICAgIDIxLDEyNCwxMyw4MywwLDEwMCw4LDgzLDAsNDEsMTEsMTIyLDExMSw4NCwxMTQsMTIxLAorICAgIDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDExNSwxMTIsMTAxLDk5LDMyLAorICAgIDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwKKyAgICAxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsODIsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAorICAgIDk3LDExNiw5OSwxMDQsMTA1LDExMCwxMDMsMzIsMTE1LDExMiwxMDEsOTksNDQsMzIsMTExLDExNCwKKyAgICAzMiw3OCwxMTEsMTEwLDEwMSwzMiwxMDUsMTAyLDMyLDExMCwxMTEsMTE2LDMyLDEwMiwxMTEsMTE3LAorICAgIDExMCwxMDAsNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzAsMTE0LDYxLDAsCisgICAgMCwwLDExNCw1OSwwLDAsMCwxMTQsMzEsMCwwLDAsMTE0LDE4MiwwLDAsCisgICAgMCwxMjIsOSwxMTYsMTE0LDEyMSwxMDUsMTEwLDEwMywzMiwxMjMsMTI1LDQxLDEsOTAsOSwKKyAgICAxMTgsMTAxLDExNCw5OCwxMTEsMTE1LDEwNSwxMTYsMTIxLDc4LDEyMiwyNSwxMTIsMTExLDExNSwxMTUsCisgICAgMTA1LDk4LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsMzIsMTAyLAorICAgIDExMSwxMTQsMzIsMTIzLDEyNSwxMTQsOTEsMCwwLDAsNDEsMjIsMTE0LDM0LDAsMCwKKyAgICAwLDExNCw0MSwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDMsMCwwLDAsCisgICAgMTE0LDQ3LDAsMCwwLDExNCwyMTYsMCwwLDAsMTE0LDQyLDAsMCwwLDExNCwKKyAgICA3LDEsMCwwLDIxOCwxMSw5NSwxMDIsMTA1LDEwOCwxMDgsOTUsOTksOTcsOTksMTA0LAorICAgIDEwMSwxMTQsNywwLDAsMCwxMTQsMTAsMSwwLDAsMTE0LDkyLDAsMCwwLAorICAgIDExNCw5LDEsMCwwLDExNCwzMCwwLDAsMCwxMTQsNiwxLDAsMCwxMTQsCisgICAgNDYsMCwwLDAsMTE0LDQsMSwwLDAsMTE0LDQ4LDAsMCwwLDExNCwxMTgsCisgICAgMCwwLDAsMTE0LDEzMywwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCwxNTQsMCwKKyAgICAwLDAsNDEsMTQsMTE0LDEwNCwwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCwxNzcsCisgICAgMCwwLDAsOTAsMTIsMTA1LDExNSw5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LAorICAgIDEwMSw5MCwxMSwxMTYsOTcsMTA1LDEwOCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTMwLAorICAgIDAsMCwwLDkwLDUsOTksOTcsOTksMTA0LDEwMSw5MCwxMiw5OSw5Nyw5OSwxMDQsCisgICAgMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDksOTgsOTcsMTE1LDEwMSw5NSwxMTIsCisgICAgOTcsMTE2LDEwNCwxMTQsMjIyLDAsMCwwLDExNCwxNjMsMCwwLDAsOTAsMTMsMTA1LAorICAgIDExMCwxMDUsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw5MCw5LDEwMiwxMTcsCisgICAgMTA4LDEwOCw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMTYyLDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxNzgsMCwwLDAsCisgICAgMjA2LDQsMCwwLDExNSw3MCwwLDAsMCwwLDUsNCwxLDE0LDEsMiwKKyAgICAxLDI0LDEsMTQsMSwxMCwxLDEwLDEsOCwxLDYsMiw2LDEsNiwKKyAgICAxLDEwLDIsNiwxLDQsMiw4LDEsMTIsMSwxNiwxLDgsMSwxMCwKKyAgICAxLDgsMSwyNCw0LDgsMiwxNiwxLDE2LDEsMTYsMSwxMiwxLDgsCisgICAgMSwxMCwxLDEyLDEsNiwxLDEyLDEsMTIsMSw4LDEsNCwxLDEyMiwKKyAgICAyMCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCwKKyAgICA5NSwxMTUsMTEyLDEwMSw5OSw5OSwxLDAsMCwwLDAsMCwwLDAsOSwwLAorICAgIDAsMCwxMywwLDAsMCw2NywwLDAsMCwxMTUsMTk0LDAsMCwwLDEyNCwKKyAgICAwLDEwNiwwLDEyNSwxLDEyMSwyMiwxMTYsMSwxMDYsMiwxMjQsMSwxMTIsMjIsMTE2LAorICAgIDEsMTA2LDMsMTMxLDAsMTMxLDEsMTI1LDIsODcsMCwxMTAsMzAsNCwwLDExNiwKKyAgICA0LDExNiw1LDExNiw2LDEwMiwzLDEwNywxMCwxMTQsNTgsMSwwLDEsMCwxLAorICAgIDAsMTAzLDAsMTI1LDIsODksMCwxMTAsMiw4OCwwLDExNiw3LDEwNiw4LDEwNiwKKyAgICA5LDEwMCwxLDEzMSwxLDExNSw4NCwxMTYsMTAsMTI0LDIsMTMxLDEsMTI0LDAsOTUsCisgICAgMTEsMTEwLDc4LDExNiwxMCwxMzEsMCwxMjUsMywxMjAsNjQsMTI0LDIsNjgsMCw5MywKKyAgICA1NiwxMjUsNCwxMjQsNCwxMDYsMTIsMTAwLDIsMTMxLDEsOTIsMywxMjUsNSwxMjUsCisgICAgNiwxMjUsNywxMjQsNiwxMTQsMTM4LDEwMCwzLDEwNiwxMywxMjQsNSwxMjQsNywxMDYsCisgICAgMTQsMTMxLDAsMTMxLDIsMTI1LDgsMTEwLDQsMTI0LDUsMTI1LDgsMTI0LDMsMTA2LAorICAgIDE1LDEyNCw4LDEzMSwxLDEsMCwxMTMsOTYsODcsMCwxMjQsMywxMjQsMCw5NSwKKyAgICAxMSwxMTYsNywxMDYsOCwxMDYsOSwxMTYsMTYsMTMxLDEsMTE0LDE5MCwxMDAsNCwxMDAsCisgICAgNSwxMzIsMCwxMjQsMiw2OCwwLDEzMSwxLDEyNCwwLDk1LDE3LDEwMCw2LDgzLAorICAgIDAsNDEsNywxMjIsNjgsNzAsMTA1LDEwOCwxMDgsMzIsMTE2LDEwNCwxMDEsMzIsOTksOTcsCisgICAgOTksMTA0LDEwMSwzMiwxMTEsMTAyLDMyLDExMiwxMTEsMTE2LDEwMSwxMTAsMTE2LDEwNSw5NywxMDgsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsMTEyLDk3LDk5LAorICAgIDEwNyw5NywxMDMsMTAxLDExNSwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTAwLAorICAgIDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSw0NiwxMTQsMCwwLDAsMCwxMTQsNjEsCisgICAgMCwwLDAsMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LDk5LDEsMCwwLDAsMCwKKyAgICAwLDAsMCwyLDAsMCwwLDMsMCwwLDAsODMsMCwwLDAsMTE1LAorICAgIDIwLDAsMCwwLDEwNCwwLDEyNCwwLDkzLDEyLDEyNSwxLDEyNCwxLDEwNiwwLAorICAgIDEzMSwwLDE0NiwyLDExMyw0LDgzLDAsMTE0LDQsMCwwLDAsNDEsMSwxMTQsCisgICAgOTIsMCwwLDAsNDEsMiwxMTQsMjQsMCwwLDAsOTAsMiwxMDIsMTEwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDI1MCw5LAorICAgIDYwLDExNSwxMDEsMTE2LDk5LDExMSwxMDksMTEyLDYyLDI3LDUsMCwwLDExNSwyLDAsCisgICAgMCwwLDYsMCwxMjIsNDEsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwKKyAgICA0Niw5NSwxMDIsMTA1LDEwOCwxMDgsOTUsOTksOTcsOTksMTA0LDEwMSw0Niw2MCwxMDgsMTExLAorICAgIDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTE1LDEwMSwxMTYsOTksMTExLDEwOSwxMTIsNjIsNzgsCisgICAgNDEsMTgsMTE0LDM3LDAsMCwwLDExNCwzLDAsMCwwLDkwLDcsMTA4LDEwNSwKKyAgICAxMTUsMTE2LDEwMCwxMDUsMTE0LDExNCw0NywwLDAsMCwxMTQsMjU1LDAsMCwwLDIxOCwKKyAgICAxNSw4MCwxMDEsMTE0LDEwOSwxMDUsMTE1LDExNSwxMDUsMTExLDExMCw2OSwxMTQsMTE0LDExMSwxMTQsCisgICAgMjE4LDE4LDc4LDExMSwxMTYsNjUsNjgsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTIxLDY5LAorICAgIDExNCwxMTQsMTExLDExNCwxMTQsOCwwLDAsMCwxMTQsOSwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDgsMSwwLDAsMTE0LDksMSwwLDAsMTE0LDg3LDAsCisgICAgMCwwLDExNCw1MCwwLDAsMCwxMTQsOTIsMCwwLDAsMjE4LDMsOTcsMTAwLAorICAgIDEwMCwxMTQsMTEsMCwwLDAsMTE0LDEwLDEsMCwwLDQxLDksMTE0LDEwNCwwLAorICAgIDAsMCwxMTQsMzcsMCwwLDAsOTAsOCw5OSwxMTEsMTEwLDExNiwxMDEsMTEwLDExNiwKKyAgICAxMTUsOTAsMjEsMTA4LDExMSwxMTksMTAxLDExNCw5NSwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCw5NSwKKyAgICA5OSwxMTEsMTEwLDExNiwxMDEsMTEwLDExNiwxMTUsMTE0LDI0NCwwLDAsMCwxMTQsMTAyLDAsCisgICAgMCwwLDExNCwyMzQsMCwwLDAsMTE0LDIyMiwwLDAsMCw5MCw4LDExMCwxMDEsCisgICAgMTE5LDk1LDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw2LDAsMCwwLDExNCwxMiwxLDAsMCwyNTQsNCwwLDAsMTE1LDM0LAorICAgIDAsMCwwLDAsMiw2LDEsMiwxLDIyLDEsMjAsMywxMCwzLDEyLAorICAgIDEsMTIsNyw2LDEsMTAsMSwxNiwxLDQsMSwxOCwyLDQsMSwxNCwKKyAgICAxLDYsMSwxMiwxLDEyMiwyMiw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDQ2LDk1LDEwMiwxMDUsMTA4LDEwOCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk5LDEsMCwKKyAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsNywwLAorICAgIDAsMCwxMTUsMTgsMCwwLDAsMTM1LDAsMTM1LDEsMTAyLDIsMTAwLDEsMTAwLAorICAgIDIsMTMyLDgsMTI1LDIsMTI0LDIsODMsMCw0MSwzLDk3LDIwLDEsMCwwLAorICAgIDY1LDMyLDk5LDEwOCw5NywxMTUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExOSwKKyAgICAxMDQsMTA1LDk5LDEwNCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsOTcsMzIsOTksCisgICAgMTA4LDExMSwxMTUsMTE3LDExNCwxMDEsMzIsMTE2LDExMSwzMiwxMTcsMTE1LDEwMSwzMiwxMTEsMTEwLAorICAgIDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMCwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDEwNSwxMDgsCisgICAgMTA4LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDk3LDExMCwzMiwxMDUsMTEwLDExNSwxMTYsCisgICAgOTcsMTEwLDk5LDEwMSwzMiwxMTcsMTE1LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDExNSwKKyAgICAxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsCisgICAgMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwxMCwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiw5OSw5NywxMDgsMTA4LDEwMSwxMDAsMzIsMTExLDExMCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiw5OSwxMDgsMTExLDExNSwxMTcsMTE0LDEwMSw0NiwxMCwxMCwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwKKyAgICAxMDQsMzIsOTksOTcsMTA4LDEwOCwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgOTksMTA4LDExMSwxMTUsMTE3LDExNCwxMDEsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywKKyAgICAzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTIxLDQ0LDMyLDczLDEwOSwxMTIsMTExLAorICAgIDExNCwxMTYsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsCisgICAgMCw0LDAsMCwwLDE5LDAsMCwwLDExNSwzNCwwLDAsMCwxMTYsMCwKKyAgICAxMjQsMCwxMzEsMSwxMTUsMjAsMTE2LDEsMTAwLDEsMTI0LDAsMTAwLDIsMTQxLDIsCisgICAgMTMwLDEsMTM2LDAsMTI0LDAsMTAyLDEsMTM2LDEsMTUyLDIsMTQyLDAsODMsMCwKKyAgICA0MSwzLDEyMiw0NSw4MCw5NywxMTYsMTA0LDMyLDEwNCwxMTEsMTExLDEwNywzMiwxMDIsMTExLAorICAgIDExNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDQ2LDEwOSw5Nyw5OSwxMDQsCisgICAgMTA1LDExMCwxMDEsMTE0LDEyMSw0Niw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LAorICAgIDQ2LDEyMiwzMCwxMTEsMTEwLDEwOCwxMjEsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LAorICAgIDEwNSwxMDEsMTE1LDMyLDk3LDExNCwxMDEsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwKKyAgICAxMDAsNDEsMSwxMTQsMzcsMCwwLDAsNDEsMiwxMTQsNDgsMCwwLDAsMTE0LAorICAgIDEwMywwLDAsMCw0MSwxLDExNCwzNywwLDAsMCw0MSwyLDExNCwxNjgsMCwKKyAgICAwLDAsMTE0LDExLDEsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwKKyAgICAwLDIxOCwyNCwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsOTUsMTAyLDExMSwxMTQsCisgICAgOTUsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwzOSw1LDAsMCwxMTUsCisgICAgNiwwLDAsMCwwLDIsOCwxLDEyLDEsMTIyLDU0LDcwLDEwNSwxMDgsMTAxLAorICAgIDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LAorICAgIDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsCisgICAgMTExLDExMSwxMDcsOTUsMTAyLDExMSwxMTQsOTUsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsCisgICAgMTAxLDExNCwxMTQsNCwwLDAsMCw0MSwzLDExNCwxNjgsMCwwLDAsMTE0LDExLAorICAgIDEsMCwwLDExNCwxNywxLDAsMCwxMTQsNCwwLDAsMCw0MSwyLDExNCwKKyAgICAxNjgsMCwwLDAsMTE0LDExLDEsMCwwLDExNCw2LDAsMCwwLDIxOCw5LAorICAgIDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywyOSw1LDAsMCwxMTUsNCwwLAorICAgIDAsMCwwLDEwLDE0LDYsMTIyLDIwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDk5LDEsMCwwLAorICAgIDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDEyLDAsMCwwLDEwMCwxLDEwNiwwLDEyNCwwLDEwNiwxLDEzMSwxLAorICAgIDgzLDAsNDEsMiw3OCwxMjIsMTYsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLAorICAgIDExNCw0MCwxMjMsMzMsMTE0LDEyNSw0MSw0MSwyLDExNCw1MCwwLDAsMCwxMTQsMzcsCisgICAgMCwwLDAsNDEsMSwxMTQsMTA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyNDMsMCwwLDAsNDcsNSwKKyAgICAwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3MCwKKyAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSw0MSwxLAorICAgIDc4LDQxLDE1LDExNCwxMDksMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsMTEwLDAsCisgICAgMCwwLDExNCwxMTEsMCwwLDAsMTE0LDE4MiwwLDAsMCwxMTQsMjQ5LDAsMCwKKyAgICAwLDExNCwxMjcsMCwwLDAsMTE0LDE3OSwwLDAsMCwxMTQsMTIxLDAsMCwwLAorICAgIDExNCw0LDEsMCwwLDExNCwxNzgsMCwwLDAsMTE0LDEyLDEsMCwwLDExNCwKKyAgICAxODAsMCwwLDAsMTE0LDE4LDEsMCwwLDExNCwyNDMsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKKyAgICAwLDAsMTE0LDUsMSwwLDAsMTYwLDQsMCwwLDExNSwyMCwwLDAsMCwKKyAgICA4LDcsNCwyLDgsMTQsOCw0LDQsMiw4LDEyLDgsNSwxMCw0OCwKKyAgICA4LDMxLDEyLDE4LDExNCw1LDEsMCwwLDk5LDQsMCwwLDAsMCwwLAorICAgIDAsMCw2LDAsMCwwLDExLDAsMCwwLDY3LDAsMCwwLDExNSwxNDYsCisgICAgMCwwLDAsMTI0LDAsMTA2LDAsMTAwLDEsMTMxLDEsMTI1LDQsMTI0LDAsMTA2LAorICAgIDAsMTAwLDIsMTMxLDEsMTI1LDUsMTI0LDQsMTE1LDY2LDEyNCw1LDExNCwzNiwxMjQsCisgICAgNSwxMDYsMSwxMjUsNCwxMTAsMzAsMTI0LDIsMTI0LDMsMTA3LDIsMTE0LDU2LDExNiwKKyAgICAyLDEyNCwxLDEyNCwyLDEzMSwyLDEyNSw0LDExMCwxMCwxMTYsMywxMjQsMSwxMjQsCisgICAgMiwxMzEsMiwxMjUsNCwxMjQsNSwxMTUsODQsMTE2LDQsMTI0LDEsMTI0LDIsMTI0LAorICAgIDQsMTAwLDMsMTQxLDMsMTI1LDUsMTIxLDM2LDEyNCw1LDEyNCwwLDEwMCwyLDYwLAorICAgIDAsMTI0LDQsMTI0LDAsMTAwLDEsNjAsMCwxMjQsMiwxMjQsMCwxMDAsNCw2MCwKKyAgICAwLDEyNCwzLDEyNCwwLDEwMCw1LDYwLDAsODcsMCwxMTAsMjAsNCwwLDExNiwKKyAgICA1LDEwNywxMCwxMTQsMTQwLDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsCisgICAgMCwxMDAsMCw4MywwLDQxLDYsNzgsMjE4LDEwLDk1LDk1LDEwOCwxMTEsOTcsMTAwLAorICAgIDEwMSwxMTQsOTUsOTUsMjE4LDgsOTUsOTUsMTE1LDExMiwxMDEsOTksOTUsOTUsNDEsMSwKKyAgICAxMTQsMTI0LDAsMCwwLDkwLDgsOTUsOTUsMTAyLDEwNSwxMDgsMTAxLDk1LDk1LDkwLAorICAgIDEwLDk1LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk1LDk1LDQxLDYsMjE4LDMsMTAzLAorICAgIDEwMSwxMTYsMTE0LDEyNCwwLDAsMCwxMTQsMjIwLDAsMCwwLDExNCwyMTUsMCwwLAorICAgIDAsMTE0LDE2NSwwLDAsMCwyMTgsOSw2OSwxMjAsOTksMTAxLDExMiwxMTYsMTA1LDExMSwKKyAgICAxMTAsNDEsNiw5MCwyLDExMCwxMTUsMTE0LDEwMiwwLDAsMCw5MCw4LDExMiw5NywKKyAgICAxMTYsMTA0LDExMCw5NywxMDksMTAxLDkwLDksOTksMTEyLDk3LDExNiwxMDQsMTEwLDk3LDEwOSwKKyAgICAxMDEsMTE0LDEyNCwwLDAsMCwxMTQsMTYyLDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNCw5NSwxMDIsMTA1LDEyMCwKKyAgICA5NSwxMTcsMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDUzLDUsMCwwLDExNSwzNCwKKyAgICAwLDAsMCwwLDIsMTAsMSwxMCwxLDQsMSw0LDEsOCwxLDgsCisgICAgMSwxMiwyLDEwLDEsNCwxLDE0LDEsMiwxLDgsMSw4LDEsOCwKKyAgICAxLDEyLDEsMTQsMiwxMTQsMjMsMSwwLDAsOTksMCwwLDAsMCwwLAorICAgIDAsMCwwLDMsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsCisgICAgMzgsMCwwLDAsMTE2LDAsMTE2LDEsMTA2LDIsMTMxLDAsMTAyLDIsMTI1LDAsCisgICAgMTE2LDMsMTE2LDQsMTAyLDIsMTI1LDEsMTE2LDUsMTE2LDYsMTAyLDIsMTI1LDIsCisgICAgMTI0LDAsMTI0LDEsMTI0LDIsMTAzLDMsODMsMCw0MSwxLDEyMiw5NSw4MiwxMDEsCisgICAgMTE2LDExNywxMTQsMTEwLDExNSwzMiw5NywzMiwxMDgsMTA1LDExNSwxMTYsMzIsMTExLDEwMiwzMiwKKyAgICAxMDIsMTA1LDEwOCwxMDEsNDUsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgNjksOTcsOTksMTA0LDMyLDEwNSwxMTYsMTAxLDEwOSwzMiwxMDUsMTE1LDMyLDk3LDMyLDExNiwKKyAgICAxMTcsMTEyLDEwOCwxMDEsMzIsNDAsMTA4LDExMSw5NywxMDAsMTAxLDExNCw0NCwzMiwxMTUsMTE3LAorICAgIDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDQxLDQ2LDEwLDMyLDMyLDMyLDMyLDQxLDcsMTE0LAorICAgIDIyMSwwLDAsMCwxMTQsMTQzLDAsMCwwLDIxOCwxOCwxMDEsMTIwLDExNiwxMDEsMTEwLAorICAgIDExNSwxMDUsMTExLDExMCw5NSwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDExNCwyMTUsMCwKKyAgICAwLDAsMTE0LDg4LDAsMCwwLDExNCwyMjAsMCwwLDAsMTE0LDc4LDAsMCwKKyAgICAwLDQxLDMsOTAsMTAsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMTE1LDkwLAorICAgIDYsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5MCw4LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsCisgICAgMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLAorICAgIDExNCwxNTksMCwwLDAsNzYsNSwwLDAsMTE1LDgsMCwwLDAsMCw1LAorICAgIDEyLDEsOCwxLDgsMSwxMTQsMTU5LDAsMCwwLDk5LDEsMCwwLDAsCisgICAgMCwwLDAsMCwxMiwwLDAsMCwxMiwwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsMTg4LDEsMCwwLDEyNCwwLDk3LDAsMTE2LDAsMTA2LDEsOTcsMSwxMTYsCisgICAgMCwxMDYsMiw5NywyLDExNiwxLDEwNiwzLDExNiw0LDI1LDAsMTI1LDEsMTIwLAorICAgIDU2LDEwMCwyNiw2OCwwLDkzLDQ4LDEyNSwyLDEyNCwyLDExNiwxLDEwNiwzLDEwNywKKyAgICA3LDExNCw1OCwxMTYsMCwxMDYsNSwxMjQsMiwxMzEsMSwxMjUsMywxMTAsMTAsMTE2LAorICAgIDEsMTA2LDMsMTI0LDIsMjUsMCwxMjUsMywxMTYsNiwxMjQsMSwxMjQsMiwxMjQsCisgICAgMywxMzEsMywxLDAsMTEzLDMyLDg3LDAsMTAwLDUsMTAwLDYsMTAzLDEsMTAyLAorICAgIDIsMTAwLDcsMTAwLDgsMTAwLDYsMTAzLDIsMTAyLDIsMTAyLDIsMTI1LDQsMTIwLAorICAgIDExOCwxMjQsNCw2OCwwLDkzLDEwMiw5MiwyLDEyNSw1LDEyNSw2LDExNiw3LDEwMCwKKyAgICA5LDEwMCwxMCwxMzIsMCwxMjQsNiw2OCwwLDEzMSwxLDEzMSwxLDExNSwxNDIsMTE2LAorICAgIDgsMTMwLDEsMTI0LDYsMTAwLDExLDI1LDAsMTI1LDcsMTI0LDUsMTE2LDEsMTA2LAorICAgIDMsMTA3LDYsMTE0LDE3NCwxMTYsMSwxMDYsMywxMjQsNSwyNSwwLDEyNSw4LDgwLAorICAgIDAsMTEzLDExMiwxMjEsMTYsMTE2LDAsMTA2LDUsMTI0LDUsMTMxLDEsMTI1LDgsODAsCisgICAgMCw4NywwLDExMywxMTIsNCwwLDExNiw5LDEwNywxMCwxMTQsMjEyLDEsMCwxLAorICAgIDAsMSwwLDExOSwxMTIsODksMCwxMTMsMTEyLDg4LDAsMTEzLDExMiw4NywwLDExNiwKKyAgICA5LDEwMCwxMiwxMzEsMSwxMzAsMSwxMTYsNiwxMjQsMSwxMDAsMTMsMTI0LDgsMTMxLAorICAgIDMsMSwwLDExNiw2LDEyNCwxLDEwMCwxNCwxMjQsNywxMzEsMywxLDAsMTE2LAorICAgIDYsMTI0LDEsMTAwLDE1LDEwMCwxNiwxMDYsMTAsMTI0LDYsMTMxLDEsMTMxLDMsMSwKKyAgICAwLDEyMSwxNCwxMTYsMCwxMDYsNSwxMDAsMTcsMTMxLDEsMTI1LDksODcsMCwxMTAsCisgICAgMjYsNCwwLDExNiw5LDEwNywxMCwxNDQsMSwxMTQsNTIsMSwwLDEsMCwxLAorICAgIDAsMTAwLDE4LDEyNSw5LDg5LDAsMTEwLDIsODgsMCwxMTYsNiwxMjQsMSwxMDAsCisgICAgMTcsMTI0LDksMTMxLDMsMSwwLDExNiwwLDEwNiw1LDEwMCwxOSwxMzEsMSwxMjUsCisgICAgMTAsMTE2LDYsMTI0LDEsMTAwLDE5LDEyNCwxMCwxMzEsMywxLDAsMTI0LDUsMTAwLAorICAgIDcsMTA3LDIsMTQ0LDEsMTE0LDEyMCwxMTYsMCwxMDYsNSwxMDAsMjAsMTMxLDEsMTI1LAorICAgIDExLDExNiw2LDEyNCwxLDEwMCwyMSwxMjQsMTEsMTMxLDMsMSwwLDExNiw2LDEyNCwKKyAgICAxLDEwMCwyMiwxMTYsMTEsMTMxLDAsMTMxLDMsMSwwLDExNiwxMiwxMDYsMTMsMTE2LAorICAgIDIsMTA2LDE0LDEzMSwwLDEzMSwxLDEsMCwxMjQsNSwxMDAsNywxMDcsMiwxNDQsCisgICAgMSwxMTQsMTg0LDExNiwxNSwxMDYsMTYsMTAwLDIzLDEzMSwxLDEsMCwxMDAsMjQsMTE2LAorICAgIDEyLDEwNyw2LDE0NCwxLDExNCwxODQsMTAwLDI1LDExNiwxNyw5NSwxOCwxMDAsMTgsODMsCisgICAgMCw0MSwyNywxMjIsMjA1LDgzLDEwMSwxMTYsMTE3LDExMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCw0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICAxMDEsMTE0LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LAorICAgIDk4LDMyLDk4LDEyMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMTAsCisgICAgMTAxLDEwMSwxMDAsMTAxLDEwMCwxMCwzMiwzMiwzMiwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsCisgICAgMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMDUsCisgICAgMTEwLDEwNiwxMDEsOTksMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDEwOSwzMiwxMDUsMTEwLAorICAgIDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDMyLDExMCw5NywKKyAgICAxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc5LDExNiwKKyAgICAxMDQsMTAxLDExNCwzMiw5OSwxMTEsMTA5LDExMiwxMTEsMTEwLDEwMSwxMTAsMTE2LDExNSwzMiw5NywKKyAgICAxMTQsMTAxLDMyLDEwMSwxMjAsMTE2LDExNCw5Nyw5OSwxMTYsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwKKyAgICAxMDksMzIsMTE2LDEwNCwxMDEsMzIsOTksMTExLDExNCwxMDEsMzIsOTgsMTExLDExMSwxMTYsMTE1LAorICAgIDExNiwxMTQsOTcsMTEyLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLAorICAgIDMyLDMyLDExNCw1MiwwLDAsMCwxMTQsNjMsMCwwLDAsMjE4LDgsOTgsMTE3LAorICAgIDEwNSwxMDgsMTE2LDEwNSwxMTAsMTE1LDExNCwxNDAsMCwwLDAsOTAsNSwxMTIsMTExLDExNSwKKyAgICAxMDUsMTIwLDI1MCwxLDQ3LDIxOCwyLDExMCwxMTYsMjUwLDEsOTIsOTksMSwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCwxMTUsMCwwLAorICAgIDAsMTE1LDI2LDAsMCwwLDEyNCwwLDkzLDE4LDEyNSwxLDExNiwwLDEyNCwxLAorICAgIDEzMSwxLDEwMCwwLDEwNywyLDg2LDAsMSwwLDExMywyLDEwMCwxLDgzLDAsCisgICAgNDEsMiwxMTQsMzEsMCwwLDAsNzgsNDEsMSwxMTQsMzMsMCwwLDAsNDEsCisgICAgMiwxMTQsMjQsMCwwLDAsMTE0LDgxLDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMjQsMCwwLDAsMTEyLAorICAgIDUsMCwwLDExNSwyLDAsMCwwLDQsMCwxMjIsMjUsOTUsMTE1LDEwMSwxMTYsCisgICAgMTE3LDExMiw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTAzLDEwMSwxMTAsCisgICAgMTAxLDEyMCwxMTIsMTE0LDYyLDExNCw2MiwwLDAsMCwxMjIsMzAsMTA1LDEwOSwxMTIsMTExLAorICAgIDExNCwxMTYsMTA4LDEwNSw5OCwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDMyLDExMiwKKyAgICAxMTEsMTE1LDEwNSwxMjAsMzIsMTExLDExNCwzMiwxMTAsMTE2LDExNCwzLDAsMCwwLDExNCwKKyAgICAyNywwLDAsMCwxMTQsMjMsMCwwLDAsMTE0LDMyLDAsMCwwLDkwLDcsCisgICAgOTUsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCw3OCw5MCw4LDk1LDExOSwxMDEsOTcsMTA3LDExNCwKKyAgICAxMDEsMTAyLDkwLDYsMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsMTE0LDE2NywwLDAsMCwxMTQsCisgICAgNywwLDAsMCwxMjIsNCw0NiwxMTIsMTIxLDExOSwxMjIsNiw5NSwxMDAsNDYsMTEyLAorICAgIDEyMSwxMDAsODQsNDEsNCwxMjIsMyw5NSwxMDUsMTExLDEyMiw5LDk1LDExOSw5NywxMTQsCisgICAgMTEwLDEwNSwxMTAsMTAzLDExNSwxMjIsOCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCwxMTUsMTIyLAorICAgIDcsMTA5LDk3LDExNCwxMTUsMTA0LDk3LDEwOCw0MSwxOSwxMTQsMTE4LDAsMCwwLDExNCwKKyAgICA4LDAsMCwwLDExNCwxNDMsMCwwLDAsMTE0LDIzNiwwLDAsMCwxMTQsMTA5LAorICAgIDAsMCwwLDkwLDE4LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDEwMiwxMTQsCisgICAgMTExLDEwOSw5NSwxMTAsOTcsMTA5LDEwMSwxMTQsMTEzLDAsMCwwLDIxOCwzLDk3LDEwOCwKKyAgICAxMDgsMjE4LDE0LDY1LDExNSwxMTUsMTAxLDExNCwxMTYsMTA1LDExMSwxMTAsNjksMTE0LDExNCwxMTEsCisgICAgMTE0LDExNCwxMDMsMCwwLDAsMTE0LDI4LDAsMCwwLDExNCwxMywwLDAsMCwKKyAgICAxMTQsMjI2LDAsMCwwLDExNCwxNDcsMCwwLDAsMTE0LDI0LDEsMCwwLDExNCwKKyAgICA4OCwwLDAsMCwxMTQsMTYxLDAsMCwwLDExNCwxNjYsMCwwLDAsMTE0LDE3MCwKKyAgICAwLDAsMCw0MSwxMiwyMTgsMTcsOTUsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsCisgICAgMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDExLDExNSwxMDEsMTA4LDEwMiw5NSwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMiw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMTAsCisgICAgOTcsMTA5LDEwMSw5MCwxNCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw5MCwxMCwxMTEsMTE1LDk1LDEwMCwxMDEsMTE2LDk3LDEwNSwxMDgsMTE1LDkwLAorICAgIDEwLDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExMSwxMTUsMTE0LDIzLDAsMCwwLAorICAgIDExNCwyNywwLDAsMCw5MCw5LDExMSwxMTUsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgOTAsMTMsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwKKyAgICAxNCwxMTksMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwKKyAgICAxMywxMTksMTA1LDExMCwxMTQsMTAxLDEwMyw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsNiw5NSwKKyAgICAxMTUsMTAxLDExNiwxMTcsMTEyLDg3LDUsMCwwLDExNSw4MiwwLDAsMCwwLDgsCisgICAgNCwxLDYsMSw2LDMsMTAsMSwxMCwxLDEwLDEsMTIsMiwxMCwxLAorICAgIDE2LDMsMjIsMSwxNCwyLDIyLDEsOCwxLDEwLDEsMTAsMSw0LDIsCisgICAgMiwxLDEwLDEsNiwxLDE0LDEsMTIsMiw4LDEsMTIsMSwxMiwxLAorICAgIDE4LDMsMiwxLDE0LDEsMTYsMiwxMCwxLDEyLDMsMTAsMSwxMiwzLAorICAgIDEwLDEsMTAsMSwxMiwzLDE0LDEsMTQsMSwxMCwxLDEwLDEsMTAsMSwKKyAgICAxMTQsMzIsMSwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwKKyAgICAwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsODYsMCwwLDAsMTE2LAorICAgIDAsMTI0LDAsMTMxLDEsMSwwLDExNiwxLDEzMSwwLDEyNSwxLDExNiwyLDEwNiwKKyAgICAzLDEwNiw0LDExNiw1LDEwNiw2LDEyNCwxLDE1MiwxLDE0MiwwLDEwMywxLDEzMSwKKyAgICAxLDEsMCwxMTYsNywxMDYsOCwxMDAsMSwxMDcsMiwxMTQsNTgsMTE2LDIsMTA2LAorICAgIDksMTA2LDEwLDExNiwxMSwxMzEsMSwxLDAsMTE2LDIsMTA2LDksMTA2LDEwLDExNiwKKyAgICAxMiwxMzEsMSwxLDAsMTE2LDUsMTI0LDAsOTUsNSwxMTYsMTMsMTI0LDAsOTUsCisgICAgMTMsMTAwLDIsODMsMCw0MSwzLDEyMiw0MSw3MywxMTAsMTE1LDExNiw5NywxMDgsMTA4LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDQ1LDk4LDk3LDExNSwxMDEsMTAwLDMyLAorICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDk5LDExMSwxMDksMTEyLDExMSwxMTAsMTAxLDExMCwxMTYsCisgICAgMTE1LDQ2LDExNCwyNywxLDAsMCw3OCw0MSwxNCwxMTQsMzIsMSwwLDAsMTE0LAorICAgIDE1OSwwLDAsMCwxMTQsOCwwLDAsMCwxMTQsMjUzLDAsMCwwLDExNCwxNDcsCisgICAgMCwwLDAsMTE0LDUsMSwwLDAsMTE0LDE4LDEsMCwwLDExNCwzLDAsCisgICAgMCwwLDExNCwxMDksMCwwLDAsMjE4LDksMTA5LDEwMSwxMTYsOTcsOTUsMTEyLDk3LAorICAgIDExNiwxMDQsMTE0LDE2MSwwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCwyNDgsMCwwLAorICAgIDAsMTE0LDIxNSwwLDAsMCw0MSwyLDExNCwzMSwxLDAsMCw5MCwxNywxMTUsCisgICAgMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwKICAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsCi0gICAgOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw2Miw4LDAsMCwwLDExNSwxMDYsMCwKLSAgICAwLDAsNiwxNiw2LDEsNiwxLDMsMSw3LDMsMTIsMTcsMTIsNSwKLSAgICAxMiw1LDEyLDYsMTIsMTIsMTIsMTAsMTIsOSwxMiw1LDEyLDcsMTUsMjIsCi0gICAgMTUsMTE0LDIyLDEsMTgsMiw2LDEsNiwyLDksMiw5LDIsMTAsMiwKLSAgICAyMSw0NCwxMiwzMywxMiwxOSwxMiwxMiwxMiwxMiwxOCw4LDEyLDI4LDEyLDE3LAotICAgIDIxLDU1LDIxLDEyLDE4LDEwLDEyLDE0LDksMywxMiwxLDE1LDY1LDE5LDY0LAotICAgIDE5LDI4LDIyLDExMCwxOSw0MSwyNSw0MywyNSwxNiw2LDMsMjUsNTMsMTksNTcsCi0gICAgMTksNDEsMTksMTM0LDE5LDE0NiwxNSwyMywxMiwxMSwxMiw2OCwKKyAgICA4LDk1LDEwNSwxMTAsMTE1LDExNiw5NywxMDgsMTA4LDE1NSw1LDAsMCwxMTUsMTYsMCwKKyAgICAwLDAsMCwyLDgsMSw2LDEsMjIsMSwxMCwxLDEyLDEsMTIsNCwKKyAgICA2LDEsMTE0LDM0LDEsMCwwLDQxLDEsMTIyLDMsMTE5LDEwNSwxMTAsNDEsMiwKKyAgICAxMTQsMSwwLDAsMCwxMTQsMiwwLDAsMCw0MSwxLDExNCw0OSwwLDAsCisgICAgMCw0MSwxLDc4LDQxLDMsNzgsNzgsNzgsNDEsMyw3OCw3OCw3OCw0MSwyLAorICAgIDExNCw2MiwwLDAsMCwxMTQsNjIsMCwwLDAsNDEsMSw3OCw0MSwxLDc4LAorICAgIDQxLDU4LDExNCwxMTEsMCwwLDAsMTE0LDEyLDAsMCwwLDkwLDM3LDk1LDY3LAorICAgIDY1LDgzLDY5LDk1LDczLDc4LDgzLDY5LDc4LDgzLDczLDg0LDczLDg2LDY5LDk1LAorICAgIDgwLDc2LDY1LDg0LDcwLDc5LDgyLDc3LDgzLDk1LDY2LDg5LDg0LDY5LDgzLDk1LAorICAgIDc1LDY5LDg5LDExNCwxMSwwLDAsMCwxMTQsMTMsMCwwLDAsMTE0LDE5LDAsCisgICAgMCwwLDExNCwyMSwwLDAsMCwxMTQsMzAsMCwwLDAsMTE0LDQwLDAsMCwKKyAgICAwLDExNCw0MSwwLDAsMCwxMTQsNDUsMCwwLDAsMTE0LDQ2LDAsMCwwLAorICAgIDExNCw0OCwwLDAsMCwxMTQsNTgsMCwwLDAsMjE4LDQsMTE2LDEyMSwxMTIsMTAxLAorICAgIDIxOCw4LDk1LDk1LDk5LDExMSwxMDAsMTAxLDk1LDk1LDExNCwxNDIsMCwwLDAsMTE0LAorICAgIDE3LDAsMCwwLDExNCwxMzIsMCwwLDAsMTE0LDE2LDAsMCwwLDExNCwyMCwKKyAgICAwLDAsMCw5MCwxNyw5NSw4Miw2NSw4Nyw5NSw3Nyw2NSw3MSw3Myw2Nyw5NSwKKyAgICA3OCw4NSw3Nyw2Niw2OSw4MiwxMTQsNzcsMCwwLDAsMTE0LDc2LDAsMCwwLAorICAgIDExNCw4OCwwLDAsMCwxMTQsNzgsMCwwLDAsOTAsMjMsNjgsNjksNjYsODUsCisgICAgNzEsOTUsNjYsODksODQsNjksNjcsNzksNjgsNjksOTUsODMsODUsNzAsNzAsNzMsCisgICAgODgsNjksODMsOTAsMjcsNzksODAsODQsNzMsNzcsNzMsOTAsNjksNjgsOTUsNjYsCisgICAgODksODQsNjksNjcsNzksNjgsNjksOTUsODMsODUsNzAsNzAsNzMsODgsNjksODMsCisgICAgMTE0LDgzLDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsOTUsMCwwLDAsMTE0LAorICAgIDk5LDAsMCwwLDExNCwxMDEsMCwwLDAsMTE0LDEyMCwwLDAsMCwxMTQsMTI3LAorICAgIDAsMCwwLDExNCwxMzksMCwwLDAsMTE0LDE0NSwwLDAsMCwxMTQsMTQ4LDAsCisgICAgMCwwLDExNCwxNTMsMCwwLDAsMjE4LDYsMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNCwKKyAgICAxNjAsMCwwLDAsMTE0LDE2NSwwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCwxODEsCisgICAgMCwwLDAsMTE0LDE5MSwwLDAsMCwxMTQsMjA3LDAsMCwwLDExNCwyMTUsMCwKKyAgICAwLDAsMTE0LDIyMCwwLDAsMCwxMTQsMjI2LDAsMCwwLDExNCwyMjEsMCwwLAorICAgIDAsMTE0LDIyNywwLDAsMCwxMTQsMjQ2LDAsMCwwLDExNCwyNDgsMCwwLDAsCisgICAgMTE0LDUsMSwwLDAsMTE0LDIzLDEsMCwwLDExNCwxNTksMCwwLDAsMTE0LAorICAgIDMyLDEsMCwwLDExNCwzNCwxLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsOCw2MCwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw2Miw4LDAsMCwwLDExNSwxMDgsMCwwLDAsCisgICAgNCwxNiw0LDEsNCwxLDIsMSw2LDMsOCwxNyw4LDUsOCw1LAorICAgIDgsNiw4LDEyLDgsMTAsOCw5LDgsNSw4LDcsMTAsMjIsMTAsMTIwLAorICAgIDE2LDEsMTIsMiw0LDEsNCwyLDYsMiw2LDIsOCwyLDE2LDQ1LAorICAgIDgsMzQsOCwxOSw4LDEyLDgsMTIsOCwyOCw4LDE3LDEwLDU1LDEwLDEyLAorICAgIDEwLDEwLDgsMTQsNiwzLDQsMSwxNCw2NywxNCw2NCwxNCwyOSwxNiwxMTAsCisgICAgMTQsNDEsMTgsNDUsMTgsMTYsNCwzLDE4LDUzLDE0LDYwLDE0LDQyLDE0LDEyNywKKyAgICAwLDUsMTQsMTI3LDAsMjIsMTAsMjMsOCwxMSw4LDY4LAogfTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9tYWtlb3Bjb2RldGFyZ2V0cy5weSBiL1B5dGhvbi9tYWtlb3Bjb2RldGFyZ2V0cy5weQppbmRleCBkOWEwODU1Li4wMjNjOWU2IDEwMDc1NQotLS0gYS9QeXRob24vbWFrZW9wY29kZXRhcmdldHMucHkKKysrIGIvUHl0aG9uL21ha2VvcGNvZGV0YXJnZXRzLnB5CkBAIC0zLDI0ICszLDM0IEBACiAoZm9yIGNvbXBpbGVycyBzdXBwb3J0aW5nIGNvbXB1dGVkIGdvdG9zIG9yICJsYWJlbHMtYXMtdmFsdWVzIiwgc3VjaCBhcyBnY2MpLgogIiIiCiAKLSMgVGhpcyBjb2RlIHNob3VsZCBzdGF5IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBhdCBsZWFzdCB3aGlsZQotIyBzb21lIG9mIHRoZSBidWlsZGJvdHMgaGF2ZSBQeXRob24gMi4zIGFzIHRoZWlyIHN5c3RlbSBQeXRob24uCi0KLWltcG9ydCBpbXAKIGltcG9ydCBvcworaW1wb3J0IHN5cwogCiAKLWRlZiBmaW5kX21vZHVsZShtb2RuYW1lKToKLSAgICAiIiJGaW5kcyBhbmQgcmV0dXJucyBhIG1vZHVsZSBpbiB0aGUgbG9jYWwgZGlzdC9jaGVja291dC4KLSAgICAiIiIKLSAgICBtb2RwYXRoID0gb3MucGF0aC5qb2luKAotICAgICAgICBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksICJMaWIiKQotICAgIHJldHVybiBpbXAubG9hZF9tb2R1bGUobW9kbmFtZSwgKmltcC5maW5kX21vZHVsZShtb2RuYW1lLCBbbW9kcGF0aF0pKQordHJ5OgorICAgIGZyb20gaW1wb3J0bGliLm1hY2hpbmVyeSBpbXBvcnQgU291cmNlRmlsZUxvYWRlcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBpbXAKKworICAgIGRlZiBmaW5kX21vZHVsZShtb2RuYW1lKToKKyAgICAgICAgIiIiRmluZHMgYW5kIHJldHVybnMgYSBtb2R1bGUgaW4gdGhlIGxvY2FsIGRpc3QvY2hlY2tvdXQuCisgICAgICAgICIiIgorICAgICAgICBtb2RwYXRoID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpLCAiTGliIikKKyAgICAgICAgcmV0dXJuIGltcC5sb2FkX21vZHVsZShtb2RuYW1lLCAqaW1wLmZpbmRfbW9kdWxlKG1vZG5hbWUsIFttb2RwYXRoXSkpCitlbHNlOgorICAgIGRlZiBmaW5kX21vZHVsZShtb2RuYW1lKToKKyAgICAgICAgIiIiRmluZHMgYW5kIHJldHVybnMgYSBtb2R1bGUgaW4gdGhlIGxvY2FsIGRpc3QvY2hlY2tvdXQuCisgICAgICAgICIiIgorICAgICAgICBtb2RwYXRoID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpLCAiTGliIiwgbW9kbmFtZSArICIucHkiKQorICAgICAgICByZXR1cm4gU291cmNlRmlsZUxvYWRlcihtb2RuYW1lLCBtb2RwYXRoKS5sb2FkX21vZHVsZSgpCisKIAogZGVmIHdyaXRlX2NvbnRlbnRzKGYpOgogICAgICIiIldyaXRlIEMgY29kZSBjb250ZW50cyB0byB0aGUgdGFyZ2V0IGZpbGUgb2JqZWN0LgogICAgICIiIgotICAgIG9wY29kZSA9IGZpbmRfbW9kdWxlKCJvcGNvZGUiKQorICAgIG9wY29kZSA9IGZpbmRfbW9kdWxlKCdvcGNvZGUnKQogICAgIHRhcmdldHMgPSBbJ191bmtub3duX29wY29kZSddICogMjU2CiAgICAgZm9yIG9wbmFtZSwgb3AgaW4gb3Bjb2RlLm9wbWFwLml0ZW1zKCk6CiAgICAgICAgIHRhcmdldHNbb3BdID0gIlRBUkdFVF8lcyIgJSBvcG5hbWUKQEAgLTI5LDE1ICszOSwxNyBAQAogICAgIGYud3JpdGUoIlxufTtcbiIpCiAKIAotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBpbXBvcnQgc3lzCi0gICAgYXNzZXJ0IGxlbihzeXMuYXJndikgPCAzLCAiVG9vIG1hbnkgYXJndW1lbnRzIgorZGVmIG1haW4oKToKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID49IDM6CisgICAgICAgIHN5cy5leGl0KCJUb28gbWFueSBhcmd1bWVudHMiKQogICAgIGlmIGxlbihzeXMuYXJndikgPT0gMjoKICAgICAgICAgdGFyZ2V0ID0gc3lzLmFyZ3ZbMV0KICAgICBlbHNlOgogICAgICAgICB0YXJnZXQgPSAiUHl0aG9uL29wY29kZV90YXJnZXRzLmgiCi0gICAgZiA9IG9wZW4odGFyZ2V0LCAidyIpCi0gICAgdHJ5OgorICAgIHdpdGggb3Blbih0YXJnZXQsICJ3IikgYXMgZjoKICAgICAgICAgd3JpdGVfY29udGVudHMoZikKLSAgICBmaW5hbGx5OgotICAgICAgICBmLmNsb3NlKCkKKyAgICBwcmludCgiSnVtcCB0YWJsZSB3cml0dGVuIGludG8gJXMiICUgdGFyZ2V0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9QeXRob24vbWFyc2hhbC5jIGIvUHl0aG9uL21hcnNoYWwuYwppbmRleCA1YjhkZTk5Li42MjdhODQyIDEwMDY0NAotLS0gYS9QeXRob24vbWFyc2hhbC5jCisrKyBiL1B5dGhvbi9tYXJzaGFsLmMKQEAgLTI2MywxMCArMjYzLDEwIEBACiAgICAgaWYgKFB5X1JFRkNOVCh2KSA9PSAxKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGVudHJ5ID0gX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkocC0+aGFzaHRhYmxlLCB2KTsKKyAgICBlbnRyeSA9IF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKHAtPmhhc2h0YWJsZSwgdik7CiAgICAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKICAgICAgICAgLyogd3JpdGUgdGhlIHJlZmVyZW5jZSBpbmRleCB0byB0aGUgc3RyZWFtICovCi0gICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKHAtPmhhc2h0YWJsZSwgJncsIHNpemVvZih3KSwgZW50cnkpOworICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfREFUQShwLT5oYXNodGFibGUsIGVudHJ5LCB3KTsKICAgICAgICAgLyogd2UgZG9uJ3Qgc3RvcmUgImxvbmciIGluZGljZXMgaW4gdGhlIGRpY3QgKi8KICAgICAgICAgYXNzZXJ0KDAgPD0gdyAmJiB3IDw9IDB4N2ZmZmZmZmYpOwogICAgICAgICB3X2J5dGUoVFlQRV9SRUYsIHApOwpAQCAtNTcxLDcgKzU3MSw4IEBACiB3X2luaXRfcmVmcyhXRklMRSAqd2YsIGludCB2ZXJzaW9uKQogewogICAgIGlmICh2ZXJzaW9uID49IDMpIHsKLSAgICAgICAgd2YtPmhhc2h0YWJsZSA9IF9QeV9oYXNodGFibGVfbmV3KHNpemVvZihpbnQpLCBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyLAorICAgICAgICB3Zi0+aGFzaHRhYmxlID0gX1B5X2hhc2h0YWJsZV9uZXcoc2l6ZW9mKFB5T2JqZWN0ICopLCBzaXplb2YoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfaGFzaF9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KTsKICAgICAgICAgaWYgKHdmLT5oYXNodGFibGUgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKQEAgLTU4Miw5ICs1ODMsMTMgQEAKIH0KIAogc3RhdGljIGludAotd19kZWNyZWZfZW50cnkoX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgdm9pZCAqUHlfVU5VU0VEKGRhdGEpKQord19kZWNyZWZfZW50cnkoX1B5X2hhc2h0YWJsZV90ICpodCwgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwKKyAgICAgICAgICAgICAgIHZvaWQgKlB5X1VOVVNFRChkYXRhKSkKIHsKLSAgICBQeV9YREVDUkVGKGVudHJ5LT5rZXkpOworICAgIFB5T2JqZWN0ICplbnRyeV9rZXk7CisKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKGh0LCBlbnRyeSwgZW50cnlfa2V5KTsKKyAgICBQeV9YREVDUkVGKGVudHJ5X2tleSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTY0Myw3ICs2NDgsNyBAQAogICAgIFB5T2JqZWN0ICpyZWZzOyAgLyogYSBsaXN0ICovCiB9IFJGSUxFOwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiByX3N0cmluZyhQeV9zc2l6ZV90IG4sIFJGSUxFICpwKQogewogICAgIFB5X3NzaXplX3QgcmVhZCA9IC0xOwpAQCAtNzI5LDcgKzczNCw3IEBACiAgICAgICAgIGMgPSBnZXRjKHAtPmZwKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGNoYXIgKnB0ciA9IHJfc3RyaW5nKDEsIHApOworICAgICAgICBjb25zdCBjaGFyICpwdHIgPSByX3N0cmluZygxLCBwKTsKICAgICAgICAgaWYgKHB0ciAhPSBOVUxMKQogICAgICAgICAgICAgYyA9ICoodW5zaWduZWQgY2hhciAqKSBwdHI7CiAgICAgfQpAQCAtNzQwLDkgKzc0NSw5IEBACiByX3Nob3J0KFJGSUxFICpwKQogewogICAgIHNob3J0IHggPSAtMTsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCi0gICAgYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoMiwgcCk7CisgICAgYnVmZmVyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoMiwgcCk7CiAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgIHggPSBidWZmZXJbMF07CiAgICAgICAgIHggfD0gYnVmZmVyWzFdIDw8IDg7CkBAIC03NTYsOSArNzYxLDkgQEAKIHJfbG9uZyhSRklMRSAqcCkKIHsKICAgICBsb25nIHggPSAtMTsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCi0gICAgYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoNCwgcCk7CisgICAgYnVmZmVyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoNCwgcCk7CiAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgIHggPSBidWZmZXJbMF07CiAgICAgICAgIHggfD0gKGxvbmcpYnVmZmVyWzFdIDw8IDg7CkBAIC05NzgsNyArOTgzLDggQEAKIAogICAgIGNhc2UgVFlQRV9GTE9BVDoKICAgICAgICAgewotICAgICAgICAgICAgY2hhciBidWZbMjU2XSwgKnB0cjsKKyAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07CisgICAgICAgICAgICBjb25zdCBjaGFyICpwdHI7CiAgICAgICAgICAgICBkb3VibGUgZHg7CiAgICAgICAgICAgICBuID0gcl9ieXRlKHApOwogICAgICAgICAgICAgaWYgKG4gPT0gRU9GKSB7CkBAIC0xMDAxLDkgKzEwMDcsOSBAQAogCiAgICAgY2FzZSBUWVBFX0JJTkFSWV9GTE9BVDoKICAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmOwogICAgICAgICAgICAgZG91YmxlIHg7Ci0gICAgICAgICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSByX3N0cmluZyg4LCBwKTsKKyAgICAgICAgICAgIGJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOwogICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgeCA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKQEAgLTEwMTYsNyArMTAyMiw4IEBACiAKICAgICBjYXNlIFRZUEVfQ09NUExFWDoKICAgICAgICAgewotICAgICAgICAgICAgY2hhciBidWZbMjU2XSwgKnB0cjsKKyAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07CisgICAgICAgICAgICBjb25zdCBjaGFyICpwdHI7CiAgICAgICAgICAgICBQeV9jb21wbGV4IGM7CiAgICAgICAgICAgICBuID0gcl9ieXRlKHApOwogICAgICAgICAgICAgaWYgKG4gPT0gRU9GKSB7CkBAIC0xMDUzLDE1ICsxMDYwLDE1IEBACiAKICAgICBjYXNlIFRZUEVfQklOQVJZX0NPTVBMRVg6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZjsKICAgICAgICAgICAgIFB5X2NvbXBsZXggYzsKLSAgICAgICAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOworICAgICAgICAgICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoOCwgcCk7CiAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjLnJlYWwgPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CiAgICAgICAgICAgICBpZiAoYy5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOworICAgICAgICAgICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoOCwgcCk7CiAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjLmltYWcgPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CkBAIC0xMDc0LDcgKzEwODEsNyBAQAogCiAgICAgY2FzZSBUWVBFX1NUUklORzoKICAgICAgICAgewotICAgICAgICAgICAgY2hhciAqcHRyOworICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyOwogICAgICAgICAgICAgbiA9IHJfbG9uZyhwKTsKICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTExOSw3ICsxMTI2LDcgQEAKICAgICAgICAgfQogICAgIF9yZWFkX2FzY2lpOgogICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyICpwdHI7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwdHI7CiAgICAgICAgICAgICBwdHIgPSByX3N0cmluZyhuLCBwKTsKICAgICAgICAgICAgIGlmIChwdHIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExMzcsNyArMTE0NCw3IEBACiAgICAgICAgIGlzX2ludGVybmVkID0gMTsKICAgICBjYXNlIFRZUEVfVU5JQ09ERToKICAgICAgICAgewotICAgICAgICBjaGFyICpidWZmZXI7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlcjsKIAogICAgICAgICBuID0gcl9sb25nKHApOwogICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKQEAgLTEyNjQsNDEgKzEyNzEsNTIgQEAKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSAoc2V0IHNpemUgb3V0IG9mIHJhbmdlKSIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgdiA9ICh0eXBlID09IFRZUEVfU0VUKSA/IFB5U2V0X05ldyhOVUxMKSA6IFB5RnJvemVuU2V0X05ldyhOVUxMKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gVFlQRV9TRVQpIHsKLSAgICAgICAgICAgIFJfUkVGKHYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogbXVzdCB1c2UgZGVsYXllZCByZWdpc3RyYXRpb24gb2YgZnJvemVuc2V0cyBiZWNhdXNlIHRoZXkgbXVzdAotICAgICAgICAgICAgICogYmUgaW5pdCB3aXRoIGEgcmVmY291bnQgb2YgMQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZHggPSByX3JlZl9yZXNlcnZlKGZsYWcsIHApOwotICAgICAgICAgICAgaWYgKGlkeCA8IDApCi0gICAgICAgICAgICAgICAgUHlfQ0xFQVIodik7IC8qIHNpZ25hbCBlcnJvciAqLwotICAgICAgICB9Ci0gICAgICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICB2MiA9IHJfb2JqZWN0KHApOwotICAgICAgICAgICAgaWYgKCB2MiA9PSBOVUxMICkgewotICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEgZm9yIHNldCIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgaWYgKG4gPT0gMCAmJiB0eXBlID09IFRZUEVfRlJPWkVOU0VUKSB7CisgICAgICAgICAgICAvKiBjYWxsIGZyb3plbnNldCgpIHRvIGdldCB0aGUgZW1wdHkgZnJvemVuc2V0IHNpbmdsZXRvbiAqLworICAgICAgICAgICAgdiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSZQeUZyb3plblNldF9UeXBlLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICh2ID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoUHlTZXRfQWRkKHYsIHYyKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodjIpOwotICAgICAgICAgICAgICAgIHYgPSBOVUxMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlfREVDUkVGKHYyKTsKKyAgICAgICAgICAgIFJfUkVGKHYpOworICAgICAgICAgICAgcmV0dmFsID0gdjsKICAgICAgICAgfQotICAgICAgICBpZiAodHlwZSAhPSBUWVBFX1NFVCkKLSAgICAgICAgICAgIHYgPSByX3JlZl9pbnNlcnQodiwgaWR4LCBmbGFnLCBwKTsKLSAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2ID0gKHR5cGUgPT0gVFlQRV9TRVQpID8gUHlTZXRfTmV3KE5VTEwpIDogUHlGcm96ZW5TZXRfTmV3KE5VTEwpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gVFlQRV9TRVQpIHsKKyAgICAgICAgICAgICAgICBSX1JFRih2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbXVzdCB1c2UgZGVsYXllZCByZWdpc3RyYXRpb24gb2YgZnJvemVuc2V0cyBiZWNhdXNlIHRoZXkgbXVzdAorICAgICAgICAgICAgICAgICAqIGJlIGluaXQgd2l0aCBhIHJlZmNvdW50IG9mIDEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZHggPSByX3JlZl9yZXNlcnZlKGZsYWcsIHApOworICAgICAgICAgICAgICAgIGlmIChpZHggPCAwKQorICAgICAgICAgICAgICAgICAgICBQeV9DTEVBUih2KTsgLyogc2lnbmFsIGVycm9yICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdjIgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgICAgICBpZiAoIHYyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgb2JqZWN0IGluIG1hcnNoYWwgZGF0YSBmb3Igc2V0Iik7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoUHlTZXRfQWRkKHYsIHYyKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2Mik7CisgICAgICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBlICE9IFRZUEVfU0VUKQorICAgICAgICAgICAgICAgIHYgPSByX3JlZl9pbnNlcnQodiwgaWR4LCBmbGFnLCBwKTsKKyAgICAgICAgICAgIHJldHZhbCA9IHY7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFRZUEVfQ09ERToKZGlmZiAtLWdpdCBhL1B5dGhvbi9tb2RzdXBwb3J0LmMgYi9QeXRob24vbW9kc3VwcG9ydC5jCmluZGV4IDBkMDkzNzEuLmYzYWE5MWYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9tb2RzdXBwb3J0LmMKKysrIGIvUHl0aG9uL21vZHN1cHBvcnQuYwpAQCAtMjYwLDEzICsyNjAsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhuKTsKICAgICAgICAgfQogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXZhX2FyZygqcF92YSwgUFlfTE9OR19MT05HKSk7CisgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKXZhX2FyZygqcF92YSwgbG9uZyBsb25nKSk7CiAKICAgICAgICAgY2FzZSAnSyc6Ci0gICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKChQWV9MT05HX0xPTkcpdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBQWV9MT05HX0xPTkcpKTsKLSNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygobG9uZyBsb25nKXZhX2FyZygqcF92YSwgdW5zaWduZWQgbG9uZyBsb25nKSk7CisKICAgICAgICAgY2FzZSAndSc6CiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2OwpAQCAtMzE4LDcgKzMxNyw3IEBACiAgICAgICAgIGNhc2UgJ1UnOiAgIC8qIFhYWCBkZXByZWNhdGVkIGFsaWFzICovCiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2OwotICAgICAgICAgICAgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjaGFyICopOworICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOwogICAgICAgICAgICAgUHlfc3NpemVfdCBuOwogICAgICAgICAgICAgaWYgKCoqcF9mb3JtYXQgPT0gJyMnKSB7CiAgICAgICAgICAgICAgICAgKysqcF9mb3JtYXQ7CkBAIC0zNTEsNyArMzUwLDcgQEAKICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2OwotICAgICAgICAgICAgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjaGFyICopOworICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOwogICAgICAgICAgICAgUHlfc3NpemVfdCBuOwogICAgICAgICAgICAgaWYgKCoqcF9mb3JtYXQgPT0gJyMnKSB7CiAgICAgICAgICAgICAgICAgKysqcF9mb3JtYXQ7CkBAIC00NjksNyArNDY4LDcgQEAKICAgICBpbnQgbiA9IGNvdW50Zm9ybWF0KGYsICdcMCcpOwogICAgIHZhX2xpc3QgbHZhOwogCi0gICAgICAgIFB5X1ZBX0NPUFkobHZhLCB2YSk7CisgICAgUHlfVkFfQ09QWShsdmEsIHZhKTsKIAogICAgIGlmIChuIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9QeXRob24vbXlzdHJ0b3VsLmMgYi9QeXRob24vbXlzdHJ0b3VsLmMKaW5kZXggOTg0MjlkNC4uYTg1NzkwZSAxMDA2NDQKLS0tIGEvUHl0aG9uL215c3RydG91bC5jCisrKyBiL1B5dGhvbi9teXN0cnRvdWwuYwpAQCAtMTcsNyArMTcsNyBAQAogICogc21hbGxtYXhbYmFzZV0gaXMgdGhlIGxhcmdlc3QgdW5zaWduZWQgbG9uZyBpIHN1Y2ggdGhhdAogICogaSAqIGJhc2UgZG9lc24ndCBvdmVyZmxvdyB1bnNpZ25lZCBsb25nLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzbWFsbG1heFtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgc21hbGxtYXhbXSA9IHsKICAgICAwLCAvKiBiYXNlcyAwIGFuZCAxIGFyZSBpbnZhbGlkICovCiAgICAgMCwKICAgICBVTE9OR19NQVggLyAyLApAQCAtNjIsMTQgKzYyLDE0IEBACiAgKiBOb3RlIHRoYXQgdGhpcyBpcyBwZXNzaW1pc3RpYyBpZiBzaXplb2YobG9uZykgPiA0LgogICovCiAjaWYgU0laRU9GX0xPTkcgPT0gNAotc3RhdGljIGludCBkaWdpdGxpbWl0W10gPSB7CitzdGF0aWMgY29uc3QgaW50IGRpZ2l0bGltaXRbXSA9IHsKICAgICAwLCAgMCwgMzIsIDIwLCAxNiwgMTMsIDEyLCAxMSwgMTAsIDEwLCAgLyogIDAgLSAgOSAqLwogICAgIDksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICAvKiAxMCAtIDE5ICovCiAgICAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIC8qIDIwIC0gMjkgKi8KICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2fTsgICAgICAgICAgICAgLyogMzAgLSAzNiAqLwogI2VsaWYgU0laRU9GX0xPTkcgPT0gOAogLyogW2ludChtYXRoLmZsb29yKG1hdGgubG9nKDIqKjY0LCBpKSkpIGZvciBpIGluIHJhbmdlKDIsIDM3KV0gKi8KLXN0YXRpYyBpbnQgZGlnaXRsaW1pdFtdID0geworc3RhdGljIGNvbnN0IGludCBkaWdpdGxpbWl0W10gPSB7CiAgICAgICAgICAwLCAgIDAsIDY0LCA0MCwgMzIsIDI3LCAyNCwgMjIsIDIxLCAyMCwgIC8qICAwIC0gIDkgKi8KICAgICAxOSwgIDE4LCAxNywgMTcsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsICAvKiAxMCAtIDE5ICovCiAgICAgMTQsICAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAgLyogMjAgLSAyOSAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL29wY29kZV90YXJnZXRzLmggYi9QeXRob24vb3Bjb2RlX3RhcmdldHMuaAppbmRleCAxOTI1OWUxLi42ZDk5NmYwIDEwMDY0NAotLS0gYS9QeXRob24vb3Bjb2RlX3RhcmdldHMuaAorKysgYi9QeXRob24vb3Bjb2RlX3RhcmdldHMuaApAQCAtODQsNyArODQsNyBAQAogICAgICYmVEFSR0VUX1dJVEhfQ0xFQU5VUF9GSU5JU0gsCiAgICAgJiZUQVJHRVRfUkVUVVJOX1ZBTFVFLAogICAgICYmVEFSR0VUX0lNUE9SVF9TVEFSLAotICAgICYmX3Vua25vd25fb3Bjb2RlLAorICAgICYmVEFSR0VUX1NFVFVQX0FOTk9UQVRJT05TLAogICAgICYmVEFSR0VUX1lJRUxEX1ZBTFVFLAogICAgICYmVEFSR0VUX1BPUF9CTE9DSywKICAgICAmJlRBUkdFVF9FTkRfRklOQUxMWSwKQEAgLTEyNiwyMiArMTI2LDIyIEBACiAgICAgJiZUQVJHRVRfTE9BRF9GQVNULAogICAgICYmVEFSR0VUX1NUT1JFX0ZBU1QsCiAgICAgJiZUQVJHRVRfREVMRVRFX0ZBU1QsCi0gICAgJiZfdW5rbm93bl9vcGNvZGUsCisgICAgJiZUQVJHRVRfU1RPUkVfQU5OT1RBVElPTiwKICAgICAmJl91bmtub3duX29wY29kZSwKICAgICAmJl91bmtub3duX29wY29kZSwKICAgICAmJlRBUkdFVF9SQUlTRV9WQVJBUkdTLAogICAgICYmVEFSR0VUX0NBTExfRlVOQ1RJT04sCiAgICAgJiZUQVJHRVRfTUFLRV9GVU5DVElPTiwKICAgICAmJlRBUkdFVF9CVUlMRF9TTElDRSwKLSAgICAmJlRBUkdFVF9NQUtFX0NMT1NVUkUsCisgICAgJiZfdW5rbm93bl9vcGNvZGUsCiAgICAgJiZUQVJHRVRfTE9BRF9DTE9TVVJFLAogICAgICYmVEFSR0VUX0xPQURfREVSRUYsCiAgICAgJiZUQVJHRVRfU1RPUkVfREVSRUYsCiAgICAgJiZUQVJHRVRfREVMRVRFX0RFUkVGLAogICAgICYmX3Vua25vd25fb3Bjb2RlLAotICAgICYmVEFSR0VUX0NBTExfRlVOQ1RJT05fVkFSLAorICAgICYmX3Vua25vd25fb3Bjb2RlLAogICAgICYmVEFSR0VUX0NBTExfRlVOQ1RJT05fS1csCi0gICAgJiZUQVJHRVRfQ0FMTF9GVU5DVElPTl9WQVJfS1csCisgICAgJiZUQVJHRVRfQ0FMTF9GVU5DVElPTl9FWCwKICAgICAmJlRBUkdFVF9TRVRVUF9XSVRILAogICAgICYmVEFSR0VUX0VYVEVOREVEX0FSRywKICAgICAmJlRBUkdFVF9MSVNUX0FQUEVORCwKQEAgLTE1NCw5ICsxNTQsOSBAQAogICAgICYmVEFSR0VUX0JVSUxEX1RVUExFX1VOUEFDSywKICAgICAmJlRBUkdFVF9CVUlMRF9TRVRfVU5QQUNLLAogICAgICYmVEFSR0VUX1NFVFVQX0FTWU5DX1dJVEgsCi0gICAgJiZfdW5rbm93bl9vcGNvZGUsCi0gICAgJiZfdW5rbm93bl9vcGNvZGUsCi0gICAgJiZfdW5rbm93bl9vcGNvZGUsCisgICAgJiZUQVJHRVRfRk9STUFUX1ZBTFVFLAorICAgICYmVEFSR0VUX0JVSUxEX0NPTlNUX0tFWV9NQVAsCisgICAgJiZUQVJHRVRfQlVJTERfU1RSSU5HLAogICAgICYmX3Vua25vd25fb3Bjb2RlLAogICAgICYmX3Vua25vd25fb3Bjb2RlLAogICAgICYmX3Vua25vd25fb3Bjb2RlLApkaWZmIC0tZ2l0IGEvUHl0aG9uL3BlZXBob2xlLmMgYi9QeXRob24vcGVlcGhvbGUuYwppbmRleCA0ZTY1N2ZhLi5iMmMwMjc5IDEwMDY0NAotLS0gYS9QeXRob24vcGVlcGhvbGUuYworKysgYi9QeXRob24vcGVlcGhvbGUuYwpAQCAtOCw4ICs4LDggQEAKICNpbmNsdWRlICJjb2RlLmgiCiAjaW5jbHVkZSAic3ltdGFibGUuaCIKICNpbmNsdWRlICJvcGNvZGUuaCIKKyNpbmNsdWRlICJ3b3JkY29kZV9oZWxwZXJzLmgiCiAKLSNkZWZpbmUgR0VUQVJHKGFyciwgaSkgKChpbnQpKChhcnJbaSsyXTw8OCkgKyBhcnJbaSsxXSkpCiAjZGVmaW5lIFVOQ09ORElUSU9OQUxfSlVNUChvcCkgIChvcD09SlVNUF9BQlNPTFVURSB8fCBvcD09SlVNUF9GT1JXQVJEKQogI2RlZmluZSBDT05ESVRJT05BTF9KVU1QKG9wKSAob3A9PVBPUF9KVU1QX0lGX0ZBTFNFIHx8IG9wPT1QT1BfSlVNUF9JRl9UUlVFIFwKICAgICB8fCBvcD09SlVNUF9JRl9GQUxTRV9PUl9QT1AgfHwgb3A9PUpVTVBfSUZfVFJVRV9PUl9QT1ApCkBAIC0xNywyMiArMTcsMTUgQEAKICAgICB8fCBvcD09UE9QX0pVTVBfSUZfRkFMU0UgfHwgb3A9PVBPUF9KVU1QX0lGX1RSVUUgXAogICAgIHx8IG9wPT1KVU1QX0lGX0ZBTFNFX09SX1BPUCB8fCBvcD09SlVNUF9JRl9UUlVFX09SX1BPUCkKICNkZWZpbmUgSlVNUFNfT05fVFJVRShvcCkgKG9wPT1QT1BfSlVNUF9JRl9UUlVFIHx8IG9wPT1KVU1QX0lGX1RSVUVfT1JfUE9QKQotI2RlZmluZSBHRVRKVU1QVEdUKGFyciwgaSkgKEdFVEFSRyhhcnIsaSkgKyAoQUJTT0xVVEVfSlVNUChhcnJbaV0pID8gMCA6IGkrMykpCi0jZGVmaW5lIFNFVEFSRyhhcnIsIGksIHZhbCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXNzZXJ0KDAgPD0gdmFsICYmIHZhbCA8PSAweGZmZmYpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJyW2krMl0gPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBpbnQpdmFsKT4+OCk7ICAgICBcCi0gICAgYXJyW2krMV0gPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBpbnQpdmFsKSAmIDI1NSk7ICBcCi19IHdoaWxlKDApCi0jZGVmaW5lIENPREVTSVpFKG9wKSAgKEhBU19BUkcob3ApID8gMyA6IDEpCi0jZGVmaW5lIElTQkFTSUNCTE9DSyhibG9ja3MsIHN0YXJ0LCBieXRlcykgXAotICAgIChibG9ja3Nbc3RhcnRdPT1ibG9ja3Nbc3RhcnQrYnl0ZXMtMV0pCisjZGVmaW5lIEdFVEpVTVBUR1QoYXJyLCBpKSAoZ2V0X2FyZyhhcnIsIGkpICsgKEFCU09MVVRFX0pVTVAoYXJyW2ldKSA/IDAgOiBpKzIpKQorI2RlZmluZSBJU0JBU0lDQkxPQ0soYmxvY2tzLCBzdGFydCwgZW5kKSBcCisgICAgKGJsb2Nrc1tzdGFydF09PWJsb2Nrc1tlbmRdKQogCiAKICNkZWZpbmUgQ09OU1RfU1RBQ0tfQ1JFQVRFKCkgeyBcCiAgICAgY29uc3Rfc3RhY2tfc2l6ZSA9IDI1NjsgXAogICAgIGNvbnN0X3N0YWNrID0gUHlNZW1fTmV3KFB5T2JqZWN0ICosIGNvbnN0X3N0YWNrX3NpemUpOyBcCi0gICAgbG9hZF9jb25zdF9zdGFjayA9IFB5TWVtX05ldyhQeV9zc2l6ZV90LCBjb25zdF9zdGFja19zaXplKTsgXAotICAgIGlmICghY29uc3Rfc3RhY2sgfHwgIWxvYWRfY29uc3Rfc3RhY2spIHsgXAorICAgIGlmICghY29uc3Rfc3RhY2spIHsgXAogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOyBcCiAgICAgICAgIGdvdG8gZXhpdEVycm9yOyBcCiAgICAgfSBcCkBAIC00MSwyNyArMzQsMjMgQEAKICNkZWZpbmUgQ09OU1RfU1RBQ0tfREVMRVRFKCkgZG8geyBcCiAgICAgaWYgKGNvbnN0X3N0YWNrKSBcCiAgICAgICAgIFB5TWVtX0ZyZWUoY29uc3Rfc3RhY2spOyBcCi0gICAgaWYgKGxvYWRfY29uc3Rfc3RhY2spIFwKLSAgICAgICAgUHlNZW1fRnJlZShsb2FkX2NvbnN0X3N0YWNrKTsgXAogICAgIH0gd2hpbGUoMCkKIAotI2RlZmluZSBDT05TVF9TVEFDS19MRU4oKSAoY29uc3Rfc3RhY2tfdG9wICsgMSkKKyNkZWZpbmUgQ09OU1RfU1RBQ0tfTEVOKCkgKCh1bnNpZ25lZCkoY29uc3Rfc3RhY2tfdG9wICsgMSkpCiAKICNkZWZpbmUgQ09OU1RfU1RBQ0tfUFVTSF9PUChpKSBkbyB7IFwKICAgICBQeU9iamVjdCAqX3g7IFwKICAgICBhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsgXAotICAgIGFzc2VydChQeUxpc3RfR0VUX1NJWkUoY29uc3RzKSA+IEdFVEFSRyhjb2Rlc3RyLCBpKSk7IFwKLSAgICBfeCA9IFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIEdFVEFSRyhjb2Rlc3RyLCBpKSk7IFwKKyAgICBhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKGNvbnN0cykgPiAoUHlfc3NpemVfdClnZXRfYXJnKGNvZGVzdHIsIGkpKTsgXAorICAgIF94ID0gUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgZ2V0X2FyZyhjb2Rlc3RyLCBpKSk7IFwKICAgICBpZiAoKytjb25zdF9zdGFja190b3AgPj0gY29uc3Rfc3RhY2tfc2l6ZSkgeyBcCiAgICAgICAgIGNvbnN0X3N0YWNrX3NpemUgKj0gMjsgXAogICAgICAgICBQeU1lbV9SZXNpemUoY29uc3Rfc3RhY2ssIFB5T2JqZWN0ICosIGNvbnN0X3N0YWNrX3NpemUpOyBcCi0gICAgICAgIFB5TWVtX1Jlc2l6ZShsb2FkX2NvbnN0X3N0YWNrLCBQeV9zc2l6ZV90LCBjb25zdF9zdGFja19zaXplKTsgXAotICAgICAgICBpZiAoIWNvbnN0X3N0YWNrIHx8ICFsb2FkX2NvbnN0X3N0YWNrKSB7IFwKKyAgICAgICAgaWYgKCFjb25zdF9zdGFjaykgeyBcCiAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOyBcCiAgICAgICAgICAgICBnb3RvIGV4aXRFcnJvcjsgXAogICAgICAgICB9IFwKICAgICB9IFwKLSAgICBsb2FkX2NvbnN0X3N0YWNrW2NvbnN0X3N0YWNrX3RvcF0gPSBpOyBcCiAgICAgY29uc3Rfc3RhY2tbY29uc3Rfc3RhY2tfdG9wXSA9IF94OyBcCiAgICAgaW5fY29uc3RzID0gMTsgXAogICAgIH0gd2hpbGUoMCkKQEAgLTcwLDIyICs1OSwxMDggQEAKICAgICBjb25zdF9zdGFja190b3AgPSAtMTsgXAogICAgIH0gd2hpbGUoMCkKIAotI2RlZmluZSBDT05TVF9TVEFDS19UT1AoKSBcCi0gICAgY29uc3Rfc3RhY2tbY29uc3Rfc3RhY2tfdG9wXQotCiAjZGVmaW5lIENPTlNUX1NUQUNLX0xBU1ROKGkpIFwKLSAgICAmY29uc3Rfc3RhY2tbY29uc3Rfc3RhY2tfdG9wIC0gaSArIDFdCisgICAgJmNvbnN0X3N0YWNrW0NPTlNUX1NUQUNLX0xFTigpIC0gaV0KIAogI2RlZmluZSBDT05TVF9TVEFDS19QT1AoaSkgZG8geyBcCi0gICAgYXNzZXJ0KGNvbnN0X3N0YWNrX3RvcCArIDEgPj0gaSk7IFwKKyAgICBhc3NlcnQoQ09OU1RfU1RBQ0tfTEVOKCkgPj0gaSk7IFwKICAgICBjb25zdF9zdGFja190b3AgLT0gaTsgXAogICAgIH0gd2hpbGUoMCkKIAotI2RlZmluZSBDT05TVF9TVEFDS19PUF9MQVNUTihpKSBcCi0gICAgKChjb25zdF9zdGFja190b3AgPj0gaSAtIDEpID8gbG9hZF9jb25zdF9zdGFja1tjb25zdF9zdGFja190b3AgLSBpICsgMV0gOiAtMSkKKy8qIFNjYW5zIGJhY2sgTiBjb25zZWN1dGl2ZSBMT0FEX0NPTlNUIGluc3RydWN0aW9ucywgc2tpcHBpbmcgTk9QcywKKyAgIHJldHVybnMgaW5kZXggb2YgdGhlIE50aCBsYXN0J3MgTE9BRF9DT05TVCdzIEVYVEVOREVEX0FSRyBwcmVmaXguCisgICBDYWxsZXJzIGFyZSByZXNwb25zaWJsZSB0byBjaGVjayBDT05TVF9TVEFDS19MRU4gYmVmb3JlaGFuZC4KKyovCitzdGF0aWMgUHlfc3NpemVfdAorbGFzdG5fY29uc3Rfc3RhcnQodW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBpLCBQeV9zc2l6ZV90IG4pCit7CisgICAgYXNzZXJ0KG4gPiAwICYmIChpJjEpID09IDApOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaSAtPSAyOworICAgICAgICBhc3NlcnQoaSA+PSAwKTsKKyAgICAgICAgaWYgKGNvZGVzdHJbaV0gPT0gTE9BRF9DT05TVCkgeworICAgICAgICAgICAgaWYgKCEtLW4pIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaSA+IDAgJiYgY29kZXN0cltpLTJdID09IEVYVEVOREVEX0FSRykgeworICAgICAgICAgICAgICAgICAgICBpIC09IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGNvZGVzdHJbaV0gPT0gTk9QIHx8IGNvZGVzdHJbaV0gPT0gRVhURU5ERURfQVJHKTsKKyAgICAgICAgfQorICAgIH0KK30KIAorLyogU2NhbnMgdGhyb3VnaCBFWFRFTkRFRCBBUkdzLCBzZWVraW5nIHRoZSBpbmRleCBvZiB0aGUgZWZmZWN0aXZlIG9wY29kZSAqLworc3RhdGljIFB5X3NzaXplX3QKK2ZpbmRfb3AodW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBpKQoreworICAgIGFzc2VydCgoaSYxKSA9PSAwKTsKKyAgICB3aGlsZSAoY29kZXN0cltpXSA9PSBFWFRFTkRFRF9BUkcpIHsKKyAgICAgICAgaSArPSAyOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KIAotLyogUmVwbGFjZSBMT0FEX0NPTlNUIGMxLiBMT0FEX0NPTlNUIGMyIC4uLiBMT0FEX0NPTlNUIGNuIEJVSUxEX1RVUExFIG4KKy8qIEdpdmVuIHRoZSBpbmRleCBvZiB0aGUgZWZmZWN0aXZlIG9wY29kZSwKKyAgIHNjYW4gYmFjayB0byBjb25zdHJ1Y3QgdGhlIG9wYXJnIHdpdGggRVhURU5ERURfQVJHICovCitzdGF0aWMgdW5zaWduZWQgaW50CitnZXRfYXJnKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5X3NzaXplX3QgaSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgb3BhcmcgPSBjb2Rlc3RyW2krMV07CisgICAgYXNzZXJ0KChpJjEpID09IDApOworICAgIGlmIChpID49IDIgJiYgY29kZXN0cltpLTJdID09IEVYVEVOREVEX0FSRykgeworICAgICAgICBvcGFyZyB8PSBjb2Rlc3RyW2ktMV0gPDwgODsKKyAgICAgICAgaWYgKGkgPj0gNCAmJiBjb2Rlc3RyW2ktNF0gPT0gRVhURU5ERURfQVJHKSB7CisgICAgICAgICAgICBvcGFyZyB8PSBjb2Rlc3RyW2ktM10gPDwgMTY7CisgICAgICAgICAgICBpZiAoaSA+PSA2ICYmIGNvZGVzdHJbaS02XSA9PSBFWFRFTkRFRF9BUkcpIHsKKyAgICAgICAgICAgICAgICBvcGFyZyB8PSBjb2Rlc3RyW2ktNV0gPDwgMjQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG9wYXJnOworfQorCisvKiBHaXZlbiB0aGUgaW5kZXggb2YgdGhlIGVmZmVjdGl2ZSBvcGNvZGUsCisgICBhdHRlbXB0IHRvIHJlcGxhY2UgdGhlIGFyZ3VtZW50LCB0YWtpbmcgaW50byBhY2NvdW50IEVYVEVOREVEX0FSRy4KKyAgIFJldHVybnMgLTEgb24gZmFpbHVyZSwgb3IgdGhlIG5ldyBvcCBpbmRleCBvbiBzdWNjZXNzICovCitzdGF0aWMgUHlfc3NpemVfdAorc2V0X2FyZyh1bnNpZ25lZCBjaGFyICpjb2Rlc3RyLCBQeV9zc2l6ZV90IGksIHVuc2lnbmVkIGludCBvcGFyZykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY3VyYXJnID0gZ2V0X2FyZyhjb2Rlc3RyLCBpKTsKKyAgICBpbnQgY3VyaWxlbiwgbmV3aWxlbjsKKyAgICBpZiAoY3VyYXJnID09IG9wYXJnKQorICAgICAgICByZXR1cm4gaTsKKyAgICBjdXJpbGVuID0gaW5zdHJzaXplKGN1cmFyZyk7CisgICAgbmV3aWxlbiA9IGluc3Ryc2l6ZShvcGFyZyk7CisgICAgaWYgKGN1cmlsZW4gPCBuZXdpbGVuKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB3cml0ZV9vcF9hcmcoY29kZXN0ciArIGkgKyAyIC0gY3VyaWxlbiwgY29kZXN0cltpXSwgb3BhcmcsIG5ld2lsZW4pOworICAgIG1lbXNldChjb2Rlc3RyICsgaSArIDIgLSBjdXJpbGVuICsgbmV3aWxlbiwgTk9QLCBjdXJpbGVuIC0gbmV3aWxlbik7CisgICAgcmV0dXJuIGktY3VyaWxlbituZXdpbGVuOworfQorCisvKiBBdHRlbXB0IHRvIHdyaXRlIG9wL2FyZyBhdCBlbmQgb2Ygc3BlY2lmaWVkIHJlZ2lvbiBvZiBtZW1vcnkuCisgICBQcmVjZWRpbmcgbWVtb3J5IGluIHRoZSByZWdpb24gaXMgb3ZlcndyaXR0ZW4gd2l0aCBOT1BzLgorICAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLCBvcCBpbmRleCBvbiBzdWNjZXNzICovCitzdGF0aWMgUHlfc3NpemVfdAorY29weV9vcF9hcmcodW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBpLCB1bnNpZ25lZCBjaGFyIG9wLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG9wYXJnLCBQeV9zc2l6ZV90IG1heGkpCit7CisgICAgaW50IGlsZW4gPSBpbnN0cnNpemUob3BhcmcpOworICAgIGFzc2VydCgoaSYxKSA9PSAwKTsKKyAgICBpZiAoaSArIGlsZW4gPiBtYXhpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgd3JpdGVfb3BfYXJnKGNvZGVzdHIgKyBtYXhpIC0gaWxlbiwgb3AsIG9wYXJnLCBpbGVuKTsKKyAgICBtZW1zZXQoY29kZXN0ciArIGksIE5PUCwgbWF4aSAtIGkgLSBpbGVuKTsKKyAgICByZXR1cm4gbWF4aSAtIDI7Cit9CisKKy8qIFJlcGxhY2UgTE9BRF9DT05TVCBjMSwgTE9BRF9DT05TVCBjMiAuLi4gTE9BRF9DT05TVCBjbiwgQlVJTERfVFVQTEUgbgogICAgd2l0aCAgICBMT0FEX0NPTlNUIChjMSwgYzIsIC4uLiBjbikuCiAgICBUaGUgY29uc3RzIHRhYmxlIG11c3Qgc3RpbGwgYmUgaW4gbGlzdCBmb3JtIHNvIHRoYXQgdGhlCiAgICBuZXcgY29uc3RhbnQgKGMxLCBjMiwgLi4uIGNuKSBjYW4gYmUgYXBwZW5kZWQuCkBAIC05NCw5ICsxNjksMTAgQEAKICAgIEFsc28gd29ya3MgZm9yIEJVSUxEX0xJU1QgYW5kIEJVSUxUX1NFVCB3aGVuIGZvbGxvd2VkIGJ5IGFuICJpbiIgb3IgIm5vdCBpbiIKICAgIHRlc3Q7IGZvciBCVUlMRF9TRVQgaXQgYXNzZW1ibGVzIGEgZnJvemVuc2V0IHJhdGhlciB0aGFuIGEgdHVwbGUuCiAqLwotc3RhdGljIGludAotdHVwbGVfb2ZfY29uc3RhbnRzKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5X3NzaXplX3QgbiwKLSAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29uc3RzLCBQeU9iamVjdCAqKm9ianMpCitzdGF0aWMgUHlfc3NpemVfdAorZm9sZF90dXBsZV9vbl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBjX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvcGNvZGVfZW5kLCB1bnNpZ25lZCBjaGFyIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjb25zdHMsIFB5T2JqZWN0ICoqb2JqcywgaW50IG4pCiB7CiAgICAgUHlPYmplY3QgKm5ld2NvbnN0LCAqY29uc3RhbnQ7CiAgICAgUHlfc3NpemVfdCBpLCBsZW5fY29uc3RzOwpAQCAtMTA2LDkgKzE4Miw5IEBACiAKICAgICAvKiBCdWlsZHVwIG5ldyB0dXBsZSBvZiBjb25zdGFudHMgKi8KICAgICBuZXdjb25zdCA9IFB5VHVwbGVfTmV3KG4pOwotICAgIGlmIChuZXdjb25zdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLSAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CisgICAgaWYgKG5ld2NvbnN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgewogICAgICAgICBjb25zdGFudCA9IG9ianNbaV07CiAgICAgICAgIFB5X0lOQ1JFRihjb25zdGFudCk7CkBAIC0xMTYsMzAgKzE5MiwyNiBAQAogICAgIH0KIAogICAgIC8qIElmIGl0J3MgYSBCVUlMRF9TRVQsIHVzZSB0aGUgUHlUdXBsZSB3ZSBqdXN0IGJ1aWx0IHRvIGNyZWF0ZSBhCi0gICAgICBQeUZyb3plblNldCwgYW5kIHVzZSB0aGF0IGFzIHRoZSBjb25zdGFudCBpbnN0ZWFkOiAqLwotICAgIGlmIChjb2Rlc3RyWzBdID09IEJVSUxEX1NFVCkgewotICAgICAgICBQeU9iamVjdCAqdHVwbGUgPSBuZXdjb25zdDsKLSAgICAgICAgbmV3Y29uc3QgPSBQeUZyb3plblNldF9OZXcodHVwbGUpOwotICAgICAgICBQeV9ERUNSRUYodHVwbGUpOwotICAgICAgICBpZiAobmV3Y29uc3QgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIFB5RnJvemVuU2V0LCBhbmQgdXNlIHRoYXQgYXMgdGhlIGNvbnN0YW50IGluc3RlYWQ6ICovCisgICAgaWYgKG9wY29kZSA9PSBCVUlMRF9TRVQpIHsKKyAgICAgICAgUHlfU0VUUkVGKG5ld2NvbnN0LCBQeUZyb3plblNldF9OZXcobmV3Y29uc3QpKTsKKyAgICAgICAgaWYgKG5ld2NvbnN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qIEFwcGVuZCBmb2xkZWQgY29uc3RhbnQgb250byBjb25zdHMgKi8KKyAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CiAgICAgaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBuZXdjb25zdCkpIHsKICAgICAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKIAotICAgIC8qIFdyaXRlIE5PUHMgb3ZlciBvbGQgTE9BRF9DT05TVFMgYW5kCi0gICAgICAgYWRkIGEgbmV3IExPQURfQ09OU1QgbmV3Y29uc3Qgb24gdG9wIG9mIHRoZSBCVUlMRF9UVVBMRSBuICovCi0gICAgY29kZXN0clswXSA9IExPQURfQ09OU1Q7Ci0gICAgU0VUQVJHKGNvZGVzdHIsIDAsIGxlbl9jb25zdHMpOwotICAgIHJldHVybiAxOworICAgIHJldHVybiBjb3B5X29wX2FyZyhjb2Rlc3RyLCBjX3N0YXJ0LCBMT0FEX0NPTlNULCBsZW5fY29uc3RzLCBvcGNvZGVfZW5kKTsKIH0KIAotLyogUmVwbGFjZSBMT0FEX0NPTlNUIGMxLiBMT0FEX0NPTlNUIGMyIEJJTk9QCisvKiBSZXBsYWNlIExPQURfQ09OU1QgYzEsIExPQURfQ09OU1QgYzIsIEJJTk9QCiAgICB3aXRoICAgIExPQURfQ09OU1QgYmlub3AoYzEsYzIpCiAgICBUaGUgY29uc3RzIHRhYmxlIG11c3Qgc3RpbGwgYmUgaW4gbGlzdCBmb3JtIHNvIHRoYXQgdGhlCiAgICBuZXcgY29uc3RhbnQgY2FuIGJlIGFwcGVuZGVkLgpAQCAtMTQ5LDIwICsyMjEsMjEgQEAKICAgIGlzIGJlbG93IGEgdGhyZXNob2xkIHZhbHVlLiAgVGhhdCBrZWVwcyBweWMgZmlsZXMgZnJvbQogICAgYmVjb21pbmcgbGFyZ2UgaW4gdGhlIHByZXNlbmNlIG9mIGNvZGUgbGlrZTogIChOb25lLCkqMTAwMC4KICovCi1zdGF0aWMgaW50Ci1mb2xkX2Jpbm9wc19vbl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlPYmplY3QgKmNvbnN0cywgUHlPYmplY3QgKipvYmpzKQorc3RhdGljIFB5X3NzaXplX3QKK2ZvbGRfYmlub3BzX29uX2NvbnN0YW50cyh1bnNpZ25lZCBjaGFyICpjb2Rlc3RyLCBQeV9zc2l6ZV90IGNfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvcGNvZGVfZW5kLCB1bnNpZ25lZCBjaGFyIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29uc3RzLCBQeU9iamVjdCAqKm9ianMpCiB7CiAgICAgUHlPYmplY3QgKm5ld2NvbnN0LCAqdiwgKnc7CiAgICAgUHlfc3NpemVfdCBsZW5fY29uc3RzLCBzaXplOwotICAgIGludCBvcGNvZGU7CiAKICAgICAvKiBQcmUtY29uZGl0aW9ucyAqLwogICAgIGFzc2VydChQeUxpc3RfQ2hlY2tFeGFjdChjb25zdHMpKTsKKyAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CiAKICAgICAvKiBDcmVhdGUgbmV3IGNvbnN0YW50ICovCiAgICAgdiA9IG9ianNbMF07CiAgICAgdyA9IG9ianNbMV07Ci0gICAgb3Bjb2RlID0gY29kZXN0clswXTsKICAgICBzd2l0Y2ggKG9wY29kZSkgewogICAgICAgICBjYXNlIEJJTkFSWV9QT1dFUjoKICAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfUG93ZXIodiwgdywgUHlfTm9uZSk7CkBAIC0yMDgsNTAgKzI4MSw0OCBAQAogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBiaW5hcnkgb3BlcmF0aW9uICVkIG9uIGEgY29uc3RhbnQiLAogICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBpZiAobmV3Y29uc3QgPT0gTlVMTCkgewotICAgICAgICBpZighUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlib2FyZEludGVycnVwdCkpCisgICAgICAgIGlmKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleWJvYXJkSW50ZXJydXB0KSkgewogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBzaXplID0gUHlPYmplY3RfU2l6ZShuZXdjb25zdCk7CiAgICAgaWYgKHNpemUgPT0gLTEpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQpKQotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleWJvYXJkSW50ZXJydXB0KSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgfSBlbHNlIGlmIChzaXplID4gMjApIHsKICAgICAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICAvKiBBcHBlbmQgZm9sZGVkIGNvbnN0YW50IGludG8gY29uc3RzIHRhYmxlICovCi0gICAgbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOwogICAgIGlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgbmV3Y29uc3QpKSB7CiAgICAgICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CiAKLSAgICAvKiBXcml0ZSBOT1AgTk9QIE5PUCBOT1AgTE9BRF9DT05TVCBuZXdjb25zdCAqLwotICAgIGNvZGVzdHJbLTJdID0gTE9BRF9DT05TVDsKLSAgICBTRVRBUkcoY29kZXN0ciwgLTIsIGxlbl9jb25zdHMpOwotICAgIHJldHVybiAxOworICAgIHJldHVybiBjb3B5X29wX2FyZyhjb2Rlc3RyLCBjX3N0YXJ0LCBMT0FEX0NPTlNULCBsZW5fY29uc3RzLCBvcGNvZGVfZW5kKTsKIH0KIAotc3RhdGljIGludAotZm9sZF91bmFyeW9wc19vbl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlPYmplY3QgKmNvbnN0cywgUHlPYmplY3QgKnYpCitzdGF0aWMgUHlfc3NpemVfdAorZm9sZF91bmFyeW9wc19vbl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBjX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvcGNvZGVfZW5kLCB1bnNpZ25lZCBjaGFyIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjb25zdHMsIFB5T2JqZWN0ICp2KQogewogICAgIFB5T2JqZWN0ICpuZXdjb25zdDsKICAgICBQeV9zc2l6ZV90IGxlbl9jb25zdHM7Ci0gICAgaW50IG9wY29kZTsKIAogICAgIC8qIFByZS1jb25kaXRpb25zICovCiAgICAgYXNzZXJ0KFB5TGlzdF9DaGVja0V4YWN0KGNvbnN0cykpOwotICAgIGFzc2VydChjb2Rlc3RyWzBdID09IExPQURfQ09OU1QpOworICAgIGxlbl9jb25zdHMgPSBQeUxpc3RfR0VUX1NJWkUoY29uc3RzKTsKIAogICAgIC8qIENyZWF0ZSBuZXcgY29uc3RhbnQgKi8KLSAgICBvcGNvZGUgPSBjb2Rlc3RyWzNdOwogICAgIHN3aXRjaCAob3Bjb2RlKSB7CiAgICAgICAgIGNhc2UgVU5BUllfTkVHQVRJVkU6CiAgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX05lZ2F0aXZlKHYpOwpAQCAtMjY3LDM1ICszMzgsMzEgQEAKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgdW5hcnkgb3BlcmF0aW9uICVkIG9uIGEgY29uc3RhbnQiLAogICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBpZiAobmV3Y29uc3QgPT0gTlVMTCkgewotICAgICAgICBpZighUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlib2FyZEludGVycnVwdCkpCisgICAgICAgIGlmKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleWJvYXJkSW50ZXJydXB0KSkgewogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIC8qIEFwcGVuZCBmb2xkZWQgY29uc3RhbnQgaW50byBjb25zdHMgdGFibGUgKi8KLSAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CiAgICAgaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBuZXdjb25zdCkpIHsKICAgICAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKIAotICAgIC8qIFdyaXRlIE5PUCBMT0FEX0NPTlNUIG5ld2NvbnN0ICovCi0gICAgY29kZXN0clswXSA9IE5PUDsKLSAgICBjb2Rlc3RyWzFdID0gTE9BRF9DT05TVDsKLSAgICBTRVRBUkcoY29kZXN0ciwgMSwgbGVuX2NvbnN0cyk7Ci0gICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIGNvcHlfb3BfYXJnKGNvZGVzdHIsIGNfc3RhcnQsIExPQURfQ09OU1QsIGxlbl9jb25zdHMsIG9wY29kZV9lbmQpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50ICoKIG1hcmtibG9ja3ModW5zaWduZWQgY2hhciAqY29kZSwgUHlfc3NpemVfdCBsZW4pCiB7CiAgICAgdW5zaWduZWQgaW50ICpibG9ja3MgPSBQeU1lbV9OZXcodW5zaWduZWQgaW50LCBsZW4pOwotICAgIGludCBpLGosIG9wY29kZSwgYmxvY2tjbnQgPSAwOworICAgIGludCBpLCBqLCBvcGNvZGUsIGJsb2NrY250ID0gMDsKIAogICAgIGlmIChibG9ja3MgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwpAQCAtMzA0LDcgKzM3MSw3IEBACiAgICAgbWVtc2V0KGJsb2NrcywgMCwgbGVuKnNpemVvZihpbnQpKTsKIAogICAgIC8qIE1hcmsgbGFiZWxzIGluIHRoZSBmaXJzdCBwYXNzICovCi0gICAgZm9yIChpPTAgOyBpPGxlbiA7IGkrPUNPREVTSVpFKG9wY29kZSkpIHsKKyAgICBmb3IgKGk9MCA7IGk8bGVuIDsgaSs9MikgewogICAgICAgICBvcGNvZGUgPSBjb2RlW2ldOwogICAgICAgICBzd2l0Y2ggKG9wY29kZSkgewogICAgICAgICAgICAgY2FzZSBGT1JfSVRFUjoKQEAgLTMyNiw3ICszOTMsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIC8qIEJ1aWxkIGJsb2NrIG51bWJlcnMgaW4gdGhlIHNlY29uZCBwYXNzICovCi0gICAgZm9yIChpPTAgOyBpPGxlbiA7IGkrKykgeworICAgIGZvciAoaT0wIDsgaTxsZW4gOyBpKz0yKSB7CiAgICAgICAgIGJsb2NrY250ICs9IGJsb2Nrc1tpXTsgICAgICAgICAgLyogaW5jcmVtZW50IGJsb2NrY250IG92ZXIgbGFiZWxzICovCiAgICAgICAgIGJsb2Nrc1tpXSA9IGJsb2NrY250OwogICAgIH0KQEAgLTMzNywzMyArNDA0LDI3IEBACiAgICBUaGUgY29uc3RzIG9iamVjdCBzaG91bGQgc3RpbGwgYmUgaW4gbGlzdCBmb3JtIHRvIGFsbG93IG5ldyBjb25zdGFudHMKICAgIHRvIGJlIGFwcGVuZGVkLgogCi0gICBUbyBrZWVwIHRoZSBvcHRpbWl6ZXIgc2ltcGxlLCBpdCBiYWlscyBvdXQgKGRvZXMgbm90aGluZykgZm9yIGNvZGUgdGhhdAotICAgaGFzIGEgbGVuZ3RoIG92ZXIgMzIsNzAwLCBhbmQgZG9lcyBub3QgY2FsY3VsYXRlIGV4dGVuZGVkIGFyZ3VtZW50cy4KLSAgIFRoYXQgYWxsb3dzIHVzIHRvIGF2b2lkIG92ZXJmbG93IGFuZCBzaWduIGlzc3Vlcy4gTGlrZXdpc2UsIGl0IGJhaWxzIHdoZW4KLSAgIHRoZSBsaW5lbm8gdGFibGUgaGFzIGNvbXBsZXggZW5jb2RpbmcgZm9yIGdhcHMgPj0gMjU1LiBFWFRFTkRFRF9BUkcgY2FuCi0gICBhcHBlYXIgYmVmb3JlIE1BS0VfRlVOQ1RJT047IGluIHRoaXMgY2FzZSBib3RoIG9wY29kZXMgYXJlIHNraXBwZWQuCi0gICBFWFRFTkRFRF9BUkcgcHJlY2VkaW5nIGFueSBvdGhlciBvcGNvZGUgY2F1c2VzIHRoZSBvcHRpbWl6ZXIgdG8gYmFpbC4KKyAgIFRvIGtlZXAgdGhlIG9wdGltaXplciBzaW1wbGUsIGl0IGJhaWxzIHdoZW4gdGhlIGxpbmVubyB0YWJsZSBoYXMgY29tcGxleAorICAgZW5jb2RpbmcgZm9yIGdhcHMgPj0gMjU1LgogCiAgICBPcHRpbWl6YXRpb25zIGFyZSByZXN0cmljdGVkIHRvIHNpbXBsZSB0cmFuc2Zvcm1hdGlvbnMgb2NjdXJyaW5nIHdpdGhpbiBhCiAgICBzaW5nbGUgYmFzaWMgYmxvY2suICBBbGwgdHJhbnNmb3JtYXRpb25zIGtlZXAgdGhlIGNvZGUgc2l6ZSB0aGUgc2FtZSBvcgogICAgc21hbGxlci4gIEZvciB0aG9zZSB0aGF0IHJlZHVjZSBzaXplLCB0aGUgZ2FwcyBhcmUgaW5pdGlhbGx5IGZpbGxlZCB3aXRoCiAgICBOT1BzLiAgTGF0ZXIgdGhvc2UgTk9QcyBhcmUgcmVtb3ZlZCBhbmQgdGhlIGp1bXAgYWRkcmVzc2VzIHJldGFyZ2V0ZWQgaW4KLSAgIGEgc2luZ2xlIHBhc3MuICBMaW5lIG51bWJlcmluZyBpcyBhZGp1c3RlZCBhY2NvcmRpbmdseS4gKi8KKyAgIGEgc2luZ2xlIHBhc3MuICovCiAKIFB5T2JqZWN0ICoKIFB5Q29kZV9PcHRpbWl6ZShQeU9iamVjdCAqY29kZSwgUHlPYmplY3QqIGNvbnN0cywgUHlPYmplY3QgKm5hbWVzLAotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpsaW5lbm9fb2JqKQorICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpsbm90YWJfb2JqKQogewotICAgIFB5X3NzaXplX3QgaSwgaiwgY29kZWxlbjsKLSAgICBpbnQgbm9wcywgaCwgYWRqOwotICAgIGludCB0Z3QsIHRndHRndCwgb3Bjb2RlOworICAgIFB5X3NzaXplX3QgaCwgaSwgbmV4dGksIG9wX3N0YXJ0LCBjb2RlbGVuLCB0Z3Q7CisgICAgdW5zaWduZWQgaW50IGosIG5vcHM7CisgICAgdW5zaWduZWQgY2hhciBvcGNvZGUsIG5leHRvcDsKICAgICB1bnNpZ25lZCBjaGFyICpjb2Rlc3RyID0gTlVMTDsKLSAgICB1bnNpZ25lZCBjaGFyICpsaW5lbm87Ci0gICAgaW50ICphZGRybWFwID0gTlVMTDsKLSAgICBpbnQgbmV3X2xpbmUsIGN1bV9vcmlnX2xpbmUsIGxhc3RfbGluZTsKKyAgICB1bnNpZ25lZCBjaGFyICpsbm90YWI7CisgICAgdW5zaWduZWQgaW50IGN1bV9vcmlnX29mZnNldCwgbGFzdF9vZmZzZXQ7CiAgICAgUHlfc3NpemVfdCB0YWJzaXo7CiAgICAgUHlPYmplY3QgKipjb25zdF9zdGFjayA9IE5VTEw7Ci0gICAgUHlfc3NpemVfdCAqbG9hZF9jb25zdF9zdGFjayA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBjb25zdF9zdGFja190b3AgPSAtMTsKICAgICBQeV9zc2l6ZV90IGNvbnN0X3N0YWNrX3NpemUgPSAwOwogICAgIGludCBpbl9jb25zdHMgPSAwOyAgLyogd2hldGhlciB3ZSBhcmUgaW4gYSBMT0FEX0NPTlNUIHNlcXVlbmNlICovCkBAIC0zNzMsMTggKzQzNCwyMSBAQAogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICBnb3RvIGV4aXRFcnJvcjsKIAotICAgIC8qIEJ5cGFzcyBvcHRpbWl6YXRpb24gd2hlbiB0aGUgbGluZW5vIHRhYmxlIGlzIHRvbyBjb21wbGV4ICovCi0gICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sobGluZW5vX29iaikpOwotICAgIGxpbmVubyA9ICh1bnNpZ25lZCBjaGFyKilQeUJ5dGVzX0FTX1NUUklORyhsaW5lbm9fb2JqKTsKLSAgICB0YWJzaXogPSBQeUJ5dGVzX0dFVF9TSVpFKGxpbmVub19vYmopOwotICAgIGlmIChtZW1jaHIobGluZW5vLCAyNTUsIHRhYnNpeikgIT0gTlVMTCkKKyAgICAvKiBCeXBhc3Mgb3B0aW1pemF0aW9uIHdoZW4gdGhlIGxub3RhYiB0YWJsZSBpcyB0b28gY29tcGxleCAqLworICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKGxub3RhYl9vYmopKTsKKyAgICBsbm90YWIgPSAodW5zaWduZWQgY2hhciopUHlCeXRlc19BU19TVFJJTkcobG5vdGFiX29iaik7CisgICAgdGFic2l6ID0gUHlCeXRlc19HRVRfU0laRShsbm90YWJfb2JqKTsKKyAgICBhc3NlcnQodGFic2l6ID09IDAgfHwgUHlfUkVGQ05UKGxub3RhYl9vYmopID09IDEpOworICAgIGlmIChtZW1jaHIobG5vdGFiLCAyNTUsIHRhYnNpeikgIT0gTlVMTCkgeworICAgICAgICAvKiAyNTUgdmFsdWUgYXJlIHVzZWQgZm9yIG11bHRpYnl0ZSBieXRlY29kZSBpbnN0cnVjdGlvbnMgKi8KICAgICAgICAgZ290byBleGl0VW5jaGFuZ2VkOworICAgIH0KKyAgICAvKiBOb3RlOiAtMTI4IGFuZCAxMjcgc3BlY2lhbCB2YWx1ZXMgZm9yIGxpbmUgbnVtYmVyIGRlbHRhIGFyZSBvaywKKyAgICAgICB0aGUgcGVlcGhvbGUgb3B0aW1pemVyIGRvZXNuJ3QgbW9kaWZ5IGxpbmUgbnVtYmVycy4gKi8KIAotICAgIC8qIEF2b2lkIHNpdHVhdGlvbnMgd2hlcmUganVtcCByZXRhcmdldGluZyBjb3VsZCBvdmVyZmxvdyAqLwogICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKGNvZGUpKTsKICAgICBjb2RlbGVuID0gUHlCeXRlc19HRVRfU0laRShjb2RlKTsKLSAgICBpZiAoY29kZWxlbiA+IDMyNzAwKQotICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7CisgICAgYXNzZXJ0KGNvZGVsZW4gJSAyID09IDApOwogCiAgICAgLyogTWFrZSBhIG1vZGlmaWFibGUgY29weSBvZiB0aGUgY29kZSBzdHJpbmcgKi8KICAgICBjb2Rlc3RyID0gKHVuc2lnbmVkIGNoYXIgKilQeU1lbV9NYWxsb2MoY29kZWxlbik7CkBAIC0zOTUsMjEgKzQ1OSw2IEBACiAgICAgY29kZXN0ciA9ICh1bnNpZ25lZCBjaGFyICopbWVtY3B5KGNvZGVzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGNvZGUpLCBjb2RlbGVuKTsKIAotICAgIC8qIFZlcmlmeSB0aGF0IFJFVFVSTl9WQUxVRSB0ZXJtaW5hdGVzIHRoZSBjb2Rlc3RyaW5nLiAgICAgIFRoaXMgYWxsb3dzCi0gICAgICAgdGhlIHZhcmlvdXMgdHJhbnNmb3JtYXRpb24gcGF0dGVybnMgdG8gbG9vayBhaGVhZCBzZXZlcmFsCi0gICAgICAgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgYWRkaXRpb25hbCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIG5vdAotICAgICAgIGxvb2tpbmcgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGNvZGUgc3RyaW5nLgotICAgICovCi0gICAgaWYgKGNvZGVzdHJbY29kZWxlbi0xXSAhPSBSRVRVUk5fVkFMVUUpCi0gICAgICAgIGdvdG8gZXhpdFVuY2hhbmdlZDsKLQotICAgIC8qIE1hcHBpbmcgdG8gbmV3IGp1bXAgdGFyZ2V0cyBhZnRlciBOT1BzIGFyZSByZW1vdmVkICovCi0gICAgYWRkcm1hcCA9IFB5TWVtX05ldyhpbnQsIGNvZGVsZW4pOwotICAgIGlmIChhZGRybWFwID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgZ290byBleGl0RXJyb3I7Ci0gICAgfQotCiAgICAgYmxvY2tzID0gbWFya2Jsb2Nrcyhjb2Rlc3RyLCBjb2RlbGVuKTsKICAgICBpZiAoYmxvY2tzID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXhpdEVycm9yOwpAQCAtNDE3LDkgKzQ2NiwxNyBAQAogCiAgICAgQ09OU1RfU1RBQ0tfQ1JFQVRFKCk7CiAKLSAgICBmb3IgKGk9MCA7IGk8Y29kZWxlbiA7IGkgKz0gQ09ERVNJWkUoY29kZXN0cltpXSkpIHsKLSAgICAgIHJlb3B0aW1pemVfY3VycmVudDoKKyAgICBmb3IgKGk9ZmluZF9vcChjb2Rlc3RyLCAwKSA7IGk8Y29kZWxlbiA7IGk9bmV4dGkpIHsKICAgICAgICAgb3Bjb2RlID0gY29kZXN0cltpXTsKKyAgICAgICAgb3Bfc3RhcnQgPSBpOworICAgICAgICB3aGlsZSAob3Bfc3RhcnQgPj0gMiAmJiBjb2Rlc3RyW29wX3N0YXJ0LTJdID09IEVYVEVOREVEX0FSRykgeworICAgICAgICAgICAgb3Bfc3RhcnQgLT0gMjsKKyAgICAgICAgfQorCisgICAgICAgIG5leHRpID0gaSArIDI7CisgICAgICAgIHdoaWxlIChuZXh0aSA8IGNvZGVsZW4gJiYgY29kZXN0cltuZXh0aV0gPT0gRVhURU5ERURfQVJHKQorICAgICAgICAgICAgbmV4dGkgKz0gMjsKKyAgICAgICAgbmV4dG9wID0gbmV4dGkgPCBjb2RlbGVuID8gY29kZXN0cltuZXh0aV0gOiAwOwogCiAgICAgICAgIGlmICghaW5fY29uc3RzKSB7CiAgICAgICAgICAgICBDT05TVF9TVEFDS19SRVNFVCgpOwpAQCAtNDMwLDE0ICs0ODcsMTIgQEAKICAgICAgICAgICAgIC8qIFJlcGxhY2UgVU5BUllfTk9UIFBPUF9KVU1QX0lGX0ZBTFNFCiAgICAgICAgICAgICAgICB3aXRoICAgIFBPUF9KVU1QX0lGX1RSVUUgKi8KICAgICAgICAgICAgIGNhc2UgVU5BUllfTk9UOgotICAgICAgICAgICAgICAgIGlmIChjb2Rlc3RyW2krMV0gIT0gUE9QX0pVTVBfSUZfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgfHwgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw0KSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKzEpOwotICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBQT1BfSlVNUF9JRl9UUlVFOwotICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCBqKTsKLSAgICAgICAgICAgICAgICBjb2Rlc3RyW2krM10gPSBOT1A7Ci0gICAgICAgICAgICAgICAgZ290byByZW9wdGltaXplX2N1cnJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKG5leHRvcCAhPSBQT1BfSlVNUF9JRl9GQUxTRQorICAgICAgICAgICAgICAgICAgICB8fCAhSVNCQVNJQ0JMT0NLKGJsb2Nrcywgb3Bfc3RhcnQsIGkrMikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyICsgb3Bfc3RhcnQsIE5PUCwgaSAtIG9wX3N0YXJ0ICsgMik7CisgICAgICAgICAgICAgICAgY29kZXN0cltuZXh0aV0gPSBQT1BfSlVNUF9JRl9UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgLyogbm90IGEgaXMgYiAtLT4gIGEgaXMgbm90IGIKICAgICAgICAgICAgICAgICAgICBub3QgYSBpbiBiIC0tPiAgYSBub3QgaW4gYgpAQCAtNDQ1LDc4ICs1MDAsNzkgQEAKICAgICAgICAgICAgICAgICAgICBub3QgYSBub3QgaW4gYiAtLT4gIGEgaW4gYgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICBjYXNlIENPTVBBUkVfT1A6Ci0gICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoaiA8IDYgIHx8ICBqID4gOSAgfHwKLSAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpKzNdICE9IFVOQVJZX05PVCAgfHwKLSAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw0KSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIChqXjEpKTsKLSAgICAgICAgICAgICAgICBjb2Rlc3RyW2krM10gPSBOT1A7CisgICAgICAgICAgICAgICAgaiA9IGdldF9hcmcoY29kZXN0ciwgaSk7CisgICAgICAgICAgICAgICAgaWYgKGogPCA2IHx8IGogPiA5IHx8CisgICAgICAgICAgICAgICAgICAgIG5leHRvcCAhPSBVTkFSWV9OT1QgfHwKKyAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsIG9wX3N0YXJ0LCBpICsgMikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNvZGVzdHJbaSsxXSA9IChqXjEpOworICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyICsgaSArIDIsIE5PUCwgbmV4dGkgLSBpKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIC8qIFNraXAgb3ZlciBMT0FEX0NPTlNUIHRydWVjb25zdAotICAgICAgICAgICAgICAgICAgIFBPUF9KVU1QX0lGX0ZBTFNFIHh4LiBUaGlzIGltcHJvdmVzCi0gICAgICAgICAgICAgICAgICAgIndoaWxlIDEiIHBlcmZvcm1hbmNlLiAqLworICAgICAgICAgICAgICAgICAgIFBPUF9KVU1QX0lGX0ZBTFNFIHh4LiAgVGhpcyBpbXByb3ZlcworICAgICAgICAgICAgICAgICAgICJ3aGlsZSAxIiBwZXJmb3JtYW5jZS4gICovCiAgICAgICAgICAgICBjYXNlIExPQURfQ09OU1Q6CiAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUFVTSF9PUChpKTsKLSAgICAgICAgICAgICAgICBqID0gR0VUQVJHKGNvZGVzdHIsIGkpOwotICAgICAgICAgICAgICAgIGlmIChjb2Rlc3RyW2krM10gIT0gUE9QX0pVTVBfSUZfRkFMU0UgIHx8Ci0gICAgICAgICAgICAgICAgICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNikgIHx8Ci0gICAgICAgICAgICAgICAgICAgICFQeU9iamVjdF9Jc1RydWUoUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgaikpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0citpLCBOT1AsIDYpOwotICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1JFU0VUKCk7CisgICAgICAgICAgICAgICAgaWYgKG5leHRvcCAhPSBQT1BfSlVNUF9JRl9GQUxTRSAgfHwKKyAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsIG9wX3N0YXJ0LCBpICsgMikgIHx8CisgICAgICAgICAgICAgICAgICAgICFQeU9iamVjdF9Jc1RydWUoUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgZ2V0X2FyZyhjb2Rlc3RyLCBpKSkpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0ciArIG9wX3N0YXJ0LCBOT1AsIG5leHRpIC0gb3Bfc3RhcnQgKyAyKTsKKyAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QT1AoMSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZm9sZCB0dXBsZXMgb2YgY29uc3RhbnRzIChpbmNsdWRlcyBhIGNhc2UgZm9yIGxpc3RzIGFuZCBzZXRzCi0gICAgICAgICAgICAgICAgICAgd2hpY2ggYXJlIG9ubHkgdXNlZCBmb3IgImluIiBhbmQgIm5vdCBpbiIgdGVzdHMpLgorICAgICAgICAgICAgICAgIC8qIFRyeSB0byBmb2xkIHR1cGxlcyBvZiBjb25zdGFudHMgKGluY2x1ZGVzIGEgY2FzZSBmb3IgbGlzdHMKKyAgICAgICAgICAgICAgICAgICBhbmQgc2V0cyB3aGljaCBhcmUgb25seSB1c2VkIGZvciAiaW4iIGFuZCAibm90IGluIiB0ZXN0cykuCiAgICAgICAgICAgICAgICAgICAgU2tpcCBvdmVyIEJVSUxEX1NFUU4gMSBVTlBBQ0tfU0VRTiAxLgogICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgQlVJTERfU0VRTiAyIFVOUEFDS19TRVFOIDIgd2l0aCBST1QyLgogICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgQlVJTERfU0VRTiAzIFVOUEFDS19TRVFOIDMgd2l0aCBST1QzIFJPVDIuICovCiAgICAgICAgICAgICBjYXNlIEJVSUxEX1RVUExFOgogICAgICAgICAgICAgY2FzZSBCVUlMRF9MSVNUOgogICAgICAgICAgICAgY2FzZSBCVUlMRF9TRVQ6Ci0gICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoaiA9PSAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBoID0gQ09OU1RfU1RBQ0tfT1BfTEFTVE4oaik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KChoID49IDAgfHwgQ09OU1RfU1RBQ0tfTEVOKCkgPCBqKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGggPj0gMCAmJiBqID4gMCAmJiBqIDw9IENPTlNUX1NUQUNLX0xFTigpICYmCi0gICAgICAgICAgICAgICAgICAgICgob3Bjb2RlID09IEJVSUxEX1RVUExFICYmCi0gICAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgaS1oKzMpKSB8fAotICAgICAgICAgICAgICAgICAgICAgKChvcGNvZGUgPT0gQlVJTERfTElTVCB8fCBvcGNvZGUgPT0gQlVJTERfU0VUKSAmJgotICAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaSszXT09Q09NUEFSRV9PUCAmJgotICAgICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIGktaCs2KSAmJgotICAgICAgICAgICAgICAgICAgICAgIChHRVRBUkcoY29kZXN0cixpKzMpPT02IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIEdFVEFSRyhjb2Rlc3RyLGkrMyk9PTcpKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgdHVwbGVfb2ZfY29uc3RhbnRzKCZjb2Rlc3RyW2ldLCBqLCBjb25zdHMsIENPTlNUX1NUQUNLX0xBU1ROKGopKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZjb2Rlc3RyW2hdLCBOT1AsIGkgLSBoKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUE9QKGopOwotICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QVVNIX09QKGkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBqID0gZ2V0X2FyZyhjb2Rlc3RyLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoaiA+IDAgJiYgQ09OU1RfU1RBQ0tfTEVOKCkgPj0gaikgeworICAgICAgICAgICAgICAgICAgICBoID0gbGFzdG5fY29uc3Rfc3RhcnQoY29kZXN0ciwgb3Bfc3RhcnQsIGopOworICAgICAgICAgICAgICAgICAgICBpZiAoKG9wY29kZSA9PSBCVUlMRF9UVVBMRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBoLCBvcF9zdGFydCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKChvcGNvZGUgPT0gQlVJTERfTElTVCB8fCBvcGNvZGUgPT0gQlVJTERfU0VUKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAoKG5leHRvcD09Q09NUEFSRV9PUCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAoY29kZXN0cltuZXh0aSsxXT09NiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXN0cltuZXh0aSsxXT09NykpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRvcCA9PSBHRVRfSVRFUikgJiYgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgaSArIDIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGZvbGRfdHVwbGVfb25fY29uc3RhbnRzKGNvZGVzdHIsIGgsIGkrMiwgb3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cywgQ09OU1RfU1RBQ0tfTEFTVE4oaiksIGopOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BPUChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QVVNIX09QKGgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVzdHJbaSszXSAhPSBVTlBBQ0tfU0VRVUVOQ0UgIHx8Ci0gICAgICAgICAgICAgICAgICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNikgfHwKLSAgICAgICAgICAgICAgICAgICAgaiAhPSBHRVRBUkcoY29kZXN0ciwgaSszKSB8fAorICAgICAgICAgICAgICAgIGlmIChuZXh0b3AgIT0gVU5QQUNLX1NFUVVFTkNFICB8fAorICAgICAgICAgICAgICAgICAgICAhSVNCQVNJQ0JMT0NLKGJsb2Nrcywgb3Bfc3RhcnQsIGkgKyAyKSB8fAorICAgICAgICAgICAgICAgICAgICBqICE9IGdldF9hcmcoY29kZXN0ciwgbmV4dGkpIHx8CiAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9PSBCVUlMRF9TRVQpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChqID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSwgTk9QLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGogPCAyKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK29wX3N0YXJ0LCBOT1AsIG5leHRpIC0gb3Bfc3RhcnQgKyAyKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGogPT0gMikgewotICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gUk9UX1RXTzsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDUpOworICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW29wX3N0YXJ0XSA9IFJPVF9UV087CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnQgKyAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyICsgb3Bfc3RhcnQgKyAyLCBOT1AsIG5leHRpIC0gb3Bfc3RhcnQpOwogICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19SRVNFVCgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaiA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBST1RfVEhSRUU7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaSsxXSA9IFJPVF9UV087Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2krMiwgTk9QLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltvcF9zdGFydF0gPSBST1RfVEhSRUU7CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnQgKyAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnQgKyAyXSA9IFJPVF9UV087CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnQgKyAzXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyICsgb3Bfc3RhcnQgKyA0LCBOT1AsIG5leHRpIC0gb3Bfc3RhcnQgLSAyKTsKICAgICAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUkVTRVQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAvKiBGb2xkIGJpbmFyeSBvcHMgb24gY29uc3RhbnRzLgotICAgICAgICAgICAgICAgICAgIExPQURfQ09OU1QgYzEgTE9BRF9DT05TVCBjMiBCSU5PUCAtLT4gIExPQURfQ09OU1QgYmlub3AoYzEsYzIpICovCisgICAgICAgICAgICAgICAgICAgTE9BRF9DT05TVCBjMSBMT0FEX0NPTlNUIGMyIEJJTk9QIC0tPiBMT0FEX0NPTlNUIGJpbm9wKGMxLGMyKSAqLwogICAgICAgICAgICAgY2FzZSBCSU5BUllfUE9XRVI6CiAgICAgICAgICAgICBjYXNlIEJJTkFSWV9NVUxUSVBMWToKICAgICAgICAgICAgIGNhc2UgQklOQVJZX1RSVUVfRElWSURFOgpAQCAtNTMwLDM1ICs1ODYsMzQgQEAKICAgICAgICAgICAgIGNhc2UgQklOQVJZX0FORDoKICAgICAgICAgICAgIGNhc2UgQklOQVJZX1hPUjoKICAgICAgICAgICAgIGNhc2UgQklOQVJZX09SOgotICAgICAgICAgICAgICAgIC8qIE5PVEU6IExPQURfQ09OU1QgaXMgc2F2ZWQgYXQgYGktMmAgc2luY2UgaXQgaGFzIGFuIGFyZwotICAgICAgICAgICAgICAgICAgIHdoaWxlIEJJTk9QIGhhc24ndCAqLwotICAgICAgICAgICAgICAgIGggPSBDT05TVF9TVEFDS19PUF9MQVNUTigyKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQoKGggPj0gMCB8fCBDT05TVF9TVEFDS19MRU4oKSA8IDIpKTsKLSAgICAgICAgICAgICAgICBpZiAoaCA+PSAwICYmCi0gICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIGktaCsxKSAgJiYKLSAgICAgICAgICAgICAgICAgICAgZm9sZF9iaW5vcHNfb25fY29uc3RhbnRzKCZjb2Rlc3RyW2ldLCBjb25zdHMsIENPTlNUX1NUQUNLX0xBU1ROKDIpKSkgewotICAgICAgICAgICAgICAgICAgICBpIC09IDI7Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgmY29kZXN0cltoXSwgTk9QLCBpIC0gaCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpOwotICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QT1AoMik7Ci0gICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BVU0hfT1AoaSk7CisgICAgICAgICAgICAgICAgaWYgKENPTlNUX1NUQUNLX0xFTigpIDwgMikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaCA9IGxhc3RuX2NvbnN0X3N0YXJ0KGNvZGVzdHIsIG9wX3N0YXJ0LCAyKTsKKyAgICAgICAgICAgICAgICBpZiAoSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgb3Bfc3RhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGggPSBmb2xkX2Jpbm9wc19vbl9jb25zdGFudHMoY29kZXN0ciwgaCwgaSsyLCBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RzLCBDT05TVF9TVEFDS19MQVNUTigyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BPUCgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BVU0hfT1AoaCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAvKiBGb2xkIHVuYXJ5IG9wcyBvbiBjb25zdGFudHMuCi0gICAgICAgICAgICAgICAgICAgTE9BRF9DT05TVCBjMSAgVU5BUllfT1AgLS0+ICAgICAgICAgICAgICAgICAgTE9BRF9DT05TVCB1bmFyeV9vcChjKSAqLworICAgICAgICAgICAgICAgICAgIExPQURfQ09OU1QgYzEgIFVOQVJZX09QIC0tPiBMT0FEX0NPTlNUIHVuYXJ5X29wKGMpICovCiAgICAgICAgICAgICBjYXNlIFVOQVJZX05FR0FUSVZFOgogICAgICAgICAgICAgY2FzZSBVTkFSWV9JTlZFUlQ6CiAgICAgICAgICAgICBjYXNlIFVOQVJZX1BPU0lUSVZFOgotICAgICAgICAgICAgICAgIGggPSBDT05TVF9TVEFDS19PUF9MQVNUTigxKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQoKGggPj0gMCB8fCBDT05TVF9TVEFDS19MRU4oKSA8IDEpKTsKLSAgICAgICAgICAgICAgICBpZiAoaCA+PSAwICYmCi0gICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIGktaCsxKSAgJiYKLSAgICAgICAgICAgICAgICAgICAgZm9sZF91bmFyeW9wc19vbl9jb25zdGFudHMoJmNvZGVzdHJbaS0zXSwgY29uc3RzLCBDT05TVF9TVEFDS19UT1AoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaSAtPSAyOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUE9QKDEpOwotICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QVVNIX09QKGkpOworICAgICAgICAgICAgICAgIGlmIChDT05TVF9TVEFDS19MRU4oKSA8IDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGggPSBsYXN0bl9jb25zdF9zdGFydChjb2Rlc3RyLCBvcF9zdGFydCwgMSk7CisgICAgICAgICAgICAgICAgaWYgKElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIG9wX3N0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICBoID0gZm9sZF91bmFyeW9wc19vbl9jb25zdGFudHMoY29kZXN0ciwgaCwgaSsyLCBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHMsICpDT05TVF9TVEFDS19MQVNUTigxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BPUCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BVU0hfT1AoaCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTU3MywzOSArNjI4LDM2IEBACiAgICAgICAgICAgICAgICAgICAgeDpKVU1QX0lGX0ZBTFNFX09SX1BPUCB5ICAgeTpKVU1QX0lGX0ZBTFNFX09SX1BPUCB6CiAgICAgICAgICAgICAgICAgICAgICAgLS0+ICB4OkpVTVBfSUZfRkFMU0VfT1JfUE9QIHoKICAgICAgICAgICAgICAgICAgICB4OkpVTVBfSUZfRkFMU0VfT1JfUE9QIHkgICB5OkpVTVBfSUZfVFJVRV9PUl9QT1AgegotICAgICAgICAgICAgICAgICAgICAgIC0tPiAgeDpQT1BfSlVNUF9JRl9GQUxTRSB5KzMKLSAgICAgICAgICAgICAgICAgICB3aGVyZSB5KzMgaXMgdGhlIGluc3RydWN0aW9uIGZvbGxvd2luZyB0aGUgc2Vjb25kIHRlc3QuCisgICAgICAgICAgICAgICAgICAgICAgLS0+ICB4OlBPUF9KVU1QX0lGX0ZBTFNFIHkrMgorICAgICAgICAgICAgICAgICAgIHdoZXJlIHkrMiBpcyB0aGUgaW5zdHJ1Y3Rpb24gZm9sbG93aW5nIHRoZSBzZWNvbmQgdGVzdC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgY2FzZSBKVU1QX0lGX0ZBTFNFX09SX1BPUDoKICAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9UUlVFX09SX1BPUDoKLSAgICAgICAgICAgICAgICB0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIGggPSBnZXRfYXJnKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIHRndCA9IGZpbmRfb3AoY29kZXN0ciwgaCk7CisKICAgICAgICAgICAgICAgICBqID0gY29kZXN0clt0Z3RdOwogICAgICAgICAgICAgICAgIGlmIChDT05ESVRJT05BTF9KVU1QKGopKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IGFsbCBwb3NzaWJsZSBqdW1wcyBoZXJlIGFyZQotICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZSEgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogTk9URTogYWxsIHBvc3NpYmxlIGp1bXBzIGhlcmUgYXJlIGFic29sdXRlLiAqLwogICAgICAgICAgICAgICAgICAgICBpZiAoSlVNUFNfT05fVFJVRShqKSA9PSBKVU1QU19PTl9UUlVFKG9wY29kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBzZWNvbmQganVtcCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlbiBpZmYgdGhlIGZpcnN0IGlzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGd0dGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgb3Bjb2RlIGluaGVyaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMgdGFyZ2V0J3Mgc3RhY2sgYmVoYXZpb3VyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gajsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3R0Z3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZW9wdGltaXplX2N1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2Vjb25kIGp1bXAgd2lsbCBiZSB0YWtlbiBpZmYgdGhlIGZpcnN0IGlzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGN1cnJlbnQgb3Bjb2RlIGluaGVyaXRzIGl0cyB0YXJnZXQncworICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sgZWZmZWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBoID0gc2V0X2FyZyhjb2Rlc3RyLCBpLCBnZXRfYXJnKGNvZGVzdHIsIHRndCkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlY29uZCBqdW1wIGlzIG5vdCB0YWtlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGZpcnN0IGlzIChzbyBqdW1wIHBhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0KSwgYW5kIGFsbCBjb25kaXRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAganVtcHMgcG9wIHRoZWlyIGFyZ3VtZW50IHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXkncmUgbm90IHRha2VuIChzbyBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBqdW1wIHRvIHBvcCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50IHdoZW4gaXQncyB0YWtlbikuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlVNUFNfT05fVFJVRShvcGNvZGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBQT1BfSlVNUF9JRl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBQT1BfSlVNUF9JRl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCAodGd0ICsgMykpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZW9wdGltaXplX2N1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2Vjb25kIGp1bXAgaXMgbm90IHRha2VuIGlmIHRoZSBmaXJzdCBpcyAoc28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bXAgcGFzdCBpdCksIGFuZCBhbGwgY29uZGl0aW9uYWwganVtcHMgcG9wIHRoZWlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCB3aGVuIHRoZXkncmUgbm90IHRha2VuIChzbyBjaGFuZ2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBqdW1wIHRvIHBvcCBpdHMgYXJndW1lbnQgd2hlbiBpdCdzIHRha2VuKS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBzZXRfYXJnKGNvZGVzdHIsIGksIHRndCArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgaiA9IG9wY29kZSA9PSBKVU1QX0lGX1RSVUVfT1JfUE9QID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1BfSlVNUF9JRl9UUlVFIDogUE9QX0pVTVBfSUZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0aSA9IGg7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW25leHRpXSA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwpAQCAtNjIyLDczICs2NzQsNzMgQEAKICAgICAgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKICAgICAgICAgICAgIGNhc2UgU0VUVVBfV0lUSDoKICAgICAgICAgICAgIGNhc2UgU0VUVVBfQVNZTkNfV0lUSDoKLSAgICAgICAgICAgICAgICB0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIGggPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIHRndCA9IGZpbmRfb3AoY29kZXN0ciwgaCk7CiAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBKVU1QXyogdG8gYSBSRVRVUk4gaW50byBqdXN0IGEgUkVUVVJOICovCiAgICAgICAgICAgICAgICAgaWYgKFVOQ09ORElUSU9OQUxfSlVNUChvcGNvZGUpICYmCiAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbdGd0XSA9PSBSRVRVUk5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IFJFVFVSTl9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltvcF9zdGFydF0gPSBSRVRVUk5fVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnQgKyAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyICsgb3Bfc3RhcnQgKyAyLCBOT1AsIGkgLSBvcF9zdGFydCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChVTkNPTkRJVElPTkFMX0pVTVAoY29kZXN0clt0Z3RdKSkgeworICAgICAgICAgICAgICAgICAgICBqID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpOworICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IEpVTVBfRk9SV0FSRCkgeyAvKiBKTVBfQUJTIGNhbiBnbyBiYWNrd2FyZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IEpVTVBfQUJTT0xVVEU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIUFCU09MVVRFX0pVTVAob3Bjb2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChQeV9zc2l6ZV90KWogPCBpICsgMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgLyogTm8gYmFja3dhcmQgcmVsYXRpdmUganVtcHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGogLT0gaSArIDI7ICAgICAgICAgIC8qIENhbGMgcmVsYXRpdmUganVtcCBhZGRyICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29weV9vcF9hcmcoY29kZXN0ciwgb3Bfc3RhcnQsIG9wY29kZSwgaiwgaSsyKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFVTkNPTkRJVElPTkFMX0pVTVAoY29kZXN0clt0Z3RdKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgdGd0dGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpOwotICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gSlVNUF9GT1JXQVJEKSAvKiBKTVBfQUJTIGNhbiBnbyBiYWNrd2FyZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgb3Bjb2RlID0gSlVNUF9BQlNPTFVURTsKLSAgICAgICAgICAgICAgICBpZiAoIUFCU09MVVRFX0pVTVAob3Bjb2RlKSkKLSAgICAgICAgICAgICAgICAgICAgdGd0dGd0IC09IGkgKyAzOyAgICAgLyogQ2FsYyByZWxhdGl2ZSBqdW1wIGFkZHIgKi8KLSAgICAgICAgICAgICAgICBpZiAodGd0dGd0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBiYWNrd2FyZCByZWxhdGl2ZSBqdW1wcyAqLwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gb3Bjb2RlOwotICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3R0Z3QpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIEVYVEVOREVEX0FSRzoKLSAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzNdICE9IE1BS0VfRlVOQ1RJT04pCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdFVuY2hhbmdlZDsKLSAgICAgICAgICAgICAgICAvKiBkb24ndCB2aXNpdCBNQUtFX0ZVTkNUSU9OIGFzIEdFVEFSRyB3aWxsIGJlIHdyb25nICovCi0gICAgICAgICAgICAgICAgaSArPSAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgLyogUmVwbGFjZSBSRVRVUk4gTE9BRF9DT05TVCBOb25lIFJFVFVSTiB3aXRoIGp1c3QgUkVUVVJOICovCi0gICAgICAgICAgICAgICAgLyogUmVtb3ZlIHVucmVhY2hhYmxlIEpVTVBzIGFmdGVyIFJFVFVSTiAqLworICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB1bnJlYWNoYWJsZSBvcHMgYWZ0ZXIgUkVUVVJOICovCiAgICAgICAgICAgICBjYXNlIFJFVFVSTl9WQUxVRToKLSAgICAgICAgICAgICAgICBpZiAoaSs0ID49IGNvZGVsZW4pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChjb2Rlc3RyW2krNF0gPT0gUkVUVVJOX1ZBTFVFICYmCi0gICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsaSw1KSkKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDQpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFVOQ09ORElUSU9OQUxfSlVNUChjb2Rlc3RyW2krMV0pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDQpKQotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0citpKzEsIE5PUCwgMyk7CisgICAgICAgICAgICAgICAgaCA9IGkgKyAyOworICAgICAgICAgICAgICAgIHdoaWxlIChoICsgMiA8IGNvZGVsZW4gJiYgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaSwgaCArIDIpKSB7CisgICAgICAgICAgICAgICAgICAgIGggKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGggPiBpICsgMikgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0ciArIGkgKyAyLCBOT1AsIGggLSBpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dGkgPSBmaW5kX29wKGNvZGVzdHIsIGgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qIEZpeHVwIGxpbmVub3RhYiAqLwotICAgIGZvciAoaT0wLCBub3BzPTAgOyBpPGNvZGVsZW4gOyBpICs9IENPREVTSVpFKGNvZGVzdHJbaV0pKSB7CisgICAgLyogRml4dXAgbG5vdGFiICovCisgICAgZm9yIChpPTAsIG5vcHM9MCA7IGk8Y29kZWxlbiA7IGkgKz0gMikgewogICAgICAgICBhc3NlcnQoaSAtIG5vcHMgPD0gSU5UX01BWCk7Ci0gICAgICAgIGFkZHJtYXBbaV0gPSAoaW50KShpIC0gbm9wcyk7CisgICAgICAgIC8qIG9yaWdpbmFsIGNvZGUgb2Zmc2V0ID0+IG5ldyBjb2RlIG9mZnNldCAqLworICAgICAgICBibG9ja3NbaV0gPSBpIC0gbm9wczsKICAgICAgICAgaWYgKGNvZGVzdHJbaV0gPT0gTk9QKQotICAgICAgICAgICAgbm9wcysrOworICAgICAgICAgICAgbm9wcyArPSAyOwogICAgIH0KLSAgICBjdW1fb3JpZ19saW5lID0gMDsKLSAgICBsYXN0X2xpbmUgPSAwOworICAgIGN1bV9vcmlnX29mZnNldCA9IDA7CisgICAgbGFzdF9vZmZzZXQgPSAwOwogICAgIGZvciAoaT0wIDsgaSA8IHRhYnNpeiA7IGkrPTIpIHsKLSAgICAgICAgY3VtX29yaWdfbGluZSArPSBsaW5lbm9baV07Ci0gICAgICAgIG5ld19saW5lID0gYWRkcm1hcFtjdW1fb3JpZ19saW5lXTsKLSAgICAgICAgYXNzZXJ0IChuZXdfbGluZSAtIGxhc3RfbGluZSA8IDI1NSk7Ci0gICAgICAgIGxpbmVub1tpXSA9KCh1bnNpZ25lZCBjaGFyKShuZXdfbGluZSAtIGxhc3RfbGluZSkpOwotICAgICAgICBsYXN0X2xpbmUgPSBuZXdfbGluZTsKKyAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldF9kZWx0YSwgbmV3X29mZnNldDsKKyAgICAgICAgY3VtX29yaWdfb2Zmc2V0ICs9IGxub3RhYltpXTsKKyAgICAgICAgYXNzZXJ0KChjdW1fb3JpZ19vZmZzZXQgJiAxKSA9PSAwKTsKKyAgICAgICAgbmV3X29mZnNldCA9IGJsb2Nrc1tjdW1fb3JpZ19vZmZzZXRdOworICAgICAgICBvZmZzZXRfZGVsdGEgPSBuZXdfb2Zmc2V0IC0gbGFzdF9vZmZzZXQ7CisgICAgICAgIGFzc2VydChvZmZzZXRfZGVsdGEgPD0gMjU1KTsKKyAgICAgICAgbG5vdGFiW2ldID0gKHVuc2lnbmVkIGNoYXIpb2Zmc2V0X2RlbHRhOworICAgICAgICBsYXN0X29mZnNldCA9IG5ld19vZmZzZXQ7CiAgICAgfQogCiAgICAgLyogUmVtb3ZlIE5PUHMgYW5kIGZpeHVwIGp1bXAgdGFyZ2V0cyAqLwotICAgIGZvciAoaT0wLCBoPTAgOyBpPGNvZGVsZW4gOyApIHsKKyAgICBmb3IgKG9wX3N0YXJ0PTAsIGk9MCwgaD0wIDsgaTxjb2RlbGVuIDsgaSs9Miwgb3Bfc3RhcnQ9aSkgeworICAgICAgICBqID0gY29kZXN0cltpKzFdOworICAgICAgICB3aGlsZSAoY29kZXN0cltpXSA9PSBFWFRFTkRFRF9BUkcpIHsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIGogPSBqPDw4IHwgY29kZXN0cltpKzFdOworICAgICAgICB9CiAgICAgICAgIG9wY29kZSA9IGNvZGVzdHJbaV07CiAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE5PUDoKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIE5PUDpjb250aW51ZTsKIAogICAgICAgICAgICAgY2FzZSBKVU1QX0FCU09MVVRFOgogICAgICAgICAgICAgY2FzZSBDT05USU5VRV9MT09QOgpAQCAtNjk2LDggKzc0OCw3IEBACiAgICAgICAgICAgICBjYXNlIFBPUF9KVU1QX0lGX1RSVUU6CiAgICAgICAgICAgICBjYXNlIEpVTVBfSUZfRkFMU0VfT1JfUE9QOgogICAgICAgICAgICAgY2FzZSBKVU1QX0lGX1RSVUVfT1JfUE9QOgotICAgICAgICAgICAgICAgIGogPSBhZGRybWFwW0dFVEFSRyhjb2Rlc3RyLCBpKV07Ci0gICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIGopOworICAgICAgICAgICAgICAgIGogPSBibG9ja3Nbal07CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgRk9SX0lURVI6CkBAIC03MDcsMzQgKzc1OCwzMSBAQAogICAgICAgICAgICAgY2FzZSBTRVRVUF9GSU5BTExZOgogICAgICAgICAgICAgY2FzZSBTRVRVUF9XSVRIOgogICAgICAgICAgICAgY2FzZSBTRVRVUF9BU1lOQ19XSVRIOgotICAgICAgICAgICAgICAgIGogPSBhZGRybWFwW0dFVEFSRyhjb2Rlc3RyLCBpKSArIGkgKyAzXSAtIGFkZHJtYXBbaV0gLSAzOwotICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCBqKTsKKyAgICAgICAgICAgICAgICBqID0gYmxvY2tzW2ogKyBpICsgMl0gLSBibG9ja3NbaV0gLSAyOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGFkaiA9IENPREVTSVpFKG9wY29kZSk7Ci0gICAgICAgIHdoaWxlIChhZGotLSkKLSAgICAgICAgICAgIGNvZGVzdHJbaCsrXSA9IGNvZGVzdHJbaSsrXTsKKyAgICAgICAgbmV4dGkgPSBpIC0gb3Bfc3RhcnQgKyAyOworICAgICAgICBpZiAoaW5zdHJzaXplKGopID4gbmV4dGkpCisgICAgICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7CisgICAgICAgIC8qIElmIGluc3Ryc2l6ZShqKSA8IG5leHRpLCB3ZSdsbCBlbWl0IEVYVEVOREVEX0FSRyAwICovCisgICAgICAgIHdyaXRlX29wX2FyZyhjb2Rlc3RyICsgaCwgb3Bjb2RlLCBqLCBuZXh0aSk7CisgICAgICAgIGggKz0gbmV4dGk7CiAgICAgfQotICAgIGFzc2VydChoICsgbm9wcyA9PSBjb2RlbGVuKTsKKyAgICBhc3NlcnQoaCArIChQeV9zc2l6ZV90KW5vcHMgPT0gY29kZWxlbik7CiAKLSAgICBjb2RlID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKWNvZGVzdHIsIGgpOwogICAgIENPTlNUX1NUQUNLX0RFTEVURSgpOwotICAgIFB5TWVtX0ZyZWUoYWRkcm1hcCk7Ci0gICAgUHlNZW1fRnJlZShjb2Rlc3RyKTsKICAgICBQeU1lbV9GcmVlKGJsb2Nrcyk7CisgICAgY29kZSA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKiljb2Rlc3RyLCBoKTsKKyAgICBQeU1lbV9GcmVlKGNvZGVzdHIpOwogICAgIHJldHVybiBjb2RlOwogCiAgZXhpdEVycm9yOgogICAgIGNvZGUgPSBOVUxMOwogCiAgZXhpdFVuY2hhbmdlZDoKLSAgICBDT05TVF9TVEFDS19ERUxFVEUoKTsKLSAgICBpZiAoYmxvY2tzICE9IE5VTEwpCi0gICAgICAgIFB5TWVtX0ZyZWUoYmxvY2tzKTsKLSAgICBpZiAoYWRkcm1hcCAhPSBOVUxMKQotICAgICAgICBQeU1lbV9GcmVlKGFkZHJtYXApOwotICAgIGlmIChjb2Rlc3RyICE9IE5VTEwpCi0gICAgICAgIFB5TWVtX0ZyZWUoY29kZXN0cik7CiAgICAgUHlfWElOQ1JFRihjb2RlKTsKKyAgICBDT05TVF9TVEFDS19ERUxFVEUoKTsKKyAgICBQeU1lbV9GcmVlKGJsb2Nrcyk7CisgICAgUHlNZW1fRnJlZShjb2Rlc3RyKTsKICAgICByZXR1cm4gY29kZTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weWhhc2guYyBiL1B5dGhvbi9weWhhc2guYwppbmRleCA5N2NiNTQ3Li45MDgwZDI1IDEwMDY0NAotLS0gYS9QeXRob24vcHloYXNoLmMKKysrIGIvUHl0aG9uL3B5aGFzaC5jCkBAIC0zMTgsNDAgKzMxOCwzNyBAQAogCiAgTW9kaWZpZWQgZm9yIFB5dGhvbiBieSBDaHJpc3RpYW4gSGVpbWVzOgogICAgIC0gQzg5IC8gTVNWQyBjb21wYXRpYmlsaXR5Ci0gICAgLSBQWV9VSU5UNjRfVCwgUFlfVUlOVDMyX1QgYW5kIFBZX1VJTlQ4X1QKICAgICAtIF9yb3RsNjQoKSBvbiBXaW5kb3dzCiAgICAgLSBsZXRvaDY0KCkgZmFsbGJhY2sKICovCiAKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBQWV9VSU5UOF9UOwotCiAvKiBieXRlIHN3YXAgbGl0dGxlIGVuZGlhbiB0byBob3N0IGVuZGlhbgogICogRW5kaWFuIGNvbnZlcnNpb24gbm90IG9ubHkgZW5zdXJlcyB0aGF0IHRoZSBoYXNoIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUKICAqIHZhbHVlIG9uIGFsbCBwbGF0Zm9ybXMuIEl0IGlzIGFsc28gcmVxdWlyZWQgdG8gZm9yIGEgZ29vZCBkaXNwZXJzaW9uIG9mCiAgKiB0aGUgaGFzaCB2YWx1ZXMnIGxlYXN0IHNpZ25pZmljYW50IGJpdHMuCiAgKi8KICNpZiBQWV9MSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgX2xlNjR0b2goeCkgKChQWV9VSU5UNjRfVCkoeCkpCisjICBkZWZpbmUgX2xlNjR0b2goeCkgKCh1aW50NjRfdCkoeCkpCiAjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKICMgIGRlZmluZSBfbGU2NHRvaCh4KSBPU1N3YXBMaXR0bGVUb0hvc3RJbnQ2NCh4KQogI2VsaWYgZGVmaW5lZChIQVZFX0xFVE9INjQpCiAjICBkZWZpbmUgX2xlNjR0b2goeCkgbGU2NHRvaCh4KQogI2Vsc2UKLSMgIGRlZmluZSBfbGU2NHRvaCh4KSAoKChQWV9VSU5UNjRfVCkoeCkgPDwgNTYpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICgoKFBZX1VJTlQ2NF9UKSh4KSA8PCA0MCkgJiAweGZmMDAwMDAwMDAwMDAwVUxMKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAoKChQWV9VSU5UNjRfVCkoeCkgPDwgMjQpICYgMHhmZjAwMDAwMDAwMDBVTEwpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICgoKFBZX1VJTlQ2NF9UKSh4KSA8PCA4KSAgJiAweGZmMDAwMDAwMDBVTEwpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICgoKFBZX1VJTlQ2NF9UKSh4KSA+PiA4KSAgJiAweGZmMDAwMDAwVUxMKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAoKChQWV9VSU5UNjRfVCkoeCkgPj4gMjQpICYgMHhmZjAwMDBVTEwpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICgoKFBZX1VJTlQ2NF9UKSh4KSA+PiA0MCkgJiAweGZmMDBVTEwpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICgoUFlfVUlOVDY0X1QpKHgpICA+PiA1NikpCisjICBkZWZpbmUgX2xlNjR0b2goeCkgKCgodWludDY0X3QpKHgpIDw8IDU2KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPDwgNDApICYgMHhmZjAwMDAwMDAwMDAwMFVMTCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKCgodWludDY0X3QpKHgpIDw8IDI0KSAmIDB4ZmYwMDAwMDAwMDAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPDwgOCkgICYgMHhmZjAwMDAwMDAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPj4gOCkgICYgMHhmZjAwMDAwMFVMTCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKCgodWludDY0X3QpKHgpID4+IDI0KSAmIDB4ZmYwMDAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPj4gNDApICYgMHhmZjAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ2NF90KSh4KSAgPj4gNTYpKQogI2VuZGlmCiAKIAogI2lmZGVmIF9NU0NfVkVSCiAjICBkZWZpbmUgUk9UQVRFKHgsIGIpICBfcm90bDY0KHgsIGIpCiAjZWxzZQotIyAgZGVmaW5lIFJPVEFURSh4LCBiKSAoUFlfVUlOVDY0X1QpKCAoKHgpIDw8IChiKSkgfCAoICh4KSA+PiAoNjQgLSAoYikpKSApCisjICBkZWZpbmUgUk9UQVRFKHgsIGIpICh1aW50NjRfdCkoICgoeCkgPDwgKGIpKSB8ICggKHgpID4+ICg2NCAtIChiKSkpICkKICNlbmRpZgogCiAjZGVmaW5lIEhBTEZfUk9VTkQoYSxiLGMsZCxzLHQpICAgICAgICAgXApAQCAtMzY5LDIyICszNjYsMjIgQEAKIAogc3RhdGljIFB5X2hhc2hfdAogc2lwaGFzaDI0KGNvbnN0IHZvaWQgKnNyYywgUHlfc3NpemVfdCBzcmNfc3opIHsKLSAgICBQWV9VSU5UNjRfVCBrMCA9IF9sZTY0dG9oKF9QeV9IYXNoU2VjcmV0LnNpcGhhc2guazApOwotICAgIFBZX1VJTlQ2NF9UIGsxID0gX2xlNjR0b2goX1B5X0hhc2hTZWNyZXQuc2lwaGFzaC5rMSk7Ci0gICAgUFlfVUlOVDY0X1QgYiA9IChQWV9VSU5UNjRfVClzcmNfc3ogPDwgNTY7Ci0gICAgY29uc3QgUFlfVUlOVDY0X1QgKmluID0gKFBZX1VJTlQ2NF9UKilzcmM7CisgICAgdWludDY0X3QgazAgPSBfbGU2NHRvaChfUHlfSGFzaFNlY3JldC5zaXBoYXNoLmswKTsKKyAgICB1aW50NjRfdCBrMSA9IF9sZTY0dG9oKF9QeV9IYXNoU2VjcmV0LnNpcGhhc2guazEpOworICAgIHVpbnQ2NF90IGIgPSAodWludDY0X3Qpc3JjX3N6IDw8IDU2OworICAgIGNvbnN0IHVpbnQ2NF90ICppbiA9ICh1aW50NjRfdCopc3JjOwogCi0gICAgUFlfVUlOVDY0X1QgdjAgPSBrMCBeIDB4NzM2ZjZkNjU3MDczNjU3NVVMTDsKLSAgICBQWV9VSU5UNjRfVCB2MSA9IGsxIF4gMHg2NDZmNzI2MTZlNjQ2ZjZkVUxMOwotICAgIFBZX1VJTlQ2NF9UIHYyID0gazAgXiAweDZjNzk2NzY1NmU2NTcyNjFVTEw7Ci0gICAgUFlfVUlOVDY0X1QgdjMgPSBrMSBeIDB4NzQ2NTY0NjI3OTc0NjU3M1VMTDsKKyAgICB1aW50NjRfdCB2MCA9IGswIF4gMHg3MzZmNmQ2NTcwNzM2NTc1VUxMOworICAgIHVpbnQ2NF90IHYxID0gazEgXiAweDY0NmY3MjYxNmU2NDZmNmRVTEw7CisgICAgdWludDY0X3QgdjIgPSBrMCBeIDB4NmM3OTY3NjU2ZTY1NzI2MVVMTDsKKyAgICB1aW50NjRfdCB2MyA9IGsxIF4gMHg3NDY1NjQ2Mjc5NzQ2NTczVUxMOwogCi0gICAgUFlfVUlOVDY0X1QgdDsKLSAgICBQWV9VSU5UOF9UICpwdDsKLSAgICBQWV9VSU5UOF9UICptOworICAgIHVpbnQ2NF90IHQ7CisgICAgdWludDhfdCAqcHQ7CisgICAgdWludDhfdCAqbTsKIAogICAgIHdoaWxlIChzcmNfc3ogPj0gOCkgewotICAgICAgICBQWV9VSU5UNjRfVCBtaSA9IF9sZTY0dG9oKCppbik7CisgICAgICAgIHVpbnQ2NF90IG1pID0gX2xlNjR0b2goKmluKTsKICAgICAgICAgaW4gKz0gMTsKICAgICAgICAgc3JjX3N6IC09IDg7CiAgICAgICAgIHYzIF49IG1pOwpAQCAtMzkzLDEzICszOTAsMTMgQEAKICAgICB9CiAKICAgICB0ID0gMDsKLSAgICBwdCA9IChQWV9VSU5UOF9UICopJnQ7Ci0gICAgbSA9IChQWV9VSU5UOF9UICopaW47CisgICAgcHQgPSAodWludDhfdCAqKSZ0OworICAgIG0gPSAodWludDhfdCAqKWluOwogICAgIHN3aXRjaCAoc3JjX3N6KSB7CiAgICAgICAgIGNhc2UgNzogcHRbNl0gPSBtWzZdOwogICAgICAgICBjYXNlIDY6IHB0WzVdID0gbVs1XTsKICAgICAgICAgY2FzZSA1OiBwdFs0XSA9IG1bNF07Ci0gICAgICAgIGNhc2UgNDogUHlfTUVNQ1BZKHB0LCBtLCBzaXplb2YoUFlfVUlOVDMyX1QpKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNDogUHlfTUVNQ1BZKHB0LCBtLCBzaXplb2YodWludDMyX3QpKTsgYnJlYWs7CiAgICAgICAgIGNhc2UgMzogcHRbMl0gPSBtWzJdOwogICAgICAgICBjYXNlIDI6IHB0WzFdID0gbVsxXTsKICAgICAgICAgY2FzZSAxOiBwdFswXSA9IG1bMF07CmRpZmYgLS1naXQgYS9QeXRob24vcHlsaWZlY3ljbGUuYyBiL1B5dGhvbi9weWxpZmVjeWNsZS5jCmluZGV4IGNlNTI5OTAuLmY5M2FmZDIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weWxpZmVjeWNsZS5jCisrKyBiL1B5dGhvbi9weWxpZmVjeWNsZS5jCkBAIC0zMSw2ICszMSw5IEBACiAjaWZkZWYgTVNfV0lORE9XUwogI3VuZGVmIEJZVEUKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisKK2V4dGVybiBQeVR5cGVPYmplY3QgUHlXaW5kb3dzQ29uc29sZUlPX1R5cGU7CisjZGVmaW5lIFB5V2luZG93c0NvbnNvbGVJT19DaGVjayhvcCkgKFB5T2JqZWN0X1R5cGVDaGVjaygob3ApLCAmUHlXaW5kb3dzQ29uc29sZUlPX1R5cGUpKQogI2VuZGlmCiAKIF9QeV9JREVOVElGSUVSKGZsdXNoKTsKQEAgLTkwLDYgKzkzLDEwIEBACiBpbnQgUHlfVW5idWZmZXJlZFN0ZGlvRmxhZyA9IDA7IC8qIFVuYnVmZmVyZWQgYmluYXJ5IHN0ZHtpbixvdXQsZXJyfSAqLwogaW50IFB5X0hhc2hSYW5kb21pemF0aW9uRmxhZyA9IDA7IC8qIGZvciAtUiBhbmQgUFlUSE9OSEFTSFNFRUQgKi8KIGludCBQeV9Jc29sYXRlZEZsYWcgPSAwOyAvKiBmb3IgLUksIGlzb2xhdGUgZnJvbSB1c2VyJ3MgZW52ICovCisjaWZkZWYgTVNfV0lORE9XUworaW50IFB5X0xlZ2FjeVdpbmRvd3NGU0VuY29kaW5nRmxhZyA9IDA7IC8qIFVzZXMgbWJjcyBpbnN0ZWFkIG9mIHV0Zi04ICovCitpbnQgUHlfTGVnYWN5V2luZG93c1N0ZGlvRmxhZyA9IDA7IC8qIFVzZXMgRmlsZUlPIGluc3RlYWQgb2YgV2luZG93c0NvbnNvbGVJTyAqLworI2VuZGlmCiAKIFB5VGhyZWFkU3RhdGUgKl9QeV9GaW5hbGl6aW5nID0gTlVMTDsKIApAQCAtMTUxLDExICsxNTgsMTcgQEAKICAgICAgICAgICAgIHJldHVybiAtMzsKICAgICAgICAgfQogICAgIH0KKyNpZmRlZiBNU19XSU5ET1dTCisgICAgaWYgKF9QeV9TdGFuZGFyZFN0cmVhbUVuY29kaW5nKSB7CisgICAgICAgIC8qIE92ZXJyaWRpbmcgdGhlIHN0cmVhbSBlbmNvZGluZyBpbXBsaWVzIGxlZ2FjeSBzdHJlYW1zICovCisgICAgICAgIFB5X0xlZ2FjeVdpbmRvd3NTdGRpb0ZsYWcgPSAxOworICAgIH0KKyNlbmRpZgogICAgIHJldHVybiAwOwogfQogCi0vKiBHbG9iYWwgaW5pdGlhbGl6YXRpb25zLiAgQ2FuIGJlIHVuZG9uZSBieSBQeV9GaW5hbGl6ZSgpLiAgRG9uJ3QKLSAgIGNhbGwgdGhpcyB0d2ljZSB3aXRob3V0IGFuIGludGVydmVuaW5nIFB5X0ZpbmFsaXplKCkgY2FsbC4gIFdoZW4KKy8qIEdsb2JhbCBpbml0aWFsaXphdGlvbnMuICBDYW4gYmUgdW5kb25lIGJ5IFB5X0ZpbmFsaXplRXgoKS4gIERvbid0CisgICBjYWxsIHRoaXMgdHdpY2Ugd2l0aG91dCBhbiBpbnRlcnZlbmluZyBQeV9GaW5hbGl6ZUV4KCkgY2FsbC4gIFdoZW4KICAgIGluaXRpYWxpemF0aW9ucyBmYWlsLCBhIGZhdGFsIGVycm9yIGlzIGlzc3VlZCBhbmQgdGhlIGZ1bmN0aW9uIGRvZXMKICAgIG5vdCByZXR1cm4uICBPbiByZXR1cm4sIHRoZSBmaXJzdCB0aHJlYWQgYW5kIGludGVycHJldGVyIHN0YXRlIGhhdmUKICAgIGJlZW4gY3JlYXRlZC4KQEAgLTIyMyw2ICsyMzYsOCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIGdldF9jb2RlY19uYW1lKGNvZGVzZXQpOworI2VsaWYgZGVmaW5lZChfX0FORFJPSURfXykKKyAgICByZXR1cm4gZ2V0X2NvZGVjX25hbWUoIlVURi04Iik7CiAjZWxzZQogICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcik7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC0yNTIsNiArMjY3LDExIEBACiAgICAgaW50ZXJwLT5pbXBvcnRsaWIgPSBpbXBvcnRsaWI7CiAgICAgUHlfSU5DUkVGKGludGVycC0+aW1wb3J0bGliKTsKIAorICAgIGludGVycC0+aW1wb3J0X2Z1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhpbnRlcnAtPmJ1aWx0aW5zLCAiX19pbXBvcnRfXyIpOworICAgIGlmIChpbnRlcnAtPmltcG9ydF9mdW5jID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IF9faW1wb3J0X18gbm90IGZvdW5kIik7CisgICAgUHlfSU5DUkVGKGludGVycC0+aW1wb3J0X2Z1bmMpOworCiAgICAgLyogSW1wb3J0IHRoZSBfaW1wIG1vZHVsZSAqLwogICAgIGltcG1vZCA9IFB5SW5pdF9pbXAoKTsKICAgICBpZiAoaW1wbW9kID09IE5VTEwpIHsKQEAgLTMxNCw2ICszMzQsMTIgQEAKICAgICAgICBjaGVjayBpdHMgdmFsdWUgZnVydGhlci4gKi8KICAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTkhBU0hTRUVEIikpICYmICpwICE9ICdcMCcpCiAgICAgICAgIFB5X0hhc2hSYW5kb21pemF0aW9uRmxhZyA9IGFkZF9mbGFnKFB5X0hhc2hSYW5kb21pemF0aW9uRmxhZywgcCk7CisjaWZkZWYgTVNfV0lORE9XUworICAgIGlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OTEVHQUNZV0lORE9XU0ZTRU5DT0RJTkciKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfTGVnYWN5V2luZG93c0ZTRW5jb2RpbmdGbGFnID0gYWRkX2ZsYWcoUHlfTGVnYWN5V2luZG93c0ZTRW5jb2RpbmdGbGFnLCBwKTsKKyAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTkxFR0FDWVdJTkRPV1NTVERJTyIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICBQeV9MZWdhY3lXaW5kb3dzU3RkaW9GbGFnID0gYWRkX2ZsYWcoUHlfTGVnYWN5V2luZG93c1N0ZGlvRmxhZywgcCk7CisjZW5kaWYKIAogICAgIF9QeVJhbmRvbV9Jbml0KCk7CiAKQEAgLTMyNywxMSArMzUzLDExIEBACiAgICAgKHZvaWQpIFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLSAgICAvKiBXZSBjYW4ndCBjYWxsIF9QeUV2YWxfRmluaVRocmVhZHMoKSBpbiBQeV9GaW5hbGl6ZSBiZWNhdXNlCisgICAgLyogV2UgY2FuJ3QgY2FsbCBfUHlFdmFsX0ZpbmlUaHJlYWRzKCkgaW4gUHlfRmluYWxpemVFeCBiZWNhdXNlCiAgICAgICAgZGVzdHJveWluZyB0aGUgR0lMIG1pZ2h0IGZhaWwgd2hlbiBpdCBpcyBiZWluZyByZWZlcmVuY2VkIGZyb20KICAgICAgICBhbm90aGVyIHJ1bm5pbmcgdGhyZWFkIChzZWUgaXNzdWUgIzk5MDEpLgogICAgICAgIEluc3RlYWQgd2UgZGVzdHJveSB0aGUgcHJldmlvdXNseSBjcmVhdGVkIEdJTCBoZXJlLCB3aGljaCBlbnN1cmVzCi0gICAgICAgdGhhdCB3ZSBjYW4gY2FsbCBQeV9Jbml0aWFsaXplIC8gUHlfRmluYWxpemUgbXVsdGlwbGUgdGltZXMuICovCisgICAgICAgdGhhdCB3ZSBjYW4gY2FsbCBQeV9Jbml0aWFsaXplIC8gUHlfRmluYWxpemVFeCBtdWx0aXBsZSB0aW1lcy4gKi8KICAgICBfUHlFdmFsX0ZpbmlUaHJlYWRzKCk7CiAKICAgICAvKiBBdXRvLXRocmVhZC1zdGF0ZSBBUEkgKi8KQEAgLTQ3NywyOCArNTAzLDM1IEBACiAgICAgcmV0dXJuIHIgPiAwOwogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogZmx1c2hfc3RkX2ZpbGVzKHZvaWQpCiB7CiAgICAgUHlPYmplY3QgKmZvdXQgPSBfUHlTeXNfR2V0T2JqZWN0SWQoJlB5SWRfc3Rkb3V0KTsKICAgICBQeU9iamVjdCAqZmVyciA9IF9QeVN5c19HZXRPYmplY3RJZCgmUHlJZF9zdGRlcnIpOwogICAgIFB5T2JqZWN0ICp0bXA7CisgICAgaW50IHN0YXR1cyA9IDA7CiAKICAgICBpZiAoZm91dCAhPSBOVUxMICYmIGZvdXQgIT0gUHlfTm9uZSAmJiAhZmlsZV9pc19jbG9zZWQoZm91dCkpIHsKLSAgICAgICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmb3V0LCAmUHlJZF9mbHVzaCwgIiIpOwotICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm91dCwgJlB5SWRfZmx1c2gsIE5VTEwpOworICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShmb3V0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC0xOworICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOwogICAgIH0KIAogICAgIGlmIChmZXJyICE9IE5VTEwgJiYgZmVyciAhPSBQeV9Ob25lICYmICFmaWxlX2lzX2Nsb3NlZChmZXJyKSkgewotICAgICAgICB0bXAgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGZlcnIsICZQeUlkX2ZsdXNoLCAiIik7Ci0gICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmZXJyLCAmUHlJZF9mbHVzaCwgTlVMTCk7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC0xOworICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOwogICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qIFVuZG8gdGhlIGVmZmVjdCBvZiBQeV9Jbml0aWFsaXplKCkuCkBAIC01MTUsMTQgKzU0OCwxNSBAQAogCiAqLwogCi12b2lkCi1QeV9GaW5hbGl6ZSh2b2lkKQoraW50CitQeV9GaW5hbGl6ZUV4KHZvaWQpCiB7CiAgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnA7CiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworICAgIGludCBzdGF0dXMgPSAwOwogCiAgICAgaWYgKCFpbml0aWFsaXplZCkKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gc3RhdHVzOwogCiAgICAgd2FpdF9mb3JfdGhyZWFkX3NodXRkb3duKCk7CiAKQEAgLTU0Nyw3ICs1ODEsOSBAQAogICAgIGluaXRpYWxpemVkID0gMDsKIAogICAgIC8qIEZsdXNoIHN5cy5zdGRvdXQgYW5kIHN5cy5zdGRlcnIgKi8KLSAgICBmbHVzaF9zdGRfZmlsZXMoKTsKKyAgICBpZiAoZmx1c2hfc3RkX2ZpbGVzKCkgPCAwKSB7CisgICAgICAgIHN0YXR1cyA9IC0xOworICAgIH0KIAogICAgIC8qIERpc2FibGUgc2lnbmFsIGhhbmRsaW5nICovCiAgICAgUHlPU19GaW5pSW50ZXJydXB0cygpOwpAQCAtNTc2LDcgKzYxMiw5IEBACiAgICAgUHlJbXBvcnRfQ2xlYW51cCgpOwogCiAgICAgLyogRmx1c2ggc3lzLnN0ZG91dCBhbmQgc3lzLnN0ZGVyciAoYWdhaW4sIGluIGNhc2UgbW9yZSB3YXMgcHJpbnRlZCkgKi8KLSAgICBmbHVzaF9zdGRfZmlsZXMoKTsKKyAgICBpZiAoZmx1c2hfc3RkX2ZpbGVzKCkgPCAwKSB7CisgICAgICAgIHN0YXR1cyA9IC0xOworICAgIH0KIAogICAgIC8qIENvbGxlY3QgZmluYWwgZ2FyYmFnZS4gIFRoaXMgZGlzcG9zZXMgb2YgY3ljbGVzIGNyZWF0ZWQgYnkKICAgICAgKiBjbGFzcyBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGUuCkBAIC02MTIsNyArNjUwLDcgQEAKIAogICAgIC8qIERlYnVnZ2luZyBzdHVmZiAqLwogI2lmZGVmIENPVU5UX0FMTE9DUwotICAgIGR1bXBfY291bnRzKHN0ZG91dCk7CisgICAgZHVtcF9jb3VudHMoc3RkZXJyKTsKICNlbmRpZgogICAgIC8qIGR1bXAgaGFzaCBzdGF0cyAqLwogICAgIF9QeUhhc2hfRmluaSgpOwpAQCAtNjU1LDYgKzY5Myw4IEBACiAgICAgUHlTbGljZV9GaW5pKCk7CiAgICAgX1B5R0NfRmluaSgpOwogICAgIF9QeVJhbmRvbV9GaW5pKCk7CisgICAgX1B5QXJnX0ZpbmkoKTsKKyAgICBQeUFzeW5jR2VuX0ZpbmkoKTsKIAogICAgIC8qIENsZWFudXAgVW5pY29kZSBpbXBsZW1lbnRhdGlvbiAqLwogICAgIF9QeVVuaWNvZGVfRmluaSgpOwpAQCAtNjgwLDYgKzcyMCw3IEBACiAKICAgICAvKiBEZWxldGUgY3VycmVudCB0aHJlYWQuIEFmdGVyIHRoaXMsIG1hbnkgQyBBUEkgY2FsbHMgYmVjb21lIGNyYXNoeS4gKi8KICAgICBQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7CisKICAgICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7CiAKICNpZmRlZiBQeV9UUkFDRV9SRUZTCkBAIC02OTAsMTIgKzczMSwyMiBAQAogICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTkRVTVBSRUZTIikpCiAgICAgICAgIF9QeV9QcmludFJlZmVyZW5jZUFkZHJlc3NlcyhzdGRlcnIpOwogI2VuZGlmIC8qIFB5X1RSQUNFX1JFRlMgKi8KLSNpZmRlZiBQWU1BTExPQ19ERUJVRwotICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIikpCi0gICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKHN0ZGVycik7CisjaWZkZWYgV0lUSF9QWU1BTExPQworICAgIGlmIChfUHlNZW1fUHltYWxsb2NFbmFibGVkKCkpIHsKKyAgICAgICAgY2hhciAqb3B0ID0gUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpOworICAgICAgICBpZiAob3B0ICE9IE5VTEwgJiYgKm9wdCAhPSAnXDAnKQorICAgICAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHMoc3RkZXJyKTsKKyAgICB9CiAjZW5kaWYKIAogICAgIGNhbGxfbGxfZXhpdGZ1bmNzKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZAorUHlfRmluYWxpemUodm9pZCkKK3sKKyAgICBQeV9GaW5hbGl6ZUV4KCk7CiB9CiAKIC8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBpbnRlcnByZXRlciBhbmQgdGhyZWFkLCBhbmQgcmV0dXJuIHRoZQpAQCAtNzIxLDYgKzc3MiwxMiBAQAogICAgIGlmICghaW5pdGlhbGl6ZWQpCiAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X05ld0ludGVycHJldGVyOiBjYWxsIFB5X0luaXRpYWxpemUgZmlyc3QiKTsKIAorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgLyogSXNzdWUgIzEwOTE1LCAjMTU3NTE6IFRoZSBHSUwgQVBJIGRvZXNuJ3Qgd29yayB3aXRoIG11bHRpcGxlCisgICAgICAgaW50ZXJwcmV0ZXJzOiBkaXNhYmxlIFB5R0lMU3RhdGVfQ2hlY2soKS4gKi8KKyAgICBfUHlHSUxTdGF0ZV9jaGVja19lbmFibGVkID0gMDsKKyNlbmRpZgorCiAgICAgaW50ZXJwID0gUHlJbnRlcnByZXRlclN0YXRlX05ldygpOwogICAgIGlmIChpbnRlcnAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC03NzcsNyArODM0LDcgQEAKIAogICAgICAgICBpZiAoaW5pdHN0ZGlvKCkgPCAwKQogICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigKLSAgICAgICAgICAgICJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIHN5cyBzdGFuZGFyZCBzdHJlYW1zIik7CisgICAgICAgICAgICAgICAgIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXRpYWxpemUgc3lzIHN0YW5kYXJkIHN0cmVhbXMiKTsKICAgICAgICAgaW5pdG1haW4oaW50ZXJwKTsKICAgICAgICAgaWYgKCFQeV9Ob1NpdGVGbGFnKQogICAgICAgICAgICAgaW5pdHNpdGUoKTsKQEAgLTgwMyw3ICs4NjAsNyBAQAogICAgZnJhbWVzLCBhbmQgdGhhdCBpdCBpcyBpdHMgaW50ZXJwcmV0ZXIncyBvbmx5IHJlbWFpbmluZyB0aHJlYWQuCiAgICBJdCBpcyBhIGZhdGFsIGVycm9yIHRvIHZpb2xhdGUgdGhlc2UgY29uc3RyYWludHMuCiAKLSAgIChQeV9GaW5hbGl6ZSgpIGRvZXNuJ3QgaGF2ZSB0aGVzZSBjb25zdHJhaW50cyAtLSBpdCB6YXBzCisgICAoUHlfRmluYWxpemVFeCgpIGRvZXNuJ3QgaGF2ZSB0aGVzZSBjb25zdHJhaW50cyAtLSBpdCB6YXBzCiAgICBldmVyeXRoaW5nLCByZWdhcmRsZXNzLikKIAogICAgTG9ja2luZzogYXMgYWJvdmUuCkBAIC04ODEsMTEgKzkzOCwxNyBAQAogc3RhdGljIHZvaWQKIGluaXRtYWluKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKQogewotICAgIFB5T2JqZWN0ICptLCAqZCwgKmxvYWRlcjsKKyAgICBQeU9iamVjdCAqbSwgKmQsICpsb2FkZXIsICphbm5fZGljdDsKICAgICBtID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwogICAgIGlmIChtID09IE5VTEwpCiAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGNyZWF0ZSBfX21haW5fXyBtb2R1bGUiKTsKICAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBhbm5fZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoKGFubl9kaWN0ID09IE5VTEwpIHx8CisgICAgICAgIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19hbm5vdGF0aW9uc19fIiwgYW5uX2RpY3QpIDwgMCkpIHsKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgX19tYWluX18uX19hbm5vdGF0aW9uc19fIik7CisgICAgfQorICAgIFB5X0RFQ1JFRihhbm5fZGljdCk7CiAgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICpiaW1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiYnVpbHRpbnMiKTsKICAgICAgICAgaWYgKGJpbW9kID09IE5VTEwpIHsKQEAgLTkyMSw2ICs5ODQsMTggQEAKIHsKICAgICBQeU9iamVjdCAqY29kZWM7CiAKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgaWYgKFB5X0xlZ2FjeVdpbmRvd3NGU0VuY29kaW5nRmxhZykKKyAgICB7CisgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgPSAibWJjcyI7CisgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RlRXJyb3JzID0gInJlcGxhY2UiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nID0gInV0Zi04IjsKKyAgICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGVFcnJvcnMgPSAic3Vycm9nYXRlcGFzcyI7CisgICAgfQorI2Vsc2UKICAgICBpZiAoUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyA9PSBOVUxMKQogICAgIHsKICAgICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyA9IGdldF9sb2NhbGVfZW5jb2RpbmcoKTsKQEAgLTkzMSw2ICsxMDA2LDcgQEAKICAgICAgICAgaW50ZXJwLT5mc2NvZGVjX2luaXRpYWxpemVkID0gMTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorI2VuZGlmCiAKICAgICAvKiB0aGUgZW5jb2RpbmcgaXMgbWJjcywgdXRmLTggb3IgYXNjaWkgKi8KICAgICBjb2RlYyA9IF9QeUNvZGVjX0xvb2t1cChQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nKTsKQEAgLTk2OSw5ICsxMDQ1LDEyIEBACiBpc192YWxpZF9mZChpbnQgZmQpCiB7CiAgICAgaW50IGZkMjsKLSAgICBpZiAoZmQgPCAwIHx8ICFfUHlWZXJpZnlfZmQoZmQpKQorICAgIGlmIChmZCA8IDApCiAgICAgICAgIHJldHVybiAwOwogICAgIF9QeV9CRUdJTl9TVVBQUkVTU19JUEgKKyAgICAvKiBQcmVmZXIgZHVwKCkgb3ZlciBmc3RhdCgpLiBmc3RhdCgpIGNhbiByZXF1aXJlIGlucHV0L291dHB1dCB3aGVyZWFzCisgICAgICAgZHVwKCkgZG9lc24ndCwgdGhlcmUgaXMgYSBsb3cgcmlzayBvZiBFTUZJTEUvRU5GSUxFIGF0IFB5dGhvbgorICAgICAgIHN0YXJ0dXAuICovCiAgICAgZmQyID0gZHVwKGZkKTsKICAgICBpZiAoZmQyID49IDApCiAgICAgICAgIGNsb3NlKGZkMik7CkBAIC05ODIsOCArMTA2MSw4IEBACiAvKiByZXR1cm5zIFB5X05vbmUgaWYgdGhlIGZkIGlzIG5vdCB2YWxpZCAqLwogc3RhdGljIFB5T2JqZWN0KgogY3JlYXRlX3N0ZGlvKFB5T2JqZWN0KiBpbywKLSAgICBpbnQgZmQsIGludCB3cml0ZV9tb2RlLCBjaGFyKiBuYW1lLAotICAgIGNoYXIqIGVuY29kaW5nLCBjaGFyKiBlcnJvcnMpCisgICAgaW50IGZkLCBpbnQgd3JpdGVfbW9kZSwgY29uc3QgY2hhciogbmFtZSwKKyAgICBjb25zdCBjaGFyKiBlbmNvZGluZywgY29uc3QgY2hhciogZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICpidWYgPSBOVUxMLCAqc3RyZWFtID0gTlVMTCwgKnRleHQgPSBOVUxMLCAqcmF3ID0gTlVMTCwgKnJlczsKICAgICBjb25zdCBjaGFyKiBtb2RlOwpAQCAtMTAxMyw3ICsxMDkyLDggQEAKICAgICAgICAgbW9kZSA9ICJyYiI7CiAgICAgYnVmID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChpbywgJlB5SWRfb3BlbiwgImlzaU9PT2kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIG1vZGUsIGJ1ZmZlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsIFB5X05vbmUsIFB5X05vbmUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwgUHlfTm9uZSwgLyogZW5jb2RpbmcsIGVycm9ycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwgMCk7IC8qIG5ld2xpbmUsIGNsb3NlZmQgKi8KICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyb3I7CiAKQEAgLTEwMjgsMTAgKzExMDgsMTYgQEAKICAgICAgICAgUHlfSU5DUkVGKHJhdyk7CiAgICAgfQogCisjaWZkZWYgTVNfV0lORE9XUworICAgIC8qIFdpbmRvd3MgY29uc29sZSBJTyBpcyBhbHdheXMgVVRGLTggZW5jb2RlZCAqLworICAgIGlmIChQeVdpbmRvd3NDb25zb2xlSU9fQ2hlY2socmF3KSkKKyAgICAgICAgZW5jb2RpbmcgPSAidXRmLTgiOworI2VuZGlmCisKICAgICB0ZXh0ID0gUHlVbmljb2RlX0Zyb21TdHJpbmcobmFtZSk7CiAgICAgaWYgKHRleHQgPT0gTlVMTCB8fCBfUHlPYmplY3RfU2V0QXR0cklkKHJhdywgJlB5SWRfbmFtZSwgdGV4dCkgPCAwKQogICAgICAgICBnb3RvIGVycm9yOwotICAgIHJlcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQocmF3LCAmUHlJZF9pc2F0dHksICIiKTsKKyAgICByZXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHJhdywgJlB5SWRfaXNhdHR5LCBOVUxMKTsKICAgICBpZiAocmVzID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgaXNhdHR5ID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7CkBAIC0xMjQzLDI1ICsxMzI5LDExIEBACiBzdGF0aWMgdm9pZAogX1B5X0ZhdGFsRXJyb3JfRHVtcFRyYWNlYmFja3MoaW50IGZkKQogewotICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKLQotI2lmZGVmIFdJVEhfVEhSRUFECi0gICAgLyogUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKSB3b3JrcyBldmVuIGlmIHRoZSBHSUwgd2FzIHJlbGVhc2VkICovCi0gICAgdHN0YXRlID0gUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKTsKLSNlbHNlCi0gICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLSNlbmRpZgotICAgIGlmICh0c3RhdGUgPT0gTlVMTCkgewotICAgICAgICAvKiBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoKSByZXF1aXJlcyB0aGUgdGhyZWFkIHN0YXRlIHRvIGRpc3BsYXkKLSAgICAgICAgICogZnJhbWVzICovCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICBmcHV0YygnXG4nLCBzdGRlcnIpOwogICAgIGZmbHVzaChzdGRlcnIpOwogCiAgICAgLyogZGlzcGxheSB0aGUgY3VycmVudCBQeXRob24gc3RhY2sgKi8KLSAgICBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIHRzdGF0ZS0+aW50ZXJwLCB0c3RhdGUpOworICAgIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyhmZCwgTlVMTCwgTlVMTCk7CiB9CiAKIC8qIFByaW50IHRoZSBjdXJyZW50IGV4Y2VwdGlvbiAoaWYgYW4gZXhjZXB0aW9uIGlzIHNldCkgd2l0aCBpdHMgdHJhY2ViYWNrLApAQCAtMTMxNiw3ICsxMzg4LDcgQEAKICAgICBQeV9YREVDUkVGKHRiKTsKIAogICAgIC8qIHN5cy5zdGRlcnIgbWF5IGJlIGJ1ZmZlcmVkOiBjYWxsIHN5cy5zdGRlcnIuZmx1c2goKSAqLwotICAgIHJlcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZmVyciwgJlB5SWRfZmx1c2gsICIiKTsKKyAgICByZXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGZlcnIsICZQeUlkX2ZsdXNoLCBOVUxMKTsKICAgICBpZiAocmVzID09IE5VTEwpCiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgZWxzZQpAQCAtMTM4OCw3ICsxNDYwLDcgQEAKIC8qIENsZWFuIHVwIGFuZCBleGl0ICovCiAKICNpZmRlZiBXSVRIX1RIUkVBRAotI2luY2x1ZGUgInB5dGhyZWFkLmgiCisjICBpbmNsdWRlICJweXRocmVhZC5oIgogI2VuZGlmCiAKIHN0YXRpYyB2b2lkICgqcHlleGl0ZnVuYykodm9pZCkgPSBOVUxMOwpAQCAtMTQyNiw3ICsxNDk4LDcgQEAKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICByZXN1bHQgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHRocmVhZGluZywgJlB5SWRfX3NodXRkb3duLCAiIik7CisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCh0aHJlYWRpbmcsICZQeUlkX19zaHV0ZG93biwgTlVMTCk7CiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSh0aHJlYWRpbmcpOwogICAgIH0KQEAgLTE0NjIsNyArMTUzNCw5IEBACiB2b2lkCiBQeV9FeGl0KGludCBzdHMpCiB7Ci0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICBzdHMgPSAxMjA7CisgICAgfQogCiAgICAgZXhpdChzdHMpOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5c3RhdGUuYyBiL1B5dGhvbi9weXN0YXRlLmMKaW5kZXggMjRlMjBjMy4uYTBhOGM5NyAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5c3RhdGUuYworKysgYi9QeXRob24vcHlzdGF0ZS5jCkBAIC02LDcgKzYsNyBAQAogI2RlZmluZSBHRVRfVFNUQVRFKCkgXAogICAgICgoUHlUaHJlYWRTdGF0ZSopX1B5X2F0b21pY19sb2FkX3JlbGF4ZWQoJl9QeVRocmVhZFN0YXRlX0N1cnJlbnQpKQogI2RlZmluZSBTRVRfVFNUQVRFKHZhbHVlKSBcCi0gICAgX1B5X2F0b21pY19zdG9yZV9yZWxheGVkKCZfUHlUaHJlYWRTdGF0ZV9DdXJyZW50LCAoUHlfdWludHB0cl90KSh2YWx1ZSkpCisgICAgX1B5X2F0b21pY19zdG9yZV9yZWxheGVkKCZfUHlUaHJlYWRTdGF0ZV9DdXJyZW50LCAodWludHB0cl90KSh2YWx1ZSkpCiAjZGVmaW5lIEdFVF9JTlRFUlBfU1RBVEUoKSBcCiAgICAgKEdFVF9UU1RBVEUoKS0+aW50ZXJwKQogCkBAIC0yNSw3ICsyNSw3IEBACiAjaWZkZWYgSEFWRV9ETEZDTl9ICiAjaW5jbHVkZSA8ZGxmY24uaD4KICNlbmRpZgotI2lmbmRlZiBSVExEX0xBWlkKKyNpZiAhSEFWRV9ERUNMX1JUTERfTEFaWQogI2RlZmluZSBSVExEX0xBWlkgMQogI2VuZGlmCiAjZW5kaWYKQEAgLTM0LDYgKzM0LDggQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKK2ludCBfUHlHSUxTdGF0ZV9jaGVja19lbmFibGVkID0gMTsKKwogI2lmZGVmIFdJVEhfVEhSRUFECiAjaW5jbHVkZSAicHl0aHJlYWQuaCIKIHN0YXRpYyBQeVRocmVhZF90eXBlX2xvY2sgaGVhZF9tdXRleCA9IE5VTEw7IC8qIFByb3RlY3RzIGludGVycC0+dHN0YXRlX2hlYWQgKi8KQEAgLTQ1LDcgKzQ3LDcgQEAKICAgIEdJTFN0YXRlIGltcGxlbWVudGF0aW9uCiAqLwogc3RhdGljIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqYXV0b0ludGVycHJldGVyU3RhdGUgPSBOVUxMOwotc3RhdGljIGludCBhdXRvVExTa2V5ID0gMDsKK3N0YXRpYyBpbnQgYXV0b1RMU2tleSA9IC0xOwogI2Vsc2UKICNkZWZpbmUgSEVBRF9JTklUKCkgLyogTm90aGluZyAqLwogI2RlZmluZSBIRUFEX0xPQ0soKSAvKiBOb3RoaW5nICovCkBAIC04OCw4ICs5MCwxMCBAQAogICAgICAgICBpbnRlcnAtPmNvZGVjc19pbml0aWFsaXplZCA9IDA7CiAgICAgICAgIGludGVycC0+ZnNjb2RlY19pbml0aWFsaXplZCA9IDA7CiAgICAgICAgIGludGVycC0+aW1wb3J0bGliID0gTlVMTDsKKyAgICAgICAgaW50ZXJwLT5pbXBvcnRfZnVuYyA9IE5VTEw7CisgICAgICAgIGludGVycC0+ZXZhbF9mcmFtZSA9IF9QeUV2YWxfRXZhbEZyYW1lRGVmYXVsdDsKICNpZmRlZiBIQVZFX0RMT1BFTgotI2lmZGVmIFJUTERfTk9XCisjaWYgSEFWRV9ERUNMX1JUTERfTk9XCiAgICAgICAgIGludGVycC0+ZGxvcGVuZmxhZ3MgPSBSVExEX05PVzsKICNlbHNlCiAgICAgICAgIGludGVycC0+ZGxvcGVuZmxhZ3MgPSBSVExEX0xBWlk7CkBAIC0xMjYsNiArMTMwLDcgQEAKICAgICBQeV9DTEVBUihpbnRlcnAtPmJ1aWx0aW5zKTsKICAgICBQeV9DTEVBUihpbnRlcnAtPmJ1aWx0aW5zX2NvcHkpOwogICAgIFB5X0NMRUFSKGludGVycC0+aW1wb3J0bGliKTsKKyAgICBQeV9DTEVBUihpbnRlcnAtPmltcG9ydF9mdW5jKTsKIH0KIAogCkBAIC0yMjIsNiArMjI3LDEwIEBACiAKICAgICAgICAgdHN0YXRlLT5jb3JvdXRpbmVfd3JhcHBlciA9IE5VTEw7CiAgICAgICAgIHRzdGF0ZS0+aW5fY29yb3V0aW5lX3dyYXBwZXIgPSAwOworICAgICAgICB0c3RhdGUtPmNvX2V4dHJhX3VzZXJfY291bnQgPSAwOworCisgICAgICAgIHRzdGF0ZS0+YXN5bmNfZ2VuX2ZpcnN0aXRlciA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+YXN5bmNfZ2VuX2ZpbmFsaXplciA9IE5VTEw7CiAKICAgICAgICAgaWYgKGluaXQpCiAgICAgICAgICAgICBfUHlUaHJlYWRTdGF0ZV9Jbml0KHRzdGF0ZSk7CkBAIC00MDIsNiArNDExLDggQEAKICAgICBQeV9DTEVBUih0c3RhdGUtPmNfdHJhY2VvYmopOwogCiAgICAgUHlfQ0xFQVIodHN0YXRlLT5jb3JvdXRpbmVfd3JhcHBlcik7CisgICAgUHlfQ0xFQVIodHN0YXRlLT5hc3luY19nZW5fZmlyc3RpdGVyKTsKKyAgICBQeV9DTEVBUih0c3RhdGUtPmFzeW5jX2dlbl9maW5hbGl6ZXIpOwogfQogCiAKQEAgLTQ1MSwxMCArNDYyLDEwIEBACiAgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQogICAgICAgICBQeV9GYXRhbEVycm9yKAogICAgICAgICAgICAgIlB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudDogbm8gY3VycmVudCB0c3RhdGUiKTsKLSAgICBTRVRfVFNUQVRFKE5VTEwpOworICAgIHRzdGF0ZV9kZWxldGVfY29tbW9uKHRzdGF0ZSk7CiAgICAgaWYgKGF1dG9JbnRlcnByZXRlclN0YXRlICYmIFB5VGhyZWFkX2dldF9rZXlfdmFsdWUoYXV0b1RMU2tleSkgPT0gdHN0YXRlKQogICAgICAgICBQeVRocmVhZF9kZWxldGVfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpOwotICAgIHRzdGF0ZV9kZWxldGVfY29tbW9uKHRzdGF0ZSk7CisgICAgU0VUX1RTVEFURShOVUxMKTsKICAgICBQeUV2YWxfUmVsZWFzZUxvY2soKTsKIH0KICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwpAQCAtNjk4LDcgKzcwOSw3IEBACiB9CiAKIC8qIEludGVybmFsIGluaXRpYWxpemF0aW9uL2ZpbmFsaXphdGlvbiBmdW5jdGlvbnMgY2FsbGVkIGJ5Ci0gICBQeV9Jbml0aWFsaXplL1B5X0ZpbmFsaXplCisgICBQeV9Jbml0aWFsaXplL1B5X0ZpbmFsaXplRXgKICovCiB2b2lkCiBfUHlHSUxTdGF0ZV9Jbml0KFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaSwgUHlUaHJlYWRTdGF0ZSAqdCkKQEAgLTcxNCwxMCArNzI1LDE3IEBACiAgICAgX1B5R0lMU3RhdGVfTm90ZVRocmVhZFN0YXRlKHQpOwogfQogCitQeUludGVycHJldGVyU3RhdGUgKgorX1B5R0lMU3RhdGVfR2V0SW50ZXJwcmV0ZXJTdGF0ZVVuc2FmZSh2b2lkKQoreworICAgIHJldHVybiBhdXRvSW50ZXJwcmV0ZXJTdGF0ZTsKK30KKwogdm9pZAogX1B5R0lMU3RhdGVfRmluaSh2b2lkKQogewogICAgIFB5VGhyZWFkX2RlbGV0ZV9rZXkoYXV0b1RMU2tleSk7CisgICAgYXV0b1RMU2tleSA9IC0xOwogICAgIGF1dG9JbnRlcnByZXRlclN0YXRlID0gTlVMTDsKIH0KIApAQCAtNzg2LDggKzgwNCwxOSBAQAogaW50CiBQeUdJTFN0YXRlX0NoZWNrKHZvaWQpCiB7Ci0gICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gR0VUX1RTVEFURSgpOwotICAgIHJldHVybiB0c3RhdGUgJiYgKHRzdGF0ZSA9PSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CisKKyAgICBpZiAoIV9QeUdJTFN0YXRlX2NoZWNrX2VuYWJsZWQpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKGF1dG9UTFNrZXkgPT0gLTEpCisgICAgICAgIHJldHVybiAxOworCisgICAgdHN0YXRlID0gR0VUX1RTVEFURSgpOworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gKHRzdGF0ZSA9PSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpKTsKIH0KIAogUHlHSUxTdGF0ZV9TVEFURQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5c3RydG9kLmMgYi9QeXRob24vcHlzdHJ0b2QuYwppbmRleCAyMDljOTA4Li41ZjNhZjkyIDEwMDY0NAotLS0gYS9QeXRob24vcHlzdHJ0b2QuYworKysgYi9QeXRob24vcHlzdHJ0b2QuYwpAQCAtODgxLDEyICs4ODEsMTIgQEAKICNkZWZpbmUgT0ZTX0UgMgogCiAvKiBUaGUgbGVuZ3RocyBvZiB0aGVzZSBhcmUga25vd24gdG8gdGhlIGNvZGUgYmVsb3csIHNvIGRvbid0IGNoYW5nZSB0aGVtICovCi1zdGF0aWMgY2hhciAqbGNfZmxvYXRfc3RyaW5nc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsY19mbG9hdF9zdHJpbmdzW10gPSB7CiAgICAgImluZiIsCiAgICAgIm5hbiIsCiAgICAgImUiLAogfTsKLXN0YXRpYyBjaGFyICp1Y19mbG9hdF9zdHJpbmdzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVjX2Zsb2F0X3N0cmluZ3NbXSA9IHsKICAgICAiSU5GIiwKICAgICAiTkFOIiwKICAgICAiRSIsCkBAIC05MjUsNyArOTI1LDggQEAKIGZvcm1hdF9mbG9hdF9zaG9ydChkb3VibGUgZCwgY2hhciBmb3JtYXRfY29kZSwKICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgaW50IHByZWNpc2lvbiwKICAgICAgICAgICAgICAgICAgICBpbnQgYWx3YXlzX2FkZF9zaWduLCBpbnQgYWRkX2RvdF8wX2lmX2ludGVnZXIsCi0gICAgICAgICAgICAgICAgICAgaW50IHVzZV9hbHRfZm9ybWF0dGluZywgY2hhciAqKmZsb2F0X3N0cmluZ3MsIGludCAqdHlwZSkKKyAgICAgICAgICAgICAgICAgICBpbnQgdXNlX2FsdF9mb3JtYXR0aW5nLCBjb25zdCBjaGFyICogY29uc3QgKmZsb2F0X3N0cmluZ3MsCisgICAgICAgICAgICAgICAgICAgaW50ICp0eXBlKQogewogICAgIGNoYXIgKmJ1ZiA9IE5VTEw7CiAgICAgY2hhciAqcCA9IE5VTEw7CkBAIC0xMTc2LDcgKzExNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdHlwZSkKIHsKLSAgICBjaGFyICoqZmxvYXRfc3RyaW5ncyA9IGxjX2Zsb2F0X3N0cmluZ3M7CisgICAgY29uc3QgY2hhciAqIGNvbnN0ICpmbG9hdF9zdHJpbmdzID0gbGNfZmxvYXRfc3RyaW5nczsKICAgICBpbnQgbW9kZTsKIAogICAgIC8qIFZhbGlkYXRlIGZvcm1hdF9jb2RlLCBhbmQgbWFwIHVwcGVyIGFuZCBsb3dlciBjYXNlLiBDb21wdXRlIHRoZQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5dGhvbnJ1bi5jIGIvUHl0aG9uL3B5dGhvbnJ1bi5jCmluZGV4IDdmYmYwNmUuLjFmYzg2YzAgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXRob25ydW4uYworKysgYi9QeXRob24vcHl0aG9ucnVuLmMKQEAgLTQzMSw3ICs0MzEsNyBAQAogcGFyc2Vfc3ludGF4X2Vycm9yKFB5T2JqZWN0ICplcnIsIFB5T2JqZWN0ICoqbWVzc2FnZSwgUHlPYmplY3QgKipmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBpbnQgKmxpbmVubywgaW50ICpvZmZzZXQsIFB5T2JqZWN0ICoqdGV4dCkKIHsKLSAgICBsb25nIGhvbGQ7CisgICAgaW50IGhvbGQ7CiAgICAgUHlPYmplY3QgKnY7CiAgICAgX1B5X0lERU5USUZJRVIobXNnKTsKICAgICBfUHlfSURFTlRJRklFUihmaWxlbmFtZSk7CkBAIC00NjQsMTEgKzQ2NCwxMSBAQAogICAgIHYgPSBfUHlPYmplY3RfR2V0QXR0cklkKGVyciwgJlB5SWRfbGluZW5vKTsKICAgICBpZiAoIXYpCiAgICAgICAgIGdvdG8gZmluYWxseTsKLSAgICBob2xkID0gUHlMb25nX0FzTG9uZyh2KTsKKyAgICBob2xkID0gX1B5TG9uZ19Bc0ludCh2KTsKICAgICBQeV9ERUNSRUYodik7CiAgICAgaWYgKGhvbGQgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIGdvdG8gZmluYWxseTsKLSAgICAqbGluZW5vID0gKGludClob2xkOworICAgICpsaW5lbm8gPSBob2xkOwogCiAgICAgdiA9IF9QeU9iamVjdF9HZXRBdHRySWQoZXJyLCAmUHlJZF9vZmZzZXQpOwogICAgIGlmICghdikKQEAgLTQ3NywxMSArNDc3LDExIEBACiAgICAgICAgICpvZmZzZXQgPSAtMTsKICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGhvbGQgPSBQeUxvbmdfQXNMb25nKHYpOworICAgICAgICBob2xkID0gX1B5TG9uZ19Bc0ludCh2KTsKICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICBpZiAoaG9sZCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKLSAgICAgICAgKm9mZnNldCA9IChpbnQpaG9sZDsKKyAgICAgICAgKm9mZnNldCA9IGhvbGQ7CiAgICAgfQogCiAgICAgdiA9IF9QeU9iamVjdF9HZXRBdHRySWQoZXJyLCAmUHlJZF90ZXh0KTsKQEAgLTYzMCw4ICs2MzAsMTMgQEAKICAgICB9CiAgICAgaG9vayA9IF9QeVN5c19HZXRPYmplY3RJZCgmUHlJZF9leGNlcHRob29rKTsKICAgICBpZiAoaG9vaykgewotICAgICAgICBQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfUGFjaygzLCBleGNlcHRpb24sIHYsIHRiKTsKLSAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGhvb2ssIGFyZ3MpOworICAgICAgICBQeU9iamVjdCogc3RhY2tbM107CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICAgICAgc3RhY2tbMF0gPSBleGNlcHRpb247CisgICAgICAgIHN0YWNrWzFdID0gdjsKKyAgICAgICAgc3RhY2tbMl0gPSB0YjsKKyAgICAgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0Zhc3RDYWxsKGhvb2ssIHN0YWNrLCAzKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqZXhjZXB0aW9uMiwgKnYyLCAqdGIyOwogICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3lzdGVtRXhpdCkpIHsKQEAgLTY2MCw3ICs2NjUsNiBAQAogICAgICAgICAgICAgUHlfWERFQ1JFRih0YjIpOwogICAgICAgICB9CiAgICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKLSAgICAgICAgUHlfWERFQ1JFRihhcmdzKTsKICAgICB9IGVsc2UgewogICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigic3lzLmV4Y2VwdGhvb2sgaXMgbWlzc2luZ1xuIik7CiAgICAgICAgIFB5RXJyX0Rpc3BsYXkoZXhjZXB0aW9uLCB2LCB0Yik7CkBAIC03OTEsMTEgKzc5NSwxMSBAQAogICAgICAgICBQeUVycl9DbGVhcigpOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqY2F1c2VfbWVzc2FnZSA9CitzdGF0aWMgY29uc3QgY2hhciBjYXVzZV9tZXNzYWdlW10gPQogICAgICJcblRoZSBhYm92ZSBleGNlcHRpb24gd2FzIHRoZSBkaXJlY3QgY2F1c2UgIgogICAgICJvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjpcblxuIjsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnRleHRfbWVzc2FnZSA9CitzdGF0aWMgY29uc3QgY2hhciBjb250ZXh0X21lc3NhZ2VbXSA9CiAgICAgIlxuRHVyaW5nIGhhbmRsaW5nIG9mIHRoZSBhYm92ZSBleGNlcHRpb24sICIKICAgICAiYW5vdGhlciBleGNlcHRpb24gb2NjdXJyZWQ6XG5cbiI7CiAKQEAgLTk0Niw3ICs5NTAsNyBAQAogCiAgICAgZiA9IF9QeVN5c19HZXRPYmplY3RJZCgmUHlJZF9zdGRlcnIpOwogICAgIGlmIChmICE9IE5VTEwpIHsKLSAgICAgICAgciA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZiwgJlB5SWRfZmx1c2gsICIiKTsKKyAgICAgICAgciA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZiwgJlB5SWRfZmx1c2gsIE5VTEwpOwogICAgICAgICBpZiAocikKICAgICAgICAgICAgIFB5X0RFQ1JFRihyKTsKICAgICAgICAgZWxzZQpAQCAtOTU0LDcgKzk1OCw3IEBACiAgICAgfQogICAgIGYgPSBfUHlTeXNfR2V0T2JqZWN0SWQoJlB5SWRfc3Rkb3V0KTsKICAgICBpZiAoZiAhPSBOVUxMKSB7Ci0gICAgICAgIHIgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGYsICZQeUlkX2ZsdXNoLCAiIik7CisgICAgICAgIHIgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGYsICZQeUlkX2ZsdXNoLCBOVUxMKTsKICAgICAgICAgaWYgKHIpCiAgICAgICAgICAgICBQeV9ERUNSRUYocik7CiAgICAgICAgIGVsc2UKQEAgLTExNDQsOCArMTE0OCw4IEBACiAKIG1vZF90eQogUHlQYXJzZXJfQVNURnJvbUZpbGVPYmplY3QoRklMRSAqZnAsIFB5T2JqZWN0ICpmaWxlbmFtZSwgY29uc3QgY2hhciogZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBjaGFyICpwczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwczIsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsIGludCAqZXJyY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgY29uc3QgY2hhciAqcHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHMyLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBpbnQgKmVycmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSkKIHsKICAgICBtb2RfdHkgbW9kOwpAQCAtMTE3Nyw4ICsxMTgxLDggQEAKIAogbW9kX3R5CiBQeVBhcnNlcl9BU1RGcm9tRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWVfc3RyLCBjb25zdCBjaGFyKiBlbmMsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGNoYXIgKnBzMSwKLSAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBzMiwgUHlDb21waWxlckZsYWdzICpmbGFncywgaW50ICplcnJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBjb25zdCBjaGFyICpwczEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwczIsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsIGludCAqZXJyY29kZSwKICAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKQogewogICAgIG1vZF90eSBtb2Q7CmRpZmYgLS1naXQgYS9QeXRob24vcHl0aW1lLmMgYi9QeXRob24vcHl0aW1lLmMKaW5kZXggN2Y2NTgyNC4uMDJlZjhlZSAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5dGltZS5jCisrKyBiL1B5dGhvbi9weXRpbWUuYwpAQCAtNyw2ICs3LDExIEBACiAjaW5jbHVkZSA8bWFjaC9tYWNoX3RpbWUuaD4gICAvKiBtYWNoX2Fic29sdXRlX3RpbWUoKSwgbWFjaF90aW1lYmFzZV9pbmZvKCkgKi8KICNlbmRpZgogCisjZGVmaW5lIF9QeVRpbWVfY2hlY2tfbXVsX292ZXJmbG93KGEsIGIpIFwKKyAgICAoYXNzZXJ0KGIgPiAwKSwgXAorICAgICAoX1B5VGltZV90KShhKSA8IF9QeVRpbWVfTUlOIC8gKF9QeVRpbWVfdCkoYikgXAorICAgICB8fCBfUHlUaW1lX01BWCAvIChfUHlUaW1lX3QpKGIpIDwgKF9QeVRpbWVfdCkoYSkpCisKIC8qIFRvIG1pbGxpc2Vjb25kICgxMF4tMykgKi8KICNkZWZpbmUgU0VDX1RPX01TIDEwMDAKIApAQCAtMzMsMTIgKzM4LDEyIEBACiB0aW1lX3QKIF9QeUxvbmdfQXNUaW1lX3QoUHlPYmplY3QgKm9iaikKIHsKLSNpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKSAmJiBTSVpFT0ZfVElNRV9UID09IFNJWkVPRl9MT05HX0xPTkcKLSAgICBQWV9MT05HX0xPTkcgdmFsOworI2lmIFNJWkVPRl9USU1FX1QgPT0gU0laRU9GX0xPTkdfTE9ORworICAgIGxvbmcgbG9uZyB2YWw7CiAgICAgdmFsID0gUHlMb25nX0FzTG9uZ0xvbmcob2JqKTsKICNlbHNlCiAgICAgbG9uZyB2YWw7Ci0gICAgYXNzZXJ0KHNpemVvZih0aW1lX3QpIDw9IHNpemVvZihsb25nKSk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZih0aW1lX3QpIDw9IHNpemVvZihsb25nKSk7CiAgICAgdmFsID0gUHlMb25nX0FzTG9uZyhvYmopOwogI2VuZGlmCiAgICAgaWYgKHZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CkBAIC01Miw1OCArNTcsOTEgQEAKIFB5T2JqZWN0ICoKIF9QeUxvbmdfRnJvbVRpbWVfdCh0aW1lX3QgdCkKIHsKLSNpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKSAmJiBTSVpFT0ZfVElNRV9UID09IFNJWkVPRl9MT05HX0xPTkcKLSAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXQpOworI2lmIFNJWkVPRl9USU1FX1QgPT0gU0laRU9GX0xPTkdfTE9ORworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpdCk7CiAjZWxzZQotICAgIGFzc2VydChzaXplb2YodGltZV90KSA8PSBzaXplb2YobG9uZykpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YodGltZV90KSA8PSBzaXplb2YobG9uZykpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpdCk7CiAjZW5kaWYKIH0KIAorLyogUm91bmQgdG8gbmVhcmVzdCB3aXRoIHRpZXMgZ29pbmcgdG8gbmVhcmVzdCBldmVuIGludGVnZXIKKyAgIChfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTikgKi8KK3N0YXRpYyBkb3VibGUKK19QeVRpbWVfUm91bmRIYWxmRXZlbihkb3VibGUgeCkKK3sKKyAgICBkb3VibGUgcm91bmRlZCA9IHJvdW5kKHgpOworICAgIGlmIChmYWJzKHgtcm91bmRlZCkgPT0gMC41KQorICAgICAgICAvKiBoYWxmd2F5IGNhc2U6IHJvdW5kIHRvIGV2ZW4gKi8KKyAgICAgICAgcm91bmRlZCA9IDIuMCpyb3VuZCh4LzIuMCk7CisgICAgcmV0dXJuIHJvdW5kZWQ7Cit9CisKK3N0YXRpYyBkb3VibGUKK19QeVRpbWVfUm91bmQoZG91YmxlIHgsIF9QeVRpbWVfcm91bmRfdCByb3VuZCkKK3sKKyAgICAvKiB2b2xhdGlsZSBhdm9pZHMgb3B0aW1pemF0aW9uIGNoYW5naW5nIGhvdyBudW1iZXJzIGFyZSByb3VuZGVkICovCisgICAgdm9sYXRpbGUgZG91YmxlIGQ7CisKKyAgICBkID0geDsKKyAgICBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9IQUxGX0VWRU4pCisgICAgICAgIGQgPSBfUHlUaW1lX1JvdW5kSGFsZkV2ZW4oZCk7CisgICAgZWxzZSBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9DRUlMSU5HKQorICAgICAgICBkID0gY2VpbChkKTsKKyAgICBlbHNlCisgICAgICAgIGQgPSBmbG9vcihkKTsKKyAgICByZXR1cm4gZDsKK30KKworc3RhdGljIGludAorX1B5VGltZV9Eb3VibGVUb0Rlbm9taW5hdG9yKGRvdWJsZSBkLCB0aW1lX3QgKnNlYywgbG9uZyAqbnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZW5vbWluYXRvciwgX1B5VGltZV9yb3VuZF90IHJvdW5kKQoreworICAgIGRvdWJsZSBpbnRwYXJ0LCBlcnI7CisgICAgLyogdm9sYXRpbGUgYXZvaWRzIG9wdGltaXphdGlvbiBjaGFuZ2luZyBob3cgbnVtYmVycyBhcmUgcm91bmRlZCAqLworICAgIHZvbGF0aWxlIGRvdWJsZSBmbG9hdHBhcnQ7CisKKyAgICBmbG9hdHBhcnQgPSBtb2RmKGQsICZpbnRwYXJ0KTsKKworICAgIGZsb2F0cGFydCAqPSBkZW5vbWluYXRvcjsKKyAgICBmbG9hdHBhcnQgPSBfUHlUaW1lX1JvdW5kKGZsb2F0cGFydCwgcm91bmQpOworICAgIGlmIChmbG9hdHBhcnQgPj0gZGVub21pbmF0b3IpIHsKKyAgICAgICAgZmxvYXRwYXJ0IC09IGRlbm9taW5hdG9yOworICAgICAgICBpbnRwYXJ0ICs9IDEuMDsKKyAgICB9CisgICAgZWxzZSBpZiAoZmxvYXRwYXJ0IDwgMCkgeworICAgICAgICBmbG9hdHBhcnQgKz0gZGVub21pbmF0b3I7CisgICAgICAgIGludHBhcnQgLT0gMS4wOworICAgIH0KKyAgICBhc3NlcnQoMC4wIDw9IGZsb2F0cGFydCAmJiBmbG9hdHBhcnQgPCBkZW5vbWluYXRvcik7CisKKyAgICAqc2VjID0gKHRpbWVfdClpbnRwYXJ0OworICAgICpudW1lcmF0b3IgPSAobG9uZylmbG9hdHBhcnQ7CisKKyAgICBlcnIgPSBpbnRwYXJ0IC0gKGRvdWJsZSkqc2VjOworICAgIGlmIChlcnIgPD0gLTEuMCB8fCBlcnIgPj0gMS4wKSB7CisgICAgICAgIGVycm9yX3RpbWVfdF9vdmVyZmxvdygpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50CiBfUHlUaW1lX09iamVjdFRvRGVub21pbmF0b3IoUHlPYmplY3QgKm9iaiwgdGltZV90ICpzZWMsIGxvbmcgKm51bWVyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVub21pbmF0b3IsIF9QeVRpbWVfcm91bmRfdCByb3VuZCkKIHsKLSAgICBhc3NlcnQoZGVub21pbmF0b3IgPD0gTE9OR19NQVgpOworICAgIGFzc2VydChkZW5vbWluYXRvciA8PSAoZG91YmxlKUxPTkdfTUFYKTsKKwogICAgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKLSAgICAgICAgZG91YmxlIGQsIGludHBhcnQsIGVycjsKLSAgICAgICAgLyogdm9sYXRpbGUgYXZvaWRzIHVuc2FmZSBvcHRpbWl6YXRpb24gb24gZmxvYXQgZW5hYmxlZCBieSBnY2MgLU8zICovCi0gICAgICAgIHZvbGF0aWxlIGRvdWJsZSBmbG9hdHBhcnQ7Ci0KLSAgICAgICAgZCA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKLSAgICAgICAgZmxvYXRwYXJ0ID0gbW9kZihkLCAmaW50cGFydCk7Ci0gICAgICAgIGlmIChmbG9hdHBhcnQgPCAwKSB7Ci0gICAgICAgICAgICBmbG9hdHBhcnQgPSAxLjAgKyBmbG9hdHBhcnQ7Ci0gICAgICAgICAgICBpbnRwYXJ0IC09IDEuMDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0cGFydCAqPSBkZW5vbWluYXRvcjsKLSAgICAgICAgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfQ0VJTElORykgewotICAgICAgICAgICAgZmxvYXRwYXJ0ID0gY2VpbChmbG9hdHBhcnQpOwotICAgICAgICAgICAgaWYgKGZsb2F0cGFydCA+PSBkZW5vbWluYXRvcikgewotICAgICAgICAgICAgICAgIGZsb2F0cGFydCA9IDAuMDsKLSAgICAgICAgICAgICAgICBpbnRwYXJ0ICs9IDEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZsb2F0cGFydCA9IGZsb29yKGZsb2F0cGFydCk7Ci0gICAgICAgIH0KLQotICAgICAgICAqc2VjID0gKHRpbWVfdClpbnRwYXJ0OwotICAgICAgICBlcnIgPSBpbnRwYXJ0IC0gKGRvdWJsZSkqc2VjOwotICAgICAgICBpZiAoZXJyIDw9IC0xLjAgfHwgZXJyID49IDEuMCkgewotICAgICAgICAgICAgZXJyb3JfdGltZV90X292ZXJmbG93KCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICAqbnVtZXJhdG9yID0gKGxvbmcpZmxvYXRwYXJ0OwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZG91YmxlIGQgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7CisgICAgICAgIHJldHVybiBfUHlUaW1lX0RvdWJsZVRvRGVub21pbmF0b3IoZCwgc2VjLCBudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVub21pbmF0b3IsIHJvdW5kKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgICpzZWMgPSBfUHlMb25nX0FzVGltZV90KG9iaik7CisgICAgICAgICpudW1lcmF0b3IgPSAwOwogICAgICAgICBpZiAoKnNlYyA9PSAodGltZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICpudW1lcmF0b3IgPSAwOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiB9CkBAIC0xMTIsMTMgKzE1MCwxMiBAQAogX1B5VGltZV9PYmplY3RUb1RpbWVfdChQeU9iamVjdCAqb2JqLCB0aW1lX3QgKnNlYywgX1B5VGltZV9yb3VuZF90IHJvdW5kKQogewogICAgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKLSAgICAgICAgZG91YmxlIGQsIGludHBhcnQsIGVycjsKKyAgICAgICAgZG91YmxlIGludHBhcnQsIGVycjsKKyAgICAgICAgLyogdm9sYXRpbGUgYXZvaWRzIG9wdGltaXphdGlvbiBjaGFuZ2luZyBob3cgbnVtYmVycyBhcmUgcm91bmRlZCAqLworICAgICAgICB2b2xhdGlsZSBkb3VibGUgZDsKIAogICAgICAgICBkID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOwotICAgICAgICBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9DRUlMSU5HKQotICAgICAgICAgICAgZCA9IGNlaWwoZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGQgPSBmbG9vcihkKTsKKyAgICAgICAgZCA9IF9QeVRpbWVfUm91bmQoZCwgcm91bmQpOwogICAgICAgICAodm9pZCltb2RmKGQsICZpbnRwYXJ0KTsKIAogICAgICAgICAqc2VjID0gKHRpbWVfdClpbnRwYXJ0OwpAQCAtMTQxLDE0ICsxNzgsMjAgQEAKIF9QeVRpbWVfT2JqZWN0VG9UaW1lc3BlYyhQeU9iamVjdCAqb2JqLCB0aW1lX3QgKnNlYywgbG9uZyAqbnNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlUaW1lX3JvdW5kX3Qgcm91bmQpCiB7Ci0gICAgcmV0dXJuIF9QeVRpbWVfT2JqZWN0VG9EZW5vbWluYXRvcihvYmosIHNlYywgbnNlYywgMWU5LCByb3VuZCk7CisgICAgaW50IHJlczsKKyAgICByZXMgPSBfUHlUaW1lX09iamVjdFRvRGVub21pbmF0b3Iob2JqLCBzZWMsIG5zZWMsIDFlOSwgcm91bmQpOworICAgIGFzc2VydCgwIDw9ICpuc2VjICYmICpuc2VjIDwgU0VDX1RPX05TKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBpbnQKIF9QeVRpbWVfT2JqZWN0VG9UaW1ldmFsKFB5T2JqZWN0ICpvYmosIHRpbWVfdCAqc2VjLCBsb25nICp1c2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgX1B5VGltZV9yb3VuZF90IHJvdW5kKQogewotICAgIHJldHVybiBfUHlUaW1lX09iamVjdFRvRGVub21pbmF0b3Iob2JqLCBzZWMsIHVzZWMsIDFlNiwgcm91bmQpOworICAgIGludCByZXM7CisgICAgcmVzID0gX1B5VGltZV9PYmplY3RUb0Rlbm9taW5hdG9yKG9iaiwgc2VjLCB1c2VjLCAxZTYsIHJvdW5kKTsKKyAgICBhc3NlcnQoMCA8PSAqdXNlYyAmJiAqdXNlYyA8IFNFQ19UT19VUyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2MiwyMSArMjA1LDI0IEBACiBfUHlUaW1lX0Zyb21TZWNvbmRzKGludCBzZWNvbmRzKQogewogICAgIF9QeVRpbWVfdCB0OworICAgIHQgPSAoX1B5VGltZV90KXNlY29uZHM7CiAgICAgLyogZW5zdXJlIHRoYXQgaW50ZWdlciBvdmVyZmxvdyBjYW5ub3QgaGFwcGVuLCBpbnQgdHlwZSBzaG91bGQgaGF2ZSAzMgogICAgICAgIGJpdHMsIHdoZXJlYXMgX1B5VGltZV90IHR5cGUgaGFzIGF0IGxlYXN0IDY0IGJpdHMgKFNFQ19UT19NUyB0YWtlcyAzMAogICAgICAgIGJpdHMpLiAqLwotICAgIGFzc2VydCgoc2Vjb25kcyA+PSAwICYmIHNlY29uZHMgPD0gX1B5VGltZV9NQVggLyBTRUNfVE9fTlMpCi0gICAgICAgICAgIHx8IChzZWNvbmRzIDwgMCAmJiBzZWNvbmRzID49IF9QeVRpbWVfTUlOIC8gU0VDX1RPX05TKSk7Ci0gICAgdCA9IChfUHlUaW1lX3Qpc2Vjb25kcyAqIFNFQ19UT19OUzsKKyAgICBQeV9CVUlMRF9BU1NFUlQoSU5UX01BWCA8PSBfUHlUaW1lX01BWCAvIFNFQ19UT19OUyk7CisgICAgUHlfQlVJTERfQVNTRVJUKElOVF9NSU4gPj0gX1B5VGltZV9NSU4gLyBTRUNfVE9fTlMpOworICAgIGFzc2VydCgodCA+PSAwICYmIHQgPD0gX1B5VGltZV9NQVggLyBTRUNfVE9fTlMpCisgICAgICAgICAgIHx8ICh0IDwgMCAmJiB0ID49IF9QeVRpbWVfTUlOIC8gU0VDX1RPX05TKSk7CisgICAgdCAqPSBTRUNfVE9fTlM7CiAgICAgcmV0dXJuIHQ7CiB9CiAKIF9QeVRpbWVfdAotX1B5VGltZV9Gcm9tTmFub3NlY29uZHMoUFlfTE9OR19MT05HIG5zKQorX1B5VGltZV9Gcm9tTmFub3NlY29uZHMobG9uZyBsb25nIG5zKQogewogICAgIF9QeVRpbWVfdCB0OwotICAgIGFzc2VydChzaXplb2YoUFlfTE9OR19MT05HKSA8PSBzaXplb2YoX1B5VGltZV90KSk7Ci0gICAgdCA9IFB5X1NBRkVfRE9XTkNBU1QobnMsIFBZX0xPTkdfTE9ORywgX1B5VGltZV90KTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKGxvbmcgbG9uZykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOworICAgIHQgPSBQeV9TQUZFX0RPV05DQVNUKG5zLCBsb25nIGxvbmcsIF9QeVRpbWVfdCk7CiAgICAgcmV0dXJuIHQ7CiB9CiAKQEAgLTE4NywxMiArMjMzLDE1IEBACiAgICAgX1B5VGltZV90IHQ7CiAgICAgaW50IHJlcyA9IDA7CiAKLSAgICB0ID0gKF9QeVRpbWVfdCl0cy0+dHZfc2VjICogU0VDX1RPX05TOwotICAgIGlmICh0IC8gU0VDX1RPX05TICE9IHRzLT50dl9zZWMpIHsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHRzLT50dl9zZWMpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKKyAgICB0ID0gKF9QeVRpbWVfdCl0cy0+dHZfc2VjOworCisgICAgaWYgKF9QeVRpbWVfY2hlY2tfbXVsX292ZXJmbG93KHQsIFNFQ19UT19OUykpIHsKICAgICAgICAgaWYgKHJhaXNlKQogICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwogICAgICAgICByZXMgPSAtMTsKICAgICB9CisgICAgdCA9IHQgKiBTRUNfVE9fTlM7CiAKICAgICB0ICs9IHRzLT50dl9uc2VjOwogCkBAIC0yMDYsMTIgKzI1NSwxNSBAQAogICAgIF9QeVRpbWVfdCB0OwogICAgIGludCByZXMgPSAwOwogCi0gICAgdCA9IChfUHlUaW1lX3QpdHYtPnR2X3NlYyAqIFNFQ19UT19OUzsKLSAgICBpZiAodCAvIFNFQ19UT19OUyAhPSB0di0+dHZfc2VjKSB7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZih0di0+dHZfc2VjKSA8PSBzaXplb2YoX1B5VGltZV90KSk7CisgICAgdCA9IChfUHlUaW1lX3QpdHYtPnR2X3NlYzsKKworICAgIGlmIChfUHlUaW1lX2NoZWNrX211bF9vdmVyZmxvdyh0LCBTRUNfVE9fTlMpKSB7CiAgICAgICAgIGlmIChyYWlzZSkKICAgICAgICAgICAgIF9QeVRpbWVfb3ZlcmZsb3coKTsKICAgICAgICAgcmVzID0gLTE7CiAgICAgfQorICAgIHQgPSB0ICogU0VDX1RPX05TOwogCiAgICAgdCArPSAoX1B5VGltZV90KXR2LT50dl91c2VjICogVVNfVE9fTlM7CiAKQEAgLTIyMSw1MCArMjczLDUyIEBACiAjZW5kaWYKIAogc3RhdGljIGludAorX1B5VGltZV9Gcm9tRmxvYXRPYmplY3QoX1B5VGltZV90ICp0LCBkb3VibGUgdmFsdWUsIF9QeVRpbWVfcm91bmRfdCByb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdW5pdF90b19ucykKK3sKKyAgICBkb3VibGUgZXJyOworICAgIC8qIHZvbGF0aWxlIGF2b2lkcyBvcHRpbWl6YXRpb24gY2hhbmdpbmcgaG93IG51bWJlcnMgYXJlIHJvdW5kZWQgKi8KKyAgICB2b2xhdGlsZSBkb3VibGUgZDsKKworICAgIC8qIGNvbnZlcnQgdG8gYSBudW1iZXIgb2YgbmFub3NlY29uZHMgKi8KKyAgICBkID0gdmFsdWU7CisgICAgZCAqPSAoZG91YmxlKXVuaXRfdG9fbnM7CisgICAgZCA9IF9QeVRpbWVfUm91bmQoZCwgcm91bmQpOworCisgICAgKnQgPSAoX1B5VGltZV90KWQ7CisgICAgZXJyID0gZCAtIChkb3VibGUpKnQ7CisgICAgaWYgKGZhYnMoZXJyKSA+PSAxLjApIHsKKyAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CiBfUHlUaW1lX0Zyb21PYmplY3QoX1B5VGltZV90ICp0LCBQeU9iamVjdCAqb2JqLCBfUHlUaW1lX3JvdW5kX3Qgcm91bmQsCi0gICAgICAgICAgICAgICAgICAgbG9uZyB0b19uYW5vc2Vjb25kcykKKyAgICAgICAgICAgICAgICAgICBsb25nIHVuaXRfdG9fbnMpCiB7CiAgICAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgewotICAgICAgICAvKiB2b2xhdGlsZSBhdm9pZHMgdW5zYWZlIG9wdGltaXphdGlvbiBvbiBmbG9hdCBlbmFibGVkIGJ5IGdjYyAtTzMgKi8KLSAgICAgICAgdm9sYXRpbGUgZG91YmxlIGQsIGVycjsKLQotICAgICAgICAvKiBjb252ZXJ0IHRvIGEgbnVtYmVyIG9mIG5hbm9zZWNvbmRzICovCisgICAgICAgIGRvdWJsZSBkOwogICAgICAgICBkID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOwotICAgICAgICBkICo9IHRvX25hbm9zZWNvbmRzOwotCi0gICAgICAgIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpCi0gICAgICAgICAgICBkID0gY2VpbChkKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZCA9IGZsb29yKGQpOwotCi0gICAgICAgICp0ID0gKF9QeVRpbWVfdClkOwotICAgICAgICBlcnIgPSBkIC0gKGRvdWJsZSkqdDsKLSAgICAgICAgaWYgKGZhYnMoZXJyKSA+PSAxLjApIHsKLSAgICAgICAgICAgIF9QeVRpbWVfb3ZlcmZsb3coKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIF9QeVRpbWVfRnJvbUZsb2F0T2JqZWN0KHQsIGQsIHJvdW5kLCB1bml0X3RvX25zKTsKICAgICB9CiAgICAgZWxzZSB7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICAgICAgUFlfTE9OR19MT05HIHNlYzsKKyAgICAgICAgbG9uZyBsb25nIHNlYzsKKyAgICAgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZihsb25nIGxvbmcpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKKwogICAgICAgICBzZWMgPSBQeUxvbmdfQXNMb25nTG9uZyhvYmopOwotICAgICAgICBhc3NlcnQoc2l6ZW9mKFBZX0xPTkdfTE9ORykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOwotI2Vsc2UKLSAgICAgICAgbG9uZyBzZWM7Ci0gICAgICAgIHNlYyA9IFB5TG9uZ19Bc0xvbmcob2JqKTsKLSAgICAgICAgYXNzZXJ0KHNpemVvZihQWV9MT05HX0xPTkcpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKLSNlbmRpZgogICAgICAgICBpZiAoc2VjID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQogICAgICAgICAgICAgICAgIF9QeVRpbWVfb3ZlcmZsb3coKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICAqdCA9IHNlYyAqIHRvX25hbm9zZWNvbmRzOwotICAgICAgICBpZiAoKnQgLyB0b19uYW5vc2Vjb25kcyAhPSBzZWMpIHsKKworICAgICAgICBpZiAoX1B5VGltZV9jaGVja19tdWxfb3ZlcmZsb3coc2VjLCB1bml0X3RvX25zKSkgewogICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CisgICAgICAgICp0ID0gc2VjICogdW5pdF90b19uczsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQpAQCAtMjg0LDI0ICszMzgsMjggQEAKIGRvdWJsZQogX1B5VGltZV9Bc1NlY29uZHNEb3VibGUoX1B5VGltZV90IHQpCiB7Ci0gICAgX1B5VGltZV90IHNlYywgbnM7Ci0gICAgLyogRGl2aWRlIHVzaW5nIGludGVnZXJzIHRvIGF2b2lkIHJvdW5kaW5nIGlzc3VlcyBvbiB0aGUgaW50ZWdlciBwYXJ0LgotICAgICAgIDFlLTkgY2Fubm90IGJlIHN0b3JlZCBleGFjdGx5IGluIElFRUUgNjQtYml0LiAqLwotICAgIHNlYyA9IHQgLyBTRUNfVE9fTlM7Ci0gICAgbnMgPSB0ICUgU0VDX1RPX05TOwotICAgIHJldHVybiAoZG91YmxlKXNlYyArIChkb3VibGUpbnMgKiAxZS05OworICAgIC8qIHZvbGF0aWxlIGF2b2lkcyBvcHRpbWl6YXRpb24gY2hhbmdpbmcgaG93IG51bWJlcnMgYXJlIHJvdW5kZWQgKi8KKyAgICB2b2xhdGlsZSBkb3VibGUgZDsKKworICAgIGlmICh0ICUgU0VDX1RPX05TID09IDApIHsKKyAgICAgICAgX1B5VGltZV90IHNlY3M7CisgICAgICAgIC8qIERpdmlkZSB1c2luZyBpbnRlZ2VycyB0byBhdm9pZCByb3VuZGluZyBpc3N1ZXMgb24gdGhlIGludGVnZXIgcGFydC4KKyAgICAgICAgICAgMWUtOSBjYW5ub3QgYmUgc3RvcmVkIGV4YWN0bHkgaW4gSUVFRSA2NC1iaXQuICovCisgICAgICAgIHNlY3MgPSB0IC8gU0VDX1RPX05TOworICAgICAgICBkID0gKGRvdWJsZSlzZWNzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZCA9IChkb3VibGUpdDsKKyAgICAgICAgZCAvPSAxZTk7CisgICAgfQorICAgIHJldHVybiBkOwogfQogCiBQeU9iamVjdCAqCiBfUHlUaW1lX0FzTmFub3NlY29uZHNPYmplY3QoX1B5VGltZV90IHQpCiB7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICBhc3NlcnQoc2l6ZW9mKFBZX0xPTkdfTE9ORykgPj0gc2l6ZW9mKF9QeVRpbWVfdCkpOwotICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpdCk7Ci0jZWxzZQotICAgIGFzc2VydChzaXplb2YobG9uZykgPj0gc2l6ZW9mKF9QeVRpbWVfdCkpOwotICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpdCk7Ci0jZW5kaWYKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKGxvbmcgbG9uZykgPj0gc2l6ZW9mKF9QeVRpbWVfdCkpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpdCk7CiB9CiAKIHN0YXRpYyBfUHlUaW1lX3QKQEAgLTMwOSw3ICszNjcsMjAgQEAKICAgICAgICAgICAgICAgIGNvbnN0IF9QeVRpbWVfcm91bmRfdCByb3VuZCkKIHsKICAgICBhc3NlcnQoayA+IDEpOwotICAgIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpIHsKKyAgICBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9IQUxGX0VWRU4pIHsKKyAgICAgICAgX1B5VGltZV90IHgsIHIsIGFic19yOworICAgICAgICB4ID0gdCAvIGs7CisgICAgICAgIHIgPSB0ICUgazsKKyAgICAgICAgYWJzX3IgPSBQeV9BQlMocik7CisgICAgICAgIGlmIChhYnNfciA+IGsgLyAyIHx8IChhYnNfciA9PSBrIC8gMiAmJiAoUHlfQUJTKHgpICYgMSkpKSB7CisgICAgICAgICAgICBpZiAodCA+PSAwKQorICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB4LS07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIGVsc2UgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfQ0VJTElORykgewogICAgICAgICBpZiAodCA+PSAwKQogICAgICAgICAgICAgcmV0dXJuICh0ICsgayAtIDEpIC8gazsKICAgICAgICAgZWxzZQpAQCAtMzczLDcgKzQ0NCw3IEBACiBfUHlUaW1lX0FzVGltZXZhbFN0cnVjdF9pbXBsKF9QeVRpbWVfdCB0LCBzdHJ1Y3QgdGltZXZhbCAqdHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVRpbWVfcm91bmRfdCByb3VuZCwgaW50IHJhaXNlKQogewotICAgIF9QeVRpbWVfdCBzZWNzOworICAgIF9QeVRpbWVfdCBzZWNzLCBzZWNzMjsKICAgICBpbnQgdXM7CiAgICAgaW50IHJlczsKIApAQCAtMzg2LDcgKzQ1Nyw4IEBACiAjZW5kaWYKICAgICB0di0+dHZfdXNlYyA9IHVzOwogCi0gICAgaWYgKHJlcyA8IDAgfHwgKF9QeVRpbWVfdCl0di0+dHZfc2VjICE9IHNlY3MpIHsKKyAgICBzZWNzMiA9IChfUHlUaW1lX3QpdHYtPnR2X3NlYzsKKyAgICBpZiAocmVzIDwgMCB8fCBzZWNzMiAhPSBzZWNzKSB7CiAgICAgICAgIGlmIChyYWlzZSkKICAgICAgICAgICAgIGVycm9yX3RpbWVfdF9vdmVyZmxvdygpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC00MjQsNiArNDk2LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAorCiAjaWYgZGVmaW5lZChIQVZFX0NMT0NLX0dFVFRJTUUpIHx8IGRlZmluZWQoSEFWRV9LUVVFVUUpCiBpbnQKIF9QeVRpbWVfQXNUaW1lc3BlYyhfUHlUaW1lX3QgdCwgc3RydWN0IHRpbWVzcGVjICp0cykKQEAgLTQzNywxMyArNTEwLDEzIEBACiAgICAgICAgIHNlY3MgLT0gMTsKICAgICB9CiAgICAgdHMtPnR2X3NlYyA9ICh0aW1lX3Qpc2VjczsKLSAgICBpZiAoKF9QeVRpbWVfdCl0cy0+dHZfc2VjICE9IHNlY3MpIHsKLSAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorICAgIGFzc2VydCgwIDw9IG5zZWMgJiYgbnNlYyA8IFNFQ19UT19OUyk7CiAgICAgdHMtPnR2X25zZWMgPSBuc2VjOwogCi0gICAgYXNzZXJ0KDAgPD0gdHMtPnR2X25zZWMgJiYgdHMtPnR2X25zZWMgPD0gOTk5OTk5OTk5KTsKKyAgICBpZiAoKF9QeVRpbWVfdCl0cy0+dHZfc2VjICE9IHNlY3MpIHsKKyAgICAgICAgZXJyb3JfdGltZV90X292ZXJmbG93KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYKQEAgLTU1NywxOSArNjMwLDIwIEBACiAgICAgcmV0dXJuIHB5Z2V0dGltZW9mZGF5KHQsIGluZm8sIDEpOwogfQogCi0KIHN0YXRpYyBpbnQKIHB5bW9ub3RvbmljKF9QeVRpbWVfdCAqdHAsIF9QeV9jbG9ja19pbmZvX3QgKmluZm8sIGludCByYWlzZSkKIHsKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCi0gICAgVUxPTkdMT05HIHJlc3VsdDsKKyAgICBVTE9OR0xPTkcgdGlja3M7CisgICAgX1B5VGltZV90IHQ7CiAKICAgICBhc3NlcnQoaW5mbyA9PSBOVUxMIHx8IHJhaXNlKTsKIAotICAgIHJlc3VsdCA9IEdldFRpY2tDb3VudDY0KCk7CisgICAgdGlja3MgPSBHZXRUaWNrQ291bnQ2NCgpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YodGlja3MpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKKyAgICB0ID0gKF9QeVRpbWVfdCl0aWNrczsKIAotICAgICp0cCA9IHJlc3VsdCAqIE1TX1RPX05TOwotICAgIGlmICgqdHAgLyBNU19UT19OUyAhPSByZXN1bHQpIHsKKyAgICBpZiAoX1B5VGltZV9jaGVja19tdWxfb3ZlcmZsb3codCwgTVNfVE9fTlMpKSB7CiAgICAgICAgIGlmIChyYWlzZSkgewogICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNTc3LDYgKzY1MSw3IEBACiAgICAgICAgIC8qIEhlbGxvLCB0aW1lIHRyYXZlbGVyISAqLwogICAgICAgICBhc3NlcnQoMCk7CiAgICAgfQorICAgICp0cCA9IHQgKiBNU19UT19OUzsKIAogICAgIGlmIChpbmZvKSB7CiAgICAgICAgIERXT1JEIHRpbWVBZGp1c3RtZW50LCB0aW1lSW5jcmVtZW50OwpAQCAtNjg5LDggKzc2NCw1IEBACiAgICAgaWYgKF9QeVRpbWVfR2V0TW9ub3RvbmljQ2xvY2tXaXRoSW5mbygmdCwgTlVMTCkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAvKiBjaGVjayB0aGF0IF9QeVRpbWVfRnJvbVNlY29uZHMoKSBjYW5ub3Qgb3ZlcmZsb3cgKi8KLSAgICBhc3NlcnQoSU5UX01BWCA8PSBfUHlUaW1lX01BWCAvIFNFQ19UT19OUyk7Ci0gICAgYXNzZXJ0KElOVF9NSU4gPj0gX1B5VGltZV9NSU4gLyBTRUNfVE9fTlMpOwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3JhbmRvbS5jIGIvUHl0aG9uL3JhbmRvbS5jCmluZGV4IDMxMTk4NzIuLmVhNTA2ZWUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9yYW5kb20uYworKysgYi9QeXRob24vcmFuZG9tLmMKQEAgLTEsNiArMSw5IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaWZkZWYgTVNfV0lORE9XUwogIyAgaW5jbHVkZSA8d2luZG93cy5oPgorLyogQWxsIHNhbXBsZSBNU0ROIHdpbmNyeXB0IHByb2dyYW1zIGluY2x1ZGUgdGhlIGhlYWRlciBiZWxvdy4gSXQgaXMgYXQgbGVhc3QKKyAqIHJlcXVpcmVkIHdpdGggTWluIEdXLiAqLworIyAgaW5jbHVkZSA8d2luY3J5cHQuaD4KICNlbHNlCiAjICBpbmNsdWRlIDxmY250bC5oPgogIyAgaWZkZWYgSEFWRV9TWVNfU1RBVF9ICkBAIC0zNiwxMCArMzksOSBAQAogICAgIHJldHVybiAwOwogCiBlcnJvcjoKLSAgICBpZiAocmFpc2UpCisgICAgaWYgKHJhaXNlKSB7CiAgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwotICAgIGVsc2UKLSAgICAgICAgUHlfRmF0YWxFcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgV2luZG93cyByYW5kb20gQVBJIChDcnlwdG9HZW4pIik7CisgICAgfQogICAgIHJldHVybiAtMTsKIH0KIApAQCAtNTIsOCArNTQsOSBAQAogCiAgICAgaWYgKGhDcnlwdFByb3YgPT0gMCkKICAgICB7Ci0gICAgICAgIGlmICh3aW4zMl91cmFuZG9tX2luaXQocmFpc2UpID09IC0xKQorICAgICAgICBpZiAod2luMzJfdXJhbmRvbV9pbml0KHJhaXNlKSA9PSAtMSkgewogICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgfQogCiAgICAgd2hpbGUgKHNpemUgPiAwKQpAQCAtNjIsMTEgKzY1LDkgQEAKICAgICAgICAgaWYgKCFDcnlwdEdlblJhbmRvbShoQ3J5cHRQcm92LCAoRFdPUkQpY2h1bmssIGJ1ZmZlcikpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIENyeXB0R2VuUmFuZG9tKCkgZmFpbGVkICovCi0gICAgICAgICAgICBpZiAocmFpc2UpCisgICAgICAgICAgICBpZiAocmFpc2UpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZWQgdGhlIHJhbmRvbWl6ZWQgaGFzaCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAic2VjcmV0IHVzaW5nIENyeXB0b0dlbikiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICBidWZmZXIgKz0gY2h1bms7CkBAIC04MywyOSArODQsMjggQEAKIC8qIEZpbGwgYnVmZmVyIHdpdGggc2l6ZSBwc2V1ZG8tcmFuZG9tIGJ5dGVzIGdlbmVyYXRlZCBieSBnZXRlbnRyb3B5KCkuCiAgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBvciByYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiAtMSBvbiBlcnJvci4KIAotICAgSWYgZmF0YWwgaXMgbm9uemVybywgY2FsbCBQeV9GYXRhbEVycm9yKCkgaW5zdGVhZCBvZiByYWlzaW5nIGFuIGV4Y2VwdGlvbgotICAgb24gZXJyb3IuICovCisgICBJZiByYWlzZSBpcyB6ZXJvLCBkb24ndCByYWlzZSBhbiBleGNlcHRpb24gb24gZXJyb3IuICovCiBzdGF0aWMgaW50Ci1weV9nZXRlbnRyb3B5KHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplLCBpbnQgZmF0YWwpCitweV9nZXRlbnRyb3B5KGNoYXIgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplLCBpbnQgcmFpc2UpCiB7CiAgICAgd2hpbGUgKHNpemUgPiAwKSB7CiAgICAgICAgIFB5X3NzaXplX3QgbGVuID0gUHlfTUlOKHNpemUsIDI1Nik7CiAgICAgICAgIGludCByZXM7CiAKLSAgICAgICAgaWYgKCFmYXRhbCkgeworICAgICAgICBpZiAocmFpc2UpIHsKICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgICAgIHJlcyA9IGdldGVudHJvcHkoYnVmZmVyLCBsZW4pOwogICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQotICAgICAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgcmVzID0gZ2V0ZW50cm9weShidWZmZXIsIGxlbik7Ci0gICAgICAgICAgICBpZiAocmVzIDwgMCkKLSAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJnZXRlbnRyb3B5KCkgZmFpbGVkIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgaWYgKHJhaXNlKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKICAgICAgICAgYnVmZmVyICs9IGxlbjsKQEAgLTExOSwyNCArMTE5LDMxIEBACiAjaWYgZGVmaW5lZChIQVZFX0dFVFJBTkRPTSkgfHwgZGVmaW5lZChIQVZFX0dFVFJBTkRPTV9TWVNDQUxMKQogI2RlZmluZSBQWV9HRVRSQU5ET00gMQogCisvKiBDYWxsIGdldHJhbmRvbSgpCisgICAtIFJldHVybiAxIG9uIHN1Y2Nlc3MKKyAgIC0gUmV0dXJuIDAgaWYgZ2V0cmFuZG9tKCkgc3lzY2FsbCBpcyBub3QgYXZhaWxhYmxlIChmYWlscyB3aXRoIEVOT1NZUykKKyAgICAgb3IgaWYgZ2V0cmFuZG9tKEdSTkRfTk9OQkxPQ0spIGZhaWxzIHdpdGggRUFHQUlOIChibG9ja2luZz0wIGFuZCBzeXN0ZW0KKyAgICAgdXJhbmRvbSBub3QgaW5pdGlhbGl6ZWQgeWV0KSBhbmQgcmFpc2U9MC4KKyAgIC0gUmFpc2UgYW4gZXhjZXB0aW9uIChpZiByYWlzZSBpcyBub24temVybykgYW5kIHJldHVybiAtMSBvbiBlcnJvcjoKKyAgICAgZ2V0cmFuZG9tKCkgZmFpbGVkIHdpdGggRUlOVFIgYW5kIHRoZSBQeXRob24gc2lnbmFsIGhhbmRsZXIgcmFpc2VkIGFuCisgICAgIGV4Y2VwdGlvbiwgb3IgZ2V0cmFuZG9tKCkgZmFpbGVkIHdpdGggYSBkaWZmZXJlbnQgZXJyb3IuICovCiBzdGF0aWMgaW50Ci1weV9nZXRyYW5kb20odm9pZCAqYnVmZmVyLCBQeV9zc2l6ZV90IHNpemUsIGludCByYWlzZSkKK3B5X2dldHJhbmRvbSh2b2lkICpidWZmZXIsIFB5X3NzaXplX3Qgc2l6ZSwgaW50IGJsb2NraW5nLCBpbnQgcmFpc2UpCiB7Ci0gICAgLyogSXMgZ2V0cmFuZG9tKCkgc3VwcG9ydGVkIGJ5IHRoZSBydW5uaW5nIGtlcm5lbD8KLSAgICAgKiBOZWVkIExpbnV4IGtlcm5lbCAzLjE3IG9yIG5ld2VyLCBvciBTb2xhcmlzIDExLjMgb3IgbmV3ZXIgKi8KKyAgICAvKiBJcyBnZXRyYW5kb20oKSBzdXBwb3J0ZWQgYnkgdGhlIHJ1bm5pbmcga2VybmVsPyBTZXQgdG8gMCBpZiBnZXRyYW5kb20oKQorICAgICAgIGZhaWxzIHdpdGggRU5PU1lTLiBOZWVkIExpbnV4IGtlcm5lbCAzLjE3IG9yIG5ld2VyLCBvciBTb2xhcmlzIDExLjMKKyAgICAgICBvciBuZXdlciAqLwogICAgIHN0YXRpYyBpbnQgZ2V0cmFuZG9tX3dvcmtzID0gMTsKLQotICAgIC8qIGdldHJhbmRvbSgpIG9uIExpbnV4IHdpbGwgYmxvY2sgaWYgY2FsbGVkIGJlZm9yZSB0aGUga2VybmVsIGhhcwotICAgICAqIGluaXRpYWxpemVkIHRoZSB1cmFuZG9tIGVudHJvcHkgcG9vbC4gVGhpcyB3aWxsIGNhdXNlIFB5dGhvbgotICAgICAqIHRvIGhhbmcgb24gc3RhcnR1cCBpZiBjYWxsZWQgdmVyeSBlYXJseSBpbiB0aGUgYm9vdCBwcm9jZXNzIC0KLSAgICAgKiBzZWUgaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNjgzOS4gVG8gYXZvaWQgdGhpcywgdXNlIHRoZQotICAgICAqIEdSTkRfTk9OQkxPQ0sgZmxhZy4gKi8KLSAgICBjb25zdCBpbnQgZmxhZ3MgPSBHUk5EX05PTkJMT0NLOworICAgIGludCBmbGFnczsKKyAgICBjaGFyICpkZXN0OwogICAgIGxvbmcgbjsKIAotICAgIGlmICghZ2V0cmFuZG9tX3dvcmtzKQorICAgIGlmICghZ2V0cmFuZG9tX3dvcmtzKSB7CiAgICAgICAgIHJldHVybiAwOworICAgIH0KIAorICAgIGZsYWdzID0gYmxvY2tpbmcgPyAwIDogR1JORF9OT05CTE9DSzsKKyAgICBkZXN0ID0gYnVmZmVyOwogICAgIHdoaWxlICgwIDwgc2l6ZSkgewogI2lmZGVmIHN1bgogICAgICAgICAvKiBJc3N1ZSAjMjY3MzU6IE9uIFNvbGFyaXMsIGdldHJhbmRvbSgpIGlzIGxpbWl0ZWQgdG8gcmV0dXJuaW5nIHVwCkBAIC0xNTAsMjMgKzE1NywyMyBAQAogI2lmZGVmIEhBVkVfR0VUUkFORE9NCiAgICAgICAgIGlmIChyYWlzZSkgewogICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICAgICAgbiA9IGdldHJhbmRvbShidWZmZXIsIG4sIGZsYWdzKTsKKyAgICAgICAgICAgIG4gPSBnZXRyYW5kb20oZGVzdCwgbiwgZmxhZ3MpOwogICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG4gPSBnZXRyYW5kb20oYnVmZmVyLCBuLCBmbGFncyk7CisgICAgICAgICAgICBuID0gZ2V0cmFuZG9tKGRlc3QsIG4sIGZsYWdzKTsKICAgICAgICAgfQogI2Vsc2UKICAgICAgICAgLyogT24gTGludXgsIHVzZSB0aGUgc3lzY2FsbCgpIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIEdOVSBsaWJjIGRvZXNuJ3QKLSAgICAgICAgICogZXhwb3NlIHRoZSBMaW51eCBnZXRyYW5kb20oKSBzeXNjYWxsIHlldC4gU2VlOgotICAgICAgICAgKiBodHRwczovL3NvdXJjZXdhcmUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xNzI1MiAqLworICAgICAgICAgICBleHBvc2UgdGhlIExpbnV4IGdldHJhbmRvbSgpIHN5c2NhbGwgeWV0LiBTZWU6CisgICAgICAgICAgIGh0dHBzOi8vc291cmNld2FyZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3MjUyICovCiAgICAgICAgIGlmIChyYWlzZSkgewogICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICAgICAgbiA9IHN5c2NhbGwoU1lTX2dldHJhbmRvbSwgYnVmZmVyLCBuLCBmbGFncyk7CisgICAgICAgICAgICBuID0gc3lzY2FsbChTWVNfZ2V0cmFuZG9tLCBkZXN0LCBuLCBmbGFncyk7CiAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgbiA9IHN5c2NhbGwoU1lTX2dldHJhbmRvbSwgYnVmZmVyLCBuLCBmbGFncyk7CisgICAgICAgICAgICBuID0gc3lzY2FsbChTWVNfZ2V0cmFuZG9tLCBkZXN0LCBuLCBmbGFncyk7CiAgICAgICAgIH0KICNlbmRpZgogCkBAIC0xNzUsMzYgKzE4MiwzMyBAQAogICAgICAgICAgICAgICAgIGdldHJhbmRvbV93b3JrcyA9IDA7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7Ci0gICAgICAgICAgICAgICAgLyogSWYgd2UgZmFpbGVkIHdpdGggRUFHQUlOLCB0aGUgZW50cm9weSBwb29sIHdhcwotICAgICAgICAgICAgICAgICAqIHVuaW5pdGlhbGl6ZWQuIEluIHRoaXMgY2FzZSwgd2UgcmV0dXJuIGZhaWx1cmUgdG8gZmFsbAotICAgICAgICAgICAgICAgICAqIGJhY2sgdG8gcmVhZGluZyBmcm9tIC9kZXYvdXJhbmRvbS4KLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIE5vdGU6IEluIHRoaXMgY2FzZSB0aGUgZGF0YSByZWFkIHdpbGwgbm90IGJlIHJhbmRvbSBzbwotICAgICAgICAgICAgICAgICAqIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgY3J5cHRvZ3JhcGhpYyBwdXJwb3Nlcy4gUmV0YWluaW5nCi0gICAgICAgICAgICAgICAgICogdGhlIGV4aXN0aW5nIHNlbWFudGljcyBmb3IgcHJhY3RpY2FsIHB1cnBvc2VzLiAqLwotICAgICAgICAgICAgICAgIGdldHJhbmRvbV93b3JrcyA9IDA7CisKKyAgICAgICAgICAgIC8qIGdldHJhbmRvbShHUk5EX05PTkJMT0NLKSBmYWlscyB3aXRoIEVBR0FJTiBpZiB0aGUgc3lzdGVtIHVyYW5kb20KKyAgICAgICAgICAgICAgIGlzIG5vdCBpbml0aWFsaWF6ZWQgeWV0LiBGb3IgX1B5UmFuZG9tX0luaXQoKSwgd2UgaWdub3JlIHRoZWlyCisgICAgICAgICAgICAgICBlcnJvciBhbmQgZmFsbCBiYWNrIG9uIHJlYWRpbmcgL2Rldi91cmFuZG9tIHdoaWNoIG5ldmVyIGJsb2NrcywKKyAgICAgICAgICAgICAgIGV2ZW4gaWYgdGhlIHN5c3RlbSB1cmFuZG9tIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuICovCisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOICYmICFyYWlzZSAmJiAhYmxvY2tpbmcpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcmFpc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJnZXRyYW5kb20oKSBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgaWYgKHJhaXNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIHJldHJ5IGdldHJhbmRvbSgpICovCisKKyAgICAgICAgICAgICAgICAvKiByZXRyeSBnZXRyYW5kb20oKSBpZiBpdCB3YXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgKi8KICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHJhaXNlKQorICAgICAgICAgICAgaWYgKHJhaXNlKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImdldHJhbmRvbSgpIGZhaWxlZCIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKLSAgICAgICAgYnVmZmVyICs9IG47CisgICAgICAgIGRlc3QgKz0gbjsKICAgICAgICAgc2l6ZSAtPSBuOwogICAgIH0KICAgICByZXR1cm4gMTsKQEAgLTIxOCwxMjYgKzIyMiwxMTggQEAKIH0gdXJhbmRvbV9jYWNoZSA9IHsgLTEgfTsKIAogCi0vKiBSZWFkIHNpemUgYnl0ZXMgZnJvbSAvZGV2L3VyYW5kb20gaW50byBidWZmZXIuCi0gICBDYWxsIFB5X0ZhdGFsRXJyb3IoKSBvbiBlcnJvci4gKi8KLXN0YXRpYyB2b2lkCi1kZXZfdXJhbmRvbV9ub3JhaXNlKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplKQotewotICAgIGludCBmZDsKLSAgICBQeV9zc2l6ZV90IG47CisvKiBSZWFkICdzaXplJyByYW5kb20gYnl0ZXMgZnJvbSBweV9nZXRyYW5kb20oKS4gRmFsbCBiYWNrIG9uIHJlYWRpbmcgZnJvbQorICAgL2Rldi91cmFuZG9tIGlmIGdldHJhbmRvbSgpIGlzIG5vdCBhdmFpbGFibGUuCiAKLSAgICBhc3NlcnQgKDAgPCBzaXplKTsKLQotI2lmZGVmIFBZX0dFVFJBTkRPTQotICAgIGlmIChweV9nZXRyYW5kb20oYnVmZmVyLCBzaXplLCAwKSA9PSAxKQotICAgICAgICByZXR1cm47Ci0gICAgLyogZ2V0cmFuZG9tKCkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcnVubmluZyBrZXJuZWwsIGZhbGwgYmFjawotICAgICAqIG9uIHJlYWRpbmcgL2Rldi91cmFuZG9tICovCi0jZW5kaWYKLQotICAgIGZkID0gX1B5X29wZW5fbm9yYWlzZSgiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpOwotICAgIGlmIChmZCA8IDApCi0gICAgICAgIFB5X0ZhdGFsRXJyb3IoIkZhaWxlZCB0byBvcGVuIC9kZXYvdXJhbmRvbSIpOwotCi0gICAgd2hpbGUgKDAgPCBzaXplKQotICAgIHsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgbiA9IHJlYWQoZmQsIGJ1ZmZlciwgKHNpemVfdClzaXplKTsKLSAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotICAgICAgICBpZiAobiA8PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzdG9wIG9uIGVycm9yIG9yIGlmIHJlYWQoc2l6ZSkgcmV0dXJuZWQgMCAqLwotICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiRmFpbGVkIHRvIHJlYWQgYnl0ZXMgZnJvbSAvZGV2L3VyYW5kb20iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlciArPSBuOwotICAgICAgICBzaXplIC09IG47Ci0gICAgfQotICAgIGNsb3NlKGZkKTsKLX0KLQotLyogUmVhZCBzaXplIGJ5dGVzIGZyb20gL2Rldi91cmFuZG9tIGludG8gYnVmZmVyLgotICAgUmV0dXJuIDAgb24gc3VjY2VzcywgcmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gLTEgb24gZXJyb3IuICovCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLiBSYWlzZSBhbiBleGNlcHRpb24gKGlmIHJhaXNlIGlzIG5vbi16ZXJvKSBhbmQgcmV0dXJuIC0xCisgICBvbiBlcnJvci4gKi8KIHN0YXRpYyBpbnQKLWRldl91cmFuZG9tX3B5dGhvbihjaGFyICpidWZmZXIsIFB5X3NzaXplX3Qgc2l6ZSkKK2Rldl91cmFuZG9tKGNoYXIgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplLCBpbnQgYmxvY2tpbmcsIGludCByYWlzZSkKIHsKICAgICBpbnQgZmQ7CiAgICAgUHlfc3NpemVfdCBuOwotICAgIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3Qgc3Q7CiAjaWZkZWYgUFlfR0VUUkFORE9NCiAgICAgaW50IHJlczsKICNlbmRpZgogCi0gICAgaWYgKHNpemUgPD0gMCkKLSAgICAgICAgcmV0dXJuIDA7CisgICAgYXNzZXJ0KHNpemUgPiAwKTsKIAogI2lmZGVmIFBZX0dFVFJBTkRPTQotICAgIHJlcyA9IHB5X2dldHJhbmRvbShidWZmZXIsIHNpemUsIDEpOwotICAgIGlmIChyZXMgPCAwKQorICAgIHJlcyA9IHB5X2dldHJhbmRvbShidWZmZXIsIHNpemUsIGJsb2NraW5nLCByYWlzZSk7CisgICAgaWYgKHJlcyA8IDApIHsKICAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChyZXMgPT0gMSkKKyAgICB9CisgICAgaWYgKHJlcyA9PSAxKSB7CiAgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICAvKiBnZXRyYW5kb20oKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBydW5uaW5nIGtlcm5lbCwgZmFsbCBiYWNrCi0gICAgICogb24gcmVhZGluZyAvZGV2L3VyYW5kb20gKi8KKyAgICAgICBvbiByZWFkaW5nIC9kZXYvdXJhbmRvbSAqLwogI2VuZGlmCiAKLSAgICBpZiAodXJhbmRvbV9jYWNoZS5mZCA+PSAwKSB7Ci0gICAgICAgIC8qIERvZXMgdGhlIGZkIHBvaW50IHRvIHRoZSBzYW1lIHRoaW5nIGFzIGJlZm9yZT8gKGlzc3VlICMyMTIwNykgKi8KLSAgICAgICAgaWYgKF9QeV9mc3RhdF9ub3JhaXNlKHVyYW5kb21fY2FjaGUuZmQsICZzdCkKLSAgICAgICAgICAgIHx8IHN0LnN0X2RldiAhPSB1cmFuZG9tX2NhY2hlLnN0X2RldgotICAgICAgICAgICAgfHwgc3Quc3RfaW5vICE9IHVyYW5kb21fY2FjaGUuc3RfaW5vKSB7Ci0gICAgICAgICAgICAvKiBTb21ldGhpbmcgY2hhbmdlZDogZm9yZ2V0IHRoZSBjYWNoZWQgZmQgKGJ1dCBkb24ndCBjbG9zZSBpdCwKLSAgICAgICAgICAgICAgIHNpbmNlIGl0IHByb2JhYmx5IHBvaW50cyB0byBzb21ldGhpbmcgaW1wb3J0YW50IGZvciBzb21lCi0gICAgICAgICAgICAgICB0aGlyZC1wYXJ0eSBjb2RlKS4gKi8KLSAgICAgICAgICAgIHVyYW5kb21fY2FjaGUuZmQgPSAtMTsKKworICAgIGlmIChyYWlzZSkgeworICAgICAgICBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0IHN0OworCisgICAgICAgIGlmICh1cmFuZG9tX2NhY2hlLmZkID49IDApIHsKKyAgICAgICAgICAgIC8qIERvZXMgdGhlIGZkIHBvaW50IHRvIHRoZSBzYW1lIHRoaW5nIGFzIGJlZm9yZT8gKGlzc3VlICMyMTIwNykgKi8KKyAgICAgICAgICAgIGlmIChfUHlfZnN0YXRfbm9yYWlzZSh1cmFuZG9tX2NhY2hlLmZkLCAmc3QpCisgICAgICAgICAgICAgICAgfHwgc3Quc3RfZGV2ICE9IHVyYW5kb21fY2FjaGUuc3RfZGV2CisgICAgICAgICAgICAgICAgfHwgc3Quc3RfaW5vICE9IHVyYW5kb21fY2FjaGUuc3RfaW5vKSB7CisgICAgICAgICAgICAgICAgLyogU29tZXRoaW5nIGNoYW5nZWQ6IGZvcmdldCB0aGUgY2FjaGVkIGZkIChidXQgZG9uJ3QgY2xvc2UgaXQsCisgICAgICAgICAgICAgICAgICAgc2luY2UgaXQgcHJvYmFibHkgcG9pbnRzIHRvIHNvbWV0aGluZyBpbXBvcnRhbnQgZm9yIHNvbWUKKyAgICAgICAgICAgICAgICAgICB0aGlyZC1wYXJ0eSBjb2RlKS4gKi8KKyAgICAgICAgICAgICAgICB1cmFuZG9tX2NhY2hlLmZkID0gLTE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHVyYW5kb21fY2FjaGUuZmQgPj0gMCkKKyAgICAgICAgICAgIGZkID0gdXJhbmRvbV9jYWNoZS5mZDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmZCA9IF9QeV9vcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisgICAgICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCB8fCBlcnJubyA9PSBFTlhJTyB8fAorICAgICAgICAgICAgICAgICAgICBlcnJubyA9PSBFTk9ERVYgfHwgZXJybm8gPT0gRUFDQ0VTKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvZGV2L3VyYW5kb20gKG9yIGVxdWl2YWxlbnQpIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSwga2VlcCB0aGUgT1NFcnJvciBleGNlcHRpb24gcmFpc2VkIGJ5IF9QeV9vcGVuKCkgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXJhbmRvbV9jYWNoZS5mZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgLyogdXJhbmRvbV9mZCB3YXMgaW5pdGlhbGl6ZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgd2Ugd2VyZQorICAgICAgICAgICAgICAgICAgIG5vdCBob2xkaW5nIHRoZSBHSUwsIGtlZXAgaXQuICovCisgICAgICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgICAgIGZkID0gdXJhbmRvbV9jYWNoZS5mZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChfUHlfZnN0YXQoZmQsICZzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1cmFuZG9tX2NhY2hlLmZkID0gZmQ7CisgICAgICAgICAgICAgICAgICAgIHVyYW5kb21fY2FjaGUuc3RfZGV2ID0gc3Quc3RfZGV2OworICAgICAgICAgICAgICAgICAgICB1cmFuZG9tX2NhY2hlLnN0X2lubyA9IHN0LnN0X2lubzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkbyB7CisgICAgICAgICAgICBuID0gX1B5X3JlYWQoZmQsIGJ1ZmZlciwgKHNpemVfdClzaXplKTsKKyAgICAgICAgICAgIGlmIChuID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkICV6aSBieXRlcyBmcm9tIC9kZXYvdXJhbmRvbSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZmZlciArPSBuOworICAgICAgICAgICAgc2l6ZSAtPSBuOworICAgICAgICB9IHdoaWxlICgwIDwgc2l6ZSk7CiAgICAgfQotICAgIGlmICh1cmFuZG9tX2NhY2hlLmZkID49IDApCi0gICAgICAgIGZkID0gdXJhbmRvbV9jYWNoZS5mZDsKICAgICBlbHNlIHsKLSAgICAgICAgZmQgPSBfUHlfb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpOworICAgICAgICBmZCA9IF9QeV9vcGVuX25vcmFpc2UoIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKICAgICAgICAgaWYgKGZkIDwgMCkgewotICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCB8fCBlcnJubyA9PSBFTlhJTyB8fAotICAgICAgICAgICAgICAgIGVycm5vID09IEVOT0RFViB8fCBlcnJubyA9PSBFQUNDRVMpCi0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvZGV2L3VyYW5kb20gKG9yIGVxdWl2YWxlbnQpIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBrZWVwIHRoZSBPU0Vycm9yIGV4Y2VwdGlvbiByYWlzZWQgYnkgX1B5X29wZW4oKSAqLwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIGlmICh1cmFuZG9tX2NhY2hlLmZkID49IDApIHsKLSAgICAgICAgICAgIC8qIHVyYW5kb21fZmQgd2FzIGluaXRpYWxpemVkIGJ5IGFub3RoZXIgdGhyZWFkIHdoaWxlIHdlIHdlcmUKLSAgICAgICAgICAgICAgIG5vdCBob2xkaW5nIHRoZSBHSUwsIGtlZXAgaXQuICovCi0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICBmZCA9IHVyYW5kb21fY2FjaGUuZmQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoX1B5X2ZzdGF0KGZkLCAmc3QpKSB7CisKKyAgICAgICAgd2hpbGUgKDAgPCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbiA9IHJlYWQoZmQsIGJ1ZmZlciwgKHNpemVfdClzaXplKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICAgICAgICAgICAgaWYgKG4gPD0gMCkgeworICAgICAgICAgICAgICAgIC8qIHN0b3Agb24gZXJyb3Igb3IgaWYgcmVhZChzaXplKSByZXR1cm5lZCAwICovCiAgICAgICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHVyYW5kb21fY2FjaGUuZmQgPSBmZDsKLSAgICAgICAgICAgICAgICB1cmFuZG9tX2NhY2hlLnN0X2RldiA9IHN0LnN0X2RldjsKLSAgICAgICAgICAgICAgICB1cmFuZG9tX2NhY2hlLnN0X2lubyA9IHN0LnN0X2lubzsKLSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmZmVyICs9IG47CisgICAgICAgICAgICBzaXplIC09IG47CiAgICAgICAgIH0KKyAgICAgICAgY2xvc2UoZmQpOwogICAgIH0KLQotICAgIGRvIHsKLSAgICAgICAgbiA9IF9QeV9yZWFkKGZkLCBidWZmZXIsIChzaXplX3Qpc2l6ZSk7Ci0gICAgICAgIGlmIChuID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgJXppIGJ5dGVzIGZyb20gL2Rldi91cmFuZG9tIiwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXIgKz0gbjsKLSAgICAgICAgc2l6ZSAtPSBuOwotICAgIH0gd2hpbGUgKDAgPCBzaXplKTsKLQogICAgIHJldHVybiAwOwogfQogCkBAIC0zNzMsMjkgKzM2OSw2MiBAQAogICAgIH0KIH0KIAorLyogSWYgcmFpc2UgaXMgemVybzoKKyAgIC0gRG9uJ3QgcmFpc2UgZXhjZXB0aW9ucyBvbiBlcnJvcgorICAgLSBEb24ndCBjYWxsIFB5RXJyX0NoZWNrU2lnbmFscygpIG9uIEVJTlRSIChyZXRyeSBkaXJlY3RseSB0aGUgaW50ZXJydXB0ZWQKKyAgICAgc3lzY2FsbCkKKyAgIC0gRG9uJ3QgcmVsZWFzZSB0aGUgR0lMIHRvIGNhbGwgc3lzY2FsbHMuICovCitzdGF0aWMgaW50CitweXVyYW5kb20odm9pZCAqYnVmZmVyLCBQeV9zc2l6ZV90IHNpemUsIGludCBibG9ja2luZywgaW50IHJhaXNlKQoreworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBpZiAocmFpc2UpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBhcmd1bWVudCBub3QgYWxsb3dlZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICByZXR1cm4gd2luMzJfdXJhbmRvbSgodW5zaWduZWQgY2hhciAqKWJ1ZmZlciwgc2l6ZSwgcmFpc2UpOworI2VsaWYgZGVmaW5lZChQWV9HRVRFTlRST1BZKQorICAgIHJldHVybiBweV9nZXRlbnRyb3B5KGJ1ZmZlciwgc2l6ZSwgcmFpc2UpOworI2Vsc2UKKyAgICByZXR1cm4gZGV2X3VyYW5kb20oYnVmZmVyLCBzaXplLCBibG9ja2luZywgcmFpc2UpOworI2VuZGlmCit9CisKIC8qIEZpbGwgYnVmZmVyIHdpdGggc2l6ZSBwc2V1ZG8tcmFuZG9tIGJ5dGVzIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmFuZG9tCiAgICBudW1iZXIgZ2VuZXJhdG9yIChSTkcpLiBJdCBpcyBzdWl0YWJsZSBmb3IgbW9zdCBjcnlwdG9ncmFwaGljIHB1cnBvc2VzCiAgICBleGNlcHQgbG9uZyBsaXZpbmcgcHJpdmF0ZSBrZXlzIGZvciBhc3ltbWV0cmljIGVuY3J5cHRpb24uCiAKLSAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIHJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIC0xIG9uIGVycm9yLiAqLworICAgT24gTGludXggMy4xNyBhbmQgbmV3ZXIsIHRoZSBnZXRyYW5kb20oKSBzeXNjYWxsIGlzIHVzZWQgaW4gYmxvY2tpbmcgbW9kZToKKyAgIGJsb2NrIHVudGlsIHRoZSBzeXN0ZW0gdXJhbmRvbSBlbnRyb3B5IHBvb2wgaXMgaW5pdGlhbGl6ZWQgKDEyOCBiaXRzIGFyZQorICAgY29sbGVjdGVkIGJ5IHRoZSBrZXJuZWwpLgorCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLiBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiAtMSBvbiBlcnJvci4gKi8KIGludAogX1B5T1NfVVJhbmRvbSh2b2lkICpidWZmZXIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLSAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgYXJndW1lbnQgbm90IGFsbG93ZWQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoc2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcHl1cmFuZG9tKGJ1ZmZlciwgc2l6ZSwgMSwgMSk7Cit9CiAKLSNpZmRlZiBNU19XSU5ET1dTCi0gICAgcmV0dXJuIHdpbjMyX3VyYW5kb20oKHVuc2lnbmVkIGNoYXIgKilidWZmZXIsIHNpemUsIDEpOwotI2VsaWYgZGVmaW5lZChQWV9HRVRFTlRST1BZKQotICAgIHJldHVybiBweV9nZXRlbnRyb3B5KGJ1ZmZlciwgc2l6ZSwgMCk7Ci0jZWxzZQotICAgIHJldHVybiBkZXZfdXJhbmRvbV9weXRob24oKGNoYXIqKWJ1ZmZlciwgc2l6ZSk7Ci0jZW5kaWYKKy8qIEZpbGwgYnVmZmVyIHdpdGggc2l6ZSBwc2V1ZG8tcmFuZG9tIGJ5dGVzIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmFuZG9tCisgICBudW1iZXIgZ2VuZXJhdG9yIChSTkcpLiBJdCBpcyBub3Qgc3VpdGFibGUgZm9yIGNyeXB0b2dyYXBoaWMgcHVycG9zZS4KKworICAgT24gTGludXggMy4xNyBhbmQgbmV3ZXIgKHdoZW4gZ2V0cmFuZG9tKCkgc3lzY2FsbCBpcyB1c2VkKSwgaWYgdGhlIHN5c3RlbQorICAgdXJhbmRvbSBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LCB0aGUgZnVuY3Rpb24gcmV0dXJucyAid2VhayIgZW50cm9weSByZWFkCisgICBmcm9tIC9kZXYvdXJhbmRvbS4KKworICAgUmV0dXJuIDAgb24gc3VjY2Vzcy4gUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gLTEgb24gZXJyb3IuICovCitpbnQKK19QeU9TX1VSYW5kb21Ob25ibG9jayh2b2lkICpidWZmZXIsIFB5X3NzaXplX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gcHl1cmFuZG9tKGJ1ZmZlciwgc2l6ZSwgMCwgMSk7CiB9CiAKIHZvaWQKQEAgLTQwNCw3ICs0MzMsNyBAQAogICAgIGNoYXIgKmVudjsKICAgICB1bnNpZ25lZCBjaGFyICpzZWNyZXQgPSAodW5zaWduZWQgY2hhciAqKSZfUHlfSGFzaFNlY3JldC51YzsKICAgICBQeV9zc2l6ZV90IHNlY3JldF9zaXplID0gc2l6ZW9mKF9QeV9IYXNoU2VjcmV0X3QpOwotICAgIGFzc2VydChzZWNyZXRfc2l6ZSA9PSBzaXplb2YoX1B5X0hhc2hTZWNyZXQudWMpKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKF9QeV9IYXNoU2VjcmV0X3QpID09IHNpemVvZihfUHlfSGFzaFNlY3JldC51YykpOwogCiAgICAgaWYgKF9QeV9IYXNoU2VjcmV0X0luaXRpYWxpemVkKQogICAgICAgICByZXR1cm47CkBAIC00MzYsMTMgKzQ2NSwxNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewotI2lmZGVmIE1TX1dJTkRPV1MKLSAgICAgICAgKHZvaWQpd2luMzJfdXJhbmRvbShzZWNyZXQsIHNlY3JldF9zaXplLCAwKTsKLSNlbGlmIGRlZmluZWQoUFlfR0VURU5UUk9QWSkKLSAgICAgICAgKHZvaWQpcHlfZ2V0ZW50cm9weShzZWNyZXQsIHNlY3JldF9zaXplLCAxKTsKLSNlbHNlCi0gICAgICAgIGRldl91cmFuZG9tX25vcmFpc2Uoc2VjcmV0LCBzZWNyZXRfc2l6ZSk7Ci0jZW5kaWYKKyAgICAgICAgaW50IHJlczsKKworICAgICAgICAvKiBfUHlSYW5kb21fSW5pdCgpIGlzIGNhbGxlZCB2ZXJ5IGVhcmx5IGluIHRoZSBQeXRob24gaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgYW5kIHNvIGV4Y2VwdGlvbnMgY2Fubm90IGJlIHVzZWQgKHVzZSByYWlzZT0wKS4KKworICAgICAgICAgICBfUHlSYW5kb21fSW5pdCgpIG11c3Qgbm90IGJsb2NrIFB5dGhvbiBpbml0aWFsaXphdGlvbjogY2FsbAorICAgICAgICAgICBweXVyYW5kb20oKSBpcyBub24tYmxvY2tpbmcgbW9kZSAoYmxvY2tpbmc9MCk6IHNlZSB0aGUgUEVQIDUyNC4gKi8KKyAgICAgICAgcmVzID0gcHl1cmFuZG9tKHNlY3JldCwgc2VjcmV0X3NpemUsIDAsIDApOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiZmFpbGVkIHRvIGdldCByYW5kb20gbnVtYmVycyB0byBpbml0aWFsaXplIFB5dGhvbiIpOworICAgICAgICB9CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9QeXRob24vc3RydWN0bWVtYmVyLmMgYi9QeXRob24vc3RydWN0bWVtYmVyLmMKaW5kZXggYWYwMjk2ZC4uODZkNGM2NiAxMDA2NDQKLS0tIGEvUHl0aG9uL3N0cnVjdG1lbWJlci5jCisrKyBiL1B5dGhvbi9zdHJ1Y3RtZW1iZXIuYwpAQCAtNzQsMTQgKzc0LDEyIEBACiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIGwtPm5hbWUpOwogICAgICAgICBQeV9YSU5DUkVGKHYpOwogICAgICAgICBicmVhazsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgIGNhc2UgVF9MT05HTE9ORzoKLSAgICAgICAgdiA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKihQWV9MT05HX0xPTkcgKilhZGRyKTsKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKihsb25nIGxvbmcgKilhZGRyKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUX1VMT05HTE9ORzoKLSAgICAgICAgdiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKWFkZHIpOworICAgICAgICB2ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKCoodW5zaWduZWQgbG9uZyBsb25nICopYWRkcik7CiAgICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCiAgICAgY2FzZSBUX05PTkU6CiAgICAgICAgIHYgPSBQeV9Ob25lOwogICAgICAgICBQeV9JTkNSRUYodik7CkBAIC0yNjYsMjcgKzI2NCwyNSBAQAogICAgIGNhc2UgVF9TVFJJTkdfSU5QTEFDRToKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlYWRvbmx5IGF0dHJpYnV0ZSIpOwogICAgICAgICByZXR1cm4gLTE7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgICBjYXNlIFRfTE9OR0xPTkc6ewotICAgICAgICBQWV9MT05HX0xPTkcgdmFsdWU7Ci0gICAgICAgICooUFlfTE9OR19MT05HKilhZGRyID0gdmFsdWUgPSBQeUxvbmdfQXNMb25nTG9uZyh2KTsKKyAgICAgICAgbG9uZyBsb25nIHZhbHVlOworICAgICAgICAqKGxvbmcgbG9uZyopYWRkciA9IHZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmcodik7CiAgICAgICAgIGlmICgodmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgY2FzZSBUX1VMT05HTE9ORzp7Ci0gICAgICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWx1ZTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlOwogICAgICAgICAvKiA/Pz8gUHlMb25nX0FzTG9uZ0xvbmcgYWNjZXB0cyBhbiBpbnQsIGJ1dCBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nCiAgICAgICAgICAgICBkb2Vzbid0ID8/PyAqLwogICAgICAgICBpZiAoUHlMb25nX0NoZWNrKHYpKQotICAgICAgICAgICAgKih1bnNpZ25lZCBQWV9MT05HX0xPTkcqKWFkZHIgPSB2YWx1ZSA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodik7CisgICAgICAgICAgICAqKHVuc2lnbmVkIGxvbmcgbG9uZyopYWRkciA9IHZhbHVlID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2KTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgKih1bnNpZ25lZCBQWV9MT05HX0xPTkcqKWFkZHIgPSB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmcodik7Ci0gICAgICAgIGlmICgodmFsdWUgPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICoodW5zaWduZWQgbG9uZyBsb25nKilhZGRyID0gdmFsdWUgPSBQeUxvbmdfQXNMb25nKHYpOworICAgICAgICBpZiAoKHZhbHVlID09ICh1bnNpZ25lZCBsb25nIGxvbmcpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0jZW5kaWYgLyogSEFWRV9MT05HX0xPTkcgKi8KICAgICBkZWZhdWx0OgogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiYmFkIG1lbWJlcmRlc2NyIHR5cGUgZm9yICVzIiwgbC0+bmFtZSk7CmRpZmYgLS1naXQgYS9QeXRob24vc3ltdGFibGUuYyBiL1B5dGhvbi9zeW10YWJsZS5jCmluZGV4IDE1OTFhMjAuLmY3NjI5MDQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeW10YWJsZS5jCisrKyBiL1B5dGhvbi9zeW10YWJsZS5jCkBAIC02LDE2ICs2LDIyIEBACiAKIC8qIGVycm9yIHN0cmluZ3MgdXNlZCBmb3Igd2FybmluZ3MgKi8KICNkZWZpbmUgR0xPQkFMX0FGVEVSX0FTU0lHTiBcCi0ibmFtZSAnJS40MDBzJyBpcyBhc3NpZ25lZCB0byBiZWZvcmUgZ2xvYmFsIGRlY2xhcmF0aW9uIgorIm5hbWUgJyVVJyBpcyBhc3NpZ25lZCB0byBiZWZvcmUgZ2xvYmFsIGRlY2xhcmF0aW9uIgogCiAjZGVmaW5lIE5PTkxPQ0FMX0FGVEVSX0FTU0lHTiBcCi0ibmFtZSAnJS40MDBzJyBpcyBhc3NpZ25lZCB0byBiZWZvcmUgbm9ubG9jYWwgZGVjbGFyYXRpb24iCisibmFtZSAnJVUnIGlzIGFzc2lnbmVkIHRvIGJlZm9yZSBub25sb2NhbCBkZWNsYXJhdGlvbiIKIAogI2RlZmluZSBHTE9CQUxfQUZURVJfVVNFIFwKLSJuYW1lICclLjQwMHMnIGlzIHVzZWQgcHJpb3IgdG8gZ2xvYmFsIGRlY2xhcmF0aW9uIgorIm5hbWUgJyVVJyBpcyB1c2VkIHByaW9yIHRvIGdsb2JhbCBkZWNsYXJhdGlvbiIKIAogI2RlZmluZSBOT05MT0NBTF9BRlRFUl9VU0UgXAotIm5hbWUgJyUuNDAwcycgaXMgdXNlZCBwcmlvciB0byBub25sb2NhbCBkZWNsYXJhdGlvbiIKKyJuYW1lICclVScgaXMgdXNlZCBwcmlvciB0byBub25sb2NhbCBkZWNsYXJhdGlvbiIKKworI2RlZmluZSBHTE9CQUxfQU5OT1QgXAorImFubm90YXRlZCBuYW1lICclVScgY2FuJ3QgYmUgZ2xvYmFsIgorCisjZGVmaW5lIE5PTkxPQ0FMX0FOTk9UIFwKKyJhbm5vdGF0ZWQgbmFtZSAnJVUnIGNhbid0IGJlIG5vbmxvY2FsIgogCiAjZGVmaW5lIElNUE9SVF9TVEFSX1dBUk5JTkcgImltcG9ydCAqIG9ubHkgYWxsb3dlZCBhdCBtb2R1bGUgbGV2ZWwiCiAKQEAgLTYzLDYgKzY5LDcgQEAKICAgICAgICAgc3RlLT5zdGVfbmVzdGVkID0gMTsKICAgICBzdGUtPnN0ZV9jaGlsZF9mcmVlID0gMDsKICAgICBzdGUtPnN0ZV9nZW5lcmF0b3IgPSAwOworICAgIHN0ZS0+c3RlX2Nvcm91dGluZSA9IDA7CiAgICAgc3RlLT5zdGVfcmV0dXJuc192YWx1ZSA9IDA7CiAgICAgc3RlLT5zdGVfbmVlZHNfY2xhc3NfY2xvc3VyZSA9IDA7CiAKQEAgLTE2MCw3ICsxNjcsNiBAQAogfTsKIAogc3RhdGljIGludCBzeW10YWJsZV9hbmFseXplKHN0cnVjdCBzeW10YWJsZSAqc3QpOwotc3RhdGljIGludCBzeW10YWJsZV93YXJuKHN0cnVjdCBzeW10YWJsZSAqc3QsIGNoYXIgKm1zZywgaW50IGxpbmVubyk7CiBzdGF0aWMgaW50IHN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0cnVjdCBzeW10YWJsZSAqc3QsIGlkZW50aWZpZXIgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2Jsb2NrX3R5IGJsb2NrLCB2b2lkICphc3QsIGludCBsaW5lbm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xfb2Zmc2V0KTsKQEAgLTM3OCw3ICszODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKGRhdGEsIDIpKSk7CiAKICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9ICAgCisgICAgICAgIH0KICAgICB9CiAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgIkJVRzogaW50ZXJuYWwgZGlyZWN0aXZlIGJvb2trZWVwaW5nIGJyb2tlbiIpOwpAQCAtNjUyLDcgKzY1OCw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICAvKiBIYW5kbGUgZ2xvYmFsIHN5bWJvbCAqLwotICAgICAgICBpZiAoIVB5U2V0X0NvbnRhaW5zKGJvdW5kLCBuYW1lKSkgeworICAgICAgICBpZiAoYm91bmQgJiYgIVB5U2V0X0NvbnRhaW5zKGJvdW5kLCBuYW1lKSkgewogICAgICAgICAgICAgUHlfREVDUkVGKG5hbWUpOwogICAgICAgICAgICAgY29udGludWU7ICAgICAgIC8qIGl0J3MgYSBnbG9iYWwgKi8KICAgICAgICAgfQpAQCAtOTA2LDI3ICs5MTIsNiBAQAogICAgIHJldHVybiByOwogfQogCi0KLXN0YXRpYyBpbnQKLXN5bXRhYmxlX3dhcm4oc3RydWN0IHN5bXRhYmxlICpzdCwgY2hhciAqbXNnLCBpbnQgbGluZW5vKQotewotICAgIFB5T2JqZWN0ICptZXNzYWdlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcobXNnKTsKLSAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoUHlFcnJfV2FybkV4cGxpY2l0T2JqZWN0KFB5RXhjX1N5bnRheFdhcm5pbmcsIG1lc3NhZ2UsIHN0LT5zdF9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgTlVMTCwgTlVMTCkgPCAwKSAgICAgewotICAgICAgICBQeV9ERUNSRUYobWVzc2FnZSk7Ci0gICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N5bnRheFdhcm5pbmcpKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsIG1zZyk7Ci0gICAgICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbk9iamVjdChzdC0+c3RfZmlsZW5hbWUsIHN0LT5zdF9jdXItPnN0ZV9saW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfY29sX29mZnNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKLSAgICByZXR1cm4gMTsKLX0KLQogLyogc3ltdGFibGVfZW50ZXJfYmxvY2soKSBnZXRzIGEgcmVmZXJlbmNlIHZpYSBzdGVfbmV3LgogICAgVGhpcyByZWZlcmVuY2UgaXMgcmVsZWFzZWQgd2hlbiB0aGUgYmxvY2sgaXMgZXhpdGVkLCB2aWEgdGhlIERFQ1JFRgogICAgaW4gc3ltdGFibGVfZXhpdF9ibG9jaygpLgpAQCAtMTIwMSw2ICsxMTg2LDQzIEBACiAgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5Bc3NpZ24udGFyZ2V0cyk7CiAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkFzc2lnbi52YWx1ZSk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQW5uQXNzaWduX2tpbmQ6CisgICAgICAgIGlmIChzLT52LkFubkFzc2lnbi50YXJnZXQtPmtpbmQgPT0gTmFtZV9raW5kKSB7CisgICAgICAgICAgICBleHByX3R5IGVfbmFtZSA9IHMtPnYuQW5uQXNzaWduLnRhcmdldDsKKyAgICAgICAgICAgIGxvbmcgY3VyID0gc3ltdGFibGVfbG9va3VwKHN0LCBlX25hbWUtPnYuTmFtZS5pZCk7CisgICAgICAgICAgICBpZiAoY3VyIDwgMCkgeworICAgICAgICAgICAgICAgIFZJU0lUX1FVSVQoc3QsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChjdXIgJiAoREVGX0dMT0JBTCB8IERFRl9OT05MT0NBTCkpCisgICAgICAgICAgICAgICAgJiYgcy0+di5Bbm5Bc3NpZ24uc2ltcGxlKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIgJiBERUZfR0xPQkFMID8gR0xPQkFMX0FOTk9UIDogTk9OTE9DQUxfQU5OT1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVfbmFtZS0+di5OYW1lLmlkKTsKKyAgICAgICAgICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbk9iamVjdChzdC0+c3RfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbF9vZmZzZXQpOworICAgICAgICAgICAgICAgIFZJU0lUX1FVSVQoc3QsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPnYuQW5uQXNzaWduLnNpbXBsZSAmJgorICAgICAgICAgICAgICAgICFzeW10YWJsZV9hZGRfZGVmKHN0LCBlX25hbWUtPnYuTmFtZS5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZfQU5OT1QgfCBERUZfTE9DQUwpKSB7CisgICAgICAgICAgICAgICAgVklTSVRfUVVJVChzdCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+di5Bbm5Bc3NpZ24udmFsdWUKKyAgICAgICAgICAgICAgICAgICAgJiYgIXN5bXRhYmxlX2FkZF9kZWYoc3QsIGVfbmFtZS0+di5OYW1lLmlkLCBERUZfTE9DQUwpKSB7CisgICAgICAgICAgICAgICAgICAgIFZJU0lUX1FVSVQoc3QsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkFubkFzc2lnbi50YXJnZXQpOworICAgICAgICB9CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkFubkFzc2lnbi5hbm5vdGF0aW9uKTsKKyAgICAgICAgaWYgKHMtPnYuQW5uQXNzaWduLnZhbHVlKSB7CisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5Bbm5Bc3NpZ24udmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQXVnQXNzaWduX2tpbmQ6CiAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkF1Z0Fzc2lnbi50YXJnZXQpOwogICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOwpAQCAtMTI1OCwyMSArMTI4MCwyMyBAQAogICAgICAgICAgICAgbG9uZyBjdXIgPSBzeW10YWJsZV9sb29rdXAoc3QsIG5hbWUpOwogICAgICAgICAgICAgaWYgKGN1ciA8IDApCiAgICAgICAgICAgICAgICAgVklTSVRfUVVJVChzdCwgMCk7Ci0gICAgICAgICAgICBpZiAoY3VyICYgKERFRl9MT0NBTCB8IFVTRSkpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOwotICAgICAgICAgICAgICAgIGNoYXIgKmNfbmFtZSA9IF9QeVVuaWNvZGVfQXNTdHJpbmcobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjX25hbWUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIGlmIChjdXIgJiBERUZfTE9DQUwpCi0gICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQUZURVJfQVNTSUdOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfbmFtZSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0FGVEVSX1VTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX25hbWUpOwotICAgICAgICAgICAgICAgIGlmICghc3ltdGFibGVfd2FybihzdCwgYnVmLCBzLT5saW5lbm8pKQotICAgICAgICAgICAgICAgICAgICBWSVNJVF9RVUlUKHN0LCAwKTsKKyAgICAgICAgICAgIGlmIChjdXIgJiAoREVGX0xPQ0FMIHwgVVNFIHwgREVGX0FOTk9UKSkgeworICAgICAgICAgICAgICAgIGNoYXIqIG1zZzsKKyAgICAgICAgICAgICAgICBpZiAoY3VyICYgREVGX0FOTk9UKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IEdMT0JBTF9BTk5PVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGN1ciAmIERFRl9MT0NBTCkgeworICAgICAgICAgICAgICAgICAgICBtc2cgPSBHTE9CQUxfQUZURVJfQVNTSUdOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gR0xPQkFMX0FGVEVSX1VTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csIG5hbWUpOworICAgICAgICAgICAgICAgIFB5RXJyX1N5bnRheExvY2F0aW9uT2JqZWN0KHN0LT5zdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29sX29mZnNldCk7CisgICAgICAgICAgICAgICAgVklTSVRfUVVJVChzdCwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIG5hbWUsIERFRl9HTE9CQUwpKQogICAgICAgICAgICAgICAgIFZJU0lUX1FVSVQoc3QsIDApOwpAQCAtMTI4OSwyMSArMTMxMywyMiBAQAogICAgICAgICAgICAgbG9uZyBjdXIgPSBzeW10YWJsZV9sb29rdXAoc3QsIG5hbWUpOwogICAgICAgICAgICAgaWYgKGN1ciA8IDApCiAgICAgICAgICAgICAgICAgVklTSVRfUVVJVChzdCwgMCk7Ci0gICAgICAgICAgICBpZiAoY3VyICYgKERFRl9MT0NBTCB8IFVTRSkpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOwotICAgICAgICAgICAgICAgIGNoYXIgKmNfbmFtZSA9IF9QeVVuaWNvZGVfQXNTdHJpbmcobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjX25hbWUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIGlmIChjdXIgJiBERUZfTE9DQUwpCi0gICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT05MT0NBTF9BRlRFUl9BU1NJR04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19uYW1lKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT05MT0NBTF9BRlRFUl9VU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19uYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN5bXRhYmxlX3dhcm4oc3QsIGJ1Ziwgcy0+bGluZW5vKSkKLSAgICAgICAgICAgICAgICAgICAgVklTSVRfUVVJVChzdCwgMCk7CisgICAgICAgICAgICBpZiAoY3VyICYgKERFRl9MT0NBTCB8IFVTRSB8IERFRl9BTk5PVCkpIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBtc2c7CisgICAgICAgICAgICAgICAgaWYgKGN1ciAmIERFRl9BTk5PVCkgeworICAgICAgICAgICAgICAgICAgICBtc2cgPSBOT05MT0NBTF9BTk5PVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGN1ciAmIERFRl9MT0NBTCkgeworICAgICAgICAgICAgICAgICAgICBtc2cgPSBOT05MT0NBTF9BRlRFUl9BU1NJR047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtc2cgPSBOT05MT0NBTF9BRlRFUl9VU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeW50YXhFcnJvciwgbXNnLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbk9iamVjdChzdC0+c3RfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbF9vZmZzZXQpOworICAgICAgICAgICAgICAgIFZJU0lUX1FVSVQoc3QsIDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBuYW1lLCBERUZfTk9OTE9DQUwpKQogICAgICAgICAgICAgICAgIFZJU0lUX1FVSVQoc3QsIDApOwpAQCAtMTM0MSw2ICsxMzY2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkJsb2NrLCAodm9pZCAqKXMsIHMtPmxpbmVubywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb2xfb2Zmc2V0KSkKICAgICAgICAgICAgIFZJU0lUX1FVSVQoc3QsIDApOworICAgICAgICBzdC0+c3RfY3VyLT5zdGVfY29yb3V0aW5lID0gMTsKICAgICAgICAgVklTSVQoc3QsIGFyZ3VtZW50cywgcy0+di5Bc3luY0Z1bmN0aW9uRGVmLmFyZ3MpOwogICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuQXN5bmNGdW5jdGlvbkRlZi5ib2R5KTsKICAgICAgICAgaWYgKCFzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCBzKSkKQEAgLTE0MzYsNyArMTQ2Miw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQXdhaXRfa2luZDoKICAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuQXdhaXQudmFsdWUpOwotICAgICAgICBzdC0+c3RfY3VyLT5zdGVfZ2VuZXJhdG9yID0gMTsKKyAgICAgICAgc3QtPnN0X2N1ci0+c3RlX2Nvcm91dGluZSA9IDE7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ29tcGFyZV9raW5kOgogICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5Db21wYXJlLmxlZnQpOwpAQCAtMTQ0Nyw2ICsxNDczLDE1IEBACiAgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5DYWxsLmFyZ3MpOwogICAgICAgICBWSVNJVF9TRVFfV0lUSF9OVUxMKHN0LCBrZXl3b3JkLCBlLT52LkNhbGwua2V5d29yZHMpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvcm1hdHRlZFZhbHVlX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkZvcm1hdHRlZFZhbHVlLnZhbHVlKTsKKyAgICAgICAgaWYgKGUtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSm9pbmVkU3RyX2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5Kb2luZWRTdHIudmFsdWVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgogICAgIGNhc2UgTnVtX2tpbmQ6CiAgICAgY2FzZSBTdHJfa2luZDoKICAgICBjYXNlIEJ5dGVzX2tpbmQ6CkBAIC0xNjQ3LDYgKzE2ODIsOSBAQAogICAgIFZJU0lUKHN0LCBleHByLCBsYy0+dGFyZ2V0KTsKICAgICBWSVNJVChzdCwgZXhwciwgbGMtPml0ZXIpOwogICAgIFZJU0lUX1NFUShzdCwgZXhwciwgbGMtPmlmcyk7CisgICAgaWYgKGxjLT5pc19hc3luYykgeworICAgICAgICBzdC0+c3RfY3VyLT5zdGVfY29yb3V0aW5lID0gMTsKKyAgICB9CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTE2OTksNiArMTczNyw5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBzdC0+c3RfY3VyLT5zdGVfZ2VuZXJhdG9yID0gaXNfZ2VuZXJhdG9yOworICAgIGlmIChvdXRlcm1vc3QtPmlzX2FzeW5jKSB7CisgICAgICAgIHN0LT5zdF9jdXItPnN0ZV9jb3JvdXRpbmUgPSAxOworICAgIH0KICAgICAvKiBPdXRlcm1vc3QgaXRlciBpcyByZWNlaXZlZCBhcyBhbiBhcmd1bWVudCAqLwogICAgIGlmICghc3ltdGFibGVfaW1wbGljaXRfYXJnKHN0LCAwKSkgewogICAgICAgICBzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKWUpOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N5c21vZHVsZS5jIGIvUHl0aG9uL3N5c21vZHVsZS5jCmluZGV4IDhkN2UwNWEuLjQ0MTkxZmMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeXNtb2R1bGUuYworKysgYi9QeXRob24vc3lzbW9kdWxlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJweXRocmVhZC5oIgogCiAjaW5jbHVkZSAib3NkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CiAKICNpZmRlZiBNU19XSU5ET1dTCiAjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KQEAgLTMzLDcgKzM0LDYgQEAKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9MQU5HSU5GT19ICi0jaW5jbHVkZSA8bG9jYWxlLmg+CiAjaW5jbHVkZSA8bGFuZ2luZm8uaD4KICNlbmRpZgogCkBAIC0zMTEsNiArMzExLDIzIEBACiApOwogCiBzdGF0aWMgUHlPYmplY3QgKgorc3lzX2dldGZpbGVzeXN0ZW1lbmNvZGVlcnJvcnMoUHlPYmplY3QgKnNlbGYpCit7CisgICAgaWYgKFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RlRXJyb3JzKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGVFcnJvcnMpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICJmaWxlc3lzdGVtIGVuY29kaW5nIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgIHJldHVybiBOVUxMOworfQorCitQeURvY19TVFJWQVIoZ2V0ZmlsZXN5c3RlbWVuY29kZWVycm9yc19kb2MsCisgICAgImdldGZpbGVzeXN0ZW1lbmNvZGVlcnJvcnMoKSAtPiBzdHJpbmdcblwKK1xuXAorUmV0dXJuIHRoZSBlcnJvciBtb2RlIHVzZWQgdG8gY29udmVydCBVbmljb2RlIGZpbGVuYW1lcyBpblxuXAorb3BlcmF0aW5nIHN5c3RlbSBmaWxlbmFtZXMuIgorKTsKKworc3RhdGljIFB5T2JqZWN0ICoKIHN5c19pbnRlcm4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzOwpAQCAtMzQ2LDggKzM2MywxMCBAQAogc3RhdGljIGludAogdHJhY2VfaW5pdCh2b2lkKQogewotICAgIHN0YXRpYyBjaGFyICp3aGF0bmFtZXNbN10gPSB7ImNhbGwiLCAiZXhjZXB0aW9uIiwgImxpbmUiLCAicmV0dXJuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjX2NhbGwiLCAiY19leGNlcHRpb24iLCAiY19yZXR1cm4ifTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdoYXRuYW1lc1s3XSA9IHsKKyAgICAgICAgImNhbGwiLCAiZXhjZXB0aW9uIiwgImxpbmUiLCAicmV0dXJuIiwKKyAgICAgICAgImNfY2FsbCIsICJjX2V4Y2VwdGlvbiIsICJjX3JldHVybiIKKyAgICB9OwogICAgIFB5T2JqZWN0ICpuYW1lOwogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHsKQEAgLTM2NiwzNCArMzg1LDI1IEBACiBjYWxsX3RyYW1wb2xpbmUoUHlPYmplY3QqIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgIFB5RnJhbWVPYmplY3QgKmZyYW1lLCBpbnQgd2hhdCwgUHlPYmplY3QgKmFyZykKIHsKLSAgICBQeU9iamVjdCAqYXJnczsKLSAgICBQeU9iamVjdCAqd2hhdHN0cjsKICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpzdGFja1szXTsKIAotICAgIGFyZ3MgPSBQeVR1cGxlX05ldygzKTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgIGlmIChQeUZyYW1lX0Zhc3RUb0xvY2Fsc1dpdGhFcnJvcihmcmFtZSkgPCAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeUZyYW1lX0Zhc3RUb0xvY2Fsc1dpdGhFcnJvcihmcmFtZSkgPCAwKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICBQeV9JTkNSRUYoZnJhbWUpOwotICAgIHdoYXRzdHIgPSB3aGF0c3RyaW5nc1t3aGF0XTsKLSAgICBQeV9JTkNSRUYod2hhdHN0cik7Ci0gICAgaWYgKGFyZyA9PSBOVUxMKQotICAgICAgICBhcmcgPSBQeV9Ob25lOwotICAgIFB5X0lOQ1JFRihhcmcpOwotICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMCwgKFB5T2JqZWN0ICopZnJhbWUpOwotICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMSwgd2hhdHN0cik7Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAyLCBhcmcpOworICAgIHN0YWNrWzBdID0gKFB5T2JqZWN0ICopZnJhbWU7CisgICAgc3RhY2tbMV0gPSB3aGF0c3RyaW5nc1t3aGF0XTsKKyAgICBzdGFja1syXSA9IChhcmcgIT0gTlVMTCkgPyBhcmcgOiBQeV9Ob25lOwogCiAgICAgLyogY2FsbCB0aGUgUHl0aG9uLWxldmVsIGZ1bmN0aW9uICovCi0gICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoY2FsbGJhY2ssIGFyZ3MpOwotICAgIFB5RnJhbWVfTG9jYWxzVG9GYXN0KGZyYW1lLCAxKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIFB5VHJhY2VCYWNrX0hlcmUoZnJhbWUpOworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9GYXN0Q2FsbChjYWxsYmFjaywgc3RhY2ssIDMpOwogCi0gICAgLyogY2xlYW51cCAqLwotICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeUZyYW1lX0xvY2Fsc1RvRmFzdChmcmFtZSwgMSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5VHJhY2VCYWNrX0hlcmUoZnJhbWUpOworICAgIH0KKwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTQzNCwxMCArNDQ0LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBpZiAocmVzdWx0ICE9IFB5X05vbmUpIHsKLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBmcmFtZS0+Zl90cmFjZTsKLSAgICAgICAgZnJhbWUtPmZfdHJhY2UgPSBOVUxMOwotICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotICAgICAgICBmcmFtZS0+Zl90cmFjZSA9IHJlc3VsdDsKKyAgICAgICAgUHlfWFNFVFJFRihmcmFtZS0+Zl90cmFjZSwgcmVzdWx0KTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwpAQCAtNzEwLDYgKzcxNywxMTMgQEAKICk7CiAKIAorc3RhdGljIFB5VHlwZU9iamVjdCBBc3luY0dlbkhvb2tzVHlwZTsKKworUHlEb2NfU1RSVkFSKGFzeW5jZ2VuX2hvb2tzX2RvYywKKyJhc3luY2dlbl9ob29rc1xuXAorXG5cCitBIHN0cnVjdCBzZXF1ZW5jZSBwcm92aWRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYXN5bmhyb25vdXNcblwKK2dlbmVyYXRvcnMgaG9va3MuICBUaGUgYXR0cmlidXRlcyBhcmUgcmVhZCBvbmx5LiIpOworCitzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCBhc3luY2dlbl9ob29rc19maWVsZHNbXSA9IHsKKyAgICB7ImZpcnN0aXRlciIsICJIb29rIHRvIGludGVyY2VwdCBmaXJzdCBpdGVyYXRpb24ifSwKKyAgICB7ImZpbmFsaXplciIsICJIb29rIHRvIGludGVyY2VwdCBmaW5hbGl6YXRpb24ifSwKKyAgICB7MH0KK307CisKK3N0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2MgYXN5bmNnZW5faG9va3NfZGVzYyA9IHsKKyAgICAiYXN5bmNnZW5faG9va3MiLCAgICAgICAgICAvKiBuYW1lICovCisgICAgYXN5bmNnZW5faG9va3NfZG9jLCAgICAgICAgLyogZG9jICovCisgICAgYXN5bmNnZW5faG9va3NfZmllbGRzICwgICAgLyogZmllbGRzICovCisgICAgMgorfTsKKworCitzdGF0aWMgUHlPYmplY3QgKgorc3lzX3NldF9hc3luY2dlbl9ob29rcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKK3sKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZmlyc3RpdGVyIiwgImZpbmFsaXplciIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpmaXJzdGl0ZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmaW5hbGl6ZXIgPSBOVUxMOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoCisgICAgICAgICAgICBhcmdzLCBrdywgInxPTyIsIGtleXdvcmRzLAorICAgICAgICAgICAgJmZpcnN0aXRlciwgJmZpbmFsaXplcikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGZpbmFsaXplciAmJiBmaW5hbGl6ZXIgIT0gUHlfTm9uZSkgeworICAgICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZmluYWxpemVyKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGFibGUgZmluYWxpemVyIGV4cGVjdGVkLCBnb3QgJS41MHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoZmluYWxpemVyKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBfUHlFdmFsX1NldEFzeW5jR2VuRmluYWxpemVyKGZpbmFsaXplcik7CisgICAgfQorICAgIGVsc2UgaWYgKGZpbmFsaXplciA9PSBQeV9Ob25lKSB7CisgICAgICAgIF9QeUV2YWxfU2V0QXN5bmNHZW5GaW5hbGl6ZXIoTlVMTCk7CisgICAgfQorCisgICAgaWYgKGZpcnN0aXRlciAmJiBmaXJzdGl0ZXIgIT0gUHlfTm9uZSkgeworICAgICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZmlyc3RpdGVyKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGFibGUgZmlyc3RpdGVyIGV4cGVjdGVkLCBnb3QgJS41MHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoZmlyc3RpdGVyKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBfUHlFdmFsX1NldEFzeW5jR2VuRmlyc3RpdGVyKGZpcnN0aXRlcik7CisgICAgfQorICAgIGVsc2UgaWYgKGZpcnN0aXRlciA9PSBQeV9Ob25lKSB7CisgICAgICAgIF9QeUV2YWxfU2V0QXN5bmNHZW5GaXJzdGl0ZXIoTlVMTCk7CisgICAgfQorCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK1B5RG9jX1NUUlZBUihzZXRfYXN5bmNnZW5faG9va3NfZG9jLAorInNldF9hc3luY2dlbl9ob29rcygqLCBmaXJzdGl0ZXI9Tm9uZSwgZmluYWxpemVyPU5vbmUpXG5cCitcblwKK1NldCBhIGZpbmFsaXplciBmb3IgYXN5bmMgZ2VuZXJhdG9ycyBvYmplY3RzLiIKKyk7CisKK3N0YXRpYyBQeU9iamVjdCAqCitzeXNfZ2V0X2FzeW5jZ2VuX2hvb2tzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpmaXJzdGl0ZXIgPSBfUHlFdmFsX0dldEFzeW5jR2VuRmlyc3RpdGVyKCk7CisgICAgUHlPYmplY3QgKmZpbmFsaXplciA9IF9QeUV2YWxfR2V0QXN5bmNHZW5GaW5hbGl6ZXIoKTsKKworICAgIHJlcyA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZBc3luY0dlbkhvb2tzVHlwZSk7CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChmaXJzdGl0ZXIgPT0gTlVMTCkgeworICAgICAgICBmaXJzdGl0ZXIgPSBQeV9Ob25lOworICAgIH0KKworICAgIGlmIChmaW5hbGl6ZXIgPT0gTlVMTCkgeworICAgICAgICBmaW5hbGl6ZXIgPSBQeV9Ob25lOworICAgIH0KKworICAgIFB5X0lOQ1JFRihmaXJzdGl0ZXIpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzLCAwLCBmaXJzdGl0ZXIpOworCisgICAgUHlfSU5DUkVGKGZpbmFsaXplcik7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXMsIDEsIGZpbmFsaXplcik7CisKKyAgICByZXR1cm4gcmVzOworfQorCitQeURvY19TVFJWQVIoZ2V0X2FzeW5jZ2VuX2hvb2tzX2RvYywKKyJnZXRfYXN5bmNnZW5faG9va3MoKVxuXAorXG5cCitSZXR1cm4gYSBuYW1lZHR1cGxlIG9mIGluc3RhbGxlZCBhc3luY2hyb25vdXMgZ2VuZXJhdG9ycyBob29rcyBcCisoZmlyc3RpdGVyLCBmaW5hbGl6ZXIpLiIKKyk7CisKKwogc3RhdGljIFB5VHlwZU9iamVjdCBIYXNoX0luZm9UeXBlOwogCiBQeURvY19TVFJWQVIoaGFzaF9pbmZvX2RvYywKQEAgLTg3Niw2ICs5OTAsMjQgQEAKIAogI3ByYWdtYSB3YXJuaW5nKHBvcCkKIAorUHlEb2NfU1RSVkFSKGVuYWJsZWxlZ2FjeXdpbmRvd3Nmc2VuY29kaW5nX2RvYywKKyJfZW5hYmxlbGVnYWN5d2luZG93c2ZzZW5jb2RpbmcoKVxuXAorXG5cCitDaGFuZ2VzIHRoZSBkZWZhdWx0IGZpbGVzeXN0ZW0gZW5jb2RpbmcgdG8gbWJjczpyZXBsYWNlIGZvciBjb25zaXN0ZW5jeVxuXAord2l0aCBlYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbi4gU2VlIFBFUCA1MjkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cCitcblwKK1RoaXMgaXMgZXF1aXZhbGVudCB0byBkZWZpbmluZyB0aGUgUFlUSE9OTEVHQUNZV0lORE9XU0ZTRU5DT0RJTkcgXG5cCitlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgbGF1bmNoaW5nIFB5dGhvbi4iCispOworCitzdGF0aWMgUHlPYmplY3QgKgorc3lzX2VuYWJsZWxlZ2FjeXdpbmRvd3Nmc2VuY29kaW5nKFB5T2JqZWN0ICpzZWxmKQoreworICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgPSAibWJjcyI7CisgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGVFcnJvcnMgPSAicmVwbGFjZSI7CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKICNpZmRlZiBIQVZFX0RMT1BFTgpAQCAtMTE1Miw4ICsxMjg0LDEwIEBACiBzeXNfZGVidWdtYWxsb2NzdGF0cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAjaWZkZWYgV0lUSF9QWU1BTExPQwotICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKHN0ZGVycik7Ci0gICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyAgICBpZiAoX1B5TWVtX1B5bWFsbG9jRW5hYmxlZCgpKSB7CisgICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKHN0ZGVycik7CisgICAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CisgICAgfQogI2VuZGlmCiAgICAgX1B5T2JqZWN0X0RlYnVnVHlwZVN0YXRzKHN0ZGVycik7CiAKQEAgLTEyMzMsNiArMTM2Nyw4IEBACiAjZW5kaWYKICAgICB7ImdldGZpbGVzeXN0ZW1lbmNvZGluZyIsIChQeUNGdW5jdGlvbilzeXNfZ2V0ZmlsZXN5c3RlbWVuY29kaW5nLAogICAgICBNRVRIX05PQVJHUywgZ2V0ZmlsZXN5c3RlbWVuY29kaW5nX2RvY30sCisgICAgeyAiZ2V0ZmlsZXN5c3RlbWVuY29kZWVycm9ycyIsIChQeUNGdW5jdGlvbilzeXNfZ2V0ZmlsZXN5c3RlbWVuY29kZWVycm9ycywKKyAgICAgTUVUSF9OT0FSR1MsIGdldGZpbGVzeXN0ZW1lbmNvZGVlcnJvcnNfZG9jIH0sCiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwogICAgIHsiZ2V0b2JqZWN0cyIsICAgICAgX1B5X0dldE9iamVjdHMsIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKQEAgLTEyNDgsNiArMTM4NCw4IEBACiAjaWZkZWYgTVNfV0lORE9XUwogICAgIHsiZ2V0d2luZG93c3ZlcnNpb24iLCAoUHlDRnVuY3Rpb24pc3lzX2dldHdpbmRvd3N2ZXJzaW9uLCBNRVRIX05PQVJHUywKICAgICAgZ2V0d2luZG93c3ZlcnNpb25fZG9jfSwKKyAgICB7Il9lbmFibGVsZWdhY3l3aW5kb3dzZnNlbmNvZGluZyIsIChQeUNGdW5jdGlvbilzeXNfZW5hYmxlbGVnYWN5d2luZG93c2ZzZW5jb2RpbmcsCisgICAgIE1FVEhfTk9BUkdTLCBlbmFibGVsZWdhY3l3aW5kb3dzZnNlbmNvZGluZ19kb2MgfSwKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAgICAgeyJpbnRlcm4iLCAgICAgICAgICBzeXNfaW50ZXJuLCAgICAgTUVUSF9WQVJBUkdTLCBpbnRlcm5fZG9jfSwKICAgICB7ImlzX2ZpbmFsaXppbmciLCAgIHN5c19pc19maW5hbGl6aW5nLCBNRVRIX05PQVJHUywgaXNfZmluYWxpemluZ19kb2N9LApAQCAtMTI4NCw2ICsxNDIyLDEwIEBACiAgICAgIHNldF9jb3JvdXRpbmVfd3JhcHBlcl9kb2N9LAogICAgIHsiZ2V0X2Nvcm91dGluZV93cmFwcGVyIiwgc3lzX2dldF9jb3JvdXRpbmVfd3JhcHBlciwgTUVUSF9OT0FSR1MsCiAgICAgIGdldF9jb3JvdXRpbmVfd3JhcHBlcl9kb2N9LAorICAgIHsic2V0X2FzeW5jZ2VuX2hvb2tzIiwgKFB5Q0Z1bmN0aW9uKXN5c19zZXRfYXN5bmNnZW5faG9va3MsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHNldF9hc3luY2dlbl9ob29rc19kb2N9LAorICAgIHsiZ2V0X2FzeW5jZ2VuX2hvb2tzIiwgc3lzX2dldF9hc3luY2dlbl9ob29rcywgTUVUSF9OT0FSR1MsCisgICAgIGdldF9hc3luY2dlbl9ob29rc19kb2N9LAogICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCkBAIC0xNDY0LDE0ICsxNjA2LDIxIEBACiB2ZXJzaW9uX2luZm8gLS0gdmVyc2lvbiBpbmZvcm1hdGlvbiBhcyBhIG5hbWVkIHR1cGxlXG5cCiAiCiApCi0jaWZkZWYgTVNfV0lORE9XUworI2lmZGVmIE1TX0NPUkVETEwKIC8qIGNvbmNhdGVuYXRpbmcgc3RyaW5nIGhlcmUgKi8KIFB5RG9jX1NUUigKICJkbGxoYW5kbGUgLS0gW1dpbmRvd3Mgb25seV0gaW50ZWdlciBoYW5kbGUgb2YgdGhlIFB5dGhvbiBETExcblwKIHdpbnZlciAtLSBbV2luZG93cyBvbmx5XSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgUHl0aG9uIERMTFxuXAogIgogKQotI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KKyNlbmRpZiAvKiBNU19DT1JFRExMICovCisjaWZkZWYgTVNfV0lORE9XUworLyogY29uY2F0ZW5hdGluZyBzdHJpbmcgaGVyZSAqLworUHlEb2NfU1RSKAorIl9lbmFibGVsZWdhY3l3aW5kb3dzZnNlbmNvZGluZyAtLSBbV2luZG93cyBvbmx5XSBcblwKKyIKKykKKyNlbmRpZgogUHlEb2NfU1RSKAogIl9fc3RkaW5fXyAtLSB0aGUgb3JpZ2luYWwgc3RkaW47IGRvbid0IHRvdWNoIVxuXAogX19zdGRvdXRfXyAtLSB0aGUgb3JpZ2luYWwgc3Rkb3V0OyBkb24ndCB0b3VjaCFcblwKQEAgLTE2NDMsMTUgKzE3OTIsMTEgQEAKIC8qIHN5cy5pbXBsZW1lbnRhdGlvbiB2YWx1ZXMgKi8KICNkZWZpbmUgTkFNRSAiY3B5dGhvbiIKIGNvbnN0IGNoYXIgKl9QeVN5c19JbXBsTmFtZSA9IE5BTUU7Ci0jZGVmaW5lIFFVT1RFKGFyZykgI2FyZwotI2RlZmluZSBTVFJJRlkobmFtZSkgUVVPVEUobmFtZSkKLSNkZWZpbmUgTUFKT1IgU1RSSUZZKFBZX01BSk9SX1ZFUlNJT04pCi0jZGVmaW5lIE1JTk9SIFNUUklGWShQWV9NSU5PUl9WRVJTSU9OKQorI2RlZmluZSBNQUpPUiBQeV9TVFJJTkdJRlkoUFlfTUFKT1JfVkVSU0lPTikKKyNkZWZpbmUgTUlOT1IgUHlfU1RSSU5HSUZZKFBZX01JTk9SX1ZFUlNJT04pCiAjZGVmaW5lIFRBRyBOQU1FICItIiBNQUpPUiBNSU5PUgogY29uc3QgY2hhciAqX1B5U3lzX0ltcGxDYWNoZVRhZyA9IFRBRzsKICN1bmRlZiBOQU1FCi0jdW5kZWYgUVVPVEUKLSN1bmRlZiBTVFJJRlkKICN1bmRlZiBNQUpPUgogI3VuZGVmIE1JTk9SCiAjdW5kZWYgVEFHCkBAIC0xNjk2LDYgKzE4NDEsMTYgQEAKICAgICBpZiAocmVzIDwgMCkKICAgICAgICAgZ290byBlcnJvcjsKIAorI2lmZGVmIE1VTFRJQVJDSAorICAgIHZhbHVlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoTVVMVElBUkNIKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICByZXMgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhpbXBsX2luZm8sICJfbXVsdGlhcmNoIiwgdmFsdWUpOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisjZW5kaWYKKwogICAgIC8qIGRpY3QgcmVhZHkgKi8KIAogICAgIG5zID0gX1B5TmFtZXNwYWNlX05ldyhpbXBsX2luZm8pOwpAQCAtMTkwNiw2ICsyMDYxLDE0IEBACiAgICAgU0VUX1NZU19GUk9NX1NUUklORygidGhyZWFkX2luZm8iLCBQeVRocmVhZF9HZXRJbmZvKCkpOwogI2VuZGlmCiAKKyAgICAvKiBpbml0aWFsaXplIGFzeW5jZ2VuX2hvb2tzICovCisgICAgaWYgKEFzeW5jR2VuSG9va3NUeXBlLnRwX25hbWUgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZTIoCisgICAgICAgICAgICAgICAgJkFzeW5jR2VuSG9va3NUeXBlLCAmYXN5bmNnZW5faG9va3NfZGVzYykgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKwogI3VuZGVmIFNFVF9TWVNfRlJPTV9TVFJJTkcKICN1bmRlZiBTRVRfU1lTX0ZST01fU1RSSU5HX0JPUlJPVwogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQpAQCAtMjAwMiw3ICsyMTY1LDcgQEAKICNlbmRpZgogI2lmIGRlZmluZWQoSEFWRV9SRUFMUEFUSCkKICAgICB3Y2hhcl90IGZ1bGxwYXRoW01BWFBBVEhMRU5dOwotI2VsaWYgZGVmaW5lZChNU19XSU5ET1dTKSAmJiAhZGVmaW5lZChNU19XSU5DRSkKKyNlbGlmIGRlZmluZWQoTVNfV0lORE9XUykKICAgICB3Y2hhcl90IGZ1bGxwYXRoW01BWF9QQVRIXTsKICNlbmRpZgogCkBAIC0yMDQxLDEwICsyMjA0LDggQEAKICNpZiBTRVAgPT0gJ1xcJyAvKiBTcGVjaWFsIGNhc2UgZm9yIE1TIGZpbGVuYW1lIHN5bnRheCAqLwogICAgIGlmIChfSEFWRV9TQ1JJUFRfQVJHVU1FTlQoYXJnYywgYXJndikpIHsKICAgICAgICAgd2NoYXJfdCAqcTsKLSNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpICYmICFkZWZpbmVkKE1TX1dJTkNFKQotICAgICAgICAvKiBUaGlzIGNvZGUgaGVyZSByZXBsYWNlcyB0aGUgZmlyc3QgZWxlbWVudCBpbiBhcmd2IHdpdGggdGhlIGZ1bGwKLSAgICAgICAgcGF0aCB0aGF0IGl0IHJlcHJlc2VudHMuIFVuZGVyIENFLCB0aGVyZSBhcmUgbm8gcmVsYXRpdmUgcGF0aHMgc28KLSAgICAgICAgdGhlIGFyZ3VtZW50IG11c3QgYmUgdGhlIGZ1bGwgcGF0aCBhbnl3YXkuICovCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKQorICAgICAgICAvKiBSZXBsYWNlIHRoZSBmaXJzdCBlbGVtZW50IGluIGFyZ3Ygd2l0aCB0aGUgZnVsbCBwYXRoLiAqLwogICAgICAgICB3Y2hhcl90ICpwdGVtcDsKICAgICAgICAgaWYgKEdldEZ1bGxQYXRoTmFtZVcoYXJndjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9BUlJBWV9MRU5HVEgoZnVsbHBhdGgpLApAQCAtMjExNCw3ICsyMjc1LDcgQEAKIHN0YXRpYyBpbnQKIHN5c19weWZpbGVfd3JpdGVfdW5pY29kZShQeU9iamVjdCAqdW5pY29kZSwgUHlPYmplY3QgKmZpbGUpCiB7Ci0gICAgUHlPYmplY3QgKndyaXRlciA9IE5VTEwsICphcmdzID0gTlVMTCwgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKndyaXRlciA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOwogICAgIGludCBlcnI7CiAKICAgICBpZiAoZmlsZSA9PSBOVUxMKQpAQCAtMjEyNCwxMSArMjI4NSw3IEBACiAgICAgaWYgKHdyaXRlciA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycm9yOwogCi0gICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB1bmljb2RlKTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICBnb3RvIGVycm9yOwotCi0gICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3Qod3JpdGVyLCBhcmdzKTsKKyAgICByZXN1bHQgPSBfUHlPYmplY3RfQ2FsbEFyZzEod3JpdGVyLCB1bmljb2RlKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9IGVsc2UgewpAQCAtMjE0MCw3ICsyMjk3LDYgQEAKICAgICBlcnIgPSAtMTsKIGZpbmFsbHk6CiAgICAgUHlfWERFQ1JFRih3cml0ZXIpOwotICAgIFB5X1hERUNSRUYoYXJncyk7CiAgICAgUHlfWERFQ1JFRihyZXN1bHQpOwogICAgIHJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX250LmggYi9QeXRob24vdGhyZWFkX250LmgKaW5kZXggYjI5YjFiNi4uNzRhNmVlOCAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9udC5oCisrKyBiL1B5dGhvbi90aHJlYWRfbnQuaApAQCAtNzcsNyArNzcsNyBAQAogICAgICAgICAvKiB3YWl0IGF0IGxlYXN0IHVudGlsIHRoZSB0YXJnZXQgKi8KICAgICAgICAgRFdPUkQgbm93LCB0YXJnZXQgPSBHZXRUaWNrQ291bnQoKSArIG1pbGxpc2Vjb25kczsKICAgICAgICAgd2hpbGUgKG11dGV4LT5sb2NrZWQpIHsKLSAgICAgICAgICAgIGlmIChQeUNPTkRfVElNRURXQUlUKCZtdXRleC0+Y3YsICZtdXRleC0+Y3MsIChQWV9MT05HX0xPTkcpbWlsbGlzZWNvbmRzKjEwMDApIDwgMCkgeworICAgICAgICAgICAgaWYgKFB5Q09ORF9USU1FRFdBSVQoJm11dGV4LT5jdiwgJm11dGV4LT5jcywgKGxvbmcgbG9uZyltaWxsaXNlY29uZHMqMTAwMCkgPCAwKSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gV0FJVF9GQUlMRUQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNjEsMTEgKzE2MSw3IEBACiAKIC8qIHRodW5rZXIgdG8gY2FsbCBhZGFwdCBiZXR3ZWVuIHRoZSBmdW5jdGlvbiB0eXBlIHVzZWQgYnkgdGhlIHN5c3RlbSdzCiB0aHJlYWQgc3RhcnQgZnVuY3Rpb24gYW5kIHRoZSBpbnRlcm5hbGx5IHVzZWQgb25lLiAqLwotI2lmIGRlZmluZWQoTVNfV0lOQ0UpCi1zdGF0aWMgRFdPUkQgV0lOQVBJCi0jZWxzZQogc3RhdGljIHVuc2lnbmVkIF9fc3RkY2FsbAotI2VuZGlmCiBib290c3RyYXAodm9pZCAqY2FsbCkKIHsKICAgICBjYWxsb2JqICpvYmogPSAoY2FsbG9iaiopY2FsbDsKQEAgLTE5MywzMiArMTg5LDE4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICBvYmotPmZ1bmMgPSBmdW5jOwogICAgIG9iai0+YXJnID0gYXJnOwotI2lmIGRlZmluZWQoTVNfV0lOQ0UpCi0gICAgaFRocmVhZCA9IENyZWF0ZVRocmVhZChOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfU0FGRV9ET1dOQ0FTVChfcHl0aHJlYWRfc3RhY2tzaXplLCBQeV9zc2l6ZV90LCBTSVpFX1QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwLCBvYmosIDAsICZ0aHJlYWRJRCk7Ci0jZWxzZQogICAgIGhUaHJlYWQgPSAoSEFORExFKV9iZWdpbnRocmVhZGV4KDAsCiAgICAgICAgICAgICAgICAgICAgICAgUHlfU0FGRV9ET1dOQ0FTVChfcHl0aHJlYWRfc3RhY2tzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCwgdW5zaWduZWQgaW50KSwKICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXAsIG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAwLCAmdGhyZWFkSUQpOwotI2VuZGlmCiAgICAgaWYgKGhUaHJlYWQgPT0gMCkgewotI2lmIGRlZmluZWQoTVNfV0lOQ0UpCi0gICAgICAgIC8qIFNhdmUgZXJyb3IgaW4gdmFyaWFibGUsIHRvIHByZXZlbnQgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudAotICAgICAgICAgICBmcm9tIGNsb2JiZXJpbmcgaXQuICovCi0gICAgICAgIHVuc2lnbmVkIGUgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBmYWlsZWQsIHdpbjMyIGVycm9yIGNvZGUgJXVcbiIsCi0gICAgICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgZSkpOwotI2Vsc2UKICAgICAgICAgLyogSSd2ZSBzZWVuIGVycm5vID09IEVBR0FJTiBoZXJlLCB3aGljaCBtZWFucyAidGhlcmUgYXJlCiAgICAgICAgICAqIHRvbyBtYW55IHRocmVhZHMiLgogICAgICAgICAgKi8KICAgICAgICAgaW50IGUgPSBlcnJubzsKICAgICAgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBmYWlsZWQsIGVycm5vICVkXG4iLAogICAgICAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIGUpKTsKLSNlbmRpZgogICAgICAgICB0aHJlYWRJRCA9ICh1bnNpZ25lZCktMTsKICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2JqKTsKICAgICB9CkBAIC0yNDksMTEgKzIzMSw3IEBACiAgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpKTsKICAgICBpZiAoIWluaXRpYWxpemVkKQogICAgICAgICBleGl0KDApOwotI2lmIGRlZmluZWQoTVNfV0lOQ0UpCi0gICAgRXhpdFRocmVhZCgwKTsKLSNlbHNlCiAgICAgX2VuZHRocmVhZGV4KDApOwotI2VuZGlmCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9QeXRob24vdHJhY2ViYWNrLmMgYi9QeXRob24vdHJhY2ViYWNrLmMKaW5kZXggOTQxZDFjYi4uZThhYWMxYiAxMDA2NDQKLS0tIGEvUHl0aG9uL3RyYWNlYmFjay5jCisrKyBiL1B5dGhvbi90cmFjZWJhY2suYwpAQCAtMzE0LDcgKzMxNCw3IEBACiAgICAgaWYgKGZvYiA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAKLSAgICAgICAgcmVzID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChiaW5hcnksICZQeUlkX2Nsb3NlLCAiIik7CisgICAgICAgIHJlcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoYmluYXJ5LCAmUHlJZF9jbG9zZSwgTlVMTCk7CiAgICAgICAgIFB5X0RFQ1JFRihiaW5hcnkpOwogICAgICAgICBpZiAocmVzKQogICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CkBAIC0zMzQsNyArMzM0LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIHJlcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm9iLCAmUHlJZF9jbG9zZSwgIiIpOworICAgIHJlcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm9iLCAmUHlJZF9jbG9zZSwgTlVMTCk7CiAgICAgaWYgKHJlcykKICAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAgICAgZWxzZQpAQCAtNDEyLDYgKzQxMiwxMSBAQAogewogICAgIGludCBlcnIgPSAwOwogICAgIGxvbmcgZGVwdGggPSAwOworICAgIFB5T2JqZWN0ICpsYXN0X2ZpbGUgPSBOVUxMOworICAgIGludCBsYXN0X2xpbmUgPSAtMTsKKyAgICBQeU9iamVjdCAqbGFzdF9uYW1lID0gTlVMTDsKKyAgICBsb25nIGNudCA9IDA7CisgICAgUHlPYmplY3QgKmxpbmU7CiAgICAgUHlUcmFjZWJhY2tPYmplY3QgKnRiMSA9IHRiOwogICAgIHdoaWxlICh0YjEgIT0gTlVMTCkgewogICAgICAgICBkZXB0aCsrOwpAQCAtNDE5LDE2ICs0MjQsNDEgQEAKICAgICB9CiAgICAgd2hpbGUgKHRiICE9IE5VTEwgJiYgZXJyID09IDApIHsKICAgICAgICAgaWYgKGRlcHRoIDw9IGxpbWl0KSB7Ci0gICAgICAgICAgICBlcnIgPSB0Yl9kaXNwbGF5bGluZShmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGItPnRiX2ZyYW1lLT5mX2NvZGUtPmNvX2ZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGItPnRiX2xpbmVubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiLT50Yl9mcmFtZS0+Zl9jb2RlLT5jb19uYW1lKTsKKyAgICAgICAgICAgIGlmIChsYXN0X2ZpbGUgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIHRiLT50Yl9mcmFtZS0+Zl9jb2RlLT5jb19maWxlbmFtZSA9PSBsYXN0X2ZpbGUgJiYKKyAgICAgICAgICAgICAgICBsYXN0X2xpbmUgIT0gLTEgJiYgdGItPnRiX2xpbmVubyA9PSBsYXN0X2xpbmUgJiYKKyAgICAgICAgICAgICAgICBsYXN0X25hbWUgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIHRiLT50Yl9mcmFtZS0+Zl9jb2RlLT5jb19uYW1lID09IGxhc3RfbmFtZSkgeworICAgICAgICAgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoY250ID4gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgW1ByZXZpb3VzIGxpbmUgcmVwZWF0ZWQgJWQgbW9yZSB0aW1lc11cbiIsIGNudC0zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChsaW5lLCBmLCBQeV9QUklOVF9SQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxpbmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxhc3RfZmlsZSA9IHRiLT50Yl9mcmFtZS0+Zl9jb2RlLT5jb19maWxlbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lID0gdGItPnRiX2xpbmVubzsKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9uYW1lID0gdGItPnRiX2ZyYW1lLT5mX2NvZGUtPmNvX25hbWU7CisgICAgICAgICAgICAgICAgICAgIGNudCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNudCA8IDMpCisgICAgICAgICAgICAgICAgZXJyID0gdGJfZGlzcGxheWxpbmUoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yi0+dGJfZnJhbWUtPmZfY29kZS0+Y29fZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGItPnRiX2xpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yi0+dGJfZnJhbWUtPmZfY29kZS0+Y29fbmFtZSk7CiAgICAgICAgIH0KICAgICAgICAgZGVwdGgtLTsKICAgICAgICAgdGIgPSB0Yi0+dGJfbmV4dDsKICAgICAgICAgaWYgKGVyciA9PSAwKQogICAgICAgICAgICAgZXJyID0gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CiAgICAgfQorICAgIGlmIChjbnQgPiAzKSB7CisgICAgICAgIGxpbmUgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgKKyAgICAgICAgIiAgW1ByZXZpb3VzIGxpbmUgcmVwZWF0ZWQgJWQgbW9yZSB0aW1lc11cbiIsIGNudC0zKTsKKyAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KGxpbmUsIGYsIFB5X1BSSU5UX1JBVyk7CisgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKKyAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtNDc5LDQwICs1MDksMjYgQEAKIAogICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KIAotc3RhdGljIHZvaWQKLXJldmVyc2Vfc3RyaW5nKGNoYXIgKnRleHQsIGNvbnN0IHNpemVfdCBsZW4pCit2b2lkCitfUHlfRHVtcERlY2ltYWwoaW50IGZkLCB1bnNpZ25lZCBsb25nIHZhbHVlKQogewotICAgIGNoYXIgdG1wOwotICAgIHNpemVfdCBpLCBqOwotICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIGZvciAoaT0wLCBqPWxlbi0xOyBpIDwgajsgaSsrLCBqLS0pIHsKLSAgICAgICAgdG1wID0gdGV4dFtpXTsKLSAgICAgICAgdGV4dFtpXSA9IHRleHRbal07Ci0gICAgICAgIHRleHRbal0gPSB0bXA7Ci0gICAgfQotfQorICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVxdWlyZWQgZm9yIG91dHB1dCBvZiAlbGxkIG9yICVwLgorICAgICAgIFdlIG5lZWQgYXQgbW9zdCBjZWlsKGxvZzEwKDI1NikqU0laRU9GX0xPTkdfTE9ORykgZGlnaXRzLAorICAgICAgIHBsdXMgMSBmb3IgdGhlIG51bGwgYnl0ZS4gIDUzLzIyIGlzIGFuIHVwcGVyIGJvdW5kIGZvciBsb2cxMCgyNTYpLiAqLworICAgIGNoYXIgYnVmZmVyWzEgKyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjUzLTEpIC8gMjIgKyAxXTsKKyAgICBjaGFyICpwdHIsICplbmQ7CiAKLS8qIEZvcm1hdCBhbiBpbnRlZ2VyIGluIHJhbmdlIFswOyA5OTk5OTldIHRvIGRlY2ltYWwsCi0gICBhbmQgd3JpdGUgaXQgaW50byB0aGUgZmlsZSBmZC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfZGVjaW1hbChpbnQgZmQsIGludCB2YWx1ZSkKLXsKLSAgICBjaGFyIGJ1ZmZlcls3XTsKLSAgICBpbnQgbGVuOwotICAgIGlmICh2YWx1ZSA8IDAgfHwgOTk5OTk5IDwgdmFsdWUpCi0gICAgICAgIHJldHVybjsKLSAgICBsZW4gPSAwOworICAgIGVuZCA9ICZidWZmZXJbUHlfQVJSQVlfTEVOR1RIKGJ1ZmZlcikgLSAxXTsKKyAgICBwdHIgPSBlbmQ7CisgICAgKnB0ciA9ICdcMCc7CiAgICAgZG8gewotICAgICAgICBidWZmZXJbbGVuXSA9ICcwJyArICh2YWx1ZSAlIDEwKTsKKyAgICAgICAgLS1wdHI7CisgICAgICAgIGFzc2VydChwdHIgPj0gYnVmZmVyKTsKKyAgICAgICAgKnB0ciA9ICcwJyArICh2YWx1ZSAlIDEwKTsKICAgICAgICAgdmFsdWUgLz0gMTA7Ci0gICAgICAgIGxlbisrOwogICAgIH0gd2hpbGUgKHZhbHVlKTsKLSAgICByZXZlcnNlX3N0cmluZyhidWZmZXIsIGxlbik7Ci0gICAgX1B5X3dyaXRlX25vcmFpc2UoZmQsIGJ1ZmZlciwgbGVuKTsKKworICAgIF9QeV93cml0ZV9ub3JhaXNlKGZkLCBwdHIsIGVuZCAtIHB0cik7CiB9CiAKIC8qIEZvcm1hdCBhbiBpbnRlZ2VyIGluIHJhbmdlIFswOyAweGZmZmZmZmZmXSB0byBoZXhhZGVjaW1hbCBvZiAnd2lkdGgnIGRpZ2l0cywKQEAgLTUyMCwyNyArNTM2LDMxIEBACiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCiAKLXN0YXRpYyB2b2lkCi1kdW1wX2hleGFkZWNpbWFsKGludCBmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSwgaW50IHdpZHRoKQordm9pZAorX1B5X0R1bXBIZXhhZGVjaW1hbChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgdmFsdWUsIFB5X3NzaXplX3Qgd2lkdGgpCiB7Ci0gICAgaW50IGxlbjsKLSAgICBjaGFyIGJ1ZmZlcltzaXplb2YodW5zaWduZWQgbG9uZykgKiAyICsgMV07Ci0gICAgbGVuID0gMDsKKyAgICBjaGFyIGJ1ZmZlcltzaXplb2YodW5zaWduZWQgbG9uZykgKiAyICsgMV0sICpwdHIsICplbmQ7CisgICAgY29uc3QgUHlfc3NpemVfdCBzaXplID0gUHlfQVJSQVlfTEVOR1RIKGJ1ZmZlcikgLSAxOworCisgICAgaWYgKHdpZHRoID4gc2l6ZSkKKyAgICAgICAgd2lkdGggPSBzaXplOworICAgIC8qIGl0J3Mgb2sgaWYgd2lkdGggaXMgbmVnYXRpdmUgKi8KKworICAgIGVuZCA9ICZidWZmZXJbc2l6ZV07CisgICAgcHRyID0gZW5kOworICAgICpwdHIgPSAnXDAnOwogICAgIGRvIHsKLSAgICAgICAgYnVmZmVyW2xlbl0gPSBQeV9oZXhkaWdpdHNbdmFsdWUgJiAxNV07CisgICAgICAgIC0tcHRyOworICAgICAgICBhc3NlcnQocHRyID49IGJ1ZmZlcik7CisgICAgICAgICpwdHIgPSBQeV9oZXhkaWdpdHNbdmFsdWUgJiAxNV07CiAgICAgICAgIHZhbHVlID4+PSA0OwotICAgICAgICBsZW4rKzsKLSAgICB9IHdoaWxlIChsZW4gPCB3aWR0aCB8fCB2YWx1ZSk7Ci0gICAgcmV2ZXJzZV9zdHJpbmcoYnVmZmVyLCBsZW4pOwotICAgIF9QeV93cml0ZV9ub3JhaXNlKGZkLCBidWZmZXIsIGxlbik7CisgICAgfSB3aGlsZSAoKGVuZCAtIHB0cikgPCB3aWR0aCB8fCB2YWx1ZSk7CisKKyAgICBfUHlfd3JpdGVfbm9yYWlzZShmZCwgcHRyLCBlbmQgLSBwdHIpOwogfQogCi0vKiBXcml0ZSBhbiB1bmljb2RlIG9iamVjdCBpbnRvIHRoZSBmaWxlIGZkIHVzaW5nIGFzY2lpK2JhY2tzbGFzaHJlcGxhY2UuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2FzY2lpKGludCBmZCwgUHlPYmplY3QgKnRleHQpCit2b2lkCitfUHlfRHVtcEFTQ0lJKGludCBmZCwgUHlPYmplY3QgKnRleHQpCiB7CiAgICAgUHlBU0NJSU9iamVjdCAqYXNjaWkgPSAoUHlBU0NJSU9iamVjdCAqKXRleHQ7CiAgICAgUHlfc3NpemVfdCBpLCBzaXplOwpAQCAtNTUwLDMyICs1NzAsMzYgQEAKICAgICB3Y2hhcl90ICp3c3RyID0gTlVMTDsKICAgICBQeV9VQ1M0IGNoOwogCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodGV4dCkpCisgICAgICAgIHJldHVybjsKKwogICAgIHNpemUgPSBhc2NpaS0+bGVuZ3RoOwogICAgIGtpbmQgPSBhc2NpaS0+c3RhdGUua2luZDsKLSAgICBpZiAoYXNjaWktPnN0YXRlLmNvbXBhY3QpIHsKKyAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfV0NIQVJfS0lORCkgeworICAgICAgICB3c3RyID0gKChQeUFTQ0lJT2JqZWN0ICopdGV4dCktPndzdHI7CisgICAgICAgIGlmICh3c3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHNpemUgPSAoKFB5Q29tcGFjdFVuaWNvZGVPYmplY3QgKil0ZXh0KS0+d3N0cl9sZW5ndGg7CisgICAgfQorICAgIGVsc2UgaWYgKGFzY2lpLT5zdGF0ZS5jb21wYWN0KSB7CiAgICAgICAgIGlmIChhc2NpaS0+c3RhdGUuYXNjaWkpCiAgICAgICAgICAgICBkYXRhID0gKChQeUFTQ0lJT2JqZWN0Kil0ZXh0KSArIDE7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGRhdGEgPSAoKFB5Q29tcGFjdFVuaWNvZGVPYmplY3QqKXRleHQpICsgMTsKICAgICB9Ci0gICAgZWxzZSBpZiAoa2luZCAhPSBQeVVuaWNvZGVfV0NIQVJfS0lORCkgeworICAgIGVsc2UgewogICAgICAgICBkYXRhID0gKChQeVVuaWNvZGVPYmplY3QgKil0ZXh0KS0+ZGF0YS5hbnk7CiAgICAgICAgIGlmIChkYXRhID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICB3c3RyID0gKChQeUFTQ0lJT2JqZWN0ICopdGV4dCktPndzdHI7Ci0gICAgICAgIGlmICh3c3RyID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHNpemUgPSAoKFB5Q29tcGFjdFVuaWNvZGVPYmplY3QgKil0ZXh0KS0+d3N0cl9sZW5ndGg7Ci0gICAgfQogCiAgICAgaWYgKE1BWF9TVFJJTkdfTEVOR1RIIDwgc2l6ZSkgewogICAgICAgICBzaXplID0gTUFYX1NUUklOR19MRU5HVEg7CiAgICAgICAgIHRydW5jYXRlZCA9IDE7CiAgICAgfQotICAgIGVsc2UKKyAgICBlbHNlIHsKICAgICAgICAgdHJ1bmNhdGVkID0gMDsKKyAgICB9CiAKICAgICBmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBpZiAoa2luZCAhPSBQeVVuaWNvZGVfV0NIQVJfS0lORCkKQEAgLTU4OSwxOSArNjEzLDIwIEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoY2ggPD0gMHhmZikgewogICAgICAgICAgICAgUFVUUyhmZCwgIlxceCIpOwotICAgICAgICAgICAgZHVtcF9oZXhhZGVjaW1hbChmZCwgY2gsIDIpOworICAgICAgICAgICAgX1B5X0R1bXBIZXhhZGVjaW1hbChmZCwgY2gsIDIpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGNoIDw9IDB4ZmZmZikgewogICAgICAgICAgICAgUFVUUyhmZCwgIlxcdSIpOwotICAgICAgICAgICAgZHVtcF9oZXhhZGVjaW1hbChmZCwgY2gsIDQpOworICAgICAgICAgICAgX1B5X0R1bXBIZXhhZGVjaW1hbChmZCwgY2gsIDQpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgUFVUUyhmZCwgIlxcVSIpOwotICAgICAgICAgICAgZHVtcF9oZXhhZGVjaW1hbChmZCwgY2gsIDgpOworICAgICAgICAgICAgX1B5X0R1bXBIZXhhZGVjaW1hbChmZCwgY2gsIDgpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICh0cnVuY2F0ZWQpCisgICAgaWYgKHRydW5jYXRlZCkgewogICAgICAgICBQVVRTKGZkLCAiLi4uIik7CisgICAgfQogfQogCiAvKiBXcml0ZSBhIGZyYW1lIGludG8gdGhlIGZpbGUgZmQ6ICJGaWxlICJ4eHgiLCBsaW5lIHh4eCBpbiB4eHgiLgpAQCAtNjIwLDcgKzY0NSw3IEBACiAgICAgICAgICYmIFB5VW5pY29kZV9DaGVjayhjb2RlLT5jb19maWxlbmFtZSkpCiAgICAgewogICAgICAgICBQVVRTKGZkLCAiXCIiKTsKLSAgICAgICAgZHVtcF9hc2NpaShmZCwgY29kZS0+Y29fZmlsZW5hbWUpOworICAgICAgICBfUHlfRHVtcEFTQ0lJKGZkLCBjb2RlLT5jb19maWxlbmFtZSk7CiAgICAgICAgIFBVVFMoZmQsICJcIiIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIFBVVFMoZmQsICI/Pz8iKTsKQEAgLTYyOSwxNCArNjU0LDIxIEBACiAgICAgLyogUHlGcmFtZV9HZXRMaW5lTnVtYmVyKCkgd2FzIGludHJvZHVjZWQgaW4gUHl0aG9uIDIuNy4wIGFuZCAzLjIuMCAqLwogICAgIGxpbmVubyA9IFB5Q29kZV9BZGRyMkxpbmUoY29kZSwgZnJhbWUtPmZfbGFzdGkpOwogICAgIFBVVFMoZmQsICIsIGxpbmUgIik7Ci0gICAgZHVtcF9kZWNpbWFsKGZkLCBsaW5lbm8pOworICAgIGlmIChsaW5lbm8gPj0gMCkgeworICAgICAgICBfUHlfRHVtcERlY2ltYWwoZmQsICh1bnNpZ25lZCBsb25nKWxpbmVubyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQVVRTKGZkLCAiPz8/Iik7CisgICAgfQogICAgIFBVVFMoZmQsICIgaW4gIik7CiAKICAgICBpZiAoY29kZSAhPSBOVUxMICYmIGNvZGUtPmNvX25hbWUgIT0gTlVMTAotICAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2soY29kZS0+Y29fbmFtZSkpCi0gICAgICAgIGR1bXBfYXNjaWkoZmQsIGNvZGUtPmNvX25hbWUpOwotICAgIGVsc2UKKyAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2soY29kZS0+Y29fbmFtZSkpIHsKKyAgICAgICAgX1B5X0R1bXBBU0NJSShmZCwgY29kZS0+Y29fbmFtZSk7CisgICAgfQorICAgIGVsc2UgewogICAgICAgICBQVVRTKGZkLCAiPz8/Iik7CisgICAgfQogCiAgICAgUFVUUyhmZCwgIlxuIik7CiB9CkBAIC02OTIsNyArNzI0LDkgQEAKICAgICAgICAgUFVUUyhmZCwgIkN1cnJlbnQgdGhyZWFkIDB4Iik7CiAgICAgZWxzZQogICAgICAgICBQVVRTKGZkLCAiVGhyZWFkIDB4Iik7Ci0gICAgZHVtcF9oZXhhZGVjaW1hbChmZCwgKHVuc2lnbmVkIGxvbmcpdHN0YXRlLT50aHJlYWRfaWQsIHNpemVvZih1bnNpZ25lZCBsb25nKSoyKTsKKyAgICBfUHlfRHVtcEhleGFkZWNpbWFsKGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdHN0YXRlLT50aHJlYWRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZykgKiAyKTsKICAgICBQVVRTKGZkLCAiIChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KTpcbiIpOwogfQogCkBAIC03MDQsMTEgKzczOCw1NiBAQAogICAgaGFuZGxlcnMgaWYgc2lnbmFscyB3ZXJlIHJlY2VpdmVkLiAqLwogY29uc3QgY2hhcioKIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyhpbnQgZmQsIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwLAotICAgICAgICAgICAgICAgICAgICAgICAgIFB5VGhyZWFkU3RhdGUgKmN1cnJlbnRfdGhyZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgIFB5VGhyZWFkU3RhdGUgKmN1cnJlbnRfdHN0YXRlKQogewogICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKICAgICB1bnNpZ25lZCBpbnQgbnRocmVhZHM7CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGlmIChjdXJyZW50X3RzdGF0ZSA9PSBOVUxMKSB7CisgICAgICAgIC8qIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcygpIGlzIGNhbGxlZCBmcm9tIHNpZ25hbCBoYW5kbGVycyBieQorICAgICAgICAgICBmYXVsdGhhbmRsZXIuCisKKyAgICAgICAgICAgU0lHU0VHViwgU0lHRlBFLCBTSUdBQlJULCBTSUdCVVMgYW5kIFNJR0lMTCBhcmUgc3luY2hyb25vdXMgc2lnbmFscworICAgICAgICAgICBhbmQgYXJlIHRodXMgZGVsaXZlcmVkIHRvIHRoZSB0aHJlYWQgdGhhdCBjYXVzZWQgdGhlIGZhdWx0LiBHZXQgdGhlCisgICAgICAgICAgIFB5dGhvbiB0aHJlYWQgc3RhdGUgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLgorCisgICAgICAgICAgIFB5VGhyZWFkU3RhdGVfR2V0KCkgZG9lc24ndCBnaXZlIHRoZSBzdGF0ZSBvZiB0aGUgdGhyZWFkIHRoYXQgY2F1c2VkCisgICAgICAgICAgIHRoZSBmYXVsdCBpZiB0aGUgdGhyZWFkIHJlbGVhc2VkIHRoZSBHSUwsIGFuZCBzbyB0aGlzIGZ1bmN0aW9uCisgICAgICAgICAgIGNhbm5vdCBiZSB1c2VkLiBSZWFkIHRoZSB0aHJlYWQgbG9jYWwgc3RvcmFnZSAoVExTKSBpbnN0ZWFkOiBjYWxsCisgICAgICAgICAgIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCkuICovCisgICAgICAgIGN1cnJlbnRfdHN0YXRlID0gUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKTsKKyAgICB9CisKKyAgICBpZiAoaW50ZXJwID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRfdHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGludGVycCA9IF9QeUdJTFN0YXRlX0dldEludGVycHJldGVyU3RhdGVVbnNhZmUoKTsKKyAgICAgICAgICAgIGlmIChpbnRlcnAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdGhlIGludGVycHJldGVyIHN0YXRlIHRvIGdldCBQeXRob24gdGhyZWFkcyAqLworICAgICAgICAgICAgICAgIHJldHVybiAidW5hYmxlIHRvIGdldCB0aGUgaW50ZXJwcmV0ZXIgc3RhdGUiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50ZXJwID0gY3VycmVudF90c3RhdGUtPmludGVycDsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgaWYgKGN1cnJlbnRfdHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgLyogQ2FsbCBfUHlUaHJlYWRTdGF0ZV9VbmNoZWNrZWRHZXQoKSBpbnN0ZWFkIG9mIFB5VGhyZWFkU3RhdGVfR2V0KCkKKyAgICAgICAgICAgdG8gbm90IGZhaWwgd2l0aCBhIGZhdGFsIGVycm9yIGlmIHRoZSB0aHJlYWQgc3RhdGUgaXMgTlVMTC4gKi8KKyAgICAgICAgY3VycmVudF90c3RhdGUgPSBfUHlUaHJlYWRTdGF0ZV9VbmNoZWNrZWRHZXQoKTsKKyAgICB9CisKKyAgICBpZiAoaW50ZXJwID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRfdHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIFdlIG5lZWQgdGhlIGludGVycHJldGVyIHN0YXRlIHRvIGdldCBQeXRob24gdGhyZWFkcyAqLworICAgICAgICAgICAgcmV0dXJuICJ1bmFibGUgdG8gZ2V0IHRoZSBpbnRlcnByZXRlciBzdGF0ZSI7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJwID0gY3VycmVudF90c3RhdGUtPmludGVycDsKKyAgICB9CisjZW5kaWYKKyAgICBhc3NlcnQoaW50ZXJwICE9IE5VTEwpOworCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IGludGVycHJldGVyIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkICovCiAgICAgdHN0YXRlID0gUHlJbnRlcnByZXRlclN0YXRlX1RocmVhZEhlYWQoaW50ZXJwKTsKICAgICBpZiAodHN0YXRlID09IE5VTEwpCkBAIC03MjYsNyArODA1LDcgQEAKICAgICAgICAgICAgIFBVVFMoZmQsICIuLi5cbiIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgd3JpdGVfdGhyZWFkX2lkKGZkLCB0c3RhdGUsIHRzdGF0ZSA9PSBjdXJyZW50X3RocmVhZCk7CisgICAgICAgIHdyaXRlX3RocmVhZF9pZChmZCwgdHN0YXRlLCB0c3RhdGUgPT0gY3VycmVudF90c3RhdGUpOwogICAgICAgICBkdW1wX3RyYWNlYmFjayhmZCwgdHN0YXRlLCAwKTsKICAgICAgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9OZXh0KHRzdGF0ZSk7CiAgICAgICAgIG50aHJlYWRzKys7CmRpZmYgLS1naXQgYS9QeXRob24vd29yZGNvZGVfaGVscGVycy5oIGIvUHl0aG9uL3dvcmRjb2RlX2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjFiYTMzCi0tLSAvZGV2L251bGwKKysrIGIvUHl0aG9uL3dvcmRjb2RlX2hlbHBlcnMuaApAQCAtMCwwICsxLDM4IEBACisvKiBUaGlzIGZpbGUgY29udGFpbnMgY29kZSBzaGFyZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCB0aGUgcGVlcGhvbGUKKyAgIG9wdGltaXplci4KKyAqLworCisvKiBNaW5pbXVtIG51bWJlciBvZiBieXRlcyBuZWNlc3NhcnkgdG8gZW5jb2RlIGluc3RydWN0aW9uIHdpdGggRVhURU5ERURfQVJHcyAqLworc3RhdGljIGludAoraW5zdHJzaXplKHVuc2lnbmVkIGludCBvcGFyZykKK3sKKyAgICByZXR1cm4gb3BhcmcgPD0gMHhmZiA/IDIgOgorICAgICAgICBvcGFyZyA8PSAweGZmZmYgPyA0IDoKKyAgICAgICAgb3BhcmcgPD0gMHhmZmZmZmYgPyA2IDoKKyAgICAgICAgODsKK30KKworLyogU3BpdHMgb3V0IG9wL29wYXJnIHBhaXIgdXNpbmcgaWxlbiBieXRlcy4gY29kZXN0ciBzaG91bGQgYmUgcG9pbnRlZCBhdCB0aGUKKyAgIGRlc2lyZWQgbG9jYXRpb24gb2YgdGhlIGZpcnN0IEVYVEVOREVEX0FSRyAqLworc3RhdGljIHZvaWQKK3dyaXRlX29wX2FyZyh1bnNpZ25lZCBjaGFyICpjb2Rlc3RyLCB1bnNpZ25lZCBjaGFyIG9wY29kZSwKKyAgICB1bnNpZ25lZCBpbnQgb3BhcmcsIGludCBpbGVuKQoreworICAgIHN3aXRjaCAoaWxlbikgeworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAqY29kZXN0cisrID0gRVhURU5ERURfQVJHOworICAgICAgICAgICAgKmNvZGVzdHIrKyA9IChvcGFyZyA+PiAyNCkgJiAweGZmOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAqY29kZXN0cisrID0gRVhURU5ERURfQVJHOworICAgICAgICAgICAgKmNvZGVzdHIrKyA9IChvcGFyZyA+PiAxNikgJiAweGZmOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAqY29kZXN0cisrID0gRVhURU5ERURfQVJHOworICAgICAgICAgICAgKmNvZGVzdHIrKyA9IChvcGFyZyA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICpjb2Rlc3RyKysgPSBvcGNvZGU7CisgICAgICAgICAgICAqY29kZXN0cisrID0gb3BhcmcgJiAweGZmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IDQxNGI2NTguLmFkM2RiMjUgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTEsNSArMSw1IEBACi1UaGlzIGlzIFB5dGhvbiB2ZXJzaW9uIDMuNS4zIHJlbGVhc2UgY2FuZGlkYXRlIDEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhpcyBpcyBQeXRob24gdmVyc2lvbiAzLjYuMCBhbHBoYSA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLAogMjAxMiwgMjAxMywgMjAxNCwgMjAxNSwgMjAxNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkBAIC0yOCw5ICsyOCw5IEBACiBlbHNld2hlcmUgaXQncyBqdXN0IHB5dGhvbi4KIAogT24gTWFjIE9TIFgsIGlmIHlvdSBoYXZlIGNvbmZpZ3VyZWQgUHl0aG9uIHdpdGggLS1lbmFibGUtZnJhbWV3b3JrLCB5b3Ugc2hvdWxkCi11c2UgIm1ha2UgZnJhbWV3b3JraW5zdGFsbCIgdG8gZG8gdGhlIGluc3RhbGxhdGlvbi4gIE5vdGUgdGhhdCB0aGlzIGluc3RhbGxzCi10aGUgUHl0aG9uIGV4ZWN1dGFibGUgaW4gYSBwbGFjZSB0aGF0IGlzIG5vdCBub3JtYWxseSBvbiB5b3VyIFBBVEgsIHlvdSBtYXkKLXdhbnQgdG8gc2V0IHVwIGEgc3ltbGluayBpbiAvdXNyL2xvY2FsL2Jpbi4KK3VzZSAibWFrZSBmcmFtZXdvcmtpbnN0YWxsIiB0byBkbyB0aGUgaW5zdGFsbGF0aW9uLiAgTm90ZSB0aGF0IHRoaXMgaW5zdGFsbHMgdGhlCitQeXRob24gZXhlY3V0YWJsZSBpbiBhIHBsYWNlIHRoYXQgaXMgbm90IG5vcm1hbGx5IG9uIHlvdXIgUEFUSCwgeW91IG1heSB3YW50IHRvCitzZXQgdXAgYSBzeW1saW5rIGluIC91c3IvbG9jYWwvYmluLgogCiBPbiBXaW5kb3dzLCBzZWUgUENidWlsZC9yZWFkbWUudHh0LgogCkBAIC04OSw5ICs4OSw5IEBACiAtLS0tLS0tLS0tCiAKIFdlIGhhdmUgYSBjb21wcmVoZW5zaXZlIG92ZXJ2aWV3IG9mIHRoZSBjaGFuZ2VzIGluIHRoZSAiV2hhdCdzIE5ldyBpbgotUHl0aG9uIDMuNSIgZG9jdW1lbnQsIGZvdW5kIGF0CitQeXRob24gMy42IiBkb2N1bWVudCwgZm91bmQgYXQKIAotICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy41L3doYXRzbmV3LzMuNS5odG1sCisgICAgaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy42L3doYXRzbmV3LzMuNi5odG1sCiAKIEZvciBhIG1vcmUgZGV0YWlsZWQgY2hhbmdlIGxvZywgcmVhZCBNaXNjL05FV1MgKHRob3VnaCB0aGlzIGZpbGUsIHRvbywKIGlzIGluY29tcGxldGUsIGFuZCBhbHNvIGRvZXNuJ3QgbGlzdCBhbnl0aGluZyBtZXJnZWQgaW4gZnJvbSB0aGUgMi43CkBAIC0xMDQsOSArMTA0LDkgQEAKIERvY3VtZW50YXRpb24KIC0tLS0tLS0tLS0tLS0KIAotRG9jdW1lbnRhdGlvbiBmb3IgUHl0aG9uIDMuNSBpcyBvbmxpbmUsIHVwZGF0ZWQgZGFpbHk6CitEb2N1bWVudGF0aW9uIGZvciBQeXRob24gMy42IGlzIG9ubGluZSwgdXBkYXRlZCBkYWlseToKIAotICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy41LworICAgIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMuNi8KIAogSXQgY2FuIGFsc28gYmUgZG93bmxvYWRlZCBpbiBtYW55IGZvcm1hdHMgZm9yIGZhc3RlciBhY2Nlc3MuICBUaGUgZG9jdW1lbnRhdGlvbgogaXMgZG93bmxvYWRhYmxlIGluIEhUTUwsIFBERiwgYW5kIHJlU3RydWN0dXJlZFRleHQgZm9ybWF0czsgdGhlIGxhdHRlciB2ZXJzaW9uCkBAIC0xMTYsNyArMTE2LDcgQEAKIElmIHlvdSB3b3VsZCBsaWtlIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IG9mIFB5dGhvbiwgcmVsZXZhbnQKIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0OgogCi0gICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS8KKyAgICBodHRwczovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS8KIAogRm9yIGluZm9ybWF0aW9uIGFib3V0IGJ1aWxkaW5nIFB5dGhvbidzIGRvY3VtZW50YXRpb24sIHJlZmVyIHRvIERvYy9SRUFETUUudHh0LgogCkBAIC0xMzEsNyArMTMxLDcgQEAKIEEgc291cmNlLXRvLXNvdXJjZSB0cmFuc2xhdGlvbiB0b29sLCAiMnRvMyIsIGNhbiB0YWtlIGNhcmUgb2YgdGhlIG11bmRhbmUgdGFzawogb2YgY29udmVydGluZyBsYXJnZSBhbW91bnRzIG9mIHNvdXJjZSBjb2RlLiAgSXQgaXMgbm90IGEgY29tcGxldGUgc29sdXRpb24gYnV0CiBpcyBjb21wbGVtZW50ZWQgYnkgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGluIDIuNi4gIFNlZQotaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjUvbGlicmFyeS8ydG8zLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCitodHRwczovL2RvY3MucHl0aG9uLm9yZy8zLjYvbGlicmFyeS8ydG8zLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIAogVGVzdGluZwpAQCAtMTYxLDE2ICsxNjEsMTYgQEAKIAogT24gVW5peCBhbmQgTWFjIHN5c3RlbXMgaWYgeW91IGludGVuZCB0byBpbnN0YWxsIG11bHRpcGxlIHZlcnNpb25zIG9mIFB5dGhvbgogdXNpbmcgdGhlIHNhbWUgaW5zdGFsbGF0aW9uIHByZWZpeCAoLS1wcmVmaXggYXJndW1lbnQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQpCi15b3UgbXVzdCB0YWtlIGNhcmUgdGhhdCB5b3VyIHByaW1hcnkgcHl0aG9uIGV4ZWN1dGFibGUgaXMgbm90IG92ZXJ3cml0dGVuIGJ5Ci10aGUgaW5zdGFsbGF0aW9uIG9mIGEgZGlmZmVyZW50IHZlcnNpb24uICBBbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluc3RhbGxlZAotdXNpbmcgIm1ha2UgYWx0aW5zdGFsbCIgY29udGFpbiB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gYW5kIGNhbiB0aHVzIGxpdmUKLXNpZGUtYnktc2lkZS4gICJtYWtlIGluc3RhbGwiIGFsc28gY3JlYXRlcyAke3ByZWZpeH0vYmluL3B5dGhvbjMgd2hpY2ggcmVmZXJzCi10byAke3ByZWZpeH0vYmluL3B5dGhvblguWS4gIElmIHlvdSBpbnRlbmQgdG8gaW5zdGFsbCBtdWx0aXBsZSB2ZXJzaW9ucyB1c2luZwotdGhlIHNhbWUgcHJlZml4IHlvdSBtdXN0IGRlY2lkZSB3aGljaCB2ZXJzaW9uIChpZiBhbnkpIGlzIHlvdXIgInByaW1hcnkiCi12ZXJzaW9uLiAgSW5zdGFsbCB0aGF0IHZlcnNpb24gdXNpbmcgIm1ha2UgaW5zdGFsbCIuICBJbnN0YWxsIGFsbCBvdGhlcgotdmVyc2lvbnMgdXNpbmcgIm1ha2UgYWx0aW5zdGFsbCIuCit5b3UgbXVzdCB0YWtlIGNhcmUgdGhhdCB5b3VyIHByaW1hcnkgcHl0aG9uIGV4ZWN1dGFibGUgaXMgbm90IG92ZXJ3cml0dGVuIGJ5IHRoZQoraW5zdGFsbGF0aW9uIG9mIGEgZGlmZmVyZW50IHZlcnNpb24uICBBbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluc3RhbGxlZCB1c2luZworIm1ha2UgYWx0aW5zdGFsbCIgY29udGFpbiB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gYW5kIGNhbiB0aHVzIGxpdmUKK3NpZGUtYnktc2lkZS4gICJtYWtlIGluc3RhbGwiIGFsc28gY3JlYXRlcyAke3ByZWZpeH0vYmluL3B5dGhvbjMgd2hpY2ggcmVmZXJzIHRvCiske3ByZWZpeH0vYmluL3B5dGhvblguWS4gIElmIHlvdSBpbnRlbmQgdG8gaW5zdGFsbCBtdWx0aXBsZSB2ZXJzaW9ucyB1c2luZyB0aGUKK3NhbWUgcHJlZml4IHlvdSBtdXN0IGRlY2lkZSB3aGljaCB2ZXJzaW9uIChpZiBhbnkpIGlzIHlvdXIgInByaW1hcnkiIHZlcnNpb24uCitJbnN0YWxsIHRoYXQgdmVyc2lvbiB1c2luZyAibWFrZSBpbnN0YWxsIi4gIEluc3RhbGwgYWxsIG90aGVyIHZlcnNpb25zIHVzaW5nCisibWFrZSBhbHRpbnN0YWxsIi4KIAotRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGluc3RhbGwgUHl0aG9uIDIuNiwgMi43IGFuZCAzLjUgd2l0aCAyLjcgYmVpbmcgdGhlCitGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gaW5zdGFsbCBQeXRob24gMi42LCAyLjcgYW5kIDMuNiB3aXRoIDIuNyBiZWluZyB0aGUKIHByaW1hcnkgdmVyc2lvbiwgeW91IHdvdWxkIGV4ZWN1dGUgIm1ha2UgaW5zdGFsbCIgaW4geW91ciAyLjcgYnVpbGQgZGlyZWN0b3J5CiBhbmQgIm1ha2UgYWx0aW5zdGFsbCIgaW4gdGhlIG90aGVycy4KIApAQCAtMTgxLDcgKzE4MSw3IEBACiBXZSdyZSBzb2xpY2l0aW5nIGJ1ZyByZXBvcnRzIGFib3V0IGFsbCBhc3BlY3RzIG9mIHRoZSBsYW5ndWFnZS4gIEZpeGVzIGFyZSBhbHNvCiB3ZWxjb21lLCBwcmVmZXJhYmx5IGluIHVuaWZpZWQgZGlmZiBmb3JtYXQuICBQbGVhc2UgdXNlIHRoZSBpc3N1ZSB0cmFja2VyOgogCi0gICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy8KKyAgICBodHRwczovL2J1Z3MucHl0aG9uLm9yZy8KIAogSWYgeW91J3JlIG5vdCBzdXJlIHdoZXRoZXIgeW91J3JlIGRlYWxpbmcgd2l0aCBhIGJ1ZyBvciBhIGZlYXR1cmUsIHVzZSB0aGUKIG1haWxpbmcgbGlzdDoKQEAgLTE5MCwyMyArMTkwLDIzIEBACiAKIFRvIHN1YnNjcmliZSB0byB0aGUgbGlzdCwgdXNlIHRoZSBtYWlsbWFuIGZvcm06CiAKLSAgICBodHRwOi8vbWFpbC5weXRob24ub3JnL21haWxtYW4vbGlzdGluZm8vcHl0aG9uLWRldi8KKyAgICBodHRwczovL21haWwucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3B5dGhvbi1kZXYvCiAKIAogUHJvcG9zYWxzIGZvciBlbmhhbmNlbWVudAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJZiB5b3UgaGF2ZSBhIHByb3Bvc2FsIHRvIGNoYW5nZSBQeXRob24sIHlvdSBtYXkgd2FudCB0byBzZW5kIGFuIGVtYWlsIHRvIHRoZQotY29tcC5sYW5nLnB5dGhvbiBvciBweXRob24taWRlYXMgbWFpbGluZyBsaXN0cyBmb3IgaW5pdGFsIGZlZWRiYWNrLiAgQSBQeXRob24KK2NvbXAubGFuZy5weXRob24gb3IgcHl0aG9uLWlkZWFzIG1haWxpbmcgbGlzdHMgZm9yIGluaXRpYWwgZmVlZGJhY2suICBBIFB5dGhvbgogRW5oYW5jZW1lbnQgUHJvcG9zYWwgKFBFUCkgbWF5IGJlIHN1Ym1pdHRlZCBpZiB5b3VyIGlkZWEgZ2FpbnMgZ3JvdW5kLiAgQWxsCiBjdXJyZW50IFBFUHMsIGFzIHdlbGwgYXMgZ3VpZGVsaW5lcyBmb3Igc3VibWl0dGluZyBhIG5ldyBQRVAsIGFyZSBsaXN0ZWQgYXQKLWh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy8uCitodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzLy4KIAogCiBSZWxlYXNlIFNjaGVkdWxlCiAtLS0tLS0tLS0tLS0tLS0tCiAKLVNlZSBQRVAgNDc4IGZvciByZWxlYXNlIGRldGFpbHM6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ3OC8KK1NlZSBQRVAgNDk0IGZvciByZWxlYXNlIGRldGFpbHM6IGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0OTQvCiAKIAogQ29weXJpZ2h0IGFuZCBMaWNlbnNlIEluZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9Ub29scy9idWlsZGJvdC90ZXN0LmJhdCBiL1Rvb2xzL2J1aWxkYm90L3Rlc3QuYmF0CmluZGV4IGZmN2QxNjcuLjdiYzRkZTUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2J1aWxkYm90L3Rlc3QuYmF0CisrKyBiL1Rvb2xzL2J1aWxkYm90L3Rlc3QuYmF0CkBAIC00LDcgKzQsNyBAQAogDQogc2V0IGhlcmU9JX5kcDANCiBzZXQgcnRfb3B0cz0tcSAtZA0KLXNldCByZWdydGVzdF9hcmdzPQ0KK3NldCByZWdydGVzdF9hcmdzPS1qMQ0KIA0KIDpDaGVja09wdHMNCiBpZiAiJTEiPT0iLXg2NCIgKHNldCBydF9vcHRzPSVydF9vcHRzJSAlMSkgJiBzaGlmdCAmIGdvdG8gQ2hlY2tPcHRzDQpAQCAtMTYsNCArMTYsNCBAQAogaWYgTk9UICIlMSI9PSIiIChzZXQgcmVncnRlc3RfYXJncz0lcmVncnRlc3RfYXJncyUgJTEpICYgc2hpZnQgJiBnb3RvIENoZWNrT3B0cw0KIA0KIGVjaG8gb24NCi1jYWxsICIlaGVyZSUuLlwuLlxQQ2J1aWxkXHJ0LmJhdCIgJXJ0X29wdHMlIC11YWxsIC1yd1cgLS10aW1lb3V0PTM2MDAgJXJlZ3J0ZXN0X2FyZ3MlDQorY2FsbCAiJWhlcmUlLi5cLi5cUENidWlsZFxydC5iYXQiICVydF9vcHRzJSAtdWFsbCAtcndXIC0tc2xvd2VzdCAtLXRpbWVvdXQ9OTAwICVyZWdydGVzdF9hcmdzJQ0KZGlmZiAtLWdpdCBhL1Rvb2xzL2NsaW5pYy9jbGluaWMucHkgYi9Ub29scy9jbGluaWMvY2xpbmljLnB5CmluZGV4IGY2MTVlZDkuLmFmZDFhNWYgMTAwNzU1Ci0tLSBhL1Rvb2xzL2NsaW5pYy9jbGluaWMucHkKKysrIGIvVG9vbHMvY2xpbmljL2NsaW5pYy5weQpAQCAtNjQ0LDcgKzY0NCw3IEBACiAgICAgICAgIGRlZmF1bHRfcmV0dXJuX2NvbnZlcnRlciA9IChub3QgZi5yZXR1cm5fY29udmVydGVyIG9yCiAgICAgICAgICAgICBmLnJldHVybl9jb252ZXJ0ZXIudHlwZSA9PSAnUHlPYmplY3QgKicpCiAKLSAgICAgICAgcG9zaXRpb25hbCA9IHBhcmFtZXRlcnMgYW5kIChwYXJhbWV0ZXJzWy0xXS5raW5kID09IGluc3BlY3QuUGFyYW1ldGVyLlBPU0lUSU9OQUxfT05MWSkKKyAgICAgICAgcG9zaXRpb25hbCA9IHBhcmFtZXRlcnMgYW5kIHBhcmFtZXRlcnNbLTFdLmlzX3Bvc2l0aW9uYWxfb25seSgpCiAgICAgICAgIGFsbF9ib3Jpbmdfb2JqZWN0cyA9IEZhbHNlICMgeWVzLCB0aGlzIHdpbGwgYmUgZmFsc2UgaWYgdGhlcmUgYXJlIDAgcGFyYW1ldGVycywgaXQncyBmaW5lCiAgICAgICAgIGZpcnN0X29wdGlvbmFsID0gbGVuKHBhcmFtZXRlcnMpCiAgICAgICAgIGZvciBpLCBwIGluIGVudW1lcmF0ZShwYXJhbWV0ZXJzKToKQEAgLTY2MSw3ICs2NjEsNyBAQAogICAgICAgICBuZXdfb3JfaW5pdCA9IGYua2luZCBpbiAoTUVUSE9EX05FVywgTUVUSE9EX0lOSVQpCiAKICAgICAgICAgbWV0aF9vID0gKGxlbihwYXJhbWV0ZXJzKSA9PSAxIGFuZAotICAgICAgICAgICAgICBwYXJhbWV0ZXJzWzBdLmtpbmQgPT0gaW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PTkxZIGFuZAorICAgICAgICAgICAgICBwYXJhbWV0ZXJzWzBdLmlzX3Bvc2l0aW9uYWxfb25seSgpIGFuZAogICAgICAgICAgICAgICBub3QgY29udmVydGVyc1swXS5pc19vcHRpb25hbCgpIGFuZAogICAgICAgICAgICAgICBub3QgbmV3X29yX2luaXQpCiAKQEAgLTc0Myw3ICs3NDMsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBvdXRwdXQoKQogCiAgICAgICAgIGRlZiBpbnNlcnRfa2V5d29yZHMocyk6Ci0gICAgICAgICAgICByZXR1cm4gbGluZWFyX2Zvcm1hdChzLCBkZWNsYXJhdGlvbnM9InN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHt7e2tleXdvcmRzfSwgTlVMTH19O1xue2RlY2xhcmF0aW9uc30iKQorICAgICAgICAgICAgcmV0dXJuIGxpbmVhcl9mb3JtYXQocywgZGVjbGFyYXRpb25zPQorICAgICAgICAgICAgICAgICdzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0ge3t7a2V5d29yZHN9LCBOVUxMfX07XG4nCisgICAgICAgICAgICAgICAgJ3N0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7eyJ7Zm9ybWF0X3VuaXRzfTp7bmFtZX0iLCBfa2V5d29yZHMsIDB9fTtcbicKKyAgICAgICAgICAgICAgICAne2RlY2xhcmF0aW9uc30nKQogCiAgICAgICAgIGlmIG5vdCBwYXJhbWV0ZXJzOgogICAgICAgICAgICAgIyBubyBwYXJhbWV0ZXJzLCBNRVRIX05PQVJHUwpAQCAtNzk3LDggKzgwMCw5IEBACiAgICAgICAgICAgICAgICAgICAgICIiIiAlIGFyZ25hbWUpCiAKICAgICAgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgotICAgICAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKCVzLCAie2Zvcm1hdF91bml0c306e25hbWV9Iiwge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKCVzLCAie2Zvcm1hdF91bml0c306e25hbWV9Iiwge3BhcnNlX2FyZ3VtZW50c30pKSB7ewogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICAgICAiIiIgJSBhcmduYW1lLCBpbmRlbnQ9NCkpCiAKICAgICAgICAgZWxpZiBoYXNfb3B0aW9uX2dyb3VwczoKQEAgLTgyMiw4ICs4MjYsOSBAQAogICAgICAgICAgICAgcGFyc2VyX2RlZmluaXRpb24gPSBwYXJzZXJfYm9keShwYXJzZXJfcHJvdG90eXBlLCBub3JtYWxpemVfc25pcHBldCgiIiIKICAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ7bmFtZX0iLAogICAgICAgICAgICAgICAgICAgICB7dW5wYWNrX21pbn0sIHt1bnBhY2tfbWF4fSwKLSAgICAgICAgICAgICAgICAgICAge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpIHt7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpKQogCiAgICAgICAgIGVsaWYgcG9zaXRpb25hbDoKQEAgLTgzNSw4ICs4NDAsOSBAQAogCiAgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgogICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAie2Zvcm1hdF91bml0c306e25hbWV9IiwKLSAgICAgICAgICAgICAgICAgICAge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpIHt7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpKQogCiAgICAgICAgIGVsc2U6CkBAIC04NDYsMTUgKzg1MiwxMiBAQAogICAgICAgICAgICAgcGFyc2VyX3Byb3RvdHlwZSA9IHBhcnNlcl9wcm90b3R5cGVfa2V5d29yZAogCiAgICAgICAgICAgICBib2R5ID0gbm9ybWFsaXplX3NuaXBwZXQoIiIiCi0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAie2Zvcm1hdF91bml0c306e25hbWV9IiwgX2tleXdvcmRzLAotICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpCisgICAgICAgICAgICAgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpIHt7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICIiIiwgaW5kZW50PTQpCi0gICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgotICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIntmb3JtYXRfdW5pdHN9OntuYW1lfSIsIF9rZXl3b3JkcywKLSAgICAgICAgICAgICAgICAgICAge3BhcnNlX2FyZ3VtZW50c30pKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgIiIiLCBpbmRlbnQ9NCkpCisgICAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgICAgICAiIiIsIGluZGVudD00KQorICAgICAgICAgICAgcGFyc2VyX2RlZmluaXRpb24gPSBwYXJzZXJfYm9keShwYXJzZXJfcHJvdG90eXBlLCBib2R5KQogICAgICAgICAgICAgcGFyc2VyX2RlZmluaXRpb24gPSBpbnNlcnRfa2V5d29yZHMocGFyc2VyX2RlZmluaXRpb24pCiAKIApAQCAtODc4LDEzICs4ODEsMTUgQEAKIAogICAgICAgICAgICAgaWYgbm90IHBhcnNlc19rZXl3b3JkczoKICAgICAgICAgICAgICAgICBmaWVsZHMuaW5zZXJ0KDAsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgotICAgICAgICAgICAgICAgICAgICBpZiAoe3NlbGZfdHlwZV9jaGVja30hX1B5QXJnX05vS2V5d29yZHMoIntuYW1lfSIsIGt3YXJncykpCisgICAgICAgICAgICAgICAgICAgIGlmICh7c2VsZl90eXBlX2NoZWNrfSFfUHlBcmdfTm9LZXl3b3Jkcygie25hbWV9Iiwga3dhcmdzKSkge3sKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfX0KICAgICAgICAgICAgICAgICAgICAgIiIiLCBpbmRlbnQ9NCkpCiAgICAgICAgICAgICAgICAgaWYgbm90IHBhcnNlc19wb3NpdGlvbmFsOgogICAgICAgICAgICAgICAgICAgICBmaWVsZHMuaW5zZXJ0KDAsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHtzZWxmX3R5cGVfY2hlY2t9IV9QeUFyZ19Ob1Bvc2l0aW9uYWwoIntuYW1lfSIsIGFyZ3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHtzZWxmX3R5cGVfY2hlY2t9IV9QeUFyZ19Ob1Bvc2l0aW9uYWwoIntuYW1lfSIsIGFyZ3MpKSB7ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAiIiIsIGluZGVudD00KSkKIAogICAgICAgICAgICAgcGFyc2VyX2RlZmluaXRpb24gPSBwYXJzZXJfYm9keShwYXJzZXJfcHJvdG90eXBlLCAqZmllbGRzKQpAQCAtMTAzMiw4ICsxMDM3LDkgQEAKIAogICAgICAgICAgICAgcyA9ICIiIgogICAgIGNhc2Uge2NvdW50fToKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ7Zm9ybWF0X3VuaXRzfTp7bmFtZX0iLCB7cGFyc2VfYXJndW1lbnRzfSkpCisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAie2Zvcm1hdF91bml0c306e25hbWV9Iiwge3BhcnNlX2FyZ3VtZW50c30pKSB7ewogICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9fQogICAgICAgICB7Z3JvdXBfYm9vbGVhbnN9CiAgICAgICAgIGJyZWFrOwogIiIiWzE6XQpAQCAtMTA2Nyw3ICsxMDczLDcgQEAKIAogICAgICAgICBsYXN0X2dyb3VwID0gMAogICAgICAgICBmaXJzdF9vcHRpb25hbCA9IGxlbihzZWxmbGVzcykKLSAgICAgICAgcG9zaXRpb25hbCA9IHNlbGZsZXNzIGFuZCBzZWxmbGVzc1stMV0ua2luZCA9PSBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFkKKyAgICAgICAgcG9zaXRpb25hbCA9IHNlbGZsZXNzIGFuZCBzZWxmbGVzc1stMV0uaXNfcG9zaXRpb25hbF9vbmx5KCkKICAgICAgICAgbmV3X29yX2luaXQgPSBmLmtpbmQgaW4gKE1FVEhPRF9ORVcsIE1FVEhPRF9JTklUKQogICAgICAgICBkZWZhdWx0X3JldHVybl9jb252ZXJ0ZXIgPSAobm90IGYucmV0dXJuX2NvbnZlcnRlciBvcgogICAgICAgICAgICAgZi5yZXR1cm5fY29udmVydGVyLnR5cGUgPT0gJ1B5T2JqZWN0IConKQpAQCAtMTIxNiw3ICsxMjIyLDcgQEAKIAogZGVmIGNyZWF0ZV9yZWdleChiZWZvcmUsIGFmdGVyLCB3b3JkPVRydWUsIHdob2xlX2xpbmU9VHJ1ZSk6CiAgICAgIiIiQ3JlYXRlIGFuIHJlIG9iamVjdCBmb3IgbWF0Y2hpbmcgbWFya2VyIGxpbmVzLiIiIgotICAgIGdyb3VwX3JlID0gIlx3KyIgaWYgd29yZCBlbHNlICIuKyIKKyAgICBncm91cF9yZSA9IHIiXHcrIiBpZiB3b3JkIGVsc2UgIi4rIgogICAgIHBhdHRlcm4gPSByJ3t9KHt9KXt9JwogICAgIGlmIHdob2xlX2xpbmU6CiAgICAgICAgIHBhdHRlcm4gPSAnXicgKyBwYXR0ZXJuICsgJyQnCkBAIC0yMzU5LDcgKzIzNjUsMTAgQEAKICAgICAgICAgICAgIGRhdGEubW9kaWZpY2F0aW9ucy5hcHBlbmQoJy8qIG1vZGlmaWNhdGlvbnMgZm9yICcgKyBuYW1lICsgJyAqL1xuJyArIG1vZGlmaWNhdGlvbnMucnN0cmlwKCkpCiAKICAgICAgICAgIyBrZXl3b3JkcwotICAgICAgICBkYXRhLmtleXdvcmRzLmFwcGVuZChwYXJhbWV0ZXIubmFtZSkKKyAgICAgICAgaWYgcGFyYW1ldGVyLmlzX3Bvc2l0aW9uYWxfb25seSgpOgorICAgICAgICAgICAgZGF0YS5rZXl3b3Jkcy5hcHBlbmQoJycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhLmtleXdvcmRzLmFwcGVuZChwYXJhbWV0ZXIubmFtZSkKIAogICAgICAgICAjIGZvcm1hdF91bml0cwogICAgICAgICBpZiBzZWxmLmlzX29wdGlvbmFsKCkgYW5kICd8JyBub3QgaW4gZGF0YS5mb3JtYXRfdW5pdHM6CkBAIC0yNTcyLDIxICsyNTgxLDIxIEBACiAgICAgICAgIGlmIG5vdCBiaXR3aXNlOgogICAgICAgICAgICAgZmFpbCgiVW5zaWduZWQgbG9uZ3MgbXVzdCBiZSBiaXR3aXNlIChmb3Igbm93KS4iKQogCi1jbGFzcyBQWV9MT05HX0xPTkdfY29udmVydGVyKENDb252ZXJ0ZXIpOgotICAgIHR5cGUgPSAnUFlfTE9OR19MT05HJworY2xhc3MgbG9uZ19sb25nX2NvbnZlcnRlcihDQ29udmVydGVyKToKKyAgICB0eXBlID0gJ2xvbmcgbG9uZycKICAgICBkZWZhdWx0X3R5cGUgPSBpbnQKICAgICBmb3JtYXRfdW5pdCA9ICdMJwogICAgIGNfaWdub3JlZF9kZWZhdWx0ID0gIjAiCiAKLWNsYXNzIHVuc2lnbmVkX1BZX0xPTkdfTE9OR19jb252ZXJ0ZXIoQ0NvbnZlcnRlcik6Ci0gICAgdHlwZSA9ICd1bnNpZ25lZCBQWV9MT05HX0xPTkcnCitjbGFzcyB1bnNpZ25lZF9sb25nX2xvbmdfY29udmVydGVyKENDb252ZXJ0ZXIpOgorICAgIHR5cGUgPSAndW5zaWduZWQgbG9uZyBsb25nJwogICAgIGRlZmF1bHRfdHlwZSA9IGludAogICAgIGZvcm1hdF91bml0ID0gJ0snCiAgICAgY19pZ25vcmVkX2RlZmF1bHQgPSAiMCIKIAogICAgIGRlZiBjb252ZXJ0ZXJfaW5pdChzZWxmLCAqLCBiaXR3aXNlPUZhbHNlKToKICAgICAgICAgaWYgbm90IGJpdHdpc2U6Ci0gICAgICAgICAgICBmYWlsKCJVbnNpZ25lZCBQWV9MT05HX0xPTkdzIG11c3QgYmUgYml0d2lzZSAoZm9yIG5vdykuIikKKyAgICAgICAgICAgIGZhaWwoIlVuc2lnbmVkIGxvbmcgbG9uZyBtdXN0IGJlIGJpdHdpc2UgKGZvciBub3cpLiIpCiAKIGNsYXNzIFB5X3NzaXplX3RfY29udmVydGVyKENDb252ZXJ0ZXIpOgogICAgIHR5cGUgPSAnUHlfc3NpemVfdCcKQEAgLTI2NzYsNyArMjY4NSw3IEBACiAgICAgZGVmIGNsZWFudXAoc2VsZik6CiAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CiAgICAgICAgICAgICBuYW1lID0gZW5zdXJlX2xlZ2FsX2NfaWRlbnRpZmllcihzZWxmLm5hbWUpCi0gICAgICAgICAgICByZXR1cm4gIiIuam9pbihbImlmICgiLCBuYW1lLCAiKVxuICAgUHlNZW1fRlJFRSgiLCBuYW1lLCAiKTtcbiJdKQorICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4oWyJpZiAoIiwgbmFtZSwgIikge1xuICAgUHlNZW1fRlJFRSgiLCBuYW1lLCAiKTtcbn1cbiJdKQogCiAjCiAjIFRoaXMgaXMgdGhlIGZvdXJ0aCBvciBmaWZ0aCByZXdyaXRlIG9mIHJlZ2lzdGVyaW5nIGFsbCB0aGUKQEAgLTI3ODYsNyArMjc5NSw3IEBACiAKICAgICBkZWYgY2xlYW51cChzZWxmKToKICAgICAgICAgbmFtZSA9IGVuc3VyZV9sZWdhbF9jX2lkZW50aWZpZXIoc2VsZi5uYW1lKQotICAgICAgICByZXR1cm4gIiIuam9pbihbImlmICgiLCBuYW1lLCAiLm9iailcbiAgIFB5QnVmZmVyX1JlbGVhc2UoJiIsIG5hbWUsICIpO1xuIl0pCisgICAgICAgIHJldHVybiAiIi5qb2luKFsiaWYgKCIsIG5hbWUsICIub2JqKSB7XG4gICBQeUJ1ZmZlcl9SZWxlYXNlKCYiLCBuYW1lLCAiKTtcbn1cbiJdKQogCiAKIGRlZiBjb3JyZWN0X25hbWVfZm9yX3NlbGYoZik6CkBAIC0yOTU5LDEwICsyOTY4LDEwIEBACiAgICAgICAgIGRhdGEucmV0dXJuX3ZhbHVlID0gbmFtZQogCiAgICAgZGVmIGVycl9vY2N1cnJlZF9pZihzZWxmLCBleHByLCBkYXRhKToKLSAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJ2lmICgoe30pICYmIFB5RXJyX09jY3VycmVkKCkpXG4gICAgZ290byBleGl0O1xuJy5mb3JtYXQoZXhwcikpCisgICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKCdpZiAoKHt9KSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7e1xuICAgIGdvdG8gZXhpdDtcbn19XG4nLmZvcm1hdChleHByKSkKIAogICAgIGRlZiBlcnJfb2NjdXJyZWRfaWZfbnVsbF9wb2ludGVyKHNlbGYsIHZhcmlhYmxlLCBkYXRhKToKLSAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJ2lmICh7fSA9PSBOVUxMKVxuICAgIGdvdG8gZXhpdDtcbicuZm9ybWF0KHZhcmlhYmxlKSkKKyAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJ2lmICh7fSA9PSBOVUxMKSB7e1xuICAgIGdvdG8gZXhpdDtcbn19XG4nLmZvcm1hdCh2YXJpYWJsZSkpCiAKICAgICBkZWYgcmVuZGVyKHNlbGYsIGZ1bmN0aW9uLCBkYXRhKToKICAgICAgICAgIiIiCkBAIC0yOTc3LDggKzI5ODYsOSBAQAogICAgIGRlZiByZW5kZXIoc2VsZiwgZnVuY3Rpb24sIGRhdGEpOgogICAgICAgICBzZWxmLmRlY2xhcmUoZGF0YSkKICAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJycnCi1pZiAoX3JldHVybl92YWx1ZSAhPSBQeV9Ob25lKQoraWYgKF9yZXR1cm5fdmFsdWUgIT0gUHlfTm9uZSkgewogICAgIGdvdG8gZXhpdDsKK30KIHJldHVybl92YWx1ZSA9IFB5X05vbmU7CiBQeV9JTkNSRUYoUHlfTm9uZSk7CiAnJycuc3RyaXAoKSkKQEAgLTMxODMsNiArMzE5Myw3IEBACiAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlX2RzbF9zdGFydAogICAgICAgICBzZWxmLnBhcmFtZXRlcl9pbmRlbnQgPSBOb25lCiAgICAgICAgIHNlbGYua2V5d29yZF9vbmx5ID0gRmFsc2UKKyAgICAgICAgc2VsZi5wb3NpdGlvbmFsX29ubHkgPSBGYWxzZQogICAgICAgICBzZWxmLmdyb3VwID0gMAogICAgICAgICBzZWxmLnBhcmFtZXRlcl9zdGF0ZSA9IHNlbGYucHNfc3RhcnQKICAgICAgICAgc2VsZi5zZWVuX3Bvc2l0aW9uYWxfd2l0aF9kZWZhdWx0ID0gRmFsc2UKQEAgLTM1NjEsOCArMzU3Miw4IEBACiAgICAgIyAicGFyYW1ldGVyX3N0YXRlIi4gIChQcmV2aW91c2x5IHRoZSBjb2RlIHdhcyBhIG1pYXNtYSBvZiBpZnMgYW5kCiAgICAgIyBzZXBhcmF0ZSBib29sZWFuIHN0YXRlIHZhcmlhYmxlcy4pICBUaGUgc3RhdGVzIGFyZToKICAgICAjCi0gICAgIyAgWyBbIGEsIGIsIF0gYywgXSBkLCBlLCBmPTMsIFsgZywgaCwgWyBpIF0gXSAvICAgPC0gbGluZQotICAgICMgMDEgICAyICAgICAgICAgIDMgICAgICAgNCAgICA1ICAgICAgICAgICA2ICAgNyAgIDwtIHN0YXRlIHRyYW5zaXRpb25zCisgICAgIyAgWyBbIGEsIGIsIF0gYywgXSBkLCBlLCBmPTMsIFsgZywgaCwgWyBpIF0gXSAgIDwtIGxpbmUKKyAgICAjIDAxICAgMiAgICAgICAgICAzICAgICAgIDQgICAgNSAgICAgICAgICAgNiAgICAgPC0gc3RhdGUgdHJhbnNpdGlvbnMKICAgICAjCiAgICAgIyAwOiBwc19zdGFydC4gIGJlZm9yZSB3ZSd2ZSBzZWVuIGFueXRoaW5nLiAgbGVnYWwgdHJhbnNpdGlvbnMgYXJlIHRvIDEgb3IgMy4KICAgICAjIDE6IHBzX2xlZnRfc3F1YXJlX2JlZm9yZS4gIGxlZnQgc3F1YXJlIGJyYWNrZXRzIGJlZm9yZSByZXF1aXJlZCBwYXJhbWV0ZXJzLgpAQCAtMzU3Myw5ICszNTg0LDggQEAKICAgICAjICAgIG5vdyBtdXN0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuCiAgICAgIyA1OiBwc19ncm91cF9hZnRlci4gIGluIGEgZ3JvdXAsIGFmdGVyIHJlcXVpcmVkIHBhcmFtZXRlcnMuCiAgICAgIyA2OiBwc19yaWdodF9zcXVhcmVfYWZ0ZXIuICByaWdodCBzcXVhcmUgYnJhY2tldHMgYWZ0ZXIgcmVxdWlyZWQgcGFyYW1ldGVycy4KLSAgICAjIDc6IHBzX3NlZW5fc2xhc2guICBzZWVuIHNsYXNoLgogICAgIHBzX3N0YXJ0LCBwc19sZWZ0X3NxdWFyZV9iZWZvcmUsIHBzX2dyb3VwX2JlZm9yZSwgcHNfcmVxdWlyZWQsIFwKLSAgICBwc19vcHRpb25hbCwgcHNfZ3JvdXBfYWZ0ZXIsIHBzX3JpZ2h0X3NxdWFyZV9hZnRlciwgcHNfc2Vlbl9zbGFzaCA9IHJhbmdlKDgpCisgICAgcHNfb3B0aW9uYWwsIHBzX2dyb3VwX2FmdGVyLCBwc19yaWdodF9zcXVhcmVfYWZ0ZXIgPSByYW5nZSg3KQogCiAgICAgZGVmIHN0YXRlX3BhcmFtZXRlcnNfc3RhcnQoc2VsZiwgbGluZSk6CiAgICAgICAgIGlmIHNlbGYuaWdub3JlX2xpbmUobGluZSk6CkBAIC0zODU0LDkgKzM4NjQsNiBAQAogICAgICAgICByZXR1cm4gbmFtZSwgRmFsc2UsIGt3YXJncwogCiAgICAgZGVmIHBhcnNlX3NwZWNpYWxfc3ltYm9sKHNlbGYsIHN5bWJvbCk6Ci0gICAgICAgIGlmIHNlbGYucGFyYW1ldGVyX3N0YXRlID09IHNlbGYucHNfc2Vlbl9zbGFzaDoKLSAgICAgICAgICAgIGZhaWwoIkZ1bmN0aW9uICIgKyBzZWxmLmZ1bmN0aW9uLm5hbWUgKyAiIHNwZWNpZmllcyAiICsgc3ltYm9sICsgIiBhZnRlciAvLCB3aGljaCBpcyB1bnN1cHBvcnRlZC4iKQotCiAgICAgICAgIGlmIHN5bWJvbCA9PSAnKic6CiAgICAgICAgICAgICBpZiBzZWxmLmtleXdvcmRfb25seToKICAgICAgICAgICAgICAgICBmYWlsKCJGdW5jdGlvbiAiICsgc2VsZi5mdW5jdGlvbi5uYW1lICsgIiB1c2VzICcqJyBtb3JlIHRoYW4gb25jZS4iKQpAQCAtMzg4MywxMyArMzg5MCwxNSBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBmYWlsKCJGdW5jdGlvbiAiICsgc2VsZi5mdW5jdGlvbi5uYW1lICsgIiBoYXMgYW4gdW5zdXBwb3J0ZWQgZ3JvdXAgY29uZmlndXJhdGlvbi4gKFVuZXhwZWN0ZWQgc3RhdGUgIiArIHN0cihzZWxmLnBhcmFtZXRlcl9zdGF0ZSkgKyAiLmMpIikKICAgICAgICAgZWxpZiBzeW1ib2wgPT0gJy8nOgorICAgICAgICAgICAgaWYgc2VsZi5wb3NpdGlvbmFsX29ubHk6CisgICAgICAgICAgICAgICAgZmFpbCgiRnVuY3Rpb24gIiArIHNlbGYuZnVuY3Rpb24ubmFtZSArICIgdXNlcyAnLycgbW9yZSB0aGFuIG9uY2UuIikKKyAgICAgICAgICAgIHNlbGYucG9zaXRpb25hbF9vbmx5ID0gVHJ1ZQogICAgICAgICAgICAgIyBwc19yZXF1aXJlZCBhbmQgcHNfb3B0aW9uYWwgYXJlIGFsbG93ZWQgaGVyZSwgdGhhdCBhbGxvd3MgcG9zaXRpb25hbC1vbmx5IHdpdGhvdXQgb3B0aW9uIGdyb3VwcwogICAgICAgICAgICAgIyB0byB3b3JrIChhbmQgaGF2ZSBkZWZhdWx0IHZhbHVlcyEpCiAgICAgICAgICAgICBpZiAoc2VsZi5wYXJhbWV0ZXJfc3RhdGUgbm90IGluIChzZWxmLnBzX3JlcXVpcmVkLCBzZWxmLnBzX29wdGlvbmFsLCBzZWxmLnBzX3JpZ2h0X3NxdWFyZV9hZnRlciwgc2VsZi5wc19ncm91cF9iZWZvcmUpKSBvciBzZWxmLmdyb3VwOgogICAgICAgICAgICAgICAgIGZhaWwoIkZ1bmN0aW9uICIgKyBzZWxmLmZ1bmN0aW9uLm5hbWUgKyAiIGhhcyBhbiB1bnN1cHBvcnRlZCBncm91cCBjb25maWd1cmF0aW9uLiAoVW5leHBlY3RlZCBzdGF0ZSAiICsgc3RyKHNlbGYucGFyYW1ldGVyX3N0YXRlKSArICIuZCkiKQogICAgICAgICAgICAgaWYgc2VsZi5rZXl3b3JkX29ubHk6CiAgICAgICAgICAgICAgICAgZmFpbCgiRnVuY3Rpb24gIiArIHNlbGYuZnVuY3Rpb24ubmFtZSArICIgbWl4ZXMga2V5d29yZC1vbmx5IGFuZCBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycywgd2hpY2ggaXMgdW5zdXBwb3J0ZWQuIikKLSAgICAgICAgICAgIHNlbGYucGFyYW1ldGVyX3N0YXRlID0gc2VsZi5wc19zZWVuX3NsYXNoCiAgICAgICAgICAgICAjIGZpeHVwIHByZWNlZGluZyBwYXJhbWV0ZXJzCiAgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLmZ1bmN0aW9uLnBhcmFtZXRlcnMudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgaWYgKHAua2luZCAhPSBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09SX0tFWVdPUkQgYW5kIG5vdCBpc2luc3RhbmNlKHAuY29udmVydGVyLCBzZWxmX2NvbnZlcnRlcikpOgpAQCAtMzk3NywyMyArMzk4NiwyMCBAQAogICAgICAgICAjIHBvcHVsYXRlICJyaWdodF9icmFja2V0X2NvdW50IiBmaWVsZCBmb3IgZXZlcnkgcGFyYW1ldGVyCiAgICAgICAgIGFzc2VydCBwYXJhbWV0ZXJzLCAiV2Ugc2hvdWxkIGFsd2F5cyBoYXZlIGEgc2VsZiBwYXJhbWV0ZXIuICIgKyByZXByKGYpCiAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHBhcmFtZXRlcnNbMF0uY29udmVydGVyLCBzZWxmX2NvbnZlcnRlcikKKyAgICAgICAgIyBzZWxmIGlzIGFsd2F5cyBwb3NpdGlvbmFsLW9ubHkuCisgICAgICAgIGFzc2VydCBwYXJhbWV0ZXJzWzBdLmlzX3Bvc2l0aW9uYWxfb25seSgpCiAgICAgICAgIHBhcmFtZXRlcnNbMF0ucmlnaHRfYnJhY2tldF9jb3VudCA9IDAKLSAgICAgICAgcGFyYW1ldGVyc19hZnRlcl9zZWxmID0gcGFyYW1ldGVyc1sxOl0KLSAgICAgICAgaWYgcGFyYW1ldGVyc19hZnRlcl9zZWxmOgotICAgICAgICAgICAgIyBmb3Igbm93LCB0aGUgb25seSB3YXkgQ2xpbmljIHN1cHBvcnRzIHBvc2l0aW9uYWwtb25seSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAjIGlzIGlmIGFsbCBvZiB0aGVtIGFyZSBwb3NpdGlvbmFsLW9ubHkuLi4KLSAgICAgICAgICAgICMKLSAgICAgICAgICAgICMgLi4uIGV4Y2VwdCBmb3Igc2VsZiEgIHNlbGYgaXMgYWx3YXlzIHBvc2l0aW9uYWwtb25seS4KLQotICAgICAgICAgICAgcG9zaXRpb25hbF9vbmx5X3BhcmFtZXRlcnMgPSBbcC5raW5kID09IGluc3BlY3QuUGFyYW1ldGVyLlBPU0lUSU9OQUxfT05MWSBmb3IgcCBpbiBwYXJhbWV0ZXJzX2FmdGVyX3NlbGZdCi0gICAgICAgICAgICBpZiBwYXJhbWV0ZXJzX2FmdGVyX3NlbGZbMF0ua2luZCA9PSBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFk6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGFsbChwb3NpdGlvbmFsX29ubHlfcGFyYW1ldGVycykKLSAgICAgICAgICAgICAgICBmb3IgcCBpbiBwYXJhbWV0ZXJzOgotICAgICAgICAgICAgICAgICAgICBwLnJpZ2h0X2JyYWNrZXRfY291bnQgPSBhYnMocC5ncm91cCkKKyAgICAgICAgcG9zaXRpb25hbF9vbmx5ID0gVHJ1ZQorICAgICAgICBmb3IgcCBpbiBwYXJhbWV0ZXJzWzE6XToKKyAgICAgICAgICAgIGlmIG5vdCBwLmlzX3Bvc2l0aW9uYWxfb25seSgpOgorICAgICAgICAgICAgICAgIHBvc2l0aW9uYWxfb25seSA9IEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFzc2VydCBwb3NpdGlvbmFsX29ubHkKKyAgICAgICAgICAgIGlmIHBvc2l0aW9uYWxfb25seToKKyAgICAgICAgICAgICAgICBwLnJpZ2h0X2JyYWNrZXRfY291bnQgPSBhYnMocC5ncm91cCkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgIyBkb24ndCBwdXQgYW55IHJpZ2h0IGJyYWNrZXRzIGFyb3VuZCBub24tcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMsIGV2ZXIuCi0gICAgICAgICAgICAgICAgZm9yIHAgaW4gcGFyYW1ldGVyc19hZnRlcl9zZWxmOgotICAgICAgICAgICAgICAgICAgICBwLnJpZ2h0X2JyYWNrZXRfY291bnQgPSAwCisgICAgICAgICAgICAgICAgcC5yaWdodF9icmFja2V0X2NvdW50ID0gMAogCiAgICAgICAgIHJpZ2h0X2JyYWNrZXRfY291bnQgPSAwCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL2RlbW8vc3MxLnB5IGIvVG9vbHMvZGVtby9zczEucHkKaW5kZXggYzUxZjA0MS4uYmY4ODgyMCAxMDA3NTUKLS0tIGEvVG9vbHMvZGVtby9zczEucHkKKysrIGIvVG9vbHMvZGVtby9zczEucHkKQEAgLTQxMyw3ICs0MTMsNyBAQAogCiAgICAgZGVmIHJlbnVtYmVyKHNlbGYsIHgxLCB5MSwgeDIsIHkyLCBkeCwgZHkpOgogICAgICAgICBvdXQgPSBbXQotICAgICAgICBmb3IgcGFydCBpbiByZS5zcGxpdCgnKFx3KyknLCBzZWxmLmZvcm11bGEpOgorICAgICAgICBmb3IgcGFydCBpbiByZS5zcGxpdChyJyhcdyspJywgc2VsZi5mb3JtdWxhKToKICAgICAgICAgICAgIG0gPSByZS5tYXRjaCgnXihbQS1aXSspKFsxLTldWzAtOV0qKSQnLCBwYXJ0KQogICAgICAgICAgICAgaWYgbSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzeCwgc3kgPSBtLmdyb3VwcygpCmRpZmYgLS1naXQgYS9Ub29scy9mcmVlemUvZnJlZXplLnB5IGIvVG9vbHMvZnJlZXplL2ZyZWV6ZS5weQppbmRleCA0NGVkZDU3Li5kNjAyZjU4IDEwMDc1NQotLS0gYS9Ub29scy9mcmVlemUvZnJlZXplLnB5CisrKyBiL1Rvb2xzL2ZyZWV6ZS9mcmVlemUucHkKQEAgLTEyNCw5ICsxMjQsNyBAQAogCiAgICAgIyBkZWZhdWx0IHRoZSBleGNsdWRlIGxpc3QgZm9yIGVhY2ggcGxhdGZvcm0KICAgICBpZiB3aW46IGV4Y2x1ZGUgPSBleGNsdWRlICsgWwotICAgICAgICAnZG9zJywgJ2Rvc3BhdGgnLCAnbWFjJywgJ21hY3BhdGgnLCAnbWFjZnMnLCAnTUFDRlMnLCAncG9zaXgnLAotICAgICAgICAnY2UnLAotICAgICAgICBdCisgICAgICAgICdkb3MnLCAnZG9zcGF0aCcsICdtYWMnLCAnbWFjcGF0aCcsICdtYWNmcycsICdNQUNGUycsICdwb3NpeCcsIF0KIAogICAgIGZhaWxfaW1wb3J0ID0gZXhjbHVkZVs6XQogCkBAIC0yMTgsNyArMjE2LDcgQEAKICAgICBpc2hvbWUgPSBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4ocHJlZml4LCAnUHl0aG9uJywgJ2NldmFsLmMnKSkKIAogICAgICMgbG9jYXRpb25zIGRlcml2ZWQgZnJvbSBvcHRpb25zCi0gICAgdmVyc2lvbiA9IHN5cy52ZXJzaW9uWzozXQorICAgIHZlcnNpb24gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgICBmbGFnZ2VkX3ZlcnNpb24gPSB2ZXJzaW9uICsgc3lzLmFiaWZsYWdzCiAgICAgaWYgd2luOgogICAgICAgICBleHRlbnNpb25zX2MgPSAnZnJvemVuX2V4dGVuc2lvbnMuYycKZGlmZiAtLWdpdCBhL1Rvb2xzL2ZyZWV6ZS93aW5tYWtlbWFrZWZpbGUucHkgYi9Ub29scy9mcmVlemUvd2lubWFrZW1ha2VmaWxlLnB5CmluZGV4IDM4NDMzODguLjQzOWExZDcgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2ZyZWV6ZS93aW5tYWtlbWFrZWZpbGUucHkKKysrIGIvVG9vbHMvZnJlZXplL3dpbm1ha2VtYWtlZmlsZS5weQpAQCAtOTUsNyArOTUsNyBAQAogICAgIHByaW50KCkKIAogICAgIHByaW50KCckKHRlbXBfZGlyKTonKQotICAgIHByaW50KCcgIGlmIG5vdCBleGlzdCAkKHRlbXBfZGlyKVwuIG1rZGlyICQodGVtcF9kaXIpJykKKyAgICBwcmludChyJyAgaWYgbm90IGV4aXN0ICQodGVtcF9kaXIpXC4gbWtkaXIgJCh0ZW1wX2RpciknKQogICAgIHByaW50KCkKIAogICAgIG9iamVjdHMgPSBbXQpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZShmaWxlKQogICAgICAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChiYXNlKQogICAgICAgICAgICAgb2JqZWN0cy5hcHBlbmQoYmFzZSArICIub2JqIikKLSAgICAgICAgICAgIHByaW50KCckKHRlbXBfZGlyKVwlcy5vYmo6ICIlcyInICUgKGJhc2UsIGZpbGUpKQorICAgICAgICAgICAgcHJpbnQocickKHRlbXBfZGlyKVwlcy5vYmo6ICIlcyInICUgKGJhc2UsIGZpbGUpKQogICAgICAgICAgICAgcHJpbnQoIlx0QCQoQ0MpIC1jIC1ub2xvZ28gL0ZvJCogJChjZGwpICQoY19kZWJ1ZykgL0QgQlVJTERfRlJFRVpFIiwgZW5kPScgJykKICAgICAgICAgICAgIHByaW50KCciLUkkKHB5dGhvbmhvbWUpL0luY2x1ZGUiICAiLUkkKHB5dGhvbmhvbWUpL1BDIiBcXCcpCiAgICAgICAgICAgICBwcmludCgiXHRcdCQoY2ZsYWdzKSAkKGNkZWJ1ZykgJChjaW5jbHVkZSkgXFwiKQpAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgcHJpbnQoKSA7IHByaW50KCkKIAogICAgIHByaW50KCJPQkpTPSIsIGVuZD0nICcpCi0gICAgZm9yIG9iaiBpbiBvYmplY3RzOiBwcmludCgnIiQodGVtcF9kaXIpXCVzIicgJSAob2JqKSwgZW5kPScgJykKKyAgICBmb3Igb2JqIGluIG9iamVjdHM6IHByaW50KHInIiQodGVtcF9kaXIpXCVzIicgJSAob2JqKSwgZW5kPScgJykKICAgICBwcmludCgpIDsgcHJpbnQoKQogCiAgICAgcHJpbnQoIkxJQlM9IiwgZW5kPScgJykKZGlmZiAtLWdpdCBhL1Rvb2xzL2dkYi9saWJweXRob24ucHkgYi9Ub29scy9nZGIvbGlicHl0aG9uLnB5CmluZGV4IDc1ZjFjY2IuLjNlOTViNDQgMTAwNzU1Ci0tLSBhL1Rvb2xzL2dkYi9saWJweXRob24ucHkKKysrIGIvVG9vbHMvZ2RiL2xpYnB5dGhvbi5weQpAQCAtNDQsNyArNDQsNyBAQAogIyBOT1RFOiBzb21lIGdkYnMgYXJlIGxpbmtlZCB3aXRoIFB5dGhvbiAzLCBzbyB0aGlzIGZpbGUgc2hvdWxkIGJlIGR1YWwtc3ludGF4CiAjIGNvbXBhdGlibGUgKDIuNisgYW5kIDMuMCspLiAgU2VlICMxOTMwOC4KIAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiwgd2l0aF9zdGF0ZW1lbnQKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KIGltcG9ydCBnZGIKIGltcG9ydCBvcwogaW1wb3J0IGxvY2FsZQpkaWZmIC0tZ2l0IGEvVG9vbHMvaGcvaGd0b3VjaC5weSBiL1Rvb2xzL2hnL2hndG91Y2gucHkKaW5kZXggMTE5ZDgxMi4uZmJjYTQ2OSAxMDA2NDQKLS0tIGEvVG9vbHMvaGcvaGd0b3VjaC5weQorKysgYi9Ub29scy9oZy9oZ3RvdWNoLnB5CkBAIC03LDcgKzcsNiBAQAogCiBJbiBhZGRpdGlvbiB0byB0aGUgZGVwZW5kZW5jeSBzeW50YXgsICMtY29tbWVudHMgYXJlIHN1cHBvcnRlZC4KICIiIgotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAogaW1wb3J0IGVycm5vCiBpbXBvcnQgb3MKIGltcG9ydCB0aW1lCmRpZmYgLS1naXQgYS9Ub29scy9pMThuL3B5Z2V0dGV4dC5weSBiL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CmluZGV4IGRhNDI0MzguLjhlZjVmZjggMTAwNzU1Ci0tLSBhL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CisrKyBiL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CkBAIC0xNTYsNyArMTU2LDggQEAKICIiIikKIAogaW1wb3J0IG9zCi1pbXBvcnQgaW1wCitpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeQoraW1wb3J0IGltcG9ydGxpYi51dGlsCiBpbXBvcnQgc3lzCiBpbXBvcnQgZ2xvYgogaW1wb3J0IHRpbWUKQEAgLTI2Myw4ICsyNjQsNyBAQAogICAgICMgZ2V0IGV4dGVuc2lvbiBmb3IgcHl0aG9uIHNvdXJjZSBmaWxlcwogICAgIGlmICdfcHlfZXh0JyBub3QgaW4gZ2xvYmFscygpOgogICAgICAgICBnbG9iYWwgX3B5X2V4dAotICAgICAgICBfcHlfZXh0ID0gW3RyaXBsZVswXSBmb3IgdHJpcGxlIGluIGltcC5nZXRfc3VmZml4ZXMoKQotICAgICAgICAgICAgICAgICAgIGlmIHRyaXBsZVsyXSA9PSBpbXAuUFlfU09VUkNFXVswXQorICAgICAgICBfcHlfZXh0ID0gaW1wb3J0bGliLm1hY2hpbmVyeS5TT1VSQ0VfU1VGRklYRVNbMF0KIAogICAgICMgZG9uJ3QgcmVjdXJzZSBpbnRvIENWUyBkaXJlY3RvcmllcwogICAgIGlmICdDVlMnIGluIG5hbWVzOgpAQCAtMjc3LDQ1ICsyNzcsNiBAQAogICAgICAgICApCiAKIAotZGVmIF9nZXRfbW9kcGtnX3BhdGgoZG90dGVkX25hbWUsIHBhdGhsaXN0PU5vbmUpOgotICAgICIiIkdldCB0aGUgZmlsZXN5c3RlbSBwYXRoIGZvciBhIG1vZHVsZSBvciBhIHBhY2thZ2UuCi0KLSAgICBSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHBhdGggdG8gYSBmaWxlIGZvciBhIG1vZHVsZSwgYW5kIHRvIGEgZGlyZWN0b3J5IGZvcgotICAgIGEgcGFja2FnZS4gUmV0dXJuIE5vbmUgaWYgdGhlIG5hbWUgaXMgbm90IGZvdW5kLCBvciBpcyBhIGJ1aWx0aW4gb3IKLSAgICBleHRlbnNpb24gbW9kdWxlLgotICAgICIiIgotICAgICMgc3BsaXQgb2ZmIHRvcC1tb3N0IG5hbWUKLSAgICBwYXJ0cyA9IGRvdHRlZF9uYW1lLnNwbGl0KCcuJywgMSkKLQotICAgIGlmIGxlbihwYXJ0cykgPiAxOgotICAgICAgICAjIHdlIGhhdmUgYSBkb3R0ZWQgcGF0aCwgaW1wb3J0IHRvcC1sZXZlbCBwYWNrYWdlCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZpbGUsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZShwYXJ0c1swXSwgcGF0aGxpc3QpCi0gICAgICAgICAgICBpZiBmaWxlOiBmaWxlLmNsb3NlKCkKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICAgICAjIGNoZWNrIGlmIGl0J3MgaW5kZWVkIGEgcGFja2FnZQotICAgICAgICBpZiBkZXNjcmlwdGlvblsyXSA9PSBpbXAuUEtHX0RJUkVDVE9SWToKLSAgICAgICAgICAgICMgcmVjdXJzaXZlbHkgaGFuZGxlIHRoZSByZW1haW5pbmcgbmFtZSBwYXJ0cwotICAgICAgICAgICAgcGF0aG5hbWUgPSBfZ2V0X21vZHBrZ19wYXRoKHBhcnRzWzFdLCBbcGF0aG5hbWVdKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcGF0aG5hbWUgPSBOb25lCi0gICAgZWxzZToKLSAgICAgICAgIyBwbGFpbiBuYW1lCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZpbGUsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZSgKLSAgICAgICAgICAgICAgICBkb3R0ZWRfbmFtZSwgcGF0aGxpc3QpCi0gICAgICAgICAgICBpZiBmaWxlOgotICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQotICAgICAgICAgICAgaWYgZGVzY3JpcHRpb25bMl0gbm90IGluIFtpbXAuUFlfU09VUkNFLCBpbXAuUEtHX0RJUkVDVE9SWV06Ci0gICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBOb25lCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHBhdGhuYW1lID0gTm9uZQotCi0gICAgcmV0dXJuIHBhdGhuYW1lCi0KLQogZGVmIGdldEZpbGVzRm9yTmFtZShuYW1lKToKICAgICAiIiJHZXQgYSBsaXN0IG9mIG1vZHVsZSBmaWxlcyBmb3IgYSBmaWxlbmFtZSwgYSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lLAogICAgIG9yIGEgZGlyZWN0b3J5LgpAQCAtMzMwLDcgKzI5MSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGxpc3QKIAogICAgICAgICAjIHRyeSB0byBmaW5kIG1vZHVsZSBvciBwYWNrYWdlCi0gICAgICAgIG5hbWUgPSBfZ2V0X21vZHBrZ19wYXRoKG5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWMobmFtZSkKKyAgICAgICAgICAgIG5hbWUgPSBzcGVjLm9yaWdpbgorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBuYW1lID0gTm9uZQogICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgIHJldHVybiBbXQogCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvYnVpbGRyZWxlYXNlLmJhdCBiL1Rvb2xzL21zaS9idWlsZHJlbGVhc2UuYmF0CmluZGV4IDJlYWUwN2EuLjg5ZTZlYzEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9idWlsZHJlbGVhc2UuYmF0CisrKyBiL1Rvb2xzL21zaS9idWlsZHJlbGVhc2UuYmF0CkBAIC0zNSw3ICszNSw3IEBACiBzZXQgQlVJTERYNjQ9DQogc2V0IFRBUkdFVD1SZWJ1aWxkDQogc2V0IFRFU1RUQVJHRVRESVI9DQotc2V0IFBHTz0NCitzZXQgUEdPPWRlZmF1bHQNCiANCiANCiA6Q2hlY2tPcHRzDQpAQCAtNTUsNiArNTUsNyBAQAogaWYgIiUxIiBFUVUgIi14ODYiIChzZXQgQlVJTERYODY9MSkgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMNCiBpZiAiJTEiIEVRVSAiLXg2NCIgKHNldCBCVUlMRFg2ND0xKSAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cw0KIGlmICIlMSIgRVFVICItLXBnbyIgKHNldCBQR089JX4yKSAmJiBzaGlmdCAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cw0KK2lmICIlMSIgRVFVICItLXNraXAtcGdvIiAoc2V0IFBHTz0pICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzDQogDQogaWYgIiUxIiBORVEgIiIgZWNobyBJbnZhbGlkIG9wdGlvbjogIiUxIiAmJiBleGl0IC9CIDENCiANCkBAIC0xOTUsNyArMTk2LDcgQEAKIA0KIDpIZWxwDQogZWNobyBidWlsZHJlbGVhc2UuYmF0IFstLW91dCBESVJdIFsteDg2XSBbLXg2NF0gWy0tY2VydGlmaWNhdGUgQ0VSVE5BTUVdIFstLWJ1aWxkXSBbLS1za2lwLWJ1aWxkXQ0KLWVjaG8gICAgICAgICAgICAgICAgICBbLS1wZ28gQ09NTUFORF0gWy0tc2tpcC1kb2NdIFstLWRvd25sb2FkIERPV05MT0FEIFVSTF0gWy0tdGVzdCBUQVJHRVRESVJdDQorZWNobyAgICAgICAgICAgICAgICAgIFstLXBnbyBDT01NQU5EXSBbLS1za2lwLXBnb10gWy0tc2tpcC1kb2NdIFstLWRvd25sb2FkIERPV05MT0FEIFVSTF0gWy0tdGVzdCBUQVJHRVRESVJdDQogZWNobyAgICAgICAgICAgICAgICAgIFstaF0NCiBlY2hvLg0KIGVjaG8gICAgLS1vdXQgKC1vKSAgICAgICAgICBTcGVjaWZ5IGFuIGFkZGl0aW9uYWwgb3V0cHV0IGRpcmVjdG9yeSBmb3IgaW5zdGFsbGVycw0KQEAgLTIwNCw3ICsyMDUsOCBAQAogZWNobyAgICAtLWJ1aWxkICgtYikgICAgICAgIEluY3JlbWVudGFsbHkgYnVpbGQgUHl0aG9uIHJhdGhlciB0aGFuIHJlYnVpbGRpbmcNCiBlY2hvICAgIC0tc2tpcC1idWlsZCAoLUIpICAgRG8gbm90IGJ1aWxkIFB5dGhvbiAoanVzdCBkbyB0aGUgaW5zdGFsbGVycykNCiBlY2hvICAgIC0tc2tpcC1kb2MgKC1EKSAgICAgRG8gbm90IGJ1aWxkIGRvY3VtZW50YXRpb24NCi1lY2hvICAgIC0tcGdvICAgICAgICAgICAgICAgQnVpbGQgeDY0IGluc3RhbGxlcnMgdXNpbmcgUEdPDQorZWNobyAgICAtLXBnbyAgICAgICAgICAgICAgIFNwZWNpZnkgUEdPIGNvbW1hbmQgZm9yIHg2NCBpbnN0YWxsZXJzDQorZWNobyAgICAtLXNraXAtcGdvICAgICAgICAgIEJ1aWxkIHg2NCBpbnN0YWxsZXJzIHVzaW5nIFBHTw0KIGVjaG8gICAgLS1kb3dubG9hZCAgICAgICAgICBTcGVjaWZ5IHRoZSBmdWxsIGRvd25sb2FkIFVSTCBmb3IgTVNJcw0KIGVjaG8gICAgLS10ZXN0ICAgICAgICAgICAgICBTcGVjaWZ5IHRoZSB0ZXN0IGRpcmVjdG9yeSB0byBydW4gdGhlIGluc3RhbGxlciB0ZXN0cw0KIGVjaG8gICAgLWggICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscCBpbmZvcm1hdGlvbg0KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9idW5kbGUvRGVmYXVsdC50aG0gYi9Ub29scy9tc2kvYnVuZGxlL0RlZmF1bHQudGhtCmluZGV4IDRkOWM5N2EuLjFjMGJkMDggMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9idW5kbGUvRGVmYXVsdC50aG0KKysrIGIvVG9vbHMvbXNpL2J1bmRsZS9EZWZhdWx0LnRobQpAQCAtMTE2LDEwICsxMTYsMTEgQEAKICAgICAgICAgPFRleHQgWD0iMTg1IiBZPSIxMSIgV2lkdGg9Ii0xMSIgSGVpZ2h0PSIzNiIgRm9udElkPSIxIiBEaXNhYmxlUHJlZml4PSJ5ZXMiPiMobG9jLlN1Y2Nlc3NIZWFkZXIpPC9UZXh0PgogICAgICAgICA8SW1hZ2UgWD0iMCIgWT0iMCIgV2lkdGg9IjE3OCIgSGVpZ2h0PSIzODIiIEltYWdlRmlsZT0iU2lkZUJhci5wbmciLz4KIAotICAgICAgICA8SHlwZXJ0ZXh0IE5hbWU9IlN1Y2Nlc3NUZXh0IiBYPSIyMDUiIFk9IjcxIiBXaWR0aD0iLTMxIiBIZWlnaHQ9IjEwMCIgRm9udElkPSIzIiBEaXNhYmxlUHJlZml4PSJ5ZXMiPjwvSHlwZXJ0ZXh0PgorICAgICAgICA8SHlwZXJ0ZXh0IE5hbWU9IlN1Y2Nlc3NUZXh0IiBYPSIyMDUiIFk9IjcxIiBXaWR0aD0iLTcxIiBIZWlnaHQ9IjE1MCIgRm9udElkPSIzIiBEaXNhYmxlUHJlZml4PSJ5ZXMiPjwvSHlwZXJ0ZXh0PgogCi0gICAgICAgIDxUZXh0IE5hbWU9IlN1Y2Nlc3NSZXN0YXJ0VGV4dCIgWD0iMjA1IiBZPSItMTAwIiBXaWR0aD0iLTExIiBIZWlnaHQ9IjM0IiBGb250SWQ9IjMiIEhpZGVXaGVuRGlzYWJsZWQ9InllcyIgRGlzYWJsZVByZWZpeD0ieWVzIj4jKGxvYy5TdWNjZXNzUmVzdGFydFRleHQpPC9UZXh0PgotICAgICAgICA8QnV0dG9uIE5hbWU9IkxhdW5jaEJ1dHRvbiIgWD0iMTg1IiBZPSItNTAiIFdpZHRoPSItMTEiIEhlaWdodD0iNTkiIFRhYlN0b3A9InllcyIgRm9udElkPSIzIiBIZXhTdHlsZT0iMHhGIiBIaWRlV2hlbkRpc2FibGVkPSJ5ZXMiPiMobG9jLlN1Y2Nlc3NMYXVuY2hCdXR0b24pPC9CdXR0b24+CisgICAgICAgIDxCdXR0b24gTmFtZT0iU3VjY2Vzc01heFBhdGhCdXR0b24iIFg9IjE4NSIgWT0iLTcwIiBXaWR0aD0iLTExIiBIZWlnaHQ9IjgxIiBUYWJTdG9wPSJ5ZXMiIEZvbnRJZD0iMyIgSGV4U3R5bGU9IjB4RSIgSGlkZVdoZW5EaXNhYmxlZD0ieWVzIj4jKGxvYy5TdWNjZXNzTWF4UGF0aEJ1dHRvbik8L0J1dHRvbj4KKworICAgICAgICA8VGV4dCBOYW1lPSJTdWNjZXNzUmVzdGFydFRleHQiIFg9IjIwNSIgWT0iLTQwIiBXaWR0aD0iLTExIiBIZWlnaHQ9IjM0IiBGb250SWQ9IjMiIEhpZGVXaGVuRGlzYWJsZWQ9InllcyIgRGlzYWJsZVByZWZpeD0ieWVzIj4jKGxvYy5TdWNjZXNzUmVzdGFydFRleHQpPC9UZXh0PgogICAgICAgICA8QnV0dG9uIE5hbWU9IlN1Y2Nlc3NSZXN0YXJ0QnV0dG9uIiBYPSItMTAxIiBZPSItMTEiIFdpZHRoPSI4NSIgSGVpZ2h0PSIyNyIgVGFiU3RvcD0ieWVzIiBGb250SWQ9IjAiIEhpZGVXaGVuRGlzYWJsZWQ9InllcyI+Iyhsb2MuU3VjY2Vzc1Jlc3RhcnRCdXR0b24pPC9CdXR0b24+CiAgICAgICAgIDxCdXR0b24gTmFtZT0iU3VjY2Vzc0NhbmNlbEJ1dHRvbiIgWD0iLTExIiBZPSItMTEiIFdpZHRoPSI4NSIgSGVpZ2h0PSIyNyIgVGFiU3RvcD0ieWVzIiBGb250SWQ9IjAiPiMobG9jLkNsb3NlQnV0dG9uKTwvQnV0dG9uPgogICAgIDwvUGFnZT4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9idW5kbGUvRGVmYXVsdC53eGwgYi9Ub29scy9tc2kvYnVuZGxlL0RlZmF1bHQud3hsCmluZGV4IGVkNzkyNDYuLjQzNTA2ZDYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9idW5kbGUvRGVmYXVsdC53eGwKKysrIGIvVG9vbHMvbXNpL2J1bmRsZS9EZWZhdWx0Lnd4bApAQCAtMTQyLDQgKzE0Miw3IEBACiAgIDxTdHJpbmcgSWQ9IkZhaWx1cmVXUzJLM09yRWFybGllciI+V2luZG93cyBTZXJ2ZXIgMjAwOCBTUDIgb3IgbGF0ZXIgaXMgcmVxdWlyZWQgdG8gaW5zdGFsbCBhbmQgdXNlIFtXaXhCdW5kbGVOYW1lXS4KIAogVmlzaXQgJmx0O2EgaHJlZj0iaHR0cHM6Ly93d3cucHl0aG9uLm9yZy8iJmd0O3B5dGhvbi5vcmcmbHQ7L2EmZ3Q7IHRvIGRvd25sb2FkIFB5dGhvbiAzLjQuPC9TdHJpbmc+CisKKyAgPFN0cmluZyBJZD0iU3VjY2Vzc01heFBhdGhCdXR0b24iPkRpc2FibGUgcGF0aCBsZW5ndGggbGltaXQ8L1N0cmluZz4KKyAgPFN0cmluZyBJZD0iU3VjY2Vzc01heFBhdGhCdXR0b25Ob3RlIj5DaGFuZ2VzIHlvdXIgbWFjaGluZSBjb25maWd1cmF0aW9uIHRvIGFsbG93IHByb2dyYW1zLCBpbmNsdWRpbmcgUHl0aG9uLCB0byBieXBhc3MgdGhlIDI2MCBjaGFyYWN0ZXIgIk1BWF9QQVRIIiBsaW1pdGF0aW9uLjwvU3RyaW5nPgogPC9XaXhMb2NhbGl6YXRpb24+CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvYnVuZGxlL2Jvb3RzdHJhcC9QeXRob25Cb290c3RyYXBwZXJBcHBsaWNhdGlvbi5jcHAgYi9Ub29scy9tc2kvYnVuZGxlL2Jvb3RzdHJhcC9QeXRob25Cb290c3RyYXBwZXJBcHBsaWNhdGlvbi5jcHAKaW5kZXggYjdiMmVjZi4uNjc3MjZkNiAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2J1bmRsZS9ib290c3RyYXAvUHl0aG9uQm9vdHN0cmFwcGVyQXBwbGljYXRpb24uY3BwCisrKyBiL1Rvb2xzL21zaS9idW5kbGUvYm9vdHN0cmFwL1B5dGhvbkJvb3RzdHJhcHBlckFwcGxpY2F0aW9uLmNwcApAQCAtMTEsMTAgKzExLDYgQEAKICNpbmNsdWRlICJwY2guaCIKIAogc3RhdGljIGNvbnN0IExQQ1dTVFIgUFlCQV9XSU5ET1dfQ0xBU1MgPSBMIlB5dGhvbkJBIjsKLXN0YXRpYyBjb25zdCBMUENXU1RSIFBZQkFfVkFSSUFCTEVfTEFVTkNIX1RBUkdFVF9QQVRIID0gTCJMYXVuY2hUYXJnZXQiOwotc3RhdGljIGNvbnN0IExQQ1dTVFIgUFlCQV9WQVJJQUJMRV9MQVVOQ0hfVEFSR0VUX0VMRVZBVEVEX0lEID0gTCJMYXVuY2hUYXJnZXRFbGV2YXRlZElkIjsKLXN0YXRpYyBjb25zdCBMUENXU1RSIFBZQkFfVkFSSUFCTEVfTEFVTkNIX0FSR1VNRU5UUyA9IEwiTGF1bmNoQXJndW1lbnRzIjsKLXN0YXRpYyBjb25zdCBMUENXU1RSIFBZQkFfVkFSSUFCTEVfTEFVTkNIX0hJRERFTiA9IEwiTGF1bmNoSGlkZGVuIjsKIHN0YXRpYyBjb25zdCBEV09SRCBQWUJBX0FDUVVJUkVfUEVSQ0VOVEFHRSA9IDMwOwogc3RhdGljIGNvbnN0IExQQ1dTVFIgUFlCQV9WQVJJQUJMRV9CVU5ETEVfRklMRV9WRVJTSU9OID0gTCJXaXhCdW5kbGVGaWxlVmVyc2lvbiI7CiAKQEAgLTEyOSwxMSArMTI1LDExIEBACiAgICAgSURfUFJPR1JFU1NfQ0FOQ0VMX0JVVFRPTiwKIAogICAgIC8vIFN1Y2Nlc3MgcGFnZQotICAgIElEX0xBVU5DSF9CVVRUT04sCiAgICAgSURfU1VDQ0VTU19URVhULAogICAgIElEX1NVQ0NFU1NfUkVTVEFSVF9URVhULAogICAgIElEX1NVQ0NFU1NfUkVTVEFSVF9CVVRUT04sCiAgICAgSURfU1VDQ0VTU19DQU5DRUxfQlVUVE9OLAorICAgIElEX1NVQ0NFU1NfTUFYX1BBVEhfQlVUVE9OLAogCiAgICAgLy8gRmFpbHVyZSBwYWdlCiAgICAgSURfRkFJTFVSRV9MT0dGSUxFX0xJTkssCkBAIC0xODgsMTEgKzE4NCwxMSBAQAogICAgIHsgSURfT1ZFUkFMTF9QUk9HUkVTU19URVhULCBMIk92ZXJhbGxQcm9ncmVzc1RleHQiIH0sCiAgICAgeyBJRF9QUk9HUkVTU19DQU5DRUxfQlVUVE9OLCBMIlByb2dyZXNzQ2FuY2VsQnV0dG9uIiB9LAogCi0gICAgeyBJRF9MQVVOQ0hfQlVUVE9OLCBMIkxhdW5jaEJ1dHRvbiIgfSwKICAgICB7IElEX1NVQ0NFU1NfVEVYVCwgTCJTdWNjZXNzVGV4dCIgfSwKICAgICB7IElEX1NVQ0NFU1NfUkVTVEFSVF9URVhULCBMIlN1Y2Nlc3NSZXN0YXJ0VGV4dCIgfSwKICAgICB7IElEX1NVQ0NFU1NfUkVTVEFSVF9CVVRUT04sIEwiU3VjY2Vzc1Jlc3RhcnRCdXR0b24iIH0sCiAgICAgeyBJRF9TVUNDRVNTX0NBTkNFTF9CVVRUT04sIEwiU3VjY2Vzc0NhbmNlbEJ1dHRvbiIgfSwKKyAgICB7IElEX1NVQ0NFU1NfTUFYX1BBVEhfQlVUVE9OLCBMIlN1Y2Nlc3NNYXhQYXRoQnV0dG9uIiB9LAogCiAgICAgeyBJRF9GQUlMVVJFX0xPR0ZJTEVfTElOSywgTCJGYWlsdXJlTG9nRmlsZUxpbmsiIH0sCiAgICAgeyBJRF9GQUlMVVJFX01FU1NBR0VfVEVYVCwgTCJGYWlsdXJlTWVzc2FnZVRleHQiIH0sCkBAIC00MzMsNiArNDI5LDExIEBACiAgICAgICAgIGNhc2UgSURfVU5JTlNUQUxMX0JVVFRPTjoKICAgICAgICAgICAgIE9uUGxhbihCT09UU1RSQVBQRVJfQUNUSU9OX1VOSU5TVEFMTCk7CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElEX1NVQ0NFU1NfTUFYX1BBVEhfQlVUVE9OOgorICAgICAgICAgICAgRW5hYmxlTWF4UGF0aFN1cHBvcnQoKTsKKyAgICAgICAgICAgIFRoZW1lQ29udHJvbEVuYWJsZShfdGhlbWUsIElEX1NVQ0NFU1NfTUFYX1BBVEhfQlVUVE9OLCBGQUxTRSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgTEV4aXQ6CkBAIC01MzAsOSArNTMxLDggQEAKICAgICB9CiAKICAgICB2b2lkIFN1Y2Nlc3NQYWdlX1Nob3coKSB7Ci0gICAgICAgIC8vIG9uIHRoZSAiU3VjY2VzcyIgcGFnZSwgY2hlY2sgaWYgdGhlIHJlc3RhcnQgb3IgbGF1bmNoIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC4KKyAgICAgICAgLy8gb24gdGhlICJTdWNjZXNzIiBwYWdlLCBjaGVjayBpZiB0aGUgcmVzdGFydCBidXR0b24gc2hvdWxkIGJlIGVuYWJsZWQuCiAgICAgICAgIEJPT0wgc2hvd1Jlc3RhcnRCdXR0b24gPSBGQUxTRTsKLSAgICAgICAgQk9PTCBsYXVuY2hUYXJnZXRFeGlzdHMgPSBGQUxTRTsKICAgICAgICAgTE9DX1NUUklORyAqc3VjY2Vzc1RleHQgPSBudWxscHRyOwogICAgICAgICBIUkVTVUxUIGhyID0gU19PSzsKICAgICAgICAgCkBAIC01NDAsOCArNTQwLDYgQEAKICAgICAgICAgICAgIGlmIChCT09UU1RSQVBQRVJfUkVTVEFSVF9QUk9NUFQgPT0gX2NvbW1hbmQucmVzdGFydCkgewogICAgICAgICAgICAgICAgIHNob3dSZXN0YXJ0QnV0dG9uID0gVFJVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChUaGVtZUNvbnRyb2xFeGlzdHMoX3RoZW1lLCBJRF9MQVVOQ0hfQlVUVE9OKSkgewotICAgICAgICAgICAgbGF1bmNoVGFyZ2V0RXhpc3RzID0gQmFsU3RyaW5nVmFyaWFibGVFeGlzdHMoUFlCQV9WQVJJQUJMRV9MQVVOQ0hfVEFSR0VUX1BBVEgpOwogICAgICAgICB9CiAKICAgICAgICAgc3dpdGNoIChfcGxhbm5lZEFjdGlvbikgewpAQCAtNTY4LDkgKzU2Niw0MSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgVGhlbWVDb250cm9sRW5hYmxlKF90aGVtZSwgSURfTEFVTkNIX0JVVFRPTiwgbGF1bmNoVGFyZ2V0RXhpc3RzICYmIEJPT1RTVFJBUFBFUl9BQ1RJT05fVU5JTlNUQUxMIDwgX3BsYW5uZWRBY3Rpb24pOwogICAgICAgICBUaGVtZUNvbnRyb2xFbmFibGUoX3RoZW1lLCBJRF9TVUNDRVNTX1JFU1RBUlRfVEVYVCwgc2hvd1Jlc3RhcnRCdXR0b24pOwogICAgICAgICBUaGVtZUNvbnRyb2xFbmFibGUoX3RoZW1lLCBJRF9TVUNDRVNTX1JFU1RBUlRfQlVUVE9OLCBzaG93UmVzdGFydEJ1dHRvbik7CisKKyAgICAgICAgaWYgKF9jb21tYW5kLmFjdGlvbiAhPSBCT09UU1RSQVBQRVJfQUNUSU9OX0lOU1RBTEwgfHwKKyAgICAgICAgICAgICFJc1dpbmRvd3NWZXJzaW9uT3JHcmVhdGVyKDEwLCAwLCAwKSkgeworICAgICAgICAgICAgVGhlbWVDb250cm9sRW5hYmxlKF90aGVtZSwgSURfU1VDQ0VTU19NQVhfUEFUSF9CVVRUT04sIEZBTFNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERXT1JEIGRhdGFUeXBlID0gMCwgYnVmZmVyID0gMCwgYnVmZmVyTGVuID0gc2l6ZW9mKGJ1ZmZlcik7CisgICAgICAgICAgICBIS0VZIGhLZXk7CisgICAgICAgICAgICBMUkVTVUxUIHJlcyA9IFJlZ09wZW5LZXlFeFcoCisgICAgICAgICAgICAgICAgSEtFWV9MT0NBTF9NQUNISU5FLAorICAgICAgICAgICAgICAgIEwiU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcQ29udHJvbFxcRmlsZVN5c3RlbSIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBLRVlfUkVBRCwKKyAgICAgICAgICAgICAgICAmaEtleQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIHJlcyA9IFJlZ1F1ZXJ5VmFsdWVFeFcoaEtleSwgTCJMb25nUGF0aHNFbmFibGVkIiwgbnVsbHB0ciwgJmRhdGFUeXBlLAorICAgICAgICAgICAgICAgICAgICAoTFBCWVRFKSZidWZmZXIsICZidWZmZXJMZW4pOworICAgICAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KGhLZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQmFsTG9nKEJPT1RTVFJBUFBFUl9MT0dfTEVWRUxfU1RBTkRBUkQsICJGYWlsZWQgdG8gb3BlbiBTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxDb250cm9sXFxGaWxlU3lzdGVtOiBlcnJvciBjb2RlICVkIiwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXMgPT0gRVJST1JfU1VDQ0VTUyAmJiBkYXRhVHlwZSA9PSBSRUdfRFdPUkQgJiYgYnVmZmVyID09IDApIHsKKyAgICAgICAgICAgICAgICBUaGVtZUNvbnRyb2xFbGV2YXRlcyhfdGhlbWUsIElEX1NVQ0NFU1NfTUFYX1BBVEhfQlVUVE9OLCBUUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgQmFsTG9nKEJPT1RTVFJBUFBFUl9MT0dfTEVWRUxfU1RBTkRBUkQsICJGYWlsZWQgdG8gcmVhZCBMb25nUGF0aHNFbmFibGVkIHZhbHVlOiBlcnJvciBjb2RlICVkIiwgcmVzKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIEJhbExvZyhCT09UU1RSQVBQRVJfTE9HX0xFVkVMX1NUQU5EQVJELCAiSGlkaW5nIE1BWF9QQVRIIGJ1dHRvbiBiZWNhdXNlIGl0IGlzIGFscmVhZHkgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgIFRoZW1lQ29udHJvbEVuYWJsZShfdGhlbWUsIElEX1NVQ0NFU1NfTUFYX1BBVEhfQlVUVE9OLCBGQUxTRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIEZhaWx1cmVQYWdlX1Nob3coKSB7CkBAIC02MjMsNiArNjUzLDM0IEBACiAgICAgICAgIFRoZW1lQ29udHJvbEVuYWJsZShfdGhlbWUsIElEX0ZBSUxVUkVfUkVTVEFSVF9CVVRUT04sIHNob3dSZXN0YXJ0QnV0dG9uKTsKICAgICB9CiAKKyAgICBzdGF0aWMgdm9pZCBFbmFibGVNYXhQYXRoU3VwcG9ydCgpIHsKKyAgICAgICAgTFBXU1RSIHRhcmdldERpciA9IG51bGxwdHIsIGRlZmF1bHREaXIgPSBudWxscHRyOworICAgICAgICBIUkVTVUxUIGhyID0gQmFsR2V0U3RyaW5nVmFyaWFibGUoTCJUYXJnZXREaXIiLCAmdGFyZ2V0RGlyKTsKKyAgICAgICAgaWYgKEZBSUxFRChocikgfHwgIXRhcmdldERpciB8fCAhdGFyZ2V0RGlyWzBdKSB7CisgICAgICAgICAgICBCYWxMb2coQk9PVFNUUkFQUEVSX0xPR19MRVZFTF9FUlJPUiwgIkZhaWxlZCB0byBnZXQgVGFyZ2V0RGlyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMUFdTVFIgcHl0aG9udyA9IG51bGxwdHI7CisgICAgICAgIFN0ckFsbG9jRm9ybWF0dGVkKCZweXRob253LCBMIiVsc1xccHl0aG9udy5leGUiLCB0YXJnZXREaXIpOworICAgICAgICBpZiAoIXB5dGhvbncgfHwgIXB5dGhvbndbMF0pIHsKKyAgICAgICAgICAgIEJhbExvZyhCT09UU1RSQVBQRVJfTE9HX0xFVkVMX0VSUk9SLCAiRmFpbGVkIHRvIGNvbnN0cnVjdCBweXRob253LmV4ZSBwYXRoIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMUENXU1RSIGFyZ3VtZW50cyA9IEwiLWMgXCJpbXBvcnQgd2lucmVnOyAiCisgICAgICAgICAgICAid2lucmVnLlNldFZhbHVlRXgoIgorICAgICAgICAgICAgICAgICJ3aW5yZWcuQ3JlYXRlS2V5KHdpbnJlZy5IS0VZX0xPQ0FMX01BQ0hJTkUsICIKKyAgICAgICAgICAgICAgICAgICAgInInU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcQ29udHJvbFxcRmlsZVN5c3RlbScpLCAiCisgICAgICAgICAgICAgICAgIidMb25nUGF0aHNFbmFibGVkJywgIgorICAgICAgICAgICAgICAgICJOb25lLCAiCisgICAgICAgICAgICAgICAgIndpbnJlZy5SRUdfRFdPUkQsICIKKyAgICAgICAgICAgICAgICAiMSIKKyAgICAgICAgICAgICIpXCIiOworICAgICAgICBCYWxMb2coQk9PVFNUUkFQUEVSX0xPR19MRVZFTF9TVEFOREFSRCwgIkV4ZWN1dGluZyAlbHMgJWxzIiwgcHl0aG9udywgYXJndW1lbnRzKTsKKyAgICAgICAgSElOU1RBTkNFIHJlcyA9IFNoZWxsRXhlY3V0ZVcoMCwgTCJydW5hcyIsIHB5dGhvbncsIGFyZ3VtZW50cywgTlVMTCwgU1dfSElERSk7CisgICAgICAgIEJhbExvZyhCT09UU1RSQVBQRVJfTE9HX0xFVkVMX1NUQU5EQVJELCAicmV0dXJuIGNvZGUgMHglMDh4IiwgcmVzKTsKKyAgICB9CiAKIHB1YmxpYzogLy8gSUJvb3RzdHJhcHBlckFwcGxpY2F0aW9uCiAgICAgdmlydHVhbCBTVERNRVRIT0RJTVAgT25TdGFydHVwKCkgewpAQCAtMTIxMywxMiArMTI3MSw2IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBTVERNRVRIT0RJTVBfKHZvaWQpIE9uTGF1bmNoQXBwcm92ZWRFeGVDb21wbGV0ZShfX2luIEhSRVNVTFQgaHJTdGF0dXMsIF9faW4gRFdPUkQgLypwcm9jZXNzSWQqLykgewotICAgICAgICBpZiAoSFJFU1VMVF9GUk9NX1dJTjMyKEVSUk9SX0FDQ0VTU19ERU5JRUQpID09IGhyU3RhdHVzKSB7Ci0gICAgICAgICAgICAvL3RyeSB3aXRoIFNoZWxFeGVjIG5leHQgdGltZQotICAgICAgICAgICAgT25DbGlja0xhdW5jaEJ1dHRvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgOjpQb3N0TWVzc2FnZVcoX2hXbmQsIFdNX0NMT1NFLCAwLCAwKTsKLSAgICAgICAgfQogICAgIH0KIAogCkBAIC0xODY0LDEwICsxOTE2LDYgQEAKICAgICAgICAgICAgIHN3aXRjaCAoTE9XT1JEKHdQYXJhbSkpIHsKICAgICAgICAgICAgIC8vIEN1c3RvbWl6ZSBjb21tYW5kcwogICAgICAgICAgICAgLy8gU3VjY2Vzcy9mYWlsdXJlIGNvbW1hbmRzCi0gICAgICAgICAgICBjYXNlIElEX0xBVU5DSF9CVVRUT046Ci0gICAgICAgICAgICAgICAgcEJBLT5PbkNsaWNrTGF1bmNoQnV0dG9uKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KICAgICAgICAgICAgIGNhc2UgSURfU1VDQ0VTU19SRVNUQVJUX0JVVFRPTjogX19mYWxsdGhyb3VnaDsKICAgICAgICAgICAgIGNhc2UgSURfRkFJTFVSRV9SRVNUQVJUX0JVVFRPTjoKICAgICAgICAgICAgICAgICBwQkEtPk9uQ2xpY2tSZXN0YXJ0QnV0dG9uKCk7CkBAIC0yMzY5LDY5ICsyNDE3LDYgQEAKICAgICB9CiAKIAotICAgIC8vCi0gICAgLy8gT25DbGlja0xhdW5jaEJ1dHRvbiAtIGxhdW5jaCB0aGUgYXBwIGZyb20gdGhlIHN1Y2Nlc3MgcGFnZS4KLSAgICAvLwotICAgIHZvaWQgT25DbGlja0xhdW5jaEJ1dHRvbigpIHsKLSAgICAgICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgICAgIExQV1NUUiBzY3pVbmZvcm1hdHRlZExhdW5jaFRhcmdldCA9IG51bGxwdHI7Ci0gICAgICAgIExQV1NUUiBzY3pMYXVuY2hUYXJnZXQgPSBudWxscHRyOwotICAgICAgICBMUFdTVFIgc2N6TGF1bmNoVGFyZ2V0RWxldmF0ZWRJZCA9IG51bGxwdHI7Ci0gICAgICAgIExQV1NUUiBzY3pVbmZvcm1hdHRlZEFyZ3VtZW50cyA9IG51bGxwdHI7Ci0gICAgICAgIExQV1NUUiBzY3pBcmd1bWVudHMgPSBudWxscHRyOwotICAgICAgICBpbnQgbkNtZFNob3cgPSBTV19TSE9XTk9STUFMOwotCi0gICAgICAgIGhyID0gQmFsR2V0U3RyaW5nVmFyaWFibGUoUFlCQV9WQVJJQUJMRV9MQVVOQ0hfVEFSR0VUX1BBVEgsICZzY3pVbmZvcm1hdHRlZExhdW5jaFRhcmdldCk7Ci0gICAgICAgIEJhbEV4aXRPbkZhaWx1cmUxKGhyLCAiRmFpbGVkIHRvIGdldCBsYXVuY2ggdGFyZ2V0IHZhcmlhYmxlICclbHMnLiIsIFBZQkFfVkFSSUFCTEVfTEFVTkNIX1RBUkdFVF9QQVRIKTsKLQotICAgICAgICBociA9IEJhbEZvcm1hdFN0cmluZyhzY3pVbmZvcm1hdHRlZExhdW5jaFRhcmdldCwgJnNjekxhdW5jaFRhcmdldCk7Ci0gICAgICAgIEJhbEV4aXRPbkZhaWx1cmUxKGhyLCAiRmFpbGVkIHRvIGZvcm1hdCBsYXVuY2ggdGFyZ2V0IHZhcmlhYmxlOiAlbHMiLCBzY3pVbmZvcm1hdHRlZExhdW5jaFRhcmdldCk7Ci0KLSAgICAgICAgaWYgKEJhbFN0cmluZ1ZhcmlhYmxlRXhpc3RzKFBZQkFfVkFSSUFCTEVfTEFVTkNIX1RBUkdFVF9FTEVWQVRFRF9JRCkpIHsKLSAgICAgICAgICAgIGhyID0gQmFsR2V0U3RyaW5nVmFyaWFibGUoUFlCQV9WQVJJQUJMRV9MQVVOQ0hfVEFSR0VUX0VMRVZBVEVEX0lELCAmc2N6TGF1bmNoVGFyZ2V0RWxldmF0ZWRJZCk7Ci0gICAgICAgICAgICBCYWxFeGl0T25GYWlsdXJlMShociwgIkZhaWxlZCB0byBnZXQgbGF1bmNoIHRhcmdldCBlbGV2YXRlZCBpZCAnJWxzJy4iLCBQWUJBX1ZBUklBQkxFX0xBVU5DSF9UQVJHRVRfRUxFVkFURURfSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEJhbFN0cmluZ1ZhcmlhYmxlRXhpc3RzKFBZQkFfVkFSSUFCTEVfTEFVTkNIX0FSR1VNRU5UUykpIHsKLSAgICAgICAgICAgIGhyID0gQmFsR2V0U3RyaW5nVmFyaWFibGUoUFlCQV9WQVJJQUJMRV9MQVVOQ0hfQVJHVU1FTlRTLCAmc2N6VW5mb3JtYXR0ZWRBcmd1bWVudHMpOwotICAgICAgICAgICAgQmFsRXhpdE9uRmFpbHVyZTEoaHIsICJGYWlsZWQgdG8gZ2V0IGxhdW5jaCBhcmd1bWVudHMgJyVscycuIiwgUFlCQV9WQVJJQUJMRV9MQVVOQ0hfQVJHVU1FTlRTKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChCYWxTdHJpbmdWYXJpYWJsZUV4aXN0cyhQWUJBX1ZBUklBQkxFX0xBVU5DSF9ISURERU4pKSB7Ci0gICAgICAgICAgICBuQ21kU2hvdyA9IFNXX0hJREU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2N6TGF1bmNoVGFyZ2V0RWxldmF0ZWRJZCAmJiAhX3RyaWVkVG9MYXVuY2hFbGV2YXRlZCkgewotICAgICAgICAgICAgX3RyaWVkVG9MYXVuY2hFbGV2YXRlZCA9IFRSVUU7Ci0gICAgICAgICAgICBociA9IF9lbmdpbmUtPkxhdW5jaEFwcHJvdmVkRXhlKF9oV25kLCBzY3pMYXVuY2hUYXJnZXRFbGV2YXRlZElkLCBzY3pVbmZvcm1hdHRlZEFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgICAgICAgICAgIEJhbExvZ0Vycm9yKGhyLCAiRmFpbGVkIHRvIGxhdW5jaCBlbGV2YXRlZCB0YXJnZXQ6ICVscyIsIHNjekxhdW5jaFRhcmdldEVsZXZhdGVkSWQpOwotCi0gICAgICAgICAgICAgICAgLy90cnkgd2l0aCBTaGVsRXhlYyBuZXh0IHRpbWUKLSAgICAgICAgICAgICAgICBPbkNsaWNrTGF1bmNoQnV0dG9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2N6VW5mb3JtYXR0ZWRBcmd1bWVudHMpIHsKLSAgICAgICAgICAgICAgICBociA9IEJhbEZvcm1hdFN0cmluZyhzY3pVbmZvcm1hdHRlZEFyZ3VtZW50cywgJnNjekFyZ3VtZW50cyk7Ci0gICAgICAgICAgICAgICAgQmFsRXhpdE9uRmFpbHVyZTEoaHIsICJGYWlsZWQgdG8gZm9ybWF0IGxhdW5jaCBhcmd1bWVudHMgdmFyaWFibGU6ICVscyIsIHNjelVuZm9ybWF0dGVkQXJndW1lbnRzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaHIgPSBTaGVsRXhlYyhzY3pMYXVuY2hUYXJnZXQsIHNjekFyZ3VtZW50cywgTCJvcGVuIiwgbnVsbHB0ciwgbkNtZFNob3csIF9oV25kLCBudWxscHRyKTsKLSAgICAgICAgICAgIEJhbEV4aXRPbkZhaWx1cmUxKGhyLCAiRmFpbGVkIHRvIGxhdW5jaCB0YXJnZXQ6ICVscyIsIHNjekxhdW5jaFRhcmdldCk7Ci0KLSAgICAgICAgICAgIDo6UG9zdE1lc3NhZ2VXKF9oV25kLCBXTV9DTE9TRSwgMCwgMCk7Ci0gICAgICAgIH0KLQotICAgIExFeGl0OgotICAgICAgICBTdHJTZWN1cmVaZXJvRnJlZVN0cmluZyhzY3pBcmd1bWVudHMpOwotICAgICAgICBSZWxlYXNlU3RyKHNjelVuZm9ybWF0dGVkQXJndW1lbnRzKTsKLSAgICAgICAgUmVsZWFzZVN0cihzY3pMYXVuY2hUYXJnZXRFbGV2YXRlZElkKTsKLSAgICAgICAgU3RyU2VjdXJlWmVyb0ZyZWVTdHJpbmcoc2N6TGF1bmNoVGFyZ2V0KTsKLSAgICAgICAgUmVsZWFzZVN0cihzY3pVbmZvcm1hdHRlZExhdW5jaFRhcmdldCk7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogCiAgICAgLy8KICAgICAvLyBPbkNsaWNrUmVzdGFydEJ1dHRvbiAtIGFsbG93cyB0aGUgcmVzdGFydCBhbmQgY2xvc2VzIHRoZSBhcHAuCkBAIC0zMTU0LDcgKzMxMzksNiBAQAogICAgICAgICBfdGFza2JhckJ1dHRvbkNyZWF0ZWRNZXNzYWdlID0gVUlOVF9NQVg7CiAgICAgICAgIF90YXNrYmFyQnV0dG9uT0sgPSBGQUxTRTsKICAgICAgICAgX3Nob3dpbmdJbnRlcm5hbFVJVGhpc1BhY2thZ2UgPSBGQUxTRTsKLSAgICAgICAgX3RyaWVkVG9MYXVuY2hFbGV2YXRlZCA9IEZBTFNFOwogCiAgICAgICAgIF9zdXBwcmVzc1BhaW50ID0gRkFMU0U7CiAKQEAgLTMyMzksNyArMzIyMyw2IEBACiAgICAgVUlOVCBfdGFza2JhckJ1dHRvbkNyZWF0ZWRNZXNzYWdlOwogICAgIEJPT0wgX3Rhc2tiYXJCdXR0b25PSzsKICAgICBCT09MIF9zaG93aW5nSW50ZXJuYWxVSVRoaXNQYWNrYWdlOwotICAgIEJPT0wgX3RyaWVkVG9MYXVuY2hFbGV2YXRlZDsKIAogICAgIEJPT0wgX3N1cHByZXNzUGFpbnQ7CiAKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9idW5kbGUvYnVuZGxlLmljbyBiL1Rvb2xzL21zaS9idW5kbGUvYnVuZGxlLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiNjI5ZS4uMDAwMDAwMAotLS0gYS9Ub29scy9tc2kvYnVuZGxlL2J1bmRsZS5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvYnVuZGxlL2J1bmRsZS53eHMgYi9Ub29scy9tc2kvYnVuZGxlL2J1bmRsZS53eHMKaW5kZXggMzgzMDdlMC4uYzg5ZTZlZSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2J1bmRsZS9idW5kbGUud3hzCisrKyBiL1Rvb2xzL21zaS9idW5kbGUvYnVuZGxlLnd4cwpAQCAtNCw3ICs0LDcgQEAKICAgPEJ1bmRsZSBOYW1lPSIhKGxvYy5GdWxsUHJvZHVjdE5hbWUpIgogICAgICAgICAgIFVwZ3JhZGVDb2RlPSIkKHZhci5Db3JlVXBncmFkZUNvZGUpIgogICAgICAgICAgIFZlcnNpb249IiQodmFyLlZlcnNpb24pIgotICAgICAgICAgIEljb25Tb3VyY2VGaWxlPSJidW5kbGUuaWNvIgorICAgICAgICAgIEljb25Tb3VyY2VGaWxlPSIuLlwuLlwuLlxQQ1xpY29uc1xzZXR1cC5pY28iCiAgICAgICAgICAgTWFudWZhY3R1cmVyPSIhKGxvYy5NYW51ZmFjdHVyZXIpIgogICAgICAgICAgIEFib3V0VXJsPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIgogICAgICAgICAgIERpc2FibGVNb2RpZnk9ImJ1dHRvbiIKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9jb21tb24ud3hzIGIvVG9vbHMvbXNpL2NvbW1vbi53eHMKaW5kZXggNGVmYWQ2NS4uYzg5NGViOCAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2NvbW1vbi53eHMKKysrIGIvVG9vbHMvbXNpL2NvbW1vbi53eHMKQEAgLTEsNiArMSwxMCBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxXaXggeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDYvd2kiPgogICAgIDxGcmFnbWVudD4KKyAgICAgICAgPFByb3BlcnR5IElkPSJST09UUkVHSVNUUllLRVkiIFZhbHVlPSJTb2Z0d2FyZVxQeXRob25cUHl0aG9uQ29yZSIgLz4KKyAgICA8L0ZyYWdtZW50PgorICAgIAorICAgIDxGcmFnbWVudD4KICAgICAgICAgPFByb3BlcnR5IElkPSJSRUdJU1RSWUtFWSIgVmFsdWU9IlNvZnR3YXJlXFB5dGhvblxQeXRob25Db3JlXCQodmFyLlNob3J0VmVyc2lvbikkKHZhci5QeUFyY2hFeHQpJCh2YXIuUHlUZXN0RXh0KSIgLz4KICAgICA8L0ZyYWdtZW50PgogICAgIApAQCAtNDAsNyArNDQsNyBAQAogICAgIAogICAgIDxGcmFnbWVudD4KICAgICAgICAgPCEtLSBJbmNsdWRlIGFuIGljb24gZm9yIHRoZSBQcm9ncmFtcyBhbmQgRmVhdHVyZXMgZGlhbG9nIC0tPgotICAgICAgICA8SWNvbiBJZD0iQVJQSWNvbiIgU291cmNlRmlsZT0iIShiaW5kcGF0aC5zcmMpUENccHljb24uaWNvIiAvPgorICAgICAgICA8SWNvbiBJZD0iQVJQSWNvbiIgU291cmNlRmlsZT0iIShiaW5kcGF0aC5zcmMpUENcaWNvbnNccHl0aG9uLmljbyIgLz4KICAgICAgICAgPFByb3BlcnR5IElkPSJBUlBQUk9EVUNUSUNPTiIgVmFsdWU9IkFSUEljb24iIC8+CiAgICAgICAgIDxQcm9wZXJ0eSBJZD0iQVJQTk9NT0RJRlkiIFZhbHVlPSIxIiAvPgogICAgICAgICA8UHJvcGVydHkgSWQ9IkRJU0FCTEVBRFZUU0hPUlRDVVRTIiBWYWx1ZT0iMSIgLz4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9jb21tb25fZW4tVVMud3hsX3RlbXBsYXRlIGIvVG9vbHMvbXNpL2NvbW1vbl9lbi1VUy53eGxfdGVtcGxhdGUKaW5kZXggOGQwMzUyNi4uYzk1YzI3MSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2NvbW1vbl9lbi1VUy53eGxfdGVtcGxhdGUKKysrIGIvVG9vbHMvbXNpL2NvbW1vbl9lbi1VUy53eGxfdGVtcGxhdGUKQEAgLTE0LDQgKzE0LDUgQEAKICAgICA8U3RyaW5nIElkPSJOb0Rvd25ncmFkZSI+QSBuZXdlciB2ZXJzaW9uIG9mICEobG9jLlByb2R1Y3ROYW1lKSBpcyBhbHJlYWR5IGluc3RhbGxlZC48L1N0cmluZz4KICAgICA8U3RyaW5nIElkPSJJbmNvcnJlY3RDb3JlIj5BbiBpbmNvcnJlY3QgdmVyc2lvbiBvZiBhIHByZXJlcXVpc2l0ZSBwYWNrYWdlIGlzIGluc3RhbGxlZC4gUGxlYXNlIHVuaW5zdGFsbCBhbnkgb3RoZXIgdmVyc2lvbnMgb2YgIShsb2MuUHJvZHVjdE5hbWUpIGFuZCB0cnkgaW5zdGFsbGluZyB0aGlzIGFnYWluLjwvU3RyaW5nPgogICAgIDxTdHJpbmcgSWQ9Ik5vVGFyZ2V0RGlyIj5UaGUgVEFSR0VURElSIHZhcmlhYmxlIG11c3QgYmUgcHJvdmlkZWQgd2hlbiBpbnZva2luZyB0aGlzIGluc3RhbGxlci48L1N0cmluZz4KKyAgICA8U3RyaW5nIElkPSJNYW51ZmFjdHVyZXJTdXBwb3J0VXJsIj5odHRwOi8vd3d3LnB5dGhvbi5vcmcvPC9TdHJpbmc+CiA8L1dpeExvY2FsaXphdGlvbj4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9leGUvZXhlLndpeHByb2ogYi9Ub29scy9tc2kvZXhlL2V4ZS53aXhwcm9qCmluZGV4IGQyNmE2MDMuLjI0ZGYwZjUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9leGUvZXhlLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL2V4ZS9leGUud2l4cHJvagpAQCAtMTQsNiArMTQsNyBAQAogICAgIDxJdGVtR3JvdXA+CiAgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZS53eHMiIC8+CiAgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZV9maWxlcy53eHMiIC8+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZV9yZWcud3hzIiAvPgogICAgIDwvSXRlbUdyb3VwPgogICAgIDxJdGVtR3JvdXA+CiAgICAgICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9Iioud3hsIiAvPgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2V4ZS9leGUud3hzIGIvVG9vbHMvbXNpL2V4ZS9leGUud3hzCmluZGV4IDE1NGNlZTUuLjAzZDQzYzYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9leGUvZXhlLnd4cworKysgYi9Ub29scy9tc2kvZXhlL2V4ZS53eHMKQEAgLTksNiArOSw3IEBACiAgICAgICAgIAogICAgICAgICA8RmVhdHVyZSBJZD0iRGVmYXVsdEZlYXR1cmUiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlKSIgRGVzY3JpcHRpb249IiEobG9jLkRlc2NyaXB0aW9uKSI+CiAgICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImV4ZV9weXRob24iIFByaW1hcnk9InllcyIgLz4KKyAgICAgICAgICAgIDxDb21wb25lbnRHcm91cFJlZiBJZD0iZXhlX3JlZyIgUHJpbWFyeT0ieWVzIiAvPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJleGVfdHh0IiAvPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJleGVfaWNvbnMiIC8+CiAgICAgICAgICAgICA8Q29tcG9uZW50UmVmIElkPSJPcHRpb25hbEZlYXR1cmUiIC8+CkBAIC0yNCw3ICsyNSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtpbmdEaXJlY3Rvcnk9Ikluc3RhbGxEaXJlY3RvcnkiIC8+CiAgICAgICAgICAgICAgICAgPFJlbW92ZUZvbGRlciBJZD0iUmVtb3ZlX01lbnVEaXIiIERpcmVjdG9yeT0iTWVudURpciIgT249InVuaW5zdGFsbCIgLz4KICAgICAgICAgICAgICAgICA8UmVnaXN0cnlLZXkgUm9vdD0iSEtNVSIgS2V5PSJbUkVHSVNUUllLRVldIj4KLSAgICAgICAgICAgICAgICAgICAgPFJlZ2lzdHJ5VmFsdWUgS2V5PSJJbnN0YWxsUGF0aFxJbnN0YWxsR3JvdXAiIFR5cGU9InN0cmluZyIgVmFsdWU9IiEobG9jLlByb2R1Y3ROYW1lKSIgS2V5UGF0aD0ieWVzIiAvPgogICAgICAgICAgICAgICAgICAgICA8UmVnaXN0cnlWYWx1ZSBLZXk9Ikluc3RhbGxlZEZlYXR1cmVzIiBOYW1lPSJTaG9ydGN1dHMiIFR5cGU9InN0cmluZyIgVmFsdWU9IiQodmFyLlZlcnNpb24pIiAvPgogICAgICAgICAgICAgICAgIDwvUmVnaXN0cnlLZXk+CiAgICAgICAgICAgICA8L0NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9leGUvZXhlX2Qud2l4cHJvaiBiL1Rvb2xzL21zaS9leGUvZXhlX2Qud2l4cHJvagppbmRleCAyNzU0NWNhLi5jZjA4NWJlIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvZXhlL2V4ZV9kLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL2V4ZS9leGVfZC53aXhwcm9qCkBAIC0xMCw2ICsxMCw3IEBACiAgICAgPEl0ZW1Hcm91cD4KICAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iZXhlX2Qud3hzIiAvPgogICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJleGVfZmlsZXMud3hzIiAvPgorICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJleGVfcmVnLnd4cyIgLz4KICAgICA8L0l0ZW1Hcm91cD4KICAgICA8SXRlbUdyb3VwPgogICAgICAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSIqLnd4bCIgLz4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9leGUvZXhlX2VuLVVTLnd4bF90ZW1wbGF0ZSBiL1Rvb2xzL21zaS9leGUvZXhlX2VuLVVTLnd4bF90ZW1wbGF0ZQppbmRleCA1NzdmYmU1Li4xZjllMjkwIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvZXhlL2V4ZV9lbi1VUy53eGxfdGVtcGxhdGUKKysrIGIvVG9vbHMvbXNpL2V4ZS9leGVfZW4tVVMud3hsX3RlbXBsYXRlCkBAIC00LDQgKzQsNSBAQAogICAgIDxTdHJpbmcgSWQ9IlNob3J0RGVzY3JpcHRvciI+ZXhlY3V0YWJsZTwvU3RyaW5nPgogICAgIDxTdHJpbmcgSWQ9IlNob3J0Y3V0TmFtZSI+UHl0aG9uIHt7U2hvcnRWZXJzaW9ufX0gKHt7Qml0bmVzc319KTwvU3RyaW5nPgogICAgIDxTdHJpbmcgSWQ9IlNob3J0Y3V0RGVzY3JpcHRpb24iPkxhdW5jaGVzIHRoZSAhKGxvYy5Qcm9kdWN0TmFtZSkgaW50ZXJwcmV0ZXIuPC9TdHJpbmc+CisgICAgPFN0cmluZyBJZD0iU3VwcG9ydFVybCI+aHR0cDovL3d3dy5weXRob24ub3JnLzwvU3RyaW5nPgogPC9XaXhMb2NhbGl6YXRpb24+CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvZXhlL2V4ZV9maWxlcy53eHMgYi9Ub29scy9tc2kvZXhlL2V4ZV9maWxlcy53eHMKaW5kZXggOWU0N2I1ZC4uMDEzODU4NyAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2V4ZS9leGVfZmlsZXMud3hzCisrKyBiL1Rvb2xzL21zaS9leGUvZXhlX2ZpbGVzLnd4cwpAQCAtMjgsNiArMjgsOSBAQAogICAgICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJweXRob253LmV4ZSIgRGlyZWN0b3J5PSJJbnN0YWxsRGlyZWN0b3J5IiBHdWlkPSIkKHZhci5QeXRob253RXhlQ29tcG9uZW50R3VpZCkiPgogICAgICAgICAgICAgICAgIDxGaWxlIE5hbWU9InB5dGhvbncuZXhlIiBLZXlQYXRoPSJ5ZXMiIC8+CisgICAgICAgICAgICAgICAgPFJlZ2lzdHJ5S2V5IFJvb3Q9IkhLTVUiIEtleT0iW1JFR0lTVFJZS0VZXSI+CisgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIEtleT0iSW5zdGFsbFBhdGgiIE5hbWU9IldpbmRvd2VkRXhlY3V0YWJsZVBhdGgiIFR5cGU9InN0cmluZyIgVmFsdWU9IlsjcHl0aG9udy5leGVdIiBLZXlQYXRoPSJubyIgLz4KKyAgICAgICAgICAgICAgICA8L1JlZ2lzdHJ5S2V5PgogICAgICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJ2Y3J1bnRpbWUxNDAuZGxsIiBEaXJlY3Rvcnk9Ikluc3RhbGxEaXJlY3RvcnkiIEd1aWQ9IioiPgogICAgICAgICAgICAgICAgIDxGaWxlIE5hbWU9InZjcnVudGltZTE0MC5kbGwiIFNvdXJjZT0iIShiaW5kcGF0aC5yZWRpc3QpdmNydW50aW1lMTQwLmRsbCIgS2V5UGF0aD0ieWVzIiAvPgpAQCAtNjYsMTAgKzY5LDEzIEBACiAgICAgPEZyYWdtZW50PgogICAgICAgICA8Q29tcG9uZW50R3JvdXAgSWQ9ImV4ZV9pY29ucyI+CiAgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJweS5pY28iIERpcmVjdG9yeT0iRExMcyIgR3VpZD0iKiI+Ci0gICAgICAgICAgICAgICAgPEZpbGUgTmFtZT0icHkuaWNvIiBTb3VyY2U9IiEoYmluZHBhdGguc3JjKVBDXHB5LmljbyIgS2V5UGF0aD0ieWVzIiAvPgorICAgICAgICAgICAgICAgIDxGaWxlIE5hbWU9InB5LmljbyIgU291cmNlPSIhKGJpbmRwYXRoLnNyYylQQ1xpY29uc1xweS5pY28iIEtleVBhdGg9InllcyIgLz4KICAgICAgICAgICAgIDwvQ29tcG9uZW50PgogICAgICAgICAgICAgPENvbXBvbmVudCBJZD0icHljLmljbyIgRGlyZWN0b3J5PSJETExzIiBHdWlkPSIqIj4KLSAgICAgICAgICAgICAgICA8RmlsZSBOYW1lPSJweWMuaWNvIiBTb3VyY2U9IiEoYmluZHBhdGguc3JjKVBDXHB5Yy5pY28iIEtleVBhdGg9InllcyIgLz4KKyAgICAgICAgICAgICAgICA8RmlsZSBOYW1lPSJweWMuaWNvIiBTb3VyY2U9IiEoYmluZHBhdGguc3JjKVBDXGljb25zXHB5Yy5pY28iIEtleVBhdGg9InllcyIgLz4KKyAgICAgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICAgICAgPENvbXBvbmVudCBJZD0icHlkLmljbyIgRGlyZWN0b3J5PSJETExzIiBHdWlkPSIqIj4KKyAgICAgICAgICAgICAgICA8RmlsZSBOYW1lPSJweWQuaWNvIiBTb3VyY2U9IiEoYmluZHBhdGguc3JjKVBDXGljb25zXHB5ZC5pY28iIEtleVBhdGg9InllcyIgLz4KICAgICAgICAgICAgIDwvQ29tcG9uZW50PgogICAgICAgICA8L0NvbXBvbmVudEdyb3VwPgogICAgIDwvRnJhZ21lbnQ+CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvZXhlL2V4ZV9wZGIud2l4cHJvaiBiL1Rvb2xzL21zaS9leGUvZXhlX3BkYi53aXhwcm9qCmluZGV4IDRmNGM4NjkuLmJmMTIxM2UgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9leGUvZXhlX3BkYi53aXhwcm9qCisrKyBiL1Rvb2xzL21zaS9leGUvZXhlX3BkYi53aXhwcm9qCkBAIC0xMCw2ICsxMCw3IEBACiAgICAgPEl0ZW1Hcm91cD4KICAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iZXhlX3BkYi53eHMiIC8+CiAgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZV9maWxlcy53eHMiIC8+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZV9yZWcud3hzIiAvPgogICAgIDwvSXRlbUdyb3VwPgogICAgIDxJdGVtR3JvdXA+CiAgICAgICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9Iioud3hsIiAvPgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2V4ZS9leGVfcmVnLnd4cyBiL1Rvb2xzL21zaS9leGUvZXhlX3JlZy53eHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0M2MyMQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL21zaS9leGUvZXhlX3JlZy53eHMKQEAgLTAsMCArMSwyNSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxXaXggeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDYvd2kiPgorICAgIDxGcmFnbWVudD4KKyAgICAgICAgPFByb3BlcnR5UmVmIElkPSJST09UUkVHSVNUUllLRVkiIC8+CisgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iUkVHSVNUUllLRVkiIC8+CisgICAgICAgIAorICAgICAgICA8Q29tcG9uZW50R3JvdXAgSWQ9ImV4ZV9yZWciPgorICAgICAgICAgICAgPENvbXBvbmVudCBJZD0iQ29tbW9uUHl0aG9uUmVnaXN0cmF0aW9uIiBEaXJlY3Rvcnk9Ikluc3RhbGxEaXJlY3RvcnkiIEd1aWQ9IiQodmFyLkNvbW1vblB5dGhvblJlZ0NvbXBvbmVudEd1aWQpIj4KKyAgICAgICAgICAgICAgICA8UmVnaXN0cnlLZXkgUm9vdD0iSEtNVSIgS2V5PSJbUk9PVFJFR0lTVFJZS0VZXSI+CisgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIE5hbWU9IkRpc3BsYXlOYW1lIiBUeXBlPSJzdHJpbmciIFZhbHVlPSIhKGxvYy5NYW51ZmFjdHVyZXIpIiBLZXlQYXRoPSJ5ZXMiIC8+CisgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIE5hbWU9IlN1cHBvcnRVcmwiIFR5cGU9InN0cmluZyIgVmFsdWU9IiEobG9jLk1hbnVmYWN0dXJlclN1cHBvcnRVcmwpIiBLZXlQYXRoPSJubyIgLz4KKyAgICAgICAgICAgICAgICA8L1JlZ2lzdHJ5S2V5PgorICAgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJQeXRob25SZWdpc3RyYXRpb24iIERpcmVjdG9yeT0iSW5zdGFsbERpcmVjdG9yeSIgR3VpZD0iJCh2YXIuUHl0aG9uUmVnQ29tcG9uZW50R3VpZCkiPgorICAgICAgICAgICAgICAgIDxSZWdpc3RyeUtleSBSb290PSJIS01VIiBLZXk9IltSRUdJU1RSWUtFWV0iPgorICAgICAgICAgICAgICAgICAgICA8UmVnaXN0cnlWYWx1ZSBOYW1lPSJEaXNwbGF5TmFtZSIgVHlwZT0ic3RyaW5nIiBWYWx1ZT0iIShsb2MuU2hvcnRjdXROYW1lKSIgS2V5UGF0aD0ieWVzIiAvPgorICAgICAgICAgICAgICAgICAgICA8UmVnaXN0cnlWYWx1ZSBOYW1lPSJTdXBwb3J0VXJsIiBUeXBlPSJzdHJpbmciIFZhbHVlPSIhKGxvYy5TdXBwb3J0VXJsKSIgS2V5UGF0aD0ibm8iIC8+CisgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIE5hbWU9IlZlcnNpb24iIFR5cGU9InN0cmluZyIgVmFsdWU9IiQodmFyLkxvbmdWZXJzaW9uKSIgS2V5UGF0aD0ibm8iIC8+CisgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIE5hbWU9IlN5c1ZlcnNpb24iIFR5cGU9InN0cmluZyIgVmFsdWU9IiQodmFyLlNob3J0VmVyc2lvbikiIEtleVBhdGg9Im5vIiAvPgorICAgICAgICAgICAgICAgICAgICA8UmVnaXN0cnlWYWx1ZSBOYW1lPSJTeXNBcmNoaXRlY3R1cmUiIFR5cGU9InN0cmluZyIgVmFsdWU9IiQodmFyLlBsYXRmb3JtQXJjaGl0ZWN0dXJlKSIgS2V5UGF0aD0ibm8iIC8+CisgICAgICAgICAgICAgICAgPC9SZWdpc3RyeUtleT4KKyAgICAgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICA8L0NvbXBvbmVudEdyb3VwPgorICAgIDwvRnJhZ21lbnQ+Cis8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlci53eHMgYi9Ub29scy9tc2kvbGF1bmNoZXIvbGF1bmNoZXIud3hzCmluZGV4IGViZDg3NWMuLmMwZmY1MWEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlci53eHMKKysrIGIvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyLnd4cwpAQCAtNSw3ICs1LDEwIEBACiAgICAgICAgIDxNZWRpYVRlbXBsYXRlIEVtYmVkQ2FiPSJ5ZXMiIENvbXByZXNzaW9uTGV2ZWw9ImhpZ2giIC8+CiAgICAgICAgIAogICAgICAgICA8UHJvcGVydHkgSWQ9IlN1cHByZXNzX1RBUkdFVERJUl9DaGVjayIgVmFsdWU9IjEiIC8+Ci0gICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iQVJQUFJPRFVDVElDT04iIC8+CisgICAgICAgIDxJY29uIElkPSJBUlBJY29uIiBTb3VyY2VGaWxlPSIhKGJpbmRwYXRoLnNyYylQQ1xpY29uc1xsYXVuY2hlci5pY28iIC8+CisgICAgICAgIDxQcm9wZXJ0eSBJZD0iQVJQUFJPRFVDVElDT04iIFZhbHVlPSJBUlBJY29uIiAvPgorICAgICAgICA8UHJvcGVydHkgSWQ9IkFSUE5PTU9ESUZZIiBWYWx1ZT0iMSIgLz4KKyAgICAgICAgPFByb3BlcnR5IElkPSJESVNBQkxFQURWVFNIT1JUQ1VUUyIgVmFsdWU9IjEiIC8+CiAKICAgICAgICAgPEZlYXR1cmUgSWQ9IkRlZmF1bHRGZWF0dXJlIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZSkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbikiPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJsYXVuY2hlcl9leGUiIFByaW1hcnk9InllcyIgLz4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlcl9lbi1VUy53eGwgYi9Ub29scy9tc2kvbGF1bmNoZXIvbGF1bmNoZXJfZW4tVVMud3hsCmluZGV4IGU0YzFhYWEuLmE3ZTM4MjcgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlcl9lbi1VUy53eGwKKysrIGIvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX2VuLVVTLnd4bApAQCAtMTEsNiArMTEsNyBAQAogICAgIDxTdHJpbmcgSWQ9IlB5dGhvbkZpbGVEZXNjcmlwdGlvbiI+UHl0aG9uIEZpbGU8L1N0cmluZz4KICAgICA8U3RyaW5nIElkPSJQeXRob25Ob0NvbkZpbGVEZXNjcmlwdGlvbiI+UHl0aG9uIEZpbGUgKG5vIGNvbnNvbGUpPC9TdHJpbmc+CiAgICAgPFN0cmluZyBJZD0iUHl0aG9uQ29tcGlsZWRGaWxlRGVzY3JpcHRpb24iPkNvbXBpbGVkIFB5dGhvbiBGaWxlPC9TdHJpbmc+CisgICAgPFN0cmluZyBJZD0iUHl0aG9uRXh0ZW5zaW9uRGVzY3JpcHRpb24iPlB5dGhvbiBFeHRlbnNpb24gTW9kdWxlPC9TdHJpbmc+CiAgICAgPFN0cmluZyBJZD0iUHl0aG9uQXJjaGl2ZUZpbGVEZXNjcmlwdGlvbiI+UHl0aG9uIFppcCBBcHBsaWNhdGlvbiBGaWxlPC9TdHJpbmc+CiAgICAgPFN0cmluZyBJZD0iUHl0aG9uTm9Db25BcmNoaXZlRmlsZURlc2NyaXB0aW9uIj5QeXRob24gWmlwIEFwcGxpY2F0aW9uIEZpbGUgKG5vIGNvbnNvbGUpPC9TdHJpbmc+CiA8L1dpeExvY2FsaXphdGlvbj4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlcl9yZWcud3hzIGIvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX3JlZy53eHMKaW5kZXggOTgxOTYxYS4uZGFjZTk3ZSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX3JlZy53eHMKKysrIGIvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX3JlZy53eHMKQEAgLTI3LDE0ICsyNywxOCBAQAogICAgICAgICAgICAgICAgIDwvUHJvZ0lkPgogICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIFJvb3Q9IkhLQ1IiIEtleT0iUHl0aG9uLkNvbXBpbGVkRmlsZVxzaGVsbGV4XERyb3BIYW5kbGVyIiBWYWx1ZT0ie0JFQTIxOEQyLTY5NTAtNDk3Qi05NDM0LTYxNjgzRUMwNjVGRX0iIFR5cGU9InN0cmluZyIgLz4KIAotICAgICAgICAgICAgICAgIDxQcm9nSWQgSWQ9IlB5dGhvbi5BcmNoaXZlRmlsZSIgRGVzY3JpcHRpb249IiEobG9jLlB5dGhvbkFyY2hpdmVGaWxlRGVzY3JpcHRpb24pIiBBZHZlcnRpc2U9Im5vIiBJY29uPSJweS5leGUiIEljb25JbmRleD0iMSI+CisgICAgICAgICAgICAgICAgPFByb2dJZCBJZD0iUHl0aG9uLkV4dGVuc2lvbiIgRGVzY3JpcHRpb249IiEobG9jLlB5dGhvbkV4dGVuc2lvbkRlc2NyaXB0aW9uKSIgQWR2ZXJ0aXNlPSJubyIgSWNvbj0icHkuZXhlIiBJY29uSW5kZXg9IjMiPgorICAgICAgICAgICAgICAgICAgICA8RXh0ZW5zaW9uIElkPSJweWQiIC8+CisgICAgICAgICAgICAgICAgPC9Qcm9nSWQ+CisKKyAgICAgICAgICAgICAgICA8UHJvZ0lkIElkPSJQeXRob24uQXJjaGl2ZUZpbGUiIERlc2NyaXB0aW9uPSIhKGxvYy5QeXRob25BcmNoaXZlRmlsZURlc2NyaXB0aW9uKSIgQWR2ZXJ0aXNlPSJubyIgSWNvbj0icHkuZXhlIiBJY29uSW5kZXg9IjUiPgogICAgICAgICAgICAgICAgICAgICA8RXh0ZW5zaW9uIElkPSJweXoiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkIj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJiIElkPSJvcGVuIiBUYXJnZXRGaWxlPSJweS5leGUiIEFyZ3VtZW50PSImcXVvdDslTCZxdW90OyAlKiIgLz4KICAgICAgICAgICAgICAgICAgICAgPC9FeHRlbnNpb24+CiAgICAgICAgICAgICAgICAgPC9Qcm9nSWQ+CiAgICAgICAgICAgICAgICAgPFJlZ2lzdHJ5VmFsdWUgUm9vdD0iSEtDUiIgS2V5PSJQeXRob24uQXJjaGl2ZUZpbGVcc2hlbGxleFxEcm9wSGFuZGxlciIgVmFsdWU9IntCRUEyMThEMi02OTUwLTQ5N0ItOTQzNC02MTY4M0VDMDY1RkV9IiBUeXBlPSJzdHJpbmciIC8+CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPFByb2dJZCBJZD0iUHl0aG9uLk5vQ29uQXJjaGl2ZUZpbGUiIERlc2NyaXB0aW9uPSIhKGxvYy5QeXRob25Ob0NvbkFyY2hpdmVGaWxlRGVzY3JpcHRpb24pIiBBZHZlcnRpc2U9Im5vIiBJY29uPSJweS5leGUiIEljb25JbmRleD0iMSI+CisgICAgICAgICAgICAgICAgPFByb2dJZCBJZD0iUHl0aG9uLk5vQ29uQXJjaGl2ZUZpbGUiIERlc2NyaXB0aW9uPSIhKGxvYy5QeXRob25Ob0NvbkFyY2hpdmVGaWxlRGVzY3JpcHRpb24pIiBBZHZlcnRpc2U9Im5vIiBJY29uPSJweS5leGUiIEljb25JbmRleD0iNSI+CiAgICAgICAgICAgICAgICAgICAgIDxFeHRlbnNpb24gSWQ9InB5enciIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkIj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJiIElkPSJvcGVuIiBUYXJnZXRGaWxlPSJweXcuZXhlIiBBcmd1bWVudD0iJnF1b3Q7JUwmcXVvdDsgJSoiIC8+CiAgICAgICAgICAgICAgICAgICAgIDwvRXh0ZW5zaW9uPgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2xpYi9saWJfZmlsZXMud3hzIGIvVG9vbHMvbXNpL2xpYi9saWJfZmlsZXMud3hzCmluZGV4IGZhNzlhOGQuLjgwNGFiMDEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9saWIvbGliX2ZpbGVzLnd4cworKysgYi9Ub29scy9tc2kvbGliL2xpYl9maWxlcy53eHMKQEAgLTY0LDE2ICs2NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICA8UmVnaXN0cnlWYWx1ZSBLZXk9IlB5dGhvblBhdGgiIFR5cGU9InN0cmluZyIgVmFsdWU9IltMaWJdO1tETExzXSIgLz4KICAgICAgICAgICAgICAgICA8L1JlZ2lzdHJ5S2V5PgogICAgICAgICAgICAgPC9Db21wb25lbnQ+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IElkPSJMaWJfc2l0ZV9wYWNrYWdlc19SRUFETUUiIERpcmVjdG9yeT0iTGliX3NpdGVfcGFja2FnZXMiIEd1aWQ9IioiPgotICAgICAgICAgICAgICAgIDxGaWxlIElkPSJMaWJfc2l0ZV9wYWNrYWdlc19SRUFETUUiIE5hbWU9IlJFQURNRS50eHQiIFNvdXJjZT0iIShiaW5kcGF0aC5zcmMpTGliXHNpdGUtcGFja2FnZXNcUkVBRE1FIiBLZXlQYXRoPSJ5ZXMiIC8+Ci0gICAgICAgICAgICA8L0NvbXBvbmVudD4KICAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9IkxpYjJ0bzNfcGlja2xlX3JlbW92ZSIgRGlyZWN0b3J5PSJMaWJfbGliMnRvMyIgR3VpZD0iJCh2YXIuUmVtb3ZlTGliMnRvM1BpY2tsZUNvbXBvbmVudEd1aWQpIj4KICAgICAgICAgICAgICAgICA8UmVtb3ZlRmlsZSBJZD0iTGliMnRvM19waWNrbGVfcmVtb3ZlX2ZpbGVzIiBOYW1lPSIqLnBpY2tsZSIgT249InVuaW5zdGFsbCIgLz4KICAgICAgICAgICAgICAgICA8UmVtb3ZlRm9sZGVyIElkPSJMaWIydG8zX3BpY2tsZV9yZW1vdmVfZm9sZGVyIiBPbj0idW5pbnN0YWxsIiAvPgogICAgICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgIDwvQ29tcG9uZW50R3JvdXA+Ci0gICAgICAgIDxEaXJlY3RvcnlSZWYgSWQ9IkxpYiI+Ci0gICAgICAgICAgICA8RGlyZWN0b3J5IElkPSJMaWJfc2l0ZV9wYWNrYWdlcyIgTmFtZT0ic2l0ZS1wYWNrYWdlcyIgLz4KLSAgICAgICAgPC9EaXJlY3RvcnlSZWY+CiAgICAgPC9GcmFnbWVudD4KIDwvV2l4PgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL21ha2VfemlwLnB5IGIvVG9vbHMvbXNpL21ha2VfemlwLnB5CmluZGV4IDBlOGE0YTYuLjZjNDMyNTYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9tYWtlX3ppcC5weQorKysgYi9Ub29scy9tc2kvbWFrZV96aXAucHkKQEAgLTQ2LDYgKzQ2LDEwIEBACiAgICAgJ3B5dGhvbjNzdHViJywKIH0KIAorRVhDTFVERURfRklMRVMgPSB7CisgICAgJ3B5c2hlbGxleHQnLAorfQorCiBkZWYgaXNfbm90X2RlYnVnKHApOgogICAgIGlmIERFQlVHX1JFLnNlYXJjaChwLm5hbWUpOgogICAgICAgICByZXR1cm4gRmFsc2UKQEAgLTUzLDcgKzU3LDcgQEAKICAgICBpZiBUS1RDTF9SRS5zZWFyY2gocC5uYW1lKToKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKLSAgICByZXR1cm4gcC5zdGVtLmxvd2VyKCkgbm90IGluIERFQlVHX0ZJTEVTCisgICAgcmV0dXJuIHAuc3RlbS5sb3dlcigpIG5vdCBpbiBERUJVR19GSUxFUyBhbmQgcC5zdGVtLmxvd2VyKCkgbm90IGluIEVYQ0xVREVEX0ZJTEVTCiAKIGRlZiBpc19ub3RfZGVidWdfb3JfcHl0aG9uKHApOgogICAgIHJldHVybiBpc19ub3RfZGVidWcocCkgYW5kIG5vdCBQWVRIT05fRExMX1JFLnNlYXJjaChwLm5hbWUpCkBAIC0yMDksOCArMjEzLDkgQEAKICAgICAgICAgICAgIGNvcGllZCA9IGNvcHlfdG9fbGF5b3V0KHRlbXAgLyB0LnJzdHJpcCgnLycpLCByZ2xvYihzLCBwLCBjKSkKICAgICAgICAgICAgIHByaW50KCdDb3BpZWQge30gZmlsZXMnLmZvcm1hdChjb3BpZWQpKQogCi0gICAgICAgIHdpdGggb3BlbihzdHIodGVtcCAvICdweXZlbnYuY2ZnJyksICd3JykgYXMgZjoKLSAgICAgICAgICAgIHByaW50KCdhcHBsb2NhbCA9IHRydWUnLCBmaWxlPWYpCisgICAgICAgIHdpdGggb3BlbihzdHIodGVtcCAvICdzeXMucGF0aCcpLCAndycpIGFzIGY6CisgICAgICAgICAgICBwcmludCgncHl0aG9uezAubWFqb3J9ezAubWlub3J9LnppcCcuZm9ybWF0KHN5cy52ZXJzaW9uX2luZm8pLCBmaWxlPWYpCisgICAgICAgICAgICBwcmludCgnLicsIGZpbGU9ZikKIAogICAgICAgICBpZiBvdXQ6CiAgICAgICAgICAgICB0b3RhbCA9IGNvcHlfdG9fbGF5b3V0KG91dCwgcmdsb2IodGVtcCwgJyoqLyonLCBOb25lKSkKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9tc2kucHJvcHMgYi9Ub29scy9tc2kvbXNpLnByb3BzCmluZGV4IDBjZjdjNzcuLjc0NWZjNTQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9tc2kucHJvcHMKKysrIGIvVG9vbHMvbXNpL21zaS5wcm9wcwpAQCAtNjksNiArNjksOCBAQAogICAgIDxQcm9wZXJ0eUdyb3VwPgogICAgICAgICA8Qml0bmVzcz4zMi1iaXQ8L0JpdG5lc3M+CiAgICAgICAgIDxCaXRuZXNzIENvbmRpdGlvbj0iJChQbGF0Zm9ybSkgPT0gJ3g2NCciPjY0LWJpdDwvQml0bmVzcz4KKyAgICAgICAgPFBsYXRmb3JtQXJjaGl0ZWN0dXJlPjMyYml0PC9QbGF0Zm9ybUFyY2hpdGVjdHVyZT4KKyAgICAgICAgPFBsYXRmb3JtQXJjaGl0ZWN0dXJlIENvbmRpdGlvbj0iJChQbGF0Zm9ybSkgPT0gJ3g2NCciPjY0Yml0PC9QbGF0Zm9ybUFyY2hpdGVjdHVyZT4KICAgICAgICAgPERlZmluZUNvbnN0YW50cz4KICAgICAgICAgICAgICQoRGVmaW5lQ29uc3RhbnRzKTsKICAgICAgICAgICAgIFZlcnNpb249JChJbnN0YWxsZXJWZXJzaW9uKTsKQEAgLTc5LDYgKzgxLDcgQEAKICAgICAgICAgICAgIFVwZ3JhZGVNaW5pbXVtVmVyc2lvbj0kKE1ham9yVmVyc2lvbk51bWJlcikuJChNaW5vclZlcnNpb25OdW1iZXIpLjAuMDsKICAgICAgICAgICAgIE5leHRNYWpvclZlcnNpb25OdW1iZXI9JChNYWpvclZlcnNpb25OdW1iZXIpLiQoW21zYnVpbGRdOjpBZGQoJChNaW5vclZlcnNpb25OdW1iZXIpLCAxKSkuMC4wOwogICAgICAgICAgICAgQml0bmVzcz0kKEJpdG5lc3MpOworICAgICAgICAgICAgUGxhdGZvcm1BcmNoaXRlY3R1cmU9JChQbGF0Zm9ybUFyY2hpdGVjdHVyZSk7CiAgICAgICAgICAgICBQeURlYnVnRXh0PSQoUHlEZWJ1Z0V4dCk7CiAgICAgICAgICAgICBQeUFyY2hFeHQ9JChQeUFyY2hFeHQpOwogICAgICAgICAgICAgUHlUZXN0RXh0PSQoUHlUZXN0RXh0KTsKQEAgLTE1NSw2ICsxNTgsMTIgQEAKICAgICAgICAgPF9VdWlkIEluY2x1ZGU9IlJlbW92ZUxpYjJ0bzNQaWNrbGVDb21wb25lbnRHdWlkIj4KICAgICAgICAgICAgIDxVcmk+bGliMnRvMy9waWNrbGVzPC9Vcmk+CiAgICAgICAgIDwvX1V1aWQ+CisgICAgICAgIDxfVXVpZCBJbmNsdWRlPSJDb21tb25QeXRob25SZWdDb21wb25lbnRHdWlkIj4KKyAgICAgICAgICAgIDxVcmk+cmVnaXN0cnk8L1VyaT4KKyAgICAgICAgPC9fVXVpZD4KKyAgICAgICAgPF9VdWlkIEluY2x1ZGU9IlB5dGhvblJlZ0NvbXBvbmVudEd1aWQiPgorICAgICAgICAgICAgPFVyaT5yZWdpc3RyeS8kKE91dHB1dE5hbWUpPC9Vcmk+CisgICAgICAgIDwvX1V1aWQ+CiAgICAgPC9JdGVtR3JvdXA+CiAgICAgPFRhcmdldCBOYW1lPSJfR2VuZXJhdGVHdWlkcyIgQWZ0ZXJUYXJnZXRzPSJQcmVwYXJlRm9yQnVpbGQiIENvbmRpdGlvbj0iJChUYXJnZXROYW1lKSAhPSAnbGF1bmNoZXInIj4KICAgICAgICAgPFByb3BlcnR5R3JvdXA+CmRpZmYgLS1naXQgYS9Ub29scy9wYXJzZXIvdW5wYXJzZS5weSBiL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5CmluZGV4IDI4NTAzMGUuLjdlMWNjNGUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5CisrKyBiL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5CkBAIC0xMDQsNiArMTA0LDE5IEBACiAgICAgICAgIHNlbGYud3JpdGUoIiAiK3NlbGYuYmlub3BbdC5vcC5fX2NsYXNzX18uX19uYW1lX19dKyI9ICIpCiAgICAgICAgIHNlbGYuZGlzcGF0Y2godC52YWx1ZSkKIAorICAgIGRlZiBfQW5uQXNzaWduKHNlbGYsIHQpOgorICAgICAgICBzZWxmLmZpbGwoKQorICAgICAgICBpZiBub3QgdC5zaW1wbGUgYW5kIGlzaW5zdGFuY2UodC50YXJnZXQsIGFzdC5OYW1lKToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJygnKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQudGFyZ2V0KQorICAgICAgICBpZiBub3QgdC5zaW1wbGUgYW5kIGlzaW5zdGFuY2UodC50YXJnZXQsIGFzdC5OYW1lKToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJyknKQorICAgICAgICBzZWxmLndyaXRlKCI6ICIpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC5hbm5vdGF0aW9uKQorICAgICAgICBpZiB0LnZhbHVlOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiID0gIikKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC52YWx1ZSkKKwogICAgIGRlZiBfUmV0dXJuKHNlbGYsIHQpOgogICAgICAgICBzZWxmLmZpbGwoInJldHVybiIpCiAgICAgICAgIGlmIHQudmFsdWU6CkBAIC0zMjIsOSArMzM1LDcyIEBACiAgICAgZGVmIF9TdHIoc2VsZiwgdHJlZSk6CiAgICAgICAgIHNlbGYud3JpdGUocmVwcih0cmVlLnMpKQogCisgICAgZGVmIF9Kb2luZWRTdHIoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoImYiKQorICAgICAgICBzdHJpbmcgPSBpby5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuX2ZzdHJpbmdfSm9pbmVkU3RyKHQsIHN0cmluZy53cml0ZSkKKyAgICAgICAgc2VsZi53cml0ZShyZXByKHN0cmluZy5nZXR2YWx1ZSgpKSkKKworICAgIGRlZiBfRm9ybWF0dGVkVmFsdWUoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoImYiKQorICAgICAgICBzdHJpbmcgPSBpby5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuX2ZzdHJpbmdfRm9ybWF0dGVkVmFsdWUodCwgc3RyaW5nLndyaXRlKQorICAgICAgICBzZWxmLndyaXRlKHJlcHIoc3RyaW5nLmdldHZhbHVlKCkpKQorCisgICAgZGVmIF9mc3RyaW5nX0pvaW5lZFN0cihzZWxmLCB0LCB3cml0ZSk6CisgICAgICAgIGZvciB2YWx1ZSBpbiB0LnZhbHVlczoKKyAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsICJfZnN0cmluZ18iICsgdHlwZSh2YWx1ZSkuX19uYW1lX18pCisgICAgICAgICAgICBtZXRoKHZhbHVlLCB3cml0ZSkKKworICAgIGRlZiBfZnN0cmluZ19TdHIoc2VsZiwgdCwgd3JpdGUpOgorICAgICAgICB2YWx1ZSA9IHQucy5yZXBsYWNlKCJ7IiwgInt7IikucmVwbGFjZSgifSIsICJ9fSIpCisgICAgICAgIHdyaXRlKHZhbHVlKQorCisgICAgZGVmIF9mc3RyaW5nX0NvbnN0YW50KHNlbGYsIHQsIHdyaXRlKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodC52YWx1ZSwgc3RyKQorICAgICAgICB2YWx1ZSA9IHQudmFsdWUucmVwbGFjZSgieyIsICJ7eyIpLnJlcGxhY2UoIn0iLCAifX0iKQorICAgICAgICB3cml0ZSh2YWx1ZSkKKworICAgIGRlZiBfZnN0cmluZ19Gb3JtYXR0ZWRWYWx1ZShzZWxmLCB0LCB3cml0ZSk6CisgICAgICAgIHdyaXRlKCJ7IikKKyAgICAgICAgZXhwciA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgVW5wYXJzZXIodC52YWx1ZSwgZXhwcikKKyAgICAgICAgZXhwciA9IGV4cHIuZ2V0dmFsdWUoKS5yc3RyaXAoIlxuIikKKyAgICAgICAgaWYgZXhwci5zdGFydHN3aXRoKCJ7Iik6CisgICAgICAgICAgICB3cml0ZSgiICIpICAjIFNlcGFyYXRlIHBhaXIgb2Ygb3BlbmluZyBicmFja2V0cyBhcyAieyB7IgorICAgICAgICB3cml0ZShleHByKQorICAgICAgICBpZiB0LmNvbnZlcnNpb24gIT0gLTE6CisgICAgICAgICAgICBjb252ZXJzaW9uID0gY2hyKHQuY29udmVyc2lvbikKKyAgICAgICAgICAgIGFzc2VydCBjb252ZXJzaW9uIGluICJzcmEiCisgICAgICAgICAgICB3cml0ZShmIiF7Y29udmVyc2lvbn0iKQorICAgICAgICBpZiB0LmZvcm1hdF9zcGVjOgorICAgICAgICAgICAgd3JpdGUoIjoiKQorICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIoc2VsZiwgIl9mc3RyaW5nXyIgKyB0eXBlKHQuZm9ybWF0X3NwZWMpLl9fbmFtZV9fKQorICAgICAgICAgICAgbWV0aCh0LmZvcm1hdF9zcGVjLCB3cml0ZSkKKyAgICAgICAgd3JpdGUoIn0iKQorCiAgICAgZGVmIF9OYW1lKHNlbGYsIHQpOgogICAgICAgICBzZWxmLndyaXRlKHQuaWQpCiAKKyAgICBkZWYgX3dyaXRlX2NvbnN0YW50KHNlbGYsIHZhbHVlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGZsb2F0LCBjb21wbGV4KSk6CisgICAgICAgICAgICBzZWxmLndyaXRlKHJlcHIodmFsdWUpLnJlcGxhY2UoImluZiIsIElORlNUUikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlKHJlcHIodmFsdWUpKQorCisgICAgZGVmIF9Db25zdGFudChzZWxmLCB0KToKKyAgICAgICAgdmFsdWUgPSB0LnZhbHVlCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIigiKQorICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSA9PSAxOgorICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2NvbnN0YW50KHZhbHVlWzBdKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiwiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbnRlcmxlYXZlKGxhbWJkYTogc2VsZi53cml0ZSgiLCAiKSwgc2VsZi5fd3JpdGVfY29uc3RhbnQsIHZhbHVlKQorICAgICAgICAgICAgc2VsZi53cml0ZSgiKSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl93cml0ZV9jb25zdGFudCh0LnZhbHVlKQorCiAgICAgZGVmIF9OYW1lQ29uc3RhbnQoc2VsZiwgdCk6CiAgICAgICAgIHNlbGYud3JpdGUocmVwcih0LnZhbHVlKSkKIApAQCAtMzY4LDcgKzQ0NCwxMCBAQAogICAgICAgICBzZWxmLndyaXRlKCJ9IikKIAogICAgIGRlZiBfY29tcHJlaGVuc2lvbihzZWxmLCB0KToKLSAgICAgICAgc2VsZi53cml0ZSgiIGZvciAiKQorICAgICAgICBpZiB0LmlzX2FzeW5jOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiIGFzeW5jIGZvciAiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiIGZvciAiKQogICAgICAgICBzZWxmLmRpc3BhdGNoKHQudGFyZ2V0KQogICAgICAgICBzZWxmLndyaXRlKCIgaW4gIikKICAgICAgICAgc2VsZi5kaXNwYXRjaCh0Lml0ZXIpCkBAIC00MTMsNyArNDkyLDcgQEAKICAgICBkZWYgX1R1cGxlKHNlbGYsIHQpOgogICAgICAgICBzZWxmLndyaXRlKCIoIikKICAgICAgICAgaWYgbGVuKHQuZWx0cykgPT0gMToKLSAgICAgICAgICAgIChlbHQsKSA9IHQuZWx0cworICAgICAgICAgICAgZWx0ID0gdC5lbHRzWzBdCiAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGVsdCkKICAgICAgICAgICAgIHNlbGYud3JpdGUoIiwiKQogICAgICAgICBlbHNlOgpAQCAtNDYwLDcgKzUzOSw4IEBACiAgICAgICAgICMgU3BlY2lhbCBjYXNlOiAzLl9fYWJzX18oKSBpcyBhIHN5bnRheCBlcnJvciwgc28gaWYgdC52YWx1ZQogICAgICAgICAjIGlzIGFuIGludGVnZXIgbGl0ZXJhbCB0aGVuIHdlIG5lZWQgdG8gZWl0aGVyIHBhcmVudGhlc2l6ZQogICAgICAgICAjIGl0IG9yIGFkZCBhbiBleHRyYSBzcGFjZSB0byBnZXQgMyAuX19hYnNfXygpLgotICAgICAgICBpZiBpc2luc3RhbmNlKHQudmFsdWUsIGFzdC5OdW0pIGFuZCBpc2luc3RhbmNlKHQudmFsdWUubiwgaW50KToKKyAgICAgICAgaWYgKChpc2luc3RhbmNlKHQudmFsdWUsIGFzdC5OdW0pIGFuZCBpc2luc3RhbmNlKHQudmFsdWUubiwgaW50KSkKKyAgICAgICAgICAgb3IgKGlzaW5zdGFuY2UodC52YWx1ZSwgYXN0LkNvbnN0YW50KSBhbmQgaXNpbnN0YW5jZSh0LnZhbHVlLnZhbHVlLCBpbnQpKSk6CiAgICAgICAgICAgICBzZWxmLndyaXRlKCIgIikKICAgICAgICAgc2VsZi53cml0ZSgiLiIpCiAgICAgICAgIHNlbGYud3JpdGUodC5hdHRyKQpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9Db21tYW5kTGluZS5weSBiL1Rvb2xzL3B5YmVuY2gvQ29tbWFuZExpbmUucHkKaW5kZXggMDczY2NhMC4uNTRhOGJhNyAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9Db21tYW5kTGluZS5weQorKysgYi9Ub29scy9weWJlbmNoL0NvbW1hbmRMaW5lLnB5CkBAIC05OSw4ICs5OSw4IEBACiAjIEFsaWFzCiBnZXRwYXNzd2QgPSBpbnZpc2libGVfaW5wdXQKIAotX2ludGVnZXJSRSA9IHJlLmNvbXBpbGUoJ1xzKigtP1xkKylccyokJykKLV9pbnRlZ2VyUmFuZ2VSRSA9IHJlLmNvbXBpbGUoJ1xzKigtP1xkKylccyotXHMqKC0/XGQrKVxzKiQnKQorX2ludGVnZXJSRSA9IHJlLmNvbXBpbGUocidccyooLT9cZCspXHMqJCcpCitfaW50ZWdlclJhbmdlUkUgPSByZS5jb21waWxlKHInXHMqKC0/XGQrKVxzKi1ccyooLT9cZCspXHMqJCcpCiAKIGRlZiBzcmFuZ2UocywKIApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9XaXRoLnB5IGIvVG9vbHMvcHliZW5jaC9XaXRoLnB5CmluZGV4IDVmNTllOGMuLjMwY2QzYzIgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvV2l0aC5weQorKysgYi9Ub29scy9weWJlbmNoL1dpdGgucHkKQEAgLTEsNCArMSwzIEBACi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CiBmcm9tIHB5YmVuY2ggaW1wb3J0IFRlc3QKIAogY2xhc3MgV2l0aEZpbmFsbHkoVGVzdCk6CmRpZmYgLS1naXQgYS9Ub29scy9weW5jaGUvQ29sb3JEQi5weSBiL1Rvb2xzL3B5bmNoZS9Db2xvckRCLnB5CmluZGV4IDVjZWQwZTcuLjAzNDgxNDggMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5bmNoZS9Db2xvckRCLnB5CisrKyBiL1Rvb2xzL3B5bmNoZS9Db2xvckRCLnB5CkBAIC0xMzQsMTcgKzEzNCwxNyBAQAogDAogY2xhc3MgUkdCQ29sb3JEQihDb2xvckRCKToKICAgICBfcmUgPSByZS5jb21waWxlKAotICAgICAgICAnXHMqKD9QPHJlZD5cZCspXHMrKD9QPGdyZWVuPlxkKylccysoP1A8Ymx1ZT5cZCspXHMrKD9QPG5hbWU+LiopJykKKyAgICAgICAgcidccyooP1A8cmVkPlxkKylccysoP1A8Z3JlZW4+XGQrKVxzKyg/UDxibHVlPlxkKylccysoP1A8bmFtZT4uKiknKQogCiAKIGNsYXNzIEhUTUw0MERCKENvbG9yREIpOgotICAgIF9yZSA9IHJlLmNvbXBpbGUoJyg/UDxuYW1lPlxTKylccysoP1A8aGV4cmdiPiNbMC05YS1mQS1GXXs2fSknKQorICAgIF9yZSA9IHJlLmNvbXBpbGUocicoP1A8bmFtZT5cUyspXHMrKD9QPGhleHJnYj4jWzAtOWEtZkEtRl17Nn0pJykKIAogICAgIGRlZiBfZXh0cmFjdHJnYihzZWxmLCBtbyk6CiAgICAgICAgIHJldHVybiBycmdnYmJfdG9fdHJpcGxldChtby5ncm91cCgnaGV4cmdiJykpCiAKIGNsYXNzIExpZ2h0bGlua0RCKEhUTUw0MERCKToKLSAgICBfcmUgPSByZS5jb21waWxlKCcoP1A8bmFtZT4oLispKVxzKyg/UDxoZXhyZ2I+I1swLTlhLWZBLUZdezZ9KScpCisgICAgX3JlID0gcmUuY29tcGlsZShyJyg/UDxuYW1lPiguKykpXHMrKD9QPGhleHJnYj4jWzAtOWEtZkEtRl17Nn0pJykKIAogICAgIGRlZiBfZXh0cmFjdG5hbWUoc2VsZiwgbW8pOgogICAgICAgICByZXR1cm4gbW8uZ3JvdXAoJ25hbWUnKS5zdHJpcCgpCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2NvbWJpbmVyZWZzLnB5IGIvVG9vbHMvc2NyaXB0cy9jb21iaW5lcmVmcy5weQppbmRleCBlMTBlNDlhLi43Y2E5NTI2IDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL2NvbWJpbmVyZWZzLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvY29tYmluZXJlZnMucHkKQEAgLTYsNyArNiw3IEBACiBBIGhlbHBlciBmb3IgYW5hbHl6aW5nIFBZVEhPTkRVTVBSRUZTIG91dHB1dC4KIAogV2hlbiB0aGUgUFlUSE9ORFVNUFJFRlMgZW52YXIgaXMgc2V0IGluIGEgZGVidWcgYnVpbGQsIGF0IFB5dGhvbiBzaHV0ZG93bgotdGltZSBQeV9GaW5hbGl6ZSgpIHByaW50cyB0aGUgbGlzdCBvZiBhbGwgbGl2ZSBvYmplY3RzIHR3aWNlOiAgZmlyc3QgaXQKK3RpbWUgUHlfRmluYWxpemVFeCgpIHByaW50cyB0aGUgbGlzdCBvZiBhbGwgbGl2ZSBvYmplY3RzIHR3aWNlOiAgZmlyc3QgaXQKIHByaW50cyB0aGUgcmVwcigpIG9mIGVhY2ggb2JqZWN0IHdoaWxlIHRoZSBpbnRlcnByZXRlciBpcyBzdGlsbCBmdWxseSBpbnRhY3QuCiBBZnRlciBjbGVhbmluZyB1cCBldmVyeXRoaW5nIGl0IGNhbiwgaXQgcHJpbnRzIGFsbCByZW1haW5pbmcgbGl2ZSBvYmplY3RzCiBhZ2FpbiwgYnV0IHRoZSBzZWNvbmQgdGltZSBqdXN0IHByaW50cyB0aGVpciBhZGRyZXNzZXMsIHJlZmNvdW50cywgYW5kIHR5cGUKQEAgLTQxLDcgKzQxLDcgQEAKIG9iamVjdHMgc2hvd24gaW4gdGhlIHJlcHI6ICB0aGUgcmVwciB3YXMgY2FwdHVyZWQgZnJvbSB0aGUgZmlyc3Qgb3V0cHV0IGJsb2NrLAogYW5kIHNvbWUgb2YgdGhlIGNvbnRhaW5lZXMgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCBzaW5jZSB0aGVuLiAgRm9yIGV4YW1wbGUsCiBpdCdzIGNvbW1vbiBmb3IgdGhlIGxpbmUgc2hvd2luZyB0aGUgZGljdCBvZiBpbnRlcm5lZCBzdHJpbmdzIHRvIGRpc3BsYXkKLXN0cmluZ3MgdGhhdCBubyBsb25nZXIgZXhpc3QgYXQgdGhlIGVuZCBvZiBQeV9GaW5hbGl6ZTsgdGhpcyBjYW4gYmUgcmVjb2duaXplZAorc3RyaW5ncyB0aGF0IG5vIGxvbmdlciBleGlzdCBhdCB0aGUgZW5kIG9mIFB5X0ZpbmFsaXplRXg7IHRoaXMgY2FuIGJlIHJlY29nbml6ZWQKIChhbGJlaXQgcGFpbmZ1bGx5KSBiZWNhdXNlIHN1Y2ggY29udGFpbmVlcyBkb24ndCBoYXZlIGEgbGluZSBvZiB0aGVpciBvd24uCiAKIFRoZSBvYmplY3RzIGFyZSBsaXN0ZWQgaW4gYWxsb2NhdGlvbiBvcmRlciwgd2l0aCBtb3N0LXJlY2VudGx5IGFsbG9jYXRlZApkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9kaWZmLnB5IGIvVG9vbHMvc2NyaXB0cy9kaWZmLnB5CmluZGV4IDk3MjBhNDMuLjk2MTk5YjggMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvZGlmZi5weQorKysgYi9Ub29scy9zY3JpcHRzL2RpZmYucHkKQEAgLTgsNyArOCw3IEBACiAKICIiIgogCi1pbXBvcnQgc3lzLCBvcywgdGltZSwgZGlmZmxpYiwgYXJncGFyc2UKK2ltcG9ydCBzeXMsIG9zLCBkaWZmbGliLCBhcmdwYXJzZQogZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUsIHRpbWV6b25lCiAKIGRlZiBmaWxlX210aW1lKHBhdGgpOgpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9maXhkaXYucHkgYi9Ub29scy9zY3JpcHRzL2ZpeGRpdi5weQppbmRleCAyMGYzMzg2Li4xMjEzYTRlIDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL2ZpeGRpdi5weQorKysgYi9Ub29scy9zY3JpcHRzL2ZpeGRpdi5weQpAQCAtMTc0LDggKzE3NCw4IEBACiAgICAgc3lzLnN0ZGVyci53cml0ZSgiVXNhZ2U6ICVzIFstbV0gd2FybmluZ3NcbiIgJSBzeXMuYXJndlswXSkKICAgICBzeXMuc3RkZXJyLndyaXRlKCJUcnkgYCVzIC1oJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIgJSBzeXMuYXJndlswXSkKIAotUEFUVEVSTiA9ICgiXiguKz8pOihcZCspOiBEZXByZWNhdGlvbldhcm5pbmc6ICIKLSAgICAgICAgICAgImNsYXNzaWMgKGludHxsb25nfGZsb2F0fGNvbXBsZXgpIGRpdmlzaW9uJCIpCitQQVRURVJOID0gKHIiXiguKz8pOihcZCspOiBEZXByZWNhdGlvbldhcm5pbmc6ICIKKyAgICAgICAgICAgciJjbGFzc2ljIChpbnR8bG9uZ3xmbG9hdHxjb21wbGV4KSBkaXZpc2lvbiQiKQogCiBkZWYgcmVhZHdhcm5pbmdzKHdhcm5pbmdzZmlsZSk6CiAgICAgcHJvZyA9IHJlLmNvbXBpbGUoUEFUVEVSTikKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvZ2VuZXJhdGVfb3Bjb2RlX2gucHkgYi9Ub29scy9zY3JpcHRzL2dlbmVyYXRlX29wY29kZV9oLnB5CmluZGV4IGM2MmY5YTUuLjk0OGI1NmYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvZ2VuZXJhdGVfb3Bjb2RlX2gucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9nZW5lcmF0ZV9vcGNvZGVfaC5weQpAQCAtMSw3ICsxLDUgQEAKICMgVGhpcyBzY3JpcHQgZ2VuZXJhdGVzIHRoZSBvcGNvZGUuaCBoZWFkZXIgZmlsZS4KIAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAotCiBpbXBvcnQgc3lzCiBoZWFkZXIgPSAiIiIvKiBBdXRvLWdlbmVyYXRlZCBieSBUb29scy9zY3JpcHRzL2dlbmVyYXRlX29wY29kZV9oLnB5ICovCiAjaWZuZGVmIFB5X09QQ09ERV9ICmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2gycHkucHkgYi9Ub29scy9zY3JpcHRzL2gycHkucHkKaW5kZXggMDk2N2ZjMi4uNDM2M2MwYyAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9oMnB5LnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvaDJweS5weQpAQCAtMjMsMTMgKzIzLDEzIEBACiAKIGltcG9ydCBzeXMsIHJlLCBnZXRvcHQsIG9zCiAKLXBfZGVmaW5lID0gcmUuY29tcGlsZSgnXltcdCBdKiNbXHQgXSpkZWZpbmVbXHQgXSsoW2EtekEtWjAtOV9dKylbXHQgXSsnKQorcF9kZWZpbmUgPSByZS5jb21waWxlKHInXltcdCBdKiNbXHQgXSpkZWZpbmVbXHQgXSsoW2EtekEtWjAtOV9dKylbXHQgXSsnKQogCiBwX21hY3JvID0gcmUuY29tcGlsZSgKLSAgJ15bXHQgXSojW1x0IF0qZGVmaW5lW1x0IF0rJwotICAnKFthLXpBLVowLTlfXSspXCgoW19hLXpBLVpdW19hLXpBLVowLTldKilcKVtcdCBdKycpCisgIHInXltcdCBdKiNbXHQgXSpkZWZpbmVbXHQgXSsnCisgIHInKFthLXpBLVowLTlfXSspXCgoW19hLXpBLVpdW19hLXpBLVowLTldKilcKVtcdCBdKycpCiAKLXBfaW5jbHVkZSA9IHJlLmNvbXBpbGUoJ15bXHQgXSojW1x0IF0qaW5jbHVkZVtcdCBdKzwoW14+XG5dKyk+JykKK3BfaW5jbHVkZSA9IHJlLmNvbXBpbGUocideW1x0IF0qI1tcdCBdKmluY2x1ZGVbXHQgXSs8KFtePlxuXSspPicpCiAKIHBfY29tbWVudCA9IHJlLmNvbXBpbGUocicvXCooW14qXSt8XCorW14vXSkqKFwqKy8pPycpCiBwX2NwcF9jb21tZW50ID0gcmUuY29tcGlsZSgnLy8uKicpCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2hpZ2hsaWdodC5weSBiL1Rvb2xzL3NjcmlwdHMvaGlnaGxpZ2h0LnB5CmluZGV4IDY2YWQ4NjguLjkyNzJmZWUgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvaGlnaGxpZ2h0LnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvaGlnaGxpZ2h0LnB5CkBAIC0xNDcsMTQgKzE0NywxNCBAQAogIyMjIyBMYVRlWCBPdXRwdXQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIGRlZmF1bHRfbGF0ZXhfY29tbWFuZHMgPSB7Ci0gICAgJ2NvbW1lbnQnOiAne1xjb2xvcntyZWR9IzF9JywKLSAgICAnc3RyaW5nJzogJ3tcY29sb3J7Rm9yZXN0R3JlZW59IzF9JywKLSAgICAnZG9jc3RyaW5nJzogJ3tcZW1waHtcY29sb3J7Rm9yZXN0R3JlZW59IzF9fScsCi0gICAgJ2tleXdvcmQnOiAne1xjb2xvcntvcmFuZ2V9IzF9JywKLSAgICAnYnVpbHRpbic6ICd7XGNvbG9ye3B1cnBsZX0jMX0nLAotICAgICdkZWZpbml0aW9uJzogJ3tcY29sb3J7b3JhbmdlfSMxfScsCi0gICAgJ2RlZm5hbWUnOiAne1xjb2xvcntibHVlfSMxfScsCi0gICAgJ29wZXJhdG9yJzogJ3tcY29sb3J7YnJvd259IzF9JywKKyAgICAnY29tbWVudCc6IHIne1xjb2xvcntyZWR9IzF9JywKKyAgICAnc3RyaW5nJzogcid7XGNvbG9ye0ZvcmVzdEdyZWVufSMxfScsCisgICAgJ2RvY3N0cmluZyc6IHIne1xlbXBoe1xjb2xvcntGb3Jlc3RHcmVlbn0jMX19JywKKyAgICAna2V5d29yZCc6IHIne1xjb2xvcntvcmFuZ2V9IzF9JywKKyAgICAnYnVpbHRpbic6IHIne1xjb2xvcntwdXJwbGV9IzF9JywKKyAgICAnZGVmaW5pdGlvbic6IHIne1xjb2xvcntvcmFuZ2V9IzF9JywKKyAgICAnZGVmbmFtZSc6IHIne1xjb2xvcntibHVlfSMxfScsCisgICAgJ29wZXJhdG9yJzogcid7XGNvbG9ye2Jyb3dufSMxfScsCiB9CiAKIGRlZmF1bHRfbGF0ZXhfZG9jdW1lbnQgPSByJycnCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2lkbGUzIGIvVG9vbHMvc2NyaXB0cy9pZGxlMwppbmRleCA4ZWU5MmMyLi5kNzMzMmJjIDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL2lkbGUzCisrKyBiL1Rvb2xzL3NjcmlwdHMvaWRsZTMKQEAgLTEsNSArMSw1IEBACiAjISAvdXNyL2Jpbi9lbnYgcHl0aG9uMwogCi1mcm9tIGlkbGVsaWIuUHlTaGVsbCBpbXBvcnQgbWFpbgorZnJvbSBpZGxlbGliLnB5c2hlbGwgaW1wb3J0IG1haW4KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgbWFpbigpCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL21haWxlcmRhZW1vbi5weSBiL1Rvb2xzL3NjcmlwdHMvbWFpbGVyZGFlbW9uLnB5CmluZGV4IGFlYjQ1MWUuLjYzNWU1NDggMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvbWFpbGVyZGFlbW9uLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvbWFpbGVyZGFlbW9uLnB5CkBAIC04OCw3ICs4OCw3IEBACiAjIG5vIG1vcmUgZXhwcmVzc2lvbnMgYXJlIHNlYXJjaGVkIGZvci4gIFNvLCBvcmRlciBpcyBpbXBvcnRhbnQuCiBlbXBhcnNlX2xpc3RfcmVhc29uID0gWwogICAgIHInXjVcZHsyfSA8PlwuXC5cLiAoP1A8cmVhc29uPi4qKScsCi0gICAgJzw+XC5cLlwuICg/UDxyZWFzb24+LiopJywKKyAgICByJzw+XC5cLlwuICg/UDxyZWFzb24+LiopJywKICAgICByZS5jb21waWxlKHInXjw8PCA1XGR7Mn0gKD9QPHJlYXNvbj4uKiknLCByZS5NVUxUSUxJTkUpLAogICAgIHJlLmNvbXBpbGUoJz09PT09IHN0ZGVyciB3YXMgPT09PT1cbnJtYWlsOiAoP1A8cmVhc29uPi4qKScpLAogICAgIHJlLmNvbXBpbGUoJ15EaWFnbm9zdGljLUNvZGU6ICg/UDxyZWFzb24+LiopJywgcmUuTVVMVElMSU5FKSwKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvbm0yZGVmLnB5IGIvVG9vbHMvc2NyaXB0cy9ubTJkZWYucHkKaW5kZXggOGYwNzU1OS4uODNiYmNkNyAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9ubTJkZWYucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9ubTJkZWYucHkKQEAgLTM2LDggKzM2LDggQEAKICIiIgogaW1wb3J0IG9zLCBzeXMKIAotUFlUSE9OTElCID0gJ2xpYnB5dGhvbicrc3lzLnZlcnNpb25bOjNdKycuYScKLVBDX1BZVEhPTkxJQiA9ICdQeXRob24nK3N5cy52ZXJzaW9uWzBdK3N5cy52ZXJzaW9uWzJdKycuZGxsJworUFlUSE9OTElCID0gJ2xpYnB5dGhvbiVkLiVkLmEnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KK1BDX1BZVEhPTkxJQiA9ICdQeXRob24lZCVkLmRsbCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQogTk0gPSAnbm0gLXAgLWcgJXMnICAgICAgICAgICAgICAgICAgICAgICMgRm9yIExpbnV4LCB1c2UgIm5tIC1nICVzIgogCiBkZWYgc3ltYm9scyhsaWI9UFlUSE9OTElCLHR5cGVzPSgnVCcsJ0MnLCdEJykpOgpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9wYXJzZWVudGl0aWVzLnB5IGIvVG9vbHMvc2NyaXB0cy9wYXJzZWVudGl0aWVzLnB5CmluZGV4IGEwNDJkMWMuLmM2ODZiMDIgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvcGFyc2VlbnRpdGllcy5weQorKysgYi9Ub29scy9zY3JpcHRzL3BhcnNlZW50aXRpZXMucHkKQEAgLTE0LDcgKzE0LDcgQEAKICIiIgogaW1wb3J0IHJlLHN5cwogCi1lbnRpdHlSRSA9IHJlLmNvbXBpbGUoJzwhRU5USVRZICsoXHcrKSArQ0RBVEEgKyIoW14iXSspIiArLS0gKygoPzoufFxuKSs/KSAqLS0+JykKK2VudGl0eVJFID0gcmUuY29tcGlsZShyJzwhRU5USVRZICsoXHcrKSArQ0RBVEEgKyIoW14iXSspIiArLS0gKygoPzoufFxuKSs/KSAqLS0+JykKIAogZGVmIHBhcnNlKHRleHQscG9zPTAsZW5kcG9zPU5vbmUpOgogCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgIGlmIGNoYXJjb2RlWzoyXSA9PSAnJiMnOgogICAgICAgICAgICAgY29kZSA9IGludChjaGFyY29kZVsyOi0xXSkKICAgICAgICAgICAgIGlmIGNvZGUgPCAyNTY6Ci0gICAgICAgICAgICAgICAgY2hhcmNvZGUgPSAiJ1wlbyciICUgY29kZQorICAgICAgICAgICAgICAgIGNoYXJjb2RlID0gciInXCVvJyIgJSBjb2RlCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGNoYXJjb2RlID0gcmVwcihjaGFyY29kZSkKICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvcGF0aGZpeC5weSBiL1Rvb2xzL3NjcmlwdHMvcGF0aGZpeC5weQppbmRleCAyMjQzMmQxLi41NjJiYmM3IDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL3BhdGhmaXgucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9wYXRoZml4LnB5CkBAIC02NCw3ICs2NCw3IEBACiAgICAgICAgICAgICBpZiBmaXgoYXJnKTogYmFkID0gMQogICAgIHN5cy5leGl0KGJhZCkKIAotaXNweXRob25wcm9nID0gcmUuY29tcGlsZSgnXlthLXpBLVowLTlfXStcLnB5JCcpCitpc3B5dGhvbnByb2cgPSByZS5jb21waWxlKHInXlthLXpBLVowLTlfXStcLnB5JCcpCiBkZWYgaXNweXRob24obmFtZSk6CiAgICAgcmV0dXJuIGJvb2woaXNweXRob25wcm9nLm1hdGNoKG5hbWUpKQogCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL3B0YWdzLnB5IGIvVG9vbHMvc2NyaXB0cy9wdGFncy5weQppbmRleCBjYTY0M2IzLi4zOTZjYmQwIDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL3B0YWdzLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvcHRhZ3MucHkKQEAgLTI0LDcgKzI0LDcgQEAKICAgICAgICAgZm9yIHMgaW4gdGFnczogZnAud3JpdGUocykKIAogCi1leHByID0gJ15bIFx0XSooZGVmfGNsYXNzKVsgXHRdKyhbYS16QS1aMC05X10rKVsgXHRdKls6XChdJworZXhwciA9IHInXlsgXHRdKihkZWZ8Y2xhc3MpWyBcdF0rKFthLXpBLVowLTlfXSspWyBcdF0qWzpcKF0nCiBtYXRjaGVyID0gcmUuY29tcGlsZShleHByKQogCiBkZWYgdHJlYXRfZmlsZShmaWxlbmFtZSk6CmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL3B5dmVudiBiL1Rvb2xzL3NjcmlwdHMvcHl2ZW52CmluZGV4IDk3OGQ2OTEuLjFmYjQyYzYgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvcHl2ZW52CisrKyBiL1Rvb2xzL3NjcmlwdHMvcHl2ZW52CkBAIC0xLDYgKzEsMTIgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbjMKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgaW1wb3J0IHN5cworICAgIGltcG9ydCBwYXRobGliCisKKyAgICBleGVjdXRhYmxlID0gcGF0aGxpYi5QYXRoKHN5cy5leGVjdXRhYmxlIG9yICdweXRob24zJykubmFtZQorICAgIHByaW50KCdXQVJOSU5HOiB0aGUgcHllbnYgc2NyaXB0IGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mICcKKyAgICAgICAgICBmJ2B7ZXhlY3V0YWJsZX0gLW0gdmVudmAnLCBmaWxlPXN5cy5zdGRlcnIpCisKICAgICByYyA9IDEKICAgICB0cnk6CiAgICAgICAgIGltcG9ydCB2ZW52CmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL3N2bmVvbC5weSBiL1Rvb2xzL3NjcmlwdHMvc3ZuZW9sLnB5CmluZGV4IDhhYmRkMDEuLjZjNzBkYTkgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvc3ZuZW9sLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvc3ZuZW9sLnB5CkBAIC0xLDYgKzEsNiBAQAogIyEgL3Vzci9iaW4vZW52IHB5dGhvbjMKIAotIiIiCityIiIiCiBTVk4gaGVscGVyIHNjcmlwdC4KIAogVHJ5IHRvIHNldCB0aGUgc3ZuOmVvbC1zdHlsZSBwcm9wZXJ0eSB0byAibmF0aXZlIiBvbiBldmVyeSAucHksIC50eHQsIC5jIGFuZApkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy90ZXhpMmh0bWwucHkgYi9Ub29scy9zY3JpcHRzL3RleGkyaHRtbC5weQppbmRleCA5OTgzNTI4Li45YzFlOWZlIDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL3RleGkyaHRtbC5weQorKysgYi9Ub29scy9zY3JpcHRzL3RleGkyaHRtbC5weQpAQCAtNzgsMTEgKzc4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcnVubmluZyB0ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZW51IGl0ZW0gKFl1Y2shKQotbWlwcm9nID0gcmUuY29tcGlsZSgnXlwqIChbXjpdKik6KDp8WyBcdF0qKFteXHQsXG4uXSspKFteIFx0XG5dKikpWyBcdFxuXSonKQotIyAgICAgICAgICAgICAgICAgICAwICAgIDEgICAgIDEgMiAgICAgICAgMyAgICAgICAgICAzNCAgICAgICAgIDQyICAgICAgICAwCi0jICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLSAgLS0tLS0tLS0tCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21pcHJvZyA9IHJlLmNvbXBpbGUocideXCogKFteOl0qKTooOnxbIFx0XSooW15cdCxcbi5dKykoW14gXHRcbl0qKSlbIFx0XG5dKicpCisjICAgICAgICAgICAgICAgICAgICAwICAgIDEgICAgIDEgMiAgICAgICAgMyAgICAgICAgICAzNCAgICAgICAgIDQyICAgICAgICAwCisjICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0gIC0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL3NzbC90ZXN0X211bHRpcGxlX3ZlcnNpb25zLnB5IGIvVG9vbHMvc3NsL3Rlc3RfbXVsdGlwbGVfdmVyc2lvbnMucHkKaW5kZXggZGQ1N2RjZi4uMzBkNWZjZiAxMDA2NDQKLS0tIGEvVG9vbHMvc3NsL3Rlc3RfbXVsdGlwbGVfdmVyc2lvbnMucHkKKysrIGIvVG9vbHMvc3NsL3Rlc3RfbXVsdGlwbGVfdmVyc2lvbnMucHkKQEAgLTEwNSwxMSArMTA1LDExIEBACiAKICAgICBkZWYgX3N1YnByb2Nlc3NfY2FsbChzZWxmLCBjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsIGVudj1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKToKLSAgICAgICAgbG9nLmRlYnVnKCJDYWxsICd7fSciLmZvcm1hdCgiICIuam9pbihjbWQpKSkKKyAgICAgICAgbG9nLmRlYnVnKCJDYWxsICclcyciLCAiICIuam9pbihjbWQpKQogICAgICAgICByZXR1cm4gc3VicHJvY2Vzcy5jaGVja19jYWxsKGNtZCwgc3Rkb3V0PXN0ZG91dCwgZW52PWVudiwgKiprd2FyZ3MpCiAKICAgICBkZWYgX3N1YnByb2Nlc3Nfb3V0cHV0KHNlbGYsIGNtZCwgZW52PU5vbmUsICoqa3dhcmdzKToKLSAgICAgICAgbG9nLmRlYnVnKCJDYWxsICd7fSciLmZvcm1hdCgiICIuam9pbihjbWQpKSkKKyAgICAgICAgbG9nLmRlYnVnKCJDYWxsICclcyciLCAiICIuam9pbihjbWQpKQogICAgICAgICBvdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChjbWQsIGVudj1lbnYpCiAgICAgICAgIHJldHVybiBvdXQuc3RyaXAoKS5kZWNvZGUoInV0Zi04IikKIApAQCAtMTY4LDcgKzE2OCw3IEBACiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5oYXNfc3JjOgogICAgICAgICAgICAgICAgIHNlbGYuX2Rvd25sb2FkX29wZW5zc2woKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFscmVhZHkgaGFzIHNyYyB7fSIuZm9ybWF0KHNlbGYuc3JjX2ZpbGUpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWxyZWFkeSBoYXMgc3JjICVzIiwgc2VsZi5zcmNfZmlsZSkKICAgICAgICAgICAgIHNlbGYuX3VucGFja19vcGVuc3NsKCkKICAgICAgICAgICAgIHNlbGYuX2J1aWxkX29wZW5zc2woKQogICAgICAgICAgICAgc2VsZi5faW5zdGFsbF9vcGVuc3NsKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL3R6L3pkdW1wLnB5IGIvVG9vbHMvdHovemR1bXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0YjQ4MwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3R6L3pkdW1wLnB5CkBAIC0wLDAgKzEsODEgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHN0cnVjdAorZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lLCB0aW1lZGVsdGEKKwordHRpbmZvID0gbmFtZWR0dXBsZSgndHRpbmZvJywgWyd0dF9nbXRvZmYnLCAndHRfaXNkc3QnLCAndHRfYWJicmluZCddKQorCitjbGFzcyBUWkluZm86CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zaXRpb25zLCB0eXBlX2luZGljZXMsIHR0aXMsIGFiYnJzKToKKyAgICAgICAgc2VsZi50cmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zCisgICAgICAgIHNlbGYudHlwZV9pbmRpY2VzID0gdHlwZV9pbmRpY2VzCisgICAgICAgIHNlbGYudHRpcyA9IHR0aXMKKyAgICAgICAgc2VsZi5hYmJycyA9IGFiYnJzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbWZpbGUoY2xzLCBmaWxlb2JqKToKKyAgICAgICAgaWYgZmlsZW9iai5yZWFkKDQpLmRlY29kZSgpICE9ICJUWmlmIjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vdCBhIHpvbmVpbmZvIGZpbGUiKQorICAgICAgICBmaWxlb2JqLnNlZWsoMjApCisgICAgICAgIGhlYWRlciA9IGZpbGVvYmoucmVhZCgyNCkKKyAgICAgICAgdHpoID0gKHR6aF90dGlzZ210Y250LCB0emhfdHRpc3N0ZGNudCwgdHpoX2xlYXBjbnQsCisgICAgICAgICAgICAgICB0emhfdGltZWNudCwgdHpoX3R5cGVjbnQsIHR6aF9jaGFyY250KSA9IHN0cnVjdC51bnBhY2soIj42bCIsIGhlYWRlcikKKyAgICAgICAgdHJhbnNpdGlvbnMgPSBhcnJheSgnaScpCisgICAgICAgIHRyYW5zaXRpb25zLmZyb21maWxlKGZpbGVvYmosIHR6aF90aW1lY250KQorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyICE9ICdiaWcnOgorICAgICAgICAgICAgdHJhbnNpdGlvbnMuYnl0ZXN3YXAoKQorCisgICAgICAgIHR5cGVfaW5kaWNlcyA9IGFycmF5KCdCJykKKyAgICAgICAgdHlwZV9pbmRpY2VzLmZyb21maWxlKGZpbGVvYmosIHR6aF90aW1lY250KQorCisgICAgICAgIHR0aXMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSh0emhfdHlwZWNudCk6CisgICAgICAgICAgICB0dGlzLmFwcGVuZCh0dGluZm8uX21ha2Uoc3RydWN0LnVucGFjaygiPmxiYiIsIGZpbGVvYmoucmVhZCg2KSkpKQorCisgICAgICAgIGFiYnJzID0gZmlsZW9iai5yZWFkKHR6aF9jaGFyY250KQorCisgICAgICAgIHNlbGYgPSBjbHModHJhbnNpdGlvbnMsIHR5cGVfaW5kaWNlcywgdHRpcywgYWJicnMpCisgICAgICAgIHNlbGYudHpoID0gdHpoCisKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBkdW1wKHNlbGYsIHN0cmVhbSwgc3RhcnQ9Tm9uZSwgZW5kPU5vbmUpOgorICAgICAgICBmb3IgaiwgKHRyYW5zLCBpKSBpbiBlbnVtZXJhdGUoemlwKHNlbGYudHJhbnNpdGlvbnMsIHNlbGYudHlwZV9pbmRpY2VzKSk6CisgICAgICAgICAgICB1dGMgPSBkYXRldGltZS51dGNmcm9tdGltZXN0YW1wKHRyYW5zKQorICAgICAgICAgICAgdHRpID0gc2VsZi50dGlzW2ldCisgICAgICAgICAgICBsbXQgPSBkYXRldGltZS51dGNmcm9tdGltZXN0YW1wKHRyYW5zICsgdHRpLnR0X2dtdG9mZikKKyAgICAgICAgICAgIGFiYnJpbmQgPSB0dGkudHRfYWJicmluZAorICAgICAgICAgICAgYWJiciA9IHNlbGYuYWJicnNbYWJicmluZDpzZWxmLmFiYnJzLmZpbmQoMCwgYWJicmluZCldLmRlY29kZSgpCisgICAgICAgICAgICBpZiBqID4gMDoKKyAgICAgICAgICAgICAgICBwcmV2X3R0aSA9IHNlbGYudHRpc1tzZWxmLnR5cGVfaW5kaWNlc1tqIC0gMV1dCisgICAgICAgICAgICAgICAgc2hpZnQgPSAiICUrZyIgJSAoKHR0aS50dF9nbXRvZmYgLSBwcmV2X3R0aS50dF9nbXRvZmYpIC8gMzYwMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2hpZnQgPSAnJworICAgICAgICAgICAgcHJpbnQoIiVzIFVUQyA9ICVzICUtNXMgaXNkc3Q9JWQiICUgKHV0YywgbG10LCBhYmJyLCB0dGlbMV0pICsgc2hpZnQsIGZpbGU9c3RyZWFtKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHpvbmVsaXN0KGNscywgem9uZWRpcj0nL3Vzci9zaGFyZS96b25laW5mbycpOgorICAgICAgICB6b25lcyA9IFtdCisgICAgICAgIGZvciByb290LCBfLCBmaWxlcyBpbiBvcy53YWxrKHpvbmVkaXIpOgorICAgICAgICAgICAgZm9yIGYgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgcCA9IG9zLnBhdGguam9pbihyb290LCBmKQorICAgICAgICAgICAgICAgIHdpdGggb3BlbihwLCAncmInKSBhcyBvOgorICAgICAgICAgICAgICAgICAgICBtYWdpYyA9ICBvLnJlYWQoNCkKKyAgICAgICAgICAgICAgICBpZiBtYWdpYyA9PSBiJ1RaaWYnOgorICAgICAgICAgICAgICAgICAgICB6b25lcy5hcHBlbmQocFtsZW4oem9uZWRpcikgKyAxOl0pCisgICAgICAgIHJldHVybiB6b25lcworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgorICAgICAgICB6b25lcyA9IFRaSW5mby56b25lbGlzdCgpCisgICAgICAgIGZvciB6IGluIHpvbmVzOgorICAgICAgICAgICAgcHJpbnQoeikKKyAgICAgICAgc3lzLmV4aXQoKQorICAgIGZpbGVwYXRoID0gc3lzLmFyZ3ZbMV0KKyAgICBpZiBub3QgZmlsZXBhdGguc3RhcnRzd2l0aCgnLycpOgorICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbignL3Vzci9zaGFyZS96b25laW5mbycsIGZpbGVwYXRoKQorICAgIHdpdGggb3BlbihmaWxlcGF0aCwgJ3JiJykgYXMgZmlsZW9iajoKKyAgICAgICAgdHppID0gVFpJbmZvLmZyb21maWxlKGZpbGVvYmopCisgICAgdHppLmR1bXAoc3lzLnN0ZG91dCkKZGlmZiAtLWdpdCBhL1Rvb2xzL3VuaWNvZGUvZ2VuY29kZWMucHkgYi9Ub29scy91bmljb2RlL2dlbmNvZGVjLnB5CmluZGV4IDRjMjE0NjkuLjMxZjAxMTIgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3VuaWNvZGUvZ2VuY29kZWMucHkKKysrIGIvVG9vbHMvdW5pY29kZS9nZW5jb2RlYy5weQpAQCAtMzcsMTEgKzM3LDExIEBACiAjIFBsYWNlaG9sZGVyIGZvciBhIG1pc3NpbmcgY29kZSBwb2ludAogTUlTU0lOR19DT0RFID0gLTEKIAotbWFwUkUgPSByZS5jb21waWxlKCcoKD86MHhbMC05YS1mQS1GXStcKz8pKyknCi0gICAgICAgICAgICAgICAgICAgJ1xzKycKLSAgICAgICAgICAgICAgICAgICAnKCg/Oig/OjB4WzAtOWEtZkEtWl0rfDxbQS1aYS16XSs+KVwrPykqKScKLSAgICAgICAgICAgICAgICAgICAnXHMqJwotICAgICAgICAgICAgICAgICAgICcoIy4rKT8nKQorbWFwUkUgPSByZS5jb21waWxlKHInKCg/OjB4WzAtOWEtZkEtRl0rXCs/KSspJworICAgICAgICAgICAgICAgICAgIHInXHMrJworICAgICAgICAgICAgICAgICAgIHInKCg/Oig/OjB4WzAtOWEtZkEtWl0rfDxbQS1aYS16XSs+KVwrPykqKScKKyAgICAgICAgICAgICAgICAgICByJ1xzKicKKyAgICAgICAgICAgICAgICAgICByJygjLispPycpCiAKIGRlZiBwYXJzZWNvZGVzKGNvZGVzLCBsZW49bGVuLCByYW5nZT1yYW5nZSk6CiAKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCBhYjFjMzJhLi5hOGI1ODI0IDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC0xLDYgKzEsNiBAQAogIyEgL2Jpbi9zaAogIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkgZm9yIHB5dGhvbiAzLjUuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSBmb3IgcHl0aG9uIDMuNi4KICMKICMgUmVwb3J0IGJ1Z3MgdG8gPGh0dHBzOi8vYnVncy5weXRob24ub3JnLz4uCiAjCkBAIC01ODAsOCArNTgwLDggQEAKICMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgogUEFDS0FHRV9OQU1FPSdweXRob24nCiBQQUNLQUdFX1RBUk5BTUU9J3B5dGhvbicKLVBBQ0tBR0VfVkVSU0lPTj0nMy41JwotUEFDS0FHRV9TVFJJTkc9J3B5dGhvbiAzLjUnCitQQUNLQUdFX1ZFUlNJT049JzMuNicKK1BBQ0tBR0VfU1RSSU5HPSdweXRob24gMy42JwogUEFDS0FHRV9CVUdSRVBPUlQ9J2h0dHBzOi8vYnVncy5weXRob24ub3JnLycKIFBBQ0tBR0VfVVJMPScnCiAKQEAgLTY0NSw4ICs2NDUsNiBAQAogVEhSRUFET0JKCiBMRExBU1QKIFVTRV9USFJFQURfTU9EVUxFCi1TSUdOQUxfT0JKUwotVVNFX1NJR05BTF9NT0RVTEUKIFRDTFRLX0xJQlMKIFRDTFRLX0lOQ0xVREVTCiBMSUJGRklfSU5DTFVERURJUgpAQCAtNzA4LDYgKzcwNiw3IEBACiBCVUlMREVYRUVYVAogRUdSRVAKIE5PX0FTX05FRURFRAorTVVMVElBUkNIX0NQUEZMQUdTCiBQTEFURk9STV9UUklQTEVUCiBQTEFURElSCiBNVUxUSUFSQ0gKQEAgLTgyNyw3ICs4MjYsNiBAQAogd2l0aF90Y2x0a19pbmNsdWRlcwogd2l0aF90Y2x0a19saWJzCiB3aXRoX2RibWxpYm9yZGVyCi13aXRoX3NpZ25hbF9tb2R1bGUKIHdpdGhfdGhyZWFkcwogd2l0aF90aHJlYWQKIGVuYWJsZV9pcHY2CkBAIC0xNDA1LDcgKzE0MDMsNyBAQAogICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgogICBjYXQgPDxfQUNFT0YKLVxgY29uZmlndXJlJyBjb25maWd1cmVzIHB5dGhvbiAzLjUgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgcHl0aG9uIDMuNiB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCiAKIFVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgogCkBAIC0xNDcyLDcgKzE0NzAsNyBAQAogCiBpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgogICBjYXNlICRhY19pbml0X2hlbHAgaW4KLSAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIHB5dGhvbiAzLjU6Ijs7CisgICAgIHNob3J0IHwgcmVjdXJzaXZlICkgZWNobyAiQ29uZmlndXJhdGlvbiBvZiBweXRob24gMy42OiI7OwogICAgZXNhYwogICBjYXQgPDxcX0FDRU9GCiAKQEAgLTE1MzEsNyArMTUyOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyIHRvIGNoZWNrIGRiIGJhY2tlbmRzIGZvciBkYm0uIFZhbGlkIHZhbHVlIGlzIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb24gc2VwYXJhdGVkIHN0cmluZyB3aXRoIHRoZSBiYWNrZW5kIG5hbWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBuZGJtJywgYGdkYm0nIGFuZCBgYmRiJy4KLSAgLS13aXRoLXNpZ25hbC1tb2R1bGUgICAgZGlzYWJsZS9lbmFibGUgc2lnbmFsIG1vZHVsZQogICAtLXdpdGgob3V0KS10aHJlYWRzWz1ESVJFQ1RPUlldCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUvZW5hYmxlIHRocmVhZCBzdXBwb3J0CiAgIC0td2l0aChvdXQpLXRocmVhZFs9RElSRUNUT1JZXQpAQCAtMTYzMSw3ICsxNjI4LDcgQEAKIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwogaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgogICBjYXQgPDxcX0FDRU9GCi1weXRob24gY29uZmlndXJlIDMuNQorcHl0aG9uIGNvbmZpZ3VyZSAzLjYKIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OQogCiBDb3B5cmlnaHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkBAIC0xOTg0LDEzNiArMTk4MSw2IEBACiAKIH0gIyBhY19mbl9jX2NoZWNrX3R5cGUKIAotIyBhY19mbl9jX2ZpbmRfdWludFhfdCBMSU5FTk8gQklUUyBWQVIKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEZpbmRzIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSB3aXRoIHdpZHRoIEJJVFMsIHNldHRpbmcgY2FjaGUgdmFyaWFibGUgVkFSCi0jIGFjY29yZGluZ2x5LgotYWNfZm5fY19maW5kX3VpbnRYX3QgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1aW50JDJfdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdWludCQyX3QuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBldmFsICIkMz1ubyIKLSAgICAgIyBPcmRlciBpcyBpbXBvcnRhbnQgLSBuZXZlciBjaGVjayBhIHR5cGUgdGhhdCBpcyBwb3RlbnRpYWxseSBzbWFsbGVyCi0gICAgICMgdGhhbiBoYWxmIG9mIHRoZSBleHBlY3RlZCB0YXJnZXQgd2lkdGguCi0gICAgIGZvciBhY190eXBlIGluIHVpbnQkMl90ICd1bnNpZ25lZCBpbnQnICd1bnNpZ25lZCBsb25nIGludCcgXAotCSAndW5zaWduZWQgbG9uZyBsb25nIGludCcgJ3Vuc2lnbmVkIHNob3J0IGludCcgJ3Vuc2lnbmVkIGNoYXInOyBkbwotICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgoJGFjX3R5cGUpIC0xID4+ICgkMiAvIDIgLSAxKSkgPj4gKCQyIC8gMiAtIDEpID09IDMpXTsKLXRlc3RfYXJyYXkgWzBdID0gMDsKLXJldHVybiB0ZXN0X2FycmF5IFswXTsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGNhc2UgJGFjX3R5cGUgaW4gIygKLSAgdWludCQyX3QpIDoKLSAgICBldmFsICIkMz15ZXMiIDs7ICMoCi0gICopIDoKLSAgICBldmFsICIkMz1cJGFjX3R5cGUiIDs7Ci1lc2FjCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgICAgaWYgZXZhbCB0ZXN0IFwieFwkIiQzIlwiID0geCJubyI7IHRoZW4gOgotCi1lbHNlCi0gIGJyZWFrCi1maQotICAgICBkb25lCi1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19ICMgYWNfZm5fY19maW5kX3VpbnRYX3QKLQotIyBhY19mbl9jX2ZpbmRfaW50WF90IExJTkVOTyBCSVRTIFZBUgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBGaW5kcyBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgd2l0aCB3aWR0aCBCSVRTLCBzZXR0aW5nIGNhY2hlIHZhcmlhYmxlIFZBUgotIyBhY2NvcmRpbmdseS4KLWFjX2ZuX2NfZmluZF9pbnRYX3QgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbnQkMl90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbnQkMl90Li4uICIgPiY2OyB9Ci1pZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZXZhbCAiJDM9bm8iCi0gICAgICMgT3JkZXIgaXMgaW1wb3J0YW50IC0gbmV2ZXIgY2hlY2sgYSB0eXBlIHRoYXQgaXMgcG90ZW50aWFsbHkgc21hbGxlcgotICAgICAjIHRoYW4gaGFsZiBvZiB0aGUgZXhwZWN0ZWQgdGFyZ2V0IHdpZHRoLgotICAgICBmb3IgYWNfdHlwZSBpbiBpbnQkMl90ICdpbnQnICdsb25nIGludCcgXAotCSAnbG9uZyBsb25nIGludCcgJ3Nob3J0IGludCcgJ3NpZ25lZCBjaGFyJzsgZG8KLSAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotCSAgICAgZW51bSB7IE4gPSAkMiAvIDIgLSAxIH07Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKDAgPCAoJGFjX3R5cGUpICgoKCgoJGFjX3R5cGUpIDEgPDwgTikgPDwgTikgLSAxKSAqIDIgKyAxKSldOwotdGVzdF9hcnJheSBbMF0gPSAwOwotcmV0dXJuIHRlc3RfYXJyYXkgWzBdOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLQkgICAgICAgIGVudW0geyBOID0gJDIgLyAyIC0gMSB9OwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJGFjX3R5cGUpICgoKCgoJGFjX3R5cGUpIDEgPDwgTikgPDwgTikgLSAxKSAqIDIgKyAxKQotCQkgPCAoJGFjX3R5cGUpICgoKCgoJGFjX3R5cGUpIDEgPDwgTikgPDwgTikgLSAxKSAqIDIgKyAyKSldOwotdGVzdF9hcnJheSBbMF0gPSAwOwotcmV0dXJuIHRlc3RfYXJyYXkgWzBdOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLQotZWxzZQotICBjYXNlICRhY190eXBlIGluICMoCi0gIGludCQyX3QpIDoKLSAgICBldmFsICIkMz15ZXMiIDs7ICMoCi0gICopIDoKLSAgICBldmFsICIkMz1cJGFjX3R5cGUiIDs7Ci1lc2FjCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgICAgaWYgZXZhbCB0ZXN0IFwieFwkIiQzIlwiID0geCJubyI7IHRoZW4gOgotCi1lbHNlCi0gIGJyZWFrCi1maQotICAgICBkb25lCi1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19ICMgYWNfZm5fY19maW5kX2ludFhfdAotCiAjIGFjX2ZuX2NfY29tcHV0ZV9pbnQgTElORU5PIEVYUFIgVkFSIElOQ0xVREVTCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFRyaWVzIHRvIGZpbmQgdGhlIGNvbXBpbGUtdGltZSB2YWx1ZSBvZiBFWFBSIGluIGEgcHJvZ3JhbSB0aGF0IGluY2x1ZGVzCkBAIC0yNDcwLDcgKzIzMzcsNyBAQAogVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKIHJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCiAKLUl0IHdhcyBjcmVhdGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy41LCB3aGljaCB3YXMKK0l0IHdhcyBjcmVhdGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy42LCB3aGljaCB3YXMKIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwogCiAgICQgJDAgJEAKQEAgLTMwNTksNyArMjkyNiw3IEBACiAgICAgaWYgdGVzdCAteiAiJFBZVEhPTl9GT1JfQlVJTEQiOyB0aGVuCiAgICAgICAgIGZvciBpbnRlcnAgaW4gcHl0aG9uJFBBQ0tBR0VfVkVSU0lPTiBweXRob24zIHB5dGhvbjsgZG8KIAkgICAgd2hpY2ggJGludGVycCA+L2Rldi9udWxsIDI+JjEgfHwgY29udGludWUKLQkgICAgaWYgJGludGVycCAtYyAnaW1wb3J0IHN5cztzeXMuZXhpdChub3Qgc3lzLnZlcnNpb25faW5mb1s6Ml0gPj0gKDMsMykpJzsgdGhlbgorCSAgICBpZiAkaW50ZXJwIC1jICJpbXBvcnQgc3lzO3N5cy5leGl0KG5vdCAnLicuam9pbihzdHIobikgZm9yIG4gaW4gc3lzLnZlcnNpb25faW5mb1s6Ml0pID09ICckUEFDS0FHRV9WRVJTSU9OJykiOyB0aGVuCiAJICAgICAgICBicmVhawogCSAgICBmaQogICAgICAgICAgICAgaW50ZXJwPQpAQCAtMzA5Nyw3ICsyOTY0LDcgQEAKIG12IGNvbmZkZWZzLmgubmV3IGNvbmZkZWZzLmgKIAogCi1WRVJTSU9OPTMuNQorVkVSU0lPTj0zLjYKIAogIyBWZXJzaW9uIG51bWJlciBvZiBQeXRob24ncyBvd24gc2hhcmVkIGxpYnJhcnkgZmlsZS4KIApAQCAtNTI4OSw3ICs1MTU2LDMxIEBACiAjdW5kZWYgcG93ZXJwYwogI3VuZGVmIHNwYXJjCiAjdW5kZWYgdW5peAotI2lmIGRlZmluZWQoX19saW51eF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pCisjIGlmIGRlZmluZWQoX194ODZfNjRfXykgJiYgZGVmaW5lZChfX0xQNjRfXykKKyAgICAgICAgeDg2XzY0LWxpbnV4LWFuZHJvaWQKKyMgZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorICAgICAgICBpNjg2LWxpbnV4LWFuZHJvaWQKKyMgZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKSAmJiBkZWZpbmVkKF9fQUFSQ0g2NEVMX18pCisjICBpZiBkZWZpbmVkKF9fSUxQMzJfXykKKyAgICAgICAgYWFyY2g2NF9pbHAzMi1saW51eC1hbmRyb2lkCisjICBlbHNlCisgICAgICAgIGFhcmNoNjQtbGludXgtYW5kcm9pZAorIyAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkKF9fQVJNX0VBQklfXykgJiYgZGVmaW5lZChfX0FSTUVMX18pCisgICAgICAgIGFybS1saW51eC1hbmRyb2lkZWFiaQorIyBlbGlmIGRlZmluZWQoX19taXBzX2hhcmRfZmxvYXQpICYmIGRlZmluZWQoX01JUFNFTCkKKyMgIGlmIF9NSVBTX1NJTSA9PSBfQUJJTzMyCisgICAgICAgIG1pcHNlbC1saW51eC1hbmRyb2lkCisjICBlbGlmIF9NSVBTX1NJTSA9PSBfQUJJNjQKKyAgICAgICAgbWlwczY0ZWwtbGludXgtYW5kcm9pZAorIyAgZWxzZQorIyAgIGVycm9yIHVua25vd24gcGxhdGZvcm0gdHJpcGxldAorIyAgZW5kaWYKKyMgZWxzZQorIyAgIGVycm9yIHVua25vd24gcGxhdGZvcm0gdHJpcGxldAorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pCiAjIGlmIGRlZmluZWQoX194ODZfNjRfXykgJiYgZGVmaW5lZChfX0xQNjRfXykKICAgICAgICAgeDg2XzY0LWxpbnV4LWdudQogIyBlbGlmIGRlZmluZWQoX194ODZfNjRfXykgJiYgZGVmaW5lZChfX0lMUDMyX18pCkBAIC01NDA1LDEwICs1Mjk2LDE5IEBACiAgIGlmIHRlc3QgeCRQTEFURk9STV9UUklQTEVUICE9IHgkTVVMVElBUkNIOyB0aGVuCiAgICAgYXNfZm5fZXJyb3IgJD8gImludGVybmFsIGNvbmZpZ3VyZSBlcnJvciBmb3IgdGhlIHBsYXRmb3JtIHRyaXBsZXQsIHBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCIgIiRMSU5FTk8iIDUKICAgZmkKK2VsaWYgdGVzdCB4JFBMQVRGT1JNX1RSSVBMRVQgIT0geCAmJiB0ZXN0IHgkTVVMVElBUkNIID0geDsgdGhlbgorICBNVUxUSUFSQ0g9JFBMQVRGT1JNX1RSSVBMRVQKIGZpCi1QTEFURElSPXBsYXQtJE1BQ0hERVAKK2lmIHRlc3QgeCRQTEFURk9STV9UUklQTEVUID0geDsgdGhlbgorICBQTEFURElSPXBsYXQtJE1BQ0hERVAKK2Vsc2UKKyAgUExBVERJUj1wbGF0LSRQTEFURk9STV9UUklQTEVUCitmaQogCiAKK2lmIHRlc3QgeCRNVUxUSUFSQ0ggIT0geDsgdGhlbgorICBNVUxUSUFSQ0hfQ1BQRkxBR1M9Ii1ETVVMVElBUkNIPVxcXCIkTVVMVElBUkNIXFxcIiIKK2ZpCiAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLVdsLC0tbm8tYXMtbmVlZGVkIiA+JjUKQEAgLTU3MDIsNiArNTYwMiwzMiBAQAogCiAKIAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdGhlIEFuZHJvaWQgQVBJIGxldmVsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB0aGUgQW5kcm9pZCBBUEkgbGV2ZWwuLi4gIiA+JjY7IH0KK2NhdCA+PiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorX19BTkRST0lEX0FQSV9fCisjZWxzZQorI2Vycm9yIG5vdCBBbmRyb2lkCisjZW5kaWYKK0VPRgorCitpZiAkQ1BQICRDUFBGTEFHUyBjb25mdGVzdC5jID5jb25mdGVzdC5vdXQgMj4vZGV2L251bGw7IHRoZW4KKyAgQU5EUk9JRF9BUElfTEVWRUw9YGdyZXAgLXYgJ14jJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICdeICokJ2AKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBTkRST0lEX0FQSV9MRVZFTCIgPiY1CiskYXNfZWNobyAiJEFORFJPSURfQVBJX0xFVkVMIiA+JjY7IH0KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBBTkRST0lEX0FQSV9MRVZFTCAkQU5EUk9JRF9BUElfTEVWRUwKK19BQ0VPRgorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub3QgQW5kcm9pZCIgPiY1CiskYXNfZWNobyAibm90IEFuZHJvaWQiID4mNjsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmMgY29uZnRlc3Qub3V0CisKICMgQ2hlY2sgZm9yIHVuc3VwcG9ydGVkIHN5c3RlbXMKIGNhc2UgJGFjX3N5c19zeXN0ZW0vJGFjX3N5c19yZWxlYXNlIGluCiBhdGhlb3MqfExpbnV4Ki8xKikKQEAgLTY2MDQsMTMgKzY1MzAsMjAgQEAKIGlmIHRlc3QgIiRQeV9MVE8iID0gJ3RydWUnIDsgdGhlbgogICBjYXNlICRDQyBpbgogICAgICpjbGFuZyopCi0gICAgICAjIEFueSBjaGFuZ2VzIG1hZGUgaGVyZSBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSBHQ0MrRGFyd2luIGNhc2UgYmVsb3cKLSAgICAgIExUT0ZMQUdTPSItZmx0byIKKyAgICAgIGNhc2UgJGFjX3N5c19zeXN0ZW0gaW4KKyAgICAgICAgRGFyd2luKikKKyAgICAgICAgICAjIEFueSBjaGFuZ2VzIG1hZGUgaGVyZSBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSBHQ0MrRGFyd2luIGNhc2UgYmVsb3cKKyAgICAgICAgICBMVE9GTEFHUz0iLWZsdG8gLVdsLC1leHBvcnRfZHluYW1pYyIKKyAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgIExUT0ZMQUdTPSItZmx0byIKKyAgICAgICAgICA7OworICAgICAgZXNhYwogICAgICAgOzsKICAgICAqZ2NjKikKICAgICAgIGNhc2UgJGFjX3N5c19zeXN0ZW0gaW4KICAgICAgICAgRGFyd2luKikKLSAgICAgICAgICBMVE9GTEFHUz0iLWZsdG8iCisgICAgICAgICAgTFRPRkxBR1M9Ii1mbHRvIC1XbCwtZXhwb3J0X2R5bmFtaWMiCiAgICAgICAgICAgOzsKICAgICAgICAgKikKICAgICAgICAgICBMVE9GTEFHUz0iLWZsdG8gLWZ1c2UtbGlua2VyLXBsdWdpbiAtZmZhdC1sdG8tb2JqZWN0cyAtZmx0by1wYXJ0aXRpb249bm9uZSIKQEAgLTY5MTgsNiArNjg1MSw4IEBACiAjIHR3ZWFrIEJBU0VDRkxBR1MgYmFzZWQgb24gY29tcGlsZXIgYW5kIHBsYXRmb3JtCiBjYXNlICRHQ0MgaW4KIHllcykKKyAgICBDRkxBR1NfTk9ESVNUPSIkQ0ZMQUdTX05PRElTVCAtc3RkPWM5OSIKKwogICAgICMgUHl0aG9uIGRvZXNuJ3QgdmlvbGF0ZSBDOTkgYWxpYXNpbmcgcnVsZXMsIGJ1dCBvbGRlciB2ZXJzaW9ucyBvZgogICAgICMgR0NDIHByb2R1Y2Ugd2FybmluZ3MgZm9yIGxlZ2FsIFB5dGhvbiBjb2RlLiAgRW5hYmxlCiAgICAgIyAtZm5vLXN0cmljdC1hbGlhc2luZyBvbiB2ZXJzaW9ucyBvZiBHQ0MgdGhhdCBzdXBwb3J0IGJ1dCBwcm9kdWNlCkBAIC03MDQwLDQ5ICs2OTc1LDYgQEAKICAgICAgIEJBU0VDRkxBR1M9IiRCQVNFQ0ZMQUdTIC1Xbm8tdW51c2VkLXJlc3VsdCIKICAgICBmaQogCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLVdlcnJvcj1kZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC1XZXJyb3I9ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50Li4uICIgPiY2OyB9Ci0gICAgIGFjX3NhdmVfY2M9IiRDQyIKLSAgICAgQ0M9IiRDQyAtV2Vycm9yPWRlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCIKLSAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gICAgIGlmICR7YWNfY3ZfZGVjbGFyYXRpb25fYWZ0ZXJfc3RhdGVtZW50X3dhcm5pbmcrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLSAgICAgICAgICAgYWNfY3ZfZGVjbGFyYXRpb25fYWZ0ZXJfc3RhdGVtZW50X3dhcm5pbmc9eWVzCi0KLWVsc2UKLQotICAgICAgICAgICBhY19jdl9kZWNsYXJhdGlvbl9hZnRlcl9zdGF0ZW1lbnRfd2FybmluZz1ubwotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0gICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICAgICBDQz0iJGFjX3NhdmVfY2MiCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9kZWNsYXJhdGlvbl9hZnRlcl9zdGF0ZW1lbnRfd2FybmluZyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2RlY2xhcmF0aW9uX2FmdGVyX3N0YXRlbWVudF93YXJuaW5nIiA+JjY7IH0KLQotICAgIGlmIHRlc3QgJGFjX2N2X2RlY2xhcmF0aW9uX2FmdGVyX3N0YXRlbWVudF93YXJuaW5nID0geWVzCi0gICAgdGhlbgotICAgICAgQ0ZMQUdTX05PRElTVD0iJENGTEFHU19OT0RJU1QgLVdlcnJvcj1kZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQiCi0gICAgZmkKLQogICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgd2UgY2FuIHR1cm4gb24gJENDIG1peGVkIHNpZ24gY29tcGFyaXNvbiB3YXJuaW5nIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGlmIHdlIGNhbiB0dXJuIG9uICRDQyBtaXhlZCBzaWduIGNvbXBhcmlzb24gd2FybmluZy4uLiAiID4mNjsgfQogICAgICBhY19zYXZlX2NjPSIkQ0MiCkBAIC03NzEwLDcgKzc2MDIsNyBAQAogZm9yIGFjX2hlYWRlciBpbiBhc20vdHlwZXMuaCBjb25pby5oIGRpcmVjdC5oIGRsZmNuLmggZXJybm8uaCBcCiBmY250bC5oIGdycC5oIFwKIGllZWVmcC5oIGlvLmggbGFuZ2luZm8uaCBsaWJpbnRsLmggcHJvY2Vzcy5oIHB0aHJlYWQuaCBcCi1zY2hlZC5oIHNoYWRvdy5oIHNpZ25hbC5oIHN0ZGludC5oIHN0cm9wdHMuaCB0ZXJtaW9zLmggXAorc2NoZWQuaCBzaGFkb3cuaCBzaWduYWwuaCBzdHJvcHRzLmggdGVybWlvcy5oIFwKIHVuaXN0ZC5oIHV0aW1lLmggXAogcG9sbC5oIHN5cy9kZXZwb2xsLmggc3lzL2Vwb2xsLmggc3lzL3BvbGwuaCBcCiBzeXMvYXVkaW9pby5oIHN5cy94YXR0ci5oIHN5cy9ic2R0dHkuaCBzeXMvZXZlbnQuaCBzeXMvZmlsZS5oIHN5cy9pb2N0bC5oIFwKQEAgLTc3MTksNyArNzYxMSw3IEBACiBzeXMvc3RhdC5oIHN5cy9zeXNjYWxsLmggc3lzL3N5c19kb21haW4uaCBzeXMvdGVybWlvLmggc3lzL3RpbWUuaCBcCiBzeXMvdGltZXMuaCBzeXMvdHlwZXMuaCBzeXMvdWlvLmggc3lzL3VuLmggc3lzL3V0c25hbWUuaCBzeXMvd2FpdC5oIHB0eS5oIFwKIGxpYnV0aWwuaCBzeXMvcmVzb3VyY2UuaCBuZXRwYWNrZXQvcGFja2V0Lmggc3lzZXhpdHMuaCBibHVldG9vdGguaCBcCi1ibHVldG9vdGgvYmx1ZXRvb3RoLmggbGludXgvdGlwYy5oIGxpbnV4L3JhbmRvbS5oIHNwYXduLmggdXRpbC5oIGFsbG9jYS5oIGVuZGlhbi5oIFwKK2xpbnV4L3RpcGMuaCBsaW51eC9yYW5kb20uaCBzcGF3bi5oIHV0aWwuaCBhbGxvY2EuaCBlbmRpYW4uaCBcCiBzeXMvZW5kaWFuLmgKIGRvIDoKICAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYApAQCAtNzk0Miw2ICs3ODM0LDI0IEBACiBmaQogCiAKKyMgYmx1ZXRvb3RoL2JsdWV0b290aC5oIGhhcyBiZWVuIGtub3duIHRvIG5vdCBjb21waWxlIHdpdGggLXN0ZD1jOTkuCisjIGh0dHA6Ly9wZXJtYWxpbmsuZ21hbmUub3JnL2dtYW5lLmxpbnV4LmJsdWV6Lmtlcm5lbC8yMjI5NAorU0FWRV9DRkxBR1M9JENGTEFHUworQ0ZMQUdTPSItc3RkPWM5OSAkQ0ZMQUdTIgorZm9yIGFjX2hlYWRlciBpbiBibHVldG9vdGgvYmx1ZXRvb3RoLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImJsdWV0b290aC9ibHVldG9vdGguaCIgImFjX2N2X2hlYWRlcl9ibHVldG9vdGhfYmx1ZXRvb3RoX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2JsdWV0b290aF9ibHVldG9vdGhfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0JMVUVUT09USF9CTFVFVE9PVEhfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitDRkxBR1M9JFNBVkVfQ0ZMQUdTCisKICMgT24gRGFyd2luIChPUyBYKSBuZXQvaWYuaCByZXF1aXJlcyBzeXMvc29ja2V0LmggdG8gYmUgaW1wb3J0ZWQgZmlyc3QuCiBmb3IgYWNfaGVhZGVyIGluIG5ldC9pZi5oCiBkbyA6CkBAIC04MTQ3LDYgKzgwNTcsMTEgQEAKICAgdXNlX2xmcz1ubwogZmkKIAorIyBEb24ndCB1c2UgbGFyZ2VmaWxlIHN1cHBvcnQgZm9yIEdOVS9IdXJkCitjYXNlICRhY19zeXNfc3lzdGVtIGluIEdOVSopCisgIHVzZV9sZnM9bm8KK2VzYWMKKwogaWYgdGVzdCAiJHVzZV9sZnMiID0gInllcyI7IHRoZW4KICMgVHdvIGRlZmluZXMgbmVlZGVkIHRvIGVuYWJsZSBsYXJnZWZpbGUgc3VwcG9ydCBvbiB2YXJpb3VzIHBsYXRmb3JtcwogIyBUaGVzZSBtYXkgYWZmZWN0IHNvbWUgdHlwZWRlZnMKQEAgLTgyNTMsOTUgKzgxNjgsNiBAQAogZmkKIAogCi0jIFRoZXJlIGFyZSB0d28gc2VwYXJhdGUgY2hlY2tzIGZvciBlYWNoIG9mIHRoZSBleGFjdC13aWR0aCBpbnRlZ2VyIHR5cGVzIHdlCi0jIG5lZWQuICBGaXJzdCB3ZSBjaGVjayB3aGV0aGVyIHRoZSB0eXBlIGlzIGF2YWlsYWJsZSB1c2luZyB0aGUgdXN1YWwKLSMgQUNfQ0hFQ0tfVFlQRSBtYWNybyB3aXRoIHRoZSBkZWZhdWx0IGluY2x1ZGVzICh3aGljaCBpbmNsdWRlcyA8aW50dHlwZXMuaD4KLSMgYW5kIDxzdGRpbnQuaD4gd2hlcmUgYXZhaWxhYmxlKS4gIFdlIHRoZW4gYWxzbyB1c2UgdGhlIHNwZWNpYWwgdHlwZSBjaGVja3Mgb2YKLSMgdGhlIGZvcm0gQUNfVFlQRV9VSU5UMzJfVCwgd2hpY2ggaW4gdGhlIGNhc2UgdGhhdCB1aW50MzJfdCBpcyBub3QgYXZhaWxhYmxlCi0jIGRpcmVjdGx5LCAjZGVmaW5lJ3MgdWludDMyX3QgdG8gYmUgYSBzdWl0YWJsZSB0eXBlLgotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJ1aW50MzJfdCIgImFjX2N2X3R5cGVfdWludDMyX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VSU5UMzJfVCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotYWNfZm5fY19maW5kX3VpbnRYX3QgIiRMSU5FTk8iICIzMiIgImFjX2N2X2NfdWludDMyX3QiCi1jYXNlICRhY19jdl9jX3VpbnQzMl90IGluICMoCi0gIG5vfHllcykgOzsgIygKLSAgKikKLQotJGFzX2VjaG8gIiNkZWZpbmUgX1VJTlQzMl9UIDEiID4+Y29uZmRlZnMuaAotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgdWludDMyX3QgJGFjX2N2X2NfdWludDMyX3QKLV9BQ0VPRgotOzsKLSAgZXNhYwotCi0KLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1VJTlQ2NF9UIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi1hY19mbl9jX2ZpbmRfdWludFhfdCAiJExJTkVOTyIgIjY0IiAiYWNfY3ZfY191aW50NjRfdCIKLWNhc2UgJGFjX2N2X2NfdWludDY0X3QgaW4gIygKLSAgbm98eWVzKSA7OyAjKAotICAqKQotCi0kYXNfZWNobyAiI2RlZmluZSBfVUlOVDY0X1QgMSIgPj5jb25mZGVmcy5oCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSB1aW50NjRfdCAkYWNfY3ZfY191aW50NjRfdAotX0FDRU9GCi07OwotICBlc2FjCi0KLQotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiaW50MzJfdCIgImFjX2N2X3R5cGVfaW50MzJfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl90eXBlX2ludDMyX3QiID0geHllczsgdGhlbiA6Ci0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfSU5UMzJfVCAxIiA+PmNvbmZkZWZzLmgKLQotZmkKLQotYWNfZm5fY19maW5kX2ludFhfdCAiJExJTkVOTyIgIjMyIiAiYWNfY3ZfY19pbnQzMl90IgotY2FzZSAkYWNfY3ZfY19pbnQzMl90IGluICMoCi0gIG5vfHllcykgOzsgIygKLSAgKikKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBpbnQzMl90ICRhY19jdl9jX2ludDMyX3QKLV9BQ0VPRgotOzsKLWVzYWMKLQotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbnQ2NF90IiAiYWNfY3ZfdHlwZV9pbnQ2NF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50NjRfdCIgPSB4eWVzOyB0aGVuIDoKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9JTlQ2NF9UIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi1hY19mbl9jX2ZpbmRfaW50WF90ICIkTElORU5PIiAiNjQiICJhY19jdl9jX2ludDY0X3QiCi1jYXNlICRhY19jdl9jX2ludDY0X3QgaW4gIygKLSAgbm98eWVzKSA7OyAjKAotICAqKQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGludDY0X3QgJGFjX2N2X2NfaW50NjRfdAotX0FDRU9GCi07OwotZXNhYwotCi0KIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInNzaXplX3QiICJhY19jdl90eXBlX3NzaXplX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKIGlmIHRlc3QgIngkYWNfY3ZfdHlwZV9zc2l6ZV90IiA9IHh5ZXM7IHRoZW4gOgogCkBAIC04NDI5LDYgKzgyNTUsMzkgQEAKICMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKICMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgogIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGxvbmcgbG9uZykpIiAiYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfbG9uZyIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfbG9uZ19sb25nIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9MT05HX0xPTkcgJGFjX2N2X3NpemVvZl9sb25nX2xvbmcKK19BQ0VPRgorCisKKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2Ygdm9pZCAqIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygdm9pZCAqLi4uICIgPiY2OyB9CiBpZiAke2FjX2N2X3NpemVvZl92b2lkX3ArOn0gZmFsc2U7IHRoZW4gOgpAQCAtODY1Niw2NyArODUxNSwzOSBAQAogX0FDRU9GCiAKIAotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgbG9uZyBsb25nIHN1cHBvcnQuLi4gIiA+JjY7IH0KLWhhdmVfbG9uZ19sb25nPW5vCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotbG9uZyBsb25nIHg7IHggPSAobG9uZyBsb25nKTA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLQotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0xPTkdfTE9ORyAxIiA+PmNvbmZkZWZzLmgKLQotICBoYXZlX2xvbmdfbG9uZz15ZXMKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXZlX2xvbmdfbG9uZyIgPiY1Ci0kYXNfZWNobyAiJGhhdmVfbG9uZ19sb25nIiA+JjY7IH0KLWlmIHRlc3QgIiRoYXZlX2xvbmdfbG9uZyIgPSB5ZXMgOyB0aGVuCiAjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgogIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwogIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCiAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZy4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfbG9uZ19sb25nKzp9IGZhbHNlOyB0aGVuIDoKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiB1aW50cHRyX3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiB1aW50cHRyX3QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdCs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGxvbmcgbG9uZykpIiAiYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mICh1aW50cHRyX3QpKSIgImFjX2N2X3NpemVvZl91aW50cHRyX3QiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKIAogZWxzZQotICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9sb25nX2xvbmciID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX3VpbnRwdHJfdCIgPSB5ZXM7IHRoZW4KICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcpCithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1aW50cHRyX3QpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQogICAgZWxzZQotICAgICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPTAKKyAgICAgYWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdD0wCiAgICBmaQogZmkKIAogZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3NpemVvZl9sb25nX2xvbmciID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfdWludHB0cl90IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdCIgPiY2OyB9CiAKIAogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFNJWkVPRl9MT05HX0xPTkcgJGFjX2N2X3NpemVvZl9sb25nX2xvbmcKKyNkZWZpbmUgU0laRU9GX1VJTlRQVFJfVCAkYWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdAogX0FDRU9GCiAKIAotZmkKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydC4uLiAiID4mNjsgfQpAQCAtODc3OSwzMyArODYxMCw2IEBACiAKIGZpCiAKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgX0Jvb2wgc3VwcG9ydCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgX0Jvb2wgc3VwcG9ydC4uLiAiID4mNjsgfQotaGF2ZV9jOTlfYm9vbD1ubwotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLV9Cb29sIHg7IHggPSAoX0Jvb2wpMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfQzk5X0JPT0wgMSIgPj5jb25mZGVmcy5oCi0KLSAgaGF2ZV9jOTlfYm9vbD15ZXMKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXZlX2M5OV9ib29sIiA+JjUKLSRhc19lY2hvICIkaGF2ZV9jOTlfYm9vbCIgPiY2OyB9Ci1pZiB0ZXN0ICIkaGF2ZV9jOTlfYm9vbCIgPSB5ZXMgOyB0aGVuCiAjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgogIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwogIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCkBAIC04ODM5LDU2ICs4NjQzLDYgQEAKIF9BQ0VPRgogCiAKLWZpCi0KLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnRwdHJfdCIgImFjX2N2X3R5cGVfdWludHB0cl90IiAiI2lmZGVmIEhBVkVfU1RESU5UX0gKLSAgICAgICAgI2luY2x1ZGUgPHN0ZGludC5oPgotICAgICAgICAjZW5kaWYKLSAgICAgICAgI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAotICAgICAgICAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLSAgICAgICAgI2VuZGlmCi0iCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdWludHB0cl90IiA9IHh5ZXM7IHRoZW4gOgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfVUlOVFBUUl9UIDEKLV9BQ0VPRgotCi0jIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgotIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwotIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCi0jIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHVpbnRwdHJfdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIHVpbnRwdHJfdC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9zaXplb2ZfdWludHB0cl90Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAodWludHB0cl90KSkiICJhY19jdl9zaXplb2ZfdWludHB0cl90IiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6Ci0KLWVsc2UKLSAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfdWludHB0cl90IiA9IHllczsgdGhlbgotICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHVpbnRwdHJfdCkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9Ci0gICBlbHNlCi0gICAgIGFjX2N2X3NpemVvZl91aW50cHRyX3Q9MAotICAgZmkKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl91aW50cHRyX3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zaXplb2ZfdWludHB0cl90IiA+JjY7IH0KLQotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgU0laRU9GX1VJTlRQVFJfVCAkYWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdAotX0FDRU9GCi0KLQotZmkKLQogCiAjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgogIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwpAQCAtODkzMSw4ICs4Njg1LDYgQEAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBsYXJnZSBmaWxlIHN1cHBvcnQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbGFyZ2UgZmlsZSBzdXBwb3J0Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIkaGF2ZV9sb25nX2xvbmciID0geWVzCi10aGVuCiBpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX29mZl90IiAtZ3QgIiRhY19jdl9zaXplb2ZfbG9uZyIgLWEgXAogCSIkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgLWdlICIkYWNfY3Zfc2l6ZW9mX29mZl90IjsgdGhlbgogCkBAIC04OTQ0LDEwICs4Njk2LDYgQEAKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9CiBmaQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCiAKICMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCiAjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCkBAIC0xMDIxMiwzMiArOTk2MCw2IEBACiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHdpdGhfZGJtbGlib3JkZXIiID4mNQogJGFzX2VjaG8gIiR3aXRoX2RibWxpYm9yZGVyIiA+JjY7IH0KIAotIyBEZXRlcm1pbmUgaWYgc2lnbmFsbW9kdWxlIHNob3VsZCBiZSB1c2VkLgotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIC0td2l0aC1zaWduYWwtbW9kdWxlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAtLXdpdGgtc2lnbmFsLW1vZHVsZS4uLiAiID4mNjsgfQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXNpZ25hbC1tb2R1bGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX3NpZ25hbF9tb2R1bGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3NpZ25hbF9tb2R1bGU7Ci1maQotCi0KLWlmIHRlc3QgLXogIiR3aXRoX3NpZ25hbF9tb2R1bGUiCi10aGVuIHdpdGhfc2lnbmFsX21vZHVsZT0ieWVzIgotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkd2l0aF9zaWduYWxfbW9kdWxlIiA+JjUKLSRhc19lY2hvICIkd2l0aF9zaWduYWxfbW9kdWxlIiA+JjY7IH0KLQotaWYgdGVzdCAiJHt3aXRoX3NpZ25hbF9tb2R1bGV9IiA9ICJ5ZXMiOyB0aGVuCi0JVVNFX1NJR05BTF9NT0RVTEU9IiIKLQlTSUdOQUxfT0JKUz0iIgotZWxzZQotCVVTRV9TSUdOQUxfTU9EVUxFPSIjIgotCVNJR05BTF9PQkpTPSJQYXJzZXIvaW50cmNoZWNrLm8gUHl0aG9uL3NpZ2NoZWNrLm8iCi1maQotCiAjIFRoaXMgaXMgdXNlZCB0byBnZW5lcmF0ZSBTZXR1cC5jb25maWcKIAogVVNFX1RIUkVBRF9NT0RVTEU9IiIKQEAgLTExMDU0LDM3ICsxMDc3Niw2IEBACiBmaQogcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIE9TWCAxMC41IFNESyBvciBsYXRlciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgT1NYIDEwLjUgU0RLIG9yIGxhdGVyLi4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSAgI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KLWludAotbWFpbiAoKQotewotRlNJT1JlZk51bSBmUmVmID0gMAotICA7Ci0gIHJldHVybiAwOwotfQotCi1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLQotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX09TWDEwNV9TREsgMSIgPj5jb25mZGVmcy5oCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQotZWxzZQotCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KICMgQ2hlY2sgZm9yIC0td2l0aC1kb2Mtc3RyaW5ncwogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLS13aXRoLWRvYy1zdHJpbmdzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAtLXdpdGgtZG9jLXN0cmluZ3MuLi4gIiA+JjY7IH0KQEAgLTEzMDI5LDYgKzEyNzIwLDMzIEBACiAKIGZpCiAKK2FjX2ZuX2NfY2hlY2tfbWVtYmVyICIkTElORU5PIiAic3RydWN0IHBhc3N3ZCIgInB3X2dlY29zIiAiYWNfY3ZfbWVtYmVyX3N0cnVjdF9wYXNzd2RfcHdfZ2Vjb3MiICIKKyAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAjaW5jbHVkZSA8cHdkLmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfbWVtYmVyX3N0cnVjdF9wYXNzd2RfcHdfZ2Vjb3MiID0geHllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVFJVQ1RfUEFTU1dEX1BXX0dFQ09TIDEKK19BQ0VPRgorCisKK2ZpCithY19mbl9jX2NoZWNrX21lbWJlciAiJExJTkVOTyIgInN0cnVjdCBwYXNzd2QiICJwd19wYXNzd2QiICJhY19jdl9tZW1iZXJfc3RydWN0X3Bhc3N3ZF9wd19wYXNzd2QiICIKKyAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAjaW5jbHVkZSA8cHdkLmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfbWVtYmVyX3N0cnVjdF9wYXNzd2RfcHdfcGFzc3dkIiA9IHh5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RSVUNUX1BBU1NXRF9QV19QQVNTV0QgMQorX0FDRU9GCisKKworZmkKKwogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB0aW1lLmggdGhhdCBkZWZpbmVzIGFsdHpvbmUiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHRpbWUuaCB0aGF0IGRlZmluZXMgYWx0em9uZS4uLiAiID4mNjsgfQpAQCAtMTMxNjAsNiArMTI4NzgsNDEgQEAKIAogZmkKIAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc29ja2FkZHJfYWxnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzb2NrYWRkcl9hbGcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc3RydWN0X3NvY2thZGRyX2FsZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjCQlpbmNsdWRlIDxsaW51eC9pZl9hbGcuaD4KK2ludAorbWFpbiAoKQoreworc3RydWN0IHNvY2thZGRyX2FsZyBzCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3RydWN0X3NvY2thZGRyX2FsZz15ZXMKK2Vsc2UKKyAgYWNfY3Zfc3RydWN0X3NvY2thZGRyX2FsZz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zdHJ1Y3Rfc29ja2FkZHJfYWxnIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc3RydWN0X3NvY2thZGRyX2FsZyIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9zdHJ1Y3Rfc29ja2FkZHJfYWxnID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfU09DS0FERFJfQUxHIDEiID4+Y29uZmRlZnMuaAorCitmaQorCiAjIGNoZWNrcyBmb3IgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzCiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBjaGFyIGlzIHVuc2lnbmVkIiA+JjUKQEAgLTE0MzM5LDYgKzE0MDkyLDg1IEBACiAKIGZpCiAKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIlJUTERfTEFaWSIgImFjX2N2X2hhdmVfZGVjbF9SVExEX0xBWlkiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTEFaWSIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1JUTERfTEFaWSAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIlJUTERfTk9XIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTk9XIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX05PVyIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1JUTERfTk9XICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9HTE9CQUwiICJhY19jdl9oYXZlX2RlY2xfUlRMRF9HTE9CQUwiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfR0xPQkFMIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9HTE9CQUwgJGFjX2hhdmVfZGVjbAorX0FDRU9GCithY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJSVExEX0xPQ0FMIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTE9DQUwiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTE9DQUwiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9SVExEX0xPQ0FMICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9OT0RFTEVURSIgImFjX2N2X2hhdmVfZGVjbF9SVExEX05PREVMRVRFIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX05PREVMRVRFIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9OT0RFTEVURSAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIlJUTERfTk9MT0FEIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTk9MT0FEIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX05PTE9BRCIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1JUTERfTk9MT0FEICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9ERUVQQklORCIgImFjX2N2X2hhdmVfZGVjbF9SVExEX0RFRVBCSU5EIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX0RFRVBCSU5EIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9ERUVQQklORCAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKKworCiAjIGRldGVybWluZSB3aGF0IHNpemUgZGlnaXQgdG8gdXNlIGZvciBQeXRob24ncyBsb25ncwogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkaWdpdCBzaXplIGZvciBQeXRob24ncyBsb25ncyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBkaWdpdCBzaXplIGZvciBQeXRob24ncyBsb25ncy4uLiAiID4mNjsgfQpAQCAtMTQ3NzIsNyArMTQ2MDQsMTEgQEAKICRhc19lY2hvICIkTERWRVJTSU9OIiA+JjY7IH0KIAogCi1MSUJQTD0nJChwcmVmaXgpJyIvbGliL3B5dGhvbiR7VkVSU0lPTn0vY29uZmlnLSR7TERWRVJTSU9OfSIKK2lmIHRlc3QgeCRQTEFURk9STV9UUklQTEVUID0geDsgdGhlbgorICBMSUJQTD0nJChwcmVmaXgpJyIvbGliL3B5dGhvbiR7VkVSU0lPTn0vY29uZmlnLSR7TERWRVJTSU9OfSIKK2Vsc2UKKyAgTElCUEw9JyQocHJlZml4KSciL2xpYi9weXRob24ke1ZFUlNJT059L2NvbmZpZy0ke0xEVkVSU0lPTn0tJHtQTEFURk9STV9UUklQTEVUfSIKK2ZpCiAKIAogIyBDaGVjayB3aGV0aGVyIHJpZ2h0IHNoaWZ0aW5nIGEgbmVnYXRpdmUgaW50ZWdlciBleHRlbmRzIHRoZSBzaWduIGJpdApAQCAtMTU4NDUsMTAyICsxNTY4MSw2IEBACiAKIGZpCiAKLWlmIHRlc3QgIiRoYXZlX2xvbmdfbG9uZyIgPSB5ZXMKLXRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJWxsZCBhbmQgJWxsdSBwcmludGYoKSBmb3JtYXQgc3VwcG9ydCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJWxsZCBhbmQgJWxsdSBwcmludGYoKSBmb3JtYXQgc3VwcG9ydC4uLiAiID4mNjsgfQotICBpZiAke2FjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdCs6fSBmYWxzZTsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0PSJjcm9zcyAtLSBhc3N1bWluZyBubyIKLSAgIGlmIHRlc3QgeCRHQ0MgPSB4eWVzOyB0aGVuCi0gICAgc2F2ZV9DRkxBR1M9JENGTEFHUwotICAgIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIC1XZm9ybWF0IgotICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotICAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KLSAgICAgICAgI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi1pbnQKLW1haW4gKCkKLXsKLQotICAgICAgY2hhciAqYnVmZmVyOwotICAgICAgc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZykxMjMpOwotICAgICAgc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZyktMTIzKTsKLSAgICAgIHNwcmludGYoYnVmZmVyLCAiJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpMTIzKTsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdD15ZXMKLQotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgIENGTEFHUz0kc2F2ZV9DRkxBR1MKLSAgIGZpCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotICAjaW5jbHVkZSA8c3RkaW8uaD4KLSAgI2luY2x1ZGUgPHN0ZGRlZi5oPgotICAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSAgI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICAjZW5kaWYKLQotICBpbnQgbWFpbigpCi0gIHsKLSAgICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0KLSAgICAgIGlmIChzcHJpbnRmKGJ1ZmZlciwgIiVsbGQiLCAobG9uZyBsb25nKTEyMykgPCAwKQotICAgICAgICAgIHJldHVybiAxOwotICAgICAgaWYgKHN0cmNtcChidWZmZXIsICIxMjMiKSkKLSAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgaWYgKHNwcmludGYoYnVmZmVyLCAiJWxsZCIsIChsb25nIGxvbmcpLTEyMykgPCAwKQotICAgICAgICAgIHJldHVybiAxOwotICAgICAgaWYgKHN0cmNtcChidWZmZXIsICItMTIzIikpCi0gICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgIGlmIChzcHJpbnRmKGJ1ZmZlciwgIiVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKTEyMykgPCAwKQotICAgICAgICAgIHJldHVybiAxOwotICAgICAgaWYgKHN0cmNtcChidWZmZXIsICIxMjMiKSkKLSAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0PXllcwotZWxzZQotICBhY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQ9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLWZpCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQiID4mNjsgfQotZmkKLQotaWYgdGVzdCAiJGFjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdCIgPSB5ZXMKLXRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgUFlfRk9STUFUX0xPTkdfTE9ORyBcImxsXCIiID4+Y29uZmRlZnMuaAotCi1maQotCiBpZiB0ZXN0ICRhY19zeXNfc3lzdGVtID0gRGFyd2luCiB0aGVuCiAJTElCUz0iJExJQlMgLWZyYW1ld29yayBDb3JlRm91bmRhdGlvbiIKQEAgLTE3MDE0LDcgKzE2NzU0LDcgQEAKICMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgogIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KIGFjX2xvZz0iCi1UaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy41LCB3aGljaCB3YXMKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgcHl0aG9uICRhc19tZSAzLjYsIHdoaWNoIHdhcwogZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCiAKICAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUwpAQCAtMTcwNzYsNyArMTY4MTYsNyBAQAogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCiBhY19jc19jb25maWc9ImAkYXNfZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgIgogYWNfY3NfdmVyc2lvbj0iXFwKLXB5dGhvbiBjb25maWcuc3RhdHVzIDMuNQorcHl0aG9uIGNvbmZpZy5zdGF0dXMgMy42CiBjb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjksCiAgIHdpdGggb3B0aW9ucyBcXCJcJGFjX2NzX2NvbmZpZ1xcIgogCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggMzY3NThkNC4uOTQ2OTNlYSAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMyw3ICszLDcgQEAKIGRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAjIFNldCBWRVJTSU9OIHNvIHdlIG9ubHkgbmVlZCB0byBlZGl0IGluIG9uZSBwbGFjZSAoaS5lLiwgaGVyZSkKLW00X2RlZmluZShQWVRIT05fVkVSU0lPTiwgMy41KQorbTRfZGVmaW5lKFBZVEhPTl9WRVJTSU9OLCAzLjYpCiAKIEFDX1BSRVJFUSgyLjY1KQogCkBAIC02OSw3ICs2OSw3IEBACiAgICAgaWYgdGVzdCAteiAiJFBZVEhPTl9GT1JfQlVJTEQiOyB0aGVuCiAgICAgICAgIGZvciBpbnRlcnAgaW4gcHl0aG9uJFBBQ0tBR0VfVkVSU0lPTiBweXRob24zIHB5dGhvbjsgZG8KIAkgICAgd2hpY2ggJGludGVycCA+L2Rldi9udWxsIDI+JjEgfHwgY29udGludWUKLQkgICAgaWYgJGludGVycCAtYyAnaW1wb3J0IHN5cztzeXMuZXhpdChub3Qgc3lzLnZlcnNpb25faW5mb0A8OkA6MkA6PkAgPj0gKDMsMykpJzsgdGhlbgorCSAgICBpZiAkaW50ZXJwIC1jICJpbXBvcnQgc3lzO3N5cy5leGl0KG5vdCAnLicuam9pbihzdHIobikgZm9yIG4gaW4gc3lzLnZlcnNpb25faW5mb0A8OkA6MkA6PkApID09ICckUEFDS0FHRV9WRVJTSU9OJykiOyB0aGVuCiAJICAgICAgICBicmVhawogCSAgICBmaQogICAgICAgICAgICAgaW50ZXJwPQpAQCAtNzY4LDcgKzc2OCwzMSBAQAogI3VuZGVmIHBvd2VycGMKICN1bmRlZiBzcGFyYwogI3VuZGVmIHVuaXgKLSNpZiBkZWZpbmVkKF9fbGludXhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQorIyBpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmIGRlZmluZWQoX19MUDY0X18pCisgICAgICAgIHg4Nl82NC1saW51eC1hbmRyb2lkCisjIGVsaWYgZGVmaW5lZChfX2kzODZfXykKKyAgICAgICAgaTY4Ni1saW51eC1hbmRyb2lkCisjIGVsaWYgZGVmaW5lZChfX2FhcmNoNjRfXykgJiYgZGVmaW5lZChfX0FBUkNINjRFTF9fKQorIyAgaWYgZGVmaW5lZChfX0lMUDMyX18pCisgICAgICAgIGFhcmNoNjRfaWxwMzItbGludXgtYW5kcm9pZAorIyAgZWxzZQorICAgICAgICBhYXJjaDY0LWxpbnV4LWFuZHJvaWQKKyMgIGVuZGlmCisjIGVsaWYgZGVmaW5lZChfX0FSTV9FQUJJX18pICYmIGRlZmluZWQoX19BUk1FTF9fKQorICAgICAgICBhcm0tbGludXgtYW5kcm9pZGVhYmkKKyMgZWxpZiBkZWZpbmVkKF9fbWlwc19oYXJkX2Zsb2F0KSAmJiBkZWZpbmVkKF9NSVBTRUwpCisjICBpZiBfTUlQU19TSU0gPT0gX0FCSU8zMgorICAgICAgICBtaXBzZWwtbGludXgtYW5kcm9pZAorIyAgZWxpZiBfTUlQU19TSU0gPT0gX0FCSTY0CisgICAgICAgIG1pcHM2NGVsLWxpbnV4LWFuZHJvaWQKKyMgIGVsc2UKKyMgICBlcnJvciB1bmtub3duIHBsYXRmb3JtIHRyaXBsZXQKKyMgIGVuZGlmCisjIGVsc2UKKyMgICBlcnJvciB1bmtub3duIHBsYXRmb3JtIHRyaXBsZXQKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19saW51eF9fKQogIyBpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmIGRlZmluZWQoX19MUDY0X18pCiAgICAgICAgIHg4Nl82NC1saW51eC1nbnUKICMgZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmIGRlZmluZWQoX19JTFAzMl9fKQpAQCAtODgyLDExICs5MDYsMjAgQEAKICAgaWYgdGVzdCB4JFBMQVRGT1JNX1RSSVBMRVQgIT0geCRNVUxUSUFSQ0g7IHRoZW4KICAgICBBQ19NU0dfRVJST1IoW2ludGVybmFsIGNvbmZpZ3VyZSBlcnJvciBmb3IgdGhlIHBsYXRmb3JtIHRyaXBsZXQsIHBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydF0pCiAgIGZpCitlbGlmIHRlc3QgeCRQTEFURk9STV9UUklQTEVUICE9IHggJiYgdGVzdCB4JE1VTFRJQVJDSCA9IHg7IHRoZW4KKyAgTVVMVElBUkNIPSRQTEFURk9STV9UUklQTEVUCiBmaQotUExBVERJUj1wbGF0LSRNQUNIREVQCitpZiB0ZXN0IHgkUExBVEZPUk1fVFJJUExFVCA9IHg7IHRoZW4KKyAgUExBVERJUj1wbGF0LSRNQUNIREVQCitlbHNlCisgIFBMQVRESVI9cGxhdC0kUExBVEZPUk1fVFJJUExFVAorZmkKIEFDX1NVQlNUKFBMQVRESVIpCiBBQ19TVUJTVChQTEFURk9STV9UUklQTEVUKQotCitpZiB0ZXN0IHgkTVVMVElBUkNIICE9IHg7IHRoZW4KKyAgTVVMVElBUkNIX0NQUEZMQUdTPSItRE1VTFRJQVJDSD1cXFwiJE1VTFRJQVJDSFxcXCIiCitmaQorQUNfU1VCU1QoTVVMVElBUkNIX0NQUEZMQUdTKQogCiBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAtV2wsLS1uby1hcy1uZWVkZWRdKQogc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKQEAgLTkwMyw2ICs5MzYsMjUgQEAKICMgY2hlY2tzIGZvciBVTklYIHZhcmlhbnRzIHRoYXQgc2V0IEMgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcwogQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TCiAKK0FDX01TR19DSEVDS0lORyhbZm9yIHRoZSBBbmRyb2lkIEFQSSBsZXZlbF0pCitjYXQgPj4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC9hcGktbGV2ZWwuaD4KK19fQU5EUk9JRF9BUElfXworI2Vsc2UKKyNlcnJvciBub3QgQW5kcm9pZAorI2VuZGlmCitFT0YKKworaWYgJENQUCAkQ1BQRkxBR1MgY29uZnRlc3QuYyA+Y29uZnRlc3Qub3V0IDI+L2Rldi9udWxsOyB0aGVuCisgIEFORFJPSURfQVBJX0xFVkVMPWBncmVwIC12ICdeIycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAnXiAqJCdgCisgIEFDX01TR19SRVNVTFQoWyRBTkRST0lEX0FQSV9MRVZFTF0pCisgIEFDX0RFRklORV9VTlFVT1RFRChBTkRST0lEX0FQSV9MRVZFTCwgJEFORFJPSURfQVBJX0xFVkVMLCBbVGhlIEFuZHJvaWQgQVBJIGxldmVsLl0pCitlbHNlCisgIEFDX01TR19SRVNVTFQoW25vdCBBbmRyb2lkXSkKK2ZpCitybSAtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0Lm91dAorCiAjIENoZWNrIGZvciB1bnN1cHBvcnRlZCBzeXN0ZW1zCiBjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgogYXRoZW9zKnxMaW51eCovMSopCkBAIC0xMjc3LDEzICsxMzI5LDIwIEBACiBpZiB0ZXN0ICIkUHlfTFRPIiA9ICd0cnVlJyA7IHRoZW4KICAgY2FzZSAkQ0MgaW4KICAgICAqY2xhbmcqKQotICAgICAgIyBBbnkgY2hhbmdlcyBtYWRlIGhlcmUgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUgR0NDK0RhcndpbiBjYXNlIGJlbG93Ci0gICAgICBMVE9GTEFHUz0iLWZsdG8iCisgICAgICBjYXNlICRhY19zeXNfc3lzdGVtIGluCisgICAgICAgIERhcndpbiopCisgICAgICAgICAgIyBBbnkgY2hhbmdlcyBtYWRlIGhlcmUgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUgR0NDK0RhcndpbiBjYXNlIGJlbG93CisgICAgICAgICAgTFRPRkxBR1M9Ii1mbHRvIC1XbCwtZXhwb3J0X2R5bmFtaWMiCisgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICBMVE9GTEFHUz0iLWZsdG8iCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKICAgICAgIDs7CiAgICAgKmdjYyopCiAgICAgICBjYXNlICRhY19zeXNfc3lzdGVtIGluCiAgICAgICAgIERhcndpbiopCi0gICAgICAgICAgTFRPRkxBR1M9Ii1mbHRvIgorICAgICAgICAgIExUT0ZMQUdTPSItZmx0byAtV2wsLWV4cG9ydF9keW5hbWljIgogICAgICAgICAgIDs7CiAgICAgICAgICopCiAgICAgICAgICAgTFRPRkxBR1M9Ii1mbHRvIC1mdXNlLWxpbmtlci1wbHVnaW4gLWZmYXQtbHRvLW9iamVjdHMgLWZsdG8tcGFydGl0aW9uPW5vbmUiCkBAIC0xNDYxLDYgKzE1MjAsOCBAQAogIyB0d2VhayBCQVNFQ0ZMQUdTIGJhc2VkIG9uIGNvbXBpbGVyIGFuZCBwbGF0Zm9ybQogY2FzZSAkR0NDIGluCiB5ZXMpCisgICAgQ0ZMQUdTX05PRElTVD0iJENGTEFHU19OT0RJU1QgLXN0ZD1jOTkiCisKICAgICAjIFB5dGhvbiBkb2Vzbid0IHZpb2xhdGUgQzk5IGFsaWFzaW5nIHJ1bGVzLCBidXQgb2xkZXIgdmVyc2lvbnMgb2YKICAgICAjIEdDQyBwcm9kdWNlIHdhcm5pbmdzIGZvciBsZWdhbCBQeXRob24gY29kZS4gIEVuYWJsZQogICAgICMgLWZuby1zdHJpY3QtYWxpYXNpbmcgb24gdmVyc2lvbnMgb2YgR0NDIHRoYXQgc3VwcG9ydCBidXQgcHJvZHVjZQpAQCAtMTUyNywyOCArMTU4OCw2IEBACiAgICAgICBCQVNFQ0ZMQUdTPSIkQkFTRUNGTEFHUyAtV25vLXVudXNlZC1yZXN1bHQiCiAgICAgZmkKIAotICAgIEFDX01TR19DSEVDS0lORyhmb3IgLVdlcnJvcj1kZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQpCi0gICAgIGFjX3NhdmVfY2M9IiRDQyIKLSAgICAgQ0M9IiRDQyAtV2Vycm9yPWRlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCIKLSAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9kZWNsYXJhdGlvbl9hZnRlcl9zdGF0ZW1lbnRfd2FybmluZywKLSAgICAgICBBQ19DT01QSUxFX0lGRUxTRSgKLSAgICAgICAgIFsKLQkgICBBQ19MQU5HX1BST0dSQU0oW1tdXSwgW1tdXSkKLQkgXSxbCi0gICAgICAgICAgIGFjX2N2X2RlY2xhcmF0aW9uX2FmdGVyX3N0YXRlbWVudF93YXJuaW5nPXllcwotCSBdLFsKLSAgICAgICAgICAgYWNfY3ZfZGVjbGFyYXRpb25fYWZ0ZXJfc3RhdGVtZW50X3dhcm5pbmc9bm8KLQkgXSkpCi0gICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICAgICBDQz0iJGFjX3NhdmVfY2MiCi0gICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfZGVjbGFyYXRpb25fYWZ0ZXJfc3RhdGVtZW50X3dhcm5pbmcpCi0KLSAgICBpZiB0ZXN0ICRhY19jdl9kZWNsYXJhdGlvbl9hZnRlcl9zdGF0ZW1lbnRfd2FybmluZyA9IHllcwotICAgIHRoZW4KLSAgICAgIENGTEFHU19OT0RJU1Q9IiRDRkxBR1NfTk9ESVNUIC1XZXJyb3I9ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IgotICAgIGZpCi0KICAgICBBQ19NU0dfQ0hFQ0tJTkcoaWYgd2UgY2FuIHR1cm4gb24gJENDIG1peGVkIHNpZ24gY29tcGFyaXNvbiB3YXJuaW5nKQogICAgICBhY19zYXZlX2NjPSIkQ0MiCiAgICAgIENDPSIkQ0MgLVdzaWduLWNvbXBhcmUiCkBAIC0xOTQxLDcgKzE5ODAsNyBAQAogQUNfQ0hFQ0tfSEVBREVSUyhhc20vdHlwZXMuaCBjb25pby5oIGRpcmVjdC5oIGRsZmNuLmggZXJybm8uaCBcCiBmY250bC5oIGdycC5oIFwKIGllZWVmcC5oIGlvLmggbGFuZ2luZm8uaCBsaWJpbnRsLmggcHJvY2Vzcy5oIHB0aHJlYWQuaCBcCi1zY2hlZC5oIHNoYWRvdy5oIHNpZ25hbC5oIHN0ZGludC5oIHN0cm9wdHMuaCB0ZXJtaW9zLmggXAorc2NoZWQuaCBzaGFkb3cuaCBzaWduYWwuaCBzdHJvcHRzLmggdGVybWlvcy5oIFwKIHVuaXN0ZC5oIHV0aW1lLmggXAogcG9sbC5oIHN5cy9kZXZwb2xsLmggc3lzL2Vwb2xsLmggc3lzL3BvbGwuaCBcCiBzeXMvYXVkaW9pby5oIHN5cy94YXR0ci5oIHN5cy9ic2R0dHkuaCBzeXMvZXZlbnQuaCBzeXMvZmlsZS5oIHN5cy9pb2N0bC5oIFwKQEAgLTE5NTAsMTEgKzE5ODksMTggQEAKIHN5cy9zdGF0Lmggc3lzL3N5c2NhbGwuaCBzeXMvc3lzX2RvbWFpbi5oIHN5cy90ZXJtaW8uaCBzeXMvdGltZS5oIFwKIHN5cy90aW1lcy5oIHN5cy90eXBlcy5oIHN5cy91aW8uaCBzeXMvdW4uaCBzeXMvdXRzbmFtZS5oIHN5cy93YWl0LmggcHR5LmggXAogbGlidXRpbC5oIHN5cy9yZXNvdXJjZS5oIG5ldHBhY2tldC9wYWNrZXQuaCBzeXNleGl0cy5oIGJsdWV0b290aC5oIFwKLWJsdWV0b290aC9ibHVldG9vdGguaCBsaW51eC90aXBjLmggbGludXgvcmFuZG9tLmggc3Bhd24uaCB1dGlsLmggYWxsb2NhLmggZW5kaWFuLmggXAorbGludXgvdGlwYy5oIGxpbnV4L3JhbmRvbS5oIHNwYXduLmggdXRpbC5oIGFsbG9jYS5oIGVuZGlhbi5oIFwKIHN5cy9lbmRpYW4uaCkKIEFDX0hFQURFUl9ESVJFTlQKIEFDX0hFQURFUl9NQUpPUgogCisjIGJsdWV0b290aC9ibHVldG9vdGguaCBoYXMgYmVlbiBrbm93biB0byBub3QgY29tcGlsZSB3aXRoIC1zdGQ9Yzk5LgorIyBodHRwOi8vcGVybWFsaW5rLmdtYW5lLm9yZy9nbWFuZS5saW51eC5ibHVlei5rZXJuZWwvMjIyOTQKK1NBVkVfQ0ZMQUdTPSRDRkxBR1MKK0NGTEFHUz0iLXN0ZD1jOTkgJENGTEFHUyIKK0FDX0NIRUNLX0hFQURFUlMoYmx1ZXRvb3RoL2JsdWV0b290aC5oKQorQ0ZMQUdTPSRTQVZFX0NGTEFHUworCiAjIE9uIERhcndpbiAoT1MgWCkgbmV0L2lmLmggcmVxdWlyZXMgc3lzL3NvY2tldC5oIHRvIGJlIGltcG9ydGVkIGZpcnN0LgogQUNfQ0hFQ0tfSEVBREVSUyhbbmV0L2lmLmhdLCBbXSwgW10sCiBbI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0yMDQ4LDYgKzIwOTQsMTEgQEAKICAgdXNlX2xmcz1ubwogZmkKIAorIyBEb24ndCB1c2UgbGFyZ2VmaWxlIHN1cHBvcnQgZm9yIEdOVS9IdXJkCitjYXNlICRhY19zeXNfc3lzdGVtIGluIEdOVSopCisgIHVzZV9sZnM9bm8KK2VzYWMKKwogaWYgdGVzdCAiJHVzZV9sZnMiID0gInllcyI7IHRoZW4KICMgVHdvIGRlZmluZXMgbmVlZGVkIHRvIGVuYWJsZSBsYXJnZWZpbGUgc3VwcG9ydCBvbiB2YXJpb3VzIHBsYXRmb3JtcwogIyBUaGVzZSBtYXkgYWZmZWN0IHNvbWUgdHlwZWRlZnMKQEAgLTIwNzgsMjkgKzIxMjksNiBAQAogQUNfVFlQRV9TSVpFX1QKIEFDX1RZUEVfVUlEX1QKIAotIyBUaGVyZSBhcmUgdHdvIHNlcGFyYXRlIGNoZWNrcyBmb3IgZWFjaCBvZiB0aGUgZXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcyB3ZQotIyBuZWVkLiAgRmlyc3Qgd2UgY2hlY2sgd2hldGhlciB0aGUgdHlwZSBpcyBhdmFpbGFibGUgdXNpbmcgdGhlIHVzdWFsCi0jIEFDX0NIRUNLX1RZUEUgbWFjcm8gd2l0aCB0aGUgZGVmYXVsdCBpbmNsdWRlcyAod2hpY2ggaW5jbHVkZXMgPGludHR5cGVzLmg+Ci0jIGFuZCA8c3RkaW50Lmg+IHdoZXJlIGF2YWlsYWJsZSkuICBXZSB0aGVuIGFsc28gdXNlIHRoZSBzcGVjaWFsIHR5cGUgY2hlY2tzIG9mCi0jIHRoZSBmb3JtIEFDX1RZUEVfVUlOVDMyX1QsIHdoaWNoIGluIHRoZSBjYXNlIHRoYXQgdWludDMyX3QgaXMgbm90IGF2YWlsYWJsZQotIyBkaXJlY3RseSwgI2RlZmluZSdzIHVpbnQzMl90IHRvIGJlIGEgc3VpdGFibGUgdHlwZS4KLQotQUNfQ0hFQ0tfVFlQRSh1aW50MzJfdCwKLSAgQUNfREVGSU5FKEhBVkVfVUlOVDMyX1QsIDEsIFtEZWZpbmUgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyB1aW50MzJfdC5dKSwsKQotQUNfVFlQRV9VSU5UMzJfVAotCi1BQ19DSEVDS19UWVBFKHVpbnQ2NF90LAotICBBQ19ERUZJTkUoSEFWRV9VSU5UNjRfVCwgMSwgW0RlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIHVpbnQ2NF90Ll0pLCwpCi1BQ19UWVBFX1VJTlQ2NF9UCi0KLUFDX0NIRUNLX1RZUEUoaW50MzJfdCwKLSAgQUNfREVGSU5FKEhBVkVfSU5UMzJfVCwgMSwgW0RlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIGludDMyX3QuXSksLCkKLUFDX1RZUEVfSU5UMzJfVAotCi1BQ19DSEVDS19UWVBFKGludDY0X3QsCi0gIEFDX0RFRklORShIQVZFX0lOVDY0X1QsIDEsIFtEZWZpbmUgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyBpbnQ2NF90Ll0pLCwpCi1BQ19UWVBFX0lOVDY0X1QKLQogQUNfQ0hFQ0tfVFlQRShzc2l6ZV90LAogICBBQ19ERUZJTkUoSEFWRV9TU0laRV9ULCAxLCBbRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgc3NpemVfdF0pLCwpCiBBQ19DSEVDS19UWVBFKF9fdWludDEyOF90LApAQCAtMjExMCw2ICsyMTM4LDcgQEAKICMgQU5TSSBDIHJlcXVpcmVzIHNpemVvZihjaGFyKSA9PSAxLCBzbyBubyBuZWVkIHRvIGNoZWNrIGl0CiBBQ19DSEVDS19TSVpFT0YoaW50LCA0KQogQUNfQ0hFQ0tfU0laRU9GKGxvbmcsIDQpCitBQ19DSEVDS19TSVpFT0YobG9uZyBsb25nLCA4KQogQUNfQ0hFQ0tfU0laRU9GKHZvaWQgKiwgNCkKIEFDX0NIRUNLX1NJWkVPRihzaG9ydCwgMikKIEFDX0NIRUNLX1NJWkVPRihmbG9hdCwgNCkKQEAgLTIxMTcsMTcgKzIxNDYsNyBAQAogQUNfQ0hFQ0tfU0laRU9GKGZwb3NfdCwgNCkKIEFDX0NIRUNLX1NJWkVPRihzaXplX3QsIDQpCiBBQ19DSEVDS19TSVpFT0YocGlkX3QsIDQpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgbG9uZyBsb25nIHN1cHBvcnQpCi1oYXZlX2xvbmdfbG9uZz1ubwotQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLCBbW2xvbmcgbG9uZyB4OyB4ID0gKGxvbmcgbG9uZykwO11dKV0sWwotICBBQ19ERUZJTkUoSEFWRV9MT05HX0xPTkcsIDEsIFtEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSB0aGUgdHlwZSBsb25nIGxvbmcuXSkKLSAgaGF2ZV9sb25nX2xvbmc9eWVzCi1dLFtdKQotQUNfTVNHX1JFU1VMVCgkaGF2ZV9sb25nX2xvbmcpCi1pZiB0ZXN0ICIkaGF2ZV9sb25nX2xvbmciID0geWVzIDsgdGhlbgotQUNfQ0hFQ0tfU0laRU9GKGxvbmcgbG9uZywgOCkKLWZpCitBQ19DSEVDS19TSVpFT0YodWludHB0cl90KQogCiBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQpCiBoYXZlX2xvbmdfZG91YmxlPW5vCkBAIC0yMTQwLDI2ICsyMTU5LDcgQEAKIEFDX0NIRUNLX1NJWkVPRihsb25nIGRvdWJsZSwgMTYpCiBmaQogCi0KLUFDX01TR19DSEVDS0lORyhmb3IgX0Jvb2wgc3VwcG9ydCkKLWhhdmVfYzk5X2Jvb2w9bm8KLUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSwgW1tfQm9vbCB4OyB4ID0gKF9Cb29sKTA7XV0pXSxbCi0gIEFDX0RFRklORShIQVZFX0M5OV9CT09MLCAxLCBbRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgdGhlIHR5cGUgX0Jvb2wuXSkKLSAgaGF2ZV9jOTlfYm9vbD15ZXMKLV0sW10pCi1BQ19NU0dfUkVTVUxUKCRoYXZlX2M5OV9ib29sKQotaWYgdGVzdCAiJGhhdmVfYzk5X2Jvb2wiID0geWVzIDsgdGhlbgogQUNfQ0hFQ0tfU0laRU9GKF9Cb29sLCAxKQotZmkKLQotQUNfQ0hFQ0tfVFlQRVModWludHB0cl90LAotICAgW0FDX0NIRUNLX1NJWkVPRih1aW50cHRyX3QsIDQpXSwKLSAgIFtdLCBbI2lmZGVmIEhBVkVfU1RESU5UX0gKLSAgICAgICAgI2luY2x1ZGUgPHN0ZGludC5oPgotICAgICAgICAjZW5kaWYKLSAgICAgICAgI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAotICAgICAgICAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLSAgICAgICAgI2VuZGlmXSkKIAogQUNfQ0hFQ0tfU0laRU9GKG9mZl90LCBbXSwgWwogI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKQEAgLTIxNjgsOCArMjE2OCw2IEBACiBdKQogCiBBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBlbmFibGUgbGFyZ2UgZmlsZSBzdXBwb3J0KQotaWYgdGVzdCAiJGhhdmVfbG9uZ19sb25nIiA9IHllcwotdGhlbgogaWYgdGVzdCAiJGFjX2N2X3NpemVvZl9vZmZfdCIgLWd0ICIkYWNfY3Zfc2l6ZW9mX2xvbmciIC1hIFwKIAkiJGFjX2N2X3NpemVvZl9sb25nX2xvbmciIC1nZSAiJGFjX2N2X3NpemVvZl9vZmZfdCI7IHRoZW4KICAgQUNfREVGSU5FKEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQsIDEsCkBAIC0yMTgxLDkgKzIxNzksNiBAQAogZWxzZQogICBBQ19NU0dfUkVTVUxUKG5vKQogZmkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCiAKIEFDX0NIRUNLX1NJWkVPRih0aW1lX3QsIFtdLCBbCiAjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSApAQCAtMjgxOSwyNiArMjgxNCw2IEBACiBmaV0pCiBBQ19NU0dfUkVTVUxUKCR3aXRoX2RibWxpYm9yZGVyKQogCi0jIERldGVybWluZSBpZiBzaWduYWxtb2R1bGUgc2hvdWxkIGJlIHVzZWQuCi1BQ19TVUJTVChVU0VfU0lHTkFMX01PRFVMRSkKLUFDX1NVQlNUKFNJR05BTF9PQkpTKQotQUNfTVNHX0NIRUNLSU5HKGZvciAtLXdpdGgtc2lnbmFsLW1vZHVsZSkKLUFDX0FSR19XSVRIKHNpZ25hbC1tb2R1bGUsCi0gICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLXNpZ25hbC1tb2R1bGVdLCBbZGlzYWJsZS9lbmFibGUgc2lnbmFsIG1vZHVsZV0pKQotCi1pZiB0ZXN0IC16ICIkd2l0aF9zaWduYWxfbW9kdWxlIgotdGhlbiB3aXRoX3NpZ25hbF9tb2R1bGU9InllcyIKLWZpCi1BQ19NU0dfUkVTVUxUKCR3aXRoX3NpZ25hbF9tb2R1bGUpCi0KLWlmIHRlc3QgIiR7d2l0aF9zaWduYWxfbW9kdWxlfSIgPSAieWVzIjsgdGhlbgotCVVTRV9TSUdOQUxfTU9EVUxFPSIiCi0JU0lHTkFMX09CSlM9IiIKLWVsc2UKLQlVU0VfU0lHTkFMX01PRFVMRT0iIyIKLQlTSUdOQUxfT0JKUz0iUGFyc2VyL2ludHJjaGVjay5vIFB5dGhvbi9zaWdjaGVjay5vIgotZmkKLQogIyBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgU2V0dXAuY29uZmlnCiBBQ19TVUJTVChVU0VfVEhSRUFEX01PRFVMRSkKIFVTRV9USFJFQURfTU9EVUxFPSIiCkBAIC0zMjA4LDE2ICszMTgzLDYgQEAKICAgQUNfTVNHX1JFU1VMVChubykKIF0pCiAKLUFDX01TR19DSEVDS0lORyhmb3IgT1NYIDEwLjUgU0RLIG9yIGxhdGVyKQotQUNfQ09NUElMRV9JRkVMU0UoWwotICBBQ19MQU5HX1BST0dSQU0oW1sjaW5jbHVkZSA8Q2FyYm9uL0NhcmJvbi5oPl1dLCBbW0ZTSU9SZWZOdW0gZlJlZiA9IDBdXSkKLV0sWwotICBBQ19ERUZJTkUoSEFWRV9PU1gxMDVfU0RLLCAxLCBbRGVmaW5lIGlmIGNvbXBpbGluZyB1c2luZyBNYWNPUyBYIDEwLjUgU0RLIG9yIGxhdGVyLl0pCi0gIEFDX01TR19SRVNVTFQoeWVzKQotXSxbCi0gIEFDX01TR19SRVNVTFQobm8pCi1dKQotCiAjIENoZWNrIGZvciAtLXdpdGgtZG9jLXN0cmluZ3MKIEFDX01TR19DSEVDS0lORyhmb3IgLS13aXRoLWRvYy1zdHJpbmdzKQogQUNfQVJHX1dJVEgoZG9jLXN0cmluZ3MsCkBAIC0zODMwLDYgKzM3OTUsMTAgQEAKIEFDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzdGF0LnN0X2dlbl0pCiBBQ19DSEVDS19NRU1CRVJTKFtzdHJ1Y3Qgc3RhdC5zdF9iaXJ0aHRpbWVdKQogQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IHN0YXQuc3RfYmxvY2tzXSkKK0FDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBwYXNzd2QucHdfZ2Vjb3MsIHN0cnVjdCBwYXNzd2QucHdfcGFzc3dkXSwgW10sIFtdLCBbWworICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICNpbmNsdWRlIDxwd2QuaD4KK11dKQogCiBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHRpbWUuaCB0aGF0IGRlZmluZXMgYWx0em9uZSkKIEFDX0NBQ0hFX1ZBTChhY19jdl9oZWFkZXJfdGltZV9hbHR6b25lLFsKQEAgLTM4NzgsNiArMzg0NywxOSBAQAogCUFDX0RFRklORShIQVZFX1NPQ0tBRERSX1NUT1JBR0UsIDEsIFtzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAoc3lzL3NvY2tldC5oKV0pCiBmaQogCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHNvY2thZGRyX2FsZykKK0FDX0NBQ0hFX1ZBTChhY19jdl9zdHJ1Y3Rfc29ja2FkZHJfYWxnLAorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjCQlpbmNsdWRlIDxsaW51eC9pZl9hbGcuaD5dXSwgW1tzdHJ1Y3Qgc29ja2FkZHJfYWxnIHNdXSldLAorICBbYWNfY3Zfc3RydWN0X3NvY2thZGRyX2FsZz15ZXNdLAorICBbYWNfY3Zfc3RydWN0X3NvY2thZGRyX2FsZz1ub10pKQorQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc3RydWN0X3NvY2thZGRyX2FsZykKK2lmIHRlc3QgJGFjX2N2X3N0cnVjdF9zb2NrYWRkcl9hbGcgPSB5ZXM7IHRoZW4KKwlBQ19ERUZJTkUoSEFWRV9TT0NLQUREUl9BTEcsIDEsIFtzdHJ1Y3Qgc29ja2FkZHJfYWxnIChsaW51eC9pZl9hbGcuaCldKQorZmkKKwogIyBjaGVja3MgZm9yIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcwogCiBBQ19DX0NIQVJfVU5TSUdORUQKQEAgLTQ0MDYsNiArNDM4OCw4IEBACiAgIFtkZWZpbmUgdG8gMSBpZiB5b3VyIHNlbV9nZXR2YWx1ZSBpcyBicm9rZW4uXSkKIGZpCiAKK0FDX0NIRUNLX0RFQ0xTKFtSVExEX0xBWlksIFJUTERfTk9XLCBSVExEX0dMT0JBTCwgUlRMRF9MT0NBTCwgUlRMRF9OT0RFTEVURSwgUlRMRF9OT0xPQUQsIFJUTERfREVFUEJJTkRdLCBbXSwgW10sIFtbI2luY2x1ZGUgPGRsZmNuLmg+XV0pCisKICMgZGV0ZXJtaW5lIHdoYXQgc2l6ZSBkaWdpdCB0byB1c2UgZm9yIFB5dGhvbidzIGxvbmdzCiBBQ19NU0dfQ0hFQ0tJTkcoW2RpZ2l0IHNpemUgZm9yIFB5dGhvbidzIGxvbmdzXSkKIEFDX0FSR19FTkFCTEUoYmlnLWRpZ2l0cywKQEAgLTQ1MjQsNyArNDUwOCwxMSBAQAogCiBkbmwgZGVmaW5lIExJQlBMIGFmdGVyIEFCSUZMQUdTIGFuZCBMRFZFUlNJT04gaXMgZGVmaW5lZC4KIEFDX1NVQlNUKFBZX0VOQUJMRV9TSEFSRUQpCi1MSUJQTD0nJChwcmVmaXgpJyIvbGliL3B5dGhvbiR7VkVSU0lPTn0vY29uZmlnLSR7TERWRVJTSU9OfSIKK2lmIHRlc3QgeCRQTEFURk9STV9UUklQTEVUID0geDsgdGhlbgorICBMSUJQTD0nJChwcmVmaXgpJyIvbGliL3B5dGhvbiR7VkVSU0lPTn0vY29uZmlnLSR7TERWRVJTSU9OfSIKK2Vsc2UKKyAgTElCUEw9JyQocHJlZml4KSciL2xpYi9weXRob24ke1ZFUlNJT059L2NvbmZpZy0ke0xEVkVSU0lPTn0tJHtQTEFURk9STV9UUklQTEVUfSIKK2ZpCiBBQ19TVUJTVChMSUJQTCkKIAogIyBDaGVjayB3aGV0aGVyIHJpZ2h0IHNoaWZ0aW5nIGEgbmVnYXRpdmUgaW50ZWdlciBleHRlbmRzIHRoZSBzaWduIGJpdApAQCAtNDkyMiw3MCArNDkxMCw2IEBACiAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgL2Rldi9wdGMgZGV2aWNlIGZpbGUuXSkKIGZpCiAKLWlmIHRlc3QgIiRoYXZlX2xvbmdfbG9uZyIgPSB5ZXMKLXRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKGZvciAlbGxkIGFuZCAlbGx1IHByaW50ZigpIGZvcm1hdCBzdXBwb3J0KQotICBBQ19DQUNIRV9WQUwoYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0LAotICBBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbW1sKLSAgI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gICNpbmNsdWRlIDxzdGRkZWYuaD4KLSAgI2luY2x1ZGUgPHN0cmluZy5oPgotCi0gICNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0gICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAgI2VuZGlmCi0KLSAgaW50IG1haW4oKQotICB7Ci0gICAgICBjaGFyIGJ1ZmZlclsyNTZdOwotCi0gICAgICBpZiAoc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZykxMjMpIDwgMCkKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgIGlmIChzdHJjbXAoYnVmZmVyLCAiMTIzIikpCi0gICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgIGlmIChzcHJpbnRmKGJ1ZmZlciwgIiVsbGQiLCAobG9uZyBsb25nKS0xMjMpIDwgMCkKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgIGlmIChzdHJjbXAoYnVmZmVyLCAiLTEyMyIpKQotICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICBpZiAoc3ByaW50ZihidWZmZXIsICIlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykxMjMpIDwgMCkKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgIGlmIChzdHJjbXAoYnVmZmVyLCAiMTIzIikpCi0gICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgIHJldHVybiAwOwotICB9Ci0gIF1dXSldLAotICBbYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0PXllc10sCi0gIFthY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQ9bm9dLAotICBbYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0PSJjcm9zcyAtLSBhc3N1bWluZyBubyIKLSAgIGlmIHRlc3QgeCRHQ0MgPSB4eWVzOyB0aGVuCi0gICAgc2F2ZV9DRkxBR1M9JENGTEFHUwotICAgIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIC1XZm9ybWF0IgotICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKLSAgICAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gICAgICAgICNpbmNsdWRlIDxzdGRkZWYuaD4KLSAgICAgIF1dLCBbWwotICAgICAgY2hhciAqYnVmZmVyOwotICAgICAgc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZykxMjMpOwotICAgICAgc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZyktMTIzKTsKLSAgICAgIHNwcmludGYoYnVmZmVyLCAiJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpMTIzKTsKLSAgICAgIF1dKV0sCi0gICAgICBhY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQ9eWVzCi0gICAgKQotICAgIENGTEFHUz0kc2F2ZV9DRkxBR1MKLSAgIGZpXSkKLSAgKQotICBBQ19NU0dfUkVTVUxUKCRhY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQpCi1maQotCi1pZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0IiA9IHllcwotdGhlbgotICBBQ19ERUZJTkUoUFlfRk9STUFUX0xPTkdfTE9ORywgImxsIiwKLSAgW0RlZmluZSB0byBwcmludGYgZm9ybWF0IG1vZGlmaWVyIGZvciBsb25nIGxvbmcgdHlwZV0pCi1maQotCiBpZiB0ZXN0ICRhY19zeXNfc3lzdGVtID0gRGFyd2luCiB0aGVuCiAJTElCUz0iJExJQlMgLWZyYW1ld29yayBDb3JlRm91bmRhdGlvbiIKZGlmZiAtLWdpdCBhL3B5Y29uZmlnLmguaW4gYi9weWNvbmZpZy5oLmluCmluZGV4IGJmNGJhNWIuLmYxODFkN2YgMTAwNjQ0Ci0tLSBhL3B5Y29uZmlnLmguaW4KKysrIGIvcHljb25maWcuaC5pbgpAQCAtMTIsNiArMTIsOSBAQAogICAgc3VwcG9ydCBmb3IgQUlYIEMrKyBzaGFyZWQgZXh0ZW5zaW9uIG1vZHVsZXMuICovCiAjdW5kZWYgQUlYX0dFTlVJTkVfQ1BMVVNQTFVTCiAKKy8qIFRoZSBBbmRyb2lkIEFQSSBsZXZlbC4gKi8KKyN1bmRlZiBBTkRST0lEX0FQSV9MRVZFTAorCiAvKiBEZWZpbmUgaWYgQyBkb3VibGVzIGFyZSA2NC1iaXQgSUVFRSA3NTQgYmluYXJ5IGZvcm1hdCwgc3RvcmVkIGluIEFSTQogICAgbWl4ZWQtZW5kaWFuIG9yZGVyIChieXRlIG9yZGVyIDQ1NjcwMTIzKSAqLwogI3VuZGVmIERPVUJMRV9JU19BUk1fTUlYRURfRU5ESUFOX0lFRUU3NTQKQEAgLTEwNCw5ICsxMDcsNiBAQAogLyogSGFzIGJ1aWx0aW4gYXRvbWljcyAqLwogI3VuZGVmIEhBVkVfQlVJTFRJTl9BVE9NSUMKIAotLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgdGhlIHR5cGUgX0Jvb2wuICovCi0jdW5kZWYgSEFWRV9DOTlfQk9PTAotCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgJ2NoZmxhZ3MnIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfQ0hGTEFHUwogCkBAIC0xNjcsNiArMTY3LDM0IEBACiAgICAqLwogI3VuZGVmIEhBVkVfREVDTF9JU05BTgogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYFJUTERfREVFUEJJTkQnLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9SVExEX0RFRVBCSU5ECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9HTE9CQUwnLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9SVExEX0dMT0JBTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYFJUTERfTEFaWScsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfTEFaWQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYFJUTERfTE9DQUwnLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9SVExEX0xPQ0FMCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9OT0RFTEVURScsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfTk9ERUxFVEUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBSVExEX05PTE9BRCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfTk9MT0FECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9OT1cnLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9SVExEX05PVworCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYHR6bmFtZScsIGFuZCB0byAwIGlmIHlvdSBkb24ndC4KICAgICovCiAjdW5kZWYgSEFWRV9ERUNMX1RaTkFNRQpAQCAtNDUzLDEyICs0ODEsNiBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbml0Z3JvdXBzJyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX0lOSVRHUk9VUFMKIAotLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgaW50MzJfdC4gKi8KLSN1bmRlZiBIQVZFX0lOVDMyX1QKLQotLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgaW50NjRfdC4gKi8KLSN1bmRlZiBIQVZFX0lOVDY0X1QKLQogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKIApAQCAtNTYxLDkgKzU4Myw2IEBACiAvKiBEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSB0aGUgdHlwZSBsb25nIGRvdWJsZS4gKi8KICN1bmRlZiBIQVZFX0xPTkdfRE9VQkxFCiAKLS8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIHRoZSB0eXBlIGxvbmcgbG9uZy4gKi8KLSN1bmRlZiBIQVZFX0xPTkdfTE9ORwotCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxzdGF0JyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX0xTVEFUCiAKQEAgLTYzMCw5ICs2NDksNiBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBvcGVucHR5JyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX09QRU5QVFkKIAotLyogRGVmaW5lIGlmIGNvbXBpbGluZyB1c2luZyBNYWNPUyBYIDEwLjUgU0RLIG9yIGxhdGVyLiAqLwotI3VuZGVmIEhBVkVfT1NYMTA1X1NESwotCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBhdGhjb25mJyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX1BBVEhDT05GCiAKQEAgLTg2MSw2ICs4NzcsOSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzbnByaW50ZicgZnVuY3Rpb24uICovCiAjdW5kZWYgSEFWRV9TTlBSSU5URgogCisvKiBzdHJ1Y3Qgc29ja2FkZHJfYWxnIChsaW51eC9pZl9hbGcuaCkgKi8KKyN1bmRlZiBIQVZFX1NPQ0tBRERSX0FMRworCiAvKiBEZWZpbmUgaWYgc29ja2FkZHIgaGFzIHNhX2xlbiBtZW1iZXIgKi8KICN1bmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgogCkBAIC05MTYsNiArOTM1LDEyIEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cm9wdHMuaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9TVFJPUFRTX0gKIAorLyogRGVmaW5lIHRvIDEgaWYgYHB3X2dlY29zJyBpcyBhIG1lbWJlciBvZiBgc3RydWN0IHBhc3N3ZCcuICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfUEFTU1dEX1BXX0dFQ09TCisKKy8qIERlZmluZSB0byAxIGlmIGBwd19wYXNzd2QnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3QgcGFzc3dkJy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9QQVNTV0RfUFdfUEFTU1dECisKIC8qIERlZmluZSB0byAxIGlmIGBzdF9iaXJ0aHRpbWUnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3Qgc3RhdCcuICovCiAjdW5kZWYgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CSVJUSFRJTUUKIApAQCAtMTEwMywxNSArMTEyOCw2IEBACiAvKiBEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSB0Y2wgYW5kIFRDTF9VVEZfTUFYPT02ICovCiAjdW5kZWYgSEFWRV9VQ1M0X1RDTAogCi0vKiBEZWZpbmUgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyB1aW50MzJfdC4gKi8KLSN1bmRlZiBIQVZFX1VJTlQzMl9UCi0KLS8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIHVpbnQ2NF90LiAqLwotI3VuZGVmIEhBVkVfVUlOVDY0X1QKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHVpbnRwdHJfdCcuICovCi0jdW5kZWYgSEFWRV9VSU5UUFRSX1QKLQogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1bmFtZScgZnVuY3Rpb24uICovCiAjdW5kZWYgSEFWRV9VTkFNRQogCkBAIC0xMjIyLDkgKzEyMzgsNiBAQAogLyogRGVmaW5lIGFzIHRoZSBwcmVmZXJyZWQgc2l6ZSBpbiBiaXRzIG9mIGxvbmcgZGlnaXRzICovCiAjdW5kZWYgUFlMT05HX0JJVFNfSU5fRElHSVQKIAotLyogRGVmaW5lIHRvIHByaW50ZiBmb3JtYXQgbW9kaWZpZXIgZm9yIGxvbmcgbG9uZyB0eXBlICovCi0jdW5kZWYgUFlfRk9STUFUX0xPTkdfTE9ORwotCiAvKiBEZWZpbmUgdG8gcHJpbnRmIGZvcm1hdCBtb2RpZmllciBmb3IgUHlfc3NpemVfdCAqLwogI3VuZGVmIFBZX0ZPUk1BVF9TSVpFX1QKIApAQCAtMTQ0MiwxNiArMTQ1NSw2IEBACiAvKiBEZWZpbmUgdG8gZm9yY2UgdXNlIG9mIHRocmVhZC1zYWZlIGVycm5vLCBoX2Vycm5vLCBhbmQgb3RoZXIgZnVuY3Rpb25zICovCiAjdW5kZWYgX1JFRU5UUkFOVAogCi0vKiBEZWZpbmUgZm9yIFNvbGFyaXMgMi41LjEgc28gdGhlIHVpbnQzMl90IHR5cGVkZWYgZnJvbSA8c3lzL3N5bmNoLmg+LAotICAgPHB0aHJlYWQuaD4sIG9yIDxzZW1hcGhvcmUuaD4gaXMgbm90IHVzZWQuIElmIHRoZSB0eXBlZGVmIHdlcmUgYWxsb3dlZCwgdGhlCi0gICAjZGVmaW5lIGJlbG93IHdvdWxkIGNhdXNlIGEgc3ludGF4IGVycm9yLiAqLwotI3VuZGVmIF9VSU5UMzJfVAotCi0vKiBEZWZpbmUgZm9yIFNvbGFyaXMgMi41LjEgc28gdGhlIHVpbnQ2NF90IHR5cGVkZWYgZnJvbSA8c3lzL3N5bmNoLmg+LAotICAgPHB0aHJlYWQuaD4sIG9yIDxzZW1hcGhvcmUuaD4gaXMgbm90IHVzZWQuIElmIHRoZSB0eXBlZGVmIHdlcmUgYWxsb3dlZCwgdGhlCi0gICAjZGVmaW5lIGJlbG93IHdvdWxkIGNhdXNlIGEgc3ludGF4IGVycm9yLiAqLwotI3VuZGVmIF9VSU5UNjRfVAotCiAvKiBEZWZpbmUgdG8gdGhlIGxldmVsIG9mIFgvT3BlbiB0aGF0IHlvdXIgc3lzdGVtIHN1cHBvcnRzICovCiAjdW5kZWYgX1hPUEVOX1NPVVJDRQogCkBAIC0xNDgxLDE0ICsxNDg0LDYgQEAKICN1bmRlZiBpbmxpbmUKICNlbmRpZgogCi0vKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYSBzaWduZWQgaW50ZWdlciB0eXBlIG9mIHdpZHRoIGV4YWN0bHkgMzIgYml0cyBpZgotICAgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC4gKi8KLSN1bmRlZiBpbnQzMl90Ci0KLS8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSA2NCBiaXRzIGlmCi0gICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLwotI3VuZGVmIGludDY0X3QKLQogLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLwogI3VuZGVmIG1vZGVfdAogCkBAIC0xNTEwLDE0ICsxNTA1LDYgQEAKIC8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAqLwogI3VuZGVmIHVpZF90CiAKLS8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSAzMiBiaXRzIGlmCi0gICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLwotI3VuZGVmIHVpbnQzMl90Ci0KLS8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSA2NCBiaXRzIGlmCi0gICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLwotI3VuZGVmIHVpbnQ2NF90Ci0KIC8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAqLwogI3VuZGVmIHZvbGF0aWxlCiAKZGlmZiAtLWdpdCBhL3NldHVwLnB5IGIvc2V0dXAucHkKaW5kZXggMTc0Y2U3Mi4uNTgxMTU3NiAxMDA2NDQKLS0tIGEvc2V0dXAucHkKKysrIGIvc2V0dXAucHkKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgIGlmIG5vdCBsaXN0OgogICAgICAgICByZXR1cm4gbW9kdWxlCiAgICAgaWYgbGVuKGxpc3QpID4gMToKLSAgICAgICAgbG9nLmluZm8oIldBUk5JTkc6IG11bHRpcGxlIGNvcGllcyBvZiAlcyBmb3VuZCIlbW9kdWxlKQorICAgICAgICBsb2cuaW5mbygiV0FSTklORzogbXVsdGlwbGUgY29waWVzIG9mICVzIGZvdW5kIiwgbW9kdWxlKQogICAgIHJldHVybiBvcy5wYXRoLmpvaW4obGlzdFswXSwgbW9kdWxlKQogCiBjbGFzcyBQeUJ1aWxkRXh0KGJ1aWxkX2V4dCk6CkBAIC04MzgsNyArODM4LDcgQEAKICAgICAgICAgIyBmaW5kIG91dCB3aGljaCB2ZXJzaW9uIG9mIE9wZW5TU0wgd2UgaGF2ZQogICAgICAgICBvcGVuc3NsX3ZlciA9IDAKICAgICAgICAgb3BlbnNzbF92ZXJfcmUgPSByZS5jb21waWxlKAotICAgICAgICAgICAgJ15ccyojXHMqZGVmaW5lXHMrT1BFTlNTTF9WRVJTSU9OX05VTUJFUlxzKygweFswLTlhLWZBLUZdKyknICkKKyAgICAgICAgICAgIHInXlxzKiNccypkZWZpbmVccytPUEVOU1NMX1ZFUlNJT05fTlVNQkVSXHMrKDB4WzAtOWEtZkEtRl0rKScgKQogCiAgICAgICAgICMgbG9vayBmb3IgdGhlIG9wZW5zc2wgdmVyc2lvbiBoZWFkZXIgb24gdGhlIGNvbXBpbGVyIHNlYXJjaCBwYXRoLgogICAgICAgICBvcGVuc3Nsdl9oID0gZmluZF9maWxlKCdvcGVuc3NsL29wZW5zc2x2LmgnLCBbXSwKQEAgLTg4OSw2ICs4ODksMjkgQEAKICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX3NoYTEnLCBbJ3NoYTFtb2R1bGUuYyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHM9WydoYXNobGliLmgnXSkgKQogCisgICAgICAgIGJsYWtlMl9kZXBzID0gZ2xvYihvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIHNyY2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTW9kdWxlcy9fYmxha2UyL2ltcGwvKicpKQorICAgICAgICBibGFrZTJfZGVwcy5hcHBlbmQoJ2hhc2hsaWIuaCcpCisKKyAgICAgICAgYmxha2UyX21hY3JvcyA9IFtdCisgICAgICAgIGlmIG5vdCBjcm9zc19jb21waWxpbmcgYW5kIG9zLnVuYW1lKCkubWFjaGluZSA9PSAieDg2XzY0IjoKKyAgICAgICAgICAgICMgRXZlcnkgeDg2XzY0IG1hY2hpbmUgaGFzIGF0IGxlYXN0IFNTRTIuCisgICAgICAgICAgICBibGFrZTJfbWFjcm9zLmFwcGVuZCgoJ0JMQUtFMl9VU0VfU1NFJywgJzEnKSkKKworICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfYmxha2UyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ19ibGFrZTIvYmxha2UybW9kdWxlLmMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2JsYWtlMi9ibGFrZTJiX2ltcGwuYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfYmxha2UyL2JsYWtlMnNfaW1wbC5jJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lX21hY3Jvcz1ibGFrZTJfbWFjcm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHM9Ymxha2UyX2RlcHMpICkKKworICAgICAgICBzaGEzX2RlcHMgPSBnbG9iKG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgc3JjZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTW9kdWxlcy9fc2hhMy9rY3AvKicpKQorICAgICAgICBzaGEzX2RlcHMuYXBwZW5kKCdoYXNobGliLmgnKQorICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfc2hhMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydfc2hhMy9zaGEzbW9kdWxlLmMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzPXNoYTNfZGVwcykpCisKICAgICAgICAgIyBNb2R1bGVzIHRoYXQgcHJvdmlkZSBwZXJzaXN0ZW50IGRpY3Rpb25hcnktbGlrZSBzZW1hbnRpY3MuICBZb3Ugd2lsbAogICAgICAgICAjIHByb2JhYmx5IHdhbnQgdG8gYXJyYW5nZSBmb3IgYXQgbGVhc3Qgb25lIG9mIHRoZW0gdG8gYmUgYXZhaWxhYmxlIG9uCiAgICAgICAgICMgeW91ciBtYWNoaW5lLCB0aG91Z2ggbm9uZSBhcmUgZGVmaW5lZCBieSBkZWZhdWx0IGJlY2F1c2Ugb2YgbGlicmFyeQpAQCAtMTcwMSw3ICsxNzI0LDcgQEAKICAgICAgICAgIyBBbGwgZXhpc3RpbmcgZnJhbWV3b3JrIGJ1aWxkcyBvZiBUY2wvVGsgZG9uJ3Qgc3VwcG9ydCA2NC1iaXQKICAgICAgICAgIyBhcmNoaXRlY3R1cmVzLgogICAgICAgICBjZmxhZ3MgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXJzKCdDRkxBR1MnKVswXQotICAgICAgICBhcmNocyA9IHJlLmZpbmRhbGwoJy1hcmNoXHMrKFx3KyknLCBjZmxhZ3MpCisgICAgICAgIGFyY2hzID0gcmUuZmluZGFsbChyJy1hcmNoXHMrKFx3KyknLCBjZmxhZ3MpCiAKICAgICAgICAgdG1wZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX3RlbXAsICd0ay5hcmNoJykKICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuYnVpbGRfdGVtcCk6CkBAIC0yMDA3LDcgKzIwMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgZmZpX2xpYiA9IE5vbmUKICAgICAgICAgaWYgZmZpX2luYyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGZvciBsaWJfbmFtZSBpbiAoJ2ZmaV9jb252ZW5pZW5jZScsICdmZmlfcGljJywgJ2ZmaScpOgorICAgICAgICAgICAgZm9yIGxpYl9uYW1lIGluICgnZmZpJywgJ2ZmaV9waWMnKToKICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZShsaWJfZGlycywgbGliX25hbWUpKToKICAgICAgICAgICAgICAgICAgICAgZmZpX2xpYiA9IGxpYl9uYW1lCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCkBAIC0yMDYwLDcgKzIwODMsNyBAQAogICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvZm50LmgnLAogICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvZm91cnN0ZXAuaCcsCiAgICAgICAgICAgICAgICdfZGVjaW1hbC9saWJtcGRlYy9pby5oJywKLSAgICAgICAgICAgICAgJ19kZWNpbWFsL2xpYm1wZGVjL21lbW9yeS5oJywKKyAgICAgICAgICAgICAgJ19kZWNpbWFsL2xpYm1wZGVjL21wYWxsb2MuaCcsCiAgICAgICAgICAgICAgICdfZGVjaW1hbC9saWJtcGRlYy9tcGRlY2ltYWwuaCcsCiAgICAgICAgICAgICAgICdfZGVjaW1hbC9saWJtcGRlYy9udW1iZXJ0aGVvcnkuaCcsCiAgICAgICAgICAgICAgICdfZGVjaW1hbC9saWJtcGRlYy9zaXhzdGVwLmgnLApAQCAtMjIxMyw3ICsyMjM2LDcgQEAKICAgICAgICAgICAgICAgICBuZXdmaWxlbmFtZSA9IGZpbGVuYW1lICsgZnVsbHZlcnNpb24KICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgbmV3ZmlsZW5hbWUgPSBmaWxlbmFtZSArIG1pbm9yb25seQotICAgICAgICAgICAgbG9nLmluZm8oJ3JlbmFtaW5nIHt9IHRvIHt9Jy5mb3JtYXQoZmlsZW5hbWUsIG5ld2ZpbGVuYW1lKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKCdyZW5hbWluZyAlcyB0byAlcycsIGZpbGVuYW1lLCBuZXdmaWxlbmFtZSkKICAgICAgICAgICAgIG9zLnJlbmFtZShmaWxlbmFtZSwgbmV3ZmlsZW5hbWUpCiAgICAgICAgICAgICBuZXdvdXRmaWxlcy5hcHBlbmQobmV3ZmlsZW5hbWUpCiAgICAgICAgICAgICBpZiBmaWxlbmFtZSBpbiB1cGRhdGVkX2ZpbGVzOgpAQCAtMjI1NSw3ICsyMjc4LDcgQEAKICAgICBzZXR1cCgjIFB5UEkgTWV0YWRhdGEgKFBFUCAzMDEpCiAgICAgICAgICAgbmFtZSA9ICJQeXRob24iLAogICAgICAgICAgIHZlcnNpb24gPSBzeXMudmVyc2lvbi5zcGxpdCgpWzBdLAotICAgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvJXMiICUgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvJWQuJWQiICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCiAgICAgICAgICAgbWFpbnRhaW5lciA9ICJHdWlkbyB2YW4gUm9zc3VtIGFuZCB0aGUgUHl0aG9uIGNvbW11bml0eSIsCiAgICAgICAgICAgbWFpbnRhaW5lcl9lbWFpbCA9ICJweXRob24tZGV2QHB5dGhvbi5vcmciLAogICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkEgaGlnaC1sZXZlbCBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UiLAo=